ZGlmZiAtLWdpdCBhL3psaWIvQW5kcm9pZC5icCBiL3psaWIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmQ2N2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsODEgQEAKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiemxpYl9kZWZhdWx0cyIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1PMyIsCisgICAgICAgICItRFVTRV9NTUFQIiwKKyAgICBdLAorICAgIHN0bDogIm5vbmUiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgInNyYy9hZGxlcjMyLmMiLAorICAgICAgICAic3JjL2NvbXByZXNzLmMiLAorICAgICAgICAic3JjL2NyYzMyLmMiLAorICAgICAgICAic3JjL2RlZmxhdGUuYyIsCisgICAgICAgICJzcmMvZ3pjbG9zZS5jIiwKKyAgICAgICAgInNyYy9nemxpYi5jIiwKKyAgICAgICAgInNyYy9nenJlYWQuYyIsCisgICAgICAgICJzcmMvZ3p3cml0ZS5jIiwKKyAgICAgICAgInNyYy9pbmZiYWNrLmMiLAorICAgICAgICAic3JjL2luZmxhdGUuYyIsCisgICAgICAgICJzcmMvaW5mdHJlZXMuYyIsCisgICAgICAgICJzcmMvaW5mZmFzdC5jIiwKKyAgICAgICAgInNyYy90cmVlcy5jIiwKKyAgICAgICAgInNyYy91bmNvbXByLmMiLAorICAgICAgICAic3JjL3p1dGlsLmMiLAorICAgIF0sCisKKyAgICBhcmNoOiB7CisgICAgICAgIGFybTogeworICAgICAgICAgICAgLy8gbWVhc3VyZW1lbnRzIHNob3cgdGhhdCB0aGUgQVJNIHZlcnNpb24gb2YgWkxpYiBpcyBhYm91dCB4MS4xNyBmYXN0ZXIKKyAgICAgICAgICAgIC8vIHRoYW4gdGhlIHRodW1iIG9uZS4uLgorICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fc2V0OiAiYXJtIiwKKworICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBiLzI0NDY1MjA5LiBSZW1vdmUgYWZ0ZXIgcm9vdCBjYXVzZSBpcyBmaXhlZAorICAgICAgICAgICAgbGRmbGFnczogWyItV2wsLS1oYXNoLXN0eWxlPWJvdGgiXSwKKyAgICAgICAgfSwKKyAgICB9LAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIHdpbmRvd3M6IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKK30KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYnoiLAorICAgIGRlZmF1bHRzOiBbInpsaWJfZGVmYXVsdHMiXSwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGhvc3Q6IHsKKyAgICAgICAgICAgIHNoYXJlZDogeworICAgICAgICAgICAgICAgIC8vIFRoZSBob3N0IHNoYXJlZCBsaWJyYXJ5IGlzIGJ1aWx0IGFzIGxpYnotaG9zdAorICAgICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCisvLyBTZXBhcmF0ZSBob3N0IHNoYXJlZCBsaWJyYXJ5IGRlZmluaXRpb24sIHNpbmNlIHdlIGRvbid0IHdhbnQgdG8gY29uZmxpY3QKKy8vIHdpdGggdGhlIGhvc3Qtc3VwcGxpZWQgbGliegorY2NfbGlicmFyeV9ob3N0X3NoYXJlZCB7CisgICAgbmFtZTogImxpYnotaG9zdCIsCisgICAgZGVmYXVsdHM6IFsiemxpYl9kZWZhdWx0cyJdLAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJnemlwIiwKKyAgICBzcmNzOiBbInNyYy90ZXN0L21pbmlnemlwLmMiXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJ6Il0sCisgICAgc3RsOiAibm9uZSIsCit9CisKK2NjX2JpbmFyeV9ob3N0IHsKKyAgICBuYW1lOiAibWluaWd6aXAiLAorICAgIHNyY3M6IFsic3JjL3Rlc3QvbWluaWd6aXAuYyJdLAorICAgIHN0YXRpY19saWJzOiBbImxpYnoiXSwKKyAgICBzdGw6ICJub25lIiwKK30KZGlmZiAtLWdpdCBhL3psaWIvQW5kcm9pZC5tayBiL3psaWIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWM2ODVjCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNSBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCiskKFRBUkdFVF9PVVRfQ09NTU9OX0dFTikvemxpYl9maW5nZXJwcmludCA6ICQod2lsZGNhcmQgJChMT0NBTF9QQVRIKS9zcmMvKi5bY2hdKQorCXByaW50ZiAnJXNcbicgJF4gfCBMQ19BTEw9QyBzb3J0IHwgeGFyZ3MgY2F0IHwgc2hhc3VtIC1hIDI1NiB8IFwKKwkJYXdrICd7cHJpbnRmICQkMX0nID4gJEAKZGlmZiAtLWdpdCBhL3psaWIvQ2xlYW5TcGVjLm1rIGIvemxpYi9DbGVhblNwZWMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg0ZTFiNgotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvQ2xlYW5TcGVjLm1rCkBAIC0wLDAgKzEsNDkgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgSWYgeW91IGRvbid0IG5lZWQgdG8gZG8gYSBmdWxsIGNsZWFuIGJ1aWxkIGJ1dCB3b3VsZCBsaWtlIHRvIHRvdWNoCisjIGEgZmlsZSBvciBkZWxldGUgc29tZSBpbnRlcm1lZGlhdGUgZmlsZXMsIGFkZCBhIGNsZWFuIHN0ZXAgdG8gdGhlIGVuZAorIyBvZiB0aGUgbGlzdC4gIFRoZXNlIHN0ZXBzIHdpbGwgb25seSBiZSBydW4gb25jZSwgaWYgdGhleSBoYXZlbid0IGJlZW4KKyMgcnVuIGJlZm9yZS4KKyMKKyMgRS5nLjoKKyMgICAgICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgdG91Y2ggLWMgZXh0ZXJuYWwvc3FsaXRlL3NxbGl0ZTMuaCkKKyMgICAgICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9TVEFUSUNfTElCUkFSSUVTL2xpYnpfaW50ZXJtZWRpYXRlcykKKyMKKyMgQWx3YXlzIHVzZSAidG91Y2ggLWMiIGFuZCAicm0gLWYiIG9yICJybSAtcmYiIHRvIGdyYWNlZnVsbHkgZGVhbCB3aXRoCisjIGZpbGVzIHRoYXQgYXJlIG1pc3Npbmcgb3IgaGF2ZSBiZWVuIG1vdmVkLgorIworIyBVc2UgJChQUk9EVUNUX09VVCkgdG8gZ2V0IHRvIHRoZSAib3V0L3RhcmdldC9wcm9kdWN0L2JsYWgvIiBkaXJlY3RvcnkuCisjIFVzZSAkKE9VVF9ESVIpIHRvIHJlZmVyIHRvIHRoZSAib3V0IiBkaXJlY3RvcnkuCisjCisjIElmIHlvdSBuZWVkIHRvIHJlLWRvIHNvbWV0aGluZyB0aGF0J3MgYWxyZWFkeSBtZW50aW9uZWQsIGp1c3QgY29weQorIyB0aGUgY29tbWFuZCBhbmQgYWRkIGl0IHRvIHRoZSBib3R0b20gb2YgdGhlIGxpc3QuICBFLmcuLCBpZiBhIGNoYW5nZQorIyB0aGF0IHlvdSBtYWRlIGxhc3Qgd2VlayByZXF1aXJlZCB0b3VjaGluZyBhIGZpbGUgYW5kIGEgY2hhbmdlIHlvdQorIyBtYWRlIHRvZGF5IHJlcXVpcmVzIHRvdWNoaW5nIHRoZSBzYW1lIGZpbGUsIGp1c3QgY29weSB0aGUgb2xkCisjIHRvdWNoIHN0ZXAgYW5kIGFkZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgorIworIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisjIEZvciBleGFtcGxlOgorIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9BbmRyb2lkVGVzdHNfaW50ZXJtZWRpYXRlcykKKyMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2NvcmVfaW50ZXJtZWRpYXRlcykKKyMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIGZpbmQgJChPVVRfRElSKSAtdHlwZSBmIC1uYW1lICJJR1RhbGtTZXNzaW9uKiIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mKQorIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL2RhdGEvKikKKworIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvemxpYi9NT0RVTEVfTElDRU5TRV9CU0RfTElLRSBiL3psaWIvTU9EVUxFX0xJQ0VOU0VfQlNEX0xJS0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvTU9EVUxFX0xJQ0VOU0VfQlNEX0xJS0UKZGlmZiAtLWdpdCBhL3psaWIvTk9USUNFIGIvemxpYi9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg1ZTFlMQotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvTk9USUNFCkBAIC0wLDAgKzEsMjAgQEAKKyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKKworICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisKKyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisgIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKKyAgSmVhbi1sb3VwIEdhaWxseSAgICAgICAgTWFyayBBZGxlcgorICBqbG91cEBnemlwLm9yZyAgICAgICAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CmRpZmYgLS1naXQgYS96bGliL3NyYy9DTWFrZUxpc3RzLnR4dCBiL3psaWIvc3JjL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMDI0N2MKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDI0OSBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuNC40KQorc2V0KENNQUtFX0FMTE9XX0xPT1NFX0xPT1BfQ09OU1RSVUNUUyBPTikKKworcHJvamVjdCh6bGliIEMpCisKK3NldChWRVJTSU9OICIxLjIuOCIpCisKK29wdGlvbihBU002ODYgIkVuYWJsZSBidWlsZGluZyBpNjg2IGFzc2VtYmx5IGltcGxlbWVudGF0aW9uIikKK29wdGlvbihBTUQ2NCAiRW5hYmxlIGJ1aWxkaW5nIGFtZDY0IGFzc2VtYmx5IGltcGxlbWVudGF0aW9uIikKKworc2V0KElOU1RBTExfQklOX0RJUiAiJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vYmluIiBDQUNIRSBQQVRIICJJbnN0YWxsYXRpb24gZGlyZWN0b3J5IGZvciBleGVjdXRhYmxlcyIpCitzZXQoSU5TVEFMTF9MSUJfRElSICIke0NNQUtFX0lOU1RBTExfUFJFRklYfS9saWIiIENBQ0hFIFBBVEggIkluc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yIGxpYnJhcmllcyIpCitzZXQoSU5TVEFMTF9JTkNfRElSICIke0NNQUtFX0lOU1RBTExfUFJFRklYfS9pbmNsdWRlIiBDQUNIRSBQQVRIICJJbnN0YWxsYXRpb24gZGlyZWN0b3J5IGZvciBoZWFkZXJzIikKK3NldChJTlNUQUxMX01BTl9ESVIgIiR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9L3NoYXJlL21hbiIgQ0FDSEUgUEFUSCAiSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgbWFudWFsIHBhZ2VzIikKK3NldChJTlNUQUxMX1BLR0NPTkZJR19ESVIgIiR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9L3NoYXJlL3BrZ2NvbmZpZyIgQ0FDSEUgUEFUSCAiSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgcGtnY29uZmlnICgucGMpIGZpbGVzIikKKworaW5jbHVkZShDaGVja1R5cGVTaXplKQoraW5jbHVkZShDaGVja0Z1bmN0aW9uRXhpc3RzKQoraW5jbHVkZShDaGVja0luY2x1ZGVGaWxlKQoraW5jbHVkZShDaGVja0NTb3VyY2VDb21waWxlcykKK2VuYWJsZV90ZXN0aW5nKCkKKworY2hlY2tfaW5jbHVkZV9maWxlKHN5cy90eXBlcy5oIEhBVkVfU1lTX1RZUEVTX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3RkaW50LmggICAgSEFWRV9TVERJTlRfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzdGRkZWYuaCAgICBIQVZFX1NURERFRl9IKQorCisjCisjIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGxhcmdlIGZpbGUgc3VwcG9ydAorIworc2V0KENNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TIC1EX0xBUkdFRklMRTY0X1NPVVJDRT0xKQorIyBXZSBhZGQgdGhlc2Ugb3RoZXIgZGVmaW5pdGlvbnMgaGVyZSBiZWNhdXNlIENoZWNrVHlwZVNpemUuY21ha2UKKyMgaW4gQ01ha2UgMi40LnggZG9lcyBub3QgYXV0b21hdGljYWxseSBkbyBzbyBhbmQgd2Ugd2FudAorIyBjb21wYXRpYmlsaXR5IHdpdGggQ01ha2UgMi40LnguCitpZihIQVZFX1NZU19UWVBFU19IKQorICAgIGxpc3QoQVBQRU5EIENNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TIC1ESEFWRV9TWVNfVFlQRVNfSCkKK2VuZGlmKCkKK2lmKEhBVkVfU1RESU5UX0gpCisgICAgbGlzdChBUFBFTkQgQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgLURIQVZFX1NURElOVF9IKQorZW5kaWYoKQoraWYoSEFWRV9TVERERUZfSCkKKyAgICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OUyAtREhBVkVfU1REREVGX0gpCitlbmRpZigpCitjaGVja190eXBlX3NpemUob2ZmNjRfdCBPRkY2NF9UKQoraWYoSEFWRV9PRkY2NF9UKQorICAgYWRkX2RlZmluaXRpb25zKC1EX0xBUkdFRklMRTY0X1NPVVJDRT0xKQorZW5kaWYoKQorc2V0KENNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TKSAjIGNsZWFyIHZhcmlhYmxlCisKKyMKKyMgQ2hlY2sgZm9yIGZzZWVrbworIworY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGZzZWVrbyBIQVZFX0ZTRUVLTykKK2lmKE5PVCBIQVZFX0ZTRUVLTykKKyAgICBhZGRfZGVmaW5pdGlvbnMoLUROT19GU0VFS08pCitlbmRpZigpCisKKyMKKyMgQ2hlY2sgZm9yIHVuaXN0ZC5oCisjCitjaGVja19pbmNsdWRlX2ZpbGUodW5pc3RkLmggWl9IQVZFX1VOSVNURF9IKQorCitpZihNU1ZDKQorICAgIHNldChDTUFLRV9ERUJVR19QT1NURklYICJkIikKKyAgICBhZGRfZGVmaW5pdGlvbnMoLURfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUpCisgICAgYWRkX2RlZmluaXRpb25zKC1EX0NSVF9OT05TVERDX05PX0RFUFJFQ0FURSkKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSkKK2VuZGlmKCkKKworaWYoTk9UIENNQUtFX0NVUlJFTlRfU09VUkNFX0RJUiBTVFJFUVVBTCBDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVIpCisgICAgIyBJZiB3ZSdyZSBkb2luZyBhbiBvdXQgb2Ygc291cmNlIGJ1aWxkIGFuZCB0aGUgdXNlciBoYXMgYSB6Y29uZi5oCisgICAgIyBpbiB0aGVpciBzb3VyY2UgdHJlZS4uLgorICAgIGlmKEVYSVNUUyAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vemNvbmYuaCkKKyAgICAgICAgbWVzc2FnZShTVEFUVVMgIlJlbmFtaW5nIikKKyAgICAgICAgbWVzc2FnZShTVEFUVVMgIiAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vemNvbmYuaCIpCisgICAgICAgIG1lc3NhZ2UoU1RBVFVTICJ0byAnemNvbmYuaC5pbmNsdWRlZCcgYmVjYXVzZSB0aGlzIGZpbGUgaXMgaW5jbHVkZWQgd2l0aCB6bGliIikKKyAgICAgICAgbWVzc2FnZShTVEFUVVMgImJ1dCBDTWFrZSBnZW5lcmF0ZXMgaXQgYXV0b21hdGljYWxseSBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5LiIpCisgICAgICAgIGZpbGUoUkVOQU1FICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS96Y29uZi5oICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS96Y29uZi5oLmluY2x1ZGVkKQorICBlbmRpZigpCitlbmRpZigpCisKK3NldChaTElCX1BDICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS96bGliLnBjKQorY29uZmlndXJlX2ZpbGUoICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS96bGliLnBjLmNtYWtlaW4KKwkJJHtaTElCX1BDfSBAT05MWSkKK2NvbmZpZ3VyZV9maWxlKAkke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vemNvbmYuaC5jbWFrZWluCisJCSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS96Y29uZi5oIEBPTkxZKQoraW5jbHVkZV9kaXJlY3Rvcmllcygke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0gJHtDTUFLRV9TT1VSQ0VfRElSfSkKKworCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyB6bGliCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzZXQoWkxJQl9QVUJMSUNfSERSUworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS96Y29uZi5oCisgICAgemxpYi5oCispCitzZXQoWkxJQl9QUklWQVRFX0hEUlMKKyAgICBjcmMzMi5oCisgICAgZGVmbGF0ZS5oCisgICAgZ3pndXRzLmgKKyAgICBpbmZmYXN0LmgKKyAgICBpbmZmaXhlZC5oCisgICAgaW5mbGF0ZS5oCisgICAgaW5mdHJlZXMuaAorICAgIHRyZWVzLmgKKyAgICB6dXRpbC5oCispCitzZXQoWkxJQl9TUkNTCisgICAgYWRsZXIzMi5jCisgICAgY29tcHJlc3MuYworICAgIGNyYzMyLmMKKyAgICBkZWZsYXRlLmMKKyAgICBnemNsb3NlLmMKKyAgICBnemxpYi5jCisgICAgZ3pyZWFkLmMKKyAgICBnendyaXRlLmMKKyAgICBpbmZsYXRlLmMKKyAgICBpbmZiYWNrLmMKKyAgICBpbmZ0cmVlcy5jCisgICAgaW5mZmFzdC5jCisgICAgdHJlZXMuYworICAgIHVuY29tcHIuYworICAgIHp1dGlsLmMKKykKKworaWYoTk9UIE1JTkdXKQorICAgIHNldChaTElCX0RMTF9TUkNTCisgICAgICAgIHdpbjMyL3psaWIxLnJjICMgSWYgcHJlc2VudCB3aWxsIG92ZXJyaWRlIGN1c3RvbSBidWlsZCBydWxlIGJlbG93LgorICAgICkKK2VuZGlmKCkKKworaWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ0MpCisgICAgaWYoQVNNNjg2KQorICAgICAgICBzZXQoWkxJQl9BU01TIGNvbnRyaWIvYXNtNjg2L21hdGNoLlMpCisgICAgZWxzZWlmIChBTUQ2NCkKKyAgICAgICAgc2V0KFpMSUJfQVNNUyBjb250cmliL2FtZDY0L2FtZDY0LW1hdGNoLlMpCisgICAgZW5kaWYgKCkKKworCWlmKFpMSUJfQVNNUykKKwkJYWRkX2RlZmluaXRpb25zKC1EQVNNVikKKwkJc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKCR7WkxJQl9BU01TfSBQUk9QRVJUSUVTIExBTkdVQUdFIEMgQ09NUElMRV9GTEFHUyAtRE5PX1VOREVSTElORSkKKwllbmRpZigpCitlbmRpZigpCisKK2lmKE1TVkMpCisgICAgaWYoQVNNNjg2KQorCQlFTkFCTEVfTEFOR1VBR0UoQVNNX01BU00pCisgICAgICAgIHNldChaTElCX0FTTVMKKwkJCWNvbnRyaWIvbWFzbXg4Ni9pbmZmYXMzMi5hc20KKwkJCWNvbnRyaWIvbWFzbXg4Ni9tYXRjaDY4Ni5hc20KKwkJKQorICAgIGVsc2VpZiAoQU1ENjQpCisJCUVOQUJMRV9MQU5HVUFHRShBU01fTUFTTSkKKyAgICAgICAgc2V0KFpMSUJfQVNNUworCQkJY29udHJpYi9tYXNteDY0L2d2bWF0NjQuYXNtCisJCQljb250cmliL21hc214NjQvaW5mZmFzeDY0LmFzbQorCQkpCisgICAgZW5kaWYoKQorCisJaWYoWkxJQl9BU01TKQorCQlhZGRfZGVmaW5pdGlvbnMoLURBU01WIC1EQVNNSU5GKQorCWVuZGlmKCkKK2VuZGlmKCkKKworIyBwYXJzZSB0aGUgZnVsbCB2ZXJzaW9uIG51bWJlciBmcm9tIHpsaWIuaCBhbmQgaW5jbHVkZSBpbiBaTElCX0ZVTExfVkVSU0lPTgorZmlsZShSRUFEICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS96bGliLmggX3psaWJfaF9jb250ZW50cykKK3N0cmluZyhSRUdFWCBSRVBMQUNFICIuKiNkZWZpbmVbIFx0XStaTElCX1ZFUlNJT05bIFx0XStcIihbLTAtOUEtWmEtei5dKylcIi4qIgorICAgICJcXDEiIFpMSUJfRlVMTF9WRVJTSU9OICR7X3psaWJfaF9jb250ZW50c30pCisKK2lmKE1JTkdXKQorICAgICMgVGhpcyBnZXRzIHVzIERMTCByZXNvdXJjZSBpbmZvcm1hdGlvbiB3aGVuIGNvbXBpbGluZyBvbiBNaW5HVy4KKyAgICBpZihOT1QgQ01BS0VfUkNfQ09NUElMRVIpCisgICAgICAgIHNldChDTUFLRV9SQ19DT01QSUxFUiB3aW5kcmVzLmV4ZSkKKyAgICBlbmRpZigpCisKKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS96bGliMXJjLm9iagorICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfUkNfQ09NUElMRVJ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLUQgR0NDX1dJTkRSRVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtSSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtSSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtbyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vemxpYjFyYy5vYmoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtaSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vd2luMzIvemxpYjEucmMpCisgICAgc2V0KFpMSUJfRExMX1NSQ1MgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3psaWIxcmMub2JqKQorZW5kaWYoTUlOR1cpCisKK2FkZF9saWJyYXJ5KHpsaWIgU0hBUkVEICR7WkxJQl9TUkNTfSAke1pMSUJfQVNNU30gJHtaTElCX0RMTF9TUkNTfSAke1pMSUJfUFVCTElDX0hEUlN9ICR7WkxJQl9QUklWQVRFX0hEUlN9KQorYWRkX2xpYnJhcnkoemxpYnN0YXRpYyBTVEFUSUMgJHtaTElCX1NSQ1N9ICR7WkxJQl9BU01TfSAke1pMSUJfUFVCTElDX0hEUlN9ICR7WkxJQl9QUklWQVRFX0hEUlN9KQorc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHpsaWIgUFJPUEVSVElFUyBERUZJTkVfU1lNQk9MIFpMSUJfRExMKQorc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHpsaWIgUFJPUEVSVElFUyBTT1ZFUlNJT04gMSkKKworaWYoTk9UIENZR1dJTikKKyAgICAjIFRoaXMgcHJvcGVydHkgY2F1c2VzIHNoYXJlZCBsaWJyYXJpZXMgb24gTGludXggdG8gaGF2ZSB0aGUgZnVsbCB2ZXJzaW9uCisgICAgIyBlbmNvZGVkIGludG8gdGhlaXIgZmluYWwgZmlsZW5hbWUuICBXZSBkaXNhYmxlIHRoaXMgb24gQ3lnd2luIGJlY2F1c2UKKyAgICAjIGl0IGNhdXNlcyBjeWd6LSR7WkxJQl9GVUxMX1ZFUlNJT059LmRsbCB0byBiZSBjcmVhdGVkIHdoZW4gY3lnei5kbGwKKyAgICAjIHNlZW1zIHRvIGJlIHRoZSBkZWZhdWx0LgorICAgICMKKyAgICAjIFRoaXMgaGFzIG5vIGVmZmVjdCB3aXRoIE1TVkMsIG9uIHRoYXQgcGxhdGZvcm0gdGhlIHZlcnNpb24gaW5mbyBmb3IKKyAgICAjIHRoZSBETEwgY29tZXMgZnJvbSB0aGUgcmVzb3VyY2UgZmlsZSB3aW4zMi96bGliMS5yYworICAgIHNldF90YXJnZXRfcHJvcGVydGllcyh6bGliIFBST1BFUlRJRVMgVkVSU0lPTiAke1pMSUJfRlVMTF9WRVJTSU9OfSkKK2VuZGlmKCkKKworaWYoVU5JWCkKKyAgICAjIE9uIHVuaXgtbGlrZSBwbGF0Zm9ybXMgdGhlIGxpYnJhcnkgaXMgYWxtb3N0IGFsd2F5cyBjYWxsZWQgbGliegorICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHpsaWIgemxpYnN0YXRpYyBQUk9QRVJUSUVTIE9VVFBVVF9OQU1FIHopCisgICBpZihOT1QgQVBQTEUpCisgICAgIHNldF90YXJnZXRfcHJvcGVydGllcyh6bGliIFBST1BFUlRJRVMgTElOS19GTEFHUyAiLVdsLC0tdmVyc2lvbi1zY3JpcHQsXCIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vemxpYi5tYXBcIiIpCisgICBlbmRpZigpCitlbHNlaWYoQlVJTERfU0hBUkVEX0xJQlMgQU5EIFdJTjMyKQorICAgICMgQ3JlYXRlcyB6bGliMS5kbGwgd2hlbiBidWlsZGluZyBzaGFyZWQgbGlicmFyeSB2ZXJzaW9uCisgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHpsaWIgUFJPUEVSVElFUyBTVUZGSVggIjEuZGxsIikKK2VuZGlmKCkKKworaWYoTk9UIFNLSVBfSU5TVEFMTF9MSUJSQVJJRVMgQU5EIE5PVCBTS0lQX0lOU1RBTExfQUxMICkKKyAgICBpbnN0YWxsKFRBUkdFVFMgemxpYiB6bGlic3RhdGljCisgICAgICAgIFJVTlRJTUUgREVTVElOQVRJT04gIiR7SU5TVEFMTF9CSU5fRElSfSIKKyAgICAgICAgQVJDSElWRSBERVNUSU5BVElPTiAiJHtJTlNUQUxMX0xJQl9ESVJ9IgorICAgICAgICBMSUJSQVJZIERFU1RJTkFUSU9OICIke0lOU1RBTExfTElCX0RJUn0iICkKK2VuZGlmKCkKK2lmKE5PVCBTS0lQX0lOU1RBTExfSEVBREVSUyBBTkQgTk9UIFNLSVBfSU5TVEFMTF9BTEwgKQorICAgIGluc3RhbGwoRklMRVMgJHtaTElCX1BVQkxJQ19IRFJTfSBERVNUSU5BVElPTiAiJHtJTlNUQUxMX0lOQ19ESVJ9IikKK2VuZGlmKCkKK2lmKE5PVCBTS0lQX0lOU1RBTExfRklMRVMgQU5EIE5PVCBTS0lQX0lOU1RBTExfQUxMICkKKyAgICBpbnN0YWxsKEZJTEVTIHpsaWIuMyBERVNUSU5BVElPTiAiJHtJTlNUQUxMX01BTl9ESVJ9L21hbjMiKQorZW5kaWYoKQoraWYoTk9UIFNLSVBfSU5TVEFMTF9GSUxFUyBBTkQgTk9UIFNLSVBfSU5TVEFMTF9BTEwgKQorICAgIGluc3RhbGwoRklMRVMgJHtaTElCX1BDfSBERVNUSU5BVElPTiAiJHtJTlNUQUxMX1BLR0NPTkZJR19ESVJ9IikKK2VuZGlmKCkKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgRXhhbXBsZSBiaW5hcmllcworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworYWRkX2V4ZWN1dGFibGUoZXhhbXBsZSB0ZXN0L2V4YW1wbGUuYykKK3RhcmdldF9saW5rX2xpYnJhcmllcyhleGFtcGxlIHpsaWIpCithZGRfdGVzdChleGFtcGxlIGV4YW1wbGUpCisKK2FkZF9leGVjdXRhYmxlKG1pbmlnemlwIHRlc3QvbWluaWd6aXAuYykKK3RhcmdldF9saW5rX2xpYnJhcmllcyhtaW5pZ3ppcCB6bGliKQorCitpZihIQVZFX09GRjY0X1QpCisgICAgYWRkX2V4ZWN1dGFibGUoZXhhbXBsZTY0IHRlc3QvZXhhbXBsZS5jKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhleGFtcGxlNjQgemxpYikKKyAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoZXhhbXBsZTY0IFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiLURfRklMRV9PRkZTRVRfQklUUz02NCIpCisgICAgYWRkX3Rlc3QoZXhhbXBsZTY0IGV4YW1wbGU2NCkKKworICAgIGFkZF9leGVjdXRhYmxlKG1pbmlnemlwNjQgdGVzdC9taW5pZ3ppcC5jKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhtaW5pZ3ppcDY0IHpsaWIpCisgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKG1pbmlnemlwNjQgUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICItRF9GSUxFX09GRlNFVF9CSVRTPTY0IikKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL3psaWIvc3JjL0NoYW5nZUxvZyBiL3psaWIvc3JjL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjJhYWJhCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMTQ3MiBAQAorCisgICAgICAgICAgICAgICAgQ2hhbmdlTG9nIGZpbGUgZm9yIHpsaWIKKworQ2hhbmdlcyBpbiAxLjIuOCAoMjggQXByIDIwMTMpCistIFVwZGF0ZSBjb250cmliL21pbml6aXAvaW93aW4zMi5jIGZvciBXaW5kb3dzIFJUIFtWb2xsYW50XQorLSBEbyBub3QgZm9yY2UgWl9DT05TVCBmb3IgQysrCistIENsZWFuIHVwIGNvbnRyaWIvdnN0dWRpbyBbUm+nXQorLSBDb3JyZWN0IHNwZWxsaW5nIGVycm9yIGluIHpsaWIuaAorLSBGaXggbWl4ZWQgbGluZSBlbmRpbmdzIGluIGNvbnRyaWIvdnN0dWRpbworCitDaGFuZ2VzIGluIDEuMi43LjMgKDEzIEFwciAyMDEzKQorLSBGaXggdmVyc2lvbiBudW1iZXJzIGFuZCBETEwgbmFtZXMgaW4gY29udHJpYi92c3R1ZGlvLyovemxpYi5yYworCitDaGFuZ2VzIGluIDEuMi43LjIgKDEzIEFwciAyMDEzKQorLSBDaGFuZ2UgY2hlY2sgZm9yIGEgZm91ci1ieXRlIHR5cGUgYmFjayB0byBoZXhhZGVjaW1hbAorLSBGaXggdHlwbyBpbiB3aW4zMi9NYWtlZmlsZS5tc2MKKy0gQWRkIGNhc3RzIGluIGd6d3JpdGUuYyBmb3IgcG9pbnRlciBkaWZmZXJlbmNlcworCitDaGFuZ2VzIGluIDEuMi43LjEgKDI0IE1hciAyMDEzKQorLSBSZXBsYWNlIHVzZSBvZiB1bnNhZmUgc3RyaW5nIGZ1bmN0aW9ucyB3aXRoIHNucHJpbnRmIGlmIGF2YWlsYWJsZQorLSBBdm9pZCBpbmNsdWRpbmcgc3RkZGVmLmggb24gV2luZG93cyBmb3IgWl9TT0xPIGNvbXBpbGUgW05pZXNzaW5rXQorLSBGaXggZ3pnZXRjIHVuZGVmaW5lIHdoZW4gWl9QUkVGSVggc2V0IFtUdXJrXQorLSBFbGltaW5hdGUgdXNlIG9mIG1rdGVtcCBpbiBNYWtlZmlsZSAobm90IGFsd2F5cyBhdmFpbGFibGUpCistIEZpeCBidWcgaW4gJ0YnIG1vZGUgZm9yIGd6b3BlbigpCistIEFkZCBpbmZsYXRlR2V0RGljdGlvbmFyeSgpIGZ1bmN0aW9uCistIENvcnJlY3QgY29tbWVudCBpbiBkZWZsYXRlLmgKKy0gVXNlIF9zbnByaW50ZiBmb3Igc25wcmludGYgaW4gTWljcm9zb2Z0IEMKKy0gT24gRGFyd2luLCBvbmx5IHVzZSAvdXNyL2Jpbi9saWJ0b29sIGlmIGxpYnRvb2wgaXMgbm90IEFwcGxlCistIERlbGV0ZSAiLS12ZXJzaW9uIiBmaWxlIGlmIGNyZWF0ZWQgYnkgImFyIC0tdmVyc2lvbiIgW1JpY2hhcmQgRy5dCistIEZpeCBjb25maWd1cmUgY2hlY2sgZm9yIHZlcmFjaXR5IG9mIGNvbXBpbGVyIGVycm9yIHJldHVybiBjb2RlcworLSBGaXggQ01ha2UgY29tcGlsYXRpb24gb2Ygc3RhdGljIGxpYiBmb3IgTVNWQzIwMTAgeDY0CistIFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgaW4gaW5mYmFjazkuYworLSBGaXggYXJndW1lbnQgY2hlY2tzIGluIGd6bG9nX2NvbXByZXNzKCkgYW5kIGd6bG9nX3dyaXRlKCkKKy0gQ2xlYW4gdXAgdGhlIHVzYWdlIG9mIHpfY29uc3QgYW5kIHJlc3BlY3QgY29uc3QgdXNhZ2Ugd2l0aGluIHpsaWIKKy0gQ2xlYW4gdXAgZXhhbXBsZXMvZ3psb2cuW2NoXSBjb21wYXJpc29ucyBvZiBkaWZmZXJlbnQgdHlwZXMKKy0gQXZvaWQgc2hpZnQgZXF1YWwgdG8gYml0cyBpbiB0eXBlIChjYXVzZWQgZW5kbGVzcyBsb29wKQorLSBGaXggdW5pbnRpYWxpemVkIHZhbHVlIGJ1ZyBpbiBnenB1dGMoKSBpbnRyb2R1Y2VkIGJ5IGNvbnN0IHBhdGNoZXMKKy0gRml4IG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yIGluIGV4YW1wbGVzL3pyYW4uYyBbTm9yXQorLSBGaXggYnVnIHdoZXJlIGd6b3BlbigpLCBnemNsb3NlKCkgd291bGQgd3JpdGUgYW4gZW1wdHkgZmlsZQorLSBGaXggYnVnIGluIGd6Y2xvc2UoKSB3aGVuIGd6d3JpdGUoKSBydW5zIG91dCBvZiBtZW1vcnkKKy0gQ2hlY2sgZm9yIGlucHV0IGJ1ZmZlciBtYWxsb2MgZmFpbHVyZSBpbiBleGFtcGxlcy9nemFwcGVuZC5jCistIEFkZCBub3RlIHRvIGNvbnRyaWIvYmxhc3QgdG8gdXNlIGJpbmFyeSBtb2RlIGluIHN0ZGlvCistIEZpeCBjb21wYXJpc29ucyBvZiBkaWZmZXJlbnRseSBzaWduZWQgaW50ZWdlcnMgaW4gY29udHJpYi9ibGFzdAorLSBDaGVjayBmb3IgaW52YWxpZCBjb2RlIGxlbmd0aCBjb2RlcyBpbiBjb250cmliL3B1ZmYKKy0gRml4IHNlcmlvdXMgYnV0IHZlcnkgcmFyZSBkZWNvbXByZXNzaW9uIGJ1ZyBpbiBpbmZ0cmVlcy5jCistIFVwZGF0ZSBpbmZsYXRlQmFjaygpIGNvbW1lbnRzLCBzaW5jZSBpbmZsYXRlKCkgY2FuIGJlIGZhc3RlcgorLSBVc2UgdW5kZXJzY29yZWQgSS9PIGZ1bmN0aW9uIG5hbWVzIGZvciBXSU5BUElfRkFNSUxZCistIEFkZCBfdHJfZmx1c2hfYml0cyB0byB0aGUgZXh0ZXJuYWwgc3ltYm9scyBwcmVmaXhlZCBieSAtLXpwcmVmaXgKKy0gQWRkIGNvbnRyaWIvdnN0dWRpby92YzEwIHByZS1idWlsZCBzdGVwIGZvciBzdGF0aWMgb25seQorLSBRdW90ZSAtLXZlcnNpb24tc2NyaXB0IGFyZ3VtZW50IGluIENNYWtlTGlzdHMudHh0CistIERvbid0IHNwZWNpZnkgLS12ZXJzaW9uLXNjcmlwdCBvbiBBcHBsZSBwbGF0Zm9ybXMgaW4gQ01ha2VMaXN0cy50eHQKKy0gRml4IGNhc3RpbmcgZXJyb3IgaW4gY29udHJpYi90ZXN0emxpYi90ZXN0emxpYi5jCistIEZpeCB0eXBlcyBpbiBjb250cmliL21pbml6aXAgdG8gbWF0Y2ggcmVzdWx0IG9mIGdldF9jcmNfdGFibGUoKQorLSBTaW1wbGlmeSBjb250cmliL3ZzdHVkaW8vdmMxMCB3aXRoICdkJyBzdWZmaXgKKy0gQWRkIFRPUCBzdXBwb3J0IHRvIHdpbjMyL01ha2VmaWxlLm1zYworLSBTdXBvcnQgaTY4NiBhbmQgYW1kNjQgYXNzZW1ibGVyIGJ1aWxkcyBpbiBDTWFrZUxpc3RzLnR4dAorLSBGaXggdHlwb3MgaW4gdGhlIHVzZSBvZiBfTEFSR0VGSUxFNjRfU09VUkNFIGluIHpjb25mLmgKKy0gQWRkIHZjMTEgYW5kIHZjMTIgYnVpbGQgZmlsZXMgdG8gY29udHJpYi92c3R1ZGlvCistIEFkZCBnenZwcmludGYoKSBhcyBhbiB1bmRvY3VtZW50ZWQgZnVuY3Rpb24gaW4gemxpYgorLSBGaXggY29uZmlndXJlIGZvciBTdW4gc2hlbGwKKy0gUmVtb3ZlIHJ1bnRpbWUgY2hlY2sgaW4gY29uZmlndXJlIGZvciBmb3VyLWJ5dGUgaW50ZWdlciB0eXBlCistIEFkZCBjYXN0cyBhbmQgY29uc3RzIHRvIGVhc2UgdXNlciBjb252ZXJzaW9uIHRvIEMrKworLSBBZGQgbWFuIHBhZ2VzIGZvciBtaW5pemlwIGFuZCBtaW5pdW56aXAKKy0gSW4gTWFrZWZpbGUgdW5pbnN0YWxsLCBkb24ndCBybSBpZiBwcmVjZWRpbmcgY2QgZmFpbHMKKy0gRG8gbm90IHJldHVybiBaX0JVRl9FUlJPUiBpZiBkZWZsYXRlUGFyYW0oKSBoYXMgbm90aGluZyB0byB3cml0ZQorCitDaGFuZ2VzIGluIDEuMi43ICgyIE1heSAyMDEyKQorLSBSZXBsYWNlIHVzZSBvZiBtZW1tb3ZlKCkgd2l0aCBhIHNpbXBsZSBjb3B5IGZvciBwb3J0YWJpbGl0eQorLSBUZXN0IGZvciBleGlzdGVuY2Ugb2Ygc3RyZXJyb3IKKy0gUmVzdG9yZSBnemdldGNfIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggMS4yLjYKKy0gRml4IGJ1aWxkIHdpdGggbm9uLUdOVSBtYWtlIG9uIFNvbGFyaXMKKy0gUmVxdWlyZSBnY2MgNC4wIG9yIGxhdGVyIG9uIE1hYyBPUyBYIHRvIHVzZSB0aGUgaGlkZGVuIGF0dHJpYnV0ZQorLSBJbmNsdWRlIHVuaXN0ZC5oIGZvciBXYXRjb20gQworLSBVc2UgX19XQVRDT01DX18gaW5zdGVhZCBvZiBfX1dBVENPTV9fCistIERvIG5vdCB1c2UgdGhlIHZpc2liaWxpdHkgYXR0cmlidXRlIGlmIE5PX1ZJWiBkZWZpbmVkCistIEltcHJvdmUgdGhlIGRldGVjdGlvbiBvZiBubyBoaWRkZW4gdmlzaWJpbGl0eSBhdHRyaWJ1dGUKKy0gQXZvaWQgdXNpbmcgX19pbnQ2NCBmb3IgZ2NjIG9yIHNvbG8gY29tcGlsYXRpb24KKy0gQ2FzdCB0byBjaGFyICogaW4gZ3pwcmludGYgdG8gYXZvaWQgd2FybmluZ3MgW1ppbnNlcl0KKy0gRml4IG1ha2Vfdm1zLmNvbSBmb3IgVkFYIFtaaW5zZXJdCistIERvbid0IHVzZSBsaWJyYXJ5IG9yIGJ1aWx0LWluIGJ5dGUgc3dhcHMKKy0gU2ltcGxpZnkgdGVzdCBhbmQgdXNlIG9mIGdjYyBoaWRkZW4gYXR0cmlidXRlCistIEZpeCBidWcgaW4gZ3pjbG9zZV93KCkgd2hlbiBnendyaXRlKCkgZmFpbHMgdG8gYWxsb2NhdGUgbWVtb3J5CistIEFkZCAieCIgKE9fRVhDTCkgYW5kICJlIiAoT19DTE9FWEVDKSBtb2RlcyBzdXBwb3J0IHRvIGd6b3BlbigpCistIEZpeCBidWcgaW4gdGVzdC9taW5pZ3ppcC5jIGZvciBjb25maWd1cmUgLS1zb2xvCistIEZpeCBjb250cmliL3ZzdHVkaW8gcHJvamVjdCBsaW5rIGVycm9ycyBbTW9oYW5hdGhhc10KKy0gQWRkIGFiaWxpdHkgdG8gY2hvb3NlIHRoZSBidWlsZGVyIGluIG1ha2Vfdm1zLmNvbSBbU2Nod2VkYV0KKy0gQWRkIERFU1RESVIgc3VwcG9ydCB0byBtaW5ndzMyIHdpbjMyL01ha2VmaWxlLmdjYworLSBGaXggY29tbWVudHMgaW4gd2luMzIvTWFrZWZpbGUuZ2NjIGZvciBwcm9wZXIgdXNhZ2UKKy0gQWxsb3cgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBpbnN0YWxsIGxvY2F0aW9ucyBmb3IgY21ha2UKKy0gR2VuZXJhdGUgYW5kIGluc3RhbGwgdGhlIHBrZy1jb25maWcgZmlsZSB3aXRoIGNtYWtlCistIEJ1aWxkIGJvdGggYSBzdGF0aWMgYW5kIGEgc2hhcmVkIHZlcnNpb24gb2YgemxpYiB3aXRoIGNtYWtlCistIEluY2x1ZGUgdmVyc2lvbiBzeW1ib2xzIGZvciBjbWFrZSBidWlsZHMKKy0gSWYgdXNpbmcgY21ha2Ugd2l0aCBNU1ZDLCBhZGQgdGhlIHNvdXJjZSBkaXJlY3RvcnkgdG8gdGhlIGluY2x1ZGVzCistIFJlbW92ZSB1bm5lZWRlZCBFWFRSQV9DRkxBR1MgZnJvbSB3aW4zMi9NYWtlZmlsZS5nY2MgW1RydXRhXQorLSBNb3ZlIG9ic29sZXRlIGVteCBtYWtlZmlsZSB0byBvbGQgW1RydXRhXQorLSBBbGxvdyB0aGUgdXNlIG9mIC1XdW5kZWYgd2hlbiBjb21waWxpbmcgb3IgdXNpbmcgemxpYgorLSBBdm9pZCB0aGUgdXNlIG9mIHRoZSAtdSBvcHRpb24gd2l0aCBta3RlbXAKKy0gSW1wcm92ZSBpbmZsYXRlKCkgZG9jdW1lbnRhdGlvbiBvbiB0aGUgdXNlIG9mIFpfRklOSVNICistIFJlY29nbml6ZSBjbGFuZyBhcyBnY2MKKy0gQWRkIGd6b3Blbl93KCkgaW4gV2luZG93cyBmb3Igd2lkZSBjaGFyYWN0ZXIgcGF0aCBuYW1lcworLSBSZW5hbWUgemNvbmYuaCBpbiBDTWFrZUxpc3RzLnR4dCB0byBtb3ZlIGl0IG91dCBvZiB0aGUgd2F5CistIEFkZCBzb3VyY2UgZGlyZWN0b3J5IGluIENNYWtlTGlzdHMudHh0IGZvciBidWlsZGluZyBleGFtcGxlcworLSBMb29rIGluIGJ1aWxkIGRpcmVjdG9yeSBmb3IgemxpYi5wYyBpbiBDTWFrZUxpc3RzLnR4dAorLSBSZW1vdmUgZ3pmbGFncyBmcm9tIHpsaWJ2Yy5kZWYgaW4gdmM5IGFuZCB2YzEwCistIEZpeCBjb250cmliL21pbml6aXAgY29tcGlsYXRpb24gaW4gdGhlIE1pbkdXIGVudmlyb25tZW50CistIFVwZGF0ZSAuL2NvbmZpZ3VyZSBmb3IgU29sYXJpcywgc3VwcG9ydCAtLTY0IFtNb29uZXldCistIFJlbW92ZSAtUi4gZnJvbSBTb2xhcmlzIHNoYXJlZCBidWlsZCAocG9zc2libGUgc2VjdXJpdHkgaXNzdWUpCistIEF2b2lkIHJhY2UgY29uZGl0aW9uIGZvciBwYXJhbGxlbCBtYWtlICgtaikgcnVubmluZyBleGFtcGxlCistIEZpeCB0eXBlIG1pc21hdGNoIGJldHdlZW4gZ2V0X2NyY190YWJsZSgpIGFuZCBjcmNfdGFibGUKKy0gRml4IHBhcnNpbmcgb2YgdmVyc2lvbiB3aXRoICItIiBpbiBDTWFrZUxpc3RzLnR4dCBbU25pZGVyLCBaaWVnbGVyXQorLSBGaXggdGhlIHBhdGggdG8gemxpYi5tYXAgaW4gQ01ha2VMaXN0cy50eHQKKy0gRm9yY2UgdGhlIG5hdGl2ZSBsaWJ0b29sIGluIE1hYyBPUyBYIHRvIGF2b2lkIEdOVSBsaWJ0b29sIFtCZWViZV0KKy0gQWRkIGluc3RydWN0aW9ucyB0byB3aW4zMi9NYWtlZmlsZS5nY2MgZm9yIHNoYXJlZCBpbnN0YWxsIFtUb3JyaV0KKworQ2hhbmdlcyBpbiAxLjIuNi4xICgxMiBGZWIgMjAxMikKKy0gQXZvaWQgdGhlIHVzZSBvZiB0aGUgT2JqZWN0aXZlLUMgcmVzZXJ2ZWQgbmFtZSAiaWQiCistIEluY2x1ZGUgaW8uaCBpbiBnemd1dHMuaCBmb3IgTWljcm9zb2Z0IGNvbXBpbGVycworLSBGaXggcHJvYmxlbSB3aXRoIC4vY29uZmlndXJlIC0tcHJlZml4IGFuZCBnemdldGMgbWFjcm8KKy0gSW5jbHVkZSBnel9oZWFkZXIgZGVmaW5pdGlvbiB3aGVuIGNvbXBpbGluZyB6bGliIHNvbG8KKy0gUHV0IGd6ZmxhZ3MoKSBmdW5jdGlvbmFsaXR5IGJhY2sgaW4genV0aWwuYworLSBBdm9pZCBsaWJyYXJ5IGhlYWRlciBpbmNsdWRlIGluIGNyYzMyLmMgZm9yIFpfU09MTworLSBVc2UgbmFtZSBpbiBHQ0NfQ0xBU1NJQyBhcyBDIGNvbXBpbGVyIGZvciBjb3ZlcmFnZSB0ZXN0aW5nLCBpZiBzZXQKKy0gTWlub3IgY2xlYW51cCBpbiBjb250cmliL21pbml6aXAvemlwLmMgW1ZvbGxhbnRdCistIFVwZGF0ZSBtYWtlX3Ztcy5jb20gW1ppbnNlcl0KKy0gUmVtb3ZlIHVubmVjZXNzYXJ5IGd6Z2V0Y18gZnVuY3Rpb24KKy0gVXNlIG9wdGltaXplZCBieXRlIHN3YXAgb3BlcmF0aW9ucyBmb3IgTWljcm9zb2Z0IGFuZCBHTlUgW1NueWRlcl0KKy0gRml4IG1pbm9yIHR5cG8gaW4gemxpYi5oIGNvbW1lbnRzIFtSemVzbmlvd2llY2tpXQorCitDaGFuZ2VzIGluIDEuMi42ICgyOSBKYW4gMjAxMikKKy0gVXBkYXRlIHRoZSBQYXNjYWwgaW50ZXJmYWNlIGluIGNvbnRyaWIvcGFzY2FsCistIEZpeCBmdW5jdGlvbiBudW1iZXJzIGZvciBnemdldGNfIGluIHpsaWJ2Yy5kZWYgZmlsZXMKKy0gRml4IGNvbmZpZ3VyZS5hYyBmb3IgY29udHJpYi9taW5pemlwIFtTY2hpZmZlcl0KKy0gRml4IGxhcmdlLWVudHJ5IGRldGVjdGlvbiBpbiBtaW5pemlwIG9uIDY0LWJpdCBzeXN0ZW1zIFtTY2hpZmZlcl0KKy0gSGF2ZSAuL2NvbmZpZ3VyZSB1c2UgdGhlIGNvbXBpbGVyIHJldHVybiBjb2RlIGZvciBlcnJvciBpbmRpY2F0aW9uCistIEZpeCBDTWFrZUxpc3RzLnR4dCBmb3IgY3Jvc3MgY29tcGlsYXRpb24gW01jQ2x1cmVdCistIEZpeCBjb250cmliL21pbml6aXAvemlwLmMgZm9yIDY0LWJpdCBhcmNoaXRlY3R1cmVzIFtEYWxzbmVzXQorLSBGaXggY29tcGlsYXRpb24gb2YgY29udHJpYi9taW5pemlwIG9uIEZyZWVCU0QgW01hcnF1ZXpdCistIENvcnJlY3Qgc3VnZ2VzdGVkIHVzYWdlcyBpbiB3aW4zMi9NYWtlZmlsZS5tc2MgW1NoYWNoYXIsIEhvcnZhdGhdCistIEluY2x1ZGUgaW8uaCBmb3IgVHVyYm8gQyAvIEJvcmxhbmQgQyBvbiBhbGwgcGxhdGZvcm1zIFtUcnV0YV0KKy0gTWFrZSB2ZXJzaW9uIGV4cGxpY2l0IGluIGNvbnRyaWIvbWluaXppcC9jb25maWd1cmUuYWMgW0Jvc21hbnNdCistIEF2b2lkIHdhcm5pbmcgZm9yIG5vIGVuY3J5cHRpb24gaW4gY29udHJpYi9taW5pemlwL3ppcC5jIFtWb2xsYW50XQorLSBNaW5vciBjbGVhbnVwIHVwIGNvbnRyaWIvbWluaXppcC91bnppcC5jIFtWb2xsYW50XQorLSBGaXggYnVnIHdoZW4gY29tcGlsaW5nIG1pbml6aXAgd2l0aCBDKysgW1ZvbGxhbnRdCistIFByb3RlY3QgZm9yIGxvbmcgbmFtZSBhbmQgZXh0cmEgZmllbGRzIGluIGNvbnRyaWIvbWluaXppcCBbVm9sbGFudF0KKy0gQXZvaWQgc29tZSB3YXJuaW5ncyBpbiBjb250cmliL21pbml6aXAgW1ZvbGxhbnRdCistIEFkZCAtSS4uLy4uIC1MLi4vLi4gdG8gQ0ZMQUdTIGZvciBtaW5pemlwIGFuZCBtaW5pdW56aXAKKy0gQWRkIG1pc3NpbmcgbGlicyB0byBtaW5pemlwIGxpbmtlciBjb21tYW5kCistIEFkZCBzdXBwb3J0IGZvciBWUEFUSCBidWlsZHMgaW4gY29udHJpYi9taW5pemlwCistIEFkZCBhbiAtLWVuYWJsZS1kZW1vcyBvcHRpb24gdG8gY29udHJpYi9taW5pemlwL2NvbmZpZ3VyZQorLSBBZGQgdGhlIGdlbmVyYXRpb24gb2YgY29uZmlndXJlLmxvZyBieSAuL2NvbmZpZ3VyZQorLSBFeGl0IHdoZW4gcmVxdWlyZWQgcGFyYW1ldGVycyBub3QgcHJvdmlkZWQgdG8gd2luMzIvTWFrZWZpbGUuZ2NjCistIEhhdmUgZ3pwdXRjIHJldHVybiB0aGUgY2hhcmFjdGVyIHdyaXR0ZW4gaW5zdGVhZCBvZiB0aGUgYXJndW1lbnQKKy0gVXNlIHRoZSAtbSBvcHRpb24gb24gbGRjb25maWcgZm9yIEJTRCBzeXN0ZW1zIFtUb2JpYXNdCistIENvcnJlY3QgaW4gemxpYi5tYXAgd2hlbiBkZWZsYXRlUmVzZXRLZWVwIHdhcyBhZGRlZAorCitDaGFuZ2VzIGluIDEuMi41LjMgKDE1IEphbiAyMDEyKQorLSBSZXN0b3JlIGd6Z2V0YyBmdW5jdGlvbiBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkKKy0gRG8gbm90IHVzZSBfbHNlZWtpNjQgdW5kZXIgQm9ybGFuZCBDKysgW1RydXRhXQorLSBVcGRhdGUgd2luMzIvTWFrZWZpbGUubXNjIHRvIGJ1aWxkIHRlc3QvKi5jIFtUcnV0YV0KKy0gUmVtb3ZlIG9sZC92aXN1YWxjNiBnaXZlbiBDTWFrZWZpbGUgYW5kIG90aGVyIGFsdGVybmF0aXZlcworLSBVcGRhdGUgQVM0MDAgYnVpbGQgZmlsZXMgYW5kIGRvY3VtZW50YXRpb24gW01vbm5lcmF0XQorLSBVcGRhdGUgd2luMzIvTWFrZWZpbGUuZ2NjIHRvIGJ1aWxkIHRlc3QvKi5jIFtUcnV0YV0KKy0gUGVybWl0IHN0cm9uZ2VyIGZsdXNoZXMgYWZ0ZXIgWl9CTE9DSyBmbHVzaGVzCistIEF2b2lkIGV4dHJhbmVvdXMgZW1wdHkgYmxvY2tzIHdoZW4gZG9pbmcgZW1wdHkgZmx1c2hlcworLSBQZXJtaXQgWl9OVUxMIGFyZ3VtZW50cyB0byBkZWZsYXRlUGVuZGluZworLSBBbGxvdyBkZWZsYXRlUHJpbWUoKSB0byBpbnNlcnQgYml0cyBpbiB0aGUgbWlkZGxlIG9mIGEgc3RyZWFtCistIFJlbW92ZSBzZWNvbmQgZW1wdHkgc3RhdGljIGJsb2NrIGZvciBaX1BBUlRJQUxfRkxVU0gKKy0gV3JpdGUgb3V0IGFsbCBvZiB0aGUgYXZhaWxhYmxlIGJpdHMgd2hlbiB1c2luZyBaX0JMT0NLCistIEluc2VydCB0aGUgZmlyc3QgdHdvIHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgYWZ0ZXIgYSBmbHVzaAorCitDaGFuZ2VzIGluIDEuMi41LjIgKDE3IERlYyAyMDExKQorLSBmaXggbGQgZXJyb3I6IHVuYWJsZSB0byBmaW5kIHZlcnNpb24gZGVwZW5kZW5jeSAnWkxJQl8xLjIuNScKKy0gdXNlIHJlbGF0aXZlIHN5bWxpbmtzIGZvciBzaGFyZWQgbGlicworLSBBdm9pZCBzZWFyY2hpbmcgcGFzdCB3aW5kb3cgZm9yIFpfUkxFIHN0cmF0ZWd5CistIEFzc3VyZSB0aGF0IGhpZ2gtd2F0ZXIgbWFyayBpbml0aWFsaXphdGlvbiBpcyBhbHdheXMgYXBwbGllZCBpbiBkZWZsYXRlCistIEFkZCBhc3NlcnRpb25zIHRvIGZpbGxfd2luZG93KCkgaW4gZGVmbGF0ZS5jIHRvIG1hdGNoIGNvbW1lbnRzCistIFVwZGF0ZSBweXRob24gbGluayBpbiBSRUFETUUKKy0gQ29ycmVjdCBzcGVsbGluZyBlcnJvciBpbiBnenJlYWQuYworLSBGaXggYnVnIGluIGd6Z2V0cygpIGZvciBhIGNvbmNhdGVuYXRlZCBlbXB0eSBnemlwIHN0cmVhbQorLSBDb3JyZWN0IGVycm9yIGluIGNvbW1lbnQgZm9yIGd6X21ha2UoKQorLSBDaGFuZ2UgZ3pyZWFkKCkgYW5kIHJlbGF0ZWQgdG8gaWdub3JlIGp1bmsgYWZ0ZXIgZ3ppcCBzdHJlYW1zCistIEFsbG93IGd6cmVhZCgpIGFuZCByZWxhdGVkIHRvIGNvbnRpbnVlIGFmdGVyIGd6Y2xlYXJlcnIoKQorLSBBbGxvdyBnenJld2luZCgpIGFuZCBnenNlZWsoKSBhZnRlciBhIHByZW1hdHVyZSBlbmQtb2YtZmlsZQorLSBTaW1wbGlmeSBnenNlZWsoKSBub3cgdGhhdCByYXcgYWZ0ZXIgZ3ppcCBpcyBpZ25vcmVkCistIENoYW5nZSBnemdldGMoKSB0byBhIG1hY3JvIGZvciBzcGVlZCAofjQwJSBzcGVlZHVwIGluIHRlc3RpbmcpCistIEZpeCBnemNsb3NlKCkgdG8gcmV0dXJuIHRoZSBhY3R1YWwgZXJyb3IgbGFzdCBlbmNvdW50ZXJlZAorLSBBbHdheXMgYWRkIGxhcmdlIGZpbGUgc3VwcG9ydCBmb3Igd2luZG93cworLSBJbmNsdWRlIHpjb25mLmggZm9yIHdpbmRvd3MgbGFyZ2UgZmlsZSBzdXBwb3J0CistIEluY2x1ZGUgemNvbmYuaC5jbWFrZWluIGZvciB3aW5kb3dzIGxhcmdlIGZpbGUgc3VwcG9ydAorLSBVcGRhdGUgemNvbmYuaC5jbWFrZWluIG9uIG1ha2UgZGlzdGNsZWFuCistIE1lcmdlIHZlc3RpZ2lhbCB2c25wcmludGYgZGV0ZXJtaW5hdGlvbiBmcm9tIHp1dGlsLmggdG8gZ3pndXRzLmgKKy0gQ2xhcmlmeSBob3cgZ3pvcGVuKCkgYXBwZW5kcyBpbiB6bGliLmggY29tbWVudHMKKy0gQ29ycmVjdCBkb2N1bWVudGF0aW9uIG9mIGd6ZGlyZWN0KCkgc2luY2UganVuayBhdCBlbmQgbm93IGlnbm9yZWQKKy0gQWRkIGEgdHJhbnNwYXJlbnQgd3JpdGUgbW9kZSB0byBnem9wZW4oKSB3aGVuICdUJyBpcyBpbiB0aGUgbW9kZQorLSBVcGRhdGUgcHl0aG9uIGxpbmsgaW4gemxpYiBtYW4gcGFnZQorLSBHZXQgaW5mZml4ZWQuaCBhbmQgTUFLRUZJWEVEIHJlc3VsdCB0byBtYXRjaAorLSBBZGQgYSAuL2NvbmZpZyAtLXNvbG8gb3B0aW9uIHRvIG1ha2UgemxpYiBzdWJzZXQgd2l0aCBubyBsaWJhcnkgdXNlCistIEFkZCB1bmRvY3VtZW50ZWQgaW5mbGF0ZVJlc2V0S2VlcCgpIGZ1bmN0aW9uIGZvciBDQUIgZmlsZSBkZWNvZGluZworLSBBZGQgLS1jb3ZlciBvcHRpb24gdG8gLi9jb25maWd1cmUgZm9yIGdjYyBjb3ZlcmFnZSB0ZXN0aW5nCistIEFkZCAjZGVmaW5lIFpMSUJfQ09OU1Qgb3B0aW9uIHRvIHVzZSBjb25zdCBpbiB0aGUgel9zdHJlYW0gaW50ZXJmYWNlCistIEFkZCBjb21tZW50IHRvIGd6ZG9wZW4oKSBpbiB6bGliLmggdG8gdXNlIGR1cCgpIHdoZW4gdXNpbmcgZmlsZW5vKCkKKy0gTm90ZSBiZWhhdmlvciBvZiB1bmNvbXByZXNzKCkgdG8gcHJvdmlkZSBhcyBtdWNoIGRhdGEgYXMgaXQgY2FuCistIEFkZCBmaWxlcyBpbiBjb250cmliL21pbml6aXAgdG8gYWlkIGluIGJ1aWxkaW5nIGxpYm1pbml6aXAKKy0gU3BsaXQgb2ZmIEFSIG9wdGlvbnMgaW4gTWFrZWZpbGUuaW4gYW5kIGNvbmZpZ3VyZQorLSBDaGFuZ2UgT04gbWFjcm8gdG8gWl9BUkcgdG8gYXZvaWQgYXBwbGljYXRpb24gY29uZmxpY3RzCistIEZhY2lsaXRhdGUgY29tcGlsYXRpb24gd2l0aCBCb3JsYW5kIEMrKyBmb3IgcHJhZ21hcyBhbmQgdnNucHJpbnRmCistIEluY2x1ZGUgaW8uaCBmb3IgVHVyYm8gQyAvIEJvcmxhbmQgQysrCistIE1vdmUgZXhhbXBsZS5jIGFuZCBtaW5pZ3ppcC5jIHRvIHRlc3QvCistIFNpbXBsaWZ5IGluY29tcGxldGUgY29kZSB0YWJsZSBmaWxsaW5nIGluIGluZmxhdGVfdGFibGUoKQorLSBSZW1vdmUgY29kZSBmcm9tIGluZmxhdGUuYyBhbmQgaW5mYmFjay5jIHRoYXQgaXMgaW1wb3NzaWJsZSB0byBleGVjdXRlCistIFRlc3QgdGhlIGluZmxhdGUgY29kZSB3aXRoIGZ1bGwgY292ZXJhZ2UKKy0gQWxsb3cgZGVmbGF0ZVNldERpY3Rpb25hcnksIGluZmxhdGVTZXREaWN0aW9uYXJ5IGF0IGFueSB0aW1lIChpbiByYXcpCistIEFkZCBkZWZsYXRlUmVzZXRLZWVwIGFuZCBmaXggaW5mbGF0ZVJlc2V0S2VlcCB0byByZXRhaW4gZGljdGlvbmFyeQorLSBGaXggZ3p3cml0ZS5jIHRvIGFjY29tbW9kYXRlIHJlZHVjZWQgbWVtb3J5IHpsaWIgY29tcGlsYXRpb24KKy0gSGF2ZSBpbmZsYXRlKCkgd2l0aCBaX0ZJTklTSCBhdm9pZCB0aGUgYWxsb2NhdGlvbiBvZiBhIHdpbmRvdworLSBEbyBub3Qgc2V0IHN0cm0tPmFkbGVyIHdoZW4gZG9pbmcgcmF3IGluZmxhdGUKKy0gRml4IGd6ZW9mKCkgdG8gYmVoYXZlIGp1c3QgbGlrZSBmZW9mKCkgd2hlbiByZWFkIGlzIG5vdCBwYXN0IGVuZCBvZiBmaWxlCistIEZpeCBidWcgaW4gZ3pyZWFkLmMgd2hlbiBlbmQtb2YtZmlsZSBpcyByZWFjaGVkCistIEF2b2lkIHVzZSBvZiBaX0JVRl9FUlJPUiBpbiBneiogZnVuY3Rpb25zIGV4Y2VwdCBmb3IgcHJlbWF0dXJlIEVPRgorLSBEb2N1bWVudCBnenJlYWQoKSBjYXBhYmlsaXR5IHRvIHJlYWQgY29uY3VycmVudGx5IHdyaXR0ZW4gZmlsZXMKKy0gUmVtb3ZlIGhhcmQtY29kaW5nIG9mIHJlc291cmNlIGNvbXBpbGVyIGluIENNYWtlTGlzdHMudHh0IFtCbGFtbW9dCisKK0NoYW5nZXMgaW4gMS4yLjUuMSAoMTAgU2VwIDIwMTEpCistIFVwZGF0ZSBGQVEgZW50cnkgb24gc2hhcmVkIGJ1aWxkcyAoIzEzKQorLSBBdm9pZCBzeW1ib2xpYyBhcmd1bWVudCB0byBjaG1vZCBpbiBNYWtlZmlsZS5pbgorLSBGaXggYnVnIGFuZCBhZGQgY29uc3RzIGluIGNvbnRyaWIvcHVmZiBbT2Jlcmh1bWVyXQorLSBVcGRhdGUgY29udHJpYi9wdWZmL3plcm9zLnJhdyB0ZXN0IGZpbGUgdG8gaGF2ZSBhbGwgYmxvY2sgdHlwZXMKKy0gQWRkIGZ1bGwgY292ZXJhZ2UgdGVzdCBmb3IgcHVmZiBpbiBjb250cmliL3B1ZmYvTWFrZWZpbGUKKy0gRml4IHN0YXRpYy1vbmx5LWJ1aWxkIGluc3RhbGwgaW4gTWFrZWZpbGUuaW4KKy0gRml4IGJ1ZyBpbiB1bnpHZXRDdXJyZW50RmlsZUluZm8oKSBpbiBjb250cmliL21pbml6aXAgW0t1bm9dCistIEFkZCBsaWJ6LmEgZGVwZW5kZW5jeSB0byBzaGFyZWQgaW4gTWFrZWZpbGUuaW4gZm9yIHBhcmFsbGVsIGJ1aWxkcworLSBTcGVsbCBvdXQgIm51bWJlciIgKGluc3RlYWQgb2YgIm5iIikgaW4gemxpYi5oIGZvciB0b3RhbF9pbiwgdG90YWxfb3V0CistIFJlcGxhY2UgJCguLi4pIHdpdGggYC4uLmAgaW4gY29uZmlndXJlIGZvciBub24tYmFzaCBzaCBbQm93bGVyXQorLSBBZGQgZGFyd2luKiB0byBEYXJ3aW4qIGFuZCBzb2xhcmlzKiB0byBTdW5PU1wgNSogaW4gY29uZmlndXJlIFtHcm9mZmVuXQorLSBBZGQgc29sYXJpcyogdG8gTGludXgqIGluIGNvbmZpZ3VyZSB0byBhbGxvdyBnY2MgdXNlIFtHcm9mZmVuXQorLSBBZGQgKmJzZCogdG8gTGludXgqIGNhc2UgaW4gY29uZmlndXJlIFtCYXItTGV2XQorLSBBZGQgaW5mZmFzdC5vYmogdG8gZGVwZW5kZW5jaWVzIGluIHdpbjMyL01ha2VmaWxlLm1zYworLSBDb3JyZWN0IHNwZWxsaW5nIGVycm9yIGluIGRlZmxhdGUuaCBbS29obGVyXQorLSBDaGFuZ2UgbGliemRsbC5hIGFnYWluIHRvIGxpYnouZGxsLmEgKCEpIGluIHdpbjMyL01ha2VmaWxlLmdjYworLSBBZGQgdGVzdCB0byBjb25maWd1cmUgZm9yIEdOVSBDIGxvb2tpbmcgZm9yIGdjYyBpbiBvdXRwdXQgb2YgJGNjIC12CistIEFkZCB6bGliLnBjIGdlbmVyYXRpb24gdG8gd2luMzIvTWFrZWZpbGUuZ2NjIFtXZWlnZWx0XQorLSBGaXggYnVnIGluIHpsaWIuaCBmb3IgX0ZJTEVfT0ZGU0VUX0JJVFMgc2V0IGFuZCBfTEFSR0VGSUxFNjRfU09VUkNFIG5vdAorLSBBZGQgY29tbWVudCBpbiB6bGliLmggdGhhdCBhZGxlcjMyX2NvbWJpbmUgd2l0aCBsZW4yIDwgMCBtYWtlcyBubyBzZW5zZQorLSBNYWtlIE5PX0RJVklERSBvcHRpb24gaW4gYWRsZXIzMi5jIG11Y2ggZmFzdGVyICh0aGFua3MgdG8gSm9obiBSZWlzZXIpCistIE1ha2Ugc3Ryb25nZXIgdGVzdCBpbiB6Y29uZi5oIHRvIGluY2x1ZGUgdW5pc3RkLmggZm9yIExGUworLSBBcHBseSBEYXJ3aW4gcGF0Y2hlcyBmb3IgNjQtYml0IGZpbGUgb2Zmc2V0cyB0byBjb250cmliL21pbml6aXAgW1NsYWNrXQorLSBGaXggemxpYi5oIExGUyBzdXBwb3J0IHdoZW4gWl9QUkVGSVggdXNlZAorLSBBZGQgdXBkYXRlZCBhczQwMCBzdXBwb3J0IChyZW1vdmVkIGZyb20gb2xkKSBbTW9ubmVyYXRdCistIEF2b2lkIGRlZmxhdGUgc2Vuc2l0aXZpdHkgdG8gdm9sYXRpbGUgaW5wdXQgZGF0YQorLSBBdm9pZCBkaXZpc2lvbiBpbiBhZGxlcjMyX2NvbWJpbmUgZm9yIE5PX0RJVklERQorLSBDbGFyaWZ5IHRoZSB1c2Ugb2YgWl9GSU5JU0ggd2l0aCBkZWZsYXRlQm91bmQoKSBhbW91bnQgb2Ygc3BhY2UKKy0gU2V0IGJpbmFyeSBmb3Igb3V0cHV0IGZpbGUgaW4gcHVmZi5jCistIFVzZSB1NCB0eXBlIGZvciBjcmNfdGFibGUgdG8gYXZvaWQgY29udmVyc2lvbiB3YXJuaW5ncworLSBBcHBseSBjYXN0cyBpbiB6bGliLmggdG8gYXZvaWQgY29udmVyc2lvbiB3YXJuaW5ncworLSBBZGQgT0YgdG8gcHJvdG90eXBlcyBmb3IgYWRsZXIzMl9jb21iaW5lXyBhbmQgY3JjMzJfY29tYmluZV8gW01pbGxlcl0KKy0gSW1wcm92ZSBpbmZsYXRlU3luYygpIGRvY3VtZW50YXRpb24gdG8gbm90ZSBpbmRldGVybWluYW5jeQorLSBBZGQgZGVmbGF0ZVBlbmRpbmcoKSBmdW5jdGlvbiB0byByZXR1cm4gdGhlIGFtb3VudCBvZiBwZW5kaW5nIG91dHB1dAorLSBDb3JyZWN0IHRoZSBzcGVsbGluZyBvZiAic3BlY2lmaWNhdGlvbiIgaW4gRkFRIFtSYW5kZXJzLVBlaHJzb25dCistIEFkZCBhIGNoZWNrIGluIGNvbmZpZ3VyZSBmb3Igc3RkYXJnLmgsIHVzZSBmb3IgZ3pwcmludGYoKQorLSBDaGVjayB0aGF0IHBvaW50ZXJzIGZpdCBpbiBpbnRzIHdoZW4gZ3pwcmludCgpIGNvbXBpbGVkIG9sZCBzdHlsZQorLSBBZGQgZHVtbXkgbmFtZSBiZWZvcmUgJChTSEFSRURMSUJWKSBpbiBNYWtlZmlsZSBbQmFyLUxldiwgQm93bGVyXQorLSBEZWxldGUgbGluZSBpbiBjb25maWd1cmUgdGhhdCBhZGRzIC1MLiBsaWJ6LmEgdG8gTERGTEFHUyBbV2VpZ2VsdF0KKy0gQWRkIGRlYnVnIHJlY29yZHMgaW4gYXNzbWVibGVyIGNvZGUgW0xvbmRlcl0KKy0gVXBkYXRlIFJGQyByZWZlcmVuY2VzIHRvIHVzZSBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC8uLi4gW0xpXQorLSBBZGQgLS1hcmNocyBvcHRpb24sIHVzZSBvZiBsaWJ0b29sIHRvIGNvbmZpZ3VyZSBmb3IgTWFjIE9TIFggW0JvcnN0ZWxdCisKK0NoYW5nZXMgaW4gMS4yLjUgKDE5IEFwciAyMDEwKQorLSBEaXNhYmxlIHZpc2liaWxpdHkgYXR0cmlidXRlIGluIHdpbjMyL01ha2VmaWxlLmdjYyBbQmFyLUxldl0KKy0gRGVmYXVsdCB0byBsaWJkaXIgYXMgc2hhcmVkbGliZGlyIGluIGNvbmZpZ3VyZSBbTmllZGVyXQorLSBVcGRhdGUgY29weXJpZ2h0IGRhdGVzIG9uIG1vZGlmaWVkIHNvdXJjZSBmaWxlcworLSBVcGRhdGUgdHJlZXMuYyB0byBiZSBhYmxlIHRvIGdlbmVyYXRlIG1vZGlmaWVkIHRyZWVzLmgKKy0gRXhpdCBjb25maWd1cmUgZm9yIE1pbkdXLCBzdWdnZXN0aW5nIHdpbjMyL01ha2VmaWxlLmdjYworLSBDaGVjayBmb3IgTlVMTCBwYXRoIGluIGd6X29wZW4gW0hvbXVybHVdCisKK0NoYW5nZXMgaW4gMS4yLjQuNSAoMTggQXByIDIwMTApCistIFNldCBzaGFyZWRsaWJkaXIgaW4gY29uZmlndXJlIFtUb3Jva10KKy0gU2V0IExERkxBR1MgaW4gTWFrZWZpbGUuaW4gW0Jhci1MZXZdCistIEF2b2lkIG1rZGlyIG9ianMgcmFjZSBjb25kaXRpb24gaW4gTWFrZWZpbGUuaW4gW0Jvd2xlcl0KKy0gQWRkIFpMSUJfSU5URVJOQUwgaW4gZnJvbnQgb2YgaW50ZXJuYWwgaW50ZXItbW9kdWxlIGZ1bmN0aW9ucyBhbmQgYXJyYXlzCistIERlZmluZSBaTElCX0lOVEVSTkFMIHRvIGhpZGUgaW50ZXJuYWwgZnVuY3Rpb25zIGFuZCBhcnJheXMgZm9yIEdOVSBDCistIERvbid0IHVzZSBoaWRkZW4gYXR0cmlidXRlIHdoZW4gaXQgaXMgYSB3YXJuaW5nIGdlbmVyYXRvciAoZS5nLiBTb2xhcmlzKQorCitDaGFuZ2VzIGluIDEuMi40LjQgKDE4IEFwciAyMDEwKQorLSBGaXggQ1JPU1NfUFJFRklYIGV4ZWN1dGFibGUgdGVzdGluZywgQ0hPU1QgZXh0cmFjdCwgbWluZ3cqIFtUb3Jva10KKy0gVW5kZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRSBpbiB6Y29uZi5oIGlmIGl0IGlzIHplcm8sIGJ1dCBub3QgaWYgZW1wdHkKKy0gVHJ5IHRvIHVzZSBiYXNoIG9yIGtzaCByZWdhcmRsZXNzIG9mIGZ1bmN0aW9uYWxpdHkgb2YgL2Jpbi9zaAorLSBGaXggY29uZmlndXJlIGluY29tcGF0aWJpbGl0eSB3aXRoIE5ldEJTRCBzaAorLSBSZW1vdmUgYXR0ZW1wdCB0byBydW4gdW5kZXIgYmFzaCBvciBrc2ggc2luY2UgaGF2ZSBiZXR0ZXIgTmV0QlNEIGZpeAorLSBGaXggd2luMzIvTWFrZWZpbGUuZ2NjIGZvciBNaW5HVyBbQmFyLUxldl0KKy0gQWRkIGRpYWdub3N0aWMgbWVzc2FnZXMgd2hlbiB1c2luZyBDUk9TU19QUkVGSVggaW4gY29uZmlndXJlCistIEFkZGVkIC0tc2hhcmVkbGliZGlyIG9wdGlvbiB0byBjb25maWd1cmUgW1dlaWdlbHRdCistIFVzZSBoaWRkZW4gdmlzaWJpbGl0eSBhdHRyaWJ1dGUgd2hlbiBhdmFpbGFibGUgW0ZyeXNpbmdlcl0KKworQ2hhbmdlcyBpbiAxLjIuNC4zICgxMCBBcHIgMjAxMCkKKy0gT25seSB1c2UgQ1JPU1NfUFJFRklYIGluIGNvbmZpZ3VyZSBmb3IgYXIgYW5kIHJhbmxpYiBpZiB0aGV5IGV4aXN0CistIFVzZSBDUk9TU19QUkVGSVggZm9yIG5tIFtCYXItTGV2XQorLSBBc3N1bWUgX0xBUkdFRklMRTY0X1NPVVJDRSBkZWZpbmVkIGlzIGVxdWl2YWxlbnQgdG8gdHJ1ZQorLSBBdm9pZCB1c2Ugb2YgdW5kZWZpbmVkIHN5bWJvbHMgaW4gI2lmIHdpdGggJiYgYW5kIHx8CistIE1ha2UgKjY0IHByb3RvdHlwZXMgaW4gZ3pndXRzLmggY29uc2lzdGVudCB3aXRoIGZ1bmN0aW9ucworLSBBZGQgLXNoYXJlZCBsb2FkIG9wdGlvbiBmb3IgTWluR1cgaW4gY29uZmlndXJlIFtCb3dsZXJdCistIE1vdmUgel9vZmY2NF90IHRvIHB1YmxpYyBpbnRlcmZhY2UsIHVzZSBpbnN0ZWFkIG9mIG9mZjY0X3QKKy0gUmVtb3ZlICEgZnJvbSBzaGVsbCB0ZXN0IGluIGNvbmZpZ3VyZSAobm90IHBvcnRhYmxlIHRvIFNvbGFyaXMpCistIENoYW5nZSArMCBtYWNybyB0ZXN0cyB0byAtMCBmb3IgcG9zc2libHkgaW5jcmVhc2VkIHBvcnRhYmlsaXR5CisKK0NoYW5nZXMgaW4gMS4yLjQuMiAoOSBBcHIgMjAxMCkKKy0gQWRkIGNvbnNpc3RlbnQgY2FycmlhZ2UgcmV0dXJucyB0byByZWFkbWUudHh0J3MgaW4gbWFzbXg4NiBhbmQgbWFzbXg2NAorLSBSZWFsbHkgcHJvdmlkZSBwcm90b3R5cGVzIGZvciAqNjQgZnVuY3Rpb25zIHdoZW4gYnVpbGRpbmcgd2l0aG91dCBMRlMKKy0gT25seSBkZWZpbmUgdW5saW5rKCkgaW4gbWluaWd6aXAuYyBpZiB1bmlzdGQuaCBub3QgaW5jbHVkZWQKKy0gVXBkYXRlIFJFQURNRSB0byBwb2ludCB0byBjb250cmliL3ZzdHVkaW8gcHJvamVjdCBmaWxlcworLSBNb3ZlIHByb2plY3RzL3ZjNiB0byBvbGQvIGFuZCByZW1vdmUgcHJvamVjdHMvCistIEluY2x1ZGUgc3RkbGliLmggaW4gbWluaWd6aXAuYyBmb3Igc2V0bW9kZSgpIGRlZmluaXRpb24gdW5kZXIgV2luQ0UKKy0gQ2xlYW4gdXAgYXNzZW1ibGVyIGJ1aWxkcyBpbiB3aW4zMi9NYWtlZmlsZS5tc2MgW1Jvd2VdCistIEluY2x1ZGUgc3lzL3R5cGVzLmggZm9yIE1pY3Jvc29mdCBmb3Igb2ZmX3QgZGVmaW5pdGlvbgorLSBGaXggbWVtb3J5IGxlYWsgb24gZXJyb3IgaW4gZ3pfb3BlbigpCistIFN5bWJvbGl6ZSBubSBhcyAkTk0gaW4gY29uZmlndXJlIFtXZWlnZWx0XQorLSBVc2UgVEVTVF9MRFNIQVJFRCBpbnN0ZWFkIG9mIExEU0hBUkVEIHRvIGxpbmsgdGVzdCBwcm9ncmFtcyBbV2VpZ2VsdF0KKy0gQWRkICswIHRvIF9GSUxFX09GRlNFVF9CSVRTIGFuZCBfTEZTNjRfTEFSR0VGSUxFIGluIGNhc2Ugbm90IGRlZmluZWQKKy0gRml4IGJ1ZyBpbiBnemVvZigpIHRvIHRha2UgaW50byBhY2NvdW50IHVudXNlZCBpbnB1dCBkYXRhCistIEF2b2lkIGluaXRpYWxpemF0aW9uIG9mIHN0cnVjdHVyZXMgd2l0aCB2YXJpYWJsZXMgaW4gcHVmZi5jCistIFVwZGF0ZWQgd2luMzIvUkVBRE1FLVdJTjMyLnR4dCBbUm93ZV0KKworQ2hhbmdlcyBpbiAxLjIuNC4xICgyOCBNYXIgMjAxMCkKKy0gUmVtb3ZlIHRoZSB1c2Ugb2YgW2Etel0gY29uc3RydWN0cyBmb3Igc2VkIGluIGNvbmZpZ3VyZSBbZ2VudG9vIDMxMDIyNV0KKy0gUmVtb3ZlICQoU0hBUkVETElCKSBmcm9tIExJQlMgaW4gTWFrZWZpbGUuaW4gW0NyZWVjaF0KKy0gUmVzdG9yZSAiZm9yIGRlYnVnZ2luZyIgY29tbWVudCBvbiBzcHJpbnRmKCkgaW4gZ3psaWIuYworLSBSZW1vdmUgZmRvcGVuIGZvciBNVlMgZnJvbSBnemd1dHMuaAorLSBQdXQgbmV3IFJFQURNRS1XSU4zMi50eHQgaW4gd2luMzIgW1Jvd2VdCistIEFkZCBjaGVjayBmb3Igc2hlbGwgdG8gY29uZmlndXJlIGFuZCBpbnZva2UgYW5vdGhlciBzaGVsbCBpZiBuZWVkZWQKKy0gRml4IGJpZyBmYXQgc3RpbmtpbmcgYnVnIGluIGd6c2VlaygpIG9uIHVuY29tcHJlc3NlZCBmaWxlcworLSBSZW1vdmUgdmVzdGlnaWFsIEZfT1BFTjY0IGRlZmluZSBpbiB6dXRpbC5oCistIFNldCBhbmQgY2hlY2sgdGhlIHZhbHVlIG9mIF9MQVJHRUZJTEVfU09VUkNFIGFuZCBfTEFSR0VGSUxFNjRfU09VUkNFCistIEF2b2lkIGVycm9ycyBvbiBub24tTEZTIHN5c3RlbXMgd2hlbiBhcHBsaWNhdGlvbnMgZGVmaW5lIExGUyBtYWNyb3MKKy0gU2V0IEVYRSB0byAiLmV4ZSIgaW4gY29uZmlndXJlIGZvciBNSU5HVyBbS2FobGVdCistIE1hdGNoIGNyYzMyKCkgaW4gY3JjMzIuYyBleGFjdGx5IHRvIHRoZSBwcm90b3R5cGUgaW4gemxpYi5oIFtTaGVycmlsbF0KKy0gQWRkIHByZWZpeCBmb3IgY3Jvc3MtY29tcGlsYXRpb24gaW4gd2luMzIvbWFrZWZpbGUuZ2NjIFtCYXItTGV2XQorLSBBZGQgRExMIGluc3RhbGwgaW4gd2luMzIvbWFrZWZpbGUuZ2NjIFtCYXItTGV2XQorLSBBbGxvdyBMaW51eCogb3IgbGludXgqIGZyb20gdW5hbWUgaW4gY29uZmlndXJlIFtCYXItTGV2XQorLSBBbGxvdyBsZGNvbmZpZyB0byBiZSByZWRlZmluZWQgaW4gY29uZmlndXJlIGFuZCBNYWtlZmlsZS5pbiBbQmFyLUxldl0KKy0gQWRkIGNyb3NzLWNvbXBpbGF0aW9uIHByZWZpeGVzIHRvIGNvbmZpZ3VyZSBbQmFyLUxldl0KKy0gTWF0Y2ggdHlwZSBleGFjdGx5IGluIGd6X2xvYWQoKSBpbnZvY2F0aW9uIGluIGd6cmVhZC5jCistIE1hdGNoIHR5cGUgZXhhY3RseSBvZiB6Y2FsbG9jKCkgaW4genV0aWwuYyB0byB6bGliLmggYWxsb2NfZnVuYworLSBQcm92aWRlIHByb3RvdHlwZXMgZm9yICo2NCBmdW5jdGlvbnMgd2hlbiBidWlsZGluZyB6bGliIHdpdGhvdXQgTEZTCistIERvbid0IHVzZSAtbGMgd2hlbiBsaW5raW5nIHNoYXJlZCBsaWJyYXJ5IG9uIE1pbkdXCistIFJlbW92ZSBlcnJuby5oIGNoZWNrIGluIGNvbmZpZ3VyZSBhbmQgdmVzdGlnaWFsIGVycm5vIGNvZGUgaW4genV0aWwuaAorCitDaGFuZ2VzIGluIDEuMi40ICgxNCBNYXIgMjAxMCkKKy0gRml4IFZFUjMgZXh0cmFjdGlvbiBpbiBjb25maWd1cmUgZm9yIG5vIGZvdXJ0aCBzdWJ2ZXJzaW9uCistIFVwZGF0ZSB6bGliLjMsIGFkZCBkb2NzIHRvIE1ha2VmaWxlLmluIHRvIG1ha2UgLnBkZiBvdXQgb2YgaXQKKy0gQWRkIHpsaWIuMy5wZGYgdG8gZGlzdHJpYnV0aW9uCistIERvbid0IHNldCBlcnJvciBjb2RlIGluIGd6ZXJyb3IoKSBpZiBwYXNzZWQgcG9pbnRlciBpcyBOVUxMCistIEFwcGx5IGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBmaXhlcyB0byBDTWFrZUxpc3RzLnR4dCBbTG93bWFuXQorLSBNb3ZlICNjbWFrZWRlZmluZSdzIHRvIGEgbmV3IHpjb25mLmluLmNtYWtlaW4KKy0gUmVzdG9yZSB6Y29uZi5oIGZvciBidWlsZHMgdGhhdCBkb24ndCB1c2UgY29uZmlndXJlIG9yIGNtYWtlCistIEFkZCBkaXN0Y2xlYW4gdG8gZHVtbXkgTWFrZWZpbGUgZm9yIGNvbnZlbmllbmNlCistIFVwZGF0ZSBhbmQgaW1wcm92ZSBJTkRFWCwgUkVBRE1FLCBhbmQgRkFRCistIFVwZGF0ZSBDTWFrZUxpc3RzLnR4dCBmb3IgdGhlIHJldHVybiBvZiB6Y29uZi5oIFtMb3dtYW5dCistIFVwZGF0ZSBjb250cmliL3ZzdHVkaW8vdmM5IGFuZCB2YzEwIFtWb2xsYW50XQorLSBDaGFuZ2UgbGliei5kbGwuYSBiYWNrIHRvIGxpYnpkbGwuYSBpbiB3aW4zMi9NYWtlZmlsZS5nY2MKKy0gQXBwbHkgbGljZW5zZSBhbmQgcmVhZG1lIGNoYW5nZXMgdG8gY29udHJpYi9hc202ODYgW1JhaXRlcl0KKy0gQ2hlY2sgZmlsZSBuYW1lIGxlbmd0aHMgYW5kIGFkZCAtYyBvcHRpb24gaW4gbWluaWd6aXAuYyBbTGldCistIFVwZGF0ZSBjb250cmliL2FtZDY0IGFuZCBjb250cmliL21hc214ODYvIFtWb2xsYW50XQorLSBBdm9pZCB1c2Ugb2YgImVvZiIgcGFyYW1ldGVyIGluIHRyZWVzLmMgdG8gbm90IHNoYWRvdyBsaWJyYXJ5IHZhcmlhYmxlCistIFVwZGF0ZSBtYWtlX3Ztcy5jb20gZm9yIHJlbW92YWwgb2YgemxpYmRlZnMuaCBbWmluc2VyXQorLSBVcGRhdGUgYXNzZW1ibGVyIGNvZGUgYW5kIHZzdHVkaW8gcHJvamVjdHMgaW4gY29udHJpYiBbVm9sbGFudF0KKy0gUmVtb3ZlIG91dGRhdGVkIGFzc2VtYmxlciBjb2RlIGNvbnRyaWIvbWFzbTY4NiBhbmQgY29udHJpYi9hc201ODYKKy0gUmVtb3ZlIG9sZCB2YzcgYW5kIHZjOCBmcm9tIGNvbnRyaWIvdnN0dWRpbworLSBVcGRhdGUgd2luMzIvTWFrZWZpbGUubXNjLCBhZGQgWkxJQl9WRVJfU1VCUkVWSVNJT04gW1Jvd2VdCistIEZpeCBtZW1vcnkgbGVha3MgaW4gZ3pjbG9zZV9yKCkgYW5kIGd6Y2xvc2VfdygpLCBmaWxlIGxlYWsgaW4gZ3pfb3BlbigpCistIEFkZCBjb250cmliL2djY19ndm1hdDY0IGZvciBsb25nZXN0X21hdGNoIGFuZCBpbmZsYXRlX2Zhc3QgW1ZvbGxhbnRdCistIFJlbW92ZSAqNjQgZnVuY3Rpb25zIGZyb20gd2luMzIvemxpYi5kZWYgKHRoZXkncmUgbm90IDY0LWJpdCB5ZXQpCistIEZpeCBidWcgaW4gdm9pZC1yZXR1cm5pbmcgdnNwcmludGYoKSBjYXNlIGluIGd6d3JpdGUuYworLSBGaXggbmFtZSBjaGFuZ2UgZnJvbSBpbmZsYXRlLmggaW4gY29udHJpYi9pbmZsYXRlODYvaW5mZmFzODYuYworLSBDaGVjayBpZiB0ZW1wb3JhcnkgZmlsZSBleGlzdHMgYmVmb3JlIHJlbW92aW5nIGluIG1ha2Vfdm1zLmNvbSBbWmluc2VyXQorLSBGaXggbWFrZSBpbnN0YWxsIGFuZCB1bmluc3RhbGwgZm9yIC0tc3RhdGljIG9wdGlvbgorLSBGaXggdXNhZ2Ugb2YgX01TQ19WRVIgaW4gZ3pndXRzLmggYW5kIHp1dGlsLmggW1RydXRhXQorLSBVcGRhdGUgcmVhZG1lLnR4dCBpbiBjb250cmliL21hc214NjQgYW5kIG1hc214ODYgdG8gYXNzZW1ibGUKKworQ2hhbmdlcyBpbiAxLjIuMy45ICgyMSBGZWIgMjAxMCkKKy0gRXhwdW5nZSBnemlvLmMKKy0gTW92ZSBhczQwMCBidWlsZCBpbmZvcm1hdGlvbiB0byBvbGQKKy0gRml4IHVwZGF0ZXMgaW4gY29udHJpYi9taW5pemlwIGFuZCBjb250cmliL3ZzdHVkaW8KKy0gQWRkIGNvbnN0IHRvIHZzbnByaW50ZiB0ZXN0IGluIGNvbmZpZ3VyZSB0byBhdm9pZCB3YXJuaW5ncyBbV2VpZ2VsdF0KKy0gRGVsZXRlIHpjb25mLmggKG1hZGUgYnkgY29uZmlndXJlKSBbV2VpZ2VsdF0KKy0gQ2hhbmdlIHpjb25mLmluLmggdG8gemNvbmYuaC5pbiBwZXIgY29udmVudGlvbiBbV2VpZ2VsdF0KKy0gQ2hlY2sgZm9yIE5VTEwgYnVmIGluIGd6Z2V0cygpCistIFJldHVybiBlbXB0eSBzdHJpbmcgZm9yIGd6Z2V0cygpIHdpdGggbGVuID09IDEgKGxpa2UgZmdldHMoKSkKKy0gRml4IGRlc2NyaXB0aW9uIG9mIGd6Z2V0cygpIGluIHpsaWIuaCBmb3IgZW5kLW9mLWZpbGUsIE5VTEwgcmV0dXJuCistIFVwZGF0ZSBtaW5pemlwIHRvIDEuMSBbVm9sbGFudF0KKy0gQXZvaWQgTVNWQyBsb3NzIG9mIGRhdGEgd2FybmluZ3MgaW4gZ3pyZWFkLmMsIGd6d3JpdGUuYworLSBOb3RlIGluIHpsaWIuaCB0aGF0IGd6ZXJyb3IoKSBzaG91bGQgYmUgdXNlZCB0byBkaXN0aW5ndWlzaCBmcm9tIEVPRgorLSBSZW1vdmUgdXNlIG9mIHNucHJpbnRmKCkgZnJvbSBnemxpYi5jCistIEZpeCBidWcgaW4gZ3pzZWVrKCkKKy0gVXBkYXRlIGNvbnRyaWIvdnN0dWRpbywgYWRkaW5nIHZjOSBhbmQgdmMxMCBbS3VubywgVm9sbGFudF0KKy0gRml4IHpjb25mLmggZ2VuZXJhdGlvbiBpbiBDTWFrZUxpc3RzLnR4dCBbTG93bWFuXQorLSBJbXByb3ZlIGNvbW1lbnRzIGluIHpjb25mLmggd2hlcmUgbW9kaWZpZWQgYnkgY29uZmlndXJlCisKK0NoYW5nZXMgaW4gMS4yLjMuOCAoMTMgRmViIDIwMTApCistIENsZWFuIHVwIHRleHQgZmlsZXMgKHRhYnMsIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGV0Yy4pIFtPYmVyaHVtZXJdCistIFVzZSB6X29mZjY0X3QgaW4gZ3pfemVybygpIGFuZCBnel9za2lwKCkgdG8gbWF0Y2ggc3RhdGUtPnNraXAKKy0gQXZvaWQgY29tcGFyaXNvbiBwcm9ibGVtIHdoZW4gc2l6ZW9mKGludCkgPT0gc2l6ZW9mKHpfb2ZmNjRfdCkKKy0gUmV2ZXJ0IHRvIE1ha2VmaWxlLmluIGZyb20gMS4yLjMuNiAobGl2ZSB3aXRoIHRoZSBjbHV0dGVyKQorLSBGaXggbWlzc2luZyBlcnJvciByZXR1cm4gaW4gZ3pmbHVzaCgpLCBhZGQgemxpYi5oIG5vdGUKKy0gQWRkICo2NCBmdW5jdGlvbnMgdG8gemxpYi5tYXAgW0xldmluXQorLSBGaXggc2lnbmVkL3Vuc2lnbmVkIGNvbXBhcmlzb24gaW4gZ3pfY29tcCgpCistIFVzZSBTRkxBR1Mgd2hlbiB0ZXN0aW5nIHNoYXJlZCBsaW5raW5nIGluIGNvbmZpZ3VyZQorLSBBZGQgLS02NCBvcHRpb24gdG8gLi9jb25maWd1cmUgdG8gdXNlIC1tNjQgd2l0aCBnY2MKKy0gRml4IC4vY29uZmlndXJlIC0taGVscCB0byBjb3JyZWN0bHkgbmFtZSBvcHRpb25zCistIEhhdmUgbWFrZSBmYWlsIGlmIGEgdGVzdCBmYWlscyBbTGV2aW5dCistIEF2b2lkIGJ1ZmZlciBvdmVycnVuIGluIGNvbnRyaWIvbWFzbXg2NC9ndm1hdDY0LmFzbSBbU2ltcHNvbl0KKy0gUmVtb3ZlIGFzc2VtYmxlciBvYmplY3QgZmlsZXMgZnJvbSBjb250cmliCisKK0NoYW5nZXMgaW4gMS4yLjMuNyAoMjQgSmFuIDIwMTApCistIEFsd2F5cyBnem9wZW4oKSB3aXRoIE9fTEFSR0VGSUxFIGlmIGF2YWlsYWJsZQorLSBGaXggZ3pkaXJlY3QoKSB0byB3b3JrIGltbWVkaWF0ZWx5IGFmdGVyIGd6b3BlbigpIG9yIGd6ZG9wZW4oKQorLSBNYWtlIGd6ZGlyZWN0KCkgbW9yZSBwcmVjaXNlIHdoZW4gdGhlIHN0YXRlIGNoYW5nZXMgd2hpbGUgcmVhZGluZworLSBJbXByb3ZlIHpsaWIuaCBkb2N1bWVudGF0aW9uIGluIG1hbnkgcGxhY2VzCistIENhdGNoIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgaW4gZ3pfb3BlbigpCistIENvbXBsZXRlIGNsb3NlIG9wZXJhdGlvbiBpZiBzZWVrIGZvcndhcmQgaW4gZ3pjbG9zZV93KCkgZmFpbHMKKy0gUmV0dXJuIFpfRVJSTk8gZnJvbSBnemNsb3NlX3IoKSBpZiBjbG9zZSgpIGZhaWxzCistIFJldHVybiBaX1NUUkVBTV9FUlJPUiBpbnN0ZWFkIG9mIEVPRiBmb3IgZ3pjbG9zZSgpIGJlaW5nIHBhc3NlZCBOVUxMCistIFJldHVybiB6ZXJvIGZvciBnendyaXRlKCkgZXJyb3JzIHRvIG1hdGNoIHpsaWIuaCBkZXNjcmlwdGlvbgorLSBSZXR1cm4gLTEgb24gZ3pwdXRzKCkgZXJyb3IgdG8gbWF0Y2ggemxpYi5oIGRlc2NyaXB0aW9uCistIEFkZCB6Y29uZi5pbi5oIHRvIGFsbG93IHJlY292ZXJ5IGZyb20gY29uZmlndXJlIG1vZGlmaWNhdGlvbiBbV2VpZ2VsdF0KKy0gRml4IHN0YXRpYyBsaWJyYXJ5IHBlcm1pc3Npb25zIGluIE1ha2VmaWxlLmluIFtXZWlnZWx0XQorLSBBdm9pZCB3YXJuaW5ncyBpbiBjb25maWd1cmUgdGVzdHMgdGhhdCBoaWRlIGZ1bmN0aW9uYWxpdHkgW1dlaWdlbHRdCistIEFkZCAqQlNEIGFuZCBEcmFnb25GbHkgdG8gTGludXggY2FzZSBpbiBjb25maWd1cmUgW2dlbnRvbyAxMjM1NzFdCistIENoYW5nZSBsaWJ6ZGxsLmEgdG8gbGliei5kbGwuYSBpbiB3aW4zMi9NYWtlZmlsZS5nY2MgW2dlbnRvbyAyODgyMTJdCistIEF2b2lkIGFjY2VzcyBvZiB1bmluaXRpYWxpemVkIGRhdGEgZm9yIGZpcnN0IGluZmxhdGVSZXNldDIgY2FsbCBbR29tZXNdCistIEtlZXAgb2JqZWN0IGZpbGVzIGluIHN1YmRpcmVjdG9yaWVzIHRvIHJlZHVjZSB0aGUgY2x1dHRlciBzb21ld2hhdAorLSBSZW1vdmUgZGVmYXVsdCBNYWtlZmlsZSBhbmQgemxpYmRlZnMuaCwgYWRkIGR1bW15IE1ha2VmaWxlCistIEFkZCBuZXcgZXh0ZXJuYWwgZnVuY3Rpb25zIHRvIFpfUFJFRklYLCByZW1vdmUgZHVwbGljYXRlcywgel96XyAtPiB6XworLSBSZW1vdmUgemxpYmRlZnMuaCBjb21wbGV0ZWx5IC0tIG1vZGlmeSB6Y29uZi5oIGluc3RlYWQKKworQ2hhbmdlcyBpbiAxLjIuMy42ICgxNyBKYW4gMjAxMCkKKy0gQXZvaWQgdm9pZCAqIGFyaXRobWV0aWMgaW4gZ3pyZWFkLmMgYW5kIGd6d3JpdGUuYworLSBNYWtlIGNvbXBpbGVycyBoYXBwaWVyIHdpdGggY29uc3QgY2hhciAqIGZvciBnel9lcnJvciBtZXNzYWdlCistIEF2b2lkIHVudXNlZCBwYXJhbWV0ZXIgd2FybmluZyBpbiBpbmZsYXRlLmMKKy0gQXZvaWQgc2lnbmVkLXVuc2lnbmVkIGNvbXBhcmlzb24gd2FybmluZyBpbiBpbmZsYXRlLmMKKy0gSW5kZW50ICNwcmFnbWEncyBmb3IgdHJhZGl0aW9uYWwgQworLSBGaXggdXNhZ2Ugb2Ygc3Ryd2luZXJyb3IoKSBpbiBnbGliLmMsIGNoYW5nZSB0byBnel9zdHJ3aW5lcnJvcigpCistIENvcnJlY3QgZW1haWwgYWRkcmVzcyBpbiBjb25maWd1cmUgZm9yIHN5c3RlbSBvcHRpb25zCistIFVwZGF0ZSBtYWtlX3Ztcy5jb20gYW5kIGFkZCBtYWtlX3Ztcy5jb20gdG8gY29udHJpYi9taW5pemlwIFtaaW5zZXJdCistIFVwZGF0ZSB6bGliLm1hcCBbQnJvd25dCistIEZpeCBNYWtlZmlsZS5pbiBmb3IgU29sYXJpcyAxMCBtYWtlIG9mIGV4YW1wbGU2NCBhbmQgbWluaXppcDY0IFtUb3Jva10KKy0gQXBwbHkgdmFyaW91cyBmaXhlcyB0byBDTWFrZUxpc3RzLnR4dCBbTG93bWFuXQorLSBBZGQgY2hlY2tzIG9uIGxlbiBpbiBnenJlYWQoKSBhbmQgZ3p3cml0ZSgpCistIEFkZCBlcnJvciBtZXNzYWdlIGZvciBubyBtb3JlIHJvb20gZm9yIGd6dW5nZXRjKCkKKy0gUmVtb3ZlIHpsaWIgdmVyc2lvbiBjaGVjayBpbiBnendyaXRlKCkKKy0gRGVmZXIgY29tcHJlc3Npb24gb2YgZ3pwcmludGYoKSByZXN1bHQgdW50aWwgbmVlZCB0bworLSBVc2Ugc25wcmludGYoKSBpbiBnemRvcGVuKCkgaWYgYXZhaWxhYmxlCistIFJlbW92ZSBVU0VfTU1BUCBjb25maWd1cmF0aW9uIGRldGVybWluYXRpb24gKG9ubHkgdXNlZCBieSBtaW5pZ3ppcCkKKy0gUmVtb3ZlIGV4YW1wbGVzL3BpZ3ouYyAoYXZhaWxhYmxlIHNlcGFyYXRlbHkpCistIFVwZGF0ZSBleGFtcGxlcy9ndW4uYyB0byAxLjYKKworQ2hhbmdlcyBpbiAxLjIuMy41ICg4IEphbiAyMDEwKQorLSBBZGQgc3BhY2UgYWZ0ZXIgI2lmIGluIHp1dGlsLmggZm9yIHNvbWUgY29tcGlsZXJzCistIEZpeCByZWxhdGl2ZWx5IGhhcm1sZXNzIGJ1ZyBpbiBkZWZsYXRlX2Zhc3QoKSBbRXhhcmV2c2t5XQorLSBGaXggc2FtZSBwcm9ibGVtIGluIGRlZmxhdGVfc2xvdygpCistIEFkZCAkKFNIQVJFRExJQlYpIHRvIExJQlMgaW4gTWFrZWZpbGUuaW4gW0Jyb3duXQorLSBBZGQgZGVmbGF0ZV9ybGUoKSBmb3IgZmFzdGVyIFpfUkxFIHN0cmF0ZWd5IHJ1bi1sZW5ndGggZW5jb2RpbmcKKy0gQWRkIGRlZmxhdGVfaHVmZigpIGZvciBmYXN0ZXIgWl9IVUZGTUFOX09OTFkgZW5jb2RpbmcKKy0gQ2hhbmdlIG5hbWUgb2YgIndyaXRlIiB2YXJpYWJsZSBpbiBpbmZmYXN0LmMgdG8gYXZvaWQgbGlicmFyeSBjb2xsaXNpb25zCistIEZpeCBwcmVtYXR1cmUgRU9GIGZyb20gZ3pyZWFkKCkgaW4gZ3ppby5jIFtCcm93bl0KKy0gVXNlIHpsaWIgaGVhZGVyIHdpbmRvdyBzaXplIGlmIHdpbmRvd0JpdHMgaXMgMCBpbiBpbmZsYXRlSW5pdDIoKQorLSBSZW1vdmUgY29tcHJlc3NCb3VuZCgpIGNhbGwgaW4gZGVmbGF0ZS5jIHRvIGF2b2lkIGxpbmtpbmcgY29tcHJlc3MubworLSBSZXBsYWNlIHVzZSBvZiBlcnJubyBpbiBneiogd2l0aCBmdW5jdGlvbnMsIHN1cHBvcnQgV2luQ0UgW0FsdmVzXQorLSBQcm92aWRlIGFsdGVybmF0aXZlIHRvIHBlcnJvcigpIGluIG1pbmlnemlwLmMgZm9yIFdpbkNFIFtBbHZlc10KKy0gRG9uJ3QgdXNlIF92c25wcmludGYgb24gbGF0ZXIgdmVyc2lvbnMgb2YgTVNWQyBbTG93bWFuXQorLSBBZGQgQ01ha2UgYnVpbGQgc2NyaXB0IGFuZCBpbnB1dCBmaWxlIFtMb3dtYW5dCistIFVwZGF0ZSBjb250cmliL21pbml6aXAgdG8gMS4xIFtTdmVuc3NvbiwgVm9sbGFudF0KKy0gTW92ZWQgbmludGVuZG9kcyBkaXJlY3RvcnkgZnJvbSBjb250cmliIHRvIC4KKy0gUmVwbGFjZSBnemlvLmMgd2l0aCBhIG5ldyBzZXQgb2Ygcm91dGluZXMgd2l0aCB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5CistIEFkZCBnemJ1ZmZlcigpLCBnem9mZnNldCgpLCBnemNsb3NlX3IoKSwgZ3pjbG9zZV93KCkgYXMgcGFydCBvZiBhYm92ZQorLSBVcGRhdGUgY29udHJpYi9taW5pemlwIHRvIDEuMWIKKy0gQ2hhbmdlIGd6ZW9mKCkgdG8gcmV0dXJuIDAgb24gZXJyb3IgaW5zdGVhZCBvZiAtMSB0byBhZ3JlZSB3aXRoIHpsaWIuaAorCitDaGFuZ2VzIGluIDEuMi4zLjQgKDIxIERlYyAyMDA5KQorLSBVc2Ugb2xkIHNjaG9vbCAuU1VGRklYRVMgaW4gTWFrZWZpbGUuaW4gZm9yIEZyZWVCU0QgY29tcGF0aWJpbGl0eQorLSBVcGRhdGUgY29tbWVudHMgaW4gY29uZmlndXJlIGFuZCBNYWtlZmlsZS5pbiBmb3IgZGVmYXVsdCAtLXNoYXJlZAorLSBGaXggdGVzdCAteidzIGluIGNvbmZpZ3VyZSBbTWFycXVlc3NdCistIEJ1aWxkIGV4YW1wbGVzaCBhbmQgbWluaWd6aXBzaCB3aGVuIG5vdCB0ZXN0aW5nCistIENoYW5nZSBOVUxMJ3MgdG8gWl9OVUxMJ3MgaW4gZGVmbGF0ZS5jIGFuZCBpbiBjb21tZW50cyBpbiB6bGliLmgKKy0gSW1wb3J0IExERkxBR1MgZnJvbSB0aGUgZW52aXJvbm1lbnQgaW4gY29uZmlndXJlCistIEZpeCBjb25maWd1cmUgdG8gcG9wdWxhdGUgU0ZMQUdTIHdpdGggZGlzY292ZXJlZCBDRkxBR1Mgb3B0aW9ucworLSBBZGFwdCBtYWtlX3Ztcy5jb20gdG8gdGhlIG5ldyBNYWtlZmlsZS5pbiBbWmluc2VyXQorLSBBZGQgemxpYjJhbnNpIHNjcmlwdCBmb3IgQysrIGNvbXBpbGF0aW9uIFtNYXJxdWVzc10KKy0gQWRkIF9GSUxFX09GRlNFVF9CSVRTPTY0IHRlc3QgdG8gbWFrZSB0ZXN0ICh3aGVuIGFwcGxpY2FibGUpCistIEFkZCBBTUQ2NCBhc3NlbWJsZXIgY29kZSBmb3IgbG9uZ2VzdCBtYXRjaCB0byBjb250cmliIFtUZXRlcmluXQorLSBJbmNsdWRlIG9wdGlvbnMgZnJvbSAkU0ZMQUdTIHdoZW4gZG9pbmcgJExEU0hBUkVECistIFNpbXBsaWZ5IDY0LWJpdCBmaWxlIHN1cHBvcnQgYnkgaW50cm9kdWNpbmcgel9vZmY2NF90IHR5cGUKKy0gTWFrZSBzaGFyZWQgb2JqZWN0IGZpbGVzIGluIG9ianMgZGlyZWN0b3J5IHRvIHdvcmsgYXJvdW5kIG9sZCBTdW4gY2MKKy0gVXNlIG9ubHkgdGhyZWUtcGFydCB2ZXJzaW9uIG51bWJlciBmb3IgRGFyd2luIHNoYXJlZCBjb21waWxlcworLSBBZGQgcmMgb3B0aW9uIHRvIGFyIGluIE1ha2VmaWxlLmluIGZvciB3aGVuIC4vY29uZmlndXJlIG5vdCBydW4KKy0gQWRkIC1XSSwtcnBhdGgsLiB0byBMREZMQUdTIGZvciBPU0YgMSBWNCoKKy0gU2V0IExEX0xJQlJBUllOMzJfUEFUSCBmb3IgU0dJIElSSVggc2hhcmVkIGNvbXBpbGUKKy0gUHJvdGVjdCBhZ2FpbnN0IF9GSUxFX09GRlNFVF9CSVRTIGJlaW5nIGRlZmluZWQgd2hlbiBjb21waWxpbmcgemxpYgorLSBSZW5hbWUgTWFrZWZpbGUuaW4gdGFyZ2V0cyBhbGxzdGF0aWMgdG8gc3RhdGljIGFuZCBhbGxzaGFyZWQgdG8gc2hhcmVkCistIEZpeCBzdGF0aWMgYW5kIHNoYXJlZCBNYWtlZmlsZS5pbiB0YXJnZXRzIHRvIGJlIGluZGVwZW5kZW50CistIENvcnJlY3QgZXJyb3IgcmV0dXJuIGJ1ZyBpbiBnel9vcGVuKCkgYnkgc2V0dGluZyBzdGF0ZSBbQnJvd25dCistIFB1dCBzcGFjZXMgYmVmb3JlIDs7J3MgaW4gY29uZmlndXJlIGZvciBiZXR0ZXIgc2ggY29tcGF0aWJpbGl0eQorLSBBZGQgcGlnei5jIChwYXJhbGxlbCBpbXBsZW1lbnRhdGlvbiBvZiBnemlwKSB0byBleGFtcGxlcy8KKy0gQ29ycmVjdCBjb25zdGFudCBpbiBjcmMzMi5jIHRvIFVMIFtMZXZlbnRoYWxdCistIFJlamVjdCBuZWdhdGl2ZSBsZW5ndGhzIGluIGNyYzMyX2NvbWJpbmUoKQorLSBBZGQgaW5mbGF0ZVJlc2V0MigpIGZ1bmN0aW9uIHRvIHdvcmsgbGlrZSBpbmZsYXRlRW5kKCkvaW5mbGF0ZUluaXQyKCkKKy0gSW5jbHVkZSBzeXMvdHlwZXMuaCBmb3IgX0xBUkdFRklMRTY0X1NPVVJDRSBbQnJvd25dCistIENvcnJlY3QgdHlwbyBpbiBkb2MvYWxnb3JpdGhtLnR4dCBbSmFuaWtdCistIEZpeCBidWcgaW4gYWRsZXIzMl9jb21iaW5lKCkgW1podV0KKy0gQ2F0Y2ggbWlzc2luZy1lbmQtb2YtYmxvY2stY29kZSBlcnJvciBpbiBhbGwgaW5mbGF0ZXMgYW5kIGluIHB1ZmYKKyAgICBBc3N1cmVzIHRoYXQgcmFuZG9tIGlucHV0IHRvIGluZmxhdGUgZXZlbnR1YWxseSByZXN1bHRzIGluIGFuIGVycm9yCistIEFkZGVkIGVub3VnaC5jIChjYWxjdWxhdGlvbiBvZiBFTk9VR0ggZm9yIGluZnRyZWVzLmgpIHRvIGV4YW1wbGVzLworLSBVcGRhdGUgRU5PVUdIIGFuZCBpdHMgdXNhZ2UgdG8gcmVmbGVjdCBkaXNjb3ZlcmVkIGJvdW5kcworLSBGaXggZ3plcnJvcigpIGVycm9yIHJlcG9ydCBvbiBlbXB0eSBpbnB1dCBmaWxlIFtCcm93bl0KKy0gQWRkIHVzaCBjYXN0cyBpbiB0cmVlcy5jIHRvIGF2b2lkIHBlZGFudGljIHJ1bnRpbWUgZXJyb3JzCistIEZpeCB0eXBvIGluIHpsaWIuaCB1bmNvbXByZXNzKCkgZGVzY3JpcHRpb24gW1JlaXNzXQorLSBDb3JyZWN0IGluZmxhdGUoKSBjb21tZW50cyB3aXRoIHJlZ2FyZCB0byBhdXRvbWF0aWMgaGVhZGVyIGRldGVjdGlvbgorLSBSZW1vdmUgZGVwcmVjYXRpb24gY29tbWVudCBvbiBaX1BBUlRJQUxfRkxVU0ggKGl0IHN0YXlzKQorLSBQdXQgbmV3IHZlcnNpb24gb2YgZ3psb2cgKDIuMCkgaW4gZXhhbXBsZXMgd2l0aCBpbnRlcnJ1cHRpb24gcmVjb3ZlcnkKKy0gQWRkIHB1ZmYgY29tcGlsZSBvcHRpb24gdG8gcGVybWl0IGludmFsaWQgZGlzdGFuY2UtdG9vLWZhciBzdHJlYW1zCistIEFkZCBwdWZmIFRFU1QgY29tbWFuZCBvcHRpb25zLCBhYmlsaXR5IHRvIHJlYWQgcGlwZWQgaW5wdXQKKy0gUHJvdG90eXBlIHRoZSAqNjQgZnVuY3Rpb25zIGluIHpsaWIuaCB3aGVuIF9GSUxFX09GRlNFVF9CSVRTID09IDY0LCBidXQKKyAgX0xBUkdFRklMRTY0X1NPVVJDRSBub3QgZGVmaW5lZAorLSBGaXggWl9GVUxMX0ZMVVNIIHRvIHRydWx5IGVyYXNlIHRoZSBwYXN0IGJ5IHJlc2V0dGluZyBzLT5zdHJzdGFydAorLSBGaXggZGVmbGF0ZVNldERpY3Rpb25hcnkoKSB0byB1c2UgYWxsIDMySyBmb3Igb3V0cHV0IGNvbnNpc3RlbmN5CistIFJlbW92ZSBleHRyYW5lb3VzICNkZWZpbmUgTUlOX0xPT0tBSEVBRCBpbiBkZWZsYXRlLmMgKGluIGRlZmxhdGUuaCkKKy0gQ2xlYXIgYnl0ZXMgYWZ0ZXIgZGVmbGF0ZSBsb29rYWhlYWQgdG8gYXZvaWQgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YQorLSBDaGFuZ2UgYSBsaW1pdCBpbiBpbmZ0cmVlcy5jIHRvIGJlIG1vcmUgdHJhbnNwYXJlbnQgdG8gQ292ZXJpdHkgUHJldmVudAorLSBVcGRhdGUgd2luMzIvemxpYi5kZWYgd2l0aCBleHBvcnRlZCBzeW1ib2xzIGZyb20gemxpYi5oCistIENvcnJlY3Qgc3BlbGxpbmcgZXJyb3JzIGluIHpsaWIuaCBbV2lsbGVtLCBTb2JyYWRvXQorLSBBbGxvdyBaX0JMT0NLIGZvciBkZWZsYXRlKCkgdG8gZm9yY2UgYSBuZXcgYmxvY2sKKy0gQWxsb3cgbmVnYXRpdmUgYml0cyBpbiBpbmZsYXRlUHJpbWUoKSB0byBkZWxldGUgZXhpc3RpbmcgYml0IGJ1ZmZlcgorLSBBZGQgWl9UUkVFUyBmbHVzaCBvcHRpb24gdG8gaW5mbGF0ZSgpIHRvIHJldHVybiBhdCBlbmQgb2YgdHJlZXMKKy0gQWRkIGluZmxhdGVNYXJrKCkgdG8gcmV0dXJuIGN1cnJlbnQgc3RhdGUgaW5mb3JtYXRpb24gZm9yIHJhbmRvbSBhY2Nlc3MKKy0gQWRkIE1ha2VmaWxlIGZvciBOaW50ZW5kb0RTIHRvIGNvbnRyaWIgW0Nvc3RhXQorLSBBZGQgLXcgaW4gY29uZmlndXJlIGNvbXBpbGUgdGVzdHMgdG8gYXZvaWQgc3B1cmlvdXMgd2FybmluZ3MgW0JldWNsZXJdCistIEZpeCB0eXBvcyBpbiB6bGliLmggY29tbWVudHMgZm9yIGRlZmxhdGVTZXREaWN0aW9uYXJ5KCkKKy0gRml4IEVPRiBkZXRlY3Rpb24gaW4gdHJhbnNwYXJlbnQgZ3pyZWFkKCkgW01haWVyXQorCitDaGFuZ2VzIGluIDEuMi4zLjMgKDIgT2N0b2JlciAyMDA2KQorLSBNYWtlIC0tc2hhcmVkIHRoZSBkZWZhdWx0IGZvciBjb25maWd1cmUsIGFkZCBhIC0tc3RhdGljIG9wdGlvbgorLSBBZGQgY29tcGlsZSBvcHRpb24gdG8gcGVybWl0IGludmFsaWQgZGlzdGFuY2UtdG9vLWZhciBzdHJlYW1zCistIEFkZCBpbmZsYXRlVW5kZXJtaW5lKCkgZnVuY3Rpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gZW5hYmxlIGFib3ZlCistIFJlbW92ZSB1c2Ugb2YgInRoaXMiIHZhcmlhYmxlIG5hbWUgZm9yIEMrKyBjb21wYXRpYmlsaXR5IFtNYXJxdWVzc10KKy0gQWRkIHRlc3Rpbmcgb2Ygc2hhcmVkIGxpYnJhcnkgaW4gbWFrZSB0ZXN0LCBpZiBzaGFyZWQgbGlicmFyeSBidWlsdAorLSBVc2UgZnRlbGxvKCkgYW5kIGZzZWVrbygpIGlmIGF2YWlsYWJsZSBpbnN0ZWFkIG9mIGZ0ZWxsKCkgYW5kIGZzZWVrKCkKKy0gUHJvdmlkZSB0d28gdmVyc2lvbnMgb2YgYWxsIGZ1bmN0aW9ucyB0aGF0IHVzZSB0aGUgel9vZmZfdCB0eXBlIGZvcgorICBiaW5hcnkgY29tcGF0aWJpbGl0eSAtLSBhIG5vcm1hbCB2ZXJzaW9uIGFuZCBhIDY0LWJpdCBvZmZzZXQgdmVyc2lvbiwKKyAgcGVyIHRoZSBMYXJnZSBGaWxlIFN1cHBvcnQgRXh0ZW5zaW9uIHdoZW4gX0xBUkdFRklMRTY0X1NPVVJDRSBpcworICBkZWZpbmVkOyB1c2UgdGhlIDY0LWJpdCB2ZXJzaW9ucyBieSBkZWZhdWx0IHdoZW4gX0ZJTEVfT0ZGU0VUX0JJVFMKKyAgaXMgZGVmaW5lZCB0byBiZSA2NAorLSBBZGQgYSAtLXVuYW1lPSBvcHRpb24gdG8gY29uZmlndXJlIHRvIHBlcmhhcHMgaGVscCB3aXRoIGNyb3NzLWNvbXBpbGluZworCitDaGFuZ2VzIGluIDEuMi4zLjIgKDMgU2VwdGVtYmVyIDIwMDYpCistIFR1cm4gb2ZmIHNpbGx5IEJvcmxhbmQgd2FybmluZ3MgW0hheV0KKy0gVXNlIG9mZjY0X3QgYW5kIGRlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIHdoZW4gcHJlc2VudAorLSBGaXggbWlzc2luZyBkZXBlbmRlbmN5IG9uIGluZmZpeGVkLmggaW4gTWFrZWZpbGUuaW4KKy0gUmlnIGNvbmZpZ3VyZSAtLXNoYXJlZCB0byBidWlsZCBib3RoIHNoYXJlZCBhbmQgc3RhdGljIFtUZXJlZGVzYWksIFRydXRhXQorLSBSZW1vdmUgemNvbmYuaW4uaCBhbmQgaW5zdGVhZCBjcmVhdGUgYSBuZXcgemxpYmRlZnMuaCBmaWxlCistIEZpeCBjb250cmliL21pbml6aXAvdW56aXAuYyBub24tZW5jcnlwdGVkIGFmdGVyIGVuY3J5cHRlZCBbVm9sbGFudF0KKy0gQWRkIHRyZWVidWlsZC54bWwgKHNlZSBodHRwOi8vdHJlZWJ1aWxkLm1ldHV4LmRlLykgW1dlaWdlbHRdCisKK0NoYW5nZXMgaW4gMS4yLjMuMSAoMTYgQXVndXN0IDIwMDYpCistIEFkZCB3YXRjb20gZGlyZWN0b3J5IHdpdGggT3BlbldhdGNvbSBtYWtlIGZpbGVzIFtEYW5pZWxdCistIFJlbW92ZSAjdW5kZWYgb2YgRkFSIGluIHpjb25mLmluLmggZm9yIE1WUyBbRmVkdGtlXQorLSBVcGRhdGUgbWFrZV92bXMuY29tIFtaaW5zZXJdCistIFVzZSAtZlBJQyBmb3Igc2hhcmVkIGJ1aWxkIGluIGNvbmZpZ3VyZSBbVGVyZWRlc2FpLCBOaWNob2xzb25dCistIFVzZSBvbmx5IG1ham9yIHZlcnNpb24gbnVtYmVyIGZvciBsaWJ6LnNvIG9uIElSSVggYW5kIE9TRjEgW1JlaW5ob2xkdHNlbl0KKy0gVXNlIGZkb3BlbigpIChub3QgX2Zkb3BlbigpKSBmb3IgSW50ZXJpeCBpbiB6dXRpbC5oIFtCimNrXQorLSBBZGQgc29tZSBGQVEgZW50cmllcyBhYm91dCB0aGUgY29udHJpYiBkaXJlY3RvcnkKKy0gVXBkYXRlIHRoZSBNVlMgcXVlc3Rpb24gaW4gdGhlIEZBUQorLSBBdm9pZCBleHRyYW5lb3VzIHJlYWRzIGFmdGVyIEVPRiBpbiBnemlvLmMgW0Jyb3duXQorLSBDb3JyZWN0IHNwZWxsaW5nIG9mICJzdWNjZXNzZnVsbHkiIGluIGd6aW8uYyBbUmFuZGVycy1QZWhyc29uXQorLSBBZGQgY29tbWVudHMgdG8gemxpYi5oIGFib3V0IGd6ZXJyb3IoKSB1c2FnZSBbQnJvd25dCistIFNldCBleHRyYSBmbGFncyBpbiBnemlwIGhlYWRlciBpbiBnem9wZW4oKSBsaWtlIGRlZmxhdGUoKSBkb2VzCistIE1ha2UgY29uZmlndXJlIG9wdGlvbnMgbW9yZSBjb21wYXRpYmxlIHdpdGggZG91YmxlLWRhc2ggY29udmVudGlvbnMKKyAgW1dlaWdlbHRdCistIENsZWFuIHVwIGNvbXBpbGF0aW9uIHVuZGVyIFNvbGFyaXMgU3VuU3R1ZGlvIGNjIFtSb3dlLCBSZWluaG9sZHRzZW5dCistIEZpeCB1bmluc3RhbGwgdGFyZ2V0IGluIE1ha2VmaWxlLmluIFtUcnV0YV0KKy0gQWRkIHBrZ2NvbmZpZyBzdXBwb3J0IFtXZWlnZWx0XQorLSBVc2UgJChERVNURElSKSBtYWNybyBpbiBNYWtlZmlsZS5pbiBbUmVpbmhvbGR0c2VuLCBXZWlnZWx0XQorLSBSZXBsYWNlIHNldF9kYXRhX3R5cGUoKSB3aXRoIGEgbW9yZSBhY2N1cmF0ZSBkZXRlY3RfZGF0YV90eXBlKCkgaW4KKyAgdHJlZXMuYywgYWNjb3JkaW5nIHRvIHRoZSB0eHR2c2Jpbi50eHQgZG9jdW1lbnQgW1RydXRhXQorLSBTd2FwIHRoZSBvcmRlciBvZiAjaW5jbHVkZSA8c3RkaW8uaD4gYW5kICNpbmNsdWRlICJ6bGliLmgiIGluCisgIGd6aW8uYywgZXhhbXBsZS5jIGFuZCBtaW5pZ3ppcC5jIFtUcnV0YV0KKy0gU2h1dCB1cCBhbm5veWluZyBWUzIwMDUgd2FybmluZ3MgYWJvdXQgc3RhbmRhcmQgQyBkZXByZWNhdGlvbiBbUm93ZSwKKyAgVHJ1dGFdICh3aGVyZT8pCistIEZpeCB0YXJnZXQgImNsZWFuIiBmcm9tIHdpbjMyL01ha2VmaWxlLmJvciBbVHJ1dGFdCistIENyZWF0ZSAucGRiIGFuZCAubWFuaWZlc3QgZmlsZXMgaW4gd2luMzIvbWFrZWZpbGUubXNjIFtaaWVnbGVyLCBSb3dlXQorLSBVcGRhdGUgemxpYiB3d3cgaG9tZSBhZGRyZXNzIGluIHdpbjMyL0RMTF9GQVEudHh0IFtUcnV0YV0KKy0gVXBkYXRlIGNvbnRyaWIvbWFzbXg4Ni9pbmZmYXMzMi5hc20gZm9yIFZTMjAwNSBbVm9sbGFudCwgVmFuIFdhc3NlbmhvdmVdCistIEVuYWJsZSBicm93c2UgaW5mbyBpbiB0aGUgIkRlYnVnIiBhbmQgIkFTTSBEZWJ1ZyIgY29uZmlndXJhdGlvbnMgaW4KKyAgdGhlIFZpc3VhbCBDKysgNiBwcm9qZWN0LCBhbmQgc2V0IChub24tQVNNKSAiRGVidWciIGFzIGRlZmF1bHQgW1RydXRhXQorLSBBZGQgcGtnY29uZmlnIHN1cHBvcnQgW1dlaWdlbHRdCistIEFkZCBaTElCX1ZFUl9NQUpPUiwgWkxJQl9WRVJfTUlOT1IgYW5kIFpMSUJfVkVSX1JFVklTSU9OIGluIHpsaWIuaCwKKyAgZm9yIHVzZSBpbiB3aW4zMi96bGliMS5yYyBbUG9sdXNoaW4sIFJvd2UsIFRydXRhXQorLSBBZGQgYSBkb2N1bWVudCB0aGF0IGV4cGxhaW5zIHRoZSBuZXcgdGV4dCBkZXRlY3Rpb24gc2NoZW1lIHRvCisgIGRvYy90eHR2c2Jpbi50eHQgW1RydXRhXQorLSBBZGQgcmZjMTk1MC50eHQsIHJmYzE5NTEudHh0IGFuZCByZmMxOTUyLnR4dCB0byBkb2MvIFtUcnV0YV0KKy0gTW92ZSBhbGdvcml0aG0udHh0IGludG8gZG9jLyBbVHJ1dGFdCistIFN5bmNocm9uaXplIEZBUSB3aXRoIHdlYnNpdGUKKy0gRml4IGNvbXByZXNzQm91bmQoKSwgd2FzIGxvdyBmb3Igc29tZSBwYXRob2xvZ2ljYWwgY2FzZXMgW0ZlYXJubGV5XQorLSBUYWtlIGludG8gYWNjb3VudCB3cmFwcGVyIHZhcmlhdGlvbnMgaW4gZGVmbGF0ZUJvdW5kKCkKKy0gU2V0IGV4YW1wbGVzL3pwaXBlLmMgaW5wdXQgYW5kIG91dHB1dCB0byBiaW5hcnkgbW9kZSBmb3IgV2luZG93cworLSBVcGRhdGUgZXhhbXBsZXMvemxpYl9ob3cuaHRtbCB3aXRoIG5ldyB6cGlwZS5jIChhbHNvIHdlYiBzaXRlKQorLSBGaXggc29tZSB3YXJuaW5ncyBpbiBleGFtcGxlcy9nemxvZy5jIGFuZCBleGFtcGxlcy96cmFuLmMgKGl0IHNlZW1zCisgIHRoYXQgZ2NjIGJlY2FtZSBwaWNraWVyIGluIDQuMCkKKy0gQWRkIHpsaWIubWFwIGZvciBMaW51eDogIkFsbCBzeW1ib2xzIGZyb20gemxpYi0xLjEuNCByZW1haW4KKyAgdW4tdmVyc2lvbmVkLCB0aGUgcGF0Y2ggYWRkcyB2ZXJzaW9uaW5nIG9ubHkgZm9yIHN5bWJvbHMgaW50cm9kdWNlZCBpbgorICB6bGliLTEuMi4wIG9yIGxhdGVyLiAgSXQgYWxzbyBkZWNsYXJlcyBhcyBsb2NhbCB0aG9zZSBzeW1ib2xzIHdoaWNoIGFyZQorICBub3QgZGVzaWduZWQgdG8gYmUgZXhwb3J0ZWQuIiBbTGV2aW5dCistIFVwZGF0ZSBaX1BSRUZJWCBsaXN0IGluIHpjb25mLmluLmgsIGFkZCAtLXpwcmVmaXggb3B0aW9uIHRvIGNvbmZpZ3VyZQorLSBEbyBub3QgaW5pdGlhbGl6ZSBnbG9iYWwgc3RhdGljIGJ5IGRlZmF1bHQgaW4gdHJlZXMuYywgYWRkIGEgcmVzcG9uc2UKKyAgTk9fSU5JVF9HTE9CQUxfUE9JTlRFUlMgdG8gaW5pdGlhbGl6ZSB0aGVtIGlmIG5lZWRlZCBbTWFycXVlc3NdCistIERvbid0IHVzZSBzdHJlcnJvcigpIGluIGd6aW8uYyB1bmRlciBXaW5DRSBbWWFraW1vdl0KKy0gRG9uJ3QgdXNlIGVycm5vLmggaW4genV0aWwuaCB1bmRlciBXaW5DRSBbWWFraW1vdl0KKy0gTW92ZSBhcmd1bWVudHMgZm9yIEFSIHRvIGl0cyB1c2FnZSB0byBhbGxvdyByZXBsYWNpbmcgYXIgW01hcm90XQorLSBBZGQgSEFWRV9WSVNJQklMSVRZX1BSQUdNQSBpbiB6Y29uZi5pbi5oIGZvciBNb3ppbGxhIFtSYW5kZXJzLVBlaHJzb25dCistIEltcHJvdmUgaW5mbGF0ZUluaXQoKSBhbmQgaW5mbGF0ZUluaXQyKCkgZG9jdW1lbnRhdGlvbgorLSBGaXggc3RydWN0dXJlIHNpemUgY29tbWVudCBpbiBpbmZsYXRlLmgKKy0gQ2hhbmdlIGNvbmZpZ3VyZSBoZWxwIG9wdGlvbiBmcm9tIC0taCogdG8gLS1oZWxwIFtTYW50b3NdCisKK0NoYW5nZXMgaW4gMS4yLjMgKDE4IEp1bHkgMjAwNSkKKy0gQXBwbHkgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSBmaXhlcyB0byBjb250cmliL2luZmJhY2s5IGFzIHdlbGwKKy0gQ2xlYW4gdXAgc29tZSB0ZXh0IGZpbGVzIChjYXJyaWFnZSByZXR1cm5zLCB0cmFpbGluZyBzcGFjZSkKKy0gVXBkYXRlIHRlc3R6bGliLCB2c3R1ZGlvLCBtYXNteDY0LCBhbmQgbWFzbXg4NiBpbiBjb250cmliIFtWb2xsYW50XQorCitDaGFuZ2VzIGluIDEuMi4yLjQgKDExIEp1bHkgMjAwNSkKKy0gQWRkIGluZmxhdGVQcmltZSgpIGZ1bmN0aW9uIGZvciBzdGFydGluZyBpbmZsYXRpb24gYXQgYml0IGJvdW5kYXJ5CistIEF2b2lkIHNvbWUgVmlzdWFsIEMgd2FybmluZ3MgaW4gZGVmbGF0ZS5jCistIEF2b2lkIG1vcmUgc2lsbHkgVmlzdWFsIEMgd2FybmluZ3MgaW4gaW5mbGF0ZS5jIGFuZCBpbmZ0cmVlcy5jIGZvciA2NC1iaXQKKyAgY29tcGlsZQorLSBGaXggc29tZSBzcGVsbGluZyBlcnJvcnMgaW4gY29tbWVudHMgW0JldHRzXQorLSBDb3JyZWN0IGluZmxhdGVJbml0MigpIGVycm9yIHJldHVybiBkb2N1bWVudGF0aW9uIGluIHpsaWIuaAorLSBBZGQgenJhbi5jIGV4YW1wbGUgb2YgY29tcHJlc3NlZCBkYXRhIHJhbmRvbSBhY2Nlc3MgdG8gZXhhbXBsZXMKKyAgZGlyZWN0b3J5LCBzaG93cyB1c2Ugb2YgaW5mbGF0ZVByaW1lKCkKKy0gRml4IGNhc3QgZm9yIGFzc2lnbm1lbnRzIHRvIHN0cm0tPnN0YXRlIGluIGluZmxhdGUuYyBhbmQgaW5mYmFjay5jCistIEZpeCB6bGliQ29tcGlsZUZsYWdzKCkgaW4genV0aWwuYyB0byB1c2UgMUwgZm9yIGxvbmcgc2hpZnRzIFtPYmVyaHVtZXJdCistIE1vdmUgZGVjbGFyYXRpb25zIG9mIGdmMiBmdW5jdGlvbnMgdG8gcmlnaHQgcGxhY2UgaW4gY3JjMzIuYyBbT2Jlcmh1bWVyXQorLSBBZGQgY2FzdCBpbiB0cmVlcy5jIHQgYXZvaWQgYSB3YXJuaW5nIFtPYmVyaHVtZXJdCistIEF2b2lkIHNvbWUgd2FybmluZ3MgaW4gZml0YmxrLmMsIGd1bi5jLCBnempvaW4uYyBpbiBleGFtcGxlcyBbT2Jlcmh1bWVyXQorLSBVcGRhdGUgbWFrZV92bXMuY29tIFtaaW5zZXJdCistIEluaXRpYWxpemUgc3RhdGUtPndyaXRlIGluIGluZmxhdGVSZXNldCgpIHNpbmNlIGNvcGllZCBpbiBpbmZsYXRlX2Zhc3QoKQorLSBCZSBtb3JlIHN0cmljdCBvbiBpbmNvbXBsZXRlIGNvZGUgc2V0cyBpbiBpbmZsYXRlX3RhYmxlKCkgYW5kIGluY3JlYXNlCisgIEVOT1VHSCBhbmQgTUFYRCAtLSB0aGlzIHJlcGFpcnMgYSBwb3NzaWJsZSBzZWN1cml0eSB2dWxuZXJhYmlsaXR5IGZvcgorICBpbnZhbGlkIGluZmxhdGUgaW5wdXQuICBUaGFua3MgdG8gVGF2aXMgT3JtYW5keSBhbmQgTWFya3VzIE9iZXJodW1lciBmb3IKKyAgZGlzY292ZXJpbmcgdGhlIHZ1bG5lcmFiaWxpdHkgYW5kIHByb3ZpZGluZyB0ZXN0IGNhc2VzLgorLSBBZGQgaWE2NCBzdXBwb3J0IHRvIGNvbmZpZ3VyZSBmb3IgSFAtVVggW1NtaXRoXQorLSBBZGQgZXJyb3IgcmV0dXJuIHRvIGd6cmVhZCgpIGZvciBmb3JtYXQgb3IgaS9vIGVycm9yIFtMZXZpbl0KKy0gVXNlIG1hbGxvYy5oIGZvciBPUy8yIFtOZWNhc2VrXQorCitDaGFuZ2VzIGluIDEuMi4yLjMgKDI3IE1heSAyMDA1KQorLSBSZXBsYWNlIDFVIGNvbnN0YW50cyBpbiBpbmZsYXRlLmMgYW5kIGluZnRyZWVzLmMgZm9yIDY0LWJpdCBjb21waWxlCistIFR5cGVjYXN0IGZyZWFkKCkgcmV0dXJuIHZhbHVlcyBpbiBnemlvLmMgW1ZvbGxhbnRdCistIFJlbW92ZSB0cmFpbGluZyBzcGFjZSBpbiBtaW5pZ3ppcC5jIG91dG1vZGUgKFZDKysgY2FuJ3QgZGVhbCB3aXRoIGl0KQorLSBGaXggY3JjIGNoZWNrIGJ1ZyBpbiBnenJlYWQoKSBhZnRlciBnenVuZ2V0YygpIFtIZWluZXJdCistIEFkZCB0aGUgZGVmbGF0ZVR1bmUoKSBmdW5jdGlvbiB0byBhZGp1c3QgaW50ZXJuYWwgY29tcHJlc3Npb24gcGFyYW1ldGVycworLSBBZGQgYSBmYXN0IGd6aXAgZGVjb21wcmVzc29yLCBndW4uYywgdG8gZXhhbXBsZXMgKHVzZSBvZiBpbmZsYXRlQmFjaykKKy0gUmVtb3ZlIGFuIGluY29ycmVjdCBhc3NlcnRpb24gaW4gZXhhbXBsZXMvenBpcGUuYworLSBBZGQgQysrIHdyYXBwZXIgaW4gaW5mYmFjazkuaCBbRG9uYWlzXQorLSBGaXggYnVnIGluIGluZmxhdGVDb3B5KCkgd2hlbiBkZWNvZGluZyBmaXhlZCBjb2RlcworLSBOb3RlIGluIHpsaWIuaCBob3cgbXVjaCBkZWZsYXRlU2V0RGljdGlvbmFyeSgpIGFjdHVhbGx5IHVzZXMKKy0gUmVtb3ZlIFVTRV9ESUNUX0hFQUQgaW4gZGVmbGF0ZS5jICh3b3VsZCBtZXNzIHVwIGluZmxhdGUgaWYgdXNlZCkKKy0gQWRkIF9XSU4zMl9XQ0UgdG8gZGVmaW5lIFdJTjMyIGluIHpjb25mLmluLmggW1NwZW5jZXJdCistIERvbid0IGluY2x1ZGUgc3RkZXJyLmggb3IgZXJybm8uaCBmb3IgX1dJTjMyX1dDRSBpbiB6dXRpbC5oIFtTcGVuY2VyXQorLSBBZGQgZ3pkaXJlY3QoKSBmdW5jdGlvbiB0byBpbmRpY2F0ZSB0cmFuc3BhcmVudCByZWFkcworLSBVcGRhdGUgY29udHJpYi9taW5pemlwIFtWb2xsYW50XQorLSBGaXggY29tcGlsYXRpb24gb2YgZGVmbGF0ZS5jIHdoZW4gYm90aCBBU01WIGFuZCBGQVNURVNUIFtPYmVyaHVtZXJdCistIEFkZCBjYXN0cyBpbiBjcmMzMi5jIHRvIGF2b2lkIHdhcm5pbmdzIFtPYmVyaHVtZXJdCistIEFkZCBjb250cmliL21hc214NjQgW1ZvbGxhbnRdCistIFVwZGF0ZSBjb250cmliL2FzbTU4NiwgYXNtNjg2LCBtYXNteDg2LCB0ZXN0emxpYiwgdnN0dWRpbyBbVm9sbGFudF0KKworQ2hhbmdlcyBpbiAxLjIuMi4yICgzMCBEZWNlbWJlciAyMDA0KQorLSBSZXBsYWNlIHN0cnVjdHVyZSBhc3NpZ25tZW50cyBpbiBkZWZsYXRlLmMgYW5kIGluZmxhdGUuYyB3aXRoIHptZW1jcHkgdG8KKyAgYXZvaWQgaW1wbGljaXQgbWVtY3B5IGNhbGxzIChwb3J0YWJpbGl0eSBmb3Igbm8tbGlicmFyeSBjb21waWxhdGlvbikKKy0gSW5jcmVhc2Ugc3ByaW50ZigpIGJ1ZmZlciBzaXplIGluIGd6ZG9wZW4oKSB0byBhbGxvdyBmb3IgbGFyZ2UgbnVtYmVycworLSBBZGQgSU5GTEFURV9TVFJJQ1QgdG8gY2hlY2sgZGlzdGFuY2VzIGFnYWluc3QgemxpYiBoZWFkZXIKKy0gSW1wcm92ZSBXaW5DRSBlcnJubyBoYW5kbGluZyBhbmQgY29tbWVudHMgW0NoYW5nXQorLSBSZW1vdmUgY29tbWVudCBhYm91dCBubyBnemlwIGhlYWRlciBwcm9jZXNzaW5nIGluIEZBUQorLSBBZGQgWl9GSVhFRCBzdHJhdGVneSBvcHRpb24gdG8gZGVmbGF0ZUluaXQyKCkgdG8gZm9yY2UgZml4ZWQgdHJlZXMKKy0gQWRkIHVwZGF0ZWQgbWFrZV92bXMuY29tIFtDb2dobGFuXSwgdXBkYXRlIFJFQURNRQorLSBDcmVhdGUgYSBuZXcgImV4YW1wbGVzIiBkaXJlY3RvcnksIG1vdmUgZ3phcHBlbmQuYyB0aGVyZSwgYWRkIHpwaXBlLmMsCisgIGZpdGJsay5jLCBnemxvZy5bY2hdLCBnempvaW4uYywgYW5kIHpsaWJfaG93Lmh0bWwuCistIEFkZCBGQVEgZW50cnkgYW5kIGNvbW1lbnRzIGluIGRlZmxhdGUuYyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3MKKy0gQWRkIFNvbGFyaXMgOSBtYWtlIG9wdGlvbnMgaW4gY29uZmlndXJlIFtHaWxiZXJ0XQorLSBBbGxvdyBzdHJlcnJvcigpIHVzYWdlIGluIGd6aW8uYyBmb3IgU1REQworLSBGaXggRGVjb21wcmVzc0J1ZiBpbiBjb250cmliL2RlbHBoaS9aTGliLnBhcyBbTWFuQ2hlc1Rlcl0KKy0gVXBkYXRlIGNvbnRyaWIvbWFzbXg4Ni9pbmZmYXMzMi5hc20gYW5kIGd2bWF0MzIuYXNtIFtWb2xsYW50XQorLSBVc2Ugel9vZmZfdCBmb3IgYWRsZXIzMl9jb21iaW5lKCkgYW5kIGNyYzMyX2NvbWJpbmUoKSBsZW5ndGhzCistIE1ha2UgYWRsZXIzMigpIG11Y2ggZmFzdGVyIGZvciBzbWFsbCBsZW4KKy0gVXNlIE9TX0NPREUgaW4gZGVmbGF0ZSgpIGRlZmF1bHQgZ3ppcCBoZWFkZXIKKworQ2hhbmdlcyBpbiAxLjIuMi4xICgzMSBPY3RvYmVyIDIwMDQpCistIEFsbG93IGluZmxhdGVTZXREaWN0aW9uYXJ5KCkgY2FsbCBmb3IgcmF3IGluZmxhdGUKKy0gRml4IGluZmxhdGUgaGVhZGVyIGNyYyBjaGVjayBidWcgZm9yIGZpbGUgbmFtZXMgYW5kIGNvbW1lbnRzCistIEFkZCBkZWZsYXRlU2V0SGVhZGVyKCkgYW5kIGd6X2hlYWRlciBzdHJ1Y3R1cmUgZm9yIGN1c3RvbSBnemlwIGhlYWRlcnMKKy0gQWRkIGluZmxhdGVHZXRoZWFkZXIoKSB0byByZXRyaWV2ZSBnemlwIGhlYWRlcnMKKy0gQWRkIGNyYzMyX2NvbWJpbmUoKSBhbmQgYWRsZXIzMl9jb21iaW5lKCkgZnVuY3Rpb25zCistIEFkZCBhbGxvY19mdW5jLCBmcmVlX2Z1bmMsIGluX2Z1bmMsIG91dF9mdW5jIHRvIFpfUFJFRklYIGxpc3QKKy0gVXNlIHpzdHJlYW1wIGNvbnNpc3RlbnRseSBpbiB6bGliLmggKGluZmxhdGVfYmFjayBmdW5jdGlvbnMpCistIFJlbW92ZSBHVU5aSVAgY29uZGl0aW9uIGZyb20gZGVmaW5pdGlvbiBvZiBpbmZsYXRlX21vZGUgaW4gaW5mbGF0ZS5oCisgIGFuZCBpbiBjb250cmliL2luZmxhdGU4Ni9pbmZmYXN0LlMgW1RydXRhLCBBbmRlcnNvbl0KKy0gQWRkIHN1cHBvcnQgZm9yIEFNRDY0IGluIGNvbnRyaWIvaW5mbGF0ZTg2L2luZmZhczg2LmMgW0FuZGVyc29uXQorLSBVcGRhdGUgcHJvamVjdHMvUkVBRE1FLnByb2plY3RzIGFuZCBwcm9qZWN0cy92aXN1YWxjNiBbVHJ1dGFdCistIFVwZGF0ZSB3aW4zMi9ETExfRkFRLnR4dCBbVHJ1dGFdCistIEF2b2lkIHdhcm5pbmcgdW5kZXIgTk9fR1pDT01QUkVTUyBpbiBnemlvLmM7IGZpeCB0eXBvIFtUcnV0YV0KKy0gRGVwcmVjYXRlIFpfQVNDSUk7IHVzZSBaX1RFWFQgaW5zdGVhZCBbVHJ1dGFdCistIFVzZSBhIG5ldyBhbGdvcml0aG0gZm9yIHNldHRpbmcgc3RybS0+ZGF0YV90eXBlIGluIHRyZWVzLmMgW1RydXRhXQorLSBEbyBub3QgZGVmaW5lIGFuIGV4aXQoKSBwcm90b3R5cGUgaW4genV0aWwuYyB1bmxlc3MgREVCVUcgZGVmaW5lZAorLSBSZW1vdmUgcHJvdG90eXBlIG9mIGV4aXQoKSBmcm9tIHp1dGlsLmMsIGV4YW1wbGUuYywgbWluaWd6aXAuYyBbVHJ1dGFdCistIEFkZCBjb21tZW50IGluIHpsaWIuaCBmb3IgWl9OT19GTFVTSCBwYXJhbWV0ZXIgdG8gZGVmbGF0ZSgpCistIEZpeCBEYXJ3aW4gYnVpbGQgdmVyc2lvbiBpZGVudGlmaWNhdGlvbiBbUGV0ZXJzb25dCisKK0NoYW5nZXMgaW4gMS4yLjIgKDMgT2N0b2JlciAyMDA0KQorLSBVcGRhdGUgemxpYi5oIGNvbW1lbnRzIG9uIGd6aXAgaW4tbWVtb3J5IHByb2Nlc3NpbmcKKy0gU2V0IGFkbGVyIHRvIDEgaW4gaW5mbGF0ZVJlc2V0KCkgdG8gc3VwcG9ydCBKYXZhIHRlc3Qgc3VpdGUgW1dhbGxlc10KKy0gQWRkIGNvbnRyaWIvZG90emxpYiBbUmF2bl0KKy0gVXBkYXRlIHdpbjMyL0RMTF9GQVEudHh0IFtUcnV0YV0KKy0gVXBkYXRlIGNvbnRyaWIvbWluaXppcCBbVm9sbGFudF0KKy0gTW92ZSBjb250cmliL3Zpc3VhbC1iYXNpYy50eHQgdG8gb2xkLyBbVHJ1dGFdCistIEZpeCBhc3NlbWJsZXIgYnVpbGRzIGluIHByb2plY3RzL3Zpc3VhbGM2LyBbVHJ1dGFdCisKK0NoYW5nZXMgaW4gMS4yLjEuMiAoOSBTZXB0ZW1iZXIgMjAwNCkKKy0gVXBkYXRlIElOREVYIGZpbGUKKy0gRml4IHRyZWVzLmMgdG8gdXBkYXRlIHN0cm0tPmRhdGFfdHlwZSAobm8gb25lIGV2ZXIgbm90aWNlZCEpCistIEZpeCBidWcgaW4gZXJyb3IgY2FzZSBpbiBpbmZsYXRlLmMsIGluZmJhY2suYywgYW5kIGluZmJhY2s5LmMgW0Jyb3duXQorLSBBZGQgInZvbGF0aWxlIiB0byBjcmMgdGFibGUgZmxhZyBkZWNsYXJhdGlvbiAoZm9yIERZTkFNSUNfQ1JDX1RBQkxFKQorLSBBZGQgbGltaXRlZCBtdWx0aXRhc2tpbmcgcHJvdGVjdGlvbiB0byBEWU5BTUlDX0NSQ19UQUJMRQorLSBBZGQgTk9fdnNucHJpbnRmIGZvciBWTVMgaW4genV0aWwuaCBbTW96aWxsYV0KKy0gRG9uJ3QgZGVjbGFyZSBzdHJlcnJvcigpIHVuZGVyIFZNUyBbTW96aWxsYV0KKy0gQWRkIGNvbW1lbnQgdG8gRFlOQU1JQ19DUkNfVEFCTEUgdG8gdXNlIGdldF9jcmNfdGFibGUoKSB0byBpbml0aWFsaXplCistIFVwZGF0ZSBjb250cmliL2FkYSBbQW5pc2lta292XQorLSBVcGRhdGUgY29udHJpYi9taW5pemlwIFtWb2xsYW50XQorLSBGaXggY29uZmlndXJlIHRvIG5vdCBoYXJkY29kZSBkaXJlY3RvcmllcyBmb3IgRGFyd2luIFtQZXRlcnNvbl0KKy0gRml4IGd6aW8uYyB0byBub3QgcmV0dXJuIGVycm9yIG9uIGVtcHR5IGZpbGVzIFtCcm93bl0KKy0gRml4IGluZGVudGF0aW9uOyB1cGRhdGUgdmVyc2lvbiBpbiBjb250cmliL2RlbHBoaS9aTGliLnBhcyBhbmQKKyAgY29udHJpYi9wYXNjYWwvemxpYnBhcy5wYXMgW1RydXRhXQorLSBVcGRhdGUgbWthc20uYmF0IGluIGNvbnRyaWIvbWFzbXg4NiBbVHJ1dGFdCistIFVwZGF0ZSBjb250cmliL3VudGd6IFtUcnV0YV0KKy0gQWRkIHByb2plY3RzL1JFQURNRS5wcm9qZWN0cyBbVHJ1dGFdCistIEFkZCBwcm9qZWN0IGZvciBNUyBWaXN1YWwgQysrIDYuMCBpbiBwcm9qZWN0cy92aXN1YWxjNiBbQ2FkaWV1eCwgVHJ1dGFdCistIFVwZGF0ZSB3aW4zMi9ETExfRkFRLnR4dCBbVHJ1dGFdCistIFVwZGF0ZSBsaXN0IG9mIFpfUFJFRklYIHN5bWJvbHMgaW4gemNvbmYuaCBbUmFuZGVycy1QZWhyc29uLCBUcnV0YV0KKy0gUmVtb3ZlIGFuIHVubmVjZXNzYXJ5IGFzc2lnbm1lbnQgdG8gY3VyciBpbiBpbmZ0cmVlcy5jIFtUcnV0YV0KKy0gQWRkIE9TLzIgdG8gZXhlIGJ1aWxkcyBpbiBjb25maWd1cmUgW1BvbHRvcmFrXQorLSBSZW1vdmUgZXJyIGR1bW15IHBhcmFtZXRlciBpbiB6bGliLmggW0tpZW50emxlXQorCitDaGFuZ2VzIGluIDEuMi4xLjEgKDkgSmFudWFyeSAyMDA0KQorLSBVcGRhdGUgZW1haWwgYWRkcmVzcyBpbiBSRUFETUUKKy0gU2V2ZXJhbCBGQVEgdXBkYXRlcworLSBGaXggYSBiaWcgZmF0IGJ1ZyBpbiBpbmZ0cmVlcy5jIHRoYXQgcHJldmVudGVkIGRlY29kaW5nIHZhbGlkCisgIGR5bmFtaWMgYmxvY2tzIHdpdGggb25seSBsaXRlcmFscyBhbmQgbm8gZGlzdGFuY2UgY29kZXMgLS0KKyAgVGhhbmtzIHRvICJIb3QgRW11IiBmb3IgdGhlIGJ1ZyByZXBvcnQgYW5kIHNhbXBsZSBmaWxlCistIEFkZCBhIG5vdGUgdG8gcHVmZi5jIG9uIG5vIGRpc3RhbmNlIGNvZGVzIGNhc2UuCisKK0NoYW5nZXMgaW4gMS4yLjEgKDE3IE5vdmVtYmVyIDIwMDMpCistIFJlbW92ZSBhIHRhYiBpbiBjb250cmliL2d6YXBwZW5kL2d6YXBwZW5kLmMKKy0gVXBkYXRlIHNvbWUgaW50ZXJmYWNlcyBpbiBjb250cmliIGZvciBuZXcgemxpYiBmdW5jdGlvbnMKKy0gVXBkYXRlIHpsaWIgdmVyc2lvbiBudW1iZXIgaW4gc29tZSBjb250cmliIGVudHJpZXMKKy0gQWRkIFdpbmRvd3MgQ0UgZGVmaW5pdGlvbiBmb3IgcHRyZGlmZl90IGluIHp1dGlsLmggW01haSwgVHJ1dGFdCistIFN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcyBvbiBIdXJkIGFuZCBLRnJlZUJTRCBbQnJvd25dCistIEZpeCBlcnJvciBpbiBOT19ESVZJREUgb3B0aW9uIG9mIGFkbGVyMzIuYworCitDaGFuZ2VzIGluIDEuMi4wLjggKDQgTm92ZW1iZXIgMjAwMykKKy0gVXBkYXRlIHZlcnNpb24gaW4gY29udHJpYi9kZWxwaGkvWkxpYi5wYXMgYW5kIGNvbnRyaWIvcGFzY2FsL3psaWJwYXMucGFzCistIEFkZCBleHBlcmltZW50YWwgTk9fRElWSURFICNkZWZpbmUgaW4gYWRsZXIzMi5jCisgICAgLSBQb3NzaWJseSBmYXN0ZXIgb24gc29tZSBwcm9jZXNzb3JzIChsZXQgbWUga25vdyBpZiBpdCBpcykKKy0gQ29ycmVjdCBaX0JMT0NLIHRvIG5vdCByZXR1cm4gb24gZmlyc3QgaW5mbGF0ZSBjYWxsIGlmIG5vIHdyYXAKKy0gRml4IHN0cm0tPmRhdGFfdHlwZSBvbiBpbmZsYXRlKCkgcmV0dXJuIHRvIGNvcnJlY3RseSBpbmRpY2F0ZSBFT0IKKy0gQWRkIGRlZmxhdGVQcmltZSgpIGZ1bmN0aW9uIGZvciBhcHBlbmRpbmcgaW4gdGhlIG1pZGRsZSBvZiBhIGJ5dGUKKy0gQWRkIGNvbnRyaWIvZ3phcHBlbmQgZm9yIGFuIGV4YW1wbGUgb2YgYXBwZW5kaW5nIHRvIGEgc3RyZWFtCistIFVwZGF0ZSB3aW4zMi9ETExfRkFRLnR4dCBbVHJ1dGFdCistIERlbGV0ZSBUdXJibyBDIGNvbW1lbnQgaW4gUkVBRE1FIFtUcnV0YV0KKy0gSW1wcm92ZSBzb21lIGluZGVudGF0aW9uIGluIHpjb25mLmggW1RydXRhXQorLSBGaXggaW5maW5pdGUgbG9vcCBvbiBiYWQgaW5wdXQgaW4gY29uZmlndXJlIHNjcmlwdCBbQ2h1cmNoXQorLSBGaXggZ3plb2YoKSBmb3IgY29uY2F0ZW5hdGVkIGd6aXAgZmlsZXMgW0pvaG5zb25dCistIEFkZCBleGFtcGxlIHRvIGNvbnRyaWIvdmlzdWFsLWJhc2ljLnR4dCBbTWljaGFlbCBCLl0KKy0gQWRkIC1wIHRvIG1rZGlyJ3MgaW4gTWFrZWZpbGUuaW4gW3ZkYV0KKy0gRml4IGNvbmZpZ3VyZSB0byBwcm9wZXJseSBkZXRlY3QgcHJlc2VuY2Ugb3IgbGFjayBvZiBwcmludGYgZnVuY3Rpb25zCistIEFkZCBBUzQwMCBzdXBwb3J0IFtNb25uZXJhdF0KKy0gQWRkIGEgbGl0dGxlIEN5Z3dpbiBzdXBwb3J0IFtXaWxzb25dCisKK0NoYW5nZXMgaW4gMS4yLjAuNyAoMjEgU2VwdGVtYmVyIDIwMDMpCistIENvcnJlY3Qgc29tZSBkZWJ1ZyBmb3JtYXRzIGluIGNvbnRyaWIvaW5mYmFjazkKKy0gQ2FzdCBhIHR5cGUgaW4gYSBkZWJ1ZyBzdGF0ZW1lbnQgaW4gdHJlZXMuYworLSBDaGFuZ2Ugc2VhcmNoIGFuZCByZXBsYWNlIGRlbGltaXRlciBpbiBjb25maWd1cmUgZnJvbSAlIHRvICMgW0JlZWJlXQorLSBVcGRhdGUgY29udHJpYi91bnRneiB0byAwLjIgd2l0aCB2YXJpb3VzIGZpeGVzIFtUcnV0YV0KKy0gQWRkIGJ1aWxkIHN1cHBvcnQgZm9yIEFtaWdhIFtOaWtsXQorLSBSZW1vdmUgc29tZSBkaXJlY3RvcmllcyBpbiBvbGQgdGhhdCBoYXZlIGJlZW4gdXBkYXRlZCB0byAxLjIKKy0gQWRkIGR5bGliIGJ1aWxkaW5nIGZvciBNYWMgT1MgWCBpbiBjb25maWd1cmUgYW5kIE1ha2VmaWxlLmluCistIFJlbW92ZSBvbGQgZGlzdHJpYnV0aW9uIHN0dWZmIGZyb20gTWFrZWZpbGUKKy0gVXBkYXRlIFJFQURNRSB0byBwb2ludCB0byBETExfRkFRLnR4dCwgYW5kIGFkZCBjb21tZW50IG9uIE1hYyBPUyBYCistIFVwZGF0ZSBsaW5rcyBpbiBSRUFETUUKKworQ2hhbmdlcyBpbiAxLjIuMC42ICgxMyBTZXB0ZW1iZXIgMjAwMykKKy0gTWlub3IgRkFRIHVwZGF0ZXMKKy0gVXBkYXRlIGNvbnRyaWIvbWluaXppcCB0byAxLjAwIFtWb2xsYW50XQorLSBSZW1vdmUgdGVzdCBvZiBneiBmdW5jdGlvbnMgaW4gZXhhbXBsZS5jIHdoZW4gR1pfQ09NUFJFU1MgZGVmaW5lZCBbVHJ1dGFdCistIFVwZGF0ZSBQT1NUSU5DIGNvbW1lbnQgZm9yIDY4MDYwIFtOaWtsXQorLSBBZGQgY29udHJpYi9pbmZiYWNrOSB3aXRoIGRlZmxhdGU2NCBkZWNvZGluZyAodW5zdXBwb3J0ZWQpCistIEZvciBNVlMgZGVmaW5lIE5PX3ZzbnByaW50ZiBhbmQgdW5kZWZpbmUgRkFSIFt2YW4gQnVyaWtdCistIEFkZCBwcmFnbWEgZm9yIGZkb3BlbiBvbiBNVlMgW3ZhbiBCdXJpa10KKworQ2hhbmdlcyBpbiAxLjIuMC41ICg4IFNlcHRlbWJlciAyMDAzKQorLSBBZGQgT0YgdG8gaW5mbGF0ZUJhY2tFbmQoKSBkZWNsYXJhdGlvbiBpbiB6bGliLmgKKy0gUmVtZW1iZXIgc3RhcnQgd2hlbiB1c2luZyBnemRvcGVuIGluIHRoZSBtaWRkbGUgb2YgYSBmaWxlCistIFVzZSBpbnRlcm5hbCBvZmZfdCBjb3VudGVycyBpbiBneiogZnVuY3Rpb25zIHRvIHByb3Blcmx5IGhhbmRsZSBzZWVrcworLSBQZXJmb3JtIG1vcmUgcmlnb3JvdXMgY2hlY2sgZm9yIGRpc3RhbmNlLXRvby1mYXIgaW4gaW5mZmFzdC5jCistIEFkZCBaX0JMT0NLIGZsdXNoIG9wdGlvbiB0byByZXR1cm4gZnJvbSBpbmZsYXRlIGF0IGJsb2NrIGJvdW5kYXJ5CistIFNldCBzdHJtLT5kYXRhX3R5cGUgb24gcmV0dXJuIGZyb20gaW5mbGF0ZQorICAgIC0gSW5kaWNhdGUgYml0cyB1bnVzZWQsIGlmIGF0IGJsb2NrIGJvdW5kYXJ5LCBhbmQgaWYgaW4gbGFzdCBibG9jaworLSBSZXBsYWNlIHNpemVfdCB3aXRoIHB0cmRpZmZfdCBpbiBjcmMzMi5jLCBhbmQgY2hlY2sgZm9yIGNvcnJlY3Qgc2l6ZQorLSBBZGQgY29uZGl0aW9uIHNvIG9sZCBOT19ERUZMQVRFIGRlZmluZSBzdGlsbCB3b3JrcyBmb3IgY29tcGF0aWJpbGl0eQorLSBGQVEgdXBkYXRlIHJlZ2FyZGluZyB0aGUgV2luZG93cyBETEwgW1RydXRhXQorLSBJTkRFWCB1cGRhdGU6IGFkZCBxbnggZW50cnksIHJlbW92ZSBhaXggZW50cnkgW1RydXRhXQorLSBJbnN0YWxsIHpsaWIuMyBpbnRvIG1hbmRpciBbV2lsc29uXQorLSBNb3ZlIGNvbnRyaWIvemxpYl9kbGxfRkFRLnR4dCB0byB3aW4zMi9ETExfRkFRLnR4dDsgdXBkYXRlIFtUcnV0YV0KKy0gQWRhcHQgdGhlIHpsaWIgaW50ZXJmYWNlIHRvIHRoZSBuZXcgRExMIGNvbnZlbnRpb24gZ3VpZGVsaW5lcyBbVHJ1dGFdCistIEludHJvZHVjZSBaTElCX1dJTkFQSSBtYWNybyB0byBhbGxvdyB0aGUgZXhwb3J0IG9mIGZ1bmN0aW9ucyB1c2luZworICB0aGUgV0lOQVBJIGNhbGxpbmcgY29udmVudGlvbiwgZm9yIFZpc3VhbCBCYXNpYyBbVm9sbGFudCwgVHJ1dGFdCistIFVwZGF0ZSBtc2RvcyBhbmQgd2luMzIgc2NyaXB0cyBhbmQgbWFrZWZpbGVzIFtUcnV0YV0KKy0gRXhwb3J0IHN5bWJvbHMgYnkgbmFtZSwgbm90IGJ5IG9yZGluYWwsIGluIHdpbjMyL3psaWIuZGVmIFtUcnV0YV0KKy0gQWRkIGNvbnRyaWIvYWRhIFtBbmlzaW1rb3ZdCistIE1vdmUgYXNtIGZpbGVzIGZyb20gY29udHJpYi92c3R1ZGlvL3ZjNzBfMzIgdG8gY29udHJpYi9hc20zODYgW1RydXRhXQorLSBSZW5hbWUgY29udHJpYi9hc20zODYgdG8gY29udHJpYi9tYXNteDg2IFtUcnV0YSwgVm9sbGFudF0KKy0gQWRkIGNvbnRyaWIvbWFzbTY4NiBbVHJ1dGFdCistIEZpeCBvZmZzZXRzIGluIGNvbnRyaWIvaW5mbGF0ZTg2IGFuZCBjb250cmliL21hc214ODYvaW5mZmFzMzIuYXNtCisgIFtUcnV0YSwgVm9sbGFudF0KKy0gVXBkYXRlIGNvbnRyaWIvZGVscGhpOyByZW5hbWUgdG8gY29udHJpYi9wYXNjYWw7IGFkZCBleGFtcGxlIFtUcnV0YV0KKy0gUmVtb3ZlIGNvbnRyaWIvZGVscGhpMjsgYWRkIGEgbmV3IGNvbnRyaWIvZGVscGhpIFtUcnV0YV0KKy0gQXZvaWQgaW5jbHVzaW9uIG9mIHRoZSBub25zdGFuZGFyZCA8bWVtb3J5Lmg+IGluIGNvbnRyaWIvaW9zdHJlYW0sCisgIGFuZCBmaXggc29tZSBtZXRob2QgcHJvdG90eXBlcyBbVHJ1dGFdCistIEZpeCB0aGUgWkNSX1NFRUQyIGNvbnN0YW50IHRvIGF2b2lkIHdhcm5pbmdzIGluIGNvbnRyaWIvbWluaXppcAorICBbVHJ1dGFdCistIEF2b2lkIHRoZSB1c2Ugb2YgYmFja3NsYXNoIChcKSBpbiBjb250cmliL21pbml6aXAgW1ZvbGxhbnRdCistIEZpeCBmaWxlIHRpbWUgaGFuZGxpbmcgaW4gY29udHJpYi91bnRnejsgdXBkYXRlIG1ha2VmaWxlcyBbVHJ1dGFdCistIFVwZGF0ZSBjb250cmliL3ZzdHVkaW8vdmM3MF8zMiB0byBjb21wbHkgd2l0aCB0aGUgbmV3IERMTCBndWlkZWxpbmVzCisgIFtWb2xsYW50XQorLSBSZW1vdmUgY29udHJpYi92c3R1ZGlvL3ZjMTVfMTYgW1ZvbGxhbnRdCistIFJlbmFtZSBjb250cmliL3ZzdHVkaW8vdmM3MF8zMiB0byBjb250cmliL3ZzdHVkaW8vdmM3IFtUcnV0YV0KKy0gVXBkYXRlIFJFQURNRS5jb250cmliIFtUcnV0YV0KKy0gSW52ZXJ0IHRoZSBhc3NpZ25tZW50IG9yZGVyIG9mIG1hdGNoX2hlYWQgYW5kIHMtPnByZXZbLi4uXSBpbgorICBJTlNFUlRfU1RSSU5HIFtUcnV0YV0KKy0gQ29tcGFyZSBUT09fRkFSIHdpdGggMzI3NjcgaW5zdGVhZCBvZiAzMjc2OCwgdG8gYXZvaWQgMTYtYml0IHdhcm5pbmdzCisgIFtUcnV0YV0KKy0gQ29tcGFyZSBmdW5jdGlvbiBwb2ludGVycyB3aXRoIDAsIG5vdCB3aXRoIE5VTEwgb3IgWl9OVUxMIFtUcnV0YV0KKy0gRml4IHByb3RvdHlwZSBvZiBzeW5jc2VhcmNoIGluIGluZmxhdGUuYyBbVHJ1dGFdCistIEludHJvZHVjZSBBU01JTkYgbWFjcm8gdG8gYmUgZW5hYmxlZCB3aGVuIHVzaW5nIGFuIEFTTSBpbXBsZW1lbnRhdGlvbgorICBvZiBpbmZsYXRlX2Zhc3QgW1RydXRhXQorLSBDaGFuZ2UgTk9fREVGTEFURSB0byBOT19HWkNPTVBSRVNTIFtUcnV0YV0KKy0gTW9kaWZ5IHRlc3RfZ3ppbyBpbiBleGFtcGxlLmMgdG8gdGFrZSBhIHNpbmdsZSBmaWxlIG5hbWUgYXMgYQorICBwYXJhbWV0ZXIgW1RydXRhXQorLSBFeGl0IHRoZSBleGFtcGxlLmMgcHJvZ3JhbSBpZiBnem9wZW4gZmFpbHMgW1RydXRhXQorLSBBZGQgdHlwZSBjYXN0cyBhcm91bmQgc3RybGVuIGluIGV4YW1wbGUuYyBbVHJ1dGFdCistIFJlbW92ZSBjYXN0aW5nIHRvIHNpemVvZiBpbiBtaW5pZ3ppcC5jOyBnaXZlIGEgcHJvcGVyIHR5cGUKKyAgdG8gdGhlIHZhcmlhYmxlIGNvbXBhcmVkIHdpdGggU1VGRklYX0xFTiBbVHJ1dGFdCistIFVwZGF0ZSBkZWZpbml0aW9ucyBvZiBTVERDIGFuZCBTVERDOTkgaW4gemNvbmYuaCBbVHJ1dGFdCistIFN5bmNocm9uaXplIHpjb25mLmggd2l0aCB0aGUgbmV3IFdpbmRvd3MgRExMIGludGVyZmFjZSBbVHJ1dGFdCistIFVzZSBTWVMxNkJJVCBpbnN0ZWFkIG9mIF9fMzJCSVRfXyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuCisgIDE2LSBhbmQgMzItYml0IHBsYXRmb3JtcyBbVHJ1dGFdCistIFVzZSBmYXIgbWVtb3J5IGFsbG9jYXRvcnMgaW4gc21hbGwgMTYtYml0IG1lbW9yeSBtb2RlbHMgZm9yCisgIFR1cmJvIEMgW1RydXRhXQorLSBBZGQgaW5mbyBhYm91dCB0aGUgdXNlIG9mIEFTTVYsIEFTTUlORiBhbmQgWkxJQl9XSU5BUEkgaW4KKyAgemxpYkNvbXBpbGVGbGFncyBbVHJ1dGFdCistIEN5Z3dpbiBoYXMgdnNucHJpbnRmIFtXaWxzb25dCistIEluIFdpbmRvd3MxNiwgT1NfQ09ERSBpcyAwLCBhcyBpbiBNU0RPUyBbVHJ1dGFdCistIEluIEN5Z3dpbiwgT1NfQ09ERSBpcyAzIChVbml4KSwgbm90IDExIChXaW5kb3dzMzIpIFtXaWxzb25dCisKK0NoYW5nZXMgaW4gMS4yLjAuNCAoMTAgQXVndXN0IDIwMDMpCistIE1pbm9yIEZBUSB1cGRhdGVzCistIEJlIG1vcmUgc3RyaWN0IHdoZW4gY2hlY2tpbmcgaW5mbGF0ZUluaXQyJ3Mgd2luZG93Qml0cyBwYXJhbWV0ZXIKKy0gQ2hhbmdlIE5PX0dVTlpJUCBjb21waWxlIG9wdGlvbiB0byBOT19HWklQIHRvIGNvdmVyIGRlZmxhdGUgYXMgd2VsbAorLSBBZGQgZ3ppcCB3cmFwcGVyIG9wdGlvbiB0byBkZWZsYXRlSW5pdDIgdXNpbmcgd2luZG93Qml0cworLSBBZGQgdXBkYXRlZCBRTlggcnVsZSBpbiBjb25maWd1cmUgYW5kIHFueCBkaXJlY3RvcnkgW0Jvbm5lZm95XQorLSBNYWtlIGluZmxhdGUgZGlzdGFuY2UtdG9vLWZhciBjaGVja3MgbW9yZSByaWdvcm91cworLSBDbGVhbiB1cCBGQVIgdXNhZ2UgaW4gaW5mbGF0ZQorLSBBZGQgY2FzdGluZyB0byBzaXplb2YoKSBpbiBnemlvLmMgYW5kIG1pbmlnemlwLmMKKworQ2hhbmdlcyBpbiAxLjIuMC4zICgxOSBKdWx5IDIwMDMpCistIEZpeCBzaWxseSBlcnJvciBpbiBnenVuZ2V0YygpIGltcGxlbWVudGF0aW9uIFtWb2xsYW50XQorLSBVcGRhdGUgY29udHJpYi9taW5pemlwIGFuZCBjb250cmliL3ZzdHVkaW8gW1ZvbGxhbnRdCistIEZpeCBwcmludGYgZm9ybWF0IGluIGV4YW1wbGUuYworLSBDb3JyZWN0IGNkZWNsIHN1cHBvcnQgaW4gemNvbmYuaW4uaCBbQW5pc2lta292XQorLSBNaW5vciBGQVEgdXBkYXRlcworCitDaGFuZ2VzIGluIDEuMi4wLjIgKDEzIEp1bHkgMjAwMykKKy0gQWRkIFpMSUJfVkVSTlVNIGluIHpsaWIuaCBmb3IgbnVtZXJpY2FsIHByZXByb2Nlc3NvciBjb21wYXJpc29ucworLSBBdHRlbXB0IHRvIGF2b2lkIHdhcm5pbmdzIGluIGNyYzMyLmMgZm9yIHBvaW50ZXItaW50IGNvbnZlcnNpb24KKy0gQWRkIEFJWCB0byBjb25maWd1cmUsIHJlbW92ZSBhaXggZGlyZWN0b3J5IFtCYWtrZXJdCistIEFkZCBzb21lIGNhc3RzIHRvIG1pbmlnemlwLmMKKy0gSW1wcm92ZSBjaGVja2luZyBhZnRlciBpbnNlY3VyZSBzcHJpbnRmKCkgb3IgdnNwcmludGYoKSBjYWxscworLSBSZW1vdmUgI2VsaWYncyBmcm9tIGNyYzMyLmMKKy0gQ2hhbmdlIGxlYXZlIGxhYmVsIHRvIGluZl9sZWF2ZSBpbiBpbmZsYXRlLmMgYW5kIGluZmJhY2suYyB0byBhdm9pZAorICBsaWJyYXJ5IGNvbmZsaWN0cworLSBSZW1vdmUgaW5mbGF0ZSBnemlwIGRlY29kaW5nIGJ5IGRlZmF1bHQtLW9ubHkgZW5hYmxlIGd6aXAgZGVjb2RpbmcgYnkKKyAgc3BlY2lhbCByZXF1ZXN0IGZvciBzdHJpY3RlciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CistIEFkZCB6bGliQ29tcGlsZUZsYWdzKCkgZnVuY3Rpb24gdG8gcmV0dXJuIGNvbXBpbGF0aW9uIGluZm9ybWF0aW9uCistIE1vcmUgdHlwZWNhc3RpbmcgaW4gZGVmbGF0ZS5jIHRvIGF2b2lkIHdhcm5pbmdzCistIFJlbW92ZSBsZWFkaW5nIHVuZGVyc2NvcmUgZnJvbSBfQ2FwaXRhbCAjZGVmaW5lcyBbVHJ1dGFdCistIEZpeCBjb25maWd1cmUgdG8gbGluayBzaGFyZWQgbGlicmFyeSB3aGVuIHRlc3RpbmcKKy0gQWRkIHNvbWUgV2luZG93cyBDRSB0YXJnZXQgYWRqdXN0bWVudHMgW01haV0KKy0gUmVtb3ZlICNkZWZpbmUgWkxJQl9ETEwgaW4gemNvbmYuaCBbVm9sbGFudF0KKy0gQWRkIHpsaWIuMyBbUm9kZ2Vyc10KKy0gVXBkYXRlIFJGQyBVUkwgaW4gZGVmbGF0ZS5jIGFuZCBhbGdvcml0aG0udHh0IFtNYWldCistIEFkZCB6bGliX2RsbF9GQVEudHh0IHRvIGNvbnRyaWIgW1RydXRhXQorLSBBZGQgVUwgdG8gc29tZSBjb25zdGFudHMgW1RydXRhXQorLSBVcGRhdGUgbWluaXppcCBhbmQgdnN0dWRpbyBbVm9sbGFudF0KKy0gUmVtb3ZlIHZlc3RpZ2lhbCBORUVEX0RVTU1ZX1JFVFVSTiBmcm9tIHpjb25mLmluLmgKKy0gRXhwYW5kIHVzZSBvZiBOT19EVU1NWV9ERUNMIHRvIGF2b2lkIGFsbCBkdW1teSBzdHJ1Y3R1cmVzCistIEFkZGVkIGlvc3RyZWFtMyB0byBjb250cmliIFtTY2h3YXJkdF0KKy0gUmVwbGFjZSByZXdpbmQoKSB3aXRoIGZzZWVrKCkgZm9yIFdpbkNFIFtUcnV0YV0KKy0gSW1wcm92ZSBzZXR0aW5nIG9mIHpsaWIgZm9ybWF0IGNvbXByZXNzaW9uIGxldmVsIGZsYWdzCisgICAgLSBSZXBvcnQgMCBmb3IgaHVmZm1hbiBhbmQgcmxlIHN0cmF0ZWdpZXMgYW5kIGZvciBsZXZlbCA9PSAwIG9yIDEKKyAgICAtIFJlcG9ydCAyIG9ubHkgZm9yIGxldmVsID09IDYKKy0gT25seSBkZWFsIHdpdGggNjRLIGxpbWl0IHdoZW4gbmVjZXNzYXJ5IGF0IGNvbXBpbGUgdGltZSBbVHJ1dGFdCistIEFsbG93IFRPT19GQVIgY2hlY2sgdG8gYmUgdHVybmVkIG9mZiBhdCBjb21waWxlIHRpbWUgW1RydXRhXQorLSBBZGQgZ3pjbGVhcmVycigpIGZ1bmN0aW9uIFtTb3V6YV0KKy0gQWRkIGd6dW5nZXRjKCkgZnVuY3Rpb24KKworQ2hhbmdlcyBpbiAxLjIuMC4xICgxNyBNYXJjaCAyMDAzKQorLSBBZGQgWl9STEUgc3RyYXRlZ3kgZm9yIHJ1bi1sZW5ndGggZW5jb2RpbmcgW1RydXRhXQorICAgIC0gV2hlbiBaX1JMRSByZXF1ZXN0ZWQsIHJlc3RyaWN0IG1hdGNoZXMgdG8gZGlzdGFuY2Ugb25lCisgICAgLSBVcGRhdGUgemxpYi5oLCBtaW5pZ3ppcC5jLCBnem9wZW4oKSwgZ3pkb3BlbigpIGZvciBaX1JMRQorLSBDb3JyZWN0IEZBU1RFU1QgY29tcGlsYXRpb24gdG8gYWxsb3cgbGV2ZWwgPT0gMAorLSBDbGVhbiB1cCB3aGF0IGdldHMgY29tcGlsZWQgZm9yIEZBU1RFU1QKKy0gSW5jb3Jwb3JhdGUgY2hhbmdlcyB0byB6Y29uZi5pbi5oIFtWb2xsYW50XQorICAgIC0gUmVmaW5lIGRldGVjdGlvbiBvZiBUdXJibyBDIG5lZWQgZm9yIGR1bW15IHJldHVybnMKKyAgICAtIFJlZmluZSBaTElCX0RMTCBjb21waWxhdGlvbgorICAgIC0gSW5jbHVkZSBhZGRpdGlvbmFsIGhlYWRlciBmaWxlIG9uIFZNUyBmb3Igb2ZmX3QgdHlwZWRlZgorLSBUcnkgdG8gdXNlIF92c25wcmludGYgd2hlcmUgaXQgc3VwcGxhbnRzIHZzcHJpbnRmIFtWb2xsYW50XQorLSBBZGQgc29tZSBjYXN0cyBpbiBpbmZmYXN0LmMKKy0gRW5jaGFuY2UgY29tbWVudHMgaW4gemxpYi5oIG9uIHdoYXQgaGFwcGVucyBpZiBnenByaW50ZigpIHRyaWVzIHRvCisgIHdyaXRlIG1vcmUgdGhhbiA0MDk1IGJ5dGVzIGJlZm9yZSBjb21wcmVzc2lvbgorLSBSZW1vdmUgdW51c2VkIHN0YXRlIGZyb20gaW5mbGF0ZUJhY2tFbmQoKQorLSBSZW1vdmUgZXhpdCgwKSBmcm9tIG1pbmlnemlwLmMsIGV4YW1wbGUuYworLSBHZXQgcmlkIG9mIGFsbCB0aG9zZSBkYXJuIHRhYnMKKy0gQWRkICJjaGVjayIgdGFyZ2V0IHRvIE1ha2VmaWxlLmluIHRoYXQgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyAidGVzdCIKKy0gQWRkICJtb3N0bHljbGVhbiIgYW5kICJtYWludGFpbmVyLWNsZWFuIiB0YXJnZXRzIHRvIE1ha2VmaWxlLmluCistIFVwZGF0ZSBjb250cmliL2luZmxhdGU4NiBbQW5kZXJzb25dCistIFVwZGF0ZSBjb250cmliL3Rlc3R6bGliLCBjb250cmliL3ZzdHVkaW8sIGNvbnRyaWIvbWluaXppcCBbVm9sbGFudF0KKy0gQWRkIG1zZG9zIGFuZCB3aW4zMiBkaXJlY3RvcmllcyB3aXRoIG1ha2VmaWxlcyBbVHJ1dGFdCistIE1vcmUgYWRkaXRpb25zIGFuZCBpbXByb3ZlbWVudHMgdG8gdGhlIEZBUQorCitDaGFuZ2VzIGluIDEuMi4wICg5IE1hcmNoIDIwMDMpCistIE5ldyBhbmQgaW1wcm92ZWQgaW5mbGF0ZSBjb2RlCisgICAgLSBBYm91dCAyMCUgZmFzdGVyCisgICAgLSBEb2VzIG5vdCBhbGxvY2F0ZSAzMksgd2luZG93IHVubGVzcyBhbmQgdW50aWwgbmVlZGVkCisgICAgLSBBdXRvbWF0aWNhbGx5IGRldGVjdHMgYW5kIGRlY29tcHJlc3NlcyBnemlwIHN0cmVhbXMKKyAgICAtIFJhdyBpbmZsYXRlIG5vIGxvbmdlciBuZWVkcyBhbiBleHRyYSBkdW1teSBieXRlIGF0IGVuZAorICAgIC0gQWRkZWQgaW5mbGF0ZUJhY2sgZnVuY3Rpb25zIHVzaW5nIGEgY2FsbGJhY2sgaW50ZXJmYWNlLS1ldmVuIGZhc3RlcgorICAgICAgdGhhbiBpbmZsYXRlLCB1c2VmdWwgZm9yIGZpbGUgdXRpbGl0aWVzIChnemlwLCB6aXApCisgICAgLSBBZGRlZCBpbmZsYXRlQ29weSgpIGZ1bmN0aW9uIHRvIHJlY29yZCBzdGF0ZSBmb3IgcmFuZG9tIGFjY2VzcyBvbgorICAgICAgZXh0ZXJuYWxseSBnZW5lcmF0ZWQgZGVmbGF0ZSBzdHJlYW1zIChlLmcuIGluIGd6aXAgZmlsZXMpCisgICAgLSBNb3JlIHJlYWRhYmxlIGNvZGUgKEkgaG9wZSkKKy0gTmV3IGFuZCBpbXByb3ZlZCBjcmMzMigpCisgICAgLSBBYm91dCA1MCUgZmFzdGVyLCB0aGFua3MgdG8gc3VnZ2VzdGlvbnMgZnJvbSBSb2RuZXkgQnJvd24KKy0gQWRkIGRlZmxhdGVCb3VuZCgpIGFuZCBjb21wcmVzc0JvdW5kKCkgZnVuY3Rpb25zCistIEZpeCBtZW1vcnkgbGVhayBpbiBkZWZsYXRlSW5pdDIoKQorLSBQZXJtaXQgc2V0dGluZyBkaWN0aW9uYXJ5IGZvciByYXcgZGVmbGF0ZSAoZm9yIHBhcmFsbGVsIGRlZmxhdGUpCistIEZpeCBjb25zdCBkZWNsYXJhdGlvbiBmb3IgZ3p3cml0ZSgpCistIENoZWNrIGZvciBzb21lIG1hbGxvYygpIGZhaWx1cmVzIGluIGd6aW8uYworLSBGaXggYnVnIGluIGd6b3BlbigpIG9uIHNpbmdsZS1ieXRlIGZpbGUgMHgxZgorLSBGaXggYnVnIGluIGd6cmVhZCgpIG9uIGNvbmNhdGVuYXRlZCBmaWxlIHdpdGggMHgxZiBhdCBlbmQgb2YgYnVmZmVyCisgIGFuZCBuZXh0IGJ1ZmZlciBkb2Vzbid0IHN0YXJ0IHdpdGggMHg4YgorLSBGaXggdW5jb21wcmVzcygpIHRvIHJldHVybiBaX0RBVEFfRVJST1Igb24gdHJ1bmNhdGVkIGlucHV0CistIEZyZWUgbWVtb3J5IGF0IGVuZCBvZiBleGFtcGxlLmMKKy0gUmVtb3ZlIE1BWCAjZGVmaW5lIGluIHRyZWVzLmMgKGNvbmZsaWN0ZWQgd2l0aCBzb21lIGxpYnJhcmllcykKKy0gRml4IHN0YXRpYyBjb25zdCdzIGluIGRlZmxhdGUuYywgZ3ppby5jLCBhbmQgenV0aWwuW2NoXQorLSBEZWNsYXJlIG1hbGxvYygpIGFuZCBmcmVlKCkgaW4gZ3ppby5jIGlmIFNUREMgbm90IGRlZmluZWQKKy0gVXNlIG1hbGxvYygpIGluc3RlYWQgb2YgY2FsbG9jKCkgaW4genV0aWwuYyBpZiBpbnQgYmlnIGVub3VnaAorLSBEZWZpbmUgU1REQyBmb3IgQUlYCistIEFkZCBhaXgvIHdpdGggYXBwcm9hY2ggZm9yIGNvbXBpbGluZyBzaGFyZWQgbGlicmFyeSBvbiBBSVgKKy0gQWRkIEhQLVVYIHN1cHBvcnQgZm9yIHNoYXJlZCBsaWJyYXJpZXMgaW4gY29uZmlndXJlCistIEFkZCBPcGVuVU5JWCBzdXBwb3J0IGZvciBzaGFyZWQgbGlicmFyaWVzIGluIGNvbmZpZ3VyZQorLSBVc2UgJGNjIGluc3RlYWQgb2YgZ2NjIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJ5CistIE1ha2UgcHJlZml4IGRpcmVjdG9yeSBpZiBuZWVkZWQgd2hlbiBpbnN0YWxsaW5nCistIENvcnJlY3QgTWFjaW50b3NoIGF2b2lkYW5jZSBvZiB0eXBlZGVmIEJ5dGUgaW4gemNvbmYuaAorLSBDb3JyZWN0IFR1cmJvIEMgbWVtb3J5IGFsbG9jYXRpb24gd2hlbiB1bmRlciBMaW51eAorLSBVc2UgbGliei5hIGluc3RlYWQgb2YgLWx6IGluIE1ha2VmaWxlIChhc3N1cmUgdXNlIG9mIGNvbXBpbGVkIGxpYnJhcnkpCistIFVwZGF0ZSBjb25maWd1cmUgdG8gY2hlY2sgZm9yIHNucHJpbnRmIG9yIHZzbnByaW50ZiBmdW5jdGlvbnMgYW5kIHRoZWlyCisgIHJldHVybiB2YWx1ZSwgd2FybiBkdXJpbmcgbWFrZSBpZiB1c2luZyBhbiBpbnNlY3VyZSBmdW5jdGlvbgorLSBGaXggY29uZmlndXJlIHByb2JsZW0gd2l0aCBjb21waWxlLXRpbWUga25vd2xlZGdlIG9mIEhBVkVfVU5JU1REX0ggdGhhdAorICBpcyBsb3N0IHdoZW4gbGlicmFyeSBpcyB1c2VkLS1yZXNvbHV0aW9uIGlzIHRvIGJ1aWxkIG5ldyB6Y29uZi5oCistIERvY3VtZW50YXRpb24gaW1wcm92ZW1lbnRzIChpbiB6bGliLmgpOgorICAgIC0gRG9jdW1lbnQgcmF3IGRlZmxhdGUgYW5kIGluZmxhdGUKKyAgICAtIFVwZGF0ZSBSRkNzIFVSTAorICAgIC0gUG9pbnQgb3V0IHRoYXQgemxpYiBhbmQgZ3ppcCBmb3JtYXRzIGFyZSBkaWZmZXJlbnQKKyAgICAtIE5vdGUgdGhhdCBaX0JVRl9FUlJPUiBpcyBub3QgZmF0YWwKKyAgICAtIERvY3VtZW50IHN0cmluZyBsaW1pdCBmb3IgZ3pwcmludGYoKSBhbmQgcG9zc2libGUgYnVmZmVyIG92ZXJmbG93CisgICAgLSBOb3RlIHJlcXVpcmVtZW50IG9uIGF2YWlsX291dCB3aGVuIGZsdXNoaW5nCisgICAgLSBOb3RlIHBlcm1pdHRlZCB2YWx1ZXMgb2YgZmx1c2ggcGFyYW1ldGVyIG9mIGluZmxhdGUoKQorLSBBZGQgc29tZSBGQVFzIChhbmQgZXZlbiBhbnN3ZXJzKSB0byB0aGUgRkFRCistIEFkZCBjb250cmliL2luZmxhdGU4Ni8gZm9yIHg4NiBmYXN0ZXIgaW5mbGF0ZQorLSBBZGQgY29udHJpYi9ibGFzdC8gZm9yIFBLV2FyZSBEYXRhIENvbXByZXNzaW9uIExpYnJhcnkgZGVjb21wcmVzc2lvbgorLSBBZGQgY29udHJpYi9wdWZmLyBzaW1wbGUgaW5mbGF0ZSBmb3IgZGVmbGF0ZSBmb3JtYXQgZGVzY3JpcHRpb24KKworQ2hhbmdlcyBpbiAxLjEuNCAoMTEgTWFyY2ggMjAwMikKKy0gWkZSRUUgd2FzIHJlcGVhdGVkIG9uIHNhbWUgYWxsb2NhdGlvbiBvbiBzb21lIGVycm9yIGNvbmRpdGlvbnMuCisgIFRoaXMgY3JlYXRlcyBhIHNlY3VyaXR5IHByb2JsZW0gZGVzY3JpYmVkIGluCisgIGh0dHA6Ly93d3cuemxpYi5vcmcvYWR2aXNvcnktMjAwMi0wMy0xMS50eHQKKy0gUmV0dXJuZWQgaW5jb3JyZWN0IGVycm9yIChaX01FTV9FUlJPUikgb24gc29tZSBpbnZhbGlkIGRhdGEKKy0gQXZvaWQgYWNjZXNzZXMgYmVmb3JlIHdpbmRvdyBmb3IgaW52YWxpZCBkaXN0YW5jZXMgd2l0aCBpbmZsYXRlIHdpbmRvdworICBsZXNzIHRoYW4gMzJLLgorLSBmb3JjZSB3aW5kb3dCaXRzID4gOCB0byBhdm9pZCBhIGJ1ZyBpbiB0aGUgZW5jb2RlciBmb3IgYSB3aW5kb3cgc2l6ZQorICBvZiAyNTYgYnl0ZXMuIChBIGNvbXBsZXRlIGZpeCB3aWxsIGJlIGF2YWlsYWJsZSBpbiAxLjEuNSkuCisKK0NoYW5nZXMgaW4gMS4xLjMgKDkgSnVseSAxOTk4KQorLSBmaXggImFuIGluZmxhdGUgaW5wdXQgYnVmZmVyIGJ1ZyB0aGF0IHNob3dzIHVwIG9uIHJhcmUgYnV0IHBlcnNpc3RlbnQKKyAgb2NjYXNpb25zIiAoTWFyaykKKy0gZml4IGd6cmVhZCBhbmQgZ3p0ZWxsIGZvciBjb25jYXRlbmF0ZWQgLmd6IGZpbGVzIChEaWRpZXIgTGUgQm90bGFuKQorLSBmaXggZ3pzZWVrKC4uLiwgU0VFS19TRVQpIGluIHdyaXRlIG1vZGUKKy0gZml4IGNyYyBjaGVjayBhZnRlciBhIGd6ZWVrIChGcmFuayBGYXViZXJ0KQorLSBmaXggbWluaXVuemlwIHdoZW4gdGhlIGxhc3QgZW50cnkgaW4gYSB6aXAgZmlsZSBpcyBpdHNlbGYgYSB6aXAgZmlsZQorICAoSiBMaWxsZ2UpCistIGFkZCBjb250cmliL2FzbTU4NiBhbmQgY29udHJpYi9hc202ODYgKEJyaWFuIFJhaXRlcikKKyAgU2VlIGh0dHA6Ly93d3cubXVwcGV0bGFicy5jb20vfmJyZWFkYm94L3NvZnR3YXJlL2Fzc2VtYmx5Lmh0bWwKKy0gYWRkIHN1cHBvcnQgZm9yIERlbHBoaSAzIGluIGNvbnRyaWIvZGVscGhpIChCb2IgRGVsbGFjYSkKKy0gYWRkIHN1cHBvcnQgZm9yIEMrK0J1aWxkZXIgMyBhbmQgRGVscGhpIDMgaW4gY29udHJpYi9kZWxwaGkyIChEYXZpZGUgTW9yZXR0aSkKKy0gZG8gbm90IGV4aXQgcHJlbWF0dXJlbHkgaW4gdW50Z3ogaWYgMCBhdCBzdGFydCBvZiBibG9jayAoTWFnbnVzIEhvbG1ncmVuKQorLSB1c2UgbWFjcm8gRVhURVJOIGluc3RlYWQgb2YgZXh0ZXJuIHRvIHN1cHBvcnQgRExMIGZvciBCZU9TIChTYW5kZXIgU3Rva3MpCistIGFkZGVkIGEgRkFRIGZpbGUKKworLSBTdXBwb3J0IGd6ZG9wZW4gb24gTWFjIHdpdGggTWV0cm93ZXJrcyAoSmFzb24gTGluaGFydCkKKy0gRG8gbm90IHJlZGVmaW5lIEJ5dGUgb24gTWFjIChCcmFkIFBldHRpdCAmIEphc29uIExpbmhhcnQpCistIGRlZmluZSBTRUVLX0VORCB0b28gaWYgU0VFS19TRVQgaXMgbm90IGRlZmluZWQgKEFsYmVydCBDaGluLUEtWW91bmcpCistIGF2b2lkIHNvbWUgd2FybmluZ3Mgd2l0aCBCb3JsYW5kIEMgKFRvbSBUYW5uZXIpCistIGZpeCBhIHByb2JsZW0gaW4gY29udHJpYi9taW5pemlwL3ppcC5jIGZvciAxNi1iaXQgTVNET1MgKEdpbGxlcyBWb2xsYW50KQorLSBlbXVsYXRlIHV0aW1lKCkgZm9yIFdJTjMyIGluIGNvbnRyaWIvdW50Z3ogIChHaWxsZXMgVm9sbGFudCkKKy0gYWxsb3cgc2V2ZXJhbCBhcmd1bWVudHMgdG8gY29uZmlndXJlIChUaW0gTW9vbmV5LCBGcm9kbyBMb29pamFhcmQpCistIHVzZSBsaWJkaXIgYW5kIGluY2x1ZGVkaXIgaW4gTWFrZWZpbGUuaW4gKFRpbSBNb29uZXkpCistIHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcyBvbiBPU0YxIFY0IChUaW0gTW9vbmV5KQorLSByZW1vdmUgc29fbG9jYXRpb25zIGluICJtYWtlIGNsZWFuIiAgKFRpbSBNb29uZXkpCistIGZpeCBtYWtldHJlZS5jIGNvbXBpbGF0aW9uIGVycm9yIChHbGVubiwgTWFyaykKKy0gUHl0aG9uIGludGVyZmFjZSB0byB6bGliIG5vdyBpbiBQeXRob24gMS41IChKZXJlbXkgSHlsdG9uKQorLSBuZXcgTWFrZWZpbGUucmlzY29zIChSaWNoIFdhbGtlcikKKy0gaW5pdGlhbGl6ZSBzdGF0aWMgZGVzY3JpcHRvcnMgaW4gdHJlZXMuYyBmb3IgZW1iZWRkZWQgdGFyZ2V0cyAoTmljayBTbWl0aCkKKy0gdXNlICJmb28tZ3oiIGluIGV4YW1wbGUuYyBmb3IgUklTQ09TIGFuZCBWTVMgKE5pY2sgU21pdGgpCistIGFkZCB0aGUgT1MvMiBmaWxlcyBpbiBNYWtlZmlsZS5pbiB0b28gKEFuZHJldyBaYWJvbG90bnkpCistIGZpeCBmZG9wZW4gYW5kIGhhbGxvYyBtYWNyb3MgZm9yIE1pY3Jvc29mdCBDIDYuMCAoVG9tIExhbmUpCistIGZpeCBtYWtldHJlZS5jIHRvIGFsbG93IGNsZWFuIGNvbXBpbGF0aW9uIG9mIGluZmZpeGVkLmggKE1hcmspCistIGZpeCBwYXJhbWV0ZXIgY2hlY2sgaW4gZGVmbGF0ZUNvcHkgKEd1bnRoZXIgTmlrbCkKKy0gY2xlYW51cCB0cmVlcy5jLCB1c2UgY29tcHJlc3NlZF9sZW4gb25seSBpbiBkZWJ1ZyBtb2RlIChDaHJpc3RpYW4gU3BpZWxlcikKKy0gTWFueSBwb3J0YWJpbGl0eSBwYXRjaGVzIGJ5IENocmlzdGlhbiBTcGllbGVyOgorICAuIHp1dGlsLmMsIHp1dGlsLmg6IGFkZGVkICJjb25zdCIgZm9yIHptZW0qCisgIC4gTWFrZV92bXMuY29tOiBmaXhlZCBzb21lIHR5cG9zCisgIC4gTWFrZV92bXMuY29tOiBtc2Rvcy9NYWtlZmlsZS4qOiByZW1vdmVkIHp1dGlsLmggZnJvbSBzb21lIGRlcGVuZGVuY3kgbGlzdHMKKyAgLiBtc2Rvcy9NYWtlZmlsZS5tc2M6IHJlbW92ZSAiZGVmYXVsdCBydGwgbGluayBsaWJyYXJ5IiBpbmZvIGZyb20gb2JqIGZpbGVzCisgIC4gbXNkb3MvTWFrZWZpbGUuKjogdXNlIG1vZGVsLWRlcGVuZGVudCBuYW1lIGZvciB0aGUgYnVpbHQgemxpYiBsaWJyYXJ5CisgIC4gbXNkb3MvTWFrZWZpbGUuZW14LCBudC9NYWtlZmlsZS5lbXgsIG50L01ha2VmaWxlLmdjYzoKKyAgICAgbmV3IG1ha2VmaWxlcywgZm9yIGVteCAoRE9TL09TMiksIGVteCZyc3hudCBhbmQgbWluZ3czMiAoV2luZG93cyA5eCAvIE5UKQorLSB1c2UgZGVmaW5lIGluc3RlYWQgb2YgdHlwZWRlZiBmb3IgQnl0ZWYgYWxzbyBmb3IgTVNDIHNtYWxsL21lZGl1bSAoVG9tIExhbmUpCistIHJlcGxhY2UgX19mYXIgd2l0aCBfZmFyIGZvciBiZXR0ZXIgcG9ydGFiaWxpdHkgKENocmlzdGlhbiBTcGllbGVyLCBUb20gTGFuZSkKKy0gZml4IHRlc3QgZm9yIGVycm5vLmggaW4gY29uZmlndXJlIChUaW0gTmV3c2hhbSkKKworQ2hhbmdlcyBpbiAxLjEuMiAoMTkgTWFyY2ggOTgpCistIGFkZGVkIGNvbnRyaWIvbWluemlwLCBtaW5pIHppcCBhbmQgdW56aXAgYmFzZWQgb24gemxpYiAoR2lsbGVzIFZvbGxhbnQpCisgIFNlZSBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL3VuemlwLmh0bWwKKy0gcHJlaW5pdGlhbGl6ZSB0aGUgaW5mbGF0ZSB0YWJsZXMgZm9yIGZpeGVkIGNvZGVzLCB0byBtYWtlIHRoZSBjb2RlCisgIGNvbXBsZXRlbHkgdGhyZWFkIHNhZmUgKE1hcmspCistIHNvbWUgc2ltcGxpZmljYXRpb25zIGFuZCBzbGlnaHQgc3BlZWQtdXAgdG8gdGhlIGluZmxhdGUgY29kZSAoTWFyaykKKy0gZml4IGd6ZW9mIG9uIG5vbi1jb21wcmVzc2VkIGZpbGVzIChBbGxhbiBTY2hydW0pCistIGFkZCAtc3RkMSBvcHRpb24gaW4gY29uZmlndXJlIGZvciBPU0YxIHRvIGZpeCBnenByaW50ZiAoTWFydGluIE1va3JlanMpCistIHVzZSBkZWZhdWx0IHZhbHVlIG9mIDRLIGZvciBaX0JVRlNJWkUgZm9yIDE2LWJpdCBNU0RPUyAoVGltIFdlZ25lciArIEdsZW5uKQorLSBhZGRlZCBvczIvTWFrZWZpbGUuZGVmIGFuZCBvczIvemxpYi5kZWYgKEFuZHJldyBaYWJvbG90bnkpCistIGFkZCBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIFVOSVhfU1Y0LjJNUCAoTUFUU1VVUkEgVGFrYW5vcmkpCistIGRvIG5vdCB3cmFwIGV4dGVybiAiQyIgYXJvdW5kIHN5c3RlbSBpbmNsdWRlcyAoVG9tIExhbmUpCistIG1lbnRpb24gemxpYiBiaW5kaW5nIGZvciBUQ0wgaW4gUkVBRE1FIChBbmRyZWFzIEt1cHJpZXMpCistIGFkZGVkIGFtaWdhL01ha2VmaWxlLnB1cCBmb3IgQW1pZ2EgcG93ZXJVUCBTQVMvQyBQUEMgKEFuZHJlYXMgS2xlaW5lcnQpCistIGFsbG93ICJtYWtlIGluc3RhbGwgcHJlZml4PS4uLiIgZXZlbiBhZnRlciBjb25maWd1cmUgKEdsZW5uIFJhbmRlcnMtUGVocnNvbikKKy0gYWxsb3cgImNvbmZpZ3VyZSAtLXByZWZpeCAkSE9NRSIgKFRpbSBNb29uZXkpCistIHJlbW92ZSB3YXJuaW5ncyBpbiBleGFtcGxlLmMgYW5kIGd6aW8uYyAoR2xlbm4gUmFuZGVycy1QZWhyc29uKQorLSBtb3ZlIE1ha2VmaWxlLnNhcyB0byBhbWlnYS9NYWtlZmlsZS5zYXMKKworQ2hhbmdlcyBpbiAxLjEuMSAoMjcgRmViIDk4KQorLSBmaXggbWFjcm9zIF90cl90YWxseV8qIGluIGRlZmxhdGUuaCBmb3IgZGVidWcgbW9kZSAgKEdsZW5uIFJhbmRlcnMtUGVocnNvbikKKy0gcmVtb3ZlIGJsb2NrIHRydW5jYXRpb24gaGV1cmlzdGljIHdoaWNoIGhhZCB2ZXJ5IG1hcmdpbmFsIGVmZmVjdCBmb3IgemxpYgorICAoc21hbGxlciBsaXRfYnVmc2l6ZSB0aGFuIGluIGd6aXAgMS4yLjQpIGFuZCBkZWdyYWRlZCBhIGxpdHRsZSB0aGUKKyAgY29tcHJlc3Npb24gcmF0aW8gb24gc29tZSBmaWxlcy4gVGhpcyBhbHNvIGFsbG93cyBpbmxpbmluZyBfdHJfdGFsbHkgZm9yCisgIG1hdGNoZXMgaW4gZGVmbGF0ZV9zbG93LgorLSBhZGRlZCBtc2Rvcy9NYWtlZmlsZS53MzIgZm9yIFdJTjMyIE1pY3Jvc29mdCBWaXN1YWwgQysrIChCb2IgRnJhemllcikKKworQ2hhbmdlcyBpbiAxLjEuMCAoMjQgRmViIDk4KQorLSBkbyBub3QgcmV0dXJuIFNUUkVBTV9FTkQgcHJlbWF0dXJlbHkgaW4gaW5mbGF0ZSAoSm9obiBCb3dsZXIpCistIHJldmVydCB0byB0aGUgemxpYiAxLjAuOCBpbmZsYXRlIHRvIGF2b2lkIHRoZSBnY2MgMi44LjAgYnVnIChKZXJlbXkgQnVobGVyKQorLSBjb21waWxlIHdpdGggLURGQVNURVNUIHRvIGdldCBjb21wcmVzc2lvbiBjb2RlIG9wdGltaXplZCBmb3Igc3BlZWQgb25seQorLSBpbiBtaW5pZ3ppcCwgdHJ5IG1tYXAnaW5nIHRoZSBpbnB1dCBmaWxlIGZpcnN0IChNaWd1ZWwgQWxicmVjaHQpCistIGluY3JlYXNlIHNpemUgb2YgSS9PIGJ1ZmZlcnMgaW4gbWluaWd6aXAuYyBhbmQgZ3ppby5jIChub3QgYSBiaWcgZ2FpbgorICBvbiBTdW4gYnV0IHNpZ25pZmljYW50IG9uIEhQKQorCistIGFkZCBhIHBvaW50ZXIgdG8gZXhwZXJpbWVudGFsIHVuemlwIGxpYnJhcnkgaW4gUkVBRE1FIChHaWxsZXMgVm9sbGFudCkKKy0gaW5pdGlhbGl6ZSB2YXJpYWJsZSBnY2MgaW4gY29uZmlndXJlIChDaHJpcyBIZXJib3J0aCkKKworQ2hhbmdlcyBpbiAxLjAuOSAoMTcgRmViIDE5OTgpCistIGFkZGVkIGd6cHV0cyBhbmQgZ3pnZXRzIGZ1bmN0aW9ucworLSBkbyBub3QgY2xlYXIgZW9mIGZsYWcgaW4gZ3pzZWVrIChNYXJrIERpZWtoYW5zKQorLSBmaXggZ3pzZWVrIGZvciBmaWxlcyBpbiB0cmFuc3BhcmVudCBtb2RlIChNYXJrIERpZWtoYW5zKQorLSBkbyBub3QgYXNzdW1lIHRoYXQgdnNwcmludGYgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gKEplbnMgS3JpbmtlKQorLSByZXBsYWNlIEVYUE9SVCB3aXRoIFpFWFBPUlQgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBvdGhlciBwcm9ncmFtcworLSBhZGRlZCBjb21wcmVzczIgaW4gemNvbmYuaCwgemxpYi5kZWYsIHpsaWIuZG50CistIG5ldyBhc20gY29kZSBmcm9tIEdpbGxlcyBWb2xsYW50IGluIGNvbnRyaWIvYXNtMzg2CistIHNpbXBsaWZ5IHRoZSBpbmZsYXRlIGNvZGUgKE1hcmspOgorIC4gUmVwbGFjZSBaQUxMT0MncyBpbiBodWZ0X2J1aWxkKCkgd2l0aCBzaW5nbGUgWkFMTE9DIGluIGluZmxhdGVfYmxvY2tzX25ldygpCisgLiBaQUxMT0MgdGhlIGxlbmd0aCBsaXN0IGluIGluZmxhdGVfdHJlZXNfZml4ZWQoKSBpbnN0ZWFkIG9mIHVzaW5nIHN0YWNrCisgLiBaQUxMT0MgdGhlIHZhbHVlIGFyZWEgZm9yIGh1ZnRfYnVpbGQoKSBpbnN0ZWFkIG9mIHVzaW5nIHN0YWNrCisgLiBTaW1wbGlmeSBaX0ZJTklTSCBjaGVjayBpbiBpbmZsYXRlKCkKKworLSBBdm9pZCBnY2MgMi44LjAgY29tcGFyaXNvbiBidWcgYSBsaXR0bGUgZGlmZmVyZW50bHkgdGhhbiB6bGliIDEuMC44CistIGluIGluZnRyZWVzLmMsIGF2b2lkIGNjIC1PIGJ1ZyBvbiBIUCAoRmFyc2hpZCBFbGFoaSkKKy0gaW4gemNvbmYuaCBtb3ZlIHRoZSBaTElCX0RMTCBzdHVmZiBlYXJsaWVyIHRvIGF2b2lkIHByb2JsZW1zIHdpdGgKKyAgdGhlIGRlY2xhcmF0aW9uIG9mIEZBUiAoR2lsbGVzIFZPbGxhbnQpCistIGluc3RhbGwgbGliei5zbyogd2l0aCBtb2RlIDc1NSAoZXhlY3V0YWJsZSkgaW5zdGVhZCBvZiA2NDQgKE1hcmMgTGVobWFubikKKy0gcmVhZF9idWYgYnVmIHBhcmFtZXRlciBvZiB0eXBlIEJ5dGVmKiBpbnN0ZWFkIG9mIGNoYXJmKgorLSB6bWVtY3B5IHBhcmFtZXRlcnMgYXJlIG9mIHR5cGUgQnl0ZWYqLCBub3QgY2hhcmYqIChKb3NlcGggU3Ryb3V0KQorLSBkbyBub3QgcmVkZWNsYXJlIHVubGluayBpbiBtaW5pZ3ppcC5jIGZvciBXSU4zMiAoSm9obiBCb3dsZXIpCistIGZpeCBjaGVjayBmb3IgcHJlc2VuY2Ugb2YgZGlyZWN0b3JpZXMgaW4gIm1ha2UgaW5zdGFsbCIgKElhbiBXaWxsaXMpCisKK0NoYW5nZXMgaW4gMS4wLjggKDI3IEphbiAxOTk4KQorLSBmaXhlZCBvZmZzZXRzIGluIGNvbnRyaWIvYXNtMzg2L2d2bWF0MzIuYXNtIChHaWxsZXMgVm9sbGFudCkKKy0gZml4IGd6Z2V0YyBhbmQgZ3pwdXRjIGZvciBiaWcgZW5kaWFuIHN5c3RlbXMgKE1hcmt1cyBPYmVyaHVtZXIpCistIGFkZGVkIGNvbXByZXNzMigpIHRvIGFsbG93IHNldHRpbmcgdGhlIGNvbXByZXNzaW9uIGxldmVsCistIGluY2x1ZGUgc3lzL3R5cGVzLmggdG8gZ2V0IG9mZl90IG9uIHNvbWUgc3lzdGVtcyAoTWFyYyBMZWhtYW5uICYgUWluZ0xvbmcpCistIHVzZSBjb25zdGFudCBhcnJheXMgZm9yIHRoZSBzdGF0aWMgdHJlZXMgaW4gdHJlZXMuYyBpbnN0ZWFkIG9mIGNvbXB1dGluZworICB0aGVtIGF0IHJ1biB0aW1lICh0aGFua3MgdG8gS2VuIFJhZWJ1cm4gZm9yIHRoaXMgc3VnZ2VzdGlvbikuIFRvIGNyZWF0ZQorICB0cmVlcy5oLCBjb21waWxlIHdpdGggR0VOX1RSRUVTX0ggYW5kIHJ1biAibWFrZSB0ZXN0Ii4KKy0gY2hlY2sgcmV0dXJuIGNvZGUgb2YgZXhhbXBsZSBpbiAibWFrZSB0ZXN0IiBhbmQgZGlzcGxheSByZXN1bHQKKy0gcGFzcyBtaW5pZ3ppcCBjb21tYW5kIGxpbmUgb3B0aW9ucyB0byBmaWxlX2NvbXByZXNzCistIHNpbXBsaWZ5aW5nIGNvZGUgb2YgaW5mbGF0ZVN5bmMgdG8gYXZvaWQgZ2NjIDIuOCBidWcKKworLSBzdXBwb3J0IENDPSJnY2MgLVdhbGwiIGluIGNvbmZpZ3VyZSAtcyAoUWluZ0xvbmcpCistIGF2b2lkIGEgZmx1c2ggY2F1c2VkIGJ5IGZ0ZWxsIGluIGd6b3BlbiBmb3Igd3JpdGUgbW9kZSAoS2VuIFJhZWJ1cm4pCistIGZpeCB0ZXN0IGZvciBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzCistIHpsaWIubGliIC0+IHpsaWIuZGxsIGluIG1zZG9zL3psaWIucmMgKEdpbGxlcyBWb2xsYW50KQorLSBjaGVjayBmb3IgVEFSR0VUX09TX01BQyBpbiBhZGRpdGlvbiB0byBNQUNPUyAoQnJhZCBQZXR0aXQpCistIGRvIG5vdCB1c2UgZmRvcGVuIGZvciBNZXRyb3dlcmtzIG9uIE1hYyAoQnJhZCBQZXR0aXQpKQorLSBhZGQgY2hlY2tzIGZvciBnenB1dGMgYW5kIGd6cHV0YyBpbiBleGFtcGxlLmMKKy0gYXZvaWQgd2FybmluZ3MgaW4gZ3ppby5jIGFuZCBkZWZsYXRlLmMgKEFuZHJlYXMgS2xlaW5lcnQpCistIHVzZSBjb25zdCBmb3IgdGhlIENSQyB0YWJsZSAoS2VuIFJhZWJ1cm4pCistIGZpeGVkICJtYWtlIHVuaW5zdGFsbCIgZm9yIHNoYXJlZCBsaWJyYXJpZXMKKy0gdXNlIFRyYWNldiBpbnN0ZWFkIG9mIFRyYWNlIGluIGluZmJsb2NrLmMKKy0gaW4gZXhhbXBsZS5jIHVzZSBjb3JyZWN0IGNvbXByZXNzZWQgbGVuZ3RoIGZvciB0ZXN0X3N5bmMKKy0gc3VwcHJlc3MgK3Zub2NvbXBhdHdhcm5pbmdzIGluIGNvbmZpZ3VyZSBmb3IgSFBVWCAobm90IGFsd2F5cyBzdXBwb3J0ZWQpCisKK0NoYW5nZXMgaW4gMS4wLjcgKDIwIEphbiAxOTk4KQorLSBmaXggZ3pzZWVrIHdoaWNoIHdhcyBicm9rZW4gaW4gd3JpdGUgbW9kZQorLSByZXR1cm4gZXJyb3IgZm9yIGd6c2VlayB0byBuZWdhdGl2ZSBhYnNvbHV0ZSBwb3NpdGlvbgorLSBmaXggY29uZmlndXJlIGZvciBMaW51eCAoQ2h1bi1DaHVuZyBDaGVuKQorLSBpbmNyZWFzZSBzdGFjayBzcGFjZSBmb3IgTVNDIChUaW0gV2VnbmVyKQorLSBnZXRfY3JjX3RhYmxlIGFuZCBpbmZsYXRlU3luY1BvaW50IGFyZSBFWFBPUlRlZCAoR2lsbGVzIFZvbGxhbnQpCistIGRlZmluZSBFWFBPUlRWQSBmb3IgZ3pwcmludGYgKEdpbGxlcyBWb2xsYW50KQorLSBhZGRlZCBtYW4gcGFnZSB6bGliLjMgKFJpY2sgUm9kZ2VycykKKy0gZm9yIGNvbnRyaWIvdW50Z3osIGZpeCBtYWtlZGlyKCkgYW5kIGltcHJvdmUgTWFrZWZpbGUKKworLSBjaGVjayBnenNlZWsgaW4gd3JpdGUgbW9kZSBpbiBleGFtcGxlLmMKKy0gYWxsb2NhdGUgZXh0cmEgYnVmZmVyIGZvciBzZWVrcyBvbmx5IGlmIGd6c2VlayBpcyBhY3R1YWxseSBjYWxsZWQKKy0gYXZvaWQgc2lnbmVkL3Vuc2lnbmVkIGNvbXBhcmlzb25zIChUaW0gV2VnbmVyLCBHaWxsZXMgVm9sbGFudCkKKy0gYWRkIGluZmxhdGVTeW5jUG9pbnQgaW4gemNvbmYuaAorLSBmaXggbGlzdCBvZiBleHBvcnRlZCBmdW5jdGlvbnMgaW4gbnQvemxpYi5kbnQgYW5kIG1kc29zL3psaWIuZGVmCisKK0NoYW5nZXMgaW4gMS4wLjYgKDE5IEphbiAxOTk4KQorLSBhZGQgZnVuY3Rpb25zIGd6cHJpbnRmLCBnenB1dGMsIGd6Z2V0YywgZ3p0ZWxsLCBnemVvZiwgZ3pzZWVrLCBnenJld2luZCBhbmQKKyAgZ3pzZXRwYXJhbXMgKHRoYW5rcyB0byBSb2xhbmQgR2llcnNpZyBhbmQgS2V2aW4gUnVsYW5kIGZvciBzb21lIG9mIHRoaXMgY29kZSkKKy0gRml4IGEgZGVmbGF0ZSBidWcgb2NjdXJyaW5nIG9ubHkgd2l0aCBjb21wcmVzc2lvbiBsZXZlbCAwICh0aGFua3MgdG8KKyAgQW5keSBCdWNrbGVyIGZvciBmaW5kaW5nIHRoaXMgb25lKS4KKy0gSW4gbWluaWd6aXAsIHBhc3MgdHJhbnNwYXJlbnRseSBhbHNvIHRoZSBmaXJzdCBieXRlIGZvciAuWiBmaWxlcy4KKy0gcmV0dXJuIFpfQlVGX0VSUk9SIGluc3RlYWQgb2YgWl9PSyBpZiBvdXRwdXQgYnVmZmVyIGZ1bGwgaW4gdW5jb21wcmVzcygpCistIGNoZWNrIFpfRklOSVNIIGluIGluZmxhdGUgKHRoYW5rcyB0byBNYXJjIFNjaGx1cGVyKQorLSBJbXBsZW1lbnQgZGVmbGF0ZUNvcHkgKHRoYW5rcyB0byBBZGFtIENvc3RlbGxvKQorLSBtYWtlIHN0YXRpYyBsaWJyYXJpZXMgYnkgZGVmYXVsdCBpbiBjb25maWd1cmUsIGFkZCAtLXNoYXJlZCBvcHRpb24uCistIG1vdmUgTVNET1Mgb3IgV2luZG93cyBzcGVjaWZpYyBmaWxlcyB0byBkaXJlY3RvcnkgbXNkb3MKKy0gc3VwcHJlc3MgdGhlIG5vdGlvbiBvZiBwYXJ0aWFsIGZsdXNoIHRvIHNpbXBsaWZ5IHRoZSBpbnRlcmZhY2UKKyAgKGJ1dCB0aGUgc3ltYm9sIFpfUEFSVElBTF9GTFVTSCBpcyBrZXB0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggMS4wLjQpCistIHN1cHByZXNzIGhpc3RvcnkgYnVmZmVyIHByb3ZpZGVkIGJ5IGFwcGxpY2F0aW9uIHRvIHNpbXBsaWZ5IHRoZSBpbnRlcmZhY2UKKyAgKHRoaXMgZmVhdHVyZSB3YXMgbm90IGltcGxlbWVudGVkIGFueXdheSBpbiAxLjAuNCkKKy0gbmV4dF9pbiBhbmQgYXZhaWxfaW4gbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgY2FsbGluZyBpbmZsYXRlSW5pdCBvcgorICBpbmZsYXRlSW5pdDIKKy0gYWRkIEVYUE9SVCBpbiBhbGwgZXhwb3J0ZWQgZnVuY3Rpb25zIChmb3IgV2luZG93cyBETEwpCistIGFkZGVkIE1ha2VmaWxlLm50ICh0aGFua3MgdG8gU3RlcGhlbiBXaWxsaWFtcykKKy0gYWRkZWQgdGhlIHVuc3VwcG9ydGVkICJjb250cmliIiBkaXJlY3Rvcnk6CisgICBjb250cmliL2FzbTM4Ni8gYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPgorICAgICAgICAzODYgYXNtIGNvZGUgcmVwbGFjaW5nIGxvbmdlc3RfbWF0Y2goKS4KKyAgIGNvbnRyaWIvaW9zdHJlYW0vIGJ5IEtldmluIFJ1bGFuZCA8a2V2aW5Acm9kaW4ud3VzdGwuZWR1PgorICAgICAgICBBIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UgdG8gdGhlIHpsaWIgZ3oqIGZ1bmN0aW9ucworICAgY29udHJpYi9pb3N0cmVhbTIvICBieSBUeWdlIEz4dnNldCA8VHlnZS5Mb3ZzZXRAY21yLm5vPgorICAgICAgICBBbm90aGVyIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UKKyAgIGNvbnRyaWIvdW50Z3ovICBieSAiUGVkcm8gQS4gQXJhbmRhIEd1dGlcaXJyZXoiIDxwYWFnQHRpZC5lcz4KKyAgICAgICAgQSB2ZXJ5IHNpbXBsZSB0YXIuZ3ogZmlsZSBleHRyYWN0b3IgdXNpbmcgemxpYgorICAgY29udHJpYi92aXN1YWwtYmFzaWMudHh0IGJ5IENhcmxvcyBSaW9zIDxjX3Jpb3NAc29uZGEuY2w+CisgICAgICAgIEhvdyB0byB1c2UgY29tcHJlc3MoKSwgdW5jb21wcmVzcygpIGFuZCB0aGUgZ3oqIGZ1bmN0aW9ucyBmcm9tIFZCLgorLSBwYXNzIHBhcmFtcyAtZiAoZmlsdGVyZWQgZGF0YSksIC1oIChodWZmbWFuIG9ubHkpLCAtMSB0byAtOSAoY29tcHJlc3Npb24KKyAgbGV2ZWwpIGluIG1pbmlnemlwICh0aGFua3MgdG8gVG9tIExhbmUpCisKKy0gdXNlIGNvbnN0IGZvciByb21tYWJsZSBjb25zdGFudHMgaW4gZGVmbGF0ZQorLSBhZGRlZCB0ZXN0IGZvciBnenNlZWsgYW5kIGd6dGVsbCBpbiBleGFtcGxlLmMKKy0gYWRkIHVuZG9jdW1lbnRlZCBmdW5jdGlvbiBpbmZsYXRlU3luY1BvaW50KCkgKGhhY2sgZm9yIFBhdWwgTWFja2VycmFzKQorLSBhZGQgdW5kb2N1bWVudGVkIGZ1bmN0aW9uIHpFcnJvciB0byBjb252ZXJ0IGVycm9yIGNvZGUgdG8gc3RyaW5nCisgIChmb3IgVGltIFNtaXRoZXJzKQorLSBBbGxvdyBjb21waWxhdGlvbiBvZiBnemlvIHdpdGggLUROT19ERUZMQVRFIHRvIGF2b2lkIHRoZSBjb21wcmVzc2lvbiBjb2RlLgorLSBVc2UgZGVmYXVsdCBtZW1jcHkgZm9yIFN5bWFudGVjIE1TRE9TIGNvbXBpbGVyLgorLSBBZGQgRVhQT1JUIGtleXdvcmQgZm9yIGNoZWNrX2Z1bmMgKG5lZWRlZCBmb3IgV2luZG93cyBETEwpCistIGFkZCBjdXJyZW50IGRpcmVjdG9yeSB0byBMRF9MSUJSQVJZX1BBVEggZm9yICJtYWtlIHRlc3QiCistIGNyZWF0ZSBhbHNvIGEgbGluayBmb3IgbGliei5zby4xCistIGFkZGVkIHN1cHBvcnQgZm9yIEZVSklUU1UgVVhQL0RTICh0aGFua3MgdG8gVG9zaGlha2kgTm9tdXJhKQorLSB1c2UgJChTSEFSRURMSUIpIGluc3RlYWQgb2YgbGliei5zbyBpbiBNYWtlZmlsZS5pbiAoZm9yIEhQVVgpCistIGFkZGVkIC1zb25hbWUgZm9yIExpbnV4IGluIGNvbmZpZ3VyZSAoQ2h1bi1DaHVuZyBDaGVuLAorLSBhc3NpZ24gbnVtYmVycyB0byB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zIGluIHpsaWIuZGVmIChmb3IgV2luZG93cyBETEwpCistIGFkZCBhZHZpY2UgaW4gemxpYi5oIGZvciBiZXN0IHVzYWdlIG9mIGRlZmxhdGVTZXREaWN0aW9uYXJ5CistIHdvcmsgYXJvdW5kIGNvbXBpbGVyIGJ1ZyBvbiBBdGFyaSAoY2FzdCBaX05VTEwgaW4gY2FsbCBvZiBzLT5jaGVja2ZuKQorLSBhbGxvdyBjb21waWxhdGlvbiB3aXRoIEFOU0kga2V5d29yZHMgb25seSBlbmFibGVkIGZvciBUdXJib0MgaW4gbGFyZ2UgbW9kZWwKKy0gYXZvaWQgInZlcnNpb25TdHJpbmciWzBdIChCb3JsYW5kIGJ1ZykKKy0gYWRkIE5FRURfRFVNTVlfUkVUVVJOIGZvciBCb3JsYW5kCistIHVzZSB2YXJpYWJsZSB6X3ZlcmJvc2UgZm9yIHRyYWNpbmcgaW4gZGVidWcgbW9kZSAoTC4gUGV0ZXIgRGV1dHNjaCkuCistIGFsbG93IGNvbXBpbGF0aW9uIHdpdGggQ0MKKy0gZGVmaW5lZCBTVERDIGZvciBPUy8yIChEYXZpZCBDaGFybGFwKQorLSBsaW1pdCBleHRlcm5hbCBuYW1lcyB0byA4IGNoYXJzIGZvciBNVlMgKFRob21hcyBMdW5kKQorLSBpbiBtaW5pZ3ppcC5jLCB1c2Ugc3RhdGljIGJ1ZmZlcnMgb25seSBmb3IgMTYtYml0IHN5c3RlbXMKKy0gZml4IHN1ZmZpeCBjaGVjayBmb3IgIm1pbmlnemlwIC1kIGZvby5neiIKKy0gZG8gbm90IHJldHVybiBhbiBlcnJvciBmb3IgdGhlIDJuZCBvZiB0d28gY29uc2VjdXRpdmUgZ3pmbHVzaCgpIChGZWxpeCBMZWUpCistIHVzZSBfZmRvcGVuIGluc3RlYWQgb2YgZmRvcGVuIGZvciBNU0MgPj0gNi4wIChUaG9tYXMgRmFuc2xhdSkKKy0gYWRkZWQgbWFrZWxjYy5iYXQgZm9yIGxjYy13aW4zMiAoVG9tIFN0IERlbmlzKQorLSBpbiBNYWtlZmlsZS5kajIsIHVzZSBjb3B5IGFuZCBkZWwgaW5zdGVhZCBvZiBpbnN0YWxsIGFuZCBybSAoRnJhbmsgRG9uYWhvZSkKKy0gQXZvaWQgZXhwYW5kZWQgJElkJC4gVXNlICJyY3MgLWtiIiBvciAiY3ZzIGFkbWluIC1rYiIgdG8gYXZvaWQgSWQgZXhwYW5zaW9uLgorLSBjaGVjayBmb3IgdW5pc3RkLmggaW4gY29uZmlndXJlIChmb3Igb2ZmX3QpCistIHJlbW92ZSB1c2VsZXNzIGNoZWNrIHBhcmFtZXRlciBpbiBpbmZsYXRlX2Jsb2Nrc19mcmVlCistIGF2b2lkIHVzZWxlc3MgYXNzaWdubWVudCBvZiBzLT5jaGVjayB0byBpdHNlbGYgaW4gaW5mbGF0ZV9ibG9ja3NfbmV3CistIGRvIG5vdCBmbHVzaCB0d2ljZSBpbiBnemNsb3NlICh0aGFua3MgdG8gS2VuIFJhZWJ1cm4pCistIHJlbmFtZSBGT1BFTiBhcyBGX09QRU4gdG8gYXZvaWQgY2xhc2ggd2l0aCAvdXNyL2luY2x1ZGUvc3lzL2ZpbGUuaAorLSB1c2UgTk9fRVJSTk9fSCBpbnN0ZWFkIG9mIGVudW1lcmF0aW9uIG9mIG9wZXJhdGluZyBzeXN0ZW1zIHdpdGggZXJybm8uaAorLSB3b3JrIGFyb3VuZCBidWdneSBmY2xvc2Ugb24gcGlwZXMgZm9yIEhQL1VYCistIHN1cHBvcnQgemxpYiBETEwgd2l0aCBCT1JMQU5EIEMrKyA1LjAgKHRoYW5rcyB0byBHbGVubiBSYW5kZXJzLVBlaHJzb24pCistIGZpeCBjb25maWd1cmUgaWYgQ0MgaXMgYWxyZWFkeSBlcXVhbCB0byBnY2MKKworQ2hhbmdlcyBpbiAxLjAuNSAoMyBKYW4gOTgpCistIEZpeCBpbmZsYXRlIHRvIHRlcm1pbmF0ZSBncmFjZWZ1bGx5IHdoZW4gZmVkIGNvcnJ1cHRlZCBvciBpbnZhbGlkIGRhdGEKKy0gVXNlIGNvbnN0IGZvciByb21tYWJsZSBjb25zdGFudHMgaW4gaW5mbGF0ZQorLSBFbGltaW5hdGUgbWVtb3J5IGxlYWtzIG9uIGVycm9yIGNvbmRpdGlvbnMgaW4gaW5mbGF0ZQorLSBSZW1vdmVkIHNvbWUgdmVzdGlnaWFsIGNvZGUgaW4gaW5mbGF0ZQorLSBVcGRhdGUgd2ViIGFkZHJlc3MgaW4gUkVBRE1FCisKK0NoYW5nZXMgaW4gMS4wLjQgKDI0IEp1bCA5NikKKy0gSW4gdmVyeSByYXJlIGNvbmRpdGlvbnMsIGRlZmxhdGUocywgWl9GSU5JU0gpIGNvdWxkIGZhaWwgdG8gcHJvZHVjZSBhbiBFT0YKKyAgYml0LCBzbyB0aGUgZGVjb21wcmVzc29yIGNvdWxkIGRlY29tcHJlc3MgYWxsIHRoZSBjb3JyZWN0IGRhdGEgYnV0IHdlbnQKKyAgb24gdG8gYXR0ZW1wdCBkZWNvbXByZXNzaW5nIGV4dHJhIGdhcmJhZ2UgZGF0YS4gVGhpcyBhZmZlY3RlZCBtaW5pZ3ppcCB0b28uCistIHpsaWJWZXJzaW9uIGFuZCBnemVycm9yIHJldHVybiBjb25zdCBjaGFyKiAobmVlZGVkIGZvciBETEwpCistIHBvcnQgdG8gUklTQ09TIChubyBmZG9wZW4sIG5vIG11bHRpcGxlIGRvdHMsIG5vIHVubGluaywgbm8gZmlsZW5vKQorLSB1c2Ugel9lcnJvciBvbmx5IGZvciBERUJVRyAoYXZvaWQgcHJvYmxlbSB3aXRoIERMTHMpCisKK0NoYW5nZXMgaW4gMS4wLjMgKDIgSnVsIDk2KQorLSB1c2Ugel9zdHJlYW1wIGluc3RlYWQgb2Ygel9zdHJlYW0gKiwgd2hpY2ggaXMgbm93IGEgZmFyIHBvaW50ZXIgaW4gTVNET1MKKyAgc21hbGwgYW5kIG1lZGl1bSBtb2RlbHM7IHRoaXMgbWFrZXMgdGhlIGxpYnJhcnkgaW5jb21wYXRpYmxlIHdpdGggcHJldmlvdXMKKyAgdmVyc2lvbnMgZm9yIHRoZXNlIG1vZGVscy4gKE5vIGVmZmVjdCBpbiBsYXJnZSBtb2RlbCBvciBvbiBvdGhlciBzeXN0ZW1zLikKKy0gcmV0dXJuIE9LIGluc3RlYWQgb2YgQlVGX0VSUk9SIGlmIHByZXZpb3VzIGRlZmxhdGUgY2FsbCByZXR1cm5lZCB3aXRoCisgIGF2YWlsX291dCBhcyB6ZXJvIGJ1dCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvCistIGFkZGVkIG1lbWNtcCBmb3Igbm9uIFNUREMgY29tcGlsZXJzCistIGRlZmluZSBOT19EVU1NWV9ERUNMIGZvciBtb3JlIE1hYyBjb21waWxlcnMgKC5oIGZpbGVzIG1lcmdlZCBpbmNvcnJlY3RseSkKKy0gZGVmaW5lIF9fMzJCSVRfXyBpZiBfXzM4Nl9fIG9yIGkzODYgaXMgZGVmaW5lZCAocGIuIHdpdGggV2F0Y29tIGFuZCBTQ08pCistIGJldHRlciBjaGVjayBmb3IgMTYtYml0IG1vZGUgTVNDIChhdm9pZHMgcHJvYmxlbSB3aXRoIFN5bWFudGVjKQorCitDaGFuZ2VzIGluIDEuMC4yICgyMyBNYXkgOTYpCistIGFkZGVkIFdpbmRvd3MgRExMIHN1cHBvcnQKKy0gYWRkZWQgYSBmdW5jdGlvbiB6bGliVmVyc2lvbiAoZm9yIHRoZSBETEwgc3VwcG9ydCkKKy0gZml4ZWQgZGVjbGFyYXRpb25zIHVzaW5nIEJ5dGVmIGluIGluZnV0aWwuYyAocGIgd2l0aCBNU0RPUyBtZWRpdW0gbW9kZWwpCistIEJ5dGVmIGlzIGRlZmluZSdzIGluc3RlYWQgb2YgdHlwZWRlZidkIG9ubHkgZm9yIEJvcmxhbmQgQworLSBhdm9pZCByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGluIGV4YW1wbGUuYworLSBtZW50aW9uIGluIFJFQURNRSB0aGF0IHRoZSB6bGliIGZvcm1hdCBpcyBub3cgUkZDMTk1MAorLSB1cGRhdGVkIE1ha2VmaWxlLmRqMgorLSBhZGRlZCBhbGdvcml0aG0uZG9jCisKK0NoYW5nZXMgaW4gMS4wLjEgKDIwIE1heSA5NikgWzEuMCBza2lwcGVkIHRvIGF2b2lkIGNvbmZ1c2lvbl0KKy0gZml4IGFycmF5IG92ZXJsYXkgaW4gZGVmbGF0ZS5jIHdoaWNoIHNvbWV0aW1lcyBjYXVzZWQgYmFkIGNvbXByZXNzZWQgZGF0YQorLSBmaXggaW5mbGF0ZSBidWcgd2l0aCBlbXB0eSBzdG9yZWQgYmxvY2sKKy0gZml4IE1TRE9TIG1lZGl1bSBtb2RlbCB3aGljaCB3YXMgYnJva2VuIGluIDAuOTkKKy0gZml4IGRlZmxhdGVQYXJhbXMoKSB3aGljaCBjb3VsZCBnZW5lcmF0ZWQgYmFkIGNvbXByZXNzZWQgZGF0YS4KKy0gQnl0ZWYgaXMgZGVmaW5lJ2QgaW5zdGVhZCBvZiB0eXBlZGVmJ2VkICh3b3JrIGFyb3VuZCBCb3JsYW5kIGJ1ZykKKy0gYWRkZWQgYW4gSU5ERVggZmlsZQorLSBuZXcgbWFrZWZpbGVzIGZvciBESkdQUCAoTWFrZWZpbGUuZGoyKSwgMzItYml0IEJvcmxhbmQgKE1ha2VmaWxlLmIzMiksCisgIFdhdGNvbSAoTWFrZWZpbGUud2F0KSwgQW1pZ2EgU0FTL0MgKE1ha2VmaWxlLnNhcykKKy0gc3BlZWQgdXAgYWRsZXIzMiBmb3IgbW9kZXJuIG1hY2hpbmVzIHdpdGhvdXQgYXV0by1pbmNyZW1lbnQKKy0gYWRkZWQgLWFuc2kgZm9yIElSSVggaW4gY29uZmlndXJlCistIHN0YXRpY19pbml0X2RvbmUgaW4gdHJlZXMuYyBpcyBhbiBpbnQKKy0gZGVmaW5lIHVubGluayBhcyBkZWxldGUgZm9yIFZNUworLSBmaXggY29uZmlndXJlIGZvciBRTlgKKy0gYWRkIGNvbmZpZ3VyZSBicmFuY2ggZm9yIFNDTyBhbmQgSFBVWAorLSBhdm9pZCBtYW55IHdhcm5pbmdzICh1bnVzZWQgdmFyaWFibGVzLCBkZWFkIGFzc2lnbm1lbnRzLCBldGMuLi4pCistIG5vIGZkb3BlbiBmb3IgQmVPUworLSBmaXggdGhlIFdhdGNvbSBmaXggZm9yIDMyIGJpdCBtb2RlIChkZWZpbmUgRkFSIGFzIGVtcHR5KQorLSByZW1vdmVkIHJlZGVmaW5pdGlvbiBvZiBCeXRlIGZvciBNS1dFUktTCistIHdvcmsgYXJvdW5kIGFuIE1XS0VSS1MgYnVnIChpbmNvcnJlY3QgbWVyZ2Ugb2YgYWxsIC5oIGZpbGVzKQorCitDaGFuZ2VzIGluIDAuOTkgKDI3IEphbiA5NikKKy0gYWxsb3cgcHJlc2V0IGRpY3Rpb25hcnkgc2hhcmVkIGJldHdlZW4gY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yCistIGFsbG93IGNvbXByZXNzaW9uIGxldmVsIDAgKG5vIGNvbXByZXNzaW9uKQorLSBhZGQgZGVmbGF0ZVBhcmFtcyBpbiB6bGliLmg6IGFsbG93IGR5bmFtaWMgY2hhbmdlIG9mIGNvbXByZXNzaW9uIGxldmVsCisgIGFuZCBjb21wcmVzc2lvbiBzdHJhdGVneS4KKy0gdGVzdCBsYXJnZSBidWZmZXJzIGFuZCBkZWZsYXRlUGFyYW1zIGluIGV4YW1wbGUuYworLSBhZGQgb3B0aW9uYWwgImNvbmZpZ3VyZSIgdG8gYnVpbGQgemxpYiBhcyBhIHNoYXJlZCBsaWJyYXJ5CistIHN1cHByZXNzIE1ha2VmaWxlLnFueCwgdXNlIGNvbmZpZ3VyZSBpbnN0ZWFkCistIGZpeGVkIGRlZmxhdGUgZm9yIDY0LWJpdCBzeXN0ZW1zIChkZXRlY3RlZCBvbiBDcmF5KQorLSBmaXhlZCBpbmZsYXRlX2Jsb2NrcyBmb3IgNjQtYml0IHN5c3RlbXMgKGRldGVjdGVkIG9uIEFscGhhKQorLSBkZWNsYXJlIFpfREVGTEFURUQgaW4gemxpYi5oIChwb3NzaWJsZSBwYXJhbWV0ZXIgZm9yIGRlZmxhdGVJbml0MikKKy0gYWx3YXlzIHJldHVybiBaX0JVRl9FUlJPUiB3aGVuIGRlZmxhdGUoKSBoYXMgbm90aGluZyB0byBkbworLSBkZWZsYXRlSW5pdCBhbmQgaW5mbGF0ZUluaXQgYXJlIG5vdyBtYWNyb3MgdG8gYWxsb3cgdmVyc2lvbiBjaGVja2luZworLSBwcmVmaXggYWxsIGdsb2JhbCBmdW5jdGlvbnMgYW5kIHR5cGVzIHdpdGggel8gd2l0aCAtRFpfUFJFRklYCistIG1ha2UgZmFsbG9jIGNvbXBsZXRlbHkgcmVlbnRyYW50IChpbmZ0cmVlcy5jKQorLSBmaXhlZCB2ZXJ5IHVubGlrZWx5IHJhY2UgY29uZGl0aW9uIGluIGN0X3N0YXRpY19pbml0CistIGZyZWUgaW4gcmV2ZXJzZSBvcmRlciBvZiBhbGxvY2F0aW9uIHRvIGhlbHAgbWVtb3J5IG1hbmFnZXIKKy0gdXNlIHpsaWItMS4wLyogaW5zdGVhZCBvZiB6bGliLyogaW5zaWRlIHRoZSB0YXIuZ3oKKy0gbWFrZSB6bGliIHdhcm5pbmctZnJlZSB3aXRoICJnY2MgLU8zIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGgKKyAgLVdjb252ZXJzaW9uIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMiCistIGFsbG93IGd6cmVhZCBvbiBjb25jYXRlbmF0ZWQgLmd6IGZpbGVzCistIGRlZmxhdGVFbmQgbm93IHJldHVybnMgWl9EQVRBX0VSUk9SIGlmIGl0IHdhcyBwcmVtYXR1cmUKKy0gZGVmbGF0ZSBpcyBmaW5hbGx5ICg/KSBmdWxseSBkZXRlcm1pbmlzdGljIChubyBtYXRjaGVzIGJleW9uZCBlbmQgb2YgaW5wdXQpCistIERvY3VtZW50IFpfU1lOQ19GTFVTSAorLSBhZGQgdW5pbnN0YWxsIGluIE1ha2VmaWxlCistIENoZWNrIGZvciBfX2NwbHVwbHVzIGluIHpsaWIuaAorLSBCZXR0ZXIgdGVzdCBpbiBjdF9hbGlnbiBmb3IgcGFydGlhbCBmbHVzaAorLSBhdm9pZCBoYXJtbGVzcyB3YXJuaW5ncyBmb3IgQm9ybGFuZCBDKysKKy0gaW5pdGlhbGl6ZSBoYXNoX2hlYWQgaW4gZGVmbGF0ZS5jCistIGF2b2lkIHdhcm5pbmcgb24gZmRvcGVuIChnemlvLmMpIGZvciBIUCBjYyAtQWEKKy0gaW5jbHVkZSBzdGRsaWIuaCBmb3IgU1REQyBjb21waWxlcnMKKy0gaW5jbHVkZSBlcnJuby5oIGZvciBDcmF5CistIGlnbm9yZSBlcnJvciBpZiByYW5saWIgZG9lc24ndCBleGlzdAorLSBjYWxsIHJhbmxpYiB0d2ljZSBmb3IgTmVYVFNURVAKKy0gdXNlIGV4ZWNfcHJlZml4IGluc3RlYWQgb2YgcHJlZml4IGZvciBsaWJ6LmEKKy0gcmVuYW1lZCBjdF8qIGFzIF90cl8qIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggYXBwbGljYXRpb25zCistIGNsZWFyIHotPm1zZyBpbiBpbmZsYXRlSW5pdDIgYmVmb3JlIGFueSBlcnJvciByZXR1cm4KKy0gaW5pdGlhbGl6ZSBvcGFxdWUgaW4gZXhhbXBsZS5jLCBnemlvLmMsIGRlZmxhdGUuYyBhbmQgaW5mbGF0ZS5jCistIGZpeGVkIHR5cG8gaW4gemNvbmYuaCAoX0dOVUNfXyA9PiBfX0dOVUNfXykKKy0gY2hlY2sgZm9yIFdJTjMyIGluIHpjb25mLmggYW5kIHp1dGlsLmMgKGF2b2lkIGZhcm1hbGxvYyBpbiAzMi1iaXQgbW9kZSkKKy0gZml4IHR5cG8gaW4gTWFrZV92bXMuY29tIChmJHRybmxubSAtPiBmJGdldHN5aSkKKy0gaW4gZmNhbGxvYywgbm9ybWFsaXplIHBvaW50ZXIgaWYgc2l6ZSA+IDY1NTIwIGJ5dGVzCistIGRvbid0IHVzZSBzcGVjaWFsIGZjYWxsb2MgZm9yIDMyIGJpdCBCb3JsYW5kIEMrKworLSB1c2UgU1REQyBpbnN0ZWFkIG9mIF9fR08zMl9fIHRvIGF2b2lkIHJlZGVjbGFyaW5nIGV4aXQsIGNhbGxvYywgZXRjLi4uCistIHVzZSBaX0JJTkFSWSBpbnN0ZWFkIG9mIEJJTkFSWQorLSBkb2N1bWVudCB0aGF0IGd6Y2xvc2UgYWZ0ZXIgZ3pkb3BlbiB3aWxsIGNsb3NlIHRoZSBmaWxlCistIGFsbG93ICJhIiBhcyBtb2RlIGluIGd6b3Blbi4KKy0gZml4IGVycm9yIGNoZWNraW5nIGluIGd6cmVhZAorLSBhbGxvdyBza2lwcGluZyAuZ3ogZXh0cmEtZmllbGQgb24gcGlwZXMKKy0gYWRkZWQgcmVmZXJlbmNlIHRvIFBlcmwgaW50ZXJmYWNlIGluIFJFQURNRQorLSBwdXQgdGhlIGNyYyB0YWJsZSBpbiBGQVIgZGF0YSAoSSBkaXNsaWtlIG1vcmUgYW5kIG1vcmUgdGhlIG1lZGl1bSBtb2RlbCA6KQorLSBhZGRlZCBnZXRfY3JjX3RhYmxlCistIGFkZGVkIGEgZGltZW5zaW9uIHRvIGFsbCBhcnJheXMgKEJvcmxhbmQgQyBjYW4ndCBjb3VudCkuCistIHdvcmthcm91bmQgQm9ybGFuZCBDIGJ1ZyBpbiBkZWNsYXJhdGlvbiBvZiBpbmZsYXRlX2NvZGVzX25ldyAmIGluZmxhdGVfZmFzdAorLSBndWFyZCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbiBvZiAqLmggKGZvciBwcmVjb21waWxlZCBoZWFkZXIgb24gTWFjKQorLSBXYXRjb20gQyBwcmV0ZW5kcyB0byBiZSBNaWNyb3NvZnQgQyBzbWFsbCBtb2RlbCBldmVuIGluIDMyIGJpdCBtb2RlLgorLSBkb24ndCB1c2UgdW5zaXplZCBhcnJheXMgdG8gYXZvaWQgc2lsbHkgd2FybmluZ3MgYnkgVmlzdWFsIEMrKzoKKyAgICAgd2FybmluZyBDNDc0NjogJ2luZmxhdGVfbWFzaycgOiB1bnNpemVkIGFycmF5IHRyZWF0ZWQgYXMgICdfX2ZhcicKKyAgICAgKHdoYXQncyB3cm9uZyB3aXRoIGZhciBkYXRhIGluIGZhciBtb2RlbD8pLgorLSBkZWZpbmUgZW51bSBvdXQgb2YgaW5mbGF0ZV9ibG9ja3Nfc3RhdGUgdG8gYWxsb3cgY29tcGlsYXRpb24gd2l0aCBDKysKKworQ2hhbmdlcyBpbiAwLjk1ICgxNiBBdWcgOTUpCistIGZpeCBNU0RPUyBzbWFsbCBhbmQgbWVkaXVtIG1vZGVsIChub3cgZWFzaWVyIHRvIGFkYXB0IHRvIGFueSBjb21waWxlcikKKy0gaW5saW5lZCBzZW5kX2JpdHMKKy0gZml4IHRoZSBmaW5hbCAoOi0pIGJ1ZyBmb3IgZGVmbGF0ZSB3aXRoIGZsdXNoIChvdXRwdXQgd2FzIGNvcnJlY3QgYnV0CisgIG5vdCBjb21wbGV0ZWx5IGZsdXNoZWQgaW4gcmFyZSBvY2Nhc2lvbnMpLgorLSBkZWZhdWx0IHdpbmRvdyBzaXplIGlzIHNhbWUgZm9yIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCisgIChpdCdzIG5vdyBzdWZmaWNpZW50IHRvIHNldCBNQVhfV0JJVFMgaW4gemNvbmYuaCkuCistIHZvaWRwIC0+IHZvaWRwZiBhbmQgdm9pZG5wIC0+IHZvaWRwIChmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlcgorICB0eXBlZGVmcyBhbmQgYmVjYXVzZSB2b2lkbnAgd2FzIG5vdCBuZWFyIGluIGxhcmdlIG1vZGVsKS4KKworQ2hhbmdlcyBpbiAwLjk0ICgxMyBBdWcgOTUpCistIHN1cHBvcnQgTVNET1MgbWVkaXVtIG1vZGVsCistIGZpeCBkZWZsYXRlIHdpdGggZmx1c2ggKGNvdWxkIHNvbWV0aW1lcyBnZW5lcmF0ZSBiYWQgb3V0cHV0KQorLSBmaXggZGVmbGF0ZVJlc2V0ICh6bGliIGhlYWRlciB3YXMgaW5jb3JyZWN0bHkgc3VwcHJlc3NlZCkKKy0gYWRkZWQgc3VwcG9ydCBmb3IgVk1TCistIGFsbG93IGEgY29tcHJlc3Npb24gbGV2ZWwgaW4gZ3pvcGVuKCkKKy0gZ3pmbHVzaCBub3cgY2FsbHMgZmZsdXNoCistIEZvciBkZWZsYXRlIHdpdGggZmx1c2gsIGZsdXNoIGV2ZW4gaWYgbm8gbW9yZSBpbnB1dCBpcyBwcm92aWRlZC4KKy0gcmVuYW1lIGxpYmd6LmEgYXMgbGliei5hCistIGF2b2lkIGNvbXBsZXggZXhwcmVzc2lvbiBpbiBpbmZjb2Rlcy5jIHRyaWdnZXJpbmcgVHVyYm8gQyBidWcKKy0gd29yayBhcm91bmQgYSBwcm9ibGVtIHdpdGggZ2NjIG9uIEFscGhhIChpbiBJTlNFUlRfU1RSSU5HKQorLSBkb24ndCB1c2UgaW5saW5lIGZ1bmN0aW9ucyAocHJvYmxlbSB3aXRoIHNvbWUgZ2NjIHZlcnNpb25zKQorLSBhbGxvdyByZW5hbWluZyBvZiBCeXRlLCB1SW50LCBldGMuLi4gd2l0aCAjZGVmaW5lLgorLSBhdm9pZCB3YXJuaW5nIGFib3V0ICh1bnVzZWQpIHBvaW50ZXIgYmVmb3JlIHN0YXJ0IG9mIGFycmF5IGluIGRlZmxhdGUuYworLSBhdm9pZCB2YXJpb3VzIHdhcm5pbmdzIGluIGd6aW8uYywgZXhhbXBsZS5jLCBpbmZibG9jay5jLCBhZGxlcjMyLmMsIHp1dGlsLmMKKy0gYXZvaWQgcmVzZXJ2ZWQgd29yZCAnbmV3JyBpbiB0cmVlcy5jCisKK0NoYW5nZXMgaW4gMC45MyAoMjUgSnVuZSA5NSkKKy0gdGVtcG9yYXJpbHkgZGlzYWJsZSBpbmxpbmUgZnVuY3Rpb25zCistIG1ha2UgZGVmbGF0ZSBkZXRlcm1pbmlzdGljCistIGdpdmUgZW5vdWdoIGxvb2thaGVhZCBmb3IgUEFSVElBTF9GTFVTSAorLSBTZXQgYmluYXJ5IG1vZGUgZm9yIHN0ZGluL3N0ZG91dCBpbiBtaW5pZ3ppcC5jIGZvciBPUy8yCistIGRvbid0IGV2ZW4gdXNlIHNpZ25lZCBjaGFyIGluIGluZmxhdGUgKG5vdCBwb3J0YWJsZSBlbm91Z2gpCistIGZpeCBpbmZsYXRlIG1lbW9yeSBsZWFrIGZvciBzZWdtZW50ZWQgYXJjaGl0ZWN0dXJlcworCitDaGFuZ2VzIGluIDAuOTIgKDMgTWF5IDk1KQorLSBkb24ndCBhc3N1bWUgdGhhdCBjaGFyIGlzIHNpZ25lZCAocHJvYmxlbSBvbiBTR0kpCistIENsZWFyIGJpdCBidWZmZXIgd2hlbiBzdGFydGluZyBhIHN0b3JlZCBibG9jaworLSBubyBtZW1jcHkgb24gUHlyYW1pZAorLSBzdXBwcmVzc2VkIGluZnRlc3QuYworLSBvcHRpbWl6ZWQgZmlsbF93aW5kb3csIHB1dCBsb25nZXN0X21hdGNoIGlubGluZSBmb3IgZ2NjCistIG9wdGltaXplZCBpbmZsYXRlIG9uIHN0b3JlZCBibG9ja3MuCistIHVudGFiaWZ5IGFsbCBzb3VyY2VzIHRvIHNpbXBsaWZ5IHBhdGNoZXMKKworQ2hhbmdlcyBpbiAwLjkxICgyIE1heSA5NSkKKy0gRGVmYXVsdCBNRU1fTEVWRUwgaXMgOCAobm90IDkgZm9yIFVuaXgpIGFzIGRvY3VtZW50ZWQgaW4gemxpYi5oCistIERvY3VtZW50IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGluIHpjb25mLmgKKy0gYWRkZWQgIm1ha2UgaW5zdGFsbCIKKy0gZml4IHN5bmMgc2VhcmNoIGxvZ2ljIGluIGluZmxhdGVTeW5jCistIGRlZmxhdGUoWl9GVUxMX0ZMVVNIKSBub3cgd29ya3MgZXZlbiBpZiBvdXRwdXQgYnVmZmVyIHRvbyBzaG9ydAorLSBhZnRlciBpbmZsYXRlU3luYywgZG9uJ3Qgc2NhcmUgcGVvcGxlIHdpdGgganVzdCAibG8gd29ybGQiCistIGFkZGVkIHN1cHBvcnQgZm9yIERKR1BQCisKK0NoYW5nZXMgaW4gMC45ICgxIE1heSA5NSkKKy0gZG9uJ3QgYXNzdW1lIHRoYXQgemFsbG9jIGNsZWFycyB0aGUgYWxsb2NhdGVkIG1lbW9yeSAodGhlIFR1cmJvQyBidWcKKyAgd2FzIE1hcmsncyBidWcgYWZ0ZXIgYWxsIDopCistIGxldCBhZ2FpbiBnenJlYWQgY29weSB1bmNvbXByZXNzZWQgZGF0YSB1bmNoYW5nZWQgKHdhcyB3b3JraW5nIGluIDAuNzEpCistIGRlZmxhdGUoWl9GVUxMX0ZMVVNIKSwgaW5mbGF0ZVJlc2V0IGFuZCBpbmZsYXRlU3luYyBhcmUgbm93IGZ1bGx5IGltcGxlbWVudGVkCistIGFkZGVkIGEgdGVzdCBvZiBpbmZsYXRlU3luYyBpbiBleGFtcGxlLmMKKy0gbW92ZWQgTUFYX1dCSVRTIHRvIHpjb25mLmggYmVjYXVzZSB1c2VycyBtaWdodCB3YW50IHRvIGNoYW5nZSB0aGF0LgorLSBkb2N1bWVudCBleHBsaWNpdGx5IHRoYXQgemFsbG9jKDY0Sykgb24gTVNET1MgbXVzdCByZXR1cm4gYSBub3JtYWxpemVkCisgIHBvaW50ZXIgKHplcm8gb2Zmc2V0KQorLSBhZGRlZCBNYWtlZmlsZXMgZm9yIE1pY3Jvc29mdCBDLCBUdXJibyBDLCBCb3JsYW5kIEMrKworLSBmYXN0ZXIgY3JjMzIoKQorCitDaGFuZ2VzIGluIDAuOCAoMjkgQXByaWwgOTUpCistIGFkZGVkIGZhc3QgaW5mbGF0ZSAoaW5mZmFzdC5jKQorLSBkZWZsYXRlKFpfRklOSVNIKSBub3cgcmV0dXJucyBaX1NUUkVBTV9FTkQgd2hlbiBkb25lLiBXYXJuaW5nOiB0aGlzCisgIGlzIGluY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzIHZlcnNpb25zIG9mIHpsaWIgd2hpY2ggcmV0dXJuZWQgWl9PSy4KKy0gd29yayBhcm91bmQgYSBUdXJib0MgY29tcGlsZXIgYnVnIChiYWQgY29kZSBmb3IgYiA8PCAwLCBzZWUgaW5mdXRpbC5oKQorICAoYWN0dWFsbHkgdGhhdCB3YXMgbm90IGEgY29tcGlsZXIgYnVnLCBzZWUgMC44MSBhYm92ZSkKKy0gZ3pyZWFkIG5vIGxvbmdlciByZWFkcyBvbmUgZXh0cmEgYnl0ZSBpbiBjZXJ0YWluIGNhc2VzCistIEluIGd6aW8gZGVzdHJveSgpLCBkb24ndCByZWZlcmVuY2UgYSBmcmVlZCBzdHJ1Y3R1cmUKKy0gYXZvaWQgbWFueSB3YXJuaW5ncyBmb3IgTVNET1MKKy0gYXZvaWQgdGhlIEVSUk9SIHN5bWJvbCB3aGljaCBpcyB1c2VkIGJ5IE1TIFdpbmRvd3MKKworQ2hhbmdlcyBpbiAwLjcxICgxNCBBcHJpbCA5NSkKKy0gRml4ZWQgbW9yZSBNU0RPUyBjb21waWxhdGlvbiBwcm9ibGVtcyA6KCBUaGVyZSBpcyBzdGlsbCBhIGJ1ZyB3aXRoCisgIFR1cmJvQyBsYXJnZSBtb2RlbC4KKworQ2hhbmdlcyBpbiAwLjcgKDE0IEFwcmlsIDk1KQorLSBBZGRlZCBmdWxsIGluZmxhdGUgc3VwcG9ydC4KKy0gU2ltcGxpZmllZCB0aGUgY3JjMzIoKSBpbnRlcmZhY2UuIFRoZSBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbmluZworICAob25lJ3MgY29tcGxlbWVudCkgaXMgbm93IGRvbmUgaW5zaWRlIGNyYzMyKCkuIFdBUk5JTkc6IHRoaXMgaXMKKyAgaW5jb21wYXRpYmxlIHdpdGggcHJldmlvdXMgdmVyc2lvbnM7IHNlZSB6bGliLmggZm9yIHRoZSBuZXcgdXNhZ2UuCisKK0NoYW5nZXMgaW4gMC42MSAoMTIgQXByaWwgOTUpCistIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIFR1cmJvQy4gZXhhbXBsZSBhbmQgbWluaWd6aXAgbm93IHdvcmsgb24gTVNET1MuCisKK0NoYW5nZXMgaW4gMC42ICgxMSBBcHJpbCA5NSkKKy0gYWRkZWQgbWluaWd6aXAuYworLSBhZGRlZCBnemRvcGVuIHRvIHJlb3BlbiBhIGZpbGUgZGVzY3JpcHRvciBhcyBnekZpbGUKKy0gYWRkZWQgdHJhbnNwYXJlbnQgcmVhZGluZyBvZiBub24tZ3ppcGVkIGZpbGVzIGluIGd6cmVhZC4KKy0gZml4ZWQgYnVnIGluIGd6cmVhZCAoZG9uJ3QgcmVhZCBjcmMgYXMgZGF0YSkKKy0gZml4ZWQgYnVnIGluIGRlc3Ryb3kgKGd6aW8uYykgKGRvbid0IHJldHVybiBaX1NUUkVBTV9FTkQgZm9yIGd6Y2xvc2UpLgorLSBkb24ndCBhbGxvY2F0ZSBiaWcgYXJyYXlzIGluIHRoZSBzdGFjayAoZm9yIE1TRE9TKQorLSBmaXggc29tZSBNU0RPUyBjb21waWxhdGlvbiBwcm9ibGVtcworCitDaGFuZ2VzIGluIDAuNToKKy0gZG8gcmVhbCBjb21wcmVzc2lvbiBpbiBkZWZsYXRlLmMuIFpfUEFSVElBTF9GTFVTSCBpcyBzdXBwb3J0ZWQgYnV0CisgIG5vdCB5ZXQgWl9GVUxMX0ZMVVNILgorLSBzdXBwb3J0IGRlY29tcHJlc3Npb24gYnV0IG9ubHkgaW4gYSBzaW5nbGUgc3RlcCAoZm9yY2VkIFpfRklOSVNIKQorLSBhZGRlZCBvcGFxdWUgb2JqZWN0IGZvciB6YWxsb2MgYW5kIHpmcmVlLgorLSBhZGRlZCBkZWZsYXRlUmVzZXQgYW5kIGluZmxhdGVSZXNldAorLSBhZGRlZCBhIHZhcmlhYmxlIHpsaWJfdmVyc2lvbiBmb3IgY29uc2lzdGVuY3kgY2hlY2tpbmcuCistIHJlbmFtZWQgdGhlICdmaWx0ZXInIHBhcmFtZXRlciBvZiBkZWZsYXRlSW5pdDIgYXMgJ3N0cmF0ZWd5Jy4KKyAgQWRkZWQgWl9GSUxURVJFRCBhbmQgWl9IVUZGTUFOX09OTFkgY29uc3RhbnRzLgorCitDaGFuZ2VzIGluIDAuNDoKKy0gYXZvaWQgInppcCIgZXZlcnl3aGVyZSwgdXNlIHpsaWIgaW5zdGVhZCBvZiB6aXBsaWIuCistIHN1cHByZXNzIFpfQkxPQ0tfRkxVU0gsIGludGVycHJldCBaX1BBUlRJQUxfRkxVU0ggYXMgYmxvY2sgZmx1c2gKKyAgaWYgY29tcHJlc3Npb24gbWV0aG9kID09IDguCistIGFkZGVkIGFkbGVyMzIgYW5kIGNyYzMyCistIHJlbmFtZWQgZGVmbGF0ZU9wdGlvbnMgYXMgZGVmbGF0ZUluaXQyLCBjYWxsIG9uZSBvciB0aGUgb3RoZXIgYnV0IG5vdCBib3RoCistIGFkZGVkIHRoZSBtZXRob2QgcGFyYW1ldGVyIGZvciBkZWZsYXRlSW5pdDIuCistIGFkZGVkIGluZmxhdGVJbml0MgorLSBzaW1wbGllZCBjb25zaWRlcmFibHkgZGVmbGF0ZUluaXQgYW5kIGluZmxhdGVJbml0IGJ5IG5vdCBzdXBwb3J0aW5nCisgIHVzZXItcHJvdmlkZWQgaGlzdG9yeSBidWZmZXIuIFRoaXMgaXMgc3VwcG9ydGVkIG9ubHkgaW4gZGVmbGF0ZUluaXQyCisgIGFuZCBpbmZsYXRlSW5pdDIuCisKK0NoYW5nZXMgaW4gMC4zOgorLSBwcmVmaXggYWxsIG1hY3JvIG5hbWVzIHdpdGggWl8KKy0gdXNlIFpfRklOSVNIIGluc3RlYWQgb2YgZGVmbGF0ZUVuZCB0byBmaW5pc2ggY29tcHJlc3Npb24uCistIGFkZGVkIFpfSFVGRk1BTl9PTkxZCistIGFkZGVkIGd6ZXJyb3IoKQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvRkFRIGIvemxpYi9zcmMvRkFRCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YjdjZjkKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9GQVEKQEAgLTAsMCArMSwzNjggQEAKKworICAgICAgICAgICAgICAgIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zIGFib3V0IHpsaWIKKworCitJZiB5b3VyIHF1ZXN0aW9uIGlzIG5vdCB0aGVyZSwgcGxlYXNlIGNoZWNrIHRoZSB6bGliIGhvbWUgcGFnZQoraHR0cDovL3psaWIubmV0LyB3aGljaCBtYXkgaGF2ZSBtb3JlIHJlY2VudCBpbmZvcm1hdGlvbi4KK1RoZSBsYXN0ZXN0IHpsaWIgRkFRIGlzIGF0IGh0dHA6Ly96bGliLm5ldC96bGliX2ZhcS5odG1sCisKKworIDEuIElzIHpsaWIgWTJLLWNvbXBsaWFudD8KKworICAgIFllcy4gemxpYiBkb2Vzbid0IGhhbmRsZSBkYXRlcy4KKworIDIuIFdoZXJlIGNhbiBJIGdldCBhIFdpbmRvd3MgRExMIHZlcnNpb24/CisKKyAgICBUaGUgemxpYiBzb3VyY2VzIGNhbiBiZSBjb21waWxlZCB3aXRob3V0IGNoYW5nZSB0byBwcm9kdWNlIGEgRExMLiAgU2VlIHRoZQorICAgIGZpbGUgd2luMzIvRExMX0ZBUS50eHQgaW4gdGhlIHpsaWIgZGlzdHJpYnV0aW9uLiAgUG9pbnRlcnMgdG8gdGhlCisgICAgcHJlY29tcGlsZWQgRExMIGFyZSBmb3VuZCBpbiB0aGUgemxpYiB3ZWIgc2l0ZSBhdCBodHRwOi8vemxpYi5uZXQvIC4KKworIDMuIFdoZXJlIGNhbiBJIGdldCBhIFZpc3VhbCBCYXNpYyBpbnRlcmZhY2UgdG8gemxpYj8KKworICAgIFNlZQorICAgICAgICAqIGh0dHA6Ly9tYXJrbmVsc29uLnVzLzE5OTcvMDEvMDEvemxpYi1lbmdpbmUvCisgICAgICAgICogd2luMzIvRExMX0ZBUS50eHQgaW4gdGhlIHpsaWIgZGlzdHJpYnV0aW9uCisKKyA0LiBjb21wcmVzcygpIHJldHVybnMgWl9CVUZfRVJST1IuCisKKyAgICBNYWtlIHN1cmUgdGhhdCBiZWZvcmUgdGhlIGNhbGwgb2YgY29tcHJlc3MoKSwgdGhlIGxlbmd0aCBvZiB0aGUgY29tcHJlc3NlZAorICAgIGJ1ZmZlciBpcyBlcXVhbCB0byB0aGUgYXZhaWxhYmxlIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgYnVmZmVyIGFuZCBub3QKKyAgICB6ZXJvLiAgRm9yIFZpc3VhbCBCYXNpYywgY2hlY2sgdGhhdCB0aGlzIHBhcmFtZXRlciBpcyBwYXNzZWQgYnkgcmVmZXJlbmNlCisgICAgKCJhcyBhbnkiKSwgbm90IGJ5IHZhbHVlICgiYXMgbG9uZyIpLgorCisgNS4gZGVmbGF0ZSgpIG9yIGluZmxhdGUoKSByZXR1cm5zIFpfQlVGX0VSUk9SLgorCisgICAgQmVmb3JlIG1ha2luZyB0aGUgY2FsbCwgbWFrZSBzdXJlIHRoYXQgYXZhaWxfaW4gYW5kIGF2YWlsX291dCBhcmUgbm90IHplcm8uCisgICAgV2hlbiBzZXR0aW5nIHRoZSBwYXJhbWV0ZXIgZmx1c2ggZXF1YWwgdG8gWl9GSU5JU0gsIGFsc28gbWFrZSBzdXJlIHRoYXQKKyAgICBhdmFpbF9vdXQgaXMgYmlnIGVub3VnaCB0byBhbGxvdyBwcm9jZXNzaW5nIGFsbCBwZW5kaW5nIGlucHV0LiAgTm90ZSB0aGF0IGEKKyAgICBaX0JVRl9FUlJPUiBpcyBub3QgZmF0YWwtLWFub3RoZXIgY2FsbCB0byBkZWZsYXRlKCkgb3IgaW5mbGF0ZSgpIGNhbiBiZQorICAgIG1hZGUgd2l0aCBtb3JlIGlucHV0IG9yIG91dHB1dCBzcGFjZS4gIEEgWl9CVUZfRVJST1IgbWF5IGluIGZhY3QgYmUKKyAgICB1bmF2b2lkYWJsZSBkZXBlbmRpbmcgb24gaG93IHRoZSBmdW5jdGlvbnMgYXJlIHVzZWQsIHNpbmNlIGl0IGlzIG5vdAorICAgIHBvc3NpYmxlIHRvIHRlbGwgd2hldGhlciBvciBub3QgdGhlcmUgaXMgbW9yZSBvdXRwdXQgcGVuZGluZyB3aGVuCisgICAgc3RybS5hdmFpbF9vdXQgcmV0dXJucyB3aXRoIHplcm8uICBTZWUgaHR0cDovL3psaWIubmV0L3psaWJfaG93Lmh0bWwgZm9yIGEKKyAgICBoZWF2aWx5IGFubm90YXRlZCBleGFtcGxlLgorCisgNi4gV2hlcmUncyB0aGUgemxpYiBkb2N1bWVudGF0aW9uIChtYW4gcGFnZXMsIGV0Yy4pPworCisgICAgSXQncyBpbiB6bGliLmggLiAgRXhhbXBsZXMgb2YgemxpYiB1c2FnZSBhcmUgaW4gdGhlIGZpbGVzIHRlc3QvZXhhbXBsZS5jCisgICAgYW5kIHRlc3QvbWluaWd6aXAuYywgd2l0aCBtb3JlIGluIGV4YW1wbGVzLyAuCisKKyA3LiBXaHkgZG9uJ3QgeW91IHVzZSBHTlUgYXV0b2NvbmYgb3IgbGlidG9vbCBvciAuLi4/CisKKyAgICBCZWNhdXNlIHdlIHdvdWxkIGxpa2UgdG8ga2VlcCB6bGliIGFzIGEgdmVyeSBzbWFsbCBhbmQgc2ltcGxlIHBhY2thZ2UuCisgICAgemxpYiBpcyByYXRoZXIgcG9ydGFibGUgYW5kIGRvZXNuJ3QgbmVlZCBtdWNoIGNvbmZpZ3VyYXRpb24uCisKKyA4LiBJIGZvdW5kIGEgYnVnIGluIHpsaWIuCisKKyAgICBNb3N0IG9mIHRoZSB0aW1lLCBzdWNoIHByb2JsZW1zIGFyZSBkdWUgdG8gYW4gaW5jb3JyZWN0IHVzYWdlIG9mIHpsaWIuCisgICAgUGxlYXNlIHRyeSB0byByZXByb2R1Y2UgdGhlIHByb2JsZW0gd2l0aCBhIHNtYWxsIHByb2dyYW0gYW5kIHNlbmQgdGhlCisgICAgY29ycmVzcG9uZGluZyBzb3VyY2UgdG8gdXMgYXQgemxpYkBnemlwLm9yZyAuICBEbyBub3Qgc2VuZCBtdWx0aS1tZWdhYnl0ZQorICAgIGRhdGEgZmlsZXMgd2l0aG91dCBwcmlvciBhZ3JlZW1lbnQuCisKKyA5LiBXaHkgZG8gSSBnZXQgInVuZGVmaW5lZCByZWZlcmVuY2UgdG8gZ3pwdXRjIj8KKworICAgIElmICJtYWtlIHRlc3QiIHByb2R1Y2VzIHNvbWV0aGluZyBsaWtlCisKKyAgICAgICBleGFtcGxlLm8oLnRleHQrMHgxNTQpOiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGBnenB1dGMnCisKKyAgICBjaGVjayB0aGF0IHlvdSBkb24ndCBoYXZlIG9sZCBmaWxlcyBsaWJ6LiogaW4gL3Vzci9saWIsIC91c3IvbG9jYWwvbGliIG9yCisgICAgL3Vzci9YMTFSNi9saWIuIFJlbW92ZSBhbnkgb2xkIHZlcnNpb25zLCB0aGVuIGRvICJtYWtlIGluc3RhbGwiLgorCisxMC4gSSBuZWVkIGEgRGVscGhpIGludGVyZmFjZSB0byB6bGliLgorCisgICAgU2VlIHRoZSBjb250cmliL2RlbHBoaSBkaXJlY3RvcnkgaW4gdGhlIHpsaWIgZGlzdHJpYnV0aW9uLgorCisxMS4gQ2FuIHpsaWIgaGFuZGxlIC56aXAgYXJjaGl2ZXM/CisKKyAgICBOb3QgYnkgaXRzZWxmLCBuby4gIFNlZSB0aGUgZGlyZWN0b3J5IGNvbnRyaWIvbWluaXppcCBpbiB0aGUgemxpYgorICAgIGRpc3RyaWJ1dGlvbi4KKworMTIuIENhbiB6bGliIGhhbmRsZSAuWiBmaWxlcz8KKworICAgIE5vLCBzb3JyeS4gIFlvdSBoYXZlIHRvIHNwYXduIGFuIHVuY29tcHJlc3Mgb3IgZ3VuemlwIHN1YnByb2Nlc3MsIG9yIGFkYXB0CisgICAgdGhlIGNvZGUgb2YgdW5jb21wcmVzcyBvbiB5b3VyIG93bi4KKworMTMuIEhvdyBjYW4gSSBtYWtlIGEgVW5peCBzaGFyZWQgbGlicmFyeT8KKworICAgIEJ5IGRlZmF1bHQgYSBzaGFyZWQgKGFuZCBhIHN0YXRpYykgbGlicmFyeSBpcyBidWlsdCBmb3IgVW5peC4gIFNvOgorCisgICAgbWFrZSBkaXN0Y2xlYW4KKyAgICAuL2NvbmZpZ3VyZQorICAgIG1ha2UKKworMTQuIEhvdyBkbyBJIGluc3RhbGwgYSBzaGFyZWQgemxpYiBsaWJyYXJ5IG9uIFVuaXg/CisKKyAgICBBZnRlciB0aGUgYWJvdmUsIHRoZW46CisKKyAgICBtYWtlIGluc3RhbGwKKworICAgIEhvd2V2ZXIsIG1hbnkgZmxhdm9ycyBvZiBVbml4IGNvbWUgd2l0aCBhIHNoYXJlZCB6bGliIGFscmVhZHkgaW5zdGFsbGVkLgorICAgIEJlZm9yZSBnb2luZyB0byB0aGUgdHJvdWJsZSBvZiBjb21waWxpbmcgYSBzaGFyZWQgdmVyc2lvbiBvZiB6bGliIGFuZAorICAgIHRyeWluZyB0byBpbnN0YWxsIGl0LCB5b3UgbWF5IHdhbnQgdG8gY2hlY2sgaWYgaXQncyBhbHJlYWR5IHRoZXJlISAgSWYgeW91CisgICAgY2FuICNpbmNsdWRlIDx6bGliLmg+LCBpdCdzIHRoZXJlLiAgVGhlIC1seiBvcHRpb24gd2lsbCBwcm9iYWJseSBsaW5rIHRvCisgICAgaXQuICBZb3UgY2FuIGNoZWNrIHRoZSB2ZXJzaW9uIGF0IHRoZSB0b3Agb2YgemxpYi5oIG9yIHdpdGggdGhlCisgICAgWkxJQl9WRVJTSU9OIHN5bWJvbCBkZWZpbmVkIGluIHpsaWIuaCAuCisKKzE1LiBJIGhhdmUgYSBxdWVzdGlvbiBhYm91dCBPdHRvUERGLgorCisgICAgV2UgYXJlIG5vdCB0aGUgYXV0aG9ycyBvZiBPdHRvUERGLiBUaGUgcmVhbCBhdXRob3IgaXMgb24gdGhlIE90dG9QREYgd2ViCisgICAgc2l0ZTogSm9lbCBIYWlubGV5LCBqaGFpbmxleUBteW5ka3J5bWUuY29tLgorCisxNi4gQ2FuIHpsaWIgZGVjb2RlIEZsYXRlIGRhdGEgaW4gYW4gQWRvYmUgUERGIGZpbGU/CisKKyAgICBZZXMuIFNlZSBodHRwOi8vd3d3LnBkZmxpYi5jb20vIC4gVG8gbW9kaWZ5IFBERiBmb3Jtcywgc2VlCisgICAgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9hY3JvZm9ybXRvb2wvIC4KKworMTcuIFdoeSBhbSBJIGdldHRpbmcgdGhpcyAicmVnaXN0ZXJfZnJhbWVfaW5mbyBub3QgZm91bmQiIGVycm9yIG9uIFNvbGFyaXM/CisKKyAgICBBZnRlciBpbnN0YWxsaW5nIHpsaWIgMS4xLjQgb24gU29sYXJpcyAyLjYsIHJ1bm5pbmcgYXBwbGljYXRpb25zIHVzaW5nIHpsaWIKKyAgICBnZW5lcmF0ZXMgYW4gZXJyb3Igc3VjaCBhczoKKworICAgICAgICBsZC5zby4xOiBycG06IGZhdGFsOiByZWxvY2F0aW9uIGVycm9yOiBmaWxlIC91c3IvbG9jYWwvbGliL2xpYnouc286CisgICAgICAgIHN5bWJvbCBfX3JlZ2lzdGVyX2ZyYW1lX2luZm86IHJlZmVyZW5jZWQgc3ltYm9sIG5vdCBmb3VuZAorCisgICAgVGhlIHN5bWJvbCBfX3JlZ2lzdGVyX2ZyYW1lX2luZm8gaXMgbm90IHBhcnQgb2YgemxpYiwgaXQgaXMgZ2VuZXJhdGVkIGJ5CisgICAgdGhlIEMgY29tcGlsZXIgKGNjIG9yIGdjYykuICBZb3UgbXVzdCByZWNvbXBpbGUgYXBwbGljYXRpb25zIHVzaW5nIHpsaWIKKyAgICB3aGljaCBoYXZlIHRoaXMgcHJvYmxlbS4gIFRoaXMgcHJvYmxlbSBpcyBzcGVjaWZpYyB0byBTb2xhcmlzLiAgU2VlCisgICAgaHR0cDovL3d3dy5zdW5mcmVld2FyZS5jb20gZm9yIFNvbGFyaXMgdmVyc2lvbnMgb2YgemxpYiBhbmQgYXBwbGljYXRpb25zCisgICAgdXNpbmcgemxpYi4KKworMTguIFdoeSBkb2VzIGd6aXAgZ2l2ZSBhbiBlcnJvciBvbiBhIGZpbGUgSSBtYWtlIHdpdGggY29tcHJlc3MvZGVmbGF0ZT8KKworICAgIFRoZSBjb21wcmVzcyBhbmQgZGVmbGF0ZSBmdW5jdGlvbnMgcHJvZHVjZSBkYXRhIGluIHRoZSB6bGliIGZvcm1hdCwgd2hpY2gKKyAgICBpcyBkaWZmZXJlbnQgYW5kIGluY29tcGF0aWJsZSB3aXRoIHRoZSBnemlwIGZvcm1hdC4gIFRoZSBneiogZnVuY3Rpb25zIGluCisgICAgemxpYiBvbiB0aGUgb3RoZXIgaGFuZCB1c2UgdGhlIGd6aXAgZm9ybWF0LiAgQm90aCB0aGUgemxpYiBhbmQgZ3ppcCBmb3JtYXRzCisgICAgdXNlIHRoZSBzYW1lIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQgaW50ZXJuYWxseSwgYnV0IGhhdmUgZGlmZmVyZW50IGhlYWRlcnMKKyAgICBhbmQgdHJhaWxlcnMgYXJvdW5kIHRoZSBjb21wcmVzc2VkIGRhdGEuCisKKzE5LiBPaywgc28gd2h5IGFyZSB0aGVyZSB0d28gZGlmZmVyZW50IGZvcm1hdHM/CisKKyAgICBUaGUgZ3ppcCBmb3JtYXQgd2FzIGRlc2lnbmVkIHRvIHJldGFpbiB0aGUgZGlyZWN0b3J5IGluZm9ybWF0aW9uIGFib3V0IGEKKyAgICBzaW5nbGUgZmlsZSwgc3VjaCBhcyB0aGUgbmFtZSBhbmQgbGFzdCBtb2RpZmljYXRpb24gZGF0ZS4gIFRoZSB6bGliIGZvcm1hdAorICAgIG9uIHRoZSBvdGhlciBoYW5kIHdhcyBkZXNpZ25lZCBmb3IgaW4tbWVtb3J5IGFuZCBjb21tdW5pY2F0aW9uIGNoYW5uZWwKKyAgICBhcHBsaWNhdGlvbnMsIGFuZCBoYXMgYSBtdWNoIG1vcmUgY29tcGFjdCBoZWFkZXIgYW5kIHRyYWlsZXIgYW5kIHVzZXMgYQorICAgIGZhc3RlciBpbnRlZ3JpdHkgY2hlY2sgdGhhbiBnemlwLgorCisyMC4gV2VsbCB0aGF0J3MgbmljZSwgYnV0IGhvdyBkbyBJIG1ha2UgYSBnemlwIGZpbGUgaW4gbWVtb3J5PworCisgICAgWW91IGNhbiByZXF1ZXN0IHRoYXQgZGVmbGF0ZSB3cml0ZSB0aGUgZ3ppcCBmb3JtYXQgaW5zdGVhZCBvZiB0aGUgemxpYgorICAgIGZvcm1hdCB1c2luZyBkZWZsYXRlSW5pdDIoKS4gIFlvdSBjYW4gYWxzbyByZXF1ZXN0IHRoYXQgaW5mbGF0ZSBkZWNvZGUgdGhlCisgICAgZ3ppcCBmb3JtYXQgdXNpbmcgaW5mbGF0ZUluaXQyKCkuICBSZWFkIHpsaWIuaCBmb3IgbW9yZSBkZXRhaWxzLgorCisyMS4gSXMgemxpYiB0aHJlYWQtc2FmZT8KKworICAgIFllcy4gIEhvd2V2ZXIgYW55IGxpYnJhcnkgcm91dGluZXMgdGhhdCB6bGliIHVzZXMgYW5kIGFueSBhcHBsaWNhdGlvbi0KKyAgICBwcm92aWRlZCBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyBtdXN0IGFsc28gYmUgdGhyZWFkLXNhZmUuICB6bGliJ3MgZ3oqCisgICAgZnVuY3Rpb25zIHVzZSBzdGRpbyBsaWJyYXJ5IHJvdXRpbmVzLCBhbmQgbW9zdCBvZiB6bGliJ3MgZnVuY3Rpb25zIHVzZSB0aGUKKyAgICBsaWJyYXJ5IG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIGJ5IGRlZmF1bHQuICB6bGliJ3MgKkluaXQqIGZ1bmN0aW9ucworICAgIGFsbG93IGZvciB0aGUgYXBwbGljYXRpb24gdG8gcHJvdmlkZSBjdXN0b20gbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMuCisKKyAgICBPZiBjb3Vyc2UsIHlvdSBzaG91bGQgb25seSBvcGVyYXRlIG9uIGFueSBnaXZlbiB6bGliIG9yIGd6aXAgc3RyZWFtIGZyb20gYQorICAgIHNpbmdsZSB0aHJlYWQgYXQgYSB0aW1lLgorCisyMi4gQ2FuIEkgdXNlIHpsaWIgaW4gbXkgY29tbWVyY2lhbCBhcHBsaWNhdGlvbj8KKworICAgIFllcy4gIFBsZWFzZSByZWFkIHRoZSBsaWNlbnNlIGluIHpsaWIuaC4KKworMjMuIElzIHpsaWIgdW5kZXIgdGhlIEdOVSBsaWNlbnNlPworCisgICAgTm8uICBQbGVhc2UgcmVhZCB0aGUgbGljZW5zZSBpbiB6bGliLmguCisKKzI0LiBUaGUgbGljZW5zZSBzYXlzIHRoYXQgYWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSAicGxhaW5seSBtYXJrZWQiLiBTbworICAgIHdoYXQgZXhhY3RseSBkbyBJIG5lZWQgdG8gZG8gdG8gbWVldCB0aGF0IHJlcXVpcmVtZW50PworCisgICAgWW91IG5lZWQgdG8gY2hhbmdlIHRoZSBaTElCX1ZFUlNJT04gYW5kIFpMSUJfVkVSTlVNICNkZWZpbmVzIGluIHpsaWIuaC4gIEluCisgICAgcGFydGljdWxhciwgdGhlIGZpbmFsIHZlcnNpb24gbnVtYmVyIG5lZWRzIHRvIGJlIGNoYW5nZWQgdG8gImYiLCBhbmQgYW4KKyAgICBpZGVudGlmaWNhdGlvbiBzdHJpbmcgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIFpMSUJfVkVSU0lPTi4gIFZlcnNpb24gbnVtYmVycworICAgIHgueC54LmYgYXJlIHJlc2VydmVkIGZvciBtb2RpZmljYXRpb25zIHRvIHpsaWIgYnkgb3RoZXJzIHRoYW4gdGhlIHpsaWIKKyAgICBtYWludGFpbmVycy4gIEZvciBleGFtcGxlLCBpZiB0aGUgdmVyc2lvbiBvZiB0aGUgYmFzZSB6bGliIHlvdSBhcmUgYWx0ZXJpbmcKKyAgICBpcyAiMS4yLjMuNCIsIHRoZW4gaW4gemxpYi5oIHlvdSBzaG91bGQgY2hhbmdlIFpMSUJfVkVSTlVNIHRvIDB4MTIzZiwgYW5kCisgICAgWkxJQl9WRVJTSU9OIHRvIHNvbWV0aGluZyBsaWtlICIxLjIuMy5mLXphY2hhcnktbW9kcy12MyIuICBZb3UgY2FuIGFsc28KKyAgICB1cGRhdGUgdGhlIHZlcnNpb24gc3RyaW5ncyBpbiBkZWZsYXRlLmMgYW5kIGluZnRyZWVzLmMuCisKKyAgICBGb3IgYWx0ZXJlZCBzb3VyY2UgZGlzdHJpYnV0aW9ucywgeW91IHNob3VsZCBhbHNvIG5vdGUgdGhlIG9yaWdpbiBhbmQKKyAgICBuYXR1cmUgb2YgdGhlIGNoYW5nZXMgaW4gemxpYi5oLCBhcyB3ZWxsIGFzIGluIENoYW5nZUxvZyBhbmQgUkVBRE1FLCBhbG9uZworICAgIHdpdGggdGhlIGRhdGVzIG9mIHRoZSBhbHRlcmF0aW9ucy4gIFRoZSBvcmlnaW4gc2hvdWxkIGluY2x1ZGUgYXQgbGVhc3QgeW91cgorICAgIG5hbWUgKG9yIHlvdXIgY29tcGFueSdzIG5hbWUpLCBhbmQgYW4gZW1haWwgYWRkcmVzcyB0byBjb250YWN0IGZvciBoZWxwIG9yCisgICAgaXNzdWVzIHdpdGggdGhlIGxpYnJhcnkuCisKKyAgICBOb3RlIHRoYXQgZGlzdHJpYnV0aW5nIGEgY29tcGlsZWQgemxpYiBsaWJyYXJ5IGFsb25nIHdpdGggemxpYi5oIGFuZAorICAgIHpjb25mLmggaXMgYWxzbyBhIHNvdXJjZSBkaXN0cmlidXRpb24sIGFuZCBzbyB5b3Ugc2hvdWxkIGNoYW5nZQorICAgIFpMSUJfVkVSU0lPTiBhbmQgWkxJQl9WRVJOVU0gYW5kIG5vdGUgdGhlIG9yaWdpbiBhbmQgbmF0dXJlIG9mIHRoZSBjaGFuZ2VzCisgICAgaW4gemxpYi5oIGFzIHlvdSB3b3VsZCBmb3IgYSBmdWxsIHNvdXJjZSBkaXN0cmlidXRpb24uCisKKzI1LiBXaWxsIHpsaWIgd29yayBvbiBhIGJpZy1lbmRpYW4gb3IgbGl0dGxlLWVuZGlhbiBhcmNoaXRlY3R1cmUsIGFuZCBjYW4gSQorICAgIGV4Y2hhbmdlIGNvbXByZXNzZWQgZGF0YSBiZXR3ZWVuIHRoZW0/CisKKyAgICBZZXMgYW5kIHllcy4KKworMjYuIFdpbGwgemxpYiB3b3JrIG9uIGEgNjQtYml0IG1hY2hpbmU/CisKKyAgICBZZXMuICBJdCBoYXMgYmVlbiB0ZXN0ZWQgb24gNjQtYml0IG1hY2hpbmVzLCBhbmQgaGFzIG5vIGRlcGVuZGVuY2Ugb24gYW55CisgICAgZGF0YSB0eXBlcyBiZWluZyBsaW1pdGVkIHRvIDMyLWJpdHMgaW4gbGVuZ3RoLiAgSWYgeW91IGhhdmUgYW55CisgICAgZGlmZmljdWx0aWVzLCBwbGVhc2UgcHJvdmlkZSBhIGNvbXBsZXRlIHByb2JsZW0gcmVwb3J0IHRvIHpsaWJAZ3ppcC5vcmcKKworMjcuIFdpbGwgemxpYiBkZWNvbXByZXNzIGRhdGEgZnJvbSB0aGUgUEtXYXJlIERhdGEgQ29tcHJlc3Npb24gTGlicmFyeT8KKworICAgIE5vLiAgVGhlIFBLV2FyZSBEQ0wgdXNlcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IGNvbXByZXNzZWQgZGF0YSBmb3JtYXQgdGhhbgorICAgIGRvZXMgUEtaSVAgYW5kIHpsaWIuICBIb3dldmVyLCB5b3UgY2FuIGxvb2sgaW4gemxpYidzIGNvbnRyaWIvYmxhc3QKKyAgICBkaXJlY3RvcnkgZm9yIGEgcG9zc2libGUgc29sdXRpb24gdG8geW91ciBwcm9ibGVtLgorCisyOC4gQ2FuIEkgYWNjZXNzIGRhdGEgcmFuZG9tbHkgaW4gYSBjb21wcmVzc2VkIHN0cmVhbT8KKworICAgIE5vLCBub3Qgd2l0aG91dCBzb21lIHByZXBhcmF0aW9uLiAgSWYgd2hlbiBjb21wcmVzc2luZyB5b3UgcGVyaW9kaWNhbGx5IHVzZQorICAgIFpfRlVMTF9GTFVTSCwgY2FyZWZ1bGx5IHdyaXRlIGFsbCB0aGUgcGVuZGluZyBkYXRhIGF0IHRob3NlIHBvaW50cywgYW5kCisgICAga2VlcCBhbiBpbmRleCBvZiB0aG9zZSBsb2NhdGlvbnMsIHRoZW4geW91IGNhbiBzdGFydCBkZWNvbXByZXNzaW9uIGF0IHRob3NlCisgICAgcG9pbnRzLiAgWW91IGhhdmUgdG8gYmUgY2FyZWZ1bCB0byBub3QgdXNlIFpfRlVMTF9GTFVTSCB0b28gb2Z0ZW4sIHNpbmNlIGl0CisgICAgY2FuIHNpZ25pZmljYW50bHkgZGVncmFkZSBjb21wcmVzc2lvbi4gIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc2NhbiBhCisgICAgZGVmbGF0ZSBzdHJlYW0gb25jZSB0byBnZW5lcmF0ZSBhbiBpbmRleCwgYW5kIHRoZW4gdXNlIHRoYXQgaW5kZXggZm9yCisgICAgcmFuZG9tIGFjY2Vzcy4gIFNlZSBleGFtcGxlcy96cmFuLmMgLgorCisyOS4gRG9lcyB6bGliIHdvcmsgb24gTVZTLCBPUy8zOTAsIENJQ1MsIGV0Yy4/CisKKyAgICBJdCBoYXMgaW4gdGhlIHBhc3QsIGJ1dCB3ZSBoYXZlIG5vdCBoZWFyZCBvZiBhbnkgcmVjZW50IGV2aWRlbmNlLiAgVGhlcmUKKyAgICB3ZXJlIHdvcmtpbmcgcG9ydHMgb2YgemxpYiAxLjEuNCB0byBNVlMsIGJ1dCB0aG9zZSBsaW5rcyBubyBsb25nZXIgd29yay4KKyAgICBJZiB5b3Uga25vdyBvZiByZWNlbnQsIHN1Y2Nlc3NmdWwgYXBwbGljYXRpb25zIG9mIHpsaWIgb24gdGhlc2Ugb3BlcmF0aW5nCisgICAgc3lzdGVtcywgcGxlYXNlIGxldCB1cyBrbm93LiAgVGhhbmtzLgorCiszMC4gSXMgdGhlcmUgc29tZSBzaW1wbGVyLCBlYXNpZXIgdG8gcmVhZCB2ZXJzaW9uIG9mIGluZmxhdGUgSSBjYW4gbG9vayBhdCB0bworICAgIHVuZGVyc3RhbmQgdGhlIGRlZmxhdGUgZm9ybWF0PworCisgICAgRmlyc3Qgb2ZmLCB5b3Ugc2hvdWxkIHJlYWQgUkZDIDE5NTEuICBTZWNvbmQsIHllcy4gIExvb2sgaW4gemxpYidzCisgICAgY29udHJpYi9wdWZmIGRpcmVjdG9yeS4KKworMzEuIERvZXMgemxpYiBpbmZyaW5nZSBvbiBhbnkgcGF0ZW50cz8KKworICAgIEFzIGZhciBhcyB3ZSBrbm93LCBuby4gIEluIGZhY3QsIHRoYXQgd2FzIG9yaWdpbmFsbHkgdGhlIHdob2xlIHBvaW50IGJlaGluZAorICAgIHpsaWIuICBMb29rIGhlcmUgZm9yIHNvbWUgbW9yZSBpbmZvcm1hdGlvbjoKKworICAgIGh0dHA6Ly93d3cuZ3ppcC5vcmcvI2ZhcTExCisKKzMyLiBDYW4gemxpYiB3b3JrIHdpdGggZ3JlYXRlciB0aGFuIDQgR0Igb2YgZGF0YT8KKworICAgIFllcy4gIGluZmxhdGUoKSBhbmQgZGVmbGF0ZSgpIHdpbGwgcHJvY2VzcyBhbnkgYW1vdW50IG9mIGRhdGEgY29ycmVjdGx5LgorICAgIEVhY2ggY2FsbCBvZiBpbmZsYXRlKCkgb3IgZGVmbGF0ZSgpIGlzIGxpbWl0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCBjaHVua3MKKyAgICBvZiB0aGUgbWF4aW11bSB2YWx1ZSB0aGF0IGNhbiBiZSBzdG9yZWQgaW4gdGhlIGNvbXBpbGVyJ3MgInVuc2lnbmVkIGludCIKKyAgICB0eXBlLCBidXQgdGhlcmUgaXMgbm8gbGltaXQgdG8gdGhlIG51bWJlciBvZiBjaHVua3MuICBOb3RlIGhvd2V2ZXIgdGhhdCB0aGUKKyAgICBzdHJtLnRvdGFsX2luIGFuZCBzdHJtX3RvdGFsX291dCBjb3VudGVycyBtYXkgYmUgbGltaXRlZCB0byA0IEdCLiAgVGhlc2UKKyAgICBjb3VudGVycyBhcmUgcHJvdmlkZWQgYXMgYSBjb252ZW5pZW5jZSBhbmQgYXJlIG5vdCB1c2VkIGludGVybmFsbHkgYnkKKyAgICBpbmZsYXRlKCkgb3IgZGVmbGF0ZSgpLiAgVGhlIGFwcGxpY2F0aW9uIGNhbiBlYXNpbHkgc2V0IHVwIGl0cyBvd24gY291bnRlcnMKKyAgICB1cGRhdGVkIGFmdGVyIGVhY2ggY2FsbCBvZiBpbmZsYXRlKCkgb3IgZGVmbGF0ZSgpIHRvIGNvdW50IGJleW9uZCA0IEdCLgorICAgIGNvbXByZXNzKCkgYW5kIHVuY29tcHJlc3MoKSBtYXkgYmUgbGltaXRlZCB0byA0IEdCLCBzaW5jZSB0aGV5IG9wZXJhdGUgaW4gYQorICAgIHNpbmdsZSBjYWxsLiAgZ3pzZWVrKCkgYW5kIGd6dGVsbCgpIG1heSBiZSBsaW1pdGVkIHRvIDQgR0IgZGVwZW5kaW5nIG9uIGhvdworICAgIHpsaWIgaXMgY29tcGlsZWQuICBTZWUgdGhlIHpsaWJDb21waWxlRmxhZ3MoKSBmdW5jdGlvbiBpbiB6bGliLmguCisKKyAgICBUaGUgd29yZCAibWF5IiBhcHBlYXJzIHNldmVyYWwgdGltZXMgYWJvdmUgc2luY2UgdGhlcmUgaXMgYSA0IEdCIGxpbWl0IG9ubHkKKyAgICBpZiB0aGUgY29tcGlsZXIncyAibG9uZyIgdHlwZSBpcyAzMiBiaXRzLiAgSWYgdGhlIGNvbXBpbGVyJ3MgImxvbmciIHR5cGUgaXMKKyAgICA2NCBiaXRzLCB0aGVuIHRoZSBsaW1pdCBpcyAxNiBleGFieXRlcy4KKworMzMuIERvZXMgemxpYiBoYXZlIGFueSBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXM/CisKKyAgICBUaGUgb25seSBvbmUgdGhhdCB3ZSBhcmUgYXdhcmUgb2YgaXMgcG90ZW50aWFsbHkgaW4gZ3pwcmludGYoKS4gIElmIHpsaWIgaXMKKyAgICBjb21waWxlZCB0byB1c2Ugc3ByaW50ZigpIG9yIHZzcHJpbnRmKCksIHRoZW4gdGhlcmUgaXMgbm8gcHJvdGVjdGlvbgorICAgIGFnYWluc3QgYSBidWZmZXIgb3ZlcmZsb3cgb2YgYW4gOEsgc3RyaW5nIHNwYWNlIChvciBvdGhlciB2YWx1ZSBhcyBzZXQgYnkKKyAgICBnemJ1ZmZlcigpKSwgb3RoZXIgdGhhbiB0aGUgY2FsbGVyIG9mIGd6cHJpbnRmKCkgYXNzdXJpbmcgdGhhdCB0aGUgb3V0cHV0CisgICAgd2lsbCBub3QgZXhjZWVkIDhLLiAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHpsaWIgaXMgY29tcGlsZWQgdG8gdXNlCisgICAgc25wcmludGYoKSBvciB2c25wcmludGYoKSwgd2hpY2ggc2hvdWxkIG5vcm1hbGx5IGJlIHRoZSBjYXNlLCB0aGVuIHRoZXJlIGlzCisgICAgbm8gdnVsbmVyYWJpbGl0eS4gIFRoZSAuL2NvbmZpZ3VyZSBzY3JpcHQgd2lsbCBkaXNwbGF5IHdhcm5pbmdzIGlmIGFuCisgICAgaW5zZWN1cmUgdmFyaWF0aW9uIG9mIHNwcmludGYoKSB3aWxsIGJlIHVzZWQgYnkgZ3pwcmludGYoKS4gIEFsc28gdGhlCisgICAgemxpYkNvbXBpbGVGbGFncygpIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGluZm9ybWF0aW9uIG9uIHdoYXQgdmFyaWFudCBvZgorICAgIHNwcmludGYoKSBpcyB1c2VkIGJ5IGd6cHJpbnRmKCkuCisKKyAgICBJZiB5b3UgZG9uJ3QgaGF2ZSBzbnByaW50ZigpIG9yIHZzbnByaW50ZigpIGFuZCB3b3VsZCBsaWtlIG9uZSwgeW91IGNhbgorICAgIGZpbmQgYSBwb3J0YWJsZSBpbXBsZW1lbnRhdGlvbiBoZXJlOgorCisgICAgICAgIGh0dHA6Ly93d3cuaWpzLnNpL3NvZnR3YXJlL3NucHJpbnRmLworCisgICAgTm90ZSB0aGF0IHlvdSBzaG91bGQgYmUgdXNpbmcgdGhlIG1vc3QgcmVjZW50IHZlcnNpb24gb2YgemxpYi4gIFZlcnNpb25zCisgICAgMS4xLjMgYW5kIGJlZm9yZSB3ZXJlIHN1YmplY3QgdG8gYSBkb3VibGUtZnJlZSB2dWxuZXJhYmlsaXR5LCBhbmQgdmVyc2lvbnMKKyAgICAxLjIuMSBhbmQgMS4yLjIgd2VyZSBzdWJqZWN0IHRvIGFuIGFjY2VzcyBleGNlcHRpb24gd2hlbiBkZWNvbXByZXNzaW5nCisgICAgaW52YWxpZCBjb21wcmVzc2VkIGRhdGEuCisKKzM0LiBJcyB0aGVyZSBhIEphdmEgdmVyc2lvbiBvZiB6bGliPworCisgICAgUHJvYmFibHkgd2hhdCB5b3Ugd2FudCBpcyB0byB1c2UgemxpYiBpbiBKYXZhLiB6bGliIGlzIGFscmVhZHkgaW5jbHVkZWQKKyAgICBhcyBwYXJ0IG9mIHRoZSBKYXZhIFNESyBpbiB0aGUgamF2YS51dGlsLnppcCBwYWNrYWdlLiBJZiB5b3UgcmVhbGx5IHdhbnQKKyAgICBhIHZlcnNpb24gb2YgemxpYiB3cml0dGVuIGluIHRoZSBKYXZhIGxhbmd1YWdlLCBsb29rIG9uIHRoZSB6bGliIGhvbWUKKyAgICBwYWdlIGZvciBsaW5rczogaHR0cDovL3psaWIubmV0LyAuCisKKzM1LiBJIGdldCB0aGlzIG9yIHRoYXQgY29tcGlsZXIgb3Igc291cmNlLWNvZGUgc2Nhbm5lciB3YXJuaW5nIHdoZW4gSSBjcmFuayBpdAorICAgIHVwIHRvIG1heGltYWxseS1wZWRhbnRpYy4gQ2FuJ3QgeW91IGd1eXMgd3JpdGUgcHJvcGVyIGNvZGU/CisKKyAgICBNYW55IHllYXJzIGFnbywgd2UgZ2F2ZSB1cCBhdHRlbXB0aW5nIHRvIGF2b2lkIHdhcm5pbmdzIG9uIGV2ZXJ5IGNvbXBpbGVyCisgICAgaW4gdGhlIHVuaXZlcnNlLiAgSXQganVzdCBnb3QgdG8gYmUgYSB3YXN0ZSBvZiB0aW1lLCBhbmQgc29tZSBjb21waWxlcnMKKyAgICB3ZXJlIGRvd25yaWdodCBzaWxseSBhcyB3ZWxsIGFzIGNvbnRyYWRpY3RlZCBlYWNoIG90aGVyLiAgU28gbm93LCB3ZSBzaW1wbHkKKyAgICBtYWtlIHN1cmUgdGhhdCB0aGUgY29kZSBhbHdheXMgd29ya3MuCisKKzM2LiBWYWxncmluZCAob3Igc29tZSBzaW1pbGFyIG1lbW9yeSBhY2Nlc3MgY2hlY2tlcikgc2F5cyB0aGF0IGRlZmxhdGUgaXMKKyAgICBwZXJmb3JtaW5nIGEgY29uZGl0aW9uYWwganVtcCB0aGF0IGRlcGVuZHMgb24gYW4gdW5pbml0aWFsaXplZCB2YWx1ZS4KKyAgICBJc24ndCB0aGF0IGEgYnVnPworCisgICAgTm8uICBUaGF0IGlzIGludGVudGlvbmFsIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBhbmQgdGhlIG91dHB1dCBvZiBkZWZsYXRlCisgICAgaXMgbm90IGFmZmVjdGVkLiAgVGhpcyBvbmx5IHN0YXJ0ZWQgc2hvd2luZyB1cCByZWNlbnRseSBzaW5jZSB6bGliIDEuMi54CisgICAgdXNlcyBtYWxsb2MoKSBieSBkZWZhdWx0IGZvciBhbGxvY2F0aW9ucywgd2hlcmVhcyBlYXJsaWVyIHZlcnNpb25zIHVzZWQKKyAgICBjYWxsb2MoKSwgd2hpY2ggemVyb3Mgb3V0IHRoZSBhbGxvY2F0ZWQgbWVtb3J5LiAgRXZlbiB0aG91Z2ggdGhlIGNvZGUgd2FzCisgICAgY29ycmVjdCwgdmVyc2lvbnMgMS4yLjQgYW5kIGxhdGVyIHdhcyBjaGFuZ2VkIHRvIG5vdCBzdGltdWxhdGUgdGhlc2UKKyAgICBjaGVja2Vycy4KKworMzcuIFdpbGwgemxpYiByZWFkIHRoZSAoaW5zZXJ0IGFueSBhbmNpZW50IG9yIGFyY2FuZSBmb3JtYXQgaGVyZSkgY29tcHJlc3NlZAorICAgIGRhdGEgZm9ybWF0PworCisgICAgUHJvYmFibHkgbm90LiBMb29rIGluIHRoZSBjb21wLmNvbXByZXNzaW9uIEZBUSBmb3IgcG9pbnRlcnMgdG8gdmFyaW91cworICAgIGZvcm1hdHMgYW5kIGFzc29jaWF0ZWQgc29mdHdhcmUuCisKKzM4LiBIb3cgY2FuIEkgZW5jcnlwdC9kZWNyeXB0IHppcCBmaWxlcyB3aXRoIHpsaWI/CisKKyAgICB6bGliIGRvZXNuJ3Qgc3VwcG9ydCBlbmNyeXB0aW9uLiAgVGhlIG9yaWdpbmFsIFBLWklQIGVuY3J5cHRpb24gaXMgdmVyeQorICAgIHdlYWsgYW5kIGNhbiBiZSBicm9rZW4gd2l0aCBmcmVlbHkgYXZhaWxhYmxlIHByb2dyYW1zLiAgVG8gZ2V0IHN0cm9uZworICAgIGVuY3J5cHRpb24sIHVzZSBHbnVQRywgaHR0cDovL3d3dy5nbnVwZy5vcmcvICwgd2hpY2ggYWxyZWFkeSBpbmNsdWRlcyB6bGliCisgICAgY29tcHJlc3Npb24uICBGb3IgUEtaSVAgY29tcGF0aWJsZSAiZW5jcnlwdGlvbiIsIGxvb2sgYXQKKyAgICBodHRwOi8vd3d3LmluZm8temlwLm9yZy8KKworMzkuIFdoYXQncyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSAiZ3ppcCIgYW5kICJkZWZsYXRlIiBIVFRQIDEuMSBlbmNvZGluZ3M/CisKKyAgICAiZ3ppcCIgaXMgdGhlIGd6aXAgZm9ybWF0LCBhbmQgImRlZmxhdGUiIGlzIHRoZSB6bGliIGZvcm1hdC4gIFRoZXkgc2hvdWxkCisgICAgcHJvYmFibHkgaGF2ZSBjYWxsZWQgdGhlIHNlY29uZCBvbmUgInpsaWIiIGluc3RlYWQgdG8gYXZvaWQgY29uZnVzaW9uIHdpdGgKKyAgICB0aGUgcmF3IGRlZmxhdGUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdC4gIFdoaWxlIHRoZSBIVFRQIDEuMSBSRkMgMjYxNgorICAgIGNvcnJlY3RseSBwb2ludHMgdG8gdGhlIHpsaWIgc3BlY2lmaWNhdGlvbiBpbiBSRkMgMTk1MCBmb3IgdGhlICJkZWZsYXRlIgorICAgIHRyYW5zZmVyIGVuY29kaW5nLCB0aGVyZSBoYXZlIGJlZW4gcmVwb3J0cyBvZiBzZXJ2ZXJzIGFuZCBicm93c2VycyB0aGF0CisgICAgaW5jb3JyZWN0bHkgcHJvZHVjZSBvciBleHBlY3QgcmF3IGRlZmxhdGUgZGF0YSBwZXIgdGhlIGRlZmxhdGUKKyAgICBzcGVjaWZpY2F0aW9uIGluIFJGQyAxOTUxLCBtb3N0IG5vdGFibHkgTWljcm9zb2Z0LiAgU28gZXZlbiB0aG91Z2ggdGhlCisgICAgImRlZmxhdGUiIHRyYW5zZmVyIGVuY29kaW5nIHVzaW5nIHRoZSB6bGliIGZvcm1hdCB3b3VsZCBiZSB0aGUgbW9yZQorICAgIGVmZmljaWVudCBhcHByb2FjaCAoYW5kIGluIGZhY3QgZXhhY3RseSB3aGF0IHRoZSB6bGliIGZvcm1hdCB3YXMgZGVzaWduZWQKKyAgICBmb3IpLCB1c2luZyB0aGUgImd6aXAiIHRyYW5zZmVyIGVuY29kaW5nIGlzIHByb2JhYmx5IG1vcmUgcmVsaWFibGUgZHVlIHRvCisgICAgYW4gdW5mb3J0dW5hdGUgY2hvaWNlIG9mIG5hbWUgb24gdGhlIHBhcnQgb2YgdGhlIEhUVFAgMS4xIGF1dGhvcnMuCisKKyAgICBCb3R0b20gbGluZTogdXNlIHRoZSBnemlwIGZvcm1hdCBmb3IgSFRUUCAxLjEgZW5jb2RpbmcuCisKKzQwLiBEb2VzIHpsaWIgc3VwcG9ydCB0aGUgbmV3ICJEZWZsYXRlNjQiIGZvcm1hdCBpbnRyb2R1Y2VkIGJ5IFBLV2FyZT8KKworICAgIE5vLiAgUEtXYXJlIGhhcyBhcHBhcmVudGx5IGRlY2lkZWQgdG8ga2VlcCB0aGF0IGZvcm1hdCBwcm9wcmlldGFyeSwgc2luY2UKKyAgICB0aGV5IGhhdmUgbm90IGRvY3VtZW50ZWQgaXQgYXMgdGhleSBoYXZlIHByZXZpb3VzIGNvbXByZXNzaW9uIGZvcm1hdHMuICBJbgorICAgIGFueSBjYXNlLCB0aGUgY29tcHJlc3Npb24gaW1wcm92ZW1lbnRzIGFyZSBzbyBtb2Rlc3QgY29tcGFyZWQgdG8gb3RoZXIgbW9yZQorICAgIG1vZGVybiBhcHByb2FjaGVzLCB0aGF0IGl0J3Mgbm90IHdvcnRoIHRoZSBlZmZvcnQgdG8gaW1wbGVtZW50LgorCis0MS4gSSdtIGhhdmluZyBhIHByb2JsZW0gd2l0aCB0aGUgemlwIGZ1bmN0aW9ucyBpbiB6bGliLCBjYW4geW91IGhlbHA/CisKKyAgICBUaGVyZSBhcmUgbm8gemlwIGZ1bmN0aW9ucyBpbiB6bGliLiAgWW91IGFyZSBwcm9iYWJseSB1c2luZyBtaW5pemlwIGJ5CisgICAgR2lsZXMgVm9sbGFudCwgd2hpY2ggaXMgZm91bmQgaW4gdGhlIGNvbnRyaWIgZGlyZWN0b3J5IG9mIHpsaWIuICBJdCBpcyBub3QKKyAgICBwYXJ0IG9mIHpsaWIuICBJbiBmYWN0IG5vbmUgb2YgdGhlIHN0dWZmIGluIGNvbnRyaWIgaXMgcGFydCBvZiB6bGliLiAgVGhlCisgICAgZmlsZXMgaW4gdGhlcmUgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHpsaWIgYXV0aG9ycy4gIFlvdSBuZWVkIHRvIGNvbnRhY3QKKyAgICB0aGUgYXV0aG9ycyBvZiB0aGUgcmVzcGVjdGl2ZSBjb250cmlidXRpb24gZm9yIGhlbHAuCisKKzQyLiBUaGUgbWF0Y2guYXNtIGNvZGUgaW4gY29udHJpYiBpcyB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgICAgU2luY2UgaXQncyBwYXJ0IG9mIHpsaWIsIGRvZXNuJ3QgdGhhdCBtZWFuIHRoYXQgYWxsIG9mIHpsaWIgZmFsbHMgdW5kZXIgdGhlCisgICAgR05VIEdQTD8KKworICAgIE5vLiAgVGhlIGZpbGVzIGluIGNvbnRyaWIgYXJlIG5vdCBwYXJ0IG9mIHpsaWIuICBUaGV5IHdlcmUgY29udHJpYnV0ZWQgYnkKKyAgICBvdGhlciBhdXRob3JzIGFuZCBhcmUgcHJvdmlkZWQgYXMgYSBjb252ZW5pZW5jZSB0byB0aGUgdXNlciB3aXRoaW4gdGhlIHpsaWIKKyAgICBkaXN0cmlidXRpb24uICBFYWNoIGl0ZW0gaW4gY29udHJpYiBoYXMgaXRzIG93biBsaWNlbnNlLgorCis0My4gSXMgemxpYiBzdWJqZWN0IHRvIGV4cG9ydCBjb250cm9scz8gIFdoYXQgaXMgaXRzIEVDQ04/CisKKyAgICB6bGliIGlzIG5vdCBzdWJqZWN0IHRvIGV4cG9ydCBjb250cm9scywgYW5kIHNvIGlzIGNsYXNzaWZpZWQgYXMgRUFSOTkuCisKKzQ0LiBDYW4geW91IHBsZWFzZSBzaWduIHRoZXNlIGxlbmd0aHkgbGVnYWwgZG9jdW1lbnRzIGFuZCBmYXggdGhlbSBiYWNrIHRvIHVzCisgICAgc28gdGhhdCB3ZSBjYW4gdXNlIHlvdXIgc29mdHdhcmUgaW4gb3VyIHByb2R1Y3Q/CisKKyAgICBOby4gR28gYXdheS4gU2hvby4KZGlmZiAtLWdpdCBhL3psaWIvc3JjL0lOREVYIGIvemxpYi9zcmMvSU5ERVgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJhMDY0MQotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL0lOREVYCkBAIC0wLDAgKzEsNjggQEAKK0NNYWtlTGlzdHMudHh0ICBjbWFrZSBidWlsZCBmaWxlCitDaGFuZ2VMb2cgICAgICAgaGlzdG9yeSBvZiBjaGFuZ2VzCitGQVEgICAgICAgICAgICAgRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMgYWJvdXQgemxpYgorSU5ERVggICAgICAgICAgIHRoaXMgZmlsZQorTWFrZWZpbGUgICAgICAgIGR1bW15IE1ha2VmaWxlIHRoYXQgdGVsbHMgeW91IHRvIC4vY29uZmlndXJlCitNYWtlZmlsZS5pbiAgICAgdGVtcGxhdGUgZm9yIFVuaXggTWFrZWZpbGUKK1JFQURNRSAgICAgICAgICBndWVzcyB3aGF0Citjb25maWd1cmUgICAgICAgY29uZmlndXJlIHNjcmlwdCBmb3IgVW5peAorbWFrZV92bXMuY29tICAgIG1ha2VmaWxlIGZvciBWTVMKK3Rlc3QvZXhhbXBsZS5jICB6bGliIHVzYWdlcyBleGFtcGxlcyBmb3IgYnVpbGQgdGVzdGluZwordGVzdC9taW5pZ3ppcC5jIG1pbmltYWwgZ3ppcC1saWtlIGZ1bmN0aW9uYWxpdHkgZm9yIGJ1aWxkIHRlc3RpbmcKK3Rlc3QvaW5mY292ZXIuYyBpbmYqLmMgY29kZSBjb3ZlcmFnZSBmb3IgYnVpbGQgY292ZXJhZ2UgdGVzdGluZwordHJlZWJ1aWxkLnhtbCAgIFhNTCBkZXNjcmlwdGlvbiBvZiBzb3VyY2UgZmlsZSBkZXBlbmRlbmNpZXMKK3pjb25mLmguY21ha2VpbiB6Y29uZi5oIHRlbXBsYXRlIGZvciBjbWFrZQoremNvbmYuaC5pbiAgICAgIHpjb25mLmggdGVtcGxhdGUgZm9yIGNvbmZpZ3VyZQoremxpYi4zICAgICAgICAgIE1hbiBwYWdlIGZvciB6bGliCit6bGliLjMucGRmICAgICAgTWFuIHBhZ2UgaW4gUERGIGZvcm1hdAoremxpYi5tYXAgICAgICAgIExpbnV4IHN5bWJvbCBpbmZvcm1hdGlvbgoremxpYi5wYy5pbiAgICAgIFRlbXBsYXRlIGZvciBwa2ctY29uZmlnIGRlc2NyaXB0b3IKK3psaWIucGMuY21ha2VpbiB6bGliLnBjIHRlbXBsYXRlIGZvciBjbWFrZQoremxpYjJhbnNpICAgICAgIHBlcmwgc2NyaXB0IHRvIGNvbnZlcnQgc291cmNlIGZpbGVzIGZvciBDKysgY29tcGlsYXRpb24KKworYW1pZ2EvICAgICAgICAgIG1ha2VmaWxlcyBmb3IgQW1pZ2EgU0FTIEMKK2FzNDAwLyAgICAgICAgICBtYWtlZmlsZXMgZm9yIEFTLzQwMAorZG9jLyAgICAgICAgICAgIGRvY3VtZW50YXRpb24gZm9yIGZvcm1hdHMgYW5kIGFsZ29yaXRobXMKK21zZG9zLyAgICAgICAgICBtYWtlZmlsZXMgZm9yIE1TRE9TCituaW50ZW5kb2RzLyAgICAgbWFrZWZpbGUgZm9yIE5pbnRlbmRvIERTCitvbGQvICAgICAgICAgICAgbWFrZWZpbGVzIGZvciB2YXJpb3VzIGFyY2hpdGVjdHVyZXMgYW5kIHpsaWIgZG9jdW1lbnRhdGlvbgorICAgICAgICAgICAgICAgIGZpbGVzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gdXBkYXRlZCBmb3IgemxpYiAxLjIueAorcW54LyAgICAgICAgICAgIG1ha2VmaWxlcyBmb3IgUU5YCit3YXRjb20vICAgICAgICAgbWFrZWZpbGVzIGZvciBPcGVuV2F0Y29tCit3aW4zMi8gICAgICAgICAgbWFrZWZpbGVzIGZvciBXaW5kb3dzCisKKyAgICAgICAgICAgICAgICB6bGliIHB1YmxpYyBoZWFkZXIgZmlsZXMgKHJlcXVpcmVkIGZvciBsaWJyYXJ5IHVzZSk6Cit6Y29uZi5oCit6bGliLmgKKworICAgICAgICAgICAgICAgIHByaXZhdGUgc291cmNlIGZpbGVzIHVzZWQgdG8gYnVpbGQgdGhlIHpsaWIgbGlicmFyeToKK2FkbGVyMzIuYworY29tcHJlc3MuYworY3JjMzIuYworY3JjMzIuaAorZGVmbGF0ZS5jCitkZWZsYXRlLmgKK2d6Y2xvc2UuYworZ3pndXRzLmgKK2d6bGliLmMKK2d6cmVhZC5jCitnendyaXRlLmMKK2luZmJhY2suYworaW5mZmFzdC5jCitpbmZmYXN0LmgKK2luZmZpeGVkLmgKK2luZmxhdGUuYworaW5mbGF0ZS5oCitpbmZ0cmVlcy5jCitpbmZ0cmVlcy5oCit0cmVlcy5jCit0cmVlcy5oCit1bmNvbXByLmMKK3p1dGlsLmMKK3p1dGlsLmgKKworICAgICAgICAgICAgICAgIHNvdXJjZSBmaWxlcyBmb3Igc2FtcGxlIHByb2dyYW1zCitTZWUgZXhhbXBsZXMvUkVBRE1FLmV4YW1wbGVzCisKKyAgICAgICAgICAgICAgICB1bnN1cHBvcnRlZCBjb250cmlidXRpb25zIGJ5IHRoaXJkIHBhcnRpZXMKK1NlZSBjb250cmliL1JFQURNRS5jb250cmliCmRpZmYgLS1naXQgYS96bGliL3NyYy9NYWtlZmlsZS5pbiBiL3psaWIvc3JjL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MWFhMzAKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDI4OCBAQAorIyBNYWtlZmlsZSBmb3IgemxpYgorIyBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5LCBNYXJrIEFkbGVyCisjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKworIyBUbyBjb21waWxlIGFuZCB0ZXN0LCB0eXBlOgorIyAgICAuL2NvbmZpZ3VyZTsgbWFrZSB0ZXN0CisjIE5vcm1hbGx5IGNvbmZpZ3VyZSBidWlsZHMgYm90aCBhIHN0YXRpYyBhbmQgYSBzaGFyZWQgbGlicmFyeS4KKyMgSWYgeW91IHdhbnQgdG8gYnVpbGQganVzdCBhIHN0YXRpYyBsaWJyYXJ5LCB1c2U6IC4vY29uZmlndXJlIC0tc3RhdGljCisKKyMgVG8gdXNlIHRoZSBhc20gY29kZSwgdHlwZToKKyMgICAgY3AgY29udHJpYi9hc20/ODYvbWF0Y2guUyAuL21hdGNoLlMKKyMgICAgbWFrZSBMT0M9LURBU01WIE9CSkE9bWF0Y2gubworCisjIFRvIGluc3RhbGwgL3Vzci9sb2NhbC9saWIvbGliei4qIGFuZCAvdXNyL2xvY2FsL2luY2x1ZGUvemxpYi5oLCB0eXBlOgorIyAgICBtYWtlIGluc3RhbGwKKyMgVG8gaW5zdGFsbCBpbiAkSE9NRSBpbnN0ZWFkIG9mIC91c3IvbG9jYWwsIHVzZToKKyMgICAgbWFrZSBpbnN0YWxsIHByZWZpeD0kSE9NRQorCitDQz1jYworCitDRkxBR1M9LU8KKyNDRkxBR1M9LU8gLURNQVhfV0JJVFM9MTQgLURNQVhfTUVNX0xFVkVMPTcKKyNDRkxBR1M9LWcgLURERUJVRworI0NGTEFHUz0tTzMgLVdhbGwgLVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV2NvbnZlcnNpb24gXAorIyAgICAgICAgICAgLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcworCitTRkxBR1M9LU8KK0xERkxBR1M9CitURVNUX0xERkxBR1M9LUwuIGxpYnouYQorTERTSEFSRUQ9JChDQykKK0NQUD0kKENDKSAtRQorCitTVEFUSUNMSUI9bGliei5hCitTSEFSRURMSUI9bGliei5zbworU0hBUkVETElCVj1saWJ6LnNvLjEuMi44CitTSEFSRURMSUJNPWxpYnouc28uMQorTElCUz0kKFNUQVRJQ0xJQikgJChTSEFSRURMSUJWKQorCitBUj1hcgorQVJGTEFHUz1yYworUkFOTElCPXJhbmxpYgorTERDT05GSUc9bGRjb25maWcKK0xEU0hBUkVETElCQz0tbGMKK1RBUj10YXIKK1NIRUxMPS9iaW4vc2gKK0VYRT0KKworcHJlZml4ID0gL3Vzci9sb2NhbAorZXhlY19wcmVmaXggPSAke3ByZWZpeH0KK2xpYmRpciA9ICR7ZXhlY19wcmVmaXh9L2xpYgorc2hhcmVkbGliZGlyID0gJHtsaWJkaXJ9CitpbmNsdWRlZGlyID0gJHtwcmVmaXh9L2luY2x1ZGUKK21hbmRpciA9ICR7cHJlZml4fS9zaGFyZS9tYW4KK21hbjNkaXIgPSAke21hbmRpcn0vbWFuMworcGtnY29uZmlnZGlyID0gJHtsaWJkaXJ9L3BrZ2NvbmZpZworCitPQkpaID0gYWRsZXIzMi5vIGNyYzMyLm8gZGVmbGF0ZS5vIGluZmJhY2subyBpbmZmYXN0Lm8gaW5mbGF0ZS5vIGluZnRyZWVzLm8gdHJlZXMubyB6dXRpbC5vCitPQkpHID0gY29tcHJlc3MubyB1bmNvbXByLm8gZ3pjbG9zZS5vIGd6bGliLm8gZ3pyZWFkLm8gZ3p3cml0ZS5vCitPQkpDID0gJChPQkpaKSAkKE9CSkcpCisKK1BJQ19PQkpaID0gYWRsZXIzMi5sbyBjcmMzMi5sbyBkZWZsYXRlLmxvIGluZmJhY2subG8gaW5mZmFzdC5sbyBpbmZsYXRlLmxvIGluZnRyZWVzLmxvIHRyZWVzLmxvIHp1dGlsLmxvCitQSUNfT0JKRyA9IGNvbXByZXNzLmxvIHVuY29tcHIubG8gZ3pjbG9zZS5sbyBnemxpYi5sbyBnenJlYWQubG8gZ3p3cml0ZS5sbworUElDX09CSkMgPSAkKFBJQ19PQkpaKSAkKFBJQ19PQkpHKQorCisjIHRvIHVzZSB0aGUgYXNtIGNvZGU6IG1ha2UgT0JKQT1tYXRjaC5vLCBQSUNfT0JKQT1tYXRjaC5sbworT0JKQSA9CitQSUNfT0JKQSA9CisKK09CSlMgPSAkKE9CSkMpICQoT0JKQSkKKworUElDX09CSlMgPSAkKFBJQ19PQkpDKSAkKFBJQ19PQkpBKQorCithbGw6IHN0YXRpYyBzaGFyZWQKKworc3RhdGljOiBleGFtcGxlJChFWEUpIG1pbmlnemlwJChFWEUpCisKK3NoYXJlZDogZXhhbXBsZXNoJChFWEUpIG1pbmlnemlwc2gkKEVYRSkKKworYWxsNjQ6IGV4YW1wbGU2NCQoRVhFKSBtaW5pZ3ppcDY0JChFWEUpCisKK2NoZWNrOiB0ZXN0CisKK3Rlc3Q6IGFsbCB0ZXN0c3RhdGljIHRlc3RzaGFyZWQKKwordGVzdHN0YXRpYzogc3RhdGljCisJQFRNUFNUPXRtcHN0XyQkOyBcCisJaWYgZWNobyBoZWxsbyB3b3JsZCB8IC4vbWluaWd6aXAgfCAuL21pbmlnemlwIC1kICYmIC4vZXhhbXBsZSAkJFRNUFNUIDsgdGhlbiBcCisJICBlY2hvICcJCSoqKiB6bGliIHRlc3QgT0sgKioqJzsgXAorCWVsc2UgXAorCSAgZWNobyAnCQkqKiogemxpYiB0ZXN0IEZBSUxFRCAqKionOyBmYWxzZTsgXAorCWZpOyBcCisJcm0gLWYgJCRUTVBTVAorCit0ZXN0c2hhcmVkOiBzaGFyZWQKKwlATERfTElCUkFSWV9QQVRIPWBwd2RgOiQoTERfTElCUkFSWV9QQVRIKSA7IGV4cG9ydCBMRF9MSUJSQVJZX1BBVEg7IFwKKwlMRF9MSUJSQVJZTjMyX1BBVEg9YHB3ZGA6JChMRF9MSUJSQVJZTjMyX1BBVEgpIDsgZXhwb3J0IExEX0xJQlJBUllOMzJfUEFUSDsgXAorCURZTERfTElCUkFSWV9QQVRIPWBwd2RgOiQoRFlMRF9MSUJSQVJZX1BBVEgpIDsgZXhwb3J0IERZTERfTElCUkFSWV9QQVRIOyBcCisJU0hMSUJfUEFUSD1gcHdkYDokKFNITElCX1BBVEgpIDsgZXhwb3J0IFNITElCX1BBVEg7IFwKKwlUTVBTSD10bXBzaF8kJDsgXAorCWlmIGVjaG8gaGVsbG8gd29ybGQgfCAuL21pbmlnemlwc2ggfCAuL21pbmlnemlwc2ggLWQgJiYgLi9leGFtcGxlc2ggJCRUTVBTSDsgdGhlbiBcCisJICBlY2hvICcJCSoqKiB6bGliIHNoYXJlZCB0ZXN0IE9LICoqKic7IFwKKwllbHNlIFwKKwkgIGVjaG8gJwkJKioqIHpsaWIgc2hhcmVkIHRlc3QgRkFJTEVEICoqKic7IGZhbHNlOyBcCisJZmk7IFwKKwlybSAtZiAkJFRNUFNICisKK3Rlc3Q2NDogYWxsNjQKKwlAVE1QNjQ9dG1wNjRfJCQ7IFwKKwlpZiBlY2hvIGhlbGxvIHdvcmxkIHwgLi9taW5pZ3ppcDY0IHwgLi9taW5pZ3ppcDY0IC1kICYmIC4vZXhhbXBsZTY0ICQkVE1QNjQ7IHRoZW4gXAorCSAgZWNobyAnCQkqKiogemxpYiA2NC1iaXQgdGVzdCBPSyAqKionOyBcCisJZWxzZSBcCisJICBlY2hvICcJCSoqKiB6bGliIDY0LWJpdCB0ZXN0IEZBSUxFRCAqKionOyBmYWxzZTsgXAorCWZpOyBcCisJcm0gLWYgJCRUTVA2NAorCitpbmZjb3Zlci5vOiB0ZXN0L2luZmNvdmVyLmMgemxpYi5oIHpjb25mLmgKKwkkKENDKSAkKENGTEFHUykgLUkuIC1jIC1vICRAIHRlc3QvaW5mY292ZXIuYworCitpbmZjb3ZlcjogaW5mY292ZXIubyBsaWJ6LmEKKwkkKENDKSAkKENGTEFHUykgLW8gJEAgaW5mY292ZXIubyBsaWJ6LmEKKworY292ZXI6IGluZmNvdmVyCisJcm0gLWYgKi5nY2RhCisJLi9pbmZjb3ZlcgorCWdjb3YgaW5mKi5jCisKK2xpYnouYTogJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCS1AICgkKFJBTkxJQikgJEAgfHwgdHJ1ZSkgPi9kZXYvbnVsbCAyPiYxCisKK21hdGNoLm86IG1hdGNoLlMKKwkkKENQUCkgbWF0Y2guUyA+IF9tYXRjaC5zCisJJChDQykgLWMgX21hdGNoLnMKKwltdiBfbWF0Y2gubyBtYXRjaC5vCisJcm0gLWYgX21hdGNoLnMKKworbWF0Y2gubG86IG1hdGNoLlMKKwkkKENQUCkgbWF0Y2guUyA+IF9tYXRjaC5zCisJJChDQykgLWMgLWZQSUMgX21hdGNoLnMKKwltdiBfbWF0Y2gubyBtYXRjaC5sbworCXJtIC1mIF9tYXRjaC5zCisKK2V4YW1wbGUubzogdGVzdC9leGFtcGxlLmMgemxpYi5oIHpjb25mLmgKKwkkKENDKSAkKENGTEFHUykgLUkuIC1jIC1vICRAIHRlc3QvZXhhbXBsZS5jCisKK21pbmlnemlwLm86IHRlc3QvbWluaWd6aXAuYyB6bGliLmggemNvbmYuaAorCSQoQ0MpICQoQ0ZMQUdTKSAtSS4gLWMgLW8gJEAgdGVzdC9taW5pZ3ppcC5jCisKK2V4YW1wbGU2NC5vOiB0ZXN0L2V4YW1wbGUuYyB6bGliLmggemNvbmYuaAorCSQoQ0MpICQoQ0ZMQUdTKSAtSS4gLURfRklMRV9PRkZTRVRfQklUUz02NCAtYyAtbyAkQCB0ZXN0L2V4YW1wbGUuYworCittaW5pZ3ppcDY0Lm86IHRlc3QvbWluaWd6aXAuYyB6bGliLmggemNvbmYuaAorCSQoQ0MpICQoQ0ZMQUdTKSAtSS4gLURfRklMRV9PRkZTRVRfQklUUz02NCAtYyAtbyAkQCB0ZXN0L21pbmlnemlwLmMKKworLlNVRkZJWEVTOiAubG8KKworLmMubG86CisJLUBta2RpciBvYmpzIDI+L2Rldi9udWxsIHx8IHRlc3QgLWQgb2JqcworCSQoQ0MpICQoU0ZMQUdTKSAtRFBJQyAtYyAtbyBvYmpzLyQqLm8gJDwKKwktQG12IG9ianMvJCoubyAkQAorCitwbGFjZWJvICQoU0hBUkVETElCVik6ICQoUElDX09CSlMpIGxpYnouYQorCSQoTERTSEFSRUQpICQoU0ZMQUdTKSAtbyAkQCAkKFBJQ19PQkpTKSAkKExEU0hBUkVETElCQykgJChMREZMQUdTKQorCXJtIC1mICQoU0hBUkVETElCKSAkKFNIQVJFRExJQk0pCisJbG4gLXMgJEAgJChTSEFSRURMSUIpCisJbG4gLXMgJEAgJChTSEFSRURMSUJNKQorCS1Acm1kaXIgb2JqcworCitleGFtcGxlJChFWEUpOiBleGFtcGxlLm8gJChTVEFUSUNMSUIpCisJJChDQykgJChDRkxBR1MpIC1vICRAIGV4YW1wbGUubyAkKFRFU1RfTERGTEFHUykKKworbWluaWd6aXAkKEVYRSk6IG1pbmlnemlwLm8gJChTVEFUSUNMSUIpCisJJChDQykgJChDRkxBR1MpIC1vICRAIG1pbmlnemlwLm8gJChURVNUX0xERkxBR1MpCisKK2V4YW1wbGVzaCQoRVhFKTogZXhhbXBsZS5vICQoU0hBUkVETElCVikKKwkkKENDKSAkKENGTEFHUykgLW8gJEAgZXhhbXBsZS5vIC1MLiAkKFNIQVJFRExJQlYpCisKK21pbmlnemlwc2gkKEVYRSk6IG1pbmlnemlwLm8gJChTSEFSRURMSUJWKQorCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCBtaW5pZ3ppcC5vIC1MLiAkKFNIQVJFRExJQlYpCisKK2V4YW1wbGU2NCQoRVhFKTogZXhhbXBsZTY0Lm8gJChTVEFUSUNMSUIpCisJJChDQykgJChDRkxBR1MpIC1vICRAIGV4YW1wbGU2NC5vICQoVEVTVF9MREZMQUdTKQorCittaW5pZ3ppcDY0JChFWEUpOiBtaW5pZ3ppcDY0Lm8gJChTVEFUSUNMSUIpCisJJChDQykgJChDRkxBR1MpIC1vICRAIG1pbmlnemlwNjQubyAkKFRFU1RfTERGTEFHUykKKworaW5zdGFsbC1saWJzOiAkKExJQlMpCisJLUBpZiBbICEgLWQgJChERVNURElSKSQoZXhlY19wcmVmaXgpICBdOyB0aGVuIG1rZGlyIC1wICQoREVTVERJUikkKGV4ZWNfcHJlZml4KTsgZmkKKwktQGlmIFsgISAtZCAkKERFU1RESVIpJChsaWJkaXIpICAgICAgIF07IHRoZW4gbWtkaXIgLXAgJChERVNURElSKSQobGliZGlyKTsgZmkKKwktQGlmIFsgISAtZCAkKERFU1RESVIpJChzaGFyZWRsaWJkaXIpIF07IHRoZW4gbWtkaXIgLXAgJChERVNURElSKSQoc2hhcmVkbGliZGlyKTsgZmkKKwktQGlmIFsgISAtZCAkKERFU1RESVIpJChtYW4zZGlyKSAgICAgIF07IHRoZW4gbWtkaXIgLXAgJChERVNURElSKSQobWFuM2Rpcik7IGZpCisJLUBpZiBbICEgLWQgJChERVNURElSKSQocGtnY29uZmlnZGlyKSBdOyB0aGVuIG1rZGlyIC1wICQoREVTVERJUikkKHBrZ2NvbmZpZ2Rpcik7IGZpCisJY3AgJChTVEFUSUNMSUIpICQoREVTVERJUikkKGxpYmRpcikKKwljaG1vZCA2NDQgJChERVNURElSKSQobGliZGlyKS8kKFNUQVRJQ0xJQikKKwktQCgkKFJBTkxJQikgJChERVNURElSKSQobGliZGlyKS9saWJ6LmEgfHwgdHJ1ZSkgPi9kZXYvbnVsbCAyPiYxCisJLUBpZiB0ZXN0IC1uICIkKFNIQVJFRExJQlYpIjsgdGhlbiBcCisJICBjcCAkKFNIQVJFRExJQlYpICQoREVTVERJUikkKHNoYXJlZGxpYmRpcik7IFwKKwkgIGVjaG8gImNwICQoU0hBUkVETElCVikgJChERVNURElSKSQoc2hhcmVkbGliZGlyKSI7IFwKKwkgIGNobW9kIDc1NSAkKERFU1RESVIpJChzaGFyZWRsaWJkaXIpLyQoU0hBUkVETElCVik7IFwKKwkgIGVjaG8gImNobW9kIDc1NSAkKERFU1RESVIpJChzaGFyZWRsaWJkaXIpLyQoU0hBUkVETElCVikiOyBcCisJICBybSAtZiAkKERFU1RESVIpJChzaGFyZWRsaWJkaXIpLyQoU0hBUkVETElCKSAkKERFU1RESVIpJChzaGFyZWRsaWJkaXIpLyQoU0hBUkVETElCTSk7IFwKKwkgIGxuIC1zICQoU0hBUkVETElCVikgJChERVNURElSKSQoc2hhcmVkbGliZGlyKS8kKFNIQVJFRExJQik7IFwKKwkgIGxuIC1zICQoU0hBUkVETElCVikgJChERVNURElSKSQoc2hhcmVkbGliZGlyKS8kKFNIQVJFRExJQk0pOyBcCisJICAoJChMRENPTkZJRykgfHwgdHJ1ZSkgID4vZGV2L251bGwgMj4mMTsgXAorCWZpCisJY3AgemxpYi4zICQoREVTVERJUikkKG1hbjNkaXIpCisJY2htb2QgNjQ0ICQoREVTVERJUikkKG1hbjNkaXIpL3psaWIuMworCWNwIHpsaWIucGMgJChERVNURElSKSQocGtnY29uZmlnZGlyKQorCWNobW9kIDY0NCAkKERFU1RESVIpJChwa2djb25maWdkaXIpL3psaWIucGMKKyMgVGhlIHJhbmxpYiBpbiBpbnN0YWxsIGlzIG5lZWRlZCBvbiBOZVhUU1RFUCB3aGljaCBjaGVja3MgZmlsZSB0aW1lcworIyBsZGNvbmZpZyBpcyBmb3IgTGludXgKKworaW5zdGFsbDogaW5zdGFsbC1saWJzCisJLUBpZiBbICEgLWQgJChERVNURElSKSQoaW5jbHVkZWRpcikgICBdOyB0aGVuIG1rZGlyIC1wICQoREVTVERJUikkKGluY2x1ZGVkaXIpOyBmaQorCWNwIHpsaWIuaCB6Y29uZi5oICQoREVTVERJUikkKGluY2x1ZGVkaXIpCisJY2htb2QgNjQ0ICQoREVTVERJUikkKGluY2x1ZGVkaXIpL3psaWIuaCAkKERFU1RESVIpJChpbmNsdWRlZGlyKS96Y29uZi5oCisKK3VuaW5zdGFsbDoKKwljZCAkKERFU1RESVIpJChpbmNsdWRlZGlyKSAmJiBybSAtZiB6bGliLmggemNvbmYuaAorCWNkICQoREVTVERJUikkKGxpYmRpcikgJiYgcm0gLWYgbGliei5hOyBcCisJaWYgdGVzdCAtbiAiJChTSEFSRURMSUJWKSIgLWEgLWYgJChTSEFSRURMSUJWKTsgdGhlbiBcCisJICBybSAtZiAkKFNIQVJFRExJQlYpICQoU0hBUkVETElCKSAkKFNIQVJFRExJQk0pOyBcCisJZmkKKwljZCAkKERFU1RESVIpJChtYW4zZGlyKSAmJiBybSAtZiB6bGliLjMKKwljZCAkKERFU1RESVIpJChwa2djb25maWdkaXIpICYmIHJtIC1mIHpsaWIucGMKKworZG9jczogemxpYi4zLnBkZgorCit6bGliLjMucGRmOiB6bGliLjMKKwlncm9mZiAtbWFuZG9jIC1mIEggLVQgcHMgemxpYi4zIHwgcHMycGRmIC0gemxpYi4zLnBkZgorCit6Y29uZi5oLmNtYWtlaW46IHpjb25mLmguaW4KKwktQCBURU1QRklMRT16Y29uZmhfJCQ7IFwKKwllY2hvICIvI2RlZmluZSBaQ09ORl9ILyBhXFxcXFxuI2NtYWtlZGVmaW5lIFpfUFJFRklYXFxcXFxuI2NtYWtlZGVmaW5lIFpfSEFWRV9VTklTVERfSFxuIiA+PiAkJFRFTVBGSUxFICYmXAorCXNlZCAtZiAkJFRFTVBGSUxFIHpjb25mLmguaW4gPiB6Y29uZi5oLmNtYWtlaW4gJiZcCisJdG91Y2ggLXIgemNvbmYuaC5pbiB6Y29uZi5oLmNtYWtlaW4gJiZcCisJcm0gJCRURU1QRklMRQorCit6Y29uZjogemNvbmYuaC5pbgorCWNwIC1wIHpjb25mLmguaW4gemNvbmYuaAorCittb3N0bHljbGVhbjogY2xlYW4KK2NsZWFuOgorCXJtIC1mICoubyAqLmxvICp+IFwKKwkgICBleGFtcGxlJChFWEUpIG1pbmlnemlwJChFWEUpIGV4YW1wbGVzaCQoRVhFKSBtaW5pZ3ppcHNoJChFWEUpIFwKKwkgICBleGFtcGxlNjQkKEVYRSkgbWluaWd6aXA2NCQoRVhFKSBcCisJICAgaW5mY292ZXIgXAorCSAgIGxpYnouKiBmb28uZ3ogc29fbG9jYXRpb25zIFwKKwkgICBfbWF0Y2gucyBtYWtldHJlZSBjb250cmliL2luZmJhY2s5LyoubworCXJtIC1yZiBvYmpzCisJcm0gLWYgKi5nY2RhICouZ2NubyAqLmdjb3YKKwlybSAtZiBjb250cmliL2luZmJhY2s5LyouZ2NkYSBjb250cmliL2luZmJhY2s5LyouZ2NubyBjb250cmliL2luZmJhY2s5LyouZ2NvdgorCittYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KK2Rpc3RjbGVhbjogY2xlYW4gemNvbmYgemNvbmYuaC5jbWFrZWluIGRvY3MKKwlybSAtZiBNYWtlZmlsZSB6bGliLnBjIGNvbmZpZ3VyZS5sb2cKKwktQHJtIC1mIC5EU19TdG9yZQorCS1AcHJpbnRmICdhbGw6XG5cdC1AZWNobyAiUGxlYXNlIHVzZSAuL2NvbmZpZ3VyZSBmaXJzdC4gIFRoYW5rIHlvdS4iXG4nID4gTWFrZWZpbGUKKwktQHByaW50ZiAnXG5kaXN0Y2xlYW46XG5cdG1ha2UgLWYgTWFrZWZpbGUuaW4gZGlzdGNsZWFuXG4nID4+IE1ha2VmaWxlCisJLUB0b3VjaCAtciBNYWtlZmlsZS5pbiBNYWtlZmlsZQorCit0YWdzOgorCWV0YWdzICouW2NoXQorCitkZXBlbmQ6CisJbWFrZWRlcGVuZCAtLSAkKENGTEFHUykgLS0gKi5bY2hdCisKKyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KKworYWRsZXIzMi5vIHp1dGlsLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmgKK2d6Y2xvc2UubyBnemxpYi5vIGd6cmVhZC5vIGd6d3JpdGUubzogemxpYi5oIHpjb25mLmggZ3pndXRzLmgKK2NvbXByZXNzLm8gZXhhbXBsZS5vIG1pbmlnemlwLm8gdW5jb21wci5vOiB6bGliLmggemNvbmYuaAorY3JjMzIubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBjcmMzMi5oCitkZWZsYXRlLm86IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitpbmZiYWNrLm8gaW5mbGF0ZS5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIGluZmZhc3QuaCBpbmZmaXhlZC5oCitpbmZmYXN0Lm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCitpbmZ0cmVlcy5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKK3RyZWVzLm86IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIHRyZWVzLmgKKworYWRsZXIzMi5sbyB6dXRpbC5sbzogenV0aWwuaCB6bGliLmggemNvbmYuaAorZ3pjbG9zZS5sbyBnemxpYi5sbyBnenJlYWQubG8gZ3p3cml0ZS5sbzogemxpYi5oIHpjb25mLmggZ3pndXRzLmgKK2NvbXByZXNzLmxvIGV4YW1wbGUubG8gbWluaWd6aXAubG8gdW5jb21wci5sbzogemxpYi5oIHpjb25mLmgKK2NyYzMyLmxvOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGNyYzMyLmgKK2RlZmxhdGUubG86IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitpbmZiYWNrLmxvIGluZmxhdGUubG86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oIGluZmZpeGVkLmgKK2luZmZhc3QubG86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCitpbmZ0cmVlcy5sbzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCit0cmVlcy5sbzogZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmggdHJlZXMuaApkaWZmIC0tZ2l0IGEvemxpYi9zcmMvUkVBRE1FIGIvemxpYi9zcmMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYTlkMTIKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9SRUFETUUKQEAgLTAsMCArMSwxMTUgQEAKK1pMSUIgREFUQSBDT01QUkVTU0lPTiBMSUJSQVJZCisKK3psaWIgMS4yLjggaXMgYSBnZW5lcmFsIHB1cnBvc2UgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LiAgQWxsIHRoZSBjb2RlIGlzCit0aHJlYWQgc2FmZS4gIFRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkgaXMgZGVzY3JpYmVkIGJ5IFJGQ3MKKyhSZXF1ZXN0IGZvciBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlcworaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMTk1MCAoemxpYiBmb3JtYXQpLCByZmMxOTUxIChkZWZsYXRlIGZvcm1hdCkgYW5kCityZmMxOTUyIChnemlwIGZvcm1hdCkuCisKK0FsbCBmdW5jdGlvbnMgb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYXJlIGRvY3VtZW50ZWQgaW4gdGhlIGZpbGUgemxpYi5oCisodm9sdW50ZWVyIHRvIHdyaXRlIG1hbiBwYWdlcyB3ZWxjb21lLCBjb250YWN0IHpsaWJAZ3ppcC5vcmcpLiAgQSB1c2FnZSBleGFtcGxlCitvZiB0aGUgbGlicmFyeSBpcyBnaXZlbiBpbiB0aGUgZmlsZSB0ZXN0L2V4YW1wbGUuYyB3aGljaCBhbHNvIHRlc3RzIHRoYXQKK3RoZSBsaWJyYXJ5IGlzIHdvcmtpbmcgY29ycmVjdGx5LiAgQW5vdGhlciBleGFtcGxlIGlzIGdpdmVuIGluIHRoZSBmaWxlCit0ZXN0L21pbmlnemlwLmMuICBUaGUgY29tcHJlc3Npb24gbGlicmFyeSBpdHNlbGYgaXMgY29tcG9zZWQgb2YgYWxsIHNvdXJjZQorZmlsZXMgaW4gdGhlIHJvb3QgZGlyZWN0b3J5LgorCitUbyBjb21waWxlIGFsbCBmaWxlcyBhbmQgcnVuIHRoZSB0ZXN0IHByb2dyYW0sIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGdpdmVuIGF0Cit0aGUgdG9wIG9mIE1ha2VmaWxlLmluLiAgSW4gc2hvcnQgIi4vY29uZmlndXJlOyBtYWtlIHRlc3QiLCBhbmQgaWYgdGhhdCBnb2VzCit3ZWxsLCAibWFrZSBpbnN0YWxsIiBzaG91bGQgd29yayBmb3IgbW9zdCBmbGF2b3JzIG9mIFVuaXguICBGb3IgV2luZG93cywgdXNlCitvbmUgb2YgdGhlIHNwZWNpYWwgbWFrZWZpbGVzIGluIHdpbjMyLyBvciBjb250cmliL3ZzdHVkaW8vIC4gIEZvciBWTVMsIHVzZQorbWFrZV92bXMuY29tLgorCitRdWVzdGlvbnMgYWJvdXQgemxpYiBzaG91bGQgYmUgc2VudCB0byA8emxpYkBnemlwLm9yZz4sIG9yIHRvIEdpbGxlcyBWb2xsYW50Cis8aW5mb0B3aW5pbWFnZS5jb20+IGZvciB0aGUgV2luZG93cyBETEwgdmVyc2lvbi4gIFRoZSB6bGliIGhvbWUgcGFnZSBpcworaHR0cDovL3psaWIubmV0LyAuICBCZWZvcmUgcmVwb3J0aW5nIGEgcHJvYmxlbSwgcGxlYXNlIGNoZWNrIHRoaXMgc2l0ZSB0bwordmVyaWZ5IHRoYXQgeW91IGhhdmUgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHpsaWI7IG90aGVyd2lzZSBnZXQgdGhlIGxhdGVzdAordmVyc2lvbiBhbmQgY2hlY2sgd2hldGhlciB0aGUgcHJvYmxlbSBzdGlsbCBleGlzdHMgb3Igbm90LgorCitQTEVBU0UgcmVhZCB0aGUgemxpYiBGQVEgaHR0cDovL3psaWIubmV0L3psaWJfZmFxLmh0bWwgYmVmb3JlIGFza2luZyBmb3IgaGVscC4KKworTWFyayBOZWxzb24gPG1hcmtuQGllZWUub3JnPiB3cm90ZSBhbiBhcnRpY2xlIGFib3V0IHpsaWIgZm9yIHRoZSBKYW4uICAxOTk3Citpc3N1ZSBvZiBEci4gIERvYmIncyBKb3VybmFsOyBhIGNvcHkgb2YgdGhlIGFydGljbGUgaXMgYXZhaWxhYmxlIGF0CitodHRwOi8vbWFya25lbHNvbi51cy8xOTk3LzAxLzAxL3psaWItZW5naW5lLyAuCisKK1RoZSBjaGFuZ2VzIG1hZGUgaW4gdmVyc2lvbiAxLjIuOCBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgZmlsZSBDaGFuZ2VMb2cuCisKK1Vuc3VwcG9ydGVkIHRoaXJkIHBhcnR5IGNvbnRyaWJ1dGlvbnMgYXJlIHByb3ZpZGVkIGluIGRpcmVjdG9yeSBjb250cmliLyAuCisKK3psaWIgaXMgYXZhaWxhYmxlIGluIEphdmEgdXNpbmcgdGhlIGphdmEudXRpbC56aXAgcGFja2FnZSwgZG9jdW1lbnRlZCBhdAoraHR0cDovL2phdmEuc3VuLmNvbS9kZXZlbG9wZXIvdGVjaG5pY2FsQXJ0aWNsZXMvUHJvZ3JhbW1pbmcvY29tcHJlc3Npb24vIC4KKworQSBQZXJsIGludGVyZmFjZSB0byB6bGliIHdyaXR0ZW4gYnkgUGF1bCBNYXJxdWVzcyA8cG1xc0BjcGFuLm9yZz4gaXMgYXZhaWxhYmxlCithdCBDUEFOIChDb21wcmVoZW5zaXZlIFBlcmwgQXJjaGl2ZSBOZXR3b3JrKSBzaXRlcywgaW5jbHVkaW5nCitodHRwOi8vc2VhcmNoLmNwYW4ub3JnL35wbXFzL0lPLUNvbXByZXNzLVpsaWIvIC4KKworQSBQeXRob24gaW50ZXJmYWNlIHRvIHpsaWIgd3JpdHRlbiBieSBBLk0uIEt1Y2hsaW5nIDxhbWtAYW1rLmNhPiBpcworYXZhaWxhYmxlIGluIFB5dGhvbiAxLjUgYW5kIGxhdGVyIHZlcnNpb25zLCBzZWUKK2h0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS96bGliLmh0bWwgLgorCit6bGliIGlzIGJ1aWx0IGludG8gdGNsOiBodHRwOi8vd2lraS50Y2wudGsvNDYxMCAuCisKK0FuIGV4cGVyaW1lbnRhbCBwYWNrYWdlIHRvIHJlYWQgYW5kIHdyaXRlIGZpbGVzIGluIC56aXAgZm9ybWF0LCB3cml0dGVuIG9uIHRvcAorb2YgemxpYiBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+LCBpcyBhdmFpbGFibGUgaW4gdGhlCitjb250cmliL21pbml6aXAgZGlyZWN0b3J5IG9mIHpsaWIuCisKKworTm90ZXMgZm9yIHNvbWUgdGFyZ2V0czoKKworLSBGb3IgV2luZG93cyBETEwgdmVyc2lvbnMsIHBsZWFzZSBzZWUgd2luMzIvRExMX0ZBUS50eHQKKworLSBGb3IgNjQtYml0IElyaXgsIGRlZmxhdGUuYyBtdXN0IGJlIGNvbXBpbGVkIHdpdGhvdXQgYW55IG9wdGltaXphdGlvbi4gV2l0aAorICAtTywgb25lIGxpYnBuZyB0ZXN0IGZhaWxzLiBUaGUgdGVzdCB3b3JrcyBpbiAzMiBiaXQgbW9kZSAod2l0aCB0aGUgLW4zMgorICBjb21waWxlciBmbGFnKS4gVGhlIGNvbXBpbGVyIGJ1ZyBoYXMgYmVlbiByZXBvcnRlZCB0byBTR0kuCisKKy0gemxpYiBkb2Vzbid0IHdvcmsgd2l0aCBnY2MgMi42LjMgb24gYSBERUMgMzAwMC8zMDBMWCB1bmRlciBPU0YvMSAyLjEgaXQgd29ya3MKKyAgd2hlbiBjb21waWxlZCB3aXRoIGNjLgorCistIE9uIERpZ2l0YWwgVW5peCA0LjBEIChmb3JtZWx5IE9TRi8xKSBvbiBBbHBoYVNlcnZlciwgdGhlIGNjIG9wdGlvbiAtc3RkMSBpcworICBuZWNlc3NhcnkgdG8gZ2V0IGd6cHJpbnRmIHdvcmtpbmcgY29ycmVjdGx5LiBUaGlzIGlzIGRvbmUgYnkgY29uZmlndXJlLgorCistIHpsaWIgZG9lc24ndCB3b3JrIG9uIEhQLVVYIDkuMDUgd2l0aCBzb21lIHZlcnNpb25zIG9mIC9iaW4vY2MuIEl0IHdvcmtzIHdpdGgKKyAgb3RoZXIgY29tcGlsZXJzLiBVc2UgIm1ha2UgdGVzdCIgdG8gY2hlY2sgeW91ciBjb21waWxlci4KKworLSBnemRvcGVuIGlzIG5vdCBzdXBwb3J0ZWQgb24gUklTQ09TIG9yIEJFT1MuCisKKy0gRm9yIFBhbG1Pcywgc2VlIGh0dHA6Ly9wYWxtemxpYi5zb3VyY2Vmb3JnZS5uZXQvCisKKworQWNrbm93bGVkZ21lbnRzOgorCisgIFRoZSBkZWZsYXRlIGZvcm1hdCB1c2VkIGJ5IHpsaWIgd2FzIGRlZmluZWQgYnkgUGhpbCBLYXR6LiAgVGhlIGRlZmxhdGUgYW5kCisgIHpsaWIgc3BlY2lmaWNhdGlvbnMgd2VyZSB3cml0dGVuIGJ5IEwuICBQZXRlciBEZXV0c2NoLiAgVGhhbmtzIHRvIGFsbCB0aGUKKyAgcGVvcGxlIHdobyByZXBvcnRlZCBwcm9ibGVtcyBhbmQgc3VnZ2VzdGVkIHZhcmlvdXMgaW1wcm92ZW1lbnRzIGluIHpsaWI7IHRoZXkKKyAgYXJlIHRvbyBudW1lcm91cyB0byBjaXRlIGhlcmUuCisKK0NvcHlyaWdodCBub3RpY2U6CisKKyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKKworICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisKKyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisgIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKKyAgSmVhbi1sb3VwIEdhaWxseSAgICAgICAgTWFyayBBZGxlcgorICBqbG91cEBnemlwLm9yZyAgICAgICAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CisKK0lmIHlvdSB1c2UgdGhlIHpsaWIgbGlicmFyeSBpbiBhIHByb2R1Y3QsIHdlIHdvdWxkIGFwcHJlY2lhdGUgKm5vdCogcmVjZWl2aW5nCitsZW5ndGh5IGxlZ2FsIGRvY3VtZW50cyB0byBzaWduLiAgVGhlIHNvdXJjZXMgYXJlIHByb3ZpZGVkIGZvciBmcmVlIGJ1dCB3aXRob3V0Cit3YXJyYW50eSBvZiBhbnkga2luZC4gIFRoZSBsaWJyYXJ5IGhhcyBiZWVuIGVudGlyZWx5IHdyaXR0ZW4gYnkgSmVhbi1sb3VwCitHYWlsbHkgYW5kIE1hcmsgQWRsZXI7IGl0IGRvZXMgbm90IGluY2x1ZGUgdGhpcmQtcGFydHkgY29kZS4KKworSWYgeW91IHJlZGlzdHJpYnV0ZSBtb2RpZmllZCBzb3VyY2VzLCB3ZSB3b3VsZCBhcHByZWNpYXRlIHRoYXQgeW91IGluY2x1ZGUgaW4KK3RoZSBmaWxlIENoYW5nZUxvZyBoaXN0b3J5IGluZm9ybWF0aW9uIGRvY3VtZW50aW5nIHlvdXIgY2hhbmdlcy4gIFBsZWFzZSByZWFkCit0aGUgRkFRIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBkaXN0cmlidXRpb24gb2YgbW9kaWZpZWQgc291cmNlIHZlcnNpb25zLgpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvYWRsZXIzMi5jIGIvemxpYi9zcmMvYWRsZXIzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NjhmMDcKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9hZGxlcjMyLmMKQEAgLTAsMCArMSwxNzkgQEAKKy8qIGFkbGVyMzIuYyAtLSBjb21wdXRlIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZiBhIGRhdGEgc3RyZWFtCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMSBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogQCgjKSAkSWQkICovCisKKyNpbmNsdWRlICJ6dXRpbC5oIgorCisjZGVmaW5lIGxvY2FsIHN0YXRpYworCitsb2NhbCB1TG9uZyBhZGxlcjMyX2NvbWJpbmVfIE9GKCh1TG9uZyBhZGxlcjEsIHVMb25nIGFkbGVyMiwgel9vZmY2NF90IGxlbjIpKTsKKworI2RlZmluZSBCQVNFIDY1NTIxICAgICAgLyogbGFyZ2VzdCBwcmltZSBzbWFsbGVyIHRoYW4gNjU1MzYgKi8KKyNkZWZpbmUgTk1BWCA1NTUyCisvKiBOTUFYIGlzIHRoZSBsYXJnZXN0IG4gc3VjaCB0aGF0IDI1NW4obisxKS8yICsgKG4rMSkoQkFTRS0xKSA8PSAyXjMyLTEgKi8KKworI2RlZmluZSBETzEoYnVmLGkpICB7YWRsZXIgKz0gKGJ1ZilbaV07IHN1bTIgKz0gYWRsZXI7fQorI2RlZmluZSBETzIoYnVmLGkpICBETzEoYnVmLGkpOyBETzEoYnVmLGkrMSk7CisjZGVmaW5lIERPNChidWYsaSkgIERPMihidWYsaSk7IERPMihidWYsaSsyKTsKKyNkZWZpbmUgRE84KGJ1ZixpKSAgRE80KGJ1ZixpKTsgRE80KGJ1ZixpKzQpOworI2RlZmluZSBETzE2KGJ1ZikgICBETzgoYnVmLDApOyBETzgoYnVmLDgpOworCisvKiB1c2UgTk9fRElWSURFIGlmIHlvdXIgcHJvY2Vzc29yIGRvZXMgbm90IGRvIGRpdmlzaW9uIGluIGhhcmR3YXJlIC0tCisgICB0cnkgaXQgYm90aCB3YXlzIHRvIHNlZSB3aGljaCBpcyBmYXN0ZXIgKi8KKyNpZmRlZiBOT19ESVZJREUKKy8qIG5vdGUgdGhhdCB0aGlzIGFzc3VtZXMgQkFTRSBpcyA2NTUyMSwgd2hlcmUgNjU1MzYgJSA2NTUyMSA9PSAxNQorICAgKHRoYW5rIHlvdSB0byBKb2huIFJlaXNlciBmb3IgcG9pbnRpbmcgdGhpcyBvdXQpICovCisjICBkZWZpbmUgQ0hPUChhKSBcCisgICAgZG8geyBcCisgICAgICAgIHVuc2lnbmVkIGxvbmcgdG1wID0gYSA+PiAxNjsgXAorICAgICAgICBhICY9IDB4ZmZmZlVMOyBcCisgICAgICAgIGEgKz0gKHRtcCA8PCA0KSAtIHRtcDsgXAorICAgIH0gd2hpbGUgKDApCisjICBkZWZpbmUgTU9EMjgoYSkgXAorICAgIGRvIHsgXAorICAgICAgICBDSE9QKGEpOyBcCisgICAgICAgIGlmIChhID49IEJBU0UpIGEgLT0gQkFTRTsgXAorICAgIH0gd2hpbGUgKDApCisjICBkZWZpbmUgTU9EKGEpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQ0hPUChhKTsgXAorICAgICAgICBNT0QyOChhKTsgXAorICAgIH0gd2hpbGUgKDApCisjICBkZWZpbmUgTU9ENjMoYSkgXAorICAgIGRvIHsgLyogdGhpcyBhc3N1bWVzIGEgaXMgbm90IG5lZ2F0aXZlICovIFwKKyAgICAgICAgel9vZmY2NF90IHRtcCA9IGEgPj4gMzI7IFwKKyAgICAgICAgYSAmPSAweGZmZmZmZmZmTDsgXAorICAgICAgICBhICs9ICh0bXAgPDwgOCkgLSAodG1wIDw8IDUpICsgdG1wOyBcCisgICAgICAgIHRtcCA9IGEgPj4gMTY7IFwKKyAgICAgICAgYSAmPSAweGZmZmZMOyBcCisgICAgICAgIGEgKz0gKHRtcCA8PCA0KSAtIHRtcDsgXAorICAgICAgICB0bXAgPSBhID4+IDE2OyBcCisgICAgICAgIGEgJj0gMHhmZmZmTDsgXAorICAgICAgICBhICs9ICh0bXAgPDwgNCkgLSB0bXA7IFwKKyAgICAgICAgaWYgKGEgPj0gQkFTRSkgYSAtPSBCQVNFOyBcCisgICAgfSB3aGlsZSAoMCkKKyNlbHNlCisjICBkZWZpbmUgTU9EKGEpIGEgJT0gQkFTRQorIyAgZGVmaW5lIE1PRDI4KGEpIGEgJT0gQkFTRQorIyAgZGVmaW5lIE1PRDYzKGEpIGEgJT0gQkFTRQorI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3VMb25nIFpFWFBPUlQgYWRsZXIzMihhZGxlciwgYnVmLCBsZW4pCisgICAgdUxvbmcgYWRsZXI7CisgICAgY29uc3QgQnl0ZWYgKmJ1ZjsKKyAgICB1SW50IGxlbjsKK3sKKyAgICB1bnNpZ25lZCBsb25nIHN1bTI7CisgICAgdW5zaWduZWQgbjsKKworICAgIC8qIHNwbGl0IEFkbGVyLTMyIGludG8gY29tcG9uZW50IHN1bXMgKi8KKyAgICBzdW0yID0gKGFkbGVyID4+IDE2KSAmIDB4ZmZmZjsKKyAgICBhZGxlciAmPSAweGZmZmY7CisKKyAgICAvKiBpbiBjYXNlIHVzZXIgbGlrZXMgZG9pbmcgYSBieXRlIGF0IGEgdGltZSwga2VlcCBpdCBmYXN0ICovCisgICAgaWYgKGxlbiA9PSAxKSB7CisgICAgICAgIGFkbGVyICs9IGJ1ZlswXTsKKyAgICAgICAgaWYgKGFkbGVyID49IEJBU0UpCisgICAgICAgICAgICBhZGxlciAtPSBCQVNFOworICAgICAgICBzdW0yICs9IGFkbGVyOworICAgICAgICBpZiAoc3VtMiA+PSBCQVNFKQorICAgICAgICAgICAgc3VtMiAtPSBCQVNFOworICAgICAgICByZXR1cm4gYWRsZXIgfCAoc3VtMiA8PCAxNik7CisgICAgfQorCisgICAgLyogaW5pdGlhbCBBZGxlci0zMiB2YWx1ZSAoZGVmZXJyZWQgY2hlY2sgZm9yIGxlbiA9PSAxIHNwZWVkKSAqLworICAgIGlmIChidWYgPT0gWl9OVUxMKQorICAgICAgICByZXR1cm4gMUw7CisKKyAgICAvKiBpbiBjYXNlIHNob3J0IGxlbmd0aHMgYXJlIHByb3ZpZGVkLCBrZWVwIGl0IHNvbWV3aGF0IGZhc3QgKi8KKyAgICBpZiAobGVuIDwgMTYpIHsKKyAgICAgICAgd2hpbGUgKGxlbi0tKSB7CisgICAgICAgICAgICBhZGxlciArPSAqYnVmKys7CisgICAgICAgICAgICBzdW0yICs9IGFkbGVyOworICAgICAgICB9CisgICAgICAgIGlmIChhZGxlciA+PSBCQVNFKQorICAgICAgICAgICAgYWRsZXIgLT0gQkFTRTsKKyAgICAgICAgTU9EMjgoc3VtMik7ICAgICAgICAgICAgLyogb25seSBhZGRlZCBzbyBtYW55IEJBU0UncyAqLworICAgICAgICByZXR1cm4gYWRsZXIgfCAoc3VtMiA8PCAxNik7CisgICAgfQorCisgICAgLyogZG8gbGVuZ3RoIE5NQVggYmxvY2tzIC0tIHJlcXVpcmVzIGp1c3Qgb25lIG1vZHVsbyBvcGVyYXRpb24gKi8KKyAgICB3aGlsZSAobGVuID49IE5NQVgpIHsKKyAgICAgICAgbGVuIC09IE5NQVg7CisgICAgICAgIG4gPSBOTUFYIC8gMTY7ICAgICAgICAgIC8qIE5NQVggaXMgZGl2aXNpYmxlIGJ5IDE2ICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIERPMTYoYnVmKTsgICAgICAgICAgLyogMTYgc3VtcyB1bnJvbGxlZCAqLworICAgICAgICAgICAgYnVmICs9IDE2OworICAgICAgICB9IHdoaWxlICgtLW4pOworICAgICAgICBNT0QoYWRsZXIpOworICAgICAgICBNT0Qoc3VtMik7CisgICAgfQorCisgICAgLyogZG8gcmVtYWluaW5nIGJ5dGVzIChsZXNzIHRoYW4gTk1BWCwgc3RpbGwganVzdCBvbmUgbW9kdWxvKSAqLworICAgIGlmIChsZW4pIHsgICAgICAgICAgICAgICAgICAvKiBhdm9pZCBtb2R1bG9zIGlmIG5vbmUgcmVtYWluaW5nICovCisgICAgICAgIHdoaWxlIChsZW4gPj0gMTYpIHsKKyAgICAgICAgICAgIGxlbiAtPSAxNjsKKyAgICAgICAgICAgIERPMTYoYnVmKTsKKyAgICAgICAgICAgIGJ1ZiArPSAxNjsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAobGVuLS0pIHsKKyAgICAgICAgICAgIGFkbGVyICs9ICpidWYrKzsKKyAgICAgICAgICAgIHN1bTIgKz0gYWRsZXI7CisgICAgICAgIH0KKyAgICAgICAgTU9EKGFkbGVyKTsKKyAgICAgICAgTU9EKHN1bTIpOworICAgIH0KKworICAgIC8qIHJldHVybiByZWNvbWJpbmVkIHN1bXMgKi8KKyAgICByZXR1cm4gYWRsZXIgfCAoc3VtMiA8PCAxNik7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2xvY2FsIHVMb25nIGFkbGVyMzJfY29tYmluZV8oYWRsZXIxLCBhZGxlcjIsIGxlbjIpCisgICAgdUxvbmcgYWRsZXIxOworICAgIHVMb25nIGFkbGVyMjsKKyAgICB6X29mZjY0X3QgbGVuMjsKK3sKKyAgICB1bnNpZ25lZCBsb25nIHN1bTE7CisgICAgdW5zaWduZWQgbG9uZyBzdW0yOworICAgIHVuc2lnbmVkIHJlbTsKKworICAgIC8qIGZvciBuZWdhdGl2ZSBsZW4sIHJldHVybiBpbnZhbGlkIGFkbGVyMzIgYXMgYSBjbHVlIGZvciBkZWJ1Z2dpbmcgKi8KKyAgICBpZiAobGVuMiA8IDApCisgICAgICAgIHJldHVybiAweGZmZmZmZmZmVUw7CisKKyAgICAvKiB0aGUgZGVyaXZhdGlvbiBvZiB0aGlzIGZvcm11bGEgaXMgbGVmdCBhcyBhbiBleGVyY2lzZSBmb3IgdGhlIHJlYWRlciAqLworICAgIE1PRDYzKGxlbjIpOyAgICAgICAgICAgICAgICAvKiBhc3N1bWVzIGxlbjIgPj0gMCAqLworICAgIHJlbSA9ICh1bnNpZ25lZClsZW4yOworICAgIHN1bTEgPSBhZGxlcjEgJiAweGZmZmY7CisgICAgc3VtMiA9IHJlbSAqIHN1bTE7CisgICAgTU9EKHN1bTIpOworICAgIHN1bTEgKz0gKGFkbGVyMiAmIDB4ZmZmZikgKyBCQVNFIC0gMTsKKyAgICBzdW0yICs9ICgoYWRsZXIxID4+IDE2KSAmIDB4ZmZmZikgKyAoKGFkbGVyMiA+PiAxNikgJiAweGZmZmYpICsgQkFTRSAtIHJlbTsKKyAgICBpZiAoc3VtMSA+PSBCQVNFKSBzdW0xIC09IEJBU0U7CisgICAgaWYgKHN1bTEgPj0gQkFTRSkgc3VtMSAtPSBCQVNFOworICAgIGlmIChzdW0yID49IChCQVNFIDw8IDEpKSBzdW0yIC09IChCQVNFIDw8IDEpOworICAgIGlmIChzdW0yID49IEJBU0UpIHN1bTIgLT0gQkFTRTsKKyAgICByZXR1cm4gc3VtMSB8IChzdW0yIDw8IDE2KTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwordUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmUoYWRsZXIxLCBhZGxlcjIsIGxlbjIpCisgICAgdUxvbmcgYWRsZXIxOworICAgIHVMb25nIGFkbGVyMjsKKyAgICB6X29mZl90IGxlbjI7Cit7CisgICAgcmV0dXJuIGFkbGVyMzJfY29tYmluZV8oYWRsZXIxLCBhZGxlcjIsIGxlbjIpOworfQorCit1TG9uZyBaRVhQT1JUIGFkbGVyMzJfY29tYmluZTY0KGFkbGVyMSwgYWRsZXIyLCBsZW4yKQorICAgIHVMb25nIGFkbGVyMTsKKyAgICB1TG9uZyBhZGxlcjI7CisgICAgel9vZmY2NF90IGxlbjI7Cit7CisgICAgcmV0dXJuIGFkbGVyMzJfY29tYmluZV8oYWRsZXIxLCBhZGxlcjIsIGxlbjIpOworfQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvYW1pZ2EvTWFrZWZpbGUucHVwIGIvemxpYi9zcmMvYW1pZ2EvTWFrZWZpbGUucHVwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NDBjMTIKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9hbWlnYS9NYWtlZmlsZS5wdXAKQEAgLTAsMCArMSw2OSBAQAorIyBBbWlnYSBwb3dlclVQIChUTSkgTWFrZWZpbGUKKyMgbWFrZWZpbGUgZm9yIGxpYnBuZyBhbmQgU0FTIEMgVjYuNTgvNy4wMCBQUEMgY29tcGlsZXIKKyMgQ29weXJpZ2h0IChDKSAxOTk4IGJ5IEFuZHJlYXMgUi4gS2xlaW5lcnQKKworTElCTkFNRQk9IGxpYnppcC5hCisKK0NDCT0gc2NwcGMKK0NGTEFHUwk9IE5PU1RLQ0hLIE5PU0lOVCBPUFRJTUlaRSBPUFRHTyBPUFRQRUVQIE9QVElOTE9DQUwgT1BUSU5MIFwKKwkgIE9QVExPT1AgT1BUUkRFUD04IE9QVERFUD04IE9QVENPTVA9OCBOT1ZFUgorQVIJPSBwcGMtYW1pZ2Fvcy1hciBjcgorUkFOTElCCT0gcHBjLWFtaWdhb3MtcmFubGliCitMRAk9IHBwYy1hbWlnYW9zLWxkIC1yCitMREZMQUdTCT0gLW8KK0xETElCUwk9IExJQjpzY3BwYy5hIExJQjplbmQubworUk0JPSBkZWxldGUgcXVpZXQKKworT0JKUyA9IGFkbGVyMzIubyBjb21wcmVzcy5vIGNyYzMyLm8gZ3pjbG9zZS5vIGd6bGliLm8gZ3pyZWFkLm8gZ3p3cml0ZS5vIFwKKyAgICAgICB1bmNvbXByLm8gZGVmbGF0ZS5vIHRyZWVzLm8genV0aWwubyBpbmZsYXRlLm8gaW5mYmFjay5vIGluZnRyZWVzLm8gaW5mZmFzdC5vCisKK1RFU1RfT0JKUyA9IGV4YW1wbGUubyBtaW5pZ3ppcC5vCisKK2FsbDogZXhhbXBsZSBtaW5pZ3ppcAorCitjaGVjazogdGVzdAordGVzdDogYWxsCisJZXhhbXBsZQorCWVjaG8gaGVsbG8gd29ybGQgfCBtaW5pZ3ppcCB8IG1pbmlnemlwIC1kCisKKyQoTElCTkFNRSk6ICQoT0JKUykKKwkkKEFSKSAkQCAkKE9CSlMpCisJLSQoUkFOTElCKSAkQAorCitleGFtcGxlOiBleGFtcGxlLm8gJChMSUJOQU1FKQorCSQoTEQpICQoTERGTEFHUykgJEAgTElCOmNfcHBjLm8gJEAubyAkKExJQk5BTUUpICQoTERMSUJTKQorCittaW5pZ3ppcDogbWluaWd6aXAubyAkKExJQk5BTUUpCisJJChMRCkgJChMREZMQUdTKSAkQCBMSUI6Y19wcGMubyAkQC5vICQoTElCTkFNRSkgJChMRExJQlMpCisKK21vc3RseWNsZWFuOiBjbGVhbgorY2xlYW46CisJJChSTSkgKi5vIGV4YW1wbGUgbWluaWd6aXAgJChMSUJOQU1FKSBmb28uZ3oKKworemlwOgorCXppcCAtdWw5IHpsaWIgUkVBRE1FIENoYW5nZUxvZyBNYWtlZmlsZSBNYWtlPz8/Py4/Pz8gTWFrZWZpbGUuPz8gXAorCSAgZGVzY3JpcC5tbXMgKi5bY2hdCisKK3RnejoKKwljZCAuLjsgdGFyIGNmeiB6bGliL3psaWIudGd6IHpsaWIvUkVBRE1FIHpsaWIvQ2hhbmdlTG9nIHpsaWIvTWFrZWZpbGUgXAorCSAgemxpYi9NYWtlPz8/Py4/Pz8gemxpYi9NYWtlZmlsZS4/PyB6bGliL2Rlc2NyaXAubW1zIHpsaWIvKi5bY2hdCisKKyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KKworYWRsZXIzMi5vOiB6bGliLmggemNvbmYuaAorY29tcHJlc3MubzogemxpYi5oIHpjb25mLmgKK2NyYzMyLm86IGNyYzMyLmggemxpYi5oIHpjb25mLmgKK2RlZmxhdGUubzogZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKK2V4YW1wbGUubzogemxpYi5oIHpjb25mLmgKK2d6Y2xvc2UubzogemxpYi5oIHpjb25mLmggZ3pndXRzLmgKK2d6bGliLm86IHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCitnenJlYWQubzogemxpYi5oIHpjb25mLmggZ3pndXRzLmgKK2d6d3JpdGUubzogemxpYi5oIHpjb25mLmggZ3pndXRzLmgKK2luZmZhc3QubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKK2luZmxhdGUubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKK2luZmJhY2subzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKK2luZnRyZWVzLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAorbWluaWd6aXAubzogemxpYi5oIHpjb25mLmgKK3RyZWVzLm86IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIHRyZWVzLmgKK3VuY29tcHIubzogemxpYi5oIHpjb25mLmgKK3p1dGlsLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmgKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2FtaWdhL01ha2VmaWxlLnNhcyBiL3psaWIvc3JjL2FtaWdhL01ha2VmaWxlLnNhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDllMjkxCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvYW1pZ2EvTWFrZWZpbGUuc2FzCkBAIC0wLDAgKzEsNjggQEAKKyMgU01ha2VmaWxlIGZvciB6bGliCisjIE1vZGlmaWVkIGZyb20gdGhlIHN0YW5kYXJkIFVOSVggTWFrZWZpbGUgQ29weXJpZ2h0IEplYW4tbG91cCBHYWlsbHkKKyMgT3NtYSBBaHZlbmxhbXBpIDxPc21hLkFodmVubGFtcGlAaHV0LmZpPgorIyBBbWlnYSwgU0FTL0MgNi41NiAmIFNtYWtlCisKK0NDPXNjCitDRkxBR1M9T1BUCisjQ0ZMQUdTPU9QVCBDUFU9NjgwMzAKKyNDRkxBR1M9REVCVUc9TElORQorTERGTEFHUz1MSUIgei5saWIKKworU0NPUFRJT05TPU9QVFNDSEVEIE9QVElOTElORSBPUFRBTElBUyBPUFRUSU1FIE9QVElOTE9DQUwgU1RSTUVSR0UgXAorICAgICAgIE5PSUNPTlMgUEFSTVM9Qk9USCBOT1NUQUNLQ0hFQ0sgVVRJTExJQiBOT1ZFUlNJT04gRVJST1JSRVhYIFwKKyAgICAgICBERUY9UE9TVElOQworCitPQkpTID0gYWRsZXIzMi5vIGNvbXByZXNzLm8gY3JjMzIubyBnemNsb3NlLm8gZ3psaWIubyBnenJlYWQubyBnendyaXRlLm8gXAorICAgICAgIHVuY29tcHIubyBkZWZsYXRlLm8gdHJlZXMubyB6dXRpbC5vIGluZmxhdGUubyBpbmZiYWNrLm8gaW5mdHJlZXMubyBpbmZmYXN0Lm8KKworVEVTVF9PQkpTID0gZXhhbXBsZS5vIG1pbmlnemlwLm8KKworYWxsOiBTQ09QVElPTlMgZXhhbXBsZSBtaW5pZ3ppcAorCitjaGVjazogdGVzdAordGVzdDogYWxsCisJZXhhbXBsZQorCWVjaG8gaGVsbG8gd29ybGQgfCBtaW5pZ3ppcCB8IG1pbmlnemlwIC1kCisKK2luc3RhbGw6IHoubGliCisJY29weSBjbG9uZSB6bGliLmggemNvbmYuaCBJTkNMVURFOgorCWNvcHkgY2xvbmUgei5saWIgTElCOgorCit6LmxpYjogJChPQkpTKQorCW9tbCB6LmxpYiByICQoT0JKUykKKworZXhhbXBsZTogZXhhbXBsZS5vIHoubGliCisJJChDQykgJChDRkxBR1MpIExJTksgVE8gJEAgZXhhbXBsZS5vICQoTERGTEFHUykKKworbWluaWd6aXA6IG1pbmlnemlwLm8gei5saWIKKwkkKENDKSAkKENGTEFHUykgTElOSyBUTyAkQCBtaW5pZ3ppcC5vICQoTERGTEFHUykKKworbW9zdGx5Y2xlYW46IGNsZWFuCitjbGVhbjoKKwktZGVsZXRlIGZvcmNlIHF1aWV0IGV4YW1wbGUgbWluaWd6aXAgKi5vIHoubGliIGZvby5neiAqLmxuayBTQ09QVElPTlMKKworU0NPUFRJT05TOiBNYWtlZmlsZS5zYXMKKwljb3B5IHRvICRAIDxmcm9tIDwKKyQoU0NPUFRJT05TKQorPAorCisjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCisKK2FkbGVyMzIubzogemxpYi5oIHpjb25mLmgKK2NvbXByZXNzLm86IHpsaWIuaCB6Y29uZi5oCitjcmMzMi5vOiBjcmMzMi5oIHpsaWIuaCB6Y29uZi5oCitkZWZsYXRlLm86IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitleGFtcGxlLm86IHpsaWIuaCB6Y29uZi5oCitnemNsb3NlLm86IHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCitnemxpYi5vOiB6bGliLmggemNvbmYuaCBnemd1dHMuaAorZ3pyZWFkLm86IHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCitnendyaXRlLm86IHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCitpbmZmYXN0Lm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCitpbmZsYXRlLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCitpbmZiYWNrLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCitpbmZ0cmVlcy5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKK21pbmlnemlwLm86IHpsaWIuaCB6Y29uZi5oCit0cmVlcy5vOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaCB0cmVlcy5oCit1bmNvbXByLm86IHpsaWIuaCB6Y29uZi5oCit6dXRpbC5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCmRpZmYgLS1naXQgYS96bGliL3NyYy9hczQwMC9ibmRzcmMgYi96bGliL3NyYy9hczQwMC9ibmRzcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg4MTRmZAotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2FzNDAwL2JuZHNyYwpAQCAtMCwwICsxLDIxNSBAQAorU1RSUEdNRVhQIFBHTUxWTCgqQ1VSUkVOVCkgU0lHTkFUVVJFKCdaTElCJykKKworLypAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAqLworLyogICBWZXJzaW9uIDEuMS4zIGVudHJ5IHBvaW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLypAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICpNT0RVTEUgICAgICBBRExFUjMyICAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgRVhQT1JUIFNZTUJPTCgiYWRsZXIzMiIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgKk1PRFVMRSAgICAgIENPTVBSRVNTICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBFWFBPUlQgU1lNQk9MKCJjb21wcmVzcyIpCisgIEVYUE9SVCBTWU1CT0woImNvbXByZXNzMiIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgKk1PRFVMRSAgICAgIENSQzMyICAgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBFWFBPUlQgU1lNQk9MKCJjcmMzMiIpCisgIEVYUE9SVCBTWU1CT0woImdldF9jcmNfdGFibGUiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICpNT0RVTEUgICAgICBERUZMQVRFICAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgRVhQT1JUIFNZTUJPTCgiZGVmbGF0ZSIpCisgIEVYUE9SVCBTWU1CT0woImRlZmxhdGVFbmQiKQorICBFWFBPUlQgU1lNQk9MKCJkZWZsYXRlU2V0RGljdGlvbmFyeSIpCisgIEVYUE9SVCBTWU1CT0woImRlZmxhdGVDb3B5IikKKyAgRVhQT1JUIFNZTUJPTCgiZGVmbGF0ZVJlc2V0IikKKyAgRVhQT1JUIFNZTUJPTCgiZGVmbGF0ZVBhcmFtcyIpCisgIEVYUE9SVCBTWU1CT0woImRlZmxhdGVQcmltZSIpCisgIEVYUE9SVCBTWU1CT0woImRlZmxhdGVJbml0XyIpCisgIEVYUE9SVCBTWU1CT0woImRlZmxhdGVJbml0Ml8iKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICpNT0RVTEUgICAgICBHWklPICAgICAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgRVhQT1JUIFNZTUJPTCgiZ3pvcGVuIikKKyAgRVhQT1JUIFNZTUJPTCgiZ3pkb3BlbiIpCisgIEVYUE9SVCBTWU1CT0woImd6c2V0cGFyYW1zIikKKyAgRVhQT1JUIFNZTUJPTCgiZ3pyZWFkIikKKyAgRVhQT1JUIFNZTUJPTCgiZ3p3cml0ZSIpCisgIEVYUE9SVCBTWU1CT0woImd6cHJpbnRmIikKKyAgRVhQT1JUIFNZTUJPTCgiZ3pwdXRzIikKKyAgRVhQT1JUIFNZTUJPTCgiZ3pnZXRzIikKKyAgRVhQT1JUIFNZTUJPTCgiZ3pwdXRjIikKKyAgRVhQT1JUIFNZTUJPTCgiZ3pnZXRjIikKKyAgRVhQT1JUIFNZTUJPTCgiZ3pmbHVzaCIpCisgIEVYUE9SVCBTWU1CT0woImd6c2VlayIpCisgIEVYUE9SVCBTWU1CT0woImd6cmV3aW5kIikKKyAgRVhQT1JUIFNZTUJPTCgiZ3p0ZWxsIikKKyAgRVhQT1JUIFNZTUJPTCgiZ3plb2YiKQorICBFWFBPUlQgU1lNQk9MKCJnemNsb3NlIikKKyAgRVhQT1JUIFNZTUJPTCgiZ3plcnJvciIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgKk1PRFVMRSAgICAgIElORkxBVEUgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBFWFBPUlQgU1lNQk9MKCJpbmZsYXRlIikKKyAgRVhQT1JUIFNZTUJPTCgiaW5mbGF0ZUVuZCIpCisgIEVYUE9SVCBTWU1CT0woImluZmxhdGVTZXREaWN0aW9uYXJ5IikKKyAgRVhQT1JUIFNZTUJPTCgiaW5mbGF0ZVN5bmMiKQorICBFWFBPUlQgU1lNQk9MKCJpbmZsYXRlUmVzZXQiKQorICBFWFBPUlQgU1lNQk9MKCJpbmZsYXRlSW5pdF8iKQorICBFWFBPUlQgU1lNQk9MKCJpbmZsYXRlSW5pdDJfIikKKyAgRVhQT1JUIFNZTUJPTCgiaW5mbGF0ZVN5bmNQb2ludCIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgKk1PRFVMRSAgICAgIFVOQ09NUFIgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBFWFBPUlQgU1lNQk9MKCJ1bmNvbXByZXNzIikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAqTU9EVUxFICAgICAgWlVUSUwgICAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVCBTWU1CT0woInpsaWJWZXJzaW9uIikKKyAgRVhQT1JUIFNZTUJPTCgiekVycm9yIikKKworLypAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAqLworLyogICBWZXJzaW9uIDEuMi4xIGFkZGl0aW9uYWwgZW50cnkgcG9pbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworLypAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICpNT0RVTEUgICAgICBDT01QUkVTUyAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgRVhQT1JUIFNZTUJPTCgiY29tcHJlc3NCb3VuZCIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgKk1PRFVMRSAgICAgIERFRkxBVEUgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBFWFBPUlQgU1lNQk9MKCJkZWZsYXRlQm91bmQiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICpNT0RVTEUgICAgICBHWklPICAgICAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgRVhQT1JUIFNZTUJPTCgiZ3p1bmdldGMiKQorICBFWFBPUlQgU1lNQk9MKCJnemNsZWFyZXJyIikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAqTU9EVUxFICAgICAgSU5GQkFDSyAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVCBTWU1CT0woImluZmxhdGVCYWNrIikKKyAgRVhQT1JUIFNZTUJPTCgiaW5mbGF0ZUJhY2tFbmQiKQorICBFWFBPUlQgU1lNQk9MKCJpbmZsYXRlQmFja0luaXRfIikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAqTU9EVUxFICAgICAgSU5GTEFURSAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVCBTWU1CT0woImluZmxhdGVDb3B5IikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAqTU9EVUxFICAgICAgWlVUSUwgICAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVCBTWU1CT0woInpsaWJDb21waWxlRmxhZ3MiKQorCisvKkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCovCisvKiAgIFZlcnNpb24gMS4yLjUgYWRkaXRpb25hbCBlbnRyeSBwb2ludHMuICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgKk1PRFVMRSAgICAgIEFETEVSMzIgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBFWFBPUlQgU1lNQk9MKCJhZGxlcjMyX2NvbWJpbmUiKQorICBFWFBPUlQgU1lNQk9MKCJhZGxlcjMyX2NvbWJpbmU2NCIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgKk1PRFVMRSAgICAgIENSQzMyICAgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBFWFBPUlQgU1lNQk9MKCJjcmMzMl9jb21iaW5lIikKKyAgRVhQT1JUIFNZTUJPTCgiY3JjMzJfY29tYmluZTY0IikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAqTU9EVUxFICAgICAgR1pMSUIgICAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVCBTWU1CT0woImd6YnVmZmVyIikKKyAgRVhQT1JUIFNZTUJPTCgiZ3pvZmZzZXQiKQorICBFWFBPUlQgU1lNQk9MKCJnem9mZnNldDY0IikKKyAgRVhQT1JUIFNZTUJPTCgiZ3pvcGVuNjQiKQorICBFWFBPUlQgU1lNQk9MKCJnenNlZWs2NCIpCisgIEVYUE9SVCBTWU1CT0woImd6dGVsbDY0IikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAqTU9EVUxFICAgICAgR1pSRUFEICAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVCBTWU1CT0woImd6Y2xvc2VfciIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgKk1PRFVMRSAgICAgIEdaV1JJVEUgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBFWFBPUlQgU1lNQk9MKCJnemNsb3NlX3ciKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICpNT0RVTEUgICAgICBJTkZMQVRFICAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgRVhQT1JUIFNZTUJPTCgiaW5mbGF0ZU1hcmsiKQorICBFWFBPUlQgU1lNQk9MKCJpbmZsYXRlUHJpbWUiKQorICBFWFBPUlQgU1lNQk9MKCJpbmZsYXRlUmVzZXQyIikKKyAgRVhQT1JUIFNZTUJPTCgiaW5mbGF0ZVVuZGVybWluZSIpCisKKy8qQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAKi8KKy8qICAgVmVyc2lvbiAxLjIuNiBhZGRpdGlvbmFsIGVudHJ5IHBvaW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAqTU9EVUxFICAgICAgREVGTEFURSAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVCBTWU1CT0woImRlZmxhdGVSZXNldEtlZXAiKQorICBFWFBPUlQgU1lNQk9MKCJkZWZsYXRlUGVuZGluZyIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgKk1PRFVMRSAgICAgIEdaV1JJVEUgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBFWFBPUlQgU1lNQk9MKCJnemdldGNfIikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAqTU9EVUxFICAgICAgSU5GTEFURSAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVCBTWU1CT0woImluZmxhdGVSZXNldEtlZXAiKQorCisvKkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCovCisvKiAgIFZlcnNpb24gMS4yLjggYWRkaXRpb25hbCBlbnRyeSBwb2ludHMuICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgKk1PRFVMRSAgICAgIElORkxBVEUgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBFWFBPUlQgU1lNQk9MKCJpbmZsYXRlR2V0RGljdGlvbmFyeSIpCisKK0VORFBHTUVYUApkaWZmIC0tZ2l0IGEvemxpYi9zcmMvYXM0MDAvY29tcGlsZS5jbHAgYi96bGliL3NyYy9hczQwMC9jb21waWxlLmNscApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2Y0N2M2Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvYXM0MDAvY29tcGlsZS5jbHAKQEAgLTAsMCArMSwxMTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFpMSUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBDb21waWxlIHNvdXJjZXMgaW50byBtb2R1bGVzIGFuZCBsaW5rIHRoZW0gaW50byBhIHNlcnZpY2UgcHJvZ3JhbS4gICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgICBQR00KKworLyogICAgICBDb25maWd1cmF0aW9uIGFkanVzdGFibGUgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgIERDTCAgICAgICAgVkFSKCZTUkNMSUIpIFRZUEUoKkNIQVIpIExFTigxMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSgnWkxJQicpICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSBsaWJyYXJ5LiAqLworICAgICAgICAgICAgIERDTCAgICAgICAgVkFSKCZTUkNGSUxFKSBUWVBFKCpDSEFSKSBMRU4oMTApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUUoJ1NPVVJDRVMnKSAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgbWVtYmVyIGZpbGUuICovCisgICAgICAgICAgICAgRENMICAgICAgICBWQVIoJkNUTEZJTEUpIFRZUEUoKkNIQVIpIExFTigxMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSgnVE9PTFMnKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgbWVtYmVyIGZpbGUuICovCisKKyAgICAgICAgICAgICBEQ0wgICAgICAgIFZBUigmTU9ETElCKSBUWVBFKCpDSEFSKSBMRU4oMTApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUUoJ1pMSUInKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb2R1bGUgbGlicmFyeS4gKi8KKworICAgICAgICAgICAgIERDTCAgICAgICAgVkFSKCZTUlZMSUIpIFRZUEUoKkNIQVIpIExFTigxMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSgnTEdQTCcpICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlcnZpY2UgcHJvZ3JhbSBsaWJyYXJ5LiAqLworCisgICAgICAgICAgICAgRENMICAgICAgICBWQVIoJkNGTEFHUykgVFlQRSgqQ0hBUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSgnT1BUSU1JWkUoNDApJykgICAgICAgICAgICAgICAgIC8qIENvbXBpbGUgb3B0aW9ucy4gKi8KKworICAgICAgICAgICAgIERDTCAgICAgICAgVkFSKCZUR1RSTFMpIFRZUEUoKkNIQVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUUoJ1Y1UjNNMCcpICAgICAgICAgICAgICAgICAgICAgICAvKiBUYXJnZXQgcmVsZWFzZS4gKi8KKworCisvKiAgICAgIFdvcmtpbmcgc3RvcmFnZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgRENMICAgICAgICBWQVIoJkNNRExFTikgVFlQRSgqREVDKSBMRU4oMTUgNSkgVkFMVUUoMzAwKSAgICAvKiBDb21tYW5kIGxlbmd0aC4gKi8KKyAgICAgICAgICAgICBEQ0wgICAgICAgIFZBUigmQ01EKSBUWVBFKCpDSEFSKSBMRU4oNTEyKQorICAgICAgICAgICAgIERDTCAgICAgICAgVkFSKCZGSVhEQ01EKSBUWVBFKCpDSEFSKSBMRU4oNTEyKQorCisKKy8qICAgICAgQ29tcGlsZSBzb3VyY2VzIGludG8gbW9kdWxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICBDSEdWQVIgICAgIFZBUigmRklYRENNRCkgVkFMVUUoJ0NSVENNT0QnICpCQ0FUICZDRkxBR1MgKkJDQVQgICAgICArCisgICAgICAgICAgICAgICAgICAgICAgICAnU1lTSUZDT1BUKCpJRlM2NElPKScgKkJDQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKworICAgICAgICAgICAgICAgICAgICAgICAgJ0RFRklORSgnJ19MQVJHRUZJTEU2NF9TT1VSQ0UnJycgKkJDQVQgICAgICAgICAgICAgICAgICsKKyAgICAgICAgICAgICAgICAgICAgICAgICcnJ19MRlM2NF9MQVJHRUZJTEU9MScnKSBUR1RSTFMoJyAqVENBVCAmVEdUUkxTICpUQ0FUICArCisgICAgICAgICAgICAgICAgICAgICAgICAnKSBTUkNGSUxFKCcgKlRDQVQgJlNSQ0xJQiAqVENBVCAnLycgKlRDQVQgICAgICAgICAgICAgKworICAgICAgICAgICAgICAgICAgICAgICAgJlNSQ0ZJTEUgKlRDQVQgJykgTU9EVUxFKCcgKlRDQVQgJk1PRExJQiAqVENBVCAnLycpCisKKworICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZDTUQpIFZBTFVFKCZGSVhEQ01EICpUQ0FUICdBRExFUjMyKScpCisgICAgICAgICAgICAgQ0FMTCAgICAgICBQR00oUUNNREVYQykgUEFSTSgmQ01EICZDTURMRU4pCisKKyAgICAgICAgICAgICBDSEdWQVIgICAgIFZBUigmQ01EKSBWQUxVRSgmRklYRENNRCAqVENBVCAnQ09NUFJFU1MpJykKKyAgICAgICAgICAgICBDQUxMICAgICAgIFBHTShRQ01ERVhDKSBQQVJNKCZDTUQgJkNNRExFTikKKworICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZDTUQpIFZBTFVFKCZGSVhEQ01EICpUQ0FUICdDUkMzMiknKQorICAgICAgICAgICAgIENBTEwgICAgICAgUEdNKFFDTURFWEMpIFBBUk0oJkNNRCAmQ01ETEVOKQorCisgICAgICAgICAgICAgQ0hHVkFSICAgICBWQVIoJkNNRCkgVkFMVUUoJkZJWERDTUQgKlRDQVQgJ0RFRkxBVEUpJykKKyAgICAgICAgICAgICBDQUxMICAgICAgIFBHTShRQ01ERVhDKSBQQVJNKCZDTUQgJkNNRExFTikKKworICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZDTUQpIFZBTFVFKCZGSVhEQ01EICpUQ0FUICdHWkNMT1NFKScpCisgICAgICAgICAgICAgQ0FMTCAgICAgICBQR00oUUNNREVYQykgUEFSTSgmQ01EICZDTURMRU4pCisKKyAgICAgICAgICAgICBDSEdWQVIgICAgIFZBUigmQ01EKSBWQUxVRSgmRklYRENNRCAqVENBVCAnR1pMSUIpJykKKyAgICAgICAgICAgICBDQUxMICAgICAgIFBHTShRQ01ERVhDKSBQQVJNKCZDTUQgJkNNRExFTikKKworICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZDTUQpIFZBTFVFKCZGSVhEQ01EICpUQ0FUICdHWlJFQUQpJykKKyAgICAgICAgICAgICBDQUxMICAgICAgIFBHTShRQ01ERVhDKSBQQVJNKCZDTUQgJkNNRExFTikKKworICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZDTUQpIFZBTFVFKCZGSVhEQ01EICpUQ0FUICdHWldSSVRFKScpCisgICAgICAgICAgICAgQ0FMTCAgICAgICBQR00oUUNNREVYQykgUEFSTSgmQ01EICZDTURMRU4pCisKKyAgICAgICAgICAgICBDSEdWQVIgICAgIFZBUigmQ01EKSBWQUxVRSgmRklYRENNRCAqVENBVCAnSU5GQkFDSyknKQorICAgICAgICAgICAgIENBTEwgICAgICAgUEdNKFFDTURFWEMpIFBBUk0oJkNNRCAmQ01ETEVOKQorCisgICAgICAgICAgICAgQ0hHVkFSICAgICBWQVIoJkNNRCkgVkFMVUUoJkZJWERDTUQgKlRDQVQgJ0lORkZBU1QpJykKKyAgICAgICAgICAgICBDQUxMICAgICAgIFBHTShRQ01ERVhDKSBQQVJNKCZDTUQgJkNNRExFTikKKworICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZDTUQpIFZBTFVFKCZGSVhEQ01EICpUQ0FUICdJTkZMQVRFKScpCisgICAgICAgICAgICAgQ0FMTCAgICAgICBQR00oUUNNREVYQykgUEFSTSgmQ01EICZDTURMRU4pCisKKyAgICAgICAgICAgICBDSEdWQVIgICAgIFZBUigmQ01EKSBWQUxVRSgmRklYRENNRCAqVENBVCAnSU5GVFJFRVMpJykKKyAgICAgICAgICAgICBDQUxMICAgICAgIFBHTShRQ01ERVhDKSBQQVJNKCZDTUQgJkNNRExFTikKKworICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZDTUQpIFZBTFVFKCZGSVhEQ01EICpUQ0FUICdUUkVFUyknKQorICAgICAgICAgICAgIENBTEwgICAgICAgUEdNKFFDTURFWEMpIFBBUk0oJkNNRCAmQ01ETEVOKQorCisgICAgICAgICAgICAgQ0hHVkFSICAgICBWQVIoJkNNRCkgVkFMVUUoJkZJWERDTUQgKlRDQVQgJ1VOQ09NUFIpJykKKyAgICAgICAgICAgICBDQUxMICAgICAgIFBHTShRQ01ERVhDKSBQQVJNKCZDTUQgJkNNRExFTikKKworICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZDTUQpIFZBTFVFKCZGSVhEQ01EICpUQ0FUICdaVVRJTCknKQorICAgICAgICAgICAgIENBTEwgICAgICAgUEdNKFFDTURFWEMpIFBBUk0oJkNNRCAmQ01ETEVOKQorCisKKy8qICAgICAgTGluayBtb2R1bGVzIGludG8gYSBzZXJ2aWNlIHByb2dyYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICBDUlRTUlZQR00gIFNSVlBHTSgmU1JWTElCL1pMSUIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTU9EVUxFKCZNT0RMSUIvQURMRVIzMiAgICAgJk1PRExJQi9DT01QUkVTUyAgICArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTU9ETElCL0NSQzMyICAgICAgICZNT0RMSUIvREVGTEFURSAgICAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1PRExJQi9HWkNMT1NFICAgICAmTU9ETElCL0daTElCICAgICAgICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNT0RMSUIvR1pSRUFEICAgICAgJk1PRExJQi9HWldSSVRFICAgICArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTU9ETElCL0lORkJBQ0sgICAgICZNT0RMSUIvSU5GRkFTVCAgICAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1PRExJQi9JTkZMQVRFICAgICAmTU9ETElCL0lORlRSRUVTICAgICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNT0RMSUIvVFJFRVMgICAgICAgJk1PRExJQi9VTkNPTVBSICAgICArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTU9ETElCL1pVVElMKSAgICAgICAgICAgICAgICAgICAgICAgICAgKworICAgICAgICAgICAgICAgICAgICAgICAgICBTUkNGSUxFKCZTUkNMSUIvJkNUTEZJTEUpIFNSQ01CUihCTkRTUkMpICAgICAgICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVYVCgnWkxJQiAxLjIuOCcpIFRHVFJMUygmVEdUUkxTKQorCisgICAgICAgICAgICAgRU5EUEdNCmRpZmYgLS1naXQgYS96bGliL3NyYy9hczQwMC9yZWFkbWUudHh0IGIvemxpYi9zcmMvYXM0MDAvcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjVkOTNiCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvYXM0MDAvcmVhZG1lLnR4dApAQCAtMCwwICsxLDExNSBAQAorICAgICAgICBaTElCIHZlcnNpb24gMS4yLjggZm9yIEFTNDAwIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMKKworSSkgRnJvbSBhbiBBUzQwMCAqU0FWRiBmaWxlOgorCisxKSAgICAgIFVucGFja2luZyBhcmNoaXZlIHRvIGFuIEFTNDAwIHNhdmUgZmlsZQorCitPbiB0aGUgQVM0MDA6CisKK18gICAgICAgQ3JlYXRlIHRoZSBaTElCIEFTNDAwIGxpYnJhcnk6CisKKyAgICAgICAgQ1JUTElCIExJQihaTElCKSBUWVBFKCpQUk9EKSBURVhUKCdaTElCIGNvbXByZXNzaW9uIEFQSSBsaWJyYXJ5JykKKworXyAgICAgICBDcmVhdGUgYSB3b3JrIHNhdmUgZmlsZSwgZm9yIGV4YW1wbGU6CisKKyAgICAgICAgICAgICAgICBDUlRTQVZGIEZJTEUoWkxJQi9aTElCU0FWRikKKworT24gYSBQQyBjb25uZWN0ZWQgdG8gdGhlIHRhcmdldCBBUzQwMDoKKworXyAgICAgICBVbnBhY2sgdGhlIHNhdmUgZmlsZSBpbWFnZSB0byBhIFBDIGZpbGUgIlpMSUJTQVZGIgorXyAgICAgICBVcGxvYWQgdGhpcyBmaWxlIGludG8gdGhlIHNhdmUgZmlsZSBvbiB0aGUgQVM0MDAsIGZvciBleGFtcGxlCisgICAgICAgICAgICAgICAgdXNpbmcgZnRwIGluIEJJTkFSWSBtb2RlLgorCisKKzIpICAgICAgUG9wdWxhdGluZyB0aGUgWkxJQiBBUzQwMCBzb3VyY2UgbGlicmFyeQorCitPbiB0aGUgQVM0MDA6CisKK18gICAgICAgRXh0cmFjdCB0aGUgc2F2ZWQgb2JqZWN0cyBpbnRvIHRoZSBaTElCIEFTNDAwIGxpYnJhcnkgdXNpbmc6CisKK1JTVE9CSiBPQkooKkFMTCkgU0FWTElCKFpMSUIpIERFVigqU0FWRikgU0FWRihaTElCL1pMSUJTQVZGKSBSU1RMSUIoWkxJQikKKworCiszKSAgICAgIEN1c3RvbWl6ZSBpbnN0YWxsYXRpb246CisKK18gICAgICAgRWRpdCBDTCBtZW1iZXIgWkxJQi9UT09MUyhDT01QSUxFKSBhbmQgY2hhbmdlIHBhcmFtZXRlcnMgaWYgbmVlZGVkLAorICAgICAgICAgICAgICAgIGFjY29yZGluZyB0byB0aGUgY29tbWVudHMuCisKK18gICAgICAgQ29tcGlsZSB0aGlzIG1lbWJlciB3aXRoOgorCisgICAgICAgIENSVENMUEdNIFBHTShaTElCL0NPTVBJTEUpIFNSQ0ZJTEUoWkxJQi9UT09MUykgU1JDTUJSKENPTVBJTEUpCisKKworNCkgICAgICBDb21waWxlIGFuZCBnZW5lcmF0ZSB0aGUgc2VydmljZSBwcm9ncmFtOgorCitfICAgICAgIFRoaXMgY2FuIG5vdyBiZSBkb25lIGJ5IGV4ZWN1dGluZzoKKworICAgICAgICBDQUxMIFBHTShaTElCL0NPTVBJTEUpCisKKworCitJSSkgRnJvbSB0aGUgb3JpZ2luYWwgc291cmNlIGRpc3RyaWJ1dGlvbjoKKworMSkgICAgICBPbiB0aGUgQVM0MDAsIGNyZWF0ZSB0aGUgc291cmNlIGxpYnJhcnk6CisKKyAgICAgICAgQ1JUTElCIExJQihaTElCKSBUWVBFKCpQUk9EKSBURVhUKCdaTElCIGNvbXByZXNzaW9uIEFQSSBsaWJyYXJ5JykKKworMikgICAgICBDcmVhdGUgdGhlIHNvdXJjZSBmaWxlczoKKworICAgICAgICBDUlRTUkNQRiBGSUxFKFpMSUIvU09VUkNFUykgUkNETEVOKDExMikgVEVYVCgnWkxJQiBsaWJyYXJ5IG1vZHVsZXMnKQorICAgICAgICBDUlRTUkNQRiBGSUxFKFpMSUIvSCkgICAgICAgUkNETEVOKDExMikgVEVYVCgnWkxJQiBsaWJyYXJ5IGluY2x1ZGVzJykKKyAgICAgICAgQ1JUU1JDUEYgRklMRShaTElCL1RPT0xTKSAgIFJDRExFTigxMTIpIFRFWFQoJ1pMSUIgbGlicmFyeSBjb250cm9sIHV0aWxpdGllcycpCisKKzMpICAgICAgRnJvbSB0aGUgbWFjaGluZSBob3N0aW5nIHRoZSBkaXN0cmlidXRpb24gZmlsZXMsIHVwbG9hZCB0aGVtICh3aXRoCisgICAgICAgICAgICAgICAgRlRQIGluIHRleHQgbW9kZSwgZm9yIGV4YW1wbGUpIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHRhYmxlOgorCisgICAgT3JpZ2luYWwgICAgQVM0MDAgICBBUzQwMCAgICBBUzQwMCBBUzQwMAorICAgIGZpbGUgICAgICAgIGZpbGUgICAgbWVtYmVyICAgdHlwZSAgZGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICBTT1VSQ0VTICAgICAgICAgICAgICAgIE9yaWdpbmFsIFpMSUIgQyBzdWJwcm9ncmFtIHNvdXJjZXMKKyAgICBhZGxlcjMyLmMgICAgICAgICAgIEFETEVSMzIgIEMgICAgIFpMSUIgLSBDb21wdXRlIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZiBhIGR0YSBzdHJtCisgICAgY29tcHJlc3MuYyAgICAgICAgICBDT01QUkVTUyBDICAgICBaTElCIC0gQ29tcHJlc3MgYSBtZW1vcnkgYnVmZmVyCisgICAgY3JjMzIuYyAgICAgICAgICAgICBDUkMzMiAgICBDICAgICBaTElCIC0gQ29tcHV0ZSB0aGUgQ1JDLTMyIG9mIGEgZGF0YSBzdHJlYW0KKyAgICBkZWZsYXRlLmMgICAgICAgICAgIERFRkxBVEUgIEMgICAgIFpMSUIgLSBDb21wcmVzcyBkYXRhIHVzaW5nIHRoZSBkZWZsYXRpb24gYWxnb3JpdGhtCisgICAgZ3pjbG9zZS5jICAgICAgICAgICBHWkNMT1NFICBDICAgICBaTElCIC0gQ2xvc2UgLmd6IGZpbGVzCisgICAgZ3psaWIuYyAgICAgICAgICAgICBHWkxJQiAgICBDICAgICBaTElCIC0gTWlzY2VsbGFuZW91cyAuZ3ogZmlsZXMgSU8gc3VwcG9ydAorICAgIGd6cmVhZC5jICAgICAgICAgICAgR1pSRUFEICAgQyAgICAgWkxJQiAtIFJlYWQgLmd6IGZpbGVzCisgICAgZ3p3cml0ZS5jICAgICAgICAgICBHWldSSVRFICBDICAgICBaTElCIC0gV3JpdGUgLmd6IGZpbGVzCisgICAgaW5mYmFjay5jICAgICAgICAgICBJTkZCQUNLICBDICAgICBaTElCIC0gSW5mbGF0ZSB1c2luZyBhIGNhbGxiYWNrIGludGVyZmFjZQorICAgIGluZmZhc3QuYyAgICAgICAgICAgSU5GRkFTVCAgQyAgICAgWkxJQiAtIEZhc3QgcHJvYy4gbGl0ZXJhbHMgJiBsZW5ndGgvZGlzdGFuY2UgcGFpcnMKKyAgICBpbmZsYXRlLmMgICAgICAgICAgIElORkxBVEUgIEMgICAgIFpMSUIgLSBJbnRlcmZhY2UgdG8gaW5mbGF0ZSBtb2R1bGVzCisgICAgaW5mdHJlZXMuYyAgICAgICAgICBJTkZUUkVFUyBDICAgICBaTElCIC0gR2VuZXJhdGUgSHVmZm1hbiB0cmVlcyBmb3IgZWZmaWNpZW50IGRlY29kZQorICAgIHRyZWVzLmMgICAgICAgICAgICAgVFJFRVMgICAgQyAgICAgWkxJQiAtIE91dHB1dCBkZWZsYXRlZCBkYXRhIHVzaW5nIEh1ZmZtYW4gY29kaW5nCisgICAgdW5jb21wci5jICAgICAgICAgICBVTkNPTVBSICBDICAgICBaTElCIC0gRGVjb21wcmVzcyBhIG1lbW9yeSBidWZmZXIKKyAgICB6dXRpbC5jICAgICAgICAgICAgIFpVVElMICAgIEMgICAgIFpMSUIgLSBUYXJnZXQgZGVwZW5kZW50IHV0aWxpdHkgZnVuY3Rpb25zCisgICAgICAgICAgICAgICAgSCAgICAgICAgICAgICAgICAgICAgICBPcmlnaW5hbCBaTElCIEMgYW5kIElMRS9SUEcgaW5jbHVkZSBmaWxlcworICAgIGNyYzMyLmggICAgICAgICAgICAgQ1JDMzIgICAgQyAgICAgWkxJQiAtIENSQzMyIHRhYmxlcworICAgIGRlZmxhdGUuaCAgICAgICAgICAgREVGTEFURSAgQyAgICAgWkxJQiAtIEludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlCisgICAgZ3pndXRzLmggICAgICAgICAgICBHWkdVVFMgICBDICAgICBaTElCIC0gRGVmaW5pdGlvbnMgZm9yIHRoZSBnemNsb3NlIG1vZHVsZQorICAgIGluZmZhc3QuaCAgICAgICAgICAgSU5GRkFTVCAgQyAgICAgWkxJQiAtIEhlYWRlciB0byB1c2UgaW5mZmFzdC5jCisgICAgaW5mZml4ZWQuaCAgICAgICAgICBJTkZGSVhFRCBDICAgICBaTElCIC0gVGFibGUgZm9yIGRlY29kaW5nIGZpeGVkIGNvZGVzCisgICAgaW5mbGF0ZS5oICAgICAgICAgICBJTkZMQVRFICBDICAgICBaTElCIC0gSW50ZXJuYWwgaW5mbGF0ZSBzdGF0ZSBkZWZpbml0aW9ucworICAgIGluZnRyZWVzLmggICAgICAgICAgSU5GVFJFRVMgQyAgICAgWkxJQiAtIEhlYWRlciB0byB1c2UgaW5mdHJlZXMuYworICAgIHRyZWVzLmggICAgICAgICAgICAgVFJFRVMgICAgQyAgICAgWkxJQiAtIENyZWF0ZWQgYXV0b21hdGljYWxseSB3aXRoIC1ER0VOX1RSRUVTX0gKKyAgICB6Y29uZi5oICAgICAgICAgICAgIFpDT05GICAgIEMgICAgIFpMSUIgLSBDb21wcmVzc2lvbiBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24KKyAgICB6bGliLmggICAgICAgICAgICAgIFpMSUIgICAgIEMgICAgIFpMSUIgLSBDb21wcmVzc2lvbiBsaWJyYXJ5IEMgdXNlciBpbnRlcmZhY2UKKyAgICBhczQwMC96bGliLmluYyAgICAgIFpMSUIuSU5DIFJQR0xFIFpMSUIgLSBDb21wcmVzc2lvbiBsaWJyYXJ5IElMRSBSUEcgdXNlciBpbnRlcmZhY2UKKyAgICB6dXRpbC5oICAgICAgICAgICAgIFpVVElMICAgIEMgICAgIFpMSUIgLSBJbnRlcm5hbCBpbnRlcmZhY2UgYW5kIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICBUT09MUyAgICAgICAgICAgICAgICAgIEJ1aWxkaW5nIHNvdXJjZSBzb2Z0d2FyZSAmIEFTLzQwMCBSRUFETUUKKyAgICBhczQwMC9ibmRzcmMgICAgICAgIEJORFNSQyAgICAgICAgIEVudHJ5IHBvaW50IGV4cG9ydGF0aW9uIGxpc3QKKyAgICBhczQwMC9jb21waWxlLmNscCAgIENPTVBJTEUgIENMUCAgIENvbXBpbGUgc291cmNlcyAmIGdlbmVyYXRlIHNlcnZpY2UgcHJvZ3JhbQorICAgIGFzNDAwL3JlYWRtZS50eHQgICAgUkVBRE1FICAgVFhUICAgSW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucworCis0KSAgICAgIENvbnRpbnVlIGFzIGluIEkpMykuCisKKworCisKK05vdGVzOiAgRm9yIEFTNDAwIElMRSBSUEcgcHJvZ3JhbW1lcnMsIGEgL2NvcHkgbWVtYmVyIGRlZmluaW5nIHRoZSBaTElCCisgICAgICAgICAgICAgICAgQVBJIHByb3RvdHlwZXMgZm9yIElMRSBSUEcgY2FuIGJlIGZvdW5kIGluIFpMSUIvSChaTElCLklOQykuCisgICAgICAgICAgICAgICAgUGxlYXNlIHJlYWQgY29tbWVudHMgaW4gdGhpcyBtZW1iZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKyAgICAgICAgUmVtZW1iZXIgdGhhdCBtb3N0IGZvcmVpZ24gdGV4dHVhbCBkYXRhIGFyZSBBU0NJSSBjb2RlZDogdGhpcworICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGhhbmRsZSBjb252ZXJzaW9uIGZyb20vdG8gQVNDSUksIHNvCisgICAgICAgICAgICAgICAgdGV4dCBkYXRhIGNvZGUgY29udmVyc2lvbnMgbXVzdCBiZSBkb25lIGV4cGxpY2l0ZWx5LgorCisgICAgICAgIE1haW5seSBmb3IgdGhlIHJlYXNvbiBhYm92ZSwgYWx3YXlzIG9wZW4gemlwcGVkIGZpbGVzIGluIGJpbmFyeSBtb2RlLgpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvYXM0MDAvemxpYi5pbmMgYi96bGliL3NyYy9hczQwMC96bGliLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzQxYTZkCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvYXM0MDAvemxpYi5pbmMKQEAgLTAsMCArMSw0NTEgQEAKKyAgICAgICogIFpMSUIuSU5DIC0gSW50ZXJmYWNlIHRvIHRoZSBnZW5lcmFsIHB1cnBvc2UgY29tcHJlc3Npb24gbGlicmFyeQorICAgICAgKgorICAgICAgKiAgSUxFIFJQRzQwMCB2ZXJzaW9uIGJ5IFBhdHJpY2sgTW9ubmVyYXQsIERBVEFTUEhFUkUuCisgICAgICAqICBWZXJzaW9uIDEuMi44CisgICAgICAqCisgICAgICAqCisgICAgICAqICBXQVJOSU5HOgorICAgICAgKiAgICAgUHJvY2VkdXJlcyBpbmZsYXRlSW5pdCgpLCBpbmZsYXRlSW5pdDIoKSwgZGVmbGF0ZUluaXQoKSwKKyAgICAgICogICAgICAgICBkZWZsYXRlSW5pdDIoKSBhbmQgaW5mbGF0ZUJhY2tJbml0KCkgbmVlZCB0byBiZSBjYWxsZWQgd2l0aAorICAgICAgKiAgICAgICAgIHR3byBhZGRpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICogICAgICAgICB0aGUgcGFja2FnZSB2ZXJzaW9uIHN0cmluZyBhbmQgdGhlIHN0cmVhbSBjb250cm9sIHN0cnVjdHVyZS4KKyAgICAgICogICAgICAgICBzaXplLiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIFJQRyBsYWNrcyBzb21lIG1hY3JvIGZlYXR1cmUuCisgICAgICAqICAgICAgICAgQ2FsbCB0aGVzZSBwcm9jZWR1cmVzIGFzOgorICAgICAgKiAgICAgICAgICAgICBpbmZsYXRlSW5pdCguLi46IFpMSUJfVkVSU0lPTjogJXNpemUoel9zdHJlYW0pKQorICAgICAgKgorICAgICAgL2lmIG5vdCBkZWZpbmVkKFpMSUJfSF8pCisgICAgICAvZGVmaW5lIFpMSUJfSF8KKyAgICAgICoKKyAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cworICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICoKKyAgICAgICogIFZlcnNpb25pbmcgaW5mb3JtYXRpb24uCisgICAgICAqCisgICAgIEQgWkxJQl9WRVJTSU9OICAgIEMgICAgICAgICAgICAgICAgICAgJzEuMi44JworICAgICBEIFpMSUJfVkVSTlVNICAgICBDICAgICAgICAgICAgICAgICAgIFgnMTI4MCcKKyAgICAgRCBaTElCX1ZFUl9NQUpPUiAgQyAgICAgICAgICAgICAgICAgICAxCisgICAgIEQgWkxJQl9WRVJfTUlOT1IgIEMgICAgICAgICAgICAgICAgICAgMgorICAgICBEIFpMSUJfVkVSX1JFVklTSU9OLi4uCisgICAgIEQgICAgICAgICAgICAgICAgIEMgICAgICAgICAgICAgICAgICAgOAorICAgICBEIFpMSUJfVkVSX1NVQlJFVklTSU9OLi4uCisgICAgIEQgICAgICAgICAgICAgICAgIEMgICAgICAgICAgICAgICAgICAgMAorICAgICAgKgorICAgICAgKiAgT3RoZXIgZXF1YXRlcy4KKyAgICAgICoKKyAgICAgRCBaX05PX0ZMVVNIICAgICAgQyAgICAgICAgICAgICAgICAgICAwCisgICAgIEQgWl9QQVJUSUFMX0ZMVVNILi4uCisgICAgIEQgICAgICAgICAgICAgICAgIEMgICAgICAgICAgICAgICAgICAgMQorICAgICBEIFpfU1lOQ19GTFVTSCAgICBDICAgICAgICAgICAgICAgICAgIDIKKyAgICAgRCBaX0ZVTExfRkxVU0ggICAgQyAgICAgICAgICAgICAgICAgICAzCisgICAgIEQgWl9GSU5JU0ggICAgICAgIEMgICAgICAgICAgICAgICAgICAgNAorICAgICBEIFpfQkxPQ0sgICAgICAgICBDICAgICAgICAgICAgICAgICAgIDUKKyAgICAgRCBaX1RSRUVTICAgICAgICAgQyAgICAgICAgICAgICAgICAgICA2CisgICAgICAqCisgICAgIEQgWl9PSyAgICAgICAgICAgIEMgICAgICAgICAgICAgICAgICAgMAorICAgICBEIFpfU1RSRUFNX0VORCAgICBDICAgICAgICAgICAgICAgICAgIDEKKyAgICAgRCBaX05FRURfRElDVCAgICAgQyAgICAgICAgICAgICAgICAgICAyCisgICAgIEQgWl9FUlJOTyAgICAgICAgIEMgICAgICAgICAgICAgICAgICAgLTEKKyAgICAgRCBaX1NUUkVBTV9FUlJPUiAgQyAgICAgICAgICAgICAgICAgICAtMgorICAgICBEIFpfREFUQV9FUlJPUiAgICBDICAgICAgICAgICAgICAgICAgIC0zCisgICAgIEQgWl9NRU1fRVJST1IgICAgIEMgICAgICAgICAgICAgICAgICAgLTQKKyAgICAgRCBaX0JVRl9FUlJPUiAgICAgQyAgICAgICAgICAgICAgICAgICAtNQorICAgICBEWl9WRVJTSU9OX0VSUk9SICBDICAgICAgICAgICAgICAgICAgIC02CisgICAgICAqCisgICAgIEQgWl9OT19DT01QUkVTU0lPTi4uLgorICAgICBEICAgICAgICAgICAgICAgICBDICAgICAgICAgICAgICAgICAgIDAKKyAgICAgRCBaX0JFU1RfU1BFRUQgICAgQyAgICAgICAgICAgICAgICAgICAxCisgICAgIEQgWl9CRVNUX0NPTVBSRVNTSU9OLi4uCisgICAgIEQgICAgICAgICAgICAgICAgIEMgICAgICAgICAgICAgICAgICAgOQorICAgICBEIFpfREVGQVVMVF9DT01QUkVTU0lPTi4uLgorICAgICBEICAgICAgICAgICAgICAgICBDICAgICAgICAgICAgICAgICAgIC0xCisgICAgICAqCisgICAgIEQgWl9GSUxURVJFRCAgICAgIEMgICAgICAgICAgICAgICAgICAgMQorICAgICBEIFpfSFVGRk1BTl9PTkxZICBDICAgICAgICAgICAgICAgICAgIDIKKyAgICAgRCBaX1JMRSAgICAgICAgICAgQyAgICAgICAgICAgICAgICAgICAzCisgICAgIEQgWl9ERUZBVUxUX1NUUkFURUdZLi4uCisgICAgIEQgICAgICAgICAgICAgICAgIEMgICAgICAgICAgICAgICAgICAgMAorICAgICAgKgorICAgICBEIFpfQklOQVJZICAgICAgICBDICAgICAgICAgICAgICAgICAgIDAKKyAgICAgRCBaX0FTQ0lJICAgICAgICAgQyAgICAgICAgICAgICAgICAgICAxCisgICAgIEQgWl9VTktOT1dOICAgICAgIEMgICAgICAgICAgICAgICAgICAgMgorICAgICAgKgorICAgICBEIFpfREVGTEFURUQgICAgICBDICAgICAgICAgICAgICAgICAgIDgKKyAgICAgICoKKyAgICAgRCBaX05VTEwgICAgICAgICAgQyAgICAgICAgICAgICAgICAgICAwCisgICAgICAqCisgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVzCisgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgKgorICAgICBEIHpfc3RyZWFtcCAgICAgICBTICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW0gc3RydWN0IHB0cgorICAgICBEIGd6RmlsZSAgICAgICAgICBTICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgRCB6X29mZl90ICAgICAgICAgUyAgICAgICAgICAgICAxMGkgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtIG9mZnNldHMKKyAgICAgRCB6X29mZjY0X3QgICAgICAgUyAgICAgICAgICAgICAyMGkgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtIG9mZnNldHMKKyAgICAgICoKKyAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cnVjdHVyZXMKKyAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAqCisgICAgICAqICBUaGUgR1pJUCBlbmNvZGUvZGVjb2RlIHN0cmVhbSBzdXBwb3J0IHN0cnVjdHVyZS4KKyAgICAgICoKKyAgICAgRCB6X3N0cmVhbSAgICAgICAgRFMgICAgICAgICAgICAgICAgICBhbGlnbiBiYXNlZCh6X3N0cmVhbXApCisgICAgIEQgIHpzX25leHRfaW4gICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5leHQgaW5wdXQgYnl0ZQorICAgICBEICB6c19hdmFpbF9pbiAgICAgICAgICAgICAgICAgIDEwVSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlIGNudCBhdCBuZXh0X2luCisgICAgIEQgIHpzX3RvdGFsX2luICAgICAgICAgICAgICAgICAgMTBVIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFsIGJ5dGVzIHJlYWQKKyAgICAgRCAgenNfbmV4dF9vdXQgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0IGJ1ZmZlciBwdHIKKyAgICAgRCAgenNfYXZhaWxfb3V0ICAgICAgICAgICAgICAgICAxMFUgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9vbSBsZWZ0IEAgbmV4dF9vdXQKKyAgICAgRCAgenNfdG90YWxfb3V0ICAgICAgICAgICAgICAgICAxMFUgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG90YWwgYnl0ZXMgd3JpdHRlbgorICAgICBEICB6c19tc2cgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0IGVycm1zZyBvciBudWxsCisgICAgIEQgIHpzX3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVybmFsIHN0YXRlCisgICAgIEQgIHpzX3phbGxvYyAgICAgICAgICAgICAgICAgICAgICAqICAgcHJvY3B0ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludC4gc3RhdGUgYWxsb2NhdG9yCisgICAgIEQgIHpzX2ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAqICAgcHJvY3B0ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludC4gc3RhdGUgZGVhbGxvYy4KKyAgICAgRCAgenNfb3BhcXVlICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpdmF0ZSBhbGxvYy4gZGF0YQorICAgICBEICB6c19kYXRhX3R5cGUgICAgICAgICAgICAgICAgIDEwaSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0MvQklOIGJlc3QgZ3Vlc3MKKyAgICAgRCAgenNfYWRsZXIgICAgICAgICAgICAgICAgICAgICAxMHUgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5jb21wci4gYWRsZXIzMiB2YWwKKyAgICAgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMFUgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQKKyAgICAgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMFUgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyLiBhbGlnbm1lbnQKKyAgICAgICoKKyAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAqICAgICAgICAgICAgICAgICAgICAgVXRpbGl0eSBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgKgorICAgICBEIGNvbXByZXNzICAgICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2NvbXByZXNzJykKKyAgICAgRCAgZGVzdCAgICAgICAgICAgICAgICAgICAgICA2NTUzNSAgICBvcHRpb25zKCp2YXJzaXplKSAgICAgICAgICAgICAgICAgICAgRGVzdGluYXRpb24gYnVmZmVyCisgICAgIEQgIGRlc3RMZW4gICAgICAgICAgICAgICAgICAgICAgMTBVIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc3RpbmF0aW9uIGxlbmd0aAorICAgICBEICBzb3VyY2UgICAgICAgICAgICAgICAgICAgIDY1NTM1ICAgIGNvbnN0IG9wdGlvbnMoKnZhcnNpemUpICAgICAgICAgICAgICBTb3VyY2UgYnVmZmVyCisgICAgIEQgIHNvdXJjZUxlbiAgICAgICAgICAgICAgICAgICAgMTB1IDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZSBsZW5ndGgKKyAgICAgICoKKyAgICAgRCBjb21wcmVzczIgICAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdjb21wcmVzczInKQorICAgICBEICBkZXN0ICAgICAgICAgICAgICAgICAgICAgIDY1NTM1ICAgIG9wdGlvbnMoKnZhcnNpemUpICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvbiBidWZmZXIKKyAgICAgRCAgZGVzdExlbiAgICAgICAgICAgICAgICAgICAgICAxMFUgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdGluYXRpb24gbGVuZ3RoCisgICAgIEQgIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgNjU1MzUgICAgY29uc3Qgb3B0aW9ucygqdmFyc2l6ZSkgICAgICAgICAgICAgIFNvdXJjZSBidWZmZXIKKyAgICAgRCAgc291cmNlTGVuICAgICAgICAgICAgICAgICAgICAxMFUgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlIGxlbmd0aAorICAgICBEICBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBsZXZlbAorICAgICAgKgorICAgICBEIGNvbXByZXNzQm91bmQgICBQUiAgICAgICAgICAgIDEwVSAwIGV4dHByb2MoJ2NvbXByZXNzQm91bmQnKQorICAgICBEICBzb3VyY2VMZW4gICAgICAgICAgICAgICAgICAgIDEwVSAwIHZhbHVlCisgICAgICAqCisgICAgIEQgdW5jb21wcmVzcyAgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygndW5jb21wcmVzcycpCisgICAgIEQgIGRlc3QgICAgICAgICAgICAgICAgICAgICAgNjU1MzUgICAgb3B0aW9ucygqdmFyc2l6ZSkgICAgICAgICAgICAgICAgICAgIERlc3RpbmF0aW9uIGJ1ZmZlcgorICAgICBEICBkZXN0TGVuICAgICAgICAgICAgICAgICAgICAgIDEwVSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvbiBsZW5ndGgKKyAgICAgRCAgc291cmNlICAgICAgICAgICAgICAgICAgICA2NTUzNSAgICBjb25zdCBvcHRpb25zKCp2YXJzaXplKSAgICAgICAgICAgICAgU291cmNlIGJ1ZmZlcgorICAgICBEICBzb3VyY2VMZW4gICAgICAgICAgICAgICAgICAgIDEwVSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2UgbGVuZ3RoCisgICAgICAqCisgICAgICAvaWYgbm90IGRlZmluZWQoTEFSR0VfRklMRVMpCisgICAgIEQgZ3pvcGVuICAgICAgICAgIFBSICAgICAgICAgICAgICAgICAgZXh0cHJvYygnZ3pvcGVuJykKKyAgICAgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKGd6RmlsZSkKKyAgICAgRCAgcGF0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSBvcHRpb25zKCpzdHJpbmcpICAgICAgICAgICAgICAgRmlsZSBwYXRobmFtZQorICAgICBEICBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlIG9wdGlvbnMoKnN0cmluZykgICAgICAgICAgICAgICBPcGVuIG1vZGUKKyAgICAgIC9lbHNlCisgICAgIEQgZ3pvcGVuICAgICAgICAgIFBSICAgICAgICAgICAgICAgICAgZXh0cHJvYygnZ3pvcGVuNjQnKQorICAgICBEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2UoZ3pGaWxlKQorICAgICBEICBwYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlIG9wdGlvbnMoKnN0cmluZykgICAgICAgICAgICAgICBGaWxlIHBhdGhuYW1lCisgICAgIEQgIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdmFsdWUgb3B0aW9ucygqc3RyaW5nKSAgICAgICAgICAgICAgIE9wZW4gbW9kZQorICAgICAgKgorICAgICBEIGd6b3BlbjY0ICAgICAgICBQUiAgICAgICAgICAgICAgICAgIGV4dHByb2MoJ2d6b3BlbjY0JykKKyAgICAgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKGd6RmlsZSkKKyAgICAgRCAgcGF0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSBvcHRpb25zKCpzdHJpbmcpICAgICAgICAgICAgICAgRmlsZSBwYXRobmFtZQorICAgICBEICBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlIG9wdGlvbnMoKnN0cmluZykgICAgICAgICAgICAgICBPcGVuIG1vZGUKKyAgICAgIC9lbmRpZgorICAgICAgKgorICAgICBEIGd6ZG9wZW4gICAgICAgICBQUiAgICAgICAgICAgICAgICAgIGV4dHByb2MoJ2d6ZG9wZW4nKQorICAgICBEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2UoZ3pGaWxlKQorICAgICBEICBmZCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGRlc2NyaXB0b3IKKyAgICAgRCAgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSBvcHRpb25zKCpzdHJpbmcpICAgICAgICAgICAgICAgT3BlbiBtb2RlCisgICAgICAqCisgICAgIEQgZ3pidWZmZXIgICAgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnZ3pidWZmZXInKQorICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgRCAgc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAxMFUgMCB2YWx1ZQorICAgICAgKgorICAgICBEIGd6c2V0cGFyYW1zICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2d6c2V0cGFyYW1zJykKKyAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCisgICAgIEQgIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUKKyAgICAgRCAgc3RyYXRlZ3kgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZQorICAgICAgKgorICAgICBEIGd6cmVhZCAgICAgICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2d6cmVhZCcpCisgICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgorICAgICBEICBidWYgICAgICAgICAgICAgICAgICAgICAgIDY1NTM1ICAgIG9wdGlvbnMoKnZhcnNpemUpICAgICAgICAgICAgICAgICAgICBCdWZmZXIKKyAgICAgRCAgbGVuICAgICAgICAgICAgICAgICAgICAgICAgICAxMHUgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyIGxlbmd0aAorICAgICAgKgorICAgICBEIGd6d3JpdGUgICAgICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2d6d3JpdGUnKQorICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgRCAgYnVmICAgICAgICAgICAgICAgICAgICAgICA2NTUzNSAgICBjb25zdCBvcHRpb25zKCp2YXJzaXplKSAgICAgICAgICAgICAgQnVmZmVyCisgICAgIEQgIGxlbiAgICAgICAgICAgICAgICAgICAgICAgICAgMTB1IDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlciBsZW5ndGgKKyAgICAgICoKKyAgICAgRCBnenB1dHMgICAgICAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdnenB1dHMnKQorICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgRCAgcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSBvcHRpb25zKCpzdHJpbmcpICAgICAgICAgICAgICAgU3RyaW5nIHRvIG91dHB1dAorICAgICAgKgorICAgICBEIGd6Z2V0cyAgICAgICAgICBQUiAgICAgICAgICAgICAgKiAgIGV4dHByb2MoJ2d6Z2V0cycpCisgICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgorICAgICBEICBidWYgICAgICAgICAgICAgICAgICAgICAgIDY1NTM1ICAgIG9wdGlvbnMoKnZhcnNpemUpICAgICAgICAgICAgICAgICAgICBSZWFkIGJ1ZmZlcgorICAgICBEICBsZW4gICAgICAgICAgICAgICAgICAgICAgICAgIDEwaSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXIgbGVuZ3RoCisgICAgICAqCisgICAgIEQgZ3pwdXRjICAgICAgICAgIFBSICAgICAgICAgICAgMTBpIDAgZXh0cHJvYygnZ3pwdXRjJykKKyAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCisgICAgIEQgIGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3RlciB0byB3cml0ZQorICAgICAgKgorICAgICBEIGd6Z2V0YyAgICAgICAgICBQUiAgICAgICAgICAgIDEwaSAwIGV4dHByb2MoJ2d6Z2V0YycpCisgICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgorICAgICAgKgorICAgICBEIGd6Z2V0Y18gICAgICAgICBQUiAgICAgICAgICAgIDEwaSAwIGV4dHByb2MoJ2d6Z2V0Y18nKQorICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgICoKKyAgICAgRCBnenVuZ2V0YyAgICAgICAgUFIgICAgICAgICAgICAxMGkgMCBleHRwcm9jKCdnenVuZ2V0YycpCisgICAgIEQgIGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3RlciB0byBwdXNoCisgICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgorICAgICAgKgorICAgICBEIGd6Zmx1c2ggICAgICAgICBQUiAgICAgICAgICAgIDEwaSAwIGV4dHByb2MoJ2d6Zmx1c2gnKQorICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgRCAgZmx1c2ggICAgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBvZiBmbHVzaAorICAgICAgKgorICAgICAgL2lmIG5vdCBkZWZpbmVkKExBUkdFX0ZJTEVTKQorICAgICBEIGd6c2VlayAgICAgICAgICBQUiAgICAgICAgICAgICAgICAgIGV4dHByb2MoJ2d6c2VlaycpCisgICAgIEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X29mZl90KQorICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgRCAgb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKHpfb2ZmX3QpICAgICAgICAgICAgICAgICAgT2Zmc2V0CisgICAgIEQgIHdoZW5jZSAgICAgICAgICAgICAgICAgICAgICAgMTBpIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9yaWdpbgorICAgICAgL2Vsc2UKKyAgICAgRCBnenNlZWsgICAgICAgICAgUFIgICAgICAgICAgICAgICAgICBleHRwcm9jKCdnenNlZWs2NCcpCisgICAgIEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X29mZl90KQorICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgRCAgb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKHpfb2ZmX3QpICAgICAgICAgICAgICAgICAgT2Zmc2V0CisgICAgIEQgIHdoZW5jZSAgICAgICAgICAgICAgICAgICAgICAgMTBpIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9yaWdpbgorICAgICAgKgorICAgICBEIGd6c2VlazY0ICAgICAgICBQUiAgICAgICAgICAgICAgICAgIGV4dHByb2MoJ2d6c2VlazY0JykKKyAgICAgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfb2ZmNjRfdCkKKyAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCisgICAgIEQgIG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZSh6X29mZjY0X3QpICAgICAgICAgICAgICAgIE9mZnNldAorICAgICBEICB3aGVuY2UgICAgICAgICAgICAgICAgICAgICAgIDEwaSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcmlnaW4KKyAgICAgIC9lbmRpZgorICAgICAgKgorICAgICBEIGd6cmV3aW5kICAgICAgICBQUiAgICAgICAgICAgIDEwaSAwIGV4dHByb2MoJ2d6cmV3aW5kJykKKyAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCisgICAgICAqCisgICAgICAvaWYgbm90IGRlZmluZWQoTEFSR0VfRklMRVMpCisgICAgIEQgZ3p0ZWxsICAgICAgICAgIFBSICAgICAgICAgICAgICAgICAgZXh0cHJvYygnZ3p0ZWxsJykKKyAgICAgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfb2ZmX3QpCisgICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgorICAgICAgL2Vsc2UKKyAgICAgRCBnenRlbGwgICAgICAgICAgUFIgICAgICAgICAgICAgICAgICBleHRwcm9jKCdnenRlbGw2NCcpCisgICAgIEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X29mZl90KQorICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgICoKKyAgICAgRCBnenRlbGw2NCAgICAgICAgUFIgICAgICAgICAgICAgICAgICBleHRwcm9jKCdnenRlbGw2NCcpCisgICAgIEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X29mZjY0X3QpCisgICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgorICAgICAgL2VuZGlmCisgICAgICAqCisgICAgICAvaWYgbm90IGRlZmluZWQoTEFSR0VfRklMRVMpCisgICAgIEQgZ3pvZmZzZXQgICAgICAgIFBSICAgICAgICAgICAgICAgICAgZXh0cHJvYygnZ3pvZmZzZXQnKQorICAgICBEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9vZmZfdCkKKyAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCisgICAgICAvZWxzZQorICAgICBEIGd6b2Zmc2V0ICAgICAgICBQUiAgICAgICAgICAgICAgICAgIGV4dHByb2MoJ2d6b2Zmc2V0NjQnKQorICAgICBEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9vZmZfdCkKKyAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCisgICAgICAqCisgICAgIEQgZ3pvZmZzZXQ2NCAgICAgIFBSICAgICAgICAgICAgICAgICAgZXh0cHJvYygnZ3pvZmZzZXQ2NCcpCisgICAgIEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X29mZjY0X3QpCisgICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgorICAgICAgL2VuZGlmCisgICAgICAqCisgICAgIEQgZ3plb2YgICAgICAgICAgIFBSICAgICAgICAgICAgMTBpIDAgZXh0cHJvYygnZ3plb2YnKQorICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgICoKKyAgICAgRCBnemNsb3NlX3IgICAgICAgUFIgICAgICAgICAgICAxMGkgMCBleHRwcm9jKCdnemNsb3NlX3InKQorICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgICoKKyAgICAgRCBnemNsb3NlX3cgICAgICAgUFIgICAgICAgICAgICAxMGkgMCBleHRwcm9jKCdnemNsb3NlX3cnKQorICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgICoKKyAgICAgRCBnemNsb3NlICAgICAgICAgUFIgICAgICAgICAgICAxMGkgMCBleHRwcm9jKCdnemNsb3NlJykKKyAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCisgICAgICAqCisgICAgIEQgZ3plcnJvciAgICAgICAgIFBSICAgICAgICAgICAgICAqICAgZXh0cHJvYygnZ3plcnJvcicpICAgICAgICAgICAgICAgICAgIEVycm9yIHN0cmluZworICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgRCAgZXJybnVtICAgICAgICAgICAgICAgICAgICAgICAxMEkgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgY29kZQorICAgICAgKgorICAgICBEIGd6Y2xlYXJlcnIgICAgICBQUiAgICAgICAgICAgICAgICAgIGV4dHByb2MoJ2d6Y2xlYXJlcnInKQorICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgICoKKyAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWMgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICoKKyAgICAgRCB6bGliVmVyc2lvbiAgICAgUFIgICAgICAgICAgICAgICogICBleHRwcm9jKCd6bGliVmVyc2lvbicpICAgICAgICAgICAgICAgVmVyc2lvbiBzdHJpbmcKKyAgICAgICoKKyAgICAgRCBkZWZsYXRlSW5pdCAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdkZWZsYXRlSW5pdF8nKSAgICAgICAgICAgICAgSW5pdC4gY29tcHJlc3Npb24KKyAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb24gc3RyZWFtCisgICAgIEQgIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIGxldmVsCisgICAgIEQgIHZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAqICAgdmFsdWUgb3B0aW9ucygqc3RyaW5nKSAgICAgICAgICAgICAgIFZlcnNpb24gc3RyaW5nCisgICAgIEQgIHN0cmVhbV9zaXplICAgICAgICAgICAgICAgICAgMTBpIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbSBzdHJ1Y3QuIHNpemUKKyAgICAgICoKKyAgICAgRCBkZWZsYXRlICAgICAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdkZWZsYXRlJykgICAgICAgICAgICAgICAgICAgQ29tcHJlc3MgZGF0YQorICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBzdHJlYW0KKyAgICAgRCAgZmx1c2ggICAgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmx1c2ggdHlwZSByZXF1aXJlZAorICAgICAgKgorICAgICBEIGRlZmxhdGVFbmQgICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2RlZmxhdGVFbmQnKSAgICAgICAgICAgICAgICBUZXJtaW4uIGNvbXByZXNzaW9uCisgICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIHN0cmVhbQorICAgICAgKgorICAgICBEIGluZmxhdGVJbml0ICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2luZmxhdGVJbml0XycpICAgICAgICAgICAgICBJbml0LiBleHBhbnNpb24KKyAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgRXhwYW5zaW9uIHN0cmVhbQorICAgICBEICB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlIG9wdGlvbnMoKnN0cmluZykgICAgICAgICAgICAgICBWZXJzaW9uIHN0cmluZworICAgICBEICBzdHJlYW1fc2l6ZSAgICAgICAgICAgICAgICAgIDEwaSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW0gc3RydWN0LiBzaXplCisgICAgICAqCisgICAgIEQgaW5mbGF0ZSAgICAgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnaW5mbGF0ZScpICAgICAgICAgICAgICAgICAgIEV4cGFuZCBkYXRhCisgICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KKyAgICAgRCAgZmx1c2ggICAgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmx1c2ggdHlwZSByZXF1aXJlZAorICAgICAgKgorICAgICBEIGluZmxhdGVFbmQgICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2luZmxhdGVFbmQnKSAgICAgICAgICAgICAgICBUZXJtaW4uIGV4cGFuc2lvbgorICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBFeHBhbnNpb24gc3RyZWFtCisgICAgICAqCisgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIEFkdmFuY2VkIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAqCisgICAgIEQgZGVmbGF0ZUluaXQyICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnZGVmbGF0ZUluaXQyXycpICAgICAgICAgICAgIEluaXQuIGNvbXByZXNzaW9uCisgICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIHN0cmVhbQorICAgICBEICBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBsZXZlbAorICAgICBEICBtZXRob2QgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBtZXRob2QKKyAgICAgRCAgd2luZG93Qml0cyAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nMih3aW5kb3cgc2l6ZSkKKyAgICAgRCAgbWVtTGV2ZWwgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtL2NtcHJlc3MgdHJhZGVvZmYKKyAgICAgRCAgc3RyYXRlZ3kgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb24gc3RhdGVneQorICAgICBEICB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlIG9wdGlvbnMoKnN0cmluZykgICAgICAgICAgICAgICBWZXJzaW9uIHN0cmluZworICAgICBEICBzdHJlYW1fc2l6ZSAgICAgICAgICAgICAgICAgIDEwaSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW0gc3RydWN0LiBzaXplCisgICAgICAqCisgICAgIEQgZGVmbGF0ZVNldERpY3Rpb25hcnkuLi4KKyAgICAgRCAgICAgICAgICAgICAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdkZWZsYXRlU2V0RGljdGlvbmFyeScpICAgICAgSW5pdC4gZGljdGlvbmFyeQorICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBzdHJlYW0KKyAgICAgRCAgZGljdGlvbmFyeSAgICAgICAgICAgICAgICA2NTUzNSAgICBjb25zdCBvcHRpb25zKCp2YXJzaXplKSAgICAgICAgICAgICAgRGljdGlvbmFyeSBieXRlcworICAgICBEICBkaWN0TGVuZ3RoICAgICAgICAgICAgICAgICAgIDEwVSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5IGxlbmd0aAorICAgICAgKgorICAgICBEIGRlZmxhdGVDb3B5ICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2RlZmxhdGVDb3B5JykgICAgICAgICAgICAgICBDb21wcmVzcyBzdHJtIDIgc3RybQorICAgICBEICBkZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvbiBzdHJlYW0KKyAgICAgRCAgc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgU291cmNlIHN0cmVhbQorICAgICAgKgorICAgICBEIGRlZmxhdGVSZXNldCAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2RlZmxhdGVSZXNldCcpICAgICAgICAgICAgICBFbmQgYW5kIGluaXQuIHN0cmVhbQorICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBzdHJlYW0KKyAgICAgICoKKyAgICAgRCBkZWZsYXRlUGFyYW1zICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdkZWZsYXRlUGFyYW1zJykgICAgICAgICAgICAgQ2hhbmdlIGxldmVsICYgc3RyYXQKKyAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb24gc3RyZWFtCisgICAgIEQgIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIGxldmVsCisgICAgIEQgIHN0cmF0ZWd5ICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIHN0YXRlZ3kKKyAgICAgICoKKyAgICAgRCBkZWZsYXRlQm91bmQgICAgUFIgICAgICAgICAgICAxMFUgMCBleHRwcm9jKCdkZWZsYXRlQm91bmQnKSAgICAgICAgICAgICAgQ2hhbmdlIGxldmVsICYgc3RyYXQKKyAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb24gc3RyZWFtCisgICAgIEQgIHNvdXJjZWxlbiAgICAgICAgICAgICAgICAgICAgMTBVIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIGxldmVsCisgICAgICAqCisgICAgIEQgZGVmbGF0ZVBlbmRpbmcgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnZGVmbGF0ZVBlbmRpbmcnKSAgICAgICAgICAgIENoYW5nZSBsZXZlbCAmIHN0cmF0CisgICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIHN0cmVhbQorICAgICBEICBwZW5kaW5nICAgICAgICAgICAgICAgICAgICAgIDEwVSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZW5kaW5nIGJ5dGVzCisgICAgIEQgIGJpdHMgICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlbmRpbmcgYml0cworICAgICAgKgorICAgICBEIGRlZmxhdGVQcmltZSAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2RlZmxhdGVQcmltZScpICAgICAgICAgICAgICBDaGFuZ2UgbGV2ZWwgJiBzdHJhdAorICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBzdHJlYW0KKyAgICAgRCAgYml0cyAgICAgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvZiBiaXRzIHRvIGluc2VydAorICAgICBEICB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzIHRvIGluc2VydAorICAgICAgKgorICAgICBEIGluZmxhdGVJbml0MiAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2luZmxhdGVJbml0Ml8nKSAgICAgICAgICAgICBJbml0LiBleHBhbnNpb24KKyAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgRXhwYW5zaW9uIHN0cmVhbQorICAgICBEICB3aW5kb3dCaXRzICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cyKHdpbmRvdyBzaXplKQorICAgICBEICB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlIG9wdGlvbnMoKnN0cmluZykgICAgICAgICAgICAgICBWZXJzaW9uIHN0cmluZworICAgICBEICBzdHJlYW1fc2l6ZSAgICAgICAgICAgICAgICAgIDEwaSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW0gc3RydWN0LiBzaXplCisgICAgICAqCisgICAgIEQgaW5mbGF0ZVNldERpY3Rpb25hcnkuLi4KKyAgICAgRCAgICAgICAgICAgICAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdpbmZsYXRlU2V0RGljdGlvbmFyeScpICAgICAgSW5pdC4gZGljdGlvbmFyeQorICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBFeHBhbnNpb24gc3RyZWFtCisgICAgIEQgIGRpY3Rpb25hcnkgICAgICAgICAgICAgICAgNjU1MzUgICAgY29uc3Qgb3B0aW9ucygqdmFyc2l6ZSkgICAgICAgICAgICAgIERpY3Rpb25hcnkgYnl0ZXMKKyAgICAgRCAgZGljdExlbmd0aCAgICAgICAgICAgICAgICAgICAxMFUgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGljdGlvbmFyeSBsZW5ndGgKKyAgICAgICoKKyAgICAgRCBpbmZsYXRlR2V0RGljdGlvbmFyeS4uLgorICAgICBEICAgICAgICAgICAgICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2luZmxhdGVHZXREaWN0aW9uYXJ5JykgICAgICBHZXQgZGljdGlvbmFyeQorICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBFeHBhbnNpb24gc3RyZWFtCisgICAgIEQgIGRpY3Rpb25hcnkgICAgICAgICAgICAgICAgNjU1MzUgICAgb3B0aW9ucygqdmFyc2l6ZSkgICAgICAgICAgICAgICAgICAgIERpY3Rpb25hcnkgYnl0ZXMKKyAgICAgRCAgZGljdExlbmd0aCAgICAgICAgICAgICAgICAgICAxMFUgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGljdGlvbmFyeSBsZW5ndGgKKyAgICAgICoKKyAgICAgRCBpbmZsYXRlU3luYyAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdpbmZsYXRlU3luYycpICAgICAgICAgICAgICAgU3luYy4gZXhwYW5zaW9uCisgICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KKyAgICAgICoKKyAgICAgRCBpbmZsYXRlQ29weSAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdpbmZsYXRlQ29weScpCisgICAgIEQgIGRlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIERlc3RpbmF0aW9uIHN0cmVhbQorICAgICBEICBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2Ugc3RyZWFtCisgICAgICAqCisgICAgIEQgaW5mbGF0ZVJlc2V0ICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnaW5mbGF0ZVJlc2V0JykgICAgICAgICAgICAgIEVuZCBhbmQgaW5pdC4gc3RyZWFtCisgICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KKyAgICAgICoKKyAgICAgRCBpbmZsYXRlUmVzZXQyICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdpbmZsYXRlUmVzZXQyJykgICAgICAgICAgICAgRW5kIGFuZCBpbml0LiBzdHJlYW0KKyAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgRXhwYW5zaW9uIHN0cmVhbQorICAgICBEICB3aW5kb3dCaXRzICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cyKGJ1ZmZlciBzaXplKQorICAgICAgKgorICAgICBEIGluZmxhdGVQcmltZSAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2luZmxhdGVQcmltZScpICAgICAgICAgICAgICBJbnNlcnQgYml0cworICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBFeHBhbnNpb24gc3RyZWFtCisgICAgIEQgIGJpdHMgICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCBjb3VudAorICAgICBEICB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzIHRvIGluc2VydAorICAgICAgKgorICAgICBEIGluZmxhdGVNYXJrICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2luZmxhdGVNYXJrJykgICAgICAgICAgICAgICBHZXQgaW5mbGF0ZSBpbmZvCisgICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KKyAgICAgICoKKyAgICAgRCBpbmZsYXRlQmFja0luaXQuLi4KKyAgICAgRCAgICAgICAgICAgICAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdpbmZsYXRlQmFja0luaXRfJykKKyAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgRXhwYW5zaW9uIHN0cmVhbQorICAgICBEICB3aW5kb3dCaXRzICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cyKGJ1ZmZlciBzaXplKQorICAgICBEICB3aW5kb3cgICAgICAgICAgICAgICAgICAgIDY1NTM1ICAgIG9wdGlvbnMoKnZhcnNpemUpICAgICAgICAgICAgICAgICAgICBCdWZmZXIKKyAgICAgRCAgdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSBvcHRpb25zKCpzdHJpbmcpICAgICAgICAgICAgICAgVmVyc2lvbiBzdHJpbmcKKyAgICAgRCAgc3RyZWFtX3NpemUgICAgICAgICAgICAgICAgICAxMGkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtIHN0cnVjdC4gc2l6ZQorICAgICAgKgorICAgICBEIGluZmxhdGVCYWNrICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2luZmxhdGVCYWNrJykKKyAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgRXhwYW5zaW9uIHN0cmVhbQorICAgICBEICBpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlIHByb2NwdHIgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dCBmdW5jdGlvbgorICAgICBEICBpbl9kZXNjICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dCBkZXNjcmlwdG9yCisgICAgIEQgIG91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdmFsdWUgcHJvY3B0ciAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dCBmdW5jdGlvbgorICAgICBEICBvdXRfZGVzYyAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXQgZGVzY3JpcHRvcgorICAgICAgKgorICAgICBEIGluZmxhdGVCYWNrRW5kICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2luZmxhdGVCYWNrRW5kJykKKyAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgRXhwYW5zaW9uIHN0cmVhbQorICAgICAgKgorICAgICBEIHpsaWJDb21waWxlRmxhZ3MuLi4KKyAgICAgRCAgICAgICAgICAgICAgICAgUFIgICAgICAgICAgICAxMFUgMCBleHRwcm9jKCd6bGliQ29tcGlsZUZsYWdzJykKKyAgICAgICoKKyAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tzdW0gZnVuY3Rpb24gcHJvdG90eXBlcworICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICoKKyAgICAgRCBhZGxlcjMyICAgICAgICAgUFIgICAgICAgICAgICAxMFUgMCBleHRwcm9jKCdhZGxlcjMyJykgICAgICAgICAgICAgICAgICAgTmV3IGNoZWNrc3VtCisgICAgIEQgIGFkbGVyICAgICAgICAgICAgICAgICAgICAgICAgMTBVIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9sZCBjaGVja3N1bQorICAgICBEICBidWYgICAgICAgICAgICAgICAgICAgICAgIDY1NTM1ICAgIGNvbnN0IG9wdGlvbnMoKnZhcnNpemUpICAgICAgICAgICAgICBCeXRlcyB0byBhY2N1bXVsYXRlCisgICAgIEQgIGxlbiAgICAgICAgICAgICAgICAgICAgICAgICAgMTBVIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlciBsZW5ndGgKKyAgICAgICoKKyAgICAgRCBjcmMzMiAgICAgICAgICAgUFIgICAgICAgICAgICAxMFUgMCBleHRwcm9jKCdjcmMzMicpICAgICAgICAgICAgICAgICAgICAgTmV3IGNoZWNrc3VtCisgICAgIEQgIGNyYyAgICAgICAgICAgICAgICAgICAgICAgICAgMTBVIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9sZCBjaGVja3N1bQorICAgICBEICBidWYgICAgICAgICAgICAgICAgICAgICAgIDY1NTM1ICAgIGNvbnN0IG9wdGlvbnMoKnZhcnNpemUpICAgICAgICAgICAgICBCeXRlcyB0byBhY2N1bXVsYXRlCisgICAgIEQgIGxlbiAgICAgICAgICAgICAgICAgICAgICAgICAgMTBVIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlciBsZW5ndGgKKyAgICAgICoKKyAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAqICAgICAgICAgICAgICAgICAgICAgTWlzY2VsbGFuZW91cyBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgKgorICAgICBEIHpFcnJvciAgICAgICAgICBQUiAgICAgICAgICAgICAgKiAgIGV4dHByb2MoJ3pFcnJvcicpICAgICAgICAgICAgICAgICAgICBFcnJvciBzdHJpbmcKKyAgICAgRCAgZXJyICAgICAgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgY29kZQorICAgICAgKgorICAgICBEIGluZmxhdGVTeW5jUG9pbnQuLi4KKyAgICAgRCAgICAgICAgICAgICAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdpbmZsYXRlU3luY1BvaW50JykKKyAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgRXhwYW5zaW9uIHN0cmVhbQorICAgICAgKgorICAgICBEIGdldF9jcmNfdGFibGUgICBQUiAgICAgICAgICAgICAgKiAgIGV4dHByb2MoJ2dldF9jcmNfdGFibGUnKSAgICAgICAgICAgICBQdHIgdG8gdWxvbmdzCisgICAgICAqCisgICAgIEQgaW5mbGF0ZVVuZGVybWluZS4uLgorICAgICBEICAgICAgICAgICAgICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2luZmxhdGVVbmRlcm1pbmUnKQorICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBFeHBhbnNpb24gc3RyZWFtCisgICAgIEQgIGFyZyAgICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yIGNvZGUKKyAgICAgICoKKyAgICAgRCBpbmZsYXRlUmVzZXRLZWVwLi4uCisgICAgIEQgICAgICAgICAgICAgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnaW5mbGF0ZVJlc2V0S2VlcCcpICAgICAgICAgIEVuZCBhbmQgaW5pdC4gc3RyZWFtCisgICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KKyAgICAgICoKKyAgICAgRCBkZWZsYXRlUmVzZXRLZWVwLi4uCisgICAgIEQgICAgICAgICAgICAgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnZGVmbGF0ZVJlc2V0S2VlcCcpICAgICAgICAgIEVuZCBhbmQgaW5pdC4gc3RyZWFtCisgICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KKyAgICAgICoKKyAgICAgIC9lbmRpZgpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29tcHJlc3MuYyBiL3psaWIvc3JjL2NvbXByZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU5NzYyNgotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbXByZXNzLmMKQEAgLTAsMCArMSw4MCBAQAorLyogY29tcHJlc3MuYyAtLSBjb21wcmVzcyBhIG1lbW9yeSBidWZmZXIKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogQCgjKSAkSWQkICovCisKKyNkZWZpbmUgWkxJQl9JTlRFUk5BTAorI2luY2x1ZGUgInpsaWIuaCIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiBUaGUgbGV2ZWwKKyAgIHBhcmFtZXRlciBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBpbiBkZWZsYXRlSW5pdC4gIHNvdXJjZUxlbiBpcyB0aGUgYnl0ZQorICAgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZQorICAgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGF0IGxlYXN0IDAuMSUgbGFyZ2VyIHRoYW4gc291cmNlTGVuIHBsdXMKKyAgIDEyIGJ5dGVzLiBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4KKworICAgICBjb21wcmVzczIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIsCisgICBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgbGV2ZWwgcGFyYW1ldGVyIGlzIGludmFsaWQuCisqLworaW50IFpFWFBPUlQgY29tcHJlc3MyIChkZXN0LCBkZXN0TGVuLCBzb3VyY2UsIHNvdXJjZUxlbiwgbGV2ZWwpCisgICAgQnl0ZWYgKmRlc3Q7CisgICAgdUxvbmdmICpkZXN0TGVuOworICAgIGNvbnN0IEJ5dGVmICpzb3VyY2U7CisgICAgdUxvbmcgc291cmNlTGVuOworICAgIGludCBsZXZlbDsKK3sKKyAgICB6X3N0cmVhbSBzdHJlYW07CisgICAgaW50IGVycjsKKworICAgIHN0cmVhbS5uZXh0X2luID0gKHpfY29uc3QgQnl0ZWYgKilzb3VyY2U7CisgICAgc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpc291cmNlTGVuOworI2lmZGVmIE1BWFNFR182NEsKKyAgICAvKiBDaGVjayBmb3Igc291cmNlID4gNjRLIG9uIDE2LWJpdCBtYWNoaW5lOiAqLworICAgIGlmICgodUxvbmcpc3RyZWFtLmF2YWlsX2luICE9IHNvdXJjZUxlbikgcmV0dXJuIFpfQlVGX0VSUk9SOworI2VuZGlmCisgICAgc3RyZWFtLm5leHRfb3V0ID0gZGVzdDsKKyAgICBzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpKmRlc3RMZW47CisgICAgaWYgKCh1TG9uZylzdHJlYW0uYXZhaWxfb3V0ICE9ICpkZXN0TGVuKSByZXR1cm4gWl9CVUZfRVJST1I7CisKKyAgICBzdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKKyAgICBzdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CisgICAgc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKKworICAgIGVyciA9IGRlZmxhdGVJbml0KCZzdHJlYW0sIGxldmVsKTsKKyAgICBpZiAoZXJyICE9IFpfT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBkZWZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKTsKKyAgICBpZiAoZXJyICE9IFpfU1RSRUFNX0VORCkgeworICAgICAgICBkZWZsYXRlRW5kKCZzdHJlYW0pOworICAgICAgICByZXR1cm4gZXJyID09IFpfT0sgPyBaX0JVRl9FUlJPUiA6IGVycjsKKyAgICB9CisgICAgKmRlc3RMZW4gPSBzdHJlYW0udG90YWxfb3V0OworCisgICAgZXJyID0gZGVmbGF0ZUVuZCgmc3RyZWFtKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworaW50IFpFWFBPUlQgY29tcHJlc3MgKGRlc3QsIGRlc3RMZW4sIHNvdXJjZSwgc291cmNlTGVuKQorICAgIEJ5dGVmICpkZXN0OworICAgIHVMb25nZiAqZGVzdExlbjsKKyAgICBjb25zdCBCeXRlZiAqc291cmNlOworICAgIHVMb25nIHNvdXJjZUxlbjsKK3sKKyAgICByZXR1cm4gY29tcHJlc3MyKGRlc3QsIGRlc3RMZW4sIHNvdXJjZSwgc291cmNlTGVuLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04pOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgSWYgdGhlIGRlZmF1bHQgbWVtTGV2ZWwgb3Igd2luZG93Qml0cyBmb3IgZGVmbGF0ZUluaXQoKSBpcyBjaGFuZ2VkLCB0aGVuCisgICB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHVwZGF0ZWQuCisgKi8KK3VMb25nIFpFWFBPUlQgY29tcHJlc3NCb3VuZCAoc291cmNlTGVuKQorICAgIHVMb25nIHNvdXJjZUxlbjsKK3sKKyAgICByZXR1cm4gc291cmNlTGVuICsgKHNvdXJjZUxlbiA+PiAxMikgKyAoc291cmNlTGVuID4+IDE0KSArCisgICAgICAgICAgIChzb3VyY2VMZW4gPj4gMjUpICsgMTM7Cit9CmRpZmYgLS1naXQgYS96bGliL3NyYy9jb25maWd1cmUgYi96bGliL3NyYy9jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjc3YThhOAotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDgzMSBAQAorIyEvYmluL3NoCisjIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIHpsaWIuCisjCisjIE5vcm1hbGx5IGNvbmZpZ3VyZSBidWlsZHMgYm90aCBhIHN0YXRpYyBhbmQgYSBzaGFyZWQgbGlicmFyeS4KKyMgSWYgeW91IHdhbnQgdG8gYnVpbGQganVzdCBhIHN0YXRpYyBsaWJyYXJ5LCB1c2U6IC4vY29uZmlndXJlIC0tc3RhdGljCisjCisjIFRvIGltcG9zZSBzcGVjaWZpYyBjb21waWxlciBvciBmbGFncyBvciBpbnN0YWxsIGRpcmVjdG9yeSwgdXNlIGZvciBleGFtcGxlOgorIyAgICBwcmVmaXg9JEhPTUUgQ0M9Y2MgQ0ZMQUdTPSItTzQiIC4vY29uZmlndXJlCisjIG9yIGZvciBjc2gvdGNzaCB1c2VyczoKKyMgICAgKHNldGVudiBwcmVmaXggJEhPTUU7IHNldGVudiBDQyBjYzsgc2V0ZW52IENGTEFHUyAiLU80IjsgLi9jb25maWd1cmUpCisKKyMgSW5jb3JyZWN0IHNldHRpbmdzIG9mIENDIG9yIENGTEFHUyBtYXkgcHJldmVudCBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgorIyBJZiB5b3UgaGF2ZSBwcm9ibGVtcywgdHJ5IHdpdGhvdXQgZGVmaW5pbmcgQ0MgYW5kIENGTEFHUyBiZWZvcmUgcmVwb3J0aW5nCisjIGFuIGVycm9yLgorCisjIHN0YXJ0IG9mZiBjb25maWd1cmUubG9nCitlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tID4+IGNvbmZpZ3VyZS5sb2cKK2VjaG8gJDAgJCogPj4gY29uZmlndXJlLmxvZworZGF0ZSA+PiBjb25maWd1cmUubG9nCisKKyMgc2V0IGNvbW1hbmQgcHJlZml4IGZvciBjcm9zcy1jb21waWxhdGlvbgoraWYgWyAtbiAiJHtDSE9TVH0iIF07IHRoZW4KKyAgICB1bmFtZT0iYGVjaG8gIiR7Q0hPU1R9IiB8IHNlZCAtZSAncy9eW14tXSotXChbXi1dKlwpJC9cMS8nIC1lICdzL15bXi1dKi1bXi1dKi1cKFteLV0qXCkkL1wxLycgLWUgJ3MvXlteLV0qLVteLV0qLVwoW14tXSpcKS0uKiQvXDEvJ2AiCisgICAgQ1JPU1NfUFJFRklYPSIke0NIT1NUfS0iCitmaQorCisjIGRlc3RpbmF0aW9uIG5hbWUgZm9yIHN0YXRpYyBsaWJyYXJ5CitTVEFUSUNMSUI9bGliei5hCisKKyMgZXh0cmFjdCB6bGliIHZlcnNpb24gbnVtYmVycyBmcm9tIHpsaWIuaAorVkVSPWBzZWQgLW4gLWUgJy9WRVJTSU9OICIvcy8uKiJcKC4qXCkiLiovXDEvcCcgPCB6bGliLmhgCitWRVIzPWBzZWQgLW4gLWUgJy9WRVJTSU9OICIvcy8uKiJcKFswLTldKlxcLlswLTldKlxcLlswLTldKlwpLiovXDEvcCcgPCB6bGliLmhgCitWRVIyPWBzZWQgLW4gLWUgJy9WRVJTSU9OICIvcy8uKiJcKFswLTldKlxcLlswLTldKlwpXFwuLiovXDEvcCcgPCB6bGliLmhgCitWRVIxPWBzZWQgLW4gLWUgJy9WRVJTSU9OICIvcy8uKiJcKFswLTldKlwpXFwuLiovXDEvcCcgPCB6bGliLmhgCisKKyMgZXN0YWJsaXNoIGNvbW1hbmRzIGZvciBsaWJyYXJ5IGJ1aWxkaW5nCitpZiAiJHtDUk9TU19QUkVGSVh9YXIiIC0tdmVyc2lvbiA+L2Rldi9udWxsIDI+L2Rldi9udWxsIHx8IHRlc3QgJD8gLWx0IDEyNjsgdGhlbgorICAgIEFSPSR7QVItIiR7Q1JPU1NfUFJFRklYfWFyIn0KKyAgICB0ZXN0IC1uICIke0NST1NTX1BSRUZJWH0iICYmIGVjaG8gVXNpbmcgJHtBUn0gfCB0ZWUgLWEgY29uZmlndXJlLmxvZworZWxzZQorICAgIEFSPSR7QVItImFyIn0KKyAgICB0ZXN0IC1uICIke0NST1NTX1BSRUZJWH0iICYmIGVjaG8gVXNpbmcgJHtBUn0gfCB0ZWUgLWEgY29uZmlndXJlLmxvZworZmkKK0FSRkxBR1M9JHtBUkZMQUdTLSJyYyJ9CitpZiAiJHtDUk9TU19QUkVGSVh9cmFubGliIiAtLXZlcnNpb24gPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCB8fCB0ZXN0ICQ/IC1sdCAxMjY7IHRoZW4KKyAgICBSQU5MSUI9JHtSQU5MSUItIiR7Q1JPU1NfUFJFRklYfXJhbmxpYiJ9CisgICAgdGVzdCAtbiAiJHtDUk9TU19QUkVGSVh9IiAmJiBlY2hvIFVzaW5nICR7UkFOTElCfSB8IHRlZSAtYSBjb25maWd1cmUubG9nCitlbHNlCisgICAgUkFOTElCPSR7UkFOTElCLSJyYW5saWIifQorZmkKK2lmICIke0NST1NTX1BSRUZJWH1ubSIgLS12ZXJzaW9uID4vZGV2L251bGwgMj4vZGV2L251bGwgfHwgdGVzdCAkPyAtbHQgMTI2OyB0aGVuCisgICAgTk09JHtOTS0iJHtDUk9TU19QUkVGSVh9bm0ifQorICAgIHRlc3QgLW4gIiR7Q1JPU1NfUFJFRklYfSIgJiYgZWNobyBVc2luZyAke05NfSB8IHRlZSAtYSBjb25maWd1cmUubG9nCitlbHNlCisgICAgTk09JHtOTS0ibm0ifQorZmkKKworIyBzZXQgZGVmYXVsdHMgYmVmb3JlIHByb2Nlc3NpbmcgY29tbWFuZCBsaW5lIG9wdGlvbnMKK0xEQ09ORklHPSR7TERDT05GSUctImxkY29uZmlnIn0KK0xEU0hBUkVETElCQz0iJHtMRFNIQVJFRExJQkMtLWxjfSIKK0FSQ0hTPQorcHJlZml4PSR7cHJlZml4LS91c3IvbG9jYWx9CitleGVjX3ByZWZpeD0ke2V4ZWNfcHJlZml4LScke3ByZWZpeH0nfQorbGliZGlyPSR7bGliZGlyLScke2V4ZWNfcHJlZml4fS9saWInfQorc2hhcmVkbGliZGlyPSR7c2hhcmVkbGliZGlyLScke2xpYmRpcn0nfQoraW5jbHVkZWRpcj0ke2luY2x1ZGVkaXItJyR7cHJlZml4fS9pbmNsdWRlJ30KK21hbmRpcj0ke21hbmRpci0nJHtwcmVmaXh9L3NoYXJlL21hbid9CitzaGFyZWRfZXh0PScuc28nCitzaGFyZWQ9MQorc29sbz0wCitjb3Zlcj0wCit6cHJlZml4PTAKK3pjb25zdD0wCitidWlsZDY0PTAKK2djYz0wCitvbGRfY2M9IiRDQyIKK29sZF9jZmxhZ3M9IiRDRkxBR1MiCitPQkpDPSckKE9CSlopICQoT0JKRyknCitQSUNfT0JKQz0nJChQSUNfT0JKWikgJChQSUNfT0JKRyknCisKKyMgbGVhdmUgdGhpcyBzY3JpcHQsIG9wdGlvbmFsbHkgaW4gYSBiYWQgd2F5CitsZWF2ZSgpCit7CisgIGlmIHRlc3QgIiQqIiAhPSAiMCI7IHRoZW4KKyAgICBlY2hvICIqKiAkMCBhYm9ydGluZy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgZmkKKyAgcm0gLWYgJHRlc3QuW2NvXSAkdGVzdCAkdGVzdCRzaGFyZWRfZXh0ICR0ZXN0Lmdjbm8gLi8tLXZlcnNpb24KKyAgZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLSA+PiBjb25maWd1cmUubG9nCisgIGVjaG8gPj4gY29uZmlndXJlLmxvZworICBlY2hvID4+IGNvbmZpZ3VyZS5sb2cKKyAgZXhpdCAkMQorfQorCisjIHByb2Nlc3MgY29tbWFuZCBsaW5lIG9wdGlvbnMKK3doaWxlIHRlc3QgJCMgLWdlIDEKK2RvCitjYXNlICIkMSIgaW4KKyAgICAtaCogfCAtLWhlbHApCisgICAgICBlY2hvICd1c2FnZTonIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgICAgIGVjaG8gJyAgY29uZmlndXJlIFstLWNvbnN0XSBbLS16cHJlZml4XSBbLS1wcmVmaXg9UFJFRklYXSAgWy0tZXByZWZpeD1FWFBSRUZJWF0nIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgICAgIGVjaG8gJyAgICBbLS1zdGF0aWNdIFstLTY0XSBbLS1saWJkaXI9TElCRElSXSBbLS1zaGFyZWRsaWJkaXI9TElCRElSXScgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICAgICAgZWNobyAnICAgIFstLWluY2x1ZGVkaXI9SU5DTFVERURJUl0gWy0tYXJjaHM9Ii1hcmNoIGkzODYgLWFyY2ggeDg2XzY0Il0nIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgICAgICAgZXhpdCAwIDs7CisgICAgLXAqPSogfCAtLXByZWZpeD0qKSBwcmVmaXg9YGVjaG8gJDEgfCBzZWQgJ3MvLio9Ly8nYDsgc2hpZnQgOzsKKyAgICAtZSo9KiB8IC0tZXByZWZpeD0qKSBleGVjX3ByZWZpeD1gZWNobyAkMSB8IHNlZCAncy8uKj0vLydgOyBzaGlmdCA7OworICAgIC1sKj0qIHwgLS1saWJkaXI9KikgbGliZGlyPWBlY2hvICQxIHwgc2VkICdzLy4qPS8vJ2A7IHNoaWZ0IDs7CisgICAgLS1zaGFyZWRsaWJkaXI9Kikgc2hhcmVkbGliZGlyPWBlY2hvICQxIHwgc2VkICdzLy4qPS8vJ2A7IHNoaWZ0IDs7CisgICAgLWkqPSogfCAtLWluY2x1ZGVkaXI9KikgaW5jbHVkZWRpcj1gZWNobyAkMSB8IHNlZCAncy8uKj0vLydgO3NoaWZ0IDs7CisgICAgLXUqPSogfCAtLXVuYW1lPSopIHVuYW1lPWBlY2hvICQxIHwgc2VkICdzLy4qPS8vJ2A7c2hpZnQgOzsKKyAgICAtcCogfCAtLXByZWZpeCkgcHJlZml4PSIkMiI7IHNoaWZ0OyBzaGlmdCA7OworICAgIC1lKiB8IC0tZXByZWZpeCkgZXhlY19wcmVmaXg9IiQyIjsgc2hpZnQ7IHNoaWZ0IDs7CisgICAgLWwqIHwgLS1saWJkaXIpIGxpYmRpcj0iJDIiOyBzaGlmdDsgc2hpZnQgOzsKKyAgICAtaSogfCAtLWluY2x1ZGVkaXIpIGluY2x1ZGVkaXI9IiQyIjsgc2hpZnQ7IHNoaWZ0IDs7CisgICAgLXMqIHwgLS1zaGFyZWQgfCAtLWVuYWJsZS1zaGFyZWQpIHNoYXJlZD0xOyBzaGlmdCA7OworICAgIC10IHwgLS1zdGF0aWMpIHNoYXJlZD0wOyBzaGlmdCA7OworICAgIC0tc29sbykgc29sbz0xOyBzaGlmdCA7OworICAgIC0tY292ZXIpIGNvdmVyPTE7IHNoaWZ0IDs7CisgICAgLXoqIHwgLS16cHJlZml4KSB6cHJlZml4PTE7IHNoaWZ0IDs7CisgICAgLTYqIHwgLS02NCkgYnVpbGQ2ND0xOyBzaGlmdCA7OworICAgIC1hKj0qIHwgLS1hcmNocz0qKSBBUkNIUz1gZWNobyAkMSB8IHNlZCAncy8uKj0vLydgOyBzaGlmdCA7OworICAgIC0tc3lzY29uZmRpcj0qKSBlY2hvICJpZ25vcmVkIG9wdGlvbjogLS1zeXNjb25mZGlyIiB8IHRlZSAtYSBjb25maWd1cmUubG9nOyBzaGlmdCA7OworICAgIC0tbG9jYWxzdGF0ZWRpcj0qKSBlY2hvICJpZ25vcmVkIG9wdGlvbjogLS1sb2NhbHN0YXRlZGlyIiB8IHRlZSAtYSBjb25maWd1cmUubG9nOyBzaGlmdCA7OworICAgIC1jKiB8IC0tY29uc3QpIHpjb25zdD0xOyBzaGlmdCA7OworICAgICopCisgICAgICBlY2hvICJ1bmtub3duIG9wdGlvbjogJDEiIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgICAgIGVjaG8gIiQwIC0taGVscCBmb3IgaGVscCIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICAgICAgbGVhdmUgMTs7CisgICAgZXNhYworZG9uZQorCisjIHRlbXBvcmFyeSBmaWxlIG5hbWUKK3Rlc3Q9enRlc3QkJAorCisjIHB1dCBhcmd1bWVudHMgaW4gbG9nLCBhbHNvIHB1dCB0ZXN0IGZpbGUgaW4gbG9nIGlmIHVzZWQgaW4gYXJndW1lbnRzCitzaG93KCkKK3sKKyAgY2FzZSAiJCoiIGluCisgICAgKiR0ZXN0LmMqKQorICAgICAgZWNobyA9PT0gJHRlc3QuYyA9PT0gPj4gY29uZmlndXJlLmxvZworICAgICAgY2F0ICR0ZXN0LmMgPj4gY29uZmlndXJlLmxvZworICAgICAgZWNobyA9PT0gPj4gY29uZmlndXJlLmxvZzs7CisgIGVzYWMKKyAgZWNobyAkKiA+PiBjb25maWd1cmUubG9nCit9CisKKyMgY2hlY2sgZm9yIGdjYyB2cy4gY2MgYW5kIHNldCBjb21waWxlIGFuZCBsaW5rIGZsYWdzIGJhc2VkIG9uIHRoZSBzeXN0ZW0gaWRlbnRpZmllZCBieSB1bmFtZQorY2F0ID4gJHRlc3QuYyA8PEVPRgorZXh0ZXJuIGludCBnZXRjaGFyKCk7CitpbnQgaGVsbG8oKSB7cmV0dXJuIGdldGNoYXIoKTt9CitFT0YKKwordGVzdCAteiAiJENDIiAmJiBlY2hvIENoZWNraW5nIGZvciAke0NST1NTX1BSRUZJWH1nY2MuLi4gfCB0ZWUgLWEgY29uZmlndXJlLmxvZworY2M9JHtDQy0ke0NST1NTX1BSRUZJWH1nY2N9CitjZmxhZ3M9JHtDRkxBR1MtIi1PMyJ9CisjIHRvIGZvcmNlIHRoZSBhc20gdmVyc2lvbiB1c2U6IENGTEFHUz0iLU8zIC1EQVNNViIgLi9jb25maWd1cmUKK2Nhc2UgIiRjYyIgaW4KKyAgKmdjYyopIGdjYz0xIDs7CisgICpjbGFuZyopIGdjYz0xIDs7Citlc2FjCitjYXNlIGAkY2MgLXYgMj4mMWAgaW4KKyAgKmdjYyopIGdjYz0xIDs7Citlc2FjCisKK3Nob3cgJGNjIC1jICR0ZXN0LmMKK2lmIHRlc3QgIiRnY2MiIC1lcSAxICYmICgkY2MgLWMgJHRlc3QuYykgPj4gY29uZmlndXJlLmxvZyAyPiYxOyB0aGVuCisgIGVjaG8gLi4uIHVzaW5nIGdjYyA+PiBjb25maWd1cmUubG9nCisgIENDPSIkY2MiCisgIENGTEFHUz0iJHtDRkxBR1MtLU8zfSAke0FSQ0hTfSIKKyAgU0ZMQUdTPSIke0NGTEFHUy0tTzN9IC1mUElDIgorICBMREZMQUdTPSIke0xERkxBR1N9ICR7QVJDSFN9IgorICBpZiB0ZXN0ICRidWlsZDY0IC1lcSAxOyB0aGVuCisgICAgQ0ZMQUdTPSIke0NGTEFHU30gLW02NCIKKyAgICBTRkxBR1M9IiR7U0ZMQUdTfSAtbTY0IgorICBmaQorICBpZiB0ZXN0ICIke1pMSUJHQ0NXQVJOfSIgPSAiWUVTIjsgdGhlbgorICAgIGlmIHRlc3QgIiR6Y29uc3QiIC1lcSAxOyB0aGVuCisgICAgICBDRkxBR1M9IiR7Q0ZMQUdTfSAtV2FsbCAtV2V4dHJhIC1XY2FzdC1xdWFsIC1wZWRhbnRpYyAtRFpMSUJfQ09OU1QiCisgICAgZWxzZQorICAgICAgQ0ZMQUdTPSIke0NGTEFHU30gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMiCisgICAgZmkKKyAgZmkKKyAgaWYgdGVzdCAteiAiJHVuYW1lIjsgdGhlbgorICAgIHVuYW1lPWAodW5hbWUgLXMgfHwgZWNobyB1bmtub3duKSAyPi9kZXYvbnVsbGAKKyAgZmkKKyAgY2FzZSAiJHVuYW1lIiBpbgorICBMaW51eCogfCBsaW51eCogfCBHTlUgfCBHTlUvKiB8IHNvbGFyaXMqKQorICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSIkY2MgLXNoYXJlZCAtV2wsLXNvbmFtZSxsaWJ6LnNvLjEsLS12ZXJzaW9uLXNjcmlwdCx6bGliLm1hcCJ9IDs7CisgICpCU0QgfCAqYnNkKiB8IERyYWdvbkZseSkKKyAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iJGNjIC1zaGFyZWQgLVdsLC1zb25hbWUsbGliei5zby4xLC0tdmVyc2lvbi1zY3JpcHQsemxpYi5tYXAifQorICAgICAgICBMRENPTkZJRz0ibGRjb25maWcgLW0iIDs7CisgIENZR1dJTiogfCBDeWd3aW4qIHwgY3lnd2luKiB8IE9TLzIqKQorICAgICAgICBFWEU9Jy5leGUnIDs7CisgIE1JTkdXKiB8IG1pbmd3KikKKyMgdGVtcG9yYXJ5IGJ5cGFzcworICAgICAgICBybSAtZiAkdGVzdC5bY29dICR0ZXN0ICR0ZXN0JHNoYXJlZF9leHQKKyAgICAgICAgZWNobyAiUGxlYXNlIHVzZSB3aW4zMi9NYWtlZmlsZS5nY2MgaW5zdGVhZC4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgICAgICAgbGVhdmUgMQorICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSIkY2MgLXNoYXJlZCJ9CisgICAgICAgIExEU0hBUkVETElCQz0iIgorICAgICAgICBFWEU9Jy5leGUnIDs7CisgIFFOWCopICAjIFRoaXMgaXMgZm9yIFFOWDYuIEkgc3VwcG9zZSB0aGF0IHRoZSBRTlggcnVsZSBiZWxvdyBpcyBmb3IgUU5YMixRTlg0CisgICAgICAgICAjIChhbGFpbi5ib25uZWZveUBpY2J0LmNvbSkKKyAgICAgICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iJGNjIC1zaGFyZWQgLVdsLC1obGliei5zby4xIn0gOzsKKyAgSFAtVVgqKQorICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iJGNjIC1zaGFyZWQgJFNGTEFHUyJ9CisgICAgICAgICBjYXNlIGAodW5hbWUgLW0gfHwgZWNobyB1bmtub3duKSAyPi9kZXYvbnVsbGAgaW4KKyAgICAgICAgIGlhNjQpCisgICAgICAgICAgICAgICAgIHNoYXJlZF9leHQ9Jy5zbycKKyAgICAgICAgICAgICAgICAgU0hBUkVETElCPSdsaWJ6LnNvJyA7OworICAgICAgICAgKikKKyAgICAgICAgICAgICAgICAgc2hhcmVkX2V4dD0nLnNsJworICAgICAgICAgICAgICAgICBTSEFSRURMSUI9J2xpYnouc2wnIDs7CisgICAgICAgICBlc2FjIDs7CisgIERhcndpbiogfCBkYXJ3aW4qKQorICAgICAgICAgICAgIHNoYXJlZF9leHQ9Jy5keWxpYicKKyAgICAgICAgICAgICBTSEFSRURMSUI9bGlieiRzaGFyZWRfZXh0CisgICAgICAgICAgICAgU0hBUkVETElCVj1saWJ6LiRWRVIkc2hhcmVkX2V4dAorICAgICAgICAgICAgIFNIQVJFRExJQk09bGliei4kVkVSMSRzaGFyZWRfZXh0CisgICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iJGNjIC1keW5hbWljbGliIC1pbnN0YWxsX25hbWUgJGxpYmRpci8kU0hBUkVETElCTSAtY29tcGF0aWJpbGl0eV92ZXJzaW9uICRWRVIxIC1jdXJyZW50X3ZlcnNpb24gJFZFUjMifQorICAgICAgICAgICAgIGlmIGxpYnRvb2wgLVYgMj4mMSB8IGdyZXAgQXBwbGUgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgICAgICAgICAgQVI9ImxpYnRvb2wiCisgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICBBUj0iL3Vzci9iaW4vbGlidG9vbCIKKyAgICAgICAgICAgICBmaQorICAgICAgICAgICAgIEFSRkxBR1M9Ii1vIiA7OworICAqKSAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSIkY2MgLXNoYXJlZCJ9IDs7CisgIGVzYWMKK2Vsc2UKKyAgIyBmaW5kIHN5c3RlbSBuYW1lIGFuZCBjb3JyZXNwb25kaW5nIGNjIG9wdGlvbnMKKyAgQ0M9JHtDQy1jY30KKyAgZ2NjPTAKKyAgZWNobyAuLi4gdXNpbmcgJENDID4+IGNvbmZpZ3VyZS5sb2cKKyAgaWYgdGVzdCAteiAiJHVuYW1lIjsgdGhlbgorICAgIHVuYW1lPWAodW5hbWUgLXNyIHx8IGVjaG8gdW5rbm93bikgMj4vZGV2L251bGxgCisgIGZpCisgIGNhc2UgIiR1bmFtZSIgaW4KKyAgSFAtVVgqKSAgICBTRkxBR1M9JHtDRkxBR1MtIi1PICt6In0KKyAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIn0KKyMgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJsZCAtYiArdm5vY29tcGF0d2FybmluZ3MifQorICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImxkIC1iIn0KKyAgICAgICAgIGNhc2UgYCh1bmFtZSAtbSB8fCBlY2hvIHVua25vd24pIDI+L2Rldi9udWxsYCBpbgorICAgICAgICAgaWE2NCkKKyAgICAgICAgICAgICBzaGFyZWRfZXh0PScuc28nCisgICAgICAgICAgICAgU0hBUkVETElCPSdsaWJ6LnNvJyA7OworICAgICAgICAgKikKKyAgICAgICAgICAgICBzaGFyZWRfZXh0PScuc2wnCisgICAgICAgICAgICAgU0hBUkVETElCPSdsaWJ6LnNsJyA7OworICAgICAgICAgZXNhYyA7OworICBJUklYKikgICAgIFNGTEFHUz0ke0NGTEFHUy0iLWFuc2kgLU8yIC1ycGF0aCAuIn0KKyAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1hbnNpIC1PMiJ9CisgICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MgLXNoYXJlZCAtV2wsLXNvbmFtZSxsaWJ6LnNvLjEifSA7OworICBPU0YxXCBWNCopIFNGTEFHUz0ke0NGTEFHUy0iLU8gLXN0ZDEifQorICAgICAgICAgICAgIENGTEFHUz0ke0NGTEFHUy0iLU8gLXN0ZDEifQorICAgICAgICAgICAgIExERkxBR1M9IiR7TERGTEFHU30gLVdsLC1ycGF0aCwuIgorICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1zaGFyZWQgIC1XbCwtc29uYW1lLGxpYnouc28gLVdsLC1tc3ltIC1XbCwtcnBhdGgsJChsaWJkaXIpIC1XbCwtc2V0X3ZlcnNpb24sJHtWRVJ9OjEuMCJ9IDs7CisgIE9TRjEqKSAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItTyAtc3RkMSJ9CisgICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTyAtc3RkMSJ9CisgICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MgLXNoYXJlZCAtV2wsLXNvbmFtZSxsaWJ6LnNvLjEifSA7OworICBRTlgqKSAgICAgIFNGTEFHUz0ke0NGTEFHUy0iLTQgLU8ifQorICAgICAgICAgICAgIENGTEFHUz0ke0NGTEFHUy0iLTQgLU8ifQorICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIn0KKyAgICAgICAgICAgICBSQU5MSUI9JHtSQU5MSUItInRydWUifQorICAgICAgICAgICAgIEFSPSJjYyIKKyAgICAgICAgICAgICBBUkZMQUdTPSItQSIgOzsKKyAgU0NPX1NWXCAzLjIqKSBTRkxBR1M9JHtDRkxBR1MtIi1PMyAtZHkgLUtQSUMgIn0KKyAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PMyJ9CisgICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MgLWR5IC1LUElDIC1HIn0gOzsKKyAgU3VuT1NcIDUqIHwgc29sYXJpcyopCisgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtRyAtaCBsaWJ6JHNoYXJlZF9leHQuJFZFUjEifQorICAgICAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItZmFzdCAtS1BJQyJ9CisgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1mYXN0In0KKyAgICAgICAgIGlmIHRlc3QgJGJ1aWxkNjQgLWVxIDE7IHRoZW4KKyAgICAgICAgICAgICAjIG9sZCB2ZXJzaW9ucyBvZiBTdW5QUk8vV29ya3Nob3AvU3R1ZGlvIGRvbid0IHN1cHBvcnQgLW02NCwKKyAgICAgICAgICAgICAjIGJ1dCBuZXdlciBvbmVzIGRvLiAgQ2hlY2sgZm9yIGl0LgorICAgICAgICAgICAgIGZsYWc2ND1gJENDIC1mbGFncyB8IGVncmVwIC0tICdeLW02NCdgCisgICAgICAgICAgICAgaWYgdGVzdCB4IiRmbGFnNjQiICE9IHgiIiA7IHRoZW4KKyAgICAgICAgICAgICAgICAgQ0ZMQUdTPSIke0NGTEFHU30gLW02NCIKKyAgICAgICAgICAgICAgICAgU0ZMQUdTPSIke1NGTEFHU30gLW02NCIKKyAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgIGNhc2UgYCh1bmFtZSAtbSB8fCBlY2hvIHVua25vd24pIDI+L2Rldi9udWxsYCBpbgorICAgICAgICAgICAgICAgICAgIGk4NiopCisgICAgICAgICAgICAgICAgICAgICBTRkxBR1M9IiRTRkxBR1MgLXhhcmNoPWFtZDY0IgorICAgICAgICAgICAgICAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC14YXJjaD1hbWQ2NCIgOzsKKyAgICAgICAgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgICAgICAgU0ZMQUdTPSIkU0ZMQUdTIC14YXJjaD12OSIKKyAgICAgICAgICAgICAgICAgICAgIENGTEFHUz0iJENGTEFHUyAteGFyY2g9djkiIDs7CisgICAgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgICBmaQorICAgICAgICAgZmkKKyAgICAgICAgIDs7CisgIFN1bk9TXCA0KikgU0ZMQUdTPSR7Q0ZMQUdTLSItTzIgLVBJQyJ9CisgICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTzIifQorICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImxkIn0gOzsKKyAgU3VuU3R1ZGlvXCA5KikgU0ZMQUdTPSR7Q0ZMQUdTLSItZmFzdCAteGNvZGU9cGljMzIgLXh0YXJnZXQ9dWx0cmEzIC14YXJjaD12OWIifQorICAgICAgICAgICAgIENGTEFHUz0ke0NGTEFHUy0iLWZhc3QgLXh0YXJnZXQ9dWx0cmEzIC14YXJjaD12OWIifQorICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC14YXJjaD12OWIifSA7OworICBVTklYX1N5c3RlbV9WXCA0LjIuMCkKKyAgICAgICAgICAgICBTRkxBR1M9JHtDRkxBR1MtIi1LUElDIC1PIn0KKyAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIn0KKyAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtRyJ9IDs7CisgIFVOSVhfU1ZcIDQuMk1QKQorICAgICAgICAgICAgIFNGTEFHUz0ke0NGTEFHUy0iLUtjb25mb3JtX3BpYyAtTyJ9CisgICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTyJ9CisgICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MgLUcifSA7OworICBPcGVuVU5JWFwgNSkKKyAgICAgICAgICAgICBTRkxBR1M9JHtDRkxBR1MtIi1LUElDIC1PIn0KKyAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIn0KKyAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtRyJ9IDs7CisgIEFJWCopICAjIENvdXJ0ZXN5IG9mIGRiYWtrZXJAYXJyYXlhc29sdXRpb25zLmNvbQorICAgICAgICAgICAgIFNGTEFHUz0ke0NGTEFHUy0iLU8gLXFtYXhtZW09ODE5MiJ9CisgICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTyAtcW1heG1lbT04MTkyIn0KKyAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJ4bGMgLUcifSA7OworICAjIHNlbmQgd29ya2luZyBvcHRpb25zIGZvciBvdGhlciBzeXN0ZW1zIHRvIHpsaWJAZ3ppcC5vcmcKKyAgKikgICAgICAgICBTRkxBR1M9JHtDRkxBR1MtIi1PIn0KKyAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIn0KKyAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtc2hhcmVkIn0gOzsKKyAgZXNhYworZmkKKworIyBkZXN0aW5hdGlvbiBuYW1lcyBmb3Igc2hhcmVkIGxpYnJhcnkgaWYgbm90IGRlZmluZWQgYWJvdmUKK1NIQVJFRExJQj0ke1NIQVJFRExJQi0ibGlieiRzaGFyZWRfZXh0In0KK1NIQVJFRExJQlY9JHtTSEFSRURMSUJWLSJsaWJ6JHNoYXJlZF9leHQuJFZFUiJ9CitTSEFSRURMSUJNPSR7U0hBUkVETElCTS0ibGlieiRzaGFyZWRfZXh0LiRWRVIxIn0KKworZWNobyA+PiBjb25maWd1cmUubG9nCisKKyMgZGVmaW5lIGZ1bmN0aW9ucyBmb3IgdGVzdGluZyBjb21waWxlciBhbmQgbGlicmFyeSBjaGFyYWN0ZXJpc3RpY3MgYW5kIGxvZ2dpbmcgdGhlIHJlc3VsdHMKKworY2F0ID4gJHRlc3QuYyA8PEVPRgorI2Vycm9yIGVycm9yCitFT0YKK2lmICgkQ0MgLWMgJENGTEFHUyAkdGVzdC5jKSAyPi9kZXYvbnVsbDsgdGhlbgorICB0cnkoKQorICB7CisgICAgc2hvdyAkKgorICAgIHRlc3QgImAoICQqICkgMj4mMSB8IHRlZSAtYSBjb25maWd1cmUubG9nYCIgPSAiIgorICB9CisgIGVjaG8gLSB1c2luZyBhbnkgb3V0cHV0IGZyb20gY29tcGlsZXIgdG8gaW5kaWNhdGUgYW4gZXJyb3IgPj4gY29uZmlndXJlLmxvZworZWxzZQordHJ5KCkKK3sKKyAgc2hvdyAkKgorICAoICQqICkgPj4gY29uZmlndXJlLmxvZyAyPiYxCisgIHJldD0kPworICBpZiB0ZXN0ICRyZXQgLW5lIDA7IHRoZW4KKyAgICBlY2hvICIoZXhpdCBjb2RlICIkcmV0IikiID4+IGNvbmZpZ3VyZS5sb2cKKyAgZmkKKyAgcmV0dXJuICRyZXQKK30KK2ZpCisKK3RyeWJvdGgoKQoreworICBzaG93ICQqCisgIGdvdD1gKCAkKiApIDI+JjFgCisgIHJldD0kPworICBwcmludGYgJXMgIiRnb3QiID4+IGNvbmZpZ3VyZS5sb2cKKyAgaWYgdGVzdCAkcmV0IC1uZSAwOyB0aGVuCisgICAgcmV0dXJuICRyZXQKKyAgZmkKKyAgdGVzdCAiJGdvdCIgPSAiIgorfQorCitjYXQgPiAkdGVzdC5jIDw8IEVPRgoraW50IGZvbygpIHsgcmV0dXJuIDA7IH0KK0VPRgorZWNobyAiQ2hlY2tpbmcgZm9yIG9ic2Vzc2l2ZS1jb21wdWxzaXZlIGNvbXBpbGVyIG9wdGlvbnMuLi4iID4+IGNvbmZpZ3VyZS5sb2cKK2lmIHRyeSAkQ0MgLWMgJENGTEFHUyAkdGVzdC5jOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiQ29tcGlsZXIgZXJyb3IgcmVwb3J0aW5nIGlzIHRvbyBoYXJzaCBmb3IgJDAgKHBlcmhhcHMgcmVtb3ZlIC1XZXJyb3IpLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICBsZWF2ZSAxCitmaQorCitlY2hvID4+IGNvbmZpZ3VyZS5sb2cKKworIyBzZWUgaWYgc2hhcmVkIGxpYnJhcnkgYnVpbGQgc3VwcG9ydGVkCitjYXQgPiAkdGVzdC5jIDw8RU9GCitleHRlcm4gaW50IGdldGNoYXIoKTsKK2ludCBoZWxsbygpIHtyZXR1cm4gZ2V0Y2hhcigpO30KK0VPRgoraWYgdGVzdCAkc2hhcmVkIC1lcSAxOyB0aGVuCisgIGVjaG8gQ2hlY2tpbmcgZm9yIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuLi4gfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICAjIHdlIG11c3QgdGVzdCBpbiB0d28gc3RlcHMgKGNjIHRoZW4gbGQpLCByZXF1aXJlZCBhdCBsZWFzdCBvbiBTdW5PUyA0LngKKyAgaWYgdHJ5ICRDQyAtdyAtYyAkU0ZMQUdTICR0ZXN0LmMgJiYKKyAgICAgdHJ5ICRMRFNIQVJFRCAkU0ZMQUdTIC1vICR0ZXN0JHNoYXJlZF9leHQgJHRlc3QubzsgdGhlbgorICAgIGVjaG8gQnVpbGRpbmcgc2hhcmVkIGxpYnJhcnkgJFNIQVJFRExJQlYgd2l0aCAkQ0MuIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgZWxpZiB0ZXN0IC16ICIkb2xkX2NjIiAtYSAteiAiJG9sZF9jZmxhZ3MiOyB0aGVuCisgICAgZWNobyBObyBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgICAgc2hhcmVkPTA7CisgIGVsc2UKKyAgICBlY2hvICdObyBzaGFyZWQgbGlicmFyeSBzdXBwb3J0OyB0cnkgd2l0aG91dCBkZWZpbmluZyBDQyBhbmQgQ0ZMQUdTJyB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgICAgc2hhcmVkPTA7CisgIGZpCitmaQoraWYgdGVzdCAkc2hhcmVkIC1lcSAwOyB0aGVuCisgIExEU0hBUkVEPSIkQ0MiCisgIEFMTD0ic3RhdGljIgorICBURVNUPSJhbGwgdGVzdHN0YXRpYyIKKyAgU0hBUkVETElCPSIiCisgIFNIQVJFRExJQlY9IiIKKyAgU0hBUkVETElCTT0iIgorICBlY2hvIEJ1aWxkaW5nIHN0YXRpYyBsaWJyYXJ5ICRTVEFUSUNMSUIgdmVyc2lvbiAkVkVSIHdpdGggJENDLiB8IHRlZSAtYSBjb25maWd1cmUubG9nCitlbHNlCisgIEFMTD0ic3RhdGljIHNoYXJlZCIKKyAgVEVTVD0iYWxsIHRlc3RzdGF0aWMgdGVzdHNoYXJlZCIKK2ZpCisKKyMgY2hlY2sgZm9yIHVuZGVyc2NvcmVzIGluIGV4dGVybmFsIG5hbWVzIGZvciB1c2UgYnkgYXNzZW1ibGVyIGNvZGUKK0NQUD0ke0NQUC0iJENDIC1FIn0KK2Nhc2UgJENGTEFHUyBpbgorICAqQVNNViopCisgICAgZWNobyA+PiBjb25maWd1cmUubG9nCisgICAgc2hvdyAiJE5NICR0ZXN0Lm8gfCBncmVwIF9oZWxsbyIKKyAgICBpZiB0ZXN0ICJgJE5NICR0ZXN0Lm8gfCBncmVwIF9oZWxsbyB8IHRlZSAtYSBjb25maWd1cmUubG9nYCIgPSAiIjsgdGhlbgorICAgICAgQ1BQPSIkQ1BQIC1ETk9fVU5ERVJMSU5FIgorICAgICAgZWNobyBDaGVja2luZyBmb3IgdW5kZXJsaW5lIGluIGV4dGVybmFsIG5hbWVzLi4uIE5vLiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgICAgZWxzZQorICAgICAgZWNobyBDaGVja2luZyBmb3IgdW5kZXJsaW5lIGluIGV4dGVybmFsIG5hbWVzLi4uIFllcy4gfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICAgIGZpIDs7Citlc2FjCisKK2VjaG8gPj4gY29uZmlndXJlLmxvZworCisjIGNoZWNrIGZvciBsYXJnZSBmaWxlIHN1cHBvcnQsIGFuZCBpZiBub25lLCBjaGVjayBmb3IgZnNlZWtvKCkKK2NhdCA+ICR0ZXN0LmMgPDxFT0YKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KK29mZjY0X3QgZHVtbXkgPSAwOworRU9GCitpZiB0cnkgJENDIC1jICRDRkxBR1MgLURfTEFSR0VGSUxFNjRfU09VUkNFPTEgJHRlc3QuYzsgdGhlbgorICBDRkxBR1M9IiR7Q0ZMQUdTfSAtRF9MQVJHRUZJTEU2NF9TT1VSQ0U9MSIKKyAgU0ZMQUdTPSIke1NGTEFHU30gLURfTEFSR0VGSUxFNjRfU09VUkNFPTEiCisgIEFMTD0iJHtBTEx9IGFsbDY0IgorICBURVNUPSIke1RFU1R9IHRlc3Q2NCIKKyAgZWNobyAiQ2hlY2tpbmcgZm9yIG9mZjY0X3QuLi4gWWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICBlY2hvICJDaGVja2luZyBmb3IgZnNlZWtvLi4uIFllcy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKK2Vsc2UKKyAgZWNobyAiQ2hlY2tpbmcgZm9yIG9mZjY0X3QuLi4gTm8uIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgIGVjaG8gPj4gY29uZmlndXJlLmxvZworICBjYXQgPiAkdGVzdC5jIDw8RU9GCisjaW5jbHVkZSA8c3RkaW8uaD4KK2ludCBtYWluKHZvaWQpIHsKKyAgZnNlZWtvKE5VTEwsIDAsIDApOworICByZXR1cm4gMDsKK30KK0VPRgorICBpZiB0cnkgJENDICRDRkxBR1MgLW8gJHRlc3QgJHRlc3QuYzsgdGhlbgorICAgIGVjaG8gIkNoZWNraW5nIGZvciBmc2Vla28uLi4gWWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICBlbHNlCisgICAgQ0ZMQUdTPSIke0NGTEFHU30gLUROT19GU0VFS08iCisgICAgU0ZMQUdTPSIke1NGTEFHU30gLUROT19GU0VFS08iCisgICAgZWNobyAiQ2hlY2tpbmcgZm9yIGZzZWVrby4uLiBOby4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgZmkKK2ZpCisKK2VjaG8gPj4gY29uZmlndXJlLmxvZworCisjIGNoZWNrIGZvciBzdHJlcnJvcigpIGZvciB1c2UgYnkgZ3oqIGZ1bmN0aW9ucworY2F0ID4gJHRlc3QuYyA8PEVPRgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CitpbnQgbWFpbigpIHsgcmV0dXJuIHN0cmxlbihzdHJlcnJvcihlcnJubykpOyB9CitFT0YKK2lmIHRyeSAkQ0MgJENGTEFHUyAtbyAkdGVzdCAkdGVzdC5jOyB0aGVuCisgIGVjaG8gIkNoZWNraW5nIGZvciBzdHJlcnJvci4uLiBZZXMuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCitlbHNlCisgIENGTEFHUz0iJHtDRkxBR1N9IC1ETk9fU1RSRVJST1IiCisgIFNGTEFHUz0iJHtTRkxBR1N9IC1ETk9fU1RSRVJST1IiCisgIGVjaG8gIkNoZWNraW5nIGZvciBzdHJlcnJvci4uLiBOby4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKK2ZpCisKKyMgY29weSBjbGVhbiB6Y29uZi5oIGZvciBzdWJzZXF1ZW50IGVkaXRzCitjcCAtcCB6Y29uZi5oLmluIHpjb25mLmgKKworZWNobyA+PiBjb25maWd1cmUubG9nCisKKyMgY2hlY2sgZm9yIHVuaXN0ZC5oIGFuZCBzYXZlIHJlc3VsdCBpbiB6Y29uZi5oCitjYXQgPiAkdGVzdC5jIDw8RU9GCisjaW5jbHVkZSA8dW5pc3RkLmg+CitpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KK0VPRgoraWYgdHJ5ICRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmM7IHRoZW4KKyAgc2VkIDwgemNvbmYuaCAiL14jaWZkZWYgSEFWRV9VTklTVERfSC4qIG1heSBiZS9zL2RlZiBIQVZFX1VOSVNURF9IXCguKlwpIG1heSBiZS8gMVwxIHdhcy8iID4gemNvbmYudGVtcC5oCisgIG12IHpjb25mLnRlbXAuaCB6Y29uZi5oCisgIGVjaG8gIkNoZWNraW5nIGZvciB1bmlzdGQuaC4uLiBZZXMuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCitlbHNlCisgIGVjaG8gIkNoZWNraW5nIGZvciB1bmlzdGQuaC4uLiBOby4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKK2ZpCisKK2VjaG8gPj4gY29uZmlndXJlLmxvZworCisjIGNoZWNrIGZvciBzdGRhcmcuaCBhbmQgc2F2ZSByZXN1bHQgaW4gemNvbmYuaAorY2F0ID4gJHRlc3QuYyA8PEVPRgorI2luY2x1ZGUgPHN0ZGFyZy5oPgoraW50IG1haW4oKSB7IHJldHVybiAwOyB9CitFT0YKK2lmIHRyeSAkQ0MgLWMgJENGTEFHUyAkdGVzdC5jOyB0aGVuCisgIHNlZCA8IHpjb25mLmggIi9eI2lmZGVmIEhBVkVfU1REQVJHX0guKiBtYXkgYmUvcy9kZWYgSEFWRV9TVERBUkdfSFwoLipcKSBtYXkgYmUvIDFcMSB3YXMvIiA+IHpjb25mLnRlbXAuaAorICBtdiB6Y29uZi50ZW1wLmggemNvbmYuaAorICBlY2hvICJDaGVja2luZyBmb3Igc3RkYXJnLmguLi4gWWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworZWxzZQorICBlY2hvICJDaGVja2luZyBmb3Igc3RkYXJnLmguLi4gTm8uIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCitmaQorCisjIGlmIHRoZSB6XyBwcmVmaXggd2FzIHJlcXVlc3RlZCwgc2F2ZSB0aGF0IGluIHpjb25mLmgKK2lmIHRlc3QgJHpwcmVmaXggLWVxIDE7IHRoZW4KKyAgc2VkIDwgemNvbmYuaCAiLyNpZmRlZiBaX1BSRUZJWC4qIG1heSBiZS9zL2RlZiBaX1BSRUZJWFwoLipcKSBtYXkgYmUvIDFcMSB3YXMvIiA+IHpjb25mLnRlbXAuaAorICBtdiB6Y29uZi50ZW1wLmggemNvbmYuaAorICBlY2hvID4+IGNvbmZpZ3VyZS5sb2cKKyAgZWNobyAiVXNpbmcgel8gcHJlZml4IG9uIGFsbCBzeW1ib2xzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworZmkKKworIyBpZiAtLXNvbG8gY29tcGlsYXRpb24gd2FzIHJlcXVlc3RlZCwgc2F2ZSB0aGF0IGluIHpjb25mLmggYW5kIHJlbW92ZSBneiBzdHVmZiBmcm9tIG9iamVjdCBsaXN0cworaWYgdGVzdCAkc29sbyAtZXEgMTsgdGhlbgorICBzZWQgJy8jZGVmaW5lIFpDT05GX0gvYVwKKyNkZWZpbmUgWl9TT0xPCisKKycgPCB6Y29uZi5oID4gemNvbmYudGVtcC5oCisgIG12IHpjb25mLnRlbXAuaCB6Y29uZi5oCitPQkpDPSckKE9CSlopJworUElDX09CSkM9JyQoUElDX09CSlopJworZmkKKworIyBpZiBjb2RlIGNvdmVyYWdlIHRlc3Rpbmcgd2FzIHJlcXVlc3RlZCwgdXNlIG9sZGVyIGdjYyBpZiBkZWZpbmVkLCBlLmcuICJnY2MtNC4yIiBvbiBNYWMgT1MgWAoraWYgdGVzdCAkY292ZXIgLWVxIDE7IHRoZW4KKyAgQ0ZMQUdTPSIke0NGTEFHU30gLWZwcm9maWxlLWFyY3MgLWZ0ZXN0LWNvdmVyYWdlIgorICBpZiB0ZXN0IC1uICIkR0NDX0NMQVNTSUMiOyB0aGVuCisgICAgQ0M9JEdDQ19DTEFTU0lDCisgIGZpCitmaQorCitlY2hvID4+IGNvbmZpZ3VyZS5sb2cKKworIyBjb25kdWN0IGEgc2VyaWVzIG9mIHRlc3RzIHRvIHJlc29sdmUgZWlnaHQgcG9zc2libGUgY2FzZXMgb2YgdXNpbmcgInZzIiBvciAicyIgcHJpbnRmIGZ1bmN0aW9ucworIyAodXNpbmcgc3RkYXJnIG9yIG5vdCksIHdpdGggb3Igd2l0aG91dCAibiIgKHByb3Zpbmcgc2l6ZSBvZiBidWZmZXIpLCBhbmQgd2l0aCBvciB3aXRob3V0IGEKKyMgcmV0dXJuIHZhbHVlLiAgVGhlIG1vc3Qgc2VjdXJlIHJlc3VsdCBpcyB2c25wcmludGYoKSB3aXRoIGEgcmV0dXJuIHZhbHVlLiAgc25wcmludGYoKSB3aXRoIGEKKyMgcmV0dXJuIHZhbHVlIGlzIHNlY3VyZSBhcyB3ZWxsLCBidXQgdGhlbiBnenByaW50ZigpIHdpbGwgYmUgbGltaXRlZCB0byAyMCBhcmd1bWVudHMuCitjYXQgPiAkdGVzdC5jIDw8RU9GCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlICJ6Y29uZi5oIgoraW50IG1haW4oKQoreworI2lmbmRlZiBTVERDCisgIGNob2tlIG1lCisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CitFT0YKK2lmIHRyeSAkQ0MgLWMgJENGTEFHUyAkdGVzdC5jOyB0aGVuCisgIGVjaG8gIkNoZWNraW5nIHdoZXRoZXIgdG8gdXNlIHZzW25dcHJpbnRmKCkgb3Igc1tuXXByaW50ZigpLi4uIHVzaW5nIHZzW25dcHJpbnRmKCkuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisKKyAgZWNobyA+PiBjb25maWd1cmUubG9nCisgIGNhdCA+ICR0ZXN0LmMgPDxFT0YKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgoraW50IG15dGVzdChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgY2hhciBidWZbMjBdOworICB2YV9saXN0IGFwOworICB2YV9zdGFydChhcCwgZm10KTsKKyAgdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXApOworICB2YV9lbmQoYXApOworICByZXR1cm4gMDsKK30KK2ludCBtYWluKCkKK3sKKyAgcmV0dXJuIChteXRlc3QoIkhlbGxvJWRcbiIsIDEpKTsKK30KK0VPRgorICBpZiB0cnkgJENDICRDRkxBR1MgLW8gJHRlc3QgJHRlc3QuYzsgdGhlbgorICAgIGVjaG8gIkNoZWNraW5nIGZvciB2c25wcmludGYoKSBpbiBzdGRpby5oLi4uIFllcy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKworICAgIGVjaG8gPj4gY29uZmlndXJlLmxvZworICAgIGNhdCA+JHRlc3QuYyA8PEVPRgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CitpbnQgbXl0ZXN0KGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICBpbnQgbjsKKyAgY2hhciBidWZbMjBdOworICB2YV9saXN0IGFwOworICB2YV9zdGFydChhcCwgZm10KTsKKyAgbiA9IHZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFwKTsKKyAgdmFfZW5kKGFwKTsKKyAgcmV0dXJuIG47Cit9CitpbnQgbWFpbigpCit7CisgIHJldHVybiAobXl0ZXN0KCJIZWxsbyVkXG4iLCAxKSk7Cit9CitFT0YKKworICAgIGlmIHRyeSAkQ0MgLWMgJENGTEFHUyAkdGVzdC5jOyB0aGVuCisgICAgICBlY2hvICJDaGVja2luZyBmb3IgcmV0dXJuIHZhbHVlIG9mIHZzbnByaW50ZigpLi4uIFllcy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgICBlbHNlCisgICAgICBDRkxBR1M9IiRDRkxBR1MgLURIQVNfdnNucHJpbnRmX3ZvaWQiCisgICAgICBTRkxBR1M9IiRTRkxBR1MgLURIQVNfdnNucHJpbnRmX3ZvaWQiCisgICAgICBlY2hvICJDaGVja2luZyBmb3IgcmV0dXJuIHZhbHVlIG9mIHZzbnByaW50ZigpLi4uIE5vLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICAgICAgZWNobyAiICBXQVJOSU5HOiBhcHBhcmVudGx5IHZzbnByaW50ZigpIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLiB6bGliIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgICAgICBlY2hvICIgIGNhbiBidWlsZCBidXQgd2lsbCBiZSBvcGVuIHRvIHBvc3NpYmxlIHN0cmluZy1mb3JtYXQgc2VjdXJpdHkiIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgICAgIGVjaG8gIiAgdnVsbmVyYWJpbGl0aWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICAgIGZpCisgIGVsc2UKKyAgICBDRkxBR1M9IiRDRkxBR1MgLUROT192c25wcmludGYiCisgICAgU0ZMQUdTPSIkU0ZMQUdTIC1ETk9fdnNucHJpbnRmIgorICAgIGVjaG8gIkNoZWNraW5nIGZvciB2c25wcmludGYoKSBpbiBzdGRpby5oLi4uIE5vLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICAgIGVjaG8gIiAgV0FSTklORzogdnNucHJpbnRmKCkgbm90IGZvdW5kLCBmYWxsaW5nIGJhY2sgdG8gdnNwcmludGYoKS4gemxpYiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICAgIGVjaG8gIiAgY2FuIGJ1aWxkIGJ1dCB3aWxsIGJlIG9wZW4gdG8gcG9zc2libGUgYnVmZmVyLW92ZXJmbG93IHNlY3VyaXR5IiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgICAgZWNobyAiICB2dWxuZXJhYmlsaXRpZXMuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisKKyAgICBlY2hvID4+IGNvbmZpZ3VyZS5sb2cKKyAgICBjYXQgPiR0ZXN0LmMgPDxFT0YKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgoraW50IG15dGVzdChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgaW50IG47CisgIGNoYXIgYnVmWzIwXTsKKyAgdmFfbGlzdCBhcDsKKyAgdmFfc3RhcnQoYXAsIGZtdCk7CisgIG4gPSB2c3ByaW50ZihidWYsIGZtdCwgYXApOworICB2YV9lbmQoYXApOworICByZXR1cm4gbjsKK30KK2ludCBtYWluKCkKK3sKKyAgcmV0dXJuIChteXRlc3QoIkhlbGxvJWRcbiIsIDEpKTsKK30KK0VPRgorCisgICAgaWYgdHJ5ICRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmM7IHRoZW4KKyAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2YgdnNwcmludGYoKS4uLiBZZXMuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgICAgZWxzZQorICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1ESEFTX3ZzcHJpbnRmX3ZvaWQiCisgICAgICBTRkxBR1M9IiRTRkxBR1MgLURIQVNfdnNwcmludGZfdm9pZCIKKyAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2YgdnNwcmludGYoKS4uLiBOby4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgICAgIGVjaG8gIiAgV0FSTklORzogYXBwYXJlbnRseSB2c3ByaW50ZigpIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLiB6bGliIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgICAgICBlY2hvICIgIGNhbiBidWlsZCBidXQgd2lsbCBiZSBvcGVuIHRvIHBvc3NpYmxlIHN0cmluZy1mb3JtYXQgc2VjdXJpdHkiIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgICAgIGVjaG8gIiAgdnVsbmVyYWJpbGl0aWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICAgIGZpCisgIGZpCitlbHNlCisgIGVjaG8gIkNoZWNraW5nIHdoZXRoZXIgdG8gdXNlIHZzW25dcHJpbnRmKCkgb3Igc1tuXXByaW50ZigpLi4uIHVzaW5nIHNbbl1wcmludGYoKS4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKworICBlY2hvID4+IGNvbmZpZ3VyZS5sb2cKKyAgY2F0ID4kdGVzdC5jIDw8RU9GCisjaW5jbHVkZSA8c3RkaW8uaD4KK2ludCBteXRlc3QoKQoreworICBjaGFyIGJ1ZlsyMF07CisgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcyIsICJmb28iKTsKKyAgcmV0dXJuIDA7Cit9CitpbnQgbWFpbigpCit7CisgIHJldHVybiAobXl0ZXN0KCkpOworfQorRU9GCisKKyAgaWYgdHJ5ICRDQyAkQ0ZMQUdTIC1vICR0ZXN0ICR0ZXN0LmM7IHRoZW4KKyAgICBlY2hvICJDaGVja2luZyBmb3Igc25wcmludGYoKSBpbiBzdGRpby5oLi4uIFllcy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKworICAgIGVjaG8gPj4gY29uZmlndXJlLmxvZworICAgIGNhdCA+JHRlc3QuYyA8PEVPRgorI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQgbXl0ZXN0KCkKK3sKKyAgY2hhciBidWZbMjBdOworICByZXR1cm4gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzIiwgImZvbyIpOworfQoraW50IG1haW4oKQoreworICByZXR1cm4gKG15dGVzdCgpKTsKK30KK0VPRgorCisgICAgaWYgdHJ5ICRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmM7IHRoZW4KKyAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2Ygc25wcmludGYoKS4uLiBZZXMuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgICAgZWxzZQorICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1ESEFTX3NucHJpbnRmX3ZvaWQiCisgICAgICBTRkxBR1M9IiRTRkxBR1MgLURIQVNfc25wcmludGZfdm9pZCIKKyAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2Ygc25wcmludGYoKS4uLiBOby4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgICAgIGVjaG8gIiAgV0FSTklORzogYXBwYXJlbnRseSBzbnByaW50ZigpIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLiB6bGliIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgICAgICBlY2hvICIgIGNhbiBidWlsZCBidXQgd2lsbCBiZSBvcGVuIHRvIHBvc3NpYmxlIHN0cmluZy1mb3JtYXQgc2VjdXJpdHkiIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgICAgIGVjaG8gIiAgdnVsbmVyYWJpbGl0aWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICAgIGZpCisgIGVsc2UKKyAgICBDRkxBR1M9IiRDRkxBR1MgLUROT19zbnByaW50ZiIKKyAgICBTRkxBR1M9IiRTRkxBR1MgLUROT19zbnByaW50ZiIKKyAgICBlY2hvICJDaGVja2luZyBmb3Igc25wcmludGYoKSBpbiBzdGRpby5oLi4uIE5vLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICAgIGVjaG8gIiAgV0FSTklORzogc25wcmludGYoKSBub3QgZm91bmQsIGZhbGxpbmcgYmFjayB0byBzcHJpbnRmKCkuIHpsaWIiIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgICBlY2hvICIgIGNhbiBidWlsZCBidXQgd2lsbCBiZSBvcGVuIHRvIHBvc3NpYmxlIGJ1ZmZlci1vdmVyZmxvdyBzZWN1cml0eSIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICAgIGVjaG8gIiAgdnVsbmVyYWJpbGl0aWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworCisgICAgZWNobyA+PiBjb25maWd1cmUubG9nCisgICAgY2F0ID4kdGVzdC5jIDw8RU9GCisjaW5jbHVkZSA8c3RkaW8uaD4KK2ludCBteXRlc3QoKQoreworICBjaGFyIGJ1ZlsyMF07CisgIHJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzIiwgImZvbyIpOworfQoraW50IG1haW4oKQoreworICByZXR1cm4gKG15dGVzdCgpKTsKK30KK0VPRgorCisgICAgaWYgdHJ5ICRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmM7IHRoZW4KKyAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2Ygc3ByaW50ZigpLi4uIFllcy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgICBlbHNlCisgICAgICBDRkxBR1M9IiRDRkxBR1MgLURIQVNfc3ByaW50Zl92b2lkIgorICAgICAgU0ZMQUdTPSIkU0ZMQUdTIC1ESEFTX3NwcmludGZfdm9pZCIKKyAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2Ygc3ByaW50ZigpLi4uIE5vLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICAgICAgZWNobyAiICBXQVJOSU5HOiBhcHBhcmVudGx5IHNwcmludGYoKSBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4gemxpYiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICAgICAgZWNobyAiICBjYW4gYnVpbGQgYnV0IHdpbGwgYmUgb3BlbiB0byBwb3NzaWJsZSBzdHJpbmctZm9ybWF0IHNlY3VyaXR5IiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgICAgICBlY2hvICIgIHZ1bG5lcmFiaWxpdGllcy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgICBmaQorICBmaQorZmkKKworIyBzZWUgaWYgd2UgY2FuIGhpZGUgemxpYiBpbnRlcm5hbCBzeW1ib2xzIHRoYXQgYXJlIGxpbmtlZCBiZXR3ZWVuIHNlcGFyYXRlIHNvdXJjZSBmaWxlcworaWYgdGVzdCAiJGdjYyIgLWVxIDE7IHRoZW4KKyAgZWNobyA+PiBjb25maWd1cmUubG9nCisgIGNhdCA+ICR0ZXN0LmMgPDxFT0YKKyNkZWZpbmUgWkxJQl9JTlRFUk5BTCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5ICgiaGlkZGVuIikpKQoraW50IFpMSUJfSU5URVJOQUwgZm9vOworaW50IG1haW4oKQoreworICByZXR1cm4gMDsKK30KK0VPRgorICBpZiB0cnlib3RoICRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmM7IHRoZW4KKyAgICBDRkxBR1M9IiRDRkxBR1MgLURIQVZFX0hJRERFTiIKKyAgICBTRkxBR1M9IiRTRkxBR1MgLURIQVZFX0hJRERFTiIKKyAgICBlY2hvICJDaGVja2luZyBmb3IgYXR0cmlidXRlKHZpc2liaWxpdHkpIHN1cHBvcnQuLi4gWWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICBlbHNlCisgICAgZWNobyAiQ2hlY2tpbmcgZm9yIGF0dHJpYnV0ZSh2aXNpYmlsaXR5KSBzdXBwb3J0Li4uIE5vLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICBmaQorZmkKKworIyBzaG93IHRoZSByZXN1bHRzIGluIHRoZSBsb2cKK2VjaG8gPj4gY29uZmlndXJlLmxvZworZWNobyBBTEwgPSAkQUxMID4+IGNvbmZpZ3VyZS5sb2cKK2VjaG8gQVIgPSAkQVIgPj4gY29uZmlndXJlLmxvZworZWNobyBBUkZMQUdTID0gJEFSRkxBR1MgPj4gY29uZmlndXJlLmxvZworZWNobyBDQyA9ICRDQyA+PiBjb25maWd1cmUubG9nCitlY2hvIENGTEFHUyA9ICRDRkxBR1MgPj4gY29uZmlndXJlLmxvZworZWNobyBDUFAgPSAkQ1BQID4+IGNvbmZpZ3VyZS5sb2cKK2VjaG8gRVhFID0gJEVYRSA+PiBjb25maWd1cmUubG9nCitlY2hvIExEQ09ORklHID0gJExEQ09ORklHID4+IGNvbmZpZ3VyZS5sb2cKK2VjaG8gTERGTEFHUyA9ICRMREZMQUdTID4+IGNvbmZpZ3VyZS5sb2cKK2VjaG8gTERTSEFSRUQgPSAkTERTSEFSRUQgPj4gY29uZmlndXJlLmxvZworZWNobyBMRFNIQVJFRExJQkMgPSAkTERTSEFSRURMSUJDID4+IGNvbmZpZ3VyZS5sb2cKK2VjaG8gT0JKQyA9ICRPQkpDID4+IGNvbmZpZ3VyZS5sb2cKK2VjaG8gUElDX09CSkMgPSAkUElDX09CSkMgPj4gY29uZmlndXJlLmxvZworZWNobyBSQU5MSUIgPSAkUkFOTElCID4+IGNvbmZpZ3VyZS5sb2cKK2VjaG8gU0ZMQUdTID0gJFNGTEFHUyA+PiBjb25maWd1cmUubG9nCitlY2hvIFNIQVJFRExJQiA9ICRTSEFSRURMSUIgPj4gY29uZmlndXJlLmxvZworZWNobyBTSEFSRURMSUJNID0gJFNIQVJFRExJQk0gPj4gY29uZmlndXJlLmxvZworZWNobyBTSEFSRURMSUJWID0gJFNIQVJFRExJQlYgPj4gY29uZmlndXJlLmxvZworZWNobyBTVEFUSUNMSUIgPSAkU1RBVElDTElCID4+IGNvbmZpZ3VyZS5sb2cKK2VjaG8gVEVTVCA9ICRURVNUID4+IGNvbmZpZ3VyZS5sb2cKK2VjaG8gVkVSID0gJFZFUiA+PiBjb25maWd1cmUubG9nCitlY2hvIFpfVTQgPSAkWl9VNCA+PiBjb25maWd1cmUubG9nCitlY2hvIGV4ZWNfcHJlZml4ID0gJGV4ZWNfcHJlZml4ID4+IGNvbmZpZ3VyZS5sb2cKK2VjaG8gaW5jbHVkZWRpciA9ICRpbmNsdWRlZGlyID4+IGNvbmZpZ3VyZS5sb2cKK2VjaG8gbGliZGlyID0gJGxpYmRpciA+PiBjb25maWd1cmUubG9nCitlY2hvIG1hbmRpciA9ICRtYW5kaXIgPj4gY29uZmlndXJlLmxvZworZWNobyBwcmVmaXggPSAkcHJlZml4ID4+IGNvbmZpZ3VyZS5sb2cKK2VjaG8gc2hhcmVkbGliZGlyID0gJHNoYXJlZGxpYmRpciA+PiBjb25maWd1cmUubG9nCitlY2hvIHVuYW1lID0gJHVuYW1lID4+IGNvbmZpZ3VyZS5sb2cKKworIyB1ZHBhdGUgTWFrZWZpbGUgd2l0aCB0aGUgY29uZmlndXJlIHJlc3VsdHMKK3NlZCA8IE1ha2VmaWxlLmluICIKKy9eQ0MgKj0vcyM9LiojPSRDQyMKKy9eQ0ZMQUdTICo9L3MjPS4qIz0kQ0ZMQUdTIworL15TRkxBR1MgKj0vcyM9LiojPSRTRkxBR1MjCisvXkxERkxBR1MgKj0vcyM9LiojPSRMREZMQUdTIworL15MRFNIQVJFRCAqPS9zIz0uKiM9JExEU0hBUkVEIworL15DUFAgKj0vcyM9LiojPSRDUFAjCisvXlNUQVRJQ0xJQiAqPS9zIz0uKiM9JFNUQVRJQ0xJQiMKKy9eU0hBUkVETElCICo9L3MjPS4qIz0kU0hBUkVETElCIworL15TSEFSRURMSUJWICo9L3MjPS4qIz0kU0hBUkVETElCViMKKy9eU0hBUkVETElCTSAqPS9zIz0uKiM9JFNIQVJFRExJQk0jCisvXkFSICo9L3MjPS4qIz0kQVIjCisvXkFSRkxBR1MgKj0vcyM9LiojPSRBUkZMQUdTIworL15SQU5MSUIgKj0vcyM9LiojPSRSQU5MSUIjCisvXkxEQ09ORklHICo9L3MjPS4qIz0kTERDT05GSUcjCisvXkxEU0hBUkVETElCQyAqPS9zIz0uKiM9JExEU0hBUkVETElCQyMKKy9eRVhFICo9L3MjPS4qIz0kRVhFIworL15wcmVmaXggKj0vcyM9LiojPSRwcmVmaXgjCisvXmV4ZWNfcHJlZml4ICo9L3MjPS4qIz0kZXhlY19wcmVmaXgjCisvXmxpYmRpciAqPS9zIz0uKiM9JGxpYmRpciMKKy9ec2hhcmVkbGliZGlyICo9L3MjPS4qIz0kc2hhcmVkbGliZGlyIworL15pbmNsdWRlZGlyICo9L3MjPS4qIz0kaW5jbHVkZWRpciMKKy9ebWFuZGlyICo9L3MjPS4qIz0kbWFuZGlyIworL15PQkpDICo9L3MjPS4qIz0gJE9CSkMjCisvXlBJQ19PQkpDICo9L3MjPS4qIz0gJFBJQ19PQkpDIworL15hbGw6ICovcyM6LiojOiAkQUxMIworL150ZXN0OiAqL3MjOi4qIzogJFRFU1QjCisiID4gTWFrZWZpbGUKKworIyBjcmVhdGUgemxpYi5wYyB3aXRoIHRoZSBjb25maWd1cmUgcmVzdWx0cworc2VkIDwgemxpYi5wYy5pbiAiCisvXkNDICo9L3MjPS4qIz0kQ0MjCisvXkNGTEFHUyAqPS9zIz0uKiM9JENGTEFHUyMKKy9eQ1BQICo9L3MjPS4qIz0kQ1BQIworL15MRFNIQVJFRCAqPS9zIz0uKiM9JExEU0hBUkVEIworL15TVEFUSUNMSUIgKj0vcyM9LiojPSRTVEFUSUNMSUIjCisvXlNIQVJFRExJQiAqPS9zIz0uKiM9JFNIQVJFRExJQiMKKy9eU0hBUkVETElCViAqPS9zIz0uKiM9JFNIQVJFRExJQlYjCisvXlNIQVJFRExJQk0gKj0vcyM9LiojPSRTSEFSRURMSUJNIworL15BUiAqPS9zIz0uKiM9JEFSIworL15BUkZMQUdTICo9L3MjPS4qIz0kQVJGTEFHUyMKKy9eUkFOTElCICo9L3MjPS4qIz0kUkFOTElCIworL15FWEUgKj0vcyM9LiojPSRFWEUjCisvXnByZWZpeCAqPS9zIz0uKiM9JHByZWZpeCMKKy9eZXhlY19wcmVmaXggKj0vcyM9LiojPSRleGVjX3ByZWZpeCMKKy9ebGliZGlyICo9L3MjPS4qIz0kbGliZGlyIworL15zaGFyZWRsaWJkaXIgKj0vcyM9LiojPSRzaGFyZWRsaWJkaXIjCisvXmluY2x1ZGVkaXIgKj0vcyM9LiojPSRpbmNsdWRlZGlyIworL15tYW5kaXIgKj0vcyM9LiojPSRtYW5kaXIjCisvXkxERkxBR1MgKj0vcyM9LiojPSRMREZMQUdTIworIiB8IHNlZCAtZSAiCitzL1xAVkVSU0lPTlxALyRWRVIvZzsKKyIgPiB6bGliLnBjCisKKyMgZG9uZQorbGVhdmUgMApkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9SRUFETUUuY29udHJpYiBiL3psaWIvc3JjL2NvbnRyaWIvUkVBRE1FLmNvbnRyaWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY2MzQ5YgotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvUkVBRE1FLmNvbnRyaWIKQEAgLTAsMCArMSw3OCBAQAorQWxsIGZpbGVzIHVuZGVyIHRoaXMgY29udHJpYiBkaXJlY3RvcnkgYXJlIFVOU1VQUE9SVEVELiBUaGVyZSB3ZXJlCitwcm92aWRlZCBieSB1c2VycyBvZiB6bGliIGFuZCB3ZXJlIG5vdCB0ZXN0ZWQgYnkgdGhlIGF1dGhvcnMgb2YgemxpYi4KK1VzZSBhdCB5b3VyIG93biByaXNrLiBQbGVhc2UgY29udGFjdCB0aGUgYXV0aG9ycyBvZiB0aGUgY29udHJpYnV0aW9ucworZm9yIGhlbHAgYWJvdXQgdGhlc2UsIG5vdCB0aGUgemxpYiBhdXRob3JzLiBUaGFua3MuCisKKworYWRhLyAgICAgICAgYnkgRG1pdHJpeSBBbmlzaW1rb3YgPGFuaXNpbWtvdkB5YWhvby5jb20+CisgICAgICAgIFN1cHBvcnQgZm9yIEFkYQorICAgICAgICBTZWUgaHR0cDovL3psaWItYWRhLnNvdXJjZWZvcmdlLm5ldC8KKworYW1kNjQvICAgICAgYnkgTWlraGFpbCBUZXRlcmluIDxtaUBBTERBTi5hbGdlYnJhLmNvbT4KKyAgICAgICAgYXNtIGNvZGUgZm9yIEFNRDY0CisgICAgICAgIFNlZSBwYXRjaCBhdCBodHRwOi8vd3d3LmZyZWVic2Qub3JnL2NnaS9xdWVyeS1wci5jZ2k/cHI9YmluLzk2MzkzCisKK2FzbTY4Ni8gICAgIGJ5IEJyaWFuIFJhaXRlciA8YnJlYWRib3hAbXVwcGV0bGFicy5jb20+CisgICAgICAgIGFzbSBjb2RlIGZvciBQZW50aXVtIGFuZCBQUHJvL1BJSSwgdXNpbmcgdGhlIEFUJlQgKEdOVSBhcykgc3ludGF4CisgICAgICAgIFNlZSBodHRwOi8vd3d3Lm11cHBldGxhYnMuY29tL35icmVhZGJveC9zb2Z0d2FyZS9hc3NlbWJseS5odG1sCisKK2JsYXN0LyAgICAgIGJ5IE1hcmsgQWRsZXIgPG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHU+CisgICAgICAgIERlY29tcHJlc3NvciBmb3Igb3V0cHV0IG9mIFBLV2FyZSBEYXRhIENvbXByZXNzaW9uIExpYnJhcnkgKERDTCkKKworZGVscGhpLyAgICAgYnkgQ29zbWluIFRydXRhIDxjb3NtaW50QGNzLnViYmNsdWoucm8+CisgICAgICAgIFN1cHBvcnQgZm9yIERlbHBoaSBhbmQgQysrIEJ1aWxkZXIKKworZG90emxpYi8gICAgYnkgSGVucmlrIFJhdm4gPGhlbnJpa0ByYXZuLmNvbT4KKyAgICAgICAgU3VwcG9ydCBmb3IgTWljcm9zb2Z0IC5OZXQgYW5kIFZpc3VhbCBDKysgLk5ldAorCitnY2NfZ3ZtYXQ2NC9ieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+CisgICAgICAgIEdDQyBWZXJzaW9uIG9mIHg4NiA2NC1iaXQgKEFNRDY0IGFuZCBJbnRlbCBFTTY0dCkgY29kZSBmb3IgeDY0CisgICAgICAgIGFzc2VtYmxlciB0byByZXBsYWNlIGxvbmdlc3RfbWF0Y2goKSBhbmQgaW5mbGF0ZV9mYXN0KCkKKworaW5mYmFjazkvICAgYnkgTWFyayBBZGxlciA8bWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdT4KKyAgICAgICAgVW5zdXBwb3J0ZWQgZGlmZnMgdG8gaW5mYmFjayB0byBkZWNvZGUgdGhlIGRlZmxhdGU2NCBmb3JtYXQKKworaW5mbGF0ZTg2LyAgYnkgQ2hyaXMgQW5kZXJzb24gPGNocmlzdG9wQGNoYXJtLm5ldD4KKyAgICAgICAgVHVuZWQgeDg2IGdjYyBhc20gY29kZSB0byByZXBsYWNlIGluZmxhdGVfZmFzdCgpCisKK2lvc3RyZWFtLyAgIGJ5IEtldmluIFJ1bGFuZCA8a2V2aW5Acm9kaW4ud3VzdGwuZWR1PgorICAgICAgICBBIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UgdG8gdGhlIHpsaWIgZ3oqIGZ1bmN0aW9ucworCitpb3N0cmVhbTIvICBieSBUeWdlIEz4dnNldCA8VHlnZS5Mb3ZzZXRAY21yLm5vPgorICAgICAgICBBbm90aGVyIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UKKworaW9zdHJlYW0zLyAgYnkgTHVkd2lnIFNjaHdhcmR0IDxzY2h3YXJkdEBzdW4uYWMuemE+CisgICAgICAgICAgICBhbmQgS2V2aW4gUnVsYW5kIDxrZXZpbkByb2Rpbi53dXN0bC5lZHU+CisgICAgICAgIFlldCBhbm90aGVyIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UKKworbWFzbXg2NC8gICAgYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPgorICAgICAgICB4ODYgNjQtYml0IChBTUQ2NCBhbmQgSW50ZWwgRU02NHQpIGNvZGUgZm9yIHg2NCBhc3NlbWJsZXIgdG8KKyAgICAgICAgcmVwbGFjZSBsb25nZXN0X21hdGNoKCkgYW5kIGluZmxhdGVfZmFzdCgpLCAgYWxzbyBtYXNtIHg4NgorICAgICAgICA2NC1iaXRzIHRyYW5zbGF0aW9uIG9mIENocmlzIEFuZGVyc29uIGluZmxhdGVfZmFzdCgpCisKK21hc214ODYvICAgIGJ5IEdpbGxlcyBWb2xsYW50IDxpbmZvQHdpbmltYWdlLmNvbT4KKyAgICAgICAgeDg2IGFzbSBjb2RlIHRvIHJlcGxhY2UgbG9uZ2VzdF9tYXRjaCgpIGFuZCBpbmZsYXRlX2Zhc3QoKSwKKyAgICAgICAgZm9yIFZpc3VhbCBDKysgYW5kIE1BU00gKDMyIGJpdHMpLgorICAgICAgICBCYXNlZCBvbiBCcmlhbiBSYWl0ZXIgKGFzbTY4NikgYW5kIENocmlzIEFuZGVyc29uIChpbmZsYXRlODYpCisKK21pbml6aXAvICAgIGJ5IEdpbGxlcyBWb2xsYW50IDxpbmZvQHdpbmltYWdlLmNvbT4KKyAgICAgICAgTWluaSB6aXAgYW5kIHVuemlwIGJhc2VkIG9uIHpsaWIKKyAgICAgICAgSW5jbHVkZXMgWmlwNjQgc3VwcG9ydCBieSBNYXRoaWFzIFN2ZW5zc29uIDxtYXRoaWFzQHJlc3VsdDQyLmNvbT4KKyAgICAgICAgU2VlIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvdW56aXAuaHRtbAorCitwYXNjYWwvICAgICBieSBCb2IgRGVsbGFjYSA8Ym9iZGxAeHRyYS5jby5uej4gZXQgYWwuCisgICAgICAgIFN1cHBvcnQgZm9yIFBhc2NhbAorCitwdWZmLyAgICAgICBieSBNYXJrIEFkbGVyIDxtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1PgorICAgICAgICBTbWFsbCwgbG93IG1lbW9yeSB1c2FnZSBpbmZsYXRlLiAgQWxzbyBzZXJ2ZXMgdG8gcHJvdmlkZSBhbgorICAgICAgICB1bmFtYmlndW91cyBkZXNjcmlwdGlvbiBvZiB0aGUgZGVmbGF0ZSBmb3JtYXQuCisKK3Rlc3R6bGliLyAgIGJ5IEdpbGxlcyBWb2xsYW50IDxpbmZvQHdpbmltYWdlLmNvbT4KKyAgICAgICAgRXhhbXBsZSBvZiB0aGUgdXNlIG9mIHpsaWIKKwordW50Z3ovICAgICAgYnkgUGVkcm8gQS4gQXJhbmRhIEd1dGllcnJleiA8cGFhZ0B0aWQuZXM+CisgICAgICAgIEEgdmVyeSBzaW1wbGUgdGFyLmd6IGZpbGUgZXh0cmFjdG9yIHVzaW5nIHpsaWIKKwordnN0dWRpby8gICAgYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPgorICAgICAgICBCdWlsZGluZyBhIG1pbml6aXAtZW5oYW5jZWQgemxpYiB3aXRoIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvCisgICAgICAgIEluY2x1ZGVzIHZjMTEgZnJvbSBrcmV1emVya3JpZWcgYW5kIHZjMTIgZnJvbSBkYXZpc3B1aApkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9hZGEvYnVmZmVyX2RlbW8uYWRiIGIvemxpYi9zcmMvY29udHJpYi9hZGEvYnVmZmVyX2RlbW8uYWRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2Yjg2MzgKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL2FkYS9idWZmZXJfZGVtby5hZGIKQEAgLTAsMCArMSwxMDYgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tICBaTGliIGZvciBBZGEgdGhpY2sgYmluZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBEbWl0cml5IEFuaXNpbWtvdiAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICBPcGVuIHNvdXJjZSBsaWNlbnNlIGluZm9ybWF0aW9uIGlzIGluIHRoZSB6bGliLmFkcyBmaWxlLiAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tCistLSAgJElkOiBidWZmZXJfZGVtby5hZGIsdiAxLjMgMjAwNC8wOS8wNiAwNjo1NTozNSB2YWd1bCBFeHAgJAorCistLSAgVGhpcyBkZW1vIHByb2dyYW0gcHJvdmlkZWQgYnkgRHIgU3RldmUgU2FuZ3dpbmUgPHNqc0Blc3NleC5hYy51az4KKy0tCistLSAgRGVtb25zdHJhdGlvbiBvZiBhIHByb2JsZW0gd2l0aCBabGliLUFkYSAoYWxyZWFkeSBmaXhlZCkgd2hlbiBhIGJ1ZmZlcgorLS0gIG9mIGV4YWN0bHkgdGhlIGNvcnJlY3Qgc2l6ZSBpcyB1c2VkIGZvciBkZWNvbXByZXNzZWQgZGF0YSwgYW5kIHRoZSBsYXN0CistLSAgZmV3IGJ5dGVzIHBhc3NlZCBpbiB0byBabGliIGFyZSBjaGVja3N1bSBieXRlcy4KKworLS0gIFRoaXMgcHJvZ3JhbSBjb21wcmVzc2VzIGEgc3RyaW5nIG9mIHRleHQsIGFuZCB0aGVuIGRlY29tcHJlc3NlcyB0aGUKKy0tICBjb21wcmVzc2VkIHRleHQgaW50byBhIGJ1ZmZlciBvZiB0aGUgc2FtZSBzaXplIGFzIHRoZSBvcmlnaW5hbCB0ZXh0LgorCit3aXRoIEFkYS5TdHJlYW1zOyB1c2UgQWRhLlN0cmVhbXM7Cit3aXRoIEFkYS5UZXh0X0lPOworCit3aXRoIFpMaWI7IHVzZSBaTGliOworCitwcm9jZWR1cmUgQnVmZmVyX0RlbW8gaXMKKyAgIEVPTCAgOiBDaGFyYWN0ZXIgcmVuYW1lcyBBU0NJSS5MRjsKKyAgIFRleHQgOiBjb25zdGFudCBTdHJpbmcKKyAgICAgOj0gIkZvdXIgc2NvcmUgYW5kIHNldmVuIHllYXJzIGFnbyBvdXIgZmF0aGVycyBicm91Z2h0IGZvcnRoLCIgJiBFT0wgJgorICAgICAgICAidXBvbiB0aGlzIGNvbnRpbmVudCwgYSBuZXcgbmF0aW9uLCBjb25jZWl2ZWQgaW4gbGliZXJ0eSwiICYgRU9MICYKKyAgICAgICAgImFuZCBkZWRpY2F0ZWQgdG8gdGhlIHByb3Bvc2l0aW9uIHRoYXQgYGFsbCBtZW4gYXJlIGNyZWF0ZWQgZXF1YWwnLiI7CisKKyAgIFNvdXJjZSA6IFN0cmVhbV9FbGVtZW50X0FycmF5ICgxIC4uIFRleHQnTGVuZ3RoKTsKKyAgIGZvciBTb3VyY2UnQWRkcmVzcyB1c2UgVGV4dCdBZGRyZXNzOworCitiZWdpbgorICAgQWRhLlRleHRfSU8uUHV0IChUZXh0KTsKKyAgIEFkYS5UZXh0X0lPLk5ld19MaW5lOworICAgQWRhLlRleHRfSU8uUHV0X0xpbmUKKyAgICAgKCJVbmNvbXByZXNzZWQgc2l6ZSA6ICIgJiBQb3NpdGl2ZSdJbWFnZSAoVGV4dCdMZW5ndGgpICYgIiBieXRlcyIpOworCisgICBkZWNsYXJlCisgICAgICBDb21wcmVzc2VkX0RhdGEgOiBTdHJlYW1fRWxlbWVudF9BcnJheSAoMSAuLiBUZXh0J0xlbmd0aCk7CisgICAgICBMICAgICAgICAgICAgICAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICBiZWdpbgorICAgICAgQ29tcHJlc3MgOiBkZWNsYXJlCisgICAgICAgICBDb21wcmVzc29yIDogRmlsdGVyX1R5cGU7CisgICAgICAgICBJIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworICAgICAgYmVnaW4KKyAgICAgICAgIERlZmxhdGVfSW5pdCAoQ29tcHJlc3Nvcik7CisKKyAgICAgICAgIC0tICBDb21wcmVzcyB0aGUgd2hvbGUgb2YgVCBhdCBvbmNlLgorCisgICAgICAgICBUcmFuc2xhdGUgKENvbXByZXNzb3IsIFNvdXJjZSwgSSwgQ29tcHJlc3NlZF9EYXRhLCBMLCBGaW5pc2gpOworICAgICAgICAgcHJhZ21hIEFzc2VydCAoSSA9IFNvdXJjZSdMYXN0KTsKKworICAgICAgICAgQ2xvc2UgKENvbXByZXNzb3IpOworCisgICAgICAgICBBZGEuVGV4dF9JTy5QdXRfTGluZQorICAgICAgICAgICAoIkNvbXByZXNzZWQgc2l6ZSA6ICAgIgorICAgICAgICAgICAgJiBTdHJlYW1fRWxlbWVudF9PZmZzZXQnSW1hZ2UgKEwpICYgIiBieXRlcyIpOworICAgICAgZW5kIENvbXByZXNzOworCisgICAgICAtLSAgTm93IHdlIGRlY29tcHJlc3MgdGhlIGRhdGEsIHBhc3Npbmcgc2hvcnQgYmxvY2tzIG9mIGRhdGEgdG8gWmxpYgorICAgICAgLS0gIChiZWNhdXNlIHRoaXMgZGVtb25zdHJhdGVzIHRoZSBwcm9ibGVtIC0gdGhlIGxhc3QgYmxvY2sgcGFzc2VkIHdpbGwKKyAgICAgIC0tICBjb250YWluIGNoZWNrc3VtIGluZm9ybWF0aW9uIGFuZCB0aGVyZSB3aWxsIGJlIG5vIG91dHB1dCwgb25seSBhCisgICAgICAtLSAgY2hlY2sgaW5zaWRlIFpsaWIgdGhhdCB0aGUgY2hlY2tzdW0gaXMgY29ycmVjdCkuCisKKyAgICAgIERlY29tcHJlc3MgOiBkZWNsYXJlCisgICAgICAgICBEZWNvbXByZXNzb3IgOiBGaWx0ZXJfVHlwZTsKKworICAgICAgICAgVW5jb21wcmVzc2VkX0RhdGEgOiBTdHJlYW1fRWxlbWVudF9BcnJheSAoMSAuLiBUZXh0J0xlbmd0aCk7CisKKyAgICAgICAgIEJsb2NrX1NpemUgOiBjb25zdGFudCA6PSA0OworICAgICAgICAgLS0gIFRoaXMgbWFrZXMgc3VyZSB0aGF0IHRoZSBsYXN0IGJsb2NrIGNvbnRhaW5zCisgICAgICAgICAtLSAgb25seSBBZGxlciBjaGVja3N1bSBkYXRhLgorCisgICAgICAgICBQIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0IDo9IENvbXByZXNzZWRfRGF0YSdGaXJzdCAtIDE7CisgICAgICAgICBPIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworICAgICAgYmVnaW4KKyAgICAgICAgIEluZmxhdGVfSW5pdCAoRGVjb21wcmVzc29yKTsKKworICAgICAgICAgbG9vcAorICAgICAgICAgICAgVHJhbnNsYXRlCisgICAgICAgICAgICAgIChEZWNvbXByZXNzb3IsCisgICAgICAgICAgICAgICBDb21wcmVzc2VkX0RhdGEKKyAgICAgICAgICAgICAgICAgKFAgKyAxIC4uIFN0cmVhbV9FbGVtZW50X09mZnNldCdNaW4gKFAgKyBCbG9ja19TaXplLCBMKSksCisgICAgICAgICAgICAgICBQLAorICAgICAgICAgICAgICAgVW5jb21wcmVzc2VkX0RhdGEKKyAgICAgICAgICAgICAgICAgKFRvdGFsX091dCAoRGVjb21wcmVzc29yKSArIDEgLi4gVW5jb21wcmVzc2VkX0RhdGEnTGFzdCksCisgICAgICAgICAgICAgICBPLAorICAgICAgICAgICAgICAgTm9fRmx1c2gpOworCisgICAgICAgICAgICAgICBBZGEuVGV4dF9JTy5QdXRfTGluZQorICAgICAgICAgICAgICAgICAoIlRvdGFsIGluIDogIiAmIENvdW50J0ltYWdlIChUb3RhbF9JbiAoRGVjb21wcmVzc29yKSkgJgorICAgICAgICAgICAgICAgICAgIiwgb3V0IDogIiAmIENvdW50J0ltYWdlIChUb3RhbF9PdXQgKERlY29tcHJlc3NvcikpKTsKKworICAgICAgICAgICAgICAgZXhpdCB3aGVuIFAgPSBMOworICAgICAgICAgZW5kIGxvb3A7CisKKyAgICAgICAgIEFkYS5UZXh0X0lPLk5ld19MaW5lOworICAgICAgICAgQWRhLlRleHRfSU8uUHV0X0xpbmUKKyAgICAgICAgICAgKCJEZWNvbXByZXNzZWQgdGV4dCBtYXRjaGVzIG9yaWdpbmFsIHRleHQgOiAiCisgICAgICAgICAgICAgJiBCb29sZWFuJ0ltYWdlIChVbmNvbXByZXNzZWRfRGF0YSA9IFNvdXJjZSkpOworICAgICAgZW5kIERlY29tcHJlc3M7CisgICBlbmQ7CitlbmQgQnVmZmVyX0RlbW87CmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL2FkYS9tdGVzdC5hZGIgYi96bGliL3NyYy9jb250cmliL2FkYS9tdGVzdC5hZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRkZmQwOAotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvYWRhL210ZXN0LmFkYgpAQCAtMCwwICsxLDE1NiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gIFpMaWIgZm9yIEFkYSB0aGljayBiaW5kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIERtaXRyaXkgQW5pc2lta292ICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gIE9wZW4gc291cmNlIGxpY2Vuc2UgaW5mb3JtYXRpb24gaXMgaW4gdGhlIHpsaWIuYWRzIGZpbGUuICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gIENvbnRpbnVvdXMgdGVzdCBmb3IgWkxpYiBtdWx0aXRocmVhZGluZy4gSWYgdGhlIHRlc3Qgd291bGQgZmFpbAorLS0gIHdlIHNob3VsZCBwcm92aWRlIHRocmVhZCBzYWZlIGFsbG9jYXRpb24gcm91dGluZXMgZm9yIHRoZSBaX1N0cmVhbS4KKy0tCistLSAgJElkOiBtdGVzdC5hZGIsdiAxLjQgMjAwNC8wNy8yMyAwNzo0OTo1NCB2YWd1bCBFeHAgJAorCit3aXRoIFpMaWI7Cit3aXRoIEFkYS5TdHJlYW1zOword2l0aCBBZGEuTnVtZXJpY3MuRGlzY3JldGVfUmFuZG9tOword2l0aCBBZGEuVGV4dF9JTzsKK3dpdGggQWRhLkV4Y2VwdGlvbnM7Cit3aXRoIEFkYS5UYXNrX0lkZW50aWZpY2F0aW9uOworCitwcm9jZWR1cmUgTVRlc3QgaXMKKyAgIHVzZSBBZGEuU3RyZWFtczsKKyAgIHVzZSBaTGliOworCisgICBTdG9wIDogQm9vbGVhbiA6PSBGYWxzZTsKKworICAgcHJhZ21hIEF0b21pYyAoU3RvcCk7CisKKyAgIHN1YnR5cGUgVmlzaWJsZV9TeW1ib2xzIGlzIFN0cmVhbV9FbGVtZW50IHJhbmdlIDE2IzIwIyAuLiAxNiM3RSM7CisKKyAgIHBhY2thZ2UgUmFuZG9tX0VsZW1lbnRzIGlzCisgICAgICBuZXcgQWRhLk51bWVyaWNzLkRpc2NyZXRlX1JhbmRvbSAoVmlzaWJsZV9TeW1ib2xzKTsKKworICAgdGFzayB0eXBlIFRlc3RfVGFzazsKKworICAgdGFzayBib2R5IFRlc3RfVGFzayBpcworICAgICAgQnVmZmVyIDogU3RyZWFtX0VsZW1lbnRfQXJyYXkgKDEgLi4gMTAwXzAwMCk7CisgICAgICBHZW4gOiBSYW5kb21fRWxlbWVudHMuR2VuZXJhdG9yOworCisgICAgICBCdWZmZXJfRmlyc3QgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworICAgICAgQ29tcGFyZV9GaXJzdCA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKKworICAgICAgRGVmbGF0ZSA6IEZpbHRlcl9UeXBlOworICAgICAgSW5mbGF0ZSA6IEZpbHRlcl9UeXBlOworCisgICAgICBwcm9jZWR1cmUgRnVydGhlciAoSXRlbSA6IGluIFN0cmVhbV9FbGVtZW50X0FycmF5KTsKKworICAgICAgcHJvY2VkdXJlIFJlYWRfQnVmZmVyCisgICAgICAgIChJdGVtIDogb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OworICAgICAgICAgTGFzdCA6IG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQpOworCisgICAgICAtLS0tLS0tLS0tLS0tCisgICAgICAtLSBGdXJ0aGVyIC0tCisgICAgICAtLS0tLS0tLS0tLS0tCisKKyAgICAgIHByb2NlZHVyZSBGdXJ0aGVyIChJdGVtIDogaW4gU3RyZWFtX0VsZW1lbnRfQXJyYXkpIGlzCisKKyAgICAgICAgIHByb2NlZHVyZSBDb21wYXJlIChJdGVtIDogaW4gU3RyZWFtX0VsZW1lbnRfQXJyYXkpOworCisgICAgICAgICAtLS0tLS0tLS0tLS0tCisgICAgICAgICAtLSBDb21wYXJlIC0tCisgICAgICAgICAtLS0tLS0tLS0tLS0tCisKKyAgICAgICAgIHByb2NlZHVyZSBDb21wYXJlIChJdGVtIDogaW4gU3RyZWFtX0VsZW1lbnRfQXJyYXkpIGlzCisgICAgICAgICAgICBOZXh0X0ZpcnN0IDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0IDo9IENvbXBhcmVfRmlyc3QgKyBJdGVtJ0xlbmd0aDsKKyAgICAgICAgIGJlZ2luCisgICAgICAgICAgICBpZiBCdWZmZXIgKENvbXBhcmVfRmlyc3QgLi4gTmV4dF9GaXJzdCAtIDEpIC89IEl0ZW0gdGhlbgorICAgICAgICAgICAgICAgcmFpc2UgUHJvZ3JhbV9FcnJvcjsKKyAgICAgICAgICAgIGVuZCBpZjsKKworICAgICAgICAgICAgQ29tcGFyZV9GaXJzdCA6PSBOZXh0X0ZpcnN0OworICAgICAgICAgZW5kIENvbXBhcmU7CisKKyAgICAgICAgIHByb2NlZHVyZSBDb21wYXJlX1dyaXRlIGlzIG5ldyBaTGliLldyaXRlIChXcml0ZSA9PiBDb21wYXJlKTsKKyAgICAgIGJlZ2luCisgICAgICAgICBDb21wYXJlX1dyaXRlIChJbmZsYXRlLCBJdGVtLCBOb19GbHVzaCk7CisgICAgICBlbmQgRnVydGhlcjsKKworICAgICAgLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIC0tIFJlYWRfQnVmZmVyIC0tCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICBwcm9jZWR1cmUgUmVhZF9CdWZmZXIKKyAgICAgICAgKEl0ZW0gOiBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7CisgICAgICAgICBMYXN0IDogb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldCkKKyAgICAgIGlzCisgICAgICAgICBCdWZmX0RpZmYgICA6IFN0cmVhbV9FbGVtZW50X09mZnNldCA6PSBCdWZmZXInTGFzdCAtIEJ1ZmZlcl9GaXJzdDsKKyAgICAgICAgIE5leHRfRmlyc3QgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICAgICBiZWdpbgorICAgICAgICAgaWYgSXRlbSdMZW5ndGggPD0gQnVmZl9EaWZmIHRoZW4KKyAgICAgICAgICAgIExhc3QgOj0gSXRlbSdMYXN0OworCisgICAgICAgICAgICBOZXh0X0ZpcnN0IDo9IEJ1ZmZlcl9GaXJzdCArIEl0ZW0nTGVuZ3RoOworCisgICAgICAgICAgICBJdGVtIDo9IEJ1ZmZlciAoQnVmZmVyX0ZpcnN0IC4uIE5leHRfRmlyc3QgLSAxKTsKKworICAgICAgICAgICAgQnVmZmVyX0ZpcnN0IDo9IE5leHRfRmlyc3Q7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBMYXN0IDo9IEl0ZW0nRmlyc3QgKyBCdWZmX0RpZmY7CisgICAgICAgICAgICBJdGVtIChJdGVtJ0ZpcnN0IC4uIExhc3QpIDo9IEJ1ZmZlciAoQnVmZmVyX0ZpcnN0IC4uIEJ1ZmZlcidMYXN0KTsKKyAgICAgICAgICAgIEJ1ZmZlcl9GaXJzdCA6PSBCdWZmZXInTGFzdCArIDE7CisgICAgICAgICBlbmQgaWY7CisgICAgICBlbmQgUmVhZF9CdWZmZXI7CisKKyAgICAgIHByb2NlZHVyZSBUcmFuc2xhdGUgaXMgbmV3IEdlbmVyaWNfVHJhbnNsYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEYXRhX0luICA9PiBSZWFkX0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFfT3V0ID0+IEZ1cnRoZXIpOworCisgICBiZWdpbgorICAgICAgUmFuZG9tX0VsZW1lbnRzLlJlc2V0IChHZW4pOworCisgICAgICBCdWZmZXIgOj0gKG90aGVycyA9PiAyMCk7CisKKyAgICAgIE1haW4gOiBsb29wCisgICAgICAgICBmb3IgSiBpbiBCdWZmZXInUmFuZ2UgbG9vcAorICAgICAgICAgICAgQnVmZmVyIChKKSA6PSBSYW5kb21fRWxlbWVudHMuUmFuZG9tIChHZW4pOworCisgICAgICAgICAgICBEZWZsYXRlX0luaXQgKERlZmxhdGUpOworICAgICAgICAgICAgSW5mbGF0ZV9Jbml0IChJbmZsYXRlKTsKKworICAgICAgICAgICAgQnVmZmVyX0ZpcnN0ICA6PSBCdWZmZXInRmlyc3Q7CisgICAgICAgICAgICBDb21wYXJlX0ZpcnN0IDo9IEJ1ZmZlcidGaXJzdDsKKworICAgICAgICAgICAgVHJhbnNsYXRlIChEZWZsYXRlKTsKKworICAgICAgICAgICAgaWYgQ29tcGFyZV9GaXJzdCAvPSBCdWZmZXInTGFzdCArIDEgdGhlbgorICAgICAgICAgICAgICAgcmFpc2UgUHJvZ3JhbV9FcnJvcjsKKyAgICAgICAgICAgIGVuZCBpZjsKKworICAgICAgICAgICAgQWRhLlRleHRfSU8uUHV0X0xpbmUKKyAgICAgICAgICAgICAgKEFkYS5UYXNrX0lkZW50aWZpY2F0aW9uLkltYWdlCisgICAgICAgICAgICAgICAgIChBZGEuVGFza19JZGVudGlmaWNhdGlvbi5DdXJyZW50X1Rhc2spCisgICAgICAgICAgICAgICAmIFN0cmVhbV9FbGVtZW50X09mZnNldCdJbWFnZSAoSikKKyAgICAgICAgICAgICAgICYgWkxpYi5Db3VudCdJbWFnZSAoVG90YWxfT3V0IChEZWZsYXRlKSkpOworCisgICAgICAgICAgICBDbG9zZSAoRGVmbGF0ZSk7CisgICAgICAgICAgICBDbG9zZSAoSW5mbGF0ZSk7CisKKyAgICAgICAgICAgIGV4aXQgTWFpbiB3aGVuIFN0b3A7CisgICAgICAgICBlbmQgbG9vcDsKKyAgICAgIGVuZCBsb29wIE1haW47CisgICBleGNlcHRpb24KKyAgICAgIHdoZW4gRSA6IG90aGVycyA9PgorICAgICAgICAgQWRhLlRleHRfSU8uUHV0X0xpbmUgKEFkYS5FeGNlcHRpb25zLkV4Y2VwdGlvbl9JbmZvcm1hdGlvbiAoRSkpOworICAgICAgICAgU3RvcCA6PSBUcnVlOworICAgZW5kIFRlc3RfVGFzazsKKworICAgVGVzdCA6IGFycmF5ICgxIC4uIDQpIG9mIFRlc3RfVGFzazsKKworICAgcHJhZ21hIFVucmVmZXJlbmNlZCAoVGVzdCk7CisKKyAgIER1bW15IDogQ2hhcmFjdGVyOworCitiZWdpbgorICAgQWRhLlRleHRfSU8uR2V0X0ltbWVkaWF0ZSAoRHVtbXkpOworICAgU3RvcCA6PSBUcnVlOworZW5kIE1UZXN0OwpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9hZGEvcmVhZC5hZGIgYi96bGliL3NyYy9jb250cmliL2FkYS9yZWFkLmFkYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjJlZmJmCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9hZGEvcmVhZC5hZGIKQEAgLTAsMCArMSwxNTYgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tICBaTGliIGZvciBBZGEgdGhpY2sgYmluZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBEbWl0cml5IEFuaXNpbWtvdiAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICBPcGVuIHNvdXJjZSBsaWNlbnNlIGluZm9ybWF0aW9uIGlzIGluIHRoZSB6bGliLmFkcyBmaWxlLiAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0gICRJZDogcmVhZC5hZGIsdiAxLjggMjAwNC8wNS8zMSAxMDo1Mzo0MCB2YWd1bCBFeHAgJAorCistLSAgVGVzdC9kZW1vIHByb2dyYW0gZm9yIHRoZSBnZW5lcmljIHJlYWQgaW50ZXJmYWNlLgorCit3aXRoIEFkYS5OdW1lcmljcy5EaXNjcmV0ZV9SYW5kb207Cit3aXRoIEFkYS5TdHJlYW1zOword2l0aCBBZGEuVGV4dF9JTzsKKword2l0aCBaTGliOworCitwcm9jZWR1cmUgUmVhZCBpcworCisgICB1c2UgQWRhLlN0cmVhbXM7CisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0gIFRlc3QgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIC0tCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgRmlsZV9TaXplICAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQgOj0gMTAwXzAwMDsKKworICAgQ29udGludW91cyAgOiBjb25zdGFudCBCb29sZWFuICAgICAgICAgIDo9IEZhbHNlOworICAgLS0gIElmIHRoaXMgY29uc3RhbnQgaXMgVHJ1ZSwgdGhlIHRlc3Qgd291bGQgYmUgcmVwZWF0ZWQgYWdhaW4gYW5kIGFnYWluLAorICAgLS0gIHdpdGggaW5jcmVtZW50IEZpbGVfU2l6ZSBmb3IgZXZlcnkgaXRlcmF0aW9uLgorCisgICBIZWFkZXIgICAgICA6IGNvbnN0YW50IFpMaWIuSGVhZGVyX1R5cGUgOj0gWkxpYi5EZWZhdWx0OworICAgLS0gIERvIG5vdCB1c2UgSGVhZGVyIG90aGVyIHRoYW4gRGVmYXVsdCBpbiBaTGliIHZlcnNpb25zIDEuMS40IGFuZCBvbGRlci4KKworICAgSW5pdF9SYW5kb20gOiBjb25zdGFudCA6PSA4OworICAgLS0gIFdlIGFyZSB1c2luZyB0aGUgc2FtZSByYW5kb20gc2VxdWVuY2UsIGluIGNhc2Ugb2Ygd2UgY2F0Y2ggYnVnLAorICAgLS0gIHNvIHdlIHdvdWxkIGJlIGFibGUgdG8gcmVwcm9kdWNlIGl0LgorCisgICAtLSBFbmQgLS0KKworICAgUGFja19TaXplIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworICAgT2Zmc2V0ICAgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworCisgICBGaWx0ZXIgICAgIDogWkxpYi5GaWx0ZXJfVHlwZTsKKworICAgc3VidHlwZSBWaXNpYmxlX1N5bWJvbHMKKyAgICAgIGlzIFN0cmVhbV9FbGVtZW50IHJhbmdlIDE2IzIwIyAuLiAxNiM3RSM7CisKKyAgIHBhY2thZ2UgUmFuZG9tX0VsZW1lbnRzIGlzIG5ldworICAgICAgQWRhLk51bWVyaWNzLkRpc2NyZXRlX1JhbmRvbSAoVmlzaWJsZV9TeW1ib2xzKTsKKworICAgR2VuIDogUmFuZG9tX0VsZW1lbnRzLkdlbmVyYXRvcjsKKyAgIFBlcmlvZCAgOiBjb25zdGFudCBTdHJlYW1fRWxlbWVudF9PZmZzZXQgOj0gMjAwOworICAgLS0gIFBlcmlvZCBjb25zdGFudCB2YXJpYWJsZSBmb3IgcmFuZG9tIGdlbmVyYXRvciBub3QgdG8gYmUgdmVyeSByYW5kb20uCisgICAtLSAgQmlnZ2VyIHBlcmlvZCwgaGFyZGVyIHJhbmRvbS4KKworICAgUmVhZF9CdWZmZXIgOiBTdHJlYW1fRWxlbWVudF9BcnJheSAoMSAuLiAyMDQ4KTsKKyAgIFJlYWRfRmlyc3QgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworICAgUmVhZF9MYXN0ICAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisKKyAgIHByb2NlZHVyZSBSZXNldDsKKworICAgcHJvY2VkdXJlIFJlYWQKKyAgICAgKEl0ZW0gOiBvdXQgU3RyZWFtX0VsZW1lbnRfQXJyYXk7CisgICAgICBMYXN0IDogb3V0IFN0cmVhbV9FbGVtZW50X09mZnNldCk7CisgICAtLSAgdGhpcyBwcm9jZWR1cmUgaXMgZm9yIGdlbmVyaWMgaW5zdGFudGlhdGlvbiBvZgorICAgLS0gIFpMaWIuUmVhZAorICAgLS0gIHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBGaWxlX0luLgorCisgICBwcm9jZWR1cmUgUmVhZCBpcyBuZXcgWkxpYi5SZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoUmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkX0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN0X0ZpcnN0ID0+IFJlYWRfRmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdF9MYXN0ICA9PiBSZWFkX0xhc3QpOworCisgICAtLS0tLS0tLS0tCisgICAtLSBSZWFkIC0tCisgICAtLS0tLS0tLS0tCisKKyAgIHByb2NlZHVyZSBSZWFkCisgICAgIChJdGVtIDogb3V0IFN0cmVhbV9FbGVtZW50X0FycmF5OworICAgICAgTGFzdCA6IG91dCBTdHJlYW1fRWxlbWVudF9PZmZzZXQpIGlzCisgICBiZWdpbgorICAgICAgTGFzdCA6PSBTdHJlYW1fRWxlbWVudF9PZmZzZXQnTWluCisgICAgICAgICAgICAgICAoSXRlbSdMYXN0LAorICAgICAgICAgICAgICAgIEl0ZW0nRmlyc3QgKyBGaWxlX1NpemUgLSBPZmZzZXQpOworCisgICAgICBmb3IgSiBpbiBJdGVtJ0ZpcnN0IC4uIExhc3QgbG9vcAorICAgICAgICAgaWYgSiA8IEl0ZW0nRmlyc3QgKyBQZXJpb2QgdGhlbgorICAgICAgICAgICAgSXRlbSAoSikgOj0gUmFuZG9tX0VsZW1lbnRzLlJhbmRvbSAoR2VuKTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEl0ZW0gKEopIDo9IEl0ZW0gKEogLSBQZXJpb2QpOworICAgICAgICAgZW5kIGlmOworCisgICAgICAgICBPZmZzZXQgICA6PSBPZmZzZXQgKyAxOworICAgICAgZW5kIGxvb3A7CisgICBlbmQgUmVhZDsKKworICAgLS0tLS0tLS0tLS0KKyAgIC0tIFJlc2V0IC0tCisgICAtLS0tLS0tLS0tLQorCisgICBwcm9jZWR1cmUgUmVzZXQgaXMKKyAgIGJlZ2luCisgICAgICBSYW5kb21fRWxlbWVudHMuUmVzZXQgKEdlbiwgSW5pdF9SYW5kb20pOworICAgICAgUGFja19TaXplIDo9IDA7CisgICAgICBPZmZzZXQgOj0gMTsKKyAgICAgIFJlYWRfRmlyc3QgOj0gUmVhZF9CdWZmZXInTGFzdCArIDE7CisgICAgICBSZWFkX0xhc3QgIDo9IFJlYWRfQnVmZmVyJ0xhc3Q7CisgICBlbmQgUmVzZXQ7CisKK2JlZ2luCisgICBBZGEuVGV4dF9JTy5QdXRfTGluZSAoIlpMaWIgIiAmIFpMaWIuVmVyc2lvbik7CisKKyAgIGxvb3AKKyAgICAgIGZvciBMZXZlbCBpbiBaTGliLkNvbXByZXNzaW9uX0xldmVsJ1JhbmdlIGxvb3AKKworICAgICAgICAgQWRhLlRleHRfSU8uUHV0ICgiTGV2ZWwgPSIKKyAgICAgICAgICAgICYgWkxpYi5Db21wcmVzc2lvbl9MZXZlbCdJbWFnZSAoTGV2ZWwpKTsKKworICAgICAgICAgLS0gIERlZmxhdGUgdXNpbmcgZ2VuZXJpYyBpbnN0YW50aWF0aW9uLgorCisgICAgICAgICBaTGliLkRlZmxhdGVfSW5pdAorICAgICAgICAgICAgICAgKEZpbHRlciwKKyAgICAgICAgICAgICAgICBMZXZlbCwKKyAgICAgICAgICAgICAgICBIZWFkZXIgPT4gSGVhZGVyKTsKKworICAgICAgICAgUmVzZXQ7CisKKyAgICAgICAgIEFkYS5UZXh0X0lPLlB1dAorICAgICAgICAgICAoU3RyZWFtX0VsZW1lbnRfT2Zmc2V0J0ltYWdlIChGaWxlX1NpemUpICYgIiAtPiIpOworCisgICAgICAgICBsb29wCisgICAgICAgICAgICBkZWNsYXJlCisgICAgICAgICAgICAgICBCdWZmZXIgOiBTdHJlYW1fRWxlbWVudF9BcnJheSAoMSAuLiAxMDI0KTsKKyAgICAgICAgICAgICAgIExhc3QgICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgICAgICAgIGJlZ2luCisgICAgICAgICAgICAgICBSZWFkIChGaWx0ZXIsIEJ1ZmZlciwgTGFzdCk7CisKKyAgICAgICAgICAgICAgIFBhY2tfU2l6ZSA6PSBQYWNrX1NpemUgKyBMYXN0IC0gQnVmZmVyJ0ZpcnN0ICsgMTsKKworICAgICAgICAgICAgICAgZXhpdCB3aGVuIExhc3QgPCBCdWZmZXInTGFzdDsKKyAgICAgICAgICAgIGVuZDsKKyAgICAgICAgIGVuZCBsb29wOworCisgICAgICAgICBBZGEuVGV4dF9JTy5QdXRfTGluZSAoU3RyZWFtX0VsZW1lbnRfT2Zmc2V0J0ltYWdlIChQYWNrX1NpemUpKTsKKworICAgICAgICAgWkxpYi5DbG9zZSAoRmlsdGVyKTsKKyAgICAgIGVuZCBsb29wOworCisgICAgICBleGl0IHdoZW4gbm90IENvbnRpbnVvdXM7CisKKyAgICAgIEZpbGVfU2l6ZSA6PSBGaWxlX1NpemUgKyAxOworICAgZW5kIGxvb3A7CitlbmQgUmVhZDsKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvYWRhL3JlYWRtZS50eHQgYi96bGliL3NyYy9jb250cmliL2FkYS9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNGQyY2EKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL2FkYS9yZWFkbWUudHh0CkBAIC0wLDAgKzEsNjUgQEAKKyAgICAgICAgICAgICAgICAgICAgICAgIFpMaWIgZm9yIEFkYSB0aGljayBiaW5kaW5nIChaTGliLkFkYSkKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlbGVhc2UgMS4zCisKK1pMaWIuQWRhIGlzIGEgdGhpY2sgYmluZGluZyBpbnRlcmZhY2UgdG8gdGhlIHBvcHVsYXIgWkxpYiBkYXRhCitjb21wcmVzc2lvbiBsaWJyYXJ5LCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5nemlwLm9yZy96bGliLy4KK0l0IHByb3ZpZGVzIEFkYS1zdHlsZSBhY2Nlc3MgdG8gdGhlIFpMaWIgQyBsaWJyYXJ5LgorCisKKyAgICAgICAgSGVyZSBhcmUgdGhlIG1haW4gY2hhbmdlcyBzaW5jZSBaTGliLkFkYSAxLjI6CisKKy0gQXR0ZW5zaW9uOiBaTGliLlJlYWQgZ2VuZXJpYyByb3V0aW5lIGhhdmUgYSBpbml0aWFsaXphdGlvbiByZXF1aXJlbWVudAorICBmb3IgUmVhZF9MYXN0IHBhcmFtZXRlciBub3cuIEl0IGlzIGEgYml0IGluY29tcGFydGlibGUgd2l0aCBwcmV2aW91cyB2ZXJzaW9uLAorICBidXQgZXh0ZW5kcyBmdW5jdGlvbmFsaXR5LCB3ZSBjb3VsZCB1c2UgbmV3IHBhcmFtZXRlcnMgQWxsb3dfUmVhZF9Tb21lIGFuZAorICBGbHVzaCBub3cuCisKKy0gQWRkZWQgSXNfT3BlbiByb3V0aW5lcyB0byBaTGliIGFuZCBaTGliLlN0cmVhbXMgcGFja2FnZXMuCisKKy0gQWRkIHByYWdtYSBBc3NlcnQgdG8gY2hlY2sgU3RyZWFtX0VsZW1lbnQgaXMgOCBiaXQuCisKKy0gRml4IGV4dHJhY3Rpb24gdG8gYnVmZmVyIHdpdGggZXhhY3Qga25vd24gZGVjb21wcmVzc2VkIHNpemUuIEVycm9yIHJlcG9ydGVkIGJ5CisgIFN0ZXZlIFNhbmd3aW5lLgorCistIEZpeCBkZWZpbml0aW9uIG9mIFVMb25nIChjaGFuZ2VkIHRvIHVuc2lnbmVkX2xvbmcpLCBmaXggcmVncmVzc2lvbiBvbiA2NCBiaXRzCisgIGNvbXB1dGVycy4gUGF0Y2ggcHJvdmlkZWQgYnkgUGFzY2FsIE9icnkuCisKKy0gQWRkIFN0YXR1c19FcnJvciBleGNlcHRpb24gZGVmaW5pdGlvbi4KKworLSBBZGQgcHJhZ21hIEFzc2VydGlvbiB0aGF0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50IHNpemUgaXMgOCBiaXQuCisKKworICAgICAgICBIb3cgdG8gYnVpbGQgWkxpYi5BZGEgdW5kZXIgR05BVAorCitZb3Ugc2hvdWxkIGhhdmUgdGhlIFpMaWIgbGlicmFyeSBhbHJlYWR5IGJ1aWxkIG9uIHlvdXIgY29tcHV0ZXIsIGJlZm9yZQorYnVpbGRpbmcgWkxpYi5BZGEuIE1ha2UgdGhlIGRpcmVjdG9yeSBvZiBaTGliLkFkYSBzb3VyY2VzIGN1cnJlbnQgYW5kCitpc3N1ZSB0aGUgY29tbWFuZDoKKworICBnbmF0bWFrZSB0ZXN0IC1sYXJncyAtTDxkaXJlY3Rvcnkgd2hlcmUgbGliei5hIGlzPiAtbHoKKworT3IgdXNlIHRoZSBHTkFUIHByb2plY3QgZmlsZSBidWlsZCBmb3IgR05BVCAzLjE1IG9yIGxhdGVyOgorCisgIGduYXRtYWtlIC1QemxpYi5ncHIgLUw8ZGlyZWN0b3J5IHdoZXJlIGxpYnouYSBpcz4KKworCisgICAgICAgIEhvdyB0byBidWlsZCBaTGliLkFkYSB1bmRlciBBb25peCBPYmplY3RBZGEgZm9yIFdpbjMyIDcuMi4yCisKKzEuIE1ha2UgYSBwcm9qZWN0IHdpdGggYWxsICouYWRzIGFuZCAqLmFkYiBmaWxlcyBmcm9tIHRoZSBkaXN0cmlidXRpb24uCisyLiBCdWlsZCB0aGUgbGliei5hIGxpYnJhcnkgZnJvbSB0aGUgWkxpYiBDIHNvdXJjZXMuCiszLiBSZW5hbWUgbGliei5hIHRvIHoubGliLgorNC4gQWRkIHRoZSBsaWJyYXJ5IHoubGliIHRvIHRoZSBwcm9qZWN0LgorNS4gQWRkIHRoZSBsaWJjLmxpYiBsaWJyYXJ5IGZyb20gdGhlIE9iamVjdEFkYSBkaXN0cmlidXRpb24gdG8gdGhlIHByb2plY3QuCis2LiBCdWlsZCB0aGUgZXhlY3V0YWJsZSB1c2luZyB0ZXN0LmFkYiBhcyBhIG1haW4gcHJvY2VkdXJlLgorCisKKyAgICAgICAgSG93IHRvIHVzZSBaTGliLkFkYQorCitUaGUgc291cmNlIGZpbGVzIHRlc3QuYWRiIGFuZCByZWFkLmFkYiBhcmUgc21hbGwgZGVtbyBwcm9ncmFtcyB0aGF0IHNob3cKK3RoZSBtYWluIGZ1bmN0aW9uYWxpdHkgb2YgWkxpYi5BZGEuCisKK1RoZSByb3V0aW5lcyBmcm9tIHRoZSBwYWNrYWdlIHNwZWNpZmljYXRpb25zIGFyZSBjb21tZW50ZWQuCisKKworSG9tZXBhZ2U6IGh0dHA6Ly96bGliLWFkYS5zb3VyY2Vmb3JnZS5uZXQvCitBdXRob3I6IERtaXRyaXkgQW5pc2lta292IDxhbmlzaW1rb3ZAeWFob28uY29tPgorCitDb250cmlidXRvcnM6IFBhc2NhbCBPYnJ5IDxwYXNjYWxAb2JyeS5vcmc+LCBTdGV2ZSBTYW5nd2luZSA8c2pzQGVzc2V4LmFjLnVrPgpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9hZGEvdGVzdC5hZGIgYi96bGliL3NyYy9jb250cmliL2FkYS90ZXN0LmFkYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDc3M2FjCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9hZGEvdGVzdC5hZGIKQEAgLTAsMCArMSw0NjMgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tICBaTGliIGZvciBBZGEgdGhpY2sgYmluZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBEbWl0cml5IEFuaXNpbWtvdiAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICBPcGVuIHNvdXJjZSBsaWNlbnNlIGluZm9ybWF0aW9uIGlzIGluIHRoZSB6bGliLmFkcyBmaWxlLiAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0gICRJZDogdGVzdC5hZGIsdiAxLjE3IDIwMDMvMDgvMTIgMTI6MTM6MzAgdmFndWwgRXhwICQKKworLS0gIFRoZSBwcm9ncmFtIGhhcyBhIGZldyBhaW1zLgorLS0gIDEuIFRlc3QgWkxpYi5BZGE5NSB0aGljayBiaW5kaW5nIGZ1bmN0aW9uYWxpdHkuCistLSAgMi4gU2hvdyB0aGUgZXhhbXBsZSBvZiB1c2UgbWFpbiBmdW5jdGlvbmFsaXR5IG9mIHRoZSBaTGliLkFkYTk1IGJpbmRpbmcuCistLSAgMy4gQnVpbGQgdGhpcyBwcm9ncmFtIGF1dG9tYXRpY2FsbHkgY29tcGlsZSBhbGwgWkxpYi5BZGE5NSBwYWNrYWdlcyB1bmRlcgorLS0gICAgIEdOQVQgQWRhOTUgY29tcGlsZXIuCisKK3dpdGggWkxpYi5TdHJlYW1zOword2l0aCBBZGEuU3RyZWFtcy5TdHJlYW1fSU87Cit3aXRoIEFkYS5OdW1lcmljcy5EaXNjcmV0ZV9SYW5kb207CisKK3dpdGggQWRhLlRleHRfSU87CisKK3dpdGggQWRhLkNhbGVuZGFyOworCitwcm9jZWR1cmUgVGVzdCBpcworCisgICB1c2UgQWRhLlN0cmVhbXM7CisgICB1c2UgU3RyZWFtX0lPOworCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tICBUZXN0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAtLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIEZpbGVfU2l6ZSAgIDogQ291bnQgICA6PSAxMDBfMDAwOworICAgQ29udGludW91cyAgOiBjb25zdGFudCBCb29sZWFuIDo9IEZhbHNlOworCisgICBIZWFkZXIgICAgICA6IGNvbnN0YW50IFpMaWIuSGVhZGVyX1R5cGUgOj0gWkxpYi5EZWZhdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICBaTGliLk5vbmU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIFpMaWIuQXV0bzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgWkxpYi5HWmlwOworICAgLS0gIERvIG5vdCB1c2UgSGVhZGVyIG90aGVyIHRoZW4gRGVmYXVsdCBpbiBaTGliIHZlcnNpb25zIDEuMS40CisgICAtLSAgYW5kIG9sZGVyLgorCisgICBTdHJhdGVneSAgICA6IGNvbnN0YW50IFpMaWIuU3RyYXRlZ3lfVHlwZSA6PSBaTGliLkRlZmF1bHRfU3RyYXRlZ3k7CisgICBJbml0X1JhbmRvbSA6IGNvbnN0YW50IDo9IDEwOworCisgICAtLSBFbmQgLS0KKworICAgSW5fRmlsZV9OYW1lICA6IGNvbnN0YW50IFN0cmluZyA6PSAidGVzdHpsaWIuaW4iOworICAgLS0gIE5hbWUgb2YgdGhlIGlucHV0IGZpbGUKKworICAgWl9GaWxlX05hbWUgICA6IGNvbnN0YW50IFN0cmluZyA6PSAidGVzdHpsaWIuemxiIjsKKyAgIC0tICBOYW1lIG9mIHRoZSBjb21wcmVzc2VkIGZpbGUuCisKKyAgIE91dF9GaWxlX05hbWUgOiBjb25zdGFudCBTdHJpbmcgOj0gInRlc3R6bGliLm91dCI7CisgICAtLSAgTmFtZSBvZiB0aGUgZGVjb21wcmVzc2VkIGZpbGUuCisKKyAgIEZpbGVfSW4gICA6IEZpbGVfVHlwZTsKKyAgIEZpbGVfT3V0ICA6IEZpbGVfVHlwZTsKKyAgIEZpbGVfQmFjayA6IEZpbGVfVHlwZTsKKyAgIEZpbGVfWiAgICA6IFpMaWIuU3RyZWFtcy5TdHJlYW1fVHlwZTsKKworICAgRmlsdGVyIDogWkxpYi5GaWx0ZXJfVHlwZTsKKworICAgVGltZV9TdGFtcCA6IEFkYS5DYWxlbmRhci5UaW1lOworCisgICBwcm9jZWR1cmUgR2VuZXJhdGVfRmlsZTsKKyAgIC0tICBHZW5lcmF0ZSBmaWxlIG9mIHNwZXRzaWZpZWQgc2l6ZSB3aXRoIHNvbWUgcmFuZG9tIGRhdGEuCisgICAtLSAgVGhlIHJhbmRvbSBkYXRhIGlzIHJlcGVhdGFibGUsIGZvciB0aGUgZ29vZCBjb21wcmVzc2lvbi4KKworICAgcHJvY2VkdXJlIENvbXBhcmVfU3RyZWFtcworICAgICAoTGVmdCwgUmlnaHQgOiBpbiBvdXQgUm9vdF9TdHJlYW1fVHlwZSdDbGFzcyk7CisgICAtLSAgVGhlIHByb2NlZHVyZSBjb21wZWFyaW5nIGRhdGEgaW4gMiBzdHJlYW1zLgorICAgLS0gIEl0IGlzIGZvciBjb21wYXJlIGRhdGEgYmVmb3JlIGFuZCBhZnRlciBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uLgorCisgICBwcm9jZWR1cmUgQ29tcGFyZV9GaWxlcyAoTGVmdCwgUmlnaHQgOiBTdHJpbmcpOworICAgLS0gIENvbXBhcmUgZmlsZXMuIEJhc2VkIG9uIHRoZSBDb21wYXJlX1N0cmVhbXMuCisKKyAgIHByb2NlZHVyZSBDb3B5X1N0cmVhbXMKKyAgICAgKFNvdXJjZSwgVGFyZ2V0IDogaW4gb3V0IFJvb3RfU3RyZWFtX1R5cGUnQ2xhc3M7CisgICAgICBCdWZmZXJfU2l6ZSAgICA6IGluICAgICBTdHJlYW1fRWxlbWVudF9PZmZzZXQgOj0gMTAyNCk7CisgICAtLSAgQ29weWluZyBkYXRhIGZyb20gb25lIHN0cmVhbSB0byBhbm90aGVyLiBJdCBpcyBmb3IgdGVzdCBzdHJlYW0KKyAgIC0tICBpbnRlcmZhY2Ugb2YgdGhlIGxpYnJhcnkuCisKKyAgIHByb2NlZHVyZSBEYXRhX0luCisgICAgIChJdGVtIDogb3V0IFN0cmVhbV9FbGVtZW50X0FycmF5OworICAgICAgTGFzdCA6IG91dCBTdHJlYW1fRWxlbWVudF9PZmZzZXQpOworICAgLS0gIHRoaXMgcHJvY2VkdXJlIGlzIGZvciBnZW5lcmljIGluc3RhbnRpYXRpb24gb2YKKyAgIC0tICBaTGliLkdlbmVyaWNfVHJhbnNsYXRlLgorICAgLS0gIHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBGaWxlX0luLgorCisgICBwcm9jZWR1cmUgRGF0YV9PdXQgKEl0ZW0gOiBpbiBTdHJlYW1fRWxlbWVudF9BcnJheSk7CisgICAtLSAgdGhpcyBwcm9jZWR1cmUgaXMgZm9yIGdlbmVyaWMgaW5zdGFudGlhdGlvbiBvZgorICAgLS0gIFpMaWIuR2VuZXJpY19UcmFuc2xhdGUuCisgICAtLSAgd3JpdGluZyBkYXRhIHRvIHRoZSBGaWxlX091dC4KKworICAgcHJvY2VkdXJlIFN0YW1wOworICAgLS0gIFN0b3JlIHRoZSB0aW1lc3RhbXAgdG8gdGhlIGxvY2FsIHZhcmlhYmxlLgorCisgICBwcm9jZWR1cmUgUHJpbnRfU3RhdGlzdGljIChNc2cgOiBTdHJpbmc7IERhdGFfU2l6ZSA6IFpMaWIuQ291bnQpOworICAgLS0gIFByaW50IHRoZSB0aW1lIHN0YXRpc3RpYyB3aXRoIHRoZSBtZXNzYWdlLgorCisgICBwcm9jZWR1cmUgVHJhbnNsYXRlIGlzIG5ldyBaTGliLkdlbmVyaWNfVHJhbnNsYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEYXRhX0luICA9PiBEYXRhX0luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YV9PdXQgPT4gRGF0YV9PdXQpOworICAgLS0gIFRoaXMgcHJvY2VkdXJlIGlzIG1vdmluZyBkYXRhIGZyb20gRmlsZV9JbiB0byBGaWxlX091dAorICAgLS0gIHdpdGggY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiwgZGVwZW5kIG9uIGluaXRpYWxpemF0aW9uIG9mCisgICAtLSAgRmlsdGVyIHBhcmFtZXRlci4KKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0gQ29tcGFyZV9GaWxlcyAtLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBwcm9jZWR1cmUgQ29tcGFyZV9GaWxlcyAoTGVmdCwgUmlnaHQgOiBTdHJpbmcpIGlzCisgICAgICBMZWZ0X0ZpbGUsIFJpZ2h0X0ZpbGUgOiBGaWxlX1R5cGU7CisgICBiZWdpbgorICAgICAgT3BlbiAoTGVmdF9GaWxlLCBJbl9GaWxlLCBMZWZ0KTsKKyAgICAgIE9wZW4gKFJpZ2h0X0ZpbGUsIEluX0ZpbGUsIFJpZ2h0KTsKKyAgICAgIENvbXBhcmVfU3RyZWFtcyAoU3RyZWFtIChMZWZ0X0ZpbGUpLmFsbCwgU3RyZWFtIChSaWdodF9GaWxlKS5hbGwpOworICAgICAgQ2xvc2UgKExlZnRfRmlsZSk7CisgICAgICBDbG9zZSAoUmlnaHRfRmlsZSk7CisgICBlbmQgQ29tcGFyZV9GaWxlczsKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLSBDb21wYXJlX1N0cmVhbXMgLS0KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBwcm9jZWR1cmUgQ29tcGFyZV9TdHJlYW1zCisgICAgIChMZWZ0LCBSaWdodCA6IGluIG91dCBBZGEuU3RyZWFtcy5Sb290X1N0cmVhbV9UeXBlJ0NsYXNzKQorICAgaXMKKyAgICAgIExlZnRfQnVmZmVyLCBSaWdodF9CdWZmZXIgOiBTdHJlYW1fRWxlbWVudF9BcnJheSAoMCAuLiAxNiNGRkYjKTsKKyAgICAgIExlZnRfTGFzdCwgUmlnaHRfTGFzdCA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgIGJlZ2luCisgICAgICBsb29wCisgICAgICAgICBSZWFkIChMZWZ0LCBMZWZ0X0J1ZmZlciwgTGVmdF9MYXN0KTsKKyAgICAgICAgIFJlYWQgKFJpZ2h0LCBSaWdodF9CdWZmZXIsIFJpZ2h0X0xhc3QpOworCisgICAgICAgICBpZiBMZWZ0X0xhc3QgLz0gUmlnaHRfTGFzdCB0aGVuCisgICAgICAgICAgICBBZGEuVGV4dF9JTy5QdXRfTGluZSAoIkNvbXBhcmUgZXJyb3IgOiIKKyAgICAgICAgICAgICAgJiBTdHJlYW1fRWxlbWVudF9PZmZzZXQnSW1hZ2UgKExlZnRfTGFzdCkKKyAgICAgICAgICAgICAgJiAiIC89ICIKKyAgICAgICAgICAgICAgJiBTdHJlYW1fRWxlbWVudF9PZmZzZXQnSW1hZ2UgKFJpZ2h0X0xhc3QpKTsKKworICAgICAgICAgICAgcmFpc2UgQ29uc3RyYWludF9FcnJvcjsKKworICAgICAgICAgZWxzaWYgTGVmdF9CdWZmZXIgKDAgLi4gTGVmdF9MYXN0KQorICAgICAgICAgICAgICAgLz0gUmlnaHRfQnVmZmVyICgwIC4uIFJpZ2h0X0xhc3QpCisgICAgICAgICB0aGVuCisgICAgICAgICAgICBBZGEuVGV4dF9JTy5QdXRfTGluZSAoIkVSUk9SOiBJTiBhbmQgT1VUIGZpbGVzIGlzIG5vdCBlcXVhbC4iKTsKKyAgICAgICAgICAgIHJhaXNlIENvbnN0cmFpbnRfRXJyb3I7CisKKyAgICAgICAgIGVuZCBpZjsKKworICAgICAgICAgZXhpdCB3aGVuIExlZnRfTGFzdCA8IExlZnRfQnVmZmVyJ0xhc3Q7CisgICAgICBlbmQgbG9vcDsKKyAgIGVuZCBDb21wYXJlX1N0cmVhbXM7CisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0gQ29weV9TdHJlYW1zIC0tCisgICAtLS0tLS0tLS0tLS0tLS0tLS0KKworICAgcHJvY2VkdXJlIENvcHlfU3RyZWFtcworICAgICAoU291cmNlLCBUYXJnZXQgOiBpbiBvdXQgQWRhLlN0cmVhbXMuUm9vdF9TdHJlYW1fVHlwZSdDbGFzczsKKyAgICAgIEJ1ZmZlcl9TaXplICAgIDogaW4gICAgIFN0cmVhbV9FbGVtZW50X09mZnNldCA6PSAxMDI0KQorICAgaXMKKyAgICAgIEJ1ZmZlciA6IFN0cmVhbV9FbGVtZW50X0FycmF5ICgxIC4uIEJ1ZmZlcl9TaXplKTsKKyAgICAgIExhc3QgICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgIGJlZ2luCisgICAgICBsb29wCisgICAgICAgICBSZWFkICAoU291cmNlLCBCdWZmZXIsIExhc3QpOworICAgICAgICAgV3JpdGUgKFRhcmdldCwgQnVmZmVyICgxIC4uIExhc3QpKTsKKworICAgICAgICAgZXhpdCB3aGVuIExhc3QgPCBCdWZmZXInTGFzdDsKKyAgICAgIGVuZCBsb29wOworICAgZW5kIENvcHlfU3RyZWFtczsKKworICAgLS0tLS0tLS0tLS0tLQorICAgLS0gRGF0YV9JbiAtLQorICAgLS0tLS0tLS0tLS0tLQorCisgICBwcm9jZWR1cmUgRGF0YV9JbgorICAgICAoSXRlbSA6IG91dCBTdHJlYW1fRWxlbWVudF9BcnJheTsKKyAgICAgIExhc3QgOiBvdXQgU3RyZWFtX0VsZW1lbnRfT2Zmc2V0KSBpcworICAgYmVnaW4KKyAgICAgIFJlYWQgKEZpbGVfSW4sIEl0ZW0sIExhc3QpOworICAgZW5kIERhdGFfSW47CisKKyAgIC0tLS0tLS0tLS0tLS0tCisgICAtLSBEYXRhX091dCAtLQorICAgLS0tLS0tLS0tLS0tLS0KKworICAgcHJvY2VkdXJlIERhdGFfT3V0IChJdGVtIDogaW4gU3RyZWFtX0VsZW1lbnRfQXJyYXkpIGlzCisgICBiZWdpbgorICAgICAgV3JpdGUgKEZpbGVfT3V0LCBJdGVtKTsKKyAgIGVuZCBEYXRhX091dDsKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0gR2VuZXJhdGVfRmlsZSAtLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBwcm9jZWR1cmUgR2VuZXJhdGVfRmlsZSBpcworICAgICAgc3VidHlwZSBWaXNpYmxlX1N5bWJvbHMgaXMgU3RyZWFtX0VsZW1lbnQgcmFuZ2UgMTYjMjAjIC4uIDE2IzdFIzsKKworICAgICAgcGFja2FnZSBSYW5kb21fRWxlbWVudHMgaXMKKyAgICAgICAgIG5ldyBBZGEuTnVtZXJpY3MuRGlzY3JldGVfUmFuZG9tIChWaXNpYmxlX1N5bWJvbHMpOworCisgICAgICBHZW4gICAgOiBSYW5kb21fRWxlbWVudHMuR2VuZXJhdG9yOworICAgICAgQnVmZmVyIDogU3RyZWFtX0VsZW1lbnRfQXJyYXkgOj0gKDEgLi4gNzcgPT4gMTYjMjAjKSAmIDEwOworCisgICAgICBCdWZmZXJfQ291bnQgOiBjb25zdGFudCBDb3VudCA6PSBGaWxlX1NpemUgLyBCdWZmZXInTGVuZ3RoOworICAgICAgLS0gIE51bWJlciBvZiBzYW1lIGJ1ZmZlcnMgaW4gdGhlIHBhY2tldC4KKworICAgICAgRGVuc2l0eSA6IGNvbnN0YW50IENvdW50IDo9IDMwOyAtLSAgZnJvbSAwIHRvIEJ1ZmZlcidMZW5ndGggLSAyOworCisgICAgICBwcm9jZWR1cmUgRmlsbF9CdWZmZXIgKEosIEQgOiBpbiBDb3VudCk7CisgICAgICAtLSAgQ2hhbmdlIHRoZSBwYXJ0IG9mIHRoZSBidWZmZXIuCisKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAtLSBGaWxsX0J1ZmZlciAtLQorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgcHJvY2VkdXJlIEZpbGxfQnVmZmVyIChKLCBEIDogaW4gQ291bnQpIGlzCisgICAgICBiZWdpbgorICAgICAgICAgZm9yIEsgaW4gMCAuLiBEIGxvb3AKKyAgICAgICAgICAgIEJ1ZmZlcgorICAgICAgICAgICAgICAoU3RyZWFtX0VsZW1lbnRfT2Zmc2V0ICgoSiArIEspIG1vZCAoQnVmZmVyJ0xlbmd0aCAtIDEpICsgMSkpCisgICAgICAgICAgICAgOj0gUmFuZG9tX0VsZW1lbnRzLlJhbmRvbSAoR2VuKTsKKworICAgICAgICAgZW5kIGxvb3A7CisgICAgICBlbmQgRmlsbF9CdWZmZXI7CisKKyAgIGJlZ2luCisgICAgICBSYW5kb21fRWxlbWVudHMuUmVzZXQgKEdlbiwgSW5pdF9SYW5kb20pOworCisgICAgICBDcmVhdGUgKEZpbGVfSW4sIE91dF9GaWxlLCBJbl9GaWxlX05hbWUpOworCisgICAgICBGaWxsX0J1ZmZlciAoMSwgQnVmZmVyJ0xlbmd0aCAtIDIpOworCisgICAgICBmb3IgSiBpbiAxIC4uIEJ1ZmZlcl9Db3VudCBsb29wCisgICAgICAgICBXcml0ZSAoRmlsZV9JbiwgQnVmZmVyKTsKKworICAgICAgICAgRmlsbF9CdWZmZXIgKEosIERlbnNpdHkpOworICAgICAgZW5kIGxvb3A7CisKKyAgICAgIC0tICBmaWxsIHJlbWFpbiBzaXplLgorCisgICAgICBXcml0ZQorICAgICAgICAoRmlsZV9JbiwKKyAgICAgICAgIEJ1ZmZlcgorICAgICAgICAgICAoMSAuLiBTdHJlYW1fRWxlbWVudF9PZmZzZXQKKyAgICAgICAgICAgICAgICAgICAoRmlsZV9TaXplIC0gQnVmZmVyJ0xlbmd0aCAqIEJ1ZmZlcl9Db3VudCkpKTsKKworICAgICAgRmx1c2ggKEZpbGVfSW4pOworICAgICAgQ2xvc2UgKEZpbGVfSW4pOworICAgZW5kIEdlbmVyYXRlX0ZpbGU7CisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0gUHJpbnRfU3RhdGlzdGljIC0tCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgcHJvY2VkdXJlIFByaW50X1N0YXRpc3RpYyAoTXNnIDogU3RyaW5nOyBEYXRhX1NpemUgOiBaTGliLkNvdW50KSBpcworICAgICAgdXNlIEFkYS5DYWxlbmRhcjsKKyAgICAgIHVzZSBBZGEuVGV4dF9JTzsKKworICAgICAgcGFja2FnZSBDb3VudF9JTyBpcyBuZXcgSW50ZWdlcl9JTyAoWkxpYi5Db3VudCk7CisKKyAgICAgIEN1cnJfRHVyIDogRHVyYXRpb24gOj0gQ2xvY2sgLSBUaW1lX1N0YW1wOworICAgYmVnaW4KKyAgICAgIFB1dCAoTXNnKTsKKworICAgICAgU2V0X0NvbCAoMjApOworICAgICAgQWRhLlRleHRfSU8uUHV0ICgic2l6ZSA9Iik7CisKKyAgICAgIENvdW50X0lPLlB1dAorICAgICAgICAoRGF0YV9TaXplLAorICAgICAgICAgV2lkdGggPT4gU3RyZWFtX0lPLkNvdW50J0ltYWdlIChGaWxlX1NpemUpJ0xlbmd0aCk7CisKKyAgICAgIFB1dF9MaW5lICgiIGR1cmF0aW9uID0iICYgRHVyYXRpb24nSW1hZ2UgKEN1cnJfRHVyKSk7CisgICBlbmQgUHJpbnRfU3RhdGlzdGljOworCisgICAtLS0tLS0tLS0tLQorICAgLS0gU3RhbXAgLS0KKyAgIC0tLS0tLS0tLS0tCisKKyAgIHByb2NlZHVyZSBTdGFtcCBpcworICAgYmVnaW4KKyAgICAgIFRpbWVfU3RhbXAgOj0gQWRhLkNhbGVuZGFyLkNsb2NrOworICAgZW5kIFN0YW1wOworCitiZWdpbgorICAgQWRhLlRleHRfSU8uUHV0X0xpbmUgKCJaTGliICIgJiBaTGliLlZlcnNpb24pOworCisgICBsb29wCisgICAgICBHZW5lcmF0ZV9GaWxlOworCisgICAgICBmb3IgTGV2ZWwgaW4gWkxpYi5Db21wcmVzc2lvbl9MZXZlbCdSYW5nZSBsb29wCisKKyAgICAgICAgIEFkYS5UZXh0X0lPLlB1dF9MaW5lICgiTGV2ZWwgPSIKKyAgICAgICAgICAgICYgWkxpYi5Db21wcmVzc2lvbl9MZXZlbCdJbWFnZSAoTGV2ZWwpKTsKKworICAgICAgICAgLS0gIFRlc3QgZ2VuZXJpYyBpbnRlcmZhY2UuCisgICAgICAgICBPcGVuICAgKEZpbGVfSW4sIEluX0ZpbGUsIEluX0ZpbGVfTmFtZSk7CisgICAgICAgICBDcmVhdGUgKEZpbGVfT3V0LCBPdXRfRmlsZSwgWl9GaWxlX05hbWUpOworCisgICAgICAgICBTdGFtcDsKKworICAgICAgICAgLS0gIERlZmxhdGUgdXNpbmcgZ2VuZXJpYyBpbnN0YW50aWF0aW9uLgorCisgICAgICAgICBaTGliLkRlZmxhdGVfSW5pdAorICAgICAgICAgICAgICAgKEZpbHRlciAgID0+IEZpbHRlciwKKyAgICAgICAgICAgICAgICBMZXZlbCAgICA9PiBMZXZlbCwKKyAgICAgICAgICAgICAgICBTdHJhdGVneSA9PiBTdHJhdGVneSwKKyAgICAgICAgICAgICAgICBIZWFkZXIgICA9PiBIZWFkZXIpOworCisgICAgICAgICBUcmFuc2xhdGUgKEZpbHRlcik7CisgICAgICAgICBQcmludF9TdGF0aXN0aWMgKCJHZW5lcmljIGNvbXByZXNzIiwgWkxpYi5Ub3RhbF9PdXQgKEZpbHRlcikpOworICAgICAgICAgWkxpYi5DbG9zZSAoRmlsdGVyKTsKKworICAgICAgICAgQ2xvc2UgKEZpbGVfSW4pOworICAgICAgICAgQ2xvc2UgKEZpbGVfT3V0KTsKKworICAgICAgICAgT3BlbiAgIChGaWxlX0luLCBJbl9GaWxlLCBaX0ZpbGVfTmFtZSk7CisgICAgICAgICBDcmVhdGUgKEZpbGVfT3V0LCBPdXRfRmlsZSwgT3V0X0ZpbGVfTmFtZSk7CisKKyAgICAgICAgIFN0YW1wOworCisgICAgICAgICAtLSAgSW5mbGF0ZSB1c2luZyBnZW5lcmljIGluc3RhbnRpYXRpb24uCisKKyAgICAgICAgIFpMaWIuSW5mbGF0ZV9Jbml0IChGaWx0ZXIsIEhlYWRlciA9PiBIZWFkZXIpOworCisgICAgICAgICBUcmFuc2xhdGUgKEZpbHRlcik7CisgICAgICAgICBQcmludF9TdGF0aXN0aWMgKCJHZW5lcmljIGRlY29tcHJlc3MiLCBaTGliLlRvdGFsX091dCAoRmlsdGVyKSk7CisKKyAgICAgICAgIFpMaWIuQ2xvc2UgKEZpbHRlcik7CisKKyAgICAgICAgIENsb3NlIChGaWxlX0luKTsKKyAgICAgICAgIENsb3NlIChGaWxlX091dCk7CisKKyAgICAgICAgIENvbXBhcmVfRmlsZXMgKEluX0ZpbGVfTmFtZSwgT3V0X0ZpbGVfTmFtZSk7CisKKyAgICAgICAgIC0tICBUZXN0IHN0cmVhbSBpbnRlcmZhY2UuCisKKyAgICAgICAgIC0tICBDb21wcmVzcyB0byB0aGUgYmFjayBzdHJlYW0uCisKKyAgICAgICAgIE9wZW4gICAoRmlsZV9JbiwgSW5fRmlsZSwgSW5fRmlsZV9OYW1lKTsKKyAgICAgICAgIENyZWF0ZSAoRmlsZV9CYWNrLCBPdXRfRmlsZSwgWl9GaWxlX05hbWUpOworCisgICAgICAgICBTdGFtcDsKKworICAgICAgICAgWkxpYi5TdHJlYW1zLkNyZWF0ZQorICAgICAgICAgICAoU3RyZWFtICAgICAgICAgID0+IEZpbGVfWiwKKyAgICAgICAgICAgIE1vZGUgICAgICAgICAgICA9PiBaTGliLlN0cmVhbXMuT3V0X1N0cmVhbSwKKyAgICAgICAgICAgIEJhY2sgICAgICAgICAgICA9PiBaTGliLlN0cmVhbXMuU3RyZWFtX0FjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmVhbSAoRmlsZV9CYWNrKSksCisgICAgICAgICAgICBCYWNrX0NvbXByZXNzZWQgPT4gVHJ1ZSwKKyAgICAgICAgICAgIExldmVsICAgICAgICAgICA9PiBMZXZlbCwKKyAgICAgICAgICAgIFN0cmF0ZWd5ICAgICAgICA9PiBTdHJhdGVneSwKKyAgICAgICAgICAgIEhlYWRlciAgICAgICAgICA9PiBIZWFkZXIpOworCisgICAgICAgICBDb3B5X1N0cmVhbXMKKyAgICAgICAgICAgKFNvdXJjZSA9PiBTdHJlYW0gKEZpbGVfSW4pLmFsbCwKKyAgICAgICAgICAgIFRhcmdldCA9PiBGaWxlX1opOworCisgICAgICAgICAtLSAgRmx1c2hpbmcgaW50ZXJuYWwgYnVmZmVycyB0byB0aGUgYmFjayBzdHJlYW0uCisKKyAgICAgICAgIFpMaWIuU3RyZWFtcy5GbHVzaCAoRmlsZV9aLCBaTGliLkZpbmlzaCk7CisKKyAgICAgICAgIFByaW50X1N0YXRpc3RpYyAoIldyaXRlIGNvbXByZXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWkxpYi5TdHJlYW1zLldyaXRlX1RvdGFsX091dCAoRmlsZV9aKSk7CisKKyAgICAgICAgIFpMaWIuU3RyZWFtcy5DbG9zZSAoRmlsZV9aKTsKKworICAgICAgICAgQ2xvc2UgKEZpbGVfSW4pOworICAgICAgICAgQ2xvc2UgKEZpbGVfQmFjayk7CisKKyAgICAgICAgIC0tICBDb21wYXJlIHJlYWRpbmcgZnJvbSBvcmlnaW5hbCBmaWxlIGFuZCBmcm9tCisgICAgICAgICAtLSAgZGVjb21wcmVzc2lvbiBzdHJlYW0uCisKKyAgICAgICAgIE9wZW4gKEZpbGVfSW4sICAgSW5fRmlsZSwgSW5fRmlsZV9OYW1lKTsKKyAgICAgICAgIE9wZW4gKEZpbGVfQmFjaywgSW5fRmlsZSwgWl9GaWxlX05hbWUpOworCisgICAgICAgICBaTGliLlN0cmVhbXMuQ3JlYXRlCisgICAgICAgICAgIChTdHJlYW0gICAgICAgICAgPT4gRmlsZV9aLAorICAgICAgICAgICAgTW9kZSAgICAgICAgICAgID0+IFpMaWIuU3RyZWFtcy5Jbl9TdHJlYW0sCisgICAgICAgICAgICBCYWNrICAgICAgICAgICAgPT4gWkxpYi5TdHJlYW1zLlN0cmVhbV9BY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJlYW0gKEZpbGVfQmFjaykpLAorICAgICAgICAgICAgQmFja19Db21wcmVzc2VkID0+IFRydWUsCisgICAgICAgICAgICBIZWFkZXIgICAgICAgICAgPT4gSGVhZGVyKTsKKworICAgICAgICAgU3RhbXA7CisgICAgICAgICBDb21wYXJlX1N0cmVhbXMgKFN0cmVhbSAoRmlsZV9JbikuYWxsLCBGaWxlX1opOworCisgICAgICAgICBQcmludF9TdGF0aXN0aWMgKCJSZWFkIGRlY29tcHJlc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBaTGliLlN0cmVhbXMuUmVhZF9Ub3RhbF9PdXQgKEZpbGVfWikpOworCisgICAgICAgICBaTGliLlN0cmVhbXMuQ2xvc2UgKEZpbGVfWik7CisgICAgICAgICBDbG9zZSAoRmlsZV9Jbik7CisgICAgICAgICBDbG9zZSAoRmlsZV9CYWNrKTsKKworICAgICAgICAgLS0gIENvbXByZXNzIGJ5IHJlYWRpbmcgZnJvbSBjb21wcmVzc2lvbiBzdHJlYW0uCisKKyAgICAgICAgIE9wZW4gKEZpbGVfQmFjaywgSW5fRmlsZSwgSW5fRmlsZV9OYW1lKTsKKyAgICAgICAgIENyZWF0ZSAoRmlsZV9PdXQsIE91dF9GaWxlLCBaX0ZpbGVfTmFtZSk7CisKKyAgICAgICAgIFpMaWIuU3RyZWFtcy5DcmVhdGUKKyAgICAgICAgICAgKFN0cmVhbSAgICAgICAgICA9PiBGaWxlX1osCisgICAgICAgICAgICBNb2RlICAgICAgICAgICAgPT4gWkxpYi5TdHJlYW1zLkluX1N0cmVhbSwKKyAgICAgICAgICAgIEJhY2sgICAgICAgICAgICA9PiBaTGliLlN0cmVhbXMuU3RyZWFtX0FjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmVhbSAoRmlsZV9CYWNrKSksCisgICAgICAgICAgICBCYWNrX0NvbXByZXNzZWQgPT4gRmFsc2UsCisgICAgICAgICAgICBMZXZlbCAgICAgICAgICAgPT4gTGV2ZWwsCisgICAgICAgICAgICBTdHJhdGVneSAgICAgICAgPT4gU3RyYXRlZ3ksCisgICAgICAgICAgICBIZWFkZXIgICAgICAgICAgPT4gSGVhZGVyKTsKKworICAgICAgICAgU3RhbXA7CisgICAgICAgICBDb3B5X1N0cmVhbXMKKyAgICAgICAgICAgKFNvdXJjZSA9PiBGaWxlX1osCisgICAgICAgICAgICBUYXJnZXQgPT4gU3RyZWFtIChGaWxlX091dCkuYWxsKTsKKworICAgICAgICAgUHJpbnRfU3RhdGlzdGljICgiUmVhZCBjb21wcmVzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFpMaWIuU3RyZWFtcy5SZWFkX1RvdGFsX091dCAoRmlsZV9aKSk7CisKKyAgICAgICAgIFpMaWIuU3RyZWFtcy5DbG9zZSAoRmlsZV9aKTsKKworICAgICAgICAgQ2xvc2UgKEZpbGVfT3V0KTsKKyAgICAgICAgIENsb3NlIChGaWxlX0JhY2spOworCisgICAgICAgICAtLSAgRGVjb21wcmVzcyB0byBkZWNvbXByZXNzaW9uIHN0cmVhbS4KKworICAgICAgICAgT3BlbiAgIChGaWxlX0luLCAgIEluX0ZpbGUsIFpfRmlsZV9OYW1lKTsKKyAgICAgICAgIENyZWF0ZSAoRmlsZV9CYWNrLCBPdXRfRmlsZSwgT3V0X0ZpbGVfTmFtZSk7CisKKyAgICAgICAgIFpMaWIuU3RyZWFtcy5DcmVhdGUKKyAgICAgICAgICAgKFN0cmVhbSAgICAgICAgICA9PiBGaWxlX1osCisgICAgICAgICAgICBNb2RlICAgICAgICAgICAgPT4gWkxpYi5TdHJlYW1zLk91dF9TdHJlYW0sCisgICAgICAgICAgICBCYWNrICAgICAgICAgICAgPT4gWkxpYi5TdHJlYW1zLlN0cmVhbV9BY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJlYW0gKEZpbGVfQmFjaykpLAorICAgICAgICAgICAgQmFja19Db21wcmVzc2VkID0+IEZhbHNlLAorICAgICAgICAgICAgSGVhZGVyICAgICAgICAgID0+IEhlYWRlcik7CisKKyAgICAgICAgIFN0YW1wOworCisgICAgICAgICBDb3B5X1N0cmVhbXMKKyAgICAgICAgICAgKFNvdXJjZSA9PiBTdHJlYW0gKEZpbGVfSW4pLmFsbCwKKyAgICAgICAgICAgIFRhcmdldCA9PiBGaWxlX1opOworCisgICAgICAgICBQcmludF9TdGF0aXN0aWMgKCJXcml0ZSBkZWNvbXByZXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWkxpYi5TdHJlYW1zLldyaXRlX1RvdGFsX091dCAoRmlsZV9aKSk7CisKKyAgICAgICAgIFpMaWIuU3RyZWFtcy5DbG9zZSAoRmlsZV9aKTsKKyAgICAgICAgIENsb3NlIChGaWxlX0luKTsKKyAgICAgICAgIENsb3NlIChGaWxlX0JhY2spOworCisgICAgICAgICBDb21wYXJlX0ZpbGVzIChJbl9GaWxlX05hbWUsIE91dF9GaWxlX05hbWUpOworICAgICAgZW5kIGxvb3A7CisKKyAgICAgIEFkYS5UZXh0X0lPLlB1dF9MaW5lIChDb3VudCdJbWFnZSAoRmlsZV9TaXplKSAmICIgT2suIik7CisKKyAgICAgIGV4aXQgd2hlbiBub3QgQ29udGludW91czsKKworICAgICAgRmlsZV9TaXplIDo9IEZpbGVfU2l6ZSArIDE7CisgICBlbmQgbG9vcDsKK2VuZCBUZXN0OwpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9hZGEvemxpYi1zdHJlYW1zLmFkYiBiL3psaWIvc3JjL2NvbnRyaWIvYWRhL3psaWItc3RyZWFtcy5hZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY0OTdiYQotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvYWRhL3psaWItc3RyZWFtcy5hZGIKQEAgLTAsMCArMSwyMjUgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tICBaTGliIGZvciBBZGEgdGhpY2sgYmluZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBEbWl0cml5IEFuaXNpbWtvdiAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICBPcGVuIHNvdXJjZSBsaWNlbnNlIGluZm9ybWF0aW9uIGlzIGluIHRoZSB6bGliLmFkcyBmaWxlLiAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0gICRJZDogemxpYi1zdHJlYW1zLmFkYix2IDEuMTAgMjAwNC8wNS8zMSAxMDo1Mzo0MCB2YWd1bCBFeHAgJAorCit3aXRoIEFkYS5VbmNoZWNrZWRfRGVhbGxvY2F0aW9uOworCitwYWNrYWdlIGJvZHkgWkxpYi5TdHJlYW1zIGlzCisKKyAgIC0tLS0tLS0tLS0tCisgICAtLSBDbG9zZSAtLQorICAgLS0tLS0tLS0tLS0KKworICAgcHJvY2VkdXJlIENsb3NlIChTdHJlYW0gOiBpbiBvdXQgU3RyZWFtX1R5cGUpIGlzCisgICAgICBwcm9jZWR1cmUgRnJlZSBpcyBuZXcgQWRhLlVuY2hlY2tlZF9EZWFsbG9jYXRpb24KKyAgICAgICAgIChTdHJlYW1fRWxlbWVudF9BcnJheSwgQnVmZmVyX0FjY2Vzcyk7CisgICBiZWdpbgorICAgICAgaWYgU3RyZWFtLk1vZGUgPSBPdXRfU3RyZWFtIG9yIFN0cmVhbS5Nb2RlID0gRHVwbGV4IHRoZW4KKyAgICAgICAgIC0tICBXZSBzaG91bGQgZmx1c2ggdGhlIGRhdGEgd3JpdHRlbiBieSB0aGUgd3JpdGVyLgorCisgICAgICAgICBGbHVzaCAoU3RyZWFtLCBGaW5pc2gpOworCisgICAgICAgICBDbG9zZSAoU3RyZWFtLldyaXRlcik7CisgICAgICBlbmQgaWY7CisKKyAgICAgIGlmIFN0cmVhbS5Nb2RlID0gSW5fU3RyZWFtIG9yIFN0cmVhbS5Nb2RlID0gRHVwbGV4IHRoZW4KKyAgICAgICAgIENsb3NlIChTdHJlYW0uUmVhZGVyKTsKKyAgICAgICAgIEZyZWUgKFN0cmVhbS5CdWZmZXIpOworICAgICAgZW5kIGlmOworICAgZW5kIENsb3NlOworCisgICAtLS0tLS0tLS0tLS0KKyAgIC0tIENyZWF0ZSAtLQorICAgLS0tLS0tLS0tLS0tCisKKyAgIHByb2NlZHVyZSBDcmVhdGUKKyAgICAgKFN0cmVhbSAgICAgICAgICAgIDogICAgb3V0IFN0cmVhbV9UeXBlOworICAgICAgTW9kZSAgICAgICAgICAgICAgOiBpbiAgICAgU3RyZWFtX01vZGU7CisgICAgICBCYWNrICAgICAgICAgICAgICA6IGluICAgICBTdHJlYW1fQWNjZXNzOworICAgICAgQmFja19Db21wcmVzc2VkICAgOiBpbiAgICAgQm9vbGVhbjsKKyAgICAgIExldmVsICAgICAgICAgICAgIDogaW4gICAgIENvbXByZXNzaW9uX0xldmVsIDo9IERlZmF1bHRfQ29tcHJlc3Npb247CisgICAgICBTdHJhdGVneSAgICAgICAgICA6IGluICAgICBTdHJhdGVneV9UeXBlICAgICA6PSBEZWZhdWx0X1N0cmF0ZWd5OworICAgICAgSGVhZGVyICAgICAgICAgICAgOiBpbiAgICAgSGVhZGVyX1R5cGUgICAgICAgOj0gRGVmYXVsdDsKKyAgICAgIFJlYWRfQnVmZmVyX1NpemUgIDogaW4gICAgIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOj0gRGVmYXVsdF9CdWZmZXJfU2l6ZTsKKyAgICAgIFdyaXRlX0J1ZmZlcl9TaXplIDogaW4gICAgIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOj0gRGVmYXVsdF9CdWZmZXJfU2l6ZSkKKyAgIGlzCisKKyAgICAgIHN1YnR5cGUgQnVmZmVyX1N1YnR5cGUgaXMgU3RyZWFtX0VsZW1lbnRfQXJyYXkgKDEgLi4gUmVhZF9CdWZmZXJfU2l6ZSk7CisKKyAgICAgIHByb2NlZHVyZSBJbml0X0ZpbHRlcgorICAgICAgICAgKEZpbHRlciAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOworICAgICAgICAgIENvbXByZXNzIDogaW4gICAgIEJvb2xlYW4pOworCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLQorICAgICAgLS0gSW5pdF9GaWx0ZXIgLS0KKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgIHByb2NlZHVyZSBJbml0X0ZpbHRlcgorICAgICAgICAgKEZpbHRlciAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOworICAgICAgICAgIENvbXByZXNzIDogaW4gICAgIEJvb2xlYW4pIGlzCisgICAgICBiZWdpbgorICAgICAgICAgaWYgQ29tcHJlc3MgdGhlbgorICAgICAgICAgICAgRGVmbGF0ZV9Jbml0CisgICAgICAgICAgICAgIChGaWx0ZXIsIExldmVsLCBTdHJhdGVneSwgSGVhZGVyID0+IEhlYWRlcik7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBJbmZsYXRlX0luaXQgKEZpbHRlciwgSGVhZGVyID0+IEhlYWRlcik7CisgICAgICAgICBlbmQgaWY7CisgICAgICBlbmQgSW5pdF9GaWx0ZXI7CisKKyAgIGJlZ2luCisgICAgICBTdHJlYW0uQmFjayA6PSBCYWNrOworICAgICAgU3RyZWFtLk1vZGUgOj0gTW9kZTsKKworICAgICAgaWYgTW9kZSA9IE91dF9TdHJlYW0gb3IgTW9kZSA9IER1cGxleCB0aGVuCisgICAgICAgICBJbml0X0ZpbHRlciAoU3RyZWFtLldyaXRlciwgQmFja19Db21wcmVzc2VkKTsKKyAgICAgICAgIFN0cmVhbS5CdWZmZXJfU2l6ZSA6PSBXcml0ZV9CdWZmZXJfU2l6ZTsKKyAgICAgIGVsc2UKKyAgICAgICAgIFN0cmVhbS5CdWZmZXJfU2l6ZSA6PSAwOworICAgICAgZW5kIGlmOworCisgICAgICBpZiBNb2RlID0gSW5fU3RyZWFtIG9yIE1vZGUgPSBEdXBsZXggdGhlbgorICAgICAgICAgSW5pdF9GaWx0ZXIgKFN0cmVhbS5SZWFkZXIsIG5vdCBCYWNrX0NvbXByZXNzZWQpOworCisgICAgICAgICBTdHJlYW0uQnVmZmVyICAgICA6PSBuZXcgQnVmZmVyX1N1YnR5cGU7CisgICAgICAgICBTdHJlYW0uUmVzdF9GaXJzdCA6PSBTdHJlYW0uQnVmZmVyJ0xhc3QgKyAxOworICAgICAgICAgU3RyZWFtLlJlc3RfTGFzdCAgOj0gU3RyZWFtLkJ1ZmZlcidMYXN0OworICAgICAgZW5kIGlmOworICAgZW5kIENyZWF0ZTsKKworICAgLS0tLS0tLS0tLS0KKyAgIC0tIEZsdXNoIC0tCisgICAtLS0tLS0tLS0tLQorCisgICBwcm9jZWR1cmUgRmx1c2gKKyAgICAgKFN0cmVhbSA6IGluIG91dCBTdHJlYW1fVHlwZTsKKyAgICAgIE1vZGUgICA6IGluICAgICBGbHVzaF9Nb2RlIDo9IFN5bmNfRmx1c2gpCisgICBpcworICAgICAgQnVmZmVyIDogU3RyZWFtX0VsZW1lbnRfQXJyYXkgKDEgLi4gU3RyZWFtLkJ1ZmZlcl9TaXplKTsKKyAgICAgIExhc3QgICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgIGJlZ2luCisgICAgICBsb29wCisgICAgICAgICBGbHVzaCAoU3RyZWFtLldyaXRlciwgQnVmZmVyLCBMYXN0LCBNb2RlKTsKKworICAgICAgICAgQWRhLlN0cmVhbXMuV3JpdGUgKFN0cmVhbS5CYWNrLmFsbCwgQnVmZmVyICgxIC4uIExhc3QpKTsKKworICAgICAgICAgZXhpdCB3aGVuIExhc3QgPCBCdWZmZXInTGFzdDsKKyAgICAgIGVuZCBsb29wOworICAgZW5kIEZsdXNoOworCisgICAtLS0tLS0tLS0tLS0tCisgICAtLSBJc19PcGVuIC0tCisgICAtLS0tLS0tLS0tLS0tCisKKyAgIGZ1bmN0aW9uIElzX09wZW4gKFN0cmVhbSA6IFN0cmVhbV9UeXBlKSByZXR1cm4gQm9vbGVhbiBpcworICAgYmVnaW4KKyAgICAgIHJldHVybiBJc19PcGVuIChTdHJlYW0uUmVhZGVyKSBvciBlbHNlIElzX09wZW4gKFN0cmVhbS5Xcml0ZXIpOworICAgZW5kIElzX09wZW47CisKKyAgIC0tLS0tLS0tLS0KKyAgIC0tIFJlYWQgLS0KKyAgIC0tLS0tLS0tLS0KKworICAgcHJvY2VkdXJlIFJlYWQKKyAgICAgKFN0cmVhbSA6IGluIG91dCBTdHJlYW1fVHlwZTsKKyAgICAgIEl0ZW0gICA6ICAgIG91dCBTdHJlYW1fRWxlbWVudF9BcnJheTsKKyAgICAgIExhc3QgICA6ICAgIG91dCBTdHJlYW1fRWxlbWVudF9PZmZzZXQpCisgICBpcworCisgICAgICBwcm9jZWR1cmUgUmVhZAorICAgICAgICAoSXRlbSA6IG91dCBTdHJlYW1fRWxlbWVudF9BcnJheTsKKyAgICAgICAgIExhc3QgOiBvdXQgU3RyZWFtX0VsZW1lbnRfT2Zmc2V0KTsKKworICAgICAgLS0tLS0tLS0tLQorICAgICAgLS0gUmVhZCAtLQorICAgICAgLS0tLS0tLS0tLQorCisgICAgICBwcm9jZWR1cmUgUmVhZAorICAgICAgICAoSXRlbSA6IG91dCBTdHJlYW1fRWxlbWVudF9BcnJheTsKKyAgICAgICAgIExhc3QgOiBvdXQgU3RyZWFtX0VsZW1lbnRfT2Zmc2V0KSBpcworICAgICAgYmVnaW4KKyAgICAgICAgIEFkYS5TdHJlYW1zLlJlYWQgKFN0cmVhbS5CYWNrLmFsbCwgSXRlbSwgTGFzdCk7CisgICAgICBlbmQgUmVhZDsKKworICAgICAgcHJvY2VkdXJlIFJlYWQgaXMgbmV3IFpMaWIuUmVhZAorICAgICAgICAgKFJlYWQgICAgICAgPT4gUmVhZCwKKyAgICAgICAgICBCdWZmZXIgICAgID0+IFN0cmVhbS5CdWZmZXIuYWxsLAorICAgICAgICAgIFJlc3RfRmlyc3QgPT4gU3RyZWFtLlJlc3RfRmlyc3QsCisgICAgICAgICAgUmVzdF9MYXN0ICA9PiBTdHJlYW0uUmVzdF9MYXN0KTsKKworICAgYmVnaW4KKyAgICAgIFJlYWQgKFN0cmVhbS5SZWFkZXIsIEl0ZW0sIExhc3QpOworICAgZW5kIFJlYWQ7CisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tIFJlYWRfVG90YWxfSW4gLS0KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgZnVuY3Rpb24gUmVhZF9Ub3RhbF9JbiAoU3RyZWFtIDogaW4gU3RyZWFtX1R5cGUpIHJldHVybiBDb3VudCBpcworICAgYmVnaW4KKyAgICAgIHJldHVybiBUb3RhbF9JbiAoU3RyZWFtLlJlYWRlcik7CisgICBlbmQgUmVhZF9Ub3RhbF9JbjsKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tIFJlYWRfVG90YWxfT3V0IC0tCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBmdW5jdGlvbiBSZWFkX1RvdGFsX091dCAoU3RyZWFtIDogaW4gU3RyZWFtX1R5cGUpIHJldHVybiBDb3VudCBpcworICAgYmVnaW4KKyAgICAgIHJldHVybiBUb3RhbF9PdXQgKFN0cmVhbS5SZWFkZXIpOworICAgZW5kIFJlYWRfVG90YWxfT3V0OworCisgICAtLS0tLS0tLS0tLQorICAgLS0gV3JpdGUgLS0KKyAgIC0tLS0tLS0tLS0tCisKKyAgIHByb2NlZHVyZSBXcml0ZQorICAgICAoU3RyZWFtIDogaW4gb3V0IFN0cmVhbV9UeXBlOworICAgICAgSXRlbSAgIDogaW4gICAgIFN0cmVhbV9FbGVtZW50X0FycmF5KQorICAgaXMKKworICAgICAgcHJvY2VkdXJlIFdyaXRlIChJdGVtIDogaW4gU3RyZWFtX0VsZW1lbnRfQXJyYXkpOworCisgICAgICAtLS0tLS0tLS0tLQorICAgICAgLS0gV3JpdGUgLS0KKyAgICAgIC0tLS0tLS0tLS0tCisKKyAgICAgIHByb2NlZHVyZSBXcml0ZSAoSXRlbSA6IGluIFN0cmVhbV9FbGVtZW50X0FycmF5KSBpcworICAgICAgYmVnaW4KKyAgICAgICAgIEFkYS5TdHJlYW1zLldyaXRlIChTdHJlYW0uQmFjay5hbGwsIEl0ZW0pOworICAgICAgZW5kIFdyaXRlOworCisgICAgICBwcm9jZWR1cmUgV3JpdGUgaXMgbmV3IFpMaWIuV3JpdGUKKyAgICAgICAgIChXcml0ZSAgICAgICA9PiBXcml0ZSwKKyAgICAgICAgICBCdWZmZXJfU2l6ZSA9PiBTdHJlYW0uQnVmZmVyX1NpemUpOworCisgICBiZWdpbgorICAgICAgV3JpdGUgKFN0cmVhbS5Xcml0ZXIsIEl0ZW0sIE5vX0ZsdXNoKTsKKyAgIGVuZCBXcml0ZTsKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tIFdyaXRlX1RvdGFsX0luIC0tCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBmdW5jdGlvbiBXcml0ZV9Ub3RhbF9JbiAoU3RyZWFtIDogaW4gU3RyZWFtX1R5cGUpIHJldHVybiBDb3VudCBpcworICAgYmVnaW4KKyAgICAgIHJldHVybiBUb3RhbF9JbiAoU3RyZWFtLldyaXRlcik7CisgICBlbmQgV3JpdGVfVG90YWxfSW47CisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0gV3JpdGVfVG90YWxfT3V0IC0tCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgZnVuY3Rpb24gV3JpdGVfVG90YWxfT3V0IChTdHJlYW0gOiBpbiBTdHJlYW1fVHlwZSkgcmV0dXJuIENvdW50IGlzCisgICBiZWdpbgorICAgICAgcmV0dXJuIFRvdGFsX091dCAoU3RyZWFtLldyaXRlcik7CisgICBlbmQgV3JpdGVfVG90YWxfT3V0OworCitlbmQgWkxpYi5TdHJlYW1zOwpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9hZGEvemxpYi1zdHJlYW1zLmFkcyBiL3psaWIvc3JjL2NvbnRyaWIvYWRhL3psaWItc3RyZWFtcy5hZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAxOTNjNgotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvYWRhL3psaWItc3RyZWFtcy5hZHMKQEAgLTAsMCArMSwxMTQgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tICBaTGliIGZvciBBZGEgdGhpY2sgYmluZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBEbWl0cml5IEFuaXNpbWtvdiAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICBPcGVuIHNvdXJjZSBsaWNlbnNlIGluZm9ybWF0aW9uIGlzIGluIHRoZSB6bGliLmFkcyBmaWxlLiAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0gICRJZDogemxpYi1zdHJlYW1zLmFkcyx2IDEuMTIgMjAwNC8wNS8zMSAxMDo1Mzo0MCB2YWd1bCBFeHAgJAorCitwYWNrYWdlIFpMaWIuU3RyZWFtcyBpcworCisgICB0eXBlIFN0cmVhbV9Nb2RlIGlzIChJbl9TdHJlYW0sIE91dF9TdHJlYW0sIER1cGxleCk7CisKKyAgIHR5cGUgU3RyZWFtX0FjY2VzcyBpcyBhY2Nlc3MgYWxsIEFkYS5TdHJlYW1zLlJvb3RfU3RyZWFtX1R5cGUnQ2xhc3M7CisKKyAgIHR5cGUgU3RyZWFtX1R5cGUgaXMKKyAgICAgIG5ldyBBZGEuU3RyZWFtcy5Sb290X1N0cmVhbV9UeXBlIHdpdGggcHJpdmF0ZTsKKworICAgcHJvY2VkdXJlIFJlYWQKKyAgICAgKFN0cmVhbSA6IGluIG91dCBTdHJlYW1fVHlwZTsKKyAgICAgIEl0ZW0gICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKKyAgICAgIExhc3QgICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQpOworCisgICBwcm9jZWR1cmUgV3JpdGUKKyAgICAgKFN0cmVhbSA6IGluIG91dCBTdHJlYW1fVHlwZTsKKyAgICAgIEl0ZW0gICA6IGluICAgICBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheSk7CisKKyAgIHByb2NlZHVyZSBGbHVzaAorICAgICAoU3RyZWFtIDogaW4gb3V0IFN0cmVhbV9UeXBlOworICAgICAgTW9kZSAgIDogaW4gICAgIEZsdXNoX01vZGUgOj0gU3luY19GbHVzaCk7CisgICAtLSAgRmx1c2ggdGhlIHdyaXR0ZW4gZGF0YSB0byB0aGUgYmFjayBzdHJlYW0sCisgICAtLSAgYWxsIGRhdGEgcGxhY2VkIHRvIHRoZSBjb21wcmVzc29yIGlzIGZsdXNoaW5nIHRvIHRoZSBCYWNrIHN0cmVhbS4KKyAgIC0tICBTaG91bGQgbm90IGJlIHVzZWQgdW50aWxsIG5lY2Vzc2FyeSwgYmVjb3VzZSBpdCBpcyBkZWNyZWFzaW5nCisgICAtLSAgY29tcHJlc3Npb24uCisKKyAgIGZ1bmN0aW9uIFJlYWRfVG90YWxfSW4gKFN0cmVhbSA6IGluIFN0cmVhbV9UeXBlKSByZXR1cm4gQ291bnQ7CisgICBwcmFnbWEgSW5saW5lIChSZWFkX1RvdGFsX0luKTsKKyAgIC0tICBSZXR1cm4gdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBiYWNrIHN0cmVhbSBzbyBmYXIuCisKKyAgIGZ1bmN0aW9uIFJlYWRfVG90YWxfT3V0IChTdHJlYW0gOiBpbiBTdHJlYW1fVHlwZSkgcmV0dXJuIENvdW50OworICAgcHJhZ21hIElubGluZSAoUmVhZF9Ub3RhbF9PdXQpOworICAgLS0gIFJldHVybiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZCBzbyBmYXIuCisKKyAgIGZ1bmN0aW9uIFdyaXRlX1RvdGFsX0luIChTdHJlYW0gOiBpbiBTdHJlYW1fVHlwZSkgcmV0dXJuIENvdW50OworICAgcHJhZ21hIElubGluZSAoV3JpdGVfVG90YWxfSW4pOworICAgLS0gIFJldHVybiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBzbyBmYXIuCisKKyAgIGZ1bmN0aW9uIFdyaXRlX1RvdGFsX091dCAoU3RyZWFtIDogaW4gU3RyZWFtX1R5cGUpIHJldHVybiBDb3VudDsKKyAgIHByYWdtYSBJbmxpbmUgKFdyaXRlX1RvdGFsX091dCk7CisgICAtLSAgUmV0dXJuIHRvdGFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIHRoZSBiYWNrIHN0cmVhbS4KKworICAgcHJvY2VkdXJlIENyZWF0ZQorICAgICAoU3RyZWFtICAgICAgICAgICAgOiAgICBvdXQgU3RyZWFtX1R5cGU7CisgICAgICBNb2RlICAgICAgICAgICAgICA6IGluICAgICBTdHJlYW1fTW9kZTsKKyAgICAgIEJhY2sgICAgICAgICAgICAgIDogaW4gICAgIFN0cmVhbV9BY2Nlc3M7CisgICAgICBCYWNrX0NvbXByZXNzZWQgICA6IGluICAgICBCb29sZWFuOworICAgICAgTGV2ZWwgICAgICAgICAgICAgOiBpbiAgICAgQ29tcHJlc3Npb25fTGV2ZWwgOj0gRGVmYXVsdF9Db21wcmVzc2lvbjsKKyAgICAgIFN0cmF0ZWd5ICAgICAgICAgIDogaW4gICAgIFN0cmF0ZWd5X1R5cGUgICAgIDo9IERlZmF1bHRfU3RyYXRlZ3k7CisgICAgICBIZWFkZXIgICAgICAgICAgICA6IGluICAgICBIZWFkZXJfVHlwZSAgICAgICA6PSBEZWZhdWx0OworICAgICAgUmVhZF9CdWZmZXJfU2l6ZSAgOiBpbiAgICAgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6PSBEZWZhdWx0X0J1ZmZlcl9TaXplOworICAgICAgV3JpdGVfQnVmZmVyX1NpemUgOiBpbiAgICAgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6PSBEZWZhdWx0X0J1ZmZlcl9TaXplKTsKKyAgIC0tICBDcmVhdGUgdGhlIENvbXJlc3Npb24vRGVjb21wcmVzc2lvbiBzdHJlYW0uCisgICAtLSAgSWYgbW9kZSBpcyBJbl9TdHJlYW0gdGhlbiBXcml0ZSBvcGVyYXRpb24gaXMgZGlzYWJsZWQuCisgICAtLSAgSWYgbW9kZSBpcyBPdXRfU3RyZWFtIHRoZW4gUmVhZCBvcGVyYXRpb24gaXMgZGlzYWJsZWQuCisKKyAgIC0tICBJZiBCYWNrX0NvbXByZXNzZWQgaXMgdHJ1ZSB0aGVuCisgICAtLSAgRGF0YSB3cml0dGVuIHRvIHRoZSBTdHJlYW0gaXMgY29tcHJlc3NpbmcgdG8gdGhlIEJhY2sgc3RyZWFtCisgICAtLSAgYW5kIGRhdGEgcmVhZCBmcm9tIHRoZSBTdHJlYW0gaXMgZGVjb21wcmVzc2VkIGRhdGEgZnJvbSB0aGUgQmFjayBzdHJlYW0uCisKKyAgIC0tICBJZiBCYWNrX0NvbXByZXNzZWQgaXMgZmFsc2UgdGhlbgorICAgLS0gIERhdGEgd3JpdHRlbiB0byB0aGUgU3RyZWFtIGlzIGRlY29tcHJlc3NpbmcgdG8gdGhlIEJhY2sgc3RyZWFtCisgICAtLSAgYW5kIGRhdGEgcmVhZCBmcm9tIHRoZSBTdHJlYW0gaXMgY29tcHJlc3NlZCBkYXRhIGZyb20gdGhlIEJhY2sgc3RyZWFtLgorCisgICAtLSAgISEhIFdoZW4gdGhlIE5lZWRfSGVhZGVyIGlzIEZhbHNlIFpMaWItQWRhIGlzIHVzaW5nIHVuZG9jdW1lbnRlZAorICAgLS0gIFpMaWIgMS4xLjQgZnVuY3Rpb25hbGl0eSB0byBkbyBub3QgY3JlYXRlL3dhaXQgZm9yIFpMaWIgaGVhZGVycy4KKworICAgZnVuY3Rpb24gSXNfT3BlbiAoU3RyZWFtIDogU3RyZWFtX1R5cGUpIHJldHVybiBCb29sZWFuOworCisgICBwcm9jZWR1cmUgQ2xvc2UgKFN0cmVhbSA6IGluIG91dCBTdHJlYW1fVHlwZSk7CisKK3ByaXZhdGUKKworICAgdXNlIEFkYS5TdHJlYW1zOworCisgICB0eXBlIEJ1ZmZlcl9BY2Nlc3MgaXMgYWNjZXNzIGFsbCBTdHJlYW1fRWxlbWVudF9BcnJheTsKKworICAgdHlwZSBTdHJlYW1fVHlwZQorICAgICBpcyBuZXcgUm9vdF9TdHJlYW1fVHlwZSB3aXRoCisgICByZWNvcmQKKyAgICAgIE1vZGUgICAgICAgOiBTdHJlYW1fTW9kZTsKKworICAgICAgQnVmZmVyICAgICA6IEJ1ZmZlcl9BY2Nlc3M7CisgICAgICBSZXN0X0ZpcnN0IDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworICAgICAgUmVzdF9MYXN0ICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgIC0tICBCdWZmZXIgZm9yIFJlYWQgb3BlcmF0aW9uLgorICAgICAgLS0gIFdlIG5lZWQgdG8gaGF2ZSB0aGlzIGJ1ZmZlciBpbiB0aGUgcmVjb3JkCisgICAgICAtLSAgYmVjb3VzZSBub3QgYWxsIHJlYWQgZGF0YSBmcm9tIGJhY2sgc3RyZWFtCisgICAgICAtLSAgY291bGQgYmUgcHJvY2Vzc2VkIGR1cmluZyB0aGUgcmVhZCBvcGVyYXRpb24uCisKKyAgICAgIEJ1ZmZlcl9TaXplIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworICAgICAgLS0gIEJ1ZmZlciBzaXplIGZvciB3cml0ZSBvcGVyYXRpb24uCisgICAgICAtLSAgV2UgZG8gbm90IG5lZWQgdG8gaGF2ZSB0aGlzIGJ1ZmZlcgorICAgICAgLS0gIGluIHRoZSByZWNvcmQgYmVjb3VzZSBhbGwgZGF0YSBjb3VsZCBiZQorICAgICAgLS0gIHByb2Nlc3NlZCBpbiB0aGUgd3JpdGUgb3BlcmF0aW9uLgorCisgICAgICBCYWNrICAgICAgIDogU3RyZWFtX0FjY2VzczsKKyAgICAgIFJlYWRlciAgICAgOiBGaWx0ZXJfVHlwZTsKKyAgICAgIFdyaXRlciAgICAgOiBGaWx0ZXJfVHlwZTsKKyAgIGVuZCByZWNvcmQ7CisKK2VuZCBaTGliLlN0cmVhbXM7CmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL2FkYS96bGliLXRoaW4uYWRiIGIvemxpYi9zcmMvY29udHJpYi9hZGEvemxpYi10aGluLmFkYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2E0YTcxCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9hZGEvemxpYi10aGluLmFkYgpAQCAtMCwwICsxLDE0MSBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gIFpMaWIgZm9yIEFkYSB0aGljayBiaW5kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIERtaXRyaXkgQW5pc2lta292ICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gIE9wZW4gc291cmNlIGxpY2Vuc2UgaW5mb3JtYXRpb24gaXMgaW4gdGhlIHpsaWIuYWRzIGZpbGUuICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLSAgJElkOiB6bGliLXRoaW4uYWRiLHYgMS44IDIwMDMvMTIvMTQgMTg6Mjc6MzEgdmFndWwgRXhwICQKKworcGFja2FnZSBib2R5IFpMaWIuVGhpbiBpcworCisgICBaTElCX1ZFUlNJT04gIDogY29uc3RhbnQgQ2hhcnNfUHRyIDo9IHpsaWJWZXJzaW9uOworCisgICBaX1N0cmVhbV9TaXplIDogY29uc3RhbnQgSW50IDo9IFpfU3RyZWFtJ1NpemUgLyBTeXN0ZW0uU3RvcmFnZV9Vbml0OworCisgICAtLS0tLS0tLS0tLS0tLQorICAgLS0gQXZhaWxfSW4gLS0KKyAgIC0tLS0tLS0tLS0tLS0tCisKKyAgIGZ1bmN0aW9uIEF2YWlsX0luIChTdHJtIDogaW4gWl9TdHJlYW0pIHJldHVybiBVSW50IGlzCisgICBiZWdpbgorICAgICAgcmV0dXJuIFN0cm0uQXZhaWxfSW47CisgICBlbmQgQXZhaWxfSW47CisKKyAgIC0tLS0tLS0tLS0tLS0tLQorICAgLS0gQXZhaWxfT3V0IC0tCisgICAtLS0tLS0tLS0tLS0tLS0KKworICAgZnVuY3Rpb24gQXZhaWxfT3V0IChTdHJtIDogaW4gWl9TdHJlYW0pIHJldHVybiBVSW50IGlzCisgICBiZWdpbgorICAgICAgcmV0dXJuIFN0cm0uQXZhaWxfT3V0OworICAgZW5kIEF2YWlsX091dDsKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLSBEZWZsYXRlX0luaXQgLS0KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBmdW5jdGlvbiBEZWZsYXRlX0luaXQKKyAgICAgKHN0cm0gICAgICAgOiBaX1N0cmVhbXA7CisgICAgICBsZXZlbCAgICAgIDogSW50OworICAgICAgbWV0aG9kICAgICA6IEludDsKKyAgICAgIHdpbmRvd0JpdHMgOiBJbnQ7CisgICAgICBtZW1MZXZlbCAgIDogSW50OworICAgICAgc3RyYXRlZ3kgICA6IEludCkKKyAgICAgIHJldHVybiAgICAgICBJbnQgaXMKKyAgIGJlZ2luCisgICAgICByZXR1cm4gZGVmbGF0ZUluaXQyCisgICAgICAgICAgICAgICAoc3RybSwKKyAgICAgICAgICAgICAgICBsZXZlbCwKKyAgICAgICAgICAgICAgICBtZXRob2QsCisgICAgICAgICAgICAgICAgd2luZG93Qml0cywKKyAgICAgICAgICAgICAgICBtZW1MZXZlbCwKKyAgICAgICAgICAgICAgICBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICBaTElCX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgWl9TdHJlYW1fU2l6ZSk7CisgICBlbmQgRGVmbGF0ZV9Jbml0OworCisgICAtLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tIEluZmxhdGVfSW5pdCAtLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIGZ1bmN0aW9uIEluZmxhdGVfSW5pdCAoc3RybSA6IFpfU3RyZWFtcDsgd2luZG93Qml0cyA6IEludCkgcmV0dXJuIEludCBpcworICAgYmVnaW4KKyAgICAgIHJldHVybiBpbmZsYXRlSW5pdDIgKHN0cm0sIHdpbmRvd0JpdHMsIFpMSUJfVkVSU0lPTiwgWl9TdHJlYW1fU2l6ZSk7CisgICBlbmQgSW5mbGF0ZV9Jbml0OworCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tIExhc3RfRXJyb3JfTWVzc2FnZSAtLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIGZ1bmN0aW9uIExhc3RfRXJyb3JfTWVzc2FnZSAoU3RybSA6IGluIFpfU3RyZWFtKSByZXR1cm4gU3RyaW5nIGlzCisgICAgICB1c2UgSW50ZXJmYWNlcy5DLlN0cmluZ3M7CisgICBiZWdpbgorICAgICAgaWYgU3RybS5tc2cgPSBOdWxsX1B0ciB0aGVuCisgICAgICAgICByZXR1cm4gIiI7CisgICAgICBlbHNlCisgICAgICAgICByZXR1cm4gVmFsdWUgKFN0cm0ubXNnKTsKKyAgICAgIGVuZCBpZjsKKyAgIGVuZCBMYXN0X0Vycm9yX01lc3NhZ2U7CisKKyAgIC0tLS0tLS0tLS0tLQorICAgLS0gU2V0X0luIC0tCisgICAtLS0tLS0tLS0tLS0KKworICAgcHJvY2VkdXJlIFNldF9JbgorICAgICAoU3RybSAgIDogaW4gb3V0IFpfU3RyZWFtOworICAgICAgQnVmZmVyIDogaW4gICAgIFZvaWRwOworICAgICAgU2l6ZSAgIDogaW4gICAgIFVJbnQpIGlzCisgICBiZWdpbgorICAgICAgU3RybS5OZXh0X0luICA6PSBCdWZmZXI7CisgICAgICBTdHJtLkF2YWlsX0luIDo9IFNpemU7CisgICBlbmQgU2V0X0luOworCisgICAtLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tIFNldF9NZW1fRnVuYyAtLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIHByb2NlZHVyZSBTZXRfTWVtX0Z1bmMKKyAgICAgKFN0cm0gICA6IGluIG91dCBaX1N0cmVhbTsKKyAgICAgIE9wYXF1ZSA6IGluICAgICBWb2lkcDsKKyAgICAgIEFsbG9jICA6IGluICAgICBhbGxvY19mdW5jOworICAgICAgRnJlZSAgIDogaW4gICAgIGZyZWVfZnVuYykgaXMKKyAgIGJlZ2luCisgICAgICBTdHJtLm9wYXF1ZSA6PSBPcGFxdWU7CisgICAgICBTdHJtLnphbGxvYyA6PSBBbGxvYzsKKyAgICAgIFN0cm0uemZyZWUgIDo9IEZyZWU7CisgICBlbmQgU2V0X01lbV9GdW5jOworCisgICAtLS0tLS0tLS0tLS0tCisgICAtLSBTZXRfT3V0IC0tCisgICAtLS0tLS0tLS0tLS0tCisKKyAgIHByb2NlZHVyZSBTZXRfT3V0CisgICAgIChTdHJtICAgOiBpbiBvdXQgWl9TdHJlYW07CisgICAgICBCdWZmZXIgOiBpbiAgICAgVm9pZHA7CisgICAgICBTaXplICAgOiBpbiAgICAgVUludCkgaXMKKyAgIGJlZ2luCisgICAgICBTdHJtLk5leHRfT3V0ICA6PSBCdWZmZXI7CisgICAgICBTdHJtLkF2YWlsX091dCA6PSBTaXplOworICAgZW5kIFNldF9PdXQ7CisKKyAgIC0tLS0tLS0tLS0tLS0tCisgICAtLSBUb3RhbF9JbiAtLQorICAgLS0tLS0tLS0tLS0tLS0KKworICAgZnVuY3Rpb24gVG90YWxfSW4gKFN0cm0gOiBpbiBaX1N0cmVhbSkgcmV0dXJuIFVMb25nIGlzCisgICBiZWdpbgorICAgICAgcmV0dXJuIFN0cm0uVG90YWxfSW47CisgICBlbmQgVG90YWxfSW47CisKKyAgIC0tLS0tLS0tLS0tLS0tLQorICAgLS0gVG90YWxfT3V0IC0tCisgICAtLS0tLS0tLS0tLS0tLS0KKworICAgZnVuY3Rpb24gVG90YWxfT3V0IChTdHJtIDogaW4gWl9TdHJlYW0pIHJldHVybiBVTG9uZyBpcworICAgYmVnaW4KKyAgICAgIHJldHVybiBTdHJtLlRvdGFsX091dDsKKyAgIGVuZCBUb3RhbF9PdXQ7CisKK2VuZCBaTGliLlRoaW47CmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL2FkYS96bGliLXRoaW4uYWRzIGIvemxpYi9zcmMvY29udHJpYi9hZGEvemxpYi10aGluLmFkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDQwN2ViCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9hZGEvemxpYi10aGluLmFkcwpAQCAtMCwwICsxLDQ1MCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gIFpMaWIgZm9yIEFkYSB0aGljayBiaW5kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIERtaXRyaXkgQW5pc2lta292ICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gIE9wZW4gc291cmNlIGxpY2Vuc2UgaW5mb3JtYXRpb24gaXMgaW4gdGhlIHpsaWIuYWRzIGZpbGUuICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLSAgJElkOiB6bGliLXRoaW4uYWRzLHYgMS4xMSAyMDA0LzA3LzIzIDA2OjMzOjExIHZhZ3VsIEV4cCAkCisKK3dpdGggSW50ZXJmYWNlcy5DLlN0cmluZ3M7CisKK3dpdGggU3lzdGVtOworCitwcml2YXRlIHBhY2thZ2UgWkxpYi5UaGluIGlzCisKKyAgIC0tICBGcm9tIHpjb25mLmgKKworICAgTUFYX01FTV9MRVZFTCA6IGNvbnN0YW50IDo9IDk7ICAgICAgICAgLS0gIHpjb25mLmg6MTA1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemNvbmYuaDoxMDUKKyAgIE1BWF9XQklUUyA6IGNvbnN0YW50IDo9IDE1OyAgICAgIC0tICB6Y29uZi5oOjExNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIDMySyBMWjc3IHdpbmRvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpjb25mLmg6MTE1CisgICBTRUVLX1NFVCA6IGNvbnN0YW50IDo9IDgjMDAwMCM7ICAtLSAgemNvbmYuaDoyNDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICBTZWVrIGZyb20gYmVnaW5uaW5nIG9mIGZpbGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemNvbmYuaDoyNDQKKyAgIFNFRUtfQ1VSIDogY29uc3RhbnQgOj0gMTsgICAgICAgIC0tICB6Y29uZi5oOjI0NQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIFNlZWsgZnJvbSBjdXJyZW50IHBvc2l0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpjb25mLmg6MjQ1CisgICBTRUVLX0VORCA6IGNvbnN0YW50IDo9IDI7ICAgICAgICAtLSAgemNvbmYuaDoyNDYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICBTZXQgZmlsZSBwb2ludGVyIHRvIEVPRiBwbHVzICJvZmZzZXQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemNvbmYuaDoyNDYKKworICAgdHlwZSBCeXRlIGlzIG5ldyBJbnRlcmZhY2VzLkMudW5zaWduZWRfY2hhcjsgLS0gIDggYml0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpjb25mLmg6MjE0CisgICB0eXBlIFVJbnQgaXMgbmV3IEludGVyZmFjZXMuQy51bnNpZ25lZDsgICAgICAtLSAgMTYgYml0cyBvciBtb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemNvbmYuaDoyMTYKKyAgIHR5cGUgSW50IGlzIG5ldyBJbnRlcmZhY2VzLkMuaW50OworCisgICB0eXBlIFVMb25nIGlzIG5ldyBJbnRlcmZhY2VzLkMudW5zaWduZWRfbG9uZzsgICAgIC0tICAzMiBiaXRzIG9yIG1vcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpjb25mLmg6MjE3CisgICBzdWJ0eXBlIENoYXJzX1B0ciBpcyBJbnRlcmZhY2VzLkMuU3RyaW5ncy5jaGFyc19wdHI7CisKKyAgIHR5cGUgVUxvbmdfQWNjZXNzIGlzIGFjY2VzcyBVTG9uZzsKKyAgIHR5cGUgSW50X0FjY2VzcyBpcyBhY2Nlc3MgSW50OworCisgICBzdWJ0eXBlIFZvaWRwIGlzIFN5c3RlbS5BZGRyZXNzOyAgICAgICAgICAgIC0tICB6Y29uZi5oOjIzMgorCisgICBzdWJ0eXBlIEJ5dGVfQWNjZXNzIGlzIFZvaWRwOworCisgICBOdWwgOiBjb25zdGFudCBWb2lkcCA6PSBTeXN0ZW0uTnVsbF9BZGRyZXNzOworICAgLS0gIGVuZCBmcm9tIHpjb25mCisKKyAgIFpfTk9fRkxVU0ggOiBjb25zdGFudCA6PSA4IzAwMDAjOyAgIC0tICB6bGliLmg6MTI1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjEyNQorICAgWl9QQVJUSUFMX0ZMVVNIIDogY29uc3RhbnQgOj0gMTsgICAgICAgLS0gIHpsaWIuaDoxMjYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB3aWxsIGJlIHJlbW92ZWQsIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIFpfU1lOQ19GTFVTSCBpbnN0ZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjEyNgorICAgWl9TWU5DX0ZMVVNIIDogY29uc3RhbnQgOj0gMjsgICAgICAgLS0gIHpsaWIuaDoxMjcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTI3CisgICBaX0ZVTExfRkxVU0ggOiBjb25zdGFudCA6PSAzOyAgICAgICAtLSAgemxpYi5oOjEyOAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxMjgKKyAgIFpfRklOSVNIIDogY29uc3RhbnQgOj0gNDsgICAgICAgIC0tICB6bGliLmg6MTI5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjEyOQorICAgWl9PSyA6IGNvbnN0YW50IDo9IDgjMDAwMCM7ICAgLS0gIHpsaWIuaDoxMzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTMyCisgICBaX1NUUkVBTV9FTkQgOiBjb25zdGFudCA6PSAxOyAgICAgICAtLSAgemxpYi5oOjEzMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxMzMKKyAgIFpfTkVFRF9ESUNUIDogY29uc3RhbnQgOj0gMjsgICAgICAgIC0tICB6bGliLmg6MTM0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjEzNAorICAgWl9FUlJOTyA6IGNvbnN0YW50IDo9IC0xOyAgICAgICAgLS0gIHpsaWIuaDoxMzUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTM1CisgICBaX1NUUkVBTV9FUlJPUiA6IGNvbnN0YW50IDo9IC0yOyAgICAgICAtLSAgemxpYi5oOjEzNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxMzYKKyAgIFpfREFUQV9FUlJPUiA6IGNvbnN0YW50IDo9IC0zOyAgICAgIC0tICB6bGliLmg6MTM3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjEzNworICAgWl9NRU1fRVJST1IgOiBjb25zdGFudCA6PSAtNDsgICAgICAgLS0gIHpsaWIuaDoxMzgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTM4CisgICBaX0JVRl9FUlJPUiA6IGNvbnN0YW50IDo9IC01OyAgICAgICAtLSAgemxpYi5oOjEzOQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxMzkKKyAgIFpfVkVSU0lPTl9FUlJPUiA6IGNvbnN0YW50IDo9IC02OyAgICAgIC0tICB6bGliLmg6MTQwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjE0MAorICAgWl9OT19DT01QUkVTU0lPTiA6IGNvbnN0YW50IDo9IDgjMDAwMCM7ICAgLS0gIHpsaWIuaDoxNDUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTQ1CisgICBaX0JFU1RfU1BFRUQgOiBjb25zdGFudCA6PSAxOyAgICAgICAtLSAgemxpYi5oOjE0NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxNDYKKyAgIFpfQkVTVF9DT01QUkVTU0lPTiA6IGNvbnN0YW50IDo9IDk7ICAgICAgIC0tICB6bGliLmg6MTQ3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjE0NworICAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OIDogY29uc3RhbnQgOj0gLTE7ICAgICAgLS0gIHpsaWIuaDoxNDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTQ4CisgICBaX0ZJTFRFUkVEIDogY29uc3RhbnQgOj0gMTsgICAgICAtLSAgemxpYi5oOjE1MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxNTEKKyAgIFpfSFVGRk1BTl9PTkxZIDogY29uc3RhbnQgOj0gMjsgICAgICAgIC0tICB6bGliLmg6MTUyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjE1MgorICAgWl9ERUZBVUxUX1NUUkFURUdZIDogY29uc3RhbnQgOj0gOCMwMDAwIzsgLS0gIHpsaWIuaDoxNTMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTUzCisgICBaX0JJTkFSWSA6IGNvbnN0YW50IDo9IDgjMDAwMCM7ICAtLSAgemxpYi5oOjE1NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxNTYKKyAgIFpfQVNDSUkgOiBjb25zdGFudCA6PSAxOyAgICAgIC0tICB6bGliLmg6MTU3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjE1NworICAgWl9VTktOT1dOIDogY29uc3RhbnQgOj0gMjsgICAgICAgLS0gIHpsaWIuaDoxNTgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTU4CisgICBaX0RFRkxBVEVEIDogY29uc3RhbnQgOj0gODsgICAgICAtLSAgemxpYi5oOjE2MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxNjEKKyAgIFpfTlVMTCA6IGNvbnN0YW50IDo9IDgjMDAwMCM7IC0tICB6bGliLmg6MTY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgZm9yIGluaXRpYWxpemluZyB6YWxsb2MsIHpmcmVlLCBvcGFxdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTY0CisgICB0eXBlIGd6RmlsZSBpcyBuZXcgVm9pZHA7ICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDo2NDYKKworICAgdHlwZSBaX1N0cmVhbSBpcyBwcml2YXRlOworCisgICB0eXBlIFpfU3RyZWFtcCBpcyBhY2Nlc3MgYWxsIFpfU3RyZWFtOyAgICAgLS0gIHpsaWIuaDo4OQorCisgICB0eXBlIGFsbG9jX2Z1bmMgaXMgYWNjZXNzIGZ1bmN0aW9uCisgICAgIChPcGFxdWUgOiBWb2lkcDsKKyAgICAgIEl0ZW1zICA6IFVJbnQ7CisgICAgICBTaXplICAgOiBVSW50KQorICAgICAgcmV0dXJuIFZvaWRwOyAtLSAgemxpYi5oOjYzCisKKyAgIHR5cGUgZnJlZV9mdW5jIGlzIGFjY2VzcyBwcm9jZWR1cmUgKG9wYXF1ZSA6IFZvaWRwOyBhZGRyZXNzIDogVm9pZHApOworCisgICBmdW5jdGlvbiB6bGliVmVyc2lvbiByZXR1cm4gQ2hhcnNfUHRyOworCisgICBmdW5jdGlvbiBEZWZsYXRlIChzdHJtIDogWl9TdHJlYW1wOyBmbHVzaCA6IEludCkgcmV0dXJuIEludDsKKworICAgZnVuY3Rpb24gRGVmbGF0ZUVuZCAoc3RybSA6IFpfU3RyZWFtcCkgcmV0dXJuIEludDsKKworICAgZnVuY3Rpb24gSW5mbGF0ZSAoc3RybSA6IFpfU3RyZWFtcDsgZmx1c2ggOiBJbnQpIHJldHVybiBJbnQ7CisKKyAgIGZ1bmN0aW9uIEluZmxhdGVFbmQgKHN0cm0gOiBaX1N0cmVhbXApIHJldHVybiBJbnQ7CisKKyAgIGZ1bmN0aW9uIGRlZmxhdGVTZXREaWN0aW9uYXJ5CisgICAgIChzdHJtICAgICAgIDogWl9TdHJlYW1wOworICAgICAgZGljdGlvbmFyeSA6IEJ5dGVfQWNjZXNzOworICAgICAgZGljdExlbmd0aCA6IFVJbnQpCisgICAgICByZXR1cm4gICAgICAgSW50OworCisgICBmdW5jdGlvbiBkZWZsYXRlQ29weSAoZGVzdCA6IFpfU3RyZWFtcDsgc291cmNlIDogWl9TdHJlYW1wKSByZXR1cm4gSW50OworICAgLS0gIHpsaWIuaDo0NzgKKworICAgZnVuY3Rpb24gZGVmbGF0ZVJlc2V0IChzdHJtIDogWl9TdHJlYW1wKSByZXR1cm4gSW50OyAtLSB6bGliLmg6NDk1CisKKyAgIGZ1bmN0aW9uIGRlZmxhdGVQYXJhbXMKKyAgICAgKHN0cm0gICAgIDogWl9TdHJlYW1wOworICAgICAgbGV2ZWwgICAgOiBJbnQ7CisgICAgICBzdHJhdGVneSA6IEludCkKKyAgICAgIHJldHVybiAgICAgSW50OyAgICAgICAtLSB6bGliLmg6NTA2CisKKyAgIGZ1bmN0aW9uIGluZmxhdGVTZXREaWN0aW9uYXJ5CisgICAgIChzdHJtICAgICAgIDogWl9TdHJlYW1wOworICAgICAgZGljdGlvbmFyeSA6IEJ5dGVfQWNjZXNzOworICAgICAgZGljdExlbmd0aCA6IFVJbnQpCisgICAgICByZXR1cm4gICAgICAgSW50OyAtLSAgemxpYi5oOjU0OAorCisgICBmdW5jdGlvbiBpbmZsYXRlU3luYyAoc3RybSA6IFpfU3RyZWFtcCkgcmV0dXJuIEludDsgIC0tICB6bGliLmg6NTY1CisKKyAgIGZ1bmN0aW9uIGluZmxhdGVSZXNldCAoc3RybSA6IFpfU3RyZWFtcCkgcmV0dXJuIEludDsgLS0gIHpsaWIuaDo1ODAKKworICAgZnVuY3Rpb24gY29tcHJlc3MKKyAgICAgKGRlc3QgICAgICA6IEJ5dGVfQWNjZXNzOworICAgICAgZGVzdExlbiAgIDogVUxvbmdfQWNjZXNzOworICAgICAgc291cmNlICAgIDogQnl0ZV9BY2Nlc3M7CisgICAgICBzb3VyY2VMZW4gOiBVTG9uZykKKyAgICAgIHJldHVybiAgICAgIEludDsgICAgICAgICAgIC0tIHpsaWIuaDo2MDEKKworICAgZnVuY3Rpb24gY29tcHJlc3MyCisgICAgIChkZXN0ICAgICAgOiBCeXRlX0FjY2VzczsKKyAgICAgIGRlc3RMZW4gICA6IFVMb25nX0FjY2VzczsKKyAgICAgIHNvdXJjZSAgICA6IEJ5dGVfQWNjZXNzOworICAgICAgc291cmNlTGVuIDogVUxvbmc7CisgICAgICBsZXZlbCAgICAgOiBJbnQpCisgICAgICByZXR1cm4gICAgICBJbnQ7ICAgICAgICAgIC0tIHpsaWIuaDo2MTUKKworICAgZnVuY3Rpb24gdW5jb21wcmVzcworICAgICAoZGVzdCAgICAgIDogQnl0ZV9BY2Nlc3M7CisgICAgICBkZXN0TGVuICAgOiBVTG9uZ19BY2Nlc3M7CisgICAgICBzb3VyY2UgICAgOiBCeXRlX0FjY2VzczsKKyAgICAgIHNvdXJjZUxlbiA6IFVMb25nKQorICAgICAgcmV0dXJuICAgICAgSW50OworCisgICBmdW5jdGlvbiBnem9wZW4gKHBhdGggOiBDaGFyc19QdHI7IG1vZGUgOiBDaGFyc19QdHIpIHJldHVybiBnekZpbGU7CisKKyAgIGZ1bmN0aW9uIGd6ZG9wZW4gKGZkIDogSW50OyBtb2RlIDogQ2hhcnNfUHRyKSByZXR1cm4gZ3pGaWxlOworCisgICBmdW5jdGlvbiBnenNldHBhcmFtcworICAgICAoZmlsZSAgICAgOiBnekZpbGU7CisgICAgICBsZXZlbCAgICA6IEludDsKKyAgICAgIHN0cmF0ZWd5IDogSW50KQorICAgICAgcmV0dXJuICAgICBJbnQ7CisKKyAgIGZ1bmN0aW9uIGd6cmVhZAorICAgICAoZmlsZSA6IGd6RmlsZTsKKyAgICAgIGJ1ZiAgOiBWb2lkcDsKKyAgICAgIGxlbiAgOiBVSW50KQorICAgICAgcmV0dXJuIEludDsKKworICAgZnVuY3Rpb24gZ3p3cml0ZQorICAgICAoZmlsZSA6IGluIGd6RmlsZTsKKyAgICAgIGJ1ZiAgOiBpbiBWb2lkcDsKKyAgICAgIGxlbiAgOiBpbiBVSW50KQorICAgICAgcmV0dXJuIEludDsKKworICAgZnVuY3Rpb24gZ3pwcmludGYgKGZpbGUgOiBpbiBnekZpbGU7IGZvcm1hdCA6IGluIENoYXJzX1B0cikgcmV0dXJuIEludDsKKworICAgZnVuY3Rpb24gZ3pwdXRzIChmaWxlIDogaW4gZ3pGaWxlOyBzIDogaW4gQ2hhcnNfUHRyKSByZXR1cm4gSW50OworCisgICBmdW5jdGlvbiBnemdldHMKKyAgICAgKGZpbGUgOiBnekZpbGU7CisgICAgICBidWYgIDogQ2hhcnNfUHRyOworICAgICAgbGVuICA6IEludCkKKyAgICAgIHJldHVybiBDaGFyc19QdHI7CisKKyAgIGZ1bmN0aW9uIGd6cHV0YyAoZmlsZSA6IGd6RmlsZTsgY2hhciA6IEludCkgcmV0dXJuIEludDsKKworICAgZnVuY3Rpb24gZ3pnZXRjIChmaWxlIDogZ3pGaWxlKSByZXR1cm4gSW50OworCisgICBmdW5jdGlvbiBnemZsdXNoIChmaWxlIDogZ3pGaWxlOyBmbHVzaCA6IEludCkgcmV0dXJuIEludDsKKworICAgZnVuY3Rpb24gZ3pzZWVrCisgICAgIChmaWxlICAgOiBnekZpbGU7CisgICAgICBvZmZzZXQgOiBJbnQ7CisgICAgICB3aGVuY2UgOiBJbnQpCisgICAgICByZXR1cm4gICBJbnQ7CisKKyAgIGZ1bmN0aW9uIGd6cmV3aW5kIChmaWxlIDogZ3pGaWxlKSByZXR1cm4gSW50OworCisgICBmdW5jdGlvbiBnenRlbGwgKGZpbGUgOiBnekZpbGUpIHJldHVybiBJbnQ7CisKKyAgIGZ1bmN0aW9uIGd6ZW9mIChmaWxlIDogZ3pGaWxlKSByZXR1cm4gSW50OworCisgICBmdW5jdGlvbiBnemNsb3NlIChmaWxlIDogZ3pGaWxlKSByZXR1cm4gSW50OworCisgICBmdW5jdGlvbiBnemVycm9yIChmaWxlIDogZ3pGaWxlOyBlcnJudW0gOiBJbnRfQWNjZXNzKSByZXR1cm4gQ2hhcnNfUHRyOworCisgICBmdW5jdGlvbiBhZGxlcjMyCisgICAgIChhZGxlciA6IFVMb25nOworICAgICAgYnVmICAgOiBCeXRlX0FjY2VzczsKKyAgICAgIGxlbiAgIDogVUludCkKKyAgICAgIHJldHVybiAgVUxvbmc7CisKKyAgIGZ1bmN0aW9uIGNyYzMyCisgICAgIChjcmMgIDogVUxvbmc7CisgICAgICBidWYgIDogQnl0ZV9BY2Nlc3M7CisgICAgICBsZW4gIDogVUludCkKKyAgICAgIHJldHVybiBVTG9uZzsKKworICAgZnVuY3Rpb24gZGVmbGF0ZUluaXQKKyAgICAgKHN0cm0gICAgICAgIDogWl9TdHJlYW1wOworICAgICAgbGV2ZWwgICAgICAgOiBJbnQ7CisgICAgICB2ZXJzaW9uICAgICA6IENoYXJzX1B0cjsKKyAgICAgIHN0cmVhbV9zaXplIDogSW50KQorICAgICAgcmV0dXJuICAgICAgICBJbnQ7CisKKyAgIGZ1bmN0aW9uIGRlZmxhdGVJbml0MgorICAgICAoc3RybSAgICAgICAgOiBaX1N0cmVhbXA7CisgICAgICBsZXZlbCAgICAgICA6IEludDsKKyAgICAgIG1ldGhvZCAgICAgIDogSW50OworICAgICAgd2luZG93Qml0cyAgOiBJbnQ7CisgICAgICBtZW1MZXZlbCAgICA6IEludDsKKyAgICAgIHN0cmF0ZWd5ICAgIDogSW50OworICAgICAgdmVyc2lvbiAgICAgOiBDaGFyc19QdHI7CisgICAgICBzdHJlYW1fc2l6ZSA6IEludCkKKyAgICAgIHJldHVybiAgICAgICAgSW50OworCisgICBmdW5jdGlvbiBEZWZsYXRlX0luaXQKKyAgICAgKHN0cm0gICAgICAgOiBaX1N0cmVhbXA7CisgICAgICBsZXZlbCAgICAgIDogSW50OworICAgICAgbWV0aG9kICAgICA6IEludDsKKyAgICAgIHdpbmRvd0JpdHMgOiBJbnQ7CisgICAgICBtZW1MZXZlbCAgIDogSW50OworICAgICAgc3RyYXRlZ3kgICA6IEludCkKKyAgICAgIHJldHVybiAgICAgICBJbnQ7CisgICBwcmFnbWEgSW5saW5lIChEZWZsYXRlX0luaXQpOworCisgICBmdW5jdGlvbiBpbmZsYXRlSW5pdAorICAgICAoc3RybSAgICAgICAgOiBaX1N0cmVhbXA7CisgICAgICB2ZXJzaW9uICAgICA6IENoYXJzX1B0cjsKKyAgICAgIHN0cmVhbV9zaXplIDogSW50KQorICAgICAgcmV0dXJuICAgICAgICBJbnQ7CisKKyAgIGZ1bmN0aW9uIGluZmxhdGVJbml0MgorICAgICAoc3RybSAgICAgICAgOiBpbiBaX1N0cmVhbXA7CisgICAgICB3aW5kb3dCaXRzICA6IGluIEludDsKKyAgICAgIHZlcnNpb24gICAgIDogaW4gQ2hhcnNfUHRyOworICAgICAgc3RyZWFtX3NpemUgOiBpbiBJbnQpCisgICAgICByZXR1cm4gICAgICBJbnQ7CisKKyAgIGZ1bmN0aW9uIGluZmxhdGVCYWNrSW5pdAorICAgICAoc3RybSAgICAgICAgOiBpbiBaX1N0cmVhbXA7CisgICAgICB3aW5kb3dCaXRzICA6IGluIEludDsKKyAgICAgIHdpbmRvdyAgICAgIDogaW4gQnl0ZV9BY2Nlc3M7CisgICAgICB2ZXJzaW9uICAgICA6IGluIENoYXJzX1B0cjsKKyAgICAgIHN0cmVhbV9zaXplIDogaW4gSW50KQorICAgICAgcmV0dXJuICAgICAgSW50OworICAgLS0gIFNpemUgb2Ygd2luZG93IGhhdmUgdG8gYmUgMioqd2luZG93Qml0cy4KKworICAgZnVuY3Rpb24gSW5mbGF0ZV9Jbml0IChzdHJtIDogWl9TdHJlYW1wOyB3aW5kb3dCaXRzIDogSW50KSByZXR1cm4gSW50OworICAgcHJhZ21hIElubGluZSAoSW5mbGF0ZV9Jbml0KTsKKworICAgZnVuY3Rpb24gekVycm9yIChlcnIgOiBJbnQpIHJldHVybiBDaGFyc19QdHI7CisKKyAgIGZ1bmN0aW9uIGluZmxhdGVTeW5jUG9pbnQgKHogOiBaX1N0cmVhbXApIHJldHVybiBJbnQ7CisKKyAgIGZ1bmN0aW9uIGdldF9jcmNfdGFibGUgcmV0dXJuIFVMb25nX0FjY2VzczsKKworICAgLS0gIEludGVyZmFjZSB0byB0aGUgYXZhaWxhYmxlIGZpZWxkcyBvZiB0aGUgel9zdHJlYW0gc3RydWN0dXJlLgorICAgLS0gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbiB3aGVuIGF2YWlsX2luIGhhcworICAgLS0gIGRyb3BwZWQgdG8gemVyby4gSXQgbXVzdCB1cGRhdGUgbmV4dF9vdXQgYW5kIGF2YWlsX291dCB3aGVuIGF2YWlsX291dAorICAgLS0gIGhhcyBkcm9wcGVkIHRvIHplcm8uIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGluaXRpYWxpemUgemFsbG9jLCB6ZnJlZSBhbmQKKyAgIC0tICBvcGFxdWUgYmVmb3JlIGNhbGxpbmcgdGhlIGluaXQgZnVuY3Rpb24uCisKKyAgIHByb2NlZHVyZSBTZXRfSW4KKyAgICAgKFN0cm0gICA6IGluIG91dCBaX1N0cmVhbTsKKyAgICAgIEJ1ZmZlciA6IGluIFZvaWRwOworICAgICAgU2l6ZSAgIDogaW4gVUludCk7CisgICBwcmFnbWEgSW5saW5lIChTZXRfSW4pOworCisgICBwcm9jZWR1cmUgU2V0X091dAorICAgICAoU3RybSAgIDogaW4gb3V0IFpfU3RyZWFtOworICAgICAgQnVmZmVyIDogaW4gVm9pZHA7CisgICAgICBTaXplICAgOiBpbiBVSW50KTsKKyAgIHByYWdtYSBJbmxpbmUgKFNldF9PdXQpOworCisgICBwcm9jZWR1cmUgU2V0X01lbV9GdW5jCisgICAgIChTdHJtICAgOiBpbiBvdXQgWl9TdHJlYW07CisgICAgICBPcGFxdWUgOiBpbiBWb2lkcDsKKyAgICAgIEFsbG9jICA6IGluIGFsbG9jX2Z1bmM7CisgICAgICBGcmVlICAgOiBpbiBmcmVlX2Z1bmMpOworICAgcHJhZ21hIElubGluZSAoU2V0X01lbV9GdW5jKTsKKworICAgZnVuY3Rpb24gTGFzdF9FcnJvcl9NZXNzYWdlIChTdHJtIDogaW4gWl9TdHJlYW0pIHJldHVybiBTdHJpbmc7CisgICBwcmFnbWEgSW5saW5lIChMYXN0X0Vycm9yX01lc3NhZ2UpOworCisgICBmdW5jdGlvbiBBdmFpbF9PdXQgKFN0cm0gOiBpbiBaX1N0cmVhbSkgcmV0dXJuIFVJbnQ7CisgICBwcmFnbWEgSW5saW5lIChBdmFpbF9PdXQpOworCisgICBmdW5jdGlvbiBBdmFpbF9JbiAoU3RybSA6IGluIFpfU3RyZWFtKSByZXR1cm4gVUludDsKKyAgIHByYWdtYSBJbmxpbmUgKEF2YWlsX0luKTsKKworICAgZnVuY3Rpb24gVG90YWxfSW4gKFN0cm0gOiBpbiBaX1N0cmVhbSkgcmV0dXJuIFVMb25nOworICAgcHJhZ21hIElubGluZSAoVG90YWxfSW4pOworCisgICBmdW5jdGlvbiBUb3RhbF9PdXQgKFN0cm0gOiBpbiBaX1N0cmVhbSkgcmV0dXJuIFVMb25nOworICAgcHJhZ21hIElubGluZSAoVG90YWxfT3V0KTsKKworICAgZnVuY3Rpb24gaW5mbGF0ZUNvcHkKKyAgICAgKGRlc3QgICA6IGluIFpfU3RyZWFtcDsKKyAgICAgIFNvdXJjZSA6IGluIFpfU3RyZWFtcCkKKyAgICAgIHJldHVybiBJbnQ7CisKKyAgIGZ1bmN0aW9uIGNvbXByZXNzQm91bmQgKFNvdXJjZV9MZW4gOiBpbiBVTG9uZykgcmV0dXJuIFVMb25nOworCisgICBmdW5jdGlvbiBkZWZsYXRlQm91bmQKKyAgICAgKFN0cm0gICAgICAgOiBpbiBaX1N0cmVhbXA7CisgICAgICBTb3VyY2VfTGVuIDogaW4gVUxvbmcpCisgICAgICByZXR1cm4gICAgIFVMb25nOworCisgICBmdW5jdGlvbiBnenVuZ2V0YyAoQyA6IGluIEludDsgRmlsZSA6IGluICBnekZpbGUpIHJldHVybiBJbnQ7CisKKyAgIGZ1bmN0aW9uIHpsaWJDb21waWxlRmxhZ3MgcmV0dXJuIFVMb25nOworCitwcml2YXRlCisKKyAgIHR5cGUgWl9TdHJlYW0gaXMgcmVjb3JkICAgICAgICAgICAgLS0gemxpYi5oOjY4CisgICAgICBOZXh0X0luICAgOiBWb2lkcCAgICAgIDo9IE51bDsgIC0tIG5leHQgaW5wdXQgYnl0ZQorICAgICAgQXZhaWxfSW4gIDogVUludCAgICAgICA6PSAwOyAgICAtLSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IG5leHRfaW4KKyAgICAgIFRvdGFsX0luICA6IFVMb25nICAgICAgOj0gMDsgICAgLS0gdG90YWwgbmIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIKKyAgICAgIE5leHRfT3V0ICA6IFZvaWRwICAgICAgOj0gTnVsOyAgLS0gbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlCisgICAgICBBdmFpbF9PdXQgOiBVSW50ICAgICAgIDo9IDA7ICAgIC0tIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IG5leHRfb3V0CisgICAgICBUb3RhbF9PdXQgOiBVTG9uZyAgICAgIDo9IDA7ICAgIC0tIHRvdGFsIG5iIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIKKyAgICAgIG1zZyAgICAgICA6IENoYXJzX1B0cjsgICAgICAgICAgLS0gbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yCisgICAgICBzdGF0ZSAgICAgOiBWb2lkcDsgICAgICAgICAgICAgIC0tIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucworICAgICAgemFsbG9jICAgIDogYWxsb2NfZnVuYyA6PSBudWxsOyAtLSB1c2VkIHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZQorICAgICAgemZyZWUgICAgIDogZnJlZV9mdW5jICA6PSBudWxsOyAtLSB1c2VkIHRvIGZyZWUgdGhlIGludGVybmFsIHN0YXRlCisgICAgICBvcGFxdWUgICAgOiBWb2lkcDsgICAgICAgICAgICAgIC0tIHByaXZhdGUgZGF0YSBvYmplY3QgcGFzc2VkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6YWxsb2MgYW5kIHpmcmVlCisgICAgICBkYXRhX3R5cGUgOiBJbnQ7ICAgICAgICAgICAgICAgIC0tIGJlc3QgZ3Vlc3MgYWJvdXQgdGhlIGRhdGEgdHlwZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIGFzY2lpIG9yIGJpbmFyeQorICAgICAgYWRsZXIgICAgIDogVUxvbmc7ICAgICAgICAgICAgICAtLSBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIGRhdGEKKyAgICAgIHJlc2VydmVkICA6IFVMb25nOyAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKKyAgIGVuZCByZWNvcmQ7CisKKyAgIHByYWdtYSBDb252ZW50aW9uIChDLCBaX1N0cmVhbSk7CisKKyAgIHByYWdtYSBJbXBvcnQgKEMsIHpsaWJWZXJzaW9uLCAiemxpYlZlcnNpb24iKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIERlZmxhdGUsICJkZWZsYXRlIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBEZWZsYXRlRW5kLCAiZGVmbGF0ZUVuZCIpOworICAgcHJhZ21hIEltcG9ydCAoQywgSW5mbGF0ZSwgImluZmxhdGUiKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIEluZmxhdGVFbmQsICJpbmZsYXRlRW5kIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBkZWZsYXRlU2V0RGljdGlvbmFyeSwgImRlZmxhdGVTZXREaWN0aW9uYXJ5Iik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBkZWZsYXRlQ29weSwgImRlZmxhdGVDb3B5Iik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBkZWZsYXRlUmVzZXQsICJkZWZsYXRlUmVzZXQiKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIGRlZmxhdGVQYXJhbXMsICJkZWZsYXRlUGFyYW1zIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBpbmZsYXRlU2V0RGljdGlvbmFyeSwgImluZmxhdGVTZXREaWN0aW9uYXJ5Iik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBpbmZsYXRlU3luYywgImluZmxhdGVTeW5jIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBpbmZsYXRlUmVzZXQsICJpbmZsYXRlUmVzZXQiKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIGNvbXByZXNzLCAiY29tcHJlc3MiKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIGNvbXByZXNzMiwgImNvbXByZXNzMiIpOworICAgcHJhZ21hIEltcG9ydCAoQywgdW5jb21wcmVzcywgInVuY29tcHJlc3MiKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIGd6b3BlbiwgImd6b3BlbiIpOworICAgcHJhZ21hIEltcG9ydCAoQywgZ3pkb3BlbiwgImd6ZG9wZW4iKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIGd6c2V0cGFyYW1zLCAiZ3pzZXRwYXJhbXMiKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIGd6cmVhZCwgImd6cmVhZCIpOworICAgcHJhZ21hIEltcG9ydCAoQywgZ3p3cml0ZSwgImd6d3JpdGUiKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIGd6cHJpbnRmLCAiZ3pwcmludGYiKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIGd6cHV0cywgImd6cHV0cyIpOworICAgcHJhZ21hIEltcG9ydCAoQywgZ3pnZXRzLCAiZ3pnZXRzIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBnenB1dGMsICJnenB1dGMiKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIGd6Z2V0YywgImd6Z2V0YyIpOworICAgcHJhZ21hIEltcG9ydCAoQywgZ3pmbHVzaCwgImd6Zmx1c2giKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIGd6c2VlaywgImd6c2VlayIpOworICAgcHJhZ21hIEltcG9ydCAoQywgZ3pyZXdpbmQsICJnenJld2luZCIpOworICAgcHJhZ21hIEltcG9ydCAoQywgZ3p0ZWxsLCAiZ3p0ZWxsIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBnemVvZiwgImd6ZW9mIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBnemNsb3NlLCAiZ3pjbG9zZSIpOworICAgcHJhZ21hIEltcG9ydCAoQywgZ3plcnJvciwgImd6ZXJyb3IiKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIGFkbGVyMzIsICJhZGxlcjMyIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBjcmMzMiwgImNyYzMyIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBkZWZsYXRlSW5pdCwgImRlZmxhdGVJbml0XyIpOworICAgcHJhZ21hIEltcG9ydCAoQywgaW5mbGF0ZUluaXQsICJpbmZsYXRlSW5pdF8iKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIGRlZmxhdGVJbml0MiwgImRlZmxhdGVJbml0Ml8iKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIGluZmxhdGVJbml0MiwgImluZmxhdGVJbml0Ml8iKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIHpFcnJvciwgInpFcnJvciIpOworICAgcHJhZ21hIEltcG9ydCAoQywgaW5mbGF0ZVN5bmNQb2ludCwgImluZmxhdGVTeW5jUG9pbnQiKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIGdldF9jcmNfdGFibGUsICJnZXRfY3JjX3RhYmxlIik7CisKKyAgIC0tICBzaW5jZSB6bGliIDEuMi4wOgorCisgICBwcmFnbWEgSW1wb3J0IChDLCBpbmZsYXRlQ29weSwgImluZmxhdGVDb3B5Iik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBjb21wcmVzc0JvdW5kLCAiY29tcHJlc3NCb3VuZCIpOworICAgcHJhZ21hIEltcG9ydCAoQywgZGVmbGF0ZUJvdW5kLCAiZGVmbGF0ZUJvdW5kIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBnenVuZ2V0YywgImd6dW5nZXRjIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCB6bGliQ29tcGlsZUZsYWdzLCAiemxpYkNvbXBpbGVGbGFncyIpOworCisgICBwcmFnbWEgSW1wb3J0IChDLCBpbmZsYXRlQmFja0luaXQsICJpbmZsYXRlQmFja0luaXRfIik7CisKKyAgIC0tICBJIHN0b3BwZWQgYmluZGluZyB0aGUgaW5mbGF0ZUJhY2sgcm91dGluZXMsIGJlY291c2UgcmVhbGl6ZSB0aGF0CisgICAtLSAgaXQgZG9lcyBub3Qgc3VwcG9ydCB6bGliIGFuZCBnemlwIGhlYWRlcnMgZm9yIG5vdywgYW5kIGhhdmUgbm8KKyAgIC0tICBzeW1tZXRyaWMgZGVmbGF0ZUJhY2sgcm91dGluZXMuCisgICAtLSAgWkxpYi1BZGEgaXMgc3ltbWV0cmljIHJlZ2FyZGluZyBkZWZsYXRlL2luZmxhdGUgZGF0YSB0cmFuc2Zvcm1hdGlvbgorICAgLS0gIGFuZCBoYXMgYSBzaW1pbGFyIGdlbmVyaWMgY2FsbGJhY2sgaW50ZXJmYWNlIGZvciB0aGUKKyAgIC0tICBkZWZsYXRlL2luZmxhdGUgdHJhbnNmb3JtYXRpb24gYmFzZWQgb24gdGhlIHJlZ3VsYXIgRGVmbGF0ZS9JbmZsYXRlCisgICAtLSAgcm91dGluZXMuCisKKyAgIC0tICBwcmFnbWEgSW1wb3J0IChDLCBpbmZsYXRlQmFjaywgImluZmxhdGVCYWNrIik7CisgICAtLSAgcHJhZ21hIEltcG9ydCAoQywgaW5mbGF0ZUJhY2tFbmQsICJpbmZsYXRlQmFja0VuZCIpOworCitlbmQgWkxpYi5UaGluOwpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9hZGEvemxpYi5hZGIgYi96bGliL3NyYy9jb250cmliL2FkYS96bGliLmFkYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjZmZDY4Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9hZGEvemxpYi5hZGIKQEAgLTAsMCArMSw3MDEgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tICBaTGliIGZvciBBZGEgdGhpY2sgYmluZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBEbWl0cml5IEFuaXNpbWtvdiAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICBPcGVuIHNvdXJjZSBsaWNlbnNlIGluZm9ybWF0aW9uIGlzIGluIHRoZSB6bGliLmFkcyBmaWxlLiAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0gICRJZDogemxpYi5hZGIsdiAxLjMxIDIwMDQvMDkvMDYgMDY6NTM6MTkgdmFndWwgRXhwICQKKword2l0aCBBZGEuRXhjZXB0aW9uczsKK3dpdGggQWRhLlVuY2hlY2tlZF9Db252ZXJzaW9uOword2l0aCBBZGEuVW5jaGVja2VkX0RlYWxsb2NhdGlvbjsKKword2l0aCBJbnRlcmZhY2VzLkMuU3RyaW5nczsKKword2l0aCBaTGliLlRoaW47CisKK3BhY2thZ2UgYm9keSBaTGliIGlzCisKKyAgIHVzZSB0eXBlIFRoaW4uSW50OworCisgICB0eXBlIFpfU3RyZWFtIGlzIG5ldyBUaGluLlpfU3RyZWFtOworCisgICB0eXBlIFJldHVybl9Db2RlX0VudW0gaXMKKyAgICAgIChPSywKKyAgICAgICBTVFJFQU1fRU5ELAorICAgICAgIE5FRURfRElDVCwKKyAgICAgICBFUlJOTywKKyAgICAgICBTVFJFQU1fRVJST1IsCisgICAgICAgREFUQV9FUlJPUiwKKyAgICAgICBNRU1fRVJST1IsCisgICAgICAgQlVGX0VSUk9SLAorICAgICAgIFZFUlNJT05fRVJST1IpOworCisgICB0eXBlIEZsYXRlX1N0ZXBfRnVuY3Rpb24gaXMgYWNjZXNzCisgICAgIGZ1bmN0aW9uIChTdHJtIDogaW4gVGhpbi5aX1N0cmVhbXA7IEZsdXNoIDogaW4gVGhpbi5JbnQpIHJldHVybiBUaGluLkludDsKKyAgIHByYWdtYSBDb252ZW50aW9uIChDLCBGbGF0ZV9TdGVwX0Z1bmN0aW9uKTsKKworICAgdHlwZSBGbGF0ZV9FbmRfRnVuY3Rpb24gaXMgYWNjZXNzCisgICAgICBmdW5jdGlvbiAoQ3RybSA6IGluIFRoaW4uWl9TdHJlYW1wKSByZXR1cm4gVGhpbi5JbnQ7CisgICBwcmFnbWEgQ29udmVudGlvbiAoQywgRmxhdGVfRW5kX0Z1bmN0aW9uKTsKKworICAgdHlwZSBGbGF0ZV9UeXBlIGlzIHJlY29yZAorICAgICAgU3RlcCA6IEZsYXRlX1N0ZXBfRnVuY3Rpb247CisgICAgICBEb25lIDogRmxhdGVfRW5kX0Z1bmN0aW9uOworICAgZW5kIHJlY29yZDsKKworICAgc3VidHlwZSBGb290ZXJfQXJyYXkgaXMgU3RyZWFtX0VsZW1lbnRfQXJyYXkgKDEgLi4gOCk7CisKKyAgIFNpbXBsZV9HWmlwX0hlYWRlciA6IGNvbnN0YW50IFN0cmVhbV9FbGVtZW50X0FycmF5ICgxIC4uIDEwKQorICAgICA6PSAoMTYjMWYjLCAxNiM4YiMsICAgICAgICAgICAgICAgICAtLSAgTWFnaWMgaGVhZGVyCisgICAgICAgICAxNiMwOCMsICAgICAgICAgICAgICAgICAgICAgICAgIC0tICBaX0RFRkxBVEVECisgICAgICAgICAxNiMwMCMsICAgICAgICAgICAgICAgICAgICAgICAgIC0tICBGbGFncworICAgICAgICAgMTYjMDAjLCAxNiMwMCMsIDE2IzAwIywgMTYjMDAjLCAtLSAgVGltZQorICAgICAgICAgMTYjMDAjLCAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgWEZsYWdzCisgICAgICAgICAxNiMwMyMgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICBPUyBjb2RlCisgICAgICAgICk7CisgICAtLSAgVGhlIHNpbXBsZXN0IGd6aXAgaGVhZGVyIGlzIG5vdCBmb3IgaW5mb3JtYXRpb25hbCwgYnV0IGp1c3QgZm9yCisgICAtLSAgZ3ppcCBmb3JtYXQgY29tcGF0aWJpbGl0eS4KKyAgIC0tICBOb3RlIHRoYXQgc29tZSBjb2RlIGJlbG93IGlzIHVzaW5nIGFzc3VtcHRpb24KKyAgIC0tICBTaW1wbGVfR1ppcF9IZWFkZXInTGFzdCA+IEZvb3Rlcl9BcnJheSdMYXN0LCBzbyBkbyBub3QgbWFrZQorICAgLS0gIFNpbXBsZV9HWmlwX0hlYWRlcidMYXN0IDw9IEZvb3Rlcl9BcnJheSdMYXN0LgorCisgICBSZXR1cm5fQ29kZSA6IGNvbnN0YW50IGFycmF5IChUaGluLkludCByYW5nZSA8Pikgb2YgUmV0dXJuX0NvZGVfRW51bQorICAgICA6PSAoMCA9PiBPSywKKyAgICAgICAgIDEgPT4gU1RSRUFNX0VORCwKKyAgICAgICAgIDIgPT4gTkVFRF9ESUNULAorICAgICAgICAtMSA9PiBFUlJOTywKKyAgICAgICAgLTIgPT4gU1RSRUFNX0VSUk9SLAorICAgICAgICAtMyA9PiBEQVRBX0VSUk9SLAorICAgICAgICAtNCA9PiBNRU1fRVJST1IsCisgICAgICAgIC01ID0+IEJVRl9FUlJPUiwKKyAgICAgICAgLTYgPT4gVkVSU0lPTl9FUlJPUik7CisKKyAgIEZsYXRlIDogY29uc3RhbnQgYXJyYXkgKEJvb2xlYW4pIG9mIEZsYXRlX1R5cGUKKyAgICAgOj0gKFRydWUgID0+IChTdGVwID0+IFRoaW4uRGVmbGF0ZSdBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgRG9uZSA9PiBUaGluLkRlZmxhdGVFbmQnQWNjZXNzKSwKKyAgICAgICAgIEZhbHNlID0+IChTdGVwID0+IFRoaW4uSW5mbGF0ZSdBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgRG9uZSA9PiBUaGluLkluZmxhdGVFbmQnQWNjZXNzKSk7CisKKyAgIEZsdXNoX0ZpbmlzaCA6IGNvbnN0YW50IGFycmF5IChCb29sZWFuKSBvZiBGbHVzaF9Nb2RlCisgICAgIDo9IChUcnVlID0+IEZpbmlzaCwgRmFsc2UgPT4gTm9fRmx1c2gpOworCisgICBwcm9jZWR1cmUgUmFpc2VfRXJyb3IgKFN0cmVhbSA6IGluIFpfU3RyZWFtKTsKKyAgIHByYWdtYSBJbmxpbmUgKFJhaXNlX0Vycm9yKTsKKworICAgcHJvY2VkdXJlIFJhaXNlX0Vycm9yIChNZXNzYWdlIDogaW4gU3RyaW5nKTsKKyAgIHByYWdtYSBJbmxpbmUgKFJhaXNlX0Vycm9yKTsKKworICAgcHJvY2VkdXJlIENoZWNrX0Vycm9yIChTdHJlYW0gOiBpbiBaX1N0cmVhbTsgQ29kZSA6IGluIFRoaW4uSW50KTsKKworICAgcHJvY2VkdXJlIEZyZWUgaXMgbmV3IEFkYS5VbmNoZWNrZWRfRGVhbGxvY2F0aW9uCisgICAgICAoWl9TdHJlYW0sIFpfU3RyZWFtX0FjY2Vzcyk7CisKKyAgIGZ1bmN0aW9uIFRvX1RoaW5fQWNjZXNzIGlzIG5ldyBBZGEuVW5jaGVja2VkX0NvbnZlcnNpb24KKyAgICAgKFpfU3RyZWFtX0FjY2VzcywgVGhpbi5aX1N0cmVhbXApOworCisgICBwcm9jZWR1cmUgVHJhbnNsYXRlX0daaXAKKyAgICAgKEZpbHRlciAgICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKKyAgICAgIEluX0RhdGEgICA6IGluICAgICBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKKyAgICAgIEluX0xhc3QgICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICAgICBPdXRfRGF0YSAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7CisgICAgICBPdXRfTGFzdCAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworICAgICAgRmx1c2ggICAgIDogaW4gICAgIEZsdXNoX01vZGUpOworICAgLS0gIFNlcGFyYXRlIHRyYW5zbGF0ZSByb3V0aW5lIGZvciBtYWtlIGd6aXAgaGVhZGVyLgorCisgICBwcm9jZWR1cmUgVHJhbnNsYXRlX0F1dG8KKyAgICAgKEZpbHRlciAgICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKKyAgICAgIEluX0RhdGEgICA6IGluICAgICBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKKyAgICAgIEluX0xhc3QgICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICAgICBPdXRfRGF0YSAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7CisgICAgICBPdXRfTGFzdCAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworICAgICAgRmx1c2ggICAgIDogaW4gICAgIEZsdXNoX01vZGUpOworICAgLS0gIHRyYW5zbGF0ZSByb3V0aW5lIHdpdGhvdXQgYWRkaXRpb25hbCBoZWFkZXJzLgorCisgICAtLS0tLS0tLS0tLS0tLS0tLQorICAgLS0gQ2hlY2tfRXJyb3IgLS0KKyAgIC0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIHByb2NlZHVyZSBDaGVja19FcnJvciAoU3RyZWFtIDogaW4gWl9TdHJlYW07IENvZGUgOiBpbiBUaGluLkludCkgaXMKKyAgICAgIHVzZSB0eXBlIFRoaW4uSW50OworICAgYmVnaW4KKyAgICAgIGlmIENvZGUgLz0gVGhpbi5aX09LIHRoZW4KKyAgICAgICAgIFJhaXNlX0Vycm9yCisgICAgICAgICAgICAoUmV0dXJuX0NvZGVfRW51bSdJbWFnZSAoUmV0dXJuX0NvZGUgKENvZGUpKQorICAgICAgICAgICAgICAmICI6ICIgJiBMYXN0X0Vycm9yX01lc3NhZ2UgKFN0cmVhbSkpOworICAgICAgZW5kIGlmOworICAgZW5kIENoZWNrX0Vycm9yOworCisgICAtLS0tLS0tLS0tLQorICAgLS0gQ2xvc2UgLS0KKyAgIC0tLS0tLS0tLS0tCisKKyAgIHByb2NlZHVyZSBDbG9zZQorICAgICAoRmlsdGVyICAgICAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOworICAgICAgSWdub3JlX0Vycm9yIDogaW4gICAgIEJvb2xlYW4gOj0gRmFsc2UpCisgICBpcworICAgICAgQ29kZSA6IFRoaW4uSW50OworICAgYmVnaW4KKyAgICAgIGlmIG5vdCBJZ25vcmVfRXJyb3IgYW5kIHRoZW4gbm90IElzX09wZW4gKEZpbHRlcikgdGhlbgorICAgICAgICAgcmFpc2UgU3RhdHVzX0Vycm9yOworICAgICAgZW5kIGlmOworCisgICAgICBDb2RlIDo9IEZsYXRlIChGaWx0ZXIuQ29tcHJlc3Npb24pLkRvbmUgKFRvX1RoaW5fQWNjZXNzIChGaWx0ZXIuU3RybSkpOworCisgICAgICBpZiBJZ25vcmVfRXJyb3Igb3IgZWxzZSBDb2RlID0gVGhpbi5aX09LIHRoZW4KKyAgICAgICAgIEZyZWUgKEZpbHRlci5TdHJtKTsKKyAgICAgIGVsc2UKKyAgICAgICAgIGRlY2xhcmUKKyAgICAgICAgICAgIEVycm9yX01lc3NhZ2UgOiBjb25zdGFudCBTdHJpbmcKKyAgICAgICAgICAgICAgOj0gTGFzdF9FcnJvcl9NZXNzYWdlIChGaWx0ZXIuU3RybS5hbGwpOworICAgICAgICAgYmVnaW4KKyAgICAgICAgICAgIEZyZWUgKEZpbHRlci5TdHJtKTsKKyAgICAgICAgICAgIEFkYS5FeGNlcHRpb25zLlJhaXNlX0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgKFpMaWJfRXJyb3InSWRlbnRpdHksCisgICAgICAgICAgICAgICAgUmV0dXJuX0NvZGVfRW51bSdJbWFnZSAoUmV0dXJuX0NvZGUgKENvZGUpKQorICAgICAgICAgICAgICAgICAgJiAiOiAiICYgRXJyb3JfTWVzc2FnZSk7CisgICAgICAgICBlbmQ7CisgICAgICBlbmQgaWY7CisgICBlbmQgQ2xvc2U7CisKKyAgIC0tLS0tLS0tLS0tCisgICAtLSBDUkMzMiAtLQorICAgLS0tLS0tLS0tLS0KKworICAgZnVuY3Rpb24gQ1JDMzIKKyAgICAgKENSQyAgOiBpbiBVbnNpZ25lZF8zMjsKKyAgICAgIERhdGEgOiBpbiBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheSkKKyAgICAgIHJldHVybiBVbnNpZ25lZF8zMgorICAgaXMKKyAgICAgIHVzZSBUaGluOworICAgYmVnaW4KKyAgICAgIHJldHVybiBVbnNpZ25lZF8zMiAoY3JjMzIgKFVMb25nIChDUkMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSdBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSdMZW5ndGgpKTsKKyAgIGVuZCBDUkMzMjsKKworICAgcHJvY2VkdXJlIENSQzMyCisgICAgIChDUkMgIDogaW4gb3V0IFVuc2lnbmVkXzMyOworICAgICAgRGF0YSA6IGluICAgICBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheSkgaXMKKyAgIGJlZ2luCisgICAgICBDUkMgOj0gQ1JDMzIgKENSQywgRGF0YSk7CisgICBlbmQgQ1JDMzI7CisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0gRGVmbGF0ZV9Jbml0IC0tCisgICAtLS0tLS0tLS0tLS0tLS0tLS0KKworICAgcHJvY2VkdXJlIERlZmxhdGVfSW5pdAorICAgICAoRmlsdGVyICAgICAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOworICAgICAgTGV2ZWwgICAgICAgIDogaW4gICAgIENvbXByZXNzaW9uX0xldmVsICA6PSBEZWZhdWx0X0NvbXByZXNzaW9uOworICAgICAgU3RyYXRlZ3kgICAgIDogaW4gICAgIFN0cmF0ZWd5X1R5cGUgICAgICA6PSBEZWZhdWx0X1N0cmF0ZWd5OworICAgICAgTWV0aG9kICAgICAgIDogaW4gICAgIENvbXByZXNzaW9uX01ldGhvZCA6PSBEZWZsYXRlZDsKKyAgICAgIFdpbmRvd19CaXRzICA6IGluICAgICBXaW5kb3dfQml0c19UeXBlICAgOj0gRGVmYXVsdF9XaW5kb3dfQml0czsKKyAgICAgIE1lbW9yeV9MZXZlbCA6IGluICAgICBNZW1vcnlfTGV2ZWxfVHlwZSAgOj0gRGVmYXVsdF9NZW1vcnlfTGV2ZWw7CisgICAgICBIZWFkZXIgICAgICAgOiBpbiAgICAgSGVhZGVyX1R5cGUgICAgICAgIDo9IERlZmF1bHQpCisgICBpcworICAgICAgdXNlIHR5cGUgVGhpbi5JbnQ7CisgICAgICBXaW5fQml0cyA6IFRoaW4uSW50IDo9IFRoaW4uSW50IChXaW5kb3dfQml0cyk7CisgICBiZWdpbgorICAgICAgaWYgSXNfT3BlbiAoRmlsdGVyKSB0aGVuCisgICAgICAgICByYWlzZSBTdGF0dXNfRXJyb3I7CisgICAgICBlbmQgaWY7CisKKyAgICAgIC0tICBXZSBhbGxvdyBaTGliIHRvIG1ha2UgaGVhZGVyIG9ubHkgaW4gY2FzZSBvZiBkZWZhdWx0IGhlYWRlciB0eXBlLgorICAgICAgLS0gIE90aGVyd2lzZSB3ZSB3b3VsZCBlaXRoZXIgZG8gaGVhZGVyIGJ5IG91cnNlbGZzLCBvciBkbyBub3QgZG8KKyAgICAgIC0tICBoZWFkZXIgYXQgYWxsLgorCisgICAgICBpZiBIZWFkZXIgPSBOb25lIG9yIGVsc2UgSGVhZGVyID0gR1ppcCB0aGVuCisgICAgICAgICBXaW5fQml0cyA6PSAtV2luX0JpdHM7CisgICAgICBlbmQgaWY7CisKKyAgICAgIC0tICBGb3IgdGhlIEdaaXAgQ1JDIGNhbGN1bGF0aW9uIGFuZCBtYWtlIGhlYWRlcnMuCisKKyAgICAgIGlmIEhlYWRlciA9IEdaaXAgdGhlbgorICAgICAgICAgRmlsdGVyLkNSQyAgICA6PSAwOworICAgICAgICAgRmlsdGVyLk9mZnNldCA6PSBTaW1wbGVfR1ppcF9IZWFkZXInRmlyc3Q7CisgICAgICBlbHNlCisgICAgICAgICBGaWx0ZXIuT2Zmc2V0IDo9IFNpbXBsZV9HWmlwX0hlYWRlcidMYXN0ICsgMTsKKyAgICAgIGVuZCBpZjsKKworICAgICAgRmlsdGVyLlN0cm0gICAgICAgIDo9IG5ldyBaX1N0cmVhbTsKKyAgICAgIEZpbHRlci5Db21wcmVzc2lvbiA6PSBUcnVlOworICAgICAgRmlsdGVyLlN0cmVhbV9FbmQgIDo9IEZhbHNlOworICAgICAgRmlsdGVyLkhlYWRlciAgICAgIDo9IEhlYWRlcjsKKworICAgICAgaWYgVGhpbi5EZWZsYXRlX0luaXQKKyAgICAgICAgICAgKFRvX1RoaW5fQWNjZXNzIChGaWx0ZXIuU3RybSksCisgICAgICAgICAgICBMZXZlbCAgICAgID0+IFRoaW4uSW50IChMZXZlbCksCisgICAgICAgICAgICBtZXRob2QgICAgID0+IFRoaW4uSW50IChNZXRob2QpLAorICAgICAgICAgICAgd2luZG93Qml0cyA9PiBXaW5fQml0cywKKyAgICAgICAgICAgIG1lbUxldmVsICAgPT4gVGhpbi5JbnQgKE1lbW9yeV9MZXZlbCksCisgICAgICAgICAgICBzdHJhdGVneSAgID0+IFRoaW4uSW50IChTdHJhdGVneSkpIC89IFRoaW4uWl9PSworICAgICAgdGhlbgorICAgICAgICAgUmFpc2VfRXJyb3IgKEZpbHRlci5TdHJtLmFsbCk7CisgICAgICBlbmQgaWY7CisgICBlbmQgRGVmbGF0ZV9Jbml0OworCisgICAtLS0tLS0tLS0tLQorICAgLS0gRmx1c2ggLS0KKyAgIC0tLS0tLS0tLS0tCisKKyAgIHByb2NlZHVyZSBGbHVzaAorICAgICAoRmlsdGVyICAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOworICAgICAgT3V0X0RhdGEgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OworICAgICAgT3V0X0xhc3QgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgIEZsdXNoICAgICA6IGluICAgICBGbHVzaF9Nb2RlKQorICAgaXMKKyAgICAgIE5vX0RhdGEgOiBTdHJlYW1fRWxlbWVudF9BcnJheSA6PSAoMSAuLiAwID0+IDApOworICAgICAgTGFzdCAgICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgIGJlZ2luCisgICAgICBUcmFuc2xhdGUgKEZpbHRlciwgTm9fRGF0YSwgTGFzdCwgT3V0X0RhdGEsIE91dF9MYXN0LCBGbHVzaCk7CisgICBlbmQgRmx1c2g7CisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLSBHZW5lcmljX1RyYW5zbGF0ZSAtLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgcHJvY2VkdXJlIEdlbmVyaWNfVHJhbnNsYXRlCisgICAgIChGaWx0ZXIgICAgICAgICAgOiBpbiBvdXQgWkxpYi5GaWx0ZXJfVHlwZTsKKyAgICAgIEluX0J1ZmZlcl9TaXplICA6IGluICAgICBJbnRlZ2VyIDo9IERlZmF1bHRfQnVmZmVyX1NpemU7CisgICAgICBPdXRfQnVmZmVyX1NpemUgOiBpbiAgICAgSW50ZWdlciA6PSBEZWZhdWx0X0J1ZmZlcl9TaXplKQorICAgaXMKKyAgICAgIEluX0J1ZmZlciAgOiBTdHJlYW1fRWxlbWVudF9BcnJheQorICAgICAgICAgICAgICAgICAgICAgKDEgLi4gU3RyZWFtX0VsZW1lbnRfT2Zmc2V0IChJbl9CdWZmZXJfU2l6ZSkpOworICAgICAgT3V0X0J1ZmZlciA6IFN0cmVhbV9FbGVtZW50X0FycmF5CisgICAgICAgICAgICAgICAgICAgICAoMSAuLiBTdHJlYW1fRWxlbWVudF9PZmZzZXQgKE91dF9CdWZmZXJfU2l6ZSkpOworICAgICAgTGFzdCAgICAgICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgIEluX0xhc3QgICAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICAgICBJbl9GaXJzdCAgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworICAgICAgT3V0X0xhc3QgICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgIGJlZ2luCisgICAgICBNYWluIDogbG9vcAorICAgICAgICAgRGF0YV9JbiAoSW5fQnVmZmVyLCBMYXN0KTsKKworICAgICAgICAgSW5fRmlyc3QgOj0gSW5fQnVmZmVyJ0ZpcnN0OworCisgICAgICAgICBsb29wCisgICAgICAgICAgICBUcmFuc2xhdGUKKyAgICAgICAgICAgICAgKEZpbHRlciAgID0+IEZpbHRlciwKKyAgICAgICAgICAgICAgIEluX0RhdGEgID0+IEluX0J1ZmZlciAoSW5fRmlyc3QgLi4gTGFzdCksCisgICAgICAgICAgICAgICBJbl9MYXN0ICA9PiBJbl9MYXN0LAorICAgICAgICAgICAgICAgT3V0X0RhdGEgPT4gT3V0X0J1ZmZlciwKKyAgICAgICAgICAgICAgIE91dF9MYXN0ID0+IE91dF9MYXN0LAorICAgICAgICAgICAgICAgRmx1c2ggICAgPT4gRmx1c2hfRmluaXNoIChMYXN0IDwgSW5fQnVmZmVyJ0ZpcnN0KSk7CisKKyAgICAgICAgICAgIGlmIE91dF9CdWZmZXInRmlyc3QgPD0gT3V0X0xhc3QgdGhlbgorICAgICAgICAgICAgICAgRGF0YV9PdXQgKE91dF9CdWZmZXIgKE91dF9CdWZmZXInRmlyc3QgLi4gT3V0X0xhc3QpKTsKKyAgICAgICAgICAgIGVuZCBpZjsKKworICAgICAgICAgICAgZXhpdCBNYWluIHdoZW4gU3RyZWFtX0VuZCAoRmlsdGVyKTsKKworICAgICAgICAgICAgLS0gIFRoZSBlbmQgb2YgaW4gYnVmZmVyLgorCisgICAgICAgICAgICBleGl0IHdoZW4gSW5fTGFzdCA9IExhc3Q7CisKKyAgICAgICAgICAgIEluX0ZpcnN0IDo9IEluX0xhc3QgKyAxOworICAgICAgICAgZW5kIGxvb3A7CisgICAgICBlbmQgbG9vcCBNYWluOworCisgICBlbmQgR2VuZXJpY19UcmFuc2xhdGU7CisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0gSW5mbGF0ZV9Jbml0IC0tCisgICAtLS0tLS0tLS0tLS0tLS0tLS0KKworICAgcHJvY2VkdXJlIEluZmxhdGVfSW5pdAorICAgICAoRmlsdGVyICAgICAgOiBpbiBvdXQgRmlsdGVyX1R5cGU7CisgICAgICBXaW5kb3dfQml0cyA6IGluICAgICBXaW5kb3dfQml0c19UeXBlIDo9IERlZmF1bHRfV2luZG93X0JpdHM7CisgICAgICBIZWFkZXIgICAgICA6IGluICAgICBIZWFkZXJfVHlwZSAgICAgIDo9IERlZmF1bHQpCisgICBpcworICAgICAgdXNlIHR5cGUgVGhpbi5JbnQ7CisgICAgICBXaW5fQml0cyA6IFRoaW4uSW50IDo9IFRoaW4uSW50IChXaW5kb3dfQml0cyk7CisKKyAgICAgIHByb2NlZHVyZSBDaGVja19WZXJzaW9uOworICAgICAgLS0gIENoZWNrIHRoZSBsYXRlc3QgaGVhZGVyIHR5cGVzIGNvbXBhdGliaWxpdHkuCisKKyAgICAgIHByb2NlZHVyZSBDaGVja19WZXJzaW9uIGlzCisgICAgICBiZWdpbgorICAgICAgICAgaWYgVmVyc2lvbiA8PSAiMS4xLjQiIHRoZW4KKyAgICAgICAgICAgIFJhaXNlX0Vycm9yCisgICAgICAgICAgICAgICgiSW5mbGF0ZSBoZWFkZXIgdHlwZSAiICYgSGVhZGVyX1R5cGUnSW1hZ2UgKEhlYWRlcikKKyAgICAgICAgICAgICAgICYgIiBpbmNvbXBhdGlibGUgd2l0aCBaTGliIHZlcnNpb24gIiAmIFZlcnNpb24pOworICAgICAgICAgZW5kIGlmOworICAgICAgZW5kIENoZWNrX1ZlcnNpb247CisKKyAgIGJlZ2luCisgICAgICBpZiBJc19PcGVuIChGaWx0ZXIpIHRoZW4KKyAgICAgICAgIHJhaXNlIFN0YXR1c19FcnJvcjsKKyAgICAgIGVuZCBpZjsKKworICAgICAgY2FzZSBIZWFkZXIgaXMKKyAgICAgICAgIHdoZW4gTm9uZSA9PgorICAgICAgICAgICAgQ2hlY2tfVmVyc2lvbjsKKworICAgICAgICAgICAgLS0gIEluZmxhdGUgZGF0YSB3aXRob3V0IGhlYWRlcnMgZGV0ZXJtaW5lZAorICAgICAgICAgICAgLS0gIGJ5IG5lZ2F0aXZlIFdpbl9CaXRzLgorCisgICAgICAgICAgICBXaW5fQml0cyA6PSAtV2luX0JpdHM7CisgICAgICAgICB3aGVuIEdaaXAgPT4KKyAgICAgICAgICAgIENoZWNrX1ZlcnNpb247CisKKyAgICAgICAgICAgIC0tICBJbmZsYXRlIGd6aXAgZGF0YSBkZWZpbmVkIGJ5IGZsYWcgMTYuCisKKyAgICAgICAgICAgIFdpbl9CaXRzIDo9IFdpbl9CaXRzICsgMTY7CisgICAgICAgICB3aGVuIEF1dG8gPT4KKyAgICAgICAgICAgIENoZWNrX1ZlcnNpb247CisKKyAgICAgICAgICAgIC0tICBJbmZsYXRlIHdpdGggYXV0b21hdGljIGRldGVjdGlvbgorICAgICAgICAgICAgLS0gIG9mIGd6aXAgb3IgbmF0aXZlIGhlYWRlciBkZWZpbmVkIGJ5IGZsYWcgMzIuCisKKyAgICAgICAgICAgIFdpbl9CaXRzIDo9IFdpbl9CaXRzICsgMzI7CisgICAgICAgICB3aGVuIERlZmF1bHQgPT4gbnVsbDsKKyAgICAgIGVuZCBjYXNlOworCisgICAgICBGaWx0ZXIuU3RybSAgICAgICAgOj0gbmV3IFpfU3RyZWFtOworICAgICAgRmlsdGVyLkNvbXByZXNzaW9uIDo9IEZhbHNlOworICAgICAgRmlsdGVyLlN0cmVhbV9FbmQgIDo9IEZhbHNlOworICAgICAgRmlsdGVyLkhlYWRlciAgICAgIDo9IEhlYWRlcjsKKworICAgICAgaWYgVGhpbi5JbmZsYXRlX0luaXQKKyAgICAgICAgIChUb19UaGluX0FjY2VzcyAoRmlsdGVyLlN0cm0pLCBXaW5fQml0cykgLz0gVGhpbi5aX09LCisgICAgICB0aGVuCisgICAgICAgICBSYWlzZV9FcnJvciAoRmlsdGVyLlN0cm0uYWxsKTsKKyAgICAgIGVuZCBpZjsKKyAgIGVuZCBJbmZsYXRlX0luaXQ7CisKKyAgIC0tLS0tLS0tLS0tLS0KKyAgIC0tIElzX09wZW4gLS0KKyAgIC0tLS0tLS0tLS0tLS0KKworICAgZnVuY3Rpb24gSXNfT3BlbiAoRmlsdGVyIDogaW4gRmlsdGVyX1R5cGUpIHJldHVybiBCb29sZWFuIGlzCisgICBiZWdpbgorICAgICAgcmV0dXJuIEZpbHRlci5TdHJtIC89IG51bGw7CisgICBlbmQgSXNfT3BlbjsKKworICAgLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tIFJhaXNlX0Vycm9yIC0tCisgICAtLS0tLS0tLS0tLS0tLS0tLQorCisgICBwcm9jZWR1cmUgUmFpc2VfRXJyb3IgKE1lc3NhZ2UgOiBpbiBTdHJpbmcpIGlzCisgICBiZWdpbgorICAgICAgQWRhLkV4Y2VwdGlvbnMuUmFpc2VfRXhjZXB0aW9uIChaTGliX0Vycm9yJ0lkZW50aXR5LCBNZXNzYWdlKTsKKyAgIGVuZCBSYWlzZV9FcnJvcjsKKworICAgcHJvY2VkdXJlIFJhaXNlX0Vycm9yIChTdHJlYW0gOiBpbiBaX1N0cmVhbSkgaXMKKyAgIGJlZ2luCisgICAgICBSYWlzZV9FcnJvciAoTGFzdF9FcnJvcl9NZXNzYWdlIChTdHJlYW0pKTsKKyAgIGVuZCBSYWlzZV9FcnJvcjsKKworICAgLS0tLS0tLS0tLQorICAgLS0gUmVhZCAtLQorICAgLS0tLS0tLS0tLQorCisgICBwcm9jZWR1cmUgUmVhZAorICAgICAoRmlsdGVyIDogaW4gb3V0IEZpbHRlcl9UeXBlOworICAgICAgSXRlbSAgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OworICAgICAgTGFzdCAgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgIEZsdXNoICA6IGluICAgICBGbHVzaF9Nb2RlIDo9IE5vX0ZsdXNoKQorICAgaXMKKyAgICAgIEluX0xhc3QgICAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICAgICBJdGVtX0ZpcnN0IDogQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0IDo9IEl0ZW0nRmlyc3Q7CisgICAgICBWX0ZsdXNoICAgIDogRmx1c2hfTW9kZSA6PSBGbHVzaDsKKworICAgYmVnaW4KKyAgICAgIHByYWdtYSBBc3NlcnQgKFJlc3RfRmlyc3QgaW4gQnVmZmVyJ0ZpcnN0IC4uIEJ1ZmZlcidMYXN0ICsgMSk7CisgICAgICBwcmFnbWEgQXNzZXJ0IChSZXN0X0xhc3QgaW4gQnVmZmVyJ0ZpcnN0IC0gMSAuLiBCdWZmZXInTGFzdCk7CisKKyAgICAgIGxvb3AKKyAgICAgICAgIGlmIFJlc3RfTGFzdCA9IEJ1ZmZlcidGaXJzdCAtIDEgdGhlbgorICAgICAgICAgICAgVl9GbHVzaCA6PSBGaW5pc2g7CisKKyAgICAgICAgIGVsc2lmIFJlc3RfRmlyc3QgPiBSZXN0X0xhc3QgdGhlbgorICAgICAgICAgICAgUmVhZCAoQnVmZmVyLCBSZXN0X0xhc3QpOworICAgICAgICAgICAgUmVzdF9GaXJzdCA6PSBCdWZmZXInRmlyc3Q7CisKKyAgICAgICAgICAgIGlmIFJlc3RfTGFzdCA8IEJ1ZmZlcidGaXJzdCB0aGVuCisgICAgICAgICAgICAgICBWX0ZsdXNoIDo9IEZpbmlzaDsKKyAgICAgICAgICAgIGVuZCBpZjsKKyAgICAgICAgIGVuZCBpZjsKKworICAgICAgICAgVHJhbnNsYXRlCisgICAgICAgICAgIChGaWx0ZXIgICA9PiBGaWx0ZXIsCisgICAgICAgICAgICBJbl9EYXRhICA9PiBCdWZmZXIgKFJlc3RfRmlyc3QgLi4gUmVzdF9MYXN0KSwKKyAgICAgICAgICAgIEluX0xhc3QgID0+IEluX0xhc3QsCisgICAgICAgICAgICBPdXRfRGF0YSA9PiBJdGVtIChJdGVtX0ZpcnN0IC4uIEl0ZW0nTGFzdCksCisgICAgICAgICAgICBPdXRfTGFzdCA9PiBMYXN0LAorICAgICAgICAgICAgRmx1c2ggICAgPT4gVl9GbHVzaCk7CisKKyAgICAgICAgIFJlc3RfRmlyc3QgOj0gSW5fTGFzdCArIDE7CisKKyAgICAgICAgIGV4aXQgd2hlbiBTdHJlYW1fRW5kIChGaWx0ZXIpCisgICAgICAgICAgIG9yIGVsc2UgTGFzdCA9IEl0ZW0nTGFzdAorICAgICAgICAgICBvciBlbHNlIChMYXN0ID49IEl0ZW0nRmlyc3QgYW5kIHRoZW4gQWxsb3dfUmVhZF9Tb21lKTsKKworICAgICAgICAgSXRlbV9GaXJzdCA6PSBMYXN0ICsgMTsKKyAgICAgIGVuZCBsb29wOworICAgZW5kIFJlYWQ7CisKKyAgIC0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tIFN0cmVhbV9FbmQgLS0KKyAgIC0tLS0tLS0tLS0tLS0tLS0KKworICAgZnVuY3Rpb24gU3RyZWFtX0VuZCAoRmlsdGVyIDogaW4gRmlsdGVyX1R5cGUpIHJldHVybiBCb29sZWFuIGlzCisgICBiZWdpbgorICAgICAgaWYgRmlsdGVyLkhlYWRlciA9IEdaaXAgYW5kIEZpbHRlci5Db21wcmVzc2lvbiB0aGVuCisgICAgICAgICByZXR1cm4gRmlsdGVyLlN0cmVhbV9FbmQKKyAgICAgICAgICAgIGFuZCB0aGVuIEZpbHRlci5PZmZzZXQgPSBGb290ZXJfQXJyYXknTGFzdCArIDE7CisgICAgICBlbHNlCisgICAgICAgICByZXR1cm4gRmlsdGVyLlN0cmVhbV9FbmQ7CisgICAgICBlbmQgaWY7CisgICBlbmQgU3RyZWFtX0VuZDsKKworICAgLS0tLS0tLS0tLS0tLS0KKyAgIC0tIFRvdGFsX0luIC0tCisgICAtLS0tLS0tLS0tLS0tLQorCisgICBmdW5jdGlvbiBUb3RhbF9JbiAoRmlsdGVyIDogaW4gRmlsdGVyX1R5cGUpIHJldHVybiBDb3VudCBpcworICAgYmVnaW4KKyAgICAgIHJldHVybiBDb3VudCAoVGhpbi5Ub3RhbF9JbiAoVG9fVGhpbl9BY2Nlc3MgKEZpbHRlci5TdHJtKS5hbGwpKTsKKyAgIGVuZCBUb3RhbF9JbjsKKworICAgLS0tLS0tLS0tLS0tLS0tCisgICAtLSBUb3RhbF9PdXQgLS0KKyAgIC0tLS0tLS0tLS0tLS0tLQorCisgICBmdW5jdGlvbiBUb3RhbF9PdXQgKEZpbHRlciA6IGluIEZpbHRlcl9UeXBlKSByZXR1cm4gQ291bnQgaXMKKyAgIGJlZ2luCisgICAgICByZXR1cm4gQ291bnQgKFRoaW4uVG90YWxfT3V0IChUb19UaGluX0FjY2VzcyAoRmlsdGVyLlN0cm0pLmFsbCkpOworICAgZW5kIFRvdGFsX091dDsKKworICAgLS0tLS0tLS0tLS0tLS0tCisgICAtLSBUcmFuc2xhdGUgLS0KKyAgIC0tLS0tLS0tLS0tLS0tLQorCisgICBwcm9jZWR1cmUgVHJhbnNsYXRlCisgICAgIChGaWx0ZXIgICAgOiBpbiBvdXQgRmlsdGVyX1R5cGU7CisgICAgICBJbl9EYXRhICAgOiBpbiAgICAgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7CisgICAgICBJbl9MYXN0ICAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworICAgICAgT3V0X0RhdGEgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OworICAgICAgT3V0X0xhc3QgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgIEZsdXNoICAgICA6IGluICAgICBGbHVzaF9Nb2RlKSBpcworICAgYmVnaW4KKyAgICAgIGlmIEZpbHRlci5IZWFkZXIgPSBHWmlwIGFuZCB0aGVuIEZpbHRlci5Db21wcmVzc2lvbiB0aGVuCisgICAgICAgICBUcmFuc2xhdGVfR1ppcAorICAgICAgICAgICAoRmlsdGVyICAgPT4gRmlsdGVyLAorICAgICAgICAgICAgSW5fRGF0YSAgPT4gSW5fRGF0YSwKKyAgICAgICAgICAgIEluX0xhc3QgID0+IEluX0xhc3QsCisgICAgICAgICAgICBPdXRfRGF0YSA9PiBPdXRfRGF0YSwKKyAgICAgICAgICAgIE91dF9MYXN0ID0+IE91dF9MYXN0LAorICAgICAgICAgICAgRmx1c2ggICAgPT4gRmx1c2gpOworICAgICAgZWxzZQorICAgICAgICAgVHJhbnNsYXRlX0F1dG8KKyAgICAgICAgICAgKEZpbHRlciAgID0+IEZpbHRlciwKKyAgICAgICAgICAgIEluX0RhdGEgID0+IEluX0RhdGEsCisgICAgICAgICAgICBJbl9MYXN0ICA9PiBJbl9MYXN0LAorICAgICAgICAgICAgT3V0X0RhdGEgPT4gT3V0X0RhdGEsCisgICAgICAgICAgICBPdXRfTGFzdCA9PiBPdXRfTGFzdCwKKyAgICAgICAgICAgIEZsdXNoICAgID0+IEZsdXNoKTsKKyAgICAgIGVuZCBpZjsKKyAgIGVuZCBUcmFuc2xhdGU7CisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLSBUcmFuc2xhdGVfQXV0byAtLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgcHJvY2VkdXJlIFRyYW5zbGF0ZV9BdXRvCisgICAgIChGaWx0ZXIgICAgOiBpbiBvdXQgRmlsdGVyX1R5cGU7CisgICAgICBJbl9EYXRhICAgOiBpbiAgICAgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7CisgICAgICBJbl9MYXN0ICAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworICAgICAgT3V0X0RhdGEgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OworICAgICAgT3V0X0xhc3QgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgIEZsdXNoICAgICA6IGluICAgICBGbHVzaF9Nb2RlKQorICAgaXMKKyAgICAgIHVzZSB0eXBlIFRoaW4uSW50OworICAgICAgQ29kZSA6IFRoaW4uSW50OworCisgICBiZWdpbgorICAgICAgaWYgbm90IElzX09wZW4gKEZpbHRlcikgdGhlbgorICAgICAgICAgcmFpc2UgU3RhdHVzX0Vycm9yOworICAgICAgZW5kIGlmOworCisgICAgICBpZiBPdXRfRGF0YSdMZW5ndGggPSAwIGFuZCB0aGVuIEluX0RhdGEnTGVuZ3RoID0gMCB0aGVuCisgICAgICAgICByYWlzZSBDb25zdHJhaW50X0Vycm9yOworICAgICAgZW5kIGlmOworCisgICAgICBTZXRfT3V0IChGaWx0ZXIuU3RybS5hbGwsIE91dF9EYXRhJ0FkZHJlc3MsIE91dF9EYXRhJ0xlbmd0aCk7CisgICAgICBTZXRfSW4gIChGaWx0ZXIuU3RybS5hbGwsIEluX0RhdGEnQWRkcmVzcywgSW5fRGF0YSdMZW5ndGgpOworCisgICAgICBDb2RlIDo9IEZsYXRlIChGaWx0ZXIuQ29tcHJlc3Npb24pLlN0ZXAKKyAgICAgICAgKFRvX1RoaW5fQWNjZXNzIChGaWx0ZXIuU3RybSksCisgICAgICAgICBUaGluLkludCAoRmx1c2gpKTsKKworICAgICAgaWYgQ29kZSA9IFRoaW4uWl9TVFJFQU1fRU5EIHRoZW4KKyAgICAgICAgIEZpbHRlci5TdHJlYW1fRW5kIDo9IFRydWU7CisgICAgICBlbHNlCisgICAgICAgICBDaGVja19FcnJvciAoRmlsdGVyLlN0cm0uYWxsLCBDb2RlKTsKKyAgICAgIGVuZCBpZjsKKworICAgICAgSW5fTGFzdCAgOj0gSW5fRGF0YSdMYXN0CisgICAgICAgICAtIFN0cmVhbV9FbGVtZW50X09mZnNldCAoQXZhaWxfSW4gKEZpbHRlci5TdHJtLmFsbCkpOworICAgICAgT3V0X0xhc3QgOj0gT3V0X0RhdGEnTGFzdAorICAgICAgICAgLSBTdHJlYW1fRWxlbWVudF9PZmZzZXQgKEF2YWlsX091dCAoRmlsdGVyLlN0cm0uYWxsKSk7CisgICBlbmQgVHJhbnNsYXRlX0F1dG87CisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLSBUcmFuc2xhdGVfR1ppcCAtLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgcHJvY2VkdXJlIFRyYW5zbGF0ZV9HWmlwCisgICAgIChGaWx0ZXIgICAgOiBpbiBvdXQgRmlsdGVyX1R5cGU7CisgICAgICBJbl9EYXRhICAgOiBpbiAgICAgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7CisgICAgICBJbl9MYXN0ICAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworICAgICAgT3V0X0RhdGEgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OworICAgICAgT3V0X0xhc3QgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgIEZsdXNoICAgICA6IGluICAgICBGbHVzaF9Nb2RlKQorICAgaXMKKyAgICAgIE91dF9GaXJzdCA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKKworICAgICAgcHJvY2VkdXJlIEFkZF9EYXRhIChEYXRhIDogaW4gU3RyZWFtX0VsZW1lbnRfQXJyYXkpOworICAgICAgLS0gIEFkZCBkYXRhIHRvIHN0cmVhbSBmcm9tIHRoZSBGaWx0ZXIuT2Zmc2V0IHRpbGwgbmVjZXNzYXJ5LAorICAgICAgLS0gIHVzZWQgZm9yIGFkZCBnemlwIGhlYWRyL2Zvb3Rlci4KKworICAgICAgcHJvY2VkdXJlIFB1dF8zMgorICAgICAgICAoSXRlbSA6IGluIG91dCBTdHJlYW1fRWxlbWVudF9BcnJheTsKKyAgICAgICAgIERhdGEgOiBpbiAgICAgVW5zaWduZWRfMzIpOworICAgICAgcHJhZ21hIElubGluZSAoUHV0XzMyKTsKKworICAgICAgLS0tLS0tLS0tLS0tLS0KKyAgICAgIC0tIEFkZF9EYXRhIC0tCisgICAgICAtLS0tLS0tLS0tLS0tLQorCisgICAgICBwcm9jZWR1cmUgQWRkX0RhdGEgKERhdGEgOiBpbiBTdHJlYW1fRWxlbWVudF9BcnJheSkgaXMKKyAgICAgICAgIERhdGFfRmlyc3QgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQgcmVuYW1lcyBGaWx0ZXIuT2Zmc2V0OworICAgICAgICAgRGF0YV9MYXN0ICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgICAgIERhdGFfTGVuICAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7IC0tICAtMQorICAgICAgICAgT3V0X0xlbiAgICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsgLS0gIC0xCisgICAgICBiZWdpbgorICAgICAgICAgT3V0X0ZpcnN0IDo9IE91dF9MYXN0ICsgMTsKKworICAgICAgICAgaWYgRGF0YV9GaXJzdCA+IERhdGEnTGFzdCB0aGVuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICBlbmQgaWY7CisKKyAgICAgICAgIERhdGFfTGVuICA6PSBEYXRhJ0xhc3QgICAgIC0gRGF0YV9GaXJzdDsKKyAgICAgICAgIE91dF9MZW4gICA6PSBPdXRfRGF0YSdMYXN0IC0gT3V0X0ZpcnN0OworCisgICAgICAgICBpZiBEYXRhX0xlbiA8PSBPdXRfTGVuIHRoZW4KKyAgICAgICAgICAgIE91dF9MYXN0ICA6PSBPdXRfRmlyc3QgICsgRGF0YV9MZW47CisgICAgICAgICAgICBEYXRhX0xhc3QgOj0gRGF0YSdMYXN0OworICAgICAgICAgZWxzZQorICAgICAgICAgICAgT3V0X0xhc3QgIDo9IE91dF9EYXRhJ0xhc3Q7CisgICAgICAgICAgICBEYXRhX0xhc3QgOj0gRGF0YV9GaXJzdCArIE91dF9MZW47CisgICAgICAgICBlbmQgaWY7CisKKyAgICAgICAgIE91dF9EYXRhIChPdXRfRmlyc3QgLi4gT3V0X0xhc3QpIDo9IERhdGEgKERhdGFfRmlyc3QgLi4gRGF0YV9MYXN0KTsKKworICAgICAgICAgRGF0YV9GaXJzdCA6PSBEYXRhX0xhc3QgKyAxOworICAgICAgICAgT3V0X0ZpcnN0ICA6PSBPdXRfTGFzdCArIDE7CisgICAgICBlbmQgQWRkX0RhdGE7CisKKyAgICAgIC0tLS0tLS0tLS0tLQorICAgICAgLS0gUHV0XzMyIC0tCisgICAgICAtLS0tLS0tLS0tLS0KKworICAgICAgcHJvY2VkdXJlIFB1dF8zMgorICAgICAgICAoSXRlbSA6IGluIG91dCBTdHJlYW1fRWxlbWVudF9BcnJheTsKKyAgICAgICAgIERhdGEgOiBpbiAgICAgVW5zaWduZWRfMzIpCisgICAgICBpcworICAgICAgICAgRCA6IFVuc2lnbmVkXzMyIDo9IERhdGE7CisgICAgICBiZWdpbgorICAgICAgICAgZm9yIEogaW4gSXRlbSdGaXJzdCAuLiBJdGVtJ0ZpcnN0ICsgMyBsb29wCisgICAgICAgICAgICBJdGVtIChKKSA6PSBTdHJlYW1fRWxlbWVudCAoRCBhbmQgMTYjRkYjKTsKKyAgICAgICAgICAgIEQgOj0gU2hpZnRfUmlnaHQgKEQsIDgpOworICAgICAgICAgZW5kIGxvb3A7CisgICAgICBlbmQgUHV0XzMyOworCisgICBiZWdpbgorICAgICAgT3V0X0xhc3QgOj0gT3V0X0RhdGEnRmlyc3QgLSAxOworCisgICAgICBpZiBub3QgRmlsdGVyLlN0cmVhbV9FbmQgdGhlbgorICAgICAgICAgQWRkX0RhdGEgKFNpbXBsZV9HWmlwX0hlYWRlcik7CisKKyAgICAgICAgIFRyYW5zbGF0ZV9BdXRvCisgICAgICAgICAgIChGaWx0ZXIgICA9PiBGaWx0ZXIsCisgICAgICAgICAgICBJbl9EYXRhICA9PiBJbl9EYXRhLAorICAgICAgICAgICAgSW5fTGFzdCAgPT4gSW5fTGFzdCwKKyAgICAgICAgICAgIE91dF9EYXRhID0+IE91dF9EYXRhIChPdXRfRmlyc3QgLi4gT3V0X0RhdGEnTGFzdCksCisgICAgICAgICAgICBPdXRfTGFzdCA9PiBPdXRfTGFzdCwKKyAgICAgICAgICAgIEZsdXNoICAgID0+IEZsdXNoKTsKKworICAgICAgICAgQ1JDMzIgKEZpbHRlci5DUkMsIEluX0RhdGEgKEluX0RhdGEnRmlyc3QgLi4gSW5fTGFzdCkpOworICAgICAgZW5kIGlmOworCisgICAgICBpZiBGaWx0ZXIuU3RyZWFtX0VuZCBhbmQgdGhlbiBPdXRfTGFzdCA8PSBPdXRfRGF0YSdMYXN0IHRoZW4KKyAgICAgICAgIC0tICBUaGlzIGRldGVjdGlvbiBtZXRob2Qgd291bGQgd29yayBvbmx5IHdoZW4KKyAgICAgICAgIC0tICBTaW1wbGVfR1ppcF9IZWFkZXInTGFzdCA+IEZvb3Rlcl9BcnJheSdMYXN0CisKKyAgICAgICAgIGlmIEZpbHRlci5PZmZzZXQgPSBTaW1wbGVfR1ppcF9IZWFkZXInTGFzdCArIDEgdGhlbgorICAgICAgICAgICAgRmlsdGVyLk9mZnNldCA6PSBGb290ZXJfQXJyYXknRmlyc3Q7CisgICAgICAgICBlbmQgaWY7CisKKyAgICAgICAgIGRlY2xhcmUKKyAgICAgICAgICAgIEZvb3RlciA6IEZvb3Rlcl9BcnJheTsKKyAgICAgICAgIGJlZ2luCisgICAgICAgICAgICBQdXRfMzIgKEZvb3RlciwgRmlsdGVyLkNSQyk7CisgICAgICAgICAgICBQdXRfMzIgKEZvb3RlciAoRm9vdGVyJ0ZpcnN0ICsgNCAuLiBGb290ZXInTGFzdCksCisgICAgICAgICAgICAgICAgICAgIFVuc2lnbmVkXzMyIChUb3RhbF9JbiAoRmlsdGVyKSkpOworICAgICAgICAgICAgQWRkX0RhdGEgKEZvb3Rlcik7CisgICAgICAgICBlbmQ7CisgICAgICBlbmQgaWY7CisgICBlbmQgVHJhbnNsYXRlX0daaXA7CisKKyAgIC0tLS0tLS0tLS0tLS0KKyAgIC0tIFZlcnNpb24gLS0KKyAgIC0tLS0tLS0tLS0tLS0KKworICAgZnVuY3Rpb24gVmVyc2lvbiByZXR1cm4gU3RyaW5nIGlzCisgICBiZWdpbgorICAgICAgcmV0dXJuIEludGVyZmFjZXMuQy5TdHJpbmdzLlZhbHVlIChUaGluLnpsaWJWZXJzaW9uKTsKKyAgIGVuZCBWZXJzaW9uOworCisgICAtLS0tLS0tLS0tLQorICAgLS0gV3JpdGUgLS0KKyAgIC0tLS0tLS0tLS0tCisKKyAgIHByb2NlZHVyZSBXcml0ZQorICAgICAoRmlsdGVyIDogaW4gb3V0IEZpbHRlcl9UeXBlOworICAgICAgSXRlbSAgIDogaW4gICAgIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OworICAgICAgRmx1c2ggIDogaW4gICAgIEZsdXNoX01vZGUgOj0gTm9fRmx1c2gpCisgICBpcworICAgICAgQnVmZmVyICAgOiBTdHJlYW1fRWxlbWVudF9BcnJheSAoMSAuLiBCdWZmZXJfU2l6ZSk7CisgICAgICBJbl9MYXN0ICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgIE91dF9MYXN0IDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworICAgICAgSW5fRmlyc3QgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQgOj0gSXRlbSdGaXJzdDsKKyAgIGJlZ2luCisgICAgICBpZiBJdGVtJ0xlbmd0aCA9IDAgYW5kIEZsdXNoID0gTm9fRmx1c2ggdGhlbgorICAgICAgICAgcmV0dXJuOworICAgICAgZW5kIGlmOworCisgICAgICBsb29wCisgICAgICAgICBUcmFuc2xhdGUKKyAgICAgICAgICAgKEZpbHRlciAgID0+IEZpbHRlciwKKyAgICAgICAgICAgIEluX0RhdGEgID0+IEl0ZW0gKEluX0ZpcnN0IC4uIEl0ZW0nTGFzdCksCisgICAgICAgICAgICBJbl9MYXN0ICA9PiBJbl9MYXN0LAorICAgICAgICAgICAgT3V0X0RhdGEgPT4gQnVmZmVyLAorICAgICAgICAgICAgT3V0X0xhc3QgPT4gT3V0X0xhc3QsCisgICAgICAgICAgICBGbHVzaCAgICA9PiBGbHVzaCk7CisKKyAgICAgICAgIGlmIE91dF9MYXN0ID49IEJ1ZmZlcidGaXJzdCB0aGVuCisgICAgICAgICAgICBXcml0ZSAoQnVmZmVyICgxIC4uIE91dF9MYXN0KSk7CisgICAgICAgICBlbmQgaWY7CisKKyAgICAgICAgIGV4aXQgd2hlbiBJbl9MYXN0ID0gSXRlbSdMYXN0IG9yIFN0cmVhbV9FbmQgKEZpbHRlcik7CisKKyAgICAgICAgIEluX0ZpcnN0IDo9IEluX0xhc3QgKyAxOworICAgICAgZW5kIGxvb3A7CisgICBlbmQgV3JpdGU7CisKK2VuZCBaTGliOwpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9hZGEvemxpYi5hZHMgYi96bGliL3NyYy9jb250cmliL2FkYS96bGliLmFkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWZmYzQwCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9hZGEvemxpYi5hZHMKQEAgLTAsMCArMSwzMjggQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gICAgICAgICAgICAgICAgICAgICAgWkxpYiBmb3IgQWRhIHRoaWNrIGJpbmRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBEbWl0cml5IEFuaXNpbWtvdiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgLS0KKy0tICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAtLQorLS0gIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCAgIC0tCistLSAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgICAgIC0tCistLSAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAgICAgLS0KKy0tICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSAgICAgICAtLQorLS0gIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAtLQorLS0gIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIC0tCistLSAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIGlmIG90aGVyIGZpbGVzIGluc3RhbnRpYXRlIGdlbmVyaWNzIGZyb20gdGhpcyAgIC0tCistLSAgdW5pdCwgb3IgeW91IGxpbmsgdGhpcyB1bml0IHdpdGggb3RoZXIgZmlsZXMgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLCAgLS0KKy0tICB0aGlzICB1bml0ICBkb2VzIG5vdCAgYnkgaXRzZWxmIGNhdXNlICB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdG8gYmUgICAtLQorLS0gIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiBUaGlzIGV4Y2VwdGlvbiBkb2VzIG5vdCAgICAgIC0tCistLSAgaG93ZXZlciBpbnZhbGlkYXRlIGFueSBvdGhlciByZWFzb25zIHdoeSB0aGUgZXhlY3V0YWJsZSBmaWxlICBtaWdodCBiZSAgLS0KKy0tICBjb3ZlcmVkIGJ5IHRoZSAgR05VIFB1YmxpYyBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tICAkSWQ6IHpsaWIuYWRzLHYgMS4yNiAyMDA0LzA5LzA2IDA2OjUzOjE5IHZhZ3VsIEV4cCAkCisKK3dpdGggQWRhLlN0cmVhbXM7CisKK3dpdGggSW50ZXJmYWNlczsKKworcGFja2FnZSBaTGliIGlzCisKKyAgIFpMaWJfRXJyb3IgICA6IGV4Y2VwdGlvbjsKKyAgIFN0YXR1c19FcnJvciA6IGV4Y2VwdGlvbjsKKworICAgdHlwZSBDb21wcmVzc2lvbl9MZXZlbCBpcyBuZXcgSW50ZWdlciByYW5nZSAtMSAuLiA5OworCisgICB0eXBlIEZsdXNoX01vZGUgaXMgcHJpdmF0ZTsKKworICAgdHlwZSBDb21wcmVzc2lvbl9NZXRob2QgaXMgcHJpdmF0ZTsKKworICAgdHlwZSBXaW5kb3dfQml0c19UeXBlIGlzIG5ldyBJbnRlZ2VyIHJhbmdlIDggLi4gMTU7CisKKyAgIHR5cGUgTWVtb3J5X0xldmVsX1R5cGUgaXMgbmV3IEludGVnZXIgcmFuZ2UgMSAuLiA5OworCisgICB0eXBlIFVuc2lnbmVkXzMyIGlzIG5ldyBJbnRlcmZhY2VzLlVuc2lnbmVkXzMyOworCisgICB0eXBlIFN0cmF0ZWd5X1R5cGUgaXMgcHJpdmF0ZTsKKworICAgdHlwZSBIZWFkZXJfVHlwZSBpcyAoTm9uZSwgQXV0bywgRGVmYXVsdCwgR1ppcCk7CisgICAtLSAgSGVhZGVyIHR5cGUgdXNhZ2UgaGF2ZSBhIHNvbWUgbGltaXRhdGlvbiBmb3IgaW5mbGF0ZS4KKyAgIC0tICBTZWUgY29tbWVudCBmb3IgSW5mbGF0ZV9Jbml0LgorCisgICBzdWJ0eXBlIENvdW50IGlzIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0NvdW50OworCisgICBEZWZhdWx0X01lbW9yeV9MZXZlbCA6IGNvbnN0YW50IE1lbW9yeV9MZXZlbF9UeXBlIDo9IDg7CisgICBEZWZhdWx0X1dpbmRvd19CaXRzICA6IGNvbnN0YW50IFdpbmRvd19CaXRzX1R5cGUgIDo9IDE1OworCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLSBDb21wcmVzc2lvbiBtZXRob2QgY29uc3RhbnRzIC0tCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIERlZmxhdGVkIDogY29uc3RhbnQgQ29tcHJlc3Npb25fTWV0aG9kOworICAgLS0gIE9ubHkgb25lIG1ldGhvZCBhbGxvd2VkIGluIHRoaXMgWkxpYiB2ZXJzaW9uCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0gQ29tcHJlc3Npb24gbGV2ZWwgY29uc3RhbnRzIC0tCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgTm9fQ29tcHJlc3Npb24gICAgICA6IGNvbnN0YW50IENvbXByZXNzaW9uX0xldmVsIDo9IDA7CisgICBCZXN0X1NwZWVkICAgICAgICAgIDogY29uc3RhbnQgQ29tcHJlc3Npb25fTGV2ZWwgOj0gMTsKKyAgIEJlc3RfQ29tcHJlc3Npb24gICAgOiBjb25zdGFudCBDb21wcmVzc2lvbl9MZXZlbCA6PSA5OworICAgRGVmYXVsdF9Db21wcmVzc2lvbiA6IGNvbnN0YW50IENvbXByZXNzaW9uX0xldmVsIDo9IC0xOworCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0gRmx1c2ggbW9kZSBjb25zdGFudHMgLS0KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIE5vX0ZsdXNoICAgICAgOiBjb25zdGFudCBGbHVzaF9Nb2RlOworICAgLS0gIFJlZ3VsYXIgd2F5IGZvciBjb21wcmVzc2lvbiwgbm8gZmx1c2gKKworICAgUGFydGlhbF9GbHVzaCA6IGNvbnN0YW50IEZsdXNoX01vZGU7CisgICAtLSAgV2lsbCBiZSByZW1vdmVkLCB1c2UgWl9TWU5DX0ZMVVNIIGluc3RlYWQKKworICAgU3luY19GbHVzaCAgICA6IGNvbnN0YW50IEZsdXNoX01vZGU7CisgICAtLSAgQWxsIHBlbmRpbmcgb3V0cHV0IGlzIGZsdXNoZWQgdG8gdGhlIG91dHB1dCBidWZmZXIgYW5kIHRoZSBvdXRwdXQKKyAgIC0tICBpcyBhbGlnbmVkIG9uIGEgYnl0ZSBib3VuZGFyeSwgc28gdGhhdCB0aGUgZGVjb21wcmVzc29yIGNhbiBnZXQgYWxsCisgICAtLSAgaW5wdXQgZGF0YSBhdmFpbGFibGUgc28gZmFyLiAoSW4gcGFydGljdWxhciBhdmFpbF9pbiBpcyB6ZXJvIGFmdGVyIHRoZQorICAgLS0gIGNhbGwgaWYgZW5vdWdoIG91dHB1dCBzcGFjZSBoYXMgYmVlbiBwcm92aWRlZCAgYmVmb3JlIHRoZSBjYWxsLikKKyAgIC0tICBGbHVzaGluZyBtYXkgZGVncmFkZSBjb21wcmVzc2lvbiBmb3Igc29tZSBjb21wcmVzc2lvbiBhbGdvcml0aG1zIGFuZCBzbworICAgLS0gIGl0IHNob3VsZCBiZSB1c2VkIG9ubHkgd2hlbiBuZWNlc3NhcnkuCisKKyAgIEJsb2NrX0ZsdXNoICAgOiBjb25zdGFudCBGbHVzaF9Nb2RlOworICAgLS0gIFpfQkxPQ0sgcmVxdWVzdHMgdGhhdCBpbmZsYXRlKCkgc3RvcAorICAgLS0gIGlmIGFuZCB3aGVuIGl0IGdldCB0byB0aGUgbmV4dCBkZWZsYXRlIGJsb2NrIGJvdW5kYXJ5LiBXaGVuIGRlY29kaW5nIHRoZQorICAgLS0gIHpsaWIgb3IgZ3ppcCBmb3JtYXQsIHRoaXMgd2lsbCBjYXVzZSBpbmZsYXRlKCkgdG8gcmV0dXJuIGltbWVkaWF0ZWx5CisgICAtLSAgYWZ0ZXIgdGhlIGhlYWRlciBhbmQgYmVmb3JlIHRoZSBmaXJzdCBibG9jay4gV2hlbiBkb2luZyBhIHJhdyBpbmZsYXRlLAorICAgLS0gIGluZmxhdGUoKSB3aWxsIGdvIGFoZWFkIGFuZCBwcm9jZXNzIHRoZSBmaXJzdCBibG9jaywgYW5kIHdpbGwgcmV0dXJuCisgICAtLSAgd2hlbiBpdCBnZXRzIHRvIHRoZSBlbmQgb2YgdGhhdCBibG9jaywgb3Igd2hlbiBpdCBydW5zIG91dCBvZiBkYXRhLgorCisgICBGdWxsX0ZsdXNoICAgIDogY29uc3RhbnQgRmx1c2hfTW9kZTsKKyAgIC0tICBBbGwgb3V0cHV0IGlzIGZsdXNoZWQgYXMgd2l0aCBTWU5DX0ZMVVNILCBhbmQgdGhlIGNvbXByZXNzaW9uIHN0YXRlCisgICAtLSAgaXMgcmVzZXQgc28gdGhhdCBkZWNvbXByZXNzaW9uIGNhbiByZXN0YXJ0IGZyb20gdGhpcyBwb2ludCBpZiBwcmV2aW91cworICAgLS0gIGNvbXByZXNzZWQgZGF0YSBoYXMgYmVlbiBkYW1hZ2VkIG9yIGlmIHJhbmRvbSBhY2Nlc3MgaXMgZGVzaXJlZC4gVXNpbmcKKyAgIC0tICBGdWxsX0ZsdXNoIHRvbyBvZnRlbiBjYW4gc2VyaW91c2x5IGRlZ3JhZGUgdGhlIGNvbXByZXNzaW9uLgorCisgICBGaW5pc2ggICAgICAgIDogY29uc3RhbnQgRmx1c2hfTW9kZTsKKyAgIC0tICBKdXN0IGZvciB0ZWxsIHRoZSBjb21wcmVzc29yIHRoYXQgaW5wdXQgZGF0YSBpcyBjb21wbGV0ZS4KKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLSBDb21wcmVzc2lvbiBzdHJhdGVneSBjb25zdGFudHMgLS0KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAtLSAgUkxFIHN0YXRlZ3kgY291bGQgYmUgdXNlZCBvbmx5IGluIHZlcnNpb24gMS4yLjAgYW5kIGxhdGVyLgorCisgICBGaWx0ZXJlZCAgICAgICAgIDogY29uc3RhbnQgU3RyYXRlZ3lfVHlwZTsKKyAgIEh1ZmZtYW5fT25seSAgICAgOiBjb25zdGFudCBTdHJhdGVneV9UeXBlOworICAgUkxFICAgICAgICAgICAgICA6IGNvbnN0YW50IFN0cmF0ZWd5X1R5cGU7CisgICBEZWZhdWx0X1N0cmF0ZWd5IDogY29uc3RhbnQgU3RyYXRlZ3lfVHlwZTsKKworICAgRGVmYXVsdF9CdWZmZXJfU2l6ZSA6IGNvbnN0YW50IDo9IDQwOTY7CisKKyAgIHR5cGUgRmlsdGVyX1R5cGUgaXMgdGFnZ2VkIGxpbWl0ZWQgcHJpdmF0ZTsKKyAgIC0tICBUaGUgZmlsdGVyIGlzIGZvciBjb21wcmVzc2lvbiBhbmQgZm9yIGRlY29tcHJlc3Npb24uCisgICAtLSAgVGhlIHVzYWdlIG9mIHRoZSB0eXBlIGlzIGRlcGVuZCBvZiBpdHMgaW5pdGlhbGl6YXRpb24uCisKKyAgIGZ1bmN0aW9uIFZlcnNpb24gcmV0dXJuIFN0cmluZzsKKyAgIHByYWdtYSBJbmxpbmUgKFZlcnNpb24pOworICAgLS0gIFJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFpMaWIgdmVyc2lvbi4KKworICAgcHJvY2VkdXJlIERlZmxhdGVfSW5pdAorICAgICAoRmlsdGVyICAgICAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOworICAgICAgTGV2ZWwgICAgICAgIDogaW4gICAgIENvbXByZXNzaW9uX0xldmVsICA6PSBEZWZhdWx0X0NvbXByZXNzaW9uOworICAgICAgU3RyYXRlZ3kgICAgIDogaW4gICAgIFN0cmF0ZWd5X1R5cGUgICAgICA6PSBEZWZhdWx0X1N0cmF0ZWd5OworICAgICAgTWV0aG9kICAgICAgIDogaW4gICAgIENvbXByZXNzaW9uX01ldGhvZCA6PSBEZWZsYXRlZDsKKyAgICAgIFdpbmRvd19CaXRzICA6IGluICAgICBXaW5kb3dfQml0c19UeXBlICAgOj0gRGVmYXVsdF9XaW5kb3dfQml0czsKKyAgICAgIE1lbW9yeV9MZXZlbCA6IGluICAgICBNZW1vcnlfTGV2ZWxfVHlwZSAgOj0gRGVmYXVsdF9NZW1vcnlfTGV2ZWw7CisgICAgICBIZWFkZXIgICAgICAgOiBpbiAgICAgSGVhZGVyX1R5cGUgICAgICAgIDo9IERlZmF1bHQpOworICAgLS0gIENvbXByZXNzb3IgaW5pdGlhbGl6YXRpb24uCisgICAtLSAgV2hlbiBIZWFkZXIgcGFyYW1ldGVyIGlzIEF1dG8gb3IgRGVmYXVsdCwgdGhlbiBkZWZhdWx0IHpsaWIgaGVhZGVyCisgICAtLSAgd291bGQgYmUgcHJvdmlkZWQgZm9yIGNvbXByZXNzZWQgZGF0YS4KKyAgIC0tICBXaGVuIEhlYWRlciBpcyBHWmlwLCB0aGVuIGd6aXAgaGVhZGVyIHdvdWxkIGJlIHNldCBpbnN0ZWFkIG9mCisgICAtLSAgZGVmYXVsdCBoZWFkZXIuCisgICAtLSAgV2hlbiBIZWFkZXIgaXMgTm9uZSwgbm8gaGVhZGVyIHdvdWxkIGJlIHNldCBmb3IgY29tcHJlc3NlZCBkYXRhLgorCisgICBwcm9jZWR1cmUgSW5mbGF0ZV9Jbml0CisgICAgIChGaWx0ZXIgICAgICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKKyAgICAgIFdpbmRvd19CaXRzIDogaW4gICAgIFdpbmRvd19CaXRzX1R5cGUgOj0gRGVmYXVsdF9XaW5kb3dfQml0czsKKyAgICAgIEhlYWRlciAgICAgIDogaW4gICAgIEhlYWRlcl9UeXBlICAgICAgOj0gRGVmYXVsdCk7CisgICAtLSAgRGVjb21wcmVzc29yIGluaXRpYWxpemF0aW9uLgorICAgLS0gIERlZmF1bHQgaGVhZGVyIHR5cGUgbWVhbiB0aGF0IFpMaWIgZGVmYXVsdCBoZWFkZXIgaXMgZXhwZWN0aW5nIGluIHRoZQorICAgLS0gIGlucHV0IGNvbXByZXNzZWQgc3RyZWFtLgorICAgLS0gIEhlYWRlciB0eXBlIE5vbmUgbWVhbiB0aGF0IG5vIGhlYWRlciBpcyBleHBlY3RpbmcgaW4gdGhlIGlucHV0IHN0cmVhbS4KKyAgIC0tICBHWmlwIGhlYWRlciB0eXBlIG1lYW4gdGhhdCBHWmlwIGhlYWRlciBpcyBleHBlY3RpbmcgaW4gdGhlCisgICAtLSAgaW5wdXQgY29tcHJlc3NlZCBzdHJlYW0uCisgICAtLSAgQXV0byBoZWFkZXIgdHlwZSBtZWFuIHRoYXQgaGVhZGVyIHR5cGUgKEdaaXAgb3IgTmF0aXZlKSB3b3VsZCBiZQorICAgLS0gIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkgaW4gdGhlIGlucHV0IHN0cmVhbS4KKyAgIC0tICBOb3RlIHRoYXQgaGVhZGVyIHR5cGVzIHBhcmFtZXRlciB2YWx1ZXMgTm9uZSwgR1ppcCBhbmQgQXV0byBhcmUKKyAgIC0tICBzdXBwb3J0ZWQgZm9yIGluZmxhdGUgcm91dGluZSBvbmx5IGluIFpMaWIgdmVyc2lvbnMgMS4yLjAuMiBhbmQgbGF0ZXIuCisgICAtLSAgRGVmbGF0ZV9Jbml0IGlzIHN1cHBvcnRpbmcgYWxsIGhlYWRlciB0eXBlcy4KKworICAgZnVuY3Rpb24gSXNfT3BlbiAoRmlsdGVyIDogaW4gRmlsdGVyX1R5cGUpIHJldHVybiBCb29sZWFuOworICAgcHJhZ21hIElubGluZSAoSXNfT3Blbik7CisgICAtLSAgSXMgdGhlIGZpbHRlciBvcGVuZWQgZm9yIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24uCisKKyAgIHByb2NlZHVyZSBDbG9zZQorICAgICAoRmlsdGVyICAgICAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOworICAgICAgSWdub3JlX0Vycm9yIDogaW4gICAgIEJvb2xlYW4gOj0gRmFsc2UpOworICAgLS0gIENsb3NpbmcgdGhlIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Nvci4KKyAgIC0tICBJZiBzdHJlYW0gaXMgY2xvc2luZyBiZWZvcmUgdGhlIGNvbXBsZXRlIGFuZCBJZ25vcmVfRXJyb3IgaXMgRmFsc2UsCisgICAtLSAgVGhlIGV4Y2VwdGlvbiB3b3VsZCBiZSByYWlzZWQuCisKKyAgIGdlbmVyaWMKKyAgICAgIHdpdGggcHJvY2VkdXJlIERhdGFfSW4KKyAgICAgICAgKEl0ZW0gOiBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7CisgICAgICAgICBMYXN0IDogb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldCk7CisgICAgICB3aXRoIHByb2NlZHVyZSBEYXRhX091dAorICAgICAgICAoSXRlbSA6IGluIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5KTsKKyAgIHByb2NlZHVyZSBHZW5lcmljX1RyYW5zbGF0ZQorICAgICAoRmlsdGVyICAgICAgICAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOworICAgICAgSW5fQnVmZmVyX1NpemUgIDogaW4gICAgIEludGVnZXIgOj0gRGVmYXVsdF9CdWZmZXJfU2l6ZTsKKyAgICAgIE91dF9CdWZmZXJfU2l6ZSA6IGluICAgICBJbnRlZ2VyIDo9IERlZmF1bHRfQnVmZmVyX1NpemUpOworICAgLS0gIENvbXByZXNzL2RlY29tcHJlc3MgZGF0YSBmZXRjaCBmcm9tIERhdGFfSW4gcm91dGluZSBhbmQgcGFzcyB0aGUgcmVzdWx0CisgICAtLSAgdG8gdGhlIERhdGFfT3V0IHJvdXRpbmUuIFVzZXIgc2hvdWxkIHByb3ZpZGUgRGF0YV9JbiBhbmQgRGF0YV9PdXQKKyAgIC0tICBmb3IgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBkYXRhIGZsb3cuCisgICAtLSAgQ29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBkZXBlbmQgb24gRmlsdGVyIGluaXRpYWxpemF0aW9uLgorCisgICBmdW5jdGlvbiBUb3RhbF9JbiAoRmlsdGVyIDogaW4gRmlsdGVyX1R5cGUpIHJldHVybiBDb3VudDsKKyAgIHByYWdtYSBJbmxpbmUgKFRvdGFsX0luKTsKKyAgIC0tICBSZXR1cm5zIHRvdGFsIG51bWJlciBvZiBpbnB1dCBieXRlcyByZWFkIHNvIGZhcgorCisgICBmdW5jdGlvbiBUb3RhbF9PdXQgKEZpbHRlciA6IGluIEZpbHRlcl9UeXBlKSByZXR1cm4gQ291bnQ7CisgICBwcmFnbWEgSW5saW5lIChUb3RhbF9PdXQpOworICAgLS0gIFJldHVybnMgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIKKworICAgZnVuY3Rpb24gQ1JDMzIKKyAgICAgKENSQyAgICA6IGluIFVuc2lnbmVkXzMyOworICAgICAgRGF0YSAgIDogaW4gQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXkpCisgICAgICByZXR1cm4gVW5zaWduZWRfMzI7CisgICBwcmFnbWEgSW5saW5lIChDUkMzMik7CisgICAtLSAgQ29tcHV0ZSBDUkMzMiwgaXQgY291bGQgYmUgbmVjZXNzYXJ5IGZvciBtYWtlIGd6aXAgZm9ybWF0CisKKyAgIHByb2NlZHVyZSBDUkMzMgorICAgICAoQ1JDICA6IGluIG91dCBVbnNpZ25lZF8zMjsKKyAgICAgIERhdGEgOiBpbiAgICAgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXkpOworICAgcHJhZ21hIElubGluZSAoQ1JDMzIpOworICAgLS0gIENvbXB1dGUgQ1JDMzIsIGl0IGNvdWxkIGJlIG5lY2Vzc2FyeSBmb3IgbWFrZSBnemlwIGZvcm1hdAorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLSAgQmVsb3cgaXMgbW9yZSBjb21wbGV4IGxvdyBsZXZlbCByb3V0aW5lcy4gIC0tCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIHByb2NlZHVyZSBUcmFuc2xhdGUKKyAgICAgKEZpbHRlciAgICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKKyAgICAgIEluX0RhdGEgICA6IGluICAgICBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKKyAgICAgIEluX0xhc3QgICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICAgICBPdXRfRGF0YSAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7CisgICAgICBPdXRfTGFzdCAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworICAgICAgRmx1c2ggICAgIDogaW4gICAgIEZsdXNoX01vZGUpOworICAgLS0gIENvbXByZXNzL2RlY29tcHJlc3MgdGhlIEluX0RhdGEgYnVmZmVyIGFuZCBwbGFjZSB0aGUgcmVzdWx0IGludG8KKyAgIC0tICBPdXRfRGF0YS4gSW5fTGFzdCBpcyB0aGUgaW5kZXggb2YgbGFzdCBlbGVtZW50IGZyb20gSW5fRGF0YSBhY2NlcHRlZCBieQorICAgLS0gIHRoZSBGaWx0ZXIuIE91dF9MYXN0IGlzIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHJlY2VpdmVkIGRhdGEgZnJvbQorICAgLS0gIEZpbHRlci4gVG8gdGVsbCB0aGUgZmlsdGVyIHRoYXQgaW5jb21pbmcgZGF0YSBhcmUgY29tcGxldGUgcHV0IHRoZQorICAgLS0gIEZsdXNoIHBhcmFtZXRlciB0byBGaW5pc2guCisKKyAgIGZ1bmN0aW9uIFN0cmVhbV9FbmQgKEZpbHRlciA6IGluIEZpbHRlcl9UeXBlKSByZXR1cm4gQm9vbGVhbjsKKyAgIHByYWdtYSBJbmxpbmUgKFN0cmVhbV9FbmQpOworICAgLS0gIFJldHVybiB0aGUgdHJ1ZSB3aGVuIHRoZSBzdHJlYW0gaXMgY29tcGxldGUuCisKKyAgIHByb2NlZHVyZSBGbHVzaAorICAgICAoRmlsdGVyICAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOworICAgICAgT3V0X0RhdGEgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OworICAgICAgT3V0X0xhc3QgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgIEZsdXNoICAgICA6IGluICAgICBGbHVzaF9Nb2RlKTsKKyAgIHByYWdtYSBJbmxpbmUgKEZsdXNoKTsKKyAgIC0tICBGbHVzaGluZyB0aGUgZGF0YSBmcm9tIHRoZSBjb21wcmVzc29yLgorCisgICBnZW5lcmljCisgICAgICB3aXRoIHByb2NlZHVyZSBXcml0ZQorICAgICAgICAoSXRlbSA6IGluIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5KTsKKyAgICAgIC0tICBVc2VyIHNob3VsZCBwcm92aWRlIHRoaXMgcm91dGluZSBmb3IgYWNjZXB0CisgICAgICAtLSAgY29tcHJlc3NlZC9kZWNvbXByZXNzZWQgZGF0YS4KKworICAgICAgQnVmZmVyX1NpemUgOiBpbiBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQKKyAgICAgICAgIDo9IERlZmF1bHRfQnVmZmVyX1NpemU7CisgICAgICAtLSAgQnVmZmVyIHNpemUgZm9yIFdyaXRlIHVzZXIgcm91dGluZS4KKworICAgcHJvY2VkdXJlIFdyaXRlCisgICAgIChGaWx0ZXIgIDogaW4gb3V0IEZpbHRlcl9UeXBlOworICAgICAgSXRlbSAgICA6IGluICAgICBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKKyAgICAgIEZsdXNoICAgOiBpbiAgICAgRmx1c2hfTW9kZSA6PSBOb19GbHVzaCk7CisgICAtLSAgQ29tcHJlc3MvRGVjb21wcmVzcyBkYXRhIGZyb20gSXRlbSB0byB0aGUgZ2VuZXJpYyBwYXJhbWV0ZXIgcHJvY2VkdXJlCisgICAtLSAgV3JpdGUuIE91dHB1dCBidWZmZXIgc2l6ZSBjb3VsZCBiZSBzZXQgaW4gQnVmZmVyX1NpemUgZ2VuZXJpYyBwYXJhbWV0ZXIuCisKKyAgIGdlbmVyaWMKKyAgICAgIHdpdGggcHJvY2VkdXJlIFJlYWQKKyAgICAgICAgKEl0ZW0gOiBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7CisgICAgICAgICBMYXN0IDogb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldCk7CisgICAgICAtLSAgVXNlciBzaG91bGQgcHJvdmlkZSBkYXRhIGZvciBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uCisgICAgICAtLSAgdGhydSB0aGlzIHJvdXRpbmUuCisKKyAgICAgIEJ1ZmZlciA6IGluIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKKyAgICAgIC0tICBCdWZmZXIgZm9yIGtlZXAgcmVtYWluaW5nIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMKKyAgICAgIC0tICBiYWNrIHJlYWQuCisKKyAgICAgIFJlc3RfRmlyc3QsIFJlc3RfTGFzdCA6IGluIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICAgICAtLSAgUmVzdF9GaXJzdCBoYXZlIHRvIGJlIGluaXRpYWxpemVkIHRvIEJ1ZmZlcidMYXN0ICsgMQorICAgICAgLS0gIFJlc3RfTGFzdCBoYXZlIHRvIGJlIGluaXRpYWxpemVkIHRvIEJ1ZmZlcidMYXN0CisgICAgICAtLSAgYmVmb3JlIHVzYWdlLgorCisgICAgICBBbGxvd19SZWFkX1NvbWUgOiBpbiBCb29sZWFuIDo9IEZhbHNlOworICAgICAgLS0gIElzIGl0IGFsbG93ZWQgdG8gcmV0dXJuIExhc3QgPCBJdGVtJ0xhc3QgYmVmb3JlIGVuZCBvZiBkYXRhLgorCisgICBwcm9jZWR1cmUgUmVhZAorICAgICAoRmlsdGVyIDogaW4gb3V0IEZpbHRlcl9UeXBlOworICAgICAgSXRlbSAgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OworICAgICAgTGFzdCAgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgIEZsdXNoICA6IGluICAgICBGbHVzaF9Nb2RlIDo9IE5vX0ZsdXNoKTsKKyAgIC0tICBDb21wcmVzcy9EZWNvbXByZXNzIGRhdGEgZnJvbSBnZW5lcmljIHBhcmFtZXRlciBwcm9jZWR1cmUgUmVhZCB0byB0aGUKKyAgIC0tICBJdGVtLiBVc2VyIHNob3VsZCBwcm92aWRlIEJ1ZmZlciBhbmQgaW5pdGlhbGl6ZWQgUmVzdF9GaXJzdCwgUmVzdF9MYXN0CisgICAtLSAgaW5kaWNhdG9ycy4gSWYgQWxsb3dfUmVhZF9Tb21lIGlzIFRydWUsIFJlYWQgcm91dGluZXMgY291bGQgcmV0dXJuCisgICAtLSAgTGFzdCA8IEl0ZW0nTGFzdCBvbmx5IGF0IGVuZCBvZiBzdHJlYW0uCisKK3ByaXZhdGUKKworICAgdXNlIEFkYS5TdHJlYW1zOworCisgICBwcmFnbWEgQXNzZXJ0IChBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudCdTaXplICAgID0gICAgOCk7CisgICBwcmFnbWEgQXNzZXJ0IChBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudCdNb2R1bHVzID0gMioqOCk7CisKKyAgIHR5cGUgRmx1c2hfTW9kZSBpcyBuZXcgSW50ZWdlciByYW5nZSAwIC4uIDU7CisKKyAgIHR5cGUgQ29tcHJlc3Npb25fTWV0aG9kIGlzIG5ldyBJbnRlZ2VyIHJhbmdlIDggLi4gODsKKworICAgdHlwZSBTdHJhdGVneV9UeXBlIGlzIG5ldyBJbnRlZ2VyIHJhbmdlIDAgLi4gMzsKKworICAgTm9fRmx1c2ggICAgICA6IGNvbnN0YW50IEZsdXNoX01vZGUgOj0gMDsKKyAgIFBhcnRpYWxfRmx1c2ggOiBjb25zdGFudCBGbHVzaF9Nb2RlIDo9IDE7CisgICBTeW5jX0ZsdXNoICAgIDogY29uc3RhbnQgRmx1c2hfTW9kZSA6PSAyOworICAgRnVsbF9GbHVzaCAgICA6IGNvbnN0YW50IEZsdXNoX01vZGUgOj0gMzsKKyAgIEZpbmlzaCAgICAgICAgOiBjb25zdGFudCBGbHVzaF9Nb2RlIDo9IDQ7CisgICBCbG9ja19GbHVzaCAgIDogY29uc3RhbnQgRmx1c2hfTW9kZSA6PSA1OworCisgICBGaWx0ZXJlZCAgICAgICAgIDogY29uc3RhbnQgU3RyYXRlZ3lfVHlwZSA6PSAxOworICAgSHVmZm1hbl9Pbmx5ICAgICA6IGNvbnN0YW50IFN0cmF0ZWd5X1R5cGUgOj0gMjsKKyAgIFJMRSAgICAgICAgICAgICAgOiBjb25zdGFudCBTdHJhdGVneV9UeXBlIDo9IDM7CisgICBEZWZhdWx0X1N0cmF0ZWd5IDogY29uc3RhbnQgU3RyYXRlZ3lfVHlwZSA6PSAwOworCisgICBEZWZsYXRlZCA6IGNvbnN0YW50IENvbXByZXNzaW9uX01ldGhvZCA6PSA4OworCisgICB0eXBlIFpfU3RyZWFtOworCisgICB0eXBlIFpfU3RyZWFtX0FjY2VzcyBpcyBhY2Nlc3MgYWxsIFpfU3RyZWFtOworCisgICB0eXBlIEZpbHRlcl9UeXBlIGlzIHRhZ2dlZCBsaW1pdGVkIHJlY29yZAorICAgICAgU3RybSAgICAgICAgOiBaX1N0cmVhbV9BY2Nlc3M7CisgICAgICBDb21wcmVzc2lvbiA6IEJvb2xlYW47CisgICAgICBTdHJlYW1fRW5kICA6IEJvb2xlYW47CisgICAgICBIZWFkZXIgICAgICA6IEhlYWRlcl9UeXBlOworICAgICAgQ1JDICAgICAgICAgOiBVbnNpZ25lZF8zMjsKKyAgICAgIE9mZnNldCAgICAgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworICAgICAgLS0gIE9mZnNldCBmb3IgZ3ppcCBoZWFkZXIvZm9vdGVyIG91dHB1dC4KKyAgIGVuZCByZWNvcmQ7CisKK2VuZCBaTGliOwpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9hZGEvemxpYi5ncHIgYi96bGliL3NyYy9jb250cmliL2FkYS96bGliLmdwcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTZiMjJhCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9hZGEvemxpYi5ncHIKQEAgLTAsMCArMSwyMCBAQAorcHJvamVjdCBabGliIGlzCisKKyAgIGZvciBMYW5ndWFnZXMgdXNlICgiQWRhIik7CisgICBmb3IgU291cmNlX0RpcnMgdXNlICgiLiIpOworICAgZm9yIE9iamVjdF9EaXIgdXNlICIuIjsKKyAgIGZvciBNYWluIHVzZSAoInRlc3QuYWRiIiwgIm10ZXN0LmFkYiIsICJyZWFkLmFkYiIsICJidWZmZXJfZGVtbyIpOworCisgICBwYWNrYWdlIENvbXBpbGVyIGlzCisgICAgICBmb3IgRGVmYXVsdF9Td2l0Y2hlcyAoImFkYSIpIHVzZSAoIi1nbmF0d2NmaWxvcHJ1IiwgIi1nbmF0VmNkZmltb3JzdCIsICItZ25hdHlhYmNlZmhpa2xtbm9wcnN0Iik7CisgICBlbmQgQ29tcGlsZXI7CisKKyAgIHBhY2thZ2UgTGlua2VyIGlzCisgICAgICBmb3IgRGVmYXVsdF9Td2l0Y2hlcyAoImFkYSIpIHVzZSAoIi1seiIpOworICAgZW5kIExpbmtlcjsKKworICAgcGFja2FnZSBCdWlsZGVyIGlzCisgICAgICBmb3IgRGVmYXVsdF9Td2l0Y2hlcyAoImFkYSIpIHVzZSAoIi1zIiwgIi1nbmF0USIpOworICAgZW5kIEJ1aWxkZXI7CisKK2VuZCBabGliOwpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9hbWQ2NC9hbWQ2NC1tYXRjaC5TIGIvemxpYi9zcmMvY29udHJpYi9hbWQ2NC9hbWQ2NC1tYXRjaC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZDRhMWMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL2FtZDY0L2FtZDY0LW1hdGNoLlMKQEAgLTAsMCArMSw0NTIgQEAKKy8qCisgKiBtYXRjaC5TIC0tIG9wdGltaXplZCB2ZXJzaW9uIG9mIGxvbmdlc3RfbWF0Y2goKQorICogYmFzZWQgb24gdGhlIHNpbWlsYXIgd29yayBieSBHaWxsZXMgVm9sbGFudCwgYW5kIEJyaWFuIFJhaXRlciwgd3JpdHRlbiAxOTk4CisgKgorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEJTRCBMaWNlbnNlLiBVc2UgYnkgb3duZXJzIG9mIENoZSBHdWV2YXJyYQorICogcGFyYWZlcm5hbGlhIGlzIHByb2hpYml0ZWQsIHdoZXJlIHBvc3NpYmxlLCBhbmQgaGlnaGx5IGRpc2NvdXJhZ2VkCisgKiBlbHNld2hlcmUuCisgKi8KKworI2lmbmRlZiBOT19VTkRFUkxJTkUKKyMJZGVmaW5lCW1hdGNoX2luaXQJX21hdGNoX2luaXQKKyMJZGVmaW5lCWxvbmdlc3RfbWF0Y2gJX2xvbmdlc3RfbWF0Y2gKKyNlbmRpZgorCisjZGVmaW5lCXNjYW5lbmQJCWVieAorI2RlZmluZQlzY2FuZW5kdwlieAorI2RlZmluZQljaGFpbmxlbndtYXNrCWVkeCAvKiBoaWdoIHdvcmQ6IGN1cnJlbnQgY2hhaW4gbGVuIGxvdyB3b3JkOiBzLT53bWFzayAqLworI2RlZmluZQljdXJtYXRjaAlyc2kKKyNkZWZpbmUJY3VybWF0Y2hkCWVzaQorI2RlZmluZQl3aW5kb3diZXN0bGVuCXI4CisjZGVmaW5lCXNjYW5hbGlnbglyOQorI2RlZmluZQlzY2FuYWxpZ25kCXI5ZAorI2RlZmluZQl3aW5kb3cJCXIxMAorI2RlZmluZQliZXN0bGVuCQlyMTEKKyNkZWZpbmUJYmVzdGxlbmQJcjExZAorI2RlZmluZQlzY2Fuc3RhcnQJcjEyZAorI2RlZmluZQlzY2Fuc3RhcnR3CXIxMncKKyNkZWZpbmUgc2NhbgkJcjEzCisjZGVmaW5lIG5pY2VtYXRjaAlyMTRkCisjZGVmaW5lCWxpbWl0CQlyMTUKKyNkZWZpbmUJbGltaXRkCQlyMTVkCisjZGVmaW5lIHByZXYJCXJjeAorCisvKgorICogVGhlIDI1OCBpcyBhICJtYWdpYyBudW1iZXIsIG5vdCBhIHBhcmFtZXRlciAtLSBjaGFuZ2luZyBpdAorICogYnJlYWtzIHRoZSBoZWxsIGxvb3NlCisgKi8KKyNkZWZpbmUJTUFYX01BVENICSgyNTgpCisjZGVmaW5lCU1JTl9NQVRDSAkoMykKKyNkZWZpbmUJTUlOX0xPT0tBSEVBRAkoTUFYX01BVENIICsgTUlOX01BVENIICsgMSkKKyNkZWZpbmUJTUFYX01BVENIXzgJKChNQVhfTUFUQ0ggKyA3KSAmIH43KQorCisvKiBzdGFjayBmcmFtZSBvZmZzZXRzICovCisjZGVmaW5lCUxvY2FsVmFyc1NpemUJKDExMikKKyNkZWZpbmUgX2NoYWlubGVud21hc2sJKCA4LUxvY2FsVmFyc1NpemUpKCVyc3ApCisjZGVmaW5lIF93aW5kb3diZXN0bGVuCSgxNi1Mb2NhbFZhcnNTaXplKSglcnNwKQorI2RlZmluZSBzYXZlX3IxNCAgICAgICAgKDI0LUxvY2FsVmFyc1NpemUpKCVyc3ApCisjZGVmaW5lIHNhdmVfcnNpICAgICAgICAoMzItTG9jYWxWYXJzU2l6ZSkoJXJzcCkKKyNkZWZpbmUgc2F2ZV9yYnggICAgICAgICg0MC1Mb2NhbFZhcnNTaXplKSglcnNwKQorI2RlZmluZSBzYXZlX3IxMiAgICAgICAgKDU2LUxvY2FsVmFyc1NpemUpKCVyc3ApCisjZGVmaW5lIHNhdmVfcjEzICAgICAgICAoNjQtTG9jYWxWYXJzU2l6ZSkoJXJzcCkKKyNkZWZpbmUgc2F2ZV9yMTUgICAgICAgICg4MC1Mb2NhbFZhcnNTaXplKSglcnNwKQorCisKKy5nbG9ibAltYXRjaF9pbml0LCBsb25nZXN0X21hdGNoCisKKy8qCisgKiBPbiBBTUQ2NCB0aGUgZmlyc3QgYXJndW1lbnQgb2YgYSBmdW5jdGlvbiAoaW4gb3VyIGNhc2UgLS0gdGhlIHBvaW50ZXIgdG8KKyAqIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlKSBpcyBwYXNzZWQgaW4gJXJkaSwgaGVuY2Ugb3VyIG9mZnNldHMgYmVsb3cgYXJlCisgKiBhbGwgb2ZmIG9mIHRoYXQuCisgKi8KKworLyogeW91IGNhbiBjaGVjayB0aGUgc3RydWN0dXJlIG9mZnNldCBieSBydW5uaW5nCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImRlZmxhdGUuaCIKKwordm9pZCBwcmludF9kZXBsKCkKK3sKK2RlZmxhdGVfc3RhdGUgZHM7CitkZWZsYXRlX3N0YXRlICpzPSZkczsKK3ByaW50Zigic2l6ZSBwb2ludGVyPSV1XG4iLChpbnQpc2l6ZW9mKHZvaWQqKSk7CisKK3ByaW50ZigiI2RlZmluZSBkc1dTaXplICAgICAgICAgKCUzdSkoJSVyZGkpXG4iLChpbnQpKCgoY2hhciopJihzLT53X3NpemUpKS0oKGNoYXIqKXMpKSk7CitwcmludGYoIiNkZWZpbmUgZHNXTWFzayAgICAgICAgICglM3UpKCUlcmRpKVxuIiwoaW50KSgoKGNoYXIqKSYocy0+d19tYXNrKSktKChjaGFyKilzKSkpOworcHJpbnRmKCIjZGVmaW5lIGRzV2luZG93ICAgICAgICAoJTN1KSglJXJkaSlcbiIsKGludCkoKChjaGFyKikmKHMtPndpbmRvdykpLSgoY2hhciopcykpKTsKK3ByaW50ZigiI2RlZmluZSBkc1ByZXYgICAgICAgICAgKCUzdSkoJSVyZGkpXG4iLChpbnQpKCgoY2hhciopJihzLT5wcmV2KSktKChjaGFyKilzKSkpOworcHJpbnRmKCIjZGVmaW5lIGRzTWF0Y2hMZW4gICAgICAoJTN1KSglJXJkaSlcbiIsKGludCkoKChjaGFyKikmKHMtPm1hdGNoX2xlbmd0aCkpLSgoY2hhciopcykpKTsKK3ByaW50ZigiI2RlZmluZSBkc1ByZXZNYXRjaCAgICAgKCUzdSkoJSVyZGkpXG4iLChpbnQpKCgoY2hhciopJihzLT5wcmV2X21hdGNoKSktKChjaGFyKilzKSkpOworcHJpbnRmKCIjZGVmaW5lIGRzU3RyU3RhcnQgICAgICAoJTN1KSglJXJkaSlcbiIsKGludCkoKChjaGFyKikmKHMtPnN0cnN0YXJ0KSktKChjaGFyKilzKSkpOworcHJpbnRmKCIjZGVmaW5lIGRzTWF0Y2hTdGFydCAgICAoJTN1KSglJXJkaSlcbiIsKGludCkoKChjaGFyKikmKHMtPm1hdGNoX3N0YXJ0KSktKChjaGFyKilzKSkpOworcHJpbnRmKCIjZGVmaW5lIGRzTG9va2FoZWFkICAgICAoJTN1KSglJXJkaSlcbiIsKGludCkoKChjaGFyKikmKHMtPmxvb2thaGVhZCkpLSgoY2hhciopcykpKTsKK3ByaW50ZigiI2RlZmluZSBkc1ByZXZMZW4gICAgICAgKCUzdSkoJSVyZGkpXG4iLChpbnQpKCgoY2hhciopJihzLT5wcmV2X2xlbmd0aCkpLSgoY2hhciopcykpKTsKK3ByaW50ZigiI2RlZmluZSBkc01heENoYWluTGVuICAgKCUzdSkoJSVyZGkpXG4iLChpbnQpKCgoY2hhciopJihzLT5tYXhfY2hhaW5fbGVuZ3RoKSktKChjaGFyKilzKSkpOworcHJpbnRmKCIjZGVmaW5lIGRzR29vZE1hdGNoICAgICAoJTN1KSglJXJkaSlcbiIsKGludCkoKChjaGFyKikmKHMtPmdvb2RfbWF0Y2gpKS0oKGNoYXIqKXMpKSk7CitwcmludGYoIiNkZWZpbmUgZHNOaWNlTWF0Y2ggICAgICglM3UpKCUlcmRpKVxuIiwoaW50KSgoKGNoYXIqKSYocy0+bmljZV9tYXRjaCkpLSgoY2hhciopcykpKTsKK30KKworKi8KKworCisvKgorICB0byBjb21waWxlIGZvciBYQ29kZSAzLjIgb24gTWFjT1NYIHg4Nl82NAorICAtIHJ1biAiZ2NjIC1nIC1jIC1EWENPREVfTUFDX1g2NF9TVFJVQ1RVUkUgYW1kNjQtbWF0Y2guUyIKKyAqLworCisKKyNpZm5kZWYgQ1VSUkVOVF9MSU5YX1hDT0RFX01BQ19YNjRfU1RSVUNUVVJFCisjZGVmaW5lIGRzV1NpemUJCSggNjgpKCVyZGkpCisjZGVmaW5lIGRzV01hc2sJCSggNzYpKCVyZGkpCisjZGVmaW5lIGRzV2luZG93CSggODApKCVyZGkpCisjZGVmaW5lIGRzUHJldgkJKCA5NikoJXJkaSkKKyNkZWZpbmUgZHNNYXRjaExlbgkoMTQ0KSglcmRpKQorI2RlZmluZSBkc1ByZXZNYXRjaAkoMTQ4KSglcmRpKQorI2RlZmluZSBkc1N0clN0YXJ0CSgxNTYpKCVyZGkpCisjZGVmaW5lIGRzTWF0Y2hTdGFydAkoMTYwKSglcmRpKQorI2RlZmluZSBkc0xvb2thaGVhZAkoMTY0KSglcmRpKQorI2RlZmluZSBkc1ByZXZMZW4JKDE2OCkoJXJkaSkKKyNkZWZpbmUgZHNNYXhDaGFpbkxlbgkoMTcyKSglcmRpKQorI2RlZmluZSBkc0dvb2RNYXRjaAkoMTg4KSglcmRpKQorI2RlZmluZSBkc05pY2VNYXRjaAkoMTkyKSglcmRpKQorCisjZWxzZSAKKworI2lmbmRlZiBTVFJVQ1RfT0ZGU0VUCisjCWRlZmluZSBTVFJVQ1RfT0ZGU0VUCSgwKQorI2VuZGlmCisKKworI2RlZmluZSBkc1dTaXplCQkoIDU2ICsgU1RSVUNUX09GRlNFVCkoJXJkaSkKKyNkZWZpbmUgZHNXTWFzawkJKCA2NCArIFNUUlVDVF9PRkZTRVQpKCVyZGkpCisjZGVmaW5lIGRzV2luZG93CSggNzIgKyBTVFJVQ1RfT0ZGU0VUKSglcmRpKQorI2RlZmluZSBkc1ByZXYJCSggODggKyBTVFJVQ1RfT0ZGU0VUKSglcmRpKQorI2RlZmluZSBkc01hdGNoTGVuCSgxMzYgKyBTVFJVQ1RfT0ZGU0VUKSglcmRpKQorI2RlZmluZSBkc1ByZXZNYXRjaAkoMTQwICsgU1RSVUNUX09GRlNFVCkoJXJkaSkKKyNkZWZpbmUgZHNTdHJTdGFydAkoMTQ4ICsgU1RSVUNUX09GRlNFVCkoJXJkaSkKKyNkZWZpbmUgZHNNYXRjaFN0YXJ0CSgxNTIgKyBTVFJVQ1RfT0ZGU0VUKSglcmRpKQorI2RlZmluZSBkc0xvb2thaGVhZAkoMTU2ICsgU1RSVUNUX09GRlNFVCkoJXJkaSkKKyNkZWZpbmUgZHNQcmV2TGVuCSgxNjAgKyBTVFJVQ1RfT0ZGU0VUKSglcmRpKQorI2RlZmluZSBkc01heENoYWluTGVuCSgxNjQgKyBTVFJVQ1RfT0ZGU0VUKSglcmRpKQorI2RlZmluZSBkc0dvb2RNYXRjaAkoMTgwICsgU1RSVUNUX09GRlNFVCkoJXJkaSkKKyNkZWZpbmUgZHNOaWNlTWF0Y2gJKDE4NCArIFNUUlVDVF9PRkZTRVQpKCVyZGkpCisKKyNlbmRpZgorCisKKworCisudGV4dAorCisvKiB1SW50IGxvbmdlc3RfbWF0Y2goZGVmbGF0ZV9zdGF0ZSAqZGVmbGF0ZXN0YXRlLCBJUG9zIGN1cm1hdGNoKSAqLworCitsb25nZXN0X21hdGNoOgorLyoKKyAqIFJldHJpZXZlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMuICVjdXJtYXRjaCB3aWxsIGhvbGQgY3VyX21hdGNoCisgKiB0aHJvdWdob3V0IHRoZSBlbnRpcmUgZnVuY3Rpb24gKHBhc3NlZCB2aWEgcnNpIG9uIGFtZDY0KS4KKyAqIHJkaSB3aWxsIGhvbGQgdGhlIHBvaW50ZXIgdG8gdGhlIGRlZmxhdGVfc3RhdGUgKGZpcnN0IGFyZyBvbiBhbWQ2NCkKKyAqLworCQltb3YgICAgICVyc2ksIHNhdmVfcnNpCisJCW1vdiAgICAgJXJieCwgc2F2ZV9yYngKKwkJbW92CSVyMTIsIHNhdmVfcjEyCisJCW1vdiAgICAgJXIxMywgc2F2ZV9yMTMKKwkJbW92ICAgICAlcjE0LCBzYXZlX3IxNAorCQltb3YgICAgICVyMTUsIHNhdmVfcjE1CisKKy8qIHVJbnQgd21hc2sgPSBzLT53X21hc2s7CQkJCQkJKi8KKy8qIHVuc2lnbmVkIGNoYWluX2xlbmd0aCA9IHMtPm1heF9jaGFpbl9sZW5ndGg7CQkJCSovCisvKiBpZiAocy0+cHJldl9sZW5ndGggPj0gcy0+Z29vZF9tYXRjaCkgewkJCQkqLworLyogICAgIGNoYWluX2xlbmd0aCA+Pj0gMjsJCQkJCQkqLworLyogfQkJCQkJCQkJCSovCisKKwkJbW92bAlkc1ByZXZMZW4sICVlYXgKKwkJbW92bAlkc0dvb2RNYXRjaCwgJWVieAorCQljbXBsCSVlYngsICVlYXgKKwkJbW92bAlkc1dNYXNrLCAlZWF4CisJCW1vdmwJZHNNYXhDaGFpbkxlbiwgJWNoYWlubGVud21hc2sKKwkJamwJTGFzdE1hdGNoR29vZAorCQlzaHJsCSQyLCAlY2hhaW5sZW53bWFzaworTGFzdE1hdGNoR29vZDoKKworLyogY2hhaW5sZW4gaXMgZGVjcmVtZW50ZWQgb25jZSBiZWZvcmVoYW5kIHNvIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbgkqLworLyogdXNlIHRoZSBzaWduIGZsYWcgaW5zdGVhZCBvZiB0aGUgemVybyBmbGFnIGZvciB0aGUgZXhpdCB0ZXN0LgkqLworLyogSXQgaXMgdGhlbiBzaGlmdGVkIGludG8gdGhlIGhpZ2ggd29yZCwgdG8gbWFrZSByb29tIGZvciB0aGUgd21hc2sJKi8KKy8qIHZhbHVlLCB3aGljaCBpdCB3aWxsIGFsd2F5cyBhY2NvbXBhbnkuCQkJCSovCisKKwkJZGVjbAklY2hhaW5sZW53bWFzaworCQlzaGxsCSQxNiwgJWNoYWlubGVud21hc2sKKwkJb3JsCSVlYXgsICVjaGFpbmxlbndtYXNrCisKKy8qIGlmICgodUludCluaWNlX21hdGNoID4gcy0+bG9va2FoZWFkKSBuaWNlX21hdGNoID0gcy0+bG9va2FoZWFkOwkqLworCisJCW1vdmwJZHNOaWNlTWF0Y2gsICVlYXgKKwkJbW92bAlkc0xvb2thaGVhZCwgJWVieAorCQljbXBsCSVlYXgsICVlYngKKwkJamwJTG9va2FoZWFkTGVzcworCQltb3ZsCSVlYXgsICVlYngKK0xvb2thaGVhZExlc3M6CW1vdmwJJWVieCwgJW5pY2VtYXRjaAorCisvKiByZWdpc3RlciBCeXRlZiAqc2NhbiA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0OwkJCSovCisKKwkJbW92CWRzV2luZG93LCAld2luZG93CisJCW1vdmwJZHNTdHJTdGFydCwgJWxpbWl0ZAorCQlsZWEJKCVsaW1pdCwgJXdpbmRvdyksICVzY2FuCisKKy8qIERldGVybWluZSBob3cgbWFueSBieXRlcyB0aGUgc2NhbiBwdHIgaXMgb2ZmIGZyb20gYmVpbmcJCSovCisvKiBkd29yZC1hbGlnbmVkLgkJCQkJCQkqLworCisJCW1vdgklc2NhbiwgJXNjYW5hbGlnbgorCQluZWdsCSVzY2FuYWxpZ25kCisJCWFuZGwJJDMsICVzY2FuYWxpZ25kCisKKy8qIElQb3MgbGltaXQgPSBzLT5zdHJzdGFydCA+IChJUG9zKU1BWF9ESVNUKHMpID8JCQkqLworLyogICAgIHMtPnN0cnN0YXJ0IC0gKElQb3MpTUFYX0RJU1QocykgOiBOSUw7CQkJCSovCisKKwkJbW92bAlkc1dTaXplLCAlZWF4CisJCXN1YmwJJE1JTl9MT09LQUhFQUQsICVlYXgKKwkJeG9ybAklZWN4LCAlZWN4CisJCXN1YmwJJWVheCwgJWxpbWl0ZAorCQljbW92bmcJJWVjeCwgJWxpbWl0ZAorCisvKiBpbnQgYmVzdF9sZW4gPSBzLT5wcmV2X2xlbmd0aDsJCQkJCSovCisKKwkJbW92bAlkc1ByZXZMZW4sICViZXN0bGVuZAorCisvKiBTdG9yZSB0aGUgc3VtIG9mIHMtPndpbmRvdyArIGJlc3RfbGVuIGluICV3aW5kb3diZXN0bGVuIGxvY2FsbHksIGFuZCBpbiBtZW1vcnkuCSovCisKKwkJbGVhCSgld2luZG93LCAlYmVzdGxlbiksICV3aW5kb3diZXN0bGVuCisJCW1vdgkld2luZG93YmVzdGxlbiwgX3dpbmRvd2Jlc3RsZW4KKworLyogcmVnaXN0ZXIgdXNoIHNjYW5fc3RhcnQgPSAqKHVzaGYqKXNjYW47CQkJCSovCisvKiByZWdpc3RlciB1c2ggc2Nhbl9lbmQgICA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7CQkJKi8KKy8qIFBvc2YgKnByZXYgPSBzLT5wcmV2OwkJCQkJCSovCisKKwkJbW92endsCSglc2NhbiksICVzY2Fuc3RhcnQKKwkJbW92endsCS0xKCVzY2FuLCAlYmVzdGxlbiksICVzY2FuZW5kCisJCW1vdglkc1ByZXYsICVwcmV2CisKKy8qIEp1bXAgaW50byB0aGUgbWFpbiBsb29wLgkJCQkJCSovCisKKwkJbW92bAklY2hhaW5sZW53bWFzaywgX2NoYWlubGVud21hc2sKKwkJam1wCUxvb3BFbnRyeQorCisuYmFsaWduIDE2CisKKy8qIGRvIHsKKyAqICAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsKKyAqICAgICBpZiAoKih1c2hmKikobWF0Y2grYmVzdF9sZW4tMSkgIT0gc2Nhbl9lbmQgfHwKKyAqICAgICAgICAgKih1c2hmKiltYXRjaCAhPSBzY2FuX3N0YXJ0KSBjb250aW51ZTsKKyAqICAgICBbLi4uXQorICogfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0CisgKiAgICAgICAgICAmJiAtLWNoYWluX2xlbmd0aCAhPSAwKTsKKyAqCisgKiBIZXJlIGlzIHRoZSBpbm5lciBsb29wIG9mIHRoZSBmdW5jdGlvbi4gVGhlIGZ1bmN0aW9uIHdpbGwgc3BlbmQgdGhlCisgKiBtYWpvcml0eSBvZiBpdHMgdGltZSBpbiB0aGlzIGxvb3AsIGFuZCBtYWpvcml0eSBvZiB0aGF0IHRpbWUgd2lsbAorICogYmUgc3BlbnQgaW4gdGhlIGZpcnN0IHRlbiBpbnN0cnVjdGlvbnMuCisgKi8KK0xvb2t1cExvb3A6CisJCWFuZGwJJWNoYWlubGVud21hc2ssICVjdXJtYXRjaGQKKwkJbW92endsCSglcHJldiwgJWN1cm1hdGNoLCAyKSwgJWN1cm1hdGNoZAorCQljbXBsCSVsaW1pdGQsICVjdXJtYXRjaGQKKwkJamJlCUxlYXZlTm93CisJCXN1YmwJJDB4MDAwMTAwMDAsICVjaGFpbmxlbndtYXNrCisJCWpzCUxlYXZlTm93CitMb29wRW50cnk6CWNtcHcJLTEoJXdpbmRvd2Jlc3RsZW4sICVjdXJtYXRjaCksICVzY2FuZW5kdworCQlqbmUJTG9va3VwTG9vcAorCQljbXB3CSVzY2Fuc3RhcnR3LCAoJXdpbmRvdywgJWN1cm1hdGNoKQorCQlqbmUJTG9va3VwTG9vcAorCisvKiBTdG9yZSB0aGUgY3VycmVudCB2YWx1ZSBvZiBjaGFpbmxlbi4JCQkJCSovCisJCW1vdmwJJWNoYWlubGVud21hc2ssIF9jaGFpbmxlbndtYXNrCisKKy8qICVzY2FuIGlzIHRoZSBzdHJpbmcgdW5kZXIgc2NydXRpbnksIGFuZCAlcHJldiB0byB0aGUgc3RyaW5nIHdlCSovCisvKiBhcmUgaG9waW5nIHRvIG1hdGNoIGl0IHVwIHdpdGguIEluIGFjdHVhbGl0eSwgJWVzaSBhbmQgJWVkaSBhcmUJKi8KKy8qIGJvdGggcG9pbnRlZCAoTUFYX01BVENIXzggLSBzY2FuYWxpZ24pIGJ5dGVzIGFoZWFkLCBhbmQgJWVkeCBpcwkqLworLyogaW5pdGlhbGl6ZWQgdG8gLShNQVhfTUFUQ0hfOCAtIHNjYW5hbGlnbikuCQkJCSovCisKKwkJbW92CSQoLU1BWF9NQVRDSF84KSwgJXJkeAorCQlsZWEJKCVjdXJtYXRjaCwgJXdpbmRvdyksICV3aW5kb3diZXN0bGVuCisJCWxlYQlNQVhfTUFUQ0hfOCgld2luZG93YmVzdGxlbiwgJXNjYW5hbGlnbiksICV3aW5kb3diZXN0bGVuCisJCWxlYQlNQVhfTUFUQ0hfOCglc2NhbiwgJXNjYW5hbGlnbiksICVwcmV2CisKKy8qIHRoZSBwcmVmZXRjaGluZyBiZWxvdyBtYWtlcyB2ZXJ5IGxpdHRsZSBkaWZmZXJlbmNlLi4uICovCisJCXByZWZldGNodDEJKCV3aW5kb3diZXN0bGVuLCAlcmR4KQorCQlwcmVmZXRjaHQxCSglcHJldiwgJXJkeCkKKworLyoKKyAqIFRlc3QgdGhlIHN0cmluZ3MgZm9yIGVxdWFsaXR5LCA4IGJ5dGVzIGF0IGEgdGltZS4gQXQgdGhlIGVuZCwKKyAqIGFkanVzdCAlcmR4IHNvIHRoYXQgaXQgaXMgb2Zmc2V0IHRvIHRoZSBleGFjdCBieXRlIHRoYXQgbWlzbWF0Y2hlZC4KKyAqCisgKiBJdCBzaG91bGQgYmUgY29uZmVzc2VkIHRoYXQgdGhpcyBsb29wIHVzdWFsbHkgZG9lcyBub3QgcmVwcmVzZW50CisgKiBtdWNoIG9mIHRoZSB0b3RhbCBydW5uaW5nIHRpbWUuIFJlcGxhY2luZyBpdCB3aXRoIGEgbW9yZQorICogc3RyYWlnaHRmb3J3YXJkICJyZXAgY21wc2IiIHdvdWxkIG5vdCBkcmFzdGljYWxseSBkZWdyYWRlCisgKiBwZXJmb3JtYW5jZSAtLSB1bnJvbGxpbmcgaXQsIGZvciBleGFtcGxlLCBtYWtlcyBubyBkaWZmZXJlbmNlLgorICovCisKKyN1bmRlZiBVU0VfU1NFCS8qIHdvcmtzLCBidXQgaXMgNi03JSBzbG93ZXIsIHRoYW4gbm9uLVNTRS4uLiAqLworCitMb29wQ21wczoKKyNpZmRlZiBVU0VfU1NFCisJCS8qIFByZWxvYWQgdGhlIFNTRSByZWdpc3RlcnMgKi8KKwkJbW92ZHF1CSAgKCV3aW5kb3diZXN0bGVuLCAlcmR4KSwgJXhtbTEKKwkJbW92ZHF1CSAgKCVwcmV2LCAlcmR4KSwgJXhtbTIKKwkJcGNtcGVxYgkleG1tMiwgJXhtbTEKKwkJbW92ZHF1CTE2KCV3aW5kb3diZXN0bGVuLCAlcmR4KSwgJXhtbTMKKwkJbW92ZHF1CTE2KCVwcmV2LCAlcmR4KSwgJXhtbTQKKwkJcGNtcGVxYgkleG1tNCwgJXhtbTMKKwkJbW92ZHF1CTMyKCV3aW5kb3diZXN0bGVuLCAlcmR4KSwgJXhtbTUKKwkJbW92ZHF1CTMyKCVwcmV2LCAlcmR4KSwgJXhtbTYKKwkJcGNtcGVxYgkleG1tNiwgJXhtbTUKKwkJbW92ZHF1CTQ4KCV3aW5kb3diZXN0bGVuLCAlcmR4KSwgJXhtbTcKKwkJbW92ZHF1CTQ4KCVwcmV2LCAlcmR4KSwgJXhtbTgKKwkJcGNtcGVxYgkleG1tOCwgJXhtbTcKKworCQkvKiBDaGVjayB0aGUgY29tcGFyaXNpb25zJyByZXN1bHRzICovCisJCXBtb3Ztc2tiICV4bW0xLCAlcmF4CisJCW5vdHcJJWF4CisJCWJzZncJJWF4LCAlYXgKKwkJam56CUxlYXZlTG9vcENtcHMKKwkJCisJCS8qIHRoaXMgaXMgdGhlIG9ubHkgaXRlcmF0aW9uIG9mIHRoZSBsb29wIHdpdGggYSBwb3NzaWJpbGl0eSBvZiBoYXZpbmcKKwkJICAgaW5jcmVtZW50ZWQgcmR4IGJ5IDB4MTA4IChlYWNoIGxvb3AgaXRlcmF0aW9uIGFkZCAxNio0ID0gMHg0MCAKKwkJICAgYW5kICgweDQwKjQpKzg9MHgxMDggKi8KKwkJYWRkCSQ4LCAlcmR4CisJCWp6IExlbk1heGltdW0KKwkJYWRkCSQ4LCAlcmR4CisKKwkJCisJCXBtb3Ztc2tiICV4bW0zLCAlcmF4CisJCW5vdHcJJWF4CisJCWJzZncJJWF4LCAlYXgKKwkJam56CUxlYXZlTG9vcENtcHMKKwkJCisJCQorCQlhZGQJJDE2LCAlcmR4CisKKworCQlwbW92bXNrYiAleG1tNSwgJXJheAorCQlub3R3CSVheAorCQlic2Z3CSVheCwgJWF4CisJCWpueglMZWF2ZUxvb3BDbXBzCisJCQorCQlhZGQJJDE2LCAlcmR4CisKKworCQlwbW92bXNrYiAleG1tNywgJXJheAorCQlub3R3CSVheAorCQlic2Z3CSVheCwgJWF4CisJCWpueglMZWF2ZUxvb3BDbXBzCisJCQorCQlhZGQJJDE2LCAlcmR4CisJCQorCQlqbXAJTG9vcENtcHMKK0xlYXZlTG9vcENtcHM6CWFkZAklcmF4LCAlcmR4CisjZWxzZQorCQltb3YJKCV3aW5kb3diZXN0bGVuLCAlcmR4KSwgJXJheAorCQl4b3IJKCVwcmV2LCAlcmR4KSwgJXJheAorCQlqbnoJTGVhdmVMb29wQ21wcworCQkKKwkJbW92CTgoJXdpbmRvd2Jlc3RsZW4sICVyZHgpLCAlcmF4CisJCXhvcgk4KCVwcmV2LCAlcmR4KSwgJXJheAorCQlqbnoJTGVhdmVMb29wQ21wczgKKworCQltb3YJMTYoJXdpbmRvd2Jlc3RsZW4sICVyZHgpLCAlcmF4CisJCXhvcgkxNiglcHJldiwgJXJkeCksICVyYXgKKwkJam56CUxlYXZlTG9vcENtcHMxNgorCQkJCQorCQlhZGQJJDI0LCAlcmR4CisJCWpueglMb29wQ21wcworCQlqbXAJTGVuTWF4aW11bQorIwlpZiAwCisvKgorICogVGhpcyB0aHJlZS1saW5lciBpcyB0YW50YWxpemluZ2x5IHNpbXBsZSwgYnV0IGJzZiBpcyBhIHNsb3cgaW5zdHJ1Y3Rpb24sCisgKiBhbmQgdGhlIGNvbXBsaWNhdGVkIGFsdGVybmF0aXZlIGRvd24gYmVsb3cgaXMgcXVpdGUgYSBiaXQgZmFzdGVyLiBTYWQuLi4KKyAqLworCitMZWF2ZUxvb3BDbXBzOglic2YJJXJheCwgJXJheCAvKiBmaW5kIHRoZSBmaXJzdCBub24temVybyBiaXQgKi8KKwkJc2hybAkkMywgJWVheCAvKiBkaXZpZGUgYnkgOCB0byBnZXQgdGhlIGJ5dGUgKi8KKwkJYWRkCSVyYXgsICVyZHgKKyMJZWxzZQorTGVhdmVMb29wQ21wczE2OgorCQlhZGQJJDgsICVyZHgKK0xlYXZlTG9vcENtcHM4OgorCQlhZGQJJDgsICVyZHgKK0xlYXZlTG9vcENtcHM6CXRlc3RsICAgJDB4RkZGRkZGRkYsICVlYXggLyogQ2hlY2sgdGhlIGZpcnN0IDQgYnl0ZXMgKi8KKwkJam56ICAgICBDaGVjazE2CisJCWFkZCAgICAgJDQsICVyZHgKKwkJc2hyICAgICAkMzIsICVyYXgKK0NoZWNrMTY6ICAgICAgICB0ZXN0dyAgICQweEZGRkYsICVheAorCQlqbnogICAgIExlbkxvd2VyCisJCWFkZAkkMiwgJXJkeAorCQlzaHJsCSQxNiwgJWVheAorTGVuTG93ZXI6CXN1YmIJJDEsICVhbAorCQlhZGMJJDAsICVyZHgKKyMJZW5kaWYKKyNlbmRpZgorCisvKiBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2guIElmIGl0IGlzIGxvbmdlciB0aGFuIE1BWF9NQVRDSCwJKi8KKy8qIHRoZW4gYXV0b21hdGljYWxseSBhY2NlcHQgaXQgYXMgdGhlIGJlc3QgcG9zc2libGUgbWF0Y2ggYW5kIGxlYXZlLgkqLworCisJCWxlYQkoJXByZXYsICVyZHgpLCAlcmF4CisJCXN1Ygklc2NhbiwgJXJheAorCQljbXBsCSRNQVhfTUFUQ0gsICVlYXgKKwkJamdlCUxlbk1heGltdW0KKworLyogSWYgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2ggaXMgbm90IGxvbmdlciB0aGFuIHRoZSBiZXN0IG1hdGNoIHdlCSovCisvKiBoYXZlIHNvIGZhciwgdGhlbiBmb3JnZXQgaXQgYW5kIHJldHVybiB0byB0aGUgbG9va3VwIGxvb3AuCQkqLworCisJCWNtcGwJJWJlc3RsZW5kLCAlZWF4CisJCWpnCUxvbmdlck1hdGNoCisJCW1vdglfd2luZG93YmVzdGxlbiwgJXdpbmRvd2Jlc3RsZW4KKwkJbW92CWRzUHJldiwgJXByZXYKKwkJbW92bAlfY2hhaW5sZW53bWFzaywgJWVkeAorCQlqbXAJTG9va3VwTG9vcAorCisvKiAgICAgICAgIHMtPm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoOwkJCQkJKi8KKy8qICAgICAgICAgYmVzdF9sZW4gPSBsZW47CQkJCQkJKi8KKy8qICAgICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSBicmVhazsJCQkJKi8KKy8qICAgICAgICAgc2Nhbl9lbmQgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOwkJCSovCisKK0xvbmdlck1hdGNoOgorCQltb3ZsCSVlYXgsICViZXN0bGVuZAorCQltb3ZsCSVjdXJtYXRjaGQsIGRzTWF0Y2hTdGFydAorCQljbXBsCSVuaWNlbWF0Y2gsICVlYXgKKwkJamdlCUxlYXZlTm93CisKKwkJbGVhCSgld2luZG93LCAlYmVzdGxlbiksICV3aW5kb3diZXN0bGVuCisJCW1vdgkld2luZG93YmVzdGxlbiwgX3dpbmRvd2Jlc3RsZW4KKworCQltb3Z6d2wJLTEoJXNjYW4sICVyYXgpLCAlc2NhbmVuZAorCQltb3YJZHNQcmV2LCAlcHJldgorCQltb3ZsCV9jaGFpbmxlbndtYXNrLCAlY2hhaW5sZW53bWFzaworCQlqbXAJTG9va3VwTG9vcAorCisvKiBBY2NlcHQgdGhlIGN1cnJlbnQgc3RyaW5nLCB3aXRoIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGxlbmd0aC4JCSovCisKK0xlbk1heGltdW06CisJCW1vdmwJJE1BWF9NQVRDSCwgJWJlc3RsZW5kCisJCW1vdmwJJWN1cm1hdGNoZCwgZHNNYXRjaFN0YXJ0CisKKy8qIGlmICgodUludCliZXN0X2xlbiA8PSBzLT5sb29rYWhlYWQpIHJldHVybiAodUludCliZXN0X2xlbjsJCSovCisvKiByZXR1cm4gcy0+bG9va2FoZWFkOwkJCQkJCQkqLworCitMZWF2ZU5vdzoKKwkJbW92bAlkc0xvb2thaGVhZCwgJWVheAorCQljbXBsCSVlYXgsICViZXN0bGVuZAorCQljbW92bmdsCSViZXN0bGVuZCwgJWVheAorTG9va2FoZWFkUmV0OgorCisvKiBSZXN0b3JlIHRoZSByZWdpc3RlcnMgYW5kIHJldHVybiBmcm9tIHdoZW5jZSB3ZSBjYW1lLgkJCSovCisKKwltb3YJc2F2ZV9yc2ksICVyc2kKKwltb3YJc2F2ZV9yYngsICVyYngKKwltb3YJc2F2ZV9yMTIsICVyMTIKKwltb3YJc2F2ZV9yMTMsICVyMTMKKwltb3YJc2F2ZV9yMTQsICVyMTQKKwltb3YJc2F2ZV9yMTUsICVyMTUKKworCXJldAorCittYXRjaF9pbml0OglyZXQKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvYXNtNjg2L1JFQURNRS42ODYgYi96bGliL3NyYy9jb250cmliL2FzbTY4Ni9SRUFETUUuNjg2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYmYzYmUKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL2FzbTY4Ni9SRUFETUUuNjg2CkBAIC0wLDAgKzEsNTEgQEAKK1RoaXMgaXMgYSBwYXRjaGVkIHZlcnNpb24gb2YgemxpYiwgbW9kaWZpZWQgdG8gdXNlCitQZW50aXVtLVByby1vcHRpbWl6ZWQgYXNzZW1ibHkgY29kZSBpbiB0aGUgZGVmbGF0aW9uIGFsZ29yaXRobS4gVGhlCitmaWxlcyBjaGFuZ2VkL2FkZGVkIGJ5IHRoaXMgcGF0Y2ggYXJlOgorCitSRUFETUUuNjg2CittYXRjaC5TCisKK1RoZSBzcGVlZHVwIHRoYXQgdGhpcyBwYXRjaCBwcm92aWRlcyB2YXJpZXMsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZQorY29tcGlsZXIgdXNlZCB0byBidWlsZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB6bGliIGZhbGxzIGFmb3VsIG9mIHRoZQorUFBybydzIHNwZWVkIHRyYXBzLiBNeSBvd24gdGVzdHMgc2hvdyBhIHNwZWVkdXAgb2YgYXJvdW5kIDEwLTIwJSBhdAordGhlIGRlZmF1bHQgY29tcHJlc3Npb24gbGV2ZWwsIGFuZCAyMC0zMCUgdXNpbmcgLTksIGFnYWluc3QgYSB2ZXJzaW9uCitjb21waWxlZCB1c2luZyBnY2MgMi43LjIuMy4gWW91ciBtaWxlYWdlIG1heSB2YXJ5LgorCitOb3RlIHRoYXQgdGhpcyBjb2RlIGhhcyBiZWVuIHRhaWxvcmVkIGZvciB0aGUgUFByby9QSUkgaW4gcGFydGljdWxhciwKK2FuZCB3aWxsIG5vdCBwZXJmb3JtIHBhcnRpY3Vhcmx5IHdlbGwgb24gYSBQZW50aXVtLgorCitJZiB5b3UgYXJlIHVzaW5nIGFuIGFzc2VtYmxlciBvdGhlciB0aGFuIEdOVSBhcywgeW91IHdpbGwgaGF2ZSB0bwordHJhbnNsYXRlIG1hdGNoLlMgdG8gdXNlIHlvdXIgYXNzZW1ibGVyJ3Mgc3ludGF4LiAoSGF2ZSBmdW4uKQorCitCcmlhbiBSYWl0ZXIKK2JyZWFkYm94QG11cHBldGxhYnMuY29tCitBcHJpbCwgMTk5OAorCisKK0FkZGVkIGZvciB6bGliIDEuMS4zOgorCitUaGUgcGF0Y2hlcyBjb21lIGZyb20KK2h0dHA6Ly93d3cubXVwcGV0bGFicy5jb20vfmJyZWFkYm94L3NvZnR3YXJlL2Fzc2VtYmx5Lmh0bWwKKworVG8gY29tcGlsZSB6bGliIHdpdGggdGhpcyBhc20gZmlsZSwgY29weSBtYXRjaC5TIHRvIHRoZSB6bGliIGRpcmVjdG9yeQordGhlbiBkbzoKKworQ0ZMQUdTPSItTzMgLURBU01WIiAuL2NvbmZpZ3VyZQorbWFrZSBPQkpBPW1hdGNoLm8KKworCitVcGRhdGU6CisKK0kndmUgYmVlbiBpZ25vcmluZyB0aGVzZSBhc3NlbWJseSByb3V0aW5lcyBmb3IgeWVhcnMsIGJlbGlldmluZyB0aGF0CitnY2MncyBnZW5lcmF0ZWQgY29kZSBoYWQgY2F1Z2h0IHVwIHdpdGggaXQgc29tZXRpbWUgYXJvdW5kIGdjYyAyLjk1CithbmQgdGhlIG1ham9yIHJlYXJjaGl0ZWN0aW5nIG9mIHRoZSBQZW50aXVtIDQuIEhvd2V2ZXIsIEkgcmVjZW50bHkKK2xlYXJuZWQgdGhhdCwgZGVzcGl0ZSB3aGF0IEkgYmVsaWV2ZWQsIHRoaXMgY29kZSBzdGlsbCBoYXMgc29tZSBsaWZlCitpbiBpdC4gT24gdGhlIFBlbnRpdW0gNCBhbmQgQU1ENjQgY2hpcHMsIGl0IGNvbnRpbnVlcyB0byBydW4gYWJvdXQgOCUKK2Zhc3RlciB0aGFuIHRoZSBjb2RlIHByb2R1Y2VkIGJ5IGdjYyA0LjEuCisKK0luIGFja25vd2xlZGdlbWVudCBvZiBpdHMgY29udGludWluZyB1c2VmdWxuZXNzLCBJJ3ZlIGFsdGVyZWQgdGhlCitsaWNlbnNlIHRvIG1hdGNoIHRoYXQgb2YgdGhlIHJlc3Qgb2YgemxpYi4gU2hhcmUgYW5kIEVuam95IQorCitCcmlhbiBSYWl0ZXIKK2JyZWFkYm94QG11cHBldGxhYnMuY29tCitBcHJpbCwgMjAwNwpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9hc202ODYvbWF0Y2guUyBiL3psaWIvc3JjL2NvbnRyaWIvYXNtNjg2L21hdGNoLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0MjEwOQotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvYXNtNjg2L21hdGNoLlMKQEAgLTAsMCArMSwzNTcgQEAKKy8qIG1hdGNoLlMgLS0geDg2IGFzc2VtYmx5IHZlcnNpb24gb2YgdGhlIHpsaWIgbG9uZ2VzdF9tYXRjaCgpIGZ1bmN0aW9uLgorICogT3B0aW1pemVkIGZvciB0aGUgSW50ZWwgNjg2IGNoaXBzIChQUHJvIGFuZCBsYXRlcikuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4LCAyMDA3IEJyaWFuIFJhaXRlciA8YnJlYWRib3hAbXVwcGV0bGFicy5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9yIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpZm5kZWYgTk9fVU5ERVJMSU5FCisjZGVmaW5lCW1hdGNoX2luaXQJX21hdGNoX2luaXQKKyNkZWZpbmUJbG9uZ2VzdF9tYXRjaAlfbG9uZ2VzdF9tYXRjaAorI2VuZGlmCisKKyNkZWZpbmUJTUFYX01BVENICSgyNTgpCisjZGVmaW5lCU1JTl9NQVRDSAkoMykKKyNkZWZpbmUJTUlOX0xPT0tBSEVBRAkoTUFYX01BVENIICsgTUlOX01BVENIICsgMSkKKyNkZWZpbmUJTUFYX01BVENIXzgJKChNQVhfTUFUQ0ggKyA3KSAmIH43KQorCisvKiBzdGFjayBmcmFtZSBvZmZzZXRzICovCisKKyNkZWZpbmUJY2hhaW5sZW53bWFzawkJMAkvKiBoaWdoIHdvcmQ6IGN1cnJlbnQgY2hhaW4gbGVuCSovCisJCQkJCS8qIGxvdyB3b3JkOiBzLT53bWFzawkJKi8KKyNkZWZpbmUJd2luZG93CQkJNAkvKiBsb2NhbCBjb3B5IG9mIHMtPndpbmRvdwkqLworI2RlZmluZQl3aW5kb3diZXN0bGVuCQk4CS8qIHMtPndpbmRvdyArIGJlc3RsZW4JCSovCisjZGVmaW5lCXNjYW5zdGFydAkJMTYJLyogZmlyc3QgdHdvIGJ5dGVzIG9mIHN0cmluZwkqLworI2RlZmluZQlzY2FuZW5kCQkJMTIJLyogbGFzdCB0d28gYnl0ZXMgb2Ygc3RyaW5nCSovCisjZGVmaW5lCXNjYW5hbGlnbgkJMjAJLyogZHdvcmQtbWlzYWxpZ25tZW50IG9mIHN0cmluZwkqLworI2RlZmluZQluaWNlbWF0Y2gJCTI0CS8qIGEgZ29vZCBlbm91Z2ggbWF0Y2ggc2l6ZQkqLworI2RlZmluZQliZXN0bGVuCQkJMjgJLyogc2l6ZSBvZiBiZXN0IG1hdGNoIHNvIGZhcgkqLworI2RlZmluZQlzY2FuCQkJMzIJLyogcHRyIHRvIHN0cmluZyB3YW50aW5nIG1hdGNoCSovCisKKyNkZWZpbmUJTG9jYWxWYXJzU2l6ZQkJKDM2KQorLyoJc2F2ZWQgZWJ4CQkzNiAqLworLyoJc2F2ZWQgZWRpCQk0MCAqLworLyoJc2F2ZWQgZXNpCQk0NCAqLworLyoJc2F2ZWQgZWJwCQk0OCAqLworLyoJcmV0dXJuIGFkZHJlc3MJCTUyICovCisjZGVmaW5lCWRlZmxhdGVzdGF0ZQkJNTYJLyogdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cwkqLworI2RlZmluZQljdXJtYXRjaAkJNjAKKworLyogQWxsIHRoZSAremxpYjEyMjJhZGQgb2Zmc2V0cyBhcmUgZHVlIHRvIHRoZSBhZGRpdGlvbiBvZiBmaWVsZHMKKyAqICBpbiB6bGliIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBzaW5jZSB0aGUgYXNtIGNvZGUgd2FzIGZpcnN0IHdyaXR0ZW4KKyAqIChpZiB5b3UgY29tcGlsZSB3aXRoIHpsaWIgMS4wLjQgb3Igb2xkZXIsIHVzZSAiemxpYjEyMjJhZGQgZXF1ICgtNCkiKS4KKyAqIChpZiB5b3UgY29tcGlsZSB3aXRoIHpsaWIgYmV0d2VlbiAxLjAuNSBhbmQgMS4yLjIuMSwgdXNlICJ6bGliMTIyMmFkZCBlcXUgMCIpLgorICogaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMi4yLjIgb3IgbGF0ZXIgLCB1c2UgInpsaWIxMjIyYWRkIGVxdSA4IikuCisgKi8KKworI2RlZmluZSB6bGliMTIyMmFkZAkJKDgpCisKKyNkZWZpbmUJZHNXU2l6ZQkJCSgzNit6bGliMTIyMmFkZCkKKyNkZWZpbmUJZHNXTWFzawkJCSg0NCt6bGliMTIyMmFkZCkKKyNkZWZpbmUJZHNXaW5kb3cJCSg0OCt6bGliMTIyMmFkZCkKKyNkZWZpbmUJZHNQcmV2CQkJKDU2K3psaWIxMjIyYWRkKQorI2RlZmluZQlkc01hdGNoTGVuCQkoODgremxpYjEyMjJhZGQpCisjZGVmaW5lCWRzUHJldk1hdGNoCQkoOTIremxpYjEyMjJhZGQpCisjZGVmaW5lCWRzU3RyU3RhcnQJCSgxMDAremxpYjEyMjJhZGQpCisjZGVmaW5lCWRzTWF0Y2hTdGFydAkJKDEwNCt6bGliMTIyMmFkZCkKKyNkZWZpbmUJZHNMb29rYWhlYWQJCSgxMDgremxpYjEyMjJhZGQpCisjZGVmaW5lCWRzUHJldkxlbgkJKDExMit6bGliMTIyMmFkZCkKKyNkZWZpbmUJZHNNYXhDaGFpbkxlbgkJKDExNit6bGliMTIyMmFkZCkKKyNkZWZpbmUJZHNHb29kTWF0Y2gJCSgxMzIremxpYjEyMjJhZGQpCisjZGVmaW5lCWRzTmljZU1hdGNoCQkoMTM2K3psaWIxMjIyYWRkKQorCisKKy5maWxlICJtYXRjaC5TIgorCisuZ2xvYmwJbWF0Y2hfaW5pdCwgbG9uZ2VzdF9tYXRjaAorCisudGV4dAorCisvKiB1SW50IGxvbmdlc3RfbWF0Y2goZGVmbGF0ZV9zdGF0ZSAqZGVmbGF0ZXN0YXRlLCBJUG9zIGN1cm1hdGNoKSAqLworLmNmaV9zZWN0aW9ucwkuZGVidWdfZnJhbWUKKworbG9uZ2VzdF9tYXRjaDoKKworLmNmaV9zdGFydHByb2MKKy8qIFNhdmUgcmVnaXN0ZXJzIHRoYXQgdGhlIGNvbXBpbGVyIG1heSBiZSB1c2luZywgYW5kIGFkanVzdCAlZXNwIHRvCSovCisvKiBtYWtlIHJvb20gZm9yIG91ciBzdGFjayBmcmFtZS4JCQkJCSovCisKKwkJcHVzaGwJJWVicAorCQkuY2ZpX2RlZl9jZmFfb2Zmc2V0IDgKKwkJLmNmaV9vZmZzZXQgZWJwLCAtOAorCQlwdXNobAklZWRpCisJCS5jZmlfZGVmX2NmYV9vZmZzZXQgMTIKKwkJcHVzaGwJJWVzaQorCQkuY2ZpX2RlZl9jZmFfb2Zmc2V0IDE2CisJCXB1c2hsCSVlYngKKwkJLmNmaV9kZWZfY2ZhX29mZnNldCAyMAorCQlzdWJsCSRMb2NhbFZhcnNTaXplLCAlZXNwCisJCS5jZmlfZGVmX2NmYV9vZmZzZXQgTG9jYWxWYXJzU2l6ZSsyMAorCisvKiBSZXRyaWV2ZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzLiAlZWN4IHdpbGwgaG9sZCBjdXJfbWF0Y2gJCSovCisvKiB0aHJvdWdob3V0IHRoZSBlbnRpcmUgZnVuY3Rpb24uICVlZHggd2lsbCBob2xkIHRoZSBwb2ludGVyIHRvIHRoZQkqLworLyogZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUgZHVyaW5nIHRoZSBmdW5jdGlvbidzIHNldHVwIChiZWZvcmUJCSovCisvKiBlbnRlcmluZyB0aGUgbWFpbiBsb29wKS4JCQkJCQkqLworCisJCW1vdmwJZGVmbGF0ZXN0YXRlKCVlc3ApLCAlZWR4CisJCW1vdmwJY3VybWF0Y2goJWVzcCksICVlY3gKKworLyogdUludCB3bWFzayA9IHMtPndfbWFzazsJCQkJCQkqLworLyogdW5zaWduZWQgY2hhaW5fbGVuZ3RoID0gcy0+bWF4X2NoYWluX2xlbmd0aDsJCQkJKi8KKy8qIGlmIChzLT5wcmV2X2xlbmd0aCA+PSBzLT5nb29kX21hdGNoKSB7CQkJCSovCisvKiAgICAgY2hhaW5fbGVuZ3RoID4+PSAyOwkJCQkJCSovCisvKiB9CQkJCQkJCQkJKi8KKyAKKwkJbW92bAlkc1ByZXZMZW4oJWVkeCksICVlYXgKKwkJbW92bAlkc0dvb2RNYXRjaCglZWR4KSwgJWVieAorCQljbXBsCSVlYngsICVlYXgKKwkJbW92bAlkc1dNYXNrKCVlZHgpLCAlZWF4CisJCW1vdmwJZHNNYXhDaGFpbkxlbiglZWR4KSwgJWVieAorCQlqbAlMYXN0TWF0Y2hHb29kCisJCXNocmwJJDIsICVlYngKK0xhc3RNYXRjaEdvb2Q6CisKKy8qIGNoYWlubGVuIGlzIGRlY3JlbWVudGVkIG9uY2UgYmVmb3JlaGFuZCBzbyB0aGF0IHRoZSBmdW5jdGlvbiBjYW4JKi8KKy8qIHVzZSB0aGUgc2lnbiBmbGFnIGluc3RlYWQgb2YgdGhlIHplcm8gZmxhZyBmb3IgdGhlIGV4aXQgdGVzdC4JKi8KKy8qIEl0IGlzIHRoZW4gc2hpZnRlZCBpbnRvIHRoZSBoaWdoIHdvcmQsIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHdtYXNrCSovCisvKiB2YWx1ZSwgd2hpY2ggaXQgd2lsbCBhbHdheXMgYWNjb21wYW55LgkJCQkqLworCisJCWRlY2wJJWVieAorCQlzaGxsCSQxNiwgJWVieAorCQlvcmwJJWVheCwgJWVieAorCQltb3ZsCSVlYngsIGNoYWlubGVud21hc2soJWVzcCkKKworLyogaWYgKCh1SW50KW5pY2VfbWF0Y2ggPiBzLT5sb29rYWhlYWQpIG5pY2VfbWF0Y2ggPSBzLT5sb29rYWhlYWQ7CSovCisKKwkJbW92bAlkc05pY2VNYXRjaCglZWR4KSwgJWVheAorCQltb3ZsCWRzTG9va2FoZWFkKCVlZHgpLCAlZWJ4CisJCWNtcGwJJWVheCwgJWVieAorCQlqbAlMb29rYWhlYWRMZXNzCisJCW1vdmwJJWVheCwgJWVieAorTG9va2FoZWFkTGVzczoJbW92bAklZWJ4LCBuaWNlbWF0Y2goJWVzcCkKKworLyogcmVnaXN0ZXIgQnl0ZWYgKnNjYW4gPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydDsJCQkqLworCisJCW1vdmwJZHNXaW5kb3coJWVkeCksICVlc2kKKwkJbW92bAklZXNpLCB3aW5kb3coJWVzcCkKKwkJbW92bAlkc1N0clN0YXJ0KCVlZHgpLCAlZWJwCisJCWxlYQkoJWVzaSwlZWJwKSwgJWVkaQorCQltb3ZsCSVlZGksIHNjYW4oJWVzcCkKKworLyogRGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIHRoZSBzY2FuIHB0ciBpcyBvZmYgZnJvbSBiZWluZwkJKi8KKy8qIGR3b3JkLWFsaWduZWQuCQkJCQkJCSovCisKKwkJbW92bAklZWRpLCAlZWF4CisJCW5lZ2wJJWVheAorCQlhbmRsCSQzLCAlZWF4CisJCW1vdmwJJWVheCwgc2NhbmFsaWduKCVlc3ApCisKKy8qIElQb3MgbGltaXQgPSBzLT5zdHJzdGFydCA+IChJUG9zKU1BWF9ESVNUKHMpID8JCQkqLworLyogICAgIHMtPnN0cnN0YXJ0IC0gKElQb3MpTUFYX0RJU1QocykgOiBOSUw7CQkJCSovCisKKwkJbW92bAlkc1dTaXplKCVlZHgpLCAlZWF4CisJCXN1YmwJJE1JTl9MT09LQUhFQUQsICVlYXgKKwkJc3VibAklZWF4LCAlZWJwCisJCWpnCUxpbWl0UG9zaXRpdmUKKwkJeG9ybAklZWJwLCAlZWJwCitMaW1pdFBvc2l0aXZlOgorCisvKiBpbnQgYmVzdF9sZW4gPSBzLT5wcmV2X2xlbmd0aDsJCQkJCSovCisKKwkJbW92bAlkc1ByZXZMZW4oJWVkeCksICVlYXgKKwkJbW92bAklZWF4LCBiZXN0bGVuKCVlc3ApCisKKy8qIFN0b3JlIHRoZSBzdW0gb2Ygcy0+d2luZG93ICsgYmVzdF9sZW4gaW4gJWVzaSBsb2NhbGx5LCBhbmQgaW4gJWVzaS4JKi8KKworCQlhZGRsCSVlYXgsICVlc2kKKwkJbW92bAklZXNpLCB3aW5kb3diZXN0bGVuKCVlc3ApCisKKy8qIHJlZ2lzdGVyIHVzaCBzY2FuX3N0YXJ0ID0gKih1c2hmKilzY2FuOwkJCQkqLworLyogcmVnaXN0ZXIgdXNoIHNjYW5fZW5kICAgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOwkJCSovCisvKiBQb3NmICpwcmV2ID0gcy0+cHJldjsJCQkJCQkqLworCisJCW1vdnp3bAkoJWVkaSksICVlYngKKwkJbW92bAklZWJ4LCBzY2Fuc3RhcnQoJWVzcCkKKwkJbW92endsCS0xKCVlZGksJWVheCksICVlYngKKwkJbW92bAklZWJ4LCBzY2FuZW5kKCVlc3ApCisJCW1vdmwJZHNQcmV2KCVlZHgpLCAlZWRpCisKKy8qIEp1bXAgaW50byB0aGUgbWFpbiBsb29wLgkJCQkJCSovCisKKwkJbW92bAljaGFpbmxlbndtYXNrKCVlc3ApLCAlZWR4CisJCWptcAlMb29wRW50cnkKKworLmJhbGlnbiAxNgorCisvKiBkbyB7CisgKiAgICAgbWF0Y2ggPSBzLT53aW5kb3cgKyBjdXJfbWF0Y2g7CisgKiAgICAgaWYgKCoodXNoZiopKG1hdGNoK2Jlc3RfbGVuLTEpICE9IHNjYW5fZW5kIHx8CisgKiAgICAgICAgICoodXNoZiopbWF0Y2ggIT0gc2Nhbl9zdGFydCkgY29udGludWU7CisgKiAgICAgWy4uLl0KKyAqIH0gd2hpbGUgKChjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXSkgPiBsaW1pdAorICogICAgICAgICAgJiYgLS1jaGFpbl9sZW5ndGggIT0gMCk7CisgKgorICogSGVyZSBpcyB0aGUgaW5uZXIgbG9vcCBvZiB0aGUgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiB3aWxsIHNwZW5kIHRoZQorICogbWFqb3JpdHkgb2YgaXRzIHRpbWUgaW4gdGhpcyBsb29wLCBhbmQgbWFqb3JpdHkgb2YgdGhhdCB0aW1lIHdpbGwKKyAqIGJlIHNwZW50IGluIHRoZSBmaXJzdCB0ZW4gaW5zdHJ1Y3Rpb25zLgorICoKKyAqIFdpdGhpbiB0aGlzIGxvb3A6CisgKiAlZWJ4ID0gc2NhbmVuZAorICogJWVjeCA9IGN1cm1hdGNoCisgKiAlZWR4ID0gY2hhaW5sZW53bWFzayAtIGkuZS4sICgoY2hhaW5sZW4gPDwgMTYpIHwgd21hc2spCisgKiAlZXNpID0gd2luZG93YmVzdGxlbiAtIGkuZS4sICh3aW5kb3cgKyBiZXN0bGVuKQorICogJWVkaSA9IHByZXYKKyAqICVlYnAgPSBsaW1pdAorICovCitMb29rdXBMb29wOgorCQlhbmRsCSVlZHgsICVlY3gKKwkJbW92endsCSglZWRpLCVlY3gsMiksICVlY3gKKwkJY21wbAklZWJwLCAlZWN4CisJCWpiZQlMZWF2ZU5vdworCQlzdWJsCSQweDAwMDEwMDAwLCAlZWR4CisJCWpzCUxlYXZlTm93CitMb29wRW50cnk6CW1vdnp3bAktMSglZXNpLCVlY3gpLCAlZWF4CisJCWNtcGwJJWVieCwgJWVheAorCQlqbnoJTG9va3VwTG9vcAorCQltb3ZsCXdpbmRvdyglZXNwKSwgJWVheAorCQltb3Z6d2wJKCVlYXgsJWVjeCksICVlYXgKKwkJY21wbAlzY2Fuc3RhcnQoJWVzcCksICVlYXgKKwkJam56CUxvb2t1cExvb3AKKworLyogU3RvcmUgdGhlIGN1cnJlbnQgdmFsdWUgb2YgY2hhaW5sZW4uCQkJCQkqLworCisJCW1vdmwJJWVkeCwgY2hhaW5sZW53bWFzayglZXNwKQorCisvKiBQb2ludCAlZWRpIHRvIHRoZSBzdHJpbmcgdW5kZXIgc2NydXRpbnksIGFuZCAlZXNpIHRvIHRoZSBzdHJpbmcgd2UJKi8KKy8qIGFyZSBob3BpbmcgdG8gbWF0Y2ggaXQgdXAgd2l0aC4gSW4gYWN0dWFsaXR5LCAlZXNpIGFuZCAlZWRpIGFyZQkqLworLyogYm90aCBwb2ludGVkIChNQVhfTUFUQ0hfOCAtIHNjYW5hbGlnbikgYnl0ZXMgYWhlYWQsIGFuZCAlZWR4IGlzCSovCisvKiBpbml0aWFsaXplZCB0byAtKE1BWF9NQVRDSF84IC0gc2NhbmFsaWduKS4JCQkJKi8KKworCQltb3ZsCXdpbmRvdyglZXNwKSwgJWVzaQorCQltb3ZsCXNjYW4oJWVzcCksICVlZGkKKwkJYWRkbAklZWN4LCAlZXNpCisJCW1vdmwJc2NhbmFsaWduKCVlc3ApLCAlZWF4CisJCW1vdmwJJCgtTUFYX01BVENIXzgpLCAlZWR4CisJCWxlYQlNQVhfTUFUQ0hfOCglZWRpLCVlYXgpLCAlZWRpCisJCWxlYQlNQVhfTUFUQ0hfOCglZXNpLCVlYXgpLCAlZXNpCisKKy8qIFRlc3QgdGhlIHN0cmluZ3MgZm9yIGVxdWFsaXR5LCA4IGJ5dGVzIGF0IGEgdGltZS4gQXQgdGhlIGVuZCwKKyAqIGFkanVzdCAlZWR4IHNvIHRoYXQgaXQgaXMgb2Zmc2V0IHRvIHRoZSBleGFjdCBieXRlIHRoYXQgbWlzbWF0Y2hlZC4KKyAqCisgKiBXZSBhbHJlYWR5IGtub3cgYXQgdGhpcyBwb2ludCB0aGF0IHRoZSBmaXJzdCB0aHJlZSBieXRlcyBvZiB0aGUKKyAqIHN0cmluZ3MgbWF0Y2ggZWFjaCBvdGhlciwgYW5kIHRoZXkgY2FuIGJlIHNhZmVseSBwYXNzZWQgb3ZlciBiZWZvcmUKKyAqIHN0YXJ0aW5nIHRoZSBjb21wYXJlIGxvb3AuIFNvIHdoYXQgdGhpcyBjb2RlIGRvZXMgaXMgc2tpcCBvdmVyIDAtMworICogYnl0ZXMsIGFzIG11Y2ggYXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGR3b3JkLWFsaWduIHRoZSAlZWRpCisgKiBwb2ludGVyLiAoJWVzaSB3aWxsIHN0aWxsIGJlIG1pc2FsaWduZWQgdGhyZWUgdGltZXMgb3V0IG9mIGZvdXIuKQorICoKKyAqIEl0IHNob3VsZCBiZSBjb25mZXNzZWQgdGhhdCB0aGlzIGxvb3AgdXN1YWxseSBkb2VzIG5vdCByZXByZXNlbnQKKyAqIG11Y2ggb2YgdGhlIHRvdGFsIHJ1bm5pbmcgdGltZS4gUmVwbGFjaW5nIGl0IHdpdGggYSBtb3JlCisgKiBzdHJhaWdodGZvcndhcmQgInJlcCBjbXBzYiIgd291bGQgbm90IGRyYXN0aWNhbGx5IGRlZ3JhZGUKKyAqIHBlcmZvcm1hbmNlLgorICovCitMb29wQ21wczoKKwkJbW92bAkoJWVzaSwlZWR4KSwgJWVheAorCQl4b3JsCSglZWRpLCVlZHgpLCAlZWF4CisJCWpueglMZWF2ZUxvb3BDbXBzCisJCW1vdmwJNCglZXNpLCVlZHgpLCAlZWF4CisJCXhvcmwJNCglZWRpLCVlZHgpLCAlZWF4CisJCWpueglMZWF2ZUxvb3BDbXBzNAorCQlhZGRsCSQ4LCAlZWR4CisJCWpueglMb29wQ21wcworCQlqbXAJTGVuTWF4aW11bQorTGVhdmVMb29wQ21wczQ6CWFkZGwJJDQsICVlZHgKK0xlYXZlTG9vcENtcHM6CXRlc3RsCSQweDAwMDBGRkZGLCAlZWF4CisJCWpueglMZW5Mb3dlcgorCQlhZGRsCSQyLCAlZWR4CisJCXNocmwJJDE2LCAlZWF4CitMZW5Mb3dlcjoJc3ViYgkkMSwgJWFsCisJCWFkY2wJJDAsICVlZHgKKworLyogQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLiBJZiBpdCBpcyBsb25nZXIgdGhhbiBNQVhfTUFUQ0gsCSovCisvKiB0aGVuIGF1dG9tYXRpY2FsbHkgYWNjZXB0IGl0IGFzIHRoZSBiZXN0IHBvc3NpYmxlIG1hdGNoIGFuZCBsZWF2ZS4JKi8KKworCQlsZWEJKCVlZGksJWVkeCksICVlYXgKKwkJbW92bAlzY2FuKCVlc3ApLCAlZWRpCisJCXN1YmwJJWVkaSwgJWVheAorCQljbXBsCSRNQVhfTUFUQ0gsICVlYXgKKwkJamdlCUxlbk1heGltdW0KKworLyogSWYgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2ggaXMgbm90IGxvbmdlciB0aGFuIHRoZSBiZXN0IG1hdGNoIHdlCSovCisvKiBoYXZlIHNvIGZhciwgdGhlbiBmb3JnZXQgaXQgYW5kIHJldHVybiB0byB0aGUgbG9va3VwIGxvb3AuCQkqLworCisJCW1vdmwJZGVmbGF0ZXN0YXRlKCVlc3ApLCAlZWR4CisJCW1vdmwJYmVzdGxlbiglZXNwKSwgJWVieAorCQljbXBsCSVlYngsICVlYXgKKwkJamcJTG9uZ2VyTWF0Y2gKKwkJbW92bAl3aW5kb3diZXN0bGVuKCVlc3ApLCAlZXNpCisJCW1vdmwJZHNQcmV2KCVlZHgpLCAlZWRpCisJCW1vdmwJc2NhbmVuZCglZXNwKSwgJWVieAorCQltb3ZsCWNoYWlubGVud21hc2soJWVzcCksICVlZHgKKwkJam1wCUxvb2t1cExvb3AKKworLyogICAgICAgICBzLT5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDsJCQkJCSovCisvKiAgICAgICAgIGJlc3RfbGVuID0gbGVuOwkJCQkJCSovCisvKiAgICAgICAgIGlmIChsZW4gPj0gbmljZV9tYXRjaCkgYnJlYWs7CQkJCSovCisvKiAgICAgICAgIHNjYW5fZW5kID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsJCQkqLworCitMb25nZXJNYXRjaDoJbW92bAluaWNlbWF0Y2goJWVzcCksICVlYngKKwkJbW92bAklZWF4LCBiZXN0bGVuKCVlc3ApCisJCW1vdmwJJWVjeCwgZHNNYXRjaFN0YXJ0KCVlZHgpCisJCWNtcGwJJWVieCwgJWVheAorCQlqZ2UJTGVhdmVOb3cKKwkJbW92bAl3aW5kb3coJWVzcCksICVlc2kKKwkJYWRkbAklZWF4LCAlZXNpCisJCW1vdmwJJWVzaSwgd2luZG93YmVzdGxlbiglZXNwKQorCQltb3Z6d2wJLTEoJWVkaSwlZWF4KSwgJWVieAorCQltb3ZsCWRzUHJldiglZWR4KSwgJWVkaQorCQltb3ZsCSVlYngsIHNjYW5lbmQoJWVzcCkKKwkJbW92bAljaGFpbmxlbndtYXNrKCVlc3ApLCAlZWR4CisJCWptcAlMb29rdXBMb29wCisKKy8qIEFjY2VwdCB0aGUgY3VycmVudCBzdHJpbmcsIHdpdGggdGhlIG1heGltdW0gcG9zc2libGUgbGVuZ3RoLgkJKi8KKworTGVuTWF4aW11bToJbW92bAlkZWZsYXRlc3RhdGUoJWVzcCksICVlZHgKKwkJbW92bAkkTUFYX01BVENILCBiZXN0bGVuKCVlc3ApCisJCW1vdmwJJWVjeCwgZHNNYXRjaFN0YXJ0KCVlZHgpCisKKy8qIGlmICgodUludCliZXN0X2xlbiA8PSBzLT5sb29rYWhlYWQpIHJldHVybiAodUludCliZXN0X2xlbjsJCSovCisvKiByZXR1cm4gcy0+bG9va2FoZWFkOwkJCQkJCQkqLworCitMZWF2ZU5vdzoKKwkJbW92bAlkZWZsYXRlc3RhdGUoJWVzcCksICVlZHgKKwkJbW92bAliZXN0bGVuKCVlc3ApLCAlZWJ4CisJCW1vdmwJZHNMb29rYWhlYWQoJWVkeCksICVlYXgKKwkJY21wbAklZWF4LCAlZWJ4CisJCWpnCUxvb2thaGVhZFJldAorCQltb3ZsCSVlYngsICVlYXgKK0xvb2thaGVhZFJldDoKKworLyogUmVzdG9yZSB0aGUgc3RhY2sgYW5kIHJldHVybiBmcm9tIHdoZW5jZSB3ZSBjYW1lLgkJCSovCisKKwkJYWRkbAkkTG9jYWxWYXJzU2l6ZSwgJWVzcAorCQkuY2ZpX2RlZl9jZmFfb2Zmc2V0IDIwCisJCXBvcGwJJWVieAorCQkuY2ZpX2RlZl9jZmFfb2Zmc2V0IDE2CisJCXBvcGwJJWVzaQorCQkuY2ZpX2RlZl9jZmFfb2Zmc2V0IDEyCisJCXBvcGwJJWVkaQorCQkuY2ZpX2RlZl9jZmFfb2Zmc2V0IDgKKwkJcG9wbAklZWJwCisJCS5jZmlfZGVmX2NmYV9vZmZzZXQgNAorLmNmaV9lbmRwcm9jCittYXRjaF9pbml0OglyZXQKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvYmxhc3QvTWFrZWZpbGUgYi96bGliL3NyYy9jb250cmliL2JsYXN0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZTgwYmEKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL2JsYXN0L01ha2VmaWxlCkBAIC0wLDAgKzEsOCBAQAorYmxhc3Q6IGJsYXN0LmMgYmxhc3QuaAorCWNjIC1EVEVTVCAtbyBibGFzdCBibGFzdC5jCisKK3Rlc3Q6IGJsYXN0CisJYmxhc3QgPCB0ZXN0LnBrIHwgY21wIC0gdGVzdC50eHQKKworY2xlYW46CisJcm0gLWYgYmxhc3QgYmxhc3QubwpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9ibGFzdC9SRUFETUUgYi96bGliL3NyYy9jb250cmliL2JsYXN0L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2E2MGIzCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9ibGFzdC9SRUFETUUKQEAgLTAsMCArMSw0IEBACitSZWFkIGJsYXN0LmggZm9yIHB1cnBvc2UgYW5kIHVzYWdlLgorCitNYXJrIEFkbGVyCittYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL2JsYXN0L2JsYXN0LmMgYi96bGliL3NyYy9jb250cmliL2JsYXN0L2JsYXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllZjBmZQotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvYmxhc3QvYmxhc3QuYwpAQCAtMCwwICsxLDQ0NiBAQAorLyogYmxhc3QuYworICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDEyIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBibGFzdC5oCisgKiB2ZXJzaW9uIDEuMiwgMjQgT2N0IDIwMTIKKyAqCisgKiBibGFzdC5jIGRlY29tcHJlc3NlcyBkYXRhIGNvbXByZXNzZWQgYnkgdGhlIFBLV2FyZSBDb21wcmVzc2lvbiBMaWJyYXJ5LgorICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IHNpbWlsYXIgdG8gdGhlIGV4cGxvZGUoKSBmdW5jdGlvbiBvZgorICogdGhlIFBLV2FyZSBsaWJyYXJ5LCBoZW5jZSB0aGUgbmFtZSAiYmxhc3QiLgorICoKKyAqIFRoaXMgZGVjb21wcmVzc29yIGlzIGJhc2VkIG9uIHRoZSBleGNlbGxlbnQgZm9ybWF0IGRlc2NyaXB0aW9uIHByb3ZpZGVkIGJ5CisgKiBCZW4gUnVkaWFrLUdvdWxkIGluIGNvbXAuY29tcHJlc3Npb24gb24gQXVndXN0IDEzLCAyMDAxLiAgSW50ZXJlc3RpbmdseSwgdGhlCisgKiBleGFtcGxlIEJlbiBwcm92aWRlZCBpbiB0aGUgcG9zdCBpcyBpbmNvcnJlY3QuICBUaGUgZGlzdGFuY2UgMTEwMDAxIHNob3VsZAorICogaW5zdGVhZCBiZSAxMTEwMDAuICBXaGVuIGNvcnJlY3RlZCwgdGhlIGV4YW1wbGUgYnl0ZSBzdHJlYW0gYmVjb21lczoKKyAqCisgKiAgICAwMCAwNCA4MiAyNCAyNSA4ZiA4MCA3ZgorICoKKyAqIHdoaWNoIGRlY29tcHJlc3NlcyB0byAiQUlBSUFJQUlBSUFJQSIgKHdpdGhvdXQgdGhlIHF1b3RlcykuCisgKi8KKworLyoKKyAqIENoYW5nZSBoaXN0b3J5OgorICoKKyAqIDEuMCAgMTIgRmViIDIwMDMgICAgIC0gRmlyc3QgdmVyc2lvbgorICogMS4xICAxNiBGZWIgMjAwMyAgICAgLSBGaXhlZCBkaXN0YW5jZSBjaGVjayBmb3IgPiA0IEdCIHVuY29tcHJlc3NlZCBkYXRhCisgKiAxLjIgIDI0IE9jdCAyMDEyICAgICAtIEFkZCBub3RlIGFib3V0IHVzaW5nIGJpbmFyeSBtb2RlIGluIHN0ZGlvCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEZpeCBjb21wYXJpc29ucyBvZiBkaWZmZXJlbnRseSBzaWduZWQgaW50ZWdlcnMKKyAqLworCisjaW5jbHVkZSA8c2V0am1wLmg+ICAgICAgICAgICAgIC8qIGZvciBzZXRqbXAoKSwgbG9uZ2ptcCgpLCBhbmQgam1wX2J1ZiAqLworI2luY2x1ZGUgImJsYXN0LmgiICAgICAgICAgICAgICAvKiBwcm90b3R5cGUgZm9yIGJsYXN0KCkgKi8KKworI2RlZmluZSBsb2NhbCBzdGF0aWMgICAgICAgICAgICAvKiBmb3IgbG9jYWwgZnVuY3Rpb24gZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgTUFYQklUUyAxMyAgICAgICAgICAgICAgLyogbWF4aW11bSBjb2RlIGxlbmd0aCAqLworI2RlZmluZSBNQVhXSU4gNDA5NiAgICAgICAgICAgICAvKiBtYXhpbXVtIHdpbmRvdyBzaXplICovCisKKy8qIGlucHV0IGFuZCBvdXRwdXQgc3RhdGUgKi8KK3N0cnVjdCBzdGF0ZSB7CisgICAgLyogaW5wdXQgc3RhdGUgKi8KKyAgICBibGFzdF9pbiBpbmZ1bjsgICAgICAgICAgICAgLyogaW5wdXQgZnVuY3Rpb24gcHJvdmlkZWQgYnkgdXNlciAqLworICAgIHZvaWQgKmluaG93OyAgICAgICAgICAgICAgICAvKiBvcGFxdWUgaW5mb3JtYXRpb24gcGFzc2VkIHRvIGluZnVuKCkgKi8KKyAgICB1bnNpZ25lZCBjaGFyICppbjsgICAgICAgICAgLyogbmV4dCBpbnB1dCBsb2NhdGlvbiAqLworICAgIHVuc2lnbmVkIGxlZnQ7ICAgICAgICAgICAgICAvKiBhdmFpbGFibGUgaW5wdXQgYXQgaW4gKi8KKyAgICBpbnQgYml0YnVmOyAgICAgICAgICAgICAgICAgLyogYml0IGJ1ZmZlciAqLworICAgIGludCBiaXRjbnQ7ICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBpbiBiaXQgYnVmZmVyICovCisKKyAgICAvKiBpbnB1dCBsaW1pdCBlcnJvciByZXR1cm4gc3RhdGUgZm9yIGJpdHMoKSBhbmQgZGVjb2RlKCkgKi8KKyAgICBqbXBfYnVmIGVudjsKKworICAgIC8qIG91dHB1dCBzdGF0ZSAqLworICAgIGJsYXN0X291dCBvdXRmdW47ICAgICAgICAgICAvKiBvdXRwdXQgZnVuY3Rpb24gcHJvdmlkZWQgYnkgdXNlciAqLworICAgIHZvaWQgKm91dGhvdzsgICAgICAgICAgICAgICAvKiBvcGFxdWUgaW5mb3JtYXRpb24gcGFzc2VkIHRvIG91dGZ1bigpICovCisgICAgdW5zaWduZWQgbmV4dDsgICAgICAgICAgICAgIC8qIGluZGV4IG9mIG5leHQgd3JpdGUgbG9jYXRpb24gaW4gb3V0W10gKi8KKyAgICBpbnQgZmlyc3Q7ICAgICAgICAgICAgICAgICAgLyogdHJ1ZSB0byBjaGVjayBkaXN0YW5jZXMgKGZvciBmaXJzdCA0SykgKi8KKyAgICB1bnNpZ25lZCBjaGFyIG91dFtNQVhXSU5dOyAgLyogb3V0cHV0IGJ1ZmZlciBhbmQgc2xpZGluZyB3aW5kb3cgKi8KK307CisKKy8qCisgKiBSZXR1cm4gbmVlZCBiaXRzIGZyb20gdGhlIGlucHV0IHN0cmVhbS4gIFRoaXMgYWx3YXlzIGxlYXZlcyBsZXNzIHRoYW4KKyAqIGVpZ2h0IGJpdHMgaW4gdGhlIGJ1ZmZlci4gIGJpdHMoKSB3b3JrcyBwcm9wZXJseSBmb3IgbmVlZCA9PSAwLgorICoKKyAqIEZvcm1hdCBub3RlczoKKyAqCisgKiAtIEJpdHMgYXJlIHN0b3JlZCBpbiBieXRlcyBmcm9tIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gdGhlIG1vc3QKKyAqICAgc2lnbmlmaWNhbnQgYml0LiAgVGhlcmVmb3JlIGJpdHMgYXJlIGRyb3BwZWQgZnJvbSB0aGUgYm90dG9tIG9mIHRoZSBiaXQKKyAqICAgYnVmZmVyLCB1c2luZyBzaGlmdCByaWdodCwgYW5kIG5ldyBieXRlcyBhcmUgYXBwZW5kZWQgdG8gdGhlIHRvcCBvZiB0aGUKKyAqICAgYml0IGJ1ZmZlciwgdXNpbmcgc2hpZnQgbGVmdC4KKyAqLworbG9jYWwgaW50IGJpdHMoc3RydWN0IHN0YXRlICpzLCBpbnQgbmVlZCkKK3sKKyAgICBpbnQgdmFsOyAgICAgICAgICAgIC8qIGJpdCBhY2N1bXVsYXRvciAqLworCisgICAgLyogbG9hZCBhdCBsZWFzdCBuZWVkIGJpdHMgaW50byB2YWwgKi8KKyAgICB2YWwgPSBzLT5iaXRidWY7CisgICAgd2hpbGUgKHMtPmJpdGNudCA8IG5lZWQpIHsKKyAgICAgICAgaWYgKHMtPmxlZnQgPT0gMCkgeworICAgICAgICAgICAgcy0+bGVmdCA9IHMtPmluZnVuKHMtPmluaG93LCAmKHMtPmluKSk7CisgICAgICAgICAgICBpZiAocy0+bGVmdCA9PSAwKSBsb25nam1wKHMtPmVudiwgMSk7ICAgICAgIC8qIG91dCBvZiBpbnB1dCAqLworICAgICAgICB9CisgICAgICAgIHZhbCB8PSAoaW50KSgqKHMtPmluKSsrKSA8PCBzLT5iaXRjbnQ7ICAgICAgICAgIC8qIGxvYWQgZWlnaHQgYml0cyAqLworICAgICAgICBzLT5sZWZ0LS07CisgICAgICAgIHMtPmJpdGNudCArPSA4OworICAgIH0KKworICAgIC8qIGRyb3AgbmVlZCBiaXRzIGFuZCB1cGRhdGUgYnVmZmVyLCBhbHdheXMgemVybyB0byBzZXZlbiBiaXRzIGxlZnQgKi8KKyAgICBzLT5iaXRidWYgPSB2YWwgPj4gbmVlZDsKKyAgICBzLT5iaXRjbnQgLT0gbmVlZDsKKworICAgIC8qIHJldHVybiBuZWVkIGJpdHMsIHplcm9pbmcgdGhlIGJpdHMgYWJvdmUgdGhhdCAqLworICAgIHJldHVybiB2YWwgJiAoKDEgPDwgbmVlZCkgLSAxKTsKK30KKworLyoKKyAqIEh1ZmZtYW4gY29kZSBkZWNvZGluZyB0YWJsZXMuICBjb3VudFsxLi5NQVhCSVRTXSBpcyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgb2YKKyAqIGVhY2ggbGVuZ3RoLCB3aGljaCBmb3IgYSBjYW5vbmljYWwgY29kZSBhcmUgc3RlcHBlZCB0aHJvdWdoIGluIG9yZGVyLgorICogc3ltYm9sW10gYXJlIHRoZSBzeW1ib2wgdmFsdWVzIGluIGNhbm9uaWNhbCBvcmRlciwgd2hlcmUgdGhlIG51bWJlciBvZgorICogZW50cmllcyBpcyB0aGUgc3VtIG9mIHRoZSBjb3VudHMgaW4gY291bnRbXS4gIFRoZSBkZWNvZGluZyBwcm9jZXNzIGNhbiBiZQorICogc2VlbiBpbiB0aGUgZnVuY3Rpb24gZGVjb2RlKCkgYmVsb3cuCisgKi8KK3N0cnVjdCBodWZmbWFuIHsKKyAgICBzaG9ydCAqY291bnQ7ICAgICAgIC8qIG51bWJlciBvZiBzeW1ib2xzIG9mIGVhY2ggbGVuZ3RoICovCisgICAgc2hvcnQgKnN5bWJvbDsgICAgICAvKiBjYW5vbmljYWxseSBvcmRlcmVkIHN5bWJvbHMgKi8KK307CisKKy8qCisgKiBEZWNvZGUgYSBjb2RlIGZyb20gdGhlIHN0cmVhbSBzIHVzaW5nIGh1ZmZtYW4gdGFibGUgaC4gIFJldHVybiB0aGUgc3ltYm9sIG9yCisgKiBhIG5lZ2F0aXZlIHZhbHVlIGlmIHRoZXJlIGlzIGFuIGVycm9yLiAgSWYgYWxsIG9mIHRoZSBsZW5ndGhzIGFyZSB6ZXJvLCBpLmUuCisgKiBhbiBlbXB0eSBjb2RlLCBvciBpZiB0aGUgY29kZSBpcyBpbmNvbXBsZXRlIGFuZCBhbiBpbnZhbGlkIGNvZGUgaXMgcmVjZWl2ZWQsCisgKiB0aGVuIC05IGlzIHJldHVybmVkIGFmdGVyIHJlYWRpbmcgTUFYQklUUyBiaXRzLgorICoKKyAqIEZvcm1hdCBub3RlczoKKyAqCisgKiAtIFRoZSBjb2RlcyBhcyBzdG9yZWQgaW4gdGhlIGNvbXByZXNzZWQgZGF0YSBhcmUgYml0LXJldmVyc2VkIHJlbGF0aXZlIHRvCisgKiAgIGEgc2ltcGxlIGludGVnZXIgb3JkZXJpbmcgb2YgY29kZXMgb2YgdGhlIHNhbWUgbGVuZ3Rocy4gIEhlbmNlIGJlbG93IHRoZQorICogICBiaXRzIGFyZSBwdWxsZWQgZnJvbSB0aGUgY29tcHJlc3NlZCBkYXRhIG9uZSBhdCBhIHRpbWUgYW5kIHVzZWQgdG8KKyAqICAgYnVpbGQgdGhlIGNvZGUgdmFsdWUgcmV2ZXJzZWQgZnJvbSB3aGF0IGlzIGluIHRoZSBzdHJlYW0gaW4gb3JkZXIgdG8KKyAqICAgcGVybWl0IHNpbXBsZSBpbnRlZ2VyIGNvbXBhcmlzb25zIGZvciBkZWNvZGluZy4KKyAqCisgKiAtIFRoZSBmaXJzdCBjb2RlIGZvciB0aGUgc2hvcnRlc3QgbGVuZ3RoIGlzIGFsbCBvbmVzLiAgU3Vic2VxdWVudCBjb2RlcyBvZgorICogICB0aGUgc2FtZSBsZW5ndGggYXJlIHNpbXBseSBpbnRlZ2VyIGRlY3JlbWVudHMgb2YgdGhlIHByZXZpb3VzIGNvZGUuICBXaGVuCisgKiAgIG1vdmluZyB1cCBhIGxlbmd0aCwgYSBvbmUgYml0IGlzIGFwcGVuZGVkIHRvIHRoZSBjb2RlLiAgRm9yIGEgY29tcGxldGUKKyAqICAgY29kZSwgdGhlIGxhc3QgY29kZSBvZiB0aGUgbG9uZ2VzdCBsZW5ndGggd2lsbCBiZSBhbGwgemVyb3MuICBUbyBzdXBwb3J0CisgKiAgIHRoaXMgb3JkZXJpbmcsIHRoZSBiaXRzIHB1bGxlZCBkdXJpbmcgZGVjb2RpbmcgYXJlIGludmVydGVkIHRvIGFwcGx5IHRoZQorICogICBtb3JlICJuYXR1cmFsIiBvcmRlcmluZyBzdGFydGluZyB3aXRoIGFsbCB6ZXJvcyBhbmQgaW5jcmVtZW50aW5nLgorICovCitsb2NhbCBpbnQgZGVjb2RlKHN0cnVjdCBzdGF0ZSAqcywgc3RydWN0IGh1ZmZtYW4gKmgpCit7CisgICAgaW50IGxlbjsgICAgICAgICAgICAvKiBjdXJyZW50IG51bWJlciBvZiBiaXRzIGluIGNvZGUgKi8KKyAgICBpbnQgY29kZTsgICAgICAgICAgIC8qIGxlbiBiaXRzIGJlaW5nIGRlY29kZWQgKi8KKyAgICBpbnQgZmlyc3Q7ICAgICAgICAgIC8qIGZpcnN0IGNvZGUgb2YgbGVuZ3RoIGxlbiAqLworICAgIGludCBjb3VudDsgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGVzIG9mIGxlbmd0aCBsZW4gKi8KKyAgICBpbnQgaW5kZXg7ICAgICAgICAgIC8qIGluZGV4IG9mIGZpcnN0IGNvZGUgb2YgbGVuZ3RoIGxlbiBpbiBzeW1ib2wgdGFibGUgKi8KKyAgICBpbnQgYml0YnVmOyAgICAgICAgIC8qIGJpdHMgZnJvbSBzdHJlYW0gKi8KKyAgICBpbnQgbGVmdDsgICAgICAgICAgIC8qIGJpdHMgbGVmdCBpbiBuZXh0IG9yIGxlZnQgdG8gcHJvY2VzcyAqLworICAgIHNob3J0ICpuZXh0OyAgICAgICAgLyogbmV4dCBudW1iZXIgb2YgY29kZXMgKi8KKworICAgIGJpdGJ1ZiA9IHMtPmJpdGJ1ZjsKKyAgICBsZWZ0ID0gcy0+Yml0Y250OworICAgIGNvZGUgPSBmaXJzdCA9IGluZGV4ID0gMDsKKyAgICBsZW4gPSAxOworICAgIG5leHQgPSBoLT5jb3VudCArIDE7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgd2hpbGUgKGxlZnQtLSkgeworICAgICAgICAgICAgY29kZSB8PSAoYml0YnVmICYgMSkgXiAxOyAgIC8qIGludmVydCBjb2RlICovCisgICAgICAgICAgICBiaXRidWYgPj49IDE7CisgICAgICAgICAgICBjb3VudCA9ICpuZXh0Kys7CisgICAgICAgICAgICBpZiAoY29kZSA8IGZpcnN0ICsgY291bnQpIHsgLyogaWYgbGVuZ3RoIGxlbiwgcmV0dXJuIHN5bWJvbCAqLworICAgICAgICAgICAgICAgIHMtPmJpdGJ1ZiA9IGJpdGJ1ZjsKKyAgICAgICAgICAgICAgICBzLT5iaXRjbnQgPSAocy0+Yml0Y250IC0gbGVuKSAmIDc7CisgICAgICAgICAgICAgICAgcmV0dXJuIGgtPnN5bWJvbFtpbmRleCArIChjb2RlIC0gZmlyc3QpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGV4ICs9IGNvdW50OyAgICAgICAgICAgICAvKiBlbHNlIHVwZGF0ZSBmb3IgbmV4dCBsZW5ndGggKi8KKyAgICAgICAgICAgIGZpcnN0ICs9IGNvdW50OworICAgICAgICAgICAgZmlyc3QgPDw9IDE7CisgICAgICAgICAgICBjb2RlIDw8PSAxOworICAgICAgICAgICAgbGVuKys7CisgICAgICAgIH0KKyAgICAgICAgbGVmdCA9IChNQVhCSVRTKzEpIC0gbGVuOworICAgICAgICBpZiAobGVmdCA9PSAwKSBicmVhazsKKyAgICAgICAgaWYgKHMtPmxlZnQgPT0gMCkgeworICAgICAgICAgICAgcy0+bGVmdCA9IHMtPmluZnVuKHMtPmluaG93LCAmKHMtPmluKSk7CisgICAgICAgICAgICBpZiAocy0+bGVmdCA9PSAwKSBsb25nam1wKHMtPmVudiwgMSk7ICAgICAgIC8qIG91dCBvZiBpbnB1dCAqLworICAgICAgICB9CisgICAgICAgIGJpdGJ1ZiA9ICoocy0+aW4pKys7CisgICAgICAgIHMtPmxlZnQtLTsKKyAgICAgICAgaWYgKGxlZnQgPiA4KSBsZWZ0ID0gODsKKyAgICB9CisgICAgcmV0dXJuIC05OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmFuIG91dCBvZiBjb2RlcyAqLworfQorCisvKgorICogR2l2ZW4gYSBsaXN0IG9mIHJlcGVhdGVkIGNvZGUgbGVuZ3RocyByZXBbMC4ubi0xXSwgd2hlcmUgZWFjaCBieXRlIGlzIGEKKyAqIGNvdW50IChoaWdoIGZvdXIgYml0cyArIDEpIGFuZCBhIGNvZGUgbGVuZ3RoIChsb3cgZm91ciBiaXRzKSwgZ2VuZXJhdGUgdGhlCisgKiBsaXN0IG9mIGNvZGUgbGVuZ3Rocy4gIFRoaXMgY29tcGFjdGlvbiByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBvYmplY3QgY29kZS4KKyAqIFRoZW4gZ2l2ZW4gdGhlIGxpc3Qgb2YgY29kZSBsZW5ndGhzIGxlbmd0aFswLi5uLTFdIHJlcHJlc2VudGluZyBhIGNhbm9uaWNhbAorICogSHVmZm1hbiBjb2RlIGZvciBuIHN5bWJvbHMsIGNvbnN0cnVjdCB0aGUgdGFibGVzIHJlcXVpcmVkIHRvIGRlY29kZSB0aG9zZQorICogY29kZXMuICBUaG9zZSB0YWJsZXMgYXJlIHRoZSBudW1iZXIgb2YgY29kZXMgb2YgZWFjaCBsZW5ndGgsIGFuZCB0aGUgc3ltYm9scworICogc29ydGVkIGJ5IGxlbmd0aCwgcmV0YWluaW5nIHRoZWlyIG9yaWdpbmFsIG9yZGVyIHdpdGhpbiBlYWNoIGxlbmd0aC4gIFRoZQorICogcmV0dXJuIHZhbHVlIGlzIHplcm8gZm9yIGEgY29tcGxldGUgY29kZSBzZXQsIG5lZ2F0aXZlIGZvciBhbiBvdmVyLQorICogc3Vic2NyaWJlZCBjb2RlIHNldCwgYW5kIHBvc2l0aXZlIGZvciBhbiBpbmNvbXBsZXRlIGNvZGUgc2V0LiAgVGhlIHRhYmxlcworICogY2FuIGJlIHVzZWQgaWYgdGhlIHJldHVybiB2YWx1ZSBpcyB6ZXJvIG9yIHBvc2l0aXZlLCBidXQgdGhleSBjYW5ub3QgYmUgdXNlZAorICogaWYgdGhlIHJldHVybiB2YWx1ZSBpcyBuZWdhdGl2ZS4gIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgemVybywgaXQgaXMgbm90CisgKiBwb3NzaWJsZSBmb3IgZGVjb2RlKCkgdXNpbmcgdGhhdCB0YWJsZSB0byByZXR1cm4gYW4gZXJyb3ItLWFueSBzdHJlYW0gb2YKKyAqIGVub3VnaCBiaXRzIHdpbGwgcmVzb2x2ZSB0byBhIHN5bWJvbC4gIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgcG9zaXRpdmUsIHRoZW4KKyAqIGl0IGlzIHBvc3NpYmxlIGZvciBkZWNvZGUoKSB1c2luZyB0aGF0IHRhYmxlIHRvIHJldHVybiBhbiBlcnJvciBmb3IgcmVjZWl2ZWQKKyAqIGNvZGVzIHBhc3QgdGhlIGVuZCBvZiB0aGUgaW5jb21wbGV0ZSBsZW5ndGhzLgorICovCitsb2NhbCBpbnQgY29uc3RydWN0KHN0cnVjdCBodWZmbWFuICpoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZXAsIGludCBuKQoreworICAgIGludCBzeW1ib2w7ICAgICAgICAgLyogY3VycmVudCBzeW1ib2wgd2hlbiBzdGVwcGluZyB0aHJvdWdoIGxlbmd0aFtdICovCisgICAgaW50IGxlbjsgICAgICAgICAgICAvKiBjdXJyZW50IGxlbmd0aCB3aGVuIHN0ZXBwaW5nIHRocm91Z2ggaC0+Y291bnRbXSAqLworICAgIGludCBsZWZ0OyAgICAgICAgICAgLyogbnVtYmVyIG9mIHBvc3NpYmxlIGNvZGVzIGxlZnQgb2YgY3VycmVudCBsZW5ndGggKi8KKyAgICBzaG9ydCBvZmZzW01BWEJJVFMrMV07ICAgICAgLyogb2Zmc2V0cyBpbiBzeW1ib2wgdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovCisgICAgc2hvcnQgbGVuZ3RoWzI1Nl07ICAvKiBjb2RlIGxlbmd0aHMgKi8KKworICAgIC8qIGNvbnZlcnQgY29tcGFjdCByZXBlYXQgY291bnRzIGludG8gc3ltYm9sIGJpdCBsZW5ndGggbGlzdCAqLworICAgIHN5bWJvbCA9IDA7CisgICAgZG8geworICAgICAgICBsZW4gPSAqcmVwKys7CisgICAgICAgIGxlZnQgPSAobGVuID4+IDQpICsgMTsKKyAgICAgICAgbGVuICY9IDE1OworICAgICAgICBkbyB7CisgICAgICAgICAgICBsZW5ndGhbc3ltYm9sKytdID0gbGVuOworICAgICAgICB9IHdoaWxlICgtLWxlZnQpOworICAgIH0gd2hpbGUgKC0tbik7CisgICAgbiA9IHN5bWJvbDsKKworICAgIC8qIGNvdW50IG51bWJlciBvZiBjb2RlcyBvZiBlYWNoIGxlbmd0aCAqLworICAgIGZvciAobGVuID0gMDsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKQorICAgICAgICBoLT5jb3VudFtsZW5dID0gMDsKKyAgICBmb3IgKHN5bWJvbCA9IDA7IHN5bWJvbCA8IG47IHN5bWJvbCsrKQorICAgICAgICAoaC0+Y291bnRbbGVuZ3RoW3N5bWJvbF1dKSsrOyAgIC8qIGFzc3VtZXMgbGVuZ3RocyBhcmUgd2l0aGluIGJvdW5kcyAqLworICAgIGlmIChoLT5jb3VudFswXSA9PSBuKSAgICAgICAgICAgICAgIC8qIG5vIGNvZGVzISAqLworICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbXBsZXRlLCBidXQgZGVjb2RlKCkgd2lsbCBmYWlsICovCisKKyAgICAvKiBjaGVjayBmb3IgYW4gb3Zlci1zdWJzY3JpYmVkIG9yIGluY29tcGxldGUgc2V0IG9mIGxlbmd0aHMgKi8KKyAgICBsZWZ0ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbmUgcG9zc2libGUgY29kZSBvZiB6ZXJvIGxlbmd0aCAqLworICAgIGZvciAobGVuID0gMTsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7CisgICAgICAgIGxlZnQgPDw9IDE7ICAgICAgICAgICAgICAgICAgICAgLyogb25lIG1vcmUgYml0LCBkb3VibGUgY29kZXMgbGVmdCAqLworICAgICAgICBsZWZ0IC09IGgtPmNvdW50W2xlbl07ICAgICAgICAgIC8qIGRlZHVjdCBjb3VudCBmcm9tIHBvc3NpYmxlIGNvZGVzICovCisgICAgICAgIGlmIChsZWZ0IDwgMCkgcmV0dXJuIGxlZnQ7ICAgICAgLyogb3Zlci1zdWJzY3JpYmVkLS1yZXR1cm4gbmVnYXRpdmUgKi8KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZWZ0ID4gMCBtZWFucyBpbmNvbXBsZXRlICovCisKKyAgICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCBmb3Igc29ydGluZyAqLworICAgIG9mZnNbMV0gPSAwOworICAgIGZvciAobGVuID0gMTsgbGVuIDwgTUFYQklUUzsgbGVuKyspCisgICAgICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xlbl0gKyBoLT5jb3VudFtsZW5dOworCisgICAgLyoKKyAgICAgKiBwdXQgc3ltYm9scyBpbiB0YWJsZSBzb3J0ZWQgYnkgbGVuZ3RoLCBieSBzeW1ib2wgb3JkZXIgd2l0aGluIGVhY2gKKyAgICAgKiBsZW5ndGgKKyAgICAgKi8KKyAgICBmb3IgKHN5bWJvbCA9IDA7IHN5bWJvbCA8IG47IHN5bWJvbCsrKQorICAgICAgICBpZiAobGVuZ3RoW3N5bWJvbF0gIT0gMCkKKyAgICAgICAgICAgIGgtPnN5bWJvbFtvZmZzW2xlbmd0aFtzeW1ib2xdXSsrXSA9IHN5bWJvbDsKKworICAgIC8qIHJldHVybiB6ZXJvIGZvciBjb21wbGV0ZSBzZXQsIHBvc2l0aXZlIGZvciBpbmNvbXBsZXRlIHNldCAqLworICAgIHJldHVybiBsZWZ0OworfQorCisvKgorICogRGVjb2RlIFBLV2FyZSBDb21wcmVzc2lvbiBMaWJyYXJ5IHN0cmVhbS4KKyAqCisgKiBGb3JtYXQgbm90ZXM6CisgKgorICogLSBGaXJzdCBieXRlIGlzIDAgaWYgbGl0ZXJhbHMgYXJlIHVuY29kZWQgb3IgMSBpZiB0aGV5IGFyZSBjb2RlZC4gIFNlY29uZAorICogICBieXRlIGlzIDQsIDUsIG9yIDYgZm9yIHRoZSBudW1iZXIgb2YgZXh0cmEgYml0cyBpbiB0aGUgZGlzdGFuY2UgY29kZS4KKyAqICAgVGhpcyBpcyB0aGUgYmFzZS0yIGxvZ2FyaXRobSBvZiB0aGUgZGljdGlvbmFyeSBzaXplIG1pbnVzIHNpeC4KKyAqCisgKiAtIENvbXByZXNzZWQgZGF0YSBpcyBhIGNvbWJpbmF0aW9uIG9mIGxpdGVyYWxzIGFuZCBsZW5ndGgvZGlzdGFuY2UgcGFpcnMKKyAqICAgdGVybWluYXRlZCBieSBhbiBlbmQgY29kZS4gIExpdGVyYWxzIGFyZSBlaXRoZXIgSHVmZm1hbiBjb2RlZCBvcgorICogICB1bmNvZGVkIGJ5dGVzLiAgQSBsZW5ndGgvZGlzdGFuY2UgcGFpciBpcyBhIGNvZGVkIGxlbmd0aCBmb2xsb3dlZCBieSBhCisgKiAgIGNvZGVkIGRpc3RhbmNlIHRvIHJlcHJlc2VudCBhIHN0cmluZyB0aGF0IG9jY3VycyBlYXJsaWVyIGluIHRoZQorICogICB1bmNvbXByZXNzZWQgZGF0YSB0aGF0IG9jY3VycyBhZ2FpbiBhdCB0aGUgY3VycmVudCBsb2NhdGlvbi4KKyAqCisgKiAtIEEgYml0IHByZWNlZGluZyBhIGxpdGVyYWwgb3IgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgaW5kaWNhdGVzIHdoaWNoIGNvbWVzCisgKiAgIG5leHQsIDAgZm9yIGxpdGVyYWxzLCAxIGZvciBsZW5ndGgvZGlzdGFuY2UuCisgKgorICogLSBJZiBsaXRlcmFscyBhcmUgdW5jb2RlZCwgdGhlbiB0aGUgbmV4dCBlaWdodCBiaXRzIGFyZSB0aGUgbGl0ZXJhbCwgaW4gdGhlCisgKiAgIG5vcm1hbCBiaXQgb3JkZXIgaW4gdGggc3RyZWFtLCBpLmUuIG5vIGJpdC1yZXZlcnNhbCBpcyBuZWVkZWQuIFNpbWlsYXJseSwKKyAqICAgbm8gYml0IHJldmVyc2FsIGlzIG5lZWRlZCBmb3IgZWl0aGVyIHRoZSBsZW5ndGggZXh0cmEgYml0cyBvciB0aGUgZGlzdGFuY2UKKyAqICAgZXh0cmEgYml0cy4KKyAqCisgKiAtIExpdGVyYWwgYnl0ZXMgYXJlIHNpbXBseSB3cml0dGVuIHRvIHRoZSBvdXRwdXQuICBBIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzCisgKiAgIGFuIGluc3RydWN0aW9uIHRvIGNvcHkgcHJldmlvdXNseSB1bmNvbXByZXNzZWQgYnl0ZXMgdG8gdGhlIG91dHB1dC4gIFRoZQorICogICBjb3B5IGlzIGZyb20gZGlzdGFuY2UgYnl0ZXMgYmFjayBpbiB0aGUgb3V0cHV0IHN0cmVhbSwgY29weWluZyBmb3IgbGVuZ3RoCisgKiAgIGJ5dGVzLgorICoKKyAqIC0gRGlzdGFuY2VzIHBvaW50aW5nIGJlZm9yZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgZGF0YSBhcmUgbm90CisgKiAgIHBlcm1pdHRlZC4KKyAqCisgKiAtIE92ZXJsYXBwZWQgY29waWVzLCB3aGVyZSB0aGUgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZGlzdGFuY2UsIGFyZQorICogICBhbGxvd2VkIGFuZCBjb21tb24uICBGb3IgZXhhbXBsZSwgYSBkaXN0YW5jZSBvZiBvbmUgYW5kIGEgbGVuZ3RoIG9mIDUxOAorICogICBzaW1wbHkgY29waWVzIHRoZSBsYXN0IGJ5dGUgNTE4IHRpbWVzLiAgQSBkaXN0YW5jZSBvZiBmb3VyIGFuZCBhIGxlbmd0aCBvZgorICogICB0d2VsdmUgY29waWVzIHRoZSBsYXN0IGZvdXIgYnl0ZXMgdGhyZWUgdGltZXMuICBBIHNpbXBsZSBmb3J3YXJkIGNvcHkKKyAqICAgaWdub3Jpbmcgd2hldGhlciB0aGUgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZGlzdGFuY2Ugb3Igbm90IGltcGxlbWVudHMKKyAqICAgdGhpcyBjb3JyZWN0bHkuCisgKi8KK2xvY2FsIGludCBkZWNvbXAoc3RydWN0IHN0YXRlICpzKQoreworICAgIGludCBsaXQ7ICAgICAgICAgICAgLyogdHJ1ZSBpZiBsaXRlcmFscyBhcmUgY29kZWQgKi8KKyAgICBpbnQgZGljdDsgICAgICAgICAgIC8qIGxvZzIoZGljdGlvbmFyeSBzaXplKSAtIDYgKi8KKyAgICBpbnQgc3ltYm9sOyAgICAgICAgIC8qIGRlY29kZWQgc3ltYm9sLCBleHRyYSBiaXRzIGZvciBkaXN0YW5jZSAqLworICAgIGludCBsZW47ICAgICAgICAgICAgLyogbGVuZ3RoIGZvciBjb3B5ICovCisgICAgdW5zaWduZWQgZGlzdDsgICAgICAvKiBkaXN0YW5jZSBmb3IgY29weSAqLworICAgIGludCBjb3B5OyAgICAgICAgICAgLyogY29weSBjb3VudGVyICovCisgICAgdW5zaWduZWQgY2hhciAqZnJvbSwgKnRvOyAgIC8qIGNvcHkgcG9pbnRlcnMgKi8KKyAgICBzdGF0aWMgaW50IHZpcmdpbiA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnVpbGQgdGFibGVzIG9uY2UgKi8KKyAgICBzdGF0aWMgc2hvcnQgbGl0Y250W01BWEJJVFMrMV0sIGxpdHN5bVsyNTZdOyAgICAgICAgLyogbGl0Y29kZSBtZW1vcnkgKi8KKyAgICBzdGF0aWMgc2hvcnQgbGVuY250W01BWEJJVFMrMV0sIGxlbnN5bVsxNl07ICAgICAgICAgLyogbGVuY29kZSBtZW1vcnkgKi8KKyAgICBzdGF0aWMgc2hvcnQgZGlzdGNudFtNQVhCSVRTKzFdLCBkaXN0c3ltWzY0XTsgICAgICAgLyogZGlzdGNvZGUgbWVtb3J5ICovCisgICAgc3RhdGljIHN0cnVjdCBodWZmbWFuIGxpdGNvZGUgPSB7bGl0Y250LCBsaXRzeW19OyAgIC8qIGxlbmd0aCBjb2RlICovCisgICAgc3RhdGljIHN0cnVjdCBodWZmbWFuIGxlbmNvZGUgPSB7bGVuY250LCBsZW5zeW19OyAgIC8qIGxlbmd0aCBjb2RlICovCisgICAgc3RhdGljIHN0cnVjdCBodWZmbWFuIGRpc3Rjb2RlID0ge2Rpc3RjbnQsIGRpc3RzeW19Oy8qIGRpc3RhbmNlIGNvZGUgKi8KKyAgICAgICAgLyogYml0IGxlbmd0aHMgb2YgbGl0ZXJhbCBjb2RlcyAqLworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGxpdGxlbltdID0geworICAgICAgICAxMSwgMTI0LCA4LCA3LCAyOCwgNywgMTg4LCAxMywgNzYsIDQsIDEwLCA4LCAxMiwgMTAsIDEyLCAxMCwgOCwgMjMsIDgsCisgICAgICAgIDksIDcsIDYsIDcsIDgsIDcsIDYsIDU1LCA4LCAyMywgMjQsIDEyLCAxMSwgNywgOSwgMTEsIDEyLCA2LCA3LCAyMiwgNSwKKyAgICAgICAgNywgMjQsIDYsIDExLCA5LCA2LCA3LCAyMiwgNywgMTEsIDM4LCA3LCA5LCA4LCAyNSwgMTEsIDgsIDExLCA5LCAxMiwKKyAgICAgICAgOCwgMTIsIDUsIDM4LCA1LCAzOCwgNSwgMTEsIDcsIDUsIDYsIDIxLCA2LCAxMCwgNTMsIDgsIDcsIDI0LCAxMCwgMjcsCisgICAgICAgIDQ0LCAyNTMsIDI1MywgMjUzLCAyNTIsIDI1MiwgMjUyLCAxMywgMTIsIDQ1LCAxMiwgNDUsIDEyLCA2MSwgMTIsIDQ1LAorICAgICAgICA0NCwgMTczfTsKKyAgICAgICAgLyogYml0IGxlbmd0aHMgb2YgbGVuZ3RoIGNvZGVzIDAuLjE1ICovCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbGVubGVuW10gPSB7MiwgMzUsIDM2LCA1MywgMzgsIDIzfTsKKyAgICAgICAgLyogYml0IGxlbmd0aHMgb2YgZGlzdGFuY2UgY29kZXMgMC4uNjMgKi8KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBkaXN0bGVuW10gPSB7MiwgMjAsIDUzLCAyMzAsIDI0NywgMTUxLCAyNDh9OworICAgIHN0YXRpYyBjb25zdCBzaG9ydCBiYXNlWzE2XSA9IHsgICAgIC8qIGJhc2UgZm9yIGxlbmd0aCBjb2RlcyAqLworICAgICAgICAzLCAyLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTIsIDE2LCAyNCwgNDAsIDcyLCAxMzYsIDI2NH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgZXh0cmFbMTZdID0geyAgICAgLyogZXh0cmEgYml0cyBmb3IgbGVuZ3RoIGNvZGVzICovCisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDh9OworCisgICAgLyogc2V0IHVwIGRlY29kaW5nIHRhYmxlcyAob25jZS0tbWlnaHQgbm90IGJlIHRocmVhZC1zYWZlKSAqLworICAgIGlmICh2aXJnaW4pIHsKKyAgICAgICAgY29uc3RydWN0KCZsaXRjb2RlLCBsaXRsZW4sIHNpemVvZihsaXRsZW4pKTsKKyAgICAgICAgY29uc3RydWN0KCZsZW5jb2RlLCBsZW5sZW4sIHNpemVvZihsZW5sZW4pKTsKKyAgICAgICAgY29uc3RydWN0KCZkaXN0Y29kZSwgZGlzdGxlbiwgc2l6ZW9mKGRpc3RsZW4pKTsKKyAgICAgICAgdmlyZ2luID0gMDsKKyAgICB9CisKKyAgICAvKiByZWFkIGhlYWRlciAqLworICAgIGxpdCA9IGJpdHMocywgOCk7CisgICAgaWYgKGxpdCA+IDEpIHJldHVybiAtMTsKKyAgICBkaWN0ID0gYml0cyhzLCA4KTsKKyAgICBpZiAoZGljdCA8IDQgfHwgZGljdCA+IDYpIHJldHVybiAtMjsKKworICAgIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlIHBhaXJzICovCisgICAgZG8geworICAgICAgICBpZiAoYml0cyhzLCAxKSkgeworICAgICAgICAgICAgLyogZ2V0IGxlbmd0aCAqLworICAgICAgICAgICAgc3ltYm9sID0gZGVjb2RlKHMsICZsZW5jb2RlKTsKKyAgICAgICAgICAgIGxlbiA9IGJhc2Vbc3ltYm9sXSArIGJpdHMocywgZXh0cmFbc3ltYm9sXSk7CisgICAgICAgICAgICBpZiAobGVuID09IDUxOSkgYnJlYWs7ICAgICAgICAgICAgICAvKiBlbmQgY29kZSAqLworCisgICAgICAgICAgICAvKiBnZXQgZGlzdGFuY2UgKi8KKyAgICAgICAgICAgIHN5bWJvbCA9IGxlbiA9PSAyID8gMiA6IGRpY3Q7CisgICAgICAgICAgICBkaXN0ID0gZGVjb2RlKHMsICZkaXN0Y29kZSkgPDwgc3ltYm9sOworICAgICAgICAgICAgZGlzdCArPSBiaXRzKHMsIHN5bWJvbCk7CisgICAgICAgICAgICBkaXN0Kys7CisgICAgICAgICAgICBpZiAocy0+Zmlyc3QgJiYgZGlzdCA+IHMtPm5leHQpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0zOyAgICAgICAgICAgICAgLyogZGlzdGFuY2UgdG9vIGZhciBiYWNrICovCisKKyAgICAgICAgICAgIC8qIGNvcHkgbGVuZ3RoIGJ5dGVzIGZyb20gZGlzdGFuY2UgYnl0ZXMgYmFjayAqLworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHRvID0gcy0+b3V0ICsgcy0+bmV4dDsKKyAgICAgICAgICAgICAgICBmcm9tID0gdG8gLSBkaXN0OworICAgICAgICAgICAgICAgIGNvcHkgPSBNQVhXSU47CisgICAgICAgICAgICAgICAgaWYgKHMtPm5leHQgPCBkaXN0KSB7CisgICAgICAgICAgICAgICAgICAgIGZyb20gKz0gY29weTsKKyAgICAgICAgICAgICAgICAgICAgY29weSA9IGRpc3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvcHkgLT0gcy0+bmV4dDsKKyAgICAgICAgICAgICAgICBpZiAoY29weSA+IGxlbikgY29weSA9IGxlbjsKKyAgICAgICAgICAgICAgICBsZW4gLT0gY29weTsKKyAgICAgICAgICAgICAgICBzLT5uZXh0ICs9IGNvcHk7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAqdG8rKyA9ICpmcm9tKys7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTsKKyAgICAgICAgICAgICAgICBpZiAocy0+bmV4dCA9PSBNQVhXSU4pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPm91dGZ1bihzLT5vdXRob3csIHMtPm91dCwgcy0+bmV4dCkpIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICBzLT5uZXh0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcy0+Zmlyc3QgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKGxlbiAhPSAwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIGdldCBsaXRlcmFsIGFuZCB3cml0ZSBpdCAqLworICAgICAgICAgICAgc3ltYm9sID0gbGl0ID8gZGVjb2RlKHMsICZsaXRjb2RlKSA6IGJpdHMocywgOCk7CisgICAgICAgICAgICBzLT5vdXRbcy0+bmV4dCsrXSA9IHN5bWJvbDsKKyAgICAgICAgICAgIGlmIChzLT5uZXh0ID09IE1BWFdJTikgeworICAgICAgICAgICAgICAgIGlmIChzLT5vdXRmdW4ocy0+b3V0aG93LCBzLT5vdXQsIHMtPm5leHQpKSByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICBzLT5uZXh0ID0gMDsKKyAgICAgICAgICAgICAgICBzLT5maXJzdCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IHdoaWxlICgxKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogU2VlIGNvbW1lbnRzIGluIGJsYXN0LmggKi8KK2ludCBibGFzdChibGFzdF9pbiBpbmZ1biwgdm9pZCAqaW5ob3csIGJsYXN0X291dCBvdXRmdW4sIHZvaWQgKm91dGhvdykKK3sKKyAgICBzdHJ1Y3Qgc3RhdGUgczsgICAgICAgICAgICAgLyogaW5wdXQvb3V0cHV0IHN0YXRlICovCisgICAgaW50IGVycjsgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiB2YWx1ZSAqLworCisgICAgLyogaW5pdGlhbGl6ZSBpbnB1dCBzdGF0ZSAqLworICAgIHMuaW5mdW4gPSBpbmZ1bjsKKyAgICBzLmluaG93ID0gaW5ob3c7CisgICAgcy5sZWZ0ID0gMDsKKyAgICBzLmJpdGJ1ZiA9IDA7CisgICAgcy5iaXRjbnQgPSAwOworCisgICAgLyogaW5pdGlhbGl6ZSBvdXRwdXQgc3RhdGUgKi8KKyAgICBzLm91dGZ1biA9IG91dGZ1bjsKKyAgICBzLm91dGhvdyA9IG91dGhvdzsKKyAgICBzLm5leHQgPSAwOworICAgIHMuZmlyc3QgPSAxOworCisgICAgLyogcmV0dXJuIGlmIGJpdHMoKSBvciBkZWNvZGUoKSB0cmllcyB0byByZWFkIHBhc3QgYXZhaWxhYmxlIGlucHV0ICovCisgICAgaWYgKHNldGptcChzLmVudikgIT0gMCkgICAgICAgICAgICAgLyogaWYgY2FtZSBiYWNrIGhlcmUgdmlhIGxvbmdqbXAoKSwgKi8KKyAgICAgICAgZXJyID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAvKiAgdGhlbiBza2lwIGRlY29tcCgpLCByZXR1cm4gZXJyb3IgKi8KKyAgICBlbHNlCisgICAgICAgIGVyciA9IGRlY29tcCgmcyk7ICAgICAgICAgICAgICAgLyogZGVjb21wcmVzcyAqLworCisgICAgLyogd3JpdGUgYW55IGxlZnRvdmVyIG91dHB1dCBhbmQgdXBkYXRlIHRoZSBlcnJvciBjb2RlIGlmIG5lZWRlZCAqLworICAgIGlmIChlcnIgIT0gMSAmJiBzLm5leHQgJiYgcy5vdXRmdW4ocy5vdXRob3csIHMub3V0LCBzLm5leHQpICYmIGVyciA9PSAwKQorICAgICAgICBlcnIgPSAxOworICAgIHJldHVybiBlcnI7Cit9CisKKyNpZmRlZiBURVNUCisvKiBFeGFtcGxlIG9mIGhvdyB0byB1c2UgYmxhc3QoKSAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNkZWZpbmUgQ0hVTksgMTYzODQKKworbG9jYWwgdW5zaWduZWQgaW5mKHZvaWQgKmhvdywgdW5zaWduZWQgY2hhciAqKmJ1ZikKK3sKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBob2xkW0NIVU5LXTsKKworICAgICpidWYgPSBob2xkOworICAgIHJldHVybiBmcmVhZChob2xkLCAxLCBDSFVOSywgKEZJTEUgKilob3cpOworfQorCitsb2NhbCBpbnQgb3V0Zih2b2lkICpob3csIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuKQoreworICAgIHJldHVybiBmd3JpdGUoYnVmLCAxLCBsZW4sIChGSUxFICopaG93KSAhPSBsZW47Cit9CisKKy8qIERlY29tcHJlc3MgYSBQS1dhcmUgQ29tcHJlc3Npb24gTGlicmFyeSBzdHJlYW0gZnJvbSBzdGRpbiB0byBzdGRvdXQgKi8KK2ludCBtYWluKHZvaWQpCit7CisgICAgaW50IHJldCwgbjsKKworICAgIC8qIGRlY29tcHJlc3MgdG8gc3Rkb3V0ICovCisgICAgcmV0ID0gYmxhc3QoaW5mLCBzdGRpbiwgb3V0Ziwgc3Rkb3V0KTsKKyAgICBpZiAocmV0ICE9IDApIGZwcmludGYoc3RkZXJyLCAiYmxhc3QgZXJyb3I6ICVkXG4iLCByZXQpOworCisgICAgLyogc2VlIGlmIHRoZXJlIGFyZSBhbnkgbGVmdG92ZXIgYnl0ZXMgKi8KKyAgICBuID0gMDsKKyAgICB3aGlsZSAoZ2V0Y2hhcigpICE9IEVPRikgbisrOworICAgIGlmIChuKSBmcHJpbnRmKHN0ZGVyciwgImJsYXN0IHdhcm5pbmc6ICVkIHVudXNlZCBieXRlcyBvZiBpbnB1dFxuIiwgbik7CisKKyAgICAvKiByZXR1cm4gYmxhc3QoKSBlcnJvciBjb2RlICovCisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9ibGFzdC9ibGFzdC5oIGIvemxpYi9zcmMvY29udHJpYi9ibGFzdC9ibGFzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OGNmZDMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL2JsYXN0L2JsYXN0LmgKQEAgLTAsMCArMSw3NSBAQAorLyogYmxhc3QuaCAtLSBpbnRlcmZhY2UgZm9yIGJsYXN0LmMKKyAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDEyIE1hcmsgQWRsZXIKKyAgdmVyc2lvbiAxLjIsIDI0IE9jdCAyMDEyCisKKyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3IgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisKKyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisgIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKKyAgTWFyayBBZGxlciAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CisgKi8KKworCisvKgorICogYmxhc3QoKSBkZWNvbXByZXNzZXMgdGhlIFBLV2FyZSBEYXRhIENvbXByZXNzaW9uIExpYnJhcnkgKERDTCkgY29tcHJlc3NlZAorICogZm9ybWF0LiAgSXQgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyB0aGUgZXhwbG9kZSgpIGZ1bmN0aW9uIGluCisgKiB0aGF0IGxpYnJhcnkuICAoTm90ZTogUEtXYXJlIG92ZXJ1c2VkIHRoZSAiaW1wbG9kZSIgdmVyYiwgYW5kIHRoZSBmb3JtYXQKKyAqIHVzZWQgYnkgdGhlaXIgbGlicmFyeSBpbXBsb2RlKCkgZnVuY3Rpb24gaXMgY29tcGxldGVseSBkaWZmZXJlbnQgYW5kCisgKiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgaW1wbG9kZSBjb21wcmVzc2lvbiBtZXRob2Qgc3VwcG9ydGVkIGJ5IFBLWklQLikKKyAqCisgKiBUaGUgYmluYXJ5IG1vZGUgZm9yIHN0ZGlvIGZ1bmN0aW9ucyBzaG91bGQgYmUgdXNlZCB0byBhc3N1cmUgdGhhdCB0aGUKKyAqIGNvbXByZXNzZWQgZGF0YSBpcyBub3QgY29ycnVwdGVkIHdoZW4gcmVhZCBvciB3cml0dGVuLiAgRm9yIGV4YW1wbGU6CisgKiBmb3BlbiguLi4sICJyYiIpIGFuZCBmb3BlbiguLi4sICJ3YiIpLgorICovCisKKwordHlwZWRlZiB1bnNpZ25lZCAoKmJsYXN0X2luKSh2b2lkICpob3csIHVuc2lnbmVkIGNoYXIgKipidWYpOwordHlwZWRlZiBpbnQgKCpibGFzdF9vdXQpKHZvaWQgKmhvdywgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsZW4pOworLyogRGVmaW5pdGlvbnMgZm9yIGlucHV0L291dHB1dCBmdW5jdGlvbnMgcGFzc2VkIHRvIGJsYXN0KCkuICBTZWUgYmVsb3cgZm9yCisgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbnMgbmVlZCB0byBkby4KKyAqLworCisKK2ludCBibGFzdChibGFzdF9pbiBpbmZ1biwgdm9pZCAqaW5ob3csIGJsYXN0X291dCBvdXRmdW4sIHZvaWQgKm91dGhvdyk7CisvKiBEZWNvbXByZXNzIGlucHV0IHRvIG91dHB1dCB1c2luZyB0aGUgcHJvdmlkZWQgaW5mdW4oKSBhbmQgb3V0ZnVuKCkgY2FsbHMuCisgKiBPbiBzdWNjZXNzLCB0aGUgcmV0dXJuIHZhbHVlIG9mIGJsYXN0KCkgaXMgemVyby4gIElmIHRoZXJlIGlzIGFuIGVycm9yIGluCisgKiB0aGUgc291cmNlIGRhdGEsIGkuZS4gaXQgaXMgbm90IGluIHRoZSBwcm9wZXIgZm9ybWF0LCB0aGVuIGEgbmVnYXRpdmUgdmFsdWUKKyAqIGlzIHJldHVybmVkLiAgSWYgdGhlcmUgaXMgbm90IGVub3VnaCBpbnB1dCBhdmFpbGFibGUgb3IgdGhlcmUgaXMgbm90IGVub3VnaAorICogb3V0cHV0IHNwYWNlLCB0aGVuIGEgcG9zaXRpdmUgZXJyb3IgaXMgcmV0dXJuZWQuCisgKgorICogVGhlIGlucHV0IGZ1bmN0aW9uIGlzIGludm9rZWQ6IGxlbiA9IGluZnVuKGhvdywgJmJ1ZiksIHdoZXJlIGJ1ZiBpcyBzZXQgYnkKKyAqIGluZnVuKCkgdG8gcG9pbnQgdG8gdGhlIGlucHV0IGJ1ZmZlciwgYW5kIGluZnVuKCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mCisgKiBhdmFpbGFibGUgYnl0ZXMgdGhlcmUuICBJZiBpbmZ1bigpIHJldHVybnMgemVybywgdGhlbiBibGFzdCgpIHJldHVybnMgd2l0aAorICogYW4gaW5wdXQgZXJyb3IuICAoYmxhc3QoKSBvbmx5IGFza3MgZm9yIGlucHV0IGlmIGl0IG5lZWRzIGl0LikgIGluaG93IGlzIGZvcgorICogdXNlIGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBwYXNzIGFuIGlucHV0IGRlc2NyaXB0b3IgdG8gaW5mdW4oKSwgaWYgZGVzaXJlZC4KKyAqCisgKiBUaGUgb3V0cHV0IGZ1bmN0aW9uIGlzIGludm9rZWQ6IGVyciA9IG91dGZ1bihob3csIGJ1ZiwgbGVuKSwgd2hlcmUgdGhlIGJ5dGVzCisgKiB0byBiZSB3cml0dGVuIGFyZSBidWZbMC4ubGVuLTFdLiAgSWYgZXJyIGlzIG5vdCB6ZXJvLCB0aGVuIGJsYXN0KCkgcmV0dXJucworICogd2l0aCBhbiBvdXRwdXQgZXJyb3IuICBvdXRmdW4oKSBpcyBhbHdheXMgY2FsbGVkIHdpdGggbGVuIDw9IDQwOTYuICBvdXRob3cKKyAqIGlzIGZvciB1c2UgYnkgdGhlIGFwcGxpY2F0aW9uIHRvIHBhc3MgYW4gb3V0cHV0IGRlc2NyaXB0b3IgdG8gb3V0ZnVuKCksIGlmCisgKiBkZXNpcmVkLgorICoKKyAqIFRoZSByZXR1cm4gY29kZXMgYXJlOgorICoKKyAqICAgMjogIHJhbiBvdXQgb2YgaW5wdXQgYmVmb3JlIGNvbXBsZXRpbmcgZGVjb21wcmVzc2lvbgorICogICAxOiAgb3V0cHV0IGVycm9yIGJlZm9yZSBjb21wbGV0aW5nIGRlY29tcHJlc3Npb24KKyAqICAgMDogIHN1Y2Nlc3NmdWwgZGVjb21wcmVzc2lvbgorICogIC0xOiAgbGl0ZXJhbCBmbGFnIG5vdCB6ZXJvIG9yIG9uZQorICogIC0yOiAgZGljdGlvbmFyeSBzaXplIG5vdCBpbiA0Li42CisgKiAgLTM6ICBkaXN0YW5jZSBpcyB0b28gZmFyIGJhY2sKKyAqCisgKiBBdCB0aGUgYm90dG9tIG9mIGJsYXN0LmMgaXMgYW4gZXhhbXBsZSBwcm9ncmFtIHRoYXQgdXNlcyBibGFzdCgpIHRoYXQgY2FuIGJlCisgKiBjb21waWxlZCB0byBwcm9kdWNlIGEgY29tbWFuZC1saW5lIGRlY29tcHJlc3Npb24gZmlsdGVyIGJ5IGRlZmluaW5nIFRFU1QuCisgKi8KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvYmxhc3QvdGVzdC5wayBiL3psaWIvc3JjL2NvbnRyaWIvYmxhc3QvdGVzdC5wawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTEwYjJiCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9ibGFzdC90ZXN0LnBrCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvYmxhc3QvdGVzdC50eHQgYi96bGliL3NyYy9jb250cmliL2JsYXN0L3Rlc3QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZGYxYzUKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL2JsYXN0L3Rlc3QudHh0CkBAIC0wLDAgKzEgQEAKK0FJQUlBSUFJQUlBSUEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL2RlbHBoaS9aTGliLnBhcyBiL3psaWIvc3JjL2NvbnRyaWIvZGVscGhpL1pMaWIucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1Nzk5NzQKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL2RlbHBoaS9aTGliLnBhcwpAQCAtMCwwICsxLDU1NyBAQAoreyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKip9Cit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KK3sgICAgICAgQm9ybGFuZCBEZWxwaGkgU3VwcGxlbWVudGFsIENvbXBvbmVudHMgICAgICAgICAgfQoreyAgICAgICBaTElCIERhdGEgQ29tcHJlc3Npb24gSW50ZXJmYWNlIFVuaXQgICAgICAgICAgICB9Cit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KK3sgICAgICAgQ29weXJpZ2h0IChjKSAxOTk3LDk5IEJvcmxhbmQgQ29ycG9yYXRpb24gICAgICAgfQoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Cit7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKn0KKworeyBVcGRhdGVkIGZvciB6bGliIDEuMi54IGJ5IENvc21pbiBUcnV0YSA8Y29zbWludEBjcy51YmJjbHVqLnJvPiB9CisKK3VuaXQgWkxpYjsKKworaW50ZXJmYWNlCisKK3VzZXMgU3lzVXRpbHMsIENsYXNzZXM7CisKK3R5cGUKKyAgVEFsbG9jID0gZnVuY3Rpb24gKEFwcERhdGE6IFBvaW50ZXI7IEl0ZW1zLCBTaXplOiBJbnRlZ2VyKTogUG9pbnRlcjsgY2RlY2w7CisgIFRGcmVlID0gcHJvY2VkdXJlIChBcHBEYXRhLCBCbG9jazogUG9pbnRlcik7IGNkZWNsOworCisgIC8vIEludGVybmFsIHN0cnVjdHVyZS4gIElnbm9yZS4KKyAgVFpTdHJlYW1SZWMgPSBwYWNrZWQgcmVjb3JkCisgICAgbmV4dF9pbjogUENoYXI7ICAgICAgIC8vIG5leHQgaW5wdXQgYnl0ZQorICAgIGF2YWlsX2luOiBJbnRlZ2VyOyAgICAvLyBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IG5leHRfaW4KKyAgICB0b3RhbF9pbjogTG9uZ2ludDsgICAgLy8gdG90YWwgbmIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIKKworICAgIG5leHRfb3V0OiBQQ2hhcjsgICAgICAvLyBuZXh0IG91dHB1dCBieXRlIHNob3VsZCBiZSBwdXQgaGVyZQorICAgIGF2YWlsX291dDogSW50ZWdlcjsgICAvLyByZW1haW5pbmcgZnJlZSBzcGFjZSBhdCBuZXh0X291dAorICAgIHRvdGFsX291dDogTG9uZ2ludDsgICAvLyB0b3RhbCBuYiBvZiBieXRlcyBvdXRwdXQgc28gZmFyCisKKyAgICBtc2c6IFBDaGFyOyAgICAgICAgICAgLy8gbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yCisgICAgaW50ZXJuYWw6IFBvaW50ZXI7ICAgIC8vIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucworCisgICAgemFsbG9jOiBUQWxsb2M7ICAgICAgIC8vIHVzZWQgdG8gYWxsb2NhdGUgdGhlIGludGVybmFsIHN0YXRlCisgICAgemZyZWU6IFRGcmVlOyAgICAgICAgIC8vIHVzZWQgdG8gZnJlZSB0aGUgaW50ZXJuYWwgc3RhdGUKKyAgICBBcHBEYXRhOiBQb2ludGVyOyAgICAgLy8gcHJpdmF0ZSBkYXRhIG9iamVjdCBwYXNzZWQgdG8gemFsbG9jIGFuZCB6ZnJlZQorCisgICAgZGF0YV90eXBlOiBJbnRlZ2VyOyAgIC8vIGJlc3QgZ3Vlc3MgYWJvdXQgdGhlIGRhdGEgdHlwZTogYXNjaWkgb3IgYmluYXJ5CisgICAgYWRsZXI6IExvbmdpbnQ7ICAgICAgIC8vIGFkbGVyMzIgdmFsdWUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhCisgICAgcmVzZXJ2ZWQ6IExvbmdpbnQ7ICAgIC8vIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlCisgIGVuZDsKKworICAvLyBBYnN0cmFjdCBhbmNlc3RvciBjbGFzcworICBUQ3VzdG9tWmxpYlN0cmVhbSA9IGNsYXNzKFRTdHJlYW0pCisgIHByaXZhdGUKKyAgICBGU3RybTogVFN0cmVhbTsKKyAgICBGU3RybVBvczogSW50ZWdlcjsKKyAgICBGT25Qcm9ncmVzczogVE5vdGlmeUV2ZW50OworICAgIEZaUmVjOiBUWlN0cmVhbVJlYzsKKyAgICBGQnVmZmVyOiBhcnJheSBbV29yZF0gb2YgQ2hhcjsKKyAgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIFByb2dyZXNzKFNlbmRlcjogVE9iamVjdCk7IGR5bmFtaWM7CisgICAgcHJvcGVydHkgT25Qcm9ncmVzczogVE5vdGlmeUV2ZW50IHJlYWQgRk9uUHJvZ3Jlc3Mgd3JpdGUgRk9uUHJvZ3Jlc3M7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKFN0cm06IFRTdHJlYW0pOworICBlbmQ7CisKK3sgVENvbXByZXNzaW9uU3RyZWFtIGNvbXByZXNzZXMgZGF0YSBvbiB0aGUgZmx5IGFzIGRhdGEgaXMgd3JpdHRlbiB0byBpdCwgYW5kCisgIHN0b3JlcyB0aGUgY29tcHJlc3NlZCBkYXRhIHRvIGFub3RoZXIgc3RyZWFtLgorCisgIFRDb21wcmVzc2lvblN0cmVhbSBpcyB3cml0ZS1vbmx5IGFuZCBzdHJpY3RseSBzZXF1ZW50aWFsLiBSZWFkaW5nIGZyb20gdGhlCisgIHN0cmVhbSB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbi4gVXNpbmcgU2VlayB0byBtb3ZlIHRoZSBzdHJlYW0gcG9pbnRlcgorICB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbi4KKworICBPdXRwdXQgZGF0YSBpcyBjYWNoZWQgaW50ZXJuYWxseSwgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHN0cmVhbSBvbmx5IHdoZW4KKyAgdGhlIGludGVybmFsIG91dHB1dCBidWZmZXIgaXMgZnVsbC4gIEFsbCBwZW5kaW5nIG91dHB1dCBkYXRhIGlzIGZsdXNoZWQKKyAgd2hlbiB0aGUgc3RyZWFtIGlzIGRlc3Ryb3llZC4KKworICBUaGUgUG9zaXRpb24gcHJvcGVydHkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBvZgorICBkYXRhIHRoYXQgaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbSBzbyBmYXIuCisKKyAgQ29tcHJlc3Npb25SYXRlIHJldHVybnMgdGhlIG9uLXRoZS1mbHkgcGVyY2VudGFnZSBieSB3aGljaCB0aGUgb3JpZ2luYWwKKyAgZGF0YSBoYXMgYmVlbiBjb21wcmVzc2VkOiAgKDEgLSAoQ29tcHJlc3NlZEJ5dGVzIC8gVW5jb21wcmVzc2VkQnl0ZXMpKSAqIDEwMAorICBJZiByYXcgZGF0YSBzaXplID0gMTAwIGFuZCBjb21wcmVzc2VkIGRhdGEgc2l6ZSA9IDI1LCB0aGUgQ29tcHJlc3Npb25SYXRlCisgIGlzIDc1JQorCisgIFRoZSBPblByb2dyZXNzIGV2ZW50IGlzIGNhbGxlZCBlYWNoIHRpbWUgdGhlIG91dHB1dCBidWZmZXIgaXMgZmlsbGVkIGFuZAorICB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc3RyZWFtLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHVwZGF0aW5nIGEgcHJvZ3Jlc3MKKyAgaW5kaWNhdG9yIHdoZW4geW91IGFyZSB3cml0aW5nIGEgbGFyZ2UgY2h1bmsgb2YgZGF0YSB0byB0aGUgY29tcHJlc3Npb24KKyAgc3RyZWFtIGluIGEgc2luZ2xlIGNhbGwufQorCisKKyAgVENvbXByZXNzaW9uTGV2ZWwgPSAoY2xOb25lLCBjbEZhc3Rlc3QsIGNsRGVmYXVsdCwgY2xNYXgpOworCisgIFRDb21wcmVzc2lvblN0cmVhbSA9IGNsYXNzKFRDdXN0b21abGliU3RyZWFtKQorICBwcml2YXRlCisgICAgZnVuY3Rpb24gR2V0Q29tcHJlc3Npb25SYXRlOiBTaW5nbGU7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShDb21wcmVzc2lvbkxldmVsOiBUQ29tcHJlc3Npb25MZXZlbDsgRGVzdDogVFN0cmVhbSk7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkKHZhciBCdWZmZXI7IENvdW50OiBMb25naW50KTogTG9uZ2ludDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gV3JpdGUoY29uc3QgQnVmZmVyOyBDb3VudDogTG9uZ2ludCk6IExvbmdpbnQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFNlZWsoT2Zmc2V0OiBMb25naW50OyBPcmlnaW46IFdvcmQpOiBMb25naW50OyBvdmVycmlkZTsKKyAgICBwcm9wZXJ0eSBDb21wcmVzc2lvblJhdGU6IFNpbmdsZSByZWFkIEdldENvbXByZXNzaW9uUmF0ZTsKKyAgICBwcm9wZXJ0eSBPblByb2dyZXNzOworICBlbmQ7CisKK3sgVERlY29tcHJlc3Npb25TdHJlYW0gZGVjb21wcmVzc2VzIGRhdGEgb24gdGhlIGZseSBhcyBkYXRhIGlzIHJlYWQgZnJvbSBpdC4KKworICBDb21wcmVzc2VkIGRhdGEgY29tZXMgZnJvbSBhIHNlcGFyYXRlIHNvdXJjZSBzdHJlYW0uICBURGVjb21wcmVzc2lvblN0cmVhbQorICBpcyByZWFkLW9ubHkgYW5kIHVuaWRpcmVjdGlvbmFsOyB5b3UgY2FuIHNlZWsgZm9yd2FyZCBpbiB0aGUgc3RyZWFtLCBidXQgbm90CisgIGJhY2t3YXJkcy4gIFRoZSBzcGVjaWFsIGNhc2Ugb2Ygc2V0dGluZyB0aGUgc3RyZWFtIHBvc2l0aW9uIHRvIHplcm8gaXMKKyAgYWxsb3dlZC4gIFNlZWtpbmcgZm9yd2FyZCBkZWNvbXByZXNzZXMgZGF0YSB1bnRpbCB0aGUgcmVxdWVzdGVkIHBvc2l0aW9uIGluCisgIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBoYXMgYmVlbiByZWFjaGVkLiAgU2Vla2luZyBiYWNrd2FyZHMsIHNlZWtpbmcgcmVsYXRpdmUKKyAgdG8gdGhlIGVuZCBvZiB0aGUgc3RyZWFtLCByZXF1ZXN0aW5nIHRoZSBzaXplIG9mIHRoZSBzdHJlYW0sIGFuZCB3cml0aW5nIHRvCisgIHRoZSBzdHJlYW0gd2lsbCByYWlzZSBhbiBleGNlcHRpb24uCisKKyAgVGhlIFBvc2l0aW9uIHByb3BlcnR5IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBvZiB1bmNvbXByZXNzZWQgZGF0YSB0aGF0CisgIGhhdmUgYmVlbiByZWFkIGZyb20gdGhlIHN0cmVhbSBzbyBmYXIuCisKKyAgVGhlIE9uUHJvZ3Jlc3MgZXZlbnQgaXMgY2FsbGVkIGVhY2ggdGltZSB0aGUgaW50ZXJuYWwgaW5wdXQgYnVmZmVyIG9mCisgIGNvbXByZXNzZWQgZGF0YSBpcyBleGhhdXN0ZWQgYW5kIHRoZSBuZXh0IGJsb2NrIGlzIHJlYWQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLgorICBUaGlzIGlzIHVzZWZ1bCBmb3IgdXBkYXRpbmcgYSBwcm9ncmVzcyBpbmRpY2F0b3Igd2hlbiB5b3UgYXJlIHJlYWRpbmcgYQorICBsYXJnZSBjaHVuayBvZiBkYXRhIGZyb20gdGhlIGRlY29tcHJlc3Npb24gc3RyZWFtIGluIGEgc2luZ2xlIGNhbGwufQorCisgIFREZWNvbXByZXNzaW9uU3RyZWFtID0gY2xhc3MoVEN1c3RvbVpsaWJTdHJlYW0pCisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShTb3VyY2U6IFRTdHJlYW0pOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZCh2YXIgQnVmZmVyOyBDb3VudDogTG9uZ2ludCk6IExvbmdpbnQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFdyaXRlKGNvbnN0IEJ1ZmZlcjsgQ291bnQ6IExvbmdpbnQpOiBMb25naW50OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBTZWVrKE9mZnNldDogTG9uZ2ludDsgT3JpZ2luOiBXb3JkKTogTG9uZ2ludDsgb3ZlcnJpZGU7CisgICAgcHJvcGVydHkgT25Qcm9ncmVzczsKKyAgZW5kOworCisKKworeyBDb21wcmVzc0J1ZiBjb21wcmVzc2VzIGRhdGEsIGJ1ZmZlciB0byBidWZmZXIsIGluIG9uZSBjYWxsLgorICAgSW46IEluQnVmID0gcHRyIHRvIGNvbXByZXNzZWQgZGF0YQorICAgICAgIEluQnl0ZXMgPSBudW1iZXIgb2YgYnl0ZXMgaW4gSW5CdWYKKyAgT3V0OiBPdXRCdWYgPSBwdHIgdG8gbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciBjb250YWluaW5nIGRlY29tcHJlc3NlZCBkYXRhCisgICAgICAgT3V0Qnl0ZXMgPSBudW1iZXIgb2YgYnl0ZXMgaW4gT3V0QnVmICAgfQorcHJvY2VkdXJlIENvbXByZXNzQnVmKGNvbnN0IEluQnVmOiBQb2ludGVyOyBJbkJ5dGVzOiBJbnRlZ2VyOworICAgICAgICAgICAgICAgICAgICAgIG91dCBPdXRCdWY6IFBvaW50ZXI7IG91dCBPdXRCeXRlczogSW50ZWdlcik7CisKKworeyBEZWNvbXByZXNzQnVmIGRlY29tcHJlc3NlcyBkYXRhLCBidWZmZXIgdG8gYnVmZmVyLCBpbiBvbmUgY2FsbC4KKyAgIEluOiBJbkJ1ZiA9IHB0ciB0byBjb21wcmVzc2VkIGRhdGEKKyAgICAgICBJbkJ5dGVzID0gbnVtYmVyIG9mIGJ5dGVzIGluIEluQnVmCisgICAgICAgT3V0RXN0aW1hdGUgPSB6ZXJvLCBvciBlc3QuIHNpemUgb2YgdGhlIGRlY29tcHJlc3NlZCBkYXRhCisgIE91dDogT3V0QnVmID0gcHRyIHRvIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgY29udGFpbmluZyBkZWNvbXByZXNzZWQgZGF0YQorICAgICAgIE91dEJ5dGVzID0gbnVtYmVyIG9mIGJ5dGVzIGluIE91dEJ1ZiAgIH0KK3Byb2NlZHVyZSBEZWNvbXByZXNzQnVmKGNvbnN0IEluQnVmOiBQb2ludGVyOyBJbkJ5dGVzOiBJbnRlZ2VyOworIE91dEVzdGltYXRlOiBJbnRlZ2VyOyBvdXQgT3V0QnVmOiBQb2ludGVyOyBvdXQgT3V0Qnl0ZXM6IEludGVnZXIpOworCit7IERlY29tcHJlc3NUb1VzZXJCdWYgZGVjb21wcmVzc2VzIGRhdGEsIGJ1ZmZlciB0byBidWZmZXIsIGluIG9uZSBjYWxsLgorICAgSW46IEluQnVmID0gcHRyIHRvIGNvbXByZXNzZWQgZGF0YQorICAgICAgIEluQnl0ZXMgPSBudW1iZXIgb2YgYnl0ZXMgaW4gSW5CdWYKKyAgT3V0OiBPdXRCdWYgPSBwdHIgdG8gdXNlci1hbGxvY2F0ZWQgYnVmZmVyIHRvIGNvbnRhaW4gZGVjb21wcmVzc2VkIGRhdGEKKyAgICAgICBCdWZTaXplID0gbnVtYmVyIG9mIGJ5dGVzIGluIE91dEJ1ZiAgIH0KK3Byb2NlZHVyZSBEZWNvbXByZXNzVG9Vc2VyQnVmKGNvbnN0IEluQnVmOiBQb2ludGVyOyBJbkJ5dGVzOiBJbnRlZ2VyOworICBjb25zdCBPdXRCdWY6IFBvaW50ZXI7IEJ1ZlNpemU6IEludGVnZXIpOworCitjb25zdAorICB6bGliX3ZlcnNpb24gPSAnMS4yLjgnOworCit0eXBlCisgIEVabGliRXJyb3IgPSBjbGFzcyhFeGNlcHRpb24pOworICBFQ29tcHJlc3Npb25FcnJvciA9IGNsYXNzKEVabGliRXJyb3IpOworICBFRGVjb21wcmVzc2lvbkVycm9yID0gY2xhc3MoRVpsaWJFcnJvcik7CisKK2ltcGxlbWVudGF0aW9uCisKK3VzZXMgWkxpYkNvbnN0OworCitjb25zdAorICBaX05PX0ZMVVNIICAgICAgPSAwOworICBaX1BBUlRJQUxfRkxVU0ggPSAxOworICBaX1NZTkNfRkxVU0ggICAgPSAyOworICBaX0ZVTExfRkxVU0ggICAgPSAzOworICBaX0ZJTklTSCAgICAgICAgPSA0OworCisgIFpfT0sgICAgICAgICAgICA9IDA7CisgIFpfU1RSRUFNX0VORCAgICA9IDE7CisgIFpfTkVFRF9ESUNUICAgICA9IDI7CisgIFpfRVJSTk8gICAgICAgICA9ICgtMSk7CisgIFpfU1RSRUFNX0VSUk9SICA9ICgtMik7CisgIFpfREFUQV9FUlJPUiAgICA9ICgtMyk7CisgIFpfTUVNX0VSUk9SICAgICA9ICgtNCk7CisgIFpfQlVGX0VSUk9SICAgICA9ICgtNSk7CisgIFpfVkVSU0lPTl9FUlJPUiA9ICgtNik7CisKKyAgWl9OT19DT01QUkVTU0lPTiAgICAgICA9ICAgMDsKKyAgWl9CRVNUX1NQRUVEICAgICAgICAgICA9ICAgMTsKKyAgWl9CRVNUX0NPTVBSRVNTSU9OICAgICA9ICAgOTsKKyAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OICA9ICgtMSk7CisKKyAgWl9GSUxURVJFRCAgICAgICAgICAgID0gMTsKKyAgWl9IVUZGTUFOX09OTFkgICAgICAgID0gMjsKKyAgWl9STEUgICAgICAgICAgICAgICAgID0gMzsKKyAgWl9ERUZBVUxUX1NUUkFURUdZICAgID0gMDsKKworICBaX0JJTkFSWSAgID0gMDsKKyAgWl9BU0NJSSAgICA9IDE7CisgIFpfVU5LTk9XTiAgPSAyOworCisgIFpfREVGTEFURUQgPSA4OworCisKK3skTCBhZGxlcjMyLm9ian0KK3skTCBjb21wcmVzcy5vYmp9Cit7JEwgY3JjMzIub2JqfQoreyRMIGRlZmxhdGUub2JqfQoreyRMIGluZmJhY2sub2JqfQoreyRMIGluZmZhc3Qub2JqfQoreyRMIGluZmxhdGUub2JqfQoreyRMIGluZnRyZWVzLm9ian0KK3skTCB0cmVlcy5vYmp9Cit7JEwgdW5jb21wci5vYmp9Cit7JEwgenV0aWwub2JqfQorCitwcm9jZWR1cmUgYWRsZXIzMjsgZXh0ZXJuYWw7Citwcm9jZWR1cmUgY29tcHJlc3NCb3VuZDsgZXh0ZXJuYWw7Citwcm9jZWR1cmUgY3JjMzI7IGV4dGVybmFsOworcHJvY2VkdXJlIGRlZmxhdGVJbml0Ml87IGV4dGVybmFsOworcHJvY2VkdXJlIGRlZmxhdGVQYXJhbXM7IGV4dGVybmFsOworCitmdW5jdGlvbiBfbWFsbG9jKFNpemU6IEludGVnZXIpOiBQb2ludGVyOyBjZGVjbDsKK2JlZ2luCisgIFJlc3VsdCA6PSBBbGxvY01lbShTaXplKTsKK2VuZDsKKworcHJvY2VkdXJlIF9mcmVlKEJsb2NrOiBQb2ludGVyKTsgY2RlY2w7CitiZWdpbgorICBGcmVlTWVtKEJsb2NrKTsKK2VuZDsKKworcHJvY2VkdXJlIF9tZW1zZXQoUDogUG9pbnRlcjsgQjogQnl0ZTsgY291bnQ6IEludGVnZXIpOyBjZGVjbDsKK2JlZ2luCisgIEZpbGxDaGFyKFBeLCBjb3VudCwgQik7CitlbmQ7CisKK3Byb2NlZHVyZSBfbWVtY3B5KGRlc3QsIHNvdXJjZTogUG9pbnRlcjsgY291bnQ6IEludGVnZXIpOyBjZGVjbDsKK2JlZ2luCisgIE1vdmUoc291cmNlXiwgZGVzdF4sIGNvdW50KTsKK2VuZDsKKworCisKKy8vIGRlZmxhdGUgY29tcHJlc3NlcyBkYXRhCitmdW5jdGlvbiBkZWZsYXRlSW5pdF8odmFyIHN0cm06IFRaU3RyZWFtUmVjOyBsZXZlbDogSW50ZWdlcjsgdmVyc2lvbjogUENoYXI7CisgIHJlY3NpemU6IEludGVnZXIpOiBJbnRlZ2VyOyBleHRlcm5hbDsKK2Z1bmN0aW9uIGRlZmxhdGUodmFyIHN0cm06IFRaU3RyZWFtUmVjOyBmbHVzaDogSW50ZWdlcik6IEludGVnZXI7IGV4dGVybmFsOworZnVuY3Rpb24gZGVmbGF0ZUVuZCh2YXIgc3RybTogVFpTdHJlYW1SZWMpOiBJbnRlZ2VyOyBleHRlcm5hbDsKKworLy8gaW5mbGF0ZSBkZWNvbXByZXNzZXMgZGF0YQorZnVuY3Rpb24gaW5mbGF0ZUluaXRfKHZhciBzdHJtOiBUWlN0cmVhbVJlYzsgdmVyc2lvbjogUENoYXI7CisgIHJlY3NpemU6IEludGVnZXIpOiBJbnRlZ2VyOyBleHRlcm5hbDsKK2Z1bmN0aW9uIGluZmxhdGUodmFyIHN0cm06IFRaU3RyZWFtUmVjOyBmbHVzaDogSW50ZWdlcik6IEludGVnZXI7IGV4dGVybmFsOworZnVuY3Rpb24gaW5mbGF0ZUVuZCh2YXIgc3RybTogVFpTdHJlYW1SZWMpOiBJbnRlZ2VyOyBleHRlcm5hbDsKK2Z1bmN0aW9uIGluZmxhdGVSZXNldCh2YXIgc3RybTogVFpTdHJlYW1SZWMpOiBJbnRlZ2VyOyBleHRlcm5hbDsKKworCitmdW5jdGlvbiB6bGliQWxsb2NNZW0oQXBwRGF0YTogUG9pbnRlcjsgSXRlbXMsIFNpemU6IEludGVnZXIpOiBQb2ludGVyOyBjZGVjbDsKK2JlZ2luCisvLyAgR2V0TWVtKFJlc3VsdCwgSXRlbXMqU2l6ZSk7CisgIFJlc3VsdCA6PSBBbGxvY01lbShJdGVtcyAqIFNpemUpOworZW5kOworCitwcm9jZWR1cmUgemxpYkZyZWVNZW0oQXBwRGF0YSwgQmxvY2s6IFBvaW50ZXIpOyBjZGVjbDsKK2JlZ2luCisgIEZyZWVNZW0oQmxvY2spOworZW5kOworCit7ZnVuY3Rpb24gemxpYkNoZWNrKGNvZGU6IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IGNvZGU7CisgIGlmIGNvZGUgPCAwIHRoZW4KKyAgICByYWlzZSBFWmxpYkVycm9yLkNyZWF0ZSgnZXJyb3InKTsgICAgLy8hIQorZW5kO30KKworZnVuY3Rpb24gQ0NoZWNrKGNvZGU6IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IGNvZGU7CisgIGlmIGNvZGUgPCAwIHRoZW4KKyAgICByYWlzZSBFQ29tcHJlc3Npb25FcnJvci5DcmVhdGUoJ2Vycm9yJyk7IC8vISEKK2VuZDsKKworZnVuY3Rpb24gRENoZWNrKGNvZGU6IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IGNvZGU7CisgIGlmIGNvZGUgPCAwIHRoZW4KKyAgICByYWlzZSBFRGVjb21wcmVzc2lvbkVycm9yLkNyZWF0ZSgnZXJyb3InKTsgIC8vISEKK2VuZDsKKworcHJvY2VkdXJlIENvbXByZXNzQnVmKGNvbnN0IEluQnVmOiBQb2ludGVyOyBJbkJ5dGVzOiBJbnRlZ2VyOworICAgICAgICAgICAgICAgICAgICAgIG91dCBPdXRCdWY6IFBvaW50ZXI7IG91dCBPdXRCeXRlczogSW50ZWdlcik7Cit2YXIKKyAgc3RybTogVFpTdHJlYW1SZWM7CisgIFA6IFBvaW50ZXI7CitiZWdpbgorICBGaWxsQ2hhcihzdHJtLCBzaXplb2Yoc3RybSksIDApOworICBzdHJtLnphbGxvYyA6PSB6bGliQWxsb2NNZW07CisgIHN0cm0uemZyZWUgOj0gemxpYkZyZWVNZW07CisgIE91dEJ5dGVzIDo9ICgoSW5CeXRlcyArIChJbkJ5dGVzIGRpdiAxMCkgKyAxMikgKyAyNTUpIGFuZCBub3QgMjU1OworICBHZXRNZW0oT3V0QnVmLCBPdXRCeXRlcyk7CisgIHRyeQorICAgIHN0cm0ubmV4dF9pbiA6PSBJbkJ1ZjsKKyAgICBzdHJtLmF2YWlsX2luIDo9IEluQnl0ZXM7CisgICAgc3RybS5uZXh0X291dCA6PSBPdXRCdWY7CisgICAgc3RybS5hdmFpbF9vdXQgOj0gT3V0Qnl0ZXM7CisgICAgQ0NoZWNrKGRlZmxhdGVJbml0XyhzdHJtLCBaX0JFU1RfQ09NUFJFU1NJT04sIHpsaWJfdmVyc2lvbiwgc2l6ZW9mKHN0cm0pKSk7CisgICAgdHJ5CisgICAgICB3aGlsZSBDQ2hlY2soZGVmbGF0ZShzdHJtLCBaX0ZJTklTSCkpIDw+IFpfU1RSRUFNX0VORCBkbworICAgICAgYmVnaW4KKyAgICAgICAgUCA6PSBPdXRCdWY7CisgICAgICAgIEluYyhPdXRCeXRlcywgMjU2KTsKKyAgICAgICAgUmVhbGxvY01lbShPdXRCdWYsIE91dEJ5dGVzKTsKKyAgICAgICAgc3RybS5uZXh0X291dCA6PSBQQ2hhcihJbnRlZ2VyKE91dEJ1ZikgKyAoSW50ZWdlcihzdHJtLm5leHRfb3V0KSAtIEludGVnZXIoUCkpKTsKKyAgICAgICAgc3RybS5hdmFpbF9vdXQgOj0gMjU2OworICAgICAgZW5kOworICAgIGZpbmFsbHkKKyAgICAgIENDaGVjayhkZWZsYXRlRW5kKHN0cm0pKTsKKyAgICBlbmQ7CisgICAgUmVhbGxvY01lbShPdXRCdWYsIHN0cm0udG90YWxfb3V0KTsKKyAgICBPdXRCeXRlcyA6PSBzdHJtLnRvdGFsX291dDsKKyAgZXhjZXB0CisgICAgRnJlZU1lbShPdXRCdWYpOworICAgIHJhaXNlCisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgRGVjb21wcmVzc0J1Zihjb25zdCBJbkJ1ZjogUG9pbnRlcjsgSW5CeXRlczogSW50ZWdlcjsKKyAgT3V0RXN0aW1hdGU6IEludGVnZXI7IG91dCBPdXRCdWY6IFBvaW50ZXI7IG91dCBPdXRCeXRlczogSW50ZWdlcik7Cit2YXIKKyAgc3RybTogVFpTdHJlYW1SZWM7CisgIFA6IFBvaW50ZXI7CisgIEJ1ZkluYzogSW50ZWdlcjsKK2JlZ2luCisgIEZpbGxDaGFyKHN0cm0sIHNpemVvZihzdHJtKSwgMCk7CisgIHN0cm0uemFsbG9jIDo9IHpsaWJBbGxvY01lbTsKKyAgc3RybS56ZnJlZSA6PSB6bGliRnJlZU1lbTsKKyAgQnVmSW5jIDo9IChJbkJ5dGVzICsgMjU1KSBhbmQgbm90IDI1NTsKKyAgaWYgT3V0RXN0aW1hdGUgPSAwIHRoZW4KKyAgICBPdXRCeXRlcyA6PSBCdWZJbmMKKyAgZWxzZQorICAgIE91dEJ5dGVzIDo9IE91dEVzdGltYXRlOworICBHZXRNZW0oT3V0QnVmLCBPdXRCeXRlcyk7CisgIHRyeQorICAgIHN0cm0ubmV4dF9pbiA6PSBJbkJ1ZjsKKyAgICBzdHJtLmF2YWlsX2luIDo9IEluQnl0ZXM7CisgICAgc3RybS5uZXh0X291dCA6PSBPdXRCdWY7CisgICAgc3RybS5hdmFpbF9vdXQgOj0gT3V0Qnl0ZXM7CisgICAgRENoZWNrKGluZmxhdGVJbml0XyhzdHJtLCB6bGliX3ZlcnNpb24sIHNpemVvZihzdHJtKSkpOworICAgIHRyeQorICAgICAgd2hpbGUgRENoZWNrKGluZmxhdGUoc3RybSwgWl9OT19GTFVTSCkpIDw+IFpfU1RSRUFNX0VORCBkbworICAgICAgYmVnaW4KKyAgICAgICAgUCA6PSBPdXRCdWY7CisgICAgICAgIEluYyhPdXRCeXRlcywgQnVmSW5jKTsKKyAgICAgICAgUmVhbGxvY01lbShPdXRCdWYsIE91dEJ5dGVzKTsKKyAgICAgICAgc3RybS5uZXh0X291dCA6PSBQQ2hhcihJbnRlZ2VyKE91dEJ1ZikgKyAoSW50ZWdlcihzdHJtLm5leHRfb3V0KSAtIEludGVnZXIoUCkpKTsKKyAgICAgICAgc3RybS5hdmFpbF9vdXQgOj0gQnVmSW5jOworICAgICAgZW5kOworICAgIGZpbmFsbHkKKyAgICAgIERDaGVjayhpbmZsYXRlRW5kKHN0cm0pKTsKKyAgICBlbmQ7CisgICAgUmVhbGxvY01lbShPdXRCdWYsIHN0cm0udG90YWxfb3V0KTsKKyAgICBPdXRCeXRlcyA6PSBzdHJtLnRvdGFsX291dDsKKyAgZXhjZXB0CisgICAgRnJlZU1lbShPdXRCdWYpOworICAgIHJhaXNlCisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIERlY29tcHJlc3NUb1VzZXJCdWYoY29uc3QgSW5CdWY6IFBvaW50ZXI7IEluQnl0ZXM6IEludGVnZXI7CisgIGNvbnN0IE91dEJ1ZjogUG9pbnRlcjsgQnVmU2l6ZTogSW50ZWdlcik7Cit2YXIKKyAgc3RybTogVFpTdHJlYW1SZWM7CitiZWdpbgorICBGaWxsQ2hhcihzdHJtLCBzaXplb2Yoc3RybSksIDApOworICBzdHJtLnphbGxvYyA6PSB6bGliQWxsb2NNZW07CisgIHN0cm0uemZyZWUgOj0gemxpYkZyZWVNZW07CisgIHN0cm0ubmV4dF9pbiA6PSBJbkJ1ZjsKKyAgc3RybS5hdmFpbF9pbiA6PSBJbkJ5dGVzOworICBzdHJtLm5leHRfb3V0IDo9IE91dEJ1ZjsKKyAgc3RybS5hdmFpbF9vdXQgOj0gQnVmU2l6ZTsKKyAgRENoZWNrKGluZmxhdGVJbml0XyhzdHJtLCB6bGliX3ZlcnNpb24sIHNpemVvZihzdHJtKSkpOworICB0cnkKKyAgICBpZiBEQ2hlY2soaW5mbGF0ZShzdHJtLCBaX0ZJTklTSCkpIDw+IFpfU1RSRUFNX0VORCB0aGVuCisgICAgICByYWlzZSBFWmxpYkVycm9yLkNyZWF0ZVJlcyhAc1RhcmdldEJ1ZmZlclRvb1NtYWxsKTsKKyAgZmluYWxseQorICAgIERDaGVjayhpbmZsYXRlRW5kKHN0cm0pKTsKKyAgZW5kOworZW5kOworCisvLyBUQ3VzdG9tWmxpYlN0cmVhbQorCitjb25zdHJ1Y3RvciBUQ3VzdG9tWkxpYlN0cmVhbS5DcmVhdGUoU3RybTogVFN0cmVhbSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGU3RybSA6PSBTdHJtOworICBGU3RybVBvcyA6PSBTdHJtLlBvc2l0aW9uOworICBGWlJlYy56YWxsb2MgOj0gemxpYkFsbG9jTWVtOworICBGWlJlYy56ZnJlZSA6PSB6bGliRnJlZU1lbTsKK2VuZDsKKworcHJvY2VkdXJlIFRDdXN0b21aTGliU3RyZWFtLlByb2dyZXNzKFNlbmRlcjogVE9iamVjdCk7CitiZWdpbgorICBpZiBBc3NpZ25lZChGT25Qcm9ncmVzcykgdGhlbiBGT25Qcm9ncmVzcyhTZW5kZXIpOworZW5kOworCisKKy8vIFRDb21wcmVzc2lvblN0cmVhbQorCitjb25zdHJ1Y3RvciBUQ29tcHJlc3Npb25TdHJlYW0uQ3JlYXRlKENvbXByZXNzaW9uTGV2ZWw6IFRDb21wcmVzc2lvbkxldmVsOworICBEZXN0OiBUU3RyZWFtKTsKK2NvbnN0CisgIExldmVsczogYXJyYXkgW1RDb21wcmVzc2lvbkxldmVsXSBvZiBTaG9ydEludCA9CisgICAgKFpfTk9fQ09NUFJFU1NJT04sIFpfQkVTVF9TUEVFRCwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OLCBaX0JFU1RfQ09NUFJFU1NJT04pOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShEZXN0KTsKKyAgRlpSZWMubmV4dF9vdXQgOj0gRkJ1ZmZlcjsKKyAgRlpSZWMuYXZhaWxfb3V0IDo9IHNpemVvZihGQnVmZmVyKTsKKyAgQ0NoZWNrKGRlZmxhdGVJbml0XyhGWlJlYywgTGV2ZWxzW0NvbXByZXNzaW9uTGV2ZWxdLCB6bGliX3ZlcnNpb24sIHNpemVvZihGWlJlYykpKTsKK2VuZDsKKworZGVzdHJ1Y3RvciBUQ29tcHJlc3Npb25TdHJlYW0uRGVzdHJveTsKK2JlZ2luCisgIEZaUmVjLm5leHRfaW4gOj0gbmlsOworICBGWlJlYy5hdmFpbF9pbiA6PSAwOworICB0cnkKKyAgICBpZiBGU3RybS5Qb3NpdGlvbiA8PiBGU3RybVBvcyB0aGVuIEZTdHJtLlBvc2l0aW9uIDo9IEZTdHJtUG9zOworICAgIHdoaWxlIChDQ2hlY2soZGVmbGF0ZShGWlJlYywgWl9GSU5JU0gpKSA8PiBaX1NUUkVBTV9FTkQpCisgICAgICBhbmQgKEZaUmVjLmF2YWlsX291dCA9IDApIGRvCisgICAgYmVnaW4KKyAgICAgIEZTdHJtLldyaXRlQnVmZmVyKEZCdWZmZXIsIHNpemVvZihGQnVmZmVyKSk7CisgICAgICBGWlJlYy5uZXh0X291dCA6PSBGQnVmZmVyOworICAgICAgRlpSZWMuYXZhaWxfb3V0IDo9IHNpemVvZihGQnVmZmVyKTsKKyAgICBlbmQ7CisgICAgaWYgRlpSZWMuYXZhaWxfb3V0IDwgc2l6ZW9mKEZCdWZmZXIpIHRoZW4KKyAgICAgIEZTdHJtLldyaXRlQnVmZmVyKEZCdWZmZXIsIHNpemVvZihGQnVmZmVyKSAtIEZaUmVjLmF2YWlsX291dCk7CisgIGZpbmFsbHkKKyAgICBkZWZsYXRlRW5kKEZaUmVjKTsKKyAgZW5kOworICBpbmhlcml0ZWQgRGVzdHJveTsKK2VuZDsKKworZnVuY3Rpb24gVENvbXByZXNzaW9uU3RyZWFtLlJlYWQodmFyIEJ1ZmZlcjsgQ291bnQ6IExvbmdpbnQpOiBMb25naW50OworYmVnaW4KKyAgcmFpc2UgRUNvbXByZXNzaW9uRXJyb3IuQ3JlYXRlUmVzKEBzSW52YWxpZFN0cmVhbU9wKTsKK2VuZDsKKworZnVuY3Rpb24gVENvbXByZXNzaW9uU3RyZWFtLldyaXRlKGNvbnN0IEJ1ZmZlcjsgQ291bnQ6IExvbmdpbnQpOiBMb25naW50OworYmVnaW4KKyAgRlpSZWMubmV4dF9pbiA6PSBAQnVmZmVyOworICBGWlJlYy5hdmFpbF9pbiA6PSBDb3VudDsKKyAgaWYgRlN0cm0uUG9zaXRpb24gPD4gRlN0cm1Qb3MgdGhlbiBGU3RybS5Qb3NpdGlvbiA6PSBGU3RybVBvczsKKyAgd2hpbGUgKEZaUmVjLmF2YWlsX2luID4gMCkgZG8KKyAgYmVnaW4KKyAgICBDQ2hlY2soZGVmbGF0ZShGWlJlYywgMCkpOworICAgIGlmIEZaUmVjLmF2YWlsX291dCA9IDAgdGhlbgorICAgIGJlZ2luCisgICAgICBGU3RybS5Xcml0ZUJ1ZmZlcihGQnVmZmVyLCBzaXplb2YoRkJ1ZmZlcikpOworICAgICAgRlpSZWMubmV4dF9vdXQgOj0gRkJ1ZmZlcjsKKyAgICAgIEZaUmVjLmF2YWlsX291dCA6PSBzaXplb2YoRkJ1ZmZlcik7CisgICAgICBGU3RybVBvcyA6PSBGU3RybS5Qb3NpdGlvbjsKKyAgICAgIFByb2dyZXNzKFNlbGYpOworICAgIGVuZDsKKyAgZW5kOworICBSZXN1bHQgOj0gQ291bnQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21wcmVzc2lvblN0cmVhbS5TZWVrKE9mZnNldDogTG9uZ2ludDsgT3JpZ2luOiBXb3JkKTogTG9uZ2ludDsKK2JlZ2luCisgIGlmIChPZmZzZXQgPSAwKSBhbmQgKE9yaWdpbiA9IHNvRnJvbUN1cnJlbnQpIHRoZW4KKyAgICBSZXN1bHQgOj0gRlpSZWMudG90YWxfaW4KKyAgZWxzZQorICAgIHJhaXNlIEVDb21wcmVzc2lvbkVycm9yLkNyZWF0ZVJlcyhAc0ludmFsaWRTdHJlYW1PcCk7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21wcmVzc2lvblN0cmVhbS5HZXRDb21wcmVzc2lvblJhdGU6IFNpbmdsZTsKK2JlZ2luCisgIGlmIEZaUmVjLnRvdGFsX2luID0gMCB0aGVuCisgICAgUmVzdWx0IDo9IDAKKyAgZWxzZQorICAgIFJlc3VsdCA6PSAoMS4wIC0gKEZaUmVjLnRvdGFsX291dCAvIEZaUmVjLnRvdGFsX2luKSkgKiAxMDAuMDsKK2VuZDsKKworCisvLyBURGVjb21wcmVzc2lvblN0cmVhbQorCitjb25zdHJ1Y3RvciBURGVjb21wcmVzc2lvblN0cmVhbS5DcmVhdGUoU291cmNlOiBUU3RyZWFtKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoU291cmNlKTsKKyAgRlpSZWMubmV4dF9pbiA6PSBGQnVmZmVyOworICBGWlJlYy5hdmFpbF9pbiA6PSAwOworICBEQ2hlY2soaW5mbGF0ZUluaXRfKEZaUmVjLCB6bGliX3ZlcnNpb24sIHNpemVvZihGWlJlYykpKTsKK2VuZDsKKworZGVzdHJ1Y3RvciBURGVjb21wcmVzc2lvblN0cmVhbS5EZXN0cm95OworYmVnaW4KKyAgRlN0cm0uU2VlaygtRlpSZWMuYXZhaWxfaW4sIDEpOworICBpbmZsYXRlRW5kKEZaUmVjKTsKKyAgaW5oZXJpdGVkIERlc3Ryb3k7CitlbmQ7CisKK2Z1bmN0aW9uIFREZWNvbXByZXNzaW9uU3RyZWFtLlJlYWQodmFyIEJ1ZmZlcjsgQ291bnQ6IExvbmdpbnQpOiBMb25naW50OworYmVnaW4KKyAgRlpSZWMubmV4dF9vdXQgOj0gQEJ1ZmZlcjsKKyAgRlpSZWMuYXZhaWxfb3V0IDo9IENvdW50OworICBpZiBGU3RybS5Qb3NpdGlvbiA8PiBGU3RybVBvcyB0aGVuIEZTdHJtLlBvc2l0aW9uIDo9IEZTdHJtUG9zOworICB3aGlsZSAoRlpSZWMuYXZhaWxfb3V0ID4gMCkgZG8KKyAgYmVnaW4KKyAgICBpZiBGWlJlYy5hdmFpbF9pbiA9IDAgdGhlbgorICAgIGJlZ2luCisgICAgICBGWlJlYy5hdmFpbF9pbiA6PSBGU3RybS5SZWFkKEZCdWZmZXIsIHNpemVvZihGQnVmZmVyKSk7CisgICAgICBpZiBGWlJlYy5hdmFpbF9pbiA9IDAgdGhlbgorICAgICAgYmVnaW4KKyAgICAgICAgUmVzdWx0IDo9IENvdW50IC0gRlpSZWMuYXZhaWxfb3V0OworICAgICAgICBFeGl0OworICAgICAgZW5kOworICAgICAgRlpSZWMubmV4dF9pbiA6PSBGQnVmZmVyOworICAgICAgRlN0cm1Qb3MgOj0gRlN0cm0uUG9zaXRpb247CisgICAgICBQcm9ncmVzcyhTZWxmKTsKKyAgICBlbmQ7CisgICAgQ0NoZWNrKGluZmxhdGUoRlpSZWMsIDApKTsKKyAgZW5kOworICBSZXN1bHQgOj0gQ291bnQ7CitlbmQ7CisKK2Z1bmN0aW9uIFREZWNvbXByZXNzaW9uU3RyZWFtLldyaXRlKGNvbnN0IEJ1ZmZlcjsgQ291bnQ6IExvbmdpbnQpOiBMb25naW50OworYmVnaW4KKyAgcmFpc2UgRURlY29tcHJlc3Npb25FcnJvci5DcmVhdGVSZXMoQHNJbnZhbGlkU3RyZWFtT3ApOworZW5kOworCitmdW5jdGlvbiBURGVjb21wcmVzc2lvblN0cmVhbS5TZWVrKE9mZnNldDogTG9uZ2ludDsgT3JpZ2luOiBXb3JkKTogTG9uZ2ludDsKK3ZhcgorICBJOiBJbnRlZ2VyOworICBCdWY6IGFycmF5IFswLi40MDk1XSBvZiBDaGFyOworYmVnaW4KKyAgaWYgKE9mZnNldCA9IDApIGFuZCAoT3JpZ2luID0gc29Gcm9tQmVnaW5uaW5nKSB0aGVuCisgIGJlZ2luCisgICAgRENoZWNrKGluZmxhdGVSZXNldChGWlJlYykpOworICAgIEZaUmVjLm5leHRfaW4gOj0gRkJ1ZmZlcjsKKyAgICBGWlJlYy5hdmFpbF9pbiA6PSAwOworICAgIEZTdHJtLlBvc2l0aW9uIDo9IDA7CisgICAgRlN0cm1Qb3MgOj0gMDsKKyAgZW5kCisgIGVsc2UgaWYgKCAoT2Zmc2V0ID49IDApIGFuZCAoT3JpZ2luID0gc29Gcm9tQ3VycmVudCkpIG9yCisgICAgICAgICAgKCAoKE9mZnNldCAtIEZaUmVjLnRvdGFsX291dCkgPiAwKSBhbmQgKE9yaWdpbiA9IHNvRnJvbUJlZ2lubmluZykpIHRoZW4KKyAgYmVnaW4KKyAgICBpZiBPcmlnaW4gPSBzb0Zyb21CZWdpbm5pbmcgdGhlbiBEZWMoT2Zmc2V0LCBGWlJlYy50b3RhbF9vdXQpOworICAgIGlmIE9mZnNldCA+IDAgdGhlbgorICAgIGJlZ2luCisgICAgICBmb3IgSSA6PSAxIHRvIE9mZnNldCBkaXYgc2l6ZW9mKEJ1ZikgZG8KKyAgICAgICAgUmVhZEJ1ZmZlcihCdWYsIHNpemVvZihCdWYpKTsKKyAgICAgIFJlYWRCdWZmZXIoQnVmLCBPZmZzZXQgbW9kIHNpemVvZihCdWYpKTsKKyAgICBlbmQ7CisgIGVuZAorICBlbHNlCisgICAgcmFpc2UgRURlY29tcHJlc3Npb25FcnJvci5DcmVhdGVSZXMoQHNJbnZhbGlkU3RyZWFtT3ApOworICBSZXN1bHQgOj0gRlpSZWMudG90YWxfb3V0OworZW5kOworCisKK2VuZC4KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvZGVscGhpL1pMaWJDb25zdC5wYXMgYi96bGliL3NyYy9jb250cmliL2RlbHBoaS9aTGliQ29uc3QucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZmUxMzYKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL2RlbHBoaS9aTGliQ29uc3QucGFzCkBAIC0wLDAgKzEsMTEgQEAKK3VuaXQgWkxpYkNvbnN0OworCitpbnRlcmZhY2UKKworcmVzb3VyY2VzdHJpbmcKKyAgc1RhcmdldEJ1ZmZlclRvb1NtYWxsID0gJ1pMaWIgZXJyb3I6IHRhcmdldCBidWZmZXIgbWF5IGJlIHRvbyBzbWFsbCc7CisgIHNJbnZhbGlkU3RyZWFtT3AgPSAnSW52YWxpZCBzdHJlYW0gb3BlcmF0aW9uJzsKKworaW1wbGVtZW50YXRpb24KKworZW5kLgpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9kZWxwaGkvcmVhZG1lLnR4dCBiL3psaWIvc3JjL2NvbnRyaWIvZGVscGhpL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjOWE4YgotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvZGVscGhpL3JlYWRtZS50eHQKQEAgLTAsMCArMSw3NiBAQAorCitPdmVydmlldworPT09PT09PT0KKworVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgYW4gdXBkYXRlIHRvIHRoZSBaTGliIGludGVyZmFjZSB1bml0LAorZGlzdHJpYnV0ZWQgYnkgQm9ybGFuZCBhcyBhIERlbHBoaSBzdXBwbGVtZW50YWwgY29tcG9uZW50LgorCitUaGUgb3JpZ2luYWwgWkxpYiB1bml0IGlzIENvcHlyaWdodCAoYykgMTk5Nyw5OSBCb3JsYW5kIENvcnAuLAorYW5kIGlzIGJhc2VkIG9uIHpsaWIgdmVyc2lvbiAxLjAuNC4gIFRoZXJlIGFyZSBhIHNlcmllcyBvZiBidWdzCithbmQgc2VjdXJpdHkgcHJvYmxlbXMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgb2xkIHpsaWIgdmVyc2lvbiwgYW5kCit3ZSByZWNvbW1lbmQgdGhlIHVzZXJzIHRvIHVwZGF0ZSB0aGVpciBaTGliIHVuaXQuCisKKworU3VtbWFyeSBvZiBtb2RpZmljYXRpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT0KKworLSBJbXByb3ZlZCBtYWtlZmlsZSwgYWRhcHRlZCB0byB6bGliIHZlcnNpb24gMS4yLjEuCisKKy0gU29tZSBmaWVsZCB0eXBlcyBmcm9tIFRaU3RyZWFtUmVjIGFyZSBjaGFuZ2VkIGZyb20gSW50ZWdlciB0bworICBMb25naW50LCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgemxpYi5oIGhlYWRlciwgYW5kIGZvciA2NC1iaXQKKyAgcmVhZGluZXNzLgorCistIFRoZSB6bGliX3ZlcnNpb24gY29uc3RhbnQgaXMgdXBkYXRlZC4KKworLSBUaGUgbmV3IFpfUkxFIHN0cmF0ZWd5IGhhcyBpdHMgY29ycmVzcG9uZGluZyBzeW1ib2xpYyBjb25zdGFudC4KKworLSBUaGUgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIGZ1bmN0aW9ucyBhbmQgZnVuY3Rpb24gdHlwZXMKKyAgKFRBbGxvYywgVEZyZWUsIHpsaWJBbGxvY01lbSBhbmQgemxpYkZyZWVNZW0pIGFyZSBub3cgY2RlY2wsCisgIGFuZCBfbWFsbG9jIGFuZCBfZnJlZSBhcmUgYWRkZWQgYXMgQyBSVEwgc3R1YnMuICBBcyBhIHJlc3VsdCwKKyAgdGhlIG9yaWdpbmFsIEMgc291cmNlcyBvZiB6bGliIGNhbiBiZSBjb21waWxlZCBvdXQgb2YgdGhlIGJveCwKKyAgYW5kIGxpbmtlZCB0byB0aGUgWkxpYiB1bml0LgorCisKK1N1Z2dlc3Rpb25zIGZvciBpbXByb3ZlbWVudHMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ3VycmVudGx5LCB0aGUgWkxpYiB1bml0IHByb3ZpZGVzIG9ubHkgYSBsaW1pdGVkIHdyYXBwZXIgYXJvdW5kCit0aGUgemxpYiBsaWJyYXJ5LCBhbmQgbXVjaCBvZiB0aGUgb3JpZ2luYWwgemxpYiBmdW5jdGlvbmFsaXR5IGlzCittaXNzaW5nLiAgSGFuZGxpbmcgY29tcHJlc3NlZCBmaWxlIGZvcm1hdHMgbGlrZSBaSVAvR1pJUCBvciBQTkcKK2Nhbm5vdCBiZSBpbXBsZW1lbnRlZCB3aXRob3V0IGhhdmluZyB0aGlzIGZ1bmN0aW9uYWxpdHkuCitBcHBsaWNhdGlvbnMgdGhhdCBoYW5kbGUgdGhlc2UgZm9ybWF0cyBhcmUgZWl0aGVyIHVzaW5nIHRoZWlyIG93biwKK2R1cGxpY2F0ZWQgY29kZSwgb3Igbm90IHVzaW5nIHRoZSBaTGliIHVuaXQgYXQgYWxsLgorCitIZXJlIGFyZSBhIGZldyBzdWdnZXN0aW9uczoKKworLSBDaGVja3N1bSBjbGFzcyB3cmFwcGVycyBhcm91bmQgYWRsZXIzMigpIGFuZCBjcmMzMigpLCBzaW1pbGFyCisgIHRvIHRoZSBKYXZhIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgdGhlIGphdmEudXRpbC56aXAuQ2hlY2tzdW0KKyAgaW50ZXJmYWNlLgorCistIFRoZSBhYmlsaXR5IHRvIHJlYWQgYW5kIHdyaXRlIHJhdyBkZWZsYXRlIHN0cmVhbXMsIHdpdGhvdXQgdGhlCisgIHpsaWIgc3RyZWFtIGhlYWRlciBhbmQgdHJhaWxlci4gIFJhdyBkZWZsYXRlIHN0cmVhbXMgYXJlIHVzZWQKKyAgaW4gdGhlIFpJUCBmaWxlIGZvcm1hdC4KKworLSBUaGUgYWJpbGl0eSB0byByZWFkIGFuZCB3cml0ZSBnemlwIHN0cmVhbXMsIHVzZWQgaW4gdGhlIEdaSVAKKyAgZmlsZSBmb3JtYXQsIGFuZCBub3JtYWxseSBwcm9kdWNlZCBieSB0aGUgZ3ppcCBwcm9ncmFtLgorCistIFRoZSBhYmlsaXR5IHRvIHNlbGVjdCBhIGRpZmZlcmVudCBjb21wcmVzc2lvbiBzdHJhdGVneSwgdXNlZnVsCisgIHRvIFBORyBhbmQgTU5HIGltYWdlIGNvbXByZXNzaW9uLCBhbmQgdG8gbXVsdGltZWRpYSBjb21wcmVzc2lvbgorICBpbiBnZW5lcmFsLiAgQmVzaWRlcyB0aGUgY29tcHJlc3Npb24gbGV2ZWwKKworICAgIFRDb21wcmVzc2lvbkxldmVsID0gKGNsTm9uZSwgY2xGYXN0ZXN0LCBjbERlZmF1bHQsIGNsTWF4KTsKKworICB3aGljaCwgaW4gZmFjdCwgY291bGQgaGF2ZSB1c2VkIHRoZSAneicgcHJlZml4IGFuZCBhdm9pZGVkCisgIFRDb2xvci1saWtlIHN5bWJvbHMKKworICAgIFRDb21wcmVzc2lvbkxldmVsID0gKHpjTm9uZSwgemNGYXN0ZXN0LCB6Y0RlZmF1bHQsIHpjTWF4KTsKKworICB0aGVyZSBjb3VsZCBiZSBhIGNvbXByZXNzaW9uIHN0cmF0ZWd5CisKKyAgICBUQ29tcHJlc3Npb25TdHJhdGVneSA9ICh6c0RlZmF1bHQsIHpzRmlsdGVyZWQsIHpzSHVmZm1hbk9ubHksIHpzUmxlKTsKKworLSBaSVAgYW5kIEdaSVAgc3RyZWFtIGhhbmRsaW5nIHZpYSBUU3RyZWFtcy4KKworCistLQorQ29zbWluIFRydXRhIDxjb3NtaW50QGNzLnViYmNsdWoucm8+CmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL2RlbHBoaS96bGliZDMyLm1hayBiL3psaWIvc3JjL2NvbnRyaWIvZGVscGhpL3psaWJkMzIubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYjAwYjcKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL2RlbHBoaS96bGliZDMyLm1hawpAQCAtMCwwICsxLDk5IEBACisjIE1ha2VmaWxlIGZvciB6bGliCisjIEZvciB1c2Ugd2l0aCBEZWxwaGkgYW5kIEMrKyBCdWlsZGVyIHVuZGVyIFdpbjMyCisjIFVwZGF0ZWQgZm9yIHpsaWIgMS4yLnggYnkgQ29zbWluIFRydXRhCisKKyMgLS0tLS0tLS0tLS0tIEJvcmxhbmQgQysrIC0tLS0tLS0tLS0tLQorCisjIFRoaXMgcHJvamVjdCB1c2VzIHRoZSBEZWxwaGkgKGZhc3RjYWxsL3JlZ2lzdGVyKSBjYWxsaW5nIGNvbnZlbnRpb246CitMT0MgPSAtRFpFWFBPUlQ9X19mYXN0Y2FsbCAtRFpFWFBPUlRWQT1fX2NkZWNsCisKK0NDID0gYmNjMzIKK0xEID0gYmNjMzIKK0FSID0gdGxpYgorIyBkbyBub3QgdXNlICItcHIiIGluIENGTEFHUworQ0ZMQUdTID0gLWEgLWQgLWstIC1PMiAkKExPQykKK0xERkxBR1MgPQorCisKKyMgdmFyaWFibGVzCitaTElCX0xJQiA9IHpsaWIubGliCisKK09CSjEgPSBhZGxlcjMyLm9iaiBjb21wcmVzcy5vYmogY3JjMzIub2JqIGRlZmxhdGUub2JqIGd6Y2xvc2Uub2JqIGd6bGliLm9iaiBnenJlYWQub2JqCitPQkoyID0gZ3p3cml0ZS5vYmogaW5mYmFjay5vYmogaW5mZmFzdC5vYmogaW5mbGF0ZS5vYmogaW5mdHJlZXMub2JqIHRyZWVzLm9iaiB1bmNvbXByLm9iaiB6dXRpbC5vYmoKK09CSlAxID0gK2FkbGVyMzIub2JqK2NvbXByZXNzLm9iaitjcmMzMi5vYmorZGVmbGF0ZS5vYmorZ3pjbG9zZS5vYmorZ3psaWIub2JqK2d6cmVhZC5vYmoKK09CSlAyID0gK2d6d3JpdGUub2JqK2luZmJhY2sub2JqK2luZmZhc3Qub2JqK2luZmxhdGUub2JqK2luZnRyZWVzLm9iait0cmVlcy5vYmordW5jb21wci5vYmorenV0aWwub2JqCisKKworIyB0YXJnZXRzCithbGw6ICQoWkxJQl9MSUIpIGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQorCisuYy5vYmo6CisJJChDQykgLWMgJChDRkxBR1MpICQqLmMKKworYWRsZXIzMi5vYmo6IGFkbGVyMzIuYyB6bGliLmggemNvbmYuaAorCitjb21wcmVzcy5vYmo6IGNvbXByZXNzLmMgemxpYi5oIHpjb25mLmgKKworY3JjMzIub2JqOiBjcmMzMi5jIHpsaWIuaCB6Y29uZi5oIGNyYzMyLmgKKworZGVmbGF0ZS5vYmo6IGRlZmxhdGUuYyBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAorCitnemNsb3NlLm9iajogZ3pjbG9zZS5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCisKK2d6bGliLm9iajogZ3psaWIuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAorCitnenJlYWQub2JqOiBnenJlYWQuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAorCitnendyaXRlLm9iajogZ3p3cml0ZS5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCisKK2luZmJhY2sub2JqOiBpbmZiYWNrLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCisgaW5mZmFzdC5oIGluZmZpeGVkLmgKKworaW5mZmFzdC5vYmo6IGluZmZhc3QuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKKyBpbmZmYXN0LmgKKworaW5mbGF0ZS5vYmo6IGluZmxhdGUuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKKyBpbmZmYXN0LmggaW5mZml4ZWQuaAorCitpbmZ0cmVlcy5vYmo6IGluZnRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCisKK3RyZWVzLm9iajogdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGRlZmxhdGUuaCB0cmVlcy5oCisKK3VuY29tcHIub2JqOiB1bmNvbXByLmMgemxpYi5oIHpjb25mLmgKKworenV0aWwub2JqOiB6dXRpbC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKKworZXhhbXBsZS5vYmo6IHRlc3QvZXhhbXBsZS5jIHpsaWIuaCB6Y29uZi5oCisKK21pbmlnemlwLm9iajogdGVzdC9taW5pZ3ppcC5jIHpsaWIuaCB6Y29uZi5oCisKKworIyBGb3IgdGhlIHNha2Ugb2YgdGhlIG9sZCBCb3JsYW5kIG1ha2UsCisjIHRoZSBjb21tYW5kIGxpbmUgaXMgY3V0IHRvIGZpdCBpbiB0aGUgTVMtRE9TIDEyOCBieXRlIGxpbWl0OgorJChaTElCX0xJQik6ICQoT0JKMSkgJChPQkoyKQorCS1kZWwgJChaTElCX0xJQikKKwkkKEFSKSAkKFpMSUJfTElCKSAkKE9CSlAxKQorCSQoQVIpICQoWkxJQl9MSUIpICQoT0JKUDIpCisKKworIyB0ZXN0aW5nCit0ZXN0OiBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKKwlleGFtcGxlCisJZWNobyBoZWxsbyB3b3JsZCB8IG1pbmlnemlwIHwgbWluaWd6aXAgLWQKKworZXhhbXBsZS5leGU6IGV4YW1wbGUub2JqICQoWkxJQl9MSUIpCisJJChMRCkgJChMREZMQUdTKSBleGFtcGxlLm9iaiAkKFpMSUJfTElCKQorCittaW5pZ3ppcC5leGU6IG1pbmlnemlwLm9iaiAkKFpMSUJfTElCKQorCSQoTEQpICQoTERGTEFHUykgbWluaWd6aXAub2JqICQoWkxJQl9MSUIpCisKKworIyBjbGVhbnVwCitjbGVhbjoKKwktZGVsICoub2JqCisJLWRlbCAqLmV4ZQorCS1kZWwgKi5saWIKKwktZGVsICoudGRzCisJLWRlbCB6bGliLmJhaworCS1kZWwgZm9vLmd6CisKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliLmJ1aWxkIGIvemxpYi9zcmMvY29udHJpYi9kb3R6bGliL0RvdFpMaWIuYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y5MGQ2YgotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliLmJ1aWxkCkBAIC0wLDAgKzEsMzMgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/Pg0KKzxwcm9qZWN0IG5hbWU9IkRvdFpMaWIiIGRlZmF1bHQ9ImJ1aWxkIiBiYXNlZGlyPSIuL0RvdFpMaWIiPg0KKwk8ZGVzY3JpcHRpb24+QSAuTmV0IHdyYXBwZXIgbGlicmFyeSBhcm91bmQgWkxpYjEuZGxsPC9kZXNjcmlwdGlvbj4NCisNCisJPHByb3BlcnR5IG5hbWU9Im51bml0LmxvY2F0aW9uIiB2YWx1ZT0iYzovcHJvZ3JhbSBmaWxlcy9OVW5pdCBWMi4xL2JpbiIgLz4NCisJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnJvb3QiIHZhbHVlPSJiaW4iIC8+DQorDQorCTxwcm9wZXJ0eSBuYW1lPSJkZWJ1ZyIgdmFsdWU9InRydWUiIC8+DQorCTxwcm9wZXJ0eSBuYW1lPSJudW5pdCIgdmFsdWU9InRydWUiIC8+DQorDQorCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5mb2xkZXIiIHZhbHVlPSIke2J1aWxkLnJvb3R9L2RlYnVnLyIgaWY9IiR7ZGVidWd9IiAvPg0KKwk8cHJvcGVydHkgbmFtZT0iYnVpbGQuZm9sZGVyIiB2YWx1ZT0iJHtidWlsZC5yb290fS9yZWxlYXNlLyIgdW5sZXNzPSIke2RlYnVnfSIgLz4NCisNCisJPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249IlJlbW92ZSBhbGwgZ2VuZXJhdGVkIGZpbGVzIj4NCisJCTxkZWxldGUgZGlyPSIke2J1aWxkLnJvb3R9IiBmYWlsb25lcnJvcj0iZmFsc2UiIC8+DQorCTwvdGFyZ2V0Pg0KKw0KKwk8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXNjcmlwdGlvbj0iY29tcGlsZXMgdGhlIHNvdXJjZSBjb2RlIj4NCisNCisJCTxta2RpciBkaXI9IiR7YnVpbGQuZm9sZGVyfSIgLz4NCisJCTxjc2MgdGFyZ2V0PSJsaWJyYXJ5IiBvdXRwdXQ9IiR7YnVpbGQuZm9sZGVyfURvdFpMaWIuZGxsIiBkZWJ1Zz0iJHtkZWJ1Z30iPg0KKwkJCTxyZWZlcmVuY2VzIGJhc2VkaXI9IiR7bnVuaXQubG9jYXRpb259Ij4NCisJCQkJPGluY2x1ZGVzIGlmPSIke251bml0fSIgbmFtZT0ibnVuaXQuZnJhbWV3b3JrLmRsbCIgLz4NCisJCQk8L3JlZmVyZW5jZXM+DQorCQkJPHNvdXJjZXM+DQorCQkJCTxpbmNsdWRlcyBuYW1lPSIqLmNzIiAvPg0KKwkJCQk8ZXhjbHVkZXMgbmFtZT0iVW5pdFRlc3RzLmNzIiB1bmxlc3M9IiR7bnVuaXR9IiAvPg0KKwkJCTwvc291cmNlcz4NCisJCQk8YXJnIHZhbHVlPSIvZDpudW5pdCIgaWY9IiR7bnVuaXR9IiAvPg0KKwkJPC9jc2M+DQorCTwvdGFyZ2V0Pg0KKw0KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL2RvdHpsaWIvRG90WkxpYi5jaG0gYi96bGliL3NyYy9jb250cmliL2RvdHpsaWIvRG90WkxpYi5jaG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIxNGE0NAotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliLmNobQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL2RvdHpsaWIvRG90WkxpYi5zbG4gYi96bGliL3NyYy9jb250cmliL2RvdHpsaWIvRG90WkxpYi5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM0NWNhMAotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliLnNsbgpAQCAtMCwwICsxLDIxIEBACitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiA4LjAwDQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJEb3RaTGliIiwgIkRvdFpMaWJcRG90WkxpYi5jc3Byb2oiLCAie0JCMUVFMEIxLTE4MDgtNDZDQi1CNzg2LTk0OUQ5MTExN0ZDNX0iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorR2xvYmFsDQorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uKSA9IHByZVNvbHV0aW9uDQorCQlEZWJ1ZyA9IERlYnVnDQorCQlSZWxlYXNlID0gUmVsZWFzZQ0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb24pID0gcG9zdFNvbHV0aW9uDQorCQl7QkIxRUUwQjEtMTgwOC00NkNCLUI3ODYtOTQ5RDkxMTE3RkM1fS5EZWJ1Zy5BY3RpdmVDZmcgPSBEZWJ1Z3wuTkVUDQorCQl7QkIxRUUwQjEtMTgwOC00NkNCLUI3ODYtOTQ5RDkxMTE3RkM1fS5EZWJ1Zy5CdWlsZC4wID0gRGVidWd8Lk5FVA0KKwkJe0JCMUVFMEIxLTE4MDgtNDZDQi1CNzg2LTk0OUQ5MTExN0ZDNX0uUmVsZWFzZS5BY3RpdmVDZmcgPSBSZWxlYXNlfC5ORVQNCisJCXtCQjFFRTBCMS0xODA4LTQ2Q0ItQjc4Ni05NDlEOTExMTdGQzV9LlJlbGVhc2UuQnVpbGQuMCA9IFJlbGVhc2V8Lk5FVA0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oRXh0ZW5zaWJpbGl0eUdsb2JhbHMpID0gcG9zdFNvbHV0aW9uDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5QWRkSW5zKSA9IHBvc3RTb2x1dGlvbg0KKwlFbmRHbG9iYWxTZWN0aW9uDQorRW5kR2xvYmFsDQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvQXNzZW1ibHlJbmZvLmNzIGIvemxpYi9zcmMvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OTFiZmMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL2RvdHpsaWIvRG90WkxpYi9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw1OCBAQAordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247DQordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsNCisNCisvLw0KKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcNCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbg0KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4NCisvLw0KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiRG90WkxpYiIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiLk5ldCBiaW5kaW5ncyBmb3IgWkxpYiBjb21wcmVzc2lvbiBkbGwgMS4yLngiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIkhlbnJpayBSYXZuIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIiIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIihjKSAyMDA0IGJ5IEhlbnJpayBSYXZuIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQ0KKw0KKy8vDQorLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoNCisvLw0KKy8vICAgICAgTWFqb3IgVmVyc2lvbg0KKy8vICAgICAgTWlub3IgVmVyc2lvbg0KKy8vICAgICAgQnVpbGQgTnVtYmVyDQorLy8gICAgICBSZXZpc2lvbg0KKy8vDQorLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgUmV2aXNpb24gYW5kIEJ1aWxkIE51bWJlcnMNCisvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93Og0KKw0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQ0KKw0KKy8vDQorLy8gSW4gb3JkZXIgdG8gc2lnbiB5b3VyIGFzc2VtYmx5IHlvdSBtdXN0IHNwZWNpZnkgYSBrZXkgdG8gdXNlLiBSZWZlciB0byB0aGUNCisvLyBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBhc3NlbWJseSBzaWduaW5nLg0KKy8vDQorLy8gVXNlIHRoZSBhdHRyaWJ1dGVzIGJlbG93IHRvIGNvbnRyb2wgd2hpY2gga2V5IGlzIHVzZWQgZm9yIHNpZ25pbmcuDQorLy8NCisvLyBOb3RlczoNCisvLyAgICgqKSBJZiBubyBrZXkgaXMgc3BlY2lmaWVkLCB0aGUgYXNzZW1ibHkgaXMgbm90IHNpZ25lZC4NCisvLyAgICgqKSBLZXlOYW1lIHJlZmVycyB0byBhIGtleSB0aGF0IGhhcyBiZWVuIGluc3RhbGxlZCBpbiB0aGUgQ3J5cHRvIFNlcnZpY2UNCisvLyAgICAgICBQcm92aWRlciAoQ1NQKSBvbiB5b3VyIG1hY2hpbmUuIEtleUZpbGUgcmVmZXJzIHRvIGEgZmlsZSB3aGljaCBjb250YWlucw0KKy8vICAgICAgIGEga2V5Lg0KKy8vICAgKCopIElmIHRoZSBLZXlGaWxlIGFuZCB0aGUgS2V5TmFtZSB2YWx1ZXMgYXJlIGJvdGggc3BlY2lmaWVkLCB0aGUNCisvLyAgICAgICBmb2xsb3dpbmcgcHJvY2Vzc2luZyBvY2N1cnM6DQorLy8gICAgICAgKDEpIElmIHRoZSBLZXlOYW1lIGNhbiBiZSBmb3VuZCBpbiB0aGUgQ1NQLCB0aGF0IGtleSBpcyB1c2VkLg0KKy8vICAgICAgICgyKSBJZiB0aGUgS2V5TmFtZSBkb2VzIG5vdCBleGlzdCBhbmQgdGhlIEtleUZpbGUgZG9lcyBleGlzdCwgdGhlIGtleQ0KKy8vICAgICAgICAgICBpbiB0aGUgS2V5RmlsZSBpcyBpbnN0YWxsZWQgaW50byB0aGUgQ1NQIGFuZCB1c2VkLg0KKy8vICAgKCopIEluIG9yZGVyIHRvIGNyZWF0ZSBhIEtleUZpbGUsIHlvdSBjYW4gdXNlIHRoZSBzbi5leGUgKFN0cm9uZyBOYW1lKSB1dGlsaXR5Lg0KKy8vICAgICAgIFdoZW4gc3BlY2lmeWluZyB0aGUgS2V5RmlsZSwgdGhlIGxvY2F0aW9uIG9mIHRoZSBLZXlGaWxlIHNob3VsZCBiZQ0KKy8vICAgICAgIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IG91dHB1dCBkaXJlY3Rvcnkgd2hpY2ggaXMNCisvLyAgICAgICAlUHJvamVjdCBEaXJlY3RvcnklXG9ialw8Y29uZmlndXJhdGlvbj4uIEZvciBleGFtcGxlLCBpZiB5b3VyIEtleUZpbGUgaXMNCisvLyAgICAgICBsb2NhdGVkIGluIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSwgeW91IHdvdWxkIHNwZWNpZnkgdGhlIEFzc2VtYmx5S2V5RmlsZQ0KKy8vICAgICAgIGF0dHJpYnV0ZSBhcyBbYXNzZW1ibHk6IEFzc2VtYmx5S2V5RmlsZSgiLi5cXC4uXFxteWtleS5zbmsiKV0NCisvLyAgICgqKSBEZWxheSBTaWduaW5nIGlzIGFuIGFkdmFuY2VkIG9wdGlvbiAtIHNlZSB0aGUgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrDQorLy8gICAgICAgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzLg0KKy8vDQorW2Fzc2VtYmx5OiBBc3NlbWJseURlbGF5U2lnbihmYWxzZSldDQorW2Fzc2VtYmx5OiBBc3NlbWJseUtleUZpbGUoIiIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlLZXlOYW1lKCIiKV0NCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL2RvdHpsaWIvRG90WkxpYi9DaGVja3N1bUltcGwuY3MgYi96bGliL3NyYy9jb250cmliL2RvdHpsaWIvRG90WkxpYi9DaGVja3N1bUltcGwuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg4YjJmYwotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0NoZWNrc3VtSW1wbC5jcwpAQCAtMCwwICsxLDIwMiBAQAorLy8NCisvLyCpIENvcHlyaWdodCBIZW5yaWsgUmF2biAyMDA0DQorLy8NCisvLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4NCisvLyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkNCisvLw0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7DQordXNpbmcgU3lzdGVtLlRleHQ7DQorDQorDQorbmFtZXNwYWNlIERvdFpMaWINCit7DQorICAgICNyZWdpb24gQ2hlY2tzdW1HZW5lcmF0b3JCYXNlDQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEltcGxlbWVudHMgdGhlIGNvbW1vbiBmdW5jdGlvbmFsaXR5IG5lZWRlZCBmb3IgYWxsIDxzZWUgY3JlZj0iQ2hlY2tzdW1HZW5lcmF0b3IiLz5zDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIC8vLyA8ZXhhbXBsZT48L2V4YW1wbGU+DQorICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDaGVja3N1bUdlbmVyYXRvckJhc2UgOiBDaGVja3N1bUdlbmVyYXRvcg0KKyAgICB7DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IGNoZWNrc3VtDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIHVpbnQgX2N1cnJlbnQ7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNoZWNrc3VtIGdlbmVyYXRvciBiYXNlIC0gdGhlIGN1cnJlbnQgY2hlY2tzdW0gaXMNCisgICAgICAgIC8vLyBzZXQgdG8gemVybw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBDaGVja3N1bUdlbmVyYXRvckJhc2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIF9jdXJyZW50ID0gMDsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2hlY2tzdW0gZ2VuZXJhdG9yIGJhc2V3aXRoIGEgc3BlY2lmaWVkIHZhbHVlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbml0aWFsVmFsdWUiPlRoZSB2YWx1ZSB0byBzZXQgdGhlIGN1cnJlbnQgY2hlY2tzdW0gdG88L3BhcmFtPg0KKyAgICAgICAgcHVibGljIENoZWNrc3VtR2VuZXJhdG9yQmFzZSh1aW50IGluaXRpYWxWYWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBfY3VycmVudCA9IGluaXRpYWxWYWx1ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXNldHMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gdG8gemVybw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyB2b2lkIFJlc2V0KCkgeyBfY3VycmVudCA9IDA7IH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBHZXRzIHRoZSBjdXJyZW50IGNoZWNrc3VtIHZhbHVlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHVpbnQgVmFsdWUgeyBnZXQgeyByZXR1cm4gX2N1cnJlbnQ7IH0gfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFVwZGF0ZXMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gd2l0aCBwYXJ0IG9mIGFuIGFycmF5IG9mIGJ5dGVzDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5UaGUgZGF0YSB0byB1cGRhdGUgdGhlIGNoZWNrc3VtIHdpdGg8L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPldoZXJlIGluIDxjPmRhdGE8L2M+IHRvIHN0YXJ0IHVwZGF0aW5nPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPlRoZSBudW1iZXIgb2YgYnl0ZXMgZnJvbSA8Yz5kYXRhPC9jPiB0byB1c2U8L3BhcmFtPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRFeGNlcHRpb24iPlRoZSBzdW0gb2Ygb2Zmc2V0IGFuZCBjb3VudCBpcyBsYXJnZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIDxjPmRhdGE8L2M+PC9leGNlcHRpb24+DQorICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJOdWxsUmVmZXJlbmNlRXhjZXB0aW9uIj48Yz5kYXRhPC9jPiBpcyBhIG51bGwgcmVmZXJlbmNlPC9leGNlcHRpb24+DQorICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24iPk9mZnNldCBvciBjb3VudCBpcyBuZWdhdGl2ZS48L2V4Y2VwdGlvbj4NCisgICAgICAgIC8vLyA8cmVtYXJrcz5BbGwgdGhlIG90aGVyIDxjPlVwZGF0ZTwvYz4gbWV0aG9kcyBhcmUgaW1wbG1lbmV0ZWQgaW4gdGVybXMgb2YgdGhpcyBvbmUuDQorICAgICAgICAvLy8gVGhpcyBpcyB0aGVyZWZvcmUgdGhlIG9ubHkgbWV0aG9kIGEgZGVyaXZlZCBjbGFzcyBoYXMgdG8gaW1wbGVtZW50PC9yZW1hcmtzPg0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgVXBkYXRlKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFVwZGF0ZXMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gd2l0aCBhbiBhcnJheSBvZiBieXRlcy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPlRoZSBkYXRhIHRvIHVwZGF0ZSB0aGUgY2hlY2tzdW0gd2l0aDwvcGFyYW0+DQorICAgICAgICBwdWJsaWMgdm9pZCBVcGRhdGUoYnl0ZVtdIGRhdGEpDQorICAgICAgICB7DQorICAgICAgICAgICAgVXBkYXRlKGRhdGEsIDAsIGRhdGEuTGVuZ3RoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBVcGRhdGVzIHRoZSBjdXJyZW50IGNoZWNrc3VtIHdpdGggdGhlIGRhdGEgZnJvbSBhIHN0cmluZw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIHN0cmluZyB0byB1cGRhdGUgdGhlIGNoZWNrc3VtIHdpdGg8L3BhcmFtPg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPlRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGNvbnZlcnRlZCBieSB0aGUgVVRGLTggZW5jb2Rpbmc8L3JlbWFya3M+DQorICAgICAgICBwdWJsaWMgdm9pZCBVcGRhdGUoc3RyaW5nIGRhdGEpDQorICAgICAgICB7DQorCQkJVXBkYXRlKEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoZGF0YSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFVwZGF0ZXMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gd2l0aCB0aGUgZGF0YSBmcm9tIGEgc3RyaW5nLCB1c2luZyBhIHNwZWNpZmljIGVuY29kaW5nDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5UaGUgc3RyaW5nIHRvIHVwZGF0ZSB0aGUgY2hlY2tzdW0gd2l0aDwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVuY29kaW5nIj5UaGUgZW5jb2RpbmcgdG8gdXNlPC9wYXJhbT4NCisgICAgICAgIHB1YmxpYyB2b2lkIFVwZGF0ZShzdHJpbmcgZGF0YSwgRW5jb2RpbmcgZW5jb2RpbmcpDQorICAgICAgICB7DQorICAgICAgICAgICAgVXBkYXRlKGVuY29kaW5nLkdldEJ5dGVzKGRhdGEpKTsNCisgICAgICAgIH0NCisNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorDQorICAgICNyZWdpb24gQ1JDMzINCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gSW1wbGVtZW50cyBhIENSQzMyIGNoZWNrc3VtIGdlbmVyYXRvcg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIENSQzMyQ2hlY2tzdW0gOiBDaGVja3N1bUdlbmVyYXRvckJhc2UNCisgICAgew0KKyAgICAgICAgI3JlZ2lvbiBETEwgaW1wb3J0cw0KKw0KKyAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIHVpbnQgY3JjMzIodWludCBjcmMsIGludCBkYXRhLCB1aW50IGxlbmd0aCk7DQorDQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIENSQzMyIGNoZWNrc3VtIGdlbmVyYXRvcg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBDUkMzMkNoZWNrc3VtKCkgOiBiYXNlKCkge30NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgQ1JDMzIgY2hlY2tzdW0gZ2VuZXJhdG9yIHdpdGggYSBzcGVjaWZpZWQgdmFsdWUNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImluaXRpYWxWYWx1ZSI+VGhlIHZhbHVlIHRvIHNldCB0aGUgY3VycmVudCBjaGVja3N1bSB0bzwvcGFyYW0+DQorICAgICAgICBwdWJsaWMgQ1JDMzJDaGVja3N1bSh1aW50IGluaXRpYWxWYWx1ZSkgOiBiYXNlKGluaXRpYWxWYWx1ZSkge30NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBVcGRhdGVzIHRoZSBjdXJyZW50IGNoZWNrc3VtIHdpdGggcGFydCBvZiBhbiBhcnJheSBvZiBieXRlcw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIGRhdGEgdG8gdXBkYXRlIHRoZSBjaGVja3N1bSB3aXRoPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij5XaGVyZSBpbiA8Yz5kYXRhPC9jPiB0byBzdGFydCB1cGRhdGluZzwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gPGM+ZGF0YTwvYz4gdG8gdXNlPC9wYXJhbT4NCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50RXhjZXB0aW9uIj5UaGUgc3VtIG9mIG9mZnNldCBhbmQgY291bnQgaXMgbGFyZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZiA8Yz5kYXRhPC9jPjwvZXhjZXB0aW9uPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbiI+PGM+ZGF0YTwvYz4gaXMgYSBudWxsIHJlZmVyZW5jZTwvZXhjZXB0aW9uPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uIj5PZmZzZXQgb3IgY291bnQgaXMgbmVnYXRpdmUuPC9leGNlcHRpb24+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBVcGRhdGUoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBjb3VudCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsNCisgICAgICAgICAgICBpZiAoKG9mZnNldCtjb3VudCkgPiBkYXRhLkxlbmd0aCkgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgR0NIYW5kbGUgaERhdGEgPSBHQ0hhbmRsZS5BbGxvYyhkYXRhLCBHQ0hhbmRsZVR5cGUuUGlubmVkKTsNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIF9jdXJyZW50ID0gY3JjMzIoX2N1cnJlbnQsIGhEYXRhLkFkZHJPZlBpbm5lZE9iamVjdCgpLlRvSW50MzIoKStvZmZzZXQsICh1aW50KWNvdW50KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZmluYWxseQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaERhdGEuRnJlZSgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorDQorICAgICNyZWdpb24gQWRsZXINCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gSW1wbGVtZW50cyBhIGNoZWNrc3VtIGdlbmVyYXRvciB0aGF0IGNvbXB1dGVzIHRoZSBBZGxlciBjaGVja3N1bSBvbiBkYXRhDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgQWRsZXJDaGVja3N1bSA6IENoZWNrc3VtR2VuZXJhdG9yQmFzZQ0KKyAgICB7DQorICAgICAgICAjcmVnaW9uIERMTCBpbXBvcnRzDQorDQorICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gdWludCBhZGxlcjMyKHVpbnQgYWRsZXIsIGludCBkYXRhLCB1aW50IGxlbmd0aCk7DQorDQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEFkbGVyIGNoZWNrc3VtIGdlbmVyYXRvcg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBBZGxlckNoZWNrc3VtKCkgOiBiYXNlKCkge30NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgQWRsZXIgY2hlY2tzdW0gZ2VuZXJhdG9yIHdpdGggYSBzcGVjaWZpZWQgdmFsdWUNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImluaXRpYWxWYWx1ZSI+VGhlIHZhbHVlIHRvIHNldCB0aGUgY3VycmVudCBjaGVja3N1bSB0bzwvcGFyYW0+DQorICAgICAgICBwdWJsaWMgQWRsZXJDaGVja3N1bSh1aW50IGluaXRpYWxWYWx1ZSkgOiBiYXNlKGluaXRpYWxWYWx1ZSkge30NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBVcGRhdGVzIHRoZSBjdXJyZW50IGNoZWNrc3VtIHdpdGggcGFydCBvZiBhbiBhcnJheSBvZiBieXRlcw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIGRhdGEgdG8gdXBkYXRlIHRoZSBjaGVja3N1bSB3aXRoPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij5XaGVyZSBpbiA8Yz5kYXRhPC9jPiB0byBzdGFydCB1cGRhdGluZzwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gPGM+ZGF0YTwvYz4gdG8gdXNlPC9wYXJhbT4NCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50RXhjZXB0aW9uIj5UaGUgc3VtIG9mIG9mZnNldCBhbmQgY291bnQgaXMgbGFyZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZiA8Yz5kYXRhPC9jPjwvZXhjZXB0aW9uPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbiI+PGM+ZGF0YTwvYz4gaXMgYSBudWxsIHJlZmVyZW5jZTwvZXhjZXB0aW9uPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uIj5PZmZzZXQgb3IgY291bnQgaXMgbmVnYXRpdmUuPC9leGNlcHRpb24+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBVcGRhdGUoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBjb3VudCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsNCisgICAgICAgICAgICBpZiAoKG9mZnNldCtjb3VudCkgPiBkYXRhLkxlbmd0aCkgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgR0NIYW5kbGUgaERhdGEgPSBHQ0hhbmRsZS5BbGxvYyhkYXRhLCBHQ0hhbmRsZVR5cGUuUGlubmVkKTsNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIF9jdXJyZW50ID0gYWRsZXIzMihfY3VycmVudCwgaERhdGEuQWRkck9mUGlubmVkT2JqZWN0KCkuVG9JbnQzMigpK29mZnNldCwgKHVpbnQpY291bnQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmaW5hbGx5DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBoRGF0YS5GcmVlKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisNCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvQ2lyY3VsYXJCdWZmZXIuY3MgYi96bGliL3NyYy9jb250cmliL2RvdHpsaWIvRG90WkxpYi9DaXJjdWxhckJ1ZmZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWNhYjNhCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvQ2lyY3VsYXJCdWZmZXIuY3MKQEAgLTAsMCArMSw4MyBAQAorLy8NCisvLyCpIENvcHlyaWdodCBIZW5yaWsgUmF2biAyMDA0DQorLy8NCisvLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4NCisvLyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkNCisvLw0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7DQorDQorbmFtZXNwYWNlIERvdFpMaWINCit7DQorDQorCS8vLyA8c3VtbWFyeT4NCisJLy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIGNpcmN1bGFyIGJ1ZmZlcg0KKwkvLy8gPC9zdW1tYXJ5Pg0KKwlpbnRlcm5hbCBjbGFzcyBDaXJjdWxhckJ1ZmZlcg0KKwl7DQorICAgICAgICAjcmVnaW9uIFByaXZhdGUgZGF0YQ0KKyAgICAgICAgcHJpdmF0ZSBpbnQgX2NhcGFjaXR5Ow0KKyAgICAgICAgcHJpdmF0ZSBpbnQgX2hlYWQ7DQorICAgICAgICBwcml2YXRlIGludCBfdGFpbDsNCisgICAgICAgIHByaXZhdGUgaW50IF9zaXplOw0KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gX2J1ZmZlcjsNCisgICAgICAgICNlbmRyZWdpb24NCisNCisgICAgICAgIHB1YmxpYyBDaXJjdWxhckJ1ZmZlcihpbnQgY2FwYWNpdHkpDQorICAgICAgICB7DQorICAgICAgICAgICAgRGVidWcuQXNzZXJ0KCBjYXBhY2l0eSA+IDAgKTsNCisgICAgICAgICAgICBfYnVmZmVyID0gbmV3IGJ5dGVbY2FwYWNpdHldOw0KKyAgICAgICAgICAgIF9jYXBhY2l0eSA9IGNhcGFjaXR5Ow0KKyAgICAgICAgICAgIF9oZWFkID0gMDsNCisgICAgICAgICAgICBfdGFpbCA9IDA7DQorICAgICAgICAgICAgX3NpemUgPSAwOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIGludCBTaXplIHsgZ2V0IHsgcmV0dXJuIF9zaXplOyB9IH0NCisNCisgICAgICAgIHB1YmxpYyBpbnQgUHV0KGJ5dGVbXSBzb3VyY2UsIGludCBvZmZzZXQsIGludCBjb3VudCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQoIGNvdW50ID4gMCApOw0KKyAgICAgICAgICAgIGludCB0cnVlQ291bnQgPSBNYXRoLk1pbihjb3VudCwgX2NhcGFjaXR5IC0gU2l6ZSk7DQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cnVlQ291bnQ7ICsraSkNCisgICAgICAgICAgICAgICAgX2J1ZmZlclsoX3RhaWwraSkgJSBfY2FwYWNpdHldID0gc291cmNlW29mZnNldCtpXTsNCisgICAgICAgICAgICBfdGFpbCArPSB0cnVlQ291bnQ7DQorICAgICAgICAgICAgX3RhaWwgJT0gX2NhcGFjaXR5Ow0KKyAgICAgICAgICAgIF9zaXplICs9IHRydWVDb3VudDsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZUNvdW50Ow0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIGJvb2wgUHV0KGJ5dGUgYikNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoU2l6ZSA9PSBfY2FwYWNpdHkpIC8vIG5vIHJvb20NCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgIF9idWZmZXJbX3RhaWwrK10gPSBiOw0KKyAgICAgICAgICAgIF90YWlsICU9IF9jYXBhY2l0eTsNCisgICAgICAgICAgICArK19zaXplOw0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIGludCBHZXQoYnl0ZVtdIGRlc3RpbmF0aW9uLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpDQorICAgICAgICB7DQorICAgICAgICAgICAgaW50IHRydWVDb3VudCA9IE1hdGguTWluKGNvdW50LFNpemUpOw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJ1ZUNvdW50OyArK2kpDQorICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uW29mZnNldCArIGldID0gX2J1ZmZlclsoX2hlYWQraSkgJSBfY2FwYWNpdHldOw0KKyAgICAgICAgICAgIF9oZWFkICs9IHRydWVDb3VudDsNCisgICAgICAgICAgICBfaGVhZCAlPSBfY2FwYWNpdHk7DQorICAgICAgICAgICAgX3NpemUgLT0gdHJ1ZUNvdW50Ow0KKyAgICAgICAgICAgIHJldHVybiB0cnVlQ291bnQ7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgaW50IEdldCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKFNpemUgPT0gMCkNCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KKw0KKyAgICAgICAgICAgIGludCByZXN1bHQgPSAoaW50KV9idWZmZXJbX2hlYWQrKyAlIF9jYXBhY2l0eV07DQorICAgICAgICAgICAgLS1fc2l6ZTsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0NvZGVjQmFzZS5jcyBiL3psaWIvc3JjL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0NvZGVjQmFzZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmU2ZGEzCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvQ29kZWNCYXNlLmNzCkBAIC0wLDAgKzEsMTk4IEBACisvLw0KKy8vIKkgQ29weXJpZ2h0IEhlbnJpayBSYXZuIDIwMDQNCisvLw0KKy8vIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gYXJlIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLg0KKy8vIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQ0KKy8vDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsNCisNCituYW1lc3BhY2UgRG90WkxpYg0KK3sNCisJLy8vIDxzdW1tYXJ5Pg0KKwkvLy8gSW1wbGVtZW50cyB0aGUgY29tbW9uIGZ1bmN0aW9uYWxpdHkgbmVlZGVkIGZvciBhbGwgPHNlZSBjcmVmPSJDb2RlYyIvPnMNCisJLy8vIDwvc3VtbWFyeT4NCisJcHVibGljIGFic3RyYWN0IGNsYXNzIENvZGVjQmFzZSA6IENvZGVjLCBJRGlzcG9zYWJsZQ0KKwl7DQorDQorICAgICAgICAjcmVnaW9uIERhdGEgbWVtYmVycw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEluc3RhbmNlIG9mIHRoZSBpbnRlcm5hbCB6bGliIGJ1ZmZlciBzdHJ1Y3R1cmUgdGhhdCBpcw0KKyAgICAgICAgLy8vIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zIGluIHRoZSB6bGliIGRsbA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGludGVybmFsIFpTdHJlYW0gX3p0cmVhbSA9IG5ldyBaU3RyZWFtKCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVHJ1ZSBpZiB0aGUgb2JqZWN0IGluc3RhbmNlIGhhcyBiZWVuIGRpc3Bvc2VkLCBmYWxzZSBvdGhlcndpc2UNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgYm9vbCBfaXNEaXNwb3NlZCA9IGZhbHNlOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRoZSBzaXplIG9mIHRoZSBpbnRlcm5hbCBidWZmZXJzDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDE2Mzg0Ow0KKw0KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gX291dEJ1ZmZlciA9IG5ldyBieXRlW2tCdWZmZXJTaXplXTsNCisgICAgICAgIHByaXZhdGUgYnl0ZVtdIF9pbkJ1ZmZlciA9IG5ldyBieXRlW2tCdWZmZXJTaXplXTsNCisNCisgICAgICAgIHByaXZhdGUgR0NIYW5kbGUgX2hJbnB1dDsNCisgICAgICAgIHByaXZhdGUgR0NIYW5kbGUgX2hPdXRwdXQ7DQorDQorICAgICAgICBwcml2YXRlIHVpbnQgX2NoZWNrc3VtID0gMDsNCisNCisgICAgICAgICNlbmRyZWdpb24NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPGM+Q29kZUJhc2U8L2M+IGNsYXNzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisJCXB1YmxpYyBDb2RlY0Jhc2UoKQ0KKwkJew0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgX2hJbnB1dCA9IEdDSGFuZGxlLkFsbG9jKF9pbkJ1ZmZlciwgR0NIYW5kbGVUeXBlLlBpbm5lZCk7DQorICAgICAgICAgICAgICAgIF9oT3V0cHV0ID0gR0NIYW5kbGUuQWxsb2MoX291dEJ1ZmZlciwgR0NIYW5kbGVUeXBlLlBpbm5lZCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBDbGVhblVwKGZhbHNlKTsNCisgICAgICAgICAgICAgICAgdGhyb3c7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKw0KKyAgICAgICAgI3JlZ2lvbiBDb2RlYyBNZW1iZXJzDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gT2NjdXJzIHdoZW4gbW9yZSBwcm9jZXNzZWQgZGF0YSBhcmUgYXZhaWxhYmxlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBldmVudCBEYXRhQXZhaWxhYmxlSGFuZGxlciBEYXRhQXZhaWxhYmxlOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEZpcmVzIHRoZSA8c2VlIGNyZWY9IkRhdGFBdmFpbGFibGUiLz4gZXZlbnQNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBPbkRhdGFBdmFpbGFibGUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChfenRyZWFtLnRvdGFsX291dCA+IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoRGF0YUF2YWlsYWJsZSAhPSBudWxsKQ0KKyAgICAgICAgICAgICAgICAgICAgRGF0YUF2YWlsYWJsZSggX291dEJ1ZmZlciwgMCwgKGludClfenRyZWFtLnRvdGFsX291dCk7DQorICAgICAgICAgICAgICAgIHJlc2V0T3V0cHV0KCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEFkZHMgbW9yZSBkYXRhIHRvIHRoZSBjb2RlYyB0byBiZSBwcm9jZXNzZWQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5CeXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgYWRkZWQgdG8gdGhlIGNvZGVjPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cmVtYXJrcz5BZGRpbmcgZGF0YSBtYXksIG9yIG1heSBub3QsIHJhaXNlIHRoZSA8Yz5EYXRhQXZhaWxhYmxlPC9jPiBldmVudDwvcmVtYXJrcz4NCisgICAgICAgIHB1YmxpYyB2b2lkIEFkZChieXRlW10gZGF0YSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBBZGQoZGF0YSwwLGRhdGEuTGVuZ3RoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBBZGRzIG1vcmUgZGF0YSB0byB0aGUgY29kZWMgdG8gYmUgcHJvY2Vzc2VkLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+Qnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIGFkZGVkIHRvIHRoZSBjb2RlYzwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+VGhlIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIHRvIGFkZCBmcm9tIDxjPmRhdGE8L2M+PC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPlRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYWRkPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cmVtYXJrcz5BZGRpbmcgZGF0YSBtYXksIG9yIG1heSBub3QsIHJhaXNlIHRoZSA8Yz5EYXRhQXZhaWxhYmxlPC9jPiBldmVudDwvcmVtYXJrcz4NCisgICAgICAgIC8vLyA8cmVtYXJrcz5UaGlzIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYSBkZXJpdmVkIGNsYXNzPC9yZW1hcmtzPg0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgQWRkKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEZpbmlzaGVzIHVwIGFueSBwZW5kaW5nIGRhdGEgdGhhdCBuZWVkcyB0byBiZSBwcm9jZXNzZWQgYW5kIGhhbmRsZWQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPlRoaXMgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhIGRlcml2ZWQgY2xhc3M8L3JlbWFya3M+DQorICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBGaW5pc2goKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBHZXRzIHRoZSBjaGVja3N1bSBvZiB0aGUgZGF0YSB0aGF0IGhhcyBiZWVuIGFkZGVkIHNvIGZhcg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyB1aW50IENoZWNrc3VtIHsgZ2V0IHsgcmV0dXJuIF9jaGVja3N1bTsgfSB9DQorDQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAjcmVnaW9uIERlc3RydWN0b3IgJiBJRGlzcG9zYWJsZSBzdHVmZg0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIERlc3Ryb3lzIHRoaXMgaW5zdGFuY2UNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB+Q29kZWNCYXNlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBDbGVhblVwKGZhbHNlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWxlYXNlcyBhbnkgdW5tYW5hZ2VkIHJlc291cmNlcyBhbmQgY2FsbHMgdGhlIDxzZWUgY3JlZj0iQ2xlYW5VcCgpIi8+IG1ldGhvZCBvZiB0aGUgZGVyaXZlZCBjbGFzcw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIENsZWFuVXAodHJ1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUGVyZm9ybXMgYW55IGNvZGVjIHNwZWNpZmljIGNsZWFudXANCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHJlbWFya3M+VGhpcyBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGEgZGVyaXZlZCBjbGFzczwvcmVtYXJrcz4NCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIENsZWFuVXAoKTsNCisNCisgICAgICAgIC8vIHBlcmZvcm1zIHRoZSByZWxlYXNlIG9mIHRoZSBoYW5kbGVzIGFuZCBjYWxscyB0aGUgZGVyZWl2ZWQgQ2xlYW5VcCgpDQorICAgICAgICBwcml2YXRlIHZvaWQgQ2xlYW5VcChib29sIGlzRGlzcG9zaW5nKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmICghX2lzRGlzcG9zZWQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBDbGVhblVwKCk7DQorICAgICAgICAgICAgICAgIGlmIChfaElucHV0LklzQWxsb2NhdGVkKQ0KKyAgICAgICAgICAgICAgICAgICAgX2hJbnB1dC5GcmVlKCk7DQorICAgICAgICAgICAgICAgIGlmIChfaE91dHB1dC5Jc0FsbG9jYXRlZCkNCisgICAgICAgICAgICAgICAgICAgIF9oT3V0cHV0LkZyZWUoKTsNCisNCisgICAgICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisNCisgICAgICAgICNlbmRyZWdpb24NCisNCisgICAgICAgICNyZWdpb24gSGVscGVyIG1ldGhvZHMNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb3BpZXMgYSBudW1iZXIgb2YgYnl0ZXMgdG8gdGhlIGludGVybmFsIGNvZGVjIGJ1ZmZlciAtIHJlYWR5IGZvciBwcm9jY2VzaW5nDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5UaGUgYnl0ZSBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIHRvIGNvcHk8L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdGFydEluZGV4Ij5UaGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ5dGUgdG8gY29weTwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgZnJvbSA8Yz5kYXRhPC9jPjwvcGFyYW0+DQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5SW5wdXQoYnl0ZVtdIGRhdGEsIGludCBzdGFydEluZGV4LCBpbnQgY291bnQpDQorICAgICAgICB7DQorICAgICAgICAgICAgQXJyYXkuQ29weShkYXRhLCBzdGFydEluZGV4LCBfaW5CdWZmZXIsMCwgY291bnQpOw0KKyAgICAgICAgICAgIF96dHJlYW0ubmV4dF9pbiA9IF9oSW5wdXQuQWRkck9mUGlubmVkT2JqZWN0KCk7DQorICAgICAgICAgICAgX3p0cmVhbS50b3RhbF9pbiA9IDA7DQorICAgICAgICAgICAgX3p0cmVhbS5hdmFpbF9pbiA9ICh1aW50KWNvdW50Ow0KKw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlc2V0cyB0aGUgaW50ZXJuYWwgb3V0cHV0IGJ1ZmZlcnMgdG8gYSBrbm93biBzdGF0ZSAtIHJlYWR5IGZvciBwcm9jZXNzaW5nDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgcmVzZXRPdXRwdXQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIF96dHJlYW0udG90YWxfb3V0ID0gMDsNCisgICAgICAgICAgICBfenRyZWFtLmF2YWlsX291dCA9IGtCdWZmZXJTaXplOw0KKyAgICAgICAgICAgIF96dHJlYW0ubmV4dF9vdXQgPSBfaE91dHB1dC5BZGRyT2ZQaW5uZWRPYmplY3QoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBVcGRhdGVzIHRoZSBydW5uaW5nIGNoZWNrc3VtIHByb3BlcnR5DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuZXdTdW0iPlRoZSBuZXcgY2hlY2tzdW0gdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q2hlY2tzdW0odWludCBuZXdTdW0pDQorICAgICAgICB7DQorICAgICAgICAgICAgX2NoZWNrc3VtID0gbmV3U3VtOw0KKyAgICAgICAgfQ0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0RlZmxhdGVyLmNzIGIvemxpYi9zcmMvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvRGVmbGF0ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI0Nzc5MgotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0RlZmxhdGVyLmNzCkBAIC0wLDAgKzEsMTA2IEBACisvLw0KKy8vIKkgQ29weXJpZ2h0IEhlbnJpayBSYXZuIDIwMDQNCisvLw0KKy8vIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gYXJlIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLg0KKy8vIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQ0KKy8vDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsNCit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7DQorDQorbmFtZXNwYWNlIERvdFpMaWINCit7DQorDQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEltcGxlbWVudHMgYSBkYXRhIGNvbXByZXNzb3IsIHVzaW5nIHRoZSBkZWZsYXRlIGFsZ29yaXRobSBpbiB0aGUgWkxpYiBkbGwNCisgICAgLy8vIDwvc3VtbWFyeT4NCisJcHVibGljIHNlYWxlZCBjbGFzcyBEZWZsYXRlciA6IENvZGVjQmFzZQ0KKwl7DQorICAgICAgICAjcmVnaW9uIERsbCBpbXBvcnRzDQorICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCwgQ2hhclNldD1DaGFyU2V0LkFuc2kpXQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBkZWZsYXRlSW5pdF8ocmVmIFpTdHJlYW0gc3osIGludCBsZXZlbCwgc3RyaW5nIHZzLCBpbnQgc2l6ZSk7DQorDQorICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGRlZmxhdGUocmVmIFpTdHJlYW0gc3osIGludCBmbHVzaCk7DQorDQorICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGRlZmxhdGVSZXNldChyZWYgWlN0cmVhbSBzeik7DQorDQorICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGRlZmxhdGVFbmQocmVmIFpTdHJlYW0gc3opOw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgYW4gbmV3IGluc3RhbmNlIG9mIHRoZSA8Yz5EZWZsYXRlcjwvYz4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxldmVsIj5UaGUgY29tcHJlc3Npb24gbGV2ZWwgdG8gdXNlIGZvciB0aGlzIDxjPkRlZmxhdGVyPC9jPjwvcGFyYW0+DQorCQlwdWJsaWMgRGVmbGF0ZXIoQ29tcHJlc3NMZXZlbCBsZXZlbCkgOiBiYXNlKCkNCisJCXsNCisgICAgICAgICAgICBpbnQgcmV0dmFsID0gZGVmbGF0ZUluaXRfKHJlZiBfenRyZWFtLCAoaW50KWxldmVsLCBJbmZvLlZlcnNpb24sIE1hcnNoYWwuU2l6ZU9mKF96dHJlYW0pKTsNCisgICAgICAgICAgICBpZiAocmV0dmFsICE9IDApDQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBaTGliRXhjZXB0aW9uKHJldHZhbCwgIkNvdWxkIG5vdCBpbml0aWFsaXplIGRlZmxhdGVyIik7DQorDQorICAgICAgICAgICAgcmVzZXRPdXRwdXQoKTsNCisJCX0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBBZGRzIG1vcmUgZGF0YSB0byB0aGUgY29kZWMgdG8gYmUgcHJvY2Vzc2VkLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+Qnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIGFkZGVkIHRvIHRoZSBjb2RlYzwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+VGhlIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIHRvIGFkZCBmcm9tIDxjPmRhdGE8L2M+PC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPlRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYWRkPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cmVtYXJrcz5BZGRpbmcgZGF0YSBtYXksIG9yIG1heSBub3QsIHJhaXNlIHRoZSA8Yz5EYXRhQXZhaWxhYmxlPC9jPiBldmVudDwvcmVtYXJrcz4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEFkZChieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGNvdW50KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oKTsNCisgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsNCisgICAgICAgICAgICBpZiAoKG9mZnNldCtjb3VudCkgPiBkYXRhLkxlbmd0aCkgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCk7DQorDQorICAgICAgICAgICAgaW50IHRvdGFsID0gY291bnQ7DQorICAgICAgICAgICAgaW50IGlucHV0SW5kZXggPSBvZmZzZXQ7DQorICAgICAgICAgICAgaW50IGVyciA9IDA7DQorDQorICAgICAgICAgICAgd2hpbGUgKGVyciA+PSAwICYmIGlucHV0SW5kZXggPCB0b3RhbCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGNvcHlJbnB1dChkYXRhLCBpbnB1dEluZGV4LCBNYXRoLk1pbih0b3RhbCAtIGlucHV0SW5kZXgsIGtCdWZmZXJTaXplKSk7DQorICAgICAgICAgICAgICAgIHdoaWxlIChlcnIgPj0gMCAmJiBfenRyZWFtLmF2YWlsX2luID4gMCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gZGVmbGF0ZShyZWYgX3p0cmVhbSwgKGludClGbHVzaFR5cGVzLk5vbmUpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSAwKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChfenRyZWFtLmF2YWlsX291dCA9PSAwKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25EYXRhQXZhaWxhYmxlKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGRlZmxhdGUocmVmIF96dHJlYW0sIChpbnQpRmx1c2hUeXBlcy5Ob25lKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpbnB1dEluZGV4ICs9IChpbnQpX3p0cmVhbS50b3RhbF9pbjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzZXRDaGVja3N1bSggX3p0cmVhbS5hZGxlciApOw0KKyAgICAgICAgfQ0KKw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEZpbmlzaGVzIHVwIGFueSBwZW5kaW5nIGRhdGEgdGhhdCBuZWVkcyB0byBiZSBwcm9jZXNzZWQgYW5kIGhhbmRsZWQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmluaXNoKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgZXJyOw0KKyAgICAgICAgICAgIGRvDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBlcnIgPSBkZWZsYXRlKHJlZiBfenRyZWFtLCAoaW50KUZsdXNoVHlwZXMuRmluaXNoKTsNCisgICAgICAgICAgICAgICAgT25EYXRhQXZhaWxhYmxlKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdoaWxlIChlcnIgPT0gMCk7DQorICAgICAgICAgICAgc2V0Q2hlY2tzdW0oIF96dHJlYW0uYWRsZXIgKTsNCisgICAgICAgICAgICBkZWZsYXRlUmVzZXQocmVmIF96dHJlYW0pOw0KKyAgICAgICAgICAgIHJlc2V0T3V0cHV0KCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ2xvc2VzIHRoZSBpbnRlcm5hbCB6bGliIGRlZmxhdGUgc3RyZWFtDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgQ2xlYW5VcCgpIHsgZGVmbGF0ZUVuZChyZWYgX3p0cmVhbSk7IH0NCisNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL2RvdHpsaWIvRG90WkxpYi9Eb3RaTGliLmNzIGIvemxpYi9zcmMvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvRG90WkxpYi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTE4NGI0Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvRG90WkxpYi5jcwpAQCAtMCwwICsxLDI4OCBAQAorLy8NCisvLyCpIENvcHlyaWdodCBIZW5yaWsgUmF2biAyMDA0DQorLy8NCisvLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4NCisvLyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkNCisvLw0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uSU87DQordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOw0KK3VzaW5nIFN5c3RlbS5UZXh0Ow0KKw0KKw0KK25hbWVzcGFjZSBEb3RaTGliDQorew0KKw0KKyAgICAjcmVnaW9uIEludGVybmFsIHR5cGVzDQorDQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIERlZmluZXMgY29uc3RhbnRzIGZvciB0aGUgdmFyaW91cyBmbHVzaCB0eXBlcyB1c2VkIHdpdGggemxpYg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBpbnRlcm5hbCBlbnVtIEZsdXNoVHlwZXMNCisgICAgew0KKyAgICAgICAgTm9uZSwgIFBhcnRpYWwsICBTeW5jLCAgRnVsbCwgIEZpbmlzaCwgIEJsb2NrDQorICAgIH0NCisNCisgICAgI3JlZ2lvbiBaU3RyZWFtIHN0cnVjdHVyZQ0KKyAgICAvLyBpbnRlcm5hbCBtYXBwaW5nIG9mIHRoZSB6bGliIHpzdHJlYW0gc3RydWN0dXJlIGZvciBtYXJzaGFsbGluZw0KKyAgICBbU3RydWN0TGF5b3V0QXR0cmlidXRlKExheW91dEtpbmQuU2VxdWVudGlhbCwgUGFjaz00LCBTaXplPTAsIENoYXJTZXQ9Q2hhclNldC5BbnNpKV0NCisgICAgaW50ZXJuYWwgc3RydWN0IFpTdHJlYW0NCisgICAgew0KKyAgICAgICAgcHVibGljIEludFB0ciBuZXh0X2luOw0KKyAgICAgICAgcHVibGljIHVpbnQgYXZhaWxfaW47DQorICAgICAgICBwdWJsaWMgdWludCB0b3RhbF9pbjsNCisNCisgICAgICAgIHB1YmxpYyBJbnRQdHIgbmV4dF9vdXQ7DQorICAgICAgICBwdWJsaWMgdWludCBhdmFpbF9vdXQ7DQorICAgICAgICBwdWJsaWMgdWludCB0b3RhbF9vdXQ7DQorDQorICAgICAgICBbTWFyc2hhbEFzKFVubWFuYWdlZFR5cGUuTFBTdHIpXQ0KKyAgICAgICAgc3RyaW5nIG1zZzsNCisgICAgICAgIHVpbnQgc3RhdGU7DQorDQorICAgICAgICB1aW50IHphbGxvYzsNCisgICAgICAgIHVpbnQgemZyZWU7DQorICAgICAgICB1aW50IG9wYXF1ZTsNCisNCisgICAgICAgIGludCBkYXRhX3R5cGU7DQorICAgICAgICBwdWJsaWMgdWludCBhZGxlcjsNCisgICAgICAgIHVpbnQgcmVzZXJ2ZWQ7DQorICAgIH0NCisNCisgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAjZW5kcmVnaW9uDQorDQorICAgICNyZWdpb24gUHVibGljIGVudW1zDQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIERlZmluZXMgY29uc3RhbnRzIGZvciB0aGUgYXZhaWxhYmxlIGNvbXByZXNzaW9uIGxldmVscyBpbiB6bGliDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBlbnVtIENvbXByZXNzTGV2ZWwgOiBpbnQNCisgICAgew0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRoZSBkZWZhdWx0IGNvbXByZXNzaW9uIGxldmVsIHdpdGggYSByZWFzb25hYmxlIGNvbXByb21pc2UgYmV0d2VlbiBjb21wcmVzc2lvbiBhbmQgc3BlZWQNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBEZWZhdWx0ID0gLTEsDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTm8gY29tcHJlc3Npb24gYXQgYWxsLiBUaGUgZGF0YSBhcmUgcGFzc2VkIHN0cmFpZ2h0IHRocm91Z2guDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgTm9uZSA9IDAsDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVGhlIG1heGltdW0gY29tcHJlc3Npb24gcmF0ZSBhdmFpbGFibGUuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgQmVzdCA9IDksDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVGhlIGZhc3Rlc3QgYXZhaWxhYmxlIGNvbXByZXNzaW9uIGxldmVsLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIEZhc3Rlc3QgPSAxDQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAjcmVnaW9uIEV4Y2VwdGlvbiBjbGFzc2VzDQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIFRoZSBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gd2hlbiBhbiBlcnJvciBvY2N1cnMgb24gdGhlIHpsaWIgZGxsDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBjbGFzcyBaTGliRXhjZXB0aW9uIDogQXBwbGljYXRpb25FeGNlcHRpb24NCisgICAgew0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlpMaWJFeGNlcHRpb24iLz4gY2xhc3Mgd2l0aCBhIHNwZWNpZmllZA0KKyAgICAgICAgLy8vIGVycm9yIG1lc3NhZ2UgYW5kIGVycm9yIGNvZGUNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVycm9yQ29kZSI+VGhlIHpsaWIgZXJyb3IgY29kZSB0aGF0IGNhdXNlZCB0aGUgZXhjZXB0aW9uPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibXNnIj5BIG1lc3NhZ2UgdGhhdCAoaG9wZWZ1bGx5KSBkZXNjcmliZXMgdGhlIGVycm9yPC9wYXJhbT4NCisgICAgICAgIHB1YmxpYyBaTGliRXhjZXB0aW9uKGludCBlcnJvckNvZGUsIHN0cmluZyBtc2cpIDogYmFzZShTdHJpbmcuRm9ybWF0KCJaTGliIGVycm9yIHswfSB7MX0iLCBlcnJvckNvZGUsIG1zZykpDQorICAgICAgICB7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iWkxpYkV4Y2VwdGlvbiIvPiBjbGFzcyB3aXRoIGEgc3BlY2lmaWVkDQorICAgICAgICAvLy8gZXJyb3IgY29kZQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZXJyb3JDb2RlIj5UaGUgemxpYiBlcnJvciBjb2RlIHRoYXQgY2F1c2VkIHRoZSBleGNlcHRpb248L3BhcmFtPg0KKyAgICAgICAgcHVibGljIFpMaWJFeGNlcHRpb24oaW50IGVycm9yQ29kZSkgOiBiYXNlKFN0cmluZy5Gb3JtYXQoIlpMaWIgZXJyb3IgezB9IiwgZXJyb3JDb2RlKSkNCisgICAgICAgIHsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorDQorICAgICNyZWdpb24gSW50ZXJmYWNlcw0KKw0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBEZWNsYXJlcyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIHRoYXQgZW5hYmxlcyBhIHJ1bm5pbmcgY2hlY2tzdW0gdG8gYmUgY2FsY3VsYXRlZA0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIENoZWNrc3VtR2VuZXJhdG9yDQorICAgIHsNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjaGVja3N1bQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHVpbnQgVmFsdWUgeyBnZXQ7IH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDbGVhcnMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gdG8gMA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHZvaWQgUmVzZXQoKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBVcGRhdGVzIHRoZSBjdXJyZW50IGNoZWNrc3VtIHdpdGggYW4gYXJyYXkgb2YgYnl0ZXMNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPlRoZSBkYXRhIHRvIHVwZGF0ZSB0aGUgY2hlY2tzdW0gd2l0aDwvcGFyYW0+DQorICAgICAgICB2b2lkIFVwZGF0ZShieXRlW10gZGF0YSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVXBkYXRlcyB0aGUgY3VycmVudCBjaGVja3N1bSB3aXRoIHBhcnQgb2YgYW4gYXJyYXkgb2YgYnl0ZXMNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPlRoZSBkYXRhIHRvIHVwZGF0ZSB0aGUgY2hlY2tzdW0gd2l0aDwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+V2hlcmUgaW4gPGM+ZGF0YTwvYz4gdG8gc3RhcnQgdXBkYXRpbmc8L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+VGhlIG51bWJlciBvZiBieXRlcyBmcm9tIDxjPmRhdGE8L2M+IHRvIHVzZTwvcGFyYW0+DQorICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudEV4Y2VwdGlvbiI+VGhlIHN1bSBvZiBvZmZzZXQgYW5kIGNvdW50IGlzIGxhcmdlciB0aGFuIHRoZSBsZW5ndGggb2YgPGM+ZGF0YTwvYz48L2V4Y2VwdGlvbj4NCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+PGM+ZGF0YTwvYz4gaXMgYSBudWxsIHJlZmVyZW5jZTwvZXhjZXB0aW9uPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uIj5PZmZzZXQgb3IgY291bnQgaXMgbmVnYXRpdmUuPC9leGNlcHRpb24+DQorICAgICAgICB2b2lkIFVwZGF0ZShieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGNvdW50KTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBVcGRhdGVzIHRoZSBjdXJyZW50IGNoZWNrc3VtIHdpdGggdGhlIGRhdGEgZnJvbSBhIHN0cmluZw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIHN0cmluZyB0byB1cGRhdGUgdGhlIGNoZWNrc3VtIHdpdGg8L3BhcmFtPg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPlRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGNvbnZlcnRlZCBieSB0aGUgVVRGLTggZW5jb2Rpbmc8L3JlbWFya3M+DQorICAgICAgICB2b2lkIFVwZGF0ZShzdHJpbmcgZGF0YSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVXBkYXRlcyB0aGUgY3VycmVudCBjaGVja3N1bSB3aXRoIHRoZSBkYXRhIGZyb20gYSBzdHJpbmcsIHVzaW5nIGEgc3BlY2lmaWMgZW5jb2RpbmcNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPlRoZSBzdHJpbmcgdG8gdXBkYXRlIHRoZSBjaGVja3N1bSB3aXRoPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW5jb2RpbmciPlRoZSBlbmNvZGluZyB0byB1c2U8L3BhcmFtPg0KKyAgICAgICAgdm9pZCBVcGRhdGUoc3RyaW5nIGRhdGEsIEVuY29kaW5nIGVuY29kaW5nKTsNCisgICAgfQ0KKw0KKw0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBSZXByZXNlbnRzIHRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGNhbGxlZCBmcm9tIGEgY29kZWMgd2hlbiBuZXcgZGF0YQ0KKyAgICAvLy8gYXJlIGF2YWlsYWJsZS4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgLy8vIDxwYXJhbXJlZiBuYW1lPSJkYXRhIj5UaGUgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBwcm9jZXNzZWQgZGF0YTwvcGFyYW1yZWY+DQorICAgIC8vLyA8cGFyYW1yZWYgbmFtZT0ic3RhcnRJbmRleCI+VGhlIGluZGV4IG9mIHRoZSBmaXJzdCBwcm9jZXNzZWQgYnl0ZSBpbiA8Yz5kYXRhPC9jPjwvcGFyYW1yZWY+DQorICAgIC8vLyA8cGFyYW1yZWYgbmFtZT0iY291bnQiPlRoZSBudW1iZXIgb2YgcHJvY2Vzc2VkIGJ5dGVzIGF2YWlsYWJsZTwvcGFyYW1yZWY+DQorICAgIC8vLyA8cmVtYXJrcz5PbiByZXR1cm4gZnJvbSB0aGlzIG1ldGhvZCwgdGhlIGRhdGEgbWF5IGJlIG92ZXJ3cml0dGVuLCBzbyBncmFiIGl0IHdoaWxlIHlvdSBjYW4uDQorICAgIC8vLyBZb3UgY2Fubm90IGFzc3VtZSB0aGF0IHN0YXJ0SW5kZXggd2lsbCBiZSB6ZXJvLg0KKyAgICAvLy8gPC9yZW1hcmtzPg0KKyAgICBwdWJsaWMgZGVsZWdhdGUgdm9pZCBEYXRhQXZhaWxhYmxlSGFuZGxlcihieXRlW10gZGF0YSwgaW50IHN0YXJ0SW5kZXgsIGludCBjb3VudCk7DQorDQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIERlY2xhcmVzIG1ldGhvZHMgYW5kIGV2ZW50cyBmb3IgaW1wbGVtZW50aW5nIGNvbXByZXNzb3JzL2RlY29tcHJlc3NvcnMNCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIGludGVyZmFjZSBDb2RlYw0KKyAgICB7DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gT2NjdXJzIHdoZW4gbW9yZSBwcm9jZXNzZWQgZGF0YSBhcmUgYXZhaWxhYmxlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGV2ZW50IERhdGFBdmFpbGFibGVIYW5kbGVyIERhdGFBdmFpbGFibGU7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQWRkcyBtb3JlIGRhdGEgdG8gdGhlIGNvZGVjIHRvIGJlIHByb2Nlc3NlZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPkJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSBhZGRlZCB0byB0aGUgY29kZWM8L3BhcmFtPg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPkFkZGluZyBkYXRhIG1heSwgb3IgbWF5IG5vdCwgcmFpc2UgdGhlIDxjPkRhdGFBdmFpbGFibGU8L2M+IGV2ZW50PC9yZW1hcmtzPg0KKyAgICAgICAgdm9pZCBBZGQoYnl0ZVtdIGRhdGEpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEFkZHMgbW9yZSBkYXRhIHRvIHRoZSBjb2RlYyB0byBiZSBwcm9jZXNzZWQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5CeXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgYWRkZWQgdG8gdGhlIGNvZGVjPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij5UaGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ5dGUgdG8gYWRkIGZyb20gPGM+ZGF0YTwvYz48L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+VGhlIG51bWJlciBvZiBieXRlcyB0byBhZGQ8L3BhcmFtPg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPkFkZGluZyBkYXRhIG1heSwgb3IgbWF5IG5vdCwgcmFpc2UgdGhlIDxjPkRhdGFBdmFpbGFibGU8L2M+IGV2ZW50PC9yZW1hcmtzPg0KKyAgICAgICAgdm9pZCBBZGQoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBjb3VudCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gRmluaXNoZXMgdXAgYW55IHBlbmRpbmcgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHByb2Nlc3NlZCBhbmQgaGFuZGxlZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIEZpbmlzaCgpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEdldHMgdGhlIGNoZWNrc3VtIG9mIHRoZSBkYXRhIHRoYXQgaGFzIGJlZW4gYWRkZWQgc28gZmFyDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgdWludCBDaGVja3N1bSB7IGdldDsgfQ0KKw0KKw0KKyAgICB9DQorDQorICAgICNlbmRyZWdpb24NCisNCisgICAgI3JlZ2lvbiBDbGFzc2VzDQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEVuY2Fwc3VsYXRlcyBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBaTGliIGxpYnJhcnkNCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIGNsYXNzIEluZm8NCisgICAgew0KKyAgICAgICAgI3JlZ2lvbiBETEwgaW1wb3J0cw0KKyAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIHVpbnQgemxpYkNvbXBpbGVGbGFncygpOw0KKw0KKyAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIHN0cmluZyB6bGliVmVyc2lvbigpOw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAgICAgI3JlZ2lvbiBQcml2YXRlIHN0dWZmDQorICAgICAgICBwcml2YXRlIHVpbnQgX2ZsYWdzOw0KKw0KKyAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRoYXQgdW5wYWNrcyBhIGJpdHNpemUgbWFzaw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGJpdFNpemUodWludCBiaXRzKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHN3aXRjaCAoYml0cykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIDE2Ow0KKyAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiAzMjsNCisgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gNjQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiAtMTsNCisgICAgICAgIH0NCisgICAgICAgICNlbmRyZWdpb24NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIHRoZSA8Yz5JbmZvPC9jPiBjbGFzcy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgSW5mbygpDQorICAgICAgICB7DQorICAgICAgICAgICAgX2ZsYWdzID0gemxpYkNvbXBpbGVGbGFncygpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRydWUgaWYgdGhlIGxpYnJhcnkgaXMgY29tcGlsZWQgd2l0aCBkZWJ1ZyBpbmZvDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRGVidWdJbmZvIHsgZ2V0IHsgcmV0dXJuIDAgIT0gKF9mbGFncyAmIDB4MTAwKTsgfSB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVHJ1ZSBpZiB0aGUgbGlicmFyeSBpcyBjb21waWxlZCB3aXRoIGFzc2VtYmx5IG9wdGltaXphdGlvbnMNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgYm9vbCBVc2VzQXNzZW1ibHlDb2RlIHsgZ2V0IHsgcmV0dXJuIDAgIT0gKF9mbGFncyAmIDB4MjAwKTsgfSB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gR2V0cyB0aGUgc2l6ZSBvZiB0aGUgdW5zaWduZWQgaW50IHRoYXQgd2FzIGNvbXBpbGVkIGludG8gWmxpYg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBpbnQgU2l6ZU9mVUludCB7IGdldCB7IHJldHVybiBiaXRTaXplKF9mbGFncyAmIDMpOyB9IH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBHZXRzIHRoZSBzaXplIG9mIHRoZSB1bnNpZ25lZCBsb25nIHRoYXQgd2FzIGNvbXBpbGVkIGludG8gWmxpYg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBpbnQgU2l6ZU9mVUxvbmcgeyBnZXQgeyByZXR1cm4gYml0U2l6ZSgoX2ZsYWdzID4+IDIpICYgMyk7IH0gfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEdldHMgdGhlIHNpemUgb2YgdGhlIHBvaW50ZXJzIHRoYXQgd2VyZSBjb21waWxlZCBpbnRvIFpsaWINCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgaW50IFNpemVPZlBvaW50ZXIgeyBnZXQgeyByZXR1cm4gYml0U2l6ZSgoX2ZsYWdzID4+IDQpICYgMyk7IH0gfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEdldHMgdGhlIHNpemUgb2YgdGhlIHpfb2ZmX3QgdHlwZSB0aGF0IHdhcyBjb21waWxlZCBpbnRvIFpsaWINCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgaW50IFNpemVPZk9mZnNldCB7IGdldCB7IHJldHVybiBiaXRTaXplKChfZmxhZ3MgPj4gNikgJiAzKTsgfSB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gR2V0cyB0aGUgdmVyc2lvbiBvZiBaTGliIGFzIGEgc3RyaW5nLCBlLmcuICIxLjIuMSINCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBWZXJzaW9uIHsgZ2V0IHsgcmV0dXJuIHpsaWJWZXJzaW9uKCk7IH0gfQ0KKyAgICB9DQorDQorICAgICNlbmRyZWdpb24NCisNCit9DQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvRG90WkxpYi5jc3Byb2ogYi96bGliL3NyYy9jb250cmliL2RvdHpsaWIvRG90WkxpYi9Eb3RaTGliLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWVlYjg1Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvRG90WkxpYi5jc3Byb2oKQEAgLTAsMCArMSwxNDEgQEAKKzxWaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KKyAgICA8Q1NIQVJQDQorICAgICAgICBQcm9qZWN0VHlwZSA9ICJMb2NhbCINCisgICAgICAgIFByb2R1Y3RWZXJzaW9uID0gIjcuMTAuMzA3NyINCisgICAgICAgIFNjaGVtYVZlcnNpb24gPSAiMi4wIg0KKyAgICAgICAgUHJvamVjdEd1aWQgPSAie0JCMUVFMEIxLTE4MDgtNDZDQi1CNzg2LTk0OUQ5MTExN0ZDNX0iDQorICAgID4NCisgICAgICAgIDxCdWlsZD4NCisgICAgICAgICAgICA8U2V0dGluZ3MNCisgICAgICAgICAgICAgICAgQXBwbGljYXRpb25JY29uID0gIiINCisgICAgICAgICAgICAgICAgQXNzZW1ibHlLZXlDb250YWluZXJOYW1lID0gIiINCisgICAgICAgICAgICAgICAgQXNzZW1ibHlOYW1lID0gIkRvdFpMaWIiDQorICAgICAgICAgICAgICAgIEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGUgPSAiIg0KKyAgICAgICAgICAgICAgICBEZWZhdWx0Q2xpZW50U2NyaXB0ID0gIkpTY3JpcHQiDQorICAgICAgICAgICAgICAgIERlZmF1bHRIVE1MUGFnZUxheW91dCA9ICJHcmlkIg0KKyAgICAgICAgICAgICAgICBEZWZhdWx0VGFyZ2V0U2NoZW1hID0gIklFNTAiDQorICAgICAgICAgICAgICAgIERlbGF5U2lnbiA9ICJmYWxzZSINCisgICAgICAgICAgICAgICAgT3V0cHV0VHlwZSA9ICJMaWJyYXJ5Ig0KKyAgICAgICAgICAgICAgICBQcmVCdWlsZEV2ZW50ID0gIiINCisgICAgICAgICAgICAgICAgUG9zdEJ1aWxkRXZlbnQgPSAiIg0KKyAgICAgICAgICAgICAgICBSb290TmFtZXNwYWNlID0gIkRvdFpMaWIiDQorICAgICAgICAgICAgICAgIFJ1blBvc3RCdWlsZEV2ZW50ID0gIk9uQnVpbGRTdWNjZXNzIg0KKyAgICAgICAgICAgICAgICBTdGFydHVwT2JqZWN0ID0gIiINCisgICAgICAgICAgICA+DQorICAgICAgICAgICAgICAgIDxDb25maWcNCisgICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiRGVidWciDQorICAgICAgICAgICAgICAgICAgICBBbGxvd1Vuc2FmZUJsb2NrcyA9ICJmYWxzZSINCisgICAgICAgICAgICAgICAgICAgIEJhc2VBZGRyZXNzID0gIjI4NTIxMjY3MiINCisgICAgICAgICAgICAgICAgICAgIENoZWNrRm9yT3ZlcmZsb3dVbmRlcmZsb3cgPSAiZmFsc2UiDQorICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uT3ZlcnJpZGVGaWxlID0gIiINCisgICAgICAgICAgICAgICAgICAgIERlZmluZUNvbnN0YW50cyA9ICJERUJVRztUUkFDRSINCisgICAgICAgICAgICAgICAgICAgIERvY3VtZW50YXRpb25GaWxlID0gImRvY3NcRG90WkxpYi54bWwiDQorICAgICAgICAgICAgICAgICAgICBEZWJ1Z1N5bWJvbHMgPSAidHJ1ZSINCisgICAgICAgICAgICAgICAgICAgIEZpbGVBbGlnbm1lbnQgPSAiNDA5NiINCisgICAgICAgICAgICAgICAgICAgIEluY3JlbWVudGFsQnVpbGQgPSAiZmFsc2UiDQorICAgICAgICAgICAgICAgICAgICBOb1N0ZExpYiA9ICJmYWxzZSINCisgICAgICAgICAgICAgICAgICAgIE5vV2FybiA9ICIxNTkxIg0KKyAgICAgICAgICAgICAgICAgICAgT3B0aW1pemUgPSAiZmFsc2UiDQorICAgICAgICAgICAgICAgICAgICBPdXRwdXRQYXRoID0gImJpblxEZWJ1Z1wiDQorICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckZvckNvbUludGVyb3AgPSAiZmFsc2UiDQorICAgICAgICAgICAgICAgICAgICBSZW1vdmVJbnRlZ2VyQ2hlY2tzID0gImZhbHNlIg0KKyAgICAgICAgICAgICAgICAgICAgVHJlYXRXYXJuaW5nc0FzRXJyb3JzID0gImZhbHNlIg0KKyAgICAgICAgICAgICAgICAgICAgV2FybmluZ0xldmVsID0gIjQiDQorICAgICAgICAgICAgICAgIC8+DQorICAgICAgICAgICAgICAgIDxDb25maWcNCisgICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiUmVsZWFzZSINCisgICAgICAgICAgICAgICAgICAgIEFsbG93VW5zYWZlQmxvY2tzID0gImZhbHNlIg0KKyAgICAgICAgICAgICAgICAgICAgQmFzZUFkZHJlc3MgPSAiMjg1MjEyNjcyIg0KKyAgICAgICAgICAgICAgICAgICAgQ2hlY2tGb3JPdmVyZmxvd1VuZGVyZmxvdyA9ICJmYWxzZSINCisgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25PdmVycmlkZUZpbGUgPSAiIg0KKyAgICAgICAgICAgICAgICAgICAgRGVmaW5lQ29uc3RhbnRzID0gIlRSQUNFIg0KKyAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRhdGlvbkZpbGUgPSAiZG9jc1xEb3RaTGliLnhtbCINCisgICAgICAgICAgICAgICAgICAgIERlYnVnU3ltYm9scyA9ICJmYWxzZSINCisgICAgICAgICAgICAgICAgICAgIEZpbGVBbGlnbm1lbnQgPSAiNDA5NiINCisgICAgICAgICAgICAgICAgICAgIEluY3JlbWVudGFsQnVpbGQgPSAiZmFsc2UiDQorICAgICAgICAgICAgICAgICAgICBOb1N0ZExpYiA9ICJmYWxzZSINCisgICAgICAgICAgICAgICAgICAgIE5vV2FybiA9ICIiDQorICAgICAgICAgICAgICAgICAgICBPcHRpbWl6ZSA9ICJ0cnVlIg0KKyAgICAgICAgICAgICAgICAgICAgT3V0cHV0UGF0aCA9ICJiaW5cUmVsZWFzZVwiDQorICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckZvckNvbUludGVyb3AgPSAiZmFsc2UiDQorICAgICAgICAgICAgICAgICAgICBSZW1vdmVJbnRlZ2VyQ2hlY2tzID0gImZhbHNlIg0KKyAgICAgICAgICAgICAgICAgICAgVHJlYXRXYXJuaW5nc0FzRXJyb3JzID0gImZhbHNlIg0KKyAgICAgICAgICAgICAgICAgICAgV2FybmluZ0xldmVsID0gIjQiDQorICAgICAgICAgICAgICAgIC8+DQorICAgICAgICAgICAgPC9TZXR0aW5ncz4NCisgICAgICAgICAgICA8UmVmZXJlbmNlcz4NCisgICAgICAgICAgICAgICAgPFJlZmVyZW5jZQ0KKyAgICAgICAgICAgICAgICAgICAgTmFtZSA9ICJTeXN0ZW0iDQorICAgICAgICAgICAgICAgICAgICBBc3NlbWJseU5hbWUgPSAiU3lzdGVtIg0KKyAgICAgICAgICAgICAgICAgICAgSGludFBhdGggPSAiQzpcV0lOTlRcTWljcm9zb2Z0Lk5FVFxGcmFtZXdvcmtcdjEuMS40MzIyXFN5c3RlbS5kbGwiDQorICAgICAgICAgICAgICAgIC8+DQorICAgICAgICAgICAgICAgIDxSZWZlcmVuY2UNCisgICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiU3lzdGVtLkRhdGEiDQorICAgICAgICAgICAgICAgICAgICBBc3NlbWJseU5hbWUgPSAiU3lzdGVtLkRhdGEiDQorICAgICAgICAgICAgICAgICAgICBIaW50UGF0aCA9ICJDOlxXSU5OVFxNaWNyb3NvZnQuTkVUXEZyYW1ld29ya1x2MS4xLjQzMjJcU3lzdGVtLkRhdGEuZGxsIg0KKyAgICAgICAgICAgICAgICAvPg0KKyAgICAgICAgICAgICAgICA8UmVmZXJlbmNlDQorICAgICAgICAgICAgICAgICAgICBOYW1lID0gIlN5c3RlbS5YTUwiDQorICAgICAgICAgICAgICAgICAgICBBc3NlbWJseU5hbWUgPSAiU3lzdGVtLlhtbCINCisgICAgICAgICAgICAgICAgICAgIEhpbnRQYXRoID0gIkM6XFdJTk5UXE1pY3Jvc29mdC5ORVRcRnJhbWV3b3JrXHYxLjEuNDMyMlxTeXN0ZW0uWE1MLmRsbCINCisgICAgICAgICAgICAgICAgLz4NCisgICAgICAgICAgICAgICAgPFJlZmVyZW5jZQ0KKyAgICAgICAgICAgICAgICAgICAgTmFtZSA9ICJudW5pdC5mcmFtZXdvcmsiDQorICAgICAgICAgICAgICAgICAgICBBc3NlbWJseU5hbWUgPSAibnVuaXQuZnJhbWV3b3JrIg0KKyAgICAgICAgICAgICAgICAgICAgSGludFBhdGggPSAiRTpcYXBwc1xOVW5pdCBWMi4xXFxiaW5cbnVuaXQuZnJhbWV3b3JrLmRsbCINCisgICAgICAgICAgICAgICAgICAgIEFzc2VtYmx5Rm9sZGVyS2V5ID0gImhrbG1cZG5cbnVuaXQuZnJhbWV3b3JrIg0KKyAgICAgICAgICAgICAgICAvPg0KKyAgICAgICAgICAgIDwvUmVmZXJlbmNlcz4NCisgICAgICAgIDwvQnVpbGQ+DQorICAgICAgICA8RmlsZXM+DQorICAgICAgICAgICAgPEluY2x1ZGU+DQorICAgICAgICAgICAgICAgIDxGaWxlDQorICAgICAgICAgICAgICAgICAgICBSZWxQYXRoID0gIkFzc2VtYmx5SW5mby5jcyINCisgICAgICAgICAgICAgICAgICAgIFN1YlR5cGUgPSAiQ29kZSINCisgICAgICAgICAgICAgICAgICAgIEJ1aWxkQWN0aW9uID0gIkNvbXBpbGUiDQorICAgICAgICAgICAgICAgIC8+DQorICAgICAgICAgICAgICAgIDxGaWxlDQorICAgICAgICAgICAgICAgICAgICBSZWxQYXRoID0gIkNoZWNrc3VtSW1wbC5jcyINCisgICAgICAgICAgICAgICAgICAgIFN1YlR5cGUgPSAiQ29kZSINCisgICAgICAgICAgICAgICAgICAgIEJ1aWxkQWN0aW9uID0gIkNvbXBpbGUiDQorICAgICAgICAgICAgICAgIC8+DQorICAgICAgICAgICAgICAgIDxGaWxlDQorICAgICAgICAgICAgICAgICAgICBSZWxQYXRoID0gIkNpcmN1bGFyQnVmZmVyLmNzIg0KKyAgICAgICAgICAgICAgICAgICAgU3ViVHlwZSA9ICJDb2RlIg0KKyAgICAgICAgICAgICAgICAgICAgQnVpbGRBY3Rpb24gPSAiQ29tcGlsZSINCisgICAgICAgICAgICAgICAgLz4NCisgICAgICAgICAgICAgICAgPEZpbGUNCisgICAgICAgICAgICAgICAgICAgIFJlbFBhdGggPSAiQ29kZWNCYXNlLmNzIg0KKyAgICAgICAgICAgICAgICAgICAgU3ViVHlwZSA9ICJDb2RlIg0KKyAgICAgICAgICAgICAgICAgICAgQnVpbGRBY3Rpb24gPSAiQ29tcGlsZSINCisgICAgICAgICAgICAgICAgLz4NCisgICAgICAgICAgICAgICAgPEZpbGUNCisgICAgICAgICAgICAgICAgICAgIFJlbFBhdGggPSAiRGVmbGF0ZXIuY3MiDQorICAgICAgICAgICAgICAgICAgICBTdWJUeXBlID0gIkNvZGUiDQorICAgICAgICAgICAgICAgICAgICBCdWlsZEFjdGlvbiA9ICJDb21waWxlIg0KKyAgICAgICAgICAgICAgICAvPg0KKyAgICAgICAgICAgICAgICA8RmlsZQ0KKyAgICAgICAgICAgICAgICAgICAgUmVsUGF0aCA9ICJEb3RaTGliLmNzIg0KKyAgICAgICAgICAgICAgICAgICAgU3ViVHlwZSA9ICJDb2RlIg0KKyAgICAgICAgICAgICAgICAgICAgQnVpbGRBY3Rpb24gPSAiQ29tcGlsZSINCisgICAgICAgICAgICAgICAgLz4NCisgICAgICAgICAgICAgICAgPEZpbGUNCisgICAgICAgICAgICAgICAgICAgIFJlbFBhdGggPSAiR1ppcFN0cmVhbS5jcyINCisgICAgICAgICAgICAgICAgICAgIFN1YlR5cGUgPSAiQ29kZSINCisgICAgICAgICAgICAgICAgICAgIEJ1aWxkQWN0aW9uID0gIkNvbXBpbGUiDQorICAgICAgICAgICAgICAgIC8+DQorICAgICAgICAgICAgICAgIDxGaWxlDQorICAgICAgICAgICAgICAgICAgICBSZWxQYXRoID0gIkluZmxhdGVyLmNzIg0KKyAgICAgICAgICAgICAgICAgICAgU3ViVHlwZSA9ICJDb2RlIg0KKyAgICAgICAgICAgICAgICAgICAgQnVpbGRBY3Rpb24gPSAiQ29tcGlsZSINCisgICAgICAgICAgICAgICAgLz4NCisgICAgICAgICAgICAgICAgPEZpbGUNCisgICAgICAgICAgICAgICAgICAgIFJlbFBhdGggPSAiVW5pdFRlc3RzLmNzIg0KKyAgICAgICAgICAgICAgICAgICAgU3ViVHlwZSA9ICJDb2RlIg0KKyAgICAgICAgICAgICAgICAgICAgQnVpbGRBY3Rpb24gPSAiQ29tcGlsZSINCisgICAgICAgICAgICAgICAgLz4NCisgICAgICAgICAgICA8L0luY2x1ZGU+DQorICAgICAgICA8L0ZpbGVzPg0KKyAgICA8L0NTSEFSUD4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQorDQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvR1ppcFN0cmVhbS5jcyBiL3psaWIvc3JjL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0daaXBTdHJlYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE2MTMwMAotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0daaXBTdHJlYW0uY3MKQEAgLTAsMCArMSwzMDEgQEAKKy8vDQorLy8gqSBDb3B5cmlnaHQgSGVucmlrIFJhdm4gMjAwNA0KKy8vDQorLy8gVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBhcmUgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuDQorLy8gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpDQorLy8NCisNCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLklPOw0KK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsNCisNCituYW1lc3BhY2UgRG90WkxpYg0KK3sNCisJLy8vIDxzdW1tYXJ5Pg0KKwkvLy8gSW1wbGVtZW50cyBhIGNvbXByZXNzZWQgPHNlZSBjcmVmPSJTdHJlYW0iLz4sIGluIEdaaXAgKC5neikgZm9ybWF0Lg0KKwkvLy8gPC9zdW1tYXJ5Pg0KKwlwdWJsaWMgY2xhc3MgR1ppcFN0cmVhbSA6IFN0cmVhbSwgSURpc3Bvc2FibGUNCisJew0KKyAgICAgICAgI3JlZ2lvbiBEbGwgSW1wb3J0cw0KKyAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wsIENoYXJTZXQ9Q2hhclNldC5BbnNpKV0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBJbnRQdHIgZ3pvcGVuKHN0cmluZyBuYW1lLCBzdHJpbmcgbW9kZSk7DQorDQorICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGd6Y2xvc2UoSW50UHRyIGd6RmlsZSk7DQorDQorICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGd6d3JpdGUoSW50UHRyIGd6RmlsZSwgaW50IGRhdGEsIGludCBsZW5ndGgpOw0KKw0KKyAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBnenJlYWQoSW50UHRyIGd6RmlsZSwgaW50IGRhdGEsIGludCBsZW5ndGgpOw0KKw0KKyAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBnemdldGMoSW50UHRyIGd6RmlsZSk7DQorDQorICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGd6cHV0YyhJbnRQdHIgZ3pGaWxlLCBpbnQgYyk7DQorDQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAjcmVnaW9uIFByaXZhdGUgZGF0YQ0KKyAgICAgICAgcHJpdmF0ZSBJbnRQdHIgX2d6RmlsZTsNCisgICAgICAgIHByaXZhdGUgYm9vbCBfaXNEaXNwb3NlZCA9IGZhbHNlOw0KKyAgICAgICAgcHJpdmF0ZSBib29sIF9pc1dyaXRpbmc7DQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAjcmVnaW9uIENvbnN0cnVjdG9ycw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBuZXcgZmlsZSBhcyBhIHdyaXRlYWJsZSBHWmlwU3RyZWFtDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaWxlTmFtZSI+VGhlIG5hbWUgb2YgdGhlIGNvbXByZXNzZWQgZmlsZSB0byBjcmVhdGU8L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZXZlbCI+VGhlIGNvbXByZXNzaW9uIGxldmVsIHRvIHVzZSB3aGVuIGFkZGluZyBkYXRhPC9wYXJhbT4NCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IlpMaWJFeGNlcHRpb24iPklmIGFuIGVycm9yIG9jY3VycmVkIGluIHRoZSBpbnRlcm5hbCB6bGliIGZ1bmN0aW9uPC9leGNlcHRpb24+DQorCQlwdWJsaWMgR1ppcFN0cmVhbShzdHJpbmcgZmlsZU5hbWUsIENvbXByZXNzTGV2ZWwgbGV2ZWwpDQorCQl7DQorICAgICAgICAgICAgX2lzV3JpdGluZyA9IHRydWU7DQorICAgICAgICAgICAgX2d6RmlsZSA9IGd6b3BlbihmaWxlTmFtZSwgU3RyaW5nLkZvcm1hdCgid2J7MH0iLCAoaW50KWxldmVsKSk7DQorICAgICAgICAgICAgaWYgKF9nekZpbGUgPT0gSW50UHRyLlplcm8pDQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBaTGliRXhjZXB0aW9uKC0xLCAiQ291bGQgbm90IG9wZW4gIiArIGZpbGVOYW1lKTsNCisJCX0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBPcGVucyBhbiBleGlzdGluZyBmaWxlIGFzIGEgcmVhZGFibGUgR1ppcFN0cmVhbQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmlsZU5hbWUiPlRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIG9wZW48L3BhcmFtPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iWkxpYkV4Y2VwdGlvbiI+SWYgYW4gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGludGVybmFsIHpsaWIgZnVuY3Rpb248L2V4Y2VwdGlvbj4NCisgICAgICAgIHB1YmxpYyBHWmlwU3RyZWFtKHN0cmluZyBmaWxlTmFtZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBfaXNXcml0aW5nID0gZmFsc2U7DQorICAgICAgICAgICAgX2d6RmlsZSA9IGd6b3BlbihmaWxlTmFtZSwgInJiIik7DQorICAgICAgICAgICAgaWYgKF9nekZpbGUgPT0gSW50UHRyLlplcm8pDQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBaTGliRXhjZXB0aW9uKC0xLCAiQ291bGQgbm90IG9wZW4gIiArIGZpbGVOYW1lKTsNCisNCisgICAgICAgIH0NCisgICAgICAgICNlbmRyZWdpb24NCisNCisgICAgICAgICNyZWdpb24gQWNjZXNzIHByb3BlcnRpZXMNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRydWUgb2YgdGhpcyBzdHJlYW0gY2FuIGJlIHJlYWQgZnJvbSwgZmFsc2Ugb3RoZXJ3aXNlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgQ2FuUmVhZA0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuICFfaXNXcml0aW5nOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIGZhbHNlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIENhblNlZWsNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgdHNyZWFtIGlzIHdyaXRlYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgQ2FuV3JpdGUNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBfaXNXcml0aW5nOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgICNlbmRyZWdpb24NCisNCisgICAgICAgICNyZWdpb24gRGVzdHJ1Y3RvciAmIElEaXNwb3NlIHN0dWZmDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gRGVzdHJveXMgdGhpcyBpbnN0YW5jZQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIH5HWmlwU3RyZWFtKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBjbGVhblVwKGZhbHNlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDbG9zZXMgdGhlIGV4dGVybmFsIGZpbGUgaGFuZGxlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgY2xlYW5VcCh0cnVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vIERvZXMgdGhlIGFjdHVhbCBjbG9zaW5nIG9mIHRoZSBmaWxlIGhhbmRsZS4NCisgICAgICAgIHByaXZhdGUgdm9pZCBjbGVhblVwKGJvb2wgaXNEaXNwb3NpbmcpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGd6Y2xvc2UoX2d6RmlsZSk7DQorICAgICAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAjcmVnaW9uIEJhc2ljIHJlYWRpbmcgYW5kIHdyaXRpbmcNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBBdHRlbXB0cyB0byByZWFkIGEgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJ1ZmZlciI+VGhlIGRlc3RpbmF0aW9uIGRhdGEgYnVmZmVyPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij5UaGUgaW5kZXggb2YgdGhlIGZpcnN0IGRlc3RpbmF0aW9uIGJ5dGUgaW4gPGM+YnVmZmVyPC9jPjwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVlc3RlZDwvcGFyYW0+DQorICAgICAgICAvLy8gPHJldHVybnM+VGhlIG51bWJlciBvZiBieXRlcyByZWFkPC9yZXR1cm5zPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnROdWxsRXhjZXB0aW9uIj5JZiA8Yz5idWZmZXI8L2M+IGlzIG51bGw8L2V4Y2VwdGlvbj4NCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiI+SWYgPGM+Y291bnQ8L2M+IG9yIDxjPm9mZnNldDwvYz4gYXJlIG5lZ2F0aXZlPC9leGNlcHRpb24+DQorICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudEV4Y2VwdGlvbiI+SWYgPGM+b2Zmc2V0PC9jPiAgKyA8Yz5jb3VudDwvYz4gaXMgJmd0OyBidWZmZXIuTGVuZ3RoPC9leGNlcHRpb24+DQorICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJOb3RTdXBwb3J0ZWRFeGNlcHRpb24iPklmIHRoaXMgc3RyZWFtIGlzIG5vdCByZWFkYWJsZS48L2V4Y2VwdGlvbj4NCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9Ik9iamVjdERpc3Bvc2VkRXhjZXB0aW9uIj5JZiB0aGlzIHN0cmVhbSBoYXMgYmVlbiBkaXNwb3NlZC48L2V4Y2VwdGlvbj4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKCFDYW5SZWFkKSB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgY291bnQgPCAwKSB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgaWYgKChvZmZzZXQrY291bnQpID4gYnVmZmVyLkxlbmd0aCkgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgaWYgKF9pc0Rpc3Bvc2VkKSB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIkdaaXBTdHJlYW0iKTsNCisNCisgICAgICAgICAgICBHQ0hhbmRsZSBoID0gR0NIYW5kbGUuQWxsb2MoYnVmZmVyLCBHQ0hhbmRsZVR5cGUuUGlubmVkKTsNCisgICAgICAgICAgICBpbnQgcmVzdWx0Ow0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ3pyZWFkKF9nekZpbGUsIGguQWRkck9mUGlubmVkT2JqZWN0KCkuVG9JbnQzMigpICsgb2Zmc2V0LCBjb3VudCk7DQorICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKQ0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZpbmFsbHkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGguRnJlZSgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEF0dGVtcHRzIHRvIHJlYWQgYSBzaW5nbGUgYnl0ZSBmcm9tIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBieXRlIHRoYXQgd2FzIHJlYWQsIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3Igb3IgRW5kLU9mLUZpbGU8L3JldHVybnM+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWRCeXRlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoIUNhblJlYWQpIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsNCisgICAgICAgICAgICBpZiAoX2lzRGlzcG9zZWQpIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiR1ppcFN0cmVhbSIpOw0KKyAgICAgICAgICAgIHJldHVybiBnemdldGMoX2d6RmlsZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgbnVtYmVyIG9mIGJ5dGVzIHRvIHRoZSBzdHJlYW0NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJ1ZmZlciI+PC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij48L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+PC9wYXJhbT4NCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+SWYgPGM+YnVmZmVyPC9jPiBpcyBudWxsPC9leGNlcHRpb24+DQorICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24iPklmIDxjPmNvdW50PC9jPiBvciA8Yz5vZmZzZXQ8L2M+IGFyZSBuZWdhdGl2ZTwvZXhjZXB0aW9uPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRFeGNlcHRpb24iPklmIDxjPm9mZnNldDwvYz4gICsgPGM+Y291bnQ8L2M+IGlzICZndDsgYnVmZmVyLkxlbmd0aDwvZXhjZXB0aW9uPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIj5JZiB0aGlzIHN0cmVhbSBpcyBub3Qgd3JpdGVhYmxlLjwvZXhjZXB0aW9uPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24iPklmIHRoaXMgc3RyZWFtIGhhcyBiZWVuIGRpc3Bvc2VkLjwvZXhjZXB0aW9uPg0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmICghQ2FuV3JpdGUpIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsNCisgICAgICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oKTsNCisgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsNCisgICAgICAgICAgICBpZiAoKG9mZnNldCtjb3VudCkgPiBidWZmZXIuTGVuZ3RoKSB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oKTsNCisgICAgICAgICAgICBpZiAoX2lzRGlzcG9zZWQpIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiR1ppcFN0cmVhbSIpOw0KKw0KKyAgICAgICAgICAgIEdDSGFuZGxlIGggPSBHQ0hhbmRsZS5BbGxvYyhidWZmZXIsIEdDSGFuZGxlVHlwZS5QaW5uZWQpOw0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IGd6d3JpdGUoX2d6RmlsZSwgaC5BZGRyT2ZQaW5uZWRPYmplY3QoKS5Ub0ludDMyKCkgKyBvZmZzZXQsIGNvdW50KTsNCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApDQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZmluYWxseQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaC5GcmVlKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIHNpbmdsZSBieXRlIHRvIHRoZSBzdHJlYW0NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj5UaGUgYnl0ZSB0byBhZGQgdG8gdGhlIHN0cmVhbS48L3BhcmFtPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIj5JZiB0aGlzIHN0cmVhbSBpcyBub3Qgd3JpdGVhYmxlLjwvZXhjZXB0aW9uPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24iPklmIHRoaXMgc3RyZWFtIGhhcyBiZWVuIGRpc3Bvc2VkLjwvZXhjZXB0aW9uPg0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCeXRlKGJ5dGUgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKCFDYW5Xcml0ZSkgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOw0KKyAgICAgICAgICAgIGlmIChfaXNEaXNwb3NlZCkgdGhyb3cgbmV3IE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uKCJHWmlwU3RyZWFtIik7DQorDQorICAgICAgICAgICAgaW50IHJlc3VsdCA9IGd6cHV0YyhfZ3pGaWxlLCAoaW50KXZhbHVlKTsNCisgICAgICAgICAgICBpZiAocmVzdWx0IDwgMCkNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7DQorICAgICAgICB9DQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAjcmVnaW9uIFBvc2l0aW9uICYgbGVuZ3RoIHN0dWZmDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTm90IHN1cHBvcnRlZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIj5BbHdheXMgdGhyb3duPC9leGNlcHRpb24+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXRMZW5ndGgobG9uZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gIE5vdCBzdXBwcG9ydGVkLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij48L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvcmlnaW4iPjwvcGFyYW0+DQorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIj5BbHdheXMgdGhyb3duPC9leGNlcHRpb24+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBTZWVrKGxvbmcgb2Zmc2V0LCBTZWVrT3JpZ2luIG9yaWdpbikNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gRmx1c2hlcyB0aGUgPGM+R1ppcFN0cmVhbTwvYz4uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPkluIHRoaXMgaW1wbGVtZW50YXRpb24sIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4gVGhpcyBpcyBiZWNhdXNlIGV4Y2Vzc2l2ZQ0KKyAgICAgICAgLy8vIGZsdXNoaW5nIG1heSBkZWdyYWRlIHRoZSBhY2hpZXZhYmxlIGNvbXByZXNzaW9uIHJhdGVzLjwvcmVtYXJrcz4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBsZWZ0IGVtcHR5IG9uIHB1cnBvc2UNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBHZXRzL3NldHMgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIDxjPkdaaXBTdHJlYW08L2M+LiBOb3Qgc3VwcHBvcnRlZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHJlbWFya3M+SW4gdGhpcyBpbXBsZW1lbnRhdGlvbiB0aGlzIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQ8L3JlbWFya3M+DQorICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJOb3RTdXBwb3J0ZWRFeGNlcHRpb24iPkFsd2F5cyB0aHJvd248L2V4Y2VwdGlvbj4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBsb25nIFBvc2l0aW9uDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHNldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBHZXRzIHRoZSBzaXplIG9mIHRoZSBzdHJlYW0uIE5vdCBzdXBwcG9ydGVkLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cmVtYXJrcz5JbiB0aGlzIGltcGxlbWVudGF0aW9uIHRoaXMgcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZDwvcmVtYXJrcz4NCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9Ik5vdFN1cHBvcnRlZEV4Y2VwdGlvbiI+QWx3YXlzIHRocm93bjwvZXhjZXB0aW9uPg0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgTGVuZ3RoDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0luZmxhdGVyLmNzIGIvemxpYi9zcmMvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvSW5mbGF0ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkNTQ1MQotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0luZmxhdGVyLmNzCkBAIC0wLDAgKzEsMTA1IEBACisvLw0KKy8vIKkgQ29weXJpZ2h0IEhlbnJpayBSYXZuIDIwMDQNCisvLw0KKy8vIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gYXJlIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLg0KKy8vIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQ0KKy8vDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsNCit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7DQorDQorbmFtZXNwYWNlIERvdFpMaWINCit7DQorDQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEltcGxlbWVudHMgYSBkYXRhIGRlY29tcHJlc3NvciwgdXNpbmcgdGhlIGluZmxhdGUgYWxnb3JpdGhtIGluIHRoZSBaTGliIGRsbA0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgY2xhc3MgSW5mbGF0ZXIgOiBDb2RlY0Jhc2UNCisJew0KKyAgICAgICAgI3JlZ2lvbiBEbGwgaW1wb3J0cw0KKyAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wsIENoYXJTZXQ9Q2hhclNldC5BbnNpKV0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgaW5mbGF0ZUluaXRfKHJlZiBaU3RyZWFtIHN6LCBzdHJpbmcgdnMsIGludCBzaXplKTsNCisNCisgICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgaW5mbGF0ZShyZWYgWlN0cmVhbSBzeiwgaW50IGZsdXNoKTsNCisNCisgICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgaW5mbGF0ZVJlc2V0KHJlZiBaU3RyZWFtIHN6KTsNCisNCisgICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgaW5mbGF0ZUVuZChyZWYgWlN0cmVhbSBzeik7DQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29uc3RydWN0cyBhbiBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxjPkluZmxhdGVyPC9jPg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBJbmZsYXRlcigpIDogYmFzZSgpDQorCQl7DQorICAgICAgICAgICAgaW50IHJldHZhbCA9IGluZmxhdGVJbml0XyhyZWYgX3p0cmVhbSwgSW5mby5WZXJzaW9uLCBNYXJzaGFsLlNpemVPZihfenRyZWFtKSk7DQorICAgICAgICAgICAgaWYgKHJldHZhbCAhPSAwKQ0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWkxpYkV4Y2VwdGlvbihyZXR2YWwsICJDb3VsZCBub3QgaW5pdGlhbGl6ZSBpbmZsYXRlciIpOw0KKw0KKyAgICAgICAgICAgIHJlc2V0T3V0cHV0KCk7DQorICAgICAgICB9DQorDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQWRkcyBtb3JlIGRhdGEgdG8gdGhlIGNvZGVjIHRvIGJlIHByb2Nlc3NlZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPkJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSBhZGRlZCB0byB0aGUgY29kZWM8L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPlRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYnl0ZSB0byBhZGQgZnJvbSA8Yz5kYXRhPC9jPjwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGFkZDwvcGFyYW0+DQorICAgICAgICAvLy8gPHJlbWFya3M+QWRkaW5nIGRhdGEgbWF5LCBvciBtYXkgbm90LCByYWlzZSB0aGUgPGM+RGF0YUF2YWlsYWJsZTwvYz4gZXZlbnQ8L3JlbWFya3M+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBBZGQoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBjb3VudCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgY291bnQgPCAwKSB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgaWYgKChvZmZzZXQrY291bnQpID4gZGF0YS5MZW5ndGgpIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigpOw0KKw0KKyAgICAgICAgICAgIGludCB0b3RhbCA9IGNvdW50Ow0KKyAgICAgICAgICAgIGludCBpbnB1dEluZGV4ID0gb2Zmc2V0Ow0KKyAgICAgICAgICAgIGludCBlcnIgPSAwOw0KKw0KKyAgICAgICAgICAgIHdoaWxlIChlcnIgPj0gMCAmJiBpbnB1dEluZGV4IDwgdG90YWwpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBjb3B5SW5wdXQoZGF0YSwgaW5wdXRJbmRleCwgTWF0aC5NaW4odG90YWwgLSBpbnB1dEluZGV4LCBrQnVmZmVyU2l6ZSkpOw0KKyAgICAgICAgICAgICAgICBlcnIgPSBpbmZsYXRlKHJlZiBfenRyZWFtLCAoaW50KUZsdXNoVHlwZXMuTm9uZSk7DQorICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gMCkNCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChfenRyZWFtLmF2YWlsX291dCA9PSAwKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIE9uRGF0YUF2YWlsYWJsZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGluZmxhdGUocmVmIF96dHJlYW0sIChpbnQpRmx1c2hUeXBlcy5Ob25lKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgaW5wdXRJbmRleCArPSAoaW50KV96dHJlYW0udG90YWxfaW47DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHNldENoZWNrc3VtKCBfenRyZWFtLmFkbGVyICk7DQorICAgICAgICB9DQorDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gRmluaXNoZXMgdXAgYW55IHBlbmRpbmcgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHByb2Nlc3NlZCBhbmQgaGFuZGxlZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBGaW5pc2goKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGludCBlcnI7DQorICAgICAgICAgICAgZG8NCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGVyciA9IGluZmxhdGUocmVmIF96dHJlYW0sIChpbnQpRmx1c2hUeXBlcy5GaW5pc2gpOw0KKyAgICAgICAgICAgICAgICBPbkRhdGFBdmFpbGFibGUoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd2hpbGUgKGVyciA9PSAwKTsNCisgICAgICAgICAgICBzZXRDaGVja3N1bSggX3p0cmVhbS5hZGxlciApOw0KKyAgICAgICAgICAgIGluZmxhdGVSZXNldChyZWYgX3p0cmVhbSk7DQorICAgICAgICAgICAgcmVzZXRPdXRwdXQoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDbG9zZXMgdGhlIGludGVybmFsIHpsaWIgaW5mbGF0ZSBzdHJlYW0NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBDbGVhblVwKCkgeyBpbmZsYXRlRW5kKHJlZiBfenRyZWFtKTsgfQ0KKw0KKw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL1VuaXRUZXN0cy5jcyBiL3psaWIvc3JjL2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL1VuaXRUZXN0cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjczZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvVW5pdFRlc3RzLmNzCkBAIC0wLDAgKzEsMjc0IEBACisvLw0KKy8vIMKpIENvcHlyaWdodCBIZW5yaWsgUmF2biAyMDA0DQorLy8NCisvLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4NCisvLyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkNCisvLw0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7DQordXNpbmcgU3lzdGVtLklPOw0KKw0KKy8vIHVuY29tbWVudCB0aGUgZGVmaW5lIGJlbG93IHRvIGluY2x1ZGUgdW5pdCB0ZXN0cw0KKy8vI2RlZmluZSBudW5pdA0KKyNpZiBudW5pdA0KK3VzaW5nIE5Vbml0LkZyYW1ld29yazsNCisNCisvLyBVbml0IHRlc3RzIGZvciB0aGUgRG90WkxpYiBjbGFzcyBsaWJyYXJ5DQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy8vDQorLy8gVXNlIHRoaXMgd2l0aCBOVW5pdCAyIGZyb20gaHR0cDovL3d3dy5udW5pdC5vcmcNCisvLw0KKw0KK25hbWVzcGFjZSBEb3RaTGliVGVzdHMNCit7DQorICAgIHVzaW5nIERvdFpMaWI7DQorDQorICAgIC8vIGhlbHBlciBtZXRob2RzDQorICAgIGludGVybmFsIGNsYXNzIFV0aWxzDQorICAgIHsNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBieXRlQXJyRXF1YWwoIGJ5dGVbXSBsaHMsIGJ5dGVbXSByaHMgKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChsaHMuTGVuZ3RoICE9IHJocy5MZW5ndGgpDQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICBmb3IgKGludCBpID0gbGhzLkxlbmd0aC0xOyBpID49IDA7IC0taSkNCisgICAgICAgICAgICAgICAgaWYgKGxoc1tpXSAhPSByaHNbaV0pDQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICB9DQorDQorICAgIH0NCisNCisNCisgICAgW1Rlc3RGaXh0dXJlXQ0KKyAgICBwdWJsaWMgY2xhc3MgQ2lyY0J1ZmZlclRlc3RzDQorICAgIHsNCisgICAgICAgICNyZWdpb24gQ2lyY3VsYXIgYnVmZmVyIHRlc3RzDQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIFNpbmdsZVB1dEdldCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgQ2lyY3VsYXJCdWZmZXIgYnVmID0gbmV3IENpcmN1bGFyQnVmZmVyKDEwKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDAsIGJ1Zi5TaXplICk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAtMSwgYnVmLkdldCgpICk7DQorDQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShidWYuUHV0KCAxICkpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMSwgYnVmLlNpemUgKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDEsIGJ1Zi5HZXQoKSApOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMCwgYnVmLlNpemUgKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIC0xLCBidWYuR2V0KCkgKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgcHVibGljIHZvaWQgQmxvY2tQdXRHZXQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIENpcmN1bGFyQnVmZmVyIGJ1ZiA9IG5ldyBDaXJjdWxhckJ1ZmZlcigxMCk7DQorICAgICAgICAgICAgYnl0ZVtdIGFyciA9IHsxLDIsMyw0LDUsNiw3LDgsOSwxMH07DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAxMCwgYnVmLlB1dChhcnIsMCwxMCkgKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDEwLCBidWYuU2l6ZSApOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKCBidWYuUHV0KDExKSApOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMSwgYnVmLkdldCgpICk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSggYnVmLlB1dCgxMSkgKTsNCisNCisgICAgICAgICAgICBieXRlW10gYXJyMiA9IChieXRlW10pYXJyLkNsb25lKCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCA5LCBidWYuR2V0KGFycjIsMSw5KSApOw0KKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoIFV0aWxzLmJ5dGVBcnJFcXVhbChhcnIsYXJyMikgKTsNCisgICAgICAgIH0NCisNCisgICAgICAgICNlbmRyZWdpb24NCisgICAgfQ0KKw0KKyAgICBbVGVzdEZpeHR1cmVdDQorICAgIHB1YmxpYyBjbGFzcyBDaGVja3N1bVRlc3RzDQorICAgIHsNCisgICAgICAgICNyZWdpb24gQ1JDMzIgVGVzdHMNCisgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgcHVibGljIHZvaWQgQ1JDMzJfTnVsbCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgQ1JDMzJDaGVja3N1bSBjcmMzMiA9IG5ldyBDUkMzMkNoZWNrc3VtKCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAwLCBjcmMzMi5WYWx1ZSApOw0KKw0KKyAgICAgICAgICAgIGNyYzMyID0gbmV3IENSQzMyQ2hlY2tzdW0oMSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAxLCBjcmMzMi5WYWx1ZSApOw0KKw0KKyAgICAgICAgICAgIGNyYzMyID0gbmV3IENSQzMyQ2hlY2tzdW0oNTU2KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDU1NiwgY3JjMzIuVmFsdWUgKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgcHVibGljIHZvaWQgQ1JDMzJfRGF0YSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgQ1JDMzJDaGVja3N1bSBjcmMzMiA9IG5ldyBDUkMzMkNoZWNrc3VtKCk7DQorICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSB7IDEsMiwzLDQsNSw2LDcgfTsNCisgICAgICAgICAgICBjcmMzMi5VcGRhdGUoZGF0YSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAweDcwZTQ2ODg4LCBjcmMzMi5WYWx1ZSAgKTsNCisNCisgICAgICAgICAgICBjcmMzMiA9IG5ldyBDUkMzMkNoZWNrc3VtKCk7DQorICAgICAgICAgICAgY3JjMzIuVXBkYXRlKCJwZW5ndWluIik7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAweDBlNWMxYTEyMCwgY3JjMzIuVmFsdWUgKTsNCisNCisgICAgICAgICAgICBjcmMzMiA9IG5ldyBDUkMzMkNoZWNrc3VtKDEpOw0KKyAgICAgICAgICAgIGNyYzMyLlVwZGF0ZSgicGVuZ3VpbiIpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgweDQzYjZhYTk0LCBjcmMzMi5WYWx1ZSk7DQorDQorICAgICAgICB9DQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAjcmVnaW9uIEFkbGVyIHRlc3RzDQorDQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEFkbGVyX051bGwoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEFkbGVyQ2hlY2tzdW0gYWRsZXIgPSBuZXcgQWRsZXJDaGVja3N1bSgpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBhZGxlci5WYWx1ZSk7DQorDQorICAgICAgICAgICAgYWRsZXIgPSBuZXcgQWRsZXJDaGVja3N1bSgxKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDEsIGFkbGVyLlZhbHVlICk7DQorDQorICAgICAgICAgICAgYWRsZXIgPSBuZXcgQWRsZXJDaGVja3N1bSg1NTYpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggNTU2LCBhZGxlci5WYWx1ZSApOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RdDQorICAgICAgICBwdWJsaWMgdm9pZCBBZGxlcl9EYXRhKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBBZGxlckNoZWNrc3VtIGFkbGVyID0gbmV3IEFkbGVyQ2hlY2tzdW0oMSk7DQorICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSB7IDEsMiwzLDQsNSw2LDcgfTsNCisgICAgICAgICAgICBhZGxlci5VcGRhdGUoZGF0YSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAweDViMDAxZCwgYWRsZXIuVmFsdWUgICk7DQorDQorICAgICAgICAgICAgYWRsZXIgPSBuZXcgQWRsZXJDaGVja3N1bSgpOw0KKyAgICAgICAgICAgIGFkbGVyLlVwZGF0ZSgicGVuZ3VpbiIpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgweDBiY2YwMmY2LCBhZGxlci5WYWx1ZSApOw0KKw0KKyAgICAgICAgICAgIGFkbGVyID0gbmV3IEFkbGVyQ2hlY2tzdW0oMSk7DQorICAgICAgICAgICAgYWRsZXIuVXBkYXRlKCJwZW5ndWluIik7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDB4MGJkNjAyZjcsIGFkbGVyLlZhbHVlKTsNCisNCisgICAgICAgIH0NCisgICAgICAgICNlbmRyZWdpb24NCisgICAgfQ0KKw0KKyAgICBbVGVzdEZpeHR1cmVdDQorICAgIHB1YmxpYyBjbGFzcyBJbmZvVGVzdHMNCisgICAgew0KKyAgICAgICAgI3JlZ2lvbiBJbmZvIHRlc3RzDQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEluZm9fVmVyc2lvbigpDQorICAgICAgICB7DQorICAgICAgICAgICAgSW5mbyBpbmZvID0gbmV3IEluZm8oKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjEuMi44IiwgSW5mby5WZXJzaW9uKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzIsIGluZm8uU2l6ZU9mVUludCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMyLCBpbmZvLlNpemVPZlVMb25nKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzIsIGluZm8uU2l6ZU9mUG9pbnRlcik7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMyLCBpbmZvLlNpemVPZk9mZnNldCk7DQorICAgICAgICB9DQorICAgICAgICAjZW5kcmVnaW9uDQorICAgIH0NCisNCisgICAgW1Rlc3RGaXh0dXJlXQ0KKyAgICBwdWJsaWMgY2xhc3MgRGVmbGF0ZUluZmxhdGVUZXN0cw0KKyAgICB7DQorICAgICAgICAjcmVnaW9uIERlZmxhdGUgdGVzdHMNCisgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgcHVibGljIHZvaWQgRGVmbGF0ZV9Jbml0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICB1c2luZyAoRGVmbGF0ZXIgZGVmID0gbmV3IERlZmxhdGVyKENvbXByZXNzTGV2ZWwuRGVmYXVsdCkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHByaXZhdGUgQXJyYXlMaXN0IGNvbXByZXNzZWREYXRhID0gbmV3IEFycmF5TGlzdCgpOw0KKyAgICAgICAgcHJpdmF0ZSB1aW50IGFkbGVyMTsNCisNCisgICAgICAgIHByaXZhdGUgQXJyYXlMaXN0IHVuY29tcHJlc3NlZERhdGEgPSBuZXcgQXJyYXlMaXN0KCk7DQorICAgICAgICBwcml2YXRlIHVpbnQgYWRsZXIyOw0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgQ0RhdGFBdmFpbChieXRlW10gZGF0YSwgaW50IHN0YXJ0SW5kZXgsIGludCBjb3VudCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpDQorICAgICAgICAgICAgICAgIGNvbXByZXNzZWREYXRhLkFkZChkYXRhW2krc3RhcnRJbmRleF0pOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RdDQorICAgICAgICBwdWJsaWMgdm9pZCBEZWZsYXRlX0NvbXByZXNzKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBjb21wcmVzc2VkRGF0YS5DbGVhcigpOw0KKw0KKyAgICAgICAgICAgIGJ5dGVbXSB0ZXN0RGF0YSA9IG5ldyBieXRlWzM1MDAwXTsNCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3REYXRhLkxlbmd0aDsgKytpKQ0KKyAgICAgICAgICAgICAgICB0ZXN0RGF0YVtpXSA9IDU7DQorDQorICAgICAgICAgICAgdXNpbmcgKERlZmxhdGVyIGRlZiA9IG5ldyBEZWZsYXRlcigoQ29tcHJlc3NMZXZlbCk1KSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGRlZi5EYXRhQXZhaWxhYmxlICs9IG5ldyBEYXRhQXZhaWxhYmxlSGFuZGxlcihDRGF0YUF2YWlsKTsNCisgICAgICAgICAgICAgICAgZGVmLkFkZCh0ZXN0RGF0YSk7DQorICAgICAgICAgICAgICAgIGRlZi5GaW5pc2goKTsNCisgICAgICAgICAgICAgICAgYWRsZXIxID0gZGVmLkNoZWNrc3VtOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgICNlbmRyZWdpb24NCisNCisgICAgICAgICNyZWdpb24gSW5mbGF0ZSB0ZXN0cw0KKyAgICAgICAgW1Rlc3RdDQorICAgICAgICBwdWJsaWMgdm9pZCBJbmZsYXRlX0luaXQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHVzaW5nIChJbmZsYXRlciBpbmYgPSBuZXcgSW5mbGF0ZXIoKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEREYXRhQXZhaWwoYnl0ZVtdIGRhdGEsIGludCBzdGFydEluZGV4LCBpbnQgY291bnQpDQorICAgICAgICB7DQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKQ0KKyAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWREYXRhLkFkZChkYXRhW2krc3RhcnRJbmRleF0pOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RdDQorICAgICAgICBwdWJsaWMgdm9pZCBJbmZsYXRlX0V4cGFuZCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgdW5jb21wcmVzc2VkRGF0YS5DbGVhcigpOw0KKw0KKyAgICAgICAgICAgIHVzaW5nIChJbmZsYXRlciBpbmYgPSBuZXcgSW5mbGF0ZXIoKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGluZi5EYXRhQXZhaWxhYmxlICs9IG5ldyBEYXRhQXZhaWxhYmxlSGFuZGxlcihERGF0YUF2YWlsKTsNCisgICAgICAgICAgICAgICAgaW5mLkFkZCgoYnl0ZVtdKWNvbXByZXNzZWREYXRhLlRvQXJyYXkodHlwZW9mKGJ5dGUpKSk7DQorICAgICAgICAgICAgICAgIGluZi5GaW5pc2goKTsNCisgICAgICAgICAgICAgICAgYWRsZXIyID0gaW5mLkNoZWNrc3VtOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIGFkbGVyMSwgYWRsZXIyICk7DQorICAgICAgICB9DQorICAgICAgICAjZW5kcmVnaW9uDQorICAgIH0NCisNCisgICAgW1Rlc3RGaXh0dXJlXQ0KKyAgICBwdWJsaWMgY2xhc3MgR1ppcFN0cmVhbVRlc3RzDQorICAgIHsNCisgICAgICAgICNyZWdpb24gR1ppcFN0cmVhbSB0ZXN0DQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEdaaXBTdHJlYW1fV3JpdGVSZWFkKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICB1c2luZyAoR1ppcFN0cmVhbSBnek91dCA9IG5ldyBHWmlwU3RyZWFtKCJnenN0cmVhbS5neiIsIENvbXByZXNzTGV2ZWwuQmVzdCkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBCaW5hcnlXcml0ZXIgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcihnek91dCk7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZSgiaGkgdGhlcmUiKTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKE1hdGguUEkpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGUoNDIpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICB1c2luZyAoR1ppcFN0cmVhbSBnekluID0gbmV3IEdaaXBTdHJlYW0oImd6c3RyZWFtLmd6IikpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBCaW5hcnlSZWFkZXIgcmVhZGVyID0gbmV3IEJpbmFyeVJlYWRlcihnekluKTsNCisgICAgICAgICAgICAgICAgc3RyaW5nIHMgPSByZWFkZXIuUmVhZFN0cmluZygpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImhpIHRoZXJlIixzKTsNCisgICAgICAgICAgICAgICAgZG91YmxlIGQgPSByZWFkZXIuUmVhZERvdWJsZSgpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoTWF0aC5QSSwgZCk7DQorICAgICAgICAgICAgICAgIGludCBpID0gcmVhZGVyLlJlYWRJbnQzMigpOw0KKyAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNDIsaSk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgfQ0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKwl9DQorfQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvZG90emxpYi9MSUNFTlNFXzFfMC50eHQgYi96bGliL3NyYy9jb250cmliL2RvdHpsaWIvTElDRU5TRV8xXzAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYWFjMmMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL2RvdHpsaWIvTElDRU5TRV8xXzAudHh0CkBAIC0wLDAgKzEsMjMgQEAKK0Jvb3N0IFNvZnR3YXJlIExpY2Vuc2UgLSBWZXJzaW9uIDEuMCAtIEF1Z3VzdCAxN3RoLCAyMDAzDQorDQorUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb3Igb3JnYW5pemF0aW9uDQorb2J0YWluaW5nIGEgY29weSBvZiB0aGUgc29mdHdhcmUgYW5kIGFjY29tcGFueWluZyBkb2N1bWVudGF0aW9uIGNvdmVyZWQgYnkNCit0aGlzIGxpY2Vuc2UgKHRoZSAiU29mdHdhcmUiKSB0byB1c2UsIHJlcHJvZHVjZSwgZGlzcGxheSwgZGlzdHJpYnV0ZSwNCitleGVjdXRlLCBhbmQgdHJhbnNtaXQgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZQ0KK1NvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHRoaXJkLXBhcnRpZXMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvDQorZG8gc28sIGFsbCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmc6DQorDQorVGhlIGNvcHlyaWdodCBub3RpY2VzIGluIHRoZSBTb2Z0d2FyZSBhbmQgdGhpcyBlbnRpcmUgc3RhdGVtZW50LCBpbmNsdWRpbmcNCit0aGUgYWJvdmUgbGljZW5zZSBncmFudCwgdGhpcyByZXN0cmljdGlvbiBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLA0KK211c3QgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGluIHdob2xlIG9yIGluIHBhcnQsIGFuZA0KK2FsbCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTb2Z0d2FyZSwgdW5sZXNzIHN1Y2ggY29waWVzIG9yIGRlcml2YXRpdmUNCit3b3JrcyBhcmUgc29sZWx5IGluIHRoZSBmb3JtIG9mIG1hY2hpbmUtZXhlY3V0YWJsZSBvYmplY3QgY29kZSBnZW5lcmF0ZWQgYnkNCithIHNvdXJjZSBsYW5ndWFnZSBwcm9jZXNzb3IuDQorDQorVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1INCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwNCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UDQorU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIEFOWU9ORSBESVNUUklCVVRJTkcgVEhFIFNPRlRXQVJFIEJFIExJQUJMRQ0KK0ZPUiBBTlkgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLA0KK0FSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUg0KK0RFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL2RvdHpsaWIvcmVhZG1lLnR4dCBiL3psaWIvc3JjL2NvbnRyaWIvZG90emxpYi9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMzk1NzIKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL2RvdHpsaWIvcmVhZG1lLnR4dApAQCAtMCwwICsxLDU4IEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBhIC5OZXQgd3JhcHBlciBjbGFzcyBsaWJyYXJ5IGZvciB0aGUgWkxpYjEuZGxsDQorDQorVGhlIHdyYXBwZXIgaW5jbHVkZXMgc3VwcG9ydCBmb3IgaW5mbGF0aW5nL2RlZmxhdGluZyBtZW1vcnkgYnVmZmVycywNCisuTmV0IHN0cmVhbWluZyB3cmFwcGVycyBmb3IgdGhlIGd6IHN0cmVhbXMgcGFydCBvZiB6bGliLCBhbmQgd3JhcHBlcnMNCitmb3IgdGhlIGNoZWNrc3VtIHBhcnRzIG9mIHpsaWIuIFNlZSBEb3RaTGliL1VuaXRUZXN0cy5jcyBmb3IgZXhhbXBsZXMuDQorDQorRGlyZWN0b3J5IHN0cnVjdHVyZToNCistLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK0xJQ0VOU0VfMV8wLnR4dCAgICAgICAtIExpY2Vuc2UgZmlsZS4NCityZWFkbWUudHh0ICAgICAgICAgICAgLSBUaGlzIGZpbGUuDQorRG90WkxpYi5jaG0gICAgICAgICAgIC0gQ2xhc3MgbGlicmFyeSBkb2N1bWVudGF0aW9uDQorRG90WkxpYi5idWlsZCAgICAgICAgIC0gTkFudCBidWlsZCBmaWxlDQorRG90WkxpYi5zbG4gICAgICAgICAgIC0gTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMjAwMyBzb2x1dGlvbiBmaWxlDQorDQorRG90WkxpYlwqLmNzICAgICAgICAgIC0gU291cmNlIGZpbGVzIGZvciB0aGUgY2xhc3MgbGlicmFyeQ0KKw0KK1VuaXQgdGVzdHM6DQorLS0tLS0tLS0tLS0NCitUaGUgZmlsZSBEb3RaTGliL1VuaXRUZXN0cy5jcyBjb250YWlucyB1bml0IHRlc3RzIGZvciB1c2Ugd2l0aCBOVW5pdCAyLjEgb3IgaGlnaGVyLg0KK1RvIGluY2x1ZGUgdW5pdCB0ZXN0cyBpbiB0aGUgYnVpbGQsIGRlZmluZSBudW5pdCBiZWZvcmUgYnVpbGRpbmcuDQorDQorDQorQnVpbGQgaW5zdHJ1Y3Rpb25zOg0KKy0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisxLiBVc2luZyBWaXN1YWwgU3R1ZGlvLk5ldCAyMDAzOg0KKyAgIE9wZW4gRG90WkxpYi5zbG4gaW4gVlMuTmV0IGFuZCBidWlsZCBmcm9tIHRoZXJlLiBPdXRwdXQgZmlsZSAoRG90WkxpYi5kbGwpDQorICAgd2lsbCBiZSBmb3VuZCAuL0RvdFpMaWIvYmluL3JlbGVhc2Ugb3IgLi9Eb3RaTGliL2Jpbi9kZWJ1ZywgZGVwZW5kaW5nIG9uDQorICAgeW91IGFyZSBidWlsZGluZyB0aGUgcmVsZWFzZSBvciBkZWJ1ZyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiBDaGVjaw0KKyAgIERvdFpMaWIvVW5pdFRlc3RzLmNzIGZvciBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGluY2x1ZGUgdW5pdCB0ZXN0cyBpbiB0aGUNCisgICBidWlsZC4NCisNCisyLiBVc2luZyBOQW50Og0KKyAgIE9wZW4gYSBjb21tYW5kIHByb21wdCB3aXRoIGFjY2VzcyB0byB0aGUgYnVpbGQgZW52aXJvbm1lbnQgYW5kIHJ1biBuYW50DQorICAgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBEb3RaTGliLmJ1aWxkIGZpbGUuDQorICAgWW91IGNhbiBkZWZpbmUgMiBwcm9wZXJ0aWVzIG9uIHRoZSBuYW50IGNvbW1hbmQtbGluZSB0byBjb250cm9sIHRoZSBidWlsZDoNCisgICBkZWJ1Zz17dHJ1ZXxmYWxzZX0gdG8gdG9nZ2xlIGJldHdlZW4gcmVsZWFzZS9kZWJ1ZyBidWlsZHMgKGRlZmF1bHQ9dHJ1ZSkuDQorICAgbnVuaXQ9e3RydWV8ZmFsc2V9IHRvIGluY2x1ZGUgb3IgZXNjbHVkZSB1bml0IHRlc3RzIChkZWZhdWx0PXRydWUpLg0KKyAgIEFsc28gdGhlIHRhcmdldCBjbGVhbiB3aWxsIHJlbW92ZSBiaW5hcmllcy4NCisgICBPdXRwdXQgZmlsZSAoRG90WkxpYi5kbGwpIHdpbGwgYmUgZm91bmQgaW4gZWl0aGVyIC4vRG90WkxpYi9iaW4vcmVsZWFzZQ0KKyAgIG9yIC4vRG90WkxpYi9iaW4vZGVidWcsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHlvdSBhcmUgYnVpbGRpbmcgdGhlIHJlbGVhc2UNCisgICBvciBkZWJ1ZyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5Lg0KKw0KKyAgIEV4YW1wbGVzOg0KKyAgICAgbmFudCAtRDpkZWJ1Zz1mYWxzZSAtRDpudW5pdD1mYWxzZQ0KKyAgICAgICB3aWxsIGJ1aWxkIGEgcmVsZWFzZSBtb2RlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgd2l0aG91dCB1bml0IHRlc3RzLg0KKyAgICAgbmFudA0KKyAgICAgICB3aWxsIGJ1aWxkIGEgZGVidWcgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSB3aXRoIHVuaXQgdGVzdHMNCisgICAgIG5hbnQgY2xlYW4NCisgICAgICAgd2lsbCByZW1vdmUgYWxsIHByZXZpb3VzbHkgYnVpbHQgZmlsZXMuDQorDQorDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorQ29weXJpZ2h0IChjKSBIZW5yaWsgUmF2biAyMDA0DQorDQorVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBhcmUgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuDQorKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpDQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9nY2NfZ3ZtYXQ2NC9ndm1hdDY0LlMgYi96bGliL3NyYy9jb250cmliL2djY19ndm1hdDY0L2d2bWF0NjQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDg1OGRkCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9nY2NfZ3ZtYXQ2NC9ndm1hdDY0LlMKQEAgLTAsMCArMSw1NzQgQEAKKy8qDQorO3VJbnQgbG9uZ2VzdF9tYXRjaF94NjQoDQorOyAgICBkZWZsYXRlX3N0YXRlICpzLA0KKzsgICAgSVBvcyBjdXJfbWF0Y2gpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBtYXRjaCANCisNCis7IGd2bWF0NjQuUyAtLSBBc20gcG9ydGlvbiBvZiB0aGUgb3B0aW1pemVkIGxvbmdlc3RfbWF0Y2ggZm9yIDMyIGJpdHMgeDg2XzY0DQorOyAgKEFNRDY0IG9uIEF0aGxvbiA2NCwgT3B0ZXJvbiwgUGhlbm9tDQorOyAgICAgYW5kIEludGVsIEVNNjRUIG9uIFBlbnRpdW0gNCB3aXRoIEVNNjRULCBQZW50aXVtIEQsIENvcmUgMiBEdW8sIENvcmUgSTUvSTcpDQorOyB0aGlzIGZpbGUgaXMgdHJhbnNsYXRpb24gZnJvbSBndm1hdDY0LmFzbSB0byBHQ0MgNC54IChmb3IgTGludXgsIE1hYyBYQ29kZSkNCis7IENvcHlyaWdodCAoQykgMTk5NS0yMDEwIEplYW4tbG91cCBHYWlsbHksIEJyaWFuIFJhaXRlciBhbmQgR2lsbGVzIFZvbGxhbnQuDQorOw0KKzsgRmlsZSB3cml0dGVuIGJ5IEdpbGxlcyBWb2xsYW50LCBieSBjb252ZXJ0aW5nIHRvIGFzc2VtYmx5IHRoZSBsb25nZXN0X21hdGNoDQorOyAgZnJvbSBKZWFuLWxvdXAgR2FpbGx5IGluIGRlZmxhdGUuYyBvZiB6TGliIGFuZCBpbmZvWmlwIHppcC4NCis7ICBhbmQgYnkgdGFraW5nIGluc3BpcmF0aW9uIG9uIGFzbTY4NiB3aXRoIG1hc20sIG9wdGltaXNlZCBhc3NlbWJseSBjb2RlDQorOyAgICAgICAgZnJvbSBCcmlhbiBSYWl0ZXIsIHdyaXR0ZW4gMTk5OA0KKzsNCis7ICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZA0KKzsgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMNCis7ICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLg0KKzsNCis7ICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwNCis7ICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0DQorOyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOg0KKzsNCis7ICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdA0KKzsgICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlDQorOyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlDQorOyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4NCis7ICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQ0KKzsgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZQ0KKzsgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uDQorOw0KKzsgICAgICAgICBodHRwOi8vd3d3LnpsaWIubmV0DQorOyAgICAgICAgIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwNCis7ICAgICAgICAgaHR0cDovL3d3dy5tdXBwZXRsYWJzLmNvbS9+YnJlYWRib3gvc29mdHdhcmUvYXNzZW1ibHkuaHRtbA0KKzsNCis7IHRvIGNvbXBpbGUgdGhpcyBmaWxlIGZvciB6TGliLCBJIHVzZSBvcHRpb246DQorOyAgIGdjYyAtYyAtYXJjaCB4ODZfNjQgZ3ZtYXQ2NC5TDQorDQorDQorO3VJbnQgbG9uZ2VzdF9tYXRjaChzLCBjdXJfbWF0Y2gpDQorOyAgICBkZWZsYXRlX3N0YXRlICpzOw0KKzsgICAgSVBvcyBjdXJfbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IG1hdGNoIC8NCis7DQorOyB3aXRoIFhDb2RlIGZvciBNYWMsIEkgaGFkIHN0cmFuZ2UgZXJyb3Igd2l0aCBzb21lIGp1bXAgb24gaW50ZWwgc3ludGF4DQorOyB0aGlzIGlzIHdoeSBCRUZPUkVfSk1QIGFuZCBBRlRFUl9KTVAgYXJlIHVzZWQNCisgKi8NCisNCisNCisjZGVmaW5lIEJFRk9SRV9KTVAgLmF0dF9zeW50YXgNCisjZGVmaW5lIEFGVEVSX0pNUCAuaW50ZWxfc3ludGF4IG5vcHJlZml4DQorDQorI2lmbmRlZiBOT19VTkRFUkxJTkUNCisjCWRlZmluZQltYXRjaF9pbml0CV9tYXRjaF9pbml0DQorIwlkZWZpbmUJbG9uZ2VzdF9tYXRjaAlfbG9uZ2VzdF9tYXRjaA0KKyNlbmRpZg0KKw0KKy5pbnRlbF9zeW50YXggbm9wcmVmaXgNCisNCisuZ2xvYmwJbWF0Y2hfaW5pdCwgbG9uZ2VzdF9tYXRjaA0KKy50ZXh0DQorbG9uZ2VzdF9tYXRjaDoNCisNCisNCisNCisjZGVmaW5lIExvY2FsVmFyc1NpemUgOTYNCisvKg0KKzsgcmVnaXN0ZXIgdXNlZCA6IHJheCxyYngscmN4LHJkeCxyc2kscmRpLHI4LHI5LHIxMCxyMTEscjEyDQorOyBmcmVlIHJlZ2lzdGVyIDogIHIxNCxyMTUNCis7IHJlZ2lzdGVyIGNhbiBiZSBzYXZlZCA6IHJzcA0KKyovDQorDQorI2RlZmluZSBjaGFpbmxlbndtYXNrICAgICAocnNwICsgOCAtIExvY2FsVmFyc1NpemUpDQorI2RlZmluZSBuaWNlbWF0Y2ggICAgICAgICAocnNwICsgMTYgLSBMb2NhbFZhcnNTaXplKQ0KKw0KKyNkZWZpbmUgc2F2ZV9yZGkgICAgICAgIChyc3AgKyAyNCAtIExvY2FsVmFyc1NpemUpDQorI2RlZmluZSBzYXZlX3JzaSAgICAgICAgKHJzcCArIDMyIC0gTG9jYWxWYXJzU2l6ZSkNCisjZGVmaW5lIHNhdmVfcmJ4ICAgICAgICAocnNwICsgNDAgLSBMb2NhbFZhcnNTaXplKQ0KKyNkZWZpbmUgc2F2ZV9yYnAgICAgICAgIChyc3AgKyA0OCAtIExvY2FsVmFyc1NpemUpDQorI2RlZmluZSBzYXZlX3IxMiAgICAgICAgKHJzcCArIDU2IC0gTG9jYWxWYXJzU2l6ZSkNCisjZGVmaW5lIHNhdmVfcjEzICAgICAgICAocnNwICsgNjQgLSBMb2NhbFZhcnNTaXplKQ0KKyNkZWZpbmUgc2F2ZV9yMTQgICAgICAgIChyc3AgKyA3MiAtIExvY2FsVmFyc1NpemUpDQorI2RlZmluZSBzYXZlX3IxNSAgICAgICAgKHJzcCArIDgwIC0gTG9jYWxWYXJzU2l6ZSkNCisNCisNCisvKg0KKzsgIGFsbCB0aGUgKzQgb2Zmc2V0cyBhcmUgZHVlIHRvIHRoZSBhZGRpdGlvbiBvZiBwZW5kaW5nX2J1Zl9zaXplIChpbiB6bGliDQorOyAgaW4gdGhlIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlIHNpbmNlIHRoZSBhc20gY29kZSB3YXMgZmlyc3Qgd3JpdHRlbg0KKzsgIChpZiB5b3UgY29tcGlsZSB3aXRoIHpsaWIgMS4wLjQgb3Igb2xkZXIsIHJlbW92ZSB0aGUgKzQpLg0KKzsgIE5vdGUgOiB0aGVzZSB2YWx1ZSBhcmUgZ29vZCB3aXRoIGEgOCBieXRlcyBib3VuZGFyeSBwYWNrIHN0cnVjdHVyZQ0KKyovDQorDQorI2RlZmluZSAgICBNQVhfTUFUQ0ggICAgICAgICAgICAgIDI1OA0KKyNkZWZpbmUgICAgTUlOX01BVENIICAgICAgICAgICAgICAzDQorI2RlZmluZSAgICBNSU5fTE9PS0FIRUFEICAgICAgICAgIChNQVhfTUFUQ0grTUlOX01BVENIKzEpDQorDQorLyoNCis7OzsgT2Zmc2V0cyBmb3IgZmllbGRzIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZS4gVGhlc2UgbnVtYmVycw0KKzs7OyBhcmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBkZWZpbml0aW9uIG9mIGRlZmxhdGVfc3RhdGUsIHdpdGggdGhlDQorOzs7IGFzc3VtcHRpb24gdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBkd29yZC1hbGlnbiB0aGUgZmllbGRzLiAoVGh1cywNCis7OzsgY2hhbmdpbmcgdGhlIGRlZmluaXRpb24gb2YgZGVmbGF0ZV9zdGF0ZSBjb3VsZCBlYXNpbHkgY2F1c2UgdGhpcw0KKzs7OyBwcm9ncmFtIHRvIGNyYXNoIGhvcnJpYmx5LCB3aXRob3V0IHNvIG11Y2ggYXMgYSB3YXJuaW5nIGF0DQorOzs7IGNvbXBpbGUgdGltZS4gU2lnaC4pDQorDQorOyAgYWxsIHRoZSAremxpYjEyMjJhZGQgb2Zmc2V0cyBhcmUgZHVlIHRvIHRoZSBhZGRpdGlvbiBvZiBmaWVsZHMNCis7ICBpbiB6bGliIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBzaW5jZSB0aGUgYXNtIGNvZGUgd2FzIGZpcnN0IHdyaXR0ZW4NCis7ICAoaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMC40IG9yIG9sZGVyLCB1c2UgInpsaWIxMjIyYWRkIGVxdSAoLTQpIikuDQorOyAgKGlmIHlvdSBjb21waWxlIHdpdGggemxpYiBiZXR3ZWVuIDEuMC41IGFuZCAxLjIuMi4xLCB1c2UgInpsaWIxMjIyYWRkIGVxdSAwIikuDQorOyAgaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMi4yLjIgb3IgbGF0ZXIgLCB1c2UgInpsaWIxMjIyYWRkIGVxdSA4IikuDQorKi8NCisNCisNCisNCisvKiB5b3UgY2FuIGNoZWNrIHRoZSBzdHJ1Y3R1cmUgb2Zmc2V0IGJ5IHJ1bm5pbmcNCisNCisjaW5jbHVkZSA8c3RkbGliLmg+DQorI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2luY2x1ZGUgImRlZmxhdGUuaCINCisNCit2b2lkIHByaW50X2RlcGwoKQ0KK3sNCitkZWZsYXRlX3N0YXRlIGRzOw0KK2RlZmxhdGVfc3RhdGUgKnM9JmRzOw0KK3ByaW50Zigic2l6ZSBwb2ludGVyPSV1XG4iLChpbnQpc2l6ZW9mKHZvaWQqKSk7DQorDQorcHJpbnRmKCIjZGVmaW5lIGRzV1NpemUgICAgICAgICAldVxuIiwoaW50KSgoKGNoYXIqKSYocy0+d19zaXplKSktKChjaGFyKilzKSkpOw0KK3ByaW50ZigiI2RlZmluZSBkc1dNYXNrICAgICAgICAgJXVcbiIsKGludCkoKChjaGFyKikmKHMtPndfbWFzaykpLSgoY2hhciopcykpKTsNCitwcmludGYoIiNkZWZpbmUgZHNXaW5kb3cgICAgICAgICV1XG4iLChpbnQpKCgoY2hhciopJihzLT53aW5kb3cpKS0oKGNoYXIqKXMpKSk7DQorcHJpbnRmKCIjZGVmaW5lIGRzUHJldiAgICAgICAgICAldVxuIiwoaW50KSgoKGNoYXIqKSYocy0+cHJldikpLSgoY2hhciopcykpKTsNCitwcmludGYoIiNkZWZpbmUgZHNNYXRjaExlbiAgICAgICV1XG4iLChpbnQpKCgoY2hhciopJihzLT5tYXRjaF9sZW5ndGgpKS0oKGNoYXIqKXMpKSk7DQorcHJpbnRmKCIjZGVmaW5lIGRzUHJldk1hdGNoICAgICAldVxuIiwoaW50KSgoKGNoYXIqKSYocy0+cHJldl9tYXRjaCkpLSgoY2hhciopcykpKTsNCitwcmludGYoIiNkZWZpbmUgZHNTdHJTdGFydCAgICAgICV1XG4iLChpbnQpKCgoY2hhciopJihzLT5zdHJzdGFydCkpLSgoY2hhciopcykpKTsNCitwcmludGYoIiNkZWZpbmUgZHNNYXRjaFN0YXJ0ICAgICV1XG4iLChpbnQpKCgoY2hhciopJihzLT5tYXRjaF9zdGFydCkpLSgoY2hhciopcykpKTsNCitwcmludGYoIiNkZWZpbmUgZHNMb29rYWhlYWQgICAgICV1XG4iLChpbnQpKCgoY2hhciopJihzLT5sb29rYWhlYWQpKS0oKGNoYXIqKXMpKSk7DQorcHJpbnRmKCIjZGVmaW5lIGRzUHJldkxlbiAgICAgICAldVxuIiwoaW50KSgoKGNoYXIqKSYocy0+cHJldl9sZW5ndGgpKS0oKGNoYXIqKXMpKSk7DQorcHJpbnRmKCIjZGVmaW5lIGRzTWF4Q2hhaW5MZW4gICAldVxuIiwoaW50KSgoKGNoYXIqKSYocy0+bWF4X2NoYWluX2xlbmd0aCkpLSgoY2hhciopcykpKTsNCitwcmludGYoIiNkZWZpbmUgZHNHb29kTWF0Y2ggICAgICV1XG4iLChpbnQpKCgoY2hhciopJihzLT5nb29kX21hdGNoKSktKChjaGFyKilzKSkpOw0KK3ByaW50ZigiI2RlZmluZSBkc05pY2VNYXRjaCAgICAgJXVcbiIsKGludCkoKChjaGFyKikmKHMtPm5pY2VfbWF0Y2gpKS0oKGNoYXIqKXMpKSk7DQorfQ0KKyovDQorDQorI2RlZmluZSBkc1dTaXplICAgICAgICAgIDY4DQorI2RlZmluZSBkc1dNYXNrICAgICAgICAgIDc2DQorI2RlZmluZSBkc1dpbmRvdyAgICAgICAgIDgwDQorI2RlZmluZSBkc1ByZXYgICAgICAgICAgIDk2DQorI2RlZmluZSBkc01hdGNoTGVuICAgICAgIDE0NA0KKyNkZWZpbmUgZHNQcmV2TWF0Y2ggICAgICAxNDgNCisjZGVmaW5lIGRzU3RyU3RhcnQgICAgICAgMTU2DQorI2RlZmluZSBkc01hdGNoU3RhcnQgICAgIDE2MA0KKyNkZWZpbmUgZHNMb29rYWhlYWQgICAgICAxNjQNCisjZGVmaW5lIGRzUHJldkxlbiAgICAgICAgMTY4DQorI2RlZmluZSBkc01heENoYWluTGVuICAgIDE3Mg0KKyNkZWZpbmUgZHNHb29kTWF0Y2ggICAgICAxODgNCisjZGVmaW5lIGRzTmljZU1hdGNoICAgICAgMTkyDQorDQorI2RlZmluZSB3aW5kb3dfc2l6ZSAgICAgIFsgcmN4ICsgZHNXU2l6ZV0NCisjZGVmaW5lIFdNYXNrICAgICAgICAgICAgWyByY3ggKyBkc1dNYXNrXQ0KKyNkZWZpbmUgd2luZG93X2FkICAgICAgICBbIHJjeCArIGRzV2luZG93XQ0KKyNkZWZpbmUgcHJldl9hZCAgICAgICAgICBbIHJjeCArIGRzUHJldl0NCisjZGVmaW5lIHN0cnN0YXJ0ICAgICAgICAgWyByY3ggKyBkc1N0clN0YXJ0XQ0KKyNkZWZpbmUgbWF0Y2hfc3RhcnQgICAgICBbIHJjeCArIGRzTWF0Y2hTdGFydF0NCisjZGVmaW5lIExvb2thaGVhZCAgICAgICAgWyByY3ggKyBkc0xvb2thaGVhZF0gLy87IDBmZmZmZmZmZmggb24gaW5mb3ppcA0KKyNkZWZpbmUgcHJldl9sZW5ndGggICAgICBbIHJjeCArIGRzUHJldkxlbl0NCisjZGVmaW5lIG1heF9jaGFpbl9sZW5ndGggWyByY3ggKyBkc01heENoYWluTGVuXQ0KKyNkZWZpbmUgZ29vZF9tYXRjaCAgICAgICBbIHJjeCArIGRzR29vZE1hdGNoXQ0KKyNkZWZpbmUgbmljZV9tYXRjaCAgICAgICBbIHJjeCArIGRzTmljZU1hdGNoXQ0KKw0KKy8qDQorOyB3aW5kb3dzOg0KKzsgcGFyYW1ldGVyIDEgaW4gcmN4KGRlZmxhdGUgc3RhdGUgcyksIHBhcmFtIDIgaW4gcmR4IChjdXIgbWF0Y2gpDQorDQorOyBzZWUgaHR0cDovL3dlYmxvZ3MuYXNwLm5ldC9vbGRuZXd0aGluZy9hcmNoaXZlLzIwMDQvMDEvMTQvNTg1NzkuYXNweCBhbmQNCis7IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9lbi11cy9rbWFyY2gvaGgva21hcmNoLzY0Yml0QU1EXzhlOTUxZGQyLWVlNzctNDcyOC04NzAyLTU1Y2U0YjVkZDI0YS54bWwuYXNwDQorOw0KKzsgQWxsIHJlZ2lzdGVycyBtdXN0IGJlIHByZXNlcnZlZCBhY3Jvc3MgdGhlIGNhbGwsIGV4Y2VwdCBmb3INCis7ICAgcmF4LCByY3gsIHJkeCwgcjgsIHI5LCByMTAsIGFuZCByMTEsIHdoaWNoIGFyZSBzY3JhdGNoLg0KKw0KKzsNCis7IGdjYyBvbiBtYWNvc3gtbGludXg6DQorOyBzZWUgaHR0cDovL3d3dy54ODYtNjQub3JnL2RvY3VtZW50YXRpb24vYWJpLTAuOTkucGRmDQorOyBwYXJhbSAxIGluIHJkaSwgcGFyYW0gMiBpbiByc2kNCis7IHJieCwgcnNwLCByYnAsIHIxMiB0byByMTUgbXVzdCBiZSBwcmVzZXJ2ZWQNCisNCis7OzsgU2F2ZSByZWdpc3RlcnMgdGhhdCB0aGUgY29tcGlsZXIgbWF5IGJlIHVzaW5nLCBhbmQgYWRqdXN0IGVzcCB0bw0KKzs7OyBtYWtlIHJvb20gZm9yIG91ciBzdGFjayBmcmFtZS4NCisNCisNCis7OzsgUmV0cmlldmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cy4gcjhkIHdpbGwgaG9sZCBjdXJfbWF0Y2gNCis7OzsgdGhyb3VnaG91dCB0aGUgZW50aXJlIGZ1bmN0aW9uLiBlZHggd2lsbCBob2xkIHRoZSBwb2ludGVyIHRvIHRoZQ0KKzs7OyBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBkdXJpbmcgdGhlIGZ1bmN0aW9uJ3Mgc2V0dXAgKGJlZm9yZQ0KKzs7OyBlbnRlcmluZyB0aGUgbWFpbiBsb29wLg0KKw0KKzsgbXM6IHBhcmFtZXRlciAxIGluIHJjeCAoZGVmbGF0ZV9zdGF0ZSogcyksIHBhcmFtIDIgaW4gZWR4IC0+IHI4IChjdXIgbWF0Y2gpDQorOyBtYWM6IHBhcmFtIDEgaW4gcmRpLCBwYXJhbSAyIHJzaQ0KKzsgdGhpcyBjbGVhciBoaWdoIDMyIGJpdHMgb2YgcjgsIHdoaWNoIGNhbiBiZSBnYXJiYWdlIGluIGJvdGggcjggYW5kIHJkeA0KKyovDQorICAgICAgICBtb3YgW3NhdmVfcmJ4XSxyYngNCisgICAgICAgIG1vdiBbc2F2ZV9yYnBdLHJicA0KKw0KKw0KKyAgICAgICAgbW92IHJjeCxyZGkNCisNCisgICAgICAgIG1vdiByOGQsZXNpDQorDQorDQorICAgICAgICBtb3YgW3NhdmVfcjEyXSxyMTINCisgICAgICAgIG1vdiBbc2F2ZV9yMTNdLHIxMw0KKyAgICAgICAgbW92IFtzYXZlX3IxNF0scjE0DQorICAgICAgICBtb3YgW3NhdmVfcjE1XSxyMTUNCisNCisNCisvLzs7OyB1SW50IHdtYXNrID0gcy0+d19tYXNrOw0KKy8vOzs7IHVuc2lnbmVkIGNoYWluX2xlbmd0aCA9IHMtPm1heF9jaGFpbl9sZW5ndGg7DQorLy87OzsgaWYgKHMtPnByZXZfbGVuZ3RoID49IHMtPmdvb2RfbWF0Y2gpIHsNCisvLzs7OyAgICAgY2hhaW5fbGVuZ3RoID4+PSAyOw0KKy8vOzs7IH0NCisNCisNCisgICAgICAgIG1vdiBlZGksIHByZXZfbGVuZ3RoDQorICAgICAgICBtb3YgZXNpLCBnb29kX21hdGNoDQorICAgICAgICBtb3YgZWF4LCBXTWFzaw0KKyAgICAgICAgbW92IGVieCwgbWF4X2NoYWluX2xlbmd0aA0KKyAgICAgICAgY21wIGVkaSwgZXNpDQorICAgICAgICBqbCAgTGFzdE1hdGNoR29vZA0KKyAgICAgICAgc2hyIGVieCwgMg0KK0xhc3RNYXRjaEdvb2Q6DQorDQorLy87OzsgY2hhaW5sZW4gaXMgZGVjcmVtZW50ZWQgb25jZSBiZWZvcmVoYW5kIHNvIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbg0KKy8vOzs7IHVzZSB0aGUgc2lnbiBmbGFnIGluc3RlYWQgb2YgdGhlIHplcm8gZmxhZyBmb3IgdGhlIGV4aXQgdGVzdC4NCisvLzs7OyBJdCBpcyB0aGVuIHNoaWZ0ZWQgaW50byB0aGUgaGlnaCB3b3JkLCB0byBtYWtlIHJvb20gZm9yIHRoZSB3bWFzaw0KKy8vOzs7IHZhbHVlLCB3aGljaCBpdCB3aWxsIGFsd2F5cyBhY2NvbXBhbnkuDQorDQorICAgICAgICBkZWMgZWJ4DQorICAgICAgICBzaGwgZWJ4LCAxNg0KKyAgICAgICAgb3IgIGVieCwgZWF4DQorDQorLy87Ozsgb24gemxpYiBvbmx5DQorLy87OzsgaWYgKCh1SW50KW5pY2VfbWF0Y2ggPiBzLT5sb29rYWhlYWQpIG5pY2VfbWF0Y2ggPSBzLT5sb29rYWhlYWQ7DQorDQorDQorDQorICAgICAgICBtb3YgZWF4LCBuaWNlX21hdGNoDQorICAgICAgICBtb3YgW2NoYWlubGVud21hc2tdLCBlYngNCisgICAgICAgIG1vdiByMTBkLCBMb29rYWhlYWQNCisgICAgICAgIGNtcCByMTBkLCBlYXgNCisgICAgICAgIGNtb3ZubCByMTBkLCBlYXgNCisgICAgICAgIG1vdiBbbmljZW1hdGNoXSxyMTBkDQorDQorDQorDQorLy87OzsgcmVnaXN0ZXIgQnl0ZWYgKnNjYW4gPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydDsNCisgICAgICAgIG1vdiByMTAsIHdpbmRvd19hZA0KKyAgICAgICAgbW92IGVicCwgc3Ryc3RhcnQNCisgICAgICAgIGxlYSByMTMsIFtyMTAgKyByYnBdDQorDQorLy87OzsgRGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIHRoZSBzY2FuIHB0ciBpcyBvZmYgZnJvbSBiZWluZw0KKy8vOzs7IGR3b3JkLWFsaWduZWQuDQorDQorICAgICAgICAgbW92IHI5LHIxMw0KKyAgICAgICAgIG5lZyByMTMNCisgICAgICAgICBhbmQgcjEzLDMNCisNCisvLzs7OyBJUG9zIGxpbWl0ID0gcy0+c3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVChzKSA/DQorLy87OzsgICAgIHMtPnN0cnN0YXJ0IC0gKElQb3MpTUFYX0RJU1QocykgOiBOSUw7DQorDQorDQorICAgICAgICBtb3YgZWF4LCB3aW5kb3dfc2l6ZQ0KKyAgICAgICAgc3ViIGVheCwgTUlOX0xPT0tBSEVBRA0KKw0KKw0KKyAgICAgICAgeG9yIGVkaSxlZGkNCisgICAgICAgIHN1YiBlYnAsIGVheA0KKw0KKyAgICAgICAgbW92IHIxMWQsIHByZXZfbGVuZ3RoDQorDQorICAgICAgICBjbW92bmcgZWJwLGVkaQ0KKw0KKy8vOzs7IGludCBiZXN0X2xlbiA9IHMtPnByZXZfbGVuZ3RoOw0KKw0KKw0KKy8vOzs7IFN0b3JlIHRoZSBzdW0gb2Ygcy0+d2luZG93ICsgYmVzdF9sZW4gaW4gZXNpIGxvY2FsbHksIGFuZCBpbiBlc2kuDQorDQorICAgICAgIGxlYSAgcnNpLFtyMTArcjExXQ0KKw0KKy8vOzs7IHJlZ2lzdGVyIHVzaCBzY2FuX3N0YXJ0ID0gKih1c2hmKilzY2FuOw0KKy8vOzs7IHJlZ2lzdGVyIHVzaCBzY2FuX2VuZCAgID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsNCisvLzs7OyBQb3NmICpwcmV2ID0gcy0+cHJldjsNCisNCisgICAgICAgIG1vdnp4IHIxMmQsd29yZCBwdHIgW3I5XQ0KKyAgICAgICAgbW92enggZWJ4LCB3b3JkIHB0ciBbcjkgKyByMTEgLSAxXQ0KKw0KKyAgICAgICAgbW92IHJkaSwgcHJldl9hZA0KKw0KKy8vOzs7IEp1bXAgaW50byB0aGUgbWFpbiBsb29wLg0KKw0KKyAgICAgICAgbW92IGVkeCwgW2NoYWlubGVud21hc2tdDQorDQorICAgICAgICBjbXAgYngsd29yZCBwdHIgW3JzaSArIHI4IC0gMV0NCisgICAgICAgIGp6ICBMb29rdXBMb29wSXNaZXJvDQorCQkJCQ0KKwkJCQkJCQ0KKwkJCQkJCQ0KK0xvb2t1cExvb3AxOg0KKyAgICAgICAgYW5kIHI4ZCwgZWR4DQorDQorICAgICAgICBtb3Z6eCAgIHI4ZCwgd29yZCBwdHIgW3JkaSArIHI4KjJdDQorICAgICAgICBjbXAgcjhkLCBlYnANCisgICAgICAgIGpiZSBMZWF2ZU5vdw0KKwkJDQorCQkNCisJCQ0KKyAgICAgICAgc3ViIGVkeCwgMHgwMDAxMDAwMA0KKwkJQkVGT1JFX0pNUA0KKyAgICAgICAganMgIExlYXZlTm93DQorCQlBRlRFUl9KTVANCisNCitMb29wRW50cnkxOg0KKyAgICAgICAgY21wIGJ4LHdvcmQgcHRyIFtyc2kgKyByOCAtIDFdDQorCQlCRUZPUkVfSk1QDQorICAgICAgICBqeiAgTG9va3VwTG9vcElzWmVybw0KKwkJQUZURVJfSk1QDQorDQorTG9va3VwTG9vcDI6DQorICAgICAgICBhbmQgcjhkLCBlZHgNCisNCisgICAgICAgIG1vdnp4ICAgcjhkLCB3b3JkIHB0ciBbcmRpICsgcjgqMl0NCisgICAgICAgIGNtcCByOGQsIGVicA0KKwkJQkVGT1JFX0pNUA0KKyAgICAgICAgamJlIExlYXZlTm93DQorCQlBRlRFUl9KTVANCisgICAgICAgIHN1YiBlZHgsIDB4MDAwMTAwMDANCisJCUJFRk9SRV9KTVANCisgICAgICAgIGpzICBMZWF2ZU5vdw0KKwkJQUZURVJfSk1QDQorDQorTG9vcEVudHJ5MjoNCisgICAgICAgIGNtcCBieCx3b3JkIHB0ciBbcnNpICsgcjggLSAxXQ0KKwkJQkVGT1JFX0pNUA0KKyAgICAgICAganogIExvb2t1cExvb3BJc1plcm8NCisJCUFGVEVSX0pNUA0KKw0KK0xvb2t1cExvb3A0Og0KKyAgICAgICAgYW5kIHI4ZCwgZWR4DQorDQorICAgICAgICBtb3Z6eCAgIHI4ZCwgd29yZCBwdHIgW3JkaSArIHI4KjJdDQorICAgICAgICBjbXAgcjhkLCBlYnANCisJCUJFRk9SRV9KTVANCisgICAgICAgIGpiZSBMZWF2ZU5vdw0KKwkJQUZURVJfSk1QDQorICAgICAgICBzdWIgZWR4LCAweDAwMDEwMDAwDQorCQlCRUZPUkVfSk1QDQorICAgICAgICBqcyAgTGVhdmVOb3cNCisJCUFGVEVSX0pNUA0KKw0KK0xvb3BFbnRyeTQ6DQorDQorICAgICAgICBjbXAgYngsd29yZCBwdHIgW3JzaSArIHI4IC0gMV0NCisJCUJFRk9SRV9KTVANCisgICAgICAgIGpueiBMb29rdXBMb29wMQ0KKyAgICAgICAgam1wIExvb2t1cExvb3BJc1plcm8NCisJCUFGVEVSX0pNUA0KKy8qDQorOzs7IGRvIHsNCis7OzsgICAgIG1hdGNoID0gcy0+d2luZG93ICsgY3VyX21hdGNoOw0KKzs7OyAgICAgaWYgKCoodXNoZiopKG1hdGNoK2Jlc3RfbGVuLTEpICE9IHNjYW5fZW5kIHx8DQorOzs7ICAgICAgICAgKih1c2hmKiltYXRjaCAhPSBzY2FuX3N0YXJ0KSBjb250aW51ZTsNCis7OzsgICAgIFsuLi5dDQorOzs7IH0gd2hpbGUgKChjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXSkgPiBsaW1pdA0KKzs7OyAgICAgICAgICAmJiAtLWNoYWluX2xlbmd0aCAhPSAwKTsNCis7OzsNCis7OzsgSGVyZSBpcyB0aGUgaW5uZXIgbG9vcCBvZiB0aGUgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiB3aWxsIHNwZW5kIHRoZQ0KKzs7OyBtYWpvcml0eSBvZiBpdHMgdGltZSBpbiB0aGlzIGxvb3AsIGFuZCBtYWpvcml0eSBvZiB0aGF0IHRpbWUgd2lsbA0KKzs7OyBiZSBzcGVudCBpbiB0aGUgZmlyc3QgdGVuIGluc3RydWN0aW9ucy4NCis7OzsNCis7OzsgV2l0aGluIHRoaXMgbG9vcDoNCis7OzsgZWJ4ID0gc2NhbmVuZA0KKzs7OyByOGQgPSBjdXJtYXRjaA0KKzs7OyBlZHggPSBjaGFpbmxlbndtYXNrIC0gaS5lLiwgKChjaGFpbmxlbiA8PCAxNikgfCB3bWFzaykNCis7OzsgZXNpID0gd2luZG93YmVzdGxlbiAtIGkuZS4sICh3aW5kb3cgKyBiZXN0bGVuKQ0KKzs7OyBlZGkgPSBwcmV2DQorOzs7IGVicCA9IGxpbWl0DQorKi8NCisuYmFsaWduIDE2DQorTG9va3VwTG9vcDoNCisgICAgICAgIGFuZCByOGQsIGVkeA0KKw0KKyAgICAgICAgbW92enggICByOGQsIHdvcmQgcHRyIFtyZGkgKyByOCoyXQ0KKyAgICAgICAgY21wIHI4ZCwgZWJwDQorCQlCRUZPUkVfSk1QDQorICAgICAgICBqYmUgTGVhdmVOb3cNCisJCUFGVEVSX0pNUA0KKyAgICAgICAgc3ViIGVkeCwgMHgwMDAxMDAwMA0KKwkJQkVGT1JFX0pNUA0KKyAgICAgICAganMgIExlYXZlTm93DQorCQlBRlRFUl9KTVANCisNCitMb29wRW50cnk6DQorDQorICAgICAgICBjbXAgYngsd29yZCBwdHIgW3JzaSArIHI4IC0gMV0NCisJCUJFRk9SRV9KTVANCisgICAgICAgIGpueiBMb29rdXBMb29wMQ0KKwkJQUZURVJfSk1QDQorTG9va3VwTG9vcElzWmVybzoNCisgICAgICAgIGNtcCAgICAgcjEydywgd29yZCBwdHIgW3IxMCArIHI4XQ0KKwkJQkVGT1JFX0pNUA0KKyAgICAgICAgam56IExvb2t1cExvb3AxDQorCQlBRlRFUl9KTVANCisNCisNCisvLzs7OyBTdG9yZSB0aGUgY3VycmVudCB2YWx1ZSBvZiBjaGFpbmxlbi4NCisgICAgICAgIG1vdiBbY2hhaW5sZW53bWFza10sIGVkeA0KKy8qDQorOzs7IFBvaW50IGVkaSB0byB0aGUgc3RyaW5nIHVuZGVyIHNjcnV0aW55LCBhbmQgZXNpIHRvIHRoZSBzdHJpbmcgd2UNCis7OzsgYXJlIGhvcGluZyB0byBtYXRjaCBpdCB1cCB3aXRoLiBJbiBhY3R1YWxpdHksIGVzaSBhbmQgZWRpIGFyZQ0KKzs7OyBib3RoIHBvaW50ZWQgKE1BWF9NQVRDSF84IC0gc2NhbmFsaWduKSBieXRlcyBhaGVhZCwgYW5kIGVkeCBpcw0KKzs7OyBpbml0aWFsaXplZCB0byAtKE1BWF9NQVRDSF84IC0gc2NhbmFsaWduKS4NCisqLw0KKyAgICAgICAgbGVhIHJzaSxbcjgrcjEwXQ0KKyAgICAgICAgbW92IHJkeCwgMHhmZmZmZmZmZmZmZmZmZWY4IC8vOyAtKE1BWF9NQVRDSF84KQ0KKyAgICAgICAgbGVhIHJzaSwgW3JzaSArIHIxMyArIDB4MDEwOF0gLy87TUFYX01BVENIXzhdDQorICAgICAgICBsZWEgcmRpLCBbcjkgKyByMTMgKyAweDAxMDhdIC8vO01BWF9NQVRDSF84XQ0KKw0KKyAgICAgICAgcHJlZmV0Y2h0MSBbcnNpK3JkeF0NCisgICAgICAgIHByZWZldGNodDEgW3JkaStyZHhdDQorDQorLyoNCis7OzsgVGVzdCB0aGUgc3RyaW5ncyBmb3IgZXF1YWxpdHksIDggYnl0ZXMgYXQgYSB0aW1lLiBBdCB0aGUgZW5kLA0KKzs7OyBhZGp1c3QgcmR4IHNvIHRoYXQgaXQgaXMgb2Zmc2V0IHRvIHRoZSBleGFjdCBieXRlIHRoYXQgbWlzbWF0Y2hlZC4NCis7OzsNCis7OzsgV2UgYWxyZWFkeSBrbm93IGF0IHRoaXMgcG9pbnQgdGhhdCB0aGUgZmlyc3QgdGhyZWUgYnl0ZXMgb2YgdGhlDQorOzs7IHN0cmluZ3MgbWF0Y2ggZWFjaCBvdGhlciwgYW5kIHRoZXkgY2FuIGJlIHNhZmVseSBwYXNzZWQgb3ZlciBiZWZvcmUNCis7Ozsgc3RhcnRpbmcgdGhlIGNvbXBhcmUgbG9vcC4gU28gd2hhdCB0aGlzIGNvZGUgZG9lcyBpcyBza2lwIG92ZXIgMC0zDQorOzs7IGJ5dGVzLCBhcyBtdWNoIGFzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBkd29yZC1hbGlnbiB0aGUgZWRpDQorOzs7IHBvaW50ZXIuIChyc2kgd2lsbCBzdGlsbCBiZSBtaXNhbGlnbmVkIHRocmVlIHRpbWVzIG91dCBvZiBmb3VyLikNCis7OzsNCis7OzsgSXQgc2hvdWxkIGJlIGNvbmZlc3NlZCB0aGF0IHRoaXMgbG9vcCB1c3VhbGx5IGRvZXMgbm90IHJlcHJlc2VudA0KKzs7OyBtdWNoIG9mIHRoZSB0b3RhbCBydW5uaW5nIHRpbWUuIFJlcGxhY2luZyBpdCB3aXRoIGEgbW9yZQ0KKzs7OyBzdHJhaWdodGZvcndhcmQgInJlcCBjbXBzYiIgd291bGQgbm90IGRyYXN0aWNhbGx5IGRlZ3JhZGUNCis7OzsgcGVyZm9ybWFuY2UuDQorKi8NCisNCitMb29wQ21wczoNCisgICAgICAgIG1vdiByYXgsIFtyc2kgKyByZHhdDQorICAgICAgICB4b3IgcmF4LCBbcmRpICsgcmR4XQ0KKyAgICAgICAgam56IExlYXZlTG9vcENtcHMNCisNCisgICAgICAgIG1vdiByYXgsIFtyc2kgKyByZHggKyA4XQ0KKyAgICAgICAgeG9yIHJheCwgW3JkaSArIHJkeCArIDhdDQorICAgICAgICBqbnogTGVhdmVMb29wQ21wczgNCisNCisNCisgICAgICAgIG1vdiByYXgsIFtyc2kgKyByZHggKyA4KzhdDQorICAgICAgICB4b3IgcmF4LCBbcmRpICsgcmR4ICsgOCs4XQ0KKyAgICAgICAgam56IExlYXZlTG9vcENtcHMxNg0KKw0KKyAgICAgICAgYWRkIHJkeCw4KzgrOA0KKw0KKwkJQkVGT1JFX0pNUA0KKyAgICAgICAgam56ICBMb29wQ21wcw0KKyAgICAgICAgam1wICBMZW5NYXhpbXVtDQorCQlBRlRFUl9KTVANCisJCQ0KK0xlYXZlTG9vcENtcHMxNjogYWRkIHJkeCw4DQorTGVhdmVMb29wQ21wczg6IGFkZCByZHgsOA0KK0xlYXZlTG9vcENtcHM6DQorDQorICAgICAgICB0ZXN0ICAgIGVheCwgMHgwMDAwRkZGRg0KKyAgICAgICAgam56IExlbkxvd2VyDQorDQorICAgICAgICB0ZXN0IGVheCwweGZmZmZmZmZmDQorDQorICAgICAgICBqbnogTGVuTG93ZXIzMg0KKw0KKyAgICAgICAgYWRkIHJkeCw0DQorICAgICAgICBzaHIgcmF4LDMyDQorICAgICAgICBvciBheCxheA0KKwkJQkVGT1JFX0pNUA0KKyAgICAgICAgam56IExlbkxvd2VyDQorCQlBRlRFUl9KTVANCisNCitMZW5Mb3dlcjMyOg0KKyAgICAgICAgc2hyIGVheCwxNg0KKyAgICAgICAgYWRkIHJkeCwyDQorCQkNCitMZW5Mb3dlcjoJCQ0KKyAgICAgICAgc3ViIGFsLCAxDQorICAgICAgICBhZGMgcmR4LCAwDQorLy87OzsgQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLiBJZiBpdCBpcyBsb25nZXIgdGhhbiBNQVhfTUFUQ0gsDQorLy87OzsgdGhlbiBhdXRvbWF0aWNhbGx5IGFjY2VwdCBpdCBhcyB0aGUgYmVzdCBwb3NzaWJsZSBtYXRjaCBhbmQgbGVhdmUuDQorDQorICAgICAgICBsZWEgcmF4LCBbcmRpICsgcmR4XQ0KKyAgICAgICAgc3ViIHJheCwgcjkNCisgICAgICAgIGNtcCBlYXgsIE1BWF9NQVRDSA0KKwkJQkVGT1JFX0pNUA0KKyAgICAgICAgamdlIExlbk1heGltdW0NCisJCUFGVEVSX0pNUA0KKy8qDQorOzs7IElmIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIG5vdCBsb25nZXIgdGhhbiB0aGUgYmVzdCBtYXRjaCB3ZQ0KKzs7OyBoYXZlIHNvIGZhciwgdGhlbiBmb3JnZXQgaXQgYW5kIHJldHVybiB0byB0aGUgbG9va3VwIGxvb3AuDQorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorKi8NCisgICAgICAgIGNtcCBlYXgsIHIxMWQNCisgICAgICAgIGpnICBMb25nZXJNYXRjaA0KKw0KKyAgICAgICAgbGVhIHJzaSxbcjEwK3IxMV0NCisNCisgICAgICAgIG1vdiByZGksIHByZXZfYWQNCisgICAgICAgIG1vdiBlZHgsIFtjaGFpbmxlbndtYXNrXQ0KKwkJQkVGT1JFX0pNUA0KKyAgICAgICAgam1wIExvb2t1cExvb3ANCisJCUFGVEVSX0pNUA0KKy8qDQorOzs7ICAgICAgICAgcy0+bWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7DQorOzs7ICAgICAgICAgYmVzdF9sZW4gPSBsZW47DQorOzs7ICAgICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSBicmVhazsNCis7OzsgICAgICAgICBzY2FuX2VuZCA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7DQorKi8NCitMb25nZXJNYXRjaDoNCisgICAgICAgIG1vdiByMTFkLCBlYXgNCisgICAgICAgIG1vdiBtYXRjaF9zdGFydCwgcjhkDQorICAgICAgICBjbXAgZWF4LCBbbmljZW1hdGNoXQ0KKwkJQkVGT1JFX0pNUA0KKyAgICAgICAgamdlIExlYXZlTm93DQorCQlBRlRFUl9KTVANCisNCisgICAgICAgIGxlYSByc2ksW3IxMCtyYXhdDQorDQorICAgICAgICBtb3Z6eCAgIGVieCwgd29yZCBwdHIgW3I5ICsgcmF4IC0gMV0NCisgICAgICAgIG1vdiByZGksIHByZXZfYWQNCisgICAgICAgIG1vdiBlZHgsIFtjaGFpbmxlbndtYXNrXQ0KKwkJQkVGT1JFX0pNUA0KKyAgICAgICAgam1wIExvb2t1cExvb3ANCisJCUFGVEVSX0pNUA0KKw0KKy8vOzs7IEFjY2VwdCB0aGUgY3VycmVudCBzdHJpbmcsIHdpdGggdGhlIG1heGltdW0gcG9zc2libGUgbGVuZ3RoLg0KKw0KK0xlbk1heGltdW06DQorICAgICAgICBtb3YgcjExZCxNQVhfTUFUQ0gNCisgICAgICAgIG1vdiBtYXRjaF9zdGFydCwgcjhkDQorDQorLy87OzsgaWYgKCh1SW50KWJlc3RfbGVuIDw9IHMtPmxvb2thaGVhZCkgcmV0dXJuICh1SW50KWJlc3RfbGVuOw0KKy8vOzs7IHJldHVybiBzLT5sb29rYWhlYWQ7DQorDQorTGVhdmVOb3c6DQorICAgICAgICBtb3YgZWF4LCBMb29rYWhlYWQNCisgICAgICAgIGNtcCByMTFkLCBlYXgNCisgICAgICAgIGNtb3ZuZyBlYXgsIHIxMWQNCisNCisNCisNCisvLzs7OyBSZXN0b3JlIHRoZSBzdGFjayBhbmQgcmV0dXJuIGZyb20gd2hlbmNlIHdlIGNhbWUuDQorDQorDQorLy8gICAgICAgIG1vdiByc2ksW3NhdmVfcnNpXQ0KKy8vICAgICAgICBtb3YgcmRpLFtzYXZlX3JkaV0NCisgICAgICAgIG1vdiByYngsW3NhdmVfcmJ4XQ0KKyAgICAgICAgbW92IHJicCxbc2F2ZV9yYnBdDQorICAgICAgICBtb3YgcjEyLFtzYXZlX3IxMl0NCisgICAgICAgIG1vdiByMTMsW3NhdmVfcjEzXQ0KKyAgICAgICAgbW92IHIxNCxbc2F2ZV9yMTRdDQorICAgICAgICBtb3YgcjE1LFtzYXZlX3IxNV0NCisNCisNCisgICAgICAgIHJldCAwDQorLy87IHBsZWFzZSBkb24ndCByZW1vdmUgdGhpcyBzdHJpbmcgIQ0KKy8vOyBZb3VyIGNhbiBmcmVlbHkgdXNlIGd2bWF0NjQgaW4gYW55IGZyZWUgb3IgY29tbWVyY2lhbCBhcHANCisvLzsgYnV0IGl0IGlzIGZhciBiZXR0ZXIgZG9uJ3QgcmVtb3ZlIHRoZSBzdHJpbmcgaW4gdGhlIGJpbmFyeSENCisgLy8gICBkYiAgICAgMGRoLDBhaCwiYXNtNjg2IHdpdGggbWFzbSwgb3B0aW1pc2VkIGFzc2VtYmx5IGNvZGUgZnJvbSBCcmlhbiBSYWl0ZXIsIHdyaXR0ZW4gMTk5OCwgY29udmVydGVkIHRvIGFtZCA2NCBieSBHaWxsZXMgVm9sbGFudCAyMDA1IiwwZGgsMGFoLDANCisNCisNCittYXRjaF9pbml0Og0KKyAgcmV0IDANCisNCisNCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL2luZmJhY2s5L1JFQURNRSBiL3psaWIvc3JjL2NvbnRyaWIvaW5mYmFjazkvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NWVkMTMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL2luZmJhY2s5L1JFQURNRQpAQCAtMCwwICsxIEBACitTZWUgaW5mYmFjazkuaCBmb3Igd2hhdCB0aGlzIGlzIGFuZCBob3cgdG8gdXNlIGl0LgpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9pbmZiYWNrOS9pbmZiYWNrOS5jIGIvemxpYi9zcmMvY29udHJpYi9pbmZiYWNrOS9pbmZiYWNrOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZmIzZTMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL2luZmJhY2s5L2luZmJhY2s5LmMKQEAgLTAsMCArMSw2MTUgQEAKKy8qIGluZmJhY2s5LmMgLS0gaW5mbGF0ZSBkZWZsYXRlNjQgZGF0YSB1c2luZyBhIGNhbGwtYmFjayBpbnRlcmZhY2UKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA4IE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisjaW5jbHVkZSAienV0aWwuaCIKKyNpbmNsdWRlICJpbmZiYWNrOS5oIgorI2luY2x1ZGUgImluZnRyZWU5LmgiCisjaW5jbHVkZSAiaW5mbGF0ZTkuaCIKKworI2RlZmluZSBXU0laRSA2NTUzNlVMCisKKy8qCisgICBzdHJtIHByb3ZpZGVzIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyBpbiB6YWxsb2MgYW5kIHpmcmVlLCBvcgorICAgWl9OVUxMIHRvIHVzZSB0aGUgbGlicmFyeSBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCisKKyAgIHdpbmRvdyBpcyBhIHVzZXItc3VwcGxpZWQgd2luZG93IGFuZCBvdXRwdXQgYnVmZmVyIHRoYXQgaXMgNjRLIGJ5dGVzLgorICovCitpbnQgWkVYUE9SVCBpbmZsYXRlQmFjazlJbml0XyhzdHJtLCB3aW5kb3csIHZlcnNpb24sIHN0cmVhbV9zaXplKQorel9zdHJlYW0gRkFSICpzdHJtOwordW5zaWduZWQgY2hhciBGQVIgKndpbmRvdzsKK2NvbnN0IGNoYXIgKnZlcnNpb247CitpbnQgc3RyZWFtX3NpemU7Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIGlmICh2ZXJzaW9uID09IFpfTlVMTCB8fCB2ZXJzaW9uWzBdICE9IFpMSUJfVkVSU0lPTlswXSB8fAorICAgICAgICBzdHJlYW1fc2l6ZSAhPSAoaW50KShzaXplb2Yoel9zdHJlYW0pKSkKKyAgICAgICAgcmV0dXJuIFpfVkVSU0lPTl9FUlJPUjsKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgd2luZG93ID09IFpfTlVMTCkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0cm0tPm1zZyA9IFpfTlVMTDsgICAgICAgICAgICAgICAgIC8qIGluIGNhc2Ugd2UgcmV0dXJuIGFuIGVycm9yICovCisgICAgaWYgKHN0cm0tPnphbGxvYyA9PSAoYWxsb2NfZnVuYykwKSB7CisgICAgICAgIHN0cm0tPnphbGxvYyA9IHpjYWxsb2M7CisgICAgICAgIHN0cm0tPm9wYXF1ZSA9ICh2b2lkcGYpMDsKKyAgICB9CisgICAgaWYgKHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCkgc3RybS0+emZyZWUgPSB6Y2ZyZWU7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopWkFMTE9DKHN0cm0sIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSkpOworICAgIGlmIChzdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6IGFsbG9jYXRlZFxuIikpOworICAgIHN0cm0tPnN0YXRlID0gKHZvaWRwZilzdGF0ZTsKKyAgICBzdGF0ZS0+d2luZG93ID0gd2luZG93OworICAgIHJldHVybiBaX09LOworfQorCisvKgorICAgQnVpbGQgYW5kIG91dHB1dCBsZW5ndGggYW5kIGRpc3RhbmNlIGRlY29kaW5nIHRhYmxlcyBmb3IgZml4ZWQgY29kZQorICAgZGVjb2RpbmcuCisgKi8KKyNpZmRlZiBNQUtFRklYRUQKKyNpbmNsdWRlIDxzdGRpby5oPgorCit2b2lkIG1ha2VmaXhlZDkodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBzeW0sIGJpdHMsIGxvdywgc2l6ZTsKKyAgICBjb2RlICpuZXh0LCAqbGVuZml4LCAqZGlzdGZpeDsKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBzdGF0ZTsKKyAgICBjb2RlIGZpeGVkWzU0NF07CisKKyAgICAvKiBsaXRlcmFsL2xlbmd0aCB0YWJsZSAqLworICAgIHN5bSA9IDA7CisgICAgd2hpbGUgKHN5bSA8IDE0NCkgc3RhdGUubGVuc1tzeW0rK10gPSA4OworICAgIHdoaWxlIChzeW0gPCAyNTYpIHN0YXRlLmxlbnNbc3ltKytdID0gOTsKKyAgICB3aGlsZSAoc3ltIDwgMjgwKSBzdGF0ZS5sZW5zW3N5bSsrXSA9IDc7CisgICAgd2hpbGUgKHN5bSA8IDI4OCkgc3RhdGUubGVuc1tzeW0rK10gPSA4OworICAgIG5leHQgPSBmaXhlZDsKKyAgICBsZW5maXggPSBuZXh0OworICAgIGJpdHMgPSA5OworICAgIGluZmxhdGVfdGFibGU5KExFTlMsIHN0YXRlLmxlbnMsIDI4OCwgJihuZXh0KSwgJihiaXRzKSwgc3RhdGUud29yayk7CisKKyAgICAvKiBkaXN0YW5jZSB0YWJsZSAqLworICAgIHN5bSA9IDA7CisgICAgd2hpbGUgKHN5bSA8IDMyKSBzdGF0ZS5sZW5zW3N5bSsrXSA9IDU7CisgICAgZGlzdGZpeCA9IG5leHQ7CisgICAgYml0cyA9IDU7CisgICAgaW5mbGF0ZV90YWJsZTkoRElTVFMsIHN0YXRlLmxlbnMsIDMyLCAmKG5leHQpLCAmKGJpdHMpLCBzdGF0ZS53b3JrKTsKKworICAgIC8qIHdyaXRlIHRhYmxlcyAqLworICAgIHB1dHMoIiAgICAvKiBpbmZmaXg5LmggLS0gdGFibGUgZm9yIGRlY29kaW5nIGRlZmxhdGU2NCBmaXhlZCBjb2RlcyIpOworICAgIHB1dHMoIiAgICAgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBtYWtlZml4ZWQ5KCkuIik7CisgICAgcHV0cygiICAgICAqLyIpOworICAgIHB1dHMoIiIpOworICAgIHB1dHMoIiAgICAvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiIpOworICAgIHB1dHMoIiAgICAgICBJdCBpcyBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGxpYnJhcnkgYW5kIGlzIik7CisgICAgcHV0cygiICAgICAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4iKTsKKyAgICBwdXRzKCIgICAgICovIik7CisgICAgcHV0cygiIik7CisgICAgc2l6ZSA9IDFVIDw8IDk7CisgICAgcHJpbnRmKCIgICAgc3RhdGljIGNvbnN0IGNvZGUgbGVuZml4WyV1XSA9IHsiLCBzaXplKTsKKyAgICBsb3cgPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKChsb3cgJSA2KSA9PSAwKSBwcmludGYoIlxuICAgICAgICAiKTsKKyAgICAgICAgcHJpbnRmKCJ7JXUsJXUsJWR9IiwgbGVuZml4W2xvd10ub3AsIGxlbmZpeFtsb3ddLmJpdHMsCisgICAgICAgICAgICAgICBsZW5maXhbbG93XS52YWwpOworICAgICAgICBpZiAoKytsb3cgPT0gc2l6ZSkgYnJlYWs7CisgICAgICAgIHB1dGNoYXIoJywnKTsKKyAgICB9CisgICAgcHV0cygiXG4gICAgfTsiKTsKKyAgICBzaXplID0gMVUgPDwgNTsKKyAgICBwcmludGYoIlxuICAgIHN0YXRpYyBjb25zdCBjb2RlIGRpc3RmaXhbJXVdID0geyIsIHNpemUpOworICAgIGxvdyA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoKGxvdyAlIDUpID09IDApIHByaW50ZigiXG4gICAgICAgICIpOworICAgICAgICBwcmludGYoInsldSwldSwlZH0iLCBkaXN0Zml4W2xvd10ub3AsIGRpc3RmaXhbbG93XS5iaXRzLAorICAgICAgICAgICAgICAgZGlzdGZpeFtsb3ddLnZhbCk7CisgICAgICAgIGlmICgrK2xvdyA9PSBzaXplKSBicmVhazsKKyAgICAgICAgcHV0Y2hhcignLCcpOworICAgIH0KKyAgICBwdXRzKCJcbiAgICB9OyIpOworfQorI2VuZGlmIC8qIE1BS0VGSVhFRCAqLworCisvKiBNYWNyb3MgZm9yIGluZmxhdGVCYWNrKCk6ICovCisKKy8qIENsZWFyIHRoZSBpbnB1dCBiaXQgYWNjdW11bGF0b3IgKi8KKyNkZWZpbmUgSU5JVEJJVFMoKSBcCisgICAgZG8geyBcCisgICAgICAgIGhvbGQgPSAwOyBcCisgICAgICAgIGJpdHMgPSAwOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogQXNzdXJlIHRoYXQgc29tZSBpbnB1dCBpcyBhdmFpbGFibGUuICBJZiBpbnB1dCBpcyByZXF1ZXN0ZWQsIGJ1dCBkZW5pZWQsCisgICB0aGVuIHJldHVybiBhIFpfQlVGX0VSUk9SIGZyb20gaW5mbGF0ZUJhY2soKS4gKi8KKyNkZWZpbmUgUFVMTCgpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaWYgKGhhdmUgPT0gMCkgeyBcCisgICAgICAgICAgICBoYXZlID0gaW4oaW5fZGVzYywgJm5leHQpOyBcCisgICAgICAgICAgICBpZiAoaGF2ZSA9PSAwKSB7IFwKKyAgICAgICAgICAgICAgICBuZXh0ID0gWl9OVUxMOyBcCisgICAgICAgICAgICAgICAgcmV0ID0gWl9CVUZfRVJST1I7IFwKKyAgICAgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUgKDApCisKKy8qIEdldCBhIGJ5dGUgb2YgaW5wdXQgaW50byB0aGUgYml0IGFjY3VtdWxhdG9yLCBvciByZXR1cm4gZnJvbSBpbmZsYXRlQmFjaygpCisgICB3aXRoIGFuIGVycm9yIGlmIHRoZXJlIGlzIG5vIGlucHV0IGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgUFVMTEJZVEUoKSBcCisgICAgZG8geyBcCisgICAgICAgIFBVTEwoKTsgXAorICAgICAgICBoYXZlLS07IFwKKyAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoKm5leHQrKykgPDwgYml0czsgXAorICAgICAgICBiaXRzICs9IDg7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBBc3N1cmUgdGhhdCB0aGVyZSBhcmUgYXQgbGVhc3QgbiBiaXRzIGluIHRoZSBiaXQgYWNjdW11bGF0b3IuICBJZiB0aGVyZSBpcworICAgbm90IGVub3VnaCBhdmFpbGFibGUgaW5wdXQgdG8gZG8gdGhhdCwgdGhlbiByZXR1cm4gZnJvbSBpbmZsYXRlQmFjaygpIHdpdGgKKyAgIGFuIGVycm9yLiAqLworI2RlZmluZSBORUVEQklUUyhuKSBcCisgICAgZG8geyBcCisgICAgICAgIHdoaWxlIChiaXRzIDwgKHVuc2lnbmVkKShuKSkgXAorICAgICAgICAgICAgUFVMTEJZVEUoKTsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIFJldHVybiB0aGUgbG93IG4gYml0cyBvZiB0aGUgYml0IGFjY3VtdWxhdG9yIChuIDw9IDE2KSAqLworI2RlZmluZSBCSVRTKG4pIFwKKyAgICAoKHVuc2lnbmVkKWhvbGQgJiAoKDFVIDw8IChuKSkgLSAxKSkKKworLyogUmVtb3ZlIG4gYml0cyBmcm9tIHRoZSBiaXQgYWNjdW11bGF0b3IgKi8KKyNkZWZpbmUgRFJPUEJJVFMobikgXAorICAgIGRvIHsgXAorICAgICAgICBob2xkID4+PSAobik7IFwKKyAgICAgICAgYml0cyAtPSAodW5zaWduZWQpKG4pOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogUmVtb3ZlIHplcm8gdG8gc2V2ZW4gYml0cyBhcyBuZWVkZWQgdG8gZ28gdG8gYSBieXRlIGJvdW5kYXJ5ICovCisjZGVmaW5lIEJZVEVCSVRTKCkgXAorICAgIGRvIHsgXAorICAgICAgICBob2xkID4+PSBiaXRzICYgNzsgXAorICAgICAgICBiaXRzIC09IGJpdHMgJiA3OyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogQXNzdXJlIHRoYXQgc29tZSBvdXRwdXQgc3BhY2UgaXMgYXZhaWxhYmxlLCBieSB3cml0aW5nIG91dCB0aGUgd2luZG93CisgICBpZiBpdCdzIGZ1bGwuICBJZiB0aGUgd3JpdGUgZmFpbHMsIHJldHVybiBmcm9tIGluZmxhdGVCYWNrKCkgd2l0aCBhCisgICBaX0JVRl9FUlJPUi4gKi8KKyNkZWZpbmUgUk9PTSgpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaWYgKGxlZnQgPT0gMCkgeyBcCisgICAgICAgICAgICBwdXQgPSB3aW5kb3c7IFwKKyAgICAgICAgICAgIGxlZnQgPSBXU0laRTsgXAorICAgICAgICAgICAgd3JhcCA9IDE7IFwKKyAgICAgICAgICAgIGlmIChvdXQob3V0X2Rlc2MsIHB1dCwgKHVuc2lnbmVkKWxlZnQpKSB7IFwKKyAgICAgICAgICAgICAgICByZXQgPSBaX0JVRl9FUlJPUjsgXAorICAgICAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgfSB3aGlsZSAoMCkKKworLyoKKyAgIHN0cm0gcHJvdmlkZXMgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyBhbmQgd2luZG93IGJ1ZmZlciBvbiBpbnB1dCwKKyAgIGFuZCBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUgdW51c2VkIGlucHV0IG9uIHJldHVybi4gIEZvciBaX0RBVEFfRVJST1IKKyAgIHJldHVybnMsIHN0cm0gd2lsbCBhbHNvIHByb3ZpZGUgYW4gZXJyb3IgbWVzc2FnZS4KKworICAgaW4oKSBhbmQgb3V0KCkgYXJlIHRoZSBjYWxsLWJhY2sgaW5wdXQgYW5kIG91dHB1dCBmdW5jdGlvbnMuICBXaGVuCisgICBpbmZsYXRlQmFjaygpIG5lZWRzIG1vcmUgaW5wdXQsIGl0IGNhbGxzIGluKCkuICBXaGVuIGluZmxhdGVCYWNrKCkgaGFzCisgICBmaWxsZWQgdGhlIHdpbmRvdyB3aXRoIG91dHB1dCwgb3Igd2hlbiBpdCBjb21wbGV0ZXMgd2l0aCBkYXRhIGluIHRoZQorICAgd2luZG93LCBpdCBjYWxscyBvdXQoKSB0byB3cml0ZSBvdXQgdGhlIGRhdGEuICBUaGUgYXBwbGljYXRpb24gbXVzdCBub3QKKyAgIGNoYW5nZSB0aGUgcHJvdmlkZWQgaW5wdXQgdW50aWwgaW4oKSBpcyBjYWxsZWQgYWdhaW4gb3IgaW5mbGF0ZUJhY2soKQorICAgcmV0dXJucy4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IG5vdCBjaGFuZ2UgdGhlIHdpbmRvdy9vdXRwdXQgYnVmZmVyIHVudGlsCisgICBpbmZsYXRlQmFjaygpIHJldHVybnMuCisKKyAgIGluKCkgYW5kIG91dCgpIGFyZSBjYWxsZWQgd2l0aCBhIGRlc2NyaXB0b3IgcGFyYW1ldGVyIHByb3ZpZGVkIGluIHRoZQorICAgaW5mbGF0ZUJhY2soKSBjYWxsLiAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgc3RydWN0dXJlIHRoYXQgcHJvdmlkZXMgdGhlCisgICBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBkbyB0aGUgcmVhZCBvciB3cml0ZSwgYXMgd2VsbCBhcyBhY2N1bXVsYXRlZAorICAgaW5mb3JtYXRpb24gb24gdGhlIGlucHV0IGFuZCBvdXRwdXQgc3VjaCBhcyB0b3RhbHMgYW5kIGNoZWNrIHZhbHVlcy4KKworICAgaW4oKSBzaG91bGQgcmV0dXJuIHplcm8gb24gZmFpbHVyZS4gIG91dCgpIHNob3VsZCByZXR1cm4gbm9uLXplcm8gb24KKyAgIGZhaWx1cmUuICBJZiBlaXRoZXIgaW4oKSBvciBvdXQoKSBmYWlscywgdGhhbiBpbmZsYXRlQmFjaygpIHJldHVybnMgYQorICAgWl9CVUZfRVJST1IuICBzdHJtLT5uZXh0X2luIGNhbiBiZSBjaGVja2VkIGZvciBaX05VTEwgdG8gc2VlIHdoZXRoZXIgaXQKKyAgIHdhcyBpbigpIG9yIG91dCgpIHRoYXQgY2F1c2VkIGluIHRoZSBlcnJvci4gIE90aGVyd2lzZSwgIGluZmxhdGVCYWNrKCkKKyAgIHJldHVybnMgWl9TVFJFQU1fRU5EIG9uIHN1Y2Nlc3MsIFpfREFUQV9FUlJPUiBmb3IgYW4gZGVmbGF0ZSBmb3JtYXQKKyAgIGVycm9yLCBvciBaX01FTV9FUlJPUiBpZiBpdCBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc3RhdGUuCisgICBpbmZsYXRlQmFjaygpIGNhbiBhbHNvIHJldHVybiBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgaW5wdXQgcGFyYW1ldGVycworICAgYXJlIG5vdCBjb3JyZWN0LCBpLmUuIHN0cm0gaXMgWl9OVUxMIG9yIHRoZSBzdGF0ZSB3YXMgbm90IGluaXRpYWxpemVkLgorICovCitpbnQgWkVYUE9SVCBpbmZsYXRlQmFjazkoc3RybSwgaW4sIGluX2Rlc2MsIG91dCwgb3V0X2Rlc2MpCit6X3N0cmVhbSBGQVIgKnN0cm07Citpbl9mdW5jIGluOwordm9pZCBGQVIgKmluX2Rlc2M7CitvdXRfZnVuYyBvdXQ7Cit2b2lkIEZBUiAqb3V0X2Rlc2M7Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKyAgICB6X2NvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICpuZXh0OyAgICAvKiBuZXh0IGlucHV0ICovCisgICAgdW5zaWduZWQgY2hhciBGQVIgKnB1dDsgICAgIC8qIG5leHQgb3V0cHV0ICovCisgICAgdW5zaWduZWQgaGF2ZTsgICAgICAgICAgICAgIC8qIGF2YWlsYWJsZSBpbnB1dCAqLworICAgIHVuc2lnbmVkIGxvbmcgbGVmdDsgICAgICAgICAvKiBhdmFpbGFibGUgb3V0cHV0ICovCisgICAgaW5mbGF0ZV9tb2RlIG1vZGU7ICAgICAgICAgIC8qIGN1cnJlbnQgaW5mbGF0ZSBtb2RlICovCisgICAgaW50IGxhc3RibG9jazsgICAgICAgICAgICAgIC8qIHRydWUgaWYgcHJvY2Vzc2luZyBsYXN0IGJsb2NrICovCisgICAgaW50IHdyYXA7ICAgICAgICAgICAgICAgICAgIC8qIHRydWUgaWYgdGhlIHdpbmRvdyBoYXMgd3JhcHBlZCAqLworICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3c7ICAvKiBhbGxvY2F0ZWQgc2xpZGluZyB3aW5kb3csIGlmIG5lZWRlZCAqLworICAgIHVuc2lnbmVkIGxvbmcgaG9sZDsgICAgICAgICAvKiBiaXQgYnVmZmVyICovCisgICAgdW5zaWduZWQgYml0czsgICAgICAgICAgICAgIC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqLworICAgIHVuc2lnbmVkIGV4dHJhOyAgICAgICAgICAgICAvKiBleHRyYSBiaXRzIG5lZWRlZCAqLworICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOyAgICAgICAvKiBsaXRlcmFsIG9yIGxlbmd0aCBvZiBkYXRhIHRvIGNvcHkgKi8KKyAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsgICAgICAgLyogZGlzdGFuY2UgYmFjayB0byBjb3B5IHN0cmluZyBmcm9tICovCisgICAgdW5zaWduZWQgbG9uZyBjb3B5OyAgICAgICAgIC8qIG51bWJlciBvZiBzdG9yZWQgb3IgbWF0Y2ggYnl0ZXMgdG8gY29weSAqLworICAgIHVuc2lnbmVkIGNoYXIgRkFSICpmcm9tOyAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGJ5dGVzIGZyb20gKi8KKyAgICBjb2RlIGNvbnN0IEZBUiAqbGVuY29kZTsgICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGxlbmd0aC9saXRlcmFsIGNvZGVzICovCisgICAgY29kZSBjb25zdCBGQVIgKmRpc3Rjb2RlOyAgIC8qIHN0YXJ0aW5nIHRhYmxlIGZvciBkaXN0YW5jZSBjb2RlcyAqLworICAgIHVuc2lnbmVkIGxlbmJpdHM7ICAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBsZW5jb2RlICovCisgICAgdW5zaWduZWQgZGlzdGJpdHM7ICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGRpc3Rjb2RlICovCisgICAgY29kZSBoZXJlOyAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgZGVjb2RpbmcgdGFibGUgZW50cnkgKi8KKyAgICBjb2RlIGxhc3Q7ICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovCisgICAgdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAgIC8qIGxlbmd0aCB0byBjb3B5IGZvciByZXBlYXRzLCBiaXRzIHRvIGRyb3AgKi8KKyAgICBpbnQgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi8KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgb3JkZXJbMTldID0gLyogcGVybXV0YXRpb24gb2YgY29kZSBsZW5ndGhzICovCisgICAgICAgIHsxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1fTsKKyNpbmNsdWRlICJpbmZmaXg5LmgiCisKKyAgICAvKiBDaGVjayB0aGF0IHRoZSBzdHJtIGV4aXN0cyBhbmQgdGhhdCB0aGUgc3RhdGUgd2FzIGluaXRpYWxpemVkICovCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOworCisgICAgLyogUmVzZXQgdGhlIHN0YXRlICovCisgICAgc3RybS0+bXNnID0gWl9OVUxMOworICAgIG1vZGUgPSBUWVBFOworICAgIGxhc3RibG9jayA9IDA7CisgICAgd3JhcCA9IDA7CisgICAgd2luZG93ID0gc3RhdGUtPndpbmRvdzsKKyAgICBuZXh0ID0gc3RybS0+bmV4dF9pbjsKKyAgICBoYXZlID0gbmV4dCAhPSBaX05VTEwgPyBzdHJtLT5hdmFpbF9pbiA6IDA7CisgICAgaG9sZCA9IDA7CisgICAgYml0cyA9IDA7CisgICAgcHV0ID0gd2luZG93OworICAgIGxlZnQgPSBXU0laRTsKKyAgICBsZW5jb2RlID0gWl9OVUxMOworICAgIGRpc3Rjb2RlID0gWl9OVUxMOworCisgICAgLyogSW5mbGF0ZSB1bnRpbCBlbmQgb2YgYmxvY2sgbWFya2VkIGFzIGxhc3QgKi8KKyAgICBmb3IgKDs7KQorICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgY2FzZSBUWVBFOgorICAgICAgICAgICAgLyogZGV0ZXJtaW5lIGFuZCBkaXNwYXRjaCBibG9jayB0eXBlICovCisgICAgICAgICAgICBpZiAobGFzdGJsb2NrKSB7CisgICAgICAgICAgICAgICAgQllURUJJVFMoKTsKKyAgICAgICAgICAgICAgICBtb2RlID0gRE9ORTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5FRURCSVRTKDMpOworICAgICAgICAgICAgbGFzdGJsb2NrID0gQklUUygxKTsKKyAgICAgICAgICAgIERST1BCSVRTKDEpOworICAgICAgICAgICAgc3dpdGNoIChCSVRTKDIpKSB7CisgICAgICAgICAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZWQgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICBzdG9yZWQgYmxvY2slc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RibG9jayA/ICIgKGxhc3QpIiA6ICIiKSk7CisgICAgICAgICAgICAgICAgbW9kZSA9IFNUT1JFRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpeGVkIGJsb2NrICovCisgICAgICAgICAgICAgICAgbGVuY29kZSA9IGxlbmZpeDsKKyAgICAgICAgICAgICAgICBsZW5iaXRzID0gOTsKKyAgICAgICAgICAgICAgICBkaXN0Y29kZSA9IGRpc3RmaXg7CisgICAgICAgICAgICAgICAgZGlzdGJpdHMgPSA1OworICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIGZpeGVkIGNvZGVzIGJsb2NrJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0YmxvY2sgPyAiIChsYXN0KSIgOiAiIikpOworICAgICAgICAgICAgICAgIG1vZGUgPSBMRU47ICAgICAgICAgICAgICAgICAgICAgLyogZGVjb2RlIGNvZGVzICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljIGJsb2NrICovCisgICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgZHluYW1pYyBjb2RlcyBibG9jayVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbGFzdGJsb2NrID8gIiAobGFzdCkiIDogIiIpKTsKKyAgICAgICAgICAgICAgICBtb2RlID0gVEFCTEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBibG9jayB0eXBlIjsKKyAgICAgICAgICAgICAgICBtb2RlID0gQkFEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRFJPUEJJVFMoMik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNUT1JFRDoKKyAgICAgICAgICAgIC8qIGdldCBhbmQgdmVyaWZ5IHN0b3JlZCBibG9jayBsZW5ndGggKi8KKyAgICAgICAgICAgIEJZVEVCSVRTKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdvIHRvIGJ5dGUgYm91bmRhcnkgKi8KKyAgICAgICAgICAgIE5FRURCSVRTKDMyKTsKKyAgICAgICAgICAgIGlmICgoaG9sZCAmIDB4ZmZmZikgIT0gKChob2xkID4+IDE2KSBeIDB4ZmZmZikpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzIjsKKyAgICAgICAgICAgICAgICBtb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGVuZ3RoID0gKHVuc2lnbmVkKWhvbGQgJiAweGZmZmY7CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHN0b3JlZCBsZW5ndGggJWx1XG4iLAorICAgICAgICAgICAgICAgICAgICBsZW5ndGgpKTsKKyAgICAgICAgICAgIElOSVRCSVRTKCk7CisKKyAgICAgICAgICAgIC8qIGNvcHkgc3RvcmVkIGJsb2NrIGZyb20gaW5wdXQgdG8gb3V0cHV0ICovCisgICAgICAgICAgICB3aGlsZSAobGVuZ3RoICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb3B5ID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIFBVTEwoKTsKKyAgICAgICAgICAgICAgICBST09NKCk7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSBjb3B5ID0gaGF2ZTsKKyAgICAgICAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIGNvcHkgPSBsZWZ0OworICAgICAgICAgICAgICAgIHptZW1jcHkocHV0LCBuZXh0LCBjb3B5KTsKKyAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7CisgICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OworICAgICAgICAgICAgICAgIGxlZnQgLT0gY29weTsKKyAgICAgICAgICAgICAgICBwdXQgKz0gY29weTsKKyAgICAgICAgICAgICAgICBsZW5ndGggLT0gY29weTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgc3RvcmVkIGVuZFxuIikpOworICAgICAgICAgICAgbW9kZSA9IFRZUEU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRBQkxFOgorICAgICAgICAgICAgLyogZ2V0IGR5bmFtaWMgdGFibGUgZW50cmllcyBkZXNjcmlwdG9yICovCisgICAgICAgICAgICBORUVEQklUUygxNCk7CisgICAgICAgICAgICBzdGF0ZS0+bmxlbiA9IEJJVFMoNSkgKyAyNTc7CisgICAgICAgICAgICBEUk9QQklUUyg1KTsKKyAgICAgICAgICAgIHN0YXRlLT5uZGlzdCA9IEJJVFMoNSkgKyAxOworICAgICAgICAgICAgRFJPUEJJVFMoNSk7CisgICAgICAgICAgICBzdGF0ZS0+bmNvZGUgPSBCSVRTKDQpICsgNDsKKyAgICAgICAgICAgIERST1BCSVRTKDQpOworICAgICAgICAgICAgaWYgKHN0YXRlLT5ubGVuID4gMjg2KSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikidG9vIG1hbnkgbGVuZ3RoIHN5bWJvbHMiOworICAgICAgICAgICAgICAgIG1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHRhYmxlIHNpemVzIG9rXG4iKSk7CisKKyAgICAgICAgICAgIC8qIGdldCBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKG5vdCBhIHR5cG8pICovCisgICAgICAgICAgICBzdGF0ZS0+aGF2ZSA9IDA7CisgICAgICAgICAgICB3aGlsZSAoc3RhdGUtPmhhdmUgPCBzdGF0ZS0+bmNvZGUpIHsKKyAgICAgICAgICAgICAgICBORUVEQklUUygzKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tvcmRlcltzdGF0ZS0+aGF2ZSsrXV0gPSAodW5zaWduZWQgc2hvcnQpQklUUygzKTsKKyAgICAgICAgICAgICAgICBEUk9QQklUUygzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IDE5KQorICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW29yZGVyW3N0YXRlLT5oYXZlKytdXSA9IDA7CisgICAgICAgICAgICBzdGF0ZS0+bmV4dCA9IHN0YXRlLT5jb2RlczsKKyAgICAgICAgICAgIGxlbmNvZGUgPSAoY29kZSBjb25zdCBGQVIgKikoc3RhdGUtPm5leHQpOworICAgICAgICAgICAgbGVuYml0cyA9IDc7CisgICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlOShDT0RFUywgc3RhdGUtPmxlbnMsIDE5LCAmKHN0YXRlLT5uZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihsZW5iaXRzKSwgc3RhdGUtPndvcmspOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgY29kZSBsZW5ndGhzIHNldCI7CisgICAgICAgICAgICAgICAgbW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgY29kZSBsZW5ndGhzIG9rXG4iKSk7CisKKyAgICAgICAgICAgIC8qIGdldCBsZW5ndGggYW5kIGRpc3RhbmNlIGNvZGUgY29kZSBsZW5ndGhzICovCisgICAgICAgICAgICBzdGF0ZS0+aGF2ZSA9IDA7CisgICAgICAgICAgICB3aGlsZSAoc3RhdGUtPmhhdmUgPCBzdGF0ZS0+bmxlbiArIHN0YXRlLT5uZGlzdCkgeworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgaGVyZSA9IGxlbmNvZGVbQklUUyhsZW5iaXRzKV07CisgICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoZXJlLnZhbCA8IDE2KSB7CisgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKGhlcmUuYml0cyk7CisgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gaGVyZS52YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGVyZS52YWwgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKGhlcmUuYml0cyArIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9ICh1bnNpZ25lZCkoc3RhdGUtPmxlbnNbc3RhdGUtPmhhdmUgLSAxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMyArIEJJVFMoMik7CisgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUygyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChoZXJlLnZhbCA9PSAxNykgeworICAgICAgICAgICAgICAgICAgICAgICAgTkVFREJJVFMoaGVyZS5iaXRzICsgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgPSAzICsgQklUUygzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTkVFREJJVFMoaGVyZS5iaXRzICsgNyk7CisgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgPSAxMSArIEJJVFMoNyk7CisgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyg3KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmhhdmUgKyBjb3B5ID4gc3RhdGUtPm5sZW4gKyBzdGF0ZS0+bmRpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiOworICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjb3B5LS0pCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSsrXSA9ICh1bnNpZ25lZCBzaG9ydClsZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBoYW5kbGUgZXJyb3IgYnJlYWtzIGluIHdoaWxlICovCisgICAgICAgICAgICBpZiAobW9kZSA9PSBCQUQpIGJyZWFrOworCisgICAgICAgICAgICAvKiBjaGVjayBmb3IgZW5kLW9mLWJsb2NrIGNvZGUgKGJldHRlciBoYXZlIG9uZSkgKi8KKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bGVuc1syNTZdID09IDApIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2siOworICAgICAgICAgICAgICAgIG1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGJ1aWxkIGNvZGUgdGFibGVzIC0tIG5vdGU6IGRvIG5vdCBjaGFuZ2UgdGhlIGxlbmJpdHMgb3IgZGlzdGJpdHMKKyAgICAgICAgICAgICAgIHZhbHVlcyBoZXJlICg5IGFuZCA2KSB3aXRob3V0IHJlYWRpbmcgdGhlIGNvbW1lbnRzIGluIGluZnRyZWU5LmgKKyAgICAgICAgICAgICAgIGNvbmNlcm5pbmcgdGhlIEVOT1VHSCBjb25zdGFudHMsIHdoaWNoIGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgIHN0YXRlLT5uZXh0ID0gc3RhdGUtPmNvZGVzOworICAgICAgICAgICAgbGVuY29kZSA9IChjb2RlIGNvbnN0IEZBUiAqKShzdGF0ZS0+bmV4dCk7CisgICAgICAgICAgICBsZW5iaXRzID0gOTsKKyAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGU5KExFTlMsIHN0YXRlLT5sZW5zLCBzdGF0ZS0+bmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHN0YXRlLT5uZXh0KSwgJihsZW5iaXRzKSwgc3RhdGUtPndvcmspOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCI7CisgICAgICAgICAgICAgICAgbW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpc3Rjb2RlID0gKGNvZGUgY29uc3QgRkFSICopKHN0YXRlLT5uZXh0KTsKKyAgICAgICAgICAgIGRpc3RiaXRzID0gNjsKKyAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGU5KERJU1RTLCBzdGF0ZS0+bGVucyArIHN0YXRlLT5ubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5uZGlzdCwgJihzdGF0ZS0+bmV4dCksICYoZGlzdGJpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT53b3JrKTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlcyBzZXQiOworICAgICAgICAgICAgICAgIG1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIGNvZGVzIG9rXG4iKSk7CisgICAgICAgICAgICBtb2RlID0gTEVOOworCisgICAgICAgIGNhc2UgTEVOOgorICAgICAgICAgICAgLyogZ2V0IGEgbGl0ZXJhbCwgbGVuZ3RoLCBvciBlbmQtb2YtYmxvY2sgY29kZSAqLworICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIGhlcmUgPSBsZW5jb2RlW0JJVFMobGVuYml0cyldOworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoZXJlLm9wICYmIChoZXJlLm9wICYgMHhmMCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGxhc3QgPSBoZXJlOworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgaGVyZSA9IGxlbmNvZGVbbGFzdC52YWwgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApID4+IGxhc3QuYml0cyldOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShsYXN0LmJpdHMgKyBoZXJlLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEUk9QQklUUyhsYXN0LmJpdHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKKyAgICAgICAgICAgIGxlbmd0aCA9ICh1bnNpZ25lZCloZXJlLnZhbDsKKworICAgICAgICAgICAgLyogcHJvY2VzcyBsaXRlcmFsICovCisgICAgICAgICAgICBpZiAoaGVyZS5vcCA9PSAwKSB7CisgICAgICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/CisgICAgICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcbiIgOgorICAgICAgICAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcbiIsIGhlcmUudmFsKSk7CisgICAgICAgICAgICAgICAgUk9PTSgpOworICAgICAgICAgICAgICAgICpwdXQrKyA9ICh1bnNpZ25lZCBjaGFyKShsZW5ndGgpOworICAgICAgICAgICAgICAgIGxlZnQtLTsKKyAgICAgICAgICAgICAgICBtb2RlID0gTEVOOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBwcm9jZXNzIGVuZCBvZiBibG9jayAqLworICAgICAgICAgICAgaWYgKGhlcmUub3AgJiAzMikgeworICAgICAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXG4iKSk7CisgICAgICAgICAgICAgICAgbW9kZSA9IFRZUEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSAqLworICAgICAgICAgICAgaWYgKGhlcmUub3AgJiA2NCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSI7CisgICAgICAgICAgICAgICAgbW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogbGVuZ3RoIGNvZGUgLS0gZ2V0IGV4dHJhIGJpdHMsIGlmIGFueSAqLworICAgICAgICAgICAgZXh0cmEgPSAodW5zaWduZWQpKGhlcmUub3ApICYgMzE7CisgICAgICAgICAgICBpZiAoZXh0cmEgIT0gMCkgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKGV4dHJhKTsKKyAgICAgICAgICAgICAgICBsZW5ndGggKz0gQklUUyhleHRyYSk7CisgICAgICAgICAgICAgICAgRFJPUEJJVFMoZXh0cmEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBsZW5ndGggJWx1XG4iLCBsZW5ndGgpKTsKKworICAgICAgICAgICAgLyogZ2V0IGRpc3RhbmNlIGNvZGUgKi8KKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICBoZXJlID0gZGlzdGNvZGVbQklUUyhkaXN0Yml0cyldOworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoaGVyZS5vcCAmIDB4ZjApID09IDApIHsKKyAgICAgICAgICAgICAgICBsYXN0ID0gaGVyZTsKKyAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgICAgIGhlcmUgPSBkaXN0Y29kZVtsYXN0LnZhbCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkgPj4gbGFzdC5iaXRzKV07CisgICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGxhc3QuYml0cyArIGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERST1BCSVRTKGxhc3QuYml0cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOworICAgICAgICAgICAgaWYgKGhlcmUub3AgJiA2NCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgY29kZSI7CisgICAgICAgICAgICAgICAgbW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9mZnNldCA9ICh1bnNpZ25lZCloZXJlLnZhbDsKKworICAgICAgICAgICAgLyogZ2V0IGRpc3RhbmNlIGV4dHJhIGJpdHMsIGlmIGFueSAqLworICAgICAgICAgICAgZXh0cmEgPSAodW5zaWduZWQpKGhlcmUub3ApICYgMTU7CisgICAgICAgICAgICBpZiAoZXh0cmEgIT0gMCkgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKGV4dHJhKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gQklUUyhleHRyYSk7CisgICAgICAgICAgICAgICAgRFJPUEJJVFMoZXh0cmEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9mZnNldCA+IFdTSVpFIC0gKHdyYXAgPyAwOiBsZWZ0KSkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKKyAgICAgICAgICAgICAgICBtb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAlbHVcbiIsIG9mZnNldCkpOworCisgICAgICAgICAgICAvKiBjb3B5IG1hdGNoIGZyb20gd2luZG93IHRvIG91dHB1dCAqLworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIFJPT00oKTsKKyAgICAgICAgICAgICAgICBjb3B5ID0gV1NJWkUgLSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPCBsZWZ0KSB7CisgICAgICAgICAgICAgICAgICAgIGZyb20gPSBwdXQgKyBjb3B5OworICAgICAgICAgICAgICAgICAgICBjb3B5ID0gbGVmdCAtIGNvcHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmcm9tID0gcHV0IC0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBjb3B5ID0gbGVmdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBsZW5ndGgpIGNvcHkgPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgbGVuZ3RoIC09IGNvcHk7CisgICAgICAgICAgICAgICAgbGVmdCAtPSBjb3B5OworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgKnB1dCsrID0gKmZyb20rKzsKKyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpOworICAgICAgICAgICAgfSB3aGlsZSAobGVuZ3RoICE9IDApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBET05FOgorICAgICAgICAgICAgLyogaW5mbGF0ZSBzdHJlYW0gdGVybWluYXRlZCBwcm9wZXJseSAtLSB3cml0ZSBsZWZ0b3ZlciBvdXRwdXQgKi8KKyAgICAgICAgICAgIHJldCA9IFpfU1RSRUFNX0VORDsKKyAgICAgICAgICAgIGlmIChsZWZ0IDwgV1NJWkUpIHsKKyAgICAgICAgICAgICAgICBpZiAob3V0KG91dF9kZXNjLCB3aW5kb3csICh1bnNpZ25lZCkoV1NJWkUgLSBsZWZ0KSkpCisgICAgICAgICAgICAgICAgICAgIHJldCA9IFpfQlVGX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBpbmZfbGVhdmU7CisKKyAgICAgICAgY2FzZSBCQUQ6CisgICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7CisgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsKKworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAvKiBjYW4ndCBoYXBwZW4sIGJ1dCBtYWtlcyBjb21waWxlcnMgaGFwcHkgKi8KKyAgICAgICAgICAgIHJldCA9IFpfU1RSRUFNX0VSUk9SOworICAgICAgICAgICAgZ290byBpbmZfbGVhdmU7CisgICAgICAgIH0KKworICAgIC8qIFJldHVybiB1bnVzZWQgaW5wdXQgKi8KKyAgaW5mX2xlYXZlOgorICAgIHN0cm0tPm5leHRfaW4gPSBuZXh0OworICAgIHN0cm0tPmF2YWlsX2luID0gaGF2ZTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgWkVYUE9SVCBpbmZsYXRlQmFjazlFbmQoc3RybSkKK3pfc3RyZWFtIEZBUiAqc3RybTsKK3sKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMIHx8IHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIFpGUkVFKHN0cm0sIHN0cm0tPnN0YXRlKTsKKyAgICBzdHJtLT5zdGF0ZSA9IFpfTlVMTDsKKyAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6IGVuZFxuIikpOworICAgIHJldHVybiBaX09LOworfQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9pbmZiYWNrOS9pbmZiYWNrOS5oIGIvemxpYi9zcmMvY29udHJpYi9pbmZiYWNrOS9pbmZiYWNrOS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNzNjMGEKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL2luZmJhY2s5L2luZmJhY2s5LmgKQEAgLTAsMCArMSwzNyBAQAorLyogaW5mYmFjazkuaCAtLSBoZWFkZXIgZm9yIHVzaW5nIGluZmxhdGVCYWNrOSBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoQykgMjAwMyBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyoKKyAqIFRoaXMgaGVhZGVyIGZpbGUgYW5kIGFzc29jaWF0ZWQgcGF0Y2hlcyBwcm92aWRlIGEgZGVjb2RlciBmb3IgUEtXYXJlJ3MKKyAqIHVuZG9jdW1lbnRlZCBkZWZsYXRlNjQgY29tcHJlc3Npb24gbWV0aG9kIChtZXRob2QgOSkuICBVc2Ugd2l0aCBpbmZiYWNrOS5jLAorICogaW5mdHJlZTkuaCwgaW5mdHJlZTkuYywgYW5kIGluZmZpeDkuaC4gIFRoZXNlIHBhdGNoZXMgYXJlIG5vdCBzdXBwb3J0ZWQuCisgKiBUaGlzIHNob3VsZCBiZSBjb21waWxlZCB3aXRoIHpsaWIsIHNpbmNlIGl0IHVzZXMgenV0aWwuaCBhbmQgenV0aWwuby4KKyAqIFRoaXMgY29kZSBoYXMgbm90IHlldCBiZWVuIHRlc3RlZCBvbiAxNi1iaXQgYXJjaGl0ZWN0dXJlcy4gIFNlZSB0aGUKKyAqIGNvbW1lbnRzIGluIHpsaWIuaCBmb3IgaW5mbGF0ZUJhY2soKSB1c2FnZS4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZAorICogaWRlbnRpY2FsbHksIGV4Y2VwdCB0aGF0IHRoZXJlIGlzIG5vIHdpbmRvd0JpdHMgcGFyYW1ldGVyLCBhbmQgYSA2NEsKKyAqIHdpbmRvdyBtdXN0IGJlIHByb3ZpZGVkLiAgQWxzbyBpZiBpbnQncyBhcmUgMTYgYml0cywgdGhlbiBhIHplcm8gZm9yCisgKiB0aGUgdGhpcmQgcGFyYW1ldGVyIG9mIHRoZSAib3V0IiBmdW5jdGlvbiBhY3R1YWxseSBtZWFucyA2NTUzNlVMLgorICogemxpYi5oIG11c3QgYmUgaW5jbHVkZWQgYmVmb3JlIHRoaXMgaGVhZGVyIGZpbGUuCisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVCYWNrOSBPRigoel9zdHJlYW0gRkFSICpzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fZnVuYyBpbiwgdm9pZCBGQVIgKmluX2Rlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfZnVuYyBvdXQsIHZvaWQgRkFSICpvdXRfZGVzYykpOworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFjazlFbmQgT0YoKHpfc3RyZWFtIEZBUiAqc3RybSkpOworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFjazlJbml0XyBPRigoel9zdHJlYW0gRkFSICpzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtX3NpemUpKTsKKyNkZWZpbmUgaW5mbGF0ZUJhY2s5SW5pdChzdHJtLCB3aW5kb3cpIFwKKyAgICAgICAgaW5mbGF0ZUJhY2s5SW5pdF8oKHN0cm0pLCAod2luZG93KSwgXAorICAgICAgICBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL2luZmJhY2s5L2luZmZpeDkuaCBiL3psaWIvc3JjL2NvbnRyaWIvaW5mYmFjazkvaW5mZml4OS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNTY3MWQKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL2luZmJhY2s5L2luZmZpeDkuaApAQCAtMCwwICsxLDEwNyBAQAorICAgIC8qIGluZmZpeDkuaCAtLSB0YWJsZSBmb3IgZGVjb2RpbmcgZGVmbGF0ZTY0IGZpeGVkIGNvZGVzCisgICAgICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgbWFrZWZpeGVkOSgpLgorICAgICAqLworCisgICAgLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4KKyAgICAgICBJdCBpcyBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGxpYnJhcnkgYW5kIGlzCisgICAgICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgorICAgICAqLworCisgICAgc3RhdGljIGNvbnN0IGNvZGUgbGVuZml4WzUxMl0gPSB7CisgICAgICAgIHs5Niw3LDB9LHswLDgsODB9LHswLDgsMTZ9LHsxMzIsOCwxMTV9LHsxMzAsNywzMX0sezAsOCwxMTJ9LAorICAgICAgICB7MCw4LDQ4fSx7MCw5LDE5Mn0sezEyOCw3LDEwfSx7MCw4LDk2fSx7MCw4LDMyfSx7MCw5LDE2MH0sCisgICAgICAgIHswLDgsMH0sezAsOCwxMjh9LHswLDgsNjR9LHswLDksMjI0fSx7MTI4LDcsNn0sezAsOCw4OH0sCisgICAgICAgIHswLDgsMjR9LHswLDksMTQ0fSx7MTMxLDcsNTl9LHswLDgsMTIwfSx7MCw4LDU2fSx7MCw5LDIwOH0sCisgICAgICAgIHsxMjksNywxN30sezAsOCwxMDR9LHswLDgsNDB9LHswLDksMTc2fSx7MCw4LDh9LHswLDgsMTM2fSwKKyAgICAgICAgezAsOCw3Mn0sezAsOSwyNDB9LHsxMjgsNyw0fSx7MCw4LDg0fSx7MCw4LDIwfSx7MTMzLDgsMjI3fSwKKyAgICAgICAgezEzMSw3LDQzfSx7MCw4LDExNn0sezAsOCw1Mn0sezAsOSwyMDB9LHsxMjksNywxM30sezAsOCwxMDB9LAorICAgICAgICB7MCw4LDM2fSx7MCw5LDE2OH0sezAsOCw0fSx7MCw4LDEzMn0sezAsOCw2OH0sezAsOSwyMzJ9LAorICAgICAgICB7MTI4LDcsOH0sezAsOCw5Mn0sezAsOCwyOH0sezAsOSwxNTJ9LHsxMzIsNyw4M30sezAsOCwxMjR9LAorICAgICAgICB7MCw4LDYwfSx7MCw5LDIxNn0sezEzMCw3LDIzfSx7MCw4LDEwOH0sezAsOCw0NH0sezAsOSwxODR9LAorICAgICAgICB7MCw4LDEyfSx7MCw4LDE0MH0sezAsOCw3Nn0sezAsOSwyNDh9LHsxMjgsNywzfSx7MCw4LDgyfSwKKyAgICAgICAgezAsOCwxOH0sezEzMyw4LDE2M30sezEzMSw3LDM1fSx7MCw4LDExNH0sezAsOCw1MH0sezAsOSwxOTZ9LAorICAgICAgICB7MTI5LDcsMTF9LHswLDgsOTh9LHswLDgsMzR9LHswLDksMTY0fSx7MCw4LDJ9LHswLDgsMTMwfSwKKyAgICAgICAgezAsOCw2Nn0sezAsOSwyMjh9LHsxMjgsNyw3fSx7MCw4LDkwfSx7MCw4LDI2fSx7MCw5LDE0OH0sCisgICAgICAgIHsxMzIsNyw2N30sezAsOCwxMjJ9LHswLDgsNTh9LHswLDksMjEyfSx7MTMwLDcsMTl9LHswLDgsMTA2fSwKKyAgICAgICAgezAsOCw0Mn0sezAsOSwxODB9LHswLDgsMTB9LHswLDgsMTM4fSx7MCw4LDc0fSx7MCw5LDI0NH0sCisgICAgICAgIHsxMjgsNyw1fSx7MCw4LDg2fSx7MCw4LDIyfSx7NjUsOCwwfSx7MTMxLDcsNTF9LHswLDgsMTE4fSwKKyAgICAgICAgezAsOCw1NH0sezAsOSwyMDR9LHsxMjksNywxNX0sezAsOCwxMDJ9LHswLDgsMzh9LHswLDksMTcyfSwKKyAgICAgICAgezAsOCw2fSx7MCw4LDEzNH0sezAsOCw3MH0sezAsOSwyMzZ9LHsxMjgsNyw5fSx7MCw4LDk0fSwKKyAgICAgICAgezAsOCwzMH0sezAsOSwxNTZ9LHsxMzIsNyw5OX0sezAsOCwxMjZ9LHswLDgsNjJ9LHswLDksMjIwfSwKKyAgICAgICAgezEzMCw3LDI3fSx7MCw4LDExMH0sezAsOCw0Nn0sezAsOSwxODh9LHswLDgsMTR9LHswLDgsMTQyfSwKKyAgICAgICAgezAsOCw3OH0sezAsOSwyNTJ9LHs5Niw3LDB9LHswLDgsODF9LHswLDgsMTd9LHsxMzMsOCwxMzF9LAorICAgICAgICB7MTMwLDcsMzF9LHswLDgsMTEzfSx7MCw4LDQ5fSx7MCw5LDE5NH0sezEyOCw3LDEwfSx7MCw4LDk3fSwKKyAgICAgICAgezAsOCwzM30sezAsOSwxNjJ9LHswLDgsMX0sezAsOCwxMjl9LHswLDgsNjV9LHswLDksMjI2fSwKKyAgICAgICAgezEyOCw3LDZ9LHswLDgsODl9LHswLDgsMjV9LHswLDksMTQ2fSx7MTMxLDcsNTl9LHswLDgsMTIxfSwKKyAgICAgICAgezAsOCw1N30sezAsOSwyMTB9LHsxMjksNywxN30sezAsOCwxMDV9LHswLDgsNDF9LHswLDksMTc4fSwKKyAgICAgICAgezAsOCw5fSx7MCw4LDEzN30sezAsOCw3M30sezAsOSwyNDJ9LHsxMjgsNyw0fSx7MCw4LDg1fSwKKyAgICAgICAgezAsOCwyMX0sezE0NCw4LDN9LHsxMzEsNyw0M30sezAsOCwxMTd9LHswLDgsNTN9LHswLDksMjAyfSwKKyAgICAgICAgezEyOSw3LDEzfSx7MCw4LDEwMX0sezAsOCwzN30sezAsOSwxNzB9LHswLDgsNX0sezAsOCwxMzN9LAorICAgICAgICB7MCw4LDY5fSx7MCw5LDIzNH0sezEyOCw3LDh9LHswLDgsOTN9LHswLDgsMjl9LHswLDksMTU0fSwKKyAgICAgICAgezEzMiw3LDgzfSx7MCw4LDEyNX0sezAsOCw2MX0sezAsOSwyMTh9LHsxMzAsNywyM30sezAsOCwxMDl9LAorICAgICAgICB7MCw4LDQ1fSx7MCw5LDE4Nn0sezAsOCwxM30sezAsOCwxNDF9LHswLDgsNzd9LHswLDksMjUwfSwKKyAgICAgICAgezEyOCw3LDN9LHswLDgsODN9LHswLDgsMTl9LHsxMzMsOCwxOTV9LHsxMzEsNywzNX0sezAsOCwxMTV9LAorICAgICAgICB7MCw4LDUxfSx7MCw5LDE5OH0sezEyOSw3LDExfSx7MCw4LDk5fSx7MCw4LDM1fSx7MCw5LDE2Nn0sCisgICAgICAgIHswLDgsM30sezAsOCwxMzF9LHswLDgsNjd9LHswLDksMjMwfSx7MTI4LDcsN30sezAsOCw5MX0sCisgICAgICAgIHswLDgsMjd9LHswLDksMTUwfSx7MTMyLDcsNjd9LHswLDgsMTIzfSx7MCw4LDU5fSx7MCw5LDIxNH0sCisgICAgICAgIHsxMzAsNywxOX0sezAsOCwxMDd9LHswLDgsNDN9LHswLDksMTgyfSx7MCw4LDExfSx7MCw4LDEzOX0sCisgICAgICAgIHswLDgsNzV9LHswLDksMjQ2fSx7MTI4LDcsNX0sezAsOCw4N30sezAsOCwyM30sezc3LDgsMH0sCisgICAgICAgIHsxMzEsNyw1MX0sezAsOCwxMTl9LHswLDgsNTV9LHswLDksMjA2fSx7MTI5LDcsMTV9LHswLDgsMTAzfSwKKyAgICAgICAgezAsOCwzOX0sezAsOSwxNzR9LHswLDgsN30sezAsOCwxMzV9LHswLDgsNzF9LHswLDksMjM4fSwKKyAgICAgICAgezEyOCw3LDl9LHswLDgsOTV9LHswLDgsMzF9LHswLDksMTU4fSx7MTMyLDcsOTl9LHswLDgsMTI3fSwKKyAgICAgICAgezAsOCw2M30sezAsOSwyMjJ9LHsxMzAsNywyN30sezAsOCwxMTF9LHswLDgsNDd9LHswLDksMTkwfSwKKyAgICAgICAgezAsOCwxNX0sezAsOCwxNDN9LHswLDgsNzl9LHswLDksMjU0fSx7OTYsNywwfSx7MCw4LDgwfSwKKyAgICAgICAgezAsOCwxNn0sezEzMiw4LDExNX0sezEzMCw3LDMxfSx7MCw4LDExMn0sezAsOCw0OH0sezAsOSwxOTN9LAorICAgICAgICB7MTI4LDcsMTB9LHswLDgsOTZ9LHswLDgsMzJ9LHswLDksMTYxfSx7MCw4LDB9LHswLDgsMTI4fSwKKyAgICAgICAgezAsOCw2NH0sezAsOSwyMjV9LHsxMjgsNyw2fSx7MCw4LDg4fSx7MCw4LDI0fSx7MCw5LDE0NX0sCisgICAgICAgIHsxMzEsNyw1OX0sezAsOCwxMjB9LHswLDgsNTZ9LHswLDksMjA5fSx7MTI5LDcsMTd9LHswLDgsMTA0fSwKKyAgICAgICAgezAsOCw0MH0sezAsOSwxNzd9LHswLDgsOH0sezAsOCwxMzZ9LHswLDgsNzJ9LHswLDksMjQxfSwKKyAgICAgICAgezEyOCw3LDR9LHswLDgsODR9LHswLDgsMjB9LHsxMzMsOCwyMjd9LHsxMzEsNyw0M30sezAsOCwxMTZ9LAorICAgICAgICB7MCw4LDUyfSx7MCw5LDIwMX0sezEyOSw3LDEzfSx7MCw4LDEwMH0sezAsOCwzNn0sezAsOSwxNjl9LAorICAgICAgICB7MCw4LDR9LHswLDgsMTMyfSx7MCw4LDY4fSx7MCw5LDIzM30sezEyOCw3LDh9LHswLDgsOTJ9LAorICAgICAgICB7MCw4LDI4fSx7MCw5LDE1M30sezEzMiw3LDgzfSx7MCw4LDEyNH0sezAsOCw2MH0sezAsOSwyMTd9LAorICAgICAgICB7MTMwLDcsMjN9LHswLDgsMTA4fSx7MCw4LDQ0fSx7MCw5LDE4NX0sezAsOCwxMn0sezAsOCwxNDB9LAorICAgICAgICB7MCw4LDc2fSx7MCw5LDI0OX0sezEyOCw3LDN9LHswLDgsODJ9LHswLDgsMTh9LHsxMzMsOCwxNjN9LAorICAgICAgICB7MTMxLDcsMzV9LHswLDgsMTE0fSx7MCw4LDUwfSx7MCw5LDE5N30sezEyOSw3LDExfSx7MCw4LDk4fSwKKyAgICAgICAgezAsOCwzNH0sezAsOSwxNjV9LHswLDgsMn0sezAsOCwxMzB9LHswLDgsNjZ9LHswLDksMjI5fSwKKyAgICAgICAgezEyOCw3LDd9LHswLDgsOTB9LHswLDgsMjZ9LHswLDksMTQ5fSx7MTMyLDcsNjd9LHswLDgsMTIyfSwKKyAgICAgICAgezAsOCw1OH0sezAsOSwyMTN9LHsxMzAsNywxOX0sezAsOCwxMDZ9LHswLDgsNDJ9LHswLDksMTgxfSwKKyAgICAgICAgezAsOCwxMH0sezAsOCwxMzh9LHswLDgsNzR9LHswLDksMjQ1fSx7MTI4LDcsNX0sezAsOCw4Nn0sCisgICAgICAgIHswLDgsMjJ9LHs2NSw4LDB9LHsxMzEsNyw1MX0sezAsOCwxMTh9LHswLDgsNTR9LHswLDksMjA1fSwKKyAgICAgICAgezEyOSw3LDE1fSx7MCw4LDEwMn0sezAsOCwzOH0sezAsOSwxNzN9LHswLDgsNn0sezAsOCwxMzR9LAorICAgICAgICB7MCw4LDcwfSx7MCw5LDIzN30sezEyOCw3LDl9LHswLDgsOTR9LHswLDgsMzB9LHswLDksMTU3fSwKKyAgICAgICAgezEzMiw3LDk5fSx7MCw4LDEyNn0sezAsOCw2Mn0sezAsOSwyMjF9LHsxMzAsNywyN30sezAsOCwxMTB9LAorICAgICAgICB7MCw4LDQ2fSx7MCw5LDE4OX0sezAsOCwxNH0sezAsOCwxNDJ9LHswLDgsNzh9LHswLDksMjUzfSwKKyAgICAgICAgezk2LDcsMH0sezAsOCw4MX0sezAsOCwxN30sezEzMyw4LDEzMX0sezEzMCw3LDMxfSx7MCw4LDExM30sCisgICAgICAgIHswLDgsNDl9LHswLDksMTk1fSx7MTI4LDcsMTB9LHswLDgsOTd9LHswLDgsMzN9LHswLDksMTYzfSwKKyAgICAgICAgezAsOCwxfSx7MCw4LDEyOX0sezAsOCw2NX0sezAsOSwyMjd9LHsxMjgsNyw2fSx7MCw4LDg5fSwKKyAgICAgICAgezAsOCwyNX0sezAsOSwxNDd9LHsxMzEsNyw1OX0sezAsOCwxMjF9LHswLDgsNTd9LHswLDksMjExfSwKKyAgICAgICAgezEyOSw3LDE3fSx7MCw4LDEwNX0sezAsOCw0MX0sezAsOSwxNzl9LHswLDgsOX0sezAsOCwxMzd9LAorICAgICAgICB7MCw4LDczfSx7MCw5LDI0M30sezEyOCw3LDR9LHswLDgsODV9LHswLDgsMjF9LHsxNDQsOCwzfSwKKyAgICAgICAgezEzMSw3LDQzfSx7MCw4LDExN30sezAsOCw1M30sezAsOSwyMDN9LHsxMjksNywxM30sezAsOCwxMDF9LAorICAgICAgICB7MCw4LDM3fSx7MCw5LDE3MX0sezAsOCw1fSx7MCw4LDEzM30sezAsOCw2OX0sezAsOSwyMzV9LAorICAgICAgICB7MTI4LDcsOH0sezAsOCw5M30sezAsOCwyOX0sezAsOSwxNTV9LHsxMzIsNyw4M30sezAsOCwxMjV9LAorICAgICAgICB7MCw4LDYxfSx7MCw5LDIxOX0sezEzMCw3LDIzfSx7MCw4LDEwOX0sezAsOCw0NX0sezAsOSwxODd9LAorICAgICAgICB7MCw4LDEzfSx7MCw4LDE0MX0sezAsOCw3N30sezAsOSwyNTF9LHsxMjgsNywzfSx7MCw4LDgzfSwKKyAgICAgICAgezAsOCwxOX0sezEzMyw4LDE5NX0sezEzMSw3LDM1fSx7MCw4LDExNX0sezAsOCw1MX0sezAsOSwxOTl9LAorICAgICAgICB7MTI5LDcsMTF9LHswLDgsOTl9LHswLDgsMzV9LHswLDksMTY3fSx7MCw4LDN9LHswLDgsMTMxfSwKKyAgICAgICAgezAsOCw2N30sezAsOSwyMzF9LHsxMjgsNyw3fSx7MCw4LDkxfSx7MCw4LDI3fSx7MCw5LDE1MX0sCisgICAgICAgIHsxMzIsNyw2N30sezAsOCwxMjN9LHswLDgsNTl9LHswLDksMjE1fSx7MTMwLDcsMTl9LHswLDgsMTA3fSwKKyAgICAgICAgezAsOCw0M30sezAsOSwxODN9LHswLDgsMTF9LHswLDgsMTM5fSx7MCw4LDc1fSx7MCw5LDI0N30sCisgICAgICAgIHsxMjgsNyw1fSx7MCw4LDg3fSx7MCw4LDIzfSx7NzcsOCwwfSx7MTMxLDcsNTF9LHswLDgsMTE5fSwKKyAgICAgICAgezAsOCw1NX0sezAsOSwyMDd9LHsxMjksNywxNX0sezAsOCwxMDN9LHswLDgsMzl9LHswLDksMTc1fSwKKyAgICAgICAgezAsOCw3fSx7MCw4LDEzNX0sezAsOCw3MX0sezAsOSwyMzl9LHsxMjgsNyw5fSx7MCw4LDk1fSwKKyAgICAgICAgezAsOCwzMX0sezAsOSwxNTl9LHsxMzIsNyw5OX0sezAsOCwxMjd9LHswLDgsNjN9LHswLDksMjIzfSwKKyAgICAgICAgezEzMCw3LDI3fSx7MCw4LDExMX0sezAsOCw0N30sezAsOSwxOTF9LHswLDgsMTV9LHswLDgsMTQzfSwKKyAgICAgICAgezAsOCw3OX0sezAsOSwyNTV9CisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBjb2RlIGRpc3RmaXhbMzJdID0geworICAgICAgICB7MTI4LDUsMX0sezEzNSw1LDI1N30sezEzMSw1LDE3fSx7MTM5LDUsNDA5N30sezEyOSw1LDV9LAorICAgICAgICB7MTM3LDUsMTAyNX0sezEzMyw1LDY1fSx7MTQxLDUsMTYzODV9LHsxMjgsNSwzfSx7MTM2LDUsNTEzfSwKKyAgICAgICAgezEzMiw1LDMzfSx7MTQwLDUsODE5M30sezEzMCw1LDl9LHsxMzgsNSwyMDQ5fSx7MTM0LDUsMTI5fSwKKyAgICAgICAgezE0Miw1LDMyNzY5fSx7MTI4LDUsMn0sezEzNSw1LDM4NX0sezEzMSw1LDI1fSx7MTM5LDUsNjE0NX0sCisgICAgICAgIHsxMjksNSw3fSx7MTM3LDUsMTUzN30sezEzMyw1LDk3fSx7MTQxLDUsMjQ1Nzd9LHsxMjgsNSw0fSwKKyAgICAgICAgezEzNiw1LDc2OX0sezEzMiw1LDQ5fSx7MTQwLDUsMTIyODl9LHsxMzAsNSwxM30sezEzOCw1LDMwNzN9LAorICAgICAgICB7MTM0LDUsMTkzfSx7MTQyLDUsNDkxNTN9CisgICAgfTsKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvaW5mYmFjazkvaW5mbGF0ZTkuaCBiL3psaWIvc3JjL2NvbnRyaWIvaW5mYmFjazkvaW5mbGF0ZTkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTlhNzkzCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9pbmZiYWNrOS9pbmZsYXRlOS5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qIGluZmxhdGU5LmggLS0gaW50ZXJuYWwgaW5mbGF0ZSBzdGF0ZSBkZWZpbml0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKKyAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcworICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgorICovCisKKy8qIFBvc3NpYmxlIGluZmxhdGUgbW9kZXMgYmV0d2VlbiBpbmZsYXRlKCkgY2FsbHMgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgICAgIFRZUEUsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi8KKyAgICAgICAgU1RPUkVELCAgICAgLyogaTogd2FpdGluZyBmb3Igc3RvcmVkIHNpemUgKGxlbmd0aCBhbmQgY29tcGxlbWVudCkgKi8KKyAgICAgICAgVEFCTEUsICAgICAgLyogaTogd2FpdGluZyBmb3IgZHluYW1pYyBibG9jayB0YWJsZSBsZW5ndGhzICovCisgICAgICAgICAgICBMRU4sICAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGgvbGl0IGNvZGUgKi8KKyAgICBET05FLCAgICAgICAvKiBmaW5pc2hlZCBjaGVjaywgZG9uZSAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqLworICAgIEJBRCAgICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi8KK30gaW5mbGF0ZV9tb2RlOworCisvKgorICAgIFN0YXRlIHRyYW5zaXRpb25zIGJldHdlZW4gYWJvdmUgbW9kZXMgLQorCisgICAgKG1vc3QgbW9kZXMgY2FuIGdvIHRvIHRoZSBCQUQgbW9kZSAtLSBub3Qgc2hvd24gZm9yIGNsYXJpdHkpCisKKyAgICBSZWFkIGRlZmxhdGUgYmxvY2tzOgorICAgICAgICAgICAgVFlQRSAtPiBTVE9SRUQgb3IgVEFCTEUgb3IgTEVOIG9yIERPTkUKKyAgICAgICAgICAgIFNUT1JFRCAtPiBUWVBFCisgICAgICAgICAgICBUQUJMRSAtPiBMRU5MRU5TIC0+IENPREVMRU5TIC0+IExFTgorICAgIFJlYWQgZGVmbGF0ZSBjb2RlczoKKyAgICAgICAgICAgICAgICBMRU4gLT4gTEVOIG9yIFRZUEUKKyAqLworCisvKiBzdGF0ZSBtYWludGFpbmVkIGJldHdlZW4gaW5mbGF0ZSgpIGNhbGxzLiAgQXBwcm94aW1hdGVseSA3SyBieXRlcy4gKi8KK3N0cnVjdCBpbmZsYXRlX3N0YXRlIHsKKyAgICAgICAgLyogc2xpZGluZyB3aW5kb3cgKi8KKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93OyAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiBuZWVkZWQgKi8KKyAgICAgICAgLyogZHluYW1pYyB0YWJsZSBidWlsZGluZyAqLworICAgIHVuc2lnbmVkIG5jb2RlOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovCisgICAgdW5zaWduZWQgbmxlbjsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsZW5ndGggY29kZSBsZW5ndGhzICovCisgICAgdW5zaWduZWQgbmRpc3Q7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi8KKyAgICB1bnNpZ25lZCBoYXZlOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RocyBpbiBsZW5zW10gKi8KKyAgICBjb2RlIEZBUiAqbmV4dDsgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gY29kZXNbXSAqLworICAgIHVuc2lnbmVkIHNob3J0IGxlbnNbMzIwXTsgICAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgY29kZSBsZW5ndGhzICovCisgICAgdW5zaWduZWQgc2hvcnQgd29ya1syODhdOyAgIC8qIHdvcmsgYXJlYSBmb3IgY29kZSB0YWJsZSBidWlsZGluZyAqLworICAgIGNvZGUgY29kZXNbRU5PVUdIXTsgICAgICAgICAvKiBzcGFjZSBmb3IgY29kZSB0YWJsZXMgKi8KK307CmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL2luZmJhY2s5L2luZnRyZWU5LmMgYi96bGliL3NyYy9jb250cmliL2luZmJhY2s5L2luZnRyZWU5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE3M2FkMgotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvaW5mYmFjazkvaW5mdHJlZTkuYwpAQCAtMCwwICsxLDMyNCBAQAorLyogaW5mdHJlZTkuYyAtLSBnZW5lcmF0ZSBIdWZmbWFuIHRyZWVzIGZvciBlZmZpY2llbnQgZGVjb2RpbmcKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDEzIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisjaW5jbHVkZSAienV0aWwuaCIKKyNpbmNsdWRlICJpbmZ0cmVlOS5oIgorCisjZGVmaW5lIE1BWEJJVFMgMTUKKworY29uc3QgY2hhciBpbmZsYXRlOV9jb3B5cmlnaHRbXSA9CisgICAiIGluZmxhdGU5IDEuMi44IENvcHlyaWdodCAxOTk1LTIwMTMgTWFyayBBZGxlciAiOworLyoKKyAgSWYgeW91IHVzZSB0aGUgemxpYiBsaWJyYXJ5IGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaXMgd2VsY29tZQorICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB5b3VyIHByb2R1Y3QuIElmIGZvciBzb21lIHJlYXNvbiB5b3UgY2Fubm90CisgIGluY2x1ZGUgc3VjaCBhbiBhY2tub3dsZWRnbWVudCwgSSB3b3VsZCBhcHByZWNpYXRlIHRoYXQgeW91IGtlZXAgdGhpcworICBjb3B5cmlnaHQgc3RyaW5nIGluIHRoZSBleGVjdXRhYmxlIG9mIHlvdXIgcHJvZHVjdC4KKyAqLworCisvKgorICAgQnVpbGQgYSBzZXQgb2YgdGFibGVzIHRvIGRlY29kZSB0aGUgcHJvdmlkZWQgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4KKyAgIFRoZSBjb2RlIGxlbmd0aHMgYXJlIGxlbnNbMC4uY29kZXMtMV0uICBUaGUgcmVzdWx0IHN0YXJ0cyBhdCAqdGFibGUsCisgICB3aG9zZSBpbmRpY2VzIGFyZSAwLi4yXmJpdHMtMS4gIHdvcmsgaXMgYSB3cml0YWJsZSBhcnJheSBvZiBhdCBsZWFzdAorICAgbGVucyBzaG9ydHMsIHdoaWNoIGlzIHVzZWQgYXMgYSB3b3JrIGFyZWEuICB0eXBlIGlzIHRoZSB0eXBlIG9mIGNvZGUKKyAgIHRvIGJlIGdlbmVyYXRlZCwgQ09ERVMsIExFTlMsIG9yIERJU1RTLiAgT24gcmV0dXJuLCB6ZXJvIGlzIHN1Y2Nlc3MsCisgICAtMSBpcyBhbiBpbnZhbGlkIGNvZGUsIGFuZCArMSBtZWFucyB0aGF0IEVOT1VHSCBpc24ndCBlbm91Z2guICB0YWJsZQorICAgb24gcmV0dXJuIHBvaW50cyB0byB0aGUgbmV4dCBhdmFpbGFibGUgZW50cnkncyBhZGRyZXNzLiAgYml0cyBpcyB0aGUKKyAgIHJlcXVlc3RlZCByb290IHRhYmxlIGluZGV4IGJpdHMsIGFuZCBvbiByZXR1cm4gaXQgaXMgdGhlIGFjdHVhbCByb290CisgICB0YWJsZSBpbmRleCBiaXRzLiAgSXQgd2lsbCBkaWZmZXIgaWYgdGhlIHJlcXVlc3QgaXMgZ3JlYXRlciB0aGFuIHRoZQorICAgbG9uZ2VzdCBjb2RlIG9yIGlmIGl0IGlzIGxlc3MgdGhhbiB0aGUgc2hvcnRlc3QgY29kZS4KKyAqLworaW50IGluZmxhdGVfdGFibGU5KHR5cGUsIGxlbnMsIGNvZGVzLCB0YWJsZSwgYml0cywgd29yaykKK2NvZGV0eXBlIHR5cGU7Cit1bnNpZ25lZCBzaG9ydCBGQVIgKmxlbnM7Cit1bnNpZ25lZCBjb2RlczsKK2NvZGUgRkFSICogRkFSICp0YWJsZTsKK3Vuc2lnbmVkIEZBUiAqYml0czsKK3Vuc2lnbmVkIHNob3J0IEZBUiAqd29yazsKK3sKKyAgICB1bnNpZ25lZCBsZW47ICAgICAgICAgICAgICAgLyogYSBjb2RlJ3MgbGVuZ3RoIGluIGJpdHMgKi8KKyAgICB1bnNpZ25lZCBzeW07ICAgICAgICAgICAgICAgLyogaW5kZXggb2YgY29kZSBzeW1ib2xzICovCisgICAgdW5zaWduZWQgbWluLCBtYXg7ICAgICAgICAgIC8qIG1pbmltdW0gYW5kIG1heGltdW0gY29kZSBsZW5ndGhzICovCisgICAgdW5zaWduZWQgcm9vdDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciByb290IHRhYmxlICovCisgICAgdW5zaWduZWQgY3VycjsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciBjdXJyZW50IHRhYmxlICovCisgICAgdW5zaWduZWQgZHJvcDsgICAgICAgICAgICAgIC8qIGNvZGUgYml0cyB0byBkcm9wIGZvciBzdWItdGFibGUgKi8KKyAgICBpbnQgbGVmdDsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHByZWZpeCBjb2RlcyBhdmFpbGFibGUgKi8KKyAgICB1bnNpZ25lZCB1c2VkOyAgICAgICAgICAgICAgLyogY29kZSBlbnRyaWVzIGluIHRhYmxlIHVzZWQgKi8KKyAgICB1bnNpZ25lZCBodWZmOyAgICAgICAgICAgICAgLyogSHVmZm1hbiBjb2RlICovCisgICAgdW5zaWduZWQgaW5jcjsgICAgICAgICAgICAgIC8qIGZvciBpbmNyZW1lbnRpbmcgY29kZSwgaW5kZXggKi8KKyAgICB1bnNpZ25lZCBmaWxsOyAgICAgICAgICAgICAgLyogaW5kZXggZm9yIHJlcGxpY2F0aW5nIGVudHJpZXMgKi8KKyAgICB1bnNpZ25lZCBsb3c7ICAgICAgICAgICAgICAgLyogbG93IGJpdHMgZm9yIGN1cnJlbnQgcm9vdCBlbnRyeSAqLworICAgIHVuc2lnbmVkIG1hc2s7ICAgICAgICAgICAgICAvKiBtYXNrIGZvciBsb3cgcm9vdCBiaXRzICovCisgICAgY29kZSB0aGlzOyAgICAgICAgICAgICAgICAgIC8qIHRhYmxlIGVudHJ5IGZvciBkdXBsaWNhdGlvbiAqLworICAgIGNvZGUgRkFSICpuZXh0OyAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiB0YWJsZSAqLworICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IEZBUiAqYmFzZTsgICAgIC8qIGJhc2UgdmFsdWUgdGFibGUgdG8gdXNlICovCisgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgRkFSICpleHRyYTsgICAgLyogZXh0cmEgYml0cyB0YWJsZSB0byB1c2UgKi8KKyAgICBpbnQgZW5kOyAgICAgICAgICAgICAgICAgICAgLyogdXNlIGJhc2UgYW5kIGV4dHJhIGZvciBzeW1ib2wgPiBlbmQgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBjb3VudFtNQVhCSVRTKzFdOyAgICAvKiBudW1iZXIgb2YgY29kZXMgb2YgZWFjaCBsZW5ndGggKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBvZmZzW01BWEJJVFMrMV07ICAgICAvKiBvZmZzZXRzIGluIHRhYmxlIGZvciBlYWNoIGxlbmd0aCAqLworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBsYmFzZVszMV0gPSB7IC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBiYXNlICovCisgICAgICAgIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTMsIDE1LCAxNywKKyAgICAgICAgMTksIDIzLCAyNywgMzEsIDM1LCA0MywgNTEsIDU5LCA2NywgODMsIDk5LCAxMTUsCisgICAgICAgIDEzMSwgMTYzLCAxOTUsIDIyNywgMywgMCwgMH07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGxleHRbMzFdID0geyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgZXh0cmEgKi8KKyAgICAgICAgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOSwgMTI5LCAxMjksIDEyOSwKKyAgICAgICAgMTMwLCAxMzAsIDEzMCwgMTMwLCAxMzEsIDEzMSwgMTMxLCAxMzEsIDEzMiwgMTMyLCAxMzIsIDEzMiwKKyAgICAgICAgMTMzLCAxMzMsIDEzMywgMTMzLCAxNDQsIDcyLCA3OH07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGRiYXNlWzMyXSA9IHsgLyogRGlzdGFuY2UgY29kZXMgMC4uMzEgYmFzZSAqLworICAgICAgICAxLCAyLCAzLCA0LCA1LCA3LCA5LCAxMywgMTcsIDI1LCAzMywgNDksCisgICAgICAgIDY1LCA5NywgMTI5LCAxOTMsIDI1NywgMzg1LCA1MTMsIDc2OSwgMTAyNSwgMTUzNywgMjA0OSwgMzA3MywKKyAgICAgICAgNDA5NywgNjE0NSwgODE5MywgMTIyODksIDE2Mzg1LCAyNDU3NywgMzI3NjksIDQ5MTUzfTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgZGV4dFszMl0gPSB7IC8qIERpc3RhbmNlIGNvZGVzIDAuLjMxIGV4dHJhICovCisgICAgICAgIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI5LCAxMjksIDEzMCwgMTMwLCAxMzEsIDEzMSwgMTMyLCAxMzIsCisgICAgICAgIDEzMywgMTMzLCAxMzQsIDEzNCwgMTM1LCAxMzUsIDEzNiwgMTM2LCAxMzcsIDEzNywgMTM4LCAxMzgsCisgICAgICAgIDEzOSwgMTM5LCAxNDAsIDE0MCwgMTQxLCAxNDEsIDE0MiwgMTQyfTsKKworICAgIC8qCisgICAgICAgUHJvY2VzcyBhIHNldCBvZiBjb2RlIGxlbmd0aHMgdG8gY3JlYXRlIGEgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4gIFRoZQorICAgICAgIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIEVhY2ggbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIHRoZQorICAgICAgIHN5bWJvbHMgMC4uY29kZXMtMS4gIFRoZSBIdWZmbWFuIGNvZGUgaXMgZ2VuZXJhdGVkIGJ5IGZpcnN0IHNvcnRpbmcgdGhlCisgICAgICAgc3ltYm9scyBieSBsZW5ndGggZnJvbSBzaG9ydCB0byBsb25nLCBhbmQgcmV0YWluaW5nIHRoZSBzeW1ib2wgb3JkZXIKKyAgICAgICBmb3IgY29kZXMgd2l0aCBlcXVhbCBsZW5ndGhzLiAgVGhlbiB0aGUgY29kZSBzdGFydHMgd2l0aCBhbGwgemVybyBiaXRzCisgICAgICAgZm9yIHRoZSBmaXJzdCBjb2RlIG9mIHRoZSBzaG9ydGVzdCBsZW5ndGgsIGFuZCB0aGUgY29kZXMgYXJlIGludGVnZXIKKyAgICAgICBpbmNyZW1lbnRzIGZvciB0aGUgc2FtZSBsZW5ndGgsIGFuZCB6ZXJvcyBhcmUgYXBwZW5kZWQgYXMgdGhlIGxlbmd0aAorICAgICAgIGluY3JlYXNlcy4gIEZvciB0aGUgZGVmbGF0ZSBmb3JtYXQsIHRoZXNlIGJpdHMgYXJlIHN0b3JlZCBiYWNrd2FyZHMKKyAgICAgICBmcm9tIHRoZWlyIG1vcmUgbmF0dXJhbCBpbnRlZ2VyIGluY3JlbWVudCBvcmRlcmluZywgYW5kIHNvIHdoZW4gdGhlCisgICAgICAgZGVjb2RpbmcgdGFibGVzIGFyZSBidWlsdCBpbiB0aGUgbGFyZ2UgbG9vcCBiZWxvdywgdGhlIGludGVnZXIgY29kZXMKKyAgICAgICBhcmUgaW5jcmVtZW50ZWQgYmFja3dhcmRzLgorCisgICAgICAgVGhpcyByb3V0aW5lIGFzc3VtZXMsIGJ1dCBkb2VzIG5vdCBjaGVjaywgdGhhdCBhbGwgb2YgdGhlIGVudHJpZXMgaW4KKyAgICAgICBsZW5zW10gYXJlIGluIHRoZSByYW5nZSAwLi5NQVhCSVRTLiAgVGhlIGNhbGxlciBtdXN0IGFzc3VyZSB0aGlzLgorICAgICAgIDEuLk1BWEJJVFMgaXMgaW50ZXJwcmV0ZWQgYXMgdGhhdCBjb2RlIGxlbmd0aC4gIHplcm8gbWVhbnMgdGhhdCB0aGF0CisgICAgICAgc3ltYm9sIGRvZXMgbm90IG9jY3VyIGluIHRoaXMgY29kZS4KKworICAgICAgIFRoZSBjb2RlcyBhcmUgc29ydGVkIGJ5IGNvbXB1dGluZyBhIGNvdW50IG9mIGNvZGVzIGZvciBlYWNoIGxlbmd0aCwKKyAgICAgICBjcmVhdGluZyBmcm9tIHRoYXQgYSB0YWJsZSBvZiBzdGFydGluZyBpbmRpY2VzIGZvciBlYWNoIGxlbmd0aCBpbiB0aGUKKyAgICAgICBzb3J0ZWQgdGFibGUsIGFuZCB0aGVuIGVudGVyaW5nIHRoZSBzeW1ib2xzIGluIG9yZGVyIGluIHRoZSBzb3J0ZWQKKyAgICAgICB0YWJsZS4gIFRoZSBzb3J0ZWQgdGFibGUgaXMgd29ya1tdLCB3aXRoIHRoYXQgc3BhY2UgYmVpbmcgcHJvdmlkZWQgYnkKKyAgICAgICB0aGUgY2FsbGVyLgorCisgICAgICAgVGhlIGxlbmd0aCBjb3VudHMgYXJlIHVzZWQgZm9yIG90aGVyIHB1cnBvc2VzIGFzIHdlbGwsIGkuZS4gZmluZGluZworICAgICAgIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCBjb2RlcywgZGV0ZXJtaW5pbmcgaWYgdGhlcmUgYXJlIGFueQorICAgICAgIGNvZGVzIGF0IGFsbCwgY2hlY2tpbmcgZm9yIGEgdmFsaWQgc2V0IG9mIGxlbmd0aHMsIGFuZCBsb29raW5nIGFoZWFkCisgICAgICAgYXQgbGVuZ3RoIGNvdW50cyB0byBkZXRlcm1pbmUgc3ViLXRhYmxlIHNpemVzIHdoZW4gYnVpbGRpbmcgdGhlCisgICAgICAgZGVjb2RpbmcgdGFibGVzLgorICAgICAqLworCisgICAgLyogYWNjdW11bGF0ZSBsZW5ndGhzIGZvciBjb2RlcyAoYXNzdW1lcyBsZW5zW10gYWxsIGluIDAuLk1BWEJJVFMpICovCisgICAgZm9yIChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspCisgICAgICAgIGNvdW50W2xlbl0gPSAwOworICAgIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKQorICAgICAgICBjb3VudFtsZW5zW3N5bV1dKys7CisKKyAgICAvKiBib3VuZCBjb2RlIGxlbmd0aHMsIGZvcmNlIHJvb3QgdG8gYmUgd2l0aGluIGNvZGUgbGVuZ3RocyAqLworICAgIHJvb3QgPSAqYml0czsKKyAgICBmb3IgKG1heCA9IE1BWEJJVFM7IG1heCA+PSAxOyBtYXgtLSkKKyAgICAgICAgaWYgKGNvdW50W21heF0gIT0gMCkgYnJlYWs7CisgICAgaWYgKHJvb3QgPiBtYXgpIHJvb3QgPSBtYXg7CisgICAgaWYgKG1heCA9PSAwKSByZXR1cm4gLTE7ICAgICAgICAgICAgLyogbm8gY29kZXMhICovCisgICAgZm9yIChtaW4gPSAxOyBtaW4gPD0gTUFYQklUUzsgbWluKyspCisgICAgICAgIGlmIChjb3VudFttaW5dICE9IDApIGJyZWFrOworICAgIGlmIChyb290IDwgbWluKSByb290ID0gbWluOworCisgICAgLyogY2hlY2sgZm9yIGFuIG92ZXItc3Vic2NyaWJlZCBvciBpbmNvbXBsZXRlIHNldCBvZiBsZW5ndGhzICovCisgICAgbGVmdCA9IDE7CisgICAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHsKKyAgICAgICAgbGVmdCA8PD0gMTsKKyAgICAgICAgbGVmdCAtPSBjb3VudFtsZW5dOworICAgICAgICBpZiAobGVmdCA8IDApIHJldHVybiAtMTsgICAgICAgIC8qIG92ZXItc3Vic2NyaWJlZCAqLworICAgIH0KKyAgICBpZiAobGVmdCA+IDAgJiYgKHR5cGUgPT0gQ09ERVMgfHwgbWF4ICE9IDEpKQorICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluY29tcGxldGUgc2V0ICovCisKKyAgICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCBmb3Igc29ydGluZyAqLworICAgIG9mZnNbMV0gPSAwOworICAgIGZvciAobGVuID0gMTsgbGVuIDwgTUFYQklUUzsgbGVuKyspCisgICAgICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xlbl0gKyBjb3VudFtsZW5dOworCisgICAgLyogc29ydCBzeW1ib2xzIGJ5IGxlbmd0aCwgYnkgc3ltYm9sIG9yZGVyIHdpdGhpbiBlYWNoIGxlbmd0aCAqLworICAgIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKQorICAgICAgICBpZiAobGVuc1tzeW1dICE9IDApIHdvcmtbb2Zmc1tsZW5zW3N5bV1dKytdID0gKHVuc2lnbmVkIHNob3J0KXN5bTsKKworICAgIC8qCisgICAgICAgQ3JlYXRlIGFuZCBmaWxsIGluIGRlY29kaW5nIHRhYmxlcy4gIEluIHRoaXMgbG9vcCwgdGhlIHRhYmxlIGJlaW5nCisgICAgICAgZmlsbGVkIGlzIGF0IG5leHQgYW5kIGhhcyBjdXJyIGluZGV4IGJpdHMuICBUaGUgY29kZSBiZWluZyB1c2VkIGlzIGh1ZmYKKyAgICAgICB3aXRoIGxlbmd0aCBsZW4uICBUaGF0IGNvZGUgaXMgY29udmVydGVkIHRvIGFuIGluZGV4IGJ5IGRyb3BwaW5nIGRyb3AKKyAgICAgICBiaXRzIG9mZiBvZiB0aGUgYm90dG9tLiAgRm9yIGNvZGVzIHdoZXJlIGxlbiBpcyBsZXNzIHRoYW4gZHJvcCArIGN1cnIsCisgICAgICAgdGhvc2UgdG9wIGRyb3AgKyBjdXJyIC0gbGVuIGJpdHMgYXJlIGluY3JlbWVudGVkIHRocm91Z2ggYWxsIHZhbHVlcyB0bworICAgICAgIGZpbGwgdGhlIHRhYmxlIHdpdGggcmVwbGljYXRlZCBlbnRyaWVzLgorCisgICAgICAgcm9vdCBpcyB0aGUgbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHRoZSByb290IHRhYmxlLiAgV2hlbiBsZW4gZXhjZWVkcworICAgICAgIHJvb3QsIHN1Yi10YWJsZXMgYXJlIGNyZWF0ZWQgcG9pbnRlZCB0byBieSB0aGUgcm9vdCBlbnRyeSB3aXRoIGFuIGluZGV4CisgICAgICAgb2YgdGhlIGxvdyByb290IGJpdHMgb2YgaHVmZi4gIFRoaXMgaXMgc2F2ZWQgaW4gbG93IHRvIGNoZWNrIGZvciB3aGVuIGEKKyAgICAgICBuZXcgc3ViLXRhYmxlIHNob3VsZCBiZSBzdGFydGVkLiAgZHJvcCBpcyB6ZXJvIHdoZW4gdGhlIHJvb3QgdGFibGUgaXMKKyAgICAgICBiZWluZyBmaWxsZWQsIGFuZCBkcm9wIGlzIHJvb3Qgd2hlbiBzdWItdGFibGVzIGFyZSBiZWluZyBmaWxsZWQuCisKKyAgICAgICBXaGVuIGEgbmV3IHN1Yi10YWJsZSBpcyBuZWVkZWQsIGl0IGlzIG5lY2Vzc2FyeSB0byBsb29rIGFoZWFkIGluIHRoZQorICAgICAgIGNvZGUgbGVuZ3RocyB0byBkZXRlcm1pbmUgd2hhdCBzaXplIHN1Yi10YWJsZSBpcyBuZWVkZWQuICBUaGUgbGVuZ3RoCisgICAgICAgY291bnRzIGFyZSB1c2VkIGZvciB0aGlzLCBhbmQgc28gY291bnRbXSBpcyBkZWNyZW1lbnRlZCBhcyBjb2RlcyBhcmUKKyAgICAgICBlbnRlcmVkIGluIHRoZSB0YWJsZXMuCisKKyAgICAgICB1c2VkIGtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IHRhYmxlIGVudHJpZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBmcm9tIHRoZQorICAgICAgIHByb3ZpZGVkICp0YWJsZSBzcGFjZS4gIEl0IGlzIGNoZWNrZWQgZm9yIExFTlMgYW5kIERJU1QgdGFibGVzIGFnYWluc3QKKyAgICAgICB0aGUgY29uc3RhbnRzIEVOT1VHSF9MRU5TIGFuZCBFTk9VR0hfRElTVFMgdG8gZ3VhcmQgYWdhaW5zdCBjaGFuZ2VzIGluCisgICAgICAgdGhlIGluaXRpYWwgcm9vdCB0YWJsZSBzaXplIGNvbnN0YW50cy4gIFNlZSB0aGUgY29tbWVudHMgaW4gaW5mdHJlZTkuaAorICAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisgICAgICAgc3ltIGluY3JlbWVudHMgdGhyb3VnaCBhbGwgc3ltYm9scywgYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMgd2hlbgorICAgICAgIGFsbCBjb2RlcyBvZiBsZW5ndGggbWF4LCBpLmUuIGFsbCBjb2RlcywgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gIFRoaXMKKyAgICAgICByb3V0aW5lIHBlcm1pdHMgaW5jb21wbGV0ZSBjb2Rlcywgc28gYW5vdGhlciBsb29wIGFmdGVyIHRoaXMgb25lIGZpbGxzCisgICAgICAgaW4gdGhlIHJlc3Qgb2YgdGhlIGRlY29kaW5nIHRhYmxlcyB3aXRoIGludmFsaWQgY29kZSBtYXJrZXJzLgorICAgICAqLworCisgICAgLyogc2V0IHVwIGZvciBjb2RlIHR5cGUgKi8KKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIENPREVTOgorICAgICAgICBiYXNlID0gZXh0cmEgPSB3b3JrOyAgICAvKiBkdW1teSB2YWx1ZS0tbm90IHVzZWQgKi8KKyAgICAgICAgZW5kID0gMTk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTEVOUzoKKyAgICAgICAgYmFzZSA9IGxiYXNlOworICAgICAgICBiYXNlIC09IDI1NzsKKyAgICAgICAgZXh0cmEgPSBsZXh0OworICAgICAgICBleHRyYSAtPSAyNTc7CisgICAgICAgIGVuZCA9IDI1NjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogICAgICAgICAgICAvKiBESVNUUyAqLworICAgICAgICBiYXNlID0gZGJhc2U7CisgICAgICAgIGV4dHJhID0gZGV4dDsKKyAgICAgICAgZW5kID0gLTE7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBzdGF0ZSBmb3IgbG9vcCAqLworICAgIGh1ZmYgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlICovCisgICAgc3ltID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgc3ltYm9sICovCisgICAgbGVuID0gbWluOyAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgbGVuZ3RoICovCisgICAgbmV4dCA9ICp0YWJsZTsgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgdG8gZmlsbCBpbiAqLworICAgIGN1cnIgPSByb290OyAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIGluZGV4IGJpdHMgKi8KKyAgICBkcm9wID0gMDsgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBiaXRzIHRvIGRyb3AgZnJvbSBjb2RlIGZvciBpbmRleCAqLworICAgIGxvdyA9ICh1bnNpZ25lZCkoLTEpOyAgICAgICAvKiB0cmlnZ2VyIG5ldyBzdWItdGFibGUgd2hlbiBsZW4gPiByb290ICovCisgICAgdXNlZCA9IDFVIDw8IHJvb3Q7ICAgICAgICAgIC8qIHVzZSByb290IHRhYmxlIGVudHJpZXMgKi8KKyAgICBtYXNrID0gdXNlZCAtIDE7ICAgICAgICAgICAgLyogbWFzayBmb3IgY29tcGFyaW5nIGxvdyAqLworCisgICAgLyogY2hlY2sgYXZhaWxhYmxlIHRhYmxlIHNwYWNlICovCisgICAgaWYgKCh0eXBlID09IExFTlMgJiYgdXNlZCA+PSBFTk9VR0hfTEVOUykgfHwKKyAgICAgICAgKHR5cGUgPT0gRElTVFMgJiYgdXNlZCA+PSBFTk9VR0hfRElTVFMpKQorICAgICAgICByZXR1cm4gMTsKKworICAgIC8qIHByb2Nlc3MgYWxsIGNvZGVzIGFuZCBtYWtlIHRhYmxlIGVudHJpZXMgKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8qIGNyZWF0ZSB0YWJsZSBlbnRyeSAqLworICAgICAgICB0aGlzLmJpdHMgPSAodW5zaWduZWQgY2hhcikobGVuIC0gZHJvcCk7CisgICAgICAgIGlmICgoaW50KSh3b3JrW3N5bV0pIDwgZW5kKSB7CisgICAgICAgICAgICB0aGlzLm9wID0gKHVuc2lnbmVkIGNoYXIpMDsKKyAgICAgICAgICAgIHRoaXMudmFsID0gd29ya1tzeW1dOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChpbnQpKHdvcmtbc3ltXSkgPiBlbmQpIHsKKyAgICAgICAgICAgIHRoaXMub3AgPSAodW5zaWduZWQgY2hhcikoZXh0cmFbd29ya1tzeW1dXSk7CisgICAgICAgICAgICB0aGlzLnZhbCA9IGJhc2Vbd29ya1tzeW1dXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMub3AgPSAodW5zaWduZWQgY2hhcikoMzIgKyA2NCk7ICAgICAgICAgLyogZW5kIG9mIGJsb2NrICovCisgICAgICAgICAgICB0aGlzLnZhbCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKiByZXBsaWNhdGUgZm9yIHRob3NlIGluZGljZXMgd2l0aCBsb3cgbGVuIGJpdHMgZXF1YWwgdG8gaHVmZiAqLworICAgICAgICBpbmNyID0gMVUgPDwgKGxlbiAtIGRyb3ApOworICAgICAgICBmaWxsID0gMVUgPDwgY3VycjsKKyAgICAgICAgZG8geworICAgICAgICAgICAgZmlsbCAtPSBpbmNyOworICAgICAgICAgICAgbmV4dFsoaHVmZiA+PiBkcm9wKSArIGZpbGxdID0gdGhpczsKKyAgICAgICAgfSB3aGlsZSAoZmlsbCAhPSAwKTsKKworICAgICAgICAvKiBiYWNrd2FyZHMgaW5jcmVtZW50IHRoZSBsZW4tYml0IGNvZGUgaHVmZiAqLworICAgICAgICBpbmNyID0gMVUgPDwgKGxlbiAtIDEpOworICAgICAgICB3aGlsZSAoaHVmZiAmIGluY3IpCisgICAgICAgICAgICBpbmNyID4+PSAxOworICAgICAgICBpZiAoaW5jciAhPSAwKSB7CisgICAgICAgICAgICBodWZmICY9IGluY3IgLSAxOworICAgICAgICAgICAgaHVmZiArPSBpbmNyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGh1ZmYgPSAwOworCisgICAgICAgIC8qIGdvIHRvIG5leHQgc3ltYm9sLCB1cGRhdGUgY291bnQsIGxlbiAqLworICAgICAgICBzeW0rKzsKKyAgICAgICAgaWYgKC0tKGNvdW50W2xlbl0pID09IDApIHsKKyAgICAgICAgICAgIGlmIChsZW4gPT0gbWF4KSBicmVhazsKKyAgICAgICAgICAgIGxlbiA9IGxlbnNbd29ya1tzeW1dXTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNyZWF0ZSBuZXcgc3ViLXRhYmxlIGlmIG5lZWRlZCAqLworICAgICAgICBpZiAobGVuID4gcm9vdCAmJiAoaHVmZiAmIG1hc2spICE9IGxvdykgeworICAgICAgICAgICAgLyogaWYgZmlyc3QgdGltZSwgdHJhbnNpdGlvbiB0byBzdWItdGFibGVzICovCisgICAgICAgICAgICBpZiAoZHJvcCA9PSAwKQorICAgICAgICAgICAgICAgIGRyb3AgPSByb290OworCisgICAgICAgICAgICAvKiBpbmNyZW1lbnQgcGFzdCBsYXN0IHRhYmxlICovCisgICAgICAgICAgICBuZXh0ICs9IDFVIDw8IGN1cnI7CisKKyAgICAgICAgICAgIC8qIGRldGVybWluZSBsZW5ndGggb2YgbmV4dCB0YWJsZSAqLworICAgICAgICAgICAgY3VyciA9IGxlbiAtIGRyb3A7CisgICAgICAgICAgICBsZWZ0ID0gKGludCkoMSA8PCBjdXJyKTsKKyAgICAgICAgICAgIHdoaWxlIChjdXJyICsgZHJvcCA8IG1heCkgeworICAgICAgICAgICAgICAgIGxlZnQgLT0gY291bnRbY3VyciArIGRyb3BdOworICAgICAgICAgICAgICAgIGlmIChsZWZ0IDw9IDApIGJyZWFrOworICAgICAgICAgICAgICAgIGN1cnIrKzsKKyAgICAgICAgICAgICAgICBsZWZ0IDw8PSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBjaGVjayBmb3IgZW5vdWdoIHNwYWNlICovCisgICAgICAgICAgICB1c2VkICs9IDFVIDw8IGN1cnI7CisgICAgICAgICAgICBpZiAoKHR5cGUgPT0gTEVOUyAmJiB1c2VkID49IEVOT1VHSF9MRU5TKSB8fAorICAgICAgICAgICAgICAgICh0eXBlID09IERJU1RTICYmIHVzZWQgPj0gRU5PVUdIX0RJU1RTKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICAgICAgLyogcG9pbnQgZW50cnkgaW4gcm9vdCB0YWJsZSB0byBzdWItdGFibGUgKi8KKyAgICAgICAgICAgIGxvdyA9IGh1ZmYgJiBtYXNrOworICAgICAgICAgICAgKCp0YWJsZSlbbG93XS5vcCA9ICh1bnNpZ25lZCBjaGFyKWN1cnI7CisgICAgICAgICAgICAoKnRhYmxlKVtsb3ddLmJpdHMgPSAodW5zaWduZWQgY2hhcilyb290OworICAgICAgICAgICAgKCp0YWJsZSlbbG93XS52YWwgPSAodW5zaWduZWQgc2hvcnQpKG5leHQgLSAqdGFibGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgICBGaWxsIGluIHJlc3Qgb2YgdGFibGUgZm9yIGluY29tcGxldGUgY29kZXMuICBUaGlzIGxvb3AgaXMgc2ltaWxhciB0byB0aGUKKyAgICAgICBsb29wIGFib3ZlIGluIGluY3JlbWVudGluZyBodWZmIGZvciB0YWJsZSBpbmRpY2VzLiAgSXQgaXMgYXNzdW1lZCB0aGF0CisgICAgICAgbGVuIGlzIGVxdWFsIHRvIGN1cnIgKyBkcm9wLCBzbyB0aGVyZSBpcyBubyBsb29wIG5lZWRlZCB0byBpbmNyZW1lbnQKKyAgICAgICB0aHJvdWdoIGhpZ2ggaW5kZXggYml0cy4gIFdoZW4gdGhlIGN1cnJlbnQgc3ViLXRhYmxlIGlzIGZpbGxlZCwgdGhlIGxvb3AKKyAgICAgICBkcm9wcyBiYWNrIHRvIHRoZSByb290IHRhYmxlIHRvIGZpbGwgaW4gYW55IHJlbWFpbmluZyBlbnRyaWVzIHRoZXJlLgorICAgICAqLworICAgIHRoaXMub3AgPSAodW5zaWduZWQgY2hhcik2NDsgICAgICAgICAgICAgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqLworICAgIHRoaXMuYml0cyA9ICh1bnNpZ25lZCBjaGFyKShsZW4gLSBkcm9wKTsKKyAgICB0aGlzLnZhbCA9ICh1bnNpZ25lZCBzaG9ydCkwOworICAgIHdoaWxlIChodWZmICE9IDApIHsKKyAgICAgICAgLyogd2hlbiBkb25lIHdpdGggc3ViLXRhYmxlLCBkcm9wIGJhY2sgdG8gcm9vdCB0YWJsZSAqLworICAgICAgICBpZiAoZHJvcCAhPSAwICYmIChodWZmICYgbWFzaykgIT0gbG93KSB7CisgICAgICAgICAgICBkcm9wID0gMDsKKyAgICAgICAgICAgIGxlbiA9IHJvb3Q7CisgICAgICAgICAgICBuZXh0ID0gKnRhYmxlOworICAgICAgICAgICAgY3VyciA9IHJvb3Q7CisgICAgICAgICAgICB0aGlzLmJpdHMgPSAodW5zaWduZWQgY2hhcilsZW47CisgICAgICAgIH0KKworICAgICAgICAvKiBwdXQgaW52YWxpZCBjb2RlIG1hcmtlciBpbiB0YWJsZSAqLworICAgICAgICBuZXh0W2h1ZmYgPj4gZHJvcF0gPSB0aGlzOworCisgICAgICAgIC8qIGJhY2t3YXJkcyBpbmNyZW1lbnQgdGhlIGxlbi1iaXQgY29kZSBodWZmICovCisgICAgICAgIGluY3IgPSAxVSA8PCAobGVuIC0gMSk7CisgICAgICAgIHdoaWxlIChodWZmICYgaW5jcikKKyAgICAgICAgICAgIGluY3IgPj49IDE7CisgICAgICAgIGlmIChpbmNyICE9IDApIHsKKyAgICAgICAgICAgIGh1ZmYgJj0gaW5jciAtIDE7CisgICAgICAgICAgICBodWZmICs9IGluY3I7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaHVmZiA9IDA7CisgICAgfQorCisgICAgLyogc2V0IHJldHVybiBwYXJhbWV0ZXJzICovCisgICAgKnRhYmxlICs9IHVzZWQ7CisgICAgKmJpdHMgPSByb290OworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9pbmZiYWNrOS9pbmZ0cmVlOS5oIGIvemxpYi9zcmMvY29udHJpYi9pbmZiYWNrOS9pbmZ0cmVlOS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYjIxZjAKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL2luZmJhY2s5L2luZnRyZWU5LmgKQEAgLTAsMCArMSw2MSBAQAorLyogaW5mdHJlZTkuaCAtLSBoZWFkZXIgdG8gdXNlIGluZnRyZWU5LmMKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA4IE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcworICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCisgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCisgKi8KKworLyogU3RydWN0dXJlIGZvciBkZWNvZGluZyB0YWJsZXMuICBFYWNoIGVudHJ5IHByb3ZpZGVzIGVpdGhlciB0aGUKKyAgIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkbyB0aGUgb3BlcmF0aW9uIHJlcXVlc3RlZCBieSB0aGUgY29kZSB0aGF0CisgICBpbmRleGVkIHRoYXQgdGFibGUgZW50cnksIG9yIGl0IHByb3ZpZGVzIGEgcG9pbnRlciB0byBhbm90aGVyCisgICB0YWJsZSB0aGF0IGluZGV4ZXMgbW9yZSBiaXRzIG9mIHRoZSBjb2RlLiAgb3AgaW5kaWNhdGVzIHdoZXRoZXIKKyAgIHRoZSBlbnRyeSBpcyBhIHBvaW50ZXIgdG8gYW5vdGhlciB0YWJsZSwgYSBsaXRlcmFsLCBhIGxlbmd0aCBvcgorICAgZGlzdGFuY2UsIGFuIGVuZC1vZi1ibG9jaywgb3IgYW4gaW52YWxpZCBjb2RlLiAgRm9yIGEgdGFibGUKKyAgIHBvaW50ZXIsIHRoZSBsb3cgZm91ciBiaXRzIG9mIG9wIGlzIHRoZSBudW1iZXIgb2YgaW5kZXggYml0cyBvZgorICAgdGhhdCB0YWJsZS4gIEZvciBhIGxlbmd0aCBvciBkaXN0YW5jZSwgdGhlIGxvdyBmb3VyIGJpdHMgb2Ygb3AKKyAgIGlzIHRoZSBudW1iZXIgb2YgZXh0cmEgYml0cyB0byBnZXQgYWZ0ZXIgdGhlIGNvZGUuICBiaXRzIGlzCisgICB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhpcyBjb2RlIG9yIHBhcnQgb2YgdGhlIGNvZGUgdG8gZHJvcCBvZmYKKyAgIG9mIHRoZSBiaXQgYnVmZmVyLiAgdmFsIGlzIHRoZSBhY3R1YWwgYnl0ZSB0byBvdXRwdXQgaW4gdGhlIGNhc2UKKyAgIG9mIGEgbGl0ZXJhbCwgdGhlIGJhc2UgbGVuZ3RoIG9yIGRpc3RhbmNlLCBvciB0aGUgb2Zmc2V0IGZyb20KKyAgIHRoZSBjdXJyZW50IHRhYmxlIHRvIHRoZSBuZXh0IHRhYmxlLiAgRWFjaCBlbnRyeSBpcyBmb3VyIGJ5dGVzLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGNoYXIgb3A7ICAgICAgICAgICAvKiBvcGVyYXRpb24sIGV4dHJhIGJpdHMsIHRhYmxlIGJpdHMgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGJpdHM7ICAgICAgICAgLyogYml0cyBpbiB0aGlzIHBhcnQgb2YgdGhlIGNvZGUgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCB2YWw7ICAgICAgICAgLyogb2Zmc2V0IGluIHRhYmxlIG9yIGNvZGUgdmFsdWUgKi8KK30gY29kZTsKKworLyogb3AgdmFsdWVzIGFzIHNldCBieSBpbmZsYXRlX3RhYmxlKCk6CisgICAgMDAwMDAwMDAgLSBsaXRlcmFsCisgICAgMDAwMHR0dHQgLSB0YWJsZSBsaW5rLCB0dHR0ICE9IDAgaXMgdGhlIG51bWJlciBvZiB0YWJsZSBpbmRleCBiaXRzCisgICAgMTAwZWVlZWUgLSBsZW5ndGggb3IgZGlzdGFuY2UsIGVlZWUgaXMgdGhlIG51bWJlciBvZiBleHRyYSBiaXRzCisgICAgMDExMDAwMDAgLSBlbmQgb2YgYmxvY2sKKyAgICAwMTAwMDAwMCAtIGludmFsaWQgY29kZQorICovCisKKy8qIE1heGltdW0gc2l6ZSBvZiB0aGUgZHluYW1pYyB0YWJsZS4gIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb2RlIHN0cnVjdHVyZXMgaXMKKyAgIDE0NDYsIHdoaWNoIGlzIHRoZSBzdW0gb2YgODUyIGZvciBsaXRlcmFsL2xlbmd0aCBjb2RlcyBhbmQgNTk0IGZvciBkaXN0YW5jZQorICAgY29kZXMuICBUaGVzZSB2YWx1ZXMgd2VyZSBmb3VuZCBieSBleGhhdXN0aXZlIHNlYXJjaGVzIHVzaW5nIHRoZSBwcm9ncmFtCisgICBleGFtcGxlcy9lbm91Z2guYyBmb3VuZCBpbiB0aGUgemxpYiBkaXN0cmlidHV0aW9uLiAgVGhlIGFyZ3VtZW50cyB0byB0aGF0CisgICBwcm9ncmFtIGFyZSB0aGUgbnVtYmVyIG9mIHN5bWJvbHMsIHRoZSBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSwgYW5kIHRoZQorICAgbWF4aW11bSBiaXQgbGVuZ3RoIG9mIGEgY29kZS4gICJlbm91Z2ggMjg2IDkgMTUiIGZvciBsaXRlcmFsL2xlbmd0aCBjb2RlcworICAgcmV0dXJucyByZXR1cm5zIDg1MiwgYW5kICJlbm91Z2ggMzIgNiAxNSIgZm9yIGRpc3RhbmNlIGNvZGVzIHJldHVybnMgNTk0LgorICAgVGhlIGluaXRpYWwgcm9vdCB0YWJsZSBzaXplICg5IG9yIDYpIGlzIGZvdW5kIGluIHRoZSBmaWZ0aCBhcmd1bWVudCBvZiB0aGUKKyAgIGluZmxhdGVfdGFibGUoKSBjYWxscyBpbiBpbmZiYWNrOS5jLiAgSWYgdGhlIHJvb3QgdGFibGUgc2l6ZSBpcyBjaGFuZ2VkLAorICAgdGhlbiB0aGVzZSBtYXhpbXVtIHNpemVzIHdvdWxkIGJlIG5lZWQgdG8gYmUgcmVjYWxjdWxhdGVkIGFuZCB1cGRhdGVkLiAqLworI2RlZmluZSBFTk9VR0hfTEVOUyA4NTIKKyNkZWZpbmUgRU5PVUdIX0RJU1RTIDU5NAorI2RlZmluZSBFTk9VR0ggKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUykKKworLyogVHlwZSBvZiBjb2RlIHRvIGJ1aWxkIGZvciBpbmZsYXRlX3RhYmxlOSgpICovCit0eXBlZGVmIGVudW0geworICAgIENPREVTLAorICAgIExFTlMsCisgICAgRElTVFMKK30gY29kZXR5cGU7CisKK2V4dGVybiBpbnQgaW5mbGF0ZV90YWJsZTkgT0YoKGNvZGV0eXBlIHR5cGUsIHVuc2lnbmVkIHNob3J0IEZBUiAqbGVucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY29kZXMsIGNvZGUgRkFSICogRkFSICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRkFSICpiaXRzLCB1bnNpZ25lZCBzaG9ydCBGQVIgKndvcmspKTsKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvaW5mbGF0ZTg2L2luZmZhczg2LmMgYi96bGliL3NyYy9jb250cmliL2luZmxhdGU4Ni9pbmZmYXM4Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyOTJmNjcKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL2luZmxhdGU4Ni9pbmZmYXM4Ni5jCkBAIC0wLDAgKzEsMTE1NyBAQAorLyogaW5mZmFzODYuYyBpcyBhIGhhbmQgdHVuZWQgYXNzZW1ibGVyIHZlcnNpb24gb2YKKyAqCisgKiBpbmZmYXN0LmMgLS0gZmFzdCBkZWNvZGluZworICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBDaHJpcyBBbmRlcnNvbiA8Y2hyaXN0b3BAY2hhcm0ubmV0PgorICogUGxlYXNlIHVzZSB0aGUgY29weXJpZ2h0IGNvbmRpdGlvbnMgYWJvdmUuCisgKgorICogRGVjLTI5LTIwMDMgLS0gSSBhZGRlZCBBTUQ2NCBpbmZsYXRlIGFzbSBzdXBwb3J0LiAgVGhpcyB2ZXJzaW9uIGlzIGFsc28KKyAqIHNsaWdodGx5IHF1aWNrZXIgb24geDg2IHN5c3RlbXMgYmVjYXVzZSwgaW5zdGVhZCBvZiB1c2luZyByZXAgbW92c2IgdG8gY29weQorICogZGF0YSwgaXQgdXNlcyByZXAgbW92c3csIHdoaWNoIG1vdmVzIGRhdGEgaW4gMi1ieXRlIGNodW5rcyBpbnN0ZWFkIG9mIHNpbmdsZQorICogYnl0ZXMuICBJJ3ZlIHRlc3RlZCB0aGUgQU1ENjQgY29kZSBvbiBhIEZlZG9yYSBDb3JlIDEgKyB0aGUgeDg2XzY0IHVwZGF0ZXMKKyAqIGZyb20gaHR0cDovL2ZlZG9yYS5saW51eC5kdWtlLmVkdS9mYzFfeDg2XzY0CisgKiB3aGljaCBpcyBydW5uaW5nIG9uIGFuIEF0aGxvbiA2NCAzMDAwKyAvIEdpZ2FieXRlIEdBLUs4VlQ4MDBNIHN5c3RlbSB3aXRoCisgKiAxR0IgcmFtLiAgVGhlIDY0LWJpdCB2ZXJzaW9uIGlzIGFib3V0IDQlIGZhc3RlciB0aGFuIHRoZSAzMi1iaXQgdmVyc2lvbiwKKyAqIHdoZW4gZGVjb21wcmVzc2luZyBtb3ppbGxhLXNvdXJjZS0xLjMudGFyLmd6LgorICoKKyAqIE1hci0xMy0yMDAzIC0tIE1vc3Qgb2YgdGhpcyBpcyBkZXJpdmVkIGZyb20gaW5mZmFzdC5TIHdoaWNoIGlzIGRlcml2ZWQgZnJvbQorICogdGhlIGdjYyAtUyBvdXRwdXQgb2YgemxpYi0xLjIuMC9pbmZmYXN0LmMuICBabGliLTEuMi4wIGlzIGluIGJldGEgcmVsZWFzZSBhdAorICogdGhlIG1vbWVudC4gIEkgaGF2ZSBzdWNjZXNzZnVsbHkgY29tcGlsZWQgYW5kIHRlc3RlZCB0aGlzIGNvZGUgd2l0aCBnY2MyLjk2LAorICogZ2NjMy4yLCBpY2M1LjAsIG1zdmM2LjAuICBJdCBpcyB2ZXJ5IGNsb3NlIHRvIHRoZSBzcGVlZCBvZiBpbmZmYXN0LlMKKyAqIGNvbXBpbGVkIHdpdGggZ2NjIC1ETk9fTU1YLCBidXQgaW5mZmFzdC5TIGlzIHN0aWxsIGZhc3RlciBvbiB0aGUgUDMgd2l0aCBNTVgKKyAqIGVuYWJsZWQuICBJIHdpbGwgYXR0ZW1wdCB0byBtZXJnZSB0aGUgTU1YIGNvZGUgaW50byB0aGlzIHZlcnNpb24uICBOZXdlcgorICogdmVyc2lvbnMgb2YgdGhpcyBhbmQgaW5mZmFzdC5TIGNhbiBiZSBmb3VuZCBhdAorICogaHR0cDovL3d3dy5lZXRiZWV0ZWUuY29tL3psaWIvIGFuZCBodHRwOi8vd3d3LmNoYXJtLm5ldC9+Y2hyaXN0b3AvemxpYi8KKyAqLworCisjaW5jbHVkZSAienV0aWwuaCIKKyNpbmNsdWRlICJpbmZ0cmVlcy5oIgorI2luY2x1ZGUgImluZmxhdGUuaCIKKyNpbmNsdWRlICJpbmZmYXN0LmgiCisKKy8qIE1hcmsgQWRsZXIncyBjb21tZW50cyBmcm9tIGluZmZhc3QuYzogKi8KKworLyoKKyAgIERlY29kZSBsaXRlcmFsLCBsZW5ndGgsIGFuZCBkaXN0YW5jZSBjb2RlcyBhbmQgd3JpdGUgb3V0IHRoZSByZXN1bHRpbmcKKyAgIGxpdGVyYWwgYW5kIG1hdGNoIGJ5dGVzIHVudGlsIGVpdGhlciBub3QgZW5vdWdoIGlucHV0IG9yIG91dHB1dCBpcworICAgYXZhaWxhYmxlLCBhbiBlbmQtb2YtYmxvY2sgaXMgZW5jb3VudGVyZWQsIG9yIGEgZGF0YSBlcnJvciBpcyBlbmNvdW50ZXJlZC4KKyAgIFdoZW4gbGFyZ2UgZW5vdWdoIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgc3VwcGxpZWQgdG8gaW5mbGF0ZSgpLCBmb3IKKyAgIGV4YW1wbGUsIGEgMTZLIGlucHV0IGJ1ZmZlciBhbmQgYSA2NEsgb3V0cHV0IGJ1ZmZlciwgbW9yZSB0aGFuIDk1JSBvZiB0aGUKKyAgIGluZmxhdGUgZXhlY3V0aW9uIHRpbWUgaXMgc3BlbnQgaW4gdGhpcyByb3V0aW5lLgorCisgICBFbnRyeSBhc3N1bXB0aW9uczoKKworICAgICAgICBzdGF0ZS0+bW9kZSA9PSBMRU4KKyAgICAgICAgc3RybS0+YXZhaWxfaW4gPj0gNgorICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPj0gMjU4CisgICAgICAgIHN0YXJ0ID49IHN0cm0tPmF2YWlsX291dAorICAgICAgICBzdGF0ZS0+Yml0cyA8IDgKKworICAgT24gcmV0dXJuLCBzdGF0ZS0+bW9kZSBpcyBvbmUgb2Y6CisKKyAgICAgICAgTEVOIC0tIHJhbiBvdXQgb2YgZW5vdWdoIG91dHB1dCBzcGFjZSBvciBlbm91Z2ggYXZhaWxhYmxlIGlucHV0CisgICAgICAgIFRZUEUgLS0gcmVhY2hlZCBlbmQgb2YgYmxvY2sgY29kZSwgaW5mbGF0ZSgpIHRvIGludGVycHJldCBuZXh0IGJsb2NrCisgICAgICAgIEJBRCAtLSBlcnJvciBpbiBibG9jayBkYXRhCisKKyAgIE5vdGVzOgorCisgICAgLSBUaGUgbWF4aW11bSBpbnB1dCBiaXRzIHVzZWQgYnkgYSBsZW5ndGgvZGlzdGFuY2UgcGFpciBpcyAxNSBiaXRzIGZvciB0aGUKKyAgICAgIGxlbmd0aCBjb2RlLCA1IGJpdHMgZm9yIHRoZSBsZW5ndGggZXh0cmEsIDE1IGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBjb2RlLAorICAgICAgYW5kIDEzIGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBleHRyYS4gIFRoaXMgdG90YWxzIDQ4IGJpdHMsIG9yIHNpeCBieXRlcy4KKyAgICAgIFRoZXJlZm9yZSBpZiBzdHJtLT5hdmFpbF9pbiA+PSA2LCB0aGVuIHRoZXJlIGlzIGVub3VnaCBpbnB1dCB0byBhdm9pZAorICAgICAgY2hlY2tpbmcgZm9yIGF2YWlsYWJsZSBpbnB1dCB3aGlsZSBkZWNvZGluZy4KKworICAgIC0gVGhlIG1heGltdW0gYnl0ZXMgdGhhdCBhIHNpbmdsZSBsZW5ndGgvZGlzdGFuY2UgcGFpciBjYW4gb3V0cHV0IGlzIDI1OAorICAgICAgYnl0ZXMsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIGxlbmd0aCB0aGF0IGNhbiBiZSBjb2RlZC4gIGluZmxhdGVfZmFzdCgpCisgICAgICByZXF1aXJlcyBzdHJtLT5hdmFpbF9vdXQgPj0gMjU4IGZvciBlYWNoIGxvb3AgdG8gYXZvaWQgY2hlY2tpbmcgZm9yCisgICAgICBvdXRwdXQgc3BhY2UuCisgKi8KK3ZvaWQgaW5mbGF0ZV9mYXN0KHN0cm0sIHN0YXJ0KQorel9zdHJlYW1wIHN0cm07Cit1bnNpZ25lZCBzdGFydDsgICAgICAgICAvKiBpbmZsYXRlKCkncyBzdGFydGluZyB2YWx1ZSBmb3Igc3RybS0+YXZhaWxfb3V0ICovCit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKyAgICBzdHJ1Y3QgaW5mZmFzdF9hciB7CisvKiA2NCAgIDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4NiAgeDg2XzY0ICovCisvKiBhciBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciAqLworLyogIDAgICAgMCAqLyB2b2lkICplc3A7ICAgICAgICAgICAgICAgIC8qIGVzcCBzYXZlICovCisvKiAgOCAgICA0ICovIHZvaWQgKmVicDsgICAgICAgICAgICAgICAgLyogZWJwIHNhdmUgKi8KKy8qIDE2ICAgIDggKi8gdW5zaWduZWQgY2hhciBGQVIgKmluOyAgICAvKiBlc2kgcnNpICBsb2NhbCBzdHJtLT5uZXh0X2luICovCisvKiAyNCAgIDEyICovIHVuc2lnbmVkIGNoYXIgRkFSICpsYXN0OyAgLyogICAgIHI5ICAgd2hpbGUgaW4gPCBsYXN0ICovCisvKiAzMiAgIDE2ICovIHVuc2lnbmVkIGNoYXIgRkFSICpvdXQ7ICAgLyogZWRpIHJkaSAgbG9jYWwgc3RybS0+bmV4dF9vdXQgKi8KKy8qIDQwICAgMjAgKi8gdW5zaWduZWQgY2hhciBGQVIgKmJlZzsgICAvKiAgICAgICAgICBpbmZsYXRlKCkncyBpbml0IG5leHRfb3V0ICovCisvKiA0OCAgIDI0ICovIHVuc2lnbmVkIGNoYXIgRkFSICplbmQ7ICAgLyogICAgIHIxMCAgd2hpbGUgb3V0IDwgZW5kICovCisvKiA1NiAgIDI4ICovIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3c7LyogICAgICAgICAgc2l6ZSBvZiB3aW5kb3csIHdzaXplIT0wICovCisvKiA2NCAgIDMyICovIGNvZGUgY29uc3QgRkFSICpsY29kZTsgICAgLyogZWJwIHJicCAgbG9jYWwgc3RybS0+bGVuY29kZSAqLworLyogNzIgICAzNiAqLyBjb2RlIGNvbnN0IEZBUiAqZGNvZGU7ICAgIC8qICAgICByMTEgIGxvY2FsIHN0cm0tPmRpc3Rjb2RlICovCisvKiA4MCAgIDQwICovIHVuc2lnbmVkIGxvbmcgaG9sZDsgICAgICAgLyogZWR4IHJkeCAgbG9jYWwgc3RybS0+aG9sZCAqLworLyogODggICA0NCAqLyB1bnNpZ25lZCBiaXRzOyAgICAgICAgICAgIC8qIGVieCByYnggIGxvY2FsIHN0cm0tPmJpdHMgKi8KKy8qIDkyICAgNDggKi8gdW5zaWduZWQgd3NpemU7ICAgICAgICAgICAvKiAgICAgICAgICB3aW5kb3cgc2l6ZSAqLworLyogOTYgICA1MiAqLyB1bnNpZ25lZCB3cml0ZTsgICAgICAgICAgIC8qICAgICAgICAgIHdpbmRvdyB3cml0ZSBpbmRleCAqLworLyoxMDAgICA1NiAqLyB1bnNpZ25lZCBsbWFzazsgICAgICAgICAgIC8qICAgICByMTIgIG1hc2sgZm9yIGxjb2RlICovCisvKjEwNCAgIDYwICovIHVuc2lnbmVkIGRtYXNrOyAgICAgICAgICAgLyogICAgIHIxMyAgbWFzayBmb3IgZGNvZGUgKi8KKy8qMTA4ICAgNjQgKi8gdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAvKiAgICAgcjE0ICBtYXRjaCBsZW5ndGggKi8KKy8qMTEyICAgNjggKi8gdW5zaWduZWQgZGlzdDsgICAgICAgICAgICAvKiAgICAgcjE1ICBtYXRjaCBkaXN0YW5jZSAqLworLyoxMTYgICA3MiAqLyB1bnNpZ25lZCBzdGF0dXM7ICAgICAgICAgIC8qICAgICAgICAgIHNldCB3aGVuIHN0YXRlIGNobmcqLworICAgIH0gYXI7CisKKyNpZiBkZWZpbmVkKCBfX0dOVUNfXyApICYmIGRlZmluZWQoIF9fYW1kNjRfXyApICYmICEgZGVmaW5lZCggX19pMzg2ICkKKyNkZWZpbmUgUEFEX0FWQUlMX0lOIDYKKyNkZWZpbmUgUEFEX0FWQUlMX09VVCAyNTgKKyNlbHNlCisjZGVmaW5lIFBBRF9BVkFJTF9JTiA1CisjZGVmaW5lIFBBRF9BVkFJTF9PVVQgMjU3CisjZW5kaWYKKworICAgIC8qIGNvcHkgc3RhdGUgdG8gbG9jYWwgdmFyaWFibGVzICovCisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgYXIuaW4gPSBzdHJtLT5uZXh0X2luOworICAgIGFyLmxhc3QgPSBhci5pbiArIChzdHJtLT5hdmFpbF9pbiAtIFBBRF9BVkFJTF9JTik7CisgICAgYXIub3V0ID0gc3RybS0+bmV4dF9vdXQ7CisgICAgYXIuYmVnID0gYXIub3V0IC0gKHN0YXJ0IC0gc3RybS0+YXZhaWxfb3V0KTsKKyAgICBhci5lbmQgPSBhci5vdXQgKyAoc3RybS0+YXZhaWxfb3V0IC0gUEFEX0FWQUlMX09VVCk7CisgICAgYXIud3NpemUgPSBzdGF0ZS0+d3NpemU7CisgICAgYXIud3JpdGUgPSBzdGF0ZS0+d25leHQ7CisgICAgYXIud2luZG93ID0gc3RhdGUtPndpbmRvdzsKKyAgICBhci5ob2xkID0gc3RhdGUtPmhvbGQ7CisgICAgYXIuYml0cyA9IHN0YXRlLT5iaXRzOworICAgIGFyLmxjb2RlID0gc3RhdGUtPmxlbmNvZGU7CisgICAgYXIuZGNvZGUgPSBzdGF0ZS0+ZGlzdGNvZGU7CisgICAgYXIubG1hc2sgPSAoMVUgPDwgc3RhdGUtPmxlbmJpdHMpIC0gMTsKKyAgICBhci5kbWFzayA9ICgxVSA8PCBzdGF0ZS0+ZGlzdGJpdHMpIC0gMTsKKworICAgIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlcyB1bnRpbCBlbmQtb2YtYmxvY2sgb3Igbm90IGVub3VnaAorICAgICAgIGlucHV0IGRhdGEgb3Igb3V0cHV0IHNwYWNlICovCisKKyAgICAvKiBhbGlnbiBpbiBvbiAxLzIgaG9sZCBzaXplIGJvdW5kYXJ5ICovCisgICAgd2hpbGUgKCgodW5zaWduZWQgbG9uZykodm9pZCAqKWFyLmluICYgKHNpemVvZihhci5ob2xkKSAvIDIgLSAxKSkgIT0gMCkgeworICAgICAgICBhci5ob2xkICs9ICh1bnNpZ25lZCBsb25nKSphci5pbisrIDw8IGFyLmJpdHM7CisgICAgICAgIGFyLmJpdHMgKz0gODsKKyAgICB9CisKKyNpZiBkZWZpbmVkKCBfX0dOVUNfXyApICYmIGRlZmluZWQoIF9fYW1kNjRfXyApICYmICEgZGVmaW5lZCggX19pMzg2ICkKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisiICAgICAgICBsZWFxICAgICUwLCAlJXJheFxuIgorIiAgICAgICAgbW92cSAgICAlJXJicCwgOCglJXJheClcbiIgICAgICAgLyogc2F2ZSByZWdzIHJicCBhbmQgcnNwICovCisiICAgICAgICBtb3ZxICAgICUlcnNwLCAoJSVyYXgpXG4iCisiICAgICAgICBtb3ZxICAgICUlcmF4LCAlJXJzcFxuIiAgICAgICAgICAvKiBtYWtlIHJzcCBwb2ludCB0byAmYXIgKi8KKyIgICAgICAgIG1vdnEgICAgMTYoJSVyc3ApLCAlJXJzaVxuIiAgICAgIC8qIHJzaSAgPSBpbiAqLworIiAgICAgICAgbW92cSAgICAzMiglJXJzcCksICUlcmRpXG4iICAgICAgLyogcmRpICA9IG91dCAqLworIiAgICAgICAgbW92cSAgICAyNCglJXJzcCksICUlcjlcbiIgICAgICAgLyogcjkgICA9IGxhc3QgKi8KKyIgICAgICAgIG1vdnEgICAgNDgoJSVyc3ApLCAlJXIxMFxuIiAgICAgIC8qIHIxMCAgPSBlbmQgKi8KKyIgICAgICAgIG1vdnEgICAgNjQoJSVyc3ApLCAlJXJicFxuIiAgICAgIC8qIHJicCAgPSBsY29kZSAqLworIiAgICAgICAgbW92cSAgICA3MiglJXJzcCksICUlcjExXG4iICAgICAgLyogcjExICA9IGRjb2RlICovCisiICAgICAgICBtb3ZxICAgIDgwKCUlcnNwKSwgJSVyZHhcbiIgICAgICAvKiByZHggID0gaG9sZCAqLworIiAgICAgICAgbW92bCAgICA4OCglJXJzcCksICUlZWJ4XG4iICAgICAgLyogZWJ4ICA9IGJpdHMgKi8KKyIgICAgICAgIG1vdmwgICAgMTAwKCUlcnNwKSwgJSVyMTJkXG4iICAgIC8qIHIxMmQgPSBsbWFzayAqLworIiAgICAgICAgbW92bCAgICAxMDQoJSVyc3ApLCAlJXIxM2RcbiIgICAgLyogcjEzZCA9IGRtYXNrICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByMTRkID0gbGVuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByMTVkID0gZGlzdCAqLworIiAgICAgICAgY2xkXG4iCisiICAgICAgICBjbXBxICAgICUlcmRpLCAlJXIxMFxuIgorIiAgICAgICAgamUgICAgICAuTF9vbmVfdGltZVxuIiAgICAgICAgICAgLyogaWYgb25seSBvbmUgZGVjb2RlIGxlZnQgKi8KKyIgICAgICAgIGNtcHEgICAgJSVyc2ksICUlcjlcbiIKKyIgICAgICAgIGplICAgICAgLkxfb25lX3RpbWVcbiIKKyIgICAgICAgIGptcCAgICAgLkxfZG9fbG9vcFxuIgorCisiLkxfb25lX3RpbWU6XG4iCisiICAgICAgICBtb3ZxICAgICUlcjEyLCAlJXI4XG4iICAgICAgICAgICAvKiByOCA9IGxtYXNrICovCisiICAgICAgICBjbXBiICAgICQzMiwgJSVibFxuIgorIiAgICAgICAgamEgICAgICAuTF9nZXRfbGVuZ3RoX2NvZGVfb25lX3RpbWVcbiIKKworIiAgICAgICAgbG9kc2xcbiIgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWF4ID0gKih1aW50ICopaW4rKyAqLworIiAgICAgICAgbW92YiAgICAlJWJsLCAlJWNsXG4iICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KKyIgICAgICAgIGFkZGIgICAgJDMyLCAlJWJsXG4iICAgICAgICAgICAgIC8qIGJpdHMgKz0gMzIgKi8KKyIgICAgICAgIHNobHEgICAgJSVjbCwgJSVyYXhcbiIKKyIgICAgICAgIG9ycSAgICAgJSVyYXgsICUlcmR4XG4iICAgICAgICAgIC8qIGhvbGQgfD0gKigodWludCAqKWluKSsrIDw8IGJpdHMgKi8KKyIgICAgICAgIGptcCAgICAgLkxfZ2V0X2xlbmd0aF9jb2RlX29uZV90aW1lXG4iCisKKyIuYWxpZ24gMzIsMHg5MFxuIgorIi5MX3doaWxlX3Rlc3Q6XG4iCisiICAgICAgICBjbXBxICAgICUlcmRpLCAlJXIxMFxuIgorIiAgICAgICAgamJlICAgICAuTF9icmVha19sb29wXG4iCisiICAgICAgICBjbXBxICAgICUlcnNpLCAlJXI5XG4iCisiICAgICAgICBqYmUgICAgIC5MX2JyZWFrX2xvb3BcbiIKKworIi5MX2RvX2xvb3A6XG4iCisiICAgICAgICBtb3ZxICAgICUlcjEyLCAlJXI4XG4iICAgICAgICAgICAvKiByOCA9IGxtYXNrICovCisiICAgICAgICBjbXBiICAgICQzMiwgJSVibFxuIgorIiAgICAgICAgamEgICAgICAuTF9nZXRfbGVuZ3RoX2NvZGVcbiIgICAgLyogaWYgKDMyIDwgYml0cykgKi8KKworIiAgICAgICAgbG9kc2xcbiIgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWF4ID0gKih1aW50ICopaW4rKyAqLworIiAgICAgICAgbW92YiAgICAlJWJsLCAlJWNsXG4iICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KKyIgICAgICAgIGFkZGIgICAgJDMyLCAlJWJsXG4iICAgICAgICAgICAgIC8qIGJpdHMgKz0gMzIgKi8KKyIgICAgICAgIHNobHEgICAgJSVjbCwgJSVyYXhcbiIKKyIgICAgICAgIG9ycSAgICAgJSVyYXgsICUlcmR4XG4iICAgICAgICAgIC8qIGhvbGQgfD0gKigodWludCAqKWluKSsrIDw8IGJpdHMgKi8KKworIi5MX2dldF9sZW5ndGhfY29kZTpcbiIKKyIgICAgICAgIGFuZHEgICAgJSVyZHgsICUlcjhcbiIgICAgICAgICAgICAvKiByOCAmPSBob2xkICovCisiICAgICAgICBtb3ZsICAgICglJXJicCwlJXI4LDQpLCAlJWVheFxuIiAgLyogZWF4ID0gbGNvZGVbaG9sZCAmIGxtYXNrXSAqLworCisiICAgICAgICBtb3ZiICAgICUlYWgsICUlY2xcbiIgICAgICAgICAgICAvKiBjbCA9IHRoaXMuYml0cyAqLworIiAgICAgICAgc3ViYiAgICAlJWFoLCAlJWJsXG4iICAgICAgICAgICAgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8KKyIgICAgICAgIHNocnEgICAgJSVjbCwgJSVyZHhcbiIgICAgICAgICAgIC8qIGhvbGQgPj49IHRoaXMuYml0cyAqLworCisiICAgICAgICB0ZXN0YiAgICUlYWwsICUlYWxcbiIKKyIgICAgICAgIGpueiAgICAgLkxfdGVzdF9mb3JfbGVuZ3RoX2Jhc2VcbiIgLyogaWYgKG9wICE9IDApIDQ1LjclICovCisKKyIgICAgICAgIG1vdnEgICAgJSVyMTIsICUlcjhcbiIgICAgICAgICAgICAvKiByOCA9IGxtYXNrICovCisiICAgICAgICBzaHJsICAgICQxNiwgJSVlYXhcbiIgICAgICAgICAgICAvKiBvdXRwdXQgdGhpcy52YWwgY2hhciAqLworIiAgICAgICAgc3Rvc2JcbiIKKworIi5MX2dldF9sZW5ndGhfY29kZV9vbmVfdGltZTpcbiIKKyIgICAgICAgIGFuZHEgICAgJSVyZHgsICUlcjhcbiIgICAgICAgICAgICAvKiByOCAmPSBob2xkICovCisiICAgICAgICBtb3ZsICAgICglJXJicCwlJXI4LDQpLCAlJWVheFxuIiAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovCisKKyIuTF9kb2xlbjpcbiIKKyIgICAgICAgIG1vdmIgICAgJSVhaCwgJSVjbFxuIiAgICAgICAgICAgIC8qIGNsID0gdGhpcy5iaXRzICovCisiICAgICAgICBzdWJiICAgICUlYWgsICUlYmxcbiIgICAgICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLworIiAgICAgICAgc2hycSAgICAlJWNsLCAlJXJkeFxuIiAgICAgICAgICAgLyogaG9sZCA+Pj0gdGhpcy5iaXRzICovCisKKyIgICAgICAgIHRlc3RiICAgJSVhbCwgJSVhbFxuIgorIiAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZVxuIiAvKiBpZiAob3AgIT0gMCkgNDUuNyUgKi8KKworIiAgICAgICAgc2hybCAgICAkMTYsICUlZWF4XG4iICAgICAgICAgICAgLyogb3V0cHV0IHRoaXMudmFsIGNoYXIgKi8KKyIgICAgICAgIHN0b3NiXG4iCisiICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RcbiIKKworIi5hbGlnbiAzMiwweDkwXG4iCisiLkxfdGVzdF9mb3JfbGVuZ3RoX2Jhc2U6XG4iCisiICAgICAgICBtb3ZsICAgICUlZWF4LCAlJXIxNGRcbiIgICAgICAgICAvKiBsZW4gPSB0aGlzICovCisiICAgICAgICBzaHJsICAgICQxNiwgJSVyMTRkXG4iICAgICAgICAgICAvKiBsZW4gPSB0aGlzLnZhbCAqLworIiAgICAgICAgbW92YiAgICAlJWFsLCAlJWNsXG4iCisKKyIgICAgICAgIHRlc3RiICAgJDE2LCAlJWFsXG4iCisiICAgICAgICBqeiAgICAgIC5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGhcbiIgLyogaWYgKChvcCAmIDE2KSA9PSAwKSA4JSAqLworIiAgICAgICAgYW5kYiAgICAkMTUsICUlY2xcbiIgICAgICAgICAgICAgLyogb3AgJj0gMTUgKi8KKyIgICAgICAgIGp6ICAgICAgLkxfZGVjb2RlX2Rpc3RhbmNlXG4iICAgIC8qIGlmICghb3ApICovCisKKyIuTF9hZGRfYml0c190b19sZW46XG4iCisiICAgICAgICBzdWJiICAgICUlY2wsICUlYmxcbiIKKyIgICAgICAgIHhvcmwgICAgJSVlYXgsICUlZWF4XG4iCisiICAgICAgICBpbmNsICAgICUlZWF4XG4iCisiICAgICAgICBzaGxsICAgICUlY2wsICUlZWF4XG4iCisiICAgICAgICBkZWNsICAgICUlZWF4XG4iCisiICAgICAgICBhbmRsICAgICUlZWR4LCAlJWVheFxuIiAgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLworIiAgICAgICAgc2hycSAgICAlJWNsLCAlJXJkeFxuIgorIiAgICAgICAgYWRkbCAgICAlJWVheCwgJSVyMTRkXG4iICAgICAgICAgLyogbGVuICs9IGhvbGQgJiBtYXNrW29wXSAqLworCisiLkxfZGVjb2RlX2Rpc3RhbmNlOlxuIgorIiAgICAgICAgbW92cSAgICAlJXIxMywgJSVyOFxuIiAgICAgICAgICAgLyogcjggPSBkbWFzayAqLworIiAgICAgICAgY21wYiAgICAkMzIsICUlYmxcbiIKKyIgICAgICAgIGphICAgICAgLkxfZ2V0X2Rpc3RhbmNlX2NvZGVcbiIgIC8qIGlmICgzMiA8IGJpdHMpICovCisKKyIgICAgICAgIGxvZHNsXG4iICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVheCA9ICoodWludCAqKWluKysgKi8KKyIgICAgICAgIG1vdmIgICAgJSVibCwgJSVjbFxuIiAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovCisiICAgICAgICBhZGRiICAgICQzMiwgJSVibFxuIiAgICAgICAgICAgICAvKiBiaXRzICs9IDMyICovCisiICAgICAgICBzaGxxICAgICUlY2wsICUlcmF4XG4iCisiICAgICAgICBvcnEgICAgICUlcmF4LCAlJXJkeFxuIiAgICAgICAgICAvKiBob2xkIHw9ICooKHVpbnQgKilpbikrKyA8PCBiaXRzICovCisKKyIuTF9nZXRfZGlzdGFuY2VfY29kZTpcbiIKKyIgICAgICAgIGFuZHEgICAgJSVyZHgsICUlcjhcbiIgICAgICAgICAgIC8qIHI4ICY9IGhvbGQgKi8KKyIgICAgICAgIG1vdmwgICAgKCUlcjExLCUlcjgsNCksICUlZWF4XG4iIC8qIGVheCA9IGRjb2RlW2hvbGQgJiBkbWFza10gKi8KKworIi5MX2RvZGlzdDpcbiIKKyIgICAgICAgIG1vdmwgICAgJSVlYXgsICUlcjE1ZFxuIiAgICAgICAgIC8qIGRpc3QgPSB0aGlzICovCisiICAgICAgICBzaHJsICAgICQxNiwgJSVyMTVkXG4iICAgICAgICAgICAvKiBkaXN0ID0gdGhpcy52YWwgKi8KKyIgICAgICAgIG1vdmIgICAgJSVhaCwgJSVjbFxuIgorIiAgICAgICAgc3ViYiAgICAlJWFoLCAlJWJsXG4iICAgICAgICAgICAgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8KKyIgICAgICAgIHNocnEgICAgJSVjbCwgJSVyZHhcbiIgICAgICAgICAgIC8qIGhvbGQgPj49IHRoaXMuYml0cyAqLworIiAgICAgICAgbW92YiAgICAlJWFsLCAlJWNsXG4iICAgICAgICAgICAgLyogY2wgPSB0aGlzLm9wICovCisKKyIgICAgICAgIHRlc3RiICAgJDE2LCAlJWFsXG4iICAgICAgICAgICAgIC8qIGlmICgob3AgJiAxNikgPT0gMCkgKi8KKyIgICAgICAgIGp6ICAgICAgLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3RcbiIKKyIgICAgICAgIGFuZGIgICAgJDE1LCAlJWNsXG4iICAgICAgICAgICAgIC8qIG9wICY9IDE1ICovCisiICAgICAgICBqeiAgICAgIC5MX2NoZWNrX2Rpc3Rfb25lXG4iCisKKyIuTF9hZGRfYml0c190b19kaXN0OlxuIgorIiAgICAgICAgc3ViYiAgICAlJWNsLCAlJWJsXG4iCisiICAgICAgICB4b3JsICAgICUlZWF4LCAlJWVheFxuIgorIiAgICAgICAgaW5jbCAgICAlJWVheFxuIgorIiAgICAgICAgc2hsbCAgICAlJWNsLCAlJWVheFxuIgorIiAgICAgICAgZGVjbCAgICAlJWVheFxuIiAgICAgICAgICAgICAgICAgLyogKDEgPDwgb3ApIC0gMSAqLworIiAgICAgICAgYW5kbCAgICAlJWVkeCwgJSVlYXhcbiIgICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KKyIgICAgICAgIHNocnEgICAgJSVjbCwgJSVyZHhcbiIKKyIgICAgICAgIGFkZGwgICAgJSVlYXgsICUlcjE1ZFxuIiAgICAgICAgIC8qIGRpc3QgKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKSAqLworCisiLkxfY2hlY2tfd2luZG93OlxuIgorIiAgICAgICAgbW92cSAgICAlJXJzaSwgJSVyOFxuIiAgICAgICAgICAgLyogc2F2ZSBpbiBzbyBmcm9tIGNhbiB1c2UgaXQncyByZWcgKi8KKyIgICAgICAgIG1vdnEgICAgJSVyZGksICUlcmF4XG4iCisiICAgICAgICBzdWJxICAgIDQwKCUlcnNwKSwgJSVyYXhcbiIgICAgICAvKiBuYnl0ZXMgPSBvdXQgLSBiZWcgKi8KKworIiAgICAgICAgY21wbCAgICAlJXIxNWQsICUlZWF4XG4iCisiICAgICAgICBqYiAgICAgIC5MX2NsaXBfd2luZG93XG4iICAgICAgICAvKiBpZiAoZGlzdCA+IG5ieXRlcykgNC4yJSAqLworCisiICAgICAgICBtb3ZsICAgICUlcjE0ZCwgJSVlY3hcbiIgICAgICAgICAvKiBlY3ggPSBsZW4gKi8KKyIgICAgICAgIG1vdnEgICAgJSVyZGksICUlcnNpXG4iCisiICAgICAgICBzdWJxICAgICUlcjE1LCAlJXJzaVxuIiAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLworCisiICAgICAgICBzYXJsICAgICUlZWN4XG4iCisiICAgICAgICBqbmMgICAgIC5MX2NvcHlfdHdvXG4iICAgICAgICAgICAvKiBpZiBsZW4gJSAyID09IDAgKi8KKworIiAgICAgICAgcmVwICAgICBtb3Zzd1xuIgorIiAgICAgICAgbW92YiAgICAoJSVyc2kpLCAlJWFsXG4iCisiICAgICAgICBtb3ZiICAgICUlYWwsICglJXJkaSlcbiIKKyIgICAgICAgIGluY3EgICAgJSVyZGlcbiIKKworIiAgICAgICAgbW92cSAgICAlJXI4LCAlJXJzaVxuIiAgICAgICAgICAgLyogbW92ZSBpbiBiYWNrIHRvICVyc2ksIHRvc3MgZnJvbSAqLworIiAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0XG4iCisKKyIuTF9jb3B5X3R3bzpcbiIKKyIgICAgICAgIHJlcCAgICAgbW92c3dcbiIKKyIgICAgICAgIG1vdnEgICAgJSVyOCwgJSVyc2lcbiIgICAgICAgICAgIC8qIG1vdmUgaW4gYmFjayB0byAlcnNpLCB0b3NzIGZyb20gKi8KKyIgICAgICAgIGptcCAgICAgLkxfd2hpbGVfdGVzdFxuIgorCisiLmFsaWduIDMyLDB4OTBcbiIKKyIuTF9jaGVja19kaXN0X29uZTpcbiIKKyIgICAgICAgIGNtcGwgICAgJDEsICUlcjE1ZFxuIiAgICAgICAgICAgIC8qIGlmIGRpc3QgMSwgaXMgYSBtZW1zZXQgKi8KKyIgICAgICAgIGpuZSAgICAgLkxfY2hlY2tfd2luZG93XG4iCisiICAgICAgICBjbXBxICAgICUlcmRpLCA0MCglJXJzcClcbiIgICAgICAvKiBpZiBvdXQgPT0gYmVnLCBvdXRzaWRlIHdpbmRvdyAqLworIiAgICAgICAgamUgICAgICAuTF9jaGVja193aW5kb3dcbiIKKworIiAgICAgICAgbW92bCAgICAlJXIxNGQsICUlZWN4XG4iICAgICAgICAgLyogZWN4ID0gbGVuICovCisiICAgICAgICBtb3ZiICAgIC0xKCUlcmRpKSwgJSVhbFxuIgorIiAgICAgICAgbW92YiAgICAlJWFsLCAlJWFoXG4iCisKKyIgICAgICAgIHNhcmwgICAgJSVlY3hcbiIKKyIgICAgICAgIGpuYyAgICAgLkxfc2V0X3R3b1xuIgorIiAgICAgICAgbW92YiAgICAlJWFsLCAoJSVyZGkpXG4iCisiICAgICAgICBpbmNxICAgICUlcmRpXG4iCisKKyIuTF9zZXRfdHdvOlxuIgorIiAgICAgICAgcmVwICAgICBzdG9zd1xuIgorIiAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0XG4iCisKKyIuYWxpZ24gMzIsMHg5MFxuIgorIi5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGg6XG4iCisiICAgICAgICB0ZXN0YiAgICQ2NCwgJSVhbFxuIgorIiAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2tcbiIgLyogaWYgKChvcCAmIDY0KSAhPSAwKSAqLworCisiICAgICAgICB4b3JsICAgICUlZWF4LCAlJWVheFxuIgorIiAgICAgICAgaW5jbCAgICAlJWVheFxuIgorIiAgICAgICAgc2hsbCAgICAlJWNsLCAlJWVheFxuIgorIiAgICAgICAgZGVjbCAgICAlJWVheFxuIgorIiAgICAgICAgYW5kbCAgICAlJWVkeCwgJSVlYXhcbiIgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLworIiAgICAgICAgYWRkbCAgICAlJXIxNGQsICUlZWF4XG4iICAgICAgICAvKiBlYXggKz0gbGVuICovCisiICAgICAgICBtb3ZsICAgICglJXJicCwlJXJheCw0KSwgJSVlYXhcbiIgLyogZWF4ID0gbGNvZGVbdmFsKyhob2xkJm1hc2tbb3BdKV0qLworIiAgICAgICAgam1wICAgICAuTF9kb2xlblxuIgorCisiLmFsaWduIDMyLDB4OTBcbiIKKyIuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdDpcbiIKKyIgICAgICAgIHRlc3RiICAgJDY0LCAlJWFsXG4iCisiICAgICAgICBqbnogICAgIC5MX2ludmFsaWRfZGlzdGFuY2VfY29kZVxuIiAvKiBpZiAoKG9wICYgNjQpICE9IDApICovCisKKyIgICAgICAgIHhvcmwgICAgJSVlYXgsICUlZWF4XG4iCisiICAgICAgICBpbmNsICAgICUlZWF4XG4iCisiICAgICAgICBzaGxsICAgICUlY2wsICUlZWF4XG4iCisiICAgICAgICBkZWNsICAgICUlZWF4XG4iCisiICAgICAgICBhbmRsICAgICUlZWR4LCAlJWVheFxuIiAgICAgICAgIC8qIGVheCAmPSBob2xkICovCisiICAgICAgICBhZGRsICAgICUlcjE1ZCwgJSVlYXhcbiIgICAgICAgIC8qIGVheCArPSBkaXN0ICovCisiICAgICAgICBtb3ZsICAgICglJXIxMSwlJXJheCw0KSwgJSVlYXhcbiIgLyogZWF4ID0gZGNvZGVbdmFsKyhob2xkJm1hc2tbb3BdKV0qLworIiAgICAgICAgam1wICAgICAuTF9kb2Rpc3RcbiIKKworIi5hbGlnbiAzMiwweDkwXG4iCisiLkxfY2xpcF93aW5kb3c6XG4iCisiICAgICAgICBtb3ZsICAgICUlZWF4LCAlJWVjeFxuIiAgICAgICAgIC8qIGVjeCA9IG5ieXRlcyAqLworIiAgICAgICAgbW92bCAgICA5MiglJXJzcCksICUlZWF4XG4iICAgICAvKiBlYXggPSB3c2l6ZSwgcHJlcGFyZSBmb3IgZGlzdCBjbXAgKi8KKyIgICAgICAgIG5lZ2wgICAgJSVlY3hcbiIgICAgICAgICAgICAgICAgLyogbmJ5dGVzID0gLW5ieXRlcyAqLworCisiICAgICAgICBjbXBsICAgICUlcjE1ZCwgJSVlYXhcbiIKKyIgICAgICAgIGpiICAgICAgLkxfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyXG4iIC8qIGlmIChkaXN0ID4gd3NpemUpICovCisKKyIgICAgICAgIGFkZGwgICAgJSVyMTVkLCAlJWVjeFxuIiAgICAgICAgIC8qIG5ieXRlcyA9IGRpc3QgLSBuYnl0ZXMgKi8KKyIgICAgICAgIGNtcGwgICAgJDAsIDk2KCUlcnNwKVxuIgorIiAgICAgICAgam5lICAgICAuTF93cmFwX2Fyb3VuZF93aW5kb3dcbiIgLyogaWYgKHdyaXRlICE9IDApICovCisKKyIgICAgICAgIG1vdnEgICAgNTYoJSVyc3ApLCAlJXJzaVxuIiAgICAgLyogZnJvbSAgPSB3aW5kb3cgKi8KKyIgICAgICAgIHN1YmwgICAgJSVlY3gsICUlZWF4XG4iICAgICAgICAgLyogZWF4ICAtPSBuYnl0ZXMgKi8KKyIgICAgICAgIGFkZHEgICAgJSVyYXgsICUlcnNpXG4iICAgICAgICAgLyogZnJvbSArPSB3c2l6ZSAtIG5ieXRlcyAqLworCisiICAgICAgICBtb3ZsICAgICUlcjE0ZCwgJSVlYXhcbiIgICAgICAgIC8qIGVheCA9IGxlbiAqLworIiAgICAgICAgY21wbCAgICAlJWVjeCwgJSVyMTRkXG4iCisiICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHlcbiIgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLworCisiICAgICAgICBzdWJsICAgICUlZWN4LCAlJWVheFxuIiAgICAgICAgIC8qIGVheCAtPSBuYnl0ZXMgKi8KKyIgICAgICAgIHJlcCAgICAgbW92c2JcbiIKKyIgICAgICAgIG1vdnEgICAgJSVyZGksICUlcnNpXG4iCisiICAgICAgICBzdWJxICAgICUlcjE1LCAlJXJzaVxuIiAgICAgICAgIC8qIGZyb20gPSAmb3V0WyAtZGlzdCBdICovCisiICAgICAgICBqbXAgICAgIC5MX2RvX2NvcHlcbiIKKworIi5hbGlnbiAzMiwweDkwXG4iCisiLkxfd3JhcF9hcm91bmRfd2luZG93OlxuIgorIiAgICAgICAgbW92bCAgICA5NiglJXJzcCksICUlZWF4XG4iICAgICAvKiBlYXggPSB3cml0ZSAqLworIiAgICAgICAgY21wbCAgICAlJWVheCwgJSVlY3hcbiIKKyIgICAgICAgIGpiZSAgICAgLkxfY29udGlndW91c19pbl93aW5kb3dcbiIgLyogaWYgKHdyaXRlID49IG5ieXRlcykgKi8KKworIiAgICAgICAgbW92bCAgICA5MiglJXJzcCksICUlZXNpXG4iICAgICAvKiBmcm9tICA9IHdzaXplICovCisiICAgICAgICBhZGRxICAgIDU2KCUlcnNwKSwgJSVyc2lcbiIgICAgIC8qIGZyb20gKz0gd2luZG93ICovCisiICAgICAgICBhZGRxICAgICUlcmF4LCAlJXJzaVxuIiAgICAgICAgIC8qIGZyb20gKz0gd3JpdGUgKi8KKyIgICAgICAgIHN1YnEgICAgJSVyY3gsICUlcnNpXG4iICAgICAgICAgLyogZnJvbSAtPSBuYnl0ZXMgKi8KKyIgICAgICAgIHN1YmwgICAgJSVlYXgsICUlZWN4XG4iICAgICAgICAgLyogbmJ5dGVzIC09IHdyaXRlICovCisKKyIgICAgICAgIG1vdmwgICAgJSVyMTRkLCAlJWVheFxuIiAgICAgICAgLyogZWF4ID0gbGVuICovCisiICAgICAgICBjbXBsICAgICUlZWN4LCAlJWVheFxuIgorIiAgICAgICAgamJlICAgICAuTF9kb19jb3B5XG4iICAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KKworIiAgICAgICAgc3VibCAgICAlJWVjeCwgJSVlYXhcbiIgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCisiICAgICAgICByZXAgICAgIG1vdnNiXG4iCisiICAgICAgICBtb3ZxICAgIDU2KCUlcnNwKSwgJSVyc2lcbiIgICAgIC8qIGZyb20gPSB3aW5kb3cgKi8KKyIgICAgICAgIG1vdmwgICAgOTYoJSVyc3ApLCAlJWVjeFxuIiAgICAgLyogbmJ5dGVzID0gd3JpdGUgKi8KKyIgICAgICAgIGNtcGwgICAgJSVlY3gsICUlZWF4XG4iCisiICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHlcbiIgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLworCisiICAgICAgICBzdWJsICAgICUlZWN4LCAlJWVheFxuIiAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KKyIgICAgICAgIHJlcCAgICAgbW92c2JcbiIKKyIgICAgICAgIG1vdnEgICAgJSVyZGksICUlcnNpXG4iCisiICAgICAgICBzdWJxICAgICUlcjE1LCAlJXJzaVxuIiAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCisiICAgICAgICBqbXAgICAgIC5MX2RvX2NvcHlcbiIKKworIi5hbGlnbiAzMiwweDkwXG4iCisiLkxfY29udGlndW91c19pbl93aW5kb3c6XG4iCisiICAgICAgICBtb3ZxICAgIDU2KCUlcnNwKSwgJSVyc2lcbiIgICAgIC8qIHJzaSA9IHdpbmRvdyAqLworIiAgICAgICAgYWRkcSAgICAlJXJheCwgJSVyc2lcbiIKKyIgICAgICAgIHN1YnEgICAgJSVyY3gsICUlcnNpXG4iICAgICAgICAgLyogZnJvbSArPSB3cml0ZSAtIG5ieXRlcyAqLworCisiICAgICAgICBtb3ZsICAgICUlcjE0ZCwgJSVlYXhcbiIgICAgICAgIC8qIGVheCA9IGxlbiAqLworIiAgICAgICAgY21wbCAgICAlJWVjeCwgJSVlYXhcbiIKKyIgICAgICAgIGpiZSAgICAgLkxfZG9fY29weVxuIiAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCisKKyIgICAgICAgIHN1YmwgICAgJSVlY3gsICUlZWF4XG4iICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworIiAgICAgICAgcmVwICAgICBtb3ZzYlxuIgorIiAgICAgICAgbW92cSAgICAlJXJkaSwgJSVyc2lcbiIKKyIgICAgICAgIHN1YnEgICAgJSVyMTUsICUlcnNpXG4iICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKyIgICAgICAgIGptcCAgICAgLkxfZG9fY29weVxuIiAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCisKKyIuYWxpZ24gMzIsMHg5MFxuIgorIi5MX2RvX2NvcHk6XG4iCisiICAgICAgICBtb3ZsICAgICUlZWF4LCAlJWVjeFxuIiAgICAgICAgIC8qIGVjeCA9IGxlbiAqLworIiAgICAgICAgcmVwICAgICBtb3ZzYlxuIgorCisiICAgICAgICBtb3ZxICAgICUlcjgsICUlcnNpXG4iICAgICAgICAgIC8qIG1vdmUgaW4gYmFjayB0byAlZXNpLCB0b3NzIGZyb20gKi8KKyIgICAgICAgIGptcCAgICAgLkxfd2hpbGVfdGVzdFxuIgorCisiLkxfdGVzdF9mb3JfZW5kX29mX2Jsb2NrOlxuIgorIiAgICAgICAgdGVzdGIgICAkMzIsICUlYWxcbiIKKyIgICAgICAgIGp6ICAgICAgLkxfaW52YWxpZF9saXRlcmFsX2xlbmd0aF9jb2RlXG4iCisiICAgICAgICBtb3ZsICAgICQxLCAxMTYoJSVyc3ApXG4iCisiICAgICAgICBqbXAgICAgIC5MX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXNcbiIKKworIi5MX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZTpcbiIKKyIgICAgICAgIG1vdmwgICAgJDIsIDExNiglJXJzcClcbiIKKyIgICAgICAgIGptcCAgICAgLkxfYnJlYWtfbG9vcF93aXRoX3N0YXR1c1xuIgorCisiLkxfaW52YWxpZF9kaXN0YW5jZV9jb2RlOlxuIgorIiAgICAgICAgbW92bCAgICAkMywgMTE2KCUlcnNwKVxuIgorIiAgICAgICAgam1wICAgICAuTF9icmVha19sb29wX3dpdGhfc3RhdHVzXG4iCisKKyIuTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXI6XG4iCisiICAgICAgICBtb3ZsICAgICQ0LCAxMTYoJSVyc3ApXG4iCisiICAgICAgICBqbXAgICAgIC5MX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXNcbiIKKworIi5MX2JyZWFrX2xvb3A6XG4iCisiICAgICAgICBtb3ZsICAgICQwLCAxMTYoJSVyc3ApXG4iCisKKyIuTF9icmVha19sb29wX3dpdGhfc3RhdHVzOlxuIgorLyogcHV0IGluLCBvdXQsIGJpdHMsIGFuZCBob2xkIGJhY2sgaW50byBhciBhbmQgcG9wIGVzcCAqLworIiAgICAgICAgbW92cSAgICAlJXJzaSwgMTYoJSVyc3ApXG4iICAgICAvKiBpbiAqLworIiAgICAgICAgbW92cSAgICAlJXJkaSwgMzIoJSVyc3ApXG4iICAgICAvKiBvdXQgKi8KKyIgICAgICAgIG1vdmwgICAgJSVlYngsIDg4KCUlcnNwKVxuIiAgICAgLyogYml0cyAqLworIiAgICAgICAgbW92cSAgICAlJXJkeCwgODAoJSVyc3ApXG4iICAgICAvKiBob2xkICovCisiICAgICAgICBtb3ZxICAgICglJXJzcCksICUlcmF4XG4iICAgICAgIC8qIHJlc3RvcmUgcmJwIGFuZCByc3AgKi8KKyIgICAgICAgIG1vdnEgICAgOCglJXJzcCksICUlcmJwXG4iCisiICAgICAgICBtb3ZxICAgICUlcmF4LCAlJXJzcFxuIgorICAgICAgICAgIDoKKyAgICAgICAgICA6ICJtIiAoYXIpCisgICAgICAgICAgOiAibWVtb3J5IiwgIiVyYXgiLCAiJXJieCIsICIlcmN4IiwgIiVyZHgiLCAiJXJzaSIsICIlcmRpIiwKKyAgICAgICAgICAgICIlcjgiLCAiJXI5IiwgIiVyMTAiLCAiJXIxMSIsICIlcjEyIiwgIiVyMTMiLCAiJXIxNCIsICIlcjE1IgorICAgICk7CisjZWxpZiAoIGRlZmluZWQoIF9fR05VQ19fICkgfHwgZGVmaW5lZCggX19JQ0MgKSApICYmIGRlZmluZWQoIF9faTM4NiApCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorIiAgICAgICAgbGVhbCAgICAlMCwgJSVlYXhcbiIKKyIgICAgICAgIG1vdmwgICAgJSVlc3AsICglJWVheClcbiIgICAgICAgIC8qIHNhdmUgZXNwLCBlYnAgKi8KKyIgICAgICAgIG1vdmwgICAgJSVlYnAsIDQoJSVlYXgpXG4iCisiICAgICAgICBtb3ZsICAgICUlZWF4LCAlJWVzcFxuIgorIiAgICAgICAgbW92bCAgICA4KCUlZXNwKSwgJSVlc2lcbiIgICAgICAgLyogZXNpID0gaW4gKi8KKyIgICAgICAgIG1vdmwgICAgMTYoJSVlc3ApLCAlJWVkaVxuIiAgICAgIC8qIGVkaSA9IG91dCAqLworIiAgICAgICAgbW92bCAgICA0MCglJWVzcCksICUlZWR4XG4iICAgICAgLyogZWR4ID0gaG9sZCAqLworIiAgICAgICAgbW92bCAgICA0NCglJWVzcCksICUlZWJ4XG4iICAgICAgLyogZWJ4ID0gYml0cyAqLworIiAgICAgICAgbW92bCAgICAzMiglJWVzcCksICUlZWJwXG4iICAgICAgLyogZWJwID0gbGNvZGUgKi8KKworIiAgICAgICAgY2xkXG4iCisiICAgICAgICBqbXAgICAgIC5MX2RvX2xvb3BcbiIKKworIi5hbGlnbiAzMiwweDkwXG4iCisiLkxfd2hpbGVfdGVzdDpcbiIKKyIgICAgICAgIGNtcGwgICAgJSVlZGksIDI0KCUlZXNwKVxuIiAgICAgIC8qIG91dCA8IGVuZCAqLworIiAgICAgICAgamJlICAgICAuTF9icmVha19sb29wXG4iCisiICAgICAgICBjbXBsICAgICUlZXNpLCAxMiglJWVzcClcbiIgICAgICAvKiBpbiA8IGxhc3QgKi8KKyIgICAgICAgIGpiZSAgICAgLkxfYnJlYWtfbG9vcFxuIgorCisiLkxfZG9fbG9vcDpcbiIKKyIgICAgICAgIGNtcGIgICAgJDE1LCAlJWJsXG4iCisiICAgICAgICBqYSAgICAgIC5MX2dldF9sZW5ndGhfY29kZVxuIiAgICAvKiBpZiAoMTUgPCBiaXRzKSAqLworCisiICAgICAgICB4b3JsICAgICUlZWF4LCAlJWVheFxuIgorIiAgICAgICAgbG9kc3dcbiIgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWwgPSAqKHVzaG9ydCAqKWluKysgKi8KKyIgICAgICAgIG1vdmIgICAgJSVibCwgJSVjbFxuIiAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovCisiICAgICAgICBhZGRiICAgICQxNiwgJSVibFxuIiAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovCisiICAgICAgICBzaGxsICAgICUlY2wsICUlZWF4XG4iCisiICAgICAgICBvcmwgICAgICUlZWF4LCAlJWVkeFxuIiAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCisKKyIuTF9nZXRfbGVuZ3RoX2NvZGU6XG4iCisiICAgICAgICBtb3ZsICAgIDU2KCUlZXNwKSwgJSVlYXhcbiIgICAgICAvKiBlYXggPSBsbWFzayAqLworIiAgICAgICAgYW5kbCAgICAlJWVkeCwgJSVlYXhcbiIgICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KKyIgICAgICAgIG1vdmwgICAgKCUlZWJwLCUlZWF4LDQpLCAlJWVheFxuIiAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovCisKKyIuTF9kb2xlbjpcbiIKKyIgICAgICAgIG1vdmIgICAgJSVhaCwgJSVjbFxuIiAgICAgICAgICAgIC8qIGNsID0gdGhpcy5iaXRzICovCisiICAgICAgICBzdWJiICAgICUlYWgsICUlYmxcbiIgICAgICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLworIiAgICAgICAgc2hybCAgICAlJWNsLCAlJWVkeFxuIiAgICAgICAgICAgLyogaG9sZCA+Pj0gdGhpcy5iaXRzICovCisKKyIgICAgICAgIHRlc3RiICAgJSVhbCwgJSVhbFxuIgorIiAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZVxuIiAvKiBpZiAob3AgIT0gMCkgNDUuNyUgKi8KKworIiAgICAgICAgc2hybCAgICAkMTYsICUlZWF4XG4iICAgICAgICAgICAgLyogb3V0cHV0IHRoaXMudmFsIGNoYXIgKi8KKyIgICAgICAgIHN0b3NiXG4iCisiICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RcbiIKKworIi5hbGlnbiAzMiwweDkwXG4iCisiLkxfdGVzdF9mb3JfbGVuZ3RoX2Jhc2U6XG4iCisiICAgICAgICBtb3ZsICAgICUlZWF4LCAlJWVjeFxuIiAgICAgICAgICAvKiBsZW4gPSB0aGlzICovCisiICAgICAgICBzaHJsICAgICQxNiwgJSVlY3hcbiIgICAgICAgICAgICAvKiBsZW4gPSB0aGlzLnZhbCAqLworIiAgICAgICAgbW92bCAgICAlJWVjeCwgNjQoJSVlc3ApXG4iICAgICAgLyogc2F2ZSBsZW4gKi8KKyIgICAgICAgIG1vdmIgICAgJSVhbCwgJSVjbFxuIgorCisiICAgICAgICB0ZXN0YiAgICQxNiwgJSVhbFxuIgorIiAgICAgICAganogICAgICAuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoXG4iIC8qIGlmICgob3AgJiAxNikgPT0gMCkgOCUgKi8KKyIgICAgICAgIGFuZGIgICAgJDE1LCAlJWNsXG4iICAgICAgICAgICAgIC8qIG9wICY9IDE1ICovCisiICAgICAgICBqeiAgICAgIC5MX2RlY29kZV9kaXN0YW5jZVxuIiAgICAvKiBpZiAoIW9wKSAqLworIiAgICAgICAgY21wYiAgICAlJWNsLCAlJWJsXG4iCisiICAgICAgICBqYWUgICAgIC5MX2FkZF9iaXRzX3RvX2xlblxuIiAgICAvKiBpZiAob3AgPD0gYml0cykgKi8KKworIiAgICAgICAgbW92YiAgICAlJWNsLCAlJWNoXG4iICAgICAgICAgICAgLyogc3Rhc2ggb3AgaW4gY2gsIGZyZWVpbmcgY2wgKi8KKyIgICAgICAgIHhvcmwgICAgJSVlYXgsICUlZWF4XG4iCisiICAgICAgICBsb2Rzd1xuIiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLworIiAgICAgICAgbW92YiAgICAlJWJsLCAlJWNsXG4iICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KKyIgICAgICAgIGFkZGIgICAgJDE2LCAlJWJsXG4iICAgICAgICAgICAgIC8qIGJpdHMgKz0gMTYgKi8KKyIgICAgICAgIHNobGwgICAgJSVjbCwgJSVlYXhcbiIKKyIgICAgICAgIG9ybCAgICAgJSVlYXgsICUlZWR4XG4iICAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCisiICAgICAgICBtb3ZiICAgICUlY2gsICUlY2xcbiIgICAgICAgICAgICAvKiBtb3ZlIG9wIGJhY2sgdG8gZWN4ICovCisKKyIuTF9hZGRfYml0c190b19sZW46XG4iCisiICAgICAgICBzdWJiICAgICUlY2wsICUlYmxcbiIKKyIgICAgICAgIHhvcmwgICAgJSVlYXgsICUlZWF4XG4iCisiICAgICAgICBpbmNsICAgICUlZWF4XG4iCisiICAgICAgICBzaGxsICAgICUlY2wsICUlZWF4XG4iCisiICAgICAgICBkZWNsICAgICUlZWF4XG4iCisiICAgICAgICBhbmRsICAgICUlZWR4LCAlJWVheFxuIiAgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLworIiAgICAgICAgc2hybCAgICAlJWNsLCAlJWVkeFxuIgorIiAgICAgICAgYWRkbCAgICAlJWVheCwgNjQoJSVlc3ApXG4iICAgICAgLyogbGVuICs9IGhvbGQgJiBtYXNrW29wXSAqLworCisiLkxfZGVjb2RlX2Rpc3RhbmNlOlxuIgorIiAgICAgICAgY21wYiAgICAkMTUsICUlYmxcbiIKKyIgICAgICAgIGphICAgICAgLkxfZ2V0X2Rpc3RhbmNlX2NvZGVcbiIgIC8qIGlmICgxNSA8IGJpdHMpICovCisKKyIgICAgICAgIHhvcmwgICAgJSVlYXgsICUlZWF4XG4iCisiICAgICAgICBsb2Rzd1xuIiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLworIiAgICAgICAgbW92YiAgICAlJWJsLCAlJWNsXG4iICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KKyIgICAgICAgIGFkZGIgICAgJDE2LCAlJWJsXG4iICAgICAgICAgICAgIC8qIGJpdHMgKz0gMTYgKi8KKyIgICAgICAgIHNobGwgICAgJSVjbCwgJSVlYXhcbiIKKyIgICAgICAgIG9ybCAgICAgJSVlYXgsICUlZWR4XG4iICAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCisKKyIuTF9nZXRfZGlzdGFuY2VfY29kZTpcbiIKKyIgICAgICAgIG1vdmwgICAgNjAoJSVlc3ApLCAlJWVheFxuIiAgICAgIC8qIGVheCA9IGRtYXNrICovCisiICAgICAgICBtb3ZsICAgIDM2KCUlZXNwKSwgJSVlY3hcbiIgICAgICAvKiBlY3ggPSBkY29kZSAqLworIiAgICAgICAgYW5kbCAgICAlJWVkeCwgJSVlYXhcbiIgICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KKyIgICAgICAgIG1vdmwgICAgKCUlZWN4LCUlZWF4LDQpLCAlJWVheFxuIi8qIGVheCA9IGRjb2RlW2hvbGQgJiBkbWFza10gKi8KKworIi5MX2RvZGlzdDpcbiIKKyIgICAgICAgIG1vdmwgICAgJSVlYXgsICUlZWJwXG4iICAgICAgICAgIC8qIGRpc3QgPSB0aGlzICovCisiICAgICAgICBzaHJsICAgICQxNiwgJSVlYnBcbiIgICAgICAgICAgICAvKiBkaXN0ID0gdGhpcy52YWwgKi8KKyIgICAgICAgIG1vdmIgICAgJSVhaCwgJSVjbFxuIgorIiAgICAgICAgc3ViYiAgICAlJWFoLCAlJWJsXG4iICAgICAgICAgICAgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8KKyIgICAgICAgIHNocmwgICAgJSVjbCwgJSVlZHhcbiIgICAgICAgICAgIC8qIGhvbGQgPj49IHRoaXMuYml0cyAqLworIiAgICAgICAgbW92YiAgICAlJWFsLCAlJWNsXG4iICAgICAgICAgICAgLyogY2wgPSB0aGlzLm9wICovCisKKyIgICAgICAgIHRlc3RiICAgJDE2LCAlJWFsXG4iICAgICAgICAgICAgIC8qIGlmICgob3AgJiAxNikgPT0gMCkgKi8KKyIgICAgICAgIGp6ICAgICAgLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3RcbiIKKyIgICAgICAgIGFuZGIgICAgJDE1LCAlJWNsXG4iICAgICAgICAgICAgIC8qIG9wICY9IDE1ICovCisiICAgICAgICBqeiAgICAgIC5MX2NoZWNrX2Rpc3Rfb25lXG4iCisiICAgICAgICBjbXBiICAgICUlY2wsICUlYmxcbiIKKyIgICAgICAgIGphZSAgICAgLkxfYWRkX2JpdHNfdG9fZGlzdFxuIiAgIC8qIGlmIChvcCA8PSBiaXRzKSA5Ny42JSAqLworCisiICAgICAgICBtb3ZiICAgICUlY2wsICUlY2hcbiIgICAgICAgICAgICAvKiBzdGFzaCBvcCBpbiBjaCwgZnJlZWluZyBjbCAqLworIiAgICAgICAgeG9ybCAgICAlJWVheCwgJSVlYXhcbiIKKyIgICAgICAgIGxvZHN3XG4iICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovCisiICAgICAgICBtb3ZiICAgICUlYmwsICUlY2xcbiIgICAgICAgICAgICAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLworIiAgICAgICAgYWRkYiAgICAkMTYsICUlYmxcbiIgICAgICAgICAgICAgLyogYml0cyArPSAxNiAqLworIiAgICAgICAgc2hsbCAgICAlJWNsLCAlJWVheFxuIgorIiAgICAgICAgb3JsICAgICAlJWVheCwgJSVlZHhcbiIgICAgICAgIC8qIGhvbGQgfD0gKigodXNob3J0ICopaW4pKysgPDwgYml0cyAqLworIiAgICAgICAgbW92YiAgICAlJWNoLCAlJWNsXG4iICAgICAgICAgICAgLyogbW92ZSBvcCBiYWNrIHRvIGVjeCAqLworCisiLkxfYWRkX2JpdHNfdG9fZGlzdDpcbiIKKyIgICAgICAgIHN1YmIgICAgJSVjbCwgJSVibFxuIgorIiAgICAgICAgeG9ybCAgICAlJWVheCwgJSVlYXhcbiIKKyIgICAgICAgIGluY2wgICAgJSVlYXhcbiIKKyIgICAgICAgIHNobGwgICAgJSVjbCwgJSVlYXhcbiIKKyIgICAgICAgIGRlY2wgICAgJSVlYXhcbiIgICAgICAgICAgICAgICAgIC8qICgxIDw8IG9wKSAtIDEgKi8KKyIgICAgICAgIGFuZGwgICAgJSVlZHgsICUlZWF4XG4iICAgICAgICAgIC8qIGVheCAmPSBob2xkICovCisiICAgICAgICBzaHJsICAgICUlY2wsICUlZWR4XG4iCisiICAgICAgICBhZGRsICAgICUlZWF4LCAlJWVicFxuIiAgICAgICAgICAvKiBkaXN0ICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkgKi8KKworIi5MX2NoZWNrX3dpbmRvdzpcbiIKKyIgICAgICAgIG1vdmwgICAgJSVlc2ksIDgoJSVlc3ApXG4iICAgICAgIC8qIHNhdmUgaW4gc28gZnJvbSBjYW4gdXNlIGl0J3MgcmVnICovCisiICAgICAgICBtb3ZsICAgICUlZWRpLCAlJWVheFxuIgorIiAgICAgICAgc3VibCAgICAyMCglJWVzcCksICUlZWF4XG4iICAgICAgLyogbmJ5dGVzID0gb3V0IC0gYmVnICovCisKKyIgICAgICAgIGNtcGwgICAgJSVlYnAsICUlZWF4XG4iCisiICAgICAgICBqYiAgICAgIC5MX2NsaXBfd2luZG93XG4iICAgICAgICAvKiBpZiAoZGlzdCA+IG5ieXRlcykgNC4yJSAqLworCisiICAgICAgICBtb3ZsICAgIDY0KCUlZXNwKSwgJSVlY3hcbiIgICAgICAvKiBlY3ggPSBsZW4gKi8KKyIgICAgICAgIG1vdmwgICAgJSVlZGksICUlZXNpXG4iCisiICAgICAgICBzdWJsICAgICUlZWJwLCAlJWVzaVxuIiAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLworCisiICAgICAgICBzYXJsICAgICUlZWN4XG4iCisiICAgICAgICBqbmMgICAgIC5MX2NvcHlfdHdvXG4iICAgICAgICAgICAvKiBpZiBsZW4gJSAyID09IDAgKi8KKworIiAgICAgICAgcmVwICAgICBtb3Zzd1xuIgorIiAgICAgICAgbW92YiAgICAoJSVlc2kpLCAlJWFsXG4iCisiICAgICAgICBtb3ZiICAgICUlYWwsICglJWVkaSlcbiIKKyIgICAgICAgIGluY2wgICAgJSVlZGlcbiIKKworIiAgICAgICAgbW92bCAgICA4KCUlZXNwKSwgJSVlc2lcbiIgICAgICAgLyogbW92ZSBpbiBiYWNrIHRvICVlc2ksIHRvc3MgZnJvbSAqLworIiAgICAgICAgbW92bCAgICAzMiglJWVzcCksICUlZWJwXG4iICAgICAgLyogZWJwID0gbGNvZGUgKi8KKyIgICAgICAgIGptcCAgICAgLkxfd2hpbGVfdGVzdFxuIgorCisiLkxfY29weV90d286XG4iCisiICAgICAgICByZXAgICAgIG1vdnN3XG4iCisiICAgICAgICBtb3ZsICAgIDgoJSVlc3ApLCAlJWVzaVxuIiAgICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovCisiICAgICAgICBtb3ZsICAgIDMyKCUlZXNwKSwgJSVlYnBcbiIgICAgICAvKiBlYnAgPSBsY29kZSAqLworIiAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0XG4iCisKKyIuYWxpZ24gMzIsMHg5MFxuIgorIi5MX2NoZWNrX2Rpc3Rfb25lOlxuIgorIiAgICAgICAgY21wbCAgICAkMSwgJSVlYnBcbiIgICAgICAgICAgICAvKiBpZiBkaXN0IDEsIGlzIGEgbWVtc2V0ICovCisiICAgICAgICBqbmUgICAgIC5MX2NoZWNrX3dpbmRvd1xuIgorIiAgICAgICAgY21wbCAgICAlJWVkaSwgMjAoJSVlc3ApXG4iCisiICAgICAgICBqZSAgICAgIC5MX2NoZWNrX3dpbmRvd1xuIiAgICAgIC8qIG91dCA9PSBiZWcsIGlmIG91dHNpZGUgd2luZG93ICovCisKKyIgICAgICAgIG1vdmwgICAgNjQoJSVlc3ApLCAlJWVjeFxuIiAgICAgIC8qIGVjeCA9IGxlbiAqLworIiAgICAgICAgbW92YiAgICAtMSglJWVkaSksICUlYWxcbiIKKyIgICAgICAgIG1vdmIgICAgJSVhbCwgJSVhaFxuIgorCisiICAgICAgICBzYXJsICAgICUlZWN4XG4iCisiICAgICAgICBqbmMgICAgIC5MX3NldF90d29cbiIKKyIgICAgICAgIG1vdmIgICAgJSVhbCwgKCUlZWRpKVxuIgorIiAgICAgICAgaW5jbCAgICAlJWVkaVxuIgorCisiLkxfc2V0X3R3bzpcbiIKKyIgICAgICAgIHJlcCAgICAgc3Rvc3dcbiIKKyIgICAgICAgIG1vdmwgICAgMzIoJSVlc3ApLCAlJWVicFxuIiAgICAgIC8qIGVicCA9IGxjb2RlICovCisiICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RcbiIKKworIi5hbGlnbiAzMiwweDkwXG4iCisiLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aDpcbiIKKyIgICAgICAgIHRlc3RiICAgJDY0LCAlJWFsXG4iCisiICAgICAgICBqbnogICAgIC5MX3Rlc3RfZm9yX2VuZF9vZl9ibG9ja1xuIiAvKiBpZiAoKG9wICYgNjQpICE9IDApICovCisKKyIgICAgICAgIHhvcmwgICAgJSVlYXgsICUlZWF4XG4iCisiICAgICAgICBpbmNsICAgICUlZWF4XG4iCisiICAgICAgICBzaGxsICAgICUlY2wsICUlZWF4XG4iCisiICAgICAgICBkZWNsICAgICUlZWF4XG4iCisiICAgICAgICBhbmRsICAgICUlZWR4LCAlJWVheFxuIiAgICAgICAgIC8qIGVheCAmPSBob2xkICovCisiICAgICAgICBhZGRsICAgIDY0KCUlZXNwKSwgJSVlYXhcbiIgICAgIC8qIGVheCArPSBsZW4gKi8KKyIgICAgICAgIG1vdmwgICAgKCUlZWJwLCUlZWF4LDQpLCAlJWVheFxuIiAvKiBlYXggPSBsY29kZVt2YWwrKGhvbGQmbWFza1tvcF0pXSovCisiICAgICAgICBqbXAgICAgIC5MX2RvbGVuXG4iCisKKyIuYWxpZ24gMzIsMHg5MFxuIgorIi5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0OlxuIgorIiAgICAgICAgdGVzdGIgICAkNjQsICUlYWxcbiIKKyIgICAgICAgIGpueiAgICAgLkxfaW52YWxpZF9kaXN0YW5jZV9jb2RlXG4iIC8qIGlmICgob3AgJiA2NCkgIT0gMCkgKi8KKworIiAgICAgICAgeG9ybCAgICAlJWVheCwgJSVlYXhcbiIKKyIgICAgICAgIGluY2wgICAgJSVlYXhcbiIKKyIgICAgICAgIHNobGwgICAgJSVjbCwgJSVlYXhcbiIKKyIgICAgICAgIGRlY2wgICAgJSVlYXhcbiIKKyIgICAgICAgIGFuZGwgICAgJSVlZHgsICUlZWF4XG4iICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KKyIgICAgICAgIGFkZGwgICAgJSVlYnAsICUlZWF4XG4iICAgICAgICAgLyogZWF4ICs9IGRpc3QgKi8KKyIgICAgICAgIG1vdmwgICAgMzYoJSVlc3ApLCAlJWVjeFxuIiAgICAgLyogZWN4ID0gZGNvZGUgKi8KKyIgICAgICAgIG1vdmwgICAgKCUlZWN4LCUlZWF4LDQpLCAlJWVheFxuIiAvKiBlYXggPSBkY29kZVt2YWwrKGhvbGQmbWFza1tvcF0pXSovCisiICAgICAgICBqbXAgICAgIC5MX2RvZGlzdFxuIgorCisiLmFsaWduIDMyLDB4OTBcbiIKKyIuTF9jbGlwX3dpbmRvdzpcbiIKKyIgICAgICAgIG1vdmwgICAgJSVlYXgsICUlZWN4XG4iCisiICAgICAgICBtb3ZsICAgIDQ4KCUlZXNwKSwgJSVlYXhcbiIgICAgIC8qIGVheCA9IHdzaXplICovCisiICAgICAgICBuZWdsICAgICUlZWN4XG4iICAgICAgICAgICAgICAgIC8qIG5ieXRlcyA9IC1uYnl0ZXMgKi8KKyIgICAgICAgIG1vdmwgICAgMjgoJSVlc3ApLCAlJWVzaVxuIiAgICAgLyogZnJvbSA9IHdpbmRvdyAqLworCisiICAgICAgICBjbXBsICAgICUlZWJwLCAlJWVheFxuIgorIiAgICAgICAgamIgICAgICAuTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXJcbiIgLyogaWYgKGRpc3QgPiB3c2l6ZSkgKi8KKworIiAgICAgICAgYWRkbCAgICAlJWVicCwgJSVlY3hcbiIgICAgICAgICAvKiBuYnl0ZXMgPSBkaXN0IC0gbmJ5dGVzICovCisiICAgICAgICBjbXBsICAgICQwLCA1MiglJWVzcClcbiIKKyIgICAgICAgIGpuZSAgICAgLkxfd3JhcF9hcm91bmRfd2luZG93XG4iIC8qIGlmICh3cml0ZSAhPSAwKSAqLworCisiICAgICAgICBzdWJsICAgICUlZWN4LCAlJWVheFxuIgorIiAgICAgICAgYWRkbCAgICAlJWVheCwgJSVlc2lcbiIgICAgICAgICAvKiBmcm9tICs9IHdzaXplIC0gbmJ5dGVzICovCisKKyIgICAgICAgIG1vdmwgICAgNjQoJSVlc3ApLCAlJWVheFxuIiAgICAgLyogZWF4ID0gbGVuICovCisiICAgICAgICBjbXBsICAgICUlZWN4LCAlJWVheFxuIgorIiAgICAgICAgamJlICAgICAuTF9kb19jb3B5XG4iICAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KKworIiAgICAgICAgc3VibCAgICAlJWVjeCwgJSVlYXhcbiIgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCisiICAgICAgICByZXAgICAgIG1vdnNiXG4iCisiICAgICAgICBtb3ZsICAgICUlZWRpLCAlJWVzaVxuIgorIiAgICAgICAgc3VibCAgICAlJWVicCwgJSVlc2lcbiIgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLworIiAgICAgICAgam1wICAgICAuTF9kb19jb3B5XG4iCisKKyIuYWxpZ24gMzIsMHg5MFxuIgorIi5MX3dyYXBfYXJvdW5kX3dpbmRvdzpcbiIKKyIgICAgICAgIG1vdmwgICAgNTIoJSVlc3ApLCAlJWVheFxuIiAgICAgLyogZWF4ID0gd3JpdGUgKi8KKyIgICAgICAgIGNtcGwgICAgJSVlYXgsICUlZWN4XG4iCisiICAgICAgICBqYmUgICAgIC5MX2NvbnRpZ3VvdXNfaW5fd2luZG93XG4iIC8qIGlmICh3cml0ZSA+PSBuYnl0ZXMpICovCisKKyIgICAgICAgIGFkZGwgICAgNDgoJSVlc3ApLCAlJWVzaVxuIiAgICAgLyogZnJvbSArPSB3c2l6ZSAqLworIiAgICAgICAgYWRkbCAgICAlJWVheCwgJSVlc2lcbiIgICAgICAgICAvKiBmcm9tICs9IHdyaXRlICovCisiICAgICAgICBzdWJsICAgICUlZWN4LCAlJWVzaVxuIiAgICAgICAgIC8qIGZyb20gLT0gbmJ5dGVzICovCisiICAgICAgICBzdWJsICAgICUlZWF4LCAlJWVjeFxuIiAgICAgICAgIC8qIG5ieXRlcyAtPSB3cml0ZSAqLworCisiICAgICAgICBtb3ZsICAgIDY0KCUlZXNwKSwgJSVlYXhcbiIgICAgIC8qIGVheCA9IGxlbiAqLworIiAgICAgICAgY21wbCAgICAlJWVjeCwgJSVlYXhcbiIKKyIgICAgICAgIGpiZSAgICAgLkxfZG9fY29weVxuIiAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCisKKyIgICAgICAgIHN1YmwgICAgJSVlY3gsICUlZWF4XG4iICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworIiAgICAgICAgcmVwICAgICBtb3ZzYlxuIgorIiAgICAgICAgbW92bCAgICAyOCglJWVzcCksICUlZXNpXG4iICAgICAvKiBmcm9tID0gd2luZG93ICovCisiICAgICAgICBtb3ZsICAgIDUyKCUlZXNwKSwgJSVlY3hcbiIgICAgIC8qIG5ieXRlcyA9IHdyaXRlICovCisiICAgICAgICBjbXBsICAgICUlZWN4LCAlJWVheFxuIgorIiAgICAgICAgamJlICAgICAuTF9kb19jb3B5XG4iICAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KKworIiAgICAgICAgc3VibCAgICAlJWVjeCwgJSVlYXhcbiIgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCisiICAgICAgICByZXAgICAgIG1vdnNiXG4iCisiICAgICAgICBtb3ZsICAgICUlZWRpLCAlJWVzaVxuIgorIiAgICAgICAgc3VibCAgICAlJWVicCwgJSVlc2lcbiIgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLworIiAgICAgICAgam1wICAgICAuTF9kb19jb3B5XG4iCisKKyIuYWxpZ24gMzIsMHg5MFxuIgorIi5MX2NvbnRpZ3VvdXNfaW5fd2luZG93OlxuIgorIiAgICAgICAgYWRkbCAgICAlJWVheCwgJSVlc2lcbiIKKyIgICAgICAgIHN1YmwgICAgJSVlY3gsICUlZXNpXG4iICAgICAgICAgLyogZnJvbSArPSB3cml0ZSAtIG5ieXRlcyAqLworCisiICAgICAgICBtb3ZsICAgIDY0KCUlZXNwKSwgJSVlYXhcbiIgICAgIC8qIGVheCA9IGxlbiAqLworIiAgICAgICAgY21wbCAgICAlJWVjeCwgJSVlYXhcbiIKKyIgICAgICAgIGpiZSAgICAgLkxfZG9fY29weVxuIiAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCisKKyIgICAgICAgIHN1YmwgICAgJSVlY3gsICUlZWF4XG4iICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworIiAgICAgICAgcmVwICAgICBtb3ZzYlxuIgorIiAgICAgICAgbW92bCAgICAlJWVkaSwgJSVlc2lcbiIKKyIgICAgICAgIHN1YmwgICAgJSVlYnAsICUlZXNpXG4iICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKyIgICAgICAgIGptcCAgICAgLkxfZG9fY29weVxuIiAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCisKKyIuYWxpZ24gMzIsMHg5MFxuIgorIi5MX2RvX2NvcHk6XG4iCisiICAgICAgICBtb3ZsICAgICUlZWF4LCAlJWVjeFxuIgorIiAgICAgICAgcmVwICAgICBtb3ZzYlxuIgorCisiICAgICAgICBtb3ZsICAgIDgoJSVlc3ApLCAlJWVzaVxuIiAgICAgIC8qIG1vdmUgaW4gYmFjayB0byAlZXNpLCB0b3NzIGZyb20gKi8KKyIgICAgICAgIG1vdmwgICAgMzIoJSVlc3ApLCAlJWVicFxuIiAgICAgLyogZWJwID0gbGNvZGUgKi8KKyIgICAgICAgIGptcCAgICAgLkxfd2hpbGVfdGVzdFxuIgorCisiLkxfdGVzdF9mb3JfZW5kX29mX2Jsb2NrOlxuIgorIiAgICAgICAgdGVzdGIgICAkMzIsICUlYWxcbiIKKyIgICAgICAgIGp6ICAgICAgLkxfaW52YWxpZF9saXRlcmFsX2xlbmd0aF9jb2RlXG4iCisiICAgICAgICBtb3ZsICAgICQxLCA3MiglJWVzcClcbiIKKyIgICAgICAgIGptcCAgICAgLkxfYnJlYWtfbG9vcF93aXRoX3N0YXR1c1xuIgorCisiLkxfaW52YWxpZF9saXRlcmFsX2xlbmd0aF9jb2RlOlxuIgorIiAgICAgICAgbW92bCAgICAkMiwgNzIoJSVlc3ApXG4iCisiICAgICAgICBqbXAgICAgIC5MX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXNcbiIKKworIi5MX2ludmFsaWRfZGlzdGFuY2VfY29kZTpcbiIKKyIgICAgICAgIG1vdmwgICAgJDMsIDcyKCUlZXNwKVxuIgorIiAgICAgICAgam1wICAgICAuTF9icmVha19sb29wX3dpdGhfc3RhdHVzXG4iCisKKyIuTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXI6XG4iCisiICAgICAgICBtb3ZsICAgIDgoJSVlc3ApLCAlJWVzaVxuIgorIiAgICAgICAgbW92bCAgICAkNCwgNzIoJSVlc3ApXG4iCisiICAgICAgICBqbXAgICAgIC5MX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXNcbiIKKworIi5MX2JyZWFrX2xvb3A6XG4iCisiICAgICAgICBtb3ZsICAgICQwLCA3MiglJWVzcClcbiIKKworIi5MX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXM6XG4iCisvKiBwdXQgaW4sIG91dCwgYml0cywgYW5kIGhvbGQgYmFjayBpbnRvIGFyIGFuZCBwb3AgZXNwICovCisiICAgICAgICBtb3ZsICAgICUlZXNpLCA4KCUlZXNwKVxuIiAgICAgIC8qIHNhdmUgaW4gKi8KKyIgICAgICAgIG1vdmwgICAgJSVlZGksIDE2KCUlZXNwKVxuIiAgICAgLyogc2F2ZSBvdXQgKi8KKyIgICAgICAgIG1vdmwgICAgJSVlYngsIDQ0KCUlZXNwKVxuIiAgICAgLyogc2F2ZSBiaXRzICovCisiICAgICAgICBtb3ZsICAgICUlZWR4LCA0MCglJWVzcClcbiIgICAgIC8qIHNhdmUgaG9sZCAqLworIiAgICAgICAgbW92bCAgICA0KCUlZXNwKSwgJSVlYnBcbiIgICAgICAvKiByZXN0b3JlIGVzcCwgZWJwICovCisiICAgICAgICBtb3ZsICAgICglJWVzcCksICUlZXNwXG4iCisgICAgICAgICAgOgorICAgICAgICAgIDogIm0iIChhcikKKyAgICAgICAgICA6ICJtZW1vcnkiLCAiJWVheCIsICIlZWJ4IiwgIiVlY3giLCAiJWVkeCIsICIlZXNpIiwgIiVlZGkiCisgICAgKTsKKyNlbGlmIGRlZmluZWQoIF9NU0NfVkVSICkgJiYgISBkZWZpbmVkKCBfTV9BTUQ2NCApCisgICAgX19hc20geworCWxlYQllYXgsIGFyCisJbW92CVtlYXhdLCBlc3AgICAgICAgICAvKiBzYXZlIGVzcCwgZWJwICovCisJbW92CVtlYXgrNF0sIGVicAorCW1vdgllc3AsIGVheAorCW1vdgllc2ksIFtlc3ArOF0gICAgICAgLyogZXNpID0gaW4gKi8KKwltb3YJZWRpLCBbZXNwKzE2XSAgICAgIC8qIGVkaSA9IG91dCAqLworCW1vdgllZHgsIFtlc3ArNDBdICAgICAgLyogZWR4ID0gaG9sZCAqLworCW1vdgllYngsIFtlc3ArNDRdICAgICAgLyogZWJ4ID0gYml0cyAqLworCW1vdgllYnAsIFtlc3ArMzJdICAgICAgLyogZWJwID0gbGNvZGUgKi8KKworCWNsZAorCWptcAlMX2RvX2xvb3AKKworQUxJR04gNAorTF93aGlsZV90ZXN0OgorCWNtcAlbZXNwKzI0XSwgZWRpCisJamJlCUxfYnJlYWtfbG9vcAorCWNtcAlbZXNwKzEyXSwgZXNpCisJamJlCUxfYnJlYWtfbG9vcAorCitMX2RvX2xvb3A6CisJY21wCWJsLCAxNQorCWphCUxfZ2V0X2xlbmd0aF9jb2RlICAgIC8qIGlmICgxNSA8IGJpdHMpICovCisKKwl4b3IJZWF4LCBlYXgKKwlsb2RzdyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLworCW1vdgljbCwgYmwgICAgICAgICAgICAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLworCWFkZAlibCwgMTYgICAgICAgICAgICAgLyogYml0cyArPSAxNiAqLworCXNobAllYXgsIGNsCisJb3IJZWR4LCBlYXggICAgICAgIC8qIGhvbGQgfD0gKigodXNob3J0ICopaW4pKysgPDwgYml0cyAqLworCitMX2dldF9sZW5ndGhfY29kZToKKwltb3YJZWF4LCBbZXNwKzU2XSAgICAgIC8qIGVheCA9IGxtYXNrICovCisJYW5kCWVheCwgZWR4ICAgICAgICAgIC8qIGVheCAmPSBob2xkICovCisJbW92CWVheCwgW2VicCtlYXgqNF0gLyogZWF4ID0gbGNvZGVbaG9sZCAmIGxtYXNrXSAqLworCitMX2RvbGVuOgorCW1vdgljbCwgYWggICAgICAgICAgICAvKiBjbCA9IHRoaXMuYml0cyAqLworCXN1YglibCwgYWggICAgICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLworCXNocgllZHgsIGNsICAgICAgICAgICAvKiBob2xkID4+PSB0aGlzLmJpdHMgKi8KKworCXRlc3QJYWwsIGFsCisJam56CUxfdGVzdF9mb3JfbGVuZ3RoX2Jhc2UgLyogaWYgKG9wICE9IDApIDQ1LjclICovCisKKwlzaHIJZWF4LCAxNiAgICAgICAgICAgIC8qIG91dHB1dCB0aGlzLnZhbCBjaGFyICovCisJc3Rvc2IKKwlqbXAJTF93aGlsZV90ZXN0CisKK0FMSUdOIDQKK0xfdGVzdF9mb3JfbGVuZ3RoX2Jhc2U6CisJbW92CWVjeCwgZWF4ICAgICAgICAgIC8qIGxlbiA9IHRoaXMgKi8KKwlzaHIJZWN4LCAxNiAgICAgICAgICAgIC8qIGxlbiA9IHRoaXMudmFsICovCisJbW92CVtlc3ArNjRdLCBlY3ggICAgICAvKiBzYXZlIGxlbiAqLworCW1vdgljbCwgYWwKKworCXRlc3QJYWwsIDE2CisJanoJTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoIC8qIGlmICgob3AgJiAxNikgPT0gMCkgOCUgKi8KKwlhbmQJY2wsIDE1ICAgICAgICAgICAgIC8qIG9wICY9IDE1ICovCisJanoJTF9kZWNvZGVfZGlzdGFuY2UgICAgLyogaWYgKCFvcCkgKi8KKwljbXAJYmwsIGNsCisJamFlCUxfYWRkX2JpdHNfdG9fbGVuICAgIC8qIGlmIChvcCA8PSBiaXRzKSAqLworCisJbW92CWNoLCBjbCAgICAgICAgICAgIC8qIHN0YXNoIG9wIGluIGNoLCBmcmVlaW5nIGNsICovCisJeG9yCWVheCwgZWF4CisJbG9kc3cgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWwgPSAqKHVzaG9ydCAqKWluKysgKi8KKwltb3YJY2wsIGJsICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KKwlhZGQJYmwsIDE2ICAgICAgICAgICAgIC8qIGJpdHMgKz0gMTYgKi8KKwlzaGwJZWF4LCBjbAorCW9yCWVkeCwgZWF4ICAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCisJbW92CWNsLCBjaCAgICAgICAgICAgIC8qIG1vdmUgb3AgYmFjayB0byBlY3ggKi8KKworTF9hZGRfYml0c190b19sZW46CisJc3ViCWJsLCBjbAorCXhvcgllYXgsIGVheAorCWluYwllYXgKKwlzaGwJZWF4LCBjbAorCWRlYwllYXgKKwlhbmQJZWF4LCBlZHggICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KKwlzaHIJZWR4LCBjbAorCWFkZAlbZXNwKzY0XSwgZWF4ICAgICAgLyogbGVuICs9IGhvbGQgJiBtYXNrW29wXSAqLworCitMX2RlY29kZV9kaXN0YW5jZToKKwljbXAJYmwsIDE1CisJamEJTF9nZXRfZGlzdGFuY2VfY29kZSAgLyogaWYgKDE1IDwgYml0cykgKi8KKworCXhvcgllYXgsIGVheAorCWxvZHN3ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovCisJbW92CWNsLCBibCAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovCisJYWRkCWJsLCAxNiAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovCisJc2hsCWVheCwgY2wKKwlvcgllZHgsIGVheCAgICAgICAgIC8qIGhvbGQgfD0gKigodXNob3J0ICopaW4pKysgPDwgYml0cyAqLworCitMX2dldF9kaXN0YW5jZV9jb2RlOgorCW1vdgllYXgsIFtlc3ArNjBdICAgICAgLyogZWF4ID0gZG1hc2sgKi8KKwltb3YJZWN4LCBbZXNwKzM2XSAgICAgIC8qIGVjeCA9IGRjb2RlICovCisJYW5kCWVheCwgZWR4ICAgICAgICAgIC8qIGVheCAmPSBob2xkICovCisJbW92CWVheCwgW2VjeCtlYXgqNF0vKiBlYXggPSBkY29kZVtob2xkICYgZG1hc2tdICovCisKK0xfZG9kaXN0OgorCW1vdgllYnAsIGVheCAgICAgICAgICAvKiBkaXN0ID0gdGhpcyAqLworCXNocgllYnAsIDE2ICAgICAgICAgICAgLyogZGlzdCA9IHRoaXMudmFsICovCisJbW92CWNsLCBhaAorCXN1YglibCwgYWggICAgICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLworCXNocgllZHgsIGNsICAgICAgICAgICAvKiBob2xkID4+PSB0aGlzLmJpdHMgKi8KKwltb3YJY2wsIGFsICAgICAgICAgICAgLyogY2wgPSB0aGlzLm9wICovCisKKwl0ZXN0CWFsLCAxNiAgICAgICAgICAgICAvKiBpZiAoKG9wICYgMTYpID09IDApICovCisJanoJTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdAorCWFuZAljbCwgMTUgICAgICAgICAgICAgLyogb3AgJj0gMTUgKi8KKwlqeglMX2NoZWNrX2Rpc3Rfb25lCisJY21wCWJsLCBjbAorCWphZQlMX2FkZF9iaXRzX3RvX2Rpc3QgICAvKiBpZiAob3AgPD0gYml0cykgOTcuNiUgKi8KKworCW1vdgljaCwgY2wgICAgICAgICAgICAvKiBzdGFzaCBvcCBpbiBjaCwgZnJlZWluZyBjbCAqLworCXhvcgllYXgsIGVheAorCWxvZHN3ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovCisJbW92CWNsLCBibCAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovCisJYWRkCWJsLCAxNiAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovCisJc2hsCWVheCwgY2wKKwlvcgllZHgsIGVheCAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCisJbW92CWNsLCBjaCAgICAgICAgICAgIC8qIG1vdmUgb3AgYmFjayB0byBlY3ggKi8KKworTF9hZGRfYml0c190b19kaXN0OgorCXN1YglibCwgY2wKKwl4b3IJZWF4LCBlYXgKKwlpbmMJZWF4CisJc2hsCWVheCwgY2wKKwlkZWMJZWF4ICAgICAgICAgICAgICAgICAvKiAoMSA8PCBvcCkgLSAxICovCisJYW5kCWVheCwgZWR4ICAgICAgICAgIC8qIGVheCAmPSBob2xkICovCisJc2hyCWVkeCwgY2wKKwlhZGQJZWJwLCBlYXggICAgICAgICAgLyogZGlzdCArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpICovCisKK0xfY2hlY2tfd2luZG93OgorCW1vdglbZXNwKzhdLCBlc2kgICAgICAgLyogc2F2ZSBpbiBzbyBmcm9tIGNhbiB1c2UgaXQncyByZWcgKi8KKwltb3YJZWF4LCBlZGkKKwlzdWIJZWF4LCBbZXNwKzIwXSAgICAgIC8qIG5ieXRlcyA9IG91dCAtIGJlZyAqLworCisJY21wCWVheCwgZWJwCisJamIJTF9jbGlwX3dpbmRvdyAgICAgICAgLyogaWYgKGRpc3QgPiBuYnl0ZXMpIDQuMiUgKi8KKworCW1vdgllY3gsIFtlc3ArNjRdICAgICAgLyogZWN4ID0gbGVuICovCisJbW92CWVzaSwgZWRpCisJc3ViCWVzaSwgZWJwICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCisKKwlzYXIJZWN4LCAxCisJam5jCUxfY29weV90d28KKworCXJlcCAgICAgbW92c3cKKwltb3YJYWwsIFtlc2ldCisJbW92CVtlZGldLCBhbAorCWluYwllZGkKKworCW1vdgllc2ksIFtlc3ArOF0gICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovCisJbW92CWVicCwgW2VzcCszMl0gICAgIC8qIGVicCA9IGxjb2RlICovCisJam1wCUxfd2hpbGVfdGVzdAorCitMX2NvcHlfdHdvOgorCXJlcCAgICAgbW92c3cKKwltb3YJZXNpLCBbZXNwKzhdICAgICAgLyogbW92ZSBpbiBiYWNrIHRvICVlc2ksIHRvc3MgZnJvbSAqLworCW1vdgllYnAsIFtlc3ArMzJdICAgICAvKiBlYnAgPSBsY29kZSAqLworCWptcAlMX3doaWxlX3Rlc3QKKworQUxJR04gNAorTF9jaGVja19kaXN0X29uZToKKwljbXAJZWJwLCAxICAgICAgICAgICAgLyogaWYgZGlzdCAxLCBpcyBhIG1lbXNldCAqLworCWpuZQlMX2NoZWNrX3dpbmRvdworCWNtcAlbZXNwKzIwXSwgZWRpCisJamUJTF9jaGVja193aW5kb3cgICAgLyogb3V0ID09IGJlZywgaWYgb3V0c2lkZSB3aW5kb3cgKi8KKworCW1vdgllY3gsIFtlc3ArNjRdICAgICAvKiBlY3ggPSBsZW4gKi8KKwltb3YJYWwsIFtlZGktMV0KKwltb3YJYWgsIGFsCisKKwlzYXIJZWN4LCAxCisJam5jCUxfc2V0X3R3bworCW1vdglbZWRpXSwgYWwgICAgICAgICAvKiBtZW1zZXQgb3V0IHdpdGggZnJvbVstMV0gKi8KKwlpbmMJZWRpCisKK0xfc2V0X3R3bzoKKwlyZXAgICAgIHN0b3N3CisJbW92CWVicCwgW2VzcCszMl0gICAgIC8qIGVicCA9IGxjb2RlICovCisJam1wCUxfd2hpbGVfdGVzdAorCitBTElHTiA0CitMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGg6CisJdGVzdAlhbCwgNjQKKwlqbnoJTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2sgLyogaWYgKChvcCAmIDY0KSAhPSAwKSAqLworCisJeG9yCWVheCwgZWF4CisJaW5jCWVheAorCXNobAllYXgsIGNsCisJZGVjCWVheAorCWFuZAllYXgsIGVkeCAgICAgICAgIC8qIGVheCAmPSBob2xkICovCisJYWRkCWVheCwgW2VzcCs2NF0gICAgIC8qIGVheCArPSBsZW4gKi8KKwltb3YJZWF4LCBbZWJwK2VheCo0XSAvKiBlYXggPSBsY29kZVt2YWwrKGhvbGQmbWFza1tvcF0pXSovCisJam1wCUxfZG9sZW4KKworQUxJR04gNAorTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdDoKKwl0ZXN0CWFsLCA2NAorCWpueglMX2ludmFsaWRfZGlzdGFuY2VfY29kZSAvKiBpZiAoKG9wICYgNjQpICE9IDApICovCisKKwl4b3IJZWF4LCBlYXgKKwlpbmMJZWF4CisJc2hsCWVheCwgY2wKKwlkZWMJZWF4CisJYW5kCWVheCwgZWR4ICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KKwlhZGQJZWF4LCBlYnAgICAgICAgICAvKiBlYXggKz0gZGlzdCAqLworCW1vdgllY3gsIFtlc3ArMzZdICAgICAvKiBlY3ggPSBkY29kZSAqLworCW1vdgllYXgsIFtlY3grZWF4KjRdIC8qIGVheCA9IGRjb2RlW3ZhbCsoaG9sZCZtYXNrW29wXSldKi8KKwlqbXAJTF9kb2Rpc3QKKworQUxJR04gNAorTF9jbGlwX3dpbmRvdzoKKwltb3YJZWN4LCBlYXgKKwltb3YJZWF4LCBbZXNwKzQ4XSAgICAgLyogZWF4ID0gd3NpemUgKi8KKwluZWcJZWN4ICAgICAgICAgICAgICAgIC8qIG5ieXRlcyA9IC1uYnl0ZXMgKi8KKwltb3YJZXNpLCBbZXNwKzI4XSAgICAgLyogZnJvbSA9IHdpbmRvdyAqLworCisJY21wCWVheCwgZWJwCisJamIJTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXIgLyogaWYgKGRpc3QgPiB3c2l6ZSkgKi8KKworCWFkZAllY3gsIGVicCAgICAgICAgIC8qIG5ieXRlcyA9IGRpc3QgLSBuYnl0ZXMgKi8KKwljbXAJZHdvcmQgcHRyIFtlc3ArNTJdLCAwCisJam5lCUxfd3JhcF9hcm91bmRfd2luZG93IC8qIGlmICh3cml0ZSAhPSAwKSAqLworCisJc3ViCWVheCwgZWN4CisJYWRkCWVzaSwgZWF4ICAgICAgICAgLyogZnJvbSArPSB3c2l6ZSAtIG5ieXRlcyAqLworCisJbW92CWVheCwgW2VzcCs2NF0gICAgLyogZWF4ID0gbGVuICovCisJY21wCWVheCwgZWN4CisJamJlCUxfZG9fY29weSAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KKworCXN1YgllYXgsIGVjeCAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KKwlyZXAgICAgIG1vdnNiCisJbW92CWVzaSwgZWRpCisJc3ViCWVzaSwgZWJwICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKwlqbXAJTF9kb19jb3B5CisKK0FMSUdOIDQKK0xfd3JhcF9hcm91bmRfd2luZG93OgorCW1vdgllYXgsIFtlc3ArNTJdICAgIC8qIGVheCA9IHdyaXRlICovCisJY21wCWVjeCwgZWF4CisJamJlCUxfY29udGlndW91c19pbl93aW5kb3cgLyogaWYgKHdyaXRlID49IG5ieXRlcykgKi8KKworCWFkZAllc2ksIFtlc3ArNDhdICAgIC8qIGZyb20gKz0gd3NpemUgKi8KKwlhZGQJZXNpLCBlYXggICAgICAgICAvKiBmcm9tICs9IHdyaXRlICovCisJc3ViCWVzaSwgZWN4ICAgICAgICAgLyogZnJvbSAtPSBuYnl0ZXMgKi8KKwlzdWIJZWN4LCBlYXggICAgICAgICAvKiBuYnl0ZXMgLT0gd3JpdGUgKi8KKworCW1vdgllYXgsIFtlc3ArNjRdICAgIC8qIGVheCA9IGxlbiAqLworCWNtcAllYXgsIGVjeAorCWpiZQlMX2RvX2NvcHkgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCisKKwlzdWIJZWF4LCBlY3ggICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCisJcmVwICAgICBtb3ZzYgorCW1vdgllc2ksIFtlc3ArMjhdICAgICAvKiBmcm9tID0gd2luZG93ICovCisJbW92CWVjeCwgW2VzcCs1Ml0gICAgIC8qIG5ieXRlcyA9IHdyaXRlICovCisJY21wCWVheCwgZWN4CisJamJlCUxfZG9fY29weSAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KKworCXN1YgllYXgsIGVjeCAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KKwlyZXAgICAgIG1vdnNiCisJbW92CWVzaSwgZWRpCisJc3ViCWVzaSwgZWJwICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKwlqbXAJTF9kb19jb3B5CisKK0FMSUdOIDQKK0xfY29udGlndW91c19pbl93aW5kb3c6CisJYWRkCWVzaSwgZWF4CisJc3ViCWVzaSwgZWN4ICAgICAgICAgLyogZnJvbSArPSB3cml0ZSAtIG5ieXRlcyAqLworCisJbW92CWVheCwgW2VzcCs2NF0gICAgLyogZWF4ID0gbGVuICovCisJY21wCWVheCwgZWN4CisJamJlCUxfZG9fY29weSAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KKworCXN1YgllYXgsIGVjeCAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KKwlyZXAgICAgIG1vdnNiCisJbW92CWVzaSwgZWRpCisJc3ViCWVzaSwgZWJwICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKwlqbXAJTF9kb19jb3B5CisKK0FMSUdOIDQKK0xfZG9fY29weToKKwltb3YJZWN4LCBlYXgKKwlyZXAgICAgIG1vdnNiCisKKwltb3YJZXNpLCBbZXNwKzhdICAgICAgLyogbW92ZSBpbiBiYWNrIHRvICVlc2ksIHRvc3MgZnJvbSAqLworCW1vdgllYnAsIFtlc3ArMzJdICAgICAvKiBlYnAgPSBsY29kZSAqLworCWptcAlMX3doaWxlX3Rlc3QKKworTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2s6CisJdGVzdAlhbCwgMzIKKwlqeglMX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZQorCW1vdglkd29yZCBwdHIgW2VzcCs3Ml0sIDEKKwlqbXAJTF9icmVha19sb29wX3dpdGhfc3RhdHVzCisKK0xfaW52YWxpZF9saXRlcmFsX2xlbmd0aF9jb2RlOgorCW1vdglkd29yZCBwdHIgW2VzcCs3Ml0sIDIKKwlqbXAJTF9icmVha19sb29wX3dpdGhfc3RhdHVzCisKK0xfaW52YWxpZF9kaXN0YW5jZV9jb2RlOgorCW1vdglkd29yZCBwdHIgW2VzcCs3Ml0sIDMKKwlqbXAJTF9icmVha19sb29wX3dpdGhfc3RhdHVzCisKK0xfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyOgorCW1vdgllc2ksIFtlc3ArNF0KKwltb3YJZHdvcmQgcHRyIFtlc3ArNzJdLCA0CisJam1wCUxfYnJlYWtfbG9vcF93aXRoX3N0YXR1cworCitMX2JyZWFrX2xvb3A6CisJbW92CWR3b3JkIHB0ciBbZXNwKzcyXSwgMAorCitMX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXM6CisvKiBwdXQgaW4sIG91dCwgYml0cywgYW5kIGhvbGQgYmFjayBpbnRvIGFyIGFuZCBwb3AgZXNwICovCisJbW92CVtlc3ArOF0sIGVzaSAgICAgLyogc2F2ZSBpbiAqLworCW1vdglbZXNwKzE2XSwgZWRpICAgIC8qIHNhdmUgb3V0ICovCisJbW92CVtlc3ArNDRdLCBlYnggICAgLyogc2F2ZSBiaXRzICovCisJbW92CVtlc3ArNDBdLCBlZHggICAgLyogc2F2ZSBob2xkICovCisJbW92CWVicCwgW2VzcCs0XSAgICAgLyogcmVzdG9yZSBlc3AsIGVicCAqLworCW1vdgllc3AsIFtlc3BdCisgICAgfQorI2Vsc2UKKyNlcnJvciAieDg2IGFyY2hpdGVjdHVyZSBub3QgZGVmaW5lZCIKKyNlbmRpZgorCisgICAgaWYgKGFyLnN0YXR1cyA+IDEpIHsKKyAgICAgICAgaWYgKGFyLnN0YXR1cyA9PSAyKQorICAgICAgICAgICAgc3RybS0+bXNnID0gImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSI7CisgICAgICAgIGVsc2UgaWYgKGFyLnN0YXR1cyA9PSAzKQorICAgICAgICAgICAgc3RybS0+bXNnID0gImludmFsaWQgZGlzdGFuY2UgY29kZSI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0cm0tPm1zZyA9ICJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7CisgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgIH0KKyAgICBlbHNlIGlmICggYXIuc3RhdHVzID09IDEgKSB7CisgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKKyAgICB9CisKKyAgICAvKiByZXR1cm4gdW51c2VkIGJ5dGVzIChvbiBlbnRyeSwgYml0cyA8IDgsIHNvIGluIHdvbid0IGdvIHRvbyBmYXIgYmFjaykgKi8KKyAgICBhci5sZW4gPSBhci5iaXRzID4+IDM7CisgICAgYXIuaW4gLT0gYXIubGVuOworICAgIGFyLmJpdHMgLT0gYXIubGVuIDw8IDM7CisgICAgYXIuaG9sZCAmPSAoMVUgPDwgYXIuYml0cykgLSAxOworCisgICAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXR1cm4gKi8KKyAgICBzdHJtLT5uZXh0X2luID0gYXIuaW47CisgICAgc3RybS0+bmV4dF9vdXQgPSBhci5vdXQ7CisgICAgc3RybS0+YXZhaWxfaW4gPSAodW5zaWduZWQpKGFyLmluIDwgYXIubGFzdCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBRF9BVkFJTF9JTiArIChhci5sYXN0IC0gYXIuaW4pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFEX0FWQUlMX0lOIC0gKGFyLmluIC0gYXIubGFzdCkpOworICAgIHN0cm0tPmF2YWlsX291dCA9ICh1bnNpZ25lZCkoYXIub3V0IDwgYXIuZW5kID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBRF9BVkFJTF9PVVQgKyAoYXIuZW5kIC0gYXIub3V0KSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQURfQVZBSUxfT1VUIC0gKGFyLm91dCAtIGFyLmVuZCkpOworICAgIHN0YXRlLT5ob2xkID0gYXIuaG9sZDsKKyAgICBzdGF0ZS0+Yml0cyA9IGFyLmJpdHM7CisgICAgcmV0dXJuOworfQorCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL2luZmxhdGU4Ni9pbmZmYXN0LlMgYi96bGliL3NyYy9jb250cmliL2luZmxhdGU4Ni9pbmZmYXN0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI0NWEyOQotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvaW5mbGF0ZTg2L2luZmZhc3QuUwpAQCAtMCwwICsxLDEzNjggQEAKKy8qCisgKiBpbmZmYXN0LlMgaXMgYSBoYW5kIHR1bmVkIGFzc2VtYmxlciB2ZXJzaW9uIG9mOgorICoKKyAqIGluZmZhc3QuYyAtLSBmYXN0IGRlY29kaW5nCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIENocmlzIEFuZGVyc29uIDxjaHJpc3RvcEBjaGFybS5uZXQ+CisgKiBQbGVhc2UgdXNlIHRoZSBjb3B5cmlnaHQgY29uZGl0aW9ucyBhYm92ZS4KKyAqCisgKiBUaGlzIHZlcnNpb24gKEphbi0yMy0yMDAzKSBvZiBpbmZsYXRlX2Zhc3Qgd2FzIGNvZGVkIGFuZCB0ZXN0ZWQgdW5kZXIKKyAqIEdOVS9MaW51eCBvbiBhIHBlbnRpdW0gMywgdXNpbmcgdGhlIGdjYy0zLjIgY29tcGlsZXIgZGlzdHJpYnV0aW9uLiAgT24gdGhhdAorICogbWFjaGluZSwgSSBmb3VuZCB0aGF0IGd6aXAgc3R5bGUgYXJjaGl2ZXMgZGVjb21wcmVzc2VkIGFib3V0IDIwJSBmYXN0ZXIgdGhhbgorICogdGhlIGdjYy0zLjIgLU8zIC1mb21pdC1mcmFtZS1wb2ludGVyIGNvbXBpbGVkIHZlcnNpb24uICBZb3VyIHJlc3VsdHMgd2lsbAorICogZGVwZW5kIG9uIGhvdyBsYXJnZSBvZiBhIGJ1ZmZlciBpcyB1c2VkIGZvciB6X3N0cmVhbS5uZXh0X2luICYgbmV4dF9vdXQKKyAqICg4Sy0zMksgd29ya2VkIGJlc3QgZm9yIG15IDI1NksgY3B1IGNhY2hlKSBhbmQgaG93IG11Y2ggb3ZlcmhlYWQgdGhlcmUgaXMgaW4KKyAqIHN0cmVhbSBwcm9jZXNzaW5nIEkvTyBhbmQgY3JjMzIvYWRkbGVyMzIuICBJbiBteSBjYXNlLCB0aGlzIHJvdXRpbmUgdXNlZAorICogNzAlIG9mIHRoZSBjcHUgdGltZSBhbmQgY3JjMzIgdXNlZCAyMCUuCisgKgorICogSSBhbSBjb25maWRlbnQgdGhhdCB0aGlzIHZlcnNpb24gd2lsbCB3b3JrIGluIHRoZSBnZW5lcmFsIGNhc2UsIGJ1dCBJIGhhdmUKKyAqIG5vdCB0ZXN0ZWQgYSB3aWRlIHZhcmlldHkgb2YgZGF0YXNldHMgb3IgYSB3aWRlIHZhcmlldHkgb2YgcGxhdGZvcm1zLgorICoKKyAqIEphbi0yNC0yMDAzIC0tIEFkZGVkIC1EVVNFX01NWCBkZWZpbmUgZm9yIHNsaWdodGx5IGZhc3RlciBpbmZsYXRpbmcuCisgKiBJdCBzaG91bGQgYmUgYSBydW50aW1lIGZsYWcgaW5zdGVhZCBvZiBjb21waWxlIHRpbWUgZmxhZy4uLgorICoKKyAqIEphbi0yNi0yMDAzIC0tIEFkZGVkIHJ1bnRpbWUgY2hlY2sgZm9yIE1NWCBzdXBwb3J0IHdpdGggY3B1aWQgaW5zdHJ1Y3Rpb24uCisgKiBXaXRoIC1EVVNFX01NWCwgb25seSBNTVggY29kZSBpcyBjb21waWxlZC4gIFdpdGggLUROT19NTVgsIG9ubHkgbm9uLU1NWCBjb2RlCisgKiBpcyBjb21waWxlZC4gIFdpdGhvdXQgZWl0aGVyIG9wdGlvbiwgcnVudGltZSBkZXRlY3Rpb24gaXMgZW5hYmxlZC4gIFJ1bnRpbWUKKyAqIGRldGVjdGlvbiBzaG91bGQgd29yayBvbiBhbGwgbW9kZXJuIGNwdXMgYW5kIHRoZSByZWNvbWVuZGVkIGFsZ29yaXRobSAoZmxpcAorICogSUQgYml0IG9uIGVmbGFncyBhbmQgdGhlbiB1c2UgdGhlIGNwdWlkIGluc3RydWN0aW9uKSBpcyB1c2VkIGluIG1hbnkKKyAqIG11bHRpbWVkaWEgYXBwbGljYXRpb25zLiAgVGVzdGVkIHVuZGVyIHdpbjJrIHdpdGggZ2NjLTIuOTUgYW5kIGdhcy0yLjEyCisgKiBkaXN0cmlidXRlZCB3aXRoIGN5Z3dpbjMuICBDb21waWxpbmcgd2l0aCBnY2MtMi45NSAtYyBpbmZmYXN0LlMgLW8KKyAqIGluZmZhc3Qub2JqIGdlbmVyYXRlcyBhIENPRkYgb2JqZWN0IHdoaWNoIGNhbiB0aGVuIGJlIGxpbmtlZCB3aXRoIE1TVkMrKworICogY29tcGlsZWQgY29kZS4gIFRlc3RlZCB1bmRlciBGcmVlQlNEIDQuNyB3aXRoIGdjYy0yLjk1LgorICoKKyAqIEphbi0yOC0yMDAzIC0tIFRlc3RlZCBBdGhsb24gWFAuLi4gTU1YIG1vZGUgaXMgc2xvd2VyIHRoYW4gbm8gTU1YIChhbmQKKyAqIHNsb3dlciB0aGFuIGNvbXBpbGVyIGdlbmVyYXRlZCBjb2RlKS4gIEFkanVzdGVkIGNwdWlkIGNoZWNrIHRvIHVzZSB0aGUgTU1YCisgKiBjb2RlIG9ubHkgZm9yIFBlbnRpdW1zIDwgUDQgdW50aWwgSSBoYXZlIG1vcmUgZGF0YSBvbiB0aGUgUDQuICBTcGVlZAorICogaW1wcm92bWVudCBpcyBvbmx5IGFib3V0IDE1JSBvbiB0aGUgQXRobG9uIHdoZW4gY29tcGFyZWQgd2l0aCBjb2RlIGdlbmVyYXRlZAorICogd2l0aCBNU1ZDKysuICBOb3Qgc3VyZSB5ZXQsIGJ1dCBJIHRoaW5rIHRoZSBQNCB3aWxsIGFsc28gYmUgc2xvd2VyIHVzaW5nIHRoZQorICogTU1YIG1vZGUgYmVjYXVzZSBtYW55IG9mIGl0J3MgeDg2IEFMVSBpbnN0cnVjdGlvbnMgZXhlY3V0ZSBpbiAuNSBjeWNsZXMgYW5kCisgKiBoYXZlIGxlc3MgbGF0ZW5jeSB0aGFuIE1NWCBvcHMuICBBZGRlZCBjb2RlIHRvIGJ1ZmZlciB0aGUgbGFzdCAxMSBieXRlcyBvZgorICogdGhlIGlucHV0IHN0cmVhbSBzaW5jZSB0aGUgTU1YIGNvZGUgZ3JhYnMgYml0cyBpbiBjaHVua3Mgb2YgMzIsIHdoaWNoCisgKiBkaWZmZXJzIGZyb20gdGhlIGluZmZhc3QuYyBhbGdvcml0aG0uICBJIGRvbid0IHRoaW5rIHRoZXJlIHdvdWxkIGhhdmUgYmVlbgorICogcmVhZCBvdmVycnVucyB3aGVyZSBhIHBhZ2UgYm91bmRhcnkgd2FzIGNyb3NzZWQgKGEgc2VnZmF1bHQpLCBidXQgdGhlcmUKKyAqIGNvdWxkIGhhdmUgYmVlbiBvdmVycnVucyB3aGVuIG5leHRfaW4gZW5kcyBvbiB1bmFsaWduZWQgbWVtb3J5ICh1bmludGlhbGl6ZWQKKyAqIG1lbW9yeSByZWFkKS4KKyAqCisgKiBNYXItMTMtMjAwMyAtLSBQNCBNTVggaXMgc2xpZ2h0bHkgc2xvd2VyIHRoYW4gUDQgTk9fTU1YLiAgSSBjcmVhdGVkIGEgQworICogdmVyc2lvbiBvZiB0aGUgbm9uLU1NWCBjb2RlIHNvIHRoYXQgaXQgZG9lc24ndCBkZXBlbmQgb24genN0cm0gYW5kIHpzdGF0ZQorICogc3RydWN0dXJlIG9mZnNldHMgd2hpY2ggYXJlIGhhcmQgY29kZWQgaW4gdGhpcyBmaWxlLiAgVGhpcyB3YXMgbGFzdCB0ZXN0ZWQKKyAqIHdpdGggemxpYi0xLjIuMCB3aGljaCBpcyBjdXJyZW50bHkgaW4gYmV0YSB0ZXN0aW5nLCBuZXdlciB2ZXJzaW9ucyBvZiB0aGlzCisgKiBhbmQgaW5mZmFzODYuYyBjYW4gYmUgZm91bmQgYXQgaHR0cDovL3d3dy5lZXRiZWV0ZWUuY29tL3psaWIvIGFuZAorICogaHR0cDovL3d3dy5jaGFybS5uZXQvfmNocmlzdG9wL3psaWIvCisgKi8KKworCisvKgorICogaWYgeW91IGhhdmUgdW5kZXJzY29yZSBsaW5raW5nIHByb2JsZW1zIChfaW5mbGF0ZV9mYXN0IHVuZGVmaW5lZCksIHRyeQorICogdXNpbmcgLURHQVNfQ09GRgorICovCisjaWYgISBkZWZpbmVkKCBHQVNfQ09GRiApICYmICEgZGVmaW5lZCggR0FTX0VMRiApCisKKyNpZiBkZWZpbmVkKCBXSU4zMiApIHx8IGRlZmluZWQoIF9fQ1lHV0lOX18gKQorI2RlZmluZSBHQVNfQ09GRiAvKiB3aW5kb3dzIG9iamVjdCBmb3JtYXQgKi8KKyNlbHNlCisjZGVmaW5lIEdBU19FTEYKKyNlbmRpZgorCisjZW5kaWYgLyogISBHQVNfQ09GRiAmJiAhIEdBU19FTEYgKi8KKworCisjaWYgZGVmaW5lZCggR0FTX0NPRkYgKQorCisvKiBjb2ZmIGV4dGVybmFscyBoYXZlIHVuZGVyc2NvcmVzICovCisjZGVmaW5lIGluZmxhdGVfZmFzdCBfaW5mbGF0ZV9mYXN0CisjZGVmaW5lIGluZmxhdGVfZmFzdF91c2VfbW14IF9pbmZsYXRlX2Zhc3RfdXNlX21teAorCisjZW5kaWYgLyogR0FTX0NPRkYgKi8KKworCisuZmlsZSAiaW5mZmFzdC5TIgorCisuZ2xvYmwgaW5mbGF0ZV9mYXN0CisKKy50ZXh0CisuYWxpZ24gNCwwCisuTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGVfbXNnOgorLnN0cmluZyAiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIgorCisuYWxpZ24gNCwwCisuTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGVfbXNnOgorLnN0cmluZyAiaW52YWxpZCBkaXN0YW5jZSBjb2RlIgorCisuYWxpZ24gNCwwCisuTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXJfbXNnOgorLnN0cmluZyAiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siCisKKyNpZiAhIGRlZmluZWQoIE5PX01NWCApCisuYWxpZ24gNCwwCisuTF9tYXNrOiAvKiBtYXNrW05dID0gKCAxIDw8IE4gKSAtIDEgKi8KKy5sb25nIDAKKy5sb25nIDEKKy5sb25nIDMKKy5sb25nIDcKKy5sb25nIDE1CisubG9uZyAzMQorLmxvbmcgNjMKKy5sb25nIDEyNworLmxvbmcgMjU1CisubG9uZyA1MTEKKy5sb25nIDEwMjMKKy5sb25nIDIwNDcKKy5sb25nIDQwOTUKKy5sb25nIDgxOTEKKy5sb25nIDE2MzgzCisubG9uZyAzMjc2NworLmxvbmcgNjU1MzUKKy5sb25nIDEzMTA3MQorLmxvbmcgMjYyMTQzCisubG9uZyA1MjQyODcKKy5sb25nIDEwNDg1NzUKKy5sb25nIDIwOTcxNTEKKy5sb25nIDQxOTQzMDMKKy5sb25nIDgzODg2MDcKKy5sb25nIDE2Nzc3MjE1CisubG9uZyAzMzU1NDQzMQorLmxvbmcgNjcxMDg4NjMKKy5sb25nIDEzNDIxNzcyNworLmxvbmcgMjY4NDM1NDU1CisubG9uZyA1MzY4NzA5MTEKKy5sb25nIDEwNzM3NDE4MjMKKy5sb25nIDIxNDc0ODM2NDcKKy5sb25nIDQyOTQ5NjcyOTUKKyNlbmRpZiAvKiBOT19NTVggKi8KKworLnRleHQKKworLyoKKyAqIHN0cnVjdCB6X3N0cmVhbSBvZmZzZXRzLCBpbiB6bGliLmgKKyAqLworI2RlZmluZSBuZXh0X2luX3N0cm0gICAwICAgLyogc3RybS0+bmV4dF9pbiAqLworI2RlZmluZSBhdmFpbF9pbl9zdHJtICA0ICAgLyogc3RybS0+YXZhaWxfaW4gKi8KKyNkZWZpbmUgbmV4dF9vdXRfc3RybSAgMTIgIC8qIHN0cm0tPm5leHRfb3V0ICovCisjZGVmaW5lIGF2YWlsX291dF9zdHJtIDE2ICAvKiBzdHJtLT5hdmFpbF9vdXQgKi8KKyNkZWZpbmUgbXNnX3N0cm0gICAgICAgMjQgIC8qIHN0cm0tPm1zZyAqLworI2RlZmluZSBzdGF0ZV9zdHJtICAgICAyOCAgLyogc3RybS0+c3RhdGUgKi8KKworLyoKKyAqIHN0cnVjdCBpbmZsYXRlX3N0YXRlIG9mZnNldHMsIGluIGluZmxhdGUuaAorICovCisjZGVmaW5lIG1vZGVfc3RhdGUgICAgIDAgICAvKiBzdGF0ZS0+bW9kZSAqLworI2RlZmluZSB3c2l6ZV9zdGF0ZSAgICAzMiAgLyogc3RhdGUtPndzaXplICovCisjZGVmaW5lIHdyaXRlX3N0YXRlICAgIDQwICAvKiBzdGF0ZS0+d3JpdGUgKi8KKyNkZWZpbmUgd2luZG93X3N0YXRlICAgNDQgIC8qIHN0YXRlLT53aW5kb3cgKi8KKyNkZWZpbmUgaG9sZF9zdGF0ZSAgICAgNDggIC8qIHN0YXRlLT5ob2xkICovCisjZGVmaW5lIGJpdHNfc3RhdGUgICAgIDUyICAvKiBzdGF0ZS0+Yml0cyAqLworI2RlZmluZSBsZW5jb2RlX3N0YXRlICA2OCAgLyogc3RhdGUtPmxlbmNvZGUgKi8KKyNkZWZpbmUgZGlzdGNvZGVfc3RhdGUgNzIgIC8qIHN0YXRlLT5kaXN0Y29kZSAqLworI2RlZmluZSBsZW5iaXRzX3N0YXRlICA3NiAgLyogc3RhdGUtPmxlbmJpdHMgKi8KKyNkZWZpbmUgZGlzdGJpdHNfc3RhdGUgODAgIC8qIHN0YXRlLT5kaXN0Yml0cyAqLworCisvKgorICogaW5mbGF0ZV9mYXN0J3MgYWN0aXZhdGlvbiByZWNvcmQKKyAqLworI2RlZmluZSBsb2NhbF92YXJfc2l6ZSA2NCAvKiBob3cgbXVjaCBsb2NhbCBzcGFjZSBmb3IgdmFycyAqLworI2RlZmluZSBzdHJtX3NwICAgICAgICA4OCAvKiBmaXJzdCBhcmc6IHpfc3RyZWFtICogKGxvY2FsX3Zhcl9zaXplICsgMjQpICovCisjZGVmaW5lIHN0YXJ0X3NwICAgICAgIDkyIC8qIHNlY29uZCBhcmc6IHVuc2lnbmVkIGludCAobG9jYWxfdmFyX3NpemUgKyAyOCkgKi8KKworLyoKKyAqIG9mZnNldHMgZm9yIGxvY2FsIHZhcnMgb24gc3RhY2sKKyAqLworI2RlZmluZSBvdXQgICAgICAgICAgICA2MCAgLyogdW5zaWduZWQgY2hhciogKi8KKyNkZWZpbmUgd2luZG93ICAgICAgICAgNTYgIC8qIHVuc2lnbmVkIGNoYXIqICovCisjZGVmaW5lIHdzaXplICAgICAgICAgIDUyICAvKiB1bnNpZ25lZCBpbnQgKi8KKyNkZWZpbmUgd3JpdGUgICAgICAgICAgNDggIC8qIHVuc2lnbmVkIGludCAqLworI2RlZmluZSBpbiAgICAgICAgICAgICA0NCAgLyogdW5zaWduZWQgY2hhciogKi8KKyNkZWZpbmUgYmVnICAgICAgICAgICAgNDAgIC8qIHVuc2lnbmVkIGNoYXIqICovCisjZGVmaW5lIGJ1ZiAgICAgICAgICAgIDI4ICAvKiBjaGFyWyAxMiBdICovCisjZGVmaW5lIGxlbiAgICAgICAgICAgIDI0ICAvKiB1bnNpZ25lZCBpbnQgKi8KKyNkZWZpbmUgbGFzdCAgICAgICAgICAgMjAgIC8qIHVuc2lnbmVkIGNoYXIqICovCisjZGVmaW5lIGVuZCAgICAgICAgICAgIDE2ICAvKiB1bnNpZ25lZCBjaGFyKiAqLworI2RlZmluZSBkY29kZSAgICAgICAgICAxMiAgLyogY29kZSogKi8KKyNkZWZpbmUgbGNvZGUgICAgICAgICAgIDggIC8qIGNvZGUqICovCisjZGVmaW5lIGRtYXNrICAgICAgICAgICA0ICAvKiB1bnNpZ25lZCBpbnQgKi8KKyNkZWZpbmUgbG1hc2sgICAgICAgICAgIDAgIC8qIHVuc2lnbmVkIGludCAqLworCisvKgorICogdHlwZWRlZiBlbnVtIGluZmxhdGVfbW9kZSBjb25zdHMsIGluIGluZmxhdGUuaAorICovCisjZGVmaW5lIElORkxBVEVfTU9ERV9UWVBFIDExICAvKiBzdGF0ZS0+bW9kZSBmbGFncyBlbnVtLWVkIGluIGluZmxhdGUuaCAqLworI2RlZmluZSBJTkZMQVRFX01PREVfQkFEICAyNgorCisKKyNpZiAhIGRlZmluZWQoIFVTRV9NTVggKSAmJiAhIGRlZmluZWQoIE5PX01NWCApCisKKyNkZWZpbmUgUlVOX1RJTUVfTU1YCisKKyNkZWZpbmUgQ0hFQ0tfTU1YICAgIDEKKyNkZWZpbmUgRE9fVVNFX01NWCAgIDIKKyNkZWZpbmUgRE9OVF9VU0VfTU1YIDMKKworLmdsb2JsIGluZmxhdGVfZmFzdF91c2VfbW14CisKKy5kYXRhCisKKy5hbGlnbiA0LDAKK2luZmxhdGVfZmFzdF91c2VfbW14OiAvKiBpbnRlZ2VyIGZsYWcgZm9yIHJ1biB0aW1lIGNvbnRyb2wgMT1jaGVjaywyPW1teCwzPW5vICovCisubG9uZyBDSEVDS19NTVgKKworI2lmIGRlZmluZWQoIEdBU19FTEYgKQorLyogZWxmIGluZm8gKi8KKy50eXBlICAgaW5mbGF0ZV9mYXN0X3VzZV9tbXgsQG9iamVjdAorLnNpemUgICBpbmZsYXRlX2Zhc3RfdXNlX21teCw0CisjZW5kaWYKKworI2VuZGlmIC8qIFJVTl9USU1FX01NWCAqLworCisjaWYgZGVmaW5lZCggR0FTX0NPRkYgKQorLyogY29mZiBpbmZvOiBzY2wgMiA9IGV4dGVybiwgdHlwZSAzMiA9IGZ1bmN0aW9uICovCisuZGVmIGluZmxhdGVfZmFzdDsgLnNjbCAyOyAudHlwZSAzMjsgLmVuZGVmCisjZW5kaWYKKworLnRleHQKKworLmFsaWduIDMyLDB4OTAKK2luZmxhdGVfZmFzdDoKKyAgICAgICAgcHVzaGwgICAlZWRpCisgICAgICAgIHB1c2hsICAgJWVzaQorICAgICAgICBwdXNobCAgICVlYnAKKyAgICAgICAgcHVzaGwgICAlZWJ4CisgICAgICAgIHB1c2hmICAgLyogc2F2ZSBlZmxhZ3MgKHN0cm1fc3AsIHN0YXRlX3NwIGFzc3VtZXMgdGhpcyBpcyAzMiBiaXRzKSAqLworICAgICAgICBzdWJsICAgICRsb2NhbF92YXJfc2l6ZSwgJWVzcAorICAgICAgICBjbGQKKworI2RlZmluZSBzdHJtX3IgICVlc2kKKyNkZWZpbmUgc3RhdGVfciAlZWRpCisKKyAgICAgICAgbW92bCAgICBzdHJtX3NwKCVlc3ApLCBzdHJtX3IKKyAgICAgICAgbW92bCAgICBzdGF0ZV9zdHJtKHN0cm1fciksIHN0YXRlX3IKKworICAgICAgICAvKiBpbiA9IHN0cm0tPm5leHRfaW47CisgICAgICAgICAqIG91dCA9IHN0cm0tPm5leHRfb3V0OworICAgICAgICAgKiBsYXN0ID0gaW4gKyBzdHJtLT5hdmFpbF9pbiAtIDExOworICAgICAgICAgKiBiZWcgPSBvdXQgLSAoc3RhcnQgLSBzdHJtLT5hdmFpbF9vdXQpOworICAgICAgICAgKiBlbmQgPSBvdXQgKyAoc3RybS0+YXZhaWxfb3V0IC0gMjU3KTsKKyAgICAgICAgICovCisgICAgICAgIG1vdmwgICAgYXZhaWxfaW5fc3RybShzdHJtX3IpLCAlZWR4CisgICAgICAgIG1vdmwgICAgbmV4dF9pbl9zdHJtKHN0cm1fciksICVlYXgKKworICAgICAgICBhZGRsICAgICVlYXgsICVlZHggICAgICAvKiBhdmFpbF9pbiArPSBuZXh0X2luICovCisgICAgICAgIHN1YmwgICAgJDExLCAlZWR4ICAgICAgIC8qIGF2YWlsX2luIC09IDExICovCisKKyAgICAgICAgbW92bCAgICAlZWF4LCBpbiglZXNwKQorICAgICAgICBtb3ZsICAgICVlZHgsIGxhc3QoJWVzcCkKKworICAgICAgICBtb3ZsICAgIHN0YXJ0X3NwKCVlc3ApLCAlZWJwCisgICAgICAgIG1vdmwgICAgYXZhaWxfb3V0X3N0cm0oc3RybV9yKSwgJWVjeAorICAgICAgICBtb3ZsICAgIG5leHRfb3V0X3N0cm0oc3RybV9yKSwgJWVieAorCisgICAgICAgIHN1YmwgICAgJWVjeCwgJWVicCAgICAgIC8qIHN0YXJ0IC09IGF2YWlsX291dCAqLworICAgICAgICBuZWdsICAgICVlYnAgICAgICAgICAgICAvKiBzdGFydCA9IC1zdGFydCAqLworICAgICAgICBhZGRsICAgICVlYngsICVlYnAgICAgICAvKiBzdGFydCArPSBuZXh0X291dCAqLworCisgICAgICAgIHN1YmwgICAgJDI1NywgJWVjeCAgICAgIC8qIGF2YWlsX291dCAtPSAyNTcgKi8KKyAgICAgICAgYWRkbCAgICAlZWJ4LCAlZWN4ICAgICAgLyogYXZhaWxfb3V0ICs9IG91dCAqLworCisgICAgICAgIG1vdmwgICAgJWVieCwgb3V0KCVlc3ApCisgICAgICAgIG1vdmwgICAgJWVicCwgYmVnKCVlc3ApCisgICAgICAgIG1vdmwgICAgJWVjeCwgZW5kKCVlc3ApCisKKyAgICAgICAgLyogd3NpemUgPSBzdGF0ZS0+d3NpemU7CisgICAgICAgICAqIHdyaXRlID0gc3RhdGUtPndyaXRlOworICAgICAgICAgKiB3aW5kb3cgPSBzdGF0ZS0+d2luZG93OworICAgICAgICAgKiBob2xkID0gc3RhdGUtPmhvbGQ7CisgICAgICAgICAqIGJpdHMgPSBzdGF0ZS0+Yml0czsKKyAgICAgICAgICogbGNvZGUgPSBzdGF0ZS0+bGVuY29kZTsKKyAgICAgICAgICogZGNvZGUgPSBzdGF0ZS0+ZGlzdGNvZGU7CisgICAgICAgICAqIGxtYXNrID0gKCAxIDw8IHN0YXRlLT5sZW5iaXRzICkgLSAxOworICAgICAgICAgKiBkbWFzayA9ICggMSA8PCBzdGF0ZS0+ZGlzdGJpdHMgKSAtIDE7CisgICAgICAgICAqLworCisgICAgICAgIG1vdmwgICAgbGVuY29kZV9zdGF0ZShzdGF0ZV9yKSwgJWVheAorICAgICAgICBtb3ZsICAgIGRpc3Rjb2RlX3N0YXRlKHN0YXRlX3IpLCAlZWN4CisKKyAgICAgICAgbW92bCAgICAlZWF4LCBsY29kZSglZXNwKQorICAgICAgICBtb3ZsICAgICVlY3gsIGRjb2RlKCVlc3ApCisKKyAgICAgICAgbW92bCAgICAkMSwgJWVheAorICAgICAgICBtb3ZsICAgIGxlbmJpdHNfc3RhdGUoc3RhdGVfciksICVlY3gKKyAgICAgICAgc2hsbCAgICAlY2wsICVlYXgKKyAgICAgICAgZGVjbCAgICAlZWF4CisgICAgICAgIG1vdmwgICAgJWVheCwgbG1hc2soJWVzcCkKKworICAgICAgICBtb3ZsICAgICQxLCAlZWF4CisgICAgICAgIG1vdmwgICAgZGlzdGJpdHNfc3RhdGUoc3RhdGVfciksICVlY3gKKyAgICAgICAgc2hsbCAgICAlY2wsICVlYXgKKyAgICAgICAgZGVjbCAgICAlZWF4CisgICAgICAgIG1vdmwgICAgJWVheCwgZG1hc2soJWVzcCkKKworICAgICAgICBtb3ZsICAgIHdzaXplX3N0YXRlKHN0YXRlX3IpLCAlZWF4CisgICAgICAgIG1vdmwgICAgd3JpdGVfc3RhdGUoc3RhdGVfciksICVlY3gKKyAgICAgICAgbW92bCAgICB3aW5kb3dfc3RhdGUoc3RhdGVfciksICVlZHgKKworICAgICAgICBtb3ZsICAgICVlYXgsIHdzaXplKCVlc3ApCisgICAgICAgIG1vdmwgICAgJWVjeCwgd3JpdGUoJWVzcCkKKyAgICAgICAgbW92bCAgICAlZWR4LCB3aW5kb3coJWVzcCkKKworICAgICAgICBtb3ZsICAgIGhvbGRfc3RhdGUoc3RhdGVfciksICVlYnAKKyAgICAgICAgbW92bCAgICBiaXRzX3N0YXRlKHN0YXRlX3IpLCAlZWJ4CisKKyN1bmRlZiBzdHJtX3IKKyN1bmRlZiBzdGF0ZV9yCisKKyNkZWZpbmUgaW5fciAgICAgICAlZXNpCisjZGVmaW5lIGZyb21fciAgICAgJWVzaQorI2RlZmluZSBvdXRfciAgICAgICVlZGkKKworICAgICAgICBtb3ZsICAgIGluKCVlc3ApLCBpbl9yCisgICAgICAgIG1vdmwgICAgbGFzdCglZXNwKSwgJWVjeAorICAgICAgICBjbXBsICAgIGluX3IsICVlY3gKKyAgICAgICAgamEgICAgICAuTF9hbGlnbl9sb25nICAgICAgICAgICAvKiBpZiBpbiA8IGxhc3QgKi8KKworICAgICAgICBhZGRsICAgICQxMSwgJWVjeCAgICAgICAgICAgICAgIC8qIGVjeCA9ICZpblsgYXZhaWxfaW4gXSAqLworICAgICAgICBzdWJsICAgIGluX3IsICVlY3ggICAgICAgICAgICAgIC8qIGVjeCA9IGF2YWlsX2luICovCisgICAgICAgIG1vdmwgICAgJDEyLCAlZWF4CisgICAgICAgIHN1YmwgICAgJWVjeCwgJWVheCAgICAgICAgICAgICAgLyogZWF4ID0gMTIgLSBhdmFpbF9pbiAqLworICAgICAgICBsZWFsICAgIGJ1ZiglZXNwKSwgJWVkaQorICAgICAgICByZXAgICAgIG1vdnNiICAgICAgICAgICAgICAgICAgIC8qIG1lbWNweSggYnVmLCBpbiwgYXZhaWxfaW4gKSAqLworICAgICAgICBtb3ZsICAgICVlYXgsICVlY3gKKyAgICAgICAgeG9ybCAgICAlZWF4LCAlZWF4CisgICAgICAgIHJlcCAgICAgc3Rvc2IgICAgICAgICAvKiBtZW1zZXQoICZidWZbIGF2YWlsX2luIF0sIDAsIDEyIC0gYXZhaWxfaW4gKSAqLworICAgICAgICBsZWFsICAgIGJ1ZiglZXNwKSwgaW5fciAgICAgICAgIC8qIGluID0gYnVmICovCisgICAgICAgIG1vdmwgICAgaW5fciwgbGFzdCglZXNwKSAgICAgICAgLyogbGFzdCA9IGluLCBkbyBqdXN0IG9uZSBpdGVyYXRpb24gKi8KKyAgICAgICAgam1wICAgICAuTF9pc19hbGlnbmVkCisKKyAgICAgICAgLyogYWxpZ24gaW5fciBvbiBsb25nIGJvdW5kYXJ5ICovCisuTF9hbGlnbl9sb25nOgorICAgICAgICB0ZXN0bCAgICQzLCBpbl9yCisgICAgICAgIGp6ICAgICAgLkxfaXNfYWxpZ25lZAorICAgICAgICB4b3JsICAgICVlYXgsICVlYXgKKyAgICAgICAgbW92YiAgICAoaW5fciksICVhbAorICAgICAgICBpbmNsICAgIGluX3IKKyAgICAgICAgbW92bCAgICAlZWJ4LCAlZWN4CisgICAgICAgIGFkZGwgICAgJDgsICVlYngKKyAgICAgICAgc2hsbCAgICAlY2wsICVlYXgKKyAgICAgICAgb3JsICAgICAlZWF4LCAlZWJwCisgICAgICAgIGptcCAgICAgLkxfYWxpZ25fbG9uZworCisuTF9pc19hbGlnbmVkOgorICAgICAgICBtb3ZsICAgIG91dCglZXNwKSwgb3V0X3IKKworI2lmIGRlZmluZWQoIE5PX01NWCApCisgICAgICAgIGptcCAgICAgLkxfZG9fbG9vcAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKCBVU0VfTU1YICkKKyAgICAgICAgam1wICAgICAuTF9pbml0X21teAorI2VuZGlmCisKKy8qKiogUnVudGltZSBNTVggY2hlY2sgKioqLworCisjaWYgZGVmaW5lZCggUlVOX1RJTUVfTU1YICkKKy5MX2NoZWNrX21teDoKKyAgICAgICAgY21wbCAgICAkRE9fVVNFX01NWCwgaW5mbGF0ZV9mYXN0X3VzZV9tbXgKKyAgICAgICAgamUgICAgICAuTF9pbml0X21teAorICAgICAgICBqYSAgICAgIC5MX2RvX2xvb3AgLyogPiAyICovCisKKyAgICAgICAgcHVzaGwgICAlZWF4CisgICAgICAgIHB1c2hsICAgJWVieAorICAgICAgICBwdXNobCAgICVlY3gKKyAgICAgICAgcHVzaGwgICAlZWR4CisgICAgICAgIHB1c2hmCisgICAgICAgIG1vdmwgICAgKCVlc3ApLCAlZWF4ICAgICAgLyogY29weSBlZmxhZ3MgdG8gZWF4ICovCisgICAgICAgIHhvcmwgICAgJDB4MjAwMDAwLCAoJWVzcCkgLyogdHJ5IHRvZ2dsaW5nIElEIGJpdCBvZiBlZmxhZ3MgKGJpdCAyMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0byBzZWUgaWYgY3B1IHN1cHBvcnRzIGNwdWlkLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSUQgYml0IG1ldGhvZCBub3Qgc3VwcG9ydGVkIGJ5IE5leEdlbiBidXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiaW9zIG1heSBsb2FkIGEgY3B1aWQgaW5zdHJ1Y3Rpb24gYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY3B1aWQgbWF5IGJlIGRpc2FibGVkIG9uIEN5cml4IDUtNng4NiAqLworICAgICAgICBwb3BmCisgICAgICAgIHB1c2hmCisgICAgICAgIHBvcGwgICAgJWVkeCAgICAgICAgICAgICAgLyogY29weSBuZXcgZWZsYWdzIHRvIGVkeCAqLworICAgICAgICB4b3JsICAgICVlYXgsICVlZHggICAgICAgIC8qIHRlc3QgaWYgSUQgYml0IGlzIGZsaXBwZWQgKi8KKyAgICAgICAganogICAgICAuTF9kb250X3VzZV9tbXggICAvKiBub3QgZmxpcHBlZCBpZiB6ZXJvICovCisgICAgICAgIHhvcmwgICAgJWVheCwgJWVheAorICAgICAgICBjcHVpZAorICAgICAgICBjbXBsICAgICQweDc1NmU2NTQ3LCAlZWJ4IC8qIGNoZWNrIGZvciBHZW51aW5lSW50ZWwgaW4gZWJ4LGVjeCxlZHggKi8KKyAgICAgICAgam5lICAgICAuTF9kb250X3VzZV9tbXgKKyAgICAgICAgY21wbCAgICAkMHg2YzY1NzQ2ZSwgJWVjeAorICAgICAgICBqbmUgICAgIC5MX2RvbnRfdXNlX21teAorICAgICAgICBjbXBsICAgICQweDQ5NjU2ZTY5LCAlZWR4CisgICAgICAgIGpuZSAgICAgLkxfZG9udF91c2VfbW14CisgICAgICAgIG1vdmwgICAgJDEsICVlYXgKKyAgICAgICAgY3B1aWQgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgY3B1IGZlYXR1cmVzICovCisgICAgICAgIHNocmwgICAgJDgsICVlYXgKKyAgICAgICAgYW5kbCAgICAkMTUsICVlYXgKKyAgICAgICAgY21wbCAgICAkNiwgJWVheCAgICAgICAgICAvKiBjaGVjayBmb3IgUGVudGl1bSBmYW1pbHksIGlzIDB4ZiBmb3IgUDQgKi8KKyAgICAgICAgam5lICAgICAuTF9kb250X3VzZV9tbXgKKyAgICAgICAgdGVzdGwgICAkMHg4MDAwMDAsICVlZHggICAvKiB0ZXN0IGlmIE1NWCBmZWF0dXJlIGlzIHNldCAoYml0IDIzKSAqLworICAgICAgICBqbnogICAgIC5MX3VzZV9tbXgKKyAgICAgICAgam1wICAgICAuTF9kb250X3VzZV9tbXgKKy5MX3VzZV9tbXg6CisgICAgICAgIG1vdmwgICAgJERPX1VTRV9NTVgsIGluZmxhdGVfZmFzdF91c2VfbW14CisgICAgICAgIGptcCAgICAgLkxfY2hlY2tfbW14X3BvcAorLkxfZG9udF91c2VfbW14OgorICAgICAgICBtb3ZsICAgICRET05UX1VTRV9NTVgsIGluZmxhdGVfZmFzdF91c2VfbW14CisuTF9jaGVja19tbXhfcG9wOgorICAgICAgICBwb3BsICAgICVlZHgKKyAgICAgICAgcG9wbCAgICAlZWN4CisgICAgICAgIHBvcGwgICAgJWVieAorICAgICAgICBwb3BsICAgICVlYXgKKyAgICAgICAgam1wICAgICAuTF9jaGVja19tbXgKKyNlbmRpZgorCisKKy8qKiogTm9uLU1NWCBjb2RlICoqKi8KKworI2lmIGRlZmluZWQgKCBOT19NTVggKSB8fCBkZWZpbmVkKCBSVU5fVElNRV9NTVggKQorCisjZGVmaW5lIGhvbGRfciAgICAgJWVicAorI2RlZmluZSBiaXRzX3IgICAgICVibAorI2RlZmluZSBiaXRzbG9uZ19yICVlYngKKworLmFsaWduIDMyLDB4OTAKKy5MX3doaWxlX3Rlc3Q6CisgICAgICAgIC8qIHdoaWxlIChpbiA8IGxhc3QgJiYgb3V0IDwgZW5kKQorICAgICAgICAgKi8KKyAgICAgICAgY21wbCAgICBvdXRfciwgZW5kKCVlc3ApCisgICAgICAgIGpiZSAgICAgLkxfYnJlYWtfbG9vcCAgICAgICAgICAgLyogaWYgKG91dCA+PSBlbmQpICovCisKKyAgICAgICAgY21wbCAgICBpbl9yLCBsYXN0KCVlc3ApCisgICAgICAgIGpiZSAgICAgLkxfYnJlYWtfbG9vcAorCisuTF9kb19sb29wOgorICAgICAgICAvKiByZWdzOiAlZXNpID0gaW4sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0CisgICAgICAgICAqCisgICAgICAgICAqIGRvIHsKKyAgICAgICAgICogICBpZiAoYml0cyA8IDE1KSB7CisgICAgICAgICAqICAgICBob2xkIHw9ICooKHVuc2lnbmVkIHNob3J0ICopaW4pKysgPDwgYml0czsKKyAgICAgICAgICogICAgIGJpdHMgKz0gMTYKKyAgICAgICAgICogICB9CisgICAgICAgICAqICAgdGhpcyA9IGxjb2RlW2hvbGQgJiBsbWFza10KKyAgICAgICAgICovCisgICAgICAgIGNtcGIgICAgJDE1LCBiaXRzX3IKKyAgICAgICAgamEgICAgICAuTF9nZXRfbGVuZ3RoX2NvZGUgICAgICAvKiBpZiAoMTUgPCBiaXRzKSAqLworCisgICAgICAgIHhvcmwgICAgJWVheCwgJWVheAorICAgICAgICBsb2RzdyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovCisgICAgICAgIG1vdmIgICAgYml0c19yLCAlY2wgICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KKyAgICAgICAgYWRkYiAgICAkMTYsIGJpdHNfciAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovCisgICAgICAgIHNobGwgICAgJWNsLCAlZWF4CisgICAgICAgIG9ybCAgICAgJWVheCwgaG9sZF9yICAgICAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCisKKy5MX2dldF9sZW5ndGhfY29kZToKKyAgICAgICAgbW92bCAgICBsbWFzayglZXNwKSwgJWVkeCAgICAgICAvKiBlZHggPSBsbWFzayAqLworICAgICAgICBtb3ZsICAgIGxjb2RlKCVlc3ApLCAlZWN4ICAgICAgIC8qIGVjeCA9IGxjb2RlICovCisgICAgICAgIGFuZGwgICAgaG9sZF9yLCAlZWR4ICAgICAgICAgICAgLyogZWR4ICY9IGhvbGQgKi8KKyAgICAgICAgbW92bCAgICAoJWVjeCwlZWR4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovCisKKy5MX2RvbGVuOgorICAgICAgICAvKiByZWdzOiAlZXNpID0gaW4sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0CisgICAgICAgICAqCisgICAgICAgICAqIGRvbGVuOgorICAgICAgICAgKiAgICBiaXRzIC09IHRoaXMuYml0czsKKyAgICAgICAgICogICAgaG9sZCA+Pj0gdGhpcy5iaXRzCisgICAgICAgICAqLworICAgICAgICBtb3ZiICAgICVhaCwgJWNsICAgICAgICAgICAgICAgIC8qIGNsID0gdGhpcy5iaXRzICovCisgICAgICAgIHN1YmIgICAgJWFoLCBiaXRzX3IgICAgICAgICAgICAgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8KKyAgICAgICAgc2hybCAgICAlY2wsIGhvbGRfciAgICAgICAgICAgICAvKiBob2xkID4+PSB0aGlzLmJpdHMgKi8KKworICAgICAgICAvKiBjaGVjayBpZiBvcCBpcyBhIGxpdGVyYWwKKyAgICAgICAgICogaWYgKG9wID09IDApIHsKKyAgICAgICAgICogICAgUFVQKG91dCkgPSB0aGlzLnZhbDsKKyAgICAgICAgICogIH0KKyAgICAgICAgICovCisgICAgICAgIHRlc3RiICAgJWFsLCAlYWwKKyAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZSAvKiBpZiAob3AgIT0gMCkgNDUuNyUgKi8KKworICAgICAgICBzaHJsICAgICQxNiwgJWVheCAgICAgICAgICAgICAgIC8qIG91dHB1dCB0aGlzLnZhbCBjaGFyICovCisgICAgICAgIHN0b3NiCisgICAgICAgIGptcCAgICAgLkxfd2hpbGVfdGVzdAorCisuTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZToKKyAgICAgICAgLyogcmVnczogJWVzaSA9IGluLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dCwgJWVkeCA9IGxlbgorICAgICAgICAgKgorICAgICAgICAgKiBlbHNlIGlmIChvcCAmIDE2KSB7CisgICAgICAgICAqICAgbGVuID0gdGhpcy52YWwKKyAgICAgICAgICogICBvcCAmPSAxNQorICAgICAgICAgKiAgIGlmIChvcCkgeworICAgICAgICAgKiAgICAgaWYgKG9wID4gYml0cykgeworICAgICAgICAgKiAgICAgICBob2xkIHw9ICooKHVuc2lnbmVkIHNob3J0ICopaW4pKysgPDwgYml0czsKKyAgICAgICAgICogICAgICAgYml0cyArPSAxNgorICAgICAgICAgKiAgICAgfQorICAgICAgICAgKiAgICAgbGVuICs9IGhvbGQgJiBtYXNrW29wXTsKKyAgICAgICAgICogICAgIGJpdHMgLT0gb3A7CisgICAgICAgICAqICAgICBob2xkID4+PSBvcDsKKyAgICAgICAgICogICB9CisgICAgICAgICAqLworI2RlZmluZSBsZW5fciAlZWR4CisgICAgICAgIG1vdmwgICAgJWVheCwgbGVuX3IgICAgICAgICAgICAgLyogbGVuID0gdGhpcyAqLworICAgICAgICBzaHJsICAgICQxNiwgbGVuX3IgICAgICAgICAgICAgIC8qIGxlbiA9IHRoaXMudmFsICovCisgICAgICAgIG1vdmIgICAgJWFsLCAlY2wKKworICAgICAgICB0ZXN0YiAgICQxNiwgJWFsCisgICAgICAgIGp6ICAgICAgLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aCAvKiBpZiAoKG9wICYgMTYpID09IDApIDglICovCisgICAgICAgIGFuZGIgICAgJDE1LCAlY2wgICAgICAgICAgICAgICAgLyogb3AgJj0gMTUgKi8KKyAgICAgICAganogICAgICAuTF9zYXZlX2xlbiAgICAgICAgICAgICAvKiBpZiAoIW9wKSAqLworICAgICAgICBjbXBiICAgICVjbCwgYml0c19yCisgICAgICAgIGphZSAgICAgLkxfYWRkX2JpdHNfdG9fbGVuICAgICAgLyogaWYgKG9wIDw9IGJpdHMpICovCisKKyAgICAgICAgbW92YiAgICAlY2wsICVjaCAgICAgICAgICAgICAgICAvKiBzdGFzaCBvcCBpbiBjaCwgZnJlZWluZyBjbCAqLworICAgICAgICB4b3JsICAgICVlYXgsICVlYXgKKyAgICAgICAgbG9kc3cgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLworICAgICAgICBtb3ZiICAgIGJpdHNfciwgJWNsICAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovCisgICAgICAgIGFkZGIgICAgJDE2LCBiaXRzX3IgICAgICAgICAgICAgLyogYml0cyArPSAxNiAqLworICAgICAgICBzaGxsICAgICVjbCwgJWVheAorICAgICAgICBvcmwgICAgICVlYXgsIGhvbGRfciAgICAgICAgICAgIC8qIGhvbGQgfD0gKigodXNob3J0ICopaW4pKysgPDwgYml0cyAqLworICAgICAgICBtb3ZiICAgICVjaCwgJWNsICAgICAgICAgICAgICAgIC8qIG1vdmUgb3AgYmFjayB0byBlY3ggKi8KKworLkxfYWRkX2JpdHNfdG9fbGVuOgorICAgICAgICBtb3ZsICAgICQxLCAlZWF4CisgICAgICAgIHNobGwgICAgJWNsLCAlZWF4CisgICAgICAgIGRlY2wgICAgJWVheAorICAgICAgICBzdWJiICAgICVjbCwgYml0c19yCisgICAgICAgIGFuZGwgICAgaG9sZF9yLCAlZWF4ICAgICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KKyAgICAgICAgc2hybCAgICAlY2wsIGhvbGRfcgorICAgICAgICBhZGRsICAgICVlYXgsIGxlbl9yICAgICAgICAgICAgIC8qIGxlbiArPSBob2xkICYgbWFza1tvcF0gKi8KKworLkxfc2F2ZV9sZW46CisgICAgICAgIG1vdmwgICAgbGVuX3IsIGxlbiglZXNwKSAgICAgICAgLyogc2F2ZSBsZW4gKi8KKyN1bmRlZiAgbGVuX3IKKworLkxfZGVjb2RlX2Rpc3RhbmNlOgorICAgICAgICAvKiByZWdzOiAlZXNpID0gaW4sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0LCAlZWR4ID0gZGlzdAorICAgICAgICAgKgorICAgICAgICAgKiAgIGlmIChiaXRzIDwgMTUpIHsKKyAgICAgICAgICogICAgIGhvbGQgfD0gKigodW5zaWduZWQgc2hvcnQgKilpbikrKyA8PCBiaXRzOworICAgICAgICAgKiAgICAgYml0cyArPSAxNgorICAgICAgICAgKiAgIH0KKyAgICAgICAgICogICB0aGlzID0gZGNvZGVbaG9sZCAmIGRtYXNrXTsKKyAgICAgICAgICogZG9kaXN0OgorICAgICAgICAgKiAgIGJpdHMgLT0gdGhpcy5iaXRzOworICAgICAgICAgKiAgIGhvbGQgPj49IHRoaXMuYml0czsKKyAgICAgICAgICogICBvcCA9IHRoaXMub3A7CisgICAgICAgICAqLworCisgICAgICAgIGNtcGIgICAgJDE1LCBiaXRzX3IKKyAgICAgICAgamEgICAgICAuTF9nZXRfZGlzdGFuY2VfY29kZSAgICAvKiBpZiAoMTUgPCBiaXRzKSAqLworCisgICAgICAgIHhvcmwgICAgJWVheCwgJWVheAorICAgICAgICBsb2RzdyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovCisgICAgICAgIG1vdmIgICAgYml0c19yLCAlY2wgICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KKyAgICAgICAgYWRkYiAgICAkMTYsIGJpdHNfciAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovCisgICAgICAgIHNobGwgICAgJWNsLCAlZWF4CisgICAgICAgIG9ybCAgICAgJWVheCwgaG9sZF9yICAgICAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCisKKy5MX2dldF9kaXN0YW5jZV9jb2RlOgorICAgICAgICBtb3ZsICAgIGRtYXNrKCVlc3ApLCAlZWR4ICAgICAgIC8qIGVkeCA9IGRtYXNrICovCisgICAgICAgIG1vdmwgICAgZGNvZGUoJWVzcCksICVlY3ggICAgICAgLyogZWN4ID0gZGNvZGUgKi8KKyAgICAgICAgYW5kbCAgICBob2xkX3IsICVlZHggICAgICAgICAgICAvKiBlZHggJj0gaG9sZCAqLworICAgICAgICBtb3ZsICAgICglZWN4LCVlZHgsNCksICVlYXggICAgIC8qIGVheCA9IGRjb2RlW2hvbGQgJiBkbWFza10gKi8KKworI2RlZmluZSBkaXN0X3IgJWVkeAorLkxfZG9kaXN0OgorICAgICAgICBtb3ZsICAgICVlYXgsIGRpc3RfciAgICAgICAgICAgIC8qIGRpc3QgPSB0aGlzICovCisgICAgICAgIHNocmwgICAgJDE2LCBkaXN0X3IgICAgICAgICAgICAgLyogZGlzdCA9IHRoaXMudmFsICovCisgICAgICAgIG1vdmIgICAgJWFoLCAlY2wKKyAgICAgICAgc3ViYiAgICAlYWgsIGJpdHNfciAgICAgICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLworICAgICAgICBzaHJsICAgICVjbCwgaG9sZF9yICAgICAgICAgICAgIC8qIGhvbGQgPj49IHRoaXMuYml0cyAqLworCisgICAgICAgIC8qIGlmIChvcCAmIDE2KSB7CisgICAgICAgICAqICAgZGlzdCA9IHRoaXMudmFsCisgICAgICAgICAqICAgb3AgJj0gMTUKKyAgICAgICAgICogICBpZiAob3AgPiBiaXRzKSB7CisgICAgICAgICAqICAgICBob2xkIHw9ICooKHVuc2lnbmVkIHNob3J0ICopaW4pKysgPDwgYml0czsKKyAgICAgICAgICogICAgIGJpdHMgKz0gMTYKKyAgICAgICAgICogICB9CisgICAgICAgICAqICAgZGlzdCArPSBob2xkICYgbWFza1tvcF07CisgICAgICAgICAqICAgYml0cyAtPSBvcDsKKyAgICAgICAgICogICBob2xkID4+PSBvcDsKKyAgICAgICAgICovCisgICAgICAgIG1vdmIgICAgJWFsLCAlY2wgICAgICAgICAgICAgICAgLyogY2wgPSB0aGlzLm9wICovCisKKyAgICAgICAgdGVzdGIgICAkMTYsICVhbCAgICAgICAgICAgICAgICAvKiBpZiAoKG9wICYgMTYpID09IDApICovCisgICAgICAgIGp6ICAgICAgLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3QKKyAgICAgICAgYW5kYiAgICAkMTUsICVjbCAgICAgICAgICAgICAgICAvKiBvcCAmPSAxNSAqLworICAgICAgICBqeiAgICAgIC5MX2NoZWNrX2Rpc3Rfb25lCisgICAgICAgIGNtcGIgICAgJWNsLCBiaXRzX3IKKyAgICAgICAgamFlICAgICAuTF9hZGRfYml0c190b19kaXN0ICAgICAvKiBpZiAob3AgPD0gYml0cykgOTcuNiUgKi8KKworICAgICAgICBtb3ZiICAgICVjbCwgJWNoICAgICAgICAgICAgICAgIC8qIHN0YXNoIG9wIGluIGNoLCBmcmVlaW5nIGNsICovCisgICAgICAgIHhvcmwgICAgJWVheCwgJWVheAorICAgICAgICBsb2RzdyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovCisgICAgICAgIG1vdmIgICAgYml0c19yLCAlY2wgICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KKyAgICAgICAgYWRkYiAgICAkMTYsIGJpdHNfciAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovCisgICAgICAgIHNobGwgICAgJWNsLCAlZWF4CisgICAgICAgIG9ybCAgICAgJWVheCwgaG9sZF9yICAgICAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCisgICAgICAgIG1vdmIgICAgJWNoLCAlY2wgICAgICAgICAgICAgICAgLyogbW92ZSBvcCBiYWNrIHRvIGVjeCAqLworCisuTF9hZGRfYml0c190b19kaXN0OgorICAgICAgICBtb3ZsICAgICQxLCAlZWF4CisgICAgICAgIHNobGwgICAgJWNsLCAlZWF4CisgICAgICAgIGRlY2wgICAgJWVheCAgICAgICAgICAgICAgICAgICAgLyogKDEgPDwgb3ApIC0gMSAqLworICAgICAgICBzdWJiICAgICVjbCwgYml0c19yCisgICAgICAgIGFuZGwgICAgaG9sZF9yLCAlZWF4ICAgICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KKyAgICAgICAgc2hybCAgICAlY2wsIGhvbGRfcgorICAgICAgICBhZGRsICAgICVlYXgsIGRpc3RfciAgICAgICAgICAgIC8qIGRpc3QgKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKSAqLworICAgICAgICBqbXAgICAgIC5MX2NoZWNrX3dpbmRvdworCisuTF9jaGVja193aW5kb3c6CisgICAgICAgIC8qIHJlZ3M6ICVlc2kgPSBmcm9tLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dCwgJWVkeCA9IGRpc3QKKyAgICAgICAgICogICAgICAgJWVjeCA9IG5ieXRlcworICAgICAgICAgKgorICAgICAgICAgKiBuYnl0ZXMgPSBvdXQgLSBiZWc7CisgICAgICAgICAqIGlmIChkaXN0IDw9IG5ieXRlcykgeworICAgICAgICAgKiAgIGZyb20gPSBvdXQgLSBkaXN0OworICAgICAgICAgKiAgIGRvIHsKKyAgICAgICAgICogICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgKiAgIH0gd2hpbGUgKC0tbGVuID4gMCkgeworICAgICAgICAgKiB9CisgICAgICAgICAqLworCisgICAgICAgIG1vdmwgICAgaW5fciwgaW4oJWVzcCkgICAgICAgICAgLyogc2F2ZSBpbiBzbyBmcm9tIGNhbiB1c2UgaXQncyByZWcgKi8KKyAgICAgICAgbW92bCAgICBvdXRfciwgJWVheAorICAgICAgICBzdWJsICAgIGJlZyglZXNwKSwgJWVheCAgICAgICAgIC8qIG5ieXRlcyA9IG91dCAtIGJlZyAqLworCisgICAgICAgIGNtcGwgICAgZGlzdF9yLCAlZWF4CisgICAgICAgIGpiICAgICAgLkxfY2xpcF93aW5kb3cgICAgICAgICAgLyogaWYgKGRpc3QgPiBuYnl0ZXMpIDQuMiUgKi8KKworICAgICAgICBtb3ZsICAgIGxlbiglZXNwKSwgJWVjeAorICAgICAgICBtb3ZsICAgIG91dF9yLCBmcm9tX3IKKyAgICAgICAgc3VibCAgICBkaXN0X3IsIGZyb21fciAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLworCisgICAgICAgIHN1YmwgICAgJDMsICVlY3gKKyAgICAgICAgbW92YiAgICAoZnJvbV9yKSwgJWFsCisgICAgICAgIG1vdmIgICAgJWFsLCAob3V0X3IpCisgICAgICAgIG1vdmIgICAgMShmcm9tX3IpLCAlYWwKKyAgICAgICAgbW92YiAgICAyKGZyb21fciksICVkbAorICAgICAgICBhZGRsICAgICQzLCBmcm9tX3IKKyAgICAgICAgbW92YiAgICAlYWwsIDEob3V0X3IpCisgICAgICAgIG1vdmIgICAgJWRsLCAyKG91dF9yKQorICAgICAgICBhZGRsICAgICQzLCBvdXRfcgorICAgICAgICByZXAgICAgIG1vdnNiCisKKyAgICAgICAgbW92bCAgICBpbiglZXNwKSwgaW5fciAgICAgICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovCisgICAgICAgIGptcCAgICAgLkxfd2hpbGVfdGVzdAorCisuYWxpZ24gMTYsMHg5MAorLkxfY2hlY2tfZGlzdF9vbmU6CisgICAgICAgIGNtcGwgICAgJDEsIGRpc3RfcgorICAgICAgICBqbmUgICAgIC5MX2NoZWNrX3dpbmRvdworICAgICAgICBjbXBsICAgIG91dF9yLCBiZWcoJWVzcCkKKyAgICAgICAgamUgICAgICAuTF9jaGVja193aW5kb3cKKworICAgICAgICBkZWNsICAgIG91dF9yCisgICAgICAgIG1vdmwgICAgbGVuKCVlc3ApLCAlZWN4CisgICAgICAgIG1vdmIgICAgKG91dF9yKSwgJWFsCisgICAgICAgIHN1YmwgICAgJDMsICVlY3gKKworICAgICAgICBtb3ZiICAgICVhbCwgMShvdXRfcikKKyAgICAgICAgbW92YiAgICAlYWwsIDIob3V0X3IpCisgICAgICAgIG1vdmIgICAgJWFsLCAzKG91dF9yKQorICAgICAgICBhZGRsICAgICQ0LCBvdXRfcgorICAgICAgICByZXAgICAgIHN0b3NiCisKKyAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0CisKKy5hbGlnbiAxNiwweDkwCisuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoOgorICAgICAgICAvKiBlbHNlIGlmICgob3AgJiA2NCkgPT0gMCkgeworICAgICAgICAgKiAgIHRoaXMgPSBsY29kZVt0aGlzLnZhbCArIChob2xkICYgbWFza1tvcF0pXTsKKyAgICAgICAgICogfQorICAgICAgICAgKi8KKyAgICAgICAgdGVzdGIgICAkNjQsICVhbAorICAgICAgICBqbnogICAgIC5MX3Rlc3RfZm9yX2VuZF9vZl9ibG9jayAgLyogaWYgKChvcCAmIDY0KSAhPSAwKSAqLworCisgICAgICAgIG1vdmwgICAgJDEsICVlYXgKKyAgICAgICAgc2hsbCAgICAlY2wsICVlYXgKKyAgICAgICAgZGVjbCAgICAlZWF4CisgICAgICAgIGFuZGwgICAgaG9sZF9yLCAlZWF4ICAgICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KKyAgICAgICAgYWRkbCAgICAlZWR4LCAlZWF4ICAgICAgICAgICAgICAvKiBlYXggKz0gdGhpcy52YWwgKi8KKyAgICAgICAgbW92bCAgICBsY29kZSglZXNwKSwgJWVkeCAgICAgICAvKiBlZHggPSBsY29kZSAqLworICAgICAgICBtb3ZsICAgICglZWR4LCVlYXgsNCksICVlYXggICAgIC8qIGVheCA9IGxjb2RlW3ZhbCArIChob2xkJm1hc2tbb3BdKV0gKi8KKyAgICAgICAgam1wICAgICAuTF9kb2xlbgorCisuYWxpZ24gMTYsMHg5MAorLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3Q6CisgICAgICAgIC8qIGVsc2UgaWYgKChvcCAmIDY0KSA9PSAwKSB7CisgICAgICAgICAqICAgdGhpcyA9IGRjb2RlW3RoaXMudmFsICsgKGhvbGQgJiBtYXNrW29wXSldOworICAgICAgICAgKiB9CisgICAgICAgICAqLworICAgICAgICB0ZXN0YiAgICQ2NCwgJWFsCisgICAgICAgIGpueiAgICAgLkxfaW52YWxpZF9kaXN0YW5jZV9jb2RlICAvKiBpZiAoKG9wICYgNjQpICE9IDApICovCisKKyAgICAgICAgbW92bCAgICAkMSwgJWVheAorICAgICAgICBzaGxsICAgICVjbCwgJWVheAorICAgICAgICBkZWNsICAgICVlYXgKKyAgICAgICAgYW5kbCAgICBob2xkX3IsICVlYXggICAgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLworICAgICAgICBhZGRsICAgICVlZHgsICVlYXggICAgICAgICAgICAgIC8qIGVheCArPSB0aGlzLnZhbCAqLworICAgICAgICBtb3ZsICAgIGRjb2RlKCVlc3ApLCAlZWR4ICAgICAgIC8qIGVkeCA9IGRjb2RlICovCisgICAgICAgIG1vdmwgICAgKCVlZHgsJWVheCw0KSwgJWVheCAgICAgLyogZWF4ID0gZGNvZGVbdmFsICsgKGhvbGQmbWFza1tvcF0pXSAqLworICAgICAgICBqbXAgICAgIC5MX2RvZGlzdAorCisuYWxpZ24gMTYsMHg5MAorLkxfY2xpcF93aW5kb3c6CisgICAgICAgIC8qIHJlZ3M6ICVlc2kgPSBmcm9tLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dCwgJWVkeCA9IGRpc3QKKyAgICAgICAgICogICAgICAgJWVjeCA9IG5ieXRlcworICAgICAgICAgKgorICAgICAgICAgKiBlbHNlIHsKKyAgICAgICAgICogICBpZiAoZGlzdCA+IHdzaXplKSB7CisgICAgICAgICAqICAgICBpbnZhbGlkIGRpc3RhbmNlCisgICAgICAgICAqICAgfQorICAgICAgICAgKiAgIGZyb20gPSB3aW5kb3c7CisgICAgICAgICAqICAgbmJ5dGVzID0gZGlzdCAtIG5ieXRlczsKKyAgICAgICAgICogICBpZiAod3JpdGUgPT0gMCkgeworICAgICAgICAgKiAgICAgZnJvbSArPSB3c2l6ZSAtIG5ieXRlczsKKyAgICAgICAgICovCisjZGVmaW5lIG5ieXRlc19yICVlY3gKKyAgICAgICAgbW92bCAgICAlZWF4LCBuYnl0ZXNfcgorICAgICAgICBtb3ZsICAgIHdzaXplKCVlc3ApLCAlZWF4ICAgICAgIC8qIHByZXBhcmUgZm9yIGRpc3QgY29tcGFyZSAqLworICAgICAgICBuZWdsICAgIG5ieXRlc19yICAgICAgICAgICAgICAgIC8qIG5ieXRlcyA9IC1uYnl0ZXMgKi8KKyAgICAgICAgbW92bCAgICB3aW5kb3coJWVzcCksIGZyb21fciAgICAvKiBmcm9tID0gd2luZG93ICovCisKKyAgICAgICAgY21wbCAgICBkaXN0X3IsICVlYXgKKyAgICAgICAgamIgICAgICAuTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXIgLyogaWYgKGRpc3QgPiB3c2l6ZSkgKi8KKworICAgICAgICBhZGRsICAgIGRpc3RfciwgbmJ5dGVzX3IgICAgICAgIC8qIG5ieXRlcyA9IGRpc3QgLSBuYnl0ZXMgKi8KKyAgICAgICAgY21wbCAgICAkMCwgd3JpdGUoJWVzcCkKKyAgICAgICAgam5lICAgICAuTF93cmFwX2Fyb3VuZF93aW5kb3cgICAvKiBpZiAod3JpdGUgIT0gMCkgKi8KKworICAgICAgICBzdWJsICAgIG5ieXRlc19yLCAlZWF4CisgICAgICAgIGFkZGwgICAgJWVheCwgZnJvbV9yICAgICAgICAgICAgLyogZnJvbSArPSB3c2l6ZSAtIG5ieXRlcyAqLworCisgICAgICAgIC8qIHJlZ3M6ICVlc2kgPSBmcm9tLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dCwgJWVkeCA9IGRpc3QKKyAgICAgICAgICogICAgICAgJWVjeCA9IG5ieXRlcywgJWVheCA9IGxlbgorICAgICAgICAgKgorICAgICAgICAgKiAgICAgaWYgKG5ieXRlcyA8IGxlbikgeworICAgICAgICAgKiAgICAgICBsZW4gLT0gbmJ5dGVzOworICAgICAgICAgKiAgICAgICBkbyB7CisgICAgICAgICAqICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAqICAgICAgIH0gd2hpbGUgKC0tbmJ5dGVzKTsKKyAgICAgICAgICogICAgICAgZnJvbSA9IG91dCAtIGRpc3Q7CisgICAgICAgICAqICAgICB9CisgICAgICAgICAqICAgfQorICAgICAgICAgKi8KKyNkZWZpbmUgbGVuX3IgJWVheAorICAgICAgICBtb3ZsICAgIGxlbiglZXNwKSwgbGVuX3IKKyAgICAgICAgY21wbCAgICBuYnl0ZXNfciwgbGVuX3IKKyAgICAgICAgamJlICAgICAuTF9kb19jb3B5MSAgICAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KKworICAgICAgICBzdWJsICAgIG5ieXRlc19yLCBsZW5fciAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KKyAgICAgICAgcmVwICAgICBtb3ZzYgorICAgICAgICBtb3ZsICAgIG91dF9yLCBmcm9tX3IKKyAgICAgICAgc3VibCAgICBkaXN0X3IsIGZyb21fciAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLworICAgICAgICBqbXAgICAgIC5MX2RvX2NvcHkxCisKKyAgICAgICAgY21wbCAgICBuYnl0ZXNfciwgbGVuX3IKKyAgICAgICAgamJlICAgICAuTF9kb19jb3B5MSAgICAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KKworICAgICAgICBzdWJsICAgIG5ieXRlc19yLCBsZW5fciAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KKyAgICAgICAgcmVwICAgICBtb3ZzYgorICAgICAgICBtb3ZsICAgIG91dF9yLCBmcm9tX3IKKyAgICAgICAgc3VibCAgICBkaXN0X3IsIGZyb21fciAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLworICAgICAgICBqbXAgICAgIC5MX2RvX2NvcHkxCisKKy5MX3dyYXBfYXJvdW5kX3dpbmRvdzoKKyAgICAgICAgLyogcmVnczogJWVzaSA9IGZyb20sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0LCAlZWR4ID0gZGlzdAorICAgICAgICAgKiAgICAgICAlZWN4ID0gbmJ5dGVzLCAlZWF4ID0gd3JpdGUsICVlYXggPSBsZW4KKyAgICAgICAgICoKKyAgICAgICAgICogICBlbHNlIGlmICh3cml0ZSA8IG5ieXRlcykgeworICAgICAgICAgKiAgICAgZnJvbSArPSB3c2l6ZSArIHdyaXRlIC0gbmJ5dGVzOworICAgICAgICAgKiAgICAgbmJ5dGVzIC09IHdyaXRlOworICAgICAgICAgKiAgICAgaWYgKG5ieXRlcyA8IGxlbikgeworICAgICAgICAgKiAgICAgICBsZW4gLT0gbmJ5dGVzOworICAgICAgICAgKiAgICAgICBkbyB7CisgICAgICAgICAqICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAqICAgICAgIH0gd2hpbGUgKC0tbmJ5dGVzKTsKKyAgICAgICAgICogICAgICAgZnJvbSA9IHdpbmRvdzsKKyAgICAgICAgICogICAgICAgbmJ5dGVzID0gd3JpdGU7CisgICAgICAgICAqICAgICAgIGlmIChuYnl0ZXMgPCBsZW4pIHsKKyAgICAgICAgICogICAgICAgICBsZW4gLT0gbmJ5dGVzOworICAgICAgICAgKiAgICAgICAgIGRvIHsKKyAgICAgICAgICogICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgKiAgICAgICAgIH0gd2hpbGUoLS1uYnl0ZXMpOworICAgICAgICAgKiAgICAgICAgIGZyb20gPSBvdXQgLSBkaXN0OworICAgICAgICAgKiAgICAgICB9CisgICAgICAgICAqICAgICB9CisgICAgICAgICAqICAgfQorICAgICAgICAgKi8KKyNkZWZpbmUgd3JpdGVfciAlZWF4CisgICAgICAgIG1vdmwgICAgd3JpdGUoJWVzcCksIHdyaXRlX3IKKyAgICAgICAgY21wbCAgICB3cml0ZV9yLCBuYnl0ZXNfcgorICAgICAgICBqYmUgICAgIC5MX2NvbnRpZ3VvdXNfaW5fd2luZG93IC8qIGlmICh3cml0ZSA+PSBuYnl0ZXMpICovCisKKyAgICAgICAgYWRkbCAgICB3c2l6ZSglZXNwKSwgZnJvbV9yCisgICAgICAgIGFkZGwgICAgd3JpdGVfciwgZnJvbV9yCisgICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGZyb21fciAgICAgICAgLyogZnJvbSArPSB3c2l6ZSArIHdyaXRlIC0gbmJ5dGVzICovCisgICAgICAgIHN1YmwgICAgd3JpdGVfciwgbmJ5dGVzX3IgICAgICAgLyogbmJ5dGVzIC09IHdyaXRlICovCisjdW5kZWYgd3JpdGVfcgorCisgICAgICAgIG1vdmwgICAgbGVuKCVlc3ApLCBsZW5fcgorICAgICAgICBjbXBsICAgIG5ieXRlc19yLCBsZW5fcgorICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxICAgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLworCisgICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGxlbl9yICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworICAgICAgICByZXAgICAgIG1vdnNiCisgICAgICAgIG1vdmwgICAgd2luZG93KCVlc3ApLCBmcm9tX3IgICAgLyogZnJvbSA9IHdpbmRvdyAqLworICAgICAgICBtb3ZsICAgIHdyaXRlKCVlc3ApLCBuYnl0ZXNfciAgIC8qIG5ieXRlcyA9IHdyaXRlICovCisgICAgICAgIGNtcGwgICAgbmJ5dGVzX3IsIGxlbl9yCisgICAgICAgIGpiZSAgICAgLkxfZG9fY29weTEgICAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCisKKyAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgbGVuX3IgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCisgICAgICAgIHJlcCAgICAgbW92c2IKKyAgICAgICAgbW92bCAgICBvdXRfciwgZnJvbV9yCisgICAgICAgIHN1YmwgICAgZGlzdF9yLCBmcm9tX3IgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKyAgICAgICAgam1wICAgICAuTF9kb19jb3B5MQorCisuTF9jb250aWd1b3VzX2luX3dpbmRvdzoKKyAgICAgICAgLyogcmVnczogJWVzaSA9IGZyb20sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0LCAlZWR4ID0gZGlzdAorICAgICAgICAgKiAgICAgICAlZWN4ID0gbmJ5dGVzLCAlZWF4ID0gd3JpdGUsICVlYXggPSBsZW4KKyAgICAgICAgICoKKyAgICAgICAgICogICBlbHNlIHsKKyAgICAgICAgICogICAgIGZyb20gKz0gd3JpdGUgLSBuYnl0ZXM7CisgICAgICAgICAqICAgICBpZiAobmJ5dGVzIDwgbGVuKSB7CisgICAgICAgICAqICAgICAgIGxlbiAtPSBuYnl0ZXM7CisgICAgICAgICAqICAgICAgIGRvIHsKKyAgICAgICAgICogICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICogICAgICAgfSB3aGlsZSAoLS1uYnl0ZXMpOworICAgICAgICAgKiAgICAgICBmcm9tID0gb3V0IC0gZGlzdDsKKyAgICAgICAgICogICAgIH0KKyAgICAgICAgICogICB9CisgICAgICAgICAqLworI2RlZmluZSB3cml0ZV9yICVlYXgKKyAgICAgICAgYWRkbCAgICB3cml0ZV9yLCBmcm9tX3IKKyAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgZnJvbV9yICAgICAgICAvKiBmcm9tICs9IHdyaXRlIC0gbmJ5dGVzICovCisjdW5kZWYgd3JpdGVfcgorCisgICAgICAgIG1vdmwgICAgbGVuKCVlc3ApLCBsZW5fcgorICAgICAgICBjbXBsICAgIG5ieXRlc19yLCBsZW5fcgorICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxICAgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLworCisgICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGxlbl9yICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworICAgICAgICByZXAgICAgIG1vdnNiCisgICAgICAgIG1vdmwgICAgb3V0X3IsIGZyb21fcgorICAgICAgICBzdWJsICAgIGRpc3RfciwgZnJvbV9yICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCisKKy5MX2RvX2NvcHkxOgorICAgICAgICAvKiByZWdzOiAlZXNpID0gZnJvbSwgJWVzaSA9IGluLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dAorICAgICAgICAgKiAgICAgICAlZWF4ID0gbGVuCisgICAgICAgICAqCisgICAgICAgICAqICAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICAgKiAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICogICAgICAgbGVuLS07CisgICAgICAgICAqICAgICB9CisgICAgICAgICAqICAgfQorICAgICAgICAgKiB9IHdoaWxlIChpbiA8IGxhc3QgJiYgb3V0IDwgZW5kKTsKKyAgICAgICAgICovCisjdW5kZWYgbmJ5dGVzX3IKKyNkZWZpbmUgaW5fciAlZXNpCisgICAgICAgIG1vdmwgICAgbGVuX3IsICVlY3gKKyAgICAgICAgcmVwICAgICBtb3ZzYgorCisgICAgICAgIG1vdmwgICAgaW4oJWVzcCksIGluX3IgICAgICAgICAgLyogbW92ZSBpbiBiYWNrIHRvICVlc2ksIHRvc3MgZnJvbSAqLworICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3QKKworI3VuZGVmIGxlbl9yCisjdW5kZWYgZGlzdF9yCisKKyNlbmRpZiAvKiBOT19NTVggfHwgUlVOX1RJTUVfTU1YICovCisKKworLyoqKiBNTVggY29kZSAqKiovCisKKyNpZiBkZWZpbmVkKCBVU0VfTU1YICkgfHwgZGVmaW5lZCggUlVOX1RJTUVfTU1YICkKKworLmFsaWduIDMyLDB4OTAKKy5MX2luaXRfbW14OgorICAgICAgICBlbW1zCisKKyN1bmRlZiAgYml0c19yCisjdW5kZWYgIGJpdHNsb25nX3IKKyNkZWZpbmUgYml0c2xvbmdfciAlZWJwCisjZGVmaW5lIGhvbGRfbW0gICAgJW1tMAorICAgICAgICBtb3ZkICAgICVlYnAsIGhvbGRfbW0KKyAgICAgICAgbW92bCAgICAlZWJ4LCBiaXRzbG9uZ19yCisKKyNkZWZpbmUgdXNlZF9tbSAgICVtbTEKKyNkZWZpbmUgZG1hc2syX21tICVtbTIKKyNkZWZpbmUgbG1hc2syX21tICVtbTMKKyNkZWZpbmUgbG1hc2tfbW0gICVtbTQKKyNkZWZpbmUgZG1hc2tfbW0gICVtbTUKKyNkZWZpbmUgdG1wX21tICAgICVtbTYKKworICAgICAgICBtb3ZkICAgIGxtYXNrKCVlc3ApLCBsbWFza19tbQorICAgICAgICBtb3ZxICAgIGxtYXNrX21tLCBsbWFzazJfbW0KKyAgICAgICAgbW92ZCAgICBkbWFzayglZXNwKSwgZG1hc2tfbW0KKyAgICAgICAgbW92cSAgICBkbWFza19tbSwgZG1hc2syX21tCisgICAgICAgIHB4b3IgICAgdXNlZF9tbSwgdXNlZF9tbQorICAgICAgICBtb3ZsICAgIGxjb2RlKCVlc3ApLCAlZWJ4ICAgICAgIC8qIGVieCA9IGxjb2RlICovCisgICAgICAgIGptcCAgICAgLkxfZG9fbG9vcF9tbXgKKworLmFsaWduIDMyLDB4OTAKKy5MX3doaWxlX3Rlc3RfbW14OgorICAgICAgICAvKiB3aGlsZSAoaW4gPCBsYXN0ICYmIG91dCA8IGVuZCkKKyAgICAgICAgICovCisgICAgICAgIGNtcGwgICAgb3V0X3IsIGVuZCglZXNwKQorICAgICAgICBqYmUgICAgIC5MX2JyZWFrX2xvb3AgICAgICAgICAgIC8qIGlmIChvdXQgPj0gZW5kKSAqLworCisgICAgICAgIGNtcGwgICAgaW5fciwgbGFzdCglZXNwKQorICAgICAgICBqYmUgICAgIC5MX2JyZWFrX2xvb3AKKworLkxfZG9fbG9vcF9tbXg6CisgICAgICAgIHBzcmxxICAgdXNlZF9tbSwgaG9sZF9tbSAgICAgICAgLyogaG9sZF9tbSA+Pj0gbGFzdCBiaXQgbGVuZ3RoICovCisKKyAgICAgICAgY21wbCAgICAkMzIsIGJpdHNsb25nX3IKKyAgICAgICAgamEgICAgICAuTF9nZXRfbGVuZ3RoX2NvZGVfbW14ICAvKiBpZiAoMzIgPCBiaXRzKSAqLworCisgICAgICAgIG1vdmQgICAgYml0c2xvbmdfciwgdG1wX21tCisgICAgICAgIG1vdmQgICAgKGluX3IpLCAlbW03CisgICAgICAgIGFkZGwgICAgJDQsIGluX3IKKyAgICAgICAgcHNsbHEgICB0bXBfbW0sICVtbTcKKyAgICAgICAgYWRkbCAgICAkMzIsIGJpdHNsb25nX3IKKyAgICAgICAgcG9yICAgICAlbW03LCBob2xkX21tICAgICAgICAgICAvKiBob2xkX21tIHw9ICooKHVpbnQgKilpbikrKyA8PCBiaXRzICovCisKKy5MX2dldF9sZW5ndGhfY29kZV9tbXg6CisgICAgICAgIHBhbmQgICAgaG9sZF9tbSwgbG1hc2tfbW0KKyAgICAgICAgbW92ZCAgICBsbWFza19tbSwgJWVheAorICAgICAgICBtb3ZxICAgIGxtYXNrMl9tbSwgbG1hc2tfbW0KKyAgICAgICAgbW92bCAgICAoJWVieCwlZWF4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovCisKKy5MX2RvbGVuX21teDoKKyAgICAgICAgbW92emJsICAlYWgsICVlY3ggICAgICAgICAgICAgICAvKiBlY3ggPSB0aGlzLmJpdHMgKi8KKyAgICAgICAgbW92ZCAgICAlZWN4LCB1c2VkX21tCisgICAgICAgIHN1YmwgICAgJWVjeCwgYml0c2xvbmdfciAgICAgICAgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8KKworICAgICAgICB0ZXN0YiAgICVhbCwgJWFsCisgICAgICAgIGpueiAgICAgLkxfdGVzdF9mb3JfbGVuZ3RoX2Jhc2VfbW14IC8qIGlmIChvcCAhPSAwKSA0NS43JSAqLworCisgICAgICAgIHNocmwgICAgJDE2LCAlZWF4ICAgICAgICAgICAgICAgLyogb3V0cHV0IHRoaXMudmFsIGNoYXIgKi8KKyAgICAgICAgc3Rvc2IKKyAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0X21teAorCisuTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZV9tbXg6CisjZGVmaW5lIGxlbl9yICAlZWR4CisgICAgICAgIG1vdmwgICAgJWVheCwgbGVuX3IgICAgICAgICAgICAgLyogbGVuID0gdGhpcyAqLworICAgICAgICBzaHJsICAgICQxNiwgbGVuX3IgICAgICAgICAgICAgIC8qIGxlbiA9IHRoaXMudmFsICovCisKKyAgICAgICAgdGVzdGIgICAkMTYsICVhbAorICAgICAgICBqeiAgICAgIC5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGhfbW14IC8qIGlmICgob3AgJiAxNikgPT0gMCkgOCUgKi8KKyAgICAgICAgYW5kbCAgICAkMTUsICVlYXggICAgICAgICAgICAgICAvKiBvcCAmPSAxNSAqLworICAgICAgICBqeiAgICAgIC5MX2RlY29kZV9kaXN0YW5jZV9tbXggIC8qIGlmICghb3ApICovCisKKyAgICAgICAgcHNybHEgICB1c2VkX21tLCBob2xkX21tICAgICAgICAvKiBob2xkX21tID4+PSBsYXN0IGJpdCBsZW5ndGggKi8KKyAgICAgICAgbW92ZCAgICAlZWF4LCB1c2VkX21tCisgICAgICAgIG1vdmQgICAgaG9sZF9tbSwgJWVjeAorICAgICAgICBzdWJsICAgICVlYXgsIGJpdHNsb25nX3IKKyAgICAgICAgYW5kbCAgICAuTF9tYXNrKCwlZWF4LDQpLCAlZWN4CisgICAgICAgIGFkZGwgICAgJWVjeCwgbGVuX3IgICAgICAgICAgICAgLyogbGVuICs9IGhvbGQgJiBtYXNrW29wXSAqLworCisuTF9kZWNvZGVfZGlzdGFuY2VfbW14OgorICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLworCisgICAgICAgIGNtcGwgICAgJDMyLCBiaXRzbG9uZ19yCisgICAgICAgIGphICAgICAgLkxfZ2V0X2Rpc3RfY29kZV9tbXggICAgLyogaWYgKDMyIDwgYml0cykgKi8KKworICAgICAgICBtb3ZkICAgIGJpdHNsb25nX3IsIHRtcF9tbQorICAgICAgICBtb3ZkICAgIChpbl9yKSwgJW1tNworICAgICAgICBhZGRsICAgICQ0LCBpbl9yCisgICAgICAgIHBzbGxxICAgdG1wX21tLCAlbW03CisgICAgICAgIGFkZGwgICAgJDMyLCBiaXRzbG9uZ19yCisgICAgICAgIHBvciAgICAgJW1tNywgaG9sZF9tbSAgICAgICAgICAgLyogaG9sZF9tbSB8PSAqKCh1aW50ICopaW4pKysgPDwgYml0cyAqLworCisuTF9nZXRfZGlzdF9jb2RlX21teDoKKyAgICAgICAgbW92bCAgICBkY29kZSglZXNwKSwgJWVieCAgICAgICAvKiBlYnggPSBkY29kZSAqLworICAgICAgICBwYW5kICAgIGhvbGRfbW0sIGRtYXNrX21tCisgICAgICAgIG1vdmQgICAgZG1hc2tfbW0sICVlYXgKKyAgICAgICAgbW92cSAgICBkbWFzazJfbW0sIGRtYXNrX21tCisgICAgICAgIG1vdmwgICAgKCVlYngsJWVheCw0KSwgJWVheCAgICAgLyogZWF4ID0gZGNvZGVbaG9sZCAmIGxtYXNrXSAqLworCisuTF9kb2Rpc3RfbW14OgorI2RlZmluZSBkaXN0X3IgJWVieAorICAgICAgICBtb3Z6YmwgICVhaCwgJWVjeCAgICAgICAgICAgICAgIC8qIGVjeCA9IHRoaXMuYml0cyAqLworICAgICAgICBtb3ZsICAgICVlYXgsIGRpc3RfcgorICAgICAgICBzaHJsICAgICQxNiwgZGlzdF9yICAgICAgICAgICAgIC8qIGRpc3QgID0gdGhpcy52YWwgKi8KKyAgICAgICAgc3VibCAgICAlZWN4LCBiaXRzbG9uZ19yICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLworICAgICAgICBtb3ZkICAgICVlY3gsIHVzZWRfbW0KKworICAgICAgICB0ZXN0YiAgICQxNiwgJWFsICAgICAgICAgICAgICAgIC8qIGlmICgob3AgJiAxNikgPT0gMCkgKi8KKyAgICAgICAganogICAgICAuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdF9tbXgKKyAgICAgICAgYW5kbCAgICAkMTUsICVlYXggICAgICAgICAgICAgICAvKiBvcCAmPSAxNSAqLworICAgICAgICBqeiAgICAgIC5MX2NoZWNrX2Rpc3Rfb25lX21teAorCisuTF9hZGRfYml0c190b19kaXN0X21teDoKKyAgICAgICAgcHNybHEgICB1c2VkX21tLCBob2xkX21tICAgICAgICAvKiBob2xkX21tID4+PSBsYXN0IGJpdCBsZW5ndGggKi8KKyAgICAgICAgbW92ZCAgICAlZWF4LCB1c2VkX21tICAgICAgICAgICAvKiBzYXZlIGJpdCBsZW5ndGggb2YgY3VycmVudCBvcCAqLworICAgICAgICBtb3ZkICAgIGhvbGRfbW0sICVlY3ggICAgICAgICAgIC8qIGdldCB0aGUgbmV4dCBiaXRzIG9uIGlucHV0IHN0cmVhbSAqLworICAgICAgICBzdWJsICAgICVlYXgsIGJpdHNsb25nX3IgICAgICAgIC8qIGJpdHMgLT0gb3AgYml0cyAqLworICAgICAgICBhbmRsICAgIC5MX21hc2soLCVlYXgsNCksICVlY3ggIC8qIGVjeCAgID0gaG9sZCAmIG1hc2tbb3BdICovCisgICAgICAgIGFkZGwgICAgJWVjeCwgZGlzdF9yICAgICAgICAgICAgLyogZGlzdCArPSBob2xkICYgbWFza1tvcF0gKi8KKworLkxfY2hlY2tfd2luZG93X21teDoKKyAgICAgICAgbW92bCAgICBpbl9yLCBpbiglZXNwKSAgICAgICAgICAvKiBzYXZlIGluIHNvIGZyb20gY2FuIHVzZSBpdCdzIHJlZyAqLworICAgICAgICBtb3ZsICAgIG91dF9yLCAlZWF4CisgICAgICAgIHN1YmwgICAgYmVnKCVlc3ApLCAlZWF4ICAgICAgICAgLyogbmJ5dGVzID0gb3V0IC0gYmVnICovCisKKyAgICAgICAgY21wbCAgICBkaXN0X3IsICVlYXgKKyAgICAgICAgamIgICAgICAuTF9jbGlwX3dpbmRvd19tbXggICAgICAvKiBpZiAoZGlzdCA+IG5ieXRlcykgNC4yJSAqLworCisgICAgICAgIG1vdmwgICAgbGVuX3IsICVlY3gKKyAgICAgICAgbW92bCAgICBvdXRfciwgZnJvbV9yCisgICAgICAgIHN1YmwgICAgZGlzdF9yLCBmcm9tX3IgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKworICAgICAgICBzdWJsICAgICQzLCAlZWN4CisgICAgICAgIG1vdmIgICAgKGZyb21fciksICVhbAorICAgICAgICBtb3ZiICAgICVhbCwgKG91dF9yKQorICAgICAgICBtb3ZiICAgIDEoZnJvbV9yKSwgJWFsCisgICAgICAgIG1vdmIgICAgMihmcm9tX3IpLCAlZGwKKyAgICAgICAgYWRkbCAgICAkMywgZnJvbV9yCisgICAgICAgIG1vdmIgICAgJWFsLCAxKG91dF9yKQorICAgICAgICBtb3ZiICAgICVkbCwgMihvdXRfcikKKyAgICAgICAgYWRkbCAgICAkMywgb3V0X3IKKyAgICAgICAgcmVwICAgICBtb3ZzYgorCisgICAgICAgIG1vdmwgICAgaW4oJWVzcCksIGluX3IgICAgICAgICAgLyogbW92ZSBpbiBiYWNrIHRvICVlc2ksIHRvc3MgZnJvbSAqLworICAgICAgICBtb3ZsICAgIGxjb2RlKCVlc3ApLCAlZWJ4ICAgICAgIC8qIG1vdmUgbGNvZGUgYmFjayB0byAlZWJ4LCB0b3NzIGRpc3QgKi8KKyAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0X21teAorCisuYWxpZ24gMTYsMHg5MAorLkxfY2hlY2tfZGlzdF9vbmVfbW14OgorICAgICAgICBjbXBsICAgICQxLCBkaXN0X3IKKyAgICAgICAgam5lICAgICAuTF9jaGVja193aW5kb3dfbW14CisgICAgICAgIGNtcGwgICAgb3V0X3IsIGJlZyglZXNwKQorICAgICAgICBqZSAgICAgIC5MX2NoZWNrX3dpbmRvd19tbXgKKworICAgICAgICBkZWNsICAgIG91dF9yCisgICAgICAgIG1vdmwgICAgbGVuX3IsICVlY3gKKyAgICAgICAgbW92YiAgICAob3V0X3IpLCAlYWwKKyAgICAgICAgc3VibCAgICAkMywgJWVjeAorCisgICAgICAgIG1vdmIgICAgJWFsLCAxKG91dF9yKQorICAgICAgICBtb3ZiICAgICVhbCwgMihvdXRfcikKKyAgICAgICAgbW92YiAgICAlYWwsIDMob3V0X3IpCisgICAgICAgIGFkZGwgICAgJDQsIG91dF9yCisgICAgICAgIHJlcCAgICAgc3Rvc2IKKworICAgICAgICBtb3ZsICAgIGxjb2RlKCVlc3ApLCAlZWJ4ICAgICAgIC8qIG1vdmUgbGNvZGUgYmFjayB0byAlZWJ4LCB0b3NzIGRpc3QgKi8KKyAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0X21teAorCisuYWxpZ24gMTYsMHg5MAorLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aF9tbXg6CisgICAgICAgIHRlc3RiICAgJDY0LCAlYWwKKyAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2sgIC8qIGlmICgob3AgJiA2NCkgIT0gMCkgKi8KKworICAgICAgICBhbmRsICAgICQxNSwgJWVheAorICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLworICAgICAgICBtb3ZkICAgIGhvbGRfbW0sICVlY3gKKyAgICAgICAgYW5kbCAgICAuTF9tYXNrKCwlZWF4LDQpLCAlZWN4CisgICAgICAgIGFkZGwgICAgbGVuX3IsICVlY3gKKyAgICAgICAgbW92bCAgICAoJWVieCwlZWN4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovCisgICAgICAgIGptcCAgICAgLkxfZG9sZW5fbW14CisKKy5hbGlnbiAxNiwweDkwCisuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdF9tbXg6CisgICAgICAgIHRlc3RiICAgJDY0LCAlYWwKKyAgICAgICAgam56ICAgICAuTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGUgIC8qIGlmICgob3AgJiA2NCkgIT0gMCkgKi8KKworICAgICAgICBhbmRsICAgICQxNSwgJWVheAorICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLworICAgICAgICBtb3ZkICAgIGhvbGRfbW0sICVlY3gKKyAgICAgICAgYW5kbCAgICAuTF9tYXNrKCwlZWF4LDQpLCAlZWN4CisgICAgICAgIG1vdmwgICAgZGNvZGUoJWVzcCksICVlYXggICAgICAgLyogZWN4ID0gZGNvZGUgKi8KKyAgICAgICAgYWRkbCAgICBkaXN0X3IsICVlY3gKKyAgICAgICAgbW92bCAgICAoJWVheCwlZWN4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovCisgICAgICAgIGptcCAgICAgLkxfZG9kaXN0X21teAorCisuYWxpZ24gMTYsMHg5MAorLkxfY2xpcF93aW5kb3dfbW14OgorI2RlZmluZSBuYnl0ZXNfciAlZWN4CisgICAgICAgIG1vdmwgICAgJWVheCwgbmJ5dGVzX3IKKyAgICAgICAgbW92bCAgICB3c2l6ZSglZXNwKSwgJWVheCAgICAgICAvKiBwcmVwYXJlIGZvciBkaXN0IGNvbXBhcmUgKi8KKyAgICAgICAgbmVnbCAgICBuYnl0ZXNfciAgICAgICAgICAgICAgICAvKiBuYnl0ZXMgPSAtbmJ5dGVzICovCisgICAgICAgIG1vdmwgICAgd2luZG93KCVlc3ApLCBmcm9tX3IgICAgLyogZnJvbSA9IHdpbmRvdyAqLworCisgICAgICAgIGNtcGwgICAgZGlzdF9yLCAlZWF4CisgICAgICAgIGpiICAgICAgLkxfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyIC8qIGlmIChkaXN0ID4gd3NpemUpICovCisKKyAgICAgICAgYWRkbCAgICBkaXN0X3IsIG5ieXRlc19yICAgICAgICAvKiBuYnl0ZXMgPSBkaXN0IC0gbmJ5dGVzICovCisgICAgICAgIGNtcGwgICAgJDAsIHdyaXRlKCVlc3ApCisgICAgICAgIGpuZSAgICAgLkxfd3JhcF9hcm91bmRfd2luZG93X21teCAvKiBpZiAod3JpdGUgIT0gMCkgKi8KKworICAgICAgICBzdWJsICAgIG5ieXRlc19yLCAlZWF4CisgICAgICAgIGFkZGwgICAgJWVheCwgZnJvbV9yICAgICAgICAgICAgLyogZnJvbSArPSB3c2l6ZSAtIG5ieXRlcyAqLworCisgICAgICAgIGNtcGwgICAgbmJ5dGVzX3IsIGxlbl9yCisgICAgICAgIGpiZSAgICAgLkxfZG9fY29weTFfbW14ICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCisKKyAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgbGVuX3IgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCisgICAgICAgIHJlcCAgICAgbW92c2IKKyAgICAgICAgbW92bCAgICBvdXRfciwgZnJvbV9yCisgICAgICAgIHN1YmwgICAgZGlzdF9yLCBmcm9tX3IgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKyAgICAgICAgam1wICAgICAuTF9kb19jb3B5MV9tbXgKKworICAgICAgICBjbXBsICAgIG5ieXRlc19yLCBsZW5fcgorICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxX21teCAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLworCisgICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGxlbl9yICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworICAgICAgICByZXAgICAgIG1vdnNiCisgICAgICAgIG1vdmwgICAgb3V0X3IsIGZyb21fcgorICAgICAgICBzdWJsICAgIGRpc3RfciwgZnJvbV9yICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCisgICAgICAgIGptcCAgICAgLkxfZG9fY29weTFfbW14CisKKy5MX3dyYXBfYXJvdW5kX3dpbmRvd19tbXg6CisjZGVmaW5lIHdyaXRlX3IgJWVheAorICAgICAgICBtb3ZsICAgIHdyaXRlKCVlc3ApLCB3cml0ZV9yCisgICAgICAgIGNtcGwgICAgd3JpdGVfciwgbmJ5dGVzX3IKKyAgICAgICAgamJlICAgICAuTF9jb250aWd1b3VzX2luX3dpbmRvd19tbXggLyogaWYgKHdyaXRlID49IG5ieXRlcykgKi8KKworICAgICAgICBhZGRsICAgIHdzaXplKCVlc3ApLCBmcm9tX3IKKyAgICAgICAgYWRkbCAgICB3cml0ZV9yLCBmcm9tX3IKKyAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgZnJvbV9yICAgICAgICAvKiBmcm9tICs9IHdzaXplICsgd3JpdGUgLSBuYnl0ZXMgKi8KKyAgICAgICAgc3VibCAgICB3cml0ZV9yLCBuYnl0ZXNfciAgICAgICAvKiBuYnl0ZXMgLT0gd3JpdGUgKi8KKyN1bmRlZiB3cml0ZV9yCisKKyAgICAgICAgY21wbCAgICBuYnl0ZXNfciwgbGVuX3IKKyAgICAgICAgamJlICAgICAuTF9kb19jb3B5MV9tbXggICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KKworICAgICAgICBzdWJsICAgIG5ieXRlc19yLCBsZW5fciAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KKyAgICAgICAgcmVwICAgICBtb3ZzYgorICAgICAgICBtb3ZsICAgIHdpbmRvdyglZXNwKSwgZnJvbV9yICAgIC8qIGZyb20gPSB3aW5kb3cgKi8KKyAgICAgICAgbW92bCAgICB3cml0ZSglZXNwKSwgbmJ5dGVzX3IgICAvKiBuYnl0ZXMgPSB3cml0ZSAqLworICAgICAgICBjbXBsICAgIG5ieXRlc19yLCBsZW5fcgorICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxX21teCAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLworCisgICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGxlbl9yICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworICAgICAgICByZXAgICAgIG1vdnNiCisgICAgICAgIG1vdmwgICAgb3V0X3IsIGZyb21fcgorICAgICAgICBzdWJsICAgIGRpc3RfciwgZnJvbV9yICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCisgICAgICAgIGptcCAgICAgLkxfZG9fY29weTFfbW14CisKKy5MX2NvbnRpZ3VvdXNfaW5fd2luZG93X21teDoKKyNkZWZpbmUgd3JpdGVfciAlZWF4CisgICAgICAgIGFkZGwgICAgd3JpdGVfciwgZnJvbV9yCisgICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGZyb21fciAgICAgICAgLyogZnJvbSArPSB3cml0ZSAtIG5ieXRlcyAqLworI3VuZGVmIHdyaXRlX3IKKworICAgICAgICBjbXBsICAgIG5ieXRlc19yLCBsZW5fcgorICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxX21teCAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLworCisgICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGxlbl9yICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworICAgICAgICByZXAgICAgIG1vdnNiCisgICAgICAgIG1vdmwgICAgb3V0X3IsIGZyb21fcgorICAgICAgICBzdWJsICAgIGRpc3RfciwgZnJvbV9yICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCisKKy5MX2RvX2NvcHkxX21teDoKKyN1bmRlZiBuYnl0ZXNfcgorI2RlZmluZSBpbl9yICVlc2kKKyAgICAgICAgbW92bCAgICBsZW5fciwgJWVjeAorICAgICAgICByZXAgICAgIG1vdnNiCisKKyAgICAgICAgbW92bCAgICBpbiglZXNwKSwgaW5fciAgICAgICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovCisgICAgICAgIG1vdmwgICAgbGNvZGUoJWVzcCksICVlYnggICAgICAgLyogbW92ZSBsY29kZSBiYWNrIHRvICVlYngsIHRvc3MgZGlzdCAqLworICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RfbW14CisKKyN1bmRlZiBob2xkX3IKKyN1bmRlZiBiaXRzbG9uZ19yCisKKyNlbmRpZiAvKiBVU0VfTU1YIHx8IFJVTl9USU1FX01NWCAqLworCisKKy8qKiogVVNFX01NWCwgTk9fTU1YLCBhbmQgUlVOVElNRV9NTVggZnJvbSBoZXJlIG9uICoqKi8KKworLkxfaW52YWxpZF9kaXN0YW5jZV9jb2RlOgorICAgICAgICAvKiBlbHNlIHsKKyAgICAgICAgICogICBzdHJtLT5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsKKyAgICAgICAgICogICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICogfQorICAgICAgICAgKi8KKyAgICAgICAgbW92bCAgICAkLkxfaW52YWxpZF9kaXN0YW5jZV9jb2RlX21zZywgJWVjeAorICAgICAgICBtb3ZsICAgICRJTkZMQVRFX01PREVfQkFELCAlZWR4CisgICAgICAgIGptcCAgICAgLkxfdXBkYXRlX3N0cmVhbV9zdGF0ZQorCisuTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2s6CisgICAgICAgIC8qIGVsc2UgaWYgKG9wICYgMzIpIHsKKyAgICAgICAgICogICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgICAgICAqICAgYnJlYWs7CisgICAgICAgICAqIH0KKyAgICAgICAgICovCisgICAgICAgIHRlc3RiICAgJDMyLCAlYWwKKyAgICAgICAganogICAgICAuTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGUgIC8qIGlmICgob3AgJiAzMikgPT0gMCkgKi8KKworICAgICAgICBtb3ZsICAgICQwLCAlZWN4CisgICAgICAgIG1vdmwgICAgJElORkxBVEVfTU9ERV9UWVBFLCAlZWR4CisgICAgICAgIGptcCAgICAgLkxfdXBkYXRlX3N0cmVhbV9zdGF0ZQorCisuTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGU6CisgICAgICAgIC8qIGVsc2UgeworICAgICAgICAgKiAgIHN0cm0tPm1zZyA9ICJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOworICAgICAgICAgKiAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgKiB9CisgICAgICAgICAqLworICAgICAgICBtb3ZsICAgICQuTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGVfbXNnLCAlZWN4CisgICAgICAgIG1vdmwgICAgJElORkxBVEVfTU9ERV9CQUQsICVlZHgKKyAgICAgICAgam1wICAgICAuTF91cGRhdGVfc3RyZWFtX3N0YXRlCisKKy5MX2ludmFsaWRfZGlzdGFuY2VfdG9vX2ZhcjoKKyAgICAgICAgLyogc3RybS0+bXNnID0gImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKKyAgICAgICAgICogc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAqLworICAgICAgICBtb3ZsICAgIGluKCVlc3ApLCBpbl9yICAgICAgICAgIC8qIGZyb21fciBoYXMgaW4ncyByZWcsIHB1dCBpbiBiYWNrICovCisgICAgICAgIG1vdmwgICAgJC5MX2ludmFsaWRfZGlzdGFuY2VfdG9vX2Zhcl9tc2csICVlY3gKKyAgICAgICAgbW92bCAgICAkSU5GTEFURV9NT0RFX0JBRCwgJWVkeAorICAgICAgICBqbXAgICAgIC5MX3VwZGF0ZV9zdHJlYW1fc3RhdGUKKworLkxfdXBkYXRlX3N0cmVhbV9zdGF0ZToKKyAgICAgICAgLyogc2V0IHN0cm0tPm1zZyA9ICVlY3gsIHN0cm0tPnN0YXRlLT5tb2RlID0gJWVkeCAqLworICAgICAgICBtb3ZsICAgIHN0cm1fc3AoJWVzcCksICVlYXgKKyAgICAgICAgdGVzdGwgICAlZWN4LCAlZWN4ICAgICAgICAgICAgICAvKiBpZiAobXNnICE9IE5VTEwpICovCisgICAgICAgIGp6ICAgICAgLkxfc2tpcF9tc2cKKyAgICAgICAgbW92bCAgICAlZWN4LCBtc2dfc3RybSglZWF4KSAgICAvKiBzdHJtLT5tc2cgPSBtc2cgKi8KKy5MX3NraXBfbXNnOgorICAgICAgICBtb3ZsICAgIHN0YXRlX3N0cm0oJWVheCksICVlYXggIC8qIHN0YXRlID0gc3RybS0+c3RhdGUgKi8KKyAgICAgICAgbW92bCAgICAlZWR4LCBtb2RlX3N0YXRlKCVlYXgpICAvKiBzdGF0ZS0+bW9kZSA9IGVkeCAoQkFEIHwgVFlQRSkgKi8KKyAgICAgICAgam1wICAgICAuTF9icmVha19sb29wCisKKy5hbGlnbiAzMiwweDkwCisuTF9icmVha19sb29wOgorCisvKgorICogUmVnczoKKyAqCisgKiBiaXRzID0gJWVicCB3aGVuIG1teCwgYW5kIGluICVlYnggd2hlbiBub24tbW14CisgKiBob2xkID0gJWhvbGRfbW0gd2hlbiBtbXgsIGFuZCBpbiAlZWJwIHdoZW4gbm9uLW1teAorICogaW4gICA9ICVlc2kKKyAqIG91dCAgPSAlZWRpCisgKi8KKworI2lmIGRlZmluZWQoIFVTRV9NTVggKSB8fCBkZWZpbmVkKCBSVU5fVElNRV9NTVggKQorCisjaWYgZGVmaW5lZCggUlVOX1RJTUVfTU1YICkKKworICAgICAgICBjbXBsICAgICRET19VU0VfTU1YLCBpbmZsYXRlX2Zhc3RfdXNlX21teAorICAgICAgICBqbmUgICAgIC5MX3VwZGF0ZV9uZXh0X2luCisKKyNlbmRpZiAvKiBSVU5fVElNRV9NTVggKi8KKworICAgICAgICBtb3ZsICAgICVlYnAsICVlYngKKworLkxfdXBkYXRlX25leHRfaW46CisKKyNlbmRpZgorCisjZGVmaW5lIHN0cm1fciAgJWVheAorI2RlZmluZSBzdGF0ZV9yICVlZHgKKworICAgICAgICAvKiBsZW4gPSBiaXRzID4+IDM7CisgICAgICAgICAqIGluIC09IGxlbjsKKyAgICAgICAgICogYml0cyAtPSBsZW4gPDwgMzsKKyAgICAgICAgICogaG9sZCAmPSAoMVUgPDwgYml0cykgLSAxOworICAgICAgICAgKiBzdGF0ZS0+aG9sZCA9IGhvbGQ7CisgICAgICAgICAqIHN0YXRlLT5iaXRzID0gYml0czsKKyAgICAgICAgICogc3RybS0+bmV4dF9pbiA9IGluOworICAgICAgICAgKiBzdHJtLT5uZXh0X291dCA9IG91dDsKKyAgICAgICAgICovCisgICAgICAgIG1vdmwgICAgc3RybV9zcCglZXNwKSwgc3RybV9yCisgICAgICAgIG1vdmwgICAgJWVieCwgJWVjeAorICAgICAgICBtb3ZsICAgIHN0YXRlX3N0cm0oc3RybV9yKSwgc3RhdGVfcgorICAgICAgICBzaHJsICAgICQzLCAlZWN4CisgICAgICAgIHN1YmwgICAgJWVjeCwgaW5fcgorICAgICAgICBzaGxsICAgICQzLCAlZWN4CisgICAgICAgIHN1YmwgICAgJWVjeCwgJWVieAorICAgICAgICBtb3ZsICAgIG91dF9yLCBuZXh0X291dF9zdHJtKHN0cm1fcikKKyAgICAgICAgbW92bCAgICAlZWJ4LCBiaXRzX3N0YXRlKHN0YXRlX3IpCisgICAgICAgIG1vdmwgICAgJWVieCwgJWVjeAorCisgICAgICAgIGxlYWwgICAgYnVmKCVlc3ApLCAlZWJ4CisgICAgICAgIGNtcGwgICAgJWVieCwgbGFzdCglZXNwKQorICAgICAgICBqbmUgICAgIC5MX2J1Zl9ub3RfdXNlZCAgICAgICAgIC8qIGlmIGJ1ZiAhPSBsYXN0ICovCisKKyAgICAgICAgc3VibCAgICAlZWJ4LCBpbl9yICAgICAgICAgICAgICAvKiBpbiAtPSBidWYgKi8KKyAgICAgICAgbW92bCAgICBuZXh0X2luX3N0cm0oc3RybV9yKSwgJWVieAorICAgICAgICBtb3ZsICAgICVlYngsIGxhc3QoJWVzcCkgICAgICAgIC8qIGxhc3QgPSBzdHJtLT5uZXh0X2luICovCisgICAgICAgIGFkZGwgICAgJWVieCwgaW5fciAgICAgICAgICAgICAgLyogaW4gKz0gc3RybS0+bmV4dF9pbiAqLworICAgICAgICBtb3ZsICAgIGF2YWlsX2luX3N0cm0oc3RybV9yKSwgJWVieAorICAgICAgICBzdWJsICAgICQxMSwgJWVieAorICAgICAgICBhZGRsICAgICVlYngsIGxhc3QoJWVzcCkgICAgLyogbGFzdCA9ICZzdHJtLT5uZXh0X2luWyBhdmFpbF9pbiAtIDExIF0gKi8KKworLkxfYnVmX25vdF91c2VkOgorICAgICAgICBtb3ZsICAgIGluX3IsIG5leHRfaW5fc3RybShzdHJtX3IpCisKKyAgICAgICAgbW92bCAgICAkMSwgJWVieAorICAgICAgICBzaGxsICAgICVjbCwgJWVieAorICAgICAgICBkZWNsICAgICVlYngKKworI2lmIGRlZmluZWQoIFVTRV9NTVggKSB8fCBkZWZpbmVkKCBSVU5fVElNRV9NTVggKQorCisjaWYgZGVmaW5lZCggUlVOX1RJTUVfTU1YICkKKworICAgICAgICBjbXBsICAgICRET19VU0VfTU1YLCBpbmZsYXRlX2Zhc3RfdXNlX21teAorICAgICAgICBqbmUgICAgIC5MX3VwZGF0ZV9ob2xkCisKKyNlbmRpZiAvKiBSVU5fVElNRV9NTVggKi8KKworICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLworICAgICAgICBtb3ZkICAgIGhvbGRfbW0sICVlYnAKKworICAgICAgICBlbW1zCisKKy5MX3VwZGF0ZV9ob2xkOgorCisjZW5kaWYgLyogVVNFX01NWCB8fCBSVU5fVElNRV9NTVggKi8KKworICAgICAgICBhbmRsICAgICVlYngsICVlYnAKKyAgICAgICAgbW92bCAgICAlZWJwLCBob2xkX3N0YXRlKHN0YXRlX3IpCisKKyNkZWZpbmUgbGFzdF9yICVlYngKKworICAgICAgICAvKiBzdHJtLT5hdmFpbF9pbiA9IGluIDwgbGFzdCA/IDExICsgKGxhc3QgLSBpbikgOiAxMSAtIChpbiAtIGxhc3QpICovCisgICAgICAgIG1vdmwgICAgbGFzdCglZXNwKSwgbGFzdF9yCisgICAgICAgIGNtcGwgICAgaW5fciwgbGFzdF9yCisgICAgICAgIGpiZSAgICAgLkxfbGFzdF9pc19zbWFsbGVyICAgICAvKiBpZiAoaW4gPj0gbGFzdCkgKi8KKworICAgICAgICBzdWJsICAgIGluX3IsIGxhc3RfciAgICAgICAgICAgLyogbGFzdCAtPSBpbiAqLworICAgICAgICBhZGRsICAgICQxMSwgbGFzdF9yICAgICAgICAgICAgLyogbGFzdCArPSAxMSAqLworICAgICAgICBtb3ZsICAgIGxhc3RfciwgYXZhaWxfaW5fc3RybShzdHJtX3IpCisgICAgICAgIGptcCAgICAgLkxfZml4dXBfb3V0CisuTF9sYXN0X2lzX3NtYWxsZXI6CisgICAgICAgIHN1YmwgICAgbGFzdF9yLCBpbl9yICAgICAgICAgICAvKiBpbiAtPSBsYXN0ICovCisgICAgICAgIG5lZ2wgICAgaW5fciAgICAgICAgICAgICAgICAgICAvKiBpbiA9IC1pbiAqLworICAgICAgICBhZGRsICAgICQxMSwgaW5fciAgICAgICAgICAgICAgLyogaW4gKz0gMTEgKi8KKyAgICAgICAgbW92bCAgICBpbl9yLCBhdmFpbF9pbl9zdHJtKHN0cm1fcikKKworI3VuZGVmIGxhc3RfcgorI2RlZmluZSBlbmRfciAlZWJ4CisKKy5MX2ZpeHVwX291dDoKKyAgICAgICAgLyogc3RybS0+YXZhaWxfb3V0ID0gb3V0IDwgZW5kID8gMjU3ICsgKGVuZCAtIG91dCkgOiAyNTcgLSAob3V0IC0gZW5kKSovCisgICAgICAgIG1vdmwgICAgZW5kKCVlc3ApLCBlbmRfcgorICAgICAgICBjbXBsICAgIG91dF9yLCBlbmRfcgorICAgICAgICBqYmUgICAgIC5MX2VuZF9pc19zbWFsbGVyICAgICAgLyogaWYgKG91dCA+PSBlbmQpICovCisKKyAgICAgICAgc3VibCAgICBvdXRfciwgZW5kX3IgICAgICAgICAgIC8qIGVuZCAtPSBvdXQgKi8KKyAgICAgICAgYWRkbCAgICAkMjU3LCBlbmRfciAgICAgICAgICAgIC8qIGVuZCArPSAyNTcgKi8KKyAgICAgICAgbW92bCAgICBlbmRfciwgYXZhaWxfb3V0X3N0cm0oc3RybV9yKQorICAgICAgICBqbXAgICAgIC5MX2RvbmUKKy5MX2VuZF9pc19zbWFsbGVyOgorICAgICAgICBzdWJsICAgIGVuZF9yLCBvdXRfciAgICAgICAgICAgLyogb3V0IC09IGVuZCAqLworICAgICAgICBuZWdsICAgIG91dF9yICAgICAgICAgICAgICAgICAgLyogb3V0ID0gLW91dCAqLworICAgICAgICBhZGRsICAgICQyNTcsIG91dF9yICAgICAgICAgICAgLyogb3V0ICs9IDI1NyAqLworICAgICAgICBtb3ZsICAgIG91dF9yLCBhdmFpbF9vdXRfc3RybShzdHJtX3IpCisKKyN1bmRlZiBlbmRfcgorI3VuZGVmIHN0cm1fcgorI3VuZGVmIHN0YXRlX3IKKworLkxfZG9uZToKKyAgICAgICAgYWRkbCAgICAkbG9jYWxfdmFyX3NpemUsICVlc3AKKyAgICAgICAgcG9wZgorICAgICAgICBwb3BsICAgICVlYngKKyAgICAgICAgcG9wbCAgICAlZWJwCisgICAgICAgIHBvcGwgICAgJWVzaQorICAgICAgICBwb3BsICAgICVlZGkKKyAgICAgICAgcmV0CisKKyNpZiBkZWZpbmVkKCBHQVNfRUxGICkKKy8qIGVsZiBpbmZvICovCisudHlwZSBpbmZsYXRlX2Zhc3QsQGZ1bmN0aW9uCisuc2l6ZSBpbmZsYXRlX2Zhc3QsLi1pbmZsYXRlX2Zhc3QKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9pb3N0cmVhbS90ZXN0LmNwcCBiL3psaWIvc3JjL2NvbnRyaWIvaW9zdHJlYW0vdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QyNjViMwotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvaW9zdHJlYW0vdGVzdC5jcHAKQEAgLTAsMCArMSwyNCBAQAorCisjaW5jbHVkZSAiemZzdHJlYW0uaCIKKworaW50IG1haW4oKSB7CisKKyAgLy8gQ29uc3RydWN0IGEgc3RyZWFtIG9iamVjdCB3aXRoIHRoaXMgZmlsZWJ1ZmZlci4gIEFueXRoaW5nIHNlbnQKKyAgLy8gdG8gdGhpcyBzdHJlYW0gd2lsbCBnbyB0byBzdGFuZGFyZCBvdXQuCisgIGd6b2ZzdHJlYW0gb3MoIDEsIGlvczo6b3V0ICk7CisKKyAgLy8gVGhpcyB0ZXh0IGlzIGdldHRpbmcgY29tcHJlc3NlZCBhbmQgc2VudCB0byBzdGRvdXQuCisgIC8vIFRvIHByb3ZlIHRoaXMsIHJ1biAndGVzdCB8IHpjYXQnLgorICBvcyA8PCAiSGVsbG8sIE1vbW15IiA8PCBlbmRsOworCisgIG9zIDw8IHNldGNvbXByZXNzaW9ubGV2ZWwoIFpfTk9fQ09NUFJFU1NJT04gKTsKKyAgb3MgPDwgImhlbGxvLCBoZWxsbywgaGksIGhvISIgPDwgZW5kbDsKKworICBzZXRjb21wcmVzc2lvbmxldmVsKCBvcywgWl9ERUZBVUxUX0NPTVBSRVNTSU9OICkKKyAgICA8PCAiSSdtIGNvbXByZXNzaW5nIGFnYWluIiA8PCBlbmRsOworCisgIG9zLmNsb3NlKCk7CisKKyAgcmV0dXJuIDA7CisKK30KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvaW9zdHJlYW0vemZzdHJlYW0uY3BwIGIvemxpYi9zcmMvY29udHJpYi9pb3N0cmVhbS96ZnN0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBjZDg1ZgotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvaW9zdHJlYW0vemZzdHJlYW0uY3BwCkBAIC0wLDAgKzEsMzI5IEBACisKKyNpbmNsdWRlICJ6ZnN0cmVhbS5oIgorCitnemZpbGVidWY6Omd6ZmlsZWJ1ZigpIDoKKyAgZmlsZShOVUxMKSwKKyAgbW9kZSgwKSwKKyAgb3duX2ZpbGVfZGVzY3JpcHRvcigwKQoreyB9CisKK2d6ZmlsZWJ1Zjo6fmd6ZmlsZWJ1ZigpIHsKKworICBzeW5jKCk7CisgIGlmICggb3duX2ZpbGVfZGVzY3JpcHRvciApCisgICAgY2xvc2UoKTsKKworfQorCitnemZpbGVidWYgKmd6ZmlsZWJ1Zjo6b3BlbiggY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW9fbW9kZSApIHsKKworICBpZiAoIGlzX29wZW4oKSApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgY2hhciBjaGFyX21vZGVbMTBdOworICBjaGFyICpwID0gY2hhcl9tb2RlOworCisgIGlmICggaW9fbW9kZSAmIGlvczo6aW4gKSB7CisgICAgbW9kZSA9IGlvczo6aW47CisgICAgKnArKyA9ICdyJzsKKyAgfSBlbHNlIGlmICggaW9fbW9kZSAmIGlvczo6YXBwICkgeworICAgIG1vZGUgPSBpb3M6OmFwcDsKKyAgICAqcCsrID0gJ2EnOworICB9IGVsc2UgeworICAgIG1vZGUgPSBpb3M6Om91dDsKKyAgICAqcCsrID0gJ3cnOworICB9CisKKyAgaWYgKCBpb19tb2RlICYgaW9zOjpiaW5hcnkgKSB7CisgICAgbW9kZSB8PSBpb3M6OmJpbmFyeTsKKyAgICAqcCsrID0gJ2InOworICB9CisKKyAgLy8gSGFyZCBjb2RlIHRoZSBjb21wcmVzc2lvbiBsZXZlbAorICBpZiAoIGlvX21vZGUgJiAoaW9zOjpvdXR8aW9zOjphcHAgKSkgeworICAgICpwKysgPSAnOSc7CisgIH0KKworICAvLyBQdXQgdGhlIGVuZC1vZi1zdHJpbmcgaW5kaWNhdG9yCisgICpwID0gJ1wwJzsKKworICBpZiAoIChmaWxlID0gZ3pvcGVuKG5hbWUsIGNoYXJfbW9kZSkpID09IE5VTEwgKQorICAgIHJldHVybiBOVUxMOworCisgIG93bl9maWxlX2Rlc2NyaXB0b3IgPSAxOworCisgIHJldHVybiB0aGlzOworCit9CisKK2d6ZmlsZWJ1ZiAqZ3pmaWxlYnVmOjphdHRhY2goIGludCBmaWxlX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW9fbW9kZSApIHsKKworICBpZiAoIGlzX29wZW4oKSApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgY2hhciBjaGFyX21vZGVbMTBdOworICBjaGFyICpwID0gY2hhcl9tb2RlOworCisgIGlmICggaW9fbW9kZSAmIGlvczo6aW4gKSB7CisgICAgbW9kZSA9IGlvczo6aW47CisgICAgKnArKyA9ICdyJzsKKyAgfSBlbHNlIGlmICggaW9fbW9kZSAmIGlvczo6YXBwICkgeworICAgIG1vZGUgPSBpb3M6OmFwcDsKKyAgICAqcCsrID0gJ2EnOworICB9IGVsc2UgeworICAgIG1vZGUgPSBpb3M6Om91dDsKKyAgICAqcCsrID0gJ3cnOworICB9CisKKyAgaWYgKCBpb19tb2RlICYgaW9zOjpiaW5hcnkgKSB7CisgICAgbW9kZSB8PSBpb3M6OmJpbmFyeTsKKyAgICAqcCsrID0gJ2InOworICB9CisKKyAgLy8gSGFyZCBjb2RlIHRoZSBjb21wcmVzc2lvbiBsZXZlbAorICBpZiAoIGlvX21vZGUgJiAoaW9zOjpvdXR8aW9zOjphcHAgKSkgeworICAgICpwKysgPSAnOSc7CisgIH0KKworICAvLyBQdXQgdGhlIGVuZC1vZi1zdHJpbmcgaW5kaWNhdG9yCisgICpwID0gJ1wwJzsKKworICBpZiAoIChmaWxlID0gZ3pkb3BlbihmaWxlX2Rlc2NyaXB0b3IsIGNoYXJfbW9kZSkpID09IE5VTEwgKQorICAgIHJldHVybiBOVUxMOworCisgIG93bl9maWxlX2Rlc2NyaXB0b3IgPSAwOworCisgIHJldHVybiB0aGlzOworCit9CisKK2d6ZmlsZWJ1ZiAqZ3pmaWxlYnVmOjpjbG9zZSgpIHsKKworICBpZiAoIGlzX29wZW4oKSApIHsKKworICAgIHN5bmMoKTsKKyAgICBnemNsb3NlKCBmaWxlICk7CisgICAgZmlsZSA9IE5VTEw7CisKKyAgfQorCisgIHJldHVybiB0aGlzOworCit9CisKK2ludCBnemZpbGVidWY6OnNldGNvbXByZXNzaW9ubGV2ZWwoIGludCBjb21wX2xldmVsICkgeworCisgIHJldHVybiBnenNldHBhcmFtcyhmaWxlLCBjb21wX2xldmVsLCAtMik7CisKK30KKworaW50IGd6ZmlsZWJ1Zjo6c2V0Y29tcHJlc3Npb25zdHJhdGVneSggaW50IGNvbXBfc3RyYXRlZ3kgKSB7CisKKyAgcmV0dXJuIGd6c2V0cGFyYW1zKGZpbGUsIC0yLCBjb21wX3N0cmF0ZWd5KTsKKworfQorCisKK3N0cmVhbXBvcyBnemZpbGVidWY6OnNlZWtvZmYoIHN0cmVhbW9mZiBvZmYsIGlvczo6c2Vla19kaXIgZGlyLCBpbnQgd2hpY2ggKSB7CisKKyAgcmV0dXJuIHN0cmVhbXBvcyhFT0YpOworCit9CisKK2ludCBnemZpbGVidWY6OnVuZGVyZmxvdygpIHsKKworICAvLyBJZiB0aGUgZmlsZSBoYXNuJ3QgYmVlbiBvcGVuZWQgZm9yIHJlYWRpbmcsIGVycm9yLgorICBpZiAoICFpc19vcGVuKCkgfHwgIShtb2RlICYgaW9zOjppbikgKQorICAgIHJldHVybiBFT0Y7CisKKyAgLy8gaWYgYSBidWZmZXIgZG9lc24ndCBleGlzdHMsIGFsbG9jYXRlIG9uZS4KKyAgaWYgKCAhYmFzZSgpICkgeworCisgICAgaWYgKCAoYWxsb2NhdGUoKSkgPT0gRU9GICkKKyAgICAgIHJldHVybiBFT0Y7CisgICAgc2V0cCgwLDApOworCisgIH0gZWxzZSB7CisKKyAgICBpZiAoIGluX2F2YWlsKCkgKQorICAgICAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKSAqZ3B0cigpOworCisgICAgaWYgKCBvdXRfd2FpdGluZygpICkgeworICAgICAgaWYgKCBmbHVzaGJ1ZigpID09IEVPRiApCisgICAgICAgIHJldHVybiBFT0Y7CisgICAgfQorCisgIH0KKworICAvLyBBdHRlbXB0IHRvIGZpbGwgdGhlIGJ1ZmZlci4KKworICBpbnQgcmVzdWx0ID0gZmlsbGJ1ZigpOworICBpZiAoIHJlc3VsdCA9PSBFT0YgKSB7CisgICAgLy8gZGlzYWJsZSBnZXQgYXJlYQorICAgIHNldGcoMCwwLDApOworICAgIHJldHVybiBFT0Y7CisgIH0KKworICByZXR1cm4gKHVuc2lnbmVkIGNoYXIpICpncHRyKCk7CisKK30KKworaW50IGd6ZmlsZWJ1Zjo6b3ZlcmZsb3coIGludCBjICkgeworCisgIGlmICggIWlzX29wZW4oKSB8fCAhKG1vZGUgJiBpb3M6Om91dCkgKQorICAgIHJldHVybiBFT0Y7CisKKyAgaWYgKCAhYmFzZSgpICkgeworICAgIGlmICggYWxsb2NhdGUoKSA9PSBFT0YgKQorICAgICAgcmV0dXJuIEVPRjsKKyAgICBzZXRnKDAsMCwwKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoaW5fYXZhaWwoKSkgeworICAgICAgICByZXR1cm4gRU9GOworICAgIH0KKyAgICBpZiAob3V0X3dhaXRpbmcoKSkgeworICAgICAgaWYgKGZsdXNoYnVmKCkgPT0gRU9GKQorICAgICAgICByZXR1cm4gRU9GOworICAgIH0KKyAgfQorCisgIGludCBibCA9IGJsZW4oKTsKKyAgc2V0cCggYmFzZSgpLCBiYXNlKCkgKyBibCk7CisKKyAgaWYgKCBjICE9IEVPRiApIHsKKworICAgICpwcHRyKCkgPSBjOworICAgIHBidW1wKDEpOworCisgIH0KKworICByZXR1cm4gMDsKKworfQorCitpbnQgZ3pmaWxlYnVmOjpzeW5jKCkgeworCisgIGlmICggIWlzX29wZW4oKSApCisgICAgcmV0dXJuIEVPRjsKKworICBpZiAoIG91dF93YWl0aW5nKCkgKQorICAgIHJldHVybiBmbHVzaGJ1ZigpOworCisgIHJldHVybiAwOworCit9CisKK2ludCBnemZpbGVidWY6OmZsdXNoYnVmKCkgeworCisgIGludCBuOworICBjaGFyICpxOworCisgIHEgPSBwYmFzZSgpOworICBuID0gcHB0cigpIC0gcTsKKworICBpZiAoIGd6d3JpdGUoIGZpbGUsIHEsIG4pIDwgbiApCisgICAgcmV0dXJuIEVPRjsKKworICBzZXRwKDAsMCk7CisKKyAgcmV0dXJuIDA7CisKK30KKworaW50IGd6ZmlsZWJ1Zjo6ZmlsbGJ1ZigpIHsKKworICBpbnQgcmVxdWlyZWQ7CisgIGNoYXIgKnA7CisKKyAgcCA9IGJhc2UoKTsKKworICByZXF1aXJlZCA9IGJsZW4oKTsKKworICBpbnQgdCA9IGd6cmVhZCggZmlsZSwgcCwgcmVxdWlyZWQgKTsKKworICBpZiAoIHQgPD0gMCkgcmV0dXJuIEVPRjsKKworICBzZXRnKCBiYXNlKCksIGJhc2UoKSwgYmFzZSgpK3QpOworCisgIHJldHVybiB0OworCit9CisKK2d6ZmlsZXN0cmVhbV9jb21tb246Omd6ZmlsZXN0cmVhbV9jb21tb24oKSA6CisgIGlvcyggZ3pmaWxlc3RyZWFtX2NvbW1vbjo6cmRidWYoKSApCit7IH0KKworZ3pmaWxlc3RyZWFtX2NvbW1vbjo6fmd6ZmlsZXN0cmVhbV9jb21tb24oKQoreyB9CisKK3ZvaWQgZ3pmaWxlc3RyZWFtX2NvbW1vbjo6YXR0YWNoKCBpbnQgZmQsIGludCBpb19tb2RlICkgeworCisgIGlmICggIWJ1ZmZlci5hdHRhY2goIGZkLCBpb19tb2RlKSApCisgICAgY2xlYXIoIGlvczo6ZmFpbGJpdCB8IGlvczo6YmFkYml0ICk7CisgIGVsc2UKKyAgICBjbGVhcigpOworCit9CisKK3ZvaWQgZ3pmaWxlc3RyZWFtX2NvbW1vbjo6b3BlbiggY29uc3QgY2hhciAqbmFtZSwgaW50IGlvX21vZGUgKSB7CisKKyAgaWYgKCAhYnVmZmVyLm9wZW4oIG5hbWUsIGlvX21vZGUgKSApCisgICAgY2xlYXIoIGlvczo6ZmFpbGJpdCB8IGlvczo6YmFkYml0ICk7CisgIGVsc2UKKyAgICBjbGVhcigpOworCit9CisKK3ZvaWQgZ3pmaWxlc3RyZWFtX2NvbW1vbjo6Y2xvc2UoKSB7CisKKyAgaWYgKCAhYnVmZmVyLmNsb3NlKCkgKQorICAgIGNsZWFyKCBpb3M6OmZhaWxiaXQgfCBpb3M6OmJhZGJpdCApOworCit9CisKK2d6ZmlsZWJ1ZiAqZ3pmaWxlc3RyZWFtX2NvbW1vbjo6cmRidWYoKQoreworICByZXR1cm4gJmJ1ZmZlcjsKK30KKworZ3ppZnN0cmVhbTo6Z3ppZnN0cmVhbSgpIDoKKyAgaW9zKCBnemZpbGVzdHJlYW1fY29tbW9uOjpyZGJ1ZigpICkKK3sKKyAgY2xlYXIoIGlvczo6YmFkYml0ICk7Cit9CisKK2d6aWZzdHJlYW06Omd6aWZzdHJlYW0oIGNvbnN0IGNoYXIgKm5hbWUsIGludCBpb19tb2RlICkgOgorICBpb3MoIGd6ZmlsZXN0cmVhbV9jb21tb246OnJkYnVmKCkgKQoreworICBnemZpbGVzdHJlYW1fY29tbW9uOjpvcGVuKCBuYW1lLCBpb19tb2RlICk7Cit9CisKK2d6aWZzdHJlYW06Omd6aWZzdHJlYW0oIGludCBmZCwgaW50IGlvX21vZGUgKSA6CisgIGlvcyggZ3pmaWxlc3RyZWFtX2NvbW1vbjo6cmRidWYoKSApCit7CisgIGd6ZmlsZXN0cmVhbV9jb21tb246OmF0dGFjaCggZmQsIGlvX21vZGUgKTsKK30KKworZ3ppZnN0cmVhbTo6fmd6aWZzdHJlYW0oKSB7IH0KKworZ3pvZnN0cmVhbTo6Z3pvZnN0cmVhbSgpIDoKKyAgaW9zKCBnemZpbGVzdHJlYW1fY29tbW9uOjpyZGJ1ZigpICkKK3sKKyAgY2xlYXIoIGlvczo6YmFkYml0ICk7Cit9CisKK2d6b2ZzdHJlYW06Omd6b2ZzdHJlYW0oIGNvbnN0IGNoYXIgKm5hbWUsIGludCBpb19tb2RlICkgOgorICBpb3MoIGd6ZmlsZXN0cmVhbV9jb21tb246OnJkYnVmKCkgKQoreworICBnemZpbGVzdHJlYW1fY29tbW9uOjpvcGVuKCBuYW1lLCBpb19tb2RlICk7Cit9CisKK2d6b2ZzdHJlYW06Omd6b2ZzdHJlYW0oIGludCBmZCwgaW50IGlvX21vZGUgKSA6CisgIGlvcyggZ3pmaWxlc3RyZWFtX2NvbW1vbjo6cmRidWYoKSApCit7CisgIGd6ZmlsZXN0cmVhbV9jb21tb246OmF0dGFjaCggZmQsIGlvX21vZGUgKTsKK30KKworZ3pvZnN0cmVhbTo6fmd6b2ZzdHJlYW0oKSB7IH0KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvaW9zdHJlYW0vemZzdHJlYW0uaCBiL3psaWIvc3JjL2NvbnRyaWIvaW9zdHJlYW0vemZzdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDc5MDk4Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9pb3N0cmVhbS96ZnN0cmVhbS5oCkBAIC0wLDAgKzEsMTI4IEBACisKKyNpZm5kZWYgemZzdHJlYW1faAorI2RlZmluZSB6ZnN0cmVhbV9oCisKKyNpbmNsdWRlIDxmc3RyZWFtLmg+CisjaW5jbHVkZSAiemxpYi5oIgorCitjbGFzcyBnemZpbGVidWYgOiBwdWJsaWMgc3RyZWFtYnVmIHsKKworcHVibGljOgorCisgIGd6ZmlsZWJ1ZiggKTsKKyAgdmlydHVhbCB+Z3pmaWxlYnVmKCk7CisKKyAgZ3pmaWxlYnVmICpvcGVuKCBjb25zdCBjaGFyICpuYW1lLCBpbnQgaW9fbW9kZSApOworICBnemZpbGVidWYgKmF0dGFjaCggaW50IGZpbGVfZGVzY3JpcHRvciwgaW50IGlvX21vZGUgKTsKKyAgZ3pmaWxlYnVmICpjbG9zZSgpOworCisgIGludCBzZXRjb21wcmVzc2lvbmxldmVsKCBpbnQgY29tcF9sZXZlbCApOworICBpbnQgc2V0Y29tcHJlc3Npb25zdHJhdGVneSggaW50IGNvbXBfc3RyYXRlZ3kgKTsKKworICBpbmxpbmUgaW50IGlzX29wZW4oKSBjb25zdCB7IHJldHVybiAoZmlsZSAhPU5VTEwpOyB9CisKKyAgdmlydHVhbCBzdHJlYW1wb3Mgc2Vla29mZiggc3RyZWFtb2ZmLCBpb3M6OnNlZWtfZGlyLCBpbnQgKTsKKworICB2aXJ0dWFsIGludCBzeW5jKCk7CisKK3Byb3RlY3RlZDoKKworICB2aXJ0dWFsIGludCB1bmRlcmZsb3coKTsKKyAgdmlydHVhbCBpbnQgb3ZlcmZsb3coIGludCA9IEVPRiApOworCitwcml2YXRlOgorCisgIGd6RmlsZSBmaWxlOworICBzaG9ydCBtb2RlOworICBzaG9ydCBvd25fZmlsZV9kZXNjcmlwdG9yOworCisgIGludCBmbHVzaGJ1ZigpOworICBpbnQgZmlsbGJ1ZigpOworCit9OworCitjbGFzcyBnemZpbGVzdHJlYW1fY29tbW9uIDogdmlydHVhbCBwdWJsaWMgaW9zIHsKKworICBmcmllbmQgY2xhc3MgZ3ppZnN0cmVhbTsKKyAgZnJpZW5kIGNsYXNzIGd6b2ZzdHJlYW07CisgIGZyaWVuZCBnem9mc3RyZWFtICZzZXRjb21wcmVzc2lvbmxldmVsKCBnem9mc3RyZWFtICYsIGludCApOworICBmcmllbmQgZ3pvZnN0cmVhbSAmc2V0Y29tcHJlc3Npb25zdHJhdGVneSggZ3pvZnN0cmVhbSAmLCBpbnQgKTsKKworcHVibGljOgorICB2aXJ0dWFsIH5nemZpbGVzdHJlYW1fY29tbW9uKCk7CisKKyAgdm9pZCBhdHRhY2goIGludCBmZCwgaW50IGlvX21vZGUgKTsKKyAgdm9pZCBvcGVuKCBjb25zdCBjaGFyICpuYW1lLCBpbnQgaW9fbW9kZSApOworICB2b2lkIGNsb3NlKCk7CisKK3Byb3RlY3RlZDoKKyAgZ3pmaWxlc3RyZWFtX2NvbW1vbigpOworCitwcml2YXRlOgorICBnemZpbGVidWYgKnJkYnVmKCk7CisKKyAgZ3pmaWxlYnVmIGJ1ZmZlcjsKKworfTsKKworY2xhc3MgZ3ppZnN0cmVhbSA6IHB1YmxpYyBnemZpbGVzdHJlYW1fY29tbW9uLCBwdWJsaWMgaXN0cmVhbSB7CisKK3B1YmxpYzoKKworICBnemlmc3RyZWFtKCk7CisgIGd6aWZzdHJlYW0oIGNvbnN0IGNoYXIgKm5hbWUsIGludCBpb19tb2RlID0gaW9zOjppbiApOworICBnemlmc3RyZWFtKCBpbnQgZmQsIGludCBpb19tb2RlID0gaW9zOjppbiApOworCisgIHZpcnR1YWwgfmd6aWZzdHJlYW0oKTsKKworfTsKKworY2xhc3MgZ3pvZnN0cmVhbSA6IHB1YmxpYyBnemZpbGVzdHJlYW1fY29tbW9uLCBwdWJsaWMgb3N0cmVhbSB7CisKK3B1YmxpYzoKKworICBnem9mc3RyZWFtKCk7CisgIGd6b2ZzdHJlYW0oIGNvbnN0IGNoYXIgKm5hbWUsIGludCBpb19tb2RlID0gaW9zOjpvdXQgKTsKKyAgZ3pvZnN0cmVhbSggaW50IGZkLCBpbnQgaW9fbW9kZSA9IGlvczo6b3V0ICk7CisKKyAgdmlydHVhbCB+Z3pvZnN0cmVhbSgpOworCit9OworCit0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBnem9tYW5pcCB7CisgIGZyaWVuZCBnem9mc3RyZWFtICZvcGVyYXRvcjw8KGd6b2ZzdHJlYW0gJiwgY29uc3QgZ3pvbWFuaXA8VD4gJik7CitwdWJsaWM6CisgIGd6b21hbmlwKGd6b2ZzdHJlYW0gJigqZikoZ3pvZnN0cmVhbSAmLCBUKSwgVCB2KSA6IGZ1bmMoZiksIHZhbCh2KSB7IH0KK3ByaXZhdGU6CisgIGd6b2ZzdHJlYW0gJigqZnVuYykoZ3pvZnN0cmVhbSAmLCBUKTsKKyAgVCB2YWw7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBUPiBnem9mc3RyZWFtICZvcGVyYXRvcjw8KGd6b2ZzdHJlYW0gJnMsIGNvbnN0IGd6b21hbmlwPFQ+ICZtKQoreworICByZXR1cm4gKCptLmZ1bmMpKHMsIG0udmFsKTsKK30KKworaW5saW5lIGd6b2ZzdHJlYW0gJnNldGNvbXByZXNzaW9ubGV2ZWwoIGd6b2ZzdHJlYW0gJnMsIGludCBsICkKK3sKKyAgKHMucmRidWYoKSktPnNldGNvbXByZXNzaW9ubGV2ZWwobCk7CisgIHJldHVybiBzOworfQorCitpbmxpbmUgZ3pvZnN0cmVhbSAmc2V0Y29tcHJlc3Npb25zdHJhdGVneSggZ3pvZnN0cmVhbSAmcywgaW50IGwgKQoreworICAocy5yZGJ1ZigpKS0+c2V0Y29tcHJlc3Npb25zdHJhdGVneShsKTsKKyAgcmV0dXJuIHM7Cit9CisKK2lubGluZSBnem9tYW5pcDxpbnQ+IHNldGNvbXByZXNzaW9ubGV2ZWwoaW50IGwpCit7CisgIHJldHVybiBnem9tYW5pcDxpbnQ+KCZzZXRjb21wcmVzc2lvbmxldmVsLGwpOworfQorCitpbmxpbmUgZ3pvbWFuaXA8aW50PiBzZXRjb21wcmVzc2lvbnN0cmF0ZWd5KGludCBsKQoreworICByZXR1cm4gZ3pvbWFuaXA8aW50Pigmc2V0Y29tcHJlc3Npb25zdHJhdGVneSxsKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL2lvc3RyZWFtMi96c3RyZWFtLmggYi96bGliL3NyYy9jb250cmliL2lvc3RyZWFtMi96c3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkMjMzMgotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvaW9zdHJlYW0yL3pzdHJlYW0uaApAQCAtMCwwICsxLDMwNyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIENocmlzdGlhbiBNaWNoZWxzZW4gUmVzZWFyY2ggQVMKKyAqIEFkdmFuY2VkIENvbXB1dGluZworICogRmFudG9mdHZlZ2VuIDM4LCA1MDM2IEJFUkdFTiwgTm9yd2F5CisgKiBodHRwOi8vd3d3LmNtci5ubworICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgQ2hyaXN0aWFuIE1pY2hlbHNlbiBSZXNlYXJjaCBBUyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqLworCisjaWZuZGVmIFpTVFJFQU1fX0gKKyNkZWZpbmUgWlNUUkVBTV9fSAorCisvKgorICogenN0cmVhbS5oIC0gQysrIGludGVyZmFjZSB0byB0aGUgJ3psaWInIGdlbmVyYWwgcHVycG9zZSBjb21wcmVzc2lvbiBsaWJyYXJ5CisgKiAkSWQ6IHpzdHJlYW0uaCAxLjEgMTk5Ny0wNi0yNSAxMjowMDo1NiswMiB0eWdlIEV4cCB0eWdlICQKKyAqLworCisjaW5jbHVkZSA8c3Ryc3RyZWFtLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ6bGliLmgiCisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyMgICBpbmNsdWRlIDxmY250bC5oPgorIyAgIGluY2x1ZGUgPGlvLmg+CisjICAgZGVmaW5lIFNFVF9CSU5BUllfTU9ERShmaWxlKSBzZXRtb2RlKGZpbGVubyhmaWxlKSwgT19CSU5BUlkpCisjZWxzZQorIyAgIGRlZmluZSBTRVRfQklOQVJZX01PREUoZmlsZSkKKyNlbmRpZgorCitjbGFzcyB6c3RyaW5nbGVuIHsKK3B1YmxpYzoKKyAgICB6c3RyaW5nbGVuKGNsYXNzIGl6c3RyZWFtJik7CisgICAgenN0cmluZ2xlbihjbGFzcyBvenN0cmVhbSYsIGNvbnN0IGNoYXIqKTsKKyAgICBzaXplX3QgdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWwud29yZDsgfQorcHJpdmF0ZToKKyAgICBzdHJ1Y3QgVmFsIHsgdW5zaWduZWQgY2hhciBieXRlOyBzaXplX3Qgd29yZDsgfSB2YWw7Cit9OworCisvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaXpzdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgaXpzdHJlYW0KK3sKKyAgICBwdWJsaWM6CisgICAgICAgIGl6c3RyZWFtKCkgOiBtX2ZwKDApIHt9CisgICAgICAgIGl6c3RyZWFtKEZJTEUqIGZwKSA6IG1fZnAoMCkgeyBvcGVuKGZwKTsgfQorICAgICAgICBpenN0cmVhbShjb25zdCBjaGFyKiBuYW1lKSA6IG1fZnAoMCkgeyBvcGVuKG5hbWUpOyB9CisgICAgICAgIH5penN0cmVhbSgpIHsgY2xvc2UoKTsgfQorCisgICAgICAgIC8qIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciByZWFkaW5nLgorICAgICAgICAgKiBvcGVuKCkgY2FuIGJlIHVzZWQgdG8gcmVhZCBhIGZpbGUgd2hpY2ggaXMgbm90IGluIGd6aXAgZm9ybWF0OworICAgICAgICAgKiBpbiB0aGlzIGNhc2UgcmVhZCgpIHdpbGwgZGlyZWN0bHkgcmVhZCBmcm9tIHRoZSBmaWxlIHdpdGhvdXQKKyAgICAgICAgICogZGVjb21wcmVzc2lvbi4gZXJybm8gY2FuIGJlIGNoZWNrZWQgdG8gZGlzdGluZ3Vpc2ggdHdvIGVycm9yCisgICAgICAgICAqIGNhc2VzIChpZiBlcnJubyBpcyB6ZXJvLCB0aGUgemxpYiBlcnJvciBpcyBaX01FTV9FUlJPUikuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9wZW4oY29uc3QgY2hhciogbmFtZSkgeworICAgICAgICAgICAgaWYgKG1fZnApIGNsb3NlKCk7CisgICAgICAgICAgICBtX2ZwID0gOjpnem9wZW4obmFtZSwgInJiIik7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIG9wZW4oRklMRSogZnApIHsKKyAgICAgICAgICAgIFNFVF9CSU5BUllfTU9ERShmcCk7CisgICAgICAgICAgICBpZiAobV9mcCkgY2xvc2UoKTsKKyAgICAgICAgICAgIG1fZnAgPSA6Omd6ZG9wZW4oZmlsZW5vKGZwKSwgInJiIik7CisgICAgICAgIH0KKworICAgICAgICAvKiBGbHVzaGVzIGFsbCBwZW5kaW5nIGlucHV0IGlmIG5lY2Vzc2FyeSwgY2xvc2VzIHRoZSBjb21wcmVzc2VkIGZpbGUKKyAgICAgICAgICogYW5kIGRlYWxsb2NhdGVzIGFsbCB0aGUgKGRlKWNvbXByZXNzaW9uIHN0YXRlLiBUaGUgcmV0dXJuIHZhbHVlIGlzCisgICAgICAgICAqIHRoZSB6bGliIGVycm9yIG51bWJlciAoc2VlIGZ1bmN0aW9uIGVycm9yKCkgYmVsb3cpLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IGNsb3NlKCkgeworICAgICAgICAgICAgaW50IHIgPSA6Omd6Y2xvc2UobV9mcCk7CisgICAgICAgICAgICBtX2ZwID0gMDsgcmV0dXJuIHI7CisgICAgICAgIH0KKworICAgICAgICAvKiBCaW5hcnkgcmVhZCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4KKyAgICAgICAgICovCisgICAgICAgIGludCByZWFkKHZvaWQqIGJ1Ziwgc2l6ZV90IGxlbikgeworICAgICAgICAgICAgcmV0dXJuIDo6Z3pyZWFkKG1fZnAsIGJ1ZiwgbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBsYXN0IGVycm9yIHdoaWNoIG9jY3VycmVkIG9uIHRoZQorICAgICAgICAgKiBnaXZlbiBjb21wcmVzc2VkIGZpbGUuIGVycm51bSBpcyBzZXQgdG8gemxpYiBlcnJvciBudW1iZXIuIElmIGFuCisgICAgICAgICAqIGVycm9yIG9jY3VycmVkIGluIHRoZSBmaWxlIHN5c3RlbSBhbmQgbm90IGluIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5LAorICAgICAgICAgKiBlcnJudW0gaXMgc2V0IHRvIFpfRVJSTk8gYW5kIHRoZSBhcHBsaWNhdGlvbiBtYXkgY29uc3VsdCBlcnJubworICAgICAgICAgKiB0byBnZXQgdGhlIGV4YWN0IGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICBjb25zdCBjaGFyKiBlcnJvcihpbnQqIGVycm51bSkgeworICAgICAgICAgICAgcmV0dXJuIDo6Z3plcnJvcihtX2ZwLCBlcnJudW0pOworICAgICAgICB9CisKKyAgICAgICAgZ3pGaWxlIGZwKCkgeyByZXR1cm4gbV9mcDsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgZ3pGaWxlIG1fZnA7Cit9OworCisvKgorICogQmluYXJ5IHJlYWQgdGhlIGdpdmVuIChhcnJheSBvZikgb2JqZWN0KHMpIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4KKyAqIElmIHRoZSBpbnB1dCBmaWxlIHdhcyBub3QgaW4gZ3ppcCBmb3JtYXQsIHJlYWQoKSBjb3BpZXMgdGhlIG9iamVjdHMgbnVtYmVyCisgKiBvZiBieXRlcyBpbnRvIHRoZSBidWZmZXIuCisgKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHJlYWQKKyAqICgwIGZvciBlbmQgb2YgZmlsZSwgLTEgZm9yIGVycm9yKS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEl0ZW1zPgoraW5saW5lIGludCByZWFkKGl6c3RyZWFtJiB6cywgVCogeCwgSXRlbXMgaXRlbXMpIHsKKyAgICByZXR1cm4gOjpnenJlYWQoenMuZnAoKSwgeCwgaXRlbXMqc2l6ZW9mKFQpKTsKK30KKworLyoKKyAqIEJpbmFyeSBpbnB1dCB3aXRoIHRoZSAnPicgb3BlcmF0b3IuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIGl6c3RyZWFtJiBvcGVyYXRvcj4oaXpzdHJlYW0mIHpzLCBUJiB4KSB7CisgICAgOjpnenJlYWQoenMuZnAoKSwgJngsIHNpemVvZihUKSk7CisgICAgcmV0dXJuIHpzOworfQorCisKK2lubGluZSB6c3RyaW5nbGVuOjp6c3RyaW5nbGVuKGl6c3RyZWFtJiB6cykgeworICAgIHpzID4gdmFsLmJ5dGU7CisgICAgaWYgKHZhbC5ieXRlID09IDI1NSkgenMgPiB2YWwud29yZDsKKyAgICBlbHNlIHZhbC53b3JkID0gdmFsLmJ5dGU7Cit9CisKKy8qCisgKiBSZWFkIGxlbmd0aCBvZiBzdHJpbmcgKyB0aGUgc3RyaW5nIHdpdGggdGhlICc+JyBvcGVyYXRvci4KKyAqLworaW5saW5lIGl6c3RyZWFtJiBvcGVyYXRvcj4oaXpzdHJlYW0mIHpzLCBjaGFyKiB4KSB7CisgICAgenN0cmluZ2xlbiBsZW4oenMpOworICAgIDo6Z3pyZWFkKHpzLmZwKCksIHgsIGxlbi52YWx1ZSgpKTsKKyAgICB4W2xlbi52YWx1ZSgpXSA9ICdcMCc7CisgICAgcmV0dXJuIHpzOworfQorCitpbmxpbmUgY2hhciogcmVhZF9zdHJpbmcoaXpzdHJlYW0mIHpzKSB7CisgICAgenN0cmluZ2xlbiBsZW4oenMpOworICAgIGNoYXIqIHggPSBuZXcgY2hhcltsZW4udmFsdWUoKSsxXTsKKyAgICA6Omd6cmVhZCh6cy5mcCgpLCB4LCBsZW4udmFsdWUoKSk7CisgICAgeFtsZW4udmFsdWUoKV0gPSAnXDAnOworICAgIHJldHVybiB4OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBvenN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBvenN0cmVhbQoreworICAgIHB1YmxpYzoKKyAgICAgICAgb3pzdHJlYW0oKSA6IG1fZnAoMCksIG1fb3MoMCkgeworICAgICAgICB9CisgICAgICAgIG96c3RyZWFtKEZJTEUqIGZwLCBpbnQgbGV2ZWwgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pCisgICAgICAgICAgICA6IG1fZnAoMCksIG1fb3MoMCkgeworICAgICAgICAgICAgb3BlbihmcCwgbGV2ZWwpOworICAgICAgICB9CisgICAgICAgIG96c3RyZWFtKGNvbnN0IGNoYXIqIG5hbWUsIGludCBsZXZlbCA9IFpfREVGQVVMVF9DT01QUkVTU0lPTikKKyAgICAgICAgICAgIDogbV9mcCgwKSwgbV9vcygwKSB7CisgICAgICAgICAgICBvcGVuKG5hbWUsIGxldmVsKTsKKyAgICAgICAgfQorICAgICAgICB+b3pzdHJlYW0oKSB7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyogT3BlbnMgYSBnemlwICguZ3opIGZpbGUgZm9yIHdyaXRpbmcuCisgICAgICAgICAqIFRoZSBjb21wcmVzc2lvbiBsZXZlbCBwYXJhbWV0ZXIgc2hvdWxkIGJlIGluIDAuLjkKKyAgICAgICAgICogZXJybm8gY2FuIGJlIGNoZWNrZWQgdG8gZGlzdGluZ3Vpc2ggdHdvIGVycm9yIGNhc2VzCisgICAgICAgICAqIChpZiBlcnJubyBpcyB6ZXJvLCB0aGUgemxpYiBlcnJvciBpcyBaX01FTV9FUlJPUikuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9wZW4oY29uc3QgY2hhciogbmFtZSwgaW50IGxldmVsID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OKSB7CisgICAgICAgICAgICBjaGFyIG1vZGVbNF0gPSAid2JcMCI7CisgICAgICAgICAgICBpZiAobGV2ZWwgIT0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OKSBtb2RlWzJdID0gJzAnK2xldmVsOworICAgICAgICAgICAgaWYgKG1fZnApIGNsb3NlKCk7CisgICAgICAgICAgICBtX2ZwID0gOjpnem9wZW4obmFtZSwgbW9kZSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBvcGVuIGZyb20gYSBGSUxFIHBvaW50ZXIuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9wZW4oRklMRSogZnAsIGludCBsZXZlbCA9IFpfREVGQVVMVF9DT01QUkVTU0lPTikgeworICAgICAgICAgICAgU0VUX0JJTkFSWV9NT0RFKGZwKTsKKyAgICAgICAgICAgIGNoYXIgbW9kZVs0XSA9ICJ3YlwwIjsKKyAgICAgICAgICAgIGlmIChsZXZlbCAhPSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pIG1vZGVbMl0gPSAnMCcrbGV2ZWw7CisgICAgICAgICAgICBpZiAobV9mcCkgY2xvc2UoKTsKKyAgICAgICAgICAgIG1fZnAgPSA6Omd6ZG9wZW4oZmlsZW5vKGZwKSwgbW9kZSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpZiBuZWNlc3NhcnksIGNsb3NlcyB0aGUgY29tcHJlc3NlZCBmaWxlCisgICAgICAgICAqIGFuZCBkZWFsbG9jYXRlcyBhbGwgdGhlIChkZSljb21wcmVzc2lvbiBzdGF0ZS4gVGhlIHJldHVybiB2YWx1ZSBpcworICAgICAgICAgKiB0aGUgemxpYiBlcnJvciBudW1iZXIgKHNlZSBmdW5jdGlvbiBlcnJvcigpIGJlbG93KS4KKyAgICAgICAgICovCisgICAgICAgIGludCBjbG9zZSgpIHsKKyAgICAgICAgICAgIGlmIChtX29zKSB7CisgICAgICAgICAgICAgICAgOjpnendyaXRlKG1fZnAsIG1fb3MtPnN0cigpLCBtX29zLT5wY291bnQoKSk7CisgICAgICAgICAgICAgICAgZGVsZXRlW10gbV9vcy0+c3RyKCk7IGRlbGV0ZSBtX29zOyBtX29zID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCByID0gOjpnemNsb3NlKG1fZnApOyBtX2ZwID0gMDsgcmV0dXJuIHI7CisgICAgICAgIH0KKworICAgICAgICAvKiBCaW5hcnkgd3JpdGUgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcyBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCisgICAgICAgICAqLworICAgICAgICBpbnQgd3JpdGUoY29uc3Qgdm9pZCogYnVmLCBzaXplX3QgbGVuKSB7CisgICAgICAgICAgICByZXR1cm4gOjpnendyaXRlKG1fZnAsICh2b2lkcCkgYnVmLCBsZW4pOworICAgICAgICB9CisKKyAgICAgICAgLyogRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLiBUaGUgcGFyYW1ldGVyCisgICAgICAgICAqIF9mbHVzaCBpcyBhcyBpbiB0aGUgZGVmbGF0ZSgpIGZ1bmN0aW9uLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB6bGliCisgICAgICAgICAqIGVycm9yIG51bWJlciAoc2VlIGZ1bmN0aW9uIGd6ZXJyb3IgYmVsb3cpLiBmbHVzaCgpIHJldHVybnMgWl9PSyBpZgorICAgICAgICAgKiB0aGUgZmx1c2hfIHBhcmFtZXRlciBpcyBaX0ZJTklTSCBhbmQgYWxsIG91dHB1dCBjb3VsZCBiZSBmbHVzaGVkLgorICAgICAgICAgKiBmbHVzaCgpIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIHN0cmljdGx5IG5lY2Vzc2FyeSBiZWNhdXNlIGl0IGNhbgorICAgICAgICAgKiBkZWdyYWRlIGNvbXByZXNzaW9uLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IGZsdXNoKGludCBfZmx1c2gpIHsKKyAgICAgICAgICAgIG9zX2ZsdXNoKCk7CisgICAgICAgICAgICByZXR1cm4gOjpnemZsdXNoKG1fZnAsIF9mbHVzaCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgbGFzdCBlcnJvciB3aGljaCBvY2N1cnJlZCBvbiB0aGUKKyAgICAgICAgICogZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBlcnJudW0gaXMgc2V0IHRvIHpsaWIgZXJyb3IgbnVtYmVyLiBJZiBhbgorICAgICAgICAgKiBlcnJvciBvY2N1cnJlZCBpbiB0aGUgZmlsZSBzeXN0ZW0gYW5kIG5vdCBpbiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSwKKyAgICAgICAgICogZXJybnVtIGlzIHNldCB0byBaX0VSUk5PIGFuZCB0aGUgYXBwbGljYXRpb24gbWF5IGNvbnN1bHQgZXJybm8KKyAgICAgICAgICogdG8gZ2V0IHRoZSBleGFjdCBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgY29uc3QgY2hhciogZXJyb3IoaW50KiBlcnJudW0pIHsKKyAgICAgICAgICAgIHJldHVybiA6Omd6ZXJyb3IobV9mcCwgZXJybnVtKTsKKyAgICAgICAgfQorCisgICAgICAgIGd6RmlsZSBmcCgpIHsgcmV0dXJuIG1fZnA7IH0KKworICAgICAgICBvc3RyZWFtJiBvcygpIHsKKyAgICAgICAgICAgIGlmIChtX29zID09IDApIG1fb3MgPSBuZXcgb3N0cnN0cmVhbTsKKyAgICAgICAgICAgIHJldHVybiAqbV9vczsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgb3NfZmx1c2goKSB7CisgICAgICAgICAgICBpZiAobV9vcyAmJiBtX29zLT5wY291bnQoKT4wKSB7CisgICAgICAgICAgICAgICAgb3N0cnN0cmVhbSogb3NzID0gbmV3IG9zdHJzdHJlYW07CisgICAgICAgICAgICAgICAgb3NzLT5maWxsKG1fb3MtPmZpbGwoKSk7CisgICAgICAgICAgICAgICAgb3NzLT5mbGFncyhtX29zLT5mbGFncygpKTsKKyAgICAgICAgICAgICAgICBvc3MtPnByZWNpc2lvbihtX29zLT5wcmVjaXNpb24oKSk7CisgICAgICAgICAgICAgICAgb3NzLT53aWR0aChtX29zLT53aWR0aCgpKTsKKyAgICAgICAgICAgICAgICA6Omd6d3JpdGUobV9mcCwgbV9vcy0+c3RyKCksIG1fb3MtPnBjb3VudCgpKTsKKyAgICAgICAgICAgICAgICBkZWxldGVbXSBtX29zLT5zdHIoKTsgZGVsZXRlIG1fb3M7IG1fb3MgPSBvc3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGd6RmlsZSBtX2ZwOworICAgICAgICBvc3Ryc3RyZWFtKiBtX29zOworfTsKKworLyoKKyAqIEJpbmFyeSB3cml0ZSB0aGUgZ2l2ZW4gKGFycmF5IG9mKSBvYmplY3QocykgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLgorICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuCisgKiAoMCBpbiBjYXNlIG9mIGVycm9yKS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEl0ZW1zPgoraW5saW5lIGludCB3cml0ZShvenN0cmVhbSYgenMsIGNvbnN0IFQqIHgsIEl0ZW1zIGl0ZW1zKSB7CisgICAgcmV0dXJuIDo6Z3p3cml0ZSh6cy5mcCgpLCAodm9pZHApIHgsIGl0ZW1zKnNpemVvZihUKSk7Cit9CisKKy8qCisgKiBCaW5hcnkgb3V0cHV0IHdpdGggdGhlICc8JyBvcGVyYXRvci4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFQ+CitpbmxpbmUgb3pzdHJlYW0mIG9wZXJhdG9yPChvenN0cmVhbSYgenMsIGNvbnN0IFQmIHgpIHsKKyAgICA6Omd6d3JpdGUoenMuZnAoKSwgKHZvaWRwKSAmeCwgc2l6ZW9mKFQpKTsKKyAgICByZXR1cm4genM7Cit9CisKK2lubGluZSB6c3RyaW5nbGVuOjp6c3RyaW5nbGVuKG96c3RyZWFtJiB6cywgY29uc3QgY2hhciogeCkgeworICAgIHZhbC5ieXRlID0gMjU1OyAgdmFsLndvcmQgPSA6OnN0cmxlbih4KTsKKyAgICBpZiAodmFsLndvcmQgPCAyNTUpIHpzIDwgKHZhbC5ieXRlID0gdmFsLndvcmQpOworICAgIGVsc2UgenMgPCB2YWw7Cit9CisKKy8qCisgKiBXcml0ZSBsZW5ndGggb2Ygc3RyaW5nICsgdGhlIHN0cmluZyB3aXRoIHRoZSAnPCcgb3BlcmF0b3IuCisgKi8KK2lubGluZSBvenN0cmVhbSYgb3BlcmF0b3I8KG96c3RyZWFtJiB6cywgY29uc3QgY2hhciogeCkgeworICAgIHpzdHJpbmdsZW4gbGVuKHpzLCB4KTsKKyAgICA6Omd6d3JpdGUoenMuZnAoKSwgKHZvaWRwKSB4LCBsZW4udmFsdWUoKSk7CisgICAgcmV0dXJuIHpzOworfQorCisjaWZkZWYgX01TQ19WRVIKK2lubGluZSBvenN0cmVhbSYgb3BlcmF0b3I8KG96c3RyZWFtJiB6cywgY2hhciogY29uc3QmIHgpIHsKKyAgICByZXR1cm4genMgPCAoY29uc3QgY2hhciopIHg7Cit9CisjZW5kaWYKKworLyoKKyAqIEFzY2lpIHdyaXRlIHdpdGggdGhlIDw8IG9wZXJhdG9yOworICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG96c3RyZWFtJiB6cywgY29uc3QgVCYgeCkgeworICAgIHpzLm9zX2ZsdXNoKCk7CisgICAgcmV0dXJuIHpzLm9zKCkgPDwgeDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL2lvc3RyZWFtMi96c3RyZWFtX3Rlc3QuY3BwIGIvemxpYi9zcmMvY29udHJpYi9pb3N0cmVhbTIvenN0cmVhbV90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjczZjYyCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9pb3N0cmVhbTIvenN0cmVhbV90ZXN0LmNwcApAQCAtMCwwICsxLDI1IEBACisjaW5jbHVkZSAienN0cmVhbS5oIgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpb21hbmlwLmg+CisKK3ZvaWQgbWFpbigpIHsKKyAgICBjaGFyIGhbMjU2XSA9ICJIZWxsbyI7CisgICAgY2hhciogZyA9ICJHb29kYnllIjsKKyAgICBvenN0cmVhbSBvdXQoInRlbXAuZ3oiKTsKKyAgICBvdXQgPCAiVGhpcyB3b3JrcyB3ZWxsIiA8IGggPCBnOworICAgIG91dC5jbG9zZSgpOworCisgICAgaXpzdHJlYW0gaW4oInRlbXAuZ3oiKTsgLy8gcmVhZCBpdCBiYWNrCisgICAgY2hhciAqeCA9IHJlYWRfc3RyaW5nKGluKSwgKnkgPSBuZXcgY2hhclsyNTZdLCB6WzI1Nl07CisgICAgaW4gPiB5ID4gejsKKyAgICBpbi5jbG9zZSgpOworICAgIGNvdXQgPDwgeCA8PCBlbmRsIDw8IHkgPDwgZW5kbCA8PCB6IDw8IGVuZGw7CisKKyAgICBvdXQub3BlbigidGVtcC5neiIpOyAvLyB0cnkgYXNjaWkgb3V0cHV0OyB6Y2F0IHRlbXAuZ3ogdG8gc2VlIHRoZSByZXN1bHRzCisgICAgb3V0IDw8IHNldHcoNTApIDw8IHNldGZpbGwoJyMnKSA8PCBzZXRwcmVjaXNpb24oMjApIDw8IHggPDwgZW5kbCA8PCB5IDw8IGVuZGwgPDwgeiA8PCBlbmRsOworICAgIG91dCA8PCB6IDw8IGVuZGwgPDwgeSA8PCBlbmRsIDw8IHggPDwgZW5kbDsKKyAgICBvdXQgPDwgMS4xMjM0NTY3ODkwMTIzNDU2Nzg5IDw8IGVuZGw7CisKKyAgICBkZWxldGVbXSB4OyBkZWxldGVbXSB5OworfQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9pb3N0cmVhbTMvUkVBRE1FIGIvemxpYi9zcmMvY29udHJpYi9pb3N0cmVhbTMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YjMxOWEKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL2lvc3RyZWFtMy9SRUFETUUKQEAgLTAsMCArMSwzNSBAQAorVGhlc2UgY2xhc3NlcyBwcm92aWRlIGEgQysrIHN0cmVhbSBpbnRlcmZhY2UgdG8gdGhlIHpsaWIgbGlicmFyeS4gSXQgYWxsb3dzIHlvdQordG8gZG8gdGhpbmdzIGxpa2U6CisKKyAgZ3pvZnN0cmVhbSBvdXRmKCJibGFoLmd6Iik7CisgIG91dGYgPDwgIlRoZXNlIGdvIGludG8gdGhlIGd6aXAgZmlsZSAiIDw8IDEyMyA8PCBlbmRsOworCitJdCBkb2VzIHRoaXMgYnkgZGVyaXZpbmcgYSBzcGVjaWFsaXplZCBzdHJlYW0gYnVmZmVyIGZvciBnemlwcGVkIGZpbGVzLCB3aGljaCBpcwordGhlIHdheSBTdHJvdXN0cnVwIHdvdWxkIGhhdmUgZG9uZSBpdC4gOi0+CisKK1RoZSBnemlmc3RyZWFtIGFuZCBnem9mc3RyZWFtIGNsYXNzZXMgd2VyZSBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgS2V2aW4gUnVsYW5kCithbmQgbWFkZSBhdmFpbGFibGUgaW4gdGhlIHpsaWIgY29udHJpYi9pb3N0cmVhbSBkaXJlY3RvcnkuIFRoZSBvbGRlciB2ZXJzaW9uIHN0aWxsCitjb21waWxlcyB1bmRlciBnY2MgMi54eCwgYnV0IG5vdCB1bmRlciBnY2MgMy54eCwgd2hpY2ggc3BhcmtlZCB0aGUgZGV2ZWxvcG1lbnQgb2YKK3RoaXMgdmVyc2lvbi4KKworVGhlIG5ldyBjbGFzc2VzIGFyZSBhcyBzdGFuZGFyZC1jb21wbGlhbnQgYXMgcG9zc2libGUsIGNsb3NlbHkgZm9sbG93aW5nIHRoZQorYXBwcm9hY2ggb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkncyBmc3RyZWFtIGNsYXNzZXMuIEl0IGNvbXBpbGVzIHVuZGVyIGdjYyB2ZXJzaW9ucworMy4yIGFuZCAzLjMsIGJ1dCBub3QgdW5kZXIgZ2NjIDIueHguIFRoaXMgaXMgbWFpbmx5IGR1ZSB0byBjaGFuZ2VzIGluIHRoZSBzdGFuZGFyZAorbGlicmFyeSBuYW1pbmcgc2NoZW1lLiBUaGUgbmV3IHZlcnNpb24gb2YgZ3ppZnN0cmVhbS9nem9mc3RyZWFtL2d6ZmlsZWJ1ZiBkaWZmZXJzCitmcm9tIHRoZSBwcmV2aW91cyBvbmUgaW4gdGhlIGZvbGxvd2luZyByZXNwZWN0czoKKy0gYWRkZWQgc2hvd21hbnljCistIGFkZGVkIHNldGJ1Ziwgd2l0aCBzdXBwb3J0IGZvciB1bmJ1ZmZlcmVkIG91dHB1dCB2aWEgc2V0YnVmKDAsMCkKKy0gYSBmZXcgYnVnIGZpeGVzIG9mIHN0cmVhbSBiZWhhdmlvcgorLSBnemlwcGVkIG91dHB1dCBmaWxlIG9wZW5lZCB3aXRoIGRlZmF1bHQgY29tcHJlc3Npb24gbGV2ZWwgaW5zdGVhZCBvZiBtYXhpbXVtIGxldmVsCistIHNldGNvbXByZXNzaW9ubGV2ZWwoKS9zdHJhdGVneSgpIG1lbWJlcnMgcmVwbGFjZWQgYnkgc2luZ2xlIHNldGNvbXByZXNzaW9uKCkKKworVGhlIGNvZGUgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCB0aGUgcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZQorYW5kIHNlbGwgaXQgZm9yIGFueSBwdXJwb3NlIHdpdGhvdXQgZmVlLgorCitMdWR3aWcgU2Nod2FyZHQKKzxzY2h3YXJkdEBzdW4uYWMuemE+CisKK0RTUCBMYWIKK0VsZWN0cmljYWwgJiBFbGVjdHJvbmljIEVuZ2luZWVyaW5nIERlcGFydG1lbnQKK1VuaXZlcnNpdHkgb2YgU3RlbGxlbmJvc2NoCitTb3V0aCBBZnJpY2EKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvaW9zdHJlYW0zL1RPRE8gYi96bGliL3NyYy9jb250cmliL2lvc3RyZWFtMy9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMzJmOTcKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL2lvc3RyZWFtMy9UT0RPCkBAIC0wLDAgKzEsMTcgQEAKK1Bvc3NpYmxlIHVwZ3JhZGVzIHRvIGd6ZmlsZWJ1ZjoKKworLSBUaGUgYWJpbGl0eSB0byBkbyBwdXRiYWNrIChlLmcuIHB1dGJhY2tmYWlsKQorCistIFRoZSBhYmlsaXR5IHRvIHNlZWsgKHpsaWIgc3VwcG9ydHMgdGhpcywgYnV0IGNvdWxkIGJlIHNsb3cvdHJpY2t5KQorCistIFNpbXVsdGFuZW91cyByZWFkL3dyaXRlIGFjY2VzcyAoZG9lcyBpdCBtYWtlIHNlbnNlPykKKworLSBTdXBwb3J0IGZvciBpb3NfYmFzZTo6YXRlIG9wZW4gbW9kZQorCistIExvY2FsZSBzdXBwb3J0PworCistIENoZWNrIHB1YmxpYyBpbnRlcmZhY2UgdG8gc2VlIHdoaWNoIGNhbGxzIGdpdmUgcHJvYmxlbXMKKyAgKGR1ZSB0byBkZXBlbmRlbmNlIG9uIGxpYnJhcnkgaW50ZXJuYWxzKQorCistIE92ZXJyaWRlIG9wZXJhdG9yPDwob3N0cmVhbSYsIGd6ZmlsZWJ1ZiopIHRvIGFsbG93IGRpcmVjdCBjb3B5aW5nCisgIG9mIHN0cmVhbSBidWZmZXIgdG8gc3RyZWFtICggaS5lLiBvcyA8PCBpcy5yZGJ1ZigpOyApCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL2lvc3RyZWFtMy90ZXN0LmNjIGIvemxpYi9zcmMvY29udHJpYi9pb3N0cmVhbTMvdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDIzNTMzCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9pb3N0cmVhbTMvdGVzdC5jYwpAQCAtMCwwICsxLDUwIEBACisvKgorICogVGVzdCBwcm9ncmFtIGZvciBnemlmc3RyZWFtIGFuZCBnem9mc3RyZWFtCisgKgorICogYnkgTHVkd2lnIFNjaHdhcmR0IDxzY2h3YXJkdEBzdW4uYWMuemE+CisgKiBvcmlnaW5hbCB2ZXJzaW9uIGJ5IEtldmluIFJ1bGFuZCA8a2V2aW5Acm9kaW4ud3VzdGwuZWR1PgorICovCisKKyNpbmNsdWRlICJ6ZnN0cmVhbS5oIgorI2luY2x1ZGUgPGlvc3RyZWFtPiAgICAgIC8vIGZvciBjb3V0CisKK2ludCBtYWluKCkgeworCisgIGd6b2ZzdHJlYW0gb3V0ZjsKKyAgZ3ppZnN0cmVhbSBpbmY7CisgIGNoYXIgYnVmWzgwXTsKKworICBvdXRmLm9wZW4oInRlc3QxLnR4dC5neiIpOworICBvdXRmIDw8ICJUaGUgcXVpY2sgYnJvd24gZm94IHNpZGVzdGVwcGVkIHRoZSBsYXp5IGNhbmluZVxuIgorICAgICAgIDw8IDEuMyA8PCAiXG5QbGFuICIgPDwgOSA8PCBzdGQ6OmVuZGw7CisgIG91dGYuY2xvc2UoKTsKKyAgc3RkOjpjb3V0IDw8ICJXcm90ZSB0aGUgZm9sbG93aW5nIG1lc3NhZ2UgdG8gJ3Rlc3QxLnR4dC5neicgKGNoZWNrIHdpdGggemNhdCBvciB6bGVzcyk6XG4iCisgICAgICAgICAgICA8PCAiVGhlIHF1aWNrIGJyb3duIGZveCBzaWRlc3RlcHBlZCB0aGUgbGF6eSBjYW5pbmVcbiIKKyAgICAgICAgICAgIDw8IDEuMyA8PCAiXG5QbGFuICIgPDwgOSA8PCBzdGQ6OmVuZGw7CisKKyAgc3RkOjpjb3V0IDw8ICJcblJlYWRpbmcgJ3Rlc3QxLnR4dC5neicgKGJ1ZmZlcmVkKSBwcm9kdWNlczpcbiI7CisgIGluZi5vcGVuKCJ0ZXN0MS50eHQuZ3oiKTsKKyAgd2hpbGUgKGluZi5nZXRsaW5lKGJ1Ziw4MCwnXG4nKSkgeworICAgIHN0ZDo6Y291dCA8PCBidWYgPDwgIlx0KCIgPDwgaW5mLnJkYnVmKCktPmluX2F2YWlsKCkgPDwgIiBjaGFycyBsZWZ0IGluIGJ1ZmZlcilcbiI7CisgIH0KKyAgaW5mLmNsb3NlKCk7CisKKyAgb3V0Zi5yZGJ1ZigpLT5wdWJzZXRidWYoMCwwKTsKKyAgb3V0Zi5vcGVuKCJ0ZXN0Mi50eHQuZ3oiKTsKKyAgb3V0ZiA8PCBzZXRjb21wcmVzc2lvbihaX05PX0NPTVBSRVNTSU9OKQorICAgICAgIDw8ICJUaGUgcXVpY2sgYnJvd24gZm94IHNpZGVzdGVwcGVkIHRoZSBsYXp5IGNhbmluZVxuIgorICAgICAgIDw8IDEuMyA8PCAiXG5QbGFuICIgPDwgOSA8PCBzdGQ6OmVuZGw7CisgIG91dGYuY2xvc2UoKTsKKyAgc3RkOjpjb3V0IDw8ICJcbldyb3RlIHRoZSBzYW1lIG1lc3NhZ2UgdG8gJ3Rlc3QyLnR4dC5neicgaW4gdW5jb21wcmVzc2VkIGZvcm0iOworCisgIHN0ZDo6Y291dCA8PCAiXG5SZWFkaW5nICd0ZXN0Mi50eHQuZ3onICh1bmJ1ZmZlcmVkKSBwcm9kdWNlczpcbiI7CisgIGluZi5yZGJ1ZigpLT5wdWJzZXRidWYoMCwwKTsKKyAgaW5mLm9wZW4oInRlc3QyLnR4dC5neiIpOworICB3aGlsZSAoaW5mLmdldGxpbmUoYnVmLDgwLCdcbicpKSB7CisgICAgc3RkOjpjb3V0IDw8IGJ1ZiA8PCAiXHQoIiA8PCBpbmYucmRidWYoKS0+aW5fYXZhaWwoKSA8PCAiIGNoYXJzIGxlZnQgaW4gYnVmZmVyKVxuIjsKKyAgfQorICBpbmYuY2xvc2UoKTsKKworICByZXR1cm4gMDsKKworfQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9pb3N0cmVhbTMvemZzdHJlYW0uY2MgYi96bGliL3NyYy9jb250cmliL2lvc3RyZWFtMy96ZnN0cmVhbS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGViOTMzCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9pb3N0cmVhbTMvemZzdHJlYW0uY2MKQEAgLTAsMCArMSw0NzkgQEAKKy8qCisgKiBBIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UgdG8gdGhlIHpsaWIgZ3oqIGZ1bmN0aW9ucworICoKKyAqIGJ5IEx1ZHdpZyBTY2h3YXJkdCA8c2Nod2FyZHRAc3VuLmFjLnphPgorICogb3JpZ2luYWwgdmVyc2lvbiBieSBLZXZpbiBSdWxhbmQgPGtldmluQHJvZGluLnd1c3RsLmVkdT4KKyAqCisgKiBUaGlzIHZlcnNpb24gaXMgc3RhbmRhcmQtY29tcGxpYW50IGFuZCBjb21wYXRpYmxlIHdpdGggZ2NjIDMueC4KKyAqLworCisjaW5jbHVkZSAiemZzdHJlYW0uaCIKKyNpbmNsdWRlIDxjc3RyaW5nPiAgICAgICAgICAvLyBmb3Igc3RyY3B5LCBzdHJjYXQsIHN0cmxlbiAobW9kZSBzdHJpbmdzKQorI2luY2x1ZGUgPGNzdGRpbz4gICAgICAgICAgIC8vIGZvciBCVUZTSVoKKworLy8gSW50ZXJuYWwgYnVmZmVyIHNpemVzIChkZWZhdWx0IGFuZCAidW5idWZmZXJlZCIgdmVyc2lvbnMpCisjZGVmaW5lIEJJR0JVRlNJWkUgQlVGU0laCisjZGVmaW5lIFNNQUxMQlVGU0laRSAxCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorZ3pmaWxlYnVmOjpnemZpbGVidWYoKQorOiBmaWxlKE5VTEwpLCBpb19tb2RlKHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlKDApKSwgb3duX2ZkKGZhbHNlKSwKKyAgYnVmZmVyKE5VTEwpLCBidWZmZXJfc2l6ZShCSUdCVUZTSVpFKSwgb3duX2J1ZmZlcih0cnVlKQoreworICAvLyBObyBidWZmZXJzIHRvIHN0YXJ0IHdpdGgKKyAgdGhpcy0+ZGlzYWJsZV9idWZmZXIoKTsKK30KKworLy8gRGVzdHJ1Y3RvcgorZ3pmaWxlYnVmOjp+Z3pmaWxlYnVmKCkKK3sKKyAgLy8gU3luYyBvdXRwdXQgYnVmZmVyIGFuZCBjbG9zZSBvbmx5IGlmIHJlc3BvbnNpYmxlIGZvciBmaWxlCisgIC8vIChpLmUuIGF0dGFjaGVkIHN0cmVhbXMgc2hvdWxkIGJlIGxlZnQgb3BlbiBhdCB0aGlzIHN0YWdlKQorICB0aGlzLT5zeW5jKCk7CisgIGlmIChvd25fZmQpCisgICAgdGhpcy0+Y2xvc2UoKTsKKyAgLy8gTWFrZSBzdXJlIGludGVybmFsIGJ1ZmZlciBpcyBkZWFsbG9jYXRlZAorICB0aGlzLT5kaXNhYmxlX2J1ZmZlcigpOworfQorCisvLyBTZXQgY29tcHJlc3Npb24gbGV2ZWwgYW5kIHN0cmF0ZWd5CitpbnQKK2d6ZmlsZWJ1Zjo6c2V0Y29tcHJlc3Npb24oaW50IGNvbXBfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wX3N0cmF0ZWd5KQoreworICByZXR1cm4gZ3pzZXRwYXJhbXMoZmlsZSwgY29tcF9sZXZlbCwgY29tcF9zdHJhdGVneSk7Cit9CisKKy8vIE9wZW4gZ3ppcHBlZCBmaWxlCitnemZpbGVidWYqCitnemZpbGVidWY6Om9wZW4oY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlKQoreworICAvLyBGYWlsIGlmIGZpbGUgYWxyZWFkeSBvcGVuCisgIGlmICh0aGlzLT5pc19vcGVuKCkpCisgICAgcmV0dXJuIE5VTEw7CisgIC8vIERvbid0IHN1cHBvcnQgc2ltdWx0YW5lb3VzIHJlYWQvd3JpdGUgYWNjZXNzICh5ZXQpCisgIGlmICgobW9kZSAmIHN0ZDo6aW9zX2Jhc2U6OmluKSAmJiAobW9kZSAmIHN0ZDo6aW9zX2Jhc2U6Om91dCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLy8gQnVpbGQgbW9kZSBzdHJpbmcgZm9yIGd6b3BlbiBhbmQgY2hlY2sgaXQgWzI3LjguMS4zLjJdCisgIGNoYXIgY2hhcl9tb2RlWzZdID0gIlwwXDBcMFwwXDAiOworICBpZiAoIXRoaXMtPm9wZW5fbW9kZShtb2RlLCBjaGFyX21vZGUpKQorICAgIHJldHVybiBOVUxMOworCisgIC8vIEF0dGVtcHQgdG8gb3BlbiBmaWxlCisgIGlmICgoZmlsZSA9IGd6b3BlbihuYW1lLCBjaGFyX21vZGUpKSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIC8vIE9uIHN1Y2Nlc3MsIGFsbG9jYXRlIGludGVybmFsIGJ1ZmZlciBhbmQgc2V0IGZsYWdzCisgIHRoaXMtPmVuYWJsZV9idWZmZXIoKTsKKyAgaW9fbW9kZSA9IG1vZGU7CisgIG93bl9mZCA9IHRydWU7CisgIHJldHVybiB0aGlzOworfQorCisvLyBBdHRhY2ggdG8gZ3ppcHBlZCBmaWxlCitnemZpbGVidWYqCitnemZpbGVidWY6OmF0dGFjaChpbnQgZmQsCisgICAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlKQoreworICAvLyBGYWlsIGlmIGZpbGUgYWxyZWFkeSBvcGVuCisgIGlmICh0aGlzLT5pc19vcGVuKCkpCisgICAgcmV0dXJuIE5VTEw7CisgIC8vIERvbid0IHN1cHBvcnQgc2ltdWx0YW5lb3VzIHJlYWQvd3JpdGUgYWNjZXNzICh5ZXQpCisgIGlmICgobW9kZSAmIHN0ZDo6aW9zX2Jhc2U6OmluKSAmJiAobW9kZSAmIHN0ZDo6aW9zX2Jhc2U6Om91dCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLy8gQnVpbGQgbW9kZSBzdHJpbmcgZm9yIGd6ZG9wZW4gYW5kIGNoZWNrIGl0IFsyNy44LjEuMy4yXQorICBjaGFyIGNoYXJfbW9kZVs2XSA9ICJcMFwwXDBcMFwwIjsKKyAgaWYgKCF0aGlzLT5vcGVuX21vZGUobW9kZSwgY2hhcl9tb2RlKSkKKyAgICByZXR1cm4gTlVMTDsKKworICAvLyBBdHRlbXB0IHRvIGF0dGFjaCB0byBmaWxlCisgIGlmICgoZmlsZSA9IGd6ZG9wZW4oZmQsIGNoYXJfbW9kZSkpID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLy8gT24gc3VjY2VzcywgYWxsb2NhdGUgaW50ZXJuYWwgYnVmZmVyIGFuZCBzZXQgZmxhZ3MKKyAgdGhpcy0+ZW5hYmxlX2J1ZmZlcigpOworICBpb19tb2RlID0gbW9kZTsKKyAgb3duX2ZkID0gZmFsc2U7CisgIHJldHVybiB0aGlzOworfQorCisvLyBDbG9zZSBnemlwcGVkIGZpbGUKK2d6ZmlsZWJ1ZioKK2d6ZmlsZWJ1Zjo6Y2xvc2UoKQoreworICAvLyBGYWlsIGltbWVkaWF0ZWx5IGlmIG5vIGZpbGUgaXMgb3BlbgorICBpZiAoIXRoaXMtPmlzX29wZW4oKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgLy8gQXNzdW1lIHN1Y2Nlc3MKKyAgZ3pmaWxlYnVmKiByZXR2YWwgPSB0aGlzOworICAvLyBBdHRlbXB0IHRvIHN5bmMgYW5kIGNsb3NlIGd6aXBwZWQgZmlsZQorICBpZiAodGhpcy0+c3luYygpID09IC0xKQorICAgIHJldHZhbCA9IE5VTEw7CisgIGlmIChnemNsb3NlKGZpbGUpIDwgMCkKKyAgICByZXR2YWwgPSBOVUxMOworICAvLyBGaWxlIGlzIG5vdyBnb25lIGFueXdheSAocG9zdGNvbmRpdGlvbiBbMjcuOC4xLjMuOF0pCisgIGZpbGUgPSBOVUxMOworICBvd25fZmQgPSBmYWxzZTsKKyAgLy8gRGVzdHJveSBpbnRlcm5hbCBidWZmZXIgaWYgaXQgZXhpc3RzCisgIHRoaXMtPmRpc2FibGVfYnVmZmVyKCk7CisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KKworLy8gQ29udmVydCBpbnQgb3BlbiBtb2RlIHRvIG1vZGUgc3RyaW5nCitib29sCitnemZpbGVidWY6Om9wZW5fbW9kZShzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgY2hhciogY19tb2RlKSBjb25zdAoreworICBib29sIHRlc3RiID0gbW9kZSAmIHN0ZDo6aW9zX2Jhc2U6OmJpbmFyeTsKKyAgYm9vbCB0ZXN0aSA9IG1vZGUgJiBzdGQ6Omlvc19iYXNlOjppbjsKKyAgYm9vbCB0ZXN0byA9IG1vZGUgJiBzdGQ6Omlvc19iYXNlOjpvdXQ7CisgIGJvb2wgdGVzdHQgPSBtb2RlICYgc3RkOjppb3NfYmFzZTo6dHJ1bmM7CisgIGJvb2wgdGVzdGEgPSBtb2RlICYgc3RkOjppb3NfYmFzZTo6YXBwOworCisgIC8vIENoZWNrIGZvciB2YWxpZCBmbGFnIGNvbWJpbmF0aW9ucyAtIHNlZSBbMjcuOC4xLjMuMl0gKFRhYmxlIDkyKQorICAvLyBPcmlnaW5hbCB6ZnN0cmVhbSBoYXJkY29kZWQgdGhlIGNvbXByZXNzaW9uIGxldmVsIHRvIG1heGltdW0gaGVyZS4uLgorICAvLyBEb3VibGUgdGhlIHRpbWUgZm9yIGxlc3MgdGhhbiAxJSBzaXplIGltcHJvdmVtZW50IHNlZW1zCisgIC8vIGV4Y2Vzc2l2ZSB0aG91Z2ggLSBrZWVwaW5nIGl0IGF0IHRoZSBkZWZhdWx0IGxldmVsCisgIC8vIFRvIGNoYW5nZSBiYWNrLCBqdXN0IGFwcGVuZCAiOSIgdG8gdGhlIG5leHQgdGhyZWUgbW9kZSBzdHJpbmdzCisgIGlmICghdGVzdGkgJiYgdGVzdG8gJiYgIXRlc3R0ICYmICF0ZXN0YSkKKyAgICBzdHJjcHkoY19tb2RlLCAidyIpOworICBpZiAoIXRlc3RpICYmIHRlc3RvICYmICF0ZXN0dCAmJiB0ZXN0YSkKKyAgICBzdHJjcHkoY19tb2RlLCAiYSIpOworICBpZiAoIXRlc3RpICYmIHRlc3RvICYmIHRlc3R0ICYmICF0ZXN0YSkKKyAgICBzdHJjcHkoY19tb2RlLCAidyIpOworICBpZiAodGVzdGkgJiYgIXRlc3RvICYmICF0ZXN0dCAmJiAhdGVzdGEpCisgICAgc3RyY3B5KGNfbW9kZSwgInIiKTsKKyAgLy8gTm8gcmVhZC93cml0ZSBtb2RlIHlldAorLy8gIGlmICh0ZXN0aSAmJiB0ZXN0byAmJiAhdGVzdHQgJiYgIXRlc3RhKQorLy8gICAgc3RyY3B5KGNfbW9kZSwgInIrIik7CisvLyAgaWYgKHRlc3RpICYmIHRlc3RvICYmIHRlc3R0ICYmICF0ZXN0YSkKKy8vICAgIHN0cmNweShjX21vZGUsICJ3KyIpOworCisgIC8vIE1vZGUgc3RyaW5nIHNob3VsZCBiZSBlbXB0eSBmb3IgaW52YWxpZCBjb21iaW5hdGlvbiBvZiBmbGFncworICBpZiAoc3RybGVuKGNfbW9kZSkgPT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICh0ZXN0YikKKyAgICBzdHJjYXQoY19tb2RlLCAiYiIpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRGV0ZXJtaW5lIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGludGVybmFsIGdldCBidWZmZXIKK3N0ZDo6c3RyZWFtc2l6ZQorZ3pmaWxlYnVmOjpzaG93bWFueWMoKQoreworICAvLyBDYWxscyB0byB1bmRlcmZsb3cgd2lsbCBmYWlsIGlmIGZpbGUgbm90IG9wZW5lZCBmb3IgcmVhZGluZworICBpZiAoIXRoaXMtPmlzX29wZW4oKSB8fCAhKGlvX21vZGUgJiBzdGQ6Omlvc19iYXNlOjppbikpCisgICAgcmV0dXJuIC0xOworICAvLyBNYWtlIHN1cmUgZ2V0IGFyZWEgaXMgaW4gdXNlCisgIGlmICh0aGlzLT5ncHRyKCkgJiYgKHRoaXMtPmdwdHIoKSA8IHRoaXMtPmVncHRyKCkpKQorICAgIHJldHVybiBzdGQ6OnN0cmVhbXNpemUodGhpcy0+ZWdwdHIoKSAtIHRoaXMtPmdwdHIoKSk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworLy8gRmlsbCBnZXQgYXJlYSBmcm9tIGd6aXBwZWQgZmlsZQorZ3pmaWxlYnVmOjppbnRfdHlwZQorZ3pmaWxlYnVmOjp1bmRlcmZsb3coKQoreworICAvLyBJZiBzb21ldGhpbmcgaXMgbGVmdCBpbiB0aGUgZ2V0IGFyZWEgYnkgY2hhbmNlLCByZXR1cm4gaXQKKyAgLy8gKHRoaXMgc2hvdWxkbid0IG5vcm1hbGx5IGhhcHBlbiwgYXMgdW5kZXJmbG93IGlzIG9ubHkgc3VwcG9zZWQKKyAgLy8gdG8gYmUgY2FsbGVkIHdoZW4gZ3B0ciA+PSBlZ3B0ciwgYnV0IGl0IHNlcnZlcyBhcyBlcnJvciBjaGVjaykKKyAgaWYgKHRoaXMtPmdwdHIoKSAmJiAodGhpcy0+Z3B0cigpIDwgdGhpcy0+ZWdwdHIoKSkpCisgICAgcmV0dXJuIHRyYWl0c190eXBlOjp0b19pbnRfdHlwZSgqKHRoaXMtPmdwdHIoKSkpOworCisgIC8vIElmIHRoZSBmaWxlIGhhc24ndCBiZWVuIG9wZW5lZCBmb3IgcmVhZGluZywgcHJvZHVjZSBlcnJvcgorICBpZiAoIXRoaXMtPmlzX29wZW4oKSB8fCAhKGlvX21vZGUgJiBzdGQ6Omlvc19iYXNlOjppbikpCisgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKKworICAvLyBBdHRlbXB0IHRvIGZpbGwgaW50ZXJuYWwgYnVmZmVyIGZyb20gZ3ppcHBlZCBmaWxlCisgIC8vIChidWZmZXIgbXVzdCBiZSBndWFyYW50ZWVkIHRvIGV4aXN0Li4uKQorICBpbnQgYnl0ZXNfcmVhZCA9IGd6cmVhZChmaWxlLCBidWZmZXIsIGJ1ZmZlcl9zaXplKTsKKyAgLy8gSW5kaWNhdGVzIGVycm9yIG9yIEVPRgorICBpZiAoYnl0ZXNfcmVhZCA8PSAwKQorICB7CisgICAgLy8gUmVzZXQgZ2V0IGFyZWEKKyAgICB0aGlzLT5zZXRnKGJ1ZmZlciwgYnVmZmVyLCBidWZmZXIpOworICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgIH0KKyAgLy8gTWFrZSBhbGwgYnl0ZXMgcmVhZCBmcm9tIGZpbGUgYXZhaWxhYmxlIGFzIGdldCBhcmVhCisgIHRoaXMtPnNldGcoYnVmZmVyLCBidWZmZXIsIGJ1ZmZlciArIGJ5dGVzX3JlYWQpOworCisgIC8vIFJldHVybiBuZXh0IGNoYXJhY3RlciBpbiBnZXQgYXJlYQorICByZXR1cm4gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCoodGhpcy0+Z3B0cigpKSk7Cit9CisKKy8vIFdyaXRlIHB1dCBhcmVhIHRvIGd6aXBwZWQgZmlsZQorZ3pmaWxlYnVmOjppbnRfdHlwZQorZ3pmaWxlYnVmOjpvdmVyZmxvdyhpbnRfdHlwZSBjKQoreworICAvLyBEZXRlcm1pbmUgd2hldGhlciBwdXQgYXJlYSBpcyBpbiB1c2UKKyAgaWYgKHRoaXMtPnBiYXNlKCkpCisgIHsKKyAgICAvLyBEb3VibGUtY2hlY2sgcG9pbnRlciByYW5nZQorICAgIGlmICh0aGlzLT5wcHRyKCkgPiB0aGlzLT5lcHB0cigpIHx8IHRoaXMtPnBwdHIoKSA8IHRoaXMtPnBiYXNlKCkpCisgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworICAgIC8vIEFkZCBleHRyYSBjaGFyYWN0ZXIgdG8gYnVmZmVyIGlmIG5vdCBFT0YKKyAgICBpZiAoIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShjLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQorICAgIHsKKyAgICAgICoodGhpcy0+cHB0cigpKSA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoYyk7CisgICAgICB0aGlzLT5wYnVtcCgxKTsKKyAgICB9CisgICAgLy8gTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gd3JpdGUgdG8gZmlsZQorICAgIGludCBieXRlc190b193cml0ZSA9IHRoaXMtPnBwdHIoKSAtIHRoaXMtPnBiYXNlKCk7CisgICAgLy8gT3ZlcmZsb3cgZG9lc24ndCBmYWlsIGlmIG5vdGhpbmcgaXMgdG8gYmUgd3JpdHRlbgorICAgIGlmIChieXRlc190b193cml0ZSA+IDApCisgICAgeworICAgICAgLy8gSWYgdGhlIGZpbGUgaGFzbid0IGJlZW4gb3BlbmVkIGZvciB3cml0aW5nLCBwcm9kdWNlIGVycm9yCisgICAgICBpZiAoIXRoaXMtPmlzX29wZW4oKSB8fCAhKGlvX21vZGUgJiBzdGQ6Omlvc19iYXNlOjpvdXQpKQorICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgLy8gSWYgZ3ppcHBlZCBmaWxlIHdvbid0IGFjY2VwdCBhbGwgYnl0ZXMgd3JpdHRlbiB0byBpdCwgZmFpbAorICAgICAgaWYgKGd6d3JpdGUoZmlsZSwgdGhpcy0+cGJhc2UoKSwgYnl0ZXNfdG9fd3JpdGUpICE9IGJ5dGVzX3RvX3dyaXRlKQorICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgLy8gUmVzZXQgbmV4dCBwb2ludGVyIHRvIHBvaW50IHRvIHBiYXNlIG9uIHN1Y2Nlc3MKKyAgICAgIHRoaXMtPnBidW1wKC1ieXRlc190b193cml0ZSk7CisgICAgfQorICB9CisgIC8vIFdyaXRlIGV4dHJhIGNoYXJhY3RlciB0byBmaWxlIGlmIG5vdCBFT0YKKyAgZWxzZSBpZiAoIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShjLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQorICB7CisgICAgLy8gSWYgdGhlIGZpbGUgaGFzbid0IGJlZW4gb3BlbmVkIGZvciB3cml0aW5nLCBwcm9kdWNlIGVycm9yCisgICAgaWYgKCF0aGlzLT5pc19vcGVuKCkgfHwgIShpb19tb2RlICYgc3RkOjppb3NfYmFzZTo6b3V0KSkKKyAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgLy8gSW1wcm9tcHR1IGNoYXIgYnVmZmVyIChhbGxvd3MgInVuYnVmZmVyZWQiIG91dHB1dCkKKyAgICBjaGFyX3R5cGUgbGFzdF9jaGFyID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShjKTsKKyAgICAvLyBJZiBnemlwcGVkIGZpbGUgd29uJ3QgYWNjZXB0IHRoaXMgY2hhcmFjdGVyLCBmYWlsCisgICAgaWYgKGd6d3JpdGUoZmlsZSwgJmxhc3RfY2hhciwgMSkgIT0gMSkKKyAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgIH0KKworICAvLyBJZiB5b3UgZ290IGhlcmUsIHlvdSBoYXZlIHN1Y2NlZWRlZCAoZXZlbiBpZiBjIHdhcyBFT0YpCisgIC8vIFRoZSByZXR1cm4gdmFsdWUgc2hvdWxkIHRoZXJlZm9yZSBiZSBub24tRU9GCisgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoYywgdHJhaXRzX3R5cGU6OmVvZigpKSkKKyAgICByZXR1cm4gdHJhaXRzX3R5cGU6Om5vdF9lb2YoYyk7CisgIGVsc2UKKyAgICByZXR1cm4gYzsKK30KKworLy8gQXNzaWduIG5ldyBidWZmZXIKK3N0ZDo6c3RyZWFtYnVmKgorZ3pmaWxlYnVmOjpzZXRidWYoY2hhcl90eXBlKiBwLAorICAgICAgICAgICAgICAgICAgc3RkOjpzdHJlYW1zaXplIG4pCit7CisgIC8vIEZpcnN0IG1ha2Ugc3VyZSBzdHVmZiBpcyBzeW5jJ2VkLCBmb3Igc2FmZXR5CisgIGlmICh0aGlzLT5zeW5jKCkgPT0gLTEpCisgICAgcmV0dXJuIE5VTEw7CisgIC8vIElmIGJ1ZmZlcmluZyBpcyB0dXJuZWQgb2ZmIG9uIHB1cnBvc2UgdmlhIHNldGJ1ZigwLDApLCBzdGlsbCBhbGxvY2F0ZSBvbmUuLi4KKyAgLy8gIlVuYnVmZmVyZWQiIG9ubHkgcmVhbGx5IHJlZmVycyB0byBwdXQgWzI3LjguMS40LjEwXSwgd2hpbGUgZ2V0IG5lZWRzIGF0CisgIC8vIGxlYXN0IGEgYnVmZmVyIG9mIHNpemUgMSAodmVyeSBpbmVmZmljaWVudCB0aG91Z2gsIHRoZXJlZm9yZSBtYWtlIGl0IGJpZ2dlcj8pCisgIC8vIFRoaXMgZm9sbG93cyBmcm9tIFsyNy41LjIuNC4zXS8xMiAoZ3B0ciBuZWVkcyB0byBwb2ludCBhdCBzb21ldGhpbmcsIGl0IHNlZW1zKQorICBpZiAoIXAgfHwgIW4pCisgIHsKKyAgICAvLyBSZXBsYWNlIGV4aXN0aW5nIGJ1ZmZlciAoaWYgYW55KSB3aXRoIHNtYWxsIGludGVybmFsIGJ1ZmZlcgorICAgIHRoaXMtPmRpc2FibGVfYnVmZmVyKCk7CisgICAgYnVmZmVyID0gTlVMTDsKKyAgICBidWZmZXJfc2l6ZSA9IDA7CisgICAgb3duX2J1ZmZlciA9IHRydWU7CisgICAgdGhpcy0+ZW5hYmxlX2J1ZmZlcigpOworICB9CisgIGVsc2UKKyAgeworICAgIC8vIFJlcGxhY2UgZXhpc3RpbmcgYnVmZmVyIChpZiBhbnkpIHdpdGggZXh0ZXJuYWwgYnVmZmVyCisgICAgdGhpcy0+ZGlzYWJsZV9idWZmZXIoKTsKKyAgICBidWZmZXIgPSBwOworICAgIGJ1ZmZlcl9zaXplID0gbjsKKyAgICBvd25fYnVmZmVyID0gZmFsc2U7CisgICAgdGhpcy0+ZW5hYmxlX2J1ZmZlcigpOworICB9CisgIHJldHVybiB0aGlzOworfQorCisvLyBXcml0ZSBwdXQgYXJlYSB0byBnemlwcGVkIGZpbGUgKGkuZS4gZW5zdXJlcyB0aGF0IHB1dCBhcmVhIGlzIGVtcHR5KQoraW50CitnemZpbGVidWY6OnN5bmMoKQoreworICByZXR1cm4gdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKHRoaXMtPm92ZXJmbG93KCksIHRyYWl0c190eXBlOjplb2YoKSkgPyAtMSA6IDA7Cit9CisKKy8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KKworLy8gQWxsb2NhdGUgaW50ZXJuYWwgYnVmZmVyCit2b2lkCitnemZpbGVidWY6OmVuYWJsZV9idWZmZXIoKQoreworICAvLyBJZiBpbnRlcm5hbCBidWZmZXIgcmVxdWlyZWQsIGFsbG9jYXRlIG9uZQorICBpZiAob3duX2J1ZmZlciAmJiAhYnVmZmVyKQorICB7CisgICAgLy8gQ2hlY2sgZm9yIGJ1ZmZlcmVkIHZzLiAidW5idWZmZXJlZCIKKyAgICBpZiAoYnVmZmVyX3NpemUgPiAwKQorICAgIHsKKyAgICAgIC8vIEFsbG9jYXRlIGludGVybmFsIGJ1ZmZlcgorICAgICAgYnVmZmVyID0gbmV3IGNoYXJfdHlwZVtidWZmZXJfc2l6ZV07CisgICAgICAvLyBHZXQgYXJlYSBzdGFydHMgZW1wdHkgYW5kIHdpbGwgYmUgZXhwYW5kZWQgYnkgdW5kZXJmbG93IGFzIG5lZWQgYXJpc2VzCisgICAgICB0aGlzLT5zZXRnKGJ1ZmZlciwgYnVmZmVyLCBidWZmZXIpOworICAgICAgLy8gU2V0dXAgZW50aXJlIGludGVybmFsIGJ1ZmZlciBhcyBwdXQgYXJlYS4KKyAgICAgIC8vIFRoZSBvbmUtcGFzdC1lbmQgcG9pbnRlciBhY3R1YWxseSBwb2ludHMgdG8gdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgYnVmZmVyLAorICAgICAgLy8gc28gdGhhdCBvdmVyZmxvdyhjKSBjYW4gc2FmZWx5IGFkZCB0aGUgZXh0cmEgY2hhcmFjdGVyIGMgdG8gdGhlIHNlcXVlbmNlLgorICAgICAgLy8gVGhlc2UgcG9pbnRlcnMgcmVtYWluIGluIHBsYWNlIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGJ1ZmZlcgorICAgICAgdGhpcy0+c2V0cChidWZmZXIsIGJ1ZmZlciArIGJ1ZmZlcl9zaXplIC0gMSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvLyBFdmVuIGluICJ1bmJ1ZmZlcmVkIiBjYXNlLCAoc21hbGw/KSBnZXQgYnVmZmVyIGlzIHN0aWxsIHJlcXVpcmVkCisgICAgICBidWZmZXJfc2l6ZSA9IFNNQUxMQlVGU0laRTsKKyAgICAgIGJ1ZmZlciA9IG5ldyBjaGFyX3R5cGVbYnVmZmVyX3NpemVdOworICAgICAgdGhpcy0+c2V0ZyhidWZmZXIsIGJ1ZmZlciwgYnVmZmVyKTsKKyAgICAgIC8vICJVbmJ1ZmZlcmVkIiBtZWFucyBubyBwdXQgYnVmZmVyCisgICAgICB0aGlzLT5zZXRwKDAsIDApOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvLyBJZiBidWZmZXIgYWxyZWFkeSBhbGxvY2F0ZWQsIHJlc2V0IGJ1ZmZlciBwb2ludGVycyBqdXN0IHRvIG1ha2Ugc3VyZSBubworICAgIC8vIHN0YWxlIGNoYXJzIGFyZSBseWluZyBhcm91bmQKKyAgICB0aGlzLT5zZXRnKGJ1ZmZlciwgYnVmZmVyLCBidWZmZXIpOworICAgIHRoaXMtPnNldHAoYnVmZmVyLCBidWZmZXIgKyBidWZmZXJfc2l6ZSAtIDEpOworICB9Cit9CisKKy8vIERlc3Ryb3kgaW50ZXJuYWwgYnVmZmVyCit2b2lkCitnemZpbGVidWY6OmRpc2FibGVfYnVmZmVyKCkKK3sKKyAgLy8gSWYgaW50ZXJuYWwgYnVmZmVyIGV4aXN0cywgZGVhbGxvY2F0ZSBpdAorICBpZiAob3duX2J1ZmZlciAmJiBidWZmZXIpCisgIHsKKyAgICAvLyBQcmVzZXJ2ZSB1bmJ1ZmZlcmVkIHN0YXR1cyBieSB6ZXJvaW5nIHNpemUKKyAgICBpZiAoIXRoaXMtPnBiYXNlKCkpCisgICAgICBidWZmZXJfc2l6ZSA9IDA7CisgICAgZGVsZXRlW10gYnVmZmVyOworICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgdGhpcy0+c2V0ZygwLCAwLCAwKTsKKyAgICB0aGlzLT5zZXRwKDAsIDApOworICB9CisgIGVsc2UKKyAgeworICAgIC8vIFJlc2V0IGJ1ZmZlciBwb2ludGVycyB0byBpbml0aWFsIHN0YXRlIGlmIGV4dGVybmFsIGJ1ZmZlciBleGlzdHMKKyAgICB0aGlzLT5zZXRnKGJ1ZmZlciwgYnVmZmVyLCBidWZmZXIpOworICAgIGlmIChidWZmZXIpCisgICAgICB0aGlzLT5zZXRwKGJ1ZmZlciwgYnVmZmVyICsgYnVmZmVyX3NpemUgLSAxKTsKKyAgICBlbHNlCisgICAgICB0aGlzLT5zZXRwKDAsIDApOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBpbml0aWFsaXplcyBzdHJlYW0gYnVmZmVyCitnemlmc3RyZWFtOjpnemlmc3RyZWFtKCkKKzogc3RkOjppc3RyZWFtKE5VTEwpLCBzYigpCit7IHRoaXMtPmluaXQoJnNiKTsgfQorCisvLyBJbml0aWFsaXplIHN0cmVhbSBidWZmZXIgYW5kIG9wZW4gZmlsZQorZ3ppZnN0cmVhbTo6Z3ppZnN0cmVhbShjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlKQorOiBzdGQ6OmlzdHJlYW0oTlVMTCksIHNiKCkKK3sKKyAgdGhpcy0+aW5pdCgmc2IpOworICB0aGlzLT5vcGVuKG5hbWUsIG1vZGUpOworfQorCisvLyBJbml0aWFsaXplIHN0cmVhbSBidWZmZXIgYW5kIGF0dGFjaCB0byBmaWxlCitnemlmc3RyZWFtOjpnemlmc3RyZWFtKGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSkKKzogc3RkOjppc3RyZWFtKE5VTEwpLCBzYigpCit7CisgIHRoaXMtPmluaXQoJnNiKTsKKyAgdGhpcy0+YXR0YWNoKGZkLCBtb2RlKTsKK30KKworLy8gT3BlbiBmaWxlIGFuZCBnbyBpbnRvIGZhaWwoKSBzdGF0ZSBpZiB1bnN1Y2Nlc3NmdWwKK3ZvaWQKK2d6aWZzdHJlYW06Om9wZW4oY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSkKK3sKKyAgaWYgKCFzYi5vcGVuKG5hbWUsIG1vZGUgfCBzdGQ6Omlvc19iYXNlOjppbikpCisgICAgdGhpcy0+c2V0c3RhdGUoc3RkOjppb3NfYmFzZTo6ZmFpbGJpdCk7CisgIGVsc2UKKyAgICB0aGlzLT5jbGVhcigpOworfQorCisvLyBBdHRhY2ggdG8gZmlsZSBhbmQgZ28gaW50byBmYWlsKCkgc3RhdGUgaWYgdW5zdWNjZXNzZnVsCit2b2lkCitnemlmc3RyZWFtOjphdHRhY2goaW50IGZkLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUpCit7CisgIGlmICghc2IuYXR0YWNoKGZkLCBtb2RlIHwgc3RkOjppb3NfYmFzZTo6aW4pKQorICAgIHRoaXMtPnNldHN0YXRlKHN0ZDo6aW9zX2Jhc2U6OmZhaWxiaXQpOworICBlbHNlCisgICAgdGhpcy0+Y2xlYXIoKTsKK30KKworLy8gQ2xvc2UgZmlsZQordm9pZAorZ3ppZnN0cmVhbTo6Y2xvc2UoKQoreworICBpZiAoIXNiLmNsb3NlKCkpCisgICAgdGhpcy0+c2V0c3RhdGUoc3RkOjppb3NfYmFzZTo6ZmFpbGJpdCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBpbml0aWFsaXplcyBzdHJlYW0gYnVmZmVyCitnem9mc3RyZWFtOjpnem9mc3RyZWFtKCkKKzogc3RkOjpvc3RyZWFtKE5VTEwpLCBzYigpCit7IHRoaXMtPmluaXQoJnNiKTsgfQorCisvLyBJbml0aWFsaXplIHN0cmVhbSBidWZmZXIgYW5kIG9wZW4gZmlsZQorZ3pvZnN0cmVhbTo6Z3pvZnN0cmVhbShjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlKQorOiBzdGQ6Om9zdHJlYW0oTlVMTCksIHNiKCkKK3sKKyAgdGhpcy0+aW5pdCgmc2IpOworICB0aGlzLT5vcGVuKG5hbWUsIG1vZGUpOworfQorCisvLyBJbml0aWFsaXplIHN0cmVhbSBidWZmZXIgYW5kIGF0dGFjaCB0byBmaWxlCitnem9mc3RyZWFtOjpnem9mc3RyZWFtKGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSkKKzogc3RkOjpvc3RyZWFtKE5VTEwpLCBzYigpCit7CisgIHRoaXMtPmluaXQoJnNiKTsKKyAgdGhpcy0+YXR0YWNoKGZkLCBtb2RlKTsKK30KKworLy8gT3BlbiBmaWxlIGFuZCBnbyBpbnRvIGZhaWwoKSBzdGF0ZSBpZiB1bnN1Y2Nlc3NmdWwKK3ZvaWQKK2d6b2ZzdHJlYW06Om9wZW4oY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSkKK3sKKyAgaWYgKCFzYi5vcGVuKG5hbWUsIG1vZGUgfCBzdGQ6Omlvc19iYXNlOjpvdXQpKQorICAgIHRoaXMtPnNldHN0YXRlKHN0ZDo6aW9zX2Jhc2U6OmZhaWxiaXQpOworICBlbHNlCisgICAgdGhpcy0+Y2xlYXIoKTsKK30KKworLy8gQXR0YWNoIHRvIGZpbGUgYW5kIGdvIGludG8gZmFpbCgpIHN0YXRlIGlmIHVuc3VjY2Vzc2Z1bAordm9pZAorZ3pvZnN0cmVhbTo6YXR0YWNoKGludCBmZCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlKQoreworICBpZiAoIXNiLmF0dGFjaChmZCwgbW9kZSB8IHN0ZDo6aW9zX2Jhc2U6Om91dCkpCisgICAgdGhpcy0+c2V0c3RhdGUoc3RkOjppb3NfYmFzZTo6ZmFpbGJpdCk7CisgIGVsc2UKKyAgICB0aGlzLT5jbGVhcigpOworfQorCisvLyBDbG9zZSBmaWxlCit2b2lkCitnem9mc3RyZWFtOjpjbG9zZSgpCit7CisgIGlmICghc2IuY2xvc2UoKSkKKyAgICB0aGlzLT5zZXRzdGF0ZShzdGQ6Omlvc19iYXNlOjpmYWlsYml0KTsKK30KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvaW9zdHJlYW0zL3pmc3RyZWFtLmggYi96bGliL3NyYy9jb250cmliL2lvc3RyZWFtMy96ZnN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NzQ0NzkKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL2lvc3RyZWFtMy96ZnN0cmVhbS5oCkBAIC0wLDAgKzEsNDY2IEBACisvKgorICogQSBDKysgSS9PIHN0cmVhbXMgaW50ZXJmYWNlIHRvIHRoZSB6bGliIGd6KiBmdW5jdGlvbnMKKyAqCisgKiBieSBMdWR3aWcgU2Nod2FyZHQgPHNjaHdhcmR0QHN1bi5hYy56YT4KKyAqIG9yaWdpbmFsIHZlcnNpb24gYnkgS2V2aW4gUnVsYW5kIDxrZXZpbkByb2Rpbi53dXN0bC5lZHU+CisgKgorICogVGhpcyB2ZXJzaW9uIGlzIHN0YW5kYXJkLWNvbXBsaWFudCBhbmQgY29tcGF0aWJsZSB3aXRoIGdjYyAzLnguCisgKi8KKworI2lmbmRlZiBaRlNUUkVBTV9ICisjZGVmaW5lIFpGU1RSRUFNX0gKKworI2luY2x1ZGUgPGlzdHJlYW0+ICAvLyBub3QgaW9zdHJlYW0sIHNpbmNlIHdlIGRvbid0IG5lZWQgY2luL2NvdXQKKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgInpsaWIuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqICBAYnJpZWYgIEd6aXBwZWQgZmlsZSBzdHJlYW0gYnVmZmVyIGNsYXNzLgorICoKKyAqICBUaGlzIGNsYXNzIGltcGxlbWVudHMgYmFzaWNfZmlsZWJ1ZiBmb3IgZ3ppcHBlZCBmaWxlcy4gSXQgZG9lc24ndCB5ZXQgc3VwcG9ydAorICogIHNlZWtpbmcgKGFsbG93ZWQgYnkgemxpYiBidXQgc2xvdy9saW1pdGVkKSwgcHV0YmFjayBhbmQgcmVhZC93cml0ZSBhY2Nlc3MKKyAqICAodHJpY2t5KS4gT3RoZXJ3aXNlLCBpdCBhdHRlbXB0cyB0byBiZSBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIHRoZSBzdGFuZGFyZAorICogIGZpbGUgc3RyZWFtYnVmLgorKi8KK2NsYXNzIGd6ZmlsZWJ1ZiA6IHB1YmxpYyBzdGQ6OnN0cmVhbWJ1ZgoreworcHVibGljOgorICAvLyAgRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgZ3pmaWxlYnVmKCk7CisKKyAgLy8gIERlc3RydWN0b3IuCisgIHZpcnR1YWwKKyAgfmd6ZmlsZWJ1ZigpOworCisgIC8qKgorICAgKiAgQGJyaWVmICBTZXQgY29tcHJlc3Npb24gbGV2ZWwgYW5kIHN0cmF0ZWd5IG9uIHRoZSBmbHkuCisgICAqICBAcGFyYW0gIGNvbXBfbGV2ZWwgIENvbXByZXNzaW9uIGxldmVsIChzZWUgemxpYi5oIGZvciBhbGxvd2VkIHZhbHVlcykKKyAgICogIEBwYXJhbSAgY29tcF9zdHJhdGVneSAgQ29tcHJlc3Npb24gc3RyYXRlZ3kgKHNlZSB6bGliLmggZm9yIGFsbG93ZWQgdmFsdWVzKQorICAgKiAgQHJldHVybiAgWl9PSyBvbiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBvdGhlcndpc2UuCisgICAqCisgICAqICBVbmZvcnR1bmF0ZWx5LCB0aGVzZSBwYXJhbWV0ZXJzIGNhbm5vdCBiZSBtb2RpZmllZCBzZXBhcmF0ZWx5LCBhcyB0aGUKKyAgICogIHByZXZpb3VzIHpmc3RyZWFtIHZlcnNpb24gYXNzdW1lZC4gU2luY2UgdGhlIHN0cmF0ZWd5IGlzIHNlbGRvbSBjaGFuZ2VkLAorICAgKiAgaXQgY2FuIGRlZmF1bHQgYW5kIHNldGNvbXByZXNzaW9uKGxldmVsKSB0aGVuIGJlY29tZXMgbGlrZSB0aGUgb2xkCisgICAqICBzZXRjb21wcmVzc2lvbmxldmVsKGxldmVsKS4KKyAgKi8KKyAgaW50CisgIHNldGNvbXByZXNzaW9uKGludCBjb21wX2xldmVsLAorICAgICAgICAgICAgICAgICBpbnQgY29tcF9zdHJhdGVneSA9IFpfREVGQVVMVF9TVFJBVEVHWSk7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENoZWNrIGlmIGZpbGUgaXMgb3Blbi4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgZmlsZSBpcyBvcGVuLgorICAqLworICBib29sCisgIGlzX29wZW4oKSBjb25zdCB7IHJldHVybiAoZmlsZSAhPSBOVUxMKTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBPcGVuIGd6aXBwZWQgZmlsZS4KKyAgICogIEBwYXJhbSAgbmFtZSAgRmlsZSBuYW1lLgorICAgKiAgQHBhcmFtICBtb2RlICBPcGVuIG1vZGUgZmxhZ3MuCisgICAqICBAcmV0dXJuICBAYyB0aGlzIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4KKyAgKi8KKyAgZ3pmaWxlYnVmKgorICBvcGVuKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSk7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEF0dGFjaCB0byBhbHJlYWR5IG9wZW4gZ3ppcHBlZCBmaWxlLgorICAgKiAgQHBhcmFtICBmZCAgRmlsZSBkZXNjcmlwdG9yLgorICAgKiAgQHBhcmFtICBtb2RlICBPcGVuIG1vZGUgZmxhZ3MuCisgICAqICBAcmV0dXJuICBAYyB0aGlzIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4KKyAgKi8KKyAgZ3pmaWxlYnVmKgorICBhdHRhY2goaW50IGZkLAorICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSk7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENsb3NlIGd6aXBwZWQgZmlsZS4KKyAgICogIEByZXR1cm4gIEBjIHRoaXMgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLgorICAqLworICBnemZpbGVidWYqCisgIGNsb3NlKCk7CisKK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqICBAYnJpZWYgIENvbnZlcnQgaW9zIG9wZW4gbW9kZSBpbnQgdG8gbW9kZSBzdHJpbmcgdXNlZCBieSB6bGliLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiB2YWxpZCBtb2RlIGZsYWcgY29tYmluYXRpb24uCisgICovCisgIGJvb2wKKyAgb3Blbl9tb2RlKHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUsCisgICAgICAgICAgICBjaGFyKiBjX21vZGUpIGNvbnN0OworCisgIC8qKgorICAgKiAgQGJyaWVmICBOdW1iZXIgb2YgY2hhcmFjdGVycyBhdmFpbGFibGUgaW4gc3RyZWFtIGJ1ZmZlci4KKyAgICogIEByZXR1cm4gIE51bWJlciBvZiBjaGFyYWN0ZXJzLgorICAgKgorICAgKiAgVGhpcyBpbmRpY2F0ZXMgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gZ2V0IGFyZWEgb2Ygc3RyZWFtIGJ1ZmZlci4KKyAgICogIFRoZXNlIGNoYXJhY3RlcnMgY2FuIGJlIHJlYWQgd2l0aG91dCBhY2Nlc3NpbmcgdGhlIGd6aXBwZWQgZmlsZS4KKyAgKi8KKyAgdmlydHVhbCBzdGQ6OnN0cmVhbXNpemUKKyAgc2hvd21hbnljKCk7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEZpbGwgZ2V0IGFyZWEgZnJvbSBnemlwcGVkIGZpbGUuCisgICAqICBAcmV0dXJuICBGaXJzdCBjaGFyYWN0ZXIgaW4gZ2V0IGFyZWEgb24gc3VjY2VzcywgRU9GIG9uIGVycm9yLgorICAgKgorICAgKiAgVGhpcyBhY3R1YWxseSByZWFkcyBjaGFyYWN0ZXJzIGZyb20gZ3ppcHBlZCBmaWxlIHRvIHN0cmVhbQorICAgKiAgYnVmZmVyLiBBbHdheXMgYnVmZmVyZWQuCisgICovCisgIHZpcnR1YWwgaW50X3R5cGUKKyAgdW5kZXJmbG93KCk7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFdyaXRlIHB1dCBhcmVhIHRvIGd6aXBwZWQgZmlsZS4KKyAgICogIEBwYXJhbSAgYyAgRXh0cmEgY2hhcmFjdGVyIHRvIGFkZCB0byBidWZmZXIgY29udGVudHMuCisgICAqICBAcmV0dXJuICBOb24tRU9GIG9uIHN1Y2Nlc3MsIEVPRiBvbiBlcnJvci4KKyAgICoKKyAgICogIFRoaXMgYWN0dWFsbHkgd3JpdGVzIGNoYXJhY3RlcnMgaW4gc3RyZWFtIGJ1ZmZlciB0bworICAgKiAgZ3ppcHBlZCBmaWxlLiBXaXRoIHVuYnVmZmVyZWQgb3V0cHV0IHRoaXMgaXMgZG9uZSBvbmUKKyAgICogIGNoYXJhY3RlciBhdCBhIHRpbWUuCisgICovCisgIHZpcnR1YWwgaW50X3R5cGUKKyAgb3ZlcmZsb3coaW50X3R5cGUgYyA9IHRyYWl0c190eXBlOjplb2YoKSk7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEluc3RhbGxzIGV4dGVybmFsIHN0cmVhbSBidWZmZXIuCisgICAqICBAcGFyYW0gIHAgIFBvaW50ZXIgdG8gY2hhciBidWZmZXIuCisgICAqICBAcGFyYW0gIG4gIFNpemUgb2YgZXh0ZXJuYWwgYnVmZmVyLgorICAgKiAgQHJldHVybiAgQGMgdGhpcyBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUuCisgICAqCisgICAqICBDYWxsIHNldGJ1ZigwLDApIHRvIGVuYWJsZSB1bmJ1ZmZlcmVkIG91dHB1dC4KKyAgKi8KKyAgdmlydHVhbCBzdGQ6OnN0cmVhbWJ1ZioKKyAgc2V0YnVmKGNoYXJfdHlwZSogcCwKKyAgICAgICAgIHN0ZDo6c3RyZWFtc2l6ZSBuKTsKKworICAvKioKKyAgICogIEBicmllZiAgRmx1c2ggc3RyZWFtIGJ1ZmZlciB0byBmaWxlLgorICAgKiAgQHJldHVybiAgMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvci4KKyAgICoKKyAgICogIFRoaXMgY2FsbHMgdW5kZXJmbG93KEVPRikgdG8gZG8gdGhlIGpvYi4KKyAgKi8KKyAgdmlydHVhbCBpbnQKKyAgc3luYygpOworCisvLworLy8gU29tZSBmdXR1cmUgZW5oYW5jZW1lbnRzCisvLworLy8gIHZpcnR1YWwgaW50X3R5cGUgdWZsb3coKTsKKy8vICB2aXJ0dWFsIGludF90eXBlIHBiYWNrZmFpbChpbnRfdHlwZSBjID0gdHJhaXRzX3R5cGU6OmVvZigpKTsKKy8vICB2aXJ0dWFsIHBvc190eXBlCisvLyAgc2Vla29mZihvZmZfdHlwZSBvZmYsCisvLyAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpzZWVrZGlyIHdheSwKKy8vICAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUgPSBzdGQ6Omlvc19iYXNlOjppbnxzdGQ6Omlvc19iYXNlOjpvdXQpOworLy8gIHZpcnR1YWwgcG9zX3R5cGUKKy8vICBzZWVrcG9zKHBvc190eXBlIHNwLAorLy8gICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IHN0ZDo6aW9zX2Jhc2U6OmlufHN0ZDo6aW9zX2Jhc2U6Om91dCk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiAgQGJyaWVmICBBbGxvY2F0ZSBpbnRlcm5hbCBidWZmZXIuCisgICAqCisgICAqICBUaGlzIGZ1bmN0aW9uIGlzIHNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcy4gSXQgd2lsbCBlbnN1cmUKKyAgICogIHRoYXQgYSBwcm9wZXIgaW50ZXJuYWwgYnVmZmVyIGV4aXN0cyBpZiBpdCBpcyByZXF1aXJlZC4gSWYgdGhlCisgICAqICBidWZmZXIgYWxyZWFkeSBleGlzdHMgb3IgaXMgZXh0ZXJuYWwsIHRoZSBidWZmZXIgcG9pbnRlcnMgd2lsbCBiZQorICAgKiAgcmVzZXQgdG8gdGhlaXIgb3JpZ2luYWwgc3RhdGUuCisgICovCisgIHZvaWQKKyAgZW5hYmxlX2J1ZmZlcigpOworCisgIC8qKgorICAgKiAgQGJyaWVmICBEZXN0cm95IGludGVybmFsIGJ1ZmZlci4KKyAgICoKKyAgICogIFRoaXMgZnVuY3Rpb24gaXMgc2FmZSB0byBjYWxsIG11bHRpcGxlIHRpbWVzLiBJdCB3aWxsIGVuc3VyZQorICAgKiAgdGhhdCB0aGUgaW50ZXJuYWwgYnVmZmVyIGlzIGRlYWxsb2NhdGVkIGlmIGl0IGV4aXN0cy4gSW4gYW55CisgICAqICBjYXNlLCBpdCB3aWxsIGFsc28gcmVzZXQgdGhlIGJ1ZmZlciBwb2ludGVycy4KKyAgKi8KKyAgdm9pZAorICBkaXNhYmxlX2J1ZmZlcigpOworCisgIC8qKgorICAgKiAgVW5kZXJseWluZyBmaWxlIHBvaW50ZXIuCisgICovCisgIGd6RmlsZSBmaWxlOworCisgIC8qKgorICAgKiAgTW9kZSBpbiB3aGljaCBmaWxlIHdhcyBvcGVuZWQuCisgICovCisgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIGlvX21vZGU7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRydWUgaWYgdGhpcyBvYmplY3Qgb3ducyBmaWxlIGRlc2NyaXB0b3IuCisgICAqCisgICAqICBUaGlzIG1ha2VzIHRoZSBjbGFzcyByZXNwb25zaWJsZSBmb3IgY2xvc2luZyB0aGUgZmlsZQorICAgKiAgdXBvbiBkZXN0cnVjdGlvbi4KKyAgKi8KKyAgYm9vbCBvd25fZmQ7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFN0cmVhbSBidWZmZXIuCisgICAqCisgICAqICBGb3Igc2ltcGxpY2l0eSB0aGlzIHJlbWFpbnMgYWxsb2NhdGVkIG9uIHRoZSBmcmVlIHN0b3JlIGZvciB0aGUKKyAgICogIGVudGlyZSBsaWZlIHNwYW4gb2YgdGhlIGd6ZmlsZWJ1ZiBvYmplY3QsIHVubGVzcyByZXBsYWNlZCBieSBzZXRidWYuCisgICovCisgIGNoYXJfdHlwZSogYnVmZmVyOworCisgIC8qKgorICAgKiAgQGJyaWVmICBTdHJlYW0gYnVmZmVyIHNpemUuCisgICAqCisgICAqICBEZWZhdWx0cyB0byBzeXN0ZW0gZGVmYXVsdCBidWZmZXIgc2l6ZSAodHlwaWNhbGx5IDgxOTIgYnl0ZXMpLgorICAgKiAgTW9kaWZpZWQgYnkgc2V0YnVmLgorICAqLworICBzdGQ6OnN0cmVhbXNpemUgYnVmZmVyX3NpemU7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRydWUgaWYgdGhpcyBvYmplY3Qgb3ducyBzdHJlYW0gYnVmZmVyLgorICAgKgorICAgKiAgVGhpcyBtYWtlcyB0aGUgY2xhc3MgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSBidWZmZXIKKyAgICogIHVwb24gZGVzdHJ1Y3Rpb24uCisgICovCisgIGJvb2wgb3duX2J1ZmZlcjsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiAgQGJyaWVmICBHemlwcGVkIGZpbGUgaW5wdXQgc3RyZWFtIGNsYXNzLgorICoKKyAqICBUaGlzIGNsYXNzIGltcGxlbWVudHMgaWZzdHJlYW0gZm9yIGd6aXBwZWQgZmlsZXMuIFNlZWtpbmcgYW5kIHB1dGJhY2sKKyAqICBpcyBub3Qgc3VwcG9ydGVkIHlldC4KKyovCitjbGFzcyBnemlmc3RyZWFtIDogcHVibGljIHN0ZDo6aXN0cmVhbQoreworcHVibGljOgorICAvLyAgRGVmYXVsdCBjb25zdHJ1Y3RvcgorICBnemlmc3RyZWFtKCk7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENvbnN0cnVjdCBzdHJlYW0gb24gZ3ppcHBlZCBmaWxlIHRvIGJlIG9wZW5lZC4KKyAgICogIEBwYXJhbSAgbmFtZSAgRmlsZSBuYW1lLgorICAgKiAgQHBhcmFtICBtb2RlICBPcGVuIG1vZGUgZmxhZ3MgKGZvcmNlZCB0byBjb250YWluIGlvczo6aW4pLgorICAqLworICBleHBsaWNpdAorICBnemlmc3RyZWFtKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IHN0ZDo6aW9zX2Jhc2U6OmluKTsKKworICAvKioKKyAgICogIEBicmllZiAgQ29uc3RydWN0IHN0cmVhbSBvbiBhbHJlYWR5IG9wZW4gZ3ppcHBlZCBmaWxlLgorICAgKiAgQHBhcmFtICBmZCAgICBGaWxlIGRlc2NyaXB0b3IuCisgICAqICBAcGFyYW0gIG1vZGUgIE9wZW4gbW9kZSBmbGFncyAoZm9yY2VkIHRvIGNvbnRhaW4gaW9zOjppbikuCisgICovCisgIGV4cGxpY2l0CisgIGd6aWZzdHJlYW0oaW50IGZkLAorICAgICAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUgPSBzdGQ6Omlvc19iYXNlOjppbik7CisKKyAgLyoqCisgICAqICBPYnRhaW4gdW5kZXJseWluZyBzdHJlYW0gYnVmZmVyLgorICAqLworICBnemZpbGVidWYqCisgIHJkYnVmKCkgY29uc3QKKyAgeyByZXR1cm4gY29uc3RfY2FzdDxnemZpbGVidWYqPigmc2IpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENoZWNrIGlmIGZpbGUgaXMgb3Blbi4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgZmlsZSBpcyBvcGVuLgorICAqLworICBib29sCisgIGlzX29wZW4oKSB7IHJldHVybiBzYi5pc19vcGVuKCk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgT3BlbiBnemlwcGVkIGZpbGUuCisgICAqICBAcGFyYW0gIG5hbWUgIEZpbGUgbmFtZS4KKyAgICogIEBwYXJhbSAgbW9kZSAgT3BlbiBtb2RlIGZsYWdzIChmb3JjZWQgdG8gY29udGFpbiBpb3M6OmluKS4KKyAgICoKKyAgICogIFN0cmVhbSB3aWxsIGJlIGluIHN0YXRlIGdvb2QoKSBpZiBmaWxlIG9wZW5zIHN1Y2Nlc3NmdWxseTsKKyAgICogIG90aGVyd2lzZSBpbiBzdGF0ZSBmYWlsKCkuIFRoaXMgZGlmZmVycyBmcm9tIHRoZSBiZWhhdmlvciBvZgorICAgKiAgaWZzdHJlYW0sIHdoaWNoIG5ldmVyIHNldHMgdGhlIHN0YXRlIHRvIGdvb2QoKSBhbmQgdGhlcmVmb3JlCisgICAqICB3b24ndCBhbGxvdyB5b3UgdG8gcmV1c2UgdGhlIHN0cmVhbSBmb3IgYSBzZWNvbmQgZmlsZSB1bmxlc3MKKyAgICogIHlvdSBtYW51YWxseSBjbGVhcigpIHRoZSBzdGF0ZS4gVGhlIGNob2ljZSBpcyBhIG1hdHRlciBvZgorICAgKiAgY29udmVuaWVuY2UuCisgICovCisgIHZvaWQKKyAgb3Blbihjb25zdCBjaGFyKiBuYW1lLAorICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUgPSBzdGQ6Omlvc19iYXNlOjppbik7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEF0dGFjaCB0byBhbHJlYWR5IG9wZW4gZ3ppcHBlZCBmaWxlLgorICAgKiAgQHBhcmFtICBmZCAgRmlsZSBkZXNjcmlwdG9yLgorICAgKiAgQHBhcmFtICBtb2RlICBPcGVuIG1vZGUgZmxhZ3MgKGZvcmNlZCB0byBjb250YWluIGlvczo6aW4pLgorICAgKgorICAgKiAgU3RyZWFtIHdpbGwgYmUgaW4gc3RhdGUgZ29vZCgpIGlmIGF0dGFjaCBzdWNjZWVkZWQ7IG90aGVyd2lzZQorICAgKiAgaW4gc3RhdGUgZmFpbCgpLgorICAqLworICB2b2lkCisgIGF0dGFjaChpbnQgZmQsCisgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlID0gc3RkOjppb3NfYmFzZTo6aW4pOworCisgIC8qKgorICAgKiAgQGJyaWVmICBDbG9zZSBnemlwcGVkIGZpbGUuCisgICAqCisgICAqICBTdHJlYW0gd2lsbCBiZSBpbiBzdGF0ZSBmYWlsKCkgaWYgY2xvc2UgZmFpbGVkLgorICAqLworICB2b2lkCisgIGNsb3NlKCk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiAgVW5kZXJseWluZyBzdHJlYW0gYnVmZmVyLgorICAqLworICBnemZpbGVidWYgc2I7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogIEBicmllZiAgR3ppcHBlZCBmaWxlIG91dHB1dCBzdHJlYW0gY2xhc3MuCisgKgorICogIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBvZnN0cmVhbSBmb3IgZ3ppcHBlZCBmaWxlcy4gU2Vla2luZyBhbmQgcHV0YmFjaworICogIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LgorKi8KK2NsYXNzIGd6b2ZzdHJlYW0gOiBwdWJsaWMgc3RkOjpvc3RyZWFtCit7CitwdWJsaWM6CisgIC8vICBEZWZhdWx0IGNvbnN0cnVjdG9yCisgIGd6b2ZzdHJlYW0oKTsKKworICAvKioKKyAgICogIEBicmllZiAgQ29uc3RydWN0IHN0cmVhbSBvbiBnemlwcGVkIGZpbGUgdG8gYmUgb3BlbmVkLgorICAgKiAgQHBhcmFtICBuYW1lICBGaWxlIG5hbWUuCisgICAqICBAcGFyYW0gIG1vZGUgIE9wZW4gbW9kZSBmbGFncyAoZm9yY2VkIHRvIGNvbnRhaW4gaW9zOjpvdXQpLgorICAqLworICBleHBsaWNpdAorICBnem9mc3RyZWFtKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IHN0ZDo6aW9zX2Jhc2U6Om91dCk7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENvbnN0cnVjdCBzdHJlYW0gb24gYWxyZWFkeSBvcGVuIGd6aXBwZWQgZmlsZS4KKyAgICogIEBwYXJhbSAgZmQgICAgRmlsZSBkZXNjcmlwdG9yLgorICAgKiAgQHBhcmFtICBtb2RlICBPcGVuIG1vZGUgZmxhZ3MgKGZvcmNlZCB0byBjb250YWluIGlvczo6b3V0KS4KKyAgKi8KKyAgZXhwbGljaXQKKyAgZ3pvZnN0cmVhbShpbnQgZmQsCisgICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IHN0ZDo6aW9zX2Jhc2U6Om91dCk7CisKKyAgLyoqCisgICAqICBPYnRhaW4gdW5kZXJseWluZyBzdHJlYW0gYnVmZmVyLgorICAqLworICBnemZpbGVidWYqCisgIHJkYnVmKCkgY29uc3QKKyAgeyByZXR1cm4gY29uc3RfY2FzdDxnemZpbGVidWYqPigmc2IpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENoZWNrIGlmIGZpbGUgaXMgb3Blbi4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgZmlsZSBpcyBvcGVuLgorICAqLworICBib29sCisgIGlzX29wZW4oKSB7IHJldHVybiBzYi5pc19vcGVuKCk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgT3BlbiBnemlwcGVkIGZpbGUuCisgICAqICBAcGFyYW0gIG5hbWUgIEZpbGUgbmFtZS4KKyAgICogIEBwYXJhbSAgbW9kZSAgT3BlbiBtb2RlIGZsYWdzIChmb3JjZWQgdG8gY29udGFpbiBpb3M6Om91dCkuCisgICAqCisgICAqICBTdHJlYW0gd2lsbCBiZSBpbiBzdGF0ZSBnb29kKCkgaWYgZmlsZSBvcGVucyBzdWNjZXNzZnVsbHk7CisgICAqICBvdGhlcndpc2UgaW4gc3RhdGUgZmFpbCgpLiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgYmVoYXZpb3Igb2YKKyAgICogIG9mc3RyZWFtLCB3aGljaCBuZXZlciBzZXRzIHRoZSBzdGF0ZSB0byBnb29kKCkgYW5kIHRoZXJlZm9yZQorICAgKiAgd29uJ3QgYWxsb3cgeW91IHRvIHJldXNlIHRoZSBzdHJlYW0gZm9yIGEgc2Vjb25kIGZpbGUgdW5sZXNzCisgICAqICB5b3UgbWFudWFsbHkgY2xlYXIoKSB0aGUgc3RhdGUuIFRoZSBjaG9pY2UgaXMgYSBtYXR0ZXIgb2YKKyAgICogIGNvbnZlbmllbmNlLgorICAqLworICB2b2lkCisgIG9wZW4oY29uc3QgY2hhciogbmFtZSwKKyAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlID0gc3RkOjppb3NfYmFzZTo6b3V0KTsKKworICAvKioKKyAgICogIEBicmllZiAgQXR0YWNoIHRvIGFscmVhZHkgb3BlbiBnemlwcGVkIGZpbGUuCisgICAqICBAcGFyYW0gIGZkICBGaWxlIGRlc2NyaXB0b3IuCisgICAqICBAcGFyYW0gIG1vZGUgIE9wZW4gbW9kZSBmbGFncyAoZm9yY2VkIHRvIGNvbnRhaW4gaW9zOjpvdXQpLgorICAgKgorICAgKiAgU3RyZWFtIHdpbGwgYmUgaW4gc3RhdGUgZ29vZCgpIGlmIGF0dGFjaCBzdWNjZWVkZWQ7IG90aGVyd2lzZQorICAgKiAgaW4gc3RhdGUgZmFpbCgpLgorICAqLworICB2b2lkCisgIGF0dGFjaChpbnQgZmQsCisgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlID0gc3RkOjppb3NfYmFzZTo6b3V0KTsKKworICAvKioKKyAgICogIEBicmllZiAgQ2xvc2UgZ3ppcHBlZCBmaWxlLgorICAgKgorICAgKiAgU3RyZWFtIHdpbGwgYmUgaW4gc3RhdGUgZmFpbCgpIGlmIGNsb3NlIGZhaWxlZC4KKyAgKi8KKyAgdm9pZAorICBjbG9zZSgpOworCitwcml2YXRlOgorICAvKioKKyAgICogIFVuZGVybHlpbmcgc3RyZWFtIGJ1ZmZlci4KKyAgKi8KKyAgZ3pmaWxlYnVmIHNiOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqICBAYnJpZWYgIEd6aXBwZWQgZmlsZSBvdXRwdXQgc3RyZWFtIG1hbmlwdWxhdG9yIGNsYXNzLgorICoKKyAqICBUaGlzIGNsYXNzIGRlZmluZXMgYSB0d28tYXJndW1lbnQgbWFuaXB1bGF0b3IgZm9yIGd6b2ZzdHJlYW0uIEl0IGlzIHVzZWQKKyAqICBhcyBiYXNlIGZvciB0aGUgc2V0Y29tcHJlc3Npb24oaW50LGludCkgbWFuaXB1bGF0b3IuCisqLwordGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICBjbGFzcyBnem9tYW5pcDIKKyAgeworICBwdWJsaWM6CisgICAgLy8gQWxsb3dzIGluc2VydG9yIHRvIHBlZWsgYXQgaW50ZXJuYWxzCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRhLCB0eXBlbmFtZSBUYj4KKyAgICAgIGZyaWVuZCBnem9mc3RyZWFtJgorICAgICAgb3BlcmF0b3I8PChnem9mc3RyZWFtJiwKKyAgICAgICAgICAgICAgICAgY29uc3QgZ3pvbWFuaXAyPFRhLFRiPiYpOworCisgICAgLy8gQ29uc3RydWN0b3IKKyAgICBnem9tYW5pcDIoZ3pvZnN0cmVhbSYgKCpmKShnem9mc3RyZWFtJiwgVDEsIFQyKSwKKyAgICAgICAgICAgICAgVDEgdjEsCisgICAgICAgICAgICAgIFQyIHYyKTsKKyAgcHJpdmF0ZToKKyAgICAvLyBVbmRlcmx5aW5nIG1hbmlwdWxhdG9yIGZ1bmN0aW9uCisgICAgZ3pvZnN0cmVhbSYKKyAgICAoKmZ1bmMpKGd6b2ZzdHJlYW0mLCBUMSwgVDIpOworCisgICAgLy8gQXJndW1lbnRzIGZvciBtYW5pcHVsYXRvciBmdW5jdGlvbgorICAgIFQxIHZhbDE7CisgICAgVDIgdmFsMjsKKyAgfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBNYW5pcHVsYXRvciBmdW5jdGlvbiB0aHVua3MgdGhyb3VnaCB0byBzdHJlYW0gYnVmZmVyCitpbmxpbmUgZ3pvZnN0cmVhbSYKK3NldGNvbXByZXNzaW9uKGd6b2ZzdHJlYW0gJmd6cywgaW50IGwsIGludCBzID0gWl9ERUZBVUxUX1NUUkFURUdZKQoreworICAoZ3pzLnJkYnVmKCkpLT5zZXRjb21wcmVzc2lvbihsLCBzKTsKKyAgcmV0dXJuIGd6czsKK30KKworLy8gTWFuaXB1bGF0b3IgY29uc3RydWN0b3Igc3RvcmVzIGFyZ3VtZW50cwordGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICBpbmxpbmUKKyAgZ3pvbWFuaXAyPFQxLFQyPjo6Z3pvbWFuaXAyKGd6b2ZzdHJlYW0gJigqZikoZ3pvZnN0cmVhbSAmLCBUMSwgVDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDEgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMiB2MikKKyAgOiBmdW5jKGYpLCB2YWwxKHYxKSwgdmFsMih2MikKKyAgeyB9CisKKy8vIEluc2VydG9yIGFwcGxpZXMgdW5kZXJseWluZyBtYW5pcHVsYXRvciBmdW5jdGlvbiB0byBzdHJlYW0KK3RlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgaW5saW5lIGd6b2ZzdHJlYW0mCisgIG9wZXJhdG9yPDwoZ3pvZnN0cmVhbSYgcywgY29uc3QgZ3pvbWFuaXAyPFQxLFQyPiYgbSkKKyAgeyByZXR1cm4gKCptLmZ1bmMpKHMsIG0udmFsMSwgbS52YWwyKTsgfQorCisvLyBJbnNlcnQgdGhpcyBvbnRvIHN0cmVhbSB0byBzaW1wbGlmeSBzZXR0aW5nIG9mIGNvbXByZXNzaW9uIGxldmVsCitpbmxpbmUgZ3pvbWFuaXAyPGludCxpbnQ+CitzZXRjb21wcmVzc2lvbihpbnQgbCwgaW50IHMgPSBaX0RFRkFVTFRfU1RSQVRFR1kpCit7IHJldHVybiBnem9tYW5pcDI8aW50LGludD4oJnNldGNvbXByZXNzaW9uLCBsLCBzKTsgfQorCisjZW5kaWYgLy8gWkZTVFJFQU1fSApkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9tYXNteDY0L2JsZF9tbDY0LmJhdCBiL3psaWIvc3JjL2NvbnRyaWIvbWFzbXg2NC9ibGRfbWw2NC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY5MzQzZAotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvbWFzbXg2NC9ibGRfbWw2NC5iYXQKQEAgLTAsMCArMSwyIEBACittbDY0LmV4ZSAvRmxpbmZmYXN4NjQgL2MgL1ppIGluZmZhc3g2NC5hc20NCittbDY0LmV4ZSAvRmxndm1hdDY0ICAgL2MgL1ppIGd2bWF0NjQuYXNtDQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9tYXNteDY0L2d2bWF0NjQuYXNtIGIvemxpYi9zcmMvY29udHJpYi9tYXNteDY0L2d2bWF0NjQuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NzljMjgKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL21hc214NjQvZ3ZtYXQ2NC5hc20KQEAgLTAsMCArMSw1NTMgQEAKKzt1SW50IGxvbmdlc3RfbWF0Y2hfeDY0KA0KKzsgICAgZGVmbGF0ZV9zdGF0ZSAqcywNCis7ICAgIElQb3MgY3VyX21hdGNoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8NCisNCis7IGd2bWF0NjQuYXNtIC0tIEFzbSBwb3J0aW9uIG9mIHRoZSBvcHRpbWl6ZWQgbG9uZ2VzdF9tYXRjaCBmb3IgMzIgYml0cyB4ODZfNjQNCis7ICAoQU1ENjQgb24gQXRobG9uIDY0LCBPcHRlcm9uLCBQaGVub20NCis7ICAgICBhbmQgSW50ZWwgRU02NFQgb24gUGVudGl1bSA0IHdpdGggRU02NFQsIFBlbnRpdW0gRCwgQ29yZSAyIER1bywgQ29yZSBJNS9JNykNCis7IENvcHlyaWdodCAoQykgMTk5NS0yMDEwIEplYW4tbG91cCBHYWlsbHksIEJyaWFuIFJhaXRlciBhbmQgR2lsbGVzIFZvbGxhbnQuDQorOw0KKzsgRmlsZSB3cml0dGVuIGJ5IEdpbGxlcyBWb2xsYW50LCBieSBjb252ZXJ0aW5nIHRvIGFzc2VtYmx5IHRoZSBsb25nZXN0X21hdGNoDQorOyAgZnJvbSBKZWFuLWxvdXAgR2FpbGx5IGluIGRlZmxhdGUuYyBvZiB6TGliIGFuZCBpbmZvWmlwIHppcC4NCis7DQorOyAgYW5kIGJ5IHRha2luZyBpbnNwaXJhdGlvbiBvbiBhc202ODYgd2l0aCBtYXNtLCBvcHRpbWlzZWQgYXNzZW1ibHkgY29kZQ0KKzsgICAgICAgIGZyb20gQnJpYW4gUmFpdGVyLCB3cml0dGVuIDE5OTgNCis7DQorOyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQNCis7ICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzDQorOyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4NCis7DQorOyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsDQorOyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdA0KKzsgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoNCis7DQorOyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QNCis7ICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQ0KKzsgICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQ0KKzsgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuDQorOyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUNCis7ICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUNCis7ICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLg0KKzsNCis7DQorOw0KKzsgICAgICAgICBodHRwOi8vd3d3LnpsaWIubmV0DQorOyAgICAgICAgIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwNCis7ICAgICAgICAgaHR0cDovL3d3dy5tdXBwZXRsYWJzLmNvbS9+YnJlYWRib3gvc29mdHdhcmUvYXNzZW1ibHkuaHRtbA0KKzsNCis7IHRvIGNvbXBpbGUgdGhpcyBmaWxlIGZvciBpbmZvemlwIFppcCwgSSB1c2Ugb3B0aW9uOg0KKzsgICBtbDY0LmV4ZSAvRmxndm1hdDY0IC9jIC9aaSAvRElORk9aSVAgZ3ZtYXQ2NC5hc20NCis7DQorOyB0byBjb21waWxlIHRoaXMgZmlsZSBmb3IgekxpYiwgSSB1c2Ugb3B0aW9uOg0KKzsgICBtbDY0LmV4ZSAvRmxndm1hdDY0IC9jIC9aaSBndm1hdDY0LmFzbQ0KKzsgQmUgY2FycmVmdWxsIHRvIGFkYXB0IHpsaWIxMjIyYWRkIGJlbG93IHRvIHlvdXIgdmVyc2lvbiBvZiB6TGliDQorOyAgIChpZiB5b3UgdXNlIGEgdmVyc2lvbiBvZiB6TGliIGJlZm9yZSAxLjAuNCBvciBhZnRlciAxLjIuMi4yLCBjaGFuZ2UNCis7ICAgIHZhbHVlIG9mIHpsaWIxMjIyYWRkIGxhdGVyKQ0KKzsNCis7IFRoaXMgZmlsZSBjb21waWxlIHdpdGggTWljcm9zb2Z0IE1hY3JvIEFzc2VtYmxlciAoeDY0KSBmb3IgQU1ENjQNCis7DQorOyAgIG1sNjQuZXhlIGlzIGdpdmVuIHdpdGggVmlzdWFsIFN0dWRpbyAyMDA1LzIwMDgvMjAxMCBhbmQgV2luZG93cyBXREsNCis7DQorOyAgICh5b3UgY2FuIGdldCBXaW5kb3dzIFdESyB3aXRoIG1sNjQgZm9yIEFNRDY0IGZyb20NCis7ICAgICAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3doZGMvRGV2dG9vbHMvd2RrL2RlZmF1bHQubXNweCBmb3IgbG93IHByaWNlKQ0KKzsNCisNCisNCis7dUludCBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkNCis7ICAgIGRlZmxhdGVfc3RhdGUgKnM7DQorOyAgICBJUG9zIGN1cl9tYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8NCisuY29kZQ0KK2xvbmdlc3RfbWF0Y2ggUFJPQw0KKw0KKw0KKztMb2NhbFZhcnNTaXplICAgZXF1IDg4DQorIExvY2FsVmFyc1NpemUgICBlcXUgNzINCisNCis7IHJlZ2lzdGVyIHVzZWQgOiByYXgscmJ4LHJjeCxyZHgscnNpLHJkaSxyOCxyOSxyMTAscjExLHIxMg0KKzsgZnJlZSByZWdpc3RlciA6ICByMTQscjE1DQorOyByZWdpc3RlciBjYW4gYmUgc2F2ZWQgOiByc3ANCisNCisgY2hhaW5sZW53bWFzayAgIGVxdSAgcnNwICsgOCAtIExvY2FsVmFyc1NpemUgICAgOyBoaWdoIHdvcmQ6IGN1cnJlbnQgY2hhaW4gbGVuDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbG93IHdvcmQ6IHMtPndtYXNrDQorO3dpbmRvdyAgICAgICAgICBlcXUgIHJzcCArIHh4IC0gTG9jYWxWYXJzU2l6ZSAgIDsgbG9jYWwgY29weSBvZiBzLT53aW5kb3cgOyBzdG9yZWQgaW4gcjEwDQorO3dpbmRvd2Jlc3RsZW4gICBlcXUgIHJzcCArIHh4IC0gTG9jYWxWYXJzU2l6ZSAgIDsgcy0+d2luZG93ICsgYmVzdGxlbiAsIHVzZSByMTArcjExDQorO3NjYW5zdGFydCAgICAgICBlcXUgIHJzcCArIHh4IC0gTG9jYWxWYXJzU2l6ZSAgIDsgZmlyc3QgdHdvIGJ5dGVzIG9mIHN0cmluZyA7IHN0b3JlZCBpbiByMTJ3DQorO3NjYW5lbmQgICAgICAgICBlcXUgIHJzcCArIHh4IC0gTG9jYWxWYXJzU2l6ZSAgIDsgbGFzdCB0d28gYnl0ZXMgb2Ygc3RyaW5nIHVzZSBlYngNCis7c2NhbmFsaWduICAgICAgIGVxdSAgcnNwICsgeHggLSBMb2NhbFZhcnNTaXplICAgOyBkd29yZC1taXNhbGlnbm1lbnQgb2Ygc3RyaW5nIHIxMw0KKztiZXN0bGVuICAgICAgICAgZXF1ICByc3AgKyB4eCAtIExvY2FsVmFyc1NpemUgICA7IHNpemUgb2YgYmVzdCBtYXRjaCBzbyBmYXIgLT4gcjExZA0KKztzY2FuICAgICAgICAgICAgZXF1ICByc3AgKyB4eCAtIExvY2FsVmFyc1NpemUgICA7IHB0ciB0byBzdHJpbmcgd2FudGluZyBtYXRjaCAtPiByOQ0KK0lGREVGIElORk9aSVANCitFTFNFDQorIG5pY2VtYXRjaCAgICAgICBlcXUgIChyc3AgKyAxNiAtIExvY2FsVmFyc1NpemUpIDsgYSBnb29kIGVub3VnaCBtYXRjaCBzaXplDQorRU5ESUYNCisNCitzYXZlX3JkaSAgICAgICAgZXF1ICByc3AgKyAyNCAtIExvY2FsVmFyc1NpemUNCitzYXZlX3JzaSAgICAgICAgZXF1ICByc3AgKyAzMiAtIExvY2FsVmFyc1NpemUNCitzYXZlX3JieCAgICAgICAgZXF1ICByc3AgKyA0MCAtIExvY2FsVmFyc1NpemUNCitzYXZlX3JicCAgICAgICAgZXF1ICByc3AgKyA0OCAtIExvY2FsVmFyc1NpemUNCitzYXZlX3IxMiAgICAgICAgZXF1ICByc3AgKyA1NiAtIExvY2FsVmFyc1NpemUNCitzYXZlX3IxMyAgICAgICAgZXF1ICByc3AgKyA2NCAtIExvY2FsVmFyc1NpemUNCis7c2F2ZV9yMTQgICAgICAgIGVxdSAgcnNwICsgNzIgLSBMb2NhbFZhcnNTaXplDQorO3NhdmVfcjE1ICAgICAgICBlcXUgIHJzcCArIDgwIC0gTG9jYWxWYXJzU2l6ZQ0KKw0KKw0KKzsgc3VtbWFyeSBvZiByZWdpc3RlciB1c2FnZQ0KKzsgc2NhbmVuZCAgICAgZWJ4DQorOyBzY2FuZW5kdyAgICBieA0KKzsgY2hhaW5sZW53bWFzayAgIGVkeA0KKzsgY3VybWF0Y2ggICAgcnNpDQorOyBjdXJtYXRjaGQgICBlc2kNCis7IHdpbmRvd2Jlc3RsZW4gICByOA0KKzsgc2NhbmFsaWduICAgcjkNCis7IHNjYW5hbGlnbmQgIHI5ZA0KKzsgd2luZG93ICAgICAgcjEwDQorOyBiZXN0bGVuICAgICByMTENCis7IGJlc3RsZW5kICAgIHIxMWQNCis7IHNjYW5zdGFydCAgIHIxMmQNCis7IHNjYW5zdGFydHcgIHIxMncNCis7IHNjYW4gICAgICAgIHIxMw0KKzsgbmljZW1hdGNoICAgcjE0ZA0KKzsgbGltaXQgICAgICAgcjE1DQorOyBsaW1pdGQgICAgICByMTVkDQorOyBwcmV2ICAgICAgICByY3gNCisNCis7ICBhbGwgdGhlICs0IG9mZnNldHMgYXJlIGR1ZSB0byB0aGUgYWRkaXRpb24gb2YgcGVuZGluZ19idWZfc2l6ZSAoaW4gemxpYg0KKzsgIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBzaW5jZSB0aGUgYXNtIGNvZGUgd2FzIGZpcnN0IHdyaXR0ZW4NCis7ICAoaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMC40IG9yIG9sZGVyLCByZW1vdmUgdGhlICs0KS4NCis7ICBOb3RlIDogdGhlc2UgdmFsdWUgYXJlIGdvb2Qgd2l0aCBhIDggYnl0ZXMgYm91bmRhcnkgcGFjayBzdHJ1Y3R1cmUNCisNCisNCisgICAgTUFYX01BVENIICAgICAgICAgICBlcXUgICAgIDI1OA0KKyAgICBNSU5fTUFUQ0ggICAgICAgICAgIGVxdSAgICAgMw0KKyAgICBNSU5fTE9PS0FIRUFEICAgICAgIGVxdSAgICAgKE1BWF9NQVRDSCtNSU5fTUFUQ0grMSkNCisNCisNCis7OzsgT2Zmc2V0cyBmb3IgZmllbGRzIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZS4gVGhlc2UgbnVtYmVycw0KKzs7OyBhcmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBkZWZpbml0aW9uIG9mIGRlZmxhdGVfc3RhdGUsIHdpdGggdGhlDQorOzs7IGFzc3VtcHRpb24gdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBkd29yZC1hbGlnbiB0aGUgZmllbGRzLiAoVGh1cywNCis7OzsgY2hhbmdpbmcgdGhlIGRlZmluaXRpb24gb2YgZGVmbGF0ZV9zdGF0ZSBjb3VsZCBlYXNpbHkgY2F1c2UgdGhpcw0KKzs7OyBwcm9ncmFtIHRvIGNyYXNoIGhvcnJpYmx5LCB3aXRob3V0IHNvIG11Y2ggYXMgYSB3YXJuaW5nIGF0DQorOzs7IGNvbXBpbGUgdGltZS4gU2lnaC4pDQorDQorOyAgYWxsIHRoZSAremxpYjEyMjJhZGQgb2Zmc2V0cyBhcmUgZHVlIHRvIHRoZSBhZGRpdGlvbiBvZiBmaWVsZHMNCis7ICBpbiB6bGliIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBzaW5jZSB0aGUgYXNtIGNvZGUgd2FzIGZpcnN0IHdyaXR0ZW4NCis7ICAoaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMC40IG9yIG9sZGVyLCB1c2UgInpsaWIxMjIyYWRkIGVxdSAoLTQpIikuDQorOyAgKGlmIHlvdSBjb21waWxlIHdpdGggemxpYiBiZXR3ZWVuIDEuMC41IGFuZCAxLjIuMi4xLCB1c2UgInpsaWIxMjIyYWRkIGVxdSAwIikuDQorOyAgaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMi4yLjIgb3IgbGF0ZXIgLCB1c2UgInpsaWIxMjIyYWRkIGVxdSA4IikuDQorDQorDQorSUZERUYgSU5GT1pJUA0KKw0KK19EQVRBICAgU0VHTUVOVA0KK0NPTU0gICAgd2luZG93X3NpemU6RFdPUkQNCis7IFdNYXNrIDsgN2ZmZg0KK0NPTU0gICAgd2luZG93OkJZVEU6MDEwMDQwSA0KK0NPTU0gICAgcHJldjpXT1JEOjA4MDAwSA0KKzsgTWF0Y2hMZW4gOiB1bnVzZWQNCis7IFByZXZNYXRjaCA6IHVudXNlZA0KK0NPTU0gICAgc3Ryc3RhcnQ6RFdPUkQNCitDT01NICAgIG1hdGNoX3N0YXJ0OkRXT1JEDQorOyBMb29rYWhlYWQgOiBpZ25vcmUNCitDT01NICAgIHByZXZfbGVuZ3RoOkRXT1JEIDsgUHJldkxlbg0KK0NPTU0gICAgbWF4X2NoYWluX2xlbmd0aDpEV09SRA0KK0NPTU0gICAgZ29vZF9tYXRjaDpEV09SRA0KK0NPTU0gICAgbmljZV9tYXRjaDpEV09SRA0KK3ByZXZfYWQgZXF1IE9GRlNFVCBwcmV2DQord2luZG93X2FkIGVxdSBPRkZTRVQgd2luZG93DQorbmljZW1hdGNoIGVxdSBuaWNlX21hdGNoDQorX0RBVEEgRU5EUw0KK1dNYXNrIGVxdSAwN2ZmZmgNCisNCitFTFNFDQorDQorICBJRk5ERUYgemxpYjEyMjJhZGQNCisgICAgemxpYjEyMjJhZGQgZXF1IDgNCisgIEVORElGDQorZHNXU2l6ZSAgICAgICAgIGVxdSA1Nit6bGliMTIyMmFkZCsoemxpYjEyMjJhZGQvMikNCitkc1dNYXNrICAgICAgICAgZXF1IDY0K3psaWIxMjIyYWRkKyh6bGliMTIyMmFkZC8yKQ0KK2RzV2luZG93ICAgICAgICBlcXUgNzIremxpYjEyMjJhZGQNCitkc1ByZXYgICAgICAgICAgZXF1IDg4K3psaWIxMjIyYWRkDQorZHNNYXRjaExlbiAgICAgIGVxdSAxMjgremxpYjEyMjJhZGQNCitkc1ByZXZNYXRjaCAgICAgZXF1IDEzMit6bGliMTIyMmFkZA0KK2RzU3RyU3RhcnQgICAgICBlcXUgMTQwK3psaWIxMjIyYWRkDQorZHNNYXRjaFN0YXJ0ICAgIGVxdSAxNDQremxpYjEyMjJhZGQNCitkc0xvb2thaGVhZCAgICAgZXF1IDE0OCt6bGliMTIyMmFkZA0KK2RzUHJldkxlbiAgICAgICBlcXUgMTUyK3psaWIxMjIyYWRkDQorZHNNYXhDaGFpbkxlbiAgIGVxdSAxNTYremxpYjEyMjJhZGQNCitkc0dvb2RNYXRjaCAgICAgZXF1IDE3Mit6bGliMTIyMmFkZA0KK2RzTmljZU1hdGNoICAgICBlcXUgMTc2K3psaWIxMjIyYWRkDQorDQord2luZG93X3NpemUgICAgIGVxdSBbIHJjeCArIGRzV1NpemVdDQorV01hc2sgICAgICAgICAgIGVxdSBbIHJjeCArIGRzV01hc2tdDQord2luZG93X2FkICAgICAgIGVxdSBbIHJjeCArIGRzV2luZG93XQ0KK3ByZXZfYWQgICAgICAgICBlcXUgWyByY3ggKyBkc1ByZXZdDQorc3Ryc3RhcnQgICAgICAgIGVxdSBbIHJjeCArIGRzU3RyU3RhcnRdDQorbWF0Y2hfc3RhcnQgICAgIGVxdSBbIHJjeCArIGRzTWF0Y2hTdGFydF0NCitMb29rYWhlYWQgICAgICAgZXF1IFsgcmN4ICsgZHNMb29rYWhlYWRdIDsgMGZmZmZmZmZmaCBvbiBpbmZvemlwDQorcHJldl9sZW5ndGggICAgIGVxdSBbIHJjeCArIGRzUHJldkxlbl0NCittYXhfY2hhaW5fbGVuZ3RoIGVxdSBbIHJjeCArIGRzTWF4Q2hhaW5MZW5dDQorZ29vZF9tYXRjaCAgICAgIGVxdSBbIHJjeCArIGRzR29vZE1hdGNoXQ0KK25pY2VfbWF0Y2ggICAgICBlcXUgWyByY3ggKyBkc05pY2VNYXRjaF0NCitFTkRJRg0KKw0KKzsgcGFyYW1ldGVyIDEgaW4gcjgoZGVmbGF0ZSBzdGF0ZSBzKSwgcGFyYW0gMiBpbiByZHggKGN1ciBtYXRjaCkNCisNCis7IHNlZSBodHRwOi8vd2VibG9ncy5hc3AubmV0L29sZG5ld3RoaW5nL2FyY2hpdmUvMjAwNC8wMS8xNC81ODU3OS5hc3B4IGFuZA0KKzsgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2VuLXVzL2ttYXJjaC9oaC9rbWFyY2gvNjRiaXRBTURfOGU5NTFkZDItZWU3Ny00NzI4LTg3MDItNTVjZTRiNWRkMjRhLnhtbC5hc3ANCis7DQorOyBBbGwgcmVnaXN0ZXJzIG11c3QgYmUgcHJlc2VydmVkIGFjcm9zcyB0aGUgY2FsbCwgZXhjZXB0IGZvcg0KKzsgICByYXgsIHJjeCwgcmR4LCByOCwgcjksIHIxMCwgYW5kIHIxMSwgd2hpY2ggYXJlIHNjcmF0Y2guDQorDQorDQorDQorOzs7IFNhdmUgcmVnaXN0ZXJzIHRoYXQgdGhlIGNvbXBpbGVyIG1heSBiZSB1c2luZywgYW5kIGFkanVzdCBlc3AgdG8NCis7OzsgbWFrZSByb29tIGZvciBvdXIgc3RhY2sgZnJhbWUuDQorDQorDQorOzs7IFJldHJpZXZlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMuIHI4ZCB3aWxsIGhvbGQgY3VyX21hdGNoDQorOzs7IHRocm91Z2hvdXQgdGhlIGVudGlyZSBmdW5jdGlvbi4gZWR4IHdpbGwgaG9sZCB0aGUgcG9pbnRlciB0byB0aGUNCis7OzsgZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUgZHVyaW5nIHRoZSBmdW5jdGlvbidzIHNldHVwIChiZWZvcmUNCis7OzsgZW50ZXJpbmcgdGhlIG1haW4gbG9vcC4NCisNCis7IHBhcmFtZXRlciAxIGluIHJjeCAoZGVmbGF0ZV9zdGF0ZSogcyksIHBhcmFtIDIgaW4gZWR4IC0+IHI4IChjdXIgbWF0Y2gpDQorDQorOyB0aGlzIGNsZWFyIGhpZ2ggMzIgYml0cyBvZiByOCwgd2hpY2ggY2FuIGJlIGdhcmJhZ2UgaW4gYm90aCByOCBhbmQgcmR4DQorDQorICAgICAgICBtb3YgW3NhdmVfcmRpXSxyZGkNCisgICAgICAgIG1vdiBbc2F2ZV9yc2ldLHJzaQ0KKyAgICAgICAgbW92IFtzYXZlX3JieF0scmJ4DQorICAgICAgICBtb3YgW3NhdmVfcmJwXSxyYnANCitJRkRFRiBJTkZPWklQDQorICAgICAgICBtb3YgcjhkLGVjeA0KK0VMU0UNCisgICAgICAgIG1vdiByOGQsZWR4DQorRU5ESUYNCisgICAgICAgIG1vdiBbc2F2ZV9yMTJdLHIxMg0KKyAgICAgICAgbW92IFtzYXZlX3IxM10scjEzDQorOyAgICAgICAgbW92IFtzYXZlX3IxNF0scjE0DQorOyAgICAgICAgbW92IFtzYXZlX3IxNV0scjE1DQorDQorDQorOzs7IHVJbnQgd21hc2sgPSBzLT53X21hc2s7DQorOzs7IHVuc2lnbmVkIGNoYWluX2xlbmd0aCA9IHMtPm1heF9jaGFpbl9sZW5ndGg7DQorOzs7IGlmIChzLT5wcmV2X2xlbmd0aCA+PSBzLT5nb29kX21hdGNoKSB7DQorOzs7ICAgICBjaGFpbl9sZW5ndGggPj49IDI7DQorOzs7IH0NCisNCisgICAgICAgIG1vdiBlZGksIHByZXZfbGVuZ3RoDQorICAgICAgICBtb3YgZXNpLCBnb29kX21hdGNoDQorICAgICAgICBtb3YgZWF4LCBXTWFzaw0KKyAgICAgICAgbW92IGVieCwgbWF4X2NoYWluX2xlbmd0aA0KKyAgICAgICAgY21wIGVkaSwgZXNpDQorICAgICAgICBqbCAgTGFzdE1hdGNoR29vZA0KKyAgICAgICAgc2hyIGVieCwgMg0KK0xhc3RNYXRjaEdvb2Q6DQorDQorOzs7IGNoYWlubGVuIGlzIGRlY3JlbWVudGVkIG9uY2UgYmVmb3JlaGFuZCBzbyB0aGF0IHRoZSBmdW5jdGlvbiBjYW4NCis7OzsgdXNlIHRoZSBzaWduIGZsYWcgaW5zdGVhZCBvZiB0aGUgemVybyBmbGFnIGZvciB0aGUgZXhpdCB0ZXN0Lg0KKzs7OyBJdCBpcyB0aGVuIHNoaWZ0ZWQgaW50byB0aGUgaGlnaCB3b3JkLCB0byBtYWtlIHJvb20gZm9yIHRoZSB3bWFzaw0KKzs7OyB2YWx1ZSwgd2hpY2ggaXQgd2lsbCBhbHdheXMgYWNjb21wYW55Lg0KKw0KKyAgICAgICAgZGVjIGVieA0KKyAgICAgICAgc2hsIGVieCwgMTYNCisgICAgICAgIG9yICBlYngsIGVheA0KKw0KKzs7OyBvbiB6bGliIG9ubHkNCis7OzsgaWYgKCh1SW50KW5pY2VfbWF0Y2ggPiBzLT5sb29rYWhlYWQpIG5pY2VfbWF0Y2ggPSBzLT5sb29rYWhlYWQ7DQorDQorSUZERUYgSU5GT1pJUA0KKyAgICAgICAgbW92IFtjaGFpbmxlbndtYXNrXSwgZWJ4DQorOyBvbiBpbmZvemlwIG5pY2VfbWF0Y2ggPSBbbmljZV9tYXRjaF0NCitFTFNFDQorICAgICAgICBtb3YgZWF4LCBuaWNlX21hdGNoDQorICAgICAgICBtb3YgW2NoYWlubGVud21hc2tdLCBlYngNCisgICAgICAgIG1vdiByMTBkLCBMb29rYWhlYWQNCisgICAgICAgIGNtcCByMTBkLCBlYXgNCisgICAgICAgIGNtb3ZubCByMTBkLCBlYXgNCisgICAgICAgIG1vdiBbbmljZW1hdGNoXSxyMTBkDQorRU5ESUYNCisNCis7OzsgcmVnaXN0ZXIgQnl0ZWYgKnNjYW4gPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydDsNCisgICAgICAgIG1vdiByMTAsIHdpbmRvd19hZA0KKyAgICAgICAgbW92IGVicCwgc3Ryc3RhcnQNCisgICAgICAgIGxlYSByMTMsIFtyMTAgKyByYnBdDQorDQorOzs7IERldGVybWluZSBob3cgbWFueSBieXRlcyB0aGUgc2NhbiBwdHIgaXMgb2ZmIGZyb20gYmVpbmcNCis7OzsgZHdvcmQtYWxpZ25lZC4NCisNCisgICAgICAgICBtb3YgcjkscjEzDQorICAgICAgICAgbmVnIHIxMw0KKyAgICAgICAgIGFuZCByMTMsMw0KKw0KKzs7OyBJUG9zIGxpbWl0ID0gcy0+c3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVChzKSA/DQorOzs7ICAgICBzLT5zdHJzdGFydCAtIChJUG9zKU1BWF9ESVNUKHMpIDogTklMOw0KK0lGREVGIElORk9aSVANCisgICAgICAgIG1vdiBlYXgsMDdlZmFoIDsgTUFYX0RJU1QgPSAoV1NJWkUtTUlOX0xPT0tBSEVBRCkgKDB4ODAwMC0oMys4KzEpKQ0KK0VMU0UNCisgICAgICAgIG1vdiBlYXgsIHdpbmRvd19zaXplDQorICAgICAgICBzdWIgZWF4LCBNSU5fTE9PS0FIRUFEDQorRU5ESUYNCisgICAgICAgIHhvciBlZGksZWRpDQorICAgICAgICBzdWIgZWJwLCBlYXgNCisNCisgICAgICAgIG1vdiByMTFkLCBwcmV2X2xlbmd0aA0KKw0KKyAgICAgICAgY21vdm5nIGVicCxlZGkNCisNCis7OzsgaW50IGJlc3RfbGVuID0gcy0+cHJldl9sZW5ndGg7DQorDQorDQorOzs7IFN0b3JlIHRoZSBzdW0gb2Ygcy0+d2luZG93ICsgYmVzdF9sZW4gaW4gZXNpIGxvY2FsbHksIGFuZCBpbiBlc2kuDQorDQorICAgICAgIGxlYSAgcnNpLFtyMTArcjExXQ0KKw0KKzs7OyByZWdpc3RlciB1c2ggc2Nhbl9zdGFydCA9ICoodXNoZiopc2NhbjsNCis7OzsgcmVnaXN0ZXIgdXNoIHNjYW5fZW5kICAgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOw0KKzs7OyBQb3NmICpwcmV2ID0gcy0+cHJldjsNCisNCisgICAgICAgIG1vdnp4IHIxMmQsd29yZCBwdHIgW3I5XQ0KKyAgICAgICAgbW92enggZWJ4LCB3b3JkIHB0ciBbcjkgKyByMTEgLSAxXQ0KKw0KKyAgICAgICAgbW92IHJkaSwgcHJldl9hZA0KKw0KKzs7OyBKdW1wIGludG8gdGhlIG1haW4gbG9vcC4NCisNCisgICAgICAgIG1vdiBlZHgsIFtjaGFpbmxlbndtYXNrXQ0KKw0KKyAgICAgICAgY21wIGJ4LHdvcmQgcHRyIFtyc2kgKyByOCAtIDFdDQorICAgICAgICBqeiAgTG9va3VwTG9vcElzWmVybw0KKw0KK0xvb2t1cExvb3AxOg0KKyAgICAgICAgYW5kIHI4ZCwgZWR4DQorDQorICAgICAgICBtb3Z6eCAgIHI4ZCwgd29yZCBwdHIgW3JkaSArIHI4KjJdDQorICAgICAgICBjbXAgcjhkLCBlYnANCisgICAgICAgIGpiZSBMZWF2ZU5vdw0KKyAgICAgICAgc3ViIGVkeCwgMDAwMTAwMDBoDQorICAgICAgICBqcyAgTGVhdmVOb3cNCisNCitMb29wRW50cnkxOg0KKyAgICAgICAgY21wIGJ4LHdvcmQgcHRyIFtyc2kgKyByOCAtIDFdDQorICAgICAgICBqeiAgTG9va3VwTG9vcElzWmVybw0KKw0KK0xvb2t1cExvb3AyOg0KKyAgICAgICAgYW5kIHI4ZCwgZWR4DQorDQorICAgICAgICBtb3Z6eCAgIHI4ZCwgd29yZCBwdHIgW3JkaSArIHI4KjJdDQorICAgICAgICBjbXAgcjhkLCBlYnANCisgICAgICAgIGpiZSBMZWF2ZU5vdw0KKyAgICAgICAgc3ViIGVkeCwgMDAwMTAwMDBoDQorICAgICAgICBqcyAgTGVhdmVOb3cNCisNCitMb29wRW50cnkyOg0KKyAgICAgICAgY21wIGJ4LHdvcmQgcHRyIFtyc2kgKyByOCAtIDFdDQorICAgICAgICBqeiAgTG9va3VwTG9vcElzWmVybw0KKw0KK0xvb2t1cExvb3A0Og0KKyAgICAgICAgYW5kIHI4ZCwgZWR4DQorDQorICAgICAgICBtb3Z6eCAgIHI4ZCwgd29yZCBwdHIgW3JkaSArIHI4KjJdDQorICAgICAgICBjbXAgcjhkLCBlYnANCisgICAgICAgIGpiZSBMZWF2ZU5vdw0KKyAgICAgICAgc3ViIGVkeCwgMDAwMTAwMDBoDQorICAgICAgICBqcyAgTGVhdmVOb3cNCisNCitMb29wRW50cnk0Og0KKw0KKyAgICAgICAgY21wIGJ4LHdvcmQgcHRyIFtyc2kgKyByOCAtIDFdDQorICAgICAgICBqbnogTG9va3VwTG9vcDENCisgICAgICAgIGptcCBMb29rdXBMb29wSXNaZXJvDQorDQorDQorOzs7IGRvIHsNCis7OzsgICAgIG1hdGNoID0gcy0+d2luZG93ICsgY3VyX21hdGNoOw0KKzs7OyAgICAgaWYgKCoodXNoZiopKG1hdGNoK2Jlc3RfbGVuLTEpICE9IHNjYW5fZW5kIHx8DQorOzs7ICAgICAgICAgKih1c2hmKiltYXRjaCAhPSBzY2FuX3N0YXJ0KSBjb250aW51ZTsNCis7OzsgICAgIFsuLi5dDQorOzs7IH0gd2hpbGUgKChjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXSkgPiBsaW1pdA0KKzs7OyAgICAgICAgICAmJiAtLWNoYWluX2xlbmd0aCAhPSAwKTsNCis7OzsNCis7OzsgSGVyZSBpcyB0aGUgaW5uZXIgbG9vcCBvZiB0aGUgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiB3aWxsIHNwZW5kIHRoZQ0KKzs7OyBtYWpvcml0eSBvZiBpdHMgdGltZSBpbiB0aGlzIGxvb3AsIGFuZCBtYWpvcml0eSBvZiB0aGF0IHRpbWUgd2lsbA0KKzs7OyBiZSBzcGVudCBpbiB0aGUgZmlyc3QgdGVuIGluc3RydWN0aW9ucy4NCis7OzsNCis7OzsgV2l0aGluIHRoaXMgbG9vcDoNCis7OzsgZWJ4ID0gc2NhbmVuZA0KKzs7OyByOGQgPSBjdXJtYXRjaA0KKzs7OyBlZHggPSBjaGFpbmxlbndtYXNrIC0gaS5lLiwgKChjaGFpbmxlbiA8PCAxNikgfCB3bWFzaykNCis7OzsgZXNpID0gd2luZG93YmVzdGxlbiAtIGkuZS4sICh3aW5kb3cgKyBiZXN0bGVuKQ0KKzs7OyBlZGkgPSBwcmV2DQorOzs7IGVicCA9IGxpbWl0DQorDQorTG9va3VwTG9vcDoNCisgICAgICAgIGFuZCByOGQsIGVkeA0KKw0KKyAgICAgICAgbW92enggICByOGQsIHdvcmQgcHRyIFtyZGkgKyByOCoyXQ0KKyAgICAgICAgY21wIHI4ZCwgZWJwDQorICAgICAgICBqYmUgTGVhdmVOb3cNCisgICAgICAgIHN1YiBlZHgsIDAwMDEwMDAwaA0KKyAgICAgICAganMgIExlYXZlTm93DQorDQorTG9vcEVudHJ5Og0KKw0KKyAgICAgICAgY21wIGJ4LHdvcmQgcHRyIFtyc2kgKyByOCAtIDFdDQorICAgICAgICBqbnogTG9va3VwTG9vcDENCitMb29rdXBMb29wSXNaZXJvOg0KKyAgICAgICAgY21wICAgICByMTJ3LCB3b3JkIHB0ciBbcjEwICsgcjhdDQorICAgICAgICBqbnogTG9va3VwTG9vcDENCisNCisNCis7OzsgU3RvcmUgdGhlIGN1cnJlbnQgdmFsdWUgb2YgY2hhaW5sZW4uDQorICAgICAgICBtb3YgW2NoYWlubGVud21hc2tdLCBlZHgNCisNCis7OzsgUG9pbnQgZWRpIHRvIHRoZSBzdHJpbmcgdW5kZXIgc2NydXRpbnksIGFuZCBlc2kgdG8gdGhlIHN0cmluZyB3ZQ0KKzs7OyBhcmUgaG9waW5nIHRvIG1hdGNoIGl0IHVwIHdpdGguIEluIGFjdHVhbGl0eSwgZXNpIGFuZCBlZGkgYXJlDQorOzs7IGJvdGggcG9pbnRlZCAoTUFYX01BVENIXzggLSBzY2FuYWxpZ24pIGJ5dGVzIGFoZWFkLCBhbmQgZWR4IGlzDQorOzs7IGluaXRpYWxpemVkIHRvIC0oTUFYX01BVENIXzggLSBzY2FuYWxpZ24pLg0KKw0KKyAgICAgICAgbGVhIHJzaSxbcjgrcjEwXQ0KKyAgICAgICAgbW92IHJkeCwgMGZmZmZmZmZmZmZmZmZlZjhoOyAtKE1BWF9NQVRDSF84KQ0KKyAgICAgICAgbGVhIHJzaSwgW3JzaSArIHIxMyArIDAxMDhoXSA7TUFYX01BVENIXzhdDQorICAgICAgICBsZWEgcmRpLCBbcjkgKyByMTMgKyAwMTA4aF0gO01BWF9NQVRDSF84XQ0KKw0KKyAgICAgICAgcHJlZmV0Y2h0MSBbcnNpK3JkeF0NCisgICAgICAgIHByZWZldGNodDEgW3JkaStyZHhdDQorDQorDQorOzs7IFRlc3QgdGhlIHN0cmluZ3MgZm9yIGVxdWFsaXR5LCA4IGJ5dGVzIGF0IGEgdGltZS4gQXQgdGhlIGVuZCwNCis7OzsgYWRqdXN0IHJkeCBzbyB0aGF0IGl0IGlzIG9mZnNldCB0byB0aGUgZXhhY3QgYnl0ZSB0aGF0IG1pc21hdGNoZWQuDQorOzs7DQorOzs7IFdlIGFscmVhZHkga25vdyBhdCB0aGlzIHBvaW50IHRoYXQgdGhlIGZpcnN0IHRocmVlIGJ5dGVzIG9mIHRoZQ0KKzs7OyBzdHJpbmdzIG1hdGNoIGVhY2ggb3RoZXIsIGFuZCB0aGV5IGNhbiBiZSBzYWZlbHkgcGFzc2VkIG92ZXIgYmVmb3JlDQorOzs7IHN0YXJ0aW5nIHRoZSBjb21wYXJlIGxvb3AuIFNvIHdoYXQgdGhpcyBjb2RlIGRvZXMgaXMgc2tpcCBvdmVyIDAtMw0KKzs7OyBieXRlcywgYXMgbXVjaCBhcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gZHdvcmQtYWxpZ24gdGhlIGVkaQ0KKzs7OyBwb2ludGVyLiAocnNpIHdpbGwgc3RpbGwgYmUgbWlzYWxpZ25lZCB0aHJlZSB0aW1lcyBvdXQgb2YgZm91ci4pDQorOzs7DQorOzs7IEl0IHNob3VsZCBiZSBjb25mZXNzZWQgdGhhdCB0aGlzIGxvb3AgdXN1YWxseSBkb2VzIG5vdCByZXByZXNlbnQNCis7OzsgbXVjaCBvZiB0aGUgdG90YWwgcnVubmluZyB0aW1lLiBSZXBsYWNpbmcgaXQgd2l0aCBhIG1vcmUNCis7Ozsgc3RyYWlnaHRmb3J3YXJkICJyZXAgY21wc2IiIHdvdWxkIG5vdCBkcmFzdGljYWxseSBkZWdyYWRlDQorOzs7IHBlcmZvcm1hbmNlLg0KKw0KKw0KK0xvb3BDbXBzOg0KKyAgICAgICAgbW92IHJheCwgW3JzaSArIHJkeF0NCisgICAgICAgIHhvciByYXgsIFtyZGkgKyByZHhdDQorICAgICAgICBqbnogTGVhdmVMb29wQ21wcw0KKw0KKyAgICAgICAgbW92IHJheCwgW3JzaSArIHJkeCArIDhdDQorICAgICAgICB4b3IgcmF4LCBbcmRpICsgcmR4ICsgOF0NCisgICAgICAgIGpueiBMZWF2ZUxvb3BDbXBzOA0KKw0KKw0KKyAgICAgICAgbW92IHJheCwgW3JzaSArIHJkeCArIDgrOF0NCisgICAgICAgIHhvciByYXgsIFtyZGkgKyByZHggKyA4KzhdDQorICAgICAgICBqbnogTGVhdmVMb29wQ21wczE2DQorDQorICAgICAgICBhZGQgcmR4LDgrOCs4DQorDQorICAgICAgICBqbnogc2hvcnQgTG9vcENtcHMNCisgICAgICAgIGptcCBzaG9ydCBMZW5NYXhpbXVtDQorTGVhdmVMb29wQ21wczE2OiBhZGQgcmR4LDgNCitMZWF2ZUxvb3BDbXBzODogYWRkIHJkeCw4DQorTGVhdmVMb29wQ21wczoNCisNCisgICAgICAgIHRlc3QgICAgZWF4LCAwMDAwRkZGRmgNCisgICAgICAgIGpueiBMZW5Mb3dlcg0KKw0KKyAgICAgICAgdGVzdCBlYXgsMGZmZmZmZmZmaA0KKw0KKyAgICAgICAgam56IExlbkxvd2VyMzINCisNCisgICAgICAgIGFkZCByZHgsNA0KKyAgICAgICAgc2hyIHJheCwzMg0KKyAgICAgICAgb3IgYXgsYXgNCisgICAgICAgIGpueiBMZW5Mb3dlcg0KKw0KK0xlbkxvd2VyMzI6DQorICAgICAgICBzaHIgZWF4LDE2DQorICAgICAgICBhZGQgcmR4LDINCitMZW5Mb3dlcjogICBzdWIgYWwsIDENCisgICAgICAgIGFkYyByZHgsIDANCis7OzsgQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLiBJZiBpdCBpcyBsb25nZXIgdGhhbiBNQVhfTUFUQ0gsDQorOzs7IHRoZW4gYXV0b21hdGljYWxseSBhY2NlcHQgaXQgYXMgdGhlIGJlc3QgcG9zc2libGUgbWF0Y2ggYW5kIGxlYXZlLg0KKw0KKyAgICAgICAgbGVhIHJheCwgW3JkaSArIHJkeF0NCisgICAgICAgIHN1YiByYXgsIHI5DQorICAgICAgICBjbXAgZWF4LCBNQVhfTUFUQ0gNCisgICAgICAgIGpnZSBMZW5NYXhpbXVtDQorDQorOzs7IElmIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIG5vdCBsb25nZXIgdGhhbiB0aGUgYmVzdCBtYXRjaCB3ZQ0KKzs7OyBoYXZlIHNvIGZhciwgdGhlbiBmb3JnZXQgaXQgYW5kIHJldHVybiB0byB0aGUgbG9va3VwIGxvb3AuDQorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorICAgICAgICBjbXAgZWF4LCByMTFkDQorICAgICAgICBqZyAgTG9uZ2VyTWF0Y2gNCisNCisgICAgICAgIGxlYSByc2ksW3IxMCtyMTFdDQorDQorICAgICAgICBtb3YgcmRpLCBwcmV2X2FkDQorICAgICAgICBtb3YgZWR4LCBbY2hhaW5sZW53bWFza10NCisgICAgICAgIGptcCBMb29rdXBMb29wDQorDQorOzs7ICAgICAgICAgcy0+bWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7DQorOzs7ICAgICAgICAgYmVzdF9sZW4gPSBsZW47DQorOzs7ICAgICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSBicmVhazsNCis7OzsgICAgICAgICBzY2FuX2VuZCA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7DQorDQorTG9uZ2VyTWF0Y2g6DQorICAgICAgICBtb3YgcjExZCwgZWF4DQorICAgICAgICBtb3YgbWF0Y2hfc3RhcnQsIHI4ZA0KKyAgICAgICAgY21wIGVheCwgW25pY2VtYXRjaF0NCisgICAgICAgIGpnZSBMZWF2ZU5vdw0KKw0KKyAgICAgICAgbGVhIHJzaSxbcjEwK3JheF0NCisNCisgICAgICAgIG1vdnp4ICAgZWJ4LCB3b3JkIHB0ciBbcjkgKyByYXggLSAxXQ0KKyAgICAgICAgbW92IHJkaSwgcHJldl9hZA0KKyAgICAgICAgbW92IGVkeCwgW2NoYWlubGVud21hc2tdDQorICAgICAgICBqbXAgTG9va3VwTG9vcA0KKw0KKzs7OyBBY2NlcHQgdGhlIGN1cnJlbnQgc3RyaW5nLCB3aXRoIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGxlbmd0aC4NCisNCitMZW5NYXhpbXVtOg0KKyAgICAgICAgbW92IHIxMWQsTUFYX01BVENIDQorICAgICAgICBtb3YgbWF0Y2hfc3RhcnQsIHI4ZA0KKw0KKzs7OyBpZiAoKHVJbnQpYmVzdF9sZW4gPD0gcy0+bG9va2FoZWFkKSByZXR1cm4gKHVJbnQpYmVzdF9sZW47DQorOzs7IHJldHVybiBzLT5sb29rYWhlYWQ7DQorDQorTGVhdmVOb3c6DQorSUZERUYgSU5GT1pJUA0KKyAgICAgICAgbW92IGVheCxyMTFkDQorRUxTRQ0KKyAgICAgICAgbW92IGVheCwgTG9va2FoZWFkDQorICAgICAgICBjbXAgcjExZCwgZWF4DQorICAgICAgICBjbW92bmcgZWF4LCByMTFkDQorRU5ESUYNCisNCis7OzsgUmVzdG9yZSB0aGUgc3RhY2sgYW5kIHJldHVybiBmcm9tIHdoZW5jZSB3ZSBjYW1lLg0KKw0KKw0KKyAgICAgICAgbW92IHJzaSxbc2F2ZV9yc2ldDQorICAgICAgICBtb3YgcmRpLFtzYXZlX3JkaV0NCisgICAgICAgIG1vdiByYngsW3NhdmVfcmJ4XQ0KKyAgICAgICAgbW92IHJicCxbc2F2ZV9yYnBdDQorICAgICAgICBtb3YgcjEyLFtzYXZlX3IxMl0NCisgICAgICAgIG1vdiByMTMsW3NhdmVfcjEzXQ0KKzsgICAgICAgIG1vdiByMTQsW3NhdmVfcjE0XQ0KKzsgICAgICAgIG1vdiByMTUsW3NhdmVfcjE1XQ0KKw0KKw0KKyAgICAgICAgcmV0IDANCis7IHBsZWFzZSBkb24ndCByZW1vdmUgdGhpcyBzdHJpbmcgIQ0KKzsgWW91ciBjYW4gZnJlZWx5IHVzZSBndm1hdDY0IGluIGFueSBmcmVlIG9yIGNvbW1lcmNpYWwgYXBwDQorOyBidXQgaXQgaXMgZmFyIGJldHRlciBkb24ndCByZW1vdmUgdGhlIHN0cmluZyBpbiB0aGUgYmluYXJ5IQ0KKyAgICBkYiAgICAgMGRoLDBhaCwiYXNtNjg2IHdpdGggbWFzbSwgb3B0aW1pc2VkIGFzc2VtYmx5IGNvZGUgZnJvbSBCcmlhbiBSYWl0ZXIsIHdyaXR0ZW4gMTk5OCwgY29udmVydGVkIHRvIGFtZCA2NCBieSBHaWxsZXMgVm9sbGFudCAyMDA1IiwwZGgsMGFoLDANCitsb25nZXN0X21hdGNoICAgRU5EUA0KKw0KK21hdGNoX2luaXQgUFJPQw0KKyAgcmV0IDANCittYXRjaF9pbml0IEVORFANCisNCisNCitFTkQNCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL21hc214NjQvaW5mZmFzODY2NC5jIGIvemxpYi9zcmMvY29udHJpYi9tYXNteDY0L2luZmZhczg2NjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGFmMDZmCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9tYXNteDY0L2luZmZhczg2NjQuYwpAQCAtMCwwICsxLDE4NiBAQAorLyogaW5mZmFzODY2NC5jIGlzIGEgaGFuZCB0dW5lZCBhc3NlbWJsZXIgdmVyc2lvbiBvZiBpbmZmYXN0LmMgLSBmYXN0IGRlY29kaW5nDQorICogdmVyc2lvbiBmb3IgQU1ENjQgb24gV2luZG93cyB1c2luZyBNaWNyb3NvZnQgQyBjb21waWxlcg0KKyAqDQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgTWFyayBBZGxlcg0KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgNCisgKg0KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDaHJpcyBBbmRlcnNvbiA8Y2hyaXN0b3BAY2hhcm0ubmV0Pg0KKyAqIFBsZWFzZSB1c2UgdGhlIGNvcHlyaWdodCBjb25kaXRpb25zIGFib3ZlLg0KKyAqDQorICogMjAwNSAtIEFkYXB0YXRpb24gdG8gTWljcm9zb2Z0IEMgQ29tcGlsZXIgZm9yIEFNRDY0IGJ5IEdpbGxlcyBWb2xsYW50DQorICoNCisgKiBpbmZmYXM4NjY0LmMgY2FsbCBmdW5jdGlvbiBpbmZmYXM4NjY0Zm5jIGluIGluZmZhc3g2NC5hc20NCisgKiAgaW5mZmFzeDY0LmFzbSBpcyBhdXRvbWF0aWNhbGx5IGNvbnZlcnQgZnJvbSBBTUQ2NCBwb3J0aW9uIG9mIGluZmZhczg2LmMNCisgKg0KKyAqIERlYy0yOS0yMDAzIC0tIEkgYWRkZWQgQU1ENjQgaW5mbGF0ZSBhc20gc3VwcG9ydC4gIFRoaXMgdmVyc2lvbiBpcyBhbHNvDQorICogc2xpZ2h0bHkgcXVpY2tlciBvbiB4ODYgc3lzdGVtcyBiZWNhdXNlLCBpbnN0ZWFkIG9mIHVzaW5nIHJlcCBtb3ZzYiB0byBjb3B5DQorICogZGF0YSwgaXQgdXNlcyByZXAgbW92c3csIHdoaWNoIG1vdmVzIGRhdGEgaW4gMi1ieXRlIGNodW5rcyBpbnN0ZWFkIG9mIHNpbmdsZQ0KKyAqIGJ5dGVzLiAgSSd2ZSB0ZXN0ZWQgdGhlIEFNRDY0IGNvZGUgb24gYSBGZWRvcmEgQ29yZSAxICsgdGhlIHg4Nl82NCB1cGRhdGVzDQorICogZnJvbSBodHRwOi8vZmVkb3JhLmxpbnV4LmR1a2UuZWR1L2ZjMV94ODZfNjQNCisgKiB3aGljaCBpcyBydW5uaW5nIG9uIGFuIEF0aGxvbiA2NCAzMDAwKyAvIEdpZ2FieXRlIEdBLUs4VlQ4MDBNIHN5c3RlbSB3aXRoDQorICogMUdCIHJhbS4gIFRoZSA2NC1iaXQgdmVyc2lvbiBpcyBhYm91dCA0JSBmYXN0ZXIgdGhhbiB0aGUgMzItYml0IHZlcnNpb24sDQorICogd2hlbiBkZWNvbXByZXNzaW5nIG1vemlsbGEtc291cmNlLTEuMy50YXIuZ3ouDQorICoNCisgKiBNYXItMTMtMjAwMyAtLSBNb3N0IG9mIHRoaXMgaXMgZGVyaXZlZCBmcm9tIGluZmZhc3QuUyB3aGljaCBpcyBkZXJpdmVkIGZyb20NCisgKiB0aGUgZ2NjIC1TIG91dHB1dCBvZiB6bGliLTEuMi4wL2luZmZhc3QuYy4gIFpsaWItMS4yLjAgaXMgaW4gYmV0YSByZWxlYXNlIGF0DQorICogdGhlIG1vbWVudC4gIEkgaGF2ZSBzdWNjZXNzZnVsbHkgY29tcGlsZWQgYW5kIHRlc3RlZCB0aGlzIGNvZGUgd2l0aCBnY2MyLjk2LA0KKyAqIGdjYzMuMiwgaWNjNS4wLCBtc3ZjNi4wLiAgSXQgaXMgdmVyeSBjbG9zZSB0byB0aGUgc3BlZWQgb2YgaW5mZmFzdC5TDQorICogY29tcGlsZWQgd2l0aCBnY2MgLUROT19NTVgsIGJ1dCBpbmZmYXN0LlMgaXMgc3RpbGwgZmFzdGVyIG9uIHRoZSBQMyB3aXRoIE1NWA0KKyAqIGVuYWJsZWQuICBJIHdpbGwgYXR0ZW1wdCB0byBtZXJnZSB0aGUgTU1YIGNvZGUgaW50byB0aGlzIHZlcnNpb24uICBOZXdlcg0KKyAqIHZlcnNpb25zIG9mIHRoaXMgYW5kIGluZmZhc3QuUyBjYW4gYmUgZm91bmQgYXQNCisgKiBodHRwOi8vd3d3LmVldGJlZXRlZS5jb20vemxpYi8gYW5kIGh0dHA6Ly93d3cuY2hhcm0ubmV0L35jaHJpc3RvcC96bGliLw0KKyAqDQorICovDQorDQorI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2luY2x1ZGUgInp1dGlsLmgiDQorI2luY2x1ZGUgImluZnRyZWVzLmgiDQorI2luY2x1ZGUgImluZmxhdGUuaCINCisjaW5jbHVkZSAiaW5mZmFzdC5oIg0KKw0KKy8qIE1hcmsgQWRsZXIncyBjb21tZW50cyBmcm9tIGluZmZhc3QuYzogKi8NCisNCisvKg0KKyAgIERlY29kZSBsaXRlcmFsLCBsZW5ndGgsIGFuZCBkaXN0YW5jZSBjb2RlcyBhbmQgd3JpdGUgb3V0IHRoZSByZXN1bHRpbmcNCisgICBsaXRlcmFsIGFuZCBtYXRjaCBieXRlcyB1bnRpbCBlaXRoZXIgbm90IGVub3VnaCBpbnB1dCBvciBvdXRwdXQgaXMNCisgICBhdmFpbGFibGUsIGFuIGVuZC1vZi1ibG9jayBpcyBlbmNvdW50ZXJlZCwgb3IgYSBkYXRhIGVycm9yIGlzIGVuY291bnRlcmVkLg0KKyAgIFdoZW4gbGFyZ2UgZW5vdWdoIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgc3VwcGxpZWQgdG8gaW5mbGF0ZSgpLCBmb3INCisgICBleGFtcGxlLCBhIDE2SyBpbnB1dCBidWZmZXIgYW5kIGEgNjRLIG91dHB1dCBidWZmZXIsIG1vcmUgdGhhbiA5NSUgb2YgdGhlDQorICAgaW5mbGF0ZSBleGVjdXRpb24gdGltZSBpcyBzcGVudCBpbiB0aGlzIHJvdXRpbmUuDQorDQorICAgRW50cnkgYXNzdW1wdGlvbnM6DQorDQorICAgICAgICBzdGF0ZS0+bW9kZSA9PSBMRU4NCisgICAgICAgIHN0cm0tPmF2YWlsX2luID49IDYNCisgICAgICAgIHN0cm0tPmF2YWlsX291dCA+PSAyNTgNCisgICAgICAgIHN0YXJ0ID49IHN0cm0tPmF2YWlsX291dA0KKyAgICAgICAgc3RhdGUtPmJpdHMgPCA4DQorDQorICAgT24gcmV0dXJuLCBzdGF0ZS0+bW9kZSBpcyBvbmUgb2Y6DQorDQorICAgICAgICBMRU4gLS0gcmFuIG91dCBvZiBlbm91Z2ggb3V0cHV0IHNwYWNlIG9yIGVub3VnaCBhdmFpbGFibGUgaW5wdXQNCisgICAgICAgIFRZUEUgLS0gcmVhY2hlZCBlbmQgb2YgYmxvY2sgY29kZSwgaW5mbGF0ZSgpIHRvIGludGVycHJldCBuZXh0IGJsb2NrDQorICAgICAgICBCQUQgLS0gZXJyb3IgaW4gYmxvY2sgZGF0YQ0KKw0KKyAgIE5vdGVzOg0KKw0KKyAgICAtIFRoZSBtYXhpbXVtIGlucHV0IGJpdHMgdXNlZCBieSBhIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzIDE1IGJpdHMgZm9yIHRoZQ0KKyAgICAgIGxlbmd0aCBjb2RlLCA1IGJpdHMgZm9yIHRoZSBsZW5ndGggZXh0cmEsIDE1IGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBjb2RlLA0KKyAgICAgIGFuZCAxMyBiaXRzIGZvciB0aGUgZGlzdGFuY2UgZXh0cmEuICBUaGlzIHRvdGFscyA0OCBiaXRzLCBvciBzaXggYnl0ZXMuDQorICAgICAgVGhlcmVmb3JlIGlmIHN0cm0tPmF2YWlsX2luID49IDYsIHRoZW4gdGhlcmUgaXMgZW5vdWdoIGlucHV0IHRvIGF2b2lkDQorICAgICAgY2hlY2tpbmcgZm9yIGF2YWlsYWJsZSBpbnB1dCB3aGlsZSBkZWNvZGluZy4NCisNCisgICAgLSBUaGUgbWF4aW11bSBieXRlcyB0aGF0IGEgc2luZ2xlIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGNhbiBvdXRwdXQgaXMgMjU4DQorICAgICAgYnl0ZXMsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIGxlbmd0aCB0aGF0IGNhbiBiZSBjb2RlZC4gIGluZmxhdGVfZmFzdCgpDQorICAgICAgcmVxdWlyZXMgc3RybS0+YXZhaWxfb3V0ID49IDI1OCBmb3IgZWFjaCBsb29wIHRvIGF2b2lkIGNoZWNraW5nIGZvcg0KKyAgICAgIG91dHB1dCBzcGFjZS4NCisgKi8NCisNCisNCisNCisgICAgdHlwZWRlZiBzdHJ1Y3QgaW5mZmFzdF9hciB7DQorLyogNjQgICAzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODYgIHg4Nl82NCAqLw0KKy8qIGFyIG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyICovDQorLyogIDAgICAgMCAqLyB2b2lkICplc3A7ICAgICAgICAgICAgICAgIC8qIGVzcCBzYXZlICovDQorLyogIDggICAgNCAqLyB2b2lkICplYnA7ICAgICAgICAgICAgICAgIC8qIGVicCBzYXZlICovDQorLyogMTYgICAgOCAqLyB1bnNpZ25lZCBjaGFyIEZBUiAqaW47ICAgIC8qIGVzaSByc2kgIGxvY2FsIHN0cm0tPm5leHRfaW4gKi8NCisvKiAyNCAgIDEyICovIHVuc2lnbmVkIGNoYXIgRkFSICpsYXN0OyAgLyogICAgIHI5ICAgd2hpbGUgaW4gPCBsYXN0ICovDQorLyogMzIgICAxNiAqLyB1bnNpZ25lZCBjaGFyIEZBUiAqb3V0OyAgIC8qIGVkaSByZGkgIGxvY2FsIHN0cm0tPm5leHRfb3V0ICovDQorLyogNDAgICAyMCAqLyB1bnNpZ25lZCBjaGFyIEZBUiAqYmVnOyAgIC8qICAgICAgICAgIGluZmxhdGUoKSdzIGluaXQgbmV4dF9vdXQgKi8NCisvKiA0OCAgIDI0ICovIHVuc2lnbmVkIGNoYXIgRkFSICplbmQ7ICAgLyogICAgIHIxMCAgd2hpbGUgb3V0IDwgZW5kICovDQorLyogNTYgICAyOCAqLyB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93Oy8qICAgICAgICAgIHNpemUgb2Ygd2luZG93LCB3c2l6ZSE9MCAqLw0KKy8qIDY0ICAgMzIgKi8gY29kZSBjb25zdCBGQVIgKmxjb2RlOyAgICAvKiBlYnAgcmJwICBsb2NhbCBzdHJtLT5sZW5jb2RlICovDQorLyogNzIgICAzNiAqLyBjb2RlIGNvbnN0IEZBUiAqZGNvZGU7ICAgIC8qICAgICByMTEgIGxvY2FsIHN0cm0tPmRpc3Rjb2RlICovDQorLyogODAgICA0MCAqLyBzaXplX3QgLyp1bnNpZ25lZCBsb25nICovaG9sZDsgICAgICAgLyogZWR4IHJkeCAgbG9jYWwgc3RybS0+aG9sZCAqLw0KKy8qIDg4ICAgNDQgKi8gdW5zaWduZWQgYml0czsgICAgICAgICAgICAvKiBlYnggcmJ4ICBsb2NhbCBzdHJtLT5iaXRzICovDQorLyogOTIgICA0OCAqLyB1bnNpZ25lZCB3c2l6ZTsgICAgICAgICAgIC8qICAgICAgICAgIHdpbmRvdyBzaXplICovDQorLyogOTYgICA1MiAqLyB1bnNpZ25lZCB3cml0ZTsgICAgICAgICAgIC8qICAgICAgICAgIHdpbmRvdyB3cml0ZSBpbmRleCAqLw0KKy8qMTAwICAgNTYgKi8gdW5zaWduZWQgbG1hc2s7ICAgICAgICAgICAvKiAgICAgcjEyICBtYXNrIGZvciBsY29kZSAqLw0KKy8qMTA0ICAgNjAgKi8gdW5zaWduZWQgZG1hc2s7ICAgICAgICAgICAvKiAgICAgcjEzICBtYXNrIGZvciBkY29kZSAqLw0KKy8qMTA4ICAgNjQgKi8gdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAvKiAgICAgcjE0ICBtYXRjaCBsZW5ndGggKi8NCisvKjExMiAgIDY4ICovIHVuc2lnbmVkIGRpc3Q7ICAgICAgICAgICAgLyogICAgIHIxNSAgbWF0Y2ggZGlzdGFuY2UgKi8NCisvKjExNiAgIDcyICovIHVuc2lnbmVkIHN0YXR1czsgICAgICAgICAgLyogICAgICAgICAgc2V0IHdoZW4gc3RhdGUgY2huZyovDQorICAgIH0gdHlwZV9hcjsNCisjaWZkZWYgQVNNSU5GDQorDQordm9pZCBpbmZsYXRlX2Zhc3Qoc3RybSwgc3RhcnQpDQorel9zdHJlYW1wIHN0cm07DQordW5zaWduZWQgc3RhcnQ7ICAgICAgICAgLyogaW5mbGF0ZSgpJ3Mgc3RhcnRpbmcgdmFsdWUgZm9yIHN0cm0tPmF2YWlsX291dCAqLw0KK3sNCisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsNCisgICAgdHlwZV9hciBhcjsNCisgICAgdm9pZCBpbmZmYXM4NjY0Zm5jKHN0cnVjdCBpbmZmYXN0X2FyICogcGFyKTsNCisNCisNCisNCisjaWYgKGRlZmluZWQoIF9fR05VQ19fICkgJiYgZGVmaW5lZCggX19hbWQ2NF9fICkgJiYgISBkZWZpbmVkKCBfX2kzODYgKSkgfHwgKGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX01fQU1ENjQpKQ0KKyNkZWZpbmUgUEFEX0FWQUlMX0lOIDYNCisjZGVmaW5lIFBBRF9BVkFJTF9PVVQgMjU4DQorI2Vsc2UNCisjZGVmaW5lIFBBRF9BVkFJTF9JTiA1DQorI2RlZmluZSBQQURfQVZBSUxfT1VUIDI1Nw0KKyNlbmRpZg0KKw0KKyAgICAvKiBjb3B5IHN0YXRlIHRvIGxvY2FsIHZhcmlhYmxlcyAqLw0KKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsNCisNCisgICAgYXIuaW4gPSBzdHJtLT5uZXh0X2luOw0KKyAgICBhci5sYXN0ID0gYXIuaW4gKyAoc3RybS0+YXZhaWxfaW4gLSBQQURfQVZBSUxfSU4pOw0KKyAgICBhci5vdXQgPSBzdHJtLT5uZXh0X291dDsNCisgICAgYXIuYmVnID0gYXIub3V0IC0gKHN0YXJ0IC0gc3RybS0+YXZhaWxfb3V0KTsNCisgICAgYXIuZW5kID0gYXIub3V0ICsgKHN0cm0tPmF2YWlsX291dCAtIFBBRF9BVkFJTF9PVVQpOw0KKyAgICBhci53c2l6ZSA9IHN0YXRlLT53c2l6ZTsNCisgICAgYXIud3JpdGUgPSBzdGF0ZS0+d25leHQ7DQorICAgIGFyLndpbmRvdyA9IHN0YXRlLT53aW5kb3c7DQorICAgIGFyLmhvbGQgPSBzdGF0ZS0+aG9sZDsNCisgICAgYXIuYml0cyA9IHN0YXRlLT5iaXRzOw0KKyAgICBhci5sY29kZSA9IHN0YXRlLT5sZW5jb2RlOw0KKyAgICBhci5kY29kZSA9IHN0YXRlLT5kaXN0Y29kZTsNCisgICAgYXIubG1hc2sgPSAoMVUgPDwgc3RhdGUtPmxlbmJpdHMpIC0gMTsNCisgICAgYXIuZG1hc2sgPSAoMVUgPDwgc3RhdGUtPmRpc3RiaXRzKSAtIDE7DQorDQorICAgIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlcyB1bnRpbCBlbmQtb2YtYmxvY2sgb3Igbm90IGVub3VnaA0KKyAgICAgICBpbnB1dCBkYXRhIG9yIG91dHB1dCBzcGFjZSAqLw0KKw0KKyAgICAvKiBhbGlnbiBpbiBvbiAxLzIgaG9sZCBzaXplIGJvdW5kYXJ5ICovDQorICAgIHdoaWxlICgoKHNpemVfdCkodm9pZCAqKWFyLmluICYgKHNpemVvZihhci5ob2xkKSAvIDIgLSAxKSkgIT0gMCkgew0KKyAgICAgICAgYXIuaG9sZCArPSAodW5zaWduZWQgbG9uZykqYXIuaW4rKyA8PCBhci5iaXRzOw0KKyAgICAgICAgYXIuYml0cyArPSA4Ow0KKyAgICB9DQorDQorICAgIGluZmZhczg2NjRmbmMoJmFyKTsNCisNCisgICAgaWYgKGFyLnN0YXR1cyA+IDEpIHsNCisgICAgICAgIGlmIChhci5zdGF0dXMgPT0gMikNCisgICAgICAgICAgICBzdHJtLT5tc2cgPSAiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIjsNCisgICAgICAgIGVsc2UgaWYgKGFyLnN0YXR1cyA9PSAzKQ0KKyAgICAgICAgICAgIHN0cm0tPm1zZyA9ICJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOw0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHN0cm0tPm1zZyA9ICJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7DQorICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsNCisgICAgfQ0KKyAgICBlbHNlIGlmICggYXIuc3RhdHVzID09IDEgKSB7DQorICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7DQorICAgIH0NCisNCisgICAgLyogcmV0dXJuIHVudXNlZCBieXRlcyAob24gZW50cnksIGJpdHMgPCA4LCBzbyBpbiB3b24ndCBnbyB0b28gZmFyIGJhY2spICovDQorICAgIGFyLmxlbiA9IGFyLmJpdHMgPj4gMzsNCisgICAgYXIuaW4gLT0gYXIubGVuOw0KKyAgICBhci5iaXRzIC09IGFyLmxlbiA8PCAzOw0KKyAgICBhci5ob2xkICY9ICgxVSA8PCBhci5iaXRzKSAtIDE7DQorDQorICAgIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmV0dXJuICovDQorICAgIHN0cm0tPm5leHRfaW4gPSBhci5pbjsNCisgICAgc3RybS0+bmV4dF9vdXQgPSBhci5vdXQ7DQorICAgIHN0cm0tPmF2YWlsX2luID0gKHVuc2lnbmVkKShhci5pbiA8IGFyLmxhc3QgPw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFEX0FWQUlMX0lOICsgKGFyLmxhc3QgLSBhci5pbikgOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFEX0FWQUlMX0lOIC0gKGFyLmluIC0gYXIubGFzdCkpOw0KKyAgICBzdHJtLT5hdmFpbF9vdXQgPSAodW5zaWduZWQpKGFyLm91dCA8IGFyLmVuZCA/DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFEX0FWQUlMX09VVCArIChhci5lbmQgLSBhci5vdXQpIDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQURfQVZBSUxfT1VUIC0gKGFyLm91dCAtIGFyLmVuZCkpOw0KKyAgICBzdGF0ZS0+aG9sZCA9ICh1bnNpZ25lZCBsb25nKWFyLmhvbGQ7DQorICAgIHN0YXRlLT5iaXRzID0gYXIuYml0czsNCisgICAgcmV0dXJuOw0KK30NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL21hc214NjQvaW5mZmFzeDY0LmFzbSBiL3psaWIvc3JjL2NvbnRyaWIvbWFzbXg2NC9pbmZmYXN4NjQuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYThkODkKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL21hc214NjQvaW5mZmFzeDY0LmFzbQpAQCAtMCwwICsxLDM5NiBAQAorOyBpbmZmYXN4NjQuYXNtIGlzIGEgaGFuZCB0dW5lZCBhc3NlbWJsZXIgdmVyc2lvbiBvZiBpbmZmYXN0LmMgLSBmYXN0IGRlY29kaW5nDQorOyB2ZXJzaW9uIGZvciBBTUQ2NCBvbiBXaW5kb3dzIHVzaW5nIE1pY3Jvc29mdCBDIGNvbXBpbGVyDQorOw0KKzsgaW5mZmFzeDY0LmFzbSBpcyBhdXRvbWF0aWNhbGx5IGNvbnZlcnQgZnJvbSBBTUQ2NCBwb3J0aW9uIG9mIGluZmZhczg2LmMNCis7IGluZmZhc3g2NC5hc20gaXMgY2FsbGVkIGJ5IGluZmZhczg2NjQuYywgd2hpY2ggY29udGFpbiBtb3JlIGluZm8uDQorDQorDQorOyB0byBjb21waWxlIHRoaXMgZmlsZSwgSSB1c2Ugb3B0aW9uDQorOyAgIG1sNjQuZXhlIC9GbGluZmZhc3g2NCAvYyAvWmkgaW5mZmFzeDY0LmFzbQ0KKzsgICB3aXRoIE1pY3Jvc29mdCBNYWNybyBBc3NlbWJsZXIgKHg2NCkgZm9yIEFNRDY0DQorOw0KKw0KKzsgVGhpcyBmaWxlIGNvbXBpbGUgd2l0aCBNaWNyb3NvZnQgTWFjcm8gQXNzZW1ibGVyICh4NjQpIGZvciBBTUQ2NA0KKzsNCis7ICAgbWw2NC5leGUgaXMgZ2l2ZW4gd2l0aCBWaXN1YWwgU3R1ZGlvIDIwMDUvMjAwOC8yMDEwIGFuZCBXaW5kb3dzIFdESw0KKzsNCis7ICAgKHlvdSBjYW4gZ2V0IFdpbmRvd3MgV0RLIHdpdGggbWw2NCBmb3IgQU1ENjQgZnJvbQ0KKzsgICAgICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vd2hkYy9EZXZ0b29scy93ZGsvZGVmYXVsdC5tc3B4IGZvciBsb3cgcHJpY2UpDQorOw0KKw0KKw0KKy5jb2RlDQoraW5mZmFzODY2NGZuYyBQUk9DDQorDQorOyBzZWUgaHR0cDovL3dlYmxvZ3MuYXNwLm5ldC9vbGRuZXd0aGluZy9hcmNoaXZlLzIwMDQvMDEvMTQvNTg1NzkuYXNweCBhbmQNCis7IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9lbi11cy9rbWFyY2gvaGgva21hcmNoLzY0Yml0QU1EXzhlOTUxZGQyLWVlNzctNDcyOC04NzAyLTU1Y2U0YjVkZDI0YS54bWwuYXNwDQorOw0KKzsgQWxsIHJlZ2lzdGVycyBtdXN0IGJlIHByZXNlcnZlZCBhY3Jvc3MgdGhlIGNhbGwsIGV4Y2VwdCBmb3INCis7ICAgcmF4LCByY3gsIHJkeCwgcjgsIHItOSwgcjEwLCBhbmQgcjExLCB3aGljaCBhcmUgc2NyYXRjaC4NCisNCisNCisJbW92IFtyc3AtOF0scnNpDQorCW1vdiBbcnNwLTE2XSxyZGkNCisJbW92IFtyc3AtMjRdLHIxMg0KKwltb3YgW3JzcC0zMl0scjEzDQorCW1vdiBbcnNwLTQwXSxyMTQNCisJbW92IFtyc3AtNDhdLHIxNQ0KKwltb3YgW3JzcC01Nl0scmJ4DQorDQorCW1vdiByYXgscmN4DQorDQorCW1vdglbcmF4KzhdLCByYnAgICAgICAgOyAvKiBzYXZlIHJlZ3MgcmJwIGFuZCByc3AgKi8NCisJbW92CVtyYXhdLCByc3ANCisNCisJbW92CXJzcCwgcmF4ICAgICAgICAgIDsgLyogbWFrZSByc3AgcG9pbnQgdG8gJmFyICovDQorDQorCW1vdglyc2ksIFtyc3ArMTZdICAgICAgOyAvKiByc2kgID0gaW4gKi8NCisJbW92CXJkaSwgW3JzcCszMl0gICAgICA7IC8qIHJkaSAgPSBvdXQgKi8NCisJbW92CXI5LCBbcnNwKzI0XSAgICAgICA7IC8qIHI5ICAgPSBsYXN0ICovDQorCW1vdglyMTAsIFtyc3ArNDhdICAgICAgOyAvKiByMTAgID0gZW5kICovDQorCW1vdglyYnAsIFtyc3ArNjRdICAgICAgOyAvKiByYnAgID0gbGNvZGUgKi8NCisJbW92CXIxMSwgW3JzcCs3Ml0gICAgICA7IC8qIHIxMSAgPSBkY29kZSAqLw0KKwltb3YJcmR4LCBbcnNwKzgwXSAgICAgIDsgLyogcmR4ICA9IGhvbGQgKi8NCisJbW92CWVieCwgW3JzcCs4OF0gICAgICA7IC8qIGVieCAgPSBiaXRzICovDQorCW1vdglyMTJkLCBbcnNwKzEwMF0gICAgOyAvKiByMTJkID0gbG1hc2sgKi8NCisJbW92CXIxM2QsIFtyc3ArMTA0XSAgICA7IC8qIHIxM2QgPSBkbWFzayAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgLyogcjE0ZCA9IGxlbiAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgLyogcjE1ZCA9IGRpc3QgKi8NCisNCisNCisJY2xkDQorCWNtcAlyMTAsIHJkaQ0KKwlqZQlMX29uZV90aW1lICAgICAgICAgICA7IC8qIGlmIG9ubHkgb25lIGRlY29kZSBsZWZ0ICovDQorCWNtcAlyOSwgcnNpDQorDQorICAgIGpuZSBMX2RvX2xvb3ANCisNCisNCitMX29uZV90aW1lOg0KKwltb3YJcjgsIHIxMiAgICAgICAgICAgOyAvKiByOCA9IGxtYXNrICovDQorCWNtcAlibCwgMzINCisJamEJTF9nZXRfbGVuZ3RoX2NvZGVfb25lX3RpbWUNCisNCisJbG9kc2QgICAgICAgICAgICAgICAgICAgICAgICAgOyAvKiBlYXggPSAqKHVpbnQgKilpbisrICovDQorCW1vdgljbCwgYmwgICAgICAgICAgICA7IC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovDQorCWFkZAlibCwgMzIgICAgICAgICAgICAgOyAvKiBiaXRzICs9IDMyICovDQorCXNobAlyYXgsIGNsDQorCW9yCXJkeCwgcmF4ICAgICAgICAgIDsgLyogaG9sZCB8PSAqKCh1aW50ICopaW4pKysgPDwgYml0cyAqLw0KKwlqbXAJTF9nZXRfbGVuZ3RoX2NvZGVfb25lX3RpbWUNCisNCitBTElHTiA0DQorTF93aGlsZV90ZXN0Og0KKwljbXAJcjEwLCByZGkNCisJamJlCUxfYnJlYWtfbG9vcA0KKwljbXAJcjksIHJzaQ0KKwlqYmUJTF9icmVha19sb29wDQorDQorTF9kb19sb29wOg0KKwltb3YJcjgsIHIxMiAgICAgICAgICAgOyAvKiByOCA9IGxtYXNrICovDQorCWNtcAlibCwgMzINCisJamEJTF9nZXRfbGVuZ3RoX2NvZGUgICAgOyAvKiBpZiAoMzIgPCBiaXRzKSAqLw0KKw0KKwlsb2RzZCAgICAgICAgICAgICAgICAgICAgICAgICA7IC8qIGVheCA9ICoodWludCAqKWluKysgKi8NCisJbW92CWNsLCBibCAgICAgICAgICAgIDsgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8NCisJYWRkCWJsLCAzMiAgICAgICAgICAgICA7IC8qIGJpdHMgKz0gMzIgKi8NCisJc2hsCXJheCwgY2wNCisJb3IJcmR4LCByYXggICAgICAgICAgOyAvKiBob2xkIHw9ICooKHVpbnQgKilpbikrKyA8PCBiaXRzICovDQorDQorTF9nZXRfbGVuZ3RoX2NvZGU6DQorCWFuZAlyOCwgcmR4ICAgICAgICAgICAgOyAvKiByOCAmPSBob2xkICovDQorCW1vdgllYXgsIFtyYnArcjgqNF0gIDsgLyogZWF4ID0gbGNvZGVbaG9sZCAmIGxtYXNrXSAqLw0KKw0KKwltb3YJY2wsIGFoICAgICAgICAgICAgOyAvKiBjbCA9IHRoaXMuYml0cyAqLw0KKwlzdWIJYmwsIGFoICAgICAgICAgICAgOyAvKiBiaXRzIC09IHRoaXMuYml0cyAqLw0KKwlzaHIJcmR4LCBjbCAgICAgICAgICAgOyAvKiBob2xkID4+PSB0aGlzLmJpdHMgKi8NCisNCisJdGVzdAlhbCwgYWwNCisJam56CUxfdGVzdF9mb3JfbGVuZ3RoX2Jhc2UgOyAvKiBpZiAob3AgIT0gMCkgNDUuNyUgKi8NCisNCisJbW92CXI4LCByMTIgICAgICAgICAgICA7IC8qIHI4ID0gbG1hc2sgKi8NCisJc2hyCWVheCwgMTYgICAgICAgICAgICA7IC8qIG91dHB1dCB0aGlzLnZhbCBjaGFyICovDQorCXN0b3NiDQorDQorTF9nZXRfbGVuZ3RoX2NvZGVfb25lX3RpbWU6DQorCWFuZAlyOCwgcmR4ICAgICAgICAgICAgOyAvKiByOCAmPSBob2xkICovDQorCW1vdgllYXgsIFtyYnArcjgqNF0gOyAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovDQorDQorTF9kb2xlbjoNCisJbW92CWNsLCBhaCAgICAgICAgICAgIDsgLyogY2wgPSB0aGlzLmJpdHMgKi8NCisJc3ViCWJsLCBhaCAgICAgICAgICAgIDsgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8NCisJc2hyCXJkeCwgY2wgICAgICAgICAgIDsgLyogaG9sZCA+Pj0gdGhpcy5iaXRzICovDQorDQorCXRlc3QJYWwsIGFsDQorCWpueglMX3Rlc3RfZm9yX2xlbmd0aF9iYXNlIDsgLyogaWYgKG9wICE9IDApIDQ1LjclICovDQorDQorCXNocgllYXgsIDE2ICAgICAgICAgICAgOyAvKiBvdXRwdXQgdGhpcy52YWwgY2hhciAqLw0KKwlzdG9zYg0KKwlqbXAJTF93aGlsZV90ZXN0DQorDQorQUxJR04gNA0KK0xfdGVzdF9mb3JfbGVuZ3RoX2Jhc2U6DQorCW1vdglyMTRkLCBlYXggICAgICAgICA7IC8qIGxlbiA9IHRoaXMgKi8NCisJc2hyCXIxNGQsIDE2ICAgICAgICAgICA7IC8qIGxlbiA9IHRoaXMudmFsICovDQorCW1vdgljbCwgYWwNCisNCisJdGVzdAlhbCwgMTYNCisJanoJTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoIDsgLyogaWYgKChvcCAmIDE2KSA9PSAwKSA4JSAqLw0KKwlhbmQJY2wsIDE1ICAgICAgICAgICAgIDsgLyogb3AgJj0gMTUgKi8NCisJanoJTF9kZWNvZGVfZGlzdGFuY2UgICAgOyAvKiBpZiAoIW9wKSAqLw0KKw0KK0xfYWRkX2JpdHNfdG9fbGVuOg0KKwlzdWIJYmwsIGNsDQorCXhvcgllYXgsIGVheA0KKwlpbmMJZWF4DQorCXNobAllYXgsIGNsDQorCWRlYwllYXgNCisJYW5kCWVheCwgZWR4ICAgICAgICAgIDsgLyogZWF4ICY9IGhvbGQgKi8NCisJc2hyCXJkeCwgY2wNCisJYWRkCXIxNGQsIGVheCAgICAgICAgIDsgLyogbGVuICs9IGhvbGQgJiBtYXNrW29wXSAqLw0KKw0KK0xfZGVjb2RlX2Rpc3RhbmNlOg0KKwltb3YJcjgsIHIxMyAgICAgICAgICAgOyAvKiByOCA9IGRtYXNrICovDQorCWNtcAlibCwgMzINCisJamEJTF9nZXRfZGlzdGFuY2VfY29kZSAgOyAvKiBpZiAoMzIgPCBiaXRzKSAqLw0KKw0KKwlsb2RzZCAgICAgICAgICAgICAgICAgICAgICAgICA7IC8qIGVheCA9ICoodWludCAqKWluKysgKi8NCisJbW92CWNsLCBibCAgICAgICAgICAgIDsgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8NCisJYWRkCWJsLCAzMiAgICAgICAgICAgICA7IC8qIGJpdHMgKz0gMzIgKi8NCisJc2hsCXJheCwgY2wNCisJb3IJcmR4LCByYXggICAgICAgICAgOyAvKiBob2xkIHw9ICooKHVpbnQgKilpbikrKyA8PCBiaXRzICovDQorDQorTF9nZXRfZGlzdGFuY2VfY29kZToNCisJYW5kCXI4LCByZHggICAgICAgICAgIDsgLyogcjggJj0gaG9sZCAqLw0KKwltb3YJZWF4LCBbcjExK3I4KjRdIDsgLyogZWF4ID0gZGNvZGVbaG9sZCAmIGRtYXNrXSAqLw0KKw0KK0xfZG9kaXN0Og0KKwltb3YJcjE1ZCwgZWF4ICAgICAgICAgOyAvKiBkaXN0ID0gdGhpcyAqLw0KKwlzaHIJcjE1ZCwgMTYgICAgICAgICAgIDsgLyogZGlzdCA9IHRoaXMudmFsICovDQorCW1vdgljbCwgYWgNCisJc3ViCWJsLCBhaCAgICAgICAgICAgIDsgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8NCisJc2hyCXJkeCwgY2wgICAgICAgICAgIDsgLyogaG9sZCA+Pj0gdGhpcy5iaXRzICovDQorCW1vdgljbCwgYWwgICAgICAgICAgICA7IC8qIGNsID0gdGhpcy5vcCAqLw0KKw0KKwl0ZXN0CWFsLCAxNiAgICAgICAgICAgICA7IC8qIGlmICgob3AgJiAxNikgPT0gMCkgKi8NCisJanoJTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdA0KKwlhbmQJY2wsIDE1ICAgICAgICAgICAgIDsgLyogb3AgJj0gMTUgKi8NCisJanoJTF9jaGVja19kaXN0X29uZQ0KKw0KK0xfYWRkX2JpdHNfdG9fZGlzdDoNCisJc3ViCWJsLCBjbA0KKwl4b3IJZWF4LCBlYXgNCisJaW5jCWVheA0KKwlzaGwJZWF4LCBjbA0KKwlkZWMJZWF4ICAgICAgICAgICAgICAgICA7IC8qICgxIDw8IG9wKSAtIDEgKi8NCisJYW5kCWVheCwgZWR4ICAgICAgICAgIDsgLyogZWF4ICY9IGhvbGQgKi8NCisJc2hyCXJkeCwgY2wNCisJYWRkCXIxNWQsIGVheCAgICAgICAgIDsgLyogZGlzdCArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpICovDQorDQorTF9jaGVja193aW5kb3c6DQorCW1vdglyOCwgcnNpICAgICAgICAgICA7IC8qIHNhdmUgaW4gc28gZnJvbSBjYW4gdXNlIGl0J3MgcmVnICovDQorCW1vdglyYXgsIHJkaQ0KKwlzdWIJcmF4LCBbcnNwKzQwXSAgICAgIDsgLyogbmJ5dGVzID0gb3V0IC0gYmVnICovDQorDQorCWNtcAllYXgsIHIxNWQNCisJamIJTF9jbGlwX3dpbmRvdyAgICAgICAgOyAvKiBpZiAoZGlzdCA+IG5ieXRlcykgNC4yJSAqLw0KKw0KKwltb3YJZWN4LCByMTRkICAgICAgICAgOyAvKiBlY3ggPSBsZW4gKi8NCisJbW92CXJzaSwgcmRpDQorCXN1Yglyc2ksIHIxNSAgICAgICAgICA7IC8qIGZyb20gPSBvdXQgLSBkaXN0ICovDQorDQorCXNhcgllY3gsIDENCisJam5jCUxfY29weV90d28gICAgICAgICAgIDsgLyogaWYgbGVuICUgMiA9PSAwICovDQorDQorCXJlcCAgICAgbW92c3cNCisJbW92CWFsLCBbcnNpXQ0KKwltb3YJW3JkaV0sIGFsDQorCWluYwlyZGkNCisNCisJbW92CXJzaSwgcjggICAgICAgICAgIDsgLyogbW92ZSBpbiBiYWNrIHRvICVyc2ksIHRvc3MgZnJvbSAqLw0KKwlqbXAJTF93aGlsZV90ZXN0DQorDQorTF9jb3B5X3R3bzoNCisJcmVwICAgICBtb3Zzdw0KKwltb3YJcnNpLCByOCAgICAgICAgICAgOyAvKiBtb3ZlIGluIGJhY2sgdG8gJXJzaSwgdG9zcyBmcm9tICovDQorCWptcAlMX3doaWxlX3Rlc3QNCisNCitBTElHTiA0DQorTF9jaGVja19kaXN0X29uZToNCisJY21wCXIxNWQsIDEgICAgICAgICAgICA7IC8qIGlmIGRpc3QgMSwgaXMgYSBtZW1zZXQgKi8NCisJam5lCUxfY2hlY2tfd2luZG93DQorCWNtcAlbcnNwKzQwXSwgcmRpICAgICAgOyAvKiBpZiBvdXQgPT0gYmVnLCBvdXRzaWRlIHdpbmRvdyAqLw0KKwlqZQlMX2NoZWNrX3dpbmRvdw0KKw0KKwltb3YJZWN4LCByMTRkICAgICAgICAgOyAvKiBlY3ggPSBsZW4gKi8NCisJbW92CWFsLCBbcmRpLTFdDQorCW1vdglhaCwgYWwNCisNCisJc2FyCWVjeCwgMQ0KKwlqbmMJTF9zZXRfdHdvDQorCW1vdglbcmRpXSwgYWwNCisJaW5jCXJkaQ0KKw0KK0xfc2V0X3R3bzoNCisJcmVwICAgICBzdG9zdw0KKwlqbXAJTF93aGlsZV90ZXN0DQorDQorQUxJR04gNA0KK0xfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aDoNCisJdGVzdAlhbCwgNjQNCisJam56CUxfdGVzdF9mb3JfZW5kX29mX2Jsb2NrIDsgLyogaWYgKChvcCAmIDY0KSAhPSAwKSAqLw0KKw0KKwl4b3IJZWF4LCBlYXgNCisJaW5jCWVheA0KKwlzaGwJZWF4LCBjbA0KKwlkZWMJZWF4DQorCWFuZAllYXgsIGVkeCAgICAgICAgIDsgLyogZWF4ICY9IGhvbGQgKi8NCisJYWRkCWVheCwgcjE0ZCAgICAgICAgOyAvKiBlYXggKz0gbGVuICovDQorCW1vdgllYXgsIFtyYnArcmF4KjRdIDsgLyogZWF4ID0gbGNvZGVbdmFsKyhob2xkJm1hc2tbb3BdKV0qLw0KKwlqbXAJTF9kb2xlbg0KKw0KK0FMSUdOIDQNCitMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0Og0KKwl0ZXN0CWFsLCA2NA0KKwlqbnoJTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGUgOyAvKiBpZiAoKG9wICYgNjQpICE9IDApICovDQorDQorCXhvcgllYXgsIGVheA0KKwlpbmMJZWF4DQorCXNobAllYXgsIGNsDQorCWRlYwllYXgNCisJYW5kCWVheCwgZWR4ICAgICAgICAgOyAvKiBlYXggJj0gaG9sZCAqLw0KKwlhZGQJZWF4LCByMTVkICAgICAgICA7IC8qIGVheCArPSBkaXN0ICovDQorCW1vdgllYXgsIFtyMTErcmF4KjRdIDsgLyogZWF4ID0gZGNvZGVbdmFsKyhob2xkJm1hc2tbb3BdKV0qLw0KKwlqbXAJTF9kb2Rpc3QNCisNCitBTElHTiA0DQorTF9jbGlwX3dpbmRvdzoNCisJbW92CWVjeCwgZWF4ICAgICAgICAgOyAvKiBlY3ggPSBuYnl0ZXMgKi8NCisJbW92CWVheCwgW3JzcCs5Ml0gICAgIDsgLyogZWF4ID0gd3NpemUsIHByZXBhcmUgZm9yIGRpc3QgY21wICovDQorCW5lZwllY3ggICAgICAgICAgICAgICAgOyAvKiBuYnl0ZXMgPSAtbmJ5dGVzICovDQorDQorCWNtcAllYXgsIHIxNWQNCisJamIJTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXIgOyAvKiBpZiAoZGlzdCA+IHdzaXplKSAqLw0KKw0KKwlhZGQJZWN4LCByMTVkICAgICAgICAgOyAvKiBuYnl0ZXMgPSBkaXN0IC0gbmJ5dGVzICovDQorCWNtcAlkd29yZCBwdHIgW3JzcCs5Nl0sIDANCisJam5lCUxfd3JhcF9hcm91bmRfd2luZG93IDsgLyogaWYgKHdyaXRlICE9IDApICovDQorDQorCW1vdglyc2ksIFtyc3ArNTZdICAgICA7IC8qIGZyb20gID0gd2luZG93ICovDQorCXN1YgllYXgsIGVjeCAgICAgICAgIDsgLyogZWF4ICAtPSBuYnl0ZXMgKi8NCisJYWRkCXJzaSwgcmF4ICAgICAgICAgOyAvKiBmcm9tICs9IHdzaXplIC0gbmJ5dGVzICovDQorDQorCW1vdgllYXgsIHIxNGQgICAgICAgIDsgLyogZWF4ID0gbGVuICovDQorCWNtcAlyMTRkLCBlY3gNCisJamJlCUxfZG9fY29weSAgICAgICAgICAgOyAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8NCisNCisJc3ViCWVheCwgZWN4ICAgICAgICAgOyAvKiBlYXggLT0gbmJ5dGVzICovDQorCXJlcCAgICAgbW92c2INCisJbW92CXJzaSwgcmRpDQorCXN1Yglyc2ksIHIxNSAgICAgICAgIDsgLyogZnJvbSA9ICZvdXRbIC1kaXN0IF0gKi8NCisJam1wCUxfZG9fY29weQ0KKw0KK0FMSUdOIDQNCitMX3dyYXBfYXJvdW5kX3dpbmRvdzoNCisJbW92CWVheCwgW3JzcCs5Nl0gICAgIDsgLyogZWF4ID0gd3JpdGUgKi8NCisJY21wCWVjeCwgZWF4DQorCWpiZQlMX2NvbnRpZ3VvdXNfaW5fd2luZG93IDsgLyogaWYgKHdyaXRlID49IG5ieXRlcykgKi8NCisNCisJbW92CWVzaSwgW3JzcCs5Ml0gICAgIDsgLyogZnJvbSAgPSB3c2l6ZSAqLw0KKwlhZGQJcnNpLCBbcnNwKzU2XSAgICAgOyAvKiBmcm9tICs9IHdpbmRvdyAqLw0KKwlhZGQJcnNpLCByYXggICAgICAgICA7IC8qIGZyb20gKz0gd3JpdGUgKi8NCisJc3ViCXJzaSwgcmN4ICAgICAgICAgOyAvKiBmcm9tIC09IG5ieXRlcyAqLw0KKwlzdWIJZWN4LCBlYXggICAgICAgICA7IC8qIG5ieXRlcyAtPSB3cml0ZSAqLw0KKw0KKwltb3YJZWF4LCByMTRkICAgICAgICA7IC8qIGVheCA9IGxlbiAqLw0KKwljbXAJZWF4LCBlY3gNCisJamJlCUxfZG9fY29weSAgICAgICAgICAgOyAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8NCisNCisJc3ViCWVheCwgZWN4ICAgICAgICAgOyAvKiBsZW4gLT0gbmJ5dGVzICovDQorCXJlcCAgICAgbW92c2INCisJbW92CXJzaSwgW3JzcCs1Nl0gICAgIDsgLyogZnJvbSA9IHdpbmRvdyAqLw0KKwltb3YJZWN4LCBbcnNwKzk2XSAgICAgOyAvKiBuYnl0ZXMgPSB3cml0ZSAqLw0KKwljbXAJZWF4LCBlY3gNCisJamJlCUxfZG9fY29weSAgICAgICAgICAgOyAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8NCisNCisJc3ViCWVheCwgZWN4ICAgICAgICAgOyAvKiBsZW4gLT0gbmJ5dGVzICovDQorCXJlcCAgICAgbW92c2INCisJbW92CXJzaSwgcmRpDQorCXN1Yglyc2ksIHIxNSAgICAgICAgIDsgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8NCisJam1wCUxfZG9fY29weQ0KKw0KK0FMSUdOIDQNCitMX2NvbnRpZ3VvdXNfaW5fd2luZG93Og0KKwltb3YJcnNpLCBbcnNwKzU2XSAgICAgOyAvKiByc2kgPSB3aW5kb3cgKi8NCisJYWRkCXJzaSwgcmF4DQorCXN1Yglyc2ksIHJjeCAgICAgICAgIDsgLyogZnJvbSArPSB3cml0ZSAtIG5ieXRlcyAqLw0KKw0KKwltb3YJZWF4LCByMTRkICAgICAgICA7IC8qIGVheCA9IGxlbiAqLw0KKwljbXAJZWF4LCBlY3gNCisJamJlCUxfZG9fY29weSAgICAgICAgICAgOyAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8NCisNCisJc3ViCWVheCwgZWN4ICAgICAgICAgOyAvKiBsZW4gLT0gbmJ5dGVzICovDQorCXJlcCAgICAgbW92c2INCisJbW92CXJzaSwgcmRpDQorCXN1Yglyc2ksIHIxNSAgICAgICAgIDsgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8NCisJam1wCUxfZG9fY29weSAgICAgICAgICAgOyAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8NCisNCitBTElHTiA0DQorTF9kb19jb3B5Og0KKwltb3YJZWN4LCBlYXggICAgICAgICA7IC8qIGVjeCA9IGxlbiAqLw0KKwlyZXAgICAgIG1vdnNiDQorDQorCW1vdglyc2ksIHI4ICAgICAgICAgIDsgLyogbW92ZSBpbiBiYWNrIHRvICVlc2ksIHRvc3MgZnJvbSAqLw0KKwlqbXAJTF93aGlsZV90ZXN0DQorDQorTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2s6DQorCXRlc3QJYWwsIDMyDQorCWp6CUxfaW52YWxpZF9saXRlcmFsX2xlbmd0aF9jb2RlDQorCW1vdglkd29yZCBwdHIgW3JzcCsxMTZdLCAxDQorCWptcAlMX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXMNCisNCitMX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZToNCisJbW92CWR3b3JkIHB0ciBbcnNwKzExNl0sIDINCisJam1wCUxfYnJlYWtfbG9vcF93aXRoX3N0YXR1cw0KKw0KK0xfaW52YWxpZF9kaXN0YW5jZV9jb2RlOg0KKwltb3YJZHdvcmQgcHRyIFtyc3ArMTE2XSwgMw0KKwlqbXAJTF9icmVha19sb29wX3dpdGhfc3RhdHVzDQorDQorTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXI6DQorCW1vdglkd29yZCBwdHIgW3JzcCsxMTZdLCA0DQorCWptcAlMX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXMNCisNCitMX2JyZWFrX2xvb3A6DQorCW1vdglkd29yZCBwdHIgW3JzcCsxMTZdLCAwDQorDQorTF9icmVha19sb29wX3dpdGhfc3RhdHVzOg0KKzsgLyogcHV0IGluLCBvdXQsIGJpdHMsIGFuZCBob2xkIGJhY2sgaW50byBhciBhbmQgcG9wIGVzcCAqLw0KKwltb3YJW3JzcCsxNl0sIHJzaSAgICAgOyAvKiBpbiAqLw0KKwltb3YJW3JzcCszMl0sIHJkaSAgICAgOyAvKiBvdXQgKi8NCisJbW92CVtyc3ArODhdLCBlYnggICAgIDsgLyogYml0cyAqLw0KKwltb3YJW3JzcCs4MF0sIHJkeCAgICAgOyAvKiBob2xkICovDQorDQorCW1vdglyYXgsIFtyc3BdICAgICAgIDsgLyogcmVzdG9yZSByYnAgYW5kIHJzcCAqLw0KKwltb3YJcmJwLCBbcnNwKzhdDQorCW1vdglyc3AsIHJheA0KKw0KKw0KKw0KKwltb3YgcnNpLFtyc3AtOF0NCisJbW92IHJkaSxbcnNwLTE2XQ0KKwltb3YgcjEyLFtyc3AtMjRdDQorCW1vdiByMTMsW3JzcC0zMl0NCisJbW92IHIxNCxbcnNwLTQwXQ0KKwltb3YgcjE1LFtyc3AtNDhdDQorCW1vdiByYngsW3JzcC01Nl0NCisNCisgICAgcmV0IDANCis7ICAgICAgICAgIDoNCis7ICAgICAgICAgIDogIm0iIChhcikNCis7ICAgICAgICAgIDogIm1lbW9yeSIsICIlcmF4IiwgIiVyYngiLCAiJXJjeCIsICIlcmR4IiwgIiVyc2kiLCAiJXJkaSIsDQorOyAgICAgICAgICAgICIlcjgiLCAiJXI5IiwgIiVyMTAiLCAiJXIxMSIsICIlcjEyIiwgIiVyMTMiLCAiJXIxNCIsICIlcjE1Ig0KKzsgICAgKTsNCisNCitpbmZmYXM4NjY0Zm5jIAlFTkRQDQorO19URVhUCUVORFMNCitFTkQNCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL21hc214NjQvcmVhZG1lLnR4dCBiL3psaWIvc3JjL2NvbnRyaWIvbWFzbXg2NC9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYTY3MzMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL21hc214NjQvcmVhZG1lLnR4dApAQCAtMCwwICsxLDMxIEBACitTdW1tYXJ5DQorLS0tLS0tLQ0KK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIEFTTSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGZ1bmN0aW9ucw0KK2xvbmdlc3RfbWF0Y2goKSBhbmQgaW5mbGF0ZV9mYXN0KCksIGZvciA2NCBiaXRzIHg4NiAoYm90aCBBTUQ2NCBhbmQgSW50ZWwgRU02NHQpLA0KK2ZvciB1c2Ugd2l0aCBNaWNyb3NvZnQgTWFjcm8gQXNzZW1ibGVyICh4NjQpIGZvciBBTUQ2NCBhbmQgTWljcm9zb2Z0IEMrKyA2NCBiaXRzLg0KKw0KK2d2bWF0NjQuYXNtIGlzIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnQgKDIwMDUpLCBieSB1c2luZyBCcmlhbiBSYWl0ZXIgNjg2LzMyIGJpdHMNCisgICBhc3NlbWJseSBvcHRpbWl6ZWQgdmVyc2lvbiBmcm9tIEplYW4tbG91cCBHYWlsbHkgb3JpZ2luYWwgbG9uZ2VzdF9tYXRjaCBmdW5jdGlvbg0KKw0KK2luZmZhc3g2NC5hc20gYW5kIGluZmZhczg2NjQuYyB3ZXJlIHdyaXR0ZW4gYnkgQ2hyaXMgQW5kZXJzb24sIGJ5IG9wdGltaXppbmcNCisgICBvcmlnaW5hbCBmdW5jdGlvbiBmcm9tIE1hcmsgQWRsZXINCisNCitVc2UgaW5zdHJ1Y3Rpb25zDQorLS0tLS0tLS0tLS0tLS0tLQ0KK0Fzc2VtYmxlIHRoZSAuYXNtIGZpbGVzIHVzaW5nIE1BU00gYW5kIHB1dCB0aGUgb2JqZWN0IGZpbGVzIGludG8gdGhlIHpsaWIgc291cmNlDQorZGlyZWN0b3J5LiAgWW91IGNhbiBhbHNvIGdldCBvYmplY3QgZmlsZXMgaGVyZToNCisNCisgICAgIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvemxpYjEyNF9tYXNtX29iai56aXANCisNCitkZWZpbmUgQVNNViBhbmQgQVNNSU5GIGluIHlvdXIgcHJvamVjdC4gSW5jbHVkZSBpbmZmYXM4NjY0LmMgaW4geW91ciBzb3VyY2UgdHJlZSwNCithbmQgaW5mZmFzeDY0Lm9iaiBhbmQgZ3ZtYXQ2NC5vYmogYXMgb2JqZWN0IHRvIGxpbmsuDQorDQorDQorQnVpbGQgaW5zdHJ1Y3Rpb25zDQorLS0tLS0tLS0tLS0tLS0tLS0tDQorcnVuIGJsZF82NC5iYXQgd2l0aCBNaWNyb3NvZnQgTWFjcm8gQXNzZW1ibGVyICh4NjQpIGZvciBBTUQ2NCAobWw2NC5leGUpDQorDQorbWw2NC5leGUgaXMgZ2l2ZW4gd2l0aCBWaXN1YWwgU3R1ZGlvIDIwMDUsIFdpbmRvd3MgMjAwMyBzZXJ2ZXIgRERLDQorDQorWW91IGNhbiBnZXQgV2luZG93cyAyMDAzIHNlcnZlciBEREsgd2l0aCBtbDY0IGFuZCBjbCBmb3IgQU1ENjQgZnJvbQ0KKyAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3doZGMvZGV2dG9vbHMvZGRrL2RlZmF1bHQubXNweCBmb3IgbG93IHByaWNlKQ0KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvbWFzbXg4Ni9ibGRfbWwzMi5iYXQgYi96bGliL3NyYy9jb250cmliL21hc214ODYvYmxkX21sMzIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYjg2YmYKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL21hc214ODYvYmxkX21sMzIuYmF0CkBAIC0wLDAgKzEsMiBAQAorbWwgL2NvZmYgL1ppIC9jIC9GbG1hdGNoNjg2LmxzdCBtYXRjaDY4Ni5hc20NCittbCAvY29mZiAvWmkgL2MgL0ZsaW5mZmFzMzIubHN0IGluZmZhczMyLmFzbQ0KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvbWFzbXg4Ni9pbmZmYXMzMi5hc20gYi96bGliL3NyYy9jb250cmliL21hc214ODYvaW5mZmFzMzIuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZDIwZjgKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL21hc214ODYvaW5mZmFzMzIuYXNtCkBAIC0wLDAgKzEsMTA4MCBAQAorOy8qIGluZmZhczMyLmFzbSBpcyBhIGhhbmQgdHVuZWQgYXNzZW1ibGVyIHZlcnNpb24gb2YgaW5mZmFzdC5jIC0tIGZhc3QgZGVjb2RpbmcNCis7ICoNCis7ICogaW5mZmFzMzIuYXNtIGlzIGRlcml2YXRlZCBmcm9tIGluZmZhczg2LmMsIHdpdGggdHJhbnNsYXRpb24gb2YgYXNzZW1ibHkgY29kZQ0KKzsgKg0KKzsgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBNYXJrIEFkbGVyDQorOyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgNCis7ICoNCis7ICogQ29weXJpZ2h0IChDKSAyMDAzIENocmlzIEFuZGVyc29uIDxjaHJpc3RvcEBjaGFybS5uZXQ+DQorOyAqIFBsZWFzZSB1c2UgdGhlIGNvcHlyaWdodCBjb25kaXRpb25zIGFib3ZlLg0KKzsgKg0KKzsgKiBNYXItMTMtMjAwMyAtLSBNb3N0IG9mIHRoaXMgaXMgZGVyaXZlZCBmcm9tIGluZmZhc3QuUyB3aGljaCBpcyBkZXJpdmVkIGZyb20NCis7ICogdGhlIGdjYyAtUyBvdXRwdXQgb2YgemxpYi0xLjIuMC9pbmZmYXN0LmMuICBabGliLTEuMi4wIGlzIGluIGJldGEgcmVsZWFzZSBhdA0KKzsgKiB0aGUgbW9tZW50LiAgSSBoYXZlIHN1Y2Nlc3NmdWxseSBjb21waWxlZCBhbmQgdGVzdGVkIHRoaXMgY29kZSB3aXRoIGdjYzIuOTYsDQorOyAqIGdjYzMuMiwgaWNjNS4wLCBtc3ZjNi4wLiAgSXQgaXMgdmVyeSBjbG9zZSB0byB0aGUgc3BlZWQgb2YgaW5mZmFzdC5TDQorOyAqIGNvbXBpbGVkIHdpdGggZ2NjIC1ETk9fTU1YLCBidXQgaW5mZmFzdC5TIGlzIHN0aWxsIGZhc3RlciBvbiB0aGUgUDMgd2l0aCBNTVgNCis7ICogZW5hYmxlZC4gIEkgd2lsbCBhdHRlbXB0IHRvIG1lcmdlIHRoZSBNTVggY29kZSBpbnRvIHRoaXMgdmVyc2lvbi4gIE5ld2VyDQorOyAqIHZlcnNpb25zIG9mIHRoaXMgYW5kIGluZmZhc3QuUyBjYW4gYmUgZm91bmQgYXQNCis7ICogaHR0cDovL3d3dy5lZXRiZWV0ZWUuY29tL3psaWIvIGFuZCBodHRwOi8vd3d3LmNoYXJtLm5ldC9+Y2hyaXN0b3AvemxpYi8NCis7ICoNCis7ICogMjAwNSA6IG1vZGlmaWNhdGlvbiBieSBHaWxsZXMgVm9sbGFudA0KKzsgKi8NCis7IEZvciBWaXN1YWwgQysrIDQueCBhbmQgaGlnaGVyIGFuZCBNTCA2LnggYW5kIGhpZ2hlcg0KKzsgICBtbC5leGUgaXMgaW4gZGlyZWN0b3J5IFxNQVNNNjExQyBvZiBXaW45NSBEREsNCis7ICAgbWwuZXhlIGlzIGFsc28gZGlzdHJpYnV0ZWQgaW4gaHR0cDovL3d3dy5tYXNtMzIuY29tL21hc21kbC5odG0NCis7ICAgIGFuZCBpbiBWQysrMjAwMyB0b29sa2l0IGF0IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vdmlzdWFsYy92Y3Rvb2xraXQyMDAzLw0KKzsNCis7DQorOyAgIGNvbXBpbGUgd2l0aCBjb21tYW5kIGxpbmUgb3B0aW9uDQorOyAgIG1sICAvY29mZiAvWmkgL2MgL0ZsaW5mZmFzMzIubHN0IGluZmZhczMyLmFzbQ0KKw0KKzsgICBpZiB5b3UgZGVmaW5lIE5PX0daSVAgKHNlZSBpbmZsYXRlLmgpLCBjb21waWxlIHdpdGgNCis7ICAgbWwgIC9jb2ZmIC9aaSAvYyAvRmxpbmZmYXMzMi5sc3QgL0ROT19HVU5aSVAgaW5mZmFzMzIuYXNtDQorDQorDQorOyB6bGliMTIyc3VwIGlzIDAgZm9ydCB6bGliIDEuMi4yLjEgYW5kIGxvd2VyDQorOyB6bGliMTIyc3VwIGlzIDggZm9ydCB6bGliIDEuMi4yLjIgYW5kIG1vcmUgKHdpdGggYWRkaXRpb24gb2YgZG1heCBhbmQgaGVhZA0KKzsgICAgICAgIGluIGluZmxhdGVfc3RhdGUgaW4gaW5mbGF0ZS5oKQ0KK3psaWIxMjIyc3VwICAgICAgZXF1ICAgIDgNCisNCisNCitJRkRFRiBHVU5aSVANCisgIElORkxBVEVfTU9ERV9UWVBFICAgIGVxdSAxMQ0KKyAgSU5GTEFURV9NT0RFX0JBRCAgICAgZXF1IDI2DQorRUxTRQ0KKyAgSUZOREVGIE5PX0dVTlpJUA0KKyAgICBJTkZMQVRFX01PREVfVFlQRSAgICBlcXUgMTENCisgICAgSU5GTEFURV9NT0RFX0JBRCAgICAgZXF1IDI2DQorICBFTFNFDQorICAgIElORkxBVEVfTU9ERV9UWVBFICAgIGVxdSAzDQorICAgIElORkxBVEVfTU9ERV9CQUQgICAgIGVxdSAxNw0KKyAgRU5ESUYNCitFTkRJRg0KKw0KKw0KKzsgNzUgImluZmZhc3QuUyINCis7RklMRSAiaW5mZmFzdC5TIg0KKw0KKzs7O0dMT0JBTCBfaW5mbGF0ZV9mYXN0DQorDQorOzs7U0VDVElPTiAudGV4dA0KKw0KKw0KKw0KKwkuNTg2cA0KKwkubW14DQorDQorCW5hbWUJaW5mbGF0ZV9mYXN0X3g4Ng0KKwkuTU9ERUwJRkxBVA0KKw0KK19EQVRBCQkJc2VnbWVudA0KK2luZmxhdGVfZmFzdF91c2VfbW14Og0KKwlkZAkxDQorDQorDQorX1RFWFQJCQlzZWdtZW50DQorDQorDQorDQorQUxJR04gNA0KKwlkYgknRmFzdCBkZWNvZGluZyBDb2RlIGZyb20gQ2hyaXMgQW5kZXJzb24nDQorCWRiCTANCisNCitBTElHTiA0DQoraW52YWxpZF9saXRlcmFsX2xlbmd0aF9jb2RlX21zZzoNCisJZGIJJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZScNCisJZGIJMA0KKw0KK0FMSUdOIDQNCitpbnZhbGlkX2Rpc3RhbmNlX2NvZGVfbXNnOg0KKwlkYgknaW52YWxpZCBkaXN0YW5jZSBjb2RlJw0KKwlkYgkwDQorDQorQUxJR04gNA0KK2ludmFsaWRfZGlzdGFuY2VfdG9vX2Zhcl9tc2c6DQorCWRiCSdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjaycNCisJZGIJMA0KKw0KKw0KK0FMSUdOIDQNCitpbmZsYXRlX2Zhc3RfbWFzazoNCitkZAkwDQorZGQJMQ0KK2RkCTMNCitkZAk3DQorZGQJMTUNCitkZAkzMQ0KK2RkCTYzDQorZGQJMTI3DQorZGQJMjU1DQorZGQJNTExDQorZGQJMTAyMw0KK2RkCTIwNDcNCitkZAk0MDk1DQorZGQJODE5MQ0KK2RkCTE2MzgzDQorZGQJMzI3NjcNCitkZAk2NTUzNQ0KK2RkCTEzMTA3MQ0KK2RkCTI2MjE0Mw0KK2RkCTUyNDI4Nw0KK2RkCTEwNDg1NzUNCitkZAkyMDk3MTUxDQorZGQJNDE5NDMwMw0KK2RkCTgzODg2MDcNCitkZAkxNjc3NzIxNQ0KK2RkCTMzNTU0NDMxDQorZGQJNjcxMDg4NjMNCitkZAkxMzQyMTc3MjcNCitkZAkyNjg0MzU0NTUNCitkZAk1MzY4NzA5MTENCitkZAkxMDczNzQxODIzDQorZGQJMjE0NzQ4MzY0Nw0KK2RkCTQyOTQ5NjcyOTUNCisNCisNCittb2RlX3N0YXRlCSBlcXUJMAk7Lyogc3RhdGUtPm1vZGUJKi8NCit3c2l6ZV9zdGF0ZQkgZXF1CSgzMit6bGliMTIyMnN1cCkJOy8qIHN0YXRlLT53c2l6ZSAqLw0KK3dyaXRlX3N0YXRlCSBlcXUJKDM2KzQremxpYjEyMjJzdXApCTsvKiBzdGF0ZS0+d3JpdGUgKi8NCit3aW5kb3dfc3RhdGUJIGVxdQkoNDArNCt6bGliMTIyMnN1cCkJOy8qIHN0YXRlLT53aW5kb3cgKi8NCitob2xkX3N0YXRlCSBlcXUJKDQ0KzQremxpYjEyMjJzdXApCTsvKiBzdGF0ZS0+aG9sZAkqLw0KK2JpdHNfc3RhdGUJIGVxdQkoNDgrNCt6bGliMTIyMnN1cCkJOy8qIHN0YXRlLT5iaXRzCSovDQorbGVuY29kZV9zdGF0ZQkgZXF1CSg2NCs0K3psaWIxMjIyc3VwKQk7Lyogc3RhdGUtPmxlbmNvZGUgKi8NCitkaXN0Y29kZV9zdGF0ZQkgZXF1CSg2OCs0K3psaWIxMjIyc3VwKQk7Lyogc3RhdGUtPmRpc3Rjb2RlICovDQorbGVuYml0c19zdGF0ZQkgZXF1CSg3Mis0K3psaWIxMjIyc3VwKQk7Lyogc3RhdGUtPmxlbmJpdHMgKi8NCitkaXN0Yml0c19zdGF0ZQkgZXF1CSg3Nis0K3psaWIxMjIyc3VwKQk7Lyogc3RhdGUtPmRpc3RiaXRzICovDQorDQorDQorOztTRUNUSU9OIC50ZXh0DQorOyAyMDUgImluZmZhc3QuUyINCis7R0xPQkFMCWluZmxhdGVfZmFzdF91c2VfbW14DQorDQorO1NFQ1RJT04gLmRhdGENCisNCisNCis7IEdMT0JBTCBpbmZsYXRlX2Zhc3RfdXNlX21teDpvYmplY3QNCis7LnNpemUgaW5mbGF0ZV9mYXN0X3VzZV9tbXgsIDQNCis7IDIyNiAiaW5mZmFzdC5TIg0KKztTRUNUSU9OIC50ZXh0DQorDQorQUxJR04gNA0KK19pbmZsYXRlX2Zhc3QgcHJvYyBuZWFyDQorLkZQTyAoMTYsIDQsIDAsIDAsIDEsIDApDQorCXB1c2ggIGVkaQ0KKwlwdXNoICBlc2kNCisJcHVzaCAgZWJwDQorCXB1c2ggIGVieA0KKwlwdXNoZmQNCisJc3ViICBlc3AsNjQNCisJY2xkDQorDQorDQorDQorDQorCW1vdiAgZXNpLCBbZXNwKzg4XQ0KKwltb3YgIGVkaSwgW2VzaSsyOF0NCisNCisNCisNCisNCisNCisNCisNCisJbW92ICBlZHgsIFtlc2krNF0NCisJbW92ICBlYXgsIFtlc2krMF0NCisNCisJYWRkICBlZHgsZWF4DQorCXN1YiAgZWR4LDExDQorDQorCW1vdiAgW2VzcCs0NF0sZWF4DQorCW1vdiAgW2VzcCsyMF0sZWR4DQorDQorCW1vdiAgZWJwLCBbZXNwKzkyXQ0KKwltb3YgIGVjeCwgW2VzaSsxNl0NCisJbW92ICBlYngsIFtlc2krMTJdDQorDQorCXN1YiAgZWJwLGVjeA0KKwluZWcgIGVicA0KKwlhZGQgIGVicCxlYngNCisNCisJc3ViICBlY3gsMjU3DQorCWFkZCAgZWN4LGVieA0KKw0KKwltb3YgIFtlc3ArNjBdLGVieA0KKwltb3YgIFtlc3ArNDBdLGVicA0KKwltb3YgIFtlc3ArMTZdLGVjeA0KKzsgMjg1ICJpbmZmYXN0LlMiDQorCW1vdiAgZWF4LCBbZWRpK2xlbmNvZGVfc3RhdGVdDQorCW1vdiAgZWN4LCBbZWRpK2Rpc3Rjb2RlX3N0YXRlXQ0KKw0KKwltb3YgIFtlc3ArOF0sZWF4DQorCW1vdiAgW2VzcCsxMl0sZWN4DQorDQorCW1vdiAgZWF4LDENCisJbW92ICBlY3gsIFtlZGkrbGVuYml0c19zdGF0ZV0NCisJc2hsICBlYXgsY2wNCisJZGVjICBlYXgNCisJbW92ICBbZXNwKzBdLGVheA0KKw0KKwltb3YgIGVheCwxDQorCW1vdiAgZWN4LCBbZWRpK2Rpc3RiaXRzX3N0YXRlXQ0KKwlzaGwgIGVheCxjbA0KKwlkZWMgIGVheA0KKwltb3YgIFtlc3ArNF0sZWF4DQorDQorCW1vdiAgZWF4LCBbZWRpK3dzaXplX3N0YXRlXQ0KKwltb3YgIGVjeCwgW2VkaSt3cml0ZV9zdGF0ZV0NCisJbW92ICBlZHgsIFtlZGkrd2luZG93X3N0YXRlXQ0KKw0KKwltb3YgIFtlc3ArNTJdLGVheA0KKwltb3YgIFtlc3ArNDhdLGVjeA0KKwltb3YgIFtlc3ArNTZdLGVkeA0KKw0KKwltb3YgIGVicCwgW2VkaStob2xkX3N0YXRlXQ0KKwltb3YgIGVieCwgW2VkaStiaXRzX3N0YXRlXQ0KKzsgMzIxICJpbmZmYXN0LlMiDQorCW1vdiAgZXNpLCBbZXNwKzQ0XQ0KKwltb3YgIGVjeCwgW2VzcCsyMF0NCisJY21wICBlY3gsZXNpDQorCWphICAgTF9hbGlnbl9sb25nDQorDQorCWFkZCAgZWN4LDExDQorCXN1YiAgZWN4LGVzaQ0KKwltb3YgIGVheCwxMg0KKwlzdWIgIGVheCxlY3gNCisJbGVhICBlZGksIFtlc3ArMjhdDQorCXJlcCBtb3ZzYg0KKwltb3YgIGVjeCxlYXgNCisJeG9yICBlYXgsZWF4DQorCXJlcCBzdG9zYg0KKwlsZWEgIGVzaSwgW2VzcCsyOF0NCisJbW92ICBbZXNwKzIwXSxlc2kNCisJam1wICBMX2lzX2FsaWduZWQNCisNCisNCitMX2FsaWduX2xvbmc6DQorCXRlc3QgIGVzaSwzDQorCWp6ICAgTF9pc19hbGlnbmVkDQorCXhvciAgZWF4LGVheA0KKwltb3YgIGFsLCBbZXNpXQ0KKwlpbmMgIGVzaQ0KKwltb3YgIGVjeCxlYngNCisJYWRkICBlYngsOA0KKwlzaGwgIGVheCxjbA0KKwlvciAgZWJwLGVheA0KKwlqbXAgTF9hbGlnbl9sb25nDQorDQorTF9pc19hbGlnbmVkOg0KKwltb3YgIGVkaSwgW2VzcCs2MF0NCis7IDM2NiAiaW5mZmFzdC5TIg0KK0xfY2hlY2tfbW14Og0KKwljbXAgIGR3b3JkIHB0ciBbaW5mbGF0ZV9mYXN0X3VzZV9tbXhdLDINCisJamUgICBMX2luaXRfbW14DQorCWphICAgTF9kb19sb29wDQorDQorCXB1c2ggIGVheA0KKwlwdXNoICBlYngNCisJcHVzaCAgZWN4DQorCXB1c2ggIGVkeA0KKwlwdXNoZmQNCisJbW92ICBlYXgsIFtlc3BdDQorCXhvciAgZHdvcmQgcHRyIFtlc3BdLDAyMDAwMDBoDQorDQorDQorDQorDQorCXBvcGZkDQorCXB1c2hmZA0KKwlwb3AgIGVkeA0KKwl4b3IgIGVkeCxlYXgNCisJanogICBMX2RvbnRfdXNlX21teA0KKwl4b3IgIGVheCxlYXgNCisJY3B1aWQNCisJY21wICBlYngsMDc1NmU2NTQ3aA0KKwlqbmUgIExfZG9udF91c2VfbW14DQorCWNtcCAgZWN4LDA2YzY1NzQ2ZWgNCisJam5lICBMX2RvbnRfdXNlX21teA0KKwljbXAgIGVkeCwwNDk2NTZlNjloDQorCWpuZSAgTF9kb250X3VzZV9tbXgNCisJbW92ICBlYXgsMQ0KKwljcHVpZA0KKwlzaHIgIGVheCw4DQorCWFuZCAgZWF4LDE1DQorCWNtcCAgZWF4LDYNCisJam5lICBMX2RvbnRfdXNlX21teA0KKwl0ZXN0ICBlZHgsMDgwMDAwMGgNCisJam56ICBMX3VzZV9tbXgNCisJam1wICBMX2RvbnRfdXNlX21teA0KK0xfdXNlX21teDoNCisJbW92ICBkd29yZCBwdHIgW2luZmxhdGVfZmFzdF91c2VfbW14XSwyDQorCWptcCAgTF9jaGVja19tbXhfcG9wDQorTF9kb250X3VzZV9tbXg6DQorCW1vdiAgZHdvcmQgcHRyIFtpbmZsYXRlX2Zhc3RfdXNlX21teF0sMw0KK0xfY2hlY2tfbW14X3BvcDoNCisJcG9wICBlZHgNCisJcG9wICBlY3gNCisJcG9wICBlYngNCisJcG9wICBlYXgNCisJam1wICBMX2NoZWNrX21teA0KKzsgNDI2ICJpbmZmYXN0LlMiDQorQUxJR04gNA0KK0xfZG9fbG9vcDoNCis7IDQzNyAiaW5mZmFzdC5TIg0KKwljbXAgIGJsLDE1DQorCWphICAgTF9nZXRfbGVuZ3RoX2NvZGUNCisNCisJeG9yICBlYXgsZWF4DQorCWxvZHN3DQorCW1vdiAgY2wsYmwNCisJYWRkICBibCwxNg0KKwlzaGwgIGVheCxjbA0KKwlvciAgZWJwLGVheA0KKw0KK0xfZ2V0X2xlbmd0aF9jb2RlOg0KKwltb3YgIGVkeCwgW2VzcCswXQ0KKwltb3YgIGVjeCwgW2VzcCs4XQ0KKwlhbmQgIGVkeCxlYnANCisJbW92ICBlYXgsIFtlY3grZWR4KjRdDQorDQorTF9kb2xlbjoNCisNCisNCisNCisNCisNCisNCisJbW92ICBjbCxhaA0KKwlzdWIgIGJsLGFoDQorCXNociAgZWJwLGNsDQorDQorDQorDQorDQorDQorDQorCXRlc3QgIGFsLGFsDQorCWpueiAgIExfdGVzdF9mb3JfbGVuZ3RoX2Jhc2UNCisNCisJc2hyICBlYXgsMTYNCisJc3Rvc2INCisNCitMX3doaWxlX3Rlc3Q6DQorDQorDQorCWNtcCAgW2VzcCsxNl0sZWRpDQorCWpiZSAgTF9icmVha19sb29wDQorDQorCWNtcCAgW2VzcCsyMF0sZXNpDQorCWphICAgTF9kb19sb29wDQorCWptcCAgTF9icmVha19sb29wDQorDQorTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZToNCis7IDUwMiAiaW5mZmFzdC5TIg0KKwltb3YgIGVkeCxlYXgNCisJc2hyICBlZHgsMTYNCisJbW92ICBjbCxhbA0KKw0KKwl0ZXN0ICBhbCwxNg0KKwlqeiAgIExfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aA0KKwlhbmQgIGNsLDE1DQorCWp6ICAgTF9zYXZlX2xlbg0KKwljbXAgIGJsLGNsDQorCWphZSAgTF9hZGRfYml0c190b19sZW4NCisNCisJbW92ICBjaCxjbA0KKwl4b3IgIGVheCxlYXgNCisJbG9kc3cNCisJbW92ICBjbCxibA0KKwlhZGQgIGJsLDE2DQorCXNobCAgZWF4LGNsDQorCW9yICBlYnAsZWF4DQorCW1vdiAgY2wsY2gNCisNCitMX2FkZF9iaXRzX3RvX2xlbjoNCisJbW92ICBlYXgsMQ0KKwlzaGwgIGVheCxjbA0KKwlkZWMgIGVheA0KKwlzdWIgIGJsLGNsDQorCWFuZCAgZWF4LGVicA0KKwlzaHIgIGVicCxjbA0KKwlhZGQgIGVkeCxlYXgNCisNCitMX3NhdmVfbGVuOg0KKwltb3YgIFtlc3ArMjRdLGVkeA0KKw0KKw0KK0xfZGVjb2RlX2Rpc3RhbmNlOg0KKzsgNTQ5ICJpbmZmYXN0LlMiDQorCWNtcCAgYmwsMTUNCisJamEgICBMX2dldF9kaXN0YW5jZV9jb2RlDQorDQorCXhvciAgZWF4LGVheA0KKwlsb2Rzdw0KKwltb3YgIGNsLGJsDQorCWFkZCAgYmwsMTYNCisJc2hsICBlYXgsY2wNCisJb3IgIGVicCxlYXgNCisNCitMX2dldF9kaXN0YW5jZV9jb2RlOg0KKwltb3YgIGVkeCwgW2VzcCs0XQ0KKwltb3YgIGVjeCwgW2VzcCsxMl0NCisJYW5kICBlZHgsZWJwDQorCW1vdiAgZWF4LCBbZWN4K2VkeCo0XQ0KKw0KKw0KK0xfZG9kaXN0Og0KKwltb3YgIGVkeCxlYXgNCisJc2hyICBlZHgsMTYNCisJbW92ICBjbCxhaA0KKwlzdWIgIGJsLGFoDQorCXNociAgZWJwLGNsDQorOyA1ODQgImluZmZhc3QuUyINCisJbW92ICBjbCxhbA0KKw0KKwl0ZXN0ICBhbCwxNg0KKwlqeiAgTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdA0KKwlhbmQgIGNsLDE1DQorCWp6ICBMX2NoZWNrX2Rpc3Rfb25lDQorCWNtcCAgYmwsY2wNCisJamFlICBMX2FkZF9iaXRzX3RvX2Rpc3QNCisNCisJbW92ICBjaCxjbA0KKwl4b3IgIGVheCxlYXgNCisJbG9kc3cNCisJbW92ICBjbCxibA0KKwlhZGQgIGJsLDE2DQorCXNobCAgZWF4LGNsDQorCW9yICBlYnAsZWF4DQorCW1vdiAgY2wsY2gNCisNCitMX2FkZF9iaXRzX3RvX2Rpc3Q6DQorCW1vdiAgZWF4LDENCisJc2hsICBlYXgsY2wNCisJZGVjICBlYXgNCisJc3ViICBibCxjbA0KKwlhbmQgIGVheCxlYnANCisJc2hyICBlYnAsY2wNCisJYWRkICBlZHgsZWF4DQorCWptcCAgTF9jaGVja193aW5kb3cNCisNCitMX2NoZWNrX3dpbmRvdzoNCis7IDYyNSAiaW5mZmFzdC5TIg0KKwltb3YgIFtlc3ArNDRdLGVzaQ0KKwltb3YgIGVheCxlZGkNCisJc3ViICBlYXgsIFtlc3ArNDBdDQorDQorCWNtcCAgZWF4LGVkeA0KKwlqYiAgIExfY2xpcF93aW5kb3cNCisNCisJbW92ICBlY3gsIFtlc3ArMjRdDQorCW1vdiAgZXNpLGVkaQ0KKwlzdWIgIGVzaSxlZHgNCisNCisJc3ViICBlY3gsMw0KKwltb3YgIGFsLCBbZXNpXQ0KKwltb3YgIFtlZGldLGFsDQorCW1vdiAgYWwsIFtlc2krMV0NCisJbW92ICBkbCwgW2VzaSsyXQ0KKwlhZGQgIGVzaSwzDQorCW1vdiAgW2VkaSsxXSxhbA0KKwltb3YgIFtlZGkrMl0sZGwNCisJYWRkICBlZGksMw0KKwlyZXAgbW92c2INCisNCisJbW92ICBlc2ksIFtlc3ArNDRdDQorCWptcCAgTF93aGlsZV90ZXN0DQorDQorQUxJR04gNA0KK0xfY2hlY2tfZGlzdF9vbmU6DQorCWNtcCAgZWR4LDENCisJam5lICBMX2NoZWNrX3dpbmRvdw0KKwljbXAgIFtlc3ArNDBdLGVkaQ0KKwlqZSAgTF9jaGVja193aW5kb3cNCisNCisJZGVjICBlZGkNCisJbW92ICBlY3gsIFtlc3ArMjRdDQorCW1vdiAgYWwsIFtlZGldDQorCXN1YiAgZWN4LDMNCisNCisJbW92ICBbZWRpKzFdLGFsDQorCW1vdiAgW2VkaSsyXSxhbA0KKwltb3YgIFtlZGkrM10sYWwNCisJYWRkICBlZGksNA0KKwlyZXAgc3Rvc2INCisNCisJam1wICBMX3doaWxlX3Rlc3QNCisNCitBTElHTiA0DQorTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoOg0KKw0KKw0KKw0KKw0KKwl0ZXN0ICBhbCw2NA0KKwlqbnogICBMX3Rlc3RfZm9yX2VuZF9vZl9ibG9jaw0KKw0KKwltb3YgIGVheCwxDQorCXNobCAgZWF4LGNsDQorCWRlYyAgZWF4DQorCWFuZCAgZWF4LGVicA0KKwlhZGQgIGVheCxlZHgNCisJbW92ICBlZHgsIFtlc3ArOF0NCisJbW92ICBlYXgsIFtlZHgrZWF4KjRdDQorCWptcCAgTF9kb2xlbg0KKw0KK0FMSUdOIDQNCitMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0Og0KKw0KKw0KKw0KKw0KKwl0ZXN0ICBhbCw2NA0KKwlqbnogICBMX2ludmFsaWRfZGlzdGFuY2VfY29kZQ0KKw0KKwltb3YgIGVheCwxDQorCXNobCAgZWF4LGNsDQorCWRlYyAgZWF4DQorCWFuZCAgZWF4LGVicA0KKwlhZGQgIGVheCxlZHgNCisJbW92ICBlZHgsIFtlc3ArMTJdDQorCW1vdiAgZWF4LCBbZWR4K2VheCo0XQ0KKwlqbXAgIExfZG9kaXN0DQorDQorQUxJR04gNA0KK0xfY2xpcF93aW5kb3c6DQorOyA3MjEgImluZmZhc3QuUyINCisJbW92ICBlY3gsZWF4DQorCW1vdiAgZWF4LCBbZXNwKzUyXQ0KKwluZWcgIGVjeA0KKwltb3YgIGVzaSwgW2VzcCs1Nl0NCisNCisJY21wICBlYXgsZWR4DQorCWpiICAgTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXINCisNCisJYWRkICBlY3gsZWR4DQorCWNtcCAgZHdvcmQgcHRyIFtlc3ArNDhdLDANCisJam5lICBMX3dyYXBfYXJvdW5kX3dpbmRvdw0KKw0KKwlzdWIgIGVheCxlY3gNCisJYWRkICBlc2ksZWF4DQorOyA3NDkgImluZmZhc3QuUyINCisJbW92ICBlYXgsIFtlc3ArMjRdDQorCWNtcCAgZWF4LGVjeA0KKwlqYmUgIExfZG9fY29weTENCisNCisJc3ViICBlYXgsZWN4DQorCXJlcCBtb3ZzYg0KKwltb3YgIGVzaSxlZGkNCisJc3ViICBlc2ksZWR4DQorCWptcCAgTF9kb19jb3B5MQ0KKw0KKwljbXAgIGVheCxlY3gNCisJamJlICBMX2RvX2NvcHkxDQorDQorCXN1YiAgZWF4LGVjeA0KKwlyZXAgbW92c2INCisJbW92ICBlc2ksZWRpDQorCXN1YiAgZXNpLGVkeA0KKwlqbXAgIExfZG9fY29weTENCisNCitMX3dyYXBfYXJvdW5kX3dpbmRvdzoNCis7IDc5MyAiaW5mZmFzdC5TIg0KKwltb3YgIGVheCwgW2VzcCs0OF0NCisJY21wICBlY3gsZWF4DQorCWpiZSAgTF9jb250aWd1b3VzX2luX3dpbmRvdw0KKw0KKwlhZGQgIGVzaSwgW2VzcCs1Ml0NCisJYWRkICBlc2ksZWF4DQorCXN1YiAgZXNpLGVjeA0KKwlzdWIgIGVjeCxlYXgNCisNCisNCisJbW92ICBlYXgsIFtlc3ArMjRdDQorCWNtcCAgZWF4LGVjeA0KKwlqYmUgIExfZG9fY29weTENCisNCisJc3ViICBlYXgsZWN4DQorCXJlcCBtb3ZzYg0KKwltb3YgIGVzaSwgW2VzcCs1Nl0NCisJbW92ICBlY3gsIFtlc3ArNDhdDQorCWNtcCAgZWF4LGVjeA0KKwlqYmUgIExfZG9fY29weTENCisNCisJc3ViICBlYXgsZWN4DQorCXJlcCBtb3ZzYg0KKwltb3YgIGVzaSxlZGkNCisJc3ViICBlc2ksZWR4DQorCWptcCAgTF9kb19jb3B5MQ0KKw0KK0xfY29udGlndW91c19pbl93aW5kb3c6DQorOyA4MzYgImluZmZhc3QuUyINCisJYWRkICBlc2ksZWF4DQorCXN1YiAgZXNpLGVjeA0KKw0KKw0KKwltb3YgIGVheCwgW2VzcCsyNF0NCisJY21wICBlYXgsZWN4DQorCWpiZSAgTF9kb19jb3B5MQ0KKw0KKwlzdWIgIGVheCxlY3gNCisJcmVwIG1vdnNiDQorCW1vdiAgZXNpLGVkaQ0KKwlzdWIgIGVzaSxlZHgNCisNCitMX2RvX2NvcHkxOg0KKzsgODYyICJpbmZmYXN0LlMiDQorCW1vdiAgZWN4LGVheA0KKwlyZXAgbW92c2INCisNCisJbW92ICBlc2ksIFtlc3ArNDRdDQorCWptcCAgTF93aGlsZV90ZXN0DQorOyA4NzggImluZmZhc3QuUyINCitBTElHTiA0DQorTF9pbml0X21teDoNCisJZW1tcw0KKw0KKw0KKw0KKw0KKw0KKwltb3ZkIG1tMCxlYnANCisJbW92ICBlYnAsZWJ4DQorOyA4OTYgImluZmZhc3QuUyINCisJbW92ZCBtbTQsZHdvcmQgcHRyIFtlc3ArMF0NCisJbW92cSBtbTMsbW00DQorCW1vdmQgbW01LGR3b3JkIHB0ciBbZXNwKzRdDQorCW1vdnEgbW0yLG1tNQ0KKwlweG9yIG1tMSxtbTENCisJbW92ICBlYngsIFtlc3ArOF0NCisJam1wICBMX2RvX2xvb3BfbW14DQorDQorQUxJR04gNA0KK0xfZG9fbG9vcF9tbXg6DQorCXBzcmxxIG1tMCxtbTENCisNCisJY21wICBlYnAsMzINCisJamEgIExfZ2V0X2xlbmd0aF9jb2RlX21teA0KKw0KKwltb3ZkIG1tNixlYnANCisJbW92ZCBtbTcsZHdvcmQgcHRyIFtlc2ldDQorCWFkZCAgZXNpLDQNCisJcHNsbHEgbW03LG1tNg0KKwlhZGQgIGVicCwzMg0KKwlwb3IgbW0wLG1tNw0KKw0KK0xfZ2V0X2xlbmd0aF9jb2RlX21teDoNCisJcGFuZCBtbTQsbW0wDQorCW1vdmQgZWF4LG1tNA0KKwltb3ZxIG1tNCxtbTMNCisJbW92ICBlYXgsIFtlYngrZWF4KjRdDQorDQorTF9kb2xlbl9tbXg6DQorCW1vdnp4ICBlY3gsYWgNCisJbW92ZCBtbTEsZWN4DQorCXN1YiAgZWJwLGVjeA0KKw0KKwl0ZXN0ICBhbCxhbA0KKwlqbnogTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZV9tbXgNCisNCisJc2hyICBlYXgsMTYNCisJc3Rvc2INCisNCitMX3doaWxlX3Rlc3RfbW14Og0KKw0KKw0KKwljbXAgIFtlc3ArMTZdLGVkaQ0KKwlqYmUgTF9icmVha19sb29wDQorDQorCWNtcCAgW2VzcCsyMF0sZXNpDQorCWphIExfZG9fbG9vcF9tbXgNCisJam1wIExfYnJlYWtfbG9vcA0KKw0KK0xfdGVzdF9mb3JfbGVuZ3RoX2Jhc2VfbW14Og0KKw0KKwltb3YgIGVkeCxlYXgNCisJc2hyICBlZHgsMTYNCisNCisJdGVzdCAgYWwsMTYNCisJanogIExfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aF9tbXgNCisJYW5kICBlYXgsMTUNCisJanogTF9kZWNvZGVfZGlzdGFuY2VfbW14DQorDQorCXBzcmxxIG1tMCxtbTENCisJbW92ZCBtbTEsZWF4DQorCW1vdmQgZWN4LG1tMA0KKwlzdWIgIGVicCxlYXgNCisJYW5kICBlY3gsIFtpbmZsYXRlX2Zhc3RfbWFzaytlYXgqNF0NCisJYWRkICBlZHgsZWN4DQorDQorTF9kZWNvZGVfZGlzdGFuY2VfbW14Og0KKwlwc3JscSBtbTAsbW0xDQorDQorCWNtcCAgZWJwLDMyDQorCWphIExfZ2V0X2Rpc3RfY29kZV9tbXgNCisNCisJbW92ZCBtbTYsZWJwDQorCW1vdmQgbW03LGR3b3JkIHB0ciBbZXNpXQ0KKwlhZGQgIGVzaSw0DQorCXBzbGxxIG1tNyxtbTYNCisJYWRkICBlYnAsMzINCisJcG9yIG1tMCxtbTcNCisNCitMX2dldF9kaXN0X2NvZGVfbW14Og0KKwltb3YgIGVieCwgW2VzcCsxMl0NCisJcGFuZCBtbTUsbW0wDQorCW1vdmQgZWF4LG1tNQ0KKwltb3ZxIG1tNSxtbTINCisJbW92ICBlYXgsIFtlYngrZWF4KjRdDQorDQorTF9kb2Rpc3RfbW14Og0KKw0KKwltb3Z6eCAgZWN4LGFoDQorCW1vdiAgZWJ4LGVheA0KKwlzaHIgIGVieCwxNg0KKwlzdWIgIGVicCxlY3gNCisJbW92ZCBtbTEsZWN4DQorDQorCXRlc3QgIGFsLDE2DQorCWp6IExfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3RfbW14DQorCWFuZCAgZWF4LDE1DQorCWp6IExfY2hlY2tfZGlzdF9vbmVfbW14DQorDQorTF9hZGRfYml0c190b19kaXN0X21teDoNCisJcHNybHEgbW0wLG1tMQ0KKwltb3ZkIG1tMSxlYXgNCisJbW92ZCBlY3gsbW0wDQorCXN1YiAgZWJwLGVheA0KKwlhbmQgIGVjeCwgW2luZmxhdGVfZmFzdF9tYXNrK2VheCo0XQ0KKwlhZGQgIGVieCxlY3gNCisNCitMX2NoZWNrX3dpbmRvd19tbXg6DQorCW1vdiAgW2VzcCs0NF0sZXNpDQorCW1vdiAgZWF4LGVkaQ0KKwlzdWIgIGVheCwgW2VzcCs0MF0NCisNCisJY21wICBlYXgsZWJ4DQorCWpiIExfY2xpcF93aW5kb3dfbW14DQorDQorCW1vdiAgZWN4LGVkeA0KKwltb3YgIGVzaSxlZGkNCisJc3ViICBlc2ksZWJ4DQorDQorCXN1YiAgZWN4LDMNCisJbW92ICBhbCwgW2VzaV0NCisJbW92ICBbZWRpXSxhbA0KKwltb3YgIGFsLCBbZXNpKzFdDQorCW1vdiAgZGwsIFtlc2krMl0NCisJYWRkICBlc2ksMw0KKwltb3YgIFtlZGkrMV0sYWwNCisJbW92ICBbZWRpKzJdLGRsDQorCWFkZCAgZWRpLDMNCisJcmVwIG1vdnNiDQorDQorCW1vdiAgZXNpLCBbZXNwKzQ0XQ0KKwltb3YgIGVieCwgW2VzcCs4XQ0KKwlqbXAgIExfd2hpbGVfdGVzdF9tbXgNCisNCitBTElHTiA0DQorTF9jaGVja19kaXN0X29uZV9tbXg6DQorCWNtcCAgZWJ4LDENCisJam5lICBMX2NoZWNrX3dpbmRvd19tbXgNCisJY21wICBbZXNwKzQwXSxlZGkNCisJamUgICBMX2NoZWNrX3dpbmRvd19tbXgNCisNCisJZGVjICBlZGkNCisJbW92ICBlY3gsZWR4DQorCW1vdiAgYWwsIFtlZGldDQorCXN1YiAgZWN4LDMNCisNCisJbW92ICBbZWRpKzFdLGFsDQorCW1vdiAgW2VkaSsyXSxhbA0KKwltb3YgIFtlZGkrM10sYWwNCisJYWRkICBlZGksNA0KKwlyZXAgc3Rvc2INCisNCisJbW92ICBlYngsIFtlc3ArOF0NCisJam1wICBMX3doaWxlX3Rlc3RfbW14DQorDQorQUxJR04gNA0KK0xfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aF9tbXg6DQorCXRlc3QgIGFsLDY0DQorCWpueiBMX3Rlc3RfZm9yX2VuZF9vZl9ibG9jaw0KKw0KKwlhbmQgIGVheCwxNQ0KKwlwc3JscSBtbTAsbW0xDQorCW1vdmQgZWN4LG1tMA0KKwlhbmQgIGVjeCwgW2luZmxhdGVfZmFzdF9tYXNrK2VheCo0XQ0KKwlhZGQgIGVjeCxlZHgNCisJbW92ICBlYXgsIFtlYngrZWN4KjRdDQorCWptcCBMX2RvbGVuX21teA0KKw0KK0FMSUdOIDQNCitMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0X21teDoNCisJdGVzdCAgYWwsNjQNCisJam56IExfaW52YWxpZF9kaXN0YW5jZV9jb2RlDQorDQorCWFuZCAgZWF4LDE1DQorCXBzcmxxIG1tMCxtbTENCisJbW92ZCBlY3gsbW0wDQorCWFuZCAgZWN4LCBbaW5mbGF0ZV9mYXN0X21hc2srZWF4KjRdDQorCW1vdiAgZWF4LCBbZXNwKzEyXQ0KKwlhZGQgIGVjeCxlYngNCisJbW92ICBlYXgsIFtlYXgrZWN4KjRdDQorCWptcCAgTF9kb2Rpc3RfbW14DQorDQorQUxJR04gNA0KK0xfY2xpcF93aW5kb3dfbW14Og0KKw0KKwltb3YgIGVjeCxlYXgNCisJbW92ICBlYXgsIFtlc3ArNTJdDQorCW5lZyAgZWN4DQorCW1vdiAgZXNpLCBbZXNwKzU2XQ0KKw0KKwljbXAgIGVheCxlYngNCisJamIgIExfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyDQorDQorCWFkZCAgZWN4LGVieA0KKwljbXAgIGR3b3JkIHB0ciBbZXNwKzQ4XSwwDQorCWpuZSAgTF93cmFwX2Fyb3VuZF93aW5kb3dfbW14DQorDQorCXN1YiAgZWF4LGVjeA0KKwlhZGQgIGVzaSxlYXgNCisNCisJY21wICBlZHgsZWN4DQorCWpiZSAgTF9kb19jb3B5MV9tbXgNCisNCisJc3ViICBlZHgsZWN4DQorCXJlcCBtb3ZzYg0KKwltb3YgIGVzaSxlZGkNCisJc3ViICBlc2ksZWJ4DQorCWptcCAgTF9kb19jb3B5MV9tbXgNCisNCisJY21wICBlZHgsZWN4DQorCWpiZSAgTF9kb19jb3B5MV9tbXgNCisNCisJc3ViICBlZHgsZWN4DQorCXJlcCBtb3ZzYg0KKwltb3YgIGVzaSxlZGkNCisJc3ViICBlc2ksZWJ4DQorCWptcCAgTF9kb19jb3B5MV9tbXgNCisNCitMX3dyYXBfYXJvdW5kX3dpbmRvd19tbXg6DQorDQorCW1vdiAgZWF4LCBbZXNwKzQ4XQ0KKwljbXAgIGVjeCxlYXgNCisJamJlICBMX2NvbnRpZ3VvdXNfaW5fd2luZG93X21teA0KKw0KKwlhZGQgIGVzaSwgW2VzcCs1Ml0NCisJYWRkICBlc2ksZWF4DQorCXN1YiAgZXNpLGVjeA0KKwlzdWIgIGVjeCxlYXgNCisNCisNCisJY21wICBlZHgsZWN4DQorCWpiZSAgTF9kb19jb3B5MV9tbXgNCisNCisJc3ViICBlZHgsZWN4DQorCXJlcCBtb3ZzYg0KKwltb3YgIGVzaSwgW2VzcCs1Nl0NCisJbW92ICBlY3gsIFtlc3ArNDhdDQorCWNtcCAgZWR4LGVjeA0KKwlqYmUgIExfZG9fY29weTFfbW14DQorDQorCXN1YiAgZWR4LGVjeA0KKwlyZXAgbW92c2INCisJbW92ICBlc2ksZWRpDQorCXN1YiAgZXNpLGVieA0KKwlqbXAgIExfZG9fY29weTFfbW14DQorDQorTF9jb250aWd1b3VzX2luX3dpbmRvd19tbXg6DQorDQorCWFkZCAgZXNpLGVheA0KKwlzdWIgIGVzaSxlY3gNCisNCisNCisJY21wICBlZHgsZWN4DQorCWpiZSAgTF9kb19jb3B5MV9tbXgNCisNCisJc3ViICBlZHgsZWN4DQorCXJlcCBtb3ZzYg0KKwltb3YgIGVzaSxlZGkNCisJc3ViICBlc2ksZWJ4DQorDQorTF9kb19jb3B5MV9tbXg6DQorDQorDQorCW1vdiAgZWN4LGVkeA0KKwlyZXAgbW92c2INCisNCisJbW92ICBlc2ksIFtlc3ArNDRdDQorCW1vdiAgZWJ4LCBbZXNwKzhdDQorCWptcCAgTF93aGlsZV90ZXN0X21teA0KKzsgMTE3NCAiaW5mZmFzdC5TIg0KK0xfaW52YWxpZF9kaXN0YW5jZV9jb2RlOg0KKw0KKw0KKw0KKw0KKw0KKwltb3YgIGVjeCwgaW52YWxpZF9kaXN0YW5jZV9jb2RlX21zZw0KKwltb3YgIGVkeCxJTkZMQVRFX01PREVfQkFEDQorCWptcCAgTF91cGRhdGVfc3RyZWFtX3N0YXRlDQorDQorTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2s6DQorDQorDQorDQorDQorDQorCXRlc3QgIGFsLDMyDQorCWp6ICBMX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZQ0KKw0KKwltb3YgIGVjeCwwDQorCW1vdiAgZWR4LElORkxBVEVfTU9ERV9UWVBFDQorCWptcCAgTF91cGRhdGVfc3RyZWFtX3N0YXRlDQorDQorTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGU6DQorDQorDQorDQorDQorDQorCW1vdiAgZWN4LCBpbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGVfbXNnDQorCW1vdiAgZWR4LElORkxBVEVfTU9ERV9CQUQNCisJam1wICBMX3VwZGF0ZV9zdHJlYW1fc3RhdGUNCisNCitMX2ludmFsaWRfZGlzdGFuY2VfdG9vX2ZhcjoNCisNCisNCisNCisJbW92ICBlc2ksIFtlc3ArNDRdDQorCW1vdiAgZWN4LCBpbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXJfbXNnDQorCW1vdiAgZWR4LElORkxBVEVfTU9ERV9CQUQNCisJam1wICBMX3VwZGF0ZV9zdHJlYW1fc3RhdGUNCisNCitMX3VwZGF0ZV9zdHJlYW1fc3RhdGU6DQorDQorCW1vdiAgZWF4LCBbZXNwKzg4XQ0KKwl0ZXN0ICBlY3gsZWN4DQorCWp6ICBMX3NraXBfbXNnDQorCW1vdiAgW2VheCsyNF0sZWN4DQorTF9za2lwX21zZzoNCisJbW92ICBlYXgsIFtlYXgrMjhdDQorCW1vdiAgW2VheCttb2RlX3N0YXRlXSxlZHgNCisJam1wICBMX2JyZWFrX2xvb3ANCisNCitBTElHTiA0DQorTF9icmVha19sb29wOg0KKzsgMTI0MyAiaW5mZmFzdC5TIg0KKwljbXAgIGR3b3JkIHB0ciBbaW5mbGF0ZV9mYXN0X3VzZV9tbXhdLDINCisJam5lICBMX3VwZGF0ZV9uZXh0X2luDQorDQorDQorDQorCW1vdiAgZWJ4LGVicA0KKw0KK0xfdXBkYXRlX25leHRfaW46DQorOyAxMjY2ICJpbmZmYXN0LlMiDQorCW1vdiAgZWF4LCBbZXNwKzg4XQ0KKwltb3YgIGVjeCxlYngNCisJbW92ICBlZHgsIFtlYXgrMjhdDQorCXNociAgZWN4LDMNCisJc3ViICBlc2ksZWN4DQorCXNobCAgZWN4LDMNCisJc3ViICBlYngsZWN4DQorCW1vdiAgW2VheCsxMl0sZWRpDQorCW1vdiAgW2VkeCtiaXRzX3N0YXRlXSxlYngNCisJbW92ICBlY3gsZWJ4DQorDQorCWxlYSAgZWJ4LCBbZXNwKzI4XQ0KKwljbXAgIFtlc3ArMjBdLGVieA0KKwlqbmUgIExfYnVmX25vdF91c2VkDQorDQorCXN1YiAgZXNpLGVieA0KKwltb3YgIGVieCwgW2VheCswXQ0KKwltb3YgIFtlc3ArMjBdLGVieA0KKwlhZGQgIGVzaSxlYngNCisJbW92ICBlYngsIFtlYXgrNF0NCisJc3ViICBlYngsMTENCisJYWRkICBbZXNwKzIwXSxlYngNCisNCitMX2J1Zl9ub3RfdXNlZDoNCisJbW92ICBbZWF4KzBdLGVzaQ0KKw0KKwltb3YgIGVieCwxDQorCXNobCAgZWJ4LGNsDQorCWRlYyAgZWJ4DQorDQorDQorDQorDQorDQorCWNtcCAgZHdvcmQgcHRyIFtpbmZsYXRlX2Zhc3RfdXNlX21teF0sMg0KKwlqbmUgIExfdXBkYXRlX2hvbGQNCisNCisNCisNCisJcHNybHEgbW0wLG1tMQ0KKwltb3ZkIGVicCxtbTANCisNCisJZW1tcw0KKw0KK0xfdXBkYXRlX2hvbGQ6DQorDQorDQorDQorCWFuZCAgZWJwLGVieA0KKwltb3YgIFtlZHgraG9sZF9zdGF0ZV0sZWJwDQorDQorDQorDQorDQorCW1vdiAgZWJ4LCBbZXNwKzIwXQ0KKwljbXAgIGVieCxlc2kNCisJamJlICBMX2xhc3RfaXNfc21hbGxlcg0KKw0KKwlzdWIgIGVieCxlc2kNCisJYWRkICBlYngsMTENCisJbW92ICBbZWF4KzRdLGVieA0KKwlqbXAgIExfZml4dXBfb3V0DQorTF9sYXN0X2lzX3NtYWxsZXI6DQorCXN1YiAgZXNpLGVieA0KKwluZWcgIGVzaQ0KKwlhZGQgIGVzaSwxMQ0KKwltb3YgIFtlYXgrNF0sZXNpDQorDQorDQorDQorDQorTF9maXh1cF9vdXQ6DQorDQorCW1vdiAgZWJ4LCBbZXNwKzE2XQ0KKwljbXAgIGVieCxlZGkNCisJamJlICBMX2VuZF9pc19zbWFsbGVyDQorDQorCXN1YiAgZWJ4LGVkaQ0KKwlhZGQgIGVieCwyNTcNCisJbW92ICBbZWF4KzE2XSxlYngNCisJam1wICBMX2RvbmUNCitMX2VuZF9pc19zbWFsbGVyOg0KKwlzdWIgIGVkaSxlYngNCisJbmVnICBlZGkNCisJYWRkICBlZGksMjU3DQorCW1vdiAgW2VheCsxNl0sZWRpDQorDQorDQorDQorDQorDQorTF9kb25lOg0KKwlhZGQgIGVzcCw2NA0KKwlwb3BmZA0KKwlwb3AgIGVieA0KKwlwb3AgIGVicA0KKwlwb3AgIGVzaQ0KKwlwb3AgIGVkaQ0KKwlyZXQNCitfaW5mbGF0ZV9mYXN0IGVuZHANCisNCitfVEVYVAllbmRzDQorZW5kDQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9tYXNteDg2L21hdGNoNjg2LmFzbSBiL3psaWIvc3JjL2NvbnRyaWIvbWFzbXg4Ni9tYXRjaDY4Ni5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IwOTIxMgotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvbWFzbXg4Ni9tYXRjaDY4Ni5hc20KQEAgLTAsMCArMSw0NzkgQEAKKzsgbWF0Y2g2ODYuYXNtIC0tIEFzbSBwb3J0aW9uIG9mIHRoZSBvcHRpbWl6ZWQgbG9uZ2VzdF9tYXRjaCBmb3IgMzIgYml0cyB4ODYNCis7IENvcHlyaWdodCAoQykgMTk5NS0xOTk2IEplYW4tbG91cCBHYWlsbHksIEJyaWFuIFJhaXRlciBhbmQgR2lsbGVzIFZvbGxhbnQuDQorOyBGaWxlIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnQsIGJ5IGNvbnZlcnRpbmcgbWF0Y2g2ODYuUyBmcm9tIEJyaWFuIFJhaXRlcg0KKzsgZm9yIE1BU00uIFRoaXMgaXMgYXMgYXNzZW1ibHkgdmVyc2lvbiBvZiBsb25nZXN0X21hdGNoDQorOyAgZnJvbSBKZWFuLWxvdXAgR2FpbGx5IGluIGRlZmxhdGUuYw0KKzsNCis7ICAgICAgICAgaHR0cDovL3d3dy56bGliLm5ldA0KKzsgICAgICAgICBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsDQorOyAgICAgICAgIGh0dHA6Ly93d3cubXVwcGV0bGFicy5jb20vfmJyZWFkYm94L3NvZnR3YXJlL2Fzc2VtYmx5Lmh0bWwNCis7DQorOyBGb3IgVmlzdWFsIEMrKyA0LnggYW5kIGhpZ2hlciBhbmQgTUwgNi54IGFuZCBoaWdoZXINCis7ICAgbWwuZXhlIGlzIGRpc3RyaWJ1dGVkIGluDQorOyAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL2Rvd25sb2Fkcy9kZXRhaWxzLmFzcHg/RmFtaWx5SUQ9N2ExYzlkYTAtMDUxMC00NGEyLWIwNDItN2VmMzcwNTMwYzY0DQorOw0KKzsgdGhpcyBmaWxlIGNvbnRhaW4gdHdvIGltcGxlbWVudGF0aW9uIG9mIGxvbmdlc3RfbWF0Y2gNCis7DQorOyAgdGhpcyBsb25nZXN0X21hdGNoIHdhcyB3cml0dGVuIGJ5IEJyaWFuIHJhaXRlciAoMTk5OCksIG9wdGltaXplZCBmb3IgUGVudGl1bSBQcm8NCis7ICAgKGFuZCB0aGUgZmFzdGVyIGtub3duIHZlcnNpb24gb2YgbWF0Y2hfaW5pdCBvbiBtb2Rlcm4gQ29yZSAyIER1byBhbmQgQU1EIFBoZW5vbSkNCis7DQorOyAgZm9yIHVzaW5nIGFuIGFzc2VtYmx5IHZlcnNpb24gb2YgbG9uZ2VzdF9tYXRjaCwgeW91IG5lZWQgZGVmaW5lIEFTTVYgaW4gcHJvamVjdA0KKzsNCis7ICAgIGNvbXBpbGUgdGhlIGFzbSBmaWxlIHJ1bm5pbmcNCis7ICAgICAgICAgICBtbCAvY29mZiAvWmkgL2MgL0ZsbWF0Y2g2ODYubHN0IG1hdGNoNjg2LmFzbQ0KKzsgICAgYW5kIGRvIG5vdCBpbmNsdWRlIG1hdGNoNjg2Lm9iaiBpbiB5b3VyIHByb2plY3QNCis7DQorOyBub3RlOiBjb250cmliIG9mIHpMaWIgMS4yLjMgYW5kIGVhcmxpZXIgY29udGFpbmVkIGJvdGggYSBkZXByZWNhdGVkIHZlcnNpb24gZm9yDQorOyAgUGVudGl1bSAocHJpb3IgUGVudGl1bSBQcm8pIGFuZCB0aGlzIHZlcnNpb24gZm9yIFBlbnRpdW0gUHJvIGFuZCBtb2Rlcm4gcHJvY2Vzc29yDQorOyAgd2l0aCBhdXRvc2VsZWN0ICh3aXRoIGNwdSBkZXRlY3Rpb24gY29kZSkNCis7ICBpZiB5b3Ugd2FudCBzdXBwb3J0IHRoZSBvbGQgcGVudGl1bSBvcHRpbWl6YXRpb24sIHlvdSBjYW4gc3RpbGwgdXNlIHRoZXNlIHZlcnNpb24NCis7DQorOyB0aGlzIGZpbGUgaXMgbm90IG9wdGltaXplZCBmb3Igb2xkIHBlbnRpdW0sIGJ1dCBpdCBjb21wYXRpYmxlIHdpdGggYWxsIHg4NiAzMiBiaXRzDQorOyBwcm9jZXNzb3IgKHN0YXJ0aW5nIDgwMzg2KQ0KKzsNCis7DQorOyBzZWUgYmVsb3cgOiB6bGliMTIyMmFkZCBtdXN0IGJlIGFkanVzdGVyIGlmIHlvdSB1c2UgYSB6bGliIHZlcnNpb24gPCAxLjIuMi4yDQorDQorO3VJbnQgbG9uZ2VzdF9tYXRjaChzLCBjdXJfbWF0Y2gpDQorOyAgICBkZWZsYXRlX3N0YXRlICpzOw0KKzsgICAgSVBvcyBjdXJfbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IG1hdGNoICovDQorDQorICAgIE5iU3RhY2sgICAgICAgICBlcXUgICAgIDc2DQorICAgIGN1cl9tYXRjaCAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay0wXQ0KKyAgICBzdHJfcyAgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHJbZXNwK05iU3RhY2stNF0NCis7IDUgZHdvcmQgb24gdG9wIChyZXQsZWJwLGVzaSxlZGksZWJ4KQ0KKyAgICBhZHJyZXQgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHJbZXNwK05iU3RhY2stOF0NCisgICAgcHVzaGVicCAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTEyXQ0KKyAgICBwdXNoZWRpICAgICAgICAgZXF1ICAgICBkd29yZCBwdHJbZXNwK05iU3RhY2stMTZdDQorICAgIHB1c2hlc2kgICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay0yMF0NCisgICAgcHVzaGVieCAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTI0XQ0KKw0KKyAgICBjaGFpbl9sZW5ndGggICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTI4XQ0KKyAgICBsaW1pdCAgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTMyXQ0KKyAgICBiZXN0X2xlbiAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTM2XQ0KKyAgICB3aW5kb3cgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTQwXQ0KKyAgICBwcmV2ICAgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTQ0XQ0KKyAgICBzY2FuX3N0YXJ0ICAgICAgZXF1ICAgICAgd29yZCBwdHIgW2VzcCtOYlN0YWNrLTQ4XQ0KKyAgICB3bWFzayAgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTUyXQ0KKyAgICBtYXRjaF9zdGFydF9wdHIgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTU2XQ0KKyAgICBuaWNlX21hdGNoICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTYwXQ0KKyAgICBzY2FuICAgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTY0XQ0KKw0KKyAgICB3aW5kb3dsZW4gICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTY4XQ0KKyAgICBtYXRjaF9zdGFydCAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTcyXQ0KKyAgICBzdHJlbmQgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTc2XQ0KKyAgICBOYlN0YWNrQWRkICAgICAgZXF1ICAgICAoTmJTdGFjay0yNCkNCisNCisgICAgLjM4NnANCisNCisgICAgbmFtZSAgICBndm1hdGNoDQorICAgIC5NT0RFTCAgRkxBVA0KKw0KKw0KKw0KKzsgIGFsbCB0aGUgK3psaWIxMjIyYWRkIG9mZnNldHMgYXJlIGR1ZSB0byB0aGUgYWRkaXRpb24gb2YgZmllbGRzDQorOyAgaW4gemxpYiBpbiB0aGUgZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUgc2luY2UgdGhlIGFzbSBjb2RlIHdhcyBmaXJzdCB3cml0dGVuDQorOyAgKGlmIHlvdSBjb21waWxlIHdpdGggemxpYiAxLjAuNCBvciBvbGRlciwgdXNlICJ6bGliMTIyMmFkZCBlcXUgKC00KSIpLg0KKzsgIChpZiB5b3UgY29tcGlsZSB3aXRoIHpsaWIgYmV0d2VlbiAxLjAuNSBhbmQgMS4yLjIuMSwgdXNlICJ6bGliMTIyMmFkZCBlcXUgMCIpLg0KKzsgIGlmIHlvdSBjb21waWxlIHdpdGggemxpYiAxLjIuMi4yIG9yIGxhdGVyICwgdXNlICJ6bGliMTIyMmFkZCBlcXUgOCIpLg0KKw0KKyAgICB6bGliMTIyMmFkZCAgICAgICAgIGVxdSAgICAgOA0KKw0KKzsgIE5vdGUgOiB0aGVzZSB2YWx1ZSBhcmUgZ29vZCB3aXRoIGEgOCBieXRlcyBib3VuZGFyeSBwYWNrIHN0cnVjdHVyZQ0KKyAgICBkZXBfY2hhaW5fbGVuZ3RoICAgIGVxdSAgICAgNzRoK3psaWIxMjIyYWRkDQorICAgIGRlcF93aW5kb3cgICAgICAgICAgZXF1ICAgICAzMGgremxpYjEyMjJhZGQNCisgICAgZGVwX3N0cnN0YXJ0ICAgICAgICBlcXUgICAgIDY0aCt6bGliMTIyMmFkZA0KKyAgICBkZXBfcHJldl9sZW5ndGggICAgIGVxdSAgICAgNzBoK3psaWIxMjIyYWRkDQorICAgIGRlcF9uaWNlX21hdGNoICAgICAgZXF1ICAgICA4OGgremxpYjEyMjJhZGQNCisgICAgZGVwX3dfc2l6ZSAgICAgICAgICBlcXUgICAgIDI0aCt6bGliMTIyMmFkZA0KKyAgICBkZXBfcHJldiAgICAgICAgICAgIGVxdSAgICAgMzhoK3psaWIxMjIyYWRkDQorICAgIGRlcF93X21hc2sgICAgICAgICAgZXF1ICAgICAyY2gremxpYjEyMjJhZGQNCisgICAgZGVwX2dvb2RfbWF0Y2ggICAgICBlcXUgICAgIDg0aCt6bGliMTIyMmFkZA0KKyAgICBkZXBfbWF0Y2hfc3RhcnQgICAgIGVxdSAgICAgNjhoK3psaWIxMjIyYWRkDQorICAgIGRlcF9sb29rYWhlYWQgICAgICAgZXF1ICAgICA2Y2gremxpYjEyMjJhZGQNCisNCisNCitfVEVYVCAgICAgICAgICAgICAgICAgICBzZWdtZW50DQorDQorSUZERUYgTk9VTkRFUkxJTkUNCisgICAgICAgICAgICBwdWJsaWMgIGxvbmdlc3RfbWF0Y2gNCisgICAgICAgICAgICBwdWJsaWMgIG1hdGNoX2luaXQNCitFTFNFDQorICAgICAgICAgICAgcHVibGljICBfbG9uZ2VzdF9tYXRjaA0KKyAgICAgICAgICAgIHB1YmxpYyAgX21hdGNoX2luaXQNCitFTkRJRg0KKw0KKyAgICBNQVhfTUFUQ0ggICAgICAgICAgIGVxdSAgICAgMjU4DQorICAgIE1JTl9NQVRDSCAgICAgICAgICAgZXF1ICAgICAzDQorICAgIE1JTl9MT09LQUhFQUQgICAgICAgZXF1ICAgICAoTUFYX01BVENIK01JTl9NQVRDSCsxKQ0KKw0KKw0KKw0KK01BWF9NQVRDSCAgICAgICBlcXUgICAgIDI1OA0KK01JTl9NQVRDSCAgICAgICBlcXUgICAgIDMNCitNSU5fTE9PS0FIRUFEICAgZXF1ICAgICAoTUFYX01BVENIICsgTUlOX01BVENIICsgMSkNCitNQVhfTUFUQ0hfOF8gICAgIGVxdSAgICAgKChNQVhfTUFUQ0ggKyA3KSBBTkQgMEZGRjBoKQ0KKw0KKw0KKzs7OyBzdGFjayBmcmFtZSBvZmZzZXRzDQorDQorY2hhaW5sZW53bWFzayAgIGVxdSAgZXNwICsgMCAgICA7IGhpZ2ggd29yZDogY3VycmVudCBjaGFpbiBsZW4NCisgICAgICAgICAgICAgICAgICAgIDsgbG93IHdvcmQ6IHMtPndtYXNrDQord2luZG93ICAgICAgZXF1ICBlc3AgKyA0ICAgIDsgbG9jYWwgY29weSBvZiBzLT53aW5kb3cNCit3aW5kb3diZXN0bGVuICAgZXF1ICBlc3AgKyA4ICAgIDsgcy0+d2luZG93ICsgYmVzdGxlbg0KK3NjYW5zdGFydCAgIGVxdSAgZXNwICsgMTYgICA7IGZpcnN0IHR3byBieXRlcyBvZiBzdHJpbmcNCitzY2FuZW5kICAgICBlcXUgIGVzcCArIDEyICAgOyBsYXN0IHR3byBieXRlcyBvZiBzdHJpbmcNCitzY2FuYWxpZ24gICBlcXUgIGVzcCArIDIwICAgOyBkd29yZC1taXNhbGlnbm1lbnQgb2Ygc3RyaW5nDQorbmljZW1hdGNoICAgZXF1ICBlc3AgKyAyNCAgIDsgYSBnb29kIGVub3VnaCBtYXRjaCBzaXplDQorYmVzdGxlbiAgICAgZXF1ICBlc3AgKyAyOCAgIDsgc2l6ZSBvZiBiZXN0IG1hdGNoIHNvIGZhcg0KK3NjYW4gICAgICAgIGVxdSAgZXNwICsgMzIgICA7IHB0ciB0byBzdHJpbmcgd2FudGluZyBtYXRjaA0KKw0KK0xvY2FsVmFyc1NpemUgICBlcXUgMzYNCis7ICAgc2F2ZWQgZWJ4ICAgYnl0ZSBlc3AgKyAzNg0KKzsgICBzYXZlZCBlZGkgICBieXRlIGVzcCArIDQwDQorOyAgIHNhdmVkIGVzaSAgIGJ5dGUgZXNwICsgNDQNCis7ICAgc2F2ZWQgZWJwICAgYnl0ZSBlc3AgKyA0OA0KKzsgICByZXR1cm4gYWRkcmVzcyAgYnl0ZSBlc3AgKyA1Mg0KK2RlZmxhdGVzdGF0ZSAgICBlcXUgIGVzcCArIDU2ICAgOyB0aGUgZnVuY3Rpb24gYXJndW1lbnRzDQorY3VybWF0Y2ggICAgZXF1ICBlc3AgKyA2MA0KKw0KKzs7OyBPZmZzZXRzIGZvciBmaWVsZHMgaW4gdGhlIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlLiBUaGVzZSBudW1iZXJzDQorOzs7IGFyZSBjYWxjdWxhdGVkIGZyb20gdGhlIGRlZmluaXRpb24gb2YgZGVmbGF0ZV9zdGF0ZSwgd2l0aCB0aGUNCis7OzsgYXNzdW1wdGlvbiB0aGF0IHRoZSBjb21waWxlciB3aWxsIGR3b3JkLWFsaWduIHRoZSBmaWVsZHMuIChUaHVzLA0KKzs7OyBjaGFuZ2luZyB0aGUgZGVmaW5pdGlvbiBvZiBkZWZsYXRlX3N0YXRlIGNvdWxkIGVhc2lseSBjYXVzZSB0aGlzDQorOzs7IHByb2dyYW0gdG8gY3Jhc2ggaG9ycmlibHksIHdpdGhvdXQgc28gbXVjaCBhcyBhIHdhcm5pbmcgYXQNCis7OzsgY29tcGlsZSB0aW1lLiBTaWdoLikNCisNCitkc1dTaXplICAgICBlcXUgMzYremxpYjEyMjJhZGQNCitkc1dNYXNrICAgICBlcXUgNDQremxpYjEyMjJhZGQNCitkc1dpbmRvdyAgICBlcXUgNDgremxpYjEyMjJhZGQNCitkc1ByZXYgICAgICBlcXUgNTYremxpYjEyMjJhZGQNCitkc01hdGNoTGVuICBlcXUgODgremxpYjEyMjJhZGQNCitkc1ByZXZNYXRjaCBlcXUgOTIremxpYjEyMjJhZGQNCitkc1N0clN0YXJ0ICBlcXUgMTAwK3psaWIxMjIyYWRkDQorZHNNYXRjaFN0YXJ0ICAgIGVxdSAxMDQremxpYjEyMjJhZGQNCitkc0xvb2thaGVhZCBlcXUgMTA4K3psaWIxMjIyYWRkDQorZHNQcmV2TGVuICAgZXF1IDExMit6bGliMTIyMmFkZA0KK2RzTWF4Q2hhaW5MZW4gICBlcXUgMTE2K3psaWIxMjIyYWRkDQorZHNHb29kTWF0Y2ggZXF1IDEzMit6bGliMTIyMmFkZA0KK2RzTmljZU1hdGNoIGVxdSAxMzYremxpYjEyMjJhZGQNCisNCisNCis7OzsgbWF0Y2g2ODYuYXNtIC0tIFBlbnRpdW0tUHJvLW9wdGltaXplZCB2ZXJzaW9uIG9mIGxvbmdlc3RfbWF0Y2goKQ0KKzs7OyBXcml0dGVuIGZvciB6bGliIDEuMS4yDQorOzs7IENvcHlyaWdodCAoQykgMTk5OCBCcmlhbiBSYWl0ZXIgPGJyZWFkYm94QG11cHBldGxhYnMuY29tPg0KKzs7OyBZb3UgY2FuIGxvb2sgYXQgaHR0cDovL3d3dy5tdXBwZXRsYWJzLmNvbS9+YnJlYWRib3gvc29mdHdhcmUvYXNzZW1ibHkuaHRtbA0KKzs7Ow0KKzs7DQorOzsgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkDQorOzsgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMNCis7OyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4NCis7Ow0KKzs7ICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwNCis7OyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdA0KKzs7ICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6DQorOzsNCis7OyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QNCis7OyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUNCis7OyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlDQorOzsgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuDQorOzsgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlDQorOzsgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZQ0KKzs7ICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLg0KKzs7DQorDQorO0dMT0JBTCBfbG9uZ2VzdF9tYXRjaCwgX21hdGNoX2luaXQNCisNCisNCis7U0VDVElPTiAgICAudGV4dA0KKw0KKzs7OyB1SW50IGxvbmdlc3RfbWF0Y2goZGVmbGF0ZV9zdGF0ZSAqZGVmbGF0ZXN0YXRlLCBJUG9zIGN1cm1hdGNoKQ0KKw0KKztfbG9uZ2VzdF9tYXRjaDoNCisgICAgSUZERUYgTk9VTkRFUkxJTkUNCisgICAgbG9uZ2VzdF9tYXRjaCAgICAgICBwcm9jIG5lYXINCisgICAgRUxTRQ0KKyAgICBfbG9uZ2VzdF9tYXRjaCAgICAgIHByb2MgbmVhcg0KKyAgICBFTkRJRg0KKy5GUE8gKDksIDQsIDAsIDAsIDEsIDApDQorDQorOzs7IFNhdmUgcmVnaXN0ZXJzIHRoYXQgdGhlIGNvbXBpbGVyIG1heSBiZSB1c2luZywgYW5kIGFkanVzdCBlc3AgdG8NCis7OzsgbWFrZSByb29tIGZvciBvdXIgc3RhY2sgZnJhbWUuDQorDQorICAgICAgICBwdXNoICAgIGVicA0KKyAgICAgICAgcHVzaCAgICBlZGkNCisgICAgICAgIHB1c2ggICAgZXNpDQorICAgICAgICBwdXNoICAgIGVieA0KKyAgICAgICAgc3ViIGVzcCwgTG9jYWxWYXJzU2l6ZQ0KKw0KKzs7OyBSZXRyaWV2ZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzLiBlY3ggd2lsbCBob2xkIGN1cl9tYXRjaA0KKzs7OyB0aHJvdWdob3V0IHRoZSBlbnRpcmUgZnVuY3Rpb24uIGVkeCB3aWxsIGhvbGQgdGhlIHBvaW50ZXIgdG8gdGhlDQorOzs7IGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlIGR1cmluZyB0aGUgZnVuY3Rpb24ncyBzZXR1cCAoYmVmb3JlDQorOzs7IGVudGVyaW5nIHRoZSBtYWluIGxvb3AuDQorDQorICAgICAgICBtb3YgZWR4LCBbZGVmbGF0ZXN0YXRlXQ0KKyAgICAgICAgbW92IGVjeCwgW2N1cm1hdGNoXQ0KKw0KKzs7OyB1SW50IHdtYXNrID0gcy0+d19tYXNrOw0KKzs7OyB1bnNpZ25lZCBjaGFpbl9sZW5ndGggPSBzLT5tYXhfY2hhaW5fbGVuZ3RoOw0KKzs7OyBpZiAocy0+cHJldl9sZW5ndGggPj0gcy0+Z29vZF9tYXRjaCkgew0KKzs7OyAgICAgY2hhaW5fbGVuZ3RoID4+PSAyOw0KKzs7OyB9DQorDQorICAgICAgICBtb3YgZWF4LCBbZWR4ICsgZHNQcmV2TGVuXQ0KKyAgICAgICAgbW92IGVieCwgW2VkeCArIGRzR29vZE1hdGNoXQ0KKyAgICAgICAgY21wIGVheCwgZWJ4DQorICAgICAgICBtb3YgZWF4LCBbZWR4ICsgZHNXTWFza10NCisgICAgICAgIG1vdiBlYngsIFtlZHggKyBkc01heENoYWluTGVuXQ0KKyAgICAgICAgamwgIExhc3RNYXRjaEdvb2QNCisgICAgICAgIHNociBlYngsIDINCitMYXN0TWF0Y2hHb29kOg0KKw0KKzs7OyBjaGFpbmxlbiBpcyBkZWNyZW1lbnRlZCBvbmNlIGJlZm9yZWhhbmQgc28gdGhhdCB0aGUgZnVuY3Rpb24gY2FuDQorOzs7IHVzZSB0aGUgc2lnbiBmbGFnIGluc3RlYWQgb2YgdGhlIHplcm8gZmxhZyBmb3IgdGhlIGV4aXQgdGVzdC4NCis7OzsgSXQgaXMgdGhlbiBzaGlmdGVkIGludG8gdGhlIGhpZ2ggd29yZCwgdG8gbWFrZSByb29tIGZvciB0aGUgd21hc2sNCis7OzsgdmFsdWUsIHdoaWNoIGl0IHdpbGwgYWx3YXlzIGFjY29tcGFueS4NCisNCisgICAgICAgIGRlYyBlYngNCisgICAgICAgIHNobCBlYngsIDE2DQorICAgICAgICBvciAgZWJ4LCBlYXgNCisgICAgICAgIG1vdiBbY2hhaW5sZW53bWFza10sIGVieA0KKw0KKzs7OyBpZiAoKHVJbnQpbmljZV9tYXRjaCA+IHMtPmxvb2thaGVhZCkgbmljZV9tYXRjaCA9IHMtPmxvb2thaGVhZDsNCisNCisgICAgICAgIG1vdiBlYXgsIFtlZHggKyBkc05pY2VNYXRjaF0NCisgICAgICAgIG1vdiBlYngsIFtlZHggKyBkc0xvb2thaGVhZF0NCisgICAgICAgIGNtcCBlYngsIGVheA0KKyAgICAgICAgamwgIExvb2thaGVhZExlc3MNCisgICAgICAgIG1vdiBlYngsIGVheA0KK0xvb2thaGVhZExlc3M6ICBtb3YgW25pY2VtYXRjaF0sIGVieA0KKw0KKzs7OyByZWdpc3RlciBCeXRlZiAqc2NhbiA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0Ow0KKw0KKyAgICAgICAgbW92IGVzaSwgW2VkeCArIGRzV2luZG93XQ0KKyAgICAgICAgbW92IFt3aW5kb3ddLCBlc2kNCisgICAgICAgIG1vdiBlYnAsIFtlZHggKyBkc1N0clN0YXJ0XQ0KKyAgICAgICAgbGVhIGVkaSwgW2VzaSArIGVicF0NCisgICAgICAgIG1vdiBbc2Nhbl0sIGVkaQ0KKw0KKzs7OyBEZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgdGhlIHNjYW4gcHRyIGlzIG9mZiBmcm9tIGJlaW5nDQorOzs7IGR3b3JkLWFsaWduZWQuDQorDQorICAgICAgICBtb3YgZWF4LCBlZGkNCisgICAgICAgIG5lZyBlYXgNCisgICAgICAgIGFuZCBlYXgsIDMNCisgICAgICAgIG1vdiBbc2NhbmFsaWduXSwgZWF4DQorDQorOzs7IElQb3MgbGltaXQgPSBzLT5zdHJzdGFydCA+IChJUG9zKU1BWF9ESVNUKHMpID8NCis7OzsgICAgIHMtPnN0cnN0YXJ0IC0gKElQb3MpTUFYX0RJU1QocykgOiBOSUw7DQorDQorICAgICAgICBtb3YgZWF4LCBbZWR4ICsgZHNXU2l6ZV0NCisgICAgICAgIHN1YiBlYXgsIE1JTl9MT09LQUhFQUQNCisgICAgICAgIHN1YiBlYnAsIGVheA0KKyAgICAgICAgamcgIExpbWl0UG9zaXRpdmUNCisgICAgICAgIHhvciBlYnAsIGVicA0KK0xpbWl0UG9zaXRpdmU6DQorDQorOzs7IGludCBiZXN0X2xlbiA9IHMtPnByZXZfbGVuZ3RoOw0KKw0KKyAgICAgICAgbW92IGVheCwgW2VkeCArIGRzUHJldkxlbl0NCisgICAgICAgIG1vdiBbYmVzdGxlbl0sIGVheA0KKw0KKzs7OyBTdG9yZSB0aGUgc3VtIG9mIHMtPndpbmRvdyArIGJlc3RfbGVuIGluIGVzaSBsb2NhbGx5LCBhbmQgaW4gZXNpLg0KKw0KKyAgICAgICAgYWRkIGVzaSwgZWF4DQorICAgICAgICBtb3YgW3dpbmRvd2Jlc3RsZW5dLCBlc2kNCisNCis7OzsgcmVnaXN0ZXIgdXNoIHNjYW5fc3RhcnQgPSAqKHVzaGYqKXNjYW47DQorOzs7IHJlZ2lzdGVyIHVzaCBzY2FuX2VuZCAgID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsNCis7OzsgUG9zZiAqcHJldiA9IHMtPnByZXY7DQorDQorICAgICAgICBtb3Z6eCAgIGVieCwgd29yZCBwdHIgW2VkaV0NCisgICAgICAgIG1vdiBbc2NhbnN0YXJ0XSwgZWJ4DQorICAgICAgICBtb3Z6eCAgIGVieCwgd29yZCBwdHIgW2VkaSArIGVheCAtIDFdDQorICAgICAgICBtb3YgW3NjYW5lbmRdLCBlYngNCisgICAgICAgIG1vdiBlZGksIFtlZHggKyBkc1ByZXZdDQorDQorOzs7IEp1bXAgaW50byB0aGUgbWFpbiBsb29wLg0KKw0KKyAgICAgICAgbW92IGVkeCwgW2NoYWlubGVud21hc2tdDQorICAgICAgICBqbXAgc2hvcnQgTG9vcEVudHJ5DQorDQorYWxpZ24gNA0KKw0KKzs7OyBkbyB7DQorOzs7ICAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsNCis7OzsgICAgIGlmICgqKHVzaGYqKShtYXRjaCtiZXN0X2xlbi0xKSAhPSBzY2FuX2VuZCB8fA0KKzs7OyAgICAgICAgICoodXNoZiopbWF0Y2ggIT0gc2Nhbl9zdGFydCkgY29udGludWU7DQorOzs7ICAgICBbLi4uXQ0KKzs7OyB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQNCis7OzsgICAgICAgICAgJiYgLS1jaGFpbl9sZW5ndGggIT0gMCk7DQorOzs7DQorOzs7IEhlcmUgaXMgdGhlIGlubmVyIGxvb3Agb2YgdGhlIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gd2lsbCBzcGVuZCB0aGUNCis7OzsgbWFqb3JpdHkgb2YgaXRzIHRpbWUgaW4gdGhpcyBsb29wLCBhbmQgbWFqb3JpdHkgb2YgdGhhdCB0aW1lIHdpbGwNCis7OzsgYmUgc3BlbnQgaW4gdGhlIGZpcnN0IHRlbiBpbnN0cnVjdGlvbnMuDQorOzs7DQorOzs7IFdpdGhpbiB0aGlzIGxvb3A6DQorOzs7IGVieCA9IHNjYW5lbmQNCis7OzsgZWN4ID0gY3VybWF0Y2gNCis7OzsgZWR4ID0gY2hhaW5sZW53bWFzayAtIGkuZS4sICgoY2hhaW5sZW4gPDwgMTYpIHwgd21hc2spDQorOzs7IGVzaSA9IHdpbmRvd2Jlc3RsZW4gLSBpLmUuLCAod2luZG93ICsgYmVzdGxlbikNCis7OzsgZWRpID0gcHJldg0KKzs7OyBlYnAgPSBsaW1pdA0KKw0KK0xvb2t1cExvb3A6DQorICAgICAgICBhbmQgZWN4LCBlZHgNCisgICAgICAgIG1vdnp4ICAgZWN4LCB3b3JkIHB0ciBbZWRpICsgZWN4KjJdDQorICAgICAgICBjbXAgZWN4LCBlYnANCisgICAgICAgIGpiZSBMZWF2ZU5vdw0KKyAgICAgICAgc3ViIGVkeCwgMDAwMTAwMDBoDQorICAgICAgICBqcyAgTGVhdmVOb3cNCitMb29wRW50cnk6ICBtb3Z6eCAgIGVheCwgd29yZCBwdHIgW2VzaSArIGVjeCAtIDFdDQorICAgICAgICBjbXAgZWF4LCBlYngNCisgICAgICAgIGpueiBMb29rdXBMb29wDQorICAgICAgICBtb3YgZWF4LCBbd2luZG93XQ0KKyAgICAgICAgbW92enggICBlYXgsIHdvcmQgcHRyIFtlYXggKyBlY3hdDQorICAgICAgICBjbXAgZWF4LCBbc2NhbnN0YXJ0XQ0KKyAgICAgICAgam56IExvb2t1cExvb3ANCisNCis7OzsgU3RvcmUgdGhlIGN1cnJlbnQgdmFsdWUgb2YgY2hhaW5sZW4uDQorDQorICAgICAgICBtb3YgW2NoYWlubGVud21hc2tdLCBlZHgNCisNCis7OzsgUG9pbnQgZWRpIHRvIHRoZSBzdHJpbmcgdW5kZXIgc2NydXRpbnksIGFuZCBlc2kgdG8gdGhlIHN0cmluZyB3ZQ0KKzs7OyBhcmUgaG9waW5nIHRvIG1hdGNoIGl0IHVwIHdpdGguIEluIGFjdHVhbGl0eSwgZXNpIGFuZCBlZGkgYXJlDQorOzs7IGJvdGggcG9pbnRlZCAoTUFYX01BVENIXzggLSBzY2FuYWxpZ24pIGJ5dGVzIGFoZWFkLCBhbmQgZWR4IGlzDQorOzs7IGluaXRpYWxpemVkIHRvIC0oTUFYX01BVENIXzggLSBzY2FuYWxpZ24pLg0KKw0KKyAgICAgICAgbW92IGVzaSwgW3dpbmRvd10NCisgICAgICAgIG1vdiBlZGksIFtzY2FuXQ0KKyAgICAgICAgYWRkIGVzaSwgZWN4DQorICAgICAgICBtb3YgZWF4LCBbc2NhbmFsaWduXQ0KKyAgICAgICAgbW92IGVkeCwgMGZmZmZmZWY4aDsgLShNQVhfTUFUQ0hfOCkNCisgICAgICAgIGxlYSBlZGksIFtlZGkgKyBlYXggKyAwMTA4aF0gO01BWF9NQVRDSF84XQ0KKyAgICAgICAgbGVhIGVzaSwgW2VzaSArIGVheCArIDAxMDhoXSA7TUFYX01BVENIXzhdDQorDQorOzs7IFRlc3QgdGhlIHN0cmluZ3MgZm9yIGVxdWFsaXR5LCA4IGJ5dGVzIGF0IGEgdGltZS4gQXQgdGhlIGVuZCwNCis7OzsgYWRqdXN0IGVkeCBzbyB0aGF0IGl0IGlzIG9mZnNldCB0byB0aGUgZXhhY3QgYnl0ZSB0aGF0IG1pc21hdGNoZWQuDQorOzs7DQorOzs7IFdlIGFscmVhZHkga25vdyBhdCB0aGlzIHBvaW50IHRoYXQgdGhlIGZpcnN0IHRocmVlIGJ5dGVzIG9mIHRoZQ0KKzs7OyBzdHJpbmdzIG1hdGNoIGVhY2ggb3RoZXIsIGFuZCB0aGV5IGNhbiBiZSBzYWZlbHkgcGFzc2VkIG92ZXIgYmVmb3JlDQorOzs7IHN0YXJ0aW5nIHRoZSBjb21wYXJlIGxvb3AuIFNvIHdoYXQgdGhpcyBjb2RlIGRvZXMgaXMgc2tpcCBvdmVyIDAtMw0KKzs7OyBieXRlcywgYXMgbXVjaCBhcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gZHdvcmQtYWxpZ24gdGhlIGVkaQ0KKzs7OyBwb2ludGVyLiAoZXNpIHdpbGwgc3RpbGwgYmUgbWlzYWxpZ25lZCB0aHJlZSB0aW1lcyBvdXQgb2YgZm91ci4pDQorOzs7DQorOzs7IEl0IHNob3VsZCBiZSBjb25mZXNzZWQgdGhhdCB0aGlzIGxvb3AgdXN1YWxseSBkb2VzIG5vdCByZXByZXNlbnQNCis7OzsgbXVjaCBvZiB0aGUgdG90YWwgcnVubmluZyB0aW1lLiBSZXBsYWNpbmcgaXQgd2l0aCBhIG1vcmUNCis7Ozsgc3RyYWlnaHRmb3J3YXJkICJyZXAgY21wc2IiIHdvdWxkIG5vdCBkcmFzdGljYWxseSBkZWdyYWRlDQorOzs7IHBlcmZvcm1hbmNlLg0KKw0KK0xvb3BDbXBzOg0KKyAgICAgICAgbW92IGVheCwgW2VzaSArIGVkeF0NCisgICAgICAgIHhvciBlYXgsIFtlZGkgKyBlZHhdDQorICAgICAgICBqbnogTGVhdmVMb29wQ21wcw0KKyAgICAgICAgbW92IGVheCwgW2VzaSArIGVkeCArIDRdDQorICAgICAgICB4b3IgZWF4LCBbZWRpICsgZWR4ICsgNF0NCisgICAgICAgIGpueiBMZWF2ZUxvb3BDbXBzNA0KKyAgICAgICAgYWRkIGVkeCwgOA0KKyAgICAgICAgam56IExvb3BDbXBzDQorICAgICAgICBqbXAgc2hvcnQgTGVuTWF4aW11bQ0KK0xlYXZlTG9vcENtcHM0OiBhZGQgZWR4LCA0DQorTGVhdmVMb29wQ21wczogIHRlc3QgICAgZWF4LCAwMDAwRkZGRmgNCisgICAgICAgIGpueiBMZW5Mb3dlcg0KKyAgICAgICAgYWRkIGVkeCwgIDINCisgICAgICAgIHNociBlYXgsIDE2DQorTGVuTG93ZXI6ICAgc3ViIGFsLCAxDQorICAgICAgICBhZGMgZWR4LCAwDQorDQorOzs7IENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaC4gSWYgaXQgaXMgbG9uZ2VyIHRoYW4gTUFYX01BVENILA0KKzs7OyB0aGVuIGF1dG9tYXRpY2FsbHkgYWNjZXB0IGl0IGFzIHRoZSBiZXN0IHBvc3NpYmxlIG1hdGNoIGFuZCBsZWF2ZS4NCisNCisgICAgICAgIGxlYSBlYXgsIFtlZGkgKyBlZHhdDQorICAgICAgICBtb3YgZWRpLCBbc2Nhbl0NCisgICAgICAgIHN1YiBlYXgsIGVkaQ0KKyAgICAgICAgY21wIGVheCwgTUFYX01BVENIDQorICAgICAgICBqZ2UgTGVuTWF4aW11bQ0KKw0KKzs7OyBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCBpcyBub3QgbG9uZ2VyIHRoYW4gdGhlIGJlc3QgbWF0Y2ggd2UNCis7OzsgaGF2ZSBzbyBmYXIsIHRoZW4gZm9yZ2V0IGl0IGFuZCByZXR1cm4gdG8gdGhlIGxvb2t1cCBsb29wLg0KKw0KKyAgICAgICAgbW92IGVkeCwgW2RlZmxhdGVzdGF0ZV0NCisgICAgICAgIG1vdiBlYngsIFtiZXN0bGVuXQ0KKyAgICAgICAgY21wIGVheCwgZWJ4DQorICAgICAgICBqZyAgTG9uZ2VyTWF0Y2gNCisgICAgICAgIG1vdiBlc2ksIFt3aW5kb3diZXN0bGVuXQ0KKyAgICAgICAgbW92IGVkaSwgW2VkeCArIGRzUHJldl0NCisgICAgICAgIG1vdiBlYngsIFtzY2FuZW5kXQ0KKyAgICAgICAgbW92IGVkeCwgW2NoYWlubGVud21hc2tdDQorICAgICAgICBqbXAgTG9va3VwTG9vcA0KKw0KKzs7OyAgICAgICAgIHMtPm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoOw0KKzs7OyAgICAgICAgIGJlc3RfbGVuID0gbGVuOw0KKzs7OyAgICAgICAgIGlmIChsZW4gPj0gbmljZV9tYXRjaCkgYnJlYWs7DQorOzs7ICAgICAgICAgc2Nhbl9lbmQgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOw0KKw0KK0xvbmdlck1hdGNoOiAgICBtb3YgZWJ4LCBbbmljZW1hdGNoXQ0KKyAgICAgICAgbW92IFtiZXN0bGVuXSwgZWF4DQorICAgICAgICBtb3YgW2VkeCArIGRzTWF0Y2hTdGFydF0sIGVjeA0KKyAgICAgICAgY21wIGVheCwgZWJ4DQorICAgICAgICBqZ2UgTGVhdmVOb3cNCisgICAgICAgIG1vdiBlc2ksIFt3aW5kb3ddDQorICAgICAgICBhZGQgZXNpLCBlYXgNCisgICAgICAgIG1vdiBbd2luZG93YmVzdGxlbl0sIGVzaQ0KKyAgICAgICAgbW92enggICBlYngsIHdvcmQgcHRyIFtlZGkgKyBlYXggLSAxXQ0KKyAgICAgICAgbW92IGVkaSwgW2VkeCArIGRzUHJldl0NCisgICAgICAgIG1vdiBbc2NhbmVuZF0sIGVieA0KKyAgICAgICAgbW92IGVkeCwgW2NoYWlubGVud21hc2tdDQorICAgICAgICBqbXAgTG9va3VwTG9vcA0KKw0KKzs7OyBBY2NlcHQgdGhlIGN1cnJlbnQgc3RyaW5nLCB3aXRoIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGxlbmd0aC4NCisNCitMZW5NYXhpbXVtOiBtb3YgZWR4LCBbZGVmbGF0ZXN0YXRlXQ0KKyAgICAgICAgbW92IGR3b3JkIHB0ciBbYmVzdGxlbl0sIE1BWF9NQVRDSA0KKyAgICAgICAgbW92IFtlZHggKyBkc01hdGNoU3RhcnRdLCBlY3gNCisNCis7OzsgaWYgKCh1SW50KWJlc3RfbGVuIDw9IHMtPmxvb2thaGVhZCkgcmV0dXJuICh1SW50KWJlc3RfbGVuOw0KKzs7OyByZXR1cm4gcy0+bG9va2FoZWFkOw0KKw0KK0xlYXZlTm93Og0KKyAgICAgICAgbW92IGVkeCwgW2RlZmxhdGVzdGF0ZV0NCisgICAgICAgIG1vdiBlYngsIFtiZXN0bGVuXQ0KKyAgICAgICAgbW92IGVheCwgW2VkeCArIGRzTG9va2FoZWFkXQ0KKyAgICAgICAgY21wIGVieCwgZWF4DQorICAgICAgICBqZyAgTG9va2FoZWFkUmV0DQorICAgICAgICBtb3YgZWF4LCBlYngNCitMb29rYWhlYWRSZXQ6DQorDQorOzs7IFJlc3RvcmUgdGhlIHN0YWNrIGFuZCByZXR1cm4gZnJvbSB3aGVuY2Ugd2UgY2FtZS4NCisNCisgICAgICAgIGFkZCBlc3AsIExvY2FsVmFyc1NpemUNCisgICAgICAgIHBvcCBlYngNCisgICAgICAgIHBvcCBlc2kNCisgICAgICAgIHBvcCBlZGkNCisgICAgICAgIHBvcCBlYnANCisNCisgICAgICAgIHJldA0KKzsgcGxlYXNlIGRvbid0IHJlbW92ZSB0aGlzIHN0cmluZyAhDQorOyBZb3VyIGNhbiBmcmVlbHkgdXNlIG1hdGNoNjg2IGluIGFueSBmcmVlIG9yIGNvbW1lcmNpYWwgYXBwIGlmIHlvdSBkb24ndCByZW1vdmUgdGhlIHN0cmluZyBpbiB0aGUgYmluYXJ5IQ0KKyAgICBkYiAgICAgMGRoLDBhaCwiYXNtNjg2IHdpdGggbWFzbSwgb3B0aW1pc2VkIGFzc2VtYmx5IGNvZGUgZnJvbSBCcmlhbiBSYWl0ZXIsIHdyaXR0ZW4gMTk5OCIsMGRoLDBhaA0KKw0KKw0KKyAgICBJRkRFRiBOT1VOREVSTElORQ0KKyAgICBsb25nZXN0X21hdGNoICAgICAgIGVuZHANCisgICAgRUxTRQ0KKyAgICBfbG9uZ2VzdF9tYXRjaCAgICAgIGVuZHANCisgICAgRU5ESUYNCisNCisgICAgSUZERUYgTk9VTkRFUkxJTkUNCisgICAgbWF0Y2hfaW5pdCAgICAgIHByb2MgbmVhcg0KKyAgICAgICAgICAgICAgICAgICAgcmV0DQorICAgIG1hdGNoX2luaXQgICAgICBlbmRwDQorICAgIEVMU0UNCisgICAgX21hdGNoX2luaXQgICAgIHByb2MgbmVhcg0KKyAgICAgICAgICAgICAgICAgICAgcmV0DQorICAgIF9tYXRjaF9pbml0ICAgICBlbmRwDQorICAgIEVORElGDQorDQorDQorX1RFWFQgICBlbmRzDQorZW5kDQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9tYXNteDg2L3JlYWRtZS50eHQgYi96bGliL3NyYy9jb250cmliL21hc214ODYvcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjcxZjcyCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9tYXNteDg2L3JlYWRtZS50eHQKQEAgLTAsMCArMSwyNyBAQAorDQorU3VtbWFyeQ0KKy0tLS0tLS0NCitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBBU00gaW1wbGVtZW50YXRpb25zIG9mIHRoZSBmdW5jdGlvbnMNCitsb25nZXN0X21hdGNoKCkgYW5kIGluZmxhdGVfZmFzdCgpLg0KKw0KKw0KK1VzZSBpbnN0cnVjdGlvbnMNCistLS0tLS0tLS0tLS0tLS0tDQorQXNzZW1ibGUgdXNpbmcgTUFTTSwgYW5kIGNvcHkgdGhlIG9iamVjdCBmaWxlcyBpbnRvIHRoZSB6bGliIHNvdXJjZQ0KK2RpcmVjdG9yeSwgdGhlbiBydW4gdGhlIGFwcHJvcHJpYXRlIG1ha2VmaWxlLCBhcyBzdWdnZXN0ZWQgYmVsb3cuICBZb3UgY2FuDQorZG9ud2xvYWQgTUFTTSBmcm9tIGhlcmU6DQorDQorICAgIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9kb3dubG9hZHMvZGV0YWlscy5hc3B4P2Rpc3BsYXlsYW5nPWVuJkZhbWlseUlEPTdhMWM5ZGEwLTA1MTAtNDRhMi1iMDQyLTdlZjM3MDUzMGM2NA0KKw0KK1lvdSBjYW4gYWxzbyBnZXQgb2JqZWN0cyBmaWxlcyBoZXJlOg0KKw0KKyAgICBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL3psaWIxMjRfbWFzbV9vYmouemlwDQorDQorQnVpbGQgaW5zdHJ1Y3Rpb25zDQorLS0tLS0tLS0tLS0tLS0tLS0tDQorKiBXaXRoIE1pY3Jvc29mdCBDIGFuZCBNQVNNOg0KK25tYWtlIC1mIHdpbjMyL01ha2VmaWxlLm1zYyBMT0M9Ii1EQVNNViAtREFTTUlORiIgT0JKQT0ibWF0Y2g2ODYub2JqIGluZmZhczMyLm9iaiINCisNCisqIFdpdGggQm9ybGFuZCBDIGFuZCBUQVNNOg0KK21ha2UgLWYgd2luMzIvTWFrZWZpbGUuYm9yIExPQ0FMX1pMSUI9Ii1EQVNNViAtREFTTUlORiIgT0JKQT0ibWF0Y2g2ODYub2JqIGluZmZhczMyLm9iaiIgT0JKUEE9IittYXRjaDY4NmMub2JqK21hdGNoNjg2Lm9iaitpbmZmYXMzMi5vYmoiDQorDQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9taW5pemlwL01ha2VmaWxlIGIvemxpYi9zcmMvY29udHJpYi9taW5pemlwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZWFhZDIKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL21pbml6aXAvTWFrZWZpbGUKQEAgLTAsMCArMSwyNSBAQAorQ0M9Y2MKK0NGTEFHUz0tTyAtSS4uLy4uCisKK1VOWl9PQkpTID0gbWluaXVuei5vIHVuemlwLm8gaW9hcGkubyAuLi8uLi9saWJ6LmEKK1pJUF9PQkpTID0gbWluaXppcC5vIHppcC5vICAgaW9hcGkubyAuLi8uLi9saWJ6LmEKKworLmMubzoKKwkkKENDKSAtYyAkKENGTEFHUykgJCouYworCithbGw6IG1pbml1bnogbWluaXppcAorCittaW5pdW56OiAgJChVTlpfT0JKUykKKwkkKENDKSAkKENGTEFHUykgLW8gJEAgJChVTlpfT0JKUykKKworbWluaXppcDogICQoWklQX09CSlMpCisJJChDQykgJChDRkxBR1MpIC1vICRAICQoWklQX09CSlMpCisKK3Rlc3Q6CW1pbml1bnogbWluaXppcAorCS4vbWluaXppcCB0ZXN0IHJlYWRtZS50eHQKKwkuL21pbml1bnogLWwgdGVzdC56aXAKKwltdiByZWFkbWUudHh0IHJlYWRtZS5vbGQKKwkuL21pbml1bnogdGVzdC56aXAKKworY2xlYW46CisJL2Jpbi9ybSAtZiAqLm8gKn4gbWluaXppcCBtaW5pdW56CmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL21pbml6aXAvTWFrZWZpbGUuYW0gYi96bGliL3NyYy9jb250cmliL21pbml6aXAvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM0MzAxMQotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvbWluaXppcC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ1IEBACitsaWJfTFRMSUJSQVJJRVMgPSBsaWJtaW5pemlwLmxhCisKK2lmIENPTkRfREVNT1MKK2Jpbl9QUk9HUkFNUyA9IG1pbml1bnppcCBtaW5pemlwCitlbmRpZgorCit6bGliX3RvcF9zcmNkaXIgPSAkKHRvcF9zcmNkaXIpLy4uLy4uCit6bGliX3RvcF9idWlsZGRpciA9ICQodG9wX2J1aWxkZGlyKS8uLi8uLgorCitBTV9DUFBGTEFHUyA9IC1JJCh6bGliX3RvcF9zcmNkaXIpCitBTV9MREZMQUdTID0gLUwkKHpsaWJfdG9wX2J1aWxkZGlyKQorCitpZiBXSU4zMgoraW93aW4zMl9zcmMgPSBpb3dpbjMyLmMKK2lvd2luMzJfaCA9IGlvd2luMzIuaAorZW5kaWYKKworbGlibWluaXppcF9sYV9TT1VSQ0VTID0gXAorCWlvYXBpLmMgXAorCW16dG9vbHMuYyBcCisJdW56aXAuYyBcCisJemlwLmMgXAorCSR7aW93aW4zMl9zcmN9CisKK2xpYm1pbml6aXBfbGFfTERGTEFHUyA9ICQoQU1fTERGTEFHUykgLXZlcnNpb24taW5mbyAxOjA6MCAtbHoKKworbWluaXppcF9pbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9taW5pemlwCittaW5pemlwX2luY2x1ZGVfSEVBREVSUyA9IFwKKwljcnlwdC5oIFwKKwlpb2FwaS5oIFwKKwltenRvb2xzLmggXAorCXVuemlwLmggXAorCXppcC5oIFwKKwkke2lvd2luMzJfaH0KKworcGtnY29uZmlnZGlyID0gJChsaWJkaXIpL3BrZ2NvbmZpZworcGtnY29uZmlnX0RBVEEgPSBtaW5pemlwLnBjCisKK0VYVFJBX1BST0dSQU1TID0gbWluaXVuemlwIG1pbml6aXAKKworbWluaXVuemlwX1NPVVJDRVMgPSBtaW5pdW56LmMKK21pbml1bnppcF9MREFERCA9IGxpYm1pbml6aXAubGEKKworbWluaXppcF9TT1VSQ0VTID0gbWluaXppcC5jCittaW5pemlwX0xEQUREID0gbGlibWluaXppcC5sYSAtbHoKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvbWluaXppcC9NaW5pWmlwNjRfQ2hhbmdlcy50eHQgYi96bGliL3NyYy9jb250cmliL21pbml6aXAvTWluaVppcDY0X0NoYW5nZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYTFiZDkKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL21pbml6aXAvTWluaVppcDY0X0NoYW5nZXMudHh0CkBAIC0wLDAgKzEsNiBAQAorCitNaW5pWmlwIDEuMSB3YXMgZGVycml2ZWQgZnJvbSBNaW5pWmlwIGF0IHZlcnNpb24gMS4wMWYKKworQ2hhbmdlIGluIDEuMCAoT2t0IDIwMDkpCisgLSAqKlRPRE8gLSBBZGQgaGlzdG9yeSoqCisKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvbWluaXppcC9NaW5pWmlwNjRfaW5mby50eHQgYi96bGliL3NyYy9jb250cmliL21pbml6aXAvTWluaVppcDY0X2luZm8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZDcxNTIKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL21pbml6aXAvTWluaVppcDY0X2luZm8udHh0CkBAIC0wLDAgKzEsNzQgQEAKK01pbmlaaXAgLSBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMCAtIGJ5IEdpbGxlcyBWb2xsYW50IC0gdmVyc2lvbiAxLjEgNjQgYml0cyBmcm9tIE1hdGhpYXMgU3ZlbnNzb24KKworSW50cm9kdWN0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KK01pbmlaaXAgMS4xIGlzIGJ1aWx0IGZyb20gTWluaVppcCAxLjAgYnkgR2lsbGVzIFZvbGxhbnQgKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCisKK1doZW4gYWRkaW5nIFpJUDY0IHN1cHBvcnQgaW50byBtaW5pemlwIGl0IHdvdWxkIHJlc3VsdCBpbnRvIHJpc2sgb2YgYnJlYWtpbmcgY29tcGF0aWJpbGl0eSB3aXRoIG1pbml6aXAgMS4wLgorQWxsIHBvc3NpYmxlIHdvcmsgd2FzIGRvbmUgZm9yIGNvbXBhdGliaWxpdHkuCisKKworQmFja2dyb3VuZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitXaGVuIGFkZGluZyBaSVA2NCBzdXBwb3J0IE1hdGhpYXMgU3ZlbnNzb24gZm91bmQgdGhhdCBFdmVuIFJvdWF1bHQgaGF2ZSBhZGRlZCBaSVA2NCAKK3N1cHBvcnQgZm9yIHVuemlwLmMgaW50byBtaW5pemlwIGZvciBhIG9wZW4gc291cmNlIHByb2plY3QgY2FsbGVkIGdkYWwgKCBodHRwOi8vd3d3LmdkYWwub3JnLyApCisKK1RoYXQgd2FzIHVzZWQgYXMgYSBzdGFydGluZyBwb2ludC4gQW5kIGFmdGVyIHRoYXQgWklQNjQgc3VwcG9ydCB3YXMgYWRkZWQgdG8gemlwLmMKK3NvbWUgcmVmYWN0b3JpbmcgYW5kIGNvZGUgY2xlYW51cCB3YXMgYWxzbyBkb25lLgorCisKK0NoYW5nZWQgZnJvbSBNaW5pWmlwIDEuMCB0byBNaW5pWmlwIDEuMQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqIEFkZGVkIFpJUDY0IHN1cHBvcnQgZm9yIHVuemlwICggYnkgRXZlbiBSb3VhdWx0ICkKKyogQWRkZWQgWklQNjQgc3VwcG9ydCBmb3IgemlwICggYnkgTWF0aGlhcyBTdmVuc3NvbiApCisqIFJldmVydGVkIHNvbWUgY2hhbmdlZCB0aGF0IEV2ZW4gUm91YXVsdCBkaWQuCisqIEJ1bmNoIG9mIHBhdGNoZXMgcmVjZWl2ZWQgZnJvbSBHdWxsZXMgVm9sbGFudCB0aGF0IGhlIHJlY2VpdmVkIGZvciBNaW5pWmlwIGZyb20gdmFyaW91cyB1c2Vycy4KKyogQWRkZWQgdW56aXAgcGF0Y2ggZm9yIEJaSVAgQ29tcHJlc3Npb24gbWV0aG9kIChwYXRjaCBjcmVhdGUgYnkgRGFuaWVsIEJvcmNhKQorKiBBZGRlZCBCWklQIENvbXByZXNzIG1ldGhvZCBmb3IgemlwCisqIERpZCBzb21lIHJlZmFjdG9yaW5nIGFuZCBjb2RlIGNsZWFudXAKKworCitDcmVkaXRzCisKKyBHaWxsZXMgVm9sbGFudCAgICAtIE9yaWdpbmFsIE1pbmlaaXAgYXV0aG9yCisgRXZlbiBSb3VhdWx0ICAgICAgLSBaSVA2NCB1bnppcCBTdXBwb3J0CisgRGFuaWVsIEJvcmNhICAgICAgLSBCWmlwIENvbXByZXNzaW9uIG1ldGhvZCBzdXBwb3J0IGluIHVuemlwCisgTWF0aGlhcyBTdmVuc3NvbiAgLSBaSVA2NCB6aXAgc3VwcG9ydAorIE1hdGhpYXMgU3ZlbnNzb24gIC0gQlppcCBDb21wcmVzc2lvbiBtZXRob2Qgc3VwcG9ydCBpbiB6aXAKKworIFJlc291cmNlcworCisgWmlwTGF5b3V0ICAgaHR0cDovL3Jlc3VsdDQyLmNvbS9wcm9qZWN0cy9aaXBGaWxlTGF5b3V0CisgICAgICAgICAgICAgQ29tbWFuZCBsaW5lIHRvb2wgZm9yIFdpbmRvd3MgdGhhdCBzaG93cyB0aGUgbGF5b3V0IGFuZCBpbmZvcm1hdGlvbiBvZiB0aGUgaGVhZGVycyBpbiBhIHppcCBhcmNoaXZlLgorICAgICAgICAgICAgIFVzZWQgd2hlbiBkZWJ1Z2dpbmcgYW5kIHZhbGlkYXRpbmcgdGhlIGNyZWF0aW9uIG9mIHppcCBmaWxlcyB1c2luZyBNaW5pWmlwNjQKKworCisgWklQIEFwcCBOb3RlICBodHRwOi8vd3d3LnBrd2FyZS5jb20vZG9jdW1lbnRzL2Nhc2VzdHVkaWVzL0FQUE5PVEUuVFhUCisgICAgICAgICAgICAgICBaaXAgRmlsZSBzcGVjaWZpY2F0aW9uCisKKworTm90ZXMuCisgKiBUbyBiZSBhYmxlIHRvIHVzZSBCWmlwIGNvbXByZXNzaW9uIG1ldGhvZCBpbiB6aXA2NC5jIG9yIHVuemlwNjQuYyB0aGUgQlpJUDIgbGliIGlzIG5lZWRlZCBhbmQgSEFWRV9CWklQMiBuZWVkIHRvIGJlIGRlZmluZWQuCisKK0xpY2Vuc2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIENvbmRpdGlvbiBvZiB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBhcmUgdGhlIHNhbWUgdGhhbiB6bGliIDoKKworICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisKKyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisgIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9taW5pemlwL2NvbmZpZ3VyZS5hYyBiL3psaWIvc3JjL2NvbnRyaWIvbWluaXppcC9jb25maWd1cmUuYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3YTRlMAotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvbWluaXppcC9jb25maWd1cmUuYWMKQEAgLTAsMCArMSwzMiBAQAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgorCitBQ19JTklUKFttaW5pemlwXSwgWzEuMi44XSwgW2J1Z3ppbGxhLnJlZGhhdC5jb21dKQorQUNfQ09ORklHX1NSQ0RJUihbbWluaXppcC5jXSkKK0FNX0lOSVRfQVVUT01BS0UoW2ZvcmVpZ25dKQorTFRfSU5JVAorCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgZXhhbXBsZSBwcm9ncmFtc10pCitBQ19BUkdfRU5BQkxFKFtkZW1vc10sIEFDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1kZW1vc10sIFtidWlsZCBleGFtcGxlIHByb2dyYW1zXSkpCitBTV9DT05ESVRJT05BTChbQ09ORF9ERU1PU10sIFt0ZXN0ICIkZW5hYmxlX2RlbW9zIiA9IHllc10pCitpZiB0ZXN0ICIkZW5hYmxlX2RlbW9zIiA9IHllcwordGhlbgorCUFDX01TR19SRVNVTFQoW3llc10pCitlbHNlCisJQUNfTVNHX1JFU1VMVChbbm9dKQorZmkKKworY2FzZSAiJHtob3N0fSIgaW4KKwkqLW1pbmd3KiB8IG1pbmd3KikKKwkJV0lOMzI9InllcyIKKwkJOzsKKwkqKQorCQk7OworZXNhYworQU1fQ09ORElUSU9OQUwoW1dJTjMyXSwgW3Rlc3QgIiR7V0lOMzJ9IiA9ICJ5ZXMiXSkKKworCitBQ19TVUJTVChbSEFWRV9VTklTVERfSF0sIFswXSkKK0FDX0NIRUNLX0hFQURFUihbdW5pc3RkLmhdLCBbSEFWRV9VTklTVERfSD0xXSwgW10pCitBQ19DT05GSUdfRklMRVMoW01ha2VmaWxlIG1pbml6aXAucGNdKQorQUNfT1VUUFVUCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL21pbml6aXAvY3J5cHQuaCBiL3psaWIvc3JjL2NvbnRyaWIvbWluaXppcC9jcnlwdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlOWU4MjAKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL21pbml6aXAvY3J5cHQuaApAQCAtMCwwICsxLDEzMSBAQAorLyogY3J5cHQuaCAtLSBiYXNlIGNvZGUgZm9yIGNyeXB0L3VuY3J5cHQgWklQZmlsZQorCisKKyAgIFZlcnNpb24gMS4wMWUsIEZlYnJ1YXJ5IDEydGgsIDIwMDUKKworICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDUgR2lsbGVzIFZvbGxhbnQKKworICAgVGhpcyBjb2RlIGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiBjcnlwdGluZyBjb2RlIGluIEluZm96aXAgZGlzdHJpYnV0aW9uCisKKyAgIFRoZSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gcGFydHMgb2YgdGhpcyBzb3VyY2UgY29kZSAoYXMgb3Bwb3NlZCB0byB0aGUKKyAgIG5vbi1lY2hvaW5nIHBhc3N3b3JkIHBhcnRzKSB3ZXJlIG9yaWdpbmFsbHkgd3JpdHRlbiBpbiBFdXJvcGUuICBUaGUKKyAgIHdob2xlIHNvdXJjZSBwYWNrYWdlIGNhbiBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQsIGluY2x1ZGluZyBmcm9tIHRoZSBVU0EuCisgICAoUHJpb3IgdG8gSmFudWFyeSAyMDAwLCByZS1leHBvcnQgZnJvbSB0aGUgVVMgd2FzIGEgdmlvbGF0aW9uIG9mIFVTIGxhdy4pCisKKyAgIFRoaXMgZW5jcnlwdGlvbiBjb2RlIGlzIGEgZGlyZWN0IHRyYW5zY3JpcHRpb24gb2YgdGhlIGFsZ29yaXRobSBmcm9tCisgICBSb2dlciBTY2hsYWZseSwgZGVzY3JpYmVkIGJ5IFBoaWwgS2F0eiBpbiB0aGUgZmlsZSBhcHBub3RlLnR4dC4gIFRoaXMKKyAgIGZpbGUgKGFwcG5vdGUudHh0KSBpcyBkaXN0cmlidXRlZCB3aXRoIHRoZSBQS1pJUCBwcm9ncmFtIChldmVuIGluIHRoZQorICAgdmVyc2lvbiB3aXRob3V0IGVuY3J5cHRpb24gY2FwYWJpbGl0aWVzKS4KKworICAgSWYgeW91IGRvbid0IG5lZWQgY3J5cHRpbmcgaW4geW91ciBhcHBsaWNhdGlvbiwganVzdCBkZWZpbmUgc3ltYm9scworICAgTk9DUllQVCBhbmQgTk9VTkNSWVBULgorCisgICBUaGlzIGNvZGUgc3VwcG9ydCB0aGUgIlRyYWRpdGlvbmFsIFBLV0FSRSBFbmNyeXB0aW9uIi4KKworICAgVGhlIG5ldyBBRVMgZW5jcnlwdGlvbiBhZGRlZCBvbiBaaXAgZm9ybWF0IGJ5IFdpbnppcCAoc2VlIHRoZSBwYWdlCisgICBodHRwOi8vd3d3LndpbnppcC5jb20vYWVzX2luZm8uaHRtICkgYW5kIFBLV2FyZSBQS1ppcCA1LnggU3Ryb25nCisgICBFbmNyeXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCisqLworCisjZGVmaW5lIENSQzMyKGMsIGIpICgoKihwY3JjXzMyX3RhYisoKChpbnQpKGMpIF4gKGIpKSAmIDB4ZmYpKSkgXiAoKGMpID4+IDgpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJldHVybiB0aGUgbmV4dCBieXRlIGluIHRoZSBwc2V1ZG8tcmFuZG9tIHNlcXVlbmNlCisgKi8KK3N0YXRpYyBpbnQgZGVjcnlwdF9ieXRlKHVuc2lnbmVkIGxvbmcqIHBrZXlzLCBjb25zdCB6X2NyY190KiBwY3JjXzMyX3RhYikKK3sKKyAgICB1bnNpZ25lZCB0ZW1wOyAgLyogUE9URU5USUFMIEJVRzogIHRlbXAqKHRlbXBeMSkgbWF5IG92ZXJmbG93IGluIGFuCisgICAgICAgICAgICAgICAgICAgICAqIHVucHJlZGljdGFibGUgbWFubmVyIG9uIDE2LWJpdCBzeXN0ZW1zOyBub3QgYSBwcm9ibGVtCisgICAgICAgICAgICAgICAgICAgICAqIHdpdGggYW55IGtub3duIGNvbXBpbGVyIHNvIGZhciwgdGhvdWdoICovCisKKyAgICB0ZW1wID0gKCh1bnNpZ25lZCkoKihwa2V5cysyKSkgJiAweGZmZmYpIHwgMjsKKyAgICByZXR1cm4gKGludCkoKCh0ZW1wICogKHRlbXAgXiAxKSkgPj4gOCkgJiAweGZmKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBVcGRhdGUgdGhlIGVuY3J5cHRpb24ga2V5cyB3aXRoIHRoZSBuZXh0IGJ5dGUgb2YgcGxhaW4gdGV4dAorICovCitzdGF0aWMgaW50IHVwZGF0ZV9rZXlzKHVuc2lnbmVkIGxvbmcqIHBrZXlzLGNvbnN0IHpfY3JjX3QqIHBjcmNfMzJfdGFiLGludCBjKQoreworICAgICgqKHBrZXlzKzApKSA9IENSQzMyKCgqKHBrZXlzKzApKSwgYyk7CisgICAgKCoocGtleXMrMSkpICs9ICgqKHBrZXlzKzApKSAmIDB4ZmY7CisgICAgKCoocGtleXMrMSkpID0gKCoocGtleXMrMSkpICogMTM0Nzc1ODEzTCArIDE7CisgICAgeworICAgICAgcmVnaXN0ZXIgaW50IGtleXNoaWZ0ID0gKGludCkoKCoocGtleXMrMSkpID4+IDI0KTsKKyAgICAgICgqKHBrZXlzKzIpKSA9IENSQzMyKCgqKHBrZXlzKzIpKSwga2V5c2hpZnQpOworICAgIH0KKyAgICByZXR1cm4gYzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEluaXRpYWxpemUgdGhlIGVuY3J5cHRpb24ga2V5cyBhbmQgdGhlIHJhbmRvbSBoZWFkZXIgYWNjb3JkaW5nIHRvCisgKiB0aGUgZ2l2ZW4gcGFzc3dvcmQuCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfa2V5cyhjb25zdCBjaGFyKiBwYXNzd2QsdW5zaWduZWQgbG9uZyogcGtleXMsY29uc3Qgel9jcmNfdCogcGNyY18zMl90YWIpCit7CisgICAgKihwa2V5cyswKSA9IDMwNTQxOTg5Nkw7CisgICAgKihwa2V5cysxKSA9IDU5MTc1MTA0OUw7CisgICAgKihwa2V5cysyKSA9IDg3ODA4MjE5Mkw7CisgICAgd2hpbGUgKCpwYXNzd2QgIT0gJ1wwJykgeworICAgICAgICB1cGRhdGVfa2V5cyhwa2V5cyxwY3JjXzMyX3RhYiwoaW50KSpwYXNzd2QpOworICAgICAgICBwYXNzd2QrKzsKKyAgICB9Cit9CisKKyNkZWZpbmUgemRlY29kZShwa2V5cyxwY3JjXzMyX3RhYixjKSBcCisgICAgKHVwZGF0ZV9rZXlzKHBrZXlzLHBjcmNfMzJfdGFiLGMgXj0gZGVjcnlwdF9ieXRlKHBrZXlzLHBjcmNfMzJfdGFiKSkpCisKKyNkZWZpbmUgemVuY29kZShwa2V5cyxwY3JjXzMyX3RhYixjLHQpIFwKKyAgICAodD1kZWNyeXB0X2J5dGUocGtleXMscGNyY18zMl90YWIpLCB1cGRhdGVfa2V5cyhwa2V5cyxwY3JjXzMyX3RhYixjKSwgdF4oYykpCisKKyNpZmRlZiBJTkNMVURFQ1JZUFRJTkdDT0RFX0lGQ1JZUFRBTExPV0VECisKKyNkZWZpbmUgUkFORF9IRUFEX0xFTiAgMTIKKyAgIC8qICJsYXN0IHJlc29ydCIgc291cmNlIGZvciBzZWNvbmQgcGFydCBvZiBjcnlwdCBzZWVkIHBhdHRlcm4gKi8KKyMgIGlmbmRlZiBaQ1JfU0VFRDIKKyMgICAgZGVmaW5lIFpDUl9TRUVEMiAzMTQxNTkyNjU0VUwgICAgIC8qIHVzZSBQSSBhcyBkZWZhdWx0IHBhdHRlcm4gKi8KKyMgIGVuZGlmCisKK3N0YXRpYyBpbnQgY3J5cHRoZWFkKGNvbnN0IGNoYXIqIHBhc3N3ZCwgICAgICAvKiBwYXNzd29yZCBzdHJpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIGJ1ZiwgICAgICAvKiB3aGVyZSB0byB3cml0ZSBoZWFkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgIGludCBidWZTaXplLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyogcGtleXMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB6X2NyY190KiBwY3JjXzMyX3RhYiwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgY3JjRm9yQ3J5cHRpbmcpCit7CisgICAgaW50IG47ICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbiByYW5kb20gaGVhZGVyICovCisgICAgaW50IHQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3JhcnkgKi8KKyAgICBpbnQgYzsgICAgICAgICAgICAgICAgICAgICAgIC8qIHJhbmRvbSBieXRlICovCisgICAgdW5zaWduZWQgY2hhciBoZWFkZXJbUkFORF9IRUFEX0xFTi0yXTsgLyogcmFuZG9tIGhlYWRlciAqLworICAgIHN0YXRpYyB1bnNpZ25lZCBjYWxscyA9IDA7ICAgLyogZW5zdXJlIGRpZmZlcmVudCByYW5kb20gaGVhZGVyIGVhY2ggdGltZSAqLworCisgICAgaWYgKGJ1ZlNpemU8UkFORF9IRUFEX0xFTikKKyAgICAgIHJldHVybiAwOworCisgICAgLyogRmlyc3QgZ2VuZXJhdGUgUkFORF9IRUFEX0xFTi0yIHJhbmRvbSBieXRlcy4gV2UgZW5jcnlwdCB0aGUKKyAgICAgKiBvdXRwdXQgb2YgcmFuZCgpIHRvIGdldCBsZXNzIHByZWRpY3RhYmlsaXR5LCBzaW5jZSByYW5kKCkgaXMKKyAgICAgKiBvZnRlbiBwb29ybHkgaW1wbGVtZW50ZWQuCisgICAgICovCisgICAgaWYgKCsrY2FsbHMgPT0gMSkKKyAgICB7CisgICAgICAgIHNyYW5kKCh1bnNpZ25lZCkodGltZShOVUxMKSBeIFpDUl9TRUVEMikpOworICAgIH0KKyAgICBpbml0X2tleXMocGFzc3dkLCBwa2V5cywgcGNyY18zMl90YWIpOworICAgIGZvciAobiA9IDA7IG4gPCBSQU5EX0hFQURfTEVOLTI7IG4rKykKKyAgICB7CisgICAgICAgIGMgPSAocmFuZCgpID4+IDcpICYgMHhmZjsKKyAgICAgICAgaGVhZGVyW25dID0gKHVuc2lnbmVkIGNoYXIpemVuY29kZShwa2V5cywgcGNyY18zMl90YWIsIGMsIHQpOworICAgIH0KKyAgICAvKiBFbmNyeXB0IHJhbmRvbSBoZWFkZXIgKGxhc3QgdHdvIGJ5dGVzIGlzIGhpZ2ggd29yZCBvZiBjcmMpICovCisgICAgaW5pdF9rZXlzKHBhc3N3ZCwgcGtleXMsIHBjcmNfMzJfdGFiKTsKKyAgICBmb3IgKG4gPSAwOyBuIDwgUkFORF9IRUFEX0xFTi0yOyBuKyspCisgICAgeworICAgICAgICBidWZbbl0gPSAodW5zaWduZWQgY2hhcil6ZW5jb2RlKHBrZXlzLCBwY3JjXzMyX3RhYiwgaGVhZGVyW25dLCB0KTsKKyAgICB9CisgICAgYnVmW24rK10gPSAodW5zaWduZWQgY2hhcil6ZW5jb2RlKHBrZXlzLCBwY3JjXzMyX3RhYiwgKGludCkoY3JjRm9yQ3J5cHRpbmcgPj4gMTYpICYgMHhmZiwgdCk7CisgICAgYnVmW24rK10gPSAodW5zaWduZWQgY2hhcil6ZW5jb2RlKHBrZXlzLCBwY3JjXzMyX3RhYiwgKGludCkoY3JjRm9yQ3J5cHRpbmcgPj4gMjQpICYgMHhmZiwgdCk7CisgICAgcmV0dXJuIG47Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9taW5pemlwL2lvYXBpLmMgYi96bGliL3NyYy9jb250cmliL21pbml6aXAvaW9hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjVjMTkxCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9taW5pemlwL2lvYXBpLmMKQEAgLTAsMCArMSwyNDcgQEAKKy8qIGlvYXBpLmggLS0gSU8gYmFzZSBmdW5jdGlvbiBoZWFkZXIgZm9yIGNvbXByZXNzL3VuY29tcHJlc3MgLnppcAorICAgcGFydCBvZiB0aGUgTWluaVppcCBwcm9qZWN0IC0gKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCisKKyAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDEwIEdpbGxlcyBWb2xsYW50IChtaW5pemlwKSAoIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvbWluaXppcC5odG1sICkKKworICAgICAgICAgTW9kaWZpY2F0aW9ucyBmb3IgWmlwNjQgc3VwcG9ydAorICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTWF0aGlhcyBTdmVuc3NvbiAoIGh0dHA6Ly9yZXN1bHQ0Mi5jb20gKQorCisgICAgICAgICBGb3IgbW9yZSBpbmZvIHJlYWQgTWluaVppcF9pbmZvLnR4dAorCisqLworCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICghKGRlZmluZWQoX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MpKSkKKyAgICAgICAgI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChJT0FQSV9OT182NCkKKy8vIEluIGRhcndpbiBhbmQgcGVyaGFwcyBvdGhlciBCU0QgdmFyaWFudHMgb2ZmX3QgaXMgYSA2NCBiaXQgdmFsdWUsIGhlbmNlIG5vIG5lZWQgZm9yIHNwZWNpZmljIDY0IGJpdCBmdW5jdGlvbnMKKyNkZWZpbmUgRk9QRU5fRlVOQyhmaWxlbmFtZSwgbW9kZSkgZm9wZW4oZmlsZW5hbWUsIG1vZGUpCisjZGVmaW5lIEZURUxMT19GVU5DKHN0cmVhbSkgZnRlbGxvKHN0cmVhbSkKKyNkZWZpbmUgRlNFRUtPX0ZVTkMoc3RyZWFtLCBvZmZzZXQsIG9yaWdpbikgZnNlZWtvKHN0cmVhbSwgb2Zmc2V0LCBvcmlnaW4pCisjZWxzZQorI2RlZmluZSBGT1BFTl9GVU5DKGZpbGVuYW1lLCBtb2RlKSBmb3BlbjY0KGZpbGVuYW1lLCBtb2RlKQorI2RlZmluZSBGVEVMTE9fRlVOQyhzdHJlYW0pIGZ0ZWxsbzY0KHN0cmVhbSkKKyNkZWZpbmUgRlNFRUtPX0ZVTkMoc3RyZWFtLCBvZmZzZXQsIG9yaWdpbikgZnNlZWtvNjQoc3RyZWFtLCBvZmZzZXQsIG9yaWdpbikKKyNlbmRpZgorCisKKyNpbmNsdWRlICJpb2FwaS5oIgorCit2b2lkcGYgY2FsbF96b3BlbjY0IChjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwZmlsZWZ1bmMsY29uc3Qgdm9pZCpmaWxlbmFtZSxpbnQgbW9kZSkKK3sKKyAgICBpZiAocGZpbGVmdW5jLT56ZmlsZV9mdW5jNjQuem9wZW42NF9maWxlICE9IE5VTEwpCisgICAgICAgIHJldHVybiAoKihwZmlsZWZ1bmMtPnpmaWxlX2Z1bmM2NC56b3BlbjY0X2ZpbGUpKSAocGZpbGVmdW5jLT56ZmlsZV9mdW5jNjQub3BhcXVlLGZpbGVuYW1lLG1vZGUpOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAoKihwZmlsZWZ1bmMtPnpvcGVuMzJfZmlsZSkpKHBmaWxlZnVuYy0+emZpbGVfZnVuYzY0Lm9wYXF1ZSwoY29uc3QgY2hhciopZmlsZW5hbWUsbW9kZSk7CisgICAgfQorfQorCitsb25nIGNhbGxfenNlZWs2NCAoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcGZpbGVmdW5jLHZvaWRwZiBmaWxlc3RyZWFtLCBaUE9TNjRfVCBvZmZzZXQsIGludCBvcmlnaW4pCit7CisgICAgaWYgKHBmaWxlZnVuYy0+emZpbGVfZnVuYzY0LnpzZWVrNjRfZmlsZSAhPSBOVUxMKQorICAgICAgICByZXR1cm4gKCoocGZpbGVmdW5jLT56ZmlsZV9mdW5jNjQuenNlZWs2NF9maWxlKSkgKHBmaWxlZnVuYy0+emZpbGVfZnVuYzY0Lm9wYXF1ZSxmaWxlc3RyZWFtLG9mZnNldCxvcmlnaW4pOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVMb25nIG9mZnNldFRydW5jYXRlZCA9ICh1TG9uZylvZmZzZXQ7CisgICAgICAgIGlmIChvZmZzZXRUcnVuY2F0ZWQgIT0gb2Zmc2V0KQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKCoocGZpbGVmdW5jLT56c2VlazMyX2ZpbGUpKShwZmlsZWZ1bmMtPnpmaWxlX2Z1bmM2NC5vcGFxdWUsZmlsZXN0cmVhbSxvZmZzZXRUcnVuY2F0ZWQsb3JpZ2luKTsKKyAgICB9Cit9CisKK1pQT1M2NF9UIGNhbGxfenRlbGw2NCAoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcGZpbGVmdW5jLHZvaWRwZiBmaWxlc3RyZWFtKQoreworICAgIGlmIChwZmlsZWZ1bmMtPnpmaWxlX2Z1bmM2NC56c2VlazY0X2ZpbGUgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuICgqKHBmaWxlZnVuYy0+emZpbGVfZnVuYzY0Lnp0ZWxsNjRfZmlsZSkpIChwZmlsZWZ1bmMtPnpmaWxlX2Z1bmM2NC5vcGFxdWUsZmlsZXN0cmVhbSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdUxvbmcgdGVsbF91TG9uZyA9ICgqKHBmaWxlZnVuYy0+enRlbGwzMl9maWxlKSkocGZpbGVmdW5jLT56ZmlsZV9mdW5jNjQub3BhcXVlLGZpbGVzdHJlYW0pOworICAgICAgICBpZiAoKHRlbGxfdUxvbmcpID09IE1BWFUzMikKKyAgICAgICAgICAgIHJldHVybiAoWlBPUzY0X1QpLTE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiB0ZWxsX3VMb25nOworICAgIH0KK30KKwordm9pZCBmaWxsX3psaWJfZmlsZWZ1bmM2NF8zMl9kZWZfZnJvbV9maWxlZnVuYzMyKHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHBfZmlsZWZ1bmM2NF8zMixjb25zdCB6bGliX2ZpbGVmdW5jX2RlZiogcF9maWxlZnVuYzMyKQoreworICAgIHBfZmlsZWZ1bmM2NF8zMi0+emZpbGVfZnVuYzY0LnpvcGVuNjRfZmlsZSA9IE5VTEw7CisgICAgcF9maWxlZnVuYzY0XzMyLT56b3BlbjMyX2ZpbGUgPSBwX2ZpbGVmdW5jMzItPnpvcGVuX2ZpbGU7CisgICAgcF9maWxlZnVuYzY0XzMyLT56ZmlsZV9mdW5jNjQuemVycm9yX2ZpbGUgPSBwX2ZpbGVmdW5jMzItPnplcnJvcl9maWxlOworICAgIHBfZmlsZWZ1bmM2NF8zMi0+emZpbGVfZnVuYzY0LnpyZWFkX2ZpbGUgPSBwX2ZpbGVmdW5jMzItPnpyZWFkX2ZpbGU7CisgICAgcF9maWxlZnVuYzY0XzMyLT56ZmlsZV9mdW5jNjQuendyaXRlX2ZpbGUgPSBwX2ZpbGVmdW5jMzItPnp3cml0ZV9maWxlOworICAgIHBfZmlsZWZ1bmM2NF8zMi0+emZpbGVfZnVuYzY0Lnp0ZWxsNjRfZmlsZSA9IE5VTEw7CisgICAgcF9maWxlZnVuYzY0XzMyLT56ZmlsZV9mdW5jNjQuenNlZWs2NF9maWxlID0gTlVMTDsKKyAgICBwX2ZpbGVmdW5jNjRfMzItPnpmaWxlX2Z1bmM2NC56Y2xvc2VfZmlsZSA9IHBfZmlsZWZ1bmMzMi0+emNsb3NlX2ZpbGU7CisgICAgcF9maWxlZnVuYzY0XzMyLT56ZmlsZV9mdW5jNjQuemVycm9yX2ZpbGUgPSBwX2ZpbGVmdW5jMzItPnplcnJvcl9maWxlOworICAgIHBfZmlsZWZ1bmM2NF8zMi0+emZpbGVfZnVuYzY0Lm9wYXF1ZSA9IHBfZmlsZWZ1bmMzMi0+b3BhcXVlOworICAgIHBfZmlsZWZ1bmM2NF8zMi0+enNlZWszMl9maWxlID0gcF9maWxlZnVuYzMyLT56c2Vla19maWxlOworICAgIHBfZmlsZWZ1bmM2NF8zMi0+enRlbGwzMl9maWxlID0gcF9maWxlZnVuYzMyLT56dGVsbF9maWxlOworfQorCisKKworc3RhdGljIHZvaWRwZiAgWkNBTExCQUNLIGZvcGVuX2ZpbGVfZnVuYyBPRigodm9pZHBmIG9wYXF1ZSwgY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBtb2RlKSk7CitzdGF0aWMgdUxvbmcgICBaQ0FMTEJBQ0sgZnJlYWRfZmlsZV9mdW5jIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCB2b2lkKiBidWYsIHVMb25nIHNpemUpKTsKK3N0YXRpYyB1TG9uZyAgIFpDQUxMQkFDSyBmd3JpdGVfZmlsZV9mdW5jIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCBjb25zdCB2b2lkKiBidWYsdUxvbmcgc2l6ZSkpOworc3RhdGljIFpQT1M2NF9UIFpDQUxMQkFDSyBmdGVsbDY0X2ZpbGVfZnVuYyBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkpOworc3RhdGljIGxvbmcgICAgWkNBTExCQUNLIGZzZWVrNjRfZmlsZV9mdW5jIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCBaUE9TNjRfVCBvZmZzZXQsIGludCBvcmlnaW4pKTsKK3N0YXRpYyBpbnQgICAgIFpDQUxMQkFDSyBmY2xvc2VfZmlsZV9mdW5jIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtKSk7CitzdGF0aWMgaW50ICAgICBaQ0FMTEJBQ0sgZmVycm9yX2ZpbGVfZnVuYyBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkpOworCitzdGF0aWMgdm9pZHBmIFpDQUxMQkFDSyBmb3Blbl9maWxlX2Z1bmMgKHZvaWRwZiBvcGFxdWUsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBpbnQgbW9kZSkKK3sKKyAgICBGSUxFKiBmaWxlID0gTlVMTDsKKyAgICBjb25zdCBjaGFyKiBtb2RlX2ZvcGVuID0gTlVMTDsKKyAgICBpZiAoKG1vZGUgJiBaTElCX0ZJTEVGVU5DX01PREVfUkVBRFdSSVRFRklMVEVSKT09WkxJQl9GSUxFRlVOQ19NT0RFX1JFQUQpCisgICAgICAgIG1vZGVfZm9wZW4gPSAicmIiOworICAgIGVsc2UKKyAgICBpZiAobW9kZSAmIFpMSUJfRklMRUZVTkNfTU9ERV9FWElTVElORykKKyAgICAgICAgbW9kZV9mb3BlbiA9ICJyK2IiOworICAgIGVsc2UKKyAgICBpZiAobW9kZSAmIFpMSUJfRklMRUZVTkNfTU9ERV9DUkVBVEUpCisgICAgICAgIG1vZGVfZm9wZW4gPSAid2IiOworCisgICAgaWYgKChmaWxlbmFtZSE9TlVMTCkgJiYgKG1vZGVfZm9wZW4gIT0gTlVMTCkpCisgICAgICAgIGZpbGUgPSBmb3BlbihmaWxlbmFtZSwgbW9kZV9mb3Blbik7CisgICAgcmV0dXJuIGZpbGU7Cit9CisKK3N0YXRpYyB2b2lkcGYgWkNBTExCQUNLIGZvcGVuNjRfZmlsZV9mdW5jICh2b2lkcGYgb3BhcXVlLCBjb25zdCB2b2lkKiBmaWxlbmFtZSwgaW50IG1vZGUpCit7CisgICAgRklMRSogZmlsZSA9IE5VTEw7CisgICAgY29uc3QgY2hhciogbW9kZV9mb3BlbiA9IE5VTEw7CisgICAgaWYgKChtb2RlICYgWkxJQl9GSUxFRlVOQ19NT0RFX1JFQURXUklURUZJTFRFUik9PVpMSUJfRklMRUZVTkNfTU9ERV9SRUFEKQorICAgICAgICBtb2RlX2ZvcGVuID0gInJiIjsKKyAgICBlbHNlCisgICAgaWYgKG1vZGUgJiBaTElCX0ZJTEVGVU5DX01PREVfRVhJU1RJTkcpCisgICAgICAgIG1vZGVfZm9wZW4gPSAicitiIjsKKyAgICBlbHNlCisgICAgaWYgKG1vZGUgJiBaTElCX0ZJTEVGVU5DX01PREVfQ1JFQVRFKQorICAgICAgICBtb2RlX2ZvcGVuID0gIndiIjsKKworICAgIGlmICgoZmlsZW5hbWUhPU5VTEwpICYmIChtb2RlX2ZvcGVuICE9IE5VTEwpKQorICAgICAgICBmaWxlID0gRk9QRU5fRlVOQygoY29uc3QgY2hhciopZmlsZW5hbWUsIG1vZGVfZm9wZW4pOworICAgIHJldHVybiBmaWxlOworfQorCisKK3N0YXRpYyB1TG9uZyBaQ0FMTEJBQ0sgZnJlYWRfZmlsZV9mdW5jICh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCB2b2lkKiBidWYsIHVMb25nIHNpemUpCit7CisgICAgdUxvbmcgcmV0OworICAgIHJldCA9ICh1TG9uZylmcmVhZChidWYsIDEsIChzaXplX3Qpc2l6ZSwgKEZJTEUgKilzdHJlYW0pOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1TG9uZyBaQ0FMTEJBQ0sgZndyaXRlX2ZpbGVfZnVuYyAodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSwgY29uc3Qgdm9pZCogYnVmLCB1TG9uZyBzaXplKQoreworICAgIHVMb25nIHJldDsKKyAgICByZXQgPSAodUxvbmcpZndyaXRlKGJ1ZiwgMSwgKHNpemVfdClzaXplLCAoRklMRSAqKXN0cmVhbSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGxvbmcgWkNBTExCQUNLIGZ0ZWxsX2ZpbGVfZnVuYyAodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkKK3sKKyAgICBsb25nIHJldDsKKyAgICByZXQgPSBmdGVsbCgoRklMRSAqKXN0cmVhbSk7CisgICAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgWlBPUzY0X1QgWkNBTExCQUNLIGZ0ZWxsNjRfZmlsZV9mdW5jICh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtKQoreworICAgIFpQT1M2NF9UIHJldDsKKyAgICByZXQgPSBGVEVMTE9fRlVOQygoRklMRSAqKXN0cmVhbSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGxvbmcgWkNBTExCQUNLIGZzZWVrX2ZpbGVfZnVuYyAodm9pZHBmICBvcGFxdWUsIHZvaWRwZiBzdHJlYW0sIHVMb25nIG9mZnNldCwgaW50IG9yaWdpbikKK3sKKyAgICBpbnQgZnNlZWtfb3JpZ2luPTA7CisgICAgbG9uZyByZXQ7CisgICAgc3dpdGNoIChvcmlnaW4pCisgICAgeworICAgIGNhc2UgWkxJQl9GSUxFRlVOQ19TRUVLX0NVUiA6CisgICAgICAgIGZzZWVrX29yaWdpbiA9IFNFRUtfQ1VSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19FTkQgOgorICAgICAgICBmc2Vla19vcmlnaW4gPSBTRUVLX0VORDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBaTElCX0ZJTEVGVU5DX1NFRUtfU0VUIDoKKyAgICAgICAgZnNlZWtfb3JpZ2luID0gU0VFS19TRVQ7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0ID0gMDsKKyAgICBpZiAoZnNlZWsoKEZJTEUgKilzdHJlYW0sIG9mZnNldCwgZnNlZWtfb3JpZ2luKSAhPSAwKQorICAgICAgICByZXQgPSAtMTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgbG9uZyBaQ0FMTEJBQ0sgZnNlZWs2NF9maWxlX2Z1bmMgKHZvaWRwZiAgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCBaUE9TNjRfVCBvZmZzZXQsIGludCBvcmlnaW4pCit7CisgICAgaW50IGZzZWVrX29yaWdpbj0wOworICAgIGxvbmcgcmV0OworICAgIHN3aXRjaCAob3JpZ2luKQorICAgIHsKKyAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19DVVIgOgorICAgICAgICBmc2Vla19vcmlnaW4gPSBTRUVLX0NVUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBaTElCX0ZJTEVGVU5DX1NFRUtfRU5EIDoKKyAgICAgICAgZnNlZWtfb3JpZ2luID0gU0VFS19FTkQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCA6CisgICAgICAgIGZzZWVrX29yaWdpbiA9IFNFRUtfU0VUOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiByZXR1cm4gLTE7CisgICAgfQorICAgIHJldCA9IDA7CisKKyAgICBpZihGU0VFS09fRlVOQygoRklMRSAqKXN0cmVhbSwgb2Zmc2V0LCBmc2Vla19vcmlnaW4pICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAtMTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBaQ0FMTEJBQ0sgZmNsb3NlX2ZpbGVfZnVuYyAodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkKK3sKKyAgICBpbnQgcmV0OworICAgIHJldCA9IGZjbG9zZSgoRklMRSAqKXN0cmVhbSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBaQ0FMTEJBQ0sgZmVycm9yX2ZpbGVfZnVuYyAodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkKK3sKKyAgICBpbnQgcmV0OworICAgIHJldCA9IGZlcnJvcigoRklMRSAqKXN0cmVhbSk7CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBmaWxsX2ZvcGVuX2ZpbGVmdW5jIChwemxpYl9maWxlZnVuY19kZWYpCisgIHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWY7Cit7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56b3Blbl9maWxlID0gZm9wZW5fZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+enJlYWRfZmlsZSA9IGZyZWFkX2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnp3cml0ZV9maWxlID0gZndyaXRlX2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnp0ZWxsX2ZpbGUgPSBmdGVsbF9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56c2Vla19maWxlID0gZnNlZWtfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+emNsb3NlX2ZpbGUgPSBmY2xvc2VfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+emVycm9yX2ZpbGUgPSBmZXJyb3JfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+b3BhcXVlID0gTlVMTDsKK30KKwordm9pZCBmaWxsX2ZvcGVuNjRfZmlsZWZ1bmMgKHpsaWJfZmlsZWZ1bmM2NF9kZWYqICBwemxpYl9maWxlZnVuY19kZWYpCit7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56b3BlbjY0X2ZpbGUgPSBmb3BlbjY0X2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnpyZWFkX2ZpbGUgPSBmcmVhZF9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56d3JpdGVfZmlsZSA9IGZ3cml0ZV9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56dGVsbDY0X2ZpbGUgPSBmdGVsbDY0X2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnpzZWVrNjRfZmlsZSA9IGZzZWVrNjRfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+emNsb3NlX2ZpbGUgPSBmY2xvc2VfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+emVycm9yX2ZpbGUgPSBmZXJyb3JfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+b3BhcXVlID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvbWluaXppcC9pb2FwaS5oIGIvemxpYi9zcmMvY29udHJpYi9taW5pemlwL2lvYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRjYmRiMAotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvbWluaXppcC9pb2FwaS5oCkBAIC0wLDAgKzEsMjA4IEBACisvKiBpb2FwaS5oIC0tIElPIGJhc2UgZnVuY3Rpb24gaGVhZGVyIGZvciBjb21wcmVzcy91bmNvbXByZXNzIC56aXAKKyAgIHBhcnQgb2YgdGhlIE1pbmlaaXAgcHJvamVjdCAtICggaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC9taW5pemlwLmh0bWwgKQorCisgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAxMCBHaWxsZXMgVm9sbGFudCAobWluaXppcCkgKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCisKKyAgICAgICAgIE1vZGlmaWNhdGlvbnMgZm9yIFppcDY0IHN1cHBvcnQKKyAgICAgICAgIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1hdGhpYXMgU3ZlbnNzb24gKCBodHRwOi8vcmVzdWx0NDIuY29tICkKKworICAgICAgICAgRm9yIG1vcmUgaW5mbyByZWFkIE1pbmlaaXBfaW5mby50eHQKKworICAgICAgICAgQ2hhbmdlcworCisgICAgT2N0LTIwMDkgLSBEZWZpbmVkIFpQT1M2NF9UIHRvIGZwb3NfdCBvbiB3aW5kb3dzIGFuZCB1X2ludDY0X3Qgb24gbGludXguIChtaWdodCBuZWVkIHRvIGZpbmQgYSBiZXR0ZXIgd2h5IGZvciB0aGlzKQorICAgIE9jdC0yMDA5IC0gQ2hhbmdlIHRvIGZzZWVrbzY0LCBmdGVsbG82NCBhbmQgZm9wZW42NCBzbyBsYXJnZSBmaWxlcyB3b3VsZCB3b3JrIG9uIGxpbnV4LgorICAgICAgICAgICAgICAgTW9yZSBpZi9kZWYgc2VjdGlvbiBtYXkgYmUgbmVlZGVkIHRvIHN1cHBvcnQgb3RoZXIgcGxhdGZvcm1zCisgICAgT2N0LTIwMDkgLSBEZWZpbmVkIGZ4eHh4NjQgY2FsbHMgdG8gbm9ybWFsIGZvcGVuL2Z0ZWxsL2ZzZWVrIHNvIHRoZXkgd291bGQgY29tcGlsZSBvbiB3aW5kb3dzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAoYnV0IHlvdSBzaG91bGQgdXNlIGlvd2luMzIuYyBmb3Igd2luZG93cyBpbnN0ZWFkKQorCisqLworCisjaWZuZGVmIF9aTElCSU9BUEk2NF9ICisjZGVmaW5lIF9aTElCSU9BUEk2NF9ICisKKyNpZiAoIWRlZmluZWQoX1dJTjMyKSkgJiYgKCFkZWZpbmVkKFdJTjMyKSkgJiYgKCFkZWZpbmVkKF9fQVBQTEVfXykpCisKKyAgLy8gTGludXggbmVlZHMgdGhpcyB0byBzdXBwb3J0IGZpbGUgb3BlcmF0aW9uIG9uIGZpbGVzIGxhcmdlciB0aGVuIDQrR0IKKyAgLy8gQnV0IG1pZ2h0IG5lZWQgYmV0dGVyIGlmL2RlZiB0byBzZWxlY3QganVzdCB0aGUgcGxhdGZvcm1zIHRoYXQgbmVlZHMgdGhlbS4KKworICAgICAgICAjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyAgICAgICAgICAgICAgICAjZGVmaW5lIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyAgICAgICAgI2VuZGlmCisgICAgICAgICNpZm5kZWYgX19VU0VfTEFSR0VGSUxFNjQKKyAgICAgICAgICAgICAgICAjZGVmaW5lIF9fVVNFX0xBUkdFRklMRTY0CisgICAgICAgICNlbmRpZgorICAgICAgICAjaWZuZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UKKyAgICAgICAgICAgICAgICAjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UKKyAgICAgICAgI2VuZGlmCisgICAgICAgICNpZm5kZWYgX0ZJTEVfT0ZGU0VUX0JJVAorICAgICAgICAgICAgICAgICNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVCA2NAorICAgICAgICAjZW5kaWYKKworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInpsaWIuaCIKKworI2lmIGRlZmluZWQoVVNFX0ZJTEUzMkFQSSkKKyNkZWZpbmUgZm9wZW42NCBmb3BlbgorI2RlZmluZSBmdGVsbG82NCBmdGVsbAorI2RlZmluZSBmc2Vla282NCBmc2VlaworI2Vsc2UKKyNpZmRlZiBfX0ZyZWVCU0RfXworI2RlZmluZSBmb3BlbjY0IGZvcGVuCisjZGVmaW5lIGZ0ZWxsbzY0IGZ0ZWxsbworI2RlZmluZSBmc2Vla282NCBmc2Vla28KKyNlbmRpZgorI2lmZGVmIF9NU0NfVkVSCisgI2RlZmluZSBmb3BlbjY0IGZvcGVuCisgI2lmIChfTVNDX1ZFUiA+PSAxNDAwKSAmJiAoIShkZWZpbmVkKE5PX01TQ1ZFUl9GSUxFNjRfRlVOQykpKQorICAjZGVmaW5lIGZ0ZWxsbzY0IF9mdGVsbGk2NAorICAjZGVmaW5lIGZzZWVrbzY0IF9mc2Vla2k2NAorICNlbHNlIC8vIG9sZCBNU0MKKyAgI2RlZmluZSBmdGVsbG82NCBmdGVsbAorICAjZGVmaW5lIGZzZWVrbzY0IGZzZWVrCisgI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvKgorI2lmbmRlZiBaUE9TNjRfVAorICAjaWZkZWYgX1dJTjMyCisgICAgICAgICAgICAgICAgI2RlZmluZSBaUE9TNjRfVCBmcG9zX3QKKyAgI2Vsc2UKKyAgICAjaW5jbHVkZSA8c3RkaW50Lmg+CisgICAgI2RlZmluZSBaUE9TNjRfVCB1aW50NjRfdAorICAjZW5kaWYKKyNlbmRpZgorKi8KKworI2lmZGVmIEhBVkVfTUlOSVpJUDY0X0NPTkZfSAorI2luY2x1ZGUgIm16NjRjb25mLmgiCisjZW5kaWYKKworLyogYSB0eXBlIGNob29zZW4gYnkgREVGSU5FICovCisjaWZkZWYgSEFWRV82NEJJVF9JTlRfQ1VTVE9NCit0eXBlZGVmICA2NEJJVF9JTlRfQ1VTVE9NX1RZUEUgWlBPUzY0X1Q7CisjZWxzZQorI2lmZGVmIEhBU19TVERJTlRfSAorI2luY2x1ZGUgInN0ZGludC5oIgordHlwZWRlZiB1aW50NjRfdCBaUE9TNjRfVDsKKyNlbHNlCisKKy8qIE1heGltdW0gdW5zaWduZWQgMzItYml0IHZhbHVlIHVzZWQgYXMgcGxhY2Vob2xkZXIgZm9yIHppcDY0ICovCisjZGVmaW5lIE1BWFUzMiAweGZmZmZmZmZmCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBaUE9TNjRfVDsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgWlBPUzY0X1Q7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworI2RlZmluZSBaTElCX0ZJTEVGVU5DX1NFRUtfQ1VSICgxKQorI2RlZmluZSBaTElCX0ZJTEVGVU5DX1NFRUtfRU5EICgyKQorI2RlZmluZSBaTElCX0ZJTEVGVU5DX1NFRUtfU0VUICgwKQorCisjZGVmaW5lIFpMSUJfRklMRUZVTkNfTU9ERV9SRUFEICAgICAgKDEpCisjZGVmaW5lIFpMSUJfRklMRUZVTkNfTU9ERV9XUklURSAgICAgKDIpCisjZGVmaW5lIFpMSUJfRklMRUZVTkNfTU9ERV9SRUFEV1JJVEVGSUxURVIgKDMpCisKKyNkZWZpbmUgWkxJQl9GSUxFRlVOQ19NT0RFX0VYSVNUSU5HICg0KQorI2RlZmluZSBaTElCX0ZJTEVGVU5DX01PREVfQ1JFQVRFICAgKDgpCisKKworI2lmbmRlZiBaQ0FMTEJBQ0sKKyAjaWYgKGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkIChXSU5ET1dTKSB8fCBkZWZpbmVkIChfV0lORE9XUykpICYmIGRlZmluZWQoQ0FMTEJBQ0spICYmIGRlZmluZWQgKFVTRVdJTkRPV1NfQ0FMTEJBQ0spCisgICAjZGVmaW5lIFpDQUxMQkFDSyBDQUxMQkFDSworICNlbHNlCisgICAjZGVmaW5lIFpDQUxMQkFDSworICNlbmRpZgorI2VuZGlmCisKKworCisKK3R5cGVkZWYgdm9pZHBmICAgKFpDQUxMQkFDSyAqb3Blbl9maWxlX2Z1bmMpICAgICAgT0YoKHZvaWRwZiBvcGFxdWUsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBpbnQgbW9kZSkpOwordHlwZWRlZiB1TG9uZyAgICAoWkNBTExCQUNLICpyZWFkX2ZpbGVfZnVuYykgICAgICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSwgdm9pZCogYnVmLCB1TG9uZyBzaXplKSk7Cit0eXBlZGVmIHVMb25nICAgIChaQ0FMTEJBQ0sgKndyaXRlX2ZpbGVfZnVuYykgICAgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCBjb25zdCB2b2lkKiBidWYsIHVMb25nIHNpemUpKTsKK3R5cGVkZWYgaW50ICAgICAgKFpDQUxMQkFDSyAqY2xvc2VfZmlsZV9mdW5jKSAgICAgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0pKTsKK3R5cGVkZWYgaW50ICAgICAgKFpDQUxMQkFDSyAqdGVzdGVycm9yX2ZpbGVfZnVuYykgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0pKTsKKwordHlwZWRlZiBsb25nICAgICAoWkNBTExCQUNLICp0ZWxsX2ZpbGVfZnVuYykgICAgICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkpOwordHlwZWRlZiBsb25nICAgICAoWkNBTExCQUNLICpzZWVrX2ZpbGVfZnVuYykgICAgICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSwgdUxvbmcgb2Zmc2V0LCBpbnQgb3JpZ2luKSk7CisKKworLyogaGVyZSBpcyB0aGUgIm9sZCIgMzIgYml0cyBzdHJ1Y3R1cmUgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCB6bGliX2ZpbGVmdW5jX2RlZl9zCit7CisgICAgb3Blbl9maWxlX2Z1bmMgICAgICB6b3Blbl9maWxlOworICAgIHJlYWRfZmlsZV9mdW5jICAgICAgenJlYWRfZmlsZTsKKyAgICB3cml0ZV9maWxlX2Z1bmMgICAgIHp3cml0ZV9maWxlOworICAgIHRlbGxfZmlsZV9mdW5jICAgICAgenRlbGxfZmlsZTsKKyAgICBzZWVrX2ZpbGVfZnVuYyAgICAgIHpzZWVrX2ZpbGU7CisgICAgY2xvc2VfZmlsZV9mdW5jICAgICB6Y2xvc2VfZmlsZTsKKyAgICB0ZXN0ZXJyb3JfZmlsZV9mdW5jIHplcnJvcl9maWxlOworICAgIHZvaWRwZiAgICAgICAgICAgICAgb3BhcXVlOworfSB6bGliX2ZpbGVmdW5jX2RlZjsKKwordHlwZWRlZiBaUE9TNjRfVCAoWkNBTExCQUNLICp0ZWxsNjRfZmlsZV9mdW5jKSAgICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkpOwordHlwZWRlZiBsb25nICAgICAoWkNBTExCQUNLICpzZWVrNjRfZmlsZV9mdW5jKSAgICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSwgWlBPUzY0X1Qgb2Zmc2V0LCBpbnQgb3JpZ2luKSk7Cit0eXBlZGVmIHZvaWRwZiAgIChaQ0FMTEJBQ0sgKm9wZW42NF9maWxlX2Z1bmMpICAgIE9GKCh2b2lkcGYgb3BhcXVlLCBjb25zdCB2b2lkKiBmaWxlbmFtZSwgaW50IG1vZGUpKTsKKwordHlwZWRlZiBzdHJ1Y3QgemxpYl9maWxlZnVuYzY0X2RlZl9zCit7CisgICAgb3BlbjY0X2ZpbGVfZnVuYyAgICB6b3BlbjY0X2ZpbGU7CisgICAgcmVhZF9maWxlX2Z1bmMgICAgICB6cmVhZF9maWxlOworICAgIHdyaXRlX2ZpbGVfZnVuYyAgICAgendyaXRlX2ZpbGU7CisgICAgdGVsbDY0X2ZpbGVfZnVuYyAgICB6dGVsbDY0X2ZpbGU7CisgICAgc2VlazY0X2ZpbGVfZnVuYyAgICB6c2VlazY0X2ZpbGU7CisgICAgY2xvc2VfZmlsZV9mdW5jICAgICB6Y2xvc2VfZmlsZTsKKyAgICB0ZXN0ZXJyb3JfZmlsZV9mdW5jIHplcnJvcl9maWxlOworICAgIHZvaWRwZiAgICAgICAgICAgICAgb3BhcXVlOworfSB6bGliX2ZpbGVmdW5jNjRfZGVmOworCit2b2lkIGZpbGxfZm9wZW42NF9maWxlZnVuYyBPRigoemxpYl9maWxlZnVuYzY0X2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmKSk7Cit2b2lkIGZpbGxfZm9wZW5fZmlsZWZ1bmMgT0YoKHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYpKTsKKworLyogbm93IGludGVybmFsIGRlZmluaXRpb24sIG9ubHkgZm9yIHppcC5jIGFuZCB1bnppcC5oICovCit0eXBlZGVmIHN0cnVjdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmX3MKK3sKKyAgICB6bGliX2ZpbGVmdW5jNjRfZGVmIHpmaWxlX2Z1bmM2NDsKKyAgICBvcGVuX2ZpbGVfZnVuYyAgICAgIHpvcGVuMzJfZmlsZTsKKyAgICB0ZWxsX2ZpbGVfZnVuYyAgICAgIHp0ZWxsMzJfZmlsZTsKKyAgICBzZWVrX2ZpbGVfZnVuYyAgICAgIHpzZWVrMzJfZmlsZTsKK30gemxpYl9maWxlZnVuYzY0XzMyX2RlZjsKKworCisjZGVmaW5lIFpSRUFENjQoZmlsZWZ1bmMsZmlsZXN0cmVhbSxidWYsc2l6ZSkgICAgICgoKigoZmlsZWZ1bmMpLnpmaWxlX2Z1bmM2NC56cmVhZF9maWxlKSkgICAoKGZpbGVmdW5jKS56ZmlsZV9mdW5jNjQub3BhcXVlLGZpbGVzdHJlYW0sYnVmLHNpemUpKQorI2RlZmluZSBaV1JJVEU2NChmaWxlZnVuYyxmaWxlc3RyZWFtLGJ1ZixzaXplKSAgICAoKCooKGZpbGVmdW5jKS56ZmlsZV9mdW5jNjQuendyaXRlX2ZpbGUpKSAgKChmaWxlZnVuYykuemZpbGVfZnVuYzY0Lm9wYXF1ZSxmaWxlc3RyZWFtLGJ1ZixzaXplKSkKKy8vI2RlZmluZSBaVEVMTDY0KGZpbGVmdW5jLGZpbGVzdHJlYW0pICAgICAgICAgICAgKCgqKChmaWxlZnVuYykuenRlbGw2NF9maWxlKSkgKChmaWxlZnVuYykub3BhcXVlLGZpbGVzdHJlYW0pKQorLy8jZGVmaW5lIFpTRUVLNjQoZmlsZWZ1bmMsZmlsZXN0cmVhbSxwb3MsbW9kZSkgICAoKCooKGZpbGVmdW5jKS56c2VlazY0X2ZpbGUpKSAoKGZpbGVmdW5jKS5vcGFxdWUsZmlsZXN0cmVhbSxwb3MsbW9kZSkpCisjZGVmaW5lIFpDTE9TRTY0KGZpbGVmdW5jLGZpbGVzdHJlYW0pICAgICAgICAgICAgICgoKigoZmlsZWZ1bmMpLnpmaWxlX2Z1bmM2NC56Y2xvc2VfZmlsZSkpICAoKGZpbGVmdW5jKS56ZmlsZV9mdW5jNjQub3BhcXVlLGZpbGVzdHJlYW0pKQorI2RlZmluZSBaRVJST1I2NChmaWxlZnVuYyxmaWxlc3RyZWFtKSAgICAgICAgICAgICAoKCooKGZpbGVmdW5jKS56ZmlsZV9mdW5jNjQuemVycm9yX2ZpbGUpKSAgKChmaWxlZnVuYykuemZpbGVfZnVuYzY0Lm9wYXF1ZSxmaWxlc3RyZWFtKSkKKwordm9pZHBmIGNhbGxfem9wZW42NCBPRigoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcGZpbGVmdW5jLGNvbnN0IHZvaWQqZmlsZW5hbWUsaW50IG1vZGUpKTsKK2xvbmcgICAgY2FsbF96c2VlazY0IE9GKChjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwZmlsZWZ1bmMsdm9pZHBmIGZpbGVzdHJlYW0sIFpQT1M2NF9UIG9mZnNldCwgaW50IG9yaWdpbikpOworWlBPUzY0X1QgY2FsbF96dGVsbDY0IE9GKChjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwZmlsZWZ1bmMsdm9pZHBmIGZpbGVzdHJlYW0pKTsKKwordm9pZCAgICBmaWxsX3psaWJfZmlsZWZ1bmM2NF8zMl9kZWZfZnJvbV9maWxlZnVuYzMyKHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHBfZmlsZWZ1bmM2NF8zMixjb25zdCB6bGliX2ZpbGVmdW5jX2RlZiogcF9maWxlZnVuYzMyKTsKKworI2RlZmluZSBaT1BFTjY0KGZpbGVmdW5jLGZpbGVuYW1lLG1vZGUpICAgICAgICAgKGNhbGxfem9wZW42NCgoJihmaWxlZnVuYykpLChmaWxlbmFtZSksKG1vZGUpKSkKKyNkZWZpbmUgWlRFTEw2NChmaWxlZnVuYyxmaWxlc3RyZWFtKSAgICAgICAgICAgIChjYWxsX3p0ZWxsNjQoKCYoZmlsZWZ1bmMpKSwoZmlsZXN0cmVhbSkpKQorI2RlZmluZSBaU0VFSzY0KGZpbGVmdW5jLGZpbGVzdHJlYW0scG9zLG1vZGUpICAgKGNhbGxfenNlZWs2NCgoJihmaWxlZnVuYykpLChmaWxlc3RyZWFtKSwocG9zKSwobW9kZSkpKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvbWluaXppcC9pb3dpbjMyLmMgYi96bGliL3NyYy9jb250cmliL21pbml6aXAvaW93aW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NmQ5NmMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL21pbml6aXAvaW93aW4zMi5jCkBAIC0wLDAgKzEsNDYxIEBACisvKiBpb3dpbjMyLmMgLS0gSU8gYmFzZSBmdW5jdGlvbiBoZWFkZXIgZm9yIGNvbXByZXNzL3VuY29tcHJlc3MgLnppcAorICAgICBWZXJzaW9uIDEuMSwgRmVicnVhcnkgMTRoLCAyMDEwCisgICAgIHBhcnQgb2YgdGhlIE1pbmlaaXAgcHJvamVjdCAtICggaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC9taW5pemlwLmh0bWwgKQorCisgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAxMCBHaWxsZXMgVm9sbGFudCAobWluaXppcCkgKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCisKKyAgICAgICAgIE1vZGlmaWNhdGlvbnMgZm9yIFppcDY0IHN1cHBvcnQKKyAgICAgICAgIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1hdGhpYXMgU3ZlbnNzb24gKCBodHRwOi8vcmVzdWx0NDIuY29tICkKKworICAgICBGb3IgbW9yZSBpbmZvIHJlYWQgTWluaVppcF9pbmZvLnR4dAorCisqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJ6bGliLmgiCisjaW5jbHVkZSAiaW9hcGkuaCIKKyNpbmNsdWRlICJpb3dpbjMyLmgiCisKKyNpZm5kZWYgSU5WQUxJRF9IQU5ETEVfVkFMVUUKKyNkZWZpbmUgSU5WQUxJRF9IQU5ETEVfVkFMVUUgKDB4RkZGRkZGRkYpCisjZW5kaWYKKworI2lmbmRlZiBJTlZBTElEX1NFVF9GSUxFX1BPSU5URVIKKyNkZWZpbmUgSU5WQUxJRF9TRVRfRklMRV9QT0lOVEVSICgoRFdPUkQpLTEpCisjZW5kaWYKKworCisjaWYgZGVmaW5lZChXSU5BUElfRkFNSUxZX1BBUlRJVElPTikgJiYgKCEoZGVmaW5lZChJT1dJTjMyX1VTSU5HX1dJTlJUX0FQSSkpKQorI2lmIFdJTkFQSV9GQU1JTFlfUEFSVElUSU9OKFdJTkFQSV9QQVJUSVRJT05fQVBQKQorI2RlZmluZSBJT1dJTjMyX1VTSU5HX1dJTlJUX0FQSSAxCisjZW5kaWYKKyNlbmRpZgorCit2b2lkcGYgIFpDQUxMQkFDSyB3aW4zMl9vcGVuX2ZpbGVfZnVuYyAgT0YoKHZvaWRwZiBvcGFxdWUsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBpbnQgbW9kZSkpOwordUxvbmcgICBaQ0FMTEJBQ0sgd2luMzJfcmVhZF9maWxlX2Z1bmMgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCB2b2lkKiBidWYsIHVMb25nIHNpemUpKTsKK3VMb25nICAgWkNBTExCQUNLIHdpbjMyX3dyaXRlX2ZpbGVfZnVuYyBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSwgY29uc3Qgdm9pZCogYnVmLCB1TG9uZyBzaXplKSk7CitaUE9TNjRfVCBaQ0FMTEJBQ0sgd2luMzJfdGVsbDY0X2ZpbGVfZnVuYyAgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0pKTsKK2xvbmcgICAgWkNBTExCQUNLIHdpbjMyX3NlZWs2NF9maWxlX2Z1bmMgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCBaUE9TNjRfVCBvZmZzZXQsIGludCBvcmlnaW4pKTsKK2ludCAgICAgWkNBTExCQUNLIHdpbjMyX2Nsb3NlX2ZpbGVfZnVuYyBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkpOworaW50ICAgICBaQ0FMTEJBQ0sgd2luMzJfZXJyb3JfZmlsZV9mdW5jIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtKSk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgSEFORExFIGhmOworICAgIGludCBlcnJvcjsKK30gV0lOMzJGSUxFX0lPV0lOOworCisKK3N0YXRpYyB2b2lkIHdpbjMyX3RyYW5zbGF0ZV9vcGVuX21vZGUoaW50IG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEKiBscGR3RGVzaXJlZEFjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQqIGxwZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCogbHBkd1NoYXJlTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQqIGxwZHdGbGFnc0FuZEF0dHJpYnV0ZXMpCit7CisgICAgKmxwZHdEZXNpcmVkQWNjZXNzID0gKmxwZHdTaGFyZU1vZGUgPSAqbHBkd0ZsYWdzQW5kQXR0cmlidXRlcyA9ICpscGR3Q3JlYXRpb25EaXNwb3NpdGlvbiA9IDA7CisKKyAgICBpZiAoKG1vZGUgJiBaTElCX0ZJTEVGVU5DX01PREVfUkVBRFdSSVRFRklMVEVSKT09WkxJQl9GSUxFRlVOQ19NT0RFX1JFQUQpCisgICAgeworICAgICAgICAqbHBkd0Rlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX1JFQUQ7CisgICAgICAgICpscGR3Q3JlYXRpb25EaXNwb3NpdGlvbiA9IE9QRU5fRVhJU1RJTkc7CisgICAgICAgICpscGR3U2hhcmVNb2RlID0gRklMRV9TSEFSRV9SRUFEOworICAgIH0KKyAgICBlbHNlIGlmIChtb2RlICYgWkxJQl9GSUxFRlVOQ19NT0RFX0VYSVNUSU5HKQorICAgIHsKKyAgICAgICAgKmxwZHdEZXNpcmVkQWNjZXNzID0gR0VORVJJQ19XUklURSB8IEdFTkVSSUNfUkVBRDsKKyAgICAgICAgKmxwZHdDcmVhdGlvbkRpc3Bvc2l0aW9uID0gT1BFTl9FWElTVElORzsKKyAgICB9CisgICAgZWxzZSBpZiAobW9kZSAmIFpMSUJfRklMRUZVTkNfTU9ERV9DUkVBVEUpCisgICAgeworICAgICAgICAqbHBkd0Rlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX1dSSVRFIHwgR0VORVJJQ19SRUFEOworICAgICAgICAqbHBkd0NyZWF0aW9uRGlzcG9zaXRpb24gPSBDUkVBVEVfQUxXQVlTOworICAgIH0KK30KKworc3RhdGljIHZvaWRwZiB3aW4zMl9idWlsZF9pb3dpbihIQU5ETEUgaEZpbGUpCit7CisgICAgdm9pZHBmIHJldD1OVUxMOworCisgICAgaWYgKChoRmlsZSAhPSBOVUxMKSAmJiAoaEZpbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpKQorICAgIHsKKyAgICAgICAgV0lOMzJGSUxFX0lPV0lOIHczMmZpb3c7CisgICAgICAgIHczMmZpb3cuaGYgPSBoRmlsZTsKKyAgICAgICAgdzMyZmlvdy5lcnJvciA9IDA7CisgICAgICAgIHJldCA9IG1hbGxvYyhzaXplb2YoV0lOMzJGSUxFX0lPV0lOKSk7CisKKyAgICAgICAgaWYgKHJldD09TlVMTCkKKyAgICAgICAgICAgIENsb3NlSGFuZGxlKGhGaWxlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKigoV0lOMzJGSUxFX0lPV0lOKilyZXQpID0gdzMyZmlvdzsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZHBmIFpDQUxMQkFDSyB3aW4zMl9vcGVuNjRfZmlsZV9mdW5jICh2b2lkcGYgb3BhcXVlLGNvbnN0IHZvaWQqIGZpbGVuYW1lLGludCBtb2RlKQoreworICAgIGNvbnN0IGNoYXIqIG1vZGVfZm9wZW4gPSBOVUxMOworICAgIERXT1JEIGR3RGVzaXJlZEFjY2Vzcyxkd0NyZWF0aW9uRGlzcG9zaXRpb24sZHdTaGFyZU1vZGUsZHdGbGFnc0FuZEF0dHJpYnV0ZXMgOworICAgIEhBTkRMRSBoRmlsZSA9IE5VTEw7CisKKyAgICB3aW4zMl90cmFuc2xhdGVfb3Blbl9tb2RlKG1vZGUsJmR3RGVzaXJlZEFjY2VzcywmZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLCZkd1NoYXJlTW9kZSwmZHdGbGFnc0FuZEF0dHJpYnV0ZXMpOworCisjaWZkZWYgSU9XSU4zMl9VU0lOR19XSU5SVF9BUEkKKyNpZmRlZiBVTklDT0RFCisgICAgaWYgKChmaWxlbmFtZSE9TlVMTCkgJiYgKGR3RGVzaXJlZEFjY2VzcyAhPSAwKSkKKyAgICAgICAgaEZpbGUgPSBDcmVhdGVGaWxlMigoTFBDVFNUUilmaWxlbmFtZSwgZHdEZXNpcmVkQWNjZXNzLCBkd1NoYXJlTW9kZSwgZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLCBOVUxMKTsKKyNlbHNlCisgICAgaWYgKChmaWxlbmFtZSE9TlVMTCkgJiYgKGR3RGVzaXJlZEFjY2VzcyAhPSAwKSkKKyAgICB7CisgICAgICAgIFdDSEFSIGZpbGVuYW1lV1tGSUxFTkFNRV9NQVggKyAweDIwMCArIDFdOworICAgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwwLChjb25zdCBjaGFyKilmaWxlbmFtZSwtMSxmaWxlbmFtZVcsRklMRU5BTUVfTUFYICsgMHgyMDApOworICAgICAgICBoRmlsZSA9IENyZWF0ZUZpbGUyKGZpbGVuYW1lVywgZHdEZXNpcmVkQWNjZXNzLCBkd1NoYXJlTW9kZSwgZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLCBOVUxMKTsKKyAgICB9CisjZW5kaWYKKyNlbHNlCisgICAgaWYgKChmaWxlbmFtZSE9TlVMTCkgJiYgKGR3RGVzaXJlZEFjY2VzcyAhPSAwKSkKKyAgICAgICAgaEZpbGUgPSBDcmVhdGVGaWxlKChMUENUU1RSKWZpbGVuYW1lLCBkd0Rlc2lyZWRBY2Nlc3MsIGR3U2hhcmVNb2RlLCBOVUxMLCBkd0NyZWF0aW9uRGlzcG9zaXRpb24sIGR3RmxhZ3NBbmRBdHRyaWJ1dGVzLCBOVUxMKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHdpbjMyX2J1aWxkX2lvd2luKGhGaWxlKTsKK30KKworCit2b2lkcGYgWkNBTExCQUNLIHdpbjMyX29wZW42NF9maWxlX2Z1bmNBICh2b2lkcGYgb3BhcXVlLGNvbnN0IHZvaWQqIGZpbGVuYW1lLGludCBtb2RlKQoreworICAgIGNvbnN0IGNoYXIqIG1vZGVfZm9wZW4gPSBOVUxMOworICAgIERXT1JEIGR3RGVzaXJlZEFjY2Vzcyxkd0NyZWF0aW9uRGlzcG9zaXRpb24sZHdTaGFyZU1vZGUsZHdGbGFnc0FuZEF0dHJpYnV0ZXMgOworICAgIEhBTkRMRSBoRmlsZSA9IE5VTEw7CisKKyAgICB3aW4zMl90cmFuc2xhdGVfb3Blbl9tb2RlKG1vZGUsJmR3RGVzaXJlZEFjY2VzcywmZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLCZkd1NoYXJlTW9kZSwmZHdGbGFnc0FuZEF0dHJpYnV0ZXMpOworCisjaWZkZWYgSU9XSU4zMl9VU0lOR19XSU5SVF9BUEkKKyAgICBpZiAoKGZpbGVuYW1lIT1OVUxMKSAmJiAoZHdEZXNpcmVkQWNjZXNzICE9IDApKQorICAgIHsKKyAgICAgICAgV0NIQVIgZmlsZW5hbWVXW0ZJTEVOQU1FX01BWCArIDB4MjAwICsgMV07CisgICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLDAsKGNvbnN0IGNoYXIqKWZpbGVuYW1lLC0xLGZpbGVuYW1lVyxGSUxFTkFNRV9NQVggKyAweDIwMCk7CisgICAgICAgIGhGaWxlID0gQ3JlYXRlRmlsZTIoZmlsZW5hbWVXLCBkd0Rlc2lyZWRBY2Nlc3MsIGR3U2hhcmVNb2RlLCBkd0NyZWF0aW9uRGlzcG9zaXRpb24sIE5VTEwpOworICAgIH0KKyNlbHNlCisgICAgaWYgKChmaWxlbmFtZSE9TlVMTCkgJiYgKGR3RGVzaXJlZEFjY2VzcyAhPSAwKSkKKyAgICAgICAgaEZpbGUgPSBDcmVhdGVGaWxlQSgoTFBDU1RSKWZpbGVuYW1lLCBkd0Rlc2lyZWRBY2Nlc3MsIGR3U2hhcmVNb2RlLCBOVUxMLCBkd0NyZWF0aW9uRGlzcG9zaXRpb24sIGR3RmxhZ3NBbmRBdHRyaWJ1dGVzLCBOVUxMKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHdpbjMyX2J1aWxkX2lvd2luKGhGaWxlKTsKK30KKworCit2b2lkcGYgWkNBTExCQUNLIHdpbjMyX29wZW42NF9maWxlX2Z1bmNXICh2b2lkcGYgb3BhcXVlLGNvbnN0IHZvaWQqIGZpbGVuYW1lLGludCBtb2RlKQoreworICAgIGNvbnN0IGNoYXIqIG1vZGVfZm9wZW4gPSBOVUxMOworICAgIERXT1JEIGR3RGVzaXJlZEFjY2Vzcyxkd0NyZWF0aW9uRGlzcG9zaXRpb24sZHdTaGFyZU1vZGUsZHdGbGFnc0FuZEF0dHJpYnV0ZXMgOworICAgIEhBTkRMRSBoRmlsZSA9IE5VTEw7CisKKyAgICB3aW4zMl90cmFuc2xhdGVfb3Blbl9tb2RlKG1vZGUsJmR3RGVzaXJlZEFjY2VzcywmZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLCZkd1NoYXJlTW9kZSwmZHdGbGFnc0FuZEF0dHJpYnV0ZXMpOworCisjaWZkZWYgSU9XSU4zMl9VU0lOR19XSU5SVF9BUEkKKyAgICBpZiAoKGZpbGVuYW1lIT1OVUxMKSAmJiAoZHdEZXNpcmVkQWNjZXNzICE9IDApKQorICAgICAgICBoRmlsZSA9IENyZWF0ZUZpbGUyKChMUENXU1RSKWZpbGVuYW1lLCBkd0Rlc2lyZWRBY2Nlc3MsIGR3U2hhcmVNb2RlLCBkd0NyZWF0aW9uRGlzcG9zaXRpb24sTlVMTCk7CisjZWxzZQorICAgIGlmICgoZmlsZW5hbWUhPU5VTEwpICYmIChkd0Rlc2lyZWRBY2Nlc3MgIT0gMCkpCisgICAgICAgIGhGaWxlID0gQ3JlYXRlRmlsZVcoKExQQ1dTVFIpZmlsZW5hbWUsIGR3RGVzaXJlZEFjY2VzcywgZHdTaGFyZU1vZGUsIE5VTEwsIGR3Q3JlYXRpb25EaXNwb3NpdGlvbiwgZHdGbGFnc0FuZEF0dHJpYnV0ZXMsIE5VTEwpOworI2VuZGlmCisKKyAgICByZXR1cm4gd2luMzJfYnVpbGRfaW93aW4oaEZpbGUpOworfQorCisKK3ZvaWRwZiBaQ0FMTEJBQ0sgd2luMzJfb3Blbl9maWxlX2Z1bmMgKHZvaWRwZiBvcGFxdWUsY29uc3QgY2hhciogZmlsZW5hbWUsaW50IG1vZGUpCit7CisgICAgY29uc3QgY2hhciogbW9kZV9mb3BlbiA9IE5VTEw7CisgICAgRFdPUkQgZHdEZXNpcmVkQWNjZXNzLGR3Q3JlYXRpb25EaXNwb3NpdGlvbixkd1NoYXJlTW9kZSxkd0ZsYWdzQW5kQXR0cmlidXRlcyA7CisgICAgSEFORExFIGhGaWxlID0gTlVMTDsKKworICAgIHdpbjMyX3RyYW5zbGF0ZV9vcGVuX21vZGUobW9kZSwmZHdEZXNpcmVkQWNjZXNzLCZkd0NyZWF0aW9uRGlzcG9zaXRpb24sJmR3U2hhcmVNb2RlLCZkd0ZsYWdzQW5kQXR0cmlidXRlcyk7CisKKyNpZmRlZiBJT1dJTjMyX1VTSU5HX1dJTlJUX0FQSQorI2lmZGVmIFVOSUNPREUKKyAgICBpZiAoKGZpbGVuYW1lIT1OVUxMKSAmJiAoZHdEZXNpcmVkQWNjZXNzICE9IDApKQorICAgICAgICBoRmlsZSA9IENyZWF0ZUZpbGUyKChMUENUU1RSKWZpbGVuYW1lLCBkd0Rlc2lyZWRBY2Nlc3MsIGR3U2hhcmVNb2RlLCBkd0NyZWF0aW9uRGlzcG9zaXRpb24sIE5VTEwpOworI2Vsc2UKKyAgICBpZiAoKGZpbGVuYW1lIT1OVUxMKSAmJiAoZHdEZXNpcmVkQWNjZXNzICE9IDApKQorICAgIHsKKyAgICAgICAgV0NIQVIgZmlsZW5hbWVXW0ZJTEVOQU1FX01BWCArIDB4MjAwICsgMV07CisgICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLDAsKGNvbnN0IGNoYXIqKWZpbGVuYW1lLC0xLGZpbGVuYW1lVyxGSUxFTkFNRV9NQVggKyAweDIwMCk7CisgICAgICAgIGhGaWxlID0gQ3JlYXRlRmlsZTIoZmlsZW5hbWVXLCBkd0Rlc2lyZWRBY2Nlc3MsIGR3U2hhcmVNb2RlLCBkd0NyZWF0aW9uRGlzcG9zaXRpb24sIE5VTEwpOworICAgIH0KKyNlbmRpZgorI2Vsc2UKKyAgICBpZiAoKGZpbGVuYW1lIT1OVUxMKSAmJiAoZHdEZXNpcmVkQWNjZXNzICE9IDApKQorICAgICAgICBoRmlsZSA9IENyZWF0ZUZpbGUoKExQQ1RTVFIpZmlsZW5hbWUsIGR3RGVzaXJlZEFjY2VzcywgZHdTaGFyZU1vZGUsIE5VTEwsIGR3Q3JlYXRpb25EaXNwb3NpdGlvbiwgZHdGbGFnc0FuZEF0dHJpYnV0ZXMsIE5VTEwpOworI2VuZGlmCisKKyAgICByZXR1cm4gd2luMzJfYnVpbGRfaW93aW4oaEZpbGUpOworfQorCisKK3VMb25nIFpDQUxMQkFDSyB3aW4zMl9yZWFkX2ZpbGVfZnVuYyAodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSwgdm9pZCogYnVmLHVMb25nIHNpemUpCit7CisgICAgdUxvbmcgcmV0PTA7CisgICAgSEFORExFIGhGaWxlID0gTlVMTDsKKyAgICBpZiAoc3RyZWFtIT1OVUxMKQorICAgICAgICBoRmlsZSA9ICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGhmOworCisgICAgaWYgKGhGaWxlICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoIVJlYWRGaWxlKGhGaWxlLCBidWYsIHNpemUsICZyZXQsIE5VTEwpKQorICAgICAgICB7CisgICAgICAgICAgICBEV09SRCBkd0VyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKGR3RXJyID09IEVSUk9SX0hBTkRMRV9FT0YpCisgICAgICAgICAgICAgICAgZHdFcnIgPSAwOworICAgICAgICAgICAgKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gZXJyb3I9KGludClkd0VycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKwordUxvbmcgWkNBTExCQUNLIHdpbjMyX3dyaXRlX2ZpbGVfZnVuYyAodm9pZHBmIG9wYXF1ZSx2b2lkcGYgc3RyZWFtLGNvbnN0IHZvaWQqIGJ1Zix1TG9uZyBzaXplKQoreworICAgIHVMb25nIHJldD0wOworICAgIEhBTkRMRSBoRmlsZSA9IE5VTEw7CisgICAgaWYgKHN0cmVhbSE9TlVMTCkKKyAgICAgICAgaEZpbGUgPSAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBoZjsKKworICAgIGlmIChoRmlsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKCFXcml0ZUZpbGUoaEZpbGUsIGJ1Ziwgc2l6ZSwgJnJldCwgTlVMTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIERXT1JEIGR3RXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoZHdFcnIgPT0gRVJST1JfSEFORExFX0VPRikKKyAgICAgICAgICAgICAgICBkd0VyciA9IDA7CisgICAgICAgICAgICAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBlcnJvcj0oaW50KWR3RXJyOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIEJPT0wgTXlTZXRGaWxlUG9pbnRlckV4KEhBTkRMRSBoRmlsZSwgTEFSR0VfSU5URUdFUiBwb3MsIExBUkdFX0lOVEVHRVIgKm5ld1BvcywgIERXT1JEIGR3TW92ZU1ldGhvZCkKK3sKKyNpZmRlZiBJT1dJTjMyX1VTSU5HX1dJTlJUX0FQSQorICAgIHJldHVybiBTZXRGaWxlUG9pbnRlckV4KGhGaWxlLCBwb3MsIG5ld1BvcywgZHdNb3ZlTWV0aG9kKTsKKyNlbHNlCisgICAgTE9ORyBsSGlnaCA9IHBvcy5IaWdoUGFydDsKKyAgICBEV09SRCBkd05ld1BvcyA9IFNldEZpbGVQb2ludGVyKGhGaWxlLCBwb3MuTG93UGFydCwgJmxIaWdoLCBGSUxFX0NVUlJFTlQpOworICAgIEJPT0wgZk9rID0gVFJVRTsKKyAgICBpZiAoZHdOZXdQb3MgPT0gMHhGRkZGRkZGRikKKyAgICAgICAgaWYgKEdldExhc3RFcnJvcigpICE9IE5PX0VSUk9SKQorICAgICAgICAgICAgZk9rID0gRkFMU0U7CisgICAgaWYgKChuZXdQb3MgIT0gTlVMTCkgJiYgKGZPaykpCisgICAgeworICAgICAgICBuZXdQb3MtPkxvd1BhcnQgPSBkd05ld1BvczsKKyAgICAgICAgbmV3UG9zLT5IaWdoUGFydCA9IGxIaWdoOworICAgIH0KKyAgICByZXR1cm4gZk9rOworI2VuZGlmCit9CisKK2xvbmcgWkNBTExCQUNLIHdpbjMyX3RlbGxfZmlsZV9mdW5jICh2b2lkcGYgb3BhcXVlLHZvaWRwZiBzdHJlYW0pCit7CisgICAgbG9uZyByZXQ9LTE7CisgICAgSEFORExFIGhGaWxlID0gTlVMTDsKKyAgICBpZiAoc3RyZWFtIT1OVUxMKQorICAgICAgICBoRmlsZSA9ICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGhmOworICAgIGlmIChoRmlsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgTEFSR0VfSU5URUdFUiBwb3M7CisgICAgICAgIHBvcy5RdWFkUGFydCA9IDA7CisKKyAgICAgICAgaWYgKCFNeVNldEZpbGVQb2ludGVyRXgoaEZpbGUsIHBvcywgJnBvcywgRklMRV9DVVJSRU5UKSkKKyAgICAgICAgeworICAgICAgICAgICAgRFdPUkQgZHdFcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGVycm9yPShpbnQpZHdFcnI7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXQ9KGxvbmcpcG9zLkxvd1BhcnQ7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK1pQT1M2NF9UIFpDQUxMQkFDSyB3aW4zMl90ZWxsNjRfZmlsZV9mdW5jICh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtKQoreworICAgIFpQT1M2NF9UIHJldD0gKFpQT1M2NF9UKS0xOworICAgIEhBTkRMRSBoRmlsZSA9IE5VTEw7CisgICAgaWYgKHN0cmVhbSE9TlVMTCkKKyAgICAgICAgaEZpbGUgPSAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKS0+aGY7CisKKyAgICBpZiAoaEZpbGUpCisgICAgeworICAgICAgICBMQVJHRV9JTlRFR0VSIHBvczsKKyAgICAgICAgcG9zLlF1YWRQYXJ0ID0gMDsKKworICAgICAgICBpZiAoIU15U2V0RmlsZVBvaW50ZXJFeChoRmlsZSwgcG9zLCAmcG9zLCBGSUxFX0NVUlJFTlQpKQorICAgICAgICB7CisgICAgICAgICAgICBEV09SRCBkd0VyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gZXJyb3I9KGludClkd0VycjsKKyAgICAgICAgICAgIHJldCA9IChaUE9TNjRfVCktMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXQ9cG9zLlF1YWRQYXJ0OworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisKK2xvbmcgWkNBTExCQUNLIHdpbjMyX3NlZWtfZmlsZV9mdW5jICh2b2lkcGYgb3BhcXVlLHZvaWRwZiBzdHJlYW0sdUxvbmcgb2Zmc2V0LGludCBvcmlnaW4pCit7CisgICAgRFdPUkQgZHdNb3ZlTWV0aG9kPTB4RkZGRkZGRkY7CisgICAgSEFORExFIGhGaWxlID0gTlVMTDsKKworICAgIGxvbmcgcmV0PS0xOworICAgIGlmIChzdHJlYW0hPU5VTEwpCisgICAgICAgIGhGaWxlID0gKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gaGY7CisgICAgc3dpdGNoIChvcmlnaW4pCisgICAgeworICAgIGNhc2UgWkxJQl9GSUxFRlVOQ19TRUVLX0NVUiA6CisgICAgICAgIGR3TW92ZU1ldGhvZCA9IEZJTEVfQ1VSUkVOVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBaTElCX0ZJTEVGVU5DX1NFRUtfRU5EIDoKKyAgICAgICAgZHdNb3ZlTWV0aG9kID0gRklMRV9FTkQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCA6CisgICAgICAgIGR3TW92ZU1ldGhvZCA9IEZJTEVfQkVHSU47CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoaEZpbGUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIExBUkdFX0lOVEVHRVIgcG9zOworICAgICAgICBwb3MuUXVhZFBhcnQgPSBvZmZzZXQ7CisgICAgICAgIGlmICghTXlTZXRGaWxlUG9pbnRlckV4KGhGaWxlLCBwb3MsIE5VTEwsIGR3TW92ZU1ldGhvZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIERXT1JEIGR3RXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBlcnJvcj0oaW50KWR3RXJyOworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0PTA7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2xvbmcgWkNBTExCQUNLIHdpbjMyX3NlZWs2NF9maWxlX2Z1bmMgKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0sWlBPUzY0X1Qgb2Zmc2V0LGludCBvcmlnaW4pCit7CisgICAgRFdPUkQgZHdNb3ZlTWV0aG9kPTB4RkZGRkZGRkY7CisgICAgSEFORExFIGhGaWxlID0gTlVMTDsKKyAgICBsb25nIHJldD0tMTsKKworICAgIGlmIChzdHJlYW0hPU5VTEwpCisgICAgICAgIGhGaWxlID0gKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSktPmhmOworCisgICAgc3dpdGNoIChvcmlnaW4pCisgICAgeworICAgICAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19DVVIgOgorICAgICAgICAgICAgZHdNb3ZlTWV0aG9kID0gRklMRV9DVVJSRU5UOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWkxJQl9GSUxFRlVOQ19TRUVLX0VORCA6CisgICAgICAgICAgICBkd01vdmVNZXRob2QgPSBGSUxFX0VORDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19TRVQgOgorICAgICAgICAgICAgZHdNb3ZlTWV0aG9kID0gRklMRV9CRUdJTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGhGaWxlKQorICAgIHsKKyAgICAgICAgTEFSR0VfSU5URUdFUiBwb3M7CisgICAgICAgIHBvcy5RdWFkUGFydCA9IG9mZnNldDsKKyAgICAgICAgaWYgKCFNeVNldEZpbGVQb2ludGVyRXgoaEZpbGUsIHBvcywgTlVMTCwgRklMRV9DVVJSRU5UKSkKKyAgICAgICAgeworICAgICAgICAgICAgRFdPUkQgZHdFcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGVycm9yPShpbnQpZHdFcnI7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXQ9MDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IFpDQUxMQkFDSyB3aW4zMl9jbG9zZV9maWxlX2Z1bmMgKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0pCit7CisgICAgaW50IHJldD0tMTsKKworICAgIGlmIChzdHJlYW0hPU5VTEwpCisgICAgeworICAgICAgICBIQU5ETEUgaEZpbGU7CisgICAgICAgIGhGaWxlID0gKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gaGY7CisgICAgICAgIGlmIChoRmlsZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBDbG9zZUhhbmRsZShoRmlsZSk7CisgICAgICAgICAgICByZXQ9MDsKKyAgICAgICAgfQorICAgICAgICBmcmVlKHN0cmVhbSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBaQ0FMTEJBQ0sgd2luMzJfZXJyb3JfZmlsZV9mdW5jICh2b2lkcGYgb3BhcXVlLHZvaWRwZiBzdHJlYW0pCit7CisgICAgaW50IHJldD0tMTsKKyAgICBpZiAoc3RyZWFtIT1OVUxMKQorICAgIHsKKyAgICAgICAgcmV0ID0gKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gZXJyb3I7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgZmlsbF93aW4zMl9maWxlZnVuYyAoemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZikKK3sKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnpvcGVuX2ZpbGUgPSB3aW4zMl9vcGVuX2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnpyZWFkX2ZpbGUgPSB3aW4zMl9yZWFkX2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnp3cml0ZV9maWxlID0gd2luMzJfd3JpdGVfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+enRlbGxfZmlsZSA9IHdpbjMyX3RlbGxfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+enNlZWtfZmlsZSA9IHdpbjMyX3NlZWtfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+emNsb3NlX2ZpbGUgPSB3aW4zMl9jbG9zZV9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56ZXJyb3JfZmlsZSA9IHdpbjMyX2Vycm9yX2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPm9wYXF1ZSA9IE5VTEw7Cit9CisKK3ZvaWQgZmlsbF93aW4zMl9maWxlZnVuYzY0KHpsaWJfZmlsZWZ1bmM2NF9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZikKK3sKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnpvcGVuNjRfZmlsZSA9IHdpbjMyX29wZW42NF9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56cmVhZF9maWxlID0gd2luMzJfcmVhZF9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56d3JpdGVfZmlsZSA9IHdpbjMyX3dyaXRlX2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnp0ZWxsNjRfZmlsZSA9IHdpbjMyX3RlbGw2NF9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56c2VlazY0X2ZpbGUgPSB3aW4zMl9zZWVrNjRfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+emNsb3NlX2ZpbGUgPSB3aW4zMl9jbG9zZV9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56ZXJyb3JfZmlsZSA9IHdpbjMyX2Vycm9yX2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPm9wYXF1ZSA9IE5VTEw7Cit9CisKKwordm9pZCBmaWxsX3dpbjMyX2ZpbGVmdW5jNjRBKHpsaWJfZmlsZWZ1bmM2NF9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZikKK3sKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnpvcGVuNjRfZmlsZSA9IHdpbjMyX29wZW42NF9maWxlX2Z1bmNBOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+enJlYWRfZmlsZSA9IHdpbjMyX3JlYWRfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+endyaXRlX2ZpbGUgPSB3aW4zMl93cml0ZV9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56dGVsbDY0X2ZpbGUgPSB3aW4zMl90ZWxsNjRfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+enNlZWs2NF9maWxlID0gd2luMzJfc2VlazY0X2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnpjbG9zZV9maWxlID0gd2luMzJfY2xvc2VfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+emVycm9yX2ZpbGUgPSB3aW4zMl9lcnJvcl9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT5vcGFxdWUgPSBOVUxMOworfQorCisKK3ZvaWQgZmlsbF93aW4zMl9maWxlZnVuYzY0Vyh6bGliX2ZpbGVmdW5jNjRfZGVmKiBwemxpYl9maWxlZnVuY19kZWYpCit7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56b3BlbjY0X2ZpbGUgPSB3aW4zMl9vcGVuNjRfZmlsZV9mdW5jVzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnpyZWFkX2ZpbGUgPSB3aW4zMl9yZWFkX2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnp3cml0ZV9maWxlID0gd2luMzJfd3JpdGVfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+enRlbGw2NF9maWxlID0gd2luMzJfdGVsbDY0X2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnpzZWVrNjRfZmlsZSA9IHdpbjMyX3NlZWs2NF9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56Y2xvc2VfZmlsZSA9IHdpbjMyX2Nsb3NlX2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnplcnJvcl9maWxlID0gd2luMzJfZXJyb3JfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+b3BhcXVlID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvbWluaXppcC9pb3dpbjMyLmggYi96bGliL3NyYy9jb250cmliL21pbml6aXAvaW93aW4zMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYTA5NjkKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL21pbml6aXAvaW93aW4zMi5oCkBAIC0wLDAgKzEsMjggQEAKKy8qIGlvd2luMzIuaCAtLSBJTyBiYXNlIGZ1bmN0aW9uIGhlYWRlciBmb3IgY29tcHJlc3MvdW5jb21wcmVzcyAuemlwCisgICAgIFZlcnNpb24gMS4xLCBGZWJydWFyeSAxNGgsIDIwMTAKKyAgICAgcGFydCBvZiB0aGUgTWluaVppcCBwcm9qZWN0IC0gKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCisKKyAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDEwIEdpbGxlcyBWb2xsYW50IChtaW5pemlwKSAoIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvbWluaXppcC5odG1sICkKKworICAgICAgICAgTW9kaWZpY2F0aW9ucyBmb3IgWmlwNjQgc3VwcG9ydAorICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTWF0aGlhcyBTdmVuc3NvbiAoIGh0dHA6Ly9yZXN1bHQ0Mi5jb20gKQorCisgICAgICAgICBGb3IgbW9yZSBpbmZvIHJlYWQgTWluaVppcF9pbmZvLnR4dAorCisqLworCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordm9pZCBmaWxsX3dpbjMyX2ZpbGVmdW5jIE9GKCh6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmKSk7Cit2b2lkIGZpbGxfd2luMzJfZmlsZWZ1bmM2NCBPRigoemxpYl9maWxlZnVuYzY0X2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmKSk7Cit2b2lkIGZpbGxfd2luMzJfZmlsZWZ1bmM2NEEgT0YoKHpsaWJfZmlsZWZ1bmM2NF9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZikpOwordm9pZCBmaWxsX3dpbjMyX2ZpbGVmdW5jNjRXIE9GKCh6bGliX2ZpbGVmdW5jNjRfZGVmKiBwemxpYl9maWxlZnVuY19kZWYpKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvbWluaXppcC9tYWtlX3Ztcy5jb20gYi96bGliL3NyYy9jb250cmliL21pbml6aXAvbWFrZV92bXMuY29tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYzEzYTkKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL21pbml6aXAvbWFrZV92bXMuY29tCkBAIC0wLDAgKzEsMjUgQEAKKyQgaWYgZiRzZWFyY2goImlvYXBpLmhfb3JpZyIpIC5lcXMuICIiIHRoZW4gY29weSBpb2FwaS5oIGlvYXBpLmhfb3JpZworJCBvcGVuL3dyaXRlIHpkZWYgdm1zZGVmcy5oCiskIGNvcHkgc3lzJGlucHV0OiB6ZGVmCiskIGRlY2sKKyNkZWZpbmUgdW5peAorI2RlZmluZSBmaWxsX3psaWJfZmlsZWZ1bmM2NF8zMl9kZWZfZnJvbV9maWxlZnVuYzMyIGZpbGx6ZmZ1bmM2NGZyb20KKyNkZWZpbmUgV3JpdGVfWmlwNjRFbmRPZkNlbnRyYWxEaXJlY3RvcnlMb2NhdG9yIFdyaXRlX1ppcDY0RW9ETG9jYXRvcgorI2RlZmluZSBXcml0ZV9aaXA2NEVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZCBXcml0ZV9aaXA2NEVvRFJlY29yZAorI2RlZmluZSBXcml0ZV9FbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQgV3JpdGVfRW9EUmVjb3JkCiskIGVvZAorJCBjbG9zZSB6ZGVmCiskIGNvcHkgdm1zZGVmcy5oLGlvYXBpLmhfb3JpZyBpb2FwaS5oCiskIGNjL2luY2x1ZGU9Wy0tXS9wcmVmaXg9YWxsIGlvYXBpLmMKKyQgY2MvaW5jbHVkZT1bLS1dL3ByZWZpeD1hbGwgbWluaXVuei5jCiskIGNjL2luY2x1ZGU9Wy0tXS9wcmVmaXg9YWxsIHVuemlwLmMKKyQgY2MvaW5jbHVkZT1bLS1dL3ByZWZpeD1hbGwgbWluaXppcC5jCiskIGNjL2luY2x1ZGU9Wy0tXS9wcmVmaXg9YWxsIHppcC5jCiskIGxpbmsgbWluaXVueix1bnppcCxpb2FwaSxbLS1dbGliei5vbGIvbGliCiskIGxpbmsgbWluaXppcCx6aXAsaW9hcGksWy0tXWxpYnoub2xiL2xpYgorJCBtY3IgW11taW5pemlwIHRlc3QgbWluaXppcF9pbmZvLnR4dAorJCBtY3IgW11taW5pdW56IC1sIHRlc3QuemlwCiskIHJlbmFtZSBtaW5pemlwX2luZm8udHh0OyBtaW5pemlwX2luZm8udHh0X29sZAorJCBtY3IgW11taW5pdW56IHRlc3QuemlwCiskIGRlbGV0ZSB0ZXN0LnppcDsqCiskZXhpdApkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9taW5pemlwL21pbml1bnouYyBiL3psaWIvc3JjL2NvbnRyaWIvbWluaXppcC9taW5pdW56LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q2NTQwMQotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvbWluaXppcC9taW5pdW56LmMKQEAgLTAsMCArMSw2NjAgQEAKKy8qCisgICBtaW5pdW56LmMKKyAgIFZlcnNpb24gMS4xLCBGZWJydWFyeSAxNGgsIDIwMTAKKyAgIHNhbXBsZSBwYXJ0IG9mIHRoZSBNaW5pWmlwIHByb2plY3QgLSAoIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvbWluaXppcC5odG1sICkKKworICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMTAgR2lsbGVzIFZvbGxhbnQgKG1pbml6aXApICggaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC9taW5pemlwLmh0bWwgKQorCisgICAgICAgICBNb2RpZmljYXRpb25zIG9mIFVuemlwIGZvciBaaXA2NAorICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggRXZlbiBSb3VhdWx0CisKKyAgICAgICAgIE1vZGlmaWNhdGlvbnMgZm9yIFppcDY0IHN1cHBvcnQgb24gYm90aCB6aXAgYW5kIHVuemlwCisgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBNYXRoaWFzIFN2ZW5zc29uICggaHR0cDovL3Jlc3VsdDQyLmNvbSApCisqLworCisjaWYgKCFkZWZpbmVkKF9XSU4zMikpICYmICghZGVmaW5lZChXSU4zMikpICYmICghZGVmaW5lZChfX0FQUExFX18pKQorICAgICAgICAjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyAgICAgICAgICAgICAgICAjZGVmaW5lIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyAgICAgICAgI2VuZGlmCisgICAgICAgICNpZm5kZWYgX19VU0VfTEFSR0VGSUxFNjQKKyAgICAgICAgICAgICAgICAjZGVmaW5lIF9fVVNFX0xBUkdFRklMRTY0CisgICAgICAgICNlbmRpZgorICAgICAgICAjaWZuZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UKKyAgICAgICAgICAgICAgICAjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UKKyAgICAgICAgI2VuZGlmCisgICAgICAgICNpZm5kZWYgX0ZJTEVfT0ZGU0VUX0JJVAorICAgICAgICAgICAgICAgICNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVCA2NAorICAgICAgICAjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19BUFBMRV9fCisvLyBJbiBkYXJ3aW4gYW5kIHBlcmhhcHMgb3RoZXIgQlNEIHZhcmlhbnRzIG9mZl90IGlzIGEgNjQgYml0IHZhbHVlLCBoZW5jZSBubyBuZWVkIGZvciBzcGVjaWZpYyA2NCBiaXQgZnVuY3Rpb25zCisjZGVmaW5lIEZPUEVOX0ZVTkMoZmlsZW5hbWUsIG1vZGUpIGZvcGVuKGZpbGVuYW1lLCBtb2RlKQorI2RlZmluZSBGVEVMTE9fRlVOQyhzdHJlYW0pIGZ0ZWxsbyhzdHJlYW0pCisjZGVmaW5lIEZTRUVLT19GVU5DKHN0cmVhbSwgb2Zmc2V0LCBvcmlnaW4pIGZzZWVrbyhzdHJlYW0sIG9mZnNldCwgb3JpZ2luKQorI2Vsc2UKKyNkZWZpbmUgRk9QRU5fRlVOQyhmaWxlbmFtZSwgbW9kZSkgZm9wZW42NChmaWxlbmFtZSwgbW9kZSkKKyNkZWZpbmUgRlRFTExPX0ZVTkMoc3RyZWFtKSBmdGVsbG82NChzdHJlYW0pCisjZGVmaW5lIEZTRUVLT19GVU5DKHN0cmVhbSwgb2Zmc2V0LCBvcmlnaW4pIGZzZWVrbzY0KHN0cmVhbSwgb2Zmc2V0LCBvcmlnaW4pCisjZW5kaWYKKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaWZkZWYgX1dJTjMyCisjIGluY2x1ZGUgPGRpcmVjdC5oPgorIyBpbmNsdWRlIDxpby5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGluY2x1ZGUgPHV0aW1lLmg+CisjZW5kaWYKKworCisjaW5jbHVkZSAidW56aXAuaCIKKworI2RlZmluZSBDQVNFU0VOU0lUSVZJVFkgKDApCisjZGVmaW5lIFdSSVRFQlVGRkVSU0laRSAoODE5MikKKyNkZWZpbmUgTUFYRklMRU5BTUUgKDI1NikKKworI2lmZGVmIF9XSU4zMgorI2RlZmluZSBVU0VXSU4zMklPQVBJCisjaW5jbHVkZSAiaW93aW4zMi5oIgorI2VuZGlmCisvKgorICBtaW5pIHVuemlwLCBkZW1vIG9mIHVuemlwIHBhY2thZ2UKKworICB1c2FnZSA6CisgIFVzYWdlIDogbWluaXVueiBbLWV4dmxvXSBmaWxlLnppcCBbZmlsZV90b19leHRyYWN0XSBbLWQgZXh0cmFjdGRpcl0KKworICBsaXN0IHRoZSBmaWxlIGluIHRoZSB6aXBmaWxlLCBhbmQgcHJpbnQgdGhlIGNvbnRlbnQgb2YgRklMRV9JRC5aSVAgb3IgUkVBRE1FLlRYVAorICAgIGlmIGl0IGV4aXN0cworKi8KKworCisvKiBjaGFuZ2VfZmlsZV9kYXRlIDogY2hhbmdlIHRoZSBkYXRlL3RpbWUgb2YgYSBmaWxlCisgICAgZmlsZW5hbWUgOiB0aGUgZmlsZW5hbWUgb2YgdGhlIGZpbGUgd2hlcmUgZGF0ZS90aW1lIG11c3QgYmUgbW9kaWZpZWQKKyAgICBkb3NkYXRlIDogdGhlIG5ldyBkYXRlIGF0IHRoZSBNU0RvcyBmb3JtYXQgKDQgYnl0ZXMpCisgICAgdG11X2RhdGUgOiB0aGUgU0FNRSBuZXcgZGF0ZSBhdCB0aGUgdG1fdW56IGZvcm1hdCAqLwordm9pZCBjaGFuZ2VfZmlsZV9kYXRlKGZpbGVuYW1lLGRvc2RhdGUsdG11X2RhdGUpCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgICAgdUxvbmcgZG9zZGF0ZTsKKyAgICB0bV91bnogdG11X2RhdGU7Cit7CisjaWZkZWYgX1dJTjMyCisgIEhBTkRMRSBoRmlsZTsKKyAgRklMRVRJTUUgZnRtLGZ0TG9jYWwsZnRDcmVhdGUsZnRMYXN0QWNjLGZ0TGFzdFdyaXRlOworCisgIGhGaWxlID0gQ3JlYXRlRmlsZUEoZmlsZW5hbWUsR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAwLE5VTEwsT1BFTl9FWElTVElORywwLE5VTEwpOworICBHZXRGaWxlVGltZShoRmlsZSwmZnRDcmVhdGUsJmZ0TGFzdEFjYywmZnRMYXN0V3JpdGUpOworICBEb3NEYXRlVGltZVRvRmlsZVRpbWUoKFdPUkQpKGRvc2RhdGU+PjE2KSwoV09SRClkb3NkYXRlLCZmdExvY2FsKTsKKyAgTG9jYWxGaWxlVGltZVRvRmlsZVRpbWUoJmZ0TG9jYWwsJmZ0bSk7CisgIFNldEZpbGVUaW1lKGhGaWxlLCZmdG0sJmZ0TGFzdEFjYywmZnRtKTsKKyAgQ2xvc2VIYW5kbGUoaEZpbGUpOworI2Vsc2UKKyNpZmRlZiB1bml4IHx8IF9fQVBQTEVfXworICBzdHJ1Y3QgdXRpbWJ1ZiB1dDsKKyAgc3RydWN0IHRtIG5ld2RhdGU7CisgIG5ld2RhdGUudG1fc2VjID0gdG11X2RhdGUudG1fc2VjOworICBuZXdkYXRlLnRtX21pbj10bXVfZGF0ZS50bV9taW47CisgIG5ld2RhdGUudG1faG91cj10bXVfZGF0ZS50bV9ob3VyOworICBuZXdkYXRlLnRtX21kYXk9dG11X2RhdGUudG1fbWRheTsKKyAgbmV3ZGF0ZS50bV9tb249dG11X2RhdGUudG1fbW9uOworICBpZiAodG11X2RhdGUudG1feWVhciA+IDE5MDApCisgICAgICBuZXdkYXRlLnRtX3llYXI9dG11X2RhdGUudG1feWVhciAtIDE5MDA7CisgIGVsc2UKKyAgICAgIG5ld2RhdGUudG1feWVhcj10bXVfZGF0ZS50bV95ZWFyIDsKKyAgbmV3ZGF0ZS50bV9pc2RzdD0tMTsKKworICB1dC5hY3RpbWU9dXQubW9kdGltZT1ta3RpbWUoJm5ld2RhdGUpOworICB1dGltZShmaWxlbmFtZSwmdXQpOworI2VuZGlmCisjZW5kaWYKK30KKworCisvKiBteW1rZGlyIGFuZCBjaGFuZ2VfZmlsZV9kYXRlIGFyZSBub3QgMTAwICUgcG9ydGFibGUKKyAgIEFzIEkgZG9uJ3Qga25vdyB3ZWxsIFVuaXgsIEkgd2FpdCBmZWVkYmFjayBmb3IgdGhlIHVuaXggcG9ydGlvbiAqLworCitpbnQgbXlta2RpcihkaXJuYW1lKQorICAgIGNvbnN0IGNoYXIqIGRpcm5hbWU7Cit7CisgICAgaW50IHJldD0wOworI2lmZGVmIF9XSU4zMgorICAgIHJldCA9IF9ta2RpcihkaXJuYW1lKTsKKyNlbGlmIHVuaXgKKyAgICByZXQgPSBta2RpciAoZGlybmFtZSwwNzc1KTsKKyNlbGlmIF9fQVBQTEVfXworICAgIHJldCA9IG1rZGlyIChkaXJuYW1lLDA3NzUpOworI2VuZGlmCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IG1ha2VkaXIgKG5ld2RpcikKKyAgICBjaGFyICpuZXdkaXI7Cit7CisgIGNoYXIgKmJ1ZmZlciA7CisgIGNoYXIgKnA7CisgIGludCAgbGVuID0gKGludClzdHJsZW4obmV3ZGlyKTsKKworICBpZiAobGVuIDw9IDApCisgICAgcmV0dXJuIDA7CisKKyAgYnVmZmVyID0gKGNoYXIqKW1hbGxvYyhsZW4rMSk7CisgICAgICAgIGlmIChidWZmZXI9PU5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVU5aX0lOVEVSTkFMRVJST1I7CisgICAgICAgIH0KKyAgc3RyY3B5KGJ1ZmZlcixuZXdkaXIpOworCisgIGlmIChidWZmZXJbbGVuLTFdID09ICcvJykgeworICAgIGJ1ZmZlcltsZW4tMV0gPSAnXDAnOworICB9CisgIGlmIChteW1rZGlyKGJ1ZmZlcikgPT0gMCkKKyAgICB7CisgICAgICBmcmVlKGJ1ZmZlcik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgcCA9IGJ1ZmZlcisxOworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBjaGFyIGhvbGQ7CisKKyAgICAgIHdoaWxlKCpwICYmICpwICE9ICdcXCcgJiYgKnAgIT0gJy8nKQorICAgICAgICBwKys7CisgICAgICBob2xkID0gKnA7CisgICAgICAqcCA9IDA7CisgICAgICBpZiAoKG15bWtkaXIoYnVmZmVyKSA9PSAtMSkgJiYgKGVycm5vID09IEVOT0VOVCkpCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYoImNvdWxkbid0IGNyZWF0ZSBkaXJlY3RvcnkgJXNcbiIsYnVmZmVyKTsKKyAgICAgICAgICBmcmVlKGJ1ZmZlcik7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgIGlmIChob2xkID09IDApCisgICAgICAgIGJyZWFrOworICAgICAgKnArKyA9IGhvbGQ7CisgICAgfQorICBmcmVlKGJ1ZmZlcik7CisgIHJldHVybiAxOworfQorCit2b2lkIGRvX2Jhbm5lcigpCit7CisgICAgcHJpbnRmKCJNaW5pVW56IDEuMDFiLCBkZW1vIG9mIHpMaWIgKyBVbnogcGFja2FnZSB3cml0dGVuIGJ5IEdpbGxlcyBWb2xsYW50XG4iKTsKKyAgICBwcmludGYoIm1vcmUgaW5mbyBhdCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL3VuemlwLmh0bWxcblxuIik7Cit9CisKK3ZvaWQgZG9faGVscCgpCit7CisgICAgcHJpbnRmKCJVc2FnZSA6IG1pbml1bnogWy1lXSBbLXhdIFstdl0gWy1sXSBbLW9dIFstcCBwYXNzd29yZF0gZmlsZS56aXAgW2ZpbGVfdG9fZXh0ci5dIFstZCBleHRyYWN0ZGlyXVxuXG4iIFwKKyAgICAgICAgICAgIiAgLWUgIEV4dHJhY3Qgd2l0aG91dCBwYXRobmFtZSAoanVuayBwYXRocylcbiIgXAorICAgICAgICAgICAiICAteCAgRXh0cmFjdCB3aXRoIHBhdGhuYW1lXG4iIFwKKyAgICAgICAgICAgIiAgLXYgIGxpc3QgZmlsZXNcbiIgXAorICAgICAgICAgICAiICAtbCAgbGlzdCBmaWxlc1xuIiBcCisgICAgICAgICAgICIgIC1kICBkaXJlY3RvcnkgdG8gZXh0cmFjdCBpbnRvXG4iIFwKKyAgICAgICAgICAgIiAgLW8gIG92ZXJ3cml0ZSBmaWxlcyB3aXRob3V0IHByb21wdGluZ1xuIiBcCisgICAgICAgICAgICIgIC1wICBleHRyYWN0IGNyeXB0ZWQgZmlsZSB1c2luZyBwYXNzd29yZFxuXG4iKTsKK30KKwordm9pZCBEaXNwbGF5NjRCaXRzU2l6ZShaUE9TNjRfVCBuLCBpbnQgc2l6ZV9jaGFyKQoreworICAvKiB0byBhdm9pZCBjb21wYXRpYmlsaXR5IHByb2JsZW0gLCB3ZSBkbyBoZXJlIHRoZSBjb252ZXJzaW9uICovCisgIGNoYXIgbnVtYmVyWzIxXTsKKyAgaW50IG9mZnNldD0xOTsKKyAgaW50IHBvc19zdHJpbmcgPSAxOTsKKyAgbnVtYmVyWzIwXT0wOworICBmb3IgKDs7KSB7CisgICAgICBudW1iZXJbb2Zmc2V0XT0oY2hhcikoKG4lMTApKycwJyk7CisgICAgICBpZiAobnVtYmVyW29mZnNldF0gIT0gJzAnKQorICAgICAgICAgIHBvc19zdHJpbmc9b2Zmc2V0OworICAgICAgbi89MTA7CisgICAgICBpZiAob2Zmc2V0PT0wKQorICAgICAgICAgIGJyZWFrOworICAgICAgb2Zmc2V0LS07CisgIH0KKyAgeworICAgICAgaW50IHNpemVfZGlzcGxheV9zdHJpbmcgPSAxOS1wb3Nfc3RyaW5nOworICAgICAgd2hpbGUgKHNpemVfY2hhciA+IHNpemVfZGlzcGxheV9zdHJpbmcpCisgICAgICB7CisgICAgICAgICAgc2l6ZV9jaGFyLS07CisgICAgICAgICAgcHJpbnRmKCIgIik7CisgICAgICB9CisgIH0KKworICBwcmludGYoIiVzIiwmbnVtYmVyW3Bvc19zdHJpbmddKTsKK30KKworaW50IGRvX2xpc3QodWYpCisgICAgdW56RmlsZSB1ZjsKK3sKKyAgICB1TG9uZyBpOworICAgIHVuel9nbG9iYWxfaW5mbzY0IGdpOworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSB1bnpHZXRHbG9iYWxJbmZvNjQodWYsJmdpKTsKKyAgICBpZiAoZXJyIT1VTlpfT0spCisgICAgICAgIHByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuekdldEdsb2JhbEluZm8gXG4iLGVycik7CisgICAgcHJpbnRmKCIgIExlbmd0aCAgTWV0aG9kICAgICBTaXplIFJhdGlvICAgRGF0ZSAgICBUaW1lICAgQ1JDLTMyICAgICBOYW1lXG4iKTsKKyAgICBwcmludGYoIiAgLS0tLS0tICAtLS0tLS0gICAgIC0tLS0gLS0tLS0gICAtLS0tICAgIC0tLS0gICAtLS0tLS0gICAgIC0tLS1cbiIpOworICAgIGZvciAoaT0wO2k8Z2kubnVtYmVyX2VudHJ5O2krKykKKyAgICB7CisgICAgICAgIGNoYXIgZmlsZW5hbWVfaW56aXBbMjU2XTsKKyAgICAgICAgdW56X2ZpbGVfaW5mbzY0IGZpbGVfaW5mbzsKKyAgICAgICAgdUxvbmcgcmF0aW89MDsKKyAgICAgICAgY29uc3QgY2hhciAqc3RyaW5nX21ldGhvZDsKKyAgICAgICAgY2hhciBjaGFyQ3J5cHQ9JyAnOworICAgICAgICBlcnIgPSB1bnpHZXRDdXJyZW50RmlsZUluZm82NCh1ZiwmZmlsZV9pbmZvLGZpbGVuYW1lX2luemlwLHNpemVvZihmaWxlbmFtZV9pbnppcCksTlVMTCwwLE5VTEwsMCk7CisgICAgICAgIGlmIChlcnIhPVVOWl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCJlcnJvciAlZCB3aXRoIHppcGZpbGUgaW4gdW56R2V0Q3VycmVudEZpbGVJbmZvXG4iLGVycik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmlsZV9pbmZvLnVuY29tcHJlc3NlZF9zaXplPjApCisgICAgICAgICAgICByYXRpbyA9ICh1TG9uZykoKGZpbGVfaW5mby5jb21wcmVzc2VkX3NpemUqMTAwKS9maWxlX2luZm8udW5jb21wcmVzc2VkX3NpemUpOworCisgICAgICAgIC8qIGRpc3BsYXkgYSAnKicgaWYgdGhlIGZpbGUgaXMgY3J5cHRlZCAqLworICAgICAgICBpZiAoKGZpbGVfaW5mby5mbGFnICYgMSkgIT0gMCkKKyAgICAgICAgICAgIGNoYXJDcnlwdD0nKic7CisKKyAgICAgICAgaWYgKGZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2Q9PTApCisgICAgICAgICAgICBzdHJpbmdfbWV0aG9kPSJTdG9yZWQiOworICAgICAgICBlbHNlCisgICAgICAgIGlmIChmaWxlX2luZm8uY29tcHJlc3Npb25fbWV0aG9kPT1aX0RFRkxBVEVEKQorICAgICAgICB7CisgICAgICAgICAgICB1SW50IGlMZXZlbD0odUludCkoKGZpbGVfaW5mby5mbGFnICYgMHg2KS8yKTsKKyAgICAgICAgICAgIGlmIChpTGV2ZWw9PTApCisgICAgICAgICAgICAgIHN0cmluZ19tZXRob2Q9IkRlZmw6TiI7CisgICAgICAgICAgICBlbHNlIGlmIChpTGV2ZWw9PTEpCisgICAgICAgICAgICAgIHN0cmluZ19tZXRob2Q9IkRlZmw6WCI7CisgICAgICAgICAgICBlbHNlIGlmICgoaUxldmVsPT0yKSB8fCAoaUxldmVsPT0zKSkKKyAgICAgICAgICAgICAgc3RyaW5nX21ldGhvZD0iRGVmbDpGIjsgLyogMjpmYXN0ICwgMyA6IGV4dHJhIGZhc3QqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgaWYgKGZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2Q9PVpfQlpJUDJFRCkKKyAgICAgICAgeworICAgICAgICAgICAgICBzdHJpbmdfbWV0aG9kPSJCWmlwMiAiOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0cmluZ19tZXRob2Q9IlVua24uICI7CisKKyAgICAgICAgRGlzcGxheTY0Qml0c1NpemUoZmlsZV9pbmZvLnVuY29tcHJlc3NlZF9zaXplLDcpOworICAgICAgICBwcmludGYoIiAgJTZzJWMiLHN0cmluZ19tZXRob2QsY2hhckNyeXB0KTsKKyAgICAgICAgRGlzcGxheTY0Qml0c1NpemUoZmlsZV9pbmZvLmNvbXByZXNzZWRfc2l6ZSw3KTsKKyAgICAgICAgcHJpbnRmKCIgJTNsdSUlICAlMi4ybHUtJTIuMmx1LSUyLjJsdSAgJTIuMmx1OiUyLjJsdSAgJTguOGx4ICAgJXNcbiIsCisgICAgICAgICAgICAgICAgcmF0aW8sCisgICAgICAgICAgICAgICAgKHVMb25nKWZpbGVfaW5mby50bXVfZGF0ZS50bV9tb24gKyAxLAorICAgICAgICAgICAgICAgICh1TG9uZylmaWxlX2luZm8udG11X2RhdGUudG1fbWRheSwKKyAgICAgICAgICAgICAgICAodUxvbmcpZmlsZV9pbmZvLnRtdV9kYXRlLnRtX3llYXIgJSAxMDAsCisgICAgICAgICAgICAgICAgKHVMb25nKWZpbGVfaW5mby50bXVfZGF0ZS50bV9ob3VyLCh1TG9uZylmaWxlX2luZm8udG11X2RhdGUudG1fbWluLAorICAgICAgICAgICAgICAgICh1TG9uZylmaWxlX2luZm8uY3JjLGZpbGVuYW1lX2luemlwKTsKKyAgICAgICAgaWYgKChpKzEpPGdpLm51bWJlcl9lbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gdW56R29Ub05leHRGaWxlKHVmKTsKKyAgICAgICAgICAgIGlmIChlcnIhPVVOWl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpHb1RvTmV4dEZpbGVcbiIsZXJyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKK2ludCBkb19leHRyYWN0X2N1cnJlbnRmaWxlKHVmLHBvcHRfZXh0cmFjdF93aXRob3V0X3BhdGgscG9wdF9vdmVyd3JpdGUscGFzc3dvcmQpCisgICAgdW56RmlsZSB1ZjsKKyAgICBjb25zdCBpbnQqIHBvcHRfZXh0cmFjdF93aXRob3V0X3BhdGg7CisgICAgaW50KiBwb3B0X292ZXJ3cml0ZTsKKyAgICBjb25zdCBjaGFyKiBwYXNzd29yZDsKK3sKKyAgICBjaGFyIGZpbGVuYW1lX2luemlwWzI1Nl07CisgICAgY2hhciogZmlsZW5hbWVfd2l0aG91dHBhdGg7CisgICAgY2hhciogcDsKKyAgICBpbnQgZXJyPVVOWl9PSzsKKyAgICBGSUxFICpmb3V0PU5VTEw7CisgICAgdm9pZCogYnVmOworICAgIHVJbnQgc2l6ZV9idWY7CisKKyAgICB1bnpfZmlsZV9pbmZvNjQgZmlsZV9pbmZvOworICAgIHVMb25nIHJhdGlvPTA7CisgICAgZXJyID0gdW56R2V0Q3VycmVudEZpbGVJbmZvNjQodWYsJmZpbGVfaW5mbyxmaWxlbmFtZV9pbnppcCxzaXplb2YoZmlsZW5hbWVfaW56aXApLE5VTEwsMCxOVUxMLDApOworCisgICAgaWYgKGVyciE9VU5aX09LKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJlcnJvciAlZCB3aXRoIHppcGZpbGUgaW4gdW56R2V0Q3VycmVudEZpbGVJbmZvXG4iLGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgc2l6ZV9idWYgPSBXUklURUJVRkZFUlNJWkU7CisgICAgYnVmID0gKHZvaWQqKW1hbGxvYyhzaXplX2J1Zik7CisgICAgaWYgKGJ1Zj09TlVMTCkKKyAgICB7CisgICAgICAgIHByaW50ZigiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnlcbiIpOworICAgICAgICByZXR1cm4gVU5aX0lOVEVSTkFMRVJST1I7CisgICAgfQorCisgICAgcCA9IGZpbGVuYW1lX3dpdGhvdXRwYXRoID0gZmlsZW5hbWVfaW56aXA7CisgICAgd2hpbGUgKCgqcCkgIT0gJ1wwJykKKyAgICB7CisgICAgICAgIGlmICgoKCpwKT09Jy8nKSB8fCAoKCpwKT09J1xcJykpCisgICAgICAgICAgICBmaWxlbmFtZV93aXRob3V0cGF0aCA9IHArMTsKKyAgICAgICAgcCsrOworICAgIH0KKworICAgIGlmICgoKmZpbGVuYW1lX3dpdGhvdXRwYXRoKT09J1wwJykKKyAgICB7CisgICAgICAgIGlmICgoKnBvcHRfZXh0cmFjdF93aXRob3V0X3BhdGgpPT0wKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoImNyZWF0aW5nIGRpcmVjdG9yeTogJXNcbiIsZmlsZW5hbWVfaW56aXApOworICAgICAgICAgICAgbXlta2RpcihmaWxlbmFtZV9pbnppcCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29uc3QgY2hhciogd3JpdGVfZmlsZW5hbWU7CisgICAgICAgIGludCBza2lwPTA7CisKKyAgICAgICAgaWYgKCgqcG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aCk9PTApCisgICAgICAgICAgICB3cml0ZV9maWxlbmFtZSA9IGZpbGVuYW1lX2luemlwOworICAgICAgICBlbHNlCisgICAgICAgICAgICB3cml0ZV9maWxlbmFtZSA9IGZpbGVuYW1lX3dpdGhvdXRwYXRoOworCisgICAgICAgIGVyciA9IHVuek9wZW5DdXJyZW50RmlsZVBhc3N3b3JkKHVmLHBhc3N3b3JkKTsKKyAgICAgICAgaWYgKGVyciE9VU5aX09LKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpPcGVuQ3VycmVudEZpbGVQYXNzd29yZFxuIixlcnIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCgoKnBvcHRfb3ZlcndyaXRlKT09MCkgJiYgKGVycj09VU5aX09LKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciByZXA9MDsKKyAgICAgICAgICAgIEZJTEUqIGZ0ZXN0ZXhpc3Q7CisgICAgICAgICAgICBmdGVzdGV4aXN0ID0gRk9QRU5fRlVOQyh3cml0ZV9maWxlbmFtZSwicmIiKTsKKyAgICAgICAgICAgIGlmIChmdGVzdGV4aXN0IT1OVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZjbG9zZShmdGVzdGV4aXN0KTsKKyAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBhbnN3ZXJbMTI4XTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJldDsKKworICAgICAgICAgICAgICAgICAgICBwcmludGYoIlRoZSBmaWxlICVzIGV4aXN0cy4gT3ZlcndyaXRlID8gW3ldZXMsIFtuXW8sIFtBXWxsOiAiLHdyaXRlX2ZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gc2NhbmYoIiUxcyIsYW5zd2VyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXAgPSBhbnN3ZXJbMF0gOworICAgICAgICAgICAgICAgICAgICBpZiAoKHJlcD49J2EnKSAmJiAocmVwPD0neicpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVwIC09IDB4MjA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlICgocmVwIT0nWScpICYmIChyZXAhPSdOJykgJiYgKHJlcCE9J0EnKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChyZXAgPT0gJ04nKQorICAgICAgICAgICAgICAgIHNraXAgPSAxOworCisgICAgICAgICAgICBpZiAocmVwID09ICdBJykKKyAgICAgICAgICAgICAgICAqcG9wdF9vdmVyd3JpdGU9MTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoc2tpcD09MCkgJiYgKGVycj09VU5aX09LKSkKKyAgICAgICAgeworICAgICAgICAgICAgZm91dD1GT1BFTl9GVU5DKHdyaXRlX2ZpbGVuYW1lLCJ3YiIpOworICAgICAgICAgICAgLyogc29tZSB6aXBmaWxlIGRvbid0IGNvbnRhaW4gZGlyZWN0b3J5IGFsb25lIGJlZm9yZSBmaWxlICovCisgICAgICAgICAgICBpZiAoKGZvdXQ9PU5VTEwpICYmICgoKnBvcHRfZXh0cmFjdF93aXRob3V0X3BhdGgpPT0wKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZW5hbWVfd2l0aG91dHBhdGghPShjaGFyKilmaWxlbmFtZV9pbnppcCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciBjPSooZmlsZW5hbWVfd2l0aG91dHBhdGgtMSk7CisgICAgICAgICAgICAgICAgKihmaWxlbmFtZV93aXRob3V0cGF0aC0xKT0nXDAnOworICAgICAgICAgICAgICAgIG1ha2VkaXIod3JpdGVfZmlsZW5hbWUpOworICAgICAgICAgICAgICAgICooZmlsZW5hbWVfd2l0aG91dHBhdGgtMSk9YzsKKyAgICAgICAgICAgICAgICBmb3V0PUZPUEVOX0ZVTkMod3JpdGVfZmlsZW5hbWUsIndiIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3V0PT1OVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3Igb3BlbmluZyAlc1xuIix3cml0ZV9maWxlbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm91dCE9TlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCIgZXh0cmFjdGluZzogJXNcbiIsd3JpdGVfZmlsZW5hbWUpOworCisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVyciA9IHVuelJlYWRDdXJyZW50RmlsZSh1ZixidWYsc2l6ZV9idWYpOworICAgICAgICAgICAgICAgIGlmIChlcnI8MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuelJlYWRDdXJyZW50RmlsZVxuIixlcnIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGVycj4wKQorICAgICAgICAgICAgICAgICAgICBpZiAoZndyaXRlKGJ1ZixlcnIsMSxmb3V0KSE9MSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciBpbiB3cml0aW5nIGV4dHJhY3RlZCBmaWxlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKGVycj4wKTsKKyAgICAgICAgICAgIGlmIChmb3V0KQorICAgICAgICAgICAgICAgICAgICBmY2xvc2UoZm91dCk7CisKKyAgICAgICAgICAgIGlmIChlcnI9PTApCisgICAgICAgICAgICAgICAgY2hhbmdlX2ZpbGVfZGF0ZSh3cml0ZV9maWxlbmFtZSxmaWxlX2luZm8uZG9zRGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfaW5mby50bXVfZGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyPT1VTlpfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IHVuekNsb3NlQ3VycmVudEZpbGUgKHVmKTsKKyAgICAgICAgICAgIGlmIChlcnIhPVVOWl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpDbG9zZUN1cnJlbnRGaWxlXG4iLGVycik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdW56Q2xvc2VDdXJyZW50RmlsZSh1Zik7IC8qIGRvbid0IGxvc2UgdGhlIGVycm9yICovCisgICAgfQorCisgICAgZnJlZShidWYpOworICAgIHJldHVybiBlcnI7Cit9CisKKworaW50IGRvX2V4dHJhY3QodWYsb3B0X2V4dHJhY3Rfd2l0aG91dF9wYXRoLG9wdF9vdmVyd3JpdGUscGFzc3dvcmQpCisgICAgdW56RmlsZSB1ZjsKKyAgICBpbnQgb3B0X2V4dHJhY3Rfd2l0aG91dF9wYXRoOworICAgIGludCBvcHRfb3ZlcndyaXRlOworICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkOworeworICAgIHVMb25nIGk7CisgICAgdW56X2dsb2JhbF9pbmZvNjQgZ2k7CisgICAgaW50IGVycjsKKyAgICBGSUxFKiBmb3V0PU5VTEw7CisKKyAgICBlcnIgPSB1bnpHZXRHbG9iYWxJbmZvNjQodWYsJmdpKTsKKyAgICBpZiAoZXJyIT1VTlpfT0spCisgICAgICAgIHByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuekdldEdsb2JhbEluZm8gXG4iLGVycik7CisKKyAgICBmb3IgKGk9MDtpPGdpLm51bWJlcl9lbnRyeTtpKyspCisgICAgeworICAgICAgICBpZiAoZG9fZXh0cmFjdF9jdXJyZW50ZmlsZSh1Ziwmb3B0X2V4dHJhY3Rfd2l0aG91dF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B0X292ZXJ3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQpICE9IFVOWl9PSykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmICgoaSsxKTxnaS5udW1iZXJfZW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IHVuekdvVG9OZXh0RmlsZSh1Zik7CisgICAgICAgICAgICBpZiAoZXJyIT1VTlpfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciAlZCB3aXRoIHppcGZpbGUgaW4gdW56R29Ub05leHRGaWxlXG4iLGVycik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGRvX2V4dHJhY3Rfb25lZmlsZSh1ZixmaWxlbmFtZSxvcHRfZXh0cmFjdF93aXRob3V0X3BhdGgsb3B0X292ZXJ3cml0ZSxwYXNzd29yZCkKKyAgICB1bnpGaWxlIHVmOworICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lOworICAgIGludCBvcHRfZXh0cmFjdF93aXRob3V0X3BhdGg7CisgICAgaW50IG9wdF9vdmVyd3JpdGU7CisgICAgY29uc3QgY2hhciogcGFzc3dvcmQ7Cit7CisgICAgaW50IGVyciA9IFVOWl9PSzsKKyAgICBpZiAodW56TG9jYXRlRmlsZSh1ZixmaWxlbmFtZSxDQVNFU0VOU0lUSVZJVFkpIT1VTlpfT0spCisgICAgeworICAgICAgICBwcmludGYoImZpbGUgJXMgbm90IGZvdW5kIGluIHRoZSB6aXBmaWxlXG4iLGZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorCisgICAgaWYgKGRvX2V4dHJhY3RfY3VycmVudGZpbGUodWYsJm9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wdF9vdmVyd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkKSA9PSBVTlpfT0spCisgICAgICAgIHJldHVybiAwOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDE7Cit9CisKKworaW50IG1haW4oYXJnYyxhcmd2KQorICAgIGludCBhcmdjOworICAgIGNoYXIgKmFyZ3ZbXTsKK3sKKyAgICBjb25zdCBjaGFyICp6aXBmaWxlbmFtZT1OVUxMOworICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX3RvX2V4dHJhY3Q9TlVMTDsKKyAgICBjb25zdCBjaGFyICpwYXNzd29yZD1OVUxMOworICAgIGNoYXIgZmlsZW5hbWVfdHJ5W01BWEZJTEVOQU1FKzE2XSA9ICIiOworICAgIGludCBpOworICAgIGludCByZXRfdmFsdWU9MDsKKyAgICBpbnQgb3B0X2RvX2xpc3Q9MDsKKyAgICBpbnQgb3B0X2RvX2V4dHJhY3Q9MTsKKyAgICBpbnQgb3B0X2RvX2V4dHJhY3Rfd2l0aG91dHBhdGg9MDsKKyAgICBpbnQgb3B0X292ZXJ3cml0ZT0wOworICAgIGludCBvcHRfZXh0cmFjdGRpcj0wOworICAgIGNvbnN0IGNoYXIgKmRpcm5hbWU9TlVMTDsKKyAgICB1bnpGaWxlIHVmPU5VTEw7CisKKyAgICBkb19iYW5uZXIoKTsKKyAgICBpZiAoYXJnYz09MSkKKyAgICB7CisgICAgICAgIGRvX2hlbHAoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaT0xO2k8YXJnYztpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoKmFyZ3ZbaV0pPT0nLScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcD1hcmd2W2ldKzE7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoKCpwKSE9J1wwJykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgYz0qKHArKyk7OworICAgICAgICAgICAgICAgICAgICBpZiAoKGM9PSdsJykgfHwgKGM9PSdMJykpCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRfZG9fbGlzdCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmICgoYz09J3YnKSB8fCAoYz09J1YnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9kb19saXN0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjPT0neCcpIHx8IChjPT0nWCcpKQorICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2RvX2V4dHJhY3QgPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoKGM9PSdlJykgfHwgKGM9PSdFJykpCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRfZG9fZXh0cmFjdCA9IG9wdF9kb19leHRyYWN0X3dpdGhvdXRwYXRoID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjPT0nbycpIHx8IChjPT0nTycpKQorICAgICAgICAgICAgICAgICAgICAgICAgb3B0X292ZXJ3cml0ZT0xOworICAgICAgICAgICAgICAgICAgICBpZiAoKGM9PSdkJykgfHwgKGM9PSdEJykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9leHRyYWN0ZGlyPTE7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXJuYW1lPWFyZ3ZbaSsxXTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICgoKGM9PSdwJykgfHwgKGM9PSdQJykpICYmIChpKzE8YXJnYykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkPWFyZ3ZbaSsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoemlwZmlsZW5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgemlwZmlsZW5hbWUgPSBhcmd2W2ldOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKChmaWxlbmFtZV90b19leHRyYWN0PT1OVUxMKSAmJiAoIW9wdF9leHRyYWN0ZGlyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX3RvX2V4dHJhY3QgPSBhcmd2W2ldIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh6aXBmaWxlbmFtZSE9TlVMTCkKKyAgICB7CisKKyMgICAgICAgIGlmZGVmIFVTRVdJTjMySU9BUEkKKyAgICAgICAgemxpYl9maWxlZnVuYzY0X2RlZiBmZnVuYzsKKyMgICAgICAgIGVuZGlmCisKKyAgICAgICAgc3RybmNweShmaWxlbmFtZV90cnksIHppcGZpbGVuYW1lLE1BWEZJTEVOQU1FLTEpOworICAgICAgICAvKiBzdHJuY3B5IGRvZXNudCBhcHBlbmQgdGhlIHRyYWlsaW5nIE5VTEwsIG9mIHRoZSBzdHJpbmcgaXMgdG9vIGxvbmcuICovCisgICAgICAgIGZpbGVuYW1lX3RyeVsgTUFYRklMRU5BTUUgXSA9ICdcMCc7CisKKyMgICAgICAgIGlmZGVmIFVTRVdJTjMySU9BUEkKKyAgICAgICAgZmlsbF93aW4zMl9maWxlZnVuYzY0QSgmZmZ1bmMpOworICAgICAgICB1ZiA9IHVuek9wZW4yXzY0KHppcGZpbGVuYW1lLCZmZnVuYyk7CisjICAgICAgICBlbHNlCisgICAgICAgIHVmID0gdW56T3BlbjY0KHppcGZpbGVuYW1lKTsKKyMgICAgICAgIGVuZGlmCisgICAgICAgIGlmICh1Zj09TlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyY2F0KGZpbGVuYW1lX3RyeSwiLnppcCIpOworIyAgICAgICAgICAgIGlmZGVmIFVTRVdJTjMySU9BUEkKKyAgICAgICAgICAgIHVmID0gdW56T3BlbjJfNjQoZmlsZW5hbWVfdHJ5LCZmZnVuYyk7CisjICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdWYgPSB1bnpPcGVuNjQoZmlsZW5hbWVfdHJ5KTsKKyMgICAgICAgICAgICBlbmRpZgorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHVmPT1OVUxMKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJDYW5ub3Qgb3BlbiAlcyBvciAlcy56aXBcbiIsemlwZmlsZW5hbWUsemlwZmlsZW5hbWUpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcHJpbnRmKCIlcyBvcGVuZWRcbiIsZmlsZW5hbWVfdHJ5KTsKKworICAgIGlmIChvcHRfZG9fbGlzdD09MSkKKyAgICAgICAgcmV0X3ZhbHVlID0gZG9fbGlzdCh1Zik7CisgICAgZWxzZSBpZiAob3B0X2RvX2V4dHJhY3Q9PTEpCisgICAgeworI2lmZGVmIF9XSU4zMgorICAgICAgICBpZiAob3B0X2V4dHJhY3RkaXIgJiYgX2NoZGlyKGRpcm5hbWUpKQorI2Vsc2UKKyAgICAgICAgaWYgKG9wdF9leHRyYWN0ZGlyICYmIGNoZGlyKGRpcm5hbWUpKQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYoIkVycm9yIGNoYW5naW5nIGludG8gJXMsIGFib3J0aW5nXG4iLCBkaXJuYW1lKTsKKyAgICAgICAgICBleGl0KC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWxlbmFtZV90b19leHRyYWN0ID09IE5VTEwpCisgICAgICAgICAgICByZXRfdmFsdWUgPSBkb19leHRyYWN0KHVmLCBvcHRfZG9fZXh0cmFjdF93aXRob3V0cGF0aCwgb3B0X292ZXJ3cml0ZSwgcGFzc3dvcmQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXRfdmFsdWUgPSBkb19leHRyYWN0X29uZWZpbGUodWYsIGZpbGVuYW1lX3RvX2V4dHJhY3QsIG9wdF9kb19leHRyYWN0X3dpdGhvdXRwYXRoLCBvcHRfb3ZlcndyaXRlLCBwYXNzd29yZCk7CisgICAgfQorCisgICAgdW56Q2xvc2UodWYpOworCisgICAgcmV0dXJuIHJldF92YWx1ZTsKK30KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvbWluaXppcC9taW5pdW56aXAuMSBiL3psaWIvc3JjL2NvbnRyaWIvbWluaXppcC9taW5pdW56aXAuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTFhYzY5Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9taW5pemlwL21pbml1bnppcC4xCkBAIC0wLDAgKzEsNjMgQEAKKy5cIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGV5LCBFTUFDUzogLSotIG5yb2ZmIC0qLQorLlRIIG1pbml1bnppcCAxICJOb3YgNywgMjAwMSIKKy5cIiBQbGVhc2UgYWRqdXN0IHRoaXMgZGF0ZSB3aGVuZXZlciByZXZpc2luZyB0aGUgbWFucGFnZS4KKy5cIgorLlwiIFNvbWUgcm9mZiBtYWNyb3MsIGZvciByZWZlcmVuY2U6CisuXCIgLm5oICAgICAgICBkaXNhYmxlIGh5cGhlbmF0aW9uCisuXCIgLmh5ICAgICAgICBlbmFibGUgaHlwaGVuYXRpb24KKy5cIiAuYWQgbCAgICAgIGxlZnQganVzdGlmeQorLlwiIC5hZCBiICAgICAganVzdGlmeSB0byBib3RoIGxlZnQgYW5kIHJpZ2h0IG1hcmdpbnMKKy5cIiAubmYgICAgICAgIGRpc2FibGUgZmlsbGluZworLlwiIC5maSAgICAgICAgZW5hYmxlIGZpbGxpbmcKKy5cIiAuYnIgICAgICAgIGluc2VydCBsaW5lIGJyZWFrCisuXCIgLnNwIDxuPiAgICBpbnNlcnQgbisxIGVtcHR5IGxpbmVzCisuXCIgZm9yIG1hbnBhZ2Utc3BlY2lmaWMgbWFjcm9zLCBzZWUgbWFuKDcpCisuU0ggTkFNRQorbWluaXVuemlwIC0gdW5jb21wcmVzcyBhbmQgZXhhbWluZSBaSVAgYXJjaGl2ZXMKKy5TSCBTWU5PUFNJUworLkIgbWluaXVuemlwCisuUkkgWyAtZXh2bG8gXQoremlwZmlsZSBbIGZpbGVzX3RvX2V4dHJhY3QgXSBbLWQgdGVtcGRpcl0KKy5TSCBERVNDUklQVElPTgorLkIgbWluaXppcAoraXMgYSBzaW1wbGUgdG9vbCB3aGljaCBhbGxvd3MgdGhlIGV4dHJhY3Rpb24gb2YgY29tcHJlc3NlZCBmaWxlCithcmNoaXZlcyBpbiB0aGUgWklQIGZvcm1hdCB1c2VkIGJ5IHRoZSBNUy1ET1MgdXRpbGl0eSBQS1pJUC4gIEl0IHdhcword3JpdHRlbiBhcyBhIGRlbW9uc3RyYXRpb24gb2YgdGhlCisuSVIgemxpYiAoMykKK2xpYnJhcnkgYW5kIHRoZXJlZm9yZSBsYWNrIG1hbnkgb2YgdGhlIGZlYXR1cmVzIG9mIHRoZQorLklSIHVuemlwICgxKQorcHJvZ3JhbS4KKy5TSCBPUFRJT05TCitBIG51bWJlciBvZiBvcHRpb25zIGFyZSBzdXBwb3J0ZWQuICBXaXRoIHRoZSBleGNlcHRpb24gb2YKKy5CSSBcLWRcICB0ZW1wZGlyCit0aGVzZSBtdXN0IGJlIHN1cHBsaWVkIGJlZm9yZSBhbnkKK290aGVyIGFyZ3VtZW50cyBhbmQgYXJlOgorLlRQCisuQkkgXC1sXCAsXCBcLVwtdgorTGlzdCB0aGUgZmlsZXMgaW4gdGhlIGFyY2hpdmUgd2l0aG91dCBleHRyYWN0aW5nIHRoZW0uCisuVFAKKy5CIFwtbworT3ZlcndyaXRlIGZpbGVzIHdpdGhvdXQgcHJvbXB0aW5nIGZvciBjb25maXJtYXRpb24uCisuVFAKKy5CIFwteAorRXh0cmFjdCBmaWxlcyAoZGVmYXVsdCkuCisuUFAKK1RoZQorLkkgemlwZmlsZQorYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIGFyY2hpdmUgdG8gcHJvY2Vzcy4gVGhlIG5leHQgYXJndW1lbnQgY2FuIGJlIHVzZWQKK3RvIHNwZWNpZnkgYSBzaW5nbGUgZmlsZSB0byBleHRyYWN0IGZyb20gdGhlIGFyY2hpdmUuCisKK0xhc3RseSwgdGhlIGZvbGxvd2luZyBvcHRpb24gY2FuIGJlIHNwZWNpZmllZCBhdCB0aGUgZW5kIG9mIHRoZSBjb21tYW5kLWxpbmU6CisuVFAKKy5CSSBcLWRcICB0ZW1wZGlyCitFeHRyYWN0IHRoZSBhcmNoaXZlIGluIHRoZSBkaXJlY3RvcnkKKy5JIHRlbXBkaXIKK3JhdGhlciB0aGFuIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKy5TSCBTRUUgQUxTTworLkJSIG1pbml6aXAgKDEpLAorLkJSIHpsaWIgKDMpLAorLkJSIHVuemlwICgxKS4KKy5TSCBBVVRIT1IKK1RoaXMgcHJvZ3JhbSB3YXMgd3JpdHRlbiBieSBHaWxsZXMgVm9sbGFudC4gIFRoaXMgbWFudWFsIHBhZ2Ugd2FzCit3cml0dGVuIGJ5IE1hcmsgQnJvd24gPGJyb29uaWVAc2lyZW5hLm9yZy51az4uIFRoZSAtZCB0ZW1wZGlyIG9wdGlvbgord2FzIGFkZGVkIGJ5IERpcmsgRWRkZWxidWV0dGVsIDxlZGRAZGViaWFuLm9yZz4uCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL21pbml6aXAvbWluaXppcC4xIGIvemxpYi9zcmMvY29udHJpYi9taW5pemlwL21pbml6aXAuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTU0NDg0Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9taW5pemlwL21pbml6aXAuMQpAQCAtMCwwICsxLDQ2IEBACisuXCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhleSwgRU1BQ1M6IC0qLSBucm9mZiAtKi0KKy5USCBtaW5pemlwIDEgIk1heSAyLCAyMDAxIgorLlwiIFBsZWFzZSBhZGp1c3QgdGhpcyBkYXRlIHdoZW5ldmVyIHJldmlzaW5nIHRoZSBtYW5wYWdlLgorLlwiCisuXCIgU29tZSByb2ZmIG1hY3JvcywgZm9yIHJlZmVyZW5jZToKKy5cIiAubmggICAgICAgIGRpc2FibGUgaHlwaGVuYXRpb24KKy5cIiAuaHkgICAgICAgIGVuYWJsZSBoeXBoZW5hdGlvbgorLlwiIC5hZCBsICAgICAgbGVmdCBqdXN0aWZ5CisuXCIgLmFkIGIgICAgICBqdXN0aWZ5IHRvIGJvdGggbGVmdCBhbmQgcmlnaHQgbWFyZ2lucworLlwiIC5uZiAgICAgICAgZGlzYWJsZSBmaWxsaW5nCisuXCIgLmZpICAgICAgICBlbmFibGUgZmlsbGluZworLlwiIC5iciAgICAgICAgaW5zZXJ0IGxpbmUgYnJlYWsKKy5cIiAuc3AgPG4+ICAgIGluc2VydCBuKzEgZW1wdHkgbGluZXMKKy5cIiBmb3IgbWFucGFnZS1zcGVjaWZpYyBtYWNyb3MsIHNlZSBtYW4oNykKKy5TSCBOQU1FCittaW5pemlwIC0gY3JlYXRlIFpJUCBhcmNoaXZlcworLlNIIFNZTk9QU0lTCisuQiBtaW5pemlwCisuUkkgWyAtbyBdCit6aXBmaWxlIFsgIiBmaWxlcyIgLi4uIF0KKy5TSCBERVNDUklQVElPTgorLkIgbWluaXppcAoraXMgYSBzaW1wbGUgdG9vbCB3aGljaCBhbGxvd3MgdGhlIGNyZWF0aW9uIG9mIGNvbXByZXNzZWQgZmlsZSBhcmNoaXZlcworaW4gdGhlIFpJUCBmb3JtYXQgdXNlZCBieSB0aGUgTVMtRE9TIHV0aWxpdHkgUEtaSVAuICBJdCB3YXMgd3JpdHRlbiBhcworYSBkZW1vbnN0cmF0aW9uIG9mIHRoZQorLklSIHpsaWIgKDMpCitsaWJyYXJ5IGFuZCB0aGVyZWZvcmUgbGFjayBtYW55IG9mIHRoZSBmZWF0dXJlcyBvZiB0aGUKKy5JUiB6aXAgKDEpCitwcm9ncmFtLgorLlNIIE9QVElPTlMKK1RoZSBmaXJzdCBhcmd1bWVudCBzdXBwbGllZCBpcyB0aGUgbmFtZSBvZiB0aGUgWklQIGFyY2hpdmUgdG8gY3JlYXRlIG9yCisuUkkgLW8KK2luIHdoaWNoIGNhc2UgaXQgaXMgaWdub3JlZCBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCB0cmVhdGVkIGFzIHRoZQorbmFtZSBvZiB0aGUgWklQIGZpbGUuICBJZiB0aGUgWklQIGZpbGUgYWxyZWFkeSBleGlzdHMgaXQgd2lsbCBiZQorb3ZlcndyaXR0ZW4uCisuUFAKK1N1YnNlcXVlbnQgYXJndW1lbnRzIHNwZWNpZnkgYSBsaXN0IG9mIGZpbGVzIHRvIHBsYWNlIGluIHRoZSBaSVAKK2FyY2hpdmUuICBJZiBub25lIGFyZSBzcGVjaWZpZWQgdGhlbiBhbiBlbXB0eSBhcmNoaXZlIHdpbGwgYmUgY3JlYXRlZC4KKy5TSCBTRUUgQUxTTworLkJSIG1pbml1bnppcCAoMSksCisuQlIgemxpYiAoMyksCisuQlIgemlwICgxKS4KKy5TSCBBVVRIT1IKK1RoaXMgcHJvZ3JhbSB3YXMgd3JpdHRlbiBieSBHaWxsZXMgVm9sbGFudC4gIFRoaXMgbWFudWFsIHBhZ2Ugd2FzCit3cml0dGVuIGJ5IE1hcmsgQnJvd24gPGJyb29uaWVAc2lyZW5hLm9yZy51az4uCisKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvbWluaXppcC9taW5pemlwLmMgYi96bGliL3NyYy9jb250cmliL21pbml6aXAvbWluaXppcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyODg5NjIKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL21pbml6aXAvbWluaXppcC5jCkBAIC0wLDAgKzEsNTIwIEBACisvKgorICAgbWluaXppcC5jCisgICBWZXJzaW9uIDEuMSwgRmVicnVhcnkgMTRoLCAyMDEwCisgICBzYW1wbGUgcGFydCBvZiB0aGUgTWluaVppcCBwcm9qZWN0IC0gKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCisKKyAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDEwIEdpbGxlcyBWb2xsYW50IChtaW5pemlwKSAoIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvbWluaXppcC5odG1sICkKKworICAgICAgICAgTW9kaWZpY2F0aW9ucyBvZiBVbnppcCBmb3IgWmlwNjQKKyAgICAgICAgIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEV2ZW4gUm91YXVsdAorCisgICAgICAgICBNb2RpZmljYXRpb25zIGZvciBaaXA2NCBzdXBwb3J0IG9uIGJvdGggemlwIGFuZCB1bnppcAorICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTWF0aGlhcyBTdmVuc3NvbiAoIGh0dHA6Ly9yZXN1bHQ0Mi5jb20gKQorKi8KKworCisjaWYgKCFkZWZpbmVkKF9XSU4zMikpICYmICghZGVmaW5lZChXSU4zMikpICYmICghZGVmaW5lZChfX0FQUExFX18pKQorICAgICAgICAjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyAgICAgICAgICAgICAgICAjZGVmaW5lIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyAgICAgICAgI2VuZGlmCisgICAgICAgICNpZm5kZWYgX19VU0VfTEFSR0VGSUxFNjQKKyAgICAgICAgICAgICAgICAjZGVmaW5lIF9fVVNFX0xBUkdFRklMRTY0CisgICAgICAgICNlbmRpZgorICAgICAgICAjaWZuZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UKKyAgICAgICAgICAgICAgICAjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UKKyAgICAgICAgI2VuZGlmCisgICAgICAgICNpZm5kZWYgX0ZJTEVfT0ZGU0VUX0JJVAorICAgICAgICAgICAgICAgICNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVCA2NAorICAgICAgICAjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19BUFBMRV9fCisvLyBJbiBkYXJ3aW4gYW5kIHBlcmhhcHMgb3RoZXIgQlNEIHZhcmlhbnRzIG9mZl90IGlzIGEgNjQgYml0IHZhbHVlLCBoZW5jZSBubyBuZWVkIGZvciBzcGVjaWZpYyA2NCBiaXQgZnVuY3Rpb25zCisjZGVmaW5lIEZPUEVOX0ZVTkMoZmlsZW5hbWUsIG1vZGUpIGZvcGVuKGZpbGVuYW1lLCBtb2RlKQorI2RlZmluZSBGVEVMTE9fRlVOQyhzdHJlYW0pIGZ0ZWxsbyhzdHJlYW0pCisjZGVmaW5lIEZTRUVLT19GVU5DKHN0cmVhbSwgb2Zmc2V0LCBvcmlnaW4pIGZzZWVrbyhzdHJlYW0sIG9mZnNldCwgb3JpZ2luKQorI2Vsc2UKKyNkZWZpbmUgRk9QRU5fRlVOQyhmaWxlbmFtZSwgbW9kZSkgZm9wZW42NChmaWxlbmFtZSwgbW9kZSkKKyNkZWZpbmUgRlRFTExPX0ZVTkMoc3RyZWFtKSBmdGVsbG82NChzdHJlYW0pCisjZGVmaW5lIEZTRUVLT19GVU5DKHN0cmVhbSwgb2Zmc2V0LCBvcmlnaW4pIGZzZWVrbzY0KHN0cmVhbSwgb2Zmc2V0LCBvcmlnaW4pCisjZW5kaWYKKworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpZmRlZiBfV0lOMzIKKyMgaW5jbHVkZSA8ZGlyZWN0Lmg+CisjIGluY2x1ZGUgPGlvLmg+CisjZWxzZQorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaW5jbHVkZSA8dXRpbWUuaD4KKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgInppcC5oIgorCisjaWZkZWYgX1dJTjMyCisgICAgICAgICNkZWZpbmUgVVNFV0lOMzJJT0FQSQorICAgICAgICAjaW5jbHVkZSAiaW93aW4zMi5oIgorI2VuZGlmCisKKworCisjZGVmaW5lIFdSSVRFQlVGRkVSU0laRSAoMTYzODQpCisjZGVmaW5lIE1BWEZJTEVOQU1FICgyNTYpCisKKyNpZmRlZiBfV0lOMzIKK3VMb25nIGZpbGV0aW1lKGYsIHRtemlwLCBkdCkKKyAgICBjaGFyICpmOyAgICAgICAgICAgICAgICAvKiBuYW1lIG9mIGZpbGUgdG8gZ2V0IGluZm8gb24gKi8KKyAgICB0bV96aXAgKnRtemlwOyAgICAgICAgICAgICAvKiByZXR1cm4gdmFsdWU6IGFjY2VzcywgbW9kaWZpYy4gYW5kIGNyZWF0aW9uIHRpbWVzICovCisgICAgdUxvbmcgKmR0OyAgICAgICAgICAgICAvKiBkb3N0aW1lICovCit7CisgIGludCByZXQgPSAwOworICB7CisgICAgICBGSUxFVElNRSBmdExvY2FsOworICAgICAgSEFORExFIGhGaW5kOworICAgICAgV0lOMzJfRklORF9EQVRBQSBmZjMyOworCisgICAgICBoRmluZCA9IEZpbmRGaXJzdEZpbGVBKGYsJmZmMzIpOworICAgICAgaWYgKGhGaW5kICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgeworICAgICAgICBGaWxlVGltZVRvTG9jYWxGaWxlVGltZSgmKGZmMzIuZnRMYXN0V3JpdGVUaW1lKSwmZnRMb2NhbCk7CisgICAgICAgIEZpbGVUaW1lVG9Eb3NEYXRlVGltZSgmZnRMb2NhbCwoKExQV09SRClkdCkrMSwoKExQV09SRClkdCkrMCk7CisgICAgICAgIEZpbmRDbG9zZShoRmluZCk7CisgICAgICAgIHJldCA9IDE7CisgICAgICB9CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKyNlbHNlCisjaWZkZWYgdW5peCB8fCBfX0FQUExFX18KK3VMb25nIGZpbGV0aW1lKGYsIHRtemlwLCBkdCkKKyAgICBjaGFyICpmOyAgICAgICAgICAgICAgIC8qIG5hbWUgb2YgZmlsZSB0byBnZXQgaW5mbyBvbiAqLworICAgIHRtX3ppcCAqdG16aXA7ICAgICAgICAgLyogcmV0dXJuIHZhbHVlOiBhY2Nlc3MsIG1vZGlmaWMuIGFuZCBjcmVhdGlvbiB0aW1lcyAqLworICAgIHVMb25nICpkdDsgICAgICAgICAgICAgLyogZG9zdGltZSAqLworeworICBpbnQgcmV0PTA7CisgIHN0cnVjdCBzdGF0IHM7ICAgICAgICAvKiByZXN1bHRzIG9mIHN0YXQoKSAqLworICBzdHJ1Y3QgdG0qIGZpbGVkYXRlOworICB0aW1lX3QgdG1fdD0wOworCisgIGlmIChzdHJjbXAoZiwiLSIpIT0wKQorICB7CisgICAgY2hhciBuYW1lW01BWEZJTEVOQU1FKzFdOworICAgIGludCBsZW4gPSBzdHJsZW4oZik7CisgICAgaWYgKGxlbiA+IE1BWEZJTEVOQU1FKQorICAgICAgbGVuID0gTUFYRklMRU5BTUU7CisKKyAgICBzdHJuY3B5KG5hbWUsIGYsTUFYRklMRU5BTUUtMSk7CisgICAgLyogc3RybmNweSBkb2VzbnQgYXBwZW5kIHRoZSB0cmFpbGluZyBOVUxMLCBvZiB0aGUgc3RyaW5nIGlzIHRvbyBsb25nLiAqLworICAgIG5hbWVbIE1BWEZJTEVOQU1FIF0gPSAnXDAnOworCisgICAgaWYgKG5hbWVbbGVuIC0gMV0gPT0gJy8nKQorICAgICAgbmFtZVtsZW4gLSAxXSA9ICdcMCc7CisgICAgLyogbm90IGFsbCBzeXN0ZW1zIGFsbG93IHN0YXQnaW5nIGEgZmlsZSB3aXRoIC8gYXBwZW5kZWQgKi8KKyAgICBpZiAoc3RhdChuYW1lLCZzKT09MCkKKyAgICB7CisgICAgICB0bV90ID0gcy5zdF9tdGltZTsKKyAgICAgIHJldCA9IDE7CisgICAgfQorICB9CisgIGZpbGVkYXRlID0gbG9jYWx0aW1lKCZ0bV90KTsKKworICB0bXppcC0+dG1fc2VjICA9IGZpbGVkYXRlLT50bV9zZWM7CisgIHRtemlwLT50bV9taW4gID0gZmlsZWRhdGUtPnRtX21pbjsKKyAgdG16aXAtPnRtX2hvdXIgPSBmaWxlZGF0ZS0+dG1faG91cjsKKyAgdG16aXAtPnRtX21kYXkgPSBmaWxlZGF0ZS0+dG1fbWRheTsKKyAgdG16aXAtPnRtX21vbiAgPSBmaWxlZGF0ZS0+dG1fbW9uIDsKKyAgdG16aXAtPnRtX3llYXIgPSBmaWxlZGF0ZS0+dG1feWVhcjsKKworICByZXR1cm4gcmV0OworfQorI2Vsc2UKK3VMb25nIGZpbGV0aW1lKGYsIHRtemlwLCBkdCkKKyAgICBjaGFyICpmOyAgICAgICAgICAgICAgICAvKiBuYW1lIG9mIGZpbGUgdG8gZ2V0IGluZm8gb24gKi8KKyAgICB0bV96aXAgKnRtemlwOyAgICAgICAgICAgICAvKiByZXR1cm4gdmFsdWU6IGFjY2VzcywgbW9kaWZpYy4gYW5kIGNyZWF0aW9uIHRpbWVzICovCisgICAgdUxvbmcgKmR0OyAgICAgICAgICAgICAvKiBkb3N0aW1lICovCit7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNlbmRpZgorCisKKworCitpbnQgY2hlY2tfZXhpc3RfZmlsZShmaWxlbmFtZSkKKyAgICBjb25zdCBjaGFyKiBmaWxlbmFtZTsKK3sKKyAgICBGSUxFKiBmdGVzdGV4aXN0OworICAgIGludCByZXQgPSAxOworICAgIGZ0ZXN0ZXhpc3QgPSBGT1BFTl9GVU5DKGZpbGVuYW1lLCJyYiIpOworICAgIGlmIChmdGVzdGV4aXN0PT1OVUxMKQorICAgICAgICByZXQgPSAwOworICAgIGVsc2UKKyAgICAgICAgZmNsb3NlKGZ0ZXN0ZXhpc3QpOworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgZG9fYmFubmVyKCkKK3sKKyAgICBwcmludGYoIk1pbmlaaXAgMS4xLCBkZW1vIG9mIHpMaWIgKyBNaW5pWmlwNjQgcGFja2FnZSwgd3JpdHRlbiBieSBHaWxsZXMgVm9sbGFudFxuIik7CisgICAgcHJpbnRmKCJtb3JlIGluZm8gb24gTWluaVppcCBhdCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbFxuXG4iKTsKK30KKwordm9pZCBkb19oZWxwKCkKK3sKKyAgICBwcmludGYoIlVzYWdlIDogbWluaXppcCBbLW9dIFstYV0gWy0wIHRvIC05XSBbLXAgcGFzc3dvcmRdIFstal0gZmlsZS56aXAgW2ZpbGVzX3RvX2FkZF1cblxuIiBcCisgICAgICAgICAgICIgIC1vICBPdmVyd3JpdGUgZXhpc3RpbmcgZmlsZS56aXBcbiIgXAorICAgICAgICAgICAiICAtYSAgQXBwZW5kIHRvIGV4aXN0aW5nIGZpbGUuemlwXG4iIFwKKyAgICAgICAgICAgIiAgLTAgIFN0b3JlIG9ubHlcbiIgXAorICAgICAgICAgICAiICAtMSAgQ29tcHJlc3MgZmFzdGVyXG4iIFwKKyAgICAgICAgICAgIiAgLTkgIENvbXByZXNzIGJldHRlclxuXG4iIFwKKyAgICAgICAgICAgIiAgLWogIGV4Y2x1ZGUgcGF0aC4gc3RvcmUgb25seSB0aGUgZmlsZSBuYW1lLlxuXG4iKTsKK30KKworLyogY2FsY3VsYXRlIHRoZSBDUkMzMiBvZiBhIGZpbGUsCisgICBiZWNhdXNlIHRvIGVuY3J5cHQgYSBmaWxlLCB3ZSBuZWVkIGtub3duIHRoZSBDUkMzMiBvZiB0aGUgZmlsZSBiZWZvcmUgKi8KK2ludCBnZXRGaWxlQ3JjKGNvbnN0IGNoYXIqIGZpbGVuYW1laW56aXAsdm9pZCpidWYsdW5zaWduZWQgbG9uZyBzaXplX2J1Zix1bnNpZ25lZCBsb25nKiByZXN1bHRfY3JjKQoreworICAgdW5zaWduZWQgbG9uZyBjYWxjdWxhdGVfY3JjPTA7CisgICBpbnQgZXJyPVpJUF9PSzsKKyAgIEZJTEUgKiBmaW4gPSBGT1BFTl9GVU5DKGZpbGVuYW1laW56aXAsInJiIik7CisKKyAgIHVuc2lnbmVkIGxvbmcgc2l6ZV9yZWFkID0gMDsKKyAgIHVuc2lnbmVkIGxvbmcgdG90YWxfcmVhZCA9IDA7CisgICBpZiAoZmluPT1OVUxMKQorICAgeworICAgICAgIGVyciA9IFpJUF9FUlJOTzsKKyAgIH0KKworICAgIGlmIChlcnIgPT0gWklQX09LKQorICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSBaSVBfT0s7CisgICAgICAgICAgICBzaXplX3JlYWQgPSAoaW50KWZyZWFkKGJ1ZiwxLHNpemVfYnVmLGZpbik7CisgICAgICAgICAgICBpZiAoc2l6ZV9yZWFkIDwgc2l6ZV9idWYpCisgICAgICAgICAgICAgICAgaWYgKGZlb2YoZmluKT09MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGYoImVycm9yIGluIHJlYWRpbmcgJXNcbiIsZmlsZW5hbWVpbnppcCk7CisgICAgICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2l6ZV9yZWFkPjApCisgICAgICAgICAgICAgICAgY2FsY3VsYXRlX2NyYyA9IGNyYzMyKGNhbGN1bGF0ZV9jcmMsYnVmLHNpemVfcmVhZCk7CisgICAgICAgICAgICB0b3RhbF9yZWFkICs9IHNpemVfcmVhZDsKKworICAgICAgICB9IHdoaWxlICgoZXJyID09IFpJUF9PSykgJiYgKHNpemVfcmVhZD4wKSk7CisKKyAgICBpZiAoZmluKQorICAgICAgICBmY2xvc2UoZmluKTsKKworICAgICpyZXN1bHRfY3JjPWNhbGN1bGF0ZV9jcmM7CisgICAgcHJpbnRmKCJmaWxlICVzIGNyYyAlbHhcbiIsIGZpbGVuYW1laW56aXAsIGNhbGN1bGF0ZV9jcmMpOworICAgIHJldHVybiBlcnI7Cit9CisKK2ludCBpc0xhcmdlRmlsZShjb25zdCBjaGFyKiBmaWxlbmFtZSkKK3sKKyAgaW50IGxhcmdlRmlsZSA9IDA7CisgIFpQT1M2NF9UIHBvcyA9IDA7CisgIEZJTEUqIHBGaWxlID0gRk9QRU5fRlVOQyhmaWxlbmFtZSwgInJiIik7CisKKyAgaWYocEZpbGUgIT0gTlVMTCkKKyAgeworICAgIGludCBuID0gRlNFRUtPX0ZVTkMocEZpbGUsIDAsIFNFRUtfRU5EKTsKKyAgICBwb3MgPSBGVEVMTE9fRlVOQyhwRmlsZSk7CisKKyAgICAgICAgICAgICAgICBwcmludGYoIkZpbGUgOiAlcyBpcyAlbGxkIGJ5dGVzXG4iLCBmaWxlbmFtZSwgcG9zKTsKKworICAgIGlmKHBvcyA+PSAweGZmZmZmZmZmKQorICAgICBsYXJnZUZpbGUgPSAxOworCisgICAgICAgICAgICAgICAgZmNsb3NlKHBGaWxlKTsKKyAgfQorCisgcmV0dXJuIGxhcmdlRmlsZTsKK30KKworaW50IG1haW4oYXJnYyxhcmd2KQorICAgIGludCBhcmdjOworICAgIGNoYXIgKmFyZ3ZbXTsKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgb3B0X292ZXJ3cml0ZT0wOworICAgIGludCBvcHRfY29tcHJlc3NfbGV2ZWw9Wl9ERUZBVUxUX0NPTVBSRVNTSU9OOworICAgIGludCBvcHRfZXhjbHVkZV9wYXRoPTA7CisgICAgaW50IHppcGZpbGVuYW1lYXJnID0gMDsKKyAgICBjaGFyIGZpbGVuYW1lX3RyeVtNQVhGSUxFTkFNRSsxNl07CisgICAgaW50IHppcG9rOworICAgIGludCBlcnI9MDsKKyAgICBpbnQgc2l6ZV9idWY9MDsKKyAgICB2b2lkKiBidWY9TlVMTDsKKyAgICBjb25zdCBjaGFyKiBwYXNzd29yZD1OVUxMOworCisKKyAgICBkb19iYW5uZXIoKTsKKyAgICBpZiAoYXJnYz09MSkKKyAgICB7CisgICAgICAgIGRvX2hlbHAoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaT0xO2k8YXJnYztpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoKmFyZ3ZbaV0pPT0nLScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcD1hcmd2W2ldKzE7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoKCpwKSE9J1wwJykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgYz0qKHArKyk7OworICAgICAgICAgICAgICAgICAgICBpZiAoKGM9PSdvJykgfHwgKGM9PSdPJykpCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRfb3ZlcndyaXRlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjPT0nYScpIHx8IChjPT0nQScpKQorICAgICAgICAgICAgICAgICAgICAgICAgb3B0X292ZXJ3cml0ZSA9IDI7CisgICAgICAgICAgICAgICAgICAgIGlmICgoYz49JzAnKSAmJiAoYzw9JzknKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9jb21wcmVzc19sZXZlbCA9IGMtJzAnOworICAgICAgICAgICAgICAgICAgICBpZiAoKGM9PSdqJykgfHwgKGM9PSdKJykpCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRfZXhjbHVkZV9wYXRoID0gMTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoKChjPT0ncCcpIHx8IChjPT0nUCcpKSAmJiAoaSsxPGFyZ2MpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZD1hcmd2W2krMV07CisgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHppcGZpbGVuYW1lYXJnID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6aXBmaWxlbmFtZWFyZyA9IGkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHNpemVfYnVmID0gV1JJVEVCVUZGRVJTSVpFOworICAgIGJ1ZiA9ICh2b2lkKiltYWxsb2Moc2l6ZV9idWYpOworICAgIGlmIChidWY9PU5VTEwpCisgICAgeworICAgICAgICBwcmludGYoIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5XG4iKTsKKyAgICAgICAgcmV0dXJuIFpJUF9JTlRFUk5BTEVSUk9SOworICAgIH0KKworICAgIGlmICh6aXBmaWxlbmFtZWFyZz09MCkKKyAgICB7CisgICAgICAgIHppcG9rPTA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGludCBpLGxlbjsKKyAgICAgICAgaW50IGRvdF9mb3VuZD0wOworCisgICAgICAgIHppcG9rID0gMSA7CisgICAgICAgIHN0cm5jcHkoZmlsZW5hbWVfdHJ5LCBhcmd2W3ppcGZpbGVuYW1lYXJnXSxNQVhGSUxFTkFNRS0xKTsKKyAgICAgICAgLyogc3RybmNweSBkb2VzbnQgYXBwZW5kIHRoZSB0cmFpbGluZyBOVUxMLCBvZiB0aGUgc3RyaW5nIGlzIHRvbyBsb25nLiAqLworICAgICAgICBmaWxlbmFtZV90cnlbIE1BWEZJTEVOQU1FIF0gPSAnXDAnOworCisgICAgICAgIGxlbj0oaW50KXN0cmxlbihmaWxlbmFtZV90cnkpOworICAgICAgICBmb3IgKGk9MDtpPGxlbjtpKyspCisgICAgICAgICAgICBpZiAoZmlsZW5hbWVfdHJ5W2ldPT0nLicpCisgICAgICAgICAgICAgICAgZG90X2ZvdW5kPTE7CisKKyAgICAgICAgaWYgKGRvdF9mb3VuZD09MCkKKyAgICAgICAgICAgIHN0cmNhdChmaWxlbmFtZV90cnksIi56aXAiKTsKKworICAgICAgICBpZiAob3B0X292ZXJ3cml0ZT09MikKKyAgICAgICAgeworICAgICAgICAgICAgLyogaWYgdGhlIGZpbGUgZG9uJ3QgZXhpc3QsIHdlIG5vdCBhcHBlbmQgZmlsZSAqLworICAgICAgICAgICAgaWYgKGNoZWNrX2V4aXN0X2ZpbGUoZmlsZW5hbWVfdHJ5KT09MCkKKyAgICAgICAgICAgICAgICBvcHRfb3ZlcndyaXRlPTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICBpZiAob3B0X292ZXJ3cml0ZT09MCkKKyAgICAgICAgICAgIGlmIChjaGVja19leGlzdF9maWxlKGZpbGVuYW1lX3RyeSkhPTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciByZXA9MDsKKyAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBhbnN3ZXJbMTI4XTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJldDsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJUaGUgZmlsZSAlcyBleGlzdHMuIE92ZXJ3cml0ZSA/IFt5XWVzLCBbbl1vLCBbYV1wcGVuZCA6ICIsZmlsZW5hbWVfdHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gc2NhbmYoIiUxcyIsYW5zd2VyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXAgPSBhbnN3ZXJbMF0gOworICAgICAgICAgICAgICAgICAgICBpZiAoKHJlcD49J2EnKSAmJiAocmVwPD0neicpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVwIC09IDB4MjA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlICgocmVwIT0nWScpICYmIChyZXAhPSdOJykgJiYgKHJlcCE9J0EnKSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcD09J04nKQorICAgICAgICAgICAgICAgICAgICB6aXBvayA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHJlcD09J0EnKQorICAgICAgICAgICAgICAgICAgICBvcHRfb3ZlcndyaXRlID0gMjsKKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoemlwb2s9PTEpCisgICAgeworICAgICAgICB6aXBGaWxlIHpmOworICAgICAgICBpbnQgZXJyY2xvc2U7CisjICAgICAgICBpZmRlZiBVU0VXSU4zMklPQVBJCisgICAgICAgIHpsaWJfZmlsZWZ1bmM2NF9kZWYgZmZ1bmM7CisgICAgICAgIGZpbGxfd2luMzJfZmlsZWZ1bmM2NEEoJmZmdW5jKTsKKyAgICAgICAgemYgPSB6aXBPcGVuMl82NChmaWxlbmFtZV90cnksKG9wdF9vdmVyd3JpdGU9PTIpID8gMiA6IDAsTlVMTCwmZmZ1bmMpOworIyAgICAgICAgZWxzZQorICAgICAgICB6ZiA9IHppcE9wZW42NChmaWxlbmFtZV90cnksKG9wdF9vdmVyd3JpdGU9PTIpID8gMiA6IDApOworIyAgICAgICAgZW5kaWYKKworICAgICAgICBpZiAoemYgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCJlcnJvciBvcGVuaW5nICVzXG4iLGZpbGVuYW1lX3RyeSk7CisgICAgICAgICAgICBlcnI9IFpJUF9FUlJOTzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYoImNyZWF0aW5nICVzXG4iLGZpbGVuYW1lX3RyeSk7CisKKyAgICAgICAgZm9yIChpPXppcGZpbGVuYW1lYXJnKzE7KGk8YXJnYykgJiYgKGVycj09WklQX09LKTtpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghKCgoKCooYXJndltpXSkpPT0nLScpIHx8ICgoKihhcmd2W2ldKSk9PScvJykpICYmCisgICAgICAgICAgICAgICAgICAoKGFyZ3ZbaV1bMV09PSdvJykgfHwgKGFyZ3ZbaV1bMV09PSdPJykgfHwKKyAgICAgICAgICAgICAgICAgICAoYXJndltpXVsxXT09J2EnKSB8fCAoYXJndltpXVsxXT09J0EnKSB8fAorICAgICAgICAgICAgICAgICAgIChhcmd2W2ldWzFdPT0ncCcpIHx8IChhcmd2W2ldWzFdPT0nUCcpIHx8CisgICAgICAgICAgICAgICAgICAgKChhcmd2W2ldWzFdPj0nMCcpIHx8IChhcmd2W2ldWzFdPD0nOScpKSkgJiYKKyAgICAgICAgICAgICAgICAgIChzdHJsZW4oYXJndltpXSkgPT0gMikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZJTEUgKiBmaW47CisgICAgICAgICAgICAgICAgaW50IHNpemVfcmVhZDsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZWluemlwID0gYXJndltpXTsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzYXZlZmlsZW5hbWVpbnppcDsKKyAgICAgICAgICAgICAgICB6aXBfZmlsZWluZm8gemk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjcmNGaWxlPTA7CisgICAgICAgICAgICAgICAgaW50IHppcDY0ID0gMDsKKworICAgICAgICAgICAgICAgIHppLnRtel9kYXRlLnRtX3NlYyA9IHppLnRtel9kYXRlLnRtX21pbiA9IHppLnRtel9kYXRlLnRtX2hvdXIgPQorICAgICAgICAgICAgICAgIHppLnRtel9kYXRlLnRtX21kYXkgPSB6aS50bXpfZGF0ZS50bV9tb24gPSB6aS50bXpfZGF0ZS50bV95ZWFyID0gMDsKKyAgICAgICAgICAgICAgICB6aS5kb3NEYXRlID0gMDsKKyAgICAgICAgICAgICAgICB6aS5pbnRlcm5hbF9mYSA9IDA7CisgICAgICAgICAgICAgICAgemkuZXh0ZXJuYWxfZmEgPSAwOworICAgICAgICAgICAgICAgIGZpbGV0aW1lKGZpbGVuYW1laW56aXAsJnppLnRtel9kYXRlLCZ6aS5kb3NEYXRlKTsKKworLyoKKyAgICAgICAgICAgICAgICBlcnIgPSB6aXBPcGVuTmV3RmlsZUluWmlwKHpmLGZpbGVuYW1laW56aXAsJnppLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwwLE5VTEwsMCxOVUxMIC8gKiBjb21tZW50ICogLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRfY29tcHJlc3NfbGV2ZWwgIT0gMCkgPyBaX0RFRkxBVEVEIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9jb21wcmVzc19sZXZlbCk7CisqLworICAgICAgICAgICAgICAgIGlmICgocGFzc3dvcmQgIT0gTlVMTCkgJiYgKGVycj09WklQX09LKSkKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gZ2V0RmlsZUNyYyhmaWxlbmFtZWluemlwLGJ1ZixzaXplX2J1ZiwmY3JjRmlsZSk7CisKKyAgICAgICAgICAgICAgICB6aXA2NCA9IGlzTGFyZ2VGaWxlKGZpbGVuYW1laW56aXApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgcGF0aCBuYW1lIHNhdmVkLCBzaG91bGQgbm90IGluY2x1ZGUgYSBsZWFkaW5nIHNsYXNoLiAqLworICAgICAgICAgICAgICAgLyppZiBpdCBkaWQsIHdpbmRvd3MveHAgYW5kIGR5bmF6aXAgY291bGRuJ3QgcmVhZCB0aGUgemlwIGZpbGUuICovCisgICAgICAgICAgICAgICAgIHNhdmVmaWxlbmFtZWluemlwID0gZmlsZW5hbWVpbnppcDsKKyAgICAgICAgICAgICAgICAgd2hpbGUoIHNhdmVmaWxlbmFtZWluemlwWzBdID09ICdcXCcgfHwgc2F2ZWZpbGVuYW1laW56aXBbMF0gPT0gJy8nICkKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgc2F2ZWZpbGVuYW1laW56aXArKzsKKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgIC8qc2hvdWxkIHRoZSB6aXAgZmlsZSBjb250YWluIGFueSBwYXRoIGF0IGFsbD8qLworICAgICAgICAgICAgICAgICBpZiggb3B0X2V4Y2x1ZGVfcGF0aCApCisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRtcHB0cjsKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxhc3RzbGFzaCA9IDA7CisgICAgICAgICAgICAgICAgICAgICBmb3IoIHRtcHB0ciA9IHNhdmVmaWxlbmFtZWluemlwOyAqdG1wcHRyOyB0bXBwdHIrKykKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiggKnRtcHB0ciA9PSAnXFwnIHx8ICp0bXBwdHIgPT0gJy8nKQorICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdHNsYXNoID0gdG1wcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIGlmKCBsYXN0c2xhc2ggIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWZpbGVuYW1laW56aXAgPSBsYXN0c2xhc2grMTsgLy8gYmFzZSBmaWxlbmFtZSBmb2xsb3dzIGxhc3Qgc2xhc2guCisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAvKiovCisgICAgICAgICAgICAgICAgZXJyID0gemlwT3Blbk5ld0ZpbGVJblppcDNfNjQoemYsc2F2ZWZpbGVuYW1laW56aXAsJnppLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwwLE5VTEwsMCxOVUxMIC8qIGNvbW1lbnQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRfY29tcHJlc3NfbGV2ZWwgIT0gMCkgPyBaX0RFRkxBVEVEIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9jb21wcmVzc19sZXZlbCwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLU1BWF9XQklUUywgREVGX01FTV9MRVZFTCwgWl9ERUZBVUxUX1NUUkFURUdZLCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLU1BWF9XQklUUywgREVGX01FTV9MRVZFTCwgWl9ERUZBVUxUX1NUUkFURUdZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQsY3JjRmlsZSwgemlwNjQpOworCisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBaSVBfT0spCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgaW4gb3BlbmluZyAlcyBpbiB6aXBmaWxlXG4iLGZpbGVuYW1laW56aXApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpbiA9IEZPUEVOX0ZVTkMoZmlsZW5hbWVpbnppcCwicmIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbj09TlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyPVpJUF9FUlJOTzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgaW4gb3BlbmluZyAlcyBmb3IgcmVhZGluZ1xuIixmaWxlbmFtZWluemlwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gWklQX09LKQorICAgICAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBaSVBfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3JlYWQgPSAoaW50KWZyZWFkKGJ1ZiwxLHNpemVfYnVmLGZpbik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZV9yZWFkIDwgc2l6ZV9idWYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZlb2YoZmluKT09MCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImVycm9yIGluIHJlYWRpbmcgJXNcbiIsZmlsZW5hbWVpbnppcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZV9yZWFkPjApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gemlwV3JpdGVJbkZpbGVJblppcCAoemYsYnVmLHNpemVfcmVhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycjwwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciBpbiB3cml0aW5nICVzIGluIHRoZSB6aXBmaWxlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1laW56aXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgoZXJyID09IFpJUF9PSykgJiYgKHNpemVfcmVhZD4wKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZmluKQorICAgICAgICAgICAgICAgICAgICBmY2xvc2UoZmluKTsKKworICAgICAgICAgICAgICAgIGlmIChlcnI8MCkKKyAgICAgICAgICAgICAgICAgICAgZXJyPVpJUF9FUlJOTzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSB6aXBDbG9zZUZpbGVJblppcCh6Zik7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIhPVpJUF9PSykKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgaW4gY2xvc2luZyAlcyBpbiB0aGUgemlwZmlsZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1laW56aXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlcnJjbG9zZSA9IHppcENsb3NlKHpmLE5VTEwpOworICAgICAgICBpZiAoZXJyY2xvc2UgIT0gWklQX09LKQorICAgICAgICAgICAgcHJpbnRmKCJlcnJvciBpbiBjbG9zaW5nICVzXG4iLGZpbGVuYW1lX3RyeSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgZG9faGVscCgpOworICAgIH0KKworICAgIGZyZWUoYnVmKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvbWluaXppcC9taW5pemlwLnBjLmluIGIvemxpYi9zcmMvY29udHJpYi9taW5pemlwL21pbml6aXAucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjliNWI3ZgotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvbWluaXppcC9taW5pemlwLnBjLmluCkBAIC0wLDAgKzEsMTIgQEAKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQC9taW5pemlwCisKK05hbWU6IG1pbml6aXAKK0Rlc2NyaXB0aW9uOiBNaW5pemlwIHppcCBmaWxlIG1hbmlwdWxhdGlvbiBsaWJyYXJ5CitSZXF1aXJlczoKK1ZlcnNpb246IEBQQUNLQUdFX1ZFUlNJT05ACitMaWJzOiAtTCR7bGliZGlyfSAtbG1pbml6aXAKK0xpYnMucHJpdmF0ZTogLWx6CitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9taW5pemlwL216dG9vbHMuYyBiL3psaWIvc3JjL2NvbnRyaWIvbWluaXppcC9tenRvb2xzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4OTFjMgotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvbWluaXppcC9tenRvb2xzLmMKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgIEFkZGl0aW9uYWwgdG9vbHMgZm9yIE1pbml6aXAKKyAgQ29kZTogWGF2aWVyIFJvY2hlICcyMDA0CisgIExpY2Vuc2U6IFNhbWUgYXMgWkxJQiAod3d3Lmd6aXAub3JnKQorKi8KKworLyogQ29kZSAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiemxpYi5oIgorI2luY2x1ZGUgInVuemlwLmgiCisKKyNkZWZpbmUgUkVBRF84KGFkcikgICgodW5zaWduZWQgY2hhcikqKGFkcikpCisjZGVmaW5lIFJFQURfMTYoYWRyKSAoIFJFQURfOChhZHIpIHwgKFJFQURfOChhZHIrMSkgPDwgOCkgKQorI2RlZmluZSBSRUFEXzMyKGFkcikgKCBSRUFEXzE2KGFkcikgfCAoUkVBRF8xNigoYWRyKSsyKSA8PCAxNikgKQorCisjZGVmaW5lIFdSSVRFXzgoYnVmZiwgbikgZG8geyBcCisgICooKHVuc2lnbmVkIGNoYXIqKShidWZmKSkgPSAodW5zaWduZWQgY2hhcikgKChuKSAmIDB4ZmYpOyBcCit9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFXzE2KGJ1ZmYsIG4pIGRvIHsgXAorICBXUklURV84KCh1bnNpZ25lZCBjaGFyKikoYnVmZiksIG4pOyBcCisgIFdSSVRFXzgoKCh1bnNpZ25lZCBjaGFyKikoYnVmZikpICsgMSwgKG4pID4+IDgpOyBcCit9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFXzMyKGJ1ZmYsIG4pIGRvIHsgXAorICBXUklURV8xNigodW5zaWduZWQgY2hhciopKGJ1ZmYpLCAobikgJiAweGZmZmYpOyBcCisgIFdSSVRFXzE2KCh1bnNpZ25lZCBjaGFyKikoYnVmZikgKyAyLCAobikgPj4gMTYpOyBcCit9IHdoaWxlKDApCisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpSZXBhaXIoZmlsZSwgZmlsZU91dCwgZmlsZU91dFRtcCwgblJlY292ZXJlZCwgYnl0ZXNSZWNvdmVyZWQpCitjb25zdCBjaGFyKiBmaWxlOworY29uc3QgY2hhciogZmlsZU91dDsKK2NvbnN0IGNoYXIqIGZpbGVPdXRUbXA7Cit1TG9uZyogblJlY292ZXJlZDsKK3VMb25nKiBieXRlc1JlY292ZXJlZDsKK3sKKyAgaW50IGVyciA9IFpfT0s7CisgIEZJTEUqIGZwWmlwID0gZm9wZW4oZmlsZSwgInJiIik7CisgIEZJTEUqIGZwT3V0ID0gZm9wZW4oZmlsZU91dCwgIndiIik7CisgIEZJTEUqIGZwT3V0Q0QgPSBmb3BlbihmaWxlT3V0VG1wLCAid2IiKTsKKyAgaWYgKGZwWmlwICE9IE5VTEwgJiYgIGZwT3V0ICE9IE5VTEwpIHsKKyAgICBpbnQgZW50cmllcyA9IDA7CisgICAgdUxvbmcgdG90YWxCeXRlcyA9IDA7CisgICAgY2hhciBoZWFkZXJbMzBdOworICAgIGNoYXIgZmlsZW5hbWVbMTAyNF07CisgICAgY2hhciBleHRyYVsxMDI0XTsKKyAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICBpbnQgb2Zmc2V0Q0QgPSAwOworICAgIHdoaWxlICggZnJlYWQoaGVhZGVyLCAxLCAzMCwgZnBaaXApID09IDMwICkgeworICAgICAgaW50IGN1cnJlbnRPZmZzZXQgPSBvZmZzZXQ7CisKKyAgICAgIC8qIEZpbGUgZW50cnkgKi8KKyAgICAgIGlmIChSRUFEXzMyKGhlYWRlcikgPT0gMHgwNDAzNGI1MCkgeworICAgICAgICB1bnNpZ25lZCBpbnQgdmVyc2lvbiA9IFJFQURfMTYoaGVhZGVyICsgNCk7CisgICAgICAgIHVuc2lnbmVkIGludCBncGZsYWcgPSBSRUFEXzE2KGhlYWRlciArIDYpOworICAgICAgICB1bnNpZ25lZCBpbnQgbWV0aG9kID0gUkVBRF8xNihoZWFkZXIgKyA4KTsKKyAgICAgICAgdW5zaWduZWQgaW50IGZpbGV0aW1lID0gUkVBRF8xNihoZWFkZXIgKyAxMCk7CisgICAgICAgIHVuc2lnbmVkIGludCBmaWxlZGF0ZSA9IFJFQURfMTYoaGVhZGVyICsgMTIpOworICAgICAgICB1bnNpZ25lZCBpbnQgY3JjID0gUkVBRF8zMihoZWFkZXIgKyAxNCk7IC8qIGNyYyAqLworICAgICAgICB1bnNpZ25lZCBpbnQgY3BzaXplID0gUkVBRF8zMihoZWFkZXIgKyAxOCk7IC8qIGNvbXByZXNzZWQgc2l6ZSAqLworICAgICAgICB1bnNpZ25lZCBpbnQgdW5jcHNpemUgPSBSRUFEXzMyKGhlYWRlciArIDIyKTsgLyogdW5jb21wcmVzc2VkIHN6ICovCisgICAgICAgIHVuc2lnbmVkIGludCBmbnNpemUgPSBSRUFEXzE2KGhlYWRlciArIDI2KTsgLyogZmlsZSBuYW1lIGxlbmd0aCAqLworICAgICAgICB1bnNpZ25lZCBpbnQgZXh0c2l6ZSA9IFJFQURfMTYoaGVhZGVyICsgMjgpOyAvKiBleHRyYSBmaWVsZCBsZW5ndGggKi8KKyAgICAgICAgZmlsZW5hbWVbMF0gPSBleHRyYVswXSA9ICdcMCc7CisKKyAgICAgICAgLyogSGVhZGVyICovCisgICAgICAgIGlmIChmd3JpdGUoaGVhZGVyLCAxLCAzMCwgZnBPdXQpID09IDMwKSB7CisgICAgICAgICAgb2Zmc2V0ICs9IDMwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGVyciA9IFpfRVJSTk87CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBGaWxlbmFtZSAqLworICAgICAgICBpZiAoZm5zaXplID4gMCkgeworICAgICAgICAgIGlmIChmbnNpemUgPCBzaXplb2YoZmlsZW5hbWUpKSB7CisgICAgICAgICAgICBpZiAoZnJlYWQoZmlsZW5hbWUsIDEsIGZuc2l6ZSwgZnBaaXApID09IGZuc2l6ZSkgeworICAgICAgICAgICAgICAgIGlmIChmd3JpdGUoZmlsZW5hbWUsIDEsIGZuc2l6ZSwgZnBPdXQpID09IGZuc2l6ZSkgeworICAgICAgICAgICAgICAgIG9mZnNldCArPSBmbnNpemU7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVyciA9IFpfRVJSTk87CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZXJyID0gWl9TVFJFQU1fRVJST1I7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBFeHRyYSBmaWVsZCAqLworICAgICAgICBpZiAoZXh0c2l6ZSA+IDApIHsKKyAgICAgICAgICBpZiAoZXh0c2l6ZSA8IHNpemVvZihleHRyYSkpIHsKKyAgICAgICAgICAgIGlmIChmcmVhZChleHRyYSwgMSwgZXh0c2l6ZSwgZnBaaXApID09IGV4dHNpemUpIHsKKyAgICAgICAgICAgICAgaWYgKGZ3cml0ZShleHRyYSwgMSwgZXh0c2l6ZSwgZnBPdXQpID09IGV4dHNpemUpIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gZXh0c2l6ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyciA9IFpfRVJSTk87CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGVyciA9IFpfRVJSTk87CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnIgPSBaX0VSUk5POworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogRGF0YSAqLworICAgICAgICB7CisgICAgICAgICAgaW50IGRhdGFTaXplID0gY3BzaXplOworICAgICAgICAgIGlmIChkYXRhU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICBkYXRhU2l6ZSA9IHVuY3BzaXplOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoZGF0YVNpemUgPiAwKSB7CisgICAgICAgICAgICBjaGFyKiBkYXRhID0gbWFsbG9jKGRhdGFTaXplKTsKKyAgICAgICAgICAgIGlmIChkYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgaWYgKChpbnQpZnJlYWQoZGF0YSwgMSwgZGF0YVNpemUsIGZwWmlwKSA9PSBkYXRhU2l6ZSkgeworICAgICAgICAgICAgICAgIGlmICgoaW50KWZ3cml0ZShkYXRhLCAxLCBkYXRhU2l6ZSwgZnBPdXQpID09IGRhdGFTaXplKSB7CisgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gZGF0YVNpemU7CisgICAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzICs9IGRhdGFTaXplOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBlcnIgPSBaX0VSUk5POworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBaX0VSUk5POworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGZyZWUoZGF0YSk7CisgICAgICAgICAgICAgIGlmIChlcnIgIT0gWl9PSykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBlcnIgPSBaX01FTV9FUlJPUjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ2VudHJhbCBkaXJlY3RvcnkgZW50cnkgKi8KKyAgICAgICAgeworICAgICAgICAgIGNoYXIgaGVhZGVyWzQ2XTsKKyAgICAgICAgICBjaGFyKiBjb21tZW50ID0gIiI7CisgICAgICAgICAgaW50IGNvbXNpemUgPSAoaW50KSBzdHJsZW4oY29tbWVudCk7CisgICAgICAgICAgV1JJVEVfMzIoaGVhZGVyLCAweDAyMDE0YjUwKTsKKyAgICAgICAgICBXUklURV8xNihoZWFkZXIgKyA0LCB2ZXJzaW9uKTsKKyAgICAgICAgICBXUklURV8xNihoZWFkZXIgKyA2LCB2ZXJzaW9uKTsKKyAgICAgICAgICBXUklURV8xNihoZWFkZXIgKyA4LCBncGZsYWcpOworICAgICAgICAgIFdSSVRFXzE2KGhlYWRlciArIDEwLCBtZXRob2QpOworICAgICAgICAgIFdSSVRFXzE2KGhlYWRlciArIDEyLCBmaWxldGltZSk7CisgICAgICAgICAgV1JJVEVfMTYoaGVhZGVyICsgMTQsIGZpbGVkYXRlKTsKKyAgICAgICAgICBXUklURV8zMihoZWFkZXIgKyAxNiwgY3JjKTsKKyAgICAgICAgICBXUklURV8zMihoZWFkZXIgKyAyMCwgY3BzaXplKTsKKyAgICAgICAgICBXUklURV8zMihoZWFkZXIgKyAyNCwgdW5jcHNpemUpOworICAgICAgICAgIFdSSVRFXzE2KGhlYWRlciArIDI4LCBmbnNpemUpOworICAgICAgICAgIFdSSVRFXzE2KGhlYWRlciArIDMwLCBleHRzaXplKTsKKyAgICAgICAgICBXUklURV8xNihoZWFkZXIgKyAzMiwgY29tc2l6ZSk7CisgICAgICAgICAgV1JJVEVfMTYoaGVhZGVyICsgMzQsIDApOyAgICAgLyogZGlzayAjICovCisgICAgICAgICAgV1JJVEVfMTYoaGVhZGVyICsgMzYsIDApOyAgICAgLyogaW50IGF0dHJiICovCisgICAgICAgICAgV1JJVEVfMzIoaGVhZGVyICsgMzgsIDApOyAgICAgLyogZXh0IGF0dHJiICovCisgICAgICAgICAgV1JJVEVfMzIoaGVhZGVyICsgNDIsIGN1cnJlbnRPZmZzZXQpOworICAgICAgICAgIC8qIEhlYWRlciAqLworICAgICAgICAgIGlmIChmd3JpdGUoaGVhZGVyLCAxLCA0NiwgZnBPdXRDRCkgPT0gNDYpIHsKKyAgICAgICAgICAgIG9mZnNldENEICs9IDQ2OworCisgICAgICAgICAgICAvKiBGaWxlbmFtZSAqLworICAgICAgICAgICAgaWYgKGZuc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgaWYgKGZ3cml0ZShmaWxlbmFtZSwgMSwgZm5zaXplLCBmcE91dENEKSA9PSBmbnNpemUpIHsKKyAgICAgICAgICAgICAgICBvZmZzZXRDRCArPSBmbnNpemU7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZXJyID0gWl9TVFJFQU1fRVJST1I7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBFeHRyYSBmaWVsZCAqLworICAgICAgICAgICAgaWYgKGV4dHNpemUgPiAwKSB7CisgICAgICAgICAgICAgIGlmIChmd3JpdGUoZXh0cmEsIDEsIGV4dHNpemUsIGZwT3V0Q0QpID09IGV4dHNpemUpIHsKKyAgICAgICAgICAgICAgICBvZmZzZXRDRCArPSBleHRzaXplOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyciA9IFpfRVJSTk87CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQ29tbWVudCBmaWVsZCAqLworICAgICAgICAgICAgaWYgKGNvbXNpemUgPiAwKSB7CisgICAgICAgICAgICAgIGlmICgoaW50KWZ3cml0ZShjb21tZW50LCAxLCBjb21zaXplLCBmcE91dENEKSA9PSBjb21zaXplKSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0Q0QgKz0gY29tc2l6ZTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBaX0VSUk5POworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnIgPSBaX0VSUk5POworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogU3VjY2VzcyAqLworICAgICAgICBlbnRyaWVzKys7CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIC8qIEZpbmFsIGNlbnRyYWwgZGlyZWN0b3J5ICAqLworICAgIHsKKyAgICAgIGludCBlbnRyaWVzWmlwID0gZW50cmllczsKKyAgICAgIGNoYXIgaGVhZGVyWzIyXTsKKyAgICAgIGNoYXIqIGNvbW1lbnQgPSAiIjsgLy8gIlpJUCBGaWxlIHJlY292ZXJlZCBieSB6bGliL21pbml6aXAvbXp0b29scyI7CisgICAgICBpbnQgY29tc2l6ZSA9IChpbnQpIHN0cmxlbihjb21tZW50KTsKKyAgICAgIGlmIChlbnRyaWVzWmlwID4gMHhmZmZmKSB7CisgICAgICAgIGVudHJpZXNaaXAgPSAweGZmZmY7CisgICAgICB9CisgICAgICBXUklURV8zMihoZWFkZXIsIDB4MDYwNTRiNTApOworICAgICAgV1JJVEVfMTYoaGVhZGVyICsgNCwgMCk7ICAgIC8qIGRpc2sgIyAqLworICAgICAgV1JJVEVfMTYoaGVhZGVyICsgNiwgMCk7ICAgIC8qIGRpc2sgIyAqLworICAgICAgV1JJVEVfMTYoaGVhZGVyICsgOCwgZW50cmllc1ppcCk7ICAgLyogaGFjayAqLworICAgICAgV1JJVEVfMTYoaGVhZGVyICsgMTAsIGVudHJpZXNaaXApOyAgLyogaGFjayAqLworICAgICAgV1JJVEVfMzIoaGVhZGVyICsgMTIsIG9mZnNldENEKTsgICAgLyogc2l6ZSBvZiBDRCAqLworICAgICAgV1JJVEVfMzIoaGVhZGVyICsgMTYsIG9mZnNldCk7ICAgICAgLyogb2Zmc2V0IHRvIENEICovCisgICAgICBXUklURV8xNihoZWFkZXIgKyAyMCwgY29tc2l6ZSk7ICAgICAvKiBjb21tZW50ICovCisKKyAgICAgIC8qIEhlYWRlciAqLworICAgICAgaWYgKGZ3cml0ZShoZWFkZXIsIDEsIDIyLCBmcE91dENEKSA9PSAyMikgeworCisgICAgICAgIC8qIENvbW1lbnQgZmllbGQgKi8KKyAgICAgICAgaWYgKGNvbXNpemUgPiAwKSB7CisgICAgICAgICAgaWYgKChpbnQpZndyaXRlKGNvbW1lbnQsIDEsIGNvbXNpemUsIGZwT3V0Q0QpICE9IGNvbXNpemUpIHsKKyAgICAgICAgICAgIGVyciA9IFpfRVJSTk87CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IFpfRVJSTk87CisgICAgICB9CisgICAgfQorCisgICAgLyogRmluYWwgbWVyZ2UgKGZpbGUgKyBjZW50cmFsIGRpcmVjdG9yeSkgKi8KKyAgICBmY2xvc2UoZnBPdXRDRCk7CisgICAgaWYgKGVyciA9PSBaX09LKSB7CisgICAgICBmcE91dENEID0gZm9wZW4oZmlsZU91dFRtcCwgInJiIik7CisgICAgICBpZiAoZnBPdXRDRCAhPSBOVUxMKSB7CisgICAgICAgIGludCBuUmVhZDsKKyAgICAgICAgY2hhciBidWZmZXJbODE5Ml07CisgICAgICAgIHdoaWxlICggKG5SZWFkID0gKGludClmcmVhZChidWZmZXIsIDEsIHNpemVvZihidWZmZXIpLCBmcE91dENEKSkgPiAwKSB7CisgICAgICAgICAgaWYgKChpbnQpZndyaXRlKGJ1ZmZlciwgMSwgblJlYWQsIGZwT3V0KSAhPSBuUmVhZCkgeworICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmY2xvc2UoZnBPdXRDRCk7CisgICAgICB9CisgICAgfQorCisgICAgLyogQ2xvc2UgKi8KKyAgICBmY2xvc2UoZnBaaXApOworICAgIGZjbG9zZShmcE91dCk7CisKKyAgICAvKiBXaXBlIHRlbXBvcmFyeSBmaWxlICovCisgICAgKHZvaWQpcmVtb3ZlKGZpbGVPdXRUbXApOworCisgICAgLyogTnVtYmVyIG9mIHJlY292ZXJlZCBlbnRyaWVzICovCisgICAgaWYgKGVyciA9PSBaX09LKSB7CisgICAgICBpZiAoblJlY292ZXJlZCAhPSBOVUxMKSB7CisgICAgICAgICpuUmVjb3ZlcmVkID0gZW50cmllczsKKyAgICAgIH0KKyAgICAgIGlmIChieXRlc1JlY292ZXJlZCAhPSBOVUxMKSB7CisgICAgICAgICpieXRlc1JlY292ZXJlZCA9IHRvdGFsQnl0ZXM7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGVyciA9IFpfU1RSRUFNX0VSUk9SOworICB9CisgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL21pbml6aXAvbXp0b29scy5oIGIvemxpYi9zcmMvY29udHJpYi9taW5pemlwL216dG9vbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDlhNDI2Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9taW5pemlwL216dG9vbHMuaApAQCAtMCwwICsxLDM3IEBACisvKgorICBBZGRpdGlvbmFsIHRvb2xzIGZvciBNaW5pemlwCisgIENvZGU6IFhhdmllciBSb2NoZSAnMjAwNAorICBMaWNlbnNlOiBTYW1lIGFzIFpMSUIgKHd3dy5nemlwLm9yZykKKyovCisKKyNpZm5kZWYgX3ppcF90b29sc19ICisjZGVmaW5lIF96aXBfdG9vbHNfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZm5kZWYgX1pMSUJfSAorI2luY2x1ZGUgInpsaWIuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAidW56aXAuaCIKKworLyogUmVwYWlyIGEgWklQIGZpbGUgKG1pc3NpbmcgY2VudHJhbCBkaXJlY3RvcnkpCisgICBmaWxlOiBmaWxlIHRvIHJlY292ZXIKKyAgIGZpbGVPdXQ6IG91dHB1dCBmaWxlIGFmdGVyIHJlY292ZXJ5CisgICBmaWxlT3V0VG1wOiB0ZW1wb3JhcnkgZmlsZSBuYW1lIHVzZWQgZm9yIHJlY292ZXJ5CisqLworZXh0ZXJuIGludCBaRVhQT1JUIHVuelJlcGFpcihjb25zdCBjaGFyKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlT3V0VG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyogblJlY292ZXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcqIGJ5dGVzUmVjb3ZlcmVkKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9taW5pemlwL3VuemlwLmMgYi96bGliL3NyYy9jb250cmliL21pbml6aXAvdW56aXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDkzNTA0Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9taW5pemlwL3VuemlwLmMKQEAgLTAsMCArMSwyMTI1IEBACisvKiB1bnppcC5jIC0tIElPIGZvciB1bmNvbXByZXNzIC56aXAgZmlsZXMgdXNpbmcgemxpYgorICAgVmVyc2lvbiAxLjEsIEZlYnJ1YXJ5IDE0aCwgMjAxMAorICAgcGFydCBvZiB0aGUgTWluaVppcCBwcm9qZWN0IC0gKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCisKKyAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDEwIEdpbGxlcyBWb2xsYW50IChtaW5pemlwKSAoIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvbWluaXppcC5odG1sICkKKworICAgICAgICAgTW9kaWZpY2F0aW9ucyBvZiBVbnppcCBmb3IgWmlwNjQKKyAgICAgICAgIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEV2ZW4gUm91YXVsdAorCisgICAgICAgICBNb2RpZmljYXRpb25zIGZvciBaaXA2NCBzdXBwb3J0IG9uIGJvdGggemlwIGFuZCB1bnppcAorICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTWF0aGlhcyBTdmVuc3NvbiAoIGh0dHA6Ly9yZXN1bHQ0Mi5jb20gKQorCisgICAgICAgICBGb3IgbW9yZSBpbmZvIHJlYWQgTWluaVppcF9pbmZvLnR4dAorCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERlY3J5cHRpb24gY29kZSBjb21lcyBmcm9tIGNyeXB0LmMgYnkgSW5mby1aSVAgYnV0IGhhcyBiZWVuIGdyZWF0bHkgcmVkdWNlZCBpbiB0ZXJtcyBvZgorICBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgc29mdHdhcmUuIFRoZSBmb2xsb3dpbmcgaXMgZnJvbSB0aGUgb3JpZ2luYWwgY3J5cHQuYy4KKyAgQ29kZSB3b3ZlbiBpbiBieSBUZXJyeSBUaG9yc2VuIDEvMjAwMy4KKworICBDb3B5cmlnaHQgKGMpIDE5OTAtMjAwMCBJbmZvLVpJUC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgU2VlIHRoZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFLCB2ZXJzaW9uIDIwMDAtQXByLTA5IG9yIGxhdGVyCisgICh0aGUgY29udGVudHMgb2Ygd2hpY2ggYXJlIGFsc28gaW5jbHVkZWQgaW4gemlwLmgpIGZvciB0ZXJtcyBvZiB1c2UuCisgIElmLCBmb3Igc29tZSByZWFzb24sIGFsbCB0aGVzZSBmaWxlcyBhcmUgbWlzc2luZywgdGhlIEluZm8tWklQIGxpY2Vuc2UKKyAgYWxzbyBtYXkgYmUgZm91bmQgYXQ6ICBmdHA6Ly9mdHAuaW5mby16aXAub3JnL3B1Yi9pbmZvemlwL2xpY2Vuc2UuaHRtbAorCisgICAgICAgIGNyeXB0LmMgKGZ1bGwgdmVyc2lvbikgYnkgSW5mby1aSVAuICAgICAgTGFzdCByZXZpc2VkOiAgW3NlZSBjcnlwdC5oXQorCisgIFRoZSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gcGFydHMgb2YgdGhpcyBzb3VyY2UgY29kZSAoYXMgb3Bwb3NlZCB0byB0aGUKKyAgbm9uLWVjaG9pbmcgcGFzc3dvcmQgcGFydHMpIHdlcmUgb3JpZ2luYWxseSB3cml0dGVuIGluIEV1cm9wZS4gIFRoZQorICB3aG9sZSBzb3VyY2UgcGFja2FnZSBjYW4gYmUgZnJlZWx5IGRpc3RyaWJ1dGVkLCBpbmNsdWRpbmcgZnJvbSB0aGUgVVNBLgorICAoUHJpb3IgdG8gSmFudWFyeSAyMDAwLCByZS1leHBvcnQgZnJvbSB0aGUgVVMgd2FzIGEgdmlvbGF0aW9uIG9mIFVTIGxhdy4pCisKKyAgICAgICAgVGhpcyBlbmNyeXB0aW9uIGNvZGUgaXMgYSBkaXJlY3QgdHJhbnNjcmlwdGlvbiBvZiB0aGUgYWxnb3JpdGhtIGZyb20KKyAgUm9nZXIgU2NobGFmbHksIGRlc2NyaWJlZCBieSBQaGlsIEthdHogaW4gdGhlIGZpbGUgYXBwbm90ZS50eHQuICBUaGlzCisgIGZpbGUgKGFwcG5vdGUudHh0KSBpcyBkaXN0cmlidXRlZCB3aXRoIHRoZSBQS1pJUCBwcm9ncmFtIChldmVuIGluIHRoZQorICB2ZXJzaW9uIHdpdGhvdXQgZW5jcnlwdGlvbiBjYXBhYmlsaXRpZXMpLgorCisgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgIENoYW5nZXMgaW4gdW56aXAuYworCisgICAgICAgIDIwMDctMjAwOCAtIEV2ZW4gUm91YXVsdCAtIEFkZGl0aW9uIG9mIGNwbF91bnpHZXRDdXJyZW50RmlsZVpTdHJlYW1Qb3MKKyAgMjAwNy0yMDA4IC0gRXZlbiBSb3VhdWx0IC0gRGVjb3JhdGlvbiBvZiBzeW1ib2wgbmFtZXMgdW56KiAtPiBjcGxfdW56KgorICAyMDA3LTIwMDggLSBFdmVuIFJvdWF1bHQgLSBSZW1vdmUgb2xkIEMgc3R5bGUgZnVuY3Rpb24gcHJvdG90eXBlcworICAyMDA3LTIwMDggLSBFdmVuIFJvdWF1bHQgLSBBZGQgdW56aXAgc3VwcG9ydCBmb3IgWklQNjQKKworICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBFdmVuIFJvdWF1bHQKKworCisgICAgICAgIE9jdC0yMDA5IC0gTWF0aGlhcyBTdmVuc3NvbiAtIFJlbW92ZWQgY3BsXyogZnJvbSBzeW1ib2wgbmFtZXMgKEV2ZW4gUm91YXVsdCBhZGRlZCB0aGVtIGJ1dCBzaW5jZSB0aGlzIGlzIG5vdyBtb3ZlZCB0byBhIG5ldyBwcm9qZWN0IChtaW5pemlwNjQpIEkgcmVuYW1lZCB0aGVtIGFnYWluKS4KKyAgT2N0LTIwMDkgLSBNYXRoaWFzIFN2ZW5zc29uIC0gRml4ZWQgcHJvYmxlbSBpZiB1bmNvbXByZXNzZWQgc2l6ZSB3YXMgPiA0RyBhbmQgY29tcHJlc3NlZCBzaXplIHdhcyA8NEcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIG9ubHkgcmVhZCB0aGUgY29tcHJlc3NlZC91bmNvbXByZXNzZWQgc2l6ZSBmcm9tIHRoZSBaaXA2NCBmb3JtYXQgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNpemUgZnJvbSBub3JtYWwgaGVhZGVyIHdhcyAweEZGRkZGRkZGCisgIE9jdC0yMDA5IC0gTWF0aGlhcyBTdmVuc3NvbiAtIEFwcGxpZWQgc29tZSBidWcgZml4ZXMgZnJvbSBwYWNoZXMgcmVjaXZlZCBmcm9tIEdpbGxlcyBWb2xsYW50CisgICAgICAgIE9jdC0yMDA5IC0gTWF0aGlhcyBTdmVuc3NvbiAtIEFwcGxpZWQgc3VwcG9ydCB0byB1bnppcCBmaWxlcyB3aXRoIGNvbXByZXNzaW9uIG1hdGhvZCBCWklQMiAoYnppcDIgbGliIGlzIHJlcXVpcmVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRjaCBjcmVhdGVkIGJ5IERhbmllbCBCb3JjYQorCisgIEphbi0yMDEwIC0gYmFjayB0byB1bnppcCBhbmQgbWluaXppcCAxLjAgbmFtZSBzY2hlbWUsIHdpdGggY29tcGF0aWJpbGl0eSBsYXllcgorCisgIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTAgR2lsbGVzIFZvbGxhbnQsIEV2ZW4gUm91YXVsdCwgTWF0aGlhcyBTdmVuc3NvbgorCisqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZuZGVmIE5PVU5DUllQVAorICAgICAgICAjZGVmaW5lIE5PVU5DUllQVAorI2VuZGlmCisKKyNpbmNsdWRlICJ6bGliLmgiCisjaW5jbHVkZSAidW56aXAuaCIKKworI2lmZGVmIFNUREMKKyMgIGluY2x1ZGUgPHN0ZGRlZi5oPgorIyAgaW5jbHVkZSA8c3RyaW5nLmg+CisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorI2lmZGVmIE5PX0VSUk5PX0gKKyAgICBleHRlcm4gaW50IGVycm5vOworI2Vsc2UKKyMgICBpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKKworI2lmbmRlZiBsb2NhbAorIyAgZGVmaW5lIGxvY2FsIHN0YXRpYworI2VuZGlmCisvKiBjb21waWxlIHdpdGggLURsb2NhbCBpZiB5b3VyIGRlYnVnZ2VyIGNhbid0IGZpbmQgc3RhdGljIHN5bWJvbHMgKi8KKworCisjaWZuZGVmIENBU0VTRU5TSVRJVklUWURFRkFVTFRfTk8KKyMgIGlmICFkZWZpbmVkKHVuaXgpICYmICFkZWZpbmVkKENBU0VTRU5TSVRJVklUWURFRkFVTFRfWUVTKQorIyAgICBkZWZpbmUgQ0FTRVNFTlNJVElWSVRZREVGQVVMVF9OTworIyAgZW5kaWYKKyNlbmRpZgorCisKKyNpZm5kZWYgVU5aX0JVRlNJWkUKKyNkZWZpbmUgVU5aX0JVRlNJWkUgKDE2Mzg0KQorI2VuZGlmCisKKyNpZm5kZWYgVU5aX01BWEZJTEVOQU1FSU5aSVAKKyNkZWZpbmUgVU5aX01BWEZJTEVOQU1FSU5aSVAgKDI1NikKKyNlbmRpZgorCisjaWZuZGVmIEFMTE9DCisjIGRlZmluZSBBTExPQyhzaXplKSAobWFsbG9jKHNpemUpKQorI2VuZGlmCisjaWZuZGVmIFRSWUZSRUUKKyMgZGVmaW5lIFRSWUZSRUUocCkge2lmIChwKSBmcmVlKHApO30KKyNlbmRpZgorCisjZGVmaW5lIFNJWkVDRU5UUkFMRElSSVRFTSAoMHgyZSkKKyNkZWZpbmUgU0laRVpJUExPQ0FMSEVBREVSICgweDFlKQorCisKK2NvbnN0IGNoYXIgdW56X2NvcHlyaWdodFtdID0KKyAgICIgdW56aXAgMS4wMSBDb3B5cmlnaHQgMTk5OC0yMDA0IEdpbGxlcyBWb2xsYW50IC0gaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbCI7CisKKy8qIHVuel9maWxlX2luZm9faW50ZXJudGFsIGNvbnRhaW4gaW50ZXJuYWwgaW5mbyBhYm91dCBhIGZpbGUgaW4gemlwZmlsZSovCit0eXBlZGVmIHN0cnVjdCB1bnpfZmlsZV9pbmZvNjRfaW50ZXJuYWxfcworeworICAgIFpQT1M2NF9UIG9mZnNldF9jdXJmaWxlOy8qIHJlbGF0aXZlIG9mZnNldCBvZiBsb2NhbCBoZWFkZXIgOCBieXRlcyAqLworfSB1bnpfZmlsZV9pbmZvNjRfaW50ZXJuYWw7CisKKworLyogZmlsZV9pbl96aXBfcmVhZF9pbmZvX3MgY29udGFpbiBpbnRlcm5hbCBpbmZvcm1hdGlvbiBhYm91dCBhIGZpbGUgaW4gemlwZmlsZSwKKyAgICB3aGVuIHJlYWRpbmcgYW5kIGRlY29tcHJlc3MgaXQgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY2hhciAgKnJlYWRfYnVmZmVyOyAgICAgICAgIC8qIGludGVybmFsIGJ1ZmZlciBmb3IgY29tcHJlc3NlZCBkYXRhICovCisgICAgel9zdHJlYW0gc3RyZWFtOyAgICAgICAgICAgIC8qIHpMaWIgc3RyZWFtIHN0cnVjdHVyZSBmb3IgaW5mbGF0ZSAqLworCisjaWZkZWYgSEFWRV9CWklQMgorICAgIGJ6X3N0cmVhbSBic3RyZWFtOyAgICAgICAgICAvKiBiekxpYiBzdHJlYW0gc3RydWN0dXJlIGZvciBiemlwZWQgKi8KKyNlbmRpZgorCisgICAgWlBPUzY0X1QgcG9zX2luX3ppcGZpbGU7ICAgICAgIC8qIHBvc2l0aW9uIGluIGJ5dGUgb24gdGhlIHppcGZpbGUsIGZvciBmc2VlayovCisgICAgdUxvbmcgc3RyZWFtX2luaXRpYWxpc2VkOyAgIC8qIGZsYWcgc2V0IGlmIHN0cmVhbSBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGlzZWQqLworCisgICAgWlBPUzY0X1Qgb2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQ7Lyogb2Zmc2V0IG9mIHRoZSBsb2NhbCBleHRyYSBmaWVsZCAqLworICAgIHVJbnQgIHNpemVfbG9jYWxfZXh0cmFmaWVsZDsvKiBzaXplIG9mIHRoZSBsb2NhbCBleHRyYSBmaWVsZCAqLworICAgIFpQT1M2NF9UIHBvc19sb2NhbF9leHRyYWZpZWxkOyAgIC8qIHBvc2l0aW9uIGluIHRoZSBsb2NhbCBleHRyYSBmaWVsZCBpbiByZWFkKi8KKyAgICBaUE9TNjRfVCB0b3RhbF9vdXRfNjQ7CisKKyAgICB1TG9uZyBjcmMzMjsgICAgICAgICAgICAgICAgLyogY3JjMzIgb2YgYWxsIGRhdGEgdW5jb21wcmVzc2VkICovCisgICAgdUxvbmcgY3JjMzJfd2FpdDsgICAgICAgICAgIC8qIGNyYzMyIHdlIG11c3Qgb2J0YWluIGFmdGVyIGRlY29tcHJlc3MgYWxsICovCisgICAgWlBPUzY0X1QgcmVzdF9yZWFkX2NvbXByZXNzZWQ7IC8qIG51bWJlciBvZiBieXRlIHRvIGJlIGRlY29tcHJlc3NlZCAqLworICAgIFpQT1M2NF9UIHJlc3RfcmVhZF91bmNvbXByZXNzZWQ7LypudW1iZXIgb2YgYnl0ZSB0byBiZSBvYnRhaW5lZCBhZnRlciBkZWNvbXAqLworICAgIHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYgel9maWxlZnVuYzsKKyAgICB2b2lkcGYgZmlsZXN0cmVhbTsgICAgICAgIC8qIGlvIHN0cnVjdG9yZSBvZiB0aGUgemlwZmlsZSAqLworICAgIHVMb25nIGNvbXByZXNzaW9uX21ldGhvZDsgICAvKiBjb21wcmVzc2lvbiBtZXRob2QgKDA9PXN0b3JlKSAqLworICAgIFpQT1M2NF9UIGJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlOy8qIGJ5dGUgYmVmb3JlIHRoZSB6aXBmaWxlLCAoPjAgZm9yIHNmeCkqLworICAgIGludCAgIHJhdzsKK30gZmlsZV9pbl96aXA2NF9yZWFkX2luZm9fczsKKworCisvKiB1bno2NF9zIGNvbnRhaW4gaW50ZXJuYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHppcGZpbGUKKyovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYgel9maWxlZnVuYzsKKyAgICBpbnQgaXM2NGJpdE9wZW5GdW5jdGlvbjsKKyAgICB2b2lkcGYgZmlsZXN0cmVhbTsgICAgICAgIC8qIGlvIHN0cnVjdG9yZSBvZiB0aGUgemlwZmlsZSAqLworICAgIHVuel9nbG9iYWxfaW5mbzY0IGdpOyAgICAgICAvKiBwdWJsaWMgZ2xvYmFsIGluZm9ybWF0aW9uICovCisgICAgWlBPUzY0X1QgYnl0ZV9iZWZvcmVfdGhlX3ppcGZpbGU7LyogYnl0ZSBiZWZvcmUgdGhlIHppcGZpbGUsICg+MCBmb3Igc2Z4KSovCisgICAgWlBPUzY0X1QgbnVtX2ZpbGU7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiB0aGUgY3VycmVudCBmaWxlIGluIHRoZSB6aXBmaWxlKi8KKyAgICBaUE9TNjRfVCBwb3NfaW5fY2VudHJhbF9kaXI7ICAgLyogcG9zIG9mIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIGNlbnRyYWwgZGlyKi8KKyAgICBaUE9TNjRfVCBjdXJyZW50X2ZpbGVfb2s7ICAgICAgLyogZmxhZyBhYm91dCB0aGUgdXNhYmlsaXR5IG9mIHRoZSBjdXJyZW50IGZpbGUqLworICAgIFpQT1M2NF9UIGNlbnRyYWxfcG9zOyAgICAgICAgICAvKiBwb3NpdGlvbiBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjZW50cmFsIGRpciovCisKKyAgICBaUE9TNjRfVCBzaXplX2NlbnRyYWxfZGlyOyAgICAgLyogc2l6ZSBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgICovCisgICAgWlBPUzY0X1Qgb2Zmc2V0X2NlbnRyYWxfZGlyOyAgIC8qIG9mZnNldCBvZiBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeSB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BlY3QgdG8gdGhlIHN0YXJ0aW5nIGRpc2sgbnVtYmVyICovCisKKyAgICB1bnpfZmlsZV9pbmZvNjQgY3VyX2ZpbGVfaW5mbzsgLyogcHVibGljIGluZm8gYWJvdXQgdGhlIGN1cnJlbnQgZmlsZSBpbiB6aXAqLworICAgIHVuel9maWxlX2luZm82NF9pbnRlcm5hbCBjdXJfZmlsZV9pbmZvX2ludGVybmFsOyAvKiBwcml2YXRlIGluZm8gYWJvdXQgaXQqLworICAgIGZpbGVfaW5femlwNjRfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkOyAvKiBzdHJ1Y3R1cmUgYWJvdXQgdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGlmIHdlIGFyZSBkZWNvbXByZXNzaW5nIGl0ICovCisgICAgaW50IGVuY3J5cHRlZDsKKworICAgIGludCBpc1ppcDY0OworCisjICAgIGlmbmRlZiBOT1VOQ1JZUFQKKyAgICB1bnNpZ25lZCBsb25nIGtleXNbM107ICAgICAvKiBrZXlzIGRlZmluaW5nIHRoZSBwc2V1ZG8tcmFuZG9tIHNlcXVlbmNlICovCisgICAgY29uc3Qgel9jcmNfdCogcGNyY18zMl90YWI7CisjICAgIGVuZGlmCit9IHVuejY0X3M7CisKKworI2lmbmRlZiBOT1VOQ1JZUFQKKyNpbmNsdWRlICJjcnlwdC5oIgorI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBSZWFkIGEgYnl0ZSBmcm9tIGEgZ3pfc3RyZWFtOyB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4uIFJldHVybiBFT0YKKyAgIGZvciBlbmQgb2YgZmlsZS4KKyAgIElOIGFzc2VydGlvbjogdGhlIHN0cmVhbSBzIGhhcyBiZWVuIHN1Y2Vzc2Z1bGx5IG9wZW5lZCBmb3IgcmVhZGluZy4KKyovCisKKworbG9jYWwgaW50IHVuejY0bG9jYWxfZ2V0Qnl0ZSBPRigoCisgICAgY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLAorICAgIHZvaWRwZiBmaWxlc3RyZWFtLAorICAgIGludCAqcGkpKTsKKworbG9jYWwgaW50IHVuejY0bG9jYWxfZ2V0Qnl0ZShjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsIHZvaWRwZiBmaWxlc3RyZWFtLCBpbnQgKnBpKQoreworICAgIHVuc2lnbmVkIGNoYXIgYzsKKyAgICBpbnQgZXJyID0gKGludClaUkVBRDY0KCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmYywxKTsKKyAgICBpZiAoZXJyPT0xKQorICAgIHsKKyAgICAgICAgKnBpID0gKGludCljOworICAgICAgICByZXR1cm4gVU5aX09LOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoWkVSUk9SNjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtKSkKKyAgICAgICAgICAgIHJldHVybiBVTlpfRVJSTk87CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBVTlpfRU9GOworICAgIH0KK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIFJlYWRzIGEgbG9uZyBpbiBMU0Igb3JkZXIgZnJvbSB0aGUgZ2l2ZW4gZ3pfc3RyZWFtLiBTZXRzCisqLworbG9jYWwgaW50IHVuejY0bG9jYWxfZ2V0U2hvcnQgT0YoKAorICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwKKyAgICB2b2lkcGYgZmlsZXN0cmVhbSwKKyAgICB1TG9uZyAqcFgpKTsKKworbG9jYWwgaW50IHVuejY0bG9jYWxfZ2V0U2hvcnQgKGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZHBmIGZpbGVzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nICpwWCkKK3sKKyAgICB1TG9uZyB4IDsKKyAgICBpbnQgaSA9IDA7CisgICAgaW50IGVycjsKKworICAgIGVyciA9IHVuejY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CisgICAgeCA9ICh1TG9uZylpOworCisgICAgaWYgKGVycj09VU5aX09LKQorICAgICAgICBlcnIgPSB1bno2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOworICAgIHggfD0gKCh1TG9uZylpKTw8ODsKKworICAgIGlmIChlcnI9PVVOWl9PSykKKyAgICAgICAgKnBYID0geDsKKyAgICBlbHNlCisgICAgICAgICpwWCA9IDA7CisgICAgcmV0dXJuIGVycjsKK30KKworbG9jYWwgaW50IHVuejY0bG9jYWxfZ2V0TG9uZyBPRigoCisgICAgY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLAorICAgIHZvaWRwZiBmaWxlc3RyZWFtLAorICAgIHVMb25nICpwWCkpOworCitsb2NhbCBpbnQgdW56NjRsb2NhbF9nZXRMb25nIChjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZHBmIGZpbGVzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgKnBYKQoreworICAgIHVMb25nIHggOworICAgIGludCBpID0gMDsKKyAgICBpbnQgZXJyOworCisgICAgZXJyID0gdW56NjRsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKKyAgICB4ID0gKHVMb25nKWk7CisKKyAgICBpZiAoZXJyPT1VTlpfT0spCisgICAgICAgIGVyciA9IHVuejY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CisgICAgeCB8PSAoKHVMb25nKWkpPDw4OworCisgICAgaWYgKGVycj09VU5aX09LKQorICAgICAgICBlcnIgPSB1bno2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOworICAgIHggfD0gKCh1TG9uZylpKTw8MTY7CisKKyAgICBpZiAoZXJyPT1VTlpfT0spCisgICAgICAgIGVyciA9IHVuejY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CisgICAgeCArPSAoKHVMb25nKWkpPDwyNDsKKworICAgIGlmIChlcnI9PVVOWl9PSykKKyAgICAgICAgKnBYID0geDsKKyAgICBlbHNlCisgICAgICAgICpwWCA9IDA7CisgICAgcmV0dXJuIGVycjsKK30KKworbG9jYWwgaW50IHVuejY0bG9jYWxfZ2V0TG9uZzY0IE9GKCgKKyAgICBjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsCisgICAgdm9pZHBmIGZpbGVzdHJlYW0sCisgICAgWlBPUzY0X1QgKnBYKSk7CisKKworbG9jYWwgaW50IHVuejY0bG9jYWxfZ2V0TG9uZzY0IChjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZHBmIGZpbGVzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWlBPUzY0X1QgKnBYKQoreworICAgIFpQT1M2NF9UIHggOworICAgIGludCBpID0gMDsKKyAgICBpbnQgZXJyOworCisgICAgZXJyID0gdW56NjRsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKKyAgICB4ID0gKFpQT1M2NF9UKWk7CisKKyAgICBpZiAoZXJyPT1VTlpfT0spCisgICAgICAgIGVyciA9IHVuejY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CisgICAgeCB8PSAoKFpQT1M2NF9UKWkpPDw4OworCisgICAgaWYgKGVycj09VU5aX09LKQorICAgICAgICBlcnIgPSB1bno2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOworICAgIHggfD0gKChaUE9TNjRfVClpKTw8MTY7CisKKyAgICBpZiAoZXJyPT1VTlpfT0spCisgICAgICAgIGVyciA9IHVuejY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CisgICAgeCB8PSAoKFpQT1M2NF9UKWkpPDwyNDsKKworICAgIGlmIChlcnI9PVVOWl9PSykKKyAgICAgICAgZXJyID0gdW56NjRsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKKyAgICB4IHw9ICgoWlBPUzY0X1QpaSk8PDMyOworCisgICAgaWYgKGVycj09VU5aX09LKQorICAgICAgICBlcnIgPSB1bno2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOworICAgIHggfD0gKChaUE9TNjRfVClpKTw8NDA7CisKKyAgICBpZiAoZXJyPT1VTlpfT0spCisgICAgICAgIGVyciA9IHVuejY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CisgICAgeCB8PSAoKFpQT1M2NF9UKWkpPDw0ODsKKworICAgIGlmIChlcnI9PVVOWl9PSykKKyAgICAgICAgZXJyID0gdW56NjRsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKKyAgICB4IHw9ICgoWlBPUzY0X1QpaSk8PDU2OworCisgICAgaWYgKGVycj09VU5aX09LKQorICAgICAgICAqcFggPSB4OworICAgIGVsc2UKKyAgICAgICAgKnBYID0gMDsKKyAgICByZXR1cm4gZXJyOworfQorCisvKiBNeSBvd24gc3RyY21waSAvIHN0cmNhc2VjbXAgKi8KK2xvY2FsIGludCBzdHJjbXBjYXNlbm9zZW5zaXRpdmVfaW50ZXJuYWwgKGNvbnN0IGNoYXIqIGZpbGVOYW1lMSwgY29uc3QgY2hhciogZmlsZU5hbWUyKQoreworICAgIGZvciAoOzspCisgICAgeworICAgICAgICBjaGFyIGMxPSooZmlsZU5hbWUxKyspOworICAgICAgICBjaGFyIGMyPSooZmlsZU5hbWUyKyspOworICAgICAgICBpZiAoKGMxPj0nYScpICYmIChjMTw9J3onKSkKKyAgICAgICAgICAgIGMxIC09IDB4MjA7CisgICAgICAgIGlmICgoYzI+PSdhJykgJiYgKGMyPD0neicpKQorICAgICAgICAgICAgYzIgLT0gMHgyMDsKKyAgICAgICAgaWYgKGMxPT0nXDAnKQorICAgICAgICAgICAgcmV0dXJuICgoYzI9PSdcMCcpID8gMCA6IC0xKTsKKyAgICAgICAgaWYgKGMyPT0nXDAnKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGlmIChjMTxjMikKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGMxPmMyKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCisKKyNpZmRlZiAgQ0FTRVNFTlNJVElWSVRZREVGQVVMVF9OTworI2RlZmluZSBDQVNFU0VOU0lUSVZJVFlERUZBVUxUVkFMVUUgMgorI2Vsc2UKKyNkZWZpbmUgQ0FTRVNFTlNJVElWSVRZREVGQVVMVFZBTFVFIDEKKyNlbmRpZgorCisjaWZuZGVmIFNUUkNNUENBU0VOT1NFTlRJVkVGVU5DVElPTgorI2RlZmluZSBTVFJDTVBDQVNFTk9TRU5USVZFRlVOQ1RJT04gc3RyY21wY2FzZW5vc2Vuc2l0aXZlX2ludGVybmFsCisjZW5kaWYKKworLyoKKyAgIENvbXBhcmUgdHdvIGZpbGVuYW1lIChmaWxlTmFtZTEsZmlsZU5hbWUyKS4KKyAgIElmIGlDYXNlU2VuaXNpdml0eSA9IDEsIGNvbXBhcmlzaW9uIGlzIGNhc2Ugc2Vuc2l0aXZpdHkgKGxpa2Ugc3RyY21wKQorICAgSWYgaUNhc2VTZW5pc2l2aXR5ID0gMiwgY29tcGFyaXNpb24gaXMgbm90IGNhc2Ugc2Vuc2l0aXZpdHkgKGxpa2Ugc3RyY21waQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHN0cmNhc2VjbXApCisgICBJZiBpQ2FzZVNlbmlzaXZpdHkgPSAwLCBjYXNlIHNlbnNpdGl2aXR5IGlzIGRlZmF1dCBvZiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0KKyAgICAgICAgKGxpa2UgMSBvbiBVbml4LCAyIG9uIFdpbmRvd3MpCisKKyovCitleHRlcm4gaW50IFpFWFBPUlQgdW56U3RyaW5nRmlsZU5hbWVDb21wYXJlIChjb25zdCBjaGFyKiAgZmlsZU5hbWUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBmaWxlTmFtZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlDYXNlU2Vuc2l0aXZpdHkpCisKK3sKKyAgICBpZiAoaUNhc2VTZW5zaXRpdml0eT09MCkKKyAgICAgICAgaUNhc2VTZW5zaXRpdml0eT1DQVNFU0VOU0lUSVZJVFlERUZBVUxUVkFMVUU7CisKKyAgICBpZiAoaUNhc2VTZW5zaXRpdml0eT09MSkKKyAgICAgICAgcmV0dXJuIHN0cmNtcChmaWxlTmFtZTEsZmlsZU5hbWUyKTsKKworICAgIHJldHVybiBTVFJDTVBDQVNFTk9TRU5USVZFRlVOQ1RJT04oZmlsZU5hbWUxLGZpbGVOYW1lMik7Cit9CisKKyNpZm5kZWYgQlVGUkVBRENPTU1FTlQKKyNkZWZpbmUgQlVGUkVBRENPTU1FTlQgKDB4NDAwKQorI2VuZGlmCisKKy8qCisgIExvY2F0ZSB0aGUgQ2VudHJhbCBkaXJlY3Rvcnkgb2YgYSB6aXBmaWxlIChhdCB0aGUgZW5kLCBqdXN0IGJlZm9yZQorICAgIHRoZSBnbG9iYWwgY29tbWVudCkKKyovCitsb2NhbCBaUE9TNjRfVCB1bno2NGxvY2FsX1NlYXJjaENlbnRyYWxEaXIgT0YoKGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwgdm9pZHBmIGZpbGVzdHJlYW0pKTsKK2xvY2FsIFpQT1M2NF9UIHVuejY0bG9jYWxfU2VhcmNoQ2VudHJhbERpcihjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsIHZvaWRwZiBmaWxlc3RyZWFtKQoreworICAgIHVuc2lnbmVkIGNoYXIqIGJ1ZjsKKyAgICBaUE9TNjRfVCB1U2l6ZUZpbGU7CisgICAgWlBPUzY0X1QgdUJhY2tSZWFkOworICAgIFpQT1M2NF9UIHVNYXhCYWNrPTB4ZmZmZjsgLyogbWF4aW11bSBzaXplIG9mIGdsb2JhbCBjb21tZW50ICovCisgICAgWlBPUzY0X1QgdVBvc0ZvdW5kPTA7CisKKyAgICBpZiAoWlNFRUs2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sMCxaTElCX0ZJTEVGVU5DX1NFRUtfRU5EKSAhPSAwKQorICAgICAgICByZXR1cm4gMDsKKworCisgICAgdVNpemVGaWxlID0gWlRFTEw2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0pOworCisgICAgaWYgKHVNYXhCYWNrPnVTaXplRmlsZSkKKyAgICAgICAgdU1heEJhY2sgPSB1U2l6ZUZpbGU7CisKKyAgICBidWYgPSAodW5zaWduZWQgY2hhciopQUxMT0MoQlVGUkVBRENPTU1FTlQrNCk7CisgICAgaWYgKGJ1Zj09TlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB1QmFja1JlYWQgPSA0OworICAgIHdoaWxlICh1QmFja1JlYWQ8dU1heEJhY2spCisgICAgeworICAgICAgICB1TG9uZyB1UmVhZFNpemU7CisgICAgICAgIFpQT1M2NF9UIHVSZWFkUG9zIDsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGlmICh1QmFja1JlYWQrQlVGUkVBRENPTU1FTlQ+dU1heEJhY2spCisgICAgICAgICAgICB1QmFja1JlYWQgPSB1TWF4QmFjazsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdUJhY2tSZWFkKz1CVUZSRUFEQ09NTUVOVDsKKyAgICAgICAgdVJlYWRQb3MgPSB1U2l6ZUZpbGUtdUJhY2tSZWFkIDsKKworICAgICAgICB1UmVhZFNpemUgPSAoKEJVRlJFQURDT01NRU5UKzQpIDwgKHVTaXplRmlsZS11UmVhZFBvcykpID8KKyAgICAgICAgICAgICAgICAgICAgIChCVUZSRUFEQ09NTUVOVCs0KSA6ICh1TG9uZykodVNpemVGaWxlLXVSZWFkUG9zKTsKKyAgICAgICAgaWYgKFpTRUVLNjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLHVSZWFkUG9zLFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKFpSRUFENjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLGJ1Zix1UmVhZFNpemUpIT11UmVhZFNpemUpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBmb3IgKGk9KGludCl1UmVhZFNpemUtMzsgKGktLSk+MDspCisgICAgICAgICAgICBpZiAoKCgqKGJ1ZitpKSk9PTB4NTApICYmICgoKihidWYraSsxKSk9PTB4NGIpICYmCisgICAgICAgICAgICAgICAgKCgqKGJ1ZitpKzIpKT09MHgwNSkgJiYgKCgqKGJ1ZitpKzMpKT09MHgwNikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdVBvc0ZvdW5kID0gdVJlYWRQb3MraTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBpZiAodVBvc0ZvdW5kIT0wKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIFRSWUZSRUUoYnVmKTsKKyAgICByZXR1cm4gdVBvc0ZvdW5kOworfQorCisKKy8qCisgIExvY2F0ZSB0aGUgQ2VudHJhbCBkaXJlY3RvcnkgNjQgb2YgYSB6aXBmaWxlIChhdCB0aGUgZW5kLCBqdXN0IGJlZm9yZQorICAgIHRoZSBnbG9iYWwgY29tbWVudCkKKyovCitsb2NhbCBaUE9TNjRfVCB1bno2NGxvY2FsX1NlYXJjaENlbnRyYWxEaXI2NCBPRigoCisgICAgY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLAorICAgIHZvaWRwZiBmaWxlc3RyZWFtKSk7CisKK2xvY2FsIFpQT1M2NF9UIHVuejY0bG9jYWxfU2VhcmNoQ2VudHJhbERpcjY0KGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZHBmIGZpbGVzdHJlYW0pCit7CisgICAgdW5zaWduZWQgY2hhciogYnVmOworICAgIFpQT1M2NF9UIHVTaXplRmlsZTsKKyAgICBaUE9TNjRfVCB1QmFja1JlYWQ7CisgICAgWlBPUzY0X1QgdU1heEJhY2s9MHhmZmZmOyAvKiBtYXhpbXVtIHNpemUgb2YgZ2xvYmFsIGNvbW1lbnQgKi8KKyAgICBaUE9TNjRfVCB1UG9zRm91bmQ9MDsKKyAgICB1TG9uZyB1TDsKKyAgICAgICAgICAgICAgICBaUE9TNjRfVCByZWxhdGl2ZU9mZnNldDsKKworICAgIGlmIChaU0VFSzY0KCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwwLFpMSUJfRklMRUZVTkNfU0VFS19FTkQpICE9IDApCisgICAgICAgIHJldHVybiAwOworCisKKyAgICB1U2l6ZUZpbGUgPSBaVEVMTDY0KCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSk7CisKKyAgICBpZiAodU1heEJhY2s+dVNpemVGaWxlKQorICAgICAgICB1TWF4QmFjayA9IHVTaXplRmlsZTsKKworICAgIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyKilBTExPQyhCVUZSRUFEQ09NTUVOVCs0KTsKKyAgICBpZiAoYnVmPT1OVUxMKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHVCYWNrUmVhZCA9IDQ7CisgICAgd2hpbGUgKHVCYWNrUmVhZDx1TWF4QmFjaykKKyAgICB7CisgICAgICAgIHVMb25nIHVSZWFkU2l6ZTsKKyAgICAgICAgWlBPUzY0X1QgdVJlYWRQb3M7CisgICAgICAgIGludCBpOworICAgICAgICBpZiAodUJhY2tSZWFkK0JVRlJFQURDT01NRU5UPnVNYXhCYWNrKQorICAgICAgICAgICAgdUJhY2tSZWFkID0gdU1heEJhY2s7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHVCYWNrUmVhZCs9QlVGUkVBRENPTU1FTlQ7CisgICAgICAgIHVSZWFkUG9zID0gdVNpemVGaWxlLXVCYWNrUmVhZCA7CisKKyAgICAgICAgdVJlYWRTaXplID0gKChCVUZSRUFEQ09NTUVOVCs0KSA8ICh1U2l6ZUZpbGUtdVJlYWRQb3MpKSA/CisgICAgICAgICAgICAgICAgICAgICAoQlVGUkVBRENPTU1FTlQrNCkgOiAodUxvbmcpKHVTaXplRmlsZS11UmVhZFBvcyk7CisgICAgICAgIGlmIChaU0VFSzY0KCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSx1UmVhZFBvcyxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChaUkVBRDY0KCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSxidWYsdVJlYWRTaXplKSE9dVJlYWRTaXplKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZm9yIChpPShpbnQpdVJlYWRTaXplLTM7IChpLS0pPjA7KQorICAgICAgICAgICAgaWYgKCgoKihidWYraSkpPT0weDUwKSAmJiAoKCooYnVmK2krMSkpPT0weDRiKSAmJgorICAgICAgICAgICAgICAgICgoKihidWYraSsyKSk9PTB4MDYpICYmICgoKihidWYraSszKSk9PTB4MDcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVQb3NGb3VuZCA9IHVSZWFkUG9zK2k7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgaWYgKHVQb3NGb3VuZCE9MCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBUUllGUkVFKGJ1Zik7CisgICAgaWYgKHVQb3NGb3VuZCA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIFppcDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBsb2NhdG9yICovCisgICAgaWYgKFpTRUVLNjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCB1UG9zRm91bmQsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogdGhlIHNpZ25hdHVyZSwgYWxyZWFkeSBjaGVja2VkICovCisgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZyhwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmdUwpIT1VTlpfT0spCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSB6aXA2NCBlbmQgb2YgIGNlbnRyYWwgZGlyZWN0b3J5ICovCisgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZyhwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmdUwpIT1VTlpfT0spCisgICAgICAgIHJldHVybiAwOworICAgIGlmICh1TCAhPSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIHJlbGF0aXZlIG9mZnNldCBvZiB0aGUgemlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IHJlY29yZCAqLworICAgIGlmICh1bno2NGxvY2FsX2dldExvbmc2NChwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmcmVsYXRpdmVPZmZzZXQpIT1VTlpfT0spCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogdG90YWwgbnVtYmVyIG9mIGRpc2tzICovCisgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZyhwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmdUwpIT1VTlpfT0spCisgICAgICAgIHJldHVybiAwOworICAgIGlmICh1TCAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIEdvdG8gZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IHJlY29yZCAqLworICAgIGlmIChaU0VFSzY0KCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwgcmVsYXRpdmVPZmZzZXQsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCisgICAgICAgIHJldHVybiAwOworCisgICAgIC8qIHRoZSBzaWduYXR1cmUgKi8KKyAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZ1TCkhPVVOWl9PSykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAodUwgIT0gMHgwNjA2NGI1MCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gcmVsYXRpdmVPZmZzZXQ7Cit9CisKKy8qCisgIE9wZW4gYSBaaXAgZmlsZS4gcGF0aCBjb250YWluIHRoZSBmdWxsIHBhdGhuYW1lIChieSBleGFtcGxlLAorICAgICBvbiBhIFdpbmRvd3MgTlQgY29tcHV0ZXIgImM6XFx0ZXN0XFx6bGliMTE0LnppcCIgb3Igb24gYW4gVW5peCBjb21wdXRlcgorICAgICAiemxpYi96bGliMTE0LnppcCIuCisgICAgIElmIHRoZSB6aXBmaWxlIGNhbm5vdCBiZSBvcGVuZWQgKGZpbGUgZG9lc24ndCBleGlzdCBvciBpbiBub3QgdmFsaWQpLCB0aGUKKyAgICAgICByZXR1cm4gdmFsdWUgaXMgTlVMTC4KKyAgICAgRWxzZSwgdGhlIHJldHVybiB2YWx1ZSBpcyBhIHVuekZpbGUgSGFuZGxlLCB1c2FibGUgd2l0aCBvdGhlciBmdW5jdGlvbgorICAgICAgIG9mIHRoaXMgdW56aXAgcGFja2FnZS4KKyovCitsb2NhbCB1bnpGaWxlIHVuek9wZW5JbnRlcm5hbCAoY29uc3Qgdm9pZCAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuYzY0XzMyX2RlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXM2NGJpdE9wZW5GdW5jdGlvbikKK3sKKyAgICB1bno2NF9zIHVzOworICAgIHVuejY0X3MgKnM7CisgICAgWlBPUzY0X1QgY2VudHJhbF9wb3M7CisgICAgdUxvbmcgICB1TDsKKworICAgIHVMb25nIG51bWJlcl9kaXNrOyAgICAgICAgICAvKiBudW1iZXIgb2YgdGhlIGN1cnJlbnQgZGlzdCwgdXNlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbmluZyBaSVAsIHVuc3VwcG9ydGVkLCBhbHdheXMgMCovCisgICAgdUxvbmcgbnVtYmVyX2Rpc2tfd2l0aF9DRDsgIC8qIG51bWJlciB0aGUgdGhlIGRpc2sgd2l0aCBjZW50cmFsIGRpciwgdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igc3BhbmluZyBaSVAsIHVuc3VwcG9ydGVkLCBhbHdheXMgMCovCisgICAgWlBPUzY0X1QgbnVtYmVyX2VudHJ5X0NEOyAgICAgIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjZW50cmFsIGRpcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2FtZSB0aGFuIG51bWJlcl9lbnRyeSBvbiBub3NwYW4pICovCisKKyAgICBpbnQgZXJyPVVOWl9PSzsKKworICAgIGlmICh1bnpfY29weXJpZ2h0WzBdIT0nICcpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgdXMuel9maWxlZnVuYy56c2VlazMyX2ZpbGUgPSBOVUxMOworICAgIHVzLnpfZmlsZWZ1bmMuenRlbGwzMl9maWxlID0gTlVMTDsKKyAgICBpZiAocHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWY9PU5VTEwpCisgICAgICAgIGZpbGxfZm9wZW42NF9maWxlZnVuYygmdXMuel9maWxlZnVuYy56ZmlsZV9mdW5jNjQpOworICAgIGVsc2UKKyAgICAgICAgdXMuel9maWxlZnVuYyA9ICpwemxpYl9maWxlZnVuYzY0XzMyX2RlZjsKKyAgICB1cy5pczY0Yml0T3BlbkZ1bmN0aW9uID0gaXM2NGJpdE9wZW5GdW5jdGlvbjsKKworCisKKyAgICB1cy5maWxlc3RyZWFtID0gWk9QRU42NCh1cy56X2ZpbGVmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkxJQl9GSUxFRlVOQ19NT0RFX1JFQUQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpMSUJfRklMRUZVTkNfTU9ERV9FWElTVElORyk7CisgICAgaWYgKHVzLmZpbGVzdHJlYW09PU5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgY2VudHJhbF9wb3MgPSB1bno2NGxvY2FsX1NlYXJjaENlbnRyYWxEaXI2NCgmdXMuel9maWxlZnVuYyx1cy5maWxlc3RyZWFtKTsKKyAgICBpZiAoY2VudHJhbF9wb3MpCisgICAgeworICAgICAgICB1TG9uZyB1UzsKKyAgICAgICAgWlBPUzY0X1QgdUw2NDsKKworICAgICAgICB1cy5pc1ppcDY0ID0gMTsKKworICAgICAgICBpZiAoWlNFRUs2NCh1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50cmFsX3BvcyxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKKworICAgICAgICAvKiB0aGUgc2lnbmF0dXJlLCBhbHJlYWR5IGNoZWNrZWQgKi8KKyAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZygmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmdUwpIT1VTlpfT0spCisgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworCisgICAgICAgIC8qIHNpemUgb2YgemlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IHJlY29yZCAqLworICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nNjQoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJnVMNjQpIT1VTlpfT0spCisgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworCisgICAgICAgIC8qIHZlcnNpb24gbWFkZSBieSAqLworICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmdVMpIT1VTlpfT0spCisgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworCisgICAgICAgIC8qIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgKi8KKyAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0U2hvcnQoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJnVTKSE9VU5aX09LKQorICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKKworICAgICAgICAvKiBudW1iZXIgb2YgdGhpcyBkaXNrICovCisgICAgICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJm51bWJlcl9kaXNrKSE9VU5aX09LKQorICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKKworICAgICAgICAvKiBudW1iZXIgb2YgdGhlIGRpc2sgd2l0aCB0aGUgc3RhcnQgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICovCisgICAgICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJm51bWJlcl9kaXNrX3dpdGhfQ0QpIT1VTlpfT0spCisgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworCisgICAgICAgIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBvbiB0aGlzIGRpc2sgKi8KKyAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZzY0KCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZ1cy5naS5udW1iZXJfZW50cnkpIT1VTlpfT0spCisgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworCisgICAgICAgIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLworICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nNjQoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJm51bWJlcl9lbnRyeV9DRCkhPVVOWl9PSykKKyAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisKKyAgICAgICAgaWYgKChudW1iZXJfZW50cnlfQ0QhPXVzLmdpLm51bWJlcl9lbnRyeSkgfHwKKyAgICAgICAgICAgIChudW1iZXJfZGlza193aXRoX0NEIT0wKSB8fAorICAgICAgICAgICAgKG51bWJlcl9kaXNrIT0wKSkKKyAgICAgICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsKKworICAgICAgICAvKiBzaXplIG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLworICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nNjQoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJnVzLnNpemVfY2VudHJhbF9kaXIpIT1VTlpfT0spCisgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworCisgICAgICAgIC8qIG9mZnNldCBvZiBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeSB3aXRoIHJlc3BlY3QgdG8gdGhlCisgICAgICAgICAgc3RhcnRpbmcgZGlzayBudW1iZXIgKi8KKyAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZzY0KCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZ1cy5vZmZzZXRfY2VudHJhbF9kaXIpIT1VTlpfT0spCisgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworCisgICAgICAgIHVzLmdpLnNpemVfY29tbWVudCA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNlbnRyYWxfcG9zID0gdW56NjRsb2NhbF9TZWFyY2hDZW50cmFsRGlyKCZ1cy56X2ZpbGVmdW5jLHVzLmZpbGVzdHJlYW0pOworICAgICAgICBpZiAoY2VudHJhbF9wb3M9PTApCisgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworCisgICAgICAgIHVzLmlzWmlwNjQgPSAwOworCisgICAgICAgIGlmIChaU0VFSzY0KHVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudHJhbF9wb3MsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCisgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworCisgICAgICAgIC8qIHRoZSBzaWduYXR1cmUsIGFscmVhZHkgY2hlY2tlZCAqLworICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nKCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZ1TCkhPVVOWl9PSykKKyAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisKKyAgICAgICAgLyogbnVtYmVyIG9mIHRoaXMgZGlzayAqLworICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmbnVtYmVyX2Rpc2spIT1VTlpfT0spCisgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworCisgICAgICAgIC8qIG51bWJlciBvZiB0aGUgZGlzayB3aXRoIHRoZSBzdGFydCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8KKyAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0U2hvcnQoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJm51bWJlcl9kaXNrX3dpdGhfQ0QpIT1VTlpfT0spCisgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworCisgICAgICAgIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpciBvbiB0aGlzIGRpc2sgKi8KKyAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0U2hvcnQoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJnVMKSE9VU5aX09LKQorICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKKyAgICAgICAgdXMuZ2kubnVtYmVyX2VudHJ5ID0gdUw7CisKKyAgICAgICAgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyICovCisgICAgICAgIGlmICh1bno2NGxvY2FsX2dldFNob3J0KCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZ1TCkhPVVOWl9PSykKKyAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisgICAgICAgIG51bWJlcl9lbnRyeV9DRCA9IHVMOworCisgICAgICAgIGlmICgobnVtYmVyX2VudHJ5X0NEIT11cy5naS5udW1iZXJfZW50cnkpIHx8CisgICAgICAgICAgICAobnVtYmVyX2Rpc2tfd2l0aF9DRCE9MCkgfHwKKyAgICAgICAgICAgIChudW1iZXJfZGlzayE9MCkpCisgICAgICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7CisKKyAgICAgICAgLyogc2l6ZSBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8KKyAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZygmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmdUwpIT1VTlpfT0spCisgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworICAgICAgICB1cy5zaXplX2NlbnRyYWxfZGlyID0gdUw7CisKKyAgICAgICAgLyogb2Zmc2V0IG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5IHdpdGggcmVzcGVjdCB0byB0aGUKKyAgICAgICAgICAgIHN0YXJ0aW5nIGRpc2sgbnVtYmVyICovCisgICAgICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJnVMKSE9VU5aX09LKQorICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKKyAgICAgICAgdXMub2Zmc2V0X2NlbnRyYWxfZGlyID0gdUw7CisKKyAgICAgICAgLyogemlwZmlsZSBjb21tZW50IGxlbmd0aCAqLworICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmdXMuZ2kuc2l6ZV9jb21tZW50KSE9VU5aX09LKQorICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKKyAgICB9CisKKyAgICBpZiAoKGNlbnRyYWxfcG9zPHVzLm9mZnNldF9jZW50cmFsX2Rpcit1cy5zaXplX2NlbnRyYWxfZGlyKSAmJgorICAgICAgICAoZXJyPT1VTlpfT0spKQorICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7CisKKyAgICBpZiAoZXJyIT1VTlpfT0spCisgICAgeworICAgICAgICBaQ0xPU0U2NCh1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdXMuYnl0ZV9iZWZvcmVfdGhlX3ppcGZpbGUgPSBjZW50cmFsX3BvcyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzLm9mZnNldF9jZW50cmFsX2Rpcit1cy5zaXplX2NlbnRyYWxfZGlyKTsKKyAgICB1cy5jZW50cmFsX3BvcyA9IGNlbnRyYWxfcG9zOworICAgIHVzLnBmaWxlX2luX3ppcF9yZWFkID0gTlVMTDsKKyAgICB1cy5lbmNyeXB0ZWQgPSAwOworCisKKyAgICBzPSh1bno2NF9zKilBTExPQyhzaXplb2YodW56NjRfcykpOworICAgIGlmKCBzICE9IE5VTEwpCisgICAgeworICAgICAgICAqcz11czsKKyAgICAgICAgdW56R29Ub0ZpcnN0RmlsZSgodW56RmlsZSlzKTsKKyAgICB9CisgICAgcmV0dXJuICh1bnpGaWxlKXM7Cit9CisKKworZXh0ZXJuIHVuekZpbGUgWkVYUE9SVCB1bnpPcGVuMiAoY29uc3QgY2hhciAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmMzMl9kZWYpCit7CisgICAgaWYgKHB6bGliX2ZpbGVmdW5jMzJfZGVmICE9IE5VTEwpCisgICAgeworICAgICAgICB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmIHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWZfZmlsbDsKKyAgICAgICAgZmlsbF96bGliX2ZpbGVmdW5jNjRfMzJfZGVmX2Zyb21fZmlsZWZ1bmMzMigmemxpYl9maWxlZnVuYzY0XzMyX2RlZl9maWxsLHB6bGliX2ZpbGVmdW5jMzJfZGVmKTsKKyAgICAgICAgcmV0dXJuIHVuek9wZW5JbnRlcm5hbChwYXRoLCAmemxpYl9maWxlZnVuYzY0XzMyX2RlZl9maWxsLCAwKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gdW56T3BlbkludGVybmFsKHBhdGgsIE5VTEwsIDApOworfQorCitleHRlcm4gdW56RmlsZSBaRVhQT1JUIHVuek9wZW4yXzY0IChjb25zdCB2b2lkICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpsaWJfZmlsZWZ1bmM2NF9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZikKK3sKKyAgICBpZiAocHpsaWJfZmlsZWZ1bmNfZGVmICE9IE5VTEwpCisgICAgeworICAgICAgICB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmIHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWZfZmlsbDsKKyAgICAgICAgemxpYl9maWxlZnVuYzY0XzMyX2RlZl9maWxsLnpmaWxlX2Z1bmM2NCA9ICpwemxpYl9maWxlZnVuY19kZWY7CisgICAgICAgIHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWZfZmlsbC56dGVsbDMyX2ZpbGUgPSBOVUxMOworICAgICAgICB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmX2ZpbGwuenNlZWszMl9maWxlID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIHVuek9wZW5JbnRlcm5hbChwYXRoLCAmemxpYl9maWxlZnVuYzY0XzMyX2RlZl9maWxsLCAxKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gdW56T3BlbkludGVybmFsKHBhdGgsIE5VTEwsIDEpOworfQorCitleHRlcm4gdW56RmlsZSBaRVhQT1JUIHVuek9wZW4gKGNvbnN0IGNoYXIgKnBhdGgpCit7CisgICAgcmV0dXJuIHVuek9wZW5JbnRlcm5hbChwYXRoLCBOVUxMLCAwKTsKK30KKworZXh0ZXJuIHVuekZpbGUgWkVYUE9SVCB1bnpPcGVuNjQgKGNvbnN0IHZvaWQgKnBhdGgpCit7CisgICAgcmV0dXJuIHVuek9wZW5JbnRlcm5hbChwYXRoLCBOVUxMLCAxKTsKK30KKworLyoKKyAgQ2xvc2UgYSBaaXBGaWxlIG9wZW5lZCB3aXRoIHVuek9wZW4uCisgIElmIHRoZXJlIGlzIGZpbGVzIGluc2lkZSB0aGUgLlppcCBvcGVuZWQgd2l0aCB1bnpPcGVuQ3VycmVudEZpbGUgKHNlZSBsYXRlciksCisgICAgdGhlc2UgZmlsZXMgTVVTVCBiZSBjbG9zZWQgd2l0aCB1bnpDbG9zZUN1cnJlbnRGaWxlIGJlZm9yZSBjYWxsIHVuekNsb3NlLgorICByZXR1cm4gVU5aX09LIGlmIHRoZXJlIGlzIG5vIHByb2JsZW0uICovCitleHRlcm4gaW50IFpFWFBPUlQgdW56Q2xvc2UgKHVuekZpbGUgZmlsZSkKK3sKKyAgICB1bno2NF9zKiBzOworICAgIGlmIChmaWxlPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisgICAgcz0odW56NjRfcyopZmlsZTsKKworICAgIGlmIChzLT5wZmlsZV9pbl96aXBfcmVhZCE9TlVMTCkKKyAgICAgICAgdW56Q2xvc2VDdXJyZW50RmlsZShmaWxlKTsKKworICAgIFpDTE9TRTY0KHMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0pOworICAgIFRSWUZSRUUocyk7CisgICAgcmV0dXJuIFVOWl9PSzsKK30KKworCisvKgorICBXcml0ZSBpbmZvIGFib3V0IHRoZSBaaXBGaWxlIGluIHRoZSAqcGdsb2JhbF9pbmZvIHN0cnVjdHVyZS4KKyAgTm8gcHJlcGFyYXRpb24gb2YgdGhlIHN0cnVjdHVyZSBpcyBuZWVkZWQKKyAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtLiAqLworZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEdsb2JhbEluZm82NCAodW56RmlsZSBmaWxlLCB1bnpfZ2xvYmFsX2luZm82NCogcGdsb2JhbF9pbmZvKQoreworICAgIHVuejY0X3MqIHM7CisgICAgaWYgKGZpbGU9PU5VTEwpCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKKyAgICBzPSh1bno2NF9zKilmaWxlOworICAgICpwZ2xvYmFsX2luZm89cy0+Z2k7CisgICAgcmV0dXJuIFVOWl9PSzsKK30KKworZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEdsb2JhbEluZm8gKHVuekZpbGUgZmlsZSwgdW56X2dsb2JhbF9pbmZvKiBwZ2xvYmFsX2luZm8zMikKK3sKKyAgICB1bno2NF9zKiBzOworICAgIGlmIChmaWxlPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisgICAgcz0odW56NjRfcyopZmlsZTsKKyAgICAvKiB0byBkbyA6IGNoZWNrIGlmIG51bWJlcl9lbnRyeSBpcyBub3QgdHJ1bmNhdGVkICovCisgICAgcGdsb2JhbF9pbmZvMzItPm51bWJlcl9lbnRyeSA9ICh1TG9uZylzLT5naS5udW1iZXJfZW50cnk7CisgICAgcGdsb2JhbF9pbmZvMzItPnNpemVfY29tbWVudCA9IHMtPmdpLnNpemVfY29tbWVudDsKKyAgICByZXR1cm4gVU5aX09LOworfQorLyoKKyAgIFRyYW5zbGF0ZSBkYXRlL3RpbWUgZnJvbSBEb3MgZm9ybWF0IHRvIHRtX3VueiAocmVhZGFibGUgbW9yZSBlYXNpbHR5KQorKi8KK2xvY2FsIHZvaWQgdW56NjRsb2NhbF9Eb3NEYXRlVG9UbXVEYXRlIChaUE9TNjRfVCB1bERvc0RhdGUsIHRtX3VueiogcHRtKQoreworICAgIFpQT1M2NF9UIHVEYXRlOworICAgIHVEYXRlID0gKFpQT1M2NF9UKSh1bERvc0RhdGU+PjE2KTsKKyAgICBwdG0tPnRtX21kYXkgPSAodUludCkodURhdGUmMHgxZikgOworICAgIHB0bS0+dG1fbW9uID0gICh1SW50KSgoKCh1RGF0ZSkmMHgxRTApLzB4MjApLTEpIDsKKyAgICBwdG0tPnRtX3llYXIgPSAodUludCkoKCh1RGF0ZSYweDBGRTAwKS8weDAyMDApKzE5ODApIDsKKworICAgIHB0bS0+dG1faG91ciA9ICh1SW50KSAoKHVsRG9zRGF0ZSAmMHhGODAwKS8weDgwMCk7CisgICAgcHRtLT50bV9taW4gPSAgKHVJbnQpICgodWxEb3NEYXRlJjB4N0UwKS8weDIwKSA7CisgICAgcHRtLT50bV9zZWMgPSAgKHVJbnQpICgyKih1bERvc0RhdGUmMHgxZikpIDsKK30KKworLyoKKyAgR2V0IEluZm8gYWJvdXQgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgemlwZmlsZSwgd2l0aCBpbnRlcm5hbCBvbmx5IGluZm8KKyovCitsb2NhbCBpbnQgdW56NjRsb2NhbF9HZXRDdXJyZW50RmlsZUluZm9JbnRlcm5hbCBPRigodW56RmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnpfZmlsZV9pbmZvNjQgKnBmaWxlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuel9maWxlX2luZm82NF9pbnRlcm5hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGZpbGVfaW5mb19pbnRlcm5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3pGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgZmlsZU5hbWVCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpleHRyYUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBleHRyYUZpZWxkQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3pDb21tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBjb21tZW50QnVmZmVyU2l6ZSkpOworCitsb2NhbCBpbnQgdW56NjRsb2NhbF9HZXRDdXJyZW50RmlsZUluZm9JbnRlcm5hbCAodW56RmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnpfZmlsZV9pbmZvNjQgKnBmaWxlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuel9maWxlX2luZm82NF9pbnRlcm5hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGZpbGVfaW5mb19pbnRlcm5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3pGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgZmlsZU5hbWVCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpleHRyYUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBleHRyYUZpZWxkQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3pDb21tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBjb21tZW50QnVmZmVyU2l6ZSkKK3sKKyAgICB1bno2NF9zKiBzOworICAgIHVuel9maWxlX2luZm82NCBmaWxlX2luZm87CisgICAgdW56X2ZpbGVfaW5mbzY0X2ludGVybmFsIGZpbGVfaW5mb19pbnRlcm5hbDsKKyAgICBpbnQgZXJyPVVOWl9PSzsKKyAgICB1TG9uZyB1TWFnaWM7CisgICAgbG9uZyBsU2Vlaz0wOworICAgIHVMb25nIHVMOworCisgICAgaWYgKGZpbGU9PU5VTEwpCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKKyAgICBzPSh1bno2NF9zKilmaWxlOworICAgIGlmIChaU0VFSzY0KHMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sCisgICAgICAgICAgICAgIHMtPnBvc19pbl9jZW50cmFsX2RpcitzLT5ieXRlX2JlZm9yZV90aGVfemlwZmlsZSwKKyAgICAgICAgICAgICAgWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCisgICAgICAgIGVycj1VTlpfRVJSTk87CisKKworICAgIC8qIHdlIGNoZWNrIHRoZSBtYWdpYyAqLworICAgIGlmIChlcnI9PVVOWl9PSykKKyAgICB7CisgICAgICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVNYWdpYykgIT0gVU5aX09LKQorICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKKyAgICAgICAgZWxzZSBpZiAodU1hZ2ljIT0weDAyMDE0YjUwKQorICAgICAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOworICAgIH0KKworICAgIGlmICh1bno2NGxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8udmVyc2lvbikgIT0gVU5aX09LKQorICAgICAgICBlcnI9VU5aX0VSUk5POworCisgICAgaWYgKHVuejY0bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby52ZXJzaW9uX25lZWRlZCkgIT0gVU5aX09LKQorICAgICAgICBlcnI9VU5aX0VSUk5POworCisgICAgaWYgKHVuejY0bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5mbGFnKSAhPSBVTlpfT0spCisgICAgICAgIGVycj1VTlpfRVJSTk87CisKKyAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZCkgIT0gVU5aX09LKQorICAgICAgICBlcnI9VU5aX0VSUk5POworCisgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLmRvc0RhdGUpICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKKworICAgIHVuejY0bG9jYWxfRG9zRGF0ZVRvVG11RGF0ZShmaWxlX2luZm8uZG9zRGF0ZSwmZmlsZV9pbmZvLnRtdV9kYXRlKTsKKworICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5jcmMpICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKKworICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVMKSAhPSBVTlpfT0spCisgICAgICAgIGVycj1VTlpfRVJSTk87CisgICAgZmlsZV9pbmZvLmNvbXByZXNzZWRfc2l6ZSA9IHVMOworCisgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdUwpICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKKyAgICBmaWxlX2luZm8udW5jb21wcmVzc2VkX3NpemUgPSB1TDsKKworICAgIGlmICh1bno2NGxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uc2l6ZV9maWxlbmFtZSkgIT0gVU5aX09LKQorICAgICAgICBlcnI9VU5aX0VSUk5POworCisgICAgaWYgKHVuejY0bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmEpICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKKworICAgIGlmICh1bno2NGxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uc2l6ZV9maWxlX2NvbW1lbnQpICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKKworICAgIGlmICh1bno2NGxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uZGlza19udW1fc3RhcnQpICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKKworICAgIGlmICh1bno2NGxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uaW50ZXJuYWxfZmEpICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKKworICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5leHRlcm5hbF9mYSkgIT0gVU5aX09LKQorICAgICAgICBlcnI9VU5aX0VSUk5POworCisgICAgICAgICAgICAgICAgLy8gcmVsYXRpdmUgb2Zmc2V0IG9mIGxvY2FsIGhlYWRlcgorICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVMKSAhPSBVTlpfT0spCisgICAgICAgIGVycj1VTlpfRVJSTk87CisgICAgZmlsZV9pbmZvX2ludGVybmFsLm9mZnNldF9jdXJmaWxlID0gdUw7CisKKyAgICBsU2Vlays9ZmlsZV9pbmZvLnNpemVfZmlsZW5hbWU7CisgICAgaWYgKChlcnI9PVVOWl9PSykgJiYgKHN6RmlsZU5hbWUhPU5VTEwpKQorICAgIHsKKyAgICAgICAgdUxvbmcgdVNpemVSZWFkIDsKKyAgICAgICAgaWYgKGZpbGVfaW5mby5zaXplX2ZpbGVuYW1lPGZpbGVOYW1lQnVmZmVyU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgKihzekZpbGVOYW1lK2ZpbGVfaW5mby5zaXplX2ZpbGVuYW1lKT0nXDAnOworICAgICAgICAgICAgdVNpemVSZWFkID0gZmlsZV9pbmZvLnNpemVfZmlsZW5hbWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdVNpemVSZWFkID0gZmlsZU5hbWVCdWZmZXJTaXplOworCisgICAgICAgIGlmICgoZmlsZV9pbmZvLnNpemVfZmlsZW5hbWU+MCkgJiYgKGZpbGVOYW1lQnVmZmVyU2l6ZT4wKSkKKyAgICAgICAgICAgIGlmIChaUkVBRDY0KHMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sc3pGaWxlTmFtZSx1U2l6ZVJlYWQpIT11U2l6ZVJlYWQpCisgICAgICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKKyAgICAgICAgbFNlZWsgLT0gdVNpemVSZWFkOworICAgIH0KKworICAgIC8vIFJlYWQgZXh0cmFmaWVsZAorICAgIGlmICgoZXJyPT1VTlpfT0spICYmIChleHRyYUZpZWxkIT1OVUxMKSkKKyAgICB7CisgICAgICAgIFpQT1M2NF9UIHVTaXplUmVhZCA7CisgICAgICAgIGlmIChmaWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhPGV4dHJhRmllbGRCdWZmZXJTaXplKQorICAgICAgICAgICAgdVNpemVSZWFkID0gZmlsZV9pbmZvLnNpemVfZmlsZV9leHRyYTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdVNpemVSZWFkID0gZXh0cmFGaWVsZEJ1ZmZlclNpemU7CisKKyAgICAgICAgaWYgKGxTZWVrIT0wKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoWlNFRUs2NChzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLGxTZWVrLFpMSUJfRklMRUZVTkNfU0VFS19DVVIpPT0wKQorICAgICAgICAgICAgICAgIGxTZWVrPTA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoZmlsZV9pbmZvLnNpemVfZmlsZV9leHRyYT4wKSAmJiAoZXh0cmFGaWVsZEJ1ZmZlclNpemU+MCkpCisgICAgICAgICAgICBpZiAoWlJFQUQ2NChzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLGV4dHJhRmllbGQsKHVMb25nKXVTaXplUmVhZCkhPXVTaXplUmVhZCkKKyAgICAgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworCisgICAgICAgIGxTZWVrICs9IGZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmEgLSAodUxvbmcpdVNpemVSZWFkOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGxTZWVrICs9IGZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmE7CisKKworICAgIGlmICgoZXJyPT1VTlpfT0spICYmIChmaWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhICE9IDApKQorICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgYWNjID0gMDsKKworICAgICAgICAvLyBzaW5jZSBsU2VlayBub3cgcG9pbnRzIHRvIGFmdGVyIHRoZSBleHRyYSBmaWVsZCB3ZSBuZWVkIHRvIG1vdmUgYmFjaworICAgICAgICBsU2VlayAtPSBmaWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhOworCisgICAgICAgIGlmIChsU2VlayE9MCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFpTRUVLNjQocy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSxsU2VlayxaTElCX0ZJTEVGVU5DX1NFRUtfQ1VSKT09MCkKKyAgICAgICAgICAgICAgICBsU2Vlaz0wOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisgICAgICAgIH0KKworICAgICAgICB3aGlsZShhY2MgPCBmaWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhKQorICAgICAgICB7CisgICAgICAgICAgICB1TG9uZyBoZWFkZXJJZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIGRhdGFTaXplOworCisgICAgICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmaGVhZGVySWQpICE9IFVOWl9PSykKKyAgICAgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworCisgICAgICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZGF0YVNpemUpICE9IFVOWl9PSykKKyAgICAgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworCisgICAgICAgICAgICAvKiBaSVA2NCBleHRyYSBmaWVsZHMgKi8KKyAgICAgICAgICAgIGlmIChoZWFkZXJJZCA9PSAweDAwMDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIHVMOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZmlsZV9pbmZvLnVuY29tcHJlc3NlZF9zaXplID09IE1BWFUzMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nNjQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby51bmNvbXByZXNzZWRfc2l6ZSkgIT0gVU5aX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZmlsZV9pbmZvLmNvbXByZXNzZWRfc2l6ZSA9PSBNQVhVMzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZzY0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uY29tcHJlc3NlZF9zaXplKSAhPSBVTlpfT0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihmaWxlX2luZm9faW50ZXJuYWwub2Zmc2V0X2N1cmZpbGUgPT0gTUFYVTMyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlbGF0aXZlIEhlYWRlciBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bno2NGxvY2FsX2dldExvbmc2NCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvX2ludGVybmFsLm9mZnNldF9jdXJmaWxlKSAhPSBVTlpfT0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZmlsZV9pbmZvLmRpc2tfbnVtX3N0YXJ0ID09IE1BWFUzMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaXNrIFN0YXJ0IE51bWJlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdUwpICE9IFVOWl9PSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoWlNFRUs2NChzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLGRhdGFTaXplLFpMSUJfRklMRUZVTkNfU0VFS19DVVIpIT0wKQorICAgICAgICAgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhY2MgKz0gMiArIDIgKyBkYXRhU2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZXJyPT1VTlpfT0spICYmIChzekNvbW1lbnQhPU5VTEwpKQorICAgIHsKKyAgICAgICAgdUxvbmcgdVNpemVSZWFkIDsKKyAgICAgICAgaWYgKGZpbGVfaW5mby5zaXplX2ZpbGVfY29tbWVudDxjb21tZW50QnVmZmVyU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgKihzekNvbW1lbnQrZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50KT0nXDAnOworICAgICAgICAgICAgdVNpemVSZWFkID0gZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHVTaXplUmVhZCA9IGNvbW1lbnRCdWZmZXJTaXplOworCisgICAgICAgIGlmIChsU2VlayE9MCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFpTRUVLNjQocy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSxsU2VlayxaTElCX0ZJTEVGVU5DX1NFRUtfQ1VSKT09MCkKKyAgICAgICAgICAgICAgICBsU2Vlaz0wOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGZpbGVfaW5mby5zaXplX2ZpbGVfY29tbWVudD4wKSAmJiAoY29tbWVudEJ1ZmZlclNpemU+MCkpCisgICAgICAgICAgICBpZiAoWlJFQUQ2NChzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLHN6Q29tbWVudCx1U2l6ZVJlYWQpIT11U2l6ZVJlYWQpCisgICAgICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKKyAgICAgICAgbFNlZWsrPWZpbGVfaW5mby5zaXplX2ZpbGVfY29tbWVudCAtIHVTaXplUmVhZDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBsU2Vlays9ZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50OworCisKKyAgICBpZiAoKGVycj09VU5aX09LKSAmJiAocGZpbGVfaW5mbyE9TlVMTCkpCisgICAgICAgICpwZmlsZV9pbmZvPWZpbGVfaW5mbzsKKworICAgIGlmICgoZXJyPT1VTlpfT0spICYmIChwZmlsZV9pbmZvX2ludGVybmFsIT1OVUxMKSkKKyAgICAgICAgKnBmaWxlX2luZm9faW50ZXJuYWw9ZmlsZV9pbmZvX2ludGVybmFsOworCisgICAgcmV0dXJuIGVycjsKK30KKworCisKKy8qCisgIFdyaXRlIGluZm8gYWJvdXQgdGhlIFppcEZpbGUgaW4gdGhlICpwZ2xvYmFsX2luZm8gc3RydWN0dXJlLgorICBObyBwcmVwYXJhdGlvbiBvZiB0aGUgc3RydWN0dXJlIGlzIG5lZWRlZAorICByZXR1cm4gVU5aX09LIGlmIHRoZXJlIGlzIG5vIHByb2JsZW0uCisqLworZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEN1cnJlbnRGaWxlSW5mbzY0ICh1bnpGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnpfZmlsZV9pbmZvNjQgKiBwZmlsZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIHN6RmlsZU5hbWUsIHVMb25nIGZpbGVOYW1lQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmV4dHJhRmllbGQsIHVMb25nIGV4dHJhRmllbGRCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogc3pDb21tZW50LCAgdUxvbmcgY29tbWVudEJ1ZmZlclNpemUpCit7CisgICAgcmV0dXJuIHVuejY0bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwoZmlsZSxwZmlsZV9pbmZvLE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekZpbGVOYW1lLGZpbGVOYW1lQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhRmllbGQsZXh0cmFGaWVsZEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekNvbW1lbnQsY29tbWVudEJ1ZmZlclNpemUpOworfQorCitleHRlcm4gaW50IFpFWFBPUlQgdW56R2V0Q3VycmVudEZpbGVJbmZvICh1bnpGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnpfZmlsZV9pbmZvICogcGZpbGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBzekZpbGVOYW1lLCB1TG9uZyBmaWxlTmFtZUJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpleHRyYUZpZWxkLCB1TG9uZyBleHRyYUZpZWxkQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIHN6Q29tbWVudCwgIHVMb25nIGNvbW1lbnRCdWZmZXJTaXplKQoreworICAgIGludCBlcnI7CisgICAgdW56X2ZpbGVfaW5mbzY0IGZpbGVfaW5mbzY0OworICAgIGVyciA9IHVuejY0bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwoZmlsZSwmZmlsZV9pbmZvNjQsTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6RmlsZU5hbWUsZmlsZU5hbWVCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFGaWVsZCxleHRyYUZpZWxkQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6Q29tbWVudCxjb21tZW50QnVmZmVyU2l6ZSk7CisgICAgaWYgKChlcnI9PVVOWl9PSykgJiYgKHBmaWxlX2luZm8gIT0gTlVMTCkpCisgICAgeworICAgICAgICBwZmlsZV9pbmZvLT52ZXJzaW9uID0gZmlsZV9pbmZvNjQudmVyc2lvbjsKKyAgICAgICAgcGZpbGVfaW5mby0+dmVyc2lvbl9uZWVkZWQgPSBmaWxlX2luZm82NC52ZXJzaW9uX25lZWRlZDsKKyAgICAgICAgcGZpbGVfaW5mby0+ZmxhZyA9IGZpbGVfaW5mbzY0LmZsYWc7CisgICAgICAgIHBmaWxlX2luZm8tPmNvbXByZXNzaW9uX21ldGhvZCA9IGZpbGVfaW5mbzY0LmNvbXByZXNzaW9uX21ldGhvZDsKKyAgICAgICAgcGZpbGVfaW5mby0+ZG9zRGF0ZSA9IGZpbGVfaW5mbzY0LmRvc0RhdGU7CisgICAgICAgIHBmaWxlX2luZm8tPmNyYyA9IGZpbGVfaW5mbzY0LmNyYzsKKworICAgICAgICBwZmlsZV9pbmZvLT5zaXplX2ZpbGVuYW1lID0gZmlsZV9pbmZvNjQuc2l6ZV9maWxlbmFtZTsKKyAgICAgICAgcGZpbGVfaW5mby0+c2l6ZV9maWxlX2V4dHJhID0gZmlsZV9pbmZvNjQuc2l6ZV9maWxlX2V4dHJhOworICAgICAgICBwZmlsZV9pbmZvLT5zaXplX2ZpbGVfY29tbWVudCA9IGZpbGVfaW5mbzY0LnNpemVfZmlsZV9jb21tZW50OworCisgICAgICAgIHBmaWxlX2luZm8tPmRpc2tfbnVtX3N0YXJ0ID0gZmlsZV9pbmZvNjQuZGlza19udW1fc3RhcnQ7CisgICAgICAgIHBmaWxlX2luZm8tPmludGVybmFsX2ZhID0gZmlsZV9pbmZvNjQuaW50ZXJuYWxfZmE7CisgICAgICAgIHBmaWxlX2luZm8tPmV4dGVybmFsX2ZhID0gZmlsZV9pbmZvNjQuZXh0ZXJuYWxfZmE7CisKKyAgICAgICAgcGZpbGVfaW5mby0+dG11X2RhdGUgPSBmaWxlX2luZm82NC50bXVfZGF0ZSwKKworCisgICAgICAgIHBmaWxlX2luZm8tPmNvbXByZXNzZWRfc2l6ZSA9ICh1TG9uZylmaWxlX2luZm82NC5jb21wcmVzc2VkX3NpemU7CisgICAgICAgIHBmaWxlX2luZm8tPnVuY29tcHJlc3NlZF9zaXplID0gKHVMb25nKWZpbGVfaW5mbzY0LnVuY29tcHJlc3NlZF9zaXplOworCisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisvKgorICBTZXQgdGhlIGN1cnJlbnQgZmlsZSBvZiB0aGUgemlwZmlsZSB0byB0aGUgZmlyc3QgZmlsZS4KKyAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtCisqLworZXh0ZXJuIGludCBaRVhQT1JUIHVuekdvVG9GaXJzdEZpbGUgKHVuekZpbGUgZmlsZSkKK3sKKyAgICBpbnQgZXJyPVVOWl9PSzsKKyAgICB1bno2NF9zKiBzOworICAgIGlmIChmaWxlPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisgICAgcz0odW56NjRfcyopZmlsZTsKKyAgICBzLT5wb3NfaW5fY2VudHJhbF9kaXI9cy0+b2Zmc2V0X2NlbnRyYWxfZGlyOworICAgIHMtPm51bV9maWxlPTA7CisgICAgZXJyPXVuejY0bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwoZmlsZSwmcy0+Y3VyX2ZpbGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5jdXJfZmlsZV9pbmZvX2ludGVybmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwwLE5VTEwsMCxOVUxMLDApOworICAgIHMtPmN1cnJlbnRfZmlsZV9vayA9IChlcnIgPT0gVU5aX09LKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKgorICBTZXQgdGhlIGN1cnJlbnQgZmlsZSBvZiB0aGUgemlwZmlsZSB0byB0aGUgbmV4dCBmaWxlLgorICByZXR1cm4gVU5aX09LIGlmIHRoZXJlIGlzIG5vIHByb2JsZW0KKyAgcmV0dXJuIFVOWl9FTkRfT0ZfTElTVF9PRl9GSUxFIGlmIHRoZSBhY3R1YWwgZmlsZSB3YXMgdGhlIGxhdGVzdC4KKyovCitleHRlcm4gaW50IFpFWFBPUlQgdW56R29Ub05leHRGaWxlICh1bnpGaWxlICBmaWxlKQoreworICAgIHVuejY0X3MqIHM7CisgICAgaW50IGVycjsKKworICAgIGlmIChmaWxlPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisgICAgcz0odW56NjRfcyopZmlsZTsKKyAgICBpZiAoIXMtPmN1cnJlbnRfZmlsZV9vaykKKyAgICAgICAgcmV0dXJuIFVOWl9FTkRfT0ZfTElTVF9PRl9GSUxFOworICAgIGlmIChzLT5naS5udW1iZXJfZW50cnkgIT0gMHhmZmZmKSAgICAvKiAyXjE2IGZpbGVzIG92ZXJmbG93IGhhY2sgKi8KKyAgICAgIGlmIChzLT5udW1fZmlsZSsxPT1zLT5naS5udW1iZXJfZW50cnkpCisgICAgICAgIHJldHVybiBVTlpfRU5EX09GX0xJU1RfT0ZfRklMRTsKKworICAgIHMtPnBvc19pbl9jZW50cmFsX2RpciArPSBTSVpFQ0VOVFJBTERJUklURU0gKyBzLT5jdXJfZmlsZV9pbmZvLnNpemVfZmlsZW5hbWUgKworICAgICAgICAgICAgcy0+Y3VyX2ZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmEgKyBzLT5jdXJfZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50IDsKKyAgICBzLT5udW1fZmlsZSsrOworICAgIGVyciA9IHVuejY0bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwoZmlsZSwmcy0+Y3VyX2ZpbGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmN1cl9maWxlX2luZm9faW50ZXJuYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsMCxOVUxMLDAsTlVMTCwwKTsKKyAgICBzLT5jdXJyZW50X2ZpbGVfb2sgPSAoZXJyID09IFVOWl9PSyk7CisgICAgcmV0dXJuIGVycjsKK30KKworCisvKgorICBUcnkgbG9jYXRlIHRoZSBmaWxlIHN6RmlsZU5hbWUgaW4gdGhlIHppcGZpbGUuCisgIEZvciB0aGUgaUNhc2VTZW5zaXRpdml0eSBzaWduaWZpY2F0aW9uLCBzZWUgdW56U3RyaW5nRmlsZU5hbWVDb21wYXJlCisKKyAgcmV0dXJuIHZhbHVlIDoKKyAgVU5aX09LIGlmIHRoZSBmaWxlIGlzIGZvdW5kLiBJdCBiZWNvbWVzIHRoZSBjdXJyZW50IGZpbGUuCisgIFVOWl9FTkRfT0ZfTElTVF9PRl9GSUxFIGlmIHRoZSBmaWxlIGlzIG5vdCBmb3VuZAorKi8KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpMb2NhdGVGaWxlICh1bnpGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKnN6RmlsZU5hbWUsIGludCBpQ2FzZVNlbnNpdGl2aXR5KQoreworICAgIHVuejY0X3MqIHM7CisgICAgaW50IGVycjsKKworICAgIC8qIFdlIHJlbWVtYmVyIHRoZSAnY3VycmVudCcgcG9zaXRpb24gaW4gdGhlIGZpbGUgc28gdGhhdCB3ZSBjYW4ganVtcAorICAgICAqIGJhY2sgdGhlcmUgaWYgd2UgZmFpbC4KKyAgICAgKi8KKyAgICB1bnpfZmlsZV9pbmZvNjQgY3VyX2ZpbGVfaW5mb1NhdmVkOworICAgIHVuel9maWxlX2luZm82NF9pbnRlcm5hbCBjdXJfZmlsZV9pbmZvX2ludGVybmFsU2F2ZWQ7CisgICAgWlBPUzY0X1QgbnVtX2ZpbGVTYXZlZDsKKyAgICBaUE9TNjRfVCBwb3NfaW5fY2VudHJhbF9kaXJTYXZlZDsKKworCisgICAgaWYgKGZpbGU9PU5VTEwpCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKKworICAgIGlmIChzdHJsZW4oc3pGaWxlTmFtZSk+PVVOWl9NQVhGSUxFTkFNRUlOWklQKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisKKyAgICBzPSh1bno2NF9zKilmaWxlOworICAgIGlmICghcy0+Y3VycmVudF9maWxlX29rKQorICAgICAgICByZXR1cm4gVU5aX0VORF9PRl9MSVNUX09GX0ZJTEU7CisKKyAgICAvKiBTYXZlIHRoZSBjdXJyZW50IHN0YXRlICovCisgICAgbnVtX2ZpbGVTYXZlZCA9IHMtPm51bV9maWxlOworICAgIHBvc19pbl9jZW50cmFsX2RpclNhdmVkID0gcy0+cG9zX2luX2NlbnRyYWxfZGlyOworICAgIGN1cl9maWxlX2luZm9TYXZlZCA9IHMtPmN1cl9maWxlX2luZm87CisgICAgY3VyX2ZpbGVfaW5mb19pbnRlcm5hbFNhdmVkID0gcy0+Y3VyX2ZpbGVfaW5mb19pbnRlcm5hbDsKKworICAgIGVyciA9IHVuekdvVG9GaXJzdEZpbGUoZmlsZSk7CisKKyAgICB3aGlsZSAoZXJyID09IFVOWl9PSykKKyAgICB7CisgICAgICAgIGNoYXIgc3pDdXJyZW50RmlsZU5hbWVbVU5aX01BWEZJTEVOQU1FSU5aSVArMV07CisgICAgICAgIGVyciA9IHVuekdldEN1cnJlbnRGaWxlSW5mbzY0KGZpbGUsTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6Q3VycmVudEZpbGVOYW1lLHNpemVvZihzekN1cnJlbnRGaWxlTmFtZSktMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsMCxOVUxMLDApOworICAgICAgICBpZiAoZXJyID09IFVOWl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHVuelN0cmluZ0ZpbGVOYW1lQ29tcGFyZShzekN1cnJlbnRGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pGaWxlTmFtZSxpQ2FzZVNlbnNpdGl2aXR5KT09MCkKKyAgICAgICAgICAgICAgICByZXR1cm4gVU5aX09LOworICAgICAgICAgICAgZXJyID0gdW56R29Ub05leHRGaWxlKGZpbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogV2UgZmFpbGVkLCBzbyByZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgJ2N1cnJlbnQgZmlsZScgdG8gd2hlcmUgd2UKKyAgICAgKiB3ZXJlLgorICAgICAqLworICAgIHMtPm51bV9maWxlID0gbnVtX2ZpbGVTYXZlZCA7CisgICAgcy0+cG9zX2luX2NlbnRyYWxfZGlyID0gcG9zX2luX2NlbnRyYWxfZGlyU2F2ZWQgOworICAgIHMtPmN1cl9maWxlX2luZm8gPSBjdXJfZmlsZV9pbmZvU2F2ZWQ7CisgICAgcy0+Y3VyX2ZpbGVfaW5mb19pbnRlcm5hbCA9IGN1cl9maWxlX2luZm9faW50ZXJuYWxTYXZlZDsKKyAgICByZXR1cm4gZXJyOworfQorCisKKy8qCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb250cmlidXRlZCBieSBSeWFuIEhha3NpIChtYWlsdG86Ly9jcnlvZ2VuQGluZm9zZXJ2ZS5uZXQpCisvLyBJIG5lZWQgcmFuZG9tIGFjY2VzcworLy8KKy8vIEZ1cnRoZXIgb3B0aW1pemF0aW9uIGNvdWxkIGJlIHJlYWxpemVkIGJ5IGFkZGluZyBhbiBhYmlsaXR5CisvLyB0byBjYWNoZSB0aGUgZGlyZWN0b3J5IGluIG1lbW9yeS4gVGhlIGdvYWwgYmVpbmcgYSBzaW5nbGUKKy8vIGNvbXByZWhlbnNpdmUgZmlsZSByZWFkIHRvIHB1dCB0aGUgZmlsZSBJIG5lZWQgaW4gYSBtZW1vcnkuCisqLworCisvKgordHlwZWRlZiBzdHJ1Y3QgdW56X2ZpbGVfcG9zX3MKK3sKKyAgICBaUE9TNjRfVCBwb3NfaW5femlwX2RpcmVjdG9yeTsgICAvLyBvZmZzZXQgaW4gZmlsZQorICAgIFpQT1M2NF9UIG51bV9vZl9maWxlOyAgICAgICAgICAgIC8vICMgb2YgZmlsZQorfSB1bnpfZmlsZV9wb3M7CisqLworCitleHRlcm4gaW50IFpFWFBPUlQgdW56R2V0RmlsZVBvczY0KHVuekZpbGUgZmlsZSwgdW56NjRfZmlsZV9wb3MqICBmaWxlX3BvcykKK3sKKyAgICB1bno2NF9zKiBzOworCisgICAgaWYgKGZpbGU9PU5VTEwgfHwgZmlsZV9wb3M9PU5VTEwpCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKKyAgICBzPSh1bno2NF9zKilmaWxlOworICAgIGlmICghcy0+Y3VycmVudF9maWxlX29rKQorICAgICAgICByZXR1cm4gVU5aX0VORF9PRl9MSVNUX09GX0ZJTEU7CisKKyAgICBmaWxlX3Bvcy0+cG9zX2luX3ppcF9kaXJlY3RvcnkgID0gcy0+cG9zX2luX2NlbnRyYWxfZGlyOworICAgIGZpbGVfcG9zLT5udW1fb2ZfZmlsZSAgICAgICAgICAgPSBzLT5udW1fZmlsZTsKKworICAgIHJldHVybiBVTlpfT0s7Cit9CisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRGaWxlUG9zKAorICAgIHVuekZpbGUgZmlsZSwKKyAgICB1bnpfZmlsZV9wb3MqIGZpbGVfcG9zKQoreworICAgIHVuejY0X2ZpbGVfcG9zIGZpbGVfcG9zNjQ7CisgICAgaW50IGVyciA9IHVuekdldEZpbGVQb3M2NChmaWxlLCZmaWxlX3BvczY0KTsKKyAgICBpZiAoZXJyPT1VTlpfT0spCisgICAgeworICAgICAgICBmaWxlX3Bvcy0+cG9zX2luX3ppcF9kaXJlY3RvcnkgPSAodUxvbmcpZmlsZV9wb3M2NC5wb3NfaW5femlwX2RpcmVjdG9yeTsKKyAgICAgICAgZmlsZV9wb3MtPm51bV9vZl9maWxlID0gKHVMb25nKWZpbGVfcG9zNjQubnVtX29mX2ZpbGU7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHb1RvRmlsZVBvczY0KHVuekZpbGUgZmlsZSwgY29uc3QgdW56NjRfZmlsZV9wb3MqIGZpbGVfcG9zKQoreworICAgIHVuejY0X3MqIHM7CisgICAgaW50IGVycjsKKworICAgIGlmIChmaWxlPT1OVUxMIHx8IGZpbGVfcG9zPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisgICAgcz0odW56NjRfcyopZmlsZTsKKworICAgIC8qIGp1bXAgdG8gdGhlIHJpZ2h0IHNwb3QgKi8KKyAgICBzLT5wb3NfaW5fY2VudHJhbF9kaXIgPSBmaWxlX3Bvcy0+cG9zX2luX3ppcF9kaXJlY3Rvcnk7CisgICAgcy0+bnVtX2ZpbGUgICAgICAgICAgID0gZmlsZV9wb3MtPm51bV9vZl9maWxlOworCisgICAgLyogc2V0IHRoZSBjdXJyZW50IGZpbGUgKi8KKyAgICBlcnIgPSB1bno2NGxvY2FsX0dldEN1cnJlbnRGaWxlSW5mb0ludGVybmFsKGZpbGUsJnMtPmN1cl9maWxlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5jdXJfZmlsZV9pbmZvX2ludGVybmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLDAsTlVMTCwwLE5VTEwsMCk7CisgICAgLyogcmV0dXJuIHJlc3VsdHMgKi8KKyAgICBzLT5jdXJyZW50X2ZpbGVfb2sgPSAoZXJyID09IFVOWl9PSyk7CisgICAgcmV0dXJuIGVycjsKK30KKworZXh0ZXJuIGludCBaRVhQT1JUIHVuekdvVG9GaWxlUG9zKAorICAgIHVuekZpbGUgZmlsZSwKKyAgICB1bnpfZmlsZV9wb3MqIGZpbGVfcG9zKQoreworICAgIHVuejY0X2ZpbGVfcG9zIGZpbGVfcG9zNjQ7CisgICAgaWYgKGZpbGVfcG9zID09IE5VTEwpCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKKworICAgIGZpbGVfcG9zNjQucG9zX2luX3ppcF9kaXJlY3RvcnkgPSBmaWxlX3Bvcy0+cG9zX2luX3ppcF9kaXJlY3Rvcnk7CisgICAgZmlsZV9wb3M2NC5udW1fb2ZfZmlsZSA9IGZpbGVfcG9zLT5udW1fb2ZfZmlsZTsKKyAgICByZXR1cm4gdW56R29Ub0ZpbGVQb3M2NChmaWxlLCZmaWxlX3BvczY0KTsKK30KKworLyoKKy8vIFVuemlwIEhlbHBlciBGdW5jdGlvbnMgLSBzaG91bGQgYmUgaGVyZT8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyovCisKKy8qCisgIFJlYWQgdGhlIGxvY2FsIGhlYWRlciBvZiB0aGUgY3VycmVudCB6aXBmaWxlCisgIENoZWNrIHRoZSBjb2hlcmVuY3kgb2YgdGhlIGxvY2FsIGhlYWRlciBhbmQgaW5mbyBpbiB0aGUgZW5kIG9mIGNlbnRyYWwKKyAgICAgICAgZGlyZWN0b3J5IGFib3V0IHRoaXMgZmlsZQorICBzdG9yZSBpbiAqcGlTaXplVmFyIHRoZSBzaXplIG9mIGV4dHJhIGluZm8gaW4gbG9jYWwgaGVhZGVyCisgICAgICAgIChmaWxlbmFtZSBhbmQgc2l6ZSBvZiBleHRyYSBmaWVsZCBkYXRhKQorKi8KK2xvY2FsIGludCB1bno2NGxvY2FsX0NoZWNrQ3VycmVudEZpbGVDb2hlcmVuY3lIZWFkZXIgKHVuejY0X3MqIHMsIHVJbnQqIHBpU2l6ZVZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaUE9TNjRfVCAqIHBvZmZzZXRfbG9jYWxfZXh0cmFmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50ICAqIHBzaXplX2xvY2FsX2V4dHJhZmllbGQpCit7CisgICAgdUxvbmcgdU1hZ2ljLHVEYXRhLHVGbGFnczsKKyAgICB1TG9uZyBzaXplX2ZpbGVuYW1lOworICAgIHVMb25nIHNpemVfZXh0cmFfZmllbGQ7CisgICAgaW50IGVycj1VTlpfT0s7CisKKyAgICAqcGlTaXplVmFyID0gMDsKKyAgICAqcG9mZnNldF9sb2NhbF9leHRyYWZpZWxkID0gMDsKKyAgICAqcHNpemVfbG9jYWxfZXh0cmFmaWVsZCA9IDA7CisKKyAgICBpZiAoWlNFRUs2NChzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLHMtPmN1cl9maWxlX2luZm9faW50ZXJuYWwub2Zmc2V0X2N1cmZpbGUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ieXRlX2JlZm9yZV90aGVfemlwZmlsZSxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKKyAgICAgICAgcmV0dXJuIFVOWl9FUlJOTzsKKworCisgICAgaWYgKGVycj09VU5aX09LKQorICAgIHsKKyAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdU1hZ2ljKSAhPSBVTlpfT0spCisgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworICAgICAgICBlbHNlIGlmICh1TWFnaWMhPTB4MDQwMzRiNTApCisgICAgICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7CisgICAgfQorCisgICAgaWYgKHVuejY0bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVEYXRhKSAhPSBVTlpfT0spCisgICAgICAgIGVycj1VTlpfRVJSTk87CisvKgorICAgIGVsc2UgaWYgKChlcnI9PVVOWl9PSykgJiYgKHVEYXRhIT1zLT5jdXJfZmlsZV9pbmZvLndWZXJzaW9uKSkKKyAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOworKi8KKyAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdUZsYWdzKSAhPSBVTlpfT0spCisgICAgICAgIGVycj1VTlpfRVJSTk87CisKKyAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdURhdGEpICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKKyAgICBlbHNlIGlmICgoZXJyPT1VTlpfT0spICYmICh1RGF0YSE9cy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2QpKQorICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7CisKKyAgICBpZiAoKGVycj09VU5aX09LKSAmJiAocy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2QhPTApICYmCisvKiAjaWZkZWYgSEFWRV9CWklQMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZCE9Wl9CWklQMkVEKSAmJgorLyogI2VuZGlmICovCisgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmN1cl9maWxlX2luZm8uY29tcHJlc3Npb25fbWV0aG9kIT1aX0RFRkxBVEVEKSkKKyAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOworCisgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdURhdGEpICE9IFVOWl9PSykgLyogZGF0ZS90aW1lICovCisgICAgICAgIGVycj1VTlpfRVJSTk87CisKKyAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZ1RGF0YSkgIT0gVU5aX09LKSAvKiBjcmMgKi8KKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKKyAgICBlbHNlIGlmICgoZXJyPT1VTlpfT0spICYmICh1RGF0YSE9cy0+Y3VyX2ZpbGVfaW5mby5jcmMpICYmICgodUZsYWdzICYgOCk9PTApKQorICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7CisKKyAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZ1RGF0YSkgIT0gVU5aX09LKSAvKiBzaXplIGNvbXByICovCisgICAgICAgIGVycj1VTlpfRVJSTk87CisgICAgZWxzZSBpZiAodURhdGEgIT0gMHhGRkZGRkZGRiAmJiAoZXJyPT1VTlpfT0spICYmICh1RGF0YSE9cy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2VkX3NpemUpICYmICgodUZsYWdzICYgOCk9PTApKQorICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7CisKKyAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZ1RGF0YSkgIT0gVU5aX09LKSAvKiBzaXplIHVuY29tcHIgKi8KKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKKyAgICBlbHNlIGlmICh1RGF0YSAhPSAweEZGRkZGRkZGICYmIChlcnI9PVVOWl9PSykgJiYgKHVEYXRhIT1zLT5jdXJfZmlsZV9pbmZvLnVuY29tcHJlc3NlZF9zaXplKSAmJiAoKHVGbGFncyAmIDgpPT0wKSkKKyAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOworCisgICAgaWYgKHVuejY0bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnNpemVfZmlsZW5hbWUpICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKKyAgICBlbHNlIGlmICgoZXJyPT1VTlpfT0spICYmIChzaXplX2ZpbGVuYW1lIT1zLT5jdXJfZmlsZV9pbmZvLnNpemVfZmlsZW5hbWUpKQorICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7CisKKyAgICAqcGlTaXplVmFyICs9ICh1SW50KXNpemVfZmlsZW5hbWU7CisKKyAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmc2l6ZV9leHRyYV9maWVsZCkgIT0gVU5aX09LKQorICAgICAgICBlcnI9VU5aX0VSUk5POworICAgICpwb2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQ9IHMtPmN1cl9maWxlX2luZm9faW50ZXJuYWwub2Zmc2V0X2N1cmZpbGUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0laRVpJUExPQ0FMSEVBREVSICsgc2l6ZV9maWxlbmFtZTsKKyAgICAqcHNpemVfbG9jYWxfZXh0cmFmaWVsZCA9ICh1SW50KXNpemVfZXh0cmFfZmllbGQ7CisKKyAgICAqcGlTaXplVmFyICs9ICh1SW50KXNpemVfZXh0cmFfZmllbGQ7CisKKyAgICByZXR1cm4gZXJyOworfQorCisvKgorICBPcGVuIGZvciByZWFkaW5nIGRhdGEgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgemlwZmlsZS4KKyAgSWYgdGhlcmUgaXMgbm8gZXJyb3IgYW5kIHRoZSBmaWxlIGlzIG9wZW5lZCwgdGhlIHJldHVybiB2YWx1ZSBpcyBVTlpfT0suCisqLworZXh0ZXJuIGludCBaRVhQT1JUIHVuek9wZW5DdXJyZW50RmlsZTMgKHVuekZpbGUgZmlsZSwgaW50KiBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbGV2ZWwsIGludCByYXcsIGNvbnN0IGNoYXIqIHBhc3N3b3JkKQoreworICAgIGludCBlcnI9VU5aX09LOworICAgIHVJbnQgaVNpemVWYXI7CisgICAgdW56NjRfcyogczsKKyAgICBmaWxlX2luX3ppcDY0X3JlYWRfaW5mb19zKiBwZmlsZV9pbl96aXBfcmVhZF9pbmZvOworICAgIFpQT1M2NF9UIG9mZnNldF9sb2NhbF9leHRyYWZpZWxkOyAgLyogb2Zmc2V0IG9mIHRoZSBsb2NhbCBleHRyYSBmaWVsZCAqLworICAgIHVJbnQgIHNpemVfbG9jYWxfZXh0cmFmaWVsZDsgICAgLyogc2l6ZSBvZiB0aGUgbG9jYWwgZXh0cmEgZmllbGQgKi8KKyMgICAgaWZuZGVmIE5PVU5DUllQVAorICAgIGNoYXIgc291cmNlWzEyXTsKKyMgICAgZWxzZQorICAgIGlmIChwYXNzd29yZCAhPSBOVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisjICAgIGVuZGlmCisKKyAgICBpZiAoZmlsZT09TlVMTCkKKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOworICAgIHM9KHVuejY0X3MqKWZpbGU7CisgICAgaWYgKCFzLT5jdXJyZW50X2ZpbGVfb2spCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKKworICAgIGlmIChzLT5wZmlsZV9pbl96aXBfcmVhZCAhPSBOVUxMKQorICAgICAgICB1bnpDbG9zZUN1cnJlbnRGaWxlKGZpbGUpOworCisgICAgaWYgKHVuejY0bG9jYWxfQ2hlY2tDdXJyZW50RmlsZUNvaGVyZW5jeUhlYWRlcihzLCZpU2l6ZVZhciwgJm9mZnNldF9sb2NhbF9leHRyYWZpZWxkLCZzaXplX2xvY2FsX2V4dHJhZmllbGQpIT1VTlpfT0spCisgICAgICAgIHJldHVybiBVTlpfQkFEWklQRklMRTsKKworICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8gPSAoZmlsZV9pbl96aXA2NF9yZWFkX2luZm9fcyopQUxMT0Moc2l6ZW9mKGZpbGVfaW5femlwNjRfcmVhZF9pbmZvX3MpKTsKKyAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mbz09TlVMTCkKKyAgICAgICAgcmV0dXJuIFVOWl9JTlRFUk5BTEVSUk9SOworCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXI9KGNoYXIqKUFMTE9DKFVOWl9CVUZTSVpFKTsKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5vZmZzZXRfbG9jYWxfZXh0cmFmaWVsZCA9IG9mZnNldF9sb2NhbF9leHRyYWZpZWxkOworICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnNpemVfbG9jYWxfZXh0cmFmaWVsZCA9IHNpemVfbG9jYWxfZXh0cmFmaWVsZDsKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5wb3NfbG9jYWxfZXh0cmFmaWVsZD0wOworICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJhdz1yYXc7CisKKyAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXI9PU5VTEwpCisgICAgeworICAgICAgICBUUllGUkVFKHBmaWxlX2luX3ppcF9yZWFkX2luZm8pOworICAgICAgICByZXR1cm4gVU5aX0lOVEVSTkFMRVJST1I7CisgICAgfQorCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtX2luaXRpYWxpc2VkPTA7CisKKyAgICBpZiAobWV0aG9kIT1OVUxMKQorICAgICAgICAqbWV0aG9kID0gKGludClzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZDsKKworICAgIGlmIChsZXZlbCE9TlVMTCkKKyAgICB7CisgICAgICAgICpsZXZlbCA9IDY7CisgICAgICAgIHN3aXRjaCAocy0+Y3VyX2ZpbGVfaW5mby5mbGFnICYgMHgwNikKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgNiA6ICpsZXZlbCA9IDE7IGJyZWFrOworICAgICAgICAgIGNhc2UgNCA6ICpsZXZlbCA9IDI7IGJyZWFrOworICAgICAgICAgIGNhc2UgMiA6ICpsZXZlbCA9IDk7IGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZCE9MCkgJiYKKy8qICNpZmRlZiBIQVZFX0JaSVAyICovCisgICAgICAgIChzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZCE9Wl9CWklQMkVEKSAmJgorLyogI2VuZGlmICovCisgICAgICAgIChzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZCE9Wl9ERUZMQVRFRCkpCisKKyAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOworCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y3JjMzJfd2FpdD1zLT5jdXJfZmlsZV9pbmZvLmNyYzsKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMj0wOworICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnRvdGFsX291dF82ND0wOworICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmNvbXByZXNzaW9uX21ldGhvZCA9IHMtPmN1cl9maWxlX2luZm8uY29tcHJlc3Npb25fbWV0aG9kOworICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmZpbGVzdHJlYW09cy0+ZmlsZXN0cmVhbTsKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT56X2ZpbGVmdW5jPXMtPnpfZmlsZWZ1bmM7CisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+Ynl0ZV9iZWZvcmVfdGhlX3ppcGZpbGU9cy0+Ynl0ZV9iZWZvcmVfdGhlX3ppcGZpbGU7CisKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0udG90YWxfb3V0ID0gMDsKKworICAgIGlmICgocy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2Q9PVpfQlpJUDJFRCkgJiYgKCFyYXcpKQorICAgIHsKKyNpZmRlZiBIQVZFX0JaSVAyCisgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ic3RyZWFtLmJ6YWxsb2MgPSAodm9pZCAqKCopICh2b2lkICosIGludCwgaW50KSkwOworICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbS5iemZyZWUgPSAoZnJlZV9mdW5jKTA7CisgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ic3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKKyAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJzdHJlYW0uc3RhdGUgPSAodm9pZHBmKTA7CisKKyAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOworICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOworICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKKyAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5uZXh0X2luID0gKHZvaWRwZikwOworICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luID0gMDsKKworICAgICAgZXJyPUJaMl9iekRlY29tcHJlc3NJbml0KCZwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ic3RyZWFtLCAwLCAwKTsKKyAgICAgIGlmIChlcnIgPT0gWl9PSykKKyAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtX2luaXRpYWxpc2VkPVpfQlpJUDJFRDsKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgVFJZRlJFRShwZmlsZV9pbl96aXBfcmVhZF9pbmZvKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgIH0KKyNlbHNlCisgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yYXc9MTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlIGlmICgocy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2Q9PVpfREVGTEFURUQpICYmICghcmF3KSkKKyAgICB7CisgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKKyAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKyAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9pbiA9IDA7CisgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfaW4gPSAwOworCisgICAgICBlcnI9aW5mbGF0ZUluaXQyKCZwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0sIC1NQVhfV0JJVFMpOworICAgICAgaWYgKGVyciA9PSBaX09LKQorICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW1faW5pdGlhbGlzZWQ9Wl9ERUZMQVRFRDsKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgVFJZRlJFRShwZmlsZV9pbl96aXBfcmVhZF9pbmZvKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgIH0KKyAgICAgICAgLyogd2luZG93Qml0cyBpcyBwYXNzZWQgPCAwIHRvIHRlbGwgdGhhdCB0aGVyZSBpcyBubyB6bGliIGhlYWRlci4KKyAgICAgICAgICogTm90ZSB0aGF0IGluIHRoaXMgY2FzZSBpbmZsYXRlICpyZXF1aXJlcyogYW4gZXh0cmEgImR1bW15IiBieXRlCisgICAgICAgICAqIGFmdGVyIHRoZSBjb21wcmVzc2VkIHN0cmVhbSBpbiBvcmRlciB0byBjb21wbGV0ZSBkZWNvbXByZXNzaW9uIGFuZAorICAgICAgICAgKiByZXR1cm4gWl9TVFJFQU1fRU5ELgorICAgICAgICAgKiBJbiB1bnppcCwgaSBkb24ndCB3YWl0IGFic29sdXRlbHkgWl9TVFJFQU1fRU5EIGJlY2F1c2UgSSBrbm93biB0aGUKKyAgICAgICAgICogc2l6ZSBvZiBib3RoIGNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBkYXRhCisgICAgICAgICAqLworICAgIH0KKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZCA9CisgICAgICAgICAgICBzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzZWRfc2l6ZSA7CisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZCA9CisgICAgICAgICAgICBzLT5jdXJfZmlsZV9pbmZvLnVuY29tcHJlc3NlZF9zaXplIDsKKworCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cG9zX2luX3ppcGZpbGUgPQorICAgICAgICAgICAgcy0+Y3VyX2ZpbGVfaW5mb19pbnRlcm5hbC5vZmZzZXRfY3VyZmlsZSArIFNJWkVaSVBMT0NBTEhFQURFUiArCisgICAgICAgICAgICAgIGlTaXplVmFyOworCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luID0gKHVJbnQpMDsKKworICAgIHMtPnBmaWxlX2luX3ppcF9yZWFkID0gcGZpbGVfaW5femlwX3JlYWRfaW5mbzsKKyAgICAgICAgICAgICAgICBzLT5lbmNyeXB0ZWQgPSAwOworCisjICAgIGlmbmRlZiBOT1VOQ1JZUFQKKyAgICBpZiAocGFzc3dvcmQgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBzLT5wY3JjXzMyX3RhYiA9IGdldF9jcmNfdGFibGUoKTsKKyAgICAgICAgaW5pdF9rZXlzKHBhc3N3b3JkLHMtPmtleXMscy0+cGNyY18zMl90YWIpOworICAgICAgICBpZiAoWlNFRUs2NChzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLAorICAgICAgICAgICAgICAgICAgcy0+cGZpbGVfaW5femlwX3JlYWQtPnBvc19pbl96aXBmaWxlICsKKyAgICAgICAgICAgICAgICAgICAgIHMtPnBmaWxlX2luX3ppcF9yZWFkLT5ieXRlX2JlZm9yZV90aGVfemlwZmlsZSwKKyAgICAgICAgICAgICAgICAgIFNFRUtfU0VUKSE9MCkKKyAgICAgICAgICAgIHJldHVybiBVTlpfSU5URVJOQUxFUlJPUjsKKyAgICAgICAgaWYoWlJFQUQ2NChzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLHNvdXJjZSwgMTIpPDEyKQorICAgICAgICAgICAgcmV0dXJuIFVOWl9JTlRFUk5BTEVSUk9SOworCisgICAgICAgIGZvciAoaSA9IDA7IGk8MTI7IGkrKykKKyAgICAgICAgICAgIHpkZWNvZGUocy0+a2V5cyxzLT5wY3JjXzMyX3RhYixzb3VyY2VbaV0pOworCisgICAgICAgIHMtPnBmaWxlX2luX3ppcF9yZWFkLT5wb3NfaW5femlwZmlsZSs9MTI7CisgICAgICAgIHMtPmVuY3J5cHRlZD0xOworICAgIH0KKyMgICAgZW5kaWYKKworCisgICAgcmV0dXJuIFVOWl9PSzsKK30KKworZXh0ZXJuIGludCBaRVhQT1JUIHVuek9wZW5DdXJyZW50RmlsZSAodW56RmlsZSBmaWxlKQoreworICAgIHJldHVybiB1bnpPcGVuQ3VycmVudEZpbGUzKGZpbGUsIE5VTEwsIE5VTEwsIDAsIE5VTEwpOworfQorCitleHRlcm4gaW50IFpFWFBPUlQgdW56T3BlbkN1cnJlbnRGaWxlUGFzc3dvcmQgKHVuekZpbGUgZmlsZSwgY29uc3QgY2hhciogIHBhc3N3b3JkKQoreworICAgIHJldHVybiB1bnpPcGVuQ3VycmVudEZpbGUzKGZpbGUsIE5VTEwsIE5VTEwsIDAsIHBhc3N3b3JkKTsKK30KKworZXh0ZXJuIGludCBaRVhQT1JUIHVuek9wZW5DdXJyZW50RmlsZTIgKHVuekZpbGUgZmlsZSwgaW50KiBtZXRob2QsIGludCogbGV2ZWwsIGludCByYXcpCit7CisgICAgcmV0dXJuIHVuek9wZW5DdXJyZW50RmlsZTMoZmlsZSwgbWV0aG9kLCBsZXZlbCwgcmF3LCBOVUxMKTsKK30KKworLyoqIEFkZGl0aW9uIGZvciBHREFMIDogU1RBUlQgKi8KKworZXh0ZXJuIFpQT1M2NF9UIFpFWFBPUlQgdW56R2V0Q3VycmVudEZpbGVaU3RyZWFtUG9zNjQoIHVuekZpbGUgZmlsZSkKK3sKKyAgICB1bno2NF9zKiBzOworICAgIGZpbGVfaW5femlwNjRfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkX2luZm87CisgICAgcz0odW56NjRfcyopZmlsZTsKKyAgICBpZiAoZmlsZT09TlVMTCkKKyAgICAgICAgcmV0dXJuIDA7IC8vVU5aX1BBUkFNRVJST1I7CisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mbz1zLT5wZmlsZV9pbl96aXBfcmVhZDsKKyAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mbz09TlVMTCkKKyAgICAgICAgcmV0dXJuIDA7IC8vVU5aX1BBUkFNRVJST1I7CisgICAgcmV0dXJuIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnBvc19pbl96aXBmaWxlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ieXRlX2JlZm9yZV90aGVfemlwZmlsZTsKK30KKworLyoqIEFkZGl0aW9uIGZvciBHREFMIDogRU5EICovCisKKy8qCisgIFJlYWQgYnl0ZXMgZnJvbSB0aGUgY3VycmVudCBmaWxlLgorICBidWYgY29udGFpbiBidWZmZXIgd2hlcmUgZGF0YSBtdXN0IGJlIGNvcGllZAorICBsZW4gdGhlIHNpemUgb2YgYnVmLgorCisgIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGUgY29waWVkIGlmIHNvbWVzIGJ5dGVzIGFyZSBjb3BpZWQKKyAgcmV0dXJuIDAgaWYgdGhlIGVuZCBvZiBmaWxlIHdhcyByZWFjaGVkCisgIHJldHVybiA8MCB3aXRoIGVycm9yIGNvZGUgaWYgdGhlcmUgaXMgYW4gZXJyb3IKKyAgICAoVU5aX0VSUk5PIGZvciBJTyBlcnJvciwgb3IgekxpYiBlcnJvciBmb3IgdW5jb21wcmVzcyBlcnJvcikKKyovCitleHRlcm4gaW50IFpFWFBPUlQgdW56UmVhZEN1cnJlbnRGaWxlICAodW56RmlsZSBmaWxlLCB2b2lkcCBidWYsIHVuc2lnbmVkIGxlbikKK3sKKyAgICBpbnQgZXJyPVVOWl9PSzsKKyAgICB1SW50IGlSZWFkID0gMDsKKyAgICB1bno2NF9zKiBzOworICAgIGZpbGVfaW5femlwNjRfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkX2luZm87CisgICAgaWYgKGZpbGU9PU5VTEwpCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKKyAgICBzPSh1bno2NF9zKilmaWxlOworICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm89cy0+cGZpbGVfaW5femlwX3JlYWQ7CisKKyAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mbz09TlVMTCkKKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOworCisKKyAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFVOWl9FTkRfT0ZfTElTVF9PRl9GSUxFOworICAgIGlmIChsZW49PTApCisgICAgICAgIHJldHVybiAwOworCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfb3V0ID0gKEJ5dGVmKilidWY7CisKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpbGVuOworCisgICAgaWYgKChsZW4+cGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZCkgJiYKKyAgICAgICAgKCEocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmF3KSkpCisgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9vdXQgPQorICAgICAgICAgICAgKHVJbnQpcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZDsKKworICAgIGlmICgobGVuPnBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF9jb21wcmVzc2VkKworICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfaW4pICYmCisgICAgICAgICAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmF3KSkKKyAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dCA9CisgICAgICAgICAgICAodUludClwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZCsKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbjsKKworICAgIHdoaWxlIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfb3V0PjApCisgICAgeworICAgICAgICBpZiAoKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbj09MCkgJiYKKyAgICAgICAgICAgIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZD4wKSkKKyAgICAgICAgeworICAgICAgICAgICAgdUludCB1UmVhZFRoaXMgPSBVTlpfQlVGU0laRTsKKyAgICAgICAgICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZDx1UmVhZFRoaXMpCisgICAgICAgICAgICAgICAgdVJlYWRUaGlzID0gKHVJbnQpcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX2NvbXByZXNzZWQ7CisgICAgICAgICAgICBpZiAodVJlYWRUaGlzID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIFVOWl9FT0Y7CisgICAgICAgICAgICBpZiAoWlNFRUs2NChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT56X2ZpbGVmdW5jLAorICAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmZpbGVzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cG9zX2luX3ppcGZpbGUgKworICAgICAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQorICAgICAgICAgICAgICAgIHJldHVybiBVTlpfRVJSTk87CisgICAgICAgICAgICBpZiAoWlJFQUQ2NChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT56X2ZpbGVmdW5jLAorICAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmZpbGVzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgdVJlYWRUaGlzKSE9dVJlYWRUaGlzKQorICAgICAgICAgICAgICAgIHJldHVybiBVTlpfRVJSTk87CisKKworIyAgICAgICAgICAgIGlmbmRlZiBOT1VOQ1JZUFQKKyAgICAgICAgICAgIGlmKHMtPmVuY3J5cHRlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1SW50IGk7CisgICAgICAgICAgICAgICAgZm9yKGk9MDtpPHVSZWFkVGhpcztpKyspCisgICAgICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZWFkX2J1ZmZlcltpXSA9CisgICAgICAgICAgICAgICAgICAgICAgemRlY29kZShzLT5rZXlzLHMtPnBjcmNfMzJfdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXJbaV0pOworICAgICAgICAgICAgfQorIyAgICAgICAgICAgIGVuZGlmCisKKworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cG9zX2luX3ppcGZpbGUgKz0gdVJlYWRUaGlzOworCisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZC09dVJlYWRUaGlzOworCisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9pbiA9CisgICAgICAgICAgICAgICAgKEJ5dGVmKilwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZWFkX2J1ZmZlcjsKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXVSZWFkVGhpczsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y29tcHJlc3Npb25fbWV0aG9kPT0wKSB8fCAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmF3KSkKKyAgICAgICAgeworICAgICAgICAgICAgdUludCB1RG9Db3B5LGkgOworCisgICAgICAgICAgICBpZiAoKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbiA9PSAwKSAmJgorICAgICAgICAgICAgICAgIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZCA9PSAwKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGlSZWFkPT0wKSA/IFVOWl9FT0YgOiBpUmVhZDsKKworICAgICAgICAgICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9vdXQgPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbikKKyAgICAgICAgICAgICAgICB1RG9Db3B5ID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dCA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdURvQ29weSA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbiA7CisKKyAgICAgICAgICAgIGZvciAoaT0wO2k8dURvQ29weTtpKyspCisgICAgICAgICAgICAgICAgKihwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9vdXQraSkgPQorICAgICAgICAgICAgICAgICAgICAgICAgKihwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9pbitpKTsKKworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+dG90YWxfb3V0XzY0ID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+dG90YWxfb3V0XzY0ICsgdURvQ29weTsKKworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y3JjMzIgPSBjcmMzMihwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1RG9Db3B5KTsKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF91bmNvbXByZXNzZWQtPXVEb0NvcHk7CisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfaW4gLT0gdURvQ29weTsKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9vdXQgLT0gdURvQ29weTsKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5uZXh0X291dCArPSB1RG9Db3B5OworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfaW4gKz0gdURvQ29weTsKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS50b3RhbF9vdXQgKz0gdURvQ29weTsKKyAgICAgICAgICAgIGlSZWFkICs9IHVEb0NvcHk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y29tcHJlc3Npb25fbWV0aG9kPT1aX0JaSVAyRUQpCisgICAgICAgIHsKKyNpZmRlZiBIQVZFX0JaSVAyCisgICAgICAgICAgICB1TG9uZyB1VG90YWxPdXRCZWZvcmUsdVRvdGFsT3V0QWZ0ZXI7CisgICAgICAgICAgICBjb25zdCBCeXRlZiAqYnVmQmVmb3JlOworICAgICAgICAgICAgdUxvbmcgdU91dFRoaXM7CisKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJzdHJlYW0ubmV4dF9pbiAgICAgICAgPSAoY2hhciopcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfaW47CisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ic3RyZWFtLmF2YWlsX2luICAgICAgID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luOworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbS50b3RhbF9pbl9sbzMyICA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS50b3RhbF9pbjsKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJzdHJlYW0udG90YWxfaW5faGkzMiAgPSAwOworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbS5uZXh0X291dCAgICAgICA9IChjaGFyKilwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9vdXQ7CisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ic3RyZWFtLmF2YWlsX291dCAgICAgID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dDsKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJzdHJlYW0udG90YWxfb3V0X2xvMzIgPSBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0udG90YWxfb3V0OworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbS50b3RhbF9vdXRfaGkzMiA9IDA7CisKKyAgICAgICAgICAgIHVUb3RhbE91dEJlZm9yZSA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJzdHJlYW0udG90YWxfb3V0X2xvMzI7CisgICAgICAgICAgICBidWZCZWZvcmUgPSAoY29uc3QgQnl0ZWYgKilwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ic3RyZWFtLm5leHRfb3V0OworCisgICAgICAgICAgICBlcnI9QloyX2J6RGVjb21wcmVzcygmcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbSk7CisKKyAgICAgICAgICAgIHVUb3RhbE91dEFmdGVyID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbS50b3RhbF9vdXRfbG8zMjsKKyAgICAgICAgICAgIHVPdXRUaGlzID0gdVRvdGFsT3V0QWZ0ZXItdVRvdGFsT3V0QmVmb3JlOworCisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT50b3RhbF9vdXRfNjQgPSBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT50b3RhbF9vdXRfNjQgKyB1T3V0VGhpczsKKworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y3JjMzIgPSBjcmMzMihwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMixidWZCZWZvcmUsICh1SW50KSh1T3V0VGhpcykpOworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZCAtPSB1T3V0VGhpczsKKyAgICAgICAgICAgIGlSZWFkICs9ICh1SW50KSh1VG90YWxPdXRBZnRlciAtIHVUb3RhbE91dEJlZm9yZSk7CisKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5uZXh0X2luICAgPSAoQnl0ZWYqKXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJzdHJlYW0ubmV4dF9pbjsKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbiAgPSBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ic3RyZWFtLmF2YWlsX2luOworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnRvdGFsX2luICA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJzdHJlYW0udG90YWxfaW5fbG8zMjsKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5uZXh0X291dCAgPSAoQnl0ZWYqKXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJzdHJlYW0ubmV4dF9vdXQ7CisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfb3V0ID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbS5hdmFpbF9vdXQ7CisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0udG90YWxfb3V0ID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbS50b3RhbF9vdXRfbG8zMjsKKworICAgICAgICAgICAgaWYgKGVycj09QlpfU1RSRUFNX0VORCkKKyAgICAgICAgICAgICAgcmV0dXJuIChpUmVhZD09MCkgPyBVTlpfRU9GIDogaVJlYWQ7CisgICAgICAgICAgICBpZiAoZXJyIT1CWl9PSykKKyAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfSAvLyBlbmQgWl9CWklQMkVECisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgWlBPUzY0X1QgdVRvdGFsT3V0QmVmb3JlLHVUb3RhbE91dEFmdGVyOworICAgICAgICAgICAgY29uc3QgQnl0ZWYgKmJ1ZkJlZm9yZTsKKyAgICAgICAgICAgIFpQT1M2NF9UIHVPdXRUaGlzOworICAgICAgICAgICAgaW50IGZsdXNoPVpfU1lOQ19GTFVTSDsKKworICAgICAgICAgICAgdVRvdGFsT3V0QmVmb3JlID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnRvdGFsX291dDsKKyAgICAgICAgICAgIGJ1ZkJlZm9yZSA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5uZXh0X291dDsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIGlmICgocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZCA9PQorICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dCkgJiYKKyAgICAgICAgICAgICAgICAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX2NvbXByZXNzZWQgPT0gMCkpCisgICAgICAgICAgICAgICAgZmx1c2ggPSBaX0ZJTklTSDsKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBlcnI9aW5mbGF0ZSgmcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLGZsdXNoKTsKKworICAgICAgICAgICAgaWYgKChlcnI+PTApICYmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubXNnIT1OVUxMKSkKKyAgICAgICAgICAgICAgZXJyID0gWl9EQVRBX0VSUk9SOworCisgICAgICAgICAgICB1VG90YWxPdXRBZnRlciA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS50b3RhbF9vdXQ7CisgICAgICAgICAgICB1T3V0VGhpcyA9IHVUb3RhbE91dEFmdGVyLXVUb3RhbE91dEJlZm9yZTsKKworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+dG90YWxfb3V0XzY0ID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+dG90YWxfb3V0XzY0ICsgdU91dFRoaXM7CisKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmNyYzMyID0KKyAgICAgICAgICAgICAgICBjcmMzMihwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMixidWZCZWZvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAodUludCkodU91dFRoaXMpKTsKKworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZCAtPQorICAgICAgICAgICAgICAgIHVPdXRUaGlzOworCisgICAgICAgICAgICBpUmVhZCArPSAodUludCkodVRvdGFsT3V0QWZ0ZXIgLSB1VG90YWxPdXRCZWZvcmUpOworCisgICAgICAgICAgICBpZiAoZXJyPT1aX1NUUkVBTV9FTkQpCisgICAgICAgICAgICAgICAgcmV0dXJuIChpUmVhZD09MCkgPyBVTlpfRU9GIDogaVJlYWQ7CisgICAgICAgICAgICBpZiAoZXJyIT1aX09LKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVycj09Wl9PSykKKyAgICAgICAgcmV0dXJuIGlSZWFkOworICAgIHJldHVybiBlcnI7Cit9CisKKworLyoKKyAgR2l2ZSB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB1bmNvbXByZXNzZWQgZGF0YQorKi8KK2V4dGVybiB6X29mZl90IFpFWFBPUlQgdW56dGVsbCAodW56RmlsZSBmaWxlKQoreworICAgIHVuejY0X3MqIHM7CisgICAgZmlsZV9pbl96aXA2NF9yZWFkX2luZm9fcyogcGZpbGVfaW5femlwX3JlYWRfaW5mbzsKKyAgICBpZiAoZmlsZT09TlVMTCkKKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOworICAgIHM9KHVuejY0X3MqKWZpbGU7CisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mbz1zLT5wZmlsZV9pbl96aXBfcmVhZDsKKworICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisKKyAgICByZXR1cm4gKHpfb2ZmX3QpcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnRvdGFsX291dDsKK30KKworZXh0ZXJuIFpQT1M2NF9UIFpFWFBPUlQgdW56dGVsbDY0ICh1bnpGaWxlIGZpbGUpCit7CisKKyAgICB1bno2NF9zKiBzOworICAgIGZpbGVfaW5femlwNjRfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkX2luZm87CisgICAgaWYgKGZpbGU9PU5VTEwpCisgICAgICAgIHJldHVybiAoWlBPUzY0X1QpLTE7CisgICAgcz0odW56NjRfcyopZmlsZTsKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvPXMtPnBmaWxlX2luX3ppcF9yZWFkOworCisgICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm89PU5VTEwpCisgICAgICAgIHJldHVybiAoWlBPUzY0X1QpLTE7CisKKyAgICByZXR1cm4gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+dG90YWxfb3V0XzY0OworfQorCisKKy8qCisgIHJldHVybiAxIGlmIHRoZSBlbmQgb2YgZmlsZSB3YXMgcmVhY2hlZCwgMCBlbHNld2hlcmUKKyovCitleHRlcm4gaW50IFpFWFBPUlQgdW56ZW9mICh1bnpGaWxlIGZpbGUpCit7CisgICAgdW56NjRfcyogczsKKyAgICBmaWxlX2luX3ppcDY0X3JlYWRfaW5mb19zKiBwZmlsZV9pbl96aXBfcmVhZF9pbmZvOworICAgIGlmIChmaWxlPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisgICAgcz0odW56NjRfcyopZmlsZTsKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvPXMtPnBmaWxlX2luX3ppcF9yZWFkOworCisgICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm89PU5VTEwpCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKKworICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfdW5jb21wcmVzc2VkID09IDApCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKworCisvKgorUmVhZCBleHRyYSBmaWVsZCBmcm9tIHRoZSBjdXJyZW50IGZpbGUgKG9wZW5lZCBieSB1bnpPcGVuQ3VycmVudEZpbGUpCitUaGlzIGlzIHRoZSBsb2NhbC1oZWFkZXIgdmVyc2lvbiBvZiB0aGUgZXh0cmEgZmllbGQgKHNvbWV0aW1lcywgdGhlcmUgaXMKK21vcmUgaW5mbyBpbiB0aGUgbG9jYWwtaGVhZGVyIHZlcnNpb24gdGhhbiBpbiB0aGUgY2VudHJhbC1oZWFkZXIpCisKKyAgaWYgYnVmPT1OVUxMLCBpdCByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxvY2FsIGV4dHJhIGZpZWxkIHRoYXQgY2FuIGJlIHJlYWQKKworICBpZiBidWYhPU5VTEwsIGxlbiBpcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyLCB0aGUgZXh0cmEgaGVhZGVyIGlzIGNvcGllZCBpbgorICAgIGJ1Zi4KKyAgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpbiBidWYsIG9yIChpZiA8MCkKKyAgICB0aGUgZXJyb3IgY29kZQorKi8KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRMb2NhbEV4dHJhZmllbGQgKHVuekZpbGUgZmlsZSwgdm9pZHAgYnVmLCB1bnNpZ25lZCBsZW4pCit7CisgICAgdW56NjRfcyogczsKKyAgICBmaWxlX2luX3ppcDY0X3JlYWRfaW5mb19zKiBwZmlsZV9pbl96aXBfcmVhZF9pbmZvOworICAgIHVJbnQgcmVhZF9ub3c7CisgICAgWlBPUzY0X1Qgc2l6ZV90b19yZWFkOworCisgICAgaWYgKGZpbGU9PU5VTEwpCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKKyAgICBzPSh1bno2NF9zKilmaWxlOworICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm89cy0+cGZpbGVfaW5femlwX3JlYWQ7CisKKyAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mbz09TlVMTCkKKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOworCisgICAgc2l6ZV90b19yZWFkID0gKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnNpemVfbG9jYWxfZXh0cmFmaWVsZCAtCisgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cG9zX2xvY2FsX2V4dHJhZmllbGQpOworCisgICAgaWYgKGJ1Zj09TlVMTCkKKyAgICAgICAgcmV0dXJuIChpbnQpc2l6ZV90b19yZWFkOworCisgICAgaWYgKGxlbj5zaXplX3RvX3JlYWQpCisgICAgICAgIHJlYWRfbm93ID0gKHVJbnQpc2l6ZV90b19yZWFkOworICAgIGVsc2UKKyAgICAgICAgcmVhZF9ub3cgPSAodUludClsZW4gOworCisgICAgaWYgKHJlYWRfbm93PT0wKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChaU0VFSzY0KHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnpfZmlsZWZ1bmMsCisgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmZpbGVzdHJlYW0sCisgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPm9mZnNldF9sb2NhbF9leHRyYWZpZWxkICsKKyAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cG9zX2xvY2FsX2V4dHJhZmllbGQsCisgICAgICAgICAgICAgIFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQorICAgICAgICByZXR1cm4gVU5aX0VSUk5POworCisgICAgaWYgKFpSRUFENjQocGZpbGVfaW5femlwX3JlYWRfaW5mby0+el9maWxlZnVuYywKKyAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+ZmlsZXN0cmVhbSwKKyAgICAgICAgICAgICAgYnVmLHJlYWRfbm93KSE9cmVhZF9ub3cpCisgICAgICAgIHJldHVybiBVTlpfRVJSTk87CisKKyAgICByZXR1cm4gKGludClyZWFkX25vdzsKK30KKworLyoKKyAgQ2xvc2UgdGhlIGZpbGUgaW4gemlwIG9wZW5lZCB3aXRoIHVuek9wZW5DdXJyZW50RmlsZQorICBSZXR1cm4gVU5aX0NSQ0VSUk9SIGlmIGFsbCB0aGUgZmlsZSB3YXMgcmVhZCBidXQgdGhlIENSQyBpcyBub3QgZ29vZAorKi8KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpDbG9zZUN1cnJlbnRGaWxlICh1bnpGaWxlIGZpbGUpCit7CisgICAgaW50IGVycj1VTlpfT0s7CisKKyAgICB1bno2NF9zKiBzOworICAgIGZpbGVfaW5femlwNjRfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkX2luZm87CisgICAgaWYgKGZpbGU9PU5VTEwpCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKKyAgICBzPSh1bno2NF9zKilmaWxlOworICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm89cy0+cGZpbGVfaW5femlwX3JlYWQ7CisKKyAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mbz09TlVMTCkKKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOworCisKKyAgICBpZiAoKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF91bmNvbXByZXNzZWQgPT0gMCkgJiYKKyAgICAgICAgKCFwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yYXcpKQorICAgIHsKKyAgICAgICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmNyYzMyICE9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmNyYzMyX3dhaXQpCisgICAgICAgICAgICBlcnI9VU5aX0NSQ0VSUk9SOworICAgIH0KKworCisgICAgVFJZRlJFRShwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZWFkX2J1ZmZlcik7CisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXIgPSBOVUxMOworICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW1faW5pdGlhbGlzZWQgPT0gWl9ERUZMQVRFRCkKKyAgICAgICAgaW5mbGF0ZUVuZCgmcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtKTsKKyNpZmRlZiBIQVZFX0JaSVAyCisgICAgZWxzZSBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtX2luaXRpYWxpc2VkID09IFpfQlpJUDJFRCkKKyAgICAgICAgQloyX2J6RGVjb21wcmVzc0VuZCgmcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbSk7CisjZW5kaWYKKworCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtX2luaXRpYWxpc2VkID0gMDsKKyAgICBUUllGUkVFKHBmaWxlX2luX3ppcF9yZWFkX2luZm8pOworCisgICAgcy0+cGZpbGVfaW5femlwX3JlYWQ9TlVMTDsKKworICAgIHJldHVybiBlcnI7Cit9CisKKworLyoKKyAgR2V0IHRoZSBnbG9iYWwgY29tbWVudCBzdHJpbmcgb2YgdGhlIFppcEZpbGUsIGluIHRoZSBzekNvbW1lbnQgYnVmZmVyLgorICB1U2l6ZUJ1ZiBpcyB0aGUgc2l6ZSBvZiB0aGUgc3pDb21tZW50IGJ1ZmZlci4KKyAgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZSBjb3BpZWQgb3IgYW4gZXJyb3IgY29kZSA8MAorKi8KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRHbG9iYWxDb21tZW50ICh1bnpGaWxlIGZpbGUsIGNoYXIgKiBzekNvbW1lbnQsIHVMb25nIHVTaXplQnVmKQoreworICAgIHVuejY0X3MqIHM7CisgICAgdUxvbmcgdVJlYWRUaGlzIDsKKyAgICBpZiAoZmlsZT09TlVMTCkKKyAgICAgICAgcmV0dXJuIChpbnQpVU5aX1BBUkFNRVJST1I7CisgICAgcz0odW56NjRfcyopZmlsZTsKKworICAgIHVSZWFkVGhpcyA9IHVTaXplQnVmOworICAgIGlmICh1UmVhZFRoaXM+cy0+Z2kuc2l6ZV9jb21tZW50KQorICAgICAgICB1UmVhZFRoaXMgPSBzLT5naS5zaXplX2NvbW1lbnQ7CisKKyAgICBpZiAoWlNFRUs2NChzLT56X2ZpbGVmdW5jLHMtPmZpbGVzdHJlYW0scy0+Y2VudHJhbF9wb3MrMjIsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCisgICAgICAgIHJldHVybiBVTlpfRVJSTk87CisKKyAgICBpZiAodVJlYWRUaGlzPjApCisgICAgeworICAgICAgKnN6Q29tbWVudD0nXDAnOworICAgICAgaWYgKFpSRUFENjQocy0+el9maWxlZnVuYyxzLT5maWxlc3RyZWFtLHN6Q29tbWVudCx1UmVhZFRoaXMpIT11UmVhZFRoaXMpCisgICAgICAgIHJldHVybiBVTlpfRVJSTk87CisgICAgfQorCisgICAgaWYgKChzekNvbW1lbnQgIT0gTlVMTCkgJiYgKHVTaXplQnVmID4gcy0+Z2kuc2l6ZV9jb21tZW50KSkKKyAgICAgICAgKihzekNvbW1lbnQrcy0+Z2kuc2l6ZV9jb21tZW50KT0nXDAnOworICAgIHJldHVybiAoaW50KXVSZWFkVGhpczsKK30KKworLyogQWRkaXRpb25zIGJ5IFJYICcyMDA0ICovCitleHRlcm4gWlBPUzY0X1QgWkVYUE9SVCB1bnpHZXRPZmZzZXQ2NCh1bnpGaWxlIGZpbGUpCit7CisgICAgdW56NjRfcyogczsKKworICAgIGlmIChmaWxlPT1OVUxMKQorICAgICAgICAgIHJldHVybiAwOyAvL1VOWl9QQVJBTUVSUk9SOworICAgIHM9KHVuejY0X3MqKWZpbGU7CisgICAgaWYgKCFzLT5jdXJyZW50X2ZpbGVfb2spCisgICAgICByZXR1cm4gMDsKKyAgICBpZiAocy0+Z2kubnVtYmVyX2VudHJ5ICE9IDAgJiYgcy0+Z2kubnVtYmVyX2VudHJ5ICE9IDB4ZmZmZikKKyAgICAgIGlmIChzLT5udW1fZmlsZT09cy0+Z2kubnVtYmVyX2VudHJ5KQorICAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHMtPnBvc19pbl9jZW50cmFsX2RpcjsKK30KKworZXh0ZXJuIHVMb25nIFpFWFBPUlQgdW56R2V0T2Zmc2V0ICh1bnpGaWxlIGZpbGUpCit7CisgICAgWlBPUzY0X1Qgb2Zmc2V0NjQ7CisKKyAgICBpZiAoZmlsZT09TlVMTCkKKyAgICAgICAgICByZXR1cm4gMDsgLy9VTlpfUEFSQU1FUlJPUjsKKyAgICBvZmZzZXQ2NCA9IHVuekdldE9mZnNldDY0KGZpbGUpOworICAgIHJldHVybiAodUxvbmcpb2Zmc2V0NjQ7Cit9CisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpTZXRPZmZzZXQ2NCh1bnpGaWxlIGZpbGUsIFpQT1M2NF9UIHBvcykKK3sKKyAgICB1bno2NF9zKiBzOworICAgIGludCBlcnI7CisKKyAgICBpZiAoZmlsZT09TlVMTCkKKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOworICAgIHM9KHVuejY0X3MqKWZpbGU7CisKKyAgICBzLT5wb3NfaW5fY2VudHJhbF9kaXIgPSBwb3M7CisgICAgcy0+bnVtX2ZpbGUgPSBzLT5naS5udW1iZXJfZW50cnk7ICAgICAgLyogaGFjayAqLworICAgIGVyciA9IHVuejY0bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwoZmlsZSwmcy0+Y3VyX2ZpbGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+Y3VyX2ZpbGVfaW5mb19pbnRlcm5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLDAsTlVMTCwwLE5VTEwsMCk7CisgICAgcy0+Y3VycmVudF9maWxlX29rID0gKGVyciA9PSBVTlpfT0spOworICAgIHJldHVybiBlcnI7Cit9CisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpTZXRPZmZzZXQgKHVuekZpbGUgZmlsZSwgdUxvbmcgcG9zKQoreworICAgIHJldHVybiB1bnpTZXRPZmZzZXQ2NChmaWxlLHBvcyk7Cit9CmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL21pbml6aXAvdW56aXAuaCBiL3psaWIvc3JjL2NvbnRyaWIvbWluaXppcC91bnppcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMDRlMzkKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL21pbml6aXAvdW56aXAuaApAQCAtMCwwICsxLDQzNyBAQAorLyogdW56aXAuaCAtLSBJTyBmb3IgdW5jb21wcmVzcyAuemlwIGZpbGVzIHVzaW5nIHpsaWIKKyAgIFZlcnNpb24gMS4xLCBGZWJydWFyeSAxNGgsIDIwMTAKKyAgIHBhcnQgb2YgdGhlIE1pbmlaaXAgcHJvamVjdCAtICggaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC9taW5pemlwLmh0bWwgKQorCisgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAxMCBHaWxsZXMgVm9sbGFudCAobWluaXppcCkgKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCisKKyAgICAgICAgIE1vZGlmaWNhdGlvbnMgb2YgVW56aXAgZm9yIFppcDY0CisgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBFdmVuIFJvdWF1bHQKKworICAgICAgICAgTW9kaWZpY2F0aW9ucyBmb3IgWmlwNjQgc3VwcG9ydCBvbiBib3RoIHppcCBhbmQgdW56aXAKKyAgICAgICAgIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1hdGhpYXMgU3ZlbnNzb24gKCBodHRwOi8vcmVzdWx0NDIuY29tICkKKworICAgICAgICAgRm9yIG1vcmUgaW5mbyByZWFkIE1pbmlaaXBfaW5mby50eHQKKworICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgQ29uZGl0aW9uIG9mIHVzZSBhbmQgZGlzdHJpYnV0aW9uIGFyZSB0aGUgc2FtZSB0aGFuIHpsaWIgOgorCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKworICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICBDaGFuZ2VzCisKKyAgICAgICAgU2VlIGhlYWRlciBvZiB1bnppcDY0LmMKKworKi8KKworI2lmbmRlZiBfdW56NjRfSAorI2RlZmluZSBfdW56NjRfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZm5kZWYgX1pMSUJfSAorI2luY2x1ZGUgInpsaWIuaCIKKyNlbmRpZgorCisjaWZuZGVmICBfWkxJQklPQVBJX0gKKyNpbmNsdWRlICJpb2FwaS5oIgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0JaSVAyCisjaW5jbHVkZSAiYnpsaWIuaCIKKyNlbmRpZgorCisjZGVmaW5lIFpfQlpJUDJFRCAxMgorCisjaWYgZGVmaW5lZChTVFJJQ1RVTlpJUCkgfHwgZGVmaW5lZChTVFJJQ1RaSVBVTlpJUCkKKy8qIGxpa2UgdGhlIFNUUklDVCBvZiBXSU4zMiwgd2UgZGVmaW5lIGEgcG9pbnRlciB0aGF0IGNhbm5vdCBiZSBjb252ZXJ0ZWQKKyAgICBmcm9tICh2b2lkKikgd2l0aG91dCBjYXN0ICovCit0eXBlZGVmIHN0cnVjdCBUYWd1bnpGaWxlX18geyBpbnQgdW51c2VkOyB9IHVuekZpbGVfXzsKK3R5cGVkZWYgdW56RmlsZV9fICp1bnpGaWxlOworI2Vsc2UKK3R5cGVkZWYgdm9pZHAgdW56RmlsZTsKKyNlbmRpZgorCisKKyNkZWZpbmUgVU5aX09LICAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgVU5aX0VORF9PRl9MSVNUX09GX0ZJTEUgICAgICAgICAoLTEwMCkKKyNkZWZpbmUgVU5aX0VSUk5PICAgICAgICAgICAgICAgICAgICAgICAoWl9FUlJOTykKKyNkZWZpbmUgVU5aX0VPRiAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgVU5aX1BBUkFNRVJST1IgICAgICAgICAgICAgICAgICAoLTEwMikKKyNkZWZpbmUgVU5aX0JBRFpJUEZJTEUgICAgICAgICAgICAgICAgICAoLTEwMykKKyNkZWZpbmUgVU5aX0lOVEVSTkFMRVJST1IgICAgICAgICAgICAgICAoLTEwNCkKKyNkZWZpbmUgVU5aX0NSQ0VSUk9SICAgICAgICAgICAgICAgICAgICAoLTEwNSkKKworLyogdG1fdW56IGNvbnRhaW4gZGF0ZS90aW1lIGluZm8gKi8KK3R5cGVkZWYgc3RydWN0IHRtX3Vuel9zCit7CisgICAgdUludCB0bV9zZWM7ICAgICAgICAgICAgLyogc2Vjb25kcyBhZnRlciB0aGUgbWludXRlIC0gWzAsNTldICovCisgICAgdUludCB0bV9taW47ICAgICAgICAgICAgLyogbWludXRlcyBhZnRlciB0aGUgaG91ciAtIFswLDU5XSAqLworICAgIHVJbnQgdG1faG91cjsgICAgICAgICAgIC8qIGhvdXJzIHNpbmNlIG1pZG5pZ2h0IC0gWzAsMjNdICovCisgICAgdUludCB0bV9tZGF5OyAgICAgICAgICAgLyogZGF5IG9mIHRoZSBtb250aCAtIFsxLDMxXSAqLworICAgIHVJbnQgdG1fbW9uOyAgICAgICAgICAgIC8qIG1vbnRocyBzaW5jZSBKYW51YXJ5IC0gWzAsMTFdICovCisgICAgdUludCB0bV95ZWFyOyAgICAgICAgICAgLyogeWVhcnMgLSBbMTk4MC4uMjA0NF0gKi8KK30gdG1fdW56OworCisvKiB1bnpfZ2xvYmFsX2luZm8gc3RydWN0dXJlIGNvbnRhaW4gZ2xvYmFsIGRhdGEgYWJvdXQgdGhlIFpJUGZpbGUKKyAgIFRoZXNlIGRhdGEgY29tZXMgZnJvbSB0aGUgZW5kIG9mIGNlbnRyYWwgZGlyICovCit0eXBlZGVmIHN0cnVjdCB1bnpfZ2xvYmFsX2luZm82NF9zCit7CisgICAgWlBPUzY0X1QgbnVtYmVyX2VudHJ5OyAgICAgICAgIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNlbnRyYWwgZGlyIG9uIHRoaXMgZGlzayAqLworICAgIHVMb25nIHNpemVfY29tbWVudDsgICAgICAgICAvKiBzaXplIG9mIHRoZSBnbG9iYWwgY29tbWVudCBvZiB0aGUgemlwZmlsZSAqLworfSB1bnpfZ2xvYmFsX2luZm82NDsKKwordHlwZWRlZiBzdHJ1Y3QgdW56X2dsb2JhbF9pbmZvX3MKK3sKKyAgICB1TG9uZyBudW1iZXJfZW50cnk7ICAgICAgICAgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2VudHJhbCBkaXIgb24gdGhpcyBkaXNrICovCisgICAgdUxvbmcgc2l6ZV9jb21tZW50OyAgICAgICAgIC8qIHNpemUgb2YgdGhlIGdsb2JhbCBjb21tZW50IG9mIHRoZSB6aXBmaWxlICovCit9IHVuel9nbG9iYWxfaW5mbzsKKworLyogdW56X2ZpbGVfaW5mbyBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGEgZmlsZSBpbiB0aGUgemlwZmlsZSAqLwordHlwZWRlZiBzdHJ1Y3QgdW56X2ZpbGVfaW5mbzY0X3MKK3sKKyAgICB1TG9uZyB2ZXJzaW9uOyAgICAgICAgICAgICAgLyogdmVyc2lvbiBtYWRlIGJ5ICAgICAgICAgICAgICAgICAyIGJ5dGVzICovCisgICAgdUxvbmcgdmVyc2lvbl9uZWVkZWQ7ICAgICAgIC8qIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgICAgICAgMiBieXRlcyAqLworICAgIHVMb25nIGZsYWc7ICAgICAgICAgICAgICAgICAvKiBnZW5lcmFsIHB1cnBvc2UgYml0IGZsYWcgICAgICAgIDIgYnl0ZXMgKi8KKyAgICB1TG9uZyBjb21wcmVzc2lvbl9tZXRob2Q7ICAgLyogY29tcHJlc3Npb24gbWV0aG9kICAgICAgICAgICAgICAyIGJ5dGVzICovCisgICAgdUxvbmcgZG9zRGF0ZTsgICAgICAgICAgICAgIC8qIGxhc3QgbW9kIGZpbGUgZGF0ZSBpbiBEb3MgZm10ICAgNCBieXRlcyAqLworICAgIHVMb25nIGNyYzsgICAgICAgICAgICAgICAgICAvKiBjcmMtMzIgICAgICAgICAgICAgICAgICAgICAgICAgIDQgYnl0ZXMgKi8KKyAgICBaUE9TNjRfVCBjb21wcmVzc2VkX3NpemU7ICAgLyogY29tcHJlc3NlZCBzaXplICAgICAgICAgICAgICAgICA4IGJ5dGVzICovCisgICAgWlBPUzY0X1QgdW5jb21wcmVzc2VkX3NpemU7IC8qIHVuY29tcHJlc3NlZCBzaXplICAgICAgICAgICAgICAgOCBieXRlcyAqLworICAgIHVMb25nIHNpemVfZmlsZW5hbWU7ICAgICAgICAvKiBmaWxlbmFtZSBsZW5ndGggICAgICAgICAgICAgICAgIDIgYnl0ZXMgKi8KKyAgICB1TG9uZyBzaXplX2ZpbGVfZXh0cmE7ICAgICAgLyogZXh0cmEgZmllbGQgbGVuZ3RoICAgICAgICAgICAgICAyIGJ5dGVzICovCisgICAgdUxvbmcgc2l6ZV9maWxlX2NvbW1lbnQ7ICAgIC8qIGZpbGUgY29tbWVudCBsZW5ndGggICAgICAgICAgICAgMiBieXRlcyAqLworCisgICAgdUxvbmcgZGlza19udW1fc3RhcnQ7ICAgICAgIC8qIGRpc2sgbnVtYmVyIHN0YXJ0ICAgICAgICAgICAgICAgMiBieXRlcyAqLworICAgIHVMb25nIGludGVybmFsX2ZhOyAgICAgICAgICAvKiBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgICAgICAgIDIgYnl0ZXMgKi8KKyAgICB1TG9uZyBleHRlcm5hbF9mYTsgICAgICAgICAgLyogZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzICAgICAgICA0IGJ5dGVzICovCisKKyAgICB0bV91bnogdG11X2RhdGU7Cit9IHVuel9maWxlX2luZm82NDsKKwordHlwZWRlZiBzdHJ1Y3QgdW56X2ZpbGVfaW5mb19zCit7CisgICAgdUxvbmcgdmVyc2lvbjsgICAgICAgICAgICAgIC8qIHZlcnNpb24gbWFkZSBieSAgICAgICAgICAgICAgICAgMiBieXRlcyAqLworICAgIHVMb25nIHZlcnNpb25fbmVlZGVkOyAgICAgICAvKiB2ZXJzaW9uIG5lZWRlZCB0byBleHRyYWN0ICAgICAgIDIgYnl0ZXMgKi8KKyAgICB1TG9uZyBmbGFnOyAgICAgICAgICAgICAgICAgLyogZ2VuZXJhbCBwdXJwb3NlIGJpdCBmbGFnICAgICAgICAyIGJ5dGVzICovCisgICAgdUxvbmcgY29tcHJlc3Npb25fbWV0aG9kOyAgIC8qIGNvbXByZXNzaW9uIG1ldGhvZCAgICAgICAgICAgICAgMiBieXRlcyAqLworICAgIHVMb25nIGRvc0RhdGU7ICAgICAgICAgICAgICAvKiBsYXN0IG1vZCBmaWxlIGRhdGUgaW4gRG9zIGZtdCAgIDQgYnl0ZXMgKi8KKyAgICB1TG9uZyBjcmM7ICAgICAgICAgICAgICAgICAgLyogY3JjLTMyICAgICAgICAgICAgICAgICAgICAgICAgICA0IGJ5dGVzICovCisgICAgdUxvbmcgY29tcHJlc3NlZF9zaXplOyAgICAgIC8qIGNvbXByZXNzZWQgc2l6ZSAgICAgICAgICAgICAgICAgNCBieXRlcyAqLworICAgIHVMb25nIHVuY29tcHJlc3NlZF9zaXplOyAgICAvKiB1bmNvbXByZXNzZWQgc2l6ZSAgICAgICAgICAgICAgIDQgYnl0ZXMgKi8KKyAgICB1TG9uZyBzaXplX2ZpbGVuYW1lOyAgICAgICAgLyogZmlsZW5hbWUgbGVuZ3RoICAgICAgICAgICAgICAgICAyIGJ5dGVzICovCisgICAgdUxvbmcgc2l6ZV9maWxlX2V4dHJhOyAgICAgIC8qIGV4dHJhIGZpZWxkIGxlbmd0aCAgICAgICAgICAgICAgMiBieXRlcyAqLworICAgIHVMb25nIHNpemVfZmlsZV9jb21tZW50OyAgICAvKiBmaWxlIGNvbW1lbnQgbGVuZ3RoICAgICAgICAgICAgIDIgYnl0ZXMgKi8KKworICAgIHVMb25nIGRpc2tfbnVtX3N0YXJ0OyAgICAgICAvKiBkaXNrIG51bWJlciBzdGFydCAgICAgICAgICAgICAgIDIgYnl0ZXMgKi8KKyAgICB1TG9uZyBpbnRlcm5hbF9mYTsgICAgICAgICAgLyogaW50ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzICAgICAgICAyIGJ5dGVzICovCisgICAgdUxvbmcgZXh0ZXJuYWxfZmE7ICAgICAgICAgIC8qIGV4dGVybmFsIGZpbGUgYXR0cmlidXRlcyAgICAgICAgNCBieXRlcyAqLworCisgICAgdG1fdW56IHRtdV9kYXRlOworfSB1bnpfZmlsZV9pbmZvOworCitleHRlcm4gaW50IFpFWFBPUlQgdW56U3RyaW5nRmlsZU5hbWVDb21wYXJlIE9GICgoY29uc3QgY2hhciogZmlsZU5hbWUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVOYW1lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaUNhc2VTZW5zaXRpdml0eSkpOworLyoKKyAgIENvbXBhcmUgdHdvIGZpbGVuYW1lIChmaWxlTmFtZTEsZmlsZU5hbWUyKS4KKyAgIElmIGlDYXNlU2VuaXNpdml0eSA9IDEsIGNvbXBhcmlzaW9uIGlzIGNhc2Ugc2Vuc2l0aXZpdHkgKGxpa2Ugc3RyY21wKQorICAgSWYgaUNhc2VTZW5pc2l2aXR5ID0gMiwgY29tcGFyaXNpb24gaXMgbm90IGNhc2Ugc2Vuc2l0aXZpdHkgKGxpa2Ugc3RyY21waQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBzdHJjYXNlY21wKQorICAgSWYgaUNhc2VTZW5pc2l2aXR5ID0gMCwgY2FzZSBzZW5zaXRpdml0eSBpcyBkZWZhdXQgb2YgeW91ciBvcGVyYXRpbmcgc3lzdGVtCisgICAgKGxpa2UgMSBvbiBVbml4LCAyIG9uIFdpbmRvd3MpCisqLworCisKK2V4dGVybiB1bnpGaWxlIFpFWFBPUlQgdW56T3BlbiBPRigoY29uc3QgY2hhciAqcGF0aCkpOworZXh0ZXJuIHVuekZpbGUgWkVYUE9SVCB1bnpPcGVuNjQgT0YoKGNvbnN0IHZvaWQgKnBhdGgpKTsKKy8qCisgIE9wZW4gYSBaaXAgZmlsZS4gcGF0aCBjb250YWluIHRoZSBmdWxsIHBhdGhuYW1lIChieSBleGFtcGxlLAorICAgICBvbiBhIFdpbmRvd3MgWFAgY29tcHV0ZXIgImM6XFx6bGliXFx6bGliMTEzLnppcCIgb3Igb24gYW4gVW5peCBjb21wdXRlcgorICAgICAiemxpYi96bGliMTEzLnppcCIuCisgICAgIElmIHRoZSB6aXBmaWxlIGNhbm5vdCBiZSBvcGVuZWQgKGZpbGUgZG9uJ3QgZXhpc3Qgb3IgaW4gbm90IHZhbGlkKSwgdGhlCisgICAgICAgcmV0dXJuIHZhbHVlIGlzIE5VTEwuCisgICAgIEVsc2UsIHRoZSByZXR1cm4gdmFsdWUgaXMgYSB1bnpGaWxlIEhhbmRsZSwgdXNhYmxlIHdpdGggb3RoZXIgZnVuY3Rpb24KKyAgICAgICBvZiB0aGlzIHVuemlwIHBhY2thZ2UuCisgICAgIHRoZSAiNjQiIGZ1bmN0aW9uIHRha2UgYSBjb25zdCB2b2lkKiBwb2ludGVyLCBiZWNhdXNlIHRoZSBwYXRoIGlzIGp1c3QgdGhlCisgICAgICAgdmFsdWUgcGFzc2VkIHRvIHRoZSBvcGVuNjRfZmlsZV9mdW5jIGNhbGxiYWNrLgorICAgICBVbmRlciBXaW5kb3dzLCBpZiBVTklDT0RFIGlzIGRlZmluZWQsIHVzaW5nIGZpbGxfZm9wZW42NF9maWxlZnVuYywgdGhlIHBhdGgKKyAgICAgICBpcyBhIHBvaW50ZXIgdG8gYSB3aWRlIHVuaWNvZGUgc3RyaW5nIChMUENUU1RSIGlzIExQQ1dTVFIpLCBzbyBjb25zdCBjaGFyKgorICAgICAgIGRvZXMgbm90IGRlc2NyaWJlIHRoZSByZWFsaXR5CisqLworCisKK2V4dGVybiB1bnpGaWxlIFpFWFBPUlQgdW56T3BlbjIgT0YoKGNvbnN0IGNoYXIgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmKSk7CisvKgorICAgT3BlbiBhIFppcCBmaWxlLCBsaWtlIHVuek9wZW4sIGJ1dCBwcm92aWRlIGEgc2V0IG9mIGZpbGUgbG93IGxldmVsIEFQSQorICAgICAgZm9yIHJlYWQvd3JpdGUgdGhlIHppcCBmaWxlIChzZWUgaW9hcGkuaCkKKyovCisKK2V4dGVybiB1bnpGaWxlIFpFWFBPUlQgdW56T3BlbjJfNjQgT0YoKGNvbnN0IHZvaWQgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bGliX2ZpbGVmdW5jNjRfZGVmKiBwemxpYl9maWxlZnVuY19kZWYpKTsKKy8qCisgICBPcGVuIGEgWmlwIGZpbGUsIGxpa2UgdW56NjRPcGVuLCBidXQgcHJvdmlkZSBhIHNldCBvZiBmaWxlIGxvdyBsZXZlbCBBUEkKKyAgICAgIGZvciByZWFkL3dyaXRlIHRoZSB6aXAgZmlsZSAoc2VlIGlvYXBpLmgpCisqLworCitleHRlcm4gaW50IFpFWFBPUlQgdW56Q2xvc2UgT0YoKHVuekZpbGUgZmlsZSkpOworLyoKKyAgQ2xvc2UgYSBaaXBGaWxlIG9wZW5lZCB3aXRoIHVuek9wZW4uCisgIElmIHRoZXJlIGlzIGZpbGVzIGluc2lkZSB0aGUgLlppcCBvcGVuZWQgd2l0aCB1bnpPcGVuQ3VycmVudEZpbGUgKHNlZSBsYXRlciksCisgICAgdGhlc2UgZmlsZXMgTVVTVCBiZSBjbG9zZWQgd2l0aCB1bnpDbG9zZUN1cnJlbnRGaWxlIGJlZm9yZSBjYWxsIHVuekNsb3NlLgorICByZXR1cm4gVU5aX09LIGlmIHRoZXJlIGlzIG5vIHByb2JsZW0uICovCisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRHbG9iYWxJbmZvIE9GKCh1bnpGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW56X2dsb2JhbF9pbmZvICpwZ2xvYmFsX2luZm8pKTsKKworZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEdsb2JhbEluZm82NCBPRigodW56RmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuel9nbG9iYWxfaW5mbzY0ICpwZ2xvYmFsX2luZm8pKTsKKy8qCisgIFdyaXRlIGluZm8gYWJvdXQgdGhlIFppcEZpbGUgaW4gdGhlICpwZ2xvYmFsX2luZm8gc3RydWN0dXJlLgorICBObyBwcmVwYXJhdGlvbiBvZiB0aGUgc3RydWN0dXJlIGlzIG5lZWRlZAorICByZXR1cm4gVU5aX09LIGlmIHRoZXJlIGlzIG5vIHByb2JsZW0uICovCisKKworZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEdsb2JhbENvbW1lbnQgT0YoKHVuekZpbGUgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzekNvbW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgdVNpemVCdWYpKTsKKy8qCisgIEdldCB0aGUgZ2xvYmFsIGNvbW1lbnQgc3RyaW5nIG9mIHRoZSBaaXBGaWxlLCBpbiB0aGUgc3pDb21tZW50IGJ1ZmZlci4KKyAgdVNpemVCdWYgaXMgdGhlIHNpemUgb2YgdGhlIHN6Q29tbWVudCBidWZmZXIuCisgIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGUgY29waWVkIG9yIGFuIGVycm9yIGNvZGUgPDAKKyovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFVuemlwIHBhY2thZ2UgYWxsb3cgeW91IGJyb3dzZSB0aGUgZGlyZWN0b3J5IG9mIHRoZSB6aXBmaWxlICovCisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHb1RvRmlyc3RGaWxlIE9GKCh1bnpGaWxlIGZpbGUpKTsKKy8qCisgIFNldCB0aGUgY3VycmVudCBmaWxlIG9mIHRoZSB6aXBmaWxlIHRvIHRoZSBmaXJzdCBmaWxlLgorICByZXR1cm4gVU5aX09LIGlmIHRoZXJlIGlzIG5vIHByb2JsZW0KKyovCisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHb1RvTmV4dEZpbGUgT0YoKHVuekZpbGUgZmlsZSkpOworLyoKKyAgU2V0IHRoZSBjdXJyZW50IGZpbGUgb2YgdGhlIHppcGZpbGUgdG8gdGhlIG5leHQgZmlsZS4KKyAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtCisgIHJldHVybiBVTlpfRU5EX09GX0xJU1RfT0ZfRklMRSBpZiB0aGUgYWN0dWFsIGZpbGUgd2FzIHRoZSBsYXRlc3QuCisqLworCitleHRlcm4gaW50IFpFWFBPUlQgdW56TG9jYXRlRmlsZSBPRigodW56RmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3pGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBpQ2FzZVNlbnNpdGl2aXR5KSk7CisvKgorICBUcnkgbG9jYXRlIHRoZSBmaWxlIHN6RmlsZU5hbWUgaW4gdGhlIHppcGZpbGUuCisgIEZvciB0aGUgaUNhc2VTZW5zaXRpdml0eSBzaWduaWZpY2F0aW9uLCBzZWUgdW56U3RyaW5nRmlsZU5hbWVDb21wYXJlCisKKyAgcmV0dXJuIHZhbHVlIDoKKyAgVU5aX09LIGlmIHRoZSBmaWxlIGlzIGZvdW5kLiBJdCBiZWNvbWVzIHRoZSBjdXJyZW50IGZpbGUuCisgIFVOWl9FTkRfT0ZfTElTVF9PRl9GSUxFIGlmIHRoZSBmaWxlIGlzIG5vdCBmb3VuZAorKi8KKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qIFJ5YW4gc3VwcGxpZWQgZnVuY3Rpb25zICovCisvKiB1bnpfZmlsZV9pbmZvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgYSBmaWxlIGluIHRoZSB6aXBmaWxlICovCit0eXBlZGVmIHN0cnVjdCB1bnpfZmlsZV9wb3NfcworeworICAgIHVMb25nIHBvc19pbl96aXBfZGlyZWN0b3J5OyAgIC8qIG9mZnNldCBpbiB6aXAgZmlsZSBkaXJlY3RvcnkgKi8KKyAgICB1TG9uZyBudW1fb2ZfZmlsZTsgICAgICAgICAgICAvKiAjIG9mIGZpbGUgKi8KK30gdW56X2ZpbGVfcG9zOworCitleHRlcm4gaW50IFpFWFBPUlQgdW56R2V0RmlsZVBvcygKKyAgICB1bnpGaWxlIGZpbGUsCisgICAgdW56X2ZpbGVfcG9zKiBmaWxlX3Bvcyk7CisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHb1RvRmlsZVBvcygKKyAgICB1bnpGaWxlIGZpbGUsCisgICAgdW56X2ZpbGVfcG9zKiBmaWxlX3Bvcyk7CisKK3R5cGVkZWYgc3RydWN0IHVuejY0X2ZpbGVfcG9zX3MKK3sKKyAgICBaUE9TNjRfVCBwb3NfaW5femlwX2RpcmVjdG9yeTsgICAvKiBvZmZzZXQgaW4gemlwIGZpbGUgZGlyZWN0b3J5ICovCisgICAgWlBPUzY0X1QgbnVtX29mX2ZpbGU7ICAgICAgICAgICAgLyogIyBvZiBmaWxlICovCit9IHVuejY0X2ZpbGVfcG9zOworCitleHRlcm4gaW50IFpFWFBPUlQgdW56R2V0RmlsZVBvczY0KAorICAgIHVuekZpbGUgZmlsZSwKKyAgICB1bno2NF9maWxlX3BvcyogZmlsZV9wb3MpOworCitleHRlcm4gaW50IFpFWFBPUlQgdW56R29Ub0ZpbGVQb3M2NCgKKyAgICB1bnpGaWxlIGZpbGUsCisgICAgY29uc3QgdW56NjRfZmlsZV9wb3MqIGZpbGVfcG9zKTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRDdXJyZW50RmlsZUluZm82NCBPRigodW56RmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuel9maWxlX2luZm82NCAqcGZpbGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzekZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIGZpbGVOYW1lQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpleHRyYUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIGV4dHJhRmllbGRCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN6Q29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBjb21tZW50QnVmZmVyU2l6ZSkpOworCitleHRlcm4gaW50IFpFWFBPUlQgdW56R2V0Q3VycmVudEZpbGVJbmZvIE9GKCh1bnpGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW56X2ZpbGVfaW5mbyAqcGZpbGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzekZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIGZpbGVOYW1lQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpleHRyYUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIGV4dHJhRmllbGRCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN6Q29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBjb21tZW50QnVmZmVyU2l6ZSkpOworLyoKKyAgR2V0IEluZm8gYWJvdXQgdGhlIGN1cnJlbnQgZmlsZQorICBpZiBwZmlsZV9pbmZvIT1OVUxMLCB0aGUgKnBmaWxlX2luZm8gc3RydWN0dXJlIHdpbGwgY29udGFpbiBzb21lcyBpbmZvIGFib3V0CisgICAgICAgIHRoZSBjdXJyZW50IGZpbGUKKyAgaWYgc3pGaWxlTmFtZSE9TlVMTCwgdGhlIGZpbGVtYW5lIHN0cmluZyB3aWxsIGJlIGNvcGllZCBpbiBzekZpbGVOYW1lCisgICAgICAgICAgICAoZmlsZU5hbWVCdWZmZXJTaXplIGlzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIpCisgIGlmIGV4dHJhRmllbGQhPU5VTEwsIHRoZSBleHRyYSBmaWVsZCBpbmZvcm1hdGlvbiB3aWxsIGJlIGNvcGllZCBpbiBleHRyYUZpZWxkCisgICAgICAgICAgICAoZXh0cmFGaWVsZEJ1ZmZlclNpemUgaXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcikuCisgICAgICAgICAgICBUaGlzIGlzIHRoZSBDZW50cmFsLWhlYWRlciB2ZXJzaW9uIG9mIHRoZSBleHRyYSBmaWVsZAorICBpZiBzekNvbW1lbnQhPU5VTEwsIHRoZSBjb21tZW50IHN0cmluZyBvZiB0aGUgZmlsZSB3aWxsIGJlIGNvcGllZCBpbiBzekNvbW1lbnQKKyAgICAgICAgICAgIChjb21tZW50QnVmZmVyU2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyKQorKi8KKworCisvKiogQWRkaXRpb24gZm9yIEdEQUwgOiBTVEFSVCAqLworCitleHRlcm4gWlBPUzY0X1QgWkVYUE9SVCB1bnpHZXRDdXJyZW50RmlsZVpTdHJlYW1Qb3M2NCBPRigodW56RmlsZSBmaWxlKSk7CisKKy8qKiBBZGRpdGlvbiBmb3IgR0RBTCA6IEVORCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBmb3IgcmVhZGluZyB0aGUgY29udGVudCBvZiB0aGUgY3VycmVudCB6aXBmaWxlLCB5b3UgY2FuIG9wZW4gaXQsIHJlYWQgZGF0YQorICAgZnJvbSBpdCwgYW5kIGNsb3NlIGl0ICh5b3UgY2FuIGNsb3NlIGl0IGJlZm9yZSByZWFkaW5nIGFsbCB0aGUgZmlsZSkKKyAgICovCisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpPcGVuQ3VycmVudEZpbGUgT0YoKHVuekZpbGUgZmlsZSkpOworLyoKKyAgT3BlbiBmb3IgcmVhZGluZyBkYXRhIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIHppcGZpbGUuCisgIElmIHRoZXJlIGlzIG5vIGVycm9yLCB0aGUgcmV0dXJuIHZhbHVlIGlzIFVOWl9PSy4KKyovCisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpPcGVuQ3VycmVudEZpbGVQYXNzd29yZCBPRigodW56RmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXNzd29yZCkpOworLyoKKyAgT3BlbiBmb3IgcmVhZGluZyBkYXRhIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIHppcGZpbGUuCisgIHBhc3N3b3JkIGlzIGEgY3J5cHRpbmcgcGFzc3dvcmQKKyAgSWYgdGhlcmUgaXMgbm8gZXJyb3IsIHRoZSByZXR1cm4gdmFsdWUgaXMgVU5aX09LLgorKi8KKworZXh0ZXJuIGludCBaRVhQT1JUIHVuek9wZW5DdXJyZW50RmlsZTIgT0YoKHVuekZpbGUgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByYXcpKTsKKy8qCisgIFNhbWUgdGhhbiB1bnpPcGVuQ3VycmVudEZpbGUsIGJ1dCBvcGVuIGZvciByZWFkIHJhdyB0aGUgZmlsZSAobm90IHVuY29tcHJlc3MpCisgICAgaWYgcmF3PT0xCisgICptZXRob2Qgd2lsbCByZWNlaXZlIG1ldGhvZCBvZiBjb21wcmVzc2lvbiwgKmxldmVsIHdpbGwgcmVjZWl2ZSBsZXZlbCBvZgorICAgICBjb21wcmVzc2lvbgorICBub3RlIDogeW91IGNhbiBzZXQgbGV2ZWwgcGFyYW1ldGVyIGFzIE5VTEwgKGlmIHlvdSBkaWQgbm90IHdhbnQga25vd24gbGV2ZWwsCisgICAgICAgICBidXQgeW91IENBTk5PVCBzZXQgbWV0aG9kIHBhcmFtZXRlciBhcyBOVUxMCisqLworCitleHRlcm4gaW50IFpFWFBPUlQgdW56T3BlbkN1cnJlbnRGaWxlMyBPRigodW56RmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXNzd29yZCkpOworLyoKKyAgU2FtZSB0aGFuIHVuek9wZW5DdXJyZW50RmlsZSwgYnV0IG9wZW4gZm9yIHJlYWQgcmF3IHRoZSBmaWxlIChub3QgdW5jb21wcmVzcykKKyAgICBpZiByYXc9PTEKKyAgKm1ldGhvZCB3aWxsIHJlY2VpdmUgbWV0aG9kIG9mIGNvbXByZXNzaW9uLCAqbGV2ZWwgd2lsbCByZWNlaXZlIGxldmVsIG9mCisgICAgIGNvbXByZXNzaW9uCisgIG5vdGUgOiB5b3UgY2FuIHNldCBsZXZlbCBwYXJhbWV0ZXIgYXMgTlVMTCAoaWYgeW91IGRpZCBub3Qgd2FudCBrbm93biBsZXZlbCwKKyAgICAgICAgIGJ1dCB5b3UgQ0FOTk9UIHNldCBtZXRob2QgcGFyYW1ldGVyIGFzIE5VTEwKKyovCisKKworZXh0ZXJuIGludCBaRVhQT1JUIHVuekNsb3NlQ3VycmVudEZpbGUgT0YoKHVuekZpbGUgZmlsZSkpOworLyoKKyAgQ2xvc2UgdGhlIGZpbGUgaW4gemlwIG9wZW5lZCB3aXRoIHVuek9wZW5DdXJyZW50RmlsZQorICBSZXR1cm4gVU5aX0NSQ0VSUk9SIGlmIGFsbCB0aGUgZmlsZSB3YXMgcmVhZCBidXQgdGhlIENSQyBpcyBub3QgZ29vZAorKi8KKworZXh0ZXJuIGludCBaRVhQT1JUIHVuelJlYWRDdXJyZW50RmlsZSBPRigodW56RmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWRwIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsZW4pKTsKKy8qCisgIFJlYWQgYnl0ZXMgZnJvbSB0aGUgY3VycmVudCBmaWxlIChvcGVuZWQgYnkgdW56T3BlbkN1cnJlbnRGaWxlKQorICBidWYgY29udGFpbiBidWZmZXIgd2hlcmUgZGF0YSBtdXN0IGJlIGNvcGllZAorICBsZW4gdGhlIHNpemUgb2YgYnVmLgorCisgIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGUgY29waWVkIGlmIHNvbWVzIGJ5dGVzIGFyZSBjb3BpZWQKKyAgcmV0dXJuIDAgaWYgdGhlIGVuZCBvZiBmaWxlIHdhcyByZWFjaGVkCisgIHJldHVybiA8MCB3aXRoIGVycm9yIGNvZGUgaWYgdGhlcmUgaXMgYW4gZXJyb3IKKyAgICAoVU5aX0VSUk5PIGZvciBJTyBlcnJvciwgb3IgekxpYiBlcnJvciBmb3IgdW5jb21wcmVzcyBlcnJvcikKKyovCisKK2V4dGVybiB6X29mZl90IFpFWFBPUlQgdW56dGVsbCBPRigodW56RmlsZSBmaWxlKSk7CisKK2V4dGVybiBaUE9TNjRfVCBaRVhQT1JUIHVuenRlbGw2NCBPRigodW56RmlsZSBmaWxlKSk7CisvKgorICBHaXZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHVuY29tcHJlc3NlZCBkYXRhCisqLworCitleHRlcm4gaW50IFpFWFBPUlQgdW56ZW9mIE9GKCh1bnpGaWxlIGZpbGUpKTsKKy8qCisgIHJldHVybiAxIGlmIHRoZSBlbmQgb2YgZmlsZSB3YXMgcmVhY2hlZCwgMCBlbHNld2hlcmUKKyovCisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRMb2NhbEV4dHJhZmllbGQgT0YoKHVuekZpbGUgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWRwIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxlbikpOworLyoKKyAgUmVhZCBleHRyYSBmaWVsZCBmcm9tIHRoZSBjdXJyZW50IGZpbGUgKG9wZW5lZCBieSB1bnpPcGVuQ3VycmVudEZpbGUpCisgIFRoaXMgaXMgdGhlIGxvY2FsLWhlYWRlciB2ZXJzaW9uIG9mIHRoZSBleHRyYSBmaWVsZCAoc29tZXRpbWVzLCB0aGVyZSBpcworICAgIG1vcmUgaW5mbyBpbiB0aGUgbG9jYWwtaGVhZGVyIHZlcnNpb24gdGhhbiBpbiB0aGUgY2VudHJhbC1oZWFkZXIpCisKKyAgaWYgYnVmPT1OVUxMLCBpdCByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxvY2FsIGV4dHJhIGZpZWxkCisKKyAgaWYgYnVmIT1OVUxMLCBsZW4gaXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciwgdGhlIGV4dHJhIGhlYWRlciBpcyBjb3BpZWQgaW4KKyAgICBidWYuCisgIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaW4gYnVmLCBvciAoaWYgPDApCisgICAgdGhlIGVycm9yIGNvZGUKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEdldCB0aGUgY3VycmVudCBmaWxlIG9mZnNldCAqLworZXh0ZXJuIFpQT1M2NF9UIFpFWFBPUlQgdW56R2V0T2Zmc2V0NjQgKHVuekZpbGUgZmlsZSk7CitleHRlcm4gdUxvbmcgWkVYUE9SVCB1bnpHZXRPZmZzZXQgKHVuekZpbGUgZmlsZSk7CisKKy8qIFNldCB0aGUgY3VycmVudCBmaWxlIG9mZnNldCAqLworZXh0ZXJuIGludCBaRVhQT1JUIHVuelNldE9mZnNldDY0ICh1bnpGaWxlIGZpbGUsIFpQT1M2NF9UIHBvcyk7CitleHRlcm4gaW50IFpFWFBPUlQgdW56U2V0T2Zmc2V0ICh1bnpGaWxlIGZpbGUsIHVMb25nIHBvcyk7CisKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX3VuejY0X0ggKi8KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvbWluaXppcC96aXAuYyBiL3psaWIvc3JjL2NvbnRyaWIvbWluaXppcC96aXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTU0ODUzCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9taW5pemlwL3ppcC5jCkBAIC0wLDAgKzEsMjAwNyBAQAorLyogemlwLmMgLS0gSU8gb24gLnppcCBmaWxlcyB1c2luZyB6bGliCisgICBWZXJzaW9uIDEuMSwgRmVicnVhcnkgMTRoLCAyMDEwCisgICBwYXJ0IG9mIHRoZSBNaW5pWmlwIHByb2plY3QgLSAoIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvbWluaXppcC5odG1sICkKKworICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMTAgR2lsbGVzIFZvbGxhbnQgKG1pbml6aXApICggaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC9taW5pemlwLmh0bWwgKQorCisgICAgICAgICBNb2RpZmljYXRpb25zIGZvciBaaXA2NCBzdXBwb3J0CisgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBNYXRoaWFzIFN2ZW5zc29uICggaHR0cDovL3Jlc3VsdDQyLmNvbSApCisKKyAgICAgICAgIEZvciBtb3JlIGluZm8gcmVhZCBNaW5pWmlwX2luZm8udHh0CisKKyAgICAgICAgIENoYW5nZXMKKyAgIE9jdC0yMDA5IC0gTWF0aGlhcyBTdmVuc3NvbiAtIFJlbW92ZSBvbGQgQyBzdHlsZSBmdW5jdGlvbiBwcm90b3R5cGVzCisgICBPY3QtMjAwOSAtIE1hdGhpYXMgU3ZlbnNzb24gLSBBZGRlZCBaaXA2NCBTdXBwb3J0IHdoZW4gY3JlYXRpbmcgbmV3IGZpbGUgYXJjaGl2ZXMKKyAgIE9jdC0yMDA5IC0gTWF0aGlhcyBTdmVuc3NvbiAtIERpZCBzb21lIGNvZGUgY2xlYW51cCBhbmQgcmVmYWN0b3JpbmcgdG8gZ2V0IGJldHRlciBvdmVydmlldyBvZiBzb21lIGZ1bmN0aW9ucy4KKyAgIE9jdC0yMDA5IC0gTWF0aGlhcyBTdmVuc3NvbiAtIEFkZGVkIHppcFJlbW92ZUV4dHJhSW5mb0Jsb2NrIHRvIHN0cmlwIGV4dHJhIGZpZWxkIGRhdGEgZnJvbSBpdHMgWklQNjQgZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgdXNlZCB3aGVuIHJlY3JldGluZyB6aXAgYXJjaGl2ZSB3aXRoIFJBVyB3aGVuIGRlbGV0aW5nIGl0ZW1zIGZyb20gYSB6aXAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaSVA2NCBkYXRhIGlzIGF1dG9tYXRpY2x5IGFkZGVkIHRvIGl0ZW1zIHRoYXQgbmVlZHMgaXQsIGFuZCBleGlzdGluZyBaSVA2NCBkYXRhIG5lZWQgdG8gYmUgcmVtb3ZlZC4KKyAgIE9jdC0yMDA5IC0gTWF0aGlhcyBTdmVuc3NvbiAtIEFkZGVkIHN1cHBvcnQgZm9yIEJaSVAyIGFzIGNvbXByZXNzaW9uIG1vZGUgKGJ6aXAyIGxpYiBpcyByZXF1aXJlZCkKKyAgIEphbi0yMDEwIC0gYmFjayB0byB1bnppcCBhbmQgbWluaXppcCAxLjAgbmFtZSBzY2hlbWUsIHdpdGggY29tcGF0aWJpbGl0eSBsYXllcgorCisqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlICJ6bGliLmgiCisjaW5jbHVkZSAiemlwLmgiCisKKyNpZmRlZiBTVERDCisjICBpbmNsdWRlIDxzdGRkZWYuaD4KKyMgIGluY2x1ZGUgPHN0cmluZy5oPgorIyAgaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpZmRlZiBOT19FUlJOT19ICisgICAgZXh0ZXJuIGludCBlcnJubzsKKyNlbHNlCisjICAgaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorCisKKyNpZm5kZWYgbG9jYWwKKyMgIGRlZmluZSBsb2NhbCBzdGF0aWMKKyNlbmRpZgorLyogY29tcGlsZSB3aXRoIC1EbG9jYWwgaWYgeW91ciBkZWJ1Z2dlciBjYW4ndCBmaW5kIHN0YXRpYyBzeW1ib2xzICovCisKKyNpZm5kZWYgVkVSU0lPTk1BREVCWQorIyBkZWZpbmUgVkVSU0lPTk1BREVCWSAgICgweDApIC8qIHBsYXRmb3JtIGRlcGVkZW50ICovCisjZW5kaWYKKworI2lmbmRlZiBaX0JVRlNJWkUKKyNkZWZpbmUgWl9CVUZTSVpFICg2NCoxMDI0KSAvLygxNjM4NCkKKyNlbmRpZgorCisjaWZuZGVmIFpfTUFYRklMRU5BTUVJTlpJUAorI2RlZmluZSBaX01BWEZJTEVOQU1FSU5aSVAgKDI1NikKKyNlbmRpZgorCisjaWZuZGVmIEFMTE9DCisjIGRlZmluZSBBTExPQyhzaXplKSAobWFsbG9jKHNpemUpKQorI2VuZGlmCisjaWZuZGVmIFRSWUZSRUUKKyMgZGVmaW5lIFRSWUZSRUUocCkge2lmIChwKSBmcmVlKHApO30KKyNlbmRpZgorCisvKgorI2RlZmluZSBTSVpFQ0VOVFJBTERJUklURU0gKDB4MmUpCisjZGVmaW5lIFNJWkVaSVBMT0NBTEhFQURFUiAoMHgxZSkKKyovCisKKy8qIEkndmUgZm91bmQgYW4gb2xkIFVuaXggKGEgU3VuT1MgNC4xLjNfVTEpIHdpdGhvdXQgYWxsIFNFRUtfKiBkZWZpbmVkLi4uLiAqLworCisKKy8vIE5PVCBzdXJlIHRoYXQgdGhpcyB3b3JrIG9uIEFMTCBwbGF0Zm9ybQorI2RlZmluZSBNQUtFVUxPTkc2NChhLCBiKSAoKFpQT1M2NF9UKSgoKHVuc2lnbmVkIGxvbmcpKGEpKSB8ICgoWlBPUzY0X1QpKCh1bnNpZ25lZCBsb25nKShiKSkpIDw8IDMyKSkKKworI2lmbmRlZiBTRUVLX0NVUgorI2RlZmluZSBTRUVLX0NVUiAgICAxCisjZW5kaWYKKworI2lmbmRlZiBTRUVLX0VORAorI2RlZmluZSBTRUVLX0VORCAgICAyCisjZW5kaWYKKworI2lmbmRlZiBTRUVLX1NFVAorI2RlZmluZSBTRUVLX1NFVCAgICAwCisjZW5kaWYKKworI2lmbmRlZiBERUZfTUVNX0xFVkVMCisjaWYgTUFYX01FTV9MRVZFTCA+PSA4CisjICBkZWZpbmUgREVGX01FTV9MRVZFTCA4CisjZWxzZQorIyAgZGVmaW5lIERFRl9NRU1fTEVWRUwgIE1BWF9NRU1fTEVWRUwKKyNlbmRpZgorI2VuZGlmCitjb25zdCBjaGFyIHppcF9jb3B5cmlnaHRbXSA9IiB6aXAgMS4wMSBDb3B5cmlnaHQgMTk5OC0yMDA0IEdpbGxlcyBWb2xsYW50IC0gaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbCI7CisKKworI2RlZmluZSBTSVpFREFUQV9JTkRBVEFCTE9DSyAoNDA5Ni0oNCo0KSkKKworI2RlZmluZSBMT0NBTEhFQURFUk1BR0lDICAgICgweDA0MDM0YjUwKQorI2RlZmluZSBDRU5UUkFMSEVBREVSTUFHSUMgICgweDAyMDE0YjUwKQorI2RlZmluZSBFTkRIRUFERVJNQUdJQyAgICAgICgweDA2MDU0YjUwKQorI2RlZmluZSBaSVA2NEVOREhFQURFUk1BR0lDICAgICAgKDB4NjA2NGI1MCkKKyNkZWZpbmUgWklQNjRFTkRMT0NIRUFERVJNQUdJQyAgICgweDcwNjRiNTApCisKKyNkZWZpbmUgRkxBR19MT0NBTEhFQURFUl9PRkZTRVQgKDB4MDYpCisjZGVmaW5lIENSQ19MT0NBTEhFQURFUl9PRkZTRVQgICgweDBlKQorCisjZGVmaW5lIFNJWkVDRU5UUkFMSEVBREVSICgweDJlKSAvKiA0NiAqLworCit0eXBlZGVmIHN0cnVjdCBsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbF9zCit7CisgIHN0cnVjdCBsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbF9zKiBuZXh0X2RhdGFibG9jazsKKyAgdUxvbmcgIGF2YWlsX2luX3RoaXNfYmxvY2s7CisgIHVMb25nICBmaWxsZWRfaW5fdGhpc19ibG9jazsKKyAgdUxvbmcgIHVudXNlZDsgLyogZm9yIGZ1dHVyZSB1c2UgYW5kIGFsaWduZW1lbnQgKi8KKyAgdW5zaWduZWQgY2hhciBkYXRhW1NJWkVEQVRBX0lOREFUQUJMT0NLXTsKK30gbGlua2VkbGlzdF9kYXRhYmxvY2tfaW50ZXJuYWw7CisKK3R5cGVkZWYgc3RydWN0IGxpbmtlZGxpc3RfZGF0YV9zCit7CisgICAgbGlua2VkbGlzdF9kYXRhYmxvY2tfaW50ZXJuYWwqIGZpcnN0X2Jsb2NrOworICAgIGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKiBsYXN0X2Jsb2NrOworfSBsaW5rZWRsaXN0X2RhdGE7CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB6X3N0cmVhbSBzdHJlYW07ICAgICAgICAgICAgLyogekxpYiBzdHJlYW0gc3RydWN0dXJlIGZvciBpbmZsYXRlICovCisjaWZkZWYgSEFWRV9CWklQMgorICAgIGJ6X3N0cmVhbSBic3RyZWFtOyAgICAgICAgICAvKiBiekxpYiBzdHJlYW0gc3RydWN0dXJlIGZvciBiemlwZWQgKi8KKyNlbmRpZgorCisgICAgaW50ICBzdHJlYW1faW5pdGlhbGlzZWQ7ICAgIC8qIDEgaXMgc3RyZWFtIGlzIGluaXRpYWxpc2VkICovCisgICAgdUludCBwb3NfaW5fYnVmZmVyZWRfZGF0YTsgIC8qIGxhc3Qgd3JpdHRlbiBieXRlIGluIGJ1ZmZlcmVkX2RhdGEgKi8KKworICAgIFpQT1M2NF9UIHBvc19sb2NhbF9oZWFkZXI7ICAgICAvKiBvZmZzZXQgb2YgdGhlIGxvY2FsIGhlYWRlciBvZiB0aGUgZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnR5IHdyaXRpbmcgKi8KKyAgICBjaGFyKiBjZW50cmFsX2hlYWRlcjsgICAgICAgLyogY2VudHJhbCBoZWFkZXIgZGF0YSBmb3IgdGhlIGN1cnJlbnQgZmlsZSAqLworICAgIHVMb25nIHNpemVfY2VudHJhbEV4dHJhOworICAgIHVMb25nIHNpemVfY2VudHJhbGhlYWRlcjsgICAvKiBzaXplIG9mIHRoZSBjZW50cmFsIGhlYWRlciBmb3IgY3VyIGZpbGUgKi8KKyAgICB1TG9uZyBzaXplX2NlbnRyYWxFeHRyYUZyZWU7IC8qIEV4dHJhIGJ5dGVzIGFsbG9jYXRlZCB0byB0aGUgY2VudHJhbGhlYWRlciBidXQgdGhhdCBhcmUgbm90IHVzZWQgKi8KKyAgICB1TG9uZyBmbGFnOyAgICAgICAgICAgICAgICAgLyogZmxhZyBvZiB0aGUgZmlsZSBjdXJyZW50bHkgd3JpdGluZyAqLworCisgICAgaW50ICBtZXRob2Q7ICAgICAgICAgICAgICAgIC8qIGNvbXByZXNzaW9uIG1ldGhvZCBvZiBmaWxlIGN1cnJlbnR5IHdyLiovCisgICAgaW50ICByYXc7ICAgICAgICAgICAgICAgICAgIC8qIDEgZm9yIGRpcmVjdGx5IHdyaXRpbmcgcmF3IGRhdGEgKi8KKyAgICBCeXRlIGJ1ZmZlcmVkX2RhdGFbWl9CVUZTSVpFXTsvKiBidWZmZXIgY29udGFpbiBjb21wcmVzc2VkIGRhdGEgdG8gYmUgd3JpdCovCisgICAgdUxvbmcgZG9zRGF0ZTsKKyAgICB1TG9uZyBjcmMzMjsKKyAgICBpbnQgIGVuY3J5cHQ7CisgICAgaW50ICB6aXA2NDsgICAgICAgICAgICAgICAvKiBBZGQgWklQNjQgZXh0ZW5lZCBpbmZvcm1hdGlvbiBpbiB0aGUgZXh0cmEgZmllbGQgKi8KKyAgICBaUE9TNjRfVCBwb3NfemlwNjRleHRyYWluZm87CisgICAgWlBPUzY0X1QgdG90YWxDb21wcmVzc2VkRGF0YTsKKyAgICBaUE9TNjRfVCB0b3RhbFVuY29tcHJlc3NlZERhdGE7CisjaWZuZGVmIE5PQ1JZUFQKKyAgICB1bnNpZ25lZCBsb25nIGtleXNbM107ICAgICAvKiBrZXlzIGRlZmluaW5nIHRoZSBwc2V1ZG8tcmFuZG9tIHNlcXVlbmNlICovCisgICAgY29uc3Qgel9jcmNfdCogcGNyY18zMl90YWI7CisgICAgaW50IGNyeXB0X2hlYWRlcl9zaXplOworI2VuZGlmCit9IGN1cmZpbGU2NF9pbmZvOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYgel9maWxlZnVuYzsKKyAgICB2b2lkcGYgZmlsZXN0cmVhbTsgICAgICAgIC8qIGlvIHN0cnVjdG9yZSBvZiB0aGUgemlwZmlsZSAqLworICAgIGxpbmtlZGxpc3RfZGF0YSBjZW50cmFsX2RpcjsvKiBkYXRhYmxvY2sgd2l0aCBjZW50cmFsIGRpciBpbiBjb25zdHJ1Y3Rpb24qLworICAgIGludCAgaW5fb3BlbmVkX2ZpbGVfaW56aXA7ICAvKiAxIGlmIGEgZmlsZSBpbiB0aGUgemlwIGlzIGN1cnJlbnRseSB3cml0LiovCisgICAgY3VyZmlsZTY0X2luZm8gY2k7ICAgICAgICAgICAgLyogaW5mbyBvbiB0aGUgZmlsZSBjdXJyZXRseSB3cml0aW5nICovCisKKyAgICBaUE9TNjRfVCBiZWdpbl9wb3M7ICAgICAgICAgICAgLyogcG9zaXRpb24gb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgemlwZmlsZSAqLworICAgIFpQT1M2NF9UIGFkZF9wb3NpdGlvbl93aGVuX3dyaXR0aW5nX29mZnNldDsKKyAgICBaUE9TNjRfVCBudW1iZXJfZW50cnk7CisKKyNpZm5kZWYgTk9fQURERklMRUlORVhJU1RJTkdaSVAKKyAgICBjaGFyICpnbG9iYWxjb21tZW50OworI2VuZGlmCisKK30gemlwNjRfaW50ZXJuYWw7CisKKworI2lmbmRlZiBOT0NSWVBUCisjZGVmaW5lIElOQ0xVREVDUllQVElOR0NPREVfSUZDUllQVEFMTE9XRUQKKyNpbmNsdWRlICJjcnlwdC5oIgorI2VuZGlmCisKK2xvY2FsIGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKiBhbGxvY2F0ZV9uZXdfZGF0YWJsb2NrKCkKK3sKKyAgICBsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbCogbGRpOworICAgIGxkaSA9IChsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbCopCisgICAgICAgICAgICAgICAgIEFMTE9DKHNpemVvZihsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbCkpOworICAgIGlmIChsZGkhPU5VTEwpCisgICAgeworICAgICAgICBsZGktPm5leHRfZGF0YWJsb2NrID0gTlVMTCA7CisgICAgICAgIGxkaS0+ZmlsbGVkX2luX3RoaXNfYmxvY2sgPSAwIDsKKyAgICAgICAgbGRpLT5hdmFpbF9pbl90aGlzX2Jsb2NrID0gU0laRURBVEFfSU5EQVRBQkxPQ0sgOworICAgIH0KKyAgICByZXR1cm4gbGRpOworfQorCitsb2NhbCB2b2lkIGZyZWVfZGF0YWJsb2NrKGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKiBsZGkpCit7CisgICAgd2hpbGUgKGxkaSE9TlVMTCkKKyAgICB7CisgICAgICAgIGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKiBsZGluZXh0ID0gbGRpLT5uZXh0X2RhdGFibG9jazsKKyAgICAgICAgVFJZRlJFRShsZGkpOworICAgICAgICBsZGkgPSBsZGluZXh0OworICAgIH0KK30KKworbG9jYWwgdm9pZCBpbml0X2xpbmtlZGxpc3QobGlua2VkbGlzdF9kYXRhKiBsbCkKK3sKKyAgICBsbC0+Zmlyc3RfYmxvY2sgPSBsbC0+bGFzdF9ibG9jayA9IE5VTEw7Cit9CisKK2xvY2FsIHZvaWQgZnJlZV9saW5rZWRsaXN0KGxpbmtlZGxpc3RfZGF0YSogbGwpCit7CisgICAgZnJlZV9kYXRhYmxvY2sobGwtPmZpcnN0X2Jsb2NrKTsKKyAgICBsbC0+Zmlyc3RfYmxvY2sgPSBsbC0+bGFzdF9ibG9jayA9IE5VTEw7Cit9CisKKworbG9jYWwgaW50IGFkZF9kYXRhX2luX2RhdGFibG9jayhsaW5rZWRsaXN0X2RhdGEqIGxsLCBjb25zdCB2b2lkKiBidWYsIHVMb25nIGxlbikKK3sKKyAgICBsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbCogbGRpOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGZyb21fY29weTsKKworICAgIGlmIChsbD09TlVMTCkKKyAgICAgICAgcmV0dXJuIFpJUF9JTlRFUk5BTEVSUk9SOworCisgICAgaWYgKGxsLT5sYXN0X2Jsb2NrID09IE5VTEwpCisgICAgeworICAgICAgICBsbC0+Zmlyc3RfYmxvY2sgPSBsbC0+bGFzdF9ibG9jayA9IGFsbG9jYXRlX25ld19kYXRhYmxvY2soKTsKKyAgICAgICAgaWYgKGxsLT5maXJzdF9ibG9jayA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIFpJUF9JTlRFUk5BTEVSUk9SOworICAgIH0KKworICAgIGxkaSA9IGxsLT5sYXN0X2Jsb2NrOworICAgIGZyb21fY29weSA9ICh1bnNpZ25lZCBjaGFyKilidWY7CisKKyAgICB3aGlsZSAobGVuPjApCisgICAgeworICAgICAgICB1SW50IGNvcHlfdGhpczsKKyAgICAgICAgdUludCBpOworICAgICAgICB1bnNpZ25lZCBjaGFyKiB0b19jb3B5OworCisgICAgICAgIGlmIChsZGktPmF2YWlsX2luX3RoaXNfYmxvY2s9PTApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxkaS0+bmV4dF9kYXRhYmxvY2sgPSBhbGxvY2F0ZV9uZXdfZGF0YWJsb2NrKCk7CisgICAgICAgICAgICBpZiAobGRpLT5uZXh0X2RhdGFibG9jayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBaSVBfSU5URVJOQUxFUlJPUjsKKyAgICAgICAgICAgIGxkaSA9IGxkaS0+bmV4dF9kYXRhYmxvY2sgOworICAgICAgICAgICAgbGwtPmxhc3RfYmxvY2sgPSBsZGk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGRpLT5hdmFpbF9pbl90aGlzX2Jsb2NrIDwgbGVuKQorICAgICAgICAgICAgY29weV90aGlzID0gKHVJbnQpbGRpLT5hdmFpbF9pbl90aGlzX2Jsb2NrOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb3B5X3RoaXMgPSAodUludClsZW47CisKKyAgICAgICAgdG9fY29weSA9ICYobGRpLT5kYXRhW2xkaS0+ZmlsbGVkX2luX3RoaXNfYmxvY2tdKTsKKworICAgICAgICBmb3IgKGk9MDtpPGNvcHlfdGhpcztpKyspCisgICAgICAgICAgICAqKHRvX2NvcHkraSk9Kihmcm9tX2NvcHkraSk7CisKKyAgICAgICAgbGRpLT5maWxsZWRfaW5fdGhpc19ibG9jayArPSBjb3B5X3RoaXM7CisgICAgICAgIGxkaS0+YXZhaWxfaW5fdGhpc19ibG9jayAtPSBjb3B5X3RoaXM7CisgICAgICAgIGZyb21fY29weSArPSBjb3B5X3RoaXMgOworICAgICAgICBsZW4gLT0gY29weV90aGlzOworICAgIH0KKyAgICByZXR1cm4gWklQX09LOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTk9fQURERklMRUlORVhJU1RJTkdaSVAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgSW5wdXRzIGEgbG9uZyBpbiBMU0Igb3JkZXIgdG8gdGhlIGdpdmVuIGZpbGUKKyAgIG5iQnl0ZSA9PSAxLCAyICw0IG9yIDggKGJ5dGUsIHNob3J0IG9yIGxvbmcsIFpQT1M2NF9UKQorKi8KKworbG9jYWwgaW50IHppcDY0bG9jYWxfcHV0VmFsdWUgT0YoKGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwgdm9pZHBmIGZpbGVzdHJlYW0sIFpQT1M2NF9UIHgsIGludCBuYkJ5dGUpKTsKK2xvY2FsIGludCB6aXA2NGxvY2FsX3B1dFZhbHVlIChjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsIHZvaWRwZiBmaWxlc3RyZWFtLCBaUE9TNjRfVCB4LCBpbnQgbmJCeXRlKQoreworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzhdOworICAgIGludCBuOworICAgIGZvciAobiA9IDA7IG4gPCBuYkJ5dGU7IG4rKykKKyAgICB7CisgICAgICAgIGJ1ZltuXSA9ICh1bnNpZ25lZCBjaGFyKSh4ICYgMHhmZik7CisgICAgICAgIHggPj49IDg7CisgICAgfQorICAgIGlmICh4ICE9IDApCisgICAgICB7ICAgICAvKiBkYXRhIG92ZXJmbG93IC0gaGFjayBmb3IgWklQNjQgKFggUm9jaGUpICovCisgICAgICBmb3IgKG4gPSAwOyBuIDwgbmJCeXRlOyBuKyspCisgICAgICAgIHsKKyAgICAgICAgICBidWZbbl0gPSAweGZmOworICAgICAgICB9CisgICAgICB9CisKKyAgICBpZiAoWldSSVRFNjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLGJ1ZixuYkJ5dGUpIT0odUxvbmcpbmJCeXRlKQorICAgICAgICByZXR1cm4gWklQX0VSUk5POworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFpJUF9PSzsKK30KKworbG9jYWwgdm9pZCB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5IE9GKCh2b2lkKiBkZXN0LCBaUE9TNjRfVCB4LCBpbnQgbmJCeXRlKSk7Citsb2NhbCB2b2lkIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkgKHZvaWQqIGRlc3QsIFpQT1M2NF9UIHgsIGludCBuYkJ5dGUpCit7CisgICAgdW5zaWduZWQgY2hhciogYnVmPSh1bnNpZ25lZCBjaGFyKilkZXN0OworICAgIGludCBuOworICAgIGZvciAobiA9IDA7IG4gPCBuYkJ5dGU7IG4rKykgeworICAgICAgICBidWZbbl0gPSAodW5zaWduZWQgY2hhcikoeCAmIDB4ZmYpOworICAgICAgICB4ID4+PSA4OworICAgIH0KKworICAgIGlmICh4ICE9IDApCisgICAgeyAgICAgLyogZGF0YSBvdmVyZmxvdyAtIGhhY2sgZm9yIFpJUDY0ICovCisgICAgICAgZm9yIChuID0gMDsgbiA8IG5iQnl0ZTsgbisrKQorICAgICAgIHsKKyAgICAgICAgICBidWZbbl0gPSAweGZmOworICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2xvY2FsIHVMb25nIHppcDY0bG9jYWxfVG16RGF0ZVRvRG9zRGF0ZShjb25zdCB0bV96aXAqIHB0bSkKK3sKKyAgICB1TG9uZyB5ZWFyID0gKHVMb25nKXB0bS0+dG1feWVhcjsKKyAgICBpZiAoeWVhcj49MTk4MCkKKyAgICAgICAgeWVhci09MTk4MDsKKyAgICBlbHNlIGlmICh5ZWFyPj04MCkKKyAgICAgICAgeWVhci09ODA7CisgICAgcmV0dXJuCisgICAgICAodUxvbmcpICgoKHB0bS0+dG1fbWRheSkgKyAoMzIgKiAocHRtLT50bV9tb24rMSkpICsgKDUxMiAqIHllYXIpKSA8PCAxNikgfAorICAgICAgICAoKHB0bS0+dG1fc2VjLzIpICsgKDMyKiBwdG0tPnRtX21pbikgKyAoMjA0OCAqICh1TG9uZylwdG0tPnRtX2hvdXIpKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworbG9jYWwgaW50IHppcDY0bG9jYWxfZ2V0Qnl0ZSBPRigoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLCB2b2lkcGYgZmlsZXN0cmVhbSwgaW50ICpwaSkpOworCitsb2NhbCBpbnQgemlwNjRsb2NhbF9nZXRCeXRlKGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZix2b2lkcGYgZmlsZXN0cmVhbSxpbnQqIHBpKQoreworICAgIHVuc2lnbmVkIGNoYXIgYzsKKyAgICBpbnQgZXJyID0gKGludClaUkVBRDY0KCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmYywxKTsKKyAgICBpZiAoZXJyPT0xKQorICAgIHsKKyAgICAgICAgKnBpID0gKGludCljOworICAgICAgICByZXR1cm4gWklQX09LOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoWkVSUk9SNjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtKSkKKyAgICAgICAgICAgIHJldHVybiBaSVBfRVJSTk87CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBaSVBfRU9GOworICAgIH0KK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIFJlYWRzIGEgbG9uZyBpbiBMU0Igb3JkZXIgZnJvbSB0aGUgZ2l2ZW4gZ3pfc3RyZWFtLiBTZXRzCisqLworbG9jYWwgaW50IHppcDY0bG9jYWxfZ2V0U2hvcnQgT0YoKGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwgdm9pZHBmIGZpbGVzdHJlYW0sIHVMb25nICpwWCkpOworCitsb2NhbCBpbnQgemlwNjRsb2NhbF9nZXRTaG9ydCAoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLCB2b2lkcGYgZmlsZXN0cmVhbSwgdUxvbmcqIHBYKQoreworICAgIHVMb25nIHggOworICAgIGludCBpID0gMDsKKyAgICBpbnQgZXJyOworCisgICAgZXJyID0gemlwNjRsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKKyAgICB4ID0gKHVMb25nKWk7CisKKyAgICBpZiAoZXJyPT1aSVBfT0spCisgICAgICAgIGVyciA9IHppcDY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CisgICAgeCArPSAoKHVMb25nKWkpPDw4OworCisgICAgaWYgKGVycj09WklQX09LKQorICAgICAgICAqcFggPSB4OworICAgIGVsc2UKKyAgICAgICAgKnBYID0gMDsKKyAgICByZXR1cm4gZXJyOworfQorCitsb2NhbCBpbnQgemlwNjRsb2NhbF9nZXRMb25nIE9GKChjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsIHZvaWRwZiBmaWxlc3RyZWFtLCB1TG9uZyAqcFgpKTsKKworbG9jYWwgaW50IHppcDY0bG9jYWxfZ2V0TG9uZyAoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLCB2b2lkcGYgZmlsZXN0cmVhbSwgdUxvbmcqIHBYKQoreworICAgIHVMb25nIHggOworICAgIGludCBpID0gMDsKKyAgICBpbnQgZXJyOworCisgICAgZXJyID0gemlwNjRsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKKyAgICB4ID0gKHVMb25nKWk7CisKKyAgICBpZiAoZXJyPT1aSVBfT0spCisgICAgICAgIGVyciA9IHppcDY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CisgICAgeCArPSAoKHVMb25nKWkpPDw4OworCisgICAgaWYgKGVycj09WklQX09LKQorICAgICAgICBlcnIgPSB6aXA2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOworICAgIHggKz0gKCh1TG9uZylpKTw8MTY7CisKKyAgICBpZiAoZXJyPT1aSVBfT0spCisgICAgICAgIGVyciA9IHppcDY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CisgICAgeCArPSAoKHVMb25nKWkpPDwyNDsKKworICAgIGlmIChlcnI9PVpJUF9PSykKKyAgICAgICAgKnBYID0geDsKKyAgICBlbHNlCisgICAgICAgICpwWCA9IDA7CisgICAgcmV0dXJuIGVycjsKK30KKworbG9jYWwgaW50IHppcDY0bG9jYWxfZ2V0TG9uZzY0IE9GKChjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsIHZvaWRwZiBmaWxlc3RyZWFtLCBaUE9TNjRfVCAqcFgpKTsKKworCitsb2NhbCBpbnQgemlwNjRsb2NhbF9nZXRMb25nNjQgKGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwgdm9pZHBmIGZpbGVzdHJlYW0sIFpQT1M2NF9UICpwWCkKK3sKKyAgWlBPUzY0X1QgeDsKKyAgaW50IGkgPSAwOworICBpbnQgZXJyOworCisgIGVyciA9IHppcDY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CisgIHggPSAoWlBPUzY0X1QpaTsKKworICBpZiAoZXJyPT1aSVBfT0spCisgICAgZXJyID0gemlwNjRsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKKyAgeCArPSAoKFpQT1M2NF9UKWkpPDw4OworCisgIGlmIChlcnI9PVpJUF9PSykKKyAgICBlcnIgPSB6aXA2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOworICB4ICs9ICgoWlBPUzY0X1QpaSk8PDE2OworCisgIGlmIChlcnI9PVpJUF9PSykKKyAgICBlcnIgPSB6aXA2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOworICB4ICs9ICgoWlBPUzY0X1QpaSk8PDI0OworCisgIGlmIChlcnI9PVpJUF9PSykKKyAgICBlcnIgPSB6aXA2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOworICB4ICs9ICgoWlBPUzY0X1QpaSk8PDMyOworCisgIGlmIChlcnI9PVpJUF9PSykKKyAgICBlcnIgPSB6aXA2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOworICB4ICs9ICgoWlBPUzY0X1QpaSk8PDQwOworCisgIGlmIChlcnI9PVpJUF9PSykKKyAgICBlcnIgPSB6aXA2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOworICB4ICs9ICgoWlBPUzY0X1QpaSk8PDQ4OworCisgIGlmIChlcnI9PVpJUF9PSykKKyAgICBlcnIgPSB6aXA2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOworICB4ICs9ICgoWlBPUzY0X1QpaSk8PDU2OworCisgIGlmIChlcnI9PVpJUF9PSykKKyAgICAqcFggPSB4OworICBlbHNlCisgICAgKnBYID0gMDsKKworICByZXR1cm4gZXJyOworfQorCisjaWZuZGVmIEJVRlJFQURDT01NRU5UCisjZGVmaW5lIEJVRlJFQURDT01NRU5UICgweDQwMCkKKyNlbmRpZgorLyoKKyAgTG9jYXRlIHRoZSBDZW50cmFsIGRpcmVjdG9yeSBvZiBhIHppcGZpbGUgKGF0IHRoZSBlbmQsIGp1c3QgYmVmb3JlCisgICAgdGhlIGdsb2JhbCBjb21tZW50KQorKi8KK2xvY2FsIFpQT1M2NF9UIHppcDY0bG9jYWxfU2VhcmNoQ2VudHJhbERpciBPRigoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLCB2b2lkcGYgZmlsZXN0cmVhbSkpOworCitsb2NhbCBaUE9TNjRfVCB6aXA2NGxvY2FsX1NlYXJjaENlbnRyYWxEaXIoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLCB2b2lkcGYgZmlsZXN0cmVhbSkKK3sKKyAgdW5zaWduZWQgY2hhciogYnVmOworICBaUE9TNjRfVCB1U2l6ZUZpbGU7CisgIFpQT1M2NF9UIHVCYWNrUmVhZDsKKyAgWlBPUzY0X1QgdU1heEJhY2s9MHhmZmZmOyAvKiBtYXhpbXVtIHNpemUgb2YgZ2xvYmFsIGNvbW1lbnQgKi8KKyAgWlBPUzY0X1QgdVBvc0ZvdW5kPTA7CisKKyAgaWYgKFpTRUVLNjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLDAsWkxJQl9GSUxFRlVOQ19TRUVLX0VORCkgIT0gMCkKKyAgICByZXR1cm4gMDsKKworCisgIHVTaXplRmlsZSA9IFpURUxMNjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtKTsKKworICBpZiAodU1heEJhY2s+dVNpemVGaWxlKQorICAgIHVNYXhCYWNrID0gdVNpemVGaWxlOworCisgIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyKilBTExPQyhCVUZSRUFEQ09NTUVOVCs0KTsKKyAgaWYgKGJ1Zj09TlVMTCkKKyAgICByZXR1cm4gMDsKKworICB1QmFja1JlYWQgPSA0OworICB3aGlsZSAodUJhY2tSZWFkPHVNYXhCYWNrKQorICB7CisgICAgdUxvbmcgdVJlYWRTaXplOworICAgIFpQT1M2NF9UIHVSZWFkUG9zIDsKKyAgICBpbnQgaTsKKyAgICBpZiAodUJhY2tSZWFkK0JVRlJFQURDT01NRU5UPnVNYXhCYWNrKQorICAgICAgdUJhY2tSZWFkID0gdU1heEJhY2s7CisgICAgZWxzZQorICAgICAgdUJhY2tSZWFkKz1CVUZSRUFEQ09NTUVOVDsKKyAgICB1UmVhZFBvcyA9IHVTaXplRmlsZS11QmFja1JlYWQgOworCisgICAgdVJlYWRTaXplID0gKChCVUZSRUFEQ09NTUVOVCs0KSA8ICh1U2l6ZUZpbGUtdVJlYWRQb3MpKSA/CisgICAgICAoQlVGUkVBRENPTU1FTlQrNCkgOiAodUxvbmcpKHVTaXplRmlsZS11UmVhZFBvcyk7CisgICAgaWYgKFpTRUVLNjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLHVSZWFkUG9zLFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQorICAgICAgYnJlYWs7CisKKyAgICBpZiAoWlJFQUQ2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sYnVmLHVSZWFkU2l6ZSkhPXVSZWFkU2l6ZSkKKyAgICAgIGJyZWFrOworCisgICAgZm9yIChpPShpbnQpdVJlYWRTaXplLTM7IChpLS0pPjA7KQorICAgICAgaWYgKCgoKihidWYraSkpPT0weDUwKSAmJiAoKCooYnVmK2krMSkpPT0weDRiKSAmJgorICAgICAgICAoKCooYnVmK2krMikpPT0weDA1KSAmJiAoKCooYnVmK2krMykpPT0weDA2KSkKKyAgICAgIHsKKyAgICAgICAgdVBvc0ZvdW5kID0gdVJlYWRQb3MraTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmICh1UG9zRm91bmQhPTApCisgICAgICAgIGJyZWFrOworICB9CisgIFRSWUZSRUUoYnVmKTsKKyAgcmV0dXJuIHVQb3NGb3VuZDsKK30KKworLyoKK0xvY2F0ZSB0aGUgRW5kIG9mIFppcDY0IENlbnRyYWwgZGlyZWN0b3J5IGxvY2F0b3IgYW5kIGZyb20gdGhlcmUgZmluZCB0aGUgQ0Qgb2YgYSB6aXBmaWxlIChhdCB0aGUgZW5kLCBqdXN0IGJlZm9yZQordGhlIGdsb2JhbCBjb21tZW50KQorKi8KK2xvY2FsIFpQT1M2NF9UIHppcDY0bG9jYWxfU2VhcmNoQ2VudHJhbERpcjY0IE9GKChjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsIHZvaWRwZiBmaWxlc3RyZWFtKSk7CisKK2xvY2FsIFpQT1M2NF9UIHppcDY0bG9jYWxfU2VhcmNoQ2VudHJhbERpcjY0KGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwgdm9pZHBmIGZpbGVzdHJlYW0pCit7CisgIHVuc2lnbmVkIGNoYXIqIGJ1ZjsKKyAgWlBPUzY0X1QgdVNpemVGaWxlOworICBaUE9TNjRfVCB1QmFja1JlYWQ7CisgIFpQT1M2NF9UIHVNYXhCYWNrPTB4ZmZmZjsgLyogbWF4aW11bSBzaXplIG9mIGdsb2JhbCBjb21tZW50ICovCisgIFpQT1M2NF9UIHVQb3NGb3VuZD0wOworICB1TG9uZyB1TDsKKyAgWlBPUzY0X1QgcmVsYXRpdmVPZmZzZXQ7CisKKyAgaWYgKFpTRUVLNjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLDAsWkxJQl9GSUxFRlVOQ19TRUVLX0VORCkgIT0gMCkKKyAgICByZXR1cm4gMDsKKworICB1U2l6ZUZpbGUgPSBaVEVMTDY0KCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSk7CisKKyAgaWYgKHVNYXhCYWNrPnVTaXplRmlsZSkKKyAgICB1TWF4QmFjayA9IHVTaXplRmlsZTsKKworICBidWYgPSAodW5zaWduZWQgY2hhciopQUxMT0MoQlVGUkVBRENPTU1FTlQrNCk7CisgIGlmIChidWY9PU5VTEwpCisgICAgcmV0dXJuIDA7CisKKyAgdUJhY2tSZWFkID0gNDsKKyAgd2hpbGUgKHVCYWNrUmVhZDx1TWF4QmFjaykKKyAgeworICAgIHVMb25nIHVSZWFkU2l6ZTsKKyAgICBaUE9TNjRfVCB1UmVhZFBvczsKKyAgICBpbnQgaTsKKyAgICBpZiAodUJhY2tSZWFkK0JVRlJFQURDT01NRU5UPnVNYXhCYWNrKQorICAgICAgdUJhY2tSZWFkID0gdU1heEJhY2s7CisgICAgZWxzZQorICAgICAgdUJhY2tSZWFkKz1CVUZSRUFEQ09NTUVOVDsKKyAgICB1UmVhZFBvcyA9IHVTaXplRmlsZS11QmFja1JlYWQgOworCisgICAgdVJlYWRTaXplID0gKChCVUZSRUFEQ09NTUVOVCs0KSA8ICh1U2l6ZUZpbGUtdVJlYWRQb3MpKSA/CisgICAgICAoQlVGUkVBRENPTU1FTlQrNCkgOiAodUxvbmcpKHVTaXplRmlsZS11UmVhZFBvcyk7CisgICAgaWYgKFpTRUVLNjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLHVSZWFkUG9zLFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQorICAgICAgYnJlYWs7CisKKyAgICBpZiAoWlJFQUQ2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sYnVmLHVSZWFkU2l6ZSkhPXVSZWFkU2l6ZSkKKyAgICAgIGJyZWFrOworCisgICAgZm9yIChpPShpbnQpdVJlYWRTaXplLTM7IChpLS0pPjA7KQorICAgIHsKKyAgICAgIC8vIFNpZ25hdHVyZSAiMHgwNzA2NGI1MCIgWmlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IGxvY2F0ZXIKKyAgICAgIGlmICgoKCooYnVmK2kpKT09MHg1MCkgJiYgKCgqKGJ1ZitpKzEpKT09MHg0YikgJiYgKCgqKGJ1ZitpKzIpKT09MHgwNikgJiYgKCgqKGJ1ZitpKzMpKT09MHgwNykpCisgICAgICB7CisgICAgICAgIHVQb3NGb3VuZCA9IHVSZWFkUG9zK2k7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgICAgaWYgKHVQb3NGb3VuZCE9MCkKKyAgICAgICAgYnJlYWs7CisgIH0KKworICBUUllGUkVFKGJ1Zik7CisgIGlmICh1UG9zRm91bmQgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICAvKiBaaXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvciAqLworICBpZiAoWlNFRUs2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sIHVQb3NGb3VuZCxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKKyAgICByZXR1cm4gMDsKKworICAvKiB0aGUgc2lnbmF0dXJlLCBhbHJlYWR5IGNoZWNrZWQgKi8KKyAgaWYgKHppcDY0bG9jYWxfZ2V0TG9uZyhwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmdUwpIT1aSVBfT0spCisgICAgcmV0dXJuIDA7CisKKyAgLyogbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSB6aXA2NCBlbmQgb2YgIGNlbnRyYWwgZGlyZWN0b3J5ICovCisgIGlmICh6aXA2NGxvY2FsX2dldExvbmcocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJnVMKSE9WklQX09LKQorICAgIHJldHVybiAwOworICBpZiAodUwgIT0gMCkKKyAgICByZXR1cm4gMDsKKworICAvKiByZWxhdGl2ZSBvZmZzZXQgb2YgdGhlIHppcDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmQgKi8KKyAgaWYgKHppcDY0bG9jYWxfZ2V0TG9uZzY0KHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZyZWxhdGl2ZU9mZnNldCkhPVpJUF9PSykKKyAgICByZXR1cm4gMDsKKworICAvKiB0b3RhbCBudW1iZXIgb2YgZGlza3MgKi8KKyAgaWYgKHppcDY0bG9jYWxfZ2V0TG9uZyhwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmdUwpIT1aSVBfT0spCisgICAgcmV0dXJuIDA7CisgIGlmICh1TCAhPSAxKQorICAgIHJldHVybiAwOworCisgIC8qIEdvdG8gWmlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IHJlY29yZCAqLworICBpZiAoWlNFRUs2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sIHJlbGF0aXZlT2Zmc2V0LFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQorICAgIHJldHVybiAwOworCisgIC8qIHRoZSBzaWduYXR1cmUgKi8KKyAgaWYgKHppcDY0bG9jYWxfZ2V0TG9uZyhwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmdUwpIT1aSVBfT0spCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHVMICE9IDB4MDYwNjRiNTApIC8vIHNpZ25hdHVyZSBvZiAnWmlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5JworICAgIHJldHVybiAwOworCisgIHJldHVybiByZWxhdGl2ZU9mZnNldDsKK30KKworaW50IExvYWRDZW50cmFsRGlyZWN0b3J5UmVjb3JkKHppcDY0X2ludGVybmFsKiBwemlpbml0KQoreworICBpbnQgZXJyPVpJUF9PSzsKKyAgWlBPUzY0X1QgYnl0ZV9iZWZvcmVfdGhlX3ppcGZpbGU7LyogYnl0ZSBiZWZvcmUgdGhlIHppcGZpbGUsICg+MCBmb3Igc2Z4KSovCisKKyAgWlBPUzY0X1Qgc2l6ZV9jZW50cmFsX2RpcjsgICAgIC8qIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICAqLworICBaUE9TNjRfVCBvZmZzZXRfY2VudHJhbF9kaXI7ICAgLyogb2Zmc2V0IG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5ICovCisgIFpQT1M2NF9UIGNlbnRyYWxfcG9zOworICB1TG9uZyB1TDsKKworICB1TG9uZyBudW1iZXJfZGlzazsgICAgICAgICAgLyogbnVtYmVyIG9mIHRoZSBjdXJyZW50IGRpc3QsIHVzZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuaW5nIFpJUCwgdW5zdXBwb3J0ZWQsIGFsd2F5cyAwKi8KKyAgdUxvbmcgbnVtYmVyX2Rpc2tfd2l0aF9DRDsgIC8qIG51bWJlciB0aGUgdGhlIGRpc2sgd2l0aCBjZW50cmFsIGRpciwgdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHNwYW5pbmcgWklQLCB1bnN1cHBvcnRlZCwgYWx3YXlzIDAqLworICBaUE9TNjRfVCBudW1iZXJfZW50cnk7CisgIFpQT1M2NF9UIG51bWJlcl9lbnRyeV9DRDsgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2VudHJhbCBkaXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNhbWUgdGhhbiBudW1iZXJfZW50cnkgb24gbm9zcGFuKSAqLworICB1TG9uZyBWZXJzaW9uTWFkZUJ5OworICB1TG9uZyBWZXJzaW9uTmVlZGVkOworICB1TG9uZyBzaXplX2NvbW1lbnQ7CisKKyAgaW50IGhhc1pJUDY0UmVjb3JkID0gMDsKKworICAvLyBjaGVjayBmaXJzdCBpZiB3ZSBmaW5kIGEgWklQNjQgcmVjb3JkCisgIGNlbnRyYWxfcG9zID0gemlwNjRsb2NhbF9TZWFyY2hDZW50cmFsRGlyNjQoJnB6aWluaXQtPnpfZmlsZWZ1bmMscHppaW5pdC0+ZmlsZXN0cmVhbSk7CisgIGlmKGNlbnRyYWxfcG9zID4gMCkKKyAgeworICAgIGhhc1pJUDY0UmVjb3JkID0gMTsKKyAgfQorICBlbHNlIGlmKGNlbnRyYWxfcG9zID09IDApCisgIHsKKyAgICBjZW50cmFsX3BvcyA9IHppcDY0bG9jYWxfU2VhcmNoQ2VudHJhbERpcigmcHppaW5pdC0+el9maWxlZnVuYyxwemlpbml0LT5maWxlc3RyZWFtKTsKKyAgfQorCisvKiBkaXNhYmxlIHRvIGFsbG93IGFwcGVuZGluZyB0byBlbXB0eSBaSVAgYXJjaGl2ZQorICAgICAgICBpZiAoY2VudHJhbF9wb3M9PTApCisgICAgICAgICAgICBlcnI9WklQX0VSUk5POworKi8KKworICBpZihoYXNaSVA2NFJlY29yZCkKKyAgeworICAgIFpQT1M2NF9UIHNpemVFbmRPZkNlbnRyYWxEaXJlY3Rvcnk7CisgICAgaWYgKFpTRUVLNjQocHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSwgY2VudHJhbF9wb3MsIFpMSUJfRklMRUZVTkNfU0VFS19TRVQpICE9IDApCisgICAgICBlcnI9WklQX0VSUk5POworCisgICAgLyogdGhlIHNpZ25hdHVyZSwgYWxyZWFkeSBjaGVja2VkICovCisgICAgaWYgKHppcDY0bG9jYWxfZ2V0TG9uZygmcHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSwmdUwpIT1aSVBfT0spCisgICAgICBlcnI9WklQX0VSUk5POworCisgICAgLyogc2l6ZSBvZiB6aXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkICovCisgICAgaWYgKHppcDY0bG9jYWxfZ2V0TG9uZzY0KCZwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCAmc2l6ZUVuZE9mQ2VudHJhbERpcmVjdG9yeSkhPVpJUF9PSykKKyAgICAgIGVycj1aSVBfRVJSTk87CisKKyAgICAvKiB2ZXJzaW9uIG1hZGUgYnkgKi8KKyAgICBpZiAoemlwNjRsb2NhbF9nZXRTaG9ydCgmcHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSwgJlZlcnNpb25NYWRlQnkpIT1aSVBfT0spCisgICAgICBlcnI9WklQX0VSUk5POworCisgICAgLyogdmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdCAqLworICAgIGlmICh6aXA2NGxvY2FsX2dldFNob3J0KCZwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCAmVmVyc2lvbk5lZWRlZCkhPVpJUF9PSykKKyAgICAgIGVycj1aSVBfRVJSTk87CisKKyAgICAvKiBudW1iZXIgb2YgdGhpcyBkaXNrICovCisgICAgaWYgKHppcDY0bG9jYWxfZ2V0TG9uZygmcHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSwmbnVtYmVyX2Rpc2spIT1aSVBfT0spCisgICAgICBlcnI9WklQX0VSUk5POworCisgICAgLyogbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLworICAgIGlmICh6aXA2NGxvY2FsX2dldExvbmcoJnB6aWluaXQtPnpfZmlsZWZ1bmMsIHB6aWluaXQtPmZpbGVzdHJlYW0sJm51bWJlcl9kaXNrX3dpdGhfQ0QpIT1aSVBfT0spCisgICAgICBlcnI9WklQX0VSUk5POworCisgICAgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyZWN0b3J5IG9uIHRoaXMgZGlzayAqLworICAgIGlmICh6aXA2NGxvY2FsX2dldExvbmc2NCgmcHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSwgJm51bWJlcl9lbnRyeSkhPVpJUF9PSykKKyAgICAgIGVycj1aSVBfRVJSTk87CisKKyAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8KKyAgICBpZiAoemlwNjRsb2NhbF9nZXRMb25nNjQoJnB6aWluaXQtPnpfZmlsZWZ1bmMsIHB6aWluaXQtPmZpbGVzdHJlYW0sJm51bWJlcl9lbnRyeV9DRCkhPVpJUF9PSykKKyAgICAgIGVycj1aSVBfRVJSTk87CisKKyAgICBpZiAoKG51bWJlcl9lbnRyeV9DRCE9bnVtYmVyX2VudHJ5KSB8fCAobnVtYmVyX2Rpc2tfd2l0aF9DRCE9MCkgfHwgKG51bWJlcl9kaXNrIT0wKSkKKyAgICAgIGVycj1aSVBfQkFEWklQRklMRTsKKworICAgIC8qIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICovCisgICAgaWYgKHppcDY0bG9jYWxfZ2V0TG9uZzY0KCZwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCZzaXplX2NlbnRyYWxfZGlyKSE9WklQX09LKQorICAgICAgZXJyPVpJUF9FUlJOTzsKKworICAgIC8qIG9mZnNldCBvZiBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeSB3aXRoIHJlc3BlY3QgdG8gdGhlCisgICAgc3RhcnRpbmcgZGlzayBudW1iZXIgKi8KKyAgICBpZiAoemlwNjRsb2NhbF9nZXRMb25nNjQoJnB6aWluaXQtPnpfZmlsZWZ1bmMsIHB6aWluaXQtPmZpbGVzdHJlYW0sJm9mZnNldF9jZW50cmFsX2RpcikhPVpJUF9PSykKKyAgICAgIGVycj1aSVBfRVJSTk87CisKKyAgICAvLyBUT0RPLi4KKyAgICAvLyByZWFkIHRoZSBjb21tZW50IGZyb20gdGhlIHN0YW5kYXJkIGNlbnRyYWwgaGVhZGVyLgorICAgIHNpemVfY29tbWVudCA9IDA7CisgIH0KKyAgZWxzZQorICB7CisgICAgLy8gUmVhZCBFbmQgb2YgY2VudHJhbCBEaXJlY3RvcnkgaW5mbworICAgIGlmIChaU0VFSzY0KHB6aWluaXQtPnpfZmlsZWZ1bmMsIHB6aWluaXQtPmZpbGVzdHJlYW0sIGNlbnRyYWxfcG9zLFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQorICAgICAgZXJyPVpJUF9FUlJOTzsKKworICAgIC8qIHRoZSBzaWduYXR1cmUsIGFscmVhZHkgY2hlY2tlZCAqLworICAgIGlmICh6aXA2NGxvY2FsX2dldExvbmcoJnB6aWluaXQtPnpfZmlsZWZ1bmMsIHB6aWluaXQtPmZpbGVzdHJlYW0sJnVMKSE9WklQX09LKQorICAgICAgZXJyPVpJUF9FUlJOTzsKKworICAgIC8qIG51bWJlciBvZiB0aGlzIGRpc2sgKi8KKyAgICBpZiAoemlwNjRsb2NhbF9nZXRTaG9ydCgmcHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSwmbnVtYmVyX2Rpc2spIT1aSVBfT0spCisgICAgICBlcnI9WklQX0VSUk5POworCisgICAgLyogbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLworICAgIGlmICh6aXA2NGxvY2FsX2dldFNob3J0KCZwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCZudW1iZXJfZGlza193aXRoX0NEKSE9WklQX09LKQorICAgICAgZXJyPVpJUF9FUlJOTzsKKworICAgIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpciBvbiB0aGlzIGRpc2sgKi8KKyAgICBudW1iZXJfZW50cnkgPSAwOworICAgIGlmICh6aXA2NGxvY2FsX2dldFNob3J0KCZwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCAmdUwpIT1aSVBfT0spCisgICAgICBlcnI9WklQX0VSUk5POworICAgIGVsc2UKKyAgICAgIG51bWJlcl9lbnRyeSA9IHVMOworCisgICAgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyICovCisgICAgbnVtYmVyX2VudHJ5X0NEID0gMDsKKyAgICBpZiAoemlwNjRsb2NhbF9nZXRTaG9ydCgmcHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSwgJnVMKSE9WklQX09LKQorICAgICAgZXJyPVpJUF9FUlJOTzsKKyAgICBlbHNlCisgICAgICBudW1iZXJfZW50cnlfQ0QgPSB1TDsKKworICAgIGlmICgobnVtYmVyX2VudHJ5X0NEIT1udW1iZXJfZW50cnkpIHx8IChudW1iZXJfZGlza193aXRoX0NEIT0wKSB8fCAobnVtYmVyX2Rpc2shPTApKQorICAgICAgZXJyPVpJUF9CQURaSVBGSUxFOworCisgICAgLyogc2l6ZSBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8KKyAgICBzaXplX2NlbnRyYWxfZGlyID0gMDsKKyAgICBpZiAoemlwNjRsb2NhbF9nZXRMb25nKCZwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCAmdUwpIT1aSVBfT0spCisgICAgICBlcnI9WklQX0VSUk5POworICAgIGVsc2UKKyAgICAgIHNpemVfY2VudHJhbF9kaXIgPSB1TDsKKworICAgIC8qIG9mZnNldCBvZiBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeSB3aXRoIHJlc3BlY3QgdG8gdGhlIHN0YXJ0aW5nIGRpc2sgbnVtYmVyICovCisgICAgb2Zmc2V0X2NlbnRyYWxfZGlyID0gMDsKKyAgICBpZiAoemlwNjRsb2NhbF9nZXRMb25nKCZwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCAmdUwpIT1aSVBfT0spCisgICAgICBlcnI9WklQX0VSUk5POworICAgIGVsc2UKKyAgICAgIG9mZnNldF9jZW50cmFsX2RpciA9IHVMOworCisKKyAgICAvKiB6aXBmaWxlIGdsb2JhbCBjb21tZW50IGxlbmd0aCAqLworICAgIGlmICh6aXA2NGxvY2FsX2dldFNob3J0KCZwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCAmc2l6ZV9jb21tZW50KSE9WklQX09LKQorICAgICAgZXJyPVpJUF9FUlJOTzsKKyAgfQorCisgIGlmICgoY2VudHJhbF9wb3M8b2Zmc2V0X2NlbnRyYWxfZGlyK3NpemVfY2VudHJhbF9kaXIpICYmCisgICAgKGVycj09WklQX09LKSkKKyAgICBlcnI9WklQX0JBRFpJUEZJTEU7CisKKyAgaWYgKGVyciE9WklQX09LKQorICB7CisgICAgWkNMT1NFNjQocHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSk7CisgICAgcmV0dXJuIFpJUF9FUlJOTzsKKyAgfQorCisgIGlmIChzaXplX2NvbW1lbnQ+MCkKKyAgeworICAgIHB6aWluaXQtPmdsb2JhbGNvbW1lbnQgPSAoY2hhciopQUxMT0Moc2l6ZV9jb21tZW50KzEpOworICAgIGlmIChwemlpbml0LT5nbG9iYWxjb21tZW50KQorICAgIHsKKyAgICAgIHNpemVfY29tbWVudCA9IFpSRUFENjQocHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSwgcHppaW5pdC0+Z2xvYmFsY29tbWVudCxzaXplX2NvbW1lbnQpOworICAgICAgcHppaW5pdC0+Z2xvYmFsY29tbWVudFtzaXplX2NvbW1lbnRdPTA7CisgICAgfQorICB9CisKKyAgYnl0ZV9iZWZvcmVfdGhlX3ppcGZpbGUgPSBjZW50cmFsX3BvcyAtIChvZmZzZXRfY2VudHJhbF9kaXIrc2l6ZV9jZW50cmFsX2Rpcik7CisgIHB6aWluaXQtPmFkZF9wb3NpdGlvbl93aGVuX3dyaXR0aW5nX29mZnNldCA9IGJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlOworCisgIHsKKyAgICBaUE9TNjRfVCBzaXplX2NlbnRyYWxfZGlyX3RvX3JlYWQgPSBzaXplX2NlbnRyYWxfZGlyOworICAgIHNpemVfdCBidWZfc2l6ZSA9IFNJWkVEQVRBX0lOREFUQUJMT0NLOworICAgIHZvaWQqIGJ1Zl9yZWFkID0gKHZvaWQqKUFMTE9DKGJ1Zl9zaXplKTsKKyAgICBpZiAoWlNFRUs2NChwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCBvZmZzZXRfY2VudHJhbF9kaXIgKyBieXRlX2JlZm9yZV90aGVfemlwZmlsZSwgWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkgIT0gMCkKKyAgICAgIGVycj1aSVBfRVJSTk87CisKKyAgICB3aGlsZSAoKHNpemVfY2VudHJhbF9kaXJfdG9fcmVhZD4wKSAmJiAoZXJyPT1aSVBfT0spKQorICAgIHsKKyAgICAgIFpQT1M2NF9UIHJlYWRfdGhpcyA9IFNJWkVEQVRBX0lOREFUQUJMT0NLOworICAgICAgaWYgKHJlYWRfdGhpcyA+IHNpemVfY2VudHJhbF9kaXJfdG9fcmVhZCkKKyAgICAgICAgcmVhZF90aGlzID0gc2l6ZV9jZW50cmFsX2Rpcl90b19yZWFkOworCisgICAgICBpZiAoWlJFQUQ2NChwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLGJ1Zl9yZWFkLCh1TG9uZylyZWFkX3RoaXMpICE9IHJlYWRfdGhpcykKKyAgICAgICAgZXJyPVpJUF9FUlJOTzsKKworICAgICAgaWYgKGVycj09WklQX09LKQorICAgICAgICBlcnIgPSBhZGRfZGF0YV9pbl9kYXRhYmxvY2soJnB6aWluaXQtPmNlbnRyYWxfZGlyLGJ1Zl9yZWFkLCAodUxvbmcpcmVhZF90aGlzKTsKKworICAgICAgc2l6ZV9jZW50cmFsX2Rpcl90b19yZWFkLT1yZWFkX3RoaXM7CisgICAgfQorICAgIFRSWUZSRUUoYnVmX3JlYWQpOworICB9CisgIHB6aWluaXQtPmJlZ2luX3BvcyA9IGJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlOworICBwemlpbml0LT5udW1iZXJfZW50cnkgPSBudW1iZXJfZW50cnlfQ0Q7CisKKyAgaWYgKFpTRUVLNjQocHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSwgb2Zmc2V0X2NlbnRyYWxfZGlyK2J5dGVfYmVmb3JlX3RoZV96aXBmaWxlLFpMSUJfRklMRUZVTkNfU0VFS19TRVQpICE9IDApCisgICAgZXJyPVpJUF9FUlJOTzsKKworICByZXR1cm4gZXJyOworfQorCisKKyNlbmRpZiAvKiAhTk9fQURERklMRUlORVhJU1RJTkdaSVAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gemlwRmlsZSBaRVhQT1JUIHppcE9wZW4zIChjb25zdCB2b2lkICpwYXRobmFtZSwgaW50IGFwcGVuZCwgemlwY2hhcnBjKiBnbG9iYWxjb21tZW50LCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuYzY0XzMyX2RlZikKK3sKKyAgICB6aXA2NF9pbnRlcm5hbCB6aWluaXQ7CisgICAgemlwNjRfaW50ZXJuYWwqIHppOworICAgIGludCBlcnI9WklQX09LOworCisgICAgemlpbml0LnpfZmlsZWZ1bmMuenNlZWszMl9maWxlID0gTlVMTDsKKyAgICB6aWluaXQuel9maWxlZnVuYy56dGVsbDMyX2ZpbGUgPSBOVUxMOworICAgIGlmIChwemxpYl9maWxlZnVuYzY0XzMyX2RlZj09TlVMTCkKKyAgICAgICAgZmlsbF9mb3BlbjY0X2ZpbGVmdW5jKCZ6aWluaXQuel9maWxlZnVuYy56ZmlsZV9mdW5jNjQpOworICAgIGVsc2UKKyAgICAgICAgemlpbml0LnpfZmlsZWZ1bmMgPSAqcHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWY7CisKKyAgICB6aWluaXQuZmlsZXN0cmVhbSA9IFpPUEVONjQoemlpbml0LnpfZmlsZWZ1bmMsCisgICAgICAgICAgICAgICAgICBwYXRobmFtZSwKKyAgICAgICAgICAgICAgICAgIChhcHBlbmQgPT0gQVBQRU5EX1NUQVRVU19DUkVBVEUpID8KKyAgICAgICAgICAgICAgICAgIChaTElCX0ZJTEVGVU5DX01PREVfUkVBRCB8IFpMSUJfRklMRUZVTkNfTU9ERV9XUklURSB8IFpMSUJfRklMRUZVTkNfTU9ERV9DUkVBVEUpIDoKKyAgICAgICAgICAgICAgICAgICAgKFpMSUJfRklMRUZVTkNfTU9ERV9SRUFEIHwgWkxJQl9GSUxFRlVOQ19NT0RFX1dSSVRFIHwgWkxJQl9GSUxFRlVOQ19NT0RFX0VYSVNUSU5HKSk7CisKKyAgICBpZiAoemlpbml0LmZpbGVzdHJlYW0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoYXBwZW5kID09IEFQUEVORF9TVEFUVVNfQ1JFQVRFQUZURVIpCisgICAgICAgIFpTRUVLNjQoemlpbml0LnpfZmlsZWZ1bmMsemlpbml0LmZpbGVzdHJlYW0sMCxTRUVLX0VORCk7CisKKyAgICB6aWluaXQuYmVnaW5fcG9zID0gWlRFTEw2NCh6aWluaXQuel9maWxlZnVuYyx6aWluaXQuZmlsZXN0cmVhbSk7CisgICAgemlpbml0LmluX29wZW5lZF9maWxlX2luemlwID0gMDsKKyAgICB6aWluaXQuY2kuc3RyZWFtX2luaXRpYWxpc2VkID0gMDsKKyAgICB6aWluaXQubnVtYmVyX2VudHJ5ID0gMDsKKyAgICB6aWluaXQuYWRkX3Bvc2l0aW9uX3doZW5fd3JpdHRpbmdfb2Zmc2V0ID0gMDsKKyAgICBpbml0X2xpbmtlZGxpc3QoJih6aWluaXQuY2VudHJhbF9kaXIpKTsKKworCisKKyAgICB6aSA9ICh6aXA2NF9pbnRlcm5hbCopQUxMT0Moc2l6ZW9mKHppcDY0X2ludGVybmFsKSk7CisgICAgaWYgKHppPT1OVUxMKQorICAgIHsKKyAgICAgICAgWkNMT1NFNjQoemlpbml0LnpfZmlsZWZ1bmMsemlpbml0LmZpbGVzdHJlYW0pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBub3cgd2UgYWRkIGZpbGUgaW4gYSB6aXBmaWxlICovCisjICAgIGlmbmRlZiBOT19BRERGSUxFSU5FWElTVElOR1pJUAorICAgIHppaW5pdC5nbG9iYWxjb21tZW50ID0gTlVMTDsKKyAgICBpZiAoYXBwZW5kID09IEFQUEVORF9TVEFUVVNfQURESU5aSVApCisgICAgeworICAgICAgLy8gUmVhZCBhbmQgQ2FjaGUgQ2VudHJhbCBEaXJlY3RvcnkgUmVjb3JkcworICAgICAgZXJyID0gTG9hZENlbnRyYWxEaXJlY3RvcnlSZWNvcmQoJnppaW5pdCk7CisgICAgfQorCisgICAgaWYgKGdsb2JhbGNvbW1lbnQpCisgICAgeworICAgICAgKmdsb2JhbGNvbW1lbnQgPSB6aWluaXQuZ2xvYmFsY29tbWVudDsKKyAgICB9CisjICAgIGVuZGlmIC8qICFOT19BRERGSUxFSU5FWElTVElOR1pJUCovCisKKyAgICBpZiAoZXJyICE9IFpJUF9PSykKKyAgICB7CisjICAgIGlmbmRlZiBOT19BRERGSUxFSU5FWElTVElOR1pJUAorICAgICAgICBUUllGUkVFKHppaW5pdC5nbG9iYWxjb21tZW50KTsKKyMgICAgZW5kaWYgLyogIU5PX0FEREZJTEVJTkVYSVNUSU5HWklQKi8KKyAgICAgICAgVFJZRlJFRSh6aSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqemkgPSB6aWluaXQ7CisgICAgICAgIHJldHVybiAoemlwRmlsZSl6aTsKKyAgICB9Cit9CisKK2V4dGVybiB6aXBGaWxlIFpFWFBPUlQgemlwT3BlbjIgKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgYXBwZW5kLCB6aXBjaGFycGMqIGdsb2JhbGNvbW1lbnQsIHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuYzMyX2RlZikKK3sKKyAgICBpZiAocHpsaWJfZmlsZWZ1bmMzMl9kZWYgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYgemxpYl9maWxlZnVuYzY0XzMyX2RlZl9maWxsOworICAgICAgICBmaWxsX3psaWJfZmlsZWZ1bmM2NF8zMl9kZWZfZnJvbV9maWxlZnVuYzMyKCZ6bGliX2ZpbGVmdW5jNjRfMzJfZGVmX2ZpbGwscHpsaWJfZmlsZWZ1bmMzMl9kZWYpOworICAgICAgICByZXR1cm4gemlwT3BlbjMocGF0aG5hbWUsIGFwcGVuZCwgZ2xvYmFsY29tbWVudCwgJnpsaWJfZmlsZWZ1bmM2NF8zMl9kZWZfZmlsbCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHppcE9wZW4zKHBhdGhuYW1lLCBhcHBlbmQsIGdsb2JhbGNvbW1lbnQsIE5VTEwpOworfQorCitleHRlcm4gemlwRmlsZSBaRVhQT1JUIHppcE9wZW4yXzY0IChjb25zdCB2b2lkICpwYXRobmFtZSwgaW50IGFwcGVuZCwgemlwY2hhcnBjKiBnbG9iYWxjb21tZW50LCB6bGliX2ZpbGVmdW5jNjRfZGVmKiBwemxpYl9maWxlZnVuY19kZWYpCit7CisgICAgaWYgKHB6bGliX2ZpbGVmdW5jX2RlZiAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgemxpYl9maWxlZnVuYzY0XzMyX2RlZiB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmX2ZpbGw7CisgICAgICAgIHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWZfZmlsbC56ZmlsZV9mdW5jNjQgPSAqcHpsaWJfZmlsZWZ1bmNfZGVmOworICAgICAgICB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmX2ZpbGwuenRlbGwzMl9maWxlID0gTlVMTDsKKyAgICAgICAgemxpYl9maWxlZnVuYzY0XzMyX2RlZl9maWxsLnpzZWVrMzJfZmlsZSA9IE5VTEw7CisgICAgICAgIHJldHVybiB6aXBPcGVuMyhwYXRobmFtZSwgYXBwZW5kLCBnbG9iYWxjb21tZW50LCAmemxpYl9maWxlZnVuYzY0XzMyX2RlZl9maWxsKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gemlwT3BlbjMocGF0aG5hbWUsIGFwcGVuZCwgZ2xvYmFsY29tbWVudCwgTlVMTCk7Cit9CisKKworCitleHRlcm4gemlwRmlsZSBaRVhQT1JUIHppcE9wZW4gKGNvbnN0IGNoYXIqIHBhdGhuYW1lLCBpbnQgYXBwZW5kKQoreworICAgIHJldHVybiB6aXBPcGVuMygoY29uc3Qgdm9pZCopcGF0aG5hbWUsYXBwZW5kLE5VTEwsTlVMTCk7Cit9CisKK2V4dGVybiB6aXBGaWxlIFpFWFBPUlQgemlwT3BlbjY0IChjb25zdCB2b2lkKiBwYXRobmFtZSwgaW50IGFwcGVuZCkKK3sKKyAgICByZXR1cm4gemlwT3BlbjMocGF0aG5hbWUsYXBwZW5kLE5VTEwsTlVMTCk7Cit9CisKK2ludCBXcml0ZV9Mb2NhbEZpbGVIZWFkZXIoemlwNjRfaW50ZXJuYWwqIHppLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfbG9jYWwpCit7CisgIC8qIHdyaXRlIHRoZSBsb2NhbCBoZWFkZXIgKi8KKyAgaW50IGVycjsKKyAgdUludCBzaXplX2ZpbGVuYW1lID0gKHVJbnQpc3RybGVuKGZpbGVuYW1lKTsKKyAgdUludCBzaXplX2V4dHJhZmllbGQgPSBzaXplX2V4dHJhZmllbGRfbG9jYWw7CisKKyAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKUxPQ0FMSEVBREVSTUFHSUMsIDQpOworCisgIGlmIChlcnI9PVpJUF9PSykKKyAgeworICAgIGlmKHppLT5jaS56aXA2NCkKKyAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZyk0NSwyKTsvKiB2ZXJzaW9uIG5lZWRlZCB0byBleHRyYWN0ICovCisgICAgZWxzZQorICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKTIwLDIpOy8qIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgKi8KKyAgfQorCisgIGlmIChlcnI9PVpJUF9PSykKKyAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpemktPmNpLmZsYWcsMik7CisKKyAgaWYgKGVycj09WklQX09LKQorICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZyl6aS0+Y2kubWV0aG9kLDIpOworCisgIGlmIChlcnI9PVpJUF9PSykKKyAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpemktPmNpLmRvc0RhdGUsNCk7CisKKyAgLy8gQ1JDIC8gQ29tcHJlc3NlZCBzaXplIC8gVW5jb21wcmVzc2VkIHNpemUgd2lsbCBiZSBmaWxsZWQgaW4gbGF0ZXIgYW5kIHJld3JpdHRlbiBsYXRlcgorICBpZiAoZXJyPT1aSVBfT0spCisgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKTAsNCk7IC8qIGNyYyAzMiwgdW5rbm93biAqLworICBpZiAoZXJyPT1aSVBfT0spCisgIHsKKyAgICBpZih6aS0+Y2kuemlwNjQpCisgICAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpMHhGRkZGRkZGRiw0KTsgLyogY29tcHJlc3NlZCBzaXplLCB1bmtub3duICovCisgICAgZWxzZQorICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKTAsNCk7IC8qIGNvbXByZXNzZWQgc2l6ZSwgdW5rbm93biAqLworICB9CisgIGlmIChlcnI9PVpJUF9PSykKKyAgeworICAgIGlmKHppLT5jaS56aXA2NCkKKyAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykweEZGRkZGRkZGLDQpOyAvKiB1bmNvbXByZXNzZWQgc2l6ZSwgdW5rbm93biAqLworICAgIGVsc2UKKyAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykwLDQpOyAvKiB1bmNvbXByZXNzZWQgc2l6ZSwgdW5rbm93biAqLworICB9CisKKyAgaWYgKGVycj09WklQX09LKQorICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZylzaXplX2ZpbGVuYW1lLDIpOworCisgIGlmKHppLT5jaS56aXA2NCkKKyAgeworICAgIHNpemVfZXh0cmFmaWVsZCArPSAyMDsKKyAgfQorCisgIGlmIChlcnI9PVpJUF9PSykKKyAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpc2l6ZV9leHRyYWZpZWxkLDIpOworCisgIGlmICgoZXJyPT1aSVBfT0spICYmIChzaXplX2ZpbGVuYW1lID4gMCkpCisgIHsKKyAgICBpZiAoWldSSVRFNjQoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sZmlsZW5hbWUsc2l6ZV9maWxlbmFtZSkhPXNpemVfZmlsZW5hbWUpCisgICAgICBlcnIgPSBaSVBfRVJSTk87CisgIH0KKworICBpZiAoKGVycj09WklQX09LKSAmJiAoc2l6ZV9leHRyYWZpZWxkX2xvY2FsID4gMCkpCisgIHsKKyAgICBpZiAoWldSSVRFNjQoemktPnpfZmlsZWZ1bmMsIHppLT5maWxlc3RyZWFtLCBleHRyYWZpZWxkX2xvY2FsLCBzaXplX2V4dHJhZmllbGRfbG9jYWwpICE9IHNpemVfZXh0cmFmaWVsZF9sb2NhbCkKKyAgICAgIGVyciA9IFpJUF9FUlJOTzsKKyAgfQorCisKKyAgaWYgKChlcnI9PVpJUF9PSykgJiYgKHppLT5jaS56aXA2NCkpCisgIHsKKyAgICAgIC8vIHdyaXRlIHRoZSBaaXA2NCBleHRlbmRlZCBpbmZvCisgICAgICBzaG9ydCBIZWFkZXJJRCA9IDE7CisgICAgICBzaG9ydCBEYXRhU2l6ZSA9IDE2OworICAgICAgWlBPUzY0X1QgQ29tcHJlc3NlZFNpemUgPSAwOworICAgICAgWlBPUzY0X1QgVW5jb21wcmVzc2VkU2l6ZSA9IDA7CisKKyAgICAgIC8vIFJlbWVtYmVyIHBvc2l0aW9uIG9mIFppcDY0IGV4dGVuZGVkIGluZm8gZm9yIHRoZSBsb2NhbCBmaWxlIGhlYWRlci4gKG5lZWRlZCB3aGVuIHdlIHVwZGF0ZSBzaXplIGFmdGVyIGRvbmUgd2l0aCBmaWxlKQorICAgICAgemktPmNpLnBvc196aXA2NGV4dHJhaW5mbyA9IFpURUxMNjQoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0pOworCisgICAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYywgemktPmZpbGVzdHJlYW0sIChzaG9ydClIZWFkZXJJRCwyKTsKKyAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLCB6aS0+ZmlsZXN0cmVhbSwgKHNob3J0KURhdGFTaXplLDIpOworCisgICAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYywgemktPmZpbGVzdHJlYW0sIChaUE9TNjRfVClVbmNvbXByZXNzZWRTaXplLDgpOworICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsIHppLT5maWxlc3RyZWFtLCAoWlBPUzY0X1QpQ29tcHJlc3NlZFNpemUsOCk7CisgIH0KKworICByZXR1cm4gZXJyOworfQorCisvKgorIE5PVEUuCisgV2hlbiB3cml0aW5nIFJBVyB0aGUgWklQNjQgZXh0ZW5kZWQgaW5mb3JtYXRpb24gaW4gZXh0cmFmaWVsZF9sb2NhbCBhbmQgZXh0cmFmaWVsZF9nbG9iYWwgbmVlZHMgdG8gYmUgc3RyaXBwZWQKKyBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGl0IGNhbiBiZSBkb25lIHdpdGggemlwUmVtb3ZlRXh0cmFJbmZvQmxvY2sKKworIEl0IGlzIG5vdCBkb25lIGhlcmUgYmVjYXVzZSB0aGVuIHdlIG5lZWQgdG8gcmVhbGxvYyBhIG5ldyBidWZmZXIgc2luY2UgcGFyYW1ldGVycyBhcmUgJ2NvbnN0JyBhbmQgSSB3YW50IHRvIG1pbmltaXplCisgdW5uZWNlc3NhcnkgYWxsb2NhdGlvbnMuCisgKi8KK2V4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwNF82NCAoemlwRmlsZSBmaWxlLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfZ2xvYmFsLCB1SW50IHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQsIGludCBtZXRob2QsIGludCBsZXZlbCwgaW50IHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbmRvd0JpdHMsaW50IG1lbUxldmVsLCBpbnQgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkLCB1TG9uZyBjcmNGb3JDcnlwdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgdmVyc2lvbk1hZGVCeSwgdUxvbmcgZmxhZ0Jhc2UsIGludCB6aXA2NCkKK3sKKyAgICB6aXA2NF9pbnRlcm5hbCogemk7CisgICAgdUludCBzaXplX2ZpbGVuYW1lOworICAgIHVJbnQgc2l6ZV9jb21tZW50OworICAgIHVJbnQgaTsKKyAgICBpbnQgZXJyID0gWklQX09LOworCisjICAgIGlmZGVmIE5PQ1JZUFQKKyAgICAoY3JjRm9yQ3J5cHRpbmcpOworICAgIGlmIChwYXNzd29yZCAhPSBOVUxMKQorICAgICAgICByZXR1cm4gWklQX1BBUkFNRVJST1I7CisjICAgIGVuZGlmCisKKyAgICBpZiAoZmlsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gWklQX1BBUkFNRVJST1I7CisKKyNpZmRlZiBIQVZFX0JaSVAyCisgICAgaWYgKChtZXRob2QhPTApICYmIChtZXRob2QhPVpfREVGTEFURUQpICYmIChtZXRob2QhPVpfQlpJUDJFRCkpCisgICAgICByZXR1cm4gWklQX1BBUkFNRVJST1I7CisjZWxzZQorICAgIGlmICgobWV0aG9kIT0wKSAmJiAobWV0aG9kIT1aX0RFRkxBVEVEKSkKKyAgICAgIHJldHVybiBaSVBfUEFSQU1FUlJPUjsKKyNlbmRpZgorCisgICAgemkgPSAoemlwNjRfaW50ZXJuYWwqKWZpbGU7CisKKyAgICBpZiAoemktPmluX29wZW5lZF9maWxlX2luemlwID09IDEpCisgICAgeworICAgICAgICBlcnIgPSB6aXBDbG9zZUZpbGVJblppcCAoZmlsZSk7CisgICAgICAgIGlmIChlcnIgIT0gWklQX09LKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoZmlsZW5hbWU9PU5VTEwpCisgICAgICAgIGZpbGVuYW1lPSItIjsKKworICAgIGlmIChjb21tZW50PT1OVUxMKQorICAgICAgICBzaXplX2NvbW1lbnQgPSAwOworICAgIGVsc2UKKyAgICAgICAgc2l6ZV9jb21tZW50ID0gKHVJbnQpc3RybGVuKGNvbW1lbnQpOworCisgICAgc2l6ZV9maWxlbmFtZSA9ICh1SW50KXN0cmxlbihmaWxlbmFtZSk7CisKKyAgICBpZiAoemlwZmkgPT0gTlVMTCkKKyAgICAgICAgemktPmNpLmRvc0RhdGUgPSAwOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICh6aXBmaS0+ZG9zRGF0ZSAhPSAwKQorICAgICAgICAgICAgemktPmNpLmRvc0RhdGUgPSB6aXBmaS0+ZG9zRGF0ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHppLT5jaS5kb3NEYXRlID0gemlwNjRsb2NhbF9UbXpEYXRlVG9Eb3NEYXRlKCZ6aXBmaS0+dG16X2RhdGUpOworICAgIH0KKworICAgIHppLT5jaS5mbGFnID0gZmxhZ0Jhc2U7CisgICAgaWYgKChsZXZlbD09OCkgfHwgKGxldmVsPT05KSkKKyAgICAgIHppLT5jaS5mbGFnIHw9IDI7CisgICAgaWYgKGxldmVsPT0yKQorICAgICAgemktPmNpLmZsYWcgfD0gNDsKKyAgICBpZiAobGV2ZWw9PTEpCisgICAgICB6aS0+Y2kuZmxhZyB8PSA2OworICAgIGlmIChwYXNzd29yZCAhPSBOVUxMKQorICAgICAgemktPmNpLmZsYWcgfD0gMTsKKworICAgIHppLT5jaS5jcmMzMiA9IDA7CisgICAgemktPmNpLm1ldGhvZCA9IG1ldGhvZDsKKyAgICB6aS0+Y2kuZW5jcnlwdCA9IDA7CisgICAgemktPmNpLnN0cmVhbV9pbml0aWFsaXNlZCA9IDA7CisgICAgemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhID0gMDsKKyAgICB6aS0+Y2kucmF3ID0gcmF3OworICAgIHppLT5jaS5wb3NfbG9jYWxfaGVhZGVyID0gWlRFTEw2NCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSk7CisKKyAgICB6aS0+Y2kuc2l6ZV9jZW50cmFsaGVhZGVyID0gU0laRUNFTlRSQUxIRUFERVIgKyBzaXplX2ZpbGVuYW1lICsgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCArIHNpemVfY29tbWVudDsKKyAgICB6aS0+Y2kuc2l6ZV9jZW50cmFsRXh0cmFGcmVlID0gMzI7IC8vIEV4dHJhIHNwYWNlIHdlIGhhdmUgcmVzZXJ2ZWQgaW4gY2FzZSB3ZSBuZWVkIHRvIGFkZCBaSVA2NCBleHRyYSBpbmZvIGRhdGEKKworICAgIHppLT5jaS5jZW50cmFsX2hlYWRlciA9IChjaGFyKilBTExPQygodUludCl6aS0+Y2kuc2l6ZV9jZW50cmFsaGVhZGVyICsgemktPmNpLnNpemVfY2VudHJhbEV4dHJhRnJlZSk7CisKKyAgICB6aS0+Y2kuc2l6ZV9jZW50cmFsRXh0cmEgPSBzaXplX2V4dHJhZmllbGRfZ2xvYmFsOworICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyLCh1TG9uZylDRU5UUkFMSEVBREVSTUFHSUMsNCk7CisgICAgLyogdmVyc2lvbiBpbmZvICovCisgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrNCwodUxvbmcpdmVyc2lvbk1hZGVCeSwyKTsKKyAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcis2LCh1TG9uZykyMCwyKTsKKyAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcis4LCh1TG9uZyl6aS0+Y2kuZmxhZywyKTsKKyAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisxMCwodUxvbmcpemktPmNpLm1ldGhvZCwyKTsKKyAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisxMiwodUxvbmcpemktPmNpLmRvc0RhdGUsNCk7CisgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMTYsKHVMb25nKTAsNCk7IC8qY3JjKi8KKyAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisyMCwodUxvbmcpMCw0KTsgLypjb21wciBzaXplKi8KKyAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisyNCwodUxvbmcpMCw0KTsgLyp1bmNvbXByIHNpemUqLworICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzI4LCh1TG9uZylzaXplX2ZpbGVuYW1lLDIpOworICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzMwLCh1TG9uZylzaXplX2V4dHJhZmllbGRfZ2xvYmFsLDIpOworICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzMyLCh1TG9uZylzaXplX2NvbW1lbnQsMik7CisgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMzQsKHVMb25nKTAsMik7IC8qZGlzayBubSBzdGFydCovCisKKyAgICBpZiAoemlwZmk9PU5VTEwpCisgICAgICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzM2LCh1TG9uZykwLDIpOworICAgIGVsc2UKKyAgICAgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMzYsKHVMb25nKXppcGZpLT5pbnRlcm5hbF9mYSwyKTsKKworICAgIGlmICh6aXBmaT09TlVMTCkKKyAgICAgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMzgsKHVMb25nKTAsNCk7CisgICAgZWxzZQorICAgICAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlciszOCwodUxvbmcpemlwZmktPmV4dGVybmFsX2ZhLDQpOworCisgICAgaWYoemktPmNpLnBvc19sb2NhbF9oZWFkZXIgPj0gMHhmZmZmZmZmZikKKyAgICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzQyLCh1TG9uZykweGZmZmZmZmZmLDQpOworICAgIGVsc2UKKyAgICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzQyLCh1TG9uZyl6aS0+Y2kucG9zX2xvY2FsX2hlYWRlciAtIHppLT5hZGRfcG9zaXRpb25fd2hlbl93cml0dGluZ19vZmZzZXQsNCk7CisKKyAgICBmb3IgKGk9MDtpPHNpemVfZmlsZW5hbWU7aSsrKQorICAgICAgICAqKHppLT5jaS5jZW50cmFsX2hlYWRlcitTSVpFQ0VOVFJBTEhFQURFUitpKSA9ICooZmlsZW5hbWUraSk7CisKKyAgICBmb3IgKGk9MDtpPHNpemVfZXh0cmFmaWVsZF9nbG9iYWw7aSsrKQorICAgICAgICAqKHppLT5jaS5jZW50cmFsX2hlYWRlcitTSVpFQ0VOVFJBTEhFQURFUitzaXplX2ZpbGVuYW1lK2kpID0KKyAgICAgICAgICAgICAgKigoKGNvbnN0IGNoYXIqKWV4dHJhZmllbGRfZ2xvYmFsKStpKTsKKworICAgIGZvciAoaT0wO2k8c2l6ZV9jb21tZW50O2krKykKKyAgICAgICAgKih6aS0+Y2kuY2VudHJhbF9oZWFkZXIrU0laRUNFTlRSQUxIRUFERVIrc2l6ZV9maWxlbmFtZSsKKyAgICAgICAgICAgICAgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCtpKSA9ICooY29tbWVudCtpKTsKKyAgICBpZiAoemktPmNpLmNlbnRyYWxfaGVhZGVyID09IE5VTEwpCisgICAgICAgIHJldHVybiBaSVBfSU5URVJOQUxFUlJPUjsKKworICAgIHppLT5jaS56aXA2NCA9IHppcDY0OworICAgIHppLT5jaS50b3RhbENvbXByZXNzZWREYXRhID0gMDsKKyAgICB6aS0+Y2kudG90YWxVbmNvbXByZXNzZWREYXRhID0gMDsKKyAgICB6aS0+Y2kucG9zX3ppcDY0ZXh0cmFpbmZvID0gMDsKKworICAgIGVyciA9IFdyaXRlX0xvY2FsRmlsZUhlYWRlcih6aSwgZmlsZW5hbWUsIHNpemVfZXh0cmFmaWVsZF9sb2NhbCwgZXh0cmFmaWVsZF9sb2NhbCk7CisKKyNpZmRlZiBIQVZFX0JaSVAyCisgICAgemktPmNpLmJzdHJlYW0uYXZhaWxfaW4gPSAodUludCkwOworICAgIHppLT5jaS5ic3RyZWFtLmF2YWlsX291dCA9ICh1SW50KVpfQlVGU0laRTsKKyAgICB6aS0+Y2kuYnN0cmVhbS5uZXh0X291dCA9IChjaGFyKil6aS0+Y2kuYnVmZmVyZWRfZGF0YTsKKyAgICB6aS0+Y2kuYnN0cmVhbS50b3RhbF9pbl9oaTMyID0gMDsKKyAgICB6aS0+Y2kuYnN0cmVhbS50b3RhbF9pbl9sbzMyID0gMDsKKyAgICB6aS0+Y2kuYnN0cmVhbS50b3RhbF9vdXRfaGkzMiA9IDA7CisgICAgemktPmNpLmJzdHJlYW0udG90YWxfb3V0X2xvMzIgPSAwOworI2VuZGlmCisKKyAgICB6aS0+Y2kuc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpMDsKKyAgICB6aS0+Y2kuc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KVpfQlVGU0laRTsKKyAgICB6aS0+Y2kuc3RyZWFtLm5leHRfb3V0ID0gemktPmNpLmJ1ZmZlcmVkX2RhdGE7CisgICAgemktPmNpLnN0cmVhbS50b3RhbF9pbiA9IDA7CisgICAgemktPmNpLnN0cmVhbS50b3RhbF9vdXQgPSAwOworICAgIHppLT5jaS5zdHJlYW0uZGF0YV90eXBlID0gWl9CSU5BUlk7CisKKyNpZmRlZiBIQVZFX0JaSVAyCisgICAgaWYgKChlcnI9PVpJUF9PSykgJiYgKHppLT5jaS5tZXRob2QgPT0gWl9ERUZMQVRFRCB8fCB6aS0+Y2kubWV0aG9kID09IFpfQlpJUDJFRCkgJiYgKCF6aS0+Y2kucmF3KSkKKyNlbHNlCisgICAgaWYgKChlcnI9PVpJUF9PSykgJiYgKHppLT5jaS5tZXRob2QgPT0gWl9ERUZMQVRFRCkgJiYgKCF6aS0+Y2kucmF3KSkKKyNlbmRpZgorICAgIHsKKyAgICAgICAgaWYoemktPmNpLm1ldGhvZCA9PSBaX0RFRkxBVEVEKQorICAgICAgICB7CisgICAgICAgICAgemktPmNpLnN0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOworICAgICAgICAgIHppLT5jaS5zdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CisgICAgICAgICAgemktPmNpLnN0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisKKyAgICAgICAgICBpZiAod2luZG93Qml0cz4wKQorICAgICAgICAgICAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7CisKKyAgICAgICAgICBlcnIgPSBkZWZsYXRlSW5pdDIoJnppLT5jaS5zdHJlYW0sIGxldmVsLCBaX0RFRkxBVEVELCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3kpOworCisgICAgICAgICAgaWYgKGVycj09Wl9PSykKKyAgICAgICAgICAgICAgemktPmNpLnN0cmVhbV9pbml0aWFsaXNlZCA9IFpfREVGTEFURUQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZih6aS0+Y2kubWV0aG9kID09IFpfQlpJUDJFRCkKKyAgICAgICAgeworI2lmZGVmIEhBVkVfQlpJUDIKKyAgICAgICAgICAgIC8vIEluaXQgQlppcCBzdHVmZiBoZXJlCisgICAgICAgICAgemktPmNpLmJzdHJlYW0uYnphbGxvYyA9IDA7CisgICAgICAgICAgemktPmNpLmJzdHJlYW0uYnpmcmVlID0gMDsKKyAgICAgICAgICB6aS0+Y2kuYnN0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisKKyAgICAgICAgICBlcnIgPSBCWjJfYnpDb21wcmVzc0luaXQoJnppLT5jaS5ic3RyZWFtLCBsZXZlbCwgMCwzNSk7CisgICAgICAgICAgaWYoZXJyID09IEJaX09LKQorICAgICAgICAgICAgemktPmNpLnN0cmVhbV9pbml0aWFsaXNlZCA9IFpfQlpJUDJFRDsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICB9CisKKyMgICAgaWZuZGVmIE5PQ1JZUFQKKyAgICB6aS0+Y2kuY3J5cHRfaGVhZGVyX3NpemUgPSAwOworICAgIGlmICgoZXJyPT1aX09LKSAmJiAocGFzc3dvcmQgIT0gTlVMTCkpCisgICAgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGJ1ZkhlYWRbUkFORF9IRUFEX0xFTl07CisgICAgICAgIHVuc2lnbmVkIGludCBzaXplSGVhZDsKKyAgICAgICAgemktPmNpLmVuY3J5cHQgPSAxOworICAgICAgICB6aS0+Y2kucGNyY18zMl90YWIgPSBnZXRfY3JjX3RhYmxlKCk7CisgICAgICAgIC8qaW5pdF9rZXlzKHBhc3N3b3JkLHppLT5jaS5rZXlzLHppLT5jaS5wY3JjXzMyX3RhYik7Ki8KKworICAgICAgICBzaXplSGVhZD1jcnlwdGhlYWQocGFzc3dvcmQsYnVmSGVhZCxSQU5EX0hFQURfTEVOLHppLT5jaS5rZXlzLHppLT5jaS5wY3JjXzMyX3RhYixjcmNGb3JDcnlwdGluZyk7CisgICAgICAgIHppLT5jaS5jcnlwdF9oZWFkZXJfc2l6ZSA9IHNpemVIZWFkOworCisgICAgICAgIGlmIChaV1JJVEU2NCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSxidWZIZWFkLHNpemVIZWFkKSAhPSBzaXplSGVhZCkKKyAgICAgICAgICAgICAgICBlcnIgPSBaSVBfRVJSTk87CisgICAgfQorIyAgICBlbmRpZgorCisgICAgaWYgKGVycj09Wl9PSykKKyAgICAgICAgemktPmluX29wZW5lZF9maWxlX2luemlwID0gMTsKKyAgICByZXR1cm4gZXJyOworfQorCitleHRlcm4gaW50IFpFWFBPUlQgemlwT3Blbk5ld0ZpbGVJblppcDQgKHppcEZpbGUgZmlsZSwgY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHppcF9maWxlaW5mbyogemlwZmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfbG9jYWwsIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2dsb2JhbCwgdUludCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21tZW50LCBpbnQgbWV0aG9kLCBpbnQgbGV2ZWwsIGludCByYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aW5kb3dCaXRzLGludCBtZW1MZXZlbCwgaW50IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXNzd29yZCwgdUxvbmcgY3JjRm9yQ3J5cHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIHZlcnNpb25NYWRlQnksIHVMb25nIGZsYWdCYXNlKQoreworICAgIHJldHVybiB6aXBPcGVuTmV3RmlsZUluWmlwNF82NCAoZmlsZSwgZmlsZW5hbWUsIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9nbG9iYWwsIHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LCBtZXRob2QsIGxldmVsLCByYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCwgY3JjRm9yQ3J5cHRpbmcsIHZlcnNpb25NYWRlQnksIGZsYWdCYXNlLCAwKTsKK30KKworZXh0ZXJuIGludCBaRVhQT1JUIHppcE9wZW5OZXdGaWxlSW5aaXAzICh6aXBGaWxlIGZpbGUsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLCB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWwsIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWVudCwgaW50IG1ldGhvZCwgaW50IGxldmVsLCBpbnQgcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93Qml0cyxpbnQgbWVtTGV2ZWwsIGludCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFzc3dvcmQsIHVMb25nIGNyY0ZvckNyeXB0aW5nKQoreworICAgIHJldHVybiB6aXBPcGVuTmV3RmlsZUluWmlwNF82NCAoZmlsZSwgZmlsZW5hbWUsIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9nbG9iYWwsIHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LCBtZXRob2QsIGxldmVsLCByYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCwgY3JjRm9yQ3J5cHRpbmcsIFZFUlNJT05NQURFQlksIDAsIDApOworfQorCitleHRlcm4gaW50IFpFWFBPUlQgemlwT3Blbk5ld0ZpbGVJblppcDNfNjQoemlwRmlsZSBmaWxlLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfZ2xvYmFsLCB1SW50IHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQsIGludCBtZXRob2QsIGludCBsZXZlbCwgaW50IHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbmRvd0JpdHMsaW50IG1lbUxldmVsLCBpbnQgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkLCB1TG9uZyBjcmNGb3JDcnlwdGluZywgaW50IHppcDY0KQoreworICAgIHJldHVybiB6aXBPcGVuTmV3RmlsZUluWmlwNF82NCAoZmlsZSwgZmlsZW5hbWUsIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9nbG9iYWwsIHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LCBtZXRob2QsIGxldmVsLCByYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCwgY3JjRm9yQ3J5cHRpbmcsIFZFUlNJT05NQURFQlksIDAsIHppcDY0KTsKK30KKworZXh0ZXJuIGludCBaRVhQT1JUIHppcE9wZW5OZXdGaWxlSW5aaXAyKHppcEZpbGUgZmlsZSwgY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHppcF9maWxlaW5mbyogemlwZmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWwsIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21tZW50LCBpbnQgbWV0aG9kLCBpbnQgbGV2ZWwsIGludCByYXcpCit7CisgICAgcmV0dXJuIHppcE9wZW5OZXdGaWxlSW5aaXA0XzY0IChmaWxlLCBmaWxlbmFtZSwgemlwZmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWZpZWxkX2xvY2FsLCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWZpZWxkX2dsb2JhbCwgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQsIG1ldGhvZCwgbGV2ZWwsIHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1NQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsIFpfREVGQVVMVF9TVFJBVEVHWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIFZFUlNJT05NQURFQlksIDAsIDApOworfQorCitleHRlcm4gaW50IFpFWFBPUlQgemlwT3Blbk5ld0ZpbGVJblppcDJfNjQoemlwRmlsZSBmaWxlLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLCB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2dsb2JhbCwgdUludCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQsIGludCBtZXRob2QsIGludCBsZXZlbCwgaW50IHJhdywgaW50IHppcDY0KQoreworICAgIHJldHVybiB6aXBPcGVuTmV3RmlsZUluWmlwNF82NCAoZmlsZSwgZmlsZW5hbWUsIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9nbG9iYWwsIHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LCBtZXRob2QsIGxldmVsLCByYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtTUFYX1dCSVRTLCBERUZfTUVNX0xFVkVMLCBaX0RFRkFVTFRfU1RSQVRFR1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBWRVJTSU9OTUFERUJZLCAwLCB6aXA2NCk7Cit9CisKK2V4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwNjQgKHppcEZpbGUgZmlsZSwgY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHppcF9maWxlaW5mbyogemlwZmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCpleHRyYWZpZWxkX2dsb2JhbCwgdUludCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQsIGludCBtZXRob2QsIGludCBsZXZlbCwgaW50IHppcDY0KQoreworICAgIHJldHVybiB6aXBPcGVuTmV3RmlsZUluWmlwNF82NCAoZmlsZSwgZmlsZW5hbWUsIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9nbG9iYWwsIHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LCBtZXRob2QsIGxldmVsLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLU1BWF9XQklUUywgREVGX01FTV9MRVZFTCwgWl9ERUZBVUxUX1NUUkFURUdZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgVkVSU0lPTk1BREVCWSwgMCwgemlwNjQpOworfQorCitleHRlcm4gaW50IFpFWFBPUlQgemlwT3Blbk5ld0ZpbGVJblppcCAoemlwRmlsZSBmaWxlLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLCB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKmV4dHJhZmllbGRfZ2xvYmFsLCB1SW50IHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWVudCwgaW50IG1ldGhvZCwgaW50IGxldmVsKQoreworICAgIHJldHVybiB6aXBPcGVuTmV3RmlsZUluWmlwNF82NCAoZmlsZSwgZmlsZW5hbWUsIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9nbG9iYWwsIHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LCBtZXRob2QsIGxldmVsLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLU1BWF9XQklUUywgREVGX01FTV9MRVZFTCwgWl9ERUZBVUxUX1NUUkFURUdZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgVkVSU0lPTk1BREVCWSwgMCwgMCk7Cit9CisKK2xvY2FsIGludCB6aXA2NEZsdXNoV3JpdGVCdWZmZXIoemlwNjRfaW50ZXJuYWwqIHppKQoreworICAgIGludCBlcnI9WklQX09LOworCisgICAgaWYgKHppLT5jaS5lbmNyeXB0ICE9IDApCisgICAgeworI2lmbmRlZiBOT0NSWVBUCisgICAgICAgIHVJbnQgaTsKKyAgICAgICAgaW50IHQ7CisgICAgICAgIGZvciAoaT0wO2k8emktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhO2krKykKKyAgICAgICAgICAgIHppLT5jaS5idWZmZXJlZF9kYXRhW2ldID0gemVuY29kZSh6aS0+Y2kua2V5cywgemktPmNpLnBjcmNfMzJfdGFiLCB6aS0+Y2kuYnVmZmVyZWRfZGF0YVtpXSx0KTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChaV1JJVEU2NCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSx6aS0+Y2kuYnVmZmVyZWRfZGF0YSx6aS0+Y2kucG9zX2luX2J1ZmZlcmVkX2RhdGEpICE9IHppLT5jaS5wb3NfaW5fYnVmZmVyZWRfZGF0YSkKKyAgICAgIGVyciA9IFpJUF9FUlJOTzsKKworICAgIHppLT5jaS50b3RhbENvbXByZXNzZWREYXRhICs9IHppLT5jaS5wb3NfaW5fYnVmZmVyZWRfZGF0YTsKKworI2lmZGVmIEhBVkVfQlpJUDIKKyAgICBpZih6aS0+Y2kubWV0aG9kID09IFpfQlpJUDJFRCkKKyAgICB7CisgICAgICB6aS0+Y2kudG90YWxVbmNvbXByZXNzZWREYXRhICs9IHppLT5jaS5ic3RyZWFtLnRvdGFsX2luX2xvMzI7CisgICAgICB6aS0+Y2kuYnN0cmVhbS50b3RhbF9pbl9sbzMyID0gMDsKKyAgICAgIHppLT5jaS5ic3RyZWFtLnRvdGFsX2luX2hpMzIgPSAwOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICB6aS0+Y2kudG90YWxVbmNvbXByZXNzZWREYXRhICs9IHppLT5jaS5zdHJlYW0udG90YWxfaW47CisgICAgICB6aS0+Y2kuc3RyZWFtLnRvdGFsX2luID0gMDsKKyAgICB9CisKKworICAgIHppLT5jaS5wb3NfaW5fYnVmZmVyZWRfZGF0YSA9IDA7CisKKyAgICByZXR1cm4gZXJyOworfQorCitleHRlcm4gaW50IFpFWFBPUlQgemlwV3JpdGVJbkZpbGVJblppcCAoemlwRmlsZSBmaWxlLGNvbnN0IHZvaWQqIGJ1Zix1bnNpZ25lZCBpbnQgbGVuKQoreworICAgIHppcDY0X2ludGVybmFsKiB6aTsKKyAgICBpbnQgZXJyPVpJUF9PSzsKKworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBaSVBfUEFSQU1FUlJPUjsKKyAgICB6aSA9ICh6aXA2NF9pbnRlcm5hbCopZmlsZTsKKworICAgIGlmICh6aS0+aW5fb3BlbmVkX2ZpbGVfaW56aXAgPT0gMCkKKyAgICAgICAgcmV0dXJuIFpJUF9QQVJBTUVSUk9SOworCisgICAgemktPmNpLmNyYzMyID0gY3JjMzIoemktPmNpLmNyYzMyLGJ1ZiwodUludClsZW4pOworCisjaWZkZWYgSEFWRV9CWklQMgorICAgIGlmKHppLT5jaS5tZXRob2QgPT0gWl9CWklQMkVEICYmICghemktPmNpLnJhdykpCisgICAgeworICAgICAgemktPmNpLmJzdHJlYW0ubmV4dF9pbiA9ICh2b2lkKilidWY7CisgICAgICB6aS0+Y2kuYnN0cmVhbS5hdmFpbF9pbiA9IGxlbjsKKyAgICAgIGVyciA9IEJaX1JVTl9PSzsKKworICAgICAgd2hpbGUgKChlcnI9PUJaX1JVTl9PSykgJiYgKHppLT5jaS5ic3RyZWFtLmF2YWlsX2luPjApKQorICAgICAgeworICAgICAgICBpZiAoemktPmNpLmJzdHJlYW0uYXZhaWxfb3V0ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoemlwNjRGbHVzaFdyaXRlQnVmZmVyKHppKSA9PSBaSVBfRVJSTk8pCisgICAgICAgICAgICBlcnIgPSBaSVBfRVJSTk87CisgICAgICAgICAgemktPmNpLmJzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpWl9CVUZTSVpFOworICAgICAgICAgIHppLT5jaS5ic3RyZWFtLm5leHRfb3V0ID0gKGNoYXIqKXppLT5jaS5idWZmZXJlZF9kYXRhOworICAgICAgICB9CisKKworICAgICAgICBpZihlcnIgIT0gQlpfUlVOX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmICgoemktPmNpLm1ldGhvZCA9PSBaX0JaSVAyRUQpICYmICghemktPmNpLnJhdykpCisgICAgICAgIHsKKyAgICAgICAgICB1TG9uZyB1VG90YWxPdXRCZWZvcmVfbG8gPSB6aS0+Y2kuYnN0cmVhbS50b3RhbF9vdXRfbG8zMjsKKy8vICAgICAgICAgIHVMb25nIHVUb3RhbE91dEJlZm9yZV9oaSA9IHppLT5jaS5ic3RyZWFtLnRvdGFsX291dF9oaTMyOworICAgICAgICAgIGVycj1CWjJfYnpDb21wcmVzcygmemktPmNpLmJzdHJlYW0sICBCWl9SVU4pOworCisgICAgICAgICAgemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhICs9ICh1SW50KSh6aS0+Y2kuYnN0cmVhbS50b3RhbF9vdXRfbG8zMiAtIHVUb3RhbE91dEJlZm9yZV9sbykgOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmKGVyciA9PSBCWl9SVU5fT0spCisgICAgICAgIGVyciA9IFpJUF9PSzsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgemktPmNpLnN0cmVhbS5uZXh0X2luID0gKEJ5dGVmKilidWY7CisgICAgICB6aS0+Y2kuc3RyZWFtLmF2YWlsX2luID0gbGVuOworCisgICAgICB3aGlsZSAoKGVycj09WklQX09LKSAmJiAoemktPmNpLnN0cmVhbS5hdmFpbF9pbj4wKSkKKyAgICAgIHsKKyAgICAgICAgICBpZiAoemktPmNpLnN0cmVhbS5hdmFpbF9vdXQgPT0gMCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICh6aXA2NEZsdXNoV3JpdGVCdWZmZXIoemkpID09IFpJUF9FUlJOTykKKyAgICAgICAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKKyAgICAgICAgICAgICAgemktPmNpLnN0cmVhbS5hdmFpbF9vdXQgPSAodUludClaX0JVRlNJWkU7CisgICAgICAgICAgICAgIHppLT5jaS5zdHJlYW0ubmV4dF9vdXQgPSB6aS0+Y2kuYnVmZmVyZWRfZGF0YTsKKyAgICAgICAgICB9CisKKworICAgICAgICAgIGlmKGVyciAhPSBaSVBfT0spCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgaWYgKCh6aS0+Y2kubWV0aG9kID09IFpfREVGTEFURUQpICYmICghemktPmNpLnJhdykpCisgICAgICAgICAgeworICAgICAgICAgICAgICB1TG9uZyB1VG90YWxPdXRCZWZvcmUgPSB6aS0+Y2kuc3RyZWFtLnRvdGFsX291dDsKKyAgICAgICAgICAgICAgZXJyPWRlZmxhdGUoJnppLT5jaS5zdHJlYW0sICBaX05PX0ZMVVNIKTsKKyAgICAgICAgICAgICAgaWYodVRvdGFsT3V0QmVmb3JlID4gemktPmNpLnN0cmVhbS50b3RhbF9vdXQpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYkJyZWFrID0gMDsKKyAgICAgICAgICAgICAgICBiQnJlYWsrKzsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHppLT5jaS5wb3NfaW5fYnVmZmVyZWRfZGF0YSArPSAodUludCkoemktPmNpLnN0cmVhbS50b3RhbF9vdXQgLSB1VG90YWxPdXRCZWZvcmUpIDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdUludCBjb3B5X3RoaXMsaTsKKyAgICAgICAgICAgICAgaWYgKHppLT5jaS5zdHJlYW0uYXZhaWxfaW4gPCB6aS0+Y2kuc3RyZWFtLmF2YWlsX291dCkKKyAgICAgICAgICAgICAgICAgIGNvcHlfdGhpcyA9IHppLT5jaS5zdHJlYW0uYXZhaWxfaW47CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGNvcHlfdGhpcyA9IHppLT5jaS5zdHJlYW0uYXZhaWxfb3V0OworCisgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3B5X3RoaXM7IGkrKykKKyAgICAgICAgICAgICAgICAgICooKChjaGFyKil6aS0+Y2kuc3RyZWFtLm5leHRfb3V0KStpKSA9CisgICAgICAgICAgICAgICAgICAgICAgKigoKGNvbnN0IGNoYXIqKXppLT5jaS5zdHJlYW0ubmV4dF9pbikraSk7CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHppLT5jaS5zdHJlYW0uYXZhaWxfaW4gLT0gY29weV90aGlzOworICAgICAgICAgICAgICAgICAgemktPmNpLnN0cmVhbS5hdmFpbF9vdXQtPSBjb3B5X3RoaXM7CisgICAgICAgICAgICAgICAgICB6aS0+Y2kuc3RyZWFtLm5leHRfaW4rPSBjb3B5X3RoaXM7CisgICAgICAgICAgICAgICAgICB6aS0+Y2kuc3RyZWFtLm5leHRfb3V0Kz0gY29weV90aGlzOworICAgICAgICAgICAgICAgICAgemktPmNpLnN0cmVhbS50b3RhbF9pbis9IGNvcHlfdGhpczsKKyAgICAgICAgICAgICAgICAgIHppLT5jaS5zdHJlYW0udG90YWxfb3V0Kz0gY29weV90aGlzOworICAgICAgICAgICAgICAgICAgemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhICs9IGNvcHlfdGhpczsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgIH0vLyB3aGlsZSguLi4pCisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworZXh0ZXJuIGludCBaRVhQT1JUIHppcENsb3NlRmlsZUluWmlwUmF3ICh6aXBGaWxlIGZpbGUsIHVMb25nIHVuY29tcHJlc3NlZF9zaXplLCB1TG9uZyBjcmMzMikKK3sKKyAgICByZXR1cm4gemlwQ2xvc2VGaWxlSW5aaXBSYXc2NCAoZmlsZSwgdW5jb21wcmVzc2VkX3NpemUsIGNyYzMyKTsKK30KKworZXh0ZXJuIGludCBaRVhQT1JUIHppcENsb3NlRmlsZUluWmlwUmF3NjQgKHppcEZpbGUgZmlsZSwgWlBPUzY0X1QgdW5jb21wcmVzc2VkX3NpemUsIHVMb25nIGNyYzMyKQoreworICAgIHppcDY0X2ludGVybmFsKiB6aTsKKyAgICBaUE9TNjRfVCBjb21wcmVzc2VkX3NpemU7CisgICAgdUxvbmcgaW52YWxpZFZhbHVlID0gMHhmZmZmZmZmZjsKKyAgICBzaG9ydCBkYXRhc2l6ZSA9IDA7CisgICAgaW50IGVycj1aSVBfT0s7CisKKyAgICBpZiAoZmlsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gWklQX1BBUkFNRVJST1I7CisgICAgemkgPSAoemlwNjRfaW50ZXJuYWwqKWZpbGU7CisKKyAgICBpZiAoemktPmluX29wZW5lZF9maWxlX2luemlwID09IDApCisgICAgICAgIHJldHVybiBaSVBfUEFSQU1FUlJPUjsKKyAgICB6aS0+Y2kuc3RyZWFtLmF2YWlsX2luID0gMDsKKworICAgIGlmICgoemktPmNpLm1ldGhvZCA9PSBaX0RFRkxBVEVEKSAmJiAoIXppLT5jaS5yYXcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChlcnI9PVpJUF9PSykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgdVRvdGFsT3V0QmVmb3JlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoemktPmNpLnN0cmVhbS5hdmFpbF9vdXQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6aXA2NEZsdXNoV3JpdGVCdWZmZXIoemkpID09IFpJUF9FUlJOTykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aS0+Y2kuc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KVpfQlVGU0laRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aS0+Y2kuc3RyZWFtLm5leHRfb3V0ID0gemktPmNpLmJ1ZmZlcmVkX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdVRvdGFsT3V0QmVmb3JlID0gemktPmNpLnN0cmVhbS50b3RhbF9vdXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycj1kZWZsYXRlKCZ6aS0+Y2kuc3RyZWFtLCAgWl9GSU5JU0gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aS0+Y2kucG9zX2luX2J1ZmZlcmVkX2RhdGEgKz0gKHVJbnQpKHppLT5jaS5zdHJlYW0udG90YWxfb3V0IC0gdVRvdGFsT3V0QmVmb3JlKSA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgIGVsc2UgaWYgKCh6aS0+Y2kubWV0aG9kID09IFpfQlpJUDJFRCkgJiYgKCF6aS0+Y2kucmF3KSkKKyAgICB7CisjaWZkZWYgSEFWRV9CWklQMgorICAgICAgZXJyID0gQlpfRklOSVNIX09LOworICAgICAgd2hpbGUgKGVycj09QlpfRklOSVNIX09LKQorICAgICAgeworICAgICAgICB1TG9uZyB1VG90YWxPdXRCZWZvcmU7CisgICAgICAgIGlmICh6aS0+Y2kuYnN0cmVhbS5hdmFpbF9vdXQgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmICh6aXA2NEZsdXNoV3JpdGVCdWZmZXIoemkpID09IFpJUF9FUlJOTykKKyAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKKyAgICAgICAgICB6aS0+Y2kuYnN0cmVhbS5hdmFpbF9vdXQgPSAodUludClaX0JVRlNJWkU7CisgICAgICAgICAgemktPmNpLmJzdHJlYW0ubmV4dF9vdXQgPSAoY2hhciopemktPmNpLmJ1ZmZlcmVkX2RhdGE7CisgICAgICAgIH0KKyAgICAgICAgdVRvdGFsT3V0QmVmb3JlID0gemktPmNpLmJzdHJlYW0udG90YWxfb3V0X2xvMzI7CisgICAgICAgIGVycj1CWjJfYnpDb21wcmVzcygmemktPmNpLmJzdHJlYW0sICBCWl9GSU5JU0gpOworICAgICAgICBpZihlcnIgPT0gQlpfU1RSRUFNX0VORCkKKyAgICAgICAgICBlcnIgPSBaX1NUUkVBTV9FTkQ7CisKKyAgICAgICAgemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhICs9ICh1SW50KSh6aS0+Y2kuYnN0cmVhbS50b3RhbF9vdXRfbG8zMiAtIHVUb3RhbE91dEJlZm9yZSk7CisgICAgICB9CisKKyAgICAgIGlmKGVyciA9PSBCWl9GSU5JU0hfT0spCisgICAgICAgIGVyciA9IFpJUF9PSzsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChlcnI9PVpfU1RSRUFNX0VORCkKKyAgICAgICAgZXJyPVpJUF9PSzsgLyogdGhpcyBpcyBub3JtYWwgKi8KKworICAgIGlmICgoemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhPjApICYmIChlcnI9PVpJUF9PSykpCisgICAgICAgICAgICAgICAgeworICAgICAgICBpZiAoemlwNjRGbHVzaFdyaXRlQnVmZmVyKHppKT09WklQX0VSUk5PKQorICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POworICAgICAgICAgICAgICAgIH0KKworICAgIGlmICgoemktPmNpLm1ldGhvZCA9PSBaX0RFRkxBVEVEKSAmJiAoIXppLT5jaS5yYXcpKQorICAgIHsKKyAgICAgICAgaW50IHRtcF9lcnIgPSBkZWZsYXRlRW5kKCZ6aS0+Y2kuc3RyZWFtKTsKKyAgICAgICAgaWYgKGVyciA9PSBaSVBfT0spCisgICAgICAgICAgICBlcnIgPSB0bXBfZXJyOworICAgICAgICB6aS0+Y2kuc3RyZWFtX2luaXRpYWxpc2VkID0gMDsKKyAgICB9CisjaWZkZWYgSEFWRV9CWklQMgorICAgIGVsc2UgaWYoKHppLT5jaS5tZXRob2QgPT0gWl9CWklQMkVEKSAmJiAoIXppLT5jaS5yYXcpKQorICAgIHsKKyAgICAgIGludCB0bXBlcnIgPSBCWjJfYnpDb21wcmVzc0VuZCgmemktPmNpLmJzdHJlYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycj09WklQX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSB0bXBlcnI7CisgICAgICAgICAgICAgICAgICAgICAgICB6aS0+Y2kuc3RyZWFtX2luaXRpYWxpc2VkID0gMDsKKyAgICB9CisjZW5kaWYKKworICAgIGlmICghemktPmNpLnJhdykKKyAgICB7CisgICAgICAgIGNyYzMyID0gKHVMb25nKXppLT5jaS5jcmMzMjsKKyAgICAgICAgdW5jb21wcmVzc2VkX3NpemUgPSB6aS0+Y2kudG90YWxVbmNvbXByZXNzZWREYXRhOworICAgIH0KKyAgICBjb21wcmVzc2VkX3NpemUgPSB6aS0+Y2kudG90YWxDb21wcmVzc2VkRGF0YTsKKworIyAgICBpZm5kZWYgTk9DUllQVAorICAgIGNvbXByZXNzZWRfc2l6ZSArPSB6aS0+Y2kuY3J5cHRfaGVhZGVyX3NpemU7CisjICAgIGVuZGlmCisKKyAgICAvLyB1cGRhdGUgQ3VycmVudCBJdGVtIGNyYyBhbmQgc2l6ZXMsCisgICAgaWYoY29tcHJlc3NlZF9zaXplID49IDB4ZmZmZmZmZmYgfHwgdW5jb21wcmVzc2VkX3NpemUgPj0gMHhmZmZmZmZmZiB8fCB6aS0+Y2kucG9zX2xvY2FsX2hlYWRlciA+PSAweGZmZmZmZmZmKQorICAgIHsKKyAgICAgIC8qdmVyc2lvbiBNYWRlIGJ5Ki8KKyAgICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzQsKHVMb25nKTQ1LDIpOworICAgICAgLyp2ZXJzaW9uIG5lZWRlZCovCisgICAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcis2LCh1TG9uZyk0NSwyKTsKKworICAgIH0KKworICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzE2LGNyYzMyLDQpOyAvKmNyYyovCisKKworICAgIGlmKGNvbXByZXNzZWRfc2l6ZSA+PSAweGZmZmZmZmZmKQorICAgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMjAsIGludmFsaWRWYWx1ZSw0KTsgLypjb21wciBzaXplKi8KKyAgICBlbHNlCisgICAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisyMCwgY29tcHJlc3NlZF9zaXplLDQpOyAvKmNvbXByIHNpemUqLworCisgICAgLy8vIHNldCBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgZmllbGQKKyAgICBpZiAoemktPmNpLnN0cmVhbS5kYXRhX3R5cGUgPT0gWl9BU0NJSSkKKyAgICAgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMzYsKHVMb25nKVpfQVNDSUksMik7CisKKyAgICBpZih1bmNvbXByZXNzZWRfc2l6ZSA+PSAweGZmZmZmZmZmKQorICAgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMjQsIGludmFsaWRWYWx1ZSw0KTsgLyp1bmNvbXByIHNpemUqLworICAgIGVsc2UKKyAgICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzI0LCB1bmNvbXByZXNzZWRfc2l6ZSw0KTsgLyp1bmNvbXByIHNpemUqLworCisgICAgLy8gQWRkIFpJUDY0IGV4dHJhIGluZm8gZmllbGQgZm9yIHVuY29tcHJlc3NlZCBzaXplCisgICAgaWYodW5jb21wcmVzc2VkX3NpemUgPj0gMHhmZmZmZmZmZikKKyAgICAgIGRhdGFzaXplICs9IDg7CisKKyAgICAvLyBBZGQgWklQNjQgZXh0cmEgaW5mbyBmaWVsZCBmb3IgY29tcHJlc3NlZCBzaXplCisgICAgaWYoY29tcHJlc3NlZF9zaXplID49IDB4ZmZmZmZmZmYpCisgICAgICBkYXRhc2l6ZSArPSA4OworCisgICAgLy8gQWRkIFpJUDY0IGV4dHJhIGluZm8gZmllbGQgZm9yIHJlbGF0aXZlIG9mZnNldCB0byBsb2NhbCBmaWxlIGhlYWRlciBvZiBjdXJyZW50IGZpbGUKKyAgICBpZih6aS0+Y2kucG9zX2xvY2FsX2hlYWRlciA+PSAweGZmZmZmZmZmKQorICAgICAgZGF0YXNpemUgKz0gODsKKworICAgIGlmKGRhdGFzaXplID4gMCkKKyAgICB7CisgICAgICBjaGFyKiBwID0gTlVMTDsKKworICAgICAgaWYoKHVMb25nKShkYXRhc2l6ZSArIDQpID4gemktPmNpLnNpemVfY2VudHJhbEV4dHJhRnJlZSkKKyAgICAgIHsKKyAgICAgICAgLy8gd2UgY2FuIG5vdCB3cml0ZSBtb3JlIGRhdGEgdG8gdGhlIGJ1ZmZlciB0aGF0IHdlIGhhdmUgcm9vbSBmb3IuCisgICAgICAgIHJldHVybiBaSVBfQkFEWklQRklMRTsKKyAgICAgIH0KKworICAgICAgcCA9IHppLT5jaS5jZW50cmFsX2hlYWRlciArIHppLT5jaS5zaXplX2NlbnRyYWxoZWFkZXI7CisKKyAgICAgIC8vIEFkZCBFeHRyYSBJbmZvcm1hdGlvbiBIZWFkZXIgZm9yICdaSVA2NCBpbmZvcm1hdGlvbicKKyAgICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkocCwgMHgwMDAxLCAyKTsgLy8gSGVhZGVySUQKKyAgICAgIHAgKz0gMjsKKyAgICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkocCwgZGF0YXNpemUsIDIpOyAvLyBEYXRhU2l6ZQorICAgICAgcCArPSAyOworCisgICAgICBpZih1bmNvbXByZXNzZWRfc2l6ZSA+PSAweGZmZmZmZmZmKQorICAgICAgeworICAgICAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHAsIHVuY29tcHJlc3NlZF9zaXplLCA4KTsKKyAgICAgICAgcCArPSA4OworICAgICAgfQorCisgICAgICBpZihjb21wcmVzc2VkX3NpemUgPj0gMHhmZmZmZmZmZikKKyAgICAgIHsKKyAgICAgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeShwLCBjb21wcmVzc2VkX3NpemUsIDgpOworICAgICAgICBwICs9IDg7CisgICAgICB9CisKKyAgICAgIGlmKHppLT5jaS5wb3NfbG9jYWxfaGVhZGVyID49IDB4ZmZmZmZmZmYpCisgICAgICB7CisgICAgICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkocCwgemktPmNpLnBvc19sb2NhbF9oZWFkZXIsIDgpOworICAgICAgICBwICs9IDg7CisgICAgICB9CisKKyAgICAgIC8vIFVwZGF0ZSBob3cgbXVjaCBleHRyYSBmcmVlIHNwYWNlIHdlIGdvdCBpbiB0aGUgbWVtb3J5IGJ1ZmZlcgorICAgICAgLy8gYW5kIGluY3JlYXNlIHRoZSBjZW50cmFsaGVhZGVyIHNpemUgc28gdGhlIG5ldyBaSVA2NCBmaWVsZHMgYXJlIGluY2x1ZGVkCisgICAgICAvLyAoIDQgYmVsb3cgaXMgdGhlIHNpemUgb2YgSGVhZGVySUQgYW5kIERhdGFTaXplIGZpZWxkICkKKyAgICAgIHppLT5jaS5zaXplX2NlbnRyYWxFeHRyYUZyZWUgLT0gZGF0YXNpemUgKyA0OworICAgICAgemktPmNpLnNpemVfY2VudHJhbGhlYWRlciArPSBkYXRhc2l6ZSArIDQ7CisKKyAgICAgIC8vIFVwZGF0ZSB0aGUgZXh0cmEgaW5mbyBzaXplIGZpZWxkCisgICAgICB6aS0+Y2kuc2l6ZV9jZW50cmFsRXh0cmEgKz0gZGF0YXNpemUgKyA0OworICAgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMzAsKHVMb25nKXppLT5jaS5zaXplX2NlbnRyYWxFeHRyYSwyKTsKKyAgICB9CisKKyAgICBpZiAoZXJyPT1aSVBfT0spCisgICAgICAgIGVyciA9IGFkZF9kYXRhX2luX2RhdGFibG9jaygmemktPmNlbnRyYWxfZGlyLCB6aS0+Y2kuY2VudHJhbF9oZWFkZXIsICh1TG9uZyl6aS0+Y2kuc2l6ZV9jZW50cmFsaGVhZGVyKTsKKworICAgIGZyZWUoemktPmNpLmNlbnRyYWxfaGVhZGVyKTsKKworICAgIGlmIChlcnI9PVpJUF9PSykKKyAgICB7CisgICAgICAgIC8vIFVwZGF0ZSB0aGUgTG9jYWxGaWxlSGVhZGVyIHdpdGggdGhlIG5ldyB2YWx1ZXMuCisKKyAgICAgICAgWlBPUzY0X1QgY3VyX3Bvc19pbnppcCA9IFpURUxMNjQoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0pOworCisgICAgICAgIGlmIChaU0VFSzY0KHppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCB6aS0+Y2kucG9zX2xvY2FsX2hlYWRlciArIDE0LFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQorICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POworCisgICAgICAgIGlmIChlcnI9PVpJUF9PSykKKyAgICAgICAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLGNyYzMyLDQpOyAvKiBjcmMgMzIsIHVua25vd24gKi8KKworICAgICAgICBpZih1bmNvbXByZXNzZWRfc2l6ZSA+PSAweGZmZmZmZmZmIHx8IGNvbXByZXNzZWRfc2l6ZSA+PSAweGZmZmZmZmZmICkKKyAgICAgICAgeworICAgICAgICAgIGlmKHppLT5jaS5wb3NfemlwNjRleHRyYWluZm8gPiAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2l6ZSBpbiB0aGUgWklQNjQgZXh0ZW5kZWQgZmllbGQuCisgICAgICAgICAgICBpZiAoWlNFRUs2NCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwgemktPmNpLnBvc196aXA2NGV4dHJhaW5mbyArIDQsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCisgICAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKKworICAgICAgICAgICAgaWYgKGVycj09WklQX09LKSAvKiBjb21wcmVzc2VkIHNpemUsIHVua25vd24gKi8KKyAgICAgICAgICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsIHppLT5maWxlc3RyZWFtLCB1bmNvbXByZXNzZWRfc2l6ZSwgOCk7CisKKyAgICAgICAgICAgIGlmIChlcnI9PVpJUF9PSykgLyogdW5jb21wcmVzc2VkIHNpemUsIHVua25vd24gKi8KKyAgICAgICAgICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsIHppLT5maWxlc3RyZWFtLCBjb21wcmVzc2VkX3NpemUsIDgpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGVyciA9IFpJUF9CQURaSVBGSUxFOyAvLyBDYWxsZXIgcGFzc2VkIHppcDY0ID0gMCwgc28gbm8gcm9vbSBmb3IgemlwNjQgaW5mbyAtPiBmYXRhbAorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmIChlcnI9PVpJUF9PSykgLyogY29tcHJlc3NlZCBzaXplLCB1bmtub3duICovCisgICAgICAgICAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLGNvbXByZXNzZWRfc2l6ZSw0KTsKKworICAgICAgICAgIGlmIChlcnI9PVpJUF9PSykgLyogdW5jb21wcmVzc2VkIHNpemUsIHVua25vd24gKi8KKyAgICAgICAgICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sdW5jb21wcmVzc2VkX3NpemUsNCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoWlNFRUs2NCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwgY3VyX3Bvc19pbnppcCxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKKyAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKKyAgICB9CisKKyAgICB6aS0+bnVtYmVyX2VudHJ5ICsrOworICAgIHppLT5pbl9vcGVuZWRfZmlsZV9pbnppcCA9IDA7CisKKyAgICByZXR1cm4gZXJyOworfQorCitleHRlcm4gaW50IFpFWFBPUlQgemlwQ2xvc2VGaWxlSW5aaXAgKHppcEZpbGUgZmlsZSkKK3sKKyAgICByZXR1cm4gemlwQ2xvc2VGaWxlSW5aaXBSYXcgKGZpbGUsMCwwKTsKK30KKworaW50IFdyaXRlX1ppcDY0RW5kT2ZDZW50cmFsRGlyZWN0b3J5TG9jYXRvcih6aXA2NF9pbnRlcm5hbCogemksIFpQT1M2NF9UIHppcDY0ZW9jZF9wb3NfaW56aXApCit7CisgIGludCBlcnIgPSBaSVBfT0s7CisgIFpQT1M2NF9UIHBvcyA9IHppcDY0ZW9jZF9wb3NfaW56aXAgLSB6aS0+YWRkX3Bvc2l0aW9uX3doZW5fd3JpdHRpbmdfb2Zmc2V0OworCisgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZylaSVA2NEVORExPQ0hFQURFUk1BR0lDLDQpOworCisgIC8qbnVtIGRpc2tzKi8KKyAgICBpZiAoZXJyPT1aSVBfT0spIC8qIG51bWJlciBvZiB0aGUgZGlzayB3aXRoIHRoZSBzdGFydCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8KKyAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykwLDQpOworCisgIC8qcmVsYXRpdmUgb2Zmc2V0Ki8KKyAgICBpZiAoZXJyPT1aSVBfT0spIC8qIFJlbGF0aXZlIG9mZnNldCB0byB0aGUgWmlwNjRFbmRPZkNlbnRyYWxEaXJlY3RvcnkgKi8KKyAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCBwb3MsOCk7CisKKyAgLyp0b3RhbCBkaXNrcyovIC8qIERvIG5vdCBzdXBwb3J0IHNwYXduaW5nIG9mIGRpc2sgc28gYWx3YXlzIHNheSAxIGhlcmUqLworICAgIGlmIChlcnI9PVpJUF9PSykgLyogbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLworICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKTEsNCk7CisKKyAgICByZXR1cm4gZXJyOworfQorCitpbnQgV3JpdGVfWmlwNjRFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQoemlwNjRfaW50ZXJuYWwqIHppLCB1TG9uZyBzaXplX2NlbnRyYWxkaXIsIFpQT1M2NF9UIGNlbnRyYWxkaXJfcG9zX2luemlwKQoreworICBpbnQgZXJyID0gWklQX09LOworCisgIHVMb25nIFppcDY0RGF0YVNpemUgPSA0NDsKKworICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpWklQNjRFTkRIRUFERVJNQUdJQyw0KTsKKworICBpZiAoZXJyPT1aSVBfT0spIC8qIHNpemUgb2YgdGhpcyAnemlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5JyAqLworICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLChaUE9TNjRfVClaaXA2NERhdGFTaXplLDgpOyAvLyB3aHkgWlBPUzY0X1Qgb2YgdGhpcyA/CisKKyAgaWYgKGVycj09WklQX09LKSAvKiB2ZXJzaW9uIG1hZGUgYnkgKi8KKyAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpNDUsMik7CisKKyAgaWYgKGVycj09WklQX09LKSAvKiB2ZXJzaW9uIG5lZWRlZCAqLworICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZyk0NSwyKTsKKworICBpZiAoZXJyPT1aSVBfT0spIC8qIG51bWJlciBvZiB0aGlzIGRpc2sgKi8KKyAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpMCw0KTsKKworICBpZiAoZXJyPT1aSVBfT0spIC8qIG51bWJlciBvZiB0aGUgZGlzayB3aXRoIHRoZSBzdGFydCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8KKyAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpMCw0KTsKKworICBpZiAoZXJyPT1aSVBfT0spIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpciBvbiB0aGlzIGRpc2sgKi8KKyAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYywgemktPmZpbGVzdHJlYW0sIHppLT5udW1iZXJfZW50cnksIDgpOworCisgIGlmIChlcnI9PVpJUF9PSykgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyICovCisgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsIHppLT5maWxlc3RyZWFtLCB6aS0+bnVtYmVyX2VudHJ5LCA4KTsKKworICBpZiAoZXJyPT1aSVBfT0spIC8qIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICovCisgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKFpQT1M2NF9UKXNpemVfY2VudHJhbGRpciw4KTsKKworICBpZiAoZXJyPT1aSVBfT0spIC8qIG9mZnNldCBvZiBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeSB3aXRoIHJlc3BlY3QgdG8gdGhlIHN0YXJ0aW5nIGRpc2sgbnVtYmVyICovCisgIHsKKyAgICBaUE9TNjRfVCBwb3MgPSBjZW50cmFsZGlyX3Bvc19pbnppcCAtIHppLT5hZGRfcG9zaXRpb25fd2hlbl93cml0dGluZ19vZmZzZXQ7CisgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sIChaUE9TNjRfVClwb3MsOCk7CisgIH0KKyAgcmV0dXJuIGVycjsKK30KK2ludCBXcml0ZV9FbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQoemlwNjRfaW50ZXJuYWwqIHppLCB1TG9uZyBzaXplX2NlbnRyYWxkaXIsIFpQT1M2NF9UIGNlbnRyYWxkaXJfcG9zX2luemlwKQoreworICBpbnQgZXJyID0gWklQX09LOworCisgIC8qc2lnbmF0dXJlKi8KKyAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKUVOREhFQURFUk1BR0lDLDQpOworCisgIGlmIChlcnI9PVpJUF9PSykgLyogbnVtYmVyIG9mIHRoaXMgZGlzayAqLworICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykwLDIpOworCisgIGlmIChlcnI9PVpJUF9PSykgLyogbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLworICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykwLDIpOworCisgIGlmIChlcnI9PVpJUF9PSykgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyIG9uIHRoaXMgZGlzayAqLworICB7CisgICAgeworICAgICAgaWYoemktPm51bWJlcl9lbnRyeSA+PSAweEZGRkYpCisgICAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykweGZmZmYsMik7IC8vIHVzZSB2YWx1ZSBpbiBaSVA2NCByZWNvcmQKKyAgICAgIGVsc2UKKyAgICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKXppLT5udW1iZXJfZW50cnksMik7CisgICAgfQorICB9CisKKyAgaWYgKGVycj09WklQX09LKSAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXIgKi8KKyAgeworICAgIGlmKHppLT5udW1iZXJfZW50cnkgPj0gMHhGRkZGKQorICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKTB4ZmZmZiwyKTsgLy8gdXNlIHZhbHVlIGluIFpJUDY0IHJlY29yZAorICAgIGVsc2UKKyAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZyl6aS0+bnVtYmVyX2VudHJ5LDIpOworICB9CisKKyAgaWYgKGVycj09WklQX09LKSAvKiBzaXplIG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLworICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZylzaXplX2NlbnRyYWxkaXIsNCk7CisKKyAgaWYgKGVycj09WklQX09LKSAvKiBvZmZzZXQgb2Ygc3RhcnQgb2YgY2VudHJhbCBkaXJlY3Rvcnkgd2l0aCByZXNwZWN0IHRvIHRoZSBzdGFydGluZyBkaXNrIG51bWJlciAqLworICB7CisgICAgWlBPUzY0X1QgcG9zID0gY2VudHJhbGRpcl9wb3NfaW56aXAgLSB6aS0+YWRkX3Bvc2l0aW9uX3doZW5fd3JpdHRpbmdfb2Zmc2V0OworICAgIGlmKHBvcyA+PSAweGZmZmZmZmZmKQorICAgIHsKKyAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCAodUxvbmcpMHhmZmZmZmZmZiw0KTsKKyAgICB9CisgICAgZWxzZQorICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sICh1TG9uZykoY2VudHJhbGRpcl9wb3NfaW56aXAgLSB6aS0+YWRkX3Bvc2l0aW9uX3doZW5fd3JpdHRpbmdfb2Zmc2V0KSw0KTsKKyAgfQorCisgICByZXR1cm4gZXJyOworfQorCitpbnQgV3JpdGVfR2xvYmFsQ29tbWVudCh6aXA2NF9pbnRlcm5hbCogemksIGNvbnN0IGNoYXIqIGdsb2JhbF9jb21tZW50KQoreworICBpbnQgZXJyID0gWklQX09LOworICB1SW50IHNpemVfZ2xvYmFsX2NvbW1lbnQgPSAwOworCisgIGlmKGdsb2JhbF9jb21tZW50ICE9IE5VTEwpCisgICAgc2l6ZV9nbG9iYWxfY29tbWVudCA9ICh1SW50KXN0cmxlbihnbG9iYWxfY29tbWVudCk7CisKKyAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKXNpemVfZ2xvYmFsX2NvbW1lbnQsMik7CisKKyAgaWYgKGVyciA9PSBaSVBfT0sgJiYgc2l6ZV9nbG9iYWxfY29tbWVudCA+IDApCisgIHsKKyAgICBpZiAoWldSSVRFNjQoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sIGdsb2JhbF9jb21tZW50LCBzaXplX2dsb2JhbF9jb21tZW50KSAhPSBzaXplX2dsb2JhbF9jb21tZW50KQorICAgICAgZXJyID0gWklQX0VSUk5POworICB9CisgIHJldHVybiBlcnI7Cit9CisKK2V4dGVybiBpbnQgWkVYUE9SVCB6aXBDbG9zZSAoemlwRmlsZSBmaWxlLCBjb25zdCBjaGFyKiBnbG9iYWxfY29tbWVudCkKK3sKKyAgICB6aXA2NF9pbnRlcm5hbCogemk7CisgICAgaW50IGVyciA9IDA7CisgICAgdUxvbmcgc2l6ZV9jZW50cmFsZGlyID0gMDsKKyAgICBaUE9TNjRfVCBjZW50cmFsZGlyX3Bvc19pbnppcDsKKyAgICBaUE9TNjRfVCBwb3M7CisKKyAgICBpZiAoZmlsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gWklQX1BBUkFNRVJST1I7CisKKyAgICB6aSA9ICh6aXA2NF9pbnRlcm5hbCopZmlsZTsKKworICAgIGlmICh6aS0+aW5fb3BlbmVkX2ZpbGVfaW56aXAgPT0gMSkKKyAgICB7CisgICAgICAgIGVyciA9IHppcENsb3NlRmlsZUluWmlwIChmaWxlKTsKKyAgICB9CisKKyNpZm5kZWYgTk9fQURERklMRUlORVhJU1RJTkdaSVAKKyAgICBpZiAoZ2xvYmFsX2NvbW1lbnQ9PU5VTEwpCisgICAgICAgIGdsb2JhbF9jb21tZW50ID0gemktPmdsb2JhbGNvbW1lbnQ7CisjZW5kaWYKKworICAgIGNlbnRyYWxkaXJfcG9zX2luemlwID0gWlRFTEw2NCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSk7CisKKyAgICBpZiAoZXJyPT1aSVBfT0spCisgICAgeworICAgICAgICBsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbCogbGRpID0gemktPmNlbnRyYWxfZGlyLmZpcnN0X2Jsb2NrOworICAgICAgICB3aGlsZSAobGRpIT1OVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGVycj09WklQX09LKSAmJiAobGRpLT5maWxsZWRfaW5fdGhpc19ibG9jaz4wKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoWldSSVRFNjQoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sIGxkaS0+ZGF0YSwgbGRpLT5maWxsZWRfaW5fdGhpc19ibG9jaykgIT0gbGRpLT5maWxsZWRfaW5fdGhpc19ibG9jaykKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaXplX2NlbnRyYWxkaXIgKz0gbGRpLT5maWxsZWRfaW5fdGhpc19ibG9jazsKKyAgICAgICAgICAgIGxkaSA9IGxkaS0+bmV4dF9kYXRhYmxvY2s7CisgICAgICAgIH0KKyAgICB9CisgICAgZnJlZV9saW5rZWRsaXN0KCYoemktPmNlbnRyYWxfZGlyKSk7CisKKyAgICBwb3MgPSBjZW50cmFsZGlyX3Bvc19pbnppcCAtIHppLT5hZGRfcG9zaXRpb25fd2hlbl93cml0dGluZ19vZmZzZXQ7CisgICAgaWYocG9zID49IDB4ZmZmZmZmZmYgfHwgemktPm51bWJlcl9lbnRyeSA+IDB4RkZGRikKKyAgICB7CisgICAgICBaUE9TNjRfVCBaaXA2NEVPQ0Rwb3MgPSBaVEVMTDY0KHppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtKTsKKyAgICAgIFdyaXRlX1ppcDY0RW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkKHppLCBzaXplX2NlbnRyYWxkaXIsIGNlbnRyYWxkaXJfcG9zX2luemlwKTsKKworICAgICAgV3JpdGVfWmlwNjRFbmRPZkNlbnRyYWxEaXJlY3RvcnlMb2NhdG9yKHppLCBaaXA2NEVPQ0Rwb3MpOworICAgIH0KKworICAgIGlmIChlcnI9PVpJUF9PSykKKyAgICAgIGVyciA9IFdyaXRlX0VuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZCh6aSwgc2l6ZV9jZW50cmFsZGlyLCBjZW50cmFsZGlyX3Bvc19pbnppcCk7CisKKyAgICBpZihlcnIgPT0gWklQX09LKQorICAgICAgZXJyID0gV3JpdGVfR2xvYmFsQ29tbWVudCh6aSwgZ2xvYmFsX2NvbW1lbnQpOworCisgICAgaWYgKFpDTE9TRTY0KHppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtKSAhPSAwKQorICAgICAgICBpZiAoZXJyID09IFpJUF9PSykKKyAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKKworI2lmbmRlZiBOT19BRERGSUxFSU5FWElTVElOR1pJUAorICAgIFRSWUZSRUUoemktPmdsb2JhbGNvbW1lbnQpOworI2VuZGlmCisgICAgVFJZRlJFRSh6aSk7CisKKyAgICByZXR1cm4gZXJyOworfQorCitleHRlcm4gaW50IFpFWFBPUlQgemlwUmVtb3ZlRXh0cmFJbmZvQmxvY2sgKGNoYXIqIHBEYXRhLCBpbnQqIGRhdGFMZW4sIHNob3J0IHNIZWFkZXIpCit7CisgIGNoYXIqIHAgPSBwRGF0YTsKKyAgaW50IHNpemUgPSAwOworICBjaGFyKiBwTmV3SGVhZGVyOworICBjaGFyKiBwVG1wOworICBzaG9ydCBoZWFkZXI7CisgIHNob3J0IGRhdGFTaXplOworCisgIGludCByZXRWYWwgPSBaSVBfT0s7CisKKyAgaWYocERhdGEgPT0gTlVMTCB8fCAqZGF0YUxlbiA8IDQpCisgICAgcmV0dXJuIFpJUF9QQVJBTUVSUk9SOworCisgIHBOZXdIZWFkZXIgPSAoY2hhciopQUxMT0MoKmRhdGFMZW4pOworICBwVG1wID0gcE5ld0hlYWRlcjsKKworICB3aGlsZShwIDwgKHBEYXRhICsgKmRhdGFMZW4pKQorICB7CisgICAgaGVhZGVyID0gKihzaG9ydCopcDsKKyAgICBkYXRhU2l6ZSA9ICooKChzaG9ydCopcCkrMSk7CisKKyAgICBpZiggaGVhZGVyID09IHNIZWFkZXIgKSAvLyBIZWFkZXIgZm91bmQuCisgICAgeworICAgICAgcCArPSBkYXRhU2l6ZSArIDQ7IC8vIHNraXAgaXQuIGRvIG5vdCBjb3B5IHRvIHRlbXAgYnVmZmVyCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvLyBFeHRyYSBJbmZvIGJsb2NrIHNob3VsZCBub3QgYmUgcmVtb3ZlZCwgU28gY29weSBpdCB0byB0aGUgdGVtcCBidWZmZXIuCisgICAgICBtZW1jcHkocFRtcCwgcCwgZGF0YVNpemUgKyA0KTsKKyAgICAgIHAgKz0gZGF0YVNpemUgKyA0OworICAgICAgc2l6ZSArPSBkYXRhU2l6ZSArIDQ7CisgICAgfQorCisgIH0KKworICBpZihzaXplIDwgKmRhdGFMZW4pCisgIHsKKyAgICAvLyBjbGVhbiBvbGQgZXh0cmEgaW5mbyBibG9jay4KKyAgICBtZW1zZXQocERhdGEsMCwgKmRhdGFMZW4pOworCisgICAgLy8gY29weSB0aGUgbmV3IGV4dHJhIGluZm8gYmxvY2sgb3ZlciB0aGUgb2xkCisgICAgaWYoc2l6ZSA+IDApCisgICAgICBtZW1jcHkocERhdGEsIHBOZXdIZWFkZXIsIHNpemUpOworCisgICAgLy8gc2V0IHRoZSBuZXcgZXh0cmEgaW5mbyBzaXplCisgICAgKmRhdGFMZW4gPSBzaXplOworCisgICAgcmV0VmFsID0gWklQX09LOworICB9CisgIGVsc2UKKyAgICByZXRWYWwgPSBaSVBfRVJSTk87CisKKyAgVFJZRlJFRShwTmV3SGVhZGVyKTsKKworICByZXR1cm4gcmV0VmFsOworfQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9taW5pemlwL3ppcC5oIGIvemxpYi9zcmMvY29udHJpYi9taW5pemlwL3ppcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYWViYjYKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL21pbml6aXAvemlwLmgKQEAgLTAsMCArMSwzNjIgQEAKKy8qIHppcC5oIC0tIElPIG9uIC56aXAgZmlsZXMgdXNpbmcgemxpYgorICAgVmVyc2lvbiAxLjEsIEZlYnJ1YXJ5IDE0aCwgMjAxMAorICAgcGFydCBvZiB0aGUgTWluaVppcCBwcm9qZWN0IC0gKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCisKKyAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDEwIEdpbGxlcyBWb2xsYW50IChtaW5pemlwKSAoIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvbWluaXppcC5odG1sICkKKworICAgICAgICAgTW9kaWZpY2F0aW9ucyBmb3IgWmlwNjQgc3VwcG9ydAorICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTWF0aGlhcyBTdmVuc3NvbiAoIGh0dHA6Ly9yZXN1bHQ0Mi5jb20gKQorCisgICAgICAgICBGb3IgbW9yZSBpbmZvIHJlYWQgTWluaVppcF9pbmZvLnR4dAorCisgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgQ29uZGl0aW9uIG9mIHVzZSBhbmQgZGlzdHJpYnV0aW9uIGFyZSB0aGUgc2FtZSB0aGFuIHpsaWIgOgorCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKworICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICBDaGFuZ2VzCisKKyAgICAgICAgU2VlIGhlYWRlciBvZiB6aXAuaAorCisqLworCisjaWZuZGVmIF96aXAxMl9ICisjZGVmaW5lIF96aXAxMl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8jZGVmaW5lIEhBVkVfQlpJUDIKKworI2lmbmRlZiBfWkxJQl9ICisjaW5jbHVkZSAiemxpYi5oIgorI2VuZGlmCisKKyNpZm5kZWYgX1pMSUJJT0FQSV9ICisjaW5jbHVkZSAiaW9hcGkuaCIKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9CWklQMgorI2luY2x1ZGUgImJ6bGliLmgiCisjZW5kaWYKKworI2RlZmluZSBaX0JaSVAyRUQgMTIKKworI2lmIGRlZmluZWQoU1RSSUNUWklQKSB8fCBkZWZpbmVkKFNUUklDVFpJUFVOWklQKQorLyogbGlrZSB0aGUgU1RSSUNUIG9mIFdJTjMyLCB3ZSBkZWZpbmUgYSBwb2ludGVyIHRoYXQgY2Fubm90IGJlIGNvbnZlcnRlZAorICAgIGZyb20gKHZvaWQqKSB3aXRob3V0IGNhc3QgKi8KK3R5cGVkZWYgc3RydWN0IFRhZ3ppcEZpbGVfXyB7IGludCB1bnVzZWQ7IH0gemlwRmlsZV9fOwordHlwZWRlZiB6aXBGaWxlX18gKnppcEZpbGU7CisjZWxzZQordHlwZWRlZiB2b2lkcCB6aXBGaWxlOworI2VuZGlmCisKKyNkZWZpbmUgWklQX09LICAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgWklQX0VPRiAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgWklQX0VSUk5PICAgICAgICAgICAgICAgICAgICAgICAoWl9FUlJOTykKKyNkZWZpbmUgWklQX1BBUkFNRVJST1IgICAgICAgICAgICAgICAgICAoLTEwMikKKyNkZWZpbmUgWklQX0JBRFpJUEZJTEUgICAgICAgICAgICAgICAgICAoLTEwMykKKyNkZWZpbmUgWklQX0lOVEVSTkFMRVJST1IgICAgICAgICAgICAgICAoLTEwNCkKKworI2lmbmRlZiBERUZfTUVNX0xFVkVMCisjICBpZiBNQVhfTUVNX0xFVkVMID49IDgKKyMgICAgZGVmaW5lIERFRl9NRU1fTEVWRUwgOAorIyAgZWxzZQorIyAgICBkZWZpbmUgREVGX01FTV9MRVZFTCAgTUFYX01FTV9MRVZFTAorIyAgZW5kaWYKKyNlbmRpZgorLyogZGVmYXVsdCBtZW1MZXZlbCAqLworCisvKiB0bV96aXAgY29udGFpbiBkYXRlL3RpbWUgaW5mbyAqLwordHlwZWRlZiBzdHJ1Y3QgdG1femlwX3MKK3sKKyAgICB1SW50IHRtX3NlYzsgICAgICAgICAgICAvKiBzZWNvbmRzIGFmdGVyIHRoZSBtaW51dGUgLSBbMCw1OV0gKi8KKyAgICB1SW50IHRtX21pbjsgICAgICAgICAgICAvKiBtaW51dGVzIGFmdGVyIHRoZSBob3VyIC0gWzAsNTldICovCisgICAgdUludCB0bV9ob3VyOyAgICAgICAgICAgLyogaG91cnMgc2luY2UgbWlkbmlnaHQgLSBbMCwyM10gKi8KKyAgICB1SW50IHRtX21kYXk7ICAgICAgICAgICAvKiBkYXkgb2YgdGhlIG1vbnRoIC0gWzEsMzFdICovCisgICAgdUludCB0bV9tb247ICAgICAgICAgICAgLyogbW9udGhzIHNpbmNlIEphbnVhcnkgLSBbMCwxMV0gKi8KKyAgICB1SW50IHRtX3llYXI7ICAgICAgICAgICAvKiB5ZWFycyAtIFsxOTgwLi4yMDQ0XSAqLworfSB0bV96aXA7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdG1femlwICAgICAgdG16X2RhdGU7ICAgICAgIC8qIGRhdGUgaW4gdW5kZXJzdGFuZGFibGUgZm9ybWF0ICAgICAgICAgICAqLworICAgIHVMb25nICAgICAgIGRvc0RhdGU7ICAgICAgIC8qIGlmIGRvc19kYXRlID09IDAsIHRtdV9kYXRlIGlzIHVzZWQgICAgICAqLworLyogICAgdUxvbmcgICAgICAgZmxhZzsgICAgICAgICovICAgLyogZ2VuZXJhbCBwdXJwb3NlIGJpdCBmbGFnICAgICAgICAyIGJ5dGVzICovCisKKyAgICB1TG9uZyAgICAgICBpbnRlcm5hbF9mYTsgICAgLyogaW50ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzICAgICAgICAyIGJ5dGVzICovCisgICAgdUxvbmcgICAgICAgZXh0ZXJuYWxfZmE7ICAgIC8qIGV4dGVybmFsIGZpbGUgYXR0cmlidXRlcyAgICAgICAgNCBieXRlcyAqLworfSB6aXBfZmlsZWluZm87CisKK3R5cGVkZWYgY29uc3QgY2hhciogemlwY2hhcnBjOworCisKKyNkZWZpbmUgQVBQRU5EX1NUQVRVU19DUkVBVEUgICAgICAgICgwKQorI2RlZmluZSBBUFBFTkRfU1RBVFVTX0NSRUFURUFGVEVSICAgKDEpCisjZGVmaW5lIEFQUEVORF9TVEFUVVNfQURESU5aSVAgICAgICAoMikKKworZXh0ZXJuIHppcEZpbGUgWkVYUE9SVCB6aXBPcGVuIE9GKChjb25zdCBjaGFyICpwYXRobmFtZSwgaW50IGFwcGVuZCkpOworZXh0ZXJuIHppcEZpbGUgWkVYUE9SVCB6aXBPcGVuNjQgT0YoKGNvbnN0IHZvaWQgKnBhdGhuYW1lLCBpbnQgYXBwZW5kKSk7CisvKgorICBDcmVhdGUgYSB6aXBmaWxlLgorICAgICBwYXRobmFtZSBjb250YWluIG9uIFdpbmRvd3MgWFAgYSBmaWxlbmFtZSBsaWtlICJjOlxcemxpYlxcemxpYjExMy56aXAiIG9yIG9uCisgICAgICAgYW4gVW5peCBjb21wdXRlciAiemxpYi96bGliMTEzLnppcCIuCisgICAgIGlmIHRoZSBmaWxlIHBhdGhuYW1lIGV4aXN0IGFuZCBhcHBlbmQ9PUFQUEVORF9TVEFUVVNfQ1JFQVRFQUZURVIsIHRoZSB6aXAKKyAgICAgICB3aWxsIGJlIGNyZWF0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKyAgICAgICAgICh1c2VmdWwgaWYgdGhlIGZpbGUgY29udGFpbiBhIHNlbGYgZXh0cmFjdG9yIGNvZGUpCisgICAgIGlmIHRoZSBmaWxlIHBhdGhuYW1lIGV4aXN0IGFuZCBhcHBlbmQ9PUFQUEVORF9TVEFUVVNfQURESU5aSVAsIHdlIHdpbGwKKyAgICAgICBhZGQgZmlsZXMgaW4gZXhpc3RpbmcgemlwIChiZSBzdXJlIHlvdSBkb24ndCBhZGQgZmlsZSB0aGF0IGRvZXNuJ3QgZXhpc3QpCisgICAgIElmIHRoZSB6aXBmaWxlIGNhbm5vdCBiZSBvcGVuZWQsIHRoZSByZXR1cm4gdmFsdWUgaXMgTlVMTC4KKyAgICAgRWxzZSwgdGhlIHJldHVybiB2YWx1ZSBpcyBhIHppcEZpbGUgSGFuZGxlLCB1c2FibGUgd2l0aCBvdGhlciBmdW5jdGlvbgorICAgICAgIG9mIHRoaXMgemlwIHBhY2thZ2UuCisqLworCisvKiBOb3RlIDogdGhlcmUgaXMgbm8gZGVsZXRlIGZ1bmN0aW9uIGludG8gYSB6aXBmaWxlLgorICAgSWYgeW91IHdhbnQgZGVsZXRlIGZpbGUgaW50byBhIHppcGZpbGUsIHlvdSBtdXN0IG9wZW4gYSB6aXBmaWxlLCBhbmQgY3JlYXRlIGFub3RoZXIKKyAgIE9mIGNvdXNlLCB5b3UgY2FuIHVzZSBSQVcgcmVhZGluZyBhbmQgd3JpdGluZyB0byBjb3B5IHRoZSBmaWxlIHlvdSBkaWQgbm90IHdhbnQgZGVsdGUKKyovCisKK2V4dGVybiB6aXBGaWxlIFpFWFBPUlQgemlwT3BlbjIgT0YoKGNvbnN0IGNoYXIgKnBhdGhuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXBwZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBjaGFycGMqIGdsb2JhbGNvbW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYpKTsKKworZXh0ZXJuIHppcEZpbGUgWkVYUE9SVCB6aXBPcGVuMl82NCBPRigoY29uc3Qgdm9pZCAqcGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcHBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcGNoYXJwYyogZ2xvYmFsY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemxpYl9maWxlZnVuYzY0X2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmKSk7CisKK2V4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwIE9GKCh6aXBGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsKSk7CisKK2V4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwNjQgT0YoKHppcEZpbGUgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHppcF9maWxlaW5mbyogemlwZmksCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgdUludCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21tZW50LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB6aXA2NCkpOworCisvKgorICBPcGVuIGEgZmlsZSBpbiB0aGUgWklQIGZvciB3cml0aW5nLgorICBmaWxlbmFtZSA6IHRoZSBmaWxlbmFtZSBpbiB6aXAgKGlmIE5VTEwsICctJyB3aXRob3V0IHF1b3RlIHdpbGwgYmUgdXNlZAorICAqemlwZmkgY29udGFpbiBzdXBwbGVtZW50YWwgaW5mb3JtYXRpb24KKyAgaWYgZXh0cmFmaWVsZF9sb2NhbCE9TlVMTCBhbmQgc2l6ZV9leHRyYWZpZWxkX2xvY2FsPjAsIGV4dHJhZmllbGRfbG9jYWwKKyAgICBjb250YWlucyB0aGUgZXh0cmFmaWVsZCBkYXRhIHRoZSB0aGUgbG9jYWwgaGVhZGVyCisgIGlmIGV4dHJhZmllbGRfZ2xvYmFsIT1OVUxMIGFuZCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsPjAsIGV4dHJhZmllbGRfZ2xvYmFsCisgICAgY29udGFpbnMgdGhlIGV4dHJhZmllbGQgZGF0YSB0aGUgdGhlIGxvY2FsIGhlYWRlcgorICBpZiBjb21tZW50ICE9IE5VTEwsIGNvbW1lbnQgY29udGFpbiB0aGUgY29tbWVudCBzdHJpbmcKKyAgbWV0aG9kIGNvbnRhaW4gdGhlIGNvbXByZXNzaW9uIG1ldGhvZCAoMCBmb3Igc3RvcmUsIFpfREVGTEFURUQgZm9yIGRlZmxhdGUpCisgIGxldmVsIGNvbnRhaW4gdGhlIGxldmVsIG9mIGNvbXByZXNzaW9uIChjYW4gYmUgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKQorICB6aXA2NCBpcyBzZXQgdG8gMSBpZiBhIHppcDY0IGV4dGVuZGVkIGluZm9ybWF0aW9uIGJsb2NrIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgbG9jYWwgZmlsZSBoZWFkZXIuCisgICAgICAgICAgICAgICAgICAgIHRoaXMgTVVTVCBiZSAnMScgaWYgdGhlIHVuY29tcHJlc3NlZCBzaXplIGlzID49IDB4ZmZmZmZmZmYuCisKKyovCisKKworZXh0ZXJuIGludCBaRVhQT1JUIHppcE9wZW5OZXdGaWxlSW5aaXAyIE9GKCh6aXBGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmF3KSk7CisKKworZXh0ZXJuIGludCBaRVhQT1JUIHppcE9wZW5OZXdGaWxlSW5aaXAyXzY0IE9GKCh6aXBGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgemlwNjQpKTsKKy8qCisgIFNhbWUgdGhhbiB6aXBPcGVuTmV3RmlsZUluWmlwLCBleGNlcHQgaWYgcmF3PTEsIHdlIHdyaXRlIHJhdyBmaWxlCisgKi8KKworZXh0ZXJuIGludCBaRVhQT1JUIHppcE9wZW5OZXdGaWxlSW5aaXAzIE9GKCh6aXBGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lbUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBjcmNGb3JDcnlwdGluZykpOworCitleHRlcm4gaW50IFpFWFBPUlQgemlwT3Blbk5ld0ZpbGVJblppcDNfNjQgT0YoKHppcEZpbGUgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHppcF9maWxlaW5mbyogemlwZmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aW5kb3dCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVtTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIGNyY0ZvckNyeXB0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgemlwNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7CisKKy8qCisgIFNhbWUgdGhhbiB6aXBPcGVuTmV3RmlsZUluWmlwMiwgZXhjZXB0CisgICAgd2luZG93Qml0cyxtZW1MZXZlbCwsc3RyYXRlZ3kgOiBzZWUgcGFyYW1ldGVyIHN0cmF0ZWd5IGluIGRlZmxhdGVJbml0MgorICAgIHBhc3N3b3JkIDogY3J5cHRpbmcgcGFzc3dvcmQgKE5VTEwgZm9yIG5vIGNyeXB0aW5nKQorICAgIGNyY0ZvckNyeXB0aW5nIDogY3JjIG9mIGZpbGUgdG8gY29tcHJlc3MgKG5lZWRlZCBmb3IgY3J5cHRpbmcpCisgKi8KKworZXh0ZXJuIGludCBaRVhQT1JUIHppcE9wZW5OZXdGaWxlSW5aaXA0IE9GKCh6aXBGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lbUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBjcmNGb3JDcnlwdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgdmVyc2lvbk1hZGVCeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgZmxhZ0Jhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7CisKKworZXh0ZXJuIGludCBaRVhQT1JUIHppcE9wZW5OZXdGaWxlSW5aaXA0XzY0IE9GKCh6aXBGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lbUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBjcmNGb3JDcnlwdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgdmVyc2lvbk1hZGVCeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgZmxhZ0Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB6aXA2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTsKKy8qCisgIFNhbWUgdGhhbiB6aXBPcGVuTmV3RmlsZUluWmlwNCwgZXhjZXB0CisgICAgdmVyc2lvbk1hZGVCeSA6IHZhbHVlIGZvciBWZXJzaW9uIG1hZGUgYnkgZmllbGQKKyAgICBmbGFnIDogdmFsdWUgZm9yIGZsYWcgZmllbGQgKGNvbXByZXNzaW9uIGxldmVsIGluZm8gd2lsbCBiZSBhZGRlZCkKKyAqLworCisKK2V4dGVybiBpbnQgWkVYUE9SVCB6aXBXcml0ZUluRmlsZUluWmlwIE9GKCh6aXBGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGVuKSk7CisvKgorICBXcml0ZSBkYXRhIGluIHRoZSB6aXBmaWxlCisqLworCitleHRlcm4gaW50IFpFWFBPUlQgemlwQ2xvc2VGaWxlSW5aaXAgT0YoKHppcEZpbGUgZmlsZSkpOworLyoKKyAgQ2xvc2UgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgemlwZmlsZQorKi8KKworZXh0ZXJuIGludCBaRVhQT1JUIHppcENsb3NlRmlsZUluWmlwUmF3IE9GKCh6aXBGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIHVuY29tcHJlc3NlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBjcmMzMikpOworCitleHRlcm4gaW50IFpFWFBPUlQgemlwQ2xvc2VGaWxlSW5aaXBSYXc2NCBPRigoemlwRmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaUE9TNjRfVCB1bmNvbXByZXNzZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgY3JjMzIpKTsKKworLyoKKyAgQ2xvc2UgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgemlwZmlsZSwgZm9yIGZpbGUgb3BlbmVkIHdpdGgKKyAgICBwYXJhbWV0ZXIgcmF3PTEgaW4gemlwT3Blbk5ld0ZpbGVJblppcDIKKyAgdW5jb21wcmVzc2VkX3NpemUgYW5kIGNyYzMyIGFyZSB2YWx1ZSBmb3IgdGhlIHVuY29tcHJlc3NlZCBzaXplCisqLworCitleHRlcm4gaW50IFpFWFBPUlQgemlwQ2xvc2UgT0YoKHppcEZpbGUgZmlsZSwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBnbG9iYWxfY29tbWVudCkpOworLyoKKyAgQ2xvc2UgdGhlIHppcGZpbGUKKyovCisKKworZXh0ZXJuIGludCBaRVhQT1JUIHppcFJlbW92ZUV4dHJhSW5mb0Jsb2NrIE9GKChjaGFyKiBwRGF0YSwgaW50KiBkYXRhTGVuLCBzaG9ydCBzSGVhZGVyKSk7CisvKgorICB6aXBSZW1vdmVFeHRyYUluZm9CbG9jayAtICBBZGRlZCBieSBNYXRoaWFzIFN2ZW5zc29uCisKKyAgUmVtb3ZlIGV4dHJhIGluZm9ybWF0aW9uIGJsb2NrIGZyb20gYSBleHRyYSBpbmZvcm1hdGlvbiBkYXRhIGZvciB0aGUgbG9jYWwgZmlsZSBoZWFkZXIgb3IgY2VudHJhbCBkaXJlY3RvcnkgaGVhZGVyCisKKyAgSXQgaXMgbmVlZGVkIHRvIHJlbW92ZSBaSVA2NCBleHRyYSBpbmZvcm1hdGlvbiBibG9ja3Mgd2hlbiBiZWZvcmUgZGF0YSBpcyB3cml0dGVuIGlmIHVzaW5nIFJBVyBtb2RlLgorCisgIDB4MDAwMSBpcyB0aGUgc2lnbmF0dXJlIGhlYWRlciBmb3IgdGhlIFpJUDY0IGV4dHJhIGluZm9ybWF0aW9uIGJsb2NrcworCisgIHVzYWdlLgorICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIFpJUDY0IEV4dHJhIGluZm9ybWF0aW9uIGZyb20gYSBjZW50cmFsIGRpcmVjdG9yIGV4dHJhIGZpZWxkIGRhdGEKKyAgICAgICAgICAgICAgemlwUmVtb3ZlRXh0cmFJbmZvQmxvY2socENlbkRpckV4dHJhRmllbGREYXRhLCAmbkNlbkRpckV4dHJhRmllbGREYXRhTGVuLCAweDAwMDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmUgWklQNjQgRXh0cmEgaW5mb3JtYXRpb24gZnJvbSBhIExvY2FsIEZpbGUgSGVhZGVyIGV4dHJhIGZpZWxkIGRhdGEKKyAgICAgICAgemlwUmVtb3ZlRXh0cmFJbmZvQmxvY2socExvY2FsSGVhZGVyRXh0cmFGaWVsZERhdGEsICZuTG9jYWxIZWFkZXJFeHRyYUZpZWxkRGF0YUxlbiwgMHgwMDAxKTsKKyovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfemlwNjRfSCAqLwpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9wYXNjYWwvZXhhbXBsZS5wYXMgYi96bGliL3NyYy9jb250cmliL3Bhc2NhbC9leGFtcGxlLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTE4YjM2Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi9wYXNjYWwvZXhhbXBsZS5wYXMKQEAgLTAsMCArMSw1OTkgQEAKKygqIGV4YW1wbGUuYyAtLSB1c2FnZSBleGFtcGxlIG9mIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKgorICogUGFzY2FsIHRyYW5zbGF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggYnkgSmFjcXVlcyBOb21zc2kgTnphbGkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcmVhZG1lLnR4dAorICoKKyAqIEFkYXB0YXRpb24gdG8gdGhlIHpsaWJwYXMgaW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgYnkgQ29zbWluIFRydXRhLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHJlYWRtZS50eHQKKyAqKQorCitwcm9ncmFtIGV4YW1wbGU7CisKK3skREVGSU5FIFRFU1RfQ09NUFJFU1N9Cit7RE8gTk9UICRERUZJTkUgVEVTVF9HWklPfQoreyRERUZJTkUgVEVTVF9ERUZMQVRFfQoreyRERUZJTkUgVEVTVF9JTkZMQVRFfQoreyRERUZJTkUgVEVTVF9GTFVTSH0KK3skREVGSU5FIFRFU1RfU1lOQ30KK3skREVGSU5FIFRFU1RfRElDVH0KKwordXNlcyBTeXNVdGlscywgemxpYnBhczsKKworY29uc3QgVEVTVEZJTEUgPSAnZm9vLmd6JzsKKworKCogImhlbGxvIHdvcmxkIiB3b3VsZCBiZSBtb3JlIHN0YW5kYXJkLCBidXQgdGhlIHJlcGVhdGVkICJoZWxsbyIKKyAqIHN0cmVzc2VzIHRoZSBjb21wcmVzc2lvbiBjb2RlIGJldHRlciwgc29ycnkuLi4KKyAqKQorY29uc3QgaGVsbG86IFBDaGFyID0gJ2hlbGxvLCBoZWxsbyEnOworCitjb25zdCBkaWN0aW9uYXJ5OiBQQ2hhciA9ICdoZWxsbyc7CisKK3ZhciBkaWN0SWQ6IExvbmdJbnQ7ICgqIEFkbGVyMzIgdmFsdWUgb2YgdGhlIGRpY3Rpb25hcnkgKikKKworcHJvY2VkdXJlIENIRUNLX0VSUihlcnI6IEludGVnZXI7IG1zZzogU3RyaW5nKTsKK2JlZ2luCisgIGlmIGVyciA8PiBaX09LIHRoZW4KKyAgYmVnaW4KKyAgICBXcml0ZUxuKG1zZywgJyBlcnJvcjogJywgZXJyKTsKKyAgICBIYWx0KDEpOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBFWElUX0VSUihjb25zdCBtc2c6IFN0cmluZyk7CitiZWdpbgorICBXcml0ZUxuKCdFcnJvcjogJywgbXNnKTsKKyAgSGFsdCgxKTsKK2VuZDsKKworKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUZXN0IGNvbXByZXNzIGFuZCB1bmNvbXByZXNzCisgKikKK3skSUZERUYgVEVTVF9DT01QUkVTU30KK3Byb2NlZHVyZSB0ZXN0X2NvbXByZXNzKGNvbXByOiBQb2ludGVyOyBjb21wckxlbjogTG9uZ0ludDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHI6IFBvaW50ZXI7IHVuY29tcHJMZW46IExvbmdJbnQpOwordmFyIGVycjogSW50ZWdlcjsKKyAgICBsZW46IExvbmdJbnQ7CitiZWdpbgorICBsZW4gOj0gU3RyTGVuKGhlbGxvKSsxOworCisgIGVyciA6PSBjb21wcmVzcyhjb21wciwgY29tcHJMZW4sIGhlbGxvLCBsZW4pOworICBDSEVDS19FUlIoZXJyLCAnY29tcHJlc3MnKTsKKworICBTdHJDb3B5KFBDaGFyKHVuY29tcHIpLCAnZ2FyYmFnZScpOworCisgIGVyciA6PSB1bmNvbXByZXNzKHVuY29tcHIsIHVuY29tcHJMZW4sIGNvbXByLCBjb21wckxlbik7CisgIENIRUNLX0VSUihlcnIsICd1bmNvbXByZXNzJyk7CisKKyAgaWYgU3RyQ29tcChQQ2hhcih1bmNvbXByKSwgaGVsbG8pIDw+IDAgdGhlbgorICAgIEVYSVRfRVJSKCdiYWQgdW5jb21wcmVzcycpCisgIGVsc2UKKyAgICBXcml0ZUxuKCd1bmNvbXByZXNzKCk6ICcsIFBDaGFyKHVuY29tcHIpKTsKK2VuZDsKK3skRU5ESUZ9CisKKygqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCByZWFkL3dyaXRlIG9mIC5neiBmaWxlcworICopCit7JElGREVGIFRFU1RfR1pJT30KK3Byb2NlZHVyZSB0ZXN0X2d6aW8oY29uc3QgZm5hbWU6IFBDaGFyOyAoKiBjb21wcmVzc2VkIGZpbGUgbmFtZSAqKQorICAgICAgICAgICAgICAgICAgICB1bmNvbXByOiBQb2ludGVyOworICAgICAgICAgICAgICAgICAgICB1bmNvbXByTGVuOiBMb25nSW50KTsKK3ZhciBlcnI6IEludGVnZXI7CisgICAgbGVuOiBJbnRlZ2VyOworICAgIHpmaWxlOiBnekZpbGU7CisgICAgcG9zOiBMb25nSW50OworYmVnaW4KKyAgbGVuIDo9IFN0ckxlbihoZWxsbykrMTsKKworICB6ZmlsZSA6PSBnem9wZW4oZm5hbWUsICd3YicpOworICBpZiB6ZmlsZSA9IE5JTCB0aGVuCisgIGJlZ2luCisgICAgV3JpdGVMbignZ3pvcGVuIGVycm9yJyk7CisgICAgSGFsdCgxKTsKKyAgZW5kOworICBnenB1dGMoemZpbGUsICdoJyk7CisgIGlmIGd6cHV0cyh6ZmlsZSwgJ2VsbG8nKSA8PiA0IHRoZW4KKyAgYmVnaW4KKyAgICBXcml0ZUxuKCdnenB1dHMgZXJyOiAnLCBnemVycm9yKHpmaWxlLCBlcnIpKTsKKyAgICBIYWx0KDEpOworICBlbmQ7CisgIHskSUZERUYgR1pfRk9STUFUX1NUUklOR30KKyAgaWYgZ3pwcmludGYoemZpbGUsICcsICVzIScsICdoZWxsbycpIDw+IDggdGhlbgorICBiZWdpbgorICAgIFdyaXRlTG4oJ2d6cHJpbnRmIGVycjogJywgZ3plcnJvcih6ZmlsZSwgZXJyKSk7CisgICAgSGFsdCgxKTsKKyAgZW5kOworICB7JEVMU0V9CisgIGlmIGd6cHV0cyh6ZmlsZSwgJywgaGVsbG8hJykgPD4gOCB0aGVuCisgIGJlZ2luCisgICAgV3JpdGVMbignZ3pwdXRzIGVycjogJywgZ3plcnJvcih6ZmlsZSwgZXJyKSk7CisgICAgSGFsdCgxKTsKKyAgZW5kOworICB7JEVORElGfQorICBnenNlZWsoemZpbGUsIDEsIFNFRUtfQ1VSKTsgKCogYWRkIG9uZSB6ZXJvIGJ5dGUgKikKKyAgZ3pjbG9zZSh6ZmlsZSk7CisKKyAgemZpbGUgOj0gZ3pvcGVuKGZuYW1lLCAncmInKTsKKyAgaWYgemZpbGUgPSBOSUwgdGhlbgorICBiZWdpbgorICAgIFdyaXRlTG4oJ2d6b3BlbiBlcnJvcicpOworICAgIEhhbHQoMSk7CisgIGVuZDsKKworICBTdHJDb3B5KFBDaGFyKHVuY29tcHIpLCAnZ2FyYmFnZScpOworCisgIGlmIGd6cmVhZCh6ZmlsZSwgdW5jb21wciwgdW5jb21wckxlbikgPD4gbGVuIHRoZW4KKyAgYmVnaW4KKyAgICBXcml0ZUxuKCdnenJlYWQgZXJyOiAnLCBnemVycm9yKHpmaWxlLCBlcnIpKTsKKyAgICBIYWx0KDEpOworICBlbmQ7CisgIGlmIFN0ckNvbXAoUENoYXIodW5jb21wciksIGhlbGxvKSA8PiAwIHRoZW4KKyAgYmVnaW4KKyAgICBXcml0ZUxuKCdiYWQgZ3pyZWFkOiAnLCBQQ2hhcih1bmNvbXByKSk7CisgICAgSGFsdCgxKTsKKyAgZW5kCisgIGVsc2UKKyAgICBXcml0ZUxuKCdnenJlYWQoKTogJywgUENoYXIodW5jb21wcikpOworCisgIHBvcyA6PSBnenNlZWsoemZpbGUsIC04LCBTRUVLX0NVUik7CisgIGlmIChwb3MgPD4gNikgb3IgKGd6dGVsbCh6ZmlsZSkgPD4gcG9zKSB0aGVuCisgIGJlZ2luCisgICAgV3JpdGVMbignZ3pzZWVrIGVycm9yLCBwb3M9JywgcG9zLCAnLCBnenRlbGw9JywgZ3p0ZWxsKHpmaWxlKSk7CisgICAgSGFsdCgxKTsKKyAgZW5kOworCisgIGlmIGd6Z2V0Yyh6ZmlsZSkgPD4gJyAnIHRoZW4KKyAgYmVnaW4KKyAgICBXcml0ZUxuKCdnemdldGMgZXJyb3InKTsKKyAgICBIYWx0KDEpOworICBlbmQ7CisKKyAgaWYgZ3p1bmdldGMoJyAnLCB6ZmlsZSkgPD4gJyAnIHRoZW4KKyAgYmVnaW4KKyAgICBXcml0ZUxuKCdnenVuZ2V0YyBlcnJvcicpOworICAgIEhhbHQoMSk7CisgIGVuZDsKKworICBnemdldHMoemZpbGUsIFBDaGFyKHVuY29tcHIpLCB1bmNvbXByTGVuKTsKKyAgdW5jb21wckxlbiA6PSBTdHJMZW4oUENoYXIodW5jb21wcikpOworICBpZiB1bmNvbXByTGVuIDw+IDcgdGhlbiAoKiAiIGhlbGxvISIgKikKKyAgYmVnaW4KKyAgICBXcml0ZUxuKCdnemdldHMgZXJyIGFmdGVyIGd6c2VlazogJywgZ3plcnJvcih6ZmlsZSwgZXJyKSk7CisgICAgSGFsdCgxKTsKKyAgZW5kOworICBpZiBTdHJDb21wKFBDaGFyKHVuY29tcHIpLCBoZWxsbyArIDYpIDw+IDAgdGhlbgorICBiZWdpbgorICAgIFdyaXRlTG4oJ2JhZCBnemdldHMgYWZ0ZXIgZ3pzZWVrJyk7CisgICAgSGFsdCgxKTsKKyAgZW5kCisgIGVsc2UKKyAgICBXcml0ZUxuKCdnemdldHMoKSBhZnRlciBnenNlZWs6ICcsIFBDaGFyKHVuY29tcHIpKTsKKworICBnemNsb3NlKHpmaWxlKTsKK2VuZDsKK3skRU5ESUZ9CisKKygqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCBkZWZsYXRlIHdpdGggc21hbGwgYnVmZmVycworICopCit7JElGREVGIFRFU1RfREVGTEFURX0KK3Byb2NlZHVyZSB0ZXN0X2RlZmxhdGUoY29tcHI6IFBvaW50ZXI7IGNvbXByTGVuOiBMb25nSW50KTsKK3ZhciBjX3N0cmVhbTogel9zdHJlYW07ICgqIGNvbXByZXNzaW9uIHN0cmVhbSAqKQorICAgIGVycjogSW50ZWdlcjsKKyAgICBsZW46IExvbmdJbnQ7CitiZWdpbgorICBsZW4gOj0gU3RyTGVuKGhlbGxvKSsxOworCisgIGNfc3RyZWFtLnphbGxvYyA6PSBOSUw7CisgIGNfc3RyZWFtLnpmcmVlIDo9IE5JTDsKKyAgY19zdHJlYW0ub3BhcXVlIDo9IE5JTDsKKworICBlcnIgOj0gZGVmbGF0ZUluaXQoY19zdHJlYW0sIFpfREVGQVVMVF9DT01QUkVTU0lPTik7CisgIENIRUNLX0VSUihlcnIsICdkZWZsYXRlSW5pdCcpOworCisgIGNfc3RyZWFtLm5leHRfaW4gOj0gaGVsbG87CisgIGNfc3RyZWFtLm5leHRfb3V0IDo9IGNvbXByOworCisgIHdoaWxlIChjX3N0cmVhbS50b3RhbF9pbiA8PiBsZW4pIGFuZAorICAgICAgICAoY19zdHJlYW0udG90YWxfb3V0IDwgY29tcHJMZW4pIGRvCisgIGJlZ2luCisgICAgY19zdHJlYW0uYXZhaWxfb3V0IDo9IDE7IHsgZm9yY2Ugc21hbGwgYnVmZmVycyB9CisgICAgY19zdHJlYW0uYXZhaWxfaW4gOj0gMTsKKyAgICBlcnIgOj0gZGVmbGF0ZShjX3N0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgQ0hFQ0tfRVJSKGVyciwgJ2RlZmxhdGUnKTsKKyAgZW5kOworCisgICgqIEZpbmlzaCB0aGUgc3RyZWFtLCBzdGlsbCBmb3JjaW5nIHNtYWxsIGJ1ZmZlcnM6ICopCisgIHdoaWxlIFRSVUUgZG8KKyAgYmVnaW4KKyAgICBjX3N0cmVhbS5hdmFpbF9vdXQgOj0gMTsKKyAgICBlcnIgOj0gZGVmbGF0ZShjX3N0cmVhbSwgWl9GSU5JU0gpOworICAgIGlmIGVyciA9IFpfU1RSRUFNX0VORCB0aGVuCisgICAgICBicmVhazsKKyAgICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZScpOworICBlbmQ7CisKKyAgZXJyIDo9IGRlZmxhdGVFbmQoY19zdHJlYW0pOworICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZUVuZCcpOworZW5kOworeyRFTkRJRn0KKworKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUZXN0IGluZmxhdGUgd2l0aCBzbWFsbCBidWZmZXJzCisgKikKK3skSUZERUYgVEVTVF9JTkZMQVRFfQorcHJvY2VkdXJlIHRlc3RfaW5mbGF0ZShjb21wcjogUG9pbnRlcjsgY29tcHJMZW4gOiBMb25nSW50OworICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByOiBQb2ludGVyOyB1bmNvbXByTGVuIDogTG9uZ0ludCk7Cit2YXIgZXJyOiBJbnRlZ2VyOworICAgIGRfc3RyZWFtOiB6X3N0cmVhbTsgKCogZGVjb21wcmVzc2lvbiBzdHJlYW0gKikKK2JlZ2luCisgIFN0ckNvcHkoUENoYXIodW5jb21wciksICdnYXJiYWdlJyk7CisKKyAgZF9zdHJlYW0uemFsbG9jIDo9IE5JTDsKKyAgZF9zdHJlYW0uemZyZWUgOj0gTklMOworICBkX3N0cmVhbS5vcGFxdWUgOj0gTklMOworCisgIGRfc3RyZWFtLm5leHRfaW4gOj0gY29tcHI7CisgIGRfc3RyZWFtLmF2YWlsX2luIDo9IDA7CisgIGRfc3RyZWFtLm5leHRfb3V0IDo9IHVuY29tcHI7CisKKyAgZXJyIDo9IGluZmxhdGVJbml0KGRfc3RyZWFtKTsKKyAgQ0hFQ0tfRVJSKGVyciwgJ2luZmxhdGVJbml0Jyk7CisKKyAgd2hpbGUgKGRfc3RyZWFtLnRvdGFsX291dCA8IHVuY29tcHJMZW4pIGFuZAorICAgICAgICAoZF9zdHJlYW0udG90YWxfaW4gPCBjb21wckxlbikgZG8KKyAgYmVnaW4KKyAgICBkX3N0cmVhbS5hdmFpbF9vdXQgOj0gMTsgKCogZm9yY2Ugc21hbGwgYnVmZmVycyAqKQorICAgIGRfc3RyZWFtLmF2YWlsX2luIDo9IDE7CisgICAgZXJyIDo9IGluZmxhdGUoZF9zdHJlYW0sIFpfTk9fRkxVU0gpOworICAgIGlmIGVyciA9IFpfU1RSRUFNX0VORCB0aGVuCisgICAgICBicmVhazsKKyAgICBDSEVDS19FUlIoZXJyLCAnaW5mbGF0ZScpOworICBlbmQ7CisKKyAgZXJyIDo9IGluZmxhdGVFbmQoZF9zdHJlYW0pOworICBDSEVDS19FUlIoZXJyLCAnaW5mbGF0ZUVuZCcpOworCisgIGlmIFN0ckNvbXAoUENoYXIodW5jb21wciksIGhlbGxvKSA8PiAwIHRoZW4KKyAgICBFWElUX0VSUignYmFkIGluZmxhdGUnKQorICBlbHNlCisgICAgV3JpdGVMbignaW5mbGF0ZSgpOiAnLCBQQ2hhcih1bmNvbXByKSk7CitlbmQ7Cit7JEVORElGfQorCisoKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRlc3QgZGVmbGF0ZSB3aXRoIGxhcmdlIGJ1ZmZlcnMgYW5kIGR5bmFtaWMgY2hhbmdlIG9mIGNvbXByZXNzaW9uIGxldmVsCisgKikKK3skSUZERUYgVEVTVF9ERUZMQVRFfQorcHJvY2VkdXJlIHRlc3RfbGFyZ2VfZGVmbGF0ZShjb21wcjogUG9pbnRlcjsgY29tcHJMZW46IExvbmdJbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHI6IFBvaW50ZXI7IHVuY29tcHJMZW46IExvbmdJbnQpOwordmFyIGNfc3RyZWFtOiB6X3N0cmVhbTsgKCogY29tcHJlc3Npb24gc3RyZWFtICopCisgICAgZXJyOiBJbnRlZ2VyOworYmVnaW4KKyAgY19zdHJlYW0uemFsbG9jIDo9IE5JTDsKKyAgY19zdHJlYW0uemZyZWUgOj0gTklMOworICBjX3N0cmVhbS5vcGFxdWUgOj0gTklMOworCisgIGVyciA6PSBkZWZsYXRlSW5pdChjX3N0cmVhbSwgWl9CRVNUX1NQRUVEKTsKKyAgQ0hFQ0tfRVJSKGVyciwgJ2RlZmxhdGVJbml0Jyk7CisKKyAgY19zdHJlYW0ubmV4dF9vdXQgOj0gY29tcHI7CisgIGNfc3RyZWFtLmF2YWlsX291dCA6PSBJbnRlZ2VyKGNvbXByTGVuKTsKKworICAoKiBBdCB0aGlzIHBvaW50LCB1bmNvbXByIGlzIHN0aWxsIG1vc3RseSB6ZXJvZXMsIHNvIGl0IHNob3VsZCBjb21wcmVzcworICAgKiB2ZXJ5IHdlbGw6CisgICAqKQorICBjX3N0cmVhbS5uZXh0X2luIDo9IHVuY29tcHI7CisgIGNfc3RyZWFtLmF2YWlsX2luIDo9IEludGVnZXIodW5jb21wckxlbik7CisgIGVyciA6PSBkZWZsYXRlKGNfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgQ0hFQ0tfRVJSKGVyciwgJ2RlZmxhdGUnKTsKKyAgaWYgY19zdHJlYW0uYXZhaWxfaW4gPD4gMCB0aGVuCisgICAgRVhJVF9FUlIoJ2RlZmxhdGUgbm90IGdyZWVkeScpOworCisgICgqIEZlZWQgaW4gYWxyZWFkeSBjb21wcmVzc2VkIGRhdGEgYW5kIHN3aXRjaCB0byBubyBjb21wcmVzc2lvbjogKikKKyAgZGVmbGF0ZVBhcmFtcyhjX3N0cmVhbSwgWl9OT19DT01QUkVTU0lPTiwgWl9ERUZBVUxUX1NUUkFURUdZKTsKKyAgY19zdHJlYW0ubmV4dF9pbiA6PSBjb21wcjsKKyAgY19zdHJlYW0uYXZhaWxfaW4gOj0gSW50ZWdlcihjb21wckxlbiBkaXYgMik7CisgIGVyciA6PSBkZWZsYXRlKGNfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgQ0hFQ0tfRVJSKGVyciwgJ2RlZmxhdGUnKTsKKworICAoKiBTd2l0Y2ggYmFjayB0byBjb21wcmVzc2luZyBtb2RlOiAqKQorICBkZWZsYXRlUGFyYW1zKGNfc3RyZWFtLCBaX0JFU1RfQ09NUFJFU1NJT04sIFpfRklMVEVSRUQpOworICBjX3N0cmVhbS5uZXh0X2luIDo9IHVuY29tcHI7CisgIGNfc3RyZWFtLmF2YWlsX2luIDo9IEludGVnZXIodW5jb21wckxlbik7CisgIGVyciA6PSBkZWZsYXRlKGNfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgQ0hFQ0tfRVJSKGVyciwgJ2RlZmxhdGUnKTsKKworICBlcnIgOj0gZGVmbGF0ZShjX3N0cmVhbSwgWl9GSU5JU0gpOworICBpZiBlcnIgPD4gWl9TVFJFQU1fRU5EIHRoZW4KKyAgICBFWElUX0VSUignZGVmbGF0ZSBzaG91bGQgcmVwb3J0IFpfU1RSRUFNX0VORCcpOworCisgIGVyciA6PSBkZWZsYXRlRW5kKGNfc3RyZWFtKTsKKyAgQ0hFQ0tfRVJSKGVyciwgJ2RlZmxhdGVFbmQnKTsKK2VuZDsKK3skRU5ESUZ9CisKKygqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCBpbmZsYXRlIHdpdGggbGFyZ2UgYnVmZmVycworICopCit7JElGREVGIFRFU1RfSU5GTEFURX0KK3Byb2NlZHVyZSB0ZXN0X2xhcmdlX2luZmxhdGUoY29tcHI6IFBvaW50ZXI7IGNvbXByTGVuOiBMb25nSW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByOiBQb2ludGVyOyB1bmNvbXByTGVuOiBMb25nSW50KTsKK3ZhciBlcnI6IEludGVnZXI7CisgICAgZF9zdHJlYW06IHpfc3RyZWFtOyAoKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqKQorYmVnaW4KKyAgU3RyQ29weShQQ2hhcih1bmNvbXByKSwgJ2dhcmJhZ2UnKTsKKworICBkX3N0cmVhbS56YWxsb2MgOj0gTklMOworICBkX3N0cmVhbS56ZnJlZSA6PSBOSUw7CisgIGRfc3RyZWFtLm9wYXF1ZSA6PSBOSUw7CisKKyAgZF9zdHJlYW0ubmV4dF9pbiA6PSBjb21wcjsKKyAgZF9zdHJlYW0uYXZhaWxfaW4gOj0gSW50ZWdlcihjb21wckxlbik7CisKKyAgZXJyIDo9IGluZmxhdGVJbml0KGRfc3RyZWFtKTsKKyAgQ0hFQ0tfRVJSKGVyciwgJ2luZmxhdGVJbml0Jyk7CisKKyAgd2hpbGUgVFJVRSBkbworICBiZWdpbgorICAgIGRfc3RyZWFtLm5leHRfb3V0IDo9IHVuY29tcHI7ICAgICAgICAgICAgKCogZGlzY2FyZCB0aGUgb3V0cHV0ICopCisgICAgZF9zdHJlYW0uYXZhaWxfb3V0IDo9IEludGVnZXIodW5jb21wckxlbik7CisgICAgZXJyIDo9IGluZmxhdGUoZF9zdHJlYW0sIFpfTk9fRkxVU0gpOworICAgIGlmIGVyciA9IFpfU1RSRUFNX0VORCB0aGVuCisgICAgICBicmVhazsKKyAgICBDSEVDS19FUlIoZXJyLCAnbGFyZ2UgaW5mbGF0ZScpOworICBlbmQ7CisKKyAgZXJyIDo9IGluZmxhdGVFbmQoZF9zdHJlYW0pOworICBDSEVDS19FUlIoZXJyLCAnaW5mbGF0ZUVuZCcpOworCisgIGlmIGRfc3RyZWFtLnRvdGFsX291dCA8PiAyICogdW5jb21wckxlbiArIGNvbXByTGVuIGRpdiAyIHRoZW4KKyAgYmVnaW4KKyAgICBXcml0ZUxuKCdiYWQgbGFyZ2UgaW5mbGF0ZTogJywgZF9zdHJlYW0udG90YWxfb3V0KTsKKyAgICBIYWx0KDEpOworICBlbmQKKyAgZWxzZQorICAgIFdyaXRlTG4oJ2xhcmdlX2luZmxhdGUoKTogT0snKTsKK2VuZDsKK3skRU5ESUZ9CisKKygqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCBkZWZsYXRlIHdpdGggZnVsbCBmbHVzaAorICopCit7JElGREVGIFRFU1RfRkxVU0h9Citwcm9jZWR1cmUgdGVzdF9mbHVzaChjb21wcjogUG9pbnRlcjsgdmFyIGNvbXByTGVuIDogTG9uZ0ludCk7Cit2YXIgY19zdHJlYW06IHpfc3RyZWFtOyAoKiBjb21wcmVzc2lvbiBzdHJlYW0gKikKKyAgICBlcnI6IEludGVnZXI7CisgICAgbGVuOiBJbnRlZ2VyOworYmVnaW4KKyAgbGVuIDo9IFN0ckxlbihoZWxsbykrMTsKKworICBjX3N0cmVhbS56YWxsb2MgOj0gTklMOworICBjX3N0cmVhbS56ZnJlZSA6PSBOSUw7CisgIGNfc3RyZWFtLm9wYXF1ZSA6PSBOSUw7CisKKyAgZXJyIDo9IGRlZmxhdGVJbml0KGNfc3RyZWFtLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04pOworICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZUluaXQnKTsKKworICBjX3N0cmVhbS5uZXh0X2luIDo9IGhlbGxvOworICBjX3N0cmVhbS5uZXh0X291dCA6PSBjb21wcjsKKyAgY19zdHJlYW0uYXZhaWxfaW4gOj0gMzsKKyAgY19zdHJlYW0uYXZhaWxfb3V0IDo9IEludGVnZXIoY29tcHJMZW4pOworICBlcnIgOj0gZGVmbGF0ZShjX3N0cmVhbSwgWl9GVUxMX0ZMVVNIKTsKKyAgQ0hFQ0tfRVJSKGVyciwgJ2RlZmxhdGUnKTsKKworICBJbmMoUEJ5dGVBcnJheShjb21wcileWzNdKTsgKCogZm9yY2UgYW4gZXJyb3IgaW4gZmlyc3QgY29tcHJlc3NlZCBibG9jayAqKQorICBjX3N0cmVhbS5hdmFpbF9pbiA6PSBsZW4gLSAzOworCisgIGVyciA6PSBkZWZsYXRlKGNfc3RyZWFtLCBaX0ZJTklTSCk7CisgIGlmIGVyciA8PiBaX1NUUkVBTV9FTkQgdGhlbgorICAgIENIRUNLX0VSUihlcnIsICdkZWZsYXRlJyk7CisKKyAgZXJyIDo9IGRlZmxhdGVFbmQoY19zdHJlYW0pOworICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZUVuZCcpOworCisgIGNvbXByTGVuIDo9IGNfc3RyZWFtLnRvdGFsX291dDsKK2VuZDsKK3skRU5ESUZ9CisKKygqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCBpbmZsYXRlU3luYygpCisgKikKK3skSUZERUYgVEVTVF9TWU5DfQorcHJvY2VkdXJlIHRlc3Rfc3luYyhjb21wcjogUG9pbnRlcjsgY29tcHJMZW46IExvbmdJbnQ7CisgICAgICAgICAgICAgICAgICAgIHVuY29tcHI6IFBvaW50ZXI7IHVuY29tcHJMZW4gOiBMb25nSW50KTsKK3ZhciBlcnI6IEludGVnZXI7CisgICAgZF9zdHJlYW06IHpfc3RyZWFtOyAoKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqKQorYmVnaW4KKyAgU3RyQ29weShQQ2hhcih1bmNvbXByKSwgJ2dhcmJhZ2UnKTsKKworICBkX3N0cmVhbS56YWxsb2MgOj0gTklMOworICBkX3N0cmVhbS56ZnJlZSA6PSBOSUw7CisgIGRfc3RyZWFtLm9wYXF1ZSA6PSBOSUw7CisKKyAgZF9zdHJlYW0ubmV4dF9pbiA6PSBjb21wcjsKKyAgZF9zdHJlYW0uYXZhaWxfaW4gOj0gMjsgKCoganVzdCByZWFkIHRoZSB6bGliIGhlYWRlciAqKQorCisgIGVyciA6PSBpbmZsYXRlSW5pdChkX3N0cmVhbSk7CisgIENIRUNLX0VSUihlcnIsICdpbmZsYXRlSW5pdCcpOworCisgIGRfc3RyZWFtLm5leHRfb3V0IDo9IHVuY29tcHI7CisgIGRfc3RyZWFtLmF2YWlsX291dCA6PSBJbnRlZ2VyKHVuY29tcHJMZW4pOworCisgIGluZmxhdGUoZF9zdHJlYW0sIFpfTk9fRkxVU0gpOworICBDSEVDS19FUlIoZXJyLCAnaW5mbGF0ZScpOworCisgIGRfc3RyZWFtLmF2YWlsX2luIDo9IEludGVnZXIoY29tcHJMZW4tMik7ICAgKCogcmVhZCBhbGwgY29tcHJlc3NlZCBkYXRhICopCisgIGVyciA6PSBpbmZsYXRlU3luYyhkX3N0cmVhbSk7ICAgICAgICAgICAgICAgKCogYnV0IHNraXAgdGhlIGRhbWFnZWQgcGFydCAqKQorICBDSEVDS19FUlIoZXJyLCAnaW5mbGF0ZVN5bmMnKTsKKworICBlcnIgOj0gaW5mbGF0ZShkX3N0cmVhbSwgWl9GSU5JU0gpOworICBpZiBlcnIgPD4gWl9EQVRBX0VSUk9SIHRoZW4KKyAgICBFWElUX0VSUignaW5mbGF0ZSBzaG91bGQgcmVwb3J0IERBVEFfRVJST1InKTsKKyAgICAoKiBCZWNhdXNlIG9mIGluY29ycmVjdCBhZGxlcjMyICopCisKKyAgZXJyIDo9IGluZmxhdGVFbmQoZF9zdHJlYW0pOworICBDSEVDS19FUlIoZXJyLCAnaW5mbGF0ZUVuZCcpOworCisgIFdyaXRlTG4oJ2FmdGVyIGluZmxhdGVTeW5jKCk6IGhlbCcsIFBDaGFyKHVuY29tcHIpKTsKK2VuZDsKK3skRU5ESUZ9CisKKygqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCBkZWZsYXRlIHdpdGggcHJlc2V0IGRpY3Rpb25hcnkKKyAqKQoreyRJRkRFRiBURVNUX0RJQ1R9Citwcm9jZWR1cmUgdGVzdF9kaWN0X2RlZmxhdGUoY29tcHI6IFBvaW50ZXI7IGNvbXByTGVuOiBMb25nSW50KTsKK3ZhciBjX3N0cmVhbTogel9zdHJlYW07ICgqIGNvbXByZXNzaW9uIHN0cmVhbSAqKQorICAgIGVycjogSW50ZWdlcjsKK2JlZ2luCisgIGNfc3RyZWFtLnphbGxvYyA6PSBOSUw7CisgIGNfc3RyZWFtLnpmcmVlIDo9IE5JTDsKKyAgY19zdHJlYW0ub3BhcXVlIDo9IE5JTDsKKworICBlcnIgOj0gZGVmbGF0ZUluaXQoY19zdHJlYW0sIFpfQkVTVF9DT01QUkVTU0lPTik7CisgIENIRUNLX0VSUihlcnIsICdkZWZsYXRlSW5pdCcpOworCisgIGVyciA6PSBkZWZsYXRlU2V0RGljdGlvbmFyeShjX3N0cmVhbSwgZGljdGlvbmFyeSwgU3RyTGVuKGRpY3Rpb25hcnkpKTsKKyAgQ0hFQ0tfRVJSKGVyciwgJ2RlZmxhdGVTZXREaWN0aW9uYXJ5Jyk7CisKKyAgZGljdElkIDo9IGNfc3RyZWFtLmFkbGVyOworICBjX3N0cmVhbS5uZXh0X291dCA6PSBjb21wcjsKKyAgY19zdHJlYW0uYXZhaWxfb3V0IDo9IEludGVnZXIoY29tcHJMZW4pOworCisgIGNfc3RyZWFtLm5leHRfaW4gOj0gaGVsbG87CisgIGNfc3RyZWFtLmF2YWlsX2luIDo9IFN0ckxlbihoZWxsbykrMTsKKworICBlcnIgOj0gZGVmbGF0ZShjX3N0cmVhbSwgWl9GSU5JU0gpOworICBpZiBlcnIgPD4gWl9TVFJFQU1fRU5EIHRoZW4KKyAgICBFWElUX0VSUignZGVmbGF0ZSBzaG91bGQgcmVwb3J0IFpfU1RSRUFNX0VORCcpOworCisgIGVyciA6PSBkZWZsYXRlRW5kKGNfc3RyZWFtKTsKKyAgQ0hFQ0tfRVJSKGVyciwgJ2RlZmxhdGVFbmQnKTsKK2VuZDsKK3skRU5ESUZ9CisKKygqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCBpbmZsYXRlIHdpdGggYSBwcmVzZXQgZGljdGlvbmFyeQorICopCit7JElGREVGIFRFU1RfRElDVH0KK3Byb2NlZHVyZSB0ZXN0X2RpY3RfaW5mbGF0ZShjb21wcjogUG9pbnRlcjsgY29tcHJMZW46IExvbmdJbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcjogUG9pbnRlcjsgdW5jb21wckxlbjogTG9uZ0ludCk7Cit2YXIgZXJyOiBJbnRlZ2VyOworICAgIGRfc3RyZWFtOiB6X3N0cmVhbTsgKCogZGVjb21wcmVzc2lvbiBzdHJlYW0gKikKK2JlZ2luCisgIFN0ckNvcHkoUENoYXIodW5jb21wciksICdnYXJiYWdlJyk7CisKKyAgZF9zdHJlYW0uemFsbG9jIDo9IE5JTDsKKyAgZF9zdHJlYW0uemZyZWUgOj0gTklMOworICBkX3N0cmVhbS5vcGFxdWUgOj0gTklMOworCisgIGRfc3RyZWFtLm5leHRfaW4gOj0gY29tcHI7CisgIGRfc3RyZWFtLmF2YWlsX2luIDo9IEludGVnZXIoY29tcHJMZW4pOworCisgIGVyciA6PSBpbmZsYXRlSW5pdChkX3N0cmVhbSk7CisgIENIRUNLX0VSUihlcnIsICdpbmZsYXRlSW5pdCcpOworCisgIGRfc3RyZWFtLm5leHRfb3V0IDo9IHVuY29tcHI7CisgIGRfc3RyZWFtLmF2YWlsX291dCA6PSBJbnRlZ2VyKHVuY29tcHJMZW4pOworCisgIHdoaWxlIFRSVUUgZG8KKyAgYmVnaW4KKyAgICBlcnIgOj0gaW5mbGF0ZShkX3N0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgaWYgZXJyID0gWl9TVFJFQU1fRU5EIHRoZW4KKyAgICAgIGJyZWFrOworICAgIGlmIGVyciA9IFpfTkVFRF9ESUNUIHRoZW4KKyAgICBiZWdpbgorICAgICAgaWYgZF9zdHJlYW0uYWRsZXIgPD4gZGljdElkIHRoZW4KKyAgICAgICAgRVhJVF9FUlIoJ3VuZXhwZWN0ZWQgZGljdGlvbmFyeScpOworICAgICAgZXJyIDo9IGluZmxhdGVTZXREaWN0aW9uYXJ5KGRfc3RyZWFtLCBkaWN0aW9uYXJ5LCBTdHJMZW4oZGljdGlvbmFyeSkpOworICAgIGVuZDsKKyAgICBDSEVDS19FUlIoZXJyLCAnaW5mbGF0ZSB3aXRoIGRpY3QnKTsKKyAgZW5kOworCisgIGVyciA6PSBpbmZsYXRlRW5kKGRfc3RyZWFtKTsKKyAgQ0hFQ0tfRVJSKGVyciwgJ2luZmxhdGVFbmQnKTsKKworICBpZiBTdHJDb21wKFBDaGFyKHVuY29tcHIpLCBoZWxsbykgPD4gMCB0aGVuCisgICAgRVhJVF9FUlIoJ2JhZCBpbmZsYXRlIHdpdGggZGljdCcpCisgIGVsc2UKKyAgICBXcml0ZUxuKCdpbmZsYXRlIHdpdGggZGljdGlvbmFyeTogJywgUENoYXIodW5jb21wcikpOworZW5kOworeyRFTkRJRn0KKwordmFyIGNvbXByLCB1bmNvbXByOiBQb2ludGVyOworICAgIGNvbXByTGVuLCB1bmNvbXByTGVuOiBMb25nSW50OworCitiZWdpbgorICBpZiB6bGliVmVyc2lvbl4gPD4gWkxJQl9WRVJTSU9OWzFdIHRoZW4KKyAgICBFWElUX0VSUignSW5jb21wYXRpYmxlIHpsaWIgdmVyc2lvbicpOworCisgIFdyaXRlTG4oJ3psaWIgdmVyc2lvbjogJywgemxpYlZlcnNpb24pOworICBXcml0ZUxuKCd6bGliIGNvbXBpbGUgZmxhZ3M6ICcsIEZvcm1hdCgnMHgleCcsIFt6bGliQ29tcGlsZUZsYWdzXSkpOworCisgIGNvbXByTGVuIDo9IDEwMDAwICogU2l6ZU9mKEludGVnZXIpOyAoKiBkb24ndCBvdmVyZmxvdyBvbiBNU0RPUyAqKQorICB1bmNvbXByTGVuIDo9IGNvbXByTGVuOworICBHZXRNZW0oY29tcHIsIGNvbXByTGVuKTsKKyAgR2V0TWVtKHVuY29tcHIsIHVuY29tcHJMZW4pOworICBpZiAoY29tcHIgPSBOSUwpIG9yICh1bmNvbXByID0gTklMKSB0aGVuCisgICAgRVhJVF9FUlIoJ091dCBvZiBtZW1vcnknKTsKKyAgKCogY29tcHIgYW5kIHVuY29tcHIgYXJlIGNsZWFyZWQgdG8gYXZvaWQgcmVhZGluZyB1bmluaXRpYWxpemVkCisgICAqIGRhdGEgYW5kIHRvIGVuc3VyZSB0aGF0IHVuY29tcHIgY29tcHJlc3NlcyB3ZWxsLgorICAgKikKKyAgRmlsbENoYXIoY29tcHJeLCBjb21wckxlbiwgMCk7CisgIEZpbGxDaGFyKHVuY29tcHJeLCB1bmNvbXByTGVuLCAwKTsKKworICB7JElGREVGIFRFU1RfQ09NUFJFU1N9CisgIFdyaXRlTG4oJyoqIFRlc3RpbmcgY29tcHJlc3MnKTsKKyAgdGVzdF9jb21wcmVzcyhjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pOworICB7JEVORElGfQorCisgIHskSUZERUYgVEVTVF9HWklPfQorICBXcml0ZUxuKCcqKiBUZXN0aW5nIGd6aW8nKTsKKyAgaWYgUGFyYW1Db3VudCA+PSAxIHRoZW4KKyAgICB0ZXN0X2d6aW8oUGFyYW1TdHIoMSksIHVuY29tcHIsIHVuY29tcHJMZW4pCisgIGVsc2UKKyAgICB0ZXN0X2d6aW8oVEVTVEZJTEUsIHVuY29tcHIsIHVuY29tcHJMZW4pOworICB7JEVORElGfQorCisgIHskSUZERUYgVEVTVF9ERUZMQVRFfQorICBXcml0ZUxuKCcqKiBUZXN0aW5nIGRlZmxhdGUgd2l0aCBzbWFsbCBidWZmZXJzJyk7CisgIHRlc3RfZGVmbGF0ZShjb21wciwgY29tcHJMZW4pOworICB7JEVORElGfQorICB7JElGREVGIFRFU1RfSU5GTEFURX0KKyAgV3JpdGVMbignKiogVGVzdGluZyBpbmZsYXRlIHdpdGggc21hbGwgYnVmZmVycycpOworICB0ZXN0X2luZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKKyAgeyRFTkRJRn0KKworICB7JElGREVGIFRFU1RfREVGTEFURX0KKyAgV3JpdGVMbignKiogVGVzdGluZyBkZWZsYXRlIHdpdGggbGFyZ2UgYnVmZmVycycpOworICB0ZXN0X2xhcmdlX2RlZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKKyAgeyRFTkRJRn0KKyAgeyRJRkRFRiBURVNUX0lORkxBVEV9CisgIFdyaXRlTG4oJyoqIFRlc3RpbmcgaW5mbGF0ZSB3aXRoIGxhcmdlIGJ1ZmZlcnMnKTsKKyAgdGVzdF9sYXJnZV9pbmZsYXRlKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7CisgIHskRU5ESUZ9CisKKyAgeyRJRkRFRiBURVNUX0ZMVVNIfQorICBXcml0ZUxuKCcqKiBUZXN0aW5nIGRlZmxhdGUgd2l0aCBmdWxsIGZsdXNoJyk7CisgIHRlc3RfZmx1c2goY29tcHIsIGNvbXByTGVuKTsKKyAgeyRFTkRJRn0KKyAgeyRJRkRFRiBURVNUX1NZTkN9CisgIFdyaXRlTG4oJyoqIFRlc3RpbmcgaW5mbGF0ZVN5bmMnKTsKKyAgdGVzdF9zeW5jKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7CisgIHskRU5ESUZ9CisgIGNvbXByTGVuIDo9IHVuY29tcHJMZW47CisKKyAgeyRJRkRFRiBURVNUX0RJQ1R9CisgIFdyaXRlTG4oJyoqIFRlc3RpbmcgZGVmbGF0ZSBhbmQgaW5mbGF0ZSB3aXRoIHByZXNldCBkaWN0aW9uYXJ5Jyk7CisgIHRlc3RfZGljdF9kZWZsYXRlKGNvbXByLCBjb21wckxlbik7CisgIHRlc3RfZGljdF9pbmZsYXRlKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7CisgIHskRU5ESUZ9CisKKyAgRnJlZU1lbShjb21wciwgY29tcHJMZW4pOworICBGcmVlTWVtKHVuY29tcHIsIHVuY29tcHJMZW4pOworZW5kLgpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9wYXNjYWwvcmVhZG1lLnR4dCBiL3psaWIvc3JjL2NvbnRyaWIvcGFzY2FsL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBlODdjOAotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvcGFzY2FsL3JlYWRtZS50eHQKQEAgLTAsMCArMSw3NiBAQAorCitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBhIFBhc2NhbCAoRGVscGhpLCBLeWxpeCkgaW50ZXJmYWNlIHRvIHRoZQoremxpYiBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKworRGlyZWN0b3J5IGxpc3RpbmcKKz09PT09PT09PT09PT09PT09CisKK3psaWJkMzIubWFrICAgICBtYWtlZmlsZSBmb3IgQm9ybGFuZCBDKysKK2V4YW1wbGUucGFzICAgICB1c2FnZSBleGFtcGxlIG9mIHpsaWIKK3psaWJwYXMucGFzICAgICB0aGUgUGFzY2FsIGludGVyZmFjZSB0byB6bGliCityZWFkbWUudHh0ICAgICAgdGhpcyBmaWxlCisKKworQ29tcGF0aWJpbGl0eSBub3RlcworPT09PT09PT09PT09PT09PT09PQorCistIEFsdGhvdWdoIHRoZSBuYW1lICJ6bGliIiB3b3VsZCBoYXZlIGJlZW4gbW9yZSBub3JtYWwgZm9yIHRoZQorICB6bGlicGFzIHVuaXQsIHRoaXMgbmFtZSBpcyBhbHJlYWR5IHRha2VuIGJ5IEJvcmxhbmQncyBaTGliIHVuaXQuCisgIFRoaXMgaXMgc29tZWhvdyB1bmZvcnR1bmF0ZSwgYmVjYXVzZSB0aGF0IHVuaXQgaXMgbm90IGEgZ2VudWluZQorICBpbnRlcmZhY2UgdG8gdGhlIGZ1bGwtZmxlZGdlZCB6bGliIGZ1bmN0aW9uYWxpdHksIGJ1dCBhIHN1aXRlIG9mCisgIGNsYXNzIHdyYXBwZXJzIGFyb3VuZCB6bGliIHN0cmVhbXMuICBPdGhlciBlc3NlbnRpYWwgZmVhdHVyZXMsCisgIHN1Y2ggYXMgY2hlY2tzdW1zLCBhcmUgbWlzc2luZy4KKyAgSXQgd291bGQgaGF2ZSBiZWVuIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHRoYXQgdW5pdCB0byBoYXZlIGEgbmFtZQorICBsaWtlICJaU3RyZWFtcyIsIG9yIHNvbWV0aGluZyBzaW1pbGFyLgorCistIFRoZSBDIGFuZCB6bGliLXN1cHBsaWVkIHR5cGVzIGludCwgdUludCwgbG9uZywgdUxvbmcsIGV0Yy4gYXJlCisgIHRyYW5zbGF0ZWQgZGlyZWN0bHkgaW50byBQYXNjYWwgdHlwZXMgb2Ygc2ltaWxhciBzaXplcyAoSW50ZWdlciwKKyAgTG9uZ0ludCwgZXRjLiksIHRvIGF2b2lkIG5hbWVzcGFjZSBwb2xsdXRpb24uICBJbiBwYXJ0aWN1bGFyLAorICB0aGVyZSBpcyBubyBjb252ZXJzaW9uIG9mIHVuc2lnbmVkIGludCBpbnRvIGEgUGFzY2FsIHVuc2lnbmVkCisgIGludGVnZXIuICBUaGUgV29yZCB0eXBlIGlzIG5vbi1wb3J0YWJsZSBhbmQgaGFzIHRoZSBzYW1lIHNpemUKKyAgKDE2IGJpdHMpIGJvdGggaW4gYSAxNi1iaXQgYW5kIGluIGEgMzItYml0IGVudmlyb25tZW50LCB1bmxpa2UKKyAgSW50ZWdlci4gIEV2ZW4gaWYgdGhlcmUgaXMgYSAzMi1iaXQgQ2FyZGluYWwgdHlwZSwgdGhlcmUgaXMgbm8KKyAgcmVhbCBuZWVkIGZvciB1bnNpZ25lZCBpbnQgaW4gemxpYiB1bmRlciBhIDMyLWJpdCBlbnZpcm9ubWVudC4KKworLSBFeGNlcHQgZm9yIHRoZSBjYWxsYmFja3MsIHRoZSB6bGliIGZ1bmN0aW9uIGludGVyZmFjZXMgYXJlCisgIGFzc3VtaW5nIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gbm9ybWFsbHkgdXNlZCBpbiBQYXNjYWwKKyAgKF9fcGFzY2FsIGZvciBET1MgYW5kIFdpbmRvd3MxNiwgX19mYXN0Y2FsbCBmb3IgV2luZG93czMyKS4KKyAgU2luY2UgdGhlIGNkZWNsIGtleXdvcmQgaXMgdXNlZCwgdGhlIG9sZCBUdXJibyBQYXNjYWwgZG9lcworICBub3Qgd29yayB3aXRoIHRoaXMgaW50ZXJmYWNlLgorCistIFRoZSBneiogZnVuY3Rpb24gaW50ZXJmYWNlcyBhcmUgbm90IHRyYW5zbGF0ZWQsIHRvIGF2b2lkCisgIGludGVyZmFjaW5nIHByb2JsZW1zIHdpdGggdGhlIEMgcnVudGltZSBsaWJyYXJ5LiAgQmVzaWRlcywKKyAgICBnenByaW50ZihnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisgIGNhbm5vdCBiZSB0cmFuc2xhdGVkIGludG8gUGFzY2FsLgorCisKK0xlZ2FsIGlzc3VlcworPT09PT09PT09PT09CisKK1RoZSB6bGlicGFzIGludGVyZmFjZSBpczoKKyAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlci4KKyAgQ29weXJpZ2h0IChDKSAxOTk4IGJ5IEJvYiBEZWxsYWNhLgorICBDb3B5cmlnaHQgKEMpIDIwMDMgYnkgQ29zbWluIFRydXRhLgorCitUaGUgZXhhbXBsZSBwcm9ncmFtIGlzOgorICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBieSBKZWFuLWxvdXAgR2FpbGx5LgorICBDb3B5cmlnaHQgKEMpIDE5OTgsMTk5OSwyMDAwIGJ5IEphY3F1ZXMgTm9tc3NpIE56YWxpLgorICBDb3B5cmlnaHQgKEMpIDIwMDMgYnkgQ29zbWluIFRydXRhLgorCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9yIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorCisgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL3Bhc2NhbC96bGliZDMyLm1hayBiL3psaWIvc3JjL2NvbnRyaWIvcGFzY2FsL3psaWJkMzIubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYjAwYjcKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3Bhc2NhbC96bGliZDMyLm1hawpAQCAtMCwwICsxLDk5IEBACisjIE1ha2VmaWxlIGZvciB6bGliCisjIEZvciB1c2Ugd2l0aCBEZWxwaGkgYW5kIEMrKyBCdWlsZGVyIHVuZGVyIFdpbjMyCisjIFVwZGF0ZWQgZm9yIHpsaWIgMS4yLnggYnkgQ29zbWluIFRydXRhCisKKyMgLS0tLS0tLS0tLS0tIEJvcmxhbmQgQysrIC0tLS0tLS0tLS0tLQorCisjIFRoaXMgcHJvamVjdCB1c2VzIHRoZSBEZWxwaGkgKGZhc3RjYWxsL3JlZ2lzdGVyKSBjYWxsaW5nIGNvbnZlbnRpb246CitMT0MgPSAtRFpFWFBPUlQ9X19mYXN0Y2FsbCAtRFpFWFBPUlRWQT1fX2NkZWNsCisKK0NDID0gYmNjMzIKK0xEID0gYmNjMzIKK0FSID0gdGxpYgorIyBkbyBub3QgdXNlICItcHIiIGluIENGTEFHUworQ0ZMQUdTID0gLWEgLWQgLWstIC1PMiAkKExPQykKK0xERkxBR1MgPQorCisKKyMgdmFyaWFibGVzCitaTElCX0xJQiA9IHpsaWIubGliCisKK09CSjEgPSBhZGxlcjMyLm9iaiBjb21wcmVzcy5vYmogY3JjMzIub2JqIGRlZmxhdGUub2JqIGd6Y2xvc2Uub2JqIGd6bGliLm9iaiBnenJlYWQub2JqCitPQkoyID0gZ3p3cml0ZS5vYmogaW5mYmFjay5vYmogaW5mZmFzdC5vYmogaW5mbGF0ZS5vYmogaW5mdHJlZXMub2JqIHRyZWVzLm9iaiB1bmNvbXByLm9iaiB6dXRpbC5vYmoKK09CSlAxID0gK2FkbGVyMzIub2JqK2NvbXByZXNzLm9iaitjcmMzMi5vYmorZGVmbGF0ZS5vYmorZ3pjbG9zZS5vYmorZ3psaWIub2JqK2d6cmVhZC5vYmoKK09CSlAyID0gK2d6d3JpdGUub2JqK2luZmJhY2sub2JqK2luZmZhc3Qub2JqK2luZmxhdGUub2JqK2luZnRyZWVzLm9iait0cmVlcy5vYmordW5jb21wci5vYmorenV0aWwub2JqCisKKworIyB0YXJnZXRzCithbGw6ICQoWkxJQl9MSUIpIGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQorCisuYy5vYmo6CisJJChDQykgLWMgJChDRkxBR1MpICQqLmMKKworYWRsZXIzMi5vYmo6IGFkbGVyMzIuYyB6bGliLmggemNvbmYuaAorCitjb21wcmVzcy5vYmo6IGNvbXByZXNzLmMgemxpYi5oIHpjb25mLmgKKworY3JjMzIub2JqOiBjcmMzMi5jIHpsaWIuaCB6Y29uZi5oIGNyYzMyLmgKKworZGVmbGF0ZS5vYmo6IGRlZmxhdGUuYyBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAorCitnemNsb3NlLm9iajogZ3pjbG9zZS5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCisKK2d6bGliLm9iajogZ3psaWIuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAorCitnenJlYWQub2JqOiBnenJlYWQuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAorCitnendyaXRlLm9iajogZ3p3cml0ZS5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCisKK2luZmJhY2sub2JqOiBpbmZiYWNrLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCisgaW5mZmFzdC5oIGluZmZpeGVkLmgKKworaW5mZmFzdC5vYmo6IGluZmZhc3QuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKKyBpbmZmYXN0LmgKKworaW5mbGF0ZS5vYmo6IGluZmxhdGUuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKKyBpbmZmYXN0LmggaW5mZml4ZWQuaAorCitpbmZ0cmVlcy5vYmo6IGluZnRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCisKK3RyZWVzLm9iajogdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGRlZmxhdGUuaCB0cmVlcy5oCisKK3VuY29tcHIub2JqOiB1bmNvbXByLmMgemxpYi5oIHpjb25mLmgKKworenV0aWwub2JqOiB6dXRpbC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKKworZXhhbXBsZS5vYmo6IHRlc3QvZXhhbXBsZS5jIHpsaWIuaCB6Y29uZi5oCisKK21pbmlnemlwLm9iajogdGVzdC9taW5pZ3ppcC5jIHpsaWIuaCB6Y29uZi5oCisKKworIyBGb3IgdGhlIHNha2Ugb2YgdGhlIG9sZCBCb3JsYW5kIG1ha2UsCisjIHRoZSBjb21tYW5kIGxpbmUgaXMgY3V0IHRvIGZpdCBpbiB0aGUgTVMtRE9TIDEyOCBieXRlIGxpbWl0OgorJChaTElCX0xJQik6ICQoT0JKMSkgJChPQkoyKQorCS1kZWwgJChaTElCX0xJQikKKwkkKEFSKSAkKFpMSUJfTElCKSAkKE9CSlAxKQorCSQoQVIpICQoWkxJQl9MSUIpICQoT0JKUDIpCisKKworIyB0ZXN0aW5nCit0ZXN0OiBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKKwlleGFtcGxlCisJZWNobyBoZWxsbyB3b3JsZCB8IG1pbmlnemlwIHwgbWluaWd6aXAgLWQKKworZXhhbXBsZS5leGU6IGV4YW1wbGUub2JqICQoWkxJQl9MSUIpCisJJChMRCkgJChMREZMQUdTKSBleGFtcGxlLm9iaiAkKFpMSUJfTElCKQorCittaW5pZ3ppcC5leGU6IG1pbmlnemlwLm9iaiAkKFpMSUJfTElCKQorCSQoTEQpICQoTERGTEFHUykgbWluaWd6aXAub2JqICQoWkxJQl9MSUIpCisKKworIyBjbGVhbnVwCitjbGVhbjoKKwktZGVsICoub2JqCisJLWRlbCAqLmV4ZQorCS1kZWwgKi5saWIKKwktZGVsICoudGRzCisJLWRlbCB6bGliLmJhaworCS1kZWwgZm9vLmd6CisKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvcGFzY2FsL3psaWJwYXMucGFzIGIvemxpYi9zcmMvY29udHJpYi9wYXNjYWwvemxpYnBhcy5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZhMDc4MgotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvcGFzY2FsL3psaWJwYXMucGFzCkBAIC0wLDAgKzEsMjc2IEBACisoKiB6bGlicGFzIC0tIFBhc2NhbCBpbnRlcmZhY2UgdG8gdGhlIHpsaWIgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvc21pbiBUcnV0YS4KKyAqIERlcml2ZWQgZnJvbSBvcmlnaW5hbCBzb3VyY2VzIGJ5IEJvYiBEZWxsYWNhLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHJlYWRtZS50eHQKKyAqKQorCit1bml0IHpsaWJwYXM7CisKK2ludGVyZmFjZQorCitjb25zdAorICBaTElCX1ZFUlNJT04gPSAnMS4yLjgnOworICBaTElCX1ZFUk5VTSAgPSAkMTI4MDsKKwordHlwZQorICBhbGxvY19mdW5jID0gZnVuY3Rpb24ob3BhcXVlOiBQb2ludGVyOyBpdGVtcywgc2l6ZTogSW50ZWdlcik6IFBvaW50ZXI7CisgICAgICAgICAgICAgICAgIGNkZWNsOworICBmcmVlX2Z1bmMgID0gcHJvY2VkdXJlKG9wYXF1ZSwgYWRkcmVzczogUG9pbnRlcik7CisgICAgICAgICAgICAgICAgIGNkZWNsOworCisgIGluX2Z1bmMgICAgPSBmdW5jdGlvbihvcGFxdWU6IFBvaW50ZXI7IHZhciBidWY6IFBCeXRlKTogSW50ZWdlcjsKKyAgICAgICAgICAgICAgICAgY2RlY2w7CisgIG91dF9mdW5jICAgPSBmdW5jdGlvbihvcGFxdWU6IFBvaW50ZXI7IGJ1ZjogUEJ5dGU7IHNpemU6IEludGVnZXIpOiBJbnRlZ2VyOworICAgICAgICAgICAgICAgICBjZGVjbDsKKworICB6X3N0cmVhbXAgPSBeel9zdHJlYW07CisgIHpfc3RyZWFtID0gcGFja2VkIHJlY29yZAorICAgIG5leHRfaW46IFBDaGFyOyAgICAgICAoKiBuZXh0IGlucHV0IGJ5dGUgKikKKyAgICBhdmFpbF9pbjogSW50ZWdlcjsgICAgKCogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhdCBuZXh0X2luICopCisgICAgdG90YWxfaW46IExvbmdJbnQ7ICAgICgqIHRvdGFsIG5iIG9mIGlucHV0IGJ5dGVzIHJlYWQgc28gZmFyICopCisKKyAgICBuZXh0X291dDogUENoYXI7ICAgICAgKCogbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlICopCisgICAgYXZhaWxfb3V0OiBJbnRlZ2VyOyAgICgqIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IG5leHRfb3V0ICopCisgICAgdG90YWxfb3V0OiBMb25nSW50OyAgICgqIHRvdGFsIG5iIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIgKikKKworICAgIG1zZzogUENoYXI7ICAgICAgICAgICAoKiBsYXN0IGVycm9yIG1lc3NhZ2UsIE5VTEwgaWYgbm8gZXJyb3IgKikKKyAgICBzdGF0ZTogUG9pbnRlcjsgICAgICAgKCogbm90IHZpc2libGUgYnkgYXBwbGljYXRpb25zICopCisKKyAgICB6YWxsb2M6IGFsbG9jX2Z1bmM7ICAgKCogdXNlZCB0byBhbGxvY2F0ZSB0aGUgaW50ZXJuYWwgc3RhdGUgKikKKyAgICB6ZnJlZTogZnJlZV9mdW5jOyAgICAgKCogdXNlZCB0byBmcmVlIHRoZSBpbnRlcm5hbCBzdGF0ZSAqKQorICAgIG9wYXF1ZTogUG9pbnRlcjsgICAgICAoKiBwcml2YXRlIGRhdGEgb2JqZWN0IHBhc3NlZCB0byB6YWxsb2MgYW5kIHpmcmVlICopCisKKyAgICBkYXRhX3R5cGU6IEludGVnZXI7ICAgKCogYmVzdCBndWVzcyBhYm91dCB0aGUgZGF0YSB0eXBlOiBhc2NpaSBvciBiaW5hcnkgKikKKyAgICBhZGxlcjogTG9uZ0ludDsgICAgICAgKCogYWRsZXIzMiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKikKKyAgICByZXNlcnZlZDogTG9uZ0ludDsgICAgKCogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKikKKyAgZW5kOworCisgIGd6X2hlYWRlcnAgPSBeZ3pfaGVhZGVyOworICBnel9oZWFkZXIgPSBwYWNrZWQgcmVjb3JkCisgICAgdGV4dDogSW50ZWdlcjsgICAgICAgICgqIHRydWUgaWYgY29tcHJlc3NlZCBkYXRhIGJlbGlldmVkIHRvIGJlIHRleHQgKikKKyAgICB0aW1lOiBMb25nSW50OyAgICAgICAgKCogbW9kaWZpY2F0aW9uIHRpbWUgKikKKyAgICB4ZmxhZ3M6IEludGVnZXI7ICAgICAgKCogZXh0cmEgZmxhZ3MgKG5vdCB1c2VkIHdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKikKKyAgICBvczogSW50ZWdlcjsgICAgICAgICAgKCogb3BlcmF0aW5nIHN5c3RlbSAqKQorICAgIGV4dHJhOiBQQ2hhcjsgICAgICAgICAoKiBwb2ludGVyIHRvIGV4dHJhIGZpZWxkIG9yIFpfTlVMTCBpZiBub25lICopCisgICAgZXh0cmFfbGVuOiBJbnRlZ2VyOyAgICgqIGV4dHJhIGZpZWxkIGxlbmd0aCAodmFsaWQgaWYgZXh0cmEgIT0gWl9OVUxMKSAqKQorICAgIGV4dHJhX21heDogSW50ZWdlcjsgICAoKiBzcGFjZSBhdCBleHRyYSAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqKQorICAgIG5hbWU6IFBDaGFyOyAgICAgICAgICAoKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBmaWxlIG5hbWUgb3IgWl9OVUxMICopCisgICAgbmFtZV9tYXg6IEludGVnZXI7ICAgICgqIHNwYWNlIGF0IG5hbWUgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKikKKyAgICBjb21tZW50OiBQQ2hhcjsgICAgICAgKCogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgY29tbWVudCBvciBaX05VTEwgKikKKyAgICBjb21tX21heDogSW50ZWdlcjsgICAgKCogc3BhY2UgYXQgY29tbWVudCAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqKQorICAgIGhjcmM6IEludGVnZXI7ICAgICAgICAoKiB0cnVlIGlmIHRoZXJlIHdhcyBvciB3aWxsIGJlIGEgaGVhZGVyIGNyYyAqKQorICAgIGRvbmU6IEludGVnZXI7ICAgICAgICAoKiB0cnVlIHdoZW4gZG9uZSByZWFkaW5nIGd6aXAgaGVhZGVyICopCisgIGVuZDsKKworKCogY29uc3RhbnRzICopCitjb25zdAorICBaX05PX0ZMVVNIICAgICAgPSAwOworICBaX1BBUlRJQUxfRkxVU0ggPSAxOworICBaX1NZTkNfRkxVU0ggICAgPSAyOworICBaX0ZVTExfRkxVU0ggICAgPSAzOworICBaX0ZJTklTSCAgICAgICAgPSA0OworICBaX0JMT0NLICAgICAgICAgPSA1OworICBaX1RSRUVTICAgICAgICAgPSA2OworCisgIFpfT0sgICAgICAgICAgICA9ICAwOworICBaX1NUUkVBTV9FTkQgICAgPSAgMTsKKyAgWl9ORUVEX0RJQ1QgICAgID0gIDI7CisgIFpfRVJSTk8gICAgICAgICA9IC0xOworICBaX1NUUkVBTV9FUlJPUiAgPSAtMjsKKyAgWl9EQVRBX0VSUk9SICAgID0gLTM7CisgIFpfTUVNX0VSUk9SICAgICA9IC00OworICBaX0JVRl9FUlJPUiAgICAgPSAtNTsKKyAgWl9WRVJTSU9OX0VSUk9SID0gLTY7CisKKyAgWl9OT19DT01QUkVTU0lPTiAgICAgICA9ICAwOworICBaX0JFU1RfU1BFRUQgICAgICAgICAgID0gIDE7CisgIFpfQkVTVF9DT01QUkVTU0lPTiAgICAgPSAgOTsKKyAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OICA9IC0xOworCisgIFpfRklMVEVSRUQgICAgICAgICAgICA9IDE7CisgIFpfSFVGRk1BTl9PTkxZICAgICAgICA9IDI7CisgIFpfUkxFICAgICAgICAgICAgICAgICA9IDM7CisgIFpfRklYRUQgICAgICAgICAgICAgICA9IDQ7CisgIFpfREVGQVVMVF9TVFJBVEVHWSAgICA9IDA7CisKKyAgWl9CSU5BUlkgICA9IDA7CisgIFpfVEVYVCAgICAgPSAxOworICBaX0FTQ0lJICAgID0gMTsKKyAgWl9VTktOT1dOICA9IDI7CisKKyAgWl9ERUZMQVRFRCA9IDg7CisKKygqIGJhc2ljIGZ1bmN0aW9ucyAqKQorZnVuY3Rpb24gemxpYlZlcnNpb246IFBDaGFyOworZnVuY3Rpb24gZGVmbGF0ZUluaXQodmFyIHN0cm06IHpfc3RyZWFtOyBsZXZlbDogSW50ZWdlcik6IEludGVnZXI7CitmdW5jdGlvbiBkZWZsYXRlKHZhciBzdHJtOiB6X3N0cmVhbTsgZmx1c2g6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gZGVmbGF0ZUVuZCh2YXIgc3RybTogel9zdHJlYW0pOiBJbnRlZ2VyOworZnVuY3Rpb24gaW5mbGF0ZUluaXQodmFyIHN0cm06IHpfc3RyZWFtKTogSW50ZWdlcjsKK2Z1bmN0aW9uIGluZmxhdGUodmFyIHN0cm06IHpfc3RyZWFtOyBmbHVzaDogSW50ZWdlcik6IEludGVnZXI7CitmdW5jdGlvbiBpbmZsYXRlRW5kKHZhciBzdHJtOiB6X3N0cmVhbSk6IEludGVnZXI7CisKKygqIGFkdmFuY2VkIGZ1bmN0aW9ucyAqKQorZnVuY3Rpb24gZGVmbGF0ZUluaXQyKHZhciBzdHJtOiB6X3N0cmVhbTsgbGV2ZWwsIG1ldGhvZCwgd2luZG93Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICBtZW1MZXZlbCwgc3RyYXRlZ3k6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gZGVmbGF0ZVNldERpY3Rpb25hcnkodmFyIHN0cm06IHpfc3RyZWFtOyBjb25zdCBkaWN0aW9uYXJ5OiBQQ2hhcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3RMZW5ndGg6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gZGVmbGF0ZUNvcHkodmFyIGRlc3QsIHNvdXJjZTogel9zdHJlYW0pOiBJbnRlZ2VyOworZnVuY3Rpb24gZGVmbGF0ZVJlc2V0KHZhciBzdHJtOiB6X3N0cmVhbSk6IEludGVnZXI7CitmdW5jdGlvbiBkZWZsYXRlUGFyYW1zKHZhciBzdHJtOiB6X3N0cmVhbTsgbGV2ZWwsIHN0cmF0ZWd5OiBJbnRlZ2VyKTogSW50ZWdlcjsKK2Z1bmN0aW9uIGRlZmxhdGVUdW5lKHZhciBzdHJtOiB6X3N0cmVhbTsgZ29vZF9sZW5ndGgsIG1heF9sYXp5LCBuaWNlX2xlbmd0aCwgbWF4X2NoYWluOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2Z1bmN0aW9uIGRlZmxhdGVCb3VuZCh2YXIgc3RybTogel9zdHJlYW07IHNvdXJjZUxlbjogTG9uZ0ludCk6IExvbmdJbnQ7CitmdW5jdGlvbiBkZWZsYXRlUGVuZGluZyh2YXIgc3RybTogel9zdHJlYW07IHZhciBwZW5kaW5nOiBJbnRlZ2VyOyB2YXIgYml0czogSW50ZWdlcik6IEludGVnZXI7CitmdW5jdGlvbiBkZWZsYXRlUHJpbWUodmFyIHN0cm06IHpfc3RyZWFtOyBiaXRzLCB2YWx1ZTogSW50ZWdlcik6IEludGVnZXI7CitmdW5jdGlvbiBkZWZsYXRlU2V0SGVhZGVyKHZhciBzdHJtOiB6X3N0cmVhbTsgaGVhZDogZ3pfaGVhZGVyKTogSW50ZWdlcjsKK2Z1bmN0aW9uIGluZmxhdGVJbml0Mih2YXIgc3RybTogel9zdHJlYW07IHdpbmRvd0JpdHM6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gaW5mbGF0ZVNldERpY3Rpb25hcnkodmFyIHN0cm06IHpfc3RyZWFtOyBjb25zdCBkaWN0aW9uYXJ5OiBQQ2hhcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3RMZW5ndGg6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gaW5mbGF0ZVN5bmModmFyIHN0cm06IHpfc3RyZWFtKTogSW50ZWdlcjsKK2Z1bmN0aW9uIGluZmxhdGVDb3B5KHZhciBkZXN0LCBzb3VyY2U6IHpfc3RyZWFtKTogSW50ZWdlcjsKK2Z1bmN0aW9uIGluZmxhdGVSZXNldCh2YXIgc3RybTogel9zdHJlYW0pOiBJbnRlZ2VyOworZnVuY3Rpb24gaW5mbGF0ZVJlc2V0Mih2YXIgc3RybTogel9zdHJlYW07IHdpbmRvd0JpdHM6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gaW5mbGF0ZVByaW1lKHZhciBzdHJtOiB6X3N0cmVhbTsgYml0cywgdmFsdWU6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gaW5mbGF0ZU1hcmsodmFyIHN0cm06IHpfc3RyZWFtKTogTG9uZ0ludDsKK2Z1bmN0aW9uIGluZmxhdGVHZXRIZWFkZXIodmFyIHN0cm06IHpfc3RyZWFtOyB2YXIgaGVhZDogZ3pfaGVhZGVyKTogSW50ZWdlcjsKK2Z1bmN0aW9uIGluZmxhdGVCYWNrSW5pdCh2YXIgc3RybTogel9zdHJlYW07CisgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Qml0czogSW50ZWdlcjsgd2luZG93OiBQQ2hhcik6IEludGVnZXI7CitmdW5jdGlvbiBpbmZsYXRlQmFjayh2YXIgc3RybTogel9zdHJlYW07IGluX2ZuOiBpbl9mdW5jOyBpbl9kZXNjOiBQb2ludGVyOworICAgICAgICAgICAgICAgICAgICAgb3V0X2ZuOiBvdXRfZnVuYzsgb3V0X2Rlc2M6IFBvaW50ZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gaW5mbGF0ZUJhY2tFbmQodmFyIHN0cm06IHpfc3RyZWFtKTogSW50ZWdlcjsKK2Z1bmN0aW9uIHpsaWJDb21waWxlRmxhZ3M6IExvbmdJbnQ7CisKKygqIHV0aWxpdHkgZnVuY3Rpb25zICopCitmdW5jdGlvbiBjb21wcmVzcyhkZXN0OiBQQ2hhcjsgdmFyIGRlc3RMZW46IExvbmdJbnQ7CisgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2U6IFBDaGFyOyBzb3VyY2VMZW46IExvbmdJbnQpOiBJbnRlZ2VyOworZnVuY3Rpb24gY29tcHJlc3MyKGRlc3Q6IFBDaGFyOyB2YXIgZGVzdExlbjogTG9uZ0ludDsKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZTogUENoYXI7IHNvdXJjZUxlbjogTG9uZ0ludDsKKyAgICAgICAgICAgICAgICAgIGxldmVsOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2Z1bmN0aW9uIGNvbXByZXNzQm91bmQoc291cmNlTGVuOiBMb25nSW50KTogTG9uZ0ludDsKK2Z1bmN0aW9uIHVuY29tcHJlc3MoZGVzdDogUENoYXI7IHZhciBkZXN0TGVuOiBMb25nSW50OworICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2U6IFBDaGFyOyBzb3VyY2VMZW46IExvbmdJbnQpOiBJbnRlZ2VyOworCisoKiBjaGVja3N1bSBmdW5jdGlvbnMgKikKK2Z1bmN0aW9uIGFkbGVyMzIoYWRsZXI6IExvbmdJbnQ7IGNvbnN0IGJ1ZjogUENoYXI7IGxlbjogSW50ZWdlcik6IExvbmdJbnQ7CitmdW5jdGlvbiBhZGxlcjMyX2NvbWJpbmUoYWRsZXIxLCBhZGxlcjIsIGxlbjI6IExvbmdJbnQpOiBMb25nSW50OworZnVuY3Rpb24gY3JjMzIoY3JjOiBMb25nSW50OyBjb25zdCBidWY6IFBDaGFyOyBsZW46IEludGVnZXIpOiBMb25nSW50OworZnVuY3Rpb24gY3JjMzJfY29tYmluZShjcmMxLCBjcmMyLCBsZW4yOiBMb25nSW50KTogTG9uZ0ludDsKKworKCogdmFyaW91cyBoYWNrcywgZG9uJ3QgbG9vayA6KSAqKQorZnVuY3Rpb24gZGVmbGF0ZUluaXRfKHZhciBzdHJtOiB6X3N0cmVhbTsgbGV2ZWw6IEludGVnZXI7CisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVyc2lvbjogUENoYXI7IHN0cmVhbV9zaXplOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2Z1bmN0aW9uIGluZmxhdGVJbml0Xyh2YXIgc3RybTogel9zdHJlYW07IGNvbnN0IHZlcnNpb246IFBDaGFyOworICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9zaXplOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2Z1bmN0aW9uIGRlZmxhdGVJbml0Ml8odmFyIHN0cm06IHpfc3RyZWFtOworICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwgbWV0aG9kLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3k6IEludGVnZXI7CisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnNpb246IFBDaGFyOyBzdHJlYW1fc2l6ZTogSW50ZWdlcik6IEludGVnZXI7CitmdW5jdGlvbiBpbmZsYXRlSW5pdDJfKHZhciBzdHJtOiB6X3N0cmVhbTsgd2luZG93Qml0czogSW50ZWdlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVyc2lvbjogUENoYXI7IHN0cmVhbV9zaXplOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2Z1bmN0aW9uIGluZmxhdGVCYWNrSW5pdF8odmFyIHN0cm06IHpfc3RyZWFtOworICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dCaXRzOiBJbnRlZ2VyOyB3aW5kb3c6IFBDaGFyOworICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZXJzaW9uOiBQQ2hhcjsgc3RyZWFtX3NpemU6IEludGVnZXIpOiBJbnRlZ2VyOworCisKK2ltcGxlbWVudGF0aW9uCisKK3skTCBhZGxlcjMyLm9ian0KK3skTCBjb21wcmVzcy5vYmp9Cit7JEwgY3JjMzIub2JqfQoreyRMIGRlZmxhdGUub2JqfQoreyRMIGluZmJhY2sub2JqfQoreyRMIGluZmZhc3Qub2JqfQoreyRMIGluZmxhdGUub2JqfQoreyRMIGluZnRyZWVzLm9ian0KK3skTCB0cmVlcy5vYmp9Cit7JEwgdW5jb21wci5vYmp9Cit7JEwgenV0aWwub2JqfQorCitmdW5jdGlvbiBhZGxlcjMyOyBleHRlcm5hbDsKK2Z1bmN0aW9uIGFkbGVyMzJfY29tYmluZTsgZXh0ZXJuYWw7CitmdW5jdGlvbiBjb21wcmVzczsgZXh0ZXJuYWw7CitmdW5jdGlvbiBjb21wcmVzczI7IGV4dGVybmFsOworZnVuY3Rpb24gY29tcHJlc3NCb3VuZDsgZXh0ZXJuYWw7CitmdW5jdGlvbiBjcmMzMjsgZXh0ZXJuYWw7CitmdW5jdGlvbiBjcmMzMl9jb21iaW5lOyBleHRlcm5hbDsKK2Z1bmN0aW9uIGRlZmxhdGU7IGV4dGVybmFsOworZnVuY3Rpb24gZGVmbGF0ZUJvdW5kOyBleHRlcm5hbDsKK2Z1bmN0aW9uIGRlZmxhdGVDb3B5OyBleHRlcm5hbDsKK2Z1bmN0aW9uIGRlZmxhdGVFbmQ7IGV4dGVybmFsOworZnVuY3Rpb24gZGVmbGF0ZUluaXRfOyBleHRlcm5hbDsKK2Z1bmN0aW9uIGRlZmxhdGVJbml0Ml87IGV4dGVybmFsOworZnVuY3Rpb24gZGVmbGF0ZVBhcmFtczsgZXh0ZXJuYWw7CitmdW5jdGlvbiBkZWZsYXRlUGVuZGluZzsgZXh0ZXJuYWw7CitmdW5jdGlvbiBkZWZsYXRlUHJpbWU7IGV4dGVybmFsOworZnVuY3Rpb24gZGVmbGF0ZVJlc2V0OyBleHRlcm5hbDsKK2Z1bmN0aW9uIGRlZmxhdGVTZXREaWN0aW9uYXJ5OyBleHRlcm5hbDsKK2Z1bmN0aW9uIGRlZmxhdGVTZXRIZWFkZXI7IGV4dGVybmFsOworZnVuY3Rpb24gZGVmbGF0ZVR1bmU7IGV4dGVybmFsOworZnVuY3Rpb24gaW5mbGF0ZTsgZXh0ZXJuYWw7CitmdW5jdGlvbiBpbmZsYXRlQmFjazsgZXh0ZXJuYWw7CitmdW5jdGlvbiBpbmZsYXRlQmFja0VuZDsgZXh0ZXJuYWw7CitmdW5jdGlvbiBpbmZsYXRlQmFja0luaXRfOyBleHRlcm5hbDsKK2Z1bmN0aW9uIGluZmxhdGVDb3B5OyBleHRlcm5hbDsKK2Z1bmN0aW9uIGluZmxhdGVFbmQ7IGV4dGVybmFsOworZnVuY3Rpb24gaW5mbGF0ZUdldEhlYWRlcjsgZXh0ZXJuYWw7CitmdW5jdGlvbiBpbmZsYXRlSW5pdF87IGV4dGVybmFsOworZnVuY3Rpb24gaW5mbGF0ZUluaXQyXzsgZXh0ZXJuYWw7CitmdW5jdGlvbiBpbmZsYXRlTWFyazsgZXh0ZXJuYWw7CitmdW5jdGlvbiBpbmZsYXRlUHJpbWU7IGV4dGVybmFsOworZnVuY3Rpb24gaW5mbGF0ZVJlc2V0OyBleHRlcm5hbDsKK2Z1bmN0aW9uIGluZmxhdGVSZXNldDI7IGV4dGVybmFsOworZnVuY3Rpb24gaW5mbGF0ZVNldERpY3Rpb25hcnk7IGV4dGVybmFsOworZnVuY3Rpb24gaW5mbGF0ZVN5bmM7IGV4dGVybmFsOworZnVuY3Rpb24gdW5jb21wcmVzczsgZXh0ZXJuYWw7CitmdW5jdGlvbiB6bGliQ29tcGlsZUZsYWdzOyBleHRlcm5hbDsKK2Z1bmN0aW9uIHpsaWJWZXJzaW9uOyBleHRlcm5hbDsKKworZnVuY3Rpb24gZGVmbGF0ZUluaXQodmFyIHN0cm06IHpfc3RyZWFtOyBsZXZlbDogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gZGVmbGF0ZUluaXRfKHN0cm0sIGxldmVsLCBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpOworZW5kOworCitmdW5jdGlvbiBkZWZsYXRlSW5pdDIodmFyIHN0cm06IHpfc3RyZWFtOyBsZXZlbCwgbWV0aG9kLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneTogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gZGVmbGF0ZUluaXQyXyhzdHJtLCBsZXZlbCwgbWV0aG9kLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSk7CitlbmQ7CisKK2Z1bmN0aW9uIGluZmxhdGVJbml0KHZhciBzdHJtOiB6X3N0cmVhbSk6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gaW5mbGF0ZUluaXRfKHN0cm0sIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSk7CitlbmQ7CisKK2Z1bmN0aW9uIGluZmxhdGVJbml0Mih2YXIgc3RybTogel9zdHJlYW07IHdpbmRvd0JpdHM6IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IGluZmxhdGVJbml0Ml8oc3RybSwgd2luZG93Qml0cywgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKTsKK2VuZDsKKworZnVuY3Rpb24gaW5mbGF0ZUJhY2tJbml0KHZhciBzdHJtOiB6X3N0cmVhbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dCaXRzOiBJbnRlZ2VyOyB3aW5kb3c6IFBDaGFyKTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBpbmZsYXRlQmFja0luaXRfKHN0cm0sIHdpbmRvd0JpdHMsIHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKTsKK2VuZDsKKworZnVuY3Rpb24gX21hbGxvYyhTaXplOiBJbnRlZ2VyKTogUG9pbnRlcjsgY2RlY2w7CitiZWdpbgorICBHZXRNZW0oUmVzdWx0LCBTaXplKTsKK2VuZDsKKworcHJvY2VkdXJlIF9mcmVlKEJsb2NrOiBQb2ludGVyKTsgY2RlY2w7CitiZWdpbgorICBGcmVlTWVtKEJsb2NrKTsKK2VuZDsKKworcHJvY2VkdXJlIF9tZW1zZXQoUDogUG9pbnRlcjsgQjogQnl0ZTsgY291bnQ6IEludGVnZXIpOyBjZGVjbDsKK2JlZ2luCisgIEZpbGxDaGFyKFBeLCBjb3VudCwgQik7CitlbmQ7CisKK3Byb2NlZHVyZSBfbWVtY3B5KGRlc3QsIHNvdXJjZTogUG9pbnRlcjsgY291bnQ6IEludGVnZXIpOyBjZGVjbDsKK2JlZ2luCisgIE1vdmUoc291cmNlXiwgZGVzdF4sIGNvdW50KTsKK2VuZDsKKworZW5kLgpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9wdWZmL01ha2VmaWxlIGIvemxpYi9zcmMvY29udHJpYi9wdWZmL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMjU5NGMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3B1ZmYvTWFrZWZpbGUKQEAgLTAsMCArMSw0MiBAQAorQ0ZMQUdTPS1PCisKK3B1ZmY6IHB1ZmYubyBwdWZmdGVzdC5vCisKK3B1ZmYubzogcHVmZi5oCisKK3B1ZmZ0ZXN0Lm86IHB1ZmYuaAorCit0ZXN0OiBwdWZmCisJcHVmZiB6ZXJvcy5yYXcKKworcHVmdDogcHVmZi5jIHB1ZmYuaCBwdWZmdGVzdC5vCisJY2MgLWZwcm9maWxlLWFyY3MgLWZ0ZXN0LWNvdmVyYWdlIC1vIHB1ZnQgcHVmZi5jIHB1ZmZ0ZXN0Lm8KKworIyBwdWZmIGZ1bGwgY292ZXJhZ2UgdGVzdCAoc2hvdWxkIHNheSAxMDAlKQorY292OiBwdWZ0CisJQHJtIC1mICouZ2NvdiAqLmdjZGEKKwlAcHVmdCAtdyB6ZXJvcy5yYXcgMj4mMSB8IGNhdCA+IC9kZXYvbnVsbAorCUBlY2hvICcwNCcgfCB4eGQgLXIgLXAgfCBwdWZ0IDI+IC9kZXYvbnVsbCB8fCB0ZXN0ICQkPyAtZXEgMgorCUBlY2hvICcwMCcgfCB4eGQgLXIgLXAgfCBwdWZ0IDI+IC9kZXYvbnVsbCB8fCB0ZXN0ICQkPyAtZXEgMgorCUBlY2hvICcwMCAwMCAwMCAwMCAwMCcgfCB4eGQgLXIgLXAgfCBwdWZ0IDI+IC9kZXYvbnVsbCB8fCB0ZXN0ICQkPyAtZXEgMjU0CisJQGVjaG8gJzAwIDAxIDAwIGZlIGZmJyB8IHh4ZCAtciAtcCB8IHB1ZnQgMj4gL2Rldi9udWxsIHx8IHRlc3QgJCQ/IC1lcSAyCisJQGVjaG8gJzAxIDAxIDAwIGZlIGZmIDBhJyB8IHh4ZCAtciAtcCB8IHB1ZnQgLWYgMj4mMSB8IGNhdCA+IC9kZXYvbnVsbAorCUBlY2hvICcwMiA3ZSBmZiBmZicgfCB4eGQgLXIgLXAgfCBwdWZ0IDI+IC9kZXYvbnVsbCB8fCB0ZXN0ICQkPyAtZXEgMjQ2CisJQGVjaG8gJzAyJyB8IHh4ZCAtciAtcCB8IHB1ZnQgMj4gL2Rldi9udWxsIHx8IHRlc3QgJCQ/IC1lcSAyCisJQGVjaG8gJzA0IDgwIDQ5IDkyIDI0IDQ5IDkyIDI0IDBmIGI0IGZmIGZmIGMzIDA0JyB8IHh4ZCAtciAtcCB8IHB1ZnQgMj4gL2Rldi9udWxsIHx8IHRlc3QgJCQ/IC1lcSAyCisJQGVjaG8gJzA0IDgwIDQ5IDkyIDI0IDQ5IDkyIDI0IDcxIGZmIGZmIDkzIDExIDAwJyB8IHh4ZCAtciAtcCB8IHB1ZnQgMj4gL2Rldi9udWxsIHx8IHRlc3QgJCQ/IC1lcSAyNDkKKwlAZWNobyAnMDQgYzAgODEgMDggMDAgMDAgMDAgMDAgMjAgN2YgZWIgMGIgMDAgMDAnIHwgeHhkIC1yIC1wIHwgcHVmdCAyPiAvZGV2L251bGwgfHwgdGVzdCAkJD8gLWVxIDI0NgorCUBlY2hvICcwYiAwMCAwMCcgfCB4eGQgLXIgLXAgfCBwdWZ0IC1mIDI+JjEgfCBjYXQgPiAvZGV2L251bGwKKwlAZWNobyAnMWEgMDcnIHwgeHhkIC1yIC1wIHwgcHVmdCAyPiAvZGV2L251bGwgfHwgdGVzdCAkJD8gLWVxIDI0NgorCUBlY2hvICcwYyBjMCA4MSAwMCAwMCAwMCAwMCAwMCA5MCBmZiA2YiAwNCcgfCB4eGQgLXIgLXAgfCBwdWZ0IDI+IC9kZXYvbnVsbCB8fCB0ZXN0ICQkPyAtZXEgMjQ1CisJQHB1ZnQgLWYgemVyb3MucmF3IDI+JjEgfCBjYXQgPiAvZGV2L251bGwKKwlAZWNobyAnZmMgMDAgMDAnIHwgeHhkIC1yIC1wIHwgcHVmdCAyPiAvZGV2L251bGwgfHwgdGVzdCAkJD8gLWVxIDI1MworCUBlY2hvICcwNCAwMCBmZSBmZicgfCB4eGQgLXIgLXAgfCBwdWZ0IDI+IC9kZXYvbnVsbCB8fCB0ZXN0ICQkPyAtZXEgMjUyCisJQGVjaG8gJzA0IDAwIDI0IDQ5JyB8IHh4ZCAtciAtcCB8IHB1ZnQgMj4gL2Rldi9udWxsIHx8IHRlc3QgJCQ/IC1lcSAyNTEKKwlAZWNobyAnMDQgODAgNDkgOTIgMjQgNDkgOTIgMjQgMGYgYjQgZmYgZmYgYzMgODQnIHwgeHhkIC1yIC1wIHwgcHVmdCAyPiAvZGV2L251bGwgfHwgdGVzdCAkJD8gLWVxIDI0OAorCUBlY2hvICcwNCAwMCAyNCBlOSBmZiBmZicgfCB4eGQgLXIgLXAgfCBwdWZ0IDI+IC9kZXYvbnVsbCB8fCB0ZXN0ICQkPyAtZXEgMjUwCisJQGVjaG8gJzA0IDAwIDI0IGU5IGZmIDZkJyB8IHh4ZCAtciAtcCB8IHB1ZnQgMj4gL2Rldi9udWxsIHx8IHRlc3QgJCQ/IC1lcSAyNDcKKwlAZ2NvdiAtbiBwdWZmLmMKKworY2xlYW46CisJcm0gLWYgcHVmZiBwdWZ0ICoubyAqLmdjKgpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9wdWZmL1JFQURNRSBiL3psaWIvc3JjL2NvbnRyaWIvcHVmZi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJjNGNiNQotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvcHVmZi9SRUFETUUKQEAgLTAsMCArMSw2MyBAQAorUHVmZiAtLSBBIFNpbXBsZSBJbmZsYXRlCiszIE1hciAyMDAzCitNYXJrIEFkbGVyCittYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CisKK1doYXQgdGhpcyBpcyAtLQorCitwdWZmLmMgcHJvdmlkZXMgdGhlIHJvdXRpbmUgcHVmZigpIHRvIGRlY29tcHJlc3MgdGhlIGRlZmxhdGUgZGF0YSBmb3JtYXQuICBJdAorZG9lcyBzbyBtb3JlIHNsb3dseSB0aGFuIHpsaWIsIGJ1dCB0aGUgY29kZSBpcyBhYm91dCBvbmUtZmlmdGggdGhlIHNpemUgb2YgdGhlCitpbmZsYXRlIGNvZGUgaW4gemxpYiwgYW5kIHdyaXR0ZW4gdG8gYmUgdmVyeSBlYXN5IHRvIHJlYWQuCisKK1doeSBJIHdyb3RlIHRoaXMgLS0KKworcHVmZi5jIHdhcyB3cml0dGVuIHRvIGRvY3VtZW50IHRoZSBkZWZsYXRlIGZvcm1hdCB1bmFtYmlndW91c2x5LCBieSB2aXJ0dWUgb2YKK2JlaW5nIHdvcmtpbmcgQyBjb2RlLiAgSXQgaXMgbWVhbnQgdG8gc3VwcGxlbWVudCBSRkMgMTk1MSwgd2hpY2ggZm9ybWFsbHkKK2Rlc2NyaWJlcyB0aGUgZGVmbGF0ZSBmb3JtYXQuICBJIGhhdmUgcmVjZWl2ZWQgbWFueSBxdWVzdGlvbnMgb24gZGV0YWlscyBvZiB0aGUKK2RlZmxhdGUgZm9ybWF0LCBhbmQgSSBob3BlIHRoYXQgcmVhZGluZyB0aGlzIGNvZGUgd2lsbCBhbnN3ZXIgdGhvc2UgcXVlc3Rpb25zLgorcHVmZi5jIGlzIGhlYXZpbHkgY29tbWVudGVkIHdpdGggZGV0YWlscyBvZiB0aGUgZGVmbGF0ZSBmb3JtYXQsIGVzcGVjaWFsbHkKK3Rob3NlIGxpdHRsZSBub29rcyBhbmQgY3JhbmllcyBvZiB0aGUgZm9ybWF0IHRoYXQgbWlnaHQgbm90IGJlIG9idmlvdXMgZnJvbSBhCitzcGVjaWZpY2F0aW9uLgorCitwdWZmLmMgbWF5IGFsc28gYmUgdXNlZnVsIGluIGFwcGxpY2F0aW9ucyB3aGVyZSBjb2RlIHNpemUgb3IgbWVtb3J5IHVzYWdlIGlzIGEKK3ZlcnkgbGltaXRlZCByZXNvdXJjZSwgYW5kIHNwZWVkIGlzIG5vdCBhcyBpbXBvcnRhbnQuCisKK0hvdyB0byB1c2UgaXQgLS0KKworV2VsbCwgbW9zdCBsaWtlbHkgeW91IHNob3VsZCBqdXN0IGJlIHJlYWRpbmcgcHVmZi5jIGFuZCB1c2luZyB6bGliIGZvciBhY3R1YWwKK2FwcGxpY2F0aW9ucywgYnV0IGlmIHlvdSBtdXN0IC4uLgorCitJbmNsdWRlIHB1ZmYuaCBpbiB5b3VyIGNvZGUsIHdoaWNoIHByb3ZpZGVzIHRoaXMgcHJvdG90eXBlOgorCitpbnQgcHVmZih1bnNpZ25lZCBjaGFyICpkZXN0LCAgICAgICAgICAgLyogcG9pbnRlciB0byBkZXN0aW5hdGlvbiBwb2ludGVyICovCisgICAgICAgICB1bnNpZ25lZCBsb25nICpkZXN0bGVuLCAgICAgICAgLyogYW1vdW50IG9mIG91dHB1dCBzcGFjZSAqLworICAgICAgICAgdW5zaWduZWQgY2hhciAqc291cmNlLCAgICAgICAgIC8qIHBvaW50ZXIgdG8gc291cmNlIGRhdGEgcG9pbnRlciAqLworICAgICAgICAgdW5zaWduZWQgbG9uZyAqc291cmNlbGVuKTsgICAgIC8qIGFtb3VudCBvZiBpbnB1dCBhdmFpbGFibGUgKi8KKworVGhlbiB5b3UgY2FuIGNhbGwgcHVmZigpIHRvIGRlY29tcHJlc3MgYSBkZWZsYXRlIHN0cmVhbSB0aGF0IGlzIGluIG1lbW9yeSBpbgoraXRzIGVudGlyZXR5IGF0IHNvdXJjZSwgdG8gYSBzdWZmaWNpZW50bHkgc2l6ZWQgYmxvY2sgb2YgbWVtb3J5IGZvciB0aGUKK2RlY29tcHJlc3NlZCBkYXRhIGF0IGRlc3QuICBwdWZmKCkgaXMgdGhlIG9ubHkgZXh0ZXJuYWwgc3ltYm9sIGluIHB1ZmYuYyAgVGhlCitvbmx5IEMgbGlicmFyeSBmdW5jdGlvbnMgdGhhdCBwdWZmLmMgbmVlZHMgYXJlIHNldGptcCgpIGFuZCBsb25nam1wKCksIHdoaWNoCithcmUgdXNlZCB0byBzaW1wbGlmeSBlcnJvciBjaGVja2luZyBpbiB0aGUgY29kZSB0byBpbXByb3ZlIHJlYWRhYmlsdHkuICBwdWZmLmMKK2RvZXMgbm8gbWVtb3J5IGFsbG9jYXRpb24sIGFuZCB1c2VzIGxlc3MgdGhhbiAySyBieXRlcyBvZmYgb2YgdGhlIHN0YWNrLgorCitJZiBkZXN0bGVuIGlzIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHRoZSB1bmNvbXByZXNzZWQgZGF0YSwgdGhlbiBpbmZsYXRlIHdpbGwKK3JldHVybiBhbiBlcnJvciB3aXRob3V0IHdyaXRpbmcgbW9yZSB0aGFuIGRlc3RsZW4gYnl0ZXMuICBOb3RlIHRoYXQgdGhpcyBtZWFucwordGhhdCBpbiBvcmRlciB0byBkZWNvbXByZXNzIHRoZSBkZWZsYXRlIGRhdGEgc3VjY2Vzc2Z1bGx5LCB5b3UgbmVlZCB0byBrbm93Cit0aGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgYWhlYWQgb2YgdGltZS4KKworSWYgbmVlZGVkLCBwdWZmKCkgY2FuIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgd2l0aCBubworb3V0cHV0IHNwYWNlLiAgVGhpcyBpcyBkb25lIGJ5IHBhc3NpbmcgZGVzdCBlcXVhbCB0byAodW5zaWduZWQgY2hhciAqKTAuICBUaGVuCit0aGUgaW5pdGlhbCB2YWx1ZSBvZiAqZGVzdGxlbiBpcyBpZ25vcmVkIGFuZCAqZGVzdGxlbiBpcyBzZXQgdG8gdGhlIGxlbmd0aCBvZgordGhlIHVuY29tcHJlc3NlZCBkYXRhLiAgU28gaWYgdGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGlzIG5vdCBrbm93biwKK3RoZW4gdHdvIHBhc3NlcyBvZiBwdWZmKCkgY2FuIGJlIHVzZWQtLWZpcnN0IHRvIGRldGVybWluZSB0aGUgc2l6ZSwgYW5kIHNlY29uZAordG8gZG8gdGhlIGFjdHVhbCBpbmZsYXRpb24gYWZ0ZXIgYWxsb2NhdGluZyB0aGUgYXBwcm9wcmlhdGUgbWVtb3J5LiAgTm90CitwcmV0dHksIGJ1dCBpdCB3b3Jrcy4gIChUaGlzIGlzIG9uZSBvZiB0aGUgcmVhc29ucyB5b3Ugc2hvdWxkIGJlIHVzaW5nIHpsaWIuKQorCitUaGUgZGVmbGF0ZSBmb3JtYXQgaXMgc2VsZi10ZXJtaW5hdGluZy4gIElmIHRoZSBkZWZsYXRlIHN0cmVhbSBkb2VzIG5vdCBlbmQKK2luICpzb3VyY2VsZW4gYnl0ZXMsIHB1ZmYoKSB3aWxsIHJldHVybiBhbiBlcnJvciB3aXRob3V0IHJlYWRpbmcgYXQgb3IgcGFzdAorZW5kc291cmNlLgorCitPbiByZXR1cm4sICpzb3VyY2VsZW4gaXMgdXBkYXRlZCB0byB0aGUgYW1vdW50IG9mIGlucHV0IGRhdGEgY29uc3VtZWQsIGFuZAorKmRlc3RsZW4gaXMgdXBkYXRlZCB0byB0aGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEuICBTZWUgdGhlIGNvbW1lbnRzCitpbiBwdWZmLmMgZm9yIHRoZSBwb3NzaWJsZSByZXR1cm4gY29kZXMgZm9yIHB1ZmYoKS4KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvcHVmZi9wdWZmLmMgYi96bGliL3NyYy9jb250cmliL3B1ZmYvcHVmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNTg0ODMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3B1ZmYvcHVmZi5jCkBAIC0wLDAgKzEsODQwIEBACisvKgorICogcHVmZi5jCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMyBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcHVmZi5oCisgKiB2ZXJzaW9uIDIuMywgMjEgSmFuIDIwMTMKKyAqCisgKiBwdWZmLmMgaXMgYSBzaW1wbGUgaW5mbGF0ZSB3cml0dGVuIHRvIGJlIGFuIHVuYW1iaWd1b3VzIHdheSB0byBzcGVjaWZ5IHRoZQorICogZGVmbGF0ZSBmb3JtYXQuICBJdCBpcyBub3Qgd3JpdHRlbiBmb3Igc3BlZWQgYnV0IHJhdGhlciBzaW1wbGljaXR5LiAgQXMgYQorICogc2lkZSBiZW5lZml0LCB0aGlzIGNvZGUgbWlnaHQgYWN0dWFsbHkgYmUgdXNlZnVsIHdoZW4gc21hbGwgY29kZSBpcyBtb3JlCisgKiBpbXBvcnRhbnQgdGhhbiBzcGVlZCwgc3VjaCBhcyBib290c3RyYXAgYXBwbGljYXRpb25zLiAgRm9yIHR5cGljYWwgZGVmbGF0ZQorICogZGF0YSwgemxpYidzIGluZmxhdGUoKSBpcyBhYm91dCBmb3VyIHRpbWVzIGFzIGZhc3QgYXMgcHVmZigpLiAgemxpYidzCisgKiBpbmZsYXRlIGNvbXBpbGVzIHRvIGFyb3VuZCAyMEsgb24gbXkgbWFjaGluZSwgd2hlcmVhcyBwdWZmLmMgY29tcGlsZXMgdG8KKyAqIGFyb3VuZCA0SyBvbiBteSBtYWNoaW5lIChhIFBvd2VyUEMgdXNpbmcgR05VIGNjKS4gIElmIHRoZSBmYXN0ZXIgZGVjb2RlKCkKKyAqIGZ1bmN0aW9uIGhlcmUgaXMgdXNlZCwgdGhlbiBwdWZmKCkgaXMgb25seSB0d2ljZSBhcyBzbG93IGFzIHpsaWIncworICogaW5mbGF0ZSgpLgorICoKKyAqIEFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgbWVtb3J5IGNvbWVzIGZyb20gdGhlIHN0YWNrLiAgVGhlIHN0YWNrIHJlcXVpcmVkCisgKiBpcyBsZXNzIHRoYW4gMksgYnl0ZXMuICBUaGlzIGNvZGUgaXMgY29tcGF0aWJsZSB3aXRoIDE2LWJpdCBpbnQncyBhbmQKKyAqIGFzc3VtZXMgdGhhdCBsb25nJ3MgYXJlIGF0IGxlYXN0IDMyIGJpdHMuICBwdWZmLmMgdXNlcyB0aGUgc2hvcnQgZGF0YSB0eXBlLAorICogYXNzdW1lZCB0byBiZSAxNiBiaXRzLCBmb3IgYXJyYXlzIGluIG9yZGVyIHRvIHRvIGNvbnNlcnZlIG1lbW9yeS4gIFRoZSBjb2RlCisgKiB3b3JrcyB3aGV0aGVyIGludGVnZXJzIGFyZSBzdG9yZWQgYmlnIGVuZGlhbiBvciBsaXR0bGUgZW5kaWFuLgorICoKKyAqIEluIHRoZSBjb21tZW50cyBiZWxvdyBhcmUgIkZvcm1hdCBub3RlcyIgdGhhdCBkZXNjcmliZSB0aGUgaW5mbGF0ZSBwcm9jZXNzCisgKiBhbmQgZG9jdW1lbnQgc29tZSBvZiB0aGUgbGVzcyBvYnZpb3VzIGFzcGVjdHMgb2YgdGhlIGZvcm1hdC4gIFRoaXMgc291cmNlCisgKiBjb2RlIGlzIG1lYW50IHRvIHN1cHBsZW1lbnQgUkZDIDE5NTEsIHdoaWNoIGZvcm1hbGx5IGRlc2NyaWJlcyB0aGUgZGVmbGF0ZQorICogZm9ybWF0OgorICoKKyAqICAgIGh0dHA6Ly93d3cuemxpYi5vcmcvcmZjLWRlZmxhdGUuaHRtbAorICovCisKKy8qCisgKiBDaGFuZ2UgaGlzdG9yeToKKyAqCisgKiAxLjAgIDEwIEZlYiAyMDAyICAgICAtIEZpcnN0IHZlcnNpb24KKyAqIDEuMSAgMTcgRmViIDIwMDIgICAgIC0gQ2xhcmlmaWNhdGlvbnMgb2Ygc29tZSBjb21tZW50cyBhbmQgbm90ZXMKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gVXBkYXRlIHB1ZmYoKSBkZXN0IGFuZCBzb3VyY2UgcG9pbnRlcnMgb24gbmVnYXRpdmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzIHRvIGZhY2lsaXRhdGUgZGVidWdnaW5nIGRlZmxhdG9ycworICogICAgICAgICAgICAgICAgICAgICAgLSBSZW1vdmUgbG9uZ2VzdCBmcm9tIHN0cnVjdCBodWZmbWFuIC0tIG5vdCBuZWVkZWQKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gU2ltcGxpZnkgb2Zmc1tdIGluZGV4IGluIGNvbnN0cnVjdCgpCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEFkZCBpbnB1dCBzaXplIGFuZCBjaGVja2luZywgdXNpbmcgbG9uZ2ptcCgpIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgIG1haW50YWluIGVhc3kgcmVhZGFiaWxpdHkKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gVXNlIHNob3J0IGRhdGEgdHlwZSBmb3IgbGFyZ2UgYXJyYXlzCisgKiAgICAgICAgICAgICAgICAgICAgICAtIFVzZSBwb2ludGVycyBpbnN0ZWFkIG9mIGxvbmcgdG8gc3BlY2lmeSBzb3VyY2UgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIHNpemVzIHRvIGF2b2lkIGFyYml0cmFyeSA0IEdCIGxpbWl0cworICogMS4yICAxNyBNYXIgMjAwMiAgICAgLSBBZGQgZmFzdGVyIHZlcnNpb24gb2YgZGVjb2RlKCksIGRvdWJsZXMgc3BlZWQgKCEpLAorICogICAgICAgICAgICAgICAgICAgICAgICBidXQgbGVhdmUgc2ltcGxlIHZlcnNpb24gZm9yIHJlYWRhYmlsdHkKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gTWFrZSBzdXJlIGludmFsaWQgZGlzdGFuY2VzIGRldGVjdGVkIGlmIHBvaW50ZXJzCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFyZSAxNiBiaXRzCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEZpeCBmaXhlZCBjb2RlcyB0YWJsZSBlcnJvcgorICogICAgICAgICAgICAgICAgICAgICAgLSBQcm92aWRlIGEgc2Nhbm5pbmcgbW9kZSBmb3IgZGV0ZXJtaW5pbmcgc2l6ZSBvZgorICogICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWQgZGF0YQorICogMS4zICAyMCBNYXIgMjAwMiAgICAgLSBHbyBiYWNrIHRvIGxlbmd0aHMgZm9yIHB1ZmYoKSBwYXJhbWV0ZXJzIFtHYWlsbHldCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEFkZCBhIHB1ZmYuaCBmaWxlIGZvciB0aGUgaW50ZXJmYWNlCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEFkZCBicmFjZXMgaW4gcHVmZigpIGZvciBlbHNlIGRvIFtHYWlsbHldCisgKiAgICAgICAgICAgICAgICAgICAgICAtIFVzZSBpbmRleGVzIGluc3RlYWQgb2YgcG9pbnRlcnMgZm9yIHJlYWRhYmlsaXR5CisgKiAxLjQgIDMxIE1hciAyMDAyICAgICAtIFNpbXBsaWZ5IGNvbnN0cnVjdCgpIGNvZGUgc2V0IGNoZWNrCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEZpeCBzb21lIGNvbW1lbnRzCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEFkZCBGSVhMQ09ERVMgI2RlZmluZQorICogMS41ICAgNiBBcHIgMjAwMiAgICAgLSBNaW5vciBjb21tZW50IGZpeGVzCisgKiAxLjYgICA3IEF1ZyAyMDAyICAgICAtIE1pbm9yIGZvcm1hdCBjaGFuZ2VzCisgKiAxLjcgICAzIE1hciAyMDAzICAgICAtIEFkZGVkIHRlc3QgY29kZSBmb3IgZGlzdHJpYnV0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEFkZGVkIHpsaWItbGlrZSBsaWNlbnNlCisgKiAxLjggICA5IEphbiAyMDA0ICAgICAtIEFkZGVkIHNvbWUgY29tbWVudHMgb24gbm8gZGlzdGFuY2UgY29kZXMgY2FzZQorICogMS45ICAyMSBGZWIgMjAwOCAgICAgLSBGaXggYnVnIG9uIDE2LWJpdCBpbnRlZ2VyIGFyY2hpdGVjdHVyZXMgW1BvaGxhbmRdCisgKiAgICAgICAgICAgICAgICAgICAgICAtIENhdGNoIG1pc3NpbmcgZW5kLW9mLWJsb2NrIHN5bWJvbCBlcnJvcgorICogMi4wICAyNSBKdWwgMjAwOCAgICAgLSBBZGQgI2RlZmluZSB0byBwZXJtaXQgZGlzdGFuY2UgdG9vIGZhciBiYWNrCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEFkZCBvcHRpb24gaW4gVEVTVCBjb2RlIGZvciBwdWZmIHRvIHdyaXRlIHRoZSBkYXRhCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEFkZCBvcHRpb24gaW4gVEVTVCBjb2RlIHRvIHNraXAgaW5wdXQgYnl0ZXMKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gQWxsb3cgVEVTVCBjb2RlIHRvIHJlYWQgZnJvbSBwaXBlZCBzdGRpbgorICogMi4xICAgNCBBcHIgMjAxMCAgICAgLSBBdm9pZCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbiBmb3IgaGFwcGllciBjb21waWxlcnMKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gQXZvaWQgdW5zaWduZWQgY29tcGFyaXNvbnMgZm9yIGV2ZW4gaGFwcGllciBjb21waWxlcnMKKyAqIDIuMiAgMjUgQXByIDIwMTAgICAgIC0gRml4IGJ1ZyBpbiB2YXJpYWJsZSBpbml0aWFsaXphdGlvbnMgW09iZXJodW1lcl0KKyAqICAgICAgICAgICAgICAgICAgICAgIC0gQWRkIGNvbnN0IHdoZXJlIGFwcHJvcHJpYXRlIFtPYmVyaHVtZXJdCisgKiAgICAgICAgICAgICAgICAgICAgICAtIFNwbGl0IGlmJ3MgYW5kID8ncyBmb3IgY292ZXJhZ2UgdGVzdGluZworICogICAgICAgICAgICAgICAgICAgICAgLSBCcmVhayBvdXQgdGVzdCBjb2RlIHRvIHNlcGFyYXRlIGZpbGUKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gTW92ZSBOSUwgdG8gcHVmZi5oCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEFsbG93IGluY29tcGxldGUgY29kZSBvbmx5IGlmIHNpbmdsZSBjb2RlIGxlbmd0aCBpcyAxCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEFkZCBmdWxsIGNvZGUgY292ZXJhZ2UgdGVzdCB0byBNYWtlZmlsZQorICogMi4zICAyMSBKYW4gMjAxMyAgICAgLSBDaGVjayBmb3IgaW52YWxpZCBjb2RlIGxlbmd0aCBjb2RlcyBpbiBkeW5hbWljIGJsb2NrcworICovCisKKyNpbmNsdWRlIDxzZXRqbXAuaD4gICAgICAgICAgICAgLyogZm9yIHNldGptcCgpLCBsb25nam1wKCksIGFuZCBqbXBfYnVmICovCisjaW5jbHVkZSAicHVmZi5oIiAgICAgICAgICAgICAgIC8qIHByb3RvdHlwZSBmb3IgcHVmZigpICovCisKKyNkZWZpbmUgbG9jYWwgc3RhdGljICAgICAgICAgICAgLyogZm9yIGxvY2FsIGZ1bmN0aW9uIGRlZmluaXRpb25zICovCisKKy8qCisgKiBNYXhpbXVtcyBmb3IgYWxsb2NhdGlvbnMgYW5kIGxvb3BzLiAgSXQgaXMgbm90IHVzZWZ1bCB0byBjaGFuZ2UgdGhlc2UgLS0KKyAqIHRoZXkgYXJlIGZpeGVkIGJ5IHRoZSBkZWZsYXRlIGZvcm1hdC4KKyAqLworI2RlZmluZSBNQVhCSVRTIDE1ICAgICAgICAgICAgICAvKiBtYXhpbXVtIGJpdHMgaW4gYSBjb2RlICovCisjZGVmaW5lIE1BWExDT0RFUyAyODYgICAgICAgICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIGxpdGVyYWwvbGVuZ3RoIGNvZGVzICovCisjZGVmaW5lIE1BWERDT0RFUyAzMCAgICAgICAgICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovCisjZGVmaW5lIE1BWENPREVTIChNQVhMQ09ERVMrTUFYRENPREVTKSAgLyogbWF4aW11bSBjb2RlcyBsZW5ndGhzIHRvIHJlYWQgKi8KKyNkZWZpbmUgRklYTENPREVTIDI4OCAgICAgICAgICAgLyogbnVtYmVyIG9mIGZpeGVkIGxpdGVyYWwvbGVuZ3RoIGNvZGVzICovCisKKy8qIGlucHV0IGFuZCBvdXRwdXQgc3RhdGUgKi8KK3N0cnVjdCBzdGF0ZSB7CisgICAgLyogb3V0cHV0IHN0YXRlICovCisgICAgdW5zaWduZWQgY2hhciAqb3V0OyAgICAgICAgIC8qIG91dHB1dCBidWZmZXIgKi8KKyAgICB1bnNpZ25lZCBsb25nIG91dGxlbjsgICAgICAgLyogYXZhaWxhYmxlIHNwYWNlIGF0IG91dCAqLworICAgIHVuc2lnbmVkIGxvbmcgb3V0Y250OyAgICAgICAvKiBieXRlcyB3cml0dGVuIHRvIG91dCBzbyBmYXIgKi8KKworICAgIC8qIGlucHV0IHN0YXRlICovCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW47ICAgIC8qIGlucHV0IGJ1ZmZlciAqLworICAgIHVuc2lnbmVkIGxvbmcgaW5sZW47ICAgICAgICAvKiBhdmFpbGFibGUgaW5wdXQgYXQgaW4gKi8KKyAgICB1bnNpZ25lZCBsb25nIGluY250OyAgICAgICAgLyogYnl0ZXMgcmVhZCBzbyBmYXIgKi8KKyAgICBpbnQgYml0YnVmOyAgICAgICAgICAgICAgICAgLyogYml0IGJ1ZmZlciAqLworICAgIGludCBiaXRjbnQ7ICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBpbiBiaXQgYnVmZmVyICovCisKKyAgICAvKiBpbnB1dCBsaW1pdCBlcnJvciByZXR1cm4gc3RhdGUgZm9yIGJpdHMoKSBhbmQgZGVjb2RlKCkgKi8KKyAgICBqbXBfYnVmIGVudjsKK307CisKKy8qCisgKiBSZXR1cm4gbmVlZCBiaXRzIGZyb20gdGhlIGlucHV0IHN0cmVhbS4gIFRoaXMgYWx3YXlzIGxlYXZlcyBsZXNzIHRoYW4KKyAqIGVpZ2h0IGJpdHMgaW4gdGhlIGJ1ZmZlci4gIGJpdHMoKSB3b3JrcyBwcm9wZXJseSBmb3IgbmVlZCA9PSAwLgorICoKKyAqIEZvcm1hdCBub3RlczoKKyAqCisgKiAtIEJpdHMgYXJlIHN0b3JlZCBpbiBieXRlcyBmcm9tIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gdGhlIG1vc3QKKyAqICAgc2lnbmlmaWNhbnQgYml0LiAgVGhlcmVmb3JlIGJpdHMgYXJlIGRyb3BwZWQgZnJvbSB0aGUgYm90dG9tIG9mIHRoZSBiaXQKKyAqICAgYnVmZmVyLCB1c2luZyBzaGlmdCByaWdodCwgYW5kIG5ldyBieXRlcyBhcmUgYXBwZW5kZWQgdG8gdGhlIHRvcCBvZiB0aGUKKyAqICAgYml0IGJ1ZmZlciwgdXNpbmcgc2hpZnQgbGVmdC4KKyAqLworbG9jYWwgaW50IGJpdHMoc3RydWN0IHN0YXRlICpzLCBpbnQgbmVlZCkKK3sKKyAgICBsb25nIHZhbDsgICAgICAgICAgIC8qIGJpdCBhY2N1bXVsYXRvciAoY2FuIHVzZSB1cCB0byAyMCBiaXRzKSAqLworCisgICAgLyogbG9hZCBhdCBsZWFzdCBuZWVkIGJpdHMgaW50byB2YWwgKi8KKyAgICB2YWwgPSBzLT5iaXRidWY7CisgICAgd2hpbGUgKHMtPmJpdGNudCA8IG5lZWQpIHsKKyAgICAgICAgaWYgKHMtPmluY250ID09IHMtPmlubGVuKQorICAgICAgICAgICAgbG9uZ2ptcChzLT5lbnYsIDEpOyAgICAgICAgIC8qIG91dCBvZiBpbnB1dCAqLworICAgICAgICB2YWwgfD0gKGxvbmcpKHMtPmluW3MtPmluY250KytdKSA8PCBzLT5iaXRjbnQ7ICAvKiBsb2FkIGVpZ2h0IGJpdHMgKi8KKyAgICAgICAgcy0+Yml0Y250ICs9IDg7CisgICAgfQorCisgICAgLyogZHJvcCBuZWVkIGJpdHMgYW5kIHVwZGF0ZSBidWZmZXIsIGFsd2F5cyB6ZXJvIHRvIHNldmVuIGJpdHMgbGVmdCAqLworICAgIHMtPmJpdGJ1ZiA9IChpbnQpKHZhbCA+PiBuZWVkKTsKKyAgICBzLT5iaXRjbnQgLT0gbmVlZDsKKworICAgIC8qIHJldHVybiBuZWVkIGJpdHMsIHplcm9pbmcgdGhlIGJpdHMgYWJvdmUgdGhhdCAqLworICAgIHJldHVybiAoaW50KSh2YWwgJiAoKDFMIDw8IG5lZWQpIC0gMSkpOworfQorCisvKgorICogUHJvY2VzcyBhIHN0b3JlZCBibG9jay4KKyAqCisgKiBGb3JtYXQgbm90ZXM6CisgKgorICogLSBBZnRlciB0aGUgdHdvLWJpdCBzdG9yZWQgYmxvY2sgdHlwZSAoMDApLCB0aGUgc3RvcmVkIGJsb2NrIGxlbmd0aCBhbmQKKyAqICAgc3RvcmVkIGJ5dGVzIGFyZSBieXRlLWFsaWduZWQgZm9yIGZhc3QgY29weWluZy4gIFRoZXJlZm9yZSBhbnkgbGVmdG92ZXIKKyAqICAgYml0cyBpbiB0aGUgYnl0ZSB0aGF0IGhhcyB0aGUgbGFzdCBiaXQgb2YgdGhlIHR5cGUsIGFzIG1hbnkgYXMgc2V2ZW4sIGFyZQorICogICBkaXNjYXJkZWQuICBUaGUgdmFsdWUgb2YgdGhlIGRpc2NhcmRlZCBiaXRzIGFyZSBub3QgZGVmaW5lZCBhbmQgc2hvdWxkIG5vdAorICogICBiZSBjaGVja2VkIGFnYWluc3QgYW55IGV4cGVjdGF0aW9uLgorICoKKyAqIC0gVGhlIHNlY29uZCBpbnZlcnRlZCBjb3B5IG9mIHRoZSBzdG9yZWQgYmxvY2sgbGVuZ3RoIGRvZXMgbm90IGhhdmUgdG8gYmUKKyAqICAgY2hlY2tlZCwgYnV0IGl0J3MgcHJvYmFibHkgYSBnb29kIGlkZWEgdG8gZG8gc28gYW55d2F5LgorICoKKyAqIC0gQSBzdG9yZWQgYmxvY2sgY2FuIGhhdmUgemVybyBsZW5ndGguICBUaGlzIGlzIHNvbWV0aW1lcyB1c2VkIHRvIGJ5dGUtYWxpZ24KKyAqICAgc3Vic2V0cyBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIGZvciByYW5kb20gYWNjZXNzIG9yIHBhcnRpYWwgcmVjb3ZlcnkuCisgKi8KK2xvY2FsIGludCBzdG9yZWQoc3RydWN0IHN0YXRlICpzKQoreworICAgIHVuc2lnbmVkIGxlbjsgICAgICAgLyogbGVuZ3RoIG9mIHN0b3JlZCBibG9jayAqLworCisgICAgLyogZGlzY2FyZCBsZWZ0b3ZlciBiaXRzIGZyb20gY3VycmVudCBieXRlIChhc3N1bWVzIHMtPmJpdGNudCA8IDgpICovCisgICAgcy0+Yml0YnVmID0gMDsKKyAgICBzLT5iaXRjbnQgPSAwOworCisgICAgLyogZ2V0IGxlbmd0aCBhbmQgY2hlY2sgYWdhaW5zdCBpdHMgb25lJ3MgY29tcGxlbWVudCAqLworICAgIGlmIChzLT5pbmNudCArIDQgPiBzLT5pbmxlbikKKyAgICAgICAgcmV0dXJuIDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBlbm91Z2ggaW5wdXQgKi8KKyAgICBsZW4gPSBzLT5pbltzLT5pbmNudCsrXTsKKyAgICBsZW4gfD0gcy0+aW5bcy0+aW5jbnQrK10gPDwgODsKKyAgICBpZiAocy0+aW5bcy0+aW5jbnQrK10gIT0gKH5sZW4gJiAweGZmKSB8fAorICAgICAgICBzLT5pbltzLT5pbmNudCsrXSAhPSAoKH5sZW4gPj4gOCkgJiAweGZmKSkKKyAgICAgICAgcmV0dXJuIC0yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpZG4ndCBtYXRjaCBjb21wbGVtZW50ISAqLworCisgICAgLyogY29weSBsZW4gYnl0ZXMgZnJvbSBpbiB0byBvdXQgKi8KKyAgICBpZiAocy0+aW5jbnQgKyBsZW4gPiBzLT5pbmxlbikKKyAgICAgICAgcmV0dXJuIDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBlbm91Z2ggaW5wdXQgKi8KKyAgICBpZiAocy0+b3V0ICE9IE5JTCkgeworICAgICAgICBpZiAocy0+b3V0Y250ICsgbGVuID4gcy0+b3V0bGVuKQorICAgICAgICAgICAgcmV0dXJuIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IGVub3VnaCBvdXRwdXQgc3BhY2UgKi8KKyAgICAgICAgd2hpbGUgKGxlbi0tKQorICAgICAgICAgICAgcy0+b3V0W3MtPm91dGNudCsrXSA9IHMtPmluW3MtPmluY250KytdOworICAgIH0KKyAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGp1c3Qgc2Nhbm5pbmcgKi8KKyAgICAgICAgcy0+b3V0Y250ICs9IGxlbjsKKyAgICAgICAgcy0+aW5jbnQgKz0gbGVuOworICAgIH0KKworICAgIC8qIGRvbmUgd2l0aCBhIHZhbGlkIHN0b3JlZCBibG9jayAqLworICAgIHJldHVybiAwOworfQorCisvKgorICogSHVmZm1hbiBjb2RlIGRlY29kaW5nIHRhYmxlcy4gIGNvdW50WzEuLk1BWEJJVFNdIGlzIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBvZgorICogZWFjaCBsZW5ndGgsIHdoaWNoIGZvciBhIGNhbm9uaWNhbCBjb2RlIGFyZSBzdGVwcGVkIHRocm91Z2ggaW4gb3JkZXIuCisgKiBzeW1ib2xbXSBhcmUgdGhlIHN5bWJvbCB2YWx1ZXMgaW4gY2Fub25pY2FsIG9yZGVyLCB3aGVyZSB0aGUgbnVtYmVyIG9mCisgKiBlbnRyaWVzIGlzIHRoZSBzdW0gb2YgdGhlIGNvdW50cyBpbiBjb3VudFtdLiAgVGhlIGRlY29kaW5nIHByb2Nlc3MgY2FuIGJlCisgKiBzZWVuIGluIHRoZSBmdW5jdGlvbiBkZWNvZGUoKSBiZWxvdy4KKyAqLworc3RydWN0IGh1ZmZtYW4geworICAgIHNob3J0ICpjb3VudDsgICAgICAgLyogbnVtYmVyIG9mIHN5bWJvbHMgb2YgZWFjaCBsZW5ndGggKi8KKyAgICBzaG9ydCAqc3ltYm9sOyAgICAgIC8qIGNhbm9uaWNhbGx5IG9yZGVyZWQgc3ltYm9scyAqLworfTsKKworLyoKKyAqIERlY29kZSBhIGNvZGUgZnJvbSB0aGUgc3RyZWFtIHMgdXNpbmcgaHVmZm1hbiB0YWJsZSBoLiAgUmV0dXJuIHRoZSBzeW1ib2wgb3IKKyAqIGEgbmVnYXRpdmUgdmFsdWUgaWYgdGhlcmUgaXMgYW4gZXJyb3IuICBJZiBhbGwgb2YgdGhlIGxlbmd0aHMgYXJlIHplcm8sIGkuZS4KKyAqIGFuIGVtcHR5IGNvZGUsIG9yIGlmIHRoZSBjb2RlIGlzIGluY29tcGxldGUgYW5kIGFuIGludmFsaWQgY29kZSBpcyByZWNlaXZlZCwKKyAqIHRoZW4gLTEwIGlzIHJldHVybmVkIGFmdGVyIHJlYWRpbmcgTUFYQklUUyBiaXRzLgorICoKKyAqIEZvcm1hdCBub3RlczoKKyAqCisgKiAtIFRoZSBjb2RlcyBhcyBzdG9yZWQgaW4gdGhlIGNvbXByZXNzZWQgZGF0YSBhcmUgYml0LXJldmVyc2VkIHJlbGF0aXZlIHRvCisgKiAgIGEgc2ltcGxlIGludGVnZXIgb3JkZXJpbmcgb2YgY29kZXMgb2YgdGhlIHNhbWUgbGVuZ3Rocy4gIEhlbmNlIGJlbG93IHRoZQorICogICBiaXRzIGFyZSBwdWxsZWQgZnJvbSB0aGUgY29tcHJlc3NlZCBkYXRhIG9uZSBhdCBhIHRpbWUgYW5kIHVzZWQgdG8KKyAqICAgYnVpbGQgdGhlIGNvZGUgdmFsdWUgcmV2ZXJzZWQgZnJvbSB3aGF0IGlzIGluIHRoZSBzdHJlYW0gaW4gb3JkZXIgdG8KKyAqICAgcGVybWl0IHNpbXBsZSBpbnRlZ2VyIGNvbXBhcmlzb25zIGZvciBkZWNvZGluZy4gIEEgdGFibGUtYmFzZWQgZGVjb2RpbmcKKyAqICAgc2NoZW1lIChhcyB1c2VkIGluIHpsaWIpIGRvZXMgbm90IG5lZWQgdG8gZG8gdGhpcyByZXZlcnNhbC4KKyAqCisgKiAtIFRoZSBmaXJzdCBjb2RlIGZvciB0aGUgc2hvcnRlc3QgbGVuZ3RoIGlzIGFsbCB6ZXJvcy4gIFN1YnNlcXVlbnQgY29kZXMgb2YKKyAqICAgdGhlIHNhbWUgbGVuZ3RoIGFyZSBzaW1wbHkgaW50ZWdlciBpbmNyZW1lbnRzIG9mIHRoZSBwcmV2aW91cyBjb2RlLiAgV2hlbgorICogICBtb3ZpbmcgdXAgYSBsZW5ndGgsIGEgemVybyBiaXQgaXMgYXBwZW5kZWQgdG8gdGhlIGNvZGUuICBGb3IgYSBjb21wbGV0ZQorICogICBjb2RlLCB0aGUgbGFzdCBjb2RlIG9mIHRoZSBsb25nZXN0IGxlbmd0aCB3aWxsIGJlIGFsbCBvbmVzLgorICoKKyAqIC0gSW5jb21wbGV0ZSBjb2RlcyBhcmUgaGFuZGxlZCBieSB0aGlzIGRlY29kZXIsIHNpbmNlIHRoZXkgYXJlIHBlcm1pdHRlZAorICogICBpbiB0aGUgZGVmbGF0ZSBmb3JtYXQuICBTZWUgdGhlIGZvcm1hdCBub3RlcyBmb3IgZml4ZWQoKSBhbmQgZHluYW1pYygpLgorICovCisjaWZkZWYgU0xPVworbG9jYWwgaW50IGRlY29kZShzdHJ1Y3Qgc3RhdGUgKnMsIGNvbnN0IHN0cnVjdCBodWZmbWFuICpoKQoreworICAgIGludCBsZW47ICAgICAgICAgICAgLyogY3VycmVudCBudW1iZXIgb2YgYml0cyBpbiBjb2RlICovCisgICAgaW50IGNvZGU7ICAgICAgICAgICAvKiBsZW4gYml0cyBiZWluZyBkZWNvZGVkICovCisgICAgaW50IGZpcnN0OyAgICAgICAgICAvKiBmaXJzdCBjb2RlIG9mIGxlbmd0aCBsZW4gKi8KKyAgICBpbnQgY291bnQ7ICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlcyBvZiBsZW5ndGggbGVuICovCisgICAgaW50IGluZGV4OyAgICAgICAgICAvKiBpbmRleCBvZiBmaXJzdCBjb2RlIG9mIGxlbmd0aCBsZW4gaW4gc3ltYm9sIHRhYmxlICovCisKKyAgICBjb2RlID0gZmlyc3QgPSBpbmRleCA9IDA7CisgICAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHsKKyAgICAgICAgY29kZSB8PSBiaXRzKHMsIDEpOyAgICAgICAgICAgICAvKiBnZXQgbmV4dCBiaXQgKi8KKyAgICAgICAgY291bnQgPSBoLT5jb3VudFtsZW5dOworICAgICAgICBpZiAoY29kZSAtIGNvdW50IDwgZmlyc3QpICAgICAgIC8qIGlmIGxlbmd0aCBsZW4sIHJldHVybiBzeW1ib2wgKi8KKyAgICAgICAgICAgIHJldHVybiBoLT5zeW1ib2xbaW5kZXggKyAoY29kZSAtIGZpcnN0KV07CisgICAgICAgIGluZGV4ICs9IGNvdW50OyAgICAgICAgICAgICAgICAgLyogZWxzZSB1cGRhdGUgZm9yIG5leHQgbGVuZ3RoICovCisgICAgICAgIGZpcnN0ICs9IGNvdW50OworICAgICAgICBmaXJzdCA8PD0gMTsKKyAgICAgICAgY29kZSA8PD0gMTsKKyAgICB9CisgICAgcmV0dXJuIC0xMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmFuIG91dCBvZiBjb2RlcyAqLworfQorCisvKgorICogQSBmYXN0ZXIgdmVyc2lvbiBvZiBkZWNvZGUoKSBmb3IgcmVhbCBhcHBsaWNhdGlvbnMgb2YgdGhpcyBjb2RlLiAgIEl0J3Mgbm90CisgKiBhcyByZWFkYWJsZSwgYnV0IGl0IG1ha2VzIHB1ZmYoKSB0d2ljZSBhcyBmYXN0LiAgQW5kIGl0IG9ubHkgbWFrZXMgdGhlIGNvZGUKKyAqIGEgZmV3IHBlcmNlbnQgbGFyZ2VyLgorICovCisjZWxzZSAvKiAhU0xPVyAqLworbG9jYWwgaW50IGRlY29kZShzdHJ1Y3Qgc3RhdGUgKnMsIGNvbnN0IHN0cnVjdCBodWZmbWFuICpoKQoreworICAgIGludCBsZW47ICAgICAgICAgICAgLyogY3VycmVudCBudW1iZXIgb2YgYml0cyBpbiBjb2RlICovCisgICAgaW50IGNvZGU7ICAgICAgICAgICAvKiBsZW4gYml0cyBiZWluZyBkZWNvZGVkICovCisgICAgaW50IGZpcnN0OyAgICAgICAgICAvKiBmaXJzdCBjb2RlIG9mIGxlbmd0aCBsZW4gKi8KKyAgICBpbnQgY291bnQ7ICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlcyBvZiBsZW5ndGggbGVuICovCisgICAgaW50IGluZGV4OyAgICAgICAgICAvKiBpbmRleCBvZiBmaXJzdCBjb2RlIG9mIGxlbmd0aCBsZW4gaW4gc3ltYm9sIHRhYmxlICovCisgICAgaW50IGJpdGJ1ZjsgICAgICAgICAvKiBiaXRzIGZyb20gc3RyZWFtICovCisgICAgaW50IGxlZnQ7ICAgICAgICAgICAvKiBiaXRzIGxlZnQgaW4gbmV4dCBvciBsZWZ0IHRvIHByb2Nlc3MgKi8KKyAgICBzaG9ydCAqbmV4dDsgICAgICAgIC8qIG5leHQgbnVtYmVyIG9mIGNvZGVzICovCisKKyAgICBiaXRidWYgPSBzLT5iaXRidWY7CisgICAgbGVmdCA9IHMtPmJpdGNudDsKKyAgICBjb2RlID0gZmlyc3QgPSBpbmRleCA9IDA7CisgICAgbGVuID0gMTsKKyAgICBuZXh0ID0gaC0+Y291bnQgKyAxOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIHdoaWxlIChsZWZ0LS0pIHsKKyAgICAgICAgICAgIGNvZGUgfD0gYml0YnVmICYgMTsKKyAgICAgICAgICAgIGJpdGJ1ZiA+Pj0gMTsKKyAgICAgICAgICAgIGNvdW50ID0gKm5leHQrKzsKKyAgICAgICAgICAgIGlmIChjb2RlIC0gY291bnQgPCBmaXJzdCkgeyAvKiBpZiBsZW5ndGggbGVuLCByZXR1cm4gc3ltYm9sICovCisgICAgICAgICAgICAgICAgcy0+Yml0YnVmID0gYml0YnVmOworICAgICAgICAgICAgICAgIHMtPmJpdGNudCA9IChzLT5iaXRjbnQgLSBsZW4pICYgNzsKKyAgICAgICAgICAgICAgICByZXR1cm4gaC0+c3ltYm9sW2luZGV4ICsgKGNvZGUgLSBmaXJzdCldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXggKz0gY291bnQ7ICAgICAgICAgICAgIC8qIGVsc2UgdXBkYXRlIGZvciBuZXh0IGxlbmd0aCAqLworICAgICAgICAgICAgZmlyc3QgKz0gY291bnQ7CisgICAgICAgICAgICBmaXJzdCA8PD0gMTsKKyAgICAgICAgICAgIGNvZGUgPDw9IDE7CisgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgfQorICAgICAgICBsZWZ0ID0gKE1BWEJJVFMrMSkgLSBsZW47CisgICAgICAgIGlmIChsZWZ0ID09IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKHMtPmluY250ID09IHMtPmlubGVuKQorICAgICAgICAgICAgbG9uZ2ptcChzLT5lbnYsIDEpOyAgICAgICAgIC8qIG91dCBvZiBpbnB1dCAqLworICAgICAgICBiaXRidWYgPSBzLT5pbltzLT5pbmNudCsrXTsKKyAgICAgICAgaWYgKGxlZnQgPiA4KQorICAgICAgICAgICAgbGVmdCA9IDg7CisgICAgfQorICAgIHJldHVybiAtMTA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJhbiBvdXQgb2YgY29kZXMgKi8KK30KKyNlbmRpZiAvKiBTTE9XICovCisKKy8qCisgKiBHaXZlbiB0aGUgbGlzdCBvZiBjb2RlIGxlbmd0aHMgbGVuZ3RoWzAuLm4tMV0gcmVwcmVzZW50aW5nIGEgY2Fub25pY2FsCisgKiBIdWZmbWFuIGNvZGUgZm9yIG4gc3ltYm9scywgY29uc3RydWN0IHRoZSB0YWJsZXMgcmVxdWlyZWQgdG8gZGVjb2RlIHRob3NlCisgKiBjb2Rlcy4gIFRob3NlIHRhYmxlcyBhcmUgdGhlIG51bWJlciBvZiBjb2RlcyBvZiBlYWNoIGxlbmd0aCwgYW5kIHRoZSBzeW1ib2xzCisgKiBzb3J0ZWQgYnkgbGVuZ3RoLCByZXRhaW5pbmcgdGhlaXIgb3JpZ2luYWwgb3JkZXIgd2l0aGluIGVhY2ggbGVuZ3RoLiAgVGhlCisgKiByZXR1cm4gdmFsdWUgaXMgemVybyBmb3IgYSBjb21wbGV0ZSBjb2RlIHNldCwgbmVnYXRpdmUgZm9yIGFuIG92ZXItCisgKiBzdWJzY3JpYmVkIGNvZGUgc2V0LCBhbmQgcG9zaXRpdmUgZm9yIGFuIGluY29tcGxldGUgY29kZSBzZXQuICBUaGUgdGFibGVzCisgKiBjYW4gYmUgdXNlZCBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHplcm8gb3IgcG9zaXRpdmUsIGJ1dCB0aGV5IGNhbm5vdCBiZSB1c2VkCisgKiBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG5lZ2F0aXZlLiAgSWYgdGhlIHJldHVybiB2YWx1ZSBpcyB6ZXJvLCBpdCBpcyBub3QKKyAqIHBvc3NpYmxlIGZvciBkZWNvZGUoKSB1c2luZyB0aGF0IHRhYmxlIHRvIHJldHVybiBhbiBlcnJvci0tYW55IHN0cmVhbSBvZgorICogZW5vdWdoIGJpdHMgd2lsbCByZXNvbHZlIHRvIGEgc3ltYm9sLiAgSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBwb3NpdGl2ZSwgdGhlbgorICogaXQgaXMgcG9zc2libGUgZm9yIGRlY29kZSgpIHVzaW5nIHRoYXQgdGFibGUgdG8gcmV0dXJuIGFuIGVycm9yIGZvciByZWNlaXZlZAorICogY29kZXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBpbmNvbXBsZXRlIGxlbmd0aHMuCisgKgorICogTm90IHVzZWQgYnkgZGVjb2RlKCksIGJ1dCB1c2VkIGZvciBlcnJvciBjaGVja2luZywgaC0+Y291bnRbMF0gaXMgdGhlIG51bWJlcgorICogb2YgdGhlIG4gc3ltYm9scyBub3QgaW4gdGhlIGNvZGUuICBTbyBuIC0gaC0+Y291bnRbMF0gaXMgdGhlIG51bWJlciBvZgorICogY29kZXMuICBUaGlzIGlzIHVzZWZ1bCBmb3IgY2hlY2tpbmcgZm9yIGluY29tcGxldGUgY29kZXMgdGhhdCBoYXZlIG1vcmUgdGhhbgorICogb25lIHN5bWJvbCwgd2hpY2ggaXMgYW4gZXJyb3IgaW4gYSBkeW5hbWljIGJsb2NrLgorICoKKyAqIEFzc3VtcHRpb246IGZvciBhbGwgaSBpbiAwLi5uLTEsIDAgPD0gbGVuZ3RoW2ldIDw9IE1BWEJJVFMKKyAqIFRoaXMgaXMgYXNzdXJlZCBieSB0aGUgY29uc3RydWN0aW9uIG9mIHRoZSBsZW5ndGggYXJyYXlzIGluIGR5bmFtaWMoKSBhbmQKKyAqIGZpeGVkKCkgYW5kIGlzIG5vdCB2ZXJpZmllZCBieSBjb25zdHJ1Y3QoKS4KKyAqCisgKiBGb3JtYXQgbm90ZXM6CisgKgorICogLSBQZXJtaXR0ZWQgYW5kIGV4cGVjdGVkIGV4YW1wbGVzIG9mIGluY29tcGxldGUgY29kZXMgYXJlIG9uZSBvZiB0aGUgZml4ZWQKKyAqICAgY29kZXMgYW5kIGFueSBjb2RlIHdpdGggYSBzaW5nbGUgc3ltYm9sIHdoaWNoIGluIGRlZmxhdGUgaXMgY29kZWQgYXMgb25lCisgKiAgIGJpdCBpbnN0ZWFkIG9mIHplcm8gYml0cy4gIFNlZSB0aGUgZm9ybWF0IG5vdGVzIGZvciBmaXhlZCgpIGFuZCBkeW5hbWljKCkuCisgKgorICogLSBXaXRoaW4gYSBnaXZlbiBjb2RlIGxlbmd0aCwgdGhlIHN5bWJvbHMgYXJlIGtlcHQgaW4gYXNjZW5kaW5nIG9yZGVyIGZvcgorICogICB0aGUgY29kZSBiaXRzIGRlZmluaXRpb24uCisgKi8KK2xvY2FsIGludCBjb25zdHJ1Y3Qoc3RydWN0IGh1ZmZtYW4gKmgsIGNvbnN0IHNob3J0ICpsZW5ndGgsIGludCBuKQoreworICAgIGludCBzeW1ib2w7ICAgICAgICAgLyogY3VycmVudCBzeW1ib2wgd2hlbiBzdGVwcGluZyB0aHJvdWdoIGxlbmd0aFtdICovCisgICAgaW50IGxlbjsgICAgICAgICAgICAvKiBjdXJyZW50IGxlbmd0aCB3aGVuIHN0ZXBwaW5nIHRocm91Z2ggaC0+Y291bnRbXSAqLworICAgIGludCBsZWZ0OyAgICAgICAgICAgLyogbnVtYmVyIG9mIHBvc3NpYmxlIGNvZGVzIGxlZnQgb2YgY3VycmVudCBsZW5ndGggKi8KKyAgICBzaG9ydCBvZmZzW01BWEJJVFMrMV07ICAgICAgLyogb2Zmc2V0cyBpbiBzeW1ib2wgdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovCisKKyAgICAvKiBjb3VudCBudW1iZXIgb2YgY29kZXMgb2YgZWFjaCBsZW5ndGggKi8KKyAgICBmb3IgKGxlbiA9IDA7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykKKyAgICAgICAgaC0+Y291bnRbbGVuXSA9IDA7CisgICAgZm9yIChzeW1ib2wgPSAwOyBzeW1ib2wgPCBuOyBzeW1ib2wrKykKKyAgICAgICAgKGgtPmNvdW50W2xlbmd0aFtzeW1ib2xdXSkrKzsgICAvKiBhc3N1bWVzIGxlbmd0aHMgYXJlIHdpdGhpbiBib3VuZHMgKi8KKyAgICBpZiAoaC0+Y291bnRbMF0gPT0gbikgICAgICAgICAgICAgICAvKiBubyBjb2RlcyEgKi8KKyAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21wbGV0ZSwgYnV0IGRlY29kZSgpIHdpbGwgZmFpbCAqLworCisgICAgLyogY2hlY2sgZm9yIGFuIG92ZXItc3Vic2NyaWJlZCBvciBpbmNvbXBsZXRlIHNldCBvZiBsZW5ndGhzICovCisgICAgbGVmdCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb25lIHBvc3NpYmxlIGNvZGUgb2YgemVybyBsZW5ndGggKi8KKyAgICBmb3IgKGxlbiA9IDE7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykgeworICAgICAgICBsZWZ0IDw8PSAxOyAgICAgICAgICAgICAgICAgICAgIC8qIG9uZSBtb3JlIGJpdCwgZG91YmxlIGNvZGVzIGxlZnQgKi8KKyAgICAgICAgbGVmdCAtPSBoLT5jb3VudFtsZW5dOyAgICAgICAgICAvKiBkZWR1Y3QgY291bnQgZnJvbSBwb3NzaWJsZSBjb2RlcyAqLworICAgICAgICBpZiAobGVmdCA8IDApCisgICAgICAgICAgICByZXR1cm4gbGVmdDsgICAgICAgICAgICAgICAgLyogb3Zlci1zdWJzY3JpYmVkLS1yZXR1cm4gbmVnYXRpdmUgKi8KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZWZ0ID4gMCBtZWFucyBpbmNvbXBsZXRlICovCisKKyAgICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCBmb3Igc29ydGluZyAqLworICAgIG9mZnNbMV0gPSAwOworICAgIGZvciAobGVuID0gMTsgbGVuIDwgTUFYQklUUzsgbGVuKyspCisgICAgICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xlbl0gKyBoLT5jb3VudFtsZW5dOworCisgICAgLyoKKyAgICAgKiBwdXQgc3ltYm9scyBpbiB0YWJsZSBzb3J0ZWQgYnkgbGVuZ3RoLCBieSBzeW1ib2wgb3JkZXIgd2l0aGluIGVhY2gKKyAgICAgKiBsZW5ndGgKKyAgICAgKi8KKyAgICBmb3IgKHN5bWJvbCA9IDA7IHN5bWJvbCA8IG47IHN5bWJvbCsrKQorICAgICAgICBpZiAobGVuZ3RoW3N5bWJvbF0gIT0gMCkKKyAgICAgICAgICAgIGgtPnN5bWJvbFtvZmZzW2xlbmd0aFtzeW1ib2xdXSsrXSA9IHN5bWJvbDsKKworICAgIC8qIHJldHVybiB6ZXJvIGZvciBjb21wbGV0ZSBzZXQsIHBvc2l0aXZlIGZvciBpbmNvbXBsZXRlIHNldCAqLworICAgIHJldHVybiBsZWZ0OworfQorCisvKgorICogRGVjb2RlIGxpdGVyYWwvbGVuZ3RoIGFuZCBkaXN0YW5jZSBjb2RlcyB1bnRpbCBhbiBlbmQtb2YtYmxvY2sgY29kZS4KKyAqCisgKiBGb3JtYXQgbm90ZXM6CisgKgorICogLSBDb21wcmVzc2VkIGRhdGEgdGhhdCBpcyBhZnRlciB0aGUgYmxvY2sgdHlwZSBpZiBmaXhlZCBvciBhZnRlciB0aGUgY29kZQorICogICBkZXNjcmlwdGlvbiBpZiBkeW5hbWljIGlzIGEgY29tYmluYXRpb24gb2YgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZQorICogICBwYWlycyB0ZXJtaW5hdGVkIGJ5IGFuZCBlbmQtb2YtYmxvY2sgY29kZS4gIExpdGVyYWxzIGFyZSBzaW1wbHkgSHVmZm1hbgorICogICBjb2RlZCBieXRlcy4gIEEgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgaXMgYSBjb2RlZCBsZW5ndGggZm9sbG93ZWQgYnkgYQorICogICBjb2RlZCBkaXN0YW5jZSB0byByZXByZXNlbnQgYSBzdHJpbmcgdGhhdCBvY2N1cnMgZWFybGllciBpbiB0aGUKKyAqICAgdW5jb21wcmVzc2VkIGRhdGEgdGhhdCBvY2N1cnMgYWdhaW4gYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24uCisgKgorICogLSBMaXRlcmFscywgbGVuZ3RocywgYW5kIHRoZSBlbmQtb2YtYmxvY2sgY29kZSBhcmUgY29tYmluZWQgaW50byBhIHNpbmdsZQorICogICBjb2RlIG9mIHVwIHRvIDI4NiBzeW1ib2xzLiAgVGhleSBhcmUgMjU2IGxpdGVyYWxzICgwLi4yNTUpLCAyOSBsZW5ndGgKKyAqICAgc3ltYm9scyAoMjU3Li4yODUpLCBhbmQgdGhlIGVuZC1vZi1ibG9jayBzeW1ib2wgKDI1NikuCisgKgorICogLSBUaGVyZSBhcmUgMjU2IHBvc3NpYmxlIGxlbmd0aHMgKDMuLjI1OCksIGFuZCBzbyAyOSBzeW1ib2xzIGFyZSBub3QgZW5vdWdoCisgKiAgIHRvIHJlcHJlc2VudCBhbGwgb2YgdGhvc2UuICBMZW5ndGhzIDMuLjEwIGFuZCAyNTggYXJlIGluIGZhY3QgcmVwcmVzZW50ZWQKKyAqICAgYnkganVzdCBhIGxlbmd0aCBzeW1ib2wuICBMZW5ndGhzIDExLi4yNTcgYXJlIHJlcHJlc2VudGVkIGFzIGEgc3ltYm9sIGFuZAorICogICBzb21lIG51bWJlciBvZiBleHRyYSBiaXRzIHRoYXQgYXJlIGFkZGVkIGFzIGFuIGludGVnZXIgdG8gdGhlIGJhc2UgbGVuZ3RoCisgKiAgIG9mIHRoZSBsZW5ndGggc3ltYm9sLiAgVGhlIG51bWJlciBvZiBleHRyYSBiaXRzIGlzIGRldGVybWluZWQgYnkgdGhlIGJhc2UKKyAqICAgbGVuZ3RoIHN5bWJvbC4gIFRoZXNlIGFyZSBpbiB0aGUgc3RhdGljIGFycmF5cyBiZWxvdywgbGVuc1tdIGZvciB0aGUgYmFzZQorICogICBsZW5ndGhzIGFuZCBsZXh0W10gZm9yIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlciBvZiBleHRyYSBiaXRzLgorICoKKyAqIC0gVGhlIHJlYXNvbiB0aGF0IDI1OCBnZXRzIGl0cyBvd24gc3ltYm9sIGlzIHRoYXQgdGhlIGxvbmdlc3QgbGVuZ3RoIGlzIHVzZWQKKyAqICAgb2Z0ZW4gaW4gaGlnaGx5IHJlZHVuZGFudCBmaWxlcy4gIE5vdGUgdGhhdCAyNTggY2FuIGFsc28gYmUgY29kZWQgYXMgdGhlCisgKiAgIGJhc2UgdmFsdWUgMjI3IHBsdXMgdGhlIG1heGltdW0gZXh0cmEgdmFsdWUgb2YgMzEuICBXaGlsZSBhIGdvb2QgZGVmbGF0ZQorICogICBzaG91bGQgbmV2ZXIgZG8gdGhpcywgaXQgaXMgbm90IGFuIGVycm9yLCBhbmQgc2hvdWxkIGJlIGRlY29kZWQgcHJvcGVybHkuCisgKgorICogLSBJZiBhIGxlbmd0aCBpcyBkZWNvZGVkLCBpbmNsdWRpbmcgaXRzIGV4dHJhIGJpdHMgaWYgYW55LCB0aGVuIGl0IGlzCisgKiAgIGZvbGxvd2VkIGEgZGlzdGFuY2UgY29kZS4gIFRoZXJlIGFyZSB1cCB0byAzMCBkaXN0YW5jZSBzeW1ib2xzLiAgQWdhaW4KKyAqICAgdGhlcmUgYXJlIG1hbnkgbW9yZSBwb3NzaWJsZSBkaXN0YW5jZXMgKDEuLjMyNzY4KSwgc28gZXh0cmEgYml0cyBhcmUgYWRkZWQKKyAqICAgdG8gYSBiYXNlIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBzeW1ib2wuICBUaGUgZGlzdGFuY2VzIDEuLjQgZ2V0IHRoZWlyCisgKiAgIG93biBzeW1ib2wsIGJ1dCB0aGUgcmVzdCByZXF1aXJlIGV4dHJhIGJpdHMuICBUaGUgYmFzZSBkaXN0YW5jZXMgYW5kCisgKiAgIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mIGV4dHJhIGJpdHMgYXJlIGJlbG93IGluIHRoZSBzdGF0aWMgYXJyYXlzIGRpc3RbXQorICogICBhbmQgZGV4dFtdLgorICoKKyAqIC0gTGl0ZXJhbCBieXRlcyBhcmUgc2ltcGx5IHdyaXR0ZW4gdG8gdGhlIG91dHB1dC4gIEEgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgaXMKKyAqICAgYW4gaW5zdHJ1Y3Rpb24gdG8gY29weSBwcmV2aW91c2x5IHVuY29tcHJlc3NlZCBieXRlcyB0byB0aGUgb3V0cHV0LiAgVGhlCisgKiAgIGNvcHkgaXMgZnJvbSBkaXN0YW5jZSBieXRlcyBiYWNrIGluIHRoZSBvdXRwdXQgc3RyZWFtLCBjb3B5aW5nIGZvciBsZW5ndGgKKyAqICAgYnl0ZXMuCisgKgorICogLSBEaXN0YW5jZXMgcG9pbnRpbmcgYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBkYXRhIGFyZSBub3QKKyAqICAgcGVybWl0dGVkLgorICoKKyAqIC0gT3ZlcmxhcHBlZCBjb3BpZXMsIHdoZXJlIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBkaXN0YW5jZSwgYXJlCisgKiAgIGFsbG93ZWQgYW5kIGNvbW1vbi4gIEZvciBleGFtcGxlLCBhIGRpc3RhbmNlIG9mIG9uZSBhbmQgYSBsZW5ndGggb2YgMjU4CisgKiAgIHNpbXBseSBjb3BpZXMgdGhlIGxhc3QgYnl0ZSAyNTggdGltZXMuICBBIGRpc3RhbmNlIG9mIGZvdXIgYW5kIGEgbGVuZ3RoIG9mCisgKiAgIHR3ZWx2ZSBjb3BpZXMgdGhlIGxhc3QgZm91ciBieXRlcyB0aHJlZSB0aW1lcy4gIEEgc2ltcGxlIGZvcndhcmQgY29weQorICogICBpZ25vcmluZyB3aGV0aGVyIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBkaXN0YW5jZSBvciBub3QgaW1wbGVtZW50cworICogICB0aGlzIGNvcnJlY3RseS4gIFlvdSBzaG91bGQgbm90IHVzZSBtZW1jcHkoKSBzaW5jZSBpdHMgYmVoYXZpb3IgaXMgbm90CisgKiAgIGRlZmluZWQgZm9yIG92ZXJsYXBwZWQgYXJyYXlzLiAgWW91IHNob3VsZCBub3QgdXNlIG1lbW1vdmUoKSBvciBiY29weSgpCisgKiAgIHNpbmNlIHRob3VnaCB0aGVpciBiZWhhdmlvciAtaXMtIGRlZmluZWQgZm9yIG92ZXJsYXBwaW5nIGFycmF5cywgaXQgaXMKKyAqICAgZGVmaW5lZCB0byBkbyB0aGUgd3JvbmcgdGhpbmcgaW4gdGhpcyBjYXNlLgorICovCitsb2NhbCBpbnQgY29kZXMoc3RydWN0IHN0YXRlICpzLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBodWZmbWFuICpsZW5jb2RlLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBodWZmbWFuICpkaXN0Y29kZSkKK3sKKyAgICBpbnQgc3ltYm9sOyAgICAgICAgIC8qIGRlY29kZWQgc3ltYm9sICovCisgICAgaW50IGxlbjsgICAgICAgICAgICAvKiBsZW5ndGggZm9yIGNvcHkgKi8KKyAgICB1bnNpZ25lZCBkaXN0OyAgICAgIC8qIGRpc3RhbmNlIGZvciBjb3B5ICovCisgICAgc3RhdGljIGNvbnN0IHNob3J0IGxlbnNbMjldID0geyAvKiBTaXplIGJhc2UgZm9yIGxlbmd0aCBjb2RlcyAyNTcuLjI4NSAqLworICAgICAgICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLAorICAgICAgICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OH07CisgICAgc3RhdGljIGNvbnN0IHNob3J0IGxleHRbMjldID0geyAvKiBFeHRyYSBiaXRzIGZvciBsZW5ndGggY29kZXMgMjU3Li4yODUgKi8KKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwKKyAgICAgICAgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNSwgNSwgNSwgNSwgMH07CisgICAgc3RhdGljIGNvbnN0IHNob3J0IGRpc3RzWzMwXSA9IHsgLyogT2Zmc2V0IGJhc2UgZm9yIGRpc3RhbmNlIGNvZGVzIDAuLjI5ICovCisgICAgICAgIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MywKKyAgICAgICAgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LAorICAgICAgICA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3fTsKKyAgICBzdGF0aWMgY29uc3Qgc2hvcnQgZGV4dFszMF0gPSB7IC8qIEV4dHJhIGJpdHMgZm9yIGRpc3RhbmNlIGNvZGVzIDAuLjI5ICovCisgICAgICAgIDAsIDAsIDAsIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsCisgICAgICAgIDcsIDcsIDgsIDgsIDksIDksIDEwLCAxMCwgMTEsIDExLAorICAgICAgICAxMiwgMTIsIDEzLCAxM307CisKKyAgICAvKiBkZWNvZGUgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZSBwYWlycyAqLworICAgIGRvIHsKKyAgICAgICAgc3ltYm9sID0gZGVjb2RlKHMsIGxlbmNvZGUpOworICAgICAgICBpZiAoc3ltYm9sIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBzeW1ib2w7ICAgICAgICAgICAgICAvKiBpbnZhbGlkIHN5bWJvbCAqLworICAgICAgICBpZiAoc3ltYm9sIDwgMjU2KSB7ICAgICAgICAgICAgIC8qIGxpdGVyYWw6IHN5bWJvbCBpcyB0aGUgYnl0ZSAqLworICAgICAgICAgICAgLyogd3JpdGUgb3V0IHRoZSBsaXRlcmFsICovCisgICAgICAgICAgICBpZiAocy0+b3V0ICE9IE5JTCkgeworICAgICAgICAgICAgICAgIGlmIChzLT5vdXRjbnQgPT0gcy0+b3V0bGVuKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICBzLT5vdXRbcy0+b3V0Y250XSA9IHN5bWJvbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPm91dGNudCsrOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN5bWJvbCA+IDI1NikgeyAgICAgICAgLyogbGVuZ3RoICovCisgICAgICAgICAgICAvKiBnZXQgYW5kIGNvbXB1dGUgbGVuZ3RoICovCisgICAgICAgICAgICBzeW1ib2wgLT0gMjU3OworICAgICAgICAgICAgaWYgKHN5bWJvbCA+PSAyOSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEwOyAgICAgICAgICAgICAvKiBpbnZhbGlkIGZpeGVkIGNvZGUgKi8KKyAgICAgICAgICAgIGxlbiA9IGxlbnNbc3ltYm9sXSArIGJpdHMocywgbGV4dFtzeW1ib2xdKTsKKworICAgICAgICAgICAgLyogZ2V0IGFuZCBjaGVjayBkaXN0YW5jZSAqLworICAgICAgICAgICAgc3ltYm9sID0gZGVjb2RlKHMsIGRpc3Rjb2RlKTsKKyAgICAgICAgICAgIGlmIChzeW1ib2wgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2w7ICAgICAgICAgIC8qIGludmFsaWQgc3ltYm9sICovCisgICAgICAgICAgICBkaXN0ID0gZGlzdHNbc3ltYm9sXSArIGJpdHMocywgZGV4dFtzeW1ib2xdKTsKKyNpZm5kZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSCisgICAgICAgICAgICBpZiAoZGlzdCA+IHMtPm91dGNudCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTExOyAgICAgLyogZGlzdGFuY2UgdG9vIGZhciBiYWNrICovCisjZW5kaWYKKworICAgICAgICAgICAgLyogY29weSBsZW5ndGggYnl0ZXMgZnJvbSBkaXN0YW5jZSBieXRlcyBiYWNrICovCisgICAgICAgICAgICBpZiAocy0+b3V0ICE9IE5JTCkgeworICAgICAgICAgICAgICAgIGlmIChzLT5vdXRjbnQgKyBsZW4gPiBzLT5vdXRsZW4pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIHdoaWxlIChsZW4tLSkgeworICAgICAgICAgICAgICAgICAgICBzLT5vdXRbcy0+b3V0Y250XSA9CisjaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSCisgICAgICAgICAgICAgICAgICAgICAgICBkaXN0ID4gcy0+b3V0Y250ID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDoKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm91dFtzLT5vdXRjbnQgLSBkaXN0XTsKKyAgICAgICAgICAgICAgICAgICAgcy0+b3V0Y250Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHMtPm91dGNudCArPSBsZW47CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChzeW1ib2wgIT0gMjU2KTsgICAgICAgICAgICAvKiBlbmQgb2YgYmxvY2sgc3ltYm9sICovCisKKyAgICAvKiBkb25lIHdpdGggYSB2YWxpZCBmaXhlZCBvciBkeW5hbWljIGJsb2NrICovCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm9jZXNzIGEgZml4ZWQgY29kZXMgYmxvY2suCisgKgorICogRm9ybWF0IG5vdGVzOgorICoKKyAqIC0gVGhpcyBibG9jayB0eXBlIGNhbiBiZSB1c2VmdWwgZm9yIGNvbXByZXNzaW5nIHNtYWxsIGFtb3VudHMgb2YgZGF0YSBmb3IKKyAqICAgd2hpY2ggdGhlIHNpemUgb2YgdGhlIGNvZGUgZGVzY3JpcHRpb25zIGluIGEgZHluYW1pYyBibG9jayBleGNlZWRzIHRoZQorICogICBiZW5lZml0IG9mIGN1c3RvbSBjb2RlcyBmb3IgdGhhdCBibG9jay4gIEZvciBmaXhlZCBjb2Rlcywgbm8gYml0cyBhcmUKKyAqICAgc3BlbnQgb24gY29kZSBkZXNjcmlwdGlvbnMuICBJbnN0ZWFkIHRoZSBjb2RlIGxlbmd0aHMgZm9yIGxpdGVyYWwvbGVuZ3RoCisgKiAgIGNvZGVzIGFuZCBkaXN0YW5jZSBjb2RlcyBhcmUgZml4ZWQuICBUaGUgc3BlY2lmaWMgbGVuZ3RocyBmb3IgZWFjaCBzeW1ib2wKKyAqICAgY2FuIGJlIHNlZW4gaW4gdGhlICJmb3IiIGxvb3BzIGJlbG93LgorICoKKyAqIC0gVGhlIGxpdGVyYWwvbGVuZ3RoIGNvZGUgaXMgY29tcGxldGUsIGJ1dCBoYXMgdHdvIHN5bWJvbHMgdGhhdCBhcmUgaW52YWxpZAorICogICBhbmQgc2hvdWxkIHJlc3VsdCBpbiBhbiBlcnJvciBpZiByZWNlaXZlZC4gIFRoaXMgY2Fubm90IGJlIGltcGxlbWVudGVkCisgKiAgIHNpbXBseSBhcyBhbiBpbmNvbXBsZXRlIGNvZGUgc2luY2UgdGhvc2UgdHdvIHN5bWJvbHMgYXJlIGluIHRoZSAibWlkZGxlIgorICogICBvZiB0aGUgY29kZS4gIFRoZXkgYXJlIGVpZ2h0IGJpdHMgbG9uZyBhbmQgdGhlIGxvbmdlc3QgbGl0ZXJhbC9sZW5ndGhcCisgKiAgIGNvZGUgaXMgbmluZSBiaXRzLiAgVGhlcmVmb3JlIHRoZSBjb2RlIG11c3QgYmUgY29uc3RydWN0ZWQgd2l0aCB0aG9zZQorICogICBzeW1ib2xzLCBhbmQgdGhlIGludmFsaWQgc3ltYm9scyBtdXN0IGJlIGRldGVjdGVkIGFmdGVyIGRlY29kaW5nLgorICoKKyAqIC0gVGhlIGZpeGVkIGRpc3RhbmNlIGNvZGVzIGFsc28gaGF2ZSB0d28gaW52YWxpZCBzeW1ib2xzIHRoYXQgc2hvdWxkIHJlc3VsdAorICogICBpbiBhbiBlcnJvciBpZiByZWNlaXZlZC4gIFNpbmNlIGFsbCBvZiB0aGUgZGlzdGFuY2UgY29kZXMgYXJlIHRoZSBzYW1lCisgKiAgIGxlbmd0aCwgdGhpcyBjYW4gYmUgaW1wbGVtZW50ZWQgYXMgYW4gaW5jb21wbGV0ZSBjb2RlLiAgVGhlbiB0aGUgaW52YWxpZAorICogICBjb2RlcyBhcmUgZGV0ZWN0ZWQgd2hpbGUgZGVjb2RpbmcuCisgKi8KK2xvY2FsIGludCBmaXhlZChzdHJ1Y3Qgc3RhdGUgKnMpCit7CisgICAgc3RhdGljIGludCB2aXJnaW4gPSAxOworICAgIHN0YXRpYyBzaG9ydCBsZW5jbnRbTUFYQklUUysxXSwgbGVuc3ltW0ZJWExDT0RFU107CisgICAgc3RhdGljIHNob3J0IGRpc3RjbnRbTUFYQklUUysxXSwgZGlzdHN5bVtNQVhEQ09ERVNdOworICAgIHN0YXRpYyBzdHJ1Y3QgaHVmZm1hbiBsZW5jb2RlLCBkaXN0Y29kZTsKKworICAgIC8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdGFibGVzIGlmIGZpcnN0IGNhbGwgKG1heSBub3QgYmUgdGhyZWFkIHNhZmUpICovCisgICAgaWYgKHZpcmdpbikgeworICAgICAgICBpbnQgc3ltYm9sOworICAgICAgICBzaG9ydCBsZW5ndGhzW0ZJWExDT0RFU107CisKKyAgICAgICAgLyogY29uc3RydWN0IGxlbmNvZGUgYW5kIGRpc3Rjb2RlICovCisgICAgICAgIGxlbmNvZGUuY291bnQgPSBsZW5jbnQ7CisgICAgICAgIGxlbmNvZGUuc3ltYm9sID0gbGVuc3ltOworICAgICAgICBkaXN0Y29kZS5jb3VudCA9IGRpc3RjbnQ7CisgICAgICAgIGRpc3Rjb2RlLnN5bWJvbCA9IGRpc3RzeW07CisKKyAgICAgICAgLyogbGl0ZXJhbC9sZW5ndGggdGFibGUgKi8KKyAgICAgICAgZm9yIChzeW1ib2wgPSAwOyBzeW1ib2wgPCAxNDQ7IHN5bWJvbCsrKQorICAgICAgICAgICAgbGVuZ3Roc1tzeW1ib2xdID0gODsKKyAgICAgICAgZm9yICg7IHN5bWJvbCA8IDI1Njsgc3ltYm9sKyspCisgICAgICAgICAgICBsZW5ndGhzW3N5bWJvbF0gPSA5OworICAgICAgICBmb3IgKDsgc3ltYm9sIDwgMjgwOyBzeW1ib2wrKykKKyAgICAgICAgICAgIGxlbmd0aHNbc3ltYm9sXSA9IDc7CisgICAgICAgIGZvciAoOyBzeW1ib2wgPCBGSVhMQ09ERVM7IHN5bWJvbCsrKQorICAgICAgICAgICAgbGVuZ3Roc1tzeW1ib2xdID0gODsKKyAgICAgICAgY29uc3RydWN0KCZsZW5jb2RlLCBsZW5ndGhzLCBGSVhMQ09ERVMpOworCisgICAgICAgIC8qIGRpc3RhbmNlIHRhYmxlICovCisgICAgICAgIGZvciAoc3ltYm9sID0gMDsgc3ltYm9sIDwgTUFYRENPREVTOyBzeW1ib2wrKykKKyAgICAgICAgICAgIGxlbmd0aHNbc3ltYm9sXSA9IDU7CisgICAgICAgIGNvbnN0cnVjdCgmZGlzdGNvZGUsIGxlbmd0aHMsIE1BWERDT0RFUyk7CisKKyAgICAgICAgLyogZG8gdGhpcyBqdXN0IG9uY2UgKi8KKyAgICAgICAgdmlyZ2luID0gMDsKKyAgICB9CisKKyAgICAvKiBkZWNvZGUgZGF0YSB1bnRpbCBlbmQtb2YtYmxvY2sgY29kZSAqLworICAgIHJldHVybiBjb2RlcyhzLCAmbGVuY29kZSwgJmRpc3Rjb2RlKTsKK30KKworLyoKKyAqIFByb2Nlc3MgYSBkeW5hbWljIGNvZGVzIGJsb2NrLgorICoKKyAqIEZvcm1hdCBub3RlczoKKyAqCisgKiAtIEEgZHluYW1pYyBibG9jayBzdGFydHMgd2l0aCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBsaXRlcmFsL2xlbmd0aCBhbmQKKyAqICAgZGlzdGFuY2UgY29kZXMgZm9yIHRoYXQgYmxvY2suICBOZXcgZHluYW1pYyBibG9ja3MgYWxsb3cgdGhlIGNvbXByZXNzb3IgdG8KKyAqICAgcmFwaWRseSBhZGFwdCB0byBjaGFuZ2luZyBkYXRhIHdpdGggbmV3IGNvZGVzIG9wdGltaXplZCBmb3IgdGhhdCBkYXRhLgorICoKKyAqIC0gVGhlIGNvZGVzIHVzZWQgYnkgdGhlIGRlZmxhdGUgZm9ybWF0IGFyZSAiY2Fub25pY2FsIiwgd2hpY2ggbWVhbnMgdGhhdAorICogICB0aGUgYWN0dWFsIGJpdHMgb2YgdGhlIGNvZGVzIGFyZSBnZW5lcmF0ZWQgaW4gYW4gdW5hbWJpZ3VvdXMgd2F5IHNpbXBseQorICogICBmcm9tIHRoZSBudW1iZXIgb2YgYml0cyBpbiBlYWNoIGNvZGUuICBUaGVyZWZvcmUgdGhlIGNvZGUgZGVzY3JpcHRpb25zCisgKiAgIGFyZSBzaW1wbHkgYSBsaXN0IG9mIGNvZGUgbGVuZ3RocyBmb3IgZWFjaCBzeW1ib2wuCisgKgorICogLSBUaGUgY29kZSBsZW5ndGhzIGFyZSBzdG9yZWQgaW4gb3JkZXIgZm9yIHRoZSBzeW1ib2xzLCBzbyBsZW5ndGhzIGFyZQorICogICBwcm92aWRlZCBmb3IgZWFjaCBvZiB0aGUgbGl0ZXJhbC9sZW5ndGggc3ltYm9scywgYW5kIGZvciBlYWNoIG9mIHRoZQorICogICBkaXN0YW5jZSBzeW1ib2xzLgorICoKKyAqIC0gSWYgYSBzeW1ib2wgaXMgbm90IHVzZWQgaW4gdGhlIGJsb2NrLCB0aGlzIGlzIHJlcHJlc2VudGVkIGJ5IGEgemVybyBhcworICogICBhcyB0aGUgY29kZSBsZW5ndGguICBUaGlzIGRvZXMgbm90IG1lYW4gYSB6ZXJvLWxlbmd0aCBjb2RlLCBidXQgcmF0aGVyCisgKiAgIHRoYXQgbm8gY29kZSBzaG91bGQgYmUgY3JlYXRlZCBmb3IgdGhpcyBzeW1ib2wuICBUaGVyZSBpcyBubyB3YXkgaW4gdGhlCisgKiAgIGRlZmxhdGUgZm9ybWF0IHRvIHJlcHJlc2VudCBhIHplcm8tbGVuZ3RoIGNvZGUuCisgKgorICogLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYml0cyBpbiBhIGNvZGUgaXMgMTUsIHNvIHRoZSBwb3NzaWJsZSBsZW5ndGhzIGZvcgorICogICBhbnkgY29kZSBhcmUgMS4uMTUuCisgKgorICogLSBUaGUgZmFjdCB0aGF0IGEgbGVuZ3RoIG9mIHplcm8gaXMgbm90IHBlcm1pdHRlZCBmb3IgYSBjb2RlIGhhcyBhbgorICogICBpbnRlcmVzdGluZyBjb25zZXF1ZW5jZS4gIE5vcm1hbGx5IGlmIG9ubHkgb25lIHN5bWJvbCBpcyB1c2VkIGZvciBhIGdpdmVuCisgKiAgIGNvZGUsIHRoZW4gaW4gZmFjdCB0aGF0IGNvZGUgY291bGQgYmUgcmVwcmVzZW50ZWQgd2l0aCB6ZXJvIGJpdHMuICBIb3dldmVyCisgKiAgIGluIGRlZmxhdGUsIHRoYXQgY29kZSBoYXMgdG8gYmUgYXQgbGVhc3Qgb25lIGJpdC4gIFNvIGZvciBleGFtcGxlLCBpZgorICogICBvbmx5IGEgc2luZ2xlIGRpc3RhbmNlIGJhc2Ugc3ltYm9sIGFwcGVhcnMgaW4gYSBibG9jaywgdGhlbiBpdCB3aWxsIGJlCisgKiAgIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIGNvZGUgb2YgbGVuZ3RoIG9uZSwgaW4gcGFydGljdWxhciBvbmUgMCBiaXQuICBUaGlzCisgKiAgIGlzIGFuIGluY29tcGxldGUgY29kZSwgc2luY2UgaWYgYSAxIGJpdCBpcyByZWNlaXZlZCwgaXQgaGFzIG5vIG1lYW5pbmcsCisgKiAgIGFuZCBzaG91bGQgcmVzdWx0IGluIGFuIGVycm9yLiAgU28gaW5jb21wbGV0ZSBkaXN0YW5jZSBjb2RlcyBvZiBvbmUgc3ltYm9sCisgKiAgIHNob3VsZCBiZSBwZXJtaXR0ZWQsIGFuZCB0aGUgcmVjZWlwdCBvZiBpbnZhbGlkIGNvZGVzIHNob3VsZCBiZSBoYW5kbGVkLgorICoKKyAqIC0gSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBoYXZlIGEgc2luZ2xlIGxpdGVyYWwvbGVuZ3RoIGNvZGUsIGJ1dCB0aGF0IGNvZGUKKyAqICAgbXVzdCBiZSB0aGUgZW5kLW9mLWJsb2NrIGNvZGUsIHNpbmNlIGV2ZXJ5IGR5bmFtaWMgYmxvY2sgaGFzIG9uZS4gIFRoaXMKKyAqICAgaXMgbm90IHRoZSBtb3N0IGVmZmljaWVudCB3YXkgdG8gY3JlYXRlIGFuIGVtcHR5IGJsb2NrIChhbiBlbXB0eSBmaXhlZAorICogICBibG9jayBpcyBmZXdlciBiaXRzKSwgYnV0IGl0IGlzIGFsbG93ZWQgYnkgdGhlIGZvcm1hdC4gIFNvIGluY29tcGxldGUKKyAqICAgbGl0ZXJhbC9sZW5ndGggY29kZXMgb2Ygb25lIHN5bWJvbCBzaG91bGQgYWxzbyBiZSBwZXJtaXR0ZWQuCisgKgorICogLSBJZiB0aGVyZSBhcmUgb25seSBsaXRlcmFsIGNvZGVzIGFuZCBubyBsZW5ndGhzLCB0aGVuIHRoZXJlIGFyZSBubyBkaXN0YW5jZQorICogICBjb2Rlcy4gIFRoaXMgaXMgcmVwcmVzZW50ZWQgYnkgb25lIGRpc3RhbmNlIGNvZGUgd2l0aCB6ZXJvIGJpdHMuCisgKgorICogLSBUaGUgbGlzdCBvZiB1cCB0byAyODYgbGVuZ3RoL2xpdGVyYWwgbGVuZ3RocyBhbmQgdXAgdG8gMzAgZGlzdGFuY2UgbGVuZ3RocworICogICBhcmUgdGhlbXNlbHZlcyBjb21wcmVzc2VkIHVzaW5nIEh1ZmZtYW4gY29kZXMgYW5kIHJ1bi1sZW5ndGggZW5jb2RpbmcuICBJbgorICogICB0aGUgbGlzdCBvZiBjb2RlIGxlbmd0aHMsIGEgMCBzeW1ib2wgbWVhbnMgbm8gY29kZSwgYSAxLi4xNSBzeW1ib2wgbWVhbnMKKyAqICAgdGhhdCBsZW5ndGgsIGFuZCB0aGUgc3ltYm9scyAxNiwgMTcsIGFuZCAxOCBhcmUgcnVuLWxlbmd0aCBpbnN0cnVjdGlvbnMuCisgKiAgIEVhY2ggb2YgMTYsIDE3LCBhbmQgMTggYXJlIGZvbGx3ZWQgYnkgZXh0cmEgYml0cyB0byBkZWZpbmUgdGhlIGxlbmd0aCBvZgorICogICB0aGUgcnVuLiAgMTYgY29waWVzIHRoZSBsYXN0IGxlbmd0aCAzIHRvIDYgdGltZXMuICAxNyByZXByZXNlbnRzIDMgdG8gMTAKKyAqICAgemVybyBsZW5ndGhzLCBhbmQgMTggcmVwcmVzZW50cyAxMSB0byAxMzggemVybyBsZW5ndGhzLiAgVW51c2VkIHN5bWJvbHMKKyAqICAgYXJlIGNvbW1vbiwgaGVuY2UgdGhlIHNwZWNpYWwgY29kaW5nIGZvciB6ZXJvIGxlbmd0aHMuCisgKgorICogLSBUaGUgc3ltYm9scyBmb3IgMC4uMTggYXJlIEh1ZmZtYW4gY29kZWQsIGFuZCBzbyB0aGF0IGNvZGUgbXVzdCBiZQorICogICBkZXNjcmliZWQgZmlyc3QuICBUaGlzIGlzIHNpbXBseSBhIHNlcXVlbmNlIG9mIHVwIHRvIDE5IHRocmVlLWJpdCB2YWx1ZXMKKyAqICAgcmVwcmVzZW50aW5nIG5vIGNvZGUgKDApIG9yIHRoZSBjb2RlIGxlbmd0aCBmb3IgdGhhdCBzeW1ib2wgKDEuLjcpLgorICoKKyAqIC0gQSBkeW5hbWljIGJsb2NrIHN0YXJ0cyB3aXRoIHRocmVlIGZpeGVkLXNpemUgY291bnRzIGZyb20gd2hpY2ggaXMgY29tcHV0ZWQKKyAqICAgdGhlIG51bWJlciBvZiBsaXRlcmFsL2xlbmd0aCBjb2RlIGxlbmd0aHMsIHRoZSBudW1iZXIgb2YgZGlzdGFuY2UgY29kZQorICogICBsZW5ndGhzLCBhbmQgdGhlIG51bWJlciBvZiBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKG9rLCB5b3UgY29tZSB1cCB3aXRoCisgKiAgIGEgYmV0dGVyIG5hbWUhKSBpbiB0aGUgY29kZSBkZXNjcmlwdGlvbnMuICBGb3IgdGhlIGxpdGVyYWwvbGVuZ3RoIGFuZAorICogICBkaXN0YW5jZSBjb2RlcywgbGVuZ3RocyBhZnRlciB0aG9zZSBwcm92aWRlZCBhcmUgY29uc2lkZXJlZCB6ZXJvLCBpLmUuIG5vCisgKiAgIGNvZGUuICBUaGUgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzIGFyZSByZWNlaXZlZCBpbiBhIHBlcm11dGVkIG9yZGVyIChzZWUKKyAqICAgdGhlIG9yZGVyW10gYXJyYXkgYmVsb3cpIHRvIG1ha2UgYSBzaG9ydCBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aCBsaXN0IG1vcmUKKyAqICAgbGlrZWx5LiAgQXMgaXQgdHVybnMgb3V0LCB2ZXJ5IHNob3J0IGFuZCB2ZXJ5IGxvbmcgY29kZXMgYXJlIGxlc3MgbGlrZWx5CisgKiAgIHRvIGJlIHNlZW4gaW4gYSBkeW5hbWljIGNvZGUgZGVzY3JpcHRpb24sIGhlbmNlIHdoYXQgbWF5IGFwcGVhciBpbml0aWFsbHkKKyAqICAgdG8gYmUgYSBwZWN1bGlhciBvcmRlcmluZy4KKyAqCisgKiAtIEdpdmVuIHRoZSBudW1iZXIgb2YgbGl0ZXJhbC9sZW5ndGggY29kZSBsZW5ndGhzIChubGVuKSBhbmQgZGlzdGFuY2UgY29kZQorICogICBsZW5ndGhzIChuZGlzdCksIHRoZW4gdGhleSBhcmUgdHJlYXRlZCBhcyBvbmUgbG9uZyBsaXN0IG9mIG5sZW4gKyBuZGlzdAorICogICBjb2RlIGxlbmd0aHMuICBUaGVyZWZvcmUgcnVuLWxlbmd0aCBjb2RpbmcgY2FuIGFuZCBvZnRlbiBkb2VzIGNyb3NzIHRoZQorICogICBib3VuZGFyeSBiZXR3ZWVuIHRoZSB0d28gc2V0cyBvZiBsZW5ndGhzLgorICoKKyAqIC0gU28gdG8gc3VtbWFyaXplLCB0aGUgY29kZSBkZXNjcmlwdGlvbiBhdCB0aGUgc3RhcnQgb2YgYSBkeW5hbWljIGJsb2NrIGlzCisgKiAgIHRocmVlIGNvdW50cyBmb3IgdGhlIG51bWJlciBvZiBjb2RlIGxlbmd0aHMgZm9yIHRoZSBsaXRlcmFsL2xlbmd0aCBjb2RlcywKKyAqICAgdGhlIGRpc3RhbmNlIGNvZGVzLCBhbmQgdGhlIGNvZGUgbGVuZ3RoIGNvZGVzLiAgVGhpcyBpcyBmb2xsb3dlZCBieSB0aGUKKyAqICAgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzLCB0aHJlZSBiaXRzIGVhY2guICBUaGlzIGlzIHVzZWQgdG8gY29uc3RydWN0IHRoZQorICogICBjb2RlIGxlbmd0aCBjb2RlIHdoaWNoIGlzIHVzZWQgdG8gcmVhZCB0aGUgcmVtYWluZGVyIG9mIHRoZSBsZW5ndGhzLiAgVGhlbgorICogICB0aGUgbGl0ZXJhbC9sZW5ndGggY29kZSBsZW5ndGhzIGFuZCBkaXN0YW5jZSBsZW5ndGhzIGFyZSByZWFkIGFzIGEgc2luZ2xlCisgKiAgIHNldCBvZiBsZW5ndGhzIHVzaW5nIHRoZSBjb2RlIGxlbmd0aCBjb2Rlcy4gIENvZGVzIGFyZSBjb25zdHJ1Y3RlZCBmcm9tCisgKiAgIHRoZSByZXN1bHRpbmcgdHdvIHNldHMgb2YgbGVuZ3RocywgYW5kIHRoZW4gZmluYWxseSB5b3UgY2FuIHN0YXJ0CisgKiAgIGRlY29kaW5nIGFjdHVhbCBjb21wcmVzc2VkIGRhdGEgaW4gdGhlIGJsb2NrLgorICoKKyAqIC0gRm9yIHJlZmVyZW5jZSwgYSAidHlwaWNhbCIgc2l6ZSBmb3IgdGhlIGNvZGUgZGVzY3JpcHRpb24gaW4gYSBkeW5hbWljCisgKiAgIGJsb2NrIGlzIGFyb3VuZCA4MCBieXRlcy4KKyAqLworbG9jYWwgaW50IGR5bmFtaWMoc3RydWN0IHN0YXRlICpzKQoreworICAgIGludCBubGVuLCBuZGlzdCwgbmNvZGU7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsZW5ndGhzIGluIGRlc2NyaXB0b3IgKi8KKyAgICBpbnQgaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBvZiBsZW5ndGhzW10gKi8KKyAgICBpbnQgZXJyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25zdHJ1Y3QoKSByZXR1cm4gdmFsdWUgKi8KKyAgICBzaG9ydCBsZW5ndGhzW01BWENPREVTXTsgICAgICAgICAgICAvKiBkZXNjcmlwdG9yIGNvZGUgbGVuZ3RocyAqLworICAgIHNob3J0IGxlbmNudFtNQVhCSVRTKzFdLCBsZW5zeW1bTUFYTENPREVTXTsgICAgICAgICAvKiBsZW5jb2RlIG1lbW9yeSAqLworICAgIHNob3J0IGRpc3RjbnRbTUFYQklUUysxXSwgZGlzdHN5bVtNQVhEQ09ERVNdOyAgICAgICAvKiBkaXN0Y29kZSBtZW1vcnkgKi8KKyAgICBzdHJ1Y3QgaHVmZm1hbiBsZW5jb2RlLCBkaXN0Y29kZTsgICAvKiBsZW5ndGggYW5kIGRpc3RhbmNlIGNvZGVzICovCisgICAgc3RhdGljIGNvbnN0IHNob3J0IG9yZGVyWzE5XSA9ICAgICAgLyogcGVybXV0YXRpb24gb2YgY29kZSBsZW5ndGggY29kZXMgKi8KKyAgICAgICAgezE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTV9OworCisgICAgLyogY29uc3RydWN0IGxlbmNvZGUgYW5kIGRpc3Rjb2RlICovCisgICAgbGVuY29kZS5jb3VudCA9IGxlbmNudDsKKyAgICBsZW5jb2RlLnN5bWJvbCA9IGxlbnN5bTsKKyAgICBkaXN0Y29kZS5jb3VudCA9IGRpc3RjbnQ7CisgICAgZGlzdGNvZGUuc3ltYm9sID0gZGlzdHN5bTsKKworICAgIC8qIGdldCBudW1iZXIgb2YgbGVuZ3RocyBpbiBlYWNoIHRhYmxlLCBjaGVjayBsZW5ndGhzICovCisgICAgbmxlbiA9IGJpdHMocywgNSkgKyAyNTc7CisgICAgbmRpc3QgPSBiaXRzKHMsIDUpICsgMTsKKyAgICBuY29kZSA9IGJpdHMocywgNCkgKyA0OworICAgIGlmIChubGVuID4gTUFYTENPREVTIHx8IG5kaXN0ID4gTUFYRENPREVTKQorICAgICAgICByZXR1cm4gLTM7ICAgICAgICAgICAgICAgICAgICAgIC8qIGJhZCBjb3VudHMgKi8KKworICAgIC8qIHJlYWQgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzIChyZWFsbHkpLCBtaXNzaW5nIGxlbmd0aHMgYXJlIHplcm8gKi8KKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBuY29kZTsgaW5kZXgrKykKKyAgICAgICAgbGVuZ3Roc1tvcmRlcltpbmRleF1dID0gYml0cyhzLCAzKTsKKyAgICBmb3IgKDsgaW5kZXggPCAxOTsgaW5kZXgrKykKKyAgICAgICAgbGVuZ3Roc1tvcmRlcltpbmRleF1dID0gMDsKKworICAgIC8qIGJ1aWxkIGh1ZmZtYW4gdGFibGUgZm9yIGNvZGUgbGVuZ3RocyBjb2RlcyAodXNlIGxlbmNvZGUgdGVtcG9yYXJpbHkpICovCisgICAgZXJyID0gY29uc3RydWN0KCZsZW5jb2RlLCBsZW5ndGhzLCAxOSk7CisgICAgaWYgKGVyciAhPSAwKSAgICAgICAgICAgICAgIC8qIHJlcXVpcmUgY29tcGxldGUgY29kZSBzZXQgaGVyZSAqLworICAgICAgICByZXR1cm4gLTQ7CisKKyAgICAvKiByZWFkIGxlbmd0aC9saXRlcmFsIGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aCB0YWJsZXMgKi8KKyAgICBpbmRleCA9IDA7CisgICAgd2hpbGUgKGluZGV4IDwgbmxlbiArIG5kaXN0KSB7CisgICAgICAgIGludCBzeW1ib2w7ICAgICAgICAgICAgIC8qIGRlY29kZWQgdmFsdWUgKi8KKyAgICAgICAgaW50IGxlbjsgICAgICAgICAgICAgICAgLyogbGFzdCBsZW5ndGggdG8gcmVwZWF0ICovCisKKyAgICAgICAgc3ltYm9sID0gZGVjb2RlKHMsICZsZW5jb2RlKTsKKyAgICAgICAgaWYgKHN5bWJvbCA8IDApCisgICAgICAgICAgICByZXR1cm4gc3ltYm9sOyAgICAgICAgICAvKiBpbnZhbGlkIHN5bWJvbCAqLworICAgICAgICBpZiAoc3ltYm9sIDwgMTYpICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBpbiAwLi4xNSAqLworICAgICAgICAgICAgbGVuZ3Roc1tpbmRleCsrXSA9IHN5bWJvbDsKKyAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXBlYXQgaW5zdHJ1Y3Rpb24gKi8KKyAgICAgICAgICAgIGxlbiA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBhc3N1bWUgcmVwZWF0aW5nIHplcm9zICovCisgICAgICAgICAgICBpZiAoc3ltYm9sID09IDE2KSB7ICAgICAgICAgLyogcmVwZWF0IGxhc3QgbGVuZ3RoIDMuLjYgdGltZXMgKi8KKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC01OyAgICAgICAgICAvKiBubyBsYXN0IGxlbmd0aCEgKi8KKyAgICAgICAgICAgICAgICBsZW4gPSBsZW5ndGhzW2luZGV4IC0gMV07ICAgICAgIC8qIGxhc3QgbGVuZ3RoICovCisgICAgICAgICAgICAgICAgc3ltYm9sID0gMyArIGJpdHMocywgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzeW1ib2wgPT0gMTcpICAgICAgLyogcmVwZWF0IHplcm8gMy4uMTAgdGltZXMgKi8KKyAgICAgICAgICAgICAgICBzeW1ib2wgPSAzICsgYml0cyhzLCAzKTsKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAvKiA9PSAxOCwgcmVwZWF0IHplcm8gMTEuLjEzOCB0aW1lcyAqLworICAgICAgICAgICAgICAgIHN5bWJvbCA9IDExICsgYml0cyhzLCA3KTsKKyAgICAgICAgICAgIGlmIChpbmRleCArIHN5bWJvbCA+IG5sZW4gKyBuZGlzdCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTY7ICAgICAgICAgICAgICAvKiB0b28gbWFueSBsZW5ndGhzISAqLworICAgICAgICAgICAgd2hpbGUgKHN5bWJvbC0tKSAgICAgICAgICAgIC8qIHJlcGVhdCBsYXN0IG9yIHplcm8gc3ltYm9sIHRpbWVzICovCisgICAgICAgICAgICAgICAgbGVuZ3Roc1tpbmRleCsrXSA9IGxlbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNoZWNrIGZvciBlbmQtb2YtYmxvY2sgY29kZSAtLSB0aGVyZSBiZXR0ZXIgYmUgb25lISAqLworICAgIGlmIChsZW5ndGhzWzI1Nl0gPT0gMCkKKyAgICAgICAgcmV0dXJuIC05OworCisgICAgLyogYnVpbGQgaHVmZm1hbiB0YWJsZSBmb3IgbGl0ZXJhbC9sZW5ndGggY29kZXMgKi8KKyAgICBlcnIgPSBjb25zdHJ1Y3QoJmxlbmNvZGUsIGxlbmd0aHMsIG5sZW4pOworICAgIGlmIChlcnIgJiYgKGVyciA8IDAgfHwgbmxlbiAhPSBsZW5jb2RlLmNvdW50WzBdICsgbGVuY29kZS5jb3VudFsxXSkpCisgICAgICAgIHJldHVybiAtNzsgICAgICAvKiBpbmNvbXBsZXRlIGNvZGUgb2sgb25seSBmb3Igc2luZ2xlIGxlbmd0aCAxIGNvZGUgKi8KKworICAgIC8qIGJ1aWxkIGh1ZmZtYW4gdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzICovCisgICAgZXJyID0gY29uc3RydWN0KCZkaXN0Y29kZSwgbGVuZ3RocyArIG5sZW4sIG5kaXN0KTsKKyAgICBpZiAoZXJyICYmIChlcnIgPCAwIHx8IG5kaXN0ICE9IGRpc3Rjb2RlLmNvdW50WzBdICsgZGlzdGNvZGUuY291bnRbMV0pKQorICAgICAgICByZXR1cm4gLTg7ICAgICAgLyogaW5jb21wbGV0ZSBjb2RlIG9rIG9ubHkgZm9yIHNpbmdsZSBsZW5ndGggMSBjb2RlICovCisKKyAgICAvKiBkZWNvZGUgZGF0YSB1bnRpbCBlbmQtb2YtYmxvY2sgY29kZSAqLworICAgIHJldHVybiBjb2RlcyhzLCAmbGVuY29kZSwgJmRpc3Rjb2RlKTsKK30KKworLyoKKyAqIEluZmxhdGUgc291cmNlIHRvIGRlc3QuICBPbiByZXR1cm4sIGRlc3RsZW4gYW5kIHNvdXJjZWxlbiBhcmUgdXBkYXRlZCB0byB0aGUKKyAqIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGFuZCB0aGUgc2l6ZSBvZiB0aGUgZGVmbGF0ZSBkYXRhIHJlc3BlY3RpdmVseS4KKyAqIE9uIHN1Y2Nlc3MsIHRoZSByZXR1cm4gdmFsdWUgb2YgcHVmZigpIGlzIHplcm8uICBJZiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUKKyAqIHNvdXJjZSBkYXRhLCBpLmUuIGl0IGlzIG5vdCBpbiB0aGUgZGVmbGF0ZSBmb3JtYXQsIHRoZW4gYSBuZWdhdGl2ZSB2YWx1ZSBpcworICogcmV0dXJuZWQuICBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIGlucHV0IGF2YWlsYWJsZSBvciB0aGVyZSBpcyBub3QgZW5vdWdoCisgKiBvdXRwdXQgc3BhY2UsIHRoZW4gYSBwb3NpdGl2ZSBlcnJvciBpcyByZXR1cm5lZC4gIEluIHRoYXQgY2FzZSwgZGVzdGxlbiBhbmQKKyAqIHNvdXJjZWxlbiBhcmUgbm90IHVwZGF0ZWQgdG8gZmFjaWxpdGF0ZSByZXRyeWluZyBmcm9tIHRoZSBiZWdpbm5pbmcgd2l0aCB0aGUKKyAqIHByb3Zpc2lvbiBvZiBtb3JlIGlucHV0IGRhdGEgb3IgbW9yZSBvdXRwdXQgc3BhY2UuICBJbiB0aGUgY2FzZSBvZiBpbnZhbGlkCisgKiBpbmZsYXRlIGRhdGEgKGEgbmVnYXRpdmUgZXJyb3IpLCB0aGUgZGVzdCBhbmQgc291cmNlIHBvaW50ZXJzIGFyZSB1cGRhdGVkIHRvCisgKiBmYWNpbGl0YXRlIHRoZSBkZWJ1Z2dpbmcgb2YgZGVmbGF0b3JzLgorICoKKyAqIHB1ZmYoKSBhbHNvIGhhcyBhIG1vZGUgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgb3V0cHV0IHdpdGgKKyAqIG5vIG91dHB1dCB3cml0dGVuLiAgRm9yIHRoaXMgZGVzdCBtdXN0IGJlICh1bnNpZ25lZCBjaGFyICopMC4gIEluIHRoaXMgY2FzZSwKKyAqIHRoZSBpbnB1dCB2YWx1ZSBvZiAqZGVzdGxlbiBpcyBpZ25vcmVkLCBhbmQgb24gcmV0dXJuICpkZXN0bGVuIGlzIHNldCB0byB0aGUKKyAqIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBvdXRwdXQuCisgKgorICogVGhlIHJldHVybiBjb2RlcyBhcmU6CisgKgorICogICAyOiAgYXZhaWxhYmxlIGluZmxhdGUgZGF0YSBkaWQgbm90IHRlcm1pbmF0ZQorICogICAxOiAgb3V0cHV0IHNwYWNlIGV4aGF1c3RlZCBiZWZvcmUgY29tcGxldGluZyBpbmZsYXRlCisgKiAgIDA6ICBzdWNjZXNzZnVsIGluZmxhdGUKKyAqICAtMTogIGludmFsaWQgYmxvY2sgdHlwZSAodHlwZSA9PSAzKQorICogIC0yOiAgc3RvcmVkIGJsb2NrIGxlbmd0aCBkaWQgbm90IG1hdGNoIG9uZSdzIGNvbXBsZW1lbnQKKyAqICAtMzogIGR5bmFtaWMgYmxvY2sgY29kZSBkZXNjcmlwdGlvbjogdG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIGNvZGVzCisgKiAgLTQ6ICBkeW5hbWljIGJsb2NrIGNvZGUgZGVzY3JpcHRpb246IGNvZGUgbGVuZ3RocyBjb2RlcyBpbmNvbXBsZXRlCisgKiAgLTU6ICBkeW5hbWljIGJsb2NrIGNvZGUgZGVzY3JpcHRpb246IHJlcGVhdCBsZW5ndGhzIHdpdGggbm8gZmlyc3QgbGVuZ3RoCisgKiAgLTY6ICBkeW5hbWljIGJsb2NrIGNvZGUgZGVzY3JpcHRpb246IHJlcGVhdCBtb3JlIHRoYW4gc3BlY2lmaWVkIGxlbmd0aHMKKyAqICAtNzogIGR5bmFtaWMgYmxvY2sgY29kZSBkZXNjcmlwdGlvbjogaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIGxlbmd0aHMKKyAqICAtODogIGR5bmFtaWMgYmxvY2sgY29kZSBkZXNjcmlwdGlvbjogaW52YWxpZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMKKyAqICAtOTogIGR5bmFtaWMgYmxvY2sgY29kZSBkZXNjcmlwdGlvbjogbWlzc2luZyBlbmQtb2YtYmxvY2sgY29kZQorICogLTEwOiAgaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBvciBkaXN0YW5jZSBjb2RlIGluIGZpeGVkIG9yIGR5bmFtaWMgYmxvY2sKKyAqIC0xMTogIGRpc3RhbmNlIGlzIHRvbyBmYXIgYmFjayBpbiBmaXhlZCBvciBkeW5hbWljIGJsb2NrCisgKgorICogRm9ybWF0IG5vdGVzOgorICoKKyAqIC0gVGhyZWUgYml0cyBhcmUgcmVhZCBmb3IgZWFjaCBibG9jayB0byBkZXRlcm1pbmUgdGhlIGtpbmQgb2YgYmxvY2sgYW5kCisgKiAgIHdoZXRoZXIgb3Igbm90IGl0IGlzIHRoZSBsYXN0IGJsb2NrLiAgVGhlbiB0aGUgYmxvY2sgaXMgZGVjb2RlZCBhbmQgdGhlCisgKiAgIHByb2Nlc3MgcmVwZWF0ZWQgaWYgaXQgd2FzIG5vdCB0aGUgbGFzdCBibG9jay4KKyAqCisgKiAtIFRoZSBsZWZ0b3ZlciBiaXRzIGluIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIGRlZmxhdGUgZGF0YSBhZnRlciB0aGUgbGFzdAorICogICBibG9jayAoaWYgaXQgd2FzIGEgZml4ZWQgb3IgZHluYW1pYyBibG9jaykgYXJlIHVuZGVmaW5lZCBhbmQgaGF2ZSBubworICogICBleHBlY3RlZCB2YWx1ZXMgdG8gY2hlY2suCisgKi8KK2ludCBwdWZmKHVuc2lnbmVkIGNoYXIgKmRlc3QsICAgICAgICAgICAvKiBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHBvaW50ZXIgKi8KKyAgICAgICAgIHVuc2lnbmVkIGxvbmcgKmRlc3RsZW4sICAgICAgICAvKiBhbW91bnQgb2Ygb3V0cHV0IHNwYWNlICovCisgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsICAgLyogcG9pbnRlciB0byBzb3VyY2UgZGF0YSBwb2ludGVyICovCisgICAgICAgICB1bnNpZ25lZCBsb25nICpzb3VyY2VsZW4pICAgICAgLyogYW1vdW50IG9mIGlucHV0IGF2YWlsYWJsZSAqLworeworICAgIHN0cnVjdCBzdGF0ZSBzOyAgICAgICAgICAgICAvKiBpbnB1dC9vdXRwdXQgc3RhdGUgKi8KKyAgICBpbnQgbGFzdCwgdHlwZTsgICAgICAgICAgICAgLyogYmxvY2sgaW5mb3JtYXRpb24gKi8KKyAgICBpbnQgZXJyOyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIHZhbHVlICovCisKKyAgICAvKiBpbml0aWFsaXplIG91dHB1dCBzdGF0ZSAqLworICAgIHMub3V0ID0gZGVzdDsKKyAgICBzLm91dGxlbiA9ICpkZXN0bGVuOyAgICAgICAgICAgICAgICAvKiBpZ25vcmVkIGlmIGRlc3QgaXMgTklMICovCisgICAgcy5vdXRjbnQgPSAwOworCisgICAgLyogaW5pdGlhbGl6ZSBpbnB1dCBzdGF0ZSAqLworICAgIHMuaW4gPSBzb3VyY2U7CisgICAgcy5pbmxlbiA9ICpzb3VyY2VsZW47CisgICAgcy5pbmNudCA9IDA7CisgICAgcy5iaXRidWYgPSAwOworICAgIHMuYml0Y250ID0gMDsKKworICAgIC8qIHJldHVybiBpZiBiaXRzKCkgb3IgZGVjb2RlKCkgdHJpZXMgdG8gcmVhZCBwYXN0IGF2YWlsYWJsZSBpbnB1dCAqLworICAgIGlmIChzZXRqbXAocy5lbnYpICE9IDApICAgICAgICAgICAgIC8qIGlmIGNhbWUgYmFjayBoZXJlIHZpYSBsb25nam1wKCkgKi8KKyAgICAgICAgZXJyID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVuIHNraXAgZG8tbG9vcCwgcmV0dXJuIGVycm9yICovCisgICAgZWxzZSB7CisgICAgICAgIC8qIHByb2Nlc3MgYmxvY2tzIHVudGlsIGxhc3QgYmxvY2sgb3IgZXJyb3IgKi8KKyAgICAgICAgZG8geworICAgICAgICAgICAgbGFzdCA9IGJpdHMoJnMsIDEpOyAgICAgICAgIC8qIG9uZSBpZiBsYXN0IGJsb2NrICovCisgICAgICAgICAgICB0eXBlID0gYml0cygmcywgMik7ICAgICAgICAgLyogYmxvY2sgdHlwZSAwLi4zICovCisgICAgICAgICAgICBlcnIgPSB0eXBlID09IDAgPworICAgICAgICAgICAgICAgICAgICBzdG9yZWQoJnMpIDoKKyAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gMSA/CisgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZCgmcykgOgorICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gMiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYygmcykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xKSk7ICAgICAgIC8qIHR5cGUgPT0gMywgaW52YWxpZCAqLworICAgICAgICAgICAgaWYgKGVyciAhPSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgIC8qIHJldHVybiB3aXRoIGVycm9yICovCisgICAgICAgIH0gd2hpbGUgKCFsYXN0KTsKKyAgICB9CisKKyAgICAvKiB1cGRhdGUgdGhlIGxlbmd0aHMgYW5kIHJldHVybiAqLworICAgIGlmIChlcnIgPD0gMCkgeworICAgICAgICAqZGVzdGxlbiA9IHMub3V0Y250OworICAgICAgICAqc291cmNlbGVuID0gcy5pbmNudDsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvcHVmZi9wdWZmLmggYi96bGliL3NyYy9jb250cmliL3B1ZmYvcHVmZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyM2EyNDUKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3B1ZmYvcHVmZi5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIHB1ZmYuaAorICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMyBNYXJrIEFkbGVyLCBhbGwgcmlnaHRzIHJlc2VydmVkCisgIHZlcnNpb24gMi4zLCAyMSBKYW4gMjAxMworCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9yIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorCisgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCisgIE1hcmsgQWRsZXIgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQorICovCisKKworLyoKKyAqIFNlZSBwdWZmLmMgZm9yIHB1cnBvc2UgYW5kIHVzYWdlLgorICovCisjaWZuZGVmIE5JTAorIyAgZGVmaW5lIE5JTCAoKHVuc2lnbmVkIGNoYXIgKikwKSAgICAgIC8qIGZvciBubyBvdXRwdXQgb3B0aW9uICovCisjZW5kaWYKKworaW50IHB1ZmYodW5zaWduZWQgY2hhciAqZGVzdCwgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcG9pbnRlciAqLworICAgICAgICAgdW5zaWduZWQgbG9uZyAqZGVzdGxlbiwgICAgICAgIC8qIGFtb3VudCBvZiBvdXRwdXQgc3BhY2UgKi8KKyAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNvdXJjZSwgICAvKiBwb2ludGVyIHRvIHNvdXJjZSBkYXRhIHBvaW50ZXIgKi8KKyAgICAgICAgIHVuc2lnbmVkIGxvbmcgKnNvdXJjZWxlbik7ICAgICAvKiBhbW91bnQgb2YgaW5wdXQgYXZhaWxhYmxlICovCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL3B1ZmYvcHVmZnRlc3QuYyBiL3psaWIvc3JjL2NvbnRyaWIvcHVmZi9wdWZmdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NjQ4MTQKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3B1ZmYvcHVmZnRlc3QuYwpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIHB1ZmZ0ZXN0LmMKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDEzIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBwdWZmLmgKKyAqIHZlcnNpb24gMi4zLCAyMSBKYW4gMjAxMworICovCisKKy8qIEV4YW1wbGUgb2YgaG93IHRvIHVzZSBwdWZmKCkuCisKKyAgIFVzYWdlOiBwdWZmIFstd10gWy1mXSBbLW5ubl0gZmlsZQorICAgICAgICAgIC4uLiB8IHB1ZmYgWy13XSBbLWZdIFstbm5uXQorCisgICB3aGVyZSBmaWxlIGlzIHRoZSBpbnB1dCBmaWxlIHdpdGggZGVmbGF0ZSBkYXRhLCBubm4gaXMgdGhlIG51bWJlciBvZiBieXRlcworICAgb2YgaW5wdXQgdG8gc2tpcCBiZWZvcmUgaW5mbGF0aW5nIChlLmcuIHRvIHNraXAgYSB6bGliIG9yIGd6aXAgaGVhZGVyKSwgYW5kCisgICAtdyBpcyB1c2VkIHRvIHdyaXRlIHRoZSBkZWNvbXByZXNzZWQgZGF0YSB0byBzdGRvdXQuICAtZiBpcyBmb3IgY292ZXJhZ2UKKyAgIHRlc3RpbmcsIGFuZCBjYXVzZXMgcHVmZnRlc3QgdG8gZmFpbCB3aXRoIG5vdCBlbm91Z2ggb3V0cHV0IHNwYWNlICgtZiBkb2VzCisgICBhIHdyaXRlIGxpa2UgLXcsIHNvIC13IGlzIG5vdCByZXF1aXJlZCkuICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInB1ZmYuaCIKKworI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisjICBpbmNsdWRlIDxmY250bC5oPgorIyAgaW5jbHVkZSA8aW8uaD4KKyMgIGRlZmluZSBTRVRfQklOQVJZX01PREUoZmlsZSkgc2V0bW9kZShmaWxlbm8oZmlsZSksIE9fQklOQVJZKQorI2Vsc2UKKyMgIGRlZmluZSBTRVRfQklOQVJZX01PREUoZmlsZSkKKyNlbmRpZgorCisjZGVmaW5lIGxvY2FsIHN0YXRpYworCisvKiBSZXR1cm4gc2l6ZSB0aW1lcyBhcHByb3hpbWF0ZWx5IHRoZSBjdWJlIHJvb3Qgb2YgMiwga2VlcGluZyB0aGUgcmVzdWx0IGFzIDEsCisgICAzLCBvciA1IHRpbWVzIGEgcG93ZXIgb2YgMiAtLSB0aGUgcmVzdWx0IGlzIGFsd2F5cyA+IHNpemUsIHVudGlsIHRoZSByZXN1bHQKKyAgIGlzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGFuIHVuc2lnbmVkIGxvbmcsIHdoZXJlIGl0IHJlbWFpbnMuICBUaGlzIGlzIHVzZWZ1bAorICAgdG8ga2VlcCByZWFsbG9jYXRpb25zIGxlc3MgdGhhbiB+MzMlIG92ZXIgdGhlIGFjdHVhbCBkYXRhLiAqLworbG9jYWwgc2l6ZV90IGJ5dGhpcmRzKHNpemVfdCBzaXplKQoreworICAgIGludCBuOworICAgIHNpemVfdCBtOworCisgICAgbSA9IHNpemU7CisgICAgZm9yIChuID0gMDsgbTsgbisrKQorICAgICAgICBtID4+PSAxOworICAgIGlmIChuIDwgMykKKyAgICAgICAgcmV0dXJuIHNpemUgKyAxOworICAgIG4gLT0gMzsKKyAgICBtID0gc2l6ZSA+PiBuOworICAgIG0gKz0gbSA9PSA2ID8gMiA6IDE7CisgICAgbSA8PD0gbjsKKyAgICByZXR1cm4gbSA+IHNpemUgPyBtIDogKHNpemVfdCkoLTEpOworfQorCisvKiBSZWFkIHRoZSBpbnB1dCBmaWxlICpuYW1lLCBvciBzdGRpbiBpZiBuYW1lIGlzIE5VTEwsIGludG8gYWxsb2NhdGVkIG1lbW9yeS4KKyAgIFJlYWxsb2NhdGUgdG8gbGFyZ2VyIGJ1ZmZlcnMgdW50aWwgdGhlIGVudGlyZSBmaWxlIGlzIHJlYWQgaW4uICBSZXR1cm4gYQorICAgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGRhdGEsIG9yIE5VTEwgaWYgdGhlcmUgd2FzIGEgbWVtb3J5IGFsbG9jYXRpb24KKyAgIGZhaWx1cmUuICAqbGVuIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSByZWFkIGZyb20gdGhlIGlucHV0IGZpbGUgKGV2ZW4KKyAgIGlmIGxvYWQoKSByZXR1cm5zIE5VTEwpLiAgSWYgdGhlIGlucHV0IGZpbGUgd2FzIGVtcHR5IG9yIGNvdWxkIG5vdCBiZSBvcGVuZWQKKyAgIG9yIHJlYWQsICpsZW4gaXMgemVyby4gKi8KK2xvY2FsIHZvaWQgKmxvYWQoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90ICpsZW4pCit7CisgICAgc2l6ZV90IHNpemU7CisgICAgdm9pZCAqYnVmLCAqc3dhcDsKKyAgICBGSUxFICppbjsKKworICAgICpsZW4gPSAwOworICAgIGJ1ZiA9IG1hbGxvYyhzaXplID0gNDA5Nik7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpbiA9IG5hbWUgPT0gTlVMTCA/IHN0ZGluIDogZm9wZW4obmFtZSwgInJiIik7CisgICAgaWYgKGluICE9IE5VTEwpIHsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgKmxlbiArPSBmcmVhZCgoY2hhciAqKWJ1ZiArICpsZW4sIDEsIHNpemUgLSAqbGVuLCBpbik7CisgICAgICAgICAgICBpZiAoKmxlbiA8IHNpemUpIGJyZWFrOworICAgICAgICAgICAgc2l6ZSA9IGJ5dGhpcmRzKHNpemUpOworICAgICAgICAgICAgaWYgKHNpemUgPT0gKmxlbiB8fCAoc3dhcCA9IHJlYWxsb2MoYnVmLCBzaXplKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKKyAgICAgICAgICAgICAgICBidWYgPSBOVUxMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmID0gc3dhcDsKKyAgICAgICAgfQorICAgICAgICBmY2xvc2UoaW4pOworICAgIH0KKyAgICByZXR1cm4gYnVmOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgaW50IHJldCwgcHV0ID0gMCwgZmFpbCA9IDA7CisgICAgdW5zaWduZWQgc2tpcCA9IDA7CisgICAgY2hhciAqYXJnLCAqbmFtZSA9IE5VTEw7CisgICAgdW5zaWduZWQgY2hhciAqc291cmNlID0gTlVMTCwgKmRlc3Q7CisgICAgc2l6ZV90IGxlbiA9IDA7CisgICAgdW5zaWduZWQgbG9uZyBzb3VyY2VsZW4sIGRlc3RsZW47CisKKyAgICAvKiBwcm9jZXNzIGFyZ3VtZW50cyAqLworICAgIHdoaWxlIChhcmcgPSAqKythcmd2LCAtLWFyZ2MpCisgICAgICAgIGlmIChhcmdbMF0gPT0gJy0nKSB7CisgICAgICAgICAgICBpZiAoYXJnWzFdID09ICd3JyAmJiBhcmdbMl0gPT0gMCkKKyAgICAgICAgICAgICAgICBwdXQgPSAxOworICAgICAgICAgICAgZWxzZSBpZiAoYXJnWzFdID09ICdmJyAmJiBhcmdbMl0gPT0gMCkKKyAgICAgICAgICAgICAgICBmYWlsID0gMSwgcHV0ID0gMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZ1sxXSA+PSAnMCcgJiYgYXJnWzFdIDw9ICc5JykKKyAgICAgICAgICAgICAgICBza2lwID0gKHVuc2lnbmVkKWF0b2koYXJnICsgMSk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgb3B0aW9uICVzXG4iLCBhcmcpOworICAgICAgICAgICAgICAgIHJldHVybiAzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG5hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJvbmx5IG9uZSBmaWxlIG5hbWUgYWxsb3dlZFxuIik7CisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBuYW1lID0gYXJnOworICAgIHNvdXJjZSA9IGxvYWQobmFtZSwgJmxlbik7CisgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIik7CisgICAgICAgIHJldHVybiA0OworICAgIH0KKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgcmVhZCAlcywgb3IgaXQgd2FzIGVtcHR5XG4iLAorICAgICAgICAgICAgICAgIG5hbWUgPT0gTlVMTCA/ICI8c3RkaW4+IiA6IG5hbWUpOworICAgICAgICBmcmVlKHNvdXJjZSk7CisgICAgICAgIHJldHVybiAzOworICAgIH0KKyAgICBpZiAoc2tpcCA+PSBsZW4pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJza2lwIHJlcXVlc3Qgb2YgJWQgbGVhdmVzIG5vIGlucHV0XG4iLCBza2lwKTsKKyAgICAgICAgZnJlZShzb3VyY2UpOworICAgICAgICByZXR1cm4gMzsKKyAgICB9CisKKyAgICAvKiB0ZXN0IGluZmxhdGUgZGF0YSB3aXRoIG9mZnNldCBza2lwICovCisgICAgbGVuIC09IHNraXA7CisgICAgc291cmNlbGVuID0gKHVuc2lnbmVkIGxvbmcpbGVuOworICAgIHJldCA9IHB1ZmYoTklMLCAmZGVzdGxlbiwgc291cmNlICsgc2tpcCwgJnNvdXJjZWxlbik7CisgICAgaWYgKHJldCkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJwdWZmKCkgZmFpbGVkIHdpdGggcmV0dXJuIGNvZGUgJWRcbiIsIHJldCk7CisgICAgZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAicHVmZigpIHN1Y2NlZWRlZCB1bmNvbXByZXNzaW5nICVsdSBieXRlc1xuIiwgZGVzdGxlbik7CisgICAgICAgIGlmIChzb3VyY2VsZW4gPCBsZW4pIGZwcmludGYoc3RkZXJyLCAiJWx1IGNvbXByZXNzZWQgYnl0ZXMgdW51c2VkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtIHNvdXJjZWxlbik7CisgICAgfQorCisgICAgLyogaWYgcmVxdWVzdGVkLCBpbmZsYXRlIGFnYWluIGFuZCB3cml0ZSBkZWNvbXByZXNzZCBkYXRhIHRvIHN0ZG91dCAqLworICAgIGlmIChwdXQgJiYgcmV0ID09IDApIHsKKyAgICAgICAgaWYgKGZhaWwpCisgICAgICAgICAgICBkZXN0bGVuID4+PSAxOworICAgICAgICBkZXN0ID0gbWFsbG9jKGRlc3RsZW4pOworICAgICAgICBpZiAoZGVzdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIpOworICAgICAgICAgICAgZnJlZShzb3VyY2UpOworICAgICAgICAgICAgcmV0dXJuIDQ7CisgICAgICAgIH0KKyAgICAgICAgcHVmZihkZXN0LCAmZGVzdGxlbiwgc291cmNlICsgc2tpcCwgJnNvdXJjZWxlbik7CisgICAgICAgIFNFVF9CSU5BUllfTU9ERShzdGRvdXQpOworICAgICAgICBmd3JpdGUoZGVzdCwgMSwgZGVzdGxlbiwgc3Rkb3V0KTsKKyAgICAgICAgZnJlZShkZXN0KTsKKyAgICB9CisKKyAgICAvKiBjbGVhbiB1cCAqLworICAgIGZyZWUoc291cmNlKTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi9wdWZmL3plcm9zLnJhdyBiL3psaWIvc3JjL2NvbnRyaWIvcHVmZi96ZXJvcy5yYXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE5MGU3NgotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvcHVmZi96ZXJvcy5yYXcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi90ZXN0emxpYi90ZXN0emxpYi5jIGIvemxpYi9zcmMvY29udHJpYi90ZXN0emxpYi90ZXN0emxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNjU5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3Rlc3R6bGliL3Rlc3R6bGliLmMKQEAgLTAsMCArMSwyNzUgQEAKKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisjaW5jbHVkZSA8d2luZG93cy5oPg0KKw0KKyNpbmNsdWRlICJ6bGliLmgiDQorDQorDQordm9pZCBNeURvTWludXM2NChMQVJHRV9JTlRFR0VSICpSLExBUkdFX0lOVEVHRVIgQSxMQVJHRV9JTlRFR0VSIEIpDQorew0KKyAgICBSLT5IaWdoUGFydCA9IEEuSGlnaFBhcnQgLSBCLkhpZ2hQYXJ0Ow0KKyAgICBpZiAoQS5Mb3dQYXJ0ID49IEIuTG93UGFydCkNCisgICAgICAgIFItPkxvd1BhcnQgPSBBLkxvd1BhcnQgLSBCLkxvd1BhcnQ7DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgUi0+TG93UGFydCA9IEEuTG93UGFydCAtIEIuTG93UGFydDsNCisgICAgICAgIFItPkhpZ2hQYXJ0IC0tOw0KKyAgICB9DQorfQ0KKw0KKyNpZmRlZiBfTV9YNjQNCisvLyBzZWUgaHR0cDovL21zZG4yLm1pY3Jvc29mdC5jb20vbGlicmFyeS90d2NoaGU5NShlbi11cyx2cy44MCkuYXNweCBmb3IgX19yZHRzYw0KK3Vuc2lnbmVkIF9faW50NjQgX19yZHRzYyh2b2lkKTsNCit2b2lkIEJlZ2luQ291bnRSZHRzYyhMQVJHRV9JTlRFR0VSICogcGJlZ2luVGltZTY0KQ0KK3sNCisgLy8gICBwcmludGYoInJkdHNjID0gJUk2NHhcbiIsX19yZHRzYygpKTsNCisgICBwYmVnaW5UaW1lNjQtPlF1YWRQYXJ0PV9fcmR0c2MoKTsNCit9DQorDQorTEFSR0VfSU5URUdFUiBHZXRSZXNSZHRzYyhMQVJHRV9JTlRFR0VSIGJlZ2luVGltZTY0LEJPT0wgZkNvbXB1dGVUaW1lUXVlcnlQZXJmKQ0KK3sNCisgICAgTEFSR0VfSU5URUdFUiBMSXJlczsNCisgICAgdW5zaWduZWQgX2ludDY0IHJlcz1fX3JkdHNjKCktKCh1bnNpZ25lZCBfaW50NjQpKGJlZ2luVGltZTY0LlF1YWRQYXJ0KSk7DQorICAgIExJcmVzLlF1YWRQYXJ0PXJlczsNCisgICAvLyBwcmludGYoInJkdHNjID0gJUk2NHhcbiIsX19yZHRzYygpKTsNCisgICAgcmV0dXJuIExJcmVzOw0KK30NCisjZWxzZQ0KKyNpZmRlZiBfTV9JWDg2DQordm9pZCBteUdldFJEVFNDMzIoTEFSR0VfSU5URUdFUiAqIHBiZWdpblRpbWU2NCkNCit7DQorICAgIERXT1JEIGR3RWR4LGR3RWF4Ow0KKyAgICBfYXNtDQorICAgIHsNCisgICAgICAgIHJkdHNjDQorICAgICAgICBtb3YgZHdFYXgsZWF4DQorICAgICAgICBtb3YgZHdFZHgsZWR4DQorICAgIH0NCisgICAgcGJlZ2luVGltZTY0LT5Mb3dQYXJ0PWR3RWF4Ow0KKyAgICBwYmVnaW5UaW1lNjQtPkhpZ2hQYXJ0PWR3RWR4Ow0KK30NCisNCit2b2lkIEJlZ2luQ291bnRSZHRzYyhMQVJHRV9JTlRFR0VSICogcGJlZ2luVGltZTY0KQ0KK3sNCisgICAgbXlHZXRSRFRTQzMyKHBiZWdpblRpbWU2NCk7DQorfQ0KKw0KK0xBUkdFX0lOVEVHRVIgR2V0UmVzUmR0c2MoTEFSR0VfSU5URUdFUiBiZWdpblRpbWU2NCxCT09MIGZDb21wdXRlVGltZVF1ZXJ5UGVyZikNCit7DQorICAgIExBUkdFX0lOVEVHRVIgTElyZXMsZW5kVGltZTY0Ow0KKyAgICBteUdldFJEVFNDMzIoJmVuZFRpbWU2NCk7DQorDQorICAgIExJcmVzLkxvd1BhcnQ9TElyZXMuSGlnaFBhcnQ9MDsNCisgICAgTXlEb01pbnVzNjQoJkxJcmVzLGVuZFRpbWU2NCxiZWdpblRpbWU2NCk7DQorICAgIHJldHVybiBMSXJlczsNCit9DQorI2Vsc2UNCit2b2lkIG15R2V0UkRUU0MzMihMQVJHRV9JTlRFR0VSICogcGJlZ2luVGltZTY0KQ0KK3sNCit9DQorDQordm9pZCBCZWdpbkNvdW50UmR0c2MoTEFSR0VfSU5URUdFUiAqIHBiZWdpblRpbWU2NCkNCit7DQorfQ0KKw0KK0xBUkdFX0lOVEVHRVIgR2V0UmVzUmR0c2MoTEFSR0VfSU5URUdFUiBiZWdpblRpbWU2NCxCT09MIGZDb21wdXRlVGltZVF1ZXJ5UGVyZikNCit7DQorICAgIExBUkdFX0lOVEVHRVIgbHI7DQorICAgIGxyLlF1YWRQYXJ0PTA7DQorICAgIHJldHVybiBscjsNCit9DQorI2VuZGlmDQorI2VuZGlmDQorDQordm9pZCBCZWdpbkNvdW50UGVyZkNvdW50ZXIoTEFSR0VfSU5URUdFUiAqIHBiZWdpblRpbWU2NCxCT09MIGZDb21wdXRlVGltZVF1ZXJ5UGVyZikNCit7DQorICAgIGlmICgoIWZDb21wdXRlVGltZVF1ZXJ5UGVyZikgfHwgKCFRdWVyeVBlcmZvcm1hbmNlQ291bnRlcihwYmVnaW5UaW1lNjQpKSkNCisgICAgew0KKyAgICAgICAgcGJlZ2luVGltZTY0LT5Mb3dQYXJ0ID0gR2V0VGlja0NvdW50KCk7DQorICAgICAgICBwYmVnaW5UaW1lNjQtPkhpZ2hQYXJ0ID0gMDsNCisgICAgfQ0KK30NCisNCitEV09SRCBHZXRNc2VjU2luY2VQZXJmQ291bnRlcihMQVJHRV9JTlRFR0VSIGJlZ2luVGltZTY0LEJPT0wgZkNvbXB1dGVUaW1lUXVlcnlQZXJmKQ0KK3sNCisgICAgTEFSR0VfSU5URUdFUiBlbmRUaW1lNjQsdGlja3NQZXJTZWNvbmQsdGlja3M7DQorICAgIERXT1JETE9ORyB0aWNrc1NoaWZ0ZWQsdGlja1NlY1NoaWZ0ZWQ7DQorICAgIERXT1JEIGR3TG9nPTE2KzA7DQorICAgIERXT1JEIGR3UmV0Ow0KKyAgICBpZiAoKCFmQ29tcHV0ZVRpbWVRdWVyeVBlcmYpIHx8ICghUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJmVuZFRpbWU2NCkpKQ0KKyAgICAgICAgZHdSZXQgPSAoR2V0VGlja0NvdW50KCkgLSBiZWdpblRpbWU2NC5Mb3dQYXJ0KSoxOw0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIE15RG9NaW51czY0KCZ0aWNrcyxlbmRUaW1lNjQsYmVnaW5UaW1lNjQpOw0KKyAgICAgICAgUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgmdGlja3NQZXJTZWNvbmQpOw0KKw0KKw0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHRpY2tzU2hpZnRlZCA9IEludDY0U2hybE1vZDMyKCooRFdPUkRMT05HKikmdGlja3MsZHdMb2cpOw0KKyAgICAgICAgICAgIHRpY2tTZWNTaGlmdGVkID0gSW50NjRTaHJsTW9kMzIoKihEV09SRExPTkcqKSZ0aWNrc1BlclNlY29uZCxkd0xvZyk7DQorDQorICAgICAgICB9DQorDQorICAgICAgICBkd1JldCA9IChEV09SRCkoKCgoRFdPUkQpdGlja3NTaGlmdGVkKSoxMDAwKS8oRFdPUkQpKHRpY2tTZWNTaGlmdGVkKSk7DQorICAgICAgICBkd1JldCAqPTE7DQorICAgIH0NCisgICAgcmV0dXJuIGR3UmV0Ow0KK30NCisNCitpbnQgUmVhZEZpbGVNZW1vcnkoY29uc3QgY2hhciogZmlsZW5hbWUsbG9uZyogcGxGaWxlU2l6ZSx1bnNpZ25lZCBjaGFyKiogcEZpbGVQdHIpDQorew0KKyAgICBGSUxFKiBzdHJlYW07DQorICAgIHVuc2lnbmVkIGNoYXIqIHB0cjsNCisgICAgaW50IHJldFZhbD0xOw0KKyAgICBzdHJlYW09Zm9wZW4oZmlsZW5hbWUsICJyYiIpOw0KKyAgICBpZiAoc3RyZWFtPT1OVUxMKQ0KKyAgICAgICAgcmV0dXJuIDA7DQorDQorICAgIGZzZWVrKHN0cmVhbSwwLFNFRUtfRU5EKTsNCisNCisgICAgKnBsRmlsZVNpemU9ZnRlbGwoc3RyZWFtKTsNCisgICAgZnNlZWsoc3RyZWFtLDAsU0VFS19TRVQpOw0KKyAgICBwdHI9bWFsbG9jKCgqcGxGaWxlU2l6ZSkrMSk7DQorICAgIGlmIChwdHI9PU5VTEwpDQorICAgICAgICByZXRWYWw9MDsNCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgICBpZiAoZnJlYWQocHRyLCAxLCAqcGxGaWxlU2l6ZSxzdHJlYW0pICE9ICgqcGxGaWxlU2l6ZSkpDQorICAgICAgICAgICAgcmV0VmFsPTA7DQorICAgIH0NCisgICAgZmNsb3NlKHN0cmVhbSk7DQorICAgICpwRmlsZVB0cj1wdHI7DQorICAgIHJldHVybiByZXRWYWw7DQorfQ0KKw0KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pDQorew0KKyAgICBpbnQgQmxvY2tTaXplQ29tcHJlc3M9MHg4MDAwOw0KKyAgICBpbnQgQmxvY2tTaXplVW5jb21wcmVzcz0weDgwMDA7DQorICAgIGludCBjcHJMZXZlbD1aX0RFRkFVTFRfQ09NUFJFU1NJT04gOw0KKyAgICBsb25nIGxGaWxlU2l6ZTsNCisgICAgdW5zaWduZWQgY2hhciogRmlsZVB0cjsNCisgICAgbG9uZyBsQnVmZmVyU2l6ZUNwcjsNCisgICAgbG9uZyBsQnVmZmVyU2l6ZVVuY3ByOw0KKyAgICBsb25nIGxDb21wcmVzc2VkU2l6ZT0wOw0KKyAgICB1bnNpZ25lZCBjaGFyKiBDcHJQdHI7DQorICAgIHVuc2lnbmVkIGNoYXIqIFVuY3ByUHRyOw0KKyAgICBsb25nIGxTaXplQ3ByLGxTaXplVW5jcHI7DQorICAgIERXT1JEIGR3R2V0VGljayxkd01zZWNRUDsNCisgICAgTEFSR0VfSU5URUdFUiBsaV9xcCxsaV9yZHRzYyxkd1Jlc1JkdHNjOw0KKw0KKyAgICBpZiAoYXJnYzw9MSkNCisgICAgew0KKyAgICAgICAgcHJpbnRmKCJydW4gVGVzdFpsaWIgPEZpbGU+IFtCbG9ja1NpemVDb21wcmVzc10gW0Jsb2NrU2l6ZVVuY29tcHJlc3NdIFtjb21wcmVzLiBsZXZlbF1cbiIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgaWYgKFJlYWRGaWxlTWVtb3J5KGFyZ3ZbMV0sJmxGaWxlU2l6ZSwmRmlsZVB0cik9PTApDQorICAgIHsNCisgICAgICAgIHByaW50ZigiZXJyb3IgcmVhZGluZyAlc1xuIixhcmd2WzFdKTsNCisgICAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICAgIGVsc2UgcHJpbnRmKCJmaWxlICVzIHJlYWQsICV1IGJ5dGVzXG4iLGFyZ3ZbMV0sbEZpbGVTaXplKTsNCisNCisgICAgaWYgKGFyZ2M+PTMpDQorICAgICAgICBCbG9ja1NpemVDb21wcmVzcz1hdG9sKGFyZ3ZbMl0pOw0KKw0KKyAgICBpZiAoYXJnYz49NCkNCisgICAgICAgIEJsb2NrU2l6ZVVuY29tcHJlc3M9YXRvbChhcmd2WzNdKTsNCisNCisgICAgaWYgKGFyZ2M+PTUpDQorICAgICAgICBjcHJMZXZlbD0oaW50KWF0b2woYXJndls0XSk7DQorDQorICAgIGxCdWZmZXJTaXplQ3ByID0gbEZpbGVTaXplICsgKGxGaWxlU2l6ZS8weDEwKSArIDB4MjAwOw0KKyAgICBsQnVmZmVyU2l6ZVVuY3ByID0gbEJ1ZmZlclNpemVDcHI7DQorDQorICAgIENwclB0cj0odW5zaWduZWQgY2hhciopbWFsbG9jKGxCdWZmZXJTaXplQ3ByICsgQmxvY2tTaXplQ29tcHJlc3MpOw0KKw0KKyAgICBCZWdpbkNvdW50UGVyZkNvdW50ZXIoJmxpX3FwLFRSVUUpOw0KKyAgICBkd0dldFRpY2s9R2V0VGlja0NvdW50KCk7DQorICAgIEJlZ2luQ291bnRSZHRzYygmbGlfcmR0c2MpOw0KKyAgICB7DQorICAgICAgICB6X3N0cmVhbSB6Y3ByOw0KKyAgICAgICAgaW50IHJldD1aX09LOw0KKyAgICAgICAgbG9uZyBsT3JpZ1RvRG8gPSBsRmlsZVNpemU7DQorICAgICAgICBsb25nIGxPcmlnRG9uZSA9IDA7DQorICAgICAgICBpbnQgc3RlcD0wOw0KKyAgICAgICAgbWVtc2V0KCZ6Y3ByLDAsc2l6ZW9mKHpfc3RyZWFtKSk7DQorICAgICAgICBkZWZsYXRlSW5pdCgmemNwcixjcHJMZXZlbCk7DQorDQorICAgICAgICB6Y3ByLm5leHRfaW4gPSBGaWxlUHRyOw0KKyAgICAgICAgemNwci5uZXh0X291dCA9IENwclB0cjsNCisNCisNCisgICAgICAgIGRvDQorICAgICAgICB7DQorICAgICAgICAgICAgbG9uZyBhbGxfcmVhZF9iZWZvcmUgPSB6Y3ByLnRvdGFsX2luOw0KKyAgICAgICAgICAgIHpjcHIuYXZhaWxfaW4gPSBtaW4obE9yaWdUb0RvLEJsb2NrU2l6ZUNvbXByZXNzKTsNCisgICAgICAgICAgICB6Y3ByLmF2YWlsX291dCA9IEJsb2NrU2l6ZUNvbXByZXNzOw0KKyAgICAgICAgICAgIHJldD1kZWZsYXRlKCZ6Y3ByLCh6Y3ByLmF2YWlsX2luPT1sT3JpZ1RvRG8pID8gWl9GSU5JU0ggOiBaX1NZTkNfRkxVU0gpOw0KKyAgICAgICAgICAgIGxPcmlnRG9uZSArPSAoemNwci50b3RhbF9pbi1hbGxfcmVhZF9iZWZvcmUpOw0KKyAgICAgICAgICAgIGxPcmlnVG9EbyAtPSAoemNwci50b3RhbF9pbi1hbGxfcmVhZF9iZWZvcmUpOw0KKyAgICAgICAgICAgIHN0ZXArKzsNCisgICAgICAgIH0gd2hpbGUgKHJldD09Wl9PSyk7DQorDQorICAgICAgICBsU2l6ZUNwcj16Y3ByLnRvdGFsX291dDsNCisgICAgICAgIGRlZmxhdGVFbmQoJnpjcHIpOw0KKyAgICAgICAgZHdHZXRUaWNrPUdldFRpY2tDb3VudCgpLWR3R2V0VGljazsNCisgICAgICAgIGR3TXNlY1FQPUdldE1zZWNTaW5jZVBlcmZDb3VudGVyKGxpX3FwLFRSVUUpOw0KKyAgICAgICAgZHdSZXNSZHRzYz1HZXRSZXNSZHRzYyhsaV9yZHRzYyxUUlVFKTsNCisgICAgICAgIHByaW50ZigidG90YWwgY29tcHJlc3Mgc2l6ZSA9ICV1LCBpbiAldSBzdGVwXG4iLGxTaXplQ3ByLHN0ZXApOw0KKyAgICAgICAgcHJpbnRmKCJ0aW1lID0gJXUgbXNlYyA9ICVmIHNlY1xuIixkd0dldFRpY2ssZHdHZXRUaWNrLyhkb3VibGUpMTAwMC4pOw0KKyAgICAgICAgcHJpbnRmKCJkZWZjcHIgdGltZSBRUCA9ICV1IG1zZWMgPSAlZiBzZWNcbiIsZHdNc2VjUVAsZHdNc2VjUVAvKGRvdWJsZSkxMDAwLik7DQorICAgICAgICBwcmludGYoImRlZmNwciByZXN1bHQgcmR0c2MgPSAlSTY0eFxuXG4iLGR3UmVzUmR0c2MuUXVhZFBhcnQpOw0KKyAgICB9DQorDQorICAgIENwclB0cj0odW5zaWduZWQgY2hhciopcmVhbGxvYyhDcHJQdHIsbFNpemVDcHIpOw0KKyAgICBVbmNwclB0cj0odW5zaWduZWQgY2hhciopbWFsbG9jKGxCdWZmZXJTaXplVW5jcHIgKyBCbG9ja1NpemVVbmNvbXByZXNzKTsNCisNCisgICAgQmVnaW5Db3VudFBlcmZDb3VudGVyKCZsaV9xcCxUUlVFKTsNCisgICAgZHdHZXRUaWNrPUdldFRpY2tDb3VudCgpOw0KKyAgICBCZWdpbkNvdW50UmR0c2MoJmxpX3JkdHNjKTsNCisgICAgew0KKyAgICAgICAgel9zdHJlYW0gemNwcjsNCisgICAgICAgIGludCByZXQ9Wl9PSzsNCisgICAgICAgIGxvbmcgbE9yaWdUb0RvID0gbFNpemVDcHI7DQorICAgICAgICBsb25nIGxPcmlnRG9uZSA9IDA7DQorICAgICAgICBpbnQgc3RlcD0wOw0KKyAgICAgICAgbWVtc2V0KCZ6Y3ByLDAsc2l6ZW9mKHpfc3RyZWFtKSk7DQorICAgICAgICBpbmZsYXRlSW5pdCgmemNwcik7DQorDQorICAgICAgICB6Y3ByLm5leHRfaW4gPSBDcHJQdHI7DQorICAgICAgICB6Y3ByLm5leHRfb3V0ID0gVW5jcHJQdHI7DQorDQorDQorICAgICAgICBkbw0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGxvbmcgYWxsX3JlYWRfYmVmb3JlID0gemNwci50b3RhbF9pbjsNCisgICAgICAgICAgICB6Y3ByLmF2YWlsX2luID0gbWluKGxPcmlnVG9EbyxCbG9ja1NpemVVbmNvbXByZXNzKTsNCisgICAgICAgICAgICB6Y3ByLmF2YWlsX291dCA9IEJsb2NrU2l6ZVVuY29tcHJlc3M7DQorICAgICAgICAgICAgcmV0PWluZmxhdGUoJnpjcHIsWl9TWU5DX0ZMVVNIKTsNCisgICAgICAgICAgICBsT3JpZ0RvbmUgKz0gKHpjcHIudG90YWxfaW4tYWxsX3JlYWRfYmVmb3JlKTsNCisgICAgICAgICAgICBsT3JpZ1RvRG8gLT0gKHpjcHIudG90YWxfaW4tYWxsX3JlYWRfYmVmb3JlKTsNCisgICAgICAgICAgICBzdGVwKys7DQorICAgICAgICB9IHdoaWxlIChyZXQ9PVpfT0spOw0KKw0KKyAgICAgICAgbFNpemVVbmNwcj16Y3ByLnRvdGFsX291dDsNCisgICAgICAgIGluZmxhdGVFbmQoJnpjcHIpOw0KKyAgICAgICAgZHdHZXRUaWNrPUdldFRpY2tDb3VudCgpLWR3R2V0VGljazsNCisgICAgICAgIGR3TXNlY1FQPUdldE1zZWNTaW5jZVBlcmZDb3VudGVyKGxpX3FwLFRSVUUpOw0KKyAgICAgICAgZHdSZXNSZHRzYz1HZXRSZXNSZHRzYyhsaV9yZHRzYyxUUlVFKTsNCisgICAgICAgIHByaW50ZigidG90YWwgdW5jb21wcmVzcyBzaXplID0gJXUsIGluICV1IHN0ZXBcbiIsbFNpemVVbmNwcixzdGVwKTsNCisgICAgICAgIHByaW50ZigidGltZSA9ICV1IG1zZWMgPSAlZiBzZWNcbiIsZHdHZXRUaWNrLGR3R2V0VGljay8oZG91YmxlKTEwMDAuKTsNCisgICAgICAgIHByaW50ZigidW5jcHIgIHRpbWUgUVAgPSAldSBtc2VjID0gJWYgc2VjXG4iLGR3TXNlY1FQLGR3TXNlY1FQLyhkb3VibGUpMTAwMC4pOw0KKyAgICAgICAgcHJpbnRmKCJ1bmNwciAgcmVzdWx0IHJkdHNjID0gJUk2NHhcblxuIixkd1Jlc1JkdHNjLlF1YWRQYXJ0KTsNCisgICAgfQ0KKw0KKyAgICBpZiAobFNpemVVbmNwcj09bEZpbGVTaXplKQ0KKyAgICB7DQorICAgICAgICBpZiAobWVtY21wKEZpbGVQdHIsVW5jcHJQdHIsbEZpbGVTaXplKT09MCkNCisgICAgICAgICAgICBwcmludGYoImNvbXBhcmUgb2tcbiIpOw0KKw0KKyAgICB9DQorDQorICAgIHJldHVybiAwOw0KK30NCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL3Rlc3R6bGliL3Rlc3R6bGliLnR4dCBiL3psaWIvc3JjL2NvbnRyaWIvdGVzdHpsaWIvdGVzdHpsaWIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMjU4ZjEKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3Rlc3R6bGliL3Rlc3R6bGliLnR4dApAQCAtMCwwICsxLDEwIEBACitUbyBidWlsZCB0ZXN0ekxpYiB3aXRoIFZpc3VhbCBTdHVkaW8gMjAwNToNCisNCitjb3B5IHRvIGEgZGlyZWN0b3J5IGZpbGUgZnJvbSA6DQorLSByb290IG9mIHpMaWIgdHJlZQ0KKy0gY29udHJpYi90ZXN0emxpYg0KKy0gY29udHJpYi9tYXNteDg2DQorLSBjb250cmliL21hc214NjQNCistIGNvbnRyaWIvdnN0dWRpby92YzcNCisNCithbmQgb3BlbiB0ZXN0emxpYjguc2xuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi91bnRnei9NYWtlZmlsZSBiL3psaWIvc3JjL2NvbnRyaWIvdW50Z3ovTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU0MjY2ZgotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvdW50Z3ovTWFrZWZpbGUKQEAgLTAsMCArMSwxNCBAQAorQ0M9Y2MKK0NGTEFHUz0tZworCit1bnRnejogdW50Z3oubyAuLi8uLi9saWJ6LmEKKwkkKENDKSAkKENGTEFHUykgLW8gdW50Z3ogdW50Z3oubyAtTC4uLy4uIC1segorCit1bnRnei5vOiB1bnRnei5jIC4uLy4uL3psaWIuaAorCSQoQ0MpICQoQ0ZMQUdTKSAtYyAtSS4uLy4uIHVudGd6LmMKKworLi4vLi4vbGliei5hOgorCWNkIC4uLy4uOyAuL2NvbmZpZ3VyZTsgbWFrZQorCitjbGVhbjoKKwlybSAtZiB1bnRneiB1bnRnei5vICp+CmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL3VudGd6L01ha2VmaWxlLm1zYyBiL3psaWIvc3JjL2NvbnRyaWIvdW50Z3ovTWFrZWZpbGUubXNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3Yjg2MDIKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3VudGd6L01ha2VmaWxlLm1zYwpAQCAtMCwwICsxLDE3IEBACitDQz1jbAorQ0ZMQUdTPS1NRAorCit1bnRnei5leGU6IHVudGd6Lm9iaiAuLlwuLlx6bGliLmxpYgorCSQoQ0MpICQoQ0ZMQUdTKSB1bnRnei5vYmogLi5cLi5cemxpYi5saWIKKwordW50Z3oub2JqOiB1bnRnei5jIC4uXC4uXHpsaWIuaAorCSQoQ0MpICQoQ0ZMQUdTKSAtYyAtSS4uXC4uIHVudGd6LmMKKworLi5cLi5cemxpYi5saWI6CisJY2QgLi5cLi4KKwkkKE1BS0UpIC1mIHdpbjMyXG1ha2VmaWxlLm1zYworCWNkIGNvbnRyaWJcdW50Z3oKKworY2xlYW46CisJLWRlbCB1bnRnei5vYmoKKwktZGVsIHVudGd6LmV4ZQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi91bnRnei91bnRnei5jIGIvemxpYi9zcmMvY29udHJpYi91bnRnei91bnRnei5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMzkxZTUKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3VudGd6L3VudGd6LmMKQEAgLTAsMCArMSw2NzQgQEAKKy8qCisgKiB1bnRnei5jIC0tIERpc3BsYXkgY29udGVudHMgYW5kIGV4dHJhY3QgZmlsZXMgZnJvbSBhIGd6aXAnZCBUQVIgZmlsZQorICoKKyAqIHdyaXR0ZW4gYnkgUGVkcm8gQS4gQXJhbmRhIEd1dGllcnJleiA8cGFhZ0B0aWQuZXM+CisgKiBhZGFwdGF0aW9uIHRvIFVuaXggYnkgSmVhbi1sb3VwIEdhaWxseSA8amxvdXBAZ3ppcC5vcmc+CisgKiB2YXJpb3VzIGZpeGVzIGJ5IENvc21pbiBUcnV0YSA8Y29zbWludEBjcy51YmJjbHVqLnJvPgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAiemxpYi5oIgorCisjaWZkZWYgdW5peAorIyAgaW5jbHVkZSA8dW5pc3RkLmg+CisjZWxzZQorIyAgaW5jbHVkZSA8ZGlyZWN0Lmg+CisjICBpbmNsdWRlIDxpby5oPgorI2VuZGlmCisKKyNpZmRlZiBXSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyMgIGlmbmRlZiBGX09LCisjICAgIGRlZmluZSBGX09LICAwCisjICBlbmRpZgorIyAgZGVmaW5lIG1rZGlyKGRpcm5hbWUsbW9kZSkgICBfbWtkaXIoZGlybmFtZSkKKyMgIGlmZGVmIF9NU0NfVkVSCisjICAgIGRlZmluZSBhY2Nlc3MocGF0aCxtb2RlKSAgIF9hY2Nlc3MocGF0aCxtb2RlKQorIyAgICBkZWZpbmUgY2htb2QocGF0aCxtb2RlKSAgICBfY2htb2QocGF0aCxtb2RlKQorIyAgICBkZWZpbmUgc3RyZHVwKHN0cikgICAgICAgICBfc3RyZHVwKHN0cikKKyMgIGVuZGlmCisjZWxzZQorIyAgaW5jbHVkZSA8dXRpbWUuaD4KKyNlbmRpZgorCisKKy8qIHZhbHVlcyB1c2VkIGluIHR5cGVmbGFnIGZpZWxkICovCisKKyNkZWZpbmUgUkVHVFlQRSAgJzAnICAgICAgICAgICAgLyogcmVndWxhciBmaWxlICovCisjZGVmaW5lIEFSRUdUWVBFICdcMCcgICAgICAgICAgIC8qIHJlZ3VsYXIgZmlsZSAqLworI2RlZmluZSBMTktUWVBFICAnMScgICAgICAgICAgICAvKiBsaW5rICovCisjZGVmaW5lIFNZTVRZUEUgICcyJyAgICAgICAgICAgIC8qIHJlc2VydmVkICovCisjZGVmaW5lIENIUlRZUEUgICczJyAgICAgICAgICAgIC8qIGNoYXJhY3RlciBzcGVjaWFsICovCisjZGVmaW5lIEJMS1RZUEUgICc0JyAgICAgICAgICAgIC8qIGJsb2NrIHNwZWNpYWwgKi8KKyNkZWZpbmUgRElSVFlQRSAgJzUnICAgICAgICAgICAgLyogZGlyZWN0b3J5ICovCisjZGVmaW5lIEZJRk9UWVBFICc2JyAgICAgICAgICAgIC8qIEZJRk8gc3BlY2lhbCAqLworI2RlZmluZSBDT05UVFlQRSAnNycgICAgICAgICAgICAvKiByZXNlcnZlZCAqLworCisvKiBHTlUgdGFyIGV4dGVuc2lvbnMgKi8KKworI2RlZmluZSBHTlVUWVBFX0RVTVBESVIgICdEJyAgICAvKiBmaWxlIG5hbWVzIGZyb20gZHVtcGVkIGRpcmVjdG9yeSAqLworI2RlZmluZSBHTlVUWVBFX0xPTkdMSU5LICdLJyAgICAvKiBsb25nIGxpbmsgbmFtZSAqLworI2RlZmluZSBHTlVUWVBFX0xPTkdOQU1FICdMJyAgICAvKiBsb25nIGZpbGUgbmFtZSAqLworI2RlZmluZSBHTlVUWVBFX01VTFRJVk9MICdNJyAgICAvKiBjb250aW51YXRpb24gb2YgZmlsZSBmcm9tIGFub3RoZXIgdm9sdW1lICovCisjZGVmaW5lIEdOVVRZUEVfTkFNRVMgICAgJ04nICAgIC8qIGZpbGUgbmFtZSB0aGF0IGRvZXMgbm90IGZpdCBpbnRvIG1haW4gaGRyICovCisjZGVmaW5lIEdOVVRZUEVfU1BBUlNFICAgJ1MnICAgIC8qIHNwYXJzZSBmaWxlICovCisjZGVmaW5lIEdOVVRZUEVfVk9MSERSICAgJ1YnICAgIC8qIHRhcGUvdm9sdW1lIGhlYWRlciAqLworCisKKy8qIHRhciBoZWFkZXIgKi8KKworI2RlZmluZSBCTE9DS1NJWkUgICAgIDUxMgorI2RlZmluZSBTSE9SVE5BTUVTSVpFIDEwMAorCitzdHJ1Y3QgdGFyX2hlYWRlcgoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBieXRlIG9mZnNldCAqLworICBjaGFyIG5hbWVbMTAwXTsgICAgICAgICAgICAgICAvKiAgIDAgKi8KKyAgY2hhciBtb2RlWzhdOyAgICAgICAgICAgICAgICAgLyogMTAwICovCisgIGNoYXIgdWlkWzhdOyAgICAgICAgICAgICAgICAgIC8qIDEwOCAqLworICBjaGFyIGdpZFs4XTsgICAgICAgICAgICAgICAgICAvKiAxMTYgKi8KKyAgY2hhciBzaXplWzEyXTsgICAgICAgICAgICAgICAgLyogMTI0ICovCisgIGNoYXIgbXRpbWVbMTJdOyAgICAgICAgICAgICAgIC8qIDEzNiAqLworICBjaGFyIGNoa3N1bVs4XTsgICAgICAgICAgICAgICAvKiAxNDggKi8KKyAgY2hhciB0eXBlZmxhZzsgICAgICAgICAgICAgICAgLyogMTU2ICovCisgIGNoYXIgbGlua25hbWVbMTAwXTsgICAgICAgICAgIC8qIDE1NyAqLworICBjaGFyIG1hZ2ljWzZdOyAgICAgICAgICAgICAgICAvKiAyNTcgKi8KKyAgY2hhciB2ZXJzaW9uWzJdOyAgICAgICAgICAgICAgLyogMjYzICovCisgIGNoYXIgdW5hbWVbMzJdOyAgICAgICAgICAgICAgIC8qIDI2NSAqLworICBjaGFyIGduYW1lWzMyXTsgICAgICAgICAgICAgICAvKiAyOTcgKi8KKyAgY2hhciBkZXZtYWpvcls4XTsgICAgICAgICAgICAgLyogMzI5ICovCisgIGNoYXIgZGV2bWlub3JbOF07ICAgICAgICAgICAgIC8qIDMzNyAqLworICBjaGFyIHByZWZpeFsxNTVdOyAgICAgICAgICAgICAvKiAzNDUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTAwICovCit9OworCit1bmlvbiB0YXJfYnVmZmVyCit7CisgIGNoYXIgICAgICAgICAgICAgICBidWZmZXJbQkxPQ0tTSVpFXTsKKyAgc3RydWN0IHRhcl9oZWFkZXIgIGhlYWRlcjsKK307CisKK3N0cnVjdCBhdHRyX2l0ZW0KK3sKKyAgc3RydWN0IGF0dHJfaXRlbSAgKm5leHQ7CisgIGNoYXIgICAgICAgICAgICAgICpmbmFtZTsKKyAgaW50ICAgICAgICAgICAgICAgIG1vZGU7CisgIHRpbWVfdCAgICAgICAgICAgICB0aW1lOworfTsKKworZW51bSB7IFRHWl9FWFRSQUNULCBUR1pfTElTVCwgVEdaX0lOVkFMSUQgfTsKKworY2hhciAqVEdaZm5hbWUgICAgICAgICAgT0YoKGNvbnN0IGNoYXIgKikpOwordm9pZCBUR1pub3Rmb3VuZCAgICAgICAgT0YoKGNvbnN0IGNoYXIgKikpOworCitpbnQgZ2V0b2N0ICAgICAgICAgICAgICBPRigoY2hhciAqLCBpbnQpKTsKK2NoYXIgKnN0cnRpbWUgICAgICAgICAgIE9GKCh0aW1lX3QgKikpOworaW50IHNldGZpbGV0aW1lICAgICAgICAgT0YoKGNoYXIgKiwgdGltZV90KSk7Cit2b2lkIHB1c2hfYXR0ciAgICAgICAgICBPRigoc3RydWN0IGF0dHJfaXRlbSAqKiwgY2hhciAqLCBpbnQsIHRpbWVfdCkpOwordm9pZCByZXN0b3JlX2F0dHIgICAgICAgT0YoKHN0cnVjdCBhdHRyX2l0ZW0gKiopKTsKKworaW50IEV4cHJNYXRjaCAgICAgICAgICAgT0YoKGNoYXIgKiwgY2hhciAqKSk7CisKK2ludCBtYWtlZGlyICAgICAgICAgICAgIE9GKChjaGFyICopKTsKK2ludCBtYXRjaG5hbWUgICAgICAgICAgIE9GKChpbnQsIGludCwgY2hhciAqKiwgY2hhciAqKSk7CisKK3ZvaWQgZXJyb3IgICAgICAgICAgICAgIE9GKChjb25zdCBjaGFyICopKTsKK2ludCB0YXIgICAgICAgICAgICAgICAgIE9GKChnekZpbGUsIGludCwgaW50LCBpbnQsIGNoYXIgKiopKTsKKwordm9pZCBoZWxwICAgICAgICAgICAgICAgT0YoKGludCkpOworaW50IG1haW4gICAgICAgICAgICAgICAgT0YoKGludCwgY2hhciAqKikpOworCitjaGFyICpwcm9nOworCitjb25zdCBjaGFyICpUR1pzdWZmaXhbXSA9IHsgIlwwIiwgIi50YXIiLCAiLnRhci5neiIsICIudGF6IiwgIi50Z3oiLCBOVUxMIH07CisKKy8qIHJldHVybiB0aGUgZmlsZSBuYW1lIG9mIHRoZSBUR1ogYXJjaGl2ZSAqLworLyogb3IgTlVMTCBpZiBpdCBkb2VzIG5vdCBleGlzdCAqLworCitjaGFyICpUR1pmbmFtZSAoY29uc3QgY2hhciAqYXJjbmFtZSkKK3sKKyAgc3RhdGljIGNoYXIgYnVmZmVyWzEwMjRdOworICBpbnQgb3JpZ2xlbixpOworCisgIHN0cmNweShidWZmZXIsYXJjbmFtZSk7CisgIG9yaWdsZW4gPSBzdHJsZW4oYnVmZmVyKTsKKworICBmb3IgKGk9MDsgVEdac3VmZml4W2ldOyBpKyspCisgICAgeworICAgICAgIHN0cmNweShidWZmZXIrb3JpZ2xlbixUR1pzdWZmaXhbaV0pOworICAgICAgIGlmIChhY2Nlc3MoYnVmZmVyLEZfT0spID09IDApCisgICAgICAgICByZXR1cm4gYnVmZmVyOworICAgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKworLyogZXJyb3IgbWVzc2FnZSBmb3IgdGhlIGZpbGVuYW1lICovCisKK3ZvaWQgVEdabm90Zm91bmQgKGNvbnN0IGNoYXIgKmFyY25hbWUpCit7CisgIGludCBpOworCisgIGZwcmludGYoc3RkZXJyLCIlczogQ291bGRuJ3QgZmluZCAiLHByb2cpOworICBmb3IgKGk9MDtUR1pzdWZmaXhbaV07aSsrKQorICAgIGZwcmludGYoc3RkZXJyLChUR1pzdWZmaXhbaSsxXSkgPyAiJXMlcywgIiA6ICJvciAlcyVzXG4iLAorICAgICAgICAgICAgYXJjbmFtZSwKKyAgICAgICAgICAgIFRHWnN1ZmZpeFtpXSk7CisgIGV4aXQoMSk7Cit9CisKKworLyogY29udmVydCBvY3RhbCBkaWdpdHMgdG8gaW50ICovCisvKiBvbiBlcnJvciByZXR1cm4gLTEgKi8KKworaW50IGdldG9jdCAoY2hhciAqcCxpbnQgd2lkdGgpCit7CisgIGludCByZXN1bHQgPSAwOworICBjaGFyIGM7CisKKyAgd2hpbGUgKHdpZHRoLS0pCisgICAgeworICAgICAgYyA9ICpwKys7CisgICAgICBpZiAoYyA9PSAwKQorICAgICAgICBicmVhazsKKyAgICAgIGlmIChjID09ICcgJykKKyAgICAgICAgY29udGludWU7CisgICAgICBpZiAoYyA8ICcwJyB8fCBjID4gJzcnKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICByZXN1bHQgPSByZXN1bHQgKiA4ICsgKGMgLSAnMCcpOworICAgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiBjb252ZXJ0IHRpbWVfdCB0byBzdHJpbmcgKi8KKy8qIHVzZSB0aGUgIllZWVkvTU0vREQgaGg6bW06c3MiIGZvcm1hdCAqLworCitjaGFyICpzdHJ0aW1lICh0aW1lX3QgKnQpCit7CisgIHN0cnVjdCB0bSAgICpsb2NhbDsKKyAgc3RhdGljIGNoYXIgcmVzdWx0WzMyXTsKKworICBsb2NhbCA9IGxvY2FsdGltZSh0KTsKKyAgc3ByaW50ZihyZXN1bHQsIiU0ZC8lMDJkLyUwMmQgJTAyZDolMDJkOiUwMmQiLAorICAgICAgICAgIGxvY2FsLT50bV95ZWFyKzE5MDAsIGxvY2FsLT50bV9tb24rMSwgbG9jYWwtPnRtX21kYXksCisgICAgICAgICAgbG9jYWwtPnRtX2hvdXIsIGxvY2FsLT50bV9taW4sIGxvY2FsLT50bV9zZWMpOworICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qIHNldCBmaWxlIHRpbWUgKi8KKworaW50IHNldGZpbGV0aW1lIChjaGFyICpmbmFtZSx0aW1lX3QgZnRpbWUpCit7CisjaWZkZWYgV0lOMzIKKyAgc3RhdGljIGludCBpc1dpbk5UID0gLTE7CisgIFNZU1RFTVRJTUUgc3Q7CisgIEZJTEVUSU1FIGxvY2Z0LCBtb2RmdDsKKyAgc3RydWN0IHRtICpsb2N0bTsKKyAgSEFORExFIGhGaWxlOworICBpbnQgcmVzdWx0OworCisgIGxvY3RtID0gbG9jYWx0aW1lKCZmdGltZSk7CisgIGlmIChsb2N0bSA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKworICBzdC53WWVhciAgICAgICAgID0gKFdPUkQpbG9jdG0tPnRtX3llYXIgKyAxOTAwOworICBzdC53TW9udGggICAgICAgID0gKFdPUkQpbG9jdG0tPnRtX21vbiArIDE7CisgIHN0LndEYXlPZldlZWsgICAgPSAoV09SRClsb2N0bS0+dG1fd2RheTsKKyAgc3Qud0RheSAgICAgICAgICA9IChXT1JEKWxvY3RtLT50bV9tZGF5OworICBzdC53SG91ciAgICAgICAgID0gKFdPUkQpbG9jdG0tPnRtX2hvdXI7CisgIHN0LndNaW51dGUgICAgICAgPSAoV09SRClsb2N0bS0+dG1fbWluOworICBzdC53U2Vjb25kICAgICAgID0gKFdPUkQpbG9jdG0tPnRtX3NlYzsKKyAgc3Qud01pbGxpc2Vjb25kcyA9IDA7CisgIGlmICghU3lzdGVtVGltZVRvRmlsZVRpbWUoJnN0LCAmbG9jZnQpIHx8CisgICAgICAhTG9jYWxGaWxlVGltZVRvRmlsZVRpbWUoJmxvY2Z0LCAmbW9kZnQpKQorICAgIHJldHVybiAtMTsKKworICBpZiAoaXNXaW5OVCA8IDApCisgICAgaXNXaW5OVCA9IChHZXRWZXJzaW9uKCkgPCAweDgwMDAwMDAwKSA/IDEgOiAwOworICBoRmlsZSA9IENyZWF0ZUZpbGUoZm5hbWUsIEdFTkVSSUNfV1JJVEUsIDAsIE5VTEwsIE9QRU5fRVhJU1RJTkcsCisgICAgICAgICAgICAgICAgICAgICAoaXNXaW5OVCA/IEZJTEVfRkxBR19CQUNLVVBfU0VNQU5USUNTIDogMCksCisgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgIHJldHVybiAtMTsKKyAgcmVzdWx0ID0gU2V0RmlsZVRpbWUoaEZpbGUsIE5VTEwsIE5VTEwsICZtb2RmdCkgPyAwIDogLTE7CisgIENsb3NlSGFuZGxlKGhGaWxlKTsKKyAgcmV0dXJuIHJlc3VsdDsKKyNlbHNlCisgIHN0cnVjdCB1dGltYnVmIHNldHRpbWU7CisKKyAgc2V0dGltZS5hY3RpbWUgPSBzZXR0aW1lLm1vZHRpbWUgPSBmdGltZTsKKyAgcmV0dXJuIHV0aW1lKGZuYW1lLCZzZXR0aW1lKTsKKyNlbmRpZgorfQorCisKKy8qIHB1c2ggZmlsZSBhdHRyaWJ1dGVzICovCisKK3ZvaWQgcHVzaF9hdHRyKHN0cnVjdCBhdHRyX2l0ZW0gKipsaXN0LGNoYXIgKmZuYW1lLGludCBtb2RlLHRpbWVfdCB0aW1lKQoreworICBzdHJ1Y3QgYXR0cl9pdGVtICppdGVtOworCisgIGl0ZW0gPSAoc3RydWN0IGF0dHJfaXRlbSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGF0dHJfaXRlbSkpOworICBpZiAoaXRlbSA9PSBOVUxMKQorICAgIGVycm9yKCJPdXQgb2YgbWVtb3J5Iik7CisgIGl0ZW0tPmZuYW1lID0gc3RyZHVwKGZuYW1lKTsKKyAgaXRlbS0+bW9kZSAgPSBtb2RlOworICBpdGVtLT50aW1lICA9IHRpbWU7CisgIGl0ZW0tPm5leHQgID0gKmxpc3Q7CisgICpsaXN0ICAgICAgID0gaXRlbTsKK30KKworCisvKiByZXN0b3JlIGZpbGUgYXR0cmlidXRlcyAqLworCit2b2lkIHJlc3RvcmVfYXR0cihzdHJ1Y3QgYXR0cl9pdGVtICoqbGlzdCkKK3sKKyAgc3RydWN0IGF0dHJfaXRlbSAqaXRlbSwgKnByZXY7CisKKyAgZm9yIChpdGVtID0gKmxpc3Q7IGl0ZW0gIT0gTlVMTDsgKQorICAgIHsKKyAgICAgIHNldGZpbGV0aW1lKGl0ZW0tPmZuYW1lLGl0ZW0tPnRpbWUpOworICAgICAgY2htb2QoaXRlbS0+Zm5hbWUsaXRlbS0+bW9kZSk7CisgICAgICBwcmV2ID0gaXRlbTsKKyAgICAgIGl0ZW0gPSBpdGVtLT5uZXh0OworICAgICAgZnJlZShwcmV2KTsKKyAgICB9CisgICpsaXN0ID0gTlVMTDsKK30KKworCisvKiBtYXRjaCByZWd1bGFyIGV4cHJlc3Npb24gKi8KKworI2RlZmluZSBJU1NQRUNJQUwoYykgKCgoYykgPT0gJyonKSB8fCAoKGMpID09ICcvJykpCisKK2ludCBFeHByTWF0Y2ggKGNoYXIgKnN0cmluZyxjaGFyICpleHByKQoreworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpZiAoSVNTUEVDSUFMKCpleHByKSkKKyAgICAgICAgeworICAgICAgICAgIGlmICgqZXhwciA9PSAnLycpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICgqc3RyaW5nICE9ICdcXCcgJiYgKnN0cmluZyAhPSAnLycpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgIHN0cmluZyArKzsgZXhwcisrOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKCpleHByID09ICcqJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCpleHByICsrID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgIHdoaWxlICgqKytzdHJpbmcgIT0gKmV4cHIpCisgICAgICAgICAgICAgICAgaWYgKCpzdHJpbmcgPT0gMCkKKyAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKnN0cmluZyAhPSAqZXhwcikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIGlmICgqZXhwcisrID09IDApCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICBzdHJpbmcrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvKiByZWN1cnNpdmUgbWtkaXIgKi8KKy8qIGFib3J0IG9uIEVOT0VOVDsgaWdub3JlIG90aGVyIGVycm9ycyBsaWtlICJkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMiICovCisvKiByZXR1cm4gMSBpZiBPSyAqLworLyogICAgICAgIDAgb24gZXJyb3IgKi8KKworaW50IG1ha2VkaXIgKGNoYXIgKm5ld2RpcikKK3sKKyAgY2hhciAqYnVmZmVyID0gc3RyZHVwKG5ld2Rpcik7CisgIGNoYXIgKnA7CisgIGludCAgbGVuID0gc3RybGVuKGJ1ZmZlcik7CisKKyAgaWYgKGxlbiA8PSAwKSB7CisgICAgZnJlZShidWZmZXIpOworICAgIHJldHVybiAwOworICB9CisgIGlmIChidWZmZXJbbGVuLTFdID09ICcvJykgeworICAgIGJ1ZmZlcltsZW4tMV0gPSAnXDAnOworICB9CisgIGlmIChta2RpcihidWZmZXIsIDA3NTUpID09IDApCisgICAgeworICAgICAgZnJlZShidWZmZXIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIHAgPSBidWZmZXIrMTsKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgY2hhciBob2xkOworCisgICAgICB3aGlsZSgqcCAmJiAqcCAhPSAnXFwnICYmICpwICE9ICcvJykKKyAgICAgICAgcCsrOworICAgICAgaG9sZCA9ICpwOworICAgICAgKnAgPSAwOworICAgICAgaWYgKChta2RpcihidWZmZXIsIDA3NTUpID09IC0xKSAmJiAoZXJybm8gPT0gRU5PRU5UKSkKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCIlczogQ291bGRuJ3QgY3JlYXRlIGRpcmVjdG9yeSAlc1xuIixwcm9nLGJ1ZmZlcik7CisgICAgICAgICAgZnJlZShidWZmZXIpOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICBpZiAoaG9sZCA9PSAwKQorICAgICAgICBicmVhazsKKyAgICAgICpwKysgPSBob2xkOworICAgIH0KKyAgZnJlZShidWZmZXIpOworICByZXR1cm4gMTsKK30KKworCitpbnQgbWF0Y2huYW1lIChpbnQgYXJnLGludCBhcmdjLGNoYXIgKiphcmd2LGNoYXIgKmZuYW1lKQoreworICBpZiAoYXJnID09IGFyZ2MpICAgICAgLyogbm8gYXJndW1lbnRzIGdpdmVuICh1bnRneiB0Z3phcmNoaXZlKSAqLworICAgIHJldHVybiAxOworCisgIHdoaWxlIChhcmcgPCBhcmdjKQorICAgIGlmIChFeHByTWF0Y2goZm5hbWUsYXJndlthcmcrK10pKQorICAgICAgcmV0dXJuIDE7CisKKyAgcmV0dXJuIDA7IC8qIGlnbm9yZSB0aGlzIGZvciB0aGUgbW9tZW50IGJlaW5nICovCit9CisKKworLyogdGFyIGZpbGUgbGlzdCBvciBleHRyYWN0ICovCisKK2ludCB0YXIgKGd6RmlsZSBpbixpbnQgYWN0aW9uLGludCBhcmcsaW50IGFyZ2MsY2hhciAqKmFyZ3YpCit7CisgIHVuaW9uICB0YXJfYnVmZmVyIGJ1ZmZlcjsKKyAgaW50ICAgIGxlbjsKKyAgaW50ICAgIGVycjsKKyAgaW50ICAgIGdldGhlYWRlciA9IDE7CisgIGludCAgICByZW1haW5pbmcgPSAwOworICBGSUxFICAgKm91dGZpbGUgPSBOVUxMOworICBjaGFyICAgZm5hbWVbQkxPQ0tTSVpFXTsKKyAgaW50ICAgIHRhcm1vZGU7CisgIHRpbWVfdCB0YXJ0aW1lOworICBzdHJ1Y3QgYXR0cl9pdGVtICphdHRyaWJ1dGVzID0gTlVMTDsKKworICBpZiAoYWN0aW9uID09IFRHWl9MSVNUKQorICAgIHByaW50ZigiICAgIGRhdGUgICAgICB0aW1lICAgICBzaXplICAgICAgICAgICAgICAgICAgICAgICBmaWxlXG4iCisgICAgICAgICAgICIgLS0tLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGxlbiA9IGd6cmVhZChpbiwgJmJ1ZmZlciwgQkxPQ0tTSVpFKTsKKyAgICAgIGlmIChsZW4gPCAwKQorICAgICAgICBlcnJvcihnemVycm9yKGluLCAmZXJyKSk7CisgICAgICAvKgorICAgICAgICogQWx3YXlzIGV4cGVjdCBjb21wbGV0ZSBibG9ja3MgdG8gcHJvY2VzcworICAgICAgICogdGhlIHRhciBpbmZvcm1hdGlvbi4KKyAgICAgICAqLworICAgICAgaWYgKGxlbiAhPSBCTE9DS1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICBhY3Rpb24gPSBUR1pfSU5WQUxJRDsgLyogZm9yY2UgZXJyb3IgZXhpdCAqLworICAgICAgICAgIHJlbWFpbmluZyA9IDA7ICAgICAgICAvKiBmb3JjZSBJL08gY2xlYW51cCAqLworICAgICAgICB9CisKKyAgICAgIC8qCisgICAgICAgKiBJZiB3ZSBoYXZlIHRvIGdldCBhIHRhciBoZWFkZXIKKyAgICAgICAqLworICAgICAgaWYgKGdldGhlYWRlciA+PSAxKQorICAgICAgICB7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBpZiB3ZSBtZXQgdGhlIGVuZCBvZiB0aGUgdGFyCisgICAgICAgICAgICogb3IgdGhlIGVuZC1vZi10YXIgYmxvY2ssCisgICAgICAgICAgICogd2UgYXJlIGRvbmUKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAobGVuID09IDAgfHwgYnVmZmVyLmhlYWRlci5uYW1lWzBdID09IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIHRhcm1vZGUgPSBnZXRvY3QoYnVmZmVyLmhlYWRlci5tb2RlLDgpOworICAgICAgICAgIHRhcnRpbWUgPSAodGltZV90KWdldG9jdChidWZmZXIuaGVhZGVyLm10aW1lLDEyKTsKKyAgICAgICAgICBpZiAodGFybW9kZSA9PSAtMSB8fCB0YXJ0aW1lID09ICh0aW1lX3QpLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJ1ZmZlci5oZWFkZXIubmFtZVswXSA9IDA7CisgICAgICAgICAgICAgIGFjdGlvbiA9IFRHWl9JTlZBTElEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGdldGhlYWRlciA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBzdHJuY3B5KGZuYW1lLGJ1ZmZlci5oZWFkZXIubmFtZSxTSE9SVE5BTUVTSVpFKTsKKyAgICAgICAgICAgICAgaWYgKGZuYW1lW1NIT1JUTkFNRVNJWkUtMV0gIT0gMCkKKyAgICAgICAgICAgICAgICAgIGZuYW1lW1NIT1JUTkFNRVNJWkVdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAqIFRoZSBmaWxlIG5hbWUgaXMgbG9uZ2VyIHRoYW4gU0hPUlROQU1FU0laRQorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgaWYgKHN0cm5jbXAoZm5hbWUsYnVmZmVyLmhlYWRlci5uYW1lLFNIT1JUTkFNRVNJWkUtMSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgIGVycm9yKCJiYWQgbG9uZyBuYW1lIik7CisgICAgICAgICAgICAgIGdldGhlYWRlciA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIEFjdCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgZmxhZworICAgICAgICAgICAqLworICAgICAgICAgIHN3aXRjaCAoYnVmZmVyLmhlYWRlci50eXBlZmxhZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgRElSVFlQRToKKyAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBUR1pfTElTVCkKKyAgICAgICAgICAgICAgICBwcmludGYoIiAlcyAgICAgPGRpcj4gJXNcbiIsc3RydGltZSgmdGFydGltZSksZm5hbWUpOworICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IFRHWl9FWFRSQUNUKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIG1ha2VkaXIoZm5hbWUpOworICAgICAgICAgICAgICAgICAgcHVzaF9hdHRyKCZhdHRyaWJ1dGVzLGZuYW1lLHRhcm1vZGUsdGFydGltZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUkVHVFlQRToKKyAgICAgICAgICAgIGNhc2UgQVJFR1RZUEU6CisgICAgICAgICAgICAgIHJlbWFpbmluZyA9IGdldG9jdChidWZmZXIuaGVhZGVyLnNpemUsMTIpOworICAgICAgICAgICAgICBpZiAocmVtYWluaW5nID09IC0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IFRHWl9JTlZBTElEOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IFRHWl9MSVNUKQorICAgICAgICAgICAgICAgIHByaW50ZigiICVzICU5ZCAlc1xuIixzdHJ0aW1lKCZ0YXJ0aW1lKSxyZW1haW5pbmcsZm5hbWUpOworICAgICAgICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT0gVEdaX0VYVFJBQ1QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKG1hdGNobmFtZShhcmcsYXJnYyxhcmd2LGZuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIG91dGZpbGUgPSBmb3BlbihmbmFtZSwid2IiKTsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0ZmlsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cnkgY3JlYXRpbmcgZGlyZWN0b3J5ICovCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwID0gc3RycmNocihmbmFtZSwgJy8nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKnAgPSAnXDAnOworICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlZGlyKGZuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKnAgPSAnLyc7CisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGZpbGUgPSBmb3BlbihmbmFtZSwid2IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dGZpbGUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiRXh0cmFjdGluZyAlc1xuIixmbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogQ291bGRuJ3QgY3JlYXRlICVzIixwcm9nLGZuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBvdXRmaWxlID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGdldGhlYWRlciA9IDA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHTlVUWVBFX0xPTkdMSU5LOgorICAgICAgICAgICAgY2FzZSBHTlVUWVBFX0xPTkdOQU1FOgorICAgICAgICAgICAgICByZW1haW5pbmcgPSBnZXRvY3QoYnVmZmVyLmhlYWRlci5zaXplLDEyKTsKKyAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA8IDAgfHwgcmVtYWluaW5nID49IEJMT0NLU0laRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBhY3Rpb24gPSBUR1pfSU5WQUxJRDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgbGVuID0gZ3pyZWFkKGluLCBmbmFtZSwgQkxPQ0tTSVpFKTsKKyAgICAgICAgICAgICAgaWYgKGxlbiA8IDApCisgICAgICAgICAgICAgICAgZXJyb3IoZ3plcnJvcihpbiwgJmVycikpOworICAgICAgICAgICAgICBpZiAoZm5hbWVbQkxPQ0tTSVpFLTFdICE9IDAgfHwgKGludClzdHJsZW4oZm5hbWUpID4gcmVtYWluaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IFRHWl9JTlZBTElEOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBnZXRoZWFkZXIgPSAyOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gVEdaX0xJU1QpCisgICAgICAgICAgICAgICAgcHJpbnRmKCIgJXMgICAgIDwtLS0+ICVzXG4iLHN0cnRpbWUoJnRhcnRpbWUpLGZuYW1lKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHVuc2lnbmVkIGludCBieXRlcyA9IChyZW1haW5pbmcgPiBCTE9DS1NJWkUpID8gQkxPQ0tTSVpFIDogcmVtYWluaW5nOworCisgICAgICAgICAgaWYgKG91dGZpbGUgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGZ3cml0ZSgmYnVmZmVyLHNpemVvZihjaGFyKSxieXRlcyxvdXRmaWxlKSAhPSBieXRlcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBFcnJvciB3cml0aW5nICVzIC0tIHNraXBwaW5nXG4iLHByb2csZm5hbWUpOworICAgICAgICAgICAgICAgICAgZmNsb3NlKG91dGZpbGUpOworICAgICAgICAgICAgICAgICAgb3V0ZmlsZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICByZW1vdmUoZm5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICByZW1haW5pbmcgLT0gYnl0ZXM7CisgICAgICAgIH0KKworICAgICAgaWYgKHJlbWFpbmluZyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgZ2V0aGVhZGVyID0gMTsKKyAgICAgICAgICBpZiAob3V0ZmlsZSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmY2xvc2Uob3V0ZmlsZSk7CisgICAgICAgICAgICAgIG91dGZpbGUgPSBOVUxMOworICAgICAgICAgICAgICBpZiAoYWN0aW9uICE9IFRHWl9JTlZBTElEKQorICAgICAgICAgICAgICAgIHB1c2hfYXR0cigmYXR0cmlidXRlcyxmbmFtZSx0YXJtb2RlLHRhcnRpbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIC8qCisgICAgICAgKiBBYmFuZG9uIGlmIGVycm9ycyBhcmUgZm91bmQKKyAgICAgICAqLworICAgICAgaWYgKGFjdGlvbiA9PSBUR1pfSU5WQUxJRCkKKyAgICAgICAgeworICAgICAgICAgIGVycm9yKCJicm9rZW4gYXJjaGl2ZSIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgIC8qCisgICAqIFJlc3RvcmUgZmlsZSBtb2RlcyBhbmQgdGltZSBzdGFtcHMKKyAgICovCisgIHJlc3RvcmVfYXR0cigmYXR0cmlidXRlcyk7CisKKyAgaWYgKGd6Y2xvc2UoaW4pICE9IFpfT0spCisgICAgZXJyb3IoImZhaWxlZCBnemNsb3NlIik7CisKKyAgcmV0dXJuIDA7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3ZvaWQgaGVscChpbnQgZXhpdHZhbCkKK3sKKyAgcHJpbnRmKCJ1bnRneiB2ZXJzaW9uIDAuMi4xXG4iCisgICAgICAgICAiICB1c2luZyB6bGliIHZlcnNpb24gJXNcblxuIiwKKyAgICAgICAgIHpsaWJWZXJzaW9uKCkpOworICBwcmludGYoIlVzYWdlOiB1bnRneiBmaWxlLnRneiAgICAgICAgICAgIGV4dHJhY3QgYWxsIGZpbGVzXG4iCisgICAgICAgICAiICAgICAgIHVudGd6IGZpbGUudGd6IGZuYW1lIC4uLiAgZXh0cmFjdCBzZWxlY3RlZCBmaWxlc1xuIgorICAgICAgICAgIiAgICAgICB1bnRneiAtbCBmaWxlLnRneiAgICAgICAgIGxpc3QgYXJjaGl2ZSBjb250ZW50c1xuIgorICAgICAgICAgIiAgICAgICB1bnRneiAtaCAgICAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwXG4iKTsKKyAgZXhpdChleGl0dmFsKTsKK30KKwordm9pZCBlcnJvcihjb25zdCBjaGFyICptc2cpCit7CisgIGZwcmludGYoc3RkZXJyLCAiJXM6ICVzXG4iLCBwcm9nLCBtc2cpOworICBleGl0KDEpOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjaWYgZGVmaW5lZChXSU4zMikgJiYgZGVmaW5lZChfX0dOVUNfXykKK2ludCBfQ1JUX2dsb2IgPSAwOyAgICAgIC8qIGRpc2FibGUgYXJndW1lbnQgZ2xvYmJpbmcgaW4gTWluR1cgKi8KKyNlbmRpZgorCitpbnQgbWFpbihpbnQgYXJnYyxjaGFyICoqYXJndikKK3sKKyAgICBpbnQgICAgICAgICBhY3Rpb24gPSBUR1pfRVhUUkFDVDsKKyAgICBpbnQgICAgICAgICBhcmcgPSAxOworICAgIGNoYXIgICAgICAgICpUR1pmaWxlOworICAgIGd6RmlsZSAgICAgICpmOworCisgICAgcHJvZyA9IHN0cnJjaHIoYXJndlswXSwnXFwnKTsKKyAgICBpZiAocHJvZyA9PSBOVUxMKQorICAgICAgeworICAgICAgICBwcm9nID0gc3RycmNocihhcmd2WzBdLCcvJyk7CisgICAgICAgIGlmIChwcm9nID09IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgcHJvZyA9IHN0cnJjaHIoYXJndlswXSwnOicpOworICAgICAgICAgICAgaWYgKHByb2cgPT0gTlVMTCkKKyAgICAgICAgICAgICAgcHJvZyA9IGFyZ3ZbMF07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHByb2crKzsKKyAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcm9nKys7CisgICAgICB9CisgICAgZWxzZQorICAgICAgcHJvZysrOworCisgICAgaWYgKGFyZ2MgPT0gMSkKKyAgICAgIGhlbHAoMCk7CisKKyAgICBpZiAoc3RyY21wKGFyZ3ZbYXJnXSwiLWwiKSA9PSAwKQorICAgICAgeworICAgICAgICBhY3Rpb24gPSBUR1pfTElTVDsKKyAgICAgICAgaWYgKGFyZ2MgPT0gKythcmcpCisgICAgICAgICAgaGVscCgwKTsKKyAgICAgIH0KKyAgICBlbHNlIGlmIChzdHJjbXAoYXJndlthcmddLCItaCIpID09IDApCisgICAgICB7CisgICAgICAgIGhlbHAoMCk7CisgICAgICB9CisKKyAgICBpZiAoKFRHWmZpbGUgPSBUR1pmbmFtZShhcmd2W2FyZ10pKSA9PSBOVUxMKQorICAgICAgVEdabm90Zm91bmQoYXJndlthcmddKTsKKworICAgICsrYXJnOworICAgIGlmICgoYWN0aW9uID09IFRHWl9MSVNUKSAmJiAoYXJnICE9IGFyZ2MpKQorICAgICAgaGVscCgxKTsKKworLyoKKyAqICBQcm9jZXNzIHRoZSBUR1ogZmlsZQorICovCisgICAgc3dpdGNoKGFjdGlvbikKKyAgICAgIHsKKyAgICAgIGNhc2UgVEdaX0xJU1Q6CisgICAgICBjYXNlIFRHWl9FWFRSQUNUOgorICAgICAgICBmID0gZ3pvcGVuKFRHWmZpbGUsInJiIik7CisgICAgICAgIGlmIChmID09IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIiVzOiBDb3VsZG4ndCBnem9wZW4gJXNcbiIscHJvZyxUR1pmaWxlKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgIH0KKyAgICAgICAgZXhpdCh0YXIoZiwgYWN0aW9uLCBhcmcsIGFyZ2MsIGFyZ3YpKTsKKyAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBlcnJvcigiVW5rbm93biBvcHRpb24iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3JlYWRtZS50eHQgYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmRjZDlkCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3JlYWRtZS50eHQKQEAgLTAsMCArMSw2NSBAQAorQnVpbGRpbmcgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgRExMIHZlcnNpb25zIG9mIFpsaWIgMS4yLjgNCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHByb2plY3RzIHRoYXQgYnVpbGQgemxpYiBhbmQgbWluaXppcCB1c2luZw0KK01pY3Jvc29mdCBWaXN1YWwgQysrIDkuMC8xMC4wLg0KKw0KK1lvdSBkb24ndCBuZWVkIHRvIGJ1aWxkIHRoZXNlIHByb2plY3RzIHlvdXJzZWxmLiBZb3UgY2FuIGRvd25sb2FkIHRoZQ0KK2JpbmFyaWVzIGZyb206DQorICBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsDQorDQorTW9yZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgYXQgdGhpcyBzaXRlLg0KKw0KKw0KKw0KKw0KKw0KK0J1aWxkIGluc3RydWN0aW9ucyBmb3IgVmlzdWFsIFN0dWRpbyAyMDA4ICgzMiBiaXRzIG9yIDY0IGJpdHMpDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCistIFVuY29tcHJlc3MgY3VycmVudCB6bGliLCBpbmNsdWRpbmcgYWxsIGNvbnRyaWIvKiBmaWxlcw0KKy0gQ29tcGlsZSBhc3NlbWJseSBjb2RlICh3aXRoIFZpc3VhbCBTdHVkaW8gQ29tbWFuZCBQcm9tcHQpIGJ5IHJ1bm5pbmc6DQorICAgYmxkX21sNjQuYmF0IChpbiBjb250cmliXG1hc214NjQpDQorICAgYmxkX21sMzIuYmF0IChpbiBjb250cmliXG1hc214ODYpDQorLSBPcGVuIGNvbnRyaWJcdnN0dWRpb1x2YzlcemxpYnZjLnNsbiB3aXRoIE1pY3Jvc29mdCBWaXN1YWwgQysrIDIwMDgNCistIE9yIHJ1bjogdmNidWlsZCAvcmVidWlsZCBjb250cmliXHZzdHVkaW9cdmM5XHpsaWJ2Yy5zbG4gIlJlbGVhc2V8V2luMzIiDQorDQorQnVpbGQgaW5zdHJ1Y3Rpb25zIGZvciBWaXN1YWwgU3R1ZGlvIDIwMTAgKDMyIGJpdHMgb3IgNjQgYml0cykNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy0gVW5jb21wcmVzcyBjdXJyZW50IHpsaWIsIGluY2x1ZGluZyBhbGwgY29udHJpYi8qIGZpbGVzDQorLSBPcGVuIGNvbnRyaWJcdnN0dWRpb1x2YzEwXHpsaWJ2Yy5zbG4gd2l0aCBNaWNyb3NvZnQgVmlzdWFsIEMrKyAyMDEwDQorDQorQnVpbGQgaW5zdHJ1Y3Rpb25zIGZvciBWaXN1YWwgU3R1ZGlvIDIwMTIgKDMyIGJpdHMgb3IgNjQgYml0cykNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy0gVW5jb21wcmVzcyBjdXJyZW50IHpsaWIsIGluY2x1ZGluZyBhbGwgY29udHJpYi8qIGZpbGVzDQorLSBPcGVuIGNvbnRyaWJcdnN0dWRpb1x2YzExXHpsaWJ2Yy5zbG4gd2l0aCBNaWNyb3NvZnQgVmlzdWFsIEMrKyAyMDEyDQorDQorDQorSW1wb3J0YW50DQorLS0tLS0tLS0tDQorLSBUbyB1c2UgemxpYndhcGkuZGxsIGluIHlvdXIgYXBwbGljYXRpb24sIHlvdSBtdXN0IGRlZmluZSB0aGUNCisgIG1hY3JvIFpMSUJfV0lOQVBJIHdoZW4gY29tcGlsaW5nIHlvdXIgYXBwbGljYXRpb24ncyBzb3VyY2UgZmlsZXMuDQorDQorDQorQWRkaXRpb25hbCBub3Rlcw0KKy0tLS0tLS0tLS0tLS0tLS0NCistIFRoaXMgRExMLCBuYW1lZCB6bGlid2FwaS5kbGwsIGlzIGNvbXBhdGlibGUgdG8gdGhlIG9sZCB6bGliLmRsbCBidWlsdA0KKyAgYnkgR2lsbGVzIFZvbGxhbnQgZnJvbSB0aGUgemxpYiAxLjEueCBzb3VyY2VzLCBhbmQgZGlzdHJpYnV0ZWQgYXQNCisgICAgaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbA0KKyAgSXQgdXNlcyB0aGUgV0lOQVBJIGNhbGxpbmcgY29udmVudGlvbiBmb3IgdGhlIGV4cG9ydGVkIGZ1bmN0aW9ucywgYW5kDQorICBpbmNsdWRlcyB0aGUgbWluaXppcCBmdW5jdGlvbmFsaXR5LiBJZiB5b3VyIGFwcGxpY2F0aW9uIG5lZWRzIHRoYXQNCisgIHBhcnRpY3VsYXIgYnVpbGQgb2YgemxpYi5kbGwsIHlvdSBjYW4gcmVuYW1lIHpsaWJ3YXBpLmRsbCB0byB6bGliLmRsbC4NCisNCistIFRoZSBuZXcgRExMIHdhcyByZW5hbWVkIGJlY2F1c2UgdGhlcmUgZXhpc3Qgc2V2ZXJhbCBpbmNvbXBhdGlibGUNCisgIHZlcnNpb25zIG9mIHpsaWIuZGxsIG9uIHRoZSBJbnRlcm5ldC4NCisNCistIFRoZXJlIGlzIGFsc28gYW4gb2ZmaWNpYWwgRExMIGJ1aWxkIG9mIHpsaWIsIG5hbWVkIHpsaWIxLmRsbC4gVGhpcyBvbmUNCisgIGlzIGV4cG9ydGluZyB0aGUgZnVuY3Rpb25zIHVzaW5nIHRoZSBDREVDTCBjb252ZW50aW9uLiBTZWUgdGhlIGZpbGUNCisgIHdpbjMyXERMTF9GQVEudHh0IGZvdW5kIGluIHRoaXMgemxpYiBkaXN0cmlidXRpb24uDQorDQorLSBUaGVyZSB1c2VkIHRvIGJlIGEgWkxJQl9ETEwgbWFjcm8gaW4gemxpYiAxLjEueCwgYnV0IG5vdyB0aGlzIHN5bWJvbA0KKyAgaGFzIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVmZmVjdC4gVG8gYXZvaWQgY29tcGF0aWJpbGl0eSBwcm9ibGVtcywgZG8NCisgIG5vdCBkZWZpbmUgaXQgaGVyZS4NCisNCisNCitHaWxsZXMgVm9sbGFudA0KK2luZm9Ad2luaW1hZ2UuY29tDQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjMTAvbWluaXVuei52Y3hwcm9qIGIvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjMTAvbWluaXVuei52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZTE1YzkKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMC9taW5pdW56LnZjeHByb2oKQEAgLTAsMCArMSwzMTAgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8SXRhbml1bSI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPkl0YW5pdW08L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3x4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxJdGFuaXVtIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5JdGFuaXVtPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8eDY0Ij4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+DQorICAgIDxQcm9qZWN0R3VpZD57QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfTwvUHJvamVjdEd1aWQ+DQorICAgIDxLZXl3b3JkPldpbjMyUHJvajwvS2V5d29yZD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxfUHJvamVjdEZpbGVWZXJzaW9uPjEwLjAuMzAxMjguMTwvX1Byb2plY3RGaWxlVmVyc2lvbj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+eDg2XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPng4NlxNaW5pVW56aXAkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+dHJ1ZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+eDg2XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+eDg2XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+eDY0XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj54NjRcTWluaVVuemlwJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj50cnVlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+aWE2NFxNaW5pVW56aXAkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPmlhNjRcTWluaVVuemlwJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+dHJ1ZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+eDY0XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPng2NFxNaW5pVW56aXAkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+aWE2NFxNaW5pVW56aXAkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+aWE2NFxNaW5pVW56aXAkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIC8+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1pbml6aXA7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7X0RFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PkVkaXRBbmRDb250aW51ZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPng4NlxabGliRGxsRGVidWdcemxpYndhcGkubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpbWluaXVuei5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFByb2dyYW1EYXRhYmFzZUZpbGU+JChPdXREaXIpbWluaXVuei5wZGI8L1Byb2dyYW1EYXRhYmFzZUZpbGU+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPFJhbmRvbWl6ZWRCYXNlQWRkcmVzcz5mYWxzZTwvUmFuZG9taXplZEJhc2VBZGRyZXNzPg0KKyAgICAgIDxEYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8L0RhdGFFeGVjdXRpb25QcmV2ZW50aW9uPg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYODY8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWluaXppcDslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+eDg2XFpsaWJEbGxSZWxlYXNlXHpsaWJ3YXBpLmxpYjslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKW1pbml1bnouZXhlPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPg0KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+DQorICAgICAgPFJhbmRvbWl6ZWRCYXNlQWRkcmVzcz5mYWxzZTwvUmFuZG9taXplZEJhc2VBZGRyZXNzPg0KKyAgICAgIDxEYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8L0RhdGFFeGVjdXRpb25QcmV2ZW50aW9uPg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYODY8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5YNjQ8L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1pbml6aXA7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7X0RFQlVHO19DT05TT0xFO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1Z0RMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPng2NFxabGliRGxsRGVidWdcemxpYndhcGkubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpbWluaXVuei5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFByb2dyYW1EYXRhYmFzZUZpbGU+JChPdXREaXIpbWluaXVuei5wZGI8L1Byb2dyYW1EYXRhYmFzZUZpbGU+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg2NDwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5JdGFuaXVtPC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtaW5pemlwOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO1pMSUJfV0lOQVBJO19ERUJVRztfQ09OU09MRTtXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1pbmltYWxSZWJ1aWxkPnRydWU8L01pbmltYWxSZWJ1aWxkPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWdETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5pYTY0XFpsaWJEbGxEZWJ1Z1x6bGlid2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpciltaW5pdW56LmV4ZTwvT3V0cHV0RmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8UHJvZ3JhbURhdGFiYXNlRmlsZT4kKE91dERpciltaW5pdW56LnBkYjwvUHJvZ3JhbURhdGFiYXNlRmlsZT4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lSUE2NDwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+WDY0PC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWluaXppcDslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWRETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+eDY0XFpsaWJEbGxSZWxlYXNlXHpsaWJ3YXBpLmxpYjslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKW1pbml1bnouZXhlPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPg0KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg2NDwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Pkl0YW5pdW08L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5Pbmx5RXhwbGljaXRJbmxpbmU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz50cnVlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtaW5pemlwOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO1pMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTtXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5pYTY0XFpsaWJEbGxSZWxlYXNlXHpsaWJ3YXBpLmxpYjslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKW1pbml1bnouZXhlPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPg0KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZUlBNjQ8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbWluaXppcFxtaW5pdW56LmMiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9InpsaWJ2Yy52Y3hwcm9qIj4NCisgICAgICA8UHJvamVjdD57OGZkODI2ZjgtMzczOS00NGU2LThjYzgtOTk3MTIyZTUzYjhkfTwvUHJvamVjdD4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25UYXJnZXRzIj4NCisgIDwvSW1wb3J0R3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzEwL21pbml1bnoudmN4cHJvai5maWx0ZXJzIGIvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjMTAvbWluaXVuei52Y3hwcm9qLmZpbHRlcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIyYTNkZQotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzEwL21pbml1bnoudmN4cHJvai5maWx0ZXJzCkBAIC0wLDAgKzEsMjIgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXMiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnswNDhhZjk0My0wMjJiLTRkYjYtYmVlYi1hNTRjMzQ3NzRlZTJ9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICAgIDxFeHRlbnNpb25zPmNwcDtjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTwvRXh0ZW5zaW9ucz4NCisgICAgPC9GaWx0ZXI+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iSGVhZGVyIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57YzFkNjAwZDItODg4Zi00YWVhLWI3M2UtOGIwZGQ5YmVmYTBjfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5oO2hwcDtoeHg7aG07aW5sO2luYzwvRXh0ZW5zaW9ucz4NCisgICAgPC9GaWx0ZXI+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iUmVzb3VyY2UgRmlsZXMiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnswODQ0MTk5YS05NjZiLTRmMTktODFkYi0xZTAxMjVlMTQxYjl9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICAgIDxFeHRlbnNpb25zPnJjO2ljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZTwvRXh0ZW5zaW9ucz4NCisgICAgPC9GaWx0ZXI+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbWluaXppcFxtaW5pdW56LmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtR3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzEwL21pbml6aXAudmN4cHJvaiBiL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzEwL21pbml6aXAudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTdlMTU2Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjMTAvbWluaXppcC52Y3hwcm9qCkBAIC0wLDAgKzEsMzA3IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfEl0YW5pdW0iPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5JdGFuaXVtPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8eDY0Ij4NCisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8SXRhbml1bSI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+SXRhbml1bTwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPg0KKyAgICA8UHJvamVjdEd1aWQ+ezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn08L1Byb2plY3RHdWlkPg0KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAucHJvcHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8X1Byb2plY3RGaWxlVmVyc2lvbj4xMC4wLjMwMTI4LjE8L19Qcm9qZWN0RmlsZVZlcnNpb24+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPng4NlxNaW5pWmlwJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+eDg2XE1pbmlaaXAkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+dHJ1ZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+eDg2XE1pbmlaaXAkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPng4NlxNaW5pWmlwJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPng2NFwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+eDY0XCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj50cnVlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+aWE2NFwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPmlhNjRcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj50cnVlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj54NjRcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+eDY0XCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5pYTY0XCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5pYTY0XCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiAvPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtaW5pemlwOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO1pMSUJfV0lOQVBJO19ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1pbmltYWxSZWJ1aWxkPnRydWU8L01pbmltYWxSZWJ1aWxkPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWc8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5FZGl0QW5kQ29udGludWU8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz54ODZcWmxpYkRsbERlYnVnXHpsaWJ3YXBpLmxpYjslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKW1pbml6aXAuZXhlPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxQcm9ncmFtRGF0YWJhc2VGaWxlPiQoT3V0RGlyKW1pbml6aXAucGRiPC9Qcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxSYW5kb21pemVkQmFzZUFkZHJlc3M+ZmFsc2U8L1JhbmRvbWl6ZWRCYXNlQWRkcmVzcz4NCisgICAgICA8RGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPC9EYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDg2PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPk9ubHlFeHBsaWNpdElubGluZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1pbml6aXA7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7TkRFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPng4NlxabGliRGxsUmVsZWFzZVx6bGlid2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpciltaW5pemlwLmV4ZTwvT3V0cHV0RmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4NCisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPg0KKyAgICAgIDxSYW5kb21pemVkQmFzZUFkZHJlc3M+ZmFsc2U8L1JhbmRvbWl6ZWRCYXNlQWRkcmVzcz4NCisgICAgICA8RGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPC9EYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDg2PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+WDY0PC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtaW5pemlwOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO1pMSUJfV0lOQVBJO19ERUJVRztfQ09OU09MRTtXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1pbmltYWxSZWJ1aWxkPnRydWU8L01pbmltYWxSZWJ1aWxkPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWdETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz54NjRcWmxpYkRsbERlYnVnXHpsaWJ3YXBpLmxpYjslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKW1pbml6aXAuZXhlPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxQcm9ncmFtRGF0YWJhc2VGaWxlPiQoT3V0RGlyKW1pbml6aXAucGRiPC9Qcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYNjQ8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+SXRhbml1bTwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWluaXppcDslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+aWE2NFxabGliRGxsRGVidWdcemxpYndhcGkubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpbWluaXppcC5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFByb2dyYW1EYXRhYmFzZUZpbGU+JChPdXREaXIpbWluaXppcC5wZGI8L1Byb2dyYW1EYXRhYmFzZUZpbGU+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZUlBNjQ8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPk9ubHlFeHBsaWNpdElubGluZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1pbml6aXA7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7TkRFQlVHO19DT05TT0xFO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPng2NFxabGliRGxsUmVsZWFzZVx6bGlid2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpciltaW5pemlwLmV4ZTwvT3V0cHV0RmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4NCisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYNjQ8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5JdGFuaXVtPC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWluaXppcDslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWRETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+aWE2NFxabGliRGxsUmVsZWFzZVx6bGlid2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpciltaW5pemlwLmV4ZTwvT3V0cHV0RmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4NCisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVJQTY0PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXG1pbml6aXBcbWluaXppcC5jIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSJ6bGlidmMudmN4cHJvaiI+DQorICAgICAgPFByb2plY3Q+ezhmZDgyNmY4LTM3MzktNDRlNi04Y2M4LTk5NzEyMmU1M2I4ZH08L1Byb2plY3Q+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMC9taW5pemlwLnZjeHByb2ouZmlsdGVycyBiL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzEwL21pbml6aXAudmN4cHJvai5maWx0ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNzNjZDMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMC9taW5pemlwLnZjeHByb2ouZmlsdGVycwpAQCAtMCwwICsxLDIyIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iU291cmNlIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57YzA0MTliNDAtYmY1MC00MGRhLWIxNTMtZmY3NDIxNWI3OWRlfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5jcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc208L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IkhlYWRlciBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2JiODdiMDcwLTczNWItNDc4ZS05MmNlLTczODNhYmIyZjM2Y308L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgICAgPEV4dGVuc2lvbnM+aDtocHA7aHh4O2htO2lubDtpbmM8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlJlc291cmNlIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57ZjQ2YWI2YTYtNTQ4Zi00M2NiLWFlOTYtNjgxYWJiNWJkNWRifTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5yYztpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGU8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXG1pbml6aXBcbWluaXppcC5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbUdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMC90ZXN0emxpYi52Y3hwcm9qIGIvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjMTAvdGVzdHpsaWIudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDg4ZDE3Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjMTAvdGVzdHpsaWIudmN4cHJvagpAQCAtMCwwICsxLDQyMCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xJdGFuaXVtIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+SXRhbml1bTwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlV2l0aG91dEFzbTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+SXRhbml1bTwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZVdpdGhvdXRBc208L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2VXaXRob3V0QXNtfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZVdpdGhvdXRBc208L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfEl0YW5pdW0iPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPkl0YW5pdW08L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXx4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJHbG9iYWxzIj4NCisgICAgPFByb2plY3RHdWlkPntBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9PC9Qcm9qZWN0R3VpZD4NCisgICAgPFJvb3ROYW1lc3BhY2U+dGVzdHpsaWI8L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxLZXl3b3JkPldpbjMyUHJvajwvS2V5d29yZD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxfUHJvamVjdEZpbGVWZXJzaW9uPjEwLjAuMzAxMjguMTwvX1Byb2plY3RGaWxlVmVyc2lvbj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+eDg2XFRlc3RabGliJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+eDg2XFRlc3RabGliJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIj54ODZcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIj54ODZcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyI+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPng4NlxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+eDg2XFRlc3RabGliJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj54NjRcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+eDY0XFRlc3RabGliJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+aWE2NFxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+aWE2NFxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIj54NjRcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218eDY0JyI+eDY0XFRlc3RabGliJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218eDY0JyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtJyI+aWE2NFxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtJyI+aWE2NFxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj54NjRcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj54NjRcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+aWE2NFxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5pYTY0XFRlc3RabGliJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiAvPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5BU01WO0FTTUlORjtXSU4zMjtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlck91dHB1dD5Bc3NlbWJseUFuZFNvdXJjZUNvZGU8L0Fzc2VtYmxlck91dHB1dD4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+RWRpdEFuZENvbnRpbnVlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+Li5cLi5cbWFzbXg4NlxtYXRjaDY4Ni5vYmo7Li5cLi5cbWFzbXg4NlxpbmZmYXMzMi5vYmo7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil0ZXN0emxpYi5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFByb2dyYW1EYXRhYmFzZUZpbGU+JChPdXREaXIpdGVzdHpsaWIucGRiPC9Qcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxSYW5kb21pemVkQmFzZUFkZHJlc3M+ZmFsc2U8L1JhbmRvbWl6ZWRCYXNlQWRkcmVzcz4NCisgICAgICA8RGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPC9EYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDg2PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5Pbmx5RXhwbGljaXRJbmxpbmU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz50cnVlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXRlc3R6bGliLmV4ZTwvT3V0cHV0RmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4NCisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPg0KKyAgICAgIDxSYW5kb21pemVkQmFzZUFkZHJlc3M+ZmFsc2U8L1JhbmRvbWl6ZWRCYXNlQWRkcmVzcz4NCisgICAgICA8RGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPC9EYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDg2PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPk9ubHlFeHBsaWNpdElubGluZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkFTTVY7QVNNSU5GO1dJTjMyO1pMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+Li5cLi5cbWFzbXg4NlxtYXRjaDY4Ni5vYmo7Li5cLi5cbWFzbXg4NlxpbmZmYXMzMi5vYmo7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil0ZXN0emxpYi5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+DQorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4NCisgICAgICA8UmFuZG9taXplZEJhc2VBZGRyZXNzPmZhbHNlPC9SYW5kb21pemVkQmFzZUFkZHJlc3M+DQorICAgICAgPERhdGFFeGVjdXRpb25QcmV2ZW50aW9uPg0KKyAgICAgIDwvRGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5BU01WO0FTTUlORjtXSU4zMjtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+Li5cLi5cbWFzbXg2NFxndm1hdDY0Lm9iajsuLlwuLlxtYXNteDY0XGluZmZhc3g2NC5vYmo7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5JdGFuaXVtPC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5aTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1Z0RMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlck91dHB1dD5Bc3NlbWJseUFuZFNvdXJjZUNvZGU8L0Fzc2VtYmxlck91dHB1dD4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpdGVzdHpsaWIuZXhlPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxQcm9ncmFtRGF0YWJhc2VGaWxlPiQoT3V0RGlyKXRlc3R6bGliLnBkYjwvUHJvZ3JhbURhdGFiYXNlRmlsZT4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lSUE2NDwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPiUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+SXRhbml1bTwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPk9ubHlFeHBsaWNpdElubGluZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPlpMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWRETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpdGVzdHpsaWIuZXhlPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPg0KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZUlBNjQ8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5BU01WO0FTTUlORjtXSU4zMjtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPi4uXC4uXG1hc214NjRcZ3ZtYXQ2NC5vYmo7Li5cLi5cbWFzbXg2NFxpbmZmYXN4NjQub2JqOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5JdGFuaXVtPC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+WkxJQl9XSU5BUEk7TkRFQlVHO19DT05TT0xFO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil0ZXN0emxpYi5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+DQorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lSUE2NDwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxhZGxlcjMyLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cY29tcHJlc3MuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxjcmMzMi5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGRlZmxhdGUuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZiYWNrLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbWFzbXg2NFxpbmZmYXM4NjY0LmMiPg0KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4NCisgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPg0KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4NCisgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPg0KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPg0KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mZmFzdC5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZmxhdGUuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZ0cmVlcy5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHRlc3R6bGliXHRlc3R6bGliLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cdHJlZXMuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlx1bmNvbXByLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cenV0aWwuYyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMC90ZXN0emxpYi52Y3hwcm9qLmZpbHRlcnMgYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMC90ZXN0emxpYi52Y3hwcm9qLmZpbHRlcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ5ZGFhOAotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzEwL3Rlc3R6bGliLnZjeHByb2ouZmlsdGVycwpAQCAtMCwwICsxLDU4IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iU291cmNlIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57YzFmNmEyZTMtNWRhNS00OTU1LTg2NTMtMzEwZDNlZmUwNWE5fTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5jcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc208L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IkhlYWRlciBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2MyYWFmZmRjLTJjOTUtNGQ2Zi04NDY2LTRiZWM1ODkwYWYyY308L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgICAgPEV4dGVuc2lvbnM+aDtocHA7aHh4O2htO2lubDtpbmM8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlJlc291cmNlIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57YzI3NGZlMDctMDVmMi00NjFjLTk2NGItZjYzNDFlNGU3ZWI1fTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5yYztpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGU8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGFkbGVyMzIuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cY29tcHJlc3MuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cY3JjMzIuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cZGVmbGF0ZS5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZiYWNrLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXG1hc214NjRcaW5mZmFzODY2NC5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZmYXN0LmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZmxhdGUuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mdHJlZXMuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdGVzdHpsaWJcdGVzdHpsaWIuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cdHJlZXMuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cdW5jb21wci5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlx6dXRpbC5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbUdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMC90ZXN0emxpYmRsbC52Y3hwcm9qIGIvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjMTAvdGVzdHpsaWJkbGwudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2IwOGZmCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjMTAvdGVzdHpsaWJkbGwudmN4cHJvagpAQCAtMCwwICsxLDMxMCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xJdGFuaXVtIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+SXRhbml1bTwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfEl0YW5pdW0iPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPkl0YW5pdW08L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXx4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJHbG9iYWxzIj4NCisgICAgPFByb2plY3RHdWlkPntDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9PC9Qcm9qZWN0R3VpZD4NCisgICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAuRGVmYXVsdC5wcm9wcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPF9Qcm9qZWN0RmlsZVZlcnNpb24+MTAuMC4zMDEyOC4xPC9fUHJvamVjdEZpbGVWZXJzaW9uPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj54ODZcVGVzdFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj54ODZcVGVzdFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+dHJ1ZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+eDg2XFRlc3RabGliRGxsJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj54ODZcVGVzdFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPng2NFxUZXN0WmxpYkRsbCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj54NjRcVGVzdFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj5pYTY0XFRlc3RabGliRGxsJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj5pYTY0XFRlc3RabGliRGxsJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+dHJ1ZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+eDY0XFRlc3RabGliRGxsJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+eDY0XFRlc3RabGliRGxsJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPmlhNjRcVGVzdFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+aWE2NFxUZXN0WmxpYkRsbCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgLz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWluaXppcDslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+RWRpdEFuZENvbnRpbnVlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+eDg2XFpsaWJEbGxEZWJ1Z1x6bGlid2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil0ZXN0emxpYmRsbC5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFByb2dyYW1EYXRhYmFzZUZpbGU+JChPdXREaXIpdGVzdHpsaWIucGRiPC9Qcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxSYW5kb21pemVkQmFzZUFkZHJlc3M+ZmFsc2U8L1JhbmRvbWl6ZWRCYXNlQWRkcmVzcz4NCisgICAgICA8RGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPC9EYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDg2PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPk9ubHlFeHBsaWNpdElubGluZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1pbml6aXA7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7TkRFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPng4NlxabGliRGxsUmVsZWFzZVx6bGlid2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil0ZXN0emxpYmRsbC5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+DQorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4NCisgICAgICA8UmFuZG9taXplZEJhc2VBZGRyZXNzPmZhbHNlPC9SYW5kb21pemVkQmFzZUFkZHJlc3M+DQorICAgICAgPERhdGFFeGVjdXRpb25QcmV2ZW50aW9uPg0KKyAgICAgIDwvRGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWluaXppcDslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+eDY0XFpsaWJEbGxEZWJ1Z1x6bGlid2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil0ZXN0emxpYmRsbC5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFByb2dyYW1EYXRhYmFzZUZpbGU+JChPdXREaXIpdGVzdHpsaWIucGRiPC9Qcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYNjQ8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+SXRhbml1bTwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWluaXppcDslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+aWE2NFxabGliRGxsRGVidWdcemxpYndhcGkubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpdGVzdHpsaWJkbGwuZXhlPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxQcm9ncmFtRGF0YWJhc2VGaWxlPiQoT3V0RGlyKXRlc3R6bGliLnBkYjwvUHJvZ3JhbURhdGFiYXNlRmlsZT4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lSUE2NDwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+WDY0PC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWluaXppcDslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWRETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+eDY0XFpsaWJEbGxSZWxlYXNlXHpsaWJ3YXBpLmxpYjslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXRlc3R6bGliZGxsLmV4ZTwvT3V0cHV0RmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4NCisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYNjQ8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5JdGFuaXVtPC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWluaXppcDslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWRETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+aWE2NFxabGliRGxsUmVsZWFzZVx6bGlid2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil0ZXN0emxpYmRsbC5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+DQorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lSUE2NDwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx0ZXN0emxpYlx0ZXN0emxpYi5jIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSJ6bGlidmMudmN4cHJvaiI+DQorICAgICAgPFByb2plY3Q+ezhmZDgyNmY4LTM3MzktNDRlNi04Y2M4LTk5NzEyMmU1M2I4ZH08L1Byb2plY3Q+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMC90ZXN0emxpYmRsbC52Y3hwcm9qLmZpbHRlcnMgYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMC90ZXN0emxpYmRsbC52Y3hwcm9qLmZpbHRlcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNhODY5MwotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzEwL3Rlc3R6bGliZGxsLnZjeHByb2ouZmlsdGVycwpAQCAtMCwwICsxLDIyIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iU291cmNlIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57ZmE2MWE4OWYtOTNmYy00Yzg5LWIyOWUtMzYyMjRiNzU5MmY0fTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5jcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc208L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IkhlYWRlciBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2Q0Yjg1ZGEwLTJiYTItNDkzNC1iNTdmLWUyNTg0ZTM4NDhlZX08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgICAgPEV4dGVuc2lvbnM+aDtocHA7aHh4O2htO2lubDtpbmM8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlJlc291cmNlIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57ZTU3M2UwNzUtMDBiZC00YTdkLWJkNjctYThjYzliZmM1YWNhfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5yYztpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGU8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHRlc3R6bGliXHRlc3R6bGliLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtR3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzEwL3psaWIucmMgYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMC96bGliLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZjY0NzYKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMC96bGliLnJjCkBAIC0wLDAgKzEsMzIgQEAKKyNpbmNsdWRlIDx3aW5kb3dzLmg+DQorDQorI2RlZmluZSBJRFJfVkVSU0lPTjEgIDENCitJRFJfVkVSU0lPTjEJVkVSU0lPTklORk8JTU9WRUFCTEUgSU1QVVJFIExPQURPTkNBTEwgRElTQ0FSREFCTEUNCisgIEZJTEVWRVJTSU9OCSAxLDIsOCwwDQorICBQUk9EVUNUVkVSU0lPTiAxLDIsOCwwDQorICBGSUxFRkxBR1NNQVNLCVZTX0ZGSV9GSUxFRkxBR1NNQVNLDQorICBGSUxFRkxBR1MJMA0KKyAgRklMRU9TCVZPU19ET1NfV0lORE9XUzMyDQorICBGSUxFVFlQRQlWRlRfRExMDQorICBGSUxFU1VCVFlQRQkwCS8vIG5vdCB1c2VkDQorQkVHSU4NCisgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyINCisgIEJFR0lODQorICAgIEJMT0NLICIwNDA5MDRFNCINCisgICAgLy9sYW5ndWFnZSBJRCA9IFUuUy4gRW5nbGlzaCwgY2hhciBzZXQgPSBXaW5kb3dzLCBNdWx0aWxpbmd1YWwNCisNCisgICAgQkVHSU4NCisgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgInpsaWIgZGF0YSBjb21wcmVzc2lvbiBhbmQgWklQIGZpbGUgSS9PIGxpYnJhcnlcMCINCisgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLAkiMS4yLjhcMCINCisgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwJInpsaWJcMCINCisgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsCSJ6bGlid2FwaS5kbGxcMCINCisgICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLAkiWkxpYi5ETExcMCINCisgICAgICBWQUxVRSAiQ29tbWVudHMiLCJETEwgc3VwcG9ydCBieSBBbGVzc2FuZHJvIElhY29wZXR0aSAmIEdpbGxlcyBWb2xsYW50XDAiDQorICAgICAgVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgIihDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSAmIE1hcmsgQWRsZXJcMCINCisgICAgRU5EDQorICBFTkQNCisgIEJMT0NLICJWYXJGaWxlSW5mbyINCisgIEJFR0lODQorICAgIFZBTFVFICJUcmFuc2xhdGlvbiIsIDB4MDQwOSwgMTI1Mg0KKyAgRU5EDQorRU5EDQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjMTAvemxpYnN0YXQudmN4cHJvaiBiL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzEwL3psaWJzdGF0LnZjeHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmMmJiZQotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzEwL3psaWJzdGF0LnZjeHByb2oKQEAgLTAsMCArMSw0NzMgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8SXRhbml1bSI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPkl0YW5pdW08L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3x4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZVdpdGhvdXRBc208L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPkl0YW5pdW08L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZVdpdGhvdXRBc218V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2VXaXRob3V0QXNtPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlV2l0aG91dEFzbXx4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2VXaXRob3V0QXNtPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxJdGFuaXVtIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5JdGFuaXVtPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8eDY0Ij4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+DQorICAgIDxQcm9qZWN0R3VpZD57NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fTwvUHJvamVjdEd1aWQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAucHJvcHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8X1Byb2plY3RGaWxlVmVyc2lvbj4xMC4wLjMwMTI4LjE8L19Qcm9qZWN0RmlsZVZlcnNpb24+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPng4NlxabGliU3RhdCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPng4NlxabGliU3RhdCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPng4NlxabGliU3RhdCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+eDg2XFpsaWJTdGF0JChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciPng4NlxabGliU3RhdCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciPng4NlxabGliU3RhdCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+eDY0XFpsaWJTdGF0JChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPng2NFxabGliU3RhdCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPmlhNjRcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPmlhNjRcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+eDY0XFpsaWJTdGF0JChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+eDY0XFpsaWJTdGF0JChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5pYTY0XFpsaWJTdGF0JChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPmlhNjRcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciPng2NFxabGliU3RhdCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIj54NjRcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj5pYTY0XFpsaWJTdGF0JChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj5pYTY0XFpsaWJTdGF0JChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIC8+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1hc214ODY7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7WkxJQl9XSU5BUEk7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPiQoSW50RGlyKXpsaWJzdGF0LnBjaDwvUHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPE9iamVjdEZpbGVOYW1lPiQoSW50RGlyKTwvT2JqZWN0RmlsZU5hbWU+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKTwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5PbGRTdHlsZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxSZXNvdXJjZUNvbXBpbGU+DQorICAgICAgPEN1bHR1cmU+MHgwNDBjPC9DdWx0dXJlPg0KKyAgICA8L1Jlc291cmNlQ29tcGlsZT4NCisgICAgPExpYj4NCisgICAgICA8QWRkaXRpb25hbE9wdGlvbnM+L01BQ0hJTkU6WDg2IC9OT0RFRkFVTFRMSUIgJShBZGRpdGlvbmFsT3B0aW9ucyk8L0FkZGl0aW9uYWxPcHRpb25zPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXpsaWJzdGF0LmxpYjwvT3V0cHV0RmlsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgPC9MaWI+DQorICAgIDxQcmVCdWlsZEV2ZW50Pg0KKyAgICAgIDxDb21tYW5kPmNkIC4uXC4uXG1hc214ODYNCitibGRfbWwzMi5iYXQ8L0NvbW1hbmQ+DQorICAgIDwvUHJlQnVpbGRFdmVudD4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5Pbmx5RXhwbGljaXRJbmxpbmU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1hc214ODY7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7WkxJQl9XSU5BUEk7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO0FTTVY7QVNNSU5GOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4kKEludERpcil6bGlic3RhdC5wY2g8L1ByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxPYmplY3RGaWxlTmFtZT4kKEludERpcik8L09iamVjdEZpbGVOYW1lPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcik8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8UmVzb3VyY2VDb21waWxlPg0KKyAgICAgIDxDdWx0dXJlPjB4MDQwYzwvQ3VsdHVyZT4NCisgICAgPC9SZXNvdXJjZUNvbXBpbGU+DQorICAgIDxMaWI+DQorICAgICAgPEFkZGl0aW9uYWxPcHRpb25zPi9NQUNISU5FOlg4NiAvTk9ERUZBVUxUTElCICUoQWRkaXRpb25hbE9wdGlvbnMpPC9BZGRpdGlvbmFsT3B0aW9ucz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz4uLlwuLlxtYXNteDg2XG1hdGNoNjg2Lm9iajsuLlwuLlxtYXNteDg2XGluZmZhczMyLm9iajslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXpsaWJzdGF0LmxpYjwvT3V0cHV0RmlsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgPC9MaWI+DQorICAgIDxQcmVCdWlsZEV2ZW50Pg0KKyAgICAgIDxDb21tYW5kPmNkIC4uXC4uXG1hc214ODYNCitibGRfbWwzMi5iYXQ8L0NvbW1hbmQ+DQorICAgIDwvUHJlQnVpbGRFdmVudD4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtYXNteDg2OyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO1pMSUJfV0lOQVBJO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+JChJbnREaXIpemxpYnN0YXQucGNoPC9QcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8T2JqZWN0RmlsZU5hbWU+JChJbnREaXIpPC9PYmplY3RGaWxlTmFtZT4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPFJlc291cmNlQ29tcGlsZT4NCisgICAgICA8Q3VsdHVyZT4weDA0MGM8L0N1bHR1cmU+DQorICAgIDwvUmVzb3VyY2VDb21waWxlPg0KKyAgICA8TGliPg0KKyAgICAgIDxBZGRpdGlvbmFsT3B0aW9ucz4vTUFDSElORTpYODYgL05PREVGQVVMVExJQiAlKEFkZGl0aW9uYWxPcHRpb25zKTwvQWRkaXRpb25hbE9wdGlvbnM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpemxpYnN0YXQubGliPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICA8L0xpYj4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5YNjQ8L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1hc214ODY7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+WkxJQl9XSU5BUEk7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPiQoSW50RGlyKXpsaWJzdGF0LnBjaDwvUHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPE9iamVjdEZpbGVOYW1lPiQoSW50RGlyKTwvT2JqZWN0RmlsZU5hbWU+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKTwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5PbGRTdHlsZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxSZXNvdXJjZUNvbXBpbGU+DQorICAgICAgPEN1bHR1cmU+MHgwNDBjPC9DdWx0dXJlPg0KKyAgICA8L1Jlc291cmNlQ29tcGlsZT4NCisgICAgPExpYj4NCisgICAgICA8QWRkaXRpb25hbE9wdGlvbnM+L01BQ0hJTkU6QU1ENjQgL05PREVGQVVMVExJQiAlKEFkZGl0aW9uYWxPcHRpb25zKTwvQWRkaXRpb25hbE9wdGlvbnM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpemxpYnN0YXQubGliPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICA8L0xpYj4NCisgICAgPFByZUJ1aWxkRXZlbnQ+DQorICAgICAgPENvbW1hbmQ+Y2QgLi5cLi5cbWFzbXg2NA0KK2JsZF9tbDY0LmJhdDwvQ29tbWFuZD4NCisgICAgPC9QcmVCdWlsZEV2ZW50Pg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5JdGFuaXVtPC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtYXNteDg2OyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPlpMSUJfV0lOQVBJO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1Z0RMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4kKEludERpcil6bGlic3RhdC5wY2g8L1ByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxPYmplY3RGaWxlTmFtZT4kKEludERpcik8L09iamVjdEZpbGVOYW1lPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcik8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+T2xkU3R5bGU8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8UmVzb3VyY2VDb21waWxlPg0KKyAgICAgIDxDdWx0dXJlPjB4MDQwYzwvQ3VsdHVyZT4NCisgICAgPC9SZXNvdXJjZUNvbXBpbGU+DQorICAgIDxMaWI+DQorICAgICAgPEFkZGl0aW9uYWxPcHRpb25zPi9NQUNISU5FOklBNjQgL05PREVGQVVMVExJQiAlKEFkZGl0aW9uYWxPcHRpb25zKTwvQWRkaXRpb25hbE9wdGlvbnM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpemxpYnN0YXQubGliPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICA8L0xpYj4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtYXNteDg2OyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPlpMSUJfV0lOQVBJO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztBU01WO0FTTUlORjtXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+JChJbnREaXIpemxpYnN0YXQucGNoPC9QcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8T2JqZWN0RmlsZU5hbWU+JChJbnREaXIpPC9PYmplY3RGaWxlTmFtZT4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPFJlc291cmNlQ29tcGlsZT4NCisgICAgICA8Q3VsdHVyZT4weDA0MGM8L0N1bHR1cmU+DQorICAgIDwvUmVzb3VyY2VDb21waWxlPg0KKyAgICA8TGliPg0KKyAgICAgIDxBZGRpdGlvbmFsT3B0aW9ucz4vTUFDSElORTpBTUQ2NCAvTk9ERUZBVUxUTElCICUoQWRkaXRpb25hbE9wdGlvbnMpPC9BZGRpdGlvbmFsT3B0aW9ucz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz4uLlwuLlxtYXNteDY0XGd2bWF0NjQub2JqOy4uXC4uXG1hc214NjRcaW5mZmFzeDY0Lm9iajslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXpsaWJzdGF0LmxpYjwvT3V0cHV0RmlsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgPC9MaWI+DQorICAgIDxQcmVCdWlsZEV2ZW50Pg0KKyAgICAgIDxDb21tYW5kPmNkIC4uXC4uXG1hc214NjQNCitibGRfbWw2NC5iYXQ8L0NvbW1hbmQ+DQorICAgIDwvUHJlQnVpbGRFdmVudD4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5JdGFuaXVtPC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5Pbmx5RXhwbGljaXRJbmxpbmU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1hc214ODY7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+WkxJQl9XSU5BUEk7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4kKEludERpcil6bGlic3RhdC5wY2g8L1ByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxPYmplY3RGaWxlTmFtZT4kKEludERpcik8L09iamVjdEZpbGVOYW1lPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcik8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8UmVzb3VyY2VDb21waWxlPg0KKyAgICAgIDxDdWx0dXJlPjB4MDQwYzwvQ3VsdHVyZT4NCisgICAgPC9SZXNvdXJjZUNvbXBpbGU+DQorICAgIDxMaWI+DQorICAgICAgPEFkZGl0aW9uYWxPcHRpb25zPi9NQUNISU5FOklBNjQgL05PREVGQVVMVExJQiAlKEFkZGl0aW9uYWxPcHRpb25zKTwvQWRkaXRpb25hbE9wdGlvbnM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpemxpYnN0YXQubGliPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICA8L0xpYj4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218eDY0JyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5YNjQ8L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPk9ubHlFeHBsaWNpdElubGluZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWFzbXg4NjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5aTElCX1dJTkFQSTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWRETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPiQoSW50RGlyKXpsaWJzdGF0LnBjaDwvUHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPE9iamVjdEZpbGVOYW1lPiQoSW50RGlyKTwvT2JqZWN0RmlsZU5hbWU+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKTwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxSZXNvdXJjZUNvbXBpbGU+DQorICAgICAgPEN1bHR1cmU+MHgwNDBjPC9DdWx0dXJlPg0KKyAgICA8L1Jlc291cmNlQ29tcGlsZT4NCisgICAgPExpYj4NCisgICAgICA8QWRkaXRpb25hbE9wdGlvbnM+L01BQ0hJTkU6QU1ENjQgL05PREVGQVVMVExJQiAlKEFkZGl0aW9uYWxPcHRpb25zKTwvQWRkaXRpb25hbE9wdGlvbnM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpemxpYnN0YXQubGliPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICA8L0xpYj4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+SXRhbml1bTwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtYXNteDg2OyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPlpMSUJfV0lOQVBJO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+JChJbnREaXIpemxpYnN0YXQucGNoPC9QcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8T2JqZWN0RmlsZU5hbWU+JChJbnREaXIpPC9PYmplY3RGaWxlTmFtZT4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPFJlc291cmNlQ29tcGlsZT4NCisgICAgICA8Q3VsdHVyZT4weDA0MGM8L0N1bHR1cmU+DQorICAgIDwvUmVzb3VyY2VDb21waWxlPg0KKyAgICA8TGliPg0KKyAgICAgIDxBZGRpdGlvbmFsT3B0aW9ucz4vTUFDSElORTpJQTY0IC9OT0RFRkFVTFRMSUIgJShBZGRpdGlvbmFsT3B0aW9ucyk8L0FkZGl0aW9uYWxPcHRpb25zPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXpsaWJzdGF0LmxpYjwvT3V0cHV0RmlsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgPC9MaWI+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGFkbGVyMzIuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxjb21wcmVzcy5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGNyYzMyLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cZGVmbGF0ZS5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGd6Y2xvc2UuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxnemxpYi5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGd6cmVhZC5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGd6d3JpdGUuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZiYWNrLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbWFzbXg2NFxpbmZmYXM4NjY0LmMiPg0KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4NCisgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPg0KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4NCisgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPg0KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPg0KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mZmFzdC5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZmxhdGUuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZ0cmVlcy5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXG1pbml6aXBcaW9hcGkuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlx0cmVlcy5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHVuY29tcHIuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxtaW5pemlwXHVuemlwLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbWluaXppcFx6aXAuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlx6dXRpbC5jIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVzb3VyY2VDb21waWxlIEluY2x1ZGU9InpsaWIucmMiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxOb25lIEluY2x1ZGU9InpsaWJ2Yy5kZWYiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPg0KKyAgPC9JbXBvcnRHcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjMTAvemxpYnN0YXQudmN4cHJvai5maWx0ZXJzIGIvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjMTAvemxpYnN0YXQudmN4cHJvai5maWx0ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YzdmN2UKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMC96bGlic3RhdC52Y3hwcm9qLmZpbHRlcnMKQEAgLTAsMCArMSw3NyBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlNvdXJjZSBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezE3NDIxM2Y2LTdmNjYtNGFlOC1hM2E4LWExZTBhMWU2ZmZkZH08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgIDwvRmlsdGVyPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGFkbGVyMzIuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cY29tcHJlc3MuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cY3JjMzIuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cZGVmbGF0ZS5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxnemNsb3NlLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGd6bGliLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGd6cmVhZC5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxnendyaXRlLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZmJhY2suYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbWFzbXg2NFxpbmZmYXM4NjY0LmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZmZhc3QuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mbGF0ZS5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZ0cmVlcy5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxtaW5pemlwXGlvYXBpLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHRyZWVzLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHVuY29tcHIuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbWluaXppcFx1bnppcC5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxtaW5pemlwXHppcC5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlx6dXRpbC5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlc291cmNlQ29tcGlsZSBJbmNsdWRlPSJ6bGliLnJjIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L1Jlc291cmNlQ29tcGlsZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPE5vbmUgSW5jbHVkZT0iemxpYnZjLmRlZiI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9Ob25lPg0KKyAgPC9JdGVtR3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzEwL3psaWJ2Yy5kZWYgYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMC96bGlidmMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNjcwNDYKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMC96bGlidmMuZGVmCkBAIC0wLDAgKzEsMTQzIEBACitMSUJSQVJZDQorOyB6bGliIGRhdGEgY29tcHJlc3Npb24gYW5kIFpJUCBmaWxlIEkvTyBsaWJyYXJ5DQorDQorVkVSU0lPTgkJMS4yLjgNCisNCitFWFBPUlRTDQorICAgICAgICBhZGxlcjMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxDQorICAgICAgICBjb21wcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyDQorICAgICAgICBjcmMzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAzDQorICAgICAgICBkZWZsYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA0DQorICAgICAgICBkZWZsYXRlQ29weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA1DQorICAgICAgICBkZWZsYXRlRW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA2DQorICAgICAgICBkZWZsYXRlSW5pdDJfICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA3DQorICAgICAgICBkZWZsYXRlSW5pdF8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA4DQorICAgICAgICBkZWZsYXRlUGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA5DQorICAgICAgICBkZWZsYXRlUmVzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxMA0KKyAgICAgICAgZGVmbGF0ZVNldERpY3Rpb25hcnkgICAgICAgICAgICAgICAgICAgICBAMTENCisgICAgICAgIGd6Y2xvc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEyDQorICAgICAgICBnemRvcGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxMw0KKyAgICAgICAgZ3plcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTQNCisgICAgICAgIGd6Zmx1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE1DQorICAgICAgICBnem9wZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNg0KKyAgICAgICAgZ3pyZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTcNCisgICAgICAgIGd6d3JpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE4DQorICAgICAgICBpbmZsYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxOQ0KKyAgICAgICAgaW5mbGF0ZUVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjANCisgICAgICAgIGluZmxhdGVJbml0Ml8gICAgICAgICAgICAgICAgICAgICAgICAgICAgQDIxDQorICAgICAgICBpbmZsYXRlSW5pdF8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyMg0KKyAgICAgICAgaW5mbGF0ZVJlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjMNCisgICAgICAgIGluZmxhdGVTZXREaWN0aW9uYXJ5ICAgICAgICAgICAgICAgICAgICAgQDI0DQorICAgICAgICBpbmZsYXRlU3luYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyNQ0KKyAgICAgICAgdW5jb21wcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjYNCisgICAgICAgIHpsaWJWZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDI3DQorICAgICAgICBnenByaW50ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyOA0KKyAgICAgICAgZ3pwdXRjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjkNCisgICAgICAgIGd6Z2V0YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDMwDQorICAgICAgICBnenNlZWsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAzMQ0KKyAgICAgICAgZ3pyZXdpbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzINCisgICAgICAgIGd6dGVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDMzDQorICAgICAgICBnemVvZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAzNA0KKyAgICAgICAgZ3pzZXRwYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzUNCisgICAgICAgIHpFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDM2DQorICAgICAgICBpbmZsYXRlU3luY1BvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIEAzNw0KKyAgICAgICAgZ2V0X2NyY190YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzgNCisgICAgICAgIGNvbXByZXNzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDM5DQorICAgICAgICBnenB1dHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA0MA0KKyAgICAgICAgZ3pnZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANDENCisgICAgICAgIGluZmxhdGVDb3B5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQyDQorICAgICAgICBpbmZsYXRlQmFja0luaXRfICAgICAgICAgICAgICAgICAgICAgICAgIEA0Mw0KKyAgICAgICAgaW5mbGF0ZUJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANDQNCisgICAgICAgIGluZmxhdGVCYWNrRW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQ1DQorICAgICAgICBjb21wcmVzc0JvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA0Ng0KKyAgICAgICAgZGVmbGF0ZUJvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANDcNCisgICAgICAgIGd6Y2xlYXJlcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQ4DQorICAgICAgICBnenVuZ2V0YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA0OQ0KKyAgICAgICAgemxpYkNvbXBpbGVGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICBANTANCisgICAgICAgIGRlZmxhdGVQcmltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDUxDQorICAgICAgICBkZWZsYXRlUGVuZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgIEA1Mg0KKw0KKyAgICAgICAgdW56T3BlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANjENCisgICAgICAgIHVuekNsb3NlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDYyDQorICAgICAgICB1bnpHZXRHbG9iYWxJbmZvICAgICAgICAgICAgICAgICAgICAgICAgIEA2Mw0KKyAgICAgICAgdW56R2V0Q3VycmVudEZpbGVJbmZvICAgICAgICAgICAgICAgICAgICBANjQNCisgICAgICAgIHVuekdvVG9GaXJzdEZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgQDY1DQorICAgICAgICB1bnpHb1RvTmV4dEZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgIEA2Ng0KKyAgICAgICAgdW56T3BlbkN1cnJlbnRGaWxlICAgICAgICAgICAgICAgICAgICAgICBANjcNCisgICAgICAgIHVuelJlYWRDdXJyZW50RmlsZSAgICAgICAgICAgICAgICAgICAgICAgQDY4DQorICAgICAgICB1bnpPcGVuQ3VycmVudEZpbGUzICAgICAgICAgICAgICAgICAgICAgIEA2OQ0KKyAgICAgICAgdW56dGVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANzANCisgICAgICAgIHVuemVvZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDcxDQorICAgICAgICB1bnpDbG9zZUN1cnJlbnRGaWxlICAgICAgICAgICAgICAgICAgICAgIEA3Mg0KKyAgICAgICAgdW56R2V0R2xvYmFsQ29tbWVudCAgICAgICAgICAgICAgICAgICAgICBANzMNCisgICAgICAgIHVuelN0cmluZ0ZpbGVOYW1lQ29tcGFyZSAgICAgICAgICAgICAgICAgQDc0DQorICAgICAgICB1bnpMb2NhdGVGaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA3NQ0KKyAgICAgICAgdW56R2V0TG9jYWxFeHRyYWZpZWxkICAgICAgICAgICAgICAgICAgICBANzYNCisgICAgICAgIHVuek9wZW4yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDc3DQorICAgICAgICB1bnpPcGVuQ3VycmVudEZpbGUyICAgICAgICAgICAgICAgICAgICAgIEA3OA0KKyAgICAgICAgdW56T3BlbkN1cnJlbnRGaWxlUGFzc3dvcmQgICAgICAgICAgICAgICBANzkNCisNCisgICAgICAgIHppcE9wZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDgwDQorICAgICAgICB6aXBPcGVuTmV3RmlsZUluWmlwICAgICAgICAgICAgICAgICAgICAgIEA4MQ0KKyAgICAgICAgemlwV3JpdGVJbkZpbGVJblppcCAgICAgICAgICAgICAgICAgICAgICBAODINCisgICAgICAgIHppcENsb3NlRmlsZUluWmlwICAgICAgICAgICAgICAgICAgICAgICAgQDgzDQorICAgICAgICB6aXBDbG9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA4NA0KKyAgICAgICAgemlwT3Blbk5ld0ZpbGVJblppcDIgICAgICAgICAgICAgICAgICAgICBAODYNCisgICAgICAgIHppcENsb3NlRmlsZUluWmlwUmF3ICAgICAgICAgICAgICAgICAgICAgQDg3DQorICAgICAgICB6aXBPcGVuMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA4OA0KKyAgICAgICAgemlwT3Blbk5ld0ZpbGVJblppcDMgICAgICAgICAgICAgICAgICAgICBAODkNCisNCisgICAgICAgIHVuekdldEZpbGVQb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEwMA0KKyAgICAgICAgdW56R29Ub0ZpbGVQb3MgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTAxDQorDQorICAgICAgICBmaWxsX3dpbjMyX2ZpbGVmdW5jICAgICAgICAgICAgICAgICAgICAgIEAxMTANCisNCis7IHpsaWJ3YXBpIHYxLjIuNCBhZGRlZDoNCisgICAgICAgIGZpbGxfd2luMzJfZmlsZWZ1bmM2NCAgICAgICAgICAgICAgICAgICBAMTExDQorICAgICAgICBmaWxsX3dpbjMyX2ZpbGVmdW5jNjRBICAgICAgICAgICAgICAgICAgQDExMg0KKyAgICAgICAgZmlsbF93aW4zMl9maWxlZnVuYzY0VyAgICAgICAgICAgICAgICAgIEAxMTMNCisNCisgICAgICAgIHVuek9wZW42NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTIwDQorICAgICAgICB1bnpPcGVuMl82NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEyMQ0KKyAgICAgICAgdW56R2V0R2xvYmFsSW5mbzY0ICAgICAgICAgICAgICAgICAgICAgIEAxMjINCisgICAgICAgIHVuekdldEN1cnJlbnRGaWxlSW5mbzY0ICAgICAgICAgICAgICAgICBAMTI0DQorICAgICAgICB1bnpHZXRDdXJyZW50RmlsZVpTdHJlYW1Qb3M2NCAgICAgICAgICAgQDEyNQ0KKyAgICAgICAgdW56dGVsbDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxMjYNCisgICAgICAgIHVuekdldEZpbGVQb3M2NCAgICAgICAgICAgICAgICAgICAgICAgICBAMTI3DQorICAgICAgICB1bnpHb1RvRmlsZVBvczY0ICAgICAgICAgICAgICAgICAgICAgICAgQDEyOA0KKw0KKyAgICAgICAgemlwT3BlbjY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxMzANCisgICAgICAgIHppcE9wZW4yXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTMxDQorICAgICAgICB6aXBPcGVuTmV3RmlsZUluWmlwNjQgICAgICAgICAgICAgICAgICAgQDEzMg0KKyAgICAgICAgemlwT3Blbk5ld0ZpbGVJblppcDJfNjQgICAgICAgICAgICAgICAgIEAxMzMNCisgICAgICAgIHppcE9wZW5OZXdGaWxlSW5aaXAzXzY0ICAgICAgICAgICAgICAgICBAMTM0DQorICAgICAgICB6aXBPcGVuTmV3RmlsZUluWmlwNF82NCAgICAgICAgICAgICAgICAgQDEzNQ0KKyAgICAgICAgemlwQ2xvc2VGaWxlSW5aaXBSYXc2NCAgICAgICAgICAgICAgICAgIEAxMzYNCisNCis7IHpsaWIxIHYxLjIuNCBhZGRlZDoNCisgICAgICAgIGFkbGVyMzJfY29tYmluZSAgICAgICAgICAgICAgICAgICAgICAgICBAMTQwDQorICAgICAgICBjcmMzMl9jb21iaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE0Mg0KKyAgICAgICAgZGVmbGF0ZVNldEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIEAxNDQNCisgICAgICAgIGRlZmxhdGVUdW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTQ1DQorICAgICAgICBnemJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE0Ng0KKyAgICAgICAgZ3pjbG9zZV9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNDcNCisgICAgICAgIGd6Y2xvc2VfdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTQ4DQorICAgICAgICBnemRpcmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE0OQ0KKyAgICAgICAgZ3pvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNTANCisgICAgICAgIGluZmxhdGVHZXRIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICBAMTU2DQorICAgICAgICBpbmZsYXRlTWFyayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE1Nw0KKyAgICAgICAgaW5mbGF0ZVByaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNTgNCisgICAgICAgIGluZmxhdGVSZXNldDIgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTU5DQorICAgICAgICBpbmZsYXRlVW5kZXJtaW5lICAgICAgICAgICAgICAgICAgICAgICAgQDE2MA0KKw0KKzsgemxpYjEgdjEuMi42IGFkZGVkOg0KKyAgICAgICAgZ3pnZXRjXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNjENCisgICAgICAgIGluZmxhdGVSZXNldEtlZXAgICAgICAgICAgICAgICAgICAgICAgICBAMTYzDQorICAgICAgICBkZWZsYXRlUmVzZXRLZWVwICAgICAgICAgICAgICAgICAgICAgICAgQDE2NA0KKw0KKzsgemxpYjEgdjEuMi43IGFkZGVkOg0KKyAgICAgICAgZ3pvcGVuX3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNjUNCisNCis7IHpsaWIxIHYxLjIuOCBhZGRlZDoNCisgICAgICAgIGluZmxhdGVHZXREaWN0aW9uYXJ5ICAgICAgICAgICAgICAgICAgICBAMTY2DQorICAgICAgICBnenZwcmludGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE2Nw0KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzEwL3psaWJ2Yy5zbG4gYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMC96bGlidmMuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNmZmZDUKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMC96bGlidmMuc2xuCkBAIC0wLDAgKzEsMTM1IEBACivvu78NCitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMS4wMA0KKyMgVmlzdWFsIFN0dWRpbyAyMDEwDQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJ6bGlidmMiLCAiemxpYnZjLnZjeHByb2oiLCAiezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiemxpYnN0YXQiLCAiemxpYnN0YXQudmN4cHJvaiIsICJ7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJ0ZXN0emxpYiIsICJ0ZXN0emxpYi52Y3hwcm9qIiwgIntBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInRlc3R6bGliZGxsIiwgInRlc3R6bGliZGxsLnZjeHByb2oiLCAie0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAibWluaXppcCIsICJtaW5pemlwLnZjeHByb2oiLCAiezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAibWluaXVueiIsICJtaW5pdW56LnZjeHByb2oiLCAie0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0iDQorRW5kUHJvamVjdA0KK0dsb2JhbA0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbg0KKwkJRGVidWd8SXRhbml1bSA9IERlYnVnfEl0YW5pdW0NCisJCURlYnVnfFdpbjMyID0gRGVidWd8V2luMzINCisJCURlYnVnfHg2NCA9IERlYnVnfHg2NA0KKwkJUmVsZWFzZXxJdGFuaXVtID0gUmVsZWFzZXxJdGFuaXVtDQorCQlSZWxlYXNlfFdpbjMyID0gUmVsZWFzZXxXaW4zMg0KKwkJUmVsZWFzZXx4NjQgPSBSZWxlYXNlfHg2NA0KKwkJUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSA9IFJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0NCisJCVJlbGVhc2VXaXRob3V0QXNtfFdpbjMyID0gUmVsZWFzZVdpdGhvdXRBc218V2luMzINCisJCVJlbGVhc2VXaXRob3V0QXNtfHg2NCA9IFJlbGVhc2VXaXRob3V0QXNtfHg2NA0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uDQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5EZWJ1Z3xJdGFuaXVtLkFjdGl2ZUNmZyA9IERlYnVnfEl0YW5pdW0NCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LkRlYnVnfEl0YW5pdW0uQnVpbGQuMCA9IERlYnVnfEl0YW5pdW0NCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQNCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8eDY0DQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5SZWxlYXNlfEl0YW5pdW0uQWN0aXZlQ2ZnID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5SZWxlYXNlfEl0YW5pdW0uQnVpbGQuMCA9IFJlbGVhc2V8SXRhbml1bQ0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0DQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5SZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtLkFjdGl2ZUNmZyA9IFJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0NCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0uQnVpbGQuMCA9IFJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0NCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2VXaXRob3V0QXNtfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2VXaXRob3V0QXNtfFdpbjMyDQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5SZWxlYXNlV2l0aG91dEFzbXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZVdpdGhvdXRBc218V2luMzINCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2VXaXRob3V0QXNtfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlV2l0aG91dEFzbXx4NjQNCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2VXaXRob3V0QXNtfHg2NC5CdWlsZC4wID0gUmVsZWFzZVdpdGhvdXRBc218eDY0DQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5EZWJ1Z3xJdGFuaXVtLkFjdGl2ZUNmZyA9IERlYnVnfEl0YW5pdW0NCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LkRlYnVnfEl0YW5pdW0uQnVpbGQuMCA9IERlYnVnfEl0YW5pdW0NCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQNCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8eDY0DQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5SZWxlYXNlfEl0YW5pdW0uQWN0aXZlQ2ZnID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5SZWxlYXNlfEl0YW5pdW0uQnVpbGQuMCA9IFJlbGVhc2V8SXRhbml1bQ0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0DQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5SZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtLkFjdGl2ZUNmZyA9IFJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0NCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0uQnVpbGQuMCA9IFJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0NCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LlJlbGVhc2VXaXRob3V0QXNtfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2VXaXRob3V0QXNtfFdpbjMyDQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5SZWxlYXNlV2l0aG91dEFzbXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZVdpdGhvdXRBc218V2luMzINCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LlJlbGVhc2VXaXRob3V0QXNtfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlV2l0aG91dEFzbXx4NjQNCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LlJlbGVhc2VXaXRob3V0QXNtfHg2NC5CdWlsZC4wID0gUmVsZWFzZVdpdGhvdXRBc218eDY0DQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5EZWJ1Z3xJdGFuaXVtLkFjdGl2ZUNmZyA9IERlYnVnfEl0YW5pdW0NCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LkRlYnVnfEl0YW5pdW0uQnVpbGQuMCA9IERlYnVnfEl0YW5pdW0NCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQNCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8eDY0DQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlfEl0YW5pdW0uQWN0aXZlQ2ZnID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlfEl0YW5pdW0uQnVpbGQuMCA9IFJlbGVhc2V8SXRhbml1bQ0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0DQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtLkFjdGl2ZUNmZyA9IFJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0NCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0uQnVpbGQuMCA9IFJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0NCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2VXaXRob3V0QXNtfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2VXaXRob3V0QXNtfFdpbjMyDQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlV2l0aG91dEFzbXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZVdpdGhvdXRBc218V2luMzINCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2VXaXRob3V0QXNtfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlV2l0aG91dEFzbXx4NjQNCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2VXaXRob3V0QXNtfHg2NC5CdWlsZC4wID0gUmVsZWFzZVdpdGhvdXRBc218eDY0DQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5EZWJ1Z3xJdGFuaXVtLkFjdGl2ZUNmZyA9IERlYnVnfEl0YW5pdW0NCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LkRlYnVnfEl0YW5pdW0uQnVpbGQuMCA9IERlYnVnfEl0YW5pdW0NCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQNCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8eDY0DQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5SZWxlYXNlfEl0YW5pdW0uQWN0aXZlQ2ZnID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5SZWxlYXNlfEl0YW5pdW0uQnVpbGQuMCA9IFJlbGVhc2V8SXRhbml1bQ0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0DQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5SZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtLkFjdGl2ZUNmZyA9IFJlbGVhc2V8SXRhbml1bQ0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bS5CdWlsZC4wID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5SZWxlYXNlV2l0aG91dEFzbXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5SZWxlYXNlV2l0aG91dEFzbXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LkRlYnVnfEl0YW5pdW0uQWN0aXZlQ2ZnID0gRGVidWd8SXRhbml1bQ0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWd8SXRhbml1bS5CdWlsZC4wID0gRGVidWd8SXRhbml1bQ0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2V8SXRhbml1bS5BY3RpdmVDZmcgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2V8SXRhbml1bS5CdWlsZC4wID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQNCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0uQWN0aXZlQ2ZnID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtLkJ1aWxkLjAgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2VXaXRob3V0QXNtfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2VXaXRob3V0QXNtfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uRGVidWd8SXRhbml1bS5BY3RpdmVDZmcgPSBEZWJ1Z3xJdGFuaXVtDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5EZWJ1Z3xJdGFuaXVtLkJ1aWxkLjAgPSBEZWJ1Z3xJdGFuaXVtDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8eDY0DQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NA0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uUmVsZWFzZXxJdGFuaXVtLkFjdGl2ZUNmZyA9IFJlbGVhc2V8SXRhbml1bQ0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uUmVsZWFzZXxJdGFuaXVtLkJ1aWxkLjAgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NA0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bS5BY3RpdmVDZmcgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0uQnVpbGQuMCA9IFJlbGVhc2V8SXRhbml1bQ0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uUmVsZWFzZVdpdGhvdXRBc218V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uUmVsZWFzZVdpdGhvdXRBc218eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24NCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQ0KKwlFbmRHbG9iYWxTZWN0aW9uDQorRW5kR2xvYmFsDQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjMTAvemxpYnZjLnZjeHByb2ogYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMC96bGlidmMudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmY5ZGRiCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjMTAvemxpYnZjLnZjeHByb2oKQEAgLTAsMCArMSw2NTcgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8SXRhbml1bSI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPkl0YW5pdW08L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3x4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZVdpdGhvdXRBc208L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPkl0YW5pdW08L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZVdpdGhvdXRBc218V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2VXaXRob3V0QXNtPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlV2l0aG91dEFzbXx4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2VXaXRob3V0QXNtPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxJdGFuaXVtIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5JdGFuaXVtPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8eDY0Ij4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+DQorICAgIDxQcm9qZWN0R3VpZD57OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfTwvUHJvamVjdEd1aWQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+RHluYW1pY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5EeW5hbWljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkR5bmFtaWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+RHluYW1pY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkR5bmFtaWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5EeW5hbWljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+RHluYW1pY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+RHluYW1pY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+RHluYW1pY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAucHJvcHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8X1Byb2plY3RGaWxlVmVyc2lvbj4xMC4wLjMwMTI4LjE8L19Qcm9qZWN0RmlsZVZlcnNpb24+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPng4NlxabGliRGxsJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+eDg2XFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+dHJ1ZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciPng4NlxabGliRGxsJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyI+eDg2XFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyI+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPng4NlxabGliRGxsJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj54ODZcWmxpYkRsbCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+eDY0XFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+eDY0XFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj5pYTY0XFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPmlhNjRcWmxpYkRsbCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIj54NjRcWmxpYkRsbCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIj54NjRcWmxpYkRsbCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218eDY0JyI+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj5pYTY0XFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciPmlhNjRcWmxpYkRsbCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj54NjRcWmxpYkRsbCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPng2NFxabGliRGxsJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPmlhNjRcWmxpYkRsbCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5pYTY0XFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIC8+DQorICAgIDxUYXJnZXROYW1lIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj56bGlid2FwaWQ8L1RhcmdldE5hbWU+DQorICAgIDxUYXJnZXROYW1lIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIj56bGlid2FwaTwvVGFyZ2V0TmFtZT4NCisgICAgPFRhcmdldE5hbWUgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+emxpYndhcGk8L1RhcmdldE5hbWU+DQorICAgIDxUYXJnZXROYW1lIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+emxpYndhcGlkPC9UYXJnZXROYW1lPg0KKyAgICA8VGFyZ2V0TmFtZSBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciPnpsaWJ3YXBpPC9UYXJnZXROYW1lPg0KKyAgICA8VGFyZ2V0TmFtZSBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+emxpYndhcGk8L1RhcmdldE5hbWU+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fREVCVUc7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxNa1R5cExpYkNvbXBhdGlibGU+dHJ1ZTwvTWtUeXBMaWJDb21wYXRpYmxlPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5XaW4zMjwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgICAgPFR5cGVMaWJyYXJ5TmFtZT4kKE91dERpcil6bGlidmMudGxiPC9UeXBlTGlicmFyeU5hbWU+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWFzbXg4NjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7WkxJQl9XSU5BUEk7QVNNVjtBU01JTkY7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWc8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+JChJbnREaXIpemxpYnZjLnBjaDwvUHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPE9iamVjdEZpbGVOYW1lPiQoSW50RGlyKTwvT2JqZWN0RmlsZU5hbWU+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKTwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDwvQnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5FZGl0QW5kQ29udGludWU8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8UmVzb3VyY2VDb21waWxlPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fREVCVUc7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxDdWx0dXJlPjB4MDQwYzwvQ3VsdHVyZT4NCisgICAgPC9SZXNvdXJjZUNvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsT3B0aW9ucz4vTUFDSElORTpJMzg2ICUoQWRkaXRpb25hbE9wdGlvbnMpPC9BZGRpdGlvbmFsT3B0aW9ucz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz4uLlwuLlxtYXNteDg2XG1hdGNoNjg2Lm9iajsuLlwuLlxtYXNteDg2XGluZmZhczMyLm9iajslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICAgIDxNb2R1bGVEZWZpbml0aW9uRmlsZT4uXHpsaWJ2Yy5kZWY8L01vZHVsZURlZmluaXRpb25GaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxHZW5lcmF0ZU1hcEZpbGU+dHJ1ZTwvR2VuZXJhdGVNYXBGaWxlPg0KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPg0KKyAgICAgIDxSYW5kb21pemVkQmFzZUFkZHJlc3M+ZmFsc2U8L1JhbmRvbWl6ZWRCYXNlQWRkcmVzcz4NCisgICAgICA8RGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPC9EYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgPC9MaW5rPg0KKyAgICA8UHJlQnVpbGRFdmVudD4NCisgICAgICA8Q29tbWFuZD5jZCAuLlwuLlxtYXNteDg2DQorYmxkX21sMzIuYmF0PC9Db21tYW5kPg0KKyAgICA8L1ByZUJ1aWxkRXZlbnQ+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5OREVCVUc7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxNa1R5cExpYkNvbXBhdGlibGU+dHJ1ZTwvTWtUeXBMaWJDb21wYXRpYmxlPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5XaW4zMjwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgICAgPFR5cGVMaWJyYXJ5TmFtZT4kKE91dERpcil6bGlidmMudGxiPC9UeXBlTGlicmFyeU5hbWU+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtYXNteDg2OyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztaTElCX1dJTkFQSTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+JChJbnREaXIpemxpYnZjLnBjaDwvUHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPg0KKyAgICAgIDxBc3NlbWJsZXJPdXRwdXQ+QWxsPC9Bc3NlbWJsZXJPdXRwdXQ+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8T2JqZWN0RmlsZU5hbWU+JChJbnREaXIpPC9PYmplY3RGaWxlTmFtZT4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPC9Ccm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPFJlc291cmNlQ29tcGlsZT4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+TkRFQlVHOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8Q3VsdHVyZT4weDA0MGM8L0N1bHR1cmU+DQorICAgIDwvUmVzb3VyY2VDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbE9wdGlvbnM+L01BQ0hJTkU6STM4NiAlKEFkZGl0aW9uYWxPcHRpb25zKTwvQWRkaXRpb25hbE9wdGlvbnM+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPElnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM+ZmFsc2U8L0lnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM+DQorICAgICAgPE1vZHVsZURlZmluaXRpb25GaWxlPi5cemxpYnZjLmRlZjwvTW9kdWxlRGVmaW5pdGlvbkZpbGU+DQorICAgICAgPEdlbmVyYXRlTWFwRmlsZT50cnVlPC9HZW5lcmF0ZU1hcEZpbGU+DQorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+DQorICAgICAgPFJhbmRvbWl6ZWRCYXNlQWRkcmVzcz5mYWxzZTwvUmFuZG9taXplZEJhc2VBZGRyZXNzPg0KKyAgICAgIDxEYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8L0RhdGFFeGVjdXRpb25QcmV2ZW50aW9uPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4NCisgICAgPE1pZGw+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPk5ERUJVRzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1rVHlwTGliQ29tcGF0aWJsZT50cnVlPC9Na1R5cExpYkNvbXBhdGlibGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50PldpbjMyPC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgICA8VHlwZUxpYnJhcnlOYW1lPiQoT3V0RGlyKXpsaWJ2Yy50bGI8L1R5cGVMaWJyYXJ5TmFtZT4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5Pbmx5RXhwbGljaXRJbmxpbmU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1hc214ODY7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1pMSUJfV0lOQVBJO0FTTVY7QVNNSU5GOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4kKEludERpcil6bGlidmMucGNoPC9QcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+DQorICAgICAgPEFzc2VtYmxlck91dHB1dD5BbGw8L0Fzc2VtYmxlck91dHB1dD4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxPYmplY3RGaWxlTmFtZT4kKEludERpcik8L09iamVjdEZpbGVOYW1lPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcik8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8L0Jyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8UmVzb3VyY2VDb21waWxlPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5OREVCVUc7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxDdWx0dXJlPjB4MDQwYzwvQ3VsdHVyZT4NCisgICAgPC9SZXNvdXJjZUNvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsT3B0aW9ucz4vTUFDSElORTpJMzg2ICUoQWRkaXRpb25hbE9wdGlvbnMpPC9BZGRpdGlvbmFsT3B0aW9ucz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz4uLlwuLlxtYXNteDg2XG1hdGNoNjg2Lm9iajsuLlwuLlxtYXNteDg2XGluZmZhczMyLm9iajslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICAgIDxJZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPmZhbHNlPC9JZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPg0KKyAgICAgIDxNb2R1bGVEZWZpbml0aW9uRmlsZT4uXHpsaWJ2Yy5kZWY8L01vZHVsZURlZmluaXRpb25GaWxlPg0KKyAgICAgIDxHZW5lcmF0ZU1hcEZpbGU+dHJ1ZTwvR2VuZXJhdGVNYXBGaWxlPg0KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPg0KKyAgICAgIDxSYW5kb21pemVkQmFzZUFkZHJlc3M+ZmFsc2U8L1JhbmRvbWl6ZWRCYXNlQWRkcmVzcz4NCisgICAgICA8RGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPC9EYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgPC9MaW5rPg0KKyAgICA8UHJlQnVpbGRFdmVudD4NCisgICAgICA8Q29tbWFuZD5jZCAuLlwuLlxtYXNteDg2DQorYmxkX21sMzIuYmF0PC9Db21tYW5kPg0KKyAgICA8L1ByZUJ1aWxkRXZlbnQ+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPg0KKyAgICA8TWlkbD4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0RFQlVHOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWtUeXBMaWJDb21wYXRpYmxlPnRydWU8L01rVHlwTGliQ29tcGF0aWJsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+WDY0PC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgICA8VHlwZUxpYnJhcnlOYW1lPiQoT3V0RGlyKXpsaWJ2Yy50bGI8L1R5cGVMaWJyYXJ5TmFtZT4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtYXNteDg2OyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztaTElCX1dJTkFQSTtBU01WO0FTTUlORjtXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1Z0RMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4kKEludERpcil6bGlidmMucGNoPC9QcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8T2JqZWN0RmlsZU5hbWU+JChJbnREaXIpPC9PYmplY3RGaWxlTmFtZT4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPC9Ccm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxSZXNvdXJjZUNvbXBpbGU+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9ERUJVRzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEN1bHR1cmU+MHgwNDBjPC9DdWx0dXJlPg0KKyAgICA8L1Jlc291cmNlQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+Li5cLi5cbWFzbXg2NFxndm1hdDY0Lm9iajsuLlwuLlxtYXNteDY0XGluZmZhc3g2NC5vYmo7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgICA8TW9kdWxlRGVmaW5pdGlvbkZpbGU+Llx6bGlidmMuZGVmPC9Nb2R1bGVEZWZpbml0aW9uRmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8R2VuZXJhdGVNYXBGaWxlPnRydWU8L0dlbmVyYXRlTWFwRmlsZT4NCisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDY0PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICAgIDxQcmVCdWlsZEV2ZW50Pg0KKyAgICAgIDxDb21tYW5kPmNkIC4uXC4uXG1hc214NjQNCitibGRfbWw2NC5iYXQ8L0NvbW1hbmQ+DQorICAgIDwvUHJlQnVpbGRFdmVudD4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPg0KKyAgICA8TWlkbD4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0RFQlVHOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWtUeXBMaWJDb21wYXRpYmxlPnRydWU8L01rVHlwTGliQ29tcGF0aWJsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+SXRhbml1bTwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgICAgPFR5cGVMaWJyYXJ5TmFtZT4kKE91dERpcil6bGlidmMudGxiPC9UeXBlTGlicmFyeU5hbWU+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWFzbXg4NjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7WkxJQl9XSU5BUEk7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWdETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+JChJbnREaXIpemxpYnZjLnBjaDwvUHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPE9iamVjdEZpbGVOYW1lPiQoSW50RGlyKTwvT2JqZWN0RmlsZU5hbWU+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKTwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDwvQnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8UmVzb3VyY2VDb21waWxlPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fREVCVUc7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxDdWx0dXJlPjB4MDQwYzwvQ3VsdHVyZT4NCisgICAgPC9SZXNvdXJjZUNvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXpsaWJ3YXBpLmRsbDwvT3V0cHV0RmlsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgICA8TW9kdWxlRGVmaW5pdGlvbkZpbGU+Llx6bGlidmMuZGVmPC9Nb2R1bGVEZWZpbml0aW9uRmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8UHJvZ3JhbURhdGFiYXNlRmlsZT4kKE91dERpcil6bGlid2FwaS5wZGI8L1Byb2dyYW1EYXRhYmFzZUZpbGU+DQorICAgICAgPEdlbmVyYXRlTWFwRmlsZT50cnVlPC9HZW5lcmF0ZU1hcEZpbGU+DQorICAgICAgPE1hcEZpbGVOYW1lPiQoT3V0RGlyKXpsaWJ3YXBpLm1hcDwvTWFwRmlsZU5hbWU+DQorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+DQorICAgICAgPEltcG9ydExpYnJhcnk+JChPdXREaXIpemxpYndhcGkubGliPC9JbXBvcnRMaWJyYXJ5Pg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVJQTY0PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciPg0KKyAgICA8TWlkbD4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+TkRFQlVHOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWtUeXBMaWJDb21wYXRpYmxlPnRydWU8L01rVHlwTGliQ29tcGF0aWJsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+WDY0PC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgICA8VHlwZUxpYnJhcnlOYW1lPiQoT3V0RGlyKXpsaWJ2Yy50bGI8L1R5cGVMaWJyYXJ5TmFtZT4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5Pbmx5RXhwbGljaXRJbmxpbmU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1hc214ODY7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1pMSUJfV0lOQVBJO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4kKEludERpcil6bGlidmMucGNoPC9QcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+DQorICAgICAgPEFzc2VtYmxlck91dHB1dD5BbGw8L0Fzc2VtYmxlck91dHB1dD4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxPYmplY3RGaWxlTmFtZT4kKEludERpcik8L09iamVjdEZpbGVOYW1lPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcik8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8L0Jyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8UmVzb3VyY2VDb21waWxlPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5OREVCVUc7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxDdWx0dXJlPjB4MDQwYzwvQ3VsdHVyZT4NCisgICAgPC9SZXNvdXJjZUNvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICAgIDxJZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPmZhbHNlPC9JZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPg0KKyAgICAgIDxNb2R1bGVEZWZpbml0aW9uRmlsZT4uXHpsaWJ2Yy5kZWY8L01vZHVsZURlZmluaXRpb25GaWxlPg0KKyAgICAgIDxHZW5lcmF0ZU1hcEZpbGU+dHJ1ZTwvR2VuZXJhdGVNYXBGaWxlPg0KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYNjQ8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciPg0KKyAgICA8TWlkbD4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+TkRFQlVHOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWtUeXBMaWJDb21wYXRpYmxlPnRydWU8L01rVHlwTGliQ29tcGF0aWJsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+SXRhbml1bTwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgICAgPFR5cGVMaWJyYXJ5TmFtZT4kKE91dERpcil6bGlidmMudGxiPC9UeXBlTGlicmFyeU5hbWU+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtYXNteDg2OyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztaTElCX1dJTkFQSTtXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+JChJbnREaXIpemxpYnZjLnBjaDwvUHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPg0KKyAgICAgIDxBc3NlbWJsZXJPdXRwdXQ+QWxsPC9Bc3NlbWJsZXJPdXRwdXQ+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8T2JqZWN0RmlsZU5hbWU+JChJbnREaXIpPC9PYmplY3RGaWxlTmFtZT4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPC9Ccm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPFJlc291cmNlQ29tcGlsZT4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+TkRFQlVHOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8Q3VsdHVyZT4weDA0MGM8L0N1bHR1cmU+DQorICAgIDwvUmVzb3VyY2VDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil6bGlid2FwaS5kbGw8L091dHB1dEZpbGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPElnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM+ZmFsc2U8L0lnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM+DQorICAgICAgPE1vZHVsZURlZmluaXRpb25GaWxlPi5cemxpYnZjLmRlZjwvTW9kdWxlRGVmaW5pdGlvbkZpbGU+DQorICAgICAgPFByb2dyYW1EYXRhYmFzZUZpbGU+JChPdXREaXIpemxpYndhcGkucGRiPC9Qcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZU1hcEZpbGU+dHJ1ZTwvR2VuZXJhdGVNYXBGaWxlPg0KKyAgICAgIDxNYXBGaWxlTmFtZT4kKE91dERpcil6bGlid2FwaS5tYXA8L01hcEZpbGVOYW1lPg0KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPg0KKyAgICAgIDxJbXBvcnRMaWJyYXJ5PiQoT3V0RGlyKXpsaWJ3YXBpLmxpYjwvSW1wb3J0TGlicmFyeT4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lSUE2NDwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPg0KKyAgICA8TWlkbD4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+TkRFQlVHOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWtUeXBMaWJDb21wYXRpYmxlPnRydWU8L01rVHlwTGliQ29tcGF0aWJsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+WDY0PC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgICA8VHlwZUxpYnJhcnlOYW1lPiQoT3V0RGlyKXpsaWJ2Yy50bGI8L1R5cGVMaWJyYXJ5TmFtZT4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5Pbmx5RXhwbGljaXRJbmxpbmU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1hc214ODY7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1pMSUJfV0lOQVBJO0FTTVY7QVNNSU5GO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4kKEludERpcil6bGlidmMucGNoPC9QcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+DQorICAgICAgPEFzc2VtYmxlck91dHB1dD5BbGw8L0Fzc2VtYmxlck91dHB1dD4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxPYmplY3RGaWxlTmFtZT4kKEludERpcik8L09iamVjdEZpbGVOYW1lPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcik8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8L0Jyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8UmVzb3VyY2VDb21waWxlPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5OREVCVUc7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxDdWx0dXJlPjB4MDQwYzwvQ3VsdHVyZT4NCisgICAgPC9SZXNvdXJjZUNvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPi4uXC4uXG1hc214NjRcZ3ZtYXQ2NC5vYmo7Li5cLi5cbWFzbXg2NFxpbmZmYXN4NjQub2JqOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPElnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM+ZmFsc2U8L0lnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM+DQorICAgICAgPE1vZHVsZURlZmluaXRpb25GaWxlPi5cemxpYnZjLmRlZjwvTW9kdWxlRGVmaW5pdGlvbkZpbGU+DQorICAgICAgPEdlbmVyYXRlTWFwRmlsZT50cnVlPC9HZW5lcmF0ZU1hcEZpbGU+DQorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg2NDwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgICA8UHJlQnVpbGRFdmVudD4NCisgICAgICA8Q29tbWFuZD5jZCAuLlwuLlxtYXNteDY0DQorYmxkX21sNjQuYmF0PC9Db21tYW5kPg0KKyAgICA8L1ByZUJ1aWxkRXZlbnQ+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPg0KKyAgICA8TWlkbD4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+TkRFQlVHOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWtUeXBMaWJDb21wYXRpYmxlPnRydWU8L01rVHlwTGliQ29tcGF0aWJsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+SXRhbml1bTwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgICAgPFR5cGVMaWJyYXJ5TmFtZT4kKE91dERpcil6bGlidmMudGxiPC9UeXBlTGlicmFyeU5hbWU+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtYXNteDg2OyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztaTElCX1dJTkFQSTtXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+JChJbnREaXIpemxpYnZjLnBjaDwvUHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPg0KKyAgICAgIDxBc3NlbWJsZXJPdXRwdXQ+QWxsPC9Bc3NlbWJsZXJPdXRwdXQ+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8T2JqZWN0RmlsZU5hbWU+JChJbnREaXIpPC9PYmplY3RGaWxlTmFtZT4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPC9Ccm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPFJlc291cmNlQ29tcGlsZT4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+TkRFQlVHOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8Q3VsdHVyZT4weDA0MGM8L0N1bHR1cmU+DQorICAgIDwvUmVzb3VyY2VDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil6bGlid2FwaS5kbGw8L091dHB1dEZpbGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPElnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM+ZmFsc2U8L0lnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM+DQorICAgICAgPE1vZHVsZURlZmluaXRpb25GaWxlPi5cemxpYnZjLmRlZjwvTW9kdWxlRGVmaW5pdGlvbkZpbGU+DQorICAgICAgPFByb2dyYW1EYXRhYmFzZUZpbGU+JChPdXREaXIpemxpYndhcGkucGRiPC9Qcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZU1hcEZpbGU+dHJ1ZTwvR2VuZXJhdGVNYXBGaWxlPg0KKyAgICAgIDxNYXBGaWxlTmFtZT4kKE91dERpcil6bGlid2FwaS5tYXA8L01hcEZpbGVOYW1lPg0KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPg0KKyAgICAgIDxJbXBvcnRMaWJyYXJ5PiQoT3V0RGlyKXpsaWJ3YXBpLmxpYjwvSW1wb3J0TGlicmFyeT4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lSUE2NDwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxhZGxlcjMyLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cY29tcHJlc3MuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxjcmMzMi5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGRlZmxhdGUuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxnemNsb3NlLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cZ3psaWIuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxnenJlYWQuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxnendyaXRlLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mYmFjay5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXG1hc214NjRcaW5mZmFzODY2NC5jIj4NCisgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+DQorICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4NCisgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtJyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+DQorICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4NCisgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4NCisgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZmZhc3QuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZsYXRlLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mdHJlZXMuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxtaW5pemlwXGlvYXBpLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbWluaXppcFxpb3dpbjMyLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cdHJlZXMuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlx1bmNvbXByLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbWluaXppcFx1bnppcC5jIj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+WkxJQl9JTlRFUk5BTDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+WkxJQl9JTlRFUk5BTDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5aTElCX0lOVEVSTkFMOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbWluaXppcFx6aXAuYyI+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPlpMSUJfSU5URVJOQUw7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPlpMSUJfSU5URVJOQUw7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+WkxJQl9JTlRFUk5BTDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHp1dGlsLmMiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZXNvdXJjZUNvbXBpbGUgSW5jbHVkZT0iemxpYi5yYyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPE5vbmUgSW5jbHVkZT0iemxpYnZjLmRlZiIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlwuLlxkZWZsYXRlLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mYmxvY2suaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZjb2Rlcy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZmZhc3QuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZ0cmVlcy5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZnV0aWwuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlwuLlx6Y29uZi5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXHpsaWIuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlwuLlx6dXRpbC5oIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25UYXJnZXRzIj4NCisgIDwvSW1wb3J0R3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzEwL3psaWJ2Yy52Y3hwcm9qLmZpbHRlcnMgYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMC96bGlidmMudmN4cHJvai5maWx0ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MGI3MWMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMC96bGlidmMudmN4cHJvai5maWx0ZXJzCkBAIC0wLDAgKzEsMTE4IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iU291cmNlIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57MDc5MzRhODUtOGI2MS00NDNkLWEwZWUtYjJlZWRiNzRmM2NkfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5jcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2hwajtiYXQ7Zm9yO2Y5MDwvRXh0ZW5zaW9ucz4NCisgICAgPC9GaWx0ZXI+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iSGVhZGVyIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57MWQ5OTY3NWItNDMzZC00YTIxLTllNTAtZWQ0YWI4YjE5NzYyfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5oO2hwcDtoeHg7aG07aW5sO2ZpO2ZkPC9FeHRlbnNpb25zPg0KKyAgICA8L0ZpbHRlcj4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJSZXNvdXJjZSBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezQzMWMwOTU4LWZhNzEtNDRkMC05MDg0LTJkMTlkMTAwYzBjY308L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgICAgPEV4dGVuc2lvbnM+aWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO2NudDtydGY7Z2lmO2pwZztqcGVnO2pwZTwvRXh0ZW5zaW9ucz4NCisgICAgPC9GaWx0ZXI+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cYWRsZXIzMi5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxjb21wcmVzcy5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxjcmMzMi5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxkZWZsYXRlLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGd6Y2xvc2UuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cZ3psaWIuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cZ3pyZWFkLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGd6d3JpdGUuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mYmFjay5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxtYXNteDY0XGluZmZhczg2NjQuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mZmFzdC5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZsYXRlLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZnRyZWVzLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXG1pbml6aXBcaW9hcGkuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbWluaXppcFxpb3dpbjMyLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHRyZWVzLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHVuY29tcHIuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbWluaXppcFx1bnppcC5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxtaW5pemlwXHppcC5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlx6dXRpbC5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlc291cmNlQ29tcGlsZSBJbmNsdWRlPSJ6bGliLnJjIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L1Jlc291cmNlQ29tcGlsZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPE5vbmUgSW5jbHVkZT0iemxpYnZjLmRlZiI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9Ob25lPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXGRlZmxhdGUuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mYmxvY2suaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mY29kZXMuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mZmFzdC5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZ0cmVlcy5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZ1dGlsLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXHpjb25mLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXHpsaWIuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cLi5cenV0aWwuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICA8L0l0ZW1Hcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjMTEvbWluaXVuei52Y3hwcm9qIGIvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjMTEvbWluaXVuei52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOWYyMGIKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMS9taW5pdW56LnZjeHByb2oKQEAgLTAsMCArMSwzMTQgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8SXRhbml1bSI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPkl0YW5pdW08L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3x4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxJdGFuaXVtIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5JdGFuaXVtPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8eDY0Ij4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+DQorICAgIDxQcm9qZWN0R3VpZD57QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfTwvUHJvamVjdEd1aWQ+DQorICAgIDxLZXl3b3JkPldpbjMyUHJvajwvS2V5d29yZD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djExMDwvUGxhdGZvcm1Ub29sc2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djExMDwvUGxhdGZvcm1Ub29sc2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMTA8L1BsYXRmb3JtVG9vbHNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMTA8L1BsYXRmb3JtVG9vbHNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPF9Qcm9qZWN0RmlsZVZlcnNpb24+MTAuMC4zMDEyOC4xPC9fUHJvamVjdEZpbGVWZXJzaW9uPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj54ODZcTWluaVVuemlwJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+eDg2XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj50cnVlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj54ODZcTWluaVVuemlwJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj54ODZcTWluaVVuemlwJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj54NjRcTWluaVVuemlwJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPng2NFxNaW5pVW56aXAkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj5pYTY0XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+aWE2NFxNaW5pVW56aXAkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj50cnVlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj54NjRcTWluaVVuemlwJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+eDY0XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5pYTY0XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5pYTY0XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgLz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWluaXppcDslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+eDg2XFpsaWJEbGxEZWJ1Z1x6bGlid2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpciltaW5pdW56LmV4ZTwvT3V0cHV0RmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8UHJvZ3JhbURhdGFiYXNlRmlsZT4kKE91dERpciltaW5pdW56LnBkYjwvUHJvZ3JhbURhdGFiYXNlRmlsZT4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8UmFuZG9taXplZEJhc2VBZGRyZXNzPmZhbHNlPC9SYW5kb21pemVkQmFzZUFkZHJlc3M+DQorICAgICAgPERhdGFFeGVjdXRpb25QcmV2ZW50aW9uPg0KKyAgICAgIDwvRGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5Pbmx5RXhwbGljaXRJbmxpbmU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz50cnVlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtaW5pemlwOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO1pMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz54ODZcWmxpYkRsbFJlbGVhc2VcemxpYndhcGkubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpbWluaXVuei5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+DQorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4NCisgICAgICA8UmFuZG9taXplZEJhc2VBZGRyZXNzPmZhbHNlPC9SYW5kb21pemVkQmFzZUFkZHJlc3M+DQorICAgICAgPERhdGFFeGVjdXRpb25QcmV2ZW50aW9uPg0KKyAgICAgIDwvRGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWluaXppcDslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+eDY0XFpsaWJEbGxEZWJ1Z1x6bGlid2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpciltaW5pdW56LmV4ZTwvT3V0cHV0RmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8UHJvZ3JhbURhdGFiYXNlRmlsZT4kKE91dERpciltaW5pdW56LnBkYjwvUHJvZ3JhbURhdGFiYXNlRmlsZT4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDY0PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Pkl0YW5pdW08L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1pbml6aXA7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7X0RFQlVHO19DT05TT0xFO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1Z0RMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmlhNjRcWmxpYkRsbERlYnVnXHpsaWJ3YXBpLmxpYjslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKW1pbml1bnouZXhlPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxQcm9ncmFtRGF0YWJhc2VGaWxlPiQoT3V0RGlyKW1pbml1bnoucGRiPC9Qcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVJQTY0PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5YNjQ8L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5Pbmx5RXhwbGljaXRJbmxpbmU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz50cnVlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtaW5pemlwOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO1pMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTtXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz54NjRcWmxpYkRsbFJlbGVhc2VcemxpYndhcGkubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpbWluaXVuei5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+DQorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDY0PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+SXRhbml1bTwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPk9ubHlFeHBsaWNpdElubGluZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1pbml6aXA7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7TkRFQlVHO19DT05TT0xFO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmlhNjRcWmxpYkRsbFJlbGVhc2VcemxpYndhcGkubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpbWluaXVuei5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+DQorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lSUE2NDwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxtaW5pemlwXG1pbml1bnouYyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iemxpYnZjLnZjeHByb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns4ZmQ4MjZmOC0zNzM5LTQ0ZTYtOGNjOC05OTcxMjJlNTNiOGR9PC9Qcm9qZWN0Pg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPg0KKyAgPC9JbXBvcnRHcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjMTEvbWluaXppcC52Y3hwcm9qIGIvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjMTEvbWluaXppcC52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5M2Q5ZTYKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMS9taW5pemlwLnZjeHByb2oKQEAgLTAsMCArMSwzMTEgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8SXRhbml1bSI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPkl0YW5pdW08L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3x4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxJdGFuaXVtIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5JdGFuaXVtPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8eDY0Ij4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+DQorICAgIDxQcm9qZWN0R3VpZD57NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfTwvUHJvamVjdEd1aWQ+DQorICAgIDxLZXl3b3JkPldpbjMyUHJvajwvS2V5d29yZD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djExMDwvUGxhdGZvcm1Ub29sc2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djExMDwvUGxhdGZvcm1Ub29sc2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMTA8L1BsYXRmb3JtVG9vbHNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMTA8L1BsYXRmb3JtVG9vbHNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPF9Qcm9qZWN0RmlsZVZlcnNpb24+MTAuMC4zMDEyOC4xPC9fUHJvamVjdEZpbGVWZXJzaW9uPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj54ODZcTWluaVppcCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPng4NlxNaW5pWmlwJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPng4NlxNaW5pWmlwJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj54ODZcTWluaVppcCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj54NjRcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPng2NFwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+dHJ1ZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPmlhNjRcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj5pYTY0XCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+dHJ1ZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+eDY0XCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPng2NFwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+aWE2NFwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+aWE2NFwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgLz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWluaXppcDslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+eDg2XFpsaWJEbGxEZWJ1Z1x6bGlid2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpciltaW5pemlwLmV4ZTwvT3V0cHV0RmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8UHJvZ3JhbURhdGFiYXNlRmlsZT4kKE91dERpciltaW5pemlwLnBkYjwvUHJvZ3JhbURhdGFiYXNlRmlsZT4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8UmFuZG9taXplZEJhc2VBZGRyZXNzPmZhbHNlPC9SYW5kb21pemVkQmFzZUFkZHJlc3M+DQorICAgICAgPERhdGFFeGVjdXRpb25QcmV2ZW50aW9uPg0KKyAgICAgIDwvRGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5Pbmx5RXhwbGljaXRJbmxpbmU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz50cnVlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtaW5pemlwOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO1pMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz54ODZcWmxpYkRsbFJlbGVhc2VcemxpYndhcGkubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpbWluaXppcC5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+DQorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4NCisgICAgICA8UmFuZG9taXplZEJhc2VBZGRyZXNzPmZhbHNlPC9SYW5kb21pemVkQmFzZUFkZHJlc3M+DQorICAgICAgPERhdGFFeGVjdXRpb25QcmV2ZW50aW9uPg0KKyAgICAgIDwvRGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWluaXppcDslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+eDY0XFpsaWJEbGxEZWJ1Z1x6bGlid2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpciltaW5pemlwLmV4ZTwvT3V0cHV0RmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8UHJvZ3JhbURhdGFiYXNlRmlsZT4kKE91dERpciltaW5pemlwLnBkYjwvUHJvZ3JhbURhdGFiYXNlRmlsZT4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDY0PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Pkl0YW5pdW08L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1pbml6aXA7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7X0RFQlVHO19DT05TT0xFO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1Z0RMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmlhNjRcWmxpYkRsbERlYnVnXHpsaWJ3YXBpLmxpYjslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKW1pbml6aXAuZXhlPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxQcm9ncmFtRGF0YWJhc2VGaWxlPiQoT3V0RGlyKW1pbml6aXAucGRiPC9Qcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVJQTY0PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5YNjQ8L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5Pbmx5RXhwbGljaXRJbmxpbmU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz50cnVlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtaW5pemlwOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO1pMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTtXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz54NjRcWmxpYkRsbFJlbGVhc2VcemxpYndhcGkubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpbWluaXppcC5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+DQorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDY0PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+SXRhbml1bTwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPk9ubHlFeHBsaWNpdElubGluZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1pbml6aXA7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7TkRFQlVHO19DT05TT0xFO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmlhNjRcWmxpYkRsbFJlbGVhc2VcemxpYndhcGkubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpbWluaXppcC5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+DQorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lSUE2NDwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxtaW5pemlwXG1pbml6aXAuYyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iemxpYnZjLnZjeHByb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns4ZmQ4MjZmOC0zNzM5LTQ0ZTYtOGNjOC05OTcxMjJlNTNiOGR9PC9Qcm9qZWN0Pg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPg0KKyAgPC9JbXBvcnRHcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjMTEvdGVzdHpsaWIudmN4cHJvaiBiL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzExL3Rlc3R6bGliLnZjeHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ1NTk1NAotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzExL3Rlc3R6bGliLnZjeHByb2oKQEAgLTAsMCArMSw0MjYgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8SXRhbml1bSI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPkl0YW5pdW08L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3x4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZVdpdGhvdXRBc208L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPkl0YW5pdW08L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZVdpdGhvdXRBc218V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2VXaXRob3V0QXNtPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlV2l0aG91dEFzbXx4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2VXaXRob3V0QXNtPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxJdGFuaXVtIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5JdGFuaXVtPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8eDY0Ij4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+DQorICAgIDxQcm9qZWN0R3VpZD57QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfTwvUHJvamVjdEd1aWQ+DQorICAgIDxSb290TmFtZXNwYWNlPnRlc3R6bGliPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgPFBsYXRmb3JtVG9vbHNldD52MTEwPC9QbGF0Zm9ybVRvb2xzZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgPFBsYXRmb3JtVG9vbHNldD52MTEwPC9QbGF0Zm9ybVRvb2xzZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0PlVuaWNvZGU8L0NoYXJhY3RlclNldD4NCisgICAgPFBsYXRmb3JtVG9vbHNldD52MTEwPC9QbGF0Zm9ybVRvb2xzZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djExMDwvUGxhdGZvcm1Ub29sc2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMTA8L1BsYXRmb3JtVG9vbHNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMTA8L1BsYXRmb3JtVG9vbHNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPF9Qcm9qZWN0RmlsZVZlcnNpb24+MTAuMC4zMDEyOC4xPC9fUHJvamVjdEZpbGVWZXJzaW9uPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj54ODZcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj54ODZcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+dHJ1ZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciPng4NlxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciPng4NlxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+eDg2XFRlc3RabGliJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj54ODZcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPng2NFxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj54NjRcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj5pYTY0XFRlc3RabGliJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj5pYTY0XFRlc3RabGliJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+dHJ1ZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciPng2NFxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIj54NjRcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj5pYTY0XFRlc3RabGliJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj5pYTY0XFRlc3RabGliJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtJyI+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtJyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPng2NFxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPng2NFxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5pYTY0XFRlc3RabGliJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPmlhNjRcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIC8+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkFTTVY7QVNNSU5GO1dJTjMyO1pMSUJfV0lOQVBJO19ERUJVRztfQ09OU09MRTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyT3V0cHV0PkFzc2VtYmx5QW5kU291cmNlQ29kZTwvQXNzZW1ibGVyT3V0cHV0Pg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz4uLlwuLlxtYXNteDg2XG1hdGNoNjg2Lm9iajsuLlwuLlxtYXNteDg2XGluZmZhczMyLm9iajslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXRlc3R6bGliLmV4ZTwvT3V0cHV0RmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8UHJvZ3JhbURhdGFiYXNlRmlsZT4kKE91dERpcil0ZXN0emxpYi5wZGI8L1Byb2dyYW1EYXRhYmFzZUZpbGU+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPFJhbmRvbWl6ZWRCYXNlQWRkcmVzcz5mYWxzZTwvUmFuZG9taXplZEJhc2VBZGRyZXNzPg0KKyAgICAgIDxEYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8L0RhdGFFeGVjdXRpb25QcmV2ZW50aW9uPg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYODY8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPk9ubHlFeHBsaWNpdElubGluZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO1pMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpdGVzdHpsaWIuZXhlPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPg0KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+DQorICAgICAgPFJhbmRvbWl6ZWRCYXNlQWRkcmVzcz5mYWxzZTwvUmFuZG9taXplZEJhc2VBZGRyZXNzPg0KKyAgICAgIDxEYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8L0RhdGFFeGVjdXRpb25QcmV2ZW50aW9uPg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYODY8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+QVNNVjtBU01JTkY7V0lOMzI7WkxJQl9XSU5BUEk7TkRFQlVHO19DT05TT0xFO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz4uLlwuLlxtYXNteDg2XG1hdGNoNjg2Lm9iajsuLlwuLlxtYXNteDg2XGluZmZhczMyLm9iajslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXRlc3R6bGliLmV4ZTwvT3V0cHV0RmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4NCisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPg0KKyAgICAgIDxSYW5kb21pemVkQmFzZUFkZHJlc3M+ZmFsc2U8L1JhbmRvbWl6ZWRCYXNlQWRkcmVzcz4NCisgICAgICA8RGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPC9EYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDg2PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkFTTVY7QVNNSU5GO1dJTjMyO1pMSUJfV0lOQVBJO19ERUJVRztfQ09OU09MRTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWdETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz4uLlwuLlxtYXNteDY0XGd2bWF0NjQub2JqOy4uXC4uXG1hc214NjRcaW5mZmFzeDY0Lm9iajslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Pkl0YW5pdW08L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPlpMSUJfV0lOQVBJO19ERUJVRztfQ09OU09MRTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyT3V0cHV0PkFzc2VtYmx5QW5kU291cmNlQ29kZTwvQXNzZW1ibGVyT3V0cHV0Pg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil0ZXN0emxpYi5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFByb2dyYW1EYXRhYmFzZUZpbGU+JChPdXREaXIpdGVzdHpsaWIucGRiPC9Qcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVJQTY0PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO1pMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtJyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5JdGFuaXVtPC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+WkxJQl9XSU5BUEk7TkRFQlVHO19DT05TT0xFO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil0ZXN0emxpYi5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+DQorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lSUE2NDwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkFTTVY7QVNNSU5GO1dJTjMyO1pMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+Li5cLi5cbWFzbXg2NFxndm1hdDY0Lm9iajsuLlwuLlxtYXNteDY0XGluZmZhc3g2NC5vYmo7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Pkl0YW5pdW08L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5Pbmx5RXhwbGljaXRJbmxpbmU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz50cnVlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5aTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXRlc3R6bGliLmV4ZTwvT3V0cHV0RmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4NCisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVJQTY0PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGFkbGVyMzIuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxjb21wcmVzcy5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGNyYzMyLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cZGVmbGF0ZS5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZmJhY2suYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxtYXNteDY0XGluZmZhczg2NjQuYyI+DQorICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPg0KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+DQorICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPg0KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+DQorICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+DQorICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZmYXN0LmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mbGF0ZS5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZnRyZWVzLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdGVzdHpsaWJcdGVzdHpsaWIuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlx0cmVlcy5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHVuY29tcHIuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlx6dXRpbC5jIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25UYXJnZXRzIj4NCisgIDwvSW1wb3J0R3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzExL3Rlc3R6bGliZGxsLnZjeHByb2ogYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMS90ZXN0emxpYmRsbC52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMjBjNzgKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMS90ZXN0emxpYmRsbC52Y3hwcm9qCkBAIC0wLDAgKzEsMzE0IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfEl0YW5pdW0iPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5JdGFuaXVtPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8eDY0Ij4NCisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8SXRhbml1bSI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+SXRhbml1bTwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPg0KKyAgICA8UHJvamVjdEd1aWQ+e0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX08L1Byb2plY3RHdWlkPg0KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMTA8L1BsYXRmb3JtVG9vbHNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMTA8L1BsYXRmb3JtVG9vbHNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4NCisgICAgPFBsYXRmb3JtVG9vbHNldD52MTEwPC9QbGF0Zm9ybVRvb2xzZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4NCisgICAgPFBsYXRmb3JtVG9vbHNldD52MTEwPC9QbGF0Zm9ybVRvb2xzZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxfUHJvamVjdEZpbGVWZXJzaW9uPjEwLjAuMzAxMjguMTwvX1Byb2plY3RGaWxlVmVyc2lvbj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+eDg2XFRlc3RabGliRGxsJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+eDg2XFRlc3RabGliRGxsJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPng4NlxUZXN0WmxpYkRsbCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+eDg2XFRlc3RabGliRGxsJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj54NjRcVGVzdFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+eDY0XFRlc3RabGliRGxsJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj50cnVlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+aWE2NFxUZXN0WmxpYkRsbCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+aWE2NFxUZXN0WmxpYkRsbCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPng2NFxUZXN0WmxpYkRsbCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPng2NFxUZXN0WmxpYkRsbCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5pYTY0XFRlc3RabGliRGxsJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPmlhNjRcVGVzdFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIC8+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1pbml6aXA7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7X0RFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1Z0RMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPng4NlxabGliRGxsRGVidWdcemxpYndhcGkubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpdGVzdHpsaWJkbGwuZXhlPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxQcm9ncmFtRGF0YWJhc2VGaWxlPiQoT3V0RGlyKXRlc3R6bGliLnBkYjwvUHJvZ3JhbURhdGFiYXNlRmlsZT4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8UmFuZG9taXplZEJhc2VBZGRyZXNzPmZhbHNlPC9SYW5kb21pemVkQmFzZUFkZHJlc3M+DQorICAgICAgPERhdGFFeGVjdXRpb25QcmV2ZW50aW9uPg0KKyAgICAgIDwvRGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5Pbmx5RXhwbGljaXRJbmxpbmU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz50cnVlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtaW5pemlwOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO1pMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz54ODZcWmxpYkRsbFJlbGVhc2VcemxpYndhcGkubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpdGVzdHpsaWJkbGwuZXhlPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPg0KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+DQorICAgICAgPFJhbmRvbWl6ZWRCYXNlQWRkcmVzcz5mYWxzZTwvUmFuZG9taXplZEJhc2VBZGRyZXNzPg0KKyAgICAgIDxEYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8L0RhdGFFeGVjdXRpb25QcmV2ZW50aW9uPg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYODY8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5YNjQ8L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1pbml6aXA7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7X0RFQlVHO19DT05TT0xFO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1Z0RMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPng2NFxabGliRGxsRGVidWdcemxpYndhcGkubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpdGVzdHpsaWJkbGwuZXhlPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxQcm9ncmFtRGF0YWJhc2VGaWxlPiQoT3V0RGlyKXRlc3R6bGliLnBkYjwvUHJvZ3JhbURhdGFiYXNlRmlsZT4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDY0PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Pkl0YW5pdW08L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1pbml6aXA7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7X0RFQlVHO19DT05TT0xFO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1Z0RMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmlhNjRcWmxpYkRsbERlYnVnXHpsaWJ3YXBpLmxpYjslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXRlc3R6bGliZGxsLmV4ZTwvT3V0cHV0RmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8UHJvZ3JhbURhdGFiYXNlRmlsZT4kKE91dERpcil0ZXN0emxpYi5wZGI8L1Byb2dyYW1EYXRhYmFzZUZpbGU+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZUlBNjQ8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPk9ubHlFeHBsaWNpdElubGluZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1pbml6aXA7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7TkRFQlVHO19DT05TT0xFO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPng2NFxabGliRGxsUmVsZWFzZVx6bGlid2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil0ZXN0emxpYmRsbC5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+DQorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDY0PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+SXRhbml1bTwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPk9ubHlFeHBsaWNpdElubGluZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1pbml6aXA7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7TkRFQlVHO19DT05TT0xFO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmlhNjRcWmxpYkRsbFJlbGVhc2VcemxpYndhcGkubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpdGVzdHpsaWJkbGwuZXhlPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPg0KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZUlBNjQ8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdGVzdHpsaWJcdGVzdHpsaWIuYyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iemxpYnZjLnZjeHByb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns4ZmQ4MjZmOC0zNzM5LTQ0ZTYtOGNjOC05OTcxMjJlNTNiOGR9PC9Qcm9qZWN0Pg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPg0KKyAgPC9JbXBvcnRHcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjMTEvemxpYi5yYyBiL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzExL3psaWIucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNmNjQ3NgotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzExL3psaWIucmMKQEAgLTAsMCArMSwzMiBAQAorI2luY2x1ZGUgPHdpbmRvd3MuaD4NCisNCisjZGVmaW5lIElEUl9WRVJTSU9OMSAgMQ0KK0lEUl9WRVJTSU9OMQlWRVJTSU9OSU5GTwlNT1ZFQUJMRSBJTVBVUkUgTE9BRE9OQ0FMTCBESVNDQVJEQUJMRQ0KKyAgRklMRVZFUlNJT04JIDEsMiw4LDANCisgIFBST0RVQ1RWRVJTSU9OIDEsMiw4LDANCisgIEZJTEVGTEFHU01BU0sJVlNfRkZJX0ZJTEVGTEFHU01BU0sNCisgIEZJTEVGTEFHUwkwDQorICBGSUxFT1MJVk9TX0RPU19XSU5ET1dTMzINCisgIEZJTEVUWVBFCVZGVF9ETEwNCisgIEZJTEVTVUJUWVBFCTAJLy8gbm90IHVzZWQNCitCRUdJTg0KKyAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIg0KKyAgQkVHSU4NCisgICAgQkxPQ0sgIjA0MDkwNEU0Ig0KKyAgICAvL2xhbmd1YWdlIElEID0gVS5TLiBFbmdsaXNoLCBjaGFyIHNldCA9IFdpbmRvd3MsIE11bHRpbGluZ3VhbA0KKw0KKyAgICBCRUdJTg0KKyAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAiemxpYiBkYXRhIGNvbXByZXNzaW9uIGFuZCBaSVAgZmlsZSBJL08gbGlicmFyeVwwIg0KKyAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsCSIxLjIuOFwwIg0KKyAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLAkiemxpYlwwIg0KKyAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwJInpsaWJ3YXBpLmRsbFwwIg0KKyAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsCSJaTGliLkRMTFwwIg0KKyAgICAgIFZBTFVFICJDb21tZW50cyIsIkRMTCBzdXBwb3J0IGJ5IEFsZXNzYW5kcm8gSWFjb3BldHRpICYgR2lsbGVzIFZvbGxhbnRcMCINCisgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5ICYgTWFyayBBZGxlclwwIg0KKyAgICBFTkQNCisgIEVORA0KKyAgQkxPQ0sgIlZhckZpbGVJbmZvIg0KKyAgQkVHSU4NCisgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHgwNDA5LCAxMjUyDQorICBFTkQNCitFTkQNCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMS96bGlic3RhdC52Y3hwcm9qIGIvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjMTEvemxpYnN0YXQudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDZiNzZhCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjMTEvemxpYnN0YXQudmN4cHJvagpAQCAtMCwwICsxLDQ2NCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xJdGFuaXVtIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+SXRhbml1bTwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlV2l0aG91dEFzbTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+SXRhbml1bTwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZVdpdGhvdXRBc208L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2VXaXRob3V0QXNtfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZVdpdGhvdXRBc208L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfEl0YW5pdW0iPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPkl0YW5pdW08L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXx4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJHbG9iYWxzIj4NCisgICAgPFByb2plY3RHdWlkPns3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9PC9Qcm9qZWN0R3VpZD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+DQorICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djExMDwvUGxhdGZvcm1Ub29sc2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+DQorICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djExMDwvUGxhdGZvcm1Ub29sc2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KKyAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMTA8L1BsYXRmb3JtVG9vbHNldD4NCisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+DQorICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djExMDwvUGxhdGZvcm1Ub29sc2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KKyAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMTA8L1BsYXRmb3JtVG9vbHNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+DQorICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djExMDwvUGxhdGZvcm1Ub29sc2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAucHJvcHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8X1Byb2plY3RGaWxlVmVyc2lvbj4xMC4wLjMwMTI4LjE8L19Qcm9qZWN0RmlsZVZlcnNpb24+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPng4NlxabGliU3RhdCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPng4NlxabGliU3RhdCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPng4NlxabGliU3RhdCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+eDg2XFpsaWJTdGF0JChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciPng4NlxabGliU3RhdCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciPng4NlxabGliU3RhdCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+eDY0XFpsaWJTdGF0JChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPng2NFxabGliU3RhdCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPmlhNjRcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPmlhNjRcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+eDY0XFpsaWJTdGF0JChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+eDY0XFpsaWJTdGF0JChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5pYTY0XFpsaWJTdGF0JChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPmlhNjRcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciPng2NFxabGliU3RhdCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIj54NjRcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj5pYTY0XFpsaWJTdGF0JChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj5pYTY0XFpsaWJTdGF0JChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIC8+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1hc214ODY7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7WkxJQl9XSU5BUEk7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPiQoSW50RGlyKXpsaWJzdGF0LnBjaDwvUHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPE9iamVjdEZpbGVOYW1lPiQoSW50RGlyKTwvT2JqZWN0RmlsZU5hbWU+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKTwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5PbGRTdHlsZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxSZXNvdXJjZUNvbXBpbGU+DQorICAgICAgPEN1bHR1cmU+MHgwNDBjPC9DdWx0dXJlPg0KKyAgICA8L1Jlc291cmNlQ29tcGlsZT4NCisgICAgPExpYj4NCisgICAgICA8QWRkaXRpb25hbE9wdGlvbnM+L01BQ0hJTkU6WDg2IC9OT0RFRkFVTFRMSUIgJShBZGRpdGlvbmFsT3B0aW9ucyk8L0FkZGl0aW9uYWxPcHRpb25zPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXpsaWJzdGF0LmxpYjwvT3V0cHV0RmlsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgPC9MaWI+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtYXNteDg2OyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO1pMSUJfV0lOQVBJO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztBU01WO0FTTUlORjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+JChJbnREaXIpemxpYnN0YXQucGNoPC9QcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8T2JqZWN0RmlsZU5hbWU+JChJbnREaXIpPC9PYmplY3RGaWxlTmFtZT4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPFJlc291cmNlQ29tcGlsZT4NCisgICAgICA8Q3VsdHVyZT4weDA0MGM8L0N1bHR1cmU+DQorICAgIDwvUmVzb3VyY2VDb21waWxlPg0KKyAgICA8TGliPg0KKyAgICAgIDxBZGRpdGlvbmFsT3B0aW9ucz4vTUFDSElORTpYODYgL05PREVGQVVMVExJQiAlKEFkZGl0aW9uYWxPcHRpb25zKTwvQWRkaXRpb25hbE9wdGlvbnM+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+Li5cLi5cbWFzbXg4NlxtYXRjaDY4Ni5vYmo7Li5cLi5cbWFzbXg4NlxpbmZmYXMzMi5vYmo7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil6bGlic3RhdC5saWI8L091dHB1dEZpbGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgIDwvTGliPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5Pbmx5RXhwbGljaXRJbmxpbmU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1hc214ODY7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7WkxJQl9XSU5BUEk7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4kKEludERpcil6bGlic3RhdC5wY2g8L1ByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxPYmplY3RGaWxlTmFtZT4kKEludERpcik8L09iamVjdEZpbGVOYW1lPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcik8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8UmVzb3VyY2VDb21waWxlPg0KKyAgICAgIDxDdWx0dXJlPjB4MDQwYzwvQ3VsdHVyZT4NCisgICAgPC9SZXNvdXJjZUNvbXBpbGU+DQorICAgIDxMaWI+DQorICAgICAgPEFkZGl0aW9uYWxPcHRpb25zPi9NQUNISU5FOlg4NiAvTk9ERUZBVUxUTElCICUoQWRkaXRpb25hbE9wdGlvbnMpPC9BZGRpdGlvbmFsT3B0aW9ucz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil6bGlic3RhdC5saWI8L091dHB1dEZpbGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgIDwvTGliPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWFzbXg4NjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5aTElCX1dJTkFQSTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWdETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+JChJbnREaXIpemxpYnN0YXQucGNoPC9QcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8T2JqZWN0RmlsZU5hbWU+JChJbnREaXIpPC9PYmplY3RGaWxlTmFtZT4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pk9sZFN0eWxlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPFJlc291cmNlQ29tcGlsZT4NCisgICAgICA8Q3VsdHVyZT4weDA0MGM8L0N1bHR1cmU+DQorICAgIDwvUmVzb3VyY2VDb21waWxlPg0KKyAgICA8TGliPg0KKyAgICAgIDxBZGRpdGlvbmFsT3B0aW9ucz4vTUFDSElORTpBTUQ2NCAvTk9ERUZBVUxUTElCICUoQWRkaXRpb25hbE9wdGlvbnMpPC9BZGRpdGlvbmFsT3B0aW9ucz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil6bGlic3RhdC5saWI8L091dHB1dEZpbGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgIDwvTGliPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5JdGFuaXVtPC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtYXNteDg2OyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPlpMSUJfV0lOQVBJO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1Z0RMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4kKEludERpcil6bGlic3RhdC5wY2g8L1ByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxPYmplY3RGaWxlTmFtZT4kKEludERpcik8L09iamVjdEZpbGVOYW1lPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcik8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+T2xkU3R5bGU8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8UmVzb3VyY2VDb21waWxlPg0KKyAgICAgIDxDdWx0dXJlPjB4MDQwYzwvQ3VsdHVyZT4NCisgICAgPC9SZXNvdXJjZUNvbXBpbGU+DQorICAgIDxMaWI+DQorICAgICAgPEFkZGl0aW9uYWxPcHRpb25zPi9NQUNISU5FOklBNjQgL05PREVGQVVMVExJQiAlKEFkZGl0aW9uYWxPcHRpb25zKTwvQWRkaXRpb25hbE9wdGlvbnM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpemxpYnN0YXQubGliPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICA8L0xpYj4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtYXNteDg2OyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPlpMSUJfV0lOQVBJO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztBU01WO0FTTUlORjtXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+JChJbnREaXIpemxpYnN0YXQucGNoPC9QcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8T2JqZWN0RmlsZU5hbWU+JChJbnREaXIpPC9PYmplY3RGaWxlTmFtZT4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPFJlc291cmNlQ29tcGlsZT4NCisgICAgICA8Q3VsdHVyZT4weDA0MGM8L0N1bHR1cmU+DQorICAgIDwvUmVzb3VyY2VDb21waWxlPg0KKyAgICA8TGliPg0KKyAgICAgIDxBZGRpdGlvbmFsT3B0aW9ucz4vTUFDSElORTpBTUQ2NCAvTk9ERUZBVUxUTElCICUoQWRkaXRpb25hbE9wdGlvbnMpPC9BZGRpdGlvbmFsT3B0aW9ucz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz4uLlwuLlxtYXNteDY0XGd2bWF0NjQub2JqOy4uXC4uXG1hc214NjRcaW5mZmFzeDY0Lm9iajslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXpsaWJzdGF0LmxpYjwvT3V0cHV0RmlsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgPC9MaWI+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+SXRhbml1bTwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtYXNteDg2OyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPlpMSUJfV0lOQVBJO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+JChJbnREaXIpemxpYnN0YXQucGNoPC9QcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8T2JqZWN0RmlsZU5hbWU+JChJbnREaXIpPC9PYmplY3RGaWxlTmFtZT4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPFJlc291cmNlQ29tcGlsZT4NCisgICAgICA8Q3VsdHVyZT4weDA0MGM8L0N1bHR1cmU+DQorICAgIDwvUmVzb3VyY2VDb21waWxlPg0KKyAgICA8TGliPg0KKyAgICAgIDxBZGRpdGlvbmFsT3B0aW9ucz4vTUFDSElORTpJQTY0IC9OT0RFRkFVTFRMSUIgJShBZGRpdGlvbmFsT3B0aW9ucyk8L0FkZGl0aW9uYWxPcHRpb25zPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXpsaWJzdGF0LmxpYjwvT3V0cHV0RmlsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgPC9MaWI+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+WDY0PC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5Pbmx5RXhwbGljaXRJbmxpbmU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1hc214ODY7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+WkxJQl9XSU5BUEk7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4kKEludERpcil6bGlic3RhdC5wY2g8L1ByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxPYmplY3RGaWxlTmFtZT4kKEludERpcik8L09iamVjdEZpbGVOYW1lPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcik8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8UmVzb3VyY2VDb21waWxlPg0KKyAgICAgIDxDdWx0dXJlPjB4MDQwYzwvQ3VsdHVyZT4NCisgICAgPC9SZXNvdXJjZUNvbXBpbGU+DQorICAgIDxMaWI+DQorICAgICAgPEFkZGl0aW9uYWxPcHRpb25zPi9NQUNISU5FOkFNRDY0IC9OT0RFRkFVTFRMSUIgJShBZGRpdGlvbmFsT3B0aW9ucyk8L0FkZGl0aW9uYWxPcHRpb25zPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXpsaWJzdGF0LmxpYjwvT3V0cHV0RmlsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgPC9MaWI+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Pkl0YW5pdW08L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPk9ubHlFeHBsaWNpdElubGluZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWFzbXg4NjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5aTElCX1dJTkFQSTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWRETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPiQoSW50RGlyKXpsaWJzdGF0LnBjaDwvUHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPE9iamVjdEZpbGVOYW1lPiQoSW50RGlyKTwvT2JqZWN0RmlsZU5hbWU+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKTwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxSZXNvdXJjZUNvbXBpbGU+DQorICAgICAgPEN1bHR1cmU+MHgwNDBjPC9DdWx0dXJlPg0KKyAgICA8L1Jlc291cmNlQ29tcGlsZT4NCisgICAgPExpYj4NCisgICAgICA8QWRkaXRpb25hbE9wdGlvbnM+L01BQ0hJTkU6SUE2NCAvTk9ERUZBVUxUTElCICUoQWRkaXRpb25hbE9wdGlvbnMpPC9BZGRpdGlvbmFsT3B0aW9ucz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil6bGlic3RhdC5saWI8L091dHB1dEZpbGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgIDwvTGliPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxhZGxlcjMyLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cY29tcHJlc3MuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxjcmMzMi5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGRlZmxhdGUuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxnemNsb3NlLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cZ3psaWIuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxnenJlYWQuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxnendyaXRlLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mYmFjay5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXG1hc214NjRcaW5mZmFzODY2NC5jIj4NCisgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+DQorICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4NCisgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtJyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+DQorICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4NCisgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4NCisgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZmZhc3QuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZsYXRlLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mdHJlZXMuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxtaW5pemlwXGlvYXBpLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cdHJlZXMuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlx1bmNvbXByLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbWluaXppcFx1bnppcC5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXG1pbml6aXBcemlwLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cenV0aWwuYyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlc291cmNlQ29tcGlsZSBJbmNsdWRlPSJ6bGliLnJjIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJ6bGlidmMuZGVmIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25UYXJnZXRzIj4NCisgIDwvSW1wb3J0R3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzExL3psaWJ2Yy5kZWYgYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMS96bGlidmMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNjcwNDYKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMS96bGlidmMuZGVmCkBAIC0wLDAgKzEsMTQzIEBACitMSUJSQVJZDQorOyB6bGliIGRhdGEgY29tcHJlc3Npb24gYW5kIFpJUCBmaWxlIEkvTyBsaWJyYXJ5DQorDQorVkVSU0lPTgkJMS4yLjgNCisNCitFWFBPUlRTDQorICAgICAgICBhZGxlcjMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxDQorICAgICAgICBjb21wcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyDQorICAgICAgICBjcmMzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAzDQorICAgICAgICBkZWZsYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA0DQorICAgICAgICBkZWZsYXRlQ29weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA1DQorICAgICAgICBkZWZsYXRlRW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA2DQorICAgICAgICBkZWZsYXRlSW5pdDJfICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA3DQorICAgICAgICBkZWZsYXRlSW5pdF8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA4DQorICAgICAgICBkZWZsYXRlUGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA5DQorICAgICAgICBkZWZsYXRlUmVzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxMA0KKyAgICAgICAgZGVmbGF0ZVNldERpY3Rpb25hcnkgICAgICAgICAgICAgICAgICAgICBAMTENCisgICAgICAgIGd6Y2xvc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEyDQorICAgICAgICBnemRvcGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxMw0KKyAgICAgICAgZ3plcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTQNCisgICAgICAgIGd6Zmx1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE1DQorICAgICAgICBnem9wZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNg0KKyAgICAgICAgZ3pyZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTcNCisgICAgICAgIGd6d3JpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE4DQorICAgICAgICBpbmZsYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxOQ0KKyAgICAgICAgaW5mbGF0ZUVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjANCisgICAgICAgIGluZmxhdGVJbml0Ml8gICAgICAgICAgICAgICAgICAgICAgICAgICAgQDIxDQorICAgICAgICBpbmZsYXRlSW5pdF8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyMg0KKyAgICAgICAgaW5mbGF0ZVJlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjMNCisgICAgICAgIGluZmxhdGVTZXREaWN0aW9uYXJ5ICAgICAgICAgICAgICAgICAgICAgQDI0DQorICAgICAgICBpbmZsYXRlU3luYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyNQ0KKyAgICAgICAgdW5jb21wcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjYNCisgICAgICAgIHpsaWJWZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDI3DQorICAgICAgICBnenByaW50ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyOA0KKyAgICAgICAgZ3pwdXRjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjkNCisgICAgICAgIGd6Z2V0YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDMwDQorICAgICAgICBnenNlZWsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAzMQ0KKyAgICAgICAgZ3pyZXdpbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzINCisgICAgICAgIGd6dGVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDMzDQorICAgICAgICBnemVvZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAzNA0KKyAgICAgICAgZ3pzZXRwYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzUNCisgICAgICAgIHpFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDM2DQorICAgICAgICBpbmZsYXRlU3luY1BvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIEAzNw0KKyAgICAgICAgZ2V0X2NyY190YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzgNCisgICAgICAgIGNvbXByZXNzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDM5DQorICAgICAgICBnenB1dHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA0MA0KKyAgICAgICAgZ3pnZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANDENCisgICAgICAgIGluZmxhdGVDb3B5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQyDQorICAgICAgICBpbmZsYXRlQmFja0luaXRfICAgICAgICAgICAgICAgICAgICAgICAgIEA0Mw0KKyAgICAgICAgaW5mbGF0ZUJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANDQNCisgICAgICAgIGluZmxhdGVCYWNrRW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQ1DQorICAgICAgICBjb21wcmVzc0JvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA0Ng0KKyAgICAgICAgZGVmbGF0ZUJvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANDcNCisgICAgICAgIGd6Y2xlYXJlcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQ4DQorICAgICAgICBnenVuZ2V0YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA0OQ0KKyAgICAgICAgemxpYkNvbXBpbGVGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICBANTANCisgICAgICAgIGRlZmxhdGVQcmltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDUxDQorICAgICAgICBkZWZsYXRlUGVuZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgIEA1Mg0KKw0KKyAgICAgICAgdW56T3BlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANjENCisgICAgICAgIHVuekNsb3NlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDYyDQorICAgICAgICB1bnpHZXRHbG9iYWxJbmZvICAgICAgICAgICAgICAgICAgICAgICAgIEA2Mw0KKyAgICAgICAgdW56R2V0Q3VycmVudEZpbGVJbmZvICAgICAgICAgICAgICAgICAgICBANjQNCisgICAgICAgIHVuekdvVG9GaXJzdEZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgQDY1DQorICAgICAgICB1bnpHb1RvTmV4dEZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgIEA2Ng0KKyAgICAgICAgdW56T3BlbkN1cnJlbnRGaWxlICAgICAgICAgICAgICAgICAgICAgICBANjcNCisgICAgICAgIHVuelJlYWRDdXJyZW50RmlsZSAgICAgICAgICAgICAgICAgICAgICAgQDY4DQorICAgICAgICB1bnpPcGVuQ3VycmVudEZpbGUzICAgICAgICAgICAgICAgICAgICAgIEA2OQ0KKyAgICAgICAgdW56dGVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANzANCisgICAgICAgIHVuemVvZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDcxDQorICAgICAgICB1bnpDbG9zZUN1cnJlbnRGaWxlICAgICAgICAgICAgICAgICAgICAgIEA3Mg0KKyAgICAgICAgdW56R2V0R2xvYmFsQ29tbWVudCAgICAgICAgICAgICAgICAgICAgICBANzMNCisgICAgICAgIHVuelN0cmluZ0ZpbGVOYW1lQ29tcGFyZSAgICAgICAgICAgICAgICAgQDc0DQorICAgICAgICB1bnpMb2NhdGVGaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA3NQ0KKyAgICAgICAgdW56R2V0TG9jYWxFeHRyYWZpZWxkICAgICAgICAgICAgICAgICAgICBANzYNCisgICAgICAgIHVuek9wZW4yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDc3DQorICAgICAgICB1bnpPcGVuQ3VycmVudEZpbGUyICAgICAgICAgICAgICAgICAgICAgIEA3OA0KKyAgICAgICAgdW56T3BlbkN1cnJlbnRGaWxlUGFzc3dvcmQgICAgICAgICAgICAgICBANzkNCisNCisgICAgICAgIHppcE9wZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDgwDQorICAgICAgICB6aXBPcGVuTmV3RmlsZUluWmlwICAgICAgICAgICAgICAgICAgICAgIEA4MQ0KKyAgICAgICAgemlwV3JpdGVJbkZpbGVJblppcCAgICAgICAgICAgICAgICAgICAgICBAODINCisgICAgICAgIHppcENsb3NlRmlsZUluWmlwICAgICAgICAgICAgICAgICAgICAgICAgQDgzDQorICAgICAgICB6aXBDbG9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA4NA0KKyAgICAgICAgemlwT3Blbk5ld0ZpbGVJblppcDIgICAgICAgICAgICAgICAgICAgICBAODYNCisgICAgICAgIHppcENsb3NlRmlsZUluWmlwUmF3ICAgICAgICAgICAgICAgICAgICAgQDg3DQorICAgICAgICB6aXBPcGVuMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA4OA0KKyAgICAgICAgemlwT3Blbk5ld0ZpbGVJblppcDMgICAgICAgICAgICAgICAgICAgICBAODkNCisNCisgICAgICAgIHVuekdldEZpbGVQb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEwMA0KKyAgICAgICAgdW56R29Ub0ZpbGVQb3MgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTAxDQorDQorICAgICAgICBmaWxsX3dpbjMyX2ZpbGVmdW5jICAgICAgICAgICAgICAgICAgICAgIEAxMTANCisNCis7IHpsaWJ3YXBpIHYxLjIuNCBhZGRlZDoNCisgICAgICAgIGZpbGxfd2luMzJfZmlsZWZ1bmM2NCAgICAgICAgICAgICAgICAgICBAMTExDQorICAgICAgICBmaWxsX3dpbjMyX2ZpbGVmdW5jNjRBICAgICAgICAgICAgICAgICAgQDExMg0KKyAgICAgICAgZmlsbF93aW4zMl9maWxlZnVuYzY0VyAgICAgICAgICAgICAgICAgIEAxMTMNCisNCisgICAgICAgIHVuek9wZW42NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTIwDQorICAgICAgICB1bnpPcGVuMl82NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEyMQ0KKyAgICAgICAgdW56R2V0R2xvYmFsSW5mbzY0ICAgICAgICAgICAgICAgICAgICAgIEAxMjINCisgICAgICAgIHVuekdldEN1cnJlbnRGaWxlSW5mbzY0ICAgICAgICAgICAgICAgICBAMTI0DQorICAgICAgICB1bnpHZXRDdXJyZW50RmlsZVpTdHJlYW1Qb3M2NCAgICAgICAgICAgQDEyNQ0KKyAgICAgICAgdW56dGVsbDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxMjYNCisgICAgICAgIHVuekdldEZpbGVQb3M2NCAgICAgICAgICAgICAgICAgICAgICAgICBAMTI3DQorICAgICAgICB1bnpHb1RvRmlsZVBvczY0ICAgICAgICAgICAgICAgICAgICAgICAgQDEyOA0KKw0KKyAgICAgICAgemlwT3BlbjY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxMzANCisgICAgICAgIHppcE9wZW4yXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTMxDQorICAgICAgICB6aXBPcGVuTmV3RmlsZUluWmlwNjQgICAgICAgICAgICAgICAgICAgQDEzMg0KKyAgICAgICAgemlwT3Blbk5ld0ZpbGVJblppcDJfNjQgICAgICAgICAgICAgICAgIEAxMzMNCisgICAgICAgIHppcE9wZW5OZXdGaWxlSW5aaXAzXzY0ICAgICAgICAgICAgICAgICBAMTM0DQorICAgICAgICB6aXBPcGVuTmV3RmlsZUluWmlwNF82NCAgICAgICAgICAgICAgICAgQDEzNQ0KKyAgICAgICAgemlwQ2xvc2VGaWxlSW5aaXBSYXc2NCAgICAgICAgICAgICAgICAgIEAxMzYNCisNCis7IHpsaWIxIHYxLjIuNCBhZGRlZDoNCisgICAgICAgIGFkbGVyMzJfY29tYmluZSAgICAgICAgICAgICAgICAgICAgICAgICBAMTQwDQorICAgICAgICBjcmMzMl9jb21iaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE0Mg0KKyAgICAgICAgZGVmbGF0ZVNldEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIEAxNDQNCisgICAgICAgIGRlZmxhdGVUdW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTQ1DQorICAgICAgICBnemJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE0Ng0KKyAgICAgICAgZ3pjbG9zZV9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNDcNCisgICAgICAgIGd6Y2xvc2VfdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTQ4DQorICAgICAgICBnemRpcmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE0OQ0KKyAgICAgICAgZ3pvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNTANCisgICAgICAgIGluZmxhdGVHZXRIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICBAMTU2DQorICAgICAgICBpbmZsYXRlTWFyayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE1Nw0KKyAgICAgICAgaW5mbGF0ZVByaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNTgNCisgICAgICAgIGluZmxhdGVSZXNldDIgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTU5DQorICAgICAgICBpbmZsYXRlVW5kZXJtaW5lICAgICAgICAgICAgICAgICAgICAgICAgQDE2MA0KKw0KKzsgemxpYjEgdjEuMi42IGFkZGVkOg0KKyAgICAgICAgZ3pnZXRjXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNjENCisgICAgICAgIGluZmxhdGVSZXNldEtlZXAgICAgICAgICAgICAgICAgICAgICAgICBAMTYzDQorICAgICAgICBkZWZsYXRlUmVzZXRLZWVwICAgICAgICAgICAgICAgICAgICAgICAgQDE2NA0KKw0KKzsgemxpYjEgdjEuMi43IGFkZGVkOg0KKyAgICAgICAgZ3pvcGVuX3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNjUNCisNCis7IHpsaWIxIHYxLjIuOCBhZGRlZDoNCisgICAgICAgIGluZmxhdGVHZXREaWN0aW9uYXJ5ICAgICAgICAgICAgICAgICAgICBAMTY2DQorICAgICAgICBnenZwcmludGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE2Nw0KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzExL3psaWJ2Yy5zbG4gYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMS96bGlidmMuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmY2JhZmQKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMS96bGlidmMuc2xuCkBAIC0wLDAgKzEsMTE3IEBACivvu78NCitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMi4wMA0KKyMgVmlzdWFsIFN0dWRpbyAyMDEyDQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJ6bGlidmMiLCAiemxpYnZjLnZjeHByb2oiLCAiezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiemxpYnN0YXQiLCAiemxpYnN0YXQudmN4cHJvaiIsICJ7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJ0ZXN0emxpYiIsICJ0ZXN0emxpYi52Y3hwcm9qIiwgIntBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInRlc3R6bGliZGxsIiwgInRlc3R6bGliZGxsLnZjeHByb2oiLCAie0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAibWluaXppcCIsICJtaW5pemlwLnZjeHByb2oiLCAiezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAibWluaXVueiIsICJtaW5pdW56LnZjeHByb2oiLCAie0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0iDQorRW5kUHJvamVjdA0KK0dsb2JhbA0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbg0KKwkJRGVidWd8SXRhbml1bSA9IERlYnVnfEl0YW5pdW0NCisJCURlYnVnfFdpbjMyID0gRGVidWd8V2luMzINCisJCURlYnVnfHg2NCA9IERlYnVnfHg2NA0KKwkJUmVsZWFzZXxJdGFuaXVtID0gUmVsZWFzZXxJdGFuaXVtDQorCQlSZWxlYXNlfFdpbjMyID0gUmVsZWFzZXxXaW4zMg0KKwkJUmVsZWFzZXx4NjQgPSBSZWxlYXNlfHg2NA0KKwkJUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSA9IFJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0NCisJCVJlbGVhc2VXaXRob3V0QXNtfFdpbjMyID0gUmVsZWFzZVdpdGhvdXRBc218V2luMzINCisJCVJlbGVhc2VXaXRob3V0QXNtfHg2NCA9IFJlbGVhc2VXaXRob3V0QXNtfHg2NA0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uDQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5EZWJ1Z3xJdGFuaXVtLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8eDY0DQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NA0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZXxJdGFuaXVtLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NA0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bS5BY3RpdmVDZmcgPSBSZWxlYXNlV2l0aG91dEFzbXxXaW4zMg0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZVdpdGhvdXRBc218V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZVdpdGhvdXRBc218V2luMzINCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2VXaXRob3V0QXNtfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlV2l0aG91dEFzbXxXaW4zMg0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZVdpdGhvdXRBc218eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2VXaXRob3V0QXNtfHg2NA0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZVdpdGhvdXRBc218eDY0LkJ1aWxkLjAgPSBSZWxlYXNlV2l0aG91dEFzbXx4NjQNCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LkRlYnVnfEl0YW5pdW0uQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQNCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8eDY0DQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5SZWxlYXNlfEl0YW5pdW0uQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0DQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5SZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtLkFjdGl2ZUNmZyA9IFJlbGVhc2VXaXRob3V0QXNtfFdpbjMyDQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5SZWxlYXNlV2l0aG91dEFzbXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlV2l0aG91dEFzbXxXaW4zMg0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uUmVsZWFzZVdpdGhvdXRBc218V2luMzIuQnVpbGQuMCA9IFJlbGVhc2VXaXRob3V0QXNtfFdpbjMyDQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5SZWxlYXNlV2l0aG91dEFzbXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZVdpdGhvdXRBc218eDY0DQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5SZWxlYXNlV2l0aG91dEFzbXx4NjQuQnVpbGQuMCA9IFJlbGVhc2VXaXRob3V0QXNtfHg2NA0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWd8SXRhbml1bS5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2V8SXRhbml1bS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQNCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0uQWN0aXZlQ2ZnID0gUmVsZWFzZVdpdGhvdXRBc218V2luMzINCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2VXaXRob3V0QXNtfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2VXaXRob3V0QXNtfFdpbjMyDQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlV2l0aG91dEFzbXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZVdpdGhvdXRBc218V2luMzINCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2VXaXRob3V0QXNtfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlV2l0aG91dEFzbXx4NjQNCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2VXaXRob3V0QXNtfHg2NC5CdWlsZC4wID0gUmVsZWFzZVdpdGhvdXRBc218eDY0DQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5EZWJ1Z3xJdGFuaXVtLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8eDY0DQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NA0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uUmVsZWFzZXxJdGFuaXVtLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NA0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5SZWxlYXNlV2l0aG91dEFzbXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5SZWxlYXNlV2l0aG91dEFzbXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LkRlYnVnfEl0YW5pdW0uQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQNCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8eDY0DQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlfEl0YW5pdW0uQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0DQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2VXaXRob3V0QXNtfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2VXaXRob3V0QXNtfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uRGVidWd8SXRhbml1bS5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LlJlbGVhc2V8SXRhbml1bS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQNCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0uQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uUmVsZWFzZVdpdGhvdXRBc218V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uUmVsZWFzZVdpdGhvdXRBc218eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24NCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQ0KKwlFbmRHbG9iYWxTZWN0aW9uDQorRW5kR2xvYmFsDQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjMTEvemxpYnZjLnZjeHByb2ogYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmMxMS96bGlidmMudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjViOTVmCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjMTEvemxpYnZjLnZjeHByb2oKQEAgLTAsMCArMSw2ODggQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8SXRhbml1bSI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPkl0YW5pdW08L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3x4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZVdpdGhvdXRBc208L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPkl0YW5pdW08L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZVdpdGhvdXRBc218V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2VXaXRob3V0QXNtPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlV2l0aG91dEFzbXx4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2VXaXRob3V0QXNtPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxJdGFuaXVtIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5JdGFuaXVtPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8eDY0Ij4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+DQorICAgIDxQcm9qZWN0R3VpZD57OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfTwvUHJvamVjdEd1aWQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+RHluYW1pY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgPFBsYXRmb3JtVG9vbHNldD52MTEwPC9QbGF0Zm9ybVRvb2xzZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+RHluYW1pY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgPFBsYXRmb3JtVG9vbHNldD52MTEwPC9QbGF0Zm9ybVRvb2xzZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+RHluYW1pY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KKyAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMTA8L1BsYXRmb3JtVG9vbHNldD4NCisgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkR5bmFtaWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5EeW5hbWljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+RHluYW1pY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkR5bmFtaWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djExMDwvUGxhdGZvcm1Ub29sc2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5EeW5hbWljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMTA8L1BsYXRmb3JtVG9vbHNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+RHluYW1pY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KKyAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMTA8L1BsYXRmb3JtVG9vbHNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPF9Qcm9qZWN0RmlsZVZlcnNpb24+MTAuMC4zMDEyOC4xPC9fUHJvamVjdEZpbGVWZXJzaW9uPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj54ODZcWmxpYkRsbCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPng4NlxabGliRGxsJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIj54ODZcWmxpYkRsbCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciPng4NlxabGliRGxsJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj54ODZcWmxpYkRsbCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+eDg2XFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPng2NFxabGliRGxsJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPng2NFxabGliRGxsJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj50cnVlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+aWE2NFxabGliRGxsJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj5pYTY0XFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj50cnVlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218eDY0JyI+eDY0XFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218eDY0JyI+eDY0XFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218eDY0JyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtJyI+aWE2NFxabGliRGxsJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj5pYTY0XFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+eDY0XFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj54NjRcWmxpYkRsbCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5pYTY0XFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+aWE2NFxabGliRGxsJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiAvPg0KKyAgICA8VGFyZ2V0TmFtZSBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+emxpYndhcGk8L1RhcmdldE5hbWU+DQorICAgIDxUYXJnZXROYW1lIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIj56bGlid2FwaTwvVGFyZ2V0TmFtZT4NCisgICAgPFRhcmdldE5hbWUgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+emxpYndhcGk8L1RhcmdldE5hbWU+DQorICAgIDxUYXJnZXROYW1lIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+emxpYndhcGk8L1RhcmdldE5hbWU+DQorICAgIDxUYXJnZXROYW1lIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218eDY0JyI+emxpYndhcGk8L1RhcmdldE5hbWU+DQorICAgIDxUYXJnZXROYW1lIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj56bGlid2FwaTwvVGFyZ2V0TmFtZT4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4NCisgICAgPE1pZGw+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9ERUJVRzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1rVHlwTGliQ29tcGF0aWJsZT50cnVlPC9Na1R5cExpYkNvbXBhdGlibGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50PldpbjMyPC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgICA8VHlwZUxpYnJhcnlOYW1lPiQoT3V0RGlyKXpsaWJ2Yy50bGI8L1R5cGVMaWJyYXJ5TmFtZT4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtYXNteDg2OyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztaTElCX1dJTkFQSTtBU01WO0FTTUlORjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1Z0RMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4kKEludERpcil6bGlidmMucGNoPC9QcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8T2JqZWN0RmlsZU5hbWU+JChJbnREaXIpPC9PYmplY3RGaWxlTmFtZT4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPC9Ccm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxSZXNvdXJjZUNvbXBpbGU+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9ERUJVRzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEN1bHR1cmU+MHgwNDBjPC9DdWx0dXJlPg0KKyAgICA8L1Jlc291cmNlQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxPcHRpb25zPi9NQUNISU5FOkkzODYgJShBZGRpdGlvbmFsT3B0aW9ucyk8L0FkZGl0aW9uYWxPcHRpb25zPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPi4uXC4uXG1hc214ODZcbWF0Y2g2ODYub2JqOy4uXC4uXG1hc214ODZcaW5mZmFzMzIub2JqOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpemxpYndhcGkuZGxsPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICAgIDxNb2R1bGVEZWZpbml0aW9uRmlsZT4uXHpsaWJ2Yy5kZWY8L01vZHVsZURlZmluaXRpb25GaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxQcm9ncmFtRGF0YWJhc2VGaWxlPiQoT3V0RGlyKXpsaWJ3YXBpLnBkYjwvUHJvZ3JhbURhdGFiYXNlRmlsZT4NCisgICAgICA8R2VuZXJhdGVNYXBGaWxlPnRydWU8L0dlbmVyYXRlTWFwRmlsZT4NCisgICAgICA8TWFwRmlsZU5hbWU+JChPdXREaXIpemxpYndhcGkubWFwPC9NYXBGaWxlTmFtZT4NCisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4NCisgICAgICA8UmFuZG9taXplZEJhc2VBZGRyZXNzPmZhbHNlPC9SYW5kb21pemVkQmFzZUFkZHJlc3M+DQorICAgICAgPERhdGFFeGVjdXRpb25QcmV2ZW50aW9uPg0KKyAgICAgIDwvRGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPEltcG9ydExpYnJhcnk+JChPdXREaXIpemxpYndhcGkubGliPC9JbXBvcnRMaWJyYXJ5Pg0KKyAgICA8L0xpbms+DQorICAgIDxQcmVCdWlsZEV2ZW50Pg0KKyAgICAgIDxDb21tYW5kPmNkIC4uXC4uXG1hc214ODYNCitibGRfbWwzMi5iYXQ8L0NvbW1hbmQ+DQorICAgIDwvUHJlQnVpbGRFdmVudD4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIj4NCisgICAgPE1pZGw+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPk5ERUJVRzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1rVHlwTGliQ29tcGF0aWJsZT50cnVlPC9Na1R5cExpYkNvbXBhdGlibGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50PldpbjMyPC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgICA8VHlwZUxpYnJhcnlOYW1lPiQoT3V0RGlyKXpsaWJ2Yy50bGI8L1R5cGVMaWJyYXJ5TmFtZT4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5Pbmx5RXhwbGljaXRJbmxpbmU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1hc214ODY7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1pMSUJfV0lOQVBJOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4kKEludERpcil6bGlidmMucGNoPC9QcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+DQorICAgICAgPEFzc2VtYmxlck91dHB1dD5BbGw8L0Fzc2VtYmxlck91dHB1dD4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxPYmplY3RGaWxlTmFtZT4kKEludERpcik8L09iamVjdEZpbGVOYW1lPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcik8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8L0Jyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8UmVzb3VyY2VDb21waWxlPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5OREVCVUc7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxDdWx0dXJlPjB4MDQwYzwvQ3VsdHVyZT4NCisgICAgPC9SZXNvdXJjZUNvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsT3B0aW9ucz4vTUFDSElORTpJMzg2ICUoQWRkaXRpb25hbE9wdGlvbnMpPC9BZGRpdGlvbmFsT3B0aW9ucz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil6bGlid2FwaS5kbGw8L091dHB1dEZpbGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPElnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM+ZmFsc2U8L0lnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM+DQorICAgICAgPE1vZHVsZURlZmluaXRpb25GaWxlPi5cemxpYnZjLmRlZjwvTW9kdWxlRGVmaW5pdGlvbkZpbGU+DQorICAgICAgPFByb2dyYW1EYXRhYmFzZUZpbGU+JChPdXREaXIpemxpYndhcGkucGRiPC9Qcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZU1hcEZpbGU+dHJ1ZTwvR2VuZXJhdGVNYXBGaWxlPg0KKyAgICAgIDxNYXBGaWxlTmFtZT4kKE91dERpcil6bGlid2FwaS5tYXA8L01hcEZpbGVOYW1lPg0KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPg0KKyAgICAgIDxSYW5kb21pemVkQmFzZUFkZHJlc3M+ZmFsc2U8L1JhbmRvbWl6ZWRCYXNlQWRkcmVzcz4NCisgICAgICA8RGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPC9EYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8SW1wb3J0TGlicmFyeT4kKE91dERpcil6bGlid2FwaS5saWI8L0ltcG9ydExpYnJhcnk+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPg0KKyAgICA8TWlkbD4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+TkRFQlVHOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWtUeXBMaWJDb21wYXRpYmxlPnRydWU8L01rVHlwTGliQ29tcGF0aWJsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+V2luMzI8L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICAgIDxUeXBlTGlicmFyeU5hbWU+JChPdXREaXIpemxpYnZjLnRsYjwvVHlwZUxpYnJhcnlOYW1lPg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPk9ubHlFeHBsaWNpdElubGluZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWFzbXg4NjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7WkxJQl9XSU5BUEk7QVNNVjtBU01JTkY7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPiQoSW50RGlyKXpsaWJ2Yy5wY2g8L1ByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4NCisgICAgICA8QXNzZW1ibGVyT3V0cHV0PkFsbDwvQXNzZW1ibGVyT3V0cHV0Pg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPE9iamVjdEZpbGVOYW1lPiQoSW50RGlyKTwvT2JqZWN0RmlsZU5hbWU+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKTwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDwvQnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxSZXNvdXJjZUNvbXBpbGU+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPk5ERUJVRzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEN1bHR1cmU+MHgwNDBjPC9DdWx0dXJlPg0KKyAgICA8L1Jlc291cmNlQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxPcHRpb25zPi9NQUNISU5FOkkzODYgJShBZGRpdGlvbmFsT3B0aW9ucyk8L0FkZGl0aW9uYWxPcHRpb25zPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPi4uXC4uXG1hc214ODZcbWF0Y2g2ODYub2JqOy4uXC4uXG1hc214ODZcaW5mZmFzMzIub2JqOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpemxpYndhcGkuZGxsPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICAgIDxJZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPmZhbHNlPC9JZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPg0KKyAgICAgIDxNb2R1bGVEZWZpbml0aW9uRmlsZT4uXHpsaWJ2Yy5kZWY8L01vZHVsZURlZmluaXRpb25GaWxlPg0KKyAgICAgIDxQcm9ncmFtRGF0YWJhc2VGaWxlPiQoT3V0RGlyKXpsaWJ3YXBpLnBkYjwvUHJvZ3JhbURhdGFiYXNlRmlsZT4NCisgICAgICA8R2VuZXJhdGVNYXBGaWxlPnRydWU8L0dlbmVyYXRlTWFwRmlsZT4NCisgICAgICA8TWFwRmlsZU5hbWU+JChPdXREaXIpemxpYndhcGkubWFwPC9NYXBGaWxlTmFtZT4NCisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4NCisgICAgICA8UmFuZG9taXplZEJhc2VBZGRyZXNzPmZhbHNlPC9SYW5kb21pemVkQmFzZUFkZHJlc3M+DQorICAgICAgPERhdGFFeGVjdXRpb25QcmV2ZW50aW9uPg0KKyAgICAgIDwvRGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPEltcG9ydExpYnJhcnk+JChPdXREaXIpemxpYndhcGkubGliPC9JbXBvcnRMaWJyYXJ5Pg0KKyAgICA8L0xpbms+DQorICAgIDxQcmVCdWlsZEV2ZW50Pg0KKyAgICAgIDxDb21tYW5kPmNkIC4uXC4uXG1hc214ODYNCitibGRfbWwzMi5iYXQ8L0NvbW1hbmQ+DQorICAgIDwvUHJlQnVpbGRFdmVudD4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fREVCVUc7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxNa1R5cExpYkNvbXBhdGlibGU+dHJ1ZTwvTWtUeXBMaWJDb21wYXRpYmxlPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5YNjQ8L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICAgIDxUeXBlTGlicmFyeU5hbWU+JChPdXREaXIpemxpYnZjLnRsYjwvVHlwZUxpYnJhcnlOYW1lPg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1hc214ODY7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1pMSUJfV0lOQVBJO0FTTVY7QVNNSU5GO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPiQoSW50RGlyKXpsaWJ2Yy5wY2g8L1ByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxPYmplY3RGaWxlTmFtZT4kKEludERpcik8L09iamVjdEZpbGVOYW1lPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcik8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8L0Jyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPFJlc291cmNlQ29tcGlsZT4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0RFQlVHOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8Q3VsdHVyZT4weDA0MGM8L0N1bHR1cmU+DQorICAgIDwvUmVzb3VyY2VDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz4uLlwuLlxtYXNteDY0XGd2bWF0NjQub2JqOy4uXC4uXG1hc214NjRcaW5mZmFzeDY0Lm9iajslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXpsaWJ3YXBpLmRsbDwvT3V0cHV0RmlsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgICA8TW9kdWxlRGVmaW5pdGlvbkZpbGU+Llx6bGlidmMuZGVmPC9Nb2R1bGVEZWZpbml0aW9uRmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8UHJvZ3JhbURhdGFiYXNlRmlsZT4kKE91dERpcil6bGlid2FwaS5wZGI8L1Byb2dyYW1EYXRhYmFzZUZpbGU+DQorICAgICAgPEdlbmVyYXRlTWFwRmlsZT50cnVlPC9HZW5lcmF0ZU1hcEZpbGU+DQorICAgICAgPE1hcEZpbGVOYW1lPiQoT3V0RGlyKXpsaWJ3YXBpLm1hcDwvTWFwRmlsZU5hbWU+DQorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+DQorICAgICAgPEltcG9ydExpYnJhcnk+JChPdXREaXIpemxpYndhcGkubGliPC9JbXBvcnRMaWJyYXJ5Pg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYNjQ8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgICAgPFByZUJ1aWxkRXZlbnQ+DQorICAgICAgPENvbW1hbmQ+Y2QgLi5cLi5cY29udHJpYlxtYXNteDY0DQorYmxkX21sNjQuYmF0PC9Db21tYW5kPg0KKyAgICA8L1ByZUJ1aWxkRXZlbnQ+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj4NCisgICAgPE1pZGw+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9ERUJVRzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1rVHlwTGliQ29tcGF0aWJsZT50cnVlPC9Na1R5cExpYkNvbXBhdGlibGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Pkl0YW5pdW08L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICAgIDxUeXBlTGlicmFyeU5hbWU+JChPdXREaXIpemxpYnZjLnRsYjwvVHlwZUxpYnJhcnlOYW1lPg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1hc214ODY7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1pMSUJfV0lOQVBJO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPiQoSW50RGlyKXpsaWJ2Yy5wY2g8L1ByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxPYmplY3RGaWxlTmFtZT4kKEludERpcik8L09iamVjdEZpbGVOYW1lPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcik8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8L0Jyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPFJlc291cmNlQ29tcGlsZT4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0RFQlVHOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8Q3VsdHVyZT4weDA0MGM8L0N1bHR1cmU+DQorICAgIDwvUmVzb3VyY2VDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil6bGlid2FwaS5kbGw8L091dHB1dEZpbGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPE1vZHVsZURlZmluaXRpb25GaWxlPi5cemxpYnZjLmRlZjwvTW9kdWxlRGVmaW5pdGlvbkZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFByb2dyYW1EYXRhYmFzZUZpbGU+JChPdXREaXIpemxpYndhcGkucGRiPC9Qcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZU1hcEZpbGU+dHJ1ZTwvR2VuZXJhdGVNYXBGaWxlPg0KKyAgICAgIDxNYXBGaWxlTmFtZT4kKE91dERpcil6bGlid2FwaS5tYXA8L01hcEZpbGVOYW1lPg0KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPg0KKyAgICAgIDxJbXBvcnRMaWJyYXJ5PiQoT3V0RGlyKXpsaWJ3YXBpLmxpYjwvSW1wb3J0TGlicmFyeT4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lSUE2NDwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPk5ERUJVRzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1rVHlwTGliQ29tcGF0aWJsZT50cnVlPC9Na1R5cExpYkNvbXBhdGlibGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgICAgPFR5cGVMaWJyYXJ5TmFtZT4kKE91dERpcil6bGlidmMudGxiPC9UeXBlTGlicmFyeU5hbWU+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtYXNteDg2OyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztaTElCX1dJTkFQSTtXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+JChJbnREaXIpemxpYnZjLnBjaDwvUHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPg0KKyAgICAgIDxBc3NlbWJsZXJPdXRwdXQ+QWxsPC9Bc3NlbWJsZXJPdXRwdXQ+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8T2JqZWN0RmlsZU5hbWU+JChJbnREaXIpPC9PYmplY3RGaWxlTmFtZT4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPC9Ccm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPFJlc291cmNlQ29tcGlsZT4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+TkRFQlVHOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8Q3VsdHVyZT4weDA0MGM8L0N1bHR1cmU+DQorICAgIDwvUmVzb3VyY2VDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil6bGlid2FwaS5kbGw8L091dHB1dEZpbGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPElnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM+ZmFsc2U8L0lnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM+DQorICAgICAgPE1vZHVsZURlZmluaXRpb25GaWxlPi5cemxpYnZjLmRlZjwvTW9kdWxlRGVmaW5pdGlvbkZpbGU+DQorICAgICAgPFByb2dyYW1EYXRhYmFzZUZpbGU+JChPdXREaXIpemxpYndhcGkucGRiPC9Qcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZU1hcEZpbGU+dHJ1ZTwvR2VuZXJhdGVNYXBGaWxlPg0KKyAgICAgIDxNYXBGaWxlTmFtZT4kKE91dERpcil6bGlid2FwaS5tYXA8L01hcEZpbGVOYW1lPg0KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPg0KKyAgICAgIDxJbXBvcnRMaWJyYXJ5PiQoT3V0RGlyKXpsaWJ3YXBpLmxpYjwvSW1wb3J0TGlicmFyeT4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDY0PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj4NCisgICAgPE1pZGw+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPk5ERUJVRzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1rVHlwTGliQ29tcGF0aWJsZT50cnVlPC9Na1R5cExpYkNvbXBhdGlibGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Pkl0YW5pdW08L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICAgIDxUeXBlTGlicmFyeU5hbWU+JChPdXREaXIpemxpYnZjLnRsYjwvVHlwZUxpYnJhcnlOYW1lPg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPk9ubHlFeHBsaWNpdElubGluZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWFzbXg4NjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7WkxJQl9XSU5BUEk7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWRETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPiQoSW50RGlyKXpsaWJ2Yy5wY2g8L1ByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4NCisgICAgICA8QXNzZW1ibGVyT3V0cHV0PkFsbDwvQXNzZW1ibGVyT3V0cHV0Pg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPE9iamVjdEZpbGVOYW1lPiQoSW50RGlyKTwvT2JqZWN0RmlsZU5hbWU+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKTwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDwvQnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxSZXNvdXJjZUNvbXBpbGU+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPk5ERUJVRzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEN1bHR1cmU+MHgwNDBjPC9DdWx0dXJlPg0KKyAgICA8L1Jlc291cmNlQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpemxpYndhcGkuZGxsPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICAgIDxJZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPmZhbHNlPC9JZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPg0KKyAgICAgIDxNb2R1bGVEZWZpbml0aW9uRmlsZT4uXHpsaWJ2Yy5kZWY8L01vZHVsZURlZmluaXRpb25GaWxlPg0KKyAgICAgIDxQcm9ncmFtRGF0YWJhc2VGaWxlPiQoT3V0RGlyKXpsaWJ3YXBpLnBkYjwvUHJvZ3JhbURhdGFiYXNlRmlsZT4NCisgICAgICA8R2VuZXJhdGVNYXBGaWxlPnRydWU8L0dlbmVyYXRlTWFwRmlsZT4NCisgICAgICA8TWFwRmlsZU5hbWU+JChPdXREaXIpemxpYndhcGkubWFwPC9NYXBGaWxlTmFtZT4NCisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4NCisgICAgICA8SW1wb3J0TGlicmFyeT4kKE91dERpcil6bGlid2FwaS5saWI8L0ltcG9ydExpYnJhcnk+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZUlBNjQ8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPk5ERUJVRzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1rVHlwTGliQ29tcGF0aWJsZT50cnVlPC9Na1R5cExpYkNvbXBhdGlibGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgICAgPFR5cGVMaWJyYXJ5TmFtZT4kKE91dERpcil6bGlidmMudGxiPC9UeXBlTGlicmFyeU5hbWU+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtYXNteDg2OyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztaTElCX1dJTkFQSTtBU01WO0FTTUlORjtXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+JChJbnREaXIpemxpYnZjLnBjaDwvUHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPg0KKyAgICAgIDxBc3NlbWJsZXJPdXRwdXQ+QWxsPC9Bc3NlbWJsZXJPdXRwdXQ+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8T2JqZWN0RmlsZU5hbWU+JChJbnREaXIpPC9PYmplY3RGaWxlTmFtZT4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPC9Ccm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPFJlc291cmNlQ29tcGlsZT4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+TkRFQlVHOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8Q3VsdHVyZT4weDA0MGM8L0N1bHR1cmU+DQorICAgIDwvUmVzb3VyY2VDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz4uLlwuLlxtYXNteDY0XGd2bWF0NjQub2JqOy4uXC4uXG1hc214NjRcaW5mZmFzeDY0Lm9iajslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXpsaWJ3YXBpLmRsbDwvT3V0cHV0RmlsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgICA8SWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz5mYWxzZTwvSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz4NCisgICAgICA8TW9kdWxlRGVmaW5pdGlvbkZpbGU+Llx6bGlidmMuZGVmPC9Nb2R1bGVEZWZpbml0aW9uRmlsZT4NCisgICAgICA8UHJvZ3JhbURhdGFiYXNlRmlsZT4kKE91dERpcil6bGlid2FwaS5wZGI8L1Byb2dyYW1EYXRhYmFzZUZpbGU+DQorICAgICAgPEdlbmVyYXRlTWFwRmlsZT50cnVlPC9HZW5lcmF0ZU1hcEZpbGU+DQorICAgICAgPE1hcEZpbGVOYW1lPiQoT3V0RGlyKXpsaWJ3YXBpLm1hcDwvTWFwRmlsZU5hbWU+DQorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+DQorICAgICAgPEltcG9ydExpYnJhcnk+JChPdXREaXIpemxpYndhcGkubGliPC9JbXBvcnRMaWJyYXJ5Pg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYNjQ8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgICAgPFByZUJ1aWxkRXZlbnQ+DQorICAgICAgPENvbW1hbmQ+Y2QgLi5cLi5cbWFzbXg2NA0KK2JsZF9tbDY0LmJhdDwvQ29tbWFuZD4NCisgICAgPC9QcmVCdWlsZEV2ZW50Pg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj4NCisgICAgPE1pZGw+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPk5ERUJVRzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1rVHlwTGliQ29tcGF0aWJsZT50cnVlPC9Na1R5cExpYkNvbXBhdGlibGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Pkl0YW5pdW08L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICAgIDxUeXBlTGlicmFyeU5hbWU+JChPdXREaXIpemxpYnZjLnRsYjwvVHlwZUxpYnJhcnlOYW1lPg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPk9ubHlFeHBsaWNpdElubGluZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWFzbXg4NjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7WkxJQl9XSU5BUEk7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWRETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPiQoSW50RGlyKXpsaWJ2Yy5wY2g8L1ByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4NCisgICAgICA8QXNzZW1ibGVyT3V0cHV0PkFsbDwvQXNzZW1ibGVyT3V0cHV0Pg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPE9iamVjdEZpbGVOYW1lPiQoSW50RGlyKTwvT2JqZWN0RmlsZU5hbWU+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKTwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDwvQnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxSZXNvdXJjZUNvbXBpbGU+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPk5ERUJVRzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEN1bHR1cmU+MHgwNDBjPC9DdWx0dXJlPg0KKyAgICA8L1Jlc291cmNlQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpemxpYndhcGkuZGxsPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICAgIDxJZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPmZhbHNlPC9JZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPg0KKyAgICAgIDxNb2R1bGVEZWZpbml0aW9uRmlsZT4uXHpsaWJ2Yy5kZWY8L01vZHVsZURlZmluaXRpb25GaWxlPg0KKyAgICAgIDxQcm9ncmFtRGF0YWJhc2VGaWxlPiQoT3V0RGlyKXpsaWJ3YXBpLnBkYjwvUHJvZ3JhbURhdGFiYXNlRmlsZT4NCisgICAgICA8R2VuZXJhdGVNYXBGaWxlPnRydWU8L0dlbmVyYXRlTWFwRmlsZT4NCisgICAgICA8TWFwRmlsZU5hbWU+JChPdXREaXIpemxpYndhcGkubWFwPC9NYXBGaWxlTmFtZT4NCisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4NCisgICAgICA8SW1wb3J0TGlicmFyeT4kKE91dERpcil6bGlid2FwaS5saWI8L0ltcG9ydExpYnJhcnk+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZUlBNjQ8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cYWRsZXIzMi5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGNvbXByZXNzLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cY3JjMzIuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxkZWZsYXRlLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cZ3pjbG9zZS5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGd6bGliLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cZ3pyZWFkLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cZ3p3cml0ZS5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZmJhY2suYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxtYXNteDY0XGluZmZhczg2NjQuYyI+DQorICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPg0KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+DQorICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPg0KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+DQorICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+DQorICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZmYXN0LmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mbGF0ZS5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZnRyZWVzLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbWluaXppcFxpb2FwaS5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXG1pbml6aXBcaW93aW4zMi5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHRyZWVzLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cdW5jb21wci5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXG1pbml6aXBcdW56aXAuYyI+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPlpMSUJfSU5URVJOQUw7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPlpMSUJfSU5URVJOQUw7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+WkxJQl9JTlRFUk5BTDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXG1pbml6aXBcemlwLmMiPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5aTElCX0lOVEVSTkFMOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5aTElCX0lOVEVSTkFMOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPlpMSUJfSU5URVJOQUw7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlx6dXRpbC5jIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVzb3VyY2VDb21waWxlIEluY2x1ZGU9InpsaWIucmMiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxOb25lIEluY2x1ZGU9InpsaWJ2Yy5kZWYiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cLi5cZGVmbGF0ZS5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZmJsb2NrLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mY29kZXMuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZmYXN0LmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mdHJlZXMuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZ1dGlsLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cLi5cemNvbmYuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlwuLlx6bGliLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cLi5cenV0aWwuaCIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmM5L21pbml1bnoudmNwcm9qIGIvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjOS9taW5pdW56LnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGEzMmI5Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjOS9taW5pdW56LnZjcHJvagpAQCAtMCwwICsxLDU2NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjkuMDAiDQorCU5hbWU9Im1pbml1bnoiDQorCVByb2plY3RHVUlEPSJ7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfSINCisJS2V5d29yZD0iV2luMzJQcm9qIg0KKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIxMzEwNzIiDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9Ing2NCINCisJCS8+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJJdGFuaXVtIg0KKwkJLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxUb29sRmlsZXM+DQorCTwvVG9vbEZpbGVzPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0ieDg2XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0ieDg2XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi47Li5cLi5cbWluaXppcCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO1pMSUJfV0lOQVBJO19ERUJVRztfQ09OU09MRSINCisJCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjEiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKEludERpcilcIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0ieDg2XFpsaWJEbGxEZWJ1Z1x6bGlid2FwaS5saWIiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9taW5pdW56LmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIyIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKE91dERpcikvbWluaXVuei5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJUmFuZG9taXplZEJhc2VBZGRyZXNzPSIxIg0KKwkJCQlEYXRhRXhlY3V0aW9uUHJldmVudGlvbj0iMCINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0ieDg2XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0ieDg2XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCU9taXRGcmFtZVBvaW50ZXJzPSJ0cnVlIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtaW5pemlwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7TkRFQlVHO19DT05TT0xFIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJ4ODZcWmxpYkRsbFJlbGVhc2VcemxpYndhcGkubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvbWluaXVuei5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVNYW5pZmVzdD0iZmFsc2UiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiDQorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiDQorCQkJCU9wdGltaXplRm9yV2luZG93czk4PSIxIg0KKwkJCQlSYW5kb21pemVkQmFzZUFkZHJlc3M9IjEiDQorCQkJCURhdGFFeGVjdXRpb25QcmV2ZW50aW9uPSIwIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfHg2NCINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ing2NFxNaW5pVW56aXAkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ing2NFxNaW5pVW56aXAkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IlVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtaW5pemlwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7X0RFQlVHO19DT05TT0xFO1dJTjY0Ig0KKwkJCQlNaW5pbWFsUmVidWlsZD0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMyINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJ4NjRcWmxpYkRsbERlYnVnXHpsaWJ3YXBpLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL21pbml1bnouZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS9taW5pdW56LnBkYiINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8SXRhbml1bSINCisJCQlPdXRwdXREaXJlY3Rvcnk9ImlhNjRcTWluaVVuemlwJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJpYTY0XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1pbml6aXAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7V0lONjQiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImlhNjRcWmxpYkRsbERlYnVnXHpsaWJ3YXBpLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL21pbml1bnouZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS9taW5pdW56LnBkYiINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSI1Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfHg2NCINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ing2NFxNaW5pVW56aXAkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ing2NFxNaW5pVW56aXAkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IlVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJT21pdEZyYW1lUG9pbnRlcnM9InRydWUiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1pbml6aXAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7V0lONjQiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ing2NFxabGliRGxsUmVsZWFzZVx6bGlid2FwaS5saWIiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9taW5pdW56LmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiINCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiINCisJCQkJT3B0aW1pemVGb3JXaW5kb3dzOTg9IjEiDQorCQkJCVRhcmdldE1hY2hpbmU9IjE3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfEl0YW5pdW0iDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJpYTY0XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iaWE2NFxNaW5pVW56aXAkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IlVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIyIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJT21pdEZyYW1lUG9pbnRlcnM9InRydWUiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1pbml6aXAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7V0lONjQiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImlhNjRcWmxpYkRsbFJlbGVhc2VcemxpYndhcGkubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvbWluaXVuei5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVNYW5pZmVzdD0iZmFsc2UiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiDQorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiDQorCQkJCU9wdGltaXplRm9yV2luZG93czk4PSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSI1Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtIg0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXG1pbml6aXBcbWluaXVuei5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmMiDQorCQkJPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iUmVzb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJyYztpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiDQorCQkJPg0KKwkJPC9GaWx0ZXI+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzkvbWluaXppcC52Y3Byb2ogYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmM5L21pbml6aXAudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1N2UwN2QKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmM5L21pbml6aXAudmNwcm9qCkBAIC0wLDAgKzEsNTYyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iOS4wMCINCisJTmFtZT0ibWluaXppcCINCisJUHJvamVjdEdVSUQ9Ins0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9Ig0KKwlLZXl3b3JkPSJXaW4zMlByb2oiDQorCVRhcmdldEZyYW1ld29ya1ZlcnNpb249IjEzMTA3MiINCisJPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiDQorCQkvPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0ieDY0Ig0KKwkJLz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9Ikl0YW5pdW0iDQorCQkvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPFRvb2xGaWxlcz4NCisJPC9Ub29sRmlsZXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJ4ODZcTWluaVppcCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0ieDg2XE1pbmlaaXAkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IlVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1pbml6aXAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEUiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ing4NlxabGliRGxsRGVidWdcemxpYndhcGkubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvbWluaXppcC5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiINCisJCQkJR2VuZXJhdGVNYW5pZmVzdD0iZmFsc2UiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL21pbml6aXAucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCVJhbmRvbWl6ZWRCYXNlQWRkcmVzcz0iMSINCisJCQkJRGF0YUV4ZWN1dGlvblByZXZlbnRpb249IjAiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ing4NlxNaW5pWmlwJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4ODZcTWluaVppcCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCU9taXRGcmFtZVBvaW50ZXJzPSJ0cnVlIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtaW5pemlwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7TkRFQlVHO19DT05TT0xFIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJ4ODZcWmxpYkRsbFJlbGVhc2VcemxpYndhcGkubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvbWluaXppcC5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiINCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiINCisJCQkJT3B0aW1pemVGb3JXaW5kb3dzOTg9IjEiDQorCQkJCVJhbmRvbWl6ZWRCYXNlQWRkcmVzcz0iMSINCisJCQkJRGF0YUV4ZWN1dGlvblByZXZlbnRpb249IjAiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8eDY0Ig0KKwkJCU91dHB1dERpcmVjdG9yeT0ieDY0XCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0ieDY0XCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSJVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi47Li5cLi5cbWluaXppcCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO1pMSUJfV0lOQVBJO19ERUJVRztfQ09OU09MRTtXSU42NCINCisJCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjMiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKEludERpcilcIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0ieDY0XFpsaWJEbGxEZWJ1Z1x6bGlid2FwaS5saWIiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9taW5pemlwLmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIyIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKE91dERpcikvbWluaXppcC5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJVGFyZ2V0TWFjaGluZT0iMTciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfEl0YW5pdW0iDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJpYTY0XCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iaWE2NFwkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1pbml6aXAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7V0lONjQiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImlhNjRcWmxpYkRsbERlYnVnXHpsaWJ3YXBpLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL21pbml6aXAuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS9taW5pemlwLnBkYiINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSI1Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfHg2NCINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ing2NFwkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ing2NFwkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlPbWl0RnJhbWVQb2ludGVycz0idHJ1ZSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi47Li5cLi5cbWluaXppcCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO1pMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTtXSU42NCINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKEludERpcilcIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0ieDY0XFpsaWJEbGxSZWxlYXNlXHpsaWJ3YXBpLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL21pbml6aXAuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiDQorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiDQorCQkJCU9wdGltaXplRm9yV2luZG93czk4PSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxJdGFuaXVtIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iaWE2NFwkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9ImlhNjRcJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IlVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIyIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJT21pdEZyYW1lUG9pbnRlcnM9InRydWUiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1pbml6aXAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7V0lONjQiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImlhNjRcWmxpYkRsbFJlbGVhc2VcemxpYndhcGkubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvbWluaXppcC5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiINCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiINCisJCQkJT3B0aW1pemVGb3JXaW5kb3dzOTg9IjEiDQorCQkJCVRhcmdldE1hY2hpbmU9IjUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc20iDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cbWluaXppcFxtaW5pemlwLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYyINCisJCQk+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9InJjO2ljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSINCisJCQk+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjOS90ZXN0emxpYi52Y3Byb2ogYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmM5L3Rlc3R6bGliLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2IwYmY4Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjOS90ZXN0emxpYi52Y3Byb2oKQEAgLTAsMCArMSw4NTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI5LDAwIg0KKwlOYW1lPSJ0ZXN0emxpYiINCisJUHJvamVjdEdVSUQ9IntBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9Ig0KKwlSb290TmFtZXNwYWNlPSJ0ZXN0emxpYiINCisJS2V5d29yZD0iV2luMzJQcm9qIg0KKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIxMzEwNzIiDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9Ing2NCINCisJCS8+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJJdGFuaXVtIg0KKwkJLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxUb29sRmlsZXM+DQorCTwvVG9vbEZpbGVzPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0ieDg2XFRlc3RabGliJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4ODZcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi4iDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJBU01WO0FTTUlORjtXSU4zMjtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTIg0KKwkJCQlNaW5pbWFsUmVidWlsZD0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMSINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlBc3NlbWJsZXJPdXRwdXQ9IjQiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ii4uXC4uXG1hc214ODZcbWF0Y2g2ODYub2JqIC4uXC4uXG1hc214ODZcaW5mZmFzMzIub2JqIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvdGVzdHpsaWIuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS90ZXN0emxpYi5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJUmFuZG9taXplZEJhc2VBZGRyZXNzPSIxIg0KKwkJCQlEYXRhRXhlY3V0aW9uUHJldmVudGlvbj0iMCINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3x4NjQiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJ4NjRcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ing2NFxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLiINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IkFTTVY7QVNNSU5GO1dJTjMyO1pMSUJfV0lOQVBJO19ERUJVRztfQ09OU09MRTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1MiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjMiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ii4uXC4uXG1hc214NjRcZ3ZtYXQ2NC5vYmogLi5cLi5cbWFzbXg2NFxpbmZmYXN4NjQub2JqIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xJdGFuaXVtIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iaWE2NFxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iaWE2NFxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi4iDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjY0Ig0KKwkJCQlNaW5pbWFsUmVidWlsZD0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMyINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlBc3NlbWJsZXJPdXRwdXQ9IjQiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS90ZXN0emxpYi5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiINCisJCQkJR2VuZXJhdGVNYW5pZmVzdD0iZmFsc2UiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL3Rlc3R6bGliLnBkYiINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSI1Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VXaXRob3V0QXNtfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0ieDg2XFRlc3RabGliJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4ODZcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlPbWl0RnJhbWVQb2ludGVycz0idHJ1ZSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi4iDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvdGVzdHpsaWIuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KKwkJCQlPcHRpbWl6ZUZvcldpbmRvd3M5OD0iMSINCisJCQkJUmFuZG9taXplZEJhc2VBZGRyZXNzPSIxIg0KKwkJCQlEYXRhRXhlY3V0aW9uUHJldmVudGlvbj0iMCINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlV2l0aG91dEFzbXx4NjQiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJ4NjRcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ing2NFxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi4iDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKEludERpcilcIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSIiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0iDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJpYTY0XFRlc3RabGliJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJpYTY0XFRlc3RabGliJChDb25maWd1cmF0aW9uTmFtZSlcVG1wIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCU9taXRGcmFtZVBvaW50ZXJzPSJ0cnVlIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLiINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IlpMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lONjQiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS90ZXN0emxpYi5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVNYW5pZmVzdD0iZmFsc2UiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiDQorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiDQorCQkJCU9wdGltaXplRm9yV2luZG93czk4PSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSI1Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJ4ODZcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ing4NlxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCU9taXRGcmFtZVBvaW50ZXJzPSJ0cnVlIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLiINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IkFTTVY7QVNNSU5GO1dJTjMyO1pMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1MiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjAiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ii4uXC4uXG1hc214ODZcbWF0Y2g2ODYub2JqIC4uXC4uXG1hc214ODZcaW5mZmFzMzIub2JqIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvdGVzdHpsaWIuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KKwkJCQlPcHRpbWl6ZUZvcldpbmRvd3M5OD0iMSINCisJCQkJUmFuZG9taXplZEJhc2VBZGRyZXNzPSIxIg0KKwkJCQlEYXRhRXhlY3V0aW9uUHJldmVudGlvbj0iMCINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfHg2NCINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ing2NFxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0ieDY0XFRlc3RabGliJChDb25maWd1cmF0aW9uTmFtZSlcVG1wIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLiINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IkFTTVY7QVNNSU5GO1dJTjMyO1pMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1MiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjAiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ii4uXC4uXG1hc214NjRcZ3ZtYXQ2NC5vYmogLi5cLi5cbWFzbXg2NFxpbmZmYXN4NjQub2JqIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfEl0YW5pdW0iDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJpYTY0XFRlc3RabGliJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJpYTY0XFRlc3RabGliJChDb25maWd1cmF0aW9uTmFtZSlcVG1wIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCU9taXRGcmFtZVBvaW50ZXJzPSJ0cnVlIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLiINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IlpMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lONjQiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS90ZXN0emxpYi5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVNYW5pZmVzdD0iZmFsc2UiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiDQorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiDQorCQkJCU9wdGltaXplRm9yV2luZG93czk4PSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSI1Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc20iDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cYWRsZXIzMi5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cY29tcHJlc3MuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGNyYzMyLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxkZWZsYXRlLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxpbmZiYWNrLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxtYXNteDY0XGluZmZhczg2NjQuYyINCisJCQkJPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfEl0YW5pdW0iDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZVdpdGhvdXRBc218V2luMzIiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8SXRhbml1bSINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxpbmZmYXN0LmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxpbmZsYXRlLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxpbmZ0cmVlcy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cdGVzdHpsaWJcdGVzdHpsaWIuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHRyZWVzLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx1bmNvbXByLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx6dXRpbC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmMiDQorCQkJPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iUmVzb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJyYztpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiDQorCQkJPg0KKwkJPC9GaWx0ZXI+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzkvdGVzdHpsaWJkbGwudmNwcm9qIGIvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjOS90ZXN0emxpYmRsbC52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFkZGRlMAotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzkvdGVzdHpsaWJkbGwudmNwcm9qCkBAIC0wLDAgKzEsNTY1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iOS4wMCINCisJTmFtZT0iVGVzdFpsaWJEbGwiDQorCVByb2plY3RHVUlEPSJ7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfSINCisJS2V5d29yZD0iV2luMzJQcm9qIg0KKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIxMzEwNzIiDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9Ing2NCINCisJCS8+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJJdGFuaXVtIg0KKwkJLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxUb29sRmlsZXM+DQorCTwvVG9vbEZpbGVzPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0ieDg2XFRlc3RabGliRGxsJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4ODZcVGVzdFpsaWJEbGwkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IlVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1pbml6aXAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEUiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ing4NlxabGliRGxsRGVidWdcemxpYndhcGkubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvdGVzdHpsaWIuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS90ZXN0emxpYi5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJUmFuZG9taXplZEJhc2VBZGRyZXNzPSIxIg0KKwkJCQlEYXRhRXhlY3V0aW9uUHJldmVudGlvbj0iMCINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0ieDg2XFRlc3RabGliRGxsJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4ODZcVGVzdFpsaWJEbGwkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IlVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlPbWl0RnJhbWVQb2ludGVycz0idHJ1ZSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi47Li5cLi5cbWluaXppcCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO1pMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRSINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMCINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKEludERpcilcIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0ieDg2XFpsaWJEbGxSZWxlYXNlXHpsaWJ3YXBpLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL3Rlc3R6bGliLmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiINCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiINCisJCQkJT3B0aW1pemVGb3JXaW5kb3dzOTg9IjEiDQorCQkJCVJhbmRvbWl6ZWRCYXNlQWRkcmVzcz0iMSINCisJCQkJRGF0YUV4ZWN1dGlvblByZXZlbnRpb249IjAiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8eDY0Ig0KKwkJCU91dHB1dERpcmVjdG9yeT0ieDY0XFRlc3RabGliRGxsJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4NjRcVGVzdFpsaWJEbGwkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IlVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtaW5pemlwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7X0RFQlVHO19DT05TT0xFO1dJTjY0Ig0KKwkJCQlNaW5pbWFsUmVidWlsZD0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMyINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJ4NjRcWmxpYkRsbERlYnVnXHpsaWJ3YXBpLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL3Rlc3R6bGliLmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIyIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKE91dERpcikvdGVzdHpsaWIucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCVRhcmdldE1hY2hpbmU9IjE3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xJdGFuaXVtIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iaWE2NFxUZXN0WmxpYkRsbCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iaWE2NFxUZXN0WmxpYkRsbCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1pbml6aXAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7V0lONjQiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImlhNjRcWmxpYkRsbERlYnVnXHpsaWJ3YXBpLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL3Rlc3R6bGliLmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIyIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKE91dERpcikvdGVzdHpsaWIucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCVRhcmdldE1hY2hpbmU9IjUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8eDY0Ig0KKwkJCU91dHB1dERpcmVjdG9yeT0ieDY0XFRlc3RabGliRGxsJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4NjRcVGVzdFpsaWJEbGwkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IlVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJT21pdEZyYW1lUG9pbnRlcnM9InRydWUiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1pbml6aXAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7V0lONjQiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ing2NFxabGliRGxsUmVsZWFzZVx6bGlid2FwaS5saWIiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS90ZXN0emxpYi5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVNYW5pZmVzdD0iZmFsc2UiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiDQorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiDQorCQkJCU9wdGltaXplRm9yV2luZG93czk4PSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxJdGFuaXVtIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iaWE2NFxUZXN0WmxpYkRsbCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iaWE2NFxUZXN0WmxpYkRsbCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlPbWl0RnJhbWVQb2ludGVycz0idHJ1ZSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi47Li5cLi5cbWluaXppcCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO1pMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTtXSU42NCINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKEludERpcilcIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iaWE2NFxabGliRGxsUmVsZWFzZVx6bGlid2FwaS5saWIiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS90ZXN0emxpYi5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVNYW5pZmVzdD0iZmFsc2UiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiDQorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiDQorCQkJCU9wdGltaXplRm9yV2luZG93czk4PSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSI1Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtIg0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHRlc3R6bGliXHRlc3R6bGliLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYyINCisJCQk+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9InJjO2ljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSINCisJCQk+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjOS96bGliLnJjIGIvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjOS96bGliLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZjY0NzYKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmM5L3psaWIucmMKQEAgLTAsMCArMSwzMiBAQAorI2luY2x1ZGUgPHdpbmRvd3MuaD4NCisNCisjZGVmaW5lIElEUl9WRVJTSU9OMSAgMQ0KK0lEUl9WRVJTSU9OMQlWRVJTSU9OSU5GTwlNT1ZFQUJMRSBJTVBVUkUgTE9BRE9OQ0FMTCBESVNDQVJEQUJMRQ0KKyAgRklMRVZFUlNJT04JIDEsMiw4LDANCisgIFBST0RVQ1RWRVJTSU9OIDEsMiw4LDANCisgIEZJTEVGTEFHU01BU0sJVlNfRkZJX0ZJTEVGTEFHU01BU0sNCisgIEZJTEVGTEFHUwkwDQorICBGSUxFT1MJVk9TX0RPU19XSU5ET1dTMzINCisgIEZJTEVUWVBFCVZGVF9ETEwNCisgIEZJTEVTVUJUWVBFCTAJLy8gbm90IHVzZWQNCitCRUdJTg0KKyAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIg0KKyAgQkVHSU4NCisgICAgQkxPQ0sgIjA0MDkwNEU0Ig0KKyAgICAvL2xhbmd1YWdlIElEID0gVS5TLiBFbmdsaXNoLCBjaGFyIHNldCA9IFdpbmRvd3MsIE11bHRpbGluZ3VhbA0KKw0KKyAgICBCRUdJTg0KKyAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAiemxpYiBkYXRhIGNvbXByZXNzaW9uIGFuZCBaSVAgZmlsZSBJL08gbGlicmFyeVwwIg0KKyAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsCSIxLjIuOFwwIg0KKyAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLAkiemxpYlwwIg0KKyAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwJInpsaWJ3YXBpLmRsbFwwIg0KKyAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsCSJaTGliLkRMTFwwIg0KKyAgICAgIFZBTFVFICJDb21tZW50cyIsIkRMTCBzdXBwb3J0IGJ5IEFsZXNzYW5kcm8gSWFjb3BldHRpICYgR2lsbGVzIFZvbGxhbnRcMCINCisgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5ICYgTWFyayBBZGxlclwwIg0KKyAgICBFTkQNCisgIEVORA0KKyAgQkxPQ0sgIlZhckZpbGVJbmZvIg0KKyAgQkVHSU4NCisgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHgwNDA5LCAxMjUyDQorICBFTkQNCitFTkQNCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmM5L3psaWJzdGF0LnZjcHJvaiBiL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzkvemxpYnN0YXQudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYzc2YzcKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmM5L3psaWJzdGF0LnZjcHJvagpAQCAtMCwwICsxLDgzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjksMDAiDQorCU5hbWU9InpsaWJzdGF0Ig0KKwlQcm9qZWN0R1VJRD0iezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0iDQorCVRhcmdldEZyYW1ld29ya1ZlcnNpb249IjEzMTA3MiINCisJPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiDQorCQkvPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0ieDY0Ig0KKwkJLz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9Ikl0YW5pdW0iDQorCQkvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPFRvb2xGaWxlcz4NCisJPC9Ub29sRmlsZXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJ4ODZcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ing4NlxabGliU3RhdCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi47Li5cLi5cbWFzbXg4NiINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO1pMSUJfV0lOQVBJO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUyINCisJCQkJRXhjZXB0aW9uSGFuZGxpbmc9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIkKEludERpcikvemxpYnN0YXQucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCU9iamVjdEZpbGU9IiQoSW50RGlyKVwiDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKE91dERpcilcIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIxIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlDdWx0dXJlPSIxMDM2Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL01BQ0hJTkU6WDg2IC9OT0RFRkFVTFRMSUIiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVx6bGlic3RhdC5saWIiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfHg2NCINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ing2NFxabGliU3RhdCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0ieDY0XFpsaWJTdGF0JChDb25maWd1cmF0aW9uTmFtZSlcVG1wIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSJVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi47Li5cLi5cbWFzbXg4NiINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IlpMSUJfV0lOQVBJO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU42NCINCisJCQkJRXhjZXB0aW9uSGFuZGxpbmc9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIkKEludERpcikvemxpYnN0YXQucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCU9iamVjdEZpbGU9IiQoSW50RGlyKVwiDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKE91dERpcilcIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIxIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlDdWx0dXJlPSIxMDM2Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL01BQ0hJTkU6QU1ENjQgL05PREVGQVVMVExJQiINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpXHpsaWJzdGF0LmxpYiINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8SXRhbml1bSINCisJCQlPdXRwdXREaXJlY3Rvcnk9ImlhNjRcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9ImlhNjRcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IlVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIyIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtYXNteDg2Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iWkxJQl9XSU5BUEk7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjY0Ig0KKwkJCQlFeGNlcHRpb25IYW5kbGluZz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjMiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiQoSW50RGlyKS96bGlic3RhdC5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJT2JqZWN0RmlsZT0iJChJbnREaXIpXCINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9IiQoT3V0RGlyKVwiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCUN1bHR1cmU9IjEwMzYiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvTUFDSElORTpJQTY0IC9OT0RFRkFVTFRMSUIiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVx6bGlic3RhdC5saWIiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJ4ODZcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ing4NlxabGliU3RhdCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtYXNteDg2Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7WkxJQl9XSU5BUEk7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO0FTTVY7QVNNSU5GIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlFeGNlcHRpb25IYW5kbGluZz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjAiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIkKEludERpcikvemxpYnN0YXQucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCU9iamVjdEZpbGU9IiQoSW50RGlyKVwiDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKE91dERpcilcIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJQ3VsdHVyZT0iMTAzNiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9NQUNISU5FOlg4NiAvTk9ERUZBVUxUTElCIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSIuLlwuLlxtYXNteDg2XG1hdGNoNjg2Lm9iaiAuLlwuLlxtYXNteDg2XGluZmZhczMyLm9iaiAiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVx6bGlic3RhdC5saWIiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8eDY0Ig0KKwkJCU91dHB1dERpcmVjdG9yeT0ieDY0XFpsaWJTdGF0JChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4NjRcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IlVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1hc214ODYiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJaTElCX1dJTkFQSTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7QVNNVjtBU01JTkY7V0lONjQiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUV4Y2VwdGlvbkhhbmRsaW5nPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiQoSW50RGlyKS96bGlic3RhdC5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJT2JqZWN0RmlsZT0iJChJbnREaXIpXCINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9IiQoT3V0RGlyKVwiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlDdWx0dXJlPSIxMDM2Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL01BQ0hJTkU6QU1ENjQgL05PREVGQVVMVExJQiINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iLi5cLi5cbWFzbXg2NFxndm1hdDY0Lm9iaiAuLlwuLlxtYXNteDY0XGluZmZhc3g2NC5vYmogIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcilcemxpYnN0YXQubGliIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfEl0YW5pdW0iDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJpYTY0XFpsaWJTdGF0JChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJpYTY0XFpsaWJTdGF0JChDb25maWd1cmF0aW9uTmFtZSlcVG1wIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSJVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtYXNteDg2Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iWkxJQl9XSU5BUEk7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjY0Ig0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlFeGNlcHRpb25IYW5kbGluZz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIkKEludERpcikvemxpYnN0YXQucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCU9iamVjdEZpbGU9IiQoSW50RGlyKVwiDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKE91dERpcilcIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJQ3VsdHVyZT0iMTAzNiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9NQUNISU5FOklBNjQgL05PREVGQVVMVExJQiINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpXHpsaWJzdGF0LmxpYiINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZVdpdGhvdXRBc218V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJ4ODZcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ing4NlxabGliU3RhdCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtYXNteDg2Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7WkxJQl9XSU5BUEk7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlFeGNlcHRpb25IYW5kbGluZz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjAiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIkKEludERpcikvemxpYnN0YXQucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCU9iamVjdEZpbGU9IiQoSW50RGlyKVwiDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKE91dERpcilcIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJQ3VsdHVyZT0iMTAzNiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9NQUNISU5FOlg4NiAvTk9ERUZBVUxUTElCIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcilcemxpYnN0YXQubGliIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlV2l0aG91dEFzbXx4NjQiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJ4NjRcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ing2NFxabGliU3RhdCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi47Li5cLi5cbWFzbXg4NiINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IlpMSUJfV0lOQVBJO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU42NCINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJRXhjZXB0aW9uSGFuZGxpbmc9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iJChJbnREaXIpL3psaWJzdGF0LnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKEludERpcilcIg0KKwkJCQlPYmplY3RGaWxlPSIkKEludERpcilcIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iJChPdXREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCUN1bHR1cmU9IjEwMzYiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvTUFDSElORTpBTUQ2NCAvTk9ERUZBVUxUTElCIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcilcemxpYnN0YXQubGliIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iaWE2NFxabGliU3RhdCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iaWE2NFxabGliU3RhdCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi47Li5cLi5cbWFzbXg4NiINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IlpMSUJfV0lOQVBJO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU42NCINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJRXhjZXB0aW9uSGFuZGxpbmc9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iJChJbnREaXIpL3psaWJzdGF0LnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKEludERpcilcIg0KKwkJCQlPYmplY3RGaWxlPSIkKEludERpcilcIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iJChPdXREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCUN1bHR1cmU9IjEwMzYiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvTUFDSElORTpJQTY0IC9OT0RFRkFVTFRMSUIiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVx6bGlic3RhdC5saWIiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cYWRsZXIzMi5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cY29tcHJlc3MuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGNyYzMyLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxkZWZsYXRlLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxnemNsb3NlLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxnemd1dHMuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGd6bGliLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxnenJlYWQuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGd6d3JpdGUuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluZmJhY2suYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXG1hc214NjRcaW5mZmFzODY2NC5jIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8SXRhbml1bSINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8SXRhbml1bSINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluZmZhc3QuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluZmxhdGUuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluZnRyZWVzLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxtaW5pemlwXGlvYXBpLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx0cmVlcy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cdW5jb21wci5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cbWluaXppcFx1bnppcC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cbWluaXppcFx6aXAuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cemxpYi5yYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cemxpYnZjLmRlZiINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHp1dGlsLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjOS96bGlidmMuZGVmIGIvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjOS96bGlidmMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNjcwNDYKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmM5L3psaWJ2Yy5kZWYKQEAgLTAsMCArMSwxNDMgQEAKK0xJQlJBUlkNCis7IHpsaWIgZGF0YSBjb21wcmVzc2lvbiBhbmQgWklQIGZpbGUgSS9PIGxpYnJhcnkNCisNCitWRVJTSU9OCQkxLjIuOA0KKw0KK0VYUE9SVFMNCisgICAgICAgIGFkbGVyMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDENCisgICAgICAgIGNvbXByZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDINCisgICAgICAgIGNyYzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDMNCisgICAgICAgIGRlZmxhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQNCisgICAgICAgIGRlZmxhdGVDb3B5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDUNCisgICAgICAgIGRlZmxhdGVFbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDYNCisgICAgICAgIGRlZmxhdGVJbml0Ml8gICAgICAgICAgICAgICAgICAgICAgICAgICAgQDcNCisgICAgICAgIGRlZmxhdGVJbml0XyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDgNCisgICAgICAgIGRlZmxhdGVQYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDkNCisgICAgICAgIGRlZmxhdGVSZXNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEwDQorICAgICAgICBkZWZsYXRlU2V0RGljdGlvbmFyeSAgICAgICAgICAgICAgICAgICAgIEAxMQ0KKyAgICAgICAgZ3pjbG9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTINCisgICAgICAgIGd6ZG9wZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEzDQorICAgICAgICBnemVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNA0KKyAgICAgICAgZ3pmbHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTUNCisgICAgICAgIGd6b3BlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE2DQorICAgICAgICBnenJlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNw0KKyAgICAgICAgZ3p3cml0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTgNCisgICAgICAgIGluZmxhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE5DQorICAgICAgICBpbmZsYXRlRW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyMA0KKyAgICAgICAgaW5mbGF0ZUluaXQyXyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjENCisgICAgICAgIGluZmxhdGVJbml0XyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDIyDQorICAgICAgICBpbmZsYXRlUmVzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyMw0KKyAgICAgICAgaW5mbGF0ZVNldERpY3Rpb25hcnkgICAgICAgICAgICAgICAgICAgICBAMjQNCisgICAgICAgIGluZmxhdGVTeW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDI1DQorICAgICAgICB1bmNvbXByZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyNg0KKyAgICAgICAgemxpYlZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjcNCisgICAgICAgIGd6cHJpbnRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDI4DQorICAgICAgICBnenB1dGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyOQ0KKyAgICAgICAgZ3pnZXRjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzANCisgICAgICAgIGd6c2VlayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDMxDQorICAgICAgICBnenJld2luZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAzMg0KKyAgICAgICAgZ3p0ZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzMNCisgICAgICAgIGd6ZW9mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDM0DQorICAgICAgICBnenNldHBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAzNQ0KKyAgICAgICAgekVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzYNCisgICAgICAgIGluZmxhdGVTeW5jUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgQDM3DQorICAgICAgICBnZXRfY3JjX3RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAzOA0KKyAgICAgICAgY29tcHJlc3MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzkNCisgICAgICAgIGd6cHV0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQwDQorICAgICAgICBnemdldHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA0MQ0KKyAgICAgICAgaW5mbGF0ZUNvcHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANDINCisgICAgICAgIGluZmxhdGVCYWNrSW5pdF8gICAgICAgICAgICAgICAgICAgICAgICAgQDQzDQorICAgICAgICBpbmZsYXRlQmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA0NA0KKyAgICAgICAgaW5mbGF0ZUJhY2tFbmQgICAgICAgICAgICAgICAgICAgICAgICAgICBANDUNCisgICAgICAgIGNvbXByZXNzQm91bmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQ2DQorICAgICAgICBkZWZsYXRlQm91bmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA0Nw0KKyAgICAgICAgZ3pjbGVhcmVyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANDgNCisgICAgICAgIGd6dW5nZXRjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQ5DQorICAgICAgICB6bGliQ29tcGlsZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgIEA1MA0KKyAgICAgICAgZGVmbGF0ZVByaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANTENCisgICAgICAgIGRlZmxhdGVQZW5kaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgQDUyDQorDQorICAgICAgICB1bnpPcGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA2MQ0KKyAgICAgICAgdW56Q2xvc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANjINCisgICAgICAgIHVuekdldEdsb2JhbEluZm8gICAgICAgICAgICAgICAgICAgICAgICAgQDYzDQorICAgICAgICB1bnpHZXRDdXJyZW50RmlsZUluZm8gICAgICAgICAgICAgICAgICAgIEA2NA0KKyAgICAgICAgdW56R29Ub0ZpcnN0RmlsZSAgICAgICAgICAgICAgICAgICAgICAgICBANjUNCisgICAgICAgIHVuekdvVG9OZXh0RmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgQDY2DQorICAgICAgICB1bnpPcGVuQ3VycmVudEZpbGUgICAgICAgICAgICAgICAgICAgICAgIEA2Nw0KKyAgICAgICAgdW56UmVhZEN1cnJlbnRGaWxlICAgICAgICAgICAgICAgICAgICAgICBANjgNCisgICAgICAgIHVuek9wZW5DdXJyZW50RmlsZTMgICAgICAgICAgICAgICAgICAgICAgQDY5DQorICAgICAgICB1bnp0ZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA3MA0KKyAgICAgICAgdW56ZW9mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANzENCisgICAgICAgIHVuekNsb3NlQ3VycmVudEZpbGUgICAgICAgICAgICAgICAgICAgICAgQDcyDQorICAgICAgICB1bnpHZXRHbG9iYWxDb21tZW50ICAgICAgICAgICAgICAgICAgICAgIEA3Mw0KKyAgICAgICAgdW56U3RyaW5nRmlsZU5hbWVDb21wYXJlICAgICAgICAgICAgICAgICBANzQNCisgICAgICAgIHVuekxvY2F0ZUZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDc1DQorICAgICAgICB1bnpHZXRMb2NhbEV4dHJhZmllbGQgICAgICAgICAgICAgICAgICAgIEA3Ng0KKyAgICAgICAgdW56T3BlbjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANzcNCisgICAgICAgIHVuek9wZW5DdXJyZW50RmlsZTIgICAgICAgICAgICAgICAgICAgICAgQDc4DQorICAgICAgICB1bnpPcGVuQ3VycmVudEZpbGVQYXNzd29yZCAgICAgICAgICAgICAgIEA3OQ0KKw0KKyAgICAgICAgemlwT3BlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAODANCisgICAgICAgIHppcE9wZW5OZXdGaWxlSW5aaXAgICAgICAgICAgICAgICAgICAgICAgQDgxDQorICAgICAgICB6aXBXcml0ZUluRmlsZUluWmlwICAgICAgICAgICAgICAgICAgICAgIEA4Mg0KKyAgICAgICAgemlwQ2xvc2VGaWxlSW5aaXAgICAgICAgICAgICAgICAgICAgICAgICBAODMNCisgICAgICAgIHppcENsb3NlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDg0DQorICAgICAgICB6aXBPcGVuTmV3RmlsZUluWmlwMiAgICAgICAgICAgICAgICAgICAgIEA4Ng0KKyAgICAgICAgemlwQ2xvc2VGaWxlSW5aaXBSYXcgICAgICAgICAgICAgICAgICAgICBAODcNCisgICAgICAgIHppcE9wZW4yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDg4DQorICAgICAgICB6aXBPcGVuTmV3RmlsZUluWmlwMyAgICAgICAgICAgICAgICAgICAgIEA4OQ0KKw0KKyAgICAgICAgdW56R2V0RmlsZVBvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTAwDQorICAgICAgICB1bnpHb1RvRmlsZVBvcyAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxMDENCisNCisgICAgICAgIGZpbGxfd2luMzJfZmlsZWZ1bmMgICAgICAgICAgICAgICAgICAgICAgQDExMA0KKw0KKzsgemxpYndhcGkgdjEuMi40IGFkZGVkOg0KKyAgICAgICAgZmlsbF93aW4zMl9maWxlZnVuYzY0ICAgICAgICAgICAgICAgICAgIEAxMTENCisgICAgICAgIGZpbGxfd2luMzJfZmlsZWZ1bmM2NEEgICAgICAgICAgICAgICAgICBAMTEyDQorICAgICAgICBmaWxsX3dpbjMyX2ZpbGVmdW5jNjRXICAgICAgICAgICAgICAgICAgQDExMw0KKw0KKyAgICAgICAgdW56T3BlbjY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxMjANCisgICAgICAgIHVuek9wZW4yXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTIxDQorICAgICAgICB1bnpHZXRHbG9iYWxJbmZvNjQgICAgICAgICAgICAgICAgICAgICAgQDEyMg0KKyAgICAgICAgdW56R2V0Q3VycmVudEZpbGVJbmZvNjQgICAgICAgICAgICAgICAgIEAxMjQNCisgICAgICAgIHVuekdldEN1cnJlbnRGaWxlWlN0cmVhbVBvczY0ICAgICAgICAgICBAMTI1DQorICAgICAgICB1bnp0ZWxsNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEyNg0KKyAgICAgICAgdW56R2V0RmlsZVBvczY0ICAgICAgICAgICAgICAgICAgICAgICAgIEAxMjcNCisgICAgICAgIHVuekdvVG9GaWxlUG9zNjQgICAgICAgICAgICAgICAgICAgICAgICBAMTI4DQorDQorICAgICAgICB6aXBPcGVuNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEzMA0KKyAgICAgICAgemlwT3BlbjJfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxMzENCisgICAgICAgIHppcE9wZW5OZXdGaWxlSW5aaXA2NCAgICAgICAgICAgICAgICAgICBAMTMyDQorICAgICAgICB6aXBPcGVuTmV3RmlsZUluWmlwMl82NCAgICAgICAgICAgICAgICAgQDEzMw0KKyAgICAgICAgemlwT3Blbk5ld0ZpbGVJblppcDNfNjQgICAgICAgICAgICAgICAgIEAxMzQNCisgICAgICAgIHppcE9wZW5OZXdGaWxlSW5aaXA0XzY0ICAgICAgICAgICAgICAgICBAMTM1DQorICAgICAgICB6aXBDbG9zZUZpbGVJblppcFJhdzY0ICAgICAgICAgICAgICAgICAgQDEzNg0KKw0KKzsgemxpYjEgdjEuMi40IGFkZGVkOg0KKyAgICAgICAgYWRsZXIzMl9jb21iaW5lICAgICAgICAgICAgICAgICAgICAgICAgIEAxNDANCisgICAgICAgIGNyYzMyX2NvbWJpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTQyDQorICAgICAgICBkZWZsYXRlU2V0SGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgQDE0NA0KKyAgICAgICAgZGVmbGF0ZVR1bmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNDUNCisgICAgICAgIGd6YnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTQ2DQorICAgICAgICBnemNsb3NlX3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE0Nw0KKyAgICAgICAgZ3pjbG9zZV93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNDgNCisgICAgICAgIGd6ZGlyZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTQ5DQorICAgICAgICBnem9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE1MA0KKyAgICAgICAgaW5mbGF0ZUdldEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIEAxNTYNCisgICAgICAgIGluZmxhdGVNYXJrICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTU3DQorICAgICAgICBpbmZsYXRlUHJpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE1OA0KKyAgICAgICAgaW5mbGF0ZVJlc2V0MiAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNTkNCisgICAgICAgIGluZmxhdGVVbmRlcm1pbmUgICAgICAgICAgICAgICAgICAgICAgICBAMTYwDQorDQorOyB6bGliMSB2MS4yLjYgYWRkZWQ6DQorICAgICAgICBnemdldGNfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE2MQ0KKyAgICAgICAgaW5mbGF0ZVJlc2V0S2VlcCAgICAgICAgICAgICAgICAgICAgICAgIEAxNjMNCisgICAgICAgIGRlZmxhdGVSZXNldEtlZXAgICAgICAgICAgICAgICAgICAgICAgICBAMTY0DQorDQorOyB6bGliMSB2MS4yLjcgYWRkZWQ6DQorICAgICAgICBnem9wZW5fdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE2NQ0KKw0KKzsgemxpYjEgdjEuMi44IGFkZGVkOg0KKyAgICAgICAgaW5mbGF0ZUdldERpY3Rpb25hcnkgICAgICAgICAgICAgICAgICAgIEAxNjYNCisgICAgICAgIGd6dnByaW50ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTY3DQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjOS96bGlidmMuc2xuIGIvemxpYi9zcmMvY29udHJpYi92c3R1ZGlvL3ZjOS96bGlidmMuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ODI5NjcKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmM5L3psaWJ2Yy5zbG4KQEAgLTAsMCArMSwxNDQgQEAKK++7vw0KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEwLjAwDQorIyBWaXN1YWwgU3R1ZGlvIDIwMDgNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInpsaWJ2YyIsICJ6bGlidmMudmNwcm9qIiwgIns4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInpsaWJzdGF0IiwgInpsaWJzdGF0LnZjcHJvaiIsICJ7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJ0ZXN0emxpYiIsICJ0ZXN0emxpYi52Y3Byb2oiLCAie0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiVGVzdFpsaWJEbGwiLCAidGVzdHpsaWJkbGwudmNwcm9qIiwgIntDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfSA9IHs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAibWluaXppcCIsICJtaW5pemlwLnZjcHJvaiIsICJ7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfSINCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0gPSB7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfQ0KKwlFbmRQcm9qZWN0U2VjdGlvbg0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIm1pbml1bnoiLCAibWluaXVuei52Y3Byb2oiLCAie0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9ID0gezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0NCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorR2xvYmFsDQorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uDQorCQlEZWJ1Z3xJdGFuaXVtID0gRGVidWd8SXRhbml1bQ0KKwkJRGVidWd8V2luMzIgPSBEZWJ1Z3xXaW4zMg0KKwkJRGVidWd8eDY0ID0gRGVidWd8eDY0DQorCQlSZWxlYXNlfEl0YW5pdW0gPSBSZWxlYXNlfEl0YW5pdW0NCisJCVJlbGVhc2V8V2luMzIgPSBSZWxlYXNlfFdpbjMyDQorCQlSZWxlYXNlfHg2NCA9IFJlbGVhc2V8eDY0DQorCQlSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtID0gUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bQ0KKwkJUmVsZWFzZVdpdGhvdXRBc218V2luMzIgPSBSZWxlYXNlV2l0aG91dEFzbXxXaW4zMg0KKwkJUmVsZWFzZVdpdGhvdXRBc218eDY0ID0gUmVsZWFzZVdpdGhvdXRBc218eDY0DQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24NCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LkRlYnVnfEl0YW5pdW0uQWN0aXZlQ2ZnID0gRGVidWd8SXRhbml1bQ0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uRGVidWd8SXRhbml1bS5CdWlsZC4wID0gRGVidWd8SXRhbml1bQ0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2V8SXRhbml1bS5BY3RpdmVDZmcgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2V8SXRhbml1bS5CdWlsZC4wID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQNCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0uQWN0aXZlQ2ZnID0gUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bQ0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bS5CdWlsZC4wID0gUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bQ0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZVdpdGhvdXRBc218V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZVdpdGhvdXRBc218V2luMzINCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2VXaXRob3V0QXNtfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlV2l0aG91dEFzbXxXaW4zMg0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZVdpdGhvdXRBc218eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2VXaXRob3V0QXNtfHg2NA0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZVdpdGhvdXRBc218eDY0LkJ1aWxkLjAgPSBSZWxlYXNlV2l0aG91dEFzbXx4NjQNCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LkRlYnVnfEl0YW5pdW0uQWN0aXZlQ2ZnID0gRGVidWd8SXRhbml1bQ0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uRGVidWd8SXRhbml1bS5CdWlsZC4wID0gRGVidWd8SXRhbml1bQ0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LlJlbGVhc2V8SXRhbml1bS5BY3RpdmVDZmcgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LlJlbGVhc2V8SXRhbml1bS5CdWlsZC4wID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQNCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0uQWN0aXZlQ2ZnID0gUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bQ0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bS5CdWlsZC4wID0gUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bQ0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uUmVsZWFzZVdpdGhvdXRBc218V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZVdpdGhvdXRBc218V2luMzINCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LlJlbGVhc2VXaXRob3V0QXNtfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlV2l0aG91dEFzbXxXaW4zMg0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uUmVsZWFzZVdpdGhvdXRBc218eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2VXaXRob3V0QXNtfHg2NA0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uUmVsZWFzZVdpdGhvdXRBc218eDY0LkJ1aWxkLjAgPSBSZWxlYXNlV2l0aG91dEFzbXx4NjQNCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LkRlYnVnfEl0YW5pdW0uQWN0aXZlQ2ZnID0gRGVidWd8SXRhbml1bQ0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWd8SXRhbml1bS5CdWlsZC4wID0gRGVidWd8SXRhbml1bQ0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2V8SXRhbml1bS5BY3RpdmVDZmcgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2V8SXRhbml1bS5CdWlsZC4wID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQNCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0uQWN0aXZlQ2ZnID0gUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bQ0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bS5CdWlsZC4wID0gUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bQ0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZVdpdGhvdXRBc218V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZVdpdGhvdXRBc218V2luMzINCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2VXaXRob3V0QXNtfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlV2l0aG91dEFzbXxXaW4zMg0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZVdpdGhvdXRBc218eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2VXaXRob3V0QXNtfHg2NA0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZVdpdGhvdXRBc218eDY0LkJ1aWxkLjAgPSBSZWxlYXNlV2l0aG91dEFzbXx4NjQNCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LkRlYnVnfEl0YW5pdW0uQWN0aXZlQ2ZnID0gRGVidWd8SXRhbml1bQ0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uRGVidWd8SXRhbml1bS5CdWlsZC4wID0gRGVidWd8SXRhbml1bQ0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LlJlbGVhc2V8SXRhbml1bS5BY3RpdmVDZmcgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LlJlbGVhc2V8SXRhbml1bS5CdWlsZC4wID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQNCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0uQWN0aXZlQ2ZnID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5SZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtLkJ1aWxkLjAgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LlJlbGVhc2VXaXRob3V0QXNtfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LlJlbGVhc2VXaXRob3V0QXNtfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWd8SXRhbml1bS5BY3RpdmVDZmcgPSBEZWJ1Z3xJdGFuaXVtDQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5EZWJ1Z3xJdGFuaXVtLkJ1aWxkLjAgPSBEZWJ1Z3xJdGFuaXVtDQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8eDY0DQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NA0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZXxJdGFuaXVtLkFjdGl2ZUNmZyA9IFJlbGVhc2V8SXRhbml1bQ0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZXxJdGFuaXVtLkJ1aWxkLjAgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NA0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bS5BY3RpdmVDZmcgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0uQnVpbGQuMCA9IFJlbGVhc2V8SXRhbml1bQ0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZVdpdGhvdXRBc218V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZVdpdGhvdXRBc218eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5EZWJ1Z3xJdGFuaXVtLkFjdGl2ZUNmZyA9IERlYnVnfEl0YW5pdW0NCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LkRlYnVnfEl0YW5pdW0uQnVpbGQuMCA9IERlYnVnfEl0YW5pdW0NCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQNCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8eDY0DQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5SZWxlYXNlfEl0YW5pdW0uQWN0aXZlQ2ZnID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5SZWxlYXNlfEl0YW5pdW0uQnVpbGQuMCA9IFJlbGVhc2V8SXRhbml1bQ0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0DQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5SZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtLkFjdGl2ZUNmZyA9IFJlbGVhc2V8SXRhbml1bQ0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bS5CdWlsZC4wID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5SZWxlYXNlV2l0aG91dEFzbXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5SZWxlYXNlV2l0aG91dEFzbXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbg0KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFDQorCUVuZEdsb2JhbFNlY3Rpb24NCitFbmRHbG9iYWwNCmRpZmYgLS1naXQgYS96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmM5L3psaWJ2Yy52Y3Byb2ogYi96bGliL3NyYy9jb250cmliL3ZzdHVkaW8vdmM5L3psaWJ2Yy52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhODk0NwotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2NvbnRyaWIvdnN0dWRpby92YzkvemxpYnZjLnZjcHJvagpAQCAtMCwwICsxLDExNTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI5LDAwIg0KKwlOYW1lPSJ6bGlidmMiDQorCVByb2plY3RHVUlEPSJ7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfSINCisJUm9vdE5hbWVzcGFjZT0iemxpYnZjIg0KKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIxMzEwNzIiDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9Ing2NCINCisJCS8+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJJdGFuaXVtIg0KKwkJLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxUb29sRmlsZXM+DQorCTwvVG9vbEZpbGVzPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0ieDg2XFpsaWJEbGwkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ing4NlxabGliRGxsJChDb25maWd1cmF0aW9uTmFtZSlcVG1wIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSJVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iJChPdXREaXIpL3psaWJ2Yy50bGIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1hc214ODYiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7WkxJQl9XSU5BUEk7QVNNVjtBU01JTkYiDQorCQkJCUV4Y2VwdGlvbkhhbmRsaW5nPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMSINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iJChJbnREaXIpL3psaWJ2Yy5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJT2JqZWN0RmlsZT0iJChJbnREaXIpXCINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9IiQoT3V0RGlyKVwiDQorCQkJCUJyb3dzZUluZm9ybWF0aW9uPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzNiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9NQUNISU5FOkkzODYiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ii4uXC4uXG1hc214ODZcbWF0Y2g2ODYub2JqIC4uXC4uXG1hc214ODZcaW5mZmFzMzIub2JqIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcilcemxpYndhcGkuZGxsIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJR2VuZXJhdGVNYW5pZmVzdD0iZmFsc2UiDQorCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSIuXHpsaWJ2Yy5kZWYiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL3psaWJ3YXBpLnBkYiINCisJCQkJR2VuZXJhdGVNYXBGaWxlPSJ0cnVlIg0KKwkJCQlNYXBGaWxlTmFtZT0iJChPdXREaXIpL3psaWJ3YXBpLm1hcCINCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlSYW5kb21pemVkQmFzZUFkZHJlc3M9IjEiDQorCQkJCURhdGFFeGVjdXRpb25QcmV2ZW50aW9uPSIwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIkKE91dERpcikvemxpYndhcGkubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfHg2NCINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ing2NFxabGliRGxsJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4NjRcWmxpYkRsbCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJ0cnVlIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIg0KKwkJCQlUeXBlTGlicmFyeU5hbWU9IiQoT3V0RGlyKS96bGlidmMudGxiIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtYXNteDg2Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1pMSUJfV0lOQVBJO0FTTVY7QVNNSU5GO1dJTjY0Ig0KKwkJCQlFeGNlcHRpb25IYW5kbGluZz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjMiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiQoSW50RGlyKS96bGlidmMucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCU9iamVjdEZpbGU9IiQoSW50RGlyKVwiDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKE91dERpcilcIg0KKwkJCQlCcm93c2VJbmZvcm1hdGlvbj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzYiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ii4uXC4uXG1hc214NjRcZ3ZtYXQ2NC5vYmogLi5cLi5cbWFzbXg2NFxpbmZmYXN4NjQub2JqICINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpXHpsaWJ3YXBpLmRsbCINCisJCQkJTGlua0luY3JlbWVudGFsPSIyIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iLlx6bGlidmMuZGVmIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS96bGlid2FwaS5wZGIiDQorCQkJCUdlbmVyYXRlTWFwRmlsZT0idHJ1ZSINCisJCQkJTWFwRmlsZU5hbWU9IiQoT3V0RGlyKS96bGlid2FwaS5tYXAiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJSW1wb3J0TGlicmFyeT0iJChPdXREaXIpL3psaWJ3YXBpLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMTciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8SXRhbml1bSINCisJCQlPdXRwdXREaXJlY3Rvcnk9ImlhNjRcWmxpYkRsbCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iaWE2NFxabGliRGxsJChDb25maWd1cmF0aW9uTmFtZSlcVG1wIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSJVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjIiDQorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iJChPdXREaXIpL3psaWJ2Yy50bGIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1hc214ODYiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7WkxJQl9XSU5BUEk7V0lONjQiDQorCQkJCUV4Y2VwdGlvbkhhbmRsaW5nPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMyINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iJChJbnREaXIpL3psaWJ2Yy5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJT2JqZWN0RmlsZT0iJChJbnREaXIpXCINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9IiQoT3V0RGlyKVwiDQorCQkJCUJyb3dzZUluZm9ybWF0aW9uPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzNiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpXHpsaWJ3YXBpLmRsbCINCisJCQkJTGlua0luY3JlbWVudGFsPSIyIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iLlx6bGlidmMuZGVmIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS96bGlid2FwaS5wZGIiDQorCQkJCUdlbmVyYXRlTWFwRmlsZT0idHJ1ZSINCisJCQkJTWFwRmlsZU5hbWU9IiQoT3V0RGlyKS96bGlid2FwaS5tYXAiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJSW1wb3J0TGlicmFyeT0iJChPdXREaXIpL3psaWJ3YXBpLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iNSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ing4NlxabGliRGxsJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4ODZcWmxpYkRsbCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIkKE91dERpcikvemxpYnZjLnRsYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtYXNteDg2Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1pMSUJfV0lOQVBJIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlFeGNlcHRpb25IYW5kbGluZz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIkKEludERpcikvemxpYnZjLnBjaCINCisJCQkJQXNzZW1ibGVyT3V0cHV0PSIyIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCU9iamVjdEZpbGU9IiQoSW50RGlyKVwiDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKE91dERpcilcIg0KKwkJCQlCcm93c2VJbmZvcm1hdGlvbj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzYiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvTUFDSElORTpJMzg2Ig0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcilcemxpYndhcGkuZGxsIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJR2VuZXJhdGVNYW5pZmVzdD0iZmFsc2UiDQorCQkJCUlnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM9ImZhbHNlIg0KKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iLlx6bGlidmMuZGVmIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKE91dERpcikvemxpYndhcGkucGRiIg0KKwkJCQlHZW5lcmF0ZU1hcEZpbGU9InRydWUiDQorCQkJCU1hcEZpbGVOYW1lPSIkKE91dERpcikvemxpYndhcGkubWFwIg0KKwkJCQlTdWJTeXN0ZW09IjIiDQorCQkJCU9wdGltaXplRm9yV2luZG93czk4PSIxIg0KKwkJCQlSYW5kb21pemVkQmFzZUFkZHJlc3M9IjEiDQorCQkJCURhdGFFeGVjdXRpb25QcmV2ZW50aW9uPSIwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIkKE91dERpcikvemxpYndhcGkubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VXaXRob3V0QXNtfHg2NCINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ing2NFxabGliRGxsJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4NjRcWmxpYkRsbCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyINCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIkKE91dERpcikvemxpYnZjLnRsYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtYXNteDg2Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1pMSUJfV0lOQVBJO1dJTjY0Ig0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlFeGNlcHRpb25IYW5kbGluZz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIkKEludERpcikvemxpYnZjLnBjaCINCisJCQkJQXNzZW1ibGVyT3V0cHV0PSIyIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCU9iamVjdEZpbGU9IiQoSW50RGlyKVwiDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKE91dERpcilcIg0KKwkJCQlCcm93c2VJbmZvcm1hdGlvbj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzYiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVx6bGlid2FwaS5kbGwiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkJSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz0iZmFsc2UiDQorCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSIuXHpsaWJ2Yy5kZWYiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS96bGlid2FwaS5wZGIiDQorCQkJCUdlbmVyYXRlTWFwRmlsZT0idHJ1ZSINCisJCQkJTWFwRmlsZU5hbWU9IiQoT3V0RGlyKS96bGlid2FwaS5tYXAiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJT3B0aW1pemVGb3JXaW5kb3dzOTg9IjEiDQorCQkJCUltcG9ydExpYnJhcnk9IiQoT3V0RGlyKS96bGlid2FwaS5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjE3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0iDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJpYTY0XFpsaWJEbGwkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9ImlhNjRcWmxpYkRsbCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMiINCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIkKE91dERpcikvemxpYnZjLnRsYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtYXNteDg2Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1pMSUJfV0lOQVBJO1dJTjY0Ig0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlFeGNlcHRpb25IYW5kbGluZz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIkKEludERpcikvemxpYnZjLnBjaCINCisJCQkJQXNzZW1ibGVyT3V0cHV0PSIyIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCU9iamVjdEZpbGU9IiQoSW50RGlyKVwiDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKE91dERpcilcIg0KKwkJCQlCcm93c2VJbmZvcm1hdGlvbj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzYiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVx6bGlid2FwaS5kbGwiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkJSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz0iZmFsc2UiDQorCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSIuXHpsaWJ2Yy5kZWYiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS96bGlid2FwaS5wZGIiDQorCQkJCUdlbmVyYXRlTWFwRmlsZT0idHJ1ZSINCisJCQkJTWFwRmlsZU5hbWU9IiQoT3V0RGlyKS96bGlid2FwaS5tYXAiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJT3B0aW1pemVGb3JXaW5kb3dzOTg9IjEiDQorCQkJCUltcG9ydExpYnJhcnk9IiQoT3V0RGlyKS96bGlid2FwaS5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ing4NlxabGliRGxsJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4ODZcWmxpYkRsbCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIkKE91dERpcikvemxpYnZjLnRsYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtYXNteDg2Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1pMSUJfV0lOQVBJO0FTTVY7QVNNSU5GIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlFeGNlcHRpb25IYW5kbGluZz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjAiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIkKEludERpcikvemxpYnZjLnBjaCINCisJCQkJQXNzZW1ibGVyT3V0cHV0PSIyIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCU9iamVjdEZpbGU9IiQoSW50RGlyKVwiDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKE91dERpcilcIg0KKwkJCQlCcm93c2VJbmZvcm1hdGlvbj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzYiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvTUFDSElORTpJMzg2Ig0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSIuLlwuLlxtYXNteDg2XG1hdGNoNjg2Lm9iaiAuLlwuLlxtYXNteDg2XGluZmZhczMyLm9iaiAiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVx6bGlid2FwaS5kbGwiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkJSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz0iZmFsc2UiDQorCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSIuXHpsaWJ2Yy5kZWYiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS96bGlid2FwaS5wZGIiDQorCQkJCUdlbmVyYXRlTWFwRmlsZT0idHJ1ZSINCisJCQkJTWFwRmlsZU5hbWU9IiQoT3V0RGlyKS96bGlid2FwaS5tYXAiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJT3B0aW1pemVGb3JXaW5kb3dzOTg9IjEiDQorCQkJCVJhbmRvbWl6ZWRCYXNlQWRkcmVzcz0iMSINCisJCQkJRGF0YUV4ZWN1dGlvblByZXZlbnRpb249IjAiDQorCQkJCUltcG9ydExpYnJhcnk9IiQoT3V0RGlyKS96bGlid2FwaS5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXx4NjQiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJ4NjRcWmxpYkRsbCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0ieDY0XFpsaWJEbGwkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IlVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjMiDQorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iJChPdXREaXIpL3psaWJ2Yy50bGIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi47Li5cLi5cbWFzbXg4NiINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztaTElCX1dJTkFQSTtBU01WO0FTTUlORjtXSU42NCINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJRXhjZXB0aW9uSGFuZGxpbmc9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iJChJbnREaXIpL3psaWJ2Yy5wY2giDQorCQkJCUFzc2VtYmxlck91dHB1dD0iMiINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKEludERpcilcIg0KKwkJCQlPYmplY3RGaWxlPSIkKEludERpcilcIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iJChPdXREaXIpXCINCisJCQkJQnJvd3NlSW5mb3JtYXRpb249IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KKwkJCQlDdWx0dXJlPSIxMDM2Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSIuLlwuLlxtYXNteDY0XGd2bWF0NjQub2JqIC4uXC4uXG1hc214NjRcaW5mZmFzeDY0Lm9iaiAiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVx6bGlid2FwaS5kbGwiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkJSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz0iZmFsc2UiDQorCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSIuXHpsaWJ2Yy5kZWYiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS96bGlid2FwaS5wZGIiDQorCQkJCUdlbmVyYXRlTWFwRmlsZT0idHJ1ZSINCisJCQkJTWFwRmlsZU5hbWU9IiQoT3V0RGlyKS96bGlid2FwaS5tYXAiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJT3B0aW1pemVGb3JXaW5kb3dzOTg9IjEiDQorCQkJCUltcG9ydExpYnJhcnk9IiQoT3V0RGlyKS96bGlid2FwaS5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjE3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8SXRhbml1bSINCisJCQlPdXRwdXREaXJlY3Rvcnk9ImlhNjRcWmxpYkRsbCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iaWE2NFxabGliRGxsJChDb25maWd1cmF0aW9uTmFtZSlcVG1wIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSJVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJ0cnVlIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIyIg0KKwkJCQlUeXBlTGlicmFyeU5hbWU9IiQoT3V0RGlyKS96bGlidmMudGxiIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1hc214ODYiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7WkxJQl9XSU5BUEk7V0lONjQiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUV4Y2VwdGlvbkhhbmRsaW5nPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiQoSW50RGlyKS96bGlidmMucGNoIg0KKwkJCQlBc3NlbWJsZXJPdXRwdXQ9IjIiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJT2JqZWN0RmlsZT0iJChJbnREaXIpXCINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9IiQoT3V0RGlyKVwiDQorCQkJCUJyb3dzZUluZm9ybWF0aW9uPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzNiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpXHpsaWJ3YXBpLmRsbCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCQlJZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPSJmYWxzZSINCisJCQkJTW9kdWxlRGVmaW5pdGlvbkZpbGU9Ii5cemxpYnZjLmRlZiINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL3psaWJ3YXBpLnBkYiINCisJCQkJR2VuZXJhdGVNYXBGaWxlPSJ0cnVlIg0KKwkJCQlNYXBGaWxlTmFtZT0iJChPdXREaXIpL3psaWJ3YXBpLm1hcCINCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlPcHRpbWl6ZUZvcldpbmRvd3M5OD0iMSINCisJCQkJSW1wb3J0TGlicmFyeT0iJChPdXREaXIpL3psaWJ3YXBpLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iNSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtocGo7YmF0O2ZvcjtmOTAiDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cYWRsZXIzMi5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cY29tcHJlc3MuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGNyYzMyLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxkZWZsYXRlLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxnemNsb3NlLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxnemd1dHMuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGd6bGliLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxnenJlYWQuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGd6d3JpdGUuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluZmJhY2suYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXG1hc214NjRcaW5mZmFzODY2NC5jIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8SXRhbml1bSINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxJdGFuaXVtIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluZmZhc3QuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluZmxhdGUuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluZnRyZWVzLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxtaW5pemlwXGlvYXBpLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxtaW5pemlwXGlvd2luMzIuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHRyZWVzLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx1bmNvbXByLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxtaW5pemlwXHVuemlwLmMiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iWkxJQl9JTlRFUk5BTCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXx4NjQiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJaTElCX0lOVEVSTkFMIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfEl0YW5pdW0iDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJaTElCX0lOVEVSTkFMIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxtaW5pemlwXHppcC5jIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IlpMSUJfSU5URVJOQUwiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8eDY0Ig0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iWkxJQl9JTlRFUk5BTCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxJdGFuaXVtIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iWkxJQl9JTlRFUk5BTCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx6bGliLnJjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx6bGlidmMuZGVmIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cenV0aWwuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7Zmk7ZmQiDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cZGVmbGF0ZS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5mYmxvY2suaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluZmNvZGVzLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxpbmZmYXN0LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxpbmZ0cmVlcy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5mdXRpbC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemNvbmYuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHpsaWIuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHp1dGlsLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtjbnQ7cnRmO2dpZjtqcGc7anBlZztqcGUiDQorCQkJPg0KKwkJPC9GaWx0ZXI+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2NyYzMyLmMgYi96bGliL3NyYy9jcmMzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OWE3MTkKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9jcmMzMi5jCkBAIC0wLDAgKzEsNDI1IEBACisvKiBjcmMzMi5jIC0tIGNvbXB1dGUgdGhlIENSQy0zMiBvZiBhIGRhdGEgc3RyZWFtCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNiwgMjAxMCwgMjAxMSwgMjAxMiBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKgorICogVGhhbmtzIHRvIFJvZG5leSBCcm93biA8cmJyb3duNjRAY3NjLmNvbS5hdT4gZm9yIGhpcyBjb250cmlidXRpb24gb2YgZmFzdGVyCisgKiBDUkMgbWV0aG9kczogZXhjbHVzaXZlLW9yaW5nIDMyIGJpdHMgb2YgZGF0YSBhdCBhIHRpbWUsIGFuZCBwcmUtY29tcHV0aW5nCisgKiB0YWJsZXMgZm9yIHVwZGF0aW5nIHRoZSBzaGlmdCByZWdpc3RlciBpbiBvbmUgc3RlcCB3aXRoIHRocmVlIGV4Y2x1c2l2ZS1vcnMKKyAqIGluc3RlYWQgb2YgZm91ciBzdGVwcyB3aXRoIGZvdXIgZXhjbHVzaXZlLW9ycy4gIFRoaXMgcmVzdWx0cyBpbiBhYm91dCBhCisgKiBmYWN0b3Igb2YgdHdvIGluY3JlYXNlIGluIHNwZWVkIG9uIGEgUG93ZXIgUEMgRzQgKFBQQzc0NTUpIHVzaW5nIGdjYyAtTzMuCisgKi8KKworLyogQCgjKSAkSWQkICovCisKKy8qCisgIE5vdGUgb24gdGhlIHVzZSBvZiBEWU5BTUlDX0NSQ19UQUJMRTogdGhlcmUgaXMgbm8gbXV0ZXggb3Igc2VtYXBob3JlCisgIHByb3RlY3Rpb24gb24gdGhlIHN0YXRpYyB2YXJpYWJsZXMgdXNlZCB0byBjb250cm9sIHRoZSBmaXJzdC11c2UgZ2VuZXJhdGlvbgorICBvZiB0aGUgY3JjIHRhYmxlcy4gIFRoZXJlZm9yZSwgaWYgeW91ICNkZWZpbmUgRFlOQU1JQ19DUkNfVEFCTEUsIHlvdSBzaG91bGQKKyAgZmlyc3QgY2FsbCBnZXRfY3JjX3RhYmxlKCkgdG8gaW5pdGlhbGl6ZSB0aGUgdGFibGVzIGJlZm9yZSBhbGxvd2luZyBtb3JlIHRoYW4KKyAgb25lIHRocmVhZCB0byB1c2UgY3JjMzIoKS4KKworICBEWU5BTUlDX0NSQ19UQUJMRSBhbmQgTUFLRUNSQ0ggY2FuIGJlICNkZWZpbmVkIHRvIHdyaXRlIG91dCBjcmMzMi5oLgorICovCisKKyNpZmRlZiBNQUtFQ1JDSAorIyAgaW5jbHVkZSA8c3RkaW8uaD4KKyMgIGlmbmRlZiBEWU5BTUlDX0NSQ19UQUJMRQorIyAgICBkZWZpbmUgRFlOQU1JQ19DUkNfVEFCTEUKKyMgIGVuZGlmIC8qICFEWU5BTUlDX0NSQ19UQUJMRSAqLworI2VuZGlmIC8qIE1BS0VDUkNIICovCisKKyNpbmNsdWRlICJ6dXRpbC5oIiAgICAgIC8qIGZvciBTVERDIGFuZCBGQVIgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBsb2NhbCBzdGF0aWMKKworLyogRGVmaW5pdGlvbnMgZm9yIGRvaW5nIHRoZSBjcmMgZm91ciBkYXRhIGJ5dGVzIGF0IGEgdGltZS4gKi8KKyNpZiAhZGVmaW5lZChOT0JZRk9VUikgJiYgZGVmaW5lZChaX1U0KQorIyAgZGVmaW5lIEJZRk9VUgorI2VuZGlmCisjaWZkZWYgQllGT1VSCisgICBsb2NhbCB1bnNpZ25lZCBsb25nIGNyYzMyX2xpdHRsZSBPRigodW5zaWduZWQgbG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICosIHVuc2lnbmVkKSk7CisgICBsb2NhbCB1bnNpZ25lZCBsb25nIGNyYzMyX2JpZyBPRigodW5zaWduZWQgbG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICosIHVuc2lnbmVkKSk7CisjICBkZWZpbmUgVEJMUyA4CisjZWxzZQorIyAgZGVmaW5lIFRCTFMgMQorI2VuZGlmIC8qIEJZRk9VUiAqLworCisvKiBMb2NhbCBmdW5jdGlvbnMgZm9yIGNyYyBjb25jYXRlbmF0aW9uICovCitsb2NhbCB1bnNpZ25lZCBsb25nIGdmMl9tYXRyaXhfdGltZXMgT0YoKHVuc2lnbmVkIGxvbmcgKm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB2ZWMpKTsKK2xvY2FsIHZvaWQgZ2YyX21hdHJpeF9zcXVhcmUgT0YoKHVuc2lnbmVkIGxvbmcgKnNxdWFyZSwgdW5zaWduZWQgbG9uZyAqbWF0KSk7Citsb2NhbCB1TG9uZyBjcmMzMl9jb21iaW5lXyBPRigodUxvbmcgY3JjMSwgdUxvbmcgY3JjMiwgel9vZmY2NF90IGxlbjIpKTsKKworCisjaWZkZWYgRFlOQU1JQ19DUkNfVEFCTEUKKworbG9jYWwgdm9sYXRpbGUgaW50IGNyY190YWJsZV9lbXB0eSA9IDE7Citsb2NhbCB6X2NyY190IEZBUiBjcmNfdGFibGVbVEJMU11bMjU2XTsKK2xvY2FsIHZvaWQgbWFrZV9jcmNfdGFibGUgT0YoKHZvaWQpKTsKKyNpZmRlZiBNQUtFQ1JDSAorICAgbG9jYWwgdm9pZCB3cml0ZV90YWJsZSBPRigoRklMRSAqLCBjb25zdCB6X2NyY190IEZBUiAqKSk7CisjZW5kaWYgLyogTUFLRUNSQ0ggKi8KKy8qCisgIEdlbmVyYXRlIHRhYmxlcyBmb3IgYSBieXRlLXdpc2UgMzItYml0IENSQyBjYWxjdWxhdGlvbiBvbiB0aGUgcG9seW5vbWlhbDoKKyAgeF4zMit4XjI2K3heMjMreF4yMit4XjE2K3heMTIreF4xMSt4XjEwK3heOCt4XjcreF41K3heNCt4XjIreCsxLgorCisgIFBvbHlub21pYWxzIG92ZXIgR0YoMikgYXJlIHJlcHJlc2VudGVkIGluIGJpbmFyeSwgb25lIGJpdCBwZXIgY29lZmZpY2llbnQsCisgIHdpdGggdGhlIGxvd2VzdCBwb3dlcnMgaW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0LiAgVGhlbiBhZGRpbmcgcG9seW5vbWlhbHMKKyAgaXMganVzdCBleGNsdXNpdmUtb3IsIGFuZCBtdWx0aXBseWluZyBhIHBvbHlub21pYWwgYnkgeCBpcyBhIHJpZ2h0IHNoaWZ0IGJ5CisgIG9uZS4gIElmIHdlIGNhbGwgdGhlIGFib3ZlIHBvbHlub21pYWwgcCwgYW5kIHJlcHJlc2VudCBhIGJ5dGUgYXMgdGhlCisgIHBvbHlub21pYWwgcSwgYWxzbyB3aXRoIHRoZSBsb3dlc3QgcG93ZXIgaW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IChzbyB0aGUKKyAgYnl0ZSAweGIxIGlzIHRoZSBwb2x5bm9taWFsIHheNyt4XjMreCsxKSwgdGhlbiB0aGUgQ1JDIGlzIChxKnheMzIpIG1vZCBwLAorICB3aGVyZSBhIG1vZCBiIG1lYW5zIHRoZSByZW1haW5kZXIgYWZ0ZXIgZGl2aWRpbmcgYSBieSBiLgorCisgIFRoaXMgY2FsY3VsYXRpb24gaXMgZG9uZSB1c2luZyB0aGUgc2hpZnQtcmVnaXN0ZXIgbWV0aG9kIG9mIG11bHRpcGx5aW5nIGFuZAorICB0YWtpbmcgdGhlIHJlbWFpbmRlci4gIFRoZSByZWdpc3RlciBpcyBpbml0aWFsaXplZCB0byB6ZXJvLCBhbmQgZm9yIGVhY2gKKyAgaW5jb21pbmcgYml0LCB4XjMyIGlzIGFkZGVkIG1vZCBwIHRvIHRoZSByZWdpc3RlciBpZiB0aGUgYml0IGlzIGEgb25lICh3aGVyZQorICB4XjMyIG1vZCBwIGlzIHAreF4zMiA9IHheMjYrLi4uKzEpLCBhbmQgdGhlIHJlZ2lzdGVyIGlzIG11bHRpcGxpZWQgbW9kIHAgYnkKKyAgeCAod2hpY2ggaXMgc2hpZnRpbmcgcmlnaHQgYnkgb25lIGFuZCBhZGRpbmcgeF4zMiBtb2QgcCBpZiB0aGUgYml0IHNoaWZ0ZWQKKyAgb3V0IGlzIGEgb25lKS4gIFdlIHN0YXJ0IHdpdGggdGhlIGhpZ2hlc3QgcG93ZXIgKGxlYXN0IHNpZ25pZmljYW50IGJpdCkgb2YKKyAgcSBhbmQgcmVwZWF0IGZvciBhbGwgZWlnaHQgYml0cyBvZiBxLgorCisgIFRoZSBmaXJzdCB0YWJsZSBpcyBzaW1wbHkgdGhlIENSQyBvZiBhbGwgcG9zc2libGUgZWlnaHQgYml0IHZhbHVlcy4gIFRoaXMgaXMKKyAgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gZ2VuZXJhdGUgQ1JDcyBvbiBkYXRhIGEgYnl0ZSBhdCBhIHRpbWUgZm9yIGFsbAorICBjb21iaW5hdGlvbnMgb2YgQ1JDIHJlZ2lzdGVyIHZhbHVlcyBhbmQgaW5jb21pbmcgYnl0ZXMuICBUaGUgcmVtYWluaW5nIHRhYmxlcworICBhbGxvdyBmb3Igd29yZC1hdC1hLXRpbWUgQ1JDIGNhbGN1bGF0aW9uIGZvciBib3RoIGJpZy1lbmRpYW4gYW5kIGxpdHRsZS0KKyAgZW5kaWFuIG1hY2hpbmVzLCB3aGVyZSBhIHdvcmQgaXMgZm91ciBieXRlcy4KKyovCitsb2NhbCB2b2lkIG1ha2VfY3JjX3RhYmxlKCkKK3sKKyAgICB6X2NyY190IGM7CisgICAgaW50IG4sIGs7CisgICAgel9jcmNfdCBwb2x5OyAgICAgICAgICAgICAgICAgICAgICAgLyogcG9seW5vbWlhbCBleGNsdXNpdmUtb3IgcGF0dGVybiAqLworICAgIC8qIHRlcm1zIG9mIHBvbHlub21pYWwgZGVmaW5pbmcgdGhpcyBjcmMgKGV4Y2VwdCB4XjMyKTogKi8KKyAgICBzdGF0aWMgdm9sYXRpbGUgaW50IGZpcnN0ID0gMTsgICAgICAvKiBmbGFnIHRvIGxpbWl0IGNvbmN1cnJlbnQgbWFraW5nICovCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcFtdID0gezAsMSwyLDQsNSw3LDgsMTAsMTEsMTIsMTYsMjIsMjMsMjZ9OworCisgICAgLyogU2VlIGlmIGFub3RoZXIgdGFzayBpcyBhbHJlYWR5IGRvaW5nIHRoaXMgKG5vdCB0aHJlYWQtc2FmZSwgYnV0IGJldHRlcgorICAgICAgIHRoYW4gbm90aGluZyAtLSBzaWduaWZpY2FudGx5IHJlZHVjZXMgZHVyYXRpb24gb2YgdnVsbmVyYWJpbGl0eSBpbgorICAgICAgIGNhc2UgdGhlIGFkdmljZSBhYm91dCBEWU5BTUlDX0NSQ19UQUJMRSBpcyBpZ25vcmVkKSAqLworICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IDA7CisKKyAgICAgICAgLyogbWFrZSBleGNsdXNpdmUtb3IgcGF0dGVybiBmcm9tIHBvbHlub21pYWwgKDB4ZWRiODgzMjBVTCkgKi8KKyAgICAgICAgcG9seSA9IDA7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCAoaW50KShzaXplb2YocCkvc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsgbisrKQorICAgICAgICAgICAgcG9seSB8PSAoel9jcmNfdCkxIDw8ICgzMSAtIHBbbl0pOworCisgICAgICAgIC8qIGdlbmVyYXRlIGEgY3JjIGZvciBldmVyeSA4LWJpdCB2YWx1ZSAqLworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMjU2OyBuKyspIHsKKyAgICAgICAgICAgIGMgPSAoel9jcmNfdCluOworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDg7IGsrKykKKyAgICAgICAgICAgICAgICBjID0gYyAmIDEgPyBwb2x5IF4gKGMgPj4gMSkgOiBjID4+IDE7CisgICAgICAgICAgICBjcmNfdGFibGVbMF1bbl0gPSBjOworICAgICAgICB9CisKKyNpZmRlZiBCWUZPVVIKKyAgICAgICAgLyogZ2VuZXJhdGUgY3JjIGZvciBlYWNoIHZhbHVlIGZvbGxvd2VkIGJ5IG9uZSwgdHdvLCBhbmQgdGhyZWUgemVyb3MsCisgICAgICAgICAgIGFuZCB0aGVuIHRoZSBieXRlIHJldmVyc2FsIG9mIHRob3NlIGFzIHdlbGwgYXMgdGhlIGZpcnN0IHRhYmxlICovCisgICAgICAgIGZvciAobiA9IDA7IG4gPCAyNTY7IG4rKykgeworICAgICAgICAgICAgYyA9IGNyY190YWJsZVswXVtuXTsKKyAgICAgICAgICAgIGNyY190YWJsZVs0XVtuXSA9IFpTV0FQMzIoYyk7CisgICAgICAgICAgICBmb3IgKGsgPSAxOyBrIDwgNDsgaysrKSB7CisgICAgICAgICAgICAgICAgYyA9IGNyY190YWJsZVswXVtjICYgMHhmZl0gXiAoYyA+PiA4KTsKKyAgICAgICAgICAgICAgICBjcmNfdGFibGVba11bbl0gPSBjOworICAgICAgICAgICAgICAgIGNyY190YWJsZVtrICsgNF1bbl0gPSBaU1dBUDMyKGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogQllGT1VSICovCisKKyAgICAgICAgY3JjX3RhYmxlX2VtcHR5ID0gMDsKKyAgICB9CisgICAgZWxzZSB7ICAgICAgLyogbm90IGZpcnN0ICovCisgICAgICAgIC8qIHdhaXQgZm9yIHRoZSBvdGhlciBndXkgdG8gZmluaXNoIChub3QgZWZmaWNpZW50LCBidXQgcmFyZSkgKi8KKyAgICAgICAgd2hpbGUgKGNyY190YWJsZV9lbXB0eSkKKyAgICAgICAgICAgIDsKKyAgICB9CisKKyNpZmRlZiBNQUtFQ1JDSAorICAgIC8qIHdyaXRlIG91dCBDUkMgdGFibGVzIHRvIGNyYzMyLmggKi8KKyAgICB7CisgICAgICAgIEZJTEUgKm91dDsKKworICAgICAgICBvdXQgPSBmb3BlbigiY3JjMzIuaCIsICJ3Iik7CisgICAgICAgIGlmIChvdXQgPT0gTlVMTCkgcmV0dXJuOworICAgICAgICBmcHJpbnRmKG91dCwgIi8qIGNyYzMyLmggLS0gdGFibGVzIGZvciByYXBpZCBDUkMgY2FsY3VsYXRpb25cbiIpOworICAgICAgICBmcHJpbnRmKG91dCwgIiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNyYzMyLmNcbiAqL1xuXG4iKTsKKyAgICAgICAgZnByaW50ZihvdXQsICJsb2NhbCBjb25zdCB6X2NyY190IEZBUiAiKTsKKyAgICAgICAgZnByaW50ZihvdXQsICJjcmNfdGFibGVbVEJMU11bMjU2XSA9XG57XG4gIHtcbiIpOworICAgICAgICB3cml0ZV90YWJsZShvdXQsIGNyY190YWJsZVswXSk7CisjICBpZmRlZiBCWUZPVVIKKyAgICAgICAgZnByaW50ZihvdXQsICIjaWZkZWYgQllGT1VSXG4iKTsKKyAgICAgICAgZm9yIChrID0gMTsgayA8IDg7IGsrKykgeworICAgICAgICAgICAgZnByaW50ZihvdXQsICIgIH0sXG4gIHtcbiIpOworICAgICAgICAgICAgd3JpdGVfdGFibGUob3V0LCBjcmNfdGFibGVba10pOworICAgICAgICB9CisgICAgICAgIGZwcmludGYob3V0LCAiI2VuZGlmXG4iKTsKKyMgIGVuZGlmIC8qIEJZRk9VUiAqLworICAgICAgICBmcHJpbnRmKG91dCwgIiAgfVxufTtcbiIpOworICAgICAgICBmY2xvc2Uob3V0KTsKKyAgICB9CisjZW5kaWYgLyogTUFLRUNSQ0ggKi8KK30KKworI2lmZGVmIE1BS0VDUkNICitsb2NhbCB2b2lkIHdyaXRlX3RhYmxlKG91dCwgdGFibGUpCisgICAgRklMRSAqb3V0OworICAgIGNvbnN0IHpfY3JjX3QgRkFSICp0YWJsZTsKK3sKKyAgICBpbnQgbjsKKworICAgIGZvciAobiA9IDA7IG4gPCAyNTY7IG4rKykKKyAgICAgICAgZnByaW50ZihvdXQsICIlczB4JTA4bHhVTCVzIiwgbiAlIDUgPyAiIiA6ICIgICAgIiwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykodGFibGVbbl0pLAorICAgICAgICAgICAgICAgIG4gPT0gMjU1ID8gIlxuIiA6IChuICUgNSA9PSA0ID8gIixcbiIgOiAiLCAiKSk7Cit9CisjZW5kaWYgLyogTUFLRUNSQ0ggKi8KKworI2Vsc2UgLyogIURZTkFNSUNfQ1JDX1RBQkxFICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRhYmxlcyBvZiBDUkMtMzJzIG9mIGFsbCBzaW5nbGUtYnl0ZSB2YWx1ZXMsIG1hZGUgYnkgbWFrZV9jcmNfdGFibGUoKS4KKyAqLworI2luY2x1ZGUgImNyYzMyLmgiCisjZW5kaWYgLyogRFlOQU1JQ19DUkNfVEFCTEUgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBieSBhc20gdmVyc2lvbnMgb2YgY3JjMzIoKQorICovCitjb25zdCB6X2NyY190IEZBUiAqIFpFWFBPUlQgZ2V0X2NyY190YWJsZSgpCit7CisjaWZkZWYgRFlOQU1JQ19DUkNfVEFCTEUKKyAgICBpZiAoY3JjX3RhYmxlX2VtcHR5KQorICAgICAgICBtYWtlX2NyY190YWJsZSgpOworI2VuZGlmIC8qIERZTkFNSUNfQ1JDX1RBQkxFICovCisgICAgcmV0dXJuIChjb25zdCB6X2NyY190IEZBUiAqKWNyY190YWJsZTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2RlZmluZSBETzEgY3JjID0gY3JjX3RhYmxlWzBdWygoaW50KWNyYyBeICgqYnVmKyspKSAmIDB4ZmZdIF4gKGNyYyA+PiA4KQorI2RlZmluZSBETzggRE8xOyBETzE7IERPMTsgRE8xOyBETzE7IERPMTsgRE8xOyBETzEKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwordW5zaWduZWQgbG9uZyBaRVhQT1JUIGNyYzMyKGNyYywgYnVmLCBsZW4pCisgICAgdW5zaWduZWQgbG9uZyBjcmM7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKmJ1ZjsKKyAgICB1SW50IGxlbjsKK3sKKyAgICBpZiAoYnVmID09IFpfTlVMTCkgcmV0dXJuIDBVTDsKKworI2lmZGVmIERZTkFNSUNfQ1JDX1RBQkxFCisgICAgaWYgKGNyY190YWJsZV9lbXB0eSkKKyAgICAgICAgbWFrZV9jcmNfdGFibGUoKTsKKyNlbmRpZiAvKiBEWU5BTUlDX0NSQ19UQUJMRSAqLworCisjaWZkZWYgQllGT1VSCisgICAgaWYgKHNpemVvZih2b2lkICopID09IHNpemVvZihwdHJkaWZmX3QpKSB7CisgICAgICAgIHpfY3JjX3QgZW5kaWFuOworCisgICAgICAgIGVuZGlhbiA9IDE7CisgICAgICAgIGlmICgqKCh1bnNpZ25lZCBjaGFyICopKCZlbmRpYW4pKSkKKyAgICAgICAgICAgIHJldHVybiBjcmMzMl9saXR0bGUoY3JjLCBidWYsIGxlbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBjcmMzMl9iaWcoY3JjLCBidWYsIGxlbik7CisgICAgfQorI2VuZGlmIC8qIEJZRk9VUiAqLworICAgIGNyYyA9IGNyYyBeIDB4ZmZmZmZmZmZVTDsKKyAgICB3aGlsZSAobGVuID49IDgpIHsKKyAgICAgICAgRE84OworICAgICAgICBsZW4gLT0gODsKKyAgICB9CisgICAgaWYgKGxlbikgZG8geworICAgICAgICBETzE7CisgICAgfSB3aGlsZSAoLS1sZW4pOworICAgIHJldHVybiBjcmMgXiAweGZmZmZmZmZmVUw7Cit9CisKKyNpZmRlZiBCWUZPVVIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2RlZmluZSBET0xJVDQgYyBePSAqYnVmNCsrOyBcCisgICAgICAgIGMgPSBjcmNfdGFibGVbM11bYyAmIDB4ZmZdIF4gY3JjX3RhYmxlWzJdWyhjID4+IDgpICYgMHhmZl0gXiBcCisgICAgICAgICAgICBjcmNfdGFibGVbMV1bKGMgPj4gMTYpICYgMHhmZl0gXiBjcmNfdGFibGVbMF1bYyA+PiAyNF0KKyNkZWZpbmUgRE9MSVQzMiBET0xJVDQ7IERPTElUNDsgRE9MSVQ0OyBET0xJVDQ7IERPTElUNDsgRE9MSVQ0OyBET0xJVDQ7IERPTElUNAorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitsb2NhbCB1bnNpZ25lZCBsb25nIGNyYzMyX2xpdHRsZShjcmMsIGJ1ZiwgbGVuKQorICAgIHVuc2lnbmVkIGxvbmcgY3JjOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICpidWY7CisgICAgdW5zaWduZWQgbGVuOworeworICAgIHJlZ2lzdGVyIHpfY3JjX3QgYzsKKyAgICByZWdpc3RlciBjb25zdCB6X2NyY190IEZBUiAqYnVmNDsKKworICAgIGMgPSAoel9jcmNfdCljcmM7CisgICAgYyA9IH5jOworICAgIHdoaWxlIChsZW4gJiYgKChwdHJkaWZmX3QpYnVmICYgMykpIHsKKyAgICAgICAgYyA9IGNyY190YWJsZVswXVsoYyBeICpidWYrKykgJiAweGZmXSBeIChjID4+IDgpOworICAgICAgICBsZW4tLTsKKyAgICB9CisKKyAgICBidWY0ID0gKGNvbnN0IHpfY3JjX3QgRkFSICopKGNvbnN0IHZvaWQgRkFSICopYnVmOworICAgIHdoaWxlIChsZW4gPj0gMzIpIHsKKyAgICAgICAgRE9MSVQzMjsKKyAgICAgICAgbGVuIC09IDMyOworICAgIH0KKyAgICB3aGlsZSAobGVuID49IDQpIHsKKyAgICAgICAgRE9MSVQ0OworICAgICAgICBsZW4gLT0gNDsKKyAgICB9CisgICAgYnVmID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICopYnVmNDsKKworICAgIGlmIChsZW4pIGRvIHsKKyAgICAgICAgYyA9IGNyY190YWJsZVswXVsoYyBeICpidWYrKykgJiAweGZmXSBeIChjID4+IDgpOworICAgIH0gd2hpbGUgKC0tbGVuKTsKKyAgICBjID0gfmM7CisgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKWM7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNkZWZpbmUgRE9CSUc0IGMgXj0gKisrYnVmNDsgXAorICAgICAgICBjID0gY3JjX3RhYmxlWzRdW2MgJiAweGZmXSBeIGNyY190YWJsZVs1XVsoYyA+PiA4KSAmIDB4ZmZdIF4gXAorICAgICAgICAgICAgY3JjX3RhYmxlWzZdWyhjID4+IDE2KSAmIDB4ZmZdIF4gY3JjX3RhYmxlWzddW2MgPj4gMjRdCisjZGVmaW5lIERPQklHMzIgRE9CSUc0OyBET0JJRzQ7IERPQklHNDsgRE9CSUc0OyBET0JJRzQ7IERPQklHNDsgRE9CSUc0OyBET0JJRzQKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworbG9jYWwgdW5zaWduZWQgbG9uZyBjcmMzMl9iaWcoY3JjLCBidWYsIGxlbikKKyAgICB1bnNpZ25lZCBsb25nIGNyYzsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIEZBUiAqYnVmOworICAgIHVuc2lnbmVkIGxlbjsKK3sKKyAgICByZWdpc3RlciB6X2NyY190IGM7CisgICAgcmVnaXN0ZXIgY29uc3Qgel9jcmNfdCBGQVIgKmJ1ZjQ7CisKKyAgICBjID0gWlNXQVAzMigoel9jcmNfdCljcmMpOworICAgIGMgPSB+YzsKKyAgICB3aGlsZSAobGVuICYmICgocHRyZGlmZl90KWJ1ZiAmIDMpKSB7CisgICAgICAgIGMgPSBjcmNfdGFibGVbNF1bKGMgPj4gMjQpIF4gKmJ1ZisrXSBeIChjIDw8IDgpOworICAgICAgICBsZW4tLTsKKyAgICB9CisKKyAgICBidWY0ID0gKGNvbnN0IHpfY3JjX3QgRkFSICopKGNvbnN0IHZvaWQgRkFSICopYnVmOworICAgIGJ1ZjQtLTsKKyAgICB3aGlsZSAobGVuID49IDMyKSB7CisgICAgICAgIERPQklHMzI7CisgICAgICAgIGxlbiAtPSAzMjsKKyAgICB9CisgICAgd2hpbGUgKGxlbiA+PSA0KSB7CisgICAgICAgIERPQklHNDsKKyAgICAgICAgbGVuIC09IDQ7CisgICAgfQorICAgIGJ1ZjQrKzsKKyAgICBidWYgPSAoY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKilidWY0OworCisgICAgaWYgKGxlbikgZG8geworICAgICAgICBjID0gY3JjX3RhYmxlWzRdWyhjID4+IDI0KSBeICpidWYrK10gXiAoYyA8PCA4KTsKKyAgICB9IHdoaWxlICgtLWxlbik7CisgICAgYyA9IH5jOworICAgIHJldHVybiAodW5zaWduZWQgbG9uZykoWlNXQVAzMihjKSk7Cit9CisKKyNlbmRpZiAvKiBCWUZPVVIgKi8KKworI2RlZmluZSBHRjJfRElNIDMyICAgICAgLyogZGltZW5zaW9uIG9mIEdGKDIpIHZlY3RvcnMgKGxlbmd0aCBvZiBDUkMpICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2xvY2FsIHVuc2lnbmVkIGxvbmcgZ2YyX21hdHJpeF90aW1lcyhtYXQsIHZlYykKKyAgICB1bnNpZ25lZCBsb25nICptYXQ7CisgICAgdW5zaWduZWQgbG9uZyB2ZWM7Cit7CisgICAgdW5zaWduZWQgbG9uZyBzdW07CisKKyAgICBzdW0gPSAwOworICAgIHdoaWxlICh2ZWMpIHsKKyAgICAgICAgaWYgKHZlYyAmIDEpCisgICAgICAgICAgICBzdW0gXj0gKm1hdDsKKyAgICAgICAgdmVjID4+PSAxOworICAgICAgICBtYXQrKzsKKyAgICB9CisgICAgcmV0dXJuIHN1bTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworbG9jYWwgdm9pZCBnZjJfbWF0cml4X3NxdWFyZShzcXVhcmUsIG1hdCkKKyAgICB1bnNpZ25lZCBsb25nICpzcXVhcmU7CisgICAgdW5zaWduZWQgbG9uZyAqbWF0OworeworICAgIGludCBuOworCisgICAgZm9yIChuID0gMDsgbiA8IEdGMl9ESU07IG4rKykKKyAgICAgICAgc3F1YXJlW25dID0gZ2YyX21hdHJpeF90aW1lcyhtYXQsIG1hdFtuXSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2xvY2FsIHVMb25nIGNyYzMyX2NvbWJpbmVfKGNyYzEsIGNyYzIsIGxlbjIpCisgICAgdUxvbmcgY3JjMTsKKyAgICB1TG9uZyBjcmMyOworICAgIHpfb2ZmNjRfdCBsZW4yOworeworICAgIGludCBuOworICAgIHVuc2lnbmVkIGxvbmcgcm93OworICAgIHVuc2lnbmVkIGxvbmcgZXZlbltHRjJfRElNXTsgICAgLyogZXZlbi1wb3dlci1vZi10d28gemVyb3Mgb3BlcmF0b3IgKi8KKyAgICB1bnNpZ25lZCBsb25nIG9kZFtHRjJfRElNXTsgICAgIC8qIG9kZC1wb3dlci1vZi10d28gemVyb3Mgb3BlcmF0b3IgKi8KKworICAgIC8qIGRlZ2VuZXJhdGUgY2FzZSAoYWxzbyBkaXNhbGxvdyBuZWdhdGl2ZSBsZW5ndGhzKSAqLworICAgIGlmIChsZW4yIDw9IDApCisgICAgICAgIHJldHVybiBjcmMxOworCisgICAgLyogcHV0IG9wZXJhdG9yIGZvciBvbmUgemVybyBiaXQgaW4gb2RkICovCisgICAgb2RkWzBdID0gMHhlZGI4ODMyMFVMOyAgICAgICAgICAvKiBDUkMtMzIgcG9seW5vbWlhbCAqLworICAgIHJvdyA9IDE7CisgICAgZm9yIChuID0gMTsgbiA8IEdGMl9ESU07IG4rKykgeworICAgICAgICBvZGRbbl0gPSByb3c7CisgICAgICAgIHJvdyA8PD0gMTsKKyAgICB9CisKKyAgICAvKiBwdXQgb3BlcmF0b3IgZm9yIHR3byB6ZXJvIGJpdHMgaW4gZXZlbiAqLworICAgIGdmMl9tYXRyaXhfc3F1YXJlKGV2ZW4sIG9kZCk7CisKKyAgICAvKiBwdXQgb3BlcmF0b3IgZm9yIGZvdXIgemVybyBiaXRzIGluIG9kZCAqLworICAgIGdmMl9tYXRyaXhfc3F1YXJlKG9kZCwgZXZlbik7CisKKyAgICAvKiBhcHBseSBsZW4yIHplcm9zIHRvIGNyYzEgKGZpcnN0IHNxdWFyZSB3aWxsIHB1dCB0aGUgb3BlcmF0b3IgZm9yIG9uZQorICAgICAgIHplcm8gYnl0ZSwgZWlnaHQgemVybyBiaXRzLCBpbiBldmVuKSAqLworICAgIGRvIHsKKyAgICAgICAgLyogYXBwbHkgemVyb3Mgb3BlcmF0b3IgZm9yIHRoaXMgYml0IG9mIGxlbjIgKi8KKyAgICAgICAgZ2YyX21hdHJpeF9zcXVhcmUoZXZlbiwgb2RkKTsKKyAgICAgICAgaWYgKGxlbjIgJiAxKQorICAgICAgICAgICAgY3JjMSA9IGdmMl9tYXRyaXhfdGltZXMoZXZlbiwgY3JjMSk7CisgICAgICAgIGxlbjIgPj49IDE7CisKKyAgICAgICAgLyogaWYgbm8gbW9yZSBiaXRzIHNldCwgdGhlbiBkb25lICovCisgICAgICAgIGlmIChsZW4yID09IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBhbm90aGVyIGl0ZXJhdGlvbiBvZiB0aGUgbG9vcCB3aXRoIG9kZCBhbmQgZXZlbiBzd2FwcGVkICovCisgICAgICAgIGdmMl9tYXRyaXhfc3F1YXJlKG9kZCwgZXZlbik7CisgICAgICAgIGlmIChsZW4yICYgMSkKKyAgICAgICAgICAgIGNyYzEgPSBnZjJfbWF0cml4X3RpbWVzKG9kZCwgY3JjMSk7CisgICAgICAgIGxlbjIgPj49IDE7CisKKyAgICAgICAgLyogaWYgbm8gbW9yZSBiaXRzIHNldCwgdGhlbiBkb25lICovCisgICAgfSB3aGlsZSAobGVuMiAhPSAwKTsKKworICAgIC8qIHJldHVybiBjb21iaW5lZCBjcmMgKi8KKyAgICBjcmMxIF49IGNyYzI7CisgICAgcmV0dXJuIGNyYzE7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3VMb25nIFpFWFBPUlQgY3JjMzJfY29tYmluZShjcmMxLCBjcmMyLCBsZW4yKQorICAgIHVMb25nIGNyYzE7CisgICAgdUxvbmcgY3JjMjsKKyAgICB6X29mZl90IGxlbjI7Cit7CisgICAgcmV0dXJuIGNyYzMyX2NvbWJpbmVfKGNyYzEsIGNyYzIsIGxlbjIpOworfQorCit1TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmU2NChjcmMxLCBjcmMyLCBsZW4yKQorICAgIHVMb25nIGNyYzE7CisgICAgdUxvbmcgY3JjMjsKKyAgICB6X29mZjY0X3QgbGVuMjsKK3sKKyAgICByZXR1cm4gY3JjMzJfY29tYmluZV8oY3JjMSwgY3JjMiwgbGVuMik7Cit9CmRpZmYgLS1naXQgYS96bGliL3NyYy9jcmMzMi5oIGIvemxpYi9zcmMvY3JjMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTBjNzc4Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvY3JjMzIuaApAQCAtMCwwICsxLDQ0MSBAQAorLyogY3JjMzIuaCAtLSB0YWJsZXMgZm9yIHJhcGlkIENSQyBjYWxjdWxhdGlvbgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY3JjMzIuYworICovCisKK2xvY2FsIGNvbnN0IHpfY3JjX3QgRkFSIGNyY190YWJsZVtUQkxTXVsyNTZdID0KK3sKKyAgeworICAgIDB4MDAwMDAwMDBVTCwgMHg3NzA3MzA5NlVMLCAweGVlMGU2MTJjVUwsIDB4OTkwOTUxYmFVTCwgMHgwNzZkYzQxOVVMLAorICAgIDB4NzA2YWY0OGZVTCwgMHhlOTYzYTUzNVVMLCAweDllNjQ5NWEzVUwsIDB4MGVkYjg4MzJVTCwgMHg3OWRjYjhhNFVMLAorICAgIDB4ZTBkNWU5MWVVTCwgMHg5N2QyZDk4OFVMLCAweDA5YjY0YzJiVUwsIDB4N2ViMTdjYmRVTCwgMHhlN2I4MmQwN1VMLAorICAgIDB4OTBiZjFkOTFVTCwgMHgxZGI3MTA2NFVMLCAweDZhYjAyMGYyVUwsIDB4ZjNiOTcxNDhVTCwgMHg4NGJlNDFkZVVMLAorICAgIDB4MWFkYWQ0N2RVTCwgMHg2ZGRkZTRlYlVMLCAweGY0ZDRiNTUxVUwsIDB4ODNkMzg1YzdVTCwgMHgxMzZjOTg1NlVMLAorICAgIDB4NjQ2YmE4YzBVTCwgMHhmZDYyZjk3YVVMLCAweDhhNjVjOWVjVUwsIDB4MTQwMTVjNGZVTCwgMHg2MzA2NmNkOVVMLAorICAgIDB4ZmEwZjNkNjNVTCwgMHg4ZDA4MGRmNVVMLCAweDNiNmUyMGM4VUwsIDB4NGM2OTEwNWVVTCwgMHhkNTYwNDFlNFVMLAorICAgIDB4YTI2NzcxNzJVTCwgMHgzYzAzZTRkMVVMLCAweDRiMDRkNDQ3VUwsIDB4ZDIwZDg1ZmRVTCwgMHhhNTBhYjU2YlVMLAorICAgIDB4MzViNWE4ZmFVTCwgMHg0MmIyOTg2Y1VMLCAweGRiYmJjOWQ2VUwsIDB4YWNiY2Y5NDBVTCwgMHgzMmQ4NmNlM1VMLAorICAgIDB4NDVkZjVjNzVVTCwgMHhkY2Q2MGRjZlVMLCAweGFiZDEzZDU5VUwsIDB4MjZkOTMwYWNVTCwgMHg1MWRlMDAzYVVMLAorICAgIDB4YzhkNzUxODBVTCwgMHhiZmQwNjExNlVMLCAweDIxYjRmNGI1VUwsIDB4NTZiM2M0MjNVTCwgMHhjZmJhOTU5OVVMLAorICAgIDB4YjhiZGE1MGZVTCwgMHgyODAyYjg5ZVVMLCAweDVmMDU4ODA4VUwsIDB4YzYwY2Q5YjJVTCwgMHhiMTBiZTkyNFVMLAorICAgIDB4MmY2ZjdjODdVTCwgMHg1ODY4NGMxMVVMLCAweGMxNjExZGFiVUwsIDB4YjY2NjJkM2RVTCwgMHg3NmRjNDE5MFVMLAorICAgIDB4MDFkYjcxMDZVTCwgMHg5OGQyMjBiY1VMLCAweGVmZDUxMDJhVUwsIDB4NzFiMTg1ODlVTCwgMHgwNmI2YjUxZlVMLAorICAgIDB4OWZiZmU0YTVVTCwgMHhlOGI4ZDQzM1VMLCAweDc4MDdjOWEyVUwsIDB4MGYwMGY5MzRVTCwgMHg5NjA5YTg4ZVVMLAorICAgIDB4ZTEwZTk4MThVTCwgMHg3ZjZhMGRiYlVMLCAweDA4NmQzZDJkVUwsIDB4OTE2NDZjOTdVTCwgMHhlNjYzNWMwMVVMLAorICAgIDB4NmI2YjUxZjRVTCwgMHgxYzZjNjE2MlVMLCAweDg1NjUzMGQ4VUwsIDB4ZjI2MjAwNGVVTCwgMHg2YzA2OTVlZFVMLAorICAgIDB4MWIwMWE1N2JVTCwgMHg4MjA4ZjRjMVVMLCAweGY1MGZjNDU3VUwsIDB4NjViMGQ5YzZVTCwgMHgxMmI3ZTk1MFVMLAorICAgIDB4OGJiZWI4ZWFVTCwgMHhmY2I5ODg3Y1VMLCAweDYyZGQxZGRmVUwsIDB4MTVkYTJkNDlVTCwgMHg4Y2QzN2NmM1VMLAorICAgIDB4ZmJkNDRjNjVVTCwgMHg0ZGIyNjE1OFVMLCAweDNhYjU1MWNlVUwsIDB4YTNiYzAwNzRVTCwgMHhkNGJiMzBlMlVMLAorICAgIDB4NGFkZmE1NDFVTCwgMHgzZGQ4OTVkN1VMLCAweGE0ZDFjNDZkVUwsIDB4ZDNkNmY0ZmJVTCwgMHg0MzY5ZTk2YVVMLAorICAgIDB4MzQ2ZWQ5ZmNVTCwgMHhhZDY3ODg0NlVMLCAweGRhNjBiOGQwVUwsIDB4NDQwNDJkNzNVTCwgMHgzMzAzMWRlNVVMLAorICAgIDB4YWEwYTRjNWZVTCwgMHhkZDBkN2NjOVVMLCAweDUwMDU3MTNjVUwsIDB4MjcwMjQxYWFVTCwgMHhiZTBiMTAxMFVMLAorICAgIDB4YzkwYzIwODZVTCwgMHg1NzY4YjUyNVVMLCAweDIwNmY4NWIzVUwsIDB4Yjk2NmQ0MDlVTCwgMHhjZTYxZTQ5ZlVMLAorICAgIDB4NWVkZWY5MGVVTCwgMHgyOWQ5Yzk5OFVMLCAweGIwZDA5ODIyVUwsIDB4YzdkN2E4YjRVTCwgMHg1OWIzM2QxN1VMLAorICAgIDB4MmViNDBkODFVTCwgMHhiN2JkNWMzYlVMLCAweGMwYmE2Y2FkVUwsIDB4ZWRiODgzMjBVTCwgMHg5YWJmYjNiNlVMLAorICAgIDB4MDNiNmUyMGNVTCwgMHg3NGIxZDI5YVVMLCAweGVhZDU0NzM5VUwsIDB4OWRkMjc3YWZVTCwgMHgwNGRiMjYxNVVMLAorICAgIDB4NzNkYzE2ODNVTCwgMHhlMzYzMGIxMlVMLCAweDk0NjQzYjg0VUwsIDB4MGQ2ZDZhM2VVTCwgMHg3YTZhNWFhOFVMLAorICAgIDB4ZTQwZWNmMGJVTCwgMHg5MzA5ZmY5ZFVMLCAweDBhMDBhZTI3VUwsIDB4N2QwNzllYjFVTCwgMHhmMDBmOTM0NFVMLAorICAgIDB4ODcwOGEzZDJVTCwgMHgxZTAxZjI2OFVMLCAweDY5MDZjMmZlVUwsIDB4Zjc2MjU3NWRVTCwgMHg4MDY1NjdjYlVMLAorICAgIDB4MTk2YzM2NzFVTCwgMHg2ZTZiMDZlN1VMLCAweGZlZDQxYjc2VUwsIDB4ODlkMzJiZTBVTCwgMHgxMGRhN2E1YVVMLAorICAgIDB4NjdkZDRhY2NVTCwgMHhmOWI5ZGY2ZlVMLCAweDhlYmVlZmY5VUwsIDB4MTdiN2JlNDNVTCwgMHg2MGIwOGVkNVVMLAorICAgIDB4ZDZkNmEzZThVTCwgMHhhMWQxOTM3ZVVMLCAweDM4ZDhjMmM0VUwsIDB4NGZkZmYyNTJVTCwgMHhkMWJiNjdmMVVMLAorICAgIDB4YTZiYzU3NjdVTCwgMHgzZmI1MDZkZFVMLCAweDQ4YjIzNjRiVUwsIDB4ZDgwZDJiZGFVTCwgMHhhZjBhMWI0Y1VMLAorICAgIDB4MzYwMzRhZjZVTCwgMHg0MTA0N2E2MFVMLCAweGRmNjBlZmMzVUwsIDB4YTg2N2RmNTVVTCwgMHgzMTZlOGVlZlVMLAorICAgIDB4NDY2OWJlNzlVTCwgMHhjYjYxYjM4Y1VMLCAweGJjNjY4MzFhVUwsIDB4MjU2ZmQyYTBVTCwgMHg1MjY4ZTIzNlVMLAorICAgIDB4Y2MwYzc3OTVVTCwgMHhiYjBiNDcwM1VMLCAweDIyMDIxNmI5VUwsIDB4NTUwNTI2MmZVTCwgMHhjNWJhM2JiZVVMLAorICAgIDB4YjJiZDBiMjhVTCwgMHgyYmI0NWE5MlVMLCAweDVjYjM2YTA0VUwsIDB4YzJkN2ZmYTdVTCwgMHhiNWQwY2YzMVVMLAorICAgIDB4MmNkOTllOGJVTCwgMHg1YmRlYWUxZFVMLCAweDliNjRjMmIwVUwsIDB4ZWM2M2YyMjZVTCwgMHg3NTZhYTM5Y1VMLAorICAgIDB4MDI2ZDkzMGFVTCwgMHg5YzA5MDZhOVVMLCAweGViMGUzNjNmVUwsIDB4NzIwNzY3ODVVTCwgMHgwNTAwNTcxM1VMLAorICAgIDB4OTViZjRhODJVTCwgMHhlMmI4N2ExNFVMLCAweDdiYjEyYmFlVUwsIDB4MGNiNjFiMzhVTCwgMHg5MmQyOGU5YlVMLAorICAgIDB4ZTVkNWJlMGRVTCwgMHg3Y2RjZWZiN1VMLCAweDBiZGJkZjIxVUwsIDB4ODZkM2QyZDRVTCwgMHhmMWQ0ZTI0MlVMLAorICAgIDB4NjhkZGIzZjhVTCwgMHgxZmRhODM2ZVVMLCAweDgxYmUxNmNkVUwsIDB4ZjZiOTI2NWJVTCwgMHg2ZmIwNzdlMVVMLAorICAgIDB4MThiNzQ3NzdVTCwgMHg4ODA4NWFlNlVMLCAweGZmMGY2YTcwVUwsIDB4NjYwNjNiY2FVTCwgMHgxMTAxMGI1Y1VMLAorICAgIDB4OGY2NTllZmZVTCwgMHhmODYyYWU2OVVMLCAweDYxNmJmZmQzVUwsIDB4MTY2Y2NmNDVVTCwgMHhhMDBhZTI3OFVMLAorICAgIDB4ZDcwZGQyZWVVTCwgMHg0ZTA0ODM1NFVMLCAweDM5MDNiM2MyVUwsIDB4YTc2NzI2NjFVTCwgMHhkMDYwMTZmN1VMLAorICAgIDB4NDk2OTQ3NGRVTCwgMHgzZTZlNzdkYlVMLCAweGFlZDE2YTRhVUwsIDB4ZDlkNjVhZGNVTCwgMHg0MGRmMGI2NlVMLAorICAgIDB4MzdkODNiZjBVTCwgMHhhOWJjYWU1M1VMLCAweGRlYmI5ZWM1VUwsIDB4NDdiMmNmN2ZVTCwgMHgzMGI1ZmZlOVVMLAorICAgIDB4YmRiZGYyMWNVTCwgMHhjYWJhYzI4YVVMLCAweDUzYjM5MzMwVUwsIDB4MjRiNGEzYTZVTCwgMHhiYWQwMzYwNVVMLAorICAgIDB4Y2RkNzA2OTNVTCwgMHg1NGRlNTcyOVVMLCAweDIzZDk2N2JmVUwsIDB4YjM2NjdhMmVVTCwgMHhjNDYxNGFiOFVMLAorICAgIDB4NWQ2ODFiMDJVTCwgMHgyYTZmMmI5NFVMLCAweGI0MGJiZTM3VUwsIDB4YzMwYzhlYTFVTCwgMHg1YTA1ZGYxYlVMLAorICAgIDB4MmQwMmVmOGRVTAorI2lmZGVmIEJZRk9VUgorICB9LAorICB7CisgICAgMHgwMDAwMDAwMFVMLCAweDE5MWIzMTQxVUwsIDB4MzIzNjYyODJVTCwgMHgyYjJkNTNjM1VMLCAweDY0NmNjNTA0VUwsCisgICAgMHg3ZDc3ZjQ0NVVMLCAweDU2NWFhNzg2VUwsIDB4NGY0MTk2YzdVTCwgMHhjOGQ5OGEwOFVMLCAweGQxYzJiYjQ5VUwsCisgICAgMHhmYWVmZTg4YVVMLCAweGUzZjRkOWNiVUwsIDB4YWNiNTRmMGNVTCwgMHhiNWFlN2U0ZFVMLCAweDllODMyZDhlVUwsCisgICAgMHg4Nzk4MWNjZlVMLCAweDRhYzIxMjUxVUwsIDB4NTNkOTIzMTBVTCwgMHg3OGY0NzBkM1VMLCAweDYxZWY0MTkyVUwsCisgICAgMHgyZWFlZDc1NVVMLCAweDM3YjVlNjE0VUwsIDB4MWM5OGI1ZDdVTCwgMHgwNTgzODQ5NlVMLCAweDgyMWI5ODU5VUwsCisgICAgMHg5YjAwYTkxOFVMLCAweGIwMmRmYWRiVUwsIDB4YTkzNmNiOWFVTCwgMHhlNjc3NWQ1ZFVMLCAweGZmNmM2YzFjVUwsCisgICAgMHhkNDQxM2ZkZlVMLCAweGNkNWEwZTllVUwsIDB4OTU4NDI0YTJVTCwgMHg4YzlmMTVlM1VMLCAweGE3YjI0NjIwVUwsCisgICAgMHhiZWE5Nzc2MVVMLCAweGYxZThlMWE2VUwsIDB4ZThmM2QwZTdVTCwgMHhjM2RlODMyNFVMLCAweGRhYzViMjY1VUwsCisgICAgMHg1ZDVkYWVhYVVMLCAweDQ0NDY5ZmViVUwsIDB4NmY2YmNjMjhVTCwgMHg3NjcwZmQ2OVVMLCAweDM5MzE2YmFlVUwsCisgICAgMHgyMDJhNWFlZlVMLCAweDBiMDcwOTJjVUwsIDB4MTIxYzM4NmRVTCwgMHhkZjQ2MzZmM1VMLCAweGM2NWQwN2IyVUwsCisgICAgMHhlZDcwNTQ3MVVMLCAweGY0NmI2NTMwVUwsIDB4YmIyYWYzZjdVTCwgMHhhMjMxYzJiNlVMLCAweDg5MWM5MTc1VUwsCisgICAgMHg5MDA3YTAzNFVMLCAweDE3OWZiY2ZiVUwsIDB4MGU4NDhkYmFVTCwgMHgyNWE5ZGU3OVVMLCAweDNjYjJlZjM4VUwsCisgICAgMHg3M2YzNzlmZlVMLCAweDZhZTg0OGJlVUwsIDB4NDFjNTFiN2RVTCwgMHg1OGRlMmEzY1VMLCAweGYwNzk0ZjA1VUwsCisgICAgMHhlOTYyN2U0NFVMLCAweGMyNGYyZDg3VUwsIDB4ZGI1NDFjYzZVTCwgMHg5NDE1OGEwMVVMLCAweDhkMGViYjQwVUwsCisgICAgMHhhNjIzZTg4M1VMLCAweGJmMzhkOWMyVUwsIDB4MzhhMGM1MGRVTCwgMHgyMWJiZjQ0Y1VMLCAweDBhOTZhNzhmVUwsCisgICAgMHgxMzhkOTZjZVVMLCAweDVjY2MwMDA5VUwsIDB4NDVkNzMxNDhVTCwgMHg2ZWZhNjI4YlVMLCAweDc3ZTE1M2NhVUwsCisgICAgMHhiYWJiNWQ1NFVMLCAweGEzYTA2YzE1VUwsIDB4ODg4ZDNmZDZVTCwgMHg5MTk2MGU5N1VMLCAweGRlZDc5ODUwVUwsCisgICAgMHhjN2NjYTkxMVVMLCAweGVjZTFmYWQyVUwsIDB4ZjVmYWNiOTNVTCwgMHg3MjYyZDc1Y1VMLCAweDZiNzllNjFkVUwsCisgICAgMHg0MDU0YjVkZVVMLCAweDU5NGY4NDlmVUwsIDB4MTYwZTEyNThVTCwgMHgwZjE1MjMxOVVMLCAweDI0Mzg3MGRhVUwsCisgICAgMHgzZDIzNDE5YlVMLCAweDY1ZmQ2YmE3VUwsIDB4N2NlNjVhZTZVTCwgMHg1N2NiMDkyNVVMLCAweDRlZDAzODY0VUwsCisgICAgMHgwMTkxYWVhM1VMLCAweDE4OGE5ZmUyVUwsIDB4MzNhN2NjMjFVTCwgMHgyYWJjZmQ2MFVMLCAweGFkMjRlMWFmVUwsCisgICAgMHhiNDNmZDBlZVVMLCAweDlmMTI4MzJkVUwsIDB4ODYwOWIyNmNVTCwgMHhjOTQ4MjRhYlVMLCAweGQwNTMxNWVhVUwsCisgICAgMHhmYjdlNDYyOVVMLCAweGUyNjU3NzY4VUwsIDB4MmYzZjc5ZjZVTCwgMHgzNjI0NDhiN1VMLCAweDFkMDkxYjc0VUwsCisgICAgMHgwNDEyMmEzNVVMLCAweDRiNTNiY2YyVUwsIDB4NTI0ODhkYjNVTCwgMHg3OTY1ZGU3MFVMLCAweDYwN2VlZjMxVUwsCisgICAgMHhlN2U2ZjNmZVVMLCAweGZlZmRjMmJmVUwsIDB4ZDVkMDkxN2NVTCwgMHhjY2NiYTAzZFVMLCAweDgzOGEzNmZhVUwsCisgICAgMHg5YTkxMDdiYlVMLCAweGIxYmM1NDc4VUwsIDB4YThhNzY1MzlVTCwgMHgzYjgzOTg0YlVMLCAweDIyOThhOTBhVUwsCisgICAgMHgwOWI1ZmFjOVVMLCAweDEwYWVjYjg4VUwsIDB4NWZlZjVkNGZVTCwgMHg0NmY0NmMwZVVMLCAweDZkZDkzZmNkVUwsCisgICAgMHg3NGMyMGU4Y1VMLCAweGYzNWExMjQzVUwsIDB4ZWE0MTIzMDJVTCwgMHhjMTZjNzBjMVVMLCAweGQ4Nzc0MTgwVUwsCisgICAgMHg5NzM2ZDc0N1VMLCAweDhlMmRlNjA2VUwsIDB4YTUwMGI1YzVVTCwgMHhiYzFiODQ4NFVMLCAweDcxNDE4YTFhVUwsCisgICAgMHg2ODVhYmI1YlVMLCAweDQzNzdlODk4VUwsIDB4NWE2Y2Q5ZDlVTCwgMHgxNTJkNGYxZVVMLCAweDBjMzY3ZTVmVUwsCisgICAgMHgyNzFiMmQ5Y1VMLCAweDNlMDAxY2RkVUwsIDB4Yjk5ODAwMTJVTCwgMHhhMDgzMzE1M1VMLCAweDhiYWU2MjkwVUwsCisgICAgMHg5MmI1NTNkMVVMLCAweGRkZjRjNTE2VUwsIDB4YzRlZmY0NTdVTCwgMHhlZmMyYTc5NFVMLCAweGY2ZDk5NmQ1VUwsCisgICAgMHhhZTA3YmNlOVVMLCAweGI3MWM4ZGE4VUwsIDB4OWMzMWRlNmJVTCwgMHg4NTJhZWYyYVVMLCAweGNhNmI3OWVkVUwsCisgICAgMHhkMzcwNDhhY1VMLCAweGY4NWQxYjZmVUwsIDB4ZTE0NjJhMmVVTCwgMHg2NmRlMzZlMVVMLCAweDdmYzUwN2EwVUwsCisgICAgMHg1NGU4NTQ2M1VMLCAweDRkZjM2NTIyVUwsIDB4MDJiMmYzZTVVTCwgMHgxYmE5YzJhNFVMLCAweDMwODQ5MTY3VUwsCisgICAgMHgyOTlmYTAyNlVMLCAweGU0YzVhZWI4VUwsIDB4ZmRkZTlmZjlVTCwgMHhkNmYzY2MzYVVMLCAweGNmZThmZDdiVUwsCisgICAgMHg4MGE5NmJiY1VMLCAweDk5YjI1YWZkVUwsIDB4YjI5ZjA5M2VVTCwgMHhhYjg0Mzg3ZlVMLCAweDJjMWMyNGIwVUwsCisgICAgMHgzNTA3MTVmMVVMLCAweDFlMmE0NjMyVUwsIDB4MDczMTc3NzNVTCwgMHg0ODcwZTFiNFVMLCAweDUxNmJkMGY1VUwsCisgICAgMHg3YTQ2ODMzNlVMLCAweDYzNWRiMjc3VUwsIDB4Y2JmYWQ3NGVVTCwgMHhkMmUxZTYwZlVMLCAweGY5Y2NiNWNjVUwsCisgICAgMHhlMGQ3ODQ4ZFVMLCAweGFmOTYxMjRhVUwsIDB4YjY4ZDIzMGJVTCwgMHg5ZGEwNzBjOFVMLCAweDg0YmI0MTg5VUwsCisgICAgMHgwMzIzNWQ0NlVMLCAweDFhMzg2YzA3VUwsIDB4MzExNTNmYzRVTCwgMHgyODBlMGU4NVVMLCAweDY3NGY5ODQyVUwsCisgICAgMHg3ZTU0YTkwM1VMLCAweDU1NzlmYWMwVUwsIDB4NGM2MmNiODFVTCwgMHg4MTM4YzUxZlVMLCAweDk4MjNmNDVlVUwsCisgICAgMHhiMzBlYTc5ZFVMLCAweGFhMTU5NmRjVUwsIDB4ZTU1NDAwMWJVTCwgMHhmYzRmMzE1YVVMLCAweGQ3NjI2Mjk5VUwsCisgICAgMHhjZTc5NTNkOFVMLCAweDQ5ZTE0ZjE3VUwsIDB4NTBmYTdlNTZVTCwgMHg3YmQ3MmQ5NVVMLCAweDYyY2MxY2Q0VUwsCisgICAgMHgyZDhkOGExM1VMLCAweDM0OTZiYjUyVUwsIDB4MWZiYmU4OTFVTCwgMHgwNmEwZDlkMFVMLCAweDVlN2VmM2VjVUwsCisgICAgMHg0NzY1YzJhZFVMLCAweDZjNDg5MTZlVUwsIDB4NzU1M2EwMmZVTCwgMHgzYTEyMzZlOFVMLCAweDIzMDkwN2E5VUwsCisgICAgMHgwODI0NTQ2YVVMLCAweDExM2Y2NTJiVUwsIDB4OTZhNzc5ZTRVTCwgMHg4ZmJjNDhhNVVMLCAweGE0OTExYjY2VUwsCisgICAgMHhiZDhhMmEyN1VMLCAweGYyY2JiY2UwVUwsIDB4ZWJkMDhkYTFVTCwgMHhjMGZkZGU2MlVMLCAweGQ5ZTZlZjIzVUwsCisgICAgMHgxNGJjZTFiZFVMLCAweDBkYTdkMGZjVUwsIDB4MjY4YTgzM2ZVTCwgMHgzZjkxYjI3ZVVMLCAweDcwZDAyNGI5VUwsCisgICAgMHg2OWNiMTVmOFVMLCAweDQyZTY0NjNiVUwsIDB4NWJmZDc3N2FVTCwgMHhkYzY1NmJiNVVMLCAweGM1N2U1YWY0VUwsCisgICAgMHhlZTUzMDkzN1VMLCAweGY3NDgzODc2VUwsIDB4YjgwOWFlYjFVTCwgMHhhMTEyOWZmMFVMLCAweDhhM2ZjYzMzVUwsCisgICAgMHg5MzI0ZmQ3MlVMCisgIH0sCisgIHsKKyAgICAweDAwMDAwMDAwVUwsIDB4MDFjMjZhMzdVTCwgMHgwMzg0ZDQ2ZVVMLCAweDAyNDZiZTU5VUwsIDB4MDcwOWE4ZGNVTCwKKyAgICAweDA2Y2JjMmViVUwsIDB4MDQ4ZDdjYjJVTCwgMHgwNTRmMTY4NVVMLCAweDBlMTM1MWI4VUwsIDB4MGZkMTNiOGZVTCwKKyAgICAweDBkOTc4NWQ2VUwsIDB4MGM1NWVmZTFVTCwgMHgwOTFhZjk2NFVMLCAweDA4ZDg5MzUzVUwsIDB4MGE5ZTJkMGFVTCwKKyAgICAweDBiNWM0NzNkVUwsIDB4MWMyNmEzNzBVTCwgMHgxZGU0Yzk0N1VMLCAweDFmYTI3NzFlVUwsIDB4MWU2MDFkMjlVTCwKKyAgICAweDFiMmYwYmFjVUwsIDB4MWFlZDYxOWJVTCwgMHgxOGFiZGZjMlVMLCAweDE5NjliNWY1VUwsIDB4MTIzNWYyYzhVTCwKKyAgICAweDEzZjc5OGZmVUwsIDB4MTFiMTI2YTZVTCwgMHgxMDczNGM5MVVMLCAweDE1M2M1YTE0VUwsIDB4MTRmZTMwMjNVTCwKKyAgICAweDE2Yjg4ZTdhVUwsIDB4MTc3YWU0NGRVTCwgMHgzODRkNDZlMFVMLCAweDM5OGYyY2Q3VUwsIDB4M2JjOTkyOGVVTCwKKyAgICAweDNhMGJmOGI5VUwsIDB4M2Y0NGVlM2NVTCwgMHgzZTg2ODQwYlVMLCAweDNjYzAzYTUyVUwsIDB4M2QwMjUwNjVVTCwKKyAgICAweDM2NWUxNzU4VUwsIDB4Mzc5YzdkNmZVTCwgMHgzNWRhYzMzNlVMLCAweDM0MThhOTAxVUwsIDB4MzE1N2JmODRVTCwKKyAgICAweDMwOTVkNWIzVUwsIDB4MzJkMzZiZWFVTCwgMHgzMzExMDFkZFVMLCAweDI0NmJlNTkwVUwsIDB4MjVhOThmYTdVTCwKKyAgICAweDI3ZWYzMWZlVUwsIDB4MjYyZDViYzlVTCwgMHgyMzYyNGQ0Y1VMLCAweDIyYTAyNzdiVUwsIDB4MjBlNjk5MjJVTCwKKyAgICAweDIxMjRmMzE1VUwsIDB4MmE3OGI0MjhVTCwgMHgyYmJhZGUxZlVMLCAweDI5ZmM2MDQ2VUwsIDB4MjgzZTBhNzFVTCwKKyAgICAweDJkNzExY2Y0VUwsIDB4MmNiMzc2YzNVTCwgMHgyZWY1Yzg5YVVMLCAweDJmMzdhMmFkVUwsIDB4NzA5YThkYzBVTCwKKyAgICAweDcxNThlN2Y3VUwsIDB4NzMxZTU5YWVVTCwgMHg3MmRjMzM5OVVMLCAweDc3OTMyNTFjVUwsIDB4NzY1MTRmMmJVTCwKKyAgICAweDc0MTdmMTcyVUwsIDB4NzVkNTliNDVVTCwgMHg3ZTg5ZGM3OFVMLCAweDdmNGJiNjRmVUwsIDB4N2QwZDA4MTZVTCwKKyAgICAweDdjY2Y2MjIxVUwsIDB4Nzk4MDc0YTRVTCwgMHg3ODQyMWU5M1VMLCAweDdhMDRhMGNhVUwsIDB4N2JjNmNhZmRVTCwKKyAgICAweDZjYmMyZWIwVUwsIDB4NmQ3ZTQ0ODdVTCwgMHg2ZjM4ZmFkZVVMLCAweDZlZmE5MGU5VUwsIDB4NmJiNTg2NmNVTCwKKyAgICAweDZhNzdlYzViVUwsIDB4NjgzMTUyMDJVTCwgMHg2OWYzMzgzNVVMLCAweDYyYWY3ZjA4VUwsIDB4NjM2ZDE1M2ZVTCwKKyAgICAweDYxMmJhYjY2VUwsIDB4NjBlOWMxNTFVTCwgMHg2NWE2ZDdkNFVMLCAweDY0NjRiZGUzVUwsIDB4NjYyMjAzYmFVTCwKKyAgICAweDY3ZTA2OThkVUwsIDB4NDhkN2NiMjBVTCwgMHg0OTE1YTExN1VMLCAweDRiNTMxZjRlVUwsIDB4NGE5MTc1NzlVTCwKKyAgICAweDRmZGU2M2ZjVUwsIDB4NGUxYzA5Y2JVTCwgMHg0YzVhYjc5MlVMLCAweDRkOThkZGE1VUwsIDB4NDZjNDlhOThVTCwKKyAgICAweDQ3MDZmMGFmVUwsIDB4NDU0MDRlZjZVTCwgMHg0NDgyMjRjMVVMLCAweDQxY2QzMjQ0VUwsIDB4NDAwZjU4NzNVTCwKKyAgICAweDQyNDllNjJhVUwsIDB4NDM4YjhjMWRVTCwgMHg1NGYxNjg1MFVMLCAweDU1MzMwMjY3VUwsIDB4NTc3NWJjM2VVTCwKKyAgICAweDU2YjdkNjA5VUwsIDB4NTNmOGMwOGNVTCwgMHg1MjNhYWFiYlVMLCAweDUwN2MxNGUyVUwsIDB4NTFiZTdlZDVVTCwKKyAgICAweDVhZTIzOWU4VUwsIDB4NWIyMDUzZGZVTCwgMHg1OTY2ZWQ4NlVMLCAweDU4YTQ4N2IxVUwsIDB4NWRlYjkxMzRVTCwKKyAgICAweDVjMjlmYjAzVUwsIDB4NWU2ZjQ1NWFVTCwgMHg1ZmFkMmY2ZFVMLCAweGUxMzUxYjgwVUwsIDB4ZTBmNzcxYjdVTCwKKyAgICAweGUyYjFjZmVlVUwsIDB4ZTM3M2E1ZDlVTCwgMHhlNjNjYjM1Y1VMLCAweGU3ZmVkOTZiVUwsIDB4ZTViODY3MzJVTCwKKyAgICAweGU0N2EwZDA1VUwsIDB4ZWYyNjRhMzhVTCwgMHhlZWU0MjAwZlVMLCAweGVjYTI5ZTU2VUwsIDB4ZWQ2MGY0NjFVTCwKKyAgICAweGU4MmZlMmU0VUwsIDB4ZTllZDg4ZDNVTCwgMHhlYmFiMzY4YVVMLCAweGVhNjk1Y2JkVUwsIDB4ZmQxM2I4ZjBVTCwKKyAgICAweGZjZDFkMmM3VUwsIDB4ZmU5NzZjOWVVTCwgMHhmZjU1MDZhOVVMLCAweGZhMWExMDJjVUwsIDB4ZmJkODdhMWJVTCwKKyAgICAweGY5OWVjNDQyVUwsIDB4Zjg1Y2FlNzVVTCwgMHhmMzAwZTk0OFVMLCAweGYyYzI4MzdmVUwsIDB4ZjA4NDNkMjZVTCwKKyAgICAweGYxNDY1NzExVUwsIDB4ZjQwOTQxOTRVTCwgMHhmNWNiMmJhM1VMLCAweGY3OGQ5NWZhVUwsIDB4ZjY0ZmZmY2RVTCwKKyAgICAweGQ5Nzg1ZDYwVUwsIDB4ZDhiYTM3NTdVTCwgMHhkYWZjODkwZVVMLCAweGRiM2VlMzM5VUwsIDB4ZGU3MWY1YmNVTCwKKyAgICAweGRmYjM5ZjhiVUwsIDB4ZGRmNTIxZDJVTCwgMHhkYzM3NGJlNVVMLCAweGQ3NmIwY2Q4VUwsIDB4ZDZhOTY2ZWZVTCwKKyAgICAweGQ0ZWZkOGI2VUwsIDB4ZDUyZGIyODFVTCwgMHhkMDYyYTQwNFVMLCAweGQxYTBjZTMzVUwsIDB4ZDNlNjcwNmFVTCwKKyAgICAweGQyMjQxYTVkVUwsIDB4YzU1ZWZlMTBVTCwgMHhjNDljOTQyN1VMLCAweGM2ZGEyYTdlVUwsIDB4YzcxODQwNDlVTCwKKyAgICAweGMyNTc1NmNjVUwsIDB4YzM5NTNjZmJVTCwgMHhjMWQzODJhMlVMLCAweGMwMTFlODk1VUwsIDB4Y2I0ZGFmYThVTCwKKyAgICAweGNhOGZjNTlmVUwsIDB4YzhjOTdiYzZVTCwgMHhjOTBiMTFmMVVMLCAweGNjNDQwNzc0VUwsIDB4Y2Q4NjZkNDNVTCwKKyAgICAweGNmYzBkMzFhVUwsIDB4Y2UwMmI5MmRVTCwgMHg5MWFmOTY0MFVMLCAweDkwNmRmYzc3VUwsIDB4OTIyYjQyMmVVTCwKKyAgICAweDkzZTkyODE5VUwsIDB4OTZhNjNlOWNVTCwgMHg5NzY0NTRhYlVMLCAweDk1MjJlYWYyVUwsIDB4OTRlMDgwYzVVTCwKKyAgICAweDlmYmNjN2Y4VUwsIDB4OWU3ZWFkY2ZVTCwgMHg5YzM4MTM5NlVMLCAweDlkZmE3OWExVUwsIDB4OThiNTZmMjRVTCwKKyAgICAweDk5NzcwNTEzVUwsIDB4OWIzMWJiNGFVTCwgMHg5YWYzZDE3ZFVMLCAweDhkODkzNTMwVUwsIDB4OGM0YjVmMDdVTCwKKyAgICAweDhlMGRlMTVlVUwsIDB4OGZjZjhiNjlVTCwgMHg4YTgwOWRlY1VMLCAweDhiNDJmN2RiVUwsIDB4ODkwNDQ5ODJVTCwKKyAgICAweDg4YzYyM2I1VUwsIDB4ODM5YTY0ODhVTCwgMHg4MjU4MGViZlVMLCAweDgwMWViMGU2VUwsIDB4ODFkY2RhZDFVTCwKKyAgICAweDg0OTNjYzU0VUwsIDB4ODU1MWE2NjNVTCwgMHg4NzE3MTgzYVVMLCAweDg2ZDU3MjBkVUwsIDB4YTllMmQwYTBVTCwKKyAgICAweGE4MjBiYTk3VUwsIDB4YWE2NjA0Y2VVTCwgMHhhYmE0NmVmOVVMLCAweGFlZWI3ODdjVUwsIDB4YWYyOTEyNGJVTCwKKyAgICAweGFkNmZhYzEyVUwsIDB4YWNhZGM2MjVVTCwgMHhhN2YxODExOFVMLCAweGE2MzNlYjJmVUwsIDB4YTQ3NTU1NzZVTCwKKyAgICAweGE1YjczZjQxVUwsIDB4YTBmODI5YzRVTCwgMHhhMTNhNDNmM1VMLCAweGEzN2NmZGFhVUwsIDB4YTJiZTk3OWRVTCwKKyAgICAweGI1YzQ3M2QwVUwsIDB4YjQwNjE5ZTdVTCwgMHhiNjQwYTdiZVVMLCAweGI3ODJjZDg5VUwsIDB4YjJjZGRiMGNVTCwKKyAgICAweGIzMGZiMTNiVUwsIDB4YjE0OTBmNjJVTCwgMHhiMDhiNjU1NVVMLCAweGJiZDcyMjY4VUwsIDB4YmExNTQ4NWZVTCwKKyAgICAweGI4NTNmNjA2VUwsIDB4Yjk5MTljMzFVTCwgMHhiY2RlOGFiNFVMLCAweGJkMWNlMDgzVUwsIDB4YmY1YTVlZGFVTCwKKyAgICAweGJlOTgzNGVkVUwKKyAgfSwKKyAgeworICAgIDB4MDAwMDAwMDBVTCwgMHhiOGJjNjc2NVVMLCAweGFhMDljODhiVUwsIDB4MTJiNWFmZWVVTCwgMHg4ZjYyOTc1N1VMLAorICAgIDB4MzdkZWYwMzJVTCwgMHgyNTZiNWZkY1VMLCAweDlkZDczOGI5VUwsIDB4YzViNDI4ZWZVTCwgMHg3ZDA4NGY4YVVMLAorICAgIDB4NmZiZGUwNjRVTCwgMHhkNzAxODcwMVVMLCAweDRhZDZiZmI4VUwsIDB4ZjI2YWQ4ZGRVTCwgMHhlMGRmNzczM1VMLAorICAgIDB4NTg2MzEwNTZVTCwgMHg1MDE5NTc5ZlVMLCAweGU4YTUzMGZhVUwsIDB4ZmExMDlmMTRVTCwgMHg0MmFjZjg3MVVMLAorICAgIDB4ZGY3YmMwYzhVTCwgMHg2N2M3YTdhZFVMLCAweDc1NzIwODQzVUwsIDB4Y2RjZTZmMjZVTCwgMHg5NWFkN2Y3MFVMLAorICAgIDB4MmQxMTE4MTVVTCwgMHgzZmE0YjdmYlVMLCAweDg3MThkMDllVUwsIDB4MWFjZmU4MjdVTCwgMHhhMjczOGY0MlVMLAorICAgIDB4YjBjNjIwYWNVTCwgMHgwODdhNDdjOVVMLCAweGEwMzJhZjNlVUwsIDB4MTg4ZWM4NWJVTCwgMHgwYTNiNjdiNVVMLAorICAgIDB4YjI4NzAwZDBVTCwgMHgyZjUwMzg2OVVMLCAweDk3ZWM1ZjBjVUwsIDB4ODU1OWYwZTJVTCwgMHgzZGU1OTc4N1VMLAorICAgIDB4NjU4Njg3ZDFVTCwgMHhkZDNhZTBiNFVMLCAweGNmOGY0ZjVhVUwsIDB4NzczMzI4M2ZVTCwgMHhlYWU0MTA4NlVMLAorICAgIDB4NTI1ODc3ZTNVTCwgMHg0MGVkZDgwZFVMLCAweGY4NTFiZjY4VUwsIDB4ZjAyYmY4YTFVTCwgMHg0ODk3OWZjNFVMLAorICAgIDB4NWEyMjMwMmFVTCwgMHhlMjllNTc0ZlVMLCAweDdmNDk2ZmY2VUwsIDB4YzdmNTA4OTNVTCwgMHhkNTQwYTc3ZFVMLAorICAgIDB4NmRmY2MwMThVTCwgMHgzNTlmZDA0ZVVMLCAweDhkMjNiNzJiVUwsIDB4OWY5NjE4YzVVTCwgMHgyNzJhN2ZhMFVMLAorICAgIDB4YmFmZDQ3MTlVTCwgMHgwMjQxMjA3Y1VMLCAweDEwZjQ4ZjkyVUwsIDB4YTg0OGU4ZjdVTCwgMHg5YjE0NTgzZFVMLAorICAgIDB4MjNhODNmNThVTCwgMHgzMTFkOTBiNlVMLCAweDg5YTFmN2QzVUwsIDB4MTQ3NmNmNmFVTCwgMHhhY2NhYTgwZlVMLAorICAgIDB4YmU3ZjA3ZTFVTCwgMHgwNmMzNjA4NFVMLCAweDVlYTA3MGQyVUwsIDB4ZTYxYzE3YjdVTCwgMHhmNGE5Yjg1OVVMLAorICAgIDB4NGMxNWRmM2NVTCwgMHhkMWMyZTc4NVVMLCAweDY5N2U4MGUwVUwsIDB4N2JjYjJmMGVVTCwgMHhjMzc3NDg2YlVMLAorICAgIDB4Y2IwZDBmYTJVTCwgMHg3M2IxNjhjN1VMLCAweDYxMDRjNzI5VUwsIDB4ZDliOGEwNGNVTCwgMHg0NDZmOThmNVVMLAorICAgIDB4ZmNkM2ZmOTBVTCwgMHhlZTY2NTA3ZVVMLCAweDU2ZGEzNzFiVUwsIDB4MGViOTI3NGRVTCwgMHhiNjA1NDAyOFVMLAorICAgIDB4YTRiMGVmYzZVTCwgMHgxYzBjODhhM1VMLCAweDgxZGJiMDFhVUwsIDB4Mzk2N2Q3N2ZVTCwgMHgyYmQyNzg5MVVMLAorICAgIDB4OTM2ZTFmZjRVTCwgMHgzYjI2ZjcwM1VMLCAweDgzOWE5MDY2VUwsIDB4OTEyZjNmODhVTCwgMHgyOTkzNThlZFVMLAorICAgIDB4YjQ0NDYwNTRVTCwgMHgwY2Y4MDczMVVMLCAweDFlNGRhOGRmVUwsIDB4YTZmMWNmYmFVTCwgMHhmZTkyZGZlY1VMLAorICAgIDB4NDYyZWI4ODlVTCwgMHg1NDliMTc2N1VMLCAweGVjMjc3MDAyVUwsIDB4NzFmMDQ4YmJVTCwgMHhjOTRjMmZkZVVMLAorICAgIDB4ZGJmOTgwMzBVTCwgMHg2MzQ1ZTc1NVVMLCAweDZiM2ZhMDljVUwsIDB4ZDM4M2M3ZjlVTCwgMHhjMTM2NjgxN1VMLAorICAgIDB4Nzk4YTBmNzJVTCwgMHhlNDVkMzdjYlVMLCAweDVjZTE1MGFlVUwsIDB4NGU1NGZmNDBVTCwgMHhmNmU4OTgyNVVMLAorICAgIDB4YWU4Yjg4NzNVTCwgMHgxNjM3ZWYxNlVMLCAweDA0ODI0MGY4VUwsIDB4YmMzZTI3OWRVTCwgMHgyMWU5MWYyNFVMLAorICAgIDB4OTk1NTc4NDFVTCwgMHg4YmUwZDdhZlVMLCAweDMzNWNiMGNhVUwsIDB4ZWQ1OWI2M2JVTCwgMHg1NWU1ZDE1ZVVMLAorICAgIDB4NDc1MDdlYjBVTCwgMHhmZmVjMTlkNVVMLCAweDYyM2IyMTZjVUwsIDB4ZGE4NzQ2MDlVTCwgMHhjODMyZTllN1VMLAorICAgIDB4NzA4ZThlODJVTCwgMHgyOGVkOWVkNFVMLCAweDkwNTFmOWIxVUwsIDB4ODJlNDU2NWZVTCwgMHgzYTU4MzEzYVVMLAorICAgIDB4YTc4ZjA5ODNVTCwgMHgxZjMzNmVlNlVMLCAweDBkODZjMTA4VUwsIDB4YjUzYWE2NmRVTCwgMHhiZDQwZTFhNFVMLAorICAgIDB4MDVmYzg2YzFVTCwgMHgxNzQ5MjkyZlVMLCAweGFmZjU0ZTRhVUwsIDB4MzIyMjc2ZjNVTCwgMHg4YTllMTE5NlVMLAorICAgIDB4OTgyYmJlNzhVTCwgMHgyMDk3ZDkxZFVMLCAweDc4ZjRjOTRiVUwsIDB4YzA0OGFlMmVVTCwgMHhkMmZkMDFjMFVMLAorICAgIDB4NmE0MTY2YTVVTCwgMHhmNzk2NWUxY1VMLCAweDRmMmEzOTc5VUwsIDB4NWQ5Zjk2OTdVTCwgMHhlNTIzZjFmMlVMLAorICAgIDB4NGQ2YjE5MDVVTCwgMHhmNWQ3N2U2MFVMLCAweGU3NjJkMThlVUwsIDB4NWZkZWI2ZWJVTCwgMHhjMjA5OGU1MlVMLAorICAgIDB4N2FiNWU5MzdVTCwgMHg2ODAwNDZkOVVMLCAweGQwYmMyMWJjVUwsIDB4ODhkZjMxZWFVTCwgMHgzMDYzNTY4ZlVMLAorICAgIDB4MjJkNmY5NjFVTCwgMHg5YTZhOWUwNFVMLCAweDA3YmRhNmJkVUwsIDB4YmYwMWMxZDhVTCwgMHhhZGI0NmUzNlVMLAorICAgIDB4MTUwODA5NTNVTCwgMHgxZDcyNGU5YVVMLCAweGE1Y2UyOWZmVUwsIDB4Yjc3Yjg2MTFVTCwgMHgwZmM3ZTE3NFVMLAorICAgIDB4OTIxMGQ5Y2RVTCwgMHgyYWFjYmVhOFVMLCAweDM4MTkxMTQ2VUwsIDB4ODBhNTc2MjNVTCwgMHhkOGM2NjY3NVVMLAorICAgIDB4NjA3YTAxMTBVTCwgMHg3MmNmYWVmZVVMLCAweGNhNzNjOTliVUwsIDB4NTdhNGYxMjJVTCwgMHhlZjE4OTY0N1VMLAorICAgIDB4ZmRhZDM5YTlVTCwgMHg0NTExNWVjY1VMLCAweDc2NGRlZTA2VUwsIDB4Y2VmMTg5NjNVTCwgMHhkYzQ0MjY4ZFVMLAorICAgIDB4NjRmODQxZThVTCwgMHhmOTJmNzk1MVVMLCAweDQxOTMxZTM0VUwsIDB4NTMyNmIxZGFVTCwgMHhlYjlhZDZiZlVMLAorICAgIDB4YjNmOWM2ZTlVTCwgMHgwYjQ1YTE4Y1VMLCAweDE5ZjAwZTYyVUwsIDB4YTE0YzY5MDdVTCwgMHgzYzliNTFiZVVMLAorICAgIDB4ODQyNzM2ZGJVTCwgMHg5NjkyOTkzNVVMLCAweDJlMmVmZTUwVUwsIDB4MjY1NGI5OTlVTCwgMHg5ZWU4ZGVmY1VMLAorICAgIDB4OGM1ZDcxMTJVTCwgMHgzNGUxMTY3N1VMLCAweGE5MzYyZWNlVUwsIDB4MTE4YTQ5YWJVTCwgMHgwMzNmZTY0NVVMLAorICAgIDB4YmI4MzgxMjBVTCwgMHhlM2UwOTE3NlVMLCAweDViNWNmNjEzVUwsIDB4NDllOTU5ZmRVTCwgMHhmMTU1M2U5OFVMLAorICAgIDB4NmM4MjA2MjFVTCwgMHhkNDNlNjE0NFVMLCAweGM2OGJjZWFhVUwsIDB4N2UzN2E5Y2ZVTCwgMHhkNjdmNDEzOFVMLAorICAgIDB4NmVjMzI2NWRVTCwgMHg3Yzc2ODliM1VMLCAweGM0Y2FlZWQ2VUwsIDB4NTkxZGQ2NmZVTCwgMHhlMWExYjEwYVVMLAorICAgIDB4ZjMxNDFlZTRVTCwgMHg0YmE4Nzk4MVVMLCAweDEzY2I2OWQ3VUwsIDB4YWI3NzBlYjJVTCwgMHhiOWMyYTE1Y1VMLAorICAgIDB4MDE3ZWM2MzlVTCwgMHg5Y2E5ZmU4MFVMLCAweDI0MTU5OWU1VUwsIDB4MzZhMDM2MGJVTCwgMHg4ZTFjNTE2ZVVMLAorICAgIDB4ODY2NjE2YTdVTCwgMHgzZWRhNzFjMlVMLCAweDJjNmZkZTJjVUwsIDB4OTRkM2I5NDlVTCwgMHgwOTA0ODFmMFVMLAorICAgIDB4YjFiOGU2OTVVTCwgMHhhMzBkNDk3YlVMLCAweDFiYjEyZTFlVUwsIDB4NDNkMjNlNDhVTCwgMHhmYjZlNTkyZFVMLAorICAgIDB4ZTlkYmY2YzNVTCwgMHg1MTY3OTFhNlVMLCAweGNjYjBhOTFmVUwsIDB4NzQwY2NlN2FVTCwgMHg2NmI5NjE5NFVMLAorICAgIDB4ZGUwNTA2ZjFVTAorICB9LAorICB7CisgICAgMHgwMDAwMDAwMFVMLCAweDk2MzAwNzc3VUwsIDB4MmM2MTBlZWVVTCwgMHhiYTUxMDk5OVVMLCAweDE5YzQ2ZDA3VUwsCisgICAgMHg4ZmY0NmE3MFVMLCAweDM1YTU2M2U5VUwsIDB4YTM5NTY0OWVVTCwgMHgzMjg4ZGIwZVVMLCAweGE0YjhkYzc5VUwsCisgICAgMHgxZWU5ZDVlMFVMLCAweDg4ZDlkMjk3VUwsIDB4MmI0Y2I2MDlVTCwgMHhiZDdjYjE3ZVVMLCAweDA3MmRiOGU3VUwsCisgICAgMHg5MTFkYmY5MFVMLCAweDY0MTBiNzFkVUwsIDB4ZjIyMGIwNmFVTCwgMHg0ODcxYjlmM1VMLCAweGRlNDFiZTg0VUwsCisgICAgMHg3ZGQ0ZGExYVVMLCAweGViZTRkZDZkVUwsIDB4NTFiNWQ0ZjRVTCwgMHhjNzg1ZDM4M1VMLCAweDU2OTg2YzEzVUwsCisgICAgMHhjMGE4NmI2NFVMLCAweDdhZjk2MmZkVUwsIDB4ZWNjOTY1OGFVTCwgMHg0ZjVjMDExNFVMLCAweGQ5NmMwNjYzVUwsCisgICAgMHg2MzNkMGZmYVVMLCAweGY1MGQwODhkVUwsIDB4YzgyMDZlM2JVTCwgMHg1ZTEwNjk0Y1VMLCAweGU0NDE2MGQ1VUwsCisgICAgMHg3MjcxNjdhMlVMLCAweGQxZTQwMzNjVUwsIDB4NDdkNDA0NGJVTCwgMHhmZDg1MGRkMlVMLCAweDZiYjUwYWE1VUwsCisgICAgMHhmYWE4YjUzNVVMLCAweDZjOThiMjQyVUwsIDB4ZDZjOWJiZGJVTCwgMHg0MGY5YmNhY1VMLCAweGUzNmNkODMyVUwsCisgICAgMHg3NTVjZGY0NVVMLCAweGNmMGRkNmRjVUwsIDB4NTkzZGQxYWJVTCwgMHhhYzMwZDkyNlVMLCAweDNhMDBkZTUxVUwsCisgICAgMHg4MDUxZDdjOFVMLCAweDE2NjFkMGJmVUwsIDB4YjVmNGI0MjFVTCwgMHgyM2M0YjM1NlVMLCAweDk5OTViYWNmVUwsCisgICAgMHgwZmE1YmRiOFVMLCAweDllYjgwMjI4VUwsIDB4MDg4ODA1NWZVTCwgMHhiMmQ5MGNjNlVMLCAweDI0ZTkwYmIxVUwsCisgICAgMHg4NzdjNmYyZlVMLCAweDExNGM2ODU4VUwsIDB4YWIxZDYxYzFVTCwgMHgzZDJkNjZiNlVMLCAweDkwNDFkYzc2VUwsCisgICAgMHgwNjcxZGIwMVVMLCAweGJjMjBkMjk4VUwsIDB4MmExMGQ1ZWZVTCwgMHg4OTg1YjE3MVVMLCAweDFmYjViNjA2VUwsCisgICAgMHhhNWU0YmY5ZlVMLCAweDMzZDRiOGU4VUwsIDB4YTJjOTA3NzhVTCwgMHgzNGY5MDAwZlVMLCAweDhlYTgwOTk2VUwsCisgICAgMHgxODk4MGVlMVVMLCAweGJiMGQ2YTdmVUwsIDB4MmQzZDZkMDhVTCwgMHg5NzZjNjQ5MVVMLCAweDAxNWM2M2U2VUwsCisgICAgMHhmNDUxNmI2YlVMLCAweDYyNjE2YzFjVUwsIDB4ZDgzMDY1ODVVTCwgMHg0ZTAwNjJmMlVMLCAweGVkOTUwNjZjVUwsCisgICAgMHg3YmE1MDExYlVMLCAweGMxZjQwODgyVUwsIDB4NTdjNDBmZjVVTCwgMHhjNmQ5YjA2NVVMLCAweDUwZTliNzEyVUwsCisgICAgMHhlYWI4YmU4YlVMLCAweDdjODhiOWZjVUwsIDB4ZGYxZGRkNjJVTCwgMHg0OTJkZGExNVVMLCAweGYzN2NkMzhjVUwsCisgICAgMHg2NTRjZDRmYlVMLCAweDU4NjFiMjRkVUwsIDB4Y2U1MWI1M2FVTCwgMHg3NDAwYmNhM1VMLCAweGUyMzBiYmQ0VUwsCisgICAgMHg0MWE1ZGY0YVVMLCAweGQ3OTVkODNkVUwsIDB4NmRjNGQxYTRVTCwgMHhmYmY0ZDZkM1VMLCAweDZhZTk2OTQzVUwsCisgICAgMHhmY2Q5NmUzNFVMLCAweDQ2ODg2N2FkVUwsIDB4ZDBiODYwZGFVTCwgMHg3MzJkMDQ0NFVMLCAweGU1MWQwMzMzVUwsCisgICAgMHg1ZjRjMGFhYVVMLCAweGM5N2MwZGRkVUwsIDB4M2M3MTA1NTBVTCwgMHhhYTQxMDIyN1VMLCAweDEwMTAwYmJlVUwsCisgICAgMHg4NjIwMGNjOVVMLCAweDI1YjU2ODU3VUwsIDB4YjM4NTZmMjBVTCwgMHgwOWQ0NjZiOVVMLCAweDlmZTQ2MWNlVUwsCisgICAgMHgwZWY5ZGU1ZVVMLCAweDk4YzlkOTI5VUwsIDB4MjI5OGQwYjBVTCwgMHhiNGE4ZDdjN1VMLCAweDE3M2RiMzU5VUwsCisgICAgMHg4MTBkYjQyZVVMLCAweDNiNWNiZGI3VUwsIDB4YWQ2Y2JhYzBVTCwgMHgyMDgzYjhlZFVMLCAweGI2YjNiZjlhVUwsCisgICAgMHgwY2UyYjYwM1VMLCAweDlhZDJiMTc0VUwsIDB4Mzk0N2Q1ZWFVTCwgMHhhZjc3ZDI5ZFVMLCAweDE1MjZkYjA0VUwsCisgICAgMHg4MzE2ZGM3M1VMLCAweDEyMGI2M2UzVUwsIDB4ODQzYjY0OTRVTCwgMHgzZTZhNmQwZFVMLCAweGE4NWE2YTdhVUwsCisgICAgMHgwYmNmMGVlNFVMLCAweDlkZmYwOTkzVUwsIDB4MjdhZTAwMGFVTCwgMHhiMTllMDc3ZFVMLCAweDQ0OTMwZmYwVUwsCisgICAgMHhkMmEzMDg4N1VMLCAweDY4ZjIwMTFlVUwsIDB4ZmVjMjA2NjlVTCwgMHg1ZDU3NjJmN1VMLCAweGNiNjc2NTgwVUwsCisgICAgMHg3MTM2NmMxOVVMLCAweGU3MDY2YjZlVUwsIDB4NzYxYmQ0ZmVVTCwgMHhlMDJiZDM4OVVMLCAweDVhN2FkYTEwVUwsCisgICAgMHhjYzRhZGQ2N1VMLCAweDZmZGZiOWY5VUwsIDB4ZjllZmJlOGVVTCwgMHg0M2JlYjcxN1VMLCAweGQ1OGViMDYwVUwsCisgICAgMHhlOGEzZDZkNlVMLCAweDdlOTNkMWExVUwsIDB4YzRjMmQ4MzhVTCwgMHg1MmYyZGY0ZlVMLCAweGYxNjdiYmQxVUwsCisgICAgMHg2NzU3YmNhNlVMLCAweGRkMDZiNTNmVUwsIDB4NGIzNmIyNDhVTCwgMHhkYTJiMGRkOFVMLCAweDRjMWIwYWFmVUwsCisgICAgMHhmNjRhMDMzNlVMLCAweDYwN2EwNDQxVUwsIDB4YzNlZjYwZGZVTCwgMHg1NWRmNjdhOFVMLCAweGVmOGU2ZTMxVUwsCisgICAgMHg3OWJlNjk0NlVMLCAweDhjYjM2MWNiVUwsIDB4MWE4MzY2YmNVTCwgMHhhMGQyNmYyNVVMLCAweDM2ZTI2ODUyVUwsCisgICAgMHg5NTc3MGNjY1VMLCAweDAzNDcwYmJiVUwsIDB4YjkxNjAyMjJVTCwgMHgyZjI2MDU1NVVMLCAweGJlM2JiYWM1VUwsCisgICAgMHgyODBiYmRiMlVMLCAweDkyNWFiNDJiVUwsIDB4MDQ2YWIzNWNVTCwgMHhhN2ZmZDdjMlVMLCAweDMxY2ZkMGI1VUwsCisgICAgMHg4YjllZDkyY1VMLCAweDFkYWVkZTViVUwsIDB4YjBjMjY0OWJVTCwgMHgyNmYyNjNlY1VMLCAweDljYTM2YTc1VUwsCisgICAgMHgwYTkzNmQwMlVMLCAweGE5MDYwOTljVUwsIDB4M2YzNjBlZWJVTCwgMHg4NTY3MDc3MlVMLCAweDEzNTcwMDA1VUwsCisgICAgMHg4MjRhYmY5NVVMLCAweDE0N2FiOGUyVUwsIDB4YWUyYmIxN2JVTCwgMHgzODFiYjYwY1VMLCAweDliOGVkMjkyVUwsCisgICAgMHgwZGJlZDVlNVVMLCAweGI3ZWZkYzdjVUwsIDB4MjFkZmRiMGJVTCwgMHhkNGQyZDM4NlVMLCAweDQyZTJkNGYxVUwsCisgICAgMHhmOGIzZGQ2OFVMLCAweDZlODNkYTFmVUwsIDB4Y2QxNmJlODFVTCwgMHg1YjI2YjlmNlVMLCAweGUxNzdiMDZmVUwsCisgICAgMHg3NzQ3YjcxOFVMLCAweGU2NWEwODg4VUwsIDB4NzA2YTBmZmZVTCwgMHhjYTNiMDY2NlVMLCAweDVjMGIwMTExVUwsCisgICAgMHhmZjllNjU4ZlVMLCAweDY5YWU2MmY4VUwsIDB4ZDNmZjZiNjFVTCwgMHg0NWNmNmMxNlVMLCAweDc4ZTIwYWEwVUwsCisgICAgMHhlZWQyMGRkN1VMLCAweDU0ODMwNDRlVUwsIDB4YzJiMzAzMzlVTCwgMHg2MTI2NjdhN1VMLCAweGY3MTY2MGQwVUwsCisgICAgMHg0ZDQ3Njk0OVVMLCAweGRiNzc2ZTNlVUwsIDB4NGE2YWQxYWVVTCwgMHhkYzVhZDZkOVVMLCAweDY2MGJkZjQwVUwsCisgICAgMHhmMDNiZDgzN1VMLCAweDUzYWViY2E5VUwsIDB4YzU5ZWJiZGVVTCwgMHg3ZmNmYjI0N1VMLCAweGU5ZmZiNTMwVUwsCisgICAgMHgxY2YyYmRiZFVMLCAweDhhYzJiYWNhVUwsIDB4MzA5M2IzNTNVTCwgMHhhNmEzYjQyNFVMLCAweDA1MzZkMGJhVUwsCisgICAgMHg5MzA2ZDdjZFVMLCAweDI5NTdkZTU0VUwsIDB4YmY2N2Q5MjNVTCwgMHgyZTdhNjZiM1VMLCAweGI4NGE2MWM0VUwsCisgICAgMHgwMjFiNjg1ZFVMLCAweDk0MmI2ZjJhVUwsIDB4MzdiZTBiYjRVTCwgMHhhMThlMGNjM1VMLCAweDFiZGYwNTVhVUwsCisgICAgMHg4ZGVmMDIyZFVMCisgIH0sCisgIHsKKyAgICAweDAwMDAwMDAwVUwsIDB4NDEzMTFiMTlVTCwgMHg4MjYyMzYzMlVMLCAweGMzNTMyZDJiVUwsIDB4MDRjNTZjNjRVTCwKKyAgICAweDQ1ZjQ3NzdkVUwsIDB4ODZhNzVhNTZVTCwgMHhjNzk2NDE0ZlVMLCAweDA4OGFkOWM4VUwsIDB4NDliYmMyZDFVTCwKKyAgICAweDhhZThlZmZhVUwsIDB4Y2JkOWY0ZTNVTCwgMHgwYzRmYjVhY1VMLCAweDRkN2VhZWI1VUwsIDB4OGUyZDgzOWVVTCwKKyAgICAweGNmMWM5ODg3VUwsIDB4NTExMmMyNGFVTCwgMHgxMDIzZDk1M1VMLCAweGQzNzBmNDc4VUwsIDB4OTI0MWVmNjFVTCwKKyAgICAweDU1ZDdhZTJlVUwsIDB4MTRlNmI1MzdVTCwgMHhkN2I1OTgxY1VMLCAweDk2ODQ4MzA1VUwsIDB4NTk5ODFiODJVTCwKKyAgICAweDE4YTkwMDliVUwsIDB4ZGJmYTJkYjBVTCwgMHg5YWNiMzZhOVVMLCAweDVkNWQ3N2U2VUwsIDB4MWM2YzZjZmZVTCwKKyAgICAweGRmM2Y0MWQ0VUwsIDB4OWUwZTVhY2RVTCwgMHhhMjI0ODQ5NVVMLCAweGUzMTU5ZjhjVUwsIDB4MjA0NmIyYTdVTCwKKyAgICAweDYxNzdhOWJlVUwsIDB4YTZlMWU4ZjFVTCwgMHhlN2QwZjNlOFVMLCAweDI0ODNkZWMzVUwsIDB4NjViMmM1ZGFVTCwKKyAgICAweGFhYWU1ZDVkVUwsIDB4ZWI5ZjQ2NDRVTCwgMHgyOGNjNmI2ZlVMLCAweDY5ZmQ3MDc2VUwsIDB4YWU2YjMxMzlVTCwKKyAgICAweGVmNWEyYTIwVUwsIDB4MmMwOTA3MGJVTCwgMHg2ZDM4MWMxMlVMLCAweGYzMzY0NmRmVUwsIDB4YjIwNzVkYzZVTCwKKyAgICAweDcxNTQ3MGVkVUwsIDB4MzA2NTZiZjRVTCwgMHhmN2YzMmFiYlVMLCAweGI2YzIzMWEyVUwsIDB4NzU5MTFjODlVTCwKKyAgICAweDM0YTAwNzkwVUwsIDB4ZmJiYzlmMTdVTCwgMHhiYThkODQwZVVMLCAweDc5ZGVhOTI1VUwsIDB4MzhlZmIyM2NVTCwKKyAgICAweGZmNzlmMzczVUwsIDB4YmU0OGU4NmFVTCwgMHg3ZDFiYzU0MVVMLCAweDNjMmFkZTU4VUwsIDB4MDU0Zjc5ZjBVTCwKKyAgICAweDQ0N2U2MmU5VUwsIDB4ODcyZDRmYzJVTCwgMHhjNjFjNTRkYlVMLCAweDAxOGExNTk0VUwsIDB4NDBiYjBlOGRVTCwKKyAgICAweDgzZTgyM2E2VUwsIDB4YzJkOTM4YmZVTCwgMHgwZGM1YTAzOFVMLCAweDRjZjRiYjIxVUwsIDB4OGZhNzk2MGFVTCwKKyAgICAweGNlOTY4ZDEzVUwsIDB4MDkwMGNjNWNVTCwgMHg0ODMxZDc0NVVMLCAweDhiNjJmYTZlVUwsIDB4Y2E1M2UxNzdVTCwKKyAgICAweDU0NWRiYmJhVUwsIDB4MTU2Y2EwYTNVTCwgMHhkNjNmOGQ4OFVMLCAweDk3MGU5NjkxVUwsIDB4NTA5OGQ3ZGVVTCwKKyAgICAweDExYTljY2M3VUwsIDB4ZDJmYWUxZWNVTCwgMHg5M2NiZmFmNVVMLCAweDVjZDc2MjcyVUwsIDB4MWRlNjc5NmJVTCwKKyAgICAweGRlYjU1NDQwVUwsIDB4OWY4NDRmNTlVTCwgMHg1ODEyMGUxNlVMLCAweDE5MjMxNTBmVUwsIDB4ZGE3MDM4MjRVTCwKKyAgICAweDliNDEyMzNkVUwsIDB4YTc2YmZkNjVVTCwgMHhlNjVhZTY3Y1VMLCAweDI1MDljYjU3VUwsIDB4NjQzOGQwNGVVTCwKKyAgICAweGEzYWU5MTAxVUwsIDB4ZTI5ZjhhMThVTCwgMHgyMWNjYTczM1VMLCAweDYwZmRiYzJhVUwsIDB4YWZlMTI0YWRVTCwKKyAgICAweGVlZDAzZmI0VUwsIDB4MmQ4MzEyOWZVTCwgMHg2Y2IyMDk4NlVMLCAweGFiMjQ0OGM5VUwsIDB4ZWExNTUzZDBVTCwKKyAgICAweDI5NDY3ZWZiVUwsIDB4Njg3NzY1ZTJVTCwgMHhmNjc5M2YyZlVMLCAweGI3NDgyNDM2VUwsIDB4NzQxYjA5MWRVTCwKKyAgICAweDM1MmExMjA0VUwsIDB4ZjJiYzUzNGJVTCwgMHhiMzhkNDg1MlVMLCAweDcwZGU2NTc5VUwsIDB4MzFlZjdlNjBVTCwKKyAgICAweGZlZjNlNmU3VUwsIDB4YmZjMmZkZmVVTCwgMHg3YzkxZDBkNVVMLCAweDNkYTBjYmNjVUwsIDB4ZmEzNjhhODNVTCwKKyAgICAweGJiMDc5MTlhVUwsIDB4Nzg1NGJjYjFVTCwgMHgzOTY1YTdhOFVMLCAweDRiOTg4MzNiVUwsIDB4MGFhOTk4MjJVTCwKKyAgICAweGM5ZmFiNTA5VUwsIDB4ODhjYmFlMTBVTCwgMHg0ZjVkZWY1ZlVMLCAweDBlNmNmNDQ2VUwsIDB4Y2QzZmQ5NmRVTCwKKyAgICAweDhjMGVjMjc0VUwsIDB4NDMxMjVhZjNVTCwgMHgwMjIzNDFlYVVMLCAweGMxNzA2Y2MxVUwsIDB4ODA0MTc3ZDhVTCwKKyAgICAweDQ3ZDczNjk3VUwsIDB4MDZlNjJkOGVVTCwgMHhjNWI1MDBhNVVMLCAweDg0ODQxYmJjVUwsIDB4MWE4YTQxNzFVTCwKKyAgICAweDViYmI1YTY4VUwsIDB4OThlODc3NDNVTCwgMHhkOWQ5NmM1YVVMLCAweDFlNGYyZDE1VUwsIDB4NWY3ZTM2MGNVTCwKKyAgICAweDljMmQxYjI3VUwsIDB4ZGQxYzAwM2VVTCwgMHgxMjAwOThiOVVMLCAweDUzMzE4M2EwVUwsIDB4OTA2MmFlOGJVTCwKKyAgICAweGQxNTNiNTkyVUwsIDB4MTZjNWY0ZGRVTCwgMHg1N2Y0ZWZjNFVMLCAweDk0YTdjMmVmVUwsIDB4ZDU5NmQ5ZjZVTCwKKyAgICAweGU5YmMwN2FlVUwsIDB4YTg4ZDFjYjdVTCwgMHg2YmRlMzE5Y1VMLCAweDJhZWYyYTg1VUwsIDB4ZWQ3OTZiY2FVTCwKKyAgICAweGFjNDg3MGQzVUwsIDB4NmYxYjVkZjhVTCwgMHgyZTJhNDZlMVVMLCAweGUxMzZkZTY2VUwsIDB4YTAwN2M1N2ZVTCwKKyAgICAweDYzNTRlODU0VUwsIDB4MjI2NWYzNGRVTCwgMHhlNWYzYjIwMlVMLCAweGE0YzJhOTFiVUwsIDB4Njc5MTg0MzBVTCwKKyAgICAweDI2YTA5ZjI5VUwsIDB4YjhhZWM1ZTRVTCwgMHhmOTlmZGVmZFVMLCAweDNhY2NmM2Q2VUwsIDB4N2JmZGU4Y2ZVTCwKKyAgICAweGJjNmJhOTgwVUwsIDB4ZmQ1YWIyOTlVTCwgMHgzZTA5OWZiMlVMLCAweDdmMzg4NGFiVUwsIDB4YjAyNDFjMmNVTCwKKyAgICAweGYxMTUwNzM1VUwsIDB4MzI0NjJhMWVVTCwgMHg3Mzc3MzEwN1VMLCAweGI0ZTE3MDQ4VUwsIDB4ZjVkMDZiNTFVTCwKKyAgICAweDM2ODM0NjdhVUwsIDB4NzdiMjVkNjNVTCwgMHg0ZWQ3ZmFjYlVMLCAweDBmZTZlMWQyVUwsIDB4Y2NiNWNjZjlVTCwKKyAgICAweDhkODRkN2UwVUwsIDB4NGExMjk2YWZVTCwgMHgwYjIzOGRiNlVMLCAweGM4NzBhMDlkVUwsIDB4ODk0MWJiODRVTCwKKyAgICAweDQ2NWQyMzAzVUwsIDB4MDc2YzM4MWFVTCwgMHhjNDNmMTUzMVVMLCAweDg1MGUwZTI4VUwsIDB4NDI5ODRmNjdVTCwKKyAgICAweDAzYTk1NDdlVUwsIDB4YzBmYTc5NTVVTCwgMHg4MWNiNjI0Y1VMLCAweDFmYzUzODgxVUwsIDB4NWVmNDIzOThVTCwKKyAgICAweDlkYTcwZWIzVUwsIDB4ZGM5NjE1YWFVTCwgMHgxYjAwNTRlNVVMLCAweDVhMzE0ZmZjVUwsIDB4OTk2MjYyZDdVTCwKKyAgICAweGQ4NTM3OWNlVUwsIDB4MTc0ZmUxNDlVTCwgMHg1NjdlZmE1MFVMLCAweDk1MmRkNzdiVUwsIDB4ZDQxY2NjNjJVTCwKKyAgICAweDEzOGE4ZDJkVUwsIDB4NTJiYjk2MzRVTCwgMHg5MWU4YmIxZlVMLCAweGQwZDlhMDA2VUwsIDB4ZWNmMzdlNWVVTCwKKyAgICAweGFkYzI2NTQ3VUwsIDB4NmU5MTQ4NmNVTCwgMHgyZmEwNTM3NVVMLCAweGU4MzYxMjNhVUwsIDB4YTkwNzA5MjNVTCwKKyAgICAweDZhNTQyNDA4VUwsIDB4MmI2NTNmMTFVTCwgMHhlNDc5YTc5NlVMLCAweGE1NDhiYzhmVUwsIDB4NjYxYjkxYTRVTCwKKyAgICAweDI3MmE4YWJkVUwsIDB4ZTBiY2NiZjJVTCwgMHhhMThkZDBlYlVMLCAweDYyZGVmZGMwVUwsIDB4MjNlZmU2ZDlVTCwKKyAgICAweGJkZTFiYzE0VUwsIDB4ZmNkMGE3MGRVTCwgMHgzZjgzOGEyNlVMLCAweDdlYjI5MTNmVUwsIDB4YjkyNGQwNzBVTCwKKyAgICAweGY4MTVjYjY5VUwsIDB4M2I0NmU2NDJVTCwgMHg3YTc3ZmQ1YlVMLCAweGI1NmI2NWRjVUwsIDB4ZjQ1YTdlYzVVTCwKKyAgICAweDM3MDk1M2VlVUwsIDB4NzYzODQ4ZjdVTCwgMHhiMWFlMDliOFVMLCAweGYwOWYxMmExVUwsIDB4MzNjYzNmOGFVTCwKKyAgICAweDcyZmQyNDkzVUwKKyAgfSwKKyAgeworICAgIDB4MDAwMDAwMDBVTCwgMHgzNzZhYzIwMVVMLCAweDZlZDQ4NDAzVUwsIDB4NTliZTQ2MDJVTCwgMHhkY2E4MDkwN1VMLAorICAgIDB4ZWJjMmNiMDZVTCwgMHhiMjdjOGQwNFVMLCAweDg1MTY0ZjA1VUwsIDB4Yjg1MTEzMGVVTCwgMHg4ZjNiZDEwZlVMLAorICAgIDB4ZDY4NTk3MGRVTCwgMHhlMWVmNTUwY1VMLCAweDY0ZjkxYTA5VUwsIDB4NTM5M2Q4MDhVTCwgMHgwYTJkOWUwYVVMLAorICAgIDB4M2Q0NzVjMGJVTCwgMHg3MGEzMjYxY1VMLCAweDQ3YzllNDFkVUwsIDB4MWU3N2EyMWZVTCwgMHgyOTFkNjAxZVVMLAorICAgIDB4YWMwYjJmMWJVTCwgMHg5YjYxZWQxYVVMLCAweGMyZGZhYjE4VUwsIDB4ZjViNTY5MTlVTCwgMHhjOGYyMzUxMlVMLAorICAgIDB4ZmY5OGY3MTNVTCwgMHhhNjI2YjExMVVMLCAweDkxNGM3MzEwVUwsIDB4MTQ1YTNjMTVVTCwgMHgyMzMwZmUxNFVMLAorICAgIDB4N2E4ZWI4MTZVTCwgMHg0ZGU0N2ExN1VMLCAweGUwNDY0ZDM4VUwsIDB4ZDcyYzhmMzlVTCwgMHg4ZTkyYzkzYlVMLAorICAgIDB4YjlmODBiM2FVTCwgMHgzY2VlNDQzZlVMLCAweDBiODQ4NjNlVUwsIDB4NTIzYWMwM2NVTCwgMHg2NTUwMDIzZFVMLAorICAgIDB4NTgxNzVlMzZVTCwgMHg2ZjdkOWMzN1VMLCAweDM2YzNkYTM1VUwsIDB4MDFhOTE4MzRVTCwgMHg4NGJmNTczMVVMLAorICAgIDB4YjNkNTk1MzBVTCwgMHhlYTZiZDMzMlVMLCAweGRkMDExMTMzVUwsIDB4OTBlNTZiMjRVTCwgMHhhNzhmYTkyNVVMLAorICAgIDB4ZmUzMWVmMjdVTCwgMHhjOTViMmQyNlVMLCAweDRjNGQ2MjIzVUwsIDB4N2IyN2EwMjJVTCwgMHgyMjk5ZTYyMFVMLAorICAgIDB4MTVmMzI0MjFVTCwgMHgyOGI0NzgyYVVMLCAweDFmZGViYTJiVUwsIDB4NDY2MGZjMjlVTCwgMHg3MTBhM2UyOFVMLAorICAgIDB4ZjQxYzcxMmRVTCwgMHhjMzc2YjMyY1VMLCAweDlhYzhmNTJlVUwsIDB4YWRhMjM3MmZVTCwgMHhjMDhkOWE3MFVMLAorICAgIDB4ZjdlNzU4NzFVTCwgMHhhZTU5MWU3M1VMLCAweDk5MzNkYzcyVUwsIDB4MWMyNTkzNzdVTCwgMHgyYjRmNTE3NlVMLAorICAgIDB4NzJmMTE3NzRVTCwgMHg0NTliZDU3NVVMLCAweDc4ZGM4OTdlVUwsIDB4NGZiNjRiN2ZVTCwgMHgxNjA4MGQ3ZFVMLAorICAgIDB4MjE2MmNmN2NVTCwgMHhhNDc0ODA3OVVMLCAweDkzMWU0Mjc4VUwsIDB4Y2FhMDA0N2FVTCwgMHhmZGNhYzY3YlVMLAorICAgIDB4YjAyZWJjNmNVTCwgMHg4NzQ0N2U2ZFVMLCAweGRlZmEzODZmVUwsIDB4ZTk5MGZhNmVVTCwgMHg2Yzg2YjU2YlVMLAorICAgIDB4NWJlYzc3NmFVTCwgMHgwMjUyMzE2OFVMLCAweDM1MzhmMzY5VUwsIDB4MDg3ZmFmNjJVTCwgMHgzZjE1NmQ2M1VMLAorICAgIDB4NjZhYjJiNjFVTCwgMHg1MWMxZTk2MFVMLCAweGQ0ZDdhNjY1VUwsIDB4ZTNiZDY0NjRVTCwgMHhiYTAzMjI2NlVMLAorICAgIDB4OGQ2OWUwNjdVTCwgMHgyMGNiZDc0OFVMLCAweDE3YTExNTQ5VUwsIDB4NGUxZjUzNGJVTCwgMHg3OTc1OTE0YVVMLAorICAgIDB4ZmM2M2RlNGZVTCwgMHhjYjA5MWM0ZVVMLCAweDkyYjc1YTRjVUwsIDB4YTVkZDk4NGRVTCwgMHg5ODlhYzQ0NlVMLAorICAgIDB4YWZmMDA2NDdVTCwgMHhmNjRlNDA0NVVMLCAweGMxMjQ4MjQ0VUwsIDB4NDQzMmNkNDFVTCwgMHg3MzU4MGY0MFVMLAorICAgIDB4MmFlNjQ5NDJVTCwgMHgxZDhjOGI0M1VMLCAweDUwNjhmMTU0VUwsIDB4NjcwMjMzNTVVTCwgMHgzZWJjNzU1N1VMLAorICAgIDB4MDlkNmI3NTZVTCwgMHg4Y2MwZjg1M1VMLCAweGJiYWEzYTUyVUwsIDB4ZTIxNDdjNTBVTCwgMHhkNTdlYmU1MVVMLAorICAgIDB4ZTgzOWUyNWFVTCwgMHhkZjUzMjA1YlVMLCAweDg2ZWQ2NjU5VUwsIDB4YjE4N2E0NThVTCwgMHgzNDkxZWI1ZFVMLAorICAgIDB4MDNmYjI5NWNVTCwgMHg1YTQ1NmY1ZVVMLCAweDZkMmZhZDVmVUwsIDB4ODAxYjM1ZTFVTCwgMHhiNzcxZjdlMFVMLAorICAgIDB4ZWVjZmIxZTJVTCwgMHhkOWE1NzNlM1VMLCAweDVjYjMzY2U2VUwsIDB4NmJkOWZlZTdVTCwgMHgzMjY3YjhlNVVMLAorICAgIDB4MDUwZDdhZTRVTCwgMHgzODRhMjZlZlVMLCAweDBmMjBlNGVlVUwsIDB4NTY5ZWEyZWNVTCwgMHg2MWY0NjBlZFVMLAorICAgIDB4ZTRlMjJmZThVTCwgMHhkMzg4ZWRlOVVMLCAweDhhMzZhYmViVUwsIDB4YmQ1YzY5ZWFVTCwgMHhmMGI4MTNmZFVMLAorICAgIDB4YzdkMmQxZmNVTCwgMHg5ZTZjOTdmZVVMLCAweGE5MDY1NWZmVUwsIDB4MmMxMDFhZmFVTCwgMHgxYjdhZDhmYlVMLAorICAgIDB4NDJjNDllZjlVTCwgMHg3NWFlNWNmOFVMLCAweDQ4ZTkwMGYzVUwsIDB4N2Y4M2MyZjJVTCwgMHgyNjNkODRmMFVMLAorICAgIDB4MTE1NzQ2ZjFVTCwgMHg5NDQxMDlmNFVMLCAweGEzMmJjYmY1VUwsIDB4ZmE5NThkZjdVTCwgMHhjZGZmNGZmNlVMLAorICAgIDB4NjA1ZDc4ZDlVTCwgMHg1NzM3YmFkOFVMLCAweDBlODlmY2RhVUwsIDB4MzllMzNlZGJVTCwgMHhiY2Y1NzFkZVVMLAorICAgIDB4OGI5ZmIzZGZVTCwgMHhkMjIxZjVkZFVMLCAweGU1NGIzN2RjVUwsIDB4ZDgwYzZiZDdVTCwgMHhlZjY2YTlkNlVMLAorICAgIDB4YjZkOGVmZDRVTCwgMHg4MWIyMmRkNVVMLCAweDA0YTQ2MmQwVUwsIDB4MzNjZWEwZDFVTCwgMHg2YTcwZTZkM1VMLAorICAgIDB4NWQxYTI0ZDJVTCwgMHgxMGZlNWVjNVVMLCAweDI3OTQ5Y2M0VUwsIDB4N2UyYWRhYzZVTCwgMHg0OTQwMThjN1VMLAorICAgIDB4Y2M1NjU3YzJVTCwgMHhmYjNjOTVjM1VMLCAweGEyODJkM2MxVUwsIDB4OTVlODExYzBVTCwgMHhhOGFmNGRjYlVMLAorICAgIDB4OWZjNThmY2FVTCwgMHhjNjdiYzljOFVMLCAweGYxMTEwYmM5VUwsIDB4NzQwNzQ0Y2NVTCwgMHg0MzZkODZjZFVMLAorICAgIDB4MWFkM2MwY2ZVTCwgMHgyZGI5MDJjZVVMLCAweDQwOTZhZjkxVUwsIDB4NzdmYzZkOTBVTCwgMHgyZTQyMmI5MlVMLAorICAgIDB4MTkyOGU5OTNVTCwgMHg5YzNlYTY5NlVMLCAweGFiNTQ2NDk3VUwsIDB4ZjJlYTIyOTVVTCwgMHhjNTgwZTA5NFVMLAorICAgIDB4ZjhjN2JjOWZVTCwgMHhjZmFkN2U5ZVVMLCAweDk2MTMzODljVUwsIDB4YTE3OWZhOWRVTCwgMHgyNDZmYjU5OFVMLAorICAgIDB4MTMwNTc3OTlVTCwgMHg0YWJiMzE5YlVMLCAweDdkZDFmMzlhVUwsIDB4MzAzNTg5OGRVTCwgMHgwNzVmNGI4Y1VMLAorICAgIDB4NWVlMTBkOGVVTCwgMHg2OThiY2Y4ZlVMLCAweGVjOWQ4MDhhVUwsIDB4ZGJmNzQyOGJVTCwgMHg4MjQ5MDQ4OVVMLAorICAgIDB4YjUyM2M2ODhVTCwgMHg4ODY0OWE4M1VMLCAweGJmMGU1ODgyVUwsIDB4ZTZiMDFlODBVTCwgMHhkMWRhZGM4MVVMLAorICAgIDB4NTRjYzkzODRVTCwgMHg2M2E2NTE4NVVMLCAweDNhMTgxNzg3VUwsIDB4MGQ3MmQ1ODZVTCwgMHhhMGQwZTJhOVVMLAorICAgIDB4OTdiYTIwYThVTCwgMHhjZTA0NjZhYVVMLCAweGY5NmVhNGFiVUwsIDB4N2M3OGViYWVVTCwgMHg0YjEyMjlhZlVMLAorICAgIDB4MTJhYzZmYWRVTCwgMHgyNWM2YWRhY1VMLCAweDE4ODFmMWE3VUwsIDB4MmZlYjMzYTZVTCwgMHg3NjU1NzVhNFVMLAorICAgIDB4NDEzZmI3YTVVTCwgMHhjNDI5ZjhhMFVMLCAweGYzNDMzYWExVUwsIDB4YWFmZDdjYTNVTCwgMHg5ZDk3YmVhMlVMLAorICAgIDB4ZDA3M2M0YjVVTCwgMHhlNzE5MDZiNFVMLCAweGJlYTc0MGI2VUwsIDB4ODljZDgyYjdVTCwgMHgwY2RiY2RiMlVMLAorICAgIDB4M2JiMTBmYjNVTCwgMHg2MjBmNDliMVVMLCAweDU1NjU4YmIwVUwsIDB4NjgyMmQ3YmJVTCwgMHg1ZjQ4MTViYVVMLAorICAgIDB4MDZmNjUzYjhVTCwgMHgzMTljOTFiOVVMLCAweGI0OGFkZWJjVUwsIDB4ODNlMDFjYmRVTCwgMHhkYTVlNWFiZlVMLAorICAgIDB4ZWQzNDk4YmVVTAorICB9LAorICB7CisgICAgMHgwMDAwMDAwMFVMLCAweDY1NjdiY2I4VUwsIDB4OGJjODA5YWFVTCwgMHhlZWFmYjUxMlVMLCAweDU3OTc2MjhmVUwsCisgICAgMHgzMmYwZGUzN1VMLCAweGRjNWY2YjI1VUwsIDB4YjkzOGQ3OWRVTCwgMHhlZjI4YjRjNVVMLCAweDhhNGYwODdkVUwsCisgICAgMHg2NGUwYmQ2ZlVMLCAweDAxODcwMWQ3VUwsIDB4YjhiZmQ2NGFVTCwgMHhkZGQ4NmFmMlVMLCAweDMzNzdkZmUwVUwsCisgICAgMHg1NjEwNjM1OFVMLCAweDlmNTcxOTUwVUwsIDB4ZmEzMGE1ZThVTCwgMHgxNDlmMTBmYVVMLCAweDcxZjhhYzQyVUwsCisgICAgMHhjOGMwN2JkZlVMLCAweGFkYTdjNzY3VUwsIDB4NDMwODcyNzVVTCwgMHgyNjZmY2VjZFVMLCAweDcwN2ZhZDk1VUwsCisgICAgMHgxNTE4MTEyZFVMLCAweGZiYjdhNDNmVUwsIDB4OWVkMDE4ODdVTCwgMHgyN2U4Y2YxYVVMLCAweDQyOGY3M2EyVUwsCisgICAgMHhhYzIwYzZiMFVMLCAweGM5NDc3YTA4VUwsIDB4M2VhZjMyYTBVTCwgMHg1YmM4OGUxOFVMLCAweGI1NjczYjBhVUwsCisgICAgMHhkMDAwODdiMlVMLCAweDY5Mzg1MDJmVUwsIDB4MGM1ZmVjOTdVTCwgMHhlMmYwNTk4NVVMLCAweDg3OTdlNTNkVUwsCisgICAgMHhkMTg3ODY2NVVMLCAweGI0ZTAzYWRkVUwsIDB4NWE0ZjhmY2ZVTCwgMHgzZjI4MzM3N1VMLCAweDg2MTBlNGVhVUwsCisgICAgMHhlMzc3NTg1MlVMLCAweDBkZDhlZDQwVUwsIDB4NjhiZjUxZjhVTCwgMHhhMWY4MmJmMFVMLCAweGM0OWY5NzQ4VUwsCisgICAgMHgyYTMwMjI1YVVMLCAweDRmNTc5ZWUyVUwsIDB4ZjY2ZjQ5N2ZVTCwgMHg5MzA4ZjVjN1VMLCAweDdkYTc0MGQ1VUwsCisgICAgMHgxOGMwZmM2ZFVMLCAweDRlZDA5ZjM1VUwsIDB4MmJiNzIzOGRVTCwgMHhjNTE4OTY5ZlVMLCAweGEwN2YyYTI3VUwsCisgICAgMHgxOTQ3ZmRiYVVMLCAweDdjMjA0MTAyVUwsIDB4OTI4ZmY0MTBVTCwgMHhmN2U4NDhhOFVMLCAweDNkNTgxNDliVUwsCisgICAgMHg1ODNmYTgyM1VMLCAweGI2OTAxZDMxVUwsIDB4ZDNmN2ExODlVTCwgMHg2YWNmNzYxNFVMLCAweDBmYThjYWFjVUwsCisgICAgMHhlMTA3N2ZiZVVMLCAweDg0NjBjMzA2VUwsIDB4ZDI3MGEwNWVVTCwgMHhiNzE3MWNlNlVMLCAweDU5YjhhOWY0VUwsCisgICAgMHgzY2RmMTU0Y1VMLCAweDg1ZTdjMmQxVUwsIDB4ZTA4MDdlNjlVTCwgMHgwZTJmY2I3YlVMLCAweDZiNDg3N2MzVUwsCisgICAgMHhhMjBmMGRjYlVMLCAweGM3NjhiMTczVUwsIDB4MjljNzA0NjFVTCwgMHg0Y2EwYjhkOVVMLCAweGY1OTg2ZjQ0VUwsCisgICAgMHg5MGZmZDNmY1VMLCAweDdlNTA2NmVlVUwsIDB4MWIzN2RhNTZVTCwgMHg0ZDI3YjkwZVVMLCAweDI4NDAwNWI2VUwsCisgICAgMHhjNmVmYjBhNFVMLCAweGEzODgwYzFjVUwsIDB4MWFiMGRiODFVTCwgMHg3ZmQ3NjczOVVMLCAweDkxNzhkMjJiVUwsCisgICAgMHhmNDFmNmU5M1VMLCAweDAzZjcyNjNiVUwsIDB4NjY5MDlhODNVTCwgMHg4ODNmMmY5MVVMLCAweGVkNTg5MzI5VUwsCisgICAgMHg1NDYwNDRiNFVMLCAweDMxMDdmODBjVUwsIDB4ZGZhODRkMWVVTCwgMHhiYWNmZjFhNlVMLCAweGVjZGY5MmZlVUwsCisgICAgMHg4OWI4MmU0NlVMLCAweDY3MTc5YjU0VUwsIDB4MDI3MDI3ZWNVTCwgMHhiYjQ4ZjA3MVVMLCAweGRlMmY0Y2M5VUwsCisgICAgMHgzMDgwZjlkYlVMLCAweDU1ZTc0NTYzVUwsIDB4OWNhMDNmNmJVTCwgMHhmOWM3ODNkM1VMLCAweDE3NjgzNmMxVUwsCisgICAgMHg3MjBmOGE3OVVMLCAweGNiMzc1ZGU0VUwsIDB4YWU1MGUxNWNVTCwgMHg0MGZmNTQ0ZVVMLCAweDI1OThlOGY2VUwsCisgICAgMHg3Mzg4OGJhZVVMLCAweDE2ZWYzNzE2VUwsIDB4Zjg0MDgyMDRVTCwgMHg5ZDI3M2ViY1VMLCAweDI0MWZlOTIxVUwsCisgICAgMHg0MTc4NTU5OVVMLCAweGFmZDdlMDhiVUwsIDB4Y2FiMDVjMzNVTCwgMHgzYmI2NTllZFVMLCAweDVlZDFlNTU1VUwsCisgICAgMHhiMDdlNTA0N1VMLCAweGQ1MTllY2ZmVUwsIDB4NmMyMTNiNjJVTCwgMHgwOTQ2ODdkYVVMLCAweGU3ZTkzMmM4VUwsCisgICAgMHg4MjhlOGU3MFVMLCAweGQ0OWVlZDI4VUwsIDB4YjFmOTUxOTBVTCwgMHg1ZjU2ZTQ4MlVMLCAweDNhMzE1ODNhVUwsCisgICAgMHg4MzA5OGZhN1VMLCAweGU2NmUzMzFmVUwsIDB4MDhjMTg2MGRVTCwgMHg2ZGE2M2FiNVVMLCAweGE0ZTE0MGJkVUwsCisgICAgMHhjMTg2ZmMwNVVMLCAweDJmMjk0OTE3VUwsIDB4NGE0ZWY1YWZVTCwgMHhmMzc2MjIzMlVMLCAweDk2MTE5ZThhVUwsCisgICAgMHg3OGJlMmI5OFVMLCAweDFkZDk5NzIwVUwsIDB4NGJjOWY0NzhVTCwgMHgyZWFlNDhjMFVMLCAweGMwMDFmZGQyVUwsCisgICAgMHhhNTY2NDE2YVVMLCAweDFjNWU5NmY3VUwsIDB4NzkzOTJhNGZVTCwgMHg5Nzk2OWY1ZFVMLCAweGYyZjEyM2U1VUwsCisgICAgMHgwNTE5NmI0ZFVMLCAweDYwN2VkN2Y1VUwsIDB4OGVkMTYyZTdVTCwgMHhlYmI2ZGU1ZlVMLCAweDUyOGUwOWMyVUwsCisgICAgMHgzN2U5YjU3YVVMLCAweGQ5NDYwMDY4VUwsIDB4YmMyMWJjZDBVTCwgMHhlYTMxZGY4OFVMLCAweDhmNTY2MzMwVUwsCisgICAgMHg2MWY5ZDYyMlVMLCAweDA0OWU2YTlhVUwsIDB4YmRhNmJkMDdVTCwgMHhkOGMxMDFiZlVMLCAweDM2NmViNGFkVUwsCisgICAgMHg1MzA5MDgxNVVMLCAweDlhNGU3MjFkVUwsIDB4ZmYyOWNlYTVVTCwgMHgxMTg2N2JiN1VMLCAweDc0ZTFjNzBmVUwsCisgICAgMHhjZGQ5MTA5MlVMLCAweGE4YmVhYzJhVUwsIDB4NDYxMTE5MzhVTCwgMHgyMzc2YTU4MFVMLCAweDc1NjZjNmQ4VUwsCisgICAgMHgxMDAxN2E2MFVMLCAweGZlYWVjZjcyVUwsIDB4OWJjOTczY2FVTCwgMHgyMmYxYTQ1N1VMLCAweDQ3OTYxOGVmVUwsCisgICAgMHhhOTM5YWRmZFVMLCAweGNjNWUxMTQ1VUwsIDB4MDZlZTRkNzZVTCwgMHg2Mzg5ZjFjZVVMLCAweDhkMjY0NGRjVUwsCisgICAgMHhlODQxZjg2NFVMLCAweDUxNzkyZmY5VUwsIDB4MzQxZTkzNDFVTCwgMHhkYWIxMjY1M1VMLCAweGJmZDY5YWViVUwsCisgICAgMHhlOWM2ZjliM1VMLCAweDhjYTE0NTBiVUwsIDB4NjIwZWYwMTlVTCwgMHgwNzY5NGNhMVVMLCAweGJlNTE5YjNjVUwsCisgICAgMHhkYjM2Mjc4NFVMLCAweDM1OTk5Mjk2VUwsIDB4NTBmZTJlMmVVTCwgMHg5OWI5NTQyNlVMLCAweGZjZGVlODllVUwsCisgICAgMHgxMjcxNWQ4Y1VMLCAweDc3MTZlMTM0VUwsIDB4Y2UyZTM2YTlVTCwgMHhhYjQ5OGExMVVMLCAweDQ1ZTYzZjAzVUwsCisgICAgMHgyMDgxODNiYlVMLCAweDc2OTFlMGUzVUwsIDB4MTNmNjVjNWJVTCwgMHhmZDU5ZTk0OVVMLCAweDk4M2U1NWYxVUwsCisgICAgMHgyMTA2ODI2Y1VMLCAweDQ0NjEzZWQ0VUwsIDB4YWFjZThiYzZVTCwgMHhjZmE5Mzc3ZVVMLCAweDM4NDE3ZmQ2VUwsCisgICAgMHg1ZDI2YzM2ZVVMLCAweGIzODk3NjdjVUwsIDB4ZDZlZWNhYzRVTCwgMHg2ZmQ2MWQ1OVVMLCAweDBhYjFhMWUxVUwsCisgICAgMHhlNDFlMTRmM1VMLCAweDgxNzlhODRiVUwsIDB4ZDc2OWNiMTNVTCwgMHhiMjBlNzdhYlVMLCAweDVjYTFjMmI5VUwsCisgICAgMHgzOWM2N2UwMVVMLCAweDgwZmVhOTljVUwsIDB4ZTU5OTE1MjRVTCwgMHgwYjM2YTAzNlVMLCAweDZlNTExYzhlVUwsCisgICAgMHhhNzE2NjY4NlVMLCAweGMyNzFkYTNlVUwsIDB4MmNkZTZmMmNVTCwgMHg0OWI5ZDM5NFVMLCAweGYwODEwNDA5VUwsCisgICAgMHg5NWU2YjhiMVVMLCAweDdiNDkwZGEzVUwsIDB4MWUyZWIxMWJVTCwgMHg0ODNlZDI0M1VMLCAweDJkNTk2ZWZiVUwsCisgICAgMHhjM2Y2ZGJlOVVMLCAweGE2OTE2NzUxVUwsIDB4MWZhOWIwY2NVTCwgMHg3YWNlMGM3NFVMLCAweDk0NjFiOTY2VUwsCisgICAgMHhmMTA2MDVkZVVMCisjZW5kaWYKKyAgfQorfTsKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2RlZmxhdGUuYyBiL3psaWIvc3JjL2RlZmxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTY5NTc3Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvZGVmbGF0ZS5jCkBAIC0wLDAgKzEsMTk2NyBAQAorLyogZGVmbGF0ZS5jIC0tIGNvbXByZXNzIGRhdGEgdXNpbmcgdGhlIGRlZmxhdGlvbiBhbGdvcml0aG0KKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKgorICogIEFMR09SSVRITQorICoKKyAqICAgICAgVGhlICJkZWZsYXRpb24iIHByb2Nlc3MgZGVwZW5kcyBvbiBiZWluZyBhYmxlIHRvIGlkZW50aWZ5IHBvcnRpb25zCisgKiAgICAgIG9mIHRoZSBpbnB1dCB0ZXh0IHdoaWNoIGFyZSBpZGVudGljYWwgdG8gZWFybGllciBpbnB1dCAod2l0aGluIGEKKyAqICAgICAgc2xpZGluZyB3aW5kb3cgdHJhaWxpbmcgYmVoaW5kIHRoZSBpbnB1dCBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkKS4KKyAqCisgKiAgICAgIFRoZSBtb3N0IHN0cmFpZ2h0Zm9yd2FyZCB0ZWNobmlxdWUgdHVybnMgb3V0IHRvIGJlIHRoZSBmYXN0ZXN0IGZvcgorICogICAgICBtb3N0IGlucHV0IGZpbGVzOiB0cnkgYWxsIHBvc3NpYmxlIG1hdGNoZXMgYW5kIHNlbGVjdCB0aGUgbG9uZ2VzdC4KKyAqICAgICAgVGhlIGtleSBmZWF0dXJlIG9mIHRoaXMgYWxnb3JpdGhtIGlzIHRoYXQgaW5zZXJ0aW9ucyBpbnRvIHRoZSBzdHJpbmcKKyAqICAgICAgZGljdGlvbmFyeSBhcmUgdmVyeSBzaW1wbGUgYW5kIHRodXMgZmFzdCwgYW5kIGRlbGV0aW9ucyBhcmUgYXZvaWRlZAorICogICAgICBjb21wbGV0ZWx5LiBJbnNlcnRpb25zIGFyZSBwZXJmb3JtZWQgYXQgZWFjaCBpbnB1dCBjaGFyYWN0ZXIsIHdoZXJlYXMKKyAqICAgICAgc3RyaW5nIG1hdGNoZXMgYXJlIHBlcmZvcm1lZCBvbmx5IHdoZW4gdGhlIHByZXZpb3VzIG1hdGNoIGVuZHMuIFNvIGl0CisgKiAgICAgIGlzIHByZWZlcmFibGUgdG8gc3BlbmQgbW9yZSB0aW1lIGluIG1hdGNoZXMgdG8gYWxsb3cgdmVyeSBmYXN0IHN0cmluZworICogICAgICBpbnNlcnRpb25zIGFuZCBhdm9pZCBkZWxldGlvbnMuIFRoZSBtYXRjaGluZyBhbGdvcml0aG0gZm9yIHNtYWxsCisgKiAgICAgIHN0cmluZ3MgaXMgaW5zcGlyZWQgZnJvbSB0aGF0IG9mIFJhYmluICYgS2FycC4gQSBicnV0ZSBmb3JjZSBhcHByb2FjaAorICogICAgICBpcyB1c2VkIHRvIGZpbmQgbG9uZ2VyIHN0cmluZ3Mgd2hlbiBhIHNtYWxsIG1hdGNoIGhhcyBiZWVuIGZvdW5kLgorICogICAgICBBIHNpbWlsYXIgYWxnb3JpdGhtIGlzIHVzZWQgaW4gY29taWMgKGJ5IEphbi1NYXJrIFdhbXMpIGFuZCBmcmVlemUKKyAqICAgICAgKGJ5IExlb25pZCBCcm91a2hpcykuCisgKiAgICAgICAgIEEgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdXNlZCBhIG1vcmUgc29waGlzdGljYXRlZCBhbGdvcml0aG0KKyAqICAgICAgKGJ5IEZpYWxhIGFuZCBHcmVlbmUpIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gcnVuIGluIGxpbmVhciBhbW9ydGl6ZWQKKyAqICAgICAgdGltZSwgYnV0IGhhcyBhIGxhcmdlciBhdmVyYWdlIGNvc3QsIHVzZXMgbW9yZSBtZW1vcnkgYW5kIGlzIHBhdGVudGVkLgorICogICAgICBIb3dldmVyIHRoZSBGJkcgYWxnb3JpdGhtIG1heSBiZSBmYXN0ZXIgZm9yIHNvbWUgaGlnaGx5IHJlZHVuZGFudAorICogICAgICBmaWxlcyBpZiB0aGUgcGFyYW1ldGVyIG1heF9jaGFpbl9sZW5ndGggKGRlc2NyaWJlZCBiZWxvdykgaXMgdG9vIGxhcmdlLgorICoKKyAqICBBQ0tOT1dMRURHRU1FTlRTCisgKgorICogICAgICBUaGUgaWRlYSBvZiBsYXp5IGV2YWx1YXRpb24gb2YgbWF0Y2hlcyBpcyBkdWUgdG8gSmFuLU1hcmsgV2FtcywgYW5kCisgKiAgICAgIEkgZm91bmQgaXQgaW4gJ2ZyZWV6ZScgd3JpdHRlbiBieSBMZW9uaWQgQnJvdWtoaXMuCisgKiAgICAgIFRoYW5rcyB0byBtYW55IHBlb3BsZSBmb3IgYnVnIHJlcG9ydHMgYW5kIHRlc3RpbmcuCisgKgorICogIFJFRkVSRU5DRVMKKyAqCisgKiAgICAgIERldXRzY2gsIEwuUC4sIkRFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uIi4KKyAqICAgICAgQXZhaWxhYmxlIGluIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzE5NTEKKyAqCisgKiAgICAgIEEgZGVzY3JpcHRpb24gb2YgdGhlIFJhYmluIGFuZCBLYXJwIGFsZ29yaXRobSBpcyBnaXZlbiBpbiB0aGUgYm9vaworICogICAgICAgICAiQWxnb3JpdGhtcyIgYnkgUi4gU2VkZ2V3aWNrLCBBZGRpc29uLVdlc2xleSwgcDI1Mi4KKyAqCisgKiAgICAgIEZpYWxhLEUuUi4sIGFuZCBHcmVlbmUsRC5ILgorICogICAgICAgICBEYXRhIENvbXByZXNzaW9uIHdpdGggRmluaXRlIFdpbmRvd3MsIENvbW0uQUNNLCAzMiw0ICgxOTg5KSA0OTAtNTk1CisgKgorICovCisKKy8qIEAoIykgJElkJCAqLworCisjaW5jbHVkZSAiZGVmbGF0ZS5oIgorCitjb25zdCBjaGFyIGRlZmxhdGVfY29weXJpZ2h0W10gPQorICAgIiBkZWZsYXRlIDEuMi44IENvcHlyaWdodCAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlciAiOworLyoKKyAgSWYgeW91IHVzZSB0aGUgemxpYiBsaWJyYXJ5IGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaXMgd2VsY29tZQorICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB5b3VyIHByb2R1Y3QuIElmIGZvciBzb21lIHJlYXNvbiB5b3UgY2Fubm90CisgIGluY2x1ZGUgc3VjaCBhbiBhY2tub3dsZWRnbWVudCwgSSB3b3VsZCBhcHByZWNpYXRlIHRoYXQgeW91IGtlZXAgdGhpcworICBjb3B5cmlnaHQgc3RyaW5nIGluIHRoZSBleGVjdXRhYmxlIG9mIHlvdXIgcHJvZHVjdC4KKyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICBGdW5jdGlvbiBwcm90b3R5cGVzLgorICovCit0eXBlZGVmIGVudW0geworICAgIG5lZWRfbW9yZSwgICAgICAvKiBibG9jayBub3QgY29tcGxldGVkLCBuZWVkIG1vcmUgaW5wdXQgb3IgbW9yZSBvdXRwdXQgKi8KKyAgICBibG9ja19kb25lLCAgICAgLyogYmxvY2sgZmx1c2ggcGVyZm9ybWVkICovCisgICAgZmluaXNoX3N0YXJ0ZWQsIC8qIGZpbmlzaCBzdGFydGVkLCBuZWVkIG9ubHkgbW9yZSBvdXRwdXQgYXQgbmV4dCBkZWZsYXRlICovCisgICAgZmluaXNoX2RvbmUgICAgIC8qIGZpbmlzaCBkb25lLCBhY2NlcHQgbm8gbW9yZSBpbnB1dCBvciBvdXRwdXQgKi8KK30gYmxvY2tfc3RhdGU7CisKK3R5cGVkZWYgYmxvY2tfc3RhdGUgKCpjb21wcmVzc19mdW5jKSBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGZsdXNoKSk7CisvKiBDb21wcmVzc2lvbiBmdW5jdGlvbi4gUmV0dXJucyB0aGUgYmxvY2sgc3RhdGUgYWZ0ZXIgdGhlIGNhbGwuICovCisKK2xvY2FsIHZvaWQgZmlsbF93aW5kb3cgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK2xvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfc3RvcmVkIE9GKChkZWZsYXRlX3N0YXRlICpzLCBpbnQgZmx1c2gpKTsKK2xvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfZmFzdCAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBpbnQgZmx1c2gpKTsKKyNpZm5kZWYgRkFTVEVTVAorbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9zbG93ICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBmbHVzaCkpOworI2VuZGlmCitsb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX3JsZSAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGZsdXNoKSk7Citsb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX2h1ZmYgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGZsdXNoKSk7Citsb2NhbCB2b2lkIGxtX2luaXQgICAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7Citsb2NhbCB2b2lkIHB1dFNob3J0TVNCICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCB1SW50IGIpKTsKK2xvY2FsIHZvaWQgZmx1c2hfcGVuZGluZyAgT0YoKHpfc3RyZWFtcCBzdHJtKSk7Citsb2NhbCBpbnQgcmVhZF9idWYgICAgICAgIE9GKCh6X3N0cmVhbXAgc3RybSwgQnl0ZWYgKmJ1ZiwgdW5zaWduZWQgc2l6ZSkpOworI2lmZGVmIEFTTVYKKyAgICAgIHZvaWQgbWF0Y2hfaW5pdCBPRigodm9pZCkpOyAvKiBhc20gY29kZSBpbml0aWFsaXphdGlvbiAqLworICAgICAgdUludCBsb25nZXN0X21hdGNoICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgSVBvcyBjdXJfbWF0Y2gpKTsKKyNlbHNlCitsb2NhbCB1SW50IGxvbmdlc3RfbWF0Y2ggIE9GKChkZWZsYXRlX3N0YXRlICpzLCBJUG9zIGN1cl9tYXRjaCkpOworI2VuZGlmCisKKyNpZmRlZiBERUJVRworbG9jYWwgIHZvaWQgY2hlY2tfbWF0Y2ggT0YoKGRlZmxhdGVfc3RhdGUgKnMsIElQb3Mgc3RhcnQsIElQb3MgbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkpOworI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTG9jYWwgZGF0YQorICovCisKKyNkZWZpbmUgTklMIDAKKy8qIFRhaWwgb2YgaGFzaCBjaGFpbnMgKi8KKworI2lmbmRlZiBUT09fRkFSCisjICBkZWZpbmUgVE9PX0ZBUiA0MDk2CisjZW5kaWYKKy8qIE1hdGNoZXMgb2YgbGVuZ3RoIDMgYXJlIGRpc2NhcmRlZCBpZiB0aGVpciBkaXN0YW5jZSBleGNlZWRzIFRPT19GQVIgKi8KKworLyogVmFsdWVzIGZvciBtYXhfbGF6eV9tYXRjaCwgZ29vZF9tYXRjaCBhbmQgbWF4X2NoYWluX2xlbmd0aCwgZGVwZW5kaW5nIG9uCisgKiB0aGUgZGVzaXJlZCBwYWNrIGxldmVsICgwLi45KS4gVGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBoYXZlIGJlZW4gdHVuZWQgdG8KKyAqIGV4Y2x1ZGUgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBmb3IgcGF0aG9sb2dpY2FsIGZpbGVzLiBCZXR0ZXIgdmFsdWVzIG1heSBiZQorICogZm91bmQgZm9yIHNwZWNpZmljIGZpbGVzLgorICovCit0eXBlZGVmIHN0cnVjdCBjb25maWdfcyB7CisgICB1c2ggZ29vZF9sZW5ndGg7IC8qIHJlZHVjZSBsYXp5IHNlYXJjaCBhYm92ZSB0aGlzIG1hdGNoIGxlbmd0aCAqLworICAgdXNoIG1heF9sYXp5OyAgICAvKiBkbyBub3QgcGVyZm9ybSBsYXp5IHNlYXJjaCBhYm92ZSB0aGlzIG1hdGNoIGxlbmd0aCAqLworICAgdXNoIG5pY2VfbGVuZ3RoOyAvKiBxdWl0IHNlYXJjaCBhYm92ZSB0aGlzIG1hdGNoIGxlbmd0aCAqLworICAgdXNoIG1heF9jaGFpbjsKKyAgIGNvbXByZXNzX2Z1bmMgZnVuYzsKK30gY29uZmlnOworCisjaWZkZWYgRkFTVEVTVAorbG9jYWwgY29uc3QgY29uZmlnIGNvbmZpZ3VyYXRpb25fdGFibGVbMl0gPSB7CisvKiAgICAgIGdvb2QgbGF6eSBuaWNlIGNoYWluICovCisvKiAwICovIHswLCAgICAwLCAgMCwgICAgMCwgZGVmbGF0ZV9zdG9yZWR9LCAgLyogc3RvcmUgb25seSAqLworLyogMSAqLyB7NCwgICAgNCwgIDgsICAgIDQsIGRlZmxhdGVfZmFzdH19OyAvKiBtYXggc3BlZWQsIG5vIGxhenkgbWF0Y2hlcyAqLworI2Vsc2UKK2xvY2FsIGNvbnN0IGNvbmZpZyBjb25maWd1cmF0aW9uX3RhYmxlWzEwXSA9IHsKKy8qICAgICAgZ29vZCBsYXp5IG5pY2UgY2hhaW4gKi8KKy8qIDAgKi8gezAsICAgIDAsICAwLCAgICAwLCBkZWZsYXRlX3N0b3JlZH0sICAvKiBzdG9yZSBvbmx5ICovCisvKiAxICovIHs0LCAgICA0LCAgOCwgICAgNCwgZGVmbGF0ZV9mYXN0fSwgLyogbWF4IHNwZWVkLCBubyBsYXp5IG1hdGNoZXMgKi8KKy8qIDIgKi8gezQsICAgIDUsIDE2LCAgICA4LCBkZWZsYXRlX2Zhc3R9LAorLyogMyAqLyB7NCwgICAgNiwgMzIsICAgMzIsIGRlZmxhdGVfZmFzdH0sCisKKy8qIDQgKi8gezQsICAgIDQsIDE2LCAgIDE2LCBkZWZsYXRlX3Nsb3d9LCAgLyogbGF6eSBtYXRjaGVzICovCisvKiA1ICovIHs4LCAgIDE2LCAzMiwgICAzMiwgZGVmbGF0ZV9zbG93fSwKKy8qIDYgKi8gezgsICAgMTYsIDEyOCwgMTI4LCBkZWZsYXRlX3Nsb3d9LAorLyogNyAqLyB7OCwgICAzMiwgMTI4LCAyNTYsIGRlZmxhdGVfc2xvd30sCisvKiA4ICovIHszMiwgMTI4LCAyNTgsIDEwMjQsIGRlZmxhdGVfc2xvd30sCisvKiA5ICovIHszMiwgMjU4LCAyNTgsIDQwOTYsIGRlZmxhdGVfc2xvd319OyAvKiBtYXggY29tcHJlc3Npb24gKi8KKyNlbmRpZgorCisvKiBOb3RlOiB0aGUgZGVmbGF0ZSgpIGNvZGUgcmVxdWlyZXMgbWF4X2xhenkgPj0gTUlOX01BVENIIGFuZCBtYXhfY2hhaW4gPj0gNAorICogRm9yIGRlZmxhdGVfZmFzdCgpIChsZXZlbHMgPD0gMykgZ29vZCBpcyBpZ25vcmVkIGFuZCBsYXp5IGhhcyBhIGRpZmZlcmVudAorICogbWVhbmluZy4KKyAqLworCisjZGVmaW5lIEVRVUFMIDAKKy8qIHJlc3VsdCBvZiBtZW1jbXAgZm9yIGVxdWFsIHN0cmluZ3MgKi8KKworI2lmbmRlZiBOT19EVU1NWV9ERUNMCitzdHJ1Y3Qgc3RhdGljX3RyZWVfZGVzY19zIHtpbnQgZHVtbXk7fTsgLyogZm9yIGJ1Z2d5IGNvbXBpbGVycyAqLworI2VuZGlmCisKKy8qIHJhbmsgWl9CTE9DSyBiZXR3ZWVuIFpfTk9fRkxVU0ggYW5kIFpfUEFSVElBTF9GTFVTSCAqLworI2RlZmluZSBSQU5LKGYpICgoKGYpIDw8IDEpIC0gKChmKSA+IDQgPyA5IDogMCkpCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVXBkYXRlIGEgaGFzaCB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBpbnB1dCBieXRlCisgKiBJTiAgYXNzZXJ0aW9uOiBhbGwgY2FsbHMgdG8gdG8gVVBEQVRFX0hBU0ggYXJlIG1hZGUgd2l0aCBjb25zZWN1dGl2ZQorICogICAgaW5wdXQgY2hhcmFjdGVycywgc28gdGhhdCBhIHJ1bm5pbmcgaGFzaCBrZXkgY2FuIGJlIGNvbXB1dGVkIGZyb20gdGhlCisgKiAgICBwcmV2aW91cyBrZXkgaW5zdGVhZCBvZiBjb21wbGV0ZSByZWNhbGN1bGF0aW9uIGVhY2ggdGltZS4KKyAqLworI2RlZmluZSBVUERBVEVfSEFTSChzLGgsYykgKGggPSAoKChoKTw8cy0+aGFzaF9zaGlmdCkgXiAoYykpICYgcy0+aGFzaF9tYXNrKQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5zZXJ0IHN0cmluZyBzdHIgaW4gdGhlIGRpY3Rpb25hcnkgYW5kIHNldCBtYXRjaF9oZWFkIHRvIHRoZSBwcmV2aW91cyBoZWFkCisgKiBvZiB0aGUgaGFzaCBjaGFpbiAodGhlIG1vc3QgcmVjZW50IHN0cmluZyB3aXRoIHNhbWUgaGFzaCBrZXkpLiBSZXR1cm4KKyAqIHRoZSBwcmV2aW91cyBsZW5ndGggb2YgdGhlIGhhc2ggY2hhaW4uCisgKiBJZiB0aGlzIGZpbGUgaXMgY29tcGlsZWQgd2l0aCAtREZBU1RFU1QsIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBpcyBmb3JjZWQKKyAqIHRvIDEsIGFuZCBubyBoYXNoIGNoYWlucyBhcmUgbWFpbnRhaW5lZC4KKyAqIElOICBhc3NlcnRpb246IGFsbCBjYWxscyB0byB0byBJTlNFUlRfU1RSSU5HIGFyZSBtYWRlIHdpdGggY29uc2VjdXRpdmUKKyAqICAgIGlucHV0IGNoYXJhY3RlcnMgYW5kIHRoZSBmaXJzdCBNSU5fTUFUQ0ggYnl0ZXMgb2Ygc3RyIGFyZSB2YWxpZAorICogICAgKGV4Y2VwdCBmb3IgdGhlIGxhc3QgTUlOX01BVENILTEgYnl0ZXMgb2YgdGhlIGlucHV0IGZpbGUpLgorICovCisjaWZkZWYgRkFTVEVTVAorI2RlZmluZSBJTlNFUlRfU1RSSU5HKHMsIHN0ciwgbWF0Y2hfaGVhZCkgXAorICAgKFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbKHN0cikgKyAoTUlOX01BVENILTEpXSksIFwKKyAgICBtYXRjaF9oZWFkID0gcy0+aGVhZFtzLT5pbnNfaF0sIFwKKyAgICBzLT5oZWFkW3MtPmluc19oXSA9IChQb3MpKHN0cikpCisjZWxzZQorI2RlZmluZSBJTlNFUlRfU1RSSU5HKHMsIHN0ciwgbWF0Y2hfaGVhZCkgXAorICAgKFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbKHN0cikgKyAoTUlOX01BVENILTEpXSksIFwKKyAgICBtYXRjaF9oZWFkID0gcy0+cHJldlsoc3RyKSAmIHMtPndfbWFza10gPSBzLT5oZWFkW3MtPmluc19oXSwgXAorICAgIHMtPmhlYWRbcy0+aW5zX2hdID0gKFBvcykoc3RyKSkKKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgdGhlIGhhc2ggdGFibGUgKGF2b2lkaW5nIDY0SyBvdmVyZmxvdyBmb3IgMTYgYml0IHN5c3RlbXMpLgorICogcHJldltdIHdpbGwgYmUgaW5pdGlhbGl6ZWQgb24gdGhlIGZseS4KKyAqLworI2RlZmluZSBDTEVBUl9IQVNIKHMpIFwKKyAgICBzLT5oZWFkW3MtPmhhc2hfc2l6ZS0xXSA9IE5JTDsgXAorICAgIHptZW16ZXJvKChCeXRlZiAqKXMtPmhlYWQsICh1bnNpZ25lZCkocy0+aGFzaF9zaXplLTEpKnNpemVvZigqcy0+aGVhZCkpOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdF8oc3RybSwgbGV2ZWwsIHZlcnNpb24sIHN0cmVhbV9zaXplKQorICAgIHpfc3RyZWFtcCBzdHJtOworICAgIGludCBsZXZlbDsKKyAgICBjb25zdCBjaGFyICp2ZXJzaW9uOworICAgIGludCBzdHJlYW1fc2l6ZTsKK3sKKyAgICByZXR1cm4gZGVmbGF0ZUluaXQyXyhzdHJtLCBsZXZlbCwgWl9ERUZMQVRFRCwgTUFYX1dCSVRTLCBERUZfTUVNX0xFVkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgIFpfREVGQVVMVF9TVFJBVEVHWSwgdmVyc2lvbiwgc3RyZWFtX3NpemUpOworICAgIC8qIFRvIGRvOiBpZ25vcmUgc3RybS0+bmV4dF9pbiBpZiB3ZSB1c2UgaXQgYXMgd2luZG93ICovCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBaRVhQT1JUIGRlZmxhdGVJbml0Ml8oc3RybSwgbGV2ZWwsIG1ldGhvZCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgdmVyc2lvbiwgc3RyZWFtX3NpemUpCisgICAgel9zdHJlYW1wIHN0cm07CisgICAgaW50ICBsZXZlbDsKKyAgICBpbnQgIG1ldGhvZDsKKyAgICBpbnQgIHdpbmRvd0JpdHM7CisgICAgaW50ICBtZW1MZXZlbDsKKyAgICBpbnQgIHN0cmF0ZWd5OworICAgIGNvbnN0IGNoYXIgKnZlcnNpb247CisgICAgaW50IHN0cmVhbV9zaXplOworeworICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgaW50IHdyYXAgPSAxOworICAgIHN0YXRpYyBjb25zdCBjaGFyIG15X3ZlcnNpb25bXSA9IFpMSUJfVkVSU0lPTjsKKworICAgIHVzaGYgKm92ZXJsYXk7CisgICAgLyogV2Ugb3ZlcmxheSBwZW5kaW5nX2J1ZiBhbmQgZF9idWYrbF9idWYuIFRoaXMgd29ya3Mgc2luY2UgdGhlIGF2ZXJhZ2UKKyAgICAgKiBvdXRwdXQgc2l6ZSBmb3IgKGxlbmd0aCxkaXN0YW5jZSkgY29kZXMgaXMgPD0gMjQgYml0cy4KKyAgICAgKi8KKworICAgIGlmICh2ZXJzaW9uID09IFpfTlVMTCB8fCB2ZXJzaW9uWzBdICE9IG15X3ZlcnNpb25bMF0gfHwKKyAgICAgICAgc3RyZWFtX3NpemUgIT0gc2l6ZW9mKHpfc3RyZWFtKSkgeworICAgICAgICByZXR1cm4gWl9WRVJTSU9OX0VSUk9SOworICAgIH0KKyAgICBpZiAoc3RybSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKworICAgIHN0cm0tPm1zZyA9IFpfTlVMTDsKKyAgICBpZiAoc3RybS0+emFsbG9jID09IChhbGxvY19mdW5jKTApIHsKKyNpZmRlZiBaX1NPTE8KKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworI2Vsc2UKKyAgICAgICAgc3RybS0+emFsbG9jID0gemNhbGxvYzsKKyAgICAgICAgc3RybS0+b3BhcXVlID0gKHZvaWRwZikwOworI2VuZGlmCisgICAgfQorICAgIGlmIChzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTApCisjaWZkZWYgWl9TT0xPCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyNlbHNlCisgICAgICAgIHN0cm0tPnpmcmVlID0gemNmcmVlOworI2VuZGlmCisKKyNpZmRlZiBGQVNURVNUCisgICAgaWYgKGxldmVsICE9IDApIGxldmVsID0gMTsKKyNlbHNlCisgICAgaWYgKGxldmVsID09IFpfREVGQVVMVF9DT01QUkVTU0lPTikgbGV2ZWwgPSA2OworI2VuZGlmCisKKyAgICBpZiAod2luZG93Qml0cyA8IDApIHsgLyogc3VwcHJlc3MgemxpYiB3cmFwcGVyICovCisgICAgICAgIHdyYXAgPSAwOworICAgICAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7CisgICAgfQorI2lmZGVmIEdaSVAKKyAgICBlbHNlIGlmICh3aW5kb3dCaXRzID4gMTUpIHsKKyAgICAgICAgd3JhcCA9IDI7ICAgICAgIC8qIHdyaXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkICovCisgICAgICAgIHdpbmRvd0JpdHMgLT0gMTY7CisgICAgfQorI2VuZGlmCisgICAgaWYgKG1lbUxldmVsIDwgMSB8fCBtZW1MZXZlbCA+IE1BWF9NRU1fTEVWRUwgfHwgbWV0aG9kICE9IFpfREVGTEFURUQgfHwKKyAgICAgICAgd2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1IHx8IGxldmVsIDwgMCB8fCBsZXZlbCA+IDkgfHwKKyAgICAgICAgc3RyYXRlZ3kgPCAwIHx8IHN0cmF0ZWd5ID4gWl9GSVhFRCkgeworICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgfQorICAgIGlmICh3aW5kb3dCaXRzID09IDgpIHdpbmRvd0JpdHMgPSA5OyAgLyogdW50aWwgMjU2LWJ5dGUgd2luZG93IGJ1ZyBmaXhlZCAqLworICAgIHMgPSAoZGVmbGF0ZV9zdGF0ZSAqKSBaQUxMT0Moc3RybSwgMSwgc2l6ZW9mKGRlZmxhdGVfc3RhdGUpKTsKKyAgICBpZiAocyA9PSBaX05VTEwpIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICBzdHJtLT5zdGF0ZSA9IChzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICopczsKKyAgICBzLT5zdHJtID0gc3RybTsKKworICAgIHMtPndyYXAgPSB3cmFwOworICAgIHMtPmd6aGVhZCA9IFpfTlVMTDsKKyAgICBzLT53X2JpdHMgPSB3aW5kb3dCaXRzOworICAgIHMtPndfc2l6ZSA9IDEgPDwgcy0+d19iaXRzOworICAgIHMtPndfbWFzayA9IHMtPndfc2l6ZSAtIDE7CisKKyAgICBzLT5oYXNoX2JpdHMgPSBtZW1MZXZlbCArIDc7CisgICAgcy0+aGFzaF9zaXplID0gMSA8PCBzLT5oYXNoX2JpdHM7CisgICAgcy0+aGFzaF9tYXNrID0gcy0+aGFzaF9zaXplIC0gMTsKKyAgICBzLT5oYXNoX3NoaWZ0ID0gICgocy0+aGFzaF9iaXRzK01JTl9NQVRDSC0xKS9NSU5fTUFUQ0gpOworCisgICAgcy0+d2luZG93ID0gKEJ5dGVmICopIFpBTExPQyhzdHJtLCBzLT53X3NpemUsIDIqc2l6ZW9mKEJ5dGUpKTsKKyAgICBzLT5wcmV2ICAgPSAoUG9zZiAqKSAgWkFMTE9DKHN0cm0sIHMtPndfc2l6ZSwgc2l6ZW9mKFBvcykpOworICAgIHMtPmhlYWQgICA9IChQb3NmICopICBaQUxMT0Moc3RybSwgcy0+aGFzaF9zaXplLCBzaXplb2YoUG9zKSk7CisKKyAgICBzLT5oaWdoX3dhdGVyID0gMDsgICAgICAvKiBub3RoaW5nIHdyaXR0ZW4gdG8gcy0+d2luZG93IHlldCAqLworCisgICAgcy0+bGl0X2J1ZnNpemUgPSAxIDw8IChtZW1MZXZlbCArIDYpOyAvKiAxNksgZWxlbWVudHMgYnkgZGVmYXVsdCAqLworCisgICAgb3ZlcmxheSA9ICh1c2hmICopIFpBTExPQyhzdHJtLCBzLT5saXRfYnVmc2l6ZSwgc2l6ZW9mKHVzaCkrMik7CisgICAgcy0+cGVuZGluZ19idWYgPSAodWNoZiAqKSBvdmVybGF5OworICAgIHMtPnBlbmRpbmdfYnVmX3NpemUgPSAodWxnKXMtPmxpdF9idWZzaXplICogKHNpemVvZih1c2gpKzJMKTsKKworICAgIGlmIChzLT53aW5kb3cgPT0gWl9OVUxMIHx8IHMtPnByZXYgPT0gWl9OVUxMIHx8IHMtPmhlYWQgPT0gWl9OVUxMIHx8CisgICAgICAgIHMtPnBlbmRpbmdfYnVmID09IFpfTlVMTCkgeworICAgICAgICBzLT5zdGF0dXMgPSBGSU5JU0hfU1RBVEU7CisgICAgICAgIHN0cm0tPm1zZyA9IEVSUl9NU0coWl9NRU1fRVJST1IpOworICAgICAgICBkZWZsYXRlRW5kIChzdHJtKTsKKyAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOworICAgIH0KKyAgICBzLT5kX2J1ZiA9IG92ZXJsYXkgKyBzLT5saXRfYnVmc2l6ZS9zaXplb2YodXNoKTsKKyAgICBzLT5sX2J1ZiA9IHMtPnBlbmRpbmdfYnVmICsgKDErc2l6ZW9mKHVzaCkpKnMtPmxpdF9idWZzaXplOworCisgICAgcy0+bGV2ZWwgPSBsZXZlbDsKKyAgICBzLT5zdHJhdGVneSA9IHN0cmF0ZWd5OworICAgIHMtPm1ldGhvZCA9IChCeXRlKW1ldGhvZDsKKworICAgIHJldHVybiBkZWZsYXRlUmVzZXQoc3RybSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBaRVhQT1JUIGRlZmxhdGVTZXREaWN0aW9uYXJ5IChzdHJtLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKQorICAgIHpfc3RyZWFtcCBzdHJtOworICAgIGNvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5OworICAgIHVJbnQgIGRpY3RMZW5ndGg7Cit7CisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICB1SW50IHN0ciwgbjsKKyAgICBpbnQgd3JhcDsKKyAgICB1bnNpZ25lZCBhdmFpbDsKKyAgICB6X2NvbnN0IHVuc2lnbmVkIGNoYXIgKm5leHQ7CisKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMIHx8IGRpY3Rpb25hcnkgPT0gWl9OVUxMKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgcyA9IHN0cm0tPnN0YXRlOworICAgIHdyYXAgPSBzLT53cmFwOworICAgIGlmICh3cmFwID09IDIgfHwgKHdyYXAgPT0gMSAmJiBzLT5zdGF0dXMgIT0gSU5JVF9TVEFURSkgfHwgcy0+bG9va2FoZWFkKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICAvKiB3aGVuIHVzaW5nIHpsaWIgd3JhcHBlcnMsIGNvbXB1dGUgQWRsZXItMzIgZm9yIHByb3ZpZGVkIGRpY3Rpb25hcnkgKi8KKyAgICBpZiAod3JhcCA9PSAxKQorICAgICAgICBzdHJtLT5hZGxlciA9IGFkbGVyMzIoc3RybS0+YWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOworICAgIHMtPndyYXAgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogYXZvaWQgY29tcHV0aW5nIEFkbGVyLTMyIGluIHJlYWRfYnVmICovCisKKyAgICAvKiBpZiBkaWN0aW9uYXJ5IHdvdWxkIGZpbGwgd2luZG93LCBqdXN0IHJlcGxhY2UgdGhlIGhpc3RvcnkgKi8KKyAgICBpZiAoZGljdExlbmd0aCA+PSBzLT53X3NpemUpIHsKKyAgICAgICAgaWYgKHdyYXAgPT0gMCkgeyAgICAgICAgICAgIC8qIGFscmVhZHkgZW1wdHkgb3RoZXJ3aXNlICovCisgICAgICAgICAgICBDTEVBUl9IQVNIKHMpOworICAgICAgICAgICAgcy0+c3Ryc3RhcnQgPSAwOworICAgICAgICAgICAgcy0+YmxvY2tfc3RhcnQgPSAwTDsKKyAgICAgICAgICAgIHMtPmluc2VydCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZGljdGlvbmFyeSArPSBkaWN0TGVuZ3RoIC0gcy0+d19zaXplOyAgLyogdXNlIHRoZSB0YWlsICovCisgICAgICAgIGRpY3RMZW5ndGggPSBzLT53X3NpemU7CisgICAgfQorCisgICAgLyogaW5zZXJ0IGRpY3Rpb25hcnkgaW50byB3aW5kb3cgYW5kIGhhc2ggKi8KKyAgICBhdmFpbCA9IHN0cm0tPmF2YWlsX2luOworICAgIG5leHQgPSBzdHJtLT5uZXh0X2luOworICAgIHN0cm0tPmF2YWlsX2luID0gZGljdExlbmd0aDsKKyAgICBzdHJtLT5uZXh0X2luID0gKHpfY29uc3QgQnl0ZWYgKilkaWN0aW9uYXJ5OworICAgIGZpbGxfd2luZG93KHMpOworICAgIHdoaWxlIChzLT5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7CisgICAgICAgIHN0ciA9IHMtPnN0cnN0YXJ0OworICAgICAgICBuID0gcy0+bG9va2FoZWFkIC0gKE1JTl9NQVRDSC0xKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOworI2lmbmRlZiBGQVNURVNUCisgICAgICAgICAgICBzLT5wcmV2W3N0ciAmIHMtPndfbWFza10gPSBzLT5oZWFkW3MtPmluc19oXTsKKyNlbmRpZgorICAgICAgICAgICAgcy0+aGVhZFtzLT5pbnNfaF0gPSAoUG9zKXN0cjsKKyAgICAgICAgICAgIHN0cisrOworICAgICAgICB9IHdoaWxlICgtLW4pOworICAgICAgICBzLT5zdHJzdGFydCA9IHN0cjsKKyAgICAgICAgcy0+bG9va2FoZWFkID0gTUlOX01BVENILTE7CisgICAgICAgIGZpbGxfd2luZG93KHMpOworICAgIH0KKyAgICBzLT5zdHJzdGFydCArPSBzLT5sb29rYWhlYWQ7CisgICAgcy0+YmxvY2tfc3RhcnQgPSAobG9uZylzLT5zdHJzdGFydDsKKyAgICBzLT5pbnNlcnQgPSBzLT5sb29rYWhlYWQ7CisgICAgcy0+bG9va2FoZWFkID0gMDsKKyAgICBzLT5tYXRjaF9sZW5ndGggPSBzLT5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSC0xOworICAgIHMtPm1hdGNoX2F2YWlsYWJsZSA9IDA7CisgICAgc3RybS0+bmV4dF9pbiA9IG5leHQ7CisgICAgc3RybS0+YXZhaWxfaW4gPSBhdmFpbDsKKyAgICBzLT53cmFwID0gd3JhcDsKKyAgICByZXR1cm4gWl9PSzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZVJlc2V0S2VlcCAoc3RybSkKKyAgICB6X3N0cmVhbXAgc3RybTsKK3sKKyAgICBkZWZsYXRlX3N0YXRlICpzOworCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fAorICAgICAgICBzdHJtLT56YWxsb2MgPT0gKGFsbG9jX2Z1bmMpMCB8fCBzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTApIHsKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIH0KKworICAgIHN0cm0tPnRvdGFsX2luID0gc3RybS0+dG90YWxfb3V0ID0gMDsKKyAgICBzdHJtLT5tc2cgPSBaX05VTEw7IC8qIHVzZSB6ZnJlZSBpZiB3ZSBldmVyIGFsbG9jYXRlIG1zZyBkeW5hbWljYWxseSAqLworICAgIHN0cm0tPmRhdGFfdHlwZSA9IFpfVU5LTk9XTjsKKworICAgIHMgPSAoZGVmbGF0ZV9zdGF0ZSAqKXN0cm0tPnN0YXRlOworICAgIHMtPnBlbmRpbmcgPSAwOworICAgIHMtPnBlbmRpbmdfb3V0ID0gcy0+cGVuZGluZ19idWY7CisKKyAgICBpZiAocy0+d3JhcCA8IDApIHsKKyAgICAgICAgcy0+d3JhcCA9IC1zLT53cmFwOyAvKiB3YXMgbWFkZSBuZWdhdGl2ZSBieSBkZWZsYXRlKC4uLiwgWl9GSU5JU0gpOyAqLworICAgIH0KKyAgICBzLT5zdGF0dXMgPSBzLT53cmFwID8gSU5JVF9TVEFURSA6IEJVU1lfU1RBVEU7CisgICAgc3RybS0+YWRsZXIgPQorI2lmZGVmIEdaSVAKKyAgICAgICAgcy0+d3JhcCA9PSAyID8gY3JjMzIoMEwsIFpfTlVMTCwgMCkgOgorI2VuZGlmCisgICAgICAgIGFkbGVyMzIoMEwsIFpfTlVMTCwgMCk7CisgICAgcy0+bGFzdF9mbHVzaCA9IFpfTk9fRkxVU0g7CisKKyAgICBfdHJfaW5pdChzKTsKKworICAgIHJldHVybiBaX09LOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgWkVYUE9SVCBkZWZsYXRlUmVzZXQgKHN0cm0pCisgICAgel9zdHJlYW1wIHN0cm07Cit7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGRlZmxhdGVSZXNldEtlZXAoc3RybSk7CisgICAgaWYgKHJldCA9PSBaX09LKQorICAgICAgICBsbV9pbml0KHN0cm0tPnN0YXRlKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgWkVYUE9SVCBkZWZsYXRlU2V0SGVhZGVyIChzdHJtLCBoZWFkKQorICAgIHpfc3RyZWFtcCBzdHJtOworICAgIGd6X2hlYWRlcnAgaGVhZDsKK3sKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgaWYgKHN0cm0tPnN0YXRlLT53cmFwICE9IDIpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdHJtLT5zdGF0ZS0+Z3poZWFkID0gaGVhZDsKKyAgICByZXR1cm4gWl9PSzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZVBlbmRpbmcgKHN0cm0sIHBlbmRpbmcsIGJpdHMpCisgICAgdW5zaWduZWQgKnBlbmRpbmc7CisgICAgaW50ICpiaXRzOworICAgIHpfc3RyZWFtcCBzdHJtOworeworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBpZiAocGVuZGluZyAhPSBaX05VTEwpCisgICAgICAgICpwZW5kaW5nID0gc3RybS0+c3RhdGUtPnBlbmRpbmc7CisgICAgaWYgKGJpdHMgIT0gWl9OVUxMKQorICAgICAgICAqYml0cyA9IHN0cm0tPnN0YXRlLT5iaV92YWxpZDsKKyAgICByZXR1cm4gWl9PSzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZVByaW1lIChzdHJtLCBiaXRzLCB2YWx1ZSkKKyAgICB6X3N0cmVhbXAgc3RybTsKKyAgICBpbnQgYml0czsKKyAgICBpbnQgdmFsdWU7Cit7CisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBpbnQgcHV0OworCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHMgPSBzdHJtLT5zdGF0ZTsKKyAgICBpZiAoKEJ5dGVmICopKHMtPmRfYnVmKSA8IHMtPnBlbmRpbmdfb3V0ICsgKChCdWZfc2l6ZSArIDcpID4+IDMpKQorICAgICAgICByZXR1cm4gWl9CVUZfRVJST1I7CisgICAgZG8geworICAgICAgICBwdXQgPSBCdWZfc2l6ZSAtIHMtPmJpX3ZhbGlkOworICAgICAgICBpZiAocHV0ID4gYml0cykKKyAgICAgICAgICAgIHB1dCA9IGJpdHM7CisgICAgICAgIHMtPmJpX2J1ZiB8PSAodXNoKSgodmFsdWUgJiAoKDEgPDwgcHV0KSAtIDEpKSA8PCBzLT5iaV92YWxpZCk7CisgICAgICAgIHMtPmJpX3ZhbGlkICs9IHB1dDsKKyAgICAgICAgX3RyX2ZsdXNoX2JpdHMocyk7CisgICAgICAgIHZhbHVlID4+PSBwdXQ7CisgICAgICAgIGJpdHMgLT0gcHV0OworICAgIH0gd2hpbGUgKGJpdHMpOworICAgIHJldHVybiBaX09LOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgWkVYUE9SVCBkZWZsYXRlUGFyYW1zKHN0cm0sIGxldmVsLCBzdHJhdGVneSkKKyAgICB6X3N0cmVhbXAgc3RybTsKKyAgICBpbnQgbGV2ZWw7CisgICAgaW50IHN0cmF0ZWd5OworeworICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgY29tcHJlc3NfZnVuYyBmdW5jOworICAgIGludCBlcnIgPSBaX09LOworCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHMgPSBzdHJtLT5zdGF0ZTsKKworI2lmZGVmIEZBU1RFU1QKKyAgICBpZiAobGV2ZWwgIT0gMCkgbGV2ZWwgPSAxOworI2Vsc2UKKyAgICBpZiAobGV2ZWwgPT0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OKSBsZXZlbCA9IDY7CisjZW5kaWYKKyAgICBpZiAobGV2ZWwgPCAwIHx8IGxldmVsID4gOSB8fCBzdHJhdGVneSA8IDAgfHwgc3RyYXRlZ3kgPiBaX0ZJWEVEKSB7CisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICB9CisgICAgZnVuYyA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy0+bGV2ZWxdLmZ1bmM7CisKKyAgICBpZiAoKHN0cmF0ZWd5ICE9IHMtPnN0cmF0ZWd5IHx8IGZ1bmMgIT0gY29uZmlndXJhdGlvbl90YWJsZVtsZXZlbF0uZnVuYykgJiYKKyAgICAgICAgc3RybS0+dG90YWxfaW4gIT0gMCkgeworICAgICAgICAvKiBGbHVzaCB0aGUgbGFzdCBidWZmZXI6ICovCisgICAgICAgIGVyciA9IGRlZmxhdGUoc3RybSwgWl9CTE9DSyk7CisgICAgICAgIGlmIChlcnIgPT0gWl9CVUZfRVJST1IgJiYgcy0+cGVuZGluZyA9PSAwKQorICAgICAgICAgICAgZXJyID0gWl9PSzsKKyAgICB9CisgICAgaWYgKHMtPmxldmVsICE9IGxldmVsKSB7CisgICAgICAgIHMtPmxldmVsID0gbGV2ZWw7CisgICAgICAgIHMtPm1heF9sYXp5X21hdGNoICAgPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5tYXhfbGF6eTsKKyAgICAgICAgcy0+Z29vZF9tYXRjaCAgICAgICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbbGV2ZWxdLmdvb2RfbGVuZ3RoOworICAgICAgICBzLT5uaWNlX21hdGNoICAgICAgID0gY29uZmlndXJhdGlvbl90YWJsZVtsZXZlbF0ubmljZV9sZW5ndGg7CisgICAgICAgIHMtPm1heF9jaGFpbl9sZW5ndGggPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5tYXhfY2hhaW47CisgICAgfQorICAgIHMtPnN0cmF0ZWd5ID0gc3RyYXRlZ3k7CisgICAgcmV0dXJuIGVycjsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZVR1bmUoc3RybSwgZ29vZF9sZW5ndGgsIG1heF9sYXp5LCBuaWNlX2xlbmd0aCwgbWF4X2NoYWluKQorICAgIHpfc3RyZWFtcCBzdHJtOworICAgIGludCBnb29kX2xlbmd0aDsKKyAgICBpbnQgbWF4X2xhenk7CisgICAgaW50IG5pY2VfbGVuZ3RoOworICAgIGludCBtYXhfY2hhaW47Cit7CisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzID0gc3RybS0+c3RhdGU7CisgICAgcy0+Z29vZF9tYXRjaCA9IGdvb2RfbGVuZ3RoOworICAgIHMtPm1heF9sYXp5X21hdGNoID0gbWF4X2xhenk7CisgICAgcy0+bmljZV9tYXRjaCA9IG5pY2VfbGVuZ3RoOworICAgIHMtPm1heF9jaGFpbl9sZW5ndGggPSBtYXhfY2hhaW47CisgICAgcmV0dXJuIFpfT0s7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZvciB0aGUgZGVmYXVsdCB3aW5kb3dCaXRzIG9mIDE1IGFuZCBtZW1MZXZlbCBvZiA4LCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKKyAqIGEgY2xvc2UgdG8gZXhhY3QsIGFzIHdlbGwgYXMgc21hbGwsIHVwcGVyIGJvdW5kIG9uIHRoZSBjb21wcmVzc2VkIHNpemUuCisgKiBUaGV5IGFyZSBjb2RlZCBhcyBjb25zdGFudHMgaGVyZSBmb3IgYSByZWFzb24tLWlmIHRoZSAjZGVmaW5lJ3MgYXJlCisgKiBjaGFuZ2VkLCB0aGVuIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgY2hhbmdlZCBhcyB3ZWxsLiAgVGhlIHJldHVybgorICogdmFsdWUgZm9yIDE1IGFuZCA4IG9ubHkgd29ya3MgZm9yIHRob3NlIGV4YWN0IHNldHRpbmdzLgorICoKKyAqIEZvciBhbnkgc2V0dGluZyBvdGhlciB0aGFuIHRob3NlIGRlZmF1bHRzIGZvciB3aW5kb3dCaXRzIGFuZCBtZW1MZXZlbCwKKyAqIHRoZSB2YWx1ZSByZXR1cm5lZCBpcyBhIGNvbnNlcnZhdGl2ZSB3b3JzdCBjYXNlIGZvciB0aGUgbWF4aW11bSBleHBhbnNpb24KKyAqIHJlc3VsdGluZyBmcm9tIHVzaW5nIGZpeGVkIGJsb2NrcyBpbnN0ZWFkIG9mIHN0b3JlZCBibG9ja3MsIHdoaWNoIGRlZmxhdGUKKyAqIGNhbiBlbWl0IG9uIGNvbXByZXNzZWQgZGF0YSBmb3Igc29tZSBjb21iaW5hdGlvbnMgb2YgdGhlIHBhcmFtZXRlcnMuCisgKgorICogVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3JlIHNvcGhpc3RpY2F0ZWQgdG8gcHJvdmlkZSBjbG9zZXIgdXBwZXIgYm91bmRzIGZvcgorICogZXZlcnkgY29tYmluYXRpb24gb2Ygd2luZG93Qml0cyBhbmQgbWVtTGV2ZWwuICBCdXQgZXZlbiB0aGUgY29uc2VydmF0aXZlCisgKiB1cHBlciBib3VuZCBvZiBhYm91dCAxNCUgZXhwYW5zaW9uIGRvZXMgbm90IHNlZW0gb25lcm91cyBmb3Igb3V0cHV0IGJ1ZmZlcgorICogYWxsb2NhdGlvbi4KKyAqLwordUxvbmcgWkVYUE9SVCBkZWZsYXRlQm91bmQoc3RybSwgc291cmNlTGVuKQorICAgIHpfc3RyZWFtcCBzdHJtOworICAgIHVMb25nIHNvdXJjZUxlbjsKK3sKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIHVMb25nIGNvbXBsZW4sIHdyYXBsZW47CisgICAgQnl0ZWYgKnN0cjsKKworICAgIC8qIGNvbnNlcnZhdGl2ZSB1cHBlciBib3VuZCBmb3IgY29tcHJlc3NlZCBkYXRhICovCisgICAgY29tcGxlbiA9IHNvdXJjZUxlbiArCisgICAgICAgICAgICAgICgoc291cmNlTGVuICsgNykgPj4gMykgKyAoKHNvdXJjZUxlbiArIDYzKSA+PiA2KSArIDU7CisKKyAgICAvKiBpZiBjYW4ndCBnZXQgcGFyYW1ldGVycywgcmV0dXJuIGNvbnNlcnZhdGl2ZSBib3VuZCBwbHVzIHpsaWIgd3JhcHBlciAqLworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpCisgICAgICAgIHJldHVybiBjb21wbGVuICsgNjsKKworICAgIC8qIGNvbXB1dGUgd3JhcHBlciBsZW5ndGggKi8KKyAgICBzID0gc3RybS0+c3RhdGU7CisgICAgc3dpdGNoIChzLT53cmFwKSB7CisgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJhdyBkZWZsYXRlICovCisgICAgICAgIHdyYXBsZW4gPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogemxpYiB3cmFwcGVyICovCisgICAgICAgIHdyYXBsZW4gPSA2ICsgKHMtPnN0cnN0YXJ0ID8gNCA6IDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ3ppcCB3cmFwcGVyICovCisgICAgICAgIHdyYXBsZW4gPSAxODsKKyAgICAgICAgaWYgKHMtPmd6aGVhZCAhPSBaX05VTEwpIHsgICAgICAgICAgLyogdXNlci1zdXBwbGllZCBnemlwIGhlYWRlciAqLworICAgICAgICAgICAgaWYgKHMtPmd6aGVhZC0+ZXh0cmEgIT0gWl9OVUxMKQorICAgICAgICAgICAgICAgIHdyYXBsZW4gKz0gMiArIHMtPmd6aGVhZC0+ZXh0cmFfbGVuOworICAgICAgICAgICAgc3RyID0gcy0+Z3poZWFkLT5uYW1lOworICAgICAgICAgICAgaWYgKHN0ciAhPSBaX05VTEwpCisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICB3cmFwbGVuKys7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoKnN0cisrKTsKKyAgICAgICAgICAgIHN0ciA9IHMtPmd6aGVhZC0+Y29tbWVudDsKKyAgICAgICAgICAgIGlmIChzdHIgIT0gWl9OVUxMKQorICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgd3JhcGxlbisrOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKCpzdHIrKyk7CisgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjKQorICAgICAgICAgICAgICAgIHdyYXBsZW4gKz0gMjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIGNvbXBpbGVyIGhhcHBpbmVzcyAqLworICAgICAgICB3cmFwbGVuID0gNjsKKyAgICB9CisKKyAgICAvKiBpZiBub3QgZGVmYXVsdCBwYXJhbWV0ZXJzLCByZXR1cm4gY29uc2VydmF0aXZlIGJvdW5kICovCisgICAgaWYgKHMtPndfYml0cyAhPSAxNSB8fCBzLT5oYXNoX2JpdHMgIT0gOCArIDcpCisgICAgICAgIHJldHVybiBjb21wbGVuICsgd3JhcGxlbjsKKworICAgIC8qIGRlZmF1bHQgc2V0dGluZ3M6IHJldHVybiB0aWdodCBib3VuZCBmb3IgdGhhdCBjYXNlICovCisgICAgcmV0dXJuIHNvdXJjZUxlbiArIChzb3VyY2VMZW4gPj4gMTIpICsgKHNvdXJjZUxlbiA+PiAxNCkgKworICAgICAgICAgICAoc291cmNlTGVuID4+IDI1KSArIDEzIC0gNiArIHdyYXBsZW47Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFB1dCBhIHNob3J0IGluIHRoZSBwZW5kaW5nIGJ1ZmZlci4gVGhlIDE2LWJpdCB2YWx1ZSBpcyBwdXQgaW4gTVNCIG9yZGVyLgorICogSU4gYXNzZXJ0aW9uOiB0aGUgc3RyZWFtIHN0YXRlIGlzIGNvcnJlY3QgYW5kIHRoZXJlIGlzIGVub3VnaCByb29tIGluCisgKiBwZW5kaW5nX2J1Zi4KKyAqLworbG9jYWwgdm9pZCBwdXRTaG9ydE1TQiAocywgYikKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIHVJbnQgYjsKK3sKKyAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiA+PiA4KSk7CisgICAgcHV0X2J5dGUocywgKEJ5dGUpKGIgJiAweGZmKSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUuIEFsbCBkZWZsYXRlKCkgb3V0cHV0IGdvZXMKKyAqIHRocm91Z2ggdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXQKKyAqIHRvIGF2b2lkIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5uZXh0X291dCBidWZmZXIgYW5kIGNvcHlpbmcgaW50byBpdC4KKyAqIChTZWUgYWxzbyByZWFkX2J1ZigpKS4KKyAqLworbG9jYWwgdm9pZCBmbHVzaF9wZW5kaW5nKHN0cm0pCisgICAgel9zdHJlYW1wIHN0cm07Cit7CisgICAgdW5zaWduZWQgbGVuOworICAgIGRlZmxhdGVfc3RhdGUgKnMgPSBzdHJtLT5zdGF0ZTsKKworICAgIF90cl9mbHVzaF9iaXRzKHMpOworICAgIGxlbiA9IHMtPnBlbmRpbmc7CisgICAgaWYgKGxlbiA+IHN0cm0tPmF2YWlsX291dCkgbGVuID0gc3RybS0+YXZhaWxfb3V0OworICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuOworCisgICAgem1lbWNweShzdHJtLT5uZXh0X291dCwgcy0+cGVuZGluZ19vdXQsIGxlbik7CisgICAgc3RybS0+bmV4dF9vdXQgICs9IGxlbjsKKyAgICBzLT5wZW5kaW5nX291dCAgKz0gbGVuOworICAgIHN0cm0tPnRvdGFsX291dCArPSBsZW47CisgICAgc3RybS0+YXZhaWxfb3V0ICAtPSBsZW47CisgICAgcy0+cGVuZGluZyAtPSBsZW47CisgICAgaWYgKHMtPnBlbmRpbmcgPT0gMCkgeworICAgICAgICBzLT5wZW5kaW5nX291dCA9IHMtPnBlbmRpbmdfYnVmOworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZSAoc3RybSwgZmx1c2gpCisgICAgel9zdHJlYW1wIHN0cm07CisgICAgaW50IGZsdXNoOworeworICAgIGludCBvbGRfZmx1c2g7IC8qIHZhbHVlIG9mIGZsdXNoIHBhcmFtIGZvciBwcmV2aW91cyBkZWZsYXRlIGNhbGwgKi8KKyAgICBkZWZsYXRlX3N0YXRlICpzOworCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fAorICAgICAgICBmbHVzaCA+IFpfQkxPQ0sgfHwgZmx1c2ggPCAwKSB7CisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICB9CisgICAgcyA9IHN0cm0tPnN0YXRlOworCisgICAgaWYgKHN0cm0tPm5leHRfb3V0ID09IFpfTlVMTCB8fAorICAgICAgICAoc3RybS0+bmV4dF9pbiA9PSBaX05VTEwgJiYgc3RybS0+YXZhaWxfaW4gIT0gMCkgfHwKKyAgICAgICAgKHMtPnN0YXR1cyA9PSBGSU5JU0hfU1RBVEUgJiYgZmx1c2ggIT0gWl9GSU5JU0gpKSB7CisgICAgICAgIEVSUl9SRVRVUk4oc3RybSwgWl9TVFJFQU1fRVJST1IpOworICAgIH0KKyAgICBpZiAoc3RybS0+YXZhaWxfb3V0ID09IDApIEVSUl9SRVRVUk4oc3RybSwgWl9CVUZfRVJST1IpOworCisgICAgcy0+c3RybSA9IHN0cm07IC8qIGp1c3QgaW4gY2FzZSAqLworICAgIG9sZF9mbHVzaCA9IHMtPmxhc3RfZmx1c2g7CisgICAgcy0+bGFzdF9mbHVzaCA9IGZsdXNoOworCisgICAgLyogV3JpdGUgdGhlIGhlYWRlciAqLworICAgIGlmIChzLT5zdGF0dXMgPT0gSU5JVF9TVEFURSkgeworI2lmZGVmIEdaSVAKKyAgICAgICAgaWYgKHMtPndyYXAgPT0gMikgeworICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKKyAgICAgICAgICAgIHB1dF9ieXRlKHMsIDMxKTsKKyAgICAgICAgICAgIHB1dF9ieXRlKHMsIDEzOSk7CisgICAgICAgICAgICBwdXRfYnl0ZShzLCA4KTsKKyAgICAgICAgICAgIGlmIChzLT5nemhlYWQgPT0gWl9OVUxMKSB7CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgMCk7CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgMCk7CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgMCk7CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgMCk7CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgMCk7CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgcy0+bGV2ZWwgPT0gOSA/IDIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLT5sZXZlbCA8IDIgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0IDogMCkpOworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIE9TX0NPREUpOworICAgICAgICAgICAgICAgIHMtPnN0YXR1cyA9IEJVU1lfU1RBVEU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAocy0+Z3poZWFkLT50ZXh0ID8gMSA6IDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+Z3poZWFkLT5oY3JjID8gMiA6IDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+Z3poZWFkLT5leHRyYSA9PSBaX05VTEwgPyAwIDogNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5nemhlYWQtPm5hbWUgPT0gWl9OVUxMID8gMCA6IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+Z3poZWFkLT5jb21tZW50ID09IFpfTlVMTCA/IDAgOiAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKHMtPmd6aGVhZC0+dGltZSAmIDB4ZmYpKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHMtPmd6aGVhZC0+dGltZSA+PiA4KSAmIDB4ZmYpKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHMtPmd6aGVhZC0+dGltZSA+PiAxNikgJiAweGZmKSk7CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKChzLT5nemhlYWQtPnRpbWUgPj4gMjQpICYgMHhmZikpOworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIHMtPmxldmVsID09IDkgPyAyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+c3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy0+bGV2ZWwgPCAyID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCA6IDApKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCBzLT5nemhlYWQtPm9zICYgMHhmZik7CisgICAgICAgICAgICAgICAgaWYgKHMtPmd6aGVhZC0+ZXh0cmEgIT0gWl9OVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIHMtPmd6aGVhZC0+ZXh0cmFfbGVuICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChzLT5nemhlYWQtPmV4dHJhX2xlbiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjKQorICAgICAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBzLT5wZW5kaW5nX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wZW5kaW5nKTsKKyAgICAgICAgICAgICAgICBzLT5nemluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICBzLT5zdGF0dXMgPSBFWFRSQV9TVEFURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgdUludCBoZWFkZXIgPSAoWl9ERUZMQVRFRCArICgocy0+d19iaXRzLTgpPDw0KSkgPDwgODsKKyAgICAgICAgICAgIHVJbnQgbGV2ZWxfZmxhZ3M7CisKKyAgICAgICAgICAgIGlmIChzLT5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLT5sZXZlbCA8IDIpCisgICAgICAgICAgICAgICAgbGV2ZWxfZmxhZ3MgPSAwOworICAgICAgICAgICAgZWxzZSBpZiAocy0+bGV2ZWwgPCA2KQorICAgICAgICAgICAgICAgIGxldmVsX2ZsYWdzID0gMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHMtPmxldmVsID09IDYpCisgICAgICAgICAgICAgICAgbGV2ZWxfZmxhZ3MgPSAyOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxldmVsX2ZsYWdzID0gMzsKKyAgICAgICAgICAgIGhlYWRlciB8PSAobGV2ZWxfZmxhZ3MgPDwgNik7CisgICAgICAgICAgICBpZiAocy0+c3Ryc3RhcnQgIT0gMCkgaGVhZGVyIHw9IFBSRVNFVF9ESUNUOworICAgICAgICAgICAgaGVhZGVyICs9IDMxIC0gKGhlYWRlciAlIDMxKTsKKworICAgICAgICAgICAgcy0+c3RhdHVzID0gQlVTWV9TVEFURTsKKyAgICAgICAgICAgIHB1dFNob3J0TVNCKHMsIGhlYWRlcik7CisKKyAgICAgICAgICAgIC8qIFNhdmUgdGhlIGFkbGVyMzIgb2YgdGhlIHByZXNldCBkaWN0aW9uYXJ5OiAqLworICAgICAgICAgICAgaWYgKHMtPnN0cnN0YXJ0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBwdXRTaG9ydE1TQihzLCAodUludCkoc3RybS0+YWRsZXIgPj4gMTYpKTsKKyAgICAgICAgICAgICAgICBwdXRTaG9ydE1TQihzLCAodUludCkoc3RybS0+YWRsZXIgJiAweGZmZmYpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTsKKyAgICAgICAgfQorICAgIH0KKyNpZmRlZiBHWklQCisgICAgaWYgKHMtPnN0YXR1cyA9PSBFWFRSQV9TVEFURSkgeworICAgICAgICBpZiAocy0+Z3poZWFkLT5leHRyYSAhPSBaX05VTEwpIHsKKyAgICAgICAgICAgIHVJbnQgYmVnID0gcy0+cGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi8KKworICAgICAgICAgICAgd2hpbGUgKHMtPmd6aW5kZXggPCAocy0+Z3poZWFkLT5leHRyYV9sZW4gJiAweGZmZmYpKSB7CisgICAgICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgPT0gcy0+cGVuZGluZ19idWZfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjICYmIHMtPnBlbmRpbmcgPiBiZWcpCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBzLT5wZW5kaW5nX2J1ZiArIGJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGVuZGluZyAtIGJlZyk7CisgICAgICAgICAgICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CisgICAgICAgICAgICAgICAgICAgIGJlZyA9IHMtPnBlbmRpbmc7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5wZW5kaW5nID09IHMtPnBlbmRpbmdfYnVmX3NpemUpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgcy0+Z3poZWFkLT5leHRyYVtzLT5nemluZGV4XSk7CisgICAgICAgICAgICAgICAgcy0+Z3ppbmRleCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHMtPmd6aGVhZC0+aGNyYyAmJiBzLT5wZW5kaW5nID4gYmVnKQorICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIHMtPnBlbmRpbmdfYnVmICsgYmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGVuZGluZyAtIGJlZyk7CisgICAgICAgICAgICBpZiAocy0+Z3ppbmRleCA9PSBzLT5nemhlYWQtPmV4dHJhX2xlbikgeworICAgICAgICAgICAgICAgIHMtPmd6aW5kZXggPSAwOworICAgICAgICAgICAgICAgIHMtPnN0YXR1cyA9IE5BTUVfU1RBVEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+c3RhdHVzID0gTkFNRV9TVEFURTsKKyAgICB9CisgICAgaWYgKHMtPnN0YXR1cyA9PSBOQU1FX1NUQVRFKSB7CisgICAgICAgIGlmIChzLT5nemhlYWQtPm5hbWUgIT0gWl9OVUxMKSB7CisgICAgICAgICAgICB1SW50IGJlZyA9IHMtPnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovCisgICAgICAgICAgICBpbnQgdmFsOworCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgPT0gcy0+cGVuZGluZ19idWZfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjICYmIHMtPnBlbmRpbmcgPiBiZWcpCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBzLT5wZW5kaW5nX2J1ZiArIGJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGVuZGluZyAtIGJlZyk7CisgICAgICAgICAgICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CisgICAgICAgICAgICAgICAgICAgIGJlZyA9IHMtPnBlbmRpbmc7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5wZW5kaW5nID09IHMtPnBlbmRpbmdfYnVmX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YWwgPSBzLT5nemhlYWQtPm5hbWVbcy0+Z3ppbmRleCsrXTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCB2YWwpOworICAgICAgICAgICAgfSB3aGlsZSAodmFsICE9IDApOworICAgICAgICAgICAgaWYgKHMtPmd6aGVhZC0+aGNyYyAmJiBzLT5wZW5kaW5nID4gYmVnKQorICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIHMtPnBlbmRpbmdfYnVmICsgYmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGVuZGluZyAtIGJlZyk7CisgICAgICAgICAgICBpZiAodmFsID09IDApIHsKKyAgICAgICAgICAgICAgICBzLT5nemluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICBzLT5zdGF0dXMgPSBDT01NRU5UX1NUQVRFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMtPnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7CisgICAgfQorICAgIGlmIChzLT5zdGF0dXMgPT0gQ09NTUVOVF9TVEFURSkgeworICAgICAgICBpZiAocy0+Z3poZWFkLT5jb21tZW50ICE9IFpfTlVMTCkgeworICAgICAgICAgICAgdUludCBiZWcgPSBzLT5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqLworICAgICAgICAgICAgaW50IHZhbDsKKworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGlmIChzLT5wZW5kaW5nID09IHMtPnBlbmRpbmdfYnVmX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmd6aGVhZC0+aGNyYyAmJiBzLT5wZW5kaW5nID4gYmVnKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBjcmMzMihzdHJtLT5hZGxlciwgcy0+cGVuZGluZ19idWYgKyBiZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBlbmRpbmcgLSBiZWcpOworICAgICAgICAgICAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOworICAgICAgICAgICAgICAgICAgICBiZWcgPSBzLT5wZW5kaW5nOworICAgICAgICAgICAgICAgICAgICBpZiAocy0+cGVuZGluZyA9PSBzLT5wZW5kaW5nX2J1Zl9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFsID0gcy0+Z3poZWFkLT5jb21tZW50W3MtPmd6aW5kZXgrK107CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgdmFsKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKHZhbCAhPSAwKTsKKyAgICAgICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMgJiYgcy0+cGVuZGluZyA+IGJlZykKKyAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBzLT5wZW5kaW5nX2J1ZiArIGJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBlbmRpbmcgLSBiZWcpOworICAgICAgICAgICAgaWYgKHZhbCA9PSAwKQorICAgICAgICAgICAgICAgIHMtPnN0YXR1cyA9IEhDUkNfU1RBVEU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+c3RhdHVzID0gSENSQ19TVEFURTsKKyAgICB9CisgICAgaWYgKHMtPnN0YXR1cyA9PSBIQ1JDX1NUQVRFKSB7CisgICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMpIHsKKyAgICAgICAgICAgIGlmIChzLT5wZW5kaW5nICsgMiA+IHMtPnBlbmRpbmdfYnVmX3NpemUpCisgICAgICAgICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKKyAgICAgICAgICAgIGlmIChzLT5wZW5kaW5nICsgMiA8PSBzLT5wZW5kaW5nX2J1Zl9zaXplKSB7CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKHN0cm0tPmFkbGVyICYgMHhmZikpOworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgoc3RybS0+YWRsZXIgPj4gOCkgJiAweGZmKSk7CisgICAgICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKKyAgICAgICAgICAgICAgICBzLT5zdGF0dXMgPSBCVVNZX1NUQVRFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMtPnN0YXR1cyA9IEJVU1lfU1RBVEU7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlICovCisgICAgaWYgKHMtPnBlbmRpbmcgIT0gMCkgeworICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOworICAgICAgICBpZiAoc3RybS0+YXZhaWxfb3V0ID09IDApIHsKKyAgICAgICAgICAgIC8qIFNpbmNlIGF2YWlsX291dCBpcyAwLCBkZWZsYXRlIHdpbGwgYmUgY2FsbGVkIGFnYWluIHdpdGgKKyAgICAgICAgICAgICAqIG1vcmUgb3V0cHV0IHNwYWNlLCBidXQgcG9zc2libHkgd2l0aCBib3RoIHBlbmRpbmcgYW5kCisgICAgICAgICAgICAgKiBhdmFpbF9pbiBlcXVhbCB0byB6ZXJvLiBUaGVyZSB3b24ndCBiZSBhbnl0aGluZyB0byBkbywKKyAgICAgICAgICAgICAqIGJ1dCB0aGlzIGlzIG5vdCBhbiBlcnJvciBzaXR1YXRpb24gc28gbWFrZSBzdXJlIHdlCisgICAgICAgICAgICAgKiByZXR1cm4gT0sgaW5zdGVhZCBvZiBCVUZfRVJST1IgYXQgbmV4dCBjYWxsIG9mIGRlZmxhdGU6CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHMtPmxhc3RfZmx1c2ggPSAtMTsKKyAgICAgICAgICAgIHJldHVybiBaX09LOworICAgICAgICB9CisKKyAgICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGRvIGFuZCBhdm9pZCBkdXBsaWNhdGUgY29uc2VjdXRpdmUKKyAgICAgKiBmbHVzaGVzLiBGb3IgcmVwZWF0ZWQgYW5kIHVzZWxlc3MgY2FsbHMgd2l0aCBaX0ZJTklTSCwgd2Uga2VlcAorICAgICAqIHJldHVybmluZyBaX1NUUkVBTV9FTkQgaW5zdGVhZCBvZiBaX0JVRl9FUlJPUi4KKyAgICAgKi8KKyAgICB9IGVsc2UgaWYgKHN0cm0tPmF2YWlsX2luID09IDAgJiYgUkFOSyhmbHVzaCkgPD0gUkFOSyhvbGRfZmx1c2gpICYmCisgICAgICAgICAgICAgICBmbHVzaCAhPSBaX0ZJTklTSCkgeworICAgICAgICBFUlJfUkVUVVJOKHN0cm0sIFpfQlVGX0VSUk9SKTsKKyAgICB9CisKKyAgICAvKiBVc2VyIG11c3Qgbm90IHByb3ZpZGUgbW9yZSBpbnB1dCBhZnRlciB0aGUgZmlyc3QgRklOSVNIOiAqLworICAgIGlmIChzLT5zdGF0dXMgPT0gRklOSVNIX1NUQVRFICYmIHN0cm0tPmF2YWlsX2luICE9IDApIHsKKyAgICAgICAgRVJSX1JFVFVSTihzdHJtLCBaX0JVRl9FUlJPUik7CisgICAgfQorCisgICAgLyogU3RhcnQgYSBuZXcgYmxvY2sgb3IgY29udGludWUgdGhlIGN1cnJlbnQgb25lLgorICAgICAqLworICAgIGlmIChzdHJtLT5hdmFpbF9pbiAhPSAwIHx8IHMtPmxvb2thaGVhZCAhPSAwIHx8CisgICAgICAgIChmbHVzaCAhPSBaX05PX0ZMVVNIICYmIHMtPnN0YXR1cyAhPSBGSU5JU0hfU1RBVEUpKSB7CisgICAgICAgIGJsb2NrX3N0YXRlIGJzdGF0ZTsKKworICAgICAgICBic3RhdGUgPSBzLT5zdHJhdGVneSA9PSBaX0hVRkZNQU5fT05MWSA/IGRlZmxhdGVfaHVmZihzLCBmbHVzaCkgOgorICAgICAgICAgICAgICAgICAgICAocy0+c3RyYXRlZ3kgPT0gWl9STEUgPyBkZWZsYXRlX3JsZShzLCBmbHVzaCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgKCooY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0uZnVuYykpKHMsIGZsdXNoKSk7CisKKyAgICAgICAgaWYgKGJzdGF0ZSA9PSBmaW5pc2hfc3RhcnRlZCB8fCBic3RhdGUgPT0gZmluaXNoX2RvbmUpIHsKKyAgICAgICAgICAgIHMtPnN0YXR1cyA9IEZJTklTSF9TVEFURTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnN0YXRlID09IG5lZWRfbW9yZSB8fCBic3RhdGUgPT0gZmluaXNoX3N0YXJ0ZWQpIHsKKyAgICAgICAgICAgIGlmIChzdHJtLT5hdmFpbF9vdXQgPT0gMCkgeworICAgICAgICAgICAgICAgIHMtPmxhc3RfZmx1c2ggPSAtMTsgLyogYXZvaWQgQlVGX0VSUk9SIG5leHQgY2FsbCwgc2VlIGFib3ZlICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gWl9PSzsKKyAgICAgICAgICAgIC8qIElmIGZsdXNoICE9IFpfTk9fRkxVU0ggJiYgYXZhaWxfb3V0ID09IDAsIHRoZSBuZXh0IGNhbGwKKyAgICAgICAgICAgICAqIG9mIGRlZmxhdGUgc2hvdWxkIHVzZSB0aGUgc2FtZSBmbHVzaCBwYXJhbWV0ZXIgdG8gbWFrZSBzdXJlCisgICAgICAgICAgICAgKiB0aGF0IHRoZSBmbHVzaCBpcyBjb21wbGV0ZS4gU28gd2UgZG9uJ3QgaGF2ZSB0byBvdXRwdXQgYW4KKyAgICAgICAgICAgICAqIGVtcHR5IGJsb2NrIGhlcmUsIHRoaXMgd2lsbCBiZSBkb25lIGF0IG5leHQgY2FsbC4gVGhpcyBhbHNvCisgICAgICAgICAgICAgKiBlbnN1cmVzIHRoYXQgZm9yIGEgdmVyeSBzbWFsbCBvdXRwdXQgYnVmZmVyLCB3ZSBlbWl0IGF0IG1vc3QKKyAgICAgICAgICAgICAqIG9uZSBlbXB0eSBibG9jay4KKyAgICAgICAgICAgICAqLworICAgICAgICB9CisgICAgICAgIGlmIChic3RhdGUgPT0gYmxvY2tfZG9uZSkgeworICAgICAgICAgICAgaWYgKGZsdXNoID09IFpfUEFSVElBTF9GTFVTSCkgeworICAgICAgICAgICAgICAgIF90cl9hbGlnbihzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmx1c2ggIT0gWl9CTE9DSykgeyAvKiBGVUxMX0ZMVVNIIG9yIFNZTkNfRkxVU0ggKi8KKyAgICAgICAgICAgICAgICBfdHJfc3RvcmVkX2Jsb2NrKHMsIChjaGFyKikwLCAwTCwgMCk7CisgICAgICAgICAgICAgICAgLyogRm9yIGEgZnVsbCBmbHVzaCwgdGhpcyBlbXB0eSBibG9jayB3aWxsIGJlIHJlY29nbml6ZWQKKyAgICAgICAgICAgICAgICAgKiBhcyBhIHNwZWNpYWwgbWFya2VyIGJ5IGluZmxhdGVfc3luYygpLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChmbHVzaCA9PSBaX0ZVTExfRkxVU0gpIHsKKyAgICAgICAgICAgICAgICAgICAgQ0xFQVJfSEFTSChzKTsgICAgICAgICAgICAgLyogZm9yZ2V0IGhpc3RvcnkgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdHJzdGFydCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19zdGFydCA9IDBMOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+aW5zZXJ0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CisgICAgICAgICAgICBpZiAoc3RybS0+YXZhaWxfb3V0ID09IDApIHsKKyAgICAgICAgICAgICAgcy0+bGFzdF9mbHVzaCA9IC0xOyAvKiBhdm9pZCBCVUZfRVJST1IgYXQgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi8KKyAgICAgICAgICAgICAgcmV0dXJuIFpfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQXNzZXJ0KHN0cm0tPmF2YWlsX291dCA+IDAsICJidWcyIik7CisKKyAgICBpZiAoZmx1c2ggIT0gWl9GSU5JU0gpIHJldHVybiBaX09LOworICAgIGlmIChzLT53cmFwIDw9IDApIHJldHVybiBaX1NUUkVBTV9FTkQ7CisKKyAgICAvKiBXcml0ZSB0aGUgdHJhaWxlciAqLworI2lmZGVmIEdaSVAKKyAgICBpZiAocy0+d3JhcCA9PSAyKSB7CisgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKShzdHJtLT5hZGxlciAmIDB4ZmYpKTsKKyAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKChzdHJtLT5hZGxlciA+PiA4KSAmIDB4ZmYpKTsKKyAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKChzdHJtLT5hZGxlciA+PiAxNikgJiAweGZmKSk7CisgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgoc3RybS0+YWRsZXIgPj4gMjQpICYgMHhmZikpOworICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoc3RybS0+dG90YWxfaW4gJiAweGZmKSk7CisgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgoc3RybS0+dG90YWxfaW4gPj4gOCkgJiAweGZmKSk7CisgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgoc3RybS0+dG90YWxfaW4gPj4gMTYpICYgMHhmZikpOworICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHN0cm0tPnRvdGFsX2luID4+IDI0KSAmIDB4ZmYpKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgICBwdXRTaG9ydE1TQihzLCAodUludCkoc3RybS0+YWRsZXIgPj4gMTYpKTsKKyAgICAgICAgcHV0U2hvcnRNU0IocywgKHVJbnQpKHN0cm0tPmFkbGVyICYgMHhmZmZmKSk7CisgICAgfQorICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CisgICAgLyogSWYgYXZhaWxfb3V0IGlzIHplcm8sIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGNhbGwgZGVmbGF0ZSBhZ2FpbgorICAgICAqIHRvIGZsdXNoIHRoZSByZXN0LgorICAgICAqLworICAgIGlmIChzLT53cmFwID4gMCkgcy0+d3JhcCA9IC1zLT53cmFwOyAvKiB3cml0ZSB0aGUgdHJhaWxlciBvbmx5IG9uY2UhICovCisgICAgcmV0dXJuIHMtPnBlbmRpbmcgIT0gMCA/IFpfT0sgOiBaX1NUUkVBTV9FTkQ7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBaRVhQT1JUIGRlZmxhdGVFbmQgKHN0cm0pCisgICAgel9zdHJlYW1wIHN0cm07Cit7CisgICAgaW50IHN0YXR1czsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKworICAgIHN0YXR1cyA9IHN0cm0tPnN0YXRlLT5zdGF0dXM7CisgICAgaWYgKHN0YXR1cyAhPSBJTklUX1NUQVRFICYmCisgICAgICAgIHN0YXR1cyAhPSBFWFRSQV9TVEFURSAmJgorICAgICAgICBzdGF0dXMgIT0gTkFNRV9TVEFURSAmJgorICAgICAgICBzdGF0dXMgIT0gQ09NTUVOVF9TVEFURSAmJgorICAgICAgICBzdGF0dXMgIT0gSENSQ19TVEFURSAmJgorICAgICAgICBzdGF0dXMgIT0gQlVTWV9TVEFURSAmJgorICAgICAgICBzdGF0dXMgIT0gRklOSVNIX1NUQVRFKSB7CisgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgfQorCisgICAgLyogRGVhbGxvY2F0ZSBpbiByZXZlcnNlIG9yZGVyIG9mIGFsbG9jYXRpb25zOiAqLworICAgIFRSWV9GUkVFKHN0cm0sIHN0cm0tPnN0YXRlLT5wZW5kaW5nX2J1Zik7CisgICAgVFJZX0ZSRUUoc3RybSwgc3RybS0+c3RhdGUtPmhlYWQpOworICAgIFRSWV9GUkVFKHN0cm0sIHN0cm0tPnN0YXRlLT5wcmV2KTsKKyAgICBUUllfRlJFRShzdHJtLCBzdHJtLT5zdGF0ZS0+d2luZG93KTsKKworICAgIFpGUkVFKHN0cm0sIHN0cm0tPnN0YXRlKTsKKyAgICBzdHJtLT5zdGF0ZSA9IFpfTlVMTDsKKworICAgIHJldHVybiBzdGF0dXMgPT0gQlVTWV9TVEFURSA/IFpfREFUQV9FUlJPUiA6IFpfT0s7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHkgdGhlIHNvdXJjZSBzdGF0ZSB0byB0aGUgZGVzdGluYXRpb24gc3RhdGUuCisgKiBUbyBzaW1wbGlmeSB0aGUgc291cmNlLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIDE2LWJpdCBNU0RPUyAod2hpY2gKKyAqIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggbWVtb3J5IGFueXdheSB0byBkdXBsaWNhdGUgY29tcHJlc3Npb24gc3RhdGVzKS4KKyAqLworaW50IFpFWFBPUlQgZGVmbGF0ZUNvcHkgKGRlc3QsIHNvdXJjZSkKKyAgICB6X3N0cmVhbXAgZGVzdDsKKyAgICB6X3N0cmVhbXAgc291cmNlOworeworI2lmZGVmIE1BWFNFR182NEsKKyAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisjZWxzZQorICAgIGRlZmxhdGVfc3RhdGUgKmRzOworICAgIGRlZmxhdGVfc3RhdGUgKnNzOworICAgIHVzaGYgKm92ZXJsYXk7CisKKworICAgIGlmIChzb3VyY2UgPT0gWl9OVUxMIHx8IGRlc3QgPT0gWl9OVUxMIHx8IHNvdXJjZS0+c3RhdGUgPT0gWl9OVUxMKSB7CisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICB9CisKKyAgICBzcyA9IHNvdXJjZS0+c3RhdGU7CisKKyAgICB6bWVtY3B5KCh2b2lkcGYpZGVzdCwgKHZvaWRwZilzb3VyY2UsIHNpemVvZih6X3N0cmVhbSkpOworCisgICAgZHMgPSAoZGVmbGF0ZV9zdGF0ZSAqKSBaQUxMT0MoZGVzdCwgMSwgc2l6ZW9mKGRlZmxhdGVfc3RhdGUpKTsKKyAgICBpZiAoZHMgPT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgZGVzdC0+c3RhdGUgPSAoc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqKSBkczsKKyAgICB6bWVtY3B5KCh2b2lkcGYpZHMsICh2b2lkcGYpc3MsIHNpemVvZihkZWZsYXRlX3N0YXRlKSk7CisgICAgZHMtPnN0cm0gPSBkZXN0OworCisgICAgZHMtPndpbmRvdyA9IChCeXRlZiAqKSBaQUxMT0MoZGVzdCwgZHMtPndfc2l6ZSwgMipzaXplb2YoQnl0ZSkpOworICAgIGRzLT5wcmV2ICAgPSAoUG9zZiAqKSAgWkFMTE9DKGRlc3QsIGRzLT53X3NpemUsIHNpemVvZihQb3MpKTsKKyAgICBkcy0+aGVhZCAgID0gKFBvc2YgKikgIFpBTExPQyhkZXN0LCBkcy0+aGFzaF9zaXplLCBzaXplb2YoUG9zKSk7CisgICAgb3ZlcmxheSA9ICh1c2hmICopIFpBTExPQyhkZXN0LCBkcy0+bGl0X2J1ZnNpemUsIHNpemVvZih1c2gpKzIpOworICAgIGRzLT5wZW5kaW5nX2J1ZiA9ICh1Y2hmICopIG92ZXJsYXk7CisKKyAgICBpZiAoZHMtPndpbmRvdyA9PSBaX05VTEwgfHwgZHMtPnByZXYgPT0gWl9OVUxMIHx8IGRzLT5oZWFkID09IFpfTlVMTCB8fAorICAgICAgICBkcy0+cGVuZGluZ19idWYgPT0gWl9OVUxMKSB7CisgICAgICAgIGRlZmxhdGVFbmQgKGRlc3QpOworICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgfQorICAgIC8qIGZvbGxvd2luZyB6bWVtY3B5IGRvIG5vdCB3b3JrIGZvciAxNi1iaXQgTVNET1MgKi8KKyAgICB6bWVtY3B5KGRzLT53aW5kb3csIHNzLT53aW5kb3csIGRzLT53X3NpemUgKiAyICogc2l6ZW9mKEJ5dGUpKTsKKyAgICB6bWVtY3B5KCh2b2lkcGYpZHMtPnByZXYsICh2b2lkcGYpc3MtPnByZXYsIGRzLT53X3NpemUgKiBzaXplb2YoUG9zKSk7CisgICAgem1lbWNweSgodm9pZHBmKWRzLT5oZWFkLCAodm9pZHBmKXNzLT5oZWFkLCBkcy0+aGFzaF9zaXplICogc2l6ZW9mKFBvcykpOworICAgIHptZW1jcHkoZHMtPnBlbmRpbmdfYnVmLCBzcy0+cGVuZGluZ19idWYsICh1SW50KWRzLT5wZW5kaW5nX2J1Zl9zaXplKTsKKworICAgIGRzLT5wZW5kaW5nX291dCA9IGRzLT5wZW5kaW5nX2J1ZiArIChzcy0+cGVuZGluZ19vdXQgLSBzcy0+cGVuZGluZ19idWYpOworICAgIGRzLT5kX2J1ZiA9IG92ZXJsYXkgKyBkcy0+bGl0X2J1ZnNpemUvc2l6ZW9mKHVzaCk7CisgICAgZHMtPmxfYnVmID0gZHMtPnBlbmRpbmdfYnVmICsgKDErc2l6ZW9mKHVzaCkpKmRzLT5saXRfYnVmc2l6ZTsKKworICAgIGRzLT5sX2Rlc2MuZHluX3RyZWUgPSBkcy0+ZHluX2x0cmVlOworICAgIGRzLT5kX2Rlc2MuZHluX3RyZWUgPSBkcy0+ZHluX2R0cmVlOworICAgIGRzLT5ibF9kZXNjLmR5bl90cmVlID0gZHMtPmJsX3RyZWU7CisKKyAgICByZXR1cm4gWl9PSzsKKyNlbmRpZiAvKiBNQVhTRUdfNjRLICovCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVhZCBhIG5ldyBidWZmZXIgZnJvbSB0aGUgY3VycmVudCBpbnB1dCBzdHJlYW0sIHVwZGF0ZSB0aGUgYWRsZXIzMgorICogYW5kIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkLiAgQWxsIGRlZmxhdGUoKSBpbnB1dCBnb2VzIHRocm91Z2gKKyAqIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0IHRvIGF2b2lkCisgKiBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+bmV4dF9pbiBidWZmZXIgYW5kIGNvcHlpbmcgZnJvbSBpdC4KKyAqIChTZWUgYWxzbyBmbHVzaF9wZW5kaW5nKCkpLgorICovCitsb2NhbCBpbnQgcmVhZF9idWYoc3RybSwgYnVmLCBzaXplKQorICAgIHpfc3RyZWFtcCBzdHJtOworICAgIEJ5dGVmICpidWY7CisgICAgdW5zaWduZWQgc2l6ZTsKK3sKKyAgICB1bnNpZ25lZCBsZW4gPSBzdHJtLT5hdmFpbF9pbjsKKworICAgIGlmIChsZW4gPiBzaXplKSBsZW4gPSBzaXplOworICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuIDA7CisKKyAgICBzdHJtLT5hdmFpbF9pbiAgLT0gbGVuOworCisgICAgem1lbWNweShidWYsIHN0cm0tPm5leHRfaW4sIGxlbik7CisgICAgaWYgKHN0cm0tPnN0YXRlLT53cmFwID09IDEpIHsKKyAgICAgICAgc3RybS0+YWRsZXIgPSBhZGxlcjMyKHN0cm0tPmFkbGVyLCBidWYsIGxlbik7CisgICAgfQorI2lmZGVmIEdaSVAKKyAgICBlbHNlIGlmIChzdHJtLT5zdGF0ZS0+d3JhcCA9PSAyKSB7CisgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIGJ1ZiwgbGVuKTsKKyAgICB9CisjZW5kaWYKKyAgICBzdHJtLT5uZXh0X2luICArPSBsZW47CisgICAgc3RybS0+dG90YWxfaW4gKz0gbGVuOworCisgICAgcmV0dXJuIChpbnQpbGVuOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgdGhlICJsb25nZXN0IG1hdGNoIiByb3V0aW5lcyBmb3IgYSBuZXcgemxpYiBzdHJlYW0KKyAqLworbG9jYWwgdm9pZCBsbV9pbml0IChzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgcy0+d2luZG93X3NpemUgPSAodWxnKTJMKnMtPndfc2l6ZTsKKworICAgIENMRUFSX0hBU0gocyk7CisKKyAgICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzOgorICAgICAqLworICAgIHMtPm1heF9sYXp5X21hdGNoICAgPSBjb25maWd1cmF0aW9uX3RhYmxlW3MtPmxldmVsXS5tYXhfbGF6eTsKKyAgICBzLT5nb29kX21hdGNoICAgICAgID0gY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0uZ29vZF9sZW5ndGg7CisgICAgcy0+bmljZV9tYXRjaCAgICAgICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy0+bGV2ZWxdLm5pY2VfbGVuZ3RoOworICAgIHMtPm1heF9jaGFpbl9sZW5ndGggPSBjb25maWd1cmF0aW9uX3RhYmxlW3MtPmxldmVsXS5tYXhfY2hhaW47CisKKyAgICBzLT5zdHJzdGFydCA9IDA7CisgICAgcy0+YmxvY2tfc3RhcnQgPSAwTDsKKyAgICBzLT5sb29rYWhlYWQgPSAwOworICAgIHMtPmluc2VydCA9IDA7CisgICAgcy0+bWF0Y2hfbGVuZ3RoID0gcy0+cHJldl9sZW5ndGggPSBNSU5fTUFUQ0gtMTsKKyAgICBzLT5tYXRjaF9hdmFpbGFibGUgPSAwOworICAgIHMtPmluc19oID0gMDsKKyNpZm5kZWYgRkFTVEVTVAorI2lmZGVmIEFTTVYKKyAgICBtYXRjaF9pbml0KCk7IC8qIGluaXRpYWxpemUgdGhlIGFzbSBjb2RlICovCisjZW5kaWYKKyNlbmRpZgorfQorCisjaWZuZGVmIEZBU1RFU1QKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IG1hdGNoX3N0YXJ0IHRvIHRoZSBsb25nZXN0IG1hdGNoIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBzdHJpbmcgYW5kCisgKiByZXR1cm4gaXRzIGxlbmd0aC4gTWF0Y2hlcyBzaG9ydGVyIG9yIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFyZSBkaXNjYXJkZWQsCisgKiBpbiB3aGljaCBjYXNlIHRoZSByZXN1bHQgaXMgZXF1YWwgdG8gcHJldl9sZW5ndGggYW5kIG1hdGNoX3N0YXJ0IGlzCisgKiBnYXJiYWdlLgorICogSU4gYXNzZXJ0aW9uczogY3VyX21hdGNoIGlzIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluIGZvciB0aGUgY3VycmVudAorICogICBzdHJpbmcgKHN0cnN0YXJ0KSBhbmQgaXRzIGRpc3RhbmNlIGlzIDw9IE1BWF9ESVNULCBhbmQgcHJldl9sZW5ndGggPj0gMQorICogT1VUIGFzc2VydGlvbjogdGhlIG1hdGNoIGxlbmd0aCBpcyBub3QgZ3JlYXRlciB0aGFuIHMtPmxvb2thaGVhZC4KKyAqLworI2lmbmRlZiBBU01WCisvKiBGb3IgODB4ODYgYW5kIDY4MHgwLCBhbiBvcHRpbWl6ZWQgdmVyc2lvbiB3aWxsIGJlIHByb3ZpZGVkIGluIG1hdGNoLmFzbSBvcgorICogbWF0Y2guUy4gVGhlIGNvZGUgd2lsbCBiZSBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudC4KKyAqLworbG9jYWwgdUludCBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIElQb3MgY3VyX21hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBtYXRjaCAqLworeworICAgIHVuc2lnbmVkIGNoYWluX2xlbmd0aCA9IHMtPm1heF9jaGFpbl9sZW5ndGg7LyogbWF4IGhhc2ggY2hhaW4gbGVuZ3RoICovCisgICAgcmVnaXN0ZXIgQnl0ZWYgKnNjYW4gPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydDsgLyogY3VycmVudCBzdHJpbmcgKi8KKyAgICByZWdpc3RlciBCeXRlZiAqbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaGVkIHN0cmluZyAqLworICAgIHJlZ2lzdGVyIGludCBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgbWF0Y2ggKi8KKyAgICBpbnQgYmVzdF9sZW4gPSBzLT5wcmV2X2xlbmd0aDsgICAgICAgICAgICAgIC8qIGJlc3QgbWF0Y2ggbGVuZ3RoIHNvIGZhciAqLworICAgIGludCBuaWNlX21hdGNoID0gcy0+bmljZV9tYXRjaDsgICAgICAgICAgICAgLyogc3RvcCBpZiBtYXRjaCBsb25nIGVub3VnaCAqLworICAgIElQb3MgbGltaXQgPSBzLT5zdHJzdGFydCA+IChJUG9zKU1BWF9ESVNUKHMpID8KKyAgICAgICAgcy0+c3Ryc3RhcnQgLSAoSVBvcylNQVhfRElTVChzKSA6IE5JTDsKKyAgICAvKiBTdG9wIHdoZW4gY3VyX21hdGNoIGJlY29tZXMgPD0gbGltaXQuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLAorICAgICAqIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmcgb2Ygd2luZG93IGluZGV4IDAuCisgICAgICovCisgICAgUG9zZiAqcHJldiA9IHMtPnByZXY7CisgICAgdUludCB3bWFzayA9IHMtPndfbWFzazsKKworI2lmZGVmIFVOQUxJR05FRF9PSworICAgIC8qIENvbXBhcmUgdHdvIGJ5dGVzIGF0IGEgdGltZS4gTm90ZTogdGhpcyBpcyBub3QgYWx3YXlzIGJlbmVmaWNpYWwuCisgICAgICogVHJ5IHdpdGggYW5kIHdpdGhvdXQgLURVTkFMSUdORURfT0sgdG8gY2hlY2suCisgICAgICovCisgICAgcmVnaXN0ZXIgQnl0ZWYgKnN0cmVuZCA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0ICsgTUFYX01BVENIIC0gMTsKKyAgICByZWdpc3RlciB1c2ggc2Nhbl9zdGFydCA9ICoodXNoZiopc2NhbjsKKyAgICByZWdpc3RlciB1c2ggc2Nhbl9lbmQgICA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7CisjZWxzZQorICAgIHJlZ2lzdGVyIEJ5dGVmICpzdHJlbmQgPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCArIE1BWF9NQVRDSDsKKyAgICByZWdpc3RlciBCeXRlIHNjYW5fZW5kMSAgPSBzY2FuW2Jlc3RfbGVuLTFdOworICAgIHJlZ2lzdGVyIEJ5dGUgc2Nhbl9lbmQgICA9IHNjYW5bYmVzdF9sZW5dOworI2VuZGlmCisKKyAgICAvKiBUaGUgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIEhBU0hfQklUUyA+PSA4IGFuZCBNQVhfTUFUQ0gtMiBtdWx0aXBsZSBvZiAxNi4KKyAgICAgKiBJdCBpcyBlYXN5IHRvIGdldCByaWQgb2YgdGhpcyBvcHRpbWl6YXRpb24gaWYgbmVjZXNzYXJ5LgorICAgICAqLworICAgIEFzc2VydChzLT5oYXNoX2JpdHMgPj0gOCAmJiBNQVhfTUFUQ0ggPT0gMjU4LCAiQ29kZSB0b28gY2xldmVyIik7CisKKyAgICAvKiBEbyBub3Qgd2FzdGUgdG9vIG11Y2ggdGltZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBnb29kIG1hdGNoOiAqLworICAgIGlmIChzLT5wcmV2X2xlbmd0aCA+PSBzLT5nb29kX21hdGNoKSB7CisgICAgICAgIGNoYWluX2xlbmd0aCA+Pj0gMjsKKyAgICB9CisgICAgLyogRG8gbm90IGxvb2sgZm9yIG1hdGNoZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGlucHV0LiBUaGlzIGlzIG5lY2Vzc2FyeQorICAgICAqIHRvIG1ha2UgZGVmbGF0ZSBkZXRlcm1pbmlzdGljLgorICAgICAqLworICAgIGlmICgodUludCluaWNlX21hdGNoID4gcy0+bG9va2FoZWFkKSBuaWNlX21hdGNoID0gcy0+bG9va2FoZWFkOworCisgICAgQXNzZXJ0KCh1bGcpcy0+c3Ryc3RhcnQgPD0gcy0+d2luZG93X3NpemUtTUlOX0xPT0tBSEVBRCwgIm5lZWQgbG9va2FoZWFkIik7CisKKyAgICBkbyB7CisgICAgICAgIEFzc2VydChjdXJfbWF0Y2ggPCBzLT5zdHJzdGFydCwgIm5vIGZ1dHVyZSIpOworICAgICAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsKKworICAgICAgICAvKiBTa2lwIHRvIG5leHQgbWF0Y2ggaWYgdGhlIG1hdGNoIGxlbmd0aCBjYW5ub3QgaW5jcmVhc2UKKyAgICAgICAgICogb3IgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBsZXNzIHRoYW4gMi4gIE5vdGUgdGhhdCB0aGUgY2hlY2tzIGJlbG93CisgICAgICAgICAqIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgb2NjdXIgb2NjYXNpb25hbGx5IGZvciBwZXJmb3JtYW5jZQorICAgICAgICAgKiByZWFzb25zLiAgVGhlcmVmb3JlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdpbGwgYmUgYWNjZXNzZWQsIGFuZAorICAgICAgICAgKiBjb25kaXRpb25hbCBqdW1wcyB3aWxsIGJlIG1hZGUgdGhhdCBkZXBlbmQgb24gdGhvc2UgdmFsdWVzLgorICAgICAgICAgKiBIb3dldmVyIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIGxpbWl0ZWQgdG8gdGhlIGxvb2thaGVhZCwgc28KKyAgICAgICAgICogdGhlIG91dHB1dCBvZiBkZWZsYXRlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZXMuCisgICAgICAgICAqLworI2lmIChkZWZpbmVkKFVOQUxJR05FRF9PSykgJiYgTUFYX01BVENIID09IDI1OCkKKyAgICAgICAgLyogVGhpcyBjb2RlIGFzc3VtZXMgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSA9PSAyLiBEbyBub3QgdXNlCisgICAgICAgICAqIFVOQUxJR05FRF9PSyBpZiB5b3VyIGNvbXBpbGVyIHVzZXMgYSBkaWZmZXJlbnQgc2l6ZS4KKyAgICAgICAgICovCisgICAgICAgIGlmICgqKHVzaGYqKShtYXRjaCtiZXN0X2xlbi0xKSAhPSBzY2FuX2VuZCB8fAorICAgICAgICAgICAgKih1c2hmKiltYXRjaCAhPSBzY2FuX3N0YXJ0KSBjb250aW51ZTsKKworICAgICAgICAvKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvbXBhcmUgc2NhblsyXSBhbmQgbWF0Y2hbMl0gc2luY2UgdGhleSBhcmUKKyAgICAgICAgICogYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0IHRoZSBoYXNoIGtleXMKKyAgICAgICAgICogYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LiBDb21wYXJlIDIgYnl0ZXMgYXQgYSB0aW1lIGF0CisgICAgICAgICAqIHN0cnN0YXJ0KzMsICs1LCAuLi4gdXAgdG8gc3Ryc3RhcnQrMjU3LiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50CisgICAgICAgICAqIGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDR0aCBjb21wYXJpc29uOyB0aGUgMTI4dGggY2hlY2sgd2lsbCBiZSBtYWRlCisgICAgICAgICAqIGF0IHN0cnN0YXJ0KzI1Ny4gSWYgTUFYX01BVENILTIgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCwgaXQgaXMKKyAgICAgICAgICogbmVjZXNzYXJ5IHRvIHB1dCBtb3JlIGd1YXJkIGJ5dGVzIGF0IHRoZSBlbmQgb2YgdGhlIHdpbmRvdywgb3IKKyAgICAgICAgICogdG8gY2hlY2sgbW9yZSBvZnRlbiBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZC4KKyAgICAgICAgICovCisgICAgICAgIEFzc2VydChzY2FuWzJdID09IG1hdGNoWzJdLCAic2NhblsyXT8iKTsKKyAgICAgICAgc2NhbisrLCBtYXRjaCsrOworICAgICAgICBkbyB7CisgICAgICAgIH0gd2hpbGUgKCoodXNoZiopKHNjYW4rPTIpID09ICoodXNoZiopKG1hdGNoKz0yKSAmJgorICAgICAgICAgICAgICAgICAqKHVzaGYqKShzY2FuKz0yKSA9PSAqKHVzaGYqKShtYXRjaCs9MikgJiYKKyAgICAgICAgICAgICAgICAgKih1c2hmKikoc2Nhbis9MikgPT0gKih1c2hmKikobWF0Y2grPTIpICYmCisgICAgICAgICAgICAgICAgICoodXNoZiopKHNjYW4rPTIpID09ICoodXNoZiopKG1hdGNoKz0yKSAmJgorICAgICAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKKyAgICAgICAgLyogVGhlIGZ1bm55ICJkbyB7fSIgZ2VuZXJhdGVzIGJldHRlciBjb2RlIG9uIG1vc3QgY29tcGlsZXJzICovCisKKyAgICAgICAgLyogSGVyZSwgc2NhbiA8PSB3aW5kb3crc3Ryc3RhcnQrMjU3ICovCisgICAgICAgIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCAid2lsZCBzY2FuIik7CisgICAgICAgIGlmICgqc2NhbiA9PSAqbWF0Y2gpIHNjYW4rKzsKKworICAgICAgICBsZW4gPSAoTUFYX01BVENIIC0gMSkgLSAoaW50KShzdHJlbmQtc2Nhbik7CisgICAgICAgIHNjYW4gPSBzdHJlbmQgLSAoTUFYX01BVENILTEpOworCisjZWxzZSAvKiBVTkFMSUdORURfT0sgKi8KKworICAgICAgICBpZiAobWF0Y2hbYmVzdF9sZW5dICAgIT0gc2Nhbl9lbmQgIHx8CisgICAgICAgICAgICBtYXRjaFtiZXN0X2xlbi0xXSAhPSBzY2FuX2VuZDEgfHwKKyAgICAgICAgICAgICptYXRjaCAgICAgICAgICAgICE9ICpzY2FuICAgICB8fAorICAgICAgICAgICAgKisrbWF0Y2ggICAgICAgICAgIT0gc2NhblsxXSkgICAgICBjb250aW51ZTsKKworICAgICAgICAvKiBUaGUgY2hlY2sgYXQgYmVzdF9sZW4tMSBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIGl0IHdpbGwgYmUgbWFkZQorICAgICAgICAgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKQorICAgICAgICAgKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvbXBhcmUgc2NhblsyXSBhbmQgbWF0Y2hbMl0gc2luY2UgdGhleQorICAgICAgICAgKiBhcmUgYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0CisgICAgICAgICAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LgorICAgICAgICAgKi8KKyAgICAgICAgc2NhbiArPSAyLCBtYXRjaCsrOworICAgICAgICBBc3NlcnQoKnNjYW4gPT0gKm1hdGNoLCAibWF0Y2hbMl0/Iik7CisKKyAgICAgICAgLyogV2UgY2hlY2sgZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBldmVyeSA4dGggY29tcGFyaXNvbjsKKyAgICAgICAgICogdGhlIDI1NnRoIGNoZWNrIHdpbGwgYmUgbWFkZSBhdCBzdHJzdGFydCsyNTguCisgICAgICAgICAqLworICAgICAgICBkbyB7CisgICAgICAgIH0gd2hpbGUgKCorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorICAgICAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisgICAgICAgICAgICAgICAgICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorICAgICAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKKworICAgICAgICBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZS0xKSwgIndpbGQgc2NhbiIpOworCisgICAgICAgIGxlbiA9IE1BWF9NQVRDSCAtIChpbnQpKHN0cmVuZCAtIHNjYW4pOworICAgICAgICBzY2FuID0gc3RyZW5kIC0gTUFYX01BVENIOworCisjZW5kaWYgLyogVU5BTElHTkVEX09LICovCisKKyAgICAgICAgaWYgKGxlbiA+IGJlc3RfbGVuKSB7CisgICAgICAgICAgICBzLT5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDsKKyAgICAgICAgICAgIGJlc3RfbGVuID0gbGVuOworICAgICAgICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSBicmVhazsKKyNpZmRlZiBVTkFMSUdORURfT0sKKyAgICAgICAgICAgIHNjYW5fZW5kID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsKKyNlbHNlCisgICAgICAgICAgICBzY2FuX2VuZDEgID0gc2NhbltiZXN0X2xlbi0xXTsKKyAgICAgICAgICAgIHNjYW5fZW5kICAgPSBzY2FuW2Jlc3RfbGVuXTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0CisgICAgICAgICAgICAgJiYgLS1jaGFpbl9sZW5ndGggIT0gMCk7CisKKyAgICBpZiAoKHVJbnQpYmVzdF9sZW4gPD0gcy0+bG9va2FoZWFkKSByZXR1cm4gKHVJbnQpYmVzdF9sZW47CisgICAgcmV0dXJuIHMtPmxvb2thaGVhZDsKK30KKyNlbmRpZiAvKiBBU01WICovCisKKyNlbHNlIC8qIEZBU1RFU1QgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBPcHRpbWl6ZWQgdmVyc2lvbiBmb3IgRkFTVEVTVCBvbmx5CisgKi8KK2xvY2FsIHVJbnQgbG9uZ2VzdF9tYXRjaChzLCBjdXJfbWF0Y2gpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBJUG9zIGN1cl9tYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8KK3sKKyAgICByZWdpc3RlciBCeXRlZiAqc2NhbiA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0OyAvKiBjdXJyZW50IHN0cmluZyAqLworICAgIHJlZ2lzdGVyIEJ5dGVmICptYXRjaDsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoZWQgc3RyaW5nICovCisgICAgcmVnaXN0ZXIgaW50IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBtYXRjaCAqLworICAgIHJlZ2lzdGVyIEJ5dGVmICpzdHJlbmQgPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCArIE1BWF9NQVRDSDsKKworICAgIC8qIFRoZSBjb2RlIGlzIG9wdGltaXplZCBmb3IgSEFTSF9CSVRTID49IDggYW5kIE1BWF9NQVRDSC0yIG11bHRpcGxlIG9mIDE2LgorICAgICAqIEl0IGlzIGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGlzIG9wdGltaXphdGlvbiBpZiBuZWNlc3NhcnkuCisgICAgICovCisgICAgQXNzZXJ0KHMtPmhhc2hfYml0cyA+PSA4ICYmIE1BWF9NQVRDSCA9PSAyNTgsICJDb2RlIHRvbyBjbGV2ZXIiKTsKKworICAgIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplLU1JTl9MT09LQUhFQUQsICJuZWVkIGxvb2thaGVhZCIpOworCisgICAgQXNzZXJ0KGN1cl9tYXRjaCA8IHMtPnN0cnN0YXJ0LCAibm8gZnV0dXJlIik7CisKKyAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsKKworICAgIC8qIFJldHVybiBmYWlsdXJlIGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbGVzcyB0aGFuIDI6CisgICAgICovCisgICAgaWYgKG1hdGNoWzBdICE9IHNjYW5bMF0gfHwgbWF0Y2hbMV0gIT0gc2NhblsxXSkgcmV0dXJuIE1JTl9NQVRDSC0xOworCisgICAgLyogVGhlIGNoZWNrIGF0IGJlc3RfbGVuLTEgY2FuIGJlIHJlbW92ZWQgYmVjYXVzZSBpdCB3aWxsIGJlIG1hZGUKKyAgICAgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKQorICAgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5CisgICAgICogYXJlIGFsd2F5cyBlcXVhbCB3aGVuIHRoZSBvdGhlciBieXRlcyBtYXRjaCwgZ2l2ZW4gdGhhdAorICAgICAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LgorICAgICAqLworICAgIHNjYW4gKz0gMiwgbWF0Y2ggKz0gMjsKKyAgICBBc3NlcnQoKnNjYW4gPT0gKm1hdGNoLCAibWF0Y2hbMl0/Iik7CisKKyAgICAvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uOworICAgICAqIHRoZSAyNTZ0aCBjaGVjayB3aWxsIGJlIG1hZGUgYXQgc3Ryc3RhcnQrMjU4LgorICAgICAqLworICAgIGRvIHsKKyAgICB9IHdoaWxlICgqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKKworICAgIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCAid2lsZCBzY2FuIik7CisKKyAgICBsZW4gPSBNQVhfTUFUQ0ggLSAoaW50KShzdHJlbmQgLSBzY2FuKTsKKworICAgIGlmIChsZW4gPCBNSU5fTUFUQ0gpIHJldHVybiBNSU5fTUFUQ0ggLSAxOworCisgICAgcy0+bWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7CisgICAgcmV0dXJuICh1SW50KWxlbiA8PSBzLT5sb29rYWhlYWQgPyAodUludClsZW4gOiBzLT5sb29rYWhlYWQ7Cit9CisKKyNlbmRpZiAvKiBGQVNURVNUICovCisKKyNpZmRlZiBERUJVRworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDaGVjayB0aGF0IHRoZSBtYXRjaCBhdCBtYXRjaF9zdGFydCBpcyBpbmRlZWQgYSBtYXRjaC4KKyAqLworbG9jYWwgdm9pZCBjaGVja19tYXRjaChzLCBzdGFydCwgbWF0Y2gsIGxlbmd0aCkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIElQb3Mgc3RhcnQsIG1hdGNoOworICAgIGludCBsZW5ndGg7Cit7CisgICAgLyogY2hlY2sgdGhhdCB0aGUgbWF0Y2ggaXMgaW5kZWVkIGEgbWF0Y2ggKi8KKyAgICBpZiAoem1lbWNtcChzLT53aW5kb3cgKyBtYXRjaCwKKyAgICAgICAgICAgICAgICBzLT53aW5kb3cgKyBzdGFydCwgbGVuZ3RoKSAhPSBFUVVBTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiBzdGFydCAldSwgbWF0Y2ggJXUsIGxlbmd0aCAlZFxuIiwKKyAgICAgICAgICAgICAgICBzdGFydCwgbWF0Y2gsIGxlbmd0aCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJWMlYyIsIHMtPndpbmRvd1ttYXRjaCsrXSwgcy0+d2luZG93W3N0YXJ0KytdKTsKKyAgICAgICAgfSB3aGlsZSAoLS1sZW5ndGggIT0gMCk7CisgICAgICAgIHpfZXJyb3IoImludmFsaWQgbWF0Y2giKTsKKyAgICB9CisgICAgaWYgKHpfdmVyYm9zZSA+IDEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIlxcWyVkLCVkXSIsIHN0YXJ0LW1hdGNoLCBsZW5ndGgpOworICAgICAgICBkbyB7IHB1dGMocy0+d2luZG93W3N0YXJ0KytdLCBzdGRlcnIpOyB9IHdoaWxlICgtLWxlbmd0aCAhPSAwKTsKKyAgICB9Cit9CisjZWxzZQorIyAgZGVmaW5lIGNoZWNrX21hdGNoKHMsIHN0YXJ0LCBtYXRjaCwgbGVuZ3RoKQorI2VuZGlmIC8qIERFQlVHICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRmlsbCB0aGUgd2luZG93IHdoZW4gdGhlIGxvb2thaGVhZCBiZWNvbWVzIGluc3VmZmljaWVudC4KKyAqIFVwZGF0ZXMgc3Ryc3RhcnQgYW5kIGxvb2thaGVhZC4KKyAqCisgKiBJTiBhc3NlcnRpb246IGxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQKKyAqIE9VVCBhc3NlcnRpb25zOiBzdHJzdGFydCA8PSB3aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFECisgKiAgICBBdCBsZWFzdCBvbmUgYnl0ZSBoYXMgYmVlbiByZWFkLCBvciBhdmFpbF9pbiA9PSAwOyByZWFkcyBhcmUKKyAqICAgIHBlcmZvcm1lZCBmb3IgYXQgbGVhc3QgdHdvIGJ5dGVzIChyZXF1aXJlZCBmb3IgdGhlIHppcCB0cmFuc2xhdGVfZW9sCisgKiAgICBvcHRpb24gLS0gbm90IHN1cHBvcnRlZCBoZXJlKS4KKyAqLworbG9jYWwgdm9pZCBmaWxsX3dpbmRvdyhzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgbiwgbTsKKyAgICByZWdpc3RlciBQb3NmICpwOworICAgIHVuc2lnbmVkIG1vcmU7ICAgIC8qIEFtb3VudCBvZiBmcmVlIHNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIHdpbmRvdy4gKi8KKyAgICB1SW50IHdzaXplID0gcy0+d19zaXplOworCisgICAgQXNzZXJ0KHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQsICJhbHJlYWR5IGVub3VnaCBsb29rYWhlYWQiKTsKKworICAgIGRvIHsKKyAgICAgICAgbW9yZSA9ICh1bnNpZ25lZCkocy0+d2luZG93X3NpemUgLSh1bGcpcy0+bG9va2FoZWFkIC0odWxnKXMtPnN0cnN0YXJ0KTsKKworICAgICAgICAvKiBEZWFsIHdpdGggIUAjJCUgNjRLIGxpbWl0OiAqLworICAgICAgICBpZiAoc2l6ZW9mKGludCkgPD0gMikgeworICAgICAgICAgICAgaWYgKG1vcmUgPT0gMCAmJiBzLT5zdHJzdGFydCA9PSAwICYmIHMtPmxvb2thaGVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgbW9yZSA9IHdzaXplOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKG1vcmUgPT0gKHVuc2lnbmVkKSgtMSkpIHsKKyAgICAgICAgICAgICAgICAvKiBWZXJ5IHVubGlrZWx5LCBidXQgcG9zc2libGUgb24gMTYgYml0IG1hY2hpbmUgaWYKKyAgICAgICAgICAgICAgICAgKiBzdHJzdGFydCA9PSAwICYmIGxvb2thaGVhZCA9PSAxIChpbnB1dCBkb25lIGEgYnl0ZSBhdCB0aW1lKQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIG1vcmUtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIHRoZSB3aW5kb3cgaXMgYWxtb3N0IGZ1bGwgYW5kIHRoZXJlIGlzIGluc3VmZmljaWVudCBsb29rYWhlYWQsCisgICAgICAgICAqIG1vdmUgdGhlIHVwcGVyIGhhbGYgdG8gdGhlIGxvd2VyIG9uZSB0byBtYWtlIHJvb20gaW4gdGhlIHVwcGVyIGhhbGYuCisgICAgICAgICAqLworICAgICAgICBpZiAocy0+c3Ryc3RhcnQgPj0gd3NpemUrTUFYX0RJU1QocykpIHsKKworICAgICAgICAgICAgem1lbWNweShzLT53aW5kb3csIHMtPndpbmRvdyt3c2l6ZSwgKHVuc2lnbmVkKXdzaXplKTsKKyAgICAgICAgICAgIHMtPm1hdGNoX3N0YXJ0IC09IHdzaXplOworICAgICAgICAgICAgcy0+c3Ryc3RhcnQgICAgLT0gd3NpemU7IC8qIHdlIG5vdyBoYXZlIHN0cnN0YXJ0ID49IE1BWF9ESVNUICovCisgICAgICAgICAgICBzLT5ibG9ja19zdGFydCAtPSAobG9uZykgd3NpemU7CisKKyAgICAgICAgICAgIC8qIFNsaWRlIHRoZSBoYXNoIHRhYmxlIChjb3VsZCBiZSBhdm9pZGVkIHdpdGggMzIgYml0IHZhbHVlcworICAgICAgICAgICAgICAgYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlKS4gV2Ugc2xpZGUgZXZlbiB3aGVuIGxldmVsID09IDAKKyAgICAgICAgICAgICAgIHRvIGtlZXAgdGhlIGhhc2ggdGFibGUgY29uc2lzdGVudCBpZiB3ZSBzd2l0Y2ggYmFjayB0byBsZXZlbCA+IDAKKyAgICAgICAgICAgICAgIGxhdGVyLiAoVXNpbmcgbGV2ZWwgMCBwZXJtYW5lbnRseSBpcyBub3QgYW4gb3B0aW1hbCB1c2FnZSBvZgorICAgICAgICAgICAgICAgemxpYiwgc28gd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIHBhdGhvbG9naWNhbCBjYXNlLikKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbiA9IHMtPmhhc2hfc2l6ZTsKKyAgICAgICAgICAgIHAgPSAmcy0+aGVhZFtuXTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBtID0gKi0tcDsKKyAgICAgICAgICAgICAgICAqcCA9IChQb3MpKG0gPj0gd3NpemUgPyBtLXdzaXplIDogTklMKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKC0tbik7CisKKyAgICAgICAgICAgIG4gPSB3c2l6ZTsKKyNpZm5kZWYgRkFTVEVTVAorICAgICAgICAgICAgcCA9ICZzLT5wcmV2W25dOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIG0gPSAqLS1wOworICAgICAgICAgICAgICAgICpwID0gKFBvcykobSA+PSB3c2l6ZSA/IG0td3NpemUgOiBOSUwpOworICAgICAgICAgICAgICAgIC8qIElmIG4gaXMgbm90IG9uIGFueSBoYXNoIGNoYWluLCBwcmV2W25dIGlzIGdhcmJhZ2UgYnV0CisgICAgICAgICAgICAgICAgICogaXRzIHZhbHVlIHdpbGwgbmV2ZXIgYmUgdXNlZC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIH0gd2hpbGUgKC0tbik7CisjZW5kaWYKKyAgICAgICAgICAgIG1vcmUgKz0gd3NpemU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPnN0cm0tPmF2YWlsX2luID09IDApIGJyZWFrOworCisgICAgICAgIC8qIElmIHRoZXJlIHdhcyBubyBzbGlkaW5nOgorICAgICAgICAgKiAgICBzdHJzdGFydCA8PSBXU0laRStNQVhfRElTVC0xICYmIGxvb2thaGVhZCA8PSBNSU5fTE9PS0FIRUFEIC0gMSAmJgorICAgICAgICAgKiAgICBtb3JlID09IHdpbmRvd19zaXplIC0gbG9va2FoZWFkIC0gc3Ryc3RhcnQKKyAgICAgICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIChNSU5fTE9PS0FIRUFELTEgKyBXU0laRSArIE1BWF9ESVNULTEpCisgICAgICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAyKldTSVpFICsgMgorICAgICAgICAgKiBJbiB0aGUgQklHX01FTSBvciBNTUFQIGNhc2UgKG5vdCB5ZXQgc3VwcG9ydGVkKSwKKyAgICAgICAgICogICB3aW5kb3dfc2l6ZSA9PSBpbnB1dF9zaXplICsgTUlOX0xPT0tBSEVBRCAgJiYKKyAgICAgICAgICogICBzdHJzdGFydCArIHMtPmxvb2thaGVhZCA8PSBpbnB1dF9zaXplID0+IG1vcmUgPj0gTUlOX0xPT0tBSEVBRC4KKyAgICAgICAgICogT3RoZXJ3aXNlLCB3aW5kb3dfc2l6ZSA9PSAyKldTSVpFIHNvIG1vcmUgPj0gMi4KKyAgICAgICAgICogSWYgdGhlcmUgd2FzIHNsaWRpbmcsIG1vcmUgPj0gV1NJWkUuIFNvIGluIGFsbCBjYXNlcywgbW9yZSA+PSAyLgorICAgICAgICAgKi8KKyAgICAgICAgQXNzZXJ0KG1vcmUgPj0gMiwgIm1vcmUgPCAyIik7CisKKyAgICAgICAgbiA9IHJlYWRfYnVmKHMtPnN0cm0sIHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkLCBtb3JlKTsKKyAgICAgICAgcy0+bG9va2FoZWFkICs9IG47CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgaGFzaCB2YWx1ZSBub3cgdGhhdCB3ZSBoYXZlIHNvbWUgaW5wdXQ6ICovCisgICAgICAgIGlmIChzLT5sb29rYWhlYWQgKyBzLT5pbnNlcnQgPj0gTUlOX01BVENIKSB7CisgICAgICAgICAgICB1SW50IHN0ciA9IHMtPnN0cnN0YXJ0IC0gcy0+aW5zZXJ0OworICAgICAgICAgICAgcy0+aW5zX2ggPSBzLT53aW5kb3dbc3RyXTsKKyAgICAgICAgICAgIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgMV0pOworI2lmIE1JTl9NQVRDSCAhPSAzCisgICAgICAgICAgICBDYWxsIFVQREFURV9IQVNIKCkgTUlOX01BVENILTMgbW9yZSB0aW1lcworI2VuZGlmCisgICAgICAgICAgICB3aGlsZSAocy0+aW5zZXJ0KSB7CisgICAgICAgICAgICAgICAgVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOworI2lmbmRlZiBGQVNURVNUCisgICAgICAgICAgICAgICAgcy0+cHJldltzdHIgJiBzLT53X21hc2tdID0gcy0+aGVhZFtzLT5pbnNfaF07CisjZW5kaWYKKyAgICAgICAgICAgICAgICBzLT5oZWFkW3MtPmluc19oXSA9IChQb3Mpc3RyOworICAgICAgICAgICAgICAgIHN0cisrOworICAgICAgICAgICAgICAgIHMtPmluc2VydC0tOworICAgICAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgKyBzLT5pbnNlcnQgPCBNSU5fTUFUQ0gpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIElmIHRoZSB3aG9sZSBpbnB1dCBoYXMgbGVzcyB0aGFuIE1JTl9NQVRDSCBieXRlcywgaW5zX2ggaXMgZ2FyYmFnZSwKKyAgICAgICAgICogYnV0IHRoaXMgaXMgbm90IGltcG9ydGFudCBzaW5jZSBvbmx5IGxpdGVyYWwgYnl0ZXMgd2lsbCBiZSBlbWl0dGVkLgorICAgICAgICAgKi8KKworICAgIH0gd2hpbGUgKHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgcy0+c3RybS0+YXZhaWxfaW4gIT0gMCk7CisKKyAgICAvKiBJZiB0aGUgV0lOX0lOSVQgYnl0ZXMgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBkYXRhIGhhdmUgbmV2ZXIgYmVlbgorICAgICAqIHdyaXR0ZW4sIHRoZW4gemVybyB0aG9zZSBieXRlcyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgcmVwb3J0cyBvZgorICAgICAqIHRoZSB1c2Ugb2YgdW5pbml0aWFsaXplZCAob3IgdW5pbml0aWFsaXNlZCBhcyBKdWxpYW4gd3JpdGVzKSBieXRlcyBieQorICAgICAqIHRoZSBsb25nZXN0IG1hdGNoIHJvdXRpbmVzLiAgVXBkYXRlIHRoZSBoaWdoIHdhdGVyIG1hcmsgZm9yIHRoZSBuZXh0CisgICAgICogdGltZSB0aHJvdWdoIGhlcmUuICBXSU5fSU5JVCBpcyBzZXQgdG8gTUFYX01BVENIIHNpbmNlIHRoZSBsb25nZXN0IG1hdGNoCisgICAgICogcm91dGluZXMgYWxsb3cgc2Nhbm5pbmcgdG8gc3Ryc3RhcnQgKyBNQVhfTUFUQ0gsIGlnbm9yaW5nIGxvb2thaGVhZC4KKyAgICAgKi8KKyAgICBpZiAocy0+aGlnaF93YXRlciA8IHMtPndpbmRvd19zaXplKSB7CisgICAgICAgIHVsZyBjdXJyID0gcy0+c3Ryc3RhcnQgKyAodWxnKShzLT5sb29rYWhlYWQpOworICAgICAgICB1bGcgaW5pdDsKKworICAgICAgICBpZiAocy0+aGlnaF93YXRlciA8IGN1cnIpIHsKKyAgICAgICAgICAgIC8qIFByZXZpb3VzIGhpZ2ggd2F0ZXIgbWFyayBiZWxvdyBjdXJyZW50IGRhdGEgLS0gemVybyBXSU5fSU5JVAorICAgICAgICAgICAgICogYnl0ZXMgb3IgdXAgdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGluaXQgPSBzLT53aW5kb3dfc2l6ZSAtIGN1cnI7CisgICAgICAgICAgICBpZiAoaW5pdCA+IFdJTl9JTklUKQorICAgICAgICAgICAgICAgIGluaXQgPSBXSU5fSU5JVDsKKyAgICAgICAgICAgIHptZW16ZXJvKHMtPndpbmRvdyArIGN1cnIsICh1bnNpZ25lZClpbml0KTsKKyAgICAgICAgICAgIHMtPmhpZ2hfd2F0ZXIgPSBjdXJyICsgaW5pdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzLT5oaWdoX3dhdGVyIDwgKHVsZyljdXJyICsgV0lOX0lOSVQpIHsKKyAgICAgICAgICAgIC8qIEhpZ2ggd2F0ZXIgbWFyayBhdCBvciBhYm92ZSBjdXJyZW50IGRhdGEsIGJ1dCBiZWxvdyBjdXJyZW50IGRhdGEKKyAgICAgICAgICAgICAqIHBsdXMgV0lOX0lOSVQgLS0gemVybyBvdXQgdG8gY3VycmVudCBkYXRhIHBsdXMgV0lOX0lOSVQsIG9yIHVwCisgICAgICAgICAgICAgKiB0byBlbmQgb2Ygd2luZG93LCB3aGljaGV2ZXIgaXMgbGVzcy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW5pdCA9ICh1bGcpY3VyciArIFdJTl9JTklUIC0gcy0+aGlnaF93YXRlcjsKKyAgICAgICAgICAgIGlmIChpbml0ID4gcy0+d2luZG93X3NpemUgLSBzLT5oaWdoX3dhdGVyKQorICAgICAgICAgICAgICAgIGluaXQgPSBzLT53aW5kb3dfc2l6ZSAtIHMtPmhpZ2hfd2F0ZXI7CisgICAgICAgICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBzLT5oaWdoX3dhdGVyLCAodW5zaWduZWQpaW5pdCk7CisgICAgICAgICAgICBzLT5oaWdoX3dhdGVyICs9IGluaXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBc3NlcnQoKHVsZylzLT5zdHJzdGFydCA8PSBzLT53aW5kb3dfc2l6ZSAtIE1JTl9MT09LQUhFQUQsCisgICAgICAgICAgICJub3QgZW5vdWdoIHJvb20gZm9yIHNlYXJjaCIpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZsdXNoIHRoZSBjdXJyZW50IGJsb2NrLCB3aXRoIGdpdmVuIGVuZC1vZi1maWxlIGZsYWcuCisgKiBJTiBhc3NlcnRpb246IHN0cnN0YXJ0IGlzIHNldCB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IG1hdGNoLgorICovCisjZGVmaW5lIEZMVVNIX0JMT0NLX09OTFkocywgbGFzdCkgeyBcCisgICBfdHJfZmx1c2hfYmxvY2socywgKHMtPmJsb2NrX3N0YXJ0ID49IDBMID8gXAorICAgICAgICAgICAgICAgICAgIChjaGFyZiAqKSZzLT53aW5kb3dbKHVuc2lnbmVkKXMtPmJsb2NrX3N0YXJ0XSA6IFwKKyAgICAgICAgICAgICAgICAgICAoY2hhcmYgKilaX05VTEwpLCBcCisgICAgICAgICAgICAgICAgKHVsZykoKGxvbmcpcy0+c3Ryc3RhcnQgLSBzLT5ibG9ja19zdGFydCksIFwKKyAgICAgICAgICAgICAgICAobGFzdCkpOyBcCisgICBzLT5ibG9ja19zdGFydCA9IHMtPnN0cnN0YXJ0OyBcCisgICBmbHVzaF9wZW5kaW5nKHMtPnN0cm0pOyBcCisgICBUcmFjZXYoKHN0ZGVyciwiW0ZMVVNIXSIpKTsgXAorfQorCisvKiBTYW1lIGJ1dCBmb3JjZSBwcmVtYXR1cmUgZXhpdCBpZiBuZWNlc3NhcnkuICovCisjZGVmaW5lIEZMVVNIX0JMT0NLKHMsIGxhc3QpIHsgXAorICAgRkxVU0hfQkxPQ0tfT05MWShzLCBsYXN0KTsgXAorICAgaWYgKHMtPnN0cm0tPmF2YWlsX291dCA9PSAwKSByZXR1cm4gKGxhc3QpID8gZmluaXNoX3N0YXJ0ZWQgOiBuZWVkX21vcmU7IFwKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5IHdpdGhvdXQgY29tcHJlc3Npb24gYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIHJldHVybgorICogdGhlIGN1cnJlbnQgYmxvY2sgc3RhdGUuCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBzaW5jZQorICogdW5jb21wcmVzc2libGUgZGF0YSBpcyBwcm9iYWJseSBub3QgdXNlZnVsLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQKKyAqIG9ubHkgZm9yIHRoZSBsZXZlbD0wIGNvbXByZXNzaW9uIG9wdGlvbi4KKyAqIE5PVEU6IHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG9wdGltaXplZCB0byBhdm9pZCBleHRyYSBjb3B5aW5nIGZyb20KKyAqIHdpbmRvdyB0byBwZW5kaW5nX2J1Zi4KKyAqLworbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9zdG9yZWQocywgZmx1c2gpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBpbnQgZmx1c2g7Cit7CisgICAgLyogU3RvcmVkIGJsb2NrcyBhcmUgbGltaXRlZCB0byAweGZmZmYgYnl0ZXMsIHBlbmRpbmdfYnVmIGlzIGxpbWl0ZWQKKyAgICAgKiB0byBwZW5kaW5nX2J1Zl9zaXplLCBhbmQgZWFjaCBzdG9yZWQgYmxvY2sgaGFzIGEgNSBieXRlIGhlYWRlcjoKKyAgICAgKi8KKyAgICB1bGcgbWF4X2Jsb2NrX3NpemUgPSAweGZmZmY7CisgICAgdWxnIG1heF9zdGFydDsKKworICAgIGlmIChtYXhfYmxvY2tfc2l6ZSA+IHMtPnBlbmRpbmdfYnVmX3NpemUgLSA1KSB7CisgICAgICAgIG1heF9ibG9ja19zaXplID0gcy0+cGVuZGluZ19idWZfc2l6ZSAtIDU7CisgICAgfQorCisgICAgLyogQ29weSBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gaW5wdXQgdG8gb3V0cHV0OiAqLworICAgIGZvciAoOzspIHsKKyAgICAgICAgLyogRmlsbCB0aGUgd2luZG93IGFzIG11Y2ggYXMgcG9zc2libGU6ICovCisgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPD0gMSkgeworCisgICAgICAgICAgICBBc3NlcnQocy0+c3Ryc3RhcnQgPCBzLT53X3NpemUrTUFYX0RJU1QocykgfHwKKyAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19zdGFydCA+PSAobG9uZylzLT53X3NpemUsICJzbGlkZSB0b28gbGF0ZSIpOworCisgICAgICAgICAgICBmaWxsX3dpbmRvdyhzKTsKKyAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCAmJiBmbHVzaCA9PSBaX05PX0ZMVVNIKSByZXR1cm4gbmVlZF9tb3JlOworCisgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqLworICAgICAgICB9CisgICAgICAgIEFzc2VydChzLT5ibG9ja19zdGFydCA+PSAwTCwgImJsb2NrIGdvbmUiKTsKKworICAgICAgICBzLT5zdHJzdGFydCArPSBzLT5sb29rYWhlYWQ7CisgICAgICAgIHMtPmxvb2thaGVhZCA9IDA7CisKKyAgICAgICAgLyogRW1pdCBhIHN0b3JlZCBibG9jayBpZiBwZW5kaW5nX2J1ZiB3aWxsIGJlIGZ1bGw6ICovCisgICAgICAgIG1heF9zdGFydCA9IHMtPmJsb2NrX3N0YXJ0ICsgbWF4X2Jsb2NrX3NpemU7CisgICAgICAgIGlmIChzLT5zdHJzdGFydCA9PSAwIHx8ICh1bGcpcy0+c3Ryc3RhcnQgPj0gbWF4X3N0YXJ0KSB7CisgICAgICAgICAgICAvKiBzdHJzdGFydCA9PSAwIGlzIHBvc3NpYmxlIHdoZW4gd3JhcGFyb3VuZCBvbiAxNi1iaXQgbWFjaGluZSAqLworICAgICAgICAgICAgcy0+bG9va2FoZWFkID0gKHVJbnQpKHMtPnN0cnN0YXJ0IC0gbWF4X3N0YXJ0KTsKKyAgICAgICAgICAgIHMtPnN0cnN0YXJ0ID0gKHVJbnQpbWF4X3N0YXJ0OworICAgICAgICAgICAgRkxVU0hfQkxPQ0socywgMCk7CisgICAgICAgIH0KKyAgICAgICAgLyogRmx1c2ggaWYgd2UgbWF5IGhhdmUgdG8gc2xpZGUsIG90aGVyd2lzZSBibG9ja19zdGFydCBtYXkgYmVjb21lCisgICAgICAgICAqIG5lZ2F0aXZlIGFuZCB0aGUgZGF0YSB3aWxsIGJlIGdvbmU6CisgICAgICAgICAqLworICAgICAgICBpZiAocy0+c3Ryc3RhcnQgLSAodUludClzLT5ibG9ja19zdGFydCA+PSBNQVhfRElTVChzKSkgeworICAgICAgICAgICAgRkxVU0hfQkxPQ0socywgMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcy0+aW5zZXJ0ID0gMDsKKyAgICBpZiAoZmx1c2ggPT0gWl9GSU5JU0gpIHsKKyAgICAgICAgRkxVU0hfQkxPQ0socywgMSk7CisgICAgICAgIHJldHVybiBmaW5pc2hfZG9uZTsKKyAgICB9CisgICAgaWYgKChsb25nKXMtPnN0cnN0YXJ0ID4gcy0+YmxvY2tfc3RhcnQpCisgICAgICAgIEZMVVNIX0JMT0NLKHMsIDApOworICAgIHJldHVybiBibG9ja19kb25lOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbXByZXNzIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm4gdGhlIGN1cnJlbnQKKyAqIGJsb2NrIHN0YXRlLgorICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwZXJmb3JtIGxhenkgZXZhbHVhdGlvbiBvZiBtYXRjaGVzIGFuZCBpbnNlcnRzCisgKiBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBvbmx5IGZvciB1bm1hdGNoZWQgc3RyaW5ncyBvciBmb3Igc2hvcnQKKyAqIG1hdGNoZXMuIEl0IGlzIHVzZWQgb25seSBmb3IgdGhlIGZhc3QgY29tcHJlc3Npb24gb3B0aW9ucy4KKyAqLworbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9mYXN0KHMsIGZsdXNoKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgaW50IGZsdXNoOworeworICAgIElQb3MgaGFzaF9oZWFkOyAgICAgICAvKiBoZWFkIG9mIHRoZSBoYXNoIGNoYWluICovCisgICAgaW50IGJmbHVzaDsgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqLworCisgICAgZm9yICg7OykgeworICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHQKKyAgICAgICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXMKKyAgICAgICAgICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlCisgICAgICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guCisgICAgICAgICAqLworICAgICAgICBpZiAocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkgeworICAgICAgICAgICAgZmlsbF93aW5kb3cocyk7CisgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PSBaX05PX0ZMVVNIKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5lZWRfbW9yZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCkgYnJlYWs7IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovCisgICAgICAgIH0KKworICAgICAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlCisgICAgICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOgorICAgICAgICAgKi8KKyAgICAgICAgaGFzaF9oZWFkID0gTklMOworICAgICAgICBpZiAocy0+bG9va2FoZWFkID49IE1JTl9NQVRDSCkgeworICAgICAgICAgICAgSU5TRVJUX1NUUklORyhzLCBzLT5zdHJzdGFydCwgaGFzaF9oZWFkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguCisgICAgICAgICAqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhbHdheXMgbWF0Y2hfbGVuZ3RoIDwgTUlOX01BVENICisgICAgICAgICAqLworICAgICAgICBpZiAoaGFzaF9oZWFkICE9IE5JTCAmJiBzLT5zdHJzdGFydCAtIGhhc2hfaGVhZCA8PSBNQVhfRElTVChzKSkgeworICAgICAgICAgICAgLyogVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmcKKyAgICAgICAgICAgICAqIG9mIHdpbmRvdyBpbmRleCAwIChpbiBwYXJ0aWN1bGFyIHdlIGhhdmUgdG8gYXZvaWQgYSBtYXRjaAorICAgICAgICAgICAgICogb2YgdGhlIHN0cmluZyB3aXRoIGl0c2VsZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IGZpbGUpLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoIChzLCBoYXNoX2hlYWQpOworICAgICAgICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi8KKyAgICAgICAgfQorICAgICAgICBpZiAocy0+bWF0Y2hfbGVuZ3RoID49IE1JTl9NQVRDSCkgeworICAgICAgICAgICAgY2hlY2tfbWF0Y2gocywgcy0+c3Ryc3RhcnQsIHMtPm1hdGNoX3N0YXJ0LCBzLT5tYXRjaF9sZW5ndGgpOworCisgICAgICAgICAgICBfdHJfdGFsbHlfZGlzdChzLCBzLT5zdHJzdGFydCAtIHMtPm1hdGNoX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOworCisgICAgICAgICAgICBzLT5sb29rYWhlYWQgLT0gcy0+bWF0Y2hfbGVuZ3RoOworCisgICAgICAgICAgICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoCisgICAgICAgICAgICAgKiBpcyBub3QgdG9vIGxhcmdlLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLgorICAgICAgICAgICAgICovCisjaWZuZGVmIEZBU1RFU1QKKyAgICAgICAgICAgIGlmIChzLT5tYXRjaF9sZW5ndGggPD0gcy0+bWF4X2luc2VydF9sZW5ndGggJiYKKyAgICAgICAgICAgICAgICBzLT5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7CisgICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoLS07IC8qIHN0cmluZyBhdCBzdHJzdGFydCBhbHJlYWR5IGluIHRhYmxlICovCisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBzLT5zdHJzdGFydCsrOworICAgICAgICAgICAgICAgICAgICBJTlNFUlRfU1RSSU5HKHMsIHMtPnN0cnN0YXJ0LCBoYXNoX2hlYWQpOworICAgICAgICAgICAgICAgICAgICAvKiBzdHJzdGFydCBuZXZlciBleGNlZWRzIFdTSVpFLU1BWF9NQVRDSCwgc28gdGhlcmUgYXJlCisgICAgICAgICAgICAgICAgICAgICAqIGFsd2F5cyBNSU5fTUFUQ0ggYnl0ZXMgYWhlYWQuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tcy0+bWF0Y2hfbGVuZ3RoICE9IDApOworICAgICAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHMtPnN0cnN0YXJ0ICs9IHMtPm1hdGNoX2xlbmd0aDsKKyAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSAwOworICAgICAgICAgICAgICAgIHMtPmluc19oID0gcy0+d2luZG93W3MtPnN0cnN0YXJ0XTsKKyAgICAgICAgICAgICAgICBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3MtPnN0cnN0YXJ0KzFdKTsKKyNpZiBNSU5fTUFUQ0ggIT0gMworICAgICAgICAgICAgICAgIENhbGwgVVBEQVRFX0hBU0goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzCisjZW5kaWYKKyAgICAgICAgICAgICAgICAvKiBJZiBsb29rYWhlYWQgPCBNSU5fTUFUQ0gsIGluc19oIGlzIGdhcmJhZ2UsIGJ1dCBpdCBkb2VzIG5vdAorICAgICAgICAgICAgICAgICAqIG1hdHRlciBzaW5jZSBpdCB3aWxsIGJlIHJlY29tcHV0ZWQgYXQgbmV4dCBkZWZsYXRlIGNhbGwuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovCisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIiVjIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpOworICAgICAgICAgICAgX3RyX3RhbGx5X2xpdCAocywgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSwgYmZsdXNoKTsKKyAgICAgICAgICAgIHMtPmxvb2thaGVhZC0tOworICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmZsdXNoKSBGTFVTSF9CTE9DSyhzLCAwKTsKKyAgICB9CisgICAgcy0+aW5zZXJ0ID0gcy0+c3Ryc3RhcnQgPCBNSU5fTUFUQ0gtMSA/IHMtPnN0cnN0YXJ0IDogTUlOX01BVENILTE7CisgICAgaWYgKGZsdXNoID09IFpfRklOSVNIKSB7CisgICAgICAgIEZMVVNIX0JMT0NLKHMsIDEpOworICAgICAgICByZXR1cm4gZmluaXNoX2RvbmU7CisgICAgfQorICAgIGlmIChzLT5sYXN0X2xpdCkKKyAgICAgICAgRkxVU0hfQkxPQ0socywgMCk7CisgICAgcmV0dXJuIGJsb2NrX2RvbmU7Cit9CisKKyNpZm5kZWYgRkFTVEVTVAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTYW1lIGFzIGFib3ZlLCBidXQgYWNoaWV2ZXMgYmV0dGVyIGNvbXByZXNzaW9uLiBXZSB1c2UgYSBsYXp5CisgKiBldmFsdWF0aW9uIGZvciBtYXRjaGVzOiBhIG1hdGNoIGlzIGZpbmFsbHkgYWRvcHRlZCBvbmx5IGlmIHRoZXJlIGlzCisgKiBubyBiZXR0ZXIgbWF0Y2ggYXQgdGhlIG5leHQgd2luZG93IHBvc2l0aW9uLgorICovCitsb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX3Nsb3cocywgZmx1c2gpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBpbnQgZmx1c2g7Cit7CisgICAgSVBvcyBoYXNoX2hlYWQ7ICAgICAgICAgIC8qIGhlYWQgb2YgaGFzaCBjaGFpbiAqLworICAgIGludCBiZmx1c2g7ICAgICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi8KKworICAgIC8qIFByb2Nlc3MgdGhlIGlucHV0IGJsb2NrLiAqLworICAgIGZvciAoOzspIHsKKyAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0CisgICAgICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzCisgICAgICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZQorICAgICAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHsKKyAgICAgICAgICAgIGZpbGxfd2luZG93KHMpOworICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgZmx1c2ggPT0gWl9OT19GTFVTSCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZWVkX21vcmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqLworICAgICAgICB9CisKKyAgICAgICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZQorICAgICAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjoKKyAgICAgICAgICovCisgICAgICAgIGhhc2hfaGVhZCA9IE5JTDsKKyAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHsKKyAgICAgICAgICAgIElOU0VSVF9TVFJJTkcocywgcy0+c3Ryc3RhcnQsIGhhc2hfaGVhZCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLgorICAgICAgICAgKi8KKyAgICAgICAgcy0+cHJldl9sZW5ndGggPSBzLT5tYXRjaF9sZW5ndGgsIHMtPnByZXZfbWF0Y2ggPSBzLT5tYXRjaF9zdGFydDsKKyAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gTUlOX01BVENILTE7CisKKyAgICAgICAgaWYgKGhhc2hfaGVhZCAhPSBOSUwgJiYgcy0+cHJldl9sZW5ndGggPCBzLT5tYXhfbGF6eV9tYXRjaCAmJgorICAgICAgICAgICAgcy0+c3Ryc3RhcnQgLSBoYXNoX2hlYWQgPD0gTUFYX0RJU1QocykpIHsKKyAgICAgICAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nCisgICAgICAgICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2gKKyAgICAgICAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaCAocywgaGFzaF9oZWFkKTsKKyAgICAgICAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovCisKKyAgICAgICAgICAgIGlmIChzLT5tYXRjaF9sZW5ndGggPD0gNSAmJiAocy0+c3RyYXRlZ3kgPT0gWl9GSUxURVJFRAorI2lmIFRPT19GQVIgPD0gMzI3NjcKKyAgICAgICAgICAgICAgICB8fCAocy0+bWF0Y2hfbGVuZ3RoID09IE1JTl9NQVRDSCAmJgorICAgICAgICAgICAgICAgICAgICBzLT5zdHJzdGFydCAtIHMtPm1hdGNoX3N0YXJ0ID4gVE9PX0ZBUikKKyNlbmRpZgorICAgICAgICAgICAgICAgICkpIHsKKworICAgICAgICAgICAgICAgIC8qIElmIHByZXZfbWF0Y2ggaXMgYWxzbyBNSU5fTUFUQ0gsIG1hdGNoX3N0YXJ0IGlzIGdhcmJhZ2UKKyAgICAgICAgICAgICAgICAgKiBidXQgd2Ugd2lsbCBpZ25vcmUgdGhlIGN1cnJlbnQgbWF0Y2ggYW55d2F5LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIElmIHRoZXJlIHdhcyBhIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBzdGVwIGFuZCB0aGUgY3VycmVudAorICAgICAgICAgKiBtYXRjaCBpcyBub3QgYmV0dGVyLCBvdXRwdXQgdGhlIHByZXZpb3VzIG1hdGNoOgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHMtPnByZXZfbGVuZ3RoID49IE1JTl9NQVRDSCAmJiBzLT5tYXRjaF9sZW5ndGggPD0gcy0+cHJldl9sZW5ndGgpIHsKKyAgICAgICAgICAgIHVJbnQgbWF4X2luc2VydCA9IHMtPnN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkIC0gTUlOX01BVENIOworICAgICAgICAgICAgLyogRG8gbm90IGluc2VydCBzdHJpbmdzIGluIGhhc2ggdGFibGUgYmV5b25kIHRoaXMuICovCisKKyAgICAgICAgICAgIGNoZWNrX21hdGNoKHMsIHMtPnN0cnN0YXJ0LTEsIHMtPnByZXZfbWF0Y2gsIHMtPnByZXZfbGVuZ3RoKTsKKworICAgICAgICAgICAgX3RyX3RhbGx5X2Rpc3Qocywgcy0+c3Ryc3RhcnQgLTEgLSBzLT5wcmV2X21hdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJldl9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7CisKKyAgICAgICAgICAgIC8qIEluc2VydCBpbiBoYXNoIHRhYmxlIGFsbCBzdHJpbmdzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoLgorICAgICAgICAgICAgICogc3Ryc3RhcnQtMSBhbmQgc3Ryc3RhcnQgYXJlIGFscmVhZHkgaW5zZXJ0ZWQuIElmIHRoZXJlIGlzIG5vdAorICAgICAgICAgICAgICogZW5vdWdoIGxvb2thaGVhZCwgdGhlIGxhc3QgdHdvIHN0cmluZ3MgYXJlIG5vdCBpbnNlcnRlZCBpbgorICAgICAgICAgICAgICogdGhlIGhhc2ggdGFibGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHMtPmxvb2thaGVhZCAtPSBzLT5wcmV2X2xlbmd0aC0xOworICAgICAgICAgICAgcy0+cHJldl9sZW5ndGggLT0gMjsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpZiAoKytzLT5zdHJzdGFydCA8PSBtYXhfaW5zZXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIElOU0VSVF9TVFJJTkcocywgcy0+c3Ryc3RhcnQsIGhhc2hfaGVhZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoLS1zLT5wcmV2X2xlbmd0aCAhPSAwKTsKKyAgICAgICAgICAgIHMtPm1hdGNoX2F2YWlsYWJsZSA9IDA7CisgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0gtMTsKKyAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7CisKKyAgICAgICAgICAgIGlmIChiZmx1c2gpIEZMVVNIX0JMT0NLKHMsIDApOworCisgICAgICAgIH0gZWxzZSBpZiAocy0+bWF0Y2hfYXZhaWxhYmxlKSB7CisgICAgICAgICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHBvc2l0aW9uLCBvdXRwdXQgYQorICAgICAgICAgICAgICogc2luZ2xlIGxpdGVyYWwuIElmIHRoZXJlIHdhcyBhIG1hdGNoIGJ1dCB0aGUgY3VycmVudCBtYXRjaAorICAgICAgICAgICAgICogaXMgbG9uZ2VyLCB0cnVuY2F0ZSB0aGUgcHJldmlvdXMgbWF0Y2ggdG8gYSBzaW5nbGUgbGl0ZXJhbC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpOworICAgICAgICAgICAgX3RyX3RhbGx5X2xpdChzLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0sIGJmbHVzaCk7CisgICAgICAgICAgICBpZiAoYmZsdXNoKSB7CisgICAgICAgICAgICAgICAgRkxVU0hfQkxPQ0tfT05MWShzLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7CisgICAgICAgICAgICBzLT5sb29rYWhlYWQtLTsKKyAgICAgICAgICAgIGlmIChzLT5zdHJtLT5hdmFpbF9vdXQgPT0gMCkgcmV0dXJuIG5lZWRfbW9yZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFRoZXJlIGlzIG5vIHByZXZpb3VzIG1hdGNoIHRvIGNvbXBhcmUgd2l0aCwgd2FpdCBmb3IKKyAgICAgICAgICAgICAqIHRoZSBuZXh0IHN0ZXAgdG8gZGVjaWRlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzLT5tYXRjaF9hdmFpbGFibGUgPSAxOworICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKKyAgICAgICAgICAgIHMtPmxvb2thaGVhZC0tOworICAgICAgICB9CisgICAgfQorICAgIEFzc2VydCAoZmx1c2ggIT0gWl9OT19GTFVTSCwgIm5vIGZsdXNoPyIpOworICAgIGlmIChzLT5tYXRjaF9hdmFpbGFibGUpIHsKKyAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpOworICAgICAgICBfdHJfdGFsbHlfbGl0KHMsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSwgYmZsdXNoKTsKKyAgICAgICAgcy0+bWF0Y2hfYXZhaWxhYmxlID0gMDsKKyAgICB9CisgICAgcy0+aW5zZXJ0ID0gcy0+c3Ryc3RhcnQgPCBNSU5fTUFUQ0gtMSA/IHMtPnN0cnN0YXJ0IDogTUlOX01BVENILTE7CisgICAgaWYgKGZsdXNoID09IFpfRklOSVNIKSB7CisgICAgICAgIEZMVVNIX0JMT0NLKHMsIDEpOworICAgICAgICByZXR1cm4gZmluaXNoX2RvbmU7CisgICAgfQorICAgIGlmIChzLT5sYXN0X2xpdCkKKyAgICAgICAgRkxVU0hfQkxPQ0socywgMCk7CisgICAgcmV0dXJuIGJsb2NrX2RvbmU7Cit9CisjZW5kaWYgLyogRkFTVEVTVCAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZvciBaX1JMRSwgc2ltcGx5IGxvb2sgZm9yIHJ1bnMgb2YgYnl0ZXMsIGdlbmVyYXRlIG1hdGNoZXMgb25seSBvZiBkaXN0YW5jZQorICogb25lLiAgRG8gbm90IG1haW50YWluIGEgaGFzaCB0YWJsZS4gIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVuIG9mCisgKiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBaX1JMRS4pCisgKi8KK2xvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfcmxlKHMsIGZsdXNoKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgaW50IGZsdXNoOworeworICAgIGludCBiZmx1c2g7ICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqLworICAgIHVJbnQgcHJldjsgICAgICAgICAgICAgIC8qIGJ5dGUgYXQgZGlzdGFuY2Ugb25lIHRvIG1hdGNoICovCisgICAgQnl0ZWYgKnNjYW4sICpzdHJlbmQ7ICAgLyogc2NhbiBnb2VzIHVwIHRvIHN0cmVuZCBmb3IgbGVuZ3RoIG9mIHJ1biAqLworCisgICAgZm9yICg7OykgeworICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHQKKyAgICAgICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXMKKyAgICAgICAgICogZm9yIHRoZSBsb25nZXN0IHJ1biwgcGx1cyBvbmUgZm9yIHRoZSB1bnJvbGxlZCBsb29wLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8PSBNQVhfTUFUQ0gpIHsKKyAgICAgICAgICAgIGZpbGxfd2luZG93KHMpOworICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8PSBNQVhfTUFUQ0ggJiYgZmx1c2ggPT0gWl9OT19GTFVTSCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZWVkX21vcmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqLworICAgICAgICB9CisKKyAgICAgICAgLyogU2VlIGhvdyBtYW55IHRpbWVzIHRoZSBwcmV2aW91cyBieXRlIHJlcGVhdHMgKi8KKyAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gMDsKKyAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA+PSBNSU5fTUFUQ0ggJiYgcy0+c3Ryc3RhcnQgPiAwKSB7CisgICAgICAgICAgICBzY2FuID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQgLSAxOworICAgICAgICAgICAgcHJldiA9ICpzY2FuOworICAgICAgICAgICAgaWYgKHByZXYgPT0gKisrc2NhbiAmJiBwcmV2ID09ICorK3NjYW4gJiYgcHJldiA9PSAqKytzY2FuKSB7CisgICAgICAgICAgICAgICAgc3RyZW5kID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQgKyBNQVhfTUFUQ0g7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIH0gd2hpbGUgKHByZXYgPT0gKisrc2NhbiAmJiBwcmV2ID09ICorK3NjYW4gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ID09ICorK3NjYW4gJiYgcHJldiA9PSAqKytzY2FuICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJldiA9PSAqKytzY2FuICYmIHByZXYgPT0gKisrc2NhbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPT0gKisrc2NhbiAmJiBwcmV2ID09ICorK3NjYW4gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKKyAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBNQVhfTUFUQ0ggLSAoaW50KShzdHJlbmQgLSBzY2FuKTsKKyAgICAgICAgICAgICAgICBpZiAocy0+bWF0Y2hfbGVuZ3RoID4gcy0+bG9va2FoZWFkKQorICAgICAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBzLT5sb29rYWhlYWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVJbnQpKHMtPndpbmRvd19zaXplLTEpLCAid2lsZCBzY2FuIik7CisgICAgICAgIH0KKworICAgICAgICAvKiBFbWl0IG1hdGNoIGlmIGhhdmUgcnVuIG9mIE1JTl9NQVRDSCBvciBsb25nZXIsIGVsc2UgZW1pdCBsaXRlcmFsICovCisgICAgICAgIGlmIChzLT5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7CisgICAgICAgICAgICBjaGVja19tYXRjaChzLCBzLT5zdHJzdGFydCwgcy0+c3Ryc3RhcnQgLSAxLCBzLT5tYXRjaF9sZW5ndGgpOworCisgICAgICAgICAgICBfdHJfdGFsbHlfZGlzdChzLCAxLCBzLT5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7CisKKyAgICAgICAgICAgIHMtPmxvb2thaGVhZCAtPSBzLT5tYXRjaF9sZW5ndGg7CisgICAgICAgICAgICBzLT5zdHJzdGFydCArPSBzLT5tYXRjaF9sZW5ndGg7CisgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogTm8gbWF0Y2gsIG91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqLworICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTsKKyAgICAgICAgICAgIF90cl90YWxseV9saXQgKHMsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0sIGJmbHVzaCk7CisgICAgICAgICAgICBzLT5sb29rYWhlYWQtLTsKKyAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJmbHVzaCkgRkxVU0hfQkxPQ0socywgMCk7CisgICAgfQorICAgIHMtPmluc2VydCA9IDA7CisgICAgaWYgKGZsdXNoID09IFpfRklOSVNIKSB7CisgICAgICAgIEZMVVNIX0JMT0NLKHMsIDEpOworICAgICAgICByZXR1cm4gZmluaXNoX2RvbmU7CisgICAgfQorICAgIGlmIChzLT5sYXN0X2xpdCkKKyAgICAgICAgRkxVU0hfQkxPQ0socywgMCk7CisgICAgcmV0dXJuIGJsb2NrX2RvbmU7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRm9yIFpfSFVGRk1BTl9PTkxZLCBkbyBub3QgbG9vayBmb3IgbWF0Y2hlcy4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuCisgKiAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBIdWZmbWFuLikKKyAqLworbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9odWZmKHMsIGZsdXNoKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgaW50IGZsdXNoOworeworICAgIGludCBiZmx1c2g7ICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqLworCisgICAgZm9yICg7OykgeworICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgbGl0ZXJhbCB0byB3cml0ZS4gKi8KKyAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA9PSAwKSB7CisgICAgICAgICAgICBmaWxsX3dpbmRvdyhzKTsKKyAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChmbHVzaCA9PSBaX05PX0ZMVVNIKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmVlZF9tb3JlOworICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgIC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBPdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi8KKyAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gMDsKKyAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTsKKyAgICAgICAgX3RyX3RhbGx5X2xpdCAocywgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSwgYmZsdXNoKTsKKyAgICAgICAgcy0+bG9va2FoZWFkLS07CisgICAgICAgIHMtPnN0cnN0YXJ0Kys7CisgICAgICAgIGlmIChiZmx1c2gpIEZMVVNIX0JMT0NLKHMsIDApOworICAgIH0KKyAgICBzLT5pbnNlcnQgPSAwOworICAgIGlmIChmbHVzaCA9PSBaX0ZJTklTSCkgeworICAgICAgICBGTFVTSF9CTE9DSyhzLCAxKTsKKyAgICAgICAgcmV0dXJuIGZpbmlzaF9kb25lOworICAgIH0KKyAgICBpZiAocy0+bGFzdF9saXQpCisgICAgICAgIEZMVVNIX0JMT0NLKHMsIDApOworICAgIHJldHVybiBibG9ja19kb25lOworfQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvZGVmbGF0ZS5oIGIvemxpYi9zcmMvZGVmbGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMDI5OWUKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9kZWZsYXRlLmgKQEAgLTAsMCArMSwzNDYgQEAKKy8qIGRlZmxhdGUuaCAtLSBpbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMTIgSmVhbi1sb3VwIEdhaWxseQorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCisgICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKKyAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KKyAqLworCisvKiBAKCMpICRJZCQgKi8KKworI2lmbmRlZiBERUZMQVRFX0gKKyNkZWZpbmUgREVGTEFURV9ICisKKyNpbmNsdWRlICJ6dXRpbC5oIgorCisvKiBkZWZpbmUgTk9fR1pJUCB3aGVuIGNvbXBpbGluZyBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIGd6aXAgaGVhZGVyIGFuZAorICAgdHJhaWxlciBjcmVhdGlvbiBieSBkZWZsYXRlKCkuICBOT19HWklQIHdvdWxkIGJlIHVzZWQgdG8gYXZvaWQgbGlua2luZyBpbgorICAgdGhlIGNyYyBjb2RlIHdoZW4gaXQgaXMgbm90IG5lZWRlZC4gIEZvciBzaGFyZWQgbGlicmFyaWVzLCBnemlwIGVuY29kaW5nCisgICBzaG91bGQgYmUgbGVmdCBlbmFibGVkLiAqLworI2lmbmRlZiBOT19HWklQCisjICBkZWZpbmUgR1pJUAorI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW50ZXJuYWwgY29tcHJlc3Npb24gc3RhdGUuCisgKi8KKworI2RlZmluZSBMRU5HVEhfQ09ERVMgMjkKKy8qIG51bWJlciBvZiBsZW5ndGggY29kZXMsIG5vdCBjb3VudGluZyB0aGUgc3BlY2lhbCBFTkRfQkxPQ0sgY29kZSAqLworCisjZGVmaW5lIExJVEVSQUxTICAyNTYKKy8qIG51bWJlciBvZiBsaXRlcmFsIGJ5dGVzIDAuLjI1NSAqLworCisjZGVmaW5lIExfQ09ERVMgKExJVEVSQUxTKzErTEVOR1RIX0NPREVTKQorLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovCisKKyNkZWZpbmUgRF9DT0RFUyAgIDMwCisvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi8KKworI2RlZmluZSBCTF9DT0RFUyAgMTkKKy8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqLworCisjZGVmaW5lIEhFQVBfU0laRSAoMipMX0NPREVTKzEpCisvKiBtYXhpbXVtIGhlYXAgc2l6ZSAqLworCisjZGVmaW5lIE1BWF9CSVRTIDE1CisvKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi8KKworI2RlZmluZSBCdWZfc2l6ZSAxNgorLyogc2l6ZSBvZiBiaXQgYnVmZmVyIGluIGJpX2J1ZiAqLworCisjZGVmaW5lIElOSVRfU1RBVEUgICAgNDIKKyNkZWZpbmUgRVhUUkFfU1RBVEUgICA2OQorI2RlZmluZSBOQU1FX1NUQVRFICAgIDczCisjZGVmaW5lIENPTU1FTlRfU1RBVEUgOTEKKyNkZWZpbmUgSENSQ19TVEFURSAgIDEwMworI2RlZmluZSBCVVNZX1NUQVRFICAgMTEzCisjZGVmaW5lIEZJTklTSF9TVEFURSA2NjYKKy8qIFN0cmVhbSBzdGF0dXMgKi8KKworCisvKiBEYXRhIHN0cnVjdHVyZSBkZXNjcmliaW5nIGEgc2luZ2xlIHZhbHVlIGFuZCBpdHMgY29kZSBzdHJpbmcuICovCit0eXBlZGVmIHN0cnVjdCBjdF9kYXRhX3MgeworICAgIHVuaW9uIHsKKyAgICAgICAgdXNoICBmcmVxOyAgICAgICAvKiBmcmVxdWVuY3kgY291bnQgKi8KKyAgICAgICAgdXNoICBjb2RlOyAgICAgICAvKiBiaXQgc3RyaW5nICovCisgICAgfSBmYzsKKyAgICB1bmlvbiB7CisgICAgICAgIHVzaCAgZGFkOyAgICAgICAgLyogZmF0aGVyIG5vZGUgaW4gSHVmZm1hbiB0cmVlICovCisgICAgICAgIHVzaCAgbGVuOyAgICAgICAgLyogbGVuZ3RoIG9mIGJpdCBzdHJpbmcgKi8KKyAgICB9IGRsOworfSBGQVIgY3RfZGF0YTsKKworI2RlZmluZSBGcmVxIGZjLmZyZXEKKyNkZWZpbmUgQ29kZSBmYy5jb2RlCisjZGVmaW5lIERhZCAgZGwuZGFkCisjZGVmaW5lIExlbiAgZGwubGVuCisKK3R5cGVkZWYgc3RydWN0IHN0YXRpY190cmVlX2Rlc2NfcyAgc3RhdGljX3RyZWVfZGVzYzsKKwordHlwZWRlZiBzdHJ1Y3QgdHJlZV9kZXNjX3MgeworICAgIGN0X2RhdGEgKmR5bl90cmVlOyAgICAgICAgICAgLyogdGhlIGR5bmFtaWMgdHJlZSAqLworICAgIGludCAgICAgbWF4X2NvZGU7ICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovCisgICAgc3RhdGljX3RyZWVfZGVzYyAqc3RhdF9kZXNjOyAvKiB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgdHJlZSAqLworfSBGQVIgdHJlZV9kZXNjOworCit0eXBlZGVmIHVzaCBQb3M7Cit0eXBlZGVmIFBvcyBGQVIgUG9zZjsKK3R5cGVkZWYgdW5zaWduZWQgSVBvczsKKworLyogQSBQb3MgaXMgYW4gaW5kZXggaW4gdGhlIGNoYXJhY3RlciB3aW5kb3cuIFdlIHVzZSBzaG9ydCBpbnN0ZWFkIG9mIGludCB0bworICogc2F2ZSBzcGFjZSBpbiB0aGUgdmFyaW91cyB0YWJsZXMuIElQb3MgaXMgdXNlZCBvbmx5IGZvciBwYXJhbWV0ZXIgcGFzc2luZy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSB7CisgICAgel9zdHJlYW1wIHN0cm07ICAgICAgLyogcG9pbnRlciBiYWNrIHRvIHRoaXMgemxpYiBzdHJlYW0gKi8KKyAgICBpbnQgICBzdGF0dXM7ICAgICAgICAvKiBhcyB0aGUgbmFtZSBpbXBsaWVzICovCisgICAgQnl0ZWYgKnBlbmRpbmdfYnVmOyAgLyogb3V0cHV0IHN0aWxsIHBlbmRpbmcgKi8KKyAgICB1bGcgICBwZW5kaW5nX2J1Zl9zaXplOyAvKiBzaXplIG9mIHBlbmRpbmdfYnVmICovCisgICAgQnl0ZWYgKnBlbmRpbmdfb3V0OyAgLyogbmV4dCBwZW5kaW5nIGJ5dGUgdG8gb3V0cHV0IHRvIHRoZSBzdHJlYW0gKi8KKyAgICB1SW50ICAgcGVuZGluZzsgICAgICAvKiBuYiBvZiBieXRlcyBpbiB0aGUgcGVuZGluZyBidWZmZXIgKi8KKyAgICBpbnQgICB3cmFwOyAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovCisgICAgZ3pfaGVhZGVycCAgZ3poZWFkOyAgLyogZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gdG8gd3JpdGUgKi8KKyAgICB1SW50ICAgZ3ppbmRleDsgICAgICAvKiB3aGVyZSBpbiBleHRyYSwgbmFtZSwgb3IgY29tbWVudCAqLworICAgIEJ5dGUgIG1ldGhvZDsgICAgICAgIC8qIGNhbiBvbmx5IGJlIERFRkxBVEVEICovCisgICAgaW50ICAgbGFzdF9mbHVzaDsgICAgLyogdmFsdWUgb2YgZmx1c2ggcGFyYW0gZm9yIHByZXZpb3VzIGRlZmxhdGUgY2FsbCAqLworCisgICAgICAgICAgICAgICAgLyogdXNlZCBieSBkZWZsYXRlLmM6ICovCisKKyAgICB1SW50ICB3X3NpemU7ICAgICAgICAvKiBMWjc3IHdpbmRvdyBzaXplICgzMksgYnkgZGVmYXVsdCkgKi8KKyAgICB1SW50ICB3X2JpdHM7ICAgICAgICAvKiBsb2cyKHdfc2l6ZSkgICg4Li4xNikgKi8KKyAgICB1SW50ICB3X21hc2s7ICAgICAgICAvKiB3X3NpemUgLSAxICovCisKKyAgICBCeXRlZiAqd2luZG93OworICAgIC8qIFNsaWRpbmcgd2luZG93LiBJbnB1dCBieXRlcyBhcmUgcmVhZCBpbnRvIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgd2luZG93LAorICAgICAqIGFuZCBtb3ZlIHRvIHRoZSBmaXJzdCBoYWxmIGxhdGVyIHRvIGtlZXAgYSBkaWN0aW9uYXJ5IG9mIGF0IGxlYXN0IHdTaXplCisgICAgICogYnl0ZXMuIFdpdGggdGhpcyBvcmdhbml6YXRpb24sIG1hdGNoZXMgYXJlIGxpbWl0ZWQgdG8gYSBkaXN0YW5jZSBvZgorICAgICAqIHdTaXplLU1BWF9NQVRDSCBieXRlcywgYnV0IHRoaXMgZW5zdXJlcyB0aGF0IElPIGlzIGFsd2F5cworICAgICAqIHBlcmZvcm1lZCB3aXRoIGEgbGVuZ3RoIG11bHRpcGxlIG9mIHRoZSBibG9jayBzaXplLiBBbHNvLCBpdCBsaW1pdHMKKyAgICAgKiB0aGUgd2luZG93IHNpemUgdG8gNjRLLCB3aGljaCBpcyBxdWl0ZSB1c2VmdWwgb24gTVNET1MuCisgICAgICogVG8gZG86IHVzZSB0aGUgdXNlciBpbnB1dCBidWZmZXIgYXMgc2xpZGluZyB3aW5kb3cuCisgICAgICovCisKKyAgICB1bGcgd2luZG93X3NpemU7CisgICAgLyogQWN0dWFsIHNpemUgb2Ygd2luZG93OiAyKndTaXplLCBleGNlcHQgd2hlbiB0aGUgdXNlciBpbnB1dCBidWZmZXIKKyAgICAgKiBpcyBkaXJlY3RseSB1c2VkIGFzIHNsaWRpbmcgd2luZG93LgorICAgICAqLworCisgICAgUG9zZiAqcHJldjsKKyAgICAvKiBMaW5rIHRvIG9sZGVyIHN0cmluZyB3aXRoIHNhbWUgaGFzaCBpbmRleC4gVG8gbGltaXQgdGhlIHNpemUgb2YgdGhpcworICAgICAqIGFycmF5IHRvIDY0SywgdGhpcyBsaW5rIGlzIG1haW50YWluZWQgb25seSBmb3IgdGhlIGxhc3QgMzJLIHN0cmluZ3MuCisgICAgICogQW4gaW5kZXggaW4gdGhpcyBhcnJheSBpcyB0aHVzIGEgd2luZG93IGluZGV4IG1vZHVsbyAzMksuCisgICAgICovCisKKyAgICBQb3NmICpoZWFkOyAvKiBIZWFkcyBvZiB0aGUgaGFzaCBjaGFpbnMgb3IgTklMLiAqLworCisgICAgdUludCAgaW5zX2g7ICAgICAgICAgIC8qIGhhc2ggaW5kZXggb2Ygc3RyaW5nIHRvIGJlIGluc2VydGVkICovCisgICAgdUludCAgaGFzaF9zaXplOyAgICAgIC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiBoYXNoIHRhYmxlICovCisgICAgdUludCAgaGFzaF9iaXRzOyAgICAgIC8qIGxvZzIoaGFzaF9zaXplKSAqLworICAgIHVJbnQgIGhhc2hfbWFzazsgICAgICAvKiBoYXNoX3NpemUtMSAqLworCisgICAgdUludCAgaGFzaF9zaGlmdDsKKyAgICAvKiBOdW1iZXIgb2YgYml0cyBieSB3aGljaCBpbnNfaCBtdXN0IGJlIHNoaWZ0ZWQgYXQgZWFjaCBpbnB1dAorICAgICAqIHN0ZXAuIEl0IG11c3QgYmUgc3VjaCB0aGF0IGFmdGVyIE1JTl9NQVRDSCBzdGVwcywgdGhlIG9sZGVzdAorICAgICAqIGJ5dGUgbm8gbG9uZ2VyIHRha2VzIHBhcnQgaW4gdGhlIGhhc2gga2V5LCB0aGF0IGlzOgorICAgICAqICAgaGFzaF9zaGlmdCAqIE1JTl9NQVRDSCA+PSBoYXNoX2JpdHMKKyAgICAgKi8KKworICAgIGxvbmcgYmxvY2tfc3RhcnQ7CisgICAgLyogV2luZG93IHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgb3V0cHV0IGJsb2NrLiBHZXRzCisgICAgICogbmVnYXRpdmUgd2hlbiB0aGUgd2luZG93IGlzIG1vdmVkIGJhY2t3YXJkcy4KKyAgICAgKi8KKworICAgIHVJbnQgbWF0Y2hfbGVuZ3RoOyAgICAgICAgICAgLyogbGVuZ3RoIG9mIGJlc3QgbWF0Y2ggKi8KKyAgICBJUG9zIHByZXZfbWF0Y2g7ICAgICAgICAgICAgIC8qIHByZXZpb3VzIG1hdGNoICovCisgICAgaW50IG1hdGNoX2F2YWlsYWJsZTsgICAgICAgICAvKiBzZXQgaWYgcHJldmlvdXMgbWF0Y2ggZXhpc3RzICovCisgICAgdUludCBzdHJzdGFydDsgICAgICAgICAgICAgICAvKiBzdGFydCBvZiBzdHJpbmcgdG8gaW5zZXJ0ICovCisgICAgdUludCBtYXRjaF9zdGFydDsgICAgICAgICAgICAvKiBzdGFydCBvZiBtYXRjaGluZyBzdHJpbmcgKi8KKyAgICB1SW50IGxvb2thaGVhZDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiB2YWxpZCBieXRlcyBhaGVhZCBpbiB3aW5kb3cgKi8KKworICAgIHVJbnQgcHJldl9sZW5ndGg7CisgICAgLyogTGVuZ3RoIG9mIHRoZSBiZXN0IG1hdGNoIGF0IHByZXZpb3VzIHN0ZXAuIE1hdGNoZXMgbm90IGdyZWF0ZXIgdGhhbiB0aGlzCisgICAgICogYXJlIGRpc2NhcmRlZC4gVGhpcyBpcyB1c2VkIGluIHRoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24uCisgICAgICovCisKKyAgICB1SW50IG1heF9jaGFpbl9sZW5ndGg7CisgICAgLyogVG8gc3BlZWQgdXAgZGVmbGF0aW9uLCBoYXNoIGNoYWlucyBhcmUgbmV2ZXIgc2VhcmNoZWQgYmV5b25kIHRoaXMKKyAgICAgKiBsZW5ndGguICBBIGhpZ2hlciBsaW1pdCBpbXByb3ZlcyBjb21wcmVzc2lvbiByYXRpbyBidXQgZGVncmFkZXMgdGhlCisgICAgICogc3BlZWQuCisgICAgICovCisKKyAgICB1SW50IG1heF9sYXp5X21hdGNoOworICAgIC8qIEF0dGVtcHQgdG8gZmluZCBhIGJldHRlciBtYXRjaCBvbmx5IHdoZW4gdGhlIGN1cnJlbnQgbWF0Y2ggaXMgc3RyaWN0bHkKKyAgICAgKiBzbWFsbGVyIHRoYW4gdGhpcyB2YWx1ZS4gVGhpcyBtZWNoYW5pc20gaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvbgorICAgICAqIGxldmVscyA+PSA0LgorICAgICAqLworIyAgIGRlZmluZSBtYXhfaW5zZXJ0X2xlbmd0aCAgbWF4X2xhenlfbWF0Y2gKKyAgICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIG5vdAorICAgICAqIGdyZWF0ZXIgdGhhbiB0aGlzIGxlbmd0aC4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi4KKyAgICAgKiBtYXhfaW5zZXJ0X2xlbmd0aCBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uIGxldmVscyA8PSAzLgorICAgICAqLworCisgICAgaW50IGxldmVsOyAgICAvKiBjb21wcmVzc2lvbiBsZXZlbCAoMS4uOSkgKi8KKyAgICBpbnQgc3RyYXRlZ3k7IC8qIGZhdm9yIG9yIGZvcmNlIEh1ZmZtYW4gY29kaW5nKi8KKworICAgIHVJbnQgZ29vZF9tYXRjaDsKKyAgICAvKiBVc2UgYSBmYXN0ZXIgc2VhcmNoIHdoZW4gdGhlIHByZXZpb3VzIG1hdGNoIGlzIGxvbmdlciB0aGFuIHRoaXMgKi8KKworICAgIGludCBuaWNlX21hdGNoOyAvKiBTdG9wIHNlYXJjaGluZyB3aGVuIGN1cnJlbnQgbWF0Y2ggZXhjZWVkcyB0aGlzICovCisKKyAgICAgICAgICAgICAgICAvKiB1c2VkIGJ5IHRyZWVzLmM6ICovCisgICAgLyogRGlkbid0IHVzZSBjdF9kYXRhIHR5cGVkZWYgYmVsb3cgdG8gc3VwcHJlc3MgY29tcGlsZXIgd2FybmluZyAqLworICAgIHN0cnVjdCBjdF9kYXRhX3MgZHluX2x0cmVlW0hFQVBfU0laRV07ICAgLyogbGl0ZXJhbCBhbmQgbGVuZ3RoIHRyZWUgKi8KKyAgICBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9kdHJlZVsyKkRfQ09ERVMrMV07IC8qIGRpc3RhbmNlIHRyZWUgKi8KKyAgICBzdHJ1Y3QgY3RfZGF0YV9zIGJsX3RyZWVbMipCTF9DT0RFUysxXTsgIC8qIEh1ZmZtYW4gdHJlZSBmb3IgYml0IGxlbmd0aHMgKi8KKworICAgIHN0cnVjdCB0cmVlX2Rlc2NfcyBsX2Rlc2M7ICAgICAgICAgICAgICAgLyogZGVzYy4gZm9yIGxpdGVyYWwgdHJlZSAqLworICAgIHN0cnVjdCB0cmVlX2Rlc2NfcyBkX2Rlc2M7ICAgICAgICAgICAgICAgLyogZGVzYy4gZm9yIGRpc3RhbmNlIHRyZWUgKi8KKyAgICBzdHJ1Y3QgdHJlZV9kZXNjX3MgYmxfZGVzYzsgICAgICAgICAgICAgIC8qIGRlc2MuIGZvciBiaXQgbGVuZ3RoIHRyZWUgKi8KKworICAgIHVzaCBibF9jb3VudFtNQVhfQklUUysxXTsKKyAgICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi8KKworICAgIGludCBoZWFwWzIqTF9DT0RFUysxXTsgICAgICAvKiBoZWFwIHVzZWQgdG8gYnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgKi8KKyAgICBpbnQgaGVhcF9sZW47ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBoZWFwICovCisgICAgaW50IGhlYXBfbWF4OyAgICAgICAgICAgICAgIC8qIGVsZW1lbnQgb2YgbGFyZ2VzdCBmcmVxdWVuY3kgKi8KKyAgICAvKiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLiBoZWFwWzBdIGlzIG5vdCB1c2VkLgorICAgICAqIFRoZSBzYW1lIGhlYXAgYXJyYXkgaXMgdXNlZCB0byBidWlsZCBhbGwgdHJlZXMuCisgICAgICovCisKKyAgICB1Y2ggZGVwdGhbMipMX0NPREVTKzFdOworICAgIC8qIERlcHRoIG9mIGVhY2ggc3VidHJlZSB1c2VkIGFzIHRpZSBicmVha2VyIGZvciB0cmVlcyBvZiBlcXVhbCBmcmVxdWVuY3kKKyAgICAgKi8KKworICAgIHVjaGYgKmxfYnVmOyAgICAgICAgICAvKiBidWZmZXIgZm9yIGxpdGVyYWxzIG9yIGxlbmd0aHMgKi8KKworICAgIHVJbnQgIGxpdF9idWZzaXplOworICAgIC8qIFNpemUgb2YgbWF0Y2ggYnVmZmVyIGZvciBsaXRlcmFscy9sZW5ndGhzLiAgVGhlcmUgYXJlIDQgcmVhc29ucyBmb3IKKyAgICAgKiBsaW1pdGluZyBsaXRfYnVmc2l6ZSB0byA2NEs6CisgICAgICogICAtIGZyZXF1ZW5jaWVzIGNhbiBiZSBrZXB0IGluIDE2IGJpdCBjb3VudGVycworICAgICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgdGhlIGZpcnN0IGJsb2NrLCBhbGwgaW5wdXQKKyAgICAgKiAgICAgZGF0YSBpcyBzdGlsbCBpbiB0aGUgd2luZG93IHNvIHdlIGNhbiBzdGlsbCBlbWl0IGEgc3RvcmVkIGJsb2NrIGV2ZW4KKyAgICAgKiAgICAgd2hlbiBpbnB1dCBjb21lcyBmcm9tIHN0YW5kYXJkIGlucHV0LiAgKFRoaXMgY2FuIGFsc28gYmUgZG9uZSBmb3IKKyAgICAgKiAgICAgYWxsIGJsb2NrcyBpZiBsaXRfYnVmc2l6ZSBpcyBub3QgZ3JlYXRlciB0aGFuIDMySy4pCisgICAgICogICAtIGlmIGNvbXByZXNzaW9uIGlzIG5vdCBzdWNjZXNzZnVsIGZvciBhIGZpbGUgc21hbGxlciB0aGFuIDY0Sywgd2UgY2FuCisgICAgICogICAgIGV2ZW4gZW1pdCBhIHN0b3JlZCBmaWxlIGluc3RlYWQgb2YgYSBzdG9yZWQgYmxvY2sgKHNhdmluZyA1IGJ5dGVzKS4KKyAgICAgKiAgICAgVGhpcyBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIHppcCAobm90IGd6aXAgb3IgemxpYikuCisgICAgICogICAtIGNyZWF0aW5nIG5ldyBIdWZmbWFuIHRyZWVzIGxlc3MgZnJlcXVlbnRseSBtYXkgbm90IHByb3ZpZGUgZmFzdAorICAgICAqICAgICBhZGFwdGF0aW9uIHRvIGNoYW5nZXMgaW4gdGhlIGlucHV0IGRhdGEgc3RhdGlzdGljcy4gKFRha2UgZm9yCisgICAgICogICAgIGV4YW1wbGUgYSBiaW5hcnkgZmlsZSB3aXRoIHBvb3JseSBjb21wcmVzc2libGUgY29kZSBmb2xsb3dlZCBieQorICAgICAqICAgICBhIGhpZ2hseSBjb21wcmVzc2libGUgc3RyaW5nIHRhYmxlLikgU21hbGxlciBidWZmZXIgc2l6ZXMgZ2l2ZQorICAgICAqICAgICBmYXN0IGFkYXB0YXRpb24gYnV0IGhhdmUgb2YgY291cnNlIHRoZSBvdmVyaGVhZCBvZiB0cmFuc21pdHRpbmcKKyAgICAgKiAgICAgdHJlZXMgbW9yZSBmcmVxdWVudGx5LgorICAgICAqICAgLSBJIGNhbid0IGNvdW50IGFib3ZlIDQKKyAgICAgKi8KKworICAgIHVJbnQgbGFzdF9saXQ7ICAgICAgLyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqLworCisgICAgdXNoZiAqZF9idWY7CisgICAgLyogQnVmZmVyIGZvciBkaXN0YW5jZXMuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCBkX2J1ZiBhbmQgbF9idWYgaGF2ZQorICAgICAqIHRoZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cy4gVG8gdXNlIGRpZmZlcmVudCBsZW5ndGhzLCBhbiBleHRyYSBmbGFnCisgICAgICogYXJyYXkgd291bGQgYmUgbmVjZXNzYXJ5LgorICAgICAqLworCisgICAgdWxnIG9wdF9sZW47ICAgICAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBvcHRpbWFsIHRyZWVzICovCisgICAgdWxnIHN0YXRpY19sZW47ICAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBzdGF0aWMgdHJlZXMgKi8KKyAgICB1SW50IG1hdGNoZXM7ICAgICAgIC8qIG51bWJlciBvZiBzdHJpbmcgbWF0Y2hlcyBpbiBjdXJyZW50IGJsb2NrICovCisgICAgdUludCBpbnNlcnQ7ICAgICAgICAvKiBieXRlcyBhdCBlbmQgb2Ygd2luZG93IGxlZnQgdG8gaW5zZXJ0ICovCisKKyNpZmRlZiBERUJVRworICAgIHVsZyBjb21wcmVzc2VkX2xlbjsgLyogdG90YWwgYml0IGxlbmd0aCBvZiBjb21wcmVzc2VkIGZpbGUgbW9kIDJeMzIgKi8KKyAgICB1bGcgYml0c19zZW50OyAgICAgIC8qIGJpdCBsZW5ndGggb2YgY29tcHJlc3NlZCBkYXRhIHNlbnQgbW9kIDJeMzIgKi8KKyNlbmRpZgorCisgICAgdXNoIGJpX2J1ZjsKKyAgICAvKiBPdXRwdXQgYnVmZmVyLiBiaXRzIGFyZSBpbnNlcnRlZCBzdGFydGluZyBhdCB0aGUgYm90dG9tIChsZWFzdAorICAgICAqIHNpZ25pZmljYW50IGJpdHMpLgorICAgICAqLworICAgIGludCBiaV92YWxpZDsKKyAgICAvKiBOdW1iZXIgb2YgdmFsaWQgYml0cyBpbiBiaV9idWYuICBBbGwgYml0cyBhYm92ZSB0aGUgbGFzdCB2YWxpZCBiaXQKKyAgICAgKiBhcmUgYWx3YXlzIHplcm8uCisgICAgICovCisKKyAgICB1bGcgaGlnaF93YXRlcjsKKyAgICAvKiBIaWdoIHdhdGVyIG1hcmsgb2Zmc2V0IGluIHdpbmRvdyBmb3IgaW5pdGlhbGl6ZWQgYnl0ZXMgLS0gYnl0ZXMgYWJvdmUKKyAgICAgKiB0aGlzIGFyZSBzZXQgdG8gemVybyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgd2FybmluZ3Mgd2hlbgorICAgICAqIGxvbmdlc3QgbWF0Y2ggcm91dGluZXMgYWNjZXNzIGJ5dGVzIHBhc3QgdGhlIGlucHV0LiAgVGhpcyBpcyB0aGVuCisgICAgICogdXBkYXRlZCB0byB0aGUgbmV3IGhpZ2ggd2F0ZXIgbWFyay4KKyAgICAgKi8KKworfSBGQVIgZGVmbGF0ZV9zdGF0ZTsKKworLyogT3V0cHV0IGEgYnl0ZSBvbiB0aGUgc3RyZWFtLgorICogSU4gYXNzZXJ0aW9uOiB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpbiBwZW5kaW5nX2J1Zi4KKyAqLworI2RlZmluZSBwdXRfYnl0ZShzLCBjKSB7cy0+cGVuZGluZ19idWZbcy0+cGVuZGluZysrXSA9IChjKTt9CisKKworI2RlZmluZSBNSU5fTE9PS0FIRUFEIChNQVhfTUFUQ0grTUlOX01BVENIKzEpCisvKiBNaW5pbXVtIGFtb3VudCBvZiBsb29rYWhlYWQsIGV4Y2VwdCBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLgorICogU2VlIGRlZmxhdGUuYyBmb3IgY29tbWVudHMgYWJvdXQgdGhlIE1JTl9NQVRDSCsxLgorICovCisKKyNkZWZpbmUgTUFYX0RJU1QocykgICgocyktPndfc2l6ZS1NSU5fTE9PS0FIRUFEKQorLyogSW4gb3JkZXIgdG8gc2ltcGxpZnkgdGhlIGNvZGUsIHBhcnRpY3VsYXJseSBvbiAxNiBiaXQgbWFjaGluZXMsIG1hdGNoCisgKiBkaXN0YW5jZXMgYXJlIGxpbWl0ZWQgdG8gTUFYX0RJU1QgaW5zdGVhZCBvZiBXU0laRS4KKyAqLworCisjZGVmaW5lIFdJTl9JTklUIE1BWF9NQVRDSAorLyogTnVtYmVyIG9mIGJ5dGVzIGFmdGVyIGVuZCBvZiBkYXRhIGluIHdpbmRvdyB0byBpbml0aWFsaXplIGluIG9yZGVyIHRvIGF2b2lkCisgICBtZW1vcnkgY2hlY2tlciBlcnJvcnMgZnJvbSBsb25nZXN0IG1hdGNoIHJvdXRpbmVzICovCisKKyAgICAgICAgLyogaW4gdHJlZXMuYyAqLwordm9pZCBaTElCX0lOVEVSTkFMIF90cl9pbml0IE9GKChkZWZsYXRlX3N0YXRlICpzKSk7CitpbnQgWkxJQl9JTlRFUk5BTCBfdHJfdGFsbHkgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIHVuc2lnbmVkIGRpc3QsIHVuc2lnbmVkIGxjKSk7Cit2b2lkIFpMSUJfSU5URVJOQUwgX3RyX2ZsdXNoX2Jsb2NrIE9GKChkZWZsYXRlX3N0YXRlICpzLCBjaGFyZiAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgdWxnIHN0b3JlZF9sZW4sIGludCBsYXN0KSk7Cit2b2lkIFpMSUJfSU5URVJOQUwgX3RyX2ZsdXNoX2JpdHMgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK3ZvaWQgWkxJQl9JTlRFUk5BTCBfdHJfYWxpZ24gT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK3ZvaWQgWkxJQl9JTlRFUk5BTCBfdHJfc3RvcmVkX2Jsb2NrIE9GKChkZWZsYXRlX3N0YXRlICpzLCBjaGFyZiAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgdWxnIHN0b3JlZF9sZW4sIGludCBsYXN0KSk7CisKKyNkZWZpbmUgZF9jb2RlKGRpc3QpIFwKKyAgICgoZGlzdCkgPCAyNTYgPyBfZGlzdF9jb2RlW2Rpc3RdIDogX2Rpc3RfY29kZVsyNTYrKChkaXN0KT4+NyldKQorLyogTWFwcGluZyBmcm9tIGEgZGlzdGFuY2UgdG8gYSBkaXN0YW5jZSBjb2RlLiBkaXN0IGlzIHRoZSBkaXN0YW5jZSAtIDEgYW5kCisgKiBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cy4gX2Rpc3RfY29kZVsyNTZdIGFuZCBfZGlzdF9jb2RlWzI1N10gYXJlIG5ldmVyCisgKiB1c2VkLgorICovCisKKyNpZm5kZWYgREVCVUcKKy8qIElubGluZSB2ZXJzaW9ucyBvZiBfdHJfdGFsbHkgZm9yIHNwZWVkOiAqLworCisjaWYgZGVmaW5lZChHRU5fVFJFRVNfSCkgfHwgIWRlZmluZWQoU1REQykKKyAgZXh0ZXJuIHVjaCBaTElCX0lOVEVSTkFMIF9sZW5ndGhfY29kZVtdOworICBleHRlcm4gdWNoIFpMSUJfSU5URVJOQUwgX2Rpc3RfY29kZVtdOworI2Vsc2UKKyAgZXh0ZXJuIGNvbnN0IHVjaCBaTElCX0lOVEVSTkFMIF9sZW5ndGhfY29kZVtdOworICBleHRlcm4gY29uc3QgdWNoIFpMSUJfSU5URVJOQUwgX2Rpc3RfY29kZVtdOworI2VuZGlmCisKKyMgZGVmaW5lIF90cl90YWxseV9saXQocywgYywgZmx1c2gpIFwKKyAgeyB1Y2ggY2MgPSAoYyk7IFwKKyAgICBzLT5kX2J1ZltzLT5sYXN0X2xpdF0gPSAwOyBcCisgICAgcy0+bF9idWZbcy0+bGFzdF9saXQrK10gPSBjYzsgXAorICAgIHMtPmR5bl9sdHJlZVtjY10uRnJlcSsrOyBcCisgICAgZmx1c2ggPSAocy0+bGFzdF9saXQgPT0gcy0+bGl0X2J1ZnNpemUtMSk7IFwKKyAgIH0KKyMgZGVmaW5lIF90cl90YWxseV9kaXN0KHMsIGRpc3RhbmNlLCBsZW5ndGgsIGZsdXNoKSBcCisgIHsgdWNoIGxlbiA9IChsZW5ndGgpOyBcCisgICAgdXNoIGRpc3QgPSAoZGlzdGFuY2UpOyBcCisgICAgcy0+ZF9idWZbcy0+bGFzdF9saXRdID0gZGlzdDsgXAorICAgIHMtPmxfYnVmW3MtPmxhc3RfbGl0KytdID0gbGVuOyBcCisgICAgZGlzdC0tOyBcCisgICAgcy0+ZHluX2x0cmVlW19sZW5ndGhfY29kZVtsZW5dK0xJVEVSQUxTKzFdLkZyZXErKzsgXAorICAgIHMtPmR5bl9kdHJlZVtkX2NvZGUoZGlzdCldLkZyZXErKzsgXAorICAgIGZsdXNoID0gKHMtPmxhc3RfbGl0ID09IHMtPmxpdF9idWZzaXplLTEpOyBcCisgIH0KKyNlbHNlCisjIGRlZmluZSBfdHJfdGFsbHlfbGl0KHMsIGMsIGZsdXNoKSBmbHVzaCA9IF90cl90YWxseShzLCAwLCBjKQorIyBkZWZpbmUgX3RyX3RhbGx5X2Rpc3QocywgZGlzdGFuY2UsIGxlbmd0aCwgZmx1c2gpIFwKKyAgICAgICAgICAgICAgZmx1c2ggPSBfdHJfdGFsbHkocywgZGlzdGFuY2UsIGxlbmd0aCkKKyNlbmRpZgorCisjZW5kaWYgLyogREVGTEFURV9IICovCmRpZmYgLS1naXQgYS96bGliL3NyYy9kb2MvYWxnb3JpdGhtLnR4dCBiL3psaWIvc3JjL2RvYy9hbGdvcml0aG0udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5N2Y0OTUKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9kb2MvYWxnb3JpdGhtLnR4dApAQCAtMCwwICsxLDIwOSBAQAorMS4gQ29tcHJlc3Npb24gYWxnb3JpdGhtIChkZWZsYXRlKQorCitUaGUgZGVmbGF0aW9uIGFsZ29yaXRobSB1c2VkIGJ5IGd6aXAgKGFsc28gemlwIGFuZCB6bGliKSBpcyBhIHZhcmlhdGlvbiBvZgorTFo3NyAoTGVtcGVsLVppdiAxOTc3LCBzZWUgcmVmZXJlbmNlIGJlbG93KS4gSXQgZmluZHMgZHVwbGljYXRlZCBzdHJpbmdzIGluCit0aGUgaW5wdXQgZGF0YS4gIFRoZSBzZWNvbmQgb2NjdXJyZW5jZSBvZiBhIHN0cmluZyBpcyByZXBsYWNlZCBieSBhCitwb2ludGVyIHRvIHRoZSBwcmV2aW91cyBzdHJpbmcsIGluIHRoZSBmb3JtIG9mIGEgcGFpciAoZGlzdGFuY2UsCitsZW5ndGgpLiAgRGlzdGFuY2VzIGFyZSBsaW1pdGVkIHRvIDMySyBieXRlcywgYW5kIGxlbmd0aHMgYXJlIGxpbWl0ZWQKK3RvIDI1OCBieXRlcy4gV2hlbiBhIHN0cmluZyBkb2VzIG5vdCBvY2N1ciBhbnl3aGVyZSBpbiB0aGUgcHJldmlvdXMKKzMySyBieXRlcywgaXQgaXMgZW1pdHRlZCBhcyBhIHNlcXVlbmNlIG9mIGxpdGVyYWwgYnl0ZXMuICAoSW4gdGhpcworZGVzY3JpcHRpb24sIGBzdHJpbmcnIG11c3QgYmUgdGFrZW4gYXMgYW4gYXJiaXRyYXJ5IHNlcXVlbmNlIG9mIGJ5dGVzLAorYW5kIGlzIG5vdCByZXN0cmljdGVkIHRvIHByaW50YWJsZSBjaGFyYWN0ZXJzLikKKworTGl0ZXJhbHMgb3IgbWF0Y2ggbGVuZ3RocyBhcmUgY29tcHJlc3NlZCB3aXRoIG9uZSBIdWZmbWFuIHRyZWUsIGFuZAorbWF0Y2ggZGlzdGFuY2VzIGFyZSBjb21wcmVzc2VkIHdpdGggYW5vdGhlciB0cmVlLiBUaGUgdHJlZXMgYXJlIHN0b3JlZAoraW4gYSBjb21wYWN0IGZvcm0gYXQgdGhlIHN0YXJ0IG9mIGVhY2ggYmxvY2suIFRoZSBibG9ja3MgY2FuIGhhdmUgYW55CitzaXplIChleGNlcHQgdGhhdCB0aGUgY29tcHJlc3NlZCBkYXRhIGZvciBvbmUgYmxvY2sgbXVzdCBmaXQgaW4KK2F2YWlsYWJsZSBtZW1vcnkpLiBBIGJsb2NrIGlzIHRlcm1pbmF0ZWQgd2hlbiBkZWZsYXRlKCkgZGV0ZXJtaW5lcyB0aGF0CitpdCB3b3VsZCBiZSB1c2VmdWwgdG8gc3RhcnQgYW5vdGhlciBibG9jayB3aXRoIGZyZXNoIHRyZWVzLiAoVGhpcyBpcworc29tZXdoYXQgc2ltaWxhciB0byB0aGUgYmVoYXZpb3Igb2YgTFpXLWJhc2VkIF9jb21wcmVzc18uKQorCitEdXBsaWNhdGVkIHN0cmluZ3MgYXJlIGZvdW5kIHVzaW5nIGEgaGFzaCB0YWJsZS4gQWxsIGlucHV0IHN0cmluZ3Mgb2YKK2xlbmd0aCAzIGFyZSBpbnNlcnRlZCBpbiB0aGUgaGFzaCB0YWJsZS4gQSBoYXNoIGluZGV4IGlzIGNvbXB1dGVkIGZvcgordGhlIG5leHQgMyBieXRlcy4gSWYgdGhlIGhhc2ggY2hhaW4gZm9yIHRoaXMgaW5kZXggaXMgbm90IGVtcHR5LCBhbGwKK3N0cmluZ3MgaW4gdGhlIGNoYWluIGFyZSBjb21wYXJlZCB3aXRoIHRoZSBjdXJyZW50IGlucHV0IHN0cmluZywgYW5kCit0aGUgbG9uZ2VzdCBtYXRjaCBpcyBzZWxlY3RlZC4KKworVGhlIGhhc2ggY2hhaW5zIGFyZSBzZWFyY2hlZCBzdGFydGluZyB3aXRoIHRoZSBtb3N0IHJlY2VudCBzdHJpbmdzLCB0bworZmF2b3Igc21hbGwgZGlzdGFuY2VzIGFuZCB0aHVzIHRha2UgYWR2YW50YWdlIG9mIHRoZSBIdWZmbWFuIGVuY29kaW5nLgorVGhlIGhhc2ggY2hhaW5zIGFyZSBzaW5nbHkgbGlua2VkLiBUaGVyZSBhcmUgbm8gZGVsZXRpb25zIGZyb20gdGhlCitoYXNoIGNoYWlucywgdGhlIGFsZ29yaXRobSBzaW1wbHkgZGlzY2FyZHMgbWF0Y2hlcyB0aGF0IGFyZSB0b28gb2xkLgorCitUbyBhdm9pZCBhIHdvcnN0LWNhc2Ugc2l0dWF0aW9uLCB2ZXJ5IGxvbmcgaGFzaCBjaGFpbnMgYXJlIGFyYml0cmFyaWx5Cit0cnVuY2F0ZWQgYXQgYSBjZXJ0YWluIGxlbmd0aCwgZGV0ZXJtaW5lZCBieSBhIHJ1bnRpbWUgb3B0aW9uIChsZXZlbAorcGFyYW1ldGVyIG9mIGRlZmxhdGVJbml0KS4gU28gZGVmbGF0ZSgpIGRvZXMgbm90IGFsd2F5cyBmaW5kIHRoZSBsb25nZXN0Citwb3NzaWJsZSBtYXRjaCBidXQgZ2VuZXJhbGx5IGZpbmRzIGEgbWF0Y2ggd2hpY2ggaXMgbG9uZyBlbm91Z2guCisKK2RlZmxhdGUoKSBhbHNvIGRlZmVycyB0aGUgc2VsZWN0aW9uIG9mIG1hdGNoZXMgd2l0aCBhIGxhenkgZXZhbHVhdGlvbgorbWVjaGFuaXNtLiBBZnRlciBhIG1hdGNoIG9mIGxlbmd0aCBOIGhhcyBiZWVuIGZvdW5kLCBkZWZsYXRlKCkgc2VhcmNoZXMgZm9yCithIGxvbmdlciBtYXRjaCBhdCB0aGUgbmV4dCBpbnB1dCBieXRlLiBJZiBhIGxvbmdlciBtYXRjaCBpcyBmb3VuZCwgdGhlCitwcmV2aW91cyBtYXRjaCBpcyB0cnVuY2F0ZWQgdG8gYSBsZW5ndGggb2Ygb25lICh0aHVzIHByb2R1Y2luZyBhIHNpbmdsZQorbGl0ZXJhbCBieXRlKSBhbmQgdGhlIHByb2Nlc3Mgb2YgbGF6eSBldmFsdWF0aW9uIGJlZ2lucyBhZ2Fpbi4gT3RoZXJ3aXNlLAordGhlIG9yaWdpbmFsIG1hdGNoIGlzIGtlcHQsIGFuZCB0aGUgbmV4dCBtYXRjaCBzZWFyY2ggaXMgYXR0ZW1wdGVkIG9ubHkgTgorc3RlcHMgbGF0ZXIuCisKK1RoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24gaXMgYWxzbyBzdWJqZWN0IHRvIGEgcnVudGltZSBwYXJhbWV0ZXIuIElmCit0aGUgY3VycmVudCBtYXRjaCBpcyBsb25nIGVub3VnaCwgZGVmbGF0ZSgpIHJlZHVjZXMgdGhlIHNlYXJjaCBmb3IgYSBsb25nZXIKK21hdGNoLCB0aHVzIHNwZWVkaW5nIHVwIHRoZSB3aG9sZSBwcm9jZXNzLiBJZiBjb21wcmVzc2lvbiByYXRpbyBpcyBtb3JlCitpbXBvcnRhbnQgdGhhbiBzcGVlZCwgZGVmbGF0ZSgpIGF0dGVtcHRzIGEgY29tcGxldGUgc2Vjb25kIHNlYXJjaCBldmVuIGlmCit0aGUgZmlyc3QgbWF0Y2ggaXMgYWxyZWFkeSBsb25nIGVub3VnaC4KKworVGhlIGxhenkgbWF0Y2ggZXZhbHVhdGlvbiBpcyBub3QgcGVyZm9ybWVkIGZvciB0aGUgZmFzdGVzdCBjb21wcmVzc2lvbgorbW9kZXMgKGxldmVsIHBhcmFtZXRlciAxIHRvIDMpLiBGb3IgdGhlc2UgZmFzdCBtb2RlcywgbmV3IHN0cmluZ3MKK2FyZSBpbnNlcnRlZCBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IHdoZW4gbm8gbWF0Y2ggd2FzIGZvdW5kLCBvcgord2hlbiB0aGUgbWF0Y2ggaXMgbm90IHRvbyBsb25nLiBUaGlzIGRlZ3JhZGVzIHRoZSBjb21wcmVzc2lvbiByYXRpbworYnV0IHNhdmVzIHRpbWUgc2luY2UgdGhlcmUgYXJlIGJvdGggZmV3ZXIgaW5zZXJ0aW9ucyBhbmQgZmV3ZXIgc2VhcmNoZXMuCisKKworMi4gRGVjb21wcmVzc2lvbiBhbGdvcml0aG0gKGluZmxhdGUpCisKKzIuMSBJbnRyb2R1Y3Rpb24KKworVGhlIGtleSBxdWVzdGlvbiBpcyBob3cgdG8gcmVwcmVzZW50IGEgSHVmZm1hbiBjb2RlIChvciBhbnkgcHJlZml4IGNvZGUpIHNvCit0aGF0IHlvdSBjYW4gZGVjb2RlIGZhc3QuICBUaGUgbW9zdCBpbXBvcnRhbnQgY2hhcmFjdGVyaXN0aWMgaXMgdGhhdCBzaG9ydGVyCitjb2RlcyBhcmUgbXVjaCBtb3JlIGNvbW1vbiB0aGFuIGxvbmdlciBjb2Rlcywgc28gcGF5IGF0dGVudGlvbiB0byBkZWNvZGluZyB0aGUKK3Nob3J0IGNvZGVzIGZhc3QsIGFuZCBsZXQgdGhlIGxvbmcgY29kZXMgdGFrZSBsb25nZXIgdG8gZGVjb2RlLgorCitpbmZsYXRlKCkgc2V0cyB1cCBhIGZpcnN0IGxldmVsIHRhYmxlIHRoYXQgY292ZXJzIHNvbWUgbnVtYmVyIG9mIGJpdHMgb2YKK2lucHV0IGxlc3MgdGhhbiB0aGUgbGVuZ3RoIG9mIGxvbmdlc3QgY29kZS4gIEl0IGdldHMgdGhhdCBtYW55IGJpdHMgZnJvbSB0aGUKK3N0cmVhbSwgYW5kIGxvb2tzIGl0IHVwIGluIHRoZSB0YWJsZS4gIFRoZSB0YWJsZSB3aWxsIHRlbGwgaWYgdGhlIG5leHQKK2NvZGUgaXMgdGhhdCBtYW55IGJpdHMgb3IgbGVzcyBhbmQgaG93IG1hbnksIGFuZCBpZiBpdCBpcywgaXQgd2lsbCB0ZWxsCit0aGUgdmFsdWUsIGVsc2UgaXQgd2lsbCBwb2ludCB0byB0aGUgbmV4dCBsZXZlbCB0YWJsZSBmb3Igd2hpY2ggaW5mbGF0ZSgpCitncmFicyBtb3JlIGJpdHMgYW5kIHRyaWVzIHRvIGRlY29kZSBhIGxvbmdlciBjb2RlLgorCitIb3cgbWFueSBiaXRzIHRvIG1ha2UgdGhlIGZpcnN0IGxvb2t1cCBpcyBhIHRyYWRlb2ZmIGJldHdlZW4gdGhlIHRpbWUgaXQKK3Rha2VzIHRvIGRlY29kZSBhbmQgdGhlIHRpbWUgaXQgdGFrZXMgdG8gYnVpbGQgdGhlIHRhYmxlLiAgSWYgYnVpbGRpbmcgdGhlCit0YWJsZSB0b29rIG5vIHRpbWUgKGFuZCBpZiB5b3UgaGFkIGluZmluaXRlIG1lbW9yeSksIHRoZW4gdGhlcmUgd291bGQgb25seQorYmUgYSBmaXJzdCBsZXZlbCB0YWJsZSB0byBjb3ZlciBhbGwgdGhlIHdheSB0byB0aGUgbG9uZ2VzdCBjb2RlLiAgSG93ZXZlciwKK2J1aWxkaW5nIHRoZSB0YWJsZSBlbmRzIHVwIHRha2luZyBhIGxvdCBsb25nZXIgZm9yIG1vcmUgYml0cyBzaW5jZSBzaG9ydAorY29kZXMgYXJlIHJlcGxpY2F0ZWQgbWFueSB0aW1lcyBpbiBzdWNoIGEgdGFibGUuICBXaGF0IGluZmxhdGUoKSBkb2VzIGlzCitzaW1wbHkgdG8gbWFrZSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGZpcnN0IHRhYmxlIGEgdmFyaWFibGUsIGFuZCAgdGhlbgordG8gc2V0IHRoYXQgdmFyaWFibGUgZm9yIHRoZSBtYXhpbXVtIHNwZWVkLgorCitGb3IgaW5mbGF0ZSwgd2hpY2ggaGFzIDI4NiBwb3NzaWJsZSBjb2RlcyBmb3IgdGhlIGxpdGVyYWwvbGVuZ3RoIHRyZWUsIHRoZSBzaXplCitvZiB0aGUgZmlyc3QgdGFibGUgaXMgbmluZSBiaXRzLiAgQWxzbyB0aGUgZGlzdGFuY2UgdHJlZXMgaGF2ZSAzMCBwb3NzaWJsZQordmFsdWVzLCBhbmQgdGhlIHNpemUgb2YgdGhlIGZpcnN0IHRhYmxlIGlzIHNpeCBiaXRzLiAgTm90ZSB0aGF0IGZvciBlYWNoIG9mCit0aG9zZSBjYXNlcywgdGhlIHRhYmxlIGVuZGVkIHVwIG9uZSBiaXQgbG9uZ2VyIHRoYW4gdGhlIGBgYXZlcmFnZScnIGNvZGUKK2xlbmd0aCwgaS5lLiB0aGUgY29kZSBsZW5ndGggb2YgYW4gYXBwcm94aW1hdGVseSBmbGF0IGNvZGUgd2hpY2ggd291bGQgYmUgYQorbGl0dGxlIG1vcmUgdGhhbiBlaWdodCBiaXRzIGZvciAyODYgc3ltYm9scyBhbmQgYSBsaXR0bGUgbGVzcyB0aGFuIGZpdmUgYml0cworZm9yIDMwIHN5bWJvbHMuCisKKworMi4yIE1vcmUgZGV0YWlscyBvbiB0aGUgaW5mbGF0ZSB0YWJsZSBsb29rdXAKKworT2ssIHlvdSB3YW50IHRvIGtub3cgd2hhdCB0aGlzIGNsZXZlcmx5IG9iZnVzY2F0ZWQgaW5mbGF0ZSB0cmVlIGFjdHVhbGx5Citsb29rcyBsaWtlLiAgWW91IGFyZSBjb3JyZWN0IHRoYXQgaXQncyBub3QgYSBIdWZmbWFuIHRyZWUuICBJdCBpcyBzaW1wbHkgYQorbG9va3VwIHRhYmxlIGZvciB0aGUgZmlyc3QsIGxldCdzIHNheSwgbmluZSBiaXRzIG9mIGEgSHVmZm1hbiBzeW1ib2wuICBUaGUKK3N5bWJvbCBjb3VsZCBiZSBhcyBzaG9ydCBhcyBvbmUgYml0IG9yIGFzIGxvbmcgYXMgMTUgYml0cy4gIElmIGEgcGFydGljdWxhcgorc3ltYm9sIGlzIHNob3J0ZXIgdGhhbiBuaW5lIGJpdHMsIHRoZW4gdGhhdCBzeW1ib2wncyB0cmFuc2xhdGlvbiBpcyBkdXBsaWNhdGVkCitpbiBhbGwgdGhvc2UgZW50cmllcyB0aGF0IHN0YXJ0IHdpdGggdGhhdCBzeW1ib2wncyBiaXRzLiAgRm9yIGV4YW1wbGUsIGlmIHRoZQorc3ltYm9sIGlzIGZvdXIgYml0cywgdGhlbiBpdCdzIGR1cGxpY2F0ZWQgMzIgdGltZXMgaW4gYSBuaW5lLWJpdCB0YWJsZS4gIElmIGEKK3N5bWJvbCBpcyBuaW5lIGJpdHMgbG9uZywgaXQgYXBwZWFycyBpbiB0aGUgdGFibGUgb25jZS4KKworSWYgdGhlIHN5bWJvbCBpcyBsb25nZXIgdGhhbiBuaW5lIGJpdHMsIHRoZW4gdGhhdCBlbnRyeSBpbiB0aGUgdGFibGUgcG9pbnRzCit0byBhbm90aGVyIHNpbWlsYXIgdGFibGUgZm9yIHRoZSByZW1haW5pbmcgYml0cy4gIEFnYWluLCB0aGVyZSBhcmUgZHVwbGljYXRlZAorZW50cmllcyBhcyBuZWVkZWQuICBUaGUgaWRlYSBpcyB0aGF0IG1vc3Qgb2YgdGhlIHRpbWUgdGhlIHN5bWJvbCB3aWxsIGJlIHNob3J0CithbmQgdGhlcmUgd2lsbCBvbmx5IGJlIG9uZSB0YWJsZSBsb29rIHVwLiAgKFRoYXQncyB3aG9sZSBpZGVhIGJlaGluZCBkYXRhCitjb21wcmVzc2lvbiBpbiB0aGUgZmlyc3QgcGxhY2UuKSAgRm9yIHRoZSBsZXNzIGZyZXF1ZW50IGxvbmcgc3ltYm9scywgdGhlcmUKK3dpbGwgYmUgdHdvIGxvb2t1cHMuICBJZiB5b3UgaGFkIGEgY29tcHJlc3Npb24gbWV0aG9kIHdpdGggcmVhbGx5IGxvbmcKK3N5bWJvbHMsIHlvdSBjb3VsZCBoYXZlIGFzIG1hbnkgbGV2ZWxzIG9mIGxvb2t1cHMgYXMgaXMgZWZmaWNpZW50LiAgRm9yCitpbmZsYXRlLCB0d28gaXMgZW5vdWdoLgorCitTbyBhIHRhYmxlIGVudHJ5IGVpdGhlciBwb2ludHMgdG8gYW5vdGhlciB0YWJsZSAoaW4gd2hpY2ggY2FzZSBuaW5lIGJpdHMgaW4KK3RoZSBhYm92ZSBleGFtcGxlIGFyZSBnb2JibGVkKSwgb3IgaXQgY29udGFpbnMgdGhlIHRyYW5zbGF0aW9uIGZvciB0aGUgc3ltYm9sCithbmQgdGhlIG51bWJlciBvZiBiaXRzIHRvIGdvYmJsZS4gIFRoZW4geW91IHN0YXJ0IGFnYWluIHdpdGggdGhlIG5leHQKK3VuZ29iYmxlZCBiaXQuCisKK1lvdSBtYXkgd29uZGVyOiB3aHkgbm90IGp1c3QgaGF2ZSBvbmUgbG9va3VwIHRhYmxlIGZvciBob3cgZXZlciBtYW55IGJpdHMgdGhlCitsb25nZXN0IHN5bWJvbCBpcz8gIFRoZSByZWFzb24gaXMgdGhhdCBpZiB5b3UgZG8gdGhhdCwgeW91IGVuZCB1cCBzcGVuZGluZworbW9yZSB0aW1lIGZpbGxpbmcgaW4gZHVwbGljYXRlIHN5bWJvbCBlbnRyaWVzIHRoYW4geW91IGRvIGFjdHVhbGx5IGRlY29kaW5nLgorQXQgbGVhc3QgZm9yIGRlZmxhdGUncyBvdXRwdXQgdGhhdCBnZW5lcmF0ZXMgbmV3IHRyZWVzIGV2ZXJ5IHNldmVyYWwgMTAncyBvZgora2J5dGVzLiAgWW91IGNhbiBpbWFnaW5lIHRoYXQgZmlsbGluZyBpbiBhIDJeMTUgZW50cnkgdGFibGUgZm9yIGEgMTUtYml0IGNvZGUKK3dvdWxkIHRha2UgdG9vIGxvbmcgaWYgeW91J3JlIG9ubHkgZGVjb2Rpbmcgc2V2ZXJhbCB0aG91c2FuZCBzeW1ib2xzLiAgQXQgdGhlCitvdGhlciBleHRyZW1lLCB5b3UgY291bGQgbWFrZSBhIG5ldyB0YWJsZSBmb3IgZXZlcnkgYml0IGluIHRoZSBjb2RlLiAgSW4gZmFjdCwKK3RoYXQncyBlc3NlbnRpYWxseSBhIEh1ZmZtYW4gdHJlZS4gIEJ1dCB0aGVuIHlvdSBzcGVuZCB0b28gbXVjaCB0aW1lCit0cmF2ZXJzaW5nIHRoZSB0cmVlIHdoaWxlIGRlY29kaW5nLCBldmVuIGZvciBzaG9ydCBzeW1ib2xzLgorCitTbyB0aGUgbnVtYmVyIG9mIGJpdHMgZm9yIHRoZSBmaXJzdCBsb29rdXAgdGFibGUgaXMgYSB0cmFkZSBvZiB0aGUgdGltZSB0bworZmlsbCBvdXQgdGhlIHRhYmxlIHZzLiB0aGUgdGltZSBzcGVudCBsb29raW5nIGF0IHRoZSBzZWNvbmQgbGV2ZWwgYW5kIGFib3ZlIG9mCit0aGUgdGFibGUuCisKK0hlcmUgaXMgYW4gZXhhbXBsZSwgc2NhbGVkIGRvd246CisKK1RoZSBjb2RlIGJlaW5nIGRlY29kZWQsIHdpdGggMTAgc3ltYm9scywgZnJvbSAxIHRvIDYgYml0cyBsb25nOgorCitBOiAwCitCOiAxMAorQzogMTEwMAorRDogMTEwMTAKK0U6IDExMDExCitGOiAxMTEwMAorRzogMTExMDEKK0g6IDExMTEwCitJOiAxMTExMTAKK0o6IDExMTExMQorCitMZXQncyBtYWtlIHRoZSBmaXJzdCB0YWJsZSB0aHJlZSBiaXRzIGxvbmcgKGVpZ2h0IGVudHJpZXMpOgorCiswMDA6IEEsMQorMDAxOiBBLDEKKzAxMDogQSwxCiswMTE6IEEsMQorMTAwOiBCLDIKKzEwMTogQiwyCisxMTA6IC0+IHRhYmxlIFggKGdvYmJsZSAzIGJpdHMpCisxMTE6IC0+IHRhYmxlIFkgKGdvYmJsZSAzIGJpdHMpCisKK0VhY2ggZW50cnkgaXMgd2hhdCB0aGUgYml0cyBkZWNvZGUgYXMgYW5kIGhvdyBtYW55IGJpdHMgdGhhdCBpcywgaS5lLiBob3cKK21hbnkgYml0cyB0byBnb2JibGUuICBPciB0aGUgZW50cnkgcG9pbnRzIHRvIGFub3RoZXIgdGFibGUsIHdpdGggdGhlIG51bWJlciBvZgorYml0cyB0byBnb2JibGUgaW1wbGljaXQgaW4gdGhlIHNpemUgb2YgdGhlIHRhYmxlLgorCitUYWJsZSBYIGlzIHR3byBiaXRzIGxvbmcgc2luY2UgdGhlIGxvbmdlc3QgY29kZSBzdGFydGluZyB3aXRoIDExMCBpcyBmaXZlIGJpdHMKK2xvbmc6CisKKzAwOiBDLDEKKzAxOiBDLDEKKzEwOiBELDIKKzExOiBFLDIKKworVGFibGUgWSBpcyB0aHJlZSBiaXRzIGxvbmcgc2luY2UgdGhlIGxvbmdlc3QgY29kZSBzdGFydGluZyB3aXRoIDExMSBpcyBzaXgKK2JpdHMgbG9uZzoKKworMDAwOiBGLDIKKzAwMTogRiwyCiswMTA6IEcsMgorMDExOiBHLDIKKzEwMDogSCwyCisxMDE6IEgsMgorMTEwOiBJLDMKKzExMTogSiwzCisKK1NvIHdoYXQgd2UgaGF2ZSBoZXJlIGFyZSB0aHJlZSB0YWJsZXMgd2l0aCBhIHRvdGFsIG9mIDIwIGVudHJpZXMgdGhhdCBoYWQgdG8KK2JlIGNvbnN0cnVjdGVkLiAgVGhhdCdzIGNvbXBhcmVkIHRvIDY0IGVudHJpZXMgZm9yIGEgc2luZ2xlIHRhYmxlLiAgT3IKK2NvbXBhcmVkIHRvIDE2IGVudHJpZXMgZm9yIGEgSHVmZm1hbiB0cmVlIChzaXggdHdvIGVudHJ5IHRhYmxlcyBhbmQgb25lIGZvdXIKK2VudHJ5IHRhYmxlKS4gIEFzc3VtaW5nIHRoYXQgdGhlIGNvZGUgaWRlYWxseSByZXByZXNlbnRzIHRoZSBwcm9iYWJpbGl0eSBvZgordGhlIHN5bWJvbHMsIGl0IHRha2VzIG9uIHRoZSBhdmVyYWdlIDEuMjUgbG9va3VwcyBwZXIgc3ltYm9sLiAgVGhhdCdzIGNvbXBhcmVkCit0byBvbmUgbG9va3VwIGZvciB0aGUgc2luZ2xlIHRhYmxlLCBvciAxLjY2IGxvb2t1cHMgcGVyIHN5bWJvbCBmb3IgdGhlCitIdWZmbWFuIHRyZWUuCisKK1RoZXJlLCBJIHRoaW5rIHRoYXQgZ2l2ZXMgeW91IGEgcGljdHVyZSBvZiB3aGF0J3MgZ29pbmcgb24uICBGb3IgaW5mbGF0ZSwgdGhlCittZWFuaW5nIG9mIGEgcGFydGljdWxhciBzeW1ib2wgaXMgb2Z0ZW4gbW9yZSB0aGFuIGp1c3QgYSBsZXR0ZXIuICBJdCBjYW4gYmUgYQorYnl0ZSAoYSAibGl0ZXJhbCIpLCBvciBpdCBjYW4gYmUgZWl0aGVyIGEgbGVuZ3RoIG9yIGEgZGlzdGFuY2Ugd2hpY2gKK2luZGljYXRlcyBhIGJhc2UgdmFsdWUgYW5kIGEgbnVtYmVyIG9mIGJpdHMgdG8gZmV0Y2ggYWZ0ZXIgdGhlIGNvZGUgdGhhdCBpcworYWRkZWQgdG8gdGhlIGJhc2UgdmFsdWUuICBPciBpdCBtaWdodCBiZSB0aGUgc3BlY2lhbCBlbmQtb2YtYmxvY2sgY29kZS4gIFRoZQorZGF0YSBzdHJ1Y3R1cmVzIGNyZWF0ZWQgaW4gaW5mdHJlZXMuYyB0cnkgdG8gZW5jb2RlIGFsbCB0aGF0IGluZm9ybWF0aW9uCitjb21wYWN0bHkgaW4gdGhlIHRhYmxlcy4KKworCitKZWFuLWxvdXAgR2FpbGx5ICAgICAgICBNYXJrIEFkbGVyCitqbG91cEBnemlwLm9yZyAgICAgICAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CisKKworUmVmZXJlbmNlczoKKworW0xaNzddIFppdiBKLiwgTGVtcGVsIEEuLCBgYEEgVW5pdmVyc2FsIEFsZ29yaXRobSBmb3IgU2VxdWVudGlhbCBEYXRhCitDb21wcmVzc2lvbiwnJyBJRUVFIFRyYW5zYWN0aW9ucyBvbiBJbmZvcm1hdGlvbiBUaGVvcnksIFZvbC4gMjMsIE5vLiAzLAorcHAuIDMzNy0zNDMuCisKK2BgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24nJyBhdmFpbGFibGUgaW4KK2h0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzE5NTEKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2RvYy9yZmMxOTUwLnR4dCBiL3psaWIvc3JjL2RvYy9yZmMxOTUwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTY0MjhhCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvZG9jL3JmYzE5NTAudHh0CkBAIC0wLDAgKzEsNjE5IEBACisKKworCisKKworCitOZXR3b3JrIFdvcmtpbmcgR3JvdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAuIERldXRzY2gKK1JlcXVlc3QgZm9yIENvbW1lbnRzOiAxOTUwICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxhZGRpbiBFbnRlcnByaXNlcworQ2F0ZWdvcnk6IEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEotTC4gR2FpbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mby1aSVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXkgMTk5NgorCisKKyAgICAgICAgIFpMSUIgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uIHZlcnNpb24gMy4zCisKK1N0YXR1cyBvZiBUaGlzIE1lbW8KKworICAgVGhpcyBtZW1vIHByb3ZpZGVzIGluZm9ybWF0aW9uIGZvciB0aGUgSW50ZXJuZXQgY29tbXVuaXR5LiAgVGhpcyBtZW1vCisgICBkb2VzIG5vdCBzcGVjaWZ5IGFuIEludGVybmV0IHN0YW5kYXJkIG9mIGFueSBraW5kLiAgRGlzdHJpYnV0aW9uIG9mCisgICB0aGlzIG1lbW8gaXMgdW5saW1pdGVkLgorCitJRVNHIE5vdGU6CisKKyAgIFRoZSBJRVNHIHRha2VzIG5vIHBvc2l0aW9uIG9uIHRoZSB2YWxpZGl0eSBvZiBhbnkgSW50ZWxsZWN0dWFsCisgICBQcm9wZXJ0eSBSaWdodHMgc3RhdGVtZW50cyBjb250YWluZWQgaW4gdGhpcyBkb2N1bWVudC4KKworTm90aWNlcworCisgICBDb3B5cmlnaHQgKGMpIDE5OTYgTC4gUGV0ZXIgRGV1dHNjaCBhbmQgSmVhbi1Mb3VwIEdhaWxseQorCisgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGlzIGRvY3VtZW50IGZvciBhbnkKKyAgIHB1cnBvc2UgYW5kIHdpdGhvdXQgY2hhcmdlLCBpbmNsdWRpbmcgdHJhbnNsYXRpb25zIGludG8gb3RoZXIKKyAgIGxhbmd1YWdlcyBhbmQgaW5jb3Jwb3JhdGlvbiBpbnRvIGNvbXBpbGF0aW9ucywgcHJvdmlkZWQgdGhhdCB0aGUKKyAgIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQsIGFuZCB0aGF0IGFueQorICAgc3Vic3RhbnRpdmUgY2hhbmdlcyBvciBkZWxldGlvbnMgZnJvbSB0aGUgb3JpZ2luYWwgYXJlIGNsZWFybHkKKyAgIG1hcmtlZC4KKworICAgQSBwb2ludGVyIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24gaW4KKyAgIEhUTUwgZm9ybWF0IGNhbiBiZSBmb3VuZCBhdCB0aGUgVVJMCisgICA8ZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9wbmcvZG9jdW1lbnRzL3psaWIvemRvYy1pbmRleC5odG1sPi4KKworQWJzdHJhY3QKKworICAgVGhpcyBzcGVjaWZpY2F0aW9uIGRlZmluZXMgYSBsb3NzbGVzcyBjb21wcmVzc2VkIGRhdGEgZm9ybWF0LiAgVGhlCisgICBkYXRhIGNhbiBiZSBwcm9kdWNlZCBvciBjb25zdW1lZCwgZXZlbiBmb3IgYW4gYXJiaXRyYXJpbHkgbG9uZworICAgc2VxdWVudGlhbGx5IHByZXNlbnRlZCBpbnB1dCBkYXRhIHN0cmVhbSwgdXNpbmcgb25seSBhbiBhIHByaW9yaQorICAgYm91bmRlZCBhbW91bnQgb2YgaW50ZXJtZWRpYXRlIHN0b3JhZ2UuICBUaGUgZm9ybWF0IHByZXNlbnRseSB1c2VzCisgICB0aGUgREVGTEFURSBjb21wcmVzc2lvbiBtZXRob2QgYnV0IGNhbiBiZSBlYXNpbHkgZXh0ZW5kZWQgdG8gdXNlCisgICBvdGhlciBjb21wcmVzc2lvbiBtZXRob2RzLiAgSXQgY2FuIGJlIGltcGxlbWVudGVkIHJlYWRpbHkgaW4gYSBtYW5uZXIKKyAgIG5vdCBjb3ZlcmVkIGJ5IHBhdGVudHMuICBUaGlzIHNwZWNpZmljYXRpb24gYWxzbyBkZWZpbmVzIHRoZSBBRExFUi0zMgorICAgY2hlY2tzdW0gKGFuIGV4dGVuc2lvbiBhbmQgaW1wcm92ZW1lbnQgb2YgdGhlIEZsZXRjaGVyIGNoZWNrc3VtKSwKKyAgIHVzZWQgZm9yIGRldGVjdGlvbiBvZiBkYXRhIGNvcnJ1cHRpb24sIGFuZCBwcm92aWRlcyBhbiBhbGdvcml0aG0gZm9yCisgICBjb21wdXRpbmcgaXQuCisKKworCisKK0RldXRzY2ggJiBHYWlsbHkgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxXQorDAorUkZDIDE5NTAgICAgICAgWkxJQiBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICAgIE1heSAxOTk2CisKKworVGFibGUgb2YgQ29udGVudHMKKworICAgMS4gSW50cm9kdWN0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAyCisgICAgICAxLjEuIFB1cnBvc2UgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDIKKyAgICAgIDEuMi4gSW50ZW5kZWQgYXVkaWVuY2UgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMworICAgICAgMS4zLiBTY29wZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAzCisgICAgICAxLjQuIENvbXBsaWFuY2UgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDMKKyAgICAgIDEuNS4gIERlZmluaXRpb25zIG9mIHRlcm1zIGFuZCBjb252ZW50aW9ucyB1c2VkIC4uLi4uLi4uLi4uLi4uLi4gMworICAgICAgMS42LiBDaGFuZ2VzIGZyb20gcHJldmlvdXMgdmVyc2lvbnMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAzCisgICAyLiBEZXRhaWxlZCBzcGVjaWZpY2F0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDMKKyAgICAgIDIuMS4gT3ZlcmFsbCBjb252ZW50aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMworICAgICAgMi4yLiBEYXRhIGZvcm1hdCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiA0CisgICAgICAyLjMuIENvbXBsaWFuY2UgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDcKKyAgIDMuIFJlZmVyZW5jZXMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gNworICAgNC4gU291cmNlIGNvZGUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiA4CisgICA1LiBTZWN1cml0eSBDb25zaWRlcmF0aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDgKKyAgIDYuIEFja25vd2xlZGdlbWVudHMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gOAorICAgNy4gQXV0aG9ycycgQWRkcmVzc2VzIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiA4CisgICA4LiBBcHBlbmRpeDogUmF0aW9uYWxlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDkKKyAgIDkuIEFwcGVuZGl4OiBTYW1wbGUgY29kZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4xMAorCisxLiBJbnRyb2R1Y3Rpb24KKworICAgMS4xLiBQdXJwb3NlCisKKyAgICAgIFRoZSBwdXJwb3NlIG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyB0byBkZWZpbmUgYSBsb3NzbGVzcworICAgICAgY29tcHJlc3NlZCBkYXRhIGZvcm1hdCB0aGF0OgorCisgICAgICAgICAgKiBJcyBpbmRlcGVuZGVudCBvZiBDUFUgdHlwZSwgb3BlcmF0aW5nIHN5c3RlbSwgZmlsZSBzeXN0ZW0sCisgICAgICAgICAgICBhbmQgY2hhcmFjdGVyIHNldCwgYW5kIGhlbmNlIGNhbiBiZSB1c2VkIGZvciBpbnRlcmNoYW5nZTsKKworICAgICAgICAgICogQ2FuIGJlIHByb2R1Y2VkIG9yIGNvbnN1bWVkLCBldmVuIGZvciBhbiBhcmJpdHJhcmlseSBsb25nCisgICAgICAgICAgICBzZXF1ZW50aWFsbHkgcHJlc2VudGVkIGlucHV0IGRhdGEgc3RyZWFtLCB1c2luZyBvbmx5IGFuIGEKKyAgICAgICAgICAgIHByaW9yaSBib3VuZGVkIGFtb3VudCBvZiBpbnRlcm1lZGlhdGUgc3RvcmFnZSwgYW5kIGhlbmNlIGNhbgorICAgICAgICAgICAgYmUgdXNlZCBpbiBkYXRhIGNvbW11bmljYXRpb25zIG9yIHNpbWlsYXIgc3RydWN0dXJlcyBzdWNoIGFzCisgICAgICAgICAgICBVbml4IGZpbHRlcnM7CisKKyAgICAgICAgICAqIENhbiB1c2UgYSBudW1iZXIgb2YgZGlmZmVyZW50IGNvbXByZXNzaW9uIG1ldGhvZHM7CisKKyAgICAgICAgICAqIENhbiBiZSBpbXBsZW1lbnRlZCByZWFkaWx5IGluIGEgbWFubmVyIG5vdCBjb3ZlcmVkIGJ5CisgICAgICAgICAgICBwYXRlbnRzLCBhbmQgaGVuY2UgY2FuIGJlIHByYWN0aWNlZCBmcmVlbHkuCisKKyAgICAgIFRoZSBkYXRhIGZvcm1hdCBkZWZpbmVkIGJ5IHRoaXMgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBhdHRlbXB0IHRvCisgICAgICBhbGxvdyByYW5kb20gYWNjZXNzIHRvIGNvbXByZXNzZWQgZGF0YS4KKworCisKKworCisKKworRGV1dHNjaCAmIEdhaWxseSAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDJdCisMCitSRkMgMTk1MCAgICAgICBaTElCIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgTWF5IDE5OTYKKworCisgICAxLjIuIEludGVuZGVkIGF1ZGllbmNlCisKKyAgICAgIFRoaXMgc3BlY2lmaWNhdGlvbiBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IGltcGxlbWVudG9ycyBvZiBzb2Z0d2FyZQorICAgICAgdG8gY29tcHJlc3MgZGF0YSBpbnRvIHpsaWIgZm9ybWF0IGFuZC9vciBkZWNvbXByZXNzIGRhdGEgZnJvbSB6bGliCisgICAgICBmb3JtYXQuCisKKyAgICAgIFRoZSB0ZXh0IG9mIHRoZSBzcGVjaWZpY2F0aW9uIGFzc3VtZXMgYSBiYXNpYyBiYWNrZ3JvdW5kIGluCisgICAgICBwcm9ncmFtbWluZyBhdCB0aGUgbGV2ZWwgb2YgYml0cyBhbmQgb3RoZXIgcHJpbWl0aXZlIGRhdGEKKyAgICAgIHJlcHJlc2VudGF0aW9ucy4KKworICAgMS4zLiBTY29wZQorCisgICAgICBUaGUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IHRoYXQgY2FuIGJlCisgICAgICB1c2VkIGZvciBpbi1tZW1vcnkgY29tcHJlc3Npb24gb2YgYSBzZXF1ZW5jZSBvZiBhcmJpdHJhcnkgYnl0ZXMuCisKKyAgIDEuNC4gQ29tcGxpYW5jZQorCisgICAgICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgYSBjb21wbGlhbnQgZGVjb21wcmVzc29yIG11c3QgYmUKKyAgICAgIGFibGUgdG8gYWNjZXB0IGFuZCBkZWNvbXByZXNzIGFueSBkYXRhIHNldCB0aGF0IGNvbmZvcm1zIHRvIGFsbAorICAgICAgdGhlIHNwZWNpZmljYXRpb25zIHByZXNlbnRlZCBoZXJlOyBhIGNvbXBsaWFudCBjb21wcmVzc29yIG11c3QKKyAgICAgIHByb2R1Y2UgZGF0YSBzZXRzIHRoYXQgY29uZm9ybSB0byBhbGwgdGhlIHNwZWNpZmljYXRpb25zIHByZXNlbnRlZAorICAgICAgaGVyZS4KKworICAgMS41LiAgRGVmaW5pdGlvbnMgb2YgdGVybXMgYW5kIGNvbnZlbnRpb25zIHVzZWQKKworICAgICAgYnl0ZTogOCBiaXRzIHN0b3JlZCBvciB0cmFuc21pdHRlZCBhcyBhIHVuaXQgKHNhbWUgYXMgYW4gb2N0ZXQpLgorICAgICAgKEZvciB0aGlzIHNwZWNpZmljYXRpb24sIGEgYnl0ZSBpcyBleGFjdGx5IDggYml0cywgZXZlbiBvbgorICAgICAgbWFjaGluZXMgd2hpY2ggc3RvcmUgYSBjaGFyYWN0ZXIgb24gYSBudW1iZXIgb2YgYml0cyBkaWZmZXJlbnQKKyAgICAgIGZyb20gOC4pIFNlZSBiZWxvdywgZm9yIHRoZSBudW1iZXJpbmcgb2YgYml0cyB3aXRoaW4gYSBieXRlLgorCisgICAxLjYuIENoYW5nZXMgZnJvbSBwcmV2aW91cyB2ZXJzaW9ucworCisgICAgICBWZXJzaW9uIDMuMSB3YXMgdGhlIGZpcnN0IHB1YmxpYyByZWxlYXNlIG9mIHRoaXMgc3BlY2lmaWNhdGlvbi4KKyAgICAgIEluIHZlcnNpb24gMy4yLCBzb21lIHRlcm1pbm9sb2d5IHdhcyBjaGFuZ2VkIGFuZCB0aGUgQWRsZXItMzIKKyAgICAgIHNhbXBsZSBjb2RlIHdhcyByZXdyaXR0ZW4gZm9yIGNsYXJpdHkuICBJbiB2ZXJzaW9uIDMuMywgdGhlCisgICAgICBzdXBwb3J0IGZvciBhIHByZXNldCBkaWN0aW9uYXJ5IHdhcyBpbnRyb2R1Y2VkLCBhbmQgdGhlCisgICAgICBzcGVjaWZpY2F0aW9uIHdhcyBjb252ZXJ0ZWQgdG8gUkZDIHN0eWxlLgorCisyLiBEZXRhaWxlZCBzcGVjaWZpY2F0aW9uCisKKyAgIDIuMS4gT3ZlcmFsbCBjb252ZW50aW9ucworCisgICAgICBJbiB0aGUgZGlhZ3JhbXMgYmVsb3csIGEgYm94IGxpa2UgdGhpczoKKworICAgICAgICAgKy0tLSsKKyAgICAgICAgIHwgICB8IDwtLSB0aGUgdmVydGljYWwgYmFycyBtaWdodCBiZSBtaXNzaW5nCisgICAgICAgICArLS0tKworCisKKworCitEZXV0c2NoICYgR2FpbGx5ICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgM10KKwwKK1JGQyAxOTUwICAgICAgIFpMSUIgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICBNYXkgMTk5NgorCisKKyAgICAgIHJlcHJlc2VudHMgb25lIGJ5dGU7IGEgYm94IGxpa2UgdGhpczoKKworICAgICAgICAgKz09PT09PT09PT09PT09KworICAgICAgICAgfCAgICAgICAgICAgICAgfAorICAgICAgICAgKz09PT09PT09PT09PT09KworCisgICAgICByZXByZXNlbnRzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGJ5dGVzLgorCisgICAgICBCeXRlcyBzdG9yZWQgd2l0aGluIGEgY29tcHV0ZXIgZG8gbm90IGhhdmUgYSAiYml0IG9yZGVyIiwgc2luY2UKKyAgICAgIHRoZXkgYXJlIGFsd2F5cyB0cmVhdGVkIGFzIGEgdW5pdC4gIEhvd2V2ZXIsIGEgYnl0ZSBjb25zaWRlcmVkIGFzCisgICAgICBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1IGRvZXMgaGF2ZSBhIG1vc3QtIGFuZCBsZWFzdC0KKyAgICAgIHNpZ25pZmljYW50IGJpdCwgYW5kIHNpbmNlIHdlIHdyaXRlIG51bWJlcnMgd2l0aCB0aGUgbW9zdC0KKyAgICAgIHNpZ25pZmljYW50IGRpZ2l0IG9uIHRoZSBsZWZ0LCB3ZSBhbHNvIHdyaXRlIGJ5dGVzIHdpdGggdGhlIG1vc3QtCisgICAgICBzaWduaWZpY2FudCBiaXQgb24gdGhlIGxlZnQuICBJbiB0aGUgZGlhZ3JhbXMgYmVsb3csIHdlIG51bWJlciB0aGUKKyAgICAgIGJpdHMgb2YgYSBieXRlIHNvIHRoYXQgYml0IDAgaXMgdGhlIGxlYXN0LXNpZ25pZmljYW50IGJpdCwgaS5lLiwKKyAgICAgIHRoZSBiaXRzIGFyZSBudW1iZXJlZDoKKworICAgICAgICAgKy0tLS0tLS0tKworICAgICAgICAgfDc2NTQzMjEwfAorICAgICAgICAgKy0tLS0tLS0tKworCisgICAgICBXaXRoaW4gYSBjb21wdXRlciwgYSBudW1iZXIgbWF5IG9jY3VweSBtdWx0aXBsZSBieXRlcy4gIEFsbAorICAgICAgbXVsdGktYnl0ZSBudW1iZXJzIGluIHRoZSBmb3JtYXQgZGVzY3JpYmVkIGhlcmUgYXJlIHN0b3JlZCB3aXRoCisgICAgICB0aGUgTU9TVC1zaWduaWZpY2FudCBieXRlIGZpcnN0IChhdCB0aGUgbG93ZXIgbWVtb3J5IGFkZHJlc3MpLgorICAgICAgRm9yIGV4YW1wbGUsIHRoZSBkZWNpbWFsIG51bWJlciA1MjAgaXMgc3RvcmVkIGFzOgorCisgICAgICAgICAgICAgMCAgICAgMQorICAgICAgICAgKy0tLS0tLS0tKy0tLS0tLS0tKworICAgICAgICAgfDAwMDAwMDEwfDAwMDAxMDAwfAorICAgICAgICAgKy0tLS0tLS0tKy0tLS0tLS0tKworICAgICAgICAgIF4gICAgICAgIF4KKyAgICAgICAgICB8ICAgICAgICB8CisgICAgICAgICAgfCAgICAgICAgKyBsZXNzIHNpZ25pZmljYW50IGJ5dGUgPSA4CisgICAgICAgICAgKyBtb3JlIHNpZ25pZmljYW50IGJ5dGUgPSAyIHggMjU2CisKKyAgIDIuMi4gRGF0YSBmb3JtYXQKKworICAgICAgQSB6bGliIHN0cmVhbSBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisKKyAgICAgICAgICAgMCAgIDEKKyAgICAgICAgICstLS0rLS0tKworICAgICAgICAgfENNRnxGTEd8ICAgKG1vcmUtLT4pCisgICAgICAgICArLS0tKy0tLSsKKworCisKKworCisKKworCitEZXV0c2NoICYgR2FpbGx5ICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgNF0KKwwKK1JGQyAxOTUwICAgICAgIFpMSUIgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICBNYXkgMTk5NgorCisKKyAgICAgIChpZiBGTEcuRkRJQ1Qgc2V0KQorCisgICAgICAgICAgIDAgICAxICAgMiAgIDMKKyAgICAgICAgICstLS0rLS0tKy0tLSstLS0rCisgICAgICAgICB8ICAgICBESUNUSUQgICAgfCAgIChtb3JlLS0+KQorICAgICAgICAgKy0tLSstLS0rLS0tKy0tLSsKKworICAgICAgICAgKz09PT09PT09PT09PT09PT09PT09PSstLS0rLS0tKy0tLSstLS0rCisgICAgICAgICB8Li4uY29tcHJlc3NlZCBkYXRhLi4ufCAgICBBRExFUjMyICAgIHwKKyAgICAgICAgICs9PT09PT09PT09PT09PT09PT09PT0rLS0tKy0tLSstLS0rLS0tKworCisgICAgICBBbnkgZGF0YSB3aGljaCBtYXkgYXBwZWFyIGFmdGVyIEFETEVSMzIgYXJlIG5vdCBwYXJ0IG9mIHRoZSB6bGliCisgICAgICBzdHJlYW0uCisKKyAgICAgIENNRiAoQ29tcHJlc3Npb24gTWV0aG9kIGFuZCBmbGFncykKKyAgICAgICAgIFRoaXMgYnl0ZSBpcyBkaXZpZGVkIGludG8gYSA0LWJpdCBjb21wcmVzc2lvbiBtZXRob2QgYW5kIGEgNC0KKyAgICAgICAgIGJpdCBpbmZvcm1hdGlvbiBmaWVsZCBkZXBlbmRpbmcgb24gdGhlIGNvbXByZXNzaW9uIG1ldGhvZC4KKworICAgICAgICAgICAgYml0cyAwIHRvIDMgIENNICAgICBDb21wcmVzc2lvbiBtZXRob2QKKyAgICAgICAgICAgIGJpdHMgNCB0byA3ICBDSU5GTyAgQ29tcHJlc3Npb24gaW5mbworCisgICAgICBDTSAoQ29tcHJlc3Npb24gbWV0aG9kKQorICAgICAgICAgVGhpcyBpZGVudGlmaWVzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgdXNlZCBpbiB0aGUgZmlsZS4gQ00gPSA4CisgICAgICAgICBkZW5vdGVzIHRoZSAiZGVmbGF0ZSIgY29tcHJlc3Npb24gbWV0aG9kIHdpdGggYSB3aW5kb3cgc2l6ZSB1cAorICAgICAgICAgdG8gMzJLLiAgVGhpcyBpcyB0aGUgbWV0aG9kIHVzZWQgYnkgZ3ppcCBhbmQgUE5HIChzZWUKKyAgICAgICAgIHJlZmVyZW5jZXMgWzFdIGFuZCBbMl0gaW4gQ2hhcHRlciAzLCBiZWxvdywgZm9yIHRoZSByZWZlcmVuY2UKKyAgICAgICAgIGRvY3VtZW50cykuICBDTSA9IDE1IGlzIHJlc2VydmVkLiAgSXQgbWlnaHQgYmUgdXNlZCBpbiBhIGZ1dHVyZQorICAgICAgICAgdmVyc2lvbiBvZiB0aGlzIHNwZWNpZmljYXRpb24gdG8gaW5kaWNhdGUgdGhlIHByZXNlbmNlIG9mIGFuCisgICAgICAgICBleHRyYSBmaWVsZCBiZWZvcmUgdGhlIGNvbXByZXNzZWQgZGF0YS4KKworICAgICAgQ0lORk8gKENvbXByZXNzaW9uIGluZm8pCisgICAgICAgICBGb3IgQ00gPSA4LCBDSU5GTyBpcyB0aGUgYmFzZS0yIGxvZ2FyaXRobSBvZiB0aGUgTFo3NyB3aW5kb3cKKyAgICAgICAgIHNpemUsIG1pbnVzIGVpZ2h0IChDSU5GTz03IGluZGljYXRlcyBhIDMySyB3aW5kb3cgc2l6ZSkuIFZhbHVlcworICAgICAgICAgb2YgQ0lORk8gYWJvdmUgNyBhcmUgbm90IGFsbG93ZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZQorICAgICAgICAgc3BlY2lmaWNhdGlvbi4gIENJTkZPIGlzIG5vdCBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBmb3IKKyAgICAgICAgIENNIG5vdCBlcXVhbCB0byA4LgorCisgICAgICBGTEcgKEZMYUdzKQorICAgICAgICAgVGhpcyBmbGFnIGJ5dGUgaXMgZGl2aWRlZCBhcyBmb2xsb3dzOgorCisgICAgICAgICAgICBiaXRzIDAgdG8gNCAgRkNIRUNLICAoY2hlY2sgYml0cyBmb3IgQ01GIGFuZCBGTEcpCisgICAgICAgICAgICBiaXQgIDUgICAgICAgRkRJQ1QgICAocHJlc2V0IGRpY3Rpb25hcnkpCisgICAgICAgICAgICBiaXRzIDYgdG8gNyAgRkxFVkVMICAoY29tcHJlc3Npb24gbGV2ZWwpCisKKyAgICAgICAgIFRoZSBGQ0hFQ0sgdmFsdWUgbXVzdCBiZSBzdWNoIHRoYXQgQ01GIGFuZCBGTEcsIHdoZW4gdmlld2VkIGFzCisgICAgICAgICBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHN0b3JlZCBpbiBNU0Igb3JkZXIgKENNRioyNTYgKyBGTEcpLAorICAgICAgICAgaXMgYSBtdWx0aXBsZSBvZiAzMS4KKworCisKKworRGV1dHNjaCAmIEdhaWxseSAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDVdCisMCitSRkMgMTk1MCAgICAgICBaTElCIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgTWF5IDE5OTYKKworCisgICAgICBGRElDVCAoUHJlc2V0IGRpY3Rpb25hcnkpCisgICAgICAgICBJZiBGRElDVCBpcyBzZXQsIGEgRElDVCBkaWN0aW9uYXJ5IGlkZW50aWZpZXIgaXMgcHJlc2VudAorICAgICAgICAgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIEZMRyBieXRlLiBUaGUgZGljdGlvbmFyeSBpcyBhIHNlcXVlbmNlIG9mCisgICAgICAgICBieXRlcyB3aGljaCBhcmUgaW5pdGlhbGx5IGZlZCB0byB0aGUgY29tcHJlc3NvciB3aXRob3V0CisgICAgICAgICBwcm9kdWNpbmcgYW55IGNvbXByZXNzZWQgb3V0cHV0LiBESUNUIGlzIHRoZSBBZGxlci0zMiBjaGVja3N1bQorICAgICAgICAgb2YgdGhpcyBzZXF1ZW5jZSBvZiBieXRlcyAoc2VlIHRoZSBkZWZpbml0aW9uIG9mIEFETEVSMzIKKyAgICAgICAgIGJlbG93KS4gIFRoZSBkZWNvbXByZXNzb3IgY2FuIHVzZSB0aGlzIGlkZW50aWZpZXIgdG8gZGV0ZXJtaW5lCisgICAgICAgICB3aGljaCBkaWN0aW9uYXJ5IGhhcyBiZWVuIHVzZWQgYnkgdGhlIGNvbXByZXNzb3IuCisKKyAgICAgIEZMRVZFTCAoQ29tcHJlc3Npb24gbGV2ZWwpCisgICAgICAgICBUaGVzZSBmbGFncyBhcmUgYXZhaWxhYmxlIGZvciB1c2UgYnkgc3BlY2lmaWMgY29tcHJlc3Npb24KKyAgICAgICAgIG1ldGhvZHMuICBUaGUgImRlZmxhdGUiIG1ldGhvZCAoQ00gPSA4KSBzZXRzIHRoZXNlIGZsYWdzIGFzCisgICAgICAgICBmb2xsb3dzOgorCisgICAgICAgICAgICAwIC0gY29tcHJlc3NvciB1c2VkIGZhc3Rlc3QgYWxnb3JpdGhtCisgICAgICAgICAgICAxIC0gY29tcHJlc3NvciB1c2VkIGZhc3QgYWxnb3JpdGhtCisgICAgICAgICAgICAyIC0gY29tcHJlc3NvciB1c2VkIGRlZmF1bHQgYWxnb3JpdGhtCisgICAgICAgICAgICAzIC0gY29tcHJlc3NvciB1c2VkIG1heGltdW0gY29tcHJlc3Npb24sIHNsb3dlc3QgYWxnb3JpdGhtCisKKyAgICAgICAgIFRoZSBpbmZvcm1hdGlvbiBpbiBGTEVWRUwgaXMgbm90IG5lZWRlZCBmb3IgZGVjb21wcmVzc2lvbjsgaXQKKyAgICAgICAgIGlzIHRoZXJlIHRvIGluZGljYXRlIGlmIHJlY29tcHJlc3Npb24gbWlnaHQgYmUgd29ydGh3aGlsZS4KKworICAgICAgY29tcHJlc3NlZCBkYXRhCisgICAgICAgICBGb3IgY29tcHJlc3Npb24gbWV0aG9kIDgsIHRoZSBjb21wcmVzc2VkIGRhdGEgaXMgc3RvcmVkIGluIHRoZQorICAgICAgICAgZGVmbGF0ZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IGFzIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnQKKyAgICAgICAgICJERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiIgYnkgTC4gUGV0ZXIKKyAgICAgICAgIERldXRzY2guIChTZWUgcmVmZXJlbmNlIFszXSBpbiBDaGFwdGVyIDMsIGJlbG93KQorCisgICAgICAgICBPdGhlciBjb21wcmVzc2VkIGRhdGEgZm9ybWF0cyBhcmUgbm90IHNwZWNpZmllZCBpbiB0aGlzIHZlcnNpb24KKyAgICAgICAgIG9mIHRoZSB6bGliIHNwZWNpZmljYXRpb24uCisKKyAgICAgIEFETEVSMzIgKEFkbGVyLTMyIGNoZWNrc3VtKQorICAgICAgICAgVGhpcyBjb250YWlucyBhIGNoZWNrc3VtIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YQorICAgICAgICAgKGV4Y2x1ZGluZyBhbnkgZGljdGlvbmFyeSBkYXRhKSBjb21wdXRlZCBhY2NvcmRpbmcgdG8gQWRsZXItMzIKKyAgICAgICAgIGFsZ29yaXRobS4gVGhpcyBhbGdvcml0aG0gaXMgYSAzMi1iaXQgZXh0ZW5zaW9uIGFuZCBpbXByb3ZlbWVudAorICAgICAgICAgb2YgdGhlIEZsZXRjaGVyIGFsZ29yaXRobSwgdXNlZCBpbiB0aGUgSVRVLVQgWC4yMjQgLyBJU08gODA3MworICAgICAgICAgc3RhbmRhcmQuIFNlZSByZWZlcmVuY2VzIFs0XSBhbmQgWzVdIGluIENoYXB0ZXIgMywgYmVsb3cpCisKKyAgICAgICAgIEFkbGVyLTMyIGlzIGNvbXBvc2VkIG9mIHR3byBzdW1zIGFjY3VtdWxhdGVkIHBlciBieXRlOiBzMSBpcworICAgICAgICAgdGhlIHN1bSBvZiBhbGwgYnl0ZXMsIHMyIGlzIHRoZSBzdW0gb2YgYWxsIHMxIHZhbHVlcy4gQm90aCBzdW1zCisgICAgICAgICBhcmUgZG9uZSBtb2R1bG8gNjU1MjEuIHMxIGlzIGluaXRpYWxpemVkIHRvIDEsIHMyIHRvIHplcm8uICBUaGUKKyAgICAgICAgIEFkbGVyLTMyIGNoZWNrc3VtIGlzIHN0b3JlZCBhcyBzMio2NTUzNiArIHMxIGluIG1vc3QtCisgICAgICAgICBzaWduaWZpY2FudC1ieXRlIGZpcnN0IChuZXR3b3JrKSBvcmRlci4KKworCisKKworCisKKworCitEZXV0c2NoICYgR2FpbGx5ICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgNl0KKwwKK1JGQyAxOTUwICAgICAgIFpMSUIgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICBNYXkgMTk5NgorCisKKyAgIDIuMy4gQ29tcGxpYW5jZQorCisgICAgICBBIGNvbXBsaWFudCBjb21wcmVzc29yIG11c3QgcHJvZHVjZSBzdHJlYW1zIHdpdGggY29ycmVjdCBDTUYsIEZMRworICAgICAgYW5kIEFETEVSMzIsIGJ1dCBuZWVkIG5vdCBzdXBwb3J0IHByZXNldCBkaWN0aW9uYXJpZXMuICBXaGVuIHRoZQorICAgICAgemxpYiBkYXRhIGZvcm1hdCBpcyB1c2VkIGFzIHBhcnQgb2YgYW5vdGhlciBzdGFuZGFyZCBkYXRhIGZvcm1hdCwKKyAgICAgIHRoZSBjb21wcmVzc29yIG1heSB1c2Ugb25seSBwcmVzZXQgZGljdGlvbmFyaWVzIHRoYXQgYXJlIHNwZWNpZmllZAorICAgICAgYnkgdGhpcyBvdGhlciBkYXRhIGZvcm1hdC4gIElmIHRoaXMgb3RoZXIgZm9ybWF0IGRvZXMgbm90IHVzZSB0aGUKKyAgICAgIHByZXNldCBkaWN0aW9uYXJ5IGZlYXR1cmUsIHRoZSBjb21wcmVzc29yIG11c3Qgbm90IHNldCB0aGUgRkRJQ1QKKyAgICAgIGZsYWcuCisKKyAgICAgIEEgY29tcGxpYW50IGRlY29tcHJlc3NvciBtdXN0IGNoZWNrIENNRiwgRkxHLCBhbmQgQURMRVIzMiwgYW5kCisgICAgICBwcm92aWRlIGFuIGVycm9yIGluZGljYXRpb24gaWYgYW55IG9mIHRoZXNlIGhhdmUgaW5jb3JyZWN0IHZhbHVlcy4KKyAgICAgIEEgY29tcGxpYW50IGRlY29tcHJlc3NvciBtdXN0IGdpdmUgYW4gZXJyb3IgaW5kaWNhdGlvbiBpZiBDTSBpcworICAgICAgbm90IG9uZSBvZiB0aGUgdmFsdWVzIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIChvbmx5IHRoZQorICAgICAgdmFsdWUgOCBpcyBwZXJtaXR0ZWQgaW4gdGhpcyB2ZXJzaW9uKSwgc2luY2UgYW5vdGhlciB2YWx1ZSBjb3VsZAorICAgICAgaW5kaWNhdGUgdGhlIHByZXNlbmNlIG9mIG5ldyBmZWF0dXJlcyB0aGF0IHdvdWxkIGNhdXNlIHN1YnNlcXVlbnQKKyAgICAgIGRhdGEgdG8gYmUgaW50ZXJwcmV0ZWQgaW5jb3JyZWN0bHkuICBBIGNvbXBsaWFudCBkZWNvbXByZXNzb3IgbXVzdAorICAgICAgZ2l2ZSBhbiBlcnJvciBpbmRpY2F0aW9uIGlmIEZESUNUIGlzIHNldCBhbmQgRElDVElEIGlzIG5vdCB0aGUKKyAgICAgIGlkZW50aWZpZXIgb2YgYSBrbm93biBwcmVzZXQgZGljdGlvbmFyeS4gIEEgZGVjb21wcmVzc29yIG1heQorICAgICAgaWdub3JlIEZMRVZFTCBhbmQgc3RpbGwgYmUgY29tcGxpYW50LiAgV2hlbiB0aGUgemxpYiBkYXRhIGZvcm1hdAorICAgICAgaXMgYmVpbmcgdXNlZCBhcyBhIHBhcnQgb2YgYW5vdGhlciBzdGFuZGFyZCBmb3JtYXQsIGEgY29tcGxpYW50CisgICAgICBkZWNvbXByZXNzb3IgbXVzdCBzdXBwb3J0IGFsbCB0aGUgcHJlc2V0IGRpY3Rpb25hcmllcyBzcGVjaWZpZWQgYnkKKyAgICAgIHRoZSBvdGhlciBmb3JtYXQuIFdoZW4gdGhlIG90aGVyIGZvcm1hdCBkb2VzIG5vdCB1c2UgdGhlIHByZXNldAorICAgICAgZGljdGlvbmFyeSBmZWF0dXJlLCBhIGNvbXBsaWFudCBkZWNvbXByZXNzb3IgbXVzdCByZWplY3QgYW55CisgICAgICBzdHJlYW0gaW4gd2hpY2ggdGhlIEZESUNUIGZsYWcgaXMgc2V0LgorCiszLiBSZWZlcmVuY2VzCisKKyAgIFsxXSBEZXV0c2NoLCBMLlAuLCJHWklQIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiIsCisgICAgICAgYXZhaWxhYmxlIGluIGZ0cDovL2Z0cC51dS5uZXQvcHViL2FyY2hpdmluZy96aXAvZG9jLworCisgICBbMl0gVGhvbWFzIEJvdXRlbGwsICJQTkcgKFBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MpIHNwZWNpZmljYXRpb24iLAorICAgICAgIGF2YWlsYWJsZSBpbiBmdHA6Ly9mdHAudXUubmV0L2dyYXBoaWNzL3BuZy9kb2N1bWVudHMvCisKKyAgIFszXSBEZXV0c2NoLCBMLlAuLCJERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiIsCisgICAgICAgYXZhaWxhYmxlIGluIGZ0cDovL2Z0cC51dS5uZXQvcHViL2FyY2hpdmluZy96aXAvZG9jLworCisgICBbNF0gRmxldGNoZXIsIEouIEcuLCAiQW4gQXJpdGhtZXRpYyBDaGVja3N1bSBmb3IgU2VyaWFsCisgICAgICAgVHJhbnNtaXNzaW9ucywiIElFRUUgVHJhbnNhY3Rpb25zIG9uIENvbW11bmljYXRpb25zLCBWb2wuIENPTS0zMCwKKyAgICAgICBOby4gMSwgSmFudWFyeSAxOTgyLCBwcC4gMjQ3LTI1Mi4KKworICAgWzVdIElUVS1UIFJlY29tbWVuZGF0aW9uIFguMjI0LCBBbm5leCBELCAiQ2hlY2tzdW0gQWxnb3JpdGhtcywiCisgICAgICAgTm92ZW1iZXIsIDE5OTMsIHBwLiAxNDQsIDE0NS4gKEF2YWlsYWJsZSBmcm9tCisgICAgICAgZ29waGVyOi8vaW5mby5pdHUuY2gpLiBJVFUtVCBYLjI0NCBpcyBhbHNvIHRoZSBzYW1lIGFzIElTTyA4MDczLgorCisKKworCisKKworCitEZXV0c2NoICYgR2FpbGx5ICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgN10KKwwKK1JGQyAxOTUwICAgICAgIFpMSUIgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICBNYXkgMTk5NgorCisKKzQuIFNvdXJjZSBjb2RlCisKKyAgIFNvdXJjZSBjb2RlIGZvciBhIEMgbGFuZ3VhZ2UgaW1wbGVtZW50YXRpb24gb2YgYSAiemxpYiIgY29tcGxpYW50CisgICBsaWJyYXJ5IGlzIGF2YWlsYWJsZSBhdCBmdHA6Ly9mdHAudXUubmV0L3B1Yi9hcmNoaXZpbmcvemlwL3psaWIvLgorCis1LiBTZWN1cml0eSBDb25zaWRlcmF0aW9ucworCisgICBBIGRlY29kZXIgdGhhdCBmYWlscyB0byBjaGVjayB0aGUgQURMRVIzMiBjaGVja3N1bSB2YWx1ZSBtYXkgYmUKKyAgIHN1YmplY3QgdG8gdW5kZXRlY3RlZCBkYXRhIGNvcnJ1cHRpb24uCisKKzYuIEFja25vd2xlZGdlbWVudHMKKworICAgVHJhZGVtYXJrcyBjaXRlZCBpbiB0aGlzIGRvY3VtZW50IGFyZSB0aGUgcHJvcGVydHkgb2YgdGhlaXIKKyAgIHJlc3BlY3RpdmUgb3duZXJzLgorCisgICBKZWFuLUxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyIGRlc2lnbmVkIHRoZSB6bGliIGZvcm1hdCBhbmQgd3JvdGUKKyAgIHRoZSByZWxhdGVkIHNvZnR3YXJlIGRlc2NyaWJlZCBpbiB0aGlzIHNwZWNpZmljYXRpb24uICBHbGVubgorICAgUmFuZGVycy1QZWhyc29uIGNvbnZlcnRlZCB0aGlzIGRvY3VtZW50IHRvIFJGQyBhbmQgSFRNTCBmb3JtYXQuCisKKzcuIEF1dGhvcnMnIEFkZHJlc3NlcworCisgICBMLiBQZXRlciBEZXV0c2NoCisgICBBbGFkZGluIEVudGVycHJpc2VzCisgICAyMDMgU2FudGEgTWFyZ2FyaXRhIEF2ZS4KKyAgIE1lbmxvIFBhcmssIENBIDk0MDI1CisKKyAgIFBob25lOiAoNDE1KSAzMjItMDEwMyAoQU0gb25seSkKKyAgIEZBWDogICAoNDE1KSAzMjItMTczNAorICAgRU1haWw6IDxnaG9zdEBhbGFkZGluLmNvbT4KKworCisgICBKZWFuLUxvdXAgR2FpbGx5CisKKyAgIEVNYWlsOiA8Z3ppcEBwcmVwLmFpLm1pdC5lZHU+CisKKyAgIFF1ZXN0aW9ucyBhYm91dCB0aGUgdGVjaG5pY2FsIGNvbnRlbnQgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGNhbiBiZQorICAgc2VudCBieSBlbWFpbCB0bworCisgICBKZWFuLUxvdXAgR2FpbGx5IDxnemlwQHByZXAuYWkubWl0LmVkdT4gYW5kCisgICBNYXJrIEFkbGVyIDxtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1PgorCisgICBFZGl0b3JpYWwgY29tbWVudHMgb24gdGhpcyBzcGVjaWZpY2F0aW9uIGNhbiBiZSBzZW50IGJ5IGVtYWlsIHRvCisKKyAgIEwuIFBldGVyIERldXRzY2ggPGdob3N0QGFsYWRkaW4uY29tPiBhbmQKKyAgIEdsZW5uIFJhbmRlcnMtUGVocnNvbiA8cmFuZGVnQGFsdW1uaS5ycGkuZWR1PgorCisKKworCisKKworRGV1dHNjaCAmIEdhaWxseSAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDhdCisMCitSRkMgMTk1MCAgICAgICBaTElCIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgTWF5IDE5OTYKKworCis4LiBBcHBlbmRpeDogUmF0aW9uYWxlCisKKyAgIDguMS4gUHJlc2V0IGRpY3Rpb25hcmllcworCisgICAgICBBIHByZXNldCBkaWN0aW9uYXJ5IGlzIHNwZWNpYWxseSB1c2VmdWwgdG8gY29tcHJlc3Mgc2hvcnQgaW5wdXQKKyAgICAgIHNlcXVlbmNlcy4gVGhlIGNvbXByZXNzb3IgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoZSBkaWN0aW9uYXJ5CisgICAgICBjb250ZXh0IHRvIGVuY29kZSB0aGUgaW5wdXQgaW4gYSBtb3JlIGNvbXBhY3QgbWFubmVyLiBUaGUKKyAgICAgIGRlY29tcHJlc3NvciBjYW4gYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgY29udGV4dCBieQorICAgICAgdmlydHVhbGx5IGRlY29tcHJlc3NpbmcgYSBjb21wcmVzc2VkIHZlcnNpb24gb2YgdGhlIGRpY3Rpb25hcnkKKyAgICAgIHdpdGhvdXQgcHJvZHVjaW5nIGFueSBvdXRwdXQuIEhvd2V2ZXIgZm9yIGNlcnRhaW4gY29tcHJlc3Npb24KKyAgICAgIGFsZ29yaXRobXMgc3VjaCBhcyB0aGUgZGVmbGF0ZSBhbGdvcml0aG0gdGhpcyBvcGVyYXRpb24gY2FuIGJlCisgICAgICBhY2hpZXZlZCB3aXRob3V0IGFjdHVhbGx5IHBlcmZvcm1pbmcgYW55IGRlY29tcHJlc3Npb24uCisKKyAgICAgIFRoZSBjb21wcmVzc29yIGFuZCB0aGUgZGVjb21wcmVzc29yIG11c3QgdXNlIGV4YWN0bHkgdGhlIHNhbWUKKyAgICAgIGRpY3Rpb25hcnkuIFRoZSBkaWN0aW9uYXJ5IG1heSBiZSBmaXhlZCBvciBtYXkgYmUgY2hvc2VuIGFtb25nIGEKKyAgICAgIGNlcnRhaW4gbnVtYmVyIG9mIHByZWRlZmluZWQgZGljdGlvbmFyaWVzLCBhY2NvcmRpbmcgdG8gdGhlIGtpbmQKKyAgICAgIG9mIGlucHV0IGRhdGEuIFRoZSBkZWNvbXByZXNzb3IgY2FuIGRldGVybWluZSB3aGljaCBkaWN0aW9uYXJ5IGhhcworICAgICAgYmVlbiBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IgYnkgY2hlY2tpbmcgdGhlIGRpY3Rpb25hcnkKKyAgICAgIGlkZW50aWZpZXIuIFRoaXMgZG9jdW1lbnQgZG9lcyBub3Qgc3BlY2lmeSB0aGUgY29udGVudHMgb2YKKyAgICAgIHByZWRlZmluZWQgZGljdGlvbmFyaWVzLCBzaW5jZSB0aGUgb3B0aW1hbCBkaWN0aW9uYXJpZXMgYXJlCisgICAgICBhcHBsaWNhdGlvbiBzcGVjaWZpYy4gU3RhbmRhcmQgZGF0YSBmb3JtYXRzIHVzaW5nIHRoaXMgZmVhdHVyZSBvZgorICAgICAgdGhlIHpsaWIgc3BlY2lmaWNhdGlvbiBtdXN0IHByZWNpc2VseSBkZWZpbmUgdGhlIGFsbG93ZWQKKyAgICAgIGRpY3Rpb25hcmllcy4KKworICAgOC4yLiBUaGUgQWRsZXItMzIgYWxnb3JpdGhtCisKKyAgICAgIFRoZSBBZGxlci0zMiBhbGdvcml0aG0gaXMgbXVjaCBmYXN0ZXIgdGhhbiB0aGUgQ1JDMzIgYWxnb3JpdGhtIHlldAorICAgICAgc3RpbGwgcHJvdmlkZXMgYW4gZXh0cmVtZWx5IGxvdyBwcm9iYWJpbGl0eSBvZiB1bmRldGVjdGVkIGVycm9ycy4KKworICAgICAgVGhlIG1vZHVsbyBvbiB1bnNpZ25lZCBsb25nIGFjY3VtdWxhdG9ycyBjYW4gYmUgZGVsYXllZCBmb3IgNTU1MgorICAgICAgYnl0ZXMsIHNvIHRoZSBtb2R1bG8gb3BlcmF0aW9uIHRpbWUgaXMgbmVnbGlnaWJsZS4gIElmIHRoZSBieXRlcworICAgICAgYXJlIGEsIGIsIGMsIHRoZSBzZWNvbmQgc3VtIGlzIDNhICsgMmIgKyBjICsgMywgYW5kIHNvIGlzIHBvc2l0aW9uCisgICAgICBhbmQgb3JkZXIgc2Vuc2l0aXZlLCB1bmxpa2UgdGhlIGZpcnN0IHN1bSwgd2hpY2ggaXMganVzdCBhCisgICAgICBjaGVja3N1bS4gIFRoYXQgNjU1MjEgaXMgcHJpbWUgaXMgaW1wb3J0YW50IHRvIGF2b2lkIGEgcG9zc2libGUKKyAgICAgIGxhcmdlIGNsYXNzIG9mIHR3by1ieXRlIGVycm9ycyB0aGF0IGxlYXZlIHRoZSBjaGVjayB1bmNoYW5nZWQuCisgICAgICAoVGhlIEZsZXRjaGVyIGNoZWNrc3VtIHVzZXMgMjU1LCB3aGljaCBpcyBub3QgcHJpbWUgYW5kIHdoaWNoIGFsc28KKyAgICAgIG1ha2VzIHRoZSBGbGV0Y2hlciBjaGVjayBpbnNlbnNpdGl2ZSB0byBzaW5nbGUgYnl0ZSBjaGFuZ2VzIDAgPC0+CisgICAgICAyNTUuKQorCisgICAgICBUaGUgc3VtIHMxIGlzIGluaXRpYWxpemVkIHRvIDEgaW5zdGVhZCBvZiB6ZXJvIHRvIG1ha2UgdGhlIGxlbmd0aAorICAgICAgb2YgdGhlIHNlcXVlbmNlIHBhcnQgb2YgczIsIHNvIHRoYXQgdGhlIGxlbmd0aCBkb2VzIG5vdCBoYXZlIHRvIGJlCisgICAgICBjaGVja2VkIHNlcGFyYXRlbHkuIChBbnkgc2VxdWVuY2Ugb2YgemVyb2VzIGhhcyBhIEZsZXRjaGVyCisgICAgICBjaGVja3N1bSBvZiB6ZXJvLikKKworCisKKworCisKKworCitEZXV0c2NoICYgR2FpbGx5ICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgOV0KKwwKK1JGQyAxOTUwICAgICAgIFpMSUIgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICBNYXkgMTk5NgorCisKKzkuIEFwcGVuZGl4OiBTYW1wbGUgY29kZQorCisgICBUaGUgZm9sbG93aW5nIEMgY29kZSBjb21wdXRlcyB0aGUgQWRsZXItMzIgY2hlY2tzdW0gb2YgYSBkYXRhIGJ1ZmZlci4KKyAgIEl0IGlzIHdyaXR0ZW4gZm9yIGNsYXJpdHksIG5vdCBmb3Igc3BlZWQuICBUaGUgc2FtcGxlIGNvZGUgaXMgaW4gdGhlCisgICBBTlNJIEMgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIE5vbiBDIHVzZXJzIG1heSBmaW5kIGl0IGVhc2llciB0byByZWFkCisgICB3aXRoIHRoZXNlIGhpbnRzOgorCisgICAgICAmICAgICAgQml0d2lzZSBBTkQgb3BlcmF0b3IuCisgICAgICA+PiAgICAgQml0d2lzZSByaWdodCBzaGlmdCBvcGVyYXRvci4gV2hlbiBhcHBsaWVkIHRvIGFuCisgICAgICAgICAgICAgdW5zaWduZWQgcXVhbnRpdHksIGFzIGhlcmUsIHJpZ2h0IHNoaWZ0IGluc2VydHMgemVybyBiaXQocykKKyAgICAgICAgICAgICBhdCB0aGUgbGVmdC4KKyAgICAgIDw8ICAgICBCaXR3aXNlIGxlZnQgc2hpZnQgb3BlcmF0b3IuIExlZnQgc2hpZnQgaW5zZXJ0cyB6ZXJvCisgICAgICAgICAgICAgYml0KHMpIGF0IHRoZSByaWdodC4KKyAgICAgICsrICAgICAibisrIiBpbmNyZW1lbnRzIHRoZSB2YXJpYWJsZSBuLgorICAgICAgJSAgICAgIG1vZHVsbyBvcGVyYXRvcjogYSAlIGIgaXMgdGhlIHJlbWFpbmRlciBvZiBhIGRpdmlkZWQgYnkgYi4KKworICAgICAgI2RlZmluZSBCQVNFIDY1NTIxIC8qIGxhcmdlc3QgcHJpbWUgc21hbGxlciB0aGFuIDY1NTM2ICovCisKKyAgICAgIC8qCisgICAgICAgICBVcGRhdGUgYSBydW5uaW5nIEFkbGVyLTMyIGNoZWNrc3VtIHdpdGggdGhlIGJ5dGVzIGJ1ZlswLi5sZW4tMV0KKyAgICAgICBhbmQgcmV0dXJuIHRoZSB1cGRhdGVkIGNoZWNrc3VtLiBUaGUgQWRsZXItMzIgY2hlY2tzdW0gc2hvdWxkIGJlCisgICAgICAgaW5pdGlhbGl6ZWQgdG8gMS4KKworICAgICAgIFVzYWdlIGV4YW1wbGU6CisKKyAgICAgICAgIHVuc2lnbmVkIGxvbmcgYWRsZXIgPSAxTDsKKworICAgICAgICAgd2hpbGUgKHJlYWRfYnVmZmVyKGJ1ZmZlciwgbGVuZ3RoKSAhPSBFT0YpIHsKKyAgICAgICAgICAgYWRsZXIgPSB1cGRhdGVfYWRsZXIzMihhZGxlciwgYnVmZmVyLCBsZW5ndGgpOworICAgICAgICAgfQorICAgICAgICAgaWYgKGFkbGVyICE9IG9yaWdpbmFsX2FkbGVyKSBlcnJvcigpOworICAgICAgKi8KKyAgICAgIHVuc2lnbmVkIGxvbmcgdXBkYXRlX2FkbGVyMzIodW5zaWduZWQgbG9uZyBhZGxlciwKKyAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKKyAgICAgIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBzMSA9IGFkbGVyICYgMHhmZmZmOworICAgICAgICB1bnNpZ25lZCBsb25nIHMyID0gKGFkbGVyID4+IDE2KSAmIDB4ZmZmZjsKKyAgICAgICAgaW50IG47CisKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IGxlbjsgbisrKSB7CisgICAgICAgICAgczEgPSAoczEgKyBidWZbbl0pICUgQkFTRTsKKyAgICAgICAgICBzMiA9IChzMiArIHMxKSAgICAgJSBCQVNFOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoczIgPDwgMTYpICsgczE7CisgICAgICB9CisKKyAgICAgIC8qIFJldHVybiB0aGUgYWRsZXIzMiBvZiB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXSAqLworCisKKworCitEZXV0c2NoICYgR2FpbGx5ICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxMF0KKwwKK1JGQyAxOTUwICAgICAgIFpMSUIgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICBNYXkgMTk5NgorCisKKyAgICAgIHVuc2lnbmVkIGxvbmcgYWRsZXIzMih1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCisgICAgICB7CisgICAgICAgIHJldHVybiB1cGRhdGVfYWRsZXIzMigxTCwgYnVmLCBsZW4pOworICAgICAgfQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK0RldXRzY2ggJiBHYWlsbHkgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDExXQorDApkaWZmIC0tZ2l0IGEvemxpYi9zcmMvZG9jL3JmYzE5NTEudHh0IGIvemxpYi9zcmMvZG9jL3JmYzE5NTEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwM2M4YzcKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9kb2MvcmZjMTk1MS50eHQKQEAgLTAsMCArMSw5NTUgQEAKKworCisKKworCisKK05ldHdvcmsgV29ya2luZyBHcm91cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUC4gRGV1dHNjaAorUmVxdWVzdCBmb3IgQ29tbWVudHM6IDE5NTEgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGFkZGluIEVudGVycHJpc2VzCitDYXRlZ29yeTogSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF5IDE5OTYKKworCisgICAgICAgIERFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4zCisKK1N0YXR1cyBvZiBUaGlzIE1lbW8KKworICAgVGhpcyBtZW1vIHByb3ZpZGVzIGluZm9ybWF0aW9uIGZvciB0aGUgSW50ZXJuZXQgY29tbXVuaXR5LiAgVGhpcyBtZW1vCisgICBkb2VzIG5vdCBzcGVjaWZ5IGFuIEludGVybmV0IHN0YW5kYXJkIG9mIGFueSBraW5kLiAgRGlzdHJpYnV0aW9uIG9mCisgICB0aGlzIG1lbW8gaXMgdW5saW1pdGVkLgorCitJRVNHIE5vdGU6CisKKyAgIFRoZSBJRVNHIHRha2VzIG5vIHBvc2l0aW9uIG9uIHRoZSB2YWxpZGl0eSBvZiBhbnkgSW50ZWxsZWN0dWFsCisgICBQcm9wZXJ0eSBSaWdodHMgc3RhdGVtZW50cyBjb250YWluZWQgaW4gdGhpcyBkb2N1bWVudC4KKworTm90aWNlcworCisgICBDb3B5cmlnaHQgKGMpIDE5OTYgTC4gUGV0ZXIgRGV1dHNjaAorCisgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGlzIGRvY3VtZW50IGZvciBhbnkKKyAgIHB1cnBvc2UgYW5kIHdpdGhvdXQgY2hhcmdlLCBpbmNsdWRpbmcgdHJhbnNsYXRpb25zIGludG8gb3RoZXIKKyAgIGxhbmd1YWdlcyBhbmQgaW5jb3Jwb3JhdGlvbiBpbnRvIGNvbXBpbGF0aW9ucywgcHJvdmlkZWQgdGhhdCB0aGUKKyAgIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQsIGFuZCB0aGF0IGFueQorICAgc3Vic3RhbnRpdmUgY2hhbmdlcyBvciBkZWxldGlvbnMgZnJvbSB0aGUgb3JpZ2luYWwgYXJlIGNsZWFybHkKKyAgIG1hcmtlZC4KKworICAgQSBwb2ludGVyIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24gaW4KKyAgIEhUTUwgZm9ybWF0IGNhbiBiZSBmb3VuZCBhdCB0aGUgVVJMCisgICA8ZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9wbmcvZG9jdW1lbnRzL3psaWIvemRvYy1pbmRleC5odG1sPi4KKworQWJzdHJhY3QKKworICAgVGhpcyBzcGVjaWZpY2F0aW9uIGRlZmluZXMgYSBsb3NzbGVzcyBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IHRoYXQKKyAgIGNvbXByZXNzZXMgZGF0YSB1c2luZyBhIGNvbWJpbmF0aW9uIG9mIHRoZSBMWjc3IGFsZ29yaXRobSBhbmQgSHVmZm1hbgorICAgY29kaW5nLCB3aXRoIGVmZmljaWVuY3kgY29tcGFyYWJsZSB0byB0aGUgYmVzdCBjdXJyZW50bHkgYXZhaWxhYmxlCisgICBnZW5lcmFsLXB1cnBvc2UgY29tcHJlc3Npb24gbWV0aG9kcy4gIFRoZSBkYXRhIGNhbiBiZSBwcm9kdWNlZCBvcgorICAgY29uc3VtZWQsIGV2ZW4gZm9yIGFuIGFyYml0cmFyaWx5IGxvbmcgc2VxdWVudGlhbGx5IHByZXNlbnRlZCBpbnB1dAorICAgZGF0YSBzdHJlYW0sIHVzaW5nIG9ubHkgYW4gYSBwcmlvcmkgYm91bmRlZCBhbW91bnQgb2YgaW50ZXJtZWRpYXRlCisgICBzdG9yYWdlLiAgVGhlIGZvcm1hdCBjYW4gYmUgaW1wbGVtZW50ZWQgcmVhZGlseSBpbiBhIG1hbm5lciBub3QKKyAgIGNvdmVyZWQgYnkgcGF0ZW50cy4KKworCisKKworCisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgMV0KKwwKK1JGQyAxOTUxICAgICAgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICBNYXkgMTk5NgorCisKK1RhYmxlIG9mIENvbnRlbnRzCisKKyAgIDEuIEludHJvZHVjdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMgorICAgICAgMS4xLiBQdXJwb3NlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAyCisgICAgICAxLjIuIEludGVuZGVkIGF1ZGllbmNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDMKKyAgICAgIDEuMy4gU2NvcGUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMworICAgICAgMS40LiBDb21wbGlhbmNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAzCisgICAgICAxLjUuICBEZWZpbml0aW9ucyBvZiB0ZXJtcyBhbmQgY29udmVudGlvbnMgdXNlZCAuLi4uLi4uLi4uLi4uLi4uIDMKKyAgICAgIDEuNi4gQ2hhbmdlcyBmcm9tIHByZXZpb3VzIHZlcnNpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gNAorICAgMi4gQ29tcHJlc3NlZCByZXByZXNlbnRhdGlvbiBvdmVydmlldyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiA0CisgICAzLiBEZXRhaWxlZCBzcGVjaWZpY2F0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDUKKyAgICAgIDMuMS4gT3ZlcmFsbCBjb252ZW50aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gNQorICAgICAgICAgIDMuMS4xLiBQYWNraW5nIGludG8gYnl0ZXMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiA1CisgICAgICAzLjIuIENvbXByZXNzZWQgYmxvY2sgZm9ybWF0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDYKKyAgICAgICAgICAzLjIuMS4gU3lub3BzaXMgb2YgcHJlZml4IGFuZCBIdWZmbWFuIGNvZGluZyAuLi4uLi4uLi4uLi4uLi4gNgorICAgICAgICAgIDMuMi4yLiBVc2Ugb2YgSHVmZm1hbiBjb2RpbmcgaW4gdGhlICJkZWZsYXRlIiBmb3JtYXQgLi4uLi4uLiA3CisgICAgICAgICAgMy4yLjMuIERldGFpbHMgb2YgYmxvY2sgZm9ybWF0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDkKKyAgICAgICAgICAzLjIuNC4gTm9uLWNvbXByZXNzZWQgYmxvY2tzIChCVFlQRT0wMCkgLi4uLi4uLi4uLi4uLi4uLi4uLiAxMQorICAgICAgICAgIDMuMi41LiBDb21wcmVzc2VkIGJsb2NrcyAobGVuZ3RoIGFuZCBkaXN0YW5jZSBjb2RlcykgLi4uLi4uIDExCisgICAgICAgICAgMy4yLjYuIENvbXByZXNzaW9uIHdpdGggZml4ZWQgSHVmZm1hbiBjb2RlcyAoQlRZUEU9MDEpIC4uLi4gMTIKKyAgICAgICAgICAzLjIuNy4gQ29tcHJlc3Npb24gd2l0aCBkeW5hbWljIEh1ZmZtYW4gY29kZXMgKEJUWVBFPTEwKSAuLiAxMworICAgICAgMy4zLiBDb21wbGlhbmNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDE0CisgICA0LiBDb21wcmVzc2lvbiBhbGdvcml0aG0gZGV0YWlscyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMTQKKyAgIDUuIFJlZmVyZW5jZXMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAxNgorICAgNi4gU2VjdXJpdHkgQ29uc2lkZXJhdGlvbnMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDE2CisgICA3LiBTb3VyY2UgY29kZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMTYKKyAgIDguIEFja25vd2xlZGdlbWVudHMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAxNgorICAgOS4gQXV0aG9yJ3MgQWRkcmVzcyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDE3CisKKzEuIEludHJvZHVjdGlvbgorCisgICAxLjEuIFB1cnBvc2UKKworICAgICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGlzIHRvIGRlZmluZSBhIGxvc3NsZXNzCisgICAgICBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IHRoYXQ6CisgICAgICAgICAgKiBJcyBpbmRlcGVuZGVudCBvZiBDUFUgdHlwZSwgb3BlcmF0aW5nIHN5c3RlbSwgZmlsZSBzeXN0ZW0sCisgICAgICAgICAgICBhbmQgY2hhcmFjdGVyIHNldCwgYW5kIGhlbmNlIGNhbiBiZSB1c2VkIGZvciBpbnRlcmNoYW5nZTsKKyAgICAgICAgICAqIENhbiBiZSBwcm9kdWNlZCBvciBjb25zdW1lZCwgZXZlbiBmb3IgYW4gYXJiaXRyYXJpbHkgbG9uZworICAgICAgICAgICAgc2VxdWVudGlhbGx5IHByZXNlbnRlZCBpbnB1dCBkYXRhIHN0cmVhbSwgdXNpbmcgb25seSBhbiBhCisgICAgICAgICAgICBwcmlvcmkgYm91bmRlZCBhbW91bnQgb2YgaW50ZXJtZWRpYXRlIHN0b3JhZ2UsIGFuZCBoZW5jZQorICAgICAgICAgICAgY2FuIGJlIHVzZWQgaW4gZGF0YSBjb21tdW5pY2F0aW9ucyBvciBzaW1pbGFyIHN0cnVjdHVyZXMKKyAgICAgICAgICAgIHN1Y2ggYXMgVW5peCBmaWx0ZXJzOworICAgICAgICAgICogQ29tcHJlc3NlcyBkYXRhIHdpdGggZWZmaWNpZW5jeSBjb21wYXJhYmxlIHRvIHRoZSBiZXN0CisgICAgICAgICAgICBjdXJyZW50bHkgYXZhaWxhYmxlIGdlbmVyYWwtcHVycG9zZSBjb21wcmVzc2lvbiBtZXRob2RzLAorICAgICAgICAgICAgYW5kIGluIHBhcnRpY3VsYXIgY29uc2lkZXJhYmx5IGJldHRlciB0aGFuIHRoZSAiY29tcHJlc3MiCisgICAgICAgICAgICBwcm9ncmFtOworICAgICAgICAgICogQ2FuIGJlIGltcGxlbWVudGVkIHJlYWRpbHkgaW4gYSBtYW5uZXIgbm90IGNvdmVyZWQgYnkKKyAgICAgICAgICAgIHBhdGVudHMsIGFuZCBoZW5jZSBjYW4gYmUgcHJhY3RpY2VkIGZyZWVseTsKKworCisKK0RldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSAyXQorDAorUkZDIDE5NTEgICAgICBERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgIE1heSAxOTk2CisKKworICAgICAgICAgICogSXMgY29tcGF0aWJsZSB3aXRoIHRoZSBmaWxlIGZvcm1hdCBwcm9kdWNlZCBieSB0aGUgY3VycmVudAorICAgICAgICAgICAgd2lkZWx5IHVzZWQgZ3ppcCB1dGlsaXR5LCBpbiB0aGF0IGNvbmZvcm1pbmcgZGVjb21wcmVzc29ycworICAgICAgICAgICAgd2lsbCBiZSBhYmxlIHRvIHJlYWQgZGF0YSBwcm9kdWNlZCBieSB0aGUgZXhpc3RpbmcgZ3ppcAorICAgICAgICAgICAgY29tcHJlc3Nvci4KKworICAgICAgVGhlIGRhdGEgZm9ybWF0IGRlZmluZWQgYnkgdGhpcyBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGF0dGVtcHQgdG86CisKKyAgICAgICAgICAqIEFsbG93IHJhbmRvbSBhY2Nlc3MgdG8gY29tcHJlc3NlZCBkYXRhOworICAgICAgICAgICogQ29tcHJlc3Mgc3BlY2lhbGl6ZWQgZGF0YSAoZS5nLiwgcmFzdGVyIGdyYXBoaWNzKSBhcyB3ZWxsCisgICAgICAgICAgICBhcyB0aGUgYmVzdCBjdXJyZW50bHkgYXZhaWxhYmxlIHNwZWNpYWxpemVkIGFsZ29yaXRobXMuCisKKyAgICAgIEEgc2ltcGxlIGNvdW50aW5nIGFyZ3VtZW50IHNob3dzIHRoYXQgbm8gbG9zc2xlc3MgY29tcHJlc3Npb24KKyAgICAgIGFsZ29yaXRobSBjYW4gY29tcHJlc3MgZXZlcnkgcG9zc2libGUgaW5wdXQgZGF0YSBzZXQuICBGb3IgdGhlCisgICAgICBmb3JtYXQgZGVmaW5lZCBoZXJlLCB0aGUgd29yc3QgY2FzZSBleHBhbnNpb24gaXMgNSBieXRlcyBwZXIgMzJLLQorICAgICAgYnl0ZSBibG9jaywgaS5lLiwgYSBzaXplIGluY3JlYXNlIG9mIDAuMDE1JSBmb3IgbGFyZ2UgZGF0YSBzZXRzLgorICAgICAgRW5nbGlzaCB0ZXh0IHVzdWFsbHkgY29tcHJlc3NlcyBieSBhIGZhY3RvciBvZiAyLjUgdG8gMzsKKyAgICAgIGV4ZWN1dGFibGUgZmlsZXMgdXN1YWxseSBjb21wcmVzcyBzb21ld2hhdCBsZXNzOyBncmFwaGljYWwgZGF0YQorICAgICAgc3VjaCBhcyByYXN0ZXIgaW1hZ2VzIG1heSBjb21wcmVzcyBtdWNoIG1vcmUuCisKKyAgIDEuMi4gSW50ZW5kZWQgYXVkaWVuY2UKKworICAgICAgVGhpcyBzcGVjaWZpY2F0aW9uIGlzIGludGVuZGVkIGZvciB1c2UgYnkgaW1wbGVtZW50b3JzIG9mIHNvZnR3YXJlCisgICAgICB0byBjb21wcmVzcyBkYXRhIGludG8gImRlZmxhdGUiIGZvcm1hdCBhbmQvb3IgZGVjb21wcmVzcyBkYXRhIGZyb20KKyAgICAgICJkZWZsYXRlIiBmb3JtYXQuCisKKyAgICAgIFRoZSB0ZXh0IG9mIHRoZSBzcGVjaWZpY2F0aW9uIGFzc3VtZXMgYSBiYXNpYyBiYWNrZ3JvdW5kIGluCisgICAgICBwcm9ncmFtbWluZyBhdCB0aGUgbGV2ZWwgb2YgYml0cyBhbmQgb3RoZXIgcHJpbWl0aXZlIGRhdGEKKyAgICAgIHJlcHJlc2VudGF0aW9ucy4gIEZhbWlsaWFyaXR5IHdpdGggdGhlIHRlY2huaXF1ZSBvZiBIdWZmbWFuIGNvZGluZworICAgICAgaXMgaGVscGZ1bCBidXQgbm90IHJlcXVpcmVkLgorCisgICAxLjMuIFNjb3BlCisKKyAgICAgIFRoZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIG1ldGhvZCBmb3IgcmVwcmVzZW50aW5nIGEgc2VxdWVuY2UKKyAgICAgIG9mIGJ5dGVzIGFzIGEgKHVzdWFsbHkgc2hvcnRlcikgc2VxdWVuY2Ugb2YgYml0cywgYW5kIGEgbWV0aG9kIGZvcgorICAgICAgcGFja2luZyB0aGUgbGF0dGVyIGJpdCBzZXF1ZW5jZSBpbnRvIGJ5dGVzLgorCisgICAxLjQuIENvbXBsaWFuY2UKKworICAgICAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIGEgY29tcGxpYW50IGRlY29tcHJlc3NvciBtdXN0IGJlCisgICAgICBhYmxlIHRvIGFjY2VwdCBhbmQgZGVjb21wcmVzcyBhbnkgZGF0YSBzZXQgdGhhdCBjb25mb3JtcyB0byBhbGwKKyAgICAgIHRoZSBzcGVjaWZpY2F0aW9ucyBwcmVzZW50ZWQgaGVyZTsgYSBjb21wbGlhbnQgY29tcHJlc3NvciBtdXN0CisgICAgICBwcm9kdWNlIGRhdGEgc2V0cyB0aGF0IGNvbmZvcm0gdG8gYWxsIHRoZSBzcGVjaWZpY2F0aW9ucyBwcmVzZW50ZWQKKyAgICAgIGhlcmUuCisKKyAgIDEuNS4gIERlZmluaXRpb25zIG9mIHRlcm1zIGFuZCBjb252ZW50aW9ucyB1c2VkCisKKyAgICAgIEJ5dGU6IDggYml0cyBzdG9yZWQgb3IgdHJhbnNtaXR0ZWQgYXMgYSB1bml0IChzYW1lIGFzIGFuIG9jdGV0KS4KKyAgICAgIEZvciB0aGlzIHNwZWNpZmljYXRpb24sIGEgYnl0ZSBpcyBleGFjdGx5IDggYml0cywgZXZlbiBvbiBtYWNoaW5lcworCisKKworRGV1dHNjaCAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDNdCisMCitSRkMgMTk1MSAgICAgIERFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgTWF5IDE5OTYKKworCisgICAgICB3aGljaCBzdG9yZSBhIGNoYXJhY3RlciBvbiBhIG51bWJlciBvZiBiaXRzIGRpZmZlcmVudCBmcm9tIGVpZ2h0LgorICAgICAgU2VlIGJlbG93LCBmb3IgdGhlIG51bWJlcmluZyBvZiBiaXRzIHdpdGhpbiBhIGJ5dGUuCisKKyAgICAgIFN0cmluZzogYSBzZXF1ZW5jZSBvZiBhcmJpdHJhcnkgYnl0ZXMuCisKKyAgIDEuNi4gQ2hhbmdlcyBmcm9tIHByZXZpb3VzIHZlcnNpb25zCisKKyAgICAgIFRoZXJlIGhhdmUgYmVlbiBubyB0ZWNobmljYWwgY2hhbmdlcyB0byB0aGUgZGVmbGF0ZSBmb3JtYXQgc2luY2UKKyAgICAgIHZlcnNpb24gMS4xIG9mIHRoaXMgc3BlY2lmaWNhdGlvbi4gIEluIHZlcnNpb24gMS4yLCBzb21lCisgICAgICB0ZXJtaW5vbG9neSB3YXMgY2hhbmdlZC4gIFZlcnNpb24gMS4zIGlzIGEgY29udmVyc2lvbiBvZiB0aGUKKyAgICAgIHNwZWNpZmljYXRpb24gdG8gUkZDIHN0eWxlLgorCisyLiBDb21wcmVzc2VkIHJlcHJlc2VudGF0aW9uIG92ZXJ2aWV3CisKKyAgIEEgY29tcHJlc3NlZCBkYXRhIHNldCBjb25zaXN0cyBvZiBhIHNlcmllcyBvZiBibG9ja3MsIGNvcnJlc3BvbmRpbmcKKyAgIHRvIHN1Y2Nlc3NpdmUgYmxvY2tzIG9mIGlucHV0IGRhdGEuICBUaGUgYmxvY2sgc2l6ZXMgYXJlIGFyYml0cmFyeSwKKyAgIGV4Y2VwdCB0aGF0IG5vbi1jb21wcmVzc2libGUgYmxvY2tzIGFyZSBsaW1pdGVkIHRvIDY1LDUzNSBieXRlcy4KKworICAgRWFjaCBibG9jayBpcyBjb21wcmVzc2VkIHVzaW5nIGEgY29tYmluYXRpb24gb2YgdGhlIExaNzcgYWxnb3JpdGhtCisgICBhbmQgSHVmZm1hbiBjb2RpbmcuIFRoZSBIdWZmbWFuIHRyZWVzIGZvciBlYWNoIGJsb2NrIGFyZSBpbmRlcGVuZGVudAorICAgb2YgdGhvc2UgZm9yIHByZXZpb3VzIG9yIHN1YnNlcXVlbnQgYmxvY2tzOyB0aGUgTFo3NyBhbGdvcml0aG0gbWF5CisgICB1c2UgYSByZWZlcmVuY2UgdG8gYSBkdXBsaWNhdGVkIHN0cmluZyBvY2N1cnJpbmcgaW4gYSBwcmV2aW91cyBibG9jaywKKyAgIHVwIHRvIDMySyBpbnB1dCBieXRlcyBiZWZvcmUuCisKKyAgIEVhY2ggYmxvY2sgY29uc2lzdHMgb2YgdHdvIHBhcnRzOiBhIHBhaXIgb2YgSHVmZm1hbiBjb2RlIHRyZWVzIHRoYXQKKyAgIGRlc2NyaWJlIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIHBhcnQsIGFuZCBhCisgICBjb21wcmVzc2VkIGRhdGEgcGFydC4gIChUaGUgSHVmZm1hbiB0cmVlcyB0aGVtc2VsdmVzIGFyZSBjb21wcmVzc2VkCisgICB1c2luZyBIdWZmbWFuIGVuY29kaW5nLikgIFRoZSBjb21wcmVzc2VkIGRhdGEgY29uc2lzdHMgb2YgYSBzZXJpZXMgb2YKKyAgIGVsZW1lbnRzIG9mIHR3byB0eXBlczogbGl0ZXJhbCBieXRlcyAob2Ygc3RyaW5ncyB0aGF0IGhhdmUgbm90IGJlZW4KKyAgIGRldGVjdGVkIGFzIGR1cGxpY2F0ZWQgd2l0aGluIHRoZSBwcmV2aW91cyAzMksgaW5wdXQgYnl0ZXMpLCBhbmQKKyAgIHBvaW50ZXJzIHRvIGR1cGxpY2F0ZWQgc3RyaW5ncywgd2hlcmUgYSBwb2ludGVyIGlzIHJlcHJlc2VudGVkIGFzIGEKKyAgIHBhaXIgPGxlbmd0aCwgYmFja3dhcmQgZGlzdGFuY2U+LiAgVGhlIHJlcHJlc2VudGF0aW9uIHVzZWQgaW4gdGhlCisgICAiZGVmbGF0ZSIgZm9ybWF0IGxpbWl0cyBkaXN0YW5jZXMgdG8gMzJLIGJ5dGVzIGFuZCBsZW5ndGhzIHRvIDI1OAorICAgYnl0ZXMsIGJ1dCBkb2VzIG5vdCBsaW1pdCB0aGUgc2l6ZSBvZiBhIGJsb2NrLCBleGNlcHQgZm9yCisgICB1bmNvbXByZXNzaWJsZSBibG9ja3MsIHdoaWNoIGFyZSBsaW1pdGVkIGFzIG5vdGVkIGFib3ZlLgorCisgICBFYWNoIHR5cGUgb2YgdmFsdWUgKGxpdGVyYWxzLCBkaXN0YW5jZXMsIGFuZCBsZW5ndGhzKSBpbiB0aGUKKyAgIGNvbXByZXNzZWQgZGF0YSBpcyByZXByZXNlbnRlZCB1c2luZyBhIEh1ZmZtYW4gY29kZSwgdXNpbmcgb25lIGNvZGUKKyAgIHRyZWUgZm9yIGxpdGVyYWxzIGFuZCBsZW5ndGhzIGFuZCBhIHNlcGFyYXRlIGNvZGUgdHJlZSBmb3IgZGlzdGFuY2VzLgorICAgVGhlIGNvZGUgdHJlZXMgZm9yIGVhY2ggYmxvY2sgYXBwZWFyIGluIGEgY29tcGFjdCBmb3JtIGp1c3QgYmVmb3JlCisgICB0aGUgY29tcHJlc3NlZCBkYXRhIGZvciB0aGF0IGJsb2NrLgorCisKKworCisKKworCisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgNF0KKwwKK1JGQyAxOTUxICAgICAgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICBNYXkgMTk5NgorCisKKzMuIERldGFpbGVkIHNwZWNpZmljYXRpb24KKworICAgMy4xLiBPdmVyYWxsIGNvbnZlbnRpb25zIEluIHRoZSBkaWFncmFtcyBiZWxvdywgYSBib3ggbGlrZSB0aGlzOgorCisgICAgICAgICArLS0tKworICAgICAgICAgfCAgIHwgPC0tIHRoZSB2ZXJ0aWNhbCBiYXJzIG1pZ2h0IGJlIG1pc3NpbmcKKyAgICAgICAgICstLS0rCisKKyAgICAgIHJlcHJlc2VudHMgb25lIGJ5dGU7IGEgYm94IGxpa2UgdGhpczoKKworICAgICAgICAgKz09PT09PT09PT09PT09KworICAgICAgICAgfCAgICAgICAgICAgICAgfAorICAgICAgICAgKz09PT09PT09PT09PT09KworCisgICAgICByZXByZXNlbnRzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGJ5dGVzLgorCisgICAgICBCeXRlcyBzdG9yZWQgd2l0aGluIGEgY29tcHV0ZXIgZG8gbm90IGhhdmUgYSAiYml0IG9yZGVyIiwgc2luY2UKKyAgICAgIHRoZXkgYXJlIGFsd2F5cyB0cmVhdGVkIGFzIGEgdW5pdC4gIEhvd2V2ZXIsIGEgYnl0ZSBjb25zaWRlcmVkIGFzCisgICAgICBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1IGRvZXMgaGF2ZSBhIG1vc3QtIGFuZCBsZWFzdC0KKyAgICAgIHNpZ25pZmljYW50IGJpdCwgYW5kIHNpbmNlIHdlIHdyaXRlIG51bWJlcnMgd2l0aCB0aGUgbW9zdC0KKyAgICAgIHNpZ25pZmljYW50IGRpZ2l0IG9uIHRoZSBsZWZ0LCB3ZSBhbHNvIHdyaXRlIGJ5dGVzIHdpdGggdGhlIG1vc3QtCisgICAgICBzaWduaWZpY2FudCBiaXQgb24gdGhlIGxlZnQuICBJbiB0aGUgZGlhZ3JhbXMgYmVsb3csIHdlIG51bWJlciB0aGUKKyAgICAgIGJpdHMgb2YgYSBieXRlIHNvIHRoYXQgYml0IDAgaXMgdGhlIGxlYXN0LXNpZ25pZmljYW50IGJpdCwgaS5lLiwKKyAgICAgIHRoZSBiaXRzIGFyZSBudW1iZXJlZDoKKworICAgICAgICAgKy0tLS0tLS0tKworICAgICAgICAgfDc2NTQzMjEwfAorICAgICAgICAgKy0tLS0tLS0tKworCisgICAgICBXaXRoaW4gYSBjb21wdXRlciwgYSBudW1iZXIgbWF5IG9jY3VweSBtdWx0aXBsZSBieXRlcy4gIEFsbAorICAgICAgbXVsdGktYnl0ZSBudW1iZXJzIGluIHRoZSBmb3JtYXQgZGVzY3JpYmVkIGhlcmUgYXJlIHN0b3JlZCB3aXRoCisgICAgICB0aGUgbGVhc3Qtc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdCAoYXQgdGhlIGxvd2VyIG1lbW9yeSBhZGRyZXNzKS4KKyAgICAgIEZvciBleGFtcGxlLCB0aGUgZGVjaW1hbCBudW1iZXIgNTIwIGlzIHN0b3JlZCBhczoKKworICAgICAgICAgICAgIDAgICAgICAgIDEKKyAgICAgICAgICstLS0tLS0tLSstLS0tLS0tLSsKKyAgICAgICAgIHwwMDAwMTAwMHwwMDAwMDAxMHwKKyAgICAgICAgICstLS0tLS0tLSstLS0tLS0tLSsKKyAgICAgICAgICBeICAgICAgICBeCisgICAgICAgICAgfCAgICAgICAgfAorICAgICAgICAgIHwgICAgICAgICsgbW9yZSBzaWduaWZpY2FudCBieXRlID0gMiB4IDI1NgorICAgICAgICAgICsgbGVzcyBzaWduaWZpY2FudCBieXRlID0gOAorCisgICAgICAzLjEuMS4gUGFja2luZyBpbnRvIGJ5dGVzCisKKyAgICAgICAgIFRoaXMgZG9jdW1lbnQgZG9lcyBub3QgYWRkcmVzcyB0aGUgaXNzdWUgb2YgdGhlIG9yZGVyIGluIHdoaWNoCisgICAgICAgICBiaXRzIG9mIGEgYnl0ZSBhcmUgdHJhbnNtaXR0ZWQgb24gYSBiaXQtc2VxdWVudGlhbCBtZWRpdW0sCisgICAgICAgICBzaW5jZSB0aGUgZmluYWwgZGF0YSBmb3JtYXQgZGVzY3JpYmVkIGhlcmUgaXMgYnl0ZS0gcmF0aGVyIHRoYW4KKworCisKK0RldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSA1XQorDAorUkZDIDE5NTEgICAgICBERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgIE1heSAxOTk2CisKKworICAgICAgICAgYml0LW9yaWVudGVkLiAgSG93ZXZlciwgd2UgZGVzY3JpYmUgdGhlIGNvbXByZXNzZWQgYmxvY2sgZm9ybWF0CisgICAgICAgICBpbiBiZWxvdywgYXMgYSBzZXF1ZW5jZSBvZiBkYXRhIGVsZW1lbnRzIG9mIHZhcmlvdXMgYml0CisgICAgICAgICBsZW5ndGhzLCBub3QgYSBzZXF1ZW5jZSBvZiBieXRlcy4gIFdlIG11c3QgdGhlcmVmb3JlIHNwZWNpZnkKKyAgICAgICAgIGhvdyB0byBwYWNrIHRoZXNlIGRhdGEgZWxlbWVudHMgaW50byBieXRlcyB0byBmb3JtIHRoZSBmaW5hbAorICAgICAgICAgY29tcHJlc3NlZCBieXRlIHNlcXVlbmNlOgorCisgICAgICAgICAgICAgKiBEYXRhIGVsZW1lbnRzIGFyZSBwYWNrZWQgaW50byBieXRlcyBpbiBvcmRlciBvZgorICAgICAgICAgICAgICAgaW5jcmVhc2luZyBiaXQgbnVtYmVyIHdpdGhpbiB0aGUgYnl0ZSwgaS5lLiwgc3RhcnRpbmcKKyAgICAgICAgICAgICAgIHdpdGggdGhlIGxlYXN0LXNpZ25pZmljYW50IGJpdCBvZiB0aGUgYnl0ZS4KKyAgICAgICAgICAgICAqIERhdGEgZWxlbWVudHMgb3RoZXIgdGhhbiBIdWZmbWFuIGNvZGVzIGFyZSBwYWNrZWQKKyAgICAgICAgICAgICAgIHN0YXJ0aW5nIHdpdGggdGhlIGxlYXN0LXNpZ25pZmljYW50IGJpdCBvZiB0aGUgZGF0YQorICAgICAgICAgICAgICAgZWxlbWVudC4KKyAgICAgICAgICAgICAqIEh1ZmZtYW4gY29kZXMgYXJlIHBhY2tlZCBzdGFydGluZyB3aXRoIHRoZSBtb3N0LQorICAgICAgICAgICAgICAgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBjb2RlLgorCisgICAgICAgICBJbiBvdGhlciB3b3JkcywgaWYgb25lIHdlcmUgdG8gcHJpbnQgb3V0IHRoZSBjb21wcmVzc2VkIGRhdGEgYXMKKyAgICAgICAgIGEgc2VxdWVuY2Ugb2YgYnl0ZXMsIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0IGJ5dGUgYXQgdGhlCisgICAgICAgICAqcmlnaHQqIG1hcmdpbiBhbmQgcHJvY2VlZGluZyB0byB0aGUgKmxlZnQqLCB3aXRoIHRoZSBtb3N0LQorICAgICAgICAgc2lnbmlmaWNhbnQgYml0IG9mIGVhY2ggYnl0ZSBvbiB0aGUgbGVmdCBhcyB1c3VhbCwgb25lIHdvdWxkIGJlCisgICAgICAgICBhYmxlIHRvIHBhcnNlIHRoZSByZXN1bHQgZnJvbSByaWdodCB0byBsZWZ0LCB3aXRoIGZpeGVkLXdpZHRoCisgICAgICAgICBlbGVtZW50cyBpbiB0aGUgY29ycmVjdCBNU0ItdG8tTFNCIG9yZGVyIGFuZCBIdWZmbWFuIGNvZGVzIGluCisgICAgICAgICBiaXQtcmV2ZXJzZWQgb3JkZXIgKGkuZS4sIHdpdGggdGhlIGZpcnN0IGJpdCBvZiB0aGUgY29kZSBpbiB0aGUKKyAgICAgICAgIHJlbGF0aXZlIExTQiBwb3NpdGlvbikuCisKKyAgIDMuMi4gQ29tcHJlc3NlZCBibG9jayBmb3JtYXQKKworICAgICAgMy4yLjEuIFN5bm9wc2lzIG9mIHByZWZpeCBhbmQgSHVmZm1hbiBjb2RpbmcKKworICAgICAgICAgUHJlZml4IGNvZGluZyByZXByZXNlbnRzIHN5bWJvbHMgZnJvbSBhbiBhIHByaW9yaSBrbm93bgorICAgICAgICAgYWxwaGFiZXQgYnkgYml0IHNlcXVlbmNlcyAoY29kZXMpLCBvbmUgY29kZSBmb3IgZWFjaCBzeW1ib2wsIGluCisgICAgICAgICBhIG1hbm5lciBzdWNoIHRoYXQgZGlmZmVyZW50IHN5bWJvbHMgbWF5IGJlIHJlcHJlc2VudGVkIGJ5IGJpdAorICAgICAgICAgc2VxdWVuY2VzIG9mIGRpZmZlcmVudCBsZW5ndGhzLCBidXQgYSBwYXJzZXIgY2FuIGFsd2F5cyBwYXJzZQorICAgICAgICAgYW4gZW5jb2RlZCBzdHJpbmcgdW5hbWJpZ3VvdXNseSBzeW1ib2wtYnktc3ltYm9sLgorCisgICAgICAgICBXZSBkZWZpbmUgYSBwcmVmaXggY29kZSBpbiB0ZXJtcyBvZiBhIGJpbmFyeSB0cmVlIGluIHdoaWNoIHRoZQorICAgICAgICAgdHdvIGVkZ2VzIGRlc2NlbmRpbmcgZnJvbSBlYWNoIG5vbi1sZWFmIG5vZGUgYXJlIGxhYmVsZWQgMCBhbmQKKyAgICAgICAgIDEgYW5kIGluIHdoaWNoIHRoZSBsZWFmIG5vZGVzIGNvcnJlc3BvbmQgb25lLWZvci1vbmUgd2l0aCAoYXJlCisgICAgICAgICBsYWJlbGVkIHdpdGgpIHRoZSBzeW1ib2xzIG9mIHRoZSBhbHBoYWJldDsgdGhlbiB0aGUgY29kZSBmb3IgYQorICAgICAgICAgc3ltYm9sIGlzIHRoZSBzZXF1ZW5jZSBvZiAwJ3MgYW5kIDEncyBvbiB0aGUgZWRnZXMgbGVhZGluZyBmcm9tCisgICAgICAgICB0aGUgcm9vdCB0byB0aGUgbGVhZiBsYWJlbGVkIHdpdGggdGhhdCBzeW1ib2wuICBGb3IgZXhhbXBsZToKKworCisKKworCisKKworCisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgNl0KKwwKK1JGQyAxOTUxICAgICAgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICBNYXkgMTk5NgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgL1wgICAgICAgICAgICAgIFN5bWJvbCAgICBDb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgMCAgMSAgICAgICAgICAgICAtLS0tLS0gICAgLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgLyAgICBcICAgICAgICAgICAgICAgIEEgICAgICAwMAorICAgICAgICAgICAgICAgICAgICAgICAvXCAgICAgQiAgICAgICAgICAgICAgIEIgICAgICAgMQorICAgICAgICAgICAgICAgICAgICAgIDAgIDEgICAgICAgICAgICAgICAgICAgIEMgICAgIDAxMQorICAgICAgICAgICAgICAgICAgICAgLyAgICBcICAgICAgICAgICAgICAgICAgIEQgICAgIDAxMAorICAgICAgICAgICAgICAgICAgICBBICAgICAvXAorICAgICAgICAgICAgICAgICAgICAgICAgIDAgIDEKKyAgICAgICAgICAgICAgICAgICAgICAgIC8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICBEICAgICAgQworCisgICAgICAgICBBIHBhcnNlciBjYW4gZGVjb2RlIHRoZSBuZXh0IHN5bWJvbCBmcm9tIGFuIGVuY29kZWQgaW5wdXQKKyAgICAgICAgIHN0cmVhbSBieSB3YWxraW5nIGRvd24gdGhlIHRyZWUgZnJvbSB0aGUgcm9vdCwgYXQgZWFjaCBzdGVwCisgICAgICAgICBjaG9vc2luZyB0aGUgZWRnZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBuZXh0IGlucHV0IGJpdC4KKworICAgICAgICAgR2l2ZW4gYW4gYWxwaGFiZXQgd2l0aCBrbm93biBzeW1ib2wgZnJlcXVlbmNpZXMsIHRoZSBIdWZmbWFuCisgICAgICAgICBhbGdvcml0aG0gYWxsb3dzIHRoZSBjb25zdHJ1Y3Rpb24gb2YgYW4gb3B0aW1hbCBwcmVmaXggY29kZQorICAgICAgICAgKG9uZSB3aGljaCByZXByZXNlbnRzIHN0cmluZ3Mgd2l0aCB0aG9zZSBzeW1ib2wgZnJlcXVlbmNpZXMKKyAgICAgICAgIHVzaW5nIHRoZSBmZXdlc3QgYml0cyBvZiBhbnkgcG9zc2libGUgcHJlZml4IGNvZGVzIGZvciB0aGF0CisgICAgICAgICBhbHBoYWJldCkuICBTdWNoIGEgY29kZSBpcyBjYWxsZWQgYSBIdWZmbWFuIGNvZGUuICAoU2VlCisgICAgICAgICByZWZlcmVuY2UgWzFdIGluIENoYXB0ZXIgNSwgcmVmZXJlbmNlcyBmb3IgYWRkaXRpb25hbAorICAgICAgICAgaW5mb3JtYXRpb24gb24gSHVmZm1hbiBjb2Rlcy4pCisKKyAgICAgICAgIE5vdGUgdGhhdCBpbiB0aGUgImRlZmxhdGUiIGZvcm1hdCwgdGhlIEh1ZmZtYW4gY29kZXMgZm9yIHRoZQorICAgICAgICAgdmFyaW91cyBhbHBoYWJldHMgbXVzdCBub3QgZXhjZWVkIGNlcnRhaW4gbWF4aW11bSBjb2RlIGxlbmd0aHMuCisgICAgICAgICBUaGlzIGNvbnN0cmFpbnQgY29tcGxpY2F0ZXMgdGhlIGFsZ29yaXRobSBmb3IgY29tcHV0aW5nIGNvZGUKKyAgICAgICAgIGxlbmd0aHMgZnJvbSBzeW1ib2wgZnJlcXVlbmNpZXMuICBBZ2Fpbiwgc2VlIENoYXB0ZXIgNSwKKyAgICAgICAgIHJlZmVyZW5jZXMgZm9yIGRldGFpbHMuCisKKyAgICAgIDMuMi4yLiBVc2Ugb2YgSHVmZm1hbiBjb2RpbmcgaW4gdGhlICJkZWZsYXRlIiBmb3JtYXQKKworICAgICAgICAgVGhlIEh1ZmZtYW4gY29kZXMgdXNlZCBmb3IgZWFjaCBhbHBoYWJldCBpbiB0aGUgImRlZmxhdGUiCisgICAgICAgICBmb3JtYXQgaGF2ZSB0d28gYWRkaXRpb25hbCBydWxlczoKKworICAgICAgICAgICAgICogQWxsIGNvZGVzIG9mIGEgZ2l2ZW4gYml0IGxlbmd0aCBoYXZlIGxleGljb2dyYXBoaWNhbGx5CisgICAgICAgICAgICAgICBjb25zZWN1dGl2ZSB2YWx1ZXMsIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBzeW1ib2xzCisgICAgICAgICAgICAgICB0aGV5IHJlcHJlc2VudDsKKworICAgICAgICAgICAgICogU2hvcnRlciBjb2RlcyBsZXhpY29ncmFwaGljYWxseSBwcmVjZWRlIGxvbmdlciBjb2Rlcy4KKworCisKKworCisKKworCisKKworCisKK0RldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSA3XQorDAorUkZDIDE5NTEgICAgICBERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgIE1heSAxOTk2CisKKworICAgICAgICAgV2UgY291bGQgcmVjb2RlIHRoZSBleGFtcGxlIGFib3ZlIHRvIGZvbGxvdyB0aGlzIHJ1bGUgYXMKKyAgICAgICAgIGZvbGxvd3MsIGFzc3VtaW5nIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSBhbHBoYWJldCBpcyBBQkNEOgorCisgICAgICAgICAgICBTeW1ib2wgIENvZGUKKyAgICAgICAgICAgIC0tLS0tLSAgLS0tLQorICAgICAgICAgICAgQSAgICAgICAxMAorICAgICAgICAgICAgQiAgICAgICAwCisgICAgICAgICAgICBDICAgICAgIDExMAorICAgICAgICAgICAgRCAgICAgICAxMTEKKworICAgICAgICAgSS5lLiwgMCBwcmVjZWRlcyAxMCB3aGljaCBwcmVjZWRlcyAxMXgsIGFuZCAxMTAgYW5kIDExMSBhcmUKKyAgICAgICAgIGxleGljb2dyYXBoaWNhbGx5IGNvbnNlY3V0aXZlLgorCisgICAgICAgICBHaXZlbiB0aGlzIHJ1bGUsIHdlIGNhbiBkZWZpbmUgdGhlIEh1ZmZtYW4gY29kZSBmb3IgYW4gYWxwaGFiZXQKKyAgICAgICAgIGp1c3QgYnkgZ2l2aW5nIHRoZSBiaXQgbGVuZ3RocyBvZiB0aGUgY29kZXMgZm9yIGVhY2ggc3ltYm9sIG9mCisgICAgICAgICB0aGUgYWxwaGFiZXQgaW4gb3JkZXI7IHRoaXMgaXMgc3VmZmljaWVudCB0byBkZXRlcm1pbmUgdGhlCisgICAgICAgICBhY3R1YWwgY29kZXMuICBJbiBvdXIgZXhhbXBsZSwgdGhlIGNvZGUgaXMgY29tcGxldGVseSBkZWZpbmVkCisgICAgICAgICBieSB0aGUgc2VxdWVuY2Ugb2YgYml0IGxlbmd0aHMgKDIsIDEsIDMsIDMpLiAgVGhlIGZvbGxvd2luZworICAgICAgICAgYWxnb3JpdGhtIGdlbmVyYXRlcyB0aGUgY29kZXMgYXMgaW50ZWdlcnMsIGludGVuZGVkIHRvIGJlIHJlYWQKKyAgICAgICAgIGZyb20gbW9zdC0gdG8gbGVhc3Qtc2lnbmlmaWNhbnQgYml0LiAgVGhlIGNvZGUgbGVuZ3RocyBhcmUKKyAgICAgICAgIGluaXRpYWxseSBpbiB0cmVlW0ldLkxlbjsgdGhlIGNvZGVzIGFyZSBwcm9kdWNlZCBpbgorICAgICAgICAgdHJlZVtJXS5Db2RlLgorCisgICAgICAgICAxKSAgQ291bnQgdGhlIG51bWJlciBvZiBjb2RlcyBmb3IgZWFjaCBjb2RlIGxlbmd0aC4gIExldAorICAgICAgICAgICAgIGJsX2NvdW50W05dIGJlIHRoZSBudW1iZXIgb2YgY29kZXMgb2YgbGVuZ3RoIE4sIE4gPj0gMS4KKworICAgICAgICAgMikgIEZpbmQgdGhlIG51bWVyaWNhbCB2YWx1ZSBvZiB0aGUgc21hbGxlc3QgY29kZSBmb3IgZWFjaAorICAgICAgICAgICAgIGNvZGUgbGVuZ3RoOgorCisgICAgICAgICAgICAgICAgY29kZSA9IDA7CisgICAgICAgICAgICAgICAgYmxfY291bnRbMF0gPSAwOworICAgICAgICAgICAgICAgIGZvciAoYml0cyA9IDE7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykgeworICAgICAgICAgICAgICAgICAgICBjb2RlID0gKGNvZGUgKyBibF9jb3VudFtiaXRzLTFdKSA8PCAxOworICAgICAgICAgICAgICAgICAgICBuZXh0X2NvZGVbYml0c10gPSBjb2RlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgMykgIEFzc2lnbiBudW1lcmljYWwgdmFsdWVzIHRvIGFsbCBjb2RlcywgdXNpbmcgY29uc2VjdXRpdmUKKyAgICAgICAgICAgICB2YWx1ZXMgZm9yIGFsbCBjb2RlcyBvZiB0aGUgc2FtZSBsZW5ndGggd2l0aCB0aGUgYmFzZQorICAgICAgICAgICAgIHZhbHVlcyBkZXRlcm1pbmVkIGF0IHN0ZXAgMi4gQ29kZXMgdGhhdCBhcmUgbmV2ZXIgdXNlZAorICAgICAgICAgICAgICh3aGljaCBoYXZlIGEgYml0IGxlbmd0aCBvZiB6ZXJvKSBtdXN0IG5vdCBiZSBhc3NpZ25lZCBhCisgICAgICAgICAgICAgdmFsdWUuCisKKyAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyAgbiA8PSBtYXhfY29kZTsgbisrKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IHRyZWVbbl0uTGVuOworICAgICAgICAgICAgICAgICAgICBpZiAobGVuICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVbbl0uQ29kZSA9IG5leHRfY29kZVtsZW5dOworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9jb2RlW2xlbl0rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKworRGV1dHNjaCAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDhdCisMCitSRkMgMTk1MSAgICAgIERFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgTWF5IDE5OTYKKworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICBFeGFtcGxlOgorCisgICAgICAgICBDb25zaWRlciB0aGUgYWxwaGFiZXQgQUJDREVGR0gsIHdpdGggYml0IGxlbmd0aHMgKDMsIDMsIDMsIDMsCisgICAgICAgICAzLCAyLCA0LCA0KS4gIEFmdGVyIHN0ZXAgMSwgd2UgaGF2ZToKKworICAgICAgICAgICAgTiAgICAgIGJsX2NvdW50W05dCisgICAgICAgICAgICAtICAgICAgLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIDIgICAgICAxCisgICAgICAgICAgICAzICAgICAgNQorICAgICAgICAgICAgNCAgICAgIDIKKworICAgICAgICAgU3RlcCAyIGNvbXB1dGVzIHRoZSBmb2xsb3dpbmcgbmV4dF9jb2RlIHZhbHVlczoKKworICAgICAgICAgICAgTiAgICAgIG5leHRfY29kZVtOXQorICAgICAgICAgICAgLSAgICAgIC0tLS0tLS0tLS0tLQorICAgICAgICAgICAgMSAgICAgIDAKKyAgICAgICAgICAgIDIgICAgICAwCisgICAgICAgICAgICAzICAgICAgMgorICAgICAgICAgICAgNCAgICAgIDE0CisKKyAgICAgICAgIFN0ZXAgMyBwcm9kdWNlcyB0aGUgZm9sbG93aW5nIGNvZGUgdmFsdWVzOgorCisgICAgICAgICAgICBTeW1ib2wgTGVuZ3RoICAgQ29kZQorICAgICAgICAgICAgLS0tLS0tIC0tLS0tLSAgIC0tLS0KKyAgICAgICAgICAgIEEgICAgICAgMyAgICAgICAgMDEwCisgICAgICAgICAgICBCICAgICAgIDMgICAgICAgIDAxMQorICAgICAgICAgICAgQyAgICAgICAzICAgICAgICAxMDAKKyAgICAgICAgICAgIEQgICAgICAgMyAgICAgICAgMTAxCisgICAgICAgICAgICBFICAgICAgIDMgICAgICAgIDExMAorICAgICAgICAgICAgRiAgICAgICAyICAgICAgICAgMDAKKyAgICAgICAgICAgIEcgICAgICAgNCAgICAgICAxMTEwCisgICAgICAgICAgICBIICAgICAgIDQgICAgICAgMTExMQorCisgICAgICAzLjIuMy4gRGV0YWlscyBvZiBibG9jayBmb3JtYXQKKworICAgICAgICAgRWFjaCBibG9jayBvZiBjb21wcmVzc2VkIGRhdGEgYmVnaW5zIHdpdGggMyBoZWFkZXIgYml0cworICAgICAgICAgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIGRhdGE6CisKKyAgICAgICAgICAgIGZpcnN0IGJpdCAgICAgICBCRklOQUwKKyAgICAgICAgICAgIG5leHQgMiBiaXRzICAgICBCVFlQRQorCisgICAgICAgICBOb3RlIHRoYXQgdGhlIGhlYWRlciBiaXRzIGRvIG5vdCBuZWNlc3NhcmlseSBiZWdpbiBvbiBhIGJ5dGUKKyAgICAgICAgIGJvdW5kYXJ5LCBzaW5jZSBhIGJsb2NrIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG9jY3VweSBhbiBpbnRlZ3JhbAorICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzLgorCisKKworCisKK0RldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSA5XQorDAorUkZDIDE5NTEgICAgICBERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgIE1heSAxOTk2CisKKworICAgICAgICAgQkZJTkFMIGlzIHNldCBpZiBhbmQgb25seSBpZiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrIG9mIHRoZSBkYXRhCisgICAgICAgICBzZXQuCisKKyAgICAgICAgIEJUWVBFIHNwZWNpZmllcyBob3cgdGhlIGRhdGEgYXJlIGNvbXByZXNzZWQsIGFzIGZvbGxvd3M6CisKKyAgICAgICAgICAgIDAwIC0gbm8gY29tcHJlc3Npb24KKyAgICAgICAgICAgIDAxIC0gY29tcHJlc3NlZCB3aXRoIGZpeGVkIEh1ZmZtYW4gY29kZXMKKyAgICAgICAgICAgIDEwIC0gY29tcHJlc3NlZCB3aXRoIGR5bmFtaWMgSHVmZm1hbiBjb2RlcworICAgICAgICAgICAgMTEgLSByZXNlcnZlZCAoZXJyb3IpCisKKyAgICAgICAgIFRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIGNvbXByZXNzZWQgY2FzZXMgaXMgaG93IHRoZQorICAgICAgICAgSHVmZm1hbiBjb2RlcyBmb3IgdGhlIGxpdGVyYWwvbGVuZ3RoIGFuZCBkaXN0YW5jZSBhbHBoYWJldHMgYXJlCisgICAgICAgICBkZWZpbmVkLgorCisgICAgICAgICBJbiBhbGwgY2FzZXMsIHRoZSBkZWNvZGluZyBhbGdvcml0aG0gZm9yIHRoZSBhY3R1YWwgZGF0YSBpcyBhcworICAgICAgICAgZm9sbG93czoKKworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgIHJlYWQgYmxvY2sgaGVhZGVyIGZyb20gaW5wdXQgc3RyZWFtLgorICAgICAgICAgICAgICAgaWYgc3RvcmVkIHdpdGggbm8gY29tcHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHNraXAgYW55IHJlbWFpbmluZyBiaXRzIGluIGN1cnJlbnQgcGFydGlhbGx5CisgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQgYnl0ZQorICAgICAgICAgICAgICAgICAgcmVhZCBMRU4gYW5kIE5MRU4gKHNlZSBuZXh0IHNlY3Rpb24pCisgICAgICAgICAgICAgICAgICBjb3B5IExFTiBieXRlcyBvZiBkYXRhIHRvIG91dHB1dAorICAgICAgICAgICAgICAgb3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgICBpZiBjb21wcmVzc2VkIHdpdGggZHluYW1pYyBIdWZmbWFuIGNvZGVzCisgICAgICAgICAgICAgICAgICAgICByZWFkIHJlcHJlc2VudGF0aW9uIG9mIGNvZGUgdHJlZXMgKHNlZQorICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2VjdGlvbiBiZWxvdykKKyAgICAgICAgICAgICAgICAgIGxvb3AgKHVudGlsIGVuZCBvZiBibG9jayBjb2RlIHJlY29nbml6ZWQpCisgICAgICAgICAgICAgICAgICAgICBkZWNvZGUgbGl0ZXJhbC9sZW5ndGggdmFsdWUgZnJvbSBpbnB1dCBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgIGlmIHZhbHVlIDwgMjU2CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5IHZhbHVlIChsaXRlcmFsIGJ5dGUpIHRvIG91dHB1dCBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmFsdWUgPSBlbmQgb2YgYmxvY2sgKDI1NikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGZyb20gbG9vcAorICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlICh2YWx1ZSA9IDI1Ny4uMjg1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlIGRpc3RhbmNlIGZyb20gaW5wdXQgc3RyZWFtCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmUgYmFja3dhcmRzIGRpc3RhbmNlIGJ5dGVzIGluIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgYW5kIGNvcHkgbGVuZ3RoIGJ5dGVzIGZyb20gdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gdG8gdGhlIG91dHB1dCBzdHJlYW0uCisgICAgICAgICAgICAgICAgICBlbmQgbG9vcAorICAgICAgICAgICAgd2hpbGUgbm90IGxhc3QgYmxvY2sKKworICAgICAgICAgTm90ZSB0aGF0IGEgZHVwbGljYXRlZCBzdHJpbmcgcmVmZXJlbmNlIG1heSByZWZlciB0byBhIHN0cmluZworICAgICAgICAgaW4gYSBwcmV2aW91cyBibG9jazsgaS5lLiwgdGhlIGJhY2t3YXJkIGRpc3RhbmNlIG1heSBjcm9zcyBvbmUKKyAgICAgICAgIG9yIG1vcmUgYmxvY2sgYm91bmRhcmllcy4gIEhvd2V2ZXIgYSBkaXN0YW5jZSBjYW5ub3QgcmVmZXIgcGFzdAorICAgICAgICAgdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IHN0cmVhbS4gIChBbiBhcHBsaWNhdGlvbiB1c2luZyBhCisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxMF0KKwwKK1JGQyAxOTUxICAgICAgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICBNYXkgMTk5NgorCisKKyAgICAgICAgIHByZXNldCBkaWN0aW9uYXJ5IG1pZ2h0IGRpc2NhcmQgcGFydCBvZiB0aGUgb3V0cHV0IHN0cmVhbTsgYQorICAgICAgICAgZGlzdGFuY2UgY2FuIHJlZmVyIHRvIHRoYXQgcGFydCBvZiB0aGUgb3V0cHV0IHN0cmVhbSBhbnl3YXkpCisgICAgICAgICBOb3RlIGFsc28gdGhhdCB0aGUgcmVmZXJlbmNlZCBzdHJpbmcgbWF5IG92ZXJsYXAgdGhlIGN1cnJlbnQKKyAgICAgICAgIHBvc2l0aW9uOyBmb3IgZXhhbXBsZSwgaWYgdGhlIGxhc3QgMiBieXRlcyBkZWNvZGVkIGhhdmUgdmFsdWVzCisgICAgICAgICBYIGFuZCBZLCBhIHN0cmluZyByZWZlcmVuY2Ugd2l0aCA8bGVuZ3RoID0gNSwgZGlzdGFuY2UgPSAyPgorICAgICAgICAgYWRkcyBYLFksWCxZLFggdG8gdGhlIG91dHB1dCBzdHJlYW0uCisKKyAgICAgICAgIFdlIG5vdyBzcGVjaWZ5IGVhY2ggY29tcHJlc3Npb24gbWV0aG9kIGluIHR1cm4uCisKKyAgICAgIDMuMi40LiBOb24tY29tcHJlc3NlZCBibG9ja3MgKEJUWVBFPTAwKQorCisgICAgICAgICBBbnkgYml0cyBvZiBpbnB1dCB1cCB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5IGFyZSBpZ25vcmVkLgorICAgICAgICAgVGhlIHJlc3Qgb2YgdGhlIGJsb2NrIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246CisKKyAgICAgICAgICAgICAgMCAgIDEgICAyICAgMyAgIDQuLi4KKyAgICAgICAgICAgICstLS0rLS0tKy0tLSstLS0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCisgICAgICAgICAgICB8ICBMRU4gIHwgTkxFTiAgfC4uLiBMRU4gYnl0ZXMgb2YgbGl0ZXJhbCBkYXRhLi4ufAorICAgICAgICAgICAgKy0tLSstLS0rLS0tKy0tLSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKKworICAgICAgICAgTEVOIGlzIHRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyBpbiB0aGUgYmxvY2suICBOTEVOIGlzIHRoZQorICAgICAgICAgb25lJ3MgY29tcGxlbWVudCBvZiBMRU4uCisKKyAgICAgIDMuMi41LiBDb21wcmVzc2VkIGJsb2NrcyAobGVuZ3RoIGFuZCBkaXN0YW5jZSBjb2RlcykKKworICAgICAgICAgQXMgbm90ZWQgYWJvdmUsIGVuY29kZWQgZGF0YSBibG9ja3MgaW4gdGhlICJkZWZsYXRlIiBmb3JtYXQKKyAgICAgICAgIGNvbnNpc3Qgb2Ygc2VxdWVuY2VzIG9mIHN5bWJvbHMgZHJhd24gZnJvbSB0aHJlZSBjb25jZXB0dWFsbHkKKyAgICAgICAgIGRpc3RpbmN0IGFscGhhYmV0czogZWl0aGVyIGxpdGVyYWwgYnl0ZXMsIGZyb20gdGhlIGFscGhhYmV0IG9mCisgICAgICAgICBieXRlIHZhbHVlcyAoMC4uMjU1KSwgb3IgPGxlbmd0aCwgYmFja3dhcmQgZGlzdGFuY2U+IHBhaXJzLAorICAgICAgICAgd2hlcmUgdGhlIGxlbmd0aCBpcyBkcmF3biBmcm9tICgzLi4yNTgpIGFuZCB0aGUgZGlzdGFuY2UgaXMKKyAgICAgICAgIGRyYXduIGZyb20gKDEuLjMyLDc2OCkuICBJbiBmYWN0LCB0aGUgbGl0ZXJhbCBhbmQgbGVuZ3RoCisgICAgICAgICBhbHBoYWJldHMgYXJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlIGFscGhhYmV0ICgwLi4yODUpLCB3aGVyZQorICAgICAgICAgdmFsdWVzIDAuLjI1NSByZXByZXNlbnQgbGl0ZXJhbCBieXRlcywgdGhlIHZhbHVlIDI1NiBpbmRpY2F0ZXMKKyAgICAgICAgIGVuZC1vZi1ibG9jaywgYW5kIHZhbHVlcyAyNTcuLjI4NSByZXByZXNlbnQgbGVuZ3RoIGNvZGVzCisgICAgICAgICAocG9zc2libHkgaW4gY29uanVuY3Rpb24gd2l0aCBleHRyYSBiaXRzIGZvbGxvd2luZyB0aGUgc3ltYm9sCisgICAgICAgICBjb2RlKSBhcyBmb2xsb3dzOgorCisKKworCisKKworCisKKworCisKKworCisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxMV0KKwwKK1JGQyAxOTUxICAgICAgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICBNYXkgMTk5NgorCisKKyAgICAgICAgICAgICAgICAgRXh0cmEgICAgICAgICAgICAgICBFeHRyYSAgICAgICAgICAgICAgIEV4dHJhCisgICAgICAgICAgICBDb2RlIEJpdHMgTGVuZ3RoKHMpIENvZGUgQml0cyBMZW5ndGhzICAgQ29kZSBCaXRzIExlbmd0aChzKQorICAgICAgICAgICAgLS0tLSAtLS0tIC0tLS0tLSAgICAgLS0tLSAtLS0tIC0tLS0tLS0gICAtLS0tIC0tLS0gLS0tLS0tLQorICAgICAgICAgICAgIDI1NyAgIDAgICAgIDMgICAgICAgMjY3ICAgMSAgIDE1LDE2ICAgICAyNzcgICA0ICAgNjctODIKKyAgICAgICAgICAgICAyNTggICAwICAgICA0ICAgICAgIDI2OCAgIDEgICAxNywxOCAgICAgMjc4ICAgNCAgIDgzLTk4CisgICAgICAgICAgICAgMjU5ICAgMCAgICAgNSAgICAgICAyNjkgICAyICAgMTktMjIgICAgIDI3OSAgIDQgICA5OS0xMTQKKyAgICAgICAgICAgICAyNjAgICAwICAgICA2ICAgICAgIDI3MCAgIDIgICAyMy0yNiAgICAgMjgwICAgNCAgMTE1LTEzMAorICAgICAgICAgICAgIDI2MSAgIDAgICAgIDcgICAgICAgMjcxICAgMiAgIDI3LTMwICAgICAyODEgICA1ICAxMzEtMTYyCisgICAgICAgICAgICAgMjYyICAgMCAgICAgOCAgICAgICAyNzIgICAyICAgMzEtMzQgICAgIDI4MiAgIDUgIDE2My0xOTQKKyAgICAgICAgICAgICAyNjMgICAwICAgICA5ICAgICAgIDI3MyAgIDMgICAzNS00MiAgICAgMjgzICAgNSAgMTk1LTIyNgorICAgICAgICAgICAgIDI2NCAgIDAgICAgMTAgICAgICAgMjc0ICAgMyAgIDQzLTUwICAgICAyODQgICA1ICAyMjctMjU3CisgICAgICAgICAgICAgMjY1ICAgMSAgMTEsMTIgICAgICAyNzUgICAzICAgNTEtNTggICAgIDI4NSAgIDAgICAgMjU4CisgICAgICAgICAgICAgMjY2ICAgMSAgMTMsMTQgICAgICAyNzYgICAzICAgNTktNjYKKworICAgICAgICAgVGhlIGV4dHJhIGJpdHMgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGEgbWFjaGluZSBpbnRlZ2VyCisgICAgICAgICBzdG9yZWQgd2l0aCB0aGUgbW9zdC1zaWduaWZpY2FudCBiaXQgZmlyc3QsIGUuZy4sIGJpdHMgMTExMAorICAgICAgICAgcmVwcmVzZW50IHRoZSB2YWx1ZSAxNC4KKworICAgICAgICAgICAgICAgICAgRXh0cmEgICAgICAgICAgIEV4dHJhICAgICAgICAgICAgICAgRXh0cmEKKyAgICAgICAgICAgICBDb2RlIEJpdHMgRGlzdCAgQ29kZSBCaXRzICAgRGlzdCAgICAgQ29kZSBCaXRzIERpc3RhbmNlCisgICAgICAgICAgICAgLS0tLSAtLS0tIC0tLS0gIC0tLS0gLS0tLSAgLS0tLS0tICAgIC0tLS0gLS0tLSAtLS0tLS0tLQorICAgICAgICAgICAgICAgMCAgIDAgICAgMSAgICAgMTAgICA0ICAgICAzMy00OCAgICAyMCAgICA5ICAgMTAyNS0xNTM2CisgICAgICAgICAgICAgICAxICAgMCAgICAyICAgICAxMSAgIDQgICAgIDQ5LTY0ICAgIDIxICAgIDkgICAxNTM3LTIwNDgKKyAgICAgICAgICAgICAgIDIgICAwICAgIDMgICAgIDEyICAgNSAgICAgNjUtOTYgICAgMjIgICAxMCAgIDIwNDktMzA3MgorICAgICAgICAgICAgICAgMyAgIDAgICAgNCAgICAgMTMgICA1ICAgICA5Ny0xMjggICAyMyAgIDEwICAgMzA3My00MDk2CisgICAgICAgICAgICAgICA0ICAgMSAgIDUsNiAgICAxNCAgIDYgICAgMTI5LTE5MiAgIDI0ICAgMTEgICA0MDk3LTYxNDQKKyAgICAgICAgICAgICAgIDUgICAxICAgNyw4ICAgIDE1ICAgNiAgICAxOTMtMjU2ICAgMjUgICAxMSAgIDYxNDUtODE5MgorICAgICAgICAgICAgICAgNiAgIDIgICA5LTEyICAgMTYgICA3ICAgIDI1Ny0zODQgICAyNiAgIDEyICA4MTkzLTEyMjg4CisgICAgICAgICAgICAgICA3ICAgMiAgMTMtMTYgICAxNyAgIDcgICAgMzg1LTUxMiAgIDI3ICAgMTIgMTIyODktMTYzODQKKyAgICAgICAgICAgICAgIDggICAzICAxNy0yNCAgIDE4ICAgOCAgICA1MTMtNzY4ICAgMjggICAxMyAxNjM4NS0yNDU3NgorICAgICAgICAgICAgICAgOSAgIDMgIDI1LTMyICAgMTkgICA4ICAgNzY5LTEwMjQgICAyOSAgIDEzIDI0NTc3LTMyNzY4CisKKyAgICAgIDMuMi42LiBDb21wcmVzc2lvbiB3aXRoIGZpeGVkIEh1ZmZtYW4gY29kZXMgKEJUWVBFPTAxKQorCisgICAgICAgICBUaGUgSHVmZm1hbiBjb2RlcyBmb3IgdGhlIHR3byBhbHBoYWJldHMgYXJlIGZpeGVkLCBhbmQgYXJlIG5vdAorICAgICAgICAgcmVwcmVzZW50ZWQgZXhwbGljaXRseSBpbiB0aGUgZGF0YS4gIFRoZSBIdWZmbWFuIGNvZGUgbGVuZ3RocworICAgICAgICAgZm9yIHRoZSBsaXRlcmFsL2xlbmd0aCBhbHBoYWJldCBhcmU6CisKKyAgICAgICAgICAgICAgICAgICBMaXQgVmFsdWUgICAgQml0cyAgICAgICAgQ29kZXMKKyAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0gICAgLS0tLSAgICAgICAgLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgIDAgLSAxNDMgICAgIDggICAgICAgICAgMDAxMTAwMDAgdGhyb3VnaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDExMTExMQorICAgICAgICAgICAgICAgICAgIDE0NCAtIDI1NSAgICAgOSAgICAgICAgICAxMTAwMTAwMDAgdGhyb3VnaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTExMTExMTEKKyAgICAgICAgICAgICAgICAgICAyNTYgLSAyNzkgICAgIDcgICAgICAgICAgMDAwMDAwMCB0aHJvdWdoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAwMTAxMTEKKyAgICAgICAgICAgICAgICAgICAyODAgLSAyODcgICAgIDggICAgICAgICAgMTEwMDAwMDAgdGhyb3VnaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAwMDExMQorCisKKworRGV1dHNjaCAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgMTJdCisMCitSRkMgMTk1MSAgICAgIERFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgTWF5IDE5OTYKKworCisgICAgICAgICBUaGUgY29kZSBsZW5ndGhzIGFyZSBzdWZmaWNpZW50IHRvIGdlbmVyYXRlIHRoZSBhY3R1YWwgY29kZXMsCisgICAgICAgICBhcyBkZXNjcmliZWQgYWJvdmU7IHdlIHNob3cgdGhlIGNvZGVzIGluIHRoZSB0YWJsZSBmb3IgYWRkZWQKKyAgICAgICAgIGNsYXJpdHkuICBMaXRlcmFsL2xlbmd0aCB2YWx1ZXMgMjg2LTI4NyB3aWxsIG5ldmVyIGFjdHVhbGx5CisgICAgICAgICBvY2N1ciBpbiB0aGUgY29tcHJlc3NlZCBkYXRhLCBidXQgcGFydGljaXBhdGUgaW4gdGhlIGNvZGUKKyAgICAgICAgIGNvbnN0cnVjdGlvbi4KKworICAgICAgICAgRGlzdGFuY2UgY29kZXMgMC0zMSBhcmUgcmVwcmVzZW50ZWQgYnkgKGZpeGVkLWxlbmd0aCkgNS1iaXQKKyAgICAgICAgIGNvZGVzLCB3aXRoIHBvc3NpYmxlIGFkZGl0aW9uYWwgYml0cyBhcyBzaG93biBpbiB0aGUgdGFibGUKKyAgICAgICAgIHNob3duIGluIFBhcmFncmFwaCAzLjIuNSwgYWJvdmUuICBOb3RlIHRoYXQgZGlzdGFuY2UgY29kZXMgMzAtCisgICAgICAgICAzMSB3aWxsIG5ldmVyIGFjdHVhbGx5IG9jY3VyIGluIHRoZSBjb21wcmVzc2VkIGRhdGEuCisKKyAgICAgIDMuMi43LiBDb21wcmVzc2lvbiB3aXRoIGR5bmFtaWMgSHVmZm1hbiBjb2RlcyAoQlRZUEU9MTApCisKKyAgICAgICAgIFRoZSBIdWZmbWFuIGNvZGVzIGZvciB0aGUgdHdvIGFscGhhYmV0cyBhcHBlYXIgaW4gdGhlIGJsb2NrCisgICAgICAgICBpbW1lZGlhdGVseSBhZnRlciB0aGUgaGVhZGVyIGJpdHMgYW5kIGJlZm9yZSB0aGUgYWN0dWFsCisgICAgICAgICBjb21wcmVzc2VkIGRhdGEsIGZpcnN0IHRoZSBsaXRlcmFsL2xlbmd0aCBjb2RlIGFuZCB0aGVuIHRoZQorICAgICAgICAgZGlzdGFuY2UgY29kZS4gIEVhY2ggY29kZSBpcyBkZWZpbmVkIGJ5IGEgc2VxdWVuY2Ugb2YgY29kZQorICAgICAgICAgbGVuZ3RocywgYXMgZGlzY3Vzc2VkIGluIFBhcmFncmFwaCAzLjIuMiwgYWJvdmUuICBGb3IgZXZlbgorICAgICAgICAgZ3JlYXRlciBjb21wYWN0bmVzcywgdGhlIGNvZGUgbGVuZ3RoIHNlcXVlbmNlcyB0aGVtc2VsdmVzIGFyZQorICAgICAgICAgY29tcHJlc3NlZCB1c2luZyBhIEh1ZmZtYW4gY29kZS4gIFRoZSBhbHBoYWJldCBmb3IgY29kZSBsZW5ndGhzCisgICAgICAgICBpcyBhcyBmb2xsb3dzOgorCisgICAgICAgICAgICAgICAwIC0gMTU6IFJlcHJlc2VudCBjb2RlIGxlbmd0aHMgb2YgMCAtIDE1CisgICAgICAgICAgICAgICAgICAgMTY6IENvcHkgdGhlIHByZXZpb3VzIGNvZGUgbGVuZ3RoIDMgLSA2IHRpbWVzLgorICAgICAgICAgICAgICAgICAgICAgICBUaGUgbmV4dCAyIGJpdHMgaW5kaWNhdGUgcmVwZWF0IGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCA9IDMsIC4uLiAsIDMgPSA2KQorICAgICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlOiAgQ29kZXMgOCwgMTYgKCsyIGJpdHMgMTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYgKCsyIGJpdHMgMTApIHdpbGwgZXhwYW5kIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiBjb2RlIGxlbmd0aHMgb2YgOCAoMSArIDYgKyA1KQorICAgICAgICAgICAgICAgICAgIDE3OiBSZXBlYXQgYSBjb2RlIGxlbmd0aCBvZiAwIGZvciAzIC0gMTAgdGltZXMuCisgICAgICAgICAgICAgICAgICAgICAgICgzIGJpdHMgb2YgbGVuZ3RoKQorICAgICAgICAgICAgICAgICAgIDE4OiBSZXBlYXQgYSBjb2RlIGxlbmd0aCBvZiAwIGZvciAxMSAtIDEzOCB0aW1lcworICAgICAgICAgICAgICAgICAgICAgICAoNyBiaXRzIG9mIGxlbmd0aCkKKworICAgICAgICAgQSBjb2RlIGxlbmd0aCBvZiAwIGluZGljYXRlcyB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIHN5bWJvbCBpbgorICAgICAgICAgdGhlIGxpdGVyYWwvbGVuZ3RoIG9yIGRpc3RhbmNlIGFscGhhYmV0IHdpbGwgbm90IG9jY3VyIGluIHRoZQorICAgICAgICAgYmxvY2ssIGFuZCBzaG91bGQgbm90IHBhcnRpY2lwYXRlIGluIHRoZSBIdWZmbWFuIGNvZGUKKyAgICAgICAgIGNvbnN0cnVjdGlvbiBhbGdvcml0aG0gZ2l2ZW4gZWFybGllci4gIElmIG9ubHkgb25lIGRpc3RhbmNlCisgICAgICAgICBjb2RlIGlzIHVzZWQsIGl0IGlzIGVuY29kZWQgdXNpbmcgb25lIGJpdCwgbm90IHplcm8gYml0czsgaW4KKyAgICAgICAgIHRoaXMgY2FzZSB0aGVyZSBpcyBhIHNpbmdsZSBjb2RlIGxlbmd0aCBvZiBvbmUsIHdpdGggb25lIHVudXNlZAorICAgICAgICAgY29kZS4gIE9uZSBkaXN0YW5jZSBjb2RlIG9mIHplcm8gYml0cyBtZWFucyB0aGF0IHRoZXJlIGFyZSBubworICAgICAgICAgZGlzdGFuY2UgY29kZXMgdXNlZCBhdCBhbGwgKHRoZSBkYXRhIGlzIGFsbCBsaXRlcmFscykuCisKKyAgICAgICAgIFdlIGNhbiBub3cgZGVmaW5lIHRoZSBmb3JtYXQgb2YgdGhlIGJsb2NrOgorCisgICAgICAgICAgICAgICA1IEJpdHM6IEhMSVQsICMgb2YgTGl0ZXJhbC9MZW5ndGggY29kZXMgLSAyNTcgKDI1NyAtIDI4NikKKyAgICAgICAgICAgICAgIDUgQml0czogSERJU1QsICMgb2YgRGlzdGFuY2UgY29kZXMgLSAxICAgICAgICAoMSAtIDMyKQorICAgICAgICAgICAgICAgNCBCaXRzOiBIQ0xFTiwgIyBvZiBDb2RlIExlbmd0aCBjb2RlcyAtIDQgICAgICg0IC0gMTkpCisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxM10KKwwKK1JGQyAxOTUxICAgICAgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICBNYXkgMTk5NgorCisKKyAgICAgICAgICAgICAgIChIQ0xFTiArIDQpIHggMyBiaXRzOiBjb2RlIGxlbmd0aHMgZm9yIHRoZSBjb2RlIGxlbmd0aAorICAgICAgICAgICAgICAgICAgYWxwaGFiZXQgZ2l2ZW4ganVzdCBhYm92ZSwgaW4gdGhlIG9yZGVyOiAxNiwgMTcsIDE4LAorICAgICAgICAgICAgICAgICAgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNQorCisgICAgICAgICAgICAgICAgICBUaGVzZSBjb2RlIGxlbmd0aHMgYXJlIGludGVycHJldGVkIGFzIDMtYml0IGludGVnZXJzCisgICAgICAgICAgICAgICAgICAoMC03KTsgYXMgYWJvdmUsIGEgY29kZSBsZW5ndGggb2YgMCBtZWFucyB0aGUKKyAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgc3ltYm9sIChsaXRlcmFsL2xlbmd0aCBvciBkaXN0YW5jZSBjb2RlCisgICAgICAgICAgICAgICAgICBsZW5ndGgpIGlzIG5vdCB1c2VkLgorCisgICAgICAgICAgICAgICBITElUICsgMjU3IGNvZGUgbGVuZ3RocyBmb3IgdGhlIGxpdGVyYWwvbGVuZ3RoIGFscGhhYmV0LAorICAgICAgICAgICAgICAgICAgZW5jb2RlZCB1c2luZyB0aGUgY29kZSBsZW5ndGggSHVmZm1hbiBjb2RlCisKKyAgICAgICAgICAgICAgIEhESVNUICsgMSBjb2RlIGxlbmd0aHMgZm9yIHRoZSBkaXN0YW5jZSBhbHBoYWJldCwKKyAgICAgICAgICAgICAgICAgIGVuY29kZWQgdXNpbmcgdGhlIGNvZGUgbGVuZ3RoIEh1ZmZtYW4gY29kZQorCisgICAgICAgICAgICAgICBUaGUgYWN0dWFsIGNvbXByZXNzZWQgZGF0YSBvZiB0aGUgYmxvY2ssCisgICAgICAgICAgICAgICAgICBlbmNvZGVkIHVzaW5nIHRoZSBsaXRlcmFsL2xlbmd0aCBhbmQgZGlzdGFuY2UgSHVmZm1hbgorICAgICAgICAgICAgICAgICAgY29kZXMKKworICAgICAgICAgICAgICAgVGhlIGxpdGVyYWwvbGVuZ3RoIHN5bWJvbCAyNTYgKGVuZCBvZiBkYXRhKSwKKyAgICAgICAgICAgICAgICAgIGVuY29kZWQgdXNpbmcgdGhlIGxpdGVyYWwvbGVuZ3RoIEh1ZmZtYW4gY29kZQorCisgICAgICAgICBUaGUgY29kZSBsZW5ndGggcmVwZWF0IGNvZGVzIGNhbiBjcm9zcyBmcm9tIEhMSVQgKyAyNTcgdG8gdGhlCisgICAgICAgICBIRElTVCArIDEgY29kZSBsZW5ndGhzLiAgSW4gb3RoZXIgd29yZHMsIGFsbCBjb2RlIGxlbmd0aHMgZm9ybQorICAgICAgICAgYSBzaW5nbGUgc2VxdWVuY2Ugb2YgSExJVCArIEhESVNUICsgMjU4IHZhbHVlcy4KKworICAgMy4zLiBDb21wbGlhbmNlCisKKyAgICAgIEEgY29tcHJlc3NvciBtYXkgbGltaXQgZnVydGhlciB0aGUgcmFuZ2VzIG9mIHZhbHVlcyBzcGVjaWZpZWQgaW4KKyAgICAgIHRoZSBwcmV2aW91cyBzZWN0aW9uIGFuZCBzdGlsbCBiZSBjb21wbGlhbnQ7IGZvciBleGFtcGxlLCBpdCBtYXkKKyAgICAgIGxpbWl0IHRoZSByYW5nZSBvZiBiYWNrd2FyZCBwb2ludGVycyB0byBzb21lIHZhbHVlIHNtYWxsZXIgdGhhbgorICAgICAgMzJLLiAgU2ltaWxhcmx5LCBhIGNvbXByZXNzb3IgbWF5IGxpbWl0IHRoZSBzaXplIG9mIGJsb2NrcyBzbyB0aGF0CisgICAgICBhIGNvbXByZXNzaWJsZSBibG9jayBmaXRzIGluIG1lbW9yeS4KKworICAgICAgQSBjb21wbGlhbnQgZGVjb21wcmVzc29yIG11c3QgYWNjZXB0IHRoZSBmdWxsIHJhbmdlIG9mIHBvc3NpYmxlCisgICAgICB2YWx1ZXMgZGVmaW5lZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgYW5kIG11c3QgYWNjZXB0IGJsb2NrcyBvZgorICAgICAgYXJiaXRyYXJ5IHNpemUuCisKKzQuIENvbXByZXNzaW9uIGFsZ29yaXRobSBkZXRhaWxzCisKKyAgIFdoaWxlIGl0IGlzIHRoZSBpbnRlbnQgb2YgdGhpcyBkb2N1bWVudCB0byBkZWZpbmUgdGhlICJkZWZsYXRlIgorICAgY29tcHJlc3NlZCBkYXRhIGZvcm1hdCB3aXRob3V0IHJlZmVyZW5jZSB0byBhbnkgcGFydGljdWxhcgorICAgY29tcHJlc3Npb24gYWxnb3JpdGhtLCB0aGUgZm9ybWF0IGlzIHJlbGF0ZWQgdG8gdGhlIGNvbXByZXNzZWQKKyAgIGZvcm1hdHMgcHJvZHVjZWQgYnkgTFo3NyAoTGVtcGVsLVppdiAxOTc3LCBzZWUgcmVmZXJlbmNlIFsyXSBiZWxvdyk7CisgICBzaW5jZSBtYW55IHZhcmlhdGlvbnMgb2YgTFo3NyBhcmUgcGF0ZW50ZWQsIGl0IGlzIHN0cm9uZ2x5CisgICByZWNvbW1lbmRlZCB0aGF0IHRoZSBpbXBsZW1lbnRvciBvZiBhIGNvbXByZXNzb3IgZm9sbG93IHRoZSBnZW5lcmFsCisgICBhbGdvcml0aG0gcHJlc2VudGVkIGhlcmUsIHdoaWNoIGlzIGtub3duIG5vdCB0byBiZSBwYXRlbnRlZCBwZXIgc2UuCisgICBUaGUgbWF0ZXJpYWwgaW4gdGhpcyBzZWN0aW9uIGlzIG5vdCBwYXJ0IG9mIHRoZSBkZWZpbml0aW9uIG9mIHRoZQorCisKKworRGV1dHNjaCAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgMTRdCisMCitSRkMgMTk1MSAgICAgIERFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgTWF5IDE5OTYKKworCisgICBzcGVjaWZpY2F0aW9uIHBlciBzZSwgYW5kIGEgY29tcHJlc3NvciBuZWVkIG5vdCBmb2xsb3cgaXQgaW4gb3JkZXIgdG8KKyAgIGJlIGNvbXBsaWFudC4KKworICAgVGhlIGNvbXByZXNzb3IgdGVybWluYXRlcyBhIGJsb2NrIHdoZW4gaXQgZGV0ZXJtaW5lcyB0aGF0IHN0YXJ0aW5nIGEKKyAgIG5ldyBibG9jayB3aXRoIGZyZXNoIHRyZWVzIHdvdWxkIGJlIHVzZWZ1bCwgb3Igd2hlbiB0aGUgYmxvY2sgc2l6ZQorICAgZmlsbHMgdXAgdGhlIGNvbXByZXNzb3IncyBibG9jayBidWZmZXIuCisKKyAgIFRoZSBjb21wcmVzc29yIHVzZXMgYSBjaGFpbmVkIGhhc2ggdGFibGUgdG8gZmluZCBkdXBsaWNhdGVkIHN0cmluZ3MsCisgICB1c2luZyBhIGhhc2ggZnVuY3Rpb24gdGhhdCBvcGVyYXRlcyBvbiAzLWJ5dGUgc2VxdWVuY2VzLiAgQXQgYW55CisgICBnaXZlbiBwb2ludCBkdXJpbmcgY29tcHJlc3Npb24sIGxldCBYWVogYmUgdGhlIG5leHQgMyBpbnB1dCBieXRlcyB0bworICAgYmUgZXhhbWluZWQgKG5vdCBuZWNlc3NhcmlseSBhbGwgZGlmZmVyZW50LCBvZiBjb3Vyc2UpLiAgRmlyc3QsIHRoZQorICAgY29tcHJlc3NvciBleGFtaW5lcyB0aGUgaGFzaCBjaGFpbiBmb3IgWFlaLiAgSWYgdGhlIGNoYWluIGlzIGVtcHR5LAorICAgdGhlIGNvbXByZXNzb3Igc2ltcGx5IHdyaXRlcyBvdXQgWCBhcyBhIGxpdGVyYWwgYnl0ZSBhbmQgYWR2YW5jZXMgb25lCisgICBieXRlIGluIHRoZSBpbnB1dC4gIElmIHRoZSBoYXNoIGNoYWluIGlzIG5vdCBlbXB0eSwgaW5kaWNhdGluZyB0aGF0CisgICB0aGUgc2VxdWVuY2UgWFlaIChvciwgaWYgd2UgYXJlIHVubHVja3ksIHNvbWUgb3RoZXIgMyBieXRlcyB3aXRoIHRoZQorICAgc2FtZSBoYXNoIGZ1bmN0aW9uIHZhbHVlKSBoYXMgb2NjdXJyZWQgcmVjZW50bHksIHRoZSBjb21wcmVzc29yCisgICBjb21wYXJlcyBhbGwgc3RyaW5ncyBvbiB0aGUgWFlaIGhhc2ggY2hhaW4gd2l0aCB0aGUgYWN0dWFsIGlucHV0IGRhdGEKKyAgIHNlcXVlbmNlIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IHBvaW50LCBhbmQgc2VsZWN0cyB0aGUgbG9uZ2VzdAorICAgbWF0Y2guCisKKyAgIFRoZSBjb21wcmVzc29yIHNlYXJjaGVzIHRoZSBoYXNoIGNoYWlucyBzdGFydGluZyB3aXRoIHRoZSBtb3N0IHJlY2VudAorICAgc3RyaW5ncywgdG8gZmF2b3Igc21hbGwgZGlzdGFuY2VzIGFuZCB0aHVzIHRha2UgYWR2YW50YWdlIG9mIHRoZQorICAgSHVmZm1hbiBlbmNvZGluZy4gIFRoZSBoYXNoIGNoYWlucyBhcmUgc2luZ2x5IGxpbmtlZC4gVGhlcmUgYXJlIG5vCisgICBkZWxldGlvbnMgZnJvbSB0aGUgaGFzaCBjaGFpbnM7IHRoZSBhbGdvcml0aG0gc2ltcGx5IGRpc2NhcmRzIG1hdGNoZXMKKyAgIHRoYXQgYXJlIHRvbyBvbGQuICBUbyBhdm9pZCBhIHdvcnN0LWNhc2Ugc2l0dWF0aW9uLCB2ZXJ5IGxvbmcgaGFzaAorICAgY2hhaW5zIGFyZSBhcmJpdHJhcmlseSB0cnVuY2F0ZWQgYXQgYSBjZXJ0YWluIGxlbmd0aCwgZGV0ZXJtaW5lZCBieSBhCisgICBydW4tdGltZSBwYXJhbWV0ZXIuCisKKyAgIFRvIGltcHJvdmUgb3ZlcmFsbCBjb21wcmVzc2lvbiwgdGhlIGNvbXByZXNzb3Igb3B0aW9uYWxseSBkZWZlcnMgdGhlCisgICBzZWxlY3Rpb24gb2YgbWF0Y2hlcyAoImxhenkgbWF0Y2hpbmciKTogYWZ0ZXIgYSBtYXRjaCBvZiBsZW5ndGggTiBoYXMKKyAgIGJlZW4gZm91bmQsIHRoZSBjb21wcmVzc29yIHNlYXJjaGVzIGZvciBhIGxvbmdlciBtYXRjaCBzdGFydGluZyBhdAorICAgdGhlIG5leHQgaW5wdXQgYnl0ZS4gIElmIGl0IGZpbmRzIGEgbG9uZ2VyIG1hdGNoLCBpdCB0cnVuY2F0ZXMgdGhlCisgICBwcmV2aW91cyBtYXRjaCB0byBhIGxlbmd0aCBvZiBvbmUgKHRodXMgcHJvZHVjaW5nIGEgc2luZ2xlIGxpdGVyYWwKKyAgIGJ5dGUpIGFuZCB0aGVuIGVtaXRzIHRoZSBsb25nZXIgbWF0Y2guICBPdGhlcndpc2UsIGl0IGVtaXRzIHRoZQorICAgb3JpZ2luYWwgbWF0Y2gsIGFuZCwgYXMgZGVzY3JpYmVkIGFib3ZlLCBhZHZhbmNlcyBOIGJ5dGVzIGJlZm9yZQorICAgY29udGludWluZy4KKworICAgUnVuLXRpbWUgcGFyYW1ldGVycyBhbHNvIGNvbnRyb2wgdGhpcyAibGF6eSBtYXRjaCIgcHJvY2VkdXJlLiAgSWYKKyAgIGNvbXByZXNzaW9uIHJhdGlvIGlzIG1vc3QgaW1wb3J0YW50LCB0aGUgY29tcHJlc3NvciBhdHRlbXB0cyBhCisgICBjb21wbGV0ZSBzZWNvbmQgc2VhcmNoIHJlZ2FyZGxlc3Mgb2YgdGhlIGxlbmd0aCBvZiB0aGUgZmlyc3QgbWF0Y2guCisgICBJbiB0aGUgbm9ybWFsIGNhc2UsIGlmIHRoZSBjdXJyZW50IG1hdGNoIGlzICJsb25nIGVub3VnaCIsIHRoZQorICAgY29tcHJlc3NvciByZWR1Y2VzIHRoZSBzZWFyY2ggZm9yIGEgbG9uZ2VyIG1hdGNoLCB0aHVzIHNwZWVkaW5nIHVwCisgICB0aGUgcHJvY2Vzcy4gIElmIHNwZWVkIGlzIG1vc3QgaW1wb3J0YW50LCB0aGUgY29tcHJlc3NvciBpbnNlcnRzIG5ldworICAgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IHdoZW4gbm8gbWF0Y2ggd2FzIGZvdW5kLCBvciB3aGVuIHRoZQorICAgbWF0Y2ggaXMgbm90ICJ0b28gbG9uZyIuICBUaGlzIGRlZ3JhZGVzIHRoZSBjb21wcmVzc2lvbiByYXRpbyBidXQKKyAgIHNhdmVzIHRpbWUgc2luY2UgdGhlcmUgYXJlIGJvdGggZmV3ZXIgaW5zZXJ0aW9ucyBhbmQgZmV3ZXIgc2VhcmNoZXMuCisKKworCisKKworRGV1dHNjaCAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgMTVdCisMCitSRkMgMTk1MSAgICAgIERFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgTWF5IDE5OTYKKworCis1LiBSZWZlcmVuY2VzCisKKyAgIFsxXSBIdWZmbWFuLCBELiBBLiwgIkEgTWV0aG9kIGZvciB0aGUgQ29uc3RydWN0aW9uIG9mIE1pbmltdW0KKyAgICAgICBSZWR1bmRhbmN5IENvZGVzIiwgUHJvY2VlZGluZ3Mgb2YgdGhlIEluc3RpdHV0ZSBvZiBSYWRpbworICAgICAgIEVuZ2luZWVycywgU2VwdGVtYmVyIDE5NTIsIFZvbHVtZSA0MCwgTnVtYmVyIDksIHBwLiAxMDk4LTExMDEuCisKKyAgIFsyXSBaaXYgSi4sIExlbXBlbCBBLiwgIkEgVW5pdmVyc2FsIEFsZ29yaXRobSBmb3IgU2VxdWVudGlhbCBEYXRhCisgICAgICAgQ29tcHJlc3Npb24iLCBJRUVFIFRyYW5zYWN0aW9ucyBvbiBJbmZvcm1hdGlvbiBUaGVvcnksIFZvbC4gMjMsCisgICAgICAgTm8uIDMsIHBwLiAzMzctMzQzLgorCisgICBbM10gR2FpbGx5LCBKLi1MLiwgYW5kIEFkbGVyLCBNLiwgWkxJQiBkb2N1bWVudGF0aW9uIGFuZCBzb3VyY2VzLAorICAgICAgIGF2YWlsYWJsZSBpbiBmdHA6Ly9mdHAudXUubmV0L3B1Yi9hcmNoaXZpbmcvemlwL2RvYy8KKworICAgWzRdIEdhaWxseSwgSi4tTC4sIGFuZCBBZGxlciwgTS4sIEdaSVAgZG9jdW1lbnRhdGlvbiBhbmQgc291cmNlcywKKyAgICAgICBhdmFpbGFibGUgYXMgZ3ppcC0qLnRhciBpbiBmdHA6Ly9wcmVwLmFpLm1pdC5lZHUvcHViL2dudS8KKworICAgWzVdIFNjaHdhcnR6LCBFLiBTLiwgYW5kIEthbGxpY2ssIEIuICJHZW5lcmF0aW5nIGEgY2Fub25pY2FsIHByZWZpeAorICAgICAgIGVuY29kaW5nLiIgQ29tbS4gQUNNLCA3LDMgKE1hci4gMTk2NCksIHBwLiAxNjYtMTY5LgorCisgICBbNl0gSGlyc2NoYmVyZyBhbmQgTGVsZXdlciwgIkVmZmljaWVudCBkZWNvZGluZyBvZiBwcmVmaXggY29kZXMsIgorICAgICAgIENvbW0uIEFDTSwgMzMsNCwgQXByaWwgMTk5MCwgcHAuIDQ0OS00NTkuCisKKzYuIFNlY3VyaXR5IENvbnNpZGVyYXRpb25zCisKKyAgIEFueSBkYXRhIGNvbXByZXNzaW9uIG1ldGhvZCBpbnZvbHZlcyB0aGUgcmVkdWN0aW9uIG9mIHJlZHVuZGFuY3kgaW4KKyAgIHRoZSBkYXRhLiAgQ29uc2VxdWVudGx5LCBhbnkgY29ycnVwdGlvbiBvZiB0aGUgZGF0YSBpcyBsaWtlbHkgdG8gaGF2ZQorICAgc2V2ZXJlIGVmZmVjdHMgYW5kIGJlIGRpZmZpY3VsdCB0byBjb3JyZWN0LiAgVW5jb21wcmVzc2VkIHRleHQsIG9uCisgICB0aGUgb3RoZXIgaGFuZCwgd2lsbCBwcm9iYWJseSBzdGlsbCBiZSByZWFkYWJsZSBkZXNwaXRlIHRoZSBwcmVzZW5jZQorICAgb2Ygc29tZSBjb3JydXB0ZWQgYnl0ZXMuCisKKyAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgc3lzdGVtcyB1c2luZyB0aGlzIGRhdGEgZm9ybWF0IHByb3ZpZGUgc29tZQorICAgbWVhbnMgb2YgdmFsaWRhdGluZyB0aGUgaW50ZWdyaXR5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEuICBTZWUKKyAgIHJlZmVyZW5jZSBbM10sIGZvciBleGFtcGxlLgorCis3LiBTb3VyY2UgY29kZQorCisgICBTb3VyY2UgY29kZSBmb3IgYSBDIGxhbmd1YWdlIGltcGxlbWVudGF0aW9uIG9mIGEgImRlZmxhdGUiIGNvbXBsaWFudAorICAgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIGlzIGF2YWlsYWJsZSB3aXRoaW4gdGhlIHpsaWIgcGFja2FnZSBhdAorICAgZnRwOi8vZnRwLnV1Lm5ldC9wdWIvYXJjaGl2aW5nL3ppcC96bGliLy4KKworOC4gQWNrbm93bGVkZ2VtZW50cworCisgICBUcmFkZW1hcmtzIGNpdGVkIGluIHRoaXMgZG9jdW1lbnQgYXJlIHRoZSBwcm9wZXJ0eSBvZiB0aGVpcgorICAgcmVzcGVjdGl2ZSBvd25lcnMuCisKKyAgIFBoaWwgS2F0eiBkZXNpZ25lZCB0aGUgZGVmbGF0ZSBmb3JtYXQuICBKZWFuLUxvdXAgR2FpbGx5IGFuZCBNYXJrCisgICBBZGxlciB3cm90ZSB0aGUgcmVsYXRlZCBzb2Z0d2FyZSBkZXNjcmliZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uLgorICAgR2xlbm4gUmFuZGVycy1QZWhyc29uIGNvbnZlcnRlZCB0aGlzIGRvY3VtZW50IHRvIFJGQyBhbmQgSFRNTCBmb3JtYXQuCisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxNl0KKwwKK1JGQyAxOTUxICAgICAgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICBNYXkgMTk5NgorCisKKzkuIEF1dGhvcidzIEFkZHJlc3MKKworICAgTC4gUGV0ZXIgRGV1dHNjaAorICAgQWxhZGRpbiBFbnRlcnByaXNlcworICAgMjAzIFNhbnRhIE1hcmdhcml0YSBBdmUuCisgICBNZW5sbyBQYXJrLCBDQSA5NDAyNQorCisgICBQaG9uZTogKDQxNSkgMzIyLTAxMDMgKEFNIG9ubHkpCisgICBGQVg6ICAgKDQxNSkgMzIyLTE3MzQKKyAgIEVNYWlsOiA8Z2hvc3RAYWxhZGRpbi5jb20+CisKKyAgIFF1ZXN0aW9ucyBhYm91dCB0aGUgdGVjaG5pY2FsIGNvbnRlbnQgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGNhbiBiZQorICAgc2VudCBieSBlbWFpbCB0bzoKKworICAgSmVhbi1Mb3VwIEdhaWxseSA8Z3ppcEBwcmVwLmFpLm1pdC5lZHU+IGFuZAorICAgTWFyayBBZGxlciA8bWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdT4KKworICAgRWRpdG9yaWFsIGNvbW1lbnRzIG9uIHRoaXMgc3BlY2lmaWNhdGlvbiBjYW4gYmUgc2VudCBieSBlbWFpbCB0bzoKKworICAgTC4gUGV0ZXIgRGV1dHNjaCA8Z2hvc3RAYWxhZGRpbi5jb20+IGFuZAorICAgR2xlbm4gUmFuZGVycy1QZWhyc29uIDxyYW5kZWdAYWx1bW5pLnJwaS5lZHU+CisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxN10KKwwKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2RvYy9yZmMxOTUyLnR4dCBiL3psaWIvc3JjL2RvYy9yZmMxOTUyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGU1MWI0Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvZG9jL3JmYzE5NTIudHh0CkBAIC0wLDAgKzEsNjc1IEBACisKKworCisKKworCitOZXR3b3JrIFdvcmtpbmcgR3JvdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAuIERldXRzY2gKK1JlcXVlc3QgZm9yIENvbW1lbnRzOiAxOTUyICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxhZGRpbiBFbnRlcnByaXNlcworQ2F0ZWdvcnk6IEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heSAxOTk2CisKKworICAgICAgICAgICAgICAgR1pJUCBmaWxlIGZvcm1hdCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gNC4zCisKK1N0YXR1cyBvZiBUaGlzIE1lbW8KKworICAgVGhpcyBtZW1vIHByb3ZpZGVzIGluZm9ybWF0aW9uIGZvciB0aGUgSW50ZXJuZXQgY29tbXVuaXR5LiAgVGhpcyBtZW1vCisgICBkb2VzIG5vdCBzcGVjaWZ5IGFuIEludGVybmV0IHN0YW5kYXJkIG9mIGFueSBraW5kLiAgRGlzdHJpYnV0aW9uIG9mCisgICB0aGlzIG1lbW8gaXMgdW5saW1pdGVkLgorCitJRVNHIE5vdGU6CisKKyAgIFRoZSBJRVNHIHRha2VzIG5vIHBvc2l0aW9uIG9uIHRoZSB2YWxpZGl0eSBvZiBhbnkgSW50ZWxsZWN0dWFsCisgICBQcm9wZXJ0eSBSaWdodHMgc3RhdGVtZW50cyBjb250YWluZWQgaW4gdGhpcyBkb2N1bWVudC4KKworTm90aWNlcworCisgICBDb3B5cmlnaHQgKGMpIDE5OTYgTC4gUGV0ZXIgRGV1dHNjaAorCisgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGlzIGRvY3VtZW50IGZvciBhbnkKKyAgIHB1cnBvc2UgYW5kIHdpdGhvdXQgY2hhcmdlLCBpbmNsdWRpbmcgdHJhbnNsYXRpb25zIGludG8gb3RoZXIKKyAgIGxhbmd1YWdlcyBhbmQgaW5jb3Jwb3JhdGlvbiBpbnRvIGNvbXBpbGF0aW9ucywgcHJvdmlkZWQgdGhhdCB0aGUKKyAgIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQsIGFuZCB0aGF0IGFueQorICAgc3Vic3RhbnRpdmUgY2hhbmdlcyBvciBkZWxldGlvbnMgZnJvbSB0aGUgb3JpZ2luYWwgYXJlIGNsZWFybHkKKyAgIG1hcmtlZC4KKworICAgQSBwb2ludGVyIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24gaW4KKyAgIEhUTUwgZm9ybWF0IGNhbiBiZSBmb3VuZCBhdCB0aGUgVVJMCisgICA8ZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9wbmcvZG9jdW1lbnRzL3psaWIvemRvYy1pbmRleC5odG1sPi4KKworQWJzdHJhY3QKKworICAgVGhpcyBzcGVjaWZpY2F0aW9uIGRlZmluZXMgYSBsb3NzbGVzcyBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IHRoYXQgaXMKKyAgIGNvbXBhdGlibGUgd2l0aCB0aGUgd2lkZWx5IHVzZWQgR1pJUCB1dGlsaXR5LiAgVGhlIGZvcm1hdCBpbmNsdWRlcyBhCisgICBjeWNsaWMgcmVkdW5kYW5jeSBjaGVjayB2YWx1ZSBmb3IgZGV0ZWN0aW5nIGRhdGEgY29ycnVwdGlvbi4gIFRoZQorICAgZm9ybWF0IHByZXNlbnRseSB1c2VzIHRoZSBERUZMQVRFIG1ldGhvZCBvZiBjb21wcmVzc2lvbiBidXQgY2FuIGJlCisgICBlYXNpbHkgZXh0ZW5kZWQgdG8gdXNlIG90aGVyIGNvbXByZXNzaW9uIG1ldGhvZHMuICBUaGUgZm9ybWF0IGNhbiBiZQorICAgaW1wbGVtZW50ZWQgcmVhZGlseSBpbiBhIG1hbm5lciBub3QgY292ZXJlZCBieSBwYXRlbnRzLgorCisKKworCisKKworCisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgMV0KKwwKK1JGQyAxOTUyICAgICAgICAgICAgIEdaSVAgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgICAgICBNYXkgMTk5NgorCisKK1RhYmxlIG9mIENvbnRlbnRzCisKKyAgIDEuIEludHJvZHVjdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMgorICAgICAgMS4xLiBQdXJwb3NlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAyCisgICAgICAxLjIuIEludGVuZGVkIGF1ZGllbmNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDMKKyAgICAgIDEuMy4gU2NvcGUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMworICAgICAgMS40LiBDb21wbGlhbmNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAzCisgICAgICAxLjUuIERlZmluaXRpb25zIG9mIHRlcm1zIGFuZCBjb252ZW50aW9ucyB1c2VkIC4uLi4uLi4uLi4uLi4uLi4uIDMKKyAgICAgIDEuNi4gQ2hhbmdlcyBmcm9tIHByZXZpb3VzIHZlcnNpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMworICAgMi4gRGV0YWlsZWQgc3BlY2lmaWNhdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiA0CisgICAgICAyLjEuIE92ZXJhbGwgY29udmVudGlvbnMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDQKKyAgICAgIDIuMi4gRmlsZSBmb3JtYXQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gNQorICAgICAgMi4zLiBNZW1iZXIgZm9ybWF0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiA1CisgICAgICAgICAgMi4zLjEuIE1lbWJlciBoZWFkZXIgYW5kIHRyYWlsZXIgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDYKKyAgICAgICAgICAgICAgMi4zLjEuMS4gRXh0cmEgZmllbGQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gOAorICAgICAgICAgICAgICAyLjMuMS4yLiBDb21wbGlhbmNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiA5CisgICAgICAzLiBSZWZlcmVuY2VzIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDkKKyAgICAgIDQuIFNlY3VyaXR5IENvbnNpZGVyYXRpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAxMAorICAgICAgNS4gQWNrbm93bGVkZ2VtZW50cyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDEwCisgICAgICA2LiBBdXRob3IncyBBZGRyZXNzIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMTAKKyAgICAgIDcuIEFwcGVuZGl4OiBKZWFuLUxvdXAgR2FpbGx5J3MgZ3ppcCB1dGlsaXR5IC4uLi4uLi4uLi4uLi4uLi4uLiAxMQorICAgICAgOC4gQXBwZW5kaXg6IFNhbXBsZSBDUkMgQ29kZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDExCisKKzEuIEludHJvZHVjdGlvbgorCisgICAxLjEuIFB1cnBvc2UKKworICAgICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGlzIHRvIGRlZmluZSBhIGxvc3NsZXNzCisgICAgICBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IHRoYXQ6CisKKyAgICAgICAgICAqIElzIGluZGVwZW5kZW50IG9mIENQVSB0eXBlLCBvcGVyYXRpbmcgc3lzdGVtLCBmaWxlIHN5c3RlbSwKKyAgICAgICAgICAgIGFuZCBjaGFyYWN0ZXIgc2V0LCBhbmQgaGVuY2UgY2FuIGJlIHVzZWQgZm9yIGludGVyY2hhbmdlOworICAgICAgICAgICogQ2FuIGNvbXByZXNzIG9yIGRlY29tcHJlc3MgYSBkYXRhIHN0cmVhbSAoYXMgb3Bwb3NlZCB0byBhCisgICAgICAgICAgICByYW5kb21seSBhY2Nlc3NpYmxlIGZpbGUpIHRvIHByb2R1Y2UgYW5vdGhlciBkYXRhIHN0cmVhbSwKKyAgICAgICAgICAgIHVzaW5nIG9ubHkgYW4gYSBwcmlvcmkgYm91bmRlZCBhbW91bnQgb2YgaW50ZXJtZWRpYXRlCisgICAgICAgICAgICBzdG9yYWdlLCBhbmQgaGVuY2UgY2FuIGJlIHVzZWQgaW4gZGF0YSBjb21tdW5pY2F0aW9ucyBvcgorICAgICAgICAgICAgc2ltaWxhciBzdHJ1Y3R1cmVzIHN1Y2ggYXMgVW5peCBmaWx0ZXJzOworICAgICAgICAgICogQ29tcHJlc3NlcyBkYXRhIHdpdGggZWZmaWNpZW5jeSBjb21wYXJhYmxlIHRvIHRoZSBiZXN0CisgICAgICAgICAgICBjdXJyZW50bHkgYXZhaWxhYmxlIGdlbmVyYWwtcHVycG9zZSBjb21wcmVzc2lvbiBtZXRob2RzLAorICAgICAgICAgICAgYW5kIGluIHBhcnRpY3VsYXIgY29uc2lkZXJhYmx5IGJldHRlciB0aGFuIHRoZSAiY29tcHJlc3MiCisgICAgICAgICAgICBwcm9ncmFtOworICAgICAgICAgICogQ2FuIGJlIGltcGxlbWVudGVkIHJlYWRpbHkgaW4gYSBtYW5uZXIgbm90IGNvdmVyZWQgYnkKKyAgICAgICAgICAgIHBhdGVudHMsIGFuZCBoZW5jZSBjYW4gYmUgcHJhY3RpY2VkIGZyZWVseTsKKyAgICAgICAgICAqIElzIGNvbXBhdGlibGUgd2l0aCB0aGUgZmlsZSBmb3JtYXQgcHJvZHVjZWQgYnkgdGhlIGN1cnJlbnQKKyAgICAgICAgICAgIHdpZGVseSB1c2VkIGd6aXAgdXRpbGl0eSwgaW4gdGhhdCBjb25mb3JtaW5nIGRlY29tcHJlc3NvcnMKKyAgICAgICAgICAgIHdpbGwgYmUgYWJsZSB0byByZWFkIGRhdGEgcHJvZHVjZWQgYnkgdGhlIGV4aXN0aW5nIGd6aXAKKyAgICAgICAgICAgIGNvbXByZXNzb3IuCisKKworCisKK0RldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSAyXQorDAorUkZDIDE5NTIgICAgICAgICAgICAgR1pJUCBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICAgICAgIE1heSAxOTk2CisKKworICAgICAgVGhlIGRhdGEgZm9ybWF0IGRlZmluZWQgYnkgdGhpcyBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGF0dGVtcHQgdG86CisKKyAgICAgICAgICAqIFByb3ZpZGUgcmFuZG9tIGFjY2VzcyB0byBjb21wcmVzc2VkIGRhdGE7CisgICAgICAgICAgKiBDb21wcmVzcyBzcGVjaWFsaXplZCBkYXRhIChlLmcuLCByYXN0ZXIgZ3JhcGhpY3MpIGFzIHdlbGwgYXMKKyAgICAgICAgICAgIHRoZSBiZXN0IGN1cnJlbnRseSBhdmFpbGFibGUgc3BlY2lhbGl6ZWQgYWxnb3JpdGhtcy4KKworICAgMS4yLiBJbnRlbmRlZCBhdWRpZW5jZQorCisgICAgICBUaGlzIHNwZWNpZmljYXRpb24gaXMgaW50ZW5kZWQgZm9yIHVzZSBieSBpbXBsZW1lbnRvcnMgb2Ygc29mdHdhcmUKKyAgICAgIHRvIGNvbXByZXNzIGRhdGEgaW50byBnemlwIGZvcm1hdCBhbmQvb3IgZGVjb21wcmVzcyBkYXRhIGZyb20gZ3ppcAorICAgICAgZm9ybWF0LgorCisgICAgICBUaGUgdGV4dCBvZiB0aGUgc3BlY2lmaWNhdGlvbiBhc3N1bWVzIGEgYmFzaWMgYmFja2dyb3VuZCBpbgorICAgICAgcHJvZ3JhbW1pbmcgYXQgdGhlIGxldmVsIG9mIGJpdHMgYW5kIG90aGVyIHByaW1pdGl2ZSBkYXRhCisgICAgICByZXByZXNlbnRhdGlvbnMuCisKKyAgIDEuMy4gU2NvcGUKKworICAgICAgVGhlIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzIGEgY29tcHJlc3Npb24gbWV0aG9kIGFuZCBhIGZpbGUgZm9ybWF0CisgICAgICAodGhlIGxhdHRlciBhc3N1bWluZyBvbmx5IHRoYXQgYSBmaWxlIGNhbiBzdG9yZSBhIHNlcXVlbmNlIG9mCisgICAgICBhcmJpdHJhcnkgYnl0ZXMpLiAgSXQgZG9lcyBub3Qgc3BlY2lmeSBhbnkgcGFydGljdWxhciBpbnRlcmZhY2UgdG8KKyAgICAgIGEgZmlsZSBzeXN0ZW0gb3IgYW55dGhpbmcgYWJvdXQgY2hhcmFjdGVyIHNldHMgb3IgZW5jb2RpbmdzCisgICAgICAoZXhjZXB0IGZvciBmaWxlIG5hbWVzIGFuZCBjb21tZW50cywgd2hpY2ggYXJlIG9wdGlvbmFsKS4KKworICAgMS40LiBDb21wbGlhbmNlCisKKyAgICAgIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCBhIGNvbXBsaWFudCBkZWNvbXByZXNzb3IgbXVzdCBiZQorICAgICAgYWJsZSB0byBhY2NlcHQgYW5kIGRlY29tcHJlc3MgYW55IGZpbGUgdGhhdCBjb25mb3JtcyB0byBhbGwgdGhlCisgICAgICBzcGVjaWZpY2F0aW9ucyBwcmVzZW50ZWQgaGVyZTsgYSBjb21wbGlhbnQgY29tcHJlc3NvciBtdXN0IHByb2R1Y2UKKyAgICAgIGZpbGVzIHRoYXQgY29uZm9ybSB0byBhbGwgdGhlIHNwZWNpZmljYXRpb25zIHByZXNlbnRlZCBoZXJlLiAgVGhlCisgICAgICBtYXRlcmlhbCBpbiB0aGUgYXBwZW5kaWNlcyBpcyBub3QgcGFydCBvZiB0aGUgc3BlY2lmaWNhdGlvbiBwZXIgc2UKKyAgICAgIGFuZCBpcyBub3QgcmVsZXZhbnQgdG8gY29tcGxpYW5jZS4KKworICAgMS41LiBEZWZpbml0aW9ucyBvZiB0ZXJtcyBhbmQgY29udmVudGlvbnMgdXNlZAorCisgICAgICBieXRlOiA4IGJpdHMgc3RvcmVkIG9yIHRyYW5zbWl0dGVkIGFzIGEgdW5pdCAoc2FtZSBhcyBhbiBvY3RldCkuCisgICAgICAoRm9yIHRoaXMgc3BlY2lmaWNhdGlvbiwgYSBieXRlIGlzIGV4YWN0bHkgOCBiaXRzLCBldmVuIG9uCisgICAgICBtYWNoaW5lcyB3aGljaCBzdG9yZSBhIGNoYXJhY3RlciBvbiBhIG51bWJlciBvZiBiaXRzIGRpZmZlcmVudAorICAgICAgZnJvbSA4LikgIFNlZSBiZWxvdyBmb3IgdGhlIG51bWJlcmluZyBvZiBiaXRzIHdpdGhpbiBhIGJ5dGUuCisKKyAgIDEuNi4gQ2hhbmdlcyBmcm9tIHByZXZpb3VzIHZlcnNpb25zCisKKyAgICAgIFRoZXJlIGhhdmUgYmVlbiBubyB0ZWNobmljYWwgY2hhbmdlcyB0byB0aGUgZ3ppcCBmb3JtYXQgc2luY2UKKyAgICAgIHZlcnNpb24gNC4xIG9mIHRoaXMgc3BlY2lmaWNhdGlvbi4gIEluIHZlcnNpb24gNC4yLCBzb21lCisgICAgICB0ZXJtaW5vbG9neSB3YXMgY2hhbmdlZCwgYW5kIHRoZSBzYW1wbGUgQ1JDIGNvZGUgd2FzIHJld3JpdHRlbiBmb3IKKyAgICAgIGNsYXJpdHkgYW5kIHRvIGVsaW1pbmF0ZSB0aGUgcmVxdWlyZW1lbnQgZm9yIHRoZSBjYWxsZXIgdG8gZG8gcHJlLQorICAgICAgYW5kIHBvc3QtY29uZGl0aW9uaW5nLiAgVmVyc2lvbiA0LjMgaXMgYSBjb252ZXJzaW9uIG9mIHRoZQorICAgICAgc3BlY2lmaWNhdGlvbiB0byBSRkMgc3R5bGUuCisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgM10KKwwKK1JGQyAxOTUyICAgICAgICAgICAgIEdaSVAgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgICAgICBNYXkgMTk5NgorCisKKzIuIERldGFpbGVkIHNwZWNpZmljYXRpb24KKworICAgMi4xLiBPdmVyYWxsIGNvbnZlbnRpb25zCisKKyAgICAgIEluIHRoZSBkaWFncmFtcyBiZWxvdywgYSBib3ggbGlrZSB0aGlzOgorCisgICAgICAgICArLS0tKworICAgICAgICAgfCAgIHwgPC0tIHRoZSB2ZXJ0aWNhbCBiYXJzIG1pZ2h0IGJlIG1pc3NpbmcKKyAgICAgICAgICstLS0rCisKKyAgICAgIHJlcHJlc2VudHMgb25lIGJ5dGU7IGEgYm94IGxpa2UgdGhpczoKKworICAgICAgICAgKz09PT09PT09PT09PT09KworICAgICAgICAgfCAgICAgICAgICAgICAgfAorICAgICAgICAgKz09PT09PT09PT09PT09KworCisgICAgICByZXByZXNlbnRzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGJ5dGVzLgorCisgICAgICBCeXRlcyBzdG9yZWQgd2l0aGluIGEgY29tcHV0ZXIgZG8gbm90IGhhdmUgYSAiYml0IG9yZGVyIiwgc2luY2UKKyAgICAgIHRoZXkgYXJlIGFsd2F5cyB0cmVhdGVkIGFzIGEgdW5pdC4gIEhvd2V2ZXIsIGEgYnl0ZSBjb25zaWRlcmVkIGFzCisgICAgICBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1IGRvZXMgaGF2ZSBhIG1vc3QtIGFuZCBsZWFzdC0KKyAgICAgIHNpZ25pZmljYW50IGJpdCwgYW5kIHNpbmNlIHdlIHdyaXRlIG51bWJlcnMgd2l0aCB0aGUgbW9zdC0KKyAgICAgIHNpZ25pZmljYW50IGRpZ2l0IG9uIHRoZSBsZWZ0LCB3ZSBhbHNvIHdyaXRlIGJ5dGVzIHdpdGggdGhlIG1vc3QtCisgICAgICBzaWduaWZpY2FudCBiaXQgb24gdGhlIGxlZnQuICBJbiB0aGUgZGlhZ3JhbXMgYmVsb3csIHdlIG51bWJlciB0aGUKKyAgICAgIGJpdHMgb2YgYSBieXRlIHNvIHRoYXQgYml0IDAgaXMgdGhlIGxlYXN0LXNpZ25pZmljYW50IGJpdCwgaS5lLiwKKyAgICAgIHRoZSBiaXRzIGFyZSBudW1iZXJlZDoKKworICAgICAgICAgKy0tLS0tLS0tKworICAgICAgICAgfDc2NTQzMjEwfAorICAgICAgICAgKy0tLS0tLS0tKworCisgICAgICBUaGlzIGRvY3VtZW50IGRvZXMgbm90IGFkZHJlc3MgdGhlIGlzc3VlIG9mIHRoZSBvcmRlciBpbiB3aGljaAorICAgICAgYml0cyBvZiBhIGJ5dGUgYXJlIHRyYW5zbWl0dGVkIG9uIGEgYml0LXNlcXVlbnRpYWwgbWVkaXVtLCBzaW5jZQorICAgICAgdGhlIGRhdGEgZm9ybWF0IGRlc2NyaWJlZCBoZXJlIGlzIGJ5dGUtIHJhdGhlciB0aGFuIGJpdC1vcmllbnRlZC4KKworICAgICAgV2l0aGluIGEgY29tcHV0ZXIsIGEgbnVtYmVyIG1heSBvY2N1cHkgbXVsdGlwbGUgYnl0ZXMuICBBbGwKKyAgICAgIG11bHRpLWJ5dGUgbnVtYmVycyBpbiB0aGUgZm9ybWF0IGRlc2NyaWJlZCBoZXJlIGFyZSBzdG9yZWQgd2l0aAorICAgICAgdGhlIGxlYXN0LXNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKGF0IHRoZSBsb3dlciBtZW1vcnkgYWRkcmVzcykuCisgICAgICBGb3IgZXhhbXBsZSwgdGhlIGRlY2ltYWwgbnVtYmVyIDUyMCBpcyBzdG9yZWQgYXM6CisKKyAgICAgICAgICAgICAwICAgICAgICAxCisgICAgICAgICArLS0tLS0tLS0rLS0tLS0tLS0rCisgICAgICAgICB8MDAwMDEwMDB8MDAwMDAwMTB8CisgICAgICAgICArLS0tLS0tLS0rLS0tLS0tLS0rCisgICAgICAgICAgXiAgICAgICAgXgorICAgICAgICAgIHwgICAgICAgIHwKKyAgICAgICAgICB8ICAgICAgICArIG1vcmUgc2lnbmlmaWNhbnQgYnl0ZSA9IDIgeCAyNTYKKyAgICAgICAgICArIGxlc3Mgc2lnbmlmaWNhbnQgYnl0ZSA9IDgKKworCisKK0RldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSA0XQorDAorUkZDIDE5NTIgICAgICAgICAgICAgR1pJUCBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICAgICAgIE1heSAxOTk2CisKKworICAgMi4yLiBGaWxlIGZvcm1hdAorCisgICAgICBBIGd6aXAgZmlsZSBjb25zaXN0cyBvZiBhIHNlcmllcyBvZiAibWVtYmVycyIgKGNvbXByZXNzZWQgZGF0YQorICAgICAgc2V0cykuICBUaGUgZm9ybWF0IG9mIGVhY2ggbWVtYmVyIGlzIHNwZWNpZmllZCBpbiB0aGUgZm9sbG93aW5nCisgICAgICBzZWN0aW9uLiAgVGhlIG1lbWJlcnMgc2ltcGx5IGFwcGVhciBvbmUgYWZ0ZXIgYW5vdGhlciBpbiB0aGUgZmlsZSwKKyAgICAgIHdpdGggbm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBiZWZvcmUsIGJldHdlZW4sIG9yIGFmdGVyIHRoZW0uCisKKyAgIDIuMy4gTWVtYmVyIGZvcm1hdAorCisgICAgICBFYWNoIG1lbWJlciBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisKKyAgICAgICAgICstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCisgICAgICAgICB8SUQxfElEMnxDTSB8RkxHfCAgICAgTVRJTUUgICAgIHxYRkx8T1MgfCAobW9yZS0tPikKKyAgICAgICAgICstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCisKKyAgICAgIChpZiBGTEcuRkVYVFJBIHNldCkKKworICAgICAgICAgKy0tLSstLS0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KworICAgICAgICAgfCBYTEVOICB8Li4uWExFTiBieXRlcyBvZiAiZXh0cmEgZmllbGQiLi4ufCAobW9yZS0tPikKKyAgICAgICAgICstLS0rLS0tKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKKworICAgICAgKGlmIEZMRy5GTkFNRSBzZXQpCisKKyAgICAgICAgICs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKKyAgICAgICAgIHwuLi5vcmlnaW5hbCBmaWxlIG5hbWUsIHplcm8tdGVybWluYXRlZC4uLnwgKG1vcmUtLT4pCisgICAgICAgICArPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCisKKyAgICAgIChpZiBGTEcuRkNPTU1FTlQgc2V0KQorCisgICAgICAgICArPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCisgICAgICAgICB8Li4uZmlsZSBjb21tZW50LCB6ZXJvLXRlcm1pbmF0ZWQuLi58IChtb3JlLS0+KQorICAgICAgICAgKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KworCisgICAgICAoaWYgRkxHLkZIQ1JDIHNldCkKKworICAgICAgICAgKy0tLSstLS0rCisgICAgICAgICB8IENSQzE2IHwKKyAgICAgICAgICstLS0rLS0tKworCisgICAgICAgICArPT09PT09PT09PT09PT09PT09PT09PT0rCisgICAgICAgICB8Li4uY29tcHJlc3NlZCBibG9ja3MuLi58IChtb3JlLS0+KQorICAgICAgICAgKz09PT09PT09PT09PT09PT09PT09PT09KworCisgICAgICAgICAgIDAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYgICA3CisgICAgICAgICArLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKKyAgICAgICAgIHwgICAgIENSQzMyICAgICB8ICAgICBJU0laRSAgICAgfAorICAgICAgICAgKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCisKKworCisKK0RldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSA1XQorDAorUkZDIDE5NTIgICAgICAgICAgICAgR1pJUCBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICAgICAgIE1heSAxOTk2CisKKworICAgICAgMi4zLjEuIE1lbWJlciBoZWFkZXIgYW5kIHRyYWlsZXIKKworICAgICAgICAgSUQxIChJRGVudGlmaWNhdGlvbiAxKQorICAgICAgICAgSUQyIChJRGVudGlmaWNhdGlvbiAyKQorICAgICAgICAgICAgVGhlc2UgaGF2ZSB0aGUgZml4ZWQgdmFsdWVzIElEMSA9IDMxICgweDFmLCBcMDM3KSwgSUQyID0gMTM5CisgICAgICAgICAgICAoMHg4YiwgXDIxMyksIHRvIGlkZW50aWZ5IHRoZSBmaWxlIGFzIGJlaW5nIGluIGd6aXAgZm9ybWF0LgorCisgICAgICAgICBDTSAoQ29tcHJlc3Npb24gTWV0aG9kKQorICAgICAgICAgICAgVGhpcyBpZGVudGlmaWVzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgdXNlZCBpbiB0aGUgZmlsZS4gIENNCisgICAgICAgICAgICA9IDAtNyBhcmUgcmVzZXJ2ZWQuICBDTSA9IDggZGVub3RlcyB0aGUgImRlZmxhdGUiCisgICAgICAgICAgICBjb21wcmVzc2lvbiBtZXRob2QsIHdoaWNoIGlzIHRoZSBvbmUgY3VzdG9tYXJpbHkgdXNlZCBieQorICAgICAgICAgICAgZ3ppcCBhbmQgd2hpY2ggaXMgZG9jdW1lbnRlZCBlbHNld2hlcmUuCisKKyAgICAgICAgIEZMRyAoRkxhR3MpCisgICAgICAgICAgICBUaGlzIGZsYWcgYnl0ZSBpcyBkaXZpZGVkIGludG8gaW5kaXZpZHVhbCBiaXRzIGFzIGZvbGxvd3M6CisKKyAgICAgICAgICAgICAgIGJpdCAwICAgRlRFWFQKKyAgICAgICAgICAgICAgIGJpdCAxICAgRkhDUkMKKyAgICAgICAgICAgICAgIGJpdCAyICAgRkVYVFJBCisgICAgICAgICAgICAgICBiaXQgMyAgIEZOQU1FCisgICAgICAgICAgICAgICBiaXQgNCAgIEZDT01NRU5UCisgICAgICAgICAgICAgICBiaXQgNSAgIHJlc2VydmVkCisgICAgICAgICAgICAgICBiaXQgNiAgIHJlc2VydmVkCisgICAgICAgICAgICAgICBiaXQgNyAgIHJlc2VydmVkCisKKyAgICAgICAgICAgIElmIEZURVhUIGlzIHNldCwgdGhlIGZpbGUgaXMgcHJvYmFibHkgQVNDSUkgdGV4dC4gIFRoaXMgaXMKKyAgICAgICAgICAgIGFuIG9wdGlvbmFsIGluZGljYXRpb24sIHdoaWNoIHRoZSBjb21wcmVzc29yIG1heSBzZXQgYnkKKyAgICAgICAgICAgIGNoZWNraW5nIGEgc21hbGwgYW1vdW50IG9mIHRoZSBpbnB1dCBkYXRhIHRvIHNlZSB3aGV0aGVyIGFueQorICAgICAgICAgICAgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgYXJlIHByZXNlbnQuICBJbiBjYXNlIG9mIGRvdWJ0LCBGVEVYVAorICAgICAgICAgICAgaXMgY2xlYXJlZCwgaW5kaWNhdGluZyBiaW5hcnkgZGF0YS4gRm9yIHN5c3RlbXMgd2hpY2ggaGF2ZQorICAgICAgICAgICAgZGlmZmVyZW50IGZpbGUgZm9ybWF0cyBmb3IgYXNjaWkgdGV4dCBhbmQgYmluYXJ5IGRhdGEsIHRoZQorICAgICAgICAgICAgZGVjb21wcmVzc29yIGNhbiB1c2UgRlRFWFQgdG8gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQuCisgICAgICAgICAgICBXZSBkZWxpYmVyYXRlbHkgZG8gbm90IHNwZWNpZnkgdGhlIGFsZ29yaXRobSB1c2VkIHRvIHNldAorICAgICAgICAgICAgdGhpcyBiaXQsIHNpbmNlIGEgY29tcHJlc3NvciBhbHdheXMgaGFzIHRoZSBvcHRpb24gb2YKKyAgICAgICAgICAgIGxlYXZpbmcgaXQgY2xlYXJlZCBhbmQgYSBkZWNvbXByZXNzb3IgYWx3YXlzIGhhcyB0aGUgb3B0aW9uCisgICAgICAgICAgICBvZiBpZ25vcmluZyBpdCBhbmQgbGV0dGluZyBzb21lIG90aGVyIHByb2dyYW0gaGFuZGxlIGlzc3VlcworICAgICAgICAgICAgb2YgZGF0YSBjb252ZXJzaW9uLgorCisgICAgICAgICAgICBJZiBGSENSQyBpcyBzZXQsIGEgQ1JDMTYgZm9yIHRoZSBnemlwIGhlYWRlciBpcyBwcmVzZW50LAorICAgICAgICAgICAgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBjb21wcmVzc2VkIGRhdGEuIFRoZSBDUkMxNiBjb25zaXN0cworICAgICAgICAgICAgb2YgdGhlIHR3byBsZWFzdCBzaWduaWZpY2FudCBieXRlcyBvZiB0aGUgQ1JDMzIgZm9yIGFsbAorICAgICAgICAgICAgYnl0ZXMgb2YgdGhlIGd6aXAgaGVhZGVyIHVwIHRvIGFuZCBub3QgaW5jbHVkaW5nIHRoZSBDUkMxNi4KKyAgICAgICAgICAgIFtUaGUgRkhDUkMgYml0IHdhcyBuZXZlciBzZXQgYnkgdmVyc2lvbnMgb2YgZ3ppcCB1cCB0bworICAgICAgICAgICAgMS4yLjQsIGV2ZW4gdGhvdWdoIGl0IHdhcyBkb2N1bWVudGVkIHdpdGggYSBkaWZmZXJlbnQKKyAgICAgICAgICAgIG1lYW5pbmcgaW4gZ3ppcCAxLjIuNC5dCisKKyAgICAgICAgICAgIElmIEZFWFRSQSBpcyBzZXQsIG9wdGlvbmFsIGV4dHJhIGZpZWxkcyBhcmUgcHJlc2VudCwgYXMKKyAgICAgICAgICAgIGRlc2NyaWJlZCBpbiBhIGZvbGxvd2luZyBzZWN0aW9uLgorCisKKworRGV1dHNjaCAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDZdCisMCitSRkMgMTk1MiAgICAgICAgICAgICBHWklQIEZpbGUgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICAgICAgICAgTWF5IDE5OTYKKworCisgICAgICAgICAgICBJZiBGTkFNRSBpcyBzZXQsIGFuIG9yaWdpbmFsIGZpbGUgbmFtZSBpcyBwcmVzZW50LAorICAgICAgICAgICAgdGVybWluYXRlZCBieSBhIHplcm8gYnl0ZS4gIFRoZSBuYW1lIG11c3QgY29uc2lzdCBvZiBJU08KKyAgICAgICAgICAgIDg4NTktMSAoTEFUSU4tMSkgY2hhcmFjdGVyczsgb24gb3BlcmF0aW5nIHN5c3RlbXMgdXNpbmcKKyAgICAgICAgICAgIEVCQ0RJQyBvciBhbnkgb3RoZXIgY2hhcmFjdGVyIHNldCBmb3IgZmlsZSBuYW1lcywgdGhlIG5hbWUKKyAgICAgICAgICAgIG11c3QgYmUgdHJhbnNsYXRlZCB0byB0aGUgSVNPIExBVElOLTEgY2hhcmFjdGVyIHNldC4gIFRoaXMKKyAgICAgICAgICAgIGlzIHRoZSBvcmlnaW5hbCBuYW1lIG9mIHRoZSBmaWxlIGJlaW5nIGNvbXByZXNzZWQsIHdpdGggYW55CisgICAgICAgICAgICBkaXJlY3RvcnkgY29tcG9uZW50cyByZW1vdmVkLCBhbmQsIGlmIHRoZSBmaWxlIGJlaW5nCisgICAgICAgICAgICBjb21wcmVzc2VkIGlzIG9uIGEgZmlsZSBzeXN0ZW0gd2l0aCBjYXNlIGluc2Vuc2l0aXZlIG5hbWVzLAorICAgICAgICAgICAgZm9yY2VkIHRvIGxvd2VyIGNhc2UuIFRoZXJlIGlzIG5vIG9yaWdpbmFsIGZpbGUgbmFtZSBpZiB0aGUKKyAgICAgICAgICAgIGRhdGEgd2FzIGNvbXByZXNzZWQgZnJvbSBhIHNvdXJjZSBvdGhlciB0aGFuIGEgbmFtZWQgZmlsZTsKKyAgICAgICAgICAgIGZvciBleGFtcGxlLCBpZiB0aGUgc291cmNlIHdhcyBzdGRpbiBvbiBhIFVuaXggc3lzdGVtLCB0aGVyZQorICAgICAgICAgICAgaXMgbm8gZmlsZSBuYW1lLgorCisgICAgICAgICAgICBJZiBGQ09NTUVOVCBpcyBzZXQsIGEgemVyby10ZXJtaW5hdGVkIGZpbGUgY29tbWVudCBpcworICAgICAgICAgICAgcHJlc2VudC4gIFRoaXMgY29tbWVudCBpcyBub3QgaW50ZXJwcmV0ZWQ7IGl0IGlzIG9ubHkKKyAgICAgICAgICAgIGludGVuZGVkIGZvciBodW1hbiBjb25zdW1wdGlvbi4gIFRoZSBjb21tZW50IG11c3QgY29uc2lzdCBvZgorICAgICAgICAgICAgSVNPIDg4NTktMSAoTEFUSU4tMSkgY2hhcmFjdGVycy4gIExpbmUgYnJlYWtzIHNob3VsZCBiZQorICAgICAgICAgICAgZGVub3RlZCBieSBhIHNpbmdsZSBsaW5lIGZlZWQgY2hhcmFjdGVyICgxMCBkZWNpbWFsKS4KKworICAgICAgICAgICAgUmVzZXJ2ZWQgRkxHIGJpdHMgbXVzdCBiZSB6ZXJvLgorCisgICAgICAgICBNVElNRSAoTW9kaWZpY2F0aW9uIFRJTUUpCisgICAgICAgICAgICBUaGlzIGdpdmVzIHRoZSBtb3N0IHJlY2VudCBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUgb3JpZ2luYWwKKyAgICAgICAgICAgIGZpbGUgYmVpbmcgY29tcHJlc3NlZC4gIFRoZSB0aW1lIGlzIGluIFVuaXggZm9ybWF0LCBpLmUuLAorICAgICAgICAgICAgc2Vjb25kcyBzaW5jZSAwMDowMDowMCBHTVQsIEphbi4gIDEsIDE5NzAuICAoTm90ZSB0aGF0IHRoaXMKKyAgICAgICAgICAgIG1heSBjYXVzZSBwcm9ibGVtcyBmb3IgTVMtRE9TIGFuZCBvdGhlciBzeXN0ZW1zIHRoYXQgdXNlCisgICAgICAgICAgICBsb2NhbCByYXRoZXIgdGhhbiBVbml2ZXJzYWwgdGltZS4pICBJZiB0aGUgY29tcHJlc3NlZCBkYXRhCisgICAgICAgICAgICBkaWQgbm90IGNvbWUgZnJvbSBhIGZpbGUsIE1USU1FIGlzIHNldCB0byB0aGUgdGltZSBhdCB3aGljaAorICAgICAgICAgICAgY29tcHJlc3Npb24gc3RhcnRlZC4gIE1USU1FID0gMCBtZWFucyBubyB0aW1lIHN0YW1wIGlzCisgICAgICAgICAgICBhdmFpbGFibGUuCisKKyAgICAgICAgIFhGTCAoZVh0cmEgRkxhZ3MpCisgICAgICAgICAgICBUaGVzZSBmbGFncyBhcmUgYXZhaWxhYmxlIGZvciB1c2UgYnkgc3BlY2lmaWMgY29tcHJlc3Npb24KKyAgICAgICAgICAgIG1ldGhvZHMuICBUaGUgImRlZmxhdGUiIG1ldGhvZCAoQ00gPSA4KSBzZXRzIHRoZXNlIGZsYWdzIGFzCisgICAgICAgICAgICBmb2xsb3dzOgorCisgICAgICAgICAgICAgICBYRkwgPSAyIC0gY29tcHJlc3NvciB1c2VkIG1heGltdW0gY29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2xvd2VzdCBhbGdvcml0aG0KKyAgICAgICAgICAgICAgIFhGTCA9IDQgLSBjb21wcmVzc29yIHVzZWQgZmFzdGVzdCBhbGdvcml0aG0KKworICAgICAgICAgT1MgKE9wZXJhdGluZyBTeXN0ZW0pCisgICAgICAgICAgICBUaGlzIGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgZmlsZSBzeXN0ZW0gb24gd2hpY2ggY29tcHJlc3Npb24KKyAgICAgICAgICAgIHRvb2sgcGxhY2UuICBUaGlzIG1heSBiZSB1c2VmdWwgaW4gZGV0ZXJtaW5pbmcgZW5kLW9mLWxpbmUKKyAgICAgICAgICAgIGNvbnZlbnRpb24gZm9yIHRleHQgZmlsZXMuICBUaGUgY3VycmVudGx5IGRlZmluZWQgdmFsdWVzIGFyZQorICAgICAgICAgICAgYXMgZm9sbG93czoKKworCisKKworCisKK0RldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSA3XQorDAorUkZDIDE5NTIgICAgICAgICAgICAgR1pJUCBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICAgICAgIE1heSAxOTk2CisKKworICAgICAgICAgICAgICAgICAwIC0gRkFUIGZpbGVzeXN0ZW0gKE1TLURPUywgT1MvMiwgTlQvV2luMzIpCisgICAgICAgICAgICAgICAgIDEgLSBBbWlnYQorICAgICAgICAgICAgICAgICAyIC0gVk1TIChvciBPcGVuVk1TKQorICAgICAgICAgICAgICAgICAzIC0gVW5peAorICAgICAgICAgICAgICAgICA0IC0gVk0vQ01TCisgICAgICAgICAgICAgICAgIDUgLSBBdGFyaSBUT1MKKyAgICAgICAgICAgICAgICAgNiAtIEhQRlMgZmlsZXN5c3RlbSAoT1MvMiwgTlQpCisgICAgICAgICAgICAgICAgIDcgLSBNYWNpbnRvc2gKKyAgICAgICAgICAgICAgICAgOCAtIFotU3lzdGVtCisgICAgICAgICAgICAgICAgIDkgLSBDUC9NCisgICAgICAgICAgICAgICAgMTAgLSBUT1BTLTIwCisgICAgICAgICAgICAgICAgMTEgLSBOVEZTIGZpbGVzeXN0ZW0gKE5UKQorICAgICAgICAgICAgICAgIDEyIC0gUURPUworICAgICAgICAgICAgICAgIDEzIC0gQWNvcm4gUklTQ09TCisgICAgICAgICAgICAgICAyNTUgLSB1bmtub3duCisKKyAgICAgICAgIFhMRU4gKGVYdHJhIExFTmd0aCkKKyAgICAgICAgICAgIElmIEZMRy5GRVhUUkEgaXMgc2V0LCB0aGlzIGdpdmVzIHRoZSBsZW5ndGggb2YgdGhlIG9wdGlvbmFsCisgICAgICAgICAgICBleHRyYSBmaWVsZC4gIFNlZSBiZWxvdyBmb3IgZGV0YWlscy4KKworICAgICAgICAgQ1JDMzIgKENSQy0zMikKKyAgICAgICAgICAgIFRoaXMgY29udGFpbnMgYSBDeWNsaWMgUmVkdW5kYW5jeSBDaGVjayB2YWx1ZSBvZiB0aGUKKyAgICAgICAgICAgIHVuY29tcHJlc3NlZCBkYXRhIGNvbXB1dGVkIGFjY29yZGluZyB0byBDUkMtMzIgYWxnb3JpdGhtCisgICAgICAgICAgICB1c2VkIGluIHRoZSBJU08gMzMwOSBzdGFuZGFyZCBhbmQgaW4gc2VjdGlvbiA4LjEuMS42LjIgb2YKKyAgICAgICAgICAgIElUVS1UIHJlY29tbWVuZGF0aW9uIFYuNDIuICAoU2VlIGh0dHA6Ly93d3cuaXNvLmNoIGZvcgorICAgICAgICAgICAgb3JkZXJpbmcgSVNPIGRvY3VtZW50cy4gU2VlIGdvcGhlcjovL2luZm8uaXR1LmNoIGZvciBhbgorICAgICAgICAgICAgb25saW5lIHZlcnNpb24gb2YgSVRVLVQgVi40Mi4pCisKKyAgICAgICAgIElTSVpFIChJbnB1dCBTSVpFKQorICAgICAgICAgICAgVGhpcyBjb250YWlucyB0aGUgc2l6ZSBvZiB0aGUgb3JpZ2luYWwgKHVuY29tcHJlc3NlZCkgaW5wdXQKKyAgICAgICAgICAgIGRhdGEgbW9kdWxvIDJeMzIuCisKKyAgICAgIDIuMy4xLjEuIEV4dHJhIGZpZWxkCisKKyAgICAgICAgIElmIHRoZSBGTEcuRkVYVFJBIGJpdCBpcyBzZXQsIGFuICJleHRyYSBmaWVsZCIgaXMgcHJlc2VudCBpbgorICAgICAgICAgdGhlIGhlYWRlciwgd2l0aCB0b3RhbCBsZW5ndGggWExFTiBieXRlcy4gIEl0IGNvbnNpc3RzIG9mIGEKKyAgICAgICAgIHNlcmllcyBvZiBzdWJmaWVsZHMsIGVhY2ggb2YgdGhlIGZvcm06CisKKyAgICAgICAgICAgICstLS0rLS0tKy0tLSstLS0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKKyAgICAgICAgICAgIHxTSTF8U0kyfCAgTEVOICB8Li4uIExFTiBieXRlcyBvZiBzdWJmaWVsZCBkYXRhIC4uLnwKKyAgICAgICAgICAgICstLS0rLS0tKy0tLSstLS0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKKworICAgICAgICAgU0kxIGFuZCBTSTIgcHJvdmlkZSBhIHN1YmZpZWxkIElELCB0eXBpY2FsbHkgdHdvIEFTQ0lJIGxldHRlcnMKKyAgICAgICAgIHdpdGggc29tZSBtbmVtb25pYyB2YWx1ZS4gIEplYW4tTG91cCBHYWlsbHkKKyAgICAgICAgIDxnemlwQHByZXAuYWkubWl0LmVkdT4gaXMgbWFpbnRhaW5pbmcgYSByZWdpc3RyeSBvZiBzdWJmaWVsZAorICAgICAgICAgSURzOyBwbGVhc2Ugc2VuZCBoaW0gYW55IHN1YmZpZWxkIElEIHlvdSB3aXNoIHRvIHVzZS4gIFN1YmZpZWxkCisgICAgICAgICBJRHMgd2l0aCBTSTIgPSAwIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gIFRoZSBmb2xsb3dpbmcKKyAgICAgICAgIElEcyBhcmUgY3VycmVudGx5IGRlZmluZWQ6CisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgOF0KKwwKK1JGQyAxOTUyICAgICAgICAgICAgIEdaSVAgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgICAgICBNYXkgMTk5NgorCisKKyAgICAgICAgICAgIFNJMSAgICAgICAgIFNJMiAgICAgICAgIERhdGEKKyAgICAgICAgICAgIC0tLS0tLS0tLS0gIC0tLS0tLS0tLS0gIC0tLS0KKyAgICAgICAgICAgIDB4NDEgKCdBJykgIDB4NzAgKCdQJykgIEFwb2xsbyBmaWxlIHR5cGUgaW5mb3JtYXRpb24KKworICAgICAgICAgTEVOIGdpdmVzIHRoZSBsZW5ndGggb2YgdGhlIHN1YmZpZWxkIGRhdGEsIGV4Y2x1ZGluZyB0aGUgNAorICAgICAgICAgaW5pdGlhbCBieXRlcy4KKworICAgICAgMi4zLjEuMi4gQ29tcGxpYW5jZQorCisgICAgICAgICBBIGNvbXBsaWFudCBjb21wcmVzc29yIG11c3QgcHJvZHVjZSBmaWxlcyB3aXRoIGNvcnJlY3QgSUQxLAorICAgICAgICAgSUQyLCBDTSwgQ1JDMzIsIGFuZCBJU0laRSwgYnV0IG1heSBzZXQgYWxsIHRoZSBvdGhlciBmaWVsZHMgaW4KKyAgICAgICAgIHRoZSBmaXhlZC1sZW5ndGggcGFydCBvZiB0aGUgaGVhZGVyIHRvIGRlZmF1bHQgdmFsdWVzICgyNTUgZm9yCisgICAgICAgICBPUywgMCBmb3IgYWxsIG90aGVycykuICBUaGUgY29tcHJlc3NvciBtdXN0IHNldCBhbGwgcmVzZXJ2ZWQKKyAgICAgICAgIGJpdHMgdG8gemVyby4KKworICAgICAgICAgQSBjb21wbGlhbnQgZGVjb21wcmVzc29yIG11c3QgY2hlY2sgSUQxLCBJRDIsIGFuZCBDTSwgYW5kCisgICAgICAgICBwcm92aWRlIGFuIGVycm9yIGluZGljYXRpb24gaWYgYW55IG9mIHRoZXNlIGhhdmUgaW5jb3JyZWN0CisgICAgICAgICB2YWx1ZXMuICBJdCBtdXN0IGV4YW1pbmUgRkVYVFJBL1hMRU4sIEZOQU1FLCBGQ09NTUVOVCBhbmQgRkhDUkMKKyAgICAgICAgIGF0IGxlYXN0IHNvIGl0IGNhbiBza2lwIG92ZXIgdGhlIG9wdGlvbmFsIGZpZWxkcyBpZiB0aGV5IGFyZQorICAgICAgICAgcHJlc2VudC4gIEl0IG5lZWQgbm90IGV4YW1pbmUgYW55IG90aGVyIHBhcnQgb2YgdGhlIGhlYWRlciBvcgorICAgICAgICAgdHJhaWxlcjsgaW4gcGFydGljdWxhciwgYSBkZWNvbXByZXNzb3IgbWF5IGlnbm9yZSBGVEVYVCBhbmQgT1MKKyAgICAgICAgIGFuZCBhbHdheXMgcHJvZHVjZSBiaW5hcnkgb3V0cHV0LCBhbmQgc3RpbGwgYmUgY29tcGxpYW50LiAgQQorICAgICAgICAgY29tcGxpYW50IGRlY29tcHJlc3NvciBtdXN0IGdpdmUgYW4gZXJyb3IgaW5kaWNhdGlvbiBpZiBhbnkKKyAgICAgICAgIHJlc2VydmVkIGJpdCBpcyBub24temVybywgc2luY2Ugc3VjaCBhIGJpdCBjb3VsZCBpbmRpY2F0ZSB0aGUKKyAgICAgICAgIHByZXNlbmNlIG9mIGEgbmV3IGZpZWxkIHRoYXQgd291bGQgY2F1c2Ugc3Vic2VxdWVudCBkYXRhIHRvIGJlCisgICAgICAgICBpbnRlcnByZXRlZCBpbmNvcnJlY3RseS4KKworMy4gUmVmZXJlbmNlcworCisgICBbMV0gIkluZm9ybWF0aW9uIFByb2Nlc3NpbmcgLSA4LWJpdCBzaW5nbGUtYnl0ZSBjb2RlZCBncmFwaGljCisgICAgICAgY2hhcmFjdGVyIHNldHMgLSBQYXJ0IDE6IExhdGluIGFscGhhYmV0IE5vLjEiIChJU08gODg1OS0xOjE5ODcpLgorICAgICAgIFRoZSBJU08gODg1OS0xIChMYXRpbi0xKSBjaGFyYWN0ZXIgc2V0IGlzIGEgc3VwZXJzZXQgb2YgNy1iaXQKKyAgICAgICBBU0NJSS4gRmlsZXMgZGVmaW5pbmcgdGhpcyBjaGFyYWN0ZXIgc2V0IGFyZSBhdmFpbGFibGUgYXMKKyAgICAgICBpc29fODg1OS0xLiogaW4gZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9wbmcvZG9jdW1lbnRzLworCisgICBbMl0gSVNPIDMzMDkKKworICAgWzNdIElUVS1UIHJlY29tbWVuZGF0aW9uIFYuNDIKKworICAgWzRdIERldXRzY2gsIEwuUC4sIkRFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uIiwKKyAgICAgICBhdmFpbGFibGUgaW4gZnRwOi8vZnRwLnV1Lm5ldC9wdWIvYXJjaGl2aW5nL3ppcC9kb2MvCisKKyAgIFs1XSBHYWlsbHksIEouLUwuLCBHWklQIGRvY3VtZW50YXRpb24sIGF2YWlsYWJsZSBhcyBnemlwLSoudGFyIGluCisgICAgICAgZnRwOi8vcHJlcC5haS5taXQuZWR1L3B1Yi9nbnUvCisKKyAgIFs2XSBTYXJ3YXRlLCBELlYuLCAiQ29tcHV0YXRpb24gb2YgQ3ljbGljIFJlZHVuZGFuY3kgQ2hlY2tzIHZpYSBUYWJsZQorICAgICAgIExvb2stVXAiLCBDb21tdW5pY2F0aW9ucyBvZiB0aGUgQUNNLCAzMSg4KSwgcHAuMTAwOC0xMDEzLgorCisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgOV0KKwwKK1JGQyAxOTUyICAgICAgICAgICAgIEdaSVAgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgICAgICBNYXkgMTk5NgorCisKKyAgIFs3XSBTY2h3YWRlcmVyLCBXLkQuLCAiQ1JDIENhbGN1bGF0aW9uIiwgQXByaWwgODUgUEMgVGVjaCBKb3VybmFsLAorICAgICAgIHBwLjExOC0xMzMuCisKKyAgIFs4XSBmdHA6Ly9mdHAuYWRlbGFpZGUuZWR1LmF1L3B1Yi9yb2Nrc29mdC9wYXBlcnMvY3JjX3YzLnR4dCwKKyAgICAgICBkZXNjcmliaW5nIHRoZSBDUkMgY29uY2VwdC4KKworNC4gU2VjdXJpdHkgQ29uc2lkZXJhdGlvbnMKKworICAgQW55IGRhdGEgY29tcHJlc3Npb24gbWV0aG9kIGludm9sdmVzIHRoZSByZWR1Y3Rpb24gb2YgcmVkdW5kYW5jeSBpbgorICAgdGhlIGRhdGEuICBDb25zZXF1ZW50bHksIGFueSBjb3JydXB0aW9uIG9mIHRoZSBkYXRhIGlzIGxpa2VseSB0byBoYXZlCisgICBzZXZlcmUgZWZmZWN0cyBhbmQgYmUgZGlmZmljdWx0IHRvIGNvcnJlY3QuICBVbmNvbXByZXNzZWQgdGV4dCwgb24KKyAgIHRoZSBvdGhlciBoYW5kLCB3aWxsIHByb2JhYmx5IHN0aWxsIGJlIHJlYWRhYmxlIGRlc3BpdGUgdGhlIHByZXNlbmNlCisgICBvZiBzb21lIGNvcnJ1cHRlZCBieXRlcy4KKworICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBzeXN0ZW1zIHVzaW5nIHRoaXMgZGF0YSBmb3JtYXQgcHJvdmlkZSBzb21lCisgICBtZWFucyBvZiB2YWxpZGF0aW5nIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSwgc3VjaCBhcyBieQorICAgc2V0dGluZyBhbmQgY2hlY2tpbmcgdGhlIENSQy0zMiBjaGVjayB2YWx1ZS4KKworNS4gQWNrbm93bGVkZ2VtZW50cworCisgICBUcmFkZW1hcmtzIGNpdGVkIGluIHRoaXMgZG9jdW1lbnQgYXJlIHRoZSBwcm9wZXJ0eSBvZiB0aGVpcgorICAgcmVzcGVjdGl2ZSBvd25lcnMuCisKKyAgIEplYW4tTG91cCBHYWlsbHkgZGVzaWduZWQgdGhlIGd6aXAgZm9ybWF0IGFuZCB3cm90ZSwgd2l0aCBNYXJrIEFkbGVyLAorICAgdGhlIHJlbGF0ZWQgc29mdHdhcmUgZGVzY3JpYmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbi4gIEdsZW5uCisgICBSYW5kZXJzLVBlaHJzb24gY29udmVydGVkIHRoaXMgZG9jdW1lbnQgdG8gUkZDIGFuZCBIVE1MIGZvcm1hdC4KKworNi4gQXV0aG9yJ3MgQWRkcmVzcworCisgICBMLiBQZXRlciBEZXV0c2NoCisgICBBbGFkZGluIEVudGVycHJpc2VzCisgICAyMDMgU2FudGEgTWFyZ2FyaXRhIEF2ZS4KKyAgIE1lbmxvIFBhcmssIENBIDk0MDI1CisKKyAgIFBob25lOiAoNDE1KSAzMjItMDEwMyAoQU0gb25seSkKKyAgIEZBWDogICAoNDE1KSAzMjItMTczNAorICAgRU1haWw6IDxnaG9zdEBhbGFkZGluLmNvbT4KKworICAgUXVlc3Rpb25zIGFib3V0IHRoZSB0ZWNobmljYWwgY29udGVudCBvZiB0aGlzIHNwZWNpZmljYXRpb24gY2FuIGJlCisgICBzZW50IGJ5IGVtYWlsIHRvOgorCisgICBKZWFuLUxvdXAgR2FpbGx5IDxnemlwQHByZXAuYWkubWl0LmVkdT4gYW5kCisgICBNYXJrIEFkbGVyIDxtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1PgorCisgICBFZGl0b3JpYWwgY29tbWVudHMgb24gdGhpcyBzcGVjaWZpY2F0aW9uIGNhbiBiZSBzZW50IGJ5IGVtYWlsIHRvOgorCisgICBMLiBQZXRlciBEZXV0c2NoIDxnaG9zdEBhbGFkZGluLmNvbT4gYW5kCisgICBHbGVubiBSYW5kZXJzLVBlaHJzb24gPHJhbmRlZ0BhbHVtbmkucnBpLmVkdT4KKworCisKK0RldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDEwXQorDAorUkZDIDE5NTIgICAgICAgICAgICAgR1pJUCBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICAgICAgIE1heSAxOTk2CisKKworNy4gQXBwZW5kaXg6IEplYW4tTG91cCBHYWlsbHkncyBnemlwIHV0aWxpdHkKKworICAgVGhlIG1vc3Qgd2lkZWx5IHVzZWQgaW1wbGVtZW50YXRpb24gb2YgZ3ppcCBjb21wcmVzc2lvbiwgYW5kIHRoZQorICAgb3JpZ2luYWwgZG9jdW1lbnRhdGlvbiBvbiB3aGljaCB0aGlzIHNwZWNpZmljYXRpb24gaXMgYmFzZWQsIHdlcmUKKyAgIGNyZWF0ZWQgYnkgSmVhbi1Mb3VwIEdhaWxseSA8Z3ppcEBwcmVwLmFpLm1pdC5lZHU+LiAgU2luY2UgdGhpcworICAgaW1wbGVtZW50YXRpb24gaXMgYSBkZSBmYWN0byBzdGFuZGFyZCwgd2UgbWVudGlvbiBzb21lIG1vcmUgb2YgaXRzCisgICBmZWF0dXJlcyBoZXJlLiAgQWdhaW4sIHRoZSBtYXRlcmlhbCBpbiB0aGlzIHNlY3Rpb24gaXMgbm90IHBhcnQgb2YKKyAgIHRoZSBzcGVjaWZpY2F0aW9uIHBlciBzZSwgYW5kIGltcGxlbWVudGF0aW9ucyBuZWVkIG5vdCBmb2xsb3cgaXQgdG8KKyAgIGJlIGNvbXBsaWFudC4KKworICAgV2hlbiBjb21wcmVzc2luZyBvciBkZWNvbXByZXNzaW5nIGEgZmlsZSwgZ3ppcCBwcmVzZXJ2ZXMgdGhlCisgICBwcm90ZWN0aW9uLCBvd25lcnNoaXAsIGFuZCBtb2RpZmljYXRpb24gdGltZSBhdHRyaWJ1dGVzIG9uIHRoZSBsb2NhbAorICAgZmlsZSBzeXN0ZW0sIHNpbmNlIHRoZXJlIGlzIG5vIHByb3Zpc2lvbiBmb3IgcmVwcmVzZW50aW5nIHByb3RlY3Rpb24KKyAgIGF0dHJpYnV0ZXMgaW4gdGhlIGd6aXAgZmlsZSBmb3JtYXQgaXRzZWxmLiAgU2luY2UgdGhlIGZpbGUgZm9ybWF0CisgICBpbmNsdWRlcyBhIG1vZGlmaWNhdGlvbiB0aW1lLCB0aGUgZ3ppcCBkZWNvbXByZXNzb3IgcHJvdmlkZXMgYQorICAgY29tbWFuZCBsaW5lIHN3aXRjaCB0aGF0IGFzc2lnbnMgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIGZyb20gdGhlIGZpbGUsCisgICByYXRoZXIgdGhhbiB0aGUgbG9jYWwgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIGNvbXByZXNzZWQgaW5wdXQsIHRvCisgICB0aGUgZGVjb21wcmVzc2VkIG91dHB1dC4KKworOC4gQXBwZW5kaXg6IFNhbXBsZSBDUkMgQ29kZQorCisgICBUaGUgZm9sbG93aW5nIHNhbXBsZSBjb2RlIHJlcHJlc2VudHMgYSBwcmFjdGljYWwgaW1wbGVtZW50YXRpb24gb2YKKyAgIHRoZSBDUkMgKEN5Y2xpYyBSZWR1bmRhbmN5IENoZWNrKS4gKFNlZSBhbHNvIElTTyAzMzA5IGFuZCBJVFUtVCBWLjQyCisgICBmb3IgYSBmb3JtYWwgc3BlY2lmaWNhdGlvbi4pCisKKyAgIFRoZSBzYW1wbGUgY29kZSBpcyBpbiB0aGUgQU5TSSBDIHByb2dyYW1taW5nIGxhbmd1YWdlLiBOb24gQyB1c2VycworICAgbWF5IGZpbmQgaXQgZWFzaWVyIHRvIHJlYWQgd2l0aCB0aGVzZSBoaW50czoKKworICAgICAgJiAgICAgIEJpdHdpc2UgQU5EIG9wZXJhdG9yLgorICAgICAgXiAgICAgIEJpdHdpc2UgZXhjbHVzaXZlLU9SIG9wZXJhdG9yLgorICAgICAgPj4gICAgIEJpdHdpc2UgcmlnaHQgc2hpZnQgb3BlcmF0b3IuIFdoZW4gYXBwbGllZCB0byBhbgorICAgICAgICAgICAgIHVuc2lnbmVkIHF1YW50aXR5LCBhcyBoZXJlLCByaWdodCBzaGlmdCBpbnNlcnRzIHplcm8KKyAgICAgICAgICAgICBiaXQocykgYXQgdGhlIGxlZnQuCisgICAgICAhICAgICAgTG9naWNhbCBOT1Qgb3BlcmF0b3IuCisgICAgICArKyAgICAgIm4rKyIgaW5jcmVtZW50cyB0aGUgdmFyaWFibGUgbi4KKyAgICAgIDB4Tk5OICAweCBpbnRyb2R1Y2VzIGEgaGV4YWRlY2ltYWwgKGJhc2UgMTYpIGNvbnN0YW50LgorICAgICAgICAgICAgIFN1ZmZpeCBMIGluZGljYXRlcyBhIGxvbmcgdmFsdWUgKGF0IGxlYXN0IDMyIGJpdHMpLgorCisgICAgICAvKiBUYWJsZSBvZiBDUkNzIG9mIGFsbCA4LWJpdCBtZXNzYWdlcy4gKi8KKyAgICAgIHVuc2lnbmVkIGxvbmcgY3JjX3RhYmxlWzI1Nl07CisKKyAgICAgIC8qIEZsYWc6IGhhcyB0aGUgdGFibGUgYmVlbiBjb21wdXRlZD8gSW5pdGlhbGx5IGZhbHNlLiAqLworICAgICAgaW50IGNyY190YWJsZV9jb21wdXRlZCA9IDA7CisKKyAgICAgIC8qIE1ha2UgdGhlIHRhYmxlIGZvciBhIGZhc3QgQ1JDLiAqLworICAgICAgdm9pZCBtYWtlX2NyY190YWJsZSh2b2lkKQorICAgICAgeworICAgICAgICB1bnNpZ25lZCBsb25nIGM7CisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxMV0KKwwKK1JGQyAxOTUyICAgICAgICAgICAgIEdaSVAgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgICAgICBNYXkgMTk5NgorCisKKyAgICAgICAgaW50IG4sIGs7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCAyNTY7IG4rKykgeworICAgICAgICAgIGMgPSAodW5zaWduZWQgbG9uZykgbjsKKyAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgODsgaysrKSB7CisgICAgICAgICAgICBpZiAoYyAmIDEpIHsKKyAgICAgICAgICAgICAgYyA9IDB4ZWRiODgzMjBMIF4gKGMgPj4gMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBjID0gYyA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBjcmNfdGFibGVbbl0gPSBjOworICAgICAgICB9CisgICAgICAgIGNyY190YWJsZV9jb21wdXRlZCA9IDE7CisgICAgICB9CisKKyAgICAgIC8qCisgICAgICAgICBVcGRhdGUgYSBydW5uaW5nIGNyYyB3aXRoIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdIGFuZCByZXR1cm4KKyAgICAgICB0aGUgdXBkYXRlZCBjcmMuIFRoZSBjcmMgc2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIHplcm8uIFByZS0gYW5kCisgICAgICAgcG9zdC1jb25kaXRpb25pbmcgKG9uZSdzIGNvbXBsZW1lbnQpIGlzIHBlcmZvcm1lZCB3aXRoaW4gdGhpcworICAgICAgIGZ1bmN0aW9uIHNvIGl0IHNob3VsZG4ndCBiZSBkb25lIGJ5IHRoZSBjYWxsZXIuIFVzYWdlIGV4YW1wbGU6CisKKyAgICAgICAgIHVuc2lnbmVkIGxvbmcgY3JjID0gMEw7CisKKyAgICAgICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7CisgICAgICAgICAgIGNyYyA9IHVwZGF0ZV9jcmMoY3JjLCBidWZmZXIsIGxlbmd0aCk7CisgICAgICAgICB9CisgICAgICAgICBpZiAoY3JjICE9IG9yaWdpbmFsX2NyYykgZXJyb3IoKTsKKyAgICAgICovCisgICAgICB1bnNpZ25lZCBsb25nIHVwZGF0ZV9jcmModW5zaWduZWQgbG9uZyBjcmMsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQorICAgICAgeworICAgICAgICB1bnNpZ25lZCBsb25nIGMgPSBjcmMgXiAweGZmZmZmZmZmTDsKKyAgICAgICAgaW50IG47CisKKyAgICAgICAgaWYgKCFjcmNfdGFibGVfY29tcHV0ZWQpCisgICAgICAgICAgbWFrZV9jcmNfdGFibGUoKTsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IGxlbjsgbisrKSB7CisgICAgICAgICAgYyA9IGNyY190YWJsZVsoYyBeIGJ1ZltuXSkgJiAweGZmXSBeIChjID4+IDgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjIF4gMHhmZmZmZmZmZkw7CisgICAgICB9CisKKyAgICAgIC8qIFJldHVybiB0aGUgQ1JDIG9mIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdLiAqLworICAgICAgdW5zaWduZWQgbG9uZyBjcmModW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQorICAgICAgeworICAgICAgICByZXR1cm4gdXBkYXRlX2NyYygwTCwgYnVmLCBsZW4pOworICAgICAgfQorCisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxMl0KKwwKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2RvYy90eHR2c2Jpbi50eHQgYi96bGliL3NyYy9kb2MvdHh0dnNiaW4udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMGYwNjMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9kb2MvdHh0dnNiaW4udHh0CkBAIC0wLDAgKzEsMTA3IEBACitBIEZhc3QgTWV0aG9kIGZvciBJZGVudGlmeWluZyBQbGFpbiBUZXh0IEZpbGVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworSW50cm9kdWN0aW9uCistLS0tLS0tLS0tLS0KKworR2l2ZW4gYSBmaWxlIGNvbWluZyBmcm9tIGFuIHVua25vd24gc291cmNlLCBpdCBpcyBzb21ldGltZXMgZGVzaXJhYmxlCit0byBmaW5kIG91dCB3aGV0aGVyIHRoZSBmb3JtYXQgb2YgdGhhdCBmaWxlIGlzIHBsYWluIHRleHQuICBBbHRob3VnaAordGhpcyBtYXkgYXBwZWFyIGxpa2UgYSBzaW1wbGUgdGFzaywgYSBmdWxseSBhY2N1cmF0ZSBkZXRlY3Rpb24gb2YgdGhlCitmaWxlIHR5cGUgcmVxdWlyZXMgaGVhdnktZHV0eSBzZW1hbnRpYyBhbmFseXNpcyBvbiB0aGUgZmlsZSBjb250ZW50cy4KK0l0IGlzLCBob3dldmVyLCBwb3NzaWJsZSB0byBvYnRhaW4gc2F0aXNmYWN0b3J5IHJlc3VsdHMgYnkgZW1wbG95aW5nCit2YXJpb3VzIGhldXJpc3RpY3MuCisKK1ByZXZpb3VzIHZlcnNpb25zIG9mIFBLWmlwIGFuZCBvdGhlciB6aXAtY29tcGF0aWJsZSBjb21wcmVzc2lvbiB0b29scword2VyZSB1c2luZyBhIGNydWRlIGRldGVjdGlvbiBzY2hlbWU6IGlmIG1vcmUgdGhhbiA4MCUgKDQvNSkgb2YgdGhlIGJ5dGVzCitmb3VuZCBpbiBhIGNlcnRhaW4gYnVmZmVyIGFyZSB3aXRoaW4gdGhlIHJhbmdlIFs3Li4xMjddLCB0aGUgZmlsZSBpcworbGFiZWxlZCBhcyBwbGFpbiB0ZXh0LCBvdGhlcndpc2UgaXQgaXMgbGFiZWxlZCBhcyBiaW5hcnkuICBBIHByb21pbmVudAorbGltaXRhdGlvbiBvZiB0aGlzIHNjaGVtZSBpcyB0aGUgcmVzdHJpY3Rpb24gdG8gTGF0aW4tYmFzZWQgYWxwaGFiZXRzLgorT3RoZXIgYWxwaGFiZXRzLCBsaWtlIEdyZWVrLCBDeXJpbGxpYyBvciBBc2lhbiwgbWFrZSBleHRlbnNpdmUgdXNlIG9mCit0aGUgYnl0ZXMgd2l0aGluIHRoZSByYW5nZSBbMTI4Li4yNTVdLCBhbmQgdGV4dHMgdXNpbmcgdGhlc2UgYWxwaGFiZXRzCithcmUgbW9zdCBvZnRlbiBtaXNpZGVudGlmaWVkIGJ5IHRoaXMgc2NoZW1lOyBpbiBvdGhlciB3b3JkcywgdGhlIHJhdGUKK29mIGZhbHNlIG5lZ2F0aXZlcyBpcyBzb21ldGltZXMgdG9vIGhpZ2gsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHJlY2FsbAoraXMgbG93LiAgQW5vdGhlciB3ZWFrbmVzcyBvZiB0aGlzIHNjaGVtZSBpcyBhIHJlZHVjZWQgcHJlY2lzaW9uLCBkdWUgdG8KK3RoZSBmYWxzZSBwb3NpdGl2ZXMgdGhhdCBtYXkgb2NjdXIgd2hlbiBiaW5hcnkgZmlsZXMgY29udGFpbmluZyBsYXJnZQorYW1vdW50cyBvZiB0ZXh0dWFsIGNoYXJhY3RlcnMgYXJlIG1pc2lkZW50aWZpZWQgYXMgcGxhaW4gdGV4dC4KKworSW4gdGhpcyBhcnRpY2xlIHdlIHByb3Bvc2UgYSBuZXcsIHNpbXBsZSBkZXRlY3Rpb24gc2NoZW1lIHRoYXQgZmVhdHVyZXMKK2EgbXVjaCBpbmNyZWFzZWQgcHJlY2lzaW9uIGFuZCBhIG5lYXItMTAwJSByZWNhbGwuICBUaGlzIHNjaGVtZSBpcworZGVzaWduZWQgdG8gd29yayBvbiBBU0NJSSwgVW5pY29kZSBhbmQgb3RoZXIgQVNDSUktZGVyaXZlZCBhbHBoYWJldHMsCithbmQgaXQgaGFuZGxlcyBzaW5nbGUtYnl0ZSBlbmNvZGluZ3MgKElTTy04ODU5LCBNYWNSb21hbiwgS09JOCwgZXRjLikKK2FuZCB2YXJpYWJsZS1zaXplZCBlbmNvZGluZ3MgKElTTy0yMDIyLCBVVEYtOCwgZXRjLikuICBXaWRlciBlbmNvZGluZ3MKKyhVQ1MtMi9VVEYtMTYgYW5kIFVDUy00L1VURi0zMikgYXJlIG5vdCBoYW5kbGVkLCBob3dldmVyLgorCisKK1RoZSBBbGdvcml0aG0KKy0tLS0tLS0tLS0tLS0KKworVGhlIGFsZ29yaXRobSB3b3JrcyBieSBkaXZpZGluZyB0aGUgc2V0IG9mIGJ5dGVjb2RlcyBbMC4uMjU1XSBpbnRvIHRocmVlCitjYXRlZ29yaWVzOgorLSBUaGUgd2hpdGUgbGlzdCBvZiB0ZXh0dWFsIGJ5dGVjb2RlczoKKyAgOSAoVEFCKSwgMTAgKExGKSwgMTMgKENSKSwgMzIgKFNQQUNFKSB0byAyNTUuCistIFRoZSBncmF5IGxpc3Qgb2YgdG9sZXJhdGVkIGJ5dGVjb2RlczoKKyAgNyAoQkVMKSwgOCAoQlMpLCAxMSAoVlQpLCAxMiAoRkYpLCAyNiAoU1VCKSwgMjcgKEVTQykuCistIFRoZSBibGFjayBsaXN0IG9mIHVuZGVzaXJlZCwgbm9uLXRleHR1YWwgYnl0ZWNvZGVzOgorICAwIChOVUwpIHRvIDYsIDE0IHRvIDMxLgorCitJZiBhIGZpbGUgY29udGFpbnMgYXQgbGVhc3Qgb25lIGJ5dGUgdGhhdCBiZWxvbmdzIHRvIHRoZSB3aGl0ZSBsaXN0IGFuZAorbm8gYnl0ZSB0aGF0IGJlbG9uZ3MgdG8gdGhlIGJsYWNrIGxpc3QsIHRoZW4gdGhlIGZpbGUgaXMgY2F0ZWdvcml6ZWQgYXMKK3BsYWluIHRleHQ7IG90aGVyd2lzZSwgaXQgaXMgY2F0ZWdvcml6ZWQgYXMgYmluYXJ5LiAgKFRoZSBib3VuZGFyeSBjYXNlLAord2hlbiB0aGUgZmlsZSBpcyBlbXB0eSwgYXV0b21hdGljYWxseSBmYWxscyBpbnRvIHRoZSBsYXR0ZXIgY2F0ZWdvcnkuKQorCisKK1JhdGlvbmFsZQorLS0tLS0tLS0tCisKK1RoZSBpZGVhIGJlaGluZCB0aGlzIGFsZ29yaXRobSByZWxpZXMgb24gdHdvIG9ic2VydmF0aW9ucy4KKworVGhlIGZpcnN0IG9ic2VydmF0aW9uIGlzIHRoYXQsIGFsdGhvdWdoIHRoZSBmdWxsIHJhbmdlIG9mIDctYml0IGNvZGVzCitbMC4uMTI3XSBpcyBwcm9wZXJseSBzcGVjaWZpZWQgYnkgdGhlIEFTQ0lJIHN0YW5kYXJkLCBtb3N0IGNvbnRyb2wKK2NoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFswLi4zMV0gYXJlIG5vdCB1c2VkIGluIHByYWN0aWNlLiAgVGhlIG9ubHkKK3dpZGVseS11c2VkLCBhbG1vc3QgdW5pdmVyc2FsbHktcG9ydGFibGUgY29udHJvbCBjb2RlcyBhcmUgOSAoVEFCKSwKKzEwIChMRikgYW5kIDEzIChDUikuICBUaGVyZSBhcmUgYSBmZXcgbW9yZSBjb250cm9sIGNvZGVzIHRoYXQgYXJlCityZWNvZ25pemVkIG9uIGEgcmVkdWNlZCByYW5nZSBvZiBwbGF0Zm9ybXMgYW5kIHRleHQgdmlld2Vycy9lZGl0b3JzOgorNyAoQkVMKSwgOCAoQlMpLCAxMSAoVlQpLCAxMiAoRkYpLCAyNiAoU1VCKSBhbmQgMjcgKEVTQyk7IGJ1dCB0aGVzZQorY29kZXMgYXJlIHJhcmVseSAoaWYgZXZlcikgdXNlZCBhbG9uZSwgd2l0aG91dCBiZWluZyBhY2NvbXBhbmllZCBieQorc29tZSBwcmludGFibGUgdGV4dC4gIEV2ZW4gdGhlIG5ld2VyLCBwb3J0YWJsZSB0ZXh0IGZvcm1hdHMgc3VjaCBhcworWE1MIGF2b2lkIHVzaW5nIGNvbnRyb2wgY2hhcmFjdGVycyBvdXRzaWRlIHRoZSBsaXN0IG1lbnRpb25lZCBoZXJlLgorCitUaGUgc2Vjb25kIG9ic2VydmF0aW9uIGlzIHRoYXQgbW9zdCBvZiB0aGUgYmluYXJ5IGZpbGVzIHRlbmQgdG8gY29udGFpbgorY29udHJvbCBjaGFyYWN0ZXJzLCBlc3BlY2lhbGx5IDAgKE5VTCkuICBFdmVuIHRob3VnaCB0aGUgb2xkZXIgdGV4dAorZGV0ZWN0aW9uIHNjaGVtZXMgb2JzZXJ2ZSB0aGUgcHJlc2VuY2Ugb2Ygbm9uLUFTQ0lJIGNvZGVzIGZyb20gdGhlIHJhbmdlCitbMTI4Li4yNTVdLCB0aGUgcHJlY2lzaW9uIHJhcmVseSBoYXMgdG8gc3VmZmVyIGlmIHRoaXMgdXBwZXIgcmFuZ2UgaXMKK2xhYmVsZWQgYXMgdGV4dHVhbCwgYmVjYXVzZSB0aGUgZmlsZXMgdGhhdCBhcmUgZ2VudWluZWx5IGJpbmFyeSB0ZW5kIHRvCitjb250YWluIGJvdGggY29udHJvbCBjaGFyYWN0ZXJzIGFuZCBjb2RlcyBmcm9tIHRoZSB1cHBlciByYW5nZS4gIE9uIHRoZQorb3RoZXIgaGFuZCwgdGhlIHVwcGVyIHJhbmdlIG5lZWRzIHRvIGJlIGxhYmVsZWQgYXMgdGV4dHVhbCwgYmVjYXVzZSBpdAoraXMgdXNlZCBieSB2aXJ0dWFsbHkgYWxsIEFTQ0lJIGV4dGVuc2lvbnMuICBJbiBwYXJ0aWN1bGFyLCB0aGlzIHJhbmdlIGlzCit1c2VkIGZvciBlbmNvZGluZyBub24tTGF0aW4gc2NyaXB0cy4KKworU2luY2UgdGhlcmUgaXMgbm8gY291bnRpbmcgaW52b2x2ZWQsIG90aGVyIHRoYW4gc2ltcGx5IG9ic2VydmluZyB0aGUKK3ByZXNlbmNlIG9yIHRoZSBhYnNlbmNlIG9mIHNvbWUgYnl0ZSB2YWx1ZXMsIHRoZSBhbGdvcml0aG0gcHJvZHVjZXMKK2NvbnNpc3RlbnQgcmVzdWx0cywgcmVnYXJkbGVzcyB3aGF0IGFscGhhYmV0IGVuY29kaW5nIGlzIGJlaW5nIHVzZWQuCisoSWYgY291bnRpbmcgd2VyZSBpbnZvbHZlZCwgaXQgY291bGQgYmUgcG9zc2libGUgdG8gb2J0YWluIGRpZmZlcmVudAorcmVzdWx0cyBvbiBhIHRleHQgZW5jb2RlZCwgc2F5LCB1c2luZyBJU08tODg1OS0xNiB2ZXJzdXMgVVRGLTguKQorCitUaGVyZSBpcyBhbiBleHRyYSBjYXRlZ29yeSBvZiBwbGFpbiB0ZXh0IGZpbGVzIHRoYXQgYXJlICJwb2xsdXRlZCIgd2l0aAorb25lIG9yIG1vcmUgYmxhY2stbGlzdGVkIGNvZGVzLCBlaXRoZXIgYnkgbWlzdGFrZSBvciBieSBwZWN1bGlhciBkZXNpZ24KK2NvbnNpZGVyYXRpb25zLiAgSW4gc3VjaCBjYXNlcywgYSBzY2hlbWUgdGhhdCB0b2xlcmF0ZXMgYSBzbWFsbCBmcmFjdGlvbgorb2YgYmxhY2stbGlzdGVkIGNvZGVzIHdvdWxkIHByb3ZpZGUgYW4gaW5jcmVhc2VkIHJlY2FsbCAoaS5lLiBtb3JlIHRydWUKK3Bvc2l0aXZlcykuICBUaGlzLCBob3dldmVyLCBpbmN1cnMgYSByZWR1Y2VkIHByZWNpc2lvbiBvdmVyYWxsLCBzaW5jZQorZmFsc2UgcG9zaXRpdmVzIGFyZSBtb3JlIGxpa2VseSB0byBhcHBlYXIgaW4gYmluYXJ5IGZpbGVzIHRoYXQgY29udGFpbgorbGFyZ2UgY2h1bmtzIG9mIHRleHR1YWwgZGF0YS4gIEZ1cnRoZXJtb3JlLCAicG9sbHV0ZWQiIHBsYWluIHRleHQgc2hvdWxkCitiZSByZWdhcmRlZCBhcyBiaW5hcnkgYnkgZ2VuZXJhbC1wdXJwb3NlIHRleHQgZGV0ZWN0aW9uIHNjaGVtZXMsIGJlY2F1c2UKK2dlbmVyYWwtcHVycG9zZSB0ZXh0IHByb2Nlc3NpbmcgYWxnb3JpdGhtcyBtaWdodCBub3QgYmUgYXBwbGljYWJsZS4KK1VuZGVyIHRoaXMgcHJlbWlzZSwgaXQgaXMgc2FmZSB0byBzYXkgdGhhdCBvdXIgZGV0ZWN0aW9uIG1ldGhvZCBwcm92aWRlcworYSBuZWFyLTEwMCUgcmVjYWxsLgorCitFeHBlcmltZW50cyBoYXZlIGJlZW4gcnVuIG9uIG1hbnkgZmlsZXMgY29taW5nIGZyb20gdmFyaW91cyBwbGF0Zm9ybXMKK2FuZCBhcHBsaWNhdGlvbnMuICBXZSB0cmllZCBwbGFpbiB0ZXh0IGZpbGVzLCBzeXN0ZW0gbG9ncywgc291cmNlIGNvZGUsCitmb3JtYXR0ZWQgb2ZmaWNlIGRvY3VtZW50cywgY29tcGlsZWQgb2JqZWN0IGNvZGUsIGV0Yy4gIFRoZSByZXN1bHRzCitjb25maXJtIHRoZSBvcHRpbWlzdGljIGFzc3VtcHRpb25zIGFib3V0IHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhpcworYWxnb3JpdGhtLgorCisKKy0tCitDb3NtaW4gVHJ1dGEKK0xhc3QgdXBkYXRlZDogMjAwNi1NYXktMjgKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2V4YW1wbGVzL1JFQURNRS5leGFtcGxlcyBiL3psaWIvc3JjL2V4YW1wbGVzL1JFQURNRS5leGFtcGxlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmEzMTcxCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvZXhhbXBsZXMvUkVBRE1FLmV4YW1wbGVzCkBAIC0wLDAgKzEsNDkgQEAKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGV4YW1wbGVzIG9mIHRoZSB1c2Ugb2YgemxpYiBhbmQgb3RoZXIgcmVsZXZhbnQKK3Byb2dyYW1zIGFuZCBkb2N1bWVudGF0aW9uLgorCitlbm91Z2guYworICAgIGNhbGN1bGF0aW9uIGFuZCBqdXN0aWZpY2F0aW9uIG9mIEVOT1VHSCBwYXJhbWV0ZXIgaW4gaW5mdHJlZXMuaAorICAgIC0gY2FsY3VsYXRlcyB0aGUgbWF4aW11bSB0YWJsZSBzcGFjZSB1c2VkIGluIGluZmxhdGUgdHJlZQorICAgICAgY29uc3RydWN0aW9uIG92ZXIgYWxsIHBvc3NpYmxlIEh1ZmZtYW4gY29kZXMKKworZml0YmxrLmMKKyAgICBjb21wcmVzcyBqdXN0IGVub3VnaCBpbnB1dCB0byBuZWFybHkgZmlsbCBhIHJlcXVlc3RlZCBvdXRwdXQgc2l6ZQorICAgIC0gemxpYiBpc24ndCBkZXNpZ25lZCB0byBkbyB0aGlzLCBidXQgZml0YmxrIGRvZXMgaXQgYW55d2F5CisKK2d1bi5jCisgICAgdW5jb21wcmVzcyBhIGd6aXAgZmlsZQorICAgIC0gaWxsdXN0cmF0ZXMgdGhlIHVzZSBvZiBpbmZsYXRlQmFjaygpIGZvciBoaWdoIHNwZWVkIGZpbGUtdG8tZmlsZQorICAgICAgZGVjb21wcmVzc2lvbiB1c2luZyBjYWxsLWJhY2sgZnVuY3Rpb25zCisgICAgLSBpcyBhcHByb3hpbWF0ZWx5IHR3aWNlIGFzIGZhc3QgYXMgZ3ppcCAtZAorICAgIC0gYWxzbyBwcm92aWRlcyBVbml4IHVuY29tcHJlc3MgZnVuY3Rpb25hbGl0eSwgYWdhaW4gdHdpY2UgYXMgZmFzdAorCitnemFwcGVuZC5jCisgICAgYXBwZW5kIHRvIGEgZ3ppcCBmaWxlCisgICAgLSBpbGx1c3RyYXRlcyB0aGUgdXNlIG9mIHRoZSBaX0JMT0NLIGZsdXNoIHBhcmFtZXRlciBmb3IgaW5mbGF0ZSgpCisgICAgLSBpbGx1c3RyYXRlcyB0aGUgdXNlIG9mIGRlZmxhdGVQcmltZSgpIHRvIHN0YXJ0IGF0IGFueSBiaXQKKworZ3pqb2luLmMKKyAgICBqb2luIGd6aXAgZmlsZXMgd2l0aG91dCByZWNhbGN1bGF0aW5nIHRoZSBjcmMgb3IgcmVjb21wcmVzc2luZworICAgIC0gaWxsdXN0cmF0ZXMgdGhlIHVzZSBvZiB0aGUgWl9CTE9DSyBmbHVzaCBwYXJhbWV0ZXIgZm9yIGluZmxhdGUoKQorICAgIC0gaWxsdXN0cmF0ZXMgdGhlIHVzZSBvZiBjcmMzMl9jb21iaW5lKCkKKworZ3psb2cuYworZ3psb2cuaAorICAgIGVmZmljaWVudGx5IGFuZCByb2J1c3RseSBtYWludGFpbiBhIG1lc3NhZ2UgbG9nIGZpbGUgaW4gZ3ppcCBmb3JtYXQKKyAgICAtIGlsbHVzdHJhdGVzIHVzZSBvZiByYXcgZGVmbGF0ZSwgWl9QQVJUSUFMX0ZMVVNILCBkZWZsYXRlUHJpbWUoKSwKKyAgICAgIGFuZCBkZWZsYXRlU2V0RGljdGlvbmFyeSgpCisgICAgLSBpbGx1c3RyYXRlcyB1c2Ugb2YgYSBnemlwIGhlYWRlciBleHRyYSBmaWVsZAorCit6bGliX2hvdy5odG1sCisgICAgcGFpbmZ1bGx5IGNvbXByZWhlbnNpdmUgZGVzY3JpcHRpb24gb2YgenBpcGUuYyAoc2VlIGJlbG93KQorICAgIC0gZGVzY3JpYmVzIGluIGV4Y3J1Y2lhdGluZyBkZXRhaWwgdGhlIHVzZSBvZiBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKQorCit6cGlwZS5jCisgICAgcmVhZHMgYW5kIHdyaXRlcyB6bGliIHN0cmVhbXMgZnJvbSBzdGRpbiB0byBzdGRvdXQKKyAgICAtIGlsbHVzdHJhdGVzIHRoZSBwcm9wZXIgdXNlIG9mIGRlZmxhdGUoKSBhbmQgaW5mbGF0ZSgpCisgICAgLSBkZWVwbHkgY29tbWVudGVkIGluIHpsaWJfaG93Lmh0bWwgKHNlZSBhYm92ZSkKKworenJhbi5jCisgICAgaW5kZXggYSB6bGliIG9yIGd6aXAgc3RyZWFtIGFuZCByYW5kb21seSBhY2Nlc3MgaXQKKyAgICAtIGlsbHVzdHJhdGVzIHRoZSB1c2Ugb2YgWl9CTE9DSywgaW5mbGF0ZVByaW1lKCksIGFuZAorICAgICAgaW5mbGF0ZVNldERpY3Rpb25hcnkoKSB0byBwcm92aWRlIHJhbmRvbSBhY2Nlc3MKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2V4YW1wbGVzL2Vub3VnaC5jIGIvemxpYi9zcmMvZXhhbXBsZXMvZW5vdWdoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk5MTE0NAotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2V4YW1wbGVzL2Vub3VnaC5jCkBAIC0wLDAgKzEsNTcyIEBACisvKiBlbm91Z2guYyAtLSBkZXRlcm1pbmUgdGhlIG1heGltdW0gc2l6ZSBvZiBpbmZsYXRlJ3MgSHVmZm1hbiBjb2RlIHRhYmxlcyBvdmVyCisgKiBhbGwgcG9zc2libGUgdmFsaWQgYW5kIGNvbXBsZXRlIEh1ZmZtYW4gY29kZXMsIHN1YmplY3QgdG8gYSBsZW5ndGggbGltaXQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDgsIDIwMTIgTWFyayBBZGxlcgorICogVmVyc2lvbiAxLjQgIDE4IEF1Z3VzdCAyMDEyICBNYXJrIEFkbGVyCisgKi8KKworLyogVmVyc2lvbiBoaXN0b3J5OgorICAgMS4wICAgMyBKYW4gMjAwNyAgRmlyc3QgdmVyc2lvbiAoZGVyaXZlZCBmcm9tIGNvZGVjb3VudC5jIHZlcnNpb24gMS40KQorICAgMS4xICAgNCBKYW4gMjAwNyAgVXNlIGZhc3RlciBpbmNyZW1lbnRhbCB0YWJsZSB1c2FnZSBjb21wdXRhdGlvbgorICAgICAgICAgICAgICAgICAgICAgUHJ1bmUgZXhhbWluZSgpIHNlYXJjaCBvbiBwcmV2aW91c2x5IHZpc2l0ZWQgc3RhdGVzCisgICAxLjIgICA1IEphbiAyMDA3ICBDb21tZW50cyBjbGVhbiB1cAorICAgICAgICAgICAgICAgICAgICAgQXMgaW5mbGF0ZSBkb2VzLCBkZWNyZWFzZSByb290IGZvciBzaG9ydCBjb2RlcworICAgICAgICAgICAgICAgICAgICAgUmVmdXNlIGNhc2VzIHdoZXJlIGluZmxhdGUgd291bGQgaW5jcmVhc2Ugcm9vdAorICAgMS4zICAxNyBGZWIgMjAwOCAgQWRkIGFyZ3VtZW50IGZvciBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgRml4IGJ1ZyBmb3IgaW5pdGlhbCByb290IHRhYmxlIHNpemUgPT0gbWF4IC0gMQorICAgICAgICAgICAgICAgICAgICAgVXNlIGEgbWFjcm8gdG8gY29tcHV0ZSB0aGUgaGlzdG9yeSBpbmRleAorICAgMS40ICAxOCBBdWcgMjAxMiAgQXZvaWQgc2hpZnRzIG1vcmUgdGhhbiBiaXRzIGluIHR5cGUgKGNhdXNlZCBlbmRsZXNzIGxvb3AhKQorICAgICAgICAgICAgICAgICAgICAgQ2xlYW4gdXAgY29tcGFyaXNvbnMgb2YgZGlmZmVyZW50IHR5cGVzCisgICAgICAgICAgICAgICAgICAgICBDbGVhbiB1cCBjb2RlIGluZGVudGF0aW9uCisgKi8KKworLyoKKyAgIEV4YW1pbmUgYWxsIHBvc3NpYmxlIEh1ZmZtYW4gY29kZXMgZm9yIGEgZ2l2ZW4gbnVtYmVyIG9mIHN5bWJvbHMgYW5kIGEKKyAgIG1heGltdW0gY29kZSBsZW5ndGggaW4gYml0cyB0byBkZXRlcm1pbmUgdGhlIG1heGltdW0gdGFibGUgc2l6ZSBmb3IgemlsYidzCisgICBpbmZsYXRlLiAgT25seSBjb21wbGV0ZSBIdWZmbWFuIGNvZGVzIGFyZSBjb3VudGVkLgorCisgICBUd28gY29kZXMgYXJlIGNvbnNpZGVyZWQgZGlzdGluY3QgaWYgdGhlIHZlY3RvcnMgb2YgdGhlIG51bWJlciBvZiBjb2RlcyBwZXIKKyAgIGxlbmd0aCBhcmUgbm90IGlkZW50aWNhbC4gIFNvIHBlcm11dGF0aW9ucyBvZiB0aGUgc3ltYm9sIGFzc2lnbm1lbnRzIHJlc3VsdAorICAgaW4gdGhlIHNhbWUgY29kZSBmb3IgdGhlIGNvdW50aW5nLCBhcyBkbyBwZXJtdXRhdGlvbnMgb2YgdGhlIGFzc2lnbm1lbnRzIG9mCisgICB0aGUgYml0IHZhbHVlcyB0byB0aGUgY29kZXMgKGkuZS4gb25seSBjYW5vbmljYWwgY29kZXMgYXJlIGNvdW50ZWQpLgorCisgICBXZSBidWlsZCBhIGNvZGUgZnJvbSBzaG9ydGVyIHRvIGxvbmdlciBsZW5ndGhzLCBkZXRlcm1pbmluZyBob3cgbWFueSBzeW1ib2xzCisgICBhcmUgY29kZWQgYXQgZWFjaCBsZW5ndGguICBBdCBlYWNoIHN0ZXAsIHdlIGhhdmUgaG93IG1hbnkgc3ltYm9scyByZW1haW4gdG8KKyAgIGJlIGNvZGVkLCB3aGF0IHRoZSBsYXN0IGNvZGUgbGVuZ3RoIHVzZWQgd2FzLCBhbmQgaG93IG1hbnkgYml0IHBhdHRlcm5zIG9mCisgICB0aGF0IGxlbmd0aCByZW1haW4gdW51c2VkLiBUaGVuIHdlIGFkZCBvbmUgdG8gdGhlIGNvZGUgbGVuZ3RoIGFuZCBkb3VibGUgdGhlCisgICBudW1iZXIgb2YgdW51c2VkIHBhdHRlcm5zIHRvIGdyYWR1YXRlIHRvIHRoZSBuZXh0IGNvZGUgbGVuZ3RoLiAgV2UgdGhlbgorICAgYXNzaWduIGFsbCBwb3J0aW9ucyBvZiB0aGUgcmVtYWluaW5nIHN5bWJvbHMgdG8gdGhhdCBjb2RlIGxlbmd0aCB0aGF0CisgICBwcmVzZXJ2ZSB0aGUgcHJvcGVydGllcyBvZiBhIGNvcnJlY3QgYW5kIGV2ZW50dWFsbHkgY29tcGxldGUgY29kZS4gIFRob3NlCisgICBwcm9wZXJ0aWVzIGFyZTogd2UgY2Fubm90IHVzZSBtb3JlIGJpdCBwYXR0ZXJucyB0aGFuIGFyZSBhdmFpbGFibGU7IGFuZCB3aGVuCisgICBhbGwgdGhlIHN5bWJvbHMgYXJlIHVzZWQsIHRoZXJlIGFyZSBleGFjdGx5IHplcm8gcG9zc2libGUgYml0IHBhdHRlcm5zCisgICByZW1haW5pbmcuCisKKyAgIFRoZSBpbmZsYXRlIEh1ZmZtYW4gZGVjb2RpbmcgYWxnb3JpdGhtIHVzZXMgdHdvLWxldmVsIGxvb2t1cCB0YWJsZXMgZm9yCisgICBzcGVlZC4gIFRoZXJlIGlzIGEgc2luZ2xlIGZpcnN0LWxldmVsIHRhYmxlIHRvIGRlY29kZSBjb2RlcyB1cCB0byByb290IGJpdHMKKyAgIGluIGxlbmd0aCAocm9vdCA9PSA5IGluIHRoZSBjdXJyZW50IGluZmxhdGUgaW1wbGVtZW50YXRpb24pLiAgVGhlIHRhYmxlCisgICBoYXMgMSA8PCByb290IGVudHJpZXMgYW5kIGlzIGluZGV4ZWQgYnkgdGhlIG5leHQgcm9vdCBiaXRzIG9mIGlucHV0LiAgQ29kZXMKKyAgIHNob3J0ZXIgdGhhbiByb290IGJpdHMgaGF2ZSByZXBsaWNhdGVkIHRhYmxlIGVudHJpZXMsIHNvIHRoYXQgdGhlIGNvcnJlY3QKKyAgIGVudHJ5IGlzIHBvaW50ZWQgdG8gcmVnYXJkbGVzcyBvZiB0aGUgYml0cyB0aGF0IGZvbGxvdyB0aGUgc2hvcnQgY29kZS4gIElmCisgICB0aGUgY29kZSBpcyBsb25nZXIgdGhhbiByb290IGJpdHMsIHRoZW4gdGhlIHRhYmxlIGVudHJ5IHBvaW50cyB0byBhIHNlY29uZC0KKyAgIGxldmVsIHRhYmxlLiAgVGhlIHNpemUgb2YgdGhhdCB0YWJsZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBsb25nZXN0IGNvZGUgd2l0aAorICAgdGhhdCByb290LWJpdCBwcmVmaXguICBJZiB0aGF0IGxvbmdlc3QgY29kZSBoYXMgbGVuZ3RoIGxlbiwgdGhlbiB0aGUgdGFibGUKKyAgIGhhcyBzaXplIDEgPDwgKGxlbiAtIHJvb3QpLCB0byBpbmRleCB0aGUgcmVtYWluaW5nIGJpdHMgaW4gdGhhdCBzZXQgb2YKKyAgIGNvZGVzLiAgRWFjaCBzdWJzZXF1ZW50IHJvb3QtYml0IHByZWZpeCB0aGVuIGhhcyBpdHMgb3duIHN1Yi10YWJsZS4gIFRoZQorICAgdG90YWwgbnVtYmVyIG9mIHRhYmxlIGVudHJpZXMgcmVxdWlyZWQgYnkgdGhlIGNvZGUgaXMgY2FsY3VsYXRlZAorICAgaW5jcmVtZW50YWxseSBhcyB0aGUgbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBpcyBwb3B1bGF0ZWQuICBXaGVuCisgICBhbGwgb2YgdGhlIGNvZGVzIGFyZSBzaG9ydGVyIHRoYW4gcm9vdCBiaXRzLCB0aGVuIHJvb3QgaXMgcmVkdWNlZCB0byB0aGUKKyAgIGxvbmdlc3QgY29kZSBsZW5ndGgsIHJlc3VsdGluZyBpbiBhIHNpbmdsZSwgc21hbGxlciwgb25lLWxldmVsIHRhYmxlLgorCisgICBUaGUgaW5mbGF0ZSBhbGdvcml0aG0gYWxzbyBwcm92aWRlcyBmb3Igc21hbGwgdmFsdWVzIG9mIHJvb3QgKHJlbGF0aXZlIHRvCisgICB0aGUgbG9nMiBvZiB0aGUgbnVtYmVyIG9mIHN5bWJvbHMpLCB3aGVyZSB0aGUgc2hvcnRlc3QgY29kZSBoYXMgbW9yZSBiaXRzCisgICB0aGFuIHJvb3QuICBJbiB0aGF0IGNhc2UsIHJvb3QgaXMgaW5jcmVhc2VkIHRvIHRoZSBsZW5ndGggb2YgdGhlIHNob3J0ZXN0CisgICBjb2RlLiAgVGhpcyBwcm9ncmFtLCBieSBkZXNpZ24sIGRvZXMgbm90IGhhbmRsZSB0aGF0IGNhc2UsIHNvIGl0IGlzIHZlcmlmaWVkCisgICB0aGF0IHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpcyBsZXNzIHRoYW4gMl4ocm9vdCArIDEpLgorCisgICBJbiBvcmRlciB0byBzcGVlZCB1cCB0aGUgZXhhbWluYXRpb24gKGJ5IGFib3V0IHRlbiBvcmRlcnMgb2YgbWFnbml0dWRlIGZvcgorICAgdGhlIGRlZmF1bHQgYXJndW1lbnRzKSwgdGhlIGludGVybWVkaWF0ZSBzdGF0ZXMgaW4gdGhlIGJ1aWxkLXVwIG9mIGEgY29kZQorICAgYXJlIHJlbWVtYmVyZWQgYW5kIHByZXZpb3VzbHkgdmlzaXRlZCBicmFuY2hlcyBhcmUgcHJ1bmVkLiAgVGhlIG1lbW9yeQorICAgcmVxdWlyZWQgZm9yIHRoaXMgd2lsbCBpbmNyZWFzZSByYXBpZGx5IHdpdGggdGhlIHRvdGFsIG51bWJlciBvZiBzeW1ib2xzIGFuZAorICAgdGhlIG1heGltdW0gY29kZSBsZW5ndGggaW4gYml0cy4gIEhvd2V2ZXIgdGhpcyBpcyBhIHZlcnkgc21hbGwgcHJpY2UgdG8gcGF5CisgICBmb3IgdGhlIHZhc3Qgc3BlZWR1cC4KKworICAgRmlyc3QsIGFsbCBvZiB0aGUgcG9zc2libGUgSHVmZm1hbiBjb2RlcyBhcmUgY291bnRlZCwgYW5kIHJlYWNoYWJsZQorICAgaW50ZXJtZWRpYXRlIHN0YXRlcyBhcmUgbm90ZWQgYnkgYSBub24temVybyBjb3VudCBpbiBhIHNhdmVkLXJlc3VsdHMgYXJyYXkuCisgICBTZWNvbmQsIHRoZSBpbnRlcm1lZGlhdGUgc3RhdGVzIHRoYXQgbGVhZCB0byAocm9vdCArIDEpIGJpdCBvciBsb25nZXIgY29kZXMKKyAgIGFyZSB1c2VkIHRvIGxvb2sgYXQgYWxsIHN1Yi1jb2RlcyBmcm9tIHRob3NlIGp1bmN0dXJlcyBmb3IgdGhlaXIgaW5mbGF0ZQorICAgbWVtb3J5IHVzYWdlLiAgKFRoZSBhbW91bnQgb2YgbWVtb3J5IHVzZWQgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSBudW1iZXIgb2YKKyAgIGNvZGVzIG9mIHJvb3QgYml0cyBvciBsZXNzIGluIGxlbmd0aC4pICBUaGlyZCwgdGhlIHZpc2l0ZWQgc3RhdGVzIGluIHRoZQorICAgY29uc3RydWN0aW9uIG9mIHRob3NlIHN1Yi1jb2RlcyBhbmQgdGhlIGFzc29jaWF0ZWQgY2FsY3VsYXRpb24gb2YgdGhlIHRhYmxlCisgICBzaXplIGlzIHJlY2FsbGVkIGluIG9yZGVyIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgZnJvbSB0aGUgc2FtZSBqdW5jdHVyZS4KKyAgIEJlZ2lubmluZyB0aGUgY29kZSBleGFtaW5hdGlvbiBhdCAocm9vdCArIDEpIGJpdCBjb2Rlcywgd2hpY2ggaXMgZW5hYmxlZCBieQorICAgaWRlbnRpZnlpbmcgdGhlIHJlYWNoYWJsZSBub2RlcywgYWNjb3VudHMgZm9yIGFib3V0IHNpeCBvZiB0aGUgb3JkZXJzIG9mCisgICBtYWduaXR1ZGUgb2YgaW1wcm92ZW1lbnQgZm9yIHRoZSBkZWZhdWx0IGFyZ3VtZW50cy4gIEFib3V0IGFub3RoZXIgZm91cgorICAgb3JkZXJzIG9mIG1hZ25pdHVkZSBjb21lIGZyb20gbm90IHJldmlzaXRpbmcgcHJldmlvdXMgc3RhdGVzLiAgT3V0IG9mCisgICBhcHByb3hpbWF0ZWx5IDJ4MTBeMTYgcG9zc2libGUgSHVmZm1hbiBjb2Rlcywgb25seSBhYm91dCAyeDEwXjYgc3ViLWNvZGVzCisgICBuZWVkIHRvIGJlIGV4YW1pbmVkIHRvIGNvdmVyIGFsbCBvZiB0aGUgcG9zc2libGUgdGFibGUgbWVtb3J5IHVzYWdlIGNhc2VzCisgICBmb3IgdGhlIGRlZmF1bHQgYXJndW1lbnRzIG9mIDI4NiBzeW1ib2xzIGxpbWl0ZWQgdG8gMTUtYml0IGNvZGVzLgorCisgICBOb3RlIHRoYXQgYW4gdW5zaWduZWQgbG9uZyBsb25nIHR5cGUgaXMgdXNlZCBmb3IgY291bnRpbmcuICBJdCBpcyBxdWl0ZSBlYXN5CisgICB0byBleGNlZWQgdGhlIGNhcGFjaXR5IG9mIGFuIGVpZ2h0LWJ5dGUgaW50ZWdlciB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mCisgICBzeW1ib2xzIGFuZCBhIGxhcmdlIG1heGltdW0gY29kZSBsZW5ndGgsIHNvIG11bHRpcGxlLXByZWNpc2lvbiBhcml0aG1ldGljCisgICB3b3VsZCBuZWVkIHRvIHJlcGxhY2UgdGhlIHVuc2lnbmVkIGxvbmcgbG9uZyBhcml0aG1ldGljIGluIHRoYXQgY2FzZS4gIFRoaXMKKyAgIHByb2dyYW0gd2lsbCBhYm9ydCBpZiBhbiBvdmVyZmxvdyBvY2N1cnMuICBUaGUgYmlnX3QgdHlwZSBpZGVudGlmaWVzIHdoZXJlCisgICB0aGUgY291bnRpbmcgdGFrZXMgcGxhY2UuCisKKyAgIEFuIHVuc2lnbmVkIGxvbmcgbG9uZyB0eXBlIGlzIGFsc28gdXNlZCBmb3IgY2FsY3VsYXRpbmcgdGhlIG51bWJlciBvZgorICAgcG9zc2libGUgY29kZXMgcmVtYWluaW5nIGF0IHRoZSBtYXhpbXVtIGxlbmd0aC4gIFRoaXMgbGltaXRzIHRoZSBtYXhpbXVtCisgICBjb2RlIGxlbmd0aCB0byB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYSBsb25nIGxvbmcgbWludXMgdGhlIG51bWJlciBvZiBiaXRzCisgICBuZWVkZWQgdG8gcmVwcmVzZW50IHRoZSBzeW1ib2xzIGluIGEgZmxhdCBjb2RlLiAgVGhlIGNvZGVfdCB0eXBlIGlkZW50aWZpZXMKKyAgIHdoZXJlIHRoZSBiaXQgcGF0dGVybiBjb3VudGluZyB0YWtlcyBwbGFjZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2RlZmluZSBsb2NhbCBzdGF0aWMKKworLyogc3BlY2lhbCBkYXRhIHR5cGVzICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBiaWdfdDsgICAvKiB0eXBlIGZvciBjb2RlIGNvdW50aW5nICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBjb2RlX3Q7ICAvKiB0eXBlIGZvciBiaXQgcGF0dGVybiBjb3VudGluZyAqLworc3RydWN0IHRhYiB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogdHlwZSBmb3IgYmVlbiBoZXJlIGNoZWNrICovCisgICAgc2l6ZV90IGxlbjsgICAgICAgICAvKiBsZW5ndGggb2YgYml0IHZlY3RvciBpbiBjaGFyJ3MgKi8KKyAgICBjaGFyICp2ZWM7ICAgICAgICAgIC8qIGFsbG9jYXRlZCBiaXQgdmVjdG9yICovCit9OworCisvKiBUaGUgYXJyYXkgZm9yIHNhdmluZyByZXN1bHRzLCBudW1bXSwgaXMgaW5kZXhlZCB3aXRoIHRoaXMgdHJpcGxldDoKKworICAgICAgc3ltczogbnVtYmVyIG9mIHN5bWJvbHMgcmVtYWluaW5nIHRvIGNvZGUKKyAgICAgIGxlZnQ6IG51bWJlciBvZiBhdmFpbGFibGUgYml0IHBhdHRlcm5zIGF0IGxlbmd0aCBsZW4KKyAgICAgIGxlbjogbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGNvZGVzIGN1cnJlbnRseSBiZWluZyBhc3NpZ25lZAorCisgICBUaG9zZSBpbmRpY2VzIGFyZSBjb25zdHJhaW5lZCB0aHVzbHkgd2hlbiBzYXZpbmcgcmVzdWx0czoKKworICAgICAgc3ltczogMy4udG90c3ltICh0b3RzeW0gPT0gdG90YWwgc3ltYm9scyB0byBjb2RlKQorICAgICAgbGVmdDogMi4uc3ltcyAtIDEsIGJ1dCBvbmx5IHRoZSBldmVucyAoc28gc3ltcyA9PSA4IC0+IDIsIDQsIDYpCisgICAgICBsZW46IDEuLm1heCAtIDEgKG1heCA9PSBtYXhpbXVtIGNvZGUgbGVuZ3RoIGluIGJpdHMpCisKKyAgIHN5bXMgPT0gMiBpcyBub3Qgc2F2ZWQgc2luY2UgdGhhdCBpbW1lZGlhdGVseSBsZWFkcyB0byBhIHNpbmdsZSBjb2RlLiAgbGVmdAorICAgbXVzdCBiZSBldmVuLCBzaW5jZSBpdCByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGJpdCBwYXR0ZXJucyBhdAorICAgdGhlIGN1cnJlbnQgbGVuZ3RoLCB3aGljaCBpcyBkb3VibGUgdGhlIG51bWJlciBhdCB0aGUgcHJldmlvdXMgbGVuZ3RoLgorICAgbGVmdCBlbmRzIGF0IHN5bXMtMSBzaW5jZSBsZWZ0ID09IHN5bXMgaW1tZWRpYXRlbHkgcmVzdWx0cyBpbiBhIHNpbmdsZSBjb2RlLgorICAgKGxlZnQgPiBzeW0gaXMgbm90IGFsbG93ZWQgc2luY2UgdGhhdCB3b3VsZCByZXN1bHQgaW4gYW4gaW5jb21wbGV0ZSBjb2RlLikKKyAgIGxlbiBpcyBsZXNzIHRoYW4gbWF4LCBzaW5jZSB0aGUgY29kZSBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgd2hlbiBsZW4gPT0gbWF4LgorCisgICBUaGUgb2Zmc2V0IGludG8gdGhlIGFycmF5IGlzIGNhbGN1bGF0ZWQgZm9yIHRoZSB0aHJlZSBpbmRpY2VzIHdpdGggdGhlCisgICBmaXJzdCBvbmUgKHN5bXMpIGJlaW5nIG91dGVybW9zdCwgYW5kIHRoZSBsYXN0IG9uZSAobGVuKSBiZWluZyBpbm5lcm1vc3QuCisgICBXZSBidWlsZCB0aGUgYXJyYXkgd2l0aCBsZW5ndGggbWF4LTEgbGlzdHMgZm9yIHRoZSBsZW4gaW5kZXgsIHdpdGggc3ltcy0zCisgICBvZiB0aG9zZSBmb3IgZWFjaCBzeW1ib2wuICBUaGVyZSBhcmUgdG90c3ltLTIgb2YgdGhvc2UsIHdpdGggZWFjaCBvbmUKKyAgIHZhcnlpbmcgaW4gbGVuZ3RoIGFzIGEgZnVuY3Rpb24gb2Ygc3ltLiAgU2VlIHRoZSBjYWxjdWxhdGlvbiBvZiBpbmRleCBpbgorICAgY291bnQoKSBmb3IgdGhlIGluZGV4LCBhbmQgdGhlIGNhbGN1bGF0aW9uIG9mIHNpemUgaW4gbWFpbigpIGZvciB0aGUgc2l6ZQorICAgb2YgdGhlIGFycmF5LgorCisgICBGb3IgdGhlIGRlZmxhdGUgZXhhbXBsZSBvZiAyODYgc3ltYm9scyBsaW1pdGVkIHRvIDE1LWJpdCBjb2RlcywgdGhlIGFycmF5CisgICBoYXMgMjg0LDI4NCBlbnRyaWVzLCB0YWtpbmcgdXAgMi4xNyBNQiBmb3IgYW4gOC1ieXRlIGJpZ190LiAgTW9yZSB0aGFuCisgICBoYWxmIG9mIHRoZSBzcGFjZSBhbGxvY2F0ZWQgZm9yIHNhdmVkIHJlc3VsdHMgaXMgYWN0dWFsbHkgdXNlZCAtLSBub3QgYWxsCisgICBwb3NzaWJsZSB0cmlwbGV0cyBhcmUgcmVhY2hlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiB2YWxpZCBIdWZmbWFuIGNvZGVzLgorICovCisKKy8qIFRoZSBhcnJheSBmb3IgdHJhY2tpbmcgdmlzaXRlZCBzdGF0ZXMsIGRvbmVbXSwgaXMgaXRzZWxmIGluZGV4ZWQgaWRlbnRpY2FsbHkKKyAgIHRvIHRoZSBudW1bXSBhcnJheSBhcyBkZXNjcmliZWQgYWJvdmUgZm9yIHRoZSAoc3ltcywgbGVmdCwgbGVuKSB0cmlwbGV0LgorICAgRWFjaCBlbGVtZW50IGluIHRoZSBhcnJheSBpcyBmdXJ0aGVyIGluZGV4ZWQgYnkgdGhlIChtZW0sIHJlbSkgZG91YmxldCwKKyAgIHdoZXJlIG1lbSBpcyB0aGUgYW1vdW50IG9mIGluZmxhdGUgdGFibGUgc3BhY2UgdXNlZCBzbyBmYXIsIGFuZCByZW0gaXMgdGhlCisgICByZW1haW5pbmcgdW51c2VkIGVudHJpZXMgaW4gdGhlIGN1cnJlbnQgaW5mbGF0ZSBzdWItdGFibGUuICBFYWNoIGluZGV4ZWQKKyAgIGVsZW1lbnQgaXMgc2ltcGx5IG9uZSBiaXQgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzdGF0ZSBoYXMgYmVlbiB2aXNpdGVkIG9yCisgICBub3QuICBTaW5jZSB0aGUgcmFuZ2VzIGZvciBtZW0gYW5kIHJlbSBhcmUgbm90IGtub3duIGEgcHJpb3JpLCBlYWNoIGJpdAorICAgdmVjdG9yIGlzIG9mIGEgdmFyaWFibGUgc2l6ZSwgYW5kIGdyb3dzIGFzIG5lZWRlZCB0byBhY2NvbW1vZGF0ZSB0aGUgdmlzaXRlZAorICAgc3RhdGVzLiAgbWVtIGFuZCByZW0gYXJlIHVzZWQgdG8gY2FsY3VsYXRlIGEgc2luZ2xlIGluZGV4IGluIGEgdHJpYW5ndWxhcgorICAgYXJyYXkuICBTaW5jZSB0aGUgcmFuZ2Ugb2YgbWVtIGlzIGV4cGVjdGVkIGluIHRoZSBkZWZhdWx0IGNhc2UgdG8gYmUgYWJvdXQKKyAgIHRlbiB0aW1lcyBsYXJnZXIgdGhhbiB0aGUgcmFuZ2Ugb2YgcmVtLCB0aGUgYXJyYXkgaXMgc2tld2VkIHRvIHJlZHVjZSB0aGUKKyAgIG1lbW9yeSB1c2FnZSwgd2l0aCBlaWdodCB0aW1lcyB0aGUgcmFuZ2UgZm9yIG1lbSB0aGFuIGZvciByZW0uICBTZWUgdGhlCisgICBjYWxjdWxhdGlvbnMgZm9yIG9mZnNldCBhbmQgYml0IGluIGJlZW5oZXJlKCkgZm9yIHRoZSBkZXRhaWxzLgorCisgICBGb3IgdGhlIGRlZmxhdGUgZXhhbXBsZSBvZiAyODYgc3ltYm9scyBsaW1pdGVkIHRvIDE1LWJpdCBjb2RlcywgdGhlIGJpdAorICAgdmVjdG9ycyBncm93IHRvIHRvdGFsIGFwcHJveGltYXRlbHkgMjEgTUIsIGluIGFkZGl0aW9uIHRvIHRoZSA0LjMgTUIgZG9uZVtdCisgICBhcnJheSBpdHNlbGYuCisgKi8KKworLyogR2xvYmFscyB0byBhdm9pZCBwcm9wYWdhdGluZyBjb25zdGFudHMgb3IgY29uc3RhbnQgcG9pbnRlcnMgcmVjdXJzaXZlbHkgKi8KK2xvY2FsIGludCBtYXg7ICAgICAgICAgIC8qIG1heGltdW0gYWxsb3dlZCBiaXQgbGVuZ3RoIGZvciB0aGUgY29kZXMgKi8KK2xvY2FsIGludCByb290OyAgICAgICAgIC8qIHNpemUgb2YgYmFzZSBjb2RlIHRhYmxlIGluIGJpdHMgKi8KK2xvY2FsIGludCBsYXJnZTsgICAgICAgIC8qIGxhcmdlc3QgY29kZSB0YWJsZSBzbyBmYXIgKi8KK2xvY2FsIHNpemVfdCBzaXplOyAgICAgIC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiBudW0gYW5kIGRvbmUgKi8KK2xvY2FsIGludCAqY29kZTsgICAgICAgIC8qIG51bWJlciBvZiBzeW1ib2xzIGFzc2lnbmVkIHRvIGVhY2ggYml0IGxlbmd0aCAqLworbG9jYWwgYmlnX3QgKm51bTsgICAgICAgLyogc2F2ZWQgcmVzdWx0cyBhcnJheSBmb3IgY29kZSBjb3VudGluZyAqLworbG9jYWwgc3RydWN0IHRhYiAqZG9uZTsgLyogc3RhdGVzIGFscmVhZHkgZXZhbHVhdGVkIGFycmF5ICovCisKKy8qIEluZGV4IGZ1bmN0aW9uIGZvciBudW1bXSBhbmQgZG9uZVtdICovCisjZGVmaW5lIElOREVYKGksaixrKSAoKChzaXplX3QpKChpLTEpPj4xKSooKGktMik+PjEpKyhqPj4xKS0xKSoobWF4LTEpK2stMSkKKworLyogRnJlZSBhbGxvY2F0ZWQgc3BhY2UuICBVc2VzIGdsb2JhbHMgY29kZSwgbnVtLCBhbmQgZG9uZS4gKi8KK2xvY2FsIHZvaWQgY2xlYW51cCh2b2lkKQoreworICAgIHNpemVfdCBuOworCisgICAgaWYgKGRvbmUgIT0gTlVMTCkgeworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgc2l6ZTsgbisrKQorICAgICAgICAgICAgaWYgKGRvbmVbbl0ubGVuKQorICAgICAgICAgICAgICAgIGZyZWUoZG9uZVtuXS52ZWMpOworICAgICAgICBmcmVlKGRvbmUpOworICAgIH0KKyAgICBpZiAobnVtICE9IE5VTEwpCisgICAgICAgIGZyZWUobnVtKTsKKyAgICBpZiAoY29kZSAhPSBOVUxMKQorICAgICAgICBmcmVlKGNvZGUpOworfQorCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwb3NzaWJsZSBIdWZmbWFuIGNvZGVzIHVzaW5nIGJpdCBwYXR0ZXJucyBvZiBsZW5ndGhzCisgICBsZW4gdGhyb3VnaCBtYXggaW5jbHVzaXZlLCBjb2Rpbmcgc3ltcyBzeW1ib2xzLCB3aXRoIGxlZnQgYml0IHBhdHRlcm5zIG9mCisgICBsZW5ndGggbGVuIHVudXNlZCAtLSByZXR1cm4gLTEgaWYgdGhlcmUgaXMgYW4gb3ZlcmZsb3cgaW4gdGhlIGNvdW50aW5nLgorICAgS2VlcCBhIHJlY29yZCBvZiBwcmV2aW91cyByZXN1bHRzIGluIG51bSB0byBwcmV2ZW50IHJlcGVhdGluZyB0aGUgc2FtZQorICAgY2FsY3VsYXRpb24uICBVc2VzIHRoZSBnbG9iYWxzIG1heCBhbmQgbnVtLiAqLworbG9jYWwgYmlnX3QgY291bnQoaW50IHN5bXMsIGludCBsZW4sIGludCBsZWZ0KQoreworICAgIGJpZ190IHN1bTsgICAgICAgICAgLyogbnVtYmVyIG9mIHBvc3NpYmxlIGNvZGVzIGZyb20gdGhpcyBqdW5jdHVyZSAqLworICAgIGJpZ190IGdvdDsgICAgICAgICAgLyogdmFsdWUgcmV0dXJuZWQgZnJvbSBjb3VudCgpICovCisgICAgaW50IGxlYXN0OyAgICAgICAgICAvKiBsZWFzdCBudW1iZXIgb2Ygc3ltcyB0byB1c2UgYXQgdGhpcyBqdW5jdHVyZSAqLworICAgIGludCBtb3N0OyAgICAgICAgICAgLyogbW9zdCBudW1iZXIgb2Ygc3ltcyB0byB1c2UgYXQgdGhpcyBqdW5jdHVyZSAqLworICAgIGludCB1c2U7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdCBwYXR0ZXJucyB0byB1c2UgaW4gbmV4dCBjYWxsICovCisgICAgc2l6ZV90IGluZGV4OyAgICAgICAvKiBpbmRleCBvZiB0aGlzIGNhc2UgaW4gKm51bSAqLworCisgICAgLyogc2VlIGlmIG9ubHkgb25lIHBvc3NpYmxlIGNvZGUgKi8KKyAgICBpZiAoc3ltcyA9PSBsZWZ0KQorICAgICAgICByZXR1cm4gMTsKKworICAgIC8qIG5vdGUgYW5kIHZlcmlmeSB0aGUgZXhwZWN0ZWQgc3RhdGUgKi8KKyAgICBhc3NlcnQoc3ltcyA+IGxlZnQgJiYgbGVmdCA+IDAgJiYgbGVuIDwgbWF4KTsKKworICAgIC8qIHNlZSBpZiB3ZSd2ZSBkb25lIHRoaXMgb25lIGFscmVhZHkgKi8KKyAgICBpbmRleCA9IElOREVYKHN5bXMsIGxlZnQsIGxlbik7CisgICAgZ290ID0gbnVtW2luZGV4XTsKKyAgICBpZiAoZ290KQorICAgICAgICByZXR1cm4gZ290OyAgICAgICAgIC8qIHdlIGhhdmUgLS0gcmV0dXJuIHRoZSBzYXZlZCByZXN1bHQgKi8KKworICAgIC8qIHdlIG5lZWQgdG8gdXNlIGF0IGxlYXN0IHRoaXMgbWFueSBiaXQgcGF0dGVybnMgc28gdGhhdCB0aGUgY29kZSB3b24ndCBiZQorICAgICAgIGluY29tcGxldGUgYXQgdGhlIG5leHQgbGVuZ3RoIChtb3JlIGJpdCBwYXR0ZXJucyB0aGFuIHN5bWJvbHMpICovCisgICAgbGVhc3QgPSAobGVmdCA8PCAxKSAtIHN5bXM7CisgICAgaWYgKGxlYXN0IDwgMCkKKyAgICAgICAgbGVhc3QgPSAwOworCisgICAgLyogd2UgY2FuIHVzZSBhdCBtb3N0IHRoaXMgbWFueSBiaXQgcGF0dGVybnMsIGxlc3QgdGhlcmUgbm90IGJlIGVub3VnaAorICAgICAgIGF2YWlsYWJsZSBmb3IgdGhlIHJlbWFpbmluZyBzeW1ib2xzIGF0IHRoZSBtYXhpbXVtIGxlbmd0aCAoaWYgdGhlcmUgd2VyZQorICAgICAgIG5vIGxpbWl0IHRvIHRoZSBjb2RlIGxlbmd0aCwgdGhpcyB3b3VsZCBiZWNvbWU6IG1vc3QgPSBsZWZ0IC0gMSkgKi8KKyAgICBtb3N0ID0gKCgoY29kZV90KWxlZnQgPDwgKG1heCAtIGxlbikpIC0gc3ltcykgLworICAgICAgICAgICAgKCgoY29kZV90KTEgPDwgKG1heCAtIGxlbikpIC0gMSk7CisKKyAgICAvKiBjb3VudCBhbGwgcG9zc2libGUgY29kZXMgZnJvbSB0aGlzIGp1bmN0dXJlIGFuZCBhZGQgdGhlbSB1cCAqLworICAgIHN1bSA9IDA7CisgICAgZm9yICh1c2UgPSBsZWFzdDsgdXNlIDw9IG1vc3Q7IHVzZSsrKSB7CisgICAgICAgIGdvdCA9IGNvdW50KHN5bXMgLSB1c2UsIGxlbiArIDEsIChsZWZ0IC0gdXNlKSA8PCAxKTsKKyAgICAgICAgc3VtICs9IGdvdDsKKyAgICAgICAgaWYgKGdvdCA9PSAoYmlnX3QpMCAtIDEgfHwgc3VtIDwgZ290KSAgIC8qIG92ZXJmbG93ICovCisgICAgICAgICAgICByZXR1cm4gKGJpZ190KTAgLSAxOworICAgIH0KKworICAgIC8qIHZlcmlmeSB0aGF0IGFsbCByZWN1cnNpdmUgY2FsbHMgYXJlIHByb2R1Y3RpdmUgKi8KKyAgICBhc3NlcnQoc3VtICE9IDApOworCisgICAgLyogc2F2ZSB0aGUgcmVzdWx0IGFuZCByZXR1cm4gaXQgKi8KKyAgICBudW1baW5kZXhdID0gc3VtOworICAgIHJldHVybiBzdW07Cit9CisKKy8qIFJldHVybiB0cnVlIGlmIHdlJ3ZlIGJlZW4gaGVyZSBiZWZvcmUsIHNldCB0byB0cnVlIGlmIG5vdC4gIFNldCBhIGJpdCBpbiBhCisgICBiaXQgdmVjdG9yIHRvIGluZGljYXRlIHZpc2l0aW5nIHRoaXMgc3RhdGUuICBFYWNoIChzeW1zLGxlbixsZWZ0KSBzdGF0ZQorICAgaGFzIGEgdmFyaWFibGUgc2l6ZSBiaXQgdmVjdG9yIGluZGV4ZWQgYnkgKG1lbSxyZW0pLiAgVGhlIGJpdCB2ZWN0b3IgaXMKKyAgIGxlbmd0aGVuZWQgaWYgbmVlZGVkIHRvIGFsbG93IHNldHRpbmcgdGhlIChtZW0scmVtKSBiaXQuICovCitsb2NhbCBpbnQgYmVlbmhlcmUoaW50IHN5bXMsIGludCBsZW4sIGludCBsZWZ0LCBpbnQgbWVtLCBpbnQgcmVtKQoreworICAgIHNpemVfdCBpbmRleDsgICAgICAgLyogaW5kZXggZm9yIHRoaXMgc3RhdGUncyBiaXQgdmVjdG9yICovCisgICAgc2l6ZV90IG9mZnNldDsgICAgICAvKiBvZmZzZXQgaW4gdGhpcyBzdGF0ZSdzIGJpdCB2ZWN0b3IgKi8KKyAgICBpbnQgYml0OyAgICAgICAgICAgIC8qIG1hc2sgZm9yIHRoaXMgc3RhdGUncyBiaXQgKi8KKyAgICBzaXplX3QgbGVuZ3RoOyAgICAgIC8qIGxlbmd0aCBvZiB0aGUgYml0IHZlY3RvciBpbiBieXRlcyAqLworICAgIGNoYXIgKnZlY3RvcjsgICAgICAgLyogbmV3IG9yIGVubGFyZ2VkIGJpdCB2ZWN0b3IgKi8KKworICAgIC8qIHBvaW50IHRvIHZlY3RvciBmb3IgKHN5bXMsbGVmdCxsZW4pLCBiaXQgaW4gdmVjdG9yIGZvciAobWVtLHJlbSkgKi8KKyAgICBpbmRleCA9IElOREVYKHN5bXMsIGxlZnQsIGxlbik7CisgICAgbWVtIC09IDEgPDwgcm9vdDsKKyAgICBvZmZzZXQgPSAobWVtID4+IDMpICsgcmVtOworICAgIG9mZnNldCA9ICgob2Zmc2V0ICogKG9mZnNldCArIDEpKSA+PiAxKSArIHJlbTsKKyAgICBiaXQgPSAxIDw8IChtZW0gJiA3KTsKKworICAgIC8qIHNlZSBpZiB3ZSd2ZSBiZWVuIGhlcmUgKi8KKyAgICBsZW5ndGggPSBkb25lW2luZGV4XS5sZW47CisgICAgaWYgKG9mZnNldCA8IGxlbmd0aCAmJiAoZG9uZVtpbmRleF0udmVjW29mZnNldF0gJiBiaXQpICE9IDApCisgICAgICAgIHJldHVybiAxOyAgICAgICAvKiBkb25lIHRoaXMhICovCisKKyAgICAvKiB3ZSBoYXZlbid0IGJlZW4gaGVyZSBiZWZvcmUgLS0gc2V0IHRoZSBiaXQgdG8gc2hvdyB3ZSBoYXZlIG5vdyAqLworCisgICAgLyogc2VlIGlmIHdlIG5lZWQgdG8gbGVuZ3RoZW4gdGhlIHZlY3RvciBpbiBvcmRlciB0byBzZXQgdGhlIGJpdCAqLworICAgIGlmIChsZW5ndGggPD0gb2Zmc2V0KSB7CisgICAgICAgIC8qIGlmIHdlIGhhdmUgb25lIGFscmVhZHksIGVubGFyZ2UgaXQsIHplcm8gb3V0IHRoZSBhcHBlbmRlZCBzcGFjZSAqLworICAgICAgICBpZiAobGVuZ3RoKSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgbGVuZ3RoIDw8PSAxOworICAgICAgICAgICAgfSB3aGlsZSAobGVuZ3RoIDw9IG9mZnNldCk7CisgICAgICAgICAgICB2ZWN0b3IgPSByZWFsbG9jKGRvbmVbaW5kZXhdLnZlYywgbGVuZ3RoKTsKKyAgICAgICAgICAgIGlmICh2ZWN0b3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBtZW1zZXQodmVjdG9yICsgZG9uZVtpbmRleF0ubGVuLCAwLCBsZW5ndGggLSBkb25lW2luZGV4XS5sZW4pOworICAgICAgICB9CisKKyAgICAgICAgLyogb3RoZXJ3aXNlIHdlIG5lZWQgdG8gbWFrZSBhIG5ldyB2ZWN0b3IgYW5kIHplcm8gaXQgb3V0ICovCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbGVuZ3RoID0gMSA8PCAobGVuIC0gcm9vdCk7CisgICAgICAgICAgICB3aGlsZSAobGVuZ3RoIDw9IG9mZnNldCkKKyAgICAgICAgICAgICAgICBsZW5ndGggPDw9IDE7CisgICAgICAgICAgICB2ZWN0b3IgPSBjYWxsb2MobGVuZ3RoLCBzaXplb2YoY2hhcikpOworICAgICAgICB9CisKKyAgICAgICAgLyogaW4gZWl0aGVyIGNhc2UsIGJhaWwgaWYgd2UgY2FuJ3QgZ2V0IHRoZSBtZW1vcnkgKi8KKyAgICAgICAgaWYgKHZlY3RvciA9PSBOVUxMKSB7CisgICAgICAgICAgICBmcHV0cygiYWJvcnQ6IHVuYWJsZSB0byBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5XG4iLCBzdGRlcnIpOworICAgICAgICAgICAgY2xlYW51cCgpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGluc3RhbGwgdGhlIG5ldyB2ZWN0b3IgKi8KKyAgICAgICAgZG9uZVtpbmRleF0ubGVuID0gbGVuZ3RoOworICAgICAgICBkb25lW2luZGV4XS52ZWMgPSB2ZWN0b3I7CisgICAgfQorCisgICAgLyogc2V0IHRoZSBiaXQgKi8KKyAgICBkb25lW2luZGV4XS52ZWNbb2Zmc2V0XSB8PSBiaXQ7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEV4YW1pbmUgYWxsIHBvc3NpYmxlIGNvZGVzIGZyb20gdGhlIGdpdmVuIG5vZGUgKHN5bXMsIGxlbiwgbGVmdCkuICBDb21wdXRlCisgICB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBidWlsZCBpbmZsYXRlJ3MgZGVjb2RpbmcgdGFibGVzLCB3aGVyZSB0aGUKKyAgIG51bWJlciBvZiBjb2RlIHN0cnVjdHVyZXMgdXNlZCBzbyBmYXIgaXMgbWVtLCBhbmQgdGhlIG51bWJlciByZW1haW5pbmcgaW4KKyAgIHRoZSBjdXJyZW50IHN1Yi10YWJsZSBpcyByZW0uICBVc2VzIHRoZSBnbG9iYWxzIG1heCwgY29kZSwgcm9vdCwgbGFyZ2UsIGFuZAorICAgZG9uZS4gKi8KK2xvY2FsIHZvaWQgZXhhbWluZShpbnQgc3ltcywgaW50IGxlbiwgaW50IGxlZnQsIGludCBtZW0sIGludCByZW0pCit7CisgICAgaW50IGxlYXN0OyAgICAgICAgICAvKiBsZWFzdCBudW1iZXIgb2Ygc3ltcyB0byB1c2UgYXQgdGhpcyBqdW5jdHVyZSAqLworICAgIGludCBtb3N0OyAgICAgICAgICAgLyogbW9zdCBudW1iZXIgb2Ygc3ltcyB0byB1c2UgYXQgdGhpcyBqdW5jdHVyZSAqLworICAgIGludCB1c2U7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdCBwYXR0ZXJucyB0byB1c2UgaW4gbmV4dCBjYWxsICovCisKKyAgICAvKiBzZWUgaWYgd2UgaGF2ZSBhIGNvbXBsZXRlIGNvZGUgKi8KKyAgICBpZiAoc3ltcyA9PSBsZWZ0KSB7CisgICAgICAgIC8qIHNldCB0aGUgbGFzdCBjb2RlIGVudHJ5ICovCisgICAgICAgIGNvZGVbbGVuXSA9IGxlZnQ7CisKKyAgICAgICAgLyogY29tcGxldGUgY29tcHV0YXRpb24gb2YgbWVtb3J5IHVzZWQgYnkgdGhpcyBjb2RlICovCisgICAgICAgIHdoaWxlIChyZW0gPCBsZWZ0KSB7CisgICAgICAgICAgICBsZWZ0IC09IHJlbTsKKyAgICAgICAgICAgIHJlbSA9IDEgPDwgKGxlbiAtIHJvb3QpOworICAgICAgICAgICAgbWVtICs9IHJlbTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQocmVtID09IGxlZnQpOworCisgICAgICAgIC8qIGlmIHRoaXMgaXMgYSBuZXcgbWF4aW11bSwgc2hvdyB0aGUgZW50cmllcyB1c2VkIGFuZCB0aGUgc3ViLWNvZGUgKi8KKyAgICAgICAgaWYgKG1lbSA+IGxhcmdlKSB7CisgICAgICAgICAgICBsYXJnZSA9IG1lbTsKKyAgICAgICAgICAgIHByaW50ZigibWF4ICVkOiAiLCBtZW0pOworICAgICAgICAgICAgZm9yICh1c2UgPSByb290ICsgMTsgdXNlIDw9IG1heDsgdXNlKyspCisgICAgICAgICAgICAgICAgaWYgKGNvZGVbdXNlXSkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlZFslZF0gIiwgY29kZVt1c2VdLCB1c2UpOworICAgICAgICAgICAgcHV0Y2hhcignXG4nKTsKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICB9CisKKyAgICAgICAgLyogcmVtb3ZlIGVudHJpZXMgYXMgd2UgZHJvcCBiYWNrIGRvd24gaW4gdGhlIHJlY3Vyc2lvbiAqLworICAgICAgICBjb2RlW2xlbl0gPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogcHJ1bmUgdGhlIHRyZWUgaWYgd2UgY2FuICovCisgICAgaWYgKGJlZW5oZXJlKHN5bXMsIGxlbiwgbGVmdCwgbWVtLCByZW0pKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiB3ZSBuZWVkIHRvIHVzZSBhdCBsZWFzdCB0aGlzIG1hbnkgYml0IHBhdHRlcm5zIHNvIHRoYXQgdGhlIGNvZGUgd29uJ3QgYmUKKyAgICAgICBpbmNvbXBsZXRlIGF0IHRoZSBuZXh0IGxlbmd0aCAobW9yZSBiaXQgcGF0dGVybnMgdGhhbiBzeW1ib2xzKSAqLworICAgIGxlYXN0ID0gKGxlZnQgPDwgMSkgLSBzeW1zOworICAgIGlmIChsZWFzdCA8IDApCisgICAgICAgIGxlYXN0ID0gMDsKKworICAgIC8qIHdlIGNhbiB1c2UgYXQgbW9zdCB0aGlzIG1hbnkgYml0IHBhdHRlcm5zLCBsZXN0IHRoZXJlIG5vdCBiZSBlbm91Z2gKKyAgICAgICBhdmFpbGFibGUgZm9yIHRoZSByZW1haW5pbmcgc3ltYm9scyBhdCB0aGUgbWF4aW11bSBsZW5ndGggKGlmIHRoZXJlIHdlcmUKKyAgICAgICBubyBsaW1pdCB0byB0aGUgY29kZSBsZW5ndGgsIHRoaXMgd291bGQgYmVjb21lOiBtb3N0ID0gbGVmdCAtIDEpICovCisgICAgbW9zdCA9ICgoKGNvZGVfdClsZWZ0IDw8IChtYXggLSBsZW4pKSAtIHN5bXMpIC8KKyAgICAgICAgICAgICgoKGNvZGVfdCkxIDw8IChtYXggLSBsZW4pKSAtIDEpOworCisgICAgLyogb2NjdXB5IGxlYXN0IHRhYmxlIHNwYWNlcywgY3JlYXRpbmcgbmV3IHN1Yi10YWJsZXMgYXMgbmVlZGVkICovCisgICAgdXNlID0gbGVhc3Q7CisgICAgd2hpbGUgKHJlbSA8IHVzZSkgeworICAgICAgICB1c2UgLT0gcmVtOworICAgICAgICByZW0gPSAxIDw8IChsZW4gLSByb290KTsKKyAgICAgICAgbWVtICs9IHJlbTsKKyAgICB9CisgICAgcmVtIC09IHVzZTsKKworICAgIC8qIGV4YW1pbmUgY29kZXMgZnJvbSBoZXJlLCB1cGRhdGluZyB0YWJsZSBzcGFjZSBhcyB3ZSBnbyAqLworICAgIGZvciAodXNlID0gbGVhc3Q7IHVzZSA8PSBtb3N0OyB1c2UrKykgeworICAgICAgICBjb2RlW2xlbl0gPSB1c2U7CisgICAgICAgIGV4YW1pbmUoc3ltcyAtIHVzZSwgbGVuICsgMSwgKGxlZnQgLSB1c2UpIDw8IDEsCisgICAgICAgICAgICAgICAgbWVtICsgKHJlbSA/IDEgPDwgKGxlbiAtIHJvb3QpIDogMCksIHJlbSA8PCAxKTsKKyAgICAgICAgaWYgKHJlbSA9PSAwKSB7CisgICAgICAgICAgICByZW0gPSAxIDw8IChsZW4gLSByb290KTsKKyAgICAgICAgICAgIG1lbSArPSByZW07CisgICAgICAgIH0KKyAgICAgICAgcmVtLS07CisgICAgfQorCisgICAgLyogcmVtb3ZlIGVudHJpZXMgYXMgd2UgZHJvcCBiYWNrIGRvd24gaW4gdGhlIHJlY3Vyc2lvbiAqLworICAgIGNvZGVbbGVuXSA9IDA7Cit9CisKKy8qIExvb2sgYXQgYWxsIHN1Yi1jb2RlcyBzdGFydGluZyB3aXRoIHJvb3QgKyAxIGJpdHMuICBMb29rIGF0IG9ubHkgdGhlIHZhbGlkCisgICBpbnRlcm1lZGlhdGUgY29kZSBzdGF0ZXMgKHN5bXMsIGxlZnQsIGxlbikuICBGb3IgZWFjaCBjb21wbGV0ZWQgY29kZSwKKyAgIGNhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCBieSBpbmZsYXRlIHRvIGJ1aWxkIHRoZSBkZWNvZGluZworICAgdGFibGVzLiBGaW5kIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgYW5kIHNob3cgdGhlIGNvZGUgdGhhdAorICAgcmVxdWlyZXMgdGhhdCBtYXhpbXVtLiAgVXNlcyB0aGUgZ2xvYmFscyBtYXgsIHJvb3QsIGFuZCBudW0uICovCitsb2NhbCB2b2lkIGVub3VnaChpbnQgc3ltcykKK3sKKyAgICBpbnQgbjsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiByZW1haW5nIHN5bWJvbHMgZm9yIHRoaXMgbm9kZSAqLworICAgIGludCBsZWZ0OyAgICAgICAgICAgLyogbnVtYmVyIG9mIHVudXNlZCBiaXQgcGF0dGVybnMgYXQgdGhpcyBsZW5ndGggKi8KKyAgICBzaXplX3QgaW5kZXg7ICAgICAgIC8qIGluZGV4IG9mIHRoaXMgY2FzZSBpbiAqbnVtICovCisKKyAgICAvKiBjbGVhciBjb2RlICovCisgICAgZm9yIChuID0gMDsgbiA8PSBtYXg7IG4rKykKKyAgICAgICAgY29kZVtuXSA9IDA7CisKKyAgICAvKiBsb29rIGF0IGFsbCAocm9vdCArIDEpIGJpdCBhbmQgbG9uZ2VyIGNvZGVzICovCisgICAgbGFyZ2UgPSAxIDw8IHJvb3Q7ICAgICAgICAgICAgICAvKiBiYXNlIHRhYmxlICovCisgICAgaWYgKHJvb3QgPCBtYXgpICAgICAgICAgICAgICAgICAvKiBvdGhlcndpc2UsIHRoZXJlJ3Mgb25seSBhIGJhc2UgdGFibGUgKi8KKyAgICAgICAgZm9yIChuID0gMzsgbiA8PSBzeW1zOyBuKyspCisgICAgICAgICAgICBmb3IgKGxlZnQgPSAyOyBsZWZ0IDwgbjsgbGVmdCArPSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGxvb2sgYXQgYWxsIHJlYWNoYWJsZSAocm9vdCArIDEpIGJpdCBub2RlcywgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgIHJlc3VsdGluZyBjb2RlcyAoY29tcGxldGUgYXQgcm9vdCArIDIgb3IgbW9yZSkgKi8KKyAgICAgICAgICAgICAgICBpbmRleCA9IElOREVYKG4sIGxlZnQsIHJvb3QgKyAxKTsKKyAgICAgICAgICAgICAgICBpZiAocm9vdCArIDEgPCBtYXggJiYgbnVtW2luZGV4XSkgICAgICAgLyogcmVhY2hhYmxlIG5vZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgZXhhbWluZShuLCByb290ICsgMSwgbGVmdCwgMSA8PCByb290LCAwKTsKKworICAgICAgICAgICAgICAgIC8qIGFsc28gbG9vayBhdCByb290IGJpdCBjb2RlcyB3aXRoIGNvbXBsZXRpb25zIGF0IHJvb3QgKyAxCisgICAgICAgICAgICAgICAgICAgYml0cyAobm90IHNhdmVkIGluIG51bSwgc2luY2UgY29tcGxldGUpLCBqdXN0IGluIGNhc2UgKi8KKyAgICAgICAgICAgICAgICBpZiAobnVtW2luZGV4IC0gMV0gJiYgbiA8PSBsZWZ0IDw8IDEpCisgICAgICAgICAgICAgICAgICAgIGV4YW1pbmUoKG4gLSBsZWZ0KSA8PCAxLCByb290ICsgMSwgKG4gLSBsZWZ0KSA8PCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPDwgcm9vdCwgMCk7CisgICAgICAgICAgICB9CisKKyAgICAvKiBkb25lICovCisgICAgcHJpbnRmKCJkb25lOiBtYXhpbXVtIG9mICVkIHRhYmxlIGVudHJpZXNcbiIsIGxhcmdlKTsKK30KKworLyoKKyAgIEV4YW1pbmUgYW5kIHNob3cgdGhlIHRvdGFsIG51bWJlciBvZiBwb3NzaWJsZSBIdWZmbWFuIGNvZGVzIGZvciBhIGdpdmVuCisgICBtYXhpbXVtIG51bWJlciBvZiBzeW1ib2xzLCBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSwgYW5kIG1heGltdW0gY29kZSBsZW5ndGgKKyAgIGluIGJpdHMgLS0gdGhvc2UgYXJlIHRoZSBjb21tYW5kIGFyZ3VtZW50cyBpbiB0aGF0IG9yZGVyLiAgVGhlIGRlZmF1bHQKKyAgIHZhbHVlcyBhcmUgMjg2LCA5LCBhbmQgMTUgcmVzcGVjdGl2ZWx5LCBmb3IgdGhlIGRlZmxhdGUgbGl0ZXJhbC9sZW5ndGggY29kZS4KKyAgIFRoZSBwb3NzaWJsZSBjb2RlcyBhcmUgY291bnRlZCBmb3IgZWFjaCBudW1iZXIgb2YgY29kZWQgc3ltYm9scyBmcm9tIHR3byB0bworICAgdGhlIG1heGltdW0uICBUaGUgY291bnRzIGZvciBlYWNoIG9mIHRob3NlIGFuZCB0aGUgdG90YWwgbnVtYmVyIG9mIGNvZGVzIGFyZQorICAgc2hvd24uICBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW5mbGF0ZSB0YWJsZSBlbnRpcmVzIGlzIHRoZW4gY2FsY3VsYXRlZAorICAgYWNyb3NzIGFsbCBwb3NzaWJsZSBjb2Rlcy4gIEVhY2ggbmV3IG1heGltdW0gbnVtYmVyIG9mIHRhYmxlIGVudHJpZXMgYW5kIHRoZQorICAgYXNzb2NpYXRlZCBzdWItY29kZSAoc3RhcnRpbmcgYXQgcm9vdCArIDEgPT0gMTAgYml0cykgaXMgc2hvd24uCisKKyAgIFRvIGNvdW50IGFuZCBleGFtaW5lIEh1ZmZtYW4gY29kZXMgdGhhdCBhcmUgbm90IGxlbmd0aC1saW1pdGVkLCBwcm92aWRlIGEKKyAgIG1heGltdW0gbGVuZ3RoIGVxdWFsIHRvIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBtaW51cyBvbmUuCisKKyAgIEZvciB0aGUgZGVmbGF0ZSBsaXRlcmFsL2xlbmd0aCBjb2RlLCB1c2UgImVub3VnaCIuICBGb3IgdGhlIGRlZmxhdGUgZGlzdGFuY2UKKyAgIGNvZGUsIHVzZSAiZW5vdWdoIDMwIDYiLgorCisgICBUaGlzIHVzZXMgdGhlICVsbHUgcHJpbnRmIGZvcm1hdCB0byBwcmludCBiaWdfdCBudW1iZXJzLCB3aGljaCBhc3N1bWVzIHRoYXQKKyAgIGJpZ190IGlzIGFuIHVuc2lnbmVkIGxvbmcgbG9uZy4gIElmIHRoZSBiaWdfdCB0eXBlIGlzIGNoYW5nZWQgKGZvciBleGFtcGxlCisgICB0byBhIG11bHRpcGxlIHByZWNpc2lvbiB0eXBlKSwgdGhlIG1ldGhvZCBvZiBwcmludGluZyB3aWxsIGFsc28gbmVlZCB0byBiZQorICAgdXBkYXRlZC4KKyAqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGludCBzeW1zOyAgICAgICAgICAgLyogdG90YWwgbnVtYmVyIG9mIHN5bWJvbHMgdG8gY29kZSAqLworICAgIGludCBuOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN5bWJvbHMgdG8gY29kZSBmb3IgdGhpcyBydW4gKi8KKyAgICBiaWdfdCBnb3Q7ICAgICAgICAgIC8qIHJldHVybiB2YWx1ZSBvZiBjb3VudCgpICovCisgICAgYmlnX3Qgc3VtOyAgICAgICAgICAvKiBhY2N1bXVsYXRlZCBudW1iZXIgb2YgY29kZXMgb3ZlciBuICovCisgICAgY29kZV90IHdvcmQ7ICAgICAgICAvKiBmb3IgY291bnRpbmcgYml0cyBpbiBjb2RlX3QgKi8KKworICAgIC8qIHNldCB1cCBnbG9iYWxzIGZvciBjbGVhbnVwKCkgKi8KKyAgICBjb2RlID0gTlVMTDsKKyAgICBudW0gPSBOVUxMOworICAgIGRvbmUgPSBOVUxMOworCisgICAgLyogZ2V0IGFyZ3VtZW50cyAtLSBkZWZhdWx0IHRvIHRoZSBkZWZsYXRlIGxpdGVyYWwvbGVuZ3RoIGNvZGUgKi8KKyAgICBzeW1zID0gMjg2OworICAgIHJvb3QgPSA5OworICAgIG1heCA9IDE1OworICAgIGlmIChhcmdjID4gMSkgeworICAgICAgICBzeW1zID0gYXRvaShhcmd2WzFdKTsKKyAgICAgICAgaWYgKGFyZ2MgPiAyKSB7CisgICAgICAgICAgICByb290ID0gYXRvaShhcmd2WzJdKTsKKyAgICAgICAgICAgIGlmIChhcmdjID4gMykKKyAgICAgICAgICAgICAgICBtYXggPSBhdG9pKGFyZ3ZbM10pOworICAgICAgICB9CisgICAgfQorICAgIGlmIChhcmdjID4gNCB8fCBzeW1zIDwgMiB8fCByb290IDwgMSB8fCBtYXggPCAxKSB7CisgICAgICAgIGZwdXRzKCJpbnZhbGlkIGFyZ3VtZW50cywgbmVlZDogW3N5bSA+PSAyIFtyb290ID49IDEgW21heCA+PSAxXV1dXG4iLAorICAgICAgICAgICAgICBzdGRlcnIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBpZiBub3QgcmVzdHJpY3RpbmcgdGhlIGNvZGUgbGVuZ3RoLCB0aGUgbG9uZ2VzdCBpcyBzeW1zIC0gMSAqLworICAgIGlmIChtYXggPiBzeW1zIC0gMSkKKyAgICAgICAgbWF4ID0gc3ltcyAtIDE7CisKKyAgICAvKiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBiaXRzIGluIGEgY29kZV90ICovCisgICAgZm9yIChuID0gMCwgd29yZCA9IDE7IHdvcmQ7IG4rKywgd29yZCA8PD0gMSkKKyAgICAgICAgOworCisgICAgLyogbWFrZSBzdXJlIHRoYXQgdGhlIGNhbGN1bGF0aW9uIG9mIG1vc3Qgd2lsbCBub3Qgb3ZlcmZsb3cgKi8KKyAgICBpZiAobWF4ID4gbiB8fCAoY29kZV90KShzeW1zIC0gMikgPj0gKCgoY29kZV90KTAgLSAxKSA+PiAobWF4IC0gMSkpKSB7CisgICAgICAgIGZwdXRzKCJhYm9ydDogY29kZSBsZW5ndGggdG9vIGxvbmcgZm9yIGludGVybmFsIHR5cGVzXG4iLCBzdGRlcnIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiByZWplY3QgaW1wb3NzaWJsZSBjb2RlIHJlcXVlc3RzICovCisgICAgaWYgKChjb2RlX3QpKHN5bXMgLSAxKSA+ICgoY29kZV90KTEgPDwgbWF4KSAtIDEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlZCBzeW1ib2xzIGNhbm5vdCBiZSBjb2RlZCBpbiAlZCBiaXRzXG4iLAorICAgICAgICAgICAgICAgIHN5bXMsIG1heCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8qIGFsbG9jYXRlIGNvZGUgdmVjdG9yICovCisgICAgY29kZSA9IGNhbGxvYyhtYXggKyAxLCBzaXplb2YoaW50KSk7CisgICAgaWYgKGNvZGUgPT0gTlVMTCkgeworICAgICAgICBmcHV0cygiYWJvcnQ6IHVuYWJsZSB0byBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5XG4iLCBzdGRlcnIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBkZXRlcm1pbmUgc2l6ZSBvZiBzYXZlZCByZXN1bHRzIGFycmF5LCBjaGVja2luZyBmb3Igb3ZlcmZsb3dzLAorICAgICAgIGFsbG9jYXRlIGFuZCBjbGVhciB0aGUgYXJyYXkgKHNldCBhbGwgdG8gemVybyB3aXRoIGNhbGxvYygpKSAqLworICAgIGlmIChzeW1zID09IDIpICAgICAgICAgICAgICAvKiBpZmYgbWF4ID09IDEgKi8KKyAgICAgICAgbnVtID0gTlVMTDsgICAgICAgICAgICAgLyogd29uJ3QgYmUgc2F2aW5nIGFueSByZXN1bHRzICovCisgICAgZWxzZSB7CisgICAgICAgIHNpemUgPSBzeW1zID4+IDE7CisgICAgICAgIGlmIChzaXplID4gKChzaXplX3QpMCAtIDEpIC8gKG4gPSAoc3ltcyAtIDEpID4+IDEpIHx8CisgICAgICAgICAgICAgICAgKHNpemUgKj0gbiwgc2l6ZSA+ICgoc2l6ZV90KTAgLSAxKSAvIChuID0gbWF4IC0gMSkpIHx8CisgICAgICAgICAgICAgICAgKHNpemUgKj0gbiwgc2l6ZSA+ICgoc2l6ZV90KTAgLSAxKSAvIHNpemVvZihiaWdfdCkpIHx8CisgICAgICAgICAgICAgICAgKG51bSA9IGNhbGxvYyhzaXplLCBzaXplb2YoYmlnX3QpKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgZnB1dHMoImFib3J0OiB1bmFibGUgdG8gYWxsb2NhdGUgZW5vdWdoIG1lbW9yeVxuIiwgc3RkZXJyKTsKKyAgICAgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY291bnQgcG9zc2libGUgY29kZXMgZm9yIGFsbCBudW1iZXJzIG9mIHN5bWJvbHMsIGFkZCB1cCBjb3VudHMgKi8KKyAgICBzdW0gPSAwOworICAgIGZvciAobiA9IDI7IG4gPD0gc3ltczsgbisrKSB7CisgICAgICAgIGdvdCA9IGNvdW50KG4sIDEsIDIpOworICAgICAgICBzdW0gKz0gZ290OworICAgICAgICBpZiAoZ290ID09IChiaWdfdCkwIC0gMSB8fCBzdW0gPCBnb3QpIHsgICAgIC8qIG92ZXJmbG93ICovCisgICAgICAgICAgICBmcHV0cygiYWJvcnQ6IGNhbid0IGNvdW50IHRoYXQgaGlnaCFcbiIsIHN0ZGVycik7CisgICAgICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIiVsbHUgJWQtY29kZXNcbiIsIGdvdCwgbik7CisgICAgfQorICAgIHByaW50ZigiJWxsdSB0b3RhbCBjb2RlcyBmb3IgMiB0byAlZCBzeW1ib2xzIiwgc3VtLCBzeW1zKTsKKyAgICBpZiAobWF4IDwgc3ltcyAtIDEpCisgICAgICAgIHByaW50ZigiICglZC1iaXQgbGVuZ3RoIGxpbWl0KVxuIiwgbWF4KTsKKyAgICBlbHNlCisgICAgICAgIHB1dHMoIiAobm8gbGVuZ3RoIGxpbWl0KSIpOworCisgICAgLyogYWxsb2NhdGUgYW5kIGNsZWFyIGRvbmUgYXJyYXkgZm9yIGJlZW5oZXJlKCkgKi8KKyAgICBpZiAoc3ltcyA9PSAyKQorICAgICAgICBkb25lID0gTlVMTDsKKyAgICBlbHNlIGlmIChzaXplID4gKChzaXplX3QpMCAtIDEpIC8gc2l6ZW9mKHN0cnVjdCB0YWIpIHx8CisgICAgICAgICAgICAgKGRvbmUgPSBjYWxsb2Moc2l6ZSwgc2l6ZW9mKHN0cnVjdCB0YWIpKSkgPT0gTlVMTCkgeworICAgICAgICBmcHV0cygiYWJvcnQ6IHVuYWJsZSB0byBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5XG4iLCBzdGRlcnIpOworICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8qIGZpbmQgYW5kIHNob3cgbWF4aW11bSBpbmZsYXRlIHRhYmxlIHVzYWdlICovCisgICAgaWYgKHJvb3QgPiBtYXgpICAgICAgICAgICAgICAgICAvKiByZWR1Y2Ugcm9vdCB0byBtYXggbGVuZ3RoICovCisgICAgICAgIHJvb3QgPSBtYXg7CisgICAgaWYgKChjb2RlX3Qpc3ltcyA8ICgoY29kZV90KTEgPDwgKHJvb3QgKyAxKSkpCisgICAgICAgIGVub3VnaChzeW1zKTsKKyAgICBlbHNlCisgICAgICAgIHB1dHMoImNhbm5vdCBoYW5kbGUgbWluaW11bSBjb2RlIGxlbmd0aHMgPiByb290Iik7CisKKyAgICAvKiBkb25lICovCisgICAgY2xlYW51cCgpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvZXhhbXBsZXMvZml0YmxrLmMgYi96bGliL3NyYy9leGFtcGxlcy9maXRibGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjFkZTVjCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvZXhhbXBsZXMvZml0YmxrLmMKQEAgLTAsMCArMSwyMzMgQEAKKy8qIGZpdGJsay5jOiBleGFtcGxlIG9mIGZpdHRpbmcgY29tcHJlc3NlZCBvdXRwdXQgdG8gYSBzcGVjaWZpZWQgc2l6ZQorICAgTm90IGNvcHlyaWdodGVkIC0tIHByb3ZpZGVkIHRvIHRoZSBwdWJsaWMgZG9tYWluCisgICBWZXJzaW9uIDEuMSAgMjUgTm92ZW1iZXIgMjAwNCAgTWFyayBBZGxlciAqLworCisvKiBWZXJzaW9uIGhpc3Rvcnk6CisgICAxLjAgIDI0IE5vdiAyMDA0ICBGaXJzdCB2ZXJzaW9uCisgICAxLjEgIDI1IE5vdiAyMDA0ICBDaGFuZ2UgZGVmbGF0ZUluaXQyKCkgdG8gZGVmbGF0ZUluaXQoKQorICAgICAgICAgICAgICAgICAgICAgVXNlIGZpeGVkLXNpemUsIHN0YWNrLWFsbG9jYXRlZCByYXcgYnVmZmVycworICAgICAgICAgICAgICAgICAgICAgU2ltcGxpZnkgY29kZSBtb3ZpbmcgY29tcHJlc3Npb24gdG8gc3Vicm91dGluZXMKKyAgICAgICAgICAgICAgICAgICAgIFVzZSBhc3NlcnQoKSBmb3IgaW50ZXJuYWwgZXJyb3JzCisgICAgICAgICAgICAgICAgICAgICBBZGQgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYXBwcm9hY2gKKyAqLworCisvKiBBcHByb2FjaCB0byBqdXN0IGZpdHRpbmcgYSByZXF1ZXN0ZWQgY29tcHJlc3NlZCBzaXplOgorCisgICBmaXRibGsgcGVyZm9ybXMgdGhyZWUgY29tcHJlc3Npb24gcGFzc2VzIG9uIGEgcG9ydGlvbiBvZiB0aGUgaW5wdXQKKyAgIGRhdGEgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIG9mIHRoYXQgaW5wdXQgd2lsbCBjb21wcmVzcyB0bworICAgbmVhcmx5IHRoZSByZXF1ZXN0ZWQgb3V0cHV0IGJsb2NrIHNpemUuICBUaGUgZmlyc3QgcGFzcyBnZW5lcmF0ZXMKKyAgIGVub3VnaCBkZWZsYXRlIGJsb2NrcyB0byBwcm9kdWNlIG91dHB1dCB0byBmaWxsIHRoZSByZXF1ZXN0ZWQKKyAgIG91dHB1dCBzaXplIHBsdXMgYSBzcGVjZmllZCBleGNlc3MgYW1vdW50IChzZWUgdGhlIEVYQ0VTUyBkZWZpbmUKKyAgIGJlbG93KS4gIFRoZSBsYXN0IGRlZmxhdGUgYmxvY2sgbWF5IGdvIHF1aXRlIGEgYml0IHBhc3QgdGhhdCwgYnV0CisgICBpcyBkaXNjYXJkZWQuICBUaGUgc2Vjb25kIHBhc3MgZGVjb21wcmVzc2VzIGFuZCByZWNvbXByZXNzZXMganVzdAorICAgdGhlIGNvbXByZXNzZWQgZGF0YSB0aGF0IGZpdCBpbiB0aGUgcmVxdWVzdGVkIHBsdXMgZXhjZXNzIHNpemVkCisgICBidWZmZXIuICBUaGUgZGVmbGF0ZSBwcm9jZXNzIGlzIHRlcm1pbmF0ZWQgYWZ0ZXIgdGhhdCBhbW91bnQgb2YKKyAgIGlucHV0LCB3aGljaCBpcyBsZXNzIHRoYW4gdGhlIGFtb3VudCBjb25zdW1lZCBvbiB0aGUgZmlyc3QgcGFzcy4KKyAgIFRoZSBsYXN0IGRlZmxhdGUgYmxvY2sgb2YgdGhlIHJlc3VsdCB3aWxsIGJlIG9mIGEgY29tcGFyYWJsZSBzaXplCisgICB0byB0aGUgZmluYWwgcHJvZHVjdCwgc28gdGhhdCB0aGUgaGVhZGVyIGZvciB0aGF0IGRlZmxhdGUgYmxvY2sgYW5kCisgICB0aGUgY29tcHJlc3Npb24gcmF0aW8gZm9yIHRoYXQgYmxvY2sgd2lsbCBiZSBhYm91dCB0aGUgc2FtZSBhcyBpbgorICAgdGhlIGZpbmFsIHByb2R1Y3QuICBUaGUgdGhpcmQgY29tcHJlc3Npb24gcGFzcyBkZWNvbXByZXNzZXMgdGhlCisgICByZXN1bHQgb2YgdGhlIHNlY29uZCBzdGVwLCBidXQgb25seSB0aGUgY29tcHJlc3NlZCBkYXRhIHVwIHRvIHRoZQorICAgcmVxdWVzdGVkIHNpemUgbWludXMgYW4gYW1vdW50IHRvIGFsbG93IHRoZSBjb21wcmVzc2VkIHN0cmVhbSB0bworICAgY29tcGxldGUgKHNlZSB0aGUgTUFSR0lOIGRlZmluZSBiZWxvdykuICBUaGF0IHdpbGwgcmVzdWx0IGluIGEKKyAgIGZpbmFsIGNvbXByZXNzZWQgc3RyZWFtIHdob3NlIGxlbmd0aCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlCisgICByZXF1ZXN0ZWQgc2l6ZS4gIEFzc3VtaW5nIHN1ZmZpY2llbnQgaW5wdXQgYW5kIGEgcmVxdWVzdGVkIHNpemUKKyAgIGdyZWF0ZXIgdGhhbiBhIGZldyBodW5kcmVkIGJ5dGVzLCB0aGUgc2hvcnRmYWxsIHdpbGwgdHlwaWNhbGx5IGJlCisgICBsZXNzIHRoYW4gdGVuIGJ5dGVzLgorCisgICBJZiB0aGUgaW5wdXQgaXMgc2hvcnQgZW5vdWdoIHRoYXQgdGhlIGZpcnN0IGNvbXByZXNzaW9uIGNvbXBsZXRlcworICAgYmVmb3JlIGZpbGxpbmcgdGhlIHJlcXVlc3RlZCBvdXRwdXQgc2l6ZSwgdGhlbiB0aGF0IGNvbXByZXNzZWQKKyAgIHN0cmVhbSBpcyByZXR1cm4gd2l0aCBubyByZWNvbXByZXNzaW9uLgorCisgICBFWENFU1MgaXMgY2hvc2VuIHRvIGJlIGp1c3QgZ3JlYXRlciB0aGFuIHRoZSBzaG9ydGZhbGwgc2VlbiBpbiBhCisgICB0d28gcGFzcyBhcHByb2FjaCBzaW1pbGFyIHRvIHRoZSBhYm92ZS4gIFRoYXQgc2hvcnRmYWxsIGlzIGR1ZSB0bworICAgdGhlIGxhc3QgZGVmbGF0ZSBibG9jayBjb21wcmVzc2luZyBtb3JlIGVmZmljaWVudGx5IHdpdGggYSBzbWFsbGVyCisgICBoZWFkZXIgb24gdGhlIHNlY29uZCBwYXNzLiAgRVhDRVNTIGlzIHNldCB0byBiZSBsYXJnZSBlbm91Z2ggc28KKyAgIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHVuY29tcHJlc3NlZCBkYXRhIGZvciB0aGUgc2Vjb25kIHBhc3MgdG8gZmlsbAorICAgb3V0IHRoZSByZXF1ZXN0ZWQgc2l6ZSwgYW5kIHNtYWxsIGVub3VnaCBzbyB0aGF0IHRoZSBmaW5hbCBkZWZsYXRlCisgICBibG9jayBvZiB0aGUgc2Vjb25kIHBhc3Mgd2lsbCBiZSBjbG9zZSBpbiBzaXplIHRvIHRoZSBmaW5hbCBkZWZsYXRlCisgICBibG9jayBvZiB0aGUgdGhpcmQgYW5kIGZpbmFsIHBhc3MuICBNQVJHSU4gaXMgY2hvc2VuIHRvIGJlIGp1c3QKKyAgIGxhcmdlIGVub3VnaCB0byBhc3N1cmUgdGhhdCB0aGUgZmluYWwgY29tcHJlc3Npb24gaGFzIGVub3VnaCByb29tCisgICB0byBjb21wbGV0ZSBpbiBhbGwgY2FzZXMuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAiemxpYi5oIgorCisjZGVmaW5lIGxvY2FsIHN0YXRpYworCisvKiBwcmludCBuYXN0eWdyYW0gYW5kIGxlYXZlICovCitsb2NhbCB2b2lkIHF1aXQoY2hhciAqd2h5KQoreworICAgIGZwcmludGYoc3RkZXJyLCAiZml0YmxrIGFib3J0OiAlc1xuIiwgd2h5KTsKKyAgICBleGl0KDEpOworfQorCisjZGVmaW5lIFJBV0xFTiA0MDk2ICAgIC8qIGludGVybWVkaWF0ZSB1bmNvbXByZXNzZWQgYnVmZmVyIHNpemUgKi8KKworLyogY29tcHJlc3MgZnJvbSBmaWxlIHRvIGRlZiB1bnRpbCBwcm92aWRlZCBidWZmZXIgaXMgZnVsbCBvciBlbmQgb2YKKyAgIGlucHV0IHJlYWNoZWQ7IHJldHVybiBsYXN0IGRlZmxhdGUoKSByZXR1cm4gdmFsdWUsIG9yIFpfRVJSTk8gaWYKKyAgIHRoZXJlIHdhcyByZWFkIGVycm9yIG9uIHRoZSBmaWxlICovCitsb2NhbCBpbnQgcGFydGNvbXByZXNzKEZJTEUgKmluLCB6X3N0cmVhbXAgZGVmKQoreworICAgIGludCByZXQsIGZsdXNoOworICAgIHVuc2lnbmVkIGNoYXIgcmF3W1JBV0xFTl07CisKKyAgICBmbHVzaCA9IFpfTk9fRkxVU0g7CisgICAgZG8geworICAgICAgICBkZWYtPmF2YWlsX2luID0gZnJlYWQocmF3LCAxLCBSQVdMRU4sIGluKTsKKyAgICAgICAgaWYgKGZlcnJvcihpbikpCisgICAgICAgICAgICByZXR1cm4gWl9FUlJOTzsKKyAgICAgICAgZGVmLT5uZXh0X2luID0gcmF3OworICAgICAgICBpZiAoZmVvZihpbikpCisgICAgICAgICAgICBmbHVzaCA9IFpfRklOSVNIOworICAgICAgICByZXQgPSBkZWZsYXRlKGRlZiwgZmx1c2gpOworICAgICAgICBhc3NlcnQocmV0ICE9IFpfU1RSRUFNX0VSUk9SKTsKKyAgICB9IHdoaWxlIChkZWYtPmF2YWlsX291dCAhPSAwICYmIGZsdXNoID09IFpfTk9fRkxVU0gpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIHJlY29tcHJlc3MgZnJvbSBpbmYncyBpbnB1dCB0byBkZWYncyBvdXRwdXQ7IHRoZSBpbnB1dCBmb3IgaW5mIGFuZAorICAgdGhlIG91dHB1dCBmb3IgZGVmIGFyZSBzZXQgaW4gdGhvc2Ugc3RydWN0dXJlcyBiZWZvcmUgY2FsbGluZzsKKyAgIHJldHVybiBsYXN0IGRlZmxhdGUoKSByZXR1cm4gdmFsdWUsIG9yIFpfTUVNX0VSUk9SIGlmIGluZmxhdGUoKQorICAgd2FzIG5vdCBhYmxlIHRvIGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgd2hlbiBpdCBuZWVkZWQgdG8gKi8KK2xvY2FsIGludCByZWNvbXByZXNzKHpfc3RyZWFtcCBpbmYsIHpfc3RyZWFtcCBkZWYpCit7CisgICAgaW50IHJldCwgZmx1c2g7CisgICAgdW5zaWduZWQgY2hhciByYXdbUkFXTEVOXTsKKworICAgIGZsdXNoID0gWl9OT19GTFVTSDsKKyAgICBkbyB7CisgICAgICAgIC8qIGRlY29tcHJlc3MgKi8KKyAgICAgICAgaW5mLT5hdmFpbF9vdXQgPSBSQVdMRU47CisgICAgICAgIGluZi0+bmV4dF9vdXQgPSByYXc7CisgICAgICAgIHJldCA9IGluZmxhdGUoaW5mLCBaX05PX0ZMVVNIKTsKKyAgICAgICAgYXNzZXJ0KHJldCAhPSBaX1NUUkVBTV9FUlJPUiAmJiByZXQgIT0gWl9EQVRBX0VSUk9SICYmCisgICAgICAgICAgICAgICByZXQgIT0gWl9ORUVEX0RJQ1QpOworICAgICAgICBpZiAocmV0ID09IFpfTUVNX0VSUk9SKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAvKiBjb21wcmVzcyB3aGF0IHdhcyBkZWNvbXByZXNlZCB1bnRpbCBkb25lIG9yIG5vIHJvb20gKi8KKyAgICAgICAgZGVmLT5hdmFpbF9pbiA9IFJBV0xFTiAtIGluZi0+YXZhaWxfb3V0OworICAgICAgICBkZWYtPm5leHRfaW4gPSByYXc7CisgICAgICAgIGlmIChpbmYtPmF2YWlsX291dCAhPSAwKQorICAgICAgICAgICAgZmx1c2ggPSBaX0ZJTklTSDsKKyAgICAgICAgcmV0ID0gZGVmbGF0ZShkZWYsIGZsdXNoKTsKKyAgICAgICAgYXNzZXJ0KHJldCAhPSBaX1NUUkVBTV9FUlJPUik7CisgICAgfSB3aGlsZSAocmV0ICE9IFpfU1RSRUFNX0VORCAmJiBkZWYtPmF2YWlsX291dCAhPSAwKTsKKyAgICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIEVYQ0VTUyAyNTYgICAgICAvKiBlbXBpcmljYWxseSBkZXRlcm1pbmVkIHN0cmVhbSBvdmVyYWdlICovCisjZGVmaW5lIE1BUkdJTiA4ICAgICAgICAvKiBhbW91bnQgdG8gYmFjayBvZmYgZm9yIGNvbXBsZXRpb24gKi8KKworLyogY29tcHJlc3MgZnJvbSBzdGRpbiB0byBmaXhlZC1zaXplIGJsb2NrIG9uIHN0ZG91dCAqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGludCByZXQ7ICAgICAgICAgICAgICAgIC8qIHJldHVybiBjb2RlICovCisgICAgdW5zaWduZWQgc2l6ZTsgICAgICAgICAgLyogcmVxdWVzdGVkIGZpeGVkIG91dHB1dCBibG9jayBzaXplICovCisgICAgdW5zaWduZWQgaGF2ZTsgICAgICAgICAgLyogYnl0ZXMgd3JpdHRlbiBieSBkZWZsYXRlKCkgY2FsbCAqLworICAgIHVuc2lnbmVkIGNoYXIgKmJsazsgICAgIC8qIGludGVybWVkaWF0ZSBhbmQgZmluYWwgc3RyZWFtICovCisgICAgdW5zaWduZWQgY2hhciAqdG1wOyAgICAgLyogY2xvc2UgdG8gZGVzaXJlZCBzaXplIHN0cmVhbSAqLworICAgIHpfc3RyZWFtIGRlZiwgaW5mOyAgICAgIC8qIHpsaWIgZGVmbGF0ZSBhbmQgaW5mbGF0ZSBzdGF0ZXMgKi8KKworICAgIC8qIGdldCByZXF1ZXN0ZWQgb3V0cHV0IHNpemUgKi8KKyAgICBpZiAoYXJnYyAhPSAyKQorICAgICAgICBxdWl0KCJuZWVkIG9uZSBhcmd1bWVudDogc2l6ZSBvZiBvdXRwdXQgYmxvY2siKTsKKyAgICByZXQgPSBzdHJ0b2woYXJndlsxXSwgYXJndiArIDEsIDEwKTsKKyAgICBpZiAoYXJndlsxXVswXSAhPSAwKQorICAgICAgICBxdWl0KCJhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7CisgICAgaWYgKHJldCA8IDgpICAgICAgICAgICAgLyogOCBpcyBtaW5pbXVtIHpsaWIgc3RyZWFtIHNpemUgKi8KKyAgICAgICAgcXVpdCgibmVlZCBwb3NpdGl2ZSBzaXplIG9mIDggb3IgZ3JlYXRlciIpOworICAgIHNpemUgPSAodW5zaWduZWQpcmV0OworCisgICAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciBidWZmZXJzIGFuZCBjb21wcmVzc2lvbiBlbmdpbmUgKi8KKyAgICBibGsgPSBtYWxsb2Moc2l6ZSArIEVYQ0VTUyk7CisgICAgZGVmLnphbGxvYyA9IFpfTlVMTDsKKyAgICBkZWYuemZyZWUgPSBaX05VTEw7CisgICAgZGVmLm9wYXF1ZSA9IFpfTlVMTDsKKyAgICByZXQgPSBkZWZsYXRlSW5pdCgmZGVmLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04pOworICAgIGlmIChyZXQgIT0gWl9PSyB8fCBibGsgPT0gTlVMTCkKKyAgICAgICAgcXVpdCgib3V0IG9mIG1lbW9yeSIpOworCisgICAgLyogY29tcHJlc3MgZnJvbSBzdGRpbiB1bnRpbCBvdXRwdXQgZnVsbCwgb3Igbm8gbW9yZSBpbnB1dCAqLworICAgIGRlZi5hdmFpbF9vdXQgPSBzaXplICsgRVhDRVNTOworICAgIGRlZi5uZXh0X291dCA9IGJsazsKKyAgICByZXQgPSBwYXJ0Y29tcHJlc3Moc3RkaW4sICZkZWYpOworICAgIGlmIChyZXQgPT0gWl9FUlJOTykKKyAgICAgICAgcXVpdCgiZXJyb3IgcmVhZGluZyBpbnB1dCIpOworCisgICAgLyogaWYgaXQgYWxsIGZpdCwgdGhlbiBzaXplIHdhcyB1bmRlcnN1YnNjcmliZWQgLS0gZG9uZSEgKi8KKyAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCAmJiBkZWYuYXZhaWxfb3V0ID49IEVYQ0VTUykgeworICAgICAgICAvKiB3cml0ZSBibG9jayB0byBzdGRvdXQgKi8KKyAgICAgICAgaGF2ZSA9IHNpemUgKyBFWENFU1MgLSBkZWYuYXZhaWxfb3V0OworICAgICAgICBpZiAoZndyaXRlKGJsaywgMSwgaGF2ZSwgc3Rkb3V0KSAhPSBoYXZlIHx8IGZlcnJvcihzdGRvdXQpKQorICAgICAgICAgICAgcXVpdCgiZXJyb3Igd3JpdGluZyBvdXRwdXQiKTsKKworICAgICAgICAvKiBjbGVhbiB1cCBhbmQgcHJpbnQgcmVzdWx0cyB0byBzdGRlcnIgKi8KKyAgICAgICAgcmV0ID0gZGVmbGF0ZUVuZCgmZGVmKTsKKyAgICAgICAgYXNzZXJ0KHJldCAhPSBaX1NUUkVBTV9FUlJPUik7CisgICAgICAgIGZyZWUoYmxrKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgIiV1IGJ5dGVzIHVudXNlZCBvdXQgb2YgJXUgcmVxdWVzdGVkIChhbGwgaW5wdXQpXG4iLAorICAgICAgICAgICAgICAgIHNpemUgLSBoYXZlLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogaXQgZGlkbid0IGFsbCBmaXQgLS0gc2V0IHVwIGZvciByZWNvbXByZXNzaW9uICovCisgICAgaW5mLnphbGxvYyA9IFpfTlVMTDsKKyAgICBpbmYuemZyZWUgPSBaX05VTEw7CisgICAgaW5mLm9wYXF1ZSA9IFpfTlVMTDsKKyAgICBpbmYuYXZhaWxfaW4gPSAwOworICAgIGluZi5uZXh0X2luID0gWl9OVUxMOworICAgIHJldCA9IGluZmxhdGVJbml0KCZpbmYpOworICAgIHRtcCA9IG1hbGxvYyhzaXplICsgRVhDRVNTKTsKKyAgICBpZiAocmV0ICE9IFpfT0sgfHwgdG1wID09IE5VTEwpCisgICAgICAgIHF1aXQoIm91dCBvZiBtZW1vcnkiKTsKKyAgICByZXQgPSBkZWZsYXRlUmVzZXQoJmRlZik7CisgICAgYXNzZXJ0KHJldCAhPSBaX1NUUkVBTV9FUlJPUik7CisKKyAgICAvKiBkbyBmaXJzdCByZWNvbXByZXNzaW9uIGNsb3NlIHRvIHRoZSByaWdodCBhbW91bnQgKi8KKyAgICBpbmYuYXZhaWxfaW4gPSBzaXplICsgRVhDRVNTOworICAgIGluZi5uZXh0X2luID0gYmxrOworICAgIGRlZi5hdmFpbF9vdXQgPSBzaXplICsgRVhDRVNTOworICAgIGRlZi5uZXh0X291dCA9IHRtcDsKKyAgICByZXQgPSByZWNvbXByZXNzKCZpbmYsICZkZWYpOworICAgIGlmIChyZXQgPT0gWl9NRU1fRVJST1IpCisgICAgICAgIHF1aXQoIm91dCBvZiBtZW1vcnkiKTsKKworICAgIC8qIHNldCB1cCBmb3IgbmV4dCByZW9jbXByZXNzaW9uICovCisgICAgcmV0ID0gaW5mbGF0ZVJlc2V0KCZpbmYpOworICAgIGFzc2VydChyZXQgIT0gWl9TVFJFQU1fRVJST1IpOworICAgIHJldCA9IGRlZmxhdGVSZXNldCgmZGVmKTsKKyAgICBhc3NlcnQocmV0ICE9IFpfU1RSRUFNX0VSUk9SKTsKKworICAgIC8qIGRvIHNlY29uZCBhbmQgZmluYWwgcmVjb21wcmVzc2lvbiAodGhpcmQgY29tcHJlc3Npb24pICovCisgICAgaW5mLmF2YWlsX2luID0gc2l6ZSAtIE1BUkdJTjsgICAvKiBhc3N1cmUgc3RyZWFtIHdpbGwgY29tcGxldGUgKi8KKyAgICBpbmYubmV4dF9pbiA9IHRtcDsKKyAgICBkZWYuYXZhaWxfb3V0ID0gc2l6ZTsKKyAgICBkZWYubmV4dF9vdXQgPSBibGs7CisgICAgcmV0ID0gcmVjb21wcmVzcygmaW5mLCAmZGVmKTsKKyAgICBpZiAocmV0ID09IFpfTUVNX0VSUk9SKQorICAgICAgICBxdWl0KCJvdXQgb2YgbWVtb3J5Iik7CisgICAgYXNzZXJ0KHJldCA9PSBaX1NUUkVBTV9FTkQpOyAgICAvKiBvdGhlcndpc2UgTUFSR0lOIHRvbyBzbWFsbCAqLworCisgICAgLyogZG9uZSAtLSB3cml0ZSBibG9jayB0byBzdGRvdXQgKi8KKyAgICBoYXZlID0gc2l6ZSAtIGRlZi5hdmFpbF9vdXQ7CisgICAgaWYgKGZ3cml0ZShibGssIDEsIGhhdmUsIHN0ZG91dCkgIT0gaGF2ZSB8fCBmZXJyb3Ioc3Rkb3V0KSkKKyAgICAgICAgcXVpdCgiZXJyb3Igd3JpdGluZyBvdXRwdXQiKTsKKworICAgIC8qIGNsZWFuIHVwIGFuZCBwcmludCByZXN1bHRzIHRvIHN0ZGVyciAqLworICAgIGZyZWUodG1wKTsKKyAgICByZXQgPSBpbmZsYXRlRW5kKCZpbmYpOworICAgIGFzc2VydChyZXQgIT0gWl9TVFJFQU1fRVJST1IpOworICAgIHJldCA9IGRlZmxhdGVFbmQoJmRlZik7CisgICAgYXNzZXJ0KHJldCAhPSBaX1NUUkVBTV9FUlJPUik7CisgICAgZnJlZShibGspOworICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIiV1IGJ5dGVzIHVudXNlZCBvdXQgb2YgJXUgcmVxdWVzdGVkICglbHUgaW5wdXQpXG4iLAorICAgICAgICAgICAgc2l6ZSAtIGhhdmUsIHNpemUsIGRlZi50b3RhbF9pbik7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS96bGliL3NyYy9leGFtcGxlcy9ndW4uYyBiL3psaWIvc3JjL2V4YW1wbGVzL2d1bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZTQ4NGYKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9leGFtcGxlcy9ndW4uYwpAQCAtMCwwICsxLDcwMiBAQAorLyogZ3VuLmMgLS0gc2ltcGxlIGd1bnppcCB0byBnaXZlIGFuIGV4YW1wbGUgb2YgdGhlIHVzZSBvZiBpbmZsYXRlQmFjaygpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUsIDIwMDgsIDIwMTAsIDIwMTIgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICAgVmVyc2lvbiAxLjcgIDEyIEF1Z3VzdCAyMDEyICBNYXJrIEFkbGVyICovCisKKy8qIFZlcnNpb24gaGlzdG9yeToKKyAgIDEuMCAgMTYgRmViIDIwMDMgIEZpcnN0IHZlcnNpb24gZm9yIHRlc3Rpbmcgb2YgaW5mbGF0ZUJhY2soKQorICAgMS4xICAyMSBGZWIgMjAwNSAgRGVjb21wcmVzcyBjb25jYXRlbmF0ZWQgZ3ppcCBzdHJlYW1zCisgICAgICAgICAgICAgICAgICAgICBSZW1vdmUgdXNlIG9mICJ0aGlzIiB2YXJpYWJsZSAoQysrIGtleXdvcmQpCisgICAgICAgICAgICAgICAgICAgICBGaXggcmV0dXJuIHZhbHVlIGZvciBpbigpCisgICAgICAgICAgICAgICAgICAgICBJbXByb3ZlIGFsbG9jYXRpb24gZmFpbHVyZSBjaGVja2luZworICAgICAgICAgICAgICAgICAgICAgQWRkIHR5cGVjYXN0aW5nIGZvciB2b2lkICogc3RydWN0dXJlcworICAgICAgICAgICAgICAgICAgICAgQWRkIC1oIG9wdGlvbiBmb3IgY29tbWFuZCB2ZXJzaW9uIGFuZCB1c2FnZQorICAgICAgICAgICAgICAgICAgICAgQWRkIGEgYnVuY2ggb2YgY29tbWVudHMKKyAgIDEuMiAgMjAgTWFyIDIwMDUgIEFkZCBVbml4IGNvbXByZXNzIChMWlcpIGRlY29tcHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgIENvcHkgZmlsZSBhdHRyaWJ1dGVzIGZyb20gaW5wdXQgZmlsZSB0byBvdXRwdXQgZmlsZQorICAgMS4zICAxMiBKdW4gMjAwNSAgQWRkIGNhc3RzIGZvciBlcnJvciBtZXNzYWdlcyBbT2Jlcmh1bWVyXQorICAgMS40ICAgOCBEZWMgMjAwNiAgTFpXIGRlY29tcHJlc3Npb24gc3BlZWQgaW1wcm92ZW1lbnRzCisgICAxLjUgICA5IEZlYiAyMDA4ICBBdm9pZCB3YXJuaW5nIGluIGxhdGVzdCB2ZXJzaW9uIG9mIGdjYworICAgMS42ICAxNyBKYW4gMjAxMCAgQXZvaWQgc2lnbmVkL3Vuc2lnbmVkIGNvbXBhcmlzb24gd2FybmluZ3MKKyAgIDEuNyAgMTIgQXVnIDIwMTIgIFVwZGF0ZSBmb3Igel9jb25zdCB1c2FnZSBpbiB6bGliIDEuMi44CisgKi8KKworLyoKKyAgIGd1biBbIC10IF0gWyBuYW1lIC4uLiBdCisKKyAgIGRlY29tcHJlc3NlcyB0aGUgZGF0YSBpbiB0aGUgbmFtZWQgZ3ppcCBmaWxlcy4gIElmIG5vIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sCisgICBndW4gd2lsbCBkZWNvbXByZXNzIGZyb20gc3RkaW4gdG8gc3Rkb3V0LiAgVGhlIG5hbWVzIG11c3QgZW5kIGluIC5neiwgLWd6LAorICAgLnosIC16LCBfeiwgb3IgLlouICBUaGUgdW5jb21wcmVzc2VkIGRhdGEgd2lsbCBiZSB3cml0dGVuIHRvIGEgZmlsZSBuYW1lCisgICB3aXRoIHRoZSBzdWZmaXggc3RyaXBwZWQuICBPbiBzdWNjZXNzLCB0aGUgb3JpZ2luYWwgZmlsZSBpcyBkZWxldGVkLiAgT24KKyAgIGZhaWx1cmUsIHRoZSBvdXRwdXQgZmlsZSBpcyBkZWxldGVkLiAgRm9yIG1vc3QgZmFpbHVyZXMsIHRoZSBjb21tYW5kIHdpbGwKKyAgIGNvbnRpbnVlIHRvIHByb2Nlc3MgdGhlIHJlbWFpbmluZyBuYW1lcyBvbiB0aGUgY29tbWFuZCBsaW5lLiAgQSBtZW1vcnkKKyAgIGFsbG9jYXRpb24gZmFpbHVyZSB3aWxsIGFib3J0IHRoZSBjb21tYW5kLiAgSWYgLXQgaXMgc3BlY2lmaWVkLCB0aGVuIHRoZQorICAgbGlzdGVkIGZpbGVzIG9yIHN0ZGluIHdpbGwgYmUgdGVzdGVkIGFzIGd6aXAgZmlsZXMgZm9yIGludGVncml0eSAod2l0aG91dAorICAgY2hlY2tpbmcgZm9yIGEgcHJvcGVyIHN1ZmZpeCksIG5vIG91dHB1dCB3aWxsIGJlIHdyaXR0ZW4sIGFuZCBubyBmaWxlcworICAgd2lsbCBiZSBkZWxldGVkLgorCisgICBMaWtlIGd6aXAsIGd1biBhbGxvd3MgY29uY2F0ZW5hdGVkIGd6aXAgc3RyZWFtcyBhbmQgd2lsbCBkZWNvbXByZXNzIHRoZW0sCisgICB3cml0aW5nIGFsbCBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgdG8gdGhlIG91dHB1dC4gIFVubGlrZSBnemlwLCBndW4gYWxsb3dzCisgICBhbiBlbXB0eSBmaWxlIG9uIGlucHV0LCBhbmQgd2lsbCBwcm9kdWNlIG5vIGVycm9yIHdyaXRpbmcgYW4gZW1wdHkgb3V0cHV0CisgICBmaWxlLgorCisgICBndW4gd2lsbCBhbHNvIGRlY29tcHJlc3MgZmlsZXMgbWFkZSBieSBVbml4IGNvbXByZXNzLCB3aGljaCB1c2VzIExaVworICAgY29tcHJlc3Npb24uICBUaGVzZSBmaWxlcyBhcmUgYXV0b21hdGljYWxseSBkZXRlY3RlZCBieSB2aXJ0dWUgb2YgdGhlaXIKKyAgIG1hZ2ljIGhlYWRlciBieXRlcy4gIFNpbmNlIHRoZSBlbmQgb2YgVW5peCBjb21wcmVzcyBzdHJlYW0gaXMgbWFya2VkIGJ5IHRoZQorICAgZW5kLW9mLWZpbGUsIHRoZXkgY2Fubm90IGJlIGNvbmNhbnRlbmF0ZWQuICBJZiBhIFVuaXggY29tcHJlc3Mgc3RyZWFtIGlzCisgICBlbmNvdW50ZXJlZCBpbiBhbiBpbnB1dCBmaWxlLCBpdCBpcyB0aGUgbGFzdCBzdHJlYW0gaW4gdGhhdCBmaWxlLgorCisgICBMaWtlIGd1bnppcCBhbmQgdW5jb21wcmVzcywgdGhlIGZpbGUgYXR0cmlidXRlcyBvZiB0aGUgb3JpZ25hbCBjb21wcmVzc2VkCisgICBmaWxlIGFyZSBtYWludGFpbmVkIGluIHRoZSBmaW5hbCB1bmNvbXByZXNzZWQgZmlsZSwgdG8gdGhlIGV4dGVudCB0aGF0IHRoZQorICAgdXNlciBwZXJtaXNzaW9ucyBhbGxvdyBpdC4KKworICAgT24gbXkgTWFjIE9TIFggUG93ZXJQQyBHNCwgZ3VuIGlzIGFsbW9zdCB0d2ljZSBhcyBmYXN0IGFzIGd1bnppcCAodmVyc2lvbgorICAgMS4yLjQpIGlzIG9uIHRoZSBzYW1lIGZpbGUsIHdoZW4gZ3VuIGlzIGxpbmtlZCB3aXRoIHpsaWIgMS4yLjIuICBBbHNvIHRoZQorICAgTFpXIGRlY29tcHJlc3Npb24gcHJvdmlkZWQgYnkgZ3VuIGlzIGFib3V0IHR3aWNlIGFzIGZhc3QgYXMgdGhlIHN0YW5kYXJkCisgICBVbml4IHVuY29tcHJlc3MgY29tbWFuZC4KKyAqLworCisvKiBleHRlcm5hbCBmdW5jdGlvbnMgYW5kIHJlbGF0ZWQgdHlwZXMgYW5kIGNvbnN0YW50cyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+ICAgICAgICAgIC8qIGZwcmludGYoKSAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPiAgICAgICAgIC8qIG1hbGxvYygpLCBmcmVlKCkgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4gICAgICAgICAvKiBzdHJlcnJvcigpLCBzdHJjbXAoKSwgc3RybGVuKCksIG1lbWNweSgpICovCisjaW5jbHVkZSA8ZXJybm8uaD4gICAgICAgICAgLyogZXJybm8gKi8KKyNpbmNsdWRlIDxmY250bC5oPiAgICAgICAgICAvKiBvcGVuKCkgKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4gICAgICAgICAvKiByZWFkKCksIHdyaXRlKCksIGNsb3NlKCksIGNob3duKCksIHVubGluaygpICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4gICAgICAgLyogc3RhdCgpLCBjaG1vZCgpICovCisjaW5jbHVkZSA8dXRpbWUuaD4gICAgICAgICAgLyogdXRpbWUoKSAqLworI2luY2x1ZGUgInpsaWIuaCIgICAgICAgICAgIC8qIGluZmxhdGVCYWNrSW5pdCgpLCBpbmZsYXRlQmFjaygpLCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZmxhdGVCYWNrRW5kKCksIGNyYzMyKCkgKi8KKworLyogZnVuY3Rpb24gZGVjbGFyYXRpb24gKi8KKyNkZWZpbmUgbG9jYWwgc3RhdGljCisKKy8qIGJ1ZmZlciBjb25zdGFudHMgKi8KKyNkZWZpbmUgU0laRSAzMjc2OFUgICAgICAgICAvKiBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlciBzaXplcyAqLworI2RlZmluZSBQSUVDRSAxNjM4NCAgICAgICAgIC8qIGxpbWl0cyBpL28gY2h1bmtzIGZvciAxNi1iaXQgaW50IGNhc2UgKi8KKworLyogc3RydWN0dXJlIGZvciBpbmZiYWNrKCkgdG8gcGFzcyB0byBpbnB1dCBmdW5jdGlvbiBpbigpIC0tIGl0IG1haW50YWlucyB0aGUKKyAgIGlucHV0IGZpbGUgYW5kIGEgYnVmZmVyIG9mIHNpemUgU0laRSAqLworc3RydWN0IGluZCB7CisgICAgaW50IGluZmlsZTsKKyAgICB1bnNpZ25lZCBjaGFyICppbmJ1ZjsKK307CisKKy8qIExvYWQgaW5wdXQgYnVmZmVyLCBhc3N1bWVkIHRvIGJlIGVtcHR5LCBhbmQgcmV0dXJuIGJ5dGVzIGxvYWRlZCBhbmQgYQorICAgcG9pbnRlciB0byB0aGVtLiAgcmVhZCgpIGlzIGNhbGxlZCB1bnRpbCB0aGUgYnVmZmVyIGlzIGZ1bGwsIG9yIHVudGlsIGl0CisgICByZXR1cm5zIGVuZC1vZi1maWxlIG9yIGVycm9yLiAgUmV0dXJuIDAgb24gZXJyb3IuICovCitsb2NhbCB1bnNpZ25lZCBpbih2b2lkICppbl9kZXNjLCB6X2NvbnN0IHVuc2lnbmVkIGNoYXIgKipidWYpCit7CisgICAgaW50IHJldDsKKyAgICB1bnNpZ25lZCBsZW47CisgICAgdW5zaWduZWQgY2hhciAqbmV4dDsKKyAgICBzdHJ1Y3QgaW5kICptZSA9IChzdHJ1Y3QgaW5kICopaW5fZGVzYzsKKworICAgIG5leHQgPSBtZS0+aW5idWY7CisgICAgKmJ1ZiA9IG5leHQ7CisgICAgbGVuID0gMDsKKyAgICBkbyB7CisgICAgICAgIHJldCA9IFBJRUNFOworICAgICAgICBpZiAoKHVuc2lnbmVkKXJldCA+IFNJWkUgLSBsZW4pCisgICAgICAgICAgICByZXQgPSAoaW50KShTSVpFIC0gbGVuKTsKKyAgICAgICAgcmV0ID0gKGludClyZWFkKG1lLT5pbmZpbGUsIG5leHQsIHJldCk7CisgICAgICAgIGlmIChyZXQgPT0gLTEpIHsKKyAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBuZXh0ICs9IHJldDsKKyAgICAgICAgbGVuICs9IHJldDsKKyAgICB9IHdoaWxlIChyZXQgIT0gMCAmJiBsZW4gPCBTSVpFKTsKKyAgICByZXR1cm4gbGVuOworfQorCisvKiBzdHJ1Y3R1cmUgZm9yIGluZmJhY2soKSB0byBwYXNzIHRvIG91dHB1dCBmdW5jdGlvbiBvdXQoKSAtLSBpdCBtYWludGFpbnMgdGhlCisgICBvdXRwdXQgZmlsZSwgYSBydW5uaW5nIENSQy0zMiBjaGVjayBvbiB0aGUgb3V0cHV0IGFuZCB0aGUgdG90YWwgbnVtYmVyIG9mCisgICBieXRlcyBvdXRwdXQsIGJvdGggZm9yIGNoZWNraW5nIGFnYWluc3QgdGhlIGd6aXAgdHJhaWxlci4gIChUaGUgbGVuZ3RoIGluCisgICB0aGUgZ3ppcCB0cmFpbGVyIGlzIHN0b3JlZCBtb2R1bG8gMl4zMiwgc28gaXQncyBvayBpZiBhIGxvbmcgaXMgMzIgYml0cyBhbmQKKyAgIHRoZSBvdXRwdXQgaXMgZ3JlYXRlciB0aGFuIDQgR0IuKSAqLworc3RydWN0IG91dGQgeworICAgIGludCBvdXRmaWxlOworICAgIGludCBjaGVjazsgICAgICAgICAgICAgICAgICAvKiB0cnVlIGlmIGNoZWNraW5nIGNyYyBhbmQgdG90YWwgKi8KKyAgICB1bnNpZ25lZCBsb25nIGNyYzsKKyAgICB1bnNpZ25lZCBsb25nIHRvdGFsOworfTsKKworLyogV3JpdGUgb3V0cHV0IGJ1ZmZlciBhbmQgdXBkYXRlIHRoZSBDUkMtMzIgYW5kIHRvdGFsIGJ5dGVzIHdyaXR0ZW4uICB3cml0ZSgpCisgICBpcyBjYWxsZWQgdW50aWwgYWxsIG9mIHRoZSBvdXRwdXQgaXMgd3JpdHRlbiBvciBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZC4KKyAgIE9uIHN1Y2Nlc3Mgb3V0KCkgcmV0dXJucyAwLiAgRm9yIGEgd3JpdGUgZmFpbHVyZSwgb3V0KCkgcmV0dXJucyAxLiAgSWYgdGhlCisgICBvdXRwdXQgZmlsZSBkZXNjcmlwdG9yIGlzIC0xLCB0aGVuIG5vdGhpbmcgaXMgd3JpdHRlbi4KKyAqLworbG9jYWwgaW50IG91dCh2b2lkICpvdXRfZGVzYywgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsZW4pCit7CisgICAgaW50IHJldDsKKyAgICBzdHJ1Y3Qgb3V0ZCAqbWUgPSAoc3RydWN0IG91dGQgKilvdXRfZGVzYzsKKworICAgIGlmIChtZS0+Y2hlY2spIHsKKyAgICAgICAgbWUtPmNyYyA9IGNyYzMyKG1lLT5jcmMsIGJ1ZiwgbGVuKTsKKyAgICAgICAgbWUtPnRvdGFsICs9IGxlbjsKKyAgICB9CisgICAgaWYgKG1lLT5vdXRmaWxlICE9IC0xKQorICAgICAgICBkbyB7CisgICAgICAgICAgICByZXQgPSBQSUVDRTsKKyAgICAgICAgICAgIGlmICgodW5zaWduZWQpcmV0ID4gbGVuKQorICAgICAgICAgICAgICAgIHJldCA9IChpbnQpbGVuOworICAgICAgICAgICAgcmV0ID0gKGludCl3cml0ZShtZS0+b3V0ZmlsZSwgYnVmLCByZXQpOworICAgICAgICAgICAgaWYgKHJldCA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIGJ1ZiArPSByZXQ7CisgICAgICAgICAgICBsZW4gLT0gcmV0OworICAgICAgICB9IHdoaWxlIChsZW4gIT0gMCk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIG5leHQgaW5wdXQgYnl0ZSBtYWNybyBmb3IgdXNlIGluc2lkZSBsdW5waXBlKCkgYW5kIGd1bnBpcGUoKSAqLworI2RlZmluZSBORVhUKCkgKGhhdmUgPyAwIDogKGhhdmUgPSBpbihpbmRwLCAmbmV4dCkpLCBcCisgICAgICAgICAgICAgICAgbGFzdCA9IGhhdmUgPyAoaGF2ZS0tLCAoaW50KSgqbmV4dCsrKSkgOiAtMSkKKworLyogbWVtb3J5IGZvciBndW5waXBlKCkgYW5kIGx1bnBpcGUoKSAtLQorICAgdGhlIGZpcnN0IDI1NiBlbnRyaWVzIG9mIHByZWZpeFtdIGFuZCBzdWZmaXhbXSBhcmUgbmV2ZXIgdXNlZCwgY291bGQKKyAgIGhhdmUgb2Zmc2V0IHRoZSBpbmRleCwgYnV0IGl0J3MgZmFzdGVyIHRvIHdhc3RlIHRoZSBtZW1vcnkgKi8KK3Vuc2lnbmVkIGNoYXIgaW5idWZbU0laRV07ICAgICAgICAgICAgICAvKiBpbnB1dCBidWZmZXIgKi8KK3Vuc2lnbmVkIGNoYXIgb3V0YnVmW1NJWkVdOyAgICAgICAgICAgICAvKiBvdXRwdXQgYnVmZmVyICovCit1bnNpZ25lZCBzaG9ydCBwcmVmaXhbNjU1MzZdOyAgICAgICAgICAgLyogaW5kZXggdG8gTFpXIHByZWZpeCBzdHJpbmcgKi8KK3Vuc2lnbmVkIGNoYXIgc3VmZml4WzY1NTM2XTsgICAgICAgICAgICAvKiBvbmUtY2hhcmFjdGVyIExaVyBzdWZmaXggKi8KK3Vuc2lnbmVkIGNoYXIgbWF0Y2hbNjUyODAgKyAyXTsgICAgICAgICAvKiBidWZmZXIgZm9yIHJldmVyc2VkIG1hdGNoIG9yIGd6aXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMksgc2xpZGluZyB3aW5kb3cgKi8KKworLyogdGhyb3cgb3V0IHdoYXQncyBsZWZ0IGluIHRoZSBjdXJyZW50IGJpdHMgYnl0ZSBidWZmZXIgKHRoaXMgaXMgYSB2ZXN0aWdpYWwKKyAgIGFzcGVjdCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdCBkZXJpdmVkIGZyb20gYW4gaW1wbGVtZW50YXRpb24gdGhhdAorICAgbWFkZSB1c2Ugb2YgYSBzcGVjaWFsIFZBWCBtYWNoaW5lIGluc3RydWN0aW9uISkgKi8KKyNkZWZpbmUgRkxVU0hDT0RFKCkgXAorICAgIGRvIHsgXAorICAgICAgICBsZWZ0ID0gMDsgXAorICAgICAgICByZW0gPSAwOyBcCisgICAgICAgIGlmIChjaHVuayA+IGhhdmUpIHsgXAorICAgICAgICAgICAgY2h1bmsgLT0gaGF2ZTsgXAorICAgICAgICAgICAgaGF2ZSA9IDA7IFwKKyAgICAgICAgICAgIGlmIChORVhUKCkgPT0gLTEpIFwKKyAgICAgICAgICAgICAgICBicmVhazsgXAorICAgICAgICAgICAgY2h1bmstLTsgXAorICAgICAgICAgICAgaWYgKGNodW5rID4gaGF2ZSkgeyBcCisgICAgICAgICAgICAgICAgY2h1bmsgPSBoYXZlID0gMDsgXAorICAgICAgICAgICAgICAgIGJyZWFrOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgICAgIGhhdmUgLT0gY2h1bms7IFwKKyAgICAgICAgbmV4dCArPSBjaHVuazsgXAorICAgICAgICBjaHVuayA9IDA7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBEZWNvbXByZXNzIGEgY29tcHJlc3MgKExaVykgZmlsZSBmcm9tIGluZHAgdG8gb3V0ZmlsZS4gIFRoZSBjb21wcmVzcyBtYWdpYworICAgaGVhZGVyICh0d28gYnl0ZXMpIGhhcyBhbHJlYWR5IGJlZW4gcmVhZCBhbmQgdmVyaWZpZWQuICBUaGVyZSBhcmUgaGF2ZSBieXRlcworICAgb2YgYnVmZmVyZWQgaW5wdXQgYXQgbmV4dC4gIHN0cm0gaXMgdXNlZCBmb3IgcGFzc2luZyBlcnJvciBpbmZvcm1hdGlvbiBiYWNrCisgICB0byBndW5waXBlKCkuCisKKyAgIGx1bnBpcGUoKSB3aWxsIHJldHVybiBaX09LIG9uIHN1Y2Nlc3MsIFpfQlVGX0VSUk9SIGZvciBhbiB1bmV4cGVjdGVkIGVuZCBvZgorICAgZmlsZSwgcmVhZCBlcnJvciwgb3Igd3JpdGUgZXJyb3IgKGEgd3JpdGUgZXJyb3IgaW5kaWNhdGVkIGJ5IHN0cm0tPm5leHRfaW4KKyAgIG5vdCBlcXVhbCB0byBaX05VTEwpLCBvciBaX0RBVEFfRVJST1IgZm9yIGludmFsaWQgaW5wdXQuCisgKi8KK2xvY2FsIGludCBsdW5waXBlKHVuc2lnbmVkIGhhdmUsIHpfY29uc3QgdW5zaWduZWQgY2hhciAqbmV4dCwgc3RydWN0IGluZCAqaW5kcCwKKyAgICAgICAgICAgICAgICAgIGludCBvdXRmaWxlLCB6X3N0cmVhbSAqc3RybSkKK3sKKyAgICBpbnQgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogbGFzdCBieXRlIHJlYWQgYnkgTkVYVCgpLCBvciAtMSBpZiBFT0YgKi8KKyAgICB1bnNpZ25lZCBjaHVuazsgICAgICAgICAgICAgLyogYnl0ZXMgbGVmdCBpbiBjdXJyZW50IGNodW5rICovCisgICAgaW50IGxlZnQ7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgbGVmdCBpbiByZW0gKi8KKyAgICB1bnNpZ25lZCByZW07ICAgICAgICAgICAgICAgLyogdW51c2VkIGJpdHMgZnJvbSBpbnB1dCAqLworICAgIGludCBiaXRzOyAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IGJpdHMgcGVyIGNvZGUgKi8KKyAgICB1bnNpZ25lZCBjb2RlOyAgICAgICAgICAgICAgLyogY29kZSwgdGFibGUgdHJhdmVyc2FsIGluZGV4ICovCisgICAgdW5zaWduZWQgbWFzazsgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGN1cnJlbnQgYml0cyBjb2RlcyAqLworICAgIGludCBtYXg7ICAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGJpdHMgcGVyIGNvZGUgZm9yIHRoaXMgc3RyZWFtICovCisgICAgdW5zaWduZWQgZmxhZ3M7ICAgICAgICAgICAgIC8qIGNvbXByZXNzIGZsYWdzLCB0aGVuIGJsb2NrIGNvbXByZXNzIGZsYWcgKi8KKyAgICB1bnNpZ25lZCBlbmQ7ICAgICAgICAgICAgICAgLyogbGFzdCB2YWxpZCBlbnRyeSBpbiBwcmVmaXgvc3VmZml4IHRhYmxlcyAqLworICAgIHVuc2lnbmVkIHRlbXA7ICAgICAgICAgICAgICAvKiBjdXJyZW50IGNvZGUgKi8KKyAgICB1bnNpZ25lZCBwcmV2OyAgICAgICAgICAgICAgLyogcHJldmlvdXMgY29kZSAqLworICAgIHVuc2lnbmVkIGZpbmFsOyAgICAgICAgICAgICAvKiBsYXN0IGNoYXJhY3RlciB3cml0dGVuIGZvciBwcmV2aW91cyBjb2RlICovCisgICAgdW5zaWduZWQgc3RhY2s7ICAgICAgICAgICAgIC8qIG5leHQgcG9zaXRpb24gZm9yIHJldmVyc2VkIHN0cmluZyAqLworICAgIHVuc2lnbmVkIG91dGNudDsgICAgICAgICAgICAvKiBieXRlcyBpbiBvdXRwdXQgYnVmZmVyICovCisgICAgc3RydWN0IG91dGQgb3V0ZDsgICAgICAgICAgIC8qIG91dHB1dCBzdHJ1Y3R1cmUgKi8KKyAgICB1bnNpZ25lZCBjaGFyICpwOworCisgICAgLyogc2V0IHVwIG91dHB1dCAqLworICAgIG91dGQub3V0ZmlsZSA9IG91dGZpbGU7CisgICAgb3V0ZC5jaGVjayA9IDA7CisKKyAgICAvKiBwcm9jZXNzIHJlbWFpbmRlciBvZiBjb21wcmVzcyBoZWFkZXIgLS0gYSBmbGFncyBieXRlICovCisgICAgZmxhZ3MgPSBORVhUKCk7CisgICAgaWYgKGxhc3QgPT0gLTEpCisgICAgICAgIHJldHVybiBaX0JVRl9FUlJPUjsKKyAgICBpZiAoZmxhZ3MgJiAweDYwKSB7CisgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInVua25vd24gbHp3IGZsYWdzIHNldCI7CisgICAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7CisgICAgfQorICAgIG1heCA9IGZsYWdzICYgMHgxZjsKKyAgICBpZiAobWF4IDwgOSB8fCBtYXggPiAxNikgeworICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJsencgYml0cyBvdXQgb2YgcmFuZ2UiOworICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOworICAgIH0KKyAgICBpZiAobWF4ID09IDkpICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOSBkb2Vzbid0IHJlYWxseSBtZWFuIDkgKi8KKyAgICAgICAgbWF4ID0gMTA7CisgICAgZmxhZ3MgJj0gMHg4MDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRydWUgaWYgYmxvY2sgY29tcHJlc3MgKi8KKworICAgIC8qIGNsZWFyIHRhYmxlICovCisgICAgYml0cyA9IDk7CisgICAgbWFzayA9IDB4MWZmOworICAgIGVuZCA9IGZsYWdzID8gMjU2IDogMjU1OworCisgICAgLyogc2V0IHVwOiBnZXQgZmlyc3QgOS1iaXQgY29kZSwgd2hpY2ggaXMgdGhlIGZpcnN0IGRlY29tcHJlc3NlZCBieXRlLCBidXQKKyAgICAgICBkb24ndCBjcmVhdGUgYSB0YWJsZSBlbnRyeSB1bnRpbCB0aGUgbmV4dCBjb2RlICovCisgICAgaWYgKE5FWFQoKSA9PSAtMSkgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGNvbXByZXNzZWQgZGF0YSBpcyBvayAqLworICAgICAgICByZXR1cm4gWl9PSzsKKyAgICBmaW5hbCA9IHByZXYgPSAodW5zaWduZWQpbGFzdDsgICAgICAgICAgLyogbG93IDggYml0cyBvZiBjb2RlICovCisgICAgaWYgKE5FWFQoKSA9PSAtMSkgICAgICAgICAgICAgICAgICAgICAgIC8qIG1pc3NpbmcgYSBiaXQgKi8KKyAgICAgICAgcmV0dXJuIFpfQlVGX0VSUk9SOworICAgIGlmIChsYXN0ICYgMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIG11c3QgYmUgPCAyNTYgKi8KKyAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBsencgY29kZSI7CisgICAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7CisgICAgfQorICAgIHJlbSA9ICh1bnNpZ25lZClsYXN0ID4+IDE7ICAgICAgICAgICAgICAvKiByZW1haW5pbmcgNyBiaXRzICovCisgICAgbGVmdCA9IDc7CisgICAgY2h1bmsgPSBiaXRzIC0gMjsgICAgICAgICAgICAgICAgICAgICAgIC8qIDcgYnl0ZXMgbGVmdCBpbiB0aGlzIGNodW5rICovCisgICAgb3V0YnVmWzBdID0gKHVuc2lnbmVkIGNoYXIpZmluYWw7ICAgICAgIC8qIHdyaXRlIGZpcnN0IGRlY29tcHJlc3NlZCBieXRlICovCisgICAgb3V0Y250ID0gMTsKKworICAgIC8qIGRlY29kZSBjb2RlcyAqLworICAgIHN0YWNrID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8qIGlmIHRoZSB0YWJsZSB3aWxsIGJlIGZ1bGwgYWZ0ZXIgdGhpcywgaW5jcmVtZW50IHRoZSBjb2RlIHNpemUgKi8KKyAgICAgICAgaWYgKGVuZCA+PSBtYXNrICYmIGJpdHMgPCBtYXgpIHsKKyAgICAgICAgICAgIEZMVVNIQ09ERSgpOworICAgICAgICAgICAgYml0cysrOworICAgICAgICAgICAgbWFzayA8PD0gMTsKKyAgICAgICAgICAgIG1hc2srKzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGdldCBhIGNvZGUgb2YgbGVuZ3RoIGJpdHMgKi8KKyAgICAgICAgaWYgKGNodW5rID09IDApICAgICAgICAgICAgICAgICAgICAgLyogZGVjcmVtZW50IGNodW5rIG1vZHVsbyBiaXRzICovCisgICAgICAgICAgICBjaHVuayA9IGJpdHM7CisgICAgICAgIGNvZGUgPSByZW07ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvdyBiaXRzIG9mIGNvZGUgKi8KKyAgICAgICAgaWYgKE5FWFQoKSA9PSAtMSkgeyAgICAgICAgICAgICAgICAgLyogRU9GIGlzIGVuZCBvZiBjb21wcmVzc2VkIGRhdGEgKi8KKyAgICAgICAgICAgIC8qIHdyaXRlIHJlbWFpbmluZyBidWZmZXJlZCBvdXRwdXQgKi8KKyAgICAgICAgICAgIGlmIChvdXRjbnQgJiYgb3V0KCZvdXRkLCBvdXRidWYsIG91dGNudCkpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5uZXh0X2luID0gb3V0YnVmOyAgICAgLyogc2lnbmFsIHdyaXRlIGVycm9yICovCisgICAgICAgICAgICAgICAgcmV0dXJuIFpfQlVGX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFpfT0s7CisgICAgICAgIH0KKyAgICAgICAgY29kZSArPSAodW5zaWduZWQpbGFzdCA8PCBsZWZ0OyAgICAgLyogbWlkZGxlIChvciBoaWdoKSBiaXRzIG9mIGNvZGUgKi8KKyAgICAgICAgbGVmdCArPSA4OworICAgICAgICBjaHVuay0tOworICAgICAgICBpZiAoYml0cyA+IGxlZnQpIHsgICAgICAgICAgICAgICAgICAvKiBuZWVkIG1vcmUgYml0cyAqLworICAgICAgICAgICAgaWYgKE5FWFQoKSA9PSAtMSkgICAgICAgICAgICAgICAvKiBjYW4ndCBlbmQgaW4gbWlkZGxlIG9mIGNvZGUgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gWl9CVUZfRVJST1I7CisgICAgICAgICAgICBjb2RlICs9ICh1bnNpZ25lZClsYXN0IDw8IGxlZnQ7IC8qIGhpZ2ggYml0cyBvZiBjb2RlICovCisgICAgICAgICAgICBsZWZ0ICs9IDg7CisgICAgICAgICAgICBjaHVuay0tOworICAgICAgICB9CisgICAgICAgIGNvZGUgJj0gbWFzazsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hc2sgdG8gY3VycmVudCBjb2RlIGxlbmd0aCAqLworICAgICAgICBsZWZ0IC09IGJpdHM7ICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgdW51c2VkIGJpdHMgKi8KKyAgICAgICAgcmVtID0gKHVuc2lnbmVkKWxhc3QgPj4gKDggLSBsZWZ0KTsgLyogdW51c2VkIGJpdHMgZnJvbSBsYXN0IGJ5dGUgKi8KKworICAgICAgICAvKiBwcm9jZXNzIGNsZWFyIGNvZGUgKDI1NikgKi8KKyAgICAgICAgaWYgKGNvZGUgPT0gMjU2ICYmIGZsYWdzKSB7CisgICAgICAgICAgICBGTFVTSENPREUoKTsKKyAgICAgICAgICAgIGJpdHMgPSA5OyAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBiaXRzIGFuZCBtYXNrICovCisgICAgICAgICAgICBtYXNrID0gMHgxZmY7CisgICAgICAgICAgICBlbmQgPSAyNTU7ICAgICAgICAgICAgICAgICAgICAgIC8qIGVtcHR5IHRhYmxlICovCisgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBuZXh0IGNvZGUgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qIHNwZWNpYWwgY29kZSB0byByZXVzZSBsYXN0IG1hdGNoICovCisgICAgICAgIHRlbXAgPSBjb2RlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgdGhlIGN1cnJlbnQgY29kZSAqLworICAgICAgICBpZiAoY29kZSA+IGVuZCkgeworICAgICAgICAgICAgLyogQmUgcGlja3kgb24gdGhlIGFsbG93ZWQgY29kZSBoZXJlLCBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlIGNvZGUKKyAgICAgICAgICAgICAgIHdlIGRyb3AgdGhyb3VnaCAocHJldikgd2lsbCBiZSBhIHZhbGlkIGluZGV4IHNvIHRoYXQgcmFuZG9tCisgICAgICAgICAgICAgICBpbnB1dCBkb2VzIG5vdCBjYXVzZSBhbiBleGNlcHRpb24uICBUaGUgY29kZSAhPSBlbmQgKyAxIGNoZWNrIGlzCisgICAgICAgICAgICAgICBlbXBpcmljYWxseSBkZXJpdmVkLCBhbmQgbm90IGNoZWNrZWQgaW4gdGhlIG9yaWdpbmFsIHVuY29tcHJlc3MKKyAgICAgICAgICAgICAgIGNvZGUuICBJZiB0aGlzIGV2ZXIgY2F1c2VzIGEgcHJvYmxlbSwgdGhhdCBjaGVjayBjb3VsZCBiZSBzYWZlbHkKKyAgICAgICAgICAgICAgIHJlbW92ZWQuICBMZWF2aW5nIHRoaXMgY2hlY2sgaW4gZ3JlYXRseSBpbXByb3ZlcyBndW4ncyBhYmlsaXR5CisgICAgICAgICAgICAgICB0byBkZXRlY3QgcmFuZG9tIG9yIGNvcnJ1cHRlZCBpbnB1dCBhZnRlciBhIGNvbXByZXNzIGhlYWRlci4KKyAgICAgICAgICAgICAgIEluIGFueSBjYXNlLCB0aGUgcHJldiA+IGVuZCBjaGVjayBtdXN0IGJlIHJldGFpbmVkLiAqLworICAgICAgICAgICAgaWYgKGNvZGUgIT0gZW5kICsgMSB8fCBwcmV2ID4gZW5kKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBsencgY29kZSI7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoW3N0YWNrKytdID0gKHVuc2lnbmVkIGNoYXIpZmluYWw7CisgICAgICAgICAgICBjb2RlID0gcHJldjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHdhbGsgdGhyb3VnaCBsaW5rZWQgbGlzdCB0byBnZW5lcmF0ZSBvdXRwdXQgaW4gcmV2ZXJzZSBvcmRlciAqLworICAgICAgICBwID0gbWF0Y2ggKyBzdGFjazsKKyAgICAgICAgd2hpbGUgKGNvZGUgPj0gMjU2KSB7CisgICAgICAgICAgICAqcCsrID0gc3VmZml4W2NvZGVdOworICAgICAgICAgICAgY29kZSA9IHByZWZpeFtjb2RlXTsKKyAgICAgICAgfQorICAgICAgICBzdGFjayA9IHAgLSBtYXRjaDsKKyAgICAgICAgbWF0Y2hbc3RhY2srK10gPSAodW5zaWduZWQgY2hhciljb2RlOworICAgICAgICBmaW5hbCA9IGNvZGU7CisKKyAgICAgICAgLyogbGluayBuZXcgdGFibGUgZW50cnkgKi8KKyAgICAgICAgaWYgKGVuZCA8IG1hc2spIHsKKyAgICAgICAgICAgIGVuZCsrOworICAgICAgICAgICAgcHJlZml4W2VuZF0gPSAodW5zaWduZWQgc2hvcnQpcHJldjsKKyAgICAgICAgICAgIHN1ZmZpeFtlbmRdID0gKHVuc2lnbmVkIGNoYXIpZmluYWw7CisgICAgICAgIH0KKworICAgICAgICAvKiBzZXQgcHJldmlvdXMgY29kZSBmb3IgbmV4dCBpdGVyYXRpb24gKi8KKyAgICAgICAgcHJldiA9IHRlbXA7CisKKyAgICAgICAgLyogd3JpdGUgb3V0cHV0IGluIGZvcndhcmQgb3JkZXIgKi8KKyAgICAgICAgd2hpbGUgKHN0YWNrID4gU0laRSAtIG91dGNudCkgeworICAgICAgICAgICAgd2hpbGUgKG91dGNudCA8IFNJWkUpCisgICAgICAgICAgICAgICAgb3V0YnVmW291dGNudCsrXSA9IG1hdGNoWy0tc3RhY2tdOworICAgICAgICAgICAgaWYgKG91dCgmb3V0ZCwgb3V0YnVmLCBvdXRjbnQpKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bmV4dF9pbiA9IG91dGJ1ZjsgLyogc2lnbmFsIHdyaXRlIGVycm9yICovCisgICAgICAgICAgICAgICAgcmV0dXJuIFpfQlVGX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0Y250ID0gMDsKKyAgICAgICAgfQorICAgICAgICBwID0gbWF0Y2ggKyBzdGFjazsKKyAgICAgICAgZG8geworICAgICAgICAgICAgb3V0YnVmW291dGNudCsrXSA9ICotLXA7CisgICAgICAgIH0gd2hpbGUgKHAgPiBtYXRjaCk7CisgICAgICAgIHN0YWNrID0gMDsKKworICAgICAgICAvKiBsb29wIGZvciBuZXh0IGNvZGUgd2l0aCBmaW5hbCBhbmQgcHJldiBhcyB0aGUgbGFzdCBtYXRjaCwgcmVtIGFuZAorICAgICAgICAgICBsZWZ0IHByb3ZpZGUgdGhlIGZpcnN0IDAuLjcgYml0cyBvZiB0aGUgbmV4dCBjb2RlLCBlbmQgaXMgdGhlIGxhc3QKKyAgICAgICAgICAgdmFsaWQgdGFibGUgZW50cnkgKi8KKyAgICB9Cit9CisKKy8qIERlY29tcHJlc3MgYSBnemlwIGZpbGUgZnJvbSBpbmZpbGUgdG8gb3V0ZmlsZS4gIHN0cm0gaXMgYXNzdW1lZCB0byBoYXZlIGJlZW4KKyAgIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCB3aXRoIGluZmxhdGVCYWNrSW5pdCgpLiAgVGhlIGlucHV0IGZpbGUgbWF5IGNvbnNpc3QKKyAgIG9mIGEgc2VyaWVzIG9mIGd6aXAgc3RyZWFtcywgaW4gd2hpY2ggY2FzZSBhbGwgb2YgdGhlbSB3aWxsIGJlIGRlY29tcHJlc3NlZAorICAgdG8gdGhlIG91dHB1dCBmaWxlLiAgSWYgb3V0ZmlsZSBpcyAtMSwgdGhlbiB0aGUgZ3ppcCBzdHJlYW0ocykgaW50ZWdyaXR5IGlzCisgICBjaGVja2VkIGFuZCBub3RoaW5nIGlzIHdyaXR0ZW4uCisKKyAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYSB6bGliIGVycm9yIGNvZGU6IFpfTUVNX0VSUk9SIGlmIG91dCBvZiBtZW1vcnksCisgICBaX0RBVEFfRVJST1IgaWYgdGhlIGhlYWRlciBvciB0aGUgY29tcHJlc3NlZCBkYXRhIGlzIGludmFsaWQsIG9yIGlmIHRoZQorICAgdHJhaWxlciBDUkMtMzIgY2hlY2sgb3IgbGVuZ3RoIGRvZXNuJ3QgbWF0Y2gsIFpfQlVGX0VSUk9SIGlmIHRoZSBpbnB1dCBlbmRzCisgICBwcmVtYXR1cmVseSBvciBhIHdyaXRlIGVycm9yIG9jY3Vycywgb3IgWl9FUlJOTyBpZiBqdW5rIChub3QgYSBhbm90aGVyIGd6aXAKKyAgIHN0cmVhbSkgZm9sbG93cyBhIHZhbGlkIGd6aXAgc3RyZWFtLgorICovCitsb2NhbCBpbnQgZ3VucGlwZSh6X3N0cmVhbSAqc3RybSwgaW50IGluZmlsZSwgaW50IG91dGZpbGUpCit7CisgICAgaW50IHJldCwgZmlyc3QsIGxhc3Q7CisgICAgdW5zaWduZWQgaGF2ZSwgZmxhZ3MsIGxlbjsKKyAgICB6X2NvbnN0IHVuc2lnbmVkIGNoYXIgKm5leHQgPSBOVUxMOworICAgIHN0cnVjdCBpbmQgaW5kLCAqaW5kcDsKKyAgICBzdHJ1Y3Qgb3V0ZCBvdXRkOworCisgICAgLyogc2V0dXAgaW5wdXQgYnVmZmVyICovCisgICAgaW5kLmluZmlsZSA9IGluZmlsZTsKKyAgICBpbmQuaW5idWYgPSBpbmJ1ZjsKKyAgICBpbmRwID0gJmluZDsKKworICAgIC8qIGRlY29tcHJlc3MgY29uY2F0ZW5hdGVkIGd6aXAgc3RyZWFtcyAqLworICAgIGhhdmUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBpbnB1dCBkYXRhIHJlYWQgaW4geWV0ICovCisgICAgZmlyc3QgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvb2tpbmcgZm9yIGZpcnN0IGd6aXAgaGVhZGVyICovCisgICAgc3RybS0+bmV4dF9pbiA9IFpfTlVMTDsgICAgICAgICAgICAgICAgIC8qIHNvIFpfQlVGX0VSUk9SIG1lYW5zIEVPRiAqLworICAgIGZvciAoOzspIHsKKyAgICAgICAgLyogbG9vayBmb3IgdGhlIHR3byBtYWdpYyBoZWFkZXIgYnl0ZXMgZm9yIGEgZ3ppcCBzdHJlYW0gKi8KKyAgICAgICAgaWYgKE5FWFQoKSA9PSAtMSkgeworICAgICAgICAgICAgcmV0ID0gWl9PSzsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW1wdHkgZ3ppcCBzdHJlYW0gaXMgb2sgKi8KKyAgICAgICAgfQorICAgICAgICBpZiAobGFzdCAhPSAzMSB8fCAoTkVYVCgpICE9IDEzOSAmJiBsYXN0ICE9IDE1NykpIHsKKyAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImluY29ycmVjdCBoZWFkZXIgY2hlY2siOworICAgICAgICAgICAgcmV0ID0gZmlyc3QgPyBaX0RBVEFfRVJST1IgOiBaX0VSUk5POworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgYSBnemlwIG9yIGNvbXByZXNzIGhlYWRlciAqLworICAgICAgICB9CisgICAgICAgIGZpcnN0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgbm9uLWhlYWRlciBpcyBqdW5rICovCisKKyAgICAgICAgLyogcHJvY2VzcyBhIGNvbXByZXNzIChMWlcpIGZpbGUgLS0gY2FuJ3QgYmUgY29uY2F0ZW5hdGVkIGFmdGVyIHRoaXMgKi8KKyAgICAgICAgaWYgKGxhc3QgPT0gMTU3KSB7CisgICAgICAgICAgICByZXQgPSBsdW5waXBlKGhhdmUsIG5leHQsIGluZHAsIG91dGZpbGUsIHN0cm0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBwcm9jZXNzIHJlbWFpbmRlciBvZiBnemlwIGhlYWRlciAqLworICAgICAgICByZXQgPSBaX0JVRl9FUlJPUjsKKyAgICAgICAgaWYgKE5FWFQoKSAhPSA4KSB7ICAgICAgICAgICAgICAgICAgLyogb25seSBkZWZsYXRlIG1ldGhvZCBhbGxvd2VkICovCisgICAgICAgICAgICBpZiAobGFzdCA9PSAtMSkgYnJlYWs7CisgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCI7CisgICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmbGFncyA9IE5FWFQoKTsgICAgICAgICAgICAgICAgICAgICAvKiBoZWFkZXIgZmxhZ3MgKi8KKyAgICAgICAgTkVYVCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY2FyZCBtb2QgdGltZSwgeGZsZ3MsIG9zICovCisgICAgICAgIE5FWFQoKTsKKyAgICAgICAgTkVYVCgpOworICAgICAgICBORVhUKCk7CisgICAgICAgIE5FWFQoKTsKKyAgICAgICAgTkVYVCgpOworICAgICAgICBpZiAobGFzdCA9PSAtMSkgYnJlYWs7CisgICAgICAgIGlmIChmbGFncyAmIDB4ZTApIHsKKyAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInVua25vd24gaGVhZGVyIGZsYWdzIHNldCI7CisgICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmxhZ3MgJiA0KSB7ICAgICAgICAgICAgICAgICAgICAvKiBleHRyYSBmaWVsZCAqLworICAgICAgICAgICAgbGVuID0gTkVYVCgpOworICAgICAgICAgICAgbGVuICs9ICh1bnNpZ25lZCkoTkVYVCgpKSA8PCA4OworICAgICAgICAgICAgaWYgKGxhc3QgPT0gLTEpIGJyZWFrOworICAgICAgICAgICAgd2hpbGUgKGxlbiA+IGhhdmUpIHsKKyAgICAgICAgICAgICAgICBsZW4gLT0gaGF2ZTsKKyAgICAgICAgICAgICAgICBoYXZlID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoTkVYVCgpID09IC0xKSBicmVhazsKKyAgICAgICAgICAgICAgICBsZW4tLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsYXN0ID09IC0xKSBicmVhazsKKyAgICAgICAgICAgIGhhdmUgLT0gbGVuOworICAgICAgICAgICAgbmV4dCArPSBsZW47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsYWdzICYgOCkgICAgICAgICAgICAgICAgICAgICAgLyogZmlsZSBuYW1lICovCisgICAgICAgICAgICB3aGlsZSAoTkVYVCgpICE9IDAgJiYgbGFzdCAhPSAtMSkKKyAgICAgICAgICAgICAgICA7CisgICAgICAgIGlmIChmbGFncyAmIDE2KSAgICAgICAgICAgICAgICAgICAgIC8qIGNvbW1lbnQgKi8KKyAgICAgICAgICAgIHdoaWxlIChORVhUKCkgIT0gMCAmJiBsYXN0ICE9IC0xKQorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgaWYgKGZsYWdzICYgMikgeyAgICAgICAgICAgICAgICAgICAgLyogaGVhZGVyIGNyYyAqLworICAgICAgICAgICAgTkVYVCgpOworICAgICAgICAgICAgTkVYVCgpOworICAgICAgICB9CisgICAgICAgIGlmIChsYXN0ID09IC0xKSBicmVhazsKKworICAgICAgICAvKiBzZXQgdXAgb3V0cHV0ICovCisgICAgICAgIG91dGQub3V0ZmlsZSA9IG91dGZpbGU7CisgICAgICAgIG91dGQuY2hlY2sgPSAxOworICAgICAgICBvdXRkLmNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOworICAgICAgICBvdXRkLnRvdGFsID0gMDsKKworICAgICAgICAvKiBkZWNvbXByZXNzIGRhdGEgdG8gb3V0cHV0ICovCisgICAgICAgIHN0cm0tPm5leHRfaW4gPSBuZXh0OworICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IGhhdmU7CisgICAgICAgIHJldCA9IGluZmxhdGVCYWNrKHN0cm0sIGluLCBpbmRwLCBvdXQsICZvdXRkKTsKKyAgICAgICAgaWYgKHJldCAhPSBaX1NUUkVBTV9FTkQpIGJyZWFrOworICAgICAgICBuZXh0ID0gc3RybS0+bmV4dF9pbjsKKyAgICAgICAgaGF2ZSA9IHN0cm0tPmF2YWlsX2luOworICAgICAgICBzdHJtLT5uZXh0X2luID0gWl9OVUxMOyAgICAgICAgICAgICAvKiBzbyBaX0JVRl9FUlJPUiBtZWFucyBFT0YgKi8KKworICAgICAgICAvKiBjaGVjayB0cmFpbGVyICovCisgICAgICAgIHJldCA9IFpfQlVGX0VSUk9SOworICAgICAgICBpZiAoTkVYVCgpICE9IChpbnQpKG91dGQuY3JjICYgMHhmZikgfHwKKyAgICAgICAgICAgIE5FWFQoKSAhPSAoaW50KSgob3V0ZC5jcmMgPj4gOCkgJiAweGZmKSB8fAorICAgICAgICAgICAgTkVYVCgpICE9IChpbnQpKChvdXRkLmNyYyA+PiAxNikgJiAweGZmKSB8fAorICAgICAgICAgICAgTkVYVCgpICE9IChpbnQpKChvdXRkLmNyYyA+PiAyNCkgJiAweGZmKSkgeworICAgICAgICAgICAgLyogY3JjIGVycm9yICovCisgICAgICAgICAgICBpZiAobGFzdCAhPSAtMSkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImluY29ycmVjdCBkYXRhIGNoZWNrIjsKKyAgICAgICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoTkVYVCgpICE9IChpbnQpKG91dGQudG90YWwgJiAweGZmKSB8fAorICAgICAgICAgICAgTkVYVCgpICE9IChpbnQpKChvdXRkLnRvdGFsID4+IDgpICYgMHhmZikgfHwKKyAgICAgICAgICAgIE5FWFQoKSAhPSAoaW50KSgob3V0ZC50b3RhbCA+PiAxNikgJiAweGZmKSB8fAorICAgICAgICAgICAgTkVYVCgpICE9IChpbnQpKChvdXRkLnRvdGFsID4+IDI0KSAmIDB4ZmYpKSB7CisgICAgICAgICAgICAvKiBsZW5ndGggZXJyb3IgKi8KKyAgICAgICAgICAgIGlmIChsYXN0ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW5jb3JyZWN0IGxlbmd0aCBjaGVjayI7CisgICAgICAgICAgICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBnbyBiYWNrIGFuZCBsb29rIGZvciBhbm90aGVyIGd6aXAgc3RyZWFtICovCisgICAgfQorCisgICAgLyogY2xlYW4gdXAgYW5kIHJldHVybiAqLworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIENvcHkgZmlsZSBhdHRyaWJ1dGVzLCBmcm9tIC0+IHRvLCBhcyBiZXN0IHdlIGNhbi4gIFRoaXMgaXMgYmVzdCBlZmZvcnQsIHNvCisgICBubyBlcnJvcnMgYXJlIHJlcG9ydGVkLiAgVGhlIG1vZGUgYml0cywgaW5jbHVkaW5nIHN1aWQsIHNnaWQsIGFuZCB0aGUgc3RpY2t5CisgICBiaXQgYXJlIGNvcGllZCAoaWYgYWxsb3dlZCksIHRoZSBvd25lcidzIHVzZXIgaWQgYW5kIGdyb3VwIGlkIGFyZSBjb3BpZWQKKyAgIChhZ2FpbiBpZiBhbGxvd2VkKSwgYW5kIHRoZSBhY2Nlc3MgYW5kIG1vZGlmeSB0aW1lcyBhcmUgY29waWVkLiAqLworbG9jYWwgdm9pZCBjb3B5bWV0YShjaGFyICpmcm9tLCBjaGFyICp0bykKK3sKKyAgICBzdHJ1Y3Qgc3RhdCB3YXM7CisgICAgc3RydWN0IHV0aW1idWYgd2hlbjsKKworICAgIC8qIGdldCBhbGwgb2YgZnJvbSdzIFVuaXggbWV0YSBkYXRhLCByZXR1cm4gaWYgbm90IGEgcmVndWxhciBmaWxlICovCisgICAgaWYgKHN0YXQoZnJvbSwgJndhcykgIT0gMCB8fCAod2FzLnN0X21vZGUgJiBTX0lGTVQpICE9IFNfSUZSRUcpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIHNldCB0bydzIG1vZGUgYml0cywgaWdub3JlIGVycm9ycyAqLworICAgICh2b2lkKWNobW9kKHRvLCB3YXMuc3RfbW9kZSAmIDA3Nzc3KTsKKworICAgIC8qIGNvcHkgb3duZXIncyB1c2VyIGFuZCBncm91cCwgaWdub3JlIGVycm9ycyAqLworICAgICh2b2lkKWNob3duKHRvLCB3YXMuc3RfdWlkLCB3YXMuc3RfZ2lkKTsKKworICAgIC8qIGNvcHkgYWNjZXNzIGFuZCBtb2RpZnkgdGltZXMsIGlnbm9yZSBlcnJvcnMgKi8KKyAgICB3aGVuLmFjdGltZSA9IHdhcy5zdF9hdGltZTsKKyAgICB3aGVuLm1vZHRpbWUgPSB3YXMuc3RfbXRpbWU7CisgICAgKHZvaWQpdXRpbWUodG8sICZ3aGVuKTsKK30KKworLyogRGVjb21wcmVzcyB0aGUgZmlsZSBpbm5hbWUgdG8gdGhlIGZpbGUgb3V0bm5hbWUsIG9mIGlmIHRlc3QgaXMgdHJ1ZSwganVzdAorICAgZGVjb21wcmVzcyB3aXRob3V0IHdyaXRpbmcgYW5kIGNoZWNrIHRoZSBnemlwIHRyYWlsZXIgZm9yIGludGVncml0eS4gIElmCisgICBpbm5hbWUgaXMgTlVMTCBvciBhbiBlbXB0eSBzdHJpbmcsIHJlYWQgZnJvbSBzdGRpbi4gIElmIG91dG5hbWUgaXMgTlVMTCBvcgorICAgYW4gZW1wdHkgc3RyaW5nLCB3cml0ZSB0byBzdGRvdXQuICBzdHJtIGlzIGEgcHJlLWluaXRpYWxpemVkIGluZmxhdGVCYWNrCisgICBzdHJ1Y3R1cmUuICBXaGVuIGFwcHJvcHJpYXRlLCBjb3B5IHRoZSBmaWxlIGF0dHJpYnV0ZXMgZnJvbSBpbm5hbWUgdG8KKyAgIG91dG5hbWUuCisKKyAgIGd1bnppcCgpIHJldHVybnMgMSBpZiB0aGVyZSBpcyBhbiBvdXQtb2YtbWVtb3J5IGVycm9yIG9yIGFuIHVuZXhwZWN0ZWQKKyAgIHJldHVybiBjb2RlIGZyb20gZ3VucGlwZSgpLiAgT3RoZXJ3aXNlIGl0IHJldHVybnMgMC4KKyAqLworbG9jYWwgaW50IGd1bnppcCh6X3N0cmVhbSAqc3RybSwgY2hhciAqaW5uYW1lLCBjaGFyICpvdXRuYW1lLCBpbnQgdGVzdCkKK3sKKyAgICBpbnQgcmV0OworICAgIGludCBpbmZpbGUsIG91dGZpbGU7CisKKyAgICAvKiBvcGVuIGZpbGVzICovCisgICAgaWYgKGlubmFtZSA9PSBOVUxMIHx8ICppbm5hbWUgPT0gMCkgeworICAgICAgICBpbm5hbWUgPSAiLSI7CisgICAgICAgIGluZmlsZSA9IDA7ICAgICAvKiBzdGRpbiAqLworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaW5maWxlID0gb3Blbihpbm5hbWUsIE9fUkRPTkxZLCAwKTsKKyAgICAgICAgaWYgKGluZmlsZSA9PSAtMSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gY2Fubm90IG9wZW4gJXNcbiIsIGlubmFtZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodGVzdCkKKyAgICAgICAgb3V0ZmlsZSA9IC0xOworICAgIGVsc2UgaWYgKG91dG5hbWUgPT0gTlVMTCB8fCAqb3V0bmFtZSA9PSAwKSB7CisgICAgICAgIG91dG5hbWUgPSAiLSI7CisgICAgICAgIG91dGZpbGUgPSAxOyAgICAvKiBzdGRvdXQgKi8KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG91dGZpbGUgPSBvcGVuKG91dG5hbWUsIE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19XUk9OTFksIDA2NjYpOworICAgICAgICBpZiAob3V0ZmlsZSA9PSAtMSkgeworICAgICAgICAgICAgY2xvc2UoaW5maWxlKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VuIGNhbm5vdCBjcmVhdGUgJXNcbiIsIG91dG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZXJybm8gPSAwOworCisgICAgLyogZGVjb21wcmVzcyAqLworICAgIHJldCA9IGd1bnBpcGUoc3RybSwgaW5maWxlLCBvdXRmaWxlKTsKKyAgICBpZiAob3V0ZmlsZSA+IDIpIGNsb3NlKG91dGZpbGUpOworICAgIGlmIChpbmZpbGUgPiAyKSBjbG9zZShpbmZpbGUpOworCisgICAgLyogaW50ZXJwcmV0IHJlc3VsdCAqLworICAgIHN3aXRjaCAocmV0KSB7CisgICAgY2FzZSBaX09LOgorICAgIGNhc2UgWl9FUlJOTzoKKyAgICAgICAgaWYgKGluZmlsZSA+IDIgJiYgb3V0ZmlsZSA+IDIpIHsKKyAgICAgICAgICAgIGNvcHltZXRhKGlubmFtZSwgb3V0bmFtZSk7ICAgICAgICAgIC8qIGNvcHkgYXR0cmlidXRlcyAqLworICAgICAgICAgICAgdW5saW5rKGlubmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA9PSBaX0VSUk5PKQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gd2FybmluZzogdHJhaWxpbmcgZ2FyYmFnZSBpZ25vcmVkIGluICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBpbm5hbWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpfREFUQV9FUlJPUjoKKyAgICAgICAgaWYgKG91dGZpbGUgPiAyKSB1bmxpbmsob3V0bmFtZSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VuIGRhdGEgZXJyb3Igb24gJXM6ICVzXG4iLCBpbm5hbWUsIHN0cm0tPm1zZyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWl9NRU1fRVJST1I6CisgICAgICAgIGlmIChvdXRmaWxlID4gMikgdW5saW5rKG91dG5hbWUpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd1biBvdXQgb2YgbWVtb3J5IGVycm9yLS1hYm9ydGluZ1xuIik7CisgICAgICAgIHJldHVybiAxOworICAgIGNhc2UgWl9CVUZfRVJST1I6CisgICAgICAgIGlmIChvdXRmaWxlID4gMikgdW5saW5rKG91dG5hbWUpOworICAgICAgICBpZiAoc3RybS0+bmV4dF9pbiAhPSBaX05VTEwpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VuIHdyaXRlIGVycm9yIG9uICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgb3V0bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChlcnJubykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gcmVhZCBlcnJvciBvbiAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIGlubmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VuIHVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgb24gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIGlubmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKG91dGZpbGUgPiAyKSB1bmxpbmsob3V0bmFtZSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VuIGludGVybmFsIGVycm9yLS1hYm9ydGluZ1xuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogUHJvY2VzcyB0aGUgZ3VuIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuICBTZWUgdGhlIGNvbW1hbmQgc3ludGF4IG5lYXIgdGhlCisgICBiZWdpbm5pbmcgb2YgdGhpcyBzb3VyY2UgZmlsZS4gKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgcmV0LCBsZW4sIHRlc3Q7CisgICAgY2hhciAqb3V0bmFtZTsKKyAgICB1bnNpZ25lZCBjaGFyICp3aW5kb3c7CisgICAgel9zdHJlYW0gc3RybTsKKworICAgIC8qIGluaXRpYWxpemUgaW5mbGF0ZUJhY2sgc3RhdGUgZm9yIHJlcGVhdGVkIHVzZSAqLworICAgIHdpbmRvdyA9IG1hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXVzZSBMWlcgbWF0Y2ggYnVmZmVyICovCisgICAgc3RybS56YWxsb2MgPSBaX05VTEw7CisgICAgc3RybS56ZnJlZSA9IFpfTlVMTDsKKyAgICBzdHJtLm9wYXF1ZSA9IFpfTlVMTDsKKyAgICByZXQgPSBpbmZsYXRlQmFja0luaXQoJnN0cm0sIDE1LCB3aW5kb3cpOworICAgIGlmIChyZXQgIT0gWl9PSykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd1biBvdXQgb2YgbWVtb3J5IGVycm9yLS1hYm9ydGluZ1xuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8qIGRlY29tcHJlc3MgZWFjaCBmaWxlIHRvIHRoZSBzYW1lIG5hbWUgd2l0aCB0aGUgc3VmZml4IHJlbW92ZWQgKi8KKyAgICBhcmdjLS07CisgICAgYXJndisrOworICAgIHRlc3QgPSAwOworICAgIGlmIChhcmdjICYmIHN0cmNtcCgqYXJndiwgIi1oIikgPT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd1biAxLjYgKDE3IEphbiAyMDEwKVxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgTWFyayBBZGxlclxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6IGd1biBbLXRdIFtmaWxlMS5neiBbZmlsZTIuWiAuLi5dXVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoYXJnYyAmJiBzdHJjbXAoKmFyZ3YsICItdCIpID09IDApIHsKKyAgICAgICAgdGVzdCA9IDE7CisgICAgICAgIGFyZ2MtLTsKKyAgICAgICAgYXJndisrOworICAgIH0KKyAgICBpZiAoYXJnYykKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKHRlc3QpCisgICAgICAgICAgICAgICAgb3V0bmFtZSA9IE5VTEw7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZW4gPSAoaW50KXN0cmxlbigqYXJndik7CisgICAgICAgICAgICAgICAgaWYgKHN0cmNtcCgqYXJndiArIGxlbiAtIDMsICIuZ3oiKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgIHN0cmNtcCgqYXJndiArIGxlbiAtIDMsICItZ3oiKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBsZW4gLT0gMzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YgKyBsZW4gLSAyLCAiLnoiKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgIHN0cmNtcCgqYXJndiArIGxlbiAtIDIsICIteiIpID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgc3RyY21wKCphcmd2ICsgbGVuIC0gMiwgIl96IikgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICBzdHJjbXAoKmFyZ3YgKyBsZW4gLSAyLCAiLloiKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBsZW4gLT0gMjsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gZXJyb3I6IG5vIGd6IHR5cGUgb24gJXMtLXNraXBwaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICphcmd2KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dG5hbWUgPSBtYWxsb2MobGVuICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKG91dG5hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd1biBvdXQgb2YgbWVtb3J5IGVycm9yLS1hYm9ydGluZ1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1jcHkob3V0bmFtZSwgKmFyZ3YsIGxlbik7CisgICAgICAgICAgICAgICAgb3V0bmFtZVtsZW5dID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IGd1bnppcCgmc3RybSwgKmFyZ3YsIG91dG5hbWUsIHRlc3QpOworICAgICAgICAgICAgaWYgKG91dG5hbWUgIT0gTlVMTCkgZnJlZShvdXRuYW1lKTsKKyAgICAgICAgICAgIGlmIChyZXQpIGJyZWFrOworICAgICAgICB9IHdoaWxlIChhcmd2KyssIC0tYXJnYyk7CisgICAgZWxzZQorICAgICAgICByZXQgPSBndW56aXAoJnN0cm0sIE5VTEwsIE5VTEwsIHRlc3QpOworCisgICAgLyogY2xlYW4gdXAgKi8KKyAgICBpbmZsYXRlQmFja0VuZCgmc3RybSk7CisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2V4YW1wbGVzL2d6YXBwZW5kLmMgYi96bGliL3NyYy9leGFtcGxlcy9nemFwcGVuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MmRlYzMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9leGFtcGxlcy9nemFwcGVuZC5jCkBAIC0wLDAgKzEsNTA0IEBACisvKiBnemFwcGVuZCAtLSBjb21tYW5kIHRvIGFwcGVuZCB0byBhIGd6aXAgZmlsZQorCisgIENvcHlyaWdodCAoQykgMjAwMywgMjAxMiBNYXJrIEFkbGVyLCBhbGwgcmlnaHRzIHJlc2VydmVkCisgIHZlcnNpb24gMS4yLCAxMSBPY3QgMjAxMgorCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9yIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorCisgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCisgIE1hcmsgQWRsZXIgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQorICovCisKKy8qCisgKiBDaGFuZ2UgaGlzdG9yeToKKyAqCisgKiAxLjAgIDE5IE9jdCAyMDAzICAgICAtIEZpcnN0IHZlcnNpb24KKyAqIDEuMSAgIDQgTm92IDIwMDMgICAgIC0gRXhwYW5kIGFuZCBjbGFyaWZ5IHNvbWUgY29tbWVudHMgYW5kIG5vdGVzCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEFkZCB2ZXJzaW9uIGFuZCBjb3B5cmlnaHQgdG8gaGVscAorICogICAgICAgICAgICAgICAgICAgICAgLSBTZW5kIGhlbHAgdG8gc3Rkb3V0IGluc3RlYWQgb2Ygc3RkZXJyCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEFkZCBzb21lIHByZWVtcHRpdmUgdHlwZWNhc3RzCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEFkZCBMIHRvIGNvbnN0YW50cyBpbiBsc2VlaygpIGNhbGxzCisgKiAgICAgICAgICAgICAgICAgICAgICAtIFJlbW92ZSBzb21lIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbiBlcnJvciBtZXNzYWdlcworICogICAgICAgICAgICAgICAgICAgICAgLSBVc2UgbmV3IGRhdGFfdHlwZSBkZWZpbml0aW9uIGZvciB6bGliIDEuMi4xCisgKiAgICAgICAgICAgICAgICAgICAgICAtIFNpbXBsZnkgYW5kIHVuaWZ5IGZpbGUgb3BlcmF0aW9ucworICogICAgICAgICAgICAgICAgICAgICAgLSBGaW5pc2ggb2ZmIGd6aXAgZmlsZSBpbiBnenRhY2soKQorICogICAgICAgICAgICAgICAgICAgICAgLSBVc2UgZGVmbGF0ZVByaW1lKCkgaW5zdGVhZCBvZiBhZGRpbmcgZW1wdHkgYmxvY2tzCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEtlZXAgZ3ppcCBmaWxlIGNsZWFuIG9uIGFwcGVuZGVkIGZpbGUgcmVhZCBlcnJvcnMKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gVXNlIGluLXBsYWNlIHJvdGF0ZSBpbnN0ZWFkIG9mIGF1eGlsaWFyeSBidWZmZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgKFdoeSB5b3UgYXNrPyAgQmVjYXVzZSBpdCB3YXMgZnVuIHRvIHdyaXRlISkKKyAqIDEuMiAgMTEgT2N0IDIwMTIgICAgIC0gRml4IGZvciBwcm9wZXIgel9jb25zdCB1c2FnZQorICogICAgICAgICAgICAgICAgICAgICAgLSBDaGVjayBmb3IgaW5wdXQgYnVmZmVyIG1hbGxvYyBmYWlsdXJlCisgKi8KKworLyoKKyAgIGd6YXBwZW5kIHRha2VzIGEgZ3ppcCBmaWxlIGFuZCBhcHBlbmRzIHRvIGl0LCBjb21wcmVzc2luZyBmaWxlcyBmcm9tIHRoZQorICAgY29tbWFuZCBsaW5lIG9yIGRhdGEgZnJvbSBzdGRpbi4gIFRoZSBnemlwIGZpbGUgaXMgd3JpdHRlbiB0byBkaXJlY3RseSwgdG8KKyAgIGF2b2lkIGNvcHlpbmcgdGhhdCBmaWxlLCBpbiBjYXNlIGl0J3MgbGFyZ2UuICBOb3RlIHRoYXQgdGhpcyByZXN1bHRzIGluIHRoZQorICAgdW5mcmllbmRseSBiZWhhdmlvciB0aGF0IGlmIGd6YXBwZW5kIGZhaWxzLCB0aGUgZ3ppcCBmaWxlIGlzIGNvcnJ1cHRlZC4KKworICAgVGhpcyBwcm9ncmFtIHdhcyB3cml0dGVuIHRvIGlsbHVzdHJhdGUgdGhlIHVzZSBvZiB0aGUgbmV3IFpfQkxPQ0sgb3B0aW9uIG9mCisgICB6bGliIDEuMi54J3MgaW5mbGF0ZSgpIGZ1bmN0aW9uLiAgVGhpcyBvcHRpb24gcmV0dXJucyBmcm9tIGluZmxhdGUoKSBhdCBlYWNoCisgICBibG9jayBib3VuZGFyeSB0byBmYWNpbGl0YXRlIGxvY2F0aW5nIGFuZCBtb2RpZnlpbmcgdGhlIGxhc3QgYmxvY2sgYml0IGF0CisgICB0aGUgc3RhcnQgb2YgdGhlIGZpbmFsIGRlZmxhdGUgYmxvY2suICBBbHNvIHdoZXRoZXIgdXNpbmcgWl9CTE9DSyBvciBub3QsCisgICBhbm90aGVyIHJlcXVpcmVkIGZlYXR1cmUgb2YgemxpYiAxLjIueCBpcyB0aGF0IGluZmxhdGUoKSBub3cgcHJvdmlkZXMgdGhlCisgICBudW1iZXIgb2YgdW51c3VlZCBiaXRzIGluIHRoZSBsYXN0IGlucHV0IGJ5dGUgdXNlZC4gIGd6YXBwZW5kIHdpbGwgbm90IHdvcmsKKyAgIHdpdGggdmVyc2lvbnMgb2YgemxpYiBlYXJsaWVyIHRoYW4gMS4yLjEuCisKKyAgIGd6YXBwZW5kIGZpcnN0IGRlY29tcHJlc3NlcyB0aGUgZ3ppcCBmaWxlIGludGVybmFsbHksIGRpc2NhcmRpbmcgYWxsIGJ1dAorICAgdGhlIGxhc3QgMzJLIG9mIHVuY29tcHJlc3NlZCBkYXRhLCBhbmQgbm90aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgbGFzdCBibG9jaworICAgYml0IGFuZCB0aGUgbnVtYmVyIG9mIHVudXNlZCBiaXRzIGluIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIGNvbXByZXNzZWQgZGF0YS4KKyAgIFRoZSBnemlwIHRyYWlsZXIgY29udGFpbmluZyB0aGUgQ1JDLTMyIGFuZCBsZW5ndGggb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhCisgICBpcyB2ZXJpZmllZC4gIFRoaXMgdHJhaWxlciB3aWxsIGJlIGxhdGVyIG92ZXJ3cml0dGVuLgorCisgICBUaGVuIHRoZSBsYXN0IGJsb2NrIGJpdCBpcyBjbGVhcmVkIGJ5IHNlZWtpbmcgYmFjayBpbiB0aGUgZmlsZSBhbmQgcmV3cml0aW5nCisgICB0aGUgYnl0ZSB0aGF0IGNvbnRhaW5zIGl0LiAgU2Vla2luZyBmb3J3YXJkLCB0aGUgbGFzdCBieXRlIG9mIHRoZSBjb21wcmVzc2VkCisgICBkYXRhIGlzIHNhdmVkIGFsb25nIHdpdGggdGhlIG51bWJlciBvZiB1bnVzZWQgYml0cyB0byBpbml0aWFsaXplIGRlZmxhdGUuCisKKyAgIEEgZGVmbGF0ZSBwcm9jZXNzIGlzIGluaXRpYWxpemVkLCB1c2luZyB0aGUgbGFzdCAzMksgb2YgdGhlIHVuY29tcHJlc3NlZAorICAgZGF0YSBmcm9tIHRoZSBnemlwIGZpbGUgdG8gaW5pdGlhbGl6ZSB0aGUgZGljdGlvbmFyeS4gIElmIHRoZSB0b3RhbAorICAgdW5jb21wcmVzc2VkIGRhdGEgd2FzIGxlc3MgdGhhbiAzMkssIHRoZW4gYWxsIG9mIGl0IGlzIHVzZWQgdG8gaW5pdGlhbGl6ZQorICAgdGhlIGRpY3Rpb25hcnkuICBUaGUgZGVmbGF0ZSBvdXRwdXQgYml0IGJ1ZmZlciBpcyBhbHNvIGluaXRpYWxpemVkIHdpdGggdGhlCisgICBsYXN0IGJpdHMgZnJvbSB0aGUgb3JpZ2luYWwgZGVmbGF0ZSBzdHJlYW0uICBGcm9tIGhlcmUgb24sIHRoZSBkYXRhIHRvCisgICBhcHBlbmQgaXMgc2ltcGx5IGNvbXByZXNzZWQgdXNpbmcgZGVmbGF0ZSwgYW5kIHdyaXR0ZW4gdG8gdGhlIGd6aXAgZmlsZS4KKyAgIFdoZW4gdGhhdCBpcyBjb21wbGV0ZSwgdGhlIG5ldyBDUkMtMzIgYW5kIHVuY29tcHJlc3NlZCBsZW5ndGggYXJlIHdyaXR0ZW4KKyAgIGFzIHRoZSB0cmFpbGVyIG9mIHRoZSBnemlwIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJ6bGliLmgiCisKKyNkZWZpbmUgbG9jYWwgc3RhdGljCisjZGVmaW5lIExHQ0hVTksgMTQKKyNkZWZpbmUgQ0hVTksgKDFVIDw8IExHQ0hVTkspCisjZGVmaW5lIERTSVpFIDMyNzY4VQorCisvKiBwcmludCBhbiBlcnJvciBtZXNzYWdlIGFuZCB0ZXJtaW5hdGUgd2l0aCBleHRyZW1lIHByZWp1ZGljZSAqLworbG9jYWwgdm9pZCBieWUoY2hhciAqbXNnMSwgY2hhciAqbXNnMikKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgImd6YXBwZW5kIGVycm9yOiAlcyVzXG4iLCBtc2cxLCBtc2cyKTsKKyAgICBleGl0KDEpOworfQorCisvKiByZXR1cm4gdGhlIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIG9mIGEgYW5kIGIgdXNpbmcgRXVjbGlkJ3MgYWxnb3JpdGhtLAorICAgbW9kaWZpZWQgdG8gYmUgZmFzdCB3aGVuIG9uZSBhcmd1bWVudCBtdWNoIGdyZWF0ZXIgdGhhbiB0aGUgb3RoZXIsIGFuZAorICAgY29kZWQgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgc3dhcHBpbmcgKi8KK2xvY2FsIHVuc2lnbmVkIGdjZCh1bnNpZ25lZCBhLCB1bnNpZ25lZCBiKQoreworICAgIHVuc2lnbmVkIGM7CisKKyAgICB3aGlsZSAoYSAmJiBiKQorICAgICAgICBpZiAoYSA+IGIpIHsKKyAgICAgICAgICAgIGMgPSBiOworICAgICAgICAgICAgd2hpbGUgKGEgLSBjID49IGMpCisgICAgICAgICAgICAgICAgYyA8PD0gMTsKKyAgICAgICAgICAgIGEgLT0gYzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGMgPSBhOworICAgICAgICAgICAgd2hpbGUgKGIgLSBjID49IGMpCisgICAgICAgICAgICAgICAgYyA8PD0gMTsKKyAgICAgICAgICAgIGIgLT0gYzsKKyAgICAgICAgfQorICAgIHJldHVybiBhICsgYjsKK30KKworLyogcm90YXRlIGxpc3RbMC4ubGVuLTFdIGxlZnQgYnkgcm90IHBvc2l0aW9ucywgaW4gcGxhY2UgKi8KK2xvY2FsIHZvaWQgcm90YXRlKHVuc2lnbmVkIGNoYXIgKmxpc3QsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgcm90KQoreworICAgIHVuc2lnbmVkIGNoYXIgdG1wOworICAgIHVuc2lnbmVkIGN5Y2xlczsKKyAgICB1bnNpZ25lZCBjaGFyICpzdGFydCwgKmxhc3QsICp0bywgKmZyb207CisKKyAgICAvKiBub3JtYWxpemUgcm90IGFuZCBoYW5kbGUgZGVnZW5lcmF0ZSBjYXNlcyAqLworICAgIGlmIChsZW4gPCAyKSByZXR1cm47CisgICAgaWYgKHJvdCA+PSBsZW4pIHJvdCAlPSBsZW47CisgICAgaWYgKHJvdCA9PSAwKSByZXR1cm47CisKKyAgICAvKiBwb2ludGVyIHRvIGxhc3QgZW50cnkgaW4gbGlzdCAqLworICAgIGxhc3QgPSBsaXN0ICsgKGxlbiAtIDEpOworCisgICAgLyogZG8gc2ltcGxlIGxlZnQgc2hpZnQgYnkgb25lICovCisgICAgaWYgKHJvdCA9PSAxKSB7CisgICAgICAgIHRtcCA9ICpsaXN0OworICAgICAgICBtZW1jcHkobGlzdCwgbGlzdCArIDEsIGxlbiAtIDEpOworICAgICAgICAqbGFzdCA9IHRtcDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIGRvIHNpbXBsZSByaWdodCBzaGlmdCBieSBvbmUgKi8KKyAgICBpZiAocm90ID09IGxlbiAtIDEpIHsKKyAgICAgICAgdG1wID0gKmxhc3Q7CisgICAgICAgIG1lbW1vdmUobGlzdCArIDEsIGxpc3QsIGxlbiAtIDEpOworICAgICAgICAqbGlzdCA9IHRtcDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIG90aGVyd2lzZSBkbyByb3RhdGUgYXMgYSBzZXQgb2YgY3ljbGVzIGluIHBsYWNlICovCisgICAgY3ljbGVzID0gZ2NkKGxlbiwgcm90KTsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGN5Y2xlcyAqLworICAgIGRvIHsKKyAgICAgICAgc3RhcnQgPSBmcm9tID0gbGlzdCArIGN5Y2xlczsgICAvKiBzdGFydCBpbmRleCBpcyBhcmJpdHJhcnkgKi8KKyAgICAgICAgdG1wID0gKmZyb207ICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIGVudHJ5IHRvIGJlIG92ZXJ3cml0dGVuICovCisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIHRvID0gZnJvbTsgICAgICAgICAgICAgICAgICAvKiBuZXh0IHN0ZXAgaW4gY3ljbGUgKi8KKyAgICAgICAgICAgIGZyb20gKz0gcm90OyAgICAgICAgICAgICAgICAvKiBnbyByaWdodCByb3QgcG9zaXRpb25zICovCisgICAgICAgICAgICBpZiAoZnJvbSA+IGxhc3QpIGZyb20gLT0gbGVuOyAgIC8qIChwb2ludGVyIGJldHRlciBub3Qgd3JhcCkgKi8KKyAgICAgICAgICAgIGlmIChmcm9tID09IHN0YXJ0KSBicmVhazsgICAvKiBhbGwgYnV0IG9uZSBzaGlmdGVkICovCisgICAgICAgICAgICAqdG8gPSAqZnJvbTsgICAgICAgICAgICAgICAgLyogc2hpZnQgbGVmdCAqLworICAgICAgICB9CisgICAgICAgICp0byA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgLyogY29tcGxldGUgdGhlIGNpcmNsZSAqLworICAgIH0gd2hpbGUgKC0tY3ljbGVzKTsKK30KKworLyogc3RydWN0dXJlIGZvciBnemlwIGZpbGUgcmVhZCBvcGVyYXRpb25zICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGZkOyAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGUgZGVzY3JpcHRvciAqLworICAgIGludCBzaXplOyAgICAgICAgICAgICAgICAgICAvKiAxIDw8IHNpemUgaXMgYnl0ZXMgaW4gYnVmICovCisgICAgdW5zaWduZWQgbGVmdDsgICAgICAgICAgICAgIC8qIGJ5dGVzIGF2YWlsYWJsZSBhdCBuZXh0ICovCisgICAgdW5zaWduZWQgY2hhciAqYnVmOyAgICAgICAgIC8qIGJ1ZmZlciAqLworICAgIHpfY29uc3QgdW5zaWduZWQgY2hhciAqbmV4dDsgICAgLyogbmV4dCBieXRlIGluIGJ1ZmZlciAqLworICAgIGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgICAvKiBmaWxlIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzICovCit9IGZpbGU7CisKKy8qIHJlbG9hZCBidWZmZXIgKi8KK2xvY2FsIGludCByZWFkaW4oZmlsZSAqaW4pCit7CisgICAgaW50IGxlbjsKKworICAgIGxlbiA9IHJlYWQoaW4tPmZkLCBpbi0+YnVmLCAxIDw8IGluLT5zaXplKTsKKyAgICBpZiAobGVuID09IC0xKSBieWUoImVycm9yIHJlYWRpbmcgIiwgaW4tPm5hbWUpOworICAgIGluLT5sZWZ0ID0gKHVuc2lnbmVkKWxlbjsKKyAgICBpbi0+bmV4dCA9IGluLT5idWY7CisgICAgcmV0dXJuIGxlbjsKK30KKworLyogcmVhZCBmcm9tIGZpbGUgaW4sIGV4aXQgaWYgZW5kLW9mLWZpbGUgKi8KK2xvY2FsIGludCByZWFkbW9yZShmaWxlICppbikKK3sKKyAgICBpZiAocmVhZGluKGluKSA9PSAwKSBieWUoInVuZXhwZWN0ZWQgZW5kIG9mICIsIGluLT5uYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSByZWFkMShpbikgKGluLT5sZWZ0ID09IDAgPyByZWFkbW9yZShpbikgOiAwLCBcCisgICAgICAgICAgICAgICAgICAgaW4tPmxlZnQtLSwgKihpbi0+bmV4dCkrKykKKworLyogc2tpcCBvdmVyIG4gYnl0ZXMgb2YgaW4gKi8KK2xvY2FsIHZvaWQgc2tpcChmaWxlICppbiwgdW5zaWduZWQgbikKK3sKKyAgICB1bnNpZ25lZCBieXBhc3M7CisKKyAgICBpZiAobiA+IGluLT5sZWZ0KSB7CisgICAgICAgIG4gLT0gaW4tPmxlZnQ7CisgICAgICAgIGJ5cGFzcyA9IG4gJiB+KCgxVSA8PCBpbi0+c2l6ZSkgLSAxKTsKKyAgICAgICAgaWYgKGJ5cGFzcykgeworICAgICAgICAgICAgaWYgKGxzZWVrKGluLT5mZCwgKG9mZl90KWJ5cGFzcywgU0VFS19DVVIpID09IC0xKQorICAgICAgICAgICAgICAgIGJ5ZSgic2Vla2luZyAiLCBpbi0+bmFtZSk7CisgICAgICAgICAgICBuIC09IGJ5cGFzczsKKyAgICAgICAgfQorICAgICAgICByZWFkbW9yZShpbik7CisgICAgICAgIGlmIChuID4gaW4tPmxlZnQpCisgICAgICAgICAgICBieWUoInVuZXhwZWN0ZWQgZW5kIG9mICIsIGluLT5uYW1lKTsKKyAgICB9CisgICAgaW4tPmxlZnQgLT0gbjsKKyAgICBpbi0+bmV4dCArPSBuOworfQorCisvKiByZWFkIGEgZm91ci1ieXRlIHVuc2lnbmVkIGludGVnZXIsIGxpdHRsZS1lbmRpYW4sIGZyb20gaW4gKi8KK3Vuc2lnbmVkIGxvbmcgcmVhZDQoZmlsZSAqaW4pCit7CisgICAgdW5zaWduZWQgbG9uZyB2YWw7CisKKyAgICB2YWwgPSByZWFkMShpbik7CisgICAgdmFsICs9ICh1bnNpZ25lZClyZWFkMShpbikgPDwgODsKKyAgICB2YWwgKz0gKHVuc2lnbmVkIGxvbmcpcmVhZDEoaW4pIDw8IDE2OworICAgIHZhbCArPSAodW5zaWduZWQgbG9uZylyZWFkMShpbikgPDwgMjQ7CisgICAgcmV0dXJuIHZhbDsKK30KKworLyogc2tpcCBvdmVyIGd6aXAgaGVhZGVyICovCitsb2NhbCB2b2lkIGd6aGVhZGVyKGZpbGUgKmluKQoreworICAgIGludCBmbGFnczsKKyAgICB1bnNpZ25lZCBuOworCisgICAgaWYgKHJlYWQxKGluKSAhPSAzMSB8fCByZWFkMShpbikgIT0gMTM5KSBieWUoaW4tPm5hbWUsICIgbm90IGEgZ3ppcCBmaWxlIik7CisgICAgaWYgKHJlYWQxKGluKSAhPSA4KSBieWUoInVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIGluIiwgaW4tPm5hbWUpOworICAgIGZsYWdzID0gcmVhZDEoaW4pOworICAgIGlmIChmbGFncyAmIDB4ZTApIGJ5ZSgidW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0IGluIiwgaW4tPm5hbWUpOworICAgIHNraXAoaW4sIDYpOworICAgIGlmIChmbGFncyAmIDQpIHsKKyAgICAgICAgbiA9IHJlYWQxKGluKTsKKyAgICAgICAgbiArPSAodW5zaWduZWQpKHJlYWQxKGluKSkgPDwgODsKKyAgICAgICAgc2tpcChpbiwgbik7CisgICAgfQorICAgIGlmIChmbGFncyAmIDgpIHdoaWxlIChyZWFkMShpbikgIT0gMCkgOworICAgIGlmIChmbGFncyAmIDE2KSB3aGlsZSAocmVhZDEoaW4pICE9IDApIDsKKyAgICBpZiAoZmxhZ3MgJiAyKSBza2lwKGluLCAyKTsKK30KKworLyogZGVjb21wcmVzcyBnemlwIGZpbGUgIm5hbWUiLCByZXR1cm4gc3RybSB3aXRoIGEgZGVmbGF0ZSBzdHJlYW0gcmVhZHkgdG8KKyAgIGNvbnRpbnVlIGNvbXByZXNzaW9uIG9mIHRoZSBkYXRhIGluIHRoZSBnemlwIGZpbGUsIGFuZCByZXR1cm4gYSBmaWxlCisgICBkZXNjcmlwdG9yIHBvaW50aW5nIHRvIHdoZXJlIHRvIHdyaXRlIHRoZSBjb21wcmVzc2VkIGRhdGEgLS0gdGhlIGRlZmxhdGUKKyAgIHN0cmVhbSBpcyBpbml0aWFsaXplZCB0byBjb21wcmVzcyB1c2luZyBsZXZlbCAibGV2ZWwiICovCitsb2NhbCBpbnQgZ3pzY2FuKGNoYXIgKm5hbWUsIHpfc3RyZWFtICpzdHJtLCBpbnQgbGV2ZWwpCit7CisgICAgaW50IHJldCwgbGFzdGJpdCwgbGVmdCwgZnVsbDsKKyAgICB1bnNpZ25lZCBoYXZlOworICAgIHVuc2lnbmVkIGxvbmcgY3JjLCB0b3Q7CisgICAgdW5zaWduZWQgY2hhciAqd2luZG93OworICAgIG9mZl90IGxhc3RvZmYsIGVuZDsKKyAgICBmaWxlIGd6OworCisgICAgLyogb3BlbiBnemlwIGZpbGUgKi8KKyAgICBnei5uYW1lID0gbmFtZTsKKyAgICBnei5mZCA9IG9wZW4obmFtZSwgT19SRFdSLCAwKTsKKyAgICBpZiAoZ3ouZmQgPT0gLTEpIGJ5ZSgiY2Fubm90IG9wZW4gIiwgbmFtZSk7CisgICAgZ3ouYnVmID0gbWFsbG9jKENIVU5LKTsKKyAgICBpZiAoZ3ouYnVmID09IE5VTEwpIGJ5ZSgib3V0IG9mIG1lbW9yeSIsICIiKTsKKyAgICBnei5zaXplID0gTEdDSFVOSzsKKyAgICBnei5sZWZ0ID0gMDsKKworICAgIC8qIHNraXAgZ3ppcCBoZWFkZXIgKi8KKyAgICBnemhlYWRlcigmZ3opOworCisgICAgLyogcHJlcGFyZSB0byBkZWNvbXByZXNzICovCisgICAgd2luZG93ID0gbWFsbG9jKERTSVpFKTsKKyAgICBpZiAod2luZG93ID09IE5VTEwpIGJ5ZSgib3V0IG9mIG1lbW9yeSIsICIiKTsKKyAgICBzdHJtLT56YWxsb2MgPSBaX05VTEw7CisgICAgc3RybS0+emZyZWUgPSBaX05VTEw7CisgICAgc3RybS0+b3BhcXVlID0gWl9OVUxMOworICAgIHJldCA9IGluZmxhdGVJbml0MihzdHJtLCAtMTUpOworICAgIGlmIChyZXQgIT0gWl9PSykgYnllKCJvdXQgb2YgbWVtb3J5IiwgIiBvciBsaWJyYXJ5IG1pc21hdGNoIik7CisKKyAgICAvKiBkZWNvbXByZXNzIHRoZSBkZWZsYXRlIHN0cmVhbSwgc2F2aW5nIGFwcGVuZCBpbmZvcm1hdGlvbiAqLworICAgIGxhc3RiaXQgPSAwOworICAgIGxhc3RvZmYgPSBsc2Vlayhnei5mZCwgMEwsIFNFRUtfQ1VSKSAtIGd6LmxlZnQ7CisgICAgbGVmdCA9IDA7CisgICAgc3RybS0+YXZhaWxfaW4gPSBnei5sZWZ0OworICAgIHN0cm0tPm5leHRfaW4gPSBnei5uZXh0OworICAgIGNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOworICAgIGhhdmUgPSBmdWxsID0gMDsKKyAgICBkbyB7CisgICAgICAgIC8qIGlmIG5lZWRlZCwgZ2V0IG1vcmUgaW5wdXQgKi8KKyAgICAgICAgaWYgKHN0cm0tPmF2YWlsX2luID09IDApIHsKKyAgICAgICAgICAgIHJlYWRtb3JlKCZneik7CisgICAgICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IGd6LmxlZnQ7CisgICAgICAgICAgICBzdHJtLT5uZXh0X2luID0gZ3oubmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHNldCB1cCBvdXRwdXQgdG8gbmV4dCBhdmFpbGFibGUgc2VjdGlvbiBvZiBzbGlkaW5nIHdpbmRvdyAqLworICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPSBEU0laRSAtIGhhdmU7CisgICAgICAgIHN0cm0tPm5leHRfb3V0ID0gd2luZG93ICsgaGF2ZTsKKworICAgICAgICAvKiBpbmZsYXRlIGFuZCBjaGVjayBmb3IgZXJyb3JzICovCisgICAgICAgIHJldCA9IGluZmxhdGUoc3RybSwgWl9CTE9DSyk7CisgICAgICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRVJST1IpIGJ5ZSgiaW50ZXJuYWwgc3RyZWFtIGVycm9yISIsICIiKTsKKyAgICAgICAgaWYgKHJldCA9PSBaX01FTV9FUlJPUikgYnllKCJvdXQgb2YgbWVtb3J5IiwgIiIpOworICAgICAgICBpZiAocmV0ID09IFpfREFUQV9FUlJPUikKKyAgICAgICAgICAgIGJ5ZSgiaW52YWxpZCBjb21wcmVzc2VkIGRhdGEtLWZvcm1hdCB2aW9sYXRlZCBpbiIsIG5hbWUpOworCisgICAgICAgIC8qIHVwZGF0ZSBjcmMgYW5kIHNsaWRpbmcgd2luZG93IHBvaW50ZXIgKi8KKyAgICAgICAgY3JjID0gY3JjMzIoY3JjLCB3aW5kb3cgKyBoYXZlLCBEU0laRSAtIGhhdmUgLSBzdHJtLT5hdmFpbF9vdXQpOworICAgICAgICBpZiAoc3RybS0+YXZhaWxfb3V0KQorICAgICAgICAgICAgaGF2ZSA9IERTSVpFIC0gc3RybS0+YXZhaWxfb3V0OworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGhhdmUgPSAwOworICAgICAgICAgICAgZnVsbCA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvKiBwcm9jZXNzIGVuZCBvZiBibG9jayAqLworICAgICAgICBpZiAoc3RybS0+ZGF0YV90eXBlICYgMTI4KSB7CisgICAgICAgICAgICBpZiAoc3RybS0+ZGF0YV90eXBlICYgNjQpCisgICAgICAgICAgICAgICAgbGVmdCA9IHN0cm0tPmRhdGFfdHlwZSAmIDB4MWY7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsYXN0Yml0ID0gc3RybS0+ZGF0YV90eXBlICYgMHgxZjsKKyAgICAgICAgICAgICAgICBsYXN0b2ZmID0gbHNlZWsoZ3ouZmQsIDBMLCBTRUVLX0NVUikgLSBzdHJtLT5hdmFpbF9pbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHJldCAhPSBaX1NUUkVBTV9FTkQpOworICAgIGluZmxhdGVFbmQoc3RybSk7CisgICAgZ3oubGVmdCA9IHN0cm0tPmF2YWlsX2luOworICAgIGd6Lm5leHQgPSBzdHJtLT5uZXh0X2luOworCisgICAgLyogc2F2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhICovCisgICAgZW5kID0gbHNlZWsoZ3ouZmQsIDBMLCBTRUVLX0NVUikgLSBnei5sZWZ0OworCisgICAgLyogY2hlY2sgZ3ppcCB0cmFpbGVyIGFuZCBzYXZlIHRvdGFsIGZvciBkZWZsYXRlICovCisgICAgaWYgKGNyYyAhPSByZWFkNCgmZ3opKQorICAgICAgICBieWUoImludmFsaWQgY29tcHJlc3NlZCBkYXRhLS1jcmMgbWlzbWF0Y2ggaW4gIiwgbmFtZSk7CisgICAgdG90ID0gc3RybS0+dG90YWxfb3V0OworICAgIGlmICgodG90ICYgMHhmZmZmZmZmZlVMKSAhPSByZWFkNCgmZ3opKQorICAgICAgICBieWUoImludmFsaWQgY29tcHJlc3NlZCBkYXRhLS1sZW5ndGggbWlzbWF0Y2ggaW4iLCBuYW1lKTsKKworICAgIC8qIGlmIG5vdCBhdCBlbmQgb2YgZmlsZSwgd2FybiAqLworICAgIGlmIChnei5sZWZ0IHx8IHJlYWRpbigmZ3opKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJnemFwcGVuZCB3YXJuaW5nOiBqdW5rIGF0IGVuZCBvZiBnemlwIGZpbGUgb3ZlcndyaXR0ZW5cbiIpOworCisgICAgLyogY2xlYXIgbGFzdCBibG9jayBiaXQgKi8KKyAgICBsc2Vlayhnei5mZCwgbGFzdG9mZiAtIChsYXN0Yml0ICE9IDApLCBTRUVLX1NFVCk7CisgICAgaWYgKHJlYWQoZ3ouZmQsIGd6LmJ1ZiwgMSkgIT0gMSkgYnllKCJyZWFkaW5nIGFmdGVyIHNlZWsgb24gIiwgbmFtZSk7CisgICAgKmd6LmJ1ZiA9ICh1bnNpZ25lZCBjaGFyKSgqZ3ouYnVmIF4gKDEgPDwgKCg4IC0gbGFzdGJpdCkgJiA3KSkpOworICAgIGxzZWVrKGd6LmZkLCAtMUwsIFNFRUtfQ1VSKTsKKyAgICBpZiAod3JpdGUoZ3ouZmQsIGd6LmJ1ZiwgMSkgIT0gMSkgYnllKCJ3cml0aW5nIGFmdGVyIHNlZWsgdG8gIiwgbmFtZSk7CisKKyAgICAvKiBpZiB3aW5kb3cgd3JhcHBlZCwgYnVpbGQgZGljdGlvbmFyeSBmcm9tIHdpbmRvdyBieSByb3RhdGluZyAqLworICAgIGlmIChmdWxsKSB7CisgICAgICAgIHJvdGF0ZSh3aW5kb3csIERTSVpFLCBoYXZlKTsKKyAgICAgICAgaGF2ZSA9IERTSVpFOworICAgIH0KKworICAgIC8qIHNldCB1cCBkZWZsYXRlIHN0cmVhbSB3aXRoIHdpbmRvdywgY3JjLCB0b3RhbF9pbiwgYW5kIGxlZnRvdmVyIGJpdHMgKi8KKyAgICByZXQgPSBkZWZsYXRlSW5pdDIoc3RybSwgbGV2ZWwsIFpfREVGTEFURUQsIC0xNSwgOCwgWl9ERUZBVUxUX1NUUkFURUdZKTsKKyAgICBpZiAocmV0ICE9IFpfT0spIGJ5ZSgib3V0IG9mIG1lbW9yeSIsICIiKTsKKyAgICBkZWZsYXRlU2V0RGljdGlvbmFyeShzdHJtLCB3aW5kb3csIGhhdmUpOworICAgIHN0cm0tPmFkbGVyID0gY3JjOworICAgIHN0cm0tPnRvdGFsX2luID0gdG90OworICAgIGlmIChsZWZ0KSB7CisgICAgICAgIGxzZWVrKGd6LmZkLCAtLWVuZCwgU0VFS19TRVQpOworICAgICAgICBpZiAocmVhZChnei5mZCwgZ3ouYnVmLCAxKSAhPSAxKSBieWUoInJlYWRpbmcgYWZ0ZXIgc2VlayBvbiAiLCBuYW1lKTsKKyAgICAgICAgZGVmbGF0ZVByaW1lKHN0cm0sIDggLSBsZWZ0LCAqZ3ouYnVmKTsKKyAgICB9CisgICAgbHNlZWsoZ3ouZmQsIGVuZCwgU0VFS19TRVQpOworCisgICAgLyogY2xlYW4gdXAgYW5kIHJldHVybiAqLworICAgIGZyZWUod2luZG93KTsKKyAgICBmcmVlKGd6LmJ1Zik7CisgICAgcmV0dXJuIGd6LmZkOworfQorCisvKiBhcHBlbmQgZmlsZSAibmFtZSIgdG8gZ3ppcCBmaWxlIGdkIHVzaW5nIGRlZmxhdGUgc3RyZWFtIHN0cm0gLS0gaWYgbGFzdAorICAgaXMgdHJ1ZSwgdGhlbiBmaW5pc2ggb2ZmIHRoZSBkZWZsYXRlIHN0cmVhbSBhdCB0aGUgZW5kICovCitsb2NhbCB2b2lkIGd6dGFjayhjaGFyICpuYW1lLCBpbnQgZ2QsIHpfc3RyZWFtICpzdHJtLCBpbnQgbGFzdCkKK3sKKyAgICBpbnQgZmQsIGxlbiwgcmV0OworICAgIHVuc2lnbmVkIGxlZnQ7CisgICAgdW5zaWduZWQgY2hhciAqaW4sICpvdXQ7CisKKyAgICAvKiBvcGVuIGZpbGUgdG8gY29tcHJlc3MgYW5kIGFwcGVuZCAqLworICAgIGZkID0gMDsKKyAgICBpZiAobmFtZSAhPSBOVUxMKSB7CisgICAgICAgIGZkID0gb3BlbihuYW1lLCBPX1JET05MWSwgMCk7CisgICAgICAgIGlmIChmZCA9PSAtMSkKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3phcHBlbmQgd2FybmluZzogJXMgbm90IGZvdW5kLCBza2lwcGluZyAuLi5cbiIsCisgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgIH0KKworICAgIC8qIGFsbG9jYXRlIGJ1ZmZlcnMgKi8KKyAgICBpbiA9IG1hbGxvYyhDSFVOSyk7CisgICAgb3V0ID0gbWFsbG9jKENIVU5LKTsKKyAgICBpZiAoaW4gPT0gTlVMTCB8fCBvdXQgPT0gTlVMTCkgYnllKCJvdXQgb2YgbWVtb3J5IiwgIiIpOworCisgICAgLyogY29tcHJlc3MgaW5wdXQgZmlsZSBhbmQgYXBwZW5kIHRvIGd6aXAgZmlsZSAqLworICAgIGRvIHsKKyAgICAgICAgLyogZ2V0IG1vcmUgaW5wdXQgKi8KKyAgICAgICAgbGVuID0gcmVhZChmZCwgaW4sIENIVU5LKTsKKyAgICAgICAgaWYgKGxlbiA9PSAtMSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICJnemFwcGVuZCB3YXJuaW5nOiBlcnJvciByZWFkaW5nICVzLCBza2lwcGluZyByZXN0IC4uLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICB9CisgICAgICAgIHN0cm0tPmF2YWlsX2luID0gKHVuc2lnbmVkKWxlbjsKKyAgICAgICAgc3RybS0+bmV4dF9pbiA9IGluOworICAgICAgICBpZiAobGVuKSBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBpbiwgKHVuc2lnbmVkKWxlbik7CisKKyAgICAgICAgLyogY29tcHJlc3MgYW5kIHdyaXRlIGFsbCBhdmFpbGFibGUgb3V0cHV0ICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN0cm0tPmF2YWlsX291dCA9IENIVU5LOworICAgICAgICAgICAgc3RybS0+bmV4dF9vdXQgPSBvdXQ7CisgICAgICAgICAgICByZXQgPSBkZWZsYXRlKHN0cm0sIGxhc3QgJiYgbGVuID09IDAgPyBaX0ZJTklTSCA6IFpfTk9fRkxVU0gpOworICAgICAgICAgICAgbGVmdCA9IENIVU5LIC0gc3RybS0+YXZhaWxfb3V0OworICAgICAgICAgICAgd2hpbGUgKGxlZnQpIHsKKyAgICAgICAgICAgICAgICBsZW4gPSB3cml0ZShnZCwgb3V0ICsgQ0hVTksgLSBzdHJtLT5hdmFpbF9vdXQgLSBsZWZ0LCBsZWZ0KTsKKyAgICAgICAgICAgICAgICBpZiAobGVuID09IC0xKSBieWUoIndyaXRpbmcgZ3ppcCBmaWxlIiwgIiIpOworICAgICAgICAgICAgICAgIGxlZnQgLT0gKHVuc2lnbmVkKWxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoc3RybS0+YXZhaWxfb3V0ID09IDAgJiYgcmV0ICE9IFpfU1RSRUFNX0VORCk7CisgICAgfSB3aGlsZSAobGVuICE9IDApOworCisgICAgLyogd3JpdGUgdHJhaWxlciBhZnRlciBsYXN0IGVudHJ5ICovCisgICAgaWYgKGxhc3QpIHsKKyAgICAgICAgZGVmbGF0ZUVuZChzdHJtKTsKKyAgICAgICAgb3V0WzBdID0gKHVuc2lnbmVkIGNoYXIpKHN0cm0tPmFkbGVyKTsKKyAgICAgICAgb3V0WzFdID0gKHVuc2lnbmVkIGNoYXIpKHN0cm0tPmFkbGVyID4+IDgpOworICAgICAgICBvdXRbMl0gPSAodW5zaWduZWQgY2hhcikoc3RybS0+YWRsZXIgPj4gMTYpOworICAgICAgICBvdXRbM10gPSAodW5zaWduZWQgY2hhcikoc3RybS0+YWRsZXIgPj4gMjQpOworICAgICAgICBvdXRbNF0gPSAodW5zaWduZWQgY2hhcikoc3RybS0+dG90YWxfaW4pOworICAgICAgICBvdXRbNV0gPSAodW5zaWduZWQgY2hhcikoc3RybS0+dG90YWxfaW4gPj4gOCk7CisgICAgICAgIG91dFs2XSA9ICh1bnNpZ25lZCBjaGFyKShzdHJtLT50b3RhbF9pbiA+PiAxNik7CisgICAgICAgIG91dFs3XSA9ICh1bnNpZ25lZCBjaGFyKShzdHJtLT50b3RhbF9pbiA+PiAyNCk7CisgICAgICAgIGxlbiA9IDg7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHJldCA9IHdyaXRlKGdkLCBvdXQgKyA4IC0gbGVuLCBsZW4pOworICAgICAgICAgICAgaWYgKHJldCA9PSAtMSkgYnllKCJ3cml0aW5nIGd6aXAgZmlsZSIsICIiKTsKKyAgICAgICAgICAgIGxlbiAtPSByZXQ7CisgICAgICAgIH0gd2hpbGUgKGxlbik7CisgICAgICAgIGNsb3NlKGdkKTsKKyAgICB9CisKKyAgICAvKiBjbGVhbiB1cCBhbmQgcmV0dXJuICovCisgICAgZnJlZShvdXQpOworICAgIGZyZWUoaW4pOworICAgIGlmIChmZCA+IDApIGNsb3NlKGZkKTsKK30KKworLyogcHJvY2VzcyB0aGUgY29tcHJlc3Npb24gbGV2ZWwgb3B0aW9uIGlmIHByZXNlbnQsIHNjYW4gdGhlIGd6aXAgZmlsZSwgYW5kCisgICBhcHBlbmQgdGhlIHNwZWNpZmllZCBmaWxlcywgb3IgYXBwZW5kIHRoZSBkYXRhIGZyb20gc3RkaW4gaWYgbm8gb3RoZXIgZmlsZQorICAgbmFtZXMgYXJlIHByb3ZpZGVkIG9uIHRoZSBjb21tYW5kIGxpbmUgLS0gdGhlIGd6aXAgZmlsZSBtdXN0IGJlIHdyaXRhYmxlCisgICBhbmQgc2Vla2FibGUgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgZ2QsIGxldmVsOworICAgIHpfc3RyZWFtIHN0cm07CisKKyAgICAvKiBpZ25vcmUgY29tbWFuZCBuYW1lICovCisgICAgYXJnYy0tOyBhcmd2Kys7CisKKyAgICAvKiBwcm92aWRlIHVzYWdlIGlmIG5vIGFyZ3VtZW50cyAqLworICAgIGlmICgqYXJndiA9PSBOVUxMKSB7CisgICAgICAgIHByaW50ZigKKyAgICAgICAgICAgICJnemFwcGVuZCAxLjIgKDExIE9jdCAyMDEyKSBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMTIgTWFyayBBZGxlclxuIgorICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcHJpbnRmKAorICAgICAgICAgICAgInVzYWdlOiBnemFwcGVuZCBbLWxldmVsXSBmaWxlLmd6IFsgYWRkdGhpcyBbIGFuZHRoaXMgLi4uIF1dXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogc2V0IGNvbXByZXNzaW9uIGxldmVsICovCisgICAgbGV2ZWwgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT047CisgICAgaWYgKGFyZ3ZbMF1bMF0gPT0gJy0nKSB7CisgICAgICAgIGlmIChhcmd2WzBdWzFdIDwgJzAnIHx8IGFyZ3ZbMF1bMV0gPiAnOScgfHwgYXJndlswXVsyXSAhPSAwKQorICAgICAgICAgICAgYnllKCJpbnZhbGlkIGNvbXByZXNzaW9uIGxldmVsIiwgIiIpOworICAgICAgICBsZXZlbCA9IGFyZ3ZbMF1bMV0gLSAnMCc7CisgICAgICAgIGlmICgqKythcmd2ID09IE5VTEwpIGJ5ZSgibm8gZ3ppcCBmaWxlIG5hbWUgYWZ0ZXIgb3B0aW9ucyIsICIiKTsKKyAgICB9CisKKyAgICAvKiBwcmVwYXJlIHRvIGFwcGVuZCB0byBnemlwIGZpbGUgKi8KKyAgICBnZCA9IGd6c2NhbigqYXJndisrLCAmc3RybSwgbGV2ZWwpOworCisgICAgLyogYXBwZW5kIGZpbGVzIG9uIGNvbW1hbmQgbGluZSwgb3IgZnJvbSBzdGRpbiBpZiBub25lICovCisgICAgaWYgKCphcmd2ID09IE5VTEwpCisgICAgICAgIGd6dGFjayhOVUxMLCBnZCwgJnN0cm0sIDEpOworICAgIGVsc2UKKyAgICAgICAgZG8geworICAgICAgICAgICAgZ3p0YWNrKCphcmd2LCBnZCwgJnN0cm0sIGFyZ3ZbMV0gPT0gTlVMTCk7CisgICAgICAgIH0gd2hpbGUgKCorK2FyZ3YgIT0gTlVMTCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS96bGliL3NyYy9leGFtcGxlcy9nempvaW4uYyBiL3psaWIvc3JjL2V4YW1wbGVzL2d6am9pbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZTgwOTgKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9leGFtcGxlcy9nempvaW4uYwpAQCAtMCwwICsxLDQ0OSBAQAorLyogZ3pqb2luIC0tIGNvbW1hbmQgdG8gam9pbiBnemlwIGZpbGVzIGludG8gb25lIGd6aXAgZmlsZQorCisgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAxMiBNYXJrIEFkbGVyLCBhbGwgcmlnaHRzIHJlc2VydmVkCisgIHZlcnNpb24gMS4yLCAxNCBBdWcgMjAxMgorCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9yIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorCisgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCisgIE1hcmsgQWRsZXIgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQorICovCisKKy8qCisgKiBDaGFuZ2UgaGlzdG9yeToKKyAqCisgKiAxLjAgIDExIERlYyAyMDA0ICAgICAtIEZpcnN0IHZlcnNpb24KKyAqIDEuMSAgMTIgSnVuIDIwMDUgICAgIC0gQ2hhbmdlZCBzc2l6ZV90IHRvIGxvbmcgZm9yIHBvcnRhYmlsaXR5CisgKiAxLjIgIDE0IEF1ZyAyMDEyICAgICAtIENsZWFuIHVwIGZvciB6X2NvbnN0IHVzYWdlCisgKi8KKworLyoKKyAgIGd6am9pbiB0YWtlcyBvbmUgb3IgbW9yZSBnemlwIGZpbGVzIG9uIHRoZSBjb21tYW5kIGxpbmUgYW5kIHdyaXRlcyBvdXQgYQorICAgc2luZ2xlIGd6aXAgZmlsZSB0aGF0IHdpbGwgdW5jb21wcmVzcyB0byB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUKKyAgIHVuY29tcHJlc3NlZCBkYXRhIGZyb20gdGhlIGluZGl2aWR1YWwgZ3ppcCBmaWxlcy4gIGd6am9pbiBkb2VzIHRoaXMgd2l0aG91dAorICAgaGF2aW5nIHRvIHJlY29tcHJlc3MgYW55IG9mIHRoZSBkYXRhIGFuZCB3aXRob3V0IGhhdmluZyB0byBjYWxjdWxhdGUgYSBuZXcKKyAgIGNyYzMyIGZvciB0aGUgY29uY2F0ZW5hdGVkIHVuY29tcHJlc3NlZCBkYXRhLiAgZ3pqb2luIGRvZXMgaG93ZXZlciBoYXZlIHRvCisgICBkZWNvbXByZXNzIGFsbCBvZiB0aGUgaW5wdXQgZGF0YSBpbiBvcmRlciB0byBmaW5kIHRoZSBiaXRzIGluIHRoZSBjb21wcmVzc2VkCisgICBkYXRhIHRoYXQgbmVlZCB0byBiZSBtb2RpZmllZCB0byBjb25jYXRlbmF0ZSB0aGUgc3RyZWFtcy4KKworICAgZ3pqb2luIGRvZXMgbm90IGRvIGFuIGludGVncml0eSBjaGVjayBvbiB0aGUgaW5wdXQgZ3ppcCBmaWxlcyBvdGhlciB0aGFuCisgICBjaGVja2luZyB0aGUgZ3ppcCBoZWFkZXIgYW5kIGRlY29tcHJlc3NpbmcgdGhlIGNvbXByZXNzZWQgZGF0YS4gIFRoZXkgYXJlCisgICBvdGhlcndpc2UgYXNzdW1lZCB0byBiZSBjb21wbGV0ZSBhbmQgY29ycmVjdC4KKworICAgRWFjaCBqb2ludCBiZXR3ZWVuIGd6aXAgZmlsZXMgcmVtb3ZlcyBhdCBsZWFzdCAxOCBieXRlcyBvZiBwcmV2aW91cyB0cmFpbGVyCisgICBhbmQgc3Vic2VxdWVudCBoZWFkZXIsIGFuZCBpbnNlcnRzIGFuIGF2ZXJhZ2Ugb2YgYWJvdXQgdGhyZWUgYnl0ZXMgdG8gdGhlCisgICBjb21wcmVzc2VkIGRhdGEgaW4gb3JkZXIgdG8gY29ubmVjdCB0aGUgc3RyZWFtcy4gIFRoZSBvdXRwdXQgZ3ppcCBmaWxlCisgICBoYXMgYSBtaW5pbWFsIHRlbi1ieXRlIGd6aXAgaGVhZGVyIHdpdGggbm8gZmlsZSBuYW1lIG9yIG1vZGlmaWNhdGlvbiB0aW1lLgorCisgICBUaGlzIHByb2dyYW0gd2FzIHdyaXR0ZW4gdG8gaWxsdXN0cmF0ZSB0aGUgdXNlIG9mIHRoZSBaX0JMT0NLIG9wdGlvbiBvZgorICAgaW5mbGF0ZSgpIGFuZCB0aGUgY3JjMzJfY29tYmluZSgpIGZ1bmN0aW9uLiAgZ3pqb2luIHdpbGwgbm90IGNvbXBpbGUgd2l0aAorICAgdmVyc2lvbnMgb2YgemxpYiBlYXJsaWVyIHRoYW4gMS4yLjMuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+ICAgICAgLyogZnB1dHMoKSwgZnByaW50ZigpLCBmd3JpdGUoKSwgcHV0YygpICovCisjaW5jbHVkZSA8c3RkbGliLmg+ICAgICAvKiBleGl0KCksIG1hbGxvYygpLCBmcmVlKCkgKi8KKyNpbmNsdWRlIDxmY250bC5oPiAgICAgIC8qIG9wZW4oKSAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPiAgICAgLyogY2xvc2UoKSwgcmVhZCgpLCBsc2VlaygpICovCisjaW5jbHVkZSAiemxpYi5oIgorICAgIC8qIGNyYzMyKCksIGNyYzMyX2NvbWJpbmUoKSwgaW5mbGF0ZUluaXQyKCksIGluZmxhdGUoKSwgaW5mbGF0ZUVuZCgpICovCisKKyNkZWZpbmUgbG9jYWwgc3RhdGljCisKKy8qIGV4aXQgd2l0aCBhbiBlcnJvciAocmV0dXJuIGEgdmFsdWUgdG8gYWxsb3cgdXNlIGluIGFuIGV4cHJlc3Npb24pICovCitsb2NhbCBpbnQgYmFpbChjaGFyICp3aHkxLCBjaGFyICp3aHkyKQoreworICAgIGZwcmludGYoc3RkZXJyLCAiZ3pqb2luIGVycm9yOiAlcyVzLCBvdXRwdXQgaW5jb21wbGV0ZVxuIiwgd2h5MSwgd2h5Mik7CisgICAgZXhpdCgxKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogLS0gc2ltcGxlIGJ1ZmZlcmVkIGZpbGUgaW5wdXQgd2l0aCBhY2Nlc3MgdG8gdGhlIGJ1ZmZlciAtLSAqLworCisjZGVmaW5lIENIVU5LIDMyNzY4ICAgICAgICAgLyogbXVzdCBiZSBhIHBvd2VyIG9mIHR3byBhbmQgZml0IGluIHVuc2lnbmVkICovCisKKy8qIGJpbiBidWZmZXJlZCBpbnB1dCBmaWxlIHR5cGUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjaGFyICpuYW1lOyAgICAgICAgICAgICAvKiBuYW1lIG9mIGZpbGUgZm9yIGVycm9yIG1lc3NhZ2VzICovCisgICAgaW50IGZkOyAgICAgICAgICAgICAgICAgLyogZmlsZSBkZXNjcmlwdG9yICovCisgICAgdW5zaWduZWQgbGVmdDsgICAgICAgICAgLyogYnl0ZXMgcmVtYWluaW5nIGF0IG5leHQgKi8KKyAgICB1bnNpZ25lZCBjaGFyICpuZXh0OyAgICAvKiBuZXh0IGJ5dGUgdG8gcmVhZCAqLworICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsgICAgIC8qIGFsbG9jYXRlZCBidWZmZXIgb2YgbGVuZ3RoIENIVU5LICovCit9IGJpbjsKKworLyogY2xvc2UgYSBidWZmZXJlZCBmaWxlIGFuZCBmcmVlIGFsbG9jYXRlZCBtZW1vcnkgKi8KK2xvY2FsIHZvaWQgYmNsb3NlKGJpbiAqaW4pCit7CisgICAgaWYgKGluICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGluLT5mZCAhPSAtMSkKKyAgICAgICAgICAgIGNsb3NlKGluLT5mZCk7CisgICAgICAgIGlmIChpbi0+YnVmICE9IE5VTEwpCisgICAgICAgICAgICBmcmVlKGluLT5idWYpOworICAgICAgICBmcmVlKGluKTsKKyAgICB9Cit9CisKKy8qIG9wZW4gYSBidWZmZXJlZCBmaWxlIGZvciBpbnB1dCwgcmV0dXJuIGEgcG9pbnRlciB0byB0eXBlIGJpbiwgb3IgTlVMTCBvbgorICAgZmFpbHVyZSAqLworbG9jYWwgYmluICpib3BlbihjaGFyICpuYW1lKQoreworICAgIGJpbiAqaW47CisKKyAgICBpbiA9IG1hbGxvYyhzaXplb2YoYmluKSk7CisgICAgaWYgKGluID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGluLT5idWYgPSBtYWxsb2MoQ0hVTkspOworICAgIGluLT5mZCA9IG9wZW4obmFtZSwgT19SRE9OTFksIDApOworICAgIGlmIChpbi0+YnVmID09IE5VTEwgfHwgaW4tPmZkID09IC0xKSB7CisgICAgICAgIGJjbG9zZShpbik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpbi0+bGVmdCA9IDA7CisgICAgaW4tPm5leHQgPSBpbi0+YnVmOworICAgIGluLT5uYW1lID0gbmFtZTsKKyAgICByZXR1cm4gaW47Cit9CisKKy8qIGxvYWQgYnVmZmVyIGZyb20gZmlsZSwgcmV0dXJuIC0xIG9uIHJlYWQgZXJyb3IsIDAgb3IgMSBvbiBzdWNjZXNzLCB3aXRoCisgICAxIGluZGljYXRpbmcgdGhhdCBlbmQtb2YtZmlsZSB3YXMgcmVhY2hlZCAqLworbG9jYWwgaW50IGJsb2FkKGJpbiAqaW4pCit7CisgICAgbG9uZyBsZW47CisKKyAgICBpZiAoaW4gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChpbi0+bGVmdCAhPSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpbi0+bmV4dCA9IGluLT5idWY7CisgICAgZG8geworICAgICAgICBsZW4gPSAobG9uZylyZWFkKGluLT5mZCwgaW4tPmJ1ZiArIGluLT5sZWZ0LCBDSFVOSyAtIGluLT5sZWZ0KTsKKyAgICAgICAgaWYgKGxlbiA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGluLT5sZWZ0ICs9ICh1bnNpZ25lZClsZW47CisgICAgfSB3aGlsZSAobGVuICE9IDAgJiYgaW4tPmxlZnQgPCBDSFVOSyk7CisgICAgcmV0dXJuIGxlbiA9PSAwID8gMSA6IDA7Cit9CisKKy8qIGdldCBhIGJ5dGUgZnJvbSB0aGUgZmlsZSwgYmFpbCBpZiBlbmQgb2YgZmlsZSAqLworI2RlZmluZSBiZ2V0KGluKSAoaW4tPmxlZnQgPyAwIDogYmxvYWQoaW4pLCBcCisgICAgICAgICAgICAgICAgICBpbi0+bGVmdCA/IChpbi0+bGVmdC0tLCAqKGluLT5uZXh0KSsrKSA6IFwKKyAgICAgICAgICAgICAgICAgICAgYmFpbCgidW5leHBlY3RlZCBlbmQgb2YgZmlsZSBvbiAiLCBpbi0+bmFtZSkpCisKKy8qIGdldCBhIGZvdXItYnl0ZSBsaXR0bGUtZW5kaWFuIHVuc2lnbmVkIGludGVnZXIgZnJvbSBmaWxlICovCitsb2NhbCB1bnNpZ25lZCBsb25nIGJnZXQ0KGJpbiAqaW4pCit7CisgICAgdW5zaWduZWQgbG9uZyB2YWw7CisKKyAgICB2YWwgPSBiZ2V0KGluKTsKKyAgICB2YWwgKz0gKHVuc2lnbmVkIGxvbmcpKGJnZXQoaW4pKSA8PCA4OworICAgIHZhbCArPSAodW5zaWduZWQgbG9uZykoYmdldChpbikpIDw8IDE2OworICAgIHZhbCArPSAodW5zaWduZWQgbG9uZykoYmdldChpbikpIDw8IDI0OworICAgIHJldHVybiB2YWw7Cit9CisKKy8qIHNraXAgYnl0ZXMgaW4gZmlsZSAqLworbG9jYWwgdm9pZCBic2tpcChiaW4gKmluLCB1bnNpZ25lZCBza2lwKQoreworICAgIC8qIGNoZWNrIHBvaW50ZXIgKi8KKyAgICBpZiAoaW4gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogZWFzeSBjYXNlIC0tIHNraXAgYnl0ZXMgaW4gYnVmZmVyICovCisgICAgaWYgKHNraXAgPD0gaW4tPmxlZnQpIHsKKyAgICAgICAgaW4tPmxlZnQgLT0gc2tpcDsKKyAgICAgICAgaW4tPm5leHQgKz0gc2tpcDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIHNraXAgd2hhdCdzIGluIGJ1ZmZlciwgZGlzY2FyZCBidWZmZXIgY29udGVudHMgKi8KKyAgICBza2lwIC09IGluLT5sZWZ0OworICAgIGluLT5sZWZ0ID0gMDsKKworICAgIC8qIHNlZWsgcGFzdCBtdWx0aXBsZXMgb2YgQ0hVTksgYnl0ZXMgKi8KKyAgICBpZiAoc2tpcCA+IENIVU5LKSB7CisgICAgICAgIHVuc2lnbmVkIGxlZnQ7CisKKyAgICAgICAgbGVmdCA9IHNraXAgJiAoQ0hVTksgLSAxKTsKKyAgICAgICAgaWYgKGxlZnQgPT0gMCkgeworICAgICAgICAgICAgLyogZXhhY3QgbnVtYmVyIG9mIGNodW5rczogc2VlayBhbGwgdGhlIHdheSBtaW51cyBvbmUgYnl0ZSB0byBjaGVjaworICAgICAgICAgICAgICAgZm9yIGVuZC1vZi1maWxlIHdpdGggYSByZWFkICovCisgICAgICAgICAgICBsc2Vlayhpbi0+ZmQsIHNraXAgLSAxLCBTRUVLX0NVUik7CisgICAgICAgICAgICBpZiAocmVhZChpbi0+ZmQsIGluLT5idWYsIDEpICE9IDEpCisgICAgICAgICAgICAgICAgYmFpbCgidW5leHBlY3RlZCBlbmQgb2YgZmlsZSBvbiAiLCBpbi0+bmFtZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvKiBza2lwIHRoZSBpbnRlZ3JhbCBjaHVua3MsIHVwZGF0ZSBza2lwIHdpdGggcmVtYWluZGVyICovCisgICAgICAgIGxzZWVrKGluLT5mZCwgc2tpcCAtIGxlZnQsIFNFRUtfQ1VSKTsKKyAgICAgICAgc2tpcCA9IGxlZnQ7CisgICAgfQorCisgICAgLyogcmVhZCBtb3JlIGlucHV0IGFuZCBza2lwIHJlbWFpbmRlciAqLworICAgIGJsb2FkKGluKTsKKyAgICBpZiAoc2tpcCA+IGluLT5sZWZ0KQorICAgICAgICBiYWlsKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIG9uICIsIGluLT5uYW1lKTsKKyAgICBpbi0+bGVmdCAtPSBza2lwOworICAgIGluLT5uZXh0ICs9IHNraXA7Cit9CisKKy8qIC0tIGVuZCBvZiBidWZmZXJlZCBpbnB1dCBmdW5jdGlvbnMgLS0gKi8KKworLyogc2tpcCB0aGUgZ3ppcCBoZWFkZXIgZnJvbSBmaWxlIGluICovCitsb2NhbCB2b2lkIGd6aGVhZChiaW4gKmluKQoreworICAgIGludCBmbGFnczsKKworICAgIC8qIHZlcmlmeSBnemlwIG1hZ2ljIGhlYWRlciBhbmQgY29tcHJlc3Npb24gbWV0aG9kICovCisgICAgaWYgKGJnZXQoaW4pICE9IDB4MWYgfHwgYmdldChpbikgIT0gMHg4YiB8fCBiZ2V0KGluKSAhPSA4KQorICAgICAgICBiYWlsKGluLT5uYW1lLCAiIGlzIG5vdCBhIHZhbGlkIGd6aXAgZmlsZSIpOworCisgICAgLyogZ2V0IGFuZCB2ZXJpZnkgZmxhZ3MgKi8KKyAgICBmbGFncyA9IGJnZXQoaW4pOworICAgIGlmICgoZmxhZ3MgJiAweGUwKSAhPSAwKQorICAgICAgICBiYWlsKCJ1bmtub3duIHJlc2VydmVkIGJpdHMgc2V0IGluICIsIGluLT5uYW1lKTsKKworICAgIC8qIHNraXAgbW9kaWZpY2F0aW9uIHRpbWUsIGV4dHJhIGZsYWdzLCBhbmQgb3MgKi8KKyAgICBic2tpcChpbiwgNik7CisKKyAgICAvKiBza2lwIGV4dHJhIGZpZWxkIGlmIHByZXNlbnQgKi8KKyAgICBpZiAoZmxhZ3MgJiA0KSB7CisgICAgICAgIHVuc2lnbmVkIGxlbjsKKworICAgICAgICBsZW4gPSBiZ2V0KGluKTsKKyAgICAgICAgbGVuICs9ICh1bnNpZ25lZCkoYmdldChpbikpIDw8IDg7CisgICAgICAgIGJza2lwKGluLCBsZW4pOworICAgIH0KKworICAgIC8qIHNraXAgZmlsZSBuYW1lIGlmIHByZXNlbnQgKi8KKyAgICBpZiAoZmxhZ3MgJiA4KQorICAgICAgICB3aGlsZSAoYmdldChpbikgIT0gMCkKKyAgICAgICAgICAgIDsKKworICAgIC8qIHNraXAgY29tbWVudCBpZiBwcmVzZW50ICovCisgICAgaWYgKGZsYWdzICYgMTYpCisgICAgICAgIHdoaWxlIChiZ2V0KGluKSAhPSAwKQorICAgICAgICAgICAgOworCisgICAgLyogc2tpcCBoZWFkZXIgY3JjIGlmIHByZXNlbnQgKi8KKyAgICBpZiAoZmxhZ3MgJiAyKQorICAgICAgICBic2tpcChpbiwgMik7Cit9CisKKy8qIHdyaXRlIGEgZm91ci1ieXRlIGxpdHRsZS1lbmRpYW4gdW5zaWduZWQgaW50ZWdlciB0byBvdXQgKi8KK2xvY2FsIHZvaWQgcHV0NCh1bnNpZ25lZCBsb25nIHZhbCwgRklMRSAqb3V0KQoreworICAgIHB1dGModmFsICYgMHhmZiwgb3V0KTsKKyAgICBwdXRjKCh2YWwgPj4gOCkgJiAweGZmLCBvdXQpOworICAgIHB1dGMoKHZhbCA+PiAxNikgJiAweGZmLCBvdXQpOworICAgIHB1dGMoKHZhbCA+PiAyNCkgJiAweGZmLCBvdXQpOworfQorCisvKiBMb2FkIHVwIHpsaWIgc3RyZWFtIGZyb20gYnVmZmVyZWQgaW5wdXQsIGJhaWwgaWYgZW5kIG9mIGZpbGUgKi8KK2xvY2FsIHZvaWQgenB1bGwoel9zdHJlYW1wIHN0cm0sIGJpbiAqaW4pCit7CisgICAgaWYgKGluLT5sZWZ0ID09IDApCisgICAgICAgIGJsb2FkKGluKTsKKyAgICBpZiAoaW4tPmxlZnQgPT0gMCkKKyAgICAgICAgYmFpbCgidW5leHBlY3RlZCBlbmQgb2YgZmlsZSBvbiAiLCBpbi0+bmFtZSk7CisgICAgc3RybS0+YXZhaWxfaW4gPSBpbi0+bGVmdDsKKyAgICBzdHJtLT5uZXh0X2luID0gaW4tPm5leHQ7Cit9CisKKy8qIFdyaXRlIGhlYWRlciBmb3IgZ3ppcCBmaWxlIHRvIG91dCBhbmQgaW5pdGlhbGl6ZSB0cmFpbGVyLiAqLworbG9jYWwgdm9pZCBnemluaXQodW5zaWduZWQgbG9uZyAqY3JjLCB1bnNpZ25lZCBsb25nICp0b3QsIEZJTEUgKm91dCkKK3sKKyAgICBmd3JpdGUoIlx4MWZceDhiXHgwOFwwXDBcMFwwXDBcMFx4ZmYiLCAxLCAxMCwgb3V0KTsKKyAgICAqY3JjID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7CisgICAgKnRvdCA9IDA7Cit9CisKKy8qIENvcHkgdGhlIGNvbXByZXNzZWQgZGF0YSBmcm9tIG5hbWUsIHplcm9pbmcgdGhlIGxhc3QgYmxvY2sgYml0IG9mIHRoZSBsYXN0CisgICBibG9jayBpZiBjbHIgaXMgdHJ1ZSwgYW5kIGFkZGluZyBlbXB0eSBibG9ja3MgYXMgbmVlZGVkIHRvIGdldCB0byBhIGJ5dGUKKyAgIGJvdW5kYXJ5LiAgSWYgY2xyIGlzIGZhbHNlLCB0aGVuIHRoZSBsYXN0IGJsb2NrIGJlY29tZXMgdGhlIGxhc3QgYmxvY2sgb2YKKyAgIHRoZSBvdXRwdXQsIGFuZCB0aGUgZ3ppcCB0cmFpbGVyIGlzIHdyaXR0ZW4uICBjcmMgYW5kIHRvdCBtYWludGFpbnMgdGhlCisgICBjcmMgYW5kIGxlbmd0aCAobW9kdWxvIDJeMzIpIG9mIHRoZSBvdXRwdXQgZm9yIHRoZSB0cmFpbGVyLiAgVGhlIHJlc3VsdGluZworICAgZ3ppcCBmaWxlIGlzIHdyaXR0ZW4gdG8gb3V0LiAgZ3ppbml0KCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCBjYWxsCisgICBvZiBnemNvcHkoKSB0byB3cml0ZSB0aGUgZ3ppcCBoZWFkZXIgYW5kIHRvIGluaXRpYWxpemUgY3JjIGFuZCB0b3QuICovCitsb2NhbCB2b2lkIGd6Y29weShjaGFyICpuYW1lLCBpbnQgY2xyLCB1bnNpZ25lZCBsb25nICpjcmMsIHVuc2lnbmVkIGxvbmcgKnRvdCwKKyAgICAgICAgICAgICAgICAgIEZJTEUgKm91dCkKK3sKKyAgICBpbnQgcmV0OyAgICAgICAgICAgICAgICAvKiByZXR1cm4gdmFsdWUgZnJvbSB6bGliIGZ1bmN0aW9ucyAqLworICAgIGludCBwb3M7ICAgICAgICAgICAgICAgIC8qIHdoZXJlIHRoZSAibGFzdCBibG9jayIgYml0IGlzIGluIGJ5dGUgKi8KKyAgICBpbnQgbGFzdDsgICAgICAgICAgICAgICAvKiB0cnVlIGlmIHByb2Nlc3NpbmcgdGhlIGxhc3QgYmxvY2sgKi8KKyAgICBiaW4gKmluOyAgICAgICAgICAgICAgICAvKiBidWZmZXJlZCBpbnB1dCBmaWxlICovCisgICAgdW5zaWduZWQgY2hhciAqc3RhcnQ7ICAgLyogc3RhcnQgb2YgY29tcHJlc3NlZCBkYXRhIGluIGJ1ZmZlciAqLworICAgIHVuc2lnbmVkIGNoYXIgKmp1bms7ICAgIC8qIGJ1ZmZlciBmb3IgdW5jb21wcmVzc2VkIGRhdGEgLS0gZGlzY2FyZGVkICovCisgICAgel9vZmZfdCBsZW47ICAgICAgICAgICAgLyogbGVuZ3RoIG9mIHVuY29tcHJlc3NlZCBkYXRhIChzdXBwb3J0ID4gNCBHQikgKi8KKyAgICB6X3N0cmVhbSBzdHJtOyAgICAgICAgICAvKiB6bGliIGluZmxhdGUgc3RyZWFtICovCisKKyAgICAvKiBvcGVuIGd6aXAgZmlsZSBhbmQgc2tpcCBoZWFkZXIgKi8KKyAgICBpbiA9IGJvcGVuKG5hbWUpOworICAgIGlmIChpbiA9PSBOVUxMKQorICAgICAgICBiYWlsKCJjb3VsZCBub3Qgb3BlbiAiLCBuYW1lKTsKKyAgICBnemhlYWQoaW4pOworCisgICAgLyogYWxsb2NhdGUgYnVmZmVyIGZvciB1bmNvbXByZXNzZWQgZGF0YSBhbmQgaW5pdGlhbGl6ZSByYXcgaW5mbGF0ZQorICAgICAgIHN0cmVhbSAqLworICAgIGp1bmsgPSBtYWxsb2MoQ0hVTkspOworICAgIHN0cm0uemFsbG9jID0gWl9OVUxMOworICAgIHN0cm0uemZyZWUgPSBaX05VTEw7CisgICAgc3RybS5vcGFxdWUgPSBaX05VTEw7CisgICAgc3RybS5hdmFpbF9pbiA9IDA7CisgICAgc3RybS5uZXh0X2luID0gWl9OVUxMOworICAgIHJldCA9IGluZmxhdGVJbml0Migmc3RybSwgLTE1KTsKKyAgICBpZiAoanVuayA9PSBOVUxMIHx8IHJldCAhPSBaX09LKQorICAgICAgICBiYWlsKCJvdXQgb2YgbWVtb3J5IiwgIiIpOworCisgICAgLyogaW5mbGF0ZSBhbmQgY29weSBjb21wcmVzc2VkIGRhdGEsIGNsZWFyIGxhc3QtYmxvY2sgYml0IGlmIHJlcXVlc3RlZCAqLworICAgIGxlbiA9IDA7CisgICAgenB1bGwoJnN0cm0sIGluKTsKKyAgICBzdGFydCA9IGluLT5uZXh0OworICAgIGxhc3QgPSBzdGFydFswXSAmIDE7CisgICAgaWYgKGxhc3QgJiYgY2xyKQorICAgICAgICBzdGFydFswXSAmPSB+MTsKKyAgICBzdHJtLmF2YWlsX291dCA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgICAvKiBpZiBpbnB1dCB1c2VkIGFuZCBvdXRwdXQgZG9uZSwgd3JpdGUgdXNlZCBpbnB1dCBhbmQgZ2V0IG1vcmUgKi8KKyAgICAgICAgaWYgKHN0cm0uYXZhaWxfaW4gPT0gMCAmJiBzdHJtLmF2YWlsX291dCAhPSAwKSB7CisgICAgICAgICAgICBmd3JpdGUoc3RhcnQsIDEsIHN0cm0ubmV4dF9pbiAtIHN0YXJ0LCBvdXQpOworICAgICAgICAgICAgc3RhcnQgPSBpbi0+YnVmOworICAgICAgICAgICAgaW4tPmxlZnQgPSAwOworICAgICAgICAgICAgenB1bGwoJnN0cm0sIGluKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGRlY29tcHJlc3MgLS0gcmV0dXJuIGVhcmx5IHdoZW4gZW5kLW9mLWJsb2NrIHJlYWNoZWQgKi8KKyAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBDSFVOSzsKKyAgICAgICAgc3RybS5uZXh0X291dCA9IGp1bms7CisgICAgICAgIHJldCA9IGluZmxhdGUoJnN0cm0sIFpfQkxPQ0spOworICAgICAgICBzd2l0Y2ggKHJldCkgeworICAgICAgICBjYXNlIFpfTUVNX0VSUk9SOgorICAgICAgICAgICAgYmFpbCgib3V0IG9mIG1lbW9yeSIsICIiKTsKKyAgICAgICAgY2FzZSBaX0RBVEFfRVJST1I6CisgICAgICAgICAgICBiYWlsKCJpbnZhbGlkIGNvbXByZXNzZWQgZGF0YSBpbiAiLCBpbi0+bmFtZSk7CisgICAgICAgIH0KKworICAgICAgICAvKiB1cGRhdGUgbGVuZ3RoIG9mIHVuY29tcHJlc3NlZCBkYXRhICovCisgICAgICAgIGxlbiArPSBDSFVOSyAtIHN0cm0uYXZhaWxfb3V0OworCisgICAgICAgIC8qIGNoZWNrIGZvciBibG9jayBib3VuZGFyeSAob25seSBnZXQgdGhpcyB3aGVuIGJsb2NrIGNvcGllZCBvdXQpICovCisgICAgICAgIGlmIChzdHJtLmRhdGFfdHlwZSAmIDEyOCkgeworICAgICAgICAgICAgLyogaWYgdGhhdCB3YXMgdGhlIGxhc3QgYmxvY2ssIHRoZW4gZG9uZSAqLworICAgICAgICAgICAgaWYgKGxhc3QpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIG51bWJlciBvZiB1bnVzZWQgYml0cyBpbiBsYXN0IGJ5dGUgKi8KKyAgICAgICAgICAgIHBvcyA9IHN0cm0uZGF0YV90eXBlICYgNzsKKworICAgICAgICAgICAgLyogZmluZCB0aGUgbmV4dCBsYXN0LWJsb2NrIGJpdCAqLworICAgICAgICAgICAgaWYgKHBvcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgLyogbmV4dCBsYXN0LWJsb2NrIGJpdCBpcyBpbiBsYXN0IHVzZWQgYnl0ZSAqLworICAgICAgICAgICAgICAgIHBvcyA9IDB4MTAwID4+IHBvczsKKyAgICAgICAgICAgICAgICBsYXN0ID0gc3RybS5uZXh0X2luWy0xXSAmIHBvczsKKyAgICAgICAgICAgICAgICBpZiAobGFzdCAmJiBjbHIpCisgICAgICAgICAgICAgICAgICAgIGluLT5idWZbc3RybS5uZXh0X2luIC0gaW4tPmJ1ZiAtIDFdICY9IH5wb3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBuZXh0IGxhc3QtYmxvY2sgYml0IGlzIGluIG5leHQgdW51c2VkIGJ5dGUgKi8KKyAgICAgICAgICAgICAgICBpZiAoc3RybS5hdmFpbF9pbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGRvbid0IGhhdmUgdGhhdCBieXRlIHlldCAtLSBnZXQgaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgZndyaXRlKHN0YXJ0LCAxLCBzdHJtLm5leHRfaW4gLSBzdGFydCwgb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpbi0+YnVmOworICAgICAgICAgICAgICAgICAgICBpbi0+bGVmdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHpwdWxsKCZzdHJtLCBpbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxhc3QgPSBzdHJtLm5leHRfaW5bMF0gJiAxOworICAgICAgICAgICAgICAgIGlmIChsYXN0ICYmIGNscikKKyAgICAgICAgICAgICAgICAgICAgaW4tPmJ1ZltzdHJtLm5leHRfaW4gLSBpbi0+YnVmXSAmPSB+MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHVwZGF0ZSBidWZmZXIgd2l0aCB1bnVzZWQgaW5wdXQgKi8KKyAgICBpbi0+bGVmdCA9IHN0cm0uYXZhaWxfaW47CisgICAgaW4tPm5leHQgPSBpbi0+YnVmICsgKHN0cm0ubmV4dF9pbiAtIGluLT5idWYpOworCisgICAgLyogY29weSB1c2VkIGlucHV0LCB3cml0ZSBlbXB0eSBibG9ja3MgdG8gZ2V0IHRvIGJ5dGUgYm91bmRhcnkgKi8KKyAgICBwb3MgPSBzdHJtLmRhdGFfdHlwZSAmIDc7CisgICAgZndyaXRlKHN0YXJ0LCAxLCBpbi0+bmV4dCAtIHN0YXJ0IC0gMSwgb3V0KTsKKyAgICBsYXN0ID0gaW4tPm5leHRbLTFdOworICAgIGlmIChwb3MgPT0gMCB8fCAhY2xyKQorICAgICAgICAvKiBhbHJlYWR5IGF0IGJ5dGUgYm91bmRhcnksIG9yIGxhc3QgZmlsZTogd3JpdGUgbGFzdCBieXRlICovCisgICAgICAgIHB1dGMobGFzdCwgb3V0KTsKKyAgICBlbHNlIHsKKyAgICAgICAgLyogYXBwZW5kIGVtcHR5IGJsb2NrcyB0byBsYXN0IGJ5dGUgKi8KKyAgICAgICAgbGFzdCAmPSAoKDB4MTAwID4+IHBvcykgLSAxKTsgICAgICAgLyogYXNzdXJlIHVudXNlZCBiaXRzIGFyZSB6ZXJvICovCisgICAgICAgIGlmIChwb3MgJiAxKSB7CisgICAgICAgICAgICAvKiBvZGQgLS0gYXBwZW5kIGFuIGVtcHR5IHN0b3JlZCBibG9jayAqLworICAgICAgICAgICAgcHV0YyhsYXN0LCBvdXQpOworICAgICAgICAgICAgaWYgKHBvcyA9PSAxKQorICAgICAgICAgICAgICAgIHB1dGMoMCwgb3V0KTsgICAgICAgICAgICAgICAvKiB0d28gbW9yZSBiaXRzIGluIGJsb2NrIGhlYWRlciAqLworICAgICAgICAgICAgZndyaXRlKCJcMFwwXHhmZlx4ZmYiLCAxLCA0LCBvdXQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogZXZlbiAtLSBhcHBlbmQgMSwgMiwgb3IgMyBlbXB0eSBmaXhlZCBibG9ja3MgKi8KKyAgICAgICAgICAgIHN3aXRjaCAocG9zKSB7CisgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgcHV0YyhsYXN0IHwgOCwgb3V0KTsKKyAgICAgICAgICAgICAgICBsYXN0ID0gMDsKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICBwdXRjKGxhc3QgfCAweDIwLCBvdXQpOworICAgICAgICAgICAgICAgIGxhc3QgPSAwOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHB1dGMobGFzdCB8IDB4ODAsIG91dCk7CisgICAgICAgICAgICAgICAgcHV0YygwLCBvdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogdXBkYXRlIGNyYyBhbmQgdG90ICovCisgICAgKmNyYyA9IGNyYzMyX2NvbWJpbmUoKmNyYywgYmdldDQoaW4pLCBsZW4pOworICAgICp0b3QgKz0gKHVuc2lnbmVkIGxvbmcpbGVuOworCisgICAgLyogY2xlYW4gdXAgKi8KKyAgICBpbmZsYXRlRW5kKCZzdHJtKTsKKyAgICBmcmVlKGp1bmspOworICAgIGJjbG9zZShpbik7CisKKyAgICAvKiB3cml0ZSB0cmFpbGVyIGlmIHRoaXMgaXMgdGhlIGxhc3QgZ3ppcCBmaWxlICovCisgICAgaWYgKCFjbHIpIHsKKyAgICAgICAgcHV0NCgqY3JjLCBvdXQpOworICAgICAgICBwdXQ0KCp0b3QsIG91dCk7CisgICAgfQorfQorCisvKiBqb2luIHRoZSBnemlwIGZpbGVzIG9uIHRoZSBjb21tYW5kIGxpbmUsIHdyaXRlIHJlc3VsdCB0byBzdGRvdXQgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICB1bnNpZ25lZCBsb25nIGNyYywgdG90OyAgICAgLyogcnVubmluZyBjcmMgYW5kIHRvdGFsIHVuY29tcHJlc3NlZCBsZW5ndGggKi8KKworICAgIC8qIHNraXAgY29tbWFuZCBuYW1lICovCisgICAgYXJnYy0tOworICAgIGFyZ3YrKzsKKworICAgIC8qIHNob3cgdXNhZ2UgaWYgbm8gYXJndW1lbnRzICovCisgICAgaWYgKGFyZ2MgPT0gMCkgeworICAgICAgICBmcHV0cygiZ3pqb2luIHVzYWdlOiBnempvaW4gZjEuZ3ogW2YyLmd6IFtmMy5neiAuLi5dXSA+IGZqb2luLmd6XG4iLAorICAgICAgICAgICAgICBzdGRlcnIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBqb2luIGd6aXAgZmlsZXMgb24gY29tbWFuZCBsaW5lIGFuZCB3cml0ZSB0byBzdGRvdXQgKi8KKyAgICBnemluaXQoJmNyYywgJnRvdCwgc3Rkb3V0KTsKKyAgICB3aGlsZSAoYXJnYy0tKQorICAgICAgICBnemNvcHkoKmFyZ3YrKywgYXJnYywgJmNyYywgJnRvdCwgc3Rkb3V0KTsKKworICAgIC8qIGRvbmUgKi8KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2V4YW1wbGVzL2d6bG9nLmMgYi96bGliL3NyYy9leGFtcGxlcy9nemxvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMmY4NzgKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9leGFtcGxlcy9nemxvZy5jCkBAIC0wLDAgKzEsMTA1OSBAQAorLyoKKyAqIGd6bG9nLmMKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwOCwgMjAxMiBNYXJrIEFkbGVyLCBhbGwgcmlnaHRzIHJlc2VydmVkCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gZ3psb2cuaAorICogdmVyc2lvbiAyLjIsIDE0IEF1ZyAyMDEyCisgKi8KKworLyoKKyAgIGd6bG9nIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBmcmVxdWVudGx5IGFwcGVuZGluZyBzaG9ydCBzdHJpbmdzIHRvIGEgZ3ppcAorICAgZmlsZSB0aGF0IGlzIGVmZmljaWVudCBib3RoIGluIGV4ZWN1dGlvbiB0aW1lIGFuZCBjb21wcmVzc2lvbiByYXRpby4gIFRoZQorICAgc3RyYXRlZ3kgaXMgdG8gd3JpdGUgdGhlIHNob3J0IHN0cmluZ3MgaW4gYW4gdW5jb21wcmVzc2VkIGZvcm0gdG8gdGhlIGVuZCBvZgorICAgdGhlIGd6aXAgZmlsZSwgb25seSBjb21wcmVzc2luZyB3aGVuIHRoZSBhbW91bnQgb2YgdW5jb21wcmVzc2VkIGRhdGEgaGFzCisgICByZWFjaGVkIGEgZ2l2ZW4gdGhyZXNob2xkLgorCisgICBnemxvZyBhbHNvIHByb3ZpZGVzIHByb3RlY3Rpb24gYWdhaW5zdCBpbnRlcnJ1cHRpb25zIGluIHRoZSBwcm9jZXNzIGR1ZSB0bworICAgc3lzdGVtIGNyYXNoZXMuICBUaGUgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24gaXMgcmVjb3JkZWQgaW4gYW4gZXh0cmEgZmllbGQKKyAgIGluIHRoZSBnemlwIGZpbGUsIGFuZCBpcyBvbmx5IHVwZGF0ZWQgb25jZSB0aGUgZ3ppcCBmaWxlIGlzIGJyb3VnaHQgdG8gYQorICAgdmFsaWQgc3RhdGUuICBUaGUgbGFzdCBkYXRhIHRvIGJlIGFwcGVuZGVkIG9yIGNvbXByZXNzZWQgaXMgc2F2ZWQgaW4gYW4KKyAgIGF1eGlsaWFyeSBmaWxlLCBzbyB0aGF0IGlmIHRoZSBvcGVyYXRpb24gaXMgaW50ZXJydXB0ZWQsIGl0IGNhbiBiZSBjb21wbGV0ZWQKKyAgIHRoZSBuZXh0IHRpbWUgYW4gYXBwZW5kIG9wZXJhdGlvbiBpcyBhdHRlbXB0ZWQuCisKKyAgIGd6bG9nIG1haW50YWlucyBhbm90aGVyIGF1eGlsaWFyeSBmaWxlIHdpdGggdGhlIGxhc3QgMzJLIG9mIGRhdGEgZnJvbSB0aGUKKyAgIGNvbXByZXNzZWQgcG9ydGlvbiwgd2hpY2ggaXMgcHJlbG9hZGVkIGZvciB0aGUgY29tcHJlc3Npb24gb2YgdGhlIHN1YnNlcXVlbnQKKyAgIGRhdGEuICBUaGlzIG1pbmltaXplcyB0aGUgaW1wYWN0IHRvIHRoZSBjb21wcmVzc2lvbiByYXRpbyBvZiBhcHBlbmRpbmcuCisgKi8KKworLyoKKyAgIE9wZXJhdGlvbnMgQ29uY2VwdDoKKworICAgRmlsZXMgKGxvZyBuYW1lICJmb28iKToKKyAgIGZvby5neiAtLSBnemlwIGZpbGUgd2l0aCB0aGUgY29tcGxldGUgbG9nCisgICBmb28uYWRkIC0tIGxhc3QgbWVzc2FnZSB0byBhcHBlbmQgb3IgbGFzdCBkYXRhIHRvIGNvbXByZXNzCisgICBmb28uZGljdCAtLSBkaWN0aW9uYXJ5IG9mIHRoZSBsYXN0IDMySyBvZiBkYXRhIGZvciBuZXh0IGNvbXByZXNzaW9uCisgICBmb28udGVtcCAtLSB0ZW1wb3JhcnkgZGljdGlvbmFyeSBmaWxlIGZvciBjb21wcmVzc2lvbiBhZnRlciB0aGlzIG9uZQorICAgZm9vLmxvY2sgLS0gbG9jayBmaWxlIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHRoZSBvdGhlciBmaWxlcworICAgZm9vLnJlcGFpcnMgLS0gbG9nIGZpbGUgZm9yIGxvZyBmaWxlIHJlY292ZXJ5IG9wZXJhdGlvbnMgKG5vdCBjb21wcmVzc2VkKQorCisgICBnemlwIGZpbGUgc3RydWN0dXJlOgorICAgLSBmaXhlZC1sZW5ndGggKG5vIGZpbGUgbmFtZSkgaGVhZGVyIHdpdGggZXh0cmEgZmllbGQgKHNlZSBiZWxvdykKKyAgIC0gY29tcHJlc3NlZCBkYXRhIGVuZGluZyBpbml0aWFsbHkgd2l0aCBlbXB0eSBzdG9yZWQgYmxvY2sKKyAgIC0gdW5jb21wcmVzc2VkIGRhdGEgZmlsbGluZyBvdXQgb3JpZ2luYWxseSBlbXB0eSBzdG9yZWQgYmxvY2sgYW5kCisgICAgIHN1YnNlcXVlbnQgc3RvcmVkIGJsb2NrcyBhcyBuZWVkZWQgKDE2SyBtYXggZWFjaCkKKyAgIC0gZ3ppcCB0cmFpbGVyCisgICAtIG5vIGp1bmsgYXQgZW5kIChubyBvdGhlciBnemlwIHN0cmVhbXMpCisKKyAgIFdoZW4gYXBwZW5kaW5nIGRhdGEsIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgZmlyc3QgdGhyZWUgaXRlbXMgYWJvdmUgcGx1cyB0aGUKKyAgIGZvby5hZGQgZmlsZSBhcmUgc3VmZmljaWVudCB0byByZWNvdmVyIGFuIGludGVycnVwdGVkIGFwcGVuZCBvcGVyYXRpb24uICBUaGUKKyAgIGV4dHJhIGZpZWxkIGhhcyB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHRvIHJlc3RvcmUgdGhlIHN0YXJ0IG9mIHRoZSBsYXN0CisgICBzdG9yZWQgYmxvY2sgYW5kIGRldGVybWluZSB3aGVyZSB0byBhcHBlbmQgdGhlIGRhdGEgaW4gdGhlIGZvby5hZGQgZmlsZSwgYXMKKyAgIHdlbGwgYXMgdGhlIGNyYyBhbmQgbGVuZ3RoIG9mIHRoZSBnemlwIGRhdGEgYmVmb3JlIHRoZSBhcHBlbmQgb3BlcmF0aW9uLgorCisgICBUaGUgZm9vLmFkZCBmaWxlIGlzIGNyZWF0ZWQgYmVmb3JlIHRoZSBnemlwIGZpbGUgaXMgbWFya2VkIGZvciBhcHBlbmQsIGFuZAorICAgZGVsZXRlZCBhZnRlciB0aGUgZ3ppcCBmaWxlIGlzIG1hcmtlZCBhcyBjb21wbGV0ZS4gIFNvIGlmIHRoZSBhcHBlbmQKKyAgIG9wZXJhdGlvbiBpcyBpbnRlcnJ1cHRlZCwgdGhlIGRhdGEgdG8gYWRkIHdpbGwgc3RpbGwgYmUgdGhlcmUuICBJZiBkdWUgdG8KKyAgIHNvbWUgZXh0ZXJuYWwgZm9yY2UsIHRoZSBmb28uYWRkIGZpbGUgZ2V0cyBkZWxldGVkIGJldHdlZW4gd2hlbiB0aGUgYXBwZW5kCisgICBvcGVyYXRpb24gd2FzIGludGVycnVwdGVkIGFuZCB3aGVuIHJlY292ZXJ5IGlzIGF0dGVtcHRlZCwgdGhlIGd6aXAgZmlsZSB3aWxsCisgICBzdGlsbCBiZSByZXN0b3JlZCwgYnV0IHdpdGhvdXQgdGhlIGFwcGVuZGVkIGRhdGEuCisKKyAgIFdoZW4gY29tcHJlc3NpbmcgZGF0YSwgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBmaXJzdCB0d28gaXRlbXMgYWJvdmUgcGx1cyB0aGUKKyAgIGZvby5hZGQgZmlsZSBhcmUgc3VmZmljaWVudCB0byByZWNvdmVyIGFuIGludGVycnVwdGVkIGNvbXByZXNzIG9wZXJhdGlvbi4KKyAgIFRoZSBleHRyYSBmaWVsZCBoYXMgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBmaW5kIHRoZSBlbmQgb2YgdGhlCisgICBjb21wcmVzc2VkIGRhdGEsIGFuZCBjb250YWlucyBib3RoIHRoZSBjcmMgYW5kIGxlbmd0aCBvZiBqdXN0IHRoZSBjb21wcmVzc2VkCisgICBkYXRhIGFuZCBvZiB0aGUgY29tcGxldGUgc2V0IG9mIGRhdGEgaW5jbHVkaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgZm9vLmFkZAorICAgZmlsZS4KKworICAgQWdhaW4sIHRoZSBmb28uYWRkIGZpbGUgaXMgbWFpbnRhaW5lZCBkdXJpbmcgdGhlIGNvbXByZXNzIG9wZXJhdGlvbiBpbiBjYXNlCisgICBvZiBhbiBpbnRlcnJ1cHRpb24uICBJZiBpbiB0aGUgdW5saWtlbHkgZXZlbnQgdGhlIGZvby5hZGQgZmlsZSB3aXRoIHRoZSBkYXRhCisgICB0byBiZSBjb21wcmVzc2VkIGlzIG1pc3NpbmcgZHVlIHRvIHNvbWUgZXh0ZXJuYWwgZm9yY2UsIGEgZ3ppcCBmaWxlIHdpdGgKKyAgIGp1c3QgdGhlIHByZXZpb3VzIGNvbXByZXNzZWQgZGF0YSB3aWxsIGJlIHJlY29uc3RydWN0ZWQuICBJbiB0aGlzIGNhc2UsIGFsbAorICAgb2YgdGhlIGRhdGEgdGhhdCB3YXMgdG8gYmUgY29tcHJlc3NlZCBpcyBsb3N0IChhcHByb3hpbWF0ZWx5IG9uZSBtZWdhYnl0ZSkuCisgICBUaGlzIHdpbGwgbm90IG9jY3VyIGlmIGFsbCB0aGF0IGhhcHBlbmVkIHdhcyBhbiBpbnRlcnJ1cHRpb24gb2YgdGhlIGNvbXByZXNzCisgICBvcGVyYXRpb24uCisKKyAgIFRoZSB0aGlyZCBzdGF0ZSB0aGF0IGlzIG1hcmtlZCBpcyB0aGUgcmVwbGFjZW1lbnQgb2YgdGhlIG9sZCBkaWN0aW9uYXJ5IHdpdGgKKyAgIHRoZSBuZXcgZGljdGlvbmFyeSBhZnRlciBhIGNvbXByZXNzIG9wZXJhdGlvbi4gIE9uY2UgY29tcHJlc3Npb24gaXMKKyAgIGNvbXBsZXRlLCB0aGUgZ3ppcCBmaWxlIGlzIG1hcmtlZCBhcyBiZWluZyBpbiB0aGUgcmVwbGFjZSBzdGF0ZS4gIFRoaXMKKyAgIGNvbXBsZXRlcyB0aGUgZ3ppcCBmaWxlLCBzbyBhbiBpbnRlcnJ1cHQgYWZ0ZXIgYmVpbmcgc28gbWFya2VkIGRvZXMgbm90CisgICByZXN1bHQgaW4gcmVjb21wcmVzc2lvbi4gIFRoZW4gdGhlIGRpY3Rpb25hcnkgZmlsZSBpcyByZXBsYWNlZCwgYW5kIHRoZSBnemlwCisgICBmaWxlIGlzIG1hcmtlZCBhcyBjb21wbGV0ZWQuICBUaGlzIHN0YXRlIHByZXZlbnRzIHRoZSBwb3NzaWJpbGl0eSBvZgorICAgcmVzdGFydGluZyBjb21wcmVzc2lvbiB3aXRoIHRoZSB3cm9uZyBkaWN0aW9uYXJ5IGZpbGUuCisKKyAgIEFsbCB0aHJlZSBvcGVyYXRpb25zIGFyZSB3cmFwcGVkIGJ5IGEgbG9jay91bmxvY2sgcHJvY2VkdXJlLiAgSW4gb3JkZXIgdG8KKyAgIGdhaW4gZXhjbHVzaXZlIGFjY2VzcyB0byB0aGUgbG9nIGZpbGVzLCBmaXJzdCBhIGZvby5sb2NrIGZpbGUgbXVzdCBiZQorICAgZXhjbHVzaXZlbHkgY3JlYXRlZC4gIFdoZW4gYWxsIG9wZXJhdGlvbnMgYXJlIGNvbXBsZXRlLCB0aGUgbG9jayBpcworICAgcmVsZWFzZWQgYnkgZGVsZXRpbmcgdGhlIGZvby5sb2NrIGZpbGUuICBJZiB3aGVuIGF0dGVtcHRpbmcgdG8gY3JlYXRlIHRoZQorICAgbG9jayBmaWxlLCBpdCBhbHJlYWR5IGV4aXN0cyBhbmQgdGhlIG1vZGlmeSB0aW1lIG9mIHRoZSBsb2NrIGZpbGUgaXMgbW9yZQorICAgdGhhbiBmaXZlIG1pbnV0ZXMgb2xkIChzZXQgYnkgdGhlIFBBVElFTkNFIGRlZmluZSBiZWxvdyksIHRoZW4gdGhlIG9sZAorICAgbG9jayBmaWxlIGlzIGNvbnNpZGVyZWQgc3RhbGUgYW5kIGRlbGV0ZWQsIGFuZCB0aGUgZXhjbHVzaXZlIGNyZWF0aW9uIG9mCisgICB0aGUgbG9jayBmaWxlIGlzIHJldHJpZWQuICBUbyBhc3N1cmUgdGhhdCB0aGVyZSBhcmUgbm8gZmFsc2UgYXNzZXNzbWVudHMKKyAgIG9mIHRoZSBzdGFsZW5lc3Mgb2YgdGhlIGxvY2sgZmlsZSwgdGhlIG9wZXJhdGlvbnMgcGVyaW9kaWNhbGx5IHRvdWNoIHRoZQorICAgbG9jayBmaWxlIHRvIHVwZGF0ZSB0aGUgbW9kaWZpZWQgZGF0ZS4KKworICAgRm9sbG93aW5nIGlzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBleHRyYSBmaWVsZCB3aXRoIGFsbCBvZiB0aGUgaW5mb3JtYXRpb24KKyAgIHJlcXVpcmVkIHRvIGVuYWJsZSB0aGUgYWJvdmUgYXBwZW5kIGFuZCBjb21wcmVzcyBvcGVyYXRpb25zIGFuZCB0aGVpcgorICAgcmVjb3ZlcnkgaWYgaW50ZXJydXB0ZWQuICBNdWx0aS1ieXRlIHZhbHVlcyBhcmUgc3RvcmVkIGxpdHRsZSBlbmRpYW4KKyAgIChjb25zaXN0ZW50IHdpdGggdGhlIGd6aXAgZm9ybWF0KS4gIEZpbGUgcG9pbnRlcnMgYXJlIGVpZ2h0IGJ5dGVzIGxvbmcuCisgICBUaGUgY3JjJ3MgYW5kIGxlbmd0aHMgZm9yIHRoZSBnemlwIHRyYWlsZXIgYXJlIGZvdXIgYnl0ZXMgbG9uZy4gIChOb3RlIHRoYXQKKyAgIHRoZSBsZW5ndGggYXQgdGhlIGVuZCBvZiBhIGd6aXAgZmlsZSBpcyB1c2VkIGZvciBlcnJvciBjaGVja2luZyBvbmx5LCBhbmQKKyAgIGZvciBsYXJnZSBmaWxlcyBpcyBhY3R1YWxseSB0aGUgbGVuZ3RoIG1vZHVsbyAyXjMyLikgIFRoZSBzdG9yZWQgYmxvY2sKKyAgIGxlbmd0aCBpcyB0d28gYnl0ZXMgbG9uZy4gIFRoZSBnemlwIGV4dHJhIGZpZWxkIHR3by1ieXRlIGlkZW50aWZpY2F0aW9uIGlzCisgICAiYXAiIGZvciBhcHBlbmQuICBJdCBpcyBhc3N1bWVkIHRoYXQgd3JpdGluZyB0aGUgZXh0cmEgZmllbGQgdG8gdGhlIGZpbGUgaXMKKyAgIGFuICJhdG9taWMiIG9wZXJhdGlvbi4gIFRoYXQgaXMsIGVpdGhlciBhbGwgb2YgdGhlIGV4dHJhIGZpZWxkIGlzIHdyaXR0ZW4KKyAgIHRvIHRoZSBmaWxlLCBvciBub25lIG9mIGl0IGlzLCBpZiB0aGUgb3BlcmF0aW9uIGlzIGludGVycnVwdGVkIHJpZ2h0IGF0IHRoZQorICAgcG9pbnQgb2YgdXBkYXRpbmcgdGhlIGV4dHJhIGZpZWxkLiAgVGhpcyBpcyBhIHJlYXNvbmFibGUgYXNzdW1wdGlvbiwgc2luY2UKKyAgIHRoZSBleHRyYSBmaWVsZCBpcyB3aXRoaW4gdGhlIGZpcnN0IDUyIGJ5dGVzIG9mIHRoZSBmaWxlLCB3aGljaCBpcyBzbWFsbGVyCisgICB0aGFuIGFueSBleHBlY3RlZCBibG9jayBzaXplIGZvciBhIG1hc3Mgc3RvcmFnZSBkZXZpY2UgKHVzdWFsbHkgNTEyIGJ5dGVzIG9yCisgICBsYXJnZXIpLgorCisgICBFeHRyYSBmaWVsZCAoMzUgYnl0ZXMpOgorICAgLSBQb2ludGVyIHRvIGZpcnN0IHN0b3JlZCBibG9jayBsZW5ndGggLS0gdGhpcyBwb2ludHMgdG8gdGhlIHR3by1ieXRlIGxlbmd0aAorICAgICBvZiB0aGUgZmlyc3Qgc3RvcmVkIGJsb2NrLCB3aGljaCBpcyBmb2xsb3dlZCBieSB0aGUgdHdvLWJ5dGUsIG9uZSdzCisgICAgIGNvbXBsZW1lbnQgb2YgdGhhdCBsZW5ndGguICBUaGUgc3RvcmVkIGJsb2NrIGxlbmd0aCBpcyBwcmVjZWRlZCBieSB0aGUKKyAgICAgdGhyZWUtYml0IGhlYWRlciBvZiB0aGUgc3RvcmVkIGJsb2NrLCB3aGljaCBpcyB0aGUgYWN0dWFsIHN0YXJ0IG9mIHRoZQorICAgICBzdG9yZWQgYmxvY2sgaW4gdGhlIGRlZmxhdGUgZm9ybWF0LiAgU2VlIHRoZSBiaXQgb2Zmc2V0IGZpZWxkIGJlbG93LgorICAgLSBQb2ludGVyIHRvIHRoZSBsYXN0IHN0b3JlZCBibG9jayBsZW5ndGguICBUaGlzIGlzIHRoZSBzYW1lIGFzIGFib3ZlLCBidXQKKyAgICAgZm9yIHRoZSBsYXN0IHN0b3JlZCBibG9jayBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgaW4gdGhlIGd6aXAgZmlsZS4KKyAgICAgSW5pdGlhbGx5IHRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIGZpcnN0IHN0b3JlZCBibG9jayBsZW5ndGggcG9pbnRlci4KKyAgICAgV2hlbiB0aGUgc3RvcmVkIGJsb2NrIGdldHMgdG8gMTZLIChzZWUgdGhlIE1BWF9TVE9SRSBkZWZpbmUpLCB0aGVuIGEgbmV3CisgICAgIHN0b3JlZCBibG9jayBhcyBhZGRlZCwgYXQgd2hpY2ggcG9pbnQgdGhlIGxhc3Qgc3RvcmVkIGJsb2NrIGxlbmd0aCBwb2ludGVyCisgICAgIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBmaXJzdCBzdG9yZWQgYmxvY2sgbGVuZ3RoIHBvaW50ZXIuICBXaGVuIHRoZXkgYXJlCisgICAgIGRpZmZlcmVudCwgdGhlIGZpcnN0IGJpdCBvZiB0aGUgbGFzdCBzdG9yZWQgYmxvY2sgaGVhZGVyIGlzIGVpZ2h0IGJpdHMsIG9yCisgICAgIG9uZSBieXRlIGJhY2sgZnJvbSB0aGUgYmxvY2sgbGVuZ3RoLgorICAgLSBDb21wcmVzc2VkIGRhdGEgY3JjIGFuZCBsZW5ndGguICBUaGlzIGlzIHRoZSBjcmMgYW5kIGxlbmd0aCBvZiB0aGUgZGF0YQorICAgICB0aGF0IGlzIGluIHRoZSBjb21wcmVzc2VkIHBvcnRpb24gb2YgdGhlIGRlZmxhdGUgc3RyZWFtLiAgVGhlc2UgYXJlIHVzZWQKKyAgICAgb25seSBpbiB0aGUgZXZlbnQgdGhhdCB0aGUgZm9vLmFkZCBmaWxlIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gY29tcHJlc3MgaXMKKyAgICAgbG9zdCBhZnRlciBhIGNvbXByZXNzIG9wZXJhdGlvbiBpcyBpbnRlcnJ1cHRlZC4KKyAgIC0gVG90YWwgZGF0YSBjcmMgYW5kIGxlbmd0aC4gIFRoaXMgaXMgdGhlIGNyYyBhbmQgbGVuZ3RoIG9mIGFsbCBvZiB0aGUgZGF0YQorICAgICBzdG9yZWQgaW4gdGhlIGd6aXAgZmlsZSwgY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkLiAgSXQgaXMgdXNlZCB0bworICAgICByZWNvbnN0cnVjdCB0aGUgZ3ppcCB0cmFpbGVyIHdoZW4gY29tcHJlc3NpbmcsIGFzIHdlbGwgYXMgd2hlbiByZWNvdmVyaW5nCisgICAgIGludGVycnVwdGVkIG9wZXJhdGlvbnMuCisgICAtIEZpbmFsIHN0b3JlZCBibG9jayBsZW5ndGguICBUaGlzIGlzIHVzZWQgdG8gcXVpY2tseSBmaW5kIHdoZXJlIHRvIGFwcGVuZCwKKyAgICAgYW5kIGFsbG93cyB0aGUgcmVzdG9yYXRpb24gb2YgdGhlIG9yaWdpbmFsIGZpbmFsIHN0b3JlZCBibG9jayBzdGF0ZSB3aGVuCisgICAgIGFuIGFwcGVuZCBvcGVyYXRpb24gaXMgaW50ZXJydXB0ZWQuCisgICAtIEZpcnN0IHN0b3JlZCBibG9jayBzdGFydCBhcyB0aGUgbnVtYmVyIG9mIGJpdHMgYmFjayBmcm9tIHRoZSBmaW5hbCBzdG9yZWQKKyAgICAgYmxvY2sgZmlyc3QgbGVuZ3RoIGJ5dGUuICBUaGlzIHZhbHVlIGlzIGluIHRoZSByYW5nZSBvZiAzLi4xMCwgYW5kIGlzCisgICAgIHN0b3JlZCBhcyB0aGUgbG93IHRocmVlIGJpdHMgb2YgdGhlIGZpbmFsIGJ5dGUgb2YgdGhlIGV4dHJhIGZpZWxkIGFmdGVyCisgICAgIHN1YnRyYWN0aW5nIHRocmVlICgwLi43KS4gIFRoaXMgYWxsb3dzIHRoZSBsYXN0LWJsb2NrIGJpdCBvZiB0aGUgc3RvcmVkCisgICAgIGJsb2NrIGhlYWRlciB0byBiZSB1cGRhdGVkIHdoZW4gYSBuZXcgc3RvcmVkIGJsb2NrIGlzIGFkZGVkLCBmb3IgdGhlIGNhc2UKKyAgICAgd2hlbiB0aGUgZmlyc3Qgc3RvcmVkIGJsb2NrIGFuZCB0aGUgbGFzdCBzdG9yZWQgYmxvY2sgYXJlIHRoZSBzYW1lLiAgKFdoZW4KKyAgICAgdGhleSBhcmUgZGlmZmVyZW50LCB0aGUgbnVtYmVycyBvZiBiaXRzIGJhY2sgaXMga25vd24gdG8gYmUgZWlnaHQuKSAgVGhpcworICAgICBhbHNvIGFsbG93cyBmb3IgbmV3IGNvbXByZXNzZWQgZGF0YSB0byBiZSBhcHBlbmRlZCB0byB0aGUgb2xkIGNvbXByZXNzZWQKKyAgICAgZGF0YSBpbiB0aGUgY29tcHJlc3Mgb3BlcmF0aW9uLCBvdmVyd3JpdGluZyB0aGUgcHJldmlvdXMgZmlyc3Qgc3RvcmVkCisgICAgIGJsb2NrLCBvciBmb3IgdGhlIGNvbXByZXNzZWQgZGF0YSB0byBiZSB0ZXJtaW5hdGVkIGFuZCBhIHZhbGlkIGd6aXAgZmlsZQorICAgICByZWNvbnN0cnVjdGVkIG9uIHRoZSBvZmYgY2hhbmNlIHRoYXQgYSBjb21wcmVzc2lvbiBvcGVyYXRpb24gd2FzCisgICAgIGludGVycnVwdGVkIGFuZCB0aGUgZGF0YSB0byBjb21wcmVzcyBpbiB0aGUgZm9vLmFkZCBmaWxlIHdhcyBkZWxldGVkLgorICAgLSBUaGUgb3BlcmF0aW9uIGluIHByb2Nlc3MuICBUaGlzIGlzIHRoZSBuZXh0IHR3byBiaXRzIGluIHRoZSBsYXN0IGJ5dGUgKHRoZQorICAgICBiaXRzIHVuZGVyIHRoZSBtYXNrIDB4MTgpLiAgVGhlIGFyZSBpbnRlcnByZXRlZCBhcyAwOiBub3RoaW5nIGluIHByb2Nlc3MsCisgICAgIDE6IGFwcGVuZCBpbiBwcm9jZXNzLCAyOiBjb21wcmVzcyBpbiBwcm9jZXNzLCAzOiByZXBsYWNlIGluIHByb2Nlc3MuCisgICAtIFRoZSB0b3AgdGhyZWUgYml0cyBvZiB0aGUgbGFzdCBieXRlIGluIHRoZSBleHRyYSBmaWVsZCBhcmUgcmVzZXJ2ZWQgYW5kCisgICAgIGFyZSBjdXJyZW50bHkgc2V0IHRvIHplcm8uCisKKyAgIE1haW4gcHJvY2VkdXJlOgorICAgLSBFeGNsdXNpdmVseSBjcmVhdGUgdGhlIGZvby5sb2NrIGZpbGUgdXNpbmcgdGhlIE9fQ1JFQVQgYW5kIE9fRVhDTCBtb2RlcyBvZgorICAgICB0aGUgc3lzdGVtIG9wZW4oKSBjYWxsLiAgSWYgdGhlIG1vZGlmeSB0aW1lIG9mIGFuIGV4aXN0aW5nIGxvY2sgZmlsZSBpcworICAgICBtb3JlIHRoYW4gUEFUSUVOQ0Ugc2Vjb25kcyBvbGQsIHRoZW4gdGhlIGxvY2sgZmlsZSBpcyBkZWxldGVkIGFuZCB0aGUKKyAgICAgZXhjbHVzaXZlIGNyZWF0ZSBpcyByZXRyaWVkLgorICAgLSBMb2FkIHRoZSBleHRyYSBmaWVsZCBmcm9tIHRoZSBmb28uZ3ogZmlsZSwgYW5kIHNlZSBpZiBhbiBvcGVyYXRpb24gd2FzIGluCisgICAgIHByb2dyZXNzIGJ1dCBub3QgY29tcGxldGVkLiAgSWYgc28sIGFwcGx5IHRoZSByZWNvdmVyeSBwcm9jZWR1cmUgYmVsb3cuCisgICAtIFBlcmZvcm0gdGhlIGFwcGVuZCBwcm9jZWR1cmUgd2l0aCB0aGUgcHJvdmlkZWQgZGF0YS4KKyAgIC0gSWYgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGluIHRoZSBmb28uZ3ogZmlsZSBpcyAxTUIgb3IgbW9yZSwgYXBwbHkgdGhlCisgICAgIGNvbXByZXNzIHByb2NlZHVyZS4KKyAgIC0gRGVsZXRlIHRoZSBmb28ubG9jayBmaWxlLgorCisgICBBcHBlbmQgcHJvY2VkdXJlOgorICAgLSBQdXQgd2hhdCB0byBhcHBlbmQgaW4gdGhlIGZvby5hZGQgZmlsZSBzbyB0aGF0IHRoZSBvcGVyYXRpb24gY2FuIGJlCisgICAgIHJlc3RhcnRlZCBpZiB0aGlzIHByb2NlZHVyZSBpcyBpbnRlcnJ1cHRlZC4KKyAgIC0gTWFyayB0aGUgZm9vLmd6IGV4dHJhIGZpZWxkIHdpdGggdGhlIGFwcGVuZCBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MuCisgICArIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGxhc3QtYmxvY2sgYml0IGFuZCBzdG9yZWQgYmxvY2sgbGVuZ3RoIG9mIHRoZSBsYXN0CisgICAgIHN0b3JlZCBibG9jayBmcm9tIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgZXh0cmEgZmllbGQsIGluIGNhc2UgYSBwcmV2aW91cworICAgICBhcHBlbmQgb3BlcmF0aW9uIHdhcyBpbnRlcnJ1cHRlZC4KKyAgIC0gQXBwZW5kIHRoZSBwcm92aWRlZCBkYXRhIHRvIHRoZSBsYXN0IHN0b3JlZCBibG9jaywgY3JlYXRpbmcgbmV3IHN0b3JlZAorICAgICBibG9ja3MgYXMgbmVlZGVkIGFuZCB1cGRhdGluZyB0aGUgc3RvcmVkIGJsb2NrcyBsYXN0LWJsb2NrIGJpdHMgYW5kCisgICAgIGxlbmd0aHMuCisgICAtIFVwZGF0ZSB0aGUgY3JjIGFuZCBsZW5ndGggd2l0aCB0aGUgbmV3IGRhdGEsIGFuZCB3cml0ZSB0aGUgZ3ppcCB0cmFpbGVyLgorICAgLSBXcml0ZSBvdmVyIHRoZSBleHRyYSBmaWVsZCAod2l0aCBhIHNpbmdsZSB3cml0ZSBvcGVyYXRpb24pIHdpdGggdGhlIG5ldworICAgICBwb2ludGVycywgbGVuZ3RocywgYW5kIGNyYydzLCBhbmQgbWFyayB0aGUgZ3ppcCBmaWxlIGFzIG5vdCBpbiBwcm9jZXNzLgorICAgICBUaG91Z2ggdGhlcmUgaXMgc3RpbGwgYSBmb28uYWRkIGZpbGUsIGl0IHdpbGwgYmUgaWdub3JlZCBzaW5jZSBub3RoaW5nCisgICAgIGlzIGluIHByb2Nlc3MuICBJZiBhIGZvby5hZGQgZmlsZSBpcyBsZWZ0b3ZlciBmcm9tIGEgcHJldmlvdXNseQorICAgICBjb21wbGV0ZWQgb3BlcmF0aW9uLCBpdCBpcyB0cnVuY2F0ZWQgd2hlbiB3cml0aW5nIG5ldyBkYXRhIHRvIGl0LgorICAgLSBEZWxldGUgdGhlIGZvby5hZGQgZmlsZS4KKworICAgQ29tcHJlc3MgYW5kIHJlcGxhY2UgcHJvY2VkdXJlczoKKyAgIC0gUmVhZCBhbGwgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGluIHRoZSBzdG9yZWQgYmxvY2tzIGluIGZvby5neiBhbmQgd3JpdGUKKyAgICAgaXQgdG8gZm9vLmFkZC4gIEFsc28gd3JpdGUgZm9vLnRlbXAgd2l0aCB0aGUgbGFzdCAzMksgb2YgdGhhdCBkYXRhIHRvCisgICAgIHByb3ZpZGUgYSBkaWN0aW9uYXJ5IGZvciB0aGUgbmV4dCBpbnZvY2F0aW9uIG9mIHRoaXMgcHJvY2VkdXJlLgorICAgLSBSZXdyaXRlIHRoZSBleHRyYSBmaWVsZCBtYXJraW5nIGZvby5neiB3aXRoIGEgY29tcHJlc3Npb24gaW4gcHJvY2Vzcy4KKyAgICogSWYgdGhlcmUgaXMgbm8gZGF0YSBwcm92aWRlZCB0byBjb21wcmVzcyAoZHVlIHRvIGEgbWlzc2luZyBmb28uYWRkIGZpbGUKKyAgICAgd2hlbiByZWNvdmVyaW5nKSwgcmVjb25zdHJ1Y3QgYW5kIHRydW5jYXRlIHRoZSBmb28uZ3ogZmlsZSB0byBjb250YWluCisgICAgIG9ubHkgdGhlIHByZXZpb3VzIGNvbXByZXNzZWQgZGF0YSBhbmQgcHJvY2VlZCB0byB0aGUgc3RlcCBhZnRlciB0aGUgbmV4dAorICAgICBvbmUuICBPdGhlcndpc2UgLi4uCisgICAtIENvbXByZXNzIHRoZSBkYXRhIHdpdGggdGhlIGRpY3Rpb25hcnkgaW4gZm9vLmRpY3QsIGFuZCB3cml0ZSB0byB0aGUKKyAgICAgZm9vLmd6IGZpbGUgc3RhcnRpbmcgYXQgdGhlIGJpdCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIGxhc3QgcHJldmlvdXNseQorICAgICBjb21wcmVzc2VkIGJsb2NrLiAgSWYgdGhlcmUgaXMgbm8gZm9vLmRpY3QsIHByb2NlZWQgYW55d2F5IHdpdGggdGhlCisgICAgIGNvbXByZXNzaW9uIGF0IHNsaWdodGx5IHJlZHVjZWQgZWZmaWNpZW5jeS4gIChGb3IgdGhlIGZvby5kaWN0IGZpbGUgdG8gYmUKKyAgICAgbWlzc2luZyByZXF1aXJlcyBzb21lIGV4dGVybmFsIGZhaWx1cmUgYmV5b25kIHNpbXBseSB0aGUgaW50ZXJydXB0aW9uIG9mCisgICAgIGEgY29tcHJlc3Mgb3BlcmF0aW9uLikgIER1cmluZyB0aGlzIHByb2Nlc3MsIHRoZSBmb28ubG9jayBmaWxlIGlzCisgICAgIHBlcmlvZGljYWxseSB0b3VjaGVkIHRvIGFzc3VyZSB0aGF0IHRoYXQgZmlsZSBpcyBub3QgY29uc2lkZXJlZCBzdGFsZSBieQorICAgICBhbm90aGVyIHByb2Nlc3MgYmVmb3JlIHdlJ3JlIGRvbmUuICBUaGUgZGVmbGF0aW9uIGlzIHRlcm1pbmF0ZWQgd2l0aCBhCisgICAgIG5vbi1sYXN0IGVtcHR5IHN0YXRpYyBibG9jayAoMTAgYml0cyBsb25nKSwgdGhhdCBpcyB0aGVuIGxvY2F0ZWQgYW5kCisgICAgIHdyaXR0ZW4gb3ZlciBieSBhIGxhc3QtYml0LXNldCBlbXB0eSBzdG9yZWQgYmxvY2suCisgICAtIEFwcGVuZCB0aGUgY3JjIGFuZCBsZW5ndGggb2YgdGhlIGRhdGEgaW4gdGhlIGd6aXAgZmlsZSAocHJldmlvdXNseQorICAgICBjYWxjdWxhdGVkIGR1cmluZyB0aGUgYXBwZW5kIG9wZXJhdGlvbnMpLgorICAgLSBXcml0ZSBvdmVyIHRoZSBleHRyYSBmaWVsZCB3aXRoIHRoZSB1cGRhdGVkIHN0b3JlZCBibG9jayBvZmZzZXRzLCBiaXRzCisgICAgIGJhY2ssIGNyYydzLCBhbmQgbGVuZ3RocywgYW5kIG1hcmsgZm9vLmd6IGFzIGluIHByb2Nlc3MgZm9yIGEgcmVwbGFjZW1lbnQKKyAgICAgb2YgdGhlIGRpY3Rpb25hcnkuCisgICBAIERlbGV0ZSB0aGUgZm9vLmFkZCBmaWxlLgorICAgLSBSZXBsYWNlIGZvby5kaWN0IHdpdGggZm9vLnRlbXAuCisgICAtIFdyaXRlIG92ZXIgdGhlIGV4dHJhIGZpZWxkLCBtYXJraW5nIGZvby5neiBhcyBjb21wbGV0ZS4KKworICAgUmVjb3ZlcnkgcHJvY2VkdXJlOgorICAgLSBJZiBub3QgYSByZXBsYWNlIHJlY292ZXJ5LCByZWFkIGluIHRoZSBmb28uYWRkIGZpbGUsIGFuZCBwcm92aWRlIHRoYXQgZGF0YQorICAgICB0byB0aGUgYXBwcm9wcmlhdGUgcmVjb3ZlcnkgYmVsb3cuICBJZiB0aGVyZSBpcyBubyBmb28uYWRkIGZpbGUsIHByb3ZpZGUKKyAgICAgYSB6ZXJvIGRhdGEgbGVuZ3RoIHRvIHRoZSByZWNvdmVyeS4gIEluIHRoYXQgY2FzZSwgdGhlIGFwcGVuZCByZWNvdmVyeQorICAgICByZXN0b3JlcyB0aGUgZm9vLmd6IHRvIHRoZSBwcmV2aW91cyBjb21wcmVzc2VkICsgdW5jb21wcmVzc2VkIGRhdGEgc3RhdGUuCisgICAgIEZvciB0aGUgdGhlIGNvbXByZXNzIHJlY292ZXJ5LCBhIG1pc3NpbmcgZm9vLmFkZCBmaWxlIHJlc3VsdHMgaW4gZm9vLmd6CisgICAgIGJlaW5nIHJlc3RvcmVkIHRvIHRoZSBwcmV2aW91cyBjb21wcmVzc2VkLW9ubHkgZGF0YSBzdGF0ZS4KKyAgIC0gQXBwZW5kIHJlY292ZXJ5OgorICAgICAtIFBpY2sgdXAgYXBwZW5kIGF0ICsgc3RlcCBhYm92ZQorICAgLSBDb21wcmVzcyByZWNvdmVyeToKKyAgICAgLSBQaWNrIHVwIGNvbXByZXNzIGF0ICogc3RlcCBhYm92ZQorICAgLSBSZXBsYWNlIHJlY292ZXJ5OgorICAgICAtIFBpY2sgdXAgY29tcHJlc3MgYXQgQCBzdGVwIGFib3ZlCisgICAtIExvZyB0aGUgcmVwYWlyIHdpdGggYSBkYXRlIHN0YW1wIGluIGZvby5yZXBhaXJzCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+ICAgICAgLyogcmVuYW1lLCBmb3BlbiwgZnByaW50ZiwgZmNsb3NlICovCisjaW5jbHVkZSA8c3RkbGliLmg+ICAgICAvKiBtYWxsb2MsIGZyZWUgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4gICAgIC8qIHN0cmxlbiwgc3RycmNociwgc3RyY3B5LCBzdHJuY3B5LCBzdHJjbXAgKi8KKyNpbmNsdWRlIDxmY250bC5oPiAgICAgIC8qIG9wZW4gKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4gICAgIC8qIGxzZWVrLCByZWFkLCB3cml0ZSwgY2xvc2UsIHVubGluaywgc2xlZXAsICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdHJ1bmNhdGUsIGZzeW5jICovCisjaW5jbHVkZSA8ZXJybm8uaD4gICAgICAvKiBlcnJubyAqLworI2luY2x1ZGUgPHRpbWUuaD4gICAgICAgLyogdGltZSwgY3RpbWUgKi8KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPiAgIC8qIHN0YXQgKi8KKyNpbmNsdWRlIDxzeXMvdGltZS5oPiAgIC8qIHV0aW1lcyAqLworI2luY2x1ZGUgInpsaWIuaCIgICAgICAgLyogY3JjMzIgKi8KKworI2luY2x1ZGUgImd6bG9nLmgiICAgICAgLyogaGVhZGVyIGZvciBleHRlcm5hbCBhY2Nlc3MgKi8KKworI2RlZmluZSBsb2NhbCBzdGF0aWMKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWxvbmc7CisKKy8qIE1hY3JvIGZvciBkZWJ1Z2dpbmcgdG8gZGV0ZXJtaW5pc3RpY2FsbHkgZm9yY2UgcmVjb3Zlcnkgb3BlcmF0aW9ucyAqLworI2lmZGVmIERFQlVHCisgICAgI2luY2x1ZGUgPHNldGptcC5oPiAgICAgICAgIC8qIGxvbmdqbXAgKi8KKyAgICBqbXBfYnVmIGd6bG9nX2p1bXA7ICAgICAgICAgLyogd2hlcmUgdG8gZ28gYmFjayB0byAqLworICAgIGludCBnemxvZ19iYWlsID0gMDsgICAgICAgICAvKiB3aGljaCBwb2ludCB0byBiYWlsIGF0ICgxLi44KSAqLworICAgIGludCBnemxvZ19jb3VudCA9IC0xOyAgICAgICAvKiBudW1iZXIgb2YgdGltZXMgdGhyb3VnaCB0byB3YWl0ICovCisjICAgZGVmaW5lIEJBSUwobikgZG8geyBpZiAobiA9PSBnemxvZ19iYWlsICYmIGd6bG9nX2NvdW50LS0gPT0gMCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdqbXAoZ3psb2dfanVtcCwgZ3psb2dfYmFpbCk7IH0gd2hpbGUgKDApCisjZWxzZQorIyAgIGRlZmluZSBCQUlMKG4pCisjZW5kaWYKKworLyogaG93IG9sZCB0aGUgbG9jayBmaWxlIGNhbiBiZSBpbiBzZWNvbmRzIGJlZm9yZSBjb25zaWRlcmluZyBpdCBzdGFsZSAqLworI2RlZmluZSBQQVRJRU5DRSAzMDAKKworLyogbWF4aW11bSBzdG9yZWQgYmxvY2sgc2l6ZSBpbiBLYnl0ZXMgLS0gbXVzdCBiZSBpbiAxLi42MyAqLworI2RlZmluZSBNQVhfU1RPUkUgMTYKKworLyogbnVtYmVyIG9mIHN0b3JlZCBLYnl0ZXMgdG8gdHJpZ2dlciBjb21wcmVzc2lvbiAobXVzdCBiZSA+PSAzMiB0byBhbGxvdworICAgZGljdGlvbmFyeSBjb25zdHJ1Y3Rpb24sIGFuZCA8PSAyMDQgKiBNQVhfU1RPUkUsIGluIG9yZGVyIGZvciA+PiAxMCB0bworICAgZGlzY2FyZCB0aGUgc3RvcmVkIGJsb2NrIGhlYWRlcnMgY29udHJpYnV0aW9uIG9mIGZpdmUgYnl0ZXMgZWFjaCkgKi8KKyNkZWZpbmUgVFJJR0dFUiAxMDI0CisKKy8qIHNpemUgb2YgYSBkZWZsYXRlIGRpY3Rpb25hcnkgKHRoaXMgY2Fubm90IGJlIGNoYW5nZWQpICovCisjZGVmaW5lIERJQ1QgMzI3NjhVCisKKy8qIHZhbHVlcyBmb3IgdGhlIG9wZXJhdGlvbiAoMiBiaXRzKSAqLworI2RlZmluZSBOT19PUCAwCisjZGVmaW5lIEFQUEVORF9PUCAxCisjZGVmaW5lIENPTVBSRVNTX09QIDIKKyNkZWZpbmUgUkVQTEFDRV9PUCAzCisKKy8qIG1hY3JvcyB0byBleHRyYWN0IGxpdHRsZS1lbmRpYW4gaW50ZWdlcnMgZnJvbSBhbiB1bnNpZ25lZCBieXRlIGJ1ZmZlciAqLworI2RlZmluZSBQVUxMMihwKSAoKHApWzBdKygodWludCkoKHApWzFdKTw8OCkpCisjZGVmaW5lIFBVTEw0KHApIChQVUxMMihwKSsoKHVsb25nKVBVTEwyKHArMik8PDE2KSkKKyNkZWZpbmUgUFVMTDgocCkgKFBVTEw0KHApKygob2ZmX3QpUFVMTDQocCs0KTw8MzIpKQorCisvKiBtYWNyb3MgdG8gc3RvcmUgaW50ZWdlcnMgaW50byBhIGJ5dGUgYnVmZmVyIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIgKi8KKyNkZWZpbmUgUFVUMihwLGEpIGRvIHsocClbMF09YTsocClbMV09KGEpPj44O30gd2hpbGUoMCkKKyNkZWZpbmUgUFVUNChwLGEpIGRvIHtQVVQyKHAsYSk7UFVUMihwKzIsYT4+MTYpO30gd2hpbGUoMCkKKyNkZWZpbmUgUFVUOChwLGEpIGRvIHtQVVQ0KHAsYSk7UFVUNChwKzQsYT4+MzIpO30gd2hpbGUoMCkKKworLyogaW50ZXJuYWwgc3RydWN0dXJlIGZvciBsb2cgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTE9HSUQgIlwxMDZcMDM1XDE3MiIgICAgLyogc2hvdWxkIGJlIHRocmVlIG5vbi16ZXJvIGNoYXJhY3RlcnMgKi8KK3N0cnVjdCBsb2cgeworICAgIGNoYXIgaWRbNF07ICAgICAvKiBjb250YWlucyBMT0dJRCB0byBkZXRlY3QgaW5hZHZlcnRlbnQgb3ZlcndyaXRlcyAqLworICAgIGludCBmZDsgICAgICAgICAvKiBmaWxlIGRlc2NyaXB0b3IgZm9yIC5neiBmaWxlLCBvcGVuZWQgcmVhZC93cml0ZSAqLworICAgIGNoYXIgKnBhdGg7ICAgICAvKiBhbGxvY2F0ZWQgcGF0aCwgZS5nLiAiL3Zhci9sb2cvZm9vIiBvciAiZm9vIiAqLworICAgIGNoYXIgKmVuZDsgICAgICAvKiBlbmQgb2YgcGF0aCwgZm9yIGFwcGVuZGluZyBzdWZmaWNlcyBzdWNoIGFzICIuZ3oiICovCisgICAgb2ZmX3QgZmlyc3Q7ICAgIC8qIG9mZnNldCBvZiBmaXJzdCBzdG9yZWQgYmxvY2sgZmlyc3QgbGVuZ3RoIGJ5dGUgKi8KKyAgICBpbnQgYmFjazsgICAgICAgLyogbG9jYXRpb24gb2YgZmlyc3QgYmxvY2sgaWQgaW4gYml0cyBiYWNrIGZyb20gZmlyc3QgKi8KKyAgICB1aW50IHN0b3JlZDsgICAgLyogYnl0ZXMgY3VycmVudGx5IGluIGxhc3Qgc3RvcmVkIGJsb2NrICovCisgICAgb2ZmX3QgbGFzdDsgICAgIC8qIG9mZnNldCBvZiBsYXN0IHN0b3JlZCBibG9jayBmaXJzdCBsZW5ndGggYnl0ZSAqLworICAgIHVsb25nIGNjcmM7ICAgICAvKiBjcmMgb2YgY29tcHJlc3NlZCBkYXRhICovCisgICAgdWxvbmcgY2xlbjsgICAgIC8qIGxlbmd0aCAobW9kdWxvIDJeMzIpIG9mIGNvbXByZXNzZWQgZGF0YSAqLworICAgIHVsb25nIHRjcmM7ICAgICAvKiBjcmMgb2YgdG90YWwgZGF0YSAqLworICAgIHVsb25nIHRsZW47ICAgICAvKiBsZW5ndGggKG1vZHVsbyAyXjMyKSBvZiB0b3RhbCBkYXRhICovCisgICAgdGltZV90IGxvY2s7ICAgIC8qIGxhc3QgbW9kaWZ5IHRpbWUgb2Ygb3VyIGxvY2sgZmlsZSAqLworfTsKKworLyogZ3ppcCBoZWFkZXIgZm9yIGd6bG9nICovCitsb2NhbCB1bnNpZ25lZCBjaGFyIGxvZ19nemhlYWRbXSA9IHsKKyAgICAweDFmLCAweDhiLCAgICAgICAgICAgICAgICAgLyogbWFnaWMgZ3ppcCBpZCAqLworICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21wcmVzc2lvbiBtZXRob2QgaXMgZGVmbGF0ZSAqLworICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGVyZSBpcyBhbiBleHRyYSBmaWVsZCAobm8gZmlsZSBuYW1lKSAqLworICAgIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAvKiBubyBtb2RpZmljYXRpb24gdGltZSBwcm92aWRlZCAqLworICAgIDAsIDB4ZmYsICAgICAgICAgICAgICAgICAgICAvKiBubyBleHRyYSBmbGFncywgbm8gT1Mgc3BlY2lmaWVkICovCisgICAgMzksIDAsICdhJywgJ3AnLCAzNSwgMCAgICAgIC8qIGV4dHJhIGZpZWxkIHdpdGggImFwIiBzdWJmaWVsZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzNSBpcyBFWFRSQSwgMzkgaXMgRVhUUkEgKyA0ICovCit9OworCisjZGVmaW5lIEhFQUQgc2l6ZW9mKGxvZ19nemhlYWQpICAgICAvKiBzaG91bGQgYmUgMTYgKi8KKworLyogaW5pdGlhbCBnemlwIGV4dHJhIGZpZWxkIGNvbnRlbnQgKDUyID09IEhFQUQgKyBFWFRSQSArIDEpICovCitsb2NhbCB1bnNpZ25lZCBjaGFyIGxvZ19nemV4dFtdID0geworICAgIDUyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAvKiBvZmZzZXQgb2YgZmlyc3Qgc3RvcmVkIGJsb2NrIGxlbmd0aCAqLworICAgIDUyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAvKiBvZmZzZXQgb2YgbGFzdCBzdG9yZWQgYmxvY2sgbGVuZ3RoICovCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgIC8qIGNvbXByZXNzZWQgZGF0YSBjcmMgYW5kIGxlbmd0aCAqLworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAvKiB0b3RhbCBkYXRhIGNyYyBhbmQgbGVuZ3RoICovCisgICAgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbmFsIHN0b3JlZCBibG9jayBkYXRhIGxlbmd0aCAqLworICAgIDUgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcCBpcyBOT19PUCwgbGFzdCBiaXQgOCBiaXRzIGJhY2sgKi8KK307CisKKyNkZWZpbmUgRVhUUkEgc2l6ZW9mKGxvZ19nemV4dCkgICAgIC8qIHNob3VsZCBiZSAzNSAqLworCisvKiBpbml0aWFsIGd6aXAgZGF0YSBhbmQgdHJhaWxlciAqLworbG9jYWwgdW5zaWduZWQgY2hhciBsb2dfZ3pib2R5W10gPSB7CisgICAgMSwgMCwgMCwgMHhmZiwgMHhmZiwgICAgICAgIC8qIGVtcHR5IHN0b3JlZCBibG9jayAobGFzdCkgKi8KKyAgICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgLyogY3JjICovCisgICAgMCwgMCwgMCwgMCAgICAgICAgICAgICAgICAgIC8qIHVuY29tcHJlc3NlZCBsZW5ndGggKi8KK307CisKKyNkZWZpbmUgQk9EWSBzaXplb2YobG9nX2d6Ym9keSkKKworLyogRXhjbHVzaXZlbHkgY3JlYXRlIGZvby5sb2NrIGluIG9yZGVyIHRvIG5lZ290aWF0ZSBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZQorICAgZm9vLiogZmlsZXMuICBJZiB0aGUgbW9kaWZ5IHRpbWUgb2YgYW4gZXhpc3RpbmcgbG9jayBmaWxlIGlzIGdyZWF0ZXIgdGhhbgorICAgUEFUSUVOQ0Ugc2Vjb25kcyBpbiB0aGUgcGFzdCwgdGhlbiBjb25zaWRlciB0aGUgbG9jayBmaWxlIHRvIGhhdmUgYmVlbgorICAgYWJhbmRvbmVkLCBkZWxldGUgaXQsIGFuZCB0cnkgdGhlIGV4Y2x1c2l2ZSBjcmVhdGUgYWdhaW4uICBTYXZlIHRoZSBsb2NrCisgICBmaWxlIG1vZGlmeSB0aW1lIGZvciB2ZXJpZmljYXRpb24gb2Ygb3duZXJzaGlwLiAgUmV0dXJuIDAgb24gc3VjY2Vzcywgb3IgLTEKKyAgIG9uIGZhaWx1cmUsIHVzdWFsbHkgZHVlIHRvIGFuIGFjY2VzcyByZXN0cmljdGlvbiBvciBpbnZhbGlkIHBhdGguICBOb3RlIHRoYXQKKyAgIGlmIHN0YXQoKSBvciB1bmxpbmsoKSBmYWlscywgaXQgbWF5IGJlIGR1ZSB0byBhbm90aGVyIHByb2Nlc3Mgbm90aWNpbmcgdGhlCisgICBhYmFuZG9uZWQgbG9jayBmaWxlIGEgc21pZGdlIHNvb25lciBhbmQgZGVsZXRpbmcgaXQsIHNvIHRob3NlIGFyZSBub3QKKyAgIGZsYWdnZWQgYXMgYW4gZXJyb3IuICovCitsb2NhbCBpbnQgbG9nX2xvY2soc3RydWN0IGxvZyAqbG9nKQoreworICAgIGludCBmZDsKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKworICAgIHN0cmNweShsb2ctPmVuZCwgIi5sb2NrIik7CisgICAgd2hpbGUgKChmZCA9IG9wZW4obG9nLT5wYXRoLCBPX0NSRUFUIHwgT19FWENMLCAwNjQ0KSkgPCAwKSB7CisgICAgICAgIGlmIChlcnJubyAhPSBFRVhJU1QpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChzdGF0KGxvZy0+cGF0aCwgJnN0KSA9PSAwICYmIHRpbWUoTlVMTCkgLSBzdC5zdF9tdGltZSA+IFBBVElFTkNFKSB7CisgICAgICAgICAgICB1bmxpbmsobG9nLT5wYXRoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHNsZWVwKDIpOyAgICAgICAvKiByZWxpbnF1aXNoIHRoZSBDUFUgZm9yIHR3byBzZWNvbmRzIHdoaWxlIHdhaXRpbmcgKi8KKyAgICB9CisgICAgY2xvc2UoZmQpOworICAgIGlmIChzdGF0KGxvZy0+cGF0aCwgJnN0KSA9PSAwKQorICAgICAgICBsb2ctPmxvY2sgPSBzdC5zdF9tdGltZTsKKyAgICByZXR1cm4gMDsKK30KKworLyogVXBkYXRlIHRoZSBtb2RpZnkgdGltZSBvZiB0aGUgbG9jayBmaWxlIHRvIG5vdywgaW4gb3JkZXIgdG8gcHJldmVudCBhbm90aGVyCisgICB0YXNrIGZyb20gdGhpbmtpbmcgdGhhdCB0aGUgbG9jayBpcyBzdGFsZS4gIFNhdmUgdGhlIGxvY2sgZmlsZSBtb2RpZnkgdGltZQorICAgZm9yIHZlcmlmaWNhdGlvbiBvZiBvd25lcnNoaXAuICovCitsb2NhbCB2b2lkIGxvZ190b3VjaChzdHJ1Y3QgbG9nICpsb2cpCit7CisgICAgc3RydWN0IHN0YXQgc3Q7CisKKyAgICBzdHJjcHkobG9nLT5lbmQsICIubG9jayIpOworICAgIHV0aW1lcyhsb2ctPnBhdGgsIE5VTEwpOworICAgIGlmIChzdGF0KGxvZy0+cGF0aCwgJnN0KSA9PSAwKQorICAgICAgICBsb2ctPmxvY2sgPSBzdC5zdF9tdGltZTsKK30KKworLyogQ2hlY2sgdGhlIGxvZyBmaWxlIG1vZGlmeSB0aW1lIGFnYWluc3Qgd2hhdCBpcyBleHBlY3RlZC4gIFJldHVybiB0cnVlIGlmCisgICB0aGlzIGlzIG5vdCBvdXIgbG9jay4gIElmIGl0IGlzIG91ciBsb2NrLCB0b3VjaCBpdCB0byBrZWVwIGl0LiAqLworbG9jYWwgaW50IGxvZ19jaGVjayhzdHJ1Y3QgbG9nICpsb2cpCit7CisgICAgc3RydWN0IHN0YXQgc3Q7CisKKyAgICBzdHJjcHkobG9nLT5lbmQsICIubG9jayIpOworICAgIGlmIChzdGF0KGxvZy0+cGF0aCwgJnN0KSB8fCBzdC5zdF9tdGltZSAhPSBsb2ctPmxvY2spCisgICAgICAgIHJldHVybiAxOworICAgIGxvZ190b3VjaChsb2cpOworICAgIHJldHVybiAwOworfQorCisvKiBVbmxvY2sgYSBwcmV2aW91c2x5IGFjcXVpcmVkIGxvY2ssIGJ1dCBvbmx5IGlmIGl0J3Mgb3Vycy4gKi8KK2xvY2FsIHZvaWQgbG9nX3VubG9jayhzdHJ1Y3QgbG9nICpsb2cpCit7CisgICAgaWYgKGxvZ19jaGVjayhsb2cpKQorICAgICAgICByZXR1cm47CisgICAgc3RyY3B5KGxvZy0+ZW5kLCAiLmxvY2siKTsKKyAgICB1bmxpbmsobG9nLT5wYXRoKTsKKyAgICBsb2ctPmxvY2sgPSAwOworfQorCisvKiBDaGVjayB0aGUgZ3ppcCBoZWFkZXIgYW5kIHJlYWQgaW4gdGhlIGV4dHJhIGZpZWxkLCBmaWxsaW5nIGluIHRoZSB2YWx1ZXMgaW4KKyAgIHRoZSBsb2cgc3RydWN0dXJlLiAgUmV0dXJuIG9wIG9uIHN1Y2Nlc3Mgb3IgLTEgaWYgdGhlIGd6aXAgaGVhZGVyIHdhcyBub3QgYXMKKyAgIGV4cGVjdGVkLiAgb3AgaXMgdGhlIGN1cnJlbnQgb3BlcmF0aW9uIGluIHByb2dyZXNzIGxhc3Qgd3JpdHRlbiB0byB0aGUgZXh0cmEKKyAgIGZpZWxkLiAgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGd6aXAgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIG9wZW5lZCwgd2l0aCB0aGUKKyAgIGZpbGUgZGVzY3JpcHRvciBsb2ctPmZkLiAqLworbG9jYWwgaW50IGxvZ19oZWFkKHN0cnVjdCBsb2cgKmxvZykKK3sKKyAgICBpbnQgb3A7CisgICAgdW5zaWduZWQgY2hhciBidWZbSEVBRCArIEVYVFJBXTsKKworICAgIGlmIChsc2Vlayhsb2ctPmZkLCAwLCBTRUVLX1NFVCkgPCAwIHx8CisgICAgICAgIHJlYWQobG9nLT5mZCwgYnVmLCBIRUFEICsgRVhUUkEpICE9IEhFQUQgKyBFWFRSQSB8fAorICAgICAgICBtZW1jbXAoYnVmLCBsb2dfZ3poZWFkLCBIRUFEKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGxvZy0+Zmlyc3QgPSBQVUxMOChidWYgKyBIRUFEKTsKKyAgICBsb2ctPmxhc3QgPSBQVUxMOChidWYgKyBIRUFEICsgOCk7CisgICAgbG9nLT5jY3JjID0gUFVMTDQoYnVmICsgSEVBRCArIDE2KTsKKyAgICBsb2ctPmNsZW4gPSBQVUxMNChidWYgKyBIRUFEICsgMjApOworICAgIGxvZy0+dGNyYyA9IFBVTEw0KGJ1ZiArIEhFQUQgKyAyNCk7CisgICAgbG9nLT50bGVuID0gUFVMTDQoYnVmICsgSEVBRCArIDI4KTsKKyAgICBsb2ctPnN0b3JlZCA9IFBVTEwyKGJ1ZiArIEhFQUQgKyAzMik7CisgICAgbG9nLT5iYWNrID0gMyArIChidWZbSEVBRCArIDM0XSAmIDcpOworICAgIG9wID0gKGJ1ZltIRUFEICsgMzRdID4+IDMpICYgMzsKKyAgICByZXR1cm4gb3A7Cit9CisKKy8qIFdyaXRlIG92ZXIgdGhlIGV4dHJhIGZpZWxkIGNvbnRlbnRzLCBtYXJraW5nIHRoZSBvcGVyYXRpb24gYXMgb3AuICBVc2UgZnN5bmMKKyAgIHRvIGFzc3VyZSB0aGF0IHRoZSBkZXZpY2UgaXMgd3JpdHRlbiB0bywgYW5kIGluIHRoZSByZXF1ZXN0ZWQgb3JkZXIuICBUaGlzCisgICBvcGVyYXRpb24sIGFuZCBvbmx5IHRoaXMgb3BlcmF0aW9uLCBpcyBhc3N1bWVkIHRvIGJlIGF0b21pYyBpbiBvcmRlciB0bworICAgYXNzdXJlIHRoYXQgdGhlIGxvZyBpcyByZWNvdmVyYWJsZSBpbiB0aGUgZXZlbnQgb2YgYW4gaW50ZXJydXB0aW9uIGF0IGFueQorICAgcG9pbnQgaW4gdGhlIHByb2Nlc3MuICBSZXR1cm4gLTEgaWYgdGhlIHdyaXRlIHRvIGZvby5neiBmYWlsZWQuICovCitsb2NhbCBpbnQgbG9nX21hcmsoc3RydWN0IGxvZyAqbG9nLCBpbnQgb3ApCit7CisgICAgaW50IHJldDsKKyAgICB1bnNpZ25lZCBjaGFyIGV4dFtFWFRSQV07CisKKyAgICBQVVQ4KGV4dCwgbG9nLT5maXJzdCk7CisgICAgUFVUOChleHQgKyA4LCBsb2ctPmxhc3QpOworICAgIFBVVDQoZXh0ICsgMTYsIGxvZy0+Y2NyYyk7CisgICAgUFVUNChleHQgKyAyMCwgbG9nLT5jbGVuKTsKKyAgICBQVVQ0KGV4dCArIDI0LCBsb2ctPnRjcmMpOworICAgIFBVVDQoZXh0ICsgMjgsIGxvZy0+dGxlbik7CisgICAgUFVUMihleHQgKyAzMiwgbG9nLT5zdG9yZWQpOworICAgIGV4dFszNF0gPSBsb2ctPmJhY2sgLSAzICsgKG9wIDw8IDMpOworICAgIGZzeW5jKGxvZy0+ZmQpOworICAgIHJldCA9IGxzZWVrKGxvZy0+ZmQsIEhFQUQsIFNFRUtfU0VUKSA8IDAgfHwKKyAgICAgICAgICB3cml0ZShsb2ctPmZkLCBleHQsIEVYVFJBKSAhPSBFWFRSQSA/IC0xIDogMDsKKyAgICBmc3luYyhsb2ctPmZkKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBSZXdyaXRlIHRoZSBsYXN0IGJsb2NrIGhlYWRlciBiaXRzIGFuZCBzdWJzZXF1ZW50IHplcm8gYml0cyB0byBnZXQgdG8gYSBieXRlCisgICBib3VuZGFyeSwgc2V0dGluZyB0aGUgbGFzdCBibG9jayBiaXQgaWYgbGFzdCBpcyB0cnVlLCBhbmQgdGhlbiB3cml0ZSB0aGUKKyAgIHJlbWFpbmRlciBvZiB0aGUgc3RvcmVkIGJsb2NrIGhlYWRlciAobGVuZ3RoIGFuZCBvbmUncyBjb21wbGVtZW50KS4gIExlYXZlCisgICB0aGUgZmlsZSBwb2ludGVyIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGxhc3Qgc3RvcmVkIGJsb2NrIGRhdGEuICBSZXR1cm4gLTEgaWYKKyAgIHRoZXJlIGlzIGEgcmVhZCBvciB3cml0ZSBmYWlsdXJlIG9uIHRoZSBmb28uZ3ogZmlsZSAqLworbG9jYWwgaW50IGxvZ19sYXN0KHN0cnVjdCBsb2cgKmxvZywgaW50IGxhc3QpCit7CisgICAgaW50IGJhY2ssIGxlbiwgbWFzazsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1Zls2XTsKKworICAgIC8qIGRldGVybWluZSB0aGUgbG9jYXRpb25zIG9mIHRoZSBieXRlcyBhbmQgYml0cyB0byBtb2RpZnkgKi8KKyAgICBiYWNrID0gbG9nLT5sYXN0ID09IGxvZy0+Zmlyc3QgPyBsb2ctPmJhY2sgOiA4OworICAgIGxlbiA9IGJhY2sgPiA4ID8gMiA6IDE7ICAgICAgICAgICAgICAgICAvKiBieXRlcyBiYWNrIGZyb20gbG9nLT5sYXN0ICovCisgICAgbWFzayA9IDB4ODAgPj4gKChiYWNrIC0gMSkgJiA3KTsgICAgICAgIC8qIG1hc2sgZm9yIGJsb2NrIGxhc3QtYml0ICovCisKKyAgICAvKiBnZXQgdGhlIGJ5dGUgdG8gbW9kaWZ5IChvbmUgb3IgdHdvIGJhY2spIGludG8gYnVmWzBdIC0tIGRvbid0IG5lZWQgdG8KKyAgICAgICByZWFkIHRoZSBieXRlIGlmIHRoZSBsYXN0LWJpdCBpcyBlaWdodCBiaXRzIGJhY2ssIHNpbmNlIGluIHRoYXQgY2FzZQorICAgICAgIHRoZSBlbnRpcmUgYnl0ZSB3aWxsIGJlIG1vZGlmaWVkICovCisgICAgYnVmWzBdID0gMDsKKyAgICBpZiAoYmFjayAhPSA4ICYmIChsc2Vlayhsb2ctPmZkLCBsb2ctPmxhc3QgLSBsZW4sIFNFRUtfU0VUKSA8IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICByZWFkKGxvZy0+ZmQsIGJ1ZiwgMSkgIT0gMSkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIGNoYW5nZSB0aGUgbGFzdC1iaXQgb2YgdGhlIGxhc3Qgc3RvcmVkIGJsb2NrIGFzIHJlcXVlc3RlZCAtLSBub3RlCisgICAgICAgdGhhdCBhbGwgYml0cyBhYm92ZSB0aGUgbGFzdC1iaXQgYXJlIHNldCB0byB6ZXJvLCBwZXIgdGhlIHR5cGUgYml0cworICAgICAgIG9mIGEgc3RvcmVkIGJsb2NrIGJlaW5nIDAwIGFuZCBwZXIgdGhlIGNvbnZlbnRpb24gdGhhdCB0aGUgYml0cyB0bworICAgICAgIGJyaW5nIHRoZSBzdHJlYW0gdG8gYSBieXRlIGJvdW5kYXJ5IGFyZSBhbHNvIHplcm9zICovCisgICAgYnVmWzFdID0gMDsKKyAgICBidWZbMiAtIGxlbl0gPSAoKmJ1ZiAmIChtYXNrIC0gMSkpICsgKGxhc3QgPyBtYXNrIDogMCk7CisKKyAgICAvKiB3cml0ZSB0aGUgbW9kaWZpZWQgc3RvcmVkIGJsb2NrIGhlYWRlciBhbmQgbGVuZ3RocywgbW92ZSB0aGUgZmlsZQorICAgICAgIHBvaW50ZXIgdG8gYWZ0ZXIgdGhlIGxhc3Qgc3RvcmVkIGJsb2NrIGRhdGEgKi8KKyAgICBQVVQyKGJ1ZiArIDIsIGxvZy0+c3RvcmVkKTsKKyAgICBQVVQyKGJ1ZiArIDQsIGxvZy0+c3RvcmVkIF4gMHhmZmZmKTsKKyAgICByZXR1cm4gbHNlZWsobG9nLT5mZCwgbG9nLT5sYXN0IC0gbGVuLCBTRUVLX1NFVCkgPCAwIHx8CisgICAgICAgICAgIHdyaXRlKGxvZy0+ZmQsIGJ1ZiArIDIgLSBsZW4sIGxlbiArIDQpICE9IGxlbiArIDQgfHwKKyAgICAgICAgICAgbHNlZWsobG9nLT5mZCwgbG9nLT5zdG9yZWQsIFNFRUtfQ1VSKSA8IDAgPyAtMSA6IDA7Cit9CisKKy8qIEFwcGVuZCBsZW4gYnl0ZXMgZnJvbSBkYXRhIHRvIHRoZSBsb2NrZWQgYW5kIG9wZW4gbG9nIGZpbGUuICBsZW4gbWF5IGJlIHplcm8KKyAgIGlmIHJlY292ZXJpbmcgYW5kIG5vIC5hZGQgZmlsZSB3YXMgZm91bmQuICBJbiB0aGF0IGNhc2UsIHRoZSBwcmV2aW91cyBzdGF0ZQorICAgb2YgdGhlIGZvby5neiBmaWxlIGlzIHJlc3RvcmVkLiAgVGhlIGRhdGEgaXMgYXBwZW5kZWQgdW5jb21wcmVzc2VkIGluCisgICBkZWZsYXRlIHN0b3JlZCBibG9ja3MuICBSZXR1cm4gLTEgaWYgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgb3Igd3JpdGluZworICAgdGhlIGZvby5neiBmaWxlLiAqLworbG9jYWwgaW50IGxvZ19hcHBlbmQoc3RydWN0IGxvZyAqbG9nLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBzaXplX3QgbGVuKQoreworICAgIHVpbnQgcHV0OworICAgIG9mZl90IGVuZDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKKworICAgIC8qIHNldCB0aGUgbGFzdCBibG9jayBsYXN0LWJpdCBhbmQgbGVuZ3RoLCBpbiBjYXNlIHJlY292ZXJpbmcgYW4KKyAgICAgICBpbnRlcnJ1cHRlZCBhcHBlbmQsIHRoZW4gcG9zaXRpb24gdGhlIGZpbGUgcG9pbnRlciB0byBhcHBlbmQgdG8gdGhlCisgICAgICAgYmxvY2sgKi8KKyAgICBpZiAobG9nX2xhc3QobG9nLCAxKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogYXBwZW5kLCBhZGRpbmcgc3RvcmVkIGJsb2NrcyBhbmQgdXBkYXRpbmcgdGhlIG9mZnNldCBvZiB0aGUgbGFzdCBzdG9yZWQKKyAgICAgICBibG9jayBhcyBuZWVkZWQsIGFuZCB1cGRhdGUgdGhlIHRvdGFsIGNyYyBhbmQgbGVuZ3RoICovCisgICAgd2hpbGUgKGxlbikgeworICAgICAgICAvKiBhcHBlbmQgYXMgbXVjaCBhcyB3ZSBjYW4gdG8gdGhlIGxhc3QgYmxvY2sgKi8KKyAgICAgICAgcHV0ID0gKE1BWF9TVE9SRSA8PCAxMCkgLSBsb2ctPnN0b3JlZDsKKyAgICAgICAgaWYgKHB1dCA+IGxlbikKKyAgICAgICAgICAgIHB1dCA9ICh1aW50KWxlbjsKKyAgICAgICAgaWYgKHB1dCkgeworICAgICAgICAgICAgaWYgKHdyaXRlKGxvZy0+ZmQsIGRhdGEsIHB1dCkgIT0gcHV0KQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIEJBSUwoMSk7CisgICAgICAgICAgICBsb2ctPnRjcmMgPSBjcmMzMihsb2ctPnRjcmMsIGRhdGEsIHB1dCk7CisgICAgICAgICAgICBsb2ctPnRsZW4gKz0gcHV0OworICAgICAgICAgICAgbG9nLT5zdG9yZWQgKz0gcHV0OworICAgICAgICAgICAgZGF0YSArPSBwdXQ7CisgICAgICAgICAgICBsZW4gLT0gcHV0OworICAgICAgICB9CisKKyAgICAgICAgLyogaWYgd2UgbmVlZCB0bywgYWRkIGEgbmV3IGVtcHR5IHN0b3JlZCBibG9jayAqLworICAgICAgICBpZiAobGVuKSB7CisgICAgICAgICAgICAvKiBtYXJrIGN1cnJlbnQgYmxvY2sgYXMgbm90IGxhc3QgKi8KKyAgICAgICAgICAgIGlmIChsb2dfbGFzdChsb2csIDApKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgLyogcG9pbnQgdG8gbmV3LCBlbXB0eSBzdG9yZWQgYmxvY2sgKi8KKyAgICAgICAgICAgIGxvZy0+bGFzdCArPSA0ICsgbG9nLT5zdG9yZWQgKyAxOworICAgICAgICAgICAgbG9nLT5zdG9yZWQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyogbWFyayBsYXN0IGJsb2NrIGFzIGxhc3QsIHVwZGF0ZSBpdHMgbGVuZ3RoICovCisgICAgICAgIGlmIChsb2dfbGFzdChsb2csIDEpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBCQUlMKDIpOworICAgIH0KKworICAgIC8qIHdyaXRlIHRoZSBuZXcgY3JjIGFuZCBsZW5ndGggdHJhaWxlciwgYW5kIHRydW5jYXRlIGp1c3QgaW4gY2FzZSAoY291bGQKKyAgICAgICBiZSByZWNvdmVyaW5nIGZyb20gcGFydGlhbCBhcHBlbmQgd2l0aCBhIG1pc3NpbmcgZm9vLmFkZCBmaWxlKSAqLworICAgIFBVVDQoYnVmLCBsb2ctPnRjcmMpOworICAgIFBVVDQoYnVmICsgNCwgbG9nLT50bGVuKTsKKyAgICBpZiAod3JpdGUobG9nLT5mZCwgYnVmLCA4KSAhPSA4IHx8CisgICAgICAgIChlbmQgPSBsc2Vlayhsb2ctPmZkLCAwLCBTRUVLX0NVUikpIDwgMCB8fCBmdHJ1bmNhdGUobG9nLT5mZCwgZW5kKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogd3JpdGUgdGhlIGV4dHJhIGZpZWxkLCBtYXJraW5nIHRoZSBsb2cgZmlsZSBhcyBkb25lLCBkZWxldGUgLmFkZCBmaWxlICovCisgICAgaWYgKGxvZ19tYXJrKGxvZywgTk9fT1ApKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc3RyY3B5KGxvZy0+ZW5kLCAiLmFkZCIpOworICAgIHVubGluayhsb2ctPnBhdGgpOyAgICAgICAgICAvKiBpZ25vcmUgZXJyb3IsIHNpbmNlIG1heSBub3QgZXhpc3QgKi8KKyAgICByZXR1cm4gMDsKK30KKworLyogUmVwbGFjZSB0aGUgZm9vLmRpY3QgZmlsZSB3aXRoIHRoZSBmb28udGVtcCBmaWxlLiAgQWxzbyBkZWxldGUgdGhlIGZvby5hZGQKKyAgIGZpbGUsIHNpbmNlIHRoZSBjb21wcmVzcyBvcGVyYXRpb24gbWF5IGhhdmUgYmVlbiBpbnRlcnJ1cHRlZCBiZWZvcmUgdGhhdCB3YXMKKyAgIGRvbmUuICBSZXR1cm5zIDEgaWYgbWVtb3J5IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQsIG9yIC0xIGlmIHJlYWRpbmcgb3IKKyAgIHdyaXRpbmcgZm9vLmd6IGZhaWxzLCBvciBpZiB0aGUgcmVuYW1lIGZhaWxzIGZvciBzb21lIHJlYXNvbiBvdGhlciB0aGFuCisgICBmb28udGVtcCBub3QgZXhpc3RpbmcuICBmb28udGVtcCBub3QgZXhpc3RpbmcgaXMgYSBwZXJtaXR0ZWQgZXJyb3IsIHNpbmNlCisgICB0aGUgcmVwbGFjZSBvcGVyYXRpb24gbWF5IGhhdmUgYmVlbiBpbnRlcnJ1cHRlZCBhZnRlciB0aGUgcmVuYW1lIGlzIGRvbmUsCisgICBidXQgYmVmb3JlIGZvby5neiBpcyBtYXJrZWQgYXMgY29tcGxldGUuICovCitsb2NhbCBpbnQgbG9nX3JlcGxhY2Uoc3RydWN0IGxvZyAqbG9nKQoreworICAgIGludCByZXQ7CisgICAgY2hhciAqZGVzdDsKKworICAgIC8qIGRlbGV0ZSBmb28uYWRkIGZpbGUgKi8KKyAgICBzdHJjcHkobG9nLT5lbmQsICIuYWRkIik7CisgICAgdW5saW5rKGxvZy0+cGF0aCk7ICAgICAgICAgLyogaWdub3JlIGVycm9yLCBzaW5jZSBtYXkgbm90IGV4aXN0ICovCisgICAgQkFJTCgzKTsKKworICAgIC8qIHJlbmFtZSBmb28ubmFtZSB0byBmb28uZGljdCwgcmVwbGFjaW5nIGZvby5kaWN0IGlmIGl0IGV4aXN0cyAqLworICAgIHN0cmNweShsb2ctPmVuZCwgIi5kaWN0Iik7CisgICAgZGVzdCA9IG1hbGxvYyhzdHJsZW4obG9nLT5wYXRoKSArIDEpOworICAgIGlmIChkZXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMjsKKyAgICBzdHJjcHkoZGVzdCwgbG9nLT5wYXRoKTsKKyAgICBzdHJjcHkobG9nLT5lbmQsICIudGVtcCIpOworICAgIHJldCA9IHJlbmFtZShsb2ctPnBhdGgsIGRlc3QpOworICAgIGZyZWUoZGVzdCk7CisgICAgaWYgKHJldCAmJiBlcnJubyAhPSBFTk9FTlQpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBCQUlMKDQpOworCisgICAgLyogbWFyayB0aGUgZm9vLmd6IGZpbGUgYXMgZG9uZSAqLworICAgIHJldHVybiBsb2dfbWFyayhsb2csIE5PX09QKTsKK30KKworLyogQ29tcHJlc3MgdGhlIGxlbiBieXRlcyBhdCBkYXRhIGFuZCBhcHBlbmQgdGhlIGNvbXByZXNzZWQgZGF0YSB0byB0aGUKKyAgIGZvby5neiBkZWZsYXRlIGRhdGEgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHByZXZpb3VzIGNvbXByZXNzZWQgZGF0YS4gIFRoaXMKKyAgIG92ZXJ3cml0ZXMgdGhlIHByZXZpb3VzIHVuY29tcHJlc3NlZCBkYXRhLCB3aGljaCB3YXMgc3RvcmVkIGluIGZvby5hZGQKKyAgIGFuZCBpcyB0aGUgZGF0YSBwcm92aWRlZCBpbiBkYXRhWzAuLmxlbi0xXS4gIElmIHRoaXMgb3BlcmF0aW9uIGlzCisgICBpbnRlcnJ1cHRlZCwgaXQgcGlja3MgdXAgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgcm91dGluZSwgd2l0aCB0aGUgZm9vLmFkZAorICAgZmlsZSByZWFkIGluIGFnYWluLiAgSWYgdGhlcmUgaXMgbm8gZGF0YSB0byBjb21wcmVzcyAobGVuID09IDApLCB0aGVuIHdlCisgICBzaW1wbHkgdGVybWluYXRlIHRoZSBmb28uZ3ogZmlsZSBhZnRlciB0aGUgcHJldmlvdXNseSBjb21wcmVzc2VkIGRhdGEsCisgICBhcHBlbmRpbmcgYSBmaW5hbCBlbXB0eSBzdG9yZWQgYmxvY2sgYW5kIHRoZSBnemlwIHRyYWlsZXIuICBSZXR1cm4gLTEgaWYKKyAgIHJlYWRpbmcgb3Igd3JpdGluZyB0aGUgbG9nLmd6IGZpbGUgZmFpbGVkLCBvciAtMiBpZiB0aGVyZSB3YXMgYSBtZW1vcnkKKyAgIGFsbG9jYXRpb24gZmFpbHVyZS4gKi8KK2xvY2FsIGludCBsb2dfY29tcHJlc3Moc3RydWN0IGxvZyAqbG9nLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBzaXplX3QgbGVuKQoreworICAgIGludCBmZDsKKyAgICB1aW50IGdvdCwgbWF4OworICAgIHNzaXplX3QgZGljdDsKKyAgICBvZmZfdCBlbmQ7CisgICAgel9zdHJlYW0gc3RybTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1ZltESUNUXTsKKworICAgIC8qIGNvbXByZXNzIGFuZCBhcHBlbmQgY29tcHJlc3NlZCBkYXRhICovCisgICAgaWYgKGxlbikgeworICAgICAgICAvKiBzZXQgdXAgZm9yIGRlZmxhdGUsIGFsbG9jYXRpbmcgbWVtb3J5ICovCisgICAgICAgIHN0cm0uemFsbG9jID0gWl9OVUxMOworICAgICAgICBzdHJtLnpmcmVlID0gWl9OVUxMOworICAgICAgICBzdHJtLm9wYXF1ZSA9IFpfTlVMTDsKKyAgICAgICAgaWYgKGRlZmxhdGVJbml0Migmc3RybSwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OLCBaX0RFRkxBVEVELCAtMTUsIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgWl9ERUZBVUxUX1NUUkFURUdZKSAhPSBaX09LKQorICAgICAgICAgICAgcmV0dXJuIC0yOworCisgICAgICAgIC8qIHJlYWQgaW4gZGljdGlvbmFyeSAobGFzdCAzMksgb2YgZGF0YSB0aGF0IHdhcyBjb21wcmVzc2VkKSAqLworICAgICAgICBzdHJjcHkobG9nLT5lbmQsICIuZGljdCIpOworICAgICAgICBmZCA9IG9wZW4obG9nLT5wYXRoLCBPX1JET05MWSwgMCk7CisgICAgICAgIGlmIChmZCA+PSAwKSB7CisgICAgICAgICAgICBkaWN0ID0gcmVhZChmZCwgYnVmLCBESUNUKTsKKyAgICAgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgICAgIGlmIChkaWN0IDwgMCkgeworICAgICAgICAgICAgICAgIGRlZmxhdGVFbmQoJnN0cm0pOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkaWN0KQorICAgICAgICAgICAgICAgIGRlZmxhdGVTZXREaWN0aW9uYXJ5KCZzdHJtLCBidWYsICh1aW50KWRpY3QpOworICAgICAgICB9CisgICAgICAgIGxvZ190b3VjaChsb2cpOworCisgICAgICAgIC8qIHByaW1lIGRlZmxhdGUgd2l0aCBsYXN0IGJpdHMgb2YgcHJldmlvdXMgYmxvY2ssIHBvc2l0aW9uIHdyaXRlCisgICAgICAgICAgIHBvaW50ZXIgdG8gd3JpdGUgdGhvc2UgYml0cyBhbmQgb3ZlcndyaXRlIHdoYXQgZm9sbG93cyAqLworICAgICAgICBpZiAobHNlZWsobG9nLT5mZCwgbG9nLT5maXJzdCAtIChsb2ctPmJhY2sgPiA4ID8gMiA6IDEpLAorICAgICAgICAgICAgICAgIFNFRUtfU0VUKSA8IDAgfHwKKyAgICAgICAgICAgIHJlYWQobG9nLT5mZCwgYnVmLCAxKSAhPSAxIHx8IGxzZWVrKGxvZy0+ZmQsIC0xLCBTRUVLX0NVUikgPCAwKSB7CisgICAgICAgICAgICBkZWZsYXRlRW5kKCZzdHJtKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBkZWZsYXRlUHJpbWUoJnN0cm0sICg4IC0gbG9nLT5iYWNrKSAmIDcsICpidWYpOworCisgICAgICAgIC8qIGNvbXByZXNzLCBmaW5pc2hpbmcgd2l0aCBhIHBhcnRpYWwgbm9uLWxhc3QgZW1wdHkgc3RhdGljIGJsb2NrICovCisgICAgICAgIHN0cm0ubmV4dF9pbiA9IGRhdGE7CisgICAgICAgIG1heCA9ICgoKHVpbnQpMCAtIDEpID4+IDEpICsgMTsgLyogaW4gY2FzZSBpbnQgc21hbGxlciB0aGFuIHNpemVfdCAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICBzdHJtLmF2YWlsX2luID0gbGVuID4gbWF4ID8gbWF4IDogKHVpbnQpbGVuOworICAgICAgICAgICAgbGVuIC09IHN0cm0uYXZhaWxfaW47CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBESUNUOworICAgICAgICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSBidWY7CisgICAgICAgICAgICAgICAgZGVmbGF0ZSgmc3RybSwgbGVuID8gWl9OT19GTFVTSCA6IFpfUEFSVElBTF9GTFVTSCk7CisgICAgICAgICAgICAgICAgZ290ID0gRElDVCAtIHN0cm0uYXZhaWxfb3V0OworICAgICAgICAgICAgICAgIGlmIChnb3QgJiYgd3JpdGUobG9nLT5mZCwgYnVmLCBnb3QpICE9IGdvdCkgeworICAgICAgICAgICAgICAgICAgICBkZWZsYXRlRW5kKCZzdHJtKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb2dfdG91Y2gobG9nKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKHN0cm0uYXZhaWxfb3V0ID09IDApOworICAgICAgICB9IHdoaWxlIChsZW4pOworICAgICAgICBkZWZsYXRlRW5kKCZzdHJtKTsKKyAgICAgICAgQkFJTCg1KTsKKworICAgICAgICAvKiBmaW5kIHN0YXJ0IG9mIGVtcHR5IHN0YXRpYyBibG9jayAtLSBzY2FubmluZyBiYWNrd2FyZHMgdGhlIGZpcnN0IG9uZQorICAgICAgICAgICBiaXQgaXMgdGhlIHNlY29uZCBiaXQgb2YgdGhlIGJsb2NrLCBpZiB0aGUgbGFzdCBieXRlIGlzIHplcm8sIHRoZW4KKyAgICAgICAgICAgd2Uga25vdyB0aGUgYnl0ZSBiZWZvcmUgdGhhdCBoYXMgYSBvbmUgaW4gdGhlIHRvcCBiaXQsIHNpbmNlIGFuCisgICAgICAgICAgIGVtcHR5IHN0YXRpYyBibG9jayBpcyB0ZW4gYml0cyBsb25nICovCisgICAgICAgIGlmICgobG9nLT5maXJzdCA9IGxzZWVrKGxvZy0+ZmQsIC0xLCBTRUVLX0NVUikpIDwgMCB8fAorICAgICAgICAgICAgcmVhZChsb2ctPmZkLCBidWYsIDEpICE9IDEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGxvZy0+Zmlyc3QrKzsKKyAgICAgICAgaWYgKCpidWYpIHsKKyAgICAgICAgICAgIGxvZy0+YmFjayA9IDE7CisgICAgICAgICAgICB3aGlsZSAoKCpidWYgJiAoKHVpbnQpMSA8PCAoOCAtIGxvZy0+YmFjaysrKSkpID09IDApCisgICAgICAgICAgICAgICAgOyAgICAgICAvKiBndWFyYW50ZWVkIHRvIHRlcm1pbmF0ZSwgc2luY2UgKmJ1ZiAhPSAwICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbG9nLT5iYWNrID0gMTA7CisKKyAgICAgICAgLyogdXBkYXRlIGNvbXByZXNzZWQgY3JjIGFuZCBsZW5ndGggKi8KKyAgICAgICAgbG9nLT5jY3JjID0gbG9nLT50Y3JjOworICAgICAgICBsb2ctPmNsZW4gPSBsb2ctPnRsZW47CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBubyBkYXRhIHRvIGNvbXByZXNzIC0tIGZpeCB1cCBleGlzdGluZyBnemlwIHN0cmVhbSAqLworICAgICAgICBsb2ctPnRjcmMgPSBsb2ctPmNjcmM7CisgICAgICAgIGxvZy0+dGxlbiA9IGxvZy0+Y2xlbjsKKyAgICB9CisKKyAgICAvKiBjb21wbGV0ZSBhbmQgdHJ1bmNhdGUgZ3ppcCBzdHJlYW0gKi8KKyAgICBsb2ctPmxhc3QgPSBsb2ctPmZpcnN0OworICAgIGxvZy0+c3RvcmVkID0gMDsKKyAgICBQVVQ0KGJ1ZiwgbG9nLT50Y3JjKTsKKyAgICBQVVQ0KGJ1ZiArIDQsIGxvZy0+dGxlbik7CisgICAgaWYgKGxvZ19sYXN0KGxvZywgMSkgfHwgd3JpdGUobG9nLT5mZCwgYnVmLCA4KSAhPSA4IHx8CisgICAgICAgIChlbmQgPSBsc2Vlayhsb2ctPmZkLCAwLCBTRUVLX0NVUikpIDwgMCB8fCBmdHJ1bmNhdGUobG9nLT5mZCwgZW5kKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIEJBSUwoNik7CisKKyAgICAvKiBtYXJrIGFzIGJlaW5nIGluIHRoZSByZXBsYWNlIG9wZXJhdGlvbiAqLworICAgIGlmIChsb2dfbWFyayhsb2csIFJFUExBQ0VfT1ApKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiBleGVjdXRlIHRoZSByZXBsYWNlIG9wZXJhdGlvbiBhbmQgbWFyayB0aGUgZmlsZSBhcyBkb25lICovCisgICAgcmV0dXJuIGxvZ19yZXBsYWNlKGxvZyk7Cit9CisKKy8qIGxvZyBhIHJlcGFpciByZWNvcmQgdG8gdGhlIC5yZXBhaXJzIGZpbGUgKi8KK2xvY2FsIHZvaWQgbG9nX2xvZyhzdHJ1Y3QgbG9nICpsb2csIGludCBvcCwgY2hhciAqcmVjb3JkKQoreworICAgIHRpbWVfdCBub3c7CisgICAgRklMRSAqcmVjOworCisgICAgbm93ID0gdGltZShOVUxMKTsKKyAgICBzdHJjcHkobG9nLT5lbmQsICIucmVwYWlycyIpOworICAgIHJlYyA9IGZvcGVuKGxvZy0+cGF0aCwgImEiKTsKKyAgICBpZiAocmVjID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBmcHJpbnRmKHJlYywgIiUuMjRzICVzIHJlY292ZXJ5OiAlc1xuIiwgY3RpbWUoJm5vdyksIG9wID09IEFQUEVORF9PUCA/CisgICAgICAgICAgICAiYXBwZW5kIiA6IChvcCA9PSBDT01QUkVTU19PUCA/ICJjb21wcmVzcyIgOiAicmVwbGFjZSIpLCByZWNvcmQpOworICAgIGZjbG9zZShyZWMpOworICAgIHJldHVybjsKK30KKworLyogUmVjb3ZlciB0aGUgaW50ZXJydXB0ZWQgb3BlcmF0aW9uIG9wLiAgRmlyc3QgcmVhZCBmb28uYWRkIGZvciByZWNvdmVyaW5nIGFuCisgICBhcHBlbmQgb3IgY29tcHJlc3Mgb3BlcmF0aW9uLiAgUmV0dXJuIC0xIGlmIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIG9yCisgICB3cml0aW5nIGZvby5neiBvciByZWFkaW5nIGFuIGV4aXN0aW5nIGZvby5hZGQsIG9yIC0yIGlmIHRoZXJlIHdhcyBhIG1lbW9yeQorICAgYWxsb2NhdGlvbiBmYWlsdXJlLiAqLworbG9jYWwgaW50IGxvZ19yZWNvdmVyKHN0cnVjdCBsb2cgKmxvZywgaW50IG9wKQoreworICAgIGludCBmZCwgcmV0ID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyICpkYXRhID0gTlVMTDsKKyAgICBzaXplX3QgbGVuID0gMDsKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKworICAgIC8qIGxvZyByZWNvdmVyeSAqLworICAgIGxvZ19sb2cobG9nLCBvcCwgInN0YXJ0Iik7CisKKyAgICAvKiBsb2FkIGZvby5hZGQgZmlsZSBpZiBleHBlY3RlZCBhbmQgcHJlc2VudCAqLworICAgIGlmIChvcCA9PSBBUFBFTkRfT1AgfHwgb3AgPT0gQ09NUFJFU1NfT1ApIHsKKyAgICAgICAgc3RyY3B5KGxvZy0+ZW5kLCAiLmFkZCIpOworICAgICAgICBpZiAoc3RhdChsb2ctPnBhdGgsICZzdCkgPT0gMCAmJiBzdC5zdF9zaXplKSB7CisgICAgICAgICAgICBsZW4gPSAoc2l6ZV90KShzdC5zdF9zaXplKTsKKyAgICAgICAgICAgIGlmICgob2ZmX3QpbGVuICE9IHN0LnN0X3NpemUgfHwKKyAgICAgICAgICAgICAgICAgICAgKGRhdGEgPSBtYWxsb2Moc3Quc3Rfc2l6ZSkpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBsb2dfbG9nKGxvZywgb3AsICJhbGxvY2F0aW9uIGZhaWx1cmUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGZkID0gb3Blbihsb2ctPnBhdGgsIE9fUkRPTkxZLCAwKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgbG9nX2xvZyhsb2csIG9wLCAiLmFkZCBmaWxlIHJlYWQgZmFpbHVyZSIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IChzaXplX3QpcmVhZChmZCwgZGF0YSwgbGVuKSAhPSBsZW47CisgICAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgbG9nX2xvZyhsb2csIG9wLCAiLmFkZCBmaWxlIHJlYWQgZmFpbHVyZSIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZ19sb2cobG9nLCBvcCwgImxvYWRlZCAuYWRkIGZpbGUiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBsb2dfbG9nKGxvZywgb3AsICJtaXNzaW5nIC5hZGQgZmlsZSEiKTsKKyAgICB9CisKKyAgICAvKiByZWNvdmVyIHRoZSBpbnRlcnJ1cHRlZCBvcGVyYXRpb24gKi8KKyAgICBzd2l0Y2ggKG9wKSB7CisgICAgY2FzZSBBUFBFTkRfT1A6CisgICAgICAgIHJldCA9IGxvZ19hcHBlbmQobG9nLCBkYXRhLCBsZW4pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENPTVBSRVNTX09QOgorICAgICAgICByZXQgPSBsb2dfY29tcHJlc3MobG9nLCBkYXRhLCBsZW4pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJFUExBQ0VfT1A6CisgICAgICAgIHJldCA9IGxvZ19yZXBsYWNlKGxvZyk7CisgICAgfQorCisgICAgLyogbG9nIHN0YXR1cyAqLworICAgIGxvZ19sb2cobG9nLCBvcCwgcmV0ID8gImZhaWx1cmUiIDogImNvbXBsZXRlIik7CisKKyAgICAvKiBjbGVhbiB1cCAqLworICAgIGlmIChkYXRhICE9IE5VTEwpCisgICAgICAgIGZyZWUoZGF0YSk7CisgICAgcmV0dXJuIHJldDsKK30KKworLyogQ2xvc2UgdGhlIGZvby5neiBmaWxlIChpZiBvcGVuKSBhbmQgcmVsZWFzZSB0aGUgbG9jay4gKi8KK2xvY2FsIHZvaWQgbG9nX2Nsb3NlKHN0cnVjdCBsb2cgKmxvZykKK3sKKyAgICBpZiAobG9nLT5mZCA+PSAwKQorICAgICAgICBjbG9zZShsb2ctPmZkKTsKKyAgICBsb2ctPmZkID0gLTE7CisgICAgbG9nX3VubG9jayhsb2cpOworfQorCisvKiBPcGVuIGZvby5neiwgdmVyaWZ5IHRoZSBoZWFkZXIsIGFuZCBsb2FkIHRoZSBleHRyYSBmaWVsZCBjb250ZW50cywgYWZ0ZXIKKyAgIGZpcnN0IGNyZWF0aW5nIHRoZSBmb28ubG9jayBmaWxlIHRvIGdhaW4gZXhjbHVzaXZlIGFjY2VzcyB0byB0aGUgZm9vLioKKyAgIGZpbGVzLiAgSWYgZm9vLmd6IGRvZXMgbm90IGV4aXN0IG9yIGlzIGVtcHR5LCB0aGVuIHdyaXRlIHRoZSBpbml0aWFsIGhlYWRlciwKKyAgIGV4dHJhLCBhbmQgYm9keSBjb250ZW50IG9mIGFuIGVtcHR5IGZvby5neiBsb2cgZmlsZS4gIElmIHRoZXJlIGlzIGFuIGVycm9yCisgICBjcmVhdGluZyB0aGUgbG9jayBmaWxlIGR1ZSB0byBhY2Nlc3MgcmVzdHJpY3Rpb25zLCBvciBhbiBlcnJvciByZWFkaW5nIG9yCisgICB3cml0aW5nIHRoZSBmb28uZ3ogZmlsZSwgb3IgaWYgdGhlIGZvby5neiBmaWxlIGlzIG5vdCBhIHByb3BlciBsb2cgZmlsZSBmb3IKKyAgIHRoaXMgb2JqZWN0IChlLmcuIG5vdCBhIGd6aXAgZmlsZSBvciBkb2VzIG5vdCBjb250YWluIHRoZSBleHBlY3RlZCBleHRyYQorICAgZmllbGQpLCB0aGVuIHJldHVybiB0cnVlLiAgSWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRoZSBsb2NrIGlzIHJlbGVhc2VkLgorICAgT3RoZXJ3aXNlLCB0aGUgbG9jayBpcyBsZWZ0IGluIHBsYWNlLiAqLworbG9jYWwgaW50IGxvZ19vcGVuKHN0cnVjdCBsb2cgKmxvZykKK3sKKyAgICBpbnQgb3A7CisKKyAgICAvKiByZWxlYXNlIG9wZW4gZmlsZSByZXNvdXJjZSBpZiBsZWZ0IG92ZXIgLS0gY2FuIG9jY3VyIGlmIGxvY2sgbG9zdAorICAgICAgIGJldHdlZW4gZ3psb2dfb3BlbigpIGFuZCBnemxvZ193cml0ZSgpICovCisgICAgaWYgKGxvZy0+ZmQgPj0gMCkKKyAgICAgICAgY2xvc2UobG9nLT5mZCk7CisgICAgbG9nLT5mZCA9IC0xOworCisgICAgLyogbmVnb3RpYXRlIGV4Y2x1c2l2ZSBhY2Nlc3MgKi8KKyAgICBpZiAobG9nX2xvY2sobG9nKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIG9wZW4gdGhlIGxvZyBmaWxlLCBmb28uZ3ogKi8KKyAgICBzdHJjcHkobG9nLT5lbmQsICIuZ3oiKTsKKyAgICBsb2ctPmZkID0gb3Blbihsb2ctPnBhdGgsIE9fUkRXUiB8IE9fQ1JFQVQsIDA2NDQpOworICAgIGlmIChsb2ctPmZkIDwgMCkgeworICAgICAgICBsb2dfY2xvc2UobG9nKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGlmIG5ldywgaW5pdGlhbGl6ZSBmb28uZ3ogd2l0aCBhbiBlbXB0eSBsb2csIGRlbGV0ZSBvbGQgZGljdGlvbmFyeSAqLworICAgIGlmIChsc2Vlayhsb2ctPmZkLCAwLCBTRUVLX0VORCkgPT0gMCkgeworICAgICAgICBpZiAod3JpdGUobG9nLT5mZCwgbG9nX2d6aGVhZCwgSEVBRCkgIT0gSEVBRCB8fAorICAgICAgICAgICAgd3JpdGUobG9nLT5mZCwgbG9nX2d6ZXh0LCBFWFRSQSkgIT0gRVhUUkEgfHwKKyAgICAgICAgICAgIHdyaXRlKGxvZy0+ZmQsIGxvZ19nemJvZHksIEJPRFkpICE9IEJPRFkpIHsKKyAgICAgICAgICAgIGxvZ19jbG9zZShsb2cpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHN0cmNweShsb2ctPmVuZCwgIi5kaWN0Iik7CisgICAgICAgIHVubGluayhsb2ctPnBhdGgpOworICAgIH0KKworICAgIC8qIHZlcmlmeSBsb2cgZmlsZSBhbmQgbG9hZCBleHRyYSBmaWVsZCBpbmZvcm1hdGlvbiAqLworICAgIGlmICgob3AgPSBsb2dfaGVhZChsb2cpKSA8IDApIHsKKyAgICAgICAgbG9nX2Nsb3NlKGxvZyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBjaGVjayBmb3IgaW50ZXJydXB0ZWQgcHJvY2VzcyBhbmQgaWYgc28sIHJlY292ZXIgKi8KKyAgICBpZiAob3AgIT0gTk9fT1AgJiYgbG9nX3JlY292ZXIobG9nLCBvcCkpIHsKKyAgICAgICAgbG9nX2Nsb3NlKGxvZyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiB0b3VjaCB0aGUgbG9jayBmaWxlIHRvIHByZXZlbnQgYW5vdGhlciBwcm9jZXNzIGZyb20gZ3JhYmJpbmcgaXQgKi8KKyAgICBsb2dfdG91Y2gobG9nKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogU2VlIGd6bG9nLmggZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZXh0ZXJuYWwgbWV0aG9kcyBiZWxvdyAqLworZ3psb2cgKmd6bG9nX29wZW4oY2hhciAqcGF0aCkKK3sKKyAgICBzaXplX3QgbjsKKyAgICBzdHJ1Y3QgbG9nICpsb2c7CisKKyAgICAvKiBjaGVjayBhcmd1bWVudHMgKi8KKyAgICBpZiAocGF0aCA9PSBOVUxMIHx8ICpwYXRoID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgbG9nIHN0cnVjdHVyZSAqLworICAgIGxvZyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGxvZykpOworICAgIGlmIChsb2cgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3RyY3B5KGxvZy0+aWQsIExPR0lEKTsKKyAgICBsb2ctPmZkID0gLTE7CisKKyAgICAvKiBzYXZlIHBhdGggYW5kIGVuZCBvZiBwYXRoIGZvciBuYW1lIGNvbnN0cnVjdGlvbiAqLworICAgIG4gPSBzdHJsZW4ocGF0aCk7CisgICAgbG9nLT5wYXRoID0gbWFsbG9jKG4gKyA5KTsgICAgICAgICAgICAgIC8qIGFsbG93IGZvciAiLnJlcGFpcnMiICovCisgICAgaWYgKGxvZy0+cGF0aCA9PSBOVUxMKSB7CisgICAgICAgIGZyZWUobG9nKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN0cmNweShsb2ctPnBhdGgsIHBhdGgpOworICAgIGxvZy0+ZW5kID0gbG9nLT5wYXRoICsgbjsKKworICAgIC8qIGdhaW4gZXhjbHVzaXZlIGFjY2VzcyBhbmQgdmVyaWZ5IGxvZyBmaWxlIC0tIG1heSBwZXJmb3JtIGEKKyAgICAgICByZWNvdmVyeSBvcGVyYXRpb24gaWYgbmVlZGVkICovCisgICAgaWYgKGxvZ19vcGVuKGxvZykpIHsKKyAgICAgICAgZnJlZShsb2ctPnBhdGgpOworICAgICAgICBmcmVlKGxvZyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIHJldHVybiBwb2ludGVyIHRvIGxvZyBzdHJ1Y3R1cmUgKi8KKyAgICByZXR1cm4gbG9nOworfQorCisvKiBnemxvZ19jb21wcmVzcygpIHJldHVybiB2YWx1ZXM6CisgICAgMDogYWxsIGdvb2QKKyAgIC0xOiBmaWxlIGkvbyBlcnJvciAodXN1YWxseSBhY2Nlc3MgaXNzdWUpCisgICAtMjogbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZQorICAgLTM6IGludmFsaWQgbG9nIHBvaW50ZXIgYXJndW1lbnQgKi8KK2ludCBnemxvZ19jb21wcmVzcyhnemxvZyAqbG9nZCkKK3sKKyAgICBpbnQgZmQsIHJldDsKKyAgICB1aW50IGJsb2NrOworICAgIHNpemVfdCBsZW4sIG5leHQ7CisgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgYnVmWzVdOworICAgIHN0cnVjdCBsb2cgKmxvZyA9IGxvZ2Q7CisKKyAgICAvKiBjaGVjayBhcmd1bWVudHMgKi8KKyAgICBpZiAobG9nID09IE5VTEwgfHwgc3RyY21wKGxvZy0+aWQsIExPR0lEKSkKKyAgICAgICAgcmV0dXJuIC0zOworCisgICAgLyogc2VlIGlmIHdlIGxvc3QgdGhlIGxvY2sgLS0gaWYgc28gZ2V0IGl0IGFnYWluIGFuZCByZWxvYWQgdGhlIGV4dHJhCisgICAgICAgZmllbGQgaW5mb3JtYXRpb24gKGl0IHByb2JhYmx5IGNoYW5nZWQpLCByZWNvdmVyIGxhc3Qgb3BlcmF0aW9uIGlmCisgICAgICAgbmVjZXNzYXJ5ICovCisgICAgaWYgKGxvZ19jaGVjayhsb2cpICYmIGxvZ19vcGVuKGxvZykpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIGNyZWF0ZSBzcGFjZSBmb3IgdW5jb21wcmVzc2VkIGRhdGEgKi8KKyAgICBsZW4gPSAoKHNpemVfdCkobG9nLT5sYXN0IC0gbG9nLT5maXJzdCkgJiB+KCgoc2l6ZV90KTEgPDwgMTApIC0gMSkpICsKKyAgICAgICAgICBsb2ctPnN0b3JlZDsKKyAgICBpZiAoKGRhdGEgPSBtYWxsb2MobGVuKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0yOworCisgICAgLyogZG8gc3RhdGVtZW50IGhlcmUgaXMganVzdCBhIGNoZWFwIHRyaWNrIGZvciBlcnJvciBoYW5kbGluZyAqLworICAgIGRvIHsKKyAgICAgICAgLyogcmVhZCBpbiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKi8KKyAgICAgICAgaWYgKGxzZWVrKGxvZy0+ZmQsIGxvZy0+Zmlyc3QgLSAxLCBTRUVLX1NFVCkgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIG5leHQgPSAwOworICAgICAgICB3aGlsZSAobmV4dCA8IGxlbikgeworICAgICAgICAgICAgaWYgKHJlYWQobG9nLT5mZCwgYnVmLCA1KSAhPSA1KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgYmxvY2sgPSBQVUxMMihidWYgKyAxKTsKKyAgICAgICAgICAgIGlmIChuZXh0ICsgYmxvY2sgPiBsZW4gfHwKKyAgICAgICAgICAgICAgICByZWFkKGxvZy0+ZmQsIChjaGFyICopZGF0YSArIG5leHQsIGJsb2NrKSAhPSBibG9jaykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIG5leHQgKz0gYmxvY2s7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxzZWVrKGxvZy0+ZmQsIDAsIFNFRUtfQ1VSKSAhPSBsb2ctPmxhc3QgKyA0ICsgbG9nLT5zdG9yZWQpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbG9nX3RvdWNoKGxvZyk7CisKKyAgICAgICAgLyogd3JpdGUgdGhlIHVuY29tcHJlc3NlZCBkYXRhIHRvIHRoZSAuYWRkIGZpbGUgKi8KKyAgICAgICAgc3RyY3B5KGxvZy0+ZW5kLCAiLmFkZCIpOworICAgICAgICBmZCA9IG9wZW4obG9nLT5wYXRoLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjQ0KTsKKyAgICAgICAgaWYgKGZkIDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICByZXQgPSAoc2l6ZV90KXdyaXRlKGZkLCBkYXRhLCBsZW4pICE9IGxlbjsKKyAgICAgICAgaWYgKHJldCB8IGNsb3NlKGZkKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBsb2dfdG91Y2gobG9nKTsKKworICAgICAgICAvKiB3cml0ZSB0aGUgZGljdGlvbmFyeSBmb3IgdGhlIG5leHQgY29tcHJlc3MgdG8gdGhlIC50ZW1wIGZpbGUgKi8KKyAgICAgICAgc3RyY3B5KGxvZy0+ZW5kLCAiLnRlbXAiKTsKKyAgICAgICAgZmQgPSBvcGVuKGxvZy0+cGF0aCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywgMDY0NCk7CisgICAgICAgIGlmIChmZCA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbmV4dCA9IERJQ1QgPiBsZW4gPyBsZW4gOiBESUNUOworICAgICAgICByZXQgPSAoc2l6ZV90KXdyaXRlKGZkLCAoY2hhciAqKWRhdGEgKyBsZW4gLSBuZXh0LCBuZXh0KSAhPSBuZXh0OworICAgICAgICBpZiAocmV0IHwgY2xvc2UoZmQpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGxvZ190b3VjaChsb2cpOworCisgICAgICAgIC8qIHJvbGwgYmFjayB0byBjb21wcmVzc2VkIGRhdGEsIG1hcmsgdGhlIGNvbXByZXNzIGluIHByb2dyZXNzICovCisgICAgICAgIGxvZy0+bGFzdCA9IGxvZy0+Zmlyc3Q7CisgICAgICAgIGxvZy0+c3RvcmVkID0gMDsKKyAgICAgICAgaWYgKGxvZ19tYXJrKGxvZywgQ09NUFJFU1NfT1ApKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIEJBSUwoNyk7CisKKyAgICAgICAgLyogY29tcHJlc3MgYW5kIGFwcGVuZCB0aGUgZGF0YSAoY2xlYXJzIG1hcmspICovCisgICAgICAgIHJldCA9IGxvZ19jb21wcmVzcyhsb2csIGRhdGEsIGxlbik7CisgICAgICAgIGZyZWUoZGF0YSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfSB3aGlsZSAoMCk7CisKKyAgICAvKiBicm9rZSBvdXQgb2YgZG8gYWJvdmUgb24gaS9vIGVycm9yICovCisgICAgZnJlZShkYXRhKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qIGd6bG9nX3dyaXRlKCkgcmV0dXJuIHZhbHVlczoKKyAgICAwOiBhbGwgZ29vZAorICAgLTE6IGZpbGUgaS9vIGVycm9yICh1c3VhbGx5IGFjY2VzcyBpc3N1ZSkKKyAgIC0yOiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlCisgICAtMzogaW52YWxpZCBsb2cgcG9pbnRlciBhcmd1bWVudCAqLworaW50IGd6bG9nX3dyaXRlKGd6bG9nICpsb2dkLCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQoreworICAgIGludCBmZCwgcmV0OworICAgIHN0cnVjdCBsb2cgKmxvZyA9IGxvZ2Q7CisKKyAgICAvKiBjaGVjayBhcmd1bWVudHMgKi8KKyAgICBpZiAobG9nID09IE5VTEwgfHwgc3RyY21wKGxvZy0+aWQsIExPR0lEKSkKKyAgICAgICAgcmV0dXJuIC0zOworICAgIGlmIChkYXRhID09IE5VTEwgfHwgbGVuIDw9IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogc2VlIGlmIHdlIGxvc3QgdGhlIGxvY2sgLS0gaWYgc28gZ2V0IGl0IGFnYWluIGFuZCByZWxvYWQgdGhlIGV4dHJhCisgICAgICAgZmllbGQgaW5mb3JtYXRpb24gKGl0IHByb2JhYmx5IGNoYW5nZWQpLCByZWNvdmVyIGxhc3Qgb3BlcmF0aW9uIGlmCisgICAgICAgbmVjZXNzYXJ5ICovCisgICAgaWYgKGxvZ19jaGVjayhsb2cpICYmIGxvZ19vcGVuKGxvZykpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIGNyZWF0ZSBhbmQgd3JpdGUgLmFkZCBmaWxlICovCisgICAgc3RyY3B5KGxvZy0+ZW5kLCAiLmFkZCIpOworICAgIGZkID0gb3Blbihsb2ctPnBhdGgsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsIDA2NDQpOworICAgIGlmIChmZCA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXQgPSAoc2l6ZV90KXdyaXRlKGZkLCBkYXRhLCBsZW4pICE9IGxlbjsKKyAgICBpZiAocmV0IHwgY2xvc2UoZmQpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgbG9nX3RvdWNoKGxvZyk7CisKKyAgICAvKiBtYXJrIGxvZyBmaWxlIHdpdGggYXBwZW5kIGluIHByb2dyZXNzICovCisgICAgaWYgKGxvZ19tYXJrKGxvZywgQVBQRU5EX09QKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIEJBSUwoOCk7CisKKyAgICAvKiBhcHBlbmQgZGF0YSAoY2xlYXJzIG1hcmspICovCisgICAgaWYgKGxvZ19hcHBlbmQobG9nLCBkYXRhLCBsZW4pKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiBjaGVjayB0byBzZWUgaWYgaXQncyB0aW1lIHRvIGNvbXByZXNzIC0tIGlmIG5vdCwgdGhlbiBkb25lICovCisgICAgaWYgKCgobG9nLT5sYXN0IC0gbG9nLT5maXJzdCkgPj4gMTApICsgKGxvZy0+c3RvcmVkID4+IDEwKSA8IFRSSUdHRVIpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogdGltZSB0byBjb21wcmVzcyAqLworICAgIHJldHVybiBnemxvZ19jb21wcmVzcyhsb2cpOworfQorCisvKiBnemxvZ19jbG9zZSgpIHJldHVybiB2YWx1ZXM6CisgICAgMDogb2sKKyAgIC0zOiBpbnZhbGlkIGxvZyBwb2ludGVyIGFyZ3VtZW50ICovCitpbnQgZ3psb2dfY2xvc2UoZ3psb2cgKmxvZ2QpCit7CisgICAgc3RydWN0IGxvZyAqbG9nID0gbG9nZDsKKworICAgIC8qIGNoZWNrIGFyZ3VtZW50cyAqLworICAgIGlmIChsb2cgPT0gTlVMTCB8fCBzdHJjbXAobG9nLT5pZCwgTE9HSUQpKQorICAgICAgICByZXR1cm4gLTM7CisKKyAgICAvKiBjbG9zZSB0aGUgbG9nIGZpbGUgYW5kIHJlbGVhc2UgdGhlIGxvY2sgKi8KKyAgICBsb2dfY2xvc2UobG9nKTsKKworICAgIC8qIGZyZWUgc3RydWN0dXJlIGFuZCByZXR1cm4gKi8KKyAgICBpZiAobG9nLT5wYXRoICE9IE5VTEwpCisgICAgICAgIGZyZWUobG9nLT5wYXRoKTsKKyAgICBzdHJjcHkobG9nLT5pZCwgImJhZCIpOworICAgIGZyZWUobG9nKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2V4YW1wbGVzL2d6bG9nLmggYi96bGliL3NyYy9leGFtcGxlcy9nemxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZjBjZWMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9leGFtcGxlcy9nemxvZy5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qIGd6bG9nLmgKKyAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA4LCAyMDEyIE1hcmsgQWRsZXIsIGFsbCByaWdodHMgcmVzZXJ2ZWQKKyAgdmVyc2lvbiAyLjIsIDE0IEF1ZyAyMDEyCisKKyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3IgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisKKyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisgIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKKyAgTWFyayBBZGxlciAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CisgKi8KKworLyogVmVyc2lvbiBIaXN0b3J5OgorICAgMS4wICAyNiBOb3YgMjAwNCAgRmlyc3QgdmVyc2lvbgorICAgMi4wICAyNSBBcHIgMjAwOCAgQ29tcGxldGUgcmVkZXNpZ24gZm9yIHJlY292ZXJ5IG9mIGludGVycnVwdGVkIG9wZXJhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgIEludGVyZmFjZSBjaGFuZ2VkIHNsaWdodGx5IGluIHRoYXQgbm93IHBhdGggaXMgYSBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIG5vdyBvY2N1cnMgYXMgbmVlZGVkIGR1cmluZyBnemxvZ193cml0ZSgpCisgICAgICAgICAgICAgICAgICAgICBnemxvZ193cml0ZSgpIG5vdyBhbHdheXMgbGVhdmVzIHRoZSBsb2cgZmlsZSBhcyB2YWxpZCBnemlwCisgICAyLjEgICA4IEp1bCAyMDEyICBGaXggYXJndW1lbnQgY2hlY2tzIGluIGd6bG9nX2NvbXByZXNzKCkgYW5kIGd6bG9nX3dyaXRlKCkKKyAgIDIuMiAgMTQgQXVnIDIwMTIgIENsZWFuIHVwIHNpZ25lZCBjb21wYXJpc29ucworICovCisKKy8qCisgICBUaGUgZ3psb2cgb2JqZWN0IGFsbG93cyB3cml0aW5nIHNob3J0IG1lc3NhZ2VzIHRvIGEgZ3ppcHBlZCBsb2cgZmlsZSwKKyAgIG9wZW5pbmcgdGhlIGxvZyBmaWxlIGxvY2tlZCBmb3Igc21hbGwgYnVyc3RzLCBhbmQgdGhlbiBjbG9zaW5nIGl0LiAgVGhlIGxvZworICAgb2JqZWN0IHdvcmtzIGJ5IGFwcGVuZGluZyBzdG9yZWQgKHVuY29tcHJlc3NlZCkgZGF0YSB0byB0aGUgZ3ppcCBmaWxlIHVudGlsCisgICAxIE1CIGhhcyBiZWVuIGFjY3VtdWxhdGVkLiAgQXQgdGhhdCB0aW1lLCB0aGUgc3RvcmVkIGRhdGEgaXMgY29tcHJlc3NlZCwgYW5kCisgICByZXBsYWNlcyB0aGUgdW5jb21wcmVzc2VkIGRhdGEgaW4gdGhlIGZpbGUuICBUaGUgbG9nIGZpbGUgaXMgdHJ1bmNhdGVkIHRvCisgICBpdHMgbmV3IHNpemUgYXQgdGhhdCB0aW1lLiAgQWZ0ZXIgZWFjaCB3cml0ZSBvcGVyYXRpb24sIHRoZSBsb2cgZmlsZSBpcyBhCisgICB2YWxpZCBnemlwIGZpbGUgdGhhdCBjYW4gZGVjb21wcmVzc2VkIHRvIHJlY292ZXIgd2hhdCB3YXMgd3JpdHRlbi4KKworICAgVGhlIGd6bG9nIG9wZXJhdGlvbnMgY2FuIGJlIGludGVydXB0ZWQgYXQgYW55IHBvaW50IGR1ZSB0byBhbiBhcHBsaWNhdGlvbiBvcgorICAgc3lzdGVtIGNyYXNoLCBhbmQgdGhlIGxvZyBmaWxlIHdpbGwgYmUgcmVjb3ZlcmVkIHRoZSBuZXh0IHRpbWUgdGhlIGxvZyBpcworICAgb3BlbmVkIHdpdGggZ3psb2dfb3BlbigpLgorICovCisKKyNpZm5kZWYgR1pMT0dfSAorI2RlZmluZSBHWkxPR19ICisKKy8qIGd6bG9nIG9iamVjdCB0eXBlICovCit0eXBlZGVmIHZvaWQgZ3psb2c7CisKKy8qIE9wZW4gYSBnemxvZyBvYmplY3QsIGNyZWF0aW5nIHRoZSBsb2cgZmlsZSBpZiBpdCBkb2VzIG5vdCBleGlzdC4gIFJldHVybgorICAgTlVMTCBvbiBlcnJvci4gIE5vdGUgdGhhdCBnemxvZ19vcGVuKCkgY291bGQgdGFrZSBhIHdoaWxlIHRvIGNvbXBsZXRlIGlmIGl0CisgICBoYXMgdG8gd2FpdCB0byB2ZXJpZnkgdGhhdCBhIGxvY2sgaXMgc3RhbGUgKHBvc3NpYmx5IGZvciBmaXZlIG1pbnV0ZXMpLCBvcgorICAgaWYgdGhlcmUgaXMgc2lnbmlmaWNhbnQgY29udGVudGlvbiB3aXRoIG90aGVyIGluc3RhbnRpYXRpb25zIG9mIHRoaXMgb2JqZWN0CisgICB3aGVuIGxvY2tpbmcgdGhlIHJlc291cmNlLiAgcGF0aCBpcyB0aGUgcHJlZml4IG9mIHRoZSBmaWxlIG5hbWVzIGNyZWF0ZWQgYnkKKyAgIHRoaXMgb2JqZWN0LiAgSWYgcGF0aCBpcyAiZm9vIiwgdGhlbiB0aGUgbG9nIGZpbGUgd2lsbCBiZSAiZm9vLmd6IiwgYW5kCisgICBvdGhlciBhdXhpbGlhcnkgZmlsZXMgd2lsbCBiZSBjcmVhdGVkIGFuZCBkZXN0cm95ZWQgZHVyaW5nIHRoZSBwcm9jZXNzOgorICAgImZvby5kaWN0IiBmb3IgYSBjb21wcmVzc2lvbiBkaWN0aW9uYXJ5LCAiZm9vLnRlbXAiIGZvciBhIHRlbXBvcmFyeSAobmV4dCkKKyAgIGRpY3Rpb25hcnksICJmb28uYWRkIiBmb3IgZGF0YSBiZWluZyBhZGRlZCBvciBjb21wcmVzc2VkLCAiZm9vLmxvY2siIGZvciB0aGUKKyAgIGxvY2sgZmlsZSwgYW5kICJmb28ucmVwYWlycyIgdG8gbG9nIHJlY292ZXJ5IG9wZXJhdGlvbnMgcGVyZm9ybWVkIGR1ZSB0bworICAgaW50ZXJydXB0ZWQgZ3psb2cgb3BlcmF0aW9ucy4gIEEgZ3psb2dfb3BlbigpIGZvbGxvd2VkIGJ5IGEgZ3psb2dfY2xvc2UoKQorICAgd2lsbCByZWNvdmVyIGEgcHJldmlvdXNseSBpbnRlcnJ1cHRlZCBvcGVyYXRpb24sIGlmIGFueS4gKi8KK2d6bG9nICpnemxvZ19vcGVuKGNoYXIgKnBhdGgpOworCisvKiBXcml0ZSB0byBhIGd6bG9nIG9iamVjdC4gIFJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIC0xIGlmIHRoZXJlIGlzIGEgZmlsZSBpL28KKyAgIGVycm9yIG9uIGFueSBvZiB0aGUgZ3psb2cgZmlsZXMgKHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaWYgZ3psb2dfb3BlbigpCisgICBzdWNjZWVkZWQsIHVubGVzcyB0aGUgZGV2aWNlIGhhcyBydW4gb3V0IG9mIHNwYWNlIG9yIGxlZnRvdmVyIGF1eGlsaWFyeQorICAgZmlsZXMgaGF2ZSBwZXJtaXNzaW9ucyBvciBvd25lcnNoaXAgdGhhdCBwcmV2ZW50IHRoZWlyIHVzZSksIC0yIGlmIHRoZXJlIGlzCisgICBhIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUsIG9yIC0zIGlmIHRoZSBsb2cgYXJndW1lbnQgaXMgaW52YWxpZCAoZS5nLiBpZgorICAgaXQgd2FzIG5vdCBjcmVhdGVkIGJ5IGd6bG9nX29wZW4oKSkuICBUaGlzIGZ1bmN0aW9uIHdpbGwgd3JpdGUgZGF0YSB0byB0aGUKKyAgIGZpbGUgdW5jb21wcmVzc2VkLCB1bnRpbCAxIE1CIGhhcyBiZWVuIGFjY3VtdWxhdGVkLCBhdCB3aGljaCB0aW1lIHRoYXQgZGF0YQorICAgd2lsbCBiZSBjb21wcmVzc2VkLiAgVGhlIGxvZyBmaWxlIHdpbGwgYmUgYSB2YWxpZCBnemlwIGZpbGUgdXBvbiBzdWNjZXNzZnVsCisgICByZXR1cm4uICovCitpbnQgZ3psb2dfd3JpdGUoZ3psb2cgKmxvZywgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbik7CisKKy8qIEZvcmNlIGNvbXByZXNzaW9uIG9mIGFueSB1bmNvbXByZXNzZWQgZGF0YSBpbiB0aGUgbG9nLiAgVGhpcyBzaG91bGQgYmUgdXNlZAorICAgc3BhcmluZ2x5LCBpZiBhdCBhbGwuICBUaGUgbWFpbiBhcHBsaWNhdGlvbiB3b3VsZCBiZSB3aGVuIGEgbG9nIGZpbGUgd2lsbAorICAgbm90IGJlIGFwcGVuZGVkIHRvIGFnYWluLiAgSWYgdGhpcyBpcyB1c2VkIHRvIGNvbXByZXNzIGZyZXF1ZW50bHkgd2hpbGUKKyAgIGFwcGVuZGluZywgaXQgd2lsbCBib3RoIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIGV4ZWN1dGlvbiB0aW1lIGFuZAorICAgcmVkdWNlIHRoZSBjb21wcmVzc2lvbiByYXRpby4gIFRoZSByZXR1cm4gY29kZXMgYXJlIHRoZSBzYW1lIGFzIGZvcgorICAgZ3psb2dfd3JpdGUoKS4gKi8KK2ludCBnemxvZ19jb21wcmVzcyhnemxvZyAqbG9nKTsKKworLyogQ2xvc2UgYSBnemxvZyBvYmplY3QuICBSZXR1cm4gemVybyBvbiBzdWNjZXNzLCAtMyBpZiB0aGUgbG9nIGFyZ3VtZW50IGlzCisgICBpbnZhbGlkLiAgVGhlIGxvZyBvYmplY3QgaXMgZnJlZWQsIGFuZCBzbyBjYW5ub3QgYmUgcmVmZXJlbmNlZCBhZ2Fpbi4gKi8KK2ludCBnemxvZ19jbG9zZShnemxvZyAqbG9nKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS96bGliL3NyYy9leGFtcGxlcy96bGliX2hvdy5odG1sIGIvemxpYi9zcmMvZXhhbXBsZXMvemxpYl9ob3cuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDRmZjFjCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvZXhhbXBsZXMvemxpYl9ob3cuaHRtbApAQCAtMCwwICsxLDU0NSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIgorICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9sb29zZS5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPnpsaWIgVXNhZ2UgRXhhbXBsZTwvdGl0bGU+Cis8IS0tICBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgTWFyayBBZGxlci4gIC0tPgorPC9oZWFkPgorPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiIgdGV4dD0iIzAwMDAwMCIgbGluaz0iIzAwMDBGRiIgdmxpbms9IiMwMEEwMDAiPgorPGgyIGFsaWduPSJjZW50ZXIiPiB6bGliIFVzYWdlIEV4YW1wbGUgPC9oMj4KK1dlIG9mdGVuIGdldCBxdWVzdGlvbnMgYWJvdXQgaG93IHRoZSA8dHQ+ZGVmbGF0ZSgpPC90dD4gYW5kIDx0dD5pbmZsYXRlKCk8L3R0PiBmdW5jdGlvbnMgc2hvdWxkIGJlIHVzZWQuCitVc2VycyB3b25kZXIgd2hlbiB0aGV5IHNob3VsZCBwcm92aWRlIG1vcmUgaW5wdXQsIHdoZW4gdGhleSBzaG91bGQgdXNlIG1vcmUgb3V0cHV0LAord2hhdCB0byBkbyB3aXRoIGEgPHR0PlpfQlVGX0VSUk9SPC90dD4sIGhvdyB0byBtYWtlIHN1cmUgdGhlIHByb2Nlc3MgdGVybWluYXRlcyBwcm9wZXJseSwgYW5kCitzbyBvbi4gIFNvIGZvciB0aG9zZSB3aG8gaGF2ZSByZWFkIDx0dD56bGliLmg8L3R0PiAoYSBmZXcgdGltZXMpLCBhbmQKK3dvdWxkIGxpa2UgZnVydGhlciBlZGlmaWNhdGlvbiwgYmVsb3cgaXMgYW4gYW5ub3RhdGVkIGV4YW1wbGUgaW4gQyBvZiBzaW1wbGUgcm91dGluZXMgdG8gY29tcHJlc3MgYW5kIGRlY29tcHJlc3MKK2Zyb20gYW4gaW5wdXQgZmlsZSB0byBhbiBvdXRwdXQgZmlsZSB1c2luZyA8dHQ+ZGVmbGF0ZSgpPC90dD4gYW5kIDx0dD5pbmZsYXRlKCk8L3R0PiByZXNwZWN0aXZlbHkuICBUaGUKK2Fubm90YXRpb25zIGFyZSBpbnRlcnNwZXJzZWQgYmV0d2VlbiBsaW5lcyBvZiB0aGUgY29kZS4gIFNvIHBsZWFzZSByZWFkIGJldHdlZW4gdGhlIGxpbmVzLgorV2UgaG9wZSB0aGlzIGhlbHBzIGV4cGxhaW4gc29tZSBvZiB0aGUgaW50cmljYWNpZXMgb2YgPGVtPnpsaWI8L2VtPi4KKzxwPgorV2l0aG91dCBmdXJ0aGVyIGFkaWV1LCBoZXJlIGlzIHRoZSBwcm9ncmFtIDxhIGhyZWY9InpwaXBlLmMiPjx0dD56cGlwZS5jPC90dD48L2E+OgorPHByZT48Yj4KKy8qIHpwaXBlLmM6IGV4YW1wbGUgb2YgcHJvcGVyIHVzZSBvZiB6bGliJ3MgaW5mbGF0ZSgpIGFuZCBkZWZsYXRlKCkKKyAgIE5vdCBjb3B5cmlnaHRlZCAtLSBwcm92aWRlZCB0byB0aGUgcHVibGljIGRvbWFpbgorICAgVmVyc2lvbiAxLjQgIDExIERlY2VtYmVyIDIwMDUgIE1hcmsgQWRsZXIgKi8KKworLyogVmVyc2lvbiBoaXN0b3J5OgorICAgMS4wICAzMCBPY3QgMjAwNCAgRmlyc3QgdmVyc2lvbgorICAgMS4xICAgOCBOb3YgMjAwNCAgQWRkIHZvaWQgY2FzdGluZyBmb3IgdW51c2VkIHJldHVybiB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgIFVzZSBzd2l0Y2ggc3RhdGVtZW50IGZvciBpbmZsYXRlKCkgcmV0dXJuIHZhbHVlcworICAgMS4yICAgOSBOb3YgMjAwNCAgQWRkIGFzc2VydGlvbnMgdG8gZG9jdW1lbnQgemxpYiBndWFyYW50ZWVzCisgICAxLjMgICA2IEFwciAyMDA1ICBSZW1vdmUgaW5jb3JyZWN0IGFzc2VydGlvbiBpbiBpbmYoKQorICAgMS40ICAxMSBEZWMgMjAwNSAgQWRkIGhhY2sgdG8gYXZvaWQgTVNET1MgZW5kLW9mLWxpbmUgY29udmVyc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgIEF2b2lkIHNvbWUgY29tcGlsZXIgd2FybmluZ3MgZm9yIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycworICovCis8L2I+PC9wcmU+PCEtLSAtLT4KK1dlIG5vdyBpbmNsdWRlIHRoZSBoZWFkZXIgZmlsZXMgZm9yIHRoZSByZXF1aXJlZCBkZWZpbml0aW9ucy4gIEZyb20KKzx0dD5zdGRpby5oPC90dD4gd2UgdXNlIDx0dD5mb3BlbigpPC90dD4sIDx0dD5mcmVhZCgpPC90dD4sIDx0dD5md3JpdGUoKTwvdHQ+LAorPHR0PmZlb2YoKTwvdHQ+LCA8dHQ+ZmVycm9yKCk8L3R0PiwgYW5kIDx0dD5mY2xvc2UoKTwvdHQ+IGZvciBmaWxlIGkvbywgYW5kCis8dHQ+ZnB1dHMoKTwvdHQ+IGZvciBlcnJvciBtZXNzYWdlcy4gIEZyb20gPHR0PnN0cmluZy5oPC90dD4gd2UgdXNlCis8dHQ+c3RyY21wKCk8L3R0PiBmb3IgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHByb2Nlc3NpbmcuCitGcm9tIDx0dD5hc3NlcnQuaDwvdHQ+IHdlIHVzZSB0aGUgPHR0PmFzc2VydCgpPC90dD4gbWFjcm8uCitGcm9tIDx0dD56bGliLmg8L3R0Pgord2UgdXNlIHRoZSBiYXNpYyBjb21wcmVzc2lvbiBmdW5jdGlvbnMgPHR0PmRlZmxhdGVJbml0KCk8L3R0PiwKKzx0dD5kZWZsYXRlKCk8L3R0PiwgYW5kIDx0dD5kZWZsYXRlRW5kKCk8L3R0PiwgYW5kIHRoZSBiYXNpYyBkZWNvbXByZXNzaW9uCitmdW5jdGlvbnMgPHR0PmluZmxhdGVJbml0KCk8L3R0PiwgPHR0PmluZmxhdGUoKTwvdHQ+LCBhbmQKKzx0dD5pbmZsYXRlRW5kKCk8L3R0Pi4KKzxwcmU+PGI+CisjaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKKyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKKyNpbmNsdWRlICZsdDthc3NlcnQuaCZndDsKKyNpbmNsdWRlICJ6bGliLmgiCis8L2I+PC9wcmU+PCEtLSAtLT4KK1RoaXMgaXMgYW4gdWdseSBoYWNrIHJlcXVpcmVkIHRvIGF2b2lkIGNvcnJ1cHRpb24gb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YSBvbgorV2luZG93cy9NUy1ET1Mgc3lzdGVtcy4gIFdpdGhvdXQgdGhpcywgdGhvc2Ugc3lzdGVtcyB3b3VsZCBhc3N1bWUgdGhhdCB0aGUgaW5wdXQgYW5kIG91dHB1dAorZmlsZXMgYXJlIHRleHQsIGFuZCB0cnkgdG8gY29udmVydCB0aGUgZW5kLW9mLWxpbmUgY2hhcmFjdGVycyBmcm9tIG9uZSBzdGFuZGFyZCB0bworYW5vdGhlci4gIFRoYXQgd291bGQgY29ycnVwdCBiaW5hcnkgZGF0YSwgYW5kIGluIHBhcnRpY3VsYXIgd291bGQgcmVuZGVyIHRoZSBjb21wcmVzc2VkIGRhdGEgdW51c2FibGUuCitUaGlzIHNldHMgdGhlIGlucHV0IGFuZCBvdXRwdXQgdG8gYmluYXJ5IHdoaWNoIHN1cHByZXNzZXMgdGhlIGVuZC1vZi1saW5lIGNvbnZlcnNpb25zLgorPHR0PlNFVF9CSU5BUllfTU9ERSgpPC90dD4gd2lsbCBiZSB1c2VkIGxhdGVyIG9uIDx0dD5zdGRpbjwvdHQ+IGFuZCA8dHQ+c3Rkb3V0PC90dD4sIGF0IHRoZSBiZWdpbm5pbmcgb2YgPHR0Pm1haW4oKTwvdHQ+LgorPHByZT48Yj4KKyNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQorIyAgaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKKyMgIGluY2x1ZGUgJmx0O2lvLmgmZ3Q7CisjICBkZWZpbmUgU0VUX0JJTkFSWV9NT0RFKGZpbGUpIHNldG1vZGUoZmlsZW5vKGZpbGUpLCBPX0JJTkFSWSkKKyNlbHNlCisjICBkZWZpbmUgU0VUX0JJTkFSWV9NT0RFKGZpbGUpCisjZW5kaWYKKzwvYj48L3ByZT48IS0tIC0tPgorPHR0PkNIVU5LPC90dD4gaXMgc2ltcGx5IHRoZSBidWZmZXIgc2l6ZSBmb3IgZmVlZGluZyBkYXRhIHRvIGFuZCBwdWxsaW5nIGRhdGEKK2Zyb20gdGhlIDxlbT56bGliPC9lbT4gcm91dGluZXMuICBMYXJnZXIgYnVmZmVyIHNpemVzIHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50LAorZXNwZWNpYWxseSBmb3IgPHR0PmluZmxhdGUoKTwvdHQ+LiAgSWYgdGhlIG1lbW9yeSBpcyBhdmFpbGFibGUsIGJ1ZmZlcnMgc2l6ZXMKK29uIHRoZSBvcmRlciBvZiAxMjhLIG9yIDI1NksgYnl0ZXMgc2hvdWxkIGJlIHVzZWQuCis8cHJlPjxiPgorI2RlZmluZSBDSFVOSyAxNjM4NAorPC9iPjwvcHJlPjwhLS0gLS0+CitUaGUgPHR0PmRlZigpPC90dD4gcm91dGluZSBjb21wcmVzc2VzIGRhdGEgZnJvbSBhbiBpbnB1dCBmaWxlIHRvIGFuIG91dHB1dCBmaWxlLiAgVGhlIG91dHB1dCBkYXRhCit3aWxsIGJlIGluIHRoZSA8ZW0+emxpYjwvZW0+IGZvcm1hdCwgd2hpY2ggaXMgZGlmZmVyZW50IGZyb20gdGhlIDxlbT5nemlwPC9lbT4gb3IgPGVtPnppcDwvZW0+Citmb3JtYXRzLiAgVGhlIDxlbT56bGliPC9lbT4gZm9ybWF0IGhhcyBhIHZlcnkgc21hbGwgaGVhZGVyIG9mIG9ubHkgdHdvIGJ5dGVzIHRvIGlkZW50aWZ5IGl0IGFzCithIDxlbT56bGliPC9lbT4gc3RyZWFtIGFuZCB0byBwcm92aWRlIGRlY29kaW5nIGluZm9ybWF0aW9uLCBhbmQgYSBmb3VyLWJ5dGUgdHJhaWxlciB3aXRoIGEgZmFzdAorY2hlY2sgdmFsdWUgdG8gdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGFmdGVyIGRlY29kaW5nLgorPHByZT48Yj4KKy8qIENvbXByZXNzIGZyb20gZmlsZSBzb3VyY2UgdG8gZmlsZSBkZXN0IHVudGlsIEVPRiBvbiBzb3VyY2UuCisgICBkZWYoKSByZXR1cm5zIFpfT0sgb24gc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgbWVtb3J5IGNvdWxkIG5vdCBiZQorICAgYWxsb2NhdGVkIGZvciBwcm9jZXNzaW5nLCBaX1NUUkVBTV9FUlJPUiBpZiBhbiBpbnZhbGlkIGNvbXByZXNzaW9uCisgICBsZXZlbCBpcyBzdXBwbGllZCwgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB2ZXJzaW9uIG9mIHpsaWIuaCBhbmQgdGhlCisgICB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGxpbmtlZCBkbyBub3QgbWF0Y2gsIG9yIFpfRVJSTk8gaWYgdGhlcmUgaXMKKyAgIGFuIGVycm9yIHJlYWRpbmcgb3Igd3JpdGluZyB0aGUgZmlsZXMuICovCitpbnQgZGVmKEZJTEUgKnNvdXJjZSwgRklMRSAqZGVzdCwgaW50IGxldmVsKQoreworPC9iPjwvcHJlPgorSGVyZSBhcmUgdGhlIGxvY2FsIHZhcmlhYmxlcyBmb3IgPHR0PmRlZigpPC90dD4uICA8dHQ+cmV0PC90dD4gd2lsbCBiZSB1c2VkIGZvciA8ZW0+emxpYjwvZW0+CityZXR1cm4gY29kZXMuICA8dHQ+Zmx1c2g8L3R0PiB3aWxsIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgZmx1c2hpbmcgc3RhdGUgZm9yIDx0dD5kZWZsYXRlKCk8L3R0PiwKK3doaWNoIGlzIGVpdGhlciBubyBmbHVzaGluZywgb3IgZmx1c2ggdG8gY29tcGxldGlvbiBhZnRlciB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlIGlzIHJlYWNoZWQuCis8dHQ+aGF2ZTwvdHQ+IGlzIHRoZSBhbW91bnQgb2YgZGF0YSByZXR1cm5lZCBmcm9tIDx0dD5kZWZsYXRlKCk8L3R0Pi4gIFRoZSA8dHQ+c3RybTwvdHQ+IHN0cnVjdHVyZQoraXMgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRvIGFuZCBmcm9tIHRoZSA8ZW0+emxpYjwvZW0+IHJvdXRpbmVzLCBhbmQgdG8gbWFpbnRhaW4gdGhlCis8dHQ+ZGVmbGF0ZSgpPC90dD4gc3RhdGUuICA8dHQ+aW48L3R0PiBhbmQgPHR0Pm91dDwvdHQ+IGFyZSB0aGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGZvcgorPHR0PmRlZmxhdGUoKTwvdHQ+LgorPHByZT48Yj4KKyAgICBpbnQgcmV0LCBmbHVzaDsKKyAgICB1bnNpZ25lZCBoYXZlOworICAgIHpfc3RyZWFtIHN0cm07CisgICAgdW5zaWduZWQgY2hhciBpbltDSFVOS107CisgICAgdW5zaWduZWQgY2hhciBvdXRbQ0hVTktdOworPC9iPjwvcHJlPjwhLS0gLS0+CitUaGUgZmlyc3QgdGhpbmcgd2UgZG8gaXMgdG8gaW5pdGlhbGl6ZSB0aGUgPGVtPnpsaWI8L2VtPiBzdGF0ZSBmb3IgY29tcHJlc3Npb24gdXNpbmcKKzx0dD5kZWZsYXRlSW5pdCgpPC90dD4uICBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIGZpcnN0IHVzZSBvZiA8dHQ+ZGVmbGF0ZSgpPC90dD4uCitUaGUgPHR0PnphbGxvYzwvdHQ+LCA8dHQ+emZyZWU8L3R0PiwgYW5kIDx0dD5vcGFxdWU8L3R0PiBmaWVsZHMgaW4gdGhlIDx0dD5zdHJtPC90dD4KK3N0cnVjdHVyZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBjYWxsaW5nIDx0dD5kZWZsYXRlSW5pdCgpPC90dD4uICBIZXJlIHRoZXkgYXJlCitzZXQgdG8gdGhlIDxlbT56bGliPC9lbT4gY29uc3RhbnQgPHR0PlpfTlVMTDwvdHQ+IHRvIHJlcXVlc3QgdGhhdCA8ZW0+emxpYjwvZW0+IHVzZQordGhlIGRlZmF1bHQgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMuICBBbiBhcHBsaWNhdGlvbiBtYXkgYWxzbyBjaG9vc2UgdG8gcHJvdmlkZQorY3VzdG9tIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIGhlcmUuICA8dHQ+ZGVmbGF0ZUluaXQoKTwvdHQ+IHdpbGwgYWxsb2NhdGUgb24gdGhlCitvcmRlciBvZiAyNTZLIGJ5dGVzIGZvciB0aGUgaW50ZXJuYWwgc3RhdGUuCisoU2VlIDxhIGhyZWY9InpsaWJfdGVjaC5odG1sIj48ZW0+emxpYiBUZWNobmljYWwgRGV0YWlsczwvZW0+PC9hPi4pCis8cD4KKzx0dD5kZWZsYXRlSW5pdCgpPC90dD4gaXMgY2FsbGVkIHdpdGggYSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgdG8gYmUgaW5pdGlhbGl6ZWQgYW5kCit0aGUgY29tcHJlc3Npb24gbGV2ZWwsIHdoaWNoIGlzIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIG9mIC0xIHRvIDkuICBMb3dlciBjb21wcmVzc2lvbgorbGV2ZWxzIHJlc3VsdCBpbiBmYXN0ZXIgZXhlY3V0aW9uLCBidXQgbGVzcyBjb21wcmVzc2lvbi4gIEhpZ2hlciBsZXZlbHMgcmVzdWx0IGluCitncmVhdGVyIGNvbXByZXNzaW9uLCBidXQgc2xvd2VyIGV4ZWN1dGlvbi4gIFRoZSA8ZW0+emxpYjwvZW0+IGNvbnN0YW50IFpfREVGQVVMVF9DT01QUkVTU0lPTiwKK2VxdWFsIHRvIC0xLAorcHJvdmlkZXMgYSBnb29kIGNvbXByb21pc2UgYmV0d2VlbiBjb21wcmVzc2lvbiBhbmQgc3BlZWQgYW5kIGlzIGVxdWl2YWxlbnQgdG8gbGV2ZWwgNi4KK0xldmVsIDAgYWN0dWFsbHkgZG9lcyBubyBjb21wcmVzc2lvbiBhdCBhbGwsIGFuZCBpbiBmYWN0IGV4cGFuZHMgdGhlIGRhdGEgc2xpZ2h0bHkgdG8gcHJvZHVjZQordGhlIDxlbT56bGliPC9lbT4gZm9ybWF0IChpdCBpcyBub3QgYSBieXRlLWZvci1ieXRlIGNvcHkgb2YgdGhlIGlucHV0KS4KK01vcmUgYWR2YW5jZWQgYXBwbGljYXRpb25zIG9mIDxlbT56bGliPC9lbT4KK21heSB1c2UgPHR0PmRlZmxhdGVJbml0MigpPC90dD4gaGVyZSBpbnN0ZWFkLiAgU3VjaCBhbiBhcHBsaWNhdGlvbiBtYXkgd2FudCB0byByZWR1Y2UgaG93CittdWNoIG1lbW9yeSB3aWxsIGJlIHVzZWQsIGF0IHNvbWUgcHJpY2UgaW4gY29tcHJlc3Npb24uICBPciBpdCBtYXkgbmVlZCB0byByZXF1ZXN0IGEKKzxlbT5nemlwPC9lbT4gaGVhZGVyIGFuZCB0cmFpbGVyIGluc3RlYWQgb2YgYSA8ZW0+emxpYjwvZW0+IGhlYWRlciBhbmQgdHJhaWxlciwgb3IgcmF3CitlbmNvZGluZyB3aXRoIG5vIGhlYWRlciBvciB0cmFpbGVyIGF0IGFsbC4KKzxwPgorV2UgbXVzdCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIDx0dD5kZWZsYXRlSW5pdCgpPC90dD4gYWdhaW5zdCB0aGUgPGVtPnpsaWI8L2VtPiBjb25zdGFudAorPHR0PlpfT0s8L3R0PiB0byBtYWtlIHN1cmUgdGhhdCBpdCB3YXMgYWJsZSB0bworYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUsIGFuZCB0aGF0IHRoZSBwcm92aWRlZCBhcmd1bWVudHMgd2VyZSB2YWxpZC4KKzx0dD5kZWZsYXRlSW5pdCgpPC90dD4gd2lsbCBhbHNvIGNoZWNrIHRoYXQgdGhlIHZlcnNpb24gb2YgPGVtPnpsaWI8L2VtPiB0aGF0IHRoZSA8dHQ+emxpYi5oPC90dD4KK2ZpbGUgY2FtZSBmcm9tIG1hdGNoZXMgdGhlIHZlcnNpb24gb2YgPGVtPnpsaWI8L2VtPiBhY3R1YWxseSBsaW5rZWQgd2l0aCB0aGUgcHJvZ3JhbS4gIFRoaXMKK2lzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvciBlbnZpcm9ubWVudHMgaW4gd2hpY2ggPGVtPnpsaWI8L2VtPiBpcyBhIHNoYXJlZCBsaWJyYXJ5LgorPHA+CitOb3RlIHRoYXQgYW4gYXBwbGljYXRpb24gY2FuIGluaXRpYWxpemUgbXVsdGlwbGUsIGluZGVwZW5kZW50IDxlbT56bGliPC9lbT4gc3RyZWFtcywgd2hpY2ggY2FuCitvcGVyYXRlIGluIHBhcmFsbGVsLiAgVGhlIHN0YXRlIGluZm9ybWF0aW9uIG1haW50YWluZWQgaW4gdGhlIHN0cnVjdHVyZSBhbGxvd3MgdGhlIDxlbT56bGliPC9lbT4KK3JvdXRpbmVzIHRvIGJlIHJlZW50cmFudC4KKzxwcmU+PGI+CisgICAgLyogYWxsb2NhdGUgZGVmbGF0ZSBzdGF0ZSAqLworICAgIHN0cm0uemFsbG9jID0gWl9OVUxMOworICAgIHN0cm0uemZyZWUgPSBaX05VTEw7CisgICAgc3RybS5vcGFxdWUgPSBaX05VTEw7CisgICAgcmV0ID0gZGVmbGF0ZUluaXQoJmFtcDtzdHJtLCBsZXZlbCk7CisgICAgaWYgKHJldCAhPSBaX09LKQorICAgICAgICByZXR1cm4gcmV0OworPC9iPjwvcHJlPjwhLS0gLS0+CitXaXRoIHRoZSBwbGVhc2FudHJpZXMgb3V0IG9mIHRoZSB3YXksIG5vdyB3ZSBjYW4gZ2V0IGRvd24gdG8gYnVzaW5lc3MuICBUaGUgb3V0ZXIgPHR0PmRvPC90dD4tbG9vcAorcmVhZHMgYWxsIG9mIHRoZSBpbnB1dCBmaWxlIGFuZCBleGl0cyBhdCB0aGUgYm90dG9tIG9mIHRoZSBsb29wIG9uY2UgZW5kLW9mLWZpbGUgaXMgcmVhY2hlZC4KK1RoaXMgbG9vcCBjb250YWlucyB0aGUgb25seSBjYWxsIG9mIDx0dD5kZWZsYXRlKCk8L3R0Pi4gIFNvIHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgYWxsIG9mIHRoZQoraW5wdXQgZGF0YSBoYXMgYmVlbiBwcm9jZXNzZWQgYW5kIHRoYXQgYWxsIG9mIHRoZSBvdXRwdXQgZGF0YSBoYXMgYmVlbiBnZW5lcmF0ZWQgYW5kIGNvbnN1bWVkCitiZWZvcmUgd2UgZmFsbCBvdXQgb2YgdGhlIGxvb3AgYXQgdGhlIGJvdHRvbS4KKzxwcmU+PGI+CisgICAgLyogY29tcHJlc3MgdW50aWwgZW5kIG9mIGZpbGUgKi8KKyAgICBkbyB7Cis8L2I+PC9wcmU+CitXZSBzdGFydCBvZmYgYnkgcmVhZGluZyBkYXRhIGZyb20gdGhlIGlucHV0IGZpbGUuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaXMgcHV0IGRpcmVjdGx5CitpbnRvIDx0dD5hdmFpbF9pbjwvdHQ+LCBhbmQgYSBwb2ludGVyIHRvIHRob3NlIGJ5dGVzIGlzIHB1dCBpbnRvIDx0dD5uZXh0X2luPC90dD4uICBXZSBhbHNvCitjaGVjayB0byBzZWUgaWYgZW5kLW9mLWZpbGUgb24gdGhlIGlucHV0IGhhcyBiZWVuIHJlYWNoZWQuICBJZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiBmaWxlLCB0aGVuIDx0dD5mbHVzaDwvdHQ+IGlzIHNldCB0byB0aGUKKzxlbT56bGliPC9lbT4gY29uc3RhbnQgPHR0PlpfRklOSVNIPC90dD4sIHdoaWNoIGlzIGxhdGVyIHBhc3NlZCB0byA8dHQ+ZGVmbGF0ZSgpPC90dD4gdG8KK2luZGljYXRlIHRoYXQgdGhpcyBpcyB0aGUgbGFzdCBjaHVuayBvZiBpbnB1dCBkYXRhIHRvIGNvbXByZXNzLiAgV2UgbmVlZCB0byB1c2UgPHR0PmZlb2YoKTwvdHQ+Cit0byBjaGVjayBmb3IgZW5kLW9mLWZpbGUgYXMgb3Bwb3NlZCB0byBzZWVpbmcgaWYgZmV3ZXIgdGhhbiA8dHQ+Q0hVTks8L3R0PiBieXRlcyBoYXZlIGJlZW4gcmVhZC4gIFRoZQorcmVhc29uIGlzIHRoYXQgaWYgdGhlIGlucHV0IGZpbGUgbGVuZ3RoIGlzIGFuIGV4YWN0IG11bHRpcGxlIG9mIDx0dD5DSFVOSzwvdHQ+LCB3ZSB3aWxsIG1pc3MKK3RoZSBmYWN0IHRoYXQgd2UgZ290IHRvIHRoZSBlbmQtb2YtZmlsZSwgYW5kIG5vdCBrbm93IHRvIHRlbGwgPHR0PmRlZmxhdGUoKTwvdHQ+IHRvIGZpbmlzaAordXAgdGhlIGNvbXByZXNzZWQgc3RyZWFtLiAgSWYgd2UgYXJlIG5vdCB5ZXQgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQsIHRoZW4gdGhlIDxlbT56bGliPC9lbT4KK2NvbnN0YW50IDx0dD5aX05PX0ZMVVNIPC90dD4gd2lsbCBiZSBwYXNzZWQgdG8gPHR0PmRlZmxhdGU8L3R0PiB0byBpbmRpY2F0ZSB0aGF0IHdlIGFyZSBzdGlsbAoraW4gdGhlIG1pZGRsZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEuCis8cD4KK0lmIHRoZXJlIGlzIGFuIGVycm9yIGluIHJlYWRpbmcgZnJvbSB0aGUgaW5wdXQgZmlsZSwgdGhlIHByb2Nlc3MgaXMgYWJvcnRlZCB3aXRoCis8dHQ+ZGVmbGF0ZUVuZCgpPC90dD4gYmVpbmcgY2FsbGVkIHRvIGZyZWUgdGhlIGFsbG9jYXRlZCA8ZW0+emxpYjwvZW0+IHN0YXRlIGJlZm9yZSByZXR1cm5pbmcKK3RoZSBlcnJvci4gIFdlIHdvdWxkbid0IHdhbnQgYSBtZW1vcnkgbGVhaywgbm93IHdvdWxkIHdlPyAgPHR0PmRlZmxhdGVFbmQoKTwvdHQ+IGNhbiBiZSBjYWxsZWQKK2F0IGFueSB0aW1lIGFmdGVyIHRoZSBzdGF0ZSBoYXMgYmVlbiBpbml0aWFsaXplZC4gIE9uY2UgdGhhdCdzIGRvbmUsIDx0dD5kZWZsYXRlSW5pdCgpPC90dD4gKG9yCis8dHQ+ZGVmbGF0ZUluaXQyKCk8L3R0Pikgd291bGQgaGF2ZSB0byBiZSBjYWxsZWQgdG8gc3RhcnQgYSBuZXcgY29tcHJlc3Npb24gcHJvY2Vzcy4gIFRoZXJlIGlzCitubyBwb2ludCBoZXJlIGluIGNoZWNraW5nIHRoZSA8dHQ+ZGVmbGF0ZUVuZCgpPC90dD4gcmV0dXJuIGNvZGUuICBUaGUgZGVhbGxvY2F0aW9uIGNhbid0IGZhaWwuCis8cHJlPjxiPgorICAgICAgICBzdHJtLmF2YWlsX2luID0gZnJlYWQoaW4sIDEsIENIVU5LLCBzb3VyY2UpOworICAgICAgICBpZiAoZmVycm9yKHNvdXJjZSkpIHsKKyAgICAgICAgICAgICh2b2lkKWRlZmxhdGVFbmQoJmFtcDtzdHJtKTsKKyAgICAgICAgICAgIHJldHVybiBaX0VSUk5POworICAgICAgICB9CisgICAgICAgIGZsdXNoID0gZmVvZihzb3VyY2UpID8gWl9GSU5JU0ggOiBaX05PX0ZMVVNIOworICAgICAgICBzdHJtLm5leHRfaW4gPSBpbjsKKzwvYj48L3ByZT48IS0tIC0tPgorVGhlIGlubmVyIDx0dD5kbzwvdHQ+LWxvb3AgcGFzc2VzIG91ciBjaHVuayBvZiBpbnB1dCBkYXRhIHRvIDx0dD5kZWZsYXRlKCk8L3R0PiwgYW5kIHRoZW4KK2tlZXBzIGNhbGxpbmcgPHR0PmRlZmxhdGUoKTwvdHQ+IHVudGlsIGl0IGlzIGRvbmUgcHJvZHVjaW5nIG91dHB1dC4gIE9uY2UgdGhlcmUgaXMgbm8gbW9yZQorbmV3IG91dHB1dCwgPHR0PmRlZmxhdGUoKTwvdHQ+IGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBjb25zdW1lZCBhbGwgb2YgdGhlIGlucHV0LCBpLmUuLAorPHR0PmF2YWlsX2luPC90dD4gd2lsbCBiZSB6ZXJvLgorPHByZT48Yj4KKyAgICAgICAgLyogcnVuIGRlZmxhdGUoKSBvbiBpbnB1dCB1bnRpbCBvdXRwdXQgYnVmZmVyIG5vdCBmdWxsLCBmaW5pc2gKKyAgICAgICAgICAgY29tcHJlc3Npb24gaWYgYWxsIG9mIHNvdXJjZSBoYXMgYmVlbiByZWFkIGluICovCisgICAgICAgIGRvIHsKKzwvYj48L3ByZT4KK091dHB1dCBzcGFjZSBpcyBwcm92aWRlZCB0byA8dHQ+ZGVmbGF0ZSgpPC90dD4gYnkgc2V0dGluZyA8dHQ+YXZhaWxfb3V0PC90dD4gdG8gdGhlIG51bWJlcgorb2YgYXZhaWxhYmxlIG91dHB1dCBieXRlcyBhbmQgPHR0Pm5leHRfb3V0PC90dD4gdG8gYSBwb2ludGVyIHRvIHRoYXQgc3BhY2UuCis8cHJlPjxiPgorICAgICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBDSFVOSzsKKyAgICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSBvdXQ7Cis8L2I+PC9wcmU+CitOb3cgd2UgY2FsbCB0aGUgY29tcHJlc3Npb24gZW5naW5lIGl0c2VsZiwgPHR0PmRlZmxhdGUoKTwvdHQ+LiAgSXQgdGFrZXMgYXMgbWFueSBvZiB0aGUKKzx0dD5hdmFpbF9pbjwvdHQ+IGJ5dGVzIGF0IDx0dD5uZXh0X2luPC90dD4gYXMgaXQgY2FuIHByb2Nlc3MsIGFuZCB3cml0ZXMgYXMgbWFueSBhcworPHR0PmF2YWlsX291dDwvdHQ+IGJ5dGVzIHRvIDx0dD5uZXh0X291dDwvdHQ+LiAgVGhvc2UgY291bnRlcnMgYW5kIHBvaW50ZXJzIGFyZSB0aGVuCit1cGRhdGVkIHBhc3QgdGhlIGlucHV0IGRhdGEgY29uc3VtZWQgYW5kIHRoZSBvdXRwdXQgZGF0YSB3cml0dGVuLiAgSXQgaXMgdGhlIGFtb3VudCBvZgorb3V0cHV0IHNwYWNlIGF2YWlsYWJsZSB0aGF0IG1heSBsaW1pdCBob3cgbXVjaCBpbnB1dCBpcyBjb25zdW1lZC4KK0hlbmNlIHRoZSBpbm5lciBsb29wIHRvIG1ha2Ugc3VyZSB0aGF0CithbGwgb2YgdGhlIGlucHV0IGlzIGNvbnN1bWVkIGJ5IHByb3ZpZGluZyBtb3JlIG91dHB1dCBzcGFjZSBlYWNoIHRpbWUuICBTaW5jZSA8dHQ+YXZhaWxfaW48L3R0PgorYW5kIDx0dD5uZXh0X2luPC90dD4gYXJlIHVwZGF0ZWQgYnkgPHR0PmRlZmxhdGUoKTwvdHQ+LCB3ZSBkb24ndCBoYXZlIHRvIG1lc3Mgd2l0aCB0aG9zZQorYmV0d2VlbiA8dHQ+ZGVmbGF0ZSgpPC90dD4gY2FsbHMgdW50aWwgaXQncyBhbGwgdXNlZCB1cC4KKzxwPgorVGhlIHBhcmFtZXRlcnMgdG8gPHR0PmRlZmxhdGUoKTwvdHQ+IGFyZSBhIHBvaW50ZXIgdG8gdGhlIDx0dD5zdHJtPC90dD4gc3RydWN0dXJlIGNvbnRhaW5pbmcKK3RoZSBpbnB1dCBhbmQgb3V0cHV0IGluZm9ybWF0aW9uIGFuZCB0aGUgaW50ZXJuYWwgY29tcHJlc3Npb24gZW5naW5lIHN0YXRlLCBhbmQgYSBwYXJhbWV0ZXIKK2luZGljYXRpbmcgd2hldGhlciBhbmQgaG93IHRvIGZsdXNoIGRhdGEgdG8gdGhlIG91dHB1dC4gIE5vcm1hbGx5IDx0dD5kZWZsYXRlPC90dD4gd2lsbCBjb25zdW1lCitzZXZlcmFsIEsgYnl0ZXMgb2YgaW5wdXQgZGF0YSBiZWZvcmUgcHJvZHVjaW5nIGFueSBvdXRwdXQgKGV4Y2VwdCBmb3IgdGhlIGhlYWRlciksIGluIG9yZGVyCit0byBhY2N1bXVsYXRlIHN0YXRpc3RpY3Mgb24gdGhlIGRhdGEgZm9yIG9wdGltdW0gY29tcHJlc3Npb24uICBJdCB3aWxsIHRoZW4gcHV0IG91dCBhIGJ1cnN0IG9mCitjb21wcmVzc2VkIGRhdGEsIGFuZCBwcm9jZWVkIHRvIGNvbnN1bWUgbW9yZSBpbnB1dCBiZWZvcmUgdGhlIG5leHQgYnVyc3QuICBFdmVudHVhbGx5LAorPHR0PmRlZmxhdGUoKTwvdHQ+CittdXN0IGJlIHRvbGQgdG8gdGVybWluYXRlIHRoZSBzdHJlYW0sIGNvbXBsZXRlIHRoZSBjb21wcmVzc2lvbiB3aXRoIHByb3ZpZGVkIGlucHV0IGRhdGEsIGFuZAord3JpdGUgb3V0IHRoZSB0cmFpbGVyIGNoZWNrIHZhbHVlLiAgPHR0PmRlZmxhdGUoKTwvdHQ+IHdpbGwgY29udGludWUgdG8gY29tcHJlc3Mgbm9ybWFsbHkgYXMgbG9uZworYXMgdGhlIGZsdXNoIHBhcmFtZXRlciBpcyA8dHQ+Wl9OT19GTFVTSDwvdHQ+LiAgT25jZSB0aGUgPHR0PlpfRklOSVNIPC90dD4gcGFyYW1ldGVyIGlzIHByb3ZpZGVkLAorPHR0PmRlZmxhdGUoKTwvdHQ+IHdpbGwgYmVnaW4gdG8gY29tcGxldGUgdGhlIGNvbXByZXNzZWQgb3V0cHV0IHN0cmVhbS4gIEhvd2V2ZXIgZGVwZW5kaW5nIG9uIGhvdworbXVjaCBvdXRwdXQgc3BhY2UgaXMgcHJvdmlkZWQsIDx0dD5kZWZsYXRlKCk8L3R0PiBtYXkgaGF2ZSB0byBiZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcyB1bnRpbCBpdAoraGFzIHByb3ZpZGVkIHRoZSBjb21wbGV0ZSBjb21wcmVzc2VkIHN0cmVhbSwgZXZlbiBhZnRlciBpdCBoYXMgY29uc3VtZWQgYWxsIG9mIHRoZSBpbnB1dC4gIFRoZSBmbHVzaAorcGFyYW1ldGVyIG11c3QgY29udGludWUgdG8gYmUgPHR0PlpfRklOSVNIPC90dD4gZm9yIHRob3NlIHN1YnNlcXVlbnQgY2FsbHMuCis8cD4KK1RoZXJlIGFyZSBvdGhlciB2YWx1ZXMgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciB0aGF0IGFyZSB1c2VkIGluIG1vcmUgYWR2YW5jZWQgYXBwbGljYXRpb25zLiAgWW91IGNhbgorZm9yY2UgPHR0PmRlZmxhdGUoKTwvdHQ+IHRvIHByb2R1Y2UgYSBidXJzdCBvZiBvdXRwdXQgdGhhdCBlbmNvZGVzIGFsbCBvZiB0aGUgaW5wdXQgZGF0YSBwcm92aWRlZAorc28gZmFyLCBldmVuIGlmIGl0IHdvdWxkbid0IGhhdmUgb3RoZXJ3aXNlLCBmb3IgZXhhbXBsZSB0byBjb250cm9sIGRhdGEgbGF0ZW5jeSBvbiBhIGxpbmsgd2l0aAorY29tcHJlc3NlZCBkYXRhLiAgWW91IGNhbiBhbHNvIGFzayB0aGF0IDx0dD5kZWZsYXRlKCk8L3R0PiBkbyB0aGF0IGFzIHdlbGwgYXMgZXJhc2UgYW55IGhpc3RvcnkgdXAgdG8KK3RoYXQgcG9pbnQgc28gdGhhdCB3aGF0IGZvbGxvd3MgY2FuIGJlIGRlY29tcHJlc3NlZCBpbmRlcGVuZGVudGx5LCBmb3IgZXhhbXBsZSBmb3IgcmFuZG9tIGFjY2VzcworYXBwbGljYXRpb25zLiAgQm90aCByZXF1ZXN0cyB3aWxsIGRlZ3JhZGUgY29tcHJlc3Npb24gYnkgYW4gYW1vdW50IGRlcGVuZGluZyBvbiBob3cgb2Z0ZW4gc3VjaAorcmVxdWVzdHMgYXJlIG1hZGUuCis8cD4KKzx0dD5kZWZsYXRlKCk8L3R0PiBoYXMgYSByZXR1cm4gdmFsdWUgdGhhdCBjYW4gaW5kaWNhdGUgZXJyb3JzLCB5ZXQgd2UgZG8gbm90IGNoZWNrIGl0IGhlcmUuICBXaHkKK25vdD8gIFdlbGwsIGl0IHR1cm5zIG91dCB0aGF0IDx0dD5kZWZsYXRlKCk8L3R0PiBjYW4gZG8gbm8gd3JvbmcgaGVyZS4gIExldCdzIGdvIHRocm91Z2gKKzx0dD5kZWZsYXRlKCk8L3R0PidzIHJldHVybiB2YWx1ZXMgYW5kIGRpc3BlbnNlIHdpdGggdGhlbSBvbmUgYnkgb25lLiAgVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmUKKzx0dD5aX09LPC90dD4sIDx0dD5aX1NUUkVBTV9FTkQ8L3R0PiwgPHR0PlpfU1RSRUFNX0VSUk9SPC90dD4sIG9yIDx0dD5aX0JVRl9FUlJPUjwvdHQ+LiAgPHR0PlpfT0s8L3R0PgoraXMsIHdlbGwsIG9rLiAgPHR0PlpfU1RSRUFNX0VORDwvdHQ+IGlzIGFsc28gb2sgYW5kIHdpbGwgYmUgcmV0dXJuZWQgZm9yIHRoZSBsYXN0IGNhbGwgb2YKKzx0dD5kZWZsYXRlKCk8L3R0Pi4gIFRoaXMgaXMgYWxyZWFkeSBndWFyYW50ZWVkIGJ5IGNhbGxpbmcgPHR0PmRlZmxhdGUoKTwvdHQ+IHdpdGggPHR0PlpfRklOSVNIPC90dD4KK3VudGlsIGl0IGhhcyBubyBtb3JlIG91dHB1dC4gIDx0dD5aX1NUUkVBTV9FUlJPUjwvdHQ+IGlzIG9ubHkgcG9zc2libGUgaWYgdGhlIHN0cmVhbSBpcyBub3QKK2luaXRpYWxpemVkIHByb3Blcmx5LCBidXQgd2UgZGlkIGluaXRpYWxpemUgaXQgcHJvcGVybHkuICBUaGVyZSBpcyBubyBoYXJtIGluIGNoZWNraW5nIGZvcgorPHR0PlpfU1RSRUFNX0VSUk9SPC90dD4gaGVyZSwgZm9yIGV4YW1wbGUgdG8gY2hlY2sgZm9yIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHNvbWUKK290aGVyIHBhcnQgb2YgdGhlIGFwcGxpY2F0aW9uIGluYWR2ZXJ0ZW50bHkgY2xvYmJlcmVkIHRoZSBtZW1vcnkgY29udGFpbmluZyB0aGUgPGVtPnpsaWI8L2VtPiBzdGF0ZS4KKzx0dD5aX0JVRl9FUlJPUjwvdHQ+IHdpbGwgYmUgZXhwbGFpbmVkIGZ1cnRoZXIgYmVsb3csIGJ1dAorc3VmZmljZSBpdCB0byBzYXkgdGhhdCB0aGlzIGlzIHNpbXBseSBhbiBpbmRpY2F0aW9uIHRoYXQgPHR0PmRlZmxhdGUoKTwvdHQ+IGNvdWxkIG5vdCBjb25zdW1lCittb3JlIGlucHV0IG9yIHByb2R1Y2UgbW9yZSBvdXRwdXQuICA8dHQ+ZGVmbGF0ZSgpPC90dD4gY2FuIGJlIGNhbGxlZCBhZ2FpbiB3aXRoIG1vcmUgb3V0cHV0IHNwYWNlCitvciBtb3JlIGF2YWlsYWJsZSBpbnB1dCwgd2hpY2ggaXQgd2lsbCBiZSBpbiB0aGlzIGNvZGUuCis8cHJlPjxiPgorICAgICAgICAgICAgcmV0ID0gZGVmbGF0ZSgmYW1wO3N0cm0sIGZsdXNoKTsgICAgLyogbm8gYmFkIHJldHVybiB2YWx1ZSAqLworICAgICAgICAgICAgYXNzZXJ0KHJldCAhPSBaX1NUUkVBTV9FUlJPUik7ICAvKiBzdGF0ZSBub3QgY2xvYmJlcmVkICovCis8L2I+PC9wcmU+CitOb3cgd2UgY29tcHV0ZSBob3cgbXVjaCBvdXRwdXQgPHR0PmRlZmxhdGUoKTwvdHQ+IHByb3ZpZGVkIG9uIHRoZSBsYXN0IGNhbGwsIHdoaWNoIGlzIHRoZQorZGlmZmVyZW5jZSBiZXR3ZWVuIGhvdyBtdWNoIHNwYWNlIHdhcyBwcm92aWRlZCBiZWZvcmUgdGhlIGNhbGwsIGFuZCBob3cgbXVjaCBvdXRwdXQgc3BhY2UKK2lzIHN0aWxsIGF2YWlsYWJsZSBhZnRlciB0aGUgY2FsbC4gIFRoZW4gdGhhdCBkYXRhLCBpZiBhbnksIGlzIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBmaWxlLgorV2UgY2FuIHRoZW4gcmV1c2UgdGhlIG91dHB1dCBidWZmZXIgZm9yIHRoZSBuZXh0IGNhbGwgb2YgPHR0PmRlZmxhdGUoKTwvdHQ+LiAgQWdhaW4gaWYgdGhlcmUKK2lzIGEgZmlsZSBpL28gZXJyb3IsIHdlIGNhbGwgPHR0PmRlZmxhdGVFbmQoKTwvdHQ+IGJlZm9yZSByZXR1cm5pbmcgdG8gYXZvaWQgYSBtZW1vcnkgbGVhay4KKzxwcmU+PGI+CisgICAgICAgICAgICBoYXZlID0gQ0hVTksgLSBzdHJtLmF2YWlsX291dDsKKyAgICAgICAgICAgIGlmIChmd3JpdGUob3V0LCAxLCBoYXZlLCBkZXN0KSAhPSBoYXZlIHx8IGZlcnJvcihkZXN0KSkgeworICAgICAgICAgICAgICAgICh2b2lkKWRlZmxhdGVFbmQoJmFtcDtzdHJtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gWl9FUlJOTzsKKyAgICAgICAgICAgIH0KKzwvYj48L3ByZT4KK1RoZSBpbm5lciA8dHQ+ZG88L3R0Pi1sb29wIGlzIHJlcGVhdGVkIHVudGlsIHRoZSBsYXN0IDx0dD5kZWZsYXRlKCk8L3R0PiBjYWxsIGZhaWxzIHRvIGZpbGwgdGhlCitwcm92aWRlZCBvdXRwdXQgYnVmZmVyLiAgVGhlbiB3ZSBrbm93IHRoYXQgPHR0PmRlZmxhdGUoKTwvdHQ+IGhhcyBkb25lIGFzIG11Y2ggYXMgaXQgY2FuIHdpdGgKK3RoZSBwcm92aWRlZCBpbnB1dCwgYW5kIHRoYXQgYWxsIG9mIHRoYXQgaW5wdXQgaGFzIGJlZW4gY29uc3VtZWQuICBXZSBjYW4gdGhlbiBmYWxsIG91dCBvZiB0aGlzCitsb29wIGFuZCByZXVzZSB0aGUgaW5wdXQgYnVmZmVyLgorPHA+CitUaGUgd2F5IHdlIHRlbGwgdGhhdCA8dHQ+ZGVmbGF0ZSgpPC90dD4gaGFzIG5vIG1vcmUgb3V0cHV0IGlzIGJ5IHNlZWluZyB0aGF0IGl0IGRpZCBub3QgZmlsbAordGhlIG91dHB1dCBidWZmZXIsIGxlYXZpbmcgPHR0PmF2YWlsX291dDwvdHQ+IGdyZWF0ZXIgdGhhbiB6ZXJvLiAgSG93ZXZlciBzdXBwb3NlIHRoYXQKKzx0dD5kZWZsYXRlKCk8L3R0PiBoYXMgbm8gbW9yZSBvdXRwdXQsIGJ1dCBqdXN0IHNvIGhhcHBlbmVkIHRvIGV4YWN0bHkgZmlsbCB0aGUgb3V0cHV0IGJ1ZmZlciEKKzx0dD5hdmFpbF9vdXQ8L3R0PiBpcyB6ZXJvLCBhbmQgd2UgY2FuJ3QgdGVsbCB0aGF0IDx0dD5kZWZsYXRlKCk8L3R0PiBoYXMgZG9uZSBhbGwgaXQgY2FuLgorQXMgZmFyIGFzIHdlIGtub3csIDx0dD5kZWZsYXRlKCk8L3R0PgoraGFzIG1vcmUgb3V0cHV0IGZvciB1cy4gIFNvIHdlIGNhbGwgaXQgYWdhaW4uICBCdXQgbm93IDx0dD5kZWZsYXRlKCk8L3R0PiBwcm9kdWNlcyBubyBvdXRwdXQKK2F0IGFsbCwgYW5kIDx0dD5hdmFpbF9vdXQ8L3R0PiByZW1haW5zIHVuY2hhbmdlZCBhcyA8dHQ+Q0hVTks8L3R0Pi4gIFRoYXQgPHR0PmRlZmxhdGUoKTwvdHQ+IGNhbGwKK3dhc24ndCBhYmxlIHRvIGRvIGFueXRoaW5nLCBlaXRoZXIgY29uc3VtZSBpbnB1dCBvciBwcm9kdWNlIG91dHB1dCwgYW5kIHNvIGl0IHJldHVybnMKKzx0dD5aX0JVRl9FUlJPUjwvdHQ+LiAgKFNlZSwgSSB0b2xkIHlvdSBJJ2QgY292ZXIgdGhpcyBsYXRlci4pICBIb3dldmVyIHRoaXMgaXMgbm90IGEgcHJvYmxlbSBhdAorYWxsLiAgTm93IHdlIGZpbmFsbHkgaGF2ZSB0aGUgZGVzaXJlZCBpbmRpY2F0aW9uIHRoYXQgPHR0PmRlZmxhdGUoKTwvdHQ+IGlzIHJlYWxseSBkb25lLAorYW5kIHNvIHdlIGRyb3Agb3V0IG9mIHRoZSBpbm5lciBsb29wIHRvIHByb3ZpZGUgbW9yZSBpbnB1dCB0byA8dHQ+ZGVmbGF0ZSgpPC90dD4uCis8cD4KK1dpdGggPHR0PmZsdXNoPC90dD4gc2V0IHRvIDx0dD5aX0ZJTklTSDwvdHQ+LCB0aGlzIGZpbmFsIHNldCBvZiA8dHQ+ZGVmbGF0ZSgpPC90dD4gY2FsbHMgd2lsbAorY29tcGxldGUgdGhlIG91dHB1dCBzdHJlYW0uICBPbmNlIHRoYXQgaXMgZG9uZSwgc3Vic2VxdWVudCBjYWxscyBvZiA8dHQ+ZGVmbGF0ZSgpPC90dD4gd291bGQgcmV0dXJuCis8dHQ+Wl9TVFJFQU1fRVJST1I8L3R0PiBpZiB0aGUgZmx1c2ggcGFyYW1ldGVyIGlzIG5vdCA8dHQ+Wl9GSU5JU0g8L3R0PiwgYW5kIGRvIG5vIG1vcmUgcHJvY2Vzc2luZwordW50aWwgdGhlIHN0YXRlIGlzIHJlaW5pdGlhbGl6ZWQuCis8cD4KK1NvbWUgYXBwbGljYXRpb25zIG9mIDxlbT56bGliPC9lbT4gaGF2ZSB0d28gbG9vcHMgdGhhdCBjYWxsIDx0dD5kZWZsYXRlKCk8L3R0PgoraW5zdGVhZCBvZiB0aGUgc2luZ2xlIGlubmVyIGxvb3Agd2UgaGF2ZSBoZXJlLiAgVGhlIGZpcnN0IGxvb3Agd291bGQgY2FsbAord2l0aG91dCBmbHVzaGluZyBhbmQgZmVlZCBhbGwgb2YgdGhlIGRhdGEgdG8gPHR0PmRlZmxhdGUoKTwvdHQ+LiAgVGhlIHNlY29uZCBsb29wIHdvdWxkIGNhbGwKKzx0dD5kZWZsYXRlKCk8L3R0PiB3aXRoIG5vIG1vcmUKK2RhdGEgYW5kIHRoZSA8dHQ+Wl9GSU5JU0g8L3R0PiBwYXJhbWV0ZXIgdG8gY29tcGxldGUgdGhlIHByb2Nlc3MuICBBcyB5b3UgY2FuIHNlZSBmcm9tIHRoaXMKK2V4YW1wbGUsIHRoYXQgY2FuIGJlIGF2b2lkZWQgYnkgc2ltcGx5IGtlZXBpbmcgdHJhY2sgb2YgdGhlIGN1cnJlbnQgZmx1c2ggc3RhdGUuCis8cHJlPjxiPgorICAgICAgICB9IHdoaWxlIChzdHJtLmF2YWlsX291dCA9PSAwKTsKKyAgICAgICAgYXNzZXJ0KHN0cm0uYXZhaWxfaW4gPT0gMCk7ICAgICAvKiBhbGwgaW5wdXQgd2lsbCBiZSB1c2VkICovCis8L2I+PC9wcmU+PCEtLSAtLT4KK05vdyB3ZSBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbHJlYWR5IHByb2Nlc3NlZCBhbGwgb2YgdGhlIGlucHV0IGZpbGUuICBUaGF0IGluZm9ybWF0aW9uIHdhcworc2F2ZWQgaW4gdGhlIDx0dD5mbHVzaDwvdHQ+IHZhcmlhYmxlLCBzbyB3ZSBzZWUgaWYgdGhhdCB3YXMgc2V0IHRvIDx0dD5aX0ZJTklTSDwvdHQ+LiAgSWYgc28sCit0aGVuIHdlJ3JlIGRvbmUgYW5kIHdlIGZhbGwgb3V0IG9mIHRoZSBvdXRlciBsb29wLiAgV2UncmUgZ3VhcmFudGVlZCB0byBnZXQgPHR0PlpfU1RSRUFNX0VORDwvdHQ+Citmcm9tIHRoZSBsYXN0IDx0dD5kZWZsYXRlKCk8L3R0PiBjYWxsLCBzaW5jZSB3ZSByYW4gaXQgdW50aWwgdGhlIGxhc3QgY2h1bmsgb2YgaW5wdXQgd2FzCitjb25zdW1lZCBhbmQgYWxsIG9mIHRoZSBvdXRwdXQgd2FzIGdlbmVyYXRlZC4KKzxwcmU+PGI+CisgICAgICAgIC8qIGRvbmUgd2hlbiBsYXN0IGRhdGEgaW4gZmlsZSBwcm9jZXNzZWQgKi8KKyAgICB9IHdoaWxlIChmbHVzaCAhPSBaX0ZJTklTSCk7CisgICAgYXNzZXJ0KHJldCA9PSBaX1NUUkVBTV9FTkQpOyAgICAgICAgLyogc3RyZWFtIHdpbGwgYmUgY29tcGxldGUgKi8KKzwvYj48L3ByZT48IS0tIC0tPgorVGhlIHByb2Nlc3MgaXMgY29tcGxldGUsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIGRlYWxsb2NhdGUgdGhlIHN0YXRlIHRvIGF2b2lkIGEgbWVtb3J5IGxlYWsKKyhvciByYXRoZXIgbW9yZSBsaWtlIGEgbWVtb3J5IGhlbW9ycmhhZ2UgaWYgeW91IGRpZG4ndCBkbyB0aGlzKS4gIFRoZW4KK2ZpbmFsbHkgd2UgY2FuIHJldHVybiB3aXRoIGEgaGFwcHkgcmV0dXJuIHZhbHVlLgorPHByZT48Yj4KKyAgICAvKiBjbGVhbiB1cCBhbmQgcmV0dXJuICovCisgICAgKHZvaWQpZGVmbGF0ZUVuZCgmYW1wO3N0cm0pOworICAgIHJldHVybiBaX09LOworfQorPC9iPjwvcHJlPjwhLS0gLS0+CitOb3cgd2UgZG8gdGhlIHNhbWUgdGhpbmcgZm9yIGRlY29tcHJlc3Npb24gaW4gdGhlIDx0dD5pbmYoKTwvdHQ+IHJvdXRpbmUuIDx0dD5pbmYoKTwvdHQ+CitkZWNvbXByZXNzZXMgd2hhdCBpcyBob3BlZnVsbHkgYSB2YWxpZCA8ZW0+emxpYjwvZW0+IHN0cmVhbSBmcm9tIHRoZSBpbnB1dCBmaWxlIGFuZCB3cml0ZXMgdGhlCit1bmNvbXByZXNzZWQgZGF0YSB0byB0aGUgb3V0cHV0IGZpbGUuICBNdWNoIG9mIHRoZSBkaXNjdXNzaW9uIGFib3ZlIGZvciA8dHQ+ZGVmKCk8L3R0PgorYXBwbGllcyB0byA8dHQ+aW5mKCk8L3R0PiBhcyB3ZWxsLCBzbyB0aGUgZGlzY3Vzc2lvbiBoZXJlIHdpbGwgZm9jdXMgb24gdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4KK3RoZSB0d28uCis8cHJlPjxiPgorLyogRGVjb21wcmVzcyBmcm9tIGZpbGUgc291cmNlIHRvIGZpbGUgZGVzdCB1bnRpbCBzdHJlYW0gZW5kcyBvciBFT0YuCisgICBpbmYoKSByZXR1cm5zIFpfT0sgb24gc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgbWVtb3J5IGNvdWxkIG5vdCBiZQorICAgYWxsb2NhdGVkIGZvciBwcm9jZXNzaW5nLCBaX0RBVEFfRVJST1IgaWYgdGhlIGRlZmxhdGUgZGF0YSBpcworICAgaW52YWxpZCBvciBpbmNvbXBsZXRlLCBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHZlcnNpb24gb2YgemxpYi5oIGFuZAorICAgdGhlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgbGlua2VkIGRvIG5vdCBtYXRjaCwgb3IgWl9FUlJOTyBpZiB0aGVyZQorICAgaXMgYW4gZXJyb3IgcmVhZGluZyBvciB3cml0aW5nIHRoZSBmaWxlcy4gKi8KK2ludCBpbmYoRklMRSAqc291cmNlLCBGSUxFICpkZXN0KQoreworPC9iPjwvcHJlPgorVGhlIGxvY2FsIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgdGhleSBkbyBmb3IgPHR0PmRlZigpPC90dD4uICBUaGUKK29ubHkgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZXJlIGlzIG5vIDx0dD5mbHVzaDwvdHQ+IHZhcmlhYmxlLCBzaW5jZSA8dHQ+aW5mbGF0ZSgpPC90dD4KK2NhbiB0ZWxsIGZyb20gdGhlIDxlbT56bGliPC9lbT4gc3RyZWFtIGl0c2VsZiB3aGVuIHRoZSBzdHJlYW0gaXMgY29tcGxldGUuCis8cHJlPjxiPgorICAgIGludCByZXQ7CisgICAgdW5zaWduZWQgaGF2ZTsKKyAgICB6X3N0cmVhbSBzdHJtOworICAgIHVuc2lnbmVkIGNoYXIgaW5bQ0hVTktdOworICAgIHVuc2lnbmVkIGNoYXIgb3V0W0NIVU5LXTsKKzwvYj48L3ByZT48IS0tIC0tPgorVGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBzdGF0ZSBpcyB0aGUgc2FtZSwgZXhjZXB0IHRoYXQgdGhlcmUgaXMgbm8gY29tcHJlc3Npb24gbGV2ZWwsCitvZiBjb3Vyc2UsIGFuZCB0d28gbW9yZSBlbGVtZW50cyBvZiB0aGUgc3RydWN0dXJlIGFyZSBpbml0aWFsaXplZC4gIDx0dD5hdmFpbF9pbjwvdHQ+CithbmQgPHR0Pm5leHRfaW48L3R0PiBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBjYWxsaW5nIDx0dD5pbmZsYXRlSW5pdCgpPC90dD4uICBUaGlzCitpcyBiZWNhdXNlIHRoZSBhcHBsaWNhdGlvbiBoYXMgdGhlIG9wdGlvbiB0byBwcm92aWRlIHRoZSBzdGFydCBvZiB0aGUgemxpYiBzdHJlYW0gaW4KK29yZGVyIGZvciA8dHQ+aW5mbGF0ZUluaXQoKTwvdHQ+IHRvIGhhdmUgYWNjZXNzIHRvIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21wcmVzc2lvbgorbWV0aG9kIHRvIGFpZCBpbiBtZW1vcnkgYWxsb2NhdGlvbi4gIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIDxlbT56bGliPC9lbT4KKyh1cCB0aHJvdWdoIHZlcnNpb25zIDEuMi54KSwgdGhlIG1ldGhvZC1kZXBlbmRlbnQgbWVtb3J5IGFsbG9jYXRpb25zIGFyZSBkZWZlcnJlZCB0byB0aGUgZmlyc3QgY2FsbCBvZgorPHR0PmluZmxhdGUoKTwvdHQ+IGFueXdheS4gIEhvd2V2ZXIgdGhvc2UgZmllbGRzIG11c3QgYmUgaW5pdGlhbGl6ZWQgc2luY2UgbGF0ZXIgdmVyc2lvbnMKK29mIDxlbT56bGliPC9lbT4gdGhhdCBwcm92aWRlIG1vcmUgY29tcHJlc3Npb24gbWV0aG9kcyBtYXkgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcyBpbnRlcmZhY2UuCitJbiBhbnkgY2FzZSwgbm8gZGVjb21wcmVzc2lvbiBpcyBwZXJmb3JtZWQgYnkgPHR0PmluZmxhdGVJbml0KCk8L3R0Piwgc28gdGhlCis8dHQ+YXZhaWxfb3V0PC90dD4gYW5kIDx0dD5uZXh0X291dDwvdHQ+IGZpZWxkcyBkbyBub3QgbmVlZCB0byBiZSBpbml0aWFsaXplZCBiZWZvcmUgY2FsbGluZy4KKzxwPgorSGVyZSA8dHQ+YXZhaWxfaW48L3R0PiBpcyBzZXQgdG8gemVybyBhbmQgPHR0Pm5leHRfaW48L3R0PiBpcyBzZXQgdG8gPHR0PlpfTlVMTDwvdHQ+IHRvCitpbmRpY2F0ZSB0aGF0IG5vIGlucHV0IGRhdGEgaXMgYmVpbmcgcHJvdmlkZWQuCis8cHJlPjxiPgorICAgIC8qIGFsbG9jYXRlIGluZmxhdGUgc3RhdGUgKi8KKyAgICBzdHJtLnphbGxvYyA9IFpfTlVMTDsKKyAgICBzdHJtLnpmcmVlID0gWl9OVUxMOworICAgIHN0cm0ub3BhcXVlID0gWl9OVUxMOworICAgIHN0cm0uYXZhaWxfaW4gPSAwOworICAgIHN0cm0ubmV4dF9pbiA9IFpfTlVMTDsKKyAgICByZXQgPSBpbmZsYXRlSW5pdCgmYW1wO3N0cm0pOworICAgIGlmIChyZXQgIT0gWl9PSykKKyAgICAgICAgcmV0dXJuIHJldDsKKzwvYj48L3ByZT48IS0tIC0tPgorVGhlIG91dGVyIDx0dD5kbzwvdHQ+LWxvb3AgZGVjb21wcmVzc2VzIGlucHV0IHVudGlsIDx0dD5pbmZsYXRlKCk8L3R0PiBpbmRpY2F0ZXMKK3RoYXQgaXQgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIGFuZCBoYXMgcHJvZHVjZWQgYWxsIG9mIHRoZSB1bmNvbXByZXNzZWQKK291dHB1dC4gIFRoaXMgaXMgaW4gY29udHJhc3QgdG8gPHR0PmRlZigpPC90dD4gd2hpY2ggcHJvY2Vzc2VzIGFsbCBvZiB0aGUgaW5wdXQgZmlsZS4KK0lmIGVuZC1vZi1maWxlIGlzIHJlYWNoZWQgYmVmb3JlIHRoZSBjb21wcmVzc2VkIGRhdGEgc2VsZi10ZXJtaW5hdGVzLCB0aGVuIHRoZSBjb21wcmVzc2VkCitkYXRhIGlzIGluY29tcGxldGUgYW5kIGFuIGVycm9yIGlzIHJldHVybmVkLgorPHByZT48Yj4KKyAgICAvKiBkZWNvbXByZXNzIHVudGlsIGRlZmxhdGUgc3RyZWFtIGVuZHMgb3IgZW5kIG9mIGZpbGUgKi8KKyAgICBkbyB7Cis8L2I+PC9wcmU+CitXZSByZWFkIGlucHV0IGRhdGEgYW5kIHNldCB0aGUgPHR0PnN0cm08L3R0PiBzdHJ1Y3R1cmUgYWNjb3JkaW5nbHkuICBJZiB3ZSd2ZSByZWFjaGVkIHRoZQorZW5kIG9mIHRoZSBpbnB1dCBmaWxlLCB0aGVuIHdlIGxlYXZlIHRoZSBvdXRlciBsb29wIGFuZCByZXBvcnQgYW4gZXJyb3IsIHNpbmNlIHRoZQorY29tcHJlc3NlZCBkYXRhIGlzIGluY29tcGxldGUuICBOb3RlIHRoYXQgd2UgbWF5IHJlYWQgbW9yZSBkYXRhIHRoYW4gaXMgZXZlbnR1YWxseSBjb25zdW1lZAorYnkgPHR0PmluZmxhdGUoKTwvdHQ+LCBpZiB0aGUgaW5wdXQgZmlsZSBjb250aW51ZXMgcGFzdCB0aGUgPGVtPnpsaWI8L2VtPiBzdHJlYW0uCitGb3IgYXBwbGljYXRpb25zIHdoZXJlIDxlbT56bGliPC9lbT4gc3RyZWFtcyBhcmUgZW1iZWRkZWQgaW4gb3RoZXIgZGF0YSwgdGhpcyByb3V0aW5lIHdvdWxkCituZWVkIHRvIGJlIG1vZGlmaWVkIHRvIHJldHVybiB0aGUgdW51c2VkIGRhdGEsIG9yIGF0IGxlYXN0IGluZGljYXRlIGhvdyBtdWNoIG9mIHRoZSBpbnB1dAorZGF0YSB3YXMgbm90IHVzZWQsIHNvIHRoZSBhcHBsaWNhdGlvbiB3b3VsZCBrbm93IHdoZXJlIHRvIHBpY2sgdXAgYWZ0ZXIgdGhlIDxlbT56bGliPC9lbT4gc3RyZWFtLgorPHByZT48Yj4KKyAgICAgICAgc3RybS5hdmFpbF9pbiA9IGZyZWFkKGluLCAxLCBDSFVOSywgc291cmNlKTsKKyAgICAgICAgaWYgKGZlcnJvcihzb3VyY2UpKSB7CisgICAgICAgICAgICAodm9pZClpbmZsYXRlRW5kKCZhbXA7c3RybSk7CisgICAgICAgICAgICByZXR1cm4gWl9FUlJOTzsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RybS5hdmFpbF9pbiA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHN0cm0ubmV4dF9pbiA9IGluOworPC9iPjwvcHJlPjwhLS0gLS0+CitUaGUgaW5uZXIgPHR0PmRvPC90dD4tbG9vcCBoYXMgdGhlIHNhbWUgZnVuY3Rpb24gaXQgZGlkIGluIDx0dD5kZWYoKTwvdHQ+LCB3aGljaCBpcyB0bwora2VlcCBjYWxsaW5nIDx0dD5pbmZsYXRlKCk8L3R0PiB1bnRpbCBoYXMgZ2VuZXJhdGVkIGFsbCBvZiB0aGUgb3V0cHV0IGl0IGNhbiB3aXRoIHRoZQorcHJvdmlkZWQgaW5wdXQuCis8cHJlPjxiPgorICAgICAgICAvKiBydW4gaW5mbGF0ZSgpIG9uIGlucHV0IHVudGlsIG91dHB1dCBidWZmZXIgbm90IGZ1bGwgKi8KKyAgICAgICAgZG8geworPC9iPjwvcHJlPgorSnVzdCBsaWtlIGluIDx0dD5kZWYoKTwvdHQ+LCB0aGUgc2FtZSBvdXRwdXQgc3BhY2UgaXMgcHJvdmlkZWQgZm9yIGVhY2ggY2FsbCBvZiA8dHQ+aW5mbGF0ZSgpPC90dD4uCis8cHJlPjxiPgorICAgICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBDSFVOSzsKKyAgICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSBvdXQ7Cis8L2I+PC9wcmU+CitOb3cgd2UgcnVuIHRoZSBkZWNvbXByZXNzaW9uIGVuZ2luZSBpdHNlbGYuICBUaGVyZSBpcyBubyBuZWVkIHRvIGFkanVzdCB0aGUgZmx1c2ggcGFyYW1ldGVyLCBzaW5jZQordGhlIDxlbT56bGliPC9lbT4gZm9ybWF0IGlzIHNlbGYtdGVybWluYXRpbmcuIFRoZSBtYWluIGRpZmZlcmVuY2UgaGVyZSBpcyB0aGF0IHRoZXJlIGFyZQorcmV0dXJuIHZhbHVlcyB0aGF0IHdlIG5lZWQgdG8gcGF5IGF0dGVudGlvbiB0by4gIDx0dD5aX0RBVEFfRVJST1I8L3R0PgoraW5kaWNhdGVzIHRoYXQgPHR0PmluZmxhdGUoKTwvdHQ+IGRldGVjdGVkIGFuIGVycm9yIGluIHRoZSA8ZW0+emxpYjwvZW0+IGNvbXByZXNzZWQgZGF0YSBmb3JtYXQsCit3aGljaCBtZWFucyB0aGF0IGVpdGhlciB0aGUgZGF0YSBpcyBub3QgYSA8ZW0+emxpYjwvZW0+IHN0cmVhbSB0byBiZWdpbiB3aXRoLCBvciB0aGF0IHRoZSBkYXRhIHdhcworY29ycnVwdGVkIHNvbWV3aGVyZSBhbG9uZyB0aGUgd2F5IHNpbmNlIGl0IHdhcyBjb21wcmVzc2VkLiAgVGhlIG90aGVyIGVycm9yIHRvIGJlIHByb2Nlc3NlZCBpcworPHR0PlpfTUVNX0VSUk9SPC90dD4sIHdoaWNoIGNhbiBvY2N1ciBzaW5jZSBtZW1vcnkgYWxsb2NhdGlvbiBpcyBkZWZlcnJlZCB1bnRpbCA8dHQ+aW5mbGF0ZSgpPC90dD4KK25lZWRzIGl0LCB1bmxpa2UgPHR0PmRlZmxhdGUoKTwvdHQ+LCB3aG9zZSBtZW1vcnkgaXMgYWxsb2NhdGVkIGF0IHRoZSBzdGFydCBieSA8dHQ+ZGVmbGF0ZUluaXQoKTwvdHQ+LgorPHA+CitBZHZhbmNlZCBhcHBsaWNhdGlvbnMgbWF5IHVzZQorPHR0PmRlZmxhdGVTZXREaWN0aW9uYXJ5KCk8L3R0PiB0byBwcmltZSA8dHQ+ZGVmbGF0ZSgpPC90dD4gd2l0aCBhIHNldCBvZiBsaWtlbHkgZGF0YSB0byBpbXByb3ZlIHRoZQorZmlyc3QgMzJLIG9yIHNvIG9mIGNvbXByZXNzaW9uLiAgVGhpcyBpcyBub3RlZCBpbiB0aGUgPGVtPnpsaWI8L2VtPiBoZWFkZXIsIHNvIDx0dD5pbmZsYXRlKCk8L3R0PgorcmVxdWVzdHMgdGhhdCB0aGF0IGRpY3Rpb25hcnkgYmUgcHJvdmlkZWQgYmVmb3JlIGl0IGNhbiBzdGFydCB0byBkZWNvbXByZXNzLiAgV2l0aG91dCB0aGUgZGljdGlvbmFyeSwKK2NvcnJlY3QgZGVjb21wcmVzc2lvbiBpcyBub3QgcG9zc2libGUuICBGb3IgdGhpcyByb3V0aW5lLCB3ZSBoYXZlIG5vIGlkZWEgd2hhdCB0aGUgZGljdGlvbmFyeSBpcywKK3NvIHRoZSA8dHQ+Wl9ORUVEX0RJQ1Q8L3R0PiBpbmRpY2F0aW9uIGlzIGNvbnZlcnRlZCB0byBhIDx0dD5aX0RBVEFfRVJST1I8L3R0Pi4KKzxwPgorPHR0PmluZmxhdGUoKTwvdHQ+IGNhbiBhbHNvIHJldHVybiA8dHQ+Wl9TVFJFQU1fRVJST1I8L3R0Piwgd2hpY2ggc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSBoZXJlLAorYnV0IGNvdWxkIGJlIGNoZWNrZWQgZm9yIGFzIG5vdGVkIGFib3ZlIGZvciA8dHQ+ZGVmKCk8L3R0Pi4gIDx0dD5aX0JVRl9FUlJPUjwvdHQ+IGRvZXMgbm90IG5lZWQgdG8gYmUKK2NoZWNrZWQgZm9yIGhlcmUsIGZvciB0aGUgc2FtZSByZWFzb25zIG5vdGVkIGZvciA8dHQ+ZGVmKCk8L3R0Pi4gIDx0dD5aX1NUUkVBTV9FTkQ8L3R0PiB3aWxsIGJlCitjaGVja2VkIGZvciBsYXRlci4KKzxwcmU+PGI+CisgICAgICAgICAgICByZXQgPSBpbmZsYXRlKCZhbXA7c3RybSwgWl9OT19GTFVTSCk7CisgICAgICAgICAgICBhc3NlcnQocmV0ICE9IFpfU1RSRUFNX0VSUk9SKTsgIC8qIHN0YXRlIG5vdCBjbG9iYmVyZWQgKi8KKyAgICAgICAgICAgIHN3aXRjaCAocmV0KSB7CisgICAgICAgICAgICBjYXNlIFpfTkVFRF9ESUNUOgorICAgICAgICAgICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjsgICAgIC8qIGFuZCBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgIGNhc2UgWl9EQVRBX0VSUk9SOgorICAgICAgICAgICAgY2FzZSBaX01FTV9FUlJPUjoKKyAgICAgICAgICAgICAgICAodm9pZClpbmZsYXRlRW5kKCZhbXA7c3RybSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKzwvYj48L3ByZT4KK1RoZSBvdXRwdXQgb2YgPHR0PmluZmxhdGUoKTwvdHQ+IGlzIGhhbmRsZWQgaWRlbnRpY2FsbHkgdG8gdGhhdCBvZiA8dHQ+ZGVmbGF0ZSgpPC90dD4uCis8cHJlPjxiPgorICAgICAgICAgICAgaGF2ZSA9IENIVU5LIC0gc3RybS5hdmFpbF9vdXQ7CisgICAgICAgICAgICBpZiAoZndyaXRlKG91dCwgMSwgaGF2ZSwgZGVzdCkgIT0gaGF2ZSB8fCBmZXJyb3IoZGVzdCkpIHsKKyAgICAgICAgICAgICAgICAodm9pZClpbmZsYXRlRW5kKCZhbXA7c3RybSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpfRVJSTk87CisgICAgICAgICAgICB9Cis8L2I+PC9wcmU+CitUaGUgaW5uZXIgPHR0PmRvPC90dD4tbG9vcCBlbmRzIHdoZW4gPHR0PmluZmxhdGUoKTwvdHQ+IGhhcyBubyBtb3JlIG91dHB1dCBhcyBpbmRpY2F0ZWQKK2J5IG5vdCBmaWxsaW5nIHRoZSBvdXRwdXQgYnVmZmVyLCBqdXN0IGFzIGZvciA8dHQ+ZGVmbGF0ZSgpPC90dD4uICBJbiB0aGlzIGNhc2UsIHdlIGNhbm5vdAorYXNzZXJ0IHRoYXQgPHR0PnN0cm0uYXZhaWxfaW48L3R0PiB3aWxsIGJlIHplcm8sIHNpbmNlIHRoZSBkZWZsYXRlIHN0cmVhbSBtYXkgZW5kIGJlZm9yZSB0aGUgZmlsZQorZG9lcy4KKzxwcmU+PGI+CisgICAgICAgIH0gd2hpbGUgKHN0cm0uYXZhaWxfb3V0ID09IDApOworPC9iPjwvcHJlPjwhLS0gLS0+CitUaGUgb3V0ZXIgPHR0PmRvPC90dD4tbG9vcCBlbmRzIHdoZW4gPHR0PmluZmxhdGUoKTwvdHQ+IHJlcG9ydHMgdGhhdCBpdCBoYXMgcmVhY2hlZCB0aGUKK2VuZCBvZiB0aGUgaW5wdXQgPGVtPnpsaWI8L2VtPiBzdHJlYW0sIGhhcyBjb21wbGV0ZWQgdGhlIGRlY29tcHJlc3Npb24gYW5kIGludGVncml0eQorY2hlY2ssIGFuZCBoYXMgcHJvdmlkZWQgYWxsIG9mIHRoZSBvdXRwdXQuICBUaGlzIGlzIGluZGljYXRlZCBieSB0aGUgPHR0PmluZmxhdGUoKTwvdHQ+CityZXR1cm4gdmFsdWUgPHR0PlpfU1RSRUFNX0VORDwvdHQ+LiAgVGhlIGlubmVyIGxvb3AgaXMgZ3VhcmFudGVlZCB0byBsZWF2ZSA8dHQ+cmV0PC90dD4KK2VxdWFsIHRvIDx0dD5aX1NUUkVBTV9FTkQ8L3R0PiBpZiB0aGUgbGFzdCBjaHVuayBvZiB0aGUgaW5wdXQgZmlsZSByZWFkIGNvbnRhaW5lZCB0aGUgZW5kCitvZiB0aGUgPGVtPnpsaWI8L2VtPiBzdHJlYW0uICBTbyBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG5vdCA8dHQ+Wl9TVFJFQU1fRU5EPC90dD4sIHRoZQorbG9vcCBjb250aW51ZXMgdG8gcmVhZCBtb3JlIGlucHV0LgorPHByZT48Yj4KKyAgICAgICAgLyogZG9uZSB3aGVuIGluZmxhdGUoKSBzYXlzIGl0J3MgZG9uZSAqLworICAgIH0gd2hpbGUgKHJldCAhPSBaX1NUUkVBTV9FTkQpOworPC9iPjwvcHJlPjwhLS0gLS0+CitBdCB0aGlzIHBvaW50LCBkZWNvbXByZXNzaW9uIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQsIG9yIHdlIGJyb2tlIG91dCBvZiB0aGUgbG9vcCBkdWUgdG8gbm8KK21vcmUgZGF0YSBiZWluZyBhdmFpbGFibGUgZnJvbSB0aGUgaW5wdXQgZmlsZS4gIElmIHRoZSBsYXN0IDx0dD5pbmZsYXRlKCk8L3R0PiByZXR1cm4gdmFsdWUKK2lzIG5vdCA8dHQ+Wl9TVFJFQU1fRU5EPC90dD4sIHRoZW4gdGhlIDxlbT56bGliPC9lbT4gc3RyZWFtIHdhcyBpbmNvbXBsZXRlIGFuZCBhIGRhdGEgZXJyb3IKK2lzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCB3ZSByZXR1cm4gd2l0aCBhIGhhcHB5IHJldHVybiB2YWx1ZS4gIE9mIGNvdXJzZSwgPHR0PmluZmxhdGVFbmQoKTwvdHQ+CitpcyBjYWxsZWQgZmlyc3QgdG8gYXZvaWQgYSBtZW1vcnkgbGVhay4KKzxwcmU+PGI+CisgICAgLyogY2xlYW4gdXAgYW5kIHJldHVybiAqLworICAgICh2b2lkKWluZmxhdGVFbmQoJmFtcDtzdHJtKTsKKyAgICByZXR1cm4gcmV0ID09IFpfU1RSRUFNX0VORCA/IFpfT0sgOiBaX0RBVEFfRVJST1I7Cit9Cis8L2I+PC9wcmU+PCEtLSAtLT4KK1RoYXQgZW5kcyB0aGUgcm91dGluZXMgdGhhdCBkaXJlY3RseSB1c2UgPGVtPnpsaWI8L2VtPi4gIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgbWFrZSB0aGlzCithIGNvbW1hbmQtbGluZSBwcm9ncmFtIGJ5IHJ1bm5pbmcgZGF0YSB0aHJvdWdoIHRoZSBhYm92ZSByb3V0aW5lcyBmcm9tIDx0dD5zdGRpbjwvdHQ+IHRvCis8dHQ+c3Rkb3V0PC90dD4sIGFuZCBoYW5kbGluZyBhbnkgZXJyb3JzIHJlcG9ydGVkIGJ5IDx0dD5kZWYoKTwvdHQ+IG9yIDx0dD5pbmYoKTwvdHQ+LgorPHA+Cis8dHQ+emVycigpPC90dD4gaXMgdXNlZCB0byBpbnRlcnByZXQgdGhlIHBvc3NpYmxlIGVycm9yIGNvZGVzIGZyb20gPHR0PmRlZigpPC90dD4KK2FuZCA8dHQ+aW5mKCk8L3R0PiwgYXMgZGV0YWlsZWQgaW4gdGhlaXIgY29tbWVudHMgYWJvdmUsIGFuZCBwcmludCBvdXQgYW4gZXJyb3IgbWVzc2FnZS4KK05vdGUgdGhhdCB0aGVzZSBhcmUgb25seSBhIHN1YnNldCBvZiB0aGUgcG9zc2libGUgcmV0dXJuIHZhbHVlcyBmcm9tIDx0dD5kZWZsYXRlKCk8L3R0PgorYW5kIDx0dD5pbmZsYXRlKCk8L3R0Pi4KKzxwcmU+PGI+CisvKiByZXBvcnQgYSB6bGliIG9yIGkvbyBlcnJvciAqLwordm9pZCB6ZXJyKGludCByZXQpCit7CisgICAgZnB1dHMoInpwaXBlOiAiLCBzdGRlcnIpOworICAgIHN3aXRjaCAocmV0KSB7CisgICAgY2FzZSBaX0VSUk5POgorICAgICAgICBpZiAoZmVycm9yKHN0ZGluKSkKKyAgICAgICAgICAgIGZwdXRzKCJlcnJvciByZWFkaW5nIHN0ZGluXG4iLCBzdGRlcnIpOworICAgICAgICBpZiAoZmVycm9yKHN0ZG91dCkpCisgICAgICAgICAgICBmcHV0cygiZXJyb3Igd3JpdGluZyBzdGRvdXRcbiIsIHN0ZGVycik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWl9TVFJFQU1fRVJST1I6CisgICAgICAgIGZwdXRzKCJpbnZhbGlkIGNvbXByZXNzaW9uIGxldmVsXG4iLCBzdGRlcnIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpfREFUQV9FUlJPUjoKKyAgICAgICAgZnB1dHMoImludmFsaWQgb3IgaW5jb21wbGV0ZSBkZWZsYXRlIGRhdGFcbiIsIHN0ZGVycik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWl9NRU1fRVJST1I6CisgICAgICAgIGZwdXRzKCJvdXQgb2YgbWVtb3J5XG4iLCBzdGRlcnIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpfVkVSU0lPTl9FUlJPUjoKKyAgICAgICAgZnB1dHMoInpsaWIgdmVyc2lvbiBtaXNtYXRjaCFcbiIsIHN0ZGVycik7CisgICAgfQorfQorPC9iPjwvcHJlPjwhLS0gLS0+CitIZXJlIGlzIHRoZSA8dHQ+bWFpbigpPC90dD4gcm91dGluZSB1c2VkIHRvIHRlc3QgPHR0PmRlZigpPC90dD4gYW5kIDx0dD5pbmYoKTwvdHQ+LiAgVGhlCis8dHQ+enBpcGU8L3R0PiBjb21tYW5kIGlzIHNpbXBseSBhIGNvbXByZXNzaW9uIHBpcGUgZnJvbSA8dHQ+c3RkaW48L3R0PiB0byA8dHQ+c3Rkb3V0PC90dD4sIGlmCitubyBhcmd1bWVudHMgYXJlIGdpdmVuLCBvciBpdCBpcyBhIGRlY29tcHJlc3Npb24gcGlwZSBpZiA8dHQ+enBpcGUgLWQ8L3R0PiBpcyB1c2VkLiAgSWYgYW55IG90aGVyCithcmd1bWVudHMgYXJlIHByb3ZpZGVkLCBubyBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIGlzIHBlcmZvcm1lZC4gIEluc3RlYWQgYSB1c2FnZQorbWVzc2FnZSBpcyBkaXNwbGF5ZWQuICBFeGFtcGxlcyBhcmUgPHR0PnpwaXBlIDwgZm9vLnR4dCA+IGZvby50eHQuejwvdHQ+IHRvIGNvbXByZXNzLCBhbmQKKzx0dD56cGlwZSAtZCA8IGZvby50eHQueiA+IGZvby50eHQ8L3R0PiB0byBkZWNvbXByZXNzLgorPHByZT48Yj4KKy8qIGNvbXByZXNzIG9yIGRlY29tcHJlc3MgZnJvbSBzdGRpbiB0byBzdGRvdXQgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgcmV0OworCisgICAgLyogYXZvaWQgZW5kLW9mLWxpbmUgY29udmVyc2lvbnMgKi8KKyAgICBTRVRfQklOQVJZX01PREUoc3RkaW4pOworICAgIFNFVF9CSU5BUllfTU9ERShzdGRvdXQpOworCisgICAgLyogZG8gY29tcHJlc3Npb24gaWYgbm8gYXJndW1lbnRzICovCisgICAgaWYgKGFyZ2MgPT0gMSkgeworICAgICAgICByZXQgPSBkZWYoc3RkaW4sIHN0ZG91dCwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKTsKKyAgICAgICAgaWYgKHJldCAhPSBaX09LKQorICAgICAgICAgICAgemVycihyZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qIGRvIGRlY29tcHJlc3Npb24gaWYgLWQgc3BlY2lmaWVkICovCisgICAgZWxzZSBpZiAoYXJnYyA9PSAyICZhbXA7JmFtcDsgc3RyY21wKGFyZ3ZbMV0sICItZCIpID09IDApIHsKKyAgICAgICAgcmV0ID0gaW5mKHN0ZGluLCBzdGRvdXQpOworICAgICAgICBpZiAocmV0ICE9IFpfT0spCisgICAgICAgICAgICB6ZXJyKHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyogb3RoZXJ3aXNlLCByZXBvcnQgdXNhZ2UgKi8KKyAgICBlbHNlIHsKKyAgICAgICAgZnB1dHMoInpwaXBlIHVzYWdlOiB6cGlwZSBbLWRdICZsdDsgc291cmNlICZndDsgZGVzdFxuIiwgc3RkZXJyKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorPC9iPjwvcHJlPgorPGhyPgorPGk+Q29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IGJ5IE1hcmsgQWRsZXI8YnI+TGFzdCBtb2RpZmllZCAxMSBEZWNlbWJlciAyMDA1PC9pPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvZXhhbXBsZXMvenBpcGUuYyBiL3psaWIvc3JjL2V4YW1wbGVzL3pwaXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM1MzVkMQotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2V4YW1wbGVzL3pwaXBlLmMKQEAgLTAsMCArMSwyMDUgQEAKKy8qIHpwaXBlLmM6IGV4YW1wbGUgb2YgcHJvcGVyIHVzZSBvZiB6bGliJ3MgaW5mbGF0ZSgpIGFuZCBkZWZsYXRlKCkKKyAgIE5vdCBjb3B5cmlnaHRlZCAtLSBwcm92aWRlZCB0byB0aGUgcHVibGljIGRvbWFpbgorICAgVmVyc2lvbiAxLjQgIDExIERlY2VtYmVyIDIwMDUgIE1hcmsgQWRsZXIgKi8KKworLyogVmVyc2lvbiBoaXN0b3J5OgorICAgMS4wICAzMCBPY3QgMjAwNCAgRmlyc3QgdmVyc2lvbgorICAgMS4xICAgOCBOb3YgMjAwNCAgQWRkIHZvaWQgY2FzdGluZyBmb3IgdW51c2VkIHJldHVybiB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgIFVzZSBzd2l0Y2ggc3RhdGVtZW50IGZvciBpbmZsYXRlKCkgcmV0dXJuIHZhbHVlcworICAgMS4yICAgOSBOb3YgMjAwNCAgQWRkIGFzc2VydGlvbnMgdG8gZG9jdW1lbnQgemxpYiBndWFyYW50ZWVzCisgICAxLjMgICA2IEFwciAyMDA1ICBSZW1vdmUgaW5jb3JyZWN0IGFzc2VydGlvbiBpbiBpbmYoKQorICAgMS40ICAxMSBEZWMgMjAwNSAgQWRkIGhhY2sgdG8gYXZvaWQgTVNET1MgZW5kLW9mLWxpbmUgY29udmVyc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgIEF2b2lkIHNvbWUgY29tcGlsZXIgd2FybmluZ3MgZm9yIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgInpsaWIuaCIKKworI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisjICBpbmNsdWRlIDxmY250bC5oPgorIyAgaW5jbHVkZSA8aW8uaD4KKyMgIGRlZmluZSBTRVRfQklOQVJZX01PREUoZmlsZSkgc2V0bW9kZShmaWxlbm8oZmlsZSksIE9fQklOQVJZKQorI2Vsc2UKKyMgIGRlZmluZSBTRVRfQklOQVJZX01PREUoZmlsZSkKKyNlbmRpZgorCisjZGVmaW5lIENIVU5LIDE2Mzg0CisKKy8qIENvbXByZXNzIGZyb20gZmlsZSBzb3VyY2UgdG8gZmlsZSBkZXN0IHVudGlsIEVPRiBvbiBzb3VyY2UuCisgICBkZWYoKSByZXR1cm5zIFpfT0sgb24gc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgbWVtb3J5IGNvdWxkIG5vdCBiZQorICAgYWxsb2NhdGVkIGZvciBwcm9jZXNzaW5nLCBaX1NUUkVBTV9FUlJPUiBpZiBhbiBpbnZhbGlkIGNvbXByZXNzaW9uCisgICBsZXZlbCBpcyBzdXBwbGllZCwgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB2ZXJzaW9uIG9mIHpsaWIuaCBhbmQgdGhlCisgICB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGxpbmtlZCBkbyBub3QgbWF0Y2gsIG9yIFpfRVJSTk8gaWYgdGhlcmUgaXMKKyAgIGFuIGVycm9yIHJlYWRpbmcgb3Igd3JpdGluZyB0aGUgZmlsZXMuICovCitpbnQgZGVmKEZJTEUgKnNvdXJjZSwgRklMRSAqZGVzdCwgaW50IGxldmVsKQoreworICAgIGludCByZXQsIGZsdXNoOworICAgIHVuc2lnbmVkIGhhdmU7CisgICAgel9zdHJlYW0gc3RybTsKKyAgICB1bnNpZ25lZCBjaGFyIGluW0NIVU5LXTsKKyAgICB1bnNpZ25lZCBjaGFyIG91dFtDSFVOS107CisKKyAgICAvKiBhbGxvY2F0ZSBkZWZsYXRlIHN0YXRlICovCisgICAgc3RybS56YWxsb2MgPSBaX05VTEw7CisgICAgc3RybS56ZnJlZSA9IFpfTlVMTDsKKyAgICBzdHJtLm9wYXF1ZSA9IFpfTlVMTDsKKyAgICByZXQgPSBkZWZsYXRlSW5pdCgmc3RybSwgbGV2ZWwpOworICAgIGlmIChyZXQgIT0gWl9PSykKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIGNvbXByZXNzIHVudGlsIGVuZCBvZiBmaWxlICovCisgICAgZG8geworICAgICAgICBzdHJtLmF2YWlsX2luID0gZnJlYWQoaW4sIDEsIENIVU5LLCBzb3VyY2UpOworICAgICAgICBpZiAoZmVycm9yKHNvdXJjZSkpIHsKKyAgICAgICAgICAgICh2b2lkKWRlZmxhdGVFbmQoJnN0cm0pOworICAgICAgICAgICAgcmV0dXJuIFpfRVJSTk87CisgICAgICAgIH0KKyAgICAgICAgZmx1c2ggPSBmZW9mKHNvdXJjZSkgPyBaX0ZJTklTSCA6IFpfTk9fRkxVU0g7CisgICAgICAgIHN0cm0ubmV4dF9pbiA9IGluOworCisgICAgICAgIC8qIHJ1biBkZWZsYXRlKCkgb24gaW5wdXQgdW50aWwgb3V0cHV0IGJ1ZmZlciBub3QgZnVsbCwgZmluaXNoCisgICAgICAgICAgIGNvbXByZXNzaW9uIGlmIGFsbCBvZiBzb3VyY2UgaGFzIGJlZW4gcmVhZCBpbiAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IENIVU5LOworICAgICAgICAgICAgc3RybS5uZXh0X291dCA9IG91dDsKKyAgICAgICAgICAgIHJldCA9IGRlZmxhdGUoJnN0cm0sIGZsdXNoKTsgICAgLyogbm8gYmFkIHJldHVybiB2YWx1ZSAqLworICAgICAgICAgICAgYXNzZXJ0KHJldCAhPSBaX1NUUkVBTV9FUlJPUik7ICAvKiBzdGF0ZSBub3QgY2xvYmJlcmVkICovCisgICAgICAgICAgICBoYXZlID0gQ0hVTksgLSBzdHJtLmF2YWlsX291dDsKKyAgICAgICAgICAgIGlmIChmd3JpdGUob3V0LCAxLCBoYXZlLCBkZXN0KSAhPSBoYXZlIHx8IGZlcnJvcihkZXN0KSkgeworICAgICAgICAgICAgICAgICh2b2lkKWRlZmxhdGVFbmQoJnN0cm0pOworICAgICAgICAgICAgICAgIHJldHVybiBaX0VSUk5POworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChzdHJtLmF2YWlsX291dCA9PSAwKTsKKyAgICAgICAgYXNzZXJ0KHN0cm0uYXZhaWxfaW4gPT0gMCk7ICAgICAvKiBhbGwgaW5wdXQgd2lsbCBiZSB1c2VkICovCisKKyAgICAgICAgLyogZG9uZSB3aGVuIGxhc3QgZGF0YSBpbiBmaWxlIHByb2Nlc3NlZCAqLworICAgIH0gd2hpbGUgKGZsdXNoICE9IFpfRklOSVNIKTsKKyAgICBhc3NlcnQocmV0ID09IFpfU1RSRUFNX0VORCk7ICAgICAgICAvKiBzdHJlYW0gd2lsbCBiZSBjb21wbGV0ZSAqLworCisgICAgLyogY2xlYW4gdXAgYW5kIHJldHVybiAqLworICAgICh2b2lkKWRlZmxhdGVFbmQoJnN0cm0pOworICAgIHJldHVybiBaX09LOworfQorCisvKiBEZWNvbXByZXNzIGZyb20gZmlsZSBzb3VyY2UgdG8gZmlsZSBkZXN0IHVudGlsIHN0cmVhbSBlbmRzIG9yIEVPRi4KKyAgIGluZigpIHJldHVybnMgWl9PSyBvbiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiBtZW1vcnkgY291bGQgbm90IGJlCisgICBhbGxvY2F0ZWQgZm9yIHByb2Nlc3NpbmcsIFpfREFUQV9FUlJPUiBpZiB0aGUgZGVmbGF0ZSBkYXRhIGlzCisgICBpbnZhbGlkIG9yIGluY29tcGxldGUsIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgdmVyc2lvbiBvZiB6bGliLmggYW5kCisgICB0aGUgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBsaW5rZWQgZG8gbm90IG1hdGNoLCBvciBaX0VSUk5PIGlmIHRoZXJlCisgICBpcyBhbiBlcnJvciByZWFkaW5nIG9yIHdyaXRpbmcgdGhlIGZpbGVzLiAqLworaW50IGluZihGSUxFICpzb3VyY2UsIEZJTEUgKmRlc3QpCit7CisgICAgaW50IHJldDsKKyAgICB1bnNpZ25lZCBoYXZlOworICAgIHpfc3RyZWFtIHN0cm07CisgICAgdW5zaWduZWQgY2hhciBpbltDSFVOS107CisgICAgdW5zaWduZWQgY2hhciBvdXRbQ0hVTktdOworCisgICAgLyogYWxsb2NhdGUgaW5mbGF0ZSBzdGF0ZSAqLworICAgIHN0cm0uemFsbG9jID0gWl9OVUxMOworICAgIHN0cm0uemZyZWUgPSBaX05VTEw7CisgICAgc3RybS5vcGFxdWUgPSBaX05VTEw7CisgICAgc3RybS5hdmFpbF9pbiA9IDA7CisgICAgc3RybS5uZXh0X2luID0gWl9OVUxMOworICAgIHJldCA9IGluZmxhdGVJbml0KCZzdHJtKTsKKyAgICBpZiAocmV0ICE9IFpfT0spCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBkZWNvbXByZXNzIHVudGlsIGRlZmxhdGUgc3RyZWFtIGVuZHMgb3IgZW5kIG9mIGZpbGUgKi8KKyAgICBkbyB7CisgICAgICAgIHN0cm0uYXZhaWxfaW4gPSBmcmVhZChpbiwgMSwgQ0hVTkssIHNvdXJjZSk7CisgICAgICAgIGlmIChmZXJyb3Ioc291cmNlKSkgeworICAgICAgICAgICAgKHZvaWQpaW5mbGF0ZUVuZCgmc3RybSk7CisgICAgICAgICAgICByZXR1cm4gWl9FUlJOTzsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RybS5hdmFpbF9pbiA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHN0cm0ubmV4dF9pbiA9IGluOworCisgICAgICAgIC8qIHJ1biBpbmZsYXRlKCkgb24gaW5wdXQgdW50aWwgb3V0cHV0IGJ1ZmZlciBub3QgZnVsbCAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IENIVU5LOworICAgICAgICAgICAgc3RybS5uZXh0X291dCA9IG91dDsKKyAgICAgICAgICAgIHJldCA9IGluZmxhdGUoJnN0cm0sIFpfTk9fRkxVU0gpOworICAgICAgICAgICAgYXNzZXJ0KHJldCAhPSBaX1NUUkVBTV9FUlJPUik7ICAvKiBzdGF0ZSBub3QgY2xvYmJlcmVkICovCisgICAgICAgICAgICBzd2l0Y2ggKHJldCkgeworICAgICAgICAgICAgY2FzZSBaX05FRURfRElDVDoKKyAgICAgICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7ICAgICAvKiBhbmQgZmFsbCB0aHJvdWdoICovCisgICAgICAgICAgICBjYXNlIFpfREFUQV9FUlJPUjoKKyAgICAgICAgICAgIGNhc2UgWl9NRU1fRVJST1I6CisgICAgICAgICAgICAgICAgKHZvaWQpaW5mbGF0ZUVuZCgmc3RybSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhdmUgPSBDSFVOSyAtIHN0cm0uYXZhaWxfb3V0OworICAgICAgICAgICAgaWYgKGZ3cml0ZShvdXQsIDEsIGhhdmUsIGRlc3QpICE9IGhhdmUgfHwgZmVycm9yKGRlc3QpKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpaW5mbGF0ZUVuZCgmc3RybSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpfRVJSTk87CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKHN0cm0uYXZhaWxfb3V0ID09IDApOworCisgICAgICAgIC8qIGRvbmUgd2hlbiBpbmZsYXRlKCkgc2F5cyBpdCdzIGRvbmUgKi8KKyAgICB9IHdoaWxlIChyZXQgIT0gWl9TVFJFQU1fRU5EKTsKKworICAgIC8qIGNsZWFuIHVwIGFuZCByZXR1cm4gKi8KKyAgICAodm9pZClpbmZsYXRlRW5kKCZzdHJtKTsKKyAgICByZXR1cm4gcmV0ID09IFpfU1RSRUFNX0VORCA/IFpfT0sgOiBaX0RBVEFfRVJST1I7Cit9CisKKy8qIHJlcG9ydCBhIHpsaWIgb3IgaS9vIGVycm9yICovCit2b2lkIHplcnIoaW50IHJldCkKK3sKKyAgICBmcHV0cygienBpcGU6ICIsIHN0ZGVycik7CisgICAgc3dpdGNoIChyZXQpIHsKKyAgICBjYXNlIFpfRVJSTk86CisgICAgICAgIGlmIChmZXJyb3Ioc3RkaW4pKQorICAgICAgICAgICAgZnB1dHMoImVycm9yIHJlYWRpbmcgc3RkaW5cbiIsIHN0ZGVycik7CisgICAgICAgIGlmIChmZXJyb3Ioc3Rkb3V0KSkKKyAgICAgICAgICAgIGZwdXRzKCJlcnJvciB3cml0aW5nIHN0ZG91dFxuIiwgc3RkZXJyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBaX1NUUkVBTV9FUlJPUjoKKyAgICAgICAgZnB1dHMoImludmFsaWQgY29tcHJlc3Npb24gbGV2ZWxcbiIsIHN0ZGVycik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWl9EQVRBX0VSUk9SOgorICAgICAgICBmcHV0cygiaW52YWxpZCBvciBpbmNvbXBsZXRlIGRlZmxhdGUgZGF0YVxuIiwgc3RkZXJyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBaX01FTV9FUlJPUjoKKyAgICAgICAgZnB1dHMoIm91dCBvZiBtZW1vcnlcbiIsIHN0ZGVycik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWl9WRVJTSU9OX0VSUk9SOgorICAgICAgICBmcHV0cygiemxpYiB2ZXJzaW9uIG1pc21hdGNoIVxuIiwgc3RkZXJyKTsKKyAgICB9Cit9CisKKy8qIGNvbXByZXNzIG9yIGRlY29tcHJlc3MgZnJvbSBzdGRpbiB0byBzdGRvdXQgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgcmV0OworCisgICAgLyogYXZvaWQgZW5kLW9mLWxpbmUgY29udmVyc2lvbnMgKi8KKyAgICBTRVRfQklOQVJZX01PREUoc3RkaW4pOworICAgIFNFVF9CSU5BUllfTU9ERShzdGRvdXQpOworCisgICAgLyogZG8gY29tcHJlc3Npb24gaWYgbm8gYXJndW1lbnRzICovCisgICAgaWYgKGFyZ2MgPT0gMSkgeworICAgICAgICByZXQgPSBkZWYoc3RkaW4sIHN0ZG91dCwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKTsKKyAgICAgICAgaWYgKHJldCAhPSBaX09LKQorICAgICAgICAgICAgemVycihyZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qIGRvIGRlY29tcHJlc3Npb24gaWYgLWQgc3BlY2lmaWVkICovCisgICAgZWxzZSBpZiAoYXJnYyA9PSAyICYmIHN0cmNtcChhcmd2WzFdLCAiLWQiKSA9PSAwKSB7CisgICAgICAgIHJldCA9IGluZihzdGRpbiwgc3Rkb3V0KTsKKyAgICAgICAgaWYgKHJldCAhPSBaX09LKQorICAgICAgICAgICAgemVycihyZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qIG90aGVyd2lzZSwgcmVwb3J0IHVzYWdlICovCisgICAgZWxzZSB7CisgICAgICAgIGZwdXRzKCJ6cGlwZSB1c2FnZTogenBpcGUgWy1kXSA8IHNvdXJjZSA+IGRlc3RcbiIsIHN0ZGVycik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2V4YW1wbGVzL3pyYW4uYyBiL3psaWIvc3JjL2V4YW1wbGVzL3pyYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzhmOWFkCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvZXhhbXBsZXMvenJhbi5jCkBAIC0wLDAgKzEsNDA5IEBACisvKiB6cmFuLmMgLS0gZXhhbXBsZSBvZiB6bGliL2d6aXAgc3RyZWFtIGluZGV4aW5nIGFuZCByYW5kb20gYWNjZXNzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMTIgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICAgVmVyc2lvbiAxLjEgIDI5IFNlcCAyMDEyICBNYXJrIEFkbGVyICovCisKKy8qIFZlcnNpb24gSGlzdG9yeToKKyAxLjAgIDI5IE1heSAyMDA1ICBGaXJzdCB2ZXJzaW9uCisgMS4xICAyOSBTZXAgMjAxMiAgRml4IG1lbW9yeSByZWFsbG9jYXRpb24gZXJyb3IKKyAqLworCisvKiBJbGx1c3RyYXRlIHRoZSB1c2Ugb2YgWl9CTE9DSywgaW5mbGF0ZVByaW1lKCksIGFuZCBpbmZsYXRlU2V0RGljdGlvbmFyeSgpCisgICBmb3IgcmFuZG9tIGFjY2VzcyBvZiBhIGNvbXByZXNzZWQgZmlsZS4gIEEgZmlsZSBjb250YWluaW5nIGEgemxpYiBvciBnemlwCisgICBzdHJlYW0gaXMgcHJvdmlkZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIFRoZSBjb21wcmVzc2VkIHN0cmVhbSBpcyBkZWNvZGVkIGluCisgICBpdHMgZW50aXJldHksIGFuZCBhbiBpbmRleCBidWlsdCB3aXRoIGFjY2VzcyBwb2ludHMgYWJvdXQgZXZlcnkgU1BBTiBieXRlcworICAgaW4gdGhlIHVuY29tcHJlc3NlZCBvdXRwdXQuICBUaGUgY29tcHJlc3NlZCBmaWxlIGlzIGxlZnQgb3BlbiwgYW5kIGNhbiB0aGVuCisgICBiZSByZWFkIHJhbmRvbWx5LCBoYXZpbmcgdG8gZGVjb21wcmVzcyBvbiB0aGUgYXZlcmFnZSBTUEFOLzIgdW5jb21wcmVzc2VkCisgICBieXRlcyBiZWZvcmUgZ2V0dGluZyB0byB0aGUgZGVzaXJlZCBibG9jayBvZiBkYXRhLgorCisgICBBbiBhY2Nlc3MgcG9pbnQgY2FuIGJlIGNyZWF0ZWQgYXQgdGhlIHN0YXJ0IG9mIGFueSBkZWZsYXRlIGJsb2NrLCBieSBzYXZpbmcKKyAgIHRoZSBzdGFydGluZyBmaWxlIG9mZnNldCBhbmQgYml0IG9mIHRoYXQgYmxvY2ssIGFuZCB0aGUgMzJLIGJ5dGVzIG9mCisgICB1bmNvbXByZXNzZWQgZGF0YSB0aGF0IHByZWNlZGUgdGhhdCBibG9jay4gIEFsc28gdGhlIHVuY29tcHJlc3NlZCBvZmZzZXQgb2YKKyAgIHRoYXQgYmxvY2sgaXMgc2F2ZWQgdG8gcHJvdmlkZSBhIHJlZmVyZWNlIGZvciBsb2NhdGluZyBhIGRlc2lyZWQgc3RhcnRpbmcKKyAgIHBvaW50IGluIHRoZSB1bmNvbXByZXNzZWQgc3RyZWFtLiAgYnVpbGRfaW5kZXgoKSB3b3JrcyBieSBkZWNvbXByZXNzaW5nIHRoZQorICAgaW5wdXQgemxpYiBvciBnemlwIHN0cmVhbSBhIGJsb2NrIGF0IGEgdGltZSwgYW5kIGF0IHRoZSBlbmQgb2YgZWFjaCBibG9jaworICAgZGVjaWRpbmcgaWYgZW5vdWdoIHVuY29tcHJlc3NlZCBkYXRhIGhhcyBnb25lIGJ5IHRvIGp1c3RpZnkgdGhlIGNyZWF0aW9uIG9mCisgICBhIG5ldyBhY2Nlc3MgcG9pbnQuICBJZiBzbywgdGhhdCBwb2ludCBpcyBzYXZlZCBpbiBhIGRhdGEgc3RydWN0dXJlIHRoYXQKKyAgIGdyb3dzIGFzIG5lZWRlZCB0byBhY2NvbW1vZGF0ZSB0aGUgcG9pbnRzLgorCisgICBUbyB1c2UgdGhlIGluZGV4LCBhbiBvZmZzZXQgaW4gdGhlIHVuY29tcHJlc3NlZCBkYXRhIGlzIHByb3ZpZGVkLCBmb3Igd2hpY2gKKyAgIHRoZSBsYXRlc3QgYWNjZWVzIHBvaW50IGF0IG9yIHByZWNlZGluZyB0aGF0IG9mZnNldCBpcyBsb2NhdGVkIGluIHRoZSBpbmRleC4KKyAgIFRoZSBpbnB1dCBmaWxlIGlzIHBvc2l0aW9uZWQgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBpbiB0aGUgaW5kZXgsIGFuZCBpZgorICAgbmVjZXNzYXJ5IHRoZSBmaXJzdCBmZXcgYml0cyBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIGlzIHJlYWQgZnJvbSB0aGUgZmlsZS4KKyAgIGluZmxhdGUgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aG9zZSBiaXRzIGFuZCB0aGUgMzJLIG9mIHVuY29tcHJlc3NlZCBkYXRhLCBhbmQKKyAgIHRoZSBkZWNvbXByZXNzaW9uIHRoZW4gcHJvY2VlZHMgdW50aWwgdGhlIGRlc2lyZWQgb2Zmc2V0IGluIHRoZSBmaWxlIGlzCisgICByZWFjaGVkLiAgVGhlbiB0aGUgZGVjb21wcmVzc2lvbiBjb250aW51ZXMgdG8gcmVhZCB0aGUgZGVzaXJlZCB1bmNvbXByZXNzZWQKKyAgIGRhdGEgZnJvbSB0aGUgZmlsZS4KKworICAgQW5vdGhlciBhcHByb2FjaCB3b3VsZCBiZSB0byBnZW5lcmF0ZSB0aGUgaW5kZXggb24gZGVtYW5kLiAgSW4gdGhhdCBjYXNlLAorICAgcmVxdWVzdHMgZm9yIHJhbmRvbSBhY2Nlc3MgcmVhZHMgZnJvbSB0aGUgY29tcHJlc3NlZCBkYXRhIHdvdWxkIHRyeSB0byB1c2UKKyAgIHRoZSBpbmRleCwgYnV0IGlmIGEgcmVhZCBmYXIgZW5vdWdoIHBhc3QgdGhlIGVuZCBvZiB0aGUgaW5kZXggaXMgcmVxdWlyZWQsCisgICB0aGVuIGZ1cnRoZXIgaW5kZXggZW50cmllcyB3b3VsZCBiZSBnZW5lcmF0ZWQgYW5kIGFkZGVkLgorCisgICBUaGVyZSBpcyBzb21lIGZhaXIgYml0IG9mIG92ZXJoZWFkIHRvIHN0YXJ0aW5nIGluZmxhdGlvbiBmb3IgdGhlIHJhbmRvbQorICAgYWNjZXNzLCBtYWlubHkgY29weWluZyB0aGUgMzJLIGJ5dGUgZGljdGlvbmFyeS4gIFNvIGlmIHNtYWxsIHBpZWNlcyBvZiB0aGUKKyAgIGZpbGUgYXJlIGJlaW5nIGFjY2Vzc2VkLCBpdCB3b3VsZCBtYWtlIHNlbnNlIHRvIGltcGxlbWVudCBhIGNhY2hlIHRvIGhvbGQKKyAgIHNvbWUgbG9va2FoZWFkIGFuZCBhdm9pZCBtYW55IGNhbGxzIHRvIGV4dHJhY3QoKSBmb3Igc21hbGwgbGVuZ3Rocy4KKworICAgQW5vdGhlciB3YXkgdG8gYnVpbGQgYW4gaW5kZXggd291bGQgYmUgdG8gdXNlIGluZmxhdGVDb3B5KCkuICBUaGF0IHdvdWxkCisgICBub3QgYmUgY29uc3RyYWluZWQgdG8gaGF2ZSBhY2Nlc3MgcG9pbnRzIGF0IGJsb2NrIGJvdW5kYXJpZXMsIGJ1dCByZXF1aXJlcworICAgbW9yZSBtZW1vcnkgcGVyIGFjY2VzcyBwb2ludCwgYW5kIGFsc28gY2Fubm90IGJlIHNhdmVkIHRvIGZpbGUgZHVlIHRvIHRoZQorICAgdXNlIG9mIHBvaW50ZXJzIGluIHRoZSBzdGF0ZS4gIFRoZSBhcHByb2FjaCBoZXJlIGFsbG93cyBmb3Igc3RvcmFnZSBvZiB0aGUKKyAgIGluZGV4IGluIGEgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJ6bGliLmgiCisKKyNkZWZpbmUgbG9jYWwgc3RhdGljCisKKyNkZWZpbmUgU1BBTiAxMDQ4NTc2TCAgICAgICAvKiBkZXNpcmVkIGRpc3RhbmNlIGJldHdlZW4gYWNjZXNzIHBvaW50cyAqLworI2RlZmluZSBXSU5TSVpFIDMyNzY4VSAgICAgIC8qIHNsaWRpbmcgd2luZG93IHNpemUgKi8KKyNkZWZpbmUgQ0hVTksgMTYzODQgICAgICAgICAvKiBmaWxlIGlucHV0IGJ1ZmZlciBzaXplICovCisKKy8qIGFjY2VzcyBwb2ludCBlbnRyeSAqLworc3RydWN0IHBvaW50IHsKKyAgICBvZmZfdCBvdXQ7ICAgICAgICAgIC8qIGNvcnJlc3BvbmRpbmcgb2Zmc2V0IGluIHVuY29tcHJlc3NlZCBkYXRhICovCisgICAgb2ZmX3QgaW47ICAgICAgICAgICAvKiBvZmZzZXQgaW4gaW5wdXQgZmlsZSBvZiBmaXJzdCBmdWxsIGJ5dGUgKi8KKyAgICBpbnQgYml0czsgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzICgxLTcpIGZyb20gYnl0ZSBhdCBpbiAtIDEsIG9yIDAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHdpbmRvd1tXSU5TSVpFXTsgIC8qIHByZWNlZGluZyAzMksgb2YgdW5jb21wcmVzc2VkIGRhdGEgKi8KK307CisKKy8qIGFjY2VzcyBwb2ludCBsaXN0ICovCitzdHJ1Y3QgYWNjZXNzIHsKKyAgICBpbnQgaGF2ZTsgICAgICAgICAgIC8qIG51bWJlciBvZiBsaXN0IGVudHJpZXMgZmlsbGVkIGluICovCisgICAgaW50IHNpemU7ICAgICAgICAgICAvKiBudW1iZXIgb2YgbGlzdCBlbnRyaWVzIGFsbG9jYXRlZCAqLworICAgIHN0cnVjdCBwb2ludCAqbGlzdDsgLyogYWxsb2NhdGVkIGxpc3QgKi8KK307CisKKy8qIERlYWxsb2NhdGUgYW4gaW5kZXggYnVpbHQgYnkgYnVpbGRfaW5kZXgoKSAqLworbG9jYWwgdm9pZCBmcmVlX2luZGV4KHN0cnVjdCBhY2Nlc3MgKmluZGV4KQoreworICAgIGlmIChpbmRleCAhPSBOVUxMKSB7CisgICAgICAgIGZyZWUoaW5kZXgtPmxpc3QpOworICAgICAgICBmcmVlKGluZGV4KTsKKyAgICB9Cit9CisKKy8qIEFkZCBhbiBlbnRyeSB0byB0aGUgYWNjZXNzIHBvaW50IGxpc3QuICBJZiBvdXQgb2YgbWVtb3J5LCBkZWFsbG9jYXRlIHRoZQorICAgZXhpc3RpbmcgbGlzdCBhbmQgcmV0dXJuIE5VTEwuICovCitsb2NhbCBzdHJ1Y3QgYWNjZXNzICphZGRwb2ludChzdHJ1Y3QgYWNjZXNzICppbmRleCwgaW50IGJpdHMsCisgICAgb2ZmX3QgaW4sIG9mZl90IG91dCwgdW5zaWduZWQgbGVmdCwgdW5zaWduZWQgY2hhciAqd2luZG93KQoreworICAgIHN0cnVjdCBwb2ludCAqbmV4dDsKKworICAgIC8qIGlmIGxpc3QgaXMgZW1wdHksIGNyZWF0ZSBpdCAoc3RhcnQgd2l0aCBlaWdodCBwb2ludHMpICovCisgICAgaWYgKGluZGV4ID09IE5VTEwpIHsKKyAgICAgICAgaW5kZXggPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhY2Nlc3MpKTsKKyAgICAgICAgaWYgKGluZGV4ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICAgICBpbmRleC0+bGlzdCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHBvaW50KSA8PCAzKTsKKyAgICAgICAgaWYgKGluZGV4LT5saXN0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZyZWUoaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZXgtPnNpemUgPSA4OworICAgICAgICBpbmRleC0+aGF2ZSA9IDA7CisgICAgfQorCisgICAgLyogaWYgbGlzdCBpcyBmdWxsLCBtYWtlIGl0IGJpZ2dlciAqLworICAgIGVsc2UgaWYgKGluZGV4LT5oYXZlID09IGluZGV4LT5zaXplKSB7CisgICAgICAgIGluZGV4LT5zaXplIDw8PSAxOworICAgICAgICBuZXh0ID0gcmVhbGxvYyhpbmRleC0+bGlzdCwgc2l6ZW9mKHN0cnVjdCBwb2ludCkgKiBpbmRleC0+c2l6ZSk7CisgICAgICAgIGlmIChuZXh0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZyZWVfaW5kZXgoaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZXgtPmxpc3QgPSBuZXh0OworICAgIH0KKworICAgIC8qIGZpbGwgaW4gZW50cnkgYW5kIGluY3JlbWVudCBob3cgbWFueSB3ZSBoYXZlICovCisgICAgbmV4dCA9IGluZGV4LT5saXN0ICsgaW5kZXgtPmhhdmU7CisgICAgbmV4dC0+Yml0cyA9IGJpdHM7CisgICAgbmV4dC0+aW4gPSBpbjsKKyAgICBuZXh0LT5vdXQgPSBvdXQ7CisgICAgaWYgKGxlZnQpCisgICAgICAgIG1lbWNweShuZXh0LT53aW5kb3csIHdpbmRvdyArIFdJTlNJWkUgLSBsZWZ0LCBsZWZ0KTsKKyAgICBpZiAobGVmdCA8IFdJTlNJWkUpCisgICAgICAgIG1lbWNweShuZXh0LT53aW5kb3cgKyBsZWZ0LCB3aW5kb3csIFdJTlNJWkUgLSBsZWZ0KTsKKyAgICBpbmRleC0+aGF2ZSsrOworCisgICAgLyogcmV0dXJuIGxpc3QsIHBvc3NpYmx5IHJlYWxsb2NhdGVkICovCisgICAgcmV0dXJuIGluZGV4OworfQorCisvKiBNYWtlIG9uZSBlbnRpcmUgcGFzcyB0aHJvdWdoIHRoZSBjb21wcmVzc2VkIHN0cmVhbSBhbmQgYnVpbGQgYW4gaW5kZXgsIHdpdGgKKyAgIGFjY2VzcyBwb2ludHMgYWJvdXQgZXZlcnkgc3BhbiBieXRlcyBvZiB1bmNvbXByZXNzZWQgb3V0cHV0IC0tIHNwYW4gaXMKKyAgIGNob3NlbiB0byBiYWxhbmNlIHRoZSBzcGVlZCBvZiByYW5kb20gYWNjZXNzIGFnYWluc3QgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMKKyAgIG9mIHRoZSBsaXN0LCBhYm91dCAzMksgYnl0ZXMgcGVyIGFjY2VzcyBwb2ludC4gIE5vdGUgdGhhdCBkYXRhIGFmdGVyIHRoZSBlbmQKKyAgIG9mIHRoZSBmaXJzdCB6bGliIG9yIGd6aXAgc3RyZWFtIGluIHRoZSBmaWxlIGlzIGlnbm9yZWQuICBidWlsZF9pbmRleCgpCisgICByZXR1cm5zIHRoZSBudW1iZXIgb2YgYWNjZXNzIHBvaW50cyBvbiBzdWNjZXNzICg+PSAxKSwgWl9NRU1fRVJST1IgZm9yIG91dAorICAgb2YgbWVtb3J5LCBaX0RBVEFfRVJST1IgZm9yIGFuIGVycm9yIGluIHRoZSBpbnB1dCBmaWxlLCBvciBaX0VSUk5PIGZvciBhCisgICBmaWxlIHJlYWQgZXJyb3IuICBPbiBzdWNjZXNzLCAqYnVpbHQgcG9pbnRzIHRvIHRoZSByZXN1bHRpbmcgaW5kZXguICovCitsb2NhbCBpbnQgYnVpbGRfaW5kZXgoRklMRSAqaW4sIG9mZl90IHNwYW4sIHN0cnVjdCBhY2Nlc3MgKipidWlsdCkKK3sKKyAgICBpbnQgcmV0OworICAgIG9mZl90IHRvdGluLCB0b3RvdXQ7ICAgICAgICAvKiBvdXIgb3duIHRvdGFsIGNvdW50ZXJzIHRvIGF2b2lkIDRHQiBsaW1pdCAqLworICAgIG9mZl90IGxhc3Q7ICAgICAgICAgICAgICAgICAvKiB0b3RvdXQgdmFsdWUgb2YgbGFzdCBhY2Nlc3MgcG9pbnQgKi8KKyAgICBzdHJ1Y3QgYWNjZXNzICppbmRleDsgICAgICAgLyogYWNjZXNzIHBvaW50cyBiZWluZyBnZW5lcmF0ZWQgKi8KKyAgICB6X3N0cmVhbSBzdHJtOworICAgIHVuc2lnbmVkIGNoYXIgaW5wdXRbQ0hVTktdOworICAgIHVuc2lnbmVkIGNoYXIgd2luZG93W1dJTlNJWkVdOworCisgICAgLyogaW5pdGlhbGl6ZSBpbmZsYXRlICovCisgICAgc3RybS56YWxsb2MgPSBaX05VTEw7CisgICAgc3RybS56ZnJlZSA9IFpfTlVMTDsKKyAgICBzdHJtLm9wYXF1ZSA9IFpfTlVMTDsKKyAgICBzdHJtLmF2YWlsX2luID0gMDsKKyAgICBzdHJtLm5leHRfaW4gPSBaX05VTEw7CisgICAgcmV0ID0gaW5mbGF0ZUluaXQyKCZzdHJtLCA0Nyk7ICAgICAgLyogYXV0b21hdGljIHpsaWIgb3IgZ3ppcCBkZWNvZGluZyAqLworICAgIGlmIChyZXQgIT0gWl9PSykKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIGluZmxhdGUgdGhlIGlucHV0LCBtYWludGFpbiBhIHNsaWRpbmcgd2luZG93LCBhbmQgYnVpbGQgYW4gaW5kZXggLS0gdGhpcworICAgICAgIGFsc28gdmFsaWRhdGVzIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSB1c2luZyB0aGUgY2hlY2sKKyAgICAgICBpbmZvcm1hdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBnemlwIG9yIHpsaWIgc3RyZWFtICovCisgICAgdG90aW4gPSB0b3RvdXQgPSBsYXN0ID0gMDsKKyAgICBpbmRleCA9IE5VTEw7ICAgICAgICAgICAgICAgLyogd2lsbCBiZSBhbGxvY2F0ZWQgYnkgZmlyc3QgYWRkcG9pbnQoKSAqLworICAgIHN0cm0uYXZhaWxfb3V0ID0gMDsKKyAgICBkbyB7CisgICAgICAgIC8qIGdldCBzb21lIGNvbXByZXNzZWQgZGF0YSBmcm9tIGlucHV0IGZpbGUgKi8KKyAgICAgICAgc3RybS5hdmFpbF9pbiA9IGZyZWFkKGlucHV0LCAxLCBDSFVOSywgaW4pOworICAgICAgICBpZiAoZmVycm9yKGluKSkgeworICAgICAgICAgICAgcmV0ID0gWl9FUlJOTzsKKyAgICAgICAgICAgIGdvdG8gYnVpbGRfaW5kZXhfZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cm0uYXZhaWxfaW4gPT0gMCkgeworICAgICAgICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SOworICAgICAgICAgICAgZ290byBidWlsZF9pbmRleF9lcnJvcjsKKyAgICAgICAgfQorICAgICAgICBzdHJtLm5leHRfaW4gPSBpbnB1dDsKKworICAgICAgICAvKiBwcm9jZXNzIGFsbCBvZiB0aGF0LCBvciB1bnRpbCBlbmQgb2Ygc3RyZWFtICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIC8qIHJlc2V0IHNsaWRpbmcgd2luZG93IGlmIG5lY2Vzc2FyeSAqLworICAgICAgICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09IDApIHsKKyAgICAgICAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IFdJTlNJWkU7CisgICAgICAgICAgICAgICAgc3RybS5uZXh0X291dCA9IHdpbmRvdzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogaW5mbGF0ZSB1bnRpbCBvdXQgb2YgaW5wdXQsIG91dHB1dCwgb3IgYXQgZW5kIG9mIGJsb2NrIC0tCisgICAgICAgICAgICAgICB1cGRhdGUgdGhlIHRvdGFsIGlucHV0IGFuZCBvdXRwdXQgY291bnRlcnMgKi8KKyAgICAgICAgICAgIHRvdGluICs9IHN0cm0uYXZhaWxfaW47CisgICAgICAgICAgICB0b3RvdXQgKz0gc3RybS5hdmFpbF9vdXQ7CisgICAgICAgICAgICByZXQgPSBpbmZsYXRlKCZzdHJtLCBaX0JMT0NLKTsgICAgICAvKiByZXR1cm4gYXQgZW5kIG9mIGJsb2NrICovCisgICAgICAgICAgICB0b3RpbiAtPSBzdHJtLmF2YWlsX2luOworICAgICAgICAgICAgdG90b3V0IC09IHN0cm0uYXZhaWxfb3V0OworICAgICAgICAgICAgaWYgKHJldCA9PSBaX05FRURfRElDVCkKKyAgICAgICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7CisgICAgICAgICAgICBpZiAocmV0ID09IFpfTUVNX0VSUk9SIHx8IHJldCA9PSBaX0RBVEFfRVJST1IpCisgICAgICAgICAgICAgICAgZ290byBidWlsZF9pbmRleF9lcnJvcjsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRU5EKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvKiBpZiBhdCBlbmQgb2YgYmxvY2ssIGNvbnNpZGVyIGFkZGluZyBhbiBpbmRleCBlbnRyeSAobm90ZSB0aGF0IGlmCisgICAgICAgICAgICAgICBkYXRhX3R5cGUgaW5kaWNhdGVzIGFuIGVuZC1vZi1ibG9jaywgdGhlbiBhbGwgb2YgdGhlCisgICAgICAgICAgICAgICB1bmNvbXByZXNzZWQgZGF0YSBmcm9tIHRoYXQgYmxvY2sgaGFzIGJlZW4gZGVsaXZlcmVkLCBhbmQgbm9uZQorICAgICAgICAgICAgICAgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBhZnRlciB0aGF0IGJsb2NrIGhhcyBiZWVuIGNvbnN1bWVkLAorICAgICAgICAgICAgICAgZXhjZXB0IGZvciB1cCB0byBzZXZlbiBiaXRzKSAtLSB0aGUgdG90b3V0ID09IDAgcHJvdmlkZXMgYW4KKyAgICAgICAgICAgICAgIGVudHJ5IHBvaW50IGFmdGVyIHRoZSB6bGliIG9yIGd6aXAgaGVhZGVyLCBhbmQgYXNzdXJlcyB0aGF0IHRoZQorICAgICAgICAgICAgICAgaW5kZXggYWx3YXlzIGhhcyBhdCBsZWFzdCBvbmUgYWNjZXNzIHBvaW50OyB3ZSBhdm9pZCBjcmVhdGluZyBhbgorICAgICAgICAgICAgICAgYWNjZXNzIHBvaW50IGFmdGVyIHRoZSBsYXN0IGJsb2NrIGJ5IGNoZWNraW5nIGJpdCA2IG9mIGRhdGFfdHlwZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoKHN0cm0uZGF0YV90eXBlICYgMTI4KSAmJiAhKHN0cm0uZGF0YV90eXBlICYgNjQpICYmCisgICAgICAgICAgICAgICAgKHRvdG91dCA9PSAwIHx8IHRvdG91dCAtIGxhc3QgPiBzcGFuKSkgeworICAgICAgICAgICAgICAgIGluZGV4ID0gYWRkcG9pbnQoaW5kZXgsIHN0cm0uZGF0YV90eXBlICYgNywgdG90aW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RvdXQsIHN0cm0uYXZhaWxfb3V0LCB3aW5kb3cpOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IFpfTUVNX0VSUk9SOworICAgICAgICAgICAgICAgICAgICBnb3RvIGJ1aWxkX2luZGV4X2Vycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsYXN0ID0gdG90b3V0OworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChzdHJtLmF2YWlsX2luICE9IDApOworICAgIH0gd2hpbGUgKHJldCAhPSBaX1NUUkVBTV9FTkQpOworCisgICAgLyogY2xlYW4gdXAgYW5kIHJldHVybiBpbmRleCAocmVsZWFzZSB1bnVzZWQgZW50cmllcyBpbiBsaXN0KSAqLworICAgICh2b2lkKWluZmxhdGVFbmQoJnN0cm0pOworICAgIGluZGV4LT5saXN0ID0gcmVhbGxvYyhpbmRleC0+bGlzdCwgc2l6ZW9mKHN0cnVjdCBwb2ludCkgKiBpbmRleC0+aGF2ZSk7CisgICAgaW5kZXgtPnNpemUgPSBpbmRleC0+aGF2ZTsKKyAgICAqYnVpbHQgPSBpbmRleDsKKyAgICByZXR1cm4gaW5kZXgtPnNpemU7CisKKyAgICAvKiByZXR1cm4gZXJyb3IgKi8KKyAgYnVpbGRfaW5kZXhfZXJyb3I6CisgICAgKHZvaWQpaW5mbGF0ZUVuZCgmc3RybSk7CisgICAgaWYgKGluZGV4ICE9IE5VTEwpCisgICAgICAgIGZyZWVfaW5kZXgoaW5kZXgpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIFVzZSB0aGUgaW5kZXggdG8gcmVhZCBsZW4gYnl0ZXMgZnJvbSBvZmZzZXQgaW50byBidWYsIHJldHVybiBieXRlcyByZWFkIG9yCisgICBuZWdhdGl2ZSBmb3IgZXJyb3IgKFpfREFUQV9FUlJPUiBvciBaX01FTV9FUlJPUikuICBJZiBkYXRhIGlzIHJlcXVlc3RlZCBwYXN0CisgICB0aGUgZW5kIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSwgdGhlbiBleHRyYWN0KCkgd2lsbCByZXR1cm4gYSB2YWx1ZSBsZXNzCisgICB0aGFuIGxlbiwgaW5kaWNhdGluZyBob3cgbXVjaCBhcyBhY3R1YWxseSByZWFkIGludG8gYnVmLiAgVGhpcyBmdW5jdGlvbgorICAgc2hvdWxkIG5vdCByZXR1cm4gYSBkYXRhIGVycm9yIHVubGVzcyB0aGUgZmlsZSB3YXMgbW9kaWZpZWQgc2luY2UgdGhlIGluZGV4CisgICB3YXMgZ2VuZXJhdGVkLiAgZXh0cmFjdCgpIG1heSBhbHNvIHJldHVybiBaX0VSUk5PIGlmIHRoZXJlIGlzIGFuIGVycm9yIG9uCisgICByZWFkaW5nIG9yIHNlZWtpbmcgdGhlIGlucHV0IGZpbGUuICovCitsb2NhbCBpbnQgZXh0cmFjdChGSUxFICppbiwgc3RydWN0IGFjY2VzcyAqaW5kZXgsIG9mZl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKyAgICBpbnQgcmV0LCBza2lwOworICAgIHpfc3RyZWFtIHN0cm07CisgICAgc3RydWN0IHBvaW50ICpoZXJlOworICAgIHVuc2lnbmVkIGNoYXIgaW5wdXRbQ0hVTktdOworICAgIHVuc2lnbmVkIGNoYXIgZGlzY2FyZFtXSU5TSVpFXTsKKworICAgIC8qIHByb2NlZWQgb25seSBpZiBzb21ldGhpbmcgcmVhc29uYWJsZSB0byBkbyAqLworICAgIGlmIChsZW4gPCAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIGZpbmQgd2hlcmUgaW4gc3RyZWFtIHRvIHN0YXJ0ICovCisgICAgaGVyZSA9IGluZGV4LT5saXN0OworICAgIHJldCA9IGluZGV4LT5oYXZlOworICAgIHdoaWxlICgtLXJldCAmJiBoZXJlWzFdLm91dCA8PSBvZmZzZXQpCisgICAgICAgIGhlcmUrKzsKKworICAgIC8qIGluaXRpYWxpemUgZmlsZSBhbmQgaW5mbGF0ZSBzdGF0ZSB0byBzdGFydCB0aGVyZSAqLworICAgIHN0cm0uemFsbG9jID0gWl9OVUxMOworICAgIHN0cm0uemZyZWUgPSBaX05VTEw7CisgICAgc3RybS5vcGFxdWUgPSBaX05VTEw7CisgICAgc3RybS5hdmFpbF9pbiA9IDA7CisgICAgc3RybS5uZXh0X2luID0gWl9OVUxMOworICAgIHJldCA9IGluZmxhdGVJbml0Migmc3RybSwgLTE1KTsgICAgICAgICAvKiByYXcgaW5mbGF0ZSAqLworICAgIGlmIChyZXQgIT0gWl9PSykKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICByZXQgPSBmc2Vla28oaW4sIGhlcmUtPmluIC0gKGhlcmUtPmJpdHMgPyAxIDogMCksIFNFRUtfU0VUKTsKKyAgICBpZiAocmV0ID09IC0xKQorICAgICAgICBnb3RvIGV4dHJhY3RfcmV0OworICAgIGlmIChoZXJlLT5iaXRzKSB7CisgICAgICAgIHJldCA9IGdldGMoaW4pOworICAgICAgICBpZiAocmV0ID09IC0xKSB7CisgICAgICAgICAgICByZXQgPSBmZXJyb3IoaW4pID8gWl9FUlJOTyA6IFpfREFUQV9FUlJPUjsKKyAgICAgICAgICAgIGdvdG8gZXh0cmFjdF9yZXQ7CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpaW5mbGF0ZVByaW1lKCZzdHJtLCBoZXJlLT5iaXRzLCByZXQgPj4gKDggLSBoZXJlLT5iaXRzKSk7CisgICAgfQorICAgICh2b2lkKWluZmxhdGVTZXREaWN0aW9uYXJ5KCZzdHJtLCBoZXJlLT53aW5kb3csIFdJTlNJWkUpOworCisgICAgLyogc2tpcCB1bmNvbXByZXNzZWQgYnl0ZXMgdW50aWwgb2Zmc2V0IHJlYWNoZWQsIHRoZW4gc2F0aXNmeSByZXF1ZXN0ICovCisgICAgb2Zmc2V0IC09IGhlcmUtPm91dDsKKyAgICBzdHJtLmF2YWlsX2luID0gMDsKKyAgICBza2lwID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2hpbGUgc2tpcHBpbmcgdG8gb2Zmc2V0ICovCisgICAgZG8geworICAgICAgICAvKiBkZWZpbmUgd2hlcmUgdG8gcHV0IHVuY29tcHJlc3NlZCBkYXRhLCBhbmQgaG93IG11Y2ggKi8KKyAgICAgICAgaWYgKG9mZnNldCA9PSAwICYmIHNraXApIHsgICAgICAgICAgLyogYXQgb2Zmc2V0IG5vdyAqLworICAgICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBsZW47CisgICAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gYnVmOworICAgICAgICAgICAgc2tpcCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBvbmx5IGRvIHRoaXMgb25jZSAqLworICAgICAgICB9CisgICAgICAgIGlmIChvZmZzZXQgPiBXSU5TSVpFKSB7ICAgICAgICAgICAgIC8qIHNraXAgV0lOU0laRSBieXRlcyAqLworICAgICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBXSU5TSVpFOworICAgICAgICAgICAgc3RybS5uZXh0X291dCA9IGRpc2NhcmQ7CisgICAgICAgICAgICBvZmZzZXQgLT0gV0lOU0laRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChvZmZzZXQgIT0gMCkgeyAgICAgICAgICAgICAvKiBsYXN0IHNraXAgKi8KKyAgICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gKHVuc2lnbmVkKW9mZnNldDsKKyAgICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSBkaXNjYXJkOworICAgICAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHVuY29tcHJlc3MgdW50aWwgYXZhaWxfb3V0IGZpbGxlZCwgb3IgZW5kIG9mIHN0cmVhbSAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoc3RybS5hdmFpbF9pbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3RybS5hdmFpbF9pbiA9IGZyZWFkKGlucHV0LCAxLCBDSFVOSywgaW4pOworICAgICAgICAgICAgICAgIGlmIChmZXJyb3IoaW4pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IFpfRVJSTk87CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXh0cmFjdF9yZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdHJtLmF2YWlsX2luID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SOworICAgICAgICAgICAgICAgICAgICBnb3RvIGV4dHJhY3RfcmV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJtLm5leHRfaW4gPSBpbnB1dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IGluZmxhdGUoJnN0cm0sIFpfTk9fRkxVU0gpOyAgICAgICAvKiBub3JtYWwgaW5mbGF0ZSAqLworICAgICAgICAgICAgaWYgKHJldCA9PSBaX05FRURfRElDVCkKKyAgICAgICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7CisgICAgICAgICAgICBpZiAocmV0ID09IFpfTUVNX0VSUk9SIHx8IHJldCA9PSBaX0RBVEFfRVJST1IpCisgICAgICAgICAgICAgICAgZ290byBleHRyYWN0X3JldDsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRU5EKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IHdoaWxlIChzdHJtLmF2YWlsX291dCAhPSAwKTsKKworICAgICAgICAvKiBpZiByZWFjaCBlbmQgb2Ygc3RyZWFtLCB0aGVuIGRvbid0IGtlZXAgdHJ5aW5nIHRvIGdldCBtb3JlICovCisgICAgICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRU5EKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogZG8gdW50aWwgb2Zmc2V0IHJlYWNoZWQgYW5kIHJlcXVlc3RlZCBkYXRhIHJlYWQsIG9yIHN0cmVhbSBlbmRzICovCisgICAgfSB3aGlsZSAoc2tpcCk7CisKKyAgICAvKiBjb21wdXRlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgcmVhZCBhZnRlciBvZmZzZXQgKi8KKyAgICByZXQgPSBza2lwID8gMCA6IGxlbiAtIHN0cm0uYXZhaWxfb3V0OworCisgICAgLyogY2xlYW4gdXAgYW5kIHJldHVybiBieXRlcyByZWFkIG9yIGVycm9yICovCisgIGV4dHJhY3RfcmV0OgorICAgICh2b2lkKWluZmxhdGVFbmQoJnN0cm0pOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIERlbW9uc3RyYXRlIHRoZSB1c2Ugb2YgYnVpbGRfaW5kZXgoKSBhbmQgZXh0cmFjdCgpIGJ5IHByb2Nlc3NpbmcgdGhlIGZpbGUKKyAgIHByb3ZpZGVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIGFuZCB0aGUgZXh0cmFjdGluZyAxNksgZnJvbSBhYm91dCAyLzNyZHMgb2YKKyAgIHRoZSB3YXkgdGhyb3VnaCB0aGUgdW5jb21wcmVzc2VkIG91dHB1dCwgYW5kIHdyaXRpbmcgdGhhdCB0byBzdGRvdXQuICovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgaW50IGxlbjsKKyAgICBvZmZfdCBvZmZzZXQ7CisgICAgRklMRSAqaW47CisgICAgc3RydWN0IGFjY2VzcyAqaW5kZXggPSBOVUxMOworICAgIHVuc2lnbmVkIGNoYXIgYnVmW0NIVU5LXTsKKworICAgIC8qIG9wZW4gaW5wdXQgZmlsZSAqLworICAgIGlmIChhcmdjICE9IDIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogenJhbiBmaWxlLmd6XG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGluID0gZm9wZW4oYXJndlsxXSwgInJiIik7CisgICAgaWYgKGluID09IE5VTEwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ6cmFuOiBjb3VsZCBub3Qgb3BlbiAlcyBmb3IgcmVhZGluZ1xuIiwgYXJndlsxXSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8qIGJ1aWxkIGluZGV4ICovCisgICAgbGVuID0gYnVpbGRfaW5kZXgoaW4sIFNQQU4sICZpbmRleCk7CisgICAgaWYgKGxlbiA8IDApIHsKKyAgICAgICAgZmNsb3NlKGluKTsKKyAgICAgICAgc3dpdGNoIChsZW4pIHsKKyAgICAgICAgY2FzZSBaX01FTV9FUlJPUjoKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAienJhbjogb3V0IG9mIG1lbW9yeVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBaX0RBVEFfRVJST1I6CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInpyYW46IGNvbXByZXNzZWQgZGF0YSBlcnJvciBpbiAlc1xuIiwgYXJndlsxXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBaX0VSUk5POgorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ6cmFuOiByZWFkIGVycm9yIG9uICVzXG4iLCBhcmd2WzFdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ6cmFuOiBlcnJvciAlZCB3aGlsZSBidWlsZGluZyBpbmRleFxuIiwgbGVuKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZnByaW50ZihzdGRlcnIsICJ6cmFuOiBidWlsdCBpbmRleCB3aXRoICVkIGFjY2VzcyBwb2ludHNcbiIsIGxlbik7CisKKyAgICAvKiB1c2UgaW5kZXggYnkgcmVhZGluZyBzb21lIGJ5dGVzIGZyb20gYW4gYXJiaXRyYXJ5IG9mZnNldCAqLworICAgIG9mZnNldCA9IChpbmRleC0+bGlzdFtpbmRleC0+aGF2ZSAtIDFdLm91dCA8PCAxKSAvIDM7CisgICAgbGVuID0gZXh0cmFjdChpbiwgaW5kZXgsIG9mZnNldCwgYnVmLCBDSFVOSyk7CisgICAgaWYgKGxlbiA8IDApCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAienJhbjogZXh0cmFjdGlvbiBmYWlsZWQ6ICVzIGVycm9yXG4iLAorICAgICAgICAgICAgICAgIGxlbiA9PSBaX01FTV9FUlJPUiA/ICJvdXQgb2YgbWVtb3J5IiA6ICJpbnB1dCBjb3JydXB0ZWQiKTsKKyAgICBlbHNlIHsKKyAgICAgICAgZndyaXRlKGJ1ZiwgMSwgbGVuLCBzdGRvdXQpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInpyYW46IGV4dHJhY3RlZCAlZCBieXRlcyBhdCAlbGx1XG4iLCBsZW4sIG9mZnNldCk7CisgICAgfQorCisgICAgLyogY2xlYW4gdXAgYW5kIGV4aXQgKi8KKyAgICBmcmVlX2luZGV4KGluZGV4KTsKKyAgICBmY2xvc2UoaW4pOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvZ3pjbG9zZS5jIGIvemxpYi9zcmMvZ3pjbG9zZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZWI5OWEKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9nemNsb3NlLmMKQEAgLTAsMCArMSwyNSBAQAorLyogZ3pjbG9zZS5jIC0tIHpsaWIgZ3pjbG9zZSgpIGZ1bmN0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMTAgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKyNpbmNsdWRlICJnemd1dHMuaCIKKworLyogZ3pjbG9zZSgpIGlzIGluIGEgc2VwYXJhdGUgZmlsZSBzbyB0aGF0IGl0IGlzIGxpbmtlZCBpbiBvbmx5IGlmIGl0IGlzIHVzZWQuCisgICBUaGF0IHdheSB0aGUgb3RoZXIgZ3pjbG9zZSBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgaW5zdGVhZCB0byBhdm9pZCBsaW5raW5nIGluCisgICB1bm5lZWRlZCBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIHJvdXRpbmVzLiAqLworaW50IFpFWFBPUlQgZ3pjbG9zZShmaWxlKQorICAgIGd6RmlsZSBmaWxlOworeworI2lmbmRlZiBOT19HWkNPTVBSRVNTCisgICAgZ3pfc3RhdGVwIHN0YXRlOworCisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworCisgICAgcmV0dXJuIHN0YXRlLT5tb2RlID09IEdaX1JFQUQgPyBnemNsb3NlX3IoZmlsZSkgOiBnemNsb3NlX3coZmlsZSk7CisjZWxzZQorICAgIHJldHVybiBnemNsb3NlX3IoZmlsZSk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2d6Z3V0cy5oIGIvemxpYi9zcmMvZ3pndXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg3NjU5ZAotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2d6Z3V0cy5oCkBAIC0wLDAgKzEsMjA5IEBACisvKiBnemd1dHMuaCAtLSB6bGliIGludGVybmFsIGhlYWRlciBkZWZpbml0aW9ucyBmb3IgZ3oqIG9wZXJhdGlvbnMKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAxMCwgMjAxMSwgMjAxMiwgMjAxMyBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworI2lmZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UKKyMgIGlmbmRlZiBfTEFSR0VGSUxFX1NPVVJDRQorIyAgICBkZWZpbmUgX0xBUkdFRklMRV9TT1VSQ0UgMQorIyAgZW5kaWYKKyMgIGlmZGVmIF9GSUxFX09GRlNFVF9CSVRTCisjICAgIHVuZGVmIF9GSUxFX09GRlNFVF9CSVRTCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0hJRERFTgorIyAgZGVmaW5lIFpMSUJfSU5URVJOQUwgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSAoImhpZGRlbiIpKSkKKyNlbHNlCisjICBkZWZpbmUgWkxJQl9JTlRFUk5BTAorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInpsaWIuaCIKKyNpZmRlZiBTVERDCisjICBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyAgaW5jbHVkZSA8bGltaXRzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorCisjaWZkZWYgX1dJTjMyCisjICBpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX1RVUkJPQ19fKSB8fCBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9XSU4zMikKKyMgIGluY2x1ZGUgPGlvLmg+CisjZW5kaWYKKworI2lmZGVmIFdJTkFQSV9GQU1JTFkKKyMgIGRlZmluZSBvcGVuIF9vcGVuCisjICBkZWZpbmUgcmVhZCBfcmVhZAorIyAgZGVmaW5lIHdyaXRlIF93cml0ZQorIyAgZGVmaW5lIGNsb3NlIF9jbG9zZQorI2VuZGlmCisKKyNpZmRlZiBOT19ERUZMQVRFICAgICAgIC8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGRlZmluaXRpb24gKi8KKyMgIGRlZmluZSBOT19HWkNPTVBSRVNTCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1REQzk5KSB8fCAoZGVmaW5lZChfX1RVUkJPQ19fKSAmJiBfX1RVUkJPQ19fID49IDB4NTUwKQorIyAgaWZuZGVmIEhBVkVfVlNOUFJJTlRGCisjICAgIGRlZmluZSBIQVZFX1ZTTlBSSU5URgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0NZR1dJTl9fKQorIyAgaWZuZGVmIEhBVkVfVlNOUFJJTlRGCisjICAgIGRlZmluZSBIQVZFX1ZTTlBSSU5URgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChNU0RPUykgJiYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIChCT1JMQU5EQyA+IDB4NDEwKQorIyAgaWZuZGVmIEhBVkVfVlNOUFJJTlRGCisjICAgIGRlZmluZSBIQVZFX1ZTTlBSSU5URgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfVlNOUFJJTlRGCisjICBpZmRlZiBNU0RPUworLyogdnNucHJpbnRmIG1heSBleGlzdCBvbiBzb21lIE1TLURPUyBjb21waWxlcnMgKERKR1BQPyksCisgICBidXQgZm9yIG5vdyB3ZSBqdXN0IGFzc3VtZSBpdCBkb2Vzbid0LiAqLworIyAgICBkZWZpbmUgTk9fdnNucHJpbnRmCisjICBlbmRpZgorIyAgaWZkZWYgX19UVVJCT0NfXworIyAgICBkZWZpbmUgTk9fdnNucHJpbnRmCisjICBlbmRpZgorIyAgaWZkZWYgV0lOMzIKKy8qIEluIFdpbjMyLCB2c25wcmludGYgaXMgYXZhaWxhYmxlIGFzIHRoZSAibm9uLUFOU0kiIF92c25wcmludGYuICovCisjICAgIGlmICFkZWZpbmVkKHZzbnByaW50ZikgJiYgIWRlZmluZWQoTk9fdnNucHJpbnRmKQorIyAgICAgIGlmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCAoIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSIDwgMTUwMCApCisjICAgICAgICAgZGVmaW5lIHZzbnByaW50ZiBfdnNucHJpbnRmCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjICBpZmRlZiBfX1NBU0MKKyMgICAgZGVmaW5lIE5PX3ZzbnByaW50ZgorIyAgZW5kaWYKKyMgIGlmZGVmIFZNUworIyAgICBkZWZpbmUgTk9fdnNucHJpbnRmCisjICBlbmRpZgorIyAgaWZkZWYgX19PUzQwMF9fCisjICAgIGRlZmluZSBOT192c25wcmludGYKKyMgIGVuZGlmCisjICBpZmRlZiBfX01WU19fCisjICAgIGRlZmluZSBOT192c25wcmludGYKKyMgIGVuZGlmCisjZW5kaWYKKworLyogdW5saWtlIHNucHJpbnRmICh3aGljaCBpcyByZXF1aXJlZCBpbiBDOTksIHlldCBzdGlsbCBub3Qgc3VwcG9ydGVkIGJ5CisgICBNaWNyb3NvZnQgbW9yZSB0aGFuIGEgZGVjYWRlIGxhdGVyISksIF9zbnByaW50ZiBkb2VzIG5vdCBndWFyYW50ZWUgbnVsbAorICAgdGVybWluYXRpb24gb2YgdGhlIHJlc3VsdCAtLSBob3dldmVyIHRoaXMgaXMgb25seSB1c2VkIGluIGd6bGliLmMgd2hlcmUKKyAgIHRoZSByZXN1bHQgaXMgYXNzdXJlZCB0byBmaXQgaW4gdGhlIHNwYWNlIHByb3ZpZGVkICovCisjaWZkZWYgX01TQ19WRVIKKyMgIGRlZmluZSBzbnByaW50ZiBfc25wcmludGYKKyNlbmRpZgorCisjaWZuZGVmIGxvY2FsCisjICBkZWZpbmUgbG9jYWwgc3RhdGljCisjZW5kaWYKKy8qIGNvbXBpbGUgd2l0aCAtRGxvY2FsIGlmIHlvdXIgZGVidWdnZXIgY2FuJ3QgZmluZCBzdGF0aWMgc3ltYm9scyAqLworCisvKiBneiogZnVuY3Rpb25zIGFsd2F5cyB1c2UgbGlicmFyeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyAqLworI2lmbmRlZiBTVERDCisgIGV4dGVybiB2b2lkcCAgbWFsbG9jIE9GKCh1SW50IHNpemUpKTsKKyAgZXh0ZXJuIHZvaWQgICBmcmVlICAgT0YoKHZvaWRwZiBwdHIpKTsKKyNlbmRpZgorCisvKiBnZXQgZXJybm8gYW5kIHN0cmVycm9yIGRlZmluaXRpb24gKi8KKyNpZiBkZWZpbmVkIFVOREVSX0NFCisjICBpbmNsdWRlIDx3aW5kb3dzLmg+CisjICBkZWZpbmUgenN0cmVycm9yKCkgZ3pfc3Ryd2luZXJyb3IoKERXT1JEKUdldExhc3RFcnJvcigpKQorI2Vsc2UKKyMgIGlmbmRlZiBOT19TVFJFUlJPUgorIyAgICBpbmNsdWRlIDxlcnJuby5oPgorIyAgICBkZWZpbmUgenN0cmVycm9yKCkgc3RyZXJyb3IoZXJybm8pCisjICBlbHNlCisjICAgIGRlZmluZSB6c3RyZXJyb3IoKSAic3RkaW8gZXJyb3IgKGNvbnN1bHQgZXJybm8pIgorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBwcm92aWRlIHByb3RvdHlwZXMgZm9yIHRoZXNlIHdoZW4gYnVpbGRpbmcgemxpYiB3aXRob3V0IExGUyAqLworI2lmICFkZWZpbmVkKF9MQVJHRUZJTEU2NF9TT1VSQ0UpIHx8IF9MRlM2NF9MQVJHRUZJTEUtMCA9PSAwCisgICAgWkVYVEVSTiBnekZpbGUgWkVYUE9SVCBnem9wZW42NCBPRigoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKKyAgICBaRVhURVJOIHpfb2ZmNjRfdCBaRVhQT1JUIGd6c2VlazY0IE9GKChnekZpbGUsIHpfb2ZmNjRfdCwgaW50KSk7CisgICAgWkVYVEVSTiB6X29mZjY0X3QgWkVYUE9SVCBnenRlbGw2NCBPRigoZ3pGaWxlKSk7CisgICAgWkVYVEVSTiB6X29mZjY0X3QgWkVYUE9SVCBnem9mZnNldDY0IE9GKChnekZpbGUpKTsKKyNlbmRpZgorCisvKiBkZWZhdWx0IG1lbUxldmVsICovCisjaWYgTUFYX01FTV9MRVZFTCA+PSA4CisjICBkZWZpbmUgREVGX01FTV9MRVZFTCA4CisjZWxzZQorIyAgZGVmaW5lIERFRl9NRU1fTEVWRUwgIE1BWF9NRU1fTEVWRUwKKyNlbmRpZgorCisvKiBkZWZhdWx0IGkvbyBidWZmZXIgc2l6ZSAtLSBkb3VibGUgdGhpcyBmb3Igb3V0cHV0IHdoZW4gcmVhZGluZyAodGhpcyBhbmQKKyAgIHR3aWNlIHRoaXMgbXVzdCBiZSBhYmxlIHRvIGZpdCBpbiBhbiB1bnNpZ25lZCB0eXBlKSAqLworI2RlZmluZSBHWkJVRlNJWkUgODE5MgorCisvKiBnemlwIG1vZGVzLCBhbHNvIHByb3ZpZGUgYSBsaXR0bGUgaW50ZWdyaXR5IGNoZWNrIG9uIHRoZSBwYXNzZWQgc3RydWN0dXJlICovCisjZGVmaW5lIEdaX05PTkUgMAorI2RlZmluZSBHWl9SRUFEIDcyNDcKKyNkZWZpbmUgR1pfV1JJVEUgMzExNTMKKyNkZWZpbmUgR1pfQVBQRU5EIDEgICAgIC8qIG1vZGUgc2V0IHRvIEdaX1dSSVRFIGFmdGVyIHRoZSBmaWxlIGlzIG9wZW5lZCAqLworCisvKiB2YWx1ZXMgZm9yIGd6X3N0YXRlIGhvdyAqLworI2RlZmluZSBMT09LIDAgICAgICAvKiBsb29rIGZvciBhIGd6aXAgaGVhZGVyICovCisjZGVmaW5lIENPUFkgMSAgICAgIC8qIGNvcHkgaW5wdXQgZGlyZWN0bHkgKi8KKyNkZWZpbmUgR1pJUCAyICAgICAgLyogZGVjb21wcmVzcyBhIGd6aXAgc3RyZWFtICovCisKKy8qIGludGVybmFsIGd6aXAgZmlsZSBzdGF0ZSBkYXRhIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICAvKiBleHBvc2VkIGNvbnRlbnRzIGZvciBnemdldGMoKSBtYWNybyAqLworICAgIHN0cnVjdCBnekZpbGVfcyB4OyAgICAgIC8qICJ4IiBmb3IgZXhwb3NlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHguaGF2ZTogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhdCB4Lm5leHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB4Lm5leHQ6IG5leHQgb3V0cHV0IGRhdGEgdG8gZGVsaXZlciBvciB3cml0ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHgucG9zOiBjdXJyZW50IHBvc2l0aW9uIGluIHVuY29tcHJlc3NlZCBkYXRhICovCisgICAgICAgIC8qIHVzZWQgZm9yIGJvdGggcmVhZGluZyBhbmQgd3JpdGluZyAqLworICAgIGludCBtb2RlOyAgICAgICAgICAgICAgIC8qIHNlZSBnemlwIG1vZGVzIGFib3ZlICovCisgICAgaW50IGZkOyAgICAgICAgICAgICAgICAgLyogZmlsZSBkZXNjcmlwdG9yICovCisgICAgY2hhciAqcGF0aDsgICAgICAgICAgICAgLyogcGF0aCBvciBmZCBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KKyAgICB1bnNpZ25lZCBzaXplOyAgICAgICAgICAvKiBidWZmZXIgc2l6ZSwgemVybyBpZiBub3QgYWxsb2NhdGVkIHlldCAqLworICAgIHVuc2lnbmVkIHdhbnQ7ICAgICAgICAgIC8qIHJlcXVlc3RlZCBidWZmZXIgc2l6ZSwgZGVmYXVsdCBpcyBHWkJVRlNJWkUgKi8KKyAgICB1bnNpZ25lZCBjaGFyICppbjsgICAgICAvKiBpbnB1dCBidWZmZXIgKi8KKyAgICB1bnNpZ25lZCBjaGFyICpvdXQ7ICAgICAvKiBvdXRwdXQgYnVmZmVyIChkb3VibGUtc2l6ZWQgd2hlbiByZWFkaW5nKSAqLworICAgIGludCBkaXJlY3Q7ICAgICAgICAgICAgIC8qIDAgaWYgcHJvY2Vzc2luZyBnemlwLCAxIGlmIHRyYW5zcGFyZW50ICovCisgICAgICAgIC8qIGp1c3QgZm9yIHJlYWRpbmcgKi8KKyAgICBpbnQgaG93OyAgICAgICAgICAgICAgICAvKiAwOiBnZXQgaGVhZGVyLCAxOiBjb3B5LCAyOiBkZWNvbXByZXNzICovCisgICAgel9vZmY2NF90IHN0YXJ0OyAgICAgICAgLyogd2hlcmUgdGhlIGd6aXAgZGF0YSBzdGFydGVkLCBmb3IgcmV3aW5kaW5nICovCisgICAgaW50IGVvZjsgICAgICAgICAgICAgICAgLyogdHJ1ZSBpZiBlbmQgb2YgaW5wdXQgZmlsZSByZWFjaGVkICovCisgICAgaW50IHBhc3Q7ICAgICAgICAgICAgICAgLyogdHJ1ZSBpZiByZWFkIHJlcXVlc3RlZCBwYXN0IGVuZCAqLworICAgICAgICAvKiBqdXN0IGZvciB3cml0aW5nICovCisgICAgaW50IGxldmVsOyAgICAgICAgICAgICAgLyogY29tcHJlc3Npb24gbGV2ZWwgKi8KKyAgICBpbnQgc3RyYXRlZ3k7ICAgICAgICAgICAvKiBjb21wcmVzc2lvbiBzdHJhdGVneSAqLworICAgICAgICAvKiBzZWVrIHJlcXVlc3QgKi8KKyAgICB6X29mZjY0X3Qgc2tpcDsgICAgICAgICAvKiBhbW91bnQgdG8gc2tpcCAoYWxyZWFkeSByZXdvdW5kIGlmIGJhY2t3YXJkcykgKi8KKyAgICBpbnQgc2VlazsgICAgICAgICAgICAgICAvKiB0cnVlIGlmIHNlZWsgcmVxdWVzdCBwZW5kaW5nICovCisgICAgICAgIC8qIGVycm9yIGluZm9ybWF0aW9uICovCisgICAgaW50IGVycjsgICAgICAgICAgICAgICAgLyogZXJyb3IgY29kZSAqLworICAgIGNoYXIgKm1zZzsgICAgICAgICAgICAgIC8qIGVycm9yIG1lc3NhZ2UgKi8KKyAgICAgICAgLyogemxpYiBpbmZsYXRlIG9yIGRlZmxhdGUgc3RyZWFtICovCisgICAgel9zdHJlYW0gc3RybTsgICAgICAgICAgLyogc3RyZWFtIHN0cnVjdHVyZSBpbi1wbGFjZSAobm90IGEgcG9pbnRlcikgKi8KK30gZ3pfc3RhdGU7Cit0eXBlZGVmIGd6X3N0YXRlIEZBUiAqZ3pfc3RhdGVwOworCisvKiBzaGFyZWQgZnVuY3Rpb25zICovCit2b2lkIFpMSUJfSU5URVJOQUwgZ3pfZXJyb3IgT0YoKGd6X3N0YXRlcCwgaW50LCBjb25zdCBjaGFyICopKTsKKyNpZiBkZWZpbmVkIFVOREVSX0NFCitjaGFyIFpMSUJfSU5URVJOQUwgKmd6X3N0cndpbmVycm9yIE9GKChEV09SRCBlcnJvcikpOworI2VuZGlmCisKKy8qIEdUX09GRih4KSwgd2hlcmUgeCBpcyBhbiB1bnNpZ25lZCB2YWx1ZSwgaXMgdHJ1ZSBpZiB4ID4gbWF4aW11bSB6X29mZjY0X3QKKyAgIHZhbHVlIC0tIG5lZWRlZCB3aGVuIGNvbXBhcmluZyB1bnNpZ25lZCB0byB6X29mZjY0X3QsIHdoaWNoIGlzIHNpZ25lZAorICAgKHBvc3NpYmxlIHpfb2ZmNjRfdCB0eXBlcyBvZmZfdCwgb2ZmNjRfdCwgYW5kIGxvbmcgYXJlIGFsbCBzaWduZWQpICovCisjaWZkZWYgSU5UX01BWAorIyAgZGVmaW5lIEdUX09GRih4KSAoc2l6ZW9mKGludCkgPT0gc2l6ZW9mKHpfb2ZmNjRfdCkgJiYgKHgpID4gSU5UX01BWCkKKyNlbHNlCit1bnNpZ25lZCBaTElCX0lOVEVSTkFMIGd6X2ludG1heCBPRigodm9pZCkpOworIyAgZGVmaW5lIEdUX09GRih4KSAoc2l6ZW9mKGludCkgPT0gc2l6ZW9mKHpfb2ZmNjRfdCkgJiYgKHgpID4gZ3pfaW50bWF4KCkpCisjZW5kaWYKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2d6bGliLmMgYi96bGliL3NyYy9nemxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZTIwMmUKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9nemxpYi5jCkBAIC0wLDAgKzEsNjM0IEBACisvKiBnemxpYi5jIC0tIHpsaWIgZnVuY3Rpb25zIGNvbW1vbiB0byByZWFkaW5nIGFuZCB3cml0aW5nIGd6aXAgZmlsZXMKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAxMCwgMjAxMSwgMjAxMiwgMjAxMyBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworI2luY2x1ZGUgImd6Z3V0cy5oIgorCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fQk9STEFORENfXykKKyMgIGRlZmluZSBMU0VFSyBfbHNlZWtpNjQKKyNlbHNlCisjaWYgZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKSAmJiBfTEZTNjRfTEFSR0VGSUxFLTAKKyMgIGRlZmluZSBMU0VFSyBsc2VlazY0CisjZWxzZQorIyAgZGVmaW5lIExTRUVLIGxzZWVrCisjZW5kaWYKKyNlbmRpZgorCisvKiBMb2NhbCBmdW5jdGlvbnMgKi8KK2xvY2FsIHZvaWQgZ3pfcmVzZXQgT0YoKGd6X3N0YXRlcCkpOworbG9jYWwgZ3pGaWxlIGd6X29wZW4gT0YoKGNvbnN0IHZvaWQgKiwgaW50LCBjb25zdCBjaGFyICopKTsKKworI2lmIGRlZmluZWQgVU5ERVJfQ0UKKworLyogTWFwIHRoZSBXaW5kb3dzIGVycm9yIG51bWJlciBpbiBFUlJPUiB0byBhIGxvY2FsZS1kZXBlbmRlbnQgZXJyb3IgbWVzc2FnZQorICAgc3RyaW5nIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0LiAgVHlwaWNhbGx5LCB0aGUgdmFsdWVzIGZvciBFUlJPUiBjb21lCisgICBmcm9tIEdldExhc3RFcnJvci4KKworICAgVGhlIHN0cmluZyBwb2ludGVkIHRvIHNoYWxsIG5vdCBiZSBtb2RpZmllZCBieSB0aGUgYXBwbGljYXRpb24sIGJ1dCBtYXkgYmUKKyAgIG92ZXJ3cml0dGVuIGJ5IGEgc3Vic2VxdWVudCBjYWxsIHRvIGd6X3N0cndpbmVycm9yCisKKyAgIFRoZSBnel9zdHJ3aW5lcnJvciBmdW5jdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGN1cnJlbnQgc2V0dGluZyBvZgorICAgR2V0TGFzdEVycm9yLiAqLworY2hhciBaTElCX0lOVEVSTkFMICpnel9zdHJ3aW5lcnJvciAoZXJyb3IpCisgICAgIERXT1JEIGVycm9yOworeworICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMDI0XTsKKworICAgIHdjaGFyX3QgKm1zZ2J1ZjsKKyAgICBEV09SRCBsYXN0ZXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgRFdPUkQgY2hhcnMgPSBGb3JtYXRNZXNzYWdlKEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNCisgICAgICAgIHwgRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSLAorICAgICAgICBOVUxMLAorICAgICAgICBlcnJvciwKKyAgICAgICAgMCwgLyogRGVmYXVsdCBsYW5ndWFnZSAqLworICAgICAgICAoTFBWT0lEKSZtc2didWYsCisgICAgICAgIDAsCisgICAgICAgIE5VTEwpOworICAgIGlmIChjaGFycyAhPSAwKSB7CisgICAgICAgIC8qIElmIHRoZXJlIGlzIGFuIFxyXG4gYXBwZW5kZWQsIHphcCBpdC4gICovCisgICAgICAgIGlmIChjaGFycyA+PSAyCisgICAgICAgICAgICAmJiBtc2didWZbY2hhcnMgLSAyXSA9PSAnXHInICYmIG1zZ2J1ZltjaGFycyAtIDFdID09ICdcbicpIHsKKyAgICAgICAgICAgIGNoYXJzIC09IDI7CisgICAgICAgICAgICBtc2didWZbY2hhcnNdID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjaGFycyA+IHNpemVvZiAoYnVmKSAtIDEpIHsKKyAgICAgICAgICAgIGNoYXJzID0gc2l6ZW9mIChidWYpIC0gMTsKKyAgICAgICAgICAgIG1zZ2J1ZltjaGFyc10gPSAwOworICAgICAgICB9CisKKyAgICAgICAgd2NzdG9tYnMoYnVmLCBtc2didWYsIGNoYXJzICsgMSk7CisgICAgICAgIExvY2FsRnJlZShtc2didWYpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3ByaW50ZihidWYsICJ1bmtub3duIHdpbjMyIGVycm9yICglbGQpIiwgZXJyb3IpOworICAgIH0KKworICAgIFNldExhc3RFcnJvcihsYXN0ZXJyKTsKKyAgICByZXR1cm4gYnVmOworfQorCisjZW5kaWYgLyogVU5ERVJfQ0UgKi8KKworLyogUmVzZXQgZ3ppcCBmaWxlIHN0YXRlICovCitsb2NhbCB2b2lkIGd6X3Jlc2V0KHN0YXRlKQorICAgIGd6X3N0YXRlcCBzdGF0ZTsKK3sKKyAgICBzdGF0ZS0+eC5oYXZlID0gMDsgICAgICAgICAgICAgIC8qIG5vIG91dHB1dCBkYXRhIGF2YWlsYWJsZSAqLworICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBHWl9SRUFEKSB7ICAgLyogZm9yIHJlYWRpbmcgLi4uICovCisgICAgICAgIHN0YXRlLT5lb2YgPSAwOyAgICAgICAgICAgICAvKiBub3QgYXQgZW5kIG9mIGZpbGUgKi8KKyAgICAgICAgc3RhdGUtPnBhc3QgPSAwOyAgICAgICAgICAgIC8qIGhhdmUgbm90IHJlYWQgcGFzdCBlbmQgeWV0ICovCisgICAgICAgIHN0YXRlLT5ob3cgPSBMT09LOyAgICAgICAgICAvKiBsb29rIGZvciBnemlwIGhlYWRlciAqLworICAgIH0KKyAgICBzdGF0ZS0+c2VlayA9IDA7ICAgICAgICAgICAgICAgIC8qIG5vIHNlZWsgcmVxdWVzdCBwZW5kaW5nICovCisgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfT0ssIE5VTEwpOyAgICAvKiBjbGVhciBlcnJvciAqLworICAgIHN0YXRlLT54LnBvcyA9IDA7ICAgICAgICAgICAgICAgLyogbm8gdW5jb21wcmVzc2VkIGRhdGEgeWV0ICovCisgICAgc3RhdGUtPnN0cm0uYXZhaWxfaW4gPSAwOyAgICAgICAvKiBubyBpbnB1dCBkYXRhIHlldCAqLworfQorCisvKiBPcGVuIGEgZ3ppcCBmaWxlIGVpdGhlciBieSBuYW1lIG9yIGZpbGUgZGVzY3JpcHRvci4gKi8KK2xvY2FsIGd6RmlsZSBnel9vcGVuKHBhdGgsIGZkLCBtb2RlKQorICAgIGNvbnN0IHZvaWQgKnBhdGg7CisgICAgaW50IGZkOworICAgIGNvbnN0IGNoYXIgKm1vZGU7Cit7CisgICAgZ3pfc3RhdGVwIHN0YXRlOworICAgIHNpemVfdCBsZW47CisgICAgaW50IG9mbGFnOworI2lmZGVmIE9fQ0xPRVhFQworICAgIGludCBjbG9leGVjID0gMDsKKyNlbmRpZgorI2lmZGVmIE9fRVhDTAorICAgIGludCBleGNsdXNpdmUgPSAwOworI2VuZGlmCisKKyAgICAvKiBjaGVjayBpbnB1dCAqLworICAgIGlmIChwYXRoID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogYWxsb2NhdGUgZ3pGaWxlIHN0cnVjdHVyZSB0byByZXR1cm4gKi8KKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApbWFsbG9jKHNpemVvZihnel9zdGF0ZSkpOworICAgIGlmIChzdGF0ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzdGF0ZS0+c2l6ZSA9IDA7ICAgICAgICAgICAgLyogbm8gYnVmZmVycyBhbGxvY2F0ZWQgeWV0ICovCisgICAgc3RhdGUtPndhbnQgPSBHWkJVRlNJWkU7ICAgIC8qIHJlcXVlc3RlZCBidWZmZXIgc2l6ZSAqLworICAgIHN0YXRlLT5tc2cgPSBOVUxMOyAgICAgICAgICAvKiBubyBlcnJvciBtZXNzYWdlIHlldCAqLworCisgICAgLyogaW50ZXJwcmV0IG1vZGUgKi8KKyAgICBzdGF0ZS0+bW9kZSA9IEdaX05PTkU7CisgICAgc3RhdGUtPmxldmVsID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OOworICAgIHN0YXRlLT5zdHJhdGVneSA9IFpfREVGQVVMVF9TVFJBVEVHWTsKKyAgICBzdGF0ZS0+ZGlyZWN0ID0gMDsKKyAgICB3aGlsZSAoKm1vZGUpIHsKKyAgICAgICAgaWYgKCptb2RlID49ICcwJyAmJiAqbW9kZSA8PSAnOScpCisgICAgICAgICAgICBzdGF0ZS0+bGV2ZWwgPSAqbW9kZSAtICcwJzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3dpdGNoICgqbW9kZSkgeworICAgICAgICAgICAgY2FzZSAncic6CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBHWl9SRUFEOworICAgICAgICAgICAgICAgIGJyZWFrOworI2lmbmRlZiBOT19HWkNPTVBSRVNTCisgICAgICAgICAgICBjYXNlICd3JzoKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEdaX1dSSVRFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnYSc6CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBHWl9BUFBFTkQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgICAgIGNhc2UgJysnOiAgICAgICAvKiBjYW4ndCByZWFkIGFuZCB3cml0ZSBhdCB0aGUgc2FtZSB0aW1lICovCisgICAgICAgICAgICAgICAgZnJlZShzdGF0ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBjYXNlICdiJzogICAgICAgLyogaWdub3JlIC0tIHdpbGwgcmVxdWVzdCBiaW5hcnkgYW55d2F5ICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgT19DTE9FWEVDCisgICAgICAgICAgICBjYXNlICdlJzoKKyAgICAgICAgICAgICAgICBjbG9leGVjID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIE9fRVhDTAorICAgICAgICAgICAgY2FzZSAneCc6CisgICAgICAgICAgICAgICAgZXhjbHVzaXZlID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICAgICAgc3RhdGUtPnN0cmF0ZWd5ID0gWl9GSUxURVJFRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgICAgIHN0YXRlLT5zdHJhdGVneSA9IFpfSFVGRk1BTl9PTkxZOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnUic6CisgICAgICAgICAgICAgICAgc3RhdGUtPnN0cmF0ZWd5ID0gWl9STEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdGJzoKKyAgICAgICAgICAgICAgICBzdGF0ZS0+c3RyYXRlZ3kgPSBaX0ZJWEVEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnVCc6CisgICAgICAgICAgICAgICAgc3RhdGUtPmRpcmVjdCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgLyogY291bGQgY29uc2lkZXIgYXMgYW4gZXJyb3IsIGJ1dCBqdXN0IGlnbm9yZSAqLworICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgbW9kZSsrOworICAgIH0KKworICAgIC8qIG11c3QgcHJvdmlkZSBhbiAiciIsICJ3Iiwgb3IgImEiICovCisgICAgaWYgKHN0YXRlLT5tb2RlID09IEdaX05PTkUpIHsKKyAgICAgICAgZnJlZShzdGF0ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIGNhbid0IGZvcmNlIHRyYW5zcGFyZW50IHJlYWQgKi8KKyAgICBpZiAoc3RhdGUtPm1vZGUgPT0gR1pfUkVBRCkgeworICAgICAgICBpZiAoc3RhdGUtPmRpcmVjdCkgeworICAgICAgICAgICAgZnJlZShzdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+ZGlyZWN0ID0gMTsgICAgICAvKiBmb3IgZW1wdHkgZmlsZSAqLworICAgIH0KKworICAgIC8qIHNhdmUgdGhlIHBhdGggbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KKyNpZmRlZiBfV0lOMzIKKyAgICBpZiAoZmQgPT0gLTIpIHsKKyAgICAgICAgbGVuID0gd2NzdG9tYnMoTlVMTCwgcGF0aCwgMCk7CisgICAgICAgIGlmIChsZW4gPT0gKHNpemVfdCktMSkKKyAgICAgICAgICAgIGxlbiA9IDA7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgICAgICBsZW4gPSBzdHJsZW4oKGNvbnN0IGNoYXIgKilwYXRoKTsKKyAgICBzdGF0ZS0+cGF0aCA9IChjaGFyICopbWFsbG9jKGxlbiArIDEpOworICAgIGlmIChzdGF0ZS0+cGF0aCA9PSBOVUxMKSB7CisgICAgICAgIGZyZWUoc3RhdGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisjaWZkZWYgX1dJTjMyCisgICAgaWYgKGZkID09IC0yKQorICAgICAgICBpZiAobGVuKQorICAgICAgICAgICAgd2NzdG9tYnMoc3RhdGUtPnBhdGgsIHBhdGgsIGxlbiArIDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqKHN0YXRlLT5wYXRoKSA9IDA7CisgICAgZWxzZQorI2VuZGlmCisjaWYgIWRlZmluZWQoTk9fc25wcmludGYpICYmICFkZWZpbmVkKE5PX3ZzbnByaW50ZikKKyAgICAgICAgc25wcmludGYoc3RhdGUtPnBhdGgsIGxlbiArIDEsICIlcyIsIChjb25zdCBjaGFyICopcGF0aCk7CisjZWxzZQorICAgICAgICBzdHJjcHkoc3RhdGUtPnBhdGgsIHBhdGgpOworI2VuZGlmCisKKyAgICAvKiBjb21wdXRlIHRoZSBmbGFncyBmb3Igb3BlbigpICovCisgICAgb2ZsYWcgPQorI2lmZGVmIE9fTEFSR0VGSUxFCisgICAgICAgIE9fTEFSR0VGSUxFIHwKKyNlbmRpZgorI2lmZGVmIE9fQklOQVJZCisgICAgICAgIE9fQklOQVJZIHwKKyNlbmRpZgorI2lmZGVmIE9fQ0xPRVhFQworICAgICAgICAoY2xvZXhlYyA/IE9fQ0xPRVhFQyA6IDApIHwKKyNlbmRpZgorICAgICAgICAoc3RhdGUtPm1vZGUgPT0gR1pfUkVBRCA/CisgICAgICAgICBPX1JET05MWSA6CisgICAgICAgICAoT19XUk9OTFkgfCBPX0NSRUFUIHwKKyNpZmRlZiBPX0VYQ0wKKyAgICAgICAgICAoZXhjbHVzaXZlID8gT19FWENMIDogMCkgfAorI2VuZGlmCisgICAgICAgICAgKHN0YXRlLT5tb2RlID09IEdaX1dSSVRFID8KKyAgICAgICAgICAgT19UUlVOQyA6CisgICAgICAgICAgIE9fQVBQRU5EKSkpOworCisgICAgLyogb3BlbiB0aGUgZmlsZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBmbGFncyAob3IganVzdCB1c2UgZmQpICovCisgICAgc3RhdGUtPmZkID0gZmQgPiAtMSA/IGZkIDogKAorI2lmZGVmIF9XSU4zMgorICAgICAgICBmZCA9PSAtMiA/IF93b3BlbihwYXRoLCBvZmxhZywgMDY2NikgOgorI2VuZGlmCisgICAgICAgIG9wZW4oKGNvbnN0IGNoYXIgKilwYXRoLCBvZmxhZywgMDY2NikpOworICAgIGlmIChzdGF0ZS0+ZmQgPT0gLTEpIHsKKyAgICAgICAgZnJlZShzdGF0ZS0+cGF0aCk7CisgICAgICAgIGZyZWUoc3RhdGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHN0YXRlLT5tb2RlID09IEdaX0FQUEVORCkKKyAgICAgICAgc3RhdGUtPm1vZGUgPSBHWl9XUklURTsgICAgICAgICAvKiBzaW1wbGlmeSBsYXRlciBjaGVja3MgKi8KKworICAgIC8qIHNhdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gZm9yIHJld2luZGluZyAob25seSBpZiByZWFkaW5nKSAqLworICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBHWl9SRUFEKSB7CisgICAgICAgIHN0YXRlLT5zdGFydCA9IExTRUVLKHN0YXRlLT5mZCwgMCwgU0VFS19DVVIpOworICAgICAgICBpZiAoc3RhdGUtPnN0YXJ0ID09IC0xKSBzdGF0ZS0+c3RhcnQgPSAwOworICAgIH0KKworICAgIC8qIGluaXRpYWxpemUgc3RyZWFtICovCisgICAgZ3pfcmVzZXQoc3RhdGUpOworCisgICAgLyogcmV0dXJuIHN0cmVhbSAqLworICAgIHJldHVybiAoZ3pGaWxlKXN0YXRlOworfQorCisvKiAtLSBzZWUgemxpYi5oIC0tICovCitnekZpbGUgWkVYUE9SVCBnem9wZW4ocGF0aCwgbW9kZSkKKyAgICBjb25zdCBjaGFyICpwYXRoOworICAgIGNvbnN0IGNoYXIgKm1vZGU7Cit7CisgICAgcmV0dXJuIGd6X29wZW4ocGF0aCwgLTEsIG1vZGUpOworfQorCisvKiAtLSBzZWUgemxpYi5oIC0tICovCitnekZpbGUgWkVYUE9SVCBnem9wZW42NChwYXRoLCBtb2RlKQorICAgIGNvbnN0IGNoYXIgKnBhdGg7CisgICAgY29uc3QgY2hhciAqbW9kZTsKK3sKKyAgICByZXR1cm4gZ3pfb3BlbihwYXRoLCAtMSwgbW9kZSk7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK2d6RmlsZSBaRVhQT1JUIGd6ZG9wZW4oZmQsIG1vZGUpCisgICAgaW50IGZkOworICAgIGNvbnN0IGNoYXIgKm1vZGU7Cit7CisgICAgY2hhciAqcGF0aDsgICAgICAgICAvKiBpZGVudGlmaWVyIGZvciBlcnJvciBtZXNzYWdlcyAqLworICAgIGd6RmlsZSBnejsKKworICAgIGlmIChmZCA9PSAtMSB8fCAocGF0aCA9IChjaGFyICopbWFsbG9jKDcgKyAzICogc2l6ZW9mKGludCkpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyNpZiAhZGVmaW5lZChOT19zbnByaW50ZikgJiYgIWRlZmluZWQoTk9fdnNucHJpbnRmKQorICAgIHNucHJpbnRmKHBhdGgsIDcgKyAzICogc2l6ZW9mKGludCksICI8ZmQ6JWQ+IiwgZmQpOyAvKiBmb3IgZGVidWdnaW5nICovCisjZWxzZQorICAgIHNwcmludGYocGF0aCwgIjxmZDolZD4iLCBmZCk7ICAgLyogZm9yIGRlYnVnZ2luZyAqLworI2VuZGlmCisgICAgZ3ogPSBnel9vcGVuKHBhdGgsIGZkLCBtb2RlKTsKKyAgICBmcmVlKHBhdGgpOworICAgIHJldHVybiBnejsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworI2lmZGVmIF9XSU4zMgorZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuX3cocGF0aCwgbW9kZSkKKyAgICBjb25zdCB3Y2hhcl90ICpwYXRoOworICAgIGNvbnN0IGNoYXIgKm1vZGU7Cit7CisgICAgcmV0dXJuIGd6X29wZW4ocGF0aCwgLTIsIG1vZGUpOworfQorI2VuZGlmCisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK2ludCBaRVhQT1JUIGd6YnVmZmVyKGZpbGUsIHNpemUpCisgICAgZ3pGaWxlIGZpbGU7CisgICAgdW5zaWduZWQgc2l6ZTsKK3sKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlIGFuZCBjaGVjayBpbnRlZ3JpdHkgKi8KKyAgICBpZiAoZmlsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7CisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgJiYgc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIG1ha2Ugc3VyZSB3ZSBoYXZlbid0IGFscmVhZHkgYWxsb2NhdGVkIG1lbW9yeSAqLworICAgIGlmIChzdGF0ZS0+c2l6ZSAhPSAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiBjaGVjayBhbmQgc2V0IHJlcXVlc3RlZCBzaXplICovCisgICAgaWYgKHNpemUgPCAyKQorICAgICAgICBzaXplID0gMjsgICAgICAgICAgICAgICAvKiBuZWVkIHR3byBieXRlcyB0byBjaGVjayBtYWdpYyBoZWFkZXIgKi8KKyAgICBzdGF0ZS0+d2FudCA9IHNpemU7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK2ludCBaRVhQT1JUIGd6cmV3aW5kKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgZ3pfc3RhdGVwIHN0YXRlOworCisgICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSAqLworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKKworICAgIC8qIGNoZWNrIHRoYXQgd2UncmUgcmVhZGluZyBhbmQgdGhhdCB0aGVyZSdzIG5vIGVycm9yICovCisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgfHwKKyAgICAgICAgICAgIChzdGF0ZS0+ZXJyICE9IFpfT0sgJiYgc3RhdGUtPmVyciAhPSBaX0JVRl9FUlJPUikpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIGJhY2sgdXAgYW5kIHN0YXJ0IG92ZXIgKi8KKyAgICBpZiAoTFNFRUsoc3RhdGUtPmZkLCBzdGF0ZS0+c3RhcnQsIFNFRUtfU0VUKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGd6X3Jlc2V0KHN0YXRlKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworel9vZmY2NF90IFpFWFBPUlQgZ3pzZWVrNjQoZmlsZSwgb2Zmc2V0LCB3aGVuY2UpCisgICAgZ3pGaWxlIGZpbGU7CisgICAgel9vZmY2NF90IG9mZnNldDsKKyAgICBpbnQgd2hlbmNlOworeworICAgIHVuc2lnbmVkIG47CisgICAgel9vZmY2NF90IHJldDsKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlIGFuZCBjaGVjayBpbnRlZ3JpdHkgKi8KKyAgICBpZiAoZmlsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7CisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgJiYgc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIGNoZWNrIHRoYXQgdGhlcmUncyBubyBlcnJvciAqLworICAgIGlmIChzdGF0ZS0+ZXJyICE9IFpfT0sgJiYgc3RhdGUtPmVyciAhPSBaX0JVRl9FUlJPUikKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogY2FuIG9ubHkgc2VlayBmcm9tIHN0YXJ0IG9yIHJlbGF0aXZlIHRvIGN1cnJlbnQgcG9zaXRpb24gKi8KKyAgICBpZiAod2hlbmNlICE9IFNFRUtfU0VUICYmIHdoZW5jZSAhPSBTRUVLX0NVUikKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogbm9ybWFsaXplIG9mZnNldCB0byBhIFNFRUtfQ1VSIHNwZWNpZmljYXRpb24gKi8KKyAgICBpZiAod2hlbmNlID09IFNFRUtfU0VUKQorICAgICAgICBvZmZzZXQgLT0gc3RhdGUtPngucG9zOworICAgIGVsc2UgaWYgKHN0YXRlLT5zZWVrKQorICAgICAgICBvZmZzZXQgKz0gc3RhdGUtPnNraXA7CisgICAgc3RhdGUtPnNlZWsgPSAwOworCisgICAgLyogaWYgd2l0aGluIHJhdyBhcmVhIHdoaWxlIHJlYWRpbmcsIGp1c3QgZ28gdGhlcmUgKi8KKyAgICBpZiAoc3RhdGUtPm1vZGUgPT0gR1pfUkVBRCAmJiBzdGF0ZS0+aG93ID09IENPUFkgJiYKKyAgICAgICAgICAgIHN0YXRlLT54LnBvcyArIG9mZnNldCA+PSAwKSB7CisgICAgICAgIHJldCA9IExTRUVLKHN0YXRlLT5mZCwgb2Zmc2V0IC0gc3RhdGUtPnguaGF2ZSwgU0VFS19DVVIpOworICAgICAgICBpZiAocmV0ID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBzdGF0ZS0+eC5oYXZlID0gMDsKKyAgICAgICAgc3RhdGUtPmVvZiA9IDA7CisgICAgICAgIHN0YXRlLT5wYXN0ID0gMDsKKyAgICAgICAgc3RhdGUtPnNlZWsgPSAwOworICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9PSywgTlVMTCk7CisgICAgICAgIHN0YXRlLT5zdHJtLmF2YWlsX2luID0gMDsKKyAgICAgICAgc3RhdGUtPngucG9zICs9IG9mZnNldDsKKyAgICAgICAgcmV0dXJuIHN0YXRlLT54LnBvczsKKyAgICB9CisKKyAgICAvKiBjYWxjdWxhdGUgc2tpcCBhbW91bnQsIHJld2luZGluZyBpZiBuZWVkZWQgZm9yIGJhY2sgc2VlayB3aGVuIHJlYWRpbmcgKi8KKyAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgICBpZiAoc3RhdGUtPm1vZGUgIT0gR1pfUkVBRCkgICAgICAgICAvKiB3cml0aW5nIC0tIGNhbid0IGdvIGJhY2t3YXJkcyAqLworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBvZmZzZXQgKz0gc3RhdGUtPngucG9zOworICAgICAgICBpZiAob2Zmc2V0IDwgMCkgICAgICAgICAgICAgICAgICAgICAvKiBiZWZvcmUgc3RhcnQgb2YgZmlsZSEgKi8KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGd6cmV3aW5kKGZpbGUpID09IC0xKSAgICAgICAgICAgLyogcmV3aW5kLCB0aGVuIHNraXAgdG8gb2Zmc2V0ICovCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogaWYgcmVhZGluZywgc2tpcCB3aGF0J3MgaW4gb3V0cHV0IGJ1ZmZlciAob25lIGxlc3MgZ3pnZXRjKCkgY2hlY2spICovCisgICAgaWYgKHN0YXRlLT5tb2RlID09IEdaX1JFQUQpIHsKKyAgICAgICAgbiA9IEdUX09GRihzdGF0ZS0+eC5oYXZlKSB8fCAoel9vZmY2NF90KXN0YXRlLT54LmhhdmUgPiBvZmZzZXQgPworICAgICAgICAgICAgKHVuc2lnbmVkKW9mZnNldCA6IHN0YXRlLT54LmhhdmU7CisgICAgICAgIHN0YXRlLT54LmhhdmUgLT0gbjsKKyAgICAgICAgc3RhdGUtPngubmV4dCArPSBuOworICAgICAgICBzdGF0ZS0+eC5wb3MgKz0gbjsKKyAgICAgICAgb2Zmc2V0IC09IG47CisgICAgfQorCisgICAgLyogcmVxdWVzdCBza2lwIChpZiBub3QgemVybykgKi8KKyAgICBpZiAob2Zmc2V0KSB7CisgICAgICAgIHN0YXRlLT5zZWVrID0gMTsKKyAgICAgICAgc3RhdGUtPnNraXAgPSBvZmZzZXQ7CisgICAgfQorICAgIHJldHVybiBzdGF0ZS0+eC5wb3MgKyBvZmZzZXQ7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK3pfb2ZmX3QgWkVYUE9SVCBnenNlZWsoZmlsZSwgb2Zmc2V0LCB3aGVuY2UpCisgICAgZ3pGaWxlIGZpbGU7CisgICAgel9vZmZfdCBvZmZzZXQ7CisgICAgaW50IHdoZW5jZTsKK3sKKyAgICB6X29mZjY0X3QgcmV0OworCisgICAgcmV0ID0gZ3pzZWVrNjQoZmlsZSwgKHpfb2ZmNjRfdClvZmZzZXQsIHdoZW5jZSk7CisgICAgcmV0dXJuIHJldCA9PSAoel9vZmZfdClyZXQgPyAoel9vZmZfdClyZXQgOiAtMTsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworel9vZmY2NF90IFpFWFBPUlQgZ3p0ZWxsNjQoZmlsZSkKKyAgICBnekZpbGUgZmlsZTsKK3sKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlIGFuZCBjaGVjayBpbnRlZ3JpdHkgKi8KKyAgICBpZiAoZmlsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7CisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgJiYgc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIHJldHVybiBwb3NpdGlvbiAqLworICAgIHJldHVybiBzdGF0ZS0+eC5wb3MgKyAoc3RhdGUtPnNlZWsgPyBzdGF0ZS0+c2tpcCA6IDApOworfQorCisvKiAtLSBzZWUgemxpYi5oIC0tICovCit6X29mZl90IFpFWFBPUlQgZ3p0ZWxsKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgel9vZmY2NF90IHJldDsKKworICAgIHJldCA9IGd6dGVsbDY0KGZpbGUpOworICAgIHJldHVybiByZXQgPT0gKHpfb2ZmX3QpcmV0ID8gKHpfb2ZmX3QpcmV0IDogLTE7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK3pfb2ZmNjRfdCBaRVhQT1JUIGd6b2Zmc2V0NjQoZmlsZSkKKyAgICBnekZpbGUgZmlsZTsKK3sKKyAgICB6X29mZjY0X3Qgb2Zmc2V0OworICAgIGd6X3N0YXRlcCBzdGF0ZTsKKworICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgYW5kIGNoZWNrIGludGVncml0eSAqLworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKKyAgICBpZiAoc3RhdGUtPm1vZGUgIT0gR1pfUkVBRCAmJiBzdGF0ZS0+bW9kZSAhPSBHWl9XUklURSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogY29tcHV0ZSBhbmQgcmV0dXJuIGVmZmVjdGl2ZSBvZmZzZXQgaW4gZmlsZSAqLworICAgIG9mZnNldCA9IExTRUVLKHN0YXRlLT5mZCwgMCwgU0VFS19DVVIpOworICAgIGlmIChvZmZzZXQgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoc3RhdGUtPm1vZGUgPT0gR1pfUkVBRCkgICAgICAgICAgICAgLyogcmVhZGluZyAqLworICAgICAgICBvZmZzZXQgLT0gc3RhdGUtPnN0cm0uYXZhaWxfaW47ICAgICAvKiBkb24ndCBjb3VudCBidWZmZXJlZCBpbnB1dCAqLworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK3pfb2ZmX3QgWkVYUE9SVCBnem9mZnNldChmaWxlKQorICAgIGd6RmlsZSBmaWxlOworeworICAgIHpfb2ZmNjRfdCByZXQ7CisKKyAgICByZXQgPSBnem9mZnNldDY0KGZpbGUpOworICAgIHJldHVybiByZXQgPT0gKHpfb2ZmX3QpcmV0ID8gKHpfb2ZmX3QpcmV0IDogLTE7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK2ludCBaRVhQT1JUIGd6ZW9mKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgZ3pfc3RhdGVwIHN0YXRlOworCisgICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSBhbmQgY2hlY2sgaW50ZWdyaXR5ICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7CisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgJiYgc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogcmV0dXJuIGVuZC1vZi1maWxlIHN0YXRlICovCisgICAgcmV0dXJuIHN0YXRlLT5tb2RlID09IEdaX1JFQUQgPyBzdGF0ZS0+cGFzdCA6IDA7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK2NvbnN0IGNoYXIgKiBaRVhQT1JUIGd6ZXJyb3IoZmlsZSwgZXJybnVtKQorICAgIGd6RmlsZSBmaWxlOworICAgIGludCAqZXJybnVtOworeworICAgIGd6X3N0YXRlcCBzdGF0ZTsKKworICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgYW5kIGNoZWNrIGludGVncml0eSAqLworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9SRUFEICYmIHN0YXRlLT5tb2RlICE9IEdaX1dSSVRFKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIHJldHVybiBlcnJvciBpbmZvcm1hdGlvbiAqLworICAgIGlmIChlcnJudW0gIT0gTlVMTCkKKyAgICAgICAgKmVycm51bSA9IHN0YXRlLT5lcnI7CisgICAgcmV0dXJuIHN0YXRlLT5lcnIgPT0gWl9NRU1fRVJST1IgPyAib3V0IG9mIG1lbW9yeSIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRlLT5tc2cgPT0gTlVMTCA/ICIiIDogc3RhdGUtPm1zZyk7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK3ZvaWQgWkVYUE9SVCBnemNsZWFyZXJyKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgZ3pfc3RhdGVwIHN0YXRlOworCisgICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSBhbmQgY2hlY2sgaW50ZWdyaXR5ICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9SRUFEICYmIHN0YXRlLT5tb2RlICE9IEdaX1dSSVRFKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBjbGVhciBlcnJvciBhbmQgZW5kLW9mLWZpbGUgKi8KKyAgICBpZiAoc3RhdGUtPm1vZGUgPT0gR1pfUkVBRCkgeworICAgICAgICBzdGF0ZS0+ZW9mID0gMDsKKyAgICAgICAgc3RhdGUtPnBhc3QgPSAwOworICAgIH0KKyAgICBnel9lcnJvcihzdGF0ZSwgWl9PSywgTlVMTCk7Cit9CisKKy8qIENyZWF0ZSBhbiBlcnJvciBtZXNzYWdlIGluIGFsbG9jYXRlZCBtZW1vcnkgYW5kIHNldCBzdGF0ZS0+ZXJyIGFuZAorICAgc3RhdGUtPm1zZyBhY2NvcmRpbmdseS4gIEZyZWUgYW55IHByZXZpb3VzIGVycm9yIG1lc3NhZ2UgYWxyZWFkeSB0aGVyZS4gIERvCisgICBub3QgdHJ5IHRvIGZyZWUgb3IgYWxsb2NhdGUgc3BhY2UgaWYgdGhlIGVycm9yIGlzIFpfTUVNX0VSUk9SIChvdXQgb2YKKyAgIG1lbW9yeSkuICBTaW1wbHkgc2F2ZSB0aGUgZXJyb3IgbWVzc2FnZSBhcyBhIHN0YXRpYyBzdHJpbmcuICBJZiB0aGVyZSBpcyBhbgorICAgYWxsb2NhdGlvbiBmYWlsdXJlIGNvbnN0cnVjdGluZyB0aGUgZXJyb3IgbWVzc2FnZSwgdGhlbiBjb252ZXJ0IHRoZSBlcnJvciB0bworICAgb3V0IG9mIG1lbW9yeS4gKi8KK3ZvaWQgWkxJQl9JTlRFUk5BTCBnel9lcnJvcihzdGF0ZSwgZXJyLCBtc2cpCisgICAgZ3pfc3RhdGVwIHN0YXRlOworICAgIGludCBlcnI7CisgICAgY29uc3QgY2hhciAqbXNnOworeworICAgIC8qIGZyZWUgcHJldmlvdXNseSBhbGxvY2F0ZWQgbWVzc2FnZSBhbmQgY2xlYXIgKi8KKyAgICBpZiAoc3RhdGUtPm1zZyAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzdGF0ZS0+ZXJyICE9IFpfTUVNX0VSUk9SKQorICAgICAgICAgICAgZnJlZShzdGF0ZS0+bXNnKTsKKyAgICAgICAgc3RhdGUtPm1zZyA9IE5VTEw7CisgICAgfQorCisgICAgLyogaWYgZmF0YWwsIHNldCBzdGF0ZS0+eC5oYXZlIHRvIDAgc28gdGhhdCB0aGUgZ3pnZXRjKCkgbWFjcm8gZmFpbHMgKi8KKyAgICBpZiAoZXJyICE9IFpfT0sgJiYgZXJyICE9IFpfQlVGX0VSUk9SKQorICAgICAgICBzdGF0ZS0+eC5oYXZlID0gMDsKKworICAgIC8qIHNldCBlcnJvciBjb2RlLCBhbmQgaWYgbm8gbWVzc2FnZSwgdGhlbiBkb25lICovCisgICAgc3RhdGUtPmVyciA9IGVycjsKKyAgICBpZiAobXNnID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIGZvciBhbiBvdXQgb2YgbWVtb3J5IGVycm9yLCByZXR1cm4gbGl0ZXJhbCBzdHJpbmcgd2hlbiByZXF1ZXN0ZWQgKi8KKyAgICBpZiAoZXJyID09IFpfTUVNX0VSUk9SKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBjb25zdHJ1Y3QgZXJyb3IgbWVzc2FnZSB3aXRoIHBhdGggKi8KKyAgICBpZiAoKHN0YXRlLT5tc2cgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4oc3RhdGUtPnBhdGgpICsgc3RybGVuKG1zZykgKyAzKSkgPT0KKyAgICAgICAgICAgIE5VTEwpIHsKKyAgICAgICAgc3RhdGUtPmVyciA9IFpfTUVNX0VSUk9SOworICAgICAgICByZXR1cm47CisgICAgfQorI2lmICFkZWZpbmVkKE5PX3NucHJpbnRmKSAmJiAhZGVmaW5lZChOT192c25wcmludGYpCisgICAgc25wcmludGYoc3RhdGUtPm1zZywgc3RybGVuKHN0YXRlLT5wYXRoKSArIHN0cmxlbihtc2cpICsgMywKKyAgICAgICAgICAgICAiJXMlcyVzIiwgc3RhdGUtPnBhdGgsICI6ICIsIG1zZyk7CisjZWxzZQorICAgIHN0cmNweShzdGF0ZS0+bXNnLCBzdGF0ZS0+cGF0aCk7CisgICAgc3RyY2F0KHN0YXRlLT5tc2csICI6ICIpOworICAgIHN0cmNhdChzdGF0ZS0+bXNnLCBtc2cpOworI2VuZGlmCisgICAgcmV0dXJuOworfQorCisjaWZuZGVmIElOVF9NQVgKKy8qIHBvcnRhYmx5IHJldHVybiBtYXhpbXVtIHZhbHVlIGZvciBhbiBpbnQgKHdoZW4gbGltaXRzLmggcHJlc3VtZWQgbm90CisgICBhdmFpbGFibGUpIC0tIHdlIG5lZWQgdG8gZG8gdGhpcyB0byBjb3ZlciBjYXNlcyB3aGVyZSAyJ3MgY29tcGxlbWVudCBub3QKKyAgIHVzZWQsIHNpbmNlIEMgc3RhbmRhcmQgcGVybWl0cyAxJ3MgY29tcGxlbWVudCBhbmQgc2lnbi1iaXQgcmVwcmVzZW50YXRpb25zLAorICAgb3RoZXJ3aXNlIHdlIGNvdWxkIGp1c3QgdXNlICgodW5zaWduZWQpLTEpID4+IDEgKi8KK3Vuc2lnbmVkIFpMSUJfSU5URVJOQUwgZ3pfaW50bWF4KCkKK3sKKyAgICB1bnNpZ25lZCBwLCBxOworCisgICAgcCA9IDE7CisgICAgZG8geworICAgICAgICBxID0gcDsKKyAgICAgICAgcCA8PD0gMTsKKyAgICAgICAgcCsrOworICAgIH0gd2hpbGUgKHAgPiBxKTsKKyAgICByZXR1cm4gcSA+PiAxOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS96bGliL3NyYy9nenJlYWQuYyBiL3psaWIvc3JjL2d6cmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNDUzOGUKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9nenJlYWQuYwpAQCAtMCwwICsxLDU5NCBAQAorLyogZ3pyZWFkLmMgLS0gemxpYiBmdW5jdGlvbnMgZm9yIHJlYWRpbmcgZ3ppcCBmaWxlcworICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDEwLCAyMDExLCAyMDEyLCAyMDEzIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisjaW5jbHVkZSAiZ3pndXRzLmgiCisKKy8qIExvY2FsIGZ1bmN0aW9ucyAqLworbG9jYWwgaW50IGd6X2xvYWQgT0YoKGd6X3N0YXRlcCwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCwgdW5zaWduZWQgKikpOworbG9jYWwgaW50IGd6X2F2YWlsIE9GKChnel9zdGF0ZXApKTsKK2xvY2FsIGludCBnel9sb29rIE9GKChnel9zdGF0ZXApKTsKK2xvY2FsIGludCBnel9kZWNvbXAgT0YoKGd6X3N0YXRlcCkpOworbG9jYWwgaW50IGd6X2ZldGNoIE9GKChnel9zdGF0ZXApKTsKK2xvY2FsIGludCBnel9za2lwIE9GKChnel9zdGF0ZXAsIHpfb2ZmNjRfdCkpOworCisvKiBVc2UgcmVhZCgpIHRvIGxvYWQgYSBidWZmZXIgLS0gcmV0dXJuIC0xIG9uIGVycm9yLCBvdGhlcndpc2UgMC4gIFJlYWQgZnJvbQorICAgc3RhdGUtPmZkLCBhbmQgdXBkYXRlIHN0YXRlLT5lb2YsIHN0YXRlLT5lcnIsIGFuZCBzdGF0ZS0+bXNnIGFzIGFwcHJvcHJpYXRlLgorICAgVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBsb29wIG9uIHJlYWQoKSwgc2luY2UgcmVhZCgpIGlzIG5vdCBndWFyYW50ZWVkIHRvCisgICByZWFkIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWVzdGVkLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgZGVzY3JpcHRvci4gKi8KK2xvY2FsIGludCBnel9sb2FkKHN0YXRlLCBidWYsIGxlbiwgaGF2ZSkKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisgICAgdW5zaWduZWQgY2hhciAqYnVmOworICAgIHVuc2lnbmVkIGxlbjsKKyAgICB1bnNpZ25lZCAqaGF2ZTsKK3sKKyAgICBpbnQgcmV0OworCisgICAgKmhhdmUgPSAwOworICAgIGRvIHsKKyAgICAgICAgcmV0ID0gcmVhZChzdGF0ZS0+ZmQsIGJ1ZiArICpoYXZlLCBsZW4gLSAqaGF2ZSk7CisgICAgICAgIGlmIChyZXQgPD0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAqaGF2ZSArPSByZXQ7CisgICAgfSB3aGlsZSAoKmhhdmUgPCBsZW4pOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX0VSUk5PLCB6c3RyZXJyb3IoKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHJldCA9PSAwKQorICAgICAgICBzdGF0ZS0+ZW9mID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworLyogTG9hZCB1cCBpbnB1dCBidWZmZXIgYW5kIHNldCBlb2YgZmxhZyBpZiBsYXN0IGRhdGEgbG9hZGVkIC0tIHJldHVybiAtMSBvbgorICAgZXJyb3IsIDAgb3RoZXJ3aXNlLiAgTm90ZSB0aGF0IHRoZSBlb2YgZmxhZyBpcyBzZXQgd2hlbiB0aGUgZW5kIG9mIHRoZSBpbnB1dAorICAgZmlsZSBpcyByZWFjaGVkLCBldmVuIHRob3VnaCB0aGVyZSBtYXkgYmUgdW51c2VkIGRhdGEgaW4gdGhlIGJ1ZmZlci4gIE9uY2UKKyAgIHRoYXQgZGF0YSBoYXMgYmVlbiB1c2VkLCBubyBtb3JlIGF0dGVtcHRzIHdpbGwgYmUgbWFkZSB0byByZWFkIHRoZSBmaWxlLgorICAgSWYgc3RybS0+YXZhaWxfaW4gIT0gMCwgdGhlbiB0aGUgY3VycmVudCBkYXRhIGlzIG1vdmVkIHRvIHRoZSBiZWdpbm5pbmcgb2YKKyAgIHRoZSBpbnB1dCBidWZmZXIsIGFuZCB0aGVuIHRoZSByZW1haW5kZXIgb2YgdGhlIGJ1ZmZlciBpcyBsb2FkZWQgd2l0aCB0aGUKKyAgIGF2YWlsYWJsZSBkYXRhIGZyb20gdGhlIGlucHV0IGZpbGUuICovCitsb2NhbCBpbnQgZ3pfYXZhaWwoc3RhdGUpCisgICAgZ3pfc3RhdGVwIHN0YXRlOworeworICAgIHVuc2lnbmVkIGdvdDsKKyAgICB6X3N0cmVhbXAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOworCisgICAgaWYgKHN0YXRlLT5lcnIgIT0gWl9PSyAmJiBzdGF0ZS0+ZXJyICE9IFpfQlVGX0VSUk9SKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKHN0YXRlLT5lb2YgPT0gMCkgeworICAgICAgICBpZiAoc3RybS0+YXZhaWxfaW4pIHsgICAgICAgLyogY29weSB3aGF0J3MgdGhlcmUgdG8gdGhlIHN0YXJ0ICovCisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwID0gc3RhdGUtPmluOworICAgICAgICAgICAgdW5zaWduZWQgY29uc3QgY2hhciAqcSA9IHN0cm0tPm5leHRfaW47CisgICAgICAgICAgICB1bnNpZ25lZCBuID0gc3RybS0+YXZhaWxfaW47CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgKnArKyA9ICpxKys7CisgICAgICAgICAgICB9IHdoaWxlICgtLW4pOworICAgICAgICB9CisgICAgICAgIGlmIChnel9sb2FkKHN0YXRlLCBzdGF0ZS0+aW4gKyBzdHJtLT5hdmFpbF9pbiwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPnNpemUgLSBzdHJtLT5hdmFpbF9pbiwgJmdvdCkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHN0cm0tPmF2YWlsX2luICs9IGdvdDsKKyAgICAgICAgc3RybS0+bmV4dF9pbiA9IHN0YXRlLT5pbjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIExvb2sgZm9yIGd6aXAgaGVhZGVyLCBzZXQgdXAgZm9yIGluZmxhdGUgb3IgY29weS4gIHN0YXRlLT54LmhhdmUgbXVzdCBiZSAwLgorICAgSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSBpbiwgYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiAgc3RhdGUtPmhvdyB3aWxsIGJlCisgICBsZWZ0IHVuY2hhbmdlZCBpZiB0aGVyZSBpcyBubyBtb3JlIGlucHV0IGRhdGEgYXZhaWxhYmxlLCB3aWxsIGJlIHNldCB0byBDT1BZCisgICBpZiB0aGVyZSBpcyBubyBnemlwIGhlYWRlciBhbmQgZGlyZWN0IGNvcHlpbmcgd2lsbCBiZSBwZXJmb3JtZWQsIG9yIGl0IHdpbGwKKyAgIGJlIHNldCB0byBHWklQIGZvciBkZWNvbXByZXNzaW9uLiAgSWYgZGlyZWN0IGNvcHlpbmcsIHRoZW4gbGVmdG92ZXIgaW5wdXQKKyAgIGRhdGEgZnJvbSB0aGUgaW5wdXQgYnVmZmVyIHdpbGwgYmUgY29waWVkIHRvIHRoZSBvdXRwdXQgYnVmZmVyLiAgSW4gdGhhdAorICAgY2FzZSwgYWxsIGZ1cnRoZXIgZmlsZSByZWFkcyB3aWxsIGJlIGRpcmVjdGx5IHRvIGVpdGhlciB0aGUgb3V0cHV0IGJ1ZmZlciBvcgorICAgYSB1c2VyIGJ1ZmZlci4gIElmIGRlY29tcHJlc3NpbmcsIHRoZSBpbmZsYXRlIHN0YXRlIHdpbGwgYmUgaW5pdGlhbGl6ZWQuCisgICBnel9sb29rKCkgd2lsbCByZXR1cm4gMCBvbiBzdWNjZXNzIG9yIC0xIG9uIGZhaWx1cmUuICovCitsb2NhbCBpbnQgZ3pfbG9vayhzdGF0ZSkKKyAgICBnel9zdGF0ZXAgc3RhdGU7Cit7CisgICAgel9zdHJlYW1wIHN0cm0gPSAmKHN0YXRlLT5zdHJtKTsKKworICAgIC8qIGFsbG9jYXRlIHJlYWQgYnVmZmVycyBhbmQgaW5mbGF0ZSBtZW1vcnkgKi8KKyAgICBpZiAoc3RhdGUtPnNpemUgPT0gMCkgeworICAgICAgICAvKiBhbGxvY2F0ZSBidWZmZXJzICovCisgICAgICAgIHN0YXRlLT5pbiA9ICh1bnNpZ25lZCBjaGFyICopbWFsbG9jKHN0YXRlLT53YW50KTsKKyAgICAgICAgc3RhdGUtPm91dCA9ICh1bnNpZ25lZCBjaGFyICopbWFsbG9jKHN0YXRlLT53YW50IDw8IDEpOworICAgICAgICBpZiAoc3RhdGUtPmluID09IE5VTEwgfHwgc3RhdGUtPm91dCA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoc3RhdGUtPm91dCAhPSBOVUxMKQorICAgICAgICAgICAgICAgIGZyZWUoc3RhdGUtPm91dCk7CisgICAgICAgICAgICBpZiAoc3RhdGUtPmluICE9IE5VTEwpCisgICAgICAgICAgICAgICAgZnJlZShzdGF0ZS0+aW4pOworICAgICAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfTUVNX0VSUk9SLCAib3V0IG9mIG1lbW9yeSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zaXplID0gc3RhdGUtPndhbnQ7CisKKyAgICAgICAgLyogYWxsb2NhdGUgaW5mbGF0ZSBtZW1vcnkgKi8KKyAgICAgICAgc3RhdGUtPnN0cm0uemFsbG9jID0gWl9OVUxMOworICAgICAgICBzdGF0ZS0+c3RybS56ZnJlZSA9IFpfTlVMTDsKKyAgICAgICAgc3RhdGUtPnN0cm0ub3BhcXVlID0gWl9OVUxMOworICAgICAgICBzdGF0ZS0+c3RybS5hdmFpbF9pbiA9IDA7CisgICAgICAgIHN0YXRlLT5zdHJtLm5leHRfaW4gPSBaX05VTEw7CisgICAgICAgIGlmIChpbmZsYXRlSW5pdDIoJihzdGF0ZS0+c3RybSksIDE1ICsgMTYpICE9IFpfT0spIHsgICAgLyogZ3VuemlwICovCisgICAgICAgICAgICBmcmVlKHN0YXRlLT5vdXQpOworICAgICAgICAgICAgZnJlZShzdGF0ZS0+aW4pOworICAgICAgICAgICAgc3RhdGUtPnNpemUgPSAwOworICAgICAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfTUVNX0VSUk9SLCAib3V0IG9mIG1lbW9yeSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZ2V0IGF0IGxlYXN0IHRoZSBtYWdpYyBieXRlcyBpbiB0aGUgaW5wdXQgYnVmZmVyICovCisgICAgaWYgKHN0cm0tPmF2YWlsX2luIDwgMikgeworICAgICAgICBpZiAoZ3pfYXZhaWwoc3RhdGUpID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoc3RybS0+YXZhaWxfaW4gPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIGxvb2sgZm9yIGd6aXAgbWFnaWMgYnl0ZXMgLS0gaWYgdGhlcmUsIGRvIGd6aXAgZGVjb2RpbmcgKG5vdGU6IHRoZXJlIGlzCisgICAgICAgYSBsb2dpY2FsIGRpbGVtbWEgaGVyZSB3aGVuIGNvbnNpZGVyaW5nIHRoZSBjYXNlIG9mIGEgcGFydGlhbGx5IHdyaXR0ZW4KKyAgICAgICBnemlwIGZpbGUsIHRvIHdpdCwgaWYgYSBzaW5nbGUgMzEgYnl0ZSBpcyB3cml0dGVuLCB0aGVuIHdlIGNhbm5vdCB0ZWxsCisgICAgICAgd2hldGhlciB0aGlzIGlzIGEgc2luZ2xlLWJ5dGUgZmlsZSwgb3IganVzdCBhIHBhcnRpYWxseSB3cml0dGVuIGd6aXAKKyAgICAgICBmaWxlIC0tIGZvciBoZXJlIHdlIGFzc3VtZSB0aGF0IGlmIGEgZ3ppcCBmaWxlIGlzIGJlaW5nIHdyaXR0ZW4sIHRoZW4KKyAgICAgICB0aGUgaGVhZGVyIHdpbGwgYmUgd3JpdHRlbiBpbiBhIHNpbmdsZSBvcGVyYXRpb24sIHNvIHRoYXQgcmVhZGluZyBhCisgICAgICAgc2luZ2xlIGJ5dGUgaXMgc3VmZmljaWVudCBpbmRpY2F0aW9uIHRoYXQgaXQgaXMgbm90IGEgZ3ppcCBmaWxlKSAqLworICAgIGlmIChzdHJtLT5hdmFpbF9pbiA+IDEgJiYKKyAgICAgICAgICAgIHN0cm0tPm5leHRfaW5bMF0gPT0gMzEgJiYgc3RybS0+bmV4dF9pblsxXSA9PSAxMzkpIHsKKyAgICAgICAgaW5mbGF0ZVJlc2V0KHN0cm0pOworICAgICAgICBzdGF0ZS0+aG93ID0gR1pJUDsKKyAgICAgICAgc3RhdGUtPmRpcmVjdCA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIG5vIGd6aXAgaGVhZGVyIC0tIGlmIHdlIHdlcmUgZGVjb2RpbmcgZ3ppcCBiZWZvcmUsIHRoZW4gdGhpcyBpcyB0cmFpbGluZworICAgICAgIGdhcmJhZ2UuICBJZ25vcmUgdGhlIHRyYWlsaW5nIGdhcmJhZ2UgYW5kIGZpbmlzaC4gKi8KKyAgICBpZiAoc3RhdGUtPmRpcmVjdCA9PSAwKSB7CisgICAgICAgIHN0cm0tPmF2YWlsX2luID0gMDsKKyAgICAgICAgc3RhdGUtPmVvZiA9IDE7CisgICAgICAgIHN0YXRlLT54LmhhdmUgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBkb2luZyByYXcgaS9vLCBjb3B5IGFueSBsZWZ0b3ZlciBpbnB1dCB0byBvdXRwdXQgLS0gdGhpcyBhc3N1bWVzIHRoYXQKKyAgICAgICB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBsYXJnZXIgdGhhbiB0aGUgaW5wdXQgYnVmZmVyLCB3aGljaCBhbHNvIGFzc3VyZXMKKyAgICAgICBzcGFjZSBmb3IgZ3p1bmdldGMoKSAqLworICAgIHN0YXRlLT54Lm5leHQgPSBzdGF0ZS0+b3V0OworICAgIGlmIChzdHJtLT5hdmFpbF9pbikgeworICAgICAgICBtZW1jcHkoc3RhdGUtPngubmV4dCwgc3RybS0+bmV4dF9pbiwgc3RybS0+YXZhaWxfaW4pOworICAgICAgICBzdGF0ZS0+eC5oYXZlID0gc3RybS0+YXZhaWxfaW47CisgICAgICAgIHN0cm0tPmF2YWlsX2luID0gMDsKKyAgICB9CisgICAgc3RhdGUtPmhvdyA9IENPUFk7CisgICAgc3RhdGUtPmRpcmVjdCA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIERlY29tcHJlc3MgZnJvbSBpbnB1dCB0byB0aGUgcHJvdmlkZWQgbmV4dF9vdXQgYW5kIGF2YWlsX291dCBpbiB0aGUgc3RhdGUuCisgICBPbiByZXR1cm4sIHN0YXRlLT54LmhhdmUgYW5kIHN0YXRlLT54Lm5leHQgcG9pbnQgdG8gdGhlIGp1c3QgZGVjb21wcmVzc2VkCisgICBkYXRhLiAgSWYgdGhlIGd6aXAgc3RyZWFtIGNvbXBsZXRlcywgc3RhdGUtPmhvdyBpcyByZXNldCB0byBMT09LIHRvIGxvb2sgZm9yCisgICB0aGUgbmV4dCBnemlwIHN0cmVhbSBvciByYXcgZGF0YSwgb25jZSBzdGF0ZS0+eC5oYXZlIGlzIGRlcGxldGVkLiAgUmV0dXJucyAwCisgICBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLiAqLworbG9jYWwgaW50IGd6X2RlY29tcChzdGF0ZSkKKyAgICBnel9zdGF0ZXAgc3RhdGU7Cit7CisgICAgaW50IHJldCA9IFpfT0s7CisgICAgdW5zaWduZWQgaGFkOworICAgIHpfc3RyZWFtcCBzdHJtID0gJihzdGF0ZS0+c3RybSk7CisKKyAgICAvKiBmaWxsIG91dHB1dCBidWZmZXIgdXAgdG8gZW5kIG9mIGRlZmxhdGUgc3RyZWFtICovCisgICAgaGFkID0gc3RybS0+YXZhaWxfb3V0OworICAgIGRvIHsKKyAgICAgICAgLyogZ2V0IG1vcmUgaW5wdXQgZm9yIGluZmxhdGUoKSAqLworICAgICAgICBpZiAoc3RybS0+YXZhaWxfaW4gPT0gMCAmJiBnel9hdmFpbChzdGF0ZSkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChzdHJtLT5hdmFpbF9pbiA9PSAwKSB7CisgICAgICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9CVUZfRVJST1IsICJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGRlY29tcHJlc3MgYW5kIGhhbmRsZSBlcnJvcnMgKi8KKyAgICAgICAgcmV0ID0gaW5mbGF0ZShzdHJtLCBaX05PX0ZMVVNIKTsKKyAgICAgICAgaWYgKHJldCA9PSBaX1NUUkVBTV9FUlJPUiB8fCByZXQgPT0gWl9ORUVEX0RJQ1QpIHsKKyAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX1NUUkVBTV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICJpbnRlcm5hbCBlcnJvcjogaW5mbGF0ZSBzdHJlYW0gY29ycnVwdCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPT0gWl9NRU1fRVJST1IpIHsKKyAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX01FTV9FUlJPUiwgIm91dCBvZiBtZW1vcnkiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ID09IFpfREFUQV9FUlJPUikgeyAgICAgICAgICAgICAgLyogZGVmbGF0ZSBzdHJlYW0gaW52YWxpZCAqLworICAgICAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfREFUQV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9PSBOVUxMID8gImNvbXByZXNzZWQgZGF0YSBlcnJvciIgOiBzdHJtLT5tc2cpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfSB3aGlsZSAoc3RybS0+YXZhaWxfb3V0ICYmIHJldCAhPSBaX1NUUkVBTV9FTkQpOworCisgICAgLyogdXBkYXRlIGF2YWlsYWJsZSBvdXRwdXQgKi8KKyAgICBzdGF0ZS0+eC5oYXZlID0gaGFkIC0gc3RybS0+YXZhaWxfb3V0OworICAgIHN0YXRlLT54Lm5leHQgPSBzdHJtLT5uZXh0X291dCAtIHN0YXRlLT54LmhhdmU7CisKKyAgICAvKiBpZiB0aGUgZ3ppcCBzdHJlYW0gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgbG9vayBmb3IgYW5vdGhlciAqLworICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRU5EKQorICAgICAgICBzdGF0ZS0+aG93ID0gTE9PSzsKKworICAgIC8qIGdvb2QgZGVjb21wcmVzc2lvbiAqLworICAgIHJldHVybiAwOworfQorCisvKiBGZXRjaCBkYXRhIGFuZCBwdXQgaXQgaW4gdGhlIG91dHB1dCBidWZmZXIuICBBc3N1bWVzIHN0YXRlLT54LmhhdmUgaXMgMC4KKyAgIERhdGEgaXMgZWl0aGVyIGNvcGllZCBmcm9tIHRoZSBpbnB1dCBmaWxlIG9yIGRlY29tcHJlc3NlZCBmcm9tIHRoZSBpbnB1dAorICAgZmlsZSBkZXBlbmRpbmcgb24gc3RhdGUtPmhvdy4gIElmIHN0YXRlLT5ob3cgaXMgTE9PSywgdGhlbiBhIGd6aXAgaGVhZGVyIGlzCisgICBsb29rZWQgZm9yIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGNvcHkgb3IgZGVjb21wcmVzcy4gIFJldHVybnMgLTEgb24gZXJyb3IsCisgICBvdGhlcndpc2UgMC4gIGd6X2ZldGNoKCkgd2lsbCBsZWF2ZSBzdGF0ZS0+aG93IGFzIENPUFkgb3IgR1pJUCB1bmxlc3MgdGhlCisgICBlbmQgb2YgdGhlIGlucHV0IGZpbGUgaGFzIGJlZW4gcmVhY2hlZCBhbmQgYWxsIGRhdGEgaGFzIGJlZW4gcHJvY2Vzc2VkLiAgKi8KK2xvY2FsIGludCBnel9mZXRjaChzdGF0ZSkKKyAgICBnel9zdGF0ZXAgc3RhdGU7Cit7CisgICAgel9zdHJlYW1wIHN0cm0gPSAmKHN0YXRlLT5zdHJtKTsKKworICAgIGRvIHsKKyAgICAgICAgc3dpdGNoKHN0YXRlLT5ob3cpIHsKKyAgICAgICAgY2FzZSBMT09LOiAgICAgIC8qIC0+IExPT0ssIENPUFkgKG9ubHkgaWYgbmV2ZXIgR1pJUCksIG9yIEdaSVAgKi8KKyAgICAgICAgICAgIGlmIChnel9sb29rKHN0YXRlKSA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAoc3RhdGUtPmhvdyA9PSBMT09LKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ09QWTogICAgICAvKiAtPiBDT1BZICovCisgICAgICAgICAgICBpZiAoZ3pfbG9hZChzdGF0ZSwgc3RhdGUtPm91dCwgc3RhdGUtPnNpemUgPDwgMSwgJihzdGF0ZS0+eC5oYXZlKSkKKyAgICAgICAgICAgICAgICAgICAgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgc3RhdGUtPngubmV4dCA9IHN0YXRlLT5vdXQ7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBHWklQOiAgICAgIC8qIC0+IEdaSVAgb3IgTE9PSyAoaWYgZW5kIG9mIGd6aXAgc3RyZWFtKSAqLworICAgICAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gc3RhdGUtPnNpemUgPDwgMTsKKyAgICAgICAgICAgIHN0cm0tPm5leHRfb3V0ID0gc3RhdGUtPm91dDsKKyAgICAgICAgICAgIGlmIChnel9kZWNvbXAoc3RhdGUpID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHN0YXRlLT54LmhhdmUgPT0gMCAmJiAoIXN0YXRlLT5lb2YgfHwgc3RybS0+YXZhaWxfaW4pKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogU2tpcCBsZW4gdW5jb21wcmVzc2VkIGJ5dGVzIG9mIG91dHB1dC4gIFJldHVybiAtMSBvbiBlcnJvciwgMCBvbiBzdWNjZXNzLiAqLworbG9jYWwgaW50IGd6X3NraXAoc3RhdGUsIGxlbikKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisgICAgel9vZmY2NF90IGxlbjsKK3sKKyAgICB1bnNpZ25lZCBuOworCisgICAgLyogc2tpcCBvdmVyIGxlbiBieXRlcyBvciByZWFjaCBlbmQtb2YtZmlsZSwgd2hpY2hldmVyIGNvbWVzIGZpcnN0ICovCisgICAgd2hpbGUgKGxlbikKKyAgICAgICAgLyogc2tpcCBvdmVyIHdoYXRldmVyIGlzIGluIG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgaWYgKHN0YXRlLT54LmhhdmUpIHsKKyAgICAgICAgICAgIG4gPSBHVF9PRkYoc3RhdGUtPnguaGF2ZSkgfHwgKHpfb2ZmNjRfdClzdGF0ZS0+eC5oYXZlID4gbGVuID8KKyAgICAgICAgICAgICAgICAodW5zaWduZWQpbGVuIDogc3RhdGUtPnguaGF2ZTsKKyAgICAgICAgICAgIHN0YXRlLT54LmhhdmUgLT0gbjsKKyAgICAgICAgICAgIHN0YXRlLT54Lm5leHQgKz0gbjsKKyAgICAgICAgICAgIHN0YXRlLT54LnBvcyArPSBuOworICAgICAgICAgICAgbGVuIC09IG47CisgICAgICAgIH0KKworICAgICAgICAvKiBvdXRwdXQgYnVmZmVyIGVtcHR5IC0tIHJldHVybiBpZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCAqLworICAgICAgICBlbHNlIGlmIChzdGF0ZS0+ZW9mICYmIHN0YXRlLT5zdHJtLmF2YWlsX2luID09IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBuZWVkIG1vcmUgZGF0YSB0byBza2lwIC0tIGxvYWQgdXAgb3V0cHV0IGJ1ZmZlciAqLworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIGdldCBtb3JlIG91dHB1dCwgbG9va2luZyBmb3IgaGVhZGVyIGlmIHJlcXVpcmVkICovCisgICAgICAgICAgICBpZiAoZ3pfZmV0Y2goc3RhdGUpID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiAtLSBzZWUgemxpYi5oIC0tICovCitpbnQgWkVYUE9SVCBnenJlYWQoZmlsZSwgYnVmLCBsZW4pCisgICAgZ3pGaWxlIGZpbGU7CisgICAgdm9pZHAgYnVmOworICAgIHVuc2lnbmVkIGxlbjsKK3sKKyAgICB1bnNpZ25lZCBnb3QsIG47CisgICAgZ3pfc3RhdGVwIHN0YXRlOworICAgIHpfc3RyZWFtcCBzdHJtOworCisgICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSAqLworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKKyAgICBzdHJtID0gJihzdGF0ZS0+c3RybSk7CisKKyAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHJlYWRpbmcgYW5kIHRoYXQgdGhlcmUncyBubyAoc2VyaW91cykgZXJyb3IgKi8KKyAgICBpZiAoc3RhdGUtPm1vZGUgIT0gR1pfUkVBRCB8fAorICAgICAgICAgICAgKHN0YXRlLT5lcnIgIT0gWl9PSyAmJiBzdGF0ZS0+ZXJyICE9IFpfQlVGX0VSUk9SKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogc2luY2UgYW4gaW50IGlzIHJldHVybmVkLCBtYWtlIHN1cmUgbGVuIGZpdHMgaW4gb25lLCBvdGhlcndpc2UgcmV0dXJuCisgICAgICAgd2l0aCBhbiBlcnJvciAodGhpcyBhdm9pZHMgdGhlIGZsYXcgaW4gdGhlIGludGVyZmFjZSkgKi8KKyAgICBpZiAoKGludClsZW4gPCAwKSB7CisgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX0RBVEFfRVJST1IsICJyZXF1ZXN0ZWQgbGVuZ3RoIGRvZXMgbm90IGZpdCBpbiBpbnQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGlmIGxlbiBpcyB6ZXJvLCBhdm9pZCB1bm5lY2Vzc2FyeSBvcGVyYXRpb25zICovCisgICAgaWYgKGxlbiA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIHByb2Nlc3MgYSBza2lwIHJlcXVlc3QgKi8KKyAgICBpZiAoc3RhdGUtPnNlZWspIHsKKyAgICAgICAgc3RhdGUtPnNlZWsgPSAwOworICAgICAgICBpZiAoZ3pfc2tpcChzdGF0ZSwgc3RhdGUtPnNraXApID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGdldCBsZW4gYnl0ZXMgdG8gYnVmLCBvciBsZXNzIHRoYW4gbGVuIGlmIGF0IHRoZSBlbmQgKi8KKyAgICBnb3QgPSAwOworICAgIGRvIHsKKyAgICAgICAgLyogZmlyc3QganVzdCB0cnkgY29weWluZyBkYXRhIGZyb20gdGhlIG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgaWYgKHN0YXRlLT54LmhhdmUpIHsKKyAgICAgICAgICAgIG4gPSBzdGF0ZS0+eC5oYXZlID4gbGVuID8gbGVuIDogc3RhdGUtPnguaGF2ZTsKKyAgICAgICAgICAgIG1lbWNweShidWYsIHN0YXRlLT54Lm5leHQsIG4pOworICAgICAgICAgICAgc3RhdGUtPngubmV4dCArPSBuOworICAgICAgICAgICAgc3RhdGUtPnguaGF2ZSAtPSBuOworICAgICAgICB9CisKKyAgICAgICAgLyogb3V0cHV0IGJ1ZmZlciBlbXB0eSAtLSByZXR1cm4gaWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgKi8KKyAgICAgICAgZWxzZSBpZiAoc3RhdGUtPmVvZiAmJiBzdHJtLT5hdmFpbF9pbiA9PSAwKSB7CisgICAgICAgICAgICBzdGF0ZS0+cGFzdCA9IDE7ICAgICAgICAvKiB0cmllZCB0byByZWFkIHBhc3QgZW5kICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIG5lZWQgb3V0cHV0IGRhdGEgLS0gZm9yIHNtYWxsIGxlbiBvciBuZXcgc3RyZWFtIGxvYWQgdXAgb3VyIG91dHB1dAorICAgICAgICAgICBidWZmZXIgKi8KKyAgICAgICAgZWxzZSBpZiAoc3RhdGUtPmhvdyA9PSBMT09LIHx8IGxlbiA8IChzdGF0ZS0+c2l6ZSA8PCAxKSkgeworICAgICAgICAgICAgLyogZ2V0IG1vcmUgb3V0cHV0LCBsb29raW5nIGZvciBoZWFkZXIgaWYgcmVxdWlyZWQgKi8KKyAgICAgICAgICAgIGlmIChnel9mZXRjaChzdGF0ZSkgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgY29udGludWU7ICAgICAgIC8qIG5vIHByb2dyZXNzIHlldCAtLSBnbyBiYWNrIHRvIGNvcHkgYWJvdmUgKi8KKyAgICAgICAgICAgIC8qIHRoZSBjb3B5IGFib3ZlIGFzc3VyZXMgdGhhdCB3ZSB3aWxsIGxlYXZlIHdpdGggc3BhY2UgaW4gdGhlCisgICAgICAgICAgICAgICBvdXRwdXQgYnVmZmVyLCBhbGxvd2luZyBhdCBsZWFzdCBvbmUgZ3p1bmdldGMoKSB0byBzdWNjZWVkICovCisgICAgICAgIH0KKworICAgICAgICAvKiBsYXJnZSBsZW4gLS0gcmVhZCBkaXJlY3RseSBpbnRvIHVzZXIgYnVmZmVyICovCisgICAgICAgIGVsc2UgaWYgKHN0YXRlLT5ob3cgPT0gQ09QWSkgeyAgICAgIC8qIHJlYWQgZGlyZWN0bHkgKi8KKyAgICAgICAgICAgIGlmIChnel9sb2FkKHN0YXRlLCAodW5zaWduZWQgY2hhciAqKWJ1ZiwgbGVuLCAmbikgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLyogbGFyZ2UgbGVuIC0tIGRlY29tcHJlc3MgZGlyZWN0bHkgaW50byB1c2VyIGJ1ZmZlciAqLworICAgICAgICBlbHNlIHsgIC8qIHN0YXRlLT5ob3cgPT0gR1pJUCAqLworICAgICAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gbGVuOworICAgICAgICAgICAgc3RybS0+bmV4dF9vdXQgPSAodW5zaWduZWQgY2hhciAqKWJ1ZjsKKyAgICAgICAgICAgIGlmIChnel9kZWNvbXAoc3RhdGUpID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIG4gPSBzdGF0ZS0+eC5oYXZlOworICAgICAgICAgICAgc3RhdGUtPnguaGF2ZSA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKiB1cGRhdGUgcHJvZ3Jlc3MgKi8KKyAgICAgICAgbGVuIC09IG47CisgICAgICAgIGJ1ZiA9IChjaGFyICopYnVmICsgbjsKKyAgICAgICAgZ290ICs9IG47CisgICAgICAgIHN0YXRlLT54LnBvcyArPSBuOworICAgIH0gd2hpbGUgKGxlbik7CisKKyAgICAvKiByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaW50byB1c2VyIGJ1ZmZlciAod2lsbCBmaXQgaW4gaW50KSAqLworICAgIHJldHVybiAoaW50KWdvdDsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworI2lmZGVmIFpfUFJFRklYX1NFVAorIyAgdW5kZWYgel9nemdldGMKKyNlbHNlCisjICB1bmRlZiBnemdldGMKKyNlbmRpZgoraW50IFpFWFBPUlQgZ3pnZXRjKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgaW50IHJldDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1ZlsxXTsKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworCisgICAgLyogY2hlY2sgdGhhdCB3ZSdyZSByZWFkaW5nIGFuZCB0aGF0IHRoZXJlJ3Mgbm8gKHNlcmlvdXMpIGVycm9yICovCisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgfHwKKyAgICAgICAgKHN0YXRlLT5lcnIgIT0gWl9PSyAmJiBzdGF0ZS0+ZXJyICE9IFpfQlVGX0VSUk9SKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogdHJ5IG91dHB1dCBidWZmZXIgKG5vIG5lZWQgdG8gY2hlY2sgZm9yIHNraXAgcmVxdWVzdCkgKi8KKyAgICBpZiAoc3RhdGUtPnguaGF2ZSkgeworICAgICAgICBzdGF0ZS0+eC5oYXZlLS07CisgICAgICAgIHN0YXRlLT54LnBvcysrOworICAgICAgICByZXR1cm4gKihzdGF0ZS0+eC5uZXh0KSsrOworICAgIH0KKworICAgIC8qIG5vdGhpbmcgdGhlcmUgLS0gdHJ5IGd6cmVhZCgpICovCisgICAgcmV0ID0gZ3pyZWFkKGZpbGUsIGJ1ZiwgMSk7CisgICAgcmV0dXJuIHJldCA8IDEgPyAtMSA6IGJ1ZlswXTsKK30KKworaW50IFpFWFBPUlQgZ3pnZXRjXyhmaWxlKQorZ3pGaWxlIGZpbGU7Cit7CisgICAgcmV0dXJuIGd6Z2V0YyhmaWxlKTsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworaW50IFpFWFBPUlQgZ3p1bmdldGMoYywgZmlsZSkKKyAgICBpbnQgYzsKKyAgICBnekZpbGUgZmlsZTsKK3sKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworCisgICAgLyogY2hlY2sgdGhhdCB3ZSdyZSByZWFkaW5nIGFuZCB0aGF0IHRoZXJlJ3Mgbm8gKHNlcmlvdXMpIGVycm9yICovCisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgfHwKKyAgICAgICAgKHN0YXRlLT5lcnIgIT0gWl9PSyAmJiBzdGF0ZS0+ZXJyICE9IFpfQlVGX0VSUk9SKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogcHJvY2VzcyBhIHNraXAgcmVxdWVzdCAqLworICAgIGlmIChzdGF0ZS0+c2VlaykgeworICAgICAgICBzdGF0ZS0+c2VlayA9IDA7CisgICAgICAgIGlmIChnel9za2lwKHN0YXRlLCBzdGF0ZS0+c2tpcCkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogY2FuJ3QgcHVzaCBFT0YgKi8KKyAgICBpZiAoYyA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIGlmIG91dHB1dCBidWZmZXIgZW1wdHksIHB1dCBieXRlIGF0IGVuZCAoYWxsb3dzIG1vcmUgcHVzaGluZykgKi8KKyAgICBpZiAoc3RhdGUtPnguaGF2ZSA9PSAwKSB7CisgICAgICAgIHN0YXRlLT54LmhhdmUgPSAxOworICAgICAgICBzdGF0ZS0+eC5uZXh0ID0gc3RhdGUtPm91dCArIChzdGF0ZS0+c2l6ZSA8PCAxKSAtIDE7CisgICAgICAgIHN0YXRlLT54Lm5leHRbMF0gPSBjOworICAgICAgICBzdGF0ZS0+eC5wb3MtLTsKKyAgICAgICAgc3RhdGUtPnBhc3QgPSAwOworICAgICAgICByZXR1cm4gYzsKKyAgICB9CisKKyAgICAvKiBpZiBubyByb29tLCBnaXZlIHVwIChtdXN0IGhhdmUgYWxyZWFkeSBkb25lIGEgZ3p1bmdldGMoKSkgKi8KKyAgICBpZiAoc3RhdGUtPnguaGF2ZSA9PSAoc3RhdGUtPnNpemUgPDwgMSkpIHsKKyAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfREFUQV9FUlJPUiwgIm91dCBvZiByb29tIHRvIHB1c2ggY2hhcmFjdGVycyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogc2xpZGUgb3V0cHV0IGRhdGEgaWYgbmVlZGVkIGFuZCBpbnNlcnQgYnl0ZSBiZWZvcmUgZXhpc3RpbmcgZGF0YSAqLworICAgIGlmIChzdGF0ZS0+eC5uZXh0ID09IHN0YXRlLT5vdXQpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqc3JjID0gc3RhdGUtPm91dCArIHN0YXRlLT54LmhhdmU7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QgPSBzdGF0ZS0+b3V0ICsgKHN0YXRlLT5zaXplIDw8IDEpOworICAgICAgICB3aGlsZSAoc3JjID4gc3RhdGUtPm91dCkKKyAgICAgICAgICAgICotLWRlc3QgPSAqLS1zcmM7CisgICAgICAgIHN0YXRlLT54Lm5leHQgPSBkZXN0OworICAgIH0KKyAgICBzdGF0ZS0+eC5oYXZlKys7CisgICAgc3RhdGUtPngubmV4dC0tOworICAgIHN0YXRlLT54Lm5leHRbMF0gPSBjOworICAgIHN0YXRlLT54LnBvcy0tOworICAgIHN0YXRlLT5wYXN0ID0gMDsKKyAgICByZXR1cm4gYzsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworY2hhciAqIFpFWFBPUlQgZ3pnZXRzKGZpbGUsIGJ1ZiwgbGVuKQorICAgIGd6RmlsZSBmaWxlOworICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgbGVuOworeworICAgIHVuc2lnbmVkIGxlZnQsIG47CisgICAgY2hhciAqc3RyOworICAgIHVuc2lnbmVkIGNoYXIgKmVvbDsKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisKKyAgICAvKiBjaGVjayBwYXJhbWV0ZXJzIGFuZCBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCB8fCBsZW4gPCAxKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKKworICAgIC8qIGNoZWNrIHRoYXQgd2UncmUgcmVhZGluZyBhbmQgdGhhdCB0aGVyZSdzIG5vIChzZXJpb3VzKSBlcnJvciAqLworICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9SRUFEIHx8CisgICAgICAgIChzdGF0ZS0+ZXJyICE9IFpfT0sgJiYgc3RhdGUtPmVyciAhPSBaX0JVRl9FUlJPUikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogcHJvY2VzcyBhIHNraXAgcmVxdWVzdCAqLworICAgIGlmIChzdGF0ZS0+c2VlaykgeworICAgICAgICBzdGF0ZS0+c2VlayA9IDA7CisgICAgICAgIGlmIChnel9za2lwKHN0YXRlLCBzdGF0ZS0+c2tpcCkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBjb3B5IG91dHB1dCBieXRlcyB1cCB0byBuZXcgbGluZSBvciBsZW4gLSAxLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QgLS0KKyAgICAgICBhcHBlbmQgYSB0ZXJtaW5hdGluZyB6ZXJvIHRvIHRoZSBzdHJpbmcgKHdlIGRvbid0IGNoZWNrIGZvciBhIHplcm8gaW4KKyAgICAgICB0aGUgY29udGVudHMsIGxldCB0aGUgdXNlciB3b3JyeSBhYm91dCB0aGF0KSAqLworICAgIHN0ciA9IGJ1ZjsKKyAgICBsZWZ0ID0gKHVuc2lnbmVkKWxlbiAtIDE7CisgICAgaWYgKGxlZnQpIGRvIHsKKyAgICAgICAgLyogYXNzdXJlIHRoYXQgc29tZXRoaW5nIGlzIGluIHRoZSBvdXRwdXQgYnVmZmVyICovCisgICAgICAgIGlmIChzdGF0ZS0+eC5oYXZlID09IDAgJiYgZ3pfZmV0Y2goc3RhdGUpID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIGVycm9yICovCisgICAgICAgIGlmIChzdGF0ZS0+eC5oYXZlID09IDApIHsgICAgICAgLyogZW5kIG9mIGZpbGUgKi8KKyAgICAgICAgICAgIHN0YXRlLT5wYXN0ID0gMTsgICAgICAgICAgICAvKiByZWFkIHBhc3QgZW5kICovCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIHdoYXQgd2UgaGF2ZSAqLworICAgICAgICB9CisKKyAgICAgICAgLyogbG9vayBmb3IgZW5kLW9mLWxpbmUgaW4gY3VycmVudCBvdXRwdXQgYnVmZmVyICovCisgICAgICAgIG4gPSBzdGF0ZS0+eC5oYXZlID4gbGVmdCA/IGxlZnQgOiBzdGF0ZS0+eC5oYXZlOworICAgICAgICBlb2wgPSAodW5zaWduZWQgY2hhciAqKW1lbWNocihzdGF0ZS0+eC5uZXh0LCAnXG4nLCBuKTsKKyAgICAgICAgaWYgKGVvbCAhPSBOVUxMKQorICAgICAgICAgICAgbiA9ICh1bnNpZ25lZCkoZW9sIC0gc3RhdGUtPngubmV4dCkgKyAxOworCisgICAgICAgIC8qIGNvcHkgdGhyb3VnaCBlbmQtb2YtbGluZSwgb3IgcmVtYWluZGVyIGlmIG5vdCBmb3VuZCAqLworICAgICAgICBtZW1jcHkoYnVmLCBzdGF0ZS0+eC5uZXh0LCBuKTsKKyAgICAgICAgc3RhdGUtPnguaGF2ZSAtPSBuOworICAgICAgICBzdGF0ZS0+eC5uZXh0ICs9IG47CisgICAgICAgIHN0YXRlLT54LnBvcyArPSBuOworICAgICAgICBsZWZ0IC09IG47CisgICAgICAgIGJ1ZiArPSBuOworICAgIH0gd2hpbGUgKGxlZnQgJiYgZW9sID09IE5VTEwpOworCisgICAgLyogcmV0dXJuIHRlcm1pbmF0ZWQgc3RyaW5nLCBvciBpZiBub3RoaW5nLCBlbmQgb2YgZmlsZSAqLworICAgIGlmIChidWYgPT0gc3RyKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBidWZbMF0gPSAwOworICAgIHJldHVybiBzdHI7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK2ludCBaRVhQT1JUIGd6ZGlyZWN0KGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgZ3pfc3RhdGVwIHN0YXRlOworCisgICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSAqLworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworCisgICAgLyogaWYgdGhlIHN0YXRlIGlzIG5vdCBrbm93biwgYnV0IHdlIGNhbiBmaW5kIG91dCwgdGhlbiBkbyBzbyAodGhpcyBpcworICAgICAgIG1haW5seSBmb3IgcmlnaHQgYWZ0ZXIgYSBnem9wZW4oKSBvciBnemRvcGVuKCkpICovCisgICAgaWYgKHN0YXRlLT5tb2RlID09IEdaX1JFQUQgJiYgc3RhdGUtPmhvdyA9PSBMT09LICYmIHN0YXRlLT54LmhhdmUgPT0gMCkKKyAgICAgICAgKHZvaWQpZ3pfbG9vayhzdGF0ZSk7CisKKyAgICAvKiByZXR1cm4gMSBpZiB0cmFuc3BhcmVudCwgMCBpZiBwcm9jZXNzaW5nIGEgZ3ppcCBzdHJlYW0gKi8KKyAgICByZXR1cm4gc3RhdGUtPmRpcmVjdDsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworaW50IFpFWFBPUlQgZ3pjbG9zZV9yKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgaW50IHJldCwgZXJyOworICAgIGd6X3N0YXRlcCBzdGF0ZTsKKworICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgKi8KKyAgICBpZiAoZmlsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7CisKKyAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHJlYWRpbmcgKi8KKyAgICBpZiAoc3RhdGUtPm1vZGUgIT0gR1pfUkVBRCkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgLyogZnJlZSBtZW1vcnkgYW5kIGNsb3NlIGZpbGUgKi8KKyAgICBpZiAoc3RhdGUtPnNpemUpIHsKKyAgICAgICAgaW5mbGF0ZUVuZCgmKHN0YXRlLT5zdHJtKSk7CisgICAgICAgIGZyZWUoc3RhdGUtPm91dCk7CisgICAgICAgIGZyZWUoc3RhdGUtPmluKTsKKyAgICB9CisgICAgZXJyID0gc3RhdGUtPmVyciA9PSBaX0JVRl9FUlJPUiA/IFpfQlVGX0VSUk9SIDogWl9PSzsKKyAgICBnel9lcnJvcihzdGF0ZSwgWl9PSywgTlVMTCk7CisgICAgZnJlZShzdGF0ZS0+cGF0aCk7CisgICAgcmV0ID0gY2xvc2Uoc3RhdGUtPmZkKTsKKyAgICBmcmVlKHN0YXRlKTsKKyAgICByZXR1cm4gcmV0ID8gWl9FUlJOTyA6IGVycjsKK30KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2d6d3JpdGUuYyBiL3psaWIvc3JjL2d6d3JpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTc2N2ZiCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvZ3p3cml0ZS5jCkBAIC0wLDAgKzEsNTc3IEBACisvKiBnendyaXRlLmMgLS0gemxpYiBmdW5jdGlvbnMgZm9yIHdyaXRpbmcgZ3ppcCBmaWxlcworICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDEwLCAyMDExLCAyMDEyLCAyMDEzIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisjaW5jbHVkZSAiZ3pndXRzLmgiCisKKy8qIExvY2FsIGZ1bmN0aW9ucyAqLworbG9jYWwgaW50IGd6X2luaXQgT0YoKGd6X3N0YXRlcCkpOworbG9jYWwgaW50IGd6X2NvbXAgT0YoKGd6X3N0YXRlcCwgaW50KSk7Citsb2NhbCBpbnQgZ3pfemVybyBPRigoZ3pfc3RhdGVwLCB6X29mZjY0X3QpKTsKKworLyogSW5pdGlhbGl6ZSBzdGF0ZSBmb3Igd3JpdGluZyBhIGd6aXAgZmlsZS4gIE1hcmsgaW5pdGlhbGl6YXRpb24gYnkgc2V0dGluZworICAgc3RhdGUtPnNpemUgdG8gbm9uLXplcm8uICBSZXR1cm4gLTEgb24gZmFpbHVyZSBvciAwIG9uIHN1Y2Nlc3MuICovCitsb2NhbCBpbnQgZ3pfaW5pdChzdGF0ZSkKKyAgICBnel9zdGF0ZXAgc3RhdGU7Cit7CisgICAgaW50IHJldDsKKyAgICB6X3N0cmVhbXAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOworCisgICAgLyogYWxsb2NhdGUgaW5wdXQgYnVmZmVyICovCisgICAgc3RhdGUtPmluID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2Moc3RhdGUtPndhbnQpOworICAgIGlmIChzdGF0ZS0+aW4gPT0gTlVMTCkgeworICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9NRU1fRVJST1IsICJvdXQgb2YgbWVtb3J5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBvbmx5IG5lZWQgb3V0cHV0IGJ1ZmZlciBhbmQgZGVmbGF0ZSBzdGF0ZSBpZiBjb21wcmVzc2luZyAqLworICAgIGlmICghc3RhdGUtPmRpcmVjdCkgeworICAgICAgICAvKiBhbGxvY2F0ZSBvdXRwdXQgYnVmZmVyICovCisgICAgICAgIHN0YXRlLT5vdXQgPSAodW5zaWduZWQgY2hhciAqKW1hbGxvYyhzdGF0ZS0+d2FudCk7CisgICAgICAgIGlmIChzdGF0ZS0+b3V0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZyZWUoc3RhdGUtPmluKTsKKyAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX01FTV9FUlJPUiwgIm91dCBvZiBtZW1vcnkiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGFsbG9jYXRlIGRlZmxhdGUgbWVtb3J5LCBzZXQgdXAgZm9yIGd6aXAgY29tcHJlc3Npb24gKi8KKyAgICAgICAgc3RybS0+emFsbG9jID0gWl9OVUxMOworICAgICAgICBzdHJtLT56ZnJlZSA9IFpfTlVMTDsKKyAgICAgICAgc3RybS0+b3BhcXVlID0gWl9OVUxMOworICAgICAgICByZXQgPSBkZWZsYXRlSW5pdDIoc3RybSwgc3RhdGUtPmxldmVsLCBaX0RFRkxBVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1dCSVRTICsgMTYsIERFRl9NRU1fTEVWRUwsIHN0YXRlLT5zdHJhdGVneSk7CisgICAgICAgIGlmIChyZXQgIT0gWl9PSykgeworICAgICAgICAgICAgZnJlZShzdGF0ZS0+b3V0KTsKKyAgICAgICAgICAgIGZyZWUoc3RhdGUtPmluKTsKKyAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX01FTV9FUlJPUiwgIm91dCBvZiBtZW1vcnkiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG1hcmsgc3RhdGUgYXMgaW5pdGlhbGl6ZWQgKi8KKyAgICBzdGF0ZS0+c2l6ZSA9IHN0YXRlLT53YW50OworCisgICAgLyogaW5pdGlhbGl6ZSB3cml0ZSBidWZmZXIgaWYgY29tcHJlc3NpbmcgKi8KKyAgICBpZiAoIXN0YXRlLT5kaXJlY3QpIHsKKyAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gc3RhdGUtPnNpemU7CisgICAgICAgIHN0cm0tPm5leHRfb3V0ID0gc3RhdGUtPm91dDsKKyAgICAgICAgc3RhdGUtPngubmV4dCA9IHN0cm0tPm5leHRfb3V0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogQ29tcHJlc3Mgd2hhdGV2ZXIgaXMgYXQgYXZhaWxfaW4gYW5kIG5leHRfaW4gYW5kIHdyaXRlIHRvIHRoZSBvdXRwdXQgZmlsZS4KKyAgIFJldHVybiAtMSBpZiB0aGVyZSBpcyBhbiBlcnJvciB3cml0aW5nIHRvIHRoZSBvdXRwdXQgZmlsZSwgb3RoZXJ3aXNlIDAuCisgICBmbHVzaCBpcyBhc3N1bWVkIHRvIGJlIGEgdmFsaWQgZGVmbGF0ZSgpIGZsdXNoIHZhbHVlLiAgSWYgZmx1c2ggaXMgWl9GSU5JU0gsCisgICB0aGVuIHRoZSBkZWZsYXRlKCkgc3RhdGUgaXMgcmVzZXQgdG8gc3RhcnQgYSBuZXcgZ3ppcCBzdHJlYW0uICBJZiBnei0+ZGlyZWN0CisgICBpcyB0cnVlLCB0aGVuIHNpbXBseSB3cml0ZSB0byB0aGUgb3V0cHV0IGZpbGUgd2l0aG91dCBjb21wcmVzc2luZywgYW5kCisgICBpZ25vcmUgZmx1c2guICovCitsb2NhbCBpbnQgZ3pfY29tcChzdGF0ZSwgZmx1c2gpCisgICAgZ3pfc3RhdGVwIHN0YXRlOworICAgIGludCBmbHVzaDsKK3sKKyAgICBpbnQgcmV0LCBnb3Q7CisgICAgdW5zaWduZWQgaGF2ZTsKKyAgICB6X3N0cmVhbXAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOworCisgICAgLyogYWxsb2NhdGUgbWVtb3J5IGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaCAqLworICAgIGlmIChzdGF0ZS0+c2l6ZSA9PSAwICYmIGd6X2luaXQoc3RhdGUpID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiB3cml0ZSBkaXJlY3RseSBpZiByZXF1ZXN0ZWQgKi8KKyAgICBpZiAoc3RhdGUtPmRpcmVjdCkgeworICAgICAgICBnb3QgPSB3cml0ZShzdGF0ZS0+ZmQsIHN0cm0tPm5leHRfaW4sIHN0cm0tPmF2YWlsX2luKTsKKyAgICAgICAgaWYgKGdvdCA8IDAgfHwgKHVuc2lnbmVkKWdvdCAhPSBzdHJtLT5hdmFpbF9pbikgeworICAgICAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfRVJSTk8sIHpzdHJlcnJvcigpKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIHJ1biBkZWZsYXRlKCkgb24gcHJvdmlkZWQgaW5wdXQgdW50aWwgaXQgcHJvZHVjZXMgbm8gbW9yZSBvdXRwdXQgKi8KKyAgICByZXQgPSBaX09LOworICAgIGRvIHsKKyAgICAgICAgLyogd3JpdGUgb3V0IGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIGlmIGZ1bGwsIG9yIGlmIGZsdXNoaW5nLCBidXQgaWYKKyAgICAgICAgICAgZG9pbmcgWl9GSU5JU0ggdGhlbiBkb24ndCB3cml0ZSB1bnRpbCB3ZSBnZXQgdG8gWl9TVFJFQU1fRU5EICovCisgICAgICAgIGlmIChzdHJtLT5hdmFpbF9vdXQgPT0gMCB8fCAoZmx1c2ggIT0gWl9OT19GTFVTSCAmJgorICAgICAgICAgICAgKGZsdXNoICE9IFpfRklOSVNIIHx8IHJldCA9PSBaX1NUUkVBTV9FTkQpKSkgeworICAgICAgICAgICAgaGF2ZSA9ICh1bnNpZ25lZCkoc3RybS0+bmV4dF9vdXQgLSBzdGF0ZS0+eC5uZXh0KTsKKyAgICAgICAgICAgIGlmIChoYXZlICYmICgoZ290ID0gd3JpdGUoc3RhdGUtPmZkLCBzdGF0ZS0+eC5uZXh0LCBoYXZlKSkgPCAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKWdvdCAhPSBoYXZlKSkgeworICAgICAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX0VSUk5PLCB6c3RyZXJyb3IoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0cm0tPmF2YWlsX291dCA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gc3RhdGUtPnNpemU7CisgICAgICAgICAgICAgICAgc3RybS0+bmV4dF9vdXQgPSBzdGF0ZS0+b3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPngubmV4dCA9IHN0cm0tPm5leHRfb3V0OworICAgICAgICB9CisKKyAgICAgICAgLyogY29tcHJlc3MgKi8KKyAgICAgICAgaGF2ZSA9IHN0cm0tPmF2YWlsX291dDsKKyAgICAgICAgcmV0ID0gZGVmbGF0ZShzdHJtLCBmbHVzaCk7CisgICAgICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRVJST1IpIHsKKyAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX1NUUkVBTV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJuYWwgZXJyb3I6IGRlZmxhdGUgc3RyZWFtIGNvcnJ1cHQiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBoYXZlIC09IHN0cm0tPmF2YWlsX291dDsKKyAgICB9IHdoaWxlIChoYXZlKTsKKworICAgIC8qIGlmIHRoYXQgY29tcGxldGVkIGEgZGVmbGF0ZSBzdHJlYW0sIGFsbG93IGFub3RoZXIgdG8gc3RhcnQgKi8KKyAgICBpZiAoZmx1c2ggPT0gWl9GSU5JU0gpCisgICAgICAgIGRlZmxhdGVSZXNldChzdHJtKTsKKworICAgIC8qIGFsbCBkb25lLCBubyBlcnJvcnMgKi8KKyAgICByZXR1cm4gMDsKK30KKworLyogQ29tcHJlc3MgbGVuIHplcm9zIHRvIG91dHB1dC4gIFJldHVybiAtMSBvbiBlcnJvciwgMCBvbiBzdWNjZXNzLiAqLworbG9jYWwgaW50IGd6X3plcm8oc3RhdGUsIGxlbikKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisgICAgel9vZmY2NF90IGxlbjsKK3sKKyAgICBpbnQgZmlyc3Q7CisgICAgdW5zaWduZWQgbjsKKyAgICB6X3N0cmVhbXAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOworCisgICAgLyogY29uc3VtZSB3aGF0ZXZlcidzIGxlZnQgaW4gdGhlIGlucHV0IGJ1ZmZlciAqLworICAgIGlmIChzdHJtLT5hdmFpbF9pbiAmJiBnel9jb21wKHN0YXRlLCBaX05PX0ZMVVNIKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogY29tcHJlc3MgbGVuIHplcm9zIChsZW4gZ3VhcmFudGVlZCA+IDApICovCisgICAgZmlyc3QgPSAxOworICAgIHdoaWxlIChsZW4pIHsKKyAgICAgICAgbiA9IEdUX09GRihzdGF0ZS0+c2l6ZSkgfHwgKHpfb2ZmNjRfdClzdGF0ZS0+c2l6ZSA+IGxlbiA/CisgICAgICAgICAgICAodW5zaWduZWQpbGVuIDogc3RhdGUtPnNpemU7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgbWVtc2V0KHN0YXRlLT5pbiwgMCwgbik7CisgICAgICAgICAgICBmaXJzdCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgc3RybS0+YXZhaWxfaW4gPSBuOworICAgICAgICBzdHJtLT5uZXh0X2luID0gc3RhdGUtPmluOworICAgICAgICBzdGF0ZS0+eC5wb3MgKz0gbjsKKyAgICAgICAgaWYgKGd6X2NvbXAoc3RhdGUsIFpfTk9fRkxVU0gpID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBsZW4gLT0gbjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK2ludCBaRVhQT1JUIGd6d3JpdGUoZmlsZSwgYnVmLCBsZW4pCisgICAgZ3pGaWxlIGZpbGU7CisgICAgdm9pZHBjIGJ1ZjsKKyAgICB1bnNpZ25lZCBsZW47Cit7CisgICAgdW5zaWduZWQgcHV0ID0gbGVuOworICAgIGd6X3N0YXRlcCBzdGF0ZTsKKyAgICB6X3N0cmVhbXAgc3RybTsKKworICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgKi8KKyAgICBpZiAoZmlsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKKyAgICBzdHJtID0gJihzdGF0ZS0+c3RybSk7CisKKyAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHdyaXRpbmcgYW5kIHRoYXQgdGhlcmUncyBubyBlcnJvciAqLworICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9XUklURSB8fCBzdGF0ZS0+ZXJyICE9IFpfT0spCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogc2luY2UgYW4gaW50IGlzIHJldHVybmVkLCBtYWtlIHN1cmUgbGVuIGZpdHMgaW4gb25lLCBvdGhlcndpc2UgcmV0dXJuCisgICAgICAgd2l0aCBhbiBlcnJvciAodGhpcyBhdm9pZHMgdGhlIGZsYXcgaW4gdGhlIGludGVyZmFjZSkgKi8KKyAgICBpZiAoKGludClsZW4gPCAwKSB7CisgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX0RBVEFfRVJST1IsICJyZXF1ZXN0ZWQgbGVuZ3RoIGRvZXMgbm90IGZpdCBpbiBpbnQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogaWYgbGVuIGlzIHplcm8sIGF2b2lkIHVubmVjZXNzYXJ5IG9wZXJhdGlvbnMgKi8KKyAgICBpZiAobGVuID09IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogYWxsb2NhdGUgbWVtb3J5IGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaCAqLworICAgIGlmIChzdGF0ZS0+c2l6ZSA9PSAwICYmIGd6X2luaXQoc3RhdGUpID09IC0xKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIGNoZWNrIGZvciBzZWVrIHJlcXVlc3QgKi8KKyAgICBpZiAoc3RhdGUtPnNlZWspIHsKKyAgICAgICAgc3RhdGUtPnNlZWsgPSAwOworICAgICAgICBpZiAoZ3pfemVybyhzdGF0ZSwgc3RhdGUtPnNraXApID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogZm9yIHNtYWxsIGxlbiwgY29weSB0byBpbnB1dCBidWZmZXIsIG90aGVyd2lzZSBjb21wcmVzcyBkaXJlY3RseSAqLworICAgIGlmIChsZW4gPCBzdGF0ZS0+c2l6ZSkgeworICAgICAgICAvKiBjb3B5IHRvIGlucHV0IGJ1ZmZlciwgY29tcHJlc3Mgd2hlbiBmdWxsICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGhhdmUsIGNvcHk7CisKKyAgICAgICAgICAgIGlmIChzdHJtLT5hdmFpbF9pbiA9PSAwKQorICAgICAgICAgICAgICAgIHN0cm0tPm5leHRfaW4gPSBzdGF0ZS0+aW47CisgICAgICAgICAgICBoYXZlID0gKHVuc2lnbmVkKSgoc3RybS0+bmV4dF9pbiArIHN0cm0tPmF2YWlsX2luKSAtIHN0YXRlLT5pbik7CisgICAgICAgICAgICBjb3B5ID0gc3RhdGUtPnNpemUgLSBoYXZlOworICAgICAgICAgICAgaWYgKGNvcHkgPiBsZW4pCisgICAgICAgICAgICAgICAgY29weSA9IGxlbjsKKyAgICAgICAgICAgIG1lbWNweShzdGF0ZS0+aW4gKyBoYXZlLCBidWYsIGNvcHkpOworICAgICAgICAgICAgc3RybS0+YXZhaWxfaW4gKz0gY29weTsKKyAgICAgICAgICAgIHN0YXRlLT54LnBvcyArPSBjb3B5OworICAgICAgICAgICAgYnVmID0gKGNvbnN0IGNoYXIgKilidWYgKyBjb3B5OworICAgICAgICAgICAgbGVuIC09IGNvcHk7CisgICAgICAgICAgICBpZiAobGVuICYmIGd6X2NvbXAoc3RhdGUsIFpfTk9fRkxVU0gpID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IHdoaWxlIChsZW4pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogY29uc3VtZSB3aGF0ZXZlcidzIGxlZnQgaW4gdGhlIGlucHV0IGJ1ZmZlciAqLworICAgICAgICBpZiAoc3RybS0+YXZhaWxfaW4gJiYgZ3pfY29tcChzdGF0ZSwgWl9OT19GTFVTSCkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAvKiBkaXJlY3RseSBjb21wcmVzcyB1c2VyIGJ1ZmZlciB0byBmaWxlICovCisgICAgICAgIHN0cm0tPmF2YWlsX2luID0gbGVuOworICAgICAgICBzdHJtLT5uZXh0X2luID0gKHpfY29uc3QgQnl0ZWYgKilidWY7CisgICAgICAgIHN0YXRlLT54LnBvcyArPSBsZW47CisgICAgICAgIGlmIChnel9jb21wKHN0YXRlLCBaX05PX0ZMVVNIKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIGlucHV0IHdhcyBhbGwgYnVmZmVyZWQgb3IgY29tcHJlc3NlZCAocHV0IHdpbGwgZml0IGluIGludCkgKi8KKyAgICByZXR1cm4gKGludClwdXQ7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK2ludCBaRVhQT1JUIGd6cHV0YyhmaWxlLCBjKQorICAgIGd6RmlsZSBmaWxlOworICAgIGludCBjOworeworICAgIHVuc2lnbmVkIGhhdmU7CisgICAgdW5zaWduZWQgY2hhciBidWZbMV07CisgICAgZ3pfc3RhdGVwIHN0YXRlOworICAgIHpfc3RyZWFtcCBzdHJtOworCisgICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSAqLworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKKyAgICBzdHJtID0gJihzdGF0ZS0+c3RybSk7CisKKyAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHdyaXRpbmcgYW5kIHRoYXQgdGhlcmUncyBubyBlcnJvciAqLworICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9XUklURSB8fCBzdGF0ZS0+ZXJyICE9IFpfT0spCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIGNoZWNrIGZvciBzZWVrIHJlcXVlc3QgKi8KKyAgICBpZiAoc3RhdGUtPnNlZWspIHsKKyAgICAgICAgc3RhdGUtPnNlZWsgPSAwOworICAgICAgICBpZiAoZ3pfemVybyhzdGF0ZSwgc3RhdGUtPnNraXApID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIHRyeSB3cml0aW5nIHRvIGlucHV0IGJ1ZmZlciBmb3Igc3BlZWQgKHN0YXRlLT5zaXplID09IDAgaWYgYnVmZmVyIG5vdAorICAgICAgIGluaXRpYWxpemVkKSAqLworICAgIGlmIChzdGF0ZS0+c2l6ZSkgeworICAgICAgICBpZiAoc3RybS0+YXZhaWxfaW4gPT0gMCkKKyAgICAgICAgICAgIHN0cm0tPm5leHRfaW4gPSBzdGF0ZS0+aW47CisgICAgICAgIGhhdmUgPSAodW5zaWduZWQpKChzdHJtLT5uZXh0X2luICsgc3RybS0+YXZhaWxfaW4pIC0gc3RhdGUtPmluKTsKKyAgICAgICAgaWYgKGhhdmUgPCBzdGF0ZS0+c2l6ZSkgeworICAgICAgICAgICAgc3RhdGUtPmluW2hhdmVdID0gYzsKKyAgICAgICAgICAgIHN0cm0tPmF2YWlsX2luKys7CisgICAgICAgICAgICBzdGF0ZS0+eC5wb3MrKzsKKyAgICAgICAgICAgIHJldHVybiBjICYgMHhmZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG5vIHJvb20gaW4gYnVmZmVyIG9yIG5vdCBpbml0aWFsaXplZCwgdXNlIGd6X3dyaXRlKCkgKi8KKyAgICBidWZbMF0gPSBjOworICAgIGlmIChnendyaXRlKGZpbGUsIGJ1ZiwgMSkgIT0gMSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiBjICYgMHhmZjsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworaW50IFpFWFBPUlQgZ3pwdXRzKGZpbGUsIHN0cikKKyAgICBnekZpbGUgZmlsZTsKKyAgICBjb25zdCBjaGFyICpzdHI7Cit7CisgICAgaW50IHJldDsKKyAgICB1bnNpZ25lZCBsZW47CisKKyAgICAvKiB3cml0ZSBzdHJpbmcgKi8KKyAgICBsZW4gPSAodW5zaWduZWQpc3RybGVuKHN0cik7CisgICAgcmV0ID0gZ3p3cml0ZShmaWxlLCBzdHIsIGxlbik7CisgICAgcmV0dXJuIHJldCA9PSAwICYmIGxlbiAhPSAwID8gLTEgOiByZXQ7Cit9CisKKyNpZiBkZWZpbmVkKFNUREMpIHx8IGRlZmluZWQoWl9IQVZFX1NUREFSR19IKQorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisvKiAtLSBzZWUgemxpYi5oIC0tICovCitpbnQgWkVYUE9SVFZBIGd6dnByaW50ZihnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhKQoreworICAgIGludCBzaXplLCBsZW47CisgICAgZ3pfc3RhdGVwIHN0YXRlOworICAgIHpfc3RyZWFtcCBzdHJtOworCisgICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSAqLworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKKyAgICBzdHJtID0gJihzdGF0ZS0+c3RybSk7CisKKyAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHdyaXRpbmcgYW5kIHRoYXQgdGhlcmUncyBubyBlcnJvciAqLworICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9XUklURSB8fCBzdGF0ZS0+ZXJyICE9IFpfT0spCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogbWFrZSBzdXJlIHdlIGhhdmUgc29tZSBidWZmZXIgc3BhY2UgKi8KKyAgICBpZiAoc3RhdGUtPnNpemUgPT0gMCAmJiBnel9pbml0KHN0YXRlKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBjaGVjayBmb3Igc2VlayByZXF1ZXN0ICovCisgICAgaWYgKHN0YXRlLT5zZWVrKSB7CisgICAgICAgIHN0YXRlLT5zZWVrID0gMDsKKyAgICAgICAgaWYgKGd6X3plcm8oc3RhdGUsIHN0YXRlLT5za2lwKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIGNvbnN1bWUgd2hhdGV2ZXIncyBsZWZ0IGluIHRoZSBpbnB1dCBidWZmZXIgKi8KKyAgICBpZiAoc3RybS0+YXZhaWxfaW4gJiYgZ3pfY29tcChzdGF0ZSwgWl9OT19GTFVTSCkgPT0gLTEpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogZG8gdGhlIHByaW50ZigpIGludG8gdGhlIGlucHV0IGJ1ZmZlciwgcHV0IGxlbmd0aCBpbiBsZW4gKi8KKyAgICBzaXplID0gKGludCkoc3RhdGUtPnNpemUpOworICAgIHN0YXRlLT5pbltzaXplIC0gMV0gPSAwOworI2lmZGVmIE5PX3ZzbnByaW50ZgorIyAgaWZkZWYgSEFTX3ZzcHJpbnRmX3ZvaWQKKyAgICAodm9pZCl2c3ByaW50ZigoY2hhciAqKShzdGF0ZS0+aW4pLCBmb3JtYXQsIHZhKTsKKyAgICBmb3IgKGxlbiA9IDA7IGxlbiA8IHNpemU7IGxlbisrKQorICAgICAgICBpZiAoc3RhdGUtPmluW2xlbl0gPT0gMCkgYnJlYWs7CisjICBlbHNlCisgICAgbGVuID0gdnNwcmludGYoKGNoYXIgKikoc3RhdGUtPmluKSwgZm9ybWF0LCB2YSk7CisjICBlbmRpZgorI2Vsc2UKKyMgIGlmZGVmIEhBU192c25wcmludGZfdm9pZAorICAgICh2b2lkKXZzbnByaW50ZigoY2hhciAqKShzdGF0ZS0+aW4pLCBzaXplLCBmb3JtYXQsIHZhKTsKKyAgICBsZW4gPSBzdHJsZW4oKGNoYXIgKikoc3RhdGUtPmluKSk7CisjICBlbHNlCisgICAgbGVuID0gdnNucHJpbnRmKChjaGFyICopKHN0YXRlLT5pbiksIHNpemUsIGZvcm1hdCwgdmEpOworIyAgZW5kaWYKKyNlbmRpZgorCisgICAgLyogY2hlY2sgdGhhdCBwcmludGYoKSByZXN1bHRzIGZpdCBpbiBidWZmZXIgKi8KKyAgICBpZiAobGVuIDw9IDAgfHwgbGVuID49IChpbnQpc2l6ZSB8fCBzdGF0ZS0+aW5bc2l6ZSAtIDFdICE9IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogdXBkYXRlIGJ1ZmZlciBhbmQgcG9zaXRpb24sIGRlZmVyIGNvbXByZXNzaW9uIHVudGlsIG5lZWRlZCAqLworICAgIHN0cm0tPmF2YWlsX2luID0gKHVuc2lnbmVkKWxlbjsKKyAgICBzdHJtLT5uZXh0X2luID0gc3RhdGUtPmluOworICAgIHN0YXRlLT54LnBvcyArPSBsZW47CisgICAgcmV0dXJuIGxlbjsKK30KKworaW50IFpFWFBPUlRWQSBnenByaW50ZihnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdCB2YTsKKyAgICBpbnQgcmV0OworCisgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CisgICAgcmV0ID0gZ3p2cHJpbnRmKGZpbGUsIGZvcm1hdCwgdmEpOworICAgIHZhX2VuZCh2YSk7CisgICAgcmV0dXJuIHJldDsKK30KKworI2Vsc2UgLyogIVNUREMgJiYgIVpfSEFWRV9TVERBUkdfSCAqLworCisvKiAtLSBzZWUgemxpYi5oIC0tICovCitpbnQgWkVYUE9SVFZBIGd6cHJpbnRmIChmaWxlLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwKKyAgICAgICAgICAgICAgICAgICAgICAgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKQorICAgIGd6RmlsZSBmaWxlOworICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKKyAgICBpbnQgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLAorICAgICAgICBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjA7Cit7CisgICAgaW50IHNpemUsIGxlbjsKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisgICAgel9zdHJlYW1wIHN0cm07CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworICAgIHN0cm0gPSAmKHN0YXRlLT5zdHJtKTsKKworICAgIC8qIGNoZWNrIHRoYXQgY2FuIHJlYWxseSBwYXNzIHBvaW50ZXIgaW4gaW50cyAqLworICAgIGlmIChzaXplb2YoaW50KSAhPSBzaXplb2Yodm9pZCAqKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHdyaXRpbmcgYW5kIHRoYXQgdGhlcmUncyBubyBlcnJvciAqLworICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9XUklURSB8fCBzdGF0ZS0+ZXJyICE9IFpfT0spCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogbWFrZSBzdXJlIHdlIGhhdmUgc29tZSBidWZmZXIgc3BhY2UgKi8KKyAgICBpZiAoc3RhdGUtPnNpemUgPT0gMCAmJiBnel9pbml0KHN0YXRlKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBjaGVjayBmb3Igc2VlayByZXF1ZXN0ICovCisgICAgaWYgKHN0YXRlLT5zZWVrKSB7CisgICAgICAgIHN0YXRlLT5zZWVrID0gMDsKKyAgICAgICAgaWYgKGd6X3plcm8oc3RhdGUsIHN0YXRlLT5za2lwKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIGNvbnN1bWUgd2hhdGV2ZXIncyBsZWZ0IGluIHRoZSBpbnB1dCBidWZmZXIgKi8KKyAgICBpZiAoc3RybS0+YXZhaWxfaW4gJiYgZ3pfY29tcChzdGF0ZSwgWl9OT19GTFVTSCkgPT0gLTEpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogZG8gdGhlIHByaW50ZigpIGludG8gdGhlIGlucHV0IGJ1ZmZlciwgcHV0IGxlbmd0aCBpbiBsZW4gKi8KKyAgICBzaXplID0gKGludCkoc3RhdGUtPnNpemUpOworICAgIHN0YXRlLT5pbltzaXplIC0gMV0gPSAwOworI2lmZGVmIE5PX3NucHJpbnRmCisjICBpZmRlZiBIQVNfc3ByaW50Zl92b2lkCisgICAgc3ByaW50ZigoY2hhciAqKShzdGF0ZS0+aW4pLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwKKyAgICAgICAgICAgIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCk7CisgICAgZm9yIChsZW4gPSAwOyBsZW4gPCBzaXplOyBsZW4rKykKKyAgICAgICAgaWYgKHN0YXRlLT5pbltsZW5dID09IDApIGJyZWFrOworIyAgZWxzZQorICAgIGxlbiA9IHNwcmludGYoKGNoYXIgKikoc3RhdGUtPmluKSwgZm9ybWF0LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsCisgICAgICAgICAgICAgICAgICBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjApOworIyAgZW5kaWYKKyNlbHNlCisjICBpZmRlZiBIQVNfc25wcmludGZfdm9pZAorICAgIHNucHJpbnRmKChjaGFyICopKHN0YXRlLT5pbiksIHNpemUsIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LAorICAgICAgICAgICAgIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCk7CisgICAgbGVuID0gc3RybGVuKChjaGFyICopKHN0YXRlLT5pbikpOworIyAgZWxzZQorICAgIGxlbiA9IHNucHJpbnRmKChjaGFyICopKHN0YXRlLT5pbiksIHNpemUsIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwKKyAgICAgICAgICAgICAgICAgICBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LAorICAgICAgICAgICAgICAgICAgIGExOSwgYTIwKTsKKyMgIGVuZGlmCisjZW5kaWYKKworICAgIC8qIGNoZWNrIHRoYXQgcHJpbnRmKCkgcmVzdWx0cyBmaXQgaW4gYnVmZmVyICovCisgICAgaWYgKGxlbiA8PSAwIHx8IGxlbiA+PSAoaW50KXNpemUgfHwgc3RhdGUtPmluW3NpemUgLSAxXSAhPSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIHVwZGF0ZSBidWZmZXIgYW5kIHBvc2l0aW9uLCBkZWZlciBjb21wcmVzc2lvbiB1bnRpbCBuZWVkZWQgKi8KKyAgICBzdHJtLT5hdmFpbF9pbiA9ICh1bnNpZ25lZClsZW47CisgICAgc3RybS0+bmV4dF9pbiA9IHN0YXRlLT5pbjsKKyAgICBzdGF0ZS0+eC5wb3MgKz0gbGVuOworICAgIHJldHVybiBsZW47Cit9CisKKyNlbmRpZgorCisvKiAtLSBzZWUgemxpYi5oIC0tICovCitpbnQgWkVYUE9SVCBnemZsdXNoKGZpbGUsIGZsdXNoKQorICAgIGd6RmlsZSBmaWxlOworICAgIGludCBmbHVzaDsKK3sKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworCisgICAgLyogY2hlY2sgdGhhdCB3ZSdyZSB3cml0aW5nIGFuZCB0aGF0IHRoZXJlJ3Mgbm8gZXJyb3IgKi8KKyAgICBpZiAoc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUgfHwgc3RhdGUtPmVyciAhPSBaX09LKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICAvKiBjaGVjayBmbHVzaCBwYXJhbWV0ZXIgKi8KKyAgICBpZiAoZmx1c2ggPCAwIHx8IGZsdXNoID4gWl9GSU5JU0gpCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKworICAgIC8qIGNoZWNrIGZvciBzZWVrIHJlcXVlc3QgKi8KKyAgICBpZiAoc3RhdGUtPnNlZWspIHsKKyAgICAgICAgc3RhdGUtPnNlZWsgPSAwOworICAgICAgICBpZiAoZ3pfemVybyhzdGF0ZSwgc3RhdGUtPnNraXApID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGNvbXByZXNzIHJlbWFpbmluZyBkYXRhIHdpdGggcmVxdWVzdGVkIGZsdXNoICovCisgICAgZ3pfY29tcChzdGF0ZSwgZmx1c2gpOworICAgIHJldHVybiBzdGF0ZS0+ZXJyOworfQorCisvKiAtLSBzZWUgemxpYi5oIC0tICovCitpbnQgWkVYUE9SVCBnenNldHBhcmFtcyhmaWxlLCBsZXZlbCwgc3RyYXRlZ3kpCisgICAgZ3pGaWxlIGZpbGU7CisgICAgaW50IGxldmVsOworICAgIGludCBzdHJhdGVneTsKK3sKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisgICAgel9zdHJlYW1wIHN0cm07CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworICAgIHN0cm0gPSAmKHN0YXRlLT5zdHJtKTsKKworICAgIC8qIGNoZWNrIHRoYXQgd2UncmUgd3JpdGluZyBhbmQgdGhhdCB0aGVyZSdzIG5vIGVycm9yICovCisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1dSSVRFIHx8IHN0YXRlLT5lcnIgIT0gWl9PSykKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgLyogaWYgbm8gY2hhbmdlIGlzIHJlcXVlc3RlZCwgdGhlbiBkbyBub3RoaW5nICovCisgICAgaWYgKGxldmVsID09IHN0YXRlLT5sZXZlbCAmJiBzdHJhdGVneSA9PSBzdGF0ZS0+c3RyYXRlZ3kpCisgICAgICAgIHJldHVybiBaX09LOworCisgICAgLyogY2hlY2sgZm9yIHNlZWsgcmVxdWVzdCAqLworICAgIGlmIChzdGF0ZS0+c2VlaykgeworICAgICAgICBzdGF0ZS0+c2VlayA9IDA7CisgICAgICAgIGlmIChnel96ZXJvKHN0YXRlLCBzdGF0ZS0+c2tpcCkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogY2hhbmdlIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgZm9yIHN1YnNlcXVlbnQgaW5wdXQgKi8KKyAgICBpZiAoc3RhdGUtPnNpemUpIHsKKyAgICAgICAgLyogZmx1c2ggcHJldmlvdXMgaW5wdXQgd2l0aCBwcmV2aW91cyBwYXJhbWV0ZXJzIGJlZm9yZSBjaGFuZ2luZyAqLworICAgICAgICBpZiAoc3RybS0+YXZhaWxfaW4gJiYgZ3pfY29tcChzdGF0ZSwgWl9QQVJUSUFMX0ZMVVNIKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBzdGF0ZS0+ZXJyOworICAgICAgICBkZWZsYXRlUGFyYW1zKHN0cm0sIGxldmVsLCBzdHJhdGVneSk7CisgICAgfQorICAgIHN0YXRlLT5sZXZlbCA9IGxldmVsOworICAgIHN0YXRlLT5zdHJhdGVneSA9IHN0cmF0ZWd5OworICAgIHJldHVybiBaX09LOworfQorCisvKiAtLSBzZWUgemxpYi5oIC0tICovCitpbnQgWkVYUE9SVCBnemNsb3NlX3coZmlsZSkKKyAgICBnekZpbGUgZmlsZTsKK3sKKyAgICBpbnQgcmV0ID0gWl9PSzsKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworCisgICAgLyogY2hlY2sgdGhhdCB3ZSdyZSB3cml0aW5nICovCisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1dSSVRFKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICAvKiBjaGVjayBmb3Igc2VlayByZXF1ZXN0ICovCisgICAgaWYgKHN0YXRlLT5zZWVrKSB7CisgICAgICAgIHN0YXRlLT5zZWVrID0gMDsKKyAgICAgICAgaWYgKGd6X3plcm8oc3RhdGUsIHN0YXRlLT5za2lwKSA9PSAtMSkKKyAgICAgICAgICAgIHJldCA9IHN0YXRlLT5lcnI7CisgICAgfQorCisgICAgLyogZmx1c2gsIGZyZWUgbWVtb3J5LCBhbmQgY2xvc2UgZmlsZSAqLworICAgIGlmIChnel9jb21wKHN0YXRlLCBaX0ZJTklTSCkgPT0gLTEpCisgICAgICAgIHJldCA9IHN0YXRlLT5lcnI7CisgICAgaWYgKHN0YXRlLT5zaXplKSB7CisgICAgICAgIGlmICghc3RhdGUtPmRpcmVjdCkgeworICAgICAgICAgICAgKHZvaWQpZGVmbGF0ZUVuZCgmKHN0YXRlLT5zdHJtKSk7CisgICAgICAgICAgICBmcmVlKHN0YXRlLT5vdXQpOworICAgICAgICB9CisgICAgICAgIGZyZWUoc3RhdGUtPmluKTsKKyAgICB9CisgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfT0ssIE5VTEwpOworICAgIGZyZWUoc3RhdGUtPnBhdGgpOworICAgIGlmIChjbG9zZShzdGF0ZS0+ZmQpID09IC0xKQorICAgICAgICByZXQgPSBaX0VSUk5POworICAgIGZyZWUoc3RhdGUpOworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS96bGliL3NyYy9pbmZiYWNrLmMgYi96bGliL3NyYy9pbmZiYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM4MzNjMgotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2luZmJhY2suYwpAQCAtMCwwICsxLDY0MCBAQAorLyogaW5mYmFjay5jIC0tIGluZmxhdGUgdXNpbmcgYSBjYWxsLWJhY2sgaW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMSBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyoKKyAgIFRoaXMgY29kZSBpcyBsYXJnZWx5IGNvcGllZCBmcm9tIGluZmxhdGUuYy4gIE5vcm1hbGx5IGVpdGhlciBpbmZiYWNrLm8gb3IKKyAgIGluZmxhdGUubyB3b3VsZCBiZSBsaW5rZWQgaW50byBhbiBhcHBsaWNhdGlvbi0tbm90IGJvdGguICBUaGUgaW50ZXJmYWNlCisgICB3aXRoIGluZmZhc3QuYyBpcyByZXRhaW5lZCBzbyB0aGF0IG9wdGltaXplZCBhc3NlbWJsZXItY29kZWQgdmVyc2lvbnMgb2YKKyAgIGluZmxhdGVfZmFzdCgpIGNhbiBiZSB1c2VkIHdpdGggZWl0aGVyIGluZmxhdGUuYyBvciBpbmZiYWNrLmMuCisgKi8KKworI2luY2x1ZGUgInp1dGlsLmgiCisjaW5jbHVkZSAiaW5mdHJlZXMuaCIKKyNpbmNsdWRlICJpbmZsYXRlLmgiCisjaW5jbHVkZSAiaW5mZmFzdC5oIgorCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCitsb2NhbCB2b2lkIGZpeGVkdGFibGVzIE9GKChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlKSk7CisKKy8qCisgICBzdHJtIHByb3ZpZGVzIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyBpbiB6YWxsb2MgYW5kIHpmcmVlLCBvcgorICAgWl9OVUxMIHRvIHVzZSB0aGUgbGlicmFyeSBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCisKKyAgIHdpbmRvd0JpdHMgaXMgaW4gdGhlIHJhbmdlIDguLjE1LCBhbmQgd2luZG93IGlzIGEgdXNlci1zdXBwbGllZAorICAgd2luZG93IGFuZCBvdXRwdXQgYnVmZmVyIHRoYXQgaXMgMioqd2luZG93Qml0cyBieXRlcy4KKyAqLworaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2tJbml0XyhzdHJtLCB3aW5kb3dCaXRzLCB3aW5kb3csIHZlcnNpb24sIHN0cmVhbV9zaXplKQorel9zdHJlYW1wIHN0cm07CitpbnQgd2luZG93Qml0czsKK3Vuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3c7Citjb25zdCBjaGFyICp2ZXJzaW9uOworaW50IHN0cmVhbV9zaXplOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisKKyAgICBpZiAodmVyc2lvbiA9PSBaX05VTEwgfHwgdmVyc2lvblswXSAhPSBaTElCX1ZFUlNJT05bMF0gfHwKKyAgICAgICAgc3RyZWFtX3NpemUgIT0gKGludCkoc2l6ZW9mKHpfc3RyZWFtKSkpCisgICAgICAgIHJldHVybiBaX1ZFUlNJT05fRVJST1I7CisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHdpbmRvdyA9PSBaX05VTEwgfHwKKyAgICAgICAgd2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1KQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RybS0+bXNnID0gWl9OVUxMOyAgICAgICAgICAgICAgICAgLyogaW4gY2FzZSB3ZSByZXR1cm4gYW4gZXJyb3IgKi8KKyAgICBpZiAoc3RybS0+emFsbG9jID09IChhbGxvY19mdW5jKTApIHsKKyNpZmRlZiBaX1NPTE8KKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworI2Vsc2UKKyAgICAgICAgc3RybS0+emFsbG9jID0gemNhbGxvYzsKKyAgICAgICAgc3RybS0+b3BhcXVlID0gKHZvaWRwZikwOworI2VuZGlmCisgICAgfQorICAgIGlmIChzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTApCisjaWZkZWYgWl9TT0xPCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyNlbHNlCisgICAgc3RybS0+emZyZWUgPSB6Y2ZyZWU7CisjZW5kaWYKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilaQUxMT0Moc3RybSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX3N0YXRlKSk7CisgICAgaWYgKHN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SOworICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogYWxsb2NhdGVkXG4iKSk7CisgICAgc3RybS0+c3RhdGUgPSAoc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqKXN0YXRlOworICAgIHN0YXRlLT5kbWF4ID0gMzI3NjhVOworICAgIHN0YXRlLT53Yml0cyA9IHdpbmRvd0JpdHM7CisgICAgc3RhdGUtPndzaXplID0gMVUgPDwgd2luZG93Qml0czsKKyAgICBzdGF0ZS0+d2luZG93ID0gd2luZG93OworICAgIHN0YXRlLT53bmV4dCA9IDA7CisgICAgc3RhdGUtPndoYXZlID0gMDsKKyAgICByZXR1cm4gWl9PSzsKK30KKworLyoKKyAgIFJldHVybiBzdGF0ZSB3aXRoIGxlbmd0aCBhbmQgZGlzdGFuY2UgZGVjb2RpbmcgdGFibGVzIGFuZCBpbmRleCBzaXplcyBzZXQgdG8KKyAgIGZpeGVkIGNvZGUgZGVjb2RpbmcuICBOb3JtYWxseSB0aGlzIHJldHVybnMgZml4ZWQgdGFibGVzIGZyb20gaW5mZml4ZWQuaC4KKyAgIElmIEJVSUxERklYRUQgaXMgZGVmaW5lZCwgdGhlbiBpbnN0ZWFkIHRoaXMgcm91dGluZSBidWlsZHMgdGhlIHRhYmxlcyB0aGUKKyAgIGZpcnN0IHRpbWUgaXQncyBjYWxsZWQsIGFuZCByZXR1cm5zIHRob3NlIHRhYmxlcyB0aGUgZmlyc3QgdGltZSBhbmQKKyAgIHRoZXJlYWZ0ZXIuICBUaGlzIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIGNvZGUgYnkgYWJvdXQgMksgYnl0ZXMsIGluCisgICBleGNoYW5nZSBmb3IgYSBsaXR0bGUgZXhlY3V0aW9uIHRpbWUuICBIb3dldmVyLCBCVUlMREZJWEVEIHNob3VsZCBub3QgYmUKKyAgIHVzZWQgZm9yIHRocmVhZGVkIGFwcGxpY2F0aW9ucywgc2luY2UgdGhlIHJld3JpdGluZyBvZiB0aGUgdGFibGVzIGFuZCB2aXJnaW4KKyAgIG1heSBub3QgYmUgdGhyZWFkLXNhZmUuCisgKi8KK2xvY2FsIHZvaWQgZml4ZWR0YWJsZXMoc3RhdGUpCitzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworeworI2lmZGVmIEJVSUxERklYRUQKKyAgICBzdGF0aWMgaW50IHZpcmdpbiA9IDE7CisgICAgc3RhdGljIGNvZGUgKmxlbmZpeCwgKmRpc3RmaXg7CisgICAgc3RhdGljIGNvZGUgZml4ZWRbNTQ0XTsKKworICAgIC8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdGFibGVzIGlmIGZpcnN0IGNhbGwgKG1heSBub3QgYmUgdGhyZWFkIHNhZmUpICovCisgICAgaWYgKHZpcmdpbikgeworICAgICAgICB1bnNpZ25lZCBzeW0sIGJpdHM7CisgICAgICAgIHN0YXRpYyBjb2RlICpuZXh0OworCisgICAgICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRhYmxlICovCisgICAgICAgIHN5bSA9IDA7CisgICAgICAgIHdoaWxlIChzeW0gPCAxNDQpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDg7CisgICAgICAgIHdoaWxlIChzeW0gPCAyNTYpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDk7CisgICAgICAgIHdoaWxlIChzeW0gPCAyODApIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDc7CisgICAgICAgIHdoaWxlIChzeW0gPCAyODgpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDg7CisgICAgICAgIG5leHQgPSBmaXhlZDsKKyAgICAgICAgbGVuZml4ID0gbmV4dDsKKyAgICAgICAgYml0cyA9IDk7CisgICAgICAgIGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUtPmxlbnMsIDI4OCwgJihuZXh0KSwgJihiaXRzKSwgc3RhdGUtPndvcmspOworCisgICAgICAgIC8qIGRpc3RhbmNlIHRhYmxlICovCisgICAgICAgIHN5bSA9IDA7CisgICAgICAgIHdoaWxlIChzeW0gPCAzMikgc3RhdGUtPmxlbnNbc3ltKytdID0gNTsKKyAgICAgICAgZGlzdGZpeCA9IG5leHQ7CisgICAgICAgIGJpdHMgPSA1OworICAgICAgICBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS0+bGVucywgMzIsICYobmV4dCksICYoYml0cyksIHN0YXRlLT53b3JrKTsKKworICAgICAgICAvKiBkbyB0aGlzIGp1c3Qgb25jZSAqLworICAgICAgICB2aXJnaW4gPSAwOworICAgIH0KKyNlbHNlIC8qICFCVUlMREZJWEVEICovCisjICAgaW5jbHVkZSAiaW5mZml4ZWQuaCIKKyNlbmRpZiAvKiBCVUlMREZJWEVEICovCisgICAgc3RhdGUtPmxlbmNvZGUgPSBsZW5maXg7CisgICAgc3RhdGUtPmxlbmJpdHMgPSA5OworICAgIHN0YXRlLT5kaXN0Y29kZSA9IGRpc3RmaXg7CisgICAgc3RhdGUtPmRpc3RiaXRzID0gNTsKK30KKworLyogTWFjcm9zIGZvciBpbmZsYXRlQmFjaygpOiAqLworCisvKiBMb2FkIHJldHVybmVkIHN0YXRlIGZyb20gaW5mbGF0ZV9mYXN0KCkgKi8KKyNkZWZpbmUgTE9BRCgpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgcHV0ID0gc3RybS0+bmV4dF9vdXQ7IFwKKyAgICAgICAgbGVmdCA9IHN0cm0tPmF2YWlsX291dDsgXAorICAgICAgICBuZXh0ID0gc3RybS0+bmV4dF9pbjsgXAorICAgICAgICBoYXZlID0gc3RybS0+YXZhaWxfaW47IFwKKyAgICAgICAgaG9sZCA9IHN0YXRlLT5ob2xkOyBcCisgICAgICAgIGJpdHMgPSBzdGF0ZS0+Yml0czsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIFNldCBzdGF0ZSBmcm9tIHJlZ2lzdGVycyBmb3IgaW5mbGF0ZV9mYXN0KCkgKi8KKyNkZWZpbmUgUkVTVE9SRSgpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgc3RybS0+bmV4dF9vdXQgPSBwdXQ7IFwKKyAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gbGVmdDsgXAorICAgICAgICBzdHJtLT5uZXh0X2luID0gbmV4dDsgXAorICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IGhhdmU7IFwKKyAgICAgICAgc3RhdGUtPmhvbGQgPSBob2xkOyBcCisgICAgICAgIHN0YXRlLT5iaXRzID0gYml0czsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIENsZWFyIHRoZSBpbnB1dCBiaXQgYWNjdW11bGF0b3IgKi8KKyNkZWZpbmUgSU5JVEJJVFMoKSBcCisgICAgZG8geyBcCisgICAgICAgIGhvbGQgPSAwOyBcCisgICAgICAgIGJpdHMgPSAwOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogQXNzdXJlIHRoYXQgc29tZSBpbnB1dCBpcyBhdmFpbGFibGUuICBJZiBpbnB1dCBpcyByZXF1ZXN0ZWQsIGJ1dCBkZW5pZWQsCisgICB0aGVuIHJldHVybiBhIFpfQlVGX0VSUk9SIGZyb20gaW5mbGF0ZUJhY2soKS4gKi8KKyNkZWZpbmUgUFVMTCgpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaWYgKGhhdmUgPT0gMCkgeyBcCisgICAgICAgICAgICBoYXZlID0gaW4oaW5fZGVzYywgJm5leHQpOyBcCisgICAgICAgICAgICBpZiAoaGF2ZSA9PSAwKSB7IFwKKyAgICAgICAgICAgICAgICBuZXh0ID0gWl9OVUxMOyBcCisgICAgICAgICAgICAgICAgcmV0ID0gWl9CVUZfRVJST1I7IFwKKyAgICAgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUgKDApCisKKy8qIEdldCBhIGJ5dGUgb2YgaW5wdXQgaW50byB0aGUgYml0IGFjY3VtdWxhdG9yLCBvciByZXR1cm4gZnJvbSBpbmZsYXRlQmFjaygpCisgICB3aXRoIGFuIGVycm9yIGlmIHRoZXJlIGlzIG5vIGlucHV0IGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgUFVMTEJZVEUoKSBcCisgICAgZG8geyBcCisgICAgICAgIFBVTEwoKTsgXAorICAgICAgICBoYXZlLS07IFwKKyAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoKm5leHQrKykgPDwgYml0czsgXAorICAgICAgICBiaXRzICs9IDg7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBBc3N1cmUgdGhhdCB0aGVyZSBhcmUgYXQgbGVhc3QgbiBiaXRzIGluIHRoZSBiaXQgYWNjdW11bGF0b3IuICBJZiB0aGVyZSBpcworICAgbm90IGVub3VnaCBhdmFpbGFibGUgaW5wdXQgdG8gZG8gdGhhdCwgdGhlbiByZXR1cm4gZnJvbSBpbmZsYXRlQmFjaygpIHdpdGgKKyAgIGFuIGVycm9yLiAqLworI2RlZmluZSBORUVEQklUUyhuKSBcCisgICAgZG8geyBcCisgICAgICAgIHdoaWxlIChiaXRzIDwgKHVuc2lnbmVkKShuKSkgXAorICAgICAgICAgICAgUFVMTEJZVEUoKTsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIFJldHVybiB0aGUgbG93IG4gYml0cyBvZiB0aGUgYml0IGFjY3VtdWxhdG9yIChuIDwgMTYpICovCisjZGVmaW5lIEJJVFMobikgXAorICAgICgodW5zaWduZWQpaG9sZCAmICgoMVUgPDwgKG4pKSAtIDEpKQorCisvKiBSZW1vdmUgbiBiaXRzIGZyb20gdGhlIGJpdCBhY2N1bXVsYXRvciAqLworI2RlZmluZSBEUk9QQklUUyhuKSBcCisgICAgZG8geyBcCisgICAgICAgIGhvbGQgPj49IChuKTsgXAorICAgICAgICBiaXRzIC09ICh1bnNpZ25lZCkobik7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBSZW1vdmUgemVybyB0byBzZXZlbiBiaXRzIGFzIG5lZWRlZCB0byBnbyB0byBhIGJ5dGUgYm91bmRhcnkgKi8KKyNkZWZpbmUgQllURUJJVFMoKSBcCisgICAgZG8geyBcCisgICAgICAgIGhvbGQgPj49IGJpdHMgJiA3OyBcCisgICAgICAgIGJpdHMgLT0gYml0cyAmIDc7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBBc3N1cmUgdGhhdCBzb21lIG91dHB1dCBzcGFjZSBpcyBhdmFpbGFibGUsIGJ5IHdyaXRpbmcgb3V0IHRoZSB3aW5kb3cKKyAgIGlmIGl0J3MgZnVsbC4gIElmIHRoZSB3cml0ZSBmYWlscywgcmV0dXJuIGZyb20gaW5mbGF0ZUJhY2soKSB3aXRoIGEKKyAgIFpfQlVGX0VSUk9SLiAqLworI2RlZmluZSBST09NKCkgXAorICAgIGRvIHsgXAorICAgICAgICBpZiAobGVmdCA9PSAwKSB7IFwKKyAgICAgICAgICAgIHB1dCA9IHN0YXRlLT53aW5kb3c7IFwKKyAgICAgICAgICAgIGxlZnQgPSBzdGF0ZS0+d3NpemU7IFwKKyAgICAgICAgICAgIHN0YXRlLT53aGF2ZSA9IGxlZnQ7IFwKKyAgICAgICAgICAgIGlmIChvdXQob3V0X2Rlc2MsIHB1dCwgbGVmdCkpIHsgXAorICAgICAgICAgICAgICAgIHJldCA9IFpfQlVGX0VSUk9SOyBcCisgICAgICAgICAgICAgICAgZ290byBpbmZfbGVhdmU7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICB9IHdoaWxlICgwKQorCisvKgorICAgc3RybSBwcm92aWRlcyB0aGUgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIGFuZCB3aW5kb3cgYnVmZmVyIG9uIGlucHV0LAorICAgYW5kIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIHRoZSB1bnVzZWQgaW5wdXQgb24gcmV0dXJuLiAgRm9yIFpfREFUQV9FUlJPUgorICAgcmV0dXJucywgc3RybSB3aWxsIGFsc28gcHJvdmlkZSBhbiBlcnJvciBtZXNzYWdlLgorCisgICBpbigpIGFuZCBvdXQoKSBhcmUgdGhlIGNhbGwtYmFjayBpbnB1dCBhbmQgb3V0cHV0IGZ1bmN0aW9ucy4gIFdoZW4KKyAgIGluZmxhdGVCYWNrKCkgbmVlZHMgbW9yZSBpbnB1dCwgaXQgY2FsbHMgaW4oKS4gIFdoZW4gaW5mbGF0ZUJhY2soKSBoYXMKKyAgIGZpbGxlZCB0aGUgd2luZG93IHdpdGggb3V0cHV0LCBvciB3aGVuIGl0IGNvbXBsZXRlcyB3aXRoIGRhdGEgaW4gdGhlCisgICB3aW5kb3csIGl0IGNhbGxzIG91dCgpIHRvIHdyaXRlIG91dCB0aGUgZGF0YS4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IG5vdAorICAgY2hhbmdlIHRoZSBwcm92aWRlZCBpbnB1dCB1bnRpbCBpbigpIGlzIGNhbGxlZCBhZ2FpbiBvciBpbmZsYXRlQmFjaygpCisgICByZXR1cm5zLiAgVGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IGNoYW5nZSB0aGUgd2luZG93L291dHB1dCBidWZmZXIgdW50aWwKKyAgIGluZmxhdGVCYWNrKCkgcmV0dXJucy4KKworICAgaW4oKSBhbmQgb3V0KCkgYXJlIGNhbGxlZCB3aXRoIGEgZGVzY3JpcHRvciBwYXJhbWV0ZXIgcHJvdmlkZWQgaW4gdGhlCisgICBpbmZsYXRlQmFjaygpIGNhbGwuICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBzdHJ1Y3R1cmUgdGhhdCBwcm92aWRlcyB0aGUKKyAgIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGRvIHRoZSByZWFkIG9yIHdyaXRlLCBhcyB3ZWxsIGFzIGFjY3VtdWxhdGVkCisgICBpbmZvcm1hdGlvbiBvbiB0aGUgaW5wdXQgYW5kIG91dHB1dCBzdWNoIGFzIHRvdGFscyBhbmQgY2hlY2sgdmFsdWVzLgorCisgICBpbigpIHNob3VsZCByZXR1cm4gemVybyBvbiBmYWlsdXJlLiAgb3V0KCkgc2hvdWxkIHJldHVybiBub24temVybyBvbgorICAgZmFpbHVyZS4gIElmIGVpdGhlciBpbigpIG9yIG91dCgpIGZhaWxzLCB0aGFuIGluZmxhdGVCYWNrKCkgcmV0dXJucyBhCisgICBaX0JVRl9FUlJPUi4gIHN0cm0tPm5leHRfaW4gY2FuIGJlIGNoZWNrZWQgZm9yIFpfTlVMTCB0byBzZWUgd2hldGhlciBpdAorICAgd2FzIGluKCkgb3Igb3V0KCkgdGhhdCBjYXVzZWQgaW4gdGhlIGVycm9yLiAgT3RoZXJ3aXNlLCAgaW5mbGF0ZUJhY2soKQorICAgcmV0dXJucyBaX1NUUkVBTV9FTkQgb24gc3VjY2VzcywgWl9EQVRBX0VSUk9SIGZvciBhbiBkZWZsYXRlIGZvcm1hdAorICAgZXJyb3IsIG9yIFpfTUVNX0VSUk9SIGlmIGl0IGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzdGF0ZS4KKyAgIGluZmxhdGVCYWNrKCkgY2FuIGFsc28gcmV0dXJuIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCisgICBhcmUgbm90IGNvcnJlY3QsIGkuZS4gc3RybSBpcyBaX05VTEwgb3IgdGhlIHN0YXRlIHdhcyBub3QgaW5pdGlhbGl6ZWQuCisgKi8KK2ludCBaRVhQT1JUIGluZmxhdGVCYWNrKHN0cm0sIGluLCBpbl9kZXNjLCBvdXQsIG91dF9kZXNjKQorel9zdHJlYW1wIHN0cm07Citpbl9mdW5jIGluOwordm9pZCBGQVIgKmluX2Rlc2M7CitvdXRfZnVuYyBvdXQ7Cit2b2lkIEZBUiAqb3V0X2Rlc2M7Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKyAgICB6X2NvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICpuZXh0OyAgICAvKiBuZXh0IGlucHV0ICovCisgICAgdW5zaWduZWQgY2hhciBGQVIgKnB1dDsgICAgIC8qIG5leHQgb3V0cHV0ICovCisgICAgdW5zaWduZWQgaGF2ZSwgbGVmdDsgICAgICAgIC8qIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovCisgICAgdW5zaWduZWQgbG9uZyBob2xkOyAgICAgICAgIC8qIGJpdCBidWZmZXIgKi8KKyAgICB1bnNpZ25lZCBiaXRzOyAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovCisgICAgdW5zaWduZWQgY29weTsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdG9yZWQgb3IgbWF0Y2ggYnl0ZXMgdG8gY29weSAqLworICAgIHVuc2lnbmVkIGNoYXIgRkFSICpmcm9tOyAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGJ5dGVzIGZyb20gKi8KKyAgICBjb2RlIGhlcmU7ICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBkZWNvZGluZyB0YWJsZSBlbnRyeSAqLworICAgIGNvZGUgbGFzdDsgICAgICAgICAgICAgICAgICAvKiBwYXJlbnQgdGFibGUgZW50cnkgKi8KKyAgICB1bnNpZ25lZCBsZW47ICAgICAgICAgICAgICAgLyogbGVuZ3RoIHRvIGNvcHkgZm9yIHJlcGVhdHMsIGJpdHMgdG8gZHJvcCAqLworICAgIGludCByZXQ7ICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gY29kZSAqLworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBvcmRlclsxOV0gPSAvKiBwZXJtdXRhdGlvbiBvZiBjb2RlIGxlbmd0aHMgKi8KKyAgICAgICAgezE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTV9OworCisgICAgLyogQ2hlY2sgdGhhdCB0aGUgc3RybSBleGlzdHMgYW5kIHRoYXQgdGhlIHN0YXRlIHdhcyBpbml0aWFsaXplZCAqLworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKworICAgIC8qIFJlc2V0IHRoZSBzdGF0ZSAqLworICAgIHN0cm0tPm1zZyA9IFpfTlVMTDsKKyAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgc3RhdGUtPmxhc3QgPSAwOworICAgIHN0YXRlLT53aGF2ZSA9IDA7CisgICAgbmV4dCA9IHN0cm0tPm5leHRfaW47CisgICAgaGF2ZSA9IG5leHQgIT0gWl9OVUxMID8gc3RybS0+YXZhaWxfaW4gOiAwOworICAgIGhvbGQgPSAwOworICAgIGJpdHMgPSAwOworICAgIHB1dCA9IHN0YXRlLT53aW5kb3c7CisgICAgbGVmdCA9IHN0YXRlLT53c2l6ZTsKKworICAgIC8qIEluZmxhdGUgdW50aWwgZW5kIG9mIGJsb2NrIG1hcmtlZCBhcyBsYXN0ICovCisgICAgZm9yICg7OykKKyAgICAgICAgc3dpdGNoIChzdGF0ZS0+bW9kZSkgeworICAgICAgICBjYXNlIFRZUEU6CisgICAgICAgICAgICAvKiBkZXRlcm1pbmUgYW5kIGRpc3BhdGNoIGJsb2NrIHR5cGUgKi8KKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bGFzdCkgeworICAgICAgICAgICAgICAgIEJZVEVCSVRTKCk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBET05FOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTkVFREJJVFMoMyk7CisgICAgICAgICAgICBzdGF0ZS0+bGFzdCA9IEJJVFMoMSk7CisgICAgICAgICAgICBEUk9QQklUUygxKTsKKyAgICAgICAgICAgIHN3aXRjaCAoQklUUygyKSkgeworICAgICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmVkIGJsb2NrICovCisgICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgc3RvcmVkIGJsb2NrJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGFzdCA/ICIgKGxhc3QpIiA6ICIiKSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBTVE9SRUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXhlZCBibG9jayAqLworICAgICAgICAgICAgICAgIGZpeGVkdGFibGVzKHN0YXRlKTsKKyAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICBmaXhlZCBjb2RlcyBibG9jayVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOOyAgICAgICAgICAgICAgLyogZGVjb2RlIGNvZGVzICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljIGJsb2NrICovCisgICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgZHluYW1pYyBjb2RlcyBibG9jayVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVEFCTEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBibG9jayB0eXBlIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERST1BCSVRTKDIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTVE9SRUQ6CisgICAgICAgICAgICAvKiBnZXQgYW5kIHZlcmlmeSBzdG9yZWQgYmxvY2sgbGVuZ3RoICovCisgICAgICAgICAgICBCWVRFQklUUygpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnbyB0byBieXRlIGJvdW5kYXJ5ICovCisgICAgICAgICAgICBORUVEQklUUygzMik7CisgICAgICAgICAgICBpZiAoKGhvbGQgJiAweGZmZmYpICE9ICgoaG9sZCA+PiAxNikgXiAweGZmZmYpKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocyI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoID0gKHVuc2lnbmVkKWhvbGQgJiAweGZmZmY7CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHN0b3JlZCBsZW5ndGggJXVcbiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGgpKTsKKyAgICAgICAgICAgIElOSVRCSVRTKCk7CisKKyAgICAgICAgICAgIC8qIGNvcHkgc3RvcmVkIGJsb2NrIGZyb20gaW5wdXQgdG8gb3V0cHV0ICovCisgICAgICAgICAgICB3aGlsZSAoc3RhdGUtPmxlbmd0aCAhPSAwKSB7CisgICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICAgICAgUFVMTCgpOworICAgICAgICAgICAgICAgIFJPT00oKTsKKyAgICAgICAgICAgICAgICBpZiAoY29weSA+IGhhdmUpIGNvcHkgPSBoYXZlOworICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgY29weSA9IGxlZnQ7CisgICAgICAgICAgICAgICAgem1lbWNweShwdXQsIG5leHQsIGNvcHkpOworICAgICAgICAgICAgICAgIGhhdmUgLT0gY29weTsKKyAgICAgICAgICAgICAgICBuZXh0ICs9IGNvcHk7CisgICAgICAgICAgICAgICAgbGVmdCAtPSBjb3B5OworICAgICAgICAgICAgICAgIHB1dCArPSBjb3B5OworICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggLT0gY29weTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgc3RvcmVkIGVuZFxuIikpOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBUQUJMRToKKyAgICAgICAgICAgIC8qIGdldCBkeW5hbWljIHRhYmxlIGVudHJpZXMgZGVzY3JpcHRvciAqLworICAgICAgICAgICAgTkVFREJJVFMoMTQpOworICAgICAgICAgICAgc3RhdGUtPm5sZW4gPSBCSVRTKDUpICsgMjU3OworICAgICAgICAgICAgRFJPUEJJVFMoNSk7CisgICAgICAgICAgICBzdGF0ZS0+bmRpc3QgPSBCSVRTKDUpICsgMTsKKyAgICAgICAgICAgIERST1BCSVRTKDUpOworICAgICAgICAgICAgc3RhdGUtPm5jb2RlID0gQklUUyg0KSArIDQ7CisgICAgICAgICAgICBEUk9QQklUUyg0KTsKKyNpZm5kZWYgUEtaSVBfQlVHX1dPUktBUk9VTkQKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bmxlbiA+IDI4NiB8fCBzdGF0ZS0+bmRpc3QgPiAzMCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInRvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xuIikpOworCisgICAgICAgICAgICAvKiBnZXQgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzIChub3QgYSB0eXBvKSAqLworICAgICAgICAgICAgc3RhdGUtPmhhdmUgPSAwOworICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgc3RhdGUtPm5jb2RlKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoMyk7CisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbb3JkZXJbc3RhdGUtPmhhdmUrK11dID0gKHVuc2lnbmVkIHNob3J0KUJJVFMoMyk7CisgICAgICAgICAgICAgICAgRFJPUEJJVFMoMyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoc3RhdGUtPmhhdmUgPCAxOSkKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tvcmRlcltzdGF0ZS0+aGF2ZSsrXV0gPSAwOworICAgICAgICAgICAgc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7CisgICAgICAgICAgICBzdGF0ZS0+bGVuY29kZSA9IChjb2RlIGNvbnN0IEZBUiAqKShzdGF0ZS0+bmV4dCk7CisgICAgICAgICAgICBzdGF0ZS0+bGVuYml0cyA9IDc7CisgICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKENPREVTLCBzdGF0ZS0+bGVucywgMTksICYoc3RhdGUtPm5leHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHN0YXRlLT5sZW5iaXRzKSwgc3RhdGUtPndvcmspOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgY29kZSBsZW5ndGhzIHNldCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIGNvZGUgbGVuZ3RocyBva1xuIikpOworCisgICAgICAgICAgICAvKiBnZXQgbGVuZ3RoIGFuZCBkaXN0YW5jZSBjb2RlIGNvZGUgbGVuZ3RocyAqLworICAgICAgICAgICAgc3RhdGUtPmhhdmUgPSAwOworICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgc3RhdGUtPm5sZW4gKyBzdGF0ZS0+bmRpc3QpIHsKKyAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+bGVuY29kZVtCSVRTKHN0YXRlLT5sZW5iaXRzKV07CisgICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoZXJlLnZhbCA8IDE2KSB7CisgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gaGVyZS52YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGVyZS52YWwgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKGhlcmUuYml0cyArIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAodW5zaWduZWQpKHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlIC0gMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDMgKyBCSVRTKDIpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaGVyZS52YWwgPT0gMTcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKGhlcmUuYml0cyArIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMyArIEJJVFMoMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUygzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKGhlcmUuYml0cyArIDcpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMTEgKyBCSVRTKDcpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoNyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oYXZlICsgY29weSA+IHN0YXRlLT5ubGVuICsgc3RhdGUtPm5kaXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvcHktLSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gKHVuc2lnbmVkIHNob3J0KWxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGhhbmRsZSBlcnJvciBicmVha3MgaW4gd2hpbGUgKi8KKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBCQUQpIGJyZWFrOworCisgICAgICAgICAgICAvKiBjaGVjayBmb3IgZW5kLW9mLWJsb2NrIGNvZGUgKGJldHRlciBoYXZlIG9uZSkgKi8KKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bGVuc1syNTZdID09IDApIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2siOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBidWlsZCBjb2RlIHRhYmxlcyAtLSBub3RlOiBkbyBub3QgY2hhbmdlIHRoZSBsZW5iaXRzIG9yIGRpc3RiaXRzCisgICAgICAgICAgICAgICB2YWx1ZXMgaGVyZSAoOSBhbmQgNikgd2l0aG91dCByZWFkaW5nIHRoZSBjb21tZW50cyBpbiBpbmZ0cmVlcy5oCisgICAgICAgICAgICAgICBjb25jZXJuaW5nIHRoZSBFTk9VR0ggY29uc3RhbnRzLCB3aGljaCBkZXBlbmQgb24gdGhvc2UgdmFsdWVzICovCisgICAgICAgICAgICBzdGF0ZS0+bmV4dCA9IHN0YXRlLT5jb2RlczsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5jb2RlID0gKGNvZGUgY29uc3QgRkFSICopKHN0YXRlLT5uZXh0KTsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5iaXRzID0gOTsKKyAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUtPmxlbnMsIHN0YXRlLT5ubGVuLCAmKHN0YXRlLT5uZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bGVuYml0cyksIHN0YXRlLT53b3JrKTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmRpc3Rjb2RlID0gKGNvZGUgY29uc3QgRkFSICopKHN0YXRlLT5uZXh0KTsKKyAgICAgICAgICAgIHN0YXRlLT5kaXN0Yml0cyA9IDY7CisgICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS0+bGVucyArIHN0YXRlLT5ubGVuLCBzdGF0ZS0+bmRpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bmV4dCksICYoc3RhdGUtPmRpc3RiaXRzKSwgc3RhdGUtPndvcmspOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2VzIHNldCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIGNvZGVzIG9rXG4iKSk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTjsKKworICAgICAgICBjYXNlIExFTjoKKyAgICAgICAgICAgIC8qIHVzZSBpbmZsYXRlX2Zhc3QoKSBpZiB3ZSBoYXZlIGVub3VnaCBpbnB1dCBhbmQgb3V0cHV0ICovCisgICAgICAgICAgICBpZiAoaGF2ZSA+PSA2ICYmIGxlZnQgPj0gMjU4KSB7CisgICAgICAgICAgICAgICAgUkVTVE9SRSgpOworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+d2hhdmUgPCBzdGF0ZS0+d3NpemUpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT53aGF2ZSA9IHN0YXRlLT53c2l6ZSAtIGxlZnQ7CisgICAgICAgICAgICAgICAgaW5mbGF0ZV9mYXN0KHN0cm0sIHN0YXRlLT53c2l6ZSk7CisgICAgICAgICAgICAgICAgTE9BRCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBnZXQgYSBsaXRlcmFsLCBsZW5ndGgsIG9yIGVuZC1vZi1ibG9jayBjb2RlICovCisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgaGVyZSA9IHN0YXRlLT5sZW5jb2RlW0JJVFMoc3RhdGUtPmxlbmJpdHMpXTsKKyAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShoZXJlLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGVyZS5vcCAmJiAoaGVyZS5vcCAmIDB4ZjApID09IDApIHsKKyAgICAgICAgICAgICAgICBsYXN0ID0gaGVyZTsKKyAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+bGVuY29kZVtsYXN0LnZhbCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkgPj4gbGFzdC5iaXRzKV07CisgICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGxhc3QuYml0cyArIGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERST1BCSVRTKGxhc3QuYml0cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOworICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9ICh1bnNpZ25lZCloZXJlLnZhbDsKKworICAgICAgICAgICAgLyogcHJvY2VzcyBsaXRlcmFsICovCisgICAgICAgICAgICBpZiAoaGVyZS5vcCA9PSAwKSB7CisgICAgICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/CisgICAgICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcbiIgOgorICAgICAgICAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcbiIsIGhlcmUudmFsKSk7CisgICAgICAgICAgICAgICAgUk9PTSgpOworICAgICAgICAgICAgICAgICpwdXQrKyA9ICh1bnNpZ25lZCBjaGFyKShzdGF0ZS0+bGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBsZWZ0LS07CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHByb2Nlc3MgZW5kIG9mIGJsb2NrICovCisgICAgICAgICAgICBpZiAoaGVyZS5vcCAmIDMyKSB7CisgICAgICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcbiIpKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSAqLworICAgICAgICAgICAgaWYgKGhlcmUub3AgJiA2NCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGxlbmd0aCBjb2RlIC0tIGdldCBleHRyYSBiaXRzLCBpZiBhbnkgKi8KKyAgICAgICAgICAgIHN0YXRlLT5leHRyYSA9ICh1bnNpZ25lZCkoaGVyZS5vcCkgJiAxNTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+ZXh0cmEgIT0gMCkgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCArPSBCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICAgICAgRFJPUEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XG4iLCBzdGF0ZS0+bGVuZ3RoKSk7CisKKyAgICAgICAgICAgIC8qIGdldCBkaXN0YW5jZSBjb2RlICovCisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgaGVyZSA9IHN0YXRlLT5kaXN0Y29kZVtCSVRTKHN0YXRlLT5kaXN0Yml0cyldOworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoaGVyZS5vcCAmIDB4ZjApID09IDApIHsKKyAgICAgICAgICAgICAgICBsYXN0ID0gaGVyZTsKKyAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+ZGlzdGNvZGVbbGFzdC52YWwgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApID4+IGxhc3QuYml0cyldOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShsYXN0LmJpdHMgKyBoZXJlLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEUk9QQklUUyhsYXN0LmJpdHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKKyAgICAgICAgICAgIGlmIChoZXJlLm9wICYgNjQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPm9mZnNldCA9ICh1bnNpZ25lZCloZXJlLnZhbDsKKworICAgICAgICAgICAgLyogZ2V0IGRpc3RhbmNlIGV4dHJhIGJpdHMsIGlmIGFueSAqLworICAgICAgICAgICAgc3RhdGUtPmV4dHJhID0gKHVuc2lnbmVkKShoZXJlLm9wKSAmIDE1OworICAgICAgICAgICAgaWYgKHN0YXRlLT5leHRyYSAhPSAwKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+b2Zmc2V0ICs9IEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBEUk9QQklUUyhzdGF0ZS0+ZXh0cmEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlLT5vZmZzZXQgPiBzdGF0ZS0+d3NpemUgLSAoc3RhdGUtPndoYXZlIDwgc3RhdGUtPndzaXplID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgOiAwKSkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJXVcbiIsIHN0YXRlLT5vZmZzZXQpKTsKKworICAgICAgICAgICAgLyogY29weSBtYXRjaCBmcm9tIHdpbmRvdyB0byBvdXRwdXQgKi8KKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBST09NKCk7CisgICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLT53c2l6ZSAtIHN0YXRlLT5vZmZzZXQ7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPCBsZWZ0KSB7CisgICAgICAgICAgICAgICAgICAgIGZyb20gPSBwdXQgKyBjb3B5OworICAgICAgICAgICAgICAgICAgICBjb3B5ID0gbGVmdCAtIGNvcHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmcm9tID0gcHV0IC0gc3RhdGUtPm9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgY29weSA9IGxlZnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUtPmxlbmd0aCkgY29weSA9IHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCAtPSBjb3B5OworICAgICAgICAgICAgICAgIGxlZnQgLT0gY29weTsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICpwdXQrKyA9ICpmcm9tKys7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTsKKyAgICAgICAgICAgIH0gd2hpbGUgKHN0YXRlLT5sZW5ndGggIT0gMCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERPTkU6CisgICAgICAgICAgICAvKiBpbmZsYXRlIHN0cmVhbSB0ZXJtaW5hdGVkIHByb3Blcmx5IC0tIHdyaXRlIGxlZnRvdmVyIG91dHB1dCAqLworICAgICAgICAgICAgcmV0ID0gWl9TVFJFQU1fRU5EOworICAgICAgICAgICAgaWYgKGxlZnQgPCBzdGF0ZS0+d3NpemUpIHsKKyAgICAgICAgICAgICAgICBpZiAob3V0KG91dF9kZXNjLCBzdGF0ZS0+d2luZG93LCBzdGF0ZS0+d3NpemUgLSBsZWZ0KSkKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gWl9CVUZfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsKKworICAgICAgICBjYXNlIEJBRDoKKyAgICAgICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjsKKyAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOworCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIC8qIGNhbid0IGhhcHBlbiwgYnV0IG1ha2VzIGNvbXBpbGVycyBoYXBweSAqLworICAgICAgICAgICAgcmV0ID0gWl9TVFJFQU1fRVJST1I7CisgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgfQorCisgICAgLyogUmV0dXJuIHVudXNlZCBpbnB1dCAqLworICBpbmZfbGVhdmU6CisgICAgc3RybS0+bmV4dF9pbiA9IG5leHQ7CisgICAgc3RybS0+YXZhaWxfaW4gPSBoYXZlOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVCYWNrRW5kKHN0cm0pCit6X3N0cmVhbXAgc3RybTsKK3sKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMIHx8IHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIFpGUkVFKHN0cm0sIHN0cm0tPnN0YXRlKTsKKyAgICBzdHJtLT5zdGF0ZSA9IFpfTlVMTDsKKyAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6IGVuZFxuIikpOworICAgIHJldHVybiBaX09LOworfQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvaW5mZmFzdC5jIGIvemxpYi9zcmMvaW5mZmFzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYTU5Y2UKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9pbmZmYXN0LmMKQEAgLTAsMCArMSwzNDAgQEAKKy8qIGluZmZhc3QuYyAtLSBmYXN0IGRlY29kaW5nCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwOCwgMjAxMCwgMjAxMyBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworI2luY2x1ZGUgInp1dGlsLmgiCisjaW5jbHVkZSAiaW5mdHJlZXMuaCIKKyNpbmNsdWRlICJpbmZsYXRlLmgiCisjaW5jbHVkZSAiaW5mZmFzdC5oIgorCisjaWZuZGVmIEFTTUlORgorCisvKiBBbGxvdyBtYWNoaW5lIGRlcGVuZGVudCBvcHRpbWl6YXRpb24gZm9yIHBvc3QtaW5jcmVtZW50IG9yIHByZS1pbmNyZW1lbnQuCisgICBCYXNlZCBvbiB0ZXN0aW5nIHRvIGRhdGUsCisgICBQcmUtaW5jcmVtZW50IHByZWZlcnJlZCBmb3I6CisgICAtIFBvd2VyUEMgRzMgKEFkbGVyKQorICAgLSBNSVBTIFI1MDAwIChSYW5kZXJzLVBlaHJzb24pCisgICBQb3N0LWluY3JlbWVudCBwcmVmZXJyZWQgZm9yOgorICAgLSBub25lCisgICBObyBtZWFzdXJhYmxlIGRpZmZlcmVuY2U6CisgICAtIFBlbnRpdW0gSUlJIChBbmRlcnNvbikKKyAgIC0gTTY4MDYwIChOaWtsKQorICovCisjaWZkZWYgUE9TVElOQworIyAgZGVmaW5lIE9GRiAwCisjICBkZWZpbmUgUFVQKGEpICooYSkrKworI2Vsc2UKKyMgIGRlZmluZSBPRkYgMQorIyAgZGVmaW5lIFBVUChhKSAqKysoYSkKKyNlbmRpZgorCisvKgorICAgRGVjb2RlIGxpdGVyYWwsIGxlbmd0aCwgYW5kIGRpc3RhbmNlIGNvZGVzIGFuZCB3cml0ZSBvdXQgdGhlIHJlc3VsdGluZworICAgbGl0ZXJhbCBhbmQgbWF0Y2ggYnl0ZXMgdW50aWwgZWl0aGVyIG5vdCBlbm91Z2ggaW5wdXQgb3Igb3V0cHV0IGlzCisgICBhdmFpbGFibGUsIGFuIGVuZC1vZi1ibG9jayBpcyBlbmNvdW50ZXJlZCwgb3IgYSBkYXRhIGVycm9yIGlzIGVuY291bnRlcmVkLgorICAgV2hlbiBsYXJnZSBlbm91Z2ggaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBzdXBwbGllZCB0byBpbmZsYXRlKCksIGZvcgorICAgZXhhbXBsZSwgYSAxNksgaW5wdXQgYnVmZmVyIGFuZCBhIDY0SyBvdXRwdXQgYnVmZmVyLCBtb3JlIHRoYW4gOTUlIG9mIHRoZQorICAgaW5mbGF0ZSBleGVjdXRpb24gdGltZSBpcyBzcGVudCBpbiB0aGlzIHJvdXRpbmUuCisKKyAgIEVudHJ5IGFzc3VtcHRpb25zOgorCisgICAgICAgIHN0YXRlLT5tb2RlID09IExFTgorICAgICAgICBzdHJtLT5hdmFpbF9pbiA+PSA2CisgICAgICAgIHN0cm0tPmF2YWlsX291dCA+PSAyNTgKKyAgICAgICAgc3RhcnQgPj0gc3RybS0+YXZhaWxfb3V0CisgICAgICAgIHN0YXRlLT5iaXRzIDwgOAorCisgICBPbiByZXR1cm4sIHN0YXRlLT5tb2RlIGlzIG9uZSBvZjoKKworICAgICAgICBMRU4gLS0gcmFuIG91dCBvZiBlbm91Z2ggb3V0cHV0IHNwYWNlIG9yIGVub3VnaCBhdmFpbGFibGUgaW5wdXQKKyAgICAgICAgVFlQRSAtLSByZWFjaGVkIGVuZCBvZiBibG9jayBjb2RlLCBpbmZsYXRlKCkgdG8gaW50ZXJwcmV0IG5leHQgYmxvY2sKKyAgICAgICAgQkFEIC0tIGVycm9yIGluIGJsb2NrIGRhdGEKKworICAgTm90ZXM6CisKKyAgICAtIFRoZSBtYXhpbXVtIGlucHV0IGJpdHMgdXNlZCBieSBhIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzIDE1IGJpdHMgZm9yIHRoZQorICAgICAgbGVuZ3RoIGNvZGUsIDUgYml0cyBmb3IgdGhlIGxlbmd0aCBleHRyYSwgMTUgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGNvZGUsCisgICAgICBhbmQgMTMgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGV4dHJhLiAgVGhpcyB0b3RhbHMgNDggYml0cywgb3Igc2l4IGJ5dGVzLgorICAgICAgVGhlcmVmb3JlIGlmIHN0cm0tPmF2YWlsX2luID49IDYsIHRoZW4gdGhlcmUgaXMgZW5vdWdoIGlucHV0IHRvIGF2b2lkCisgICAgICBjaGVja2luZyBmb3IgYXZhaWxhYmxlIGlucHV0IHdoaWxlIGRlY29kaW5nLgorCisgICAgLSBUaGUgbWF4aW11bSBieXRlcyB0aGF0IGEgc2luZ2xlIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGNhbiBvdXRwdXQgaXMgMjU4CisgICAgICBieXRlcywgd2hpY2ggaXMgdGhlIG1heGltdW0gbGVuZ3RoIHRoYXQgY2FuIGJlIGNvZGVkLiAgaW5mbGF0ZV9mYXN0KCkKKyAgICAgIHJlcXVpcmVzIHN0cm0tPmF2YWlsX291dCA+PSAyNTggZm9yIGVhY2ggbG9vcCB0byBhdm9pZCBjaGVja2luZyBmb3IKKyAgICAgIG91dHB1dCBzcGFjZS4KKyAqLwordm9pZCBaTElCX0lOVEVSTkFMIGluZmxhdGVfZmFzdChzdHJtLCBzdGFydCkKK3pfc3RyZWFtcCBzdHJtOwordW5zaWduZWQgc3RhcnQ7ICAgICAgICAgLyogaW5mbGF0ZSgpJ3Mgc3RhcnRpbmcgdmFsdWUgZm9yIHN0cm0tPmF2YWlsX291dCAqLworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisgICAgel9jb25zdCB1bnNpZ25lZCBjaGFyIEZBUiAqaW47ICAgICAgLyogbG9jYWwgc3RybS0+bmV4dF9pbiAqLworICAgIHpfY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKmxhc3Q7ICAgIC8qIGhhdmUgZW5vdWdoIGlucHV0IHdoaWxlIGluIDwgbGFzdCAqLworICAgIHVuc2lnbmVkIGNoYXIgRkFSICpvdXQ7ICAgICAvKiBsb2NhbCBzdHJtLT5uZXh0X291dCAqLworICAgIHVuc2lnbmVkIGNoYXIgRkFSICpiZWc7ICAgICAvKiBpbmZsYXRlKCkncyBpbml0aWFsIHN0cm0tPm5leHRfb3V0ICovCisgICAgdW5zaWduZWQgY2hhciBGQVIgKmVuZDsgICAgIC8qIHdoaWxlIG91dCA8IGVuZCwgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSAqLworI2lmZGVmIElORkxBVEVfU1RSSUNUCisgICAgdW5zaWduZWQgZG1heDsgICAgICAgICAgICAgIC8qIG1heGltdW0gZGlzdGFuY2UgZnJvbSB6bGliIGhlYWRlciAqLworI2VuZGlmCisgICAgdW5zaWduZWQgd3NpemU7ICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplIG9yIHplcm8gaWYgbm90IHVzaW5nIHdpbmRvdyAqLworICAgIHVuc2lnbmVkIHdoYXZlOyAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovCisgICAgdW5zaWduZWQgd25leHQ7ICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqLworICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3c7ICAvKiBhbGxvY2F0ZWQgc2xpZGluZyB3aW5kb3csIGlmIHdzaXplICE9IDAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGhvbGQ7ICAgICAgICAgLyogbG9jYWwgc3RybS0+aG9sZCAqLworICAgIHVuc2lnbmVkIGJpdHM7ICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLT5iaXRzICovCisgICAgY29kZSBjb25zdCBGQVIgKmxjb2RlOyAgICAgIC8qIGxvY2FsIHN0cm0tPmxlbmNvZGUgKi8KKyAgICBjb2RlIGNvbnN0IEZBUiAqZGNvZGU7ICAgICAgLyogbG9jYWwgc3RybS0+ZGlzdGNvZGUgKi8KKyAgICB1bnNpZ25lZCBsbWFzazsgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgbGVuZ3RoIGNvZGVzICovCisgICAgdW5zaWduZWQgZG1hc2s7ICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGRpc3RhbmNlIGNvZGVzICovCisgICAgY29kZSBoZXJlOyAgICAgICAgICAgICAgICAgIC8qIHJldHJpZXZlZCB0YWJsZSBlbnRyeSAqLworICAgIHVuc2lnbmVkIG9wOyAgICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMsIG9wZXJhdGlvbiwgZXh0cmEgYml0cywgb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHdpbmRvdyBwb3NpdGlvbiwgd2luZG93IGJ5dGVzIHRvIGNvcHkgKi8KKyAgICB1bnNpZ25lZCBsZW47ICAgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoLCB1bnVzZWQgYnl0ZXMgKi8KKyAgICB1bnNpZ25lZCBkaXN0OyAgICAgICAgICAgICAgLyogbWF0Y2ggZGlzdGFuY2UgKi8KKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqZnJvbTsgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBmcm9tICovCisKKyAgICAvKiBjb3B5IHN0YXRlIHRvIGxvY2FsIHZhcmlhYmxlcyAqLworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOworICAgIGluID0gc3RybS0+bmV4dF9pbiAtIE9GRjsKKyAgICBsYXN0ID0gaW4gKyAoc3RybS0+YXZhaWxfaW4gLSA1KTsKKyAgICBvdXQgPSBzdHJtLT5uZXh0X291dCAtIE9GRjsKKyAgICBiZWcgPSBvdXQgLSAoc3RhcnQgLSBzdHJtLT5hdmFpbF9vdXQpOworICAgIGVuZCA9IG91dCArIChzdHJtLT5hdmFpbF9vdXQgLSAyNTcpOworI2lmZGVmIElORkxBVEVfU1RSSUNUCisgICAgZG1heCA9IHN0YXRlLT5kbWF4OworI2VuZGlmCisgICAgd3NpemUgPSBzdGF0ZS0+d3NpemU7CisgICAgd2hhdmUgPSBzdGF0ZS0+d2hhdmU7CisgICAgd25leHQgPSBzdGF0ZS0+d25leHQ7CisgICAgd2luZG93ID0gc3RhdGUtPndpbmRvdzsKKyAgICBob2xkID0gc3RhdGUtPmhvbGQ7CisgICAgYml0cyA9IHN0YXRlLT5iaXRzOworICAgIGxjb2RlID0gc3RhdGUtPmxlbmNvZGU7CisgICAgZGNvZGUgPSBzdGF0ZS0+ZGlzdGNvZGU7CisgICAgbG1hc2sgPSAoMVUgPDwgc3RhdGUtPmxlbmJpdHMpIC0gMTsKKyAgICBkbWFzayA9ICgxVSA8PCBzdGF0ZS0+ZGlzdGJpdHMpIC0gMTsKKworICAgIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlcyB1bnRpbCBlbmQtb2YtYmxvY2sgb3Igbm90IGVub3VnaAorICAgICAgIGlucHV0IGRhdGEgb3Igb3V0cHV0IHNwYWNlICovCisgICAgZG8geworICAgICAgICBpZiAoYml0cyA8IDE1KSB7CisgICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOworICAgICAgICAgICAgYml0cyArPSA4OworICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKKyAgICAgICAgICAgIGJpdHMgKz0gODsKKyAgICAgICAgfQorICAgICAgICBoZXJlID0gbGNvZGVbaG9sZCAmIGxtYXNrXTsKKyAgICAgIGRvbGVuOgorICAgICAgICBvcCA9ICh1bnNpZ25lZCkoaGVyZS5iaXRzKTsKKyAgICAgICAgaG9sZCA+Pj0gb3A7CisgICAgICAgIGJpdHMgLT0gb3A7CisgICAgICAgIG9wID0gKHVuc2lnbmVkKShoZXJlLm9wKTsKKyAgICAgICAgaWYgKG9wID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgKi8KKyAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgaGVyZS52YWwgPj0gMHgyMCAmJiBoZXJlLnZhbCA8IDB4N2YgPworICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcbiIgOgorICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxuIiwgaGVyZS52YWwpKTsKKyAgICAgICAgICAgIFBVUChvdXQpID0gKHVuc2lnbmVkIGNoYXIpKGhlcmUudmFsKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIGJhc2UgKi8KKyAgICAgICAgICAgIGxlbiA9ICh1bnNpZ25lZCkoaGVyZS52YWwpOworICAgICAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi8KKyAgICAgICAgICAgIGlmIChvcCkgeworICAgICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHsKKyAgICAgICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKKyAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsZW4gKz0gKHVuc2lnbmVkKWhvbGQgJiAoKDFVIDw8IG9wKSAtIDEpOworICAgICAgICAgICAgICAgIGhvbGQgPj49IG9wOworICAgICAgICAgICAgICAgIGJpdHMgLT0gb3A7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxuIiwgbGVuKSk7CisgICAgICAgICAgICBpZiAoYml0cyA8IDE1KSB7CisgICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKKyAgICAgICAgICAgICAgICBiaXRzICs9IDg7CisgICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKKyAgICAgICAgICAgICAgICBiaXRzICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoZXJlID0gZGNvZGVbaG9sZCAmIGRtYXNrXTsKKyAgICAgICAgICBkb2Rpc3Q6CisgICAgICAgICAgICBvcCA9ICh1bnNpZ25lZCkoaGVyZS5iaXRzKTsKKyAgICAgICAgICAgIGhvbGQgPj49IG9wOworICAgICAgICAgICAgYml0cyAtPSBvcDsKKyAgICAgICAgICAgIG9wID0gKHVuc2lnbmVkKShoZXJlLm9wKTsKKyAgICAgICAgICAgIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhc2UgKi8KKyAgICAgICAgICAgICAgICBkaXN0ID0gKHVuc2lnbmVkKShoZXJlLnZhbCk7CisgICAgICAgICAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqLworICAgICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHsKKyAgICAgICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKKyAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OworICAgICAgICAgICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOworICAgICAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRpc3QgKz0gKHVuc2lnbmVkKWhvbGQgJiAoKDFVIDw8IG9wKSAtIDEpOworI2lmZGVmIElORkxBVEVfU1RSSUNUCisgICAgICAgICAgICAgICAgaWYgKGRpc3QgPiBkbWF4KSB7CisgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIGhvbGQgPj49IG9wOworICAgICAgICAgICAgICAgIGJpdHMgLT0gb3A7CisgICAgICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxuIiwgZGlzdCkpOworICAgICAgICAgICAgICAgIG9wID0gKHVuc2lnbmVkKShvdXQgLSBiZWcpOyAgICAgLyogbWF4IGRpc3RhbmNlIGluIG91dHB1dCAqLworICAgICAgICAgICAgICAgIGlmIChkaXN0ID4gb3ApIHsgICAgICAgICAgICAgICAgLyogc2VlIGlmIGNvcHkgZnJvbSB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgb3AgPSBkaXN0IC0gb3A7ICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgaW4gd2luZG93ICovCisgICAgICAgICAgICAgICAgICAgIGlmIChvcCA+IHdoYXZlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPnNhbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuIDw9IG9wIC0gd2hhdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3AgLSB3aGF2ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wID4gd2hhdmUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gb3V0IC0gZGlzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZyb20gPSB3aW5kb3cgLSBPRkY7CisgICAgICAgICAgICAgICAgICAgIGlmICh3bmV4dCA9PSAwKSB7ICAgICAgICAgICAvKiB2ZXJ5IGNvbW1vbiBjYXNlICovCisgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplIC0gb3A7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IG91dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAod25leHQgPCBvcCkgeyAgICAgIC8qIHdyYXAgYXJvdW5kIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSArIHduZXh0IC0gb3A7CisgICAgICAgICAgICAgICAgICAgICAgICBvcCAtPSB3bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSBlbmQgb2Ygd2luZG93ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IHdpbmRvdyAtIE9GRjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod25leHQgPCBsZW4pIHsgIC8qIHNvbWUgZnJvbSBzdGFydCBvZiB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSB3bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSBvdXQgLSBkaXN0OyAgICAgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRpZ3VvdXMgaW4gd2luZG93ICovCisgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICs9IHduZXh0IC0gb3A7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IG91dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSAzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZyb20gPSBvdXQgLSBkaXN0OyAgICAgICAgICAvKiBjb3B5IGRpcmVjdCBmcm9tIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWluaW11bSBsZW5ndGggaXMgdGhyZWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSAzOworICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChsZW4gPiAyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PSAwKSB7ICAgICAgICAgIC8qIDJuZCBsZXZlbCBkaXN0YW5jZSBjb2RlICovCisgICAgICAgICAgICAgICAgaGVyZSA9IGRjb2RlW2hlcmUudmFsICsgKGhvbGQgJiAoKDFVIDw8IG9wKSAtIDEpKV07CisgICAgICAgICAgICAgICAgZ290byBkb2Rpc3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PSAwKSB7ICAgICAgICAgICAgICAvKiAybmQgbGV2ZWwgbGVuZ3RoIGNvZGUgKi8KKyAgICAgICAgICAgIGhlcmUgPSBsY29kZVtoZXJlLnZhbCArIChob2xkICYgKCgxVSA8PCBvcCkgLSAxKSldOworICAgICAgICAgICAgZ290byBkb2xlbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChvcCAmIDMyKSB7ICAgICAgICAgICAgICAgICAgICAgLyogZW5kLW9mLWJsb2NrICovCisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xuIikpOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGluIDwgbGFzdCAmJiBvdXQgPCBlbmQpOworCisgICAgLyogcmV0dXJuIHVudXNlZCBieXRlcyAob24gZW50cnksIGJpdHMgPCA4LCBzbyBpbiB3b24ndCBnbyB0b28gZmFyIGJhY2spICovCisgICAgbGVuID0gYml0cyA+PiAzOworICAgIGluIC09IGxlbjsKKyAgICBiaXRzIC09IGxlbiA8PCAzOworICAgIGhvbGQgJj0gKDFVIDw8IGJpdHMpIC0gMTsKKworICAgIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmV0dXJuICovCisgICAgc3RybS0+bmV4dF9pbiA9IGluICsgT0ZGOworICAgIHN0cm0tPm5leHRfb3V0ID0gb3V0ICsgT0ZGOworICAgIHN0cm0tPmF2YWlsX2luID0gKHVuc2lnbmVkKShpbiA8IGxhc3QgPyA1ICsgKGxhc3QgLSBpbikgOiA1IC0gKGluIC0gbGFzdCkpOworICAgIHN0cm0tPmF2YWlsX291dCA9ICh1bnNpZ25lZCkob3V0IDwgZW5kID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NyArIChlbmQgLSBvdXQpIDogMjU3IC0gKG91dCAtIGVuZCkpOworICAgIHN0YXRlLT5ob2xkID0gaG9sZDsKKyAgICBzdGF0ZS0+Yml0cyA9IGJpdHM7CisgICAgcmV0dXJuOworfQorCisvKgorICAgaW5mbGF0ZV9mYXN0KCkgc3BlZWR1cHMgdGhhdCB0dXJuZWQgb3V0IHNsb3dlciAob24gYSBQb3dlclBDIEczIDc1MENYZSk6CisgICAtIFVzaW5nIGJpdCBmaWVsZHMgZm9yIGNvZGUgc3RydWN0dXJlCisgICAtIERpZmZlcmVudCBvcCBkZWZpbml0aW9uIHRvIGF2b2lkICYgZm9yIGV4dHJhIGJpdHMgKGRvICYgZm9yIHRhYmxlIGJpdHMpCisgICAtIFRocmVlIHNlcGFyYXRlIGRlY29kaW5nIGRvLWxvb3BzIGZvciBkaXJlY3QsIHdpbmRvdywgYW5kIHduZXh0ID09IDAKKyAgIC0gU3BlY2lhbCBjYXNlIGZvciBkaXN0YW5jZSA+IDEgY29waWVzIHRvIGRvIG92ZXJsYXBwZWQgbG9hZCBhbmQgc3RvcmUgY29weQorICAgLSBFeHBsaWNpdCBicmFuY2ggcHJlZGljdGlvbnMgKGJhc2VkIG9uIG1lYXN1cmVkIGJyYW5jaCBwcm9iYWJpbGl0aWVzKQorICAgLSBEZWZlcnJpbmcgbWF0Y2ggY29weSBhbmQgaW50ZXJzcGVyc2VkIGl0IHdpdGggZGVjb2Rpbmcgc3Vic2VxdWVudCBjb2RlcworICAgLSBTd2FwcGluZyBsaXRlcmFsL2xlbmd0aCBlbHNlCisgICAtIFN3YXBwaW5nIHdpbmRvdy9kaXJlY3QgZWxzZQorICAgLSBMYXJnZXIgdW5yb2xsZWQgY29weSBsb29wcyAodGhyZWUgaXMgYWJvdXQgcmlnaHQpCisgICAtIE1vdmluZyBsZW4gLT0gMyBzdGF0ZW1lbnQgaW50byBtaWRkbGUgb2YgbG9vcAorICovCisKKyNlbmRpZiAvKiAhQVNNSU5GICovCmRpZmYgLS1naXQgYS96bGliL3NyYy9pbmZmYXN0LmggYi96bGliL3NyYy9pbmZmYXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVjMWFhNAotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2luZmZhc3QuaApAQCAtMCwwICsxLDExIEBACisvKiBpbmZmYXN0LmggLS0gaGVhZGVyIHRvIHVzZSBpbmZmYXN0LmMKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzLCAyMDEwIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcworICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCisgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCisgKi8KKwordm9pZCBaTElCX0lOVEVSTkFMIGluZmxhdGVfZmFzdCBPRigoel9zdHJlYW1wIHN0cm0sIHVuc2lnbmVkIHN0YXJ0KSk7CmRpZmYgLS1naXQgYS96bGliL3NyYy9pbmZmaXhlZC5oIGIvemxpYi9zcmMvaW5mZml4ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjI4MzI3Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvaW5mZml4ZWQuaApAQCAtMCwwICsxLDk0IEBACisgICAgLyogaW5mZml4ZWQuaCAtLSB0YWJsZSBmb3IgZGVjb2RpbmcgZml4ZWQgY29kZXMKKyAgICAgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBtYWtlZml4ZWQoKS4KKyAgICAgKi8KKworICAgIC8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuCisgICAgICAgSXQgaXMgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBsaWJyYXJ5IGFuZCBpcworICAgICAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KKyAgICAgKi8KKworICAgIHN0YXRpYyBjb25zdCBjb2RlIGxlbmZpeFs1MTJdID0geworICAgICAgICB7OTYsNywwfSx7MCw4LDgwfSx7MCw4LDE2fSx7MjAsOCwxMTV9LHsxOCw3LDMxfSx7MCw4LDExMn0sezAsOCw0OH0sCisgICAgICAgIHswLDksMTkyfSx7MTYsNywxMH0sezAsOCw5Nn0sezAsOCwzMn0sezAsOSwxNjB9LHswLDgsMH0sezAsOCwxMjh9LAorICAgICAgICB7MCw4LDY0fSx7MCw5LDIyNH0sezE2LDcsNn0sezAsOCw4OH0sezAsOCwyNH0sezAsOSwxNDR9LHsxOSw3LDU5fSwKKyAgICAgICAgezAsOCwxMjB9LHswLDgsNTZ9LHswLDksMjA4fSx7MTcsNywxN30sezAsOCwxMDR9LHswLDgsNDB9LHswLDksMTc2fSwKKyAgICAgICAgezAsOCw4fSx7MCw4LDEzNn0sezAsOCw3Mn0sezAsOSwyNDB9LHsxNiw3LDR9LHswLDgsODR9LHswLDgsMjB9LAorICAgICAgICB7MjEsOCwyMjd9LHsxOSw3LDQzfSx7MCw4LDExNn0sezAsOCw1Mn0sezAsOSwyMDB9LHsxNyw3LDEzfSx7MCw4LDEwMH0sCisgICAgICAgIHswLDgsMzZ9LHswLDksMTY4fSx7MCw4LDR9LHswLDgsMTMyfSx7MCw4LDY4fSx7MCw5LDIzMn0sezE2LDcsOH0sCisgICAgICAgIHswLDgsOTJ9LHswLDgsMjh9LHswLDksMTUyfSx7MjAsNyw4M30sezAsOCwxMjR9LHswLDgsNjB9LHswLDksMjE2fSwKKyAgICAgICAgezE4LDcsMjN9LHswLDgsMTA4fSx7MCw4LDQ0fSx7MCw5LDE4NH0sezAsOCwxMn0sezAsOCwxNDB9LHswLDgsNzZ9LAorICAgICAgICB7MCw5LDI0OH0sezE2LDcsM30sezAsOCw4Mn0sezAsOCwxOH0sezIxLDgsMTYzfSx7MTksNywzNX0sezAsOCwxMTR9LAorICAgICAgICB7MCw4LDUwfSx7MCw5LDE5Nn0sezE3LDcsMTF9LHswLDgsOTh9LHswLDgsMzR9LHswLDksMTY0fSx7MCw4LDJ9LAorICAgICAgICB7MCw4LDEzMH0sezAsOCw2Nn0sezAsOSwyMjh9LHsxNiw3LDd9LHswLDgsOTB9LHswLDgsMjZ9LHswLDksMTQ4fSwKKyAgICAgICAgezIwLDcsNjd9LHswLDgsMTIyfSx7MCw4LDU4fSx7MCw5LDIxMn0sezE4LDcsMTl9LHswLDgsMTA2fSx7MCw4LDQyfSwKKyAgICAgICAgezAsOSwxODB9LHswLDgsMTB9LHswLDgsMTM4fSx7MCw4LDc0fSx7MCw5LDI0NH0sezE2LDcsNX0sezAsOCw4Nn0sCisgICAgICAgIHswLDgsMjJ9LHs2NCw4LDB9LHsxOSw3LDUxfSx7MCw4LDExOH0sezAsOCw1NH0sezAsOSwyMDR9LHsxNyw3LDE1fSwKKyAgICAgICAgezAsOCwxMDJ9LHswLDgsMzh9LHswLDksMTcyfSx7MCw4LDZ9LHswLDgsMTM0fSx7MCw4LDcwfSx7MCw5LDIzNn0sCisgICAgICAgIHsxNiw3LDl9LHswLDgsOTR9LHswLDgsMzB9LHswLDksMTU2fSx7MjAsNyw5OX0sezAsOCwxMjZ9LHswLDgsNjJ9LAorICAgICAgICB7MCw5LDIyMH0sezE4LDcsMjd9LHswLDgsMTEwfSx7MCw4LDQ2fSx7MCw5LDE4OH0sezAsOCwxNH0sezAsOCwxNDJ9LAorICAgICAgICB7MCw4LDc4fSx7MCw5LDI1Mn0sezk2LDcsMH0sezAsOCw4MX0sezAsOCwxN30sezIxLDgsMTMxfSx7MTgsNywzMX0sCisgICAgICAgIHswLDgsMTEzfSx7MCw4LDQ5fSx7MCw5LDE5NH0sezE2LDcsMTB9LHswLDgsOTd9LHswLDgsMzN9LHswLDksMTYyfSwKKyAgICAgICAgezAsOCwxfSx7MCw4LDEyOX0sezAsOCw2NX0sezAsOSwyMjZ9LHsxNiw3LDZ9LHswLDgsODl9LHswLDgsMjV9LAorICAgICAgICB7MCw5LDE0Nn0sezE5LDcsNTl9LHswLDgsMTIxfSx7MCw4LDU3fSx7MCw5LDIxMH0sezE3LDcsMTd9LHswLDgsMTA1fSwKKyAgICAgICAgezAsOCw0MX0sezAsOSwxNzh9LHswLDgsOX0sezAsOCwxMzd9LHswLDgsNzN9LHswLDksMjQyfSx7MTYsNyw0fSwKKyAgICAgICAgezAsOCw4NX0sezAsOCwyMX0sezE2LDgsMjU4fSx7MTksNyw0M30sezAsOCwxMTd9LHswLDgsNTN9LHswLDksMjAyfSwKKyAgICAgICAgezE3LDcsMTN9LHswLDgsMTAxfSx7MCw4LDM3fSx7MCw5LDE3MH0sezAsOCw1fSx7MCw4LDEzM30sezAsOCw2OX0sCisgICAgICAgIHswLDksMjM0fSx7MTYsNyw4fSx7MCw4LDkzfSx7MCw4LDI5fSx7MCw5LDE1NH0sezIwLDcsODN9LHswLDgsMTI1fSwKKyAgICAgICAgezAsOCw2MX0sezAsOSwyMTh9LHsxOCw3LDIzfSx7MCw4LDEwOX0sezAsOCw0NX0sezAsOSwxODZ9LHswLDgsMTN9LAorICAgICAgICB7MCw4LDE0MX0sezAsOCw3N30sezAsOSwyNTB9LHsxNiw3LDN9LHswLDgsODN9LHswLDgsMTl9LHsyMSw4LDE5NX0sCisgICAgICAgIHsxOSw3LDM1fSx7MCw4LDExNX0sezAsOCw1MX0sezAsOSwxOTh9LHsxNyw3LDExfSx7MCw4LDk5fSx7MCw4LDM1fSwKKyAgICAgICAgezAsOSwxNjZ9LHswLDgsM30sezAsOCwxMzF9LHswLDgsNjd9LHswLDksMjMwfSx7MTYsNyw3fSx7MCw4LDkxfSwKKyAgICAgICAgezAsOCwyN30sezAsOSwxNTB9LHsyMCw3LDY3fSx7MCw4LDEyM30sezAsOCw1OX0sezAsOSwyMTR9LHsxOCw3LDE5fSwKKyAgICAgICAgezAsOCwxMDd9LHswLDgsNDN9LHswLDksMTgyfSx7MCw4LDExfSx7MCw4LDEzOX0sezAsOCw3NX0sezAsOSwyNDZ9LAorICAgICAgICB7MTYsNyw1fSx7MCw4LDg3fSx7MCw4LDIzfSx7NjQsOCwwfSx7MTksNyw1MX0sezAsOCwxMTl9LHswLDgsNTV9LAorICAgICAgICB7MCw5LDIwNn0sezE3LDcsMTV9LHswLDgsMTAzfSx7MCw4LDM5fSx7MCw5LDE3NH0sezAsOCw3fSx7MCw4LDEzNX0sCisgICAgICAgIHswLDgsNzF9LHswLDksMjM4fSx7MTYsNyw5fSx7MCw4LDk1fSx7MCw4LDMxfSx7MCw5LDE1OH0sezIwLDcsOTl9LAorICAgICAgICB7MCw4LDEyN30sezAsOCw2M30sezAsOSwyMjJ9LHsxOCw3LDI3fSx7MCw4LDExMX0sezAsOCw0N30sezAsOSwxOTB9LAorICAgICAgICB7MCw4LDE1fSx7MCw4LDE0M30sezAsOCw3OX0sezAsOSwyNTR9LHs5Niw3LDB9LHswLDgsODB9LHswLDgsMTZ9LAorICAgICAgICB7MjAsOCwxMTV9LHsxOCw3LDMxfSx7MCw4LDExMn0sezAsOCw0OH0sezAsOSwxOTN9LHsxNiw3LDEwfSx7MCw4LDk2fSwKKyAgICAgICAgezAsOCwzMn0sezAsOSwxNjF9LHswLDgsMH0sezAsOCwxMjh9LHswLDgsNjR9LHswLDksMjI1fSx7MTYsNyw2fSwKKyAgICAgICAgezAsOCw4OH0sezAsOCwyNH0sezAsOSwxNDV9LHsxOSw3LDU5fSx7MCw4LDEyMH0sezAsOCw1Nn0sezAsOSwyMDl9LAorICAgICAgICB7MTcsNywxN30sezAsOCwxMDR9LHswLDgsNDB9LHswLDksMTc3fSx7MCw4LDh9LHswLDgsMTM2fSx7MCw4LDcyfSwKKyAgICAgICAgezAsOSwyNDF9LHsxNiw3LDR9LHswLDgsODR9LHswLDgsMjB9LHsyMSw4LDIyN30sezE5LDcsNDN9LHswLDgsMTE2fSwKKyAgICAgICAgezAsOCw1Mn0sezAsOSwyMDF9LHsxNyw3LDEzfSx7MCw4LDEwMH0sezAsOCwzNn0sezAsOSwxNjl9LHswLDgsNH0sCisgICAgICAgIHswLDgsMTMyfSx7MCw4LDY4fSx7MCw5LDIzM30sezE2LDcsOH0sezAsOCw5Mn0sezAsOCwyOH0sezAsOSwxNTN9LAorICAgICAgICB7MjAsNyw4M30sezAsOCwxMjR9LHswLDgsNjB9LHswLDksMjE3fSx7MTgsNywyM30sezAsOCwxMDh9LHswLDgsNDR9LAorICAgICAgICB7MCw5LDE4NX0sezAsOCwxMn0sezAsOCwxNDB9LHswLDgsNzZ9LHswLDksMjQ5fSx7MTYsNywzfSx7MCw4LDgyfSwKKyAgICAgICAgezAsOCwxOH0sezIxLDgsMTYzfSx7MTksNywzNX0sezAsOCwxMTR9LHswLDgsNTB9LHswLDksMTk3fSx7MTcsNywxMX0sCisgICAgICAgIHswLDgsOTh9LHswLDgsMzR9LHswLDksMTY1fSx7MCw4LDJ9LHswLDgsMTMwfSx7MCw4LDY2fSx7MCw5LDIyOX0sCisgICAgICAgIHsxNiw3LDd9LHswLDgsOTB9LHswLDgsMjZ9LHswLDksMTQ5fSx7MjAsNyw2N30sezAsOCwxMjJ9LHswLDgsNTh9LAorICAgICAgICB7MCw5LDIxM30sezE4LDcsMTl9LHswLDgsMTA2fSx7MCw4LDQyfSx7MCw5LDE4MX0sezAsOCwxMH0sezAsOCwxMzh9LAorICAgICAgICB7MCw4LDc0fSx7MCw5LDI0NX0sezE2LDcsNX0sezAsOCw4Nn0sezAsOCwyMn0sezY0LDgsMH0sezE5LDcsNTF9LAorICAgICAgICB7MCw4LDExOH0sezAsOCw1NH0sezAsOSwyMDV9LHsxNyw3LDE1fSx7MCw4LDEwMn0sezAsOCwzOH0sezAsOSwxNzN9LAorICAgICAgICB7MCw4LDZ9LHswLDgsMTM0fSx7MCw4LDcwfSx7MCw5LDIzN30sezE2LDcsOX0sezAsOCw5NH0sezAsOCwzMH0sCisgICAgICAgIHswLDksMTU3fSx7MjAsNyw5OX0sezAsOCwxMjZ9LHswLDgsNjJ9LHswLDksMjIxfSx7MTgsNywyN30sezAsOCwxMTB9LAorICAgICAgICB7MCw4LDQ2fSx7MCw5LDE4OX0sezAsOCwxNH0sezAsOCwxNDJ9LHswLDgsNzh9LHswLDksMjUzfSx7OTYsNywwfSwKKyAgICAgICAgezAsOCw4MX0sezAsOCwxN30sezIxLDgsMTMxfSx7MTgsNywzMX0sezAsOCwxMTN9LHswLDgsNDl9LHswLDksMTk1fSwKKyAgICAgICAgezE2LDcsMTB9LHswLDgsOTd9LHswLDgsMzN9LHswLDksMTYzfSx7MCw4LDF9LHswLDgsMTI5fSx7MCw4LDY1fSwKKyAgICAgICAgezAsOSwyMjd9LHsxNiw3LDZ9LHswLDgsODl9LHswLDgsMjV9LHswLDksMTQ3fSx7MTksNyw1OX0sezAsOCwxMjF9LAorICAgICAgICB7MCw4LDU3fSx7MCw5LDIxMX0sezE3LDcsMTd9LHswLDgsMTA1fSx7MCw4LDQxfSx7MCw5LDE3OX0sezAsOCw5fSwKKyAgICAgICAgezAsOCwxMzd9LHswLDgsNzN9LHswLDksMjQzfSx7MTYsNyw0fSx7MCw4LDg1fSx7MCw4LDIxfSx7MTYsOCwyNTh9LAorICAgICAgICB7MTksNyw0M30sezAsOCwxMTd9LHswLDgsNTN9LHswLDksMjAzfSx7MTcsNywxM30sezAsOCwxMDF9LHswLDgsMzd9LAorICAgICAgICB7MCw5LDE3MX0sezAsOCw1fSx7MCw4LDEzM30sezAsOCw2OX0sezAsOSwyMzV9LHsxNiw3LDh9LHswLDgsOTN9LAorICAgICAgICB7MCw4LDI5fSx7MCw5LDE1NX0sezIwLDcsODN9LHswLDgsMTI1fSx7MCw4LDYxfSx7MCw5LDIxOX0sezE4LDcsMjN9LAorICAgICAgICB7MCw4LDEwOX0sezAsOCw0NX0sezAsOSwxODd9LHswLDgsMTN9LHswLDgsMTQxfSx7MCw4LDc3fSx7MCw5LDI1MX0sCisgICAgICAgIHsxNiw3LDN9LHswLDgsODN9LHswLDgsMTl9LHsyMSw4LDE5NX0sezE5LDcsMzV9LHswLDgsMTE1fSx7MCw4LDUxfSwKKyAgICAgICAgezAsOSwxOTl9LHsxNyw3LDExfSx7MCw4LDk5fSx7MCw4LDM1fSx7MCw5LDE2N30sezAsOCwzfSx7MCw4LDEzMX0sCisgICAgICAgIHswLDgsNjd9LHswLDksMjMxfSx7MTYsNyw3fSx7MCw4LDkxfSx7MCw4LDI3fSx7MCw5LDE1MX0sezIwLDcsNjd9LAorICAgICAgICB7MCw4LDEyM30sezAsOCw1OX0sezAsOSwyMTV9LHsxOCw3LDE5fSx7MCw4LDEwN30sezAsOCw0M30sezAsOSwxODN9LAorICAgICAgICB7MCw4LDExfSx7MCw4LDEzOX0sezAsOCw3NX0sezAsOSwyNDd9LHsxNiw3LDV9LHswLDgsODd9LHswLDgsMjN9LAorICAgICAgICB7NjQsOCwwfSx7MTksNyw1MX0sezAsOCwxMTl9LHswLDgsNTV9LHswLDksMjA3fSx7MTcsNywxNX0sezAsOCwxMDN9LAorICAgICAgICB7MCw4LDM5fSx7MCw5LDE3NX0sezAsOCw3fSx7MCw4LDEzNX0sezAsOCw3MX0sezAsOSwyMzl9LHsxNiw3LDl9LAorICAgICAgICB7MCw4LDk1fSx7MCw4LDMxfSx7MCw5LDE1OX0sezIwLDcsOTl9LHswLDgsMTI3fSx7MCw4LDYzfSx7MCw5LDIyM30sCisgICAgICAgIHsxOCw3LDI3fSx7MCw4LDExMX0sezAsOCw0N30sezAsOSwxOTF9LHswLDgsMTV9LHswLDgsMTQzfSx7MCw4LDc5fSwKKyAgICAgICAgezAsOSwyNTV9CisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBjb2RlIGRpc3RmaXhbMzJdID0geworICAgICAgICB7MTYsNSwxfSx7MjMsNSwyNTd9LHsxOSw1LDE3fSx7MjcsNSw0MDk3fSx7MTcsNSw1fSx7MjUsNSwxMDI1fSwKKyAgICAgICAgezIxLDUsNjV9LHsyOSw1LDE2Mzg1fSx7MTYsNSwzfSx7MjQsNSw1MTN9LHsyMCw1LDMzfSx7MjgsNSw4MTkzfSwKKyAgICAgICAgezE4LDUsOX0sezI2LDUsMjA0OX0sezIyLDUsMTI5fSx7NjQsNSwwfSx7MTYsNSwyfSx7MjMsNSwzODV9LAorICAgICAgICB7MTksNSwyNX0sezI3LDUsNjE0NX0sezE3LDUsN30sezI1LDUsMTUzN30sezIxLDUsOTd9LHsyOSw1LDI0NTc3fSwKKyAgICAgICAgezE2LDUsNH0sezI0LDUsNzY5fSx7MjAsNSw0OX0sezI4LDUsMTIyODl9LHsxOCw1LDEzfSx7MjYsNSwzMDczfSwKKyAgICAgICAgezIyLDUsMTkzfSx7NjQsNSwwfQorICAgIH07CmRpZmYgLS1naXQgYS96bGliL3NyYy9pbmZsYXRlLmMgYi96bGliL3NyYy9pbmZsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZkM2YzYwotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL2luZmxhdGUuYwpAQCAtMCwwICsxLDE1MTMgQEAKKy8qIGluZmxhdGUuYyAtLSB6bGliIGRlY29tcHJlc3Npb24KKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDEyIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKgorICogQ2hhbmdlIGhpc3Rvcnk6CisgKgorICogMS4yLmJldGEwICAgIDI0IE5vdiAyMDAyCisgKiAtIEZpcnN0IHZlcnNpb24gLS0gY29tcGxldGUgcmV3cml0ZSBvZiBpbmZsYXRlIHRvIHNpbXBsaWZ5IGNvZGUsIGF2b2lkCisgKiAgIGNyZWF0aW9uIG9mIHdpbmRvdyB3aGVuIG5vdCBuZWVkZWQsIG1pbmltaXplIHVzZSBvZiB3aW5kb3cgd2hlbiBpdCBpcworICogICBuZWVkZWQsIG1ha2UgaW5mZmFzdC5jIGV2ZW4gZmFzdGVyLCBpbXBsZW1lbnQgZ3ppcCBkZWNvZGluZywgYW5kIHRvCisgKiAgIGltcHJvdmUgY29kZSByZWFkYWJpbGl0eSBhbmQgc3R5bGUgb3ZlciB0aGUgcHJldmlvdXMgemxpYiBpbmZsYXRlIGNvZGUKKyAqCisgKiAxLjIuYmV0YTEgICAgMjUgTm92IDIwMDIKKyAqIC0gVXNlIHBvaW50ZXJzIGZvciBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCBjaGVja2luZyBpbiBpbmZmYXN0LmMKKyAqIC0gUmVtb3ZlIGlucHV0IGFuZCBvdXRwdXQgY291bnRlcnMgaW4gaW5mZmFzdC5jCisgKiAtIENoYW5nZSBpbmZmYXN0LmMgZW50cnkgYW5kIGxvb3AgZnJvbSBhdmFpbF9pbiA+PSA3IHRvID49IDYKKyAqIC0gUmVtb3ZlIHVubmVjZXNzYXJ5IHNlY29uZCBieXRlIHB1bGwgZnJvbSBsZW5ndGggZXh0cmEgaW4gaW5mZmFzdC5jCisgKiAtIFVucm9sbCBkaXJlY3QgY29weSB0byB0aHJlZSBjb3BpZXMgcGVyIGxvb3AgaW4gaW5mZmFzdC5jCisgKgorICogMS4yLmJldGEyICAgIDQgRGVjIDIwMDIKKyAqIC0gQ2hhbmdlIGV4dGVybmFsIHJvdXRpbmUgbmFtZXMgdG8gcmVkdWNlIHBvdGVudGlhbCBjb25mbGljdHMKKyAqIC0gQ29ycmVjdCBmaWxlbmFtZSB0byBpbmZmaXhlZC5oIGZvciBmaXhlZCB0YWJsZXMgaW4gaW5mbGF0ZS5jCisgKiAtIE1ha2UgaGJ1ZltdIHVuc2lnbmVkIGNoYXIgdG8gbWF0Y2ggcGFyYW1ldGVyIHR5cGUgaW4gaW5mbGF0ZS5jCisgKiAtIENoYW5nZSBzdHJtLT5uZXh0X291dFstc3RhdGUtPm9mZnNldF0gdG8gKihzdHJtLT5uZXh0X291dCAtIHN0YXRlLT5vZmZzZXQpCisgKiAgIHRvIGF2b2lkIG5lZ2F0aW9uIHByb2JsZW0gb24gQWxwaGFzICg2NCBiaXQpIGluIGluZmxhdGUuYworICoKKyAqIDEuMi5iZXRhMyAgICAyMiBEZWMgMjAwMgorICogLSBBZGQgY29tbWVudHMgb24gc3RhdGUtPmJpdHMgYXNzZXJ0aW9uIGluIGluZmZhc3QuYworICogLSBBZGQgY29tbWVudHMgb24gb3AgZmllbGQgaW4gaW5mdHJlZXMuaAorICogLSBGaXggYnVnIGluIHJldXNlIG9mIGFsbG9jYXRlZCB3aW5kb3cgYWZ0ZXIgaW5mbGF0ZVJlc2V0KCkKKyAqIC0gUmVtb3ZlIGJpdCBmaWVsZHMtLWJhY2sgdG8gYnl0ZSBzdHJ1Y3R1cmUgZm9yIHNwZWVkCisgKiAtIFJlbW92ZSBkaXN0YW5jZSBleHRyYSA9PSAwIGNoZWNrIGluIGluZmxhdGVfZmFzdCgpLS1vbmx5IGhlbHBzIGZvciBsZW5ndGhzCisgKiAtIENoYW5nZSBwb3N0LWluY3JlbWVudHMgdG8gcHJlLWluY3JlbWVudHMgaW4gaW5mbGF0ZV9mYXN0KCksIFBQQyBiaWFzZWQ/CisgKiAtIEFkZCBjb21waWxlIHRpbWUgb3B0aW9uLCBQT1NUSU5DLCB0byB1c2UgcG9zdC1pbmNyZW1lbnRzIGluc3RlYWQgKEludGVsPykKKyAqIC0gTWFrZSBNQVRDSCBjb3B5IGluIGluZmxhdGUoKSBtdWNoIGZhc3RlciBmb3Igd2hlbiBpbmZsYXRlX2Zhc3QoKSBub3QgdXNlZAorICogLSBVc2UgbG9jYWwgY29waWVzIG9mIHN0cmVhbSBuZXh0IGFuZCBhdmFpbCB2YWx1ZXMsIGFzIHdlbGwgYXMgbG9jYWwgYml0CisgKiAgIGJ1ZmZlciBhbmQgYml0IGNvdW50IGluIGluZmxhdGUoKS0tZm9yIHNwZWVkIHdoZW4gaW5mbGF0ZV9mYXN0KCkgbm90IHVzZWQKKyAqCisgKiAxLjIuYmV0YTQgICAgMSBKYW4gMjAwMworICogLSBTcGxpdCBwdHIgLSAyNTcgc3RhdGVtZW50cyBpbiBpbmZsYXRlX3RhYmxlKCkgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MKKyAqIC0gTW92ZSBhIGNvbW1lbnQgb24gb3V0cHV0IGJ1ZmZlciBzaXplcyBmcm9tIGluZmZhc3QuYyB0byBpbmZsYXRlLmMKKyAqIC0gQWRkIGNvbW1lbnRzIGluIGluZmZhc3QuYyB0byBpbnRyb2R1Y2UgdGhlIGluZmxhdGVfZmFzdCgpIHJvdXRpbmUKKyAqIC0gUmVhcnJhbmdlIHdpbmRvdyBjb3BpZXMgaW4gaW5mbGF0ZV9mYXN0KCkgZm9yIHNwZWVkIGFuZCBzaW1wbGlmaWNhdGlvbgorICogLSBVbnJvbGwgbGFzdCBjb3B5IGZvciB3aW5kb3cgbWF0Y2ggaW4gaW5mbGF0ZV9mYXN0KCkKKyAqIC0gVXNlIGxvY2FsIGNvcGllcyBvZiB3aW5kb3cgdmFyaWFibGVzIGluIGluZmxhdGVfZmFzdCgpIGZvciBzcGVlZAorICogLSBQdWxsIG91dCBjb21tb24gd25leHQgPT0gMCBjYXNlIGZvciBzcGVlZCBpbiBpbmZsYXRlX2Zhc3QoKQorICogLSBNYWtlIG9wIGFuZCBsZW4gaW4gaW5mbGF0ZV9mYXN0KCkgdW5zaWduZWQgZm9yIGNvbnNpc3RlbmN5CisgKiAtIEFkZCBGQVIgdG8gbGNvZGUgYW5kIGRjb2RlIGRlY2xhcmF0aW9ucyBpbiBpbmZsYXRlX2Zhc3QoKQorICogLSBTaW1wbGlmaWVkIGJhZCBkaXN0YW5jZSBjaGVjayBpbiBpbmZsYXRlX2Zhc3QoKQorICogLSBBZGRlZCBpbmZsYXRlQmFja0luaXQoKSwgaW5mbGF0ZUJhY2soKSwgYW5kIGluZmxhdGVCYWNrRW5kKCkgaW4gbmV3CisgKiAgIHNvdXJjZSBmaWxlIGluZmJhY2suYyB0byBwcm92aWRlIGEgY2FsbC1iYWNrIGludGVyZmFjZSB0byBpbmZsYXRlIGZvcgorICogICBwcm9ncmFtcyBsaWtlIGd6aXAgYW5kIHVuemlwIC0tIHVzZXMgd2luZG93IGFzIG91dHB1dCBidWZmZXIgdG8gYXZvaWQKKyAqICAgd2luZG93IGNvcHlpbmcKKyAqCisgKiAxLjIuYmV0YTUgICAgMSBKYW4gMjAwMworICogLSBJbXByb3ZlZCBpbmZsYXRlQmFjaygpIGludGVyZmFjZSB0byBhbGxvdyB0aGUgY2FsbGVyIHRvIHByb3ZpZGUgaW5pdGlhbAorICogICBpbnB1dCBpbiBzdHJtLgorICogLSBGaXhlZCBzdG9yZWQgYmxvY2tzIGJ1ZyBpbiBpbmZsYXRlQmFjaygpCisgKgorICogMS4yLmJldGE2ICAgIDQgSmFuIDIwMDMKKyAqIC0gQWRkZWQgY29tbWVudHMgaW4gaW5mZmFzdC5jIG9uIGVmZmVjdGl2ZW5lc3Mgb2YgUE9TVElOQworICogLSBUeXBlY2FzdGluZyBhbGwgYXJvdW5kIHRvIHJlZHVjZSBjb21waWxlciB3YXJuaW5ncworICogLSBDaGFuZ2VkIGxvb3BzIGZyb20gd2hpbGUgKDEpIG9yIGRvIHt9IHdoaWxlICgxKSB0byBmb3IgKDs7KSwgYWdhaW4gdG8KKyAqICAgbWFrZSBjb21waWxlcnMgaGFwcHkKKyAqIC0gQ2hhbmdlZCB0eXBlIG9mIHdpbmRvdyBpbiBpbmZsYXRlQmFja0luaXQoKSB0byB1bnNpZ25lZCBjaGFyICoKKyAqCisgKiAxLjIuYmV0YTcgICAgMjcgSmFuIDIwMDMKKyAqIC0gQ2hhbmdlZCBtYW55IHR5cGVzIHRvIHVuc2lnbmVkIG9yIHVuc2lnbmVkIHNob3J0IHRvIGF2b2lkIHdhcm5pbmdzCisgKiAtIEFkZGVkIGluZmxhdGVDb3B5KCkgZnVuY3Rpb24KKyAqCisgKiAxLjIuMCAgICAgICAgOSBNYXIgMjAwMworICogLSBDaGFuZ2VkIGluZmxhdGVCYWNrKCkgaW50ZXJmYWNlIHRvIHByb3ZpZGUgc2VwYXJhdGUgb3BhcXVlIGRlc2NyaXB0b3JzCisgKiAgIGZvciB0aGUgaW4oKSBhbmQgb3V0KCkgZnVuY3Rpb25zCisgKiAtIENoYW5nZWQgaW5mbGF0ZUJhY2soKSBhcmd1bWVudCBhbmQgaW5fZnVuYyB0eXBlZGVmIHRvIHN3YXAgdGhlIGxlbmd0aAorICogICBhbmQgYnVmZmVyIGFkZHJlc3MgcmV0dXJuIHZhbHVlcyBmb3IgdGhlIGlucHV0IGZ1bmN0aW9uCisgKiAtIENoZWNrIG5leHRfaW4gYW5kIG5leHRfb3V0IGZvciBaX05VTEwgb24gZW50cnkgdG8gaW5mbGF0ZSgpCisgKgorICogVGhlIGhpc3RvcnkgZm9yIHZlcnNpb25zIGFmdGVyIDEuMi4wIGFyZSBpbiBDaGFuZ2VMb2cgaW4gemxpYiBkaXN0cmlidXRpb24uCisgKi8KKworI2luY2x1ZGUgInp1dGlsLmgiCisjaW5jbHVkZSAiaW5mdHJlZXMuaCIKKyNpbmNsdWRlICJpbmZsYXRlLmgiCisjaW5jbHVkZSAiaW5mZmFzdC5oIgorCisjaWZkZWYgTUFLRUZJWEVECisjICBpZm5kZWYgQlVJTERGSVhFRAorIyAgICBkZWZpbmUgQlVJTERGSVhFRAorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCitsb2NhbCB2b2lkIGZpeGVkdGFibGVzIE9GKChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlKSk7Citsb2NhbCBpbnQgdXBkYXRld2luZG93IE9GKCh6X3N0cmVhbXAgc3RybSwgY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNvcHkpKTsKKyNpZmRlZiBCVUlMREZJWEVECisgICB2b2lkIG1ha2VmaXhlZCBPRigodm9pZCkpOworI2VuZGlmCitsb2NhbCB1bnNpZ25lZCBzeW5jc2VhcmNoIE9GKCh1bnNpZ25lZCBGQVIgKmhhdmUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsZW4pKTsKKworaW50IFpFWFBPUlQgaW5mbGF0ZVJlc2V0S2VlcChzdHJtKQorel9zdHJlYW1wIHN0cm07Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKyAgICBzdHJtLT50b3RhbF9pbiA9IHN0cm0tPnRvdGFsX291dCA9IHN0YXRlLT50b3RhbCA9IDA7CisgICAgc3RybS0+bXNnID0gWl9OVUxMOworICAgIGlmIChzdGF0ZS0+d3JhcCkgICAgICAgIC8qIHRvIHN1cHBvcnQgaWxsLWNvbmNlaXZlZCBKYXZhIHRlc3Qgc3VpdGUgKi8KKyAgICAgICAgc3RybS0+YWRsZXIgPSBzdGF0ZS0+d3JhcCAmIDE7CisgICAgc3RhdGUtPm1vZGUgPSBIRUFEOworICAgIHN0YXRlLT5sYXN0ID0gMDsKKyAgICBzdGF0ZS0+aGF2ZWRpY3QgPSAwOworICAgIHN0YXRlLT5kbWF4ID0gMzI3NjhVOworICAgIHN0YXRlLT5oZWFkID0gWl9OVUxMOworICAgIHN0YXRlLT5ob2xkID0gMDsKKyAgICBzdGF0ZS0+Yml0cyA9IDA7CisgICAgc3RhdGUtPmxlbmNvZGUgPSBzdGF0ZS0+ZGlzdGNvZGUgPSBzdGF0ZS0+bmV4dCA9IHN0YXRlLT5jb2RlczsKKyAgICBzdGF0ZS0+c2FuZSA9IDE7CisgICAgc3RhdGUtPmJhY2sgPSAtMTsKKyAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6IHJlc2V0XG4iKSk7CisgICAgcmV0dXJuIFpfT0s7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVSZXNldChzdHJtKQorel9zdHJlYW1wIHN0cm07Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKyAgICBzdGF0ZS0+d3NpemUgPSAwOworICAgIHN0YXRlLT53aGF2ZSA9IDA7CisgICAgc3RhdGUtPnduZXh0ID0gMDsKKyAgICByZXR1cm4gaW5mbGF0ZVJlc2V0S2VlcChzdHJtKTsKK30KKworaW50IFpFWFBPUlQgaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKQorel9zdHJlYW1wIHN0cm07CitpbnQgd2luZG93Qml0czsKK3sKKyAgICBpbnQgd3JhcDsKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworCisgICAgLyogZ2V0IHRoZSBzdGF0ZSAqLworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKworICAgIC8qIGV4dHJhY3Qgd3JhcCByZXF1ZXN0IGZyb20gd2luZG93Qml0cyBwYXJhbWV0ZXIgKi8KKyAgICBpZiAod2luZG93Qml0cyA8IDApIHsKKyAgICAgICAgd3JhcCA9IDA7CisgICAgICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0czsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHdyYXAgPSAod2luZG93Qml0cyA+PiA0KSArIDE7CisjaWZkZWYgR1VOWklQCisgICAgICAgIGlmICh3aW5kb3dCaXRzIDwgNDgpCisgICAgICAgICAgICB3aW5kb3dCaXRzICY9IDE1OworI2VuZGlmCisgICAgfQorCisgICAgLyogc2V0IG51bWJlciBvZiB3aW5kb3cgYml0cywgZnJlZSB3aW5kb3cgaWYgZGlmZmVyZW50ICovCisgICAgaWYgKHdpbmRvd0JpdHMgJiYgKHdpbmRvd0JpdHMgPCA4IHx8IHdpbmRvd0JpdHMgPiAxNSkpCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBpZiAoc3RhdGUtPndpbmRvdyAhPSBaX05VTEwgJiYgc3RhdGUtPndiaXRzICE9ICh1bnNpZ25lZCl3aW5kb3dCaXRzKSB7CisgICAgICAgIFpGUkVFKHN0cm0sIHN0YXRlLT53aW5kb3cpOworICAgICAgICBzdGF0ZS0+d2luZG93ID0gWl9OVUxMOworICAgIH0KKworICAgIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmVzZXQgdGhlIHJlc3Qgb2YgaXQgKi8KKyAgICBzdGF0ZS0+d3JhcCA9IHdyYXA7CisgICAgc3RhdGUtPndiaXRzID0gKHVuc2lnbmVkKXdpbmRvd0JpdHM7CisgICAgcmV0dXJuIGluZmxhdGVSZXNldChzdHJtKTsKK30KKworaW50IFpFWFBPUlQgaW5mbGF0ZUluaXQyXyhzdHJtLCB3aW5kb3dCaXRzLCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSkKK3pfc3RyZWFtcCBzdHJtOworaW50IHdpbmRvd0JpdHM7Citjb25zdCBjaGFyICp2ZXJzaW9uOworaW50IHN0cmVhbV9zaXplOworeworICAgIGludCByZXQ7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIGlmICh2ZXJzaW9uID09IFpfTlVMTCB8fCB2ZXJzaW9uWzBdICE9IFpMSUJfVkVSU0lPTlswXSB8fAorICAgICAgICBzdHJlYW1fc2l6ZSAhPSAoaW50KShzaXplb2Yoel9zdHJlYW0pKSkKKyAgICAgICAgcmV0dXJuIFpfVkVSU0lPTl9FUlJPUjsKKyAgICBpZiAoc3RybSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdHJtLT5tc2cgPSBaX05VTEw7ICAgICAgICAgICAgICAgICAvKiBpbiBjYXNlIHdlIHJldHVybiBhbiBlcnJvciAqLworICAgIGlmIChzdHJtLT56YWxsb2MgPT0gKGFsbG9jX2Z1bmMpMCkgeworI2lmZGVmIFpfU09MTworICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisjZWxzZQorICAgICAgICBzdHJtLT56YWxsb2MgPSB6Y2FsbG9jOworICAgICAgICBzdHJtLT5vcGFxdWUgPSAodm9pZHBmKTA7CisjZW5kaWYKKyAgICB9CisgICAgaWYgKHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCkKKyNpZmRlZiBaX1NPTE8KKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworI2Vsc2UKKyAgICAgICAgc3RybS0+emZyZWUgPSB6Y2ZyZWU7CisjZW5kaWYKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKikKKyAgICAgICAgICAgIFpBTExPQyhzdHJtLCAxLCBzaXplb2Yoc3RydWN0IGluZmxhdGVfc3RhdGUpKTsKKyAgICBpZiAoc3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiBhbGxvY2F0ZWRcbiIpKTsKKyAgICBzdHJtLT5zdGF0ZSA9IChzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICopc3RhdGU7CisgICAgc3RhdGUtPndpbmRvdyA9IFpfTlVMTDsKKyAgICByZXQgPSBpbmZsYXRlUmVzZXQyKHN0cm0sIHdpbmRvd0JpdHMpOworICAgIGlmIChyZXQgIT0gWl9PSykgeworICAgICAgICBaRlJFRShzdHJtLCBzdGF0ZSk7CisgICAgICAgIHN0cm0tPnN0YXRlID0gWl9OVUxMOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdF8oc3RybSwgdmVyc2lvbiwgc3RyZWFtX3NpemUpCit6X3N0cmVhbXAgc3RybTsKK2NvbnN0IGNoYXIgKnZlcnNpb247CitpbnQgc3RyZWFtX3NpemU7Cit7CisgICAgcmV0dXJuIGluZmxhdGVJbml0Ml8oc3RybSwgREVGX1dCSVRTLCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSk7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVQcmltZShzdHJtLCBiaXRzLCB2YWx1ZSkKK3pfc3RyZWFtcCBzdHJtOworaW50IGJpdHM7CitpbnQgdmFsdWU7Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKyAgICBpZiAoYml0cyA8IDApIHsKKyAgICAgICAgc3RhdGUtPmhvbGQgPSAwOworICAgICAgICBzdGF0ZS0+Yml0cyA9IDA7CisgICAgICAgIHJldHVybiBaX09LOworICAgIH0KKyAgICBpZiAoYml0cyA+IDE2IHx8IHN0YXRlLT5iaXRzICsgYml0cyA+IDMyKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgdmFsdWUgJj0gKDFMIDw8IGJpdHMpIC0gMTsKKyAgICBzdGF0ZS0+aG9sZCArPSB2YWx1ZSA8PCBzdGF0ZS0+Yml0czsKKyAgICBzdGF0ZS0+Yml0cyArPSBiaXRzOworICAgIHJldHVybiBaX09LOworfQorCisvKgorICAgUmV0dXJuIHN0YXRlIHdpdGggbGVuZ3RoIGFuZCBkaXN0YW5jZSBkZWNvZGluZyB0YWJsZXMgYW5kIGluZGV4IHNpemVzIHNldCB0bworICAgZml4ZWQgY29kZSBkZWNvZGluZy4gIE5vcm1hbGx5IHRoaXMgcmV0dXJucyBmaXhlZCB0YWJsZXMgZnJvbSBpbmZmaXhlZC5oLgorICAgSWYgQlVJTERGSVhFRCBpcyBkZWZpbmVkLCB0aGVuIGluc3RlYWQgdGhpcyByb3V0aW5lIGJ1aWxkcyB0aGUgdGFibGVzIHRoZQorICAgZmlyc3QgdGltZSBpdCdzIGNhbGxlZCwgYW5kIHJldHVybnMgdGhvc2UgdGFibGVzIHRoZSBmaXJzdCB0aW1lIGFuZAorICAgdGhlcmVhZnRlci4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgY29kZSBieSBhYm91dCAySyBieXRlcywgaW4KKyAgIGV4Y2hhbmdlIGZvciBhIGxpdHRsZSBleGVjdXRpb24gdGltZS4gIEhvd2V2ZXIsIEJVSUxERklYRUQgc2hvdWxkIG5vdCBiZQorICAgdXNlZCBmb3IgdGhyZWFkZWQgYXBwbGljYXRpb25zLCBzaW5jZSB0aGUgcmV3cml0aW5nIG9mIHRoZSB0YWJsZXMgYW5kIHZpcmdpbgorICAgbWF5IG5vdCBiZSB0aHJlYWQtc2FmZS4KKyAqLworbG9jYWwgdm9pZCBmaXhlZHRhYmxlcyhzdGF0ZSkKK3N0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Cit7CisjaWZkZWYgQlVJTERGSVhFRAorICAgIHN0YXRpYyBpbnQgdmlyZ2luID0gMTsKKyAgICBzdGF0aWMgY29kZSAqbGVuZml4LCAqZGlzdGZpeDsKKyAgICBzdGF0aWMgY29kZSBmaXhlZFs1NDRdOworCisgICAgLyogYnVpbGQgZml4ZWQgaHVmZm1hbiB0YWJsZXMgaWYgZmlyc3QgY2FsbCAobWF5IG5vdCBiZSB0aHJlYWQgc2FmZSkgKi8KKyAgICBpZiAodmlyZ2luKSB7CisgICAgICAgIHVuc2lnbmVkIHN5bSwgYml0czsKKyAgICAgICAgc3RhdGljIGNvZGUgKm5leHQ7CisKKyAgICAgICAgLyogbGl0ZXJhbC9sZW5ndGggdGFibGUgKi8KKyAgICAgICAgc3ltID0gMDsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDE0NCkgc3RhdGUtPmxlbnNbc3ltKytdID0gODsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDI1Nikgc3RhdGUtPmxlbnNbc3ltKytdID0gOTsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDI4MCkgc3RhdGUtPmxlbnNbc3ltKytdID0gNzsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDI4OCkgc3RhdGUtPmxlbnNbc3ltKytdID0gODsKKyAgICAgICAgbmV4dCA9IGZpeGVkOworICAgICAgICBsZW5maXggPSBuZXh0OworICAgICAgICBiaXRzID0gOTsKKyAgICAgICAgaW5mbGF0ZV90YWJsZShMRU5TLCBzdGF0ZS0+bGVucywgMjg4LCAmKG5leHQpLCAmKGJpdHMpLCBzdGF0ZS0+d29yayk7CisKKyAgICAgICAgLyogZGlzdGFuY2UgdGFibGUgKi8KKyAgICAgICAgc3ltID0gMDsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDMyKSBzdGF0ZS0+bGVuc1tzeW0rK10gPSA1OworICAgICAgICBkaXN0Zml4ID0gbmV4dDsKKyAgICAgICAgYml0cyA9IDU7CisgICAgICAgIGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLT5sZW5zLCAzMiwgJihuZXh0KSwgJihiaXRzKSwgc3RhdGUtPndvcmspOworCisgICAgICAgIC8qIGRvIHRoaXMganVzdCBvbmNlICovCisgICAgICAgIHZpcmdpbiA9IDA7CisgICAgfQorI2Vsc2UgLyogIUJVSUxERklYRUQgKi8KKyMgICBpbmNsdWRlICJpbmZmaXhlZC5oIgorI2VuZGlmIC8qIEJVSUxERklYRUQgKi8KKyAgICBzdGF0ZS0+bGVuY29kZSA9IGxlbmZpeDsKKyAgICBzdGF0ZS0+bGVuYml0cyA9IDk7CisgICAgc3RhdGUtPmRpc3Rjb2RlID0gZGlzdGZpeDsKKyAgICBzdGF0ZS0+ZGlzdGJpdHMgPSA1OworfQorCisjaWZkZWYgTUFLRUZJWEVECisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyoKKyAgIFdyaXRlIG91dCB0aGUgaW5mZml4ZWQuaCB0aGF0IGlzICNpbmNsdWRlJ2QgYWJvdmUuICBEZWZpbmluZyBNQUtFRklYRUQgYWxzbworICAgZGVmaW5lcyBCVUlMREZJWEVELCBzbyB0aGUgdGFibGVzIGFyZSBidWlsdCBvbiB0aGUgZmx5LiAgbWFrZWZpeGVkKCkgd3JpdGVzCisgICB0aG9zZSB0YWJsZXMgdG8gc3Rkb3V0LCB3aGljaCB3b3VsZCBiZSBwaXBlZCB0byBpbmZmaXhlZC5oLiAgQSBzbWFsbCBwcm9ncmFtCisgICBjYW4gc2ltcGx5IGNhbGwgbWFrZWZpeGVkIHRvIGRvIHRoaXM6CisKKyAgICB2b2lkIG1ha2VmaXhlZCh2b2lkKTsKKworICAgIGludCBtYWluKHZvaWQpCisgICAgeworICAgICAgICBtYWtlZml4ZWQoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICBUaGVuIHRoYXQgY2FuIGJlIGxpbmtlZCB3aXRoIHpsaWIgYnVpbHQgd2l0aCBNQUtFRklYRUQgZGVmaW5lZCBhbmQgcnVuOgorCisgICAgYS5vdXQgPiBpbmZmaXhlZC5oCisgKi8KK3ZvaWQgbWFrZWZpeGVkKCkKK3sKKyAgICB1bnNpZ25lZCBsb3csIHNpemU7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgc3RhdGU7CisKKyAgICBmaXhlZHRhYmxlcygmc3RhdGUpOworICAgIHB1dHMoIiAgICAvKiBpbmZmaXhlZC5oIC0tIHRhYmxlIGZvciBkZWNvZGluZyBmaXhlZCBjb2RlcyIpOworICAgIHB1dHMoIiAgICAgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBtYWtlZml4ZWQoKS4iKTsKKyAgICBwdXRzKCIgICAgICovIik7CisgICAgcHV0cygiIik7CisgICAgcHV0cygiICAgIC8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIik7CisgICAgcHV0cygiICAgICAgIEl0IGlzIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbGlicmFyeSBhbmQgaXMiKTsKKyAgICBwdXRzKCIgICAgICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLiIpOworICAgIHB1dHMoIiAgICAgKi8iKTsKKyAgICBwdXRzKCIiKTsKKyAgICBzaXplID0gMVUgPDwgOTsKKyAgICBwcmludGYoIiAgICBzdGF0aWMgY29uc3QgY29kZSBsZW5maXhbJXVdID0geyIsIHNpemUpOworICAgIGxvdyA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoKGxvdyAlIDcpID09IDApIHByaW50ZigiXG4gICAgICAgICIpOworICAgICAgICBwcmludGYoInsldSwldSwlZH0iLCAobG93ICYgMTI3KSA9PSA5OSA/IDY0IDogc3RhdGUubGVuY29kZVtsb3ddLm9wLAorICAgICAgICAgICAgICAgc3RhdGUubGVuY29kZVtsb3ddLmJpdHMsIHN0YXRlLmxlbmNvZGVbbG93XS52YWwpOworICAgICAgICBpZiAoKytsb3cgPT0gc2l6ZSkgYnJlYWs7CisgICAgICAgIHB1dGNoYXIoJywnKTsKKyAgICB9CisgICAgcHV0cygiXG4gICAgfTsiKTsKKyAgICBzaXplID0gMVUgPDwgNTsKKyAgICBwcmludGYoIlxuICAgIHN0YXRpYyBjb25zdCBjb2RlIGRpc3RmaXhbJXVdID0geyIsIHNpemUpOworICAgIGxvdyA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoKGxvdyAlIDYpID09IDApIHByaW50ZigiXG4gICAgICAgICIpOworICAgICAgICBwcmludGYoInsldSwldSwlZH0iLCBzdGF0ZS5kaXN0Y29kZVtsb3ddLm9wLCBzdGF0ZS5kaXN0Y29kZVtsb3ddLmJpdHMsCisgICAgICAgICAgICAgICBzdGF0ZS5kaXN0Y29kZVtsb3ddLnZhbCk7CisgICAgICAgIGlmICgrK2xvdyA9PSBzaXplKSBicmVhazsKKyAgICAgICAgcHV0Y2hhcignLCcpOworICAgIH0KKyAgICBwdXRzKCJcbiAgICB9OyIpOworfQorI2VuZGlmIC8qIE1BS0VGSVhFRCAqLworCisvKgorICAgVXBkYXRlIHRoZSB3aW5kb3cgd2l0aCB0aGUgbGFzdCB3c2l6ZSAobm9ybWFsbHkgMzJLKSBieXRlcyB3cml0dGVuIGJlZm9yZQorICAgcmV0dXJuaW5nLiAgSWYgd2luZG93IGRvZXMgbm90IGV4aXN0IHlldCwgY3JlYXRlIGl0LiAgVGhpcyBpcyBvbmx5IGNhbGxlZAorICAgd2hlbiBhIHdpbmRvdyBpcyBhbHJlYWR5IGluIHVzZSwgb3Igd2hlbiBvdXRwdXQgaGFzIGJlZW4gd3JpdHRlbiBkdXJpbmcgdGhpcworICAgaW5mbGF0ZSBjYWxsLCBidXQgdGhlIGVuZCBvZiB0aGUgZGVmbGF0ZSBzdHJlYW0gaGFzIG5vdCBiZWVuIHJlYWNoZWQgeWV0LgorICAgSXQgaXMgYWxzbyBjYWxsZWQgdG8gY3JlYXRlIGEgd2luZG93IGZvciBkaWN0aW9uYXJ5IGRhdGEgd2hlbiBhIGRpY3Rpb25hcnkKKyAgIGlzIGxvYWRlZC4KKworICAgUHJvdmlkaW5nIG91dHB1dCBidWZmZXJzIGxhcmdlciB0aGFuIDMySyB0byBpbmZsYXRlKCkgc2hvdWxkIHByb3ZpZGUgYSBzcGVlZAorICAgYWR2YW50YWdlLCBzaW5jZSBvbmx5IHRoZSBsYXN0IDMySyBvZiBvdXRwdXQgaXMgY29waWVkIHRvIHRoZSBzbGlkaW5nIHdpbmRvdworICAgdXBvbiByZXR1cm4gZnJvbSBpbmZsYXRlKCksIGFuZCBzaW5jZSBhbGwgZGlzdGFuY2VzIGFmdGVyIHRoZSBmaXJzdCAzMksgb2YKKyAgIG91dHB1dCB3aWxsIGZhbGwgaW4gdGhlIG91dHB1dCBkYXRhLCBtYWtpbmcgbWF0Y2ggY29waWVzIHNpbXBsZXIgYW5kIGZhc3Rlci4KKyAgIFRoZSBhZHZhbnRhZ2UgbWF5IGJlIGRlcGVuZGVudCBvbiB0aGUgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yJ3MgZGF0YSBjYWNoZXMuCisgKi8KK2xvY2FsIGludCB1cGRhdGV3aW5kb3coc3RybSwgZW5kLCBjb3B5KQorel9zdHJlYW1wIHN0cm07Citjb25zdCBCeXRlZiAqZW5kOwordW5zaWduZWQgY29weTsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworICAgIHVuc2lnbmVkIGRpc3Q7CisKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKworICAgIC8qIGlmIGl0IGhhc24ndCBiZWVuIGRvbmUgYWxyZWFkeSwgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSB3aW5kb3cgKi8KKyAgICBpZiAoc3RhdGUtPndpbmRvdyA9PSBaX05VTEwpIHsKKyAgICAgICAgc3RhdGUtPndpbmRvdyA9ICh1bnNpZ25lZCBjaGFyIEZBUiAqKQorICAgICAgICAgICAgICAgICAgICAgICAgWkFMTE9DKHN0cm0sIDFVIDw8IHN0YXRlLT53Yml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodW5zaWduZWQgY2hhcikpOworICAgICAgICBpZiAoc3RhdGUtPndpbmRvdyA9PSBaX05VTEwpIHJldHVybiAxOworICAgIH0KKworICAgIC8qIGlmIHdpbmRvdyBub3QgaW4gdXNlIHlldCwgaW5pdGlhbGl6ZSAqLworICAgIGlmIChzdGF0ZS0+d3NpemUgPT0gMCkgeworICAgICAgICBzdGF0ZS0+d3NpemUgPSAxVSA8PCBzdGF0ZS0+d2JpdHM7CisgICAgICAgIHN0YXRlLT53bmV4dCA9IDA7CisgICAgICAgIHN0YXRlLT53aGF2ZSA9IDA7CisgICAgfQorCisgICAgLyogY29weSBzdGF0ZS0+d3NpemUgb3IgbGVzcyBvdXRwdXQgYnl0ZXMgaW50byB0aGUgY2lyY3VsYXIgd2luZG93ICovCisgICAgaWYgKGNvcHkgPj0gc3RhdGUtPndzaXplKSB7CisgICAgICAgIHptZW1jcHkoc3RhdGUtPndpbmRvdywgZW5kIC0gc3RhdGUtPndzaXplLCBzdGF0ZS0+d3NpemUpOworICAgICAgICBzdGF0ZS0+d25leHQgPSAwOworICAgICAgICBzdGF0ZS0+d2hhdmUgPSBzdGF0ZS0+d3NpemU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkaXN0ID0gc3RhdGUtPndzaXplIC0gc3RhdGUtPnduZXh0OworICAgICAgICBpZiAoZGlzdCA+IGNvcHkpIGRpc3QgPSBjb3B5OworICAgICAgICB6bWVtY3B5KHN0YXRlLT53aW5kb3cgKyBzdGF0ZS0+d25leHQsIGVuZCAtIGNvcHksIGRpc3QpOworICAgICAgICBjb3B5IC09IGRpc3Q7CisgICAgICAgIGlmIChjb3B5KSB7CisgICAgICAgICAgICB6bWVtY3B5KHN0YXRlLT53aW5kb3csIGVuZCAtIGNvcHksIGNvcHkpOworICAgICAgICAgICAgc3RhdGUtPnduZXh0ID0gY29weTsKKyAgICAgICAgICAgIHN0YXRlLT53aGF2ZSA9IHN0YXRlLT53c2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHN0YXRlLT53bmV4dCArPSBkaXN0OworICAgICAgICAgICAgaWYgKHN0YXRlLT53bmV4dCA9PSBzdGF0ZS0+d3NpemUpIHN0YXRlLT53bmV4dCA9IDA7CisgICAgICAgICAgICBpZiAoc3RhdGUtPndoYXZlIDwgc3RhdGUtPndzaXplKSBzdGF0ZS0+d2hhdmUgKz0gZGlzdDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogTWFjcm9zIGZvciBpbmZsYXRlKCk6ICovCisKKy8qIGNoZWNrIGZ1bmN0aW9uIHRvIHVzZSBhZGxlcjMyKCkgZm9yIHpsaWIgb3IgY3JjMzIoKSBmb3IgZ3ppcCAqLworI2lmZGVmIEdVTlpJUAorIyAgZGVmaW5lIFVQREFURShjaGVjaywgYnVmLCBsZW4pIFwKKyAgICAoc3RhdGUtPmZsYWdzID8gY3JjMzIoY2hlY2ssIGJ1ZiwgbGVuKSA6IGFkbGVyMzIoY2hlY2ssIGJ1ZiwgbGVuKSkKKyNlbHNlCisjICBkZWZpbmUgVVBEQVRFKGNoZWNrLCBidWYsIGxlbikgYWRsZXIzMihjaGVjaywgYnVmLCBsZW4pCisjZW5kaWYKKworLyogY2hlY2sgbWFjcm9zIGZvciBoZWFkZXIgY3JjICovCisjaWZkZWYgR1VOWklQCisjICBkZWZpbmUgQ1JDMihjaGVjaywgd29yZCkgXAorICAgIGRvIHsgXAorICAgICAgICBoYnVmWzBdID0gKHVuc2lnbmVkIGNoYXIpKHdvcmQpOyBcCisgICAgICAgIGhidWZbMV0gPSAodW5zaWduZWQgY2hhcikoKHdvcmQpID4+IDgpOyBcCisgICAgICAgIGNoZWNrID0gY3JjMzIoY2hlY2ssIGhidWYsIDIpOyBcCisgICAgfSB3aGlsZSAoMCkKKworIyAgZGVmaW5lIENSQzQoY2hlY2ssIHdvcmQpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaGJ1ZlswXSA9ICh1bnNpZ25lZCBjaGFyKSh3b3JkKTsgXAorICAgICAgICBoYnVmWzFdID0gKHVuc2lnbmVkIGNoYXIpKCh3b3JkKSA+PiA4KTsgXAorICAgICAgICBoYnVmWzJdID0gKHVuc2lnbmVkIGNoYXIpKCh3b3JkKSA+PiAxNik7IFwKKyAgICAgICAgaGJ1ZlszXSA9ICh1bnNpZ25lZCBjaGFyKSgod29yZCkgPj4gMjQpOyBcCisgICAgICAgIGNoZWNrID0gY3JjMzIoY2hlY2ssIGhidWYsIDQpOyBcCisgICAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKiBMb2FkIHJlZ2lzdGVycyB3aXRoIHN0YXRlIGluIGluZmxhdGUoKSBmb3Igc3BlZWQgKi8KKyNkZWZpbmUgTE9BRCgpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgcHV0ID0gc3RybS0+bmV4dF9vdXQ7IFwKKyAgICAgICAgbGVmdCA9IHN0cm0tPmF2YWlsX291dDsgXAorICAgICAgICBuZXh0ID0gc3RybS0+bmV4dF9pbjsgXAorICAgICAgICBoYXZlID0gc3RybS0+YXZhaWxfaW47IFwKKyAgICAgICAgaG9sZCA9IHN0YXRlLT5ob2xkOyBcCisgICAgICAgIGJpdHMgPSBzdGF0ZS0+Yml0czsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIFJlc3RvcmUgc3RhdGUgZnJvbSByZWdpc3RlcnMgaW4gaW5mbGF0ZSgpICovCisjZGVmaW5lIFJFU1RPUkUoKSBcCisgICAgZG8geyBcCisgICAgICAgIHN0cm0tPm5leHRfb3V0ID0gcHV0OyBcCisgICAgICAgIHN0cm0tPmF2YWlsX291dCA9IGxlZnQ7IFwKKyAgICAgICAgc3RybS0+bmV4dF9pbiA9IG5leHQ7IFwKKyAgICAgICAgc3RybS0+YXZhaWxfaW4gPSBoYXZlOyBcCisgICAgICAgIHN0YXRlLT5ob2xkID0gaG9sZDsgXAorICAgICAgICBzdGF0ZS0+Yml0cyA9IGJpdHM7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBDbGVhciB0aGUgaW5wdXQgYml0IGFjY3VtdWxhdG9yICovCisjZGVmaW5lIElOSVRCSVRTKCkgXAorICAgIGRvIHsgXAorICAgICAgICBob2xkID0gMDsgXAorICAgICAgICBiaXRzID0gMDsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIEdldCBhIGJ5dGUgb2YgaW5wdXQgaW50byB0aGUgYml0IGFjY3VtdWxhdG9yLCBvciByZXR1cm4gZnJvbSBpbmZsYXRlKCkKKyAgIGlmIHRoZXJlIGlzIG5vIGlucHV0IGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgUFVMTEJZVEUoKSBcCisgICAgZG8geyBcCisgICAgICAgIGlmIChoYXZlID09IDApIGdvdG8gaW5mX2xlYXZlOyBcCisgICAgICAgIGhhdmUtLTsgXAorICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKSgqbmV4dCsrKSA8PCBiaXRzOyBcCisgICAgICAgIGJpdHMgKz0gODsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIEFzc3VyZSB0aGF0IHRoZXJlIGFyZSBhdCBsZWFzdCBuIGJpdHMgaW4gdGhlIGJpdCBhY2N1bXVsYXRvci4gIElmIHRoZXJlIGlzCisgICBub3QgZW5vdWdoIGF2YWlsYWJsZSBpbnB1dCB0byBkbyB0aGF0LCB0aGVuIHJldHVybiBmcm9tIGluZmxhdGUoKS4gKi8KKyNkZWZpbmUgTkVFREJJVFMobikgXAorICAgIGRvIHsgXAorICAgICAgICB3aGlsZSAoYml0cyA8ICh1bnNpZ25lZCkobikpIFwKKyAgICAgICAgICAgIFBVTExCWVRFKCk7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBSZXR1cm4gdGhlIGxvdyBuIGJpdHMgb2YgdGhlIGJpdCBhY2N1bXVsYXRvciAobiA8IDE2KSAqLworI2RlZmluZSBCSVRTKG4pIFwKKyAgICAoKHVuc2lnbmVkKWhvbGQgJiAoKDFVIDw8IChuKSkgLSAxKSkKKworLyogUmVtb3ZlIG4gYml0cyBmcm9tIHRoZSBiaXQgYWNjdW11bGF0b3IgKi8KKyNkZWZpbmUgRFJPUEJJVFMobikgXAorICAgIGRvIHsgXAorICAgICAgICBob2xkID4+PSAobik7IFwKKyAgICAgICAgYml0cyAtPSAodW5zaWduZWQpKG4pOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogUmVtb3ZlIHplcm8gdG8gc2V2ZW4gYml0cyBhcyBuZWVkZWQgdG8gZ28gdG8gYSBieXRlIGJvdW5kYXJ5ICovCisjZGVmaW5lIEJZVEVCSVRTKCkgXAorICAgIGRvIHsgXAorICAgICAgICBob2xkID4+PSBiaXRzICYgNzsgXAorICAgICAgICBiaXRzIC09IGJpdHMgJiA3OyBcCisgICAgfSB3aGlsZSAoMCkKKworLyoKKyAgIGluZmxhdGUoKSB1c2VzIGEgc3RhdGUgbWFjaGluZSB0byBwcm9jZXNzIGFzIG11Y2ggaW5wdXQgZGF0YSBhbmQgZ2VuZXJhdGUgYXMKKyAgIG11Y2ggb3V0cHV0IGRhdGEgYXMgcG9zc2libGUgYmVmb3JlIHJldHVybmluZy4gIFRoZSBzdGF0ZSBtYWNoaW5lIGlzCisgICBzdHJ1Y3R1cmVkIHJvdWdobHkgYXMgZm9sbG93czoKKworICAgIGZvciAoOzspIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAuLi4KKyAgICBjYXNlIFNUQVRFbjoKKyAgICAgICAgaWYgKG5vdCBlbm91Z2ggaW5wdXQgZGF0YSBvciBvdXRwdXQgc3BhY2UgdG8gbWFrZSBwcm9ncmVzcykKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgLi4uIG1ha2UgcHJvZ3Jlc3MgLi4uCisgICAgICAgIHN0YXRlID0gU1RBVEVtOworICAgICAgICBicmVhazsKKyAgICAuLi4KKyAgICB9CisKKyAgIHNvIHdoZW4gaW5mbGF0ZSgpIGlzIGNhbGxlZCBhZ2FpbiwgdGhlIHNhbWUgY2FzZSBpcyBhdHRlbXB0ZWQgYWdhaW4sIGFuZAorICAgaWYgdGhlIGFwcHJvcHJpYXRlIHJlc291cmNlcyBhcmUgcHJvdmlkZWQsIHRoZSBtYWNoaW5lIHByb2NlZWRzIHRvIHRoZQorICAgbmV4dCBzdGF0ZS4gIFRoZSBORUVEQklUUygpIG1hY3JvIGlzIHVzdWFsbHkgdGhlIHdheSB0aGUgc3RhdGUgZXZhbHVhdGVzCisgICB3aGV0aGVyIGl0IGNhbiBwcm9jZWVkIG9yIHNob3VsZCByZXR1cm4uICBORUVEQklUUygpIGRvZXMgdGhlIHJldHVybiBpZgorICAgdGhlIHJlcXVlc3RlZCBiaXRzIGFyZSBub3QgYXZhaWxhYmxlLiAgVGhlIHR5cGljYWwgdXNlIG9mIHRoZSBCSVRTIG1hY3JvcworICAgaXM6CisKKyAgICAgICAgTkVFREJJVFMobik7CisgICAgICAgIC4uLiBkbyBzb21ldGhpbmcgd2l0aCBCSVRTKG4pIC4uLgorICAgICAgICBEUk9QQklUUyhuKTsKKworICAgd2hlcmUgTkVFREJJVFMobikgZWl0aGVyIHJldHVybnMgZnJvbSBpbmZsYXRlKCkgaWYgdGhlcmUgaXNuJ3QgZW5vdWdoCisgICBpbnB1dCBsZWZ0IHRvIGxvYWQgbiBiaXRzIGludG8gdGhlIGFjY3VtdWxhdG9yLCBvciBpdCBjb250aW51ZXMuICBCSVRTKG4pCisgICBnaXZlcyB0aGUgbG93IG4gYml0cyBpbiB0aGUgYWNjdW11bGF0b3IuICBXaGVuIGRvbmUsIERST1BCSVRTKG4pIGRyb3BzCisgICB0aGUgbG93IG4gYml0cyBvZmYgdGhlIGFjY3VtdWxhdG9yLiAgSU5JVEJJVFMoKSBjbGVhcnMgdGhlIGFjY3VtdWxhdG9yCisgICBhbmQgc2V0cyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBiaXRzIHRvIHplcm8uICBCWVRFQklUUygpIGRpc2NhcmRzIGp1c3QKKyAgIGVub3VnaCBiaXRzIHRvIHB1dCB0aGUgYWNjdW11bGF0b3Igb24gYSBieXRlIGJvdW5kYXJ5LiAgQWZ0ZXIgQllURUJJVFMoKQorICAgYW5kIGEgTkVFREJJVFMoOCksIHRoZW4gQklUUyg4KSB3b3VsZCByZXR1cm4gdGhlIG5leHQgYnl0ZSBpbiB0aGUgc3RyZWFtLgorCisgICBORUVEQklUUyhuKSB1c2VzIFBVTExCWVRFKCkgdG8gZ2V0IGFuIGF2YWlsYWJsZSBieXRlIG9mIGlucHV0LCBvciB0byByZXR1cm4KKyAgIGlmIHRoZXJlIGlzIG5vIGlucHV0IGF2YWlsYWJsZS4gIFRoZSBkZWNvZGluZyBvZiB2YXJpYWJsZSBsZW5ndGggY29kZXMgdXNlcworICAgUFVMTEJZVEUoKSBkaXJlY3RseSBpbiBvcmRlciB0byBwdWxsIGp1c3QgZW5vdWdoIGJ5dGVzIHRvIGRlY29kZSB0aGUgbmV4dAorICAgY29kZSwgYW5kIG5vIG1vcmUuCisKKyAgIFNvbWUgc3RhdGVzIGxvb3AgdW50aWwgdGhleSBnZXQgZW5vdWdoIGlucHV0LCBtYWtpbmcgc3VyZSB0aGF0IGVub3VnaAorICAgc3RhdGUgaW5mb3JtYXRpb24gaXMgbWFpbnRhaW5lZCB0byBjb250aW51ZSB0aGUgbG9vcCB3aGVyZSBpdCBsZWZ0IG9mZgorICAgaWYgTkVFREJJVFMoKSByZXR1cm5zIGluIHRoZSBsb29wLiAgRm9yIGV4YW1wbGUsIHdhbnQsIG5lZWQsIGFuZCBrZWVwCisgICB3b3VsZCBhbGwgaGF2ZSB0byBhY3R1YWxseSBiZSBwYXJ0IG9mIHRoZSBzYXZlZCBzdGF0ZSBpbiBjYXNlIE5FRURCSVRTKCkKKyAgIHJldHVybnM6CisKKyAgICBjYXNlIFNUQVRFdzoKKyAgICAgICAgd2hpbGUgKHdhbnQgPCBuZWVkKSB7CisgICAgICAgICAgICBORUVEQklUUyhuKTsKKyAgICAgICAgICAgIGtlZXBbd2FudCsrXSA9IEJJVFMobik7CisgICAgICAgICAgICBEUk9QQklUUyhuKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZSA9IFNUQVRFeDsKKyAgICBjYXNlIFNUQVRFeDoKKworICAgQXMgc2hvd24gYWJvdmUsIGlmIHRoZSBuZXh0IHN0YXRlIGlzIGFsc28gdGhlIG5leHQgY2FzZSwgdGhlbiB0aGUgYnJlYWsKKyAgIGlzIG9taXR0ZWQuCisKKyAgIEEgc3RhdGUgbWF5IGFsc28gcmV0dXJuIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggb3V0cHV0IHNwYWNlIGF2YWlsYWJsZSB0bworICAgY29tcGxldGUgdGhhdCBzdGF0ZS4gIFRob3NlIHN0YXRlcyBhcmUgY29weWluZyBzdG9yZWQgZGF0YSwgd3JpdGluZyBhCisgICBsaXRlcmFsIGJ5dGUsIGFuZCBjb3B5aW5nIGEgbWF0Y2hpbmcgc3RyaW5nLgorCisgICBXaGVuIHJldHVybmluZywgYSAiZ290byBpbmZfbGVhdmUiIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSB0b3RhbCBjb3VudGVycywKKyAgIHVwZGF0ZSB0aGUgY2hlY2sgdmFsdWUsIGFuZCBkZXRlcm1pbmUgd2hldGhlciBhbnkgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZQorICAgZHVyaW5nIHRoYXQgaW5mbGF0ZSgpIGNhbGwgaW4gb3JkZXIgdG8gcmV0dXJuIHRoZSBwcm9wZXIgcmV0dXJuIGNvZGUuCisgICBQcm9ncmVzcyBpcyBkZWZpbmVkIGFzIGEgY2hhbmdlIGluIGVpdGhlciBzdHJtLT5hdmFpbF9pbiBvciBzdHJtLT5hdmFpbF9vdXQuCisgICBXaGVuIHRoZXJlIGlzIGEgd2luZG93LCBnb3RvIGluZl9sZWF2ZSB3aWxsIHVwZGF0ZSB0aGUgd2luZG93IHdpdGggdGhlIGxhc3QKKyAgIG91dHB1dCB3cml0dGVuLiAgSWYgYSBnb3RvIGluZl9sZWF2ZSBvY2N1cnMgaW4gdGhlIG1pZGRsZSBvZiBkZWNvbXByZXNzaW9uCisgICBhbmQgdGhlcmUgaXMgbm8gd2luZG93IGN1cnJlbnRseSwgZ290byBpbmZfbGVhdmUgd2lsbCBjcmVhdGUgb25lIGFuZCBjb3B5CisgICBvdXRwdXQgdG8gdGhlIHdpbmRvdyBmb3IgdGhlIG5leHQgY2FsbCBvZiBpbmZsYXRlKCkuCisKKyAgIEluIHRoaXMgaW1wbGVtZW50YXRpb24sIHRoZSBmbHVzaCBwYXJhbWV0ZXIgb2YgaW5mbGF0ZSgpIG9ubHkgYWZmZWN0cyB0aGUKKyAgIHJldHVybiBjb2RlIChwZXIgemxpYi5oKS4gIGluZmxhdGUoKSBhbHdheXMgd3JpdGVzIGFzIG11Y2ggYXMgcG9zc2libGUgdG8KKyAgIHN0cm0tPm5leHRfb3V0LCBnaXZlbiB0aGUgc3BhY2UgYXZhaWxhYmxlIGFuZCB0aGUgcHJvdmlkZWQgaW5wdXQtLXRoZSBlZmZlY3QKKyAgIGRvY3VtZW50ZWQgaW4gemxpYi5oIG9mIFpfU1lOQ19GTFVTSC4gIEZ1cnRoZXJtb3JlLCBpbmZsYXRlKCkgYWx3YXlzIGRlZmVycworICAgdGhlIGFsbG9jYXRpb24gb2YgYW5kIGNvcHlpbmcgaW50byBhIHNsaWRpbmcgd2luZG93IHVudGlsIG5lY2Vzc2FyeSwgd2hpY2gKKyAgIHByb3ZpZGVzIHRoZSBlZmZlY3QgZG9jdW1lbnRlZCBpbiB6bGliLmggZm9yIFpfRklOSVNIIHdoZW4gdGhlIGVudGlyZSBpbnB1dAorICAgc3RyZWFtIGF2YWlsYWJsZS4gIFNvIHRoZSBvbmx5IHRoaW5nIHRoZSBmbHVzaCBwYXJhbWV0ZXIgYWN0dWFsbHkgZG9lcyBpczoKKyAgIHdoZW4gZmx1c2ggaXMgc2V0IHRvIFpfRklOSVNILCBpbmZsYXRlKCkgY2Fubm90IHJldHVybiBaX09LLiAgSW5zdGVhZCBpdAorICAgd2lsbCByZXR1cm4gWl9CVUZfRVJST1IgaWYgaXQgaGFzIG5vdCByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4KKyAqLworCitpbnQgWkVYUE9SVCBpbmZsYXRlKHN0cm0sIGZsdXNoKQorel9zdHJlYW1wIHN0cm07CitpbnQgZmx1c2g7Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKyAgICB6X2NvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICpuZXh0OyAgICAvKiBuZXh0IGlucHV0ICovCisgICAgdW5zaWduZWQgY2hhciBGQVIgKnB1dDsgICAgIC8qIG5leHQgb3V0cHV0ICovCisgICAgdW5zaWduZWQgaGF2ZSwgbGVmdDsgICAgICAgIC8qIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovCisgICAgdW5zaWduZWQgbG9uZyBob2xkOyAgICAgICAgIC8qIGJpdCBidWZmZXIgKi8KKyAgICB1bnNpZ25lZCBiaXRzOyAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovCisgICAgdW5zaWduZWQgaW4sIG91dDsgICAgICAgICAgIC8qIHNhdmUgc3RhcnRpbmcgYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi8KKyAgICB1bnNpZ25lZCBjb3B5OyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN0b3JlZCBvciBtYXRjaCBieXRlcyB0byBjb3B5ICovCisgICAgdW5zaWduZWQgY2hhciBGQVIgKmZyb207ICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggYnl0ZXMgZnJvbSAqLworICAgIGNvZGUgaGVyZTsgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IGRlY29kaW5nIHRhYmxlIGVudHJ5ICovCisgICAgY29kZSBsYXN0OyAgICAgICAgICAgICAgICAgIC8qIHBhcmVudCB0YWJsZSBlbnRyeSAqLworICAgIHVuc2lnbmVkIGxlbjsgICAgICAgICAgICAgICAvKiBsZW5ndGggdG8gY29weSBmb3IgcmVwZWF0cywgYml0cyB0byBkcm9wICovCisgICAgaW50IHJldDsgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiBjb2RlICovCisjaWZkZWYgR1VOWklQCisgICAgdW5zaWduZWQgY2hhciBoYnVmWzRdOyAgICAgIC8qIGJ1ZmZlciBmb3IgZ3ppcCBoZWFkZXIgY3JjIGNhbGN1bGF0aW9uICovCisjZW5kaWYKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgb3JkZXJbMTldID0gLyogcGVybXV0YXRpb24gb2YgY29kZSBsZW5ndGhzICovCisgICAgICAgIHsxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1fTsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwgfHwgc3RybS0+bmV4dF9vdXQgPT0gWl9OVUxMIHx8CisgICAgICAgIChzdHJtLT5uZXh0X2luID09IFpfTlVMTCAmJiBzdHJtLT5hdmFpbF9pbiAhPSAwKSkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgaWYgKHN0YXRlLT5tb2RlID09IFRZUEUpIHN0YXRlLT5tb2RlID0gVFlQRURPOyAgICAgIC8qIHNraXAgY2hlY2sgKi8KKyAgICBMT0FEKCk7CisgICAgaW4gPSBoYXZlOworICAgIG91dCA9IGxlZnQ7CisgICAgcmV0ID0gWl9PSzsKKyAgICBmb3IgKDs7KQorICAgICAgICBzd2l0Y2ggKHN0YXRlLT5tb2RlKSB7CisgICAgICAgIGNhc2UgSEVBRDoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+d3JhcCA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFRE87CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBORUVEQklUUygxNik7CisjaWZkZWYgR1VOWklQCisgICAgICAgICAgICBpZiAoKHN0YXRlLT53cmFwICYgMikgJiYgaG9sZCA9PSAweDhiMWYpIHsgIC8qIGd6aXAgaGVhZGVyICovCisgICAgICAgICAgICAgICAgc3RhdGUtPmNoZWNrID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7CisgICAgICAgICAgICAgICAgQ1JDMihzdGF0ZS0+Y2hlY2ssIGhvbGQpOworICAgICAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBGTEFHUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLT5mbGFncyA9IDA7ICAgICAgICAgICAvKiBleHBlY3QgemxpYiBoZWFkZXIgKi8KKyAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwpCisgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmRvbmUgPSAtMTsKKyAgICAgICAgICAgIGlmICghKHN0YXRlLT53cmFwICYgMSkgfHwgICAvKiBjaGVjayBpZiB6bGliIGhlYWRlciBhbGxvd2VkICovCisjZWxzZQorICAgICAgICAgICAgaWYgKAorI2VuZGlmCisgICAgICAgICAgICAgICAgKChCSVRTKDgpIDw8IDgpICsgKGhvbGQgPj4gOCkpICUgMzEpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbmNvcnJlY3QgaGVhZGVyIGNoZWNrIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChCSVRTKDQpICE9IFpfREVGTEFURUQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEUk9QQklUUyg0KTsKKyAgICAgICAgICAgIGxlbiA9IEJJVFMoNCkgKyA4OworICAgICAgICAgICAgaWYgKHN0YXRlLT53Yml0cyA9PSAwKQorICAgICAgICAgICAgICAgIHN0YXRlLT53Yml0cyA9IGxlbjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGxlbiA+IHN0YXRlLT53Yml0cykgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgd2luZG93IHNpemUiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmRtYXggPSAxVSA8PCBsZW47CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgemxpYiBoZWFkZXIgb2tcbiIpKTsKKyAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gaG9sZCAmIDB4MjAwID8gRElDVElEIDogVFlQRTsKKyAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBHVU5aSVAKKyAgICAgICAgY2FzZSBGTEFHUzoKKyAgICAgICAgICAgIE5FRURCSVRTKDE2KTsKKyAgICAgICAgICAgIHN0YXRlLT5mbGFncyA9IChpbnQpKGhvbGQpOworICAgICAgICAgICAgaWYgKChzdGF0ZS0+ZmxhZ3MgJiAweGZmKSAhPSBaX0RFRkxBVEVEKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikidW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4ZTAwMCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInVua25vd24gaGVhZGVyIGZsYWdzIHNldCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKQorICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT50ZXh0ID0gKGludCkoKGhvbGQgPj4gOCkgJiAxKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDAyMDApIENSQzIoc3RhdGUtPmNoZWNrLCBob2xkKTsKKyAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRJTUU7CisgICAgICAgIGNhc2UgVElNRToKKyAgICAgICAgICAgIE5FRURCSVRTKDMyKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwpCisgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPnRpbWUgPSBob2xkOworICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkgQ1JDNChzdGF0ZS0+Y2hlY2ssIGhvbGQpOworICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gT1M7CisgICAgICAgIGNhc2UgT1M6CisgICAgICAgICAgICBORUVEQklUUygxNik7CisgICAgICAgICAgICBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKSB7CisgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPnhmbGFncyA9IChpbnQpKGhvbGQgJiAweGZmKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+b3MgPSAoaW50KShob2xkID4+IDgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkgQ1JDMihzdGF0ZS0+Y2hlY2ssIGhvbGQpOworICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRVhMRU47CisgICAgICAgIGNhc2UgRVhMRU46CisgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwNDAwKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoMTYpOworICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPSAodW5zaWduZWQpKGhvbGQpOworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5leHRyYV9sZW4gPSAodW5zaWduZWQpaG9sZDsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwMjAwKSBDUkMyKHN0YXRlLT5jaGVjaywgaG9sZCk7CisgICAgICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkKKyAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+ZXh0cmEgPSBaX05VTEw7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEVYVFJBOworICAgICAgICBjYXNlIEVYVFJBOgorICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDQwMCkgeworICAgICAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS0+bGVuZ3RoOworICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgY29weSA9IGhhdmU7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmV4dHJhICE9IFpfTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gc3RhdGUtPmhlYWQtPmV4dHJhX2xlbiAtIHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICB6bWVtY3B5KHN0YXRlLT5oZWFkLT5leHRyYSArIGxlbiwgbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuICsgY29weSA+IHN0YXRlLT5oZWFkLT5leHRyYV9tYXggPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+ZXh0cmFfbWF4IC0gbGVuIDogY29weSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5jaGVjayA9IGNyYzMyKHN0YXRlLT5jaGVjaywgbmV4dCwgY29weSk7CisgICAgICAgICAgICAgICAgICAgIGhhdmUgLT0gY29weTsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OworICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoIC09IGNvcHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+bGVuZ3RoKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPSAwOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBOQU1FOworICAgICAgICBjYXNlIE5BTUU6CisgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwODAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGhhdmUgPT0gMCkgZ290byBpbmZfbGVhdmU7CisgICAgICAgICAgICAgICAgY29weSA9IDA7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBsZW4gPSAodW5zaWduZWQpKG5leHRbY29weSsrXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+bmFtZSAhPSBaX05VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoIDwgc3RhdGUtPmhlYWQtPm5hbWVfbWF4KQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPm5hbWVbc3RhdGUtPmxlbmd0aCsrXSA9IGxlbjsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChsZW4gJiYgY29weSA8IGhhdmUpOworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDAyMDApCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5jaGVjayA9IGNyYzMyKHN0YXRlLT5jaGVjaywgbmV4dCwgY29weSk7CisgICAgICAgICAgICAgICAgaGF2ZSAtPSBjb3B5OworICAgICAgICAgICAgICAgIG5leHQgKz0gY29weTsKKyAgICAgICAgICAgICAgICBpZiAobGVuKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkKKyAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+bmFtZSA9IFpfTlVMTDsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPSAwOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBDT01NRU5UOworICAgICAgICBjYXNlIENPTU1FTlQ6CisgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgxMDAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGhhdmUgPT0gMCkgZ290byBpbmZfbGVhdmU7CisgICAgICAgICAgICAgICAgY29weSA9IDA7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBsZW4gPSAodW5zaWduZWQpKG5leHRbY29weSsrXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+Y29tbWVudCAhPSBaX05VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoIDwgc3RhdGUtPmhlYWQtPmNvbW1fbWF4KQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmNvbW1lbnRbc3RhdGUtPmxlbmd0aCsrXSA9IGxlbjsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChsZW4gJiYgY29weSA8IGhhdmUpOworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDAyMDApCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5jaGVjayA9IGNyYzMyKHN0YXRlLT5jaGVjaywgbmV4dCwgY29weSk7CisgICAgICAgICAgICAgICAgaGF2ZSAtPSBjb3B5OworICAgICAgICAgICAgICAgIG5leHQgKz0gY29weTsKKyAgICAgICAgICAgICAgICBpZiAobGVuKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkKKyAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+Y29tbWVudCA9IFpfTlVMTDsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gSENSQzsKKyAgICAgICAgY2FzZSBIQ1JDOgorICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKDE2KTsKKyAgICAgICAgICAgICAgICBpZiAoaG9sZCAhPSAoc3RhdGUtPmNoZWNrICYgMHhmZmZmKSkgeworICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJoZWFkZXIgY3JjIG1pc21hdGNoIjsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBJTklUQklUUygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkgeworICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5oY3JjID0gKGludCkoKHN0YXRlLT5mbGFncyA+PiA5KSAmIDEpOworICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5kb25lID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBjYXNlIERJQ1RJRDoKKyAgICAgICAgICAgIE5FRURCSVRTKDMyKTsKKyAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0gWlNXQVAzMihob2xkKTsKKyAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IERJQ1Q7CisgICAgICAgIGNhc2UgRElDVDoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZWRpY3QgPT0gMCkgeworICAgICAgICAgICAgICAgIFJFU1RPUkUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gWl9ORUVEX0RJQ1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJtLT5hZGxlciA9IHN0YXRlLT5jaGVjayA9IGFkbGVyMzIoMEwsIFpfTlVMTCwgMCk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgICAgIGNhc2UgVFlQRToKKyAgICAgICAgICAgIGlmIChmbHVzaCA9PSBaX0JMT0NLIHx8IGZsdXNoID09IFpfVFJFRVMpIGdvdG8gaW5mX2xlYXZlOworICAgICAgICBjYXNlIFRZUEVETzoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bGFzdCkgeworICAgICAgICAgICAgICAgIEJZVEVCSVRTKCk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBDSEVDSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5FRURCSVRTKDMpOworICAgICAgICAgICAgc3RhdGUtPmxhc3QgPSBCSVRTKDEpOworICAgICAgICAgICAgRFJPUEJJVFMoMSk7CisgICAgICAgICAgICBzd2l0Y2ggKEJJVFMoMikpIHsKKyAgICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlZCBibG9jayAqLworICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIHN0b3JlZCBibG9jayVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gU1RPUkVEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWQgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICBmaXhlZHRhYmxlcyhzdGF0ZSk7CisgICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sYXN0ID8gIiAobGFzdCkiIDogIiIpKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTl87ICAgICAgICAgICAgIC8qIGRlY29kZSBjb2RlcyAqLworICAgICAgICAgICAgICAgIGlmIChmbHVzaCA9PSBaX1RSRUVTKSB7CisgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljIGJsb2NrICovCisgICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgZHluYW1pYyBjb2RlcyBibG9jayVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVEFCTEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBibG9jayB0eXBlIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERST1BCSVRTKDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RPUkVEOgorICAgICAgICAgICAgQllURUJJVFMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqLworICAgICAgICAgICAgTkVFREJJVFMoMzIpOworICAgICAgICAgICAgaWYgKChob2xkICYgMHhmZmZmKSAhPSAoKGhvbGQgPj4gMTYpIF4gMHhmZmZmKSkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9ICh1bnNpZ25lZClob2xkICYgMHhmZmZmOworICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBzdG9yZWQgbGVuZ3RoICV1XG4iLAorICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoKSk7CisgICAgICAgICAgICBJTklUQklUUygpOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBDT1BZXzsKKyAgICAgICAgICAgIGlmIChmbHVzaCA9PSBaX1RSRUVTKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgY2FzZSBDT1BZXzoKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQ09QWTsKKyAgICAgICAgY2FzZSBDT1BZOgorICAgICAgICAgICAgY29weSA9IHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgY29weSA9IGhhdmU7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSBjb3B5ID0gbGVmdDsKKyAgICAgICAgICAgICAgICBpZiAoY29weSA9PSAwKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgICAgICB6bWVtY3B5KHB1dCwgbmV4dCwgY29weSk7CisgICAgICAgICAgICAgICAgaGF2ZSAtPSBjb3B5OworICAgICAgICAgICAgICAgIG5leHQgKz0gY29weTsKKyAgICAgICAgICAgICAgICBsZWZ0IC09IGNvcHk7CisgICAgICAgICAgICAgICAgcHV0ICs9IGNvcHk7CisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCAtPSBjb3B5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBzdG9yZWQgZW5kXG4iKSk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUQUJMRToKKyAgICAgICAgICAgIE5FRURCSVRTKDE0KTsKKyAgICAgICAgICAgIHN0YXRlLT5ubGVuID0gQklUUyg1KSArIDI1NzsKKyAgICAgICAgICAgIERST1BCSVRTKDUpOworICAgICAgICAgICAgc3RhdGUtPm5kaXN0ID0gQklUUyg1KSArIDE7CisgICAgICAgICAgICBEUk9QQklUUyg1KTsKKyAgICAgICAgICAgIHN0YXRlLT5uY29kZSA9IEJJVFMoNCkgKyA0OworICAgICAgICAgICAgRFJPUEJJVFMoNCk7CisjaWZuZGVmIFBLWklQX0JVR19XT1JLQVJPVU5ECisgICAgICAgICAgICBpZiAoc3RhdGUtPm5sZW4gPiAyODYgfHwgc3RhdGUtPm5kaXN0ID4gMzApIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgdGFibGUgc2l6ZXMgb2tcbiIpKTsKKyAgICAgICAgICAgIHN0YXRlLT5oYXZlID0gMDsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOTEVOUzsKKyAgICAgICAgY2FzZSBMRU5MRU5TOgorICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgc3RhdGUtPm5jb2RlKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoMyk7CisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbb3JkZXJbc3RhdGUtPmhhdmUrK11dID0gKHVuc2lnbmVkIHNob3J0KUJJVFMoMyk7CisgICAgICAgICAgICAgICAgRFJPUEJJVFMoMyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoc3RhdGUtPmhhdmUgPCAxOSkKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tvcmRlcltzdGF0ZS0+aGF2ZSsrXV0gPSAwOworICAgICAgICAgICAgc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7CisgICAgICAgICAgICBzdGF0ZS0+bGVuY29kZSA9IChjb25zdCBjb2RlIEZBUiAqKShzdGF0ZS0+bmV4dCk7CisgICAgICAgICAgICBzdGF0ZS0+bGVuYml0cyA9IDc7CisgICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKENPREVTLCBzdGF0ZS0+bGVucywgMTksICYoc3RhdGUtPm5leHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHN0YXRlLT5sZW5iaXRzKSwgc3RhdGUtPndvcmspOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgY29kZSBsZW5ndGhzIHNldCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIGNvZGUgbGVuZ3RocyBva1xuIikpOworICAgICAgICAgICAgc3RhdGUtPmhhdmUgPSAwOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBDT0RFTEVOUzsKKyAgICAgICAgY2FzZSBDT0RFTEVOUzoKKyAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IHN0YXRlLT5ubGVuICsgc3RhdGUtPm5kaXN0KSB7CisgICAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUtPmxlbmNvZGVbQklUUyhzdGF0ZS0+bGVuYml0cyldOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShoZXJlLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaGVyZS52YWwgPCAxNikgeworICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSsrXSA9IGhlcmUudmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhlcmUudmFsID09IDE2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyhoZXJlLmJpdHMgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmhhdmUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gc3RhdGUtPmxlbnNbc3RhdGUtPmhhdmUgLSAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgPSAzICsgQklUUygyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhlcmUudmFsID09IDE3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyhoZXJlLmJpdHMgKyAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDMgKyBCSVRTKDMpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyhoZXJlLmJpdHMgKyA3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDExICsgQklUUyg3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZSArIGNvcHkgPiBzdGF0ZS0+bmxlbiArIHN0YXRlLT5uZGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjb3B5LS0pCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSsrXSA9ICh1bnNpZ25lZCBzaG9ydClsZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBoYW5kbGUgZXJyb3IgYnJlYWtzIGluIHdoaWxlICovCisgICAgICAgICAgICBpZiAoc3RhdGUtPm1vZGUgPT0gQkFEKSBicmVhazsKKworICAgICAgICAgICAgLyogY2hlY2sgZm9yIGVuZC1vZi1ibG9jayBjb2RlIChiZXR0ZXIgaGF2ZSBvbmUpICovCisgICAgICAgICAgICBpZiAoc3RhdGUtPmxlbnNbMjU2XSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgLS0gbm90ZTogZG8gbm90IGNoYW5nZSB0aGUgbGVuYml0cyBvciBkaXN0Yml0cworICAgICAgICAgICAgICAgdmFsdWVzIGhlcmUgKDkgYW5kIDYpIHdpdGhvdXQgcmVhZGluZyB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaAorICAgICAgICAgICAgICAgY29uY2VybmluZyB0aGUgRU5PVUdIIGNvbnN0YW50cywgd2hpY2ggZGVwZW5kIG9uIHRob3NlIHZhbHVlcyAqLworICAgICAgICAgICAgc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7CisgICAgICAgICAgICBzdGF0ZS0+bGVuY29kZSA9IChjb25zdCBjb2RlIEZBUiAqKShzdGF0ZS0+bmV4dCk7CisgICAgICAgICAgICBzdGF0ZS0+bGVuYml0cyA9IDk7CisgICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKExFTlMsIHN0YXRlLT5sZW5zLCBzdGF0ZS0+bmxlbiwgJihzdGF0ZS0+bmV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RhdGUtPmxlbmJpdHMpLCBzdGF0ZS0+d29yayk7CisgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0IjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLT5kaXN0Y29kZSA9IChjb25zdCBjb2RlIEZBUiAqKShzdGF0ZS0+bmV4dCk7CisgICAgICAgICAgICBzdGF0ZS0+ZGlzdGJpdHMgPSA2OworICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUtPmxlbnMgKyBzdGF0ZS0+bmxlbiwgc3RhdGUtPm5kaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RhdGUtPm5leHQpLCAmKHN0YXRlLT5kaXN0Yml0cyksIHN0YXRlLT53b3JrKTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlcyBzZXQiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBjb2RlcyBva1xuIikpOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU5fOworICAgICAgICAgICAgaWYgKGZsdXNoID09IFpfVFJFRVMpIGdvdG8gaW5mX2xlYXZlOworICAgICAgICBjYXNlIExFTl86CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTjsKKyAgICAgICAgY2FzZSBMRU46CisgICAgICAgICAgICBpZiAoaGF2ZSA+PSA2ICYmIGxlZnQgPj0gMjU4KSB7CisgICAgICAgICAgICAgICAgUkVTVE9SRSgpOworICAgICAgICAgICAgICAgIGluZmxhdGVfZmFzdChzdHJtLCBvdXQpOworICAgICAgICAgICAgICAgIExPQUQoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPm1vZGUgPT0gVFlQRSkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmJhY2sgPSAtMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLT5iYWNrID0gMDsKKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUtPmxlbmNvZGVbQklUUyhzdGF0ZS0+bGVuYml0cyldOworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoZXJlLm9wICYmIChoZXJlLm9wICYgMHhmMCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGxhc3QgPSBoZXJlOworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgaGVyZSA9IHN0YXRlLT5sZW5jb2RlW2xhc3QudmFsICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSA+PiBsYXN0LmJpdHMpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkobGFzdC5iaXRzICsgaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRFJPUEJJVFMobGFzdC5iaXRzKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+YmFjayArPSBsYXN0LmJpdHM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOworICAgICAgICAgICAgc3RhdGUtPmJhY2sgKz0gaGVyZS5iaXRzOworICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9ICh1bnNpZ25lZCloZXJlLnZhbDsKKyAgICAgICAgICAgIGlmICgoaW50KShoZXJlLm9wKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/CisgICAgICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcbiIgOgorICAgICAgICAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcbiIsIGhlcmUudmFsKSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMSVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGVyZS5vcCAmIDMyKSB7CisgICAgICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcbiIpKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+YmFjayA9IC0xOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoZXJlLm9wICYgNjQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmV4dHJhID0gKHVuc2lnbmVkKShoZXJlLm9wKSAmIDE1OworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU5FWFQ7CisgICAgICAgIGNhc2UgTEVORVhUOgorICAgICAgICAgICAgaWYgKHN0YXRlLT5leHRyYSkgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCArPSBCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICAgICAgRFJPUEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+YmFjayArPSBzdGF0ZS0+ZXh0cmE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxuIiwgc3RhdGUtPmxlbmd0aCkpOworICAgICAgICAgICAgc3RhdGUtPndhcyA9IHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IERJU1Q7CisgICAgICAgIGNhc2UgRElTVDoKKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUtPmRpc3Rjb2RlW0JJVFMoc3RhdGUtPmRpc3RiaXRzKV07CisgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkoaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChoZXJlLm9wICYgMHhmMCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGxhc3QgPSBoZXJlOworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgaGVyZSA9IHN0YXRlLT5kaXN0Y29kZVtsYXN0LnZhbCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkgPj4gbGFzdC5iaXRzKV07CisgICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGxhc3QuYml0cyArIGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERST1BCSVRTKGxhc3QuYml0cyk7CisgICAgICAgICAgICAgICAgc3RhdGUtPmJhY2sgKz0gbGFzdC5iaXRzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKKyAgICAgICAgICAgIHN0YXRlLT5iYWNrICs9IGhlcmUuYml0czsKKyAgICAgICAgICAgIGlmIChoZXJlLm9wICYgNjQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPm9mZnNldCA9ICh1bnNpZ25lZCloZXJlLnZhbDsKKyAgICAgICAgICAgIHN0YXRlLT5leHRyYSA9ICh1bnNpZ25lZCkoaGVyZS5vcCkgJiAxNTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRElTVEVYVDsKKyAgICAgICAgY2FzZSBESVNURVhUOgorICAgICAgICAgICAgaWYgKHN0YXRlLT5leHRyYSkgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm9mZnNldCArPSBCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICAgICAgRFJPUEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+YmFjayArPSBzdGF0ZS0+ZXh0cmE7CisgICAgICAgICAgICB9CisjaWZkZWYgSU5GTEFURV9TVFJJQ1QKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+b2Zmc2V0ID4gc3RhdGUtPmRtYXgpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJXVcbiIsIHN0YXRlLT5vZmZzZXQpKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTUFUQ0g7CisgICAgICAgIGNhc2UgTUFUQ0g6CisgICAgICAgICAgICBpZiAobGVmdCA9PSAwKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgIGNvcHkgPSBvdXQgLSBsZWZ0OworICAgICAgICAgICAgaWYgKHN0YXRlLT5vZmZzZXQgPiBjb3B5KSB7ICAgICAgICAgLyogY29weSBmcm9tIHdpbmRvdyAqLworICAgICAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS0+b2Zmc2V0IC0gY29weTsKKyAgICAgICAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLT53aGF2ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPnNhbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlIKKyAgICAgICAgICAgICAgICAgICAgVHJhY2UoKHN0ZGVyciwgImluZmxhdGUuYyB0b28gZmFyXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIGNvcHkgLT0gc3RhdGUtPndoYXZlOworICAgICAgICAgICAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLT5sZW5ndGgpIGNvcHkgPSBzdGF0ZS0+bGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIGNvcHkgPSBsZWZ0OworICAgICAgICAgICAgICAgICAgICBsZWZ0IC09IGNvcHk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggLT0gY29weTsKKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgKnB1dCsrID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5sZW5ndGggPT0gMCkgc3RhdGUtPm1vZGUgPSBMRU47CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUtPnduZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIGNvcHkgLT0gc3RhdGUtPnduZXh0OworICAgICAgICAgICAgICAgICAgICBmcm9tID0gc3RhdGUtPndpbmRvdyArIChzdGF0ZS0+d3NpemUgLSBjb3B5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBmcm9tID0gc3RhdGUtPndpbmRvdyArIChzdGF0ZS0+d25leHQgLSBjb3B5KTsKKyAgICAgICAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLT5sZW5ndGgpIGNvcHkgPSBzdGF0ZS0+bGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSBmcm9tIG91dHB1dCAqLworICAgICAgICAgICAgICAgIGZyb20gPSBwdXQgLSBzdGF0ZS0+b2Zmc2V0OworICAgICAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS0+bGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSBjb3B5ID0gbGVmdDsKKyAgICAgICAgICAgIGxlZnQgLT0gY29weTsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggLT0gY29weTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAqcHV0KysgPSAqZnJvbSsrOworICAgICAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bGVuZ3RoID09IDApIHN0YXRlLT5tb2RlID0gTEVOOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTElUOgorICAgICAgICAgICAgaWYgKGxlZnQgPT0gMCkgZ290byBpbmZfbGVhdmU7CisgICAgICAgICAgICAqcHV0KysgPSAodW5zaWduZWQgY2hhcikoc3RhdGUtPmxlbmd0aCk7CisgICAgICAgICAgICBsZWZ0LS07CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENIRUNLOgorICAgICAgICAgICAgaWYgKHN0YXRlLT53cmFwKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoMzIpOworICAgICAgICAgICAgICAgIG91dCAtPSBsZWZ0OworICAgICAgICAgICAgICAgIHN0cm0tPnRvdGFsX291dCArPSBvdXQ7CisgICAgICAgICAgICAgICAgc3RhdGUtPnRvdGFsICs9IG91dDsKKyAgICAgICAgICAgICAgICBpZiAob3V0KQorICAgICAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IHN0YXRlLT5jaGVjayA9CisgICAgICAgICAgICAgICAgICAgICAgICBVUERBVEUoc3RhdGUtPmNoZWNrLCBwdXQgLSBvdXQsIG91dCk7CisgICAgICAgICAgICAgICAgb3V0ID0gbGVmdDsKKyAgICAgICAgICAgICAgICBpZiAoKAorI2lmZGVmIEdVTlpJUAorICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmZsYWdzID8gaG9sZCA6CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgIFpTV0FQMzIoaG9sZCkpICE9IHN0YXRlLT5jaGVjaykgeworICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbmNvcnJlY3QgZGF0YSBjaGVjayI7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgY2hlY2sgbWF0Y2hlcyB0cmFpbGVyXG4iKSk7CisgICAgICAgICAgICB9CisjaWZkZWYgR1VOWklQCisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTkdUSDsKKyAgICAgICAgY2FzZSBMRU5HVEg6CisgICAgICAgICAgICBpZiAoc3RhdGUtPndyYXAgJiYgc3RhdGUtPmZsYWdzKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoMzIpOworICAgICAgICAgICAgICAgIGlmIChob2xkICE9IChzdGF0ZS0+dG90YWwgJiAweGZmZmZmZmZmVUwpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImluY29ycmVjdCBsZW5ndGggY2hlY2siOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgIGxlbmd0aCBtYXRjaGVzIHRyYWlsZXJcbiIpKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBET05FOworICAgICAgICBjYXNlIERPTkU6CisgICAgICAgICAgICByZXQgPSBaX1NUUkVBTV9FTkQ7CisgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgY2FzZSBCQUQ6CisgICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7CisgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgY2FzZSBNRU06CisgICAgICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgICAgIGNhc2UgU1lOQzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICAgICAgfQorCisgICAgLyoKKyAgICAgICBSZXR1cm4gZnJvbSBpbmZsYXRlKCksIHVwZGF0aW5nIHRoZSB0b3RhbCBjb3VudHMgYW5kIHRoZSBjaGVjayB2YWx1ZS4KKyAgICAgICBJZiB0aGVyZSB3YXMgbm8gcHJvZ3Jlc3MgZHVyaW5nIHRoZSBpbmZsYXRlKCkgY2FsbCwgcmV0dXJuIGEgYnVmZmVyCisgICAgICAgZXJyb3IuICBDYWxsIHVwZGF0ZXdpbmRvdygpIHRvIGNyZWF0ZSBhbmQvb3IgdXBkYXRlIHRoZSB3aW5kb3cgc3RhdGUuCisgICAgICAgTm90ZTogYSBtZW1vcnkgZXJyb3IgZnJvbSBpbmZsYXRlKCkgaXMgbm9uLXJlY292ZXJhYmxlLgorICAgICAqLworICBpbmZfbGVhdmU6CisgICAgUkVTVE9SRSgpOworICAgIGlmIChzdGF0ZS0+d3NpemUgfHwgKG91dCAhPSBzdHJtLT5hdmFpbF9vdXQgJiYgc3RhdGUtPm1vZGUgPCBCQUQgJiYKKyAgICAgICAgICAgIChzdGF0ZS0+bW9kZSA8IENIRUNLIHx8IGZsdXNoICE9IFpfRklOSVNIKSkpCisgICAgICAgIGlmICh1cGRhdGV3aW5kb3coc3RybSwgc3RybS0+bmV4dF9vdXQsIG91dCAtIHN0cm0tPmF2YWlsX291dCkpIHsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTUVNOworICAgICAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOworICAgICAgICB9CisgICAgaW4gLT0gc3RybS0+YXZhaWxfaW47CisgICAgb3V0IC09IHN0cm0tPmF2YWlsX291dDsKKyAgICBzdHJtLT50b3RhbF9pbiArPSBpbjsKKyAgICBzdHJtLT50b3RhbF9vdXQgKz0gb3V0OworICAgIHN0YXRlLT50b3RhbCArPSBvdXQ7CisgICAgaWYgKHN0YXRlLT53cmFwICYmIG91dCkKKyAgICAgICAgc3RybS0+YWRsZXIgPSBzdGF0ZS0+Y2hlY2sgPQorICAgICAgICAgICAgVVBEQVRFKHN0YXRlLT5jaGVjaywgc3RybS0+bmV4dF9vdXQgLSBvdXQsIG91dCk7CisgICAgc3RybS0+ZGF0YV90eXBlID0gc3RhdGUtPmJpdHMgKyAoc3RhdGUtPmxhc3QgPyA2NCA6IDApICsKKyAgICAgICAgICAgICAgICAgICAgICAoc3RhdGUtPm1vZGUgPT0gVFlQRSA/IDEyOCA6IDApICsKKyAgICAgICAgICAgICAgICAgICAgICAoc3RhdGUtPm1vZGUgPT0gTEVOXyB8fCBzdGF0ZS0+bW9kZSA9PSBDT1BZXyA/IDI1NiA6IDApOworICAgIGlmICgoKGluID09IDAgJiYgb3V0ID09IDApIHx8IGZsdXNoID09IFpfRklOSVNIKSAmJiByZXQgPT0gWl9PSykKKyAgICAgICAgcmV0ID0gWl9CVUZfRVJST1I7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IFpFWFBPUlQgaW5mbGF0ZUVuZChzdHJtKQorel9zdHJlYW1wIHN0cm07Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMIHx8IHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOworICAgIGlmIChzdGF0ZS0+d2luZG93ICE9IFpfTlVMTCkgWkZSRUUoc3RybSwgc3RhdGUtPndpbmRvdyk7CisgICAgWkZSRUUoc3RybSwgc3RybS0+c3RhdGUpOworICAgIHN0cm0tPnN0YXRlID0gWl9OVUxMOworICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogZW5kXG4iKSk7CisgICAgcmV0dXJuIFpfT0s7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVHZXREaWN0aW9uYXJ5KHN0cm0sIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpCit6X3N0cmVhbXAgc3RybTsKK0J5dGVmICpkaWN0aW9uYXJ5OwordUludCAqZGljdExlbmd0aDsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworCisgICAgLyogY2hlY2sgc3RhdGUgKi8KKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisKKyAgICAvKiBjb3B5IGRpY3Rpb25hcnkgKi8KKyAgICBpZiAoc3RhdGUtPndoYXZlICYmIGRpY3Rpb25hcnkgIT0gWl9OVUxMKSB7CisgICAgICAgIHptZW1jcHkoZGljdGlvbmFyeSwgc3RhdGUtPndpbmRvdyArIHN0YXRlLT53bmV4dCwKKyAgICAgICAgICAgICAgICBzdGF0ZS0+d2hhdmUgLSBzdGF0ZS0+d25leHQpOworICAgICAgICB6bWVtY3B5KGRpY3Rpb25hcnkgKyBzdGF0ZS0+d2hhdmUgLSBzdGF0ZS0+d25leHQsCisgICAgICAgICAgICAgICAgc3RhdGUtPndpbmRvdywgc3RhdGUtPnduZXh0KTsKKyAgICB9CisgICAgaWYgKGRpY3RMZW5ndGggIT0gWl9OVUxMKQorICAgICAgICAqZGljdExlbmd0aCA9IHN0YXRlLT53aGF2ZTsKKyAgICByZXR1cm4gWl9PSzsKK30KKworaW50IFpFWFBPUlQgaW5mbGF0ZVNldERpY3Rpb25hcnkoc3RybSwgZGljdGlvbmFyeSwgZGljdExlbmd0aCkKK3pfc3RyZWFtcCBzdHJtOworY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnk7Cit1SW50IGRpY3RMZW5ndGg7Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKyAgICB1bnNpZ25lZCBsb25nIGRpY3RpZDsKKyAgICBpbnQgcmV0OworCisgICAgLyogY2hlY2sgc3RhdGUgKi8KKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgaWYgKHN0YXRlLT53cmFwICE9IDAgJiYgc3RhdGUtPm1vZGUgIT0gRElDVCkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgLyogY2hlY2sgZm9yIGNvcnJlY3QgZGljdGlvbmFyeSBpZGVudGlmaWVyICovCisgICAgaWYgKHN0YXRlLT5tb2RlID09IERJQ1QpIHsKKyAgICAgICAgZGljdGlkID0gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTsKKyAgICAgICAgZGljdGlkID0gYWRsZXIzMihkaWN0aWQsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOworICAgICAgICBpZiAoZGljdGlkICE9IHN0YXRlLT5jaGVjaykKKyAgICAgICAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7CisgICAgfQorCisgICAgLyogY29weSBkaWN0aW9uYXJ5IHRvIHdpbmRvdyB1c2luZyB1cGRhdGV3aW5kb3coKSwgd2hpY2ggd2lsbCBhbWVuZCB0aGUKKyAgICAgICBleGlzdGluZyBkaWN0aW9uYXJ5IGlmIGFwcHJvcHJpYXRlICovCisgICAgcmV0ID0gdXBkYXRld2luZG93KHN0cm0sIGRpY3Rpb25hcnkgKyBkaWN0TGVuZ3RoLCBkaWN0TGVuZ3RoKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIHN0YXRlLT5tb2RlID0gTUVNOworICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgfQorICAgIHN0YXRlLT5oYXZlZGljdCA9IDE7CisgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgIGRpY3Rpb25hcnkgc2V0XG4iKSk7CisgICAgcmV0dXJuIFpfT0s7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVHZXRIZWFkZXIoc3RybSwgaGVhZCkKK3pfc3RyZWFtcCBzdHJtOworZ3pfaGVhZGVycCBoZWFkOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisKKyAgICAvKiBjaGVjayBzdGF0ZSAqLworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKyAgICBpZiAoKHN0YXRlLT53cmFwICYgMikgPT0gMCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgLyogc2F2ZSBoZWFkZXIgc3RydWN0dXJlICovCisgICAgc3RhdGUtPmhlYWQgPSBoZWFkOworICAgIGhlYWQtPmRvbmUgPSAwOworICAgIHJldHVybiBaX09LOworfQorCisvKgorICAgU2VhcmNoIGJ1ZlswLi5sZW4tMV0gZm9yIHRoZSBwYXR0ZXJuOiAwLCAwLCAweGZmLCAweGZmLiAgUmV0dXJuIHdoZW4gZm91bmQKKyAgIG9yIHdoZW4gb3V0IG9mIGlucHV0LiAgV2hlbiBjYWxsZWQsICpoYXZlIGlzIHRoZSBudW1iZXIgb2YgcGF0dGVybiBieXRlcworICAgZm91bmQgaW4gb3JkZXIgc28gZmFyLCBpbiAwLi4zLiAgT24gcmV0dXJuICpoYXZlIGlzIHVwZGF0ZWQgdG8gdGhlIG5ldworICAgc3RhdGUuICBJZiBvbiByZXR1cm4gKmhhdmUgZXF1YWxzIGZvdXIsIHRoZW4gdGhlIHBhdHRlcm4gd2FzIGZvdW5kIGFuZCB0aGUKKyAgIHJldHVybiB2YWx1ZSBpcyBob3cgbWFueSBieXRlcyB3ZXJlIHJlYWQgaW5jbHVkaW5nIHRoZSBsYXN0IGJ5dGUgb2YgdGhlCisgICBwYXR0ZXJuLiAgSWYgKmhhdmUgaXMgbGVzcyB0aGFuIGZvdXIsIHRoZW4gdGhlIHBhdHRlcm4gaGFzIG5vdCBiZWVuIGZvdW5kCisgICB5ZXQgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgbGVuLiAgSW4gdGhlIGxhdHRlciBjYXNlLCBzeW5jc2VhcmNoKCkgY2FuIGJlCisgICBjYWxsZWQgYWdhaW4gd2l0aCBtb3JlIGRhdGEgYW5kIHRoZSAqaGF2ZSBzdGF0ZS4gICpoYXZlIGlzIGluaXRpYWxpemVkIHRvCisgICB6ZXJvIGZvciB0aGUgZmlyc3QgY2FsbC4KKyAqLworbG9jYWwgdW5zaWduZWQgc3luY3NlYXJjaChoYXZlLCBidWYsIGxlbikKK3Vuc2lnbmVkIEZBUiAqaGF2ZTsKK2NvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICpidWY7Cit1bnNpZ25lZCBsZW47Cit7CisgICAgdW5zaWduZWQgZ290OworICAgIHVuc2lnbmVkIG5leHQ7CisKKyAgICBnb3QgPSAqaGF2ZTsKKyAgICBuZXh0ID0gMDsKKyAgICB3aGlsZSAobmV4dCA8IGxlbiAmJiBnb3QgPCA0KSB7CisgICAgICAgIGlmICgoaW50KShidWZbbmV4dF0pID09IChnb3QgPCAyID8gMCA6IDB4ZmYpKQorICAgICAgICAgICAgZ290Kys7CisgICAgICAgIGVsc2UgaWYgKGJ1ZltuZXh0XSkKKyAgICAgICAgICAgIGdvdCA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdvdCA9IDQgLSBnb3Q7CisgICAgICAgIG5leHQrKzsKKyAgICB9CisgICAgKmhhdmUgPSBnb3Q7CisgICAgcmV0dXJuIG5leHQ7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVTeW5jKHN0cm0pCit6X3N0cmVhbXAgc3RybTsKK3sKKyAgICB1bnNpZ25lZCBsZW47ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHRvIGxvb2sgYXQgb3IgbG9va2VkIGF0ICovCisgICAgdW5zaWduZWQgbG9uZyBpbiwgb3V0OyAgICAgIC8qIHRlbXBvcmFyeSB0byBzYXZlIHRvdGFsX2luIGFuZCB0b3RhbF9vdXQgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGJ1Zls0XTsgICAgICAgLyogdG8gcmVzdG9yZSBiaXQgYnVmZmVyIHRvIGJ5dGUgc3RyaW5nICovCisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIC8qIGNoZWNrIHBhcmFtZXRlcnMgKi8KKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgaWYgKHN0cm0tPmF2YWlsX2luID09IDAgJiYgc3RhdGUtPmJpdHMgPCA4KSByZXR1cm4gWl9CVUZfRVJST1I7CisKKyAgICAvKiBpZiBmaXJzdCB0aW1lLCBzdGFydCBzZWFyY2ggaW4gYml0IGJ1ZmZlciAqLworICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBTWU5DKSB7CisgICAgICAgIHN0YXRlLT5tb2RlID0gU1lOQzsKKyAgICAgICAgc3RhdGUtPmhvbGQgPDw9IHN0YXRlLT5iaXRzICYgNzsKKyAgICAgICAgc3RhdGUtPmJpdHMgLT0gc3RhdGUtPmJpdHMgJiA3OworICAgICAgICBsZW4gPSAwOworICAgICAgICB3aGlsZSAoc3RhdGUtPmJpdHMgPj0gOCkgeworICAgICAgICAgICAgYnVmW2xlbisrXSA9ICh1bnNpZ25lZCBjaGFyKShzdGF0ZS0+aG9sZCk7CisgICAgICAgICAgICBzdGF0ZS0+aG9sZCA+Pj0gODsKKyAgICAgICAgICAgIHN0YXRlLT5iaXRzIC09IDg7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPmhhdmUgPSAwOworICAgICAgICBzeW5jc2VhcmNoKCYoc3RhdGUtPmhhdmUpLCBidWYsIGxlbik7CisgICAgfQorCisgICAgLyogc2VhcmNoIGF2YWlsYWJsZSBpbnB1dCAqLworICAgIGxlbiA9IHN5bmNzZWFyY2goJihzdGF0ZS0+aGF2ZSksIHN0cm0tPm5leHRfaW4sIHN0cm0tPmF2YWlsX2luKTsKKyAgICBzdHJtLT5hdmFpbF9pbiAtPSBsZW47CisgICAgc3RybS0+bmV4dF9pbiArPSBsZW47CisgICAgc3RybS0+dG90YWxfaW4gKz0gbGVuOworCisgICAgLyogcmV0dXJuIG5vIGpveSBvciBzZXQgdXAgdG8gcmVzdGFydCBpbmZsYXRlKCkgb24gYSBuZXcgYmxvY2sgKi8KKyAgICBpZiAoc3RhdGUtPmhhdmUgIT0gNCkgcmV0dXJuIFpfREFUQV9FUlJPUjsKKyAgICBpbiA9IHN0cm0tPnRvdGFsX2luOyAgb3V0ID0gc3RybS0+dG90YWxfb3V0OworICAgIGluZmxhdGVSZXNldChzdHJtKTsKKyAgICBzdHJtLT50b3RhbF9pbiA9IGluOyAgc3RybS0+dG90YWxfb3V0ID0gb3V0OworICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKKyAgICByZXR1cm4gWl9PSzsKK30KKworLyoKKyAgIFJldHVybnMgdHJ1ZSBpZiBpbmZsYXRlIGlzIGN1cnJlbnRseSBhdCB0aGUgZW5kIG9mIGEgYmxvY2sgZ2VuZXJhdGVkIGJ5CisgICBaX1NZTkNfRkxVU0ggb3IgWl9GVUxMX0ZMVVNILiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgb25lIFBQUAorICAgaW1wbGVtZW50YXRpb24gdG8gcHJvdmlkZSBhbiBhZGRpdGlvbmFsIHNhZmV0eSBjaGVjay4gUFBQIHVzZXMKKyAgIFpfU1lOQ19GTFVTSCBidXQgcmVtb3ZlcyB0aGUgbGVuZ3RoIGJ5dGVzIG9mIHRoZSByZXN1bHRpbmcgZW1wdHkgc3RvcmVkCisgICBibG9jay4gV2hlbiBkZWNvbXByZXNzaW5nLCBQUFAgY2hlY2tzIHRoYXQgYXQgdGhlIGVuZCBvZiBpbnB1dCBwYWNrZXQsCisgICBpbmZsYXRlIGlzIHdhaXRpbmcgZm9yIHRoZXNlIGxlbmd0aCBieXRlcy4KKyAqLworaW50IFpFWFBPUlQgaW5mbGF0ZVN5bmNQb2ludChzdHJtKQorel9zdHJlYW1wIHN0cm07Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKyAgICByZXR1cm4gc3RhdGUtPm1vZGUgPT0gU1RPUkVEICYmIHN0YXRlLT5iaXRzID09IDA7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVDb3B5KGRlc3QsIHNvdXJjZSkKK3pfc3RyZWFtcCBkZXN0Oworel9zdHJlYW1wIHNvdXJjZTsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqY29weTsKKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93OworICAgIHVuc2lnbmVkIHdzaXplOworCisgICAgLyogY2hlY2sgaW5wdXQgKi8KKyAgICBpZiAoZGVzdCA9PSBaX05VTEwgfHwgc291cmNlID09IFpfTlVMTCB8fCBzb3VyY2UtPnN0YXRlID09IFpfTlVMTCB8fAorICAgICAgICBzb3VyY2UtPnphbGxvYyA9PSAoYWxsb2NfZnVuYykwIHx8IHNvdXJjZS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc291cmNlLT5zdGF0ZTsKKworICAgIC8qIGFsbG9jYXRlIHNwYWNlICovCisgICAgY29weSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKikKKyAgICAgICAgICAgWkFMTE9DKHNvdXJjZSwgMSwgc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX3N0YXRlKSk7CisgICAgaWYgKGNvcHkgPT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgd2luZG93ID0gWl9OVUxMOworICAgIGlmIChzdGF0ZS0+d2luZG93ICE9IFpfTlVMTCkgeworICAgICAgICB3aW5kb3cgPSAodW5zaWduZWQgY2hhciBGQVIgKikKKyAgICAgICAgICAgICAgICAgWkFMTE9DKHNvdXJjZSwgMVUgPDwgc3RhdGUtPndiaXRzLCBzaXplb2YodW5zaWduZWQgY2hhcikpOworICAgICAgICBpZiAod2luZG93ID09IFpfTlVMTCkgeworICAgICAgICAgICAgWkZSRUUoc291cmNlLCBjb3B5KTsKKyAgICAgICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNvcHkgc3RhdGUgKi8KKyAgICB6bWVtY3B5KCh2b2lkcGYpZGVzdCwgKHZvaWRwZilzb3VyY2UsIHNpemVvZih6X3N0cmVhbSkpOworICAgIHptZW1jcHkoKHZvaWRwZiljb3B5LCAodm9pZHBmKXN0YXRlLCBzaXplb2Yoc3RydWN0IGluZmxhdGVfc3RhdGUpKTsKKyAgICBpZiAoc3RhdGUtPmxlbmNvZGUgPj0gc3RhdGUtPmNvZGVzICYmCisgICAgICAgIHN0YXRlLT5sZW5jb2RlIDw9IHN0YXRlLT5jb2RlcyArIEVOT1VHSCAtIDEpIHsKKyAgICAgICAgY29weS0+bGVuY29kZSA9IGNvcHktPmNvZGVzICsgKHN0YXRlLT5sZW5jb2RlIC0gc3RhdGUtPmNvZGVzKTsKKyAgICAgICAgY29weS0+ZGlzdGNvZGUgPSBjb3B5LT5jb2RlcyArIChzdGF0ZS0+ZGlzdGNvZGUgLSBzdGF0ZS0+Y29kZXMpOworICAgIH0KKyAgICBjb3B5LT5uZXh0ID0gY29weS0+Y29kZXMgKyAoc3RhdGUtPm5leHQgLSBzdGF0ZS0+Y29kZXMpOworICAgIGlmICh3aW5kb3cgIT0gWl9OVUxMKSB7CisgICAgICAgIHdzaXplID0gMVUgPDwgc3RhdGUtPndiaXRzOworICAgICAgICB6bWVtY3B5KHdpbmRvdywgc3RhdGUtPndpbmRvdywgd3NpemUpOworICAgIH0KKyAgICBjb3B5LT53aW5kb3cgPSB3aW5kb3c7CisgICAgZGVzdC0+c3RhdGUgPSAoc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqKWNvcHk7CisgICAgcmV0dXJuIFpfT0s7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVVbmRlcm1pbmUoc3RybSwgc3VidmVydCkKK3pfc3RyZWFtcCBzdHJtOworaW50IHN1YnZlcnQ7Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKyAgICBzdGF0ZS0+c2FuZSA9ICFzdWJ2ZXJ0OworI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUgorICAgIHJldHVybiBaX09LOworI2Vsc2UKKyAgICBzdGF0ZS0+c2FuZSA9IDE7CisgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKKyNlbmRpZgorfQorCitsb25nIFpFWFBPUlQgaW5mbGF0ZU1hcmsoc3RybSkKK3pfc3RyZWFtcCBzdHJtOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKQorICAgICAgICByZXR1cm4gKGxvbmcpKCgodW5zaWduZWQgbG9uZykwIC0gMSkgPDwgMTYpOworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOworICAgIHJldHVybiAobG9uZykoKCh1bnNpZ25lZCBsb25nKSgobG9uZylzdGF0ZS0+YmFjaykpIDw8IDE2KSArCisgICAgICAgIChzdGF0ZS0+bW9kZSA9PSBDT1BZID8gc3RhdGUtPmxlbmd0aCA6CisgICAgICAgICAgICAoc3RhdGUtPm1vZGUgPT0gTUFUQ0ggPyBzdGF0ZS0+d2FzIC0gc3RhdGUtPmxlbmd0aCA6IDApKTsKK30KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2luZmxhdGUuaCBiL3psaWIvc3JjL2luZmxhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWY0OTg2Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvaW5mbGF0ZS5oCkBAIC0wLDAgKzEsMTIyIEBACisvKiBpbmZsYXRlLmggLS0gaW50ZXJuYWwgaW5mbGF0ZSBzdGF0ZSBkZWZpbml0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwOSBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKKyAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcworICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgorICovCisKKy8qIGRlZmluZSBOT19HWklQIHdoZW4gY29tcGlsaW5nIGlmIHlvdSB3YW50IHRvIGRpc2FibGUgZ3ppcCBoZWFkZXIgYW5kCisgICB0cmFpbGVyIGRlY29kaW5nIGJ5IGluZmxhdGUoKS4gIE5PX0daSVAgd291bGQgYmUgdXNlZCB0byBhdm9pZCBsaW5raW5nIGluCisgICB0aGUgY3JjIGNvZGUgd2hlbiBpdCBpcyBub3QgbmVlZGVkLiAgRm9yIHNoYXJlZCBsaWJyYXJpZXMsIGd6aXAgZGVjb2RpbmcKKyAgIHNob3VsZCBiZSBsZWZ0IGVuYWJsZWQuICovCisjaWZuZGVmIE5PX0daSVAKKyMgIGRlZmluZSBHVU5aSVAKKyNlbmRpZgorCisvKiBQb3NzaWJsZSBpbmZsYXRlIG1vZGVzIGJldHdlZW4gaW5mbGF0ZSgpIGNhbGxzICovCit0eXBlZGVmIGVudW0geworICAgIEhFQUQsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1hZ2ljIGhlYWRlciAqLworICAgIEZMQUdTLCAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1ldGhvZCBhbmQgZmxhZ3MgKGd6aXApICovCisgICAgVElNRSwgICAgICAgLyogaTogd2FpdGluZyBmb3IgbW9kaWZpY2F0aW9uIHRpbWUgKGd6aXApICovCisgICAgT1MsICAgICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgZmxhZ3MgYW5kIG9wZXJhdGluZyBzeXN0ZW0gKGd6aXApICovCisgICAgRVhMRU4sICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgbGVuZ3RoIChnemlwKSAqLworICAgIEVYVFJBLCAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGJ5dGVzIChnemlwKSAqLworICAgIE5BTUUsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBmaWxlIG5hbWUgKGd6aXApICovCisgICAgQ09NTUVOVCwgICAgLyogaTogd2FpdGluZyBmb3IgZW5kIG9mIGNvbW1lbnQgKGd6aXApICovCisgICAgSENSQywgICAgICAgLyogaTogd2FpdGluZyBmb3IgaGVhZGVyIGNyYyAoZ3ppcCkgKi8KKyAgICBESUNUSUQsICAgICAvKiBpOiB3YWl0aW5nIGZvciBkaWN0aW9uYXJ5IGNoZWNrIHZhbHVlICovCisgICAgRElDVCwgICAgICAgLyogd2FpdGluZyBmb3IgaW5mbGF0ZVNldERpY3Rpb25hcnkoKSBjYWxsICovCisgICAgICAgIFRZUEUsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi8KKyAgICAgICAgVFlQRURPLCAgICAgLyogaTogc2FtZSwgYnV0IHNraXAgY2hlY2sgdG8gZXhpdCBpbmZsYXRlIG9uIG5ldyBibG9jayAqLworICAgICAgICBTVE9SRUQsICAgICAvKiBpOiB3YWl0aW5nIGZvciBzdG9yZWQgc2l6ZSAobGVuZ3RoIGFuZCBjb21wbGVtZW50KSAqLworICAgICAgICBDT1BZXywgICAgICAvKiBpL286IHNhbWUgYXMgQ09QWSBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqLworICAgICAgICBDT1BZLCAgICAgICAvKiBpL286IHdhaXRpbmcgZm9yIGlucHV0IG9yIG91dHB1dCB0byBjb3B5IHN0b3JlZCBibG9jayAqLworICAgICAgICBUQUJMRSwgICAgICAvKiBpOiB3YWl0aW5nIGZvciBkeW5hbWljIGJsb2NrIHRhYmxlIGxlbmd0aHMgKi8KKyAgICAgICAgTEVOTEVOUywgICAgLyogaTogd2FpdGluZyBmb3IgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovCisgICAgICAgIENPREVMRU5TLCAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQgYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqLworICAgICAgICAgICAgTEVOXywgICAgICAgLyogaTogc2FtZSBhcyBMRU4gYmVsb3csIGJ1dCBvbmx5IGZpcnN0IHRpbWUgaW4gKi8KKyAgICAgICAgICAgIExFTiwgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQvZW9iIGNvZGUgKi8KKyAgICAgICAgICAgIExFTkVYVCwgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aCBleHRyYSBiaXRzICovCisgICAgICAgICAgICBESVNULCAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBkaXN0YW5jZSBjb2RlICovCisgICAgICAgICAgICBESVNURVhULCAgICAvKiBpOiB3YWl0aW5nIGZvciBkaXN0YW5jZSBleHRyYSBiaXRzICovCisgICAgICAgICAgICBNQVRDSCwgICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gY29weSBzdHJpbmcgKi8KKyAgICAgICAgICAgIExJVCwgICAgICAgIC8qIG86IHdhaXRpbmcgZm9yIG91dHB1dCBzcGFjZSB0byB3cml0ZSBsaXRlcmFsICovCisgICAgQ0hFQ0ssICAgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGNoZWNrIHZhbHVlICovCisgICAgTEVOR1RILCAgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGxlbmd0aCAoZ3ppcCkgKi8KKyAgICBET05FLCAgICAgICAvKiBmaW5pc2hlZCBjaGVjaywgZG9uZSAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqLworICAgIEJBRCwgICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi8KKyAgICBNRU0sICAgICAgICAvKiBnb3QgYW4gaW5mbGF0ZSgpIG1lbW9yeSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqLworICAgIFNZTkMgICAgICAgIC8qIGxvb2tpbmcgZm9yIHN5bmNocm9uaXphdGlvbiBieXRlcyB0byByZXN0YXJ0IGluZmxhdGUoKSAqLworfSBpbmZsYXRlX21vZGU7CisKKy8qCisgICAgU3RhdGUgdHJhbnNpdGlvbnMgYmV0d2VlbiBhYm92ZSBtb2RlcyAtCisKKyAgICAobW9zdCBtb2RlcyBjYW4gZ28gdG8gQkFEIG9yIE1FTSBvbiBlcnJvciAtLSBub3Qgc2hvd24gZm9yIGNsYXJpdHkpCisKKyAgICBQcm9jZXNzIGhlYWRlcjoKKyAgICAgICAgSEVBRCAtPiAoZ3ppcCkgb3IgKHpsaWIpIG9yIChyYXcpCisgICAgICAgIChnemlwKSAtPiBGTEFHUyAtPiBUSU1FIC0+IE9TIC0+IEVYTEVOIC0+IEVYVFJBIC0+IE5BTUUgLT4gQ09NTUVOVCAtPgorICAgICAgICAgICAgICAgICAgSENSQyAtPiBUWVBFCisgICAgICAgICh6bGliKSAtPiBESUNUSUQgb3IgVFlQRQorICAgICAgICBESUNUSUQgLT4gRElDVCAtPiBUWVBFCisgICAgICAgIChyYXcpIC0+IFRZUEVETworICAgIFJlYWQgZGVmbGF0ZSBibG9ja3M6CisgICAgICAgICAgICBUWVBFIC0+IFRZUEVETyAtPiBTVE9SRUQgb3IgVEFCTEUgb3IgTEVOXyBvciBDSEVDSworICAgICAgICAgICAgU1RPUkVEIC0+IENPUFlfIC0+IENPUFkgLT4gVFlQRQorICAgICAgICAgICAgVEFCTEUgLT4gTEVOTEVOUyAtPiBDT0RFTEVOUyAtPiBMRU5fCisgICAgICAgICAgICBMRU5fIC0+IExFTgorICAgIFJlYWQgZGVmbGF0ZSBjb2RlcyBpbiBmaXhlZCBvciBkeW5hbWljIGJsb2NrOgorICAgICAgICAgICAgICAgIExFTiAtPiBMRU5FWFQgb3IgTElUIG9yIFRZUEUKKyAgICAgICAgICAgICAgICBMRU5FWFQgLT4gRElTVCAtPiBESVNURVhUIC0+IE1BVENIIC0+IExFTgorICAgICAgICAgICAgICAgIExJVCAtPiBMRU4KKyAgICBQcm9jZXNzIHRyYWlsZXI6CisgICAgICAgIENIRUNLIC0+IExFTkdUSCAtPiBET05FCisgKi8KKworLyogc3RhdGUgbWFpbnRhaW5lZCBiZXR3ZWVuIGluZmxhdGUoKSBjYWxscy4gIEFwcHJveGltYXRlbHkgMTBLIGJ5dGVzLiAqLworc3RydWN0IGluZmxhdGVfc3RhdGUgeworICAgIGluZmxhdGVfbW9kZSBtb2RlOyAgICAgICAgICAvKiBjdXJyZW50IGluZmxhdGUgbW9kZSAqLworICAgIGludCBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiB0cnVlIGlmIHByb2Nlc3NpbmcgbGFzdCBibG9jayAqLworICAgIGludCB3cmFwOyAgICAgICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovCisgICAgaW50IGhhdmVkaWN0OyAgICAgICAgICAgICAgIC8qIHRydWUgaWYgZGljdGlvbmFyeSBwcm92aWRlZCAqLworICAgIGludCBmbGFnczsgICAgICAgICAgICAgICAgICAvKiBnemlwIGhlYWRlciBtZXRob2QgYW5kIGZsYWdzICgwIGlmIHpsaWIpICovCisgICAgdW5zaWduZWQgZG1heDsgICAgICAgICAgICAgIC8qIHpsaWIgaGVhZGVyIG1heCBkaXN0YW5jZSAoSU5GTEFURV9TVFJJQ1QpICovCisgICAgdW5zaWduZWQgbG9uZyBjaGVjazsgICAgICAgIC8qIHByb3RlY3RlZCBjb3B5IG9mIGNoZWNrIHZhbHVlICovCisgICAgdW5zaWduZWQgbG9uZyB0b3RhbDsgICAgICAgIC8qIHByb3RlY3RlZCBjb3B5IG9mIG91dHB1dCBjb3VudCAqLworICAgIGd6X2hlYWRlcnAgaGVhZDsgICAgICAgICAgICAvKiB3aGVyZSB0byBzYXZlIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uICovCisgICAgICAgIC8qIHNsaWRpbmcgd2luZG93ICovCisgICAgdW5zaWduZWQgd2JpdHM7ICAgICAgICAgICAgIC8qIGxvZyBiYXNlIDIgb2YgcmVxdWVzdGVkIHdpbmRvdyBzaXplICovCisgICAgdW5zaWduZWQgd3NpemU7ICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplIG9yIHplcm8gaWYgbm90IHVzaW5nIHdpbmRvdyAqLworICAgIHVuc2lnbmVkIHdoYXZlOyAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovCisgICAgdW5zaWduZWQgd25leHQ7ICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqLworICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3c7ICAvKiBhbGxvY2F0ZWQgc2xpZGluZyB3aW5kb3csIGlmIG5lZWRlZCAqLworICAgICAgICAvKiBiaXQgYWNjdW11bGF0b3IgKi8KKyAgICB1bnNpZ25lZCBsb25nIGhvbGQ7ICAgICAgICAgLyogaW5wdXQgYml0IGFjY3VtdWxhdG9yICovCisgICAgdW5zaWduZWQgYml0czsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluICJpbiIgKi8KKyAgICAgICAgLyogZm9yIHN0cmluZyBhbmQgc3RvcmVkIGJsb2NrIGNvcHlpbmcgKi8KKyAgICB1bnNpZ25lZCBsZW5ndGg7ICAgICAgICAgICAgLyogbGl0ZXJhbCBvciBsZW5ndGggb2YgZGF0YSB0byBjb3B5ICovCisgICAgdW5zaWduZWQgb2Zmc2V0OyAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBzdHJpbmcgZnJvbSAqLworICAgICAgICAvKiBmb3IgdGFibGUgYW5kIGNvZGUgZGVjb2RpbmcgKi8KKyAgICB1bnNpZ25lZCBleHRyYTsgICAgICAgICAgICAgLyogZXh0cmEgYml0cyBuZWVkZWQgKi8KKyAgICAgICAgLyogZml4ZWQgYW5kIGR5bmFtaWMgY29kZSB0YWJsZXMgKi8KKyAgICBjb2RlIGNvbnN0IEZBUiAqbGVuY29kZTsgICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGxlbmd0aC9saXRlcmFsIGNvZGVzICovCisgICAgY29kZSBjb25zdCBGQVIgKmRpc3Rjb2RlOyAgIC8qIHN0YXJ0aW5nIHRhYmxlIGZvciBkaXN0YW5jZSBjb2RlcyAqLworICAgIHVuc2lnbmVkIGxlbmJpdHM7ICAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBsZW5jb2RlICovCisgICAgdW5zaWduZWQgZGlzdGJpdHM7ICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGRpc3Rjb2RlICovCisgICAgICAgIC8qIGR5bmFtaWMgdGFibGUgYnVpbGRpbmcgKi8KKyAgICB1bnNpZ25lZCBuY29kZTsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqLworICAgIHVuc2lnbmVkIG5sZW47ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqLworICAgIHVuc2lnbmVkIG5kaXN0OyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovCisgICAgdW5zaWduZWQgaGF2ZTsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aHMgaW4gbGVuc1tdICovCisgICAgY29kZSBGQVIgKm5leHQ7ICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIGNvZGVzW10gKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBsZW5zWzMyMF07ICAgLyogdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIGNvZGUgbGVuZ3RocyAqLworICAgIHVuc2lnbmVkIHNob3J0IHdvcmtbMjg4XTsgICAvKiB3b3JrIGFyZWEgZm9yIGNvZGUgdGFibGUgYnVpbGRpbmcgKi8KKyAgICBjb2RlIGNvZGVzW0VOT1VHSF07ICAgICAgICAgLyogc3BhY2UgZm9yIGNvZGUgdGFibGVzICovCisgICAgaW50IHNhbmU7ICAgICAgICAgICAgICAgICAgIC8qIGlmIGZhbHNlLCBhbGxvdyBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgKi8KKyAgICBpbnQgYmFjazsgICAgICAgICAgICAgICAgICAgLyogYml0cyBiYWNrIG9mIGxhc3QgdW5wcm9jZXNzZWQgbGVuZ3RoL2xpdCAqLworICAgIHVuc2lnbmVkIHdhczsgICAgICAgICAgICAgICAvKiBpbml0aWFsIGxlbmd0aCBvZiBtYXRjaCAqLworfTsKZGlmZiAtLWdpdCBhL3psaWIvc3JjL2luZnRyZWVzLmMgYi96bGliL3NyYy9pbmZ0cmVlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZDg5Y2YKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9pbmZ0cmVlcy5jCkBAIC0wLDAgKzEsMzA2IEBACisvKiBpbmZ0cmVlcy5jIC0tIGdlbmVyYXRlIEh1ZmZtYW4gdHJlZXMgZm9yIGVmZmljaWVudCBkZWNvZGluZworICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMTMgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKyNpbmNsdWRlICJ6dXRpbC5oIgorI2luY2x1ZGUgImluZnRyZWVzLmgiCisKKyNkZWZpbmUgTUFYQklUUyAxNQorCitjb25zdCBjaGFyIGluZmxhdGVfY29weXJpZ2h0W10gPQorICAgIiBpbmZsYXRlIDEuMi44IENvcHlyaWdodCAxOTk1LTIwMTMgTWFyayBBZGxlciAiOworLyoKKyAgSWYgeW91IHVzZSB0aGUgemxpYiBsaWJyYXJ5IGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaXMgd2VsY29tZQorICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB5b3VyIHByb2R1Y3QuIElmIGZvciBzb21lIHJlYXNvbiB5b3UgY2Fubm90CisgIGluY2x1ZGUgc3VjaCBhbiBhY2tub3dsZWRnbWVudCwgSSB3b3VsZCBhcHByZWNpYXRlIHRoYXQgeW91IGtlZXAgdGhpcworICBjb3B5cmlnaHQgc3RyaW5nIGluIHRoZSBleGVjdXRhYmxlIG9mIHlvdXIgcHJvZHVjdC4KKyAqLworCisvKgorICAgQnVpbGQgYSBzZXQgb2YgdGFibGVzIHRvIGRlY29kZSB0aGUgcHJvdmlkZWQgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4KKyAgIFRoZSBjb2RlIGxlbmd0aHMgYXJlIGxlbnNbMC4uY29kZXMtMV0uICBUaGUgcmVzdWx0IHN0YXJ0cyBhdCAqdGFibGUsCisgICB3aG9zZSBpbmRpY2VzIGFyZSAwLi4yXmJpdHMtMS4gIHdvcmsgaXMgYSB3cml0YWJsZSBhcnJheSBvZiBhdCBsZWFzdAorICAgbGVucyBzaG9ydHMsIHdoaWNoIGlzIHVzZWQgYXMgYSB3b3JrIGFyZWEuICB0eXBlIGlzIHRoZSB0eXBlIG9mIGNvZGUKKyAgIHRvIGJlIGdlbmVyYXRlZCwgQ09ERVMsIExFTlMsIG9yIERJU1RTLiAgT24gcmV0dXJuLCB6ZXJvIGlzIHN1Y2Nlc3MsCisgICAtMSBpcyBhbiBpbnZhbGlkIGNvZGUsIGFuZCArMSBtZWFucyB0aGF0IEVOT1VHSCBpc24ndCBlbm91Z2guICB0YWJsZQorICAgb24gcmV0dXJuIHBvaW50cyB0byB0aGUgbmV4dCBhdmFpbGFibGUgZW50cnkncyBhZGRyZXNzLiAgYml0cyBpcyB0aGUKKyAgIHJlcXVlc3RlZCByb290IHRhYmxlIGluZGV4IGJpdHMsIGFuZCBvbiByZXR1cm4gaXQgaXMgdGhlIGFjdHVhbCByb290CisgICB0YWJsZSBpbmRleCBiaXRzLiAgSXQgd2lsbCBkaWZmZXIgaWYgdGhlIHJlcXVlc3QgaXMgZ3JlYXRlciB0aGFuIHRoZQorICAgbG9uZ2VzdCBjb2RlIG9yIGlmIGl0IGlzIGxlc3MgdGhhbiB0aGUgc2hvcnRlc3QgY29kZS4KKyAqLworaW50IFpMSUJfSU5URVJOQUwgaW5mbGF0ZV90YWJsZSh0eXBlLCBsZW5zLCBjb2RlcywgdGFibGUsIGJpdHMsIHdvcmspCitjb2RldHlwZSB0eXBlOwordW5zaWduZWQgc2hvcnQgRkFSICpsZW5zOwordW5zaWduZWQgY29kZXM7Citjb2RlIEZBUiAqIEZBUiAqdGFibGU7Cit1bnNpZ25lZCBGQVIgKmJpdHM7Cit1bnNpZ25lZCBzaG9ydCBGQVIgKndvcms7Cit7CisgICAgdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAgIC8qIGEgY29kZSdzIGxlbmd0aCBpbiBiaXRzICovCisgICAgdW5zaWduZWQgc3ltOyAgICAgICAgICAgICAgIC8qIGluZGV4IG9mIGNvZGUgc3ltYm9scyAqLworICAgIHVuc2lnbmVkIG1pbiwgbWF4OyAgICAgICAgICAvKiBtaW5pbXVtIGFuZCBtYXhpbXVtIGNvZGUgbGVuZ3RocyAqLworICAgIHVuc2lnbmVkIHJvb3Q7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3Igcm9vdCB0YWJsZSAqLworICAgIHVuc2lnbmVkIGN1cnI7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgY3VycmVudCB0YWJsZSAqLworICAgIHVuc2lnbmVkIGRyb3A7ICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMgdG8gZHJvcCBmb3Igc3ViLXRhYmxlICovCisgICAgaW50IGxlZnQ7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBwcmVmaXggY29kZXMgYXZhaWxhYmxlICovCisgICAgdW5zaWduZWQgdXNlZDsgICAgICAgICAgICAgIC8qIGNvZGUgZW50cmllcyBpbiB0YWJsZSB1c2VkICovCisgICAgdW5zaWduZWQgaHVmZjsgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gY29kZSAqLworICAgIHVuc2lnbmVkIGluY3I7ICAgICAgICAgICAgICAvKiBmb3IgaW5jcmVtZW50aW5nIGNvZGUsIGluZGV4ICovCisgICAgdW5zaWduZWQgZmlsbDsgICAgICAgICAgICAgIC8qIGluZGV4IGZvciByZXBsaWNhdGluZyBlbnRyaWVzICovCisgICAgdW5zaWduZWQgbG93OyAgICAgICAgICAgICAgIC8qIGxvdyBiaXRzIGZvciBjdXJyZW50IHJvb3QgZW50cnkgKi8KKyAgICB1bnNpZ25lZCBtYXNrOyAgICAgICAgICAgICAgLyogbWFzayBmb3IgbG93IHJvb3QgYml0cyAqLworICAgIGNvZGUgaGVyZTsgICAgICAgICAgICAgICAgICAvKiB0YWJsZSBlbnRyeSBmb3IgZHVwbGljYXRpb24gKi8KKyAgICBjb2RlIEZBUiAqbmV4dDsgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gdGFibGUgKi8KKyAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBGQVIgKmJhc2U7ICAgICAvKiBiYXNlIHZhbHVlIHRhYmxlIHRvIHVzZSAqLworICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IEZBUiAqZXh0cmE7ICAgIC8qIGV4dHJhIGJpdHMgdGFibGUgdG8gdXNlICovCisgICAgaW50IGVuZDsgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBiYXNlIGFuZCBleHRyYSBmb3Igc3ltYm9sID4gZW5kICovCisgICAgdW5zaWduZWQgc2hvcnQgY291bnRbTUFYQklUUysxXTsgICAgLyogbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoICovCisgICAgdW5zaWduZWQgc2hvcnQgb2Zmc1tNQVhCSVRTKzFdOyAgICAgLyogb2Zmc2V0cyBpbiB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi8KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbGJhc2VbMzFdID0geyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgYmFzZSAqLworICAgICAgICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLAorICAgICAgICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMH07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGxleHRbMzFdID0geyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgZXh0cmEgKi8KKyAgICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsCisgICAgICAgIDE5LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjEsIDIxLCAyMSwgMjEsIDE2LCA3MiwgNzh9OworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBkYmFzZVszMl0gPSB7IC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGJhc2UgKi8KKyAgICAgICAgMSwgMiwgMywgNCwgNSwgNywgOSwgMTMsIDE3LCAyNSwgMzMsIDQ5LCA2NSwgOTcsIDEyOSwgMTkzLAorICAgICAgICAyNTcsIDM4NSwgNTEzLCA3NjksIDEwMjUsIDE1MzcsIDIwNDksIDMwNzMsIDQwOTcsIDYxNDUsCisgICAgICAgIDgxOTMsIDEyMjg5LCAxNjM4NSwgMjQ1NzcsIDAsIDB9OworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBkZXh0WzMyXSA9IHsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgZXh0cmEgKi8KKyAgICAgICAgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwLCAyMCwgMjEsIDIxLCAyMiwgMjIsCisgICAgICAgIDIzLCAyMywgMjQsIDI0LCAyNSwgMjUsIDI2LCAyNiwgMjcsIDI3LAorICAgICAgICAyOCwgMjgsIDI5LCAyOSwgNjQsIDY0fTsKKworICAgIC8qCisgICAgICAgUHJvY2VzcyBhIHNldCBvZiBjb2RlIGxlbmd0aHMgdG8gY3JlYXRlIGEgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4gIFRoZQorICAgICAgIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIEVhY2ggbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIHRoZQorICAgICAgIHN5bWJvbHMgMC4uY29kZXMtMS4gIFRoZSBIdWZmbWFuIGNvZGUgaXMgZ2VuZXJhdGVkIGJ5IGZpcnN0IHNvcnRpbmcgdGhlCisgICAgICAgc3ltYm9scyBieSBsZW5ndGggZnJvbSBzaG9ydCB0byBsb25nLCBhbmQgcmV0YWluaW5nIHRoZSBzeW1ib2wgb3JkZXIKKyAgICAgICBmb3IgY29kZXMgd2l0aCBlcXVhbCBsZW5ndGhzLiAgVGhlbiB0aGUgY29kZSBzdGFydHMgd2l0aCBhbGwgemVybyBiaXRzCisgICAgICAgZm9yIHRoZSBmaXJzdCBjb2RlIG9mIHRoZSBzaG9ydGVzdCBsZW5ndGgsIGFuZCB0aGUgY29kZXMgYXJlIGludGVnZXIKKyAgICAgICBpbmNyZW1lbnRzIGZvciB0aGUgc2FtZSBsZW5ndGgsIGFuZCB6ZXJvcyBhcmUgYXBwZW5kZWQgYXMgdGhlIGxlbmd0aAorICAgICAgIGluY3JlYXNlcy4gIEZvciB0aGUgZGVmbGF0ZSBmb3JtYXQsIHRoZXNlIGJpdHMgYXJlIHN0b3JlZCBiYWNrd2FyZHMKKyAgICAgICBmcm9tIHRoZWlyIG1vcmUgbmF0dXJhbCBpbnRlZ2VyIGluY3JlbWVudCBvcmRlcmluZywgYW5kIHNvIHdoZW4gdGhlCisgICAgICAgZGVjb2RpbmcgdGFibGVzIGFyZSBidWlsdCBpbiB0aGUgbGFyZ2UgbG9vcCBiZWxvdywgdGhlIGludGVnZXIgY29kZXMKKyAgICAgICBhcmUgaW5jcmVtZW50ZWQgYmFja3dhcmRzLgorCisgICAgICAgVGhpcyByb3V0aW5lIGFzc3VtZXMsIGJ1dCBkb2VzIG5vdCBjaGVjaywgdGhhdCBhbGwgb2YgdGhlIGVudHJpZXMgaW4KKyAgICAgICBsZW5zW10gYXJlIGluIHRoZSByYW5nZSAwLi5NQVhCSVRTLiAgVGhlIGNhbGxlciBtdXN0IGFzc3VyZSB0aGlzLgorICAgICAgIDEuLk1BWEJJVFMgaXMgaW50ZXJwcmV0ZWQgYXMgdGhhdCBjb2RlIGxlbmd0aC4gIHplcm8gbWVhbnMgdGhhdCB0aGF0CisgICAgICAgc3ltYm9sIGRvZXMgbm90IG9jY3VyIGluIHRoaXMgY29kZS4KKworICAgICAgIFRoZSBjb2RlcyBhcmUgc29ydGVkIGJ5IGNvbXB1dGluZyBhIGNvdW50IG9mIGNvZGVzIGZvciBlYWNoIGxlbmd0aCwKKyAgICAgICBjcmVhdGluZyBmcm9tIHRoYXQgYSB0YWJsZSBvZiBzdGFydGluZyBpbmRpY2VzIGZvciBlYWNoIGxlbmd0aCBpbiB0aGUKKyAgICAgICBzb3J0ZWQgdGFibGUsIGFuZCB0aGVuIGVudGVyaW5nIHRoZSBzeW1ib2xzIGluIG9yZGVyIGluIHRoZSBzb3J0ZWQKKyAgICAgICB0YWJsZS4gIFRoZSBzb3J0ZWQgdGFibGUgaXMgd29ya1tdLCB3aXRoIHRoYXQgc3BhY2UgYmVpbmcgcHJvdmlkZWQgYnkKKyAgICAgICB0aGUgY2FsbGVyLgorCisgICAgICAgVGhlIGxlbmd0aCBjb3VudHMgYXJlIHVzZWQgZm9yIG90aGVyIHB1cnBvc2VzIGFzIHdlbGwsIGkuZS4gZmluZGluZworICAgICAgIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCBjb2RlcywgZGV0ZXJtaW5pbmcgaWYgdGhlcmUgYXJlIGFueQorICAgICAgIGNvZGVzIGF0IGFsbCwgY2hlY2tpbmcgZm9yIGEgdmFsaWQgc2V0IG9mIGxlbmd0aHMsIGFuZCBsb29raW5nIGFoZWFkCisgICAgICAgYXQgbGVuZ3RoIGNvdW50cyB0byBkZXRlcm1pbmUgc3ViLXRhYmxlIHNpemVzIHdoZW4gYnVpbGRpbmcgdGhlCisgICAgICAgZGVjb2RpbmcgdGFibGVzLgorICAgICAqLworCisgICAgLyogYWNjdW11bGF0ZSBsZW5ndGhzIGZvciBjb2RlcyAoYXNzdW1lcyBsZW5zW10gYWxsIGluIDAuLk1BWEJJVFMpICovCisgICAgZm9yIChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspCisgICAgICAgIGNvdW50W2xlbl0gPSAwOworICAgIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKQorICAgICAgICBjb3VudFtsZW5zW3N5bV1dKys7CisKKyAgICAvKiBib3VuZCBjb2RlIGxlbmd0aHMsIGZvcmNlIHJvb3QgdG8gYmUgd2l0aGluIGNvZGUgbGVuZ3RocyAqLworICAgIHJvb3QgPSAqYml0czsKKyAgICBmb3IgKG1heCA9IE1BWEJJVFM7IG1heCA+PSAxOyBtYXgtLSkKKyAgICAgICAgaWYgKGNvdW50W21heF0gIT0gMCkgYnJlYWs7CisgICAgaWYgKHJvb3QgPiBtYXgpIHJvb3QgPSBtYXg7CisgICAgaWYgKG1heCA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgLyogbm8gc3ltYm9scyB0byBjb2RlIGF0IGFsbCAqLworICAgICAgICBoZXJlLm9wID0gKHVuc2lnbmVkIGNoYXIpNjQ7ICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi8KKyAgICAgICAgaGVyZS5iaXRzID0gKHVuc2lnbmVkIGNoYXIpMTsKKyAgICAgICAgaGVyZS52YWwgPSAodW5zaWduZWQgc2hvcnQpMDsKKyAgICAgICAgKigqdGFibGUpKysgPSBoZXJlOyAgICAgICAgICAgICAvKiBtYWtlIGEgdGFibGUgdG8gZm9yY2UgYW4gZXJyb3IgKi8KKyAgICAgICAgKigqdGFibGUpKysgPSBoZXJlOworICAgICAgICAqYml0cyA9IDE7CisgICAgICAgIHJldHVybiAwOyAgICAgLyogbm8gc3ltYm9scywgYnV0IHdhaXQgZm9yIGRlY29kaW5nIHRvIHJlcG9ydCBlcnJvciAqLworICAgIH0KKyAgICBmb3IgKG1pbiA9IDE7IG1pbiA8IG1heDsgbWluKyspCisgICAgICAgIGlmIChjb3VudFttaW5dICE9IDApIGJyZWFrOworICAgIGlmIChyb290IDwgbWluKSByb290ID0gbWluOworCisgICAgLyogY2hlY2sgZm9yIGFuIG92ZXItc3Vic2NyaWJlZCBvciBpbmNvbXBsZXRlIHNldCBvZiBsZW5ndGhzICovCisgICAgbGVmdCA9IDE7CisgICAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHsKKyAgICAgICAgbGVmdCA8PD0gMTsKKyAgICAgICAgbGVmdCAtPSBjb3VudFtsZW5dOworICAgICAgICBpZiAobGVmdCA8IDApIHJldHVybiAtMTsgICAgICAgIC8qIG92ZXItc3Vic2NyaWJlZCAqLworICAgIH0KKyAgICBpZiAobGVmdCA+IDAgJiYgKHR5cGUgPT0gQ09ERVMgfHwgbWF4ICE9IDEpKQorICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluY29tcGxldGUgc2V0ICovCisKKyAgICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCBmb3Igc29ydGluZyAqLworICAgIG9mZnNbMV0gPSAwOworICAgIGZvciAobGVuID0gMTsgbGVuIDwgTUFYQklUUzsgbGVuKyspCisgICAgICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xlbl0gKyBjb3VudFtsZW5dOworCisgICAgLyogc29ydCBzeW1ib2xzIGJ5IGxlbmd0aCwgYnkgc3ltYm9sIG9yZGVyIHdpdGhpbiBlYWNoIGxlbmd0aCAqLworICAgIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKQorICAgICAgICBpZiAobGVuc1tzeW1dICE9IDApIHdvcmtbb2Zmc1tsZW5zW3N5bV1dKytdID0gKHVuc2lnbmVkIHNob3J0KXN5bTsKKworICAgIC8qCisgICAgICAgQ3JlYXRlIGFuZCBmaWxsIGluIGRlY29kaW5nIHRhYmxlcy4gIEluIHRoaXMgbG9vcCwgdGhlIHRhYmxlIGJlaW5nCisgICAgICAgZmlsbGVkIGlzIGF0IG5leHQgYW5kIGhhcyBjdXJyIGluZGV4IGJpdHMuICBUaGUgY29kZSBiZWluZyB1c2VkIGlzIGh1ZmYKKyAgICAgICB3aXRoIGxlbmd0aCBsZW4uICBUaGF0IGNvZGUgaXMgY29udmVydGVkIHRvIGFuIGluZGV4IGJ5IGRyb3BwaW5nIGRyb3AKKyAgICAgICBiaXRzIG9mZiBvZiB0aGUgYm90dG9tLiAgRm9yIGNvZGVzIHdoZXJlIGxlbiBpcyBsZXNzIHRoYW4gZHJvcCArIGN1cnIsCisgICAgICAgdGhvc2UgdG9wIGRyb3AgKyBjdXJyIC0gbGVuIGJpdHMgYXJlIGluY3JlbWVudGVkIHRocm91Z2ggYWxsIHZhbHVlcyB0bworICAgICAgIGZpbGwgdGhlIHRhYmxlIHdpdGggcmVwbGljYXRlZCBlbnRyaWVzLgorCisgICAgICAgcm9vdCBpcyB0aGUgbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHRoZSByb290IHRhYmxlLiAgV2hlbiBsZW4gZXhjZWVkcworICAgICAgIHJvb3QsIHN1Yi10YWJsZXMgYXJlIGNyZWF0ZWQgcG9pbnRlZCB0byBieSB0aGUgcm9vdCBlbnRyeSB3aXRoIGFuIGluZGV4CisgICAgICAgb2YgdGhlIGxvdyByb290IGJpdHMgb2YgaHVmZi4gIFRoaXMgaXMgc2F2ZWQgaW4gbG93IHRvIGNoZWNrIGZvciB3aGVuIGEKKyAgICAgICBuZXcgc3ViLXRhYmxlIHNob3VsZCBiZSBzdGFydGVkLiAgZHJvcCBpcyB6ZXJvIHdoZW4gdGhlIHJvb3QgdGFibGUgaXMKKyAgICAgICBiZWluZyBmaWxsZWQsIGFuZCBkcm9wIGlzIHJvb3Qgd2hlbiBzdWItdGFibGVzIGFyZSBiZWluZyBmaWxsZWQuCisKKyAgICAgICBXaGVuIGEgbmV3IHN1Yi10YWJsZSBpcyBuZWVkZWQsIGl0IGlzIG5lY2Vzc2FyeSB0byBsb29rIGFoZWFkIGluIHRoZQorICAgICAgIGNvZGUgbGVuZ3RocyB0byBkZXRlcm1pbmUgd2hhdCBzaXplIHN1Yi10YWJsZSBpcyBuZWVkZWQuICBUaGUgbGVuZ3RoCisgICAgICAgY291bnRzIGFyZSB1c2VkIGZvciB0aGlzLCBhbmQgc28gY291bnRbXSBpcyBkZWNyZW1lbnRlZCBhcyBjb2RlcyBhcmUKKyAgICAgICBlbnRlcmVkIGluIHRoZSB0YWJsZXMuCisKKyAgICAgICB1c2VkIGtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IHRhYmxlIGVudHJpZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBmcm9tIHRoZQorICAgICAgIHByb3ZpZGVkICp0YWJsZSBzcGFjZS4gIEl0IGlzIGNoZWNrZWQgZm9yIExFTlMgYW5kIERJU1QgdGFibGVzIGFnYWluc3QKKyAgICAgICB0aGUgY29uc3RhbnRzIEVOT1VHSF9MRU5TIGFuZCBFTk9VR0hfRElTVFMgdG8gZ3VhcmQgYWdhaW5zdCBjaGFuZ2VzIGluCisgICAgICAgdGhlIGluaXRpYWwgcm9vdCB0YWJsZSBzaXplIGNvbnN0YW50cy4gIFNlZSB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaAorICAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisgICAgICAgc3ltIGluY3JlbWVudHMgdGhyb3VnaCBhbGwgc3ltYm9scywgYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMgd2hlbgorICAgICAgIGFsbCBjb2RlcyBvZiBsZW5ndGggbWF4LCBpLmUuIGFsbCBjb2RlcywgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gIFRoaXMKKyAgICAgICByb3V0aW5lIHBlcm1pdHMgaW5jb21wbGV0ZSBjb2Rlcywgc28gYW5vdGhlciBsb29wIGFmdGVyIHRoaXMgb25lIGZpbGxzCisgICAgICAgaW4gdGhlIHJlc3Qgb2YgdGhlIGRlY29kaW5nIHRhYmxlcyB3aXRoIGludmFsaWQgY29kZSBtYXJrZXJzLgorICAgICAqLworCisgICAgLyogc2V0IHVwIGZvciBjb2RlIHR5cGUgKi8KKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIENPREVTOgorICAgICAgICBiYXNlID0gZXh0cmEgPSB3b3JrOyAgICAvKiBkdW1teSB2YWx1ZS0tbm90IHVzZWQgKi8KKyAgICAgICAgZW5kID0gMTk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTEVOUzoKKyAgICAgICAgYmFzZSA9IGxiYXNlOworICAgICAgICBiYXNlIC09IDI1NzsKKyAgICAgICAgZXh0cmEgPSBsZXh0OworICAgICAgICBleHRyYSAtPSAyNTc7CisgICAgICAgIGVuZCA9IDI1NjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogICAgICAgICAgICAvKiBESVNUUyAqLworICAgICAgICBiYXNlID0gZGJhc2U7CisgICAgICAgIGV4dHJhID0gZGV4dDsKKyAgICAgICAgZW5kID0gLTE7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBzdGF0ZSBmb3IgbG9vcCAqLworICAgIGh1ZmYgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlICovCisgICAgc3ltID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgc3ltYm9sICovCisgICAgbGVuID0gbWluOyAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgbGVuZ3RoICovCisgICAgbmV4dCA9ICp0YWJsZTsgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgdG8gZmlsbCBpbiAqLworICAgIGN1cnIgPSByb290OyAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIGluZGV4IGJpdHMgKi8KKyAgICBkcm9wID0gMDsgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBiaXRzIHRvIGRyb3AgZnJvbSBjb2RlIGZvciBpbmRleCAqLworICAgIGxvdyA9ICh1bnNpZ25lZCkoLTEpOyAgICAgICAvKiB0cmlnZ2VyIG5ldyBzdWItdGFibGUgd2hlbiBsZW4gPiByb290ICovCisgICAgdXNlZCA9IDFVIDw8IHJvb3Q7ICAgICAgICAgIC8qIHVzZSByb290IHRhYmxlIGVudHJpZXMgKi8KKyAgICBtYXNrID0gdXNlZCAtIDE7ICAgICAgICAgICAgLyogbWFzayBmb3IgY29tcGFyaW5nIGxvdyAqLworCisgICAgLyogY2hlY2sgYXZhaWxhYmxlIHRhYmxlIHNwYWNlICovCisgICAgaWYgKCh0eXBlID09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TKSB8fAorICAgICAgICAodHlwZSA9PSBESVNUUyAmJiB1c2VkID4gRU5PVUdIX0RJU1RTKSkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICAvKiBwcm9jZXNzIGFsbCBjb2RlcyBhbmQgbWFrZSB0YWJsZSBlbnRyaWVzICovCisgICAgZm9yICg7OykgeworICAgICAgICAvKiBjcmVhdGUgdGFibGUgZW50cnkgKi8KKyAgICAgICAgaGVyZS5iaXRzID0gKHVuc2lnbmVkIGNoYXIpKGxlbiAtIGRyb3ApOworICAgICAgICBpZiAoKGludCkod29ya1tzeW1dKSA8IGVuZCkgeworICAgICAgICAgICAgaGVyZS5vcCA9ICh1bnNpZ25lZCBjaGFyKTA7CisgICAgICAgICAgICBoZXJlLnZhbCA9IHdvcmtbc3ltXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoaW50KSh3b3JrW3N5bV0pID4gZW5kKSB7CisgICAgICAgICAgICBoZXJlLm9wID0gKHVuc2lnbmVkIGNoYXIpKGV4dHJhW3dvcmtbc3ltXV0pOworICAgICAgICAgICAgaGVyZS52YWwgPSBiYXNlW3dvcmtbc3ltXV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBoZXJlLm9wID0gKHVuc2lnbmVkIGNoYXIpKDMyICsgNjQpOyAgICAgICAgIC8qIGVuZCBvZiBibG9jayAqLworICAgICAgICAgICAgaGVyZS52YWwgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyogcmVwbGljYXRlIGZvciB0aG9zZSBpbmRpY2VzIHdpdGggbG93IGxlbiBiaXRzIGVxdWFsIHRvIGh1ZmYgKi8KKyAgICAgICAgaW5jciA9IDFVIDw8IChsZW4gLSBkcm9wKTsKKyAgICAgICAgZmlsbCA9IDFVIDw8IGN1cnI7CisgICAgICAgIG1pbiA9IGZpbGw7ICAgICAgICAgICAgICAgICAvKiBzYXZlIG9mZnNldCB0byBuZXh0IHRhYmxlICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGZpbGwgLT0gaW5jcjsKKyAgICAgICAgICAgIG5leHRbKGh1ZmYgPj4gZHJvcCkgKyBmaWxsXSA9IGhlcmU7CisgICAgICAgIH0gd2hpbGUgKGZpbGwgIT0gMCk7CisKKyAgICAgICAgLyogYmFja3dhcmRzIGluY3JlbWVudCB0aGUgbGVuLWJpdCBjb2RlIGh1ZmYgKi8KKyAgICAgICAgaW5jciA9IDFVIDw8IChsZW4gLSAxKTsKKyAgICAgICAgd2hpbGUgKGh1ZmYgJiBpbmNyKQorICAgICAgICAgICAgaW5jciA+Pj0gMTsKKyAgICAgICAgaWYgKGluY3IgIT0gMCkgeworICAgICAgICAgICAgaHVmZiAmPSBpbmNyIC0gMTsKKyAgICAgICAgICAgIGh1ZmYgKz0gaW5jcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBodWZmID0gMDsKKworICAgICAgICAvKiBnbyB0byBuZXh0IHN5bWJvbCwgdXBkYXRlIGNvdW50LCBsZW4gKi8KKyAgICAgICAgc3ltKys7CisgICAgICAgIGlmICgtLShjb3VudFtsZW5dKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAobGVuID09IG1heCkgYnJlYWs7CisgICAgICAgICAgICBsZW4gPSBsZW5zW3dvcmtbc3ltXV07CisgICAgICAgIH0KKworICAgICAgICAvKiBjcmVhdGUgbmV3IHN1Yi10YWJsZSBpZiBuZWVkZWQgKi8KKyAgICAgICAgaWYgKGxlbiA+IHJvb3QgJiYgKGh1ZmYgJiBtYXNrKSAhPSBsb3cpIHsKKyAgICAgICAgICAgIC8qIGlmIGZpcnN0IHRpbWUsIHRyYW5zaXRpb24gdG8gc3ViLXRhYmxlcyAqLworICAgICAgICAgICAgaWYgKGRyb3AgPT0gMCkKKyAgICAgICAgICAgICAgICBkcm9wID0gcm9vdDsKKworICAgICAgICAgICAgLyogaW5jcmVtZW50IHBhc3QgbGFzdCB0YWJsZSAqLworICAgICAgICAgICAgbmV4dCArPSBtaW47ICAgICAgICAgICAgLyogaGVyZSBtaW4gaXMgMSA8PCBjdXJyICovCisKKyAgICAgICAgICAgIC8qIGRldGVybWluZSBsZW5ndGggb2YgbmV4dCB0YWJsZSAqLworICAgICAgICAgICAgY3VyciA9IGxlbiAtIGRyb3A7CisgICAgICAgICAgICBsZWZ0ID0gKGludCkoMSA8PCBjdXJyKTsKKyAgICAgICAgICAgIHdoaWxlIChjdXJyICsgZHJvcCA8IG1heCkgeworICAgICAgICAgICAgICAgIGxlZnQgLT0gY291bnRbY3VyciArIGRyb3BdOworICAgICAgICAgICAgICAgIGlmIChsZWZ0IDw9IDApIGJyZWFrOworICAgICAgICAgICAgICAgIGN1cnIrKzsKKyAgICAgICAgICAgICAgICBsZWZ0IDw8PSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBjaGVjayBmb3IgZW5vdWdoIHNwYWNlICovCisgICAgICAgICAgICB1c2VkICs9IDFVIDw8IGN1cnI7CisgICAgICAgICAgICBpZiAoKHR5cGUgPT0gTEVOUyAmJiB1c2VkID4gRU5PVUdIX0xFTlMpIHx8CisgICAgICAgICAgICAgICAgKHR5cGUgPT0gRElTVFMgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUykpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgICAgIC8qIHBvaW50IGVudHJ5IGluIHJvb3QgdGFibGUgdG8gc3ViLXRhYmxlICovCisgICAgICAgICAgICBsb3cgPSBodWZmICYgbWFzazsKKyAgICAgICAgICAgICgqdGFibGUpW2xvd10ub3AgPSAodW5zaWduZWQgY2hhciljdXJyOworICAgICAgICAgICAgKCp0YWJsZSlbbG93XS5iaXRzID0gKHVuc2lnbmVkIGNoYXIpcm9vdDsKKyAgICAgICAgICAgICgqdGFibGUpW2xvd10udmFsID0gKHVuc2lnbmVkIHNob3J0KShuZXh0IC0gKnRhYmxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGZpbGwgaW4gcmVtYWluaW5nIHRhYmxlIGVudHJ5IGlmIGNvZGUgaXMgaW5jb21wbGV0ZSAoZ3VhcmFudGVlZCB0byBoYXZlCisgICAgICAgYXQgbW9zdCBvbmUgcmVtYWluaW5nIGVudHJ5LCBzaW5jZSBpZiB0aGUgY29kZSBpcyBpbmNvbXBsZXRlLCB0aGUKKyAgICAgICBtYXhpbXVtIGNvZGUgbGVuZ3RoIHRoYXQgd2FzIGFsbG93ZWQgdG8gZ2V0IHRoaXMgZmFyIGlzIG9uZSBiaXQpICovCisgICAgaWYgKGh1ZmYgIT0gMCkgeworICAgICAgICBoZXJlLm9wID0gKHVuc2lnbmVkIGNoYXIpNjQ7ICAgICAgICAgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqLworICAgICAgICBoZXJlLmJpdHMgPSAodW5zaWduZWQgY2hhcikobGVuIC0gZHJvcCk7CisgICAgICAgIGhlcmUudmFsID0gKHVuc2lnbmVkIHNob3J0KTA7CisgICAgICAgIG5leHRbaHVmZl0gPSBoZXJlOworICAgIH0KKworICAgIC8qIHNldCByZXR1cm4gcGFyYW1ldGVycyAqLworICAgICp0YWJsZSArPSB1c2VkOworICAgICpiaXRzID0gcm9vdDsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3psaWIvc3JjL2luZnRyZWVzLmggYi96bGliL3NyYy9pbmZ0cmVlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYTUzYTAKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9pbmZ0cmVlcy5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qIGluZnRyZWVzLmggLS0gaGVhZGVyIHRvIHVzZSBpbmZ0cmVlcy5jCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSwgMjAxMCBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKKyAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcworICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgorICovCisKKy8qIFN0cnVjdHVyZSBmb3IgZGVjb2RpbmcgdGFibGVzLiAgRWFjaCBlbnRyeSBwcm92aWRlcyBlaXRoZXIgdGhlCisgICBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gZG8gdGhlIG9wZXJhdGlvbiByZXF1ZXN0ZWQgYnkgdGhlIGNvZGUgdGhhdAorICAgaW5kZXhlZCB0aGF0IHRhYmxlIGVudHJ5LCBvciBpdCBwcm92aWRlcyBhIHBvaW50ZXIgdG8gYW5vdGhlcgorICAgdGFibGUgdGhhdCBpbmRleGVzIG1vcmUgYml0cyBvZiB0aGUgY29kZS4gIG9wIGluZGljYXRlcyB3aGV0aGVyCisgICB0aGUgZW50cnkgaXMgYSBwb2ludGVyIHRvIGFub3RoZXIgdGFibGUsIGEgbGl0ZXJhbCwgYSBsZW5ndGggb3IKKyAgIGRpc3RhbmNlLCBhbiBlbmQtb2YtYmxvY2ssIG9yIGFuIGludmFsaWQgY29kZS4gIEZvciBhIHRhYmxlCisgICBwb2ludGVyLCB0aGUgbG93IGZvdXIgYml0cyBvZiBvcCBpcyB0aGUgbnVtYmVyIG9mIGluZGV4IGJpdHMgb2YKKyAgIHRoYXQgdGFibGUuICBGb3IgYSBsZW5ndGggb3IgZGlzdGFuY2UsIHRoZSBsb3cgZm91ciBiaXRzIG9mIG9wCisgICBpcyB0aGUgbnVtYmVyIG9mIGV4dHJhIGJpdHMgdG8gZ2V0IGFmdGVyIHRoZSBjb2RlLiAgYml0cyBpcworICAgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoaXMgY29kZSBvciBwYXJ0IG9mIHRoZSBjb2RlIHRvIGRyb3Agb2ZmCisgICBvZiB0aGUgYml0IGJ1ZmZlci4gIHZhbCBpcyB0aGUgYWN0dWFsIGJ5dGUgdG8gb3V0cHV0IGluIHRoZSBjYXNlCisgICBvZiBhIGxpdGVyYWwsIHRoZSBiYXNlIGxlbmd0aCBvciBkaXN0YW5jZSwgb3IgdGhlIG9mZnNldCBmcm9tCisgICB0aGUgY3VycmVudCB0YWJsZSB0byB0aGUgbmV4dCB0YWJsZS4gIEVhY2ggZW50cnkgaXMgZm91ciBieXRlcy4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBjaGFyIG9wOyAgICAgICAgICAgLyogb3BlcmF0aW9uLCBleHRyYSBiaXRzLCB0YWJsZSBiaXRzICovCisgICAgdW5zaWduZWQgY2hhciBiaXRzOyAgICAgICAgIC8qIGJpdHMgaW4gdGhpcyBwYXJ0IG9mIHRoZSBjb2RlICovCisgICAgdW5zaWduZWQgc2hvcnQgdmFsOyAgICAgICAgIC8qIG9mZnNldCBpbiB0YWJsZSBvciBjb2RlIHZhbHVlICovCit9IGNvZGU7CisKKy8qIG9wIHZhbHVlcyBhcyBzZXQgYnkgaW5mbGF0ZV90YWJsZSgpOgorICAgIDAwMDAwMDAwIC0gbGl0ZXJhbAorICAgIDAwMDB0dHR0IC0gdGFibGUgbGluaywgdHR0dCAhPSAwIGlzIHRoZSBudW1iZXIgb2YgdGFibGUgaW5kZXggYml0cworICAgIDAwMDFlZWVlIC0gbGVuZ3RoIG9yIGRpc3RhbmNlLCBlZWVlIGlzIHRoZSBudW1iZXIgb2YgZXh0cmEgYml0cworICAgIDAxMTAwMDAwIC0gZW5kIG9mIGJsb2NrCisgICAgMDEwMDAwMDAgLSBpbnZhbGlkIGNvZGUKKyAqLworCisvKiBNYXhpbXVtIHNpemUgb2YgdGhlIGR5bmFtaWMgdGFibGUuICBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29kZSBzdHJ1Y3R1cmVzIGlzCisgICAxNDQ0LCB3aGljaCBpcyB0aGUgc3VtIG9mIDg1MiBmb3IgbGl0ZXJhbC9sZW5ndGggY29kZXMgYW5kIDU5MiBmb3IgZGlzdGFuY2UKKyAgIGNvZGVzLiAgVGhlc2UgdmFsdWVzIHdlcmUgZm91bmQgYnkgZXhoYXVzdGl2ZSBzZWFyY2hlcyB1c2luZyB0aGUgcHJvZ3JhbQorICAgZXhhbXBsZXMvZW5vdWdoLmMgZm91bmQgaW4gdGhlIHpsaWIgZGlzdHJpYnR1dGlvbi4gIFRoZSBhcmd1bWVudHMgdG8gdGhhdAorICAgcHJvZ3JhbSBhcmUgdGhlIG51bWJlciBvZiBzeW1ib2xzLCB0aGUgaW5pdGlhbCByb290IHRhYmxlIHNpemUsIGFuZCB0aGUKKyAgIG1heGltdW0gYml0IGxlbmd0aCBvZiBhIGNvZGUuICAiZW5vdWdoIDI4NiA5IDE1IiBmb3IgbGl0ZXJhbC9sZW5ndGggY29kZXMKKyAgIHJldHVybnMgcmV0dXJucyA4NTIsIGFuZCAiZW5vdWdoIDMwIDYgMTUiIGZvciBkaXN0YW5jZSBjb2RlcyByZXR1cm5zIDU5Mi4KKyAgIFRoZSBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSAoOSBvciA2KSBpcyBmb3VuZCBpbiB0aGUgZmlmdGggYXJndW1lbnQgb2YgdGhlCisgICBpbmZsYXRlX3RhYmxlKCkgY2FsbHMgaW4gaW5mbGF0ZS5jIGFuZCBpbmZiYWNrLmMuICBJZiB0aGUgcm9vdCB0YWJsZSBzaXplIGlzCisgICBjaGFuZ2VkLCB0aGVuIHRoZXNlIG1heGltdW0gc2l6ZXMgd291bGQgYmUgbmVlZCB0byBiZSByZWNhbGN1bGF0ZWQgYW5kCisgICB1cGRhdGVkLiAqLworI2RlZmluZSBFTk9VR0hfTEVOUyA4NTIKKyNkZWZpbmUgRU5PVUdIX0RJU1RTIDU5MgorI2RlZmluZSBFTk9VR0ggKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUykKKworLyogVHlwZSBvZiBjb2RlIHRvIGJ1aWxkIGZvciBpbmZsYXRlX3RhYmxlKCkgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgQ09ERVMsCisgICAgTEVOUywKKyAgICBESVNUUworfSBjb2RldHlwZTsKKworaW50IFpMSUJfSU5URVJOQUwgaW5mbGF0ZV90YWJsZSBPRigoY29kZXR5cGUgdHlwZSwgdW5zaWduZWQgc2hvcnQgRkFSICpsZW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjb2RlcywgY29kZSBGQVIgKiBGQVIgKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGQVIgKmJpdHMsIHVuc2lnbmVkIHNob3J0IEZBUiAqd29yaykpOwpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvbWFrZV92bXMuY29tIGIvemxpYi9zcmMvbWFrZV92bXMuY29tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZTlkMGMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9tYWtlX3Ztcy5jb20KQEAgLTAsMCArMSw4NjcgQEAKKyQhIG1ha2UgbGlieiB1bmRlciBWTVMgd3JpdHRlbiBieQorJCEgTWFydGluIFAuSi4gWmluc2VyCiskIQorJCEgSW4gY2FzZSBvZiBwcm9ibGVtcyB3aXRoIHRoZSBpbnN0YWxsIHlvdSBtaWdodCBjb250YWN0IG1lIGF0CiskISB6aW5zZXJAemluc2VyLm5vLWlwLmluZm8ocHJlZmVycmVkKSBvcgorJCEgbWFydGluLnppbnNlckBldXJleGNoYW5nZS5jb20gKHdvcmspCiskIQorJCEgTWFrZSBwcm9jZWR1cmUgaGlzdG9yeSBmb3IgWmxpYgorJCEKKyQhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskISBWZXJzaW9uIGhpc3RvcnkKKyQhIDAuMDEgMjAwNjAxMjAgRmlyc3QgdmVyc2lvbiB0byByZWNlaXZlIGEgbnVtYmVyCiskISAwLjAyIDIwMDYxMDA4IEFkYXB0IHRvIG5ldyBNYWtlZmlsZS5pbgorJCEgMC4wMyAyMDA5MTIyNCBBZGQgc3VwcG9ydCBmb3IgbGFyZ2UgZmlsZSBjaGVjaworJCEgMC4wNCAyMDEwMDExMCBBZGQgbmV3IGd6Y2xvc2UsIGd6bGliLCBnenJlYWQsIGd6d3JpdGUKKyQhIDAuMDUgMjAxMDAyMjEgRXhjaGFuZ2UgemxpYmRlZnMuaCBieSB6Y29uZi5oLmluCiskISAwLjA2IDIwMTIwMTExIEZpeCBtaXNzaW5nIGFtaXNzX2VyciwgdXBkYXRlIHpjb25mX2guaW4sIGZpeCBuZXcgZXhtcGxlcworJCEgICAgICAgICAgICAgICBzdWJkaXIgcGF0aCwgdXBkYXRlIG1vZHVsZSBzZWFyY2ggaW4gbWFrZWZpbGUuaW4KKyQhIDAuMDcgMjAxMjAxMTUgVHJpZ2dlcmVkIGJ5IHdvcmsgZG9uZSBieSBBbGV4ZXkgQ2h1cGFoaW4gY29tcGxldGx5IHJlZGVzaWduZWQKKyQhICAgICAgICAgICAgICAgc2hhcmVkIGltYWdlIGNyZWF0aW9uCiskISAwLjA4IDIwMTIwMjE5IE1ha2UgaXQgd29yayBvbiBWQVggYWdhaW4sIHByZS1sb2FkIG1pc3Npbmcgc3ltYm9scyB0byBzaGFyZWQKKyQhICAgICAgICAgICAgICAgaW1hZ2UKKyQhIDAuMDkgMjAxMjAzMDUgU01TLiAgUDEgc2V0cyBidWlsZGVyICgiTU1LIiwgIk1NUyIsICIgIiAoYnVpbHQtaW4pKS4KKyQhICAgICAgICAgICAgICAgIiIgLT4gYXV0b21hdGljLCBwcmVmZXJlbmNlOiBNTUssIE1NUywgYnVpbHQtaW4uCiskIQorJCBvbiBlcnJvciB0aGVuIGdvdG8gZXJyX2V4aXQKKyQhCiskIHRydWUgID0gMQorJCBmYWxzZSA9IDAKKyQgdG1wbmFtID0gInRlbXBfIiArIGYkZ2V0anBpKCIiLCJwaWQiKQorJCB0dCA9IHRtcG5hbSArICIudHh0IgorJCB0YyA9IHRtcG5hbSArICIuYyIKKyQgdGggPSB0bXBuYW0gKyAiLmgiCiskIGRlZmluZS9ub2xvZyB0Y29uZmlnICd0aCcKKyQgaXRzX2RlY2MgPSBmYWxzZQorJCBpdHNfdmF4YyA9IGZhbHNlCiskIGl0c19nbnVjID0gZmFsc2UKKyQgc19jYXNlICAgPSBGYWxzZQorJCEKKyQhIFNldHVwIHZhcmlhYmxlcyBob2xkaW5nICJjb25maWciIGluZm9ybWF0aW9uCiskIQorJCBNYWtlICAgID0gIicncDEnIgorJCBuYW1lICAgICA9ICJabGliIgorJCB2ZXJzaW9uICA9ICI/Lj8uPyIKKyQgdl9zdHJpbmcgPSAiWkxJQl9WRVJTSU9OIgorJCB2X2ZpbGUgICA9ICJ6bGliLmgiCiskIGNjb3B0ICAgPSAiL2luY2x1ZGUgPSBbXSIKKyQgbG9wdHMgICA9ICIiCiskIGRuc3JsICAgPSAiIgorJCBhY29uZl9pbl9maWxlID0gInpjb25mLmguaW4jemNvbmYuaF9pbiN6Y29uZl9oLmluIgorJCBjb25mX2NoZWNrX3N0cmluZyA9ICIiCiskIGxpbmtvbmx5ID0gZmFsc2UKKyQgb3B0ZmlsZSAgPSBuYW1lICsgIi5vcHQiCiskIG1hcGZpbGUgID0gbmFtZSArICIubWFwIgorJCBsaWJkZWZzICA9ICIiCiskIHZheCAgICAgID0gZiRnZXRzeWkoIkhXX01PREVMIikubHQuMTAyNAorJCBheHAgICAgICA9IGYkZ2V0c3lpKCJIV19NT0RFTCIpLmdlLjEwMjQgLmFuZC4gZiRnZXRzeWkoIkhXX01PREVMIikubHQuNDA5NgorJCBpYTY0ICAgICA9IGYkZ2V0c3lpKCJIV19NT0RFTCIpLmdlLjQwOTYKKyQhCiskISAyMDEyLTAzLTA1IFNNUy4KKyQhIFdoeSBpcyB0aGlzIG5lZWRlZD8gIEFuZCBpZiBpdCBpcyBuZWVkZWQsIHdoeSBub3Qgc2ltcGx5ICIubm90LiB2YXgiPworJCEKKyQhISEgaWYgYXhwIC5vci4gaWE2NCB0aGVuICBzZXQgcHJvYy9wYXJzZT1leHRlbmRlZAorJCEKKyQgd2hvYW1pID0gZiRwYXJzZShmJGVudmlyb25tZW50KCJQcm9jZWR1cmUiKSwsLCwiTk9fQ09OQ0VBTCIpCiskIG15ZGVmICA9IEYkcGFyc2Uod2hvYW1pLCwsIkRFVklDRSIpCiskIG15ZGlyICA9IGYkcGFyc2Uod2hvYW1pLCwsIkRJUkVDVE9SWSIpIC0gIl1bIgorJCBteXByb2MgPSBmJHBhcnNlKHdob2FtaSwsLCJOYW1lIikgKyBmJHBhcnNlKHdob2FtaSwsLCJ0eXBlIikKKyQhCiskISBDaGVjayBmb3IgTU1LL01NUworJCEKKyQgaWYgKE1ha2UgLmVxcy4gIiIpCiskIHRoZW4KKyQgICBJZiBGJFNlYXJjaCAoIlN5cyRTeXN0ZW06TU1TLkVYRSIpIC5uZXMuICIiIFRoZW4gTWFrZSA9ICJNTVMiCiskICAgSWYgRiRUeXBlIChNTUspIC5lcXMuICJTVFJJTkciIFRoZW4gTWFrZSA9ICJNTUsiCiskIGVsc2UKKyQgICBNYWtlID0gZiRlZGl0KCBNYWtlLCAidHJpbSIpCiskIGVuZGlmCiskIQorJCBnb3N1YiBmaW5kX3ZlcnNpb24KKyQhCiskICBvcGVuL3dyaXRlIHRvcHQgdG1wLm9wdAorJCAgb3Blbi93cml0ZSBvcHRmICdvcHRmaWxlJworJCEKKyQgZ29zdWIgY2hlY2tfb3B0cworJCEKKyQhIExvb2sgZm9yIHRoZSBjb21waWxlciB1c2VkCiskIQorJCBnb3N1YiBjaGVja19jb21waWxlcgorJCBjbG9zZSB0b3B0CiskIGNsb3NlIG9wdGYKKyQhCiskIGlmIGl0c19kZWNjCiskIHRoZW4KKyQgICBjY29wdCA9ICIvcHJlZml4PWFsbCIgKyBjY29wdAorJCAgIGlmIGYkdHJubG5tKCJTWVMiKSAuZXFzLiAiIgorJCAgIHRoZW4KKyQgICAgIGlmIGF4cAorJCAgICAgdGhlbgorJCAgICAgICBkZWZpbmUgc3lzIHN5cyRsaWJyYXJ5OgorJCAgICAgZWxzZQorJCAgICAgICBjY29wdCA9ICIvZGVjYyIgKyBjY29wdAorJCAgICAgICBkZWZpbmUgc3lzIGRlY2MkbGlicmFyeV9pbmNsdWRlOgorJCAgICAgZW5kaWYKKyQgICBlbmRpZgorJCEKKyQhIDIwMTItMDMtMDUgU01TLgorJCEgV2h5IC9OQU1FUyA9IEFTX0lTPyAgV2h5IG5vdCBzaW1wbHkgIi5ub3QuIHZheCI/ICBBbmQgd2h5IG5vdCBvbiBWQVg/CiskIQorJCAgIGlmIGF4cCAub3IuIGlhNjQKKyQgICB0aGVuCiskICAgICAgIGNjb3B0ID0gY2NvcHQgKyAiL25hbWU9YXNfaXMvb3B0PShpbmxpbmU9c3BlZWQpIgorJCAgICAgICBzX2Nhc2UgPSB0cnVlCiskICAgZW5kaWYKKyQgZW5kaWYKKyQgaWYgaXRzX3ZheGMgLm9yLiBpdHNfZ251YworJCB0aGVuCiskICAgIGlmIGYkdHJubG5tKCJTWVMiKS5lcXMuIiIgdGhlbiBkZWZpbmUgc3lzIHN5cyRsaWJyYXJ5OgorJCBlbmRpZgorJCEKKyQhIEJ1aWxkIGEgZmFrZSBjb25maWd1cmUgaW5wdXQgaGVhZGVyCiskIQorJCBvcGVuL3dyaXRlIGNvbmZfaGluIGNvbmZpZy5oaW4KKyQgd3JpdGUgY29uZl9oaW4gIiN1bmRlZiBfTEFSR0VGSUxFNjRfU09VUkNFIgorJCBjbG9zZSBjb25mX2hpbgorJCEKKyQhCiskIGkgPSAwCiskRklORF9BQ09ORjoKKyQgZm5hbWUgPSBmJGVsZW1lbnQoaSwiIyIsYWNvbmZfaW5fZmlsZSkKKyQgaWYgZm5hbWUgLmVxcy4gIiMiIHRoZW4gZ290byBBTUlTU19FUlIKKyQgaWYgZiRzZWFyY2goZm5hbWUpIC5lcXMuICIiCiskIHRoZW4KKyQgICBpID0gaSArIDEKKyQgICBnb3RvIGZpbmRfYWNvbmYKKyQgZW5kaWYKKyQgb3Blbi9yZWFkL2Vycj1hY29uZl9lcnIgYWNvbmZfaW4gJ2ZuYW1lJworJCBvcGVuL3dyaXRlIGFjb25mIHpjb25mLmgKKyRBQ09ORl9MT09QOgorJCByZWFkL2VuZF9vZl9maWxlPWFjb25mX2V4aXQgYWNvbmZfaW4gbGluZQorJCB3b3JrID0gZiRlZGl0KGxpbmUsICJjb21wcmVzcyx0cmltIikKKyQgaWYgZiRleHRyYWN0KDAsNix3b3JrKSAubmVzLiAiI3VuZGVmIgorJCB0aGVuCiskICAgaWYgZiRleHRyYWN0KDAsMTIsd29yaykgLm5lcy4gIiNjbWFrZWRlZmluZSIKKyQgICB0aGVuCiskICAgICAgIHdyaXRlIGFjb25mIGxpbmUKKyQgICBlbmRpZgorJCBlbHNlCiskICAgY2RlZiA9IGYkZWxlbWVudCgxLCIgIix3b3JrKQorJCAgIGdvc3ViIGNoZWNrX2NvbmZpZworJCBlbmRpZgorJCBnb3RvIGFjb25mX2xvb3AKKyRBQ09ORl9FWElUOgorJCB3cml0ZSBhY29uZiAiIgorJCB3cml0ZSBhY29uZiAiLyogVk1TIHNwZWNpZmljcyBhZGRlZCBieSBtYWtlX3Ztcy5jb206ICovIgorJCB3cml0ZSBhY29uZiAiI2RlZmluZSBWTVMgMSIKKyQgd3JpdGUgYWNvbmYgIiNpbmNsdWRlIDx1bmlzdGQuaD4iCiskIHdyaXRlIGFjb25mICIjaW5jbHVkZSA8dW5peGlvLmg+IgorJCB3cml0ZSBhY29uZiAiI2lmZGVmIF9MQVJHRUZJTEUiCiskIHdyaXRlIGFjb25mICIjIGRlZmluZSBvZmY2NF90IF9fb2ZmNjRfdCIKKyQgd3JpdGUgYWNvbmYgIiMgZGVmaW5lIGZvcGVuNjQgZm9wZW4iCiskIHdyaXRlIGFjb25mICIjIGRlZmluZSBmc2Vla282NCBmc2Vla28iCiskIHdyaXRlIGFjb25mICIjIGRlZmluZSBsc2VlazY0IGxzZWVrIgorJCB3cml0ZSBhY29uZiAiIyBkZWZpbmUgZnRlbGxvNjQgZnRlbGwiCiskIHdyaXRlIGFjb25mICIjZW5kaWYiCiskIHdyaXRlIGFjb25mICIjaWYgIWRlZmluZWQoIF9fVkFYKSAmJiAoX19DUlRMX1ZFUiA+PSA3MDMxMjAwMCkiCiskIHdyaXRlIGFjb25mICIjIGRlZmluZSBIQVZFX1ZTTlBSSU5URiIKKyQgd3JpdGUgYWNvbmYgIiNlbmRpZiIKKyQgY2xvc2UgYWNvbmZfaW4KKyQgY2xvc2UgYWNvbmYKKyQgaWYgZiRzZWFyY2goIicndGgnIikgLm5lcy4gIiIgdGhlbiBkZWxldGUgJ3RoJzsqCiskISBCdWlsZCB0aGUgdGhpbmcgcGxhaW4gb3Igd2l0aCBtbXMKKyQhCiskIHdyaXRlIHN5cyRvdXRwdXQgIkNvbXBpbGluZyBabGliIHNvdXJjZXMgLi4uIgorJCBpZiBtYWtlLmVxcy4iIgorJCB0aGVuCiskICAgaWYgKGYkc2VhcmNoKCAiZXhhbXBsZS5vYmo7KiIpIC5uZXMuICIiKSB0aGVuIGRlbGV0ZSBleGFtcGxlLm9iajsqCiskICAgaWYgKGYkc2VhcmNoKCAibWluaWd6aXAub2JqOyoiKSAubmVzLiAiIikgdGhlbiBkZWxldGUgbWluaWd6aXAub2JqOyoKKyQgICBDQUxMIE1BS0UgYWRsZXIzMi5PQkogIkNDICcnQ0NPUFQnIGFkbGVyMzIiIC0KKyAgICAgICAgICAgICAgICBhZGxlcjMyLmMgemxpYi5oIHpjb25mLmgKKyQgICBDQUxMIE1BS0UgY29tcHJlc3MuT0JKICJDQyAnJ0NDT1BUJyBjb21wcmVzcyIgLQorICAgICAgICAgICAgICAgIGNvbXByZXNzLmMgemxpYi5oIHpjb25mLmgKKyQgICBDQUxMIE1BS0UgY3JjMzIuT0JKICJDQyAnJ0NDT1BUJyBjcmMzMiIgLQorICAgICAgICAgICAgICAgIGNyYzMyLmMgemxpYi5oIHpjb25mLmgKKyQgICBDQUxMIE1BS0UgZGVmbGF0ZS5PQkogIkNDICcnQ0NPUFQnIGRlZmxhdGUiIC0KKyAgICAgICAgICAgICAgICBkZWZsYXRlLmMgZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKKyQgICBDQUxMIE1BS0UgZ3pjbG9zZS5PQkogIkNDICcnQ0NPUFQnIGd6Y2xvc2UiIC0KKyAgICAgICAgICAgICAgICBnemNsb3NlLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAorJCAgIENBTEwgTUFLRSBnemxpYi5PQkogIkNDICcnQ0NPUFQnIGd6bGliIiAtCisgICAgICAgICAgICAgICAgZ3psaWIuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCiskICAgQ0FMTCBNQUtFIGd6cmVhZC5PQkogIkNDICcnQ0NPUFQnIGd6cmVhZCIgLQorICAgICAgICAgICAgICAgIGd6cmVhZC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKKyQgICBDQUxMIE1BS0UgZ3p3cml0ZS5PQkogIkNDICcnQ0NPUFQnIGd6d3JpdGUiIC0KKyAgICAgICAgICAgICAgICBnendyaXRlLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAorJCAgIENBTEwgTUFLRSBpbmZiYWNrLk9CSiAiQ0MgJydDQ09QVCcgaW5mYmFjayIgLQorICAgICAgICAgICAgICAgIGluZmJhY2suYyB6dXRpbC5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIGluZmZhc3QuaCBpbmZmaXhlZC5oCiskICAgQ0FMTCBNQUtFIGluZmZhc3QuT0JKICJDQyAnJ0NDT1BUJyBpbmZmYXN0IiAtCisgICAgICAgICAgICAgICAgaW5mZmFzdC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mZmFzdC5oCiskICAgQ0FMTCBNQUtFIGluZmxhdGUuT0JKICJDQyAnJ0NDT1BUJyBpbmZsYXRlIiAtCisgICAgICAgICAgICAgICAgaW5mbGF0ZS5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mYmxvY2suaAorJCAgIENBTEwgTUFLRSBpbmZ0cmVlcy5PQkogIkNDICcnQ0NPUFQnIGluZnRyZWVzIiAtCisgICAgICAgICAgICAgICAgaW5mdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKKyQgICBDQUxMIE1BS0UgdHJlZXMuT0JKICJDQyAnJ0NDT1BUJyB0cmVlcyIgLQorICAgICAgICAgICAgICAgIHRyZWVzLmMgZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKKyQgICBDQUxMIE1BS0UgdW5jb21wci5PQkogIkNDICcnQ0NPUFQnIHVuY29tcHIiIC0KKyAgICAgICAgICAgICAgICB1bmNvbXByLmMgemxpYi5oIHpjb25mLmgKKyQgICBDQUxMIE1BS0UgenV0aWwuT0JKICJDQyAnJ0NDT1BUJyB6dXRpbCIgLQorICAgICAgICAgICAgICAgIHp1dGlsLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAorJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkJ1aWxkaW5nIFpsaWIgLi4uIgorJCAgIENBTEwgTUFLRSBsaWJ6Lk9MQiAibGliL2NyZWEgbGliei5vbGIgKi5vYmoiICouT0JKCiskICAgd3JpdGUgc3lzJG91dHB1dCAiQnVpbGRpbmcgZXhhbXBsZS4uLiIKKyQgICBDQUxMIE1BS0UgZXhhbXBsZS5PQkogIkNDICcnQ0NPUFQnIFsudGVzdF1leGFtcGxlIiAtCisgICAgICAgICAgICAgICAgWy50ZXN0XWV4YW1wbGUuYyB6bGliLmggemNvbmYuaAorJCAgIGNhbGwgbWFrZSBleGFtcGxlLmV4ZSAiTElOSyBleGFtcGxlLGxpYnoub2xiL2xpYiIgZXhhbXBsZS5vYmogbGliei5vbGIKKyQgICB3cml0ZSBzeXMkb3V0cHV0ICJCdWlsZGluZyBtaW5pZ3ppcC4uLiIKKyQgICBDQUxMIE1BS0UgbWluaWd6aXAuT0JKICJDQyAnJ0NDT1BUJyBbLnRlc3RdbWluaWd6aXAiIC0KKyAgICAgICAgICAgICAgWy50ZXN0XW1pbmlnemlwLmMgemxpYi5oIHpjb25mLmgKKyQgICBjYWxsIG1ha2UgbWluaWd6aXAuZXhlIC0KKyAgICAgICAgICAgICAgIkxJTksgbWluaWd6aXAsbGliei5vbGIvbGliIiAtCisgICAgICAgICAgICAgIG1pbmlnemlwLm9iaiBsaWJ6Lm9sYgorJCBlbHNlCiskICAgZ29zdWIgY3JlYV9tbXMKKyQgICB3cml0ZSBzeXMkb3V0cHV0ICJNYWtlICcnbmFtZScgJyd2ZXJzaW9uJyB3aXRoICcnTWFrZScgIgorJCAgICdtYWtlJworJCBlbmRpZgorJCEKKyQhIENyZWF0ZSBzaGFyZWFibGUgaW1hZ2UKKyQhCiskIGdvc3ViIGNyZWFfb2xpc3QKKyQgd3JpdGUgc3lzJG91dHB1dCAiQ3JlYXRpbmcgbGlienNoci5leGUiCiskIGNhbGwgbWFwXzJfc2hvcHQgJ21hcGZpbGUnICdvcHRmaWxlJworJCBMSU5LXydsb3B0cycvU0hBUkU9bGlienNoci5leGUgbW9kdWxlcy5vcHQvb3B0LCdvcHRmaWxlJy9vcHQKKyQgd3JpdGUgc3lzJG91dHB1dCAiWmxpYiBidWlsZCBjb21wbGV0ZWQiCiskIGRlbGV0ZS9ub2xvZyB0bXAub3B0OyoKKyQgZXhpdAorJEFNSVNTX0VSUjoKKyQgd3JpdGUgc3lzJG91dHB1dCAiTm8gc291cmNlIGZvciBjb25maWcuaGluIGZvdW5kLiIKKyQgd3JpdGUgc3lzJG91dHB1dCAiVHJpZWQgYW55IG9mICcnYWNvbmZfaW5fZmlsZSciCiskIGdvdG8gZXJyX2V4aXQKKyRDQ19FUlI6CiskIHdyaXRlIHN5cyRvdXRwdXQgIkMgY29tcGlsZXIgcmVxdWlyZWQgdG8gYnVpbGQgJyduYW1lJyIKKyQgZ290byBlcnJfZXhpdAorJEVSUl9FWElUOgorJCBzZXQgbWVzc2FnZS9mYWNpbC9pZGVudC9zZXZlci90ZXh0CiskIGNsb3NlL25vbG9nIG9wdGYKKyQgY2xvc2Uvbm9sb2cgdG9wdAorJCBjbG9zZS9ub2xvZyBhY29uZl9pbgorJCBjbG9zZS9ub2xvZyBhY29uZgorJCBjbG9zZS9ub2xvZyBvdXQKKyQgY2xvc2Uvbm9sb2cgbWluCiskIGNsb3NlL25vbG9nIG1vZAorJCBjbG9zZS9ub2xvZyBoX2luCiskIHdyaXRlIHN5cyRvdXRwdXQgIkV4aXRpbmcuLi4iCiskIGV4aXQgMgorJCEKKyQhCiskTUFLRTogU1VCUk9VVElORSAgICFTVUJST1VUSU5FIFRPIENIRUNLIERFUEVOREVOQ0lFUworJCBWID0gJ0YkVmVyaWZ5KDApCiskISBQMSA9IFdoYXQgd2UgYXJlIHRyeWluZyB0byBtYWtlCiskISBQMiA9IENvbW1hbmQgdG8gbWFrZSBpdAorJCEgUDMgLSBQOCAgV2hhdCBpdCBkZXBlbmRzIG9uCiskCiskIElmIEYkU2VhcmNoKFAxKSAuRXFzLiAiIiBUaGVuIEdvdG8gTWFrZWl0CiskIFRpbWUgPSBGJEN2VGltZShGJEZpbGUoUDEsIlJEVCIpKQorJGFyZz0zCiskTG9vcDoKKyQgICAgICAgQXJndW1lbnQgPSBQJ2FyZworJCAgICAgICBJZiBBcmd1bWVudCAuRXFzLiAiIiBUaGVuIEdvdG8gRXhpdAorJCAgICAgICBFbD0wCiskTG9vcDI6CiskICAgICAgIEZpbGUgPSBGJEVsZW1lbnQoRWwsIiAiLEFyZ3VtZW50KQorJCAgICAgICBJZiBGaWxlIC5FcXMuICIgIiBUaGVuIEdvdG8gRW5kbAorJCAgICAgICBBRmlsZSA9ICIiCiskTG9vcDM6CiskICAgICAgIE9GaWxlID0gQUZpbGUKKyQgICAgICAgQUZpbGUgPSBGJFNlYXJjaChGaWxlKQorJCAgICAgICBJZiBBRmlsZSAuRXFzLiAiIiAuT3IuIEFGaWxlIC5FcXMuIE9GaWxlIFRoZW4gR290byBOZXh0RWwKKyQgICAgICAgSWYgRiRDdlRpbWUoRiRGaWxlKEFGaWxlLCJSRFQiKSkgLkdlcy4gVGltZSBUaGVuIEdvdG8gTWFrZWl0CiskICAgICAgIEdvdG8gTG9vcDMKKyROZXh0RUw6CiskICAgICAgIEVsID0gRWwgKyAxCiskICAgICAgIEdvdG8gTG9vcDIKKyRFbmRMOgorJCBhcmc9YXJnKzEKKyQgSWYgYXJnIC5MZS4gOCBUaGVuIEdvdG8gTG9vcAorJCBHb3RvIEV4aXQKKyQKKyRNYWtlaXQ6CiskIFZWPUYkVkVSSUZZKDApCiskIHdyaXRlIHN5cyRvdXRwdXQgUDIKKyQgJ1AyCiskIFZWPSdGJFZlcmlmeShWVikKKyRFeGl0OgorJCBJZiBWIFRoZW4gU2V0IFZlcmlmeQorJEVORFNVQlJPVVRJTkUKKyQhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIQorJCEgQ2hlY2sgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIHNldCBzeW1ib2xzIGFjY29yZGluZ2x5CiskIQorJCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQhIFZlcnNpb24gaGlzdG9yeQorJCEgMC4wMSAyMDA0MTIwNiBGaXJzdCB2ZXJzaW9uIHRvIHJlY2VpdmUgYSBudW1iZXIKKyQhIDAuMDIgMjAwNjAxMjYgQWRkIG5ldyAiSEVMUCIgdGFyZ2V0CiskIENIRUNLX09QVFM6CiskIGkgPSAxCiskIE9QVF9MT09QOgorJCBpZiBpIC5sdC4gOQorJCB0aGVuCiskICAgY3Bhcm0gPSBmJGVkaXQocCdpJywidXBjYXNlIikKKyQhCiskISBDaGVjayBpZiBwYXJhbWV0ZXIgYWN0dWFsbHkgY29udGFpbnMgc29tZXRoaW5nCiskIQorJCAgIGlmIGYkZWRpdChjcGFybSwidHJpbSIpIC5uZXMuICIiCiskICAgdGhlbgorJCAgICAgaWYgY3Bhcm0gLmVxcy4gIkRFQlVHIgorJCAgICAgdGhlbgorJCAgICAgICBjY29wdCA9IGNjb3B0ICsgIi9ub29wdC9kZWIiCiskICAgICAgIGxvcHRzID0gbG9wdHMgKyAiL2RlYiIKKyQgICAgIGVuZGlmCiskICAgICBpZiBmJGxvY2F0ZSgiQ0NPUFQ9IixjcGFybSkgLmx0LiBmJGxlbmd0aChjcGFybSkKKyQgICAgIHRoZW4KKyQgICAgICAgc3RhcnQgPSBmJGxvY2F0ZSgiPSIsY3Bhcm0pICsgMQorJCAgICAgICBsZW4gICA9IGYkbGVuZ3RoKGNwYXJtKSAtIHN0YXJ0CiskICAgICAgIGNjb3B0ID0gY2NvcHQgKyBmJGV4dHJhY3Qoc3RhcnQsbGVuLGNwYXJtKQorJCAgICAgICBpZiBmJGxvY2F0ZSgiQVNfSVMiLGYkZWRpdChjY29wdCwiVVBDQVNFIikpIC5sdC4gZiRsZW5ndGgoY2NvcHQpIC0KKyAgICAgICAgICB0aGVuIHNfY2FzZSA9IHRydWUKKyQgICAgIGVuZGlmCiskICAgICBpZiBjcGFybSAuZXFzLiAiTElOSyIgdGhlbiBsaW5rb25seSA9IHRydWUKKyQgICAgIGlmIGYkbG9jYXRlKCJMT1BUUz0iLGNwYXJtKSAubHQuIGYkbGVuZ3RoKGNwYXJtKQorJCAgICAgdGhlbgorJCAgICAgICBzdGFydCA9IGYkbG9jYXRlKCI9IixjcGFybSkgKyAxCiskICAgICAgIGxlbiAgID0gZiRsZW5ndGgoY3Bhcm0pIC0gc3RhcnQKKyQgICAgICAgbG9wdHMgPSBsb3B0cyArIGYkZXh0cmFjdChzdGFydCxsZW4sY3Bhcm0pCiskICAgICBlbmRpZgorJCAgICAgaWYgZiRsb2NhdGUoIkNDPSIsY3Bhcm0pIC5sdC4gZiRsZW5ndGgoY3Bhcm0pCiskICAgICB0aGVuCiskICAgICAgIHN0YXJ0ICA9IGYkbG9jYXRlKCI9IixjcGFybSkgKyAxCiskICAgICAgIGxlbiAgICA9IGYkbGVuZ3RoKGNwYXJtKSAtIHN0YXJ0CiskICAgICAgIGNjX2NvbSA9IGYkZXh0cmFjdChzdGFydCxsZW4sY3Bhcm0pCisgICAgICAgIGlmIChjY19jb20gLm5lcy4gIkRFQ0MiKSAuYW5kLiAtCisgICAgICAgICAgIChjY19jb20gLm5lcy4gIlZBWEMiKSAuYW5kLiAtCisgICAgICAgICAgIChjY19jb20gLm5lcy4gIkdOVUMiKQorJCAgICAgICB0aGVuCiskICAgICAgICAgd3JpdGUgc3lzJG91dHB1dCAiVW5zdXBwb3J0ZWQgY29tcGlsZXIgY2hvaWNlICcnY2NfY29tJyBpZ25vcmVkIgorJCAgICAgICAgIHdyaXRlIHN5cyRvdXRwdXQgIlVzZSBERUNDLCBWQVhDLCBvciBHTlVDIGluc3RlYWQiCiskICAgICAgIGVsc2UKKyQgICAgICAgICBpZiBjY19jb20gLmVxcy4gIkRFQ0MiIHRoZW4gaXRzX2RlY2MgPSB0cnVlCiskICAgICAgICAgaWYgY2NfY29tIC5lcXMuICJWQVhDIiB0aGVuIGl0c192YXhjID0gdHJ1ZQorJCAgICAgICAgIGlmIGNjX2NvbSAuZXFzLiAiR05VQyIgdGhlbiBpdHNfZ251YyA9IHRydWUKKyQgICAgICAgZW5kaWYKKyQgICAgIGVuZGlmCiskICAgICBpZiBmJGxvY2F0ZSgiTUFLRT0iLGNwYXJtKSAubHQuIGYkbGVuZ3RoKGNwYXJtKQorJCAgICAgdGhlbgorJCAgICAgICBzdGFydCAgPSBmJGxvY2F0ZSgiPSIsY3Bhcm0pICsgMQorJCAgICAgICBsZW4gICAgPSBmJGxlbmd0aChjcGFybSkgLSBzdGFydAorJCAgICAgICBtbWtzID0gZiRleHRyYWN0KHN0YXJ0LGxlbixjcGFybSkKKyQgICAgICAgaWYgKG1ta3MgLmVxcy4gIk1NSyIpIC5vci4gKG1ta3MgLmVxcy4gIk1NUyIpCiskICAgICAgIHRoZW4KKyQgICAgICAgICBtYWtlID0gbW1rcworJCAgICAgICBlbHNlCiskICAgICAgICAgd3JpdGUgc3lzJG91dHB1dCAiVW5zdXBwb3J0ZWQgbWFrZSBjaG9pY2UgJydtbWtzJyBpZ25vcmVkIgorJCAgICAgICAgIHdyaXRlIHN5cyRvdXRwdXQgIlVzZSBNTUsgb3IgTU1TIGluc3RlYWQiCiskICAgICAgIGVuZGlmCiskICAgICBlbmRpZgorJCAgICAgaWYgY3Bhcm0gLmVxcy4gIkhFTFAiIHRoZW4gZ29zdWIgYmhlbHAKKyQgICBlbmRpZgorJCAgIGkgPSBpICsgMQorJCAgIGdvdG8gb3B0X2xvb3AKKyQgZW5kaWYKKyQgcmV0dXJuCiskIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCEKKyQhIExvb2sgZm9yIHRoZSBjb21waWxlciB1c2VkCiskIQorJCEgVmVyc2lvbiBoaXN0b3J5CiskISAwLjAxIDIwMDQwMjIzIEZpcnN0IHZlcnNpb24gdG8gcmVjZWl2ZSBhIG51bWJlcgorJCEgMC4wMiAyMDA0MDIyOSBTYXZlL3NldCB2YWx1ZSBvZiBkZWNjJG5vX3Jvb3RlZF9zZWFyY2hfbGlzdHMKKyQhIDAuMDMgMjAwNjAyMDIgRXh0ZW5kIGhhbmRsaW5nIG9mIEdOVSBDCiskISAwLjA0IDIwMDkwNDAyIENvbXBhcSAtPiBocAorJENIRUNLX0NPTVBJTEVSOgorJCBpZiAoLm5vdC4gKGl0c19kZWNjIC5vci4gaXRzX3ZheGMgLm9yLiBpdHNfZ251YykpCiskIHRoZW4KKyQgICBpdHNfZGVjYyA9IChmJHNlYXJjaCgiU1lTJFNZU1RFTTpERUNDJENPTVBJTEVSLkVYRSIpIC5uZXMuICIiKQorJCAgIGl0c192YXhjID0gLm5vdC4gaXRzX2RlY2MgLmFuZC4gKEYkU2VhcmNoKCJTWVMkU3lzdGVtOlZBWEMuRXhlIikgLm5lcy4gIiIpCiskICAgaXRzX2dudWMgPSAubm90LiAoaXRzX2RlY2MgLm9yLiBpdHNfdmF4YykgLmFuZC4gKGYkdHJubG5tKCJnbnVfY2MiKSAubmVzLiAiIikKKyQgZW5kaWYKKyQhCiskISBFeGl0IGlmIG5vIGNvbXBpbGVyIGF2YWlsYWJsZQorJCEKKyQgaWYgKC5ub3QuIChpdHNfZGVjYyAub3IuIGl0c192YXhjIC5vci4gaXRzX2dudWMpKQorJCB0aGVuIGdvdG8gQ0NfRVJSCiskIGVsc2UKKyQgICBpZiBpdHNfZGVjYworJCAgIHRoZW4KKyQgICAgIHdyaXRlIHN5cyRvdXRwdXQgIkNDIGNvbXBpbGVyIGNoZWNrIC4uLiBocCBDIgorJCAgICAgaWYgZiR0cm5sbm0oImRlY2Mkbm9fcm9vdGVkX3NlYXJjaF9saXN0cyIpIC5uZXMuICIiCiskICAgICB0aGVuCiskICAgICAgIGRucnNsID0gZiR0cm5sbm0oImRlY2Mkbm9fcm9vdGVkX3NlYXJjaF9saXN0cyIpCiskICAgICBlbmRpZgorJCAgICAgZGVmaW5lL25vbG9nIGRlY2Mkbm9fcm9vdGVkX3NlYXJjaF9saXN0cyAxCiskICAgZWxzZQorJCAgICAgaWYgaXRzX3ZheGMgdGhlbiB3cml0ZSBzeXMkb3V0cHV0ICJDQyBjb21waWxlciBjaGVjayAuLi4gVkFYIEMiCiskICAgICBpZiBpdHNfZ251YworJCAgICAgdGhlbgorJCAgICAgICAgIHdyaXRlIHN5cyRvdXRwdXQgIkNDIGNvbXBpbGVyIGNoZWNrIC4uLiBHTlUgQyIKKyQgICAgICAgICBpZiBmJHRybmxubSh0b3B0KSB0aGVuIHdyaXRlIHRvcHQgImdudV9jYzpbMDAwMDAwXWdjY2xpYi5vbGIvbGliIgorJCAgICAgICAgIGlmIGYkdHJubG5tKG9wdGYpIHRoZW4gd3JpdGUgb3B0ZiAiZ251X2NjOlswMDAwMDBdZ2NjbGliLm9sYi9saWIiCiskICAgICAgICAgY2MgPSAiZ2NjIgorJCAgICAgZW5kaWYKKyQgICAgIGlmIGYkdHJubG5tKHRvcHQpIHRoZW4gd3JpdGUgdG9wdCAic3lzJHNoYXJlOnZheGNydGwuZXhlL3NoYXJlIgorJCAgICAgaWYgZiR0cm5sbm0ob3B0ZikgdGhlbiB3cml0ZSBvcHRmICJzeXMkc2hhcmU6dmF4Y3J0bC5leGUvc2hhcmUiCiskICAgZW5kaWYKKyQgZW5kaWYKKyQgcmV0dXJuCiskIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCEKKyQhIElmIE1NUy9NTUsgYXJlIGF2YWlsYWJsZSBkdW1wIG91dCB0aGUgZGVzY3JpcC5tbXMgaWYgcmVxdWlyZWQKKyQhCiskQ1JFQV9NTVM6CiskIHdyaXRlIHN5cyRvdXRwdXQgIkNyZWF0aW5nIGRlc2NyaXAubW1zLi4uIgorJCBjcmVhdGUgZGVzY3JpcC5tbXMKKyQgb3Blbi9hcHBlbmQgb3V0IGRlc2NyaXAubW1zCiskIGNvcHkgc3lzJGlucHV0OiBvdXQKKyQgZGVjaworIyBkZXNjcmlwLm1tczogTU1TIGRlc2NyaXB0aW9uIGZpbGUgZm9yIGJ1aWxkaW5nIHpsaWIgb24gVk1TCisjIHdyaXR0ZW4gYnkgTWFydGluIFAuSi4gWmluc2VyCisjIDx6aW5zZXJAemluc2VyLm5vLWlwLmluZm8gb3IgbWFydGluLnppbnNlckBldXJleGNoYW5nZS5jb20+CisKK09CSlMgPSBhZGxlcjMyLm9iaiwgY29tcHJlc3Mub2JqLCBjcmMzMi5vYmosIGd6Y2xvc2Uub2JqLCBnemxpYi5vYmpcCisgICAgICAgZ3pyZWFkLm9iaiwgZ3p3cml0ZS5vYmosIHVuY29tcHIub2JqLCBpbmZiYWNrLm9ialwKKyAgICAgICBkZWZsYXRlLm9iaiwgdHJlZXMub2JqLCB6dXRpbC5vYmosIGluZmxhdGUub2JqLCBcCisgICAgICAgaW5mdHJlZXMub2JqLCBpbmZmYXN0Lm9iagorCiskIGVvZAorJCB3cml0ZSBvdXQgIkNGTEFHUz0iLCBjY29wdAorJCB3cml0ZSBvdXQgIkxPUFRTPSIsIGxvcHRzCiskIHdyaXRlIG91dCAiYWxsIDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlIGxpYnoub2xiIgorJCBjb3B5IHN5cyRpbnB1dDogb3V0CiskIGRlY2sKKyAgICAgICAgQCB3cml0ZSBzeXMkb3V0cHV0ICIgRXhhbXBsZSBhcHBsaWNhdGlvbnMgYXZhaWxhYmxlIgorCitsaWJ6Lm9sYiA6IGxpYnoub2xiKCQoT0JKUykpCisJQCB3cml0ZSBzeXMkb3V0cHV0ICIgbGlieiBhdmFpbGFibGUiCisKK2V4YW1wbGUuZXhlIDogZXhhbXBsZS5vYmogbGliei5vbGIKKyAgICAgICAgICAgICAgbGluayAkKExPUFRTKSBleGFtcGxlLGxpYnoub2xiL2xpYgorCittaW5pZ3ppcC5leGUgOiBtaW5pZ3ppcC5vYmogbGliei5vbGIKKyAgICAgICAgICAgICAgbGluayAkKExPUFRTKSBtaW5pZ3ppcCxsaWJ6Lm9sYi9saWIKKworY2xlYW4gOgorCWRlbGV0ZSAqLm9iajsqLGxpYnoub2xiOyosKi5vcHQ7KiwqLmV4ZTsqCisKKworIyBPdGhlciBkZXBlbmRlbmNpZXMuCithZGxlcjMyLm9iaiAgOiBhZGxlcjMyLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAorY29tcHJlc3Mub2JqIDogY29tcHJlc3MuYyB6bGliLmggemNvbmYuaAorY3JjMzIub2JqICAgIDogY3JjMzIuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitkZWZsYXRlLm9iaiAgOiBkZWZsYXRlLmMgZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKK2V4YW1wbGUub2JqICA6IFsudGVzdF1leGFtcGxlLmMgemxpYi5oIHpjb25mLmgKK2d6Y2xvc2Uub2JqICA6IGd6Y2xvc2UuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitnemxpYi5vYmogICAgOiBnemxpYi5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKK2d6cmVhZC5vYmogICA6IGd6cmVhZC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKK2d6d3JpdGUub2JqICA6IGd6d3JpdGUuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitpbmZmYXN0Lm9iaiAgOiBpbmZmYXN0LmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmZhc3QuaAoraW5mbGF0ZS5vYmogIDogaW5mbGF0ZS5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKK2luZnRyZWVzLm9iaiA6IGluZnRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCittaW5pZ3ppcC5vYmogOiBbLnRlc3RdbWluaWd6aXAuYyB6bGliLmggemNvbmYuaAordHJlZXMub2JqICAgIDogdHJlZXMuYyBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAordW5jb21wci5vYmogIDogdW5jb21wci5jIHpsaWIuaCB6Y29uZi5oCit6dXRpbC5vYmogICAgOiB6dXRpbC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKK2luZmJhY2sub2JqICA6IGluZmJhY2suYyB6dXRpbC5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIGluZmZhc3QuaCBpbmZmaXhlZC5oCiskIGVvZAorJCBjbG9zZSBvdXQKKyQgcmV0dXJuCiskIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCEKKyQhIFJlYWQgbGlzdCBvZiBjb3JlIGxpYnJhcnkgc291cmNlcyBmcm9tIG1ha2VmaWxlLmluIGFuZCBjcmVhdGUgb3B0aW9ucworJCEgbmVlZGVkIHRvIGJ1aWxkIHNoYXJlYWJsZSBpbWFnZQorJCEKKyRDUkVBX09MSVNUOgorJCBvcGVuL3JlYWQgbWluIG1ha2VmaWxlLmluCiskIG9wZW4vd3JpdGUgbW9kIG1vZHVsZXMub3B0CiskIHNyY19jaGVja19saXN0ID0gIk9CSlogPSNPQkpHID0iCiskTVJMT09QOgorJCByZWFkL2VuZD1tcmRvbmUgbWluIHJlYworJCBpID0gMAorJFNSQ19DSEVDS19MT09QOgorJCBzcmNfY2hlY2sgPSBmJGVsZW1lbnQoaSwgIiMiLCBzcmNfY2hlY2tfbGlzdCkKKyQgaSA9IGkrMQorJCBpZiBzcmNfY2hlY2sgLmVxcy4gIiMiIHRoZW4gZ290byBtcmxvb3AKKyQgaWYgKGYkZXh0cmFjdCgwLDYscmVjKSAubmVzLiBzcmNfY2hlY2spIHRoZW4gZ290byBzcmNfY2hlY2tfbG9vcAorJCByZWMgPSByZWMgLSBzcmNfY2hlY2sKKyQgZ29zdWIgZXh0cmFfZmlsbmFtCiskIGlmIChmJGVsZW1lbnQoMSwiXCIscmVjKSAuZXFzLiAiXCIpIHRoZW4gZ290byBtcmxvb3AKKyRNUlNMT09QOgorJCByZWFkL2VuZD1tcmRvbmUgbWluIHJlYworJCBnb3N1YiBleHRyYV9maWxuYW0KKyQgaWYgKGYkZWxlbWVudCgxLCJcIixyZWMpIC5uZXMuICJcIikgdGhlbiBnb3RvIG1yc2xvb3AKKyRNUkRPTkU6CiskIGNsb3NlIG1pbgorJCBjbG9zZSBtb2QKKyQgcmV0dXJuCiskIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCEKKyQhIFRha2UgcmVjb3JkIGV4dHJhY3RlZCBpbiBjcmVhX29saXN0IGFuZCBzcGxpdCBpdCBpbnRvIHNpbmdsZSBmaWxlbmFtZXMKKyQhCiskRVhUUkFfRklMTkFNOgorJCBteXJlYyA9IGYkZWRpdChyZWMgLSAiXCIsICJ0cmltLGNvbXByZXNzIikKKyQgaSA9IDAKKyRGRUxPT1A6CiskIHNyY2ZpbCA9IGYkZWxlbWVudChpLCIgIiwgbXlyZWMpCiskIGlmIChzcmNmaWwgLm5lcy4gIiAiKQorJCB0aGVuCiskICAgd3JpdGUgbW9kIGYkcGFyc2Uoc3JjZmlsLCwsIk5BTUUiKSwgIi5vYmoiCiskICAgaSA9IGkgKyAxCiskICAgZ290byBmZWxvb3AKKyQgZW5kaWYKKyQgcmV0dXJuCiskIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCEKKyQhIEZpbmQgY3VycmVudCBabGliIHZlcnNpb24gbnVtYmVyCiskIQorJEZJTkRfVkVSU0lPTjoKKyQgb3Blbi9yZWFkIGhfaW4gJ3ZfZmlsZScKKyRobG9vcDoKKyQgcmVhZC9lbmQ9aGRvbmUgaF9pbiByZWMKKyQgcmVjID0gZiRlZGl0KHJlYywiVFJJTSIpCiskIGlmIChmJGV4dHJhY3QoMCwxLHJlYykgLm5lcy4gIiMiKSB0aGVuIGdvdG8gaGxvb3AKKyQgcmVjID0gZiRlZGl0KHJlYyAtICIjIiwgIlRSSU0iKQorJCBpZiBmJGVsZW1lbnQoMCwiICIscmVjKSAubmVzLiAiZGVmaW5lIiB0aGVuIGdvdG8gaGxvb3AKKyQgaWYgZiRlbGVtZW50KDEsIiAiLHJlYykgLmVxcy4gdl9zdHJpbmcKKyQgdGhlbgorJCAgIHZlcnNpb24gPSAnZiRlbGVtZW50KDIsIiAiLHJlYyknCiskICAgZ290byBoZG9uZQorJCBlbmRpZgorJCBnb3RvIGhsb29wCiskaGRvbmU6CiskIGNsb3NlIGhfaW4KKyQgcmV0dXJuCiskIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCEKKyRDSEVDS19DT05GSUc6CiskIQorJCBpbl9sZGVmID0gZiRsb2NhdGUoY2RlZixsaWJkZWZzKQorJCBpZiAoaW5fbGRlZiAubHQuIGYkbGVuZ3RoKGxpYmRlZnMpKQorJCB0aGVuCiskICAgd3JpdGUgYWNvbmYgIiNkZWZpbmUgJydjZGVmJyAxIgorJCAgIGxpYmRlZnMgPSBmJGV4dHJhY3QoMCxpbl9sZGVmLGxpYmRlZnMpICsgLQorICAgICAgICAgICAgICBmJGV4dHJhY3QoaW5fbGRlZiArIGYkbGVuZ3RoKGNkZWYpICsgMSwgLQorICAgICAgICAgICAgICAgICAgICAgICAgZiRsZW5ndGgobGliZGVmcykgLSBpbl9sZGVmIC0gZiRsZW5ndGgoY2RlZikgLSAxLCAtCisgICAgICAgICAgICAgICAgICAgICAgICBsaWJkZWZzKQorJCBlbHNlCiskICAgaWYgKGYkdHlwZSgnY2RlZicpIC5lcXMuICJJTlRFR0VSIikKKyQgICB0aGVuCiskICAgICB3cml0ZSBhY29uZiAiI2RlZmluZSAnJ2NkZWYnICIsICdjZGVmJworJCAgIGVsc2UKKyQgICAgIGlmIChmJHR5cGUoJ2NkZWYnKSAuZXFzLiAiU1RSSU5HIikKKyQgICAgIHRoZW4KKyQgICAgICAgd3JpdGUgYWNvbmYgIiNkZWZpbmUgJydjZGVmJyAiLCAiIiIiLCAnJydjZGVmJycsICIiIiIKKyQgICAgIGVsc2UKKyQgICAgICAgZ29zdWIgY2hlY2tfY2NfZGVmCiskICAgICBlbmRpZgorJCAgIGVuZGlmCiskIGVuZGlmCiskIHJldHVybgorJCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQhCiskISBDaGVjayBpZiB0aGlzIGlzIGEgZGVmaW5lIHJlbGF0aW5nIHRvIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBDL0MrKworJCEgY29tcGlsZXIKKyQhCiskIENIRUNLX0NDX0RFRjoKKyQgaWYgKGNkZWYgLmVxcy4gIl9MQVJHRUZJTEU2NF9TT1VSQ0UiKQorJCB0aGVuCiskICAgY29weSBzeXMkaW5wdXQ6ICd0YycKKyQgICBkZWNrCisjaW5jbHVkZSAidGNvbmZpZyIKKyNkZWZpbmUgX0xBUkdFRklMRQorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCBtYWluKCl7CitGSUxFICpmcDsKKyAgZnAgPSBmb3BlbigidGVtcC50eHQiLCJyIik7CisgIGZzZWVrbyhmcCwxLFNFRUtfU0VUKTsKKyAgZmNsb3NlKGZwKTsKK30KKworJCAgIGVvZAorJCAgIHRlc3RfaW52ID0gZmFsc2UKKyQgICBjb21tX2ggPSBmYWxzZQorJCAgIGdvc3ViIGNjX3Byb3BfY2hlY2sKKyQgICByZXR1cm4KKyQgZW5kaWYKKyQgd3JpdGUgYWNvbmYgIi8qICIsIGxpbmUsICIgKi8iCiskIHJldHVybgorJCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQhCiskISBDaGVjayBmb3IgcHJvcGVydGllcyBvZiBDL0MrKyBjb21waWxlcgorJCEKKyQhIFZlcnNpb24gaGlzdG9yeQorJCEgMC4wMSAyMDAzMTAyMCBGaXJzdCB2ZXJzaW9uIHRvIHJlY2VpdmUgYSBudW1iZXIKKyQhIDAuMDIgMjAwMzEwMjIgQWRkZWQgbG9naWMgZm9yIGRlZmluZXMgd2l0aCB2YWx1ZQorJCEgMC4wMyAyMDA0MDMwOSBNYWtlIHN1cmUgbG9jYWwgY29uZmlnIGZpbGUgZ2V0cyBub3QgZGVsZXRlZAorJCEgMC4wNCAyMDA0MTIzMCBBbHNvIHdyaXRlIGluY2x1ZGUgZm9yIGNvbmZpZ3VyZSBydW4KKyQhIDAuMDUgMjAwNTAxMDMgQWRkIHByb2Nlc3Npbmcgb2YgImNvbW1lbnQgZGVmaW5lcyIKKyRDQ19QUk9QX0NIRUNLOgorJCBjY19wcm9wID0gdHJ1ZQorJCBpc19uZWVkID0gZmFsc2UKKyQgaXNfbmVlZCA9IChmJGV4dHJhY3QoMCw0LGNkZWYpIC5lcXMuICJORUVEIikgLm9yLiAodGVzdF9pbnYgLmVxLiB0cnVlKQorJCBpZiBmJHNlYXJjaCh0aCkgLmVxcy4gIiIgdGhlbiBjcmVhdGUgJ3RoJworJCBzZXQgbWVzc2FnZS9ub2ZhYy9ub2lkZW50L25vc2V2ZXIvbm90ZXh0CiskIG9uIGVycm9yIHRoZW4gY29udGludWUKKyQgY2MgJ3RtcG5hbScKKyQgaWYgLm5vdC4gKCRzdGF0dXMpICB0aGVuIGNjX3Byb3AgPSBmYWxzZQorJCBvbiBlcnJvciB0aGVuIGNvbnRpbnVlCiskISBUaGUgaGVhZGVycyBtaWdodCBsaWUgYWJvdXQgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgUlRMCiskIGxpbmsgJ3RtcG5hbScsdG1wLm9wdC9vcHQKKyQgaWYgLm5vdC4gKCRzdGF0dXMpICB0aGVuIGNjX3Byb3AgPSBmYWxzZQorJCBzZXQgbWVzc2FnZS9mYWMvaWRlbnQvc2V2ZXIvdGV4dAorJCBvbiBlcnJvciB0aGVuIGdvdG8gZXJyX2V4aXQKKyQgZGVsZXRlL25vbG9nICd0bXBuYW0nLio7Ki9leGNsdWRlPSd0aCcKKyQgaWYgKGNjX3Byb3AgLmFuZC4gLm5vdC4gaXNfbmVlZCkgLm9yLiAtCisgICAgICgubm90LiBjY19wcm9wIC5hbmQuIGlzX25lZWQpCiskIHRoZW4KKyQgICB3cml0ZSBzeXMkb3V0cHV0ICJDaGVja2luZyBmb3IgJydjZGVmJy4uLiB5ZXMiCiskICAgaWYgZiR0eXBlKCdjZGVmX3ZhbCdfeWVzKSAubmVzLiAiIgorJCAgIHRoZW4KKyQgICAgIGlmIGYkdHlwZSgnY2RlZl92YWwnX3llcykgLmVxcy4gIklOVEVHRVIiIC0KKyAgICAgICAgIHRoZW4gY2FsbCB3cml0ZV9jb25maWcgZiRmYW8oIiNkZWZpbmUgIUFTICFVTCIsY2RlZiwnY2RlZl92YWwnX3llcykKKyQgICAgIGlmIGYkdHlwZSgnY2RlZl92YWwnX3llcykgLmVxcy4gIlNUUklORyIgLQorICAgICAgICAgdGhlbiBjYWxsIHdyaXRlX2NvbmZpZyBmJGZhbygiI2RlZmluZSAhQVMgIUFTIixjZGVmLCdjZGVmX3ZhbCdfeWVzKQorJCAgIGVsc2UKKyQgICAgIGNhbGwgd3JpdGVfY29uZmlnIGYkZmFvKCIjZGVmaW5lICFBUyAxIixjZGVmKQorJCAgIGVuZGlmCiskICAgaWYgKGNkZWYgLmVxcy4gIkhBVkVfRlNFRUtPIikgLm9yLiAoY2RlZiAuZXFzLiAiX0xBUkdFX0ZJTEVTIikgLm9yLiAtCisgICAgICAgKGNkZWYgLmVxcy4gIl9MQVJHRUZJTEU2NF9TT1VSQ0UiKSB0aGVuIC0KKyAgICAgIGNhbGwgd3JpdGVfY29uZmlnIGYkc3RyaW5nKCIjZGVmaW5lIF9MQVJHRUZJTEUgMSIpCiskIGVsc2UKKyQgICB3cml0ZSBzeXMkb3V0cHV0ICJDaGVja2luZyBmb3IgJydjZGVmJy4uLiBubyIKKyQgICBpZiAoY29tbV9oKQorJCAgIHRoZW4KKyAgICAgIGNhbGwgd3JpdGVfY29uZmlnIGYkZmFvKCIvKiAhQVMgKi8iLGxpbmUpCiskICAgZWxzZQorJCAgICAgaWYgZiR0eXBlKCdjZGVmX3ZhbCdfbm8pIC5uZXMuICIiCiskICAgICB0aGVuCiskICAgICAgIGlmIGYkdHlwZSgnY2RlZl92YWwnX25vKSAuZXFzLiAiSU5URUdFUiIgLQorICAgICAgICAgICB0aGVuIGNhbGwgd3JpdGVfY29uZmlnIGYkZmFvKCIjZGVmaW5lICFBUyAhVUwiLGNkZWYsJ2NkZWZfdmFsJ19ubykKKyQgICAgICAgaWYgZiR0eXBlKCdjZGVmX3ZhbCdfbm8pIC5lcXMuICJTVFJJTkciIC0KKyAgICAgICAgICAgdGhlbiBjYWxsIHdyaXRlX2NvbmZpZyBmJGZhbygiI2RlZmluZSAhQVMgIUFTIixjZGVmLCdjZGVmX3ZhbCdfbm8pCiskICAgICBlbHNlCiskICAgICAgIGNhbGwgd3JpdGVfY29uZmlnIGYkZmFvKCIjdW5kZWYgIUFTIixjZGVmKQorJCAgICAgZW5kaWYKKyQgICBlbmRpZgorJCBlbmRpZgorJCByZXR1cm4KKyQhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIQorJCEgQ2hlY2sgZm9yIHByb3BlcnRpZXMgb2YgQy9DKysgY29tcGlsZXIgd2l0aCBtdWx0aXBsZSByZXN1bHQgdmFsdWVzCiskIQorJCEgVmVyc2lvbiBoaXN0b3J5CiskISAwLjAxIDIwMDQwMTI3IEZpcnN0IHZlcnNpb24KKyQhIDAuMDIgMjAwNTAxMDMgUmVjb25jaWxlIGNoYW5nZXMgZnJvbSBjY19wcm9wIHVwIHRvIHZlcnNpb24gMC4wNQorJENDX01QUk9QX0NIRUNLOgorJCBjY19wcm9wID0gdHJ1ZQorJCBpICAgID0gMQorJCBpZGVsID0gMQorJCBNVF9MT09QOgorJCBpZiBmJHR5cGUocmVzdWx0XydpJykgLmVxcy4gIlNUUklORyIKKyQgdGhlbgorJCAgIHNldCBtZXNzYWdlL25vZmFjL25vaWRlbnQvbm9zZXZlci9ub3RleHQKKyQgICBvbiBlcnJvciB0aGVuIGNvbnRpbnVlCiskICAgY2MgJ3RtcG5hbSdfJ2knCiskICAgaWYgLm5vdC4gKCRzdGF0dXMpICB0aGVuIGNjX3Byb3AgPSBmYWxzZQorJCAgIG9uIGVycm9yIHRoZW4gY29udGludWUKKyQhIFRoZSBoZWFkZXJzIG1pZ2h0IGxpZSBhYm91dCB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBSVEwKKyQgICBsaW5rICd0bXBuYW0nXydpJyx0bXAub3B0L29wdAorJCAgIGlmIC5ub3QuICgkc3RhdHVzKSAgdGhlbiBjY19wcm9wID0gZmFsc2UKKyQgICBzZXQgbWVzc2FnZS9mYWMvaWRlbnQvc2V2ZXIvdGV4dAorJCAgIG9uIGVycm9yIHRoZW4gZ290byBlcnJfZXhpdAorJCAgIGRlbGV0ZS9ub2xvZyAndG1wbmFtJ18naScuKjsqCiskICAgaWYgKGNjX3Byb3ApCiskICAgdGhlbgorJCAgICAgd3JpdGUgc3lzJG91dHB1dCAiQ2hlY2tpbmcgZm9yICcnY2RlZicuLi4gIiwgbWRlZl8naScKKyQgICAgIGlmIGYkdHlwZShtZGVmXydpJykgLmVxcy4gIklOVEVHRVIiIC0KKyAgICAgICAgIHRoZW4gY2FsbCB3cml0ZV9jb25maWcgZiRmYW8oIiNkZWZpbmUgIUFTICFVTCIsY2RlZixtZGVmXydpJykKKyQgICAgIGlmIGYkdHlwZSgnY2RlZl92YWwnX3llcykgLmVxcy4gIlNUUklORyIgLQorICAgICAgICAgdGhlbiBjYWxsIHdyaXRlX2NvbmZpZyBmJGZhbygiI2RlZmluZSAhQVMgIUFTIixjZGVmLG1kZWZfJ2knKQorJCAgICAgZ290byBtc3ltX2NsZWFuCiskICAgZWxzZQorJCAgICAgaSA9IGkgKyAxCiskICAgICBnb3RvIG10X2xvb3AKKyQgICBlbmRpZgorJCBlbmRpZgorJCB3cml0ZSBzeXMkb3V0cHV0ICJDaGVja2luZyBmb3IgJydjZGVmJy4uLiBubyIKKyQgY2FsbCB3cml0ZV9jb25maWcgZiRmYW8oIiN1bmRlZiAhQVMiLGNkZWYpCiskIE1TWU1fQ0xFQU46CiskIGlmIChpZGVsIC5sZS4gbXN5bV9tYXgpCiskIHRoZW4KKyQgICBkZWxldGUvc3ltIG1kZWZfJ2lkZWwnCiskICAgaWRlbCA9IGlkZWwgKyAxCiskICAgZ290byBtc3ltX2NsZWFuCiskIGVuZGlmCiskIHJldHVybgorJCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQhCiskISBXcml0ZSBjb25maWd1cmF0aW9uIHRvIGJvdGggcGVybWFuZW50IGFuZCB0ZW1wb3JhcnkgY29uZmlnIGZpbGUKKyQhCiskISBWZXJzaW9uIGhpc3RvcnkKKyQhIDAuMDEgMjAwMzEwMjkgRmlyc3QgdmVyc2lvbiB0byByZWNlaXZlIGEgbnVtYmVyCiskIQorJFdSSVRFX0NPTkZJRzogU1VCUk9VVElORQorJCAgd3JpdGUgYWNvbmYgJ3AxJworJCAgb3Blbi9hcHBlbmQgY29uZmggJ3RoJworJCAgd3JpdGUgY29uZmggJ3AxJworJCAgY2xvc2UgY29uZmgKKyRFTkRTVUJST1VUSU5FCiskIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCEKKyQhIEFuYWx5emUgdGhlIHByb2plY3QgbWFwIGZpbGUgYW5kIGNyZWF0ZSB0aGUgc3ltYm9sIHZlY3RvciBmb3IgYSBzaGFyZWFibGUKKyQhIGltYWdlIGZyb20gaXQKKyQhCiskISBWZXJzaW9uIGhpc3RvcnkKKyQhIDAuMDEgMjAxMjAxMjggRmlyc3QgdmVyc2lvbgorJCEgMC4wMiAyMDEyMDIyNiBBZGQgcHJlLWxvYWQgbG9naWMKKyQhCiskIE1BUF8yX1NIT1BUOiBTdWJyb3V0aW5lCiskIQorJCBTQVkgOj0gIldSSVRFXyBTWVMkT1VUUFVUIgorJCEKKyQgSUYgRiRTRUFSQ0goIicnUDEnIikgLkVRUy4gIiIKKyQgVEhFTgorJCAgICBTQVkgIk1BUF8yX1NIT1BULUUtTk9TVUNIRklMRTogIEVycm9yLCBpbnB1dGZpbGUgJydwMScgbm90IGF2YWlsYWJsZSIKKyQgICAgZ290byBleGl0X20ycworJCBFTkRJRgorJCBJRiAiJydQMiciIC5FUVMuICIiCiskIFRIRU4KKyQgICAgU0FZICJNQVBfMl9TSE9QVDogIEVycm9yLCBubyBvdXRwdXQgZmlsZSBwcm92aWRlZCIKKyQgICAgZ290byBleGl0X20ycworJCBFTkRJRgorJCEKKyQgbW9kdWxlMSA9ICJkZWZsYXRlI2RlZmxhdGVFbmQjZGVmbGF0ZUluaXRfI2RlZmxhdGVQYXJhbXMjZGVmbGF0ZVNldERpY3Rpb25hcnkiCiskIG1vZHVsZTIgPSAiZ3pjbG9zZSNnemVycm9yI2d6Z2V0YyNnemdldHMjZ3pvcGVuI2d6cHJpbnRmI2d6cHV0YyNnenB1dHMjZ3pyZWFkIgorJCBtb2R1bGUzID0gImd6c2VlayNnenRlbGwjaW5mbGF0ZSNpbmZsYXRlRW5kI2luZmxhdGVJbml0XyNpbmZsYXRlU2V0RGljdGlvbmFyeSIKKyQgbW9kdWxlNCA9ICJpbmZsYXRlU3luYyN1bmNvbXByZXNzI3psaWJWZXJzaW9uI2NvbXByZXNzIgorJCBvcGVuL3JlYWQgbWFwICdwMQorJCBpZiBheHAgLm9yLiBpYTY0CiskIHRoZW4KKyQgICAgIG9wZW4vd3JpdGUgYW9wdCBhLm9wdAorJCAgICAgb3Blbi93cml0ZSBib3B0IGIub3B0CiskICAgICB3cml0ZSBhb3B0ICIgQ0FTRV9TRU5TSVRJVkU9WUVTIgorJCAgICAgd3JpdGUgYm9wdCAiU1lNQk9MX1ZFQ1RPUj0gKC0iCiskICAgICBtb2Rfc3ltX251bSA9IDEKKyQgTU9EX1NZTV9MT09QOgorJCAgICAgaWYgZiR0eXBlKG1vZHVsZSdtb2Rfc3ltX251bScpIC5uZXMuICIiCiskICAgICB0aGVuCiskICAgICAgICAgbW9kX2luID0gMAorJCBNT0RfU1lNX0lOOgorJCAgICAgICAgIHNoYXJlZF9wcm9jID0gZiRlbGVtZW50KG1vZF9pbiwgIiMiLCBtb2R1bGUnbW9kX3N5bV9udW0nKQorJCAgICAgICAgIGlmIHNoYXJlZF9wcm9jIC5uZXMuICIjIgorJCAgICAgICAgIHRoZW4KKyQgICAgICAgICAgICAgd3JpdGUgYW9wdCBmJGZhbygiIHN5bWJvbF92ZWN0b3I9KCFBUy8hQVM9UFJPQ0VEVVJFKSIsLQorICAgICAgICAJCSAgICAgICBmJGVkaXQoc2hhcmVkX3Byb2MsInVwY2FzZSIpLHNoYXJlZF9wcm9jKQorJCAgICAgICAgICAgICB3cml0ZSBib3B0IGYkZmFvKCIhQVM9UFJPQ0VEVVJFLC0iLHNoYXJlZF9wcm9jKQorJCAgICAgICAgICAgICBtb2RfaW4gPSBtb2RfaW4gKyAxCiskICAgICAgICAgICAgIGdvdG8gbW9kX3N5bV9pbgorJCAgICAgICAgIGVuZGlmCiskICAgICAgICAgbW9kX3N5bV9udW0gPSBtb2Rfc3ltX251bSArIDEKKyQgICAgICAgICBnb3RvIG1vZF9zeW1fbG9vcAorJCAgICAgZW5kaWYKKyRNQVBfTE9PUDoKKyQgICAgIHJlYWQvZW5kPW1hcF9lbmQgbWFwIGxpbmUKKyQgICAgIGlmIChmJGxvY2F0ZSgieyIsbGluZSkubHQuIGYkbGVuZ3RoKGxpbmUpKSAub3IuIC0KKyAgICAgICAgIChmJGxvY2F0ZSgiZ2xvYmFsOiIsIGxpbmUpIC5sdC4gZiRsZW5ndGgobGluZSkpCiskICAgICB0aGVuCiskICAgICAgICAgcHJvYyA9IHRydWUKKyQgICAgICAgICBnb3RvIG1hcF9sb29wCiskICAgICBlbmRpZgorJCAgICAgaWYgZiRsb2NhdGUoIn0iLGxpbmUpLmx0LiBmJGxlbmd0aChsaW5lKSB0aGVuIHByb2MgPSBmYWxzZQorJCAgICAgaWYgZiRsb2NhdGUoImxvY2FsOiIsIGxpbmUpIC5sdC4gZiRsZW5ndGgobGluZSkgdGhlbiBwcm9jID0gZmFsc2UKKyQgICAgIGlmIHByb2MKKyQgICAgIHRoZW4KKyQgICAgICAgICBzaGFyZWRfcHJvYyA9IGYkZWRpdChsaW5lLCJjb2xsYXBzZSIpCiskICAgICAgICAgY2hvcF9zZW1pID0gZiRsb2NhdGUoIjsiLCBzaGFyZWRfcHJvYykKKyQgICAgICAgICBpZiBjaG9wX3NlbWkgLmx0LiBmJGxlbmd0aChzaGFyZWRfcHJvYykgdGhlbiAtCisgICAgICAgICAgICAgIHNoYXJlZF9wcm9jID0gZiRleHRyYWN0KDAsIGNob3Bfc2VtaSwgc2hhcmVkX3Byb2MpCiskICAgICAgICAgd3JpdGUgYW9wdCBmJGZhbygiIHN5bWJvbF92ZWN0b3I9KCFBUy8hQVM9UFJPQ0VEVVJFKSIsLQorICAgICAgICAJCQkgZiRlZGl0KHNoYXJlZF9wcm9jLCJ1cGNhc2UiKSxzaGFyZWRfcHJvYykKKyQgICAgICAgICB3cml0ZSBib3B0IGYkZmFvKCIhQVM9UFJPQ0VEVVJFLC0iLHNoYXJlZF9wcm9jKQorJCAgICAgZW5kaWYKKyQgICAgIGdvdG8gbWFwX2xvb3AKKyRNQVBfRU5EOgorJCAgICAgY2xvc2Uvbm9sb2cgYW9wdAorJCAgICAgY2xvc2Uvbm9sb2cgYm9wdAorJCAgICAgb3Blbi9hcHBlbmQgbGlib3B0ICdwMicKKyQgICAgIG9wZW4vcmVhZCBhb3B0IGEub3B0CiskICAgICBvcGVuL3JlYWQgYm9wdCBiLm9wdAorJEFMT09QOgorJCAgICAgcmVhZC9lbmQ9YWxvb3BfZW5kIGFvcHQgbGluZQorJCAgICAgd3JpdGUgbGlib3B0IGxpbmUKKyQgICAgIGdvdG8gYWxvb3AKKyRBTE9PUF9FTkQ6CiskICAgICBjbG9zZS9ub2xvZyBhb3B0CiskICAgICBzdiA9ICIiCiskQkxPT1A6CiskICAgICByZWFkL2VuZD1ibG9vcF9lbmQgYm9wdCBzdm4KKyQgICAgIGlmIChzdm4ubmVzLiIiKQorJCAgICAgdGhlbgorJCAgICAgICAgaWYgKHN2Lm5lcy4iIikgdGhlbiB3cml0ZSBsaWJvcHQgc3YKKyQgICAgICAgIHN2ID0gc3ZuCiskICAgICBlbmRpZgorJCAgICAgZ290byBibG9vcAorJEJMT09QX0VORDoKKyQgICAgIHdyaXRlIGxpYm9wdCBmJGV4dHJhY3QoMCxmJGxlbmd0aChzdiktMixzdiksICItIgorJCAgICAgd3JpdGUgbGlib3B0ICIpIgorJCAgICAgY2xvc2Uvbm9sb2cgYm9wdAorJCAgICAgZGVsZXRlL25vbG9nL25vY29uZiBhLm9wdDsqLGIub3B0OyoKKyQgZWxzZQorJCAgICAgaWYgdmF4CiskICAgICB0aGVuCiskICAgICBvcGVuL2FwcGVuZCBsaWJvcHQgJ3AyJworJCAgICAgbW9kX3N5bV9udW0gPSAxCiskIFZNT0RfU1lNX0xPT1A6CiskICAgICBpZiBmJHR5cGUobW9kdWxlJ21vZF9zeW1fbnVtJykgLm5lcy4gIiIKKyQgICAgIHRoZW4KKyQgICAgICAgICBtb2RfaW4gPSAwCiskIFZNT0RfU1lNX0lOOgorJCAgICAgICAgIHNoYXJlZF9wcm9jID0gZiRlbGVtZW50KG1vZF9pbiwgIiMiLCBtb2R1bGUnbW9kX3N5bV9udW0nKQorJCAgICAgICAgIGlmIHNoYXJlZF9wcm9jIC5uZXMuICIjIgorJCAgICAgICAgIHRoZW4KKyQgICAgIAkgICAgICB3cml0ZSBsaWJvcHQgZiRmYW8oIlVOSVZFUlNBTD0hQVMiLC0KKyAgICAgIAkgIAkJCSAgICAgZiRlZGl0KHNoYXJlZF9wcm9jLCJ1cGNhc2UiKSkKKyQgICAgICAgICAgICAgbW9kX2luID0gbW9kX2luICsgMQorJCAgICAgICAgICAgICBnb3RvIHZtb2Rfc3ltX2luCiskICAgICAgICAgZW5kaWYKKyQgICAgICAgICBtb2Rfc3ltX251bSA9IG1vZF9zeW1fbnVtICsgMQorJCAgICAgICAgIGdvdG8gdm1vZF9zeW1fbG9vcAorJCAgICAgZW5kaWYKKyRWTUFQX0xPT1A6CiskICAgICAJICByZWFkL2VuZD12bWFwX2VuZCBtYXAgbGluZQorJCAgICAgCSAgaWYgKGYkbG9jYXRlKCJ7IixsaW5lKS5sdC4gZiRsZW5ndGgobGluZSkpIC5vci4gLQorICAgCSAgICAgIChmJGxvY2F0ZSgiZ2xvYmFsOiIsIGxpbmUpIC5sdC4gZiRsZW5ndGgobGluZSkpCiskICAgICAJICB0aGVuCiskICAgICAJICAgICAgcHJvYyA9IHRydWUKKyQgICAgIAkgICAgICBnb3RvIHZtYXBfbG9vcAorJCAgICAgCSAgZW5kaWYKKyQgICAgIAkgIGlmIGYkbG9jYXRlKCJ9IixsaW5lKS5sdC4gZiRsZW5ndGgobGluZSkgdGhlbiBwcm9jID0gZmFsc2UKKyQgICAgIAkgIGlmIGYkbG9jYXRlKCJsb2NhbDoiLCBsaW5lKSAubHQuIGYkbGVuZ3RoKGxpbmUpIHRoZW4gcHJvYyA9IGZhbHNlCiskICAgICAJICBpZiBwcm9jCiskICAgICAJICB0aGVuCiskICAgICAJICAgICAgc2hhcmVkX3Byb2MgPSBmJGVkaXQobGluZSwiY29sbGFwc2UiKQorJCAgICAgCSAgICAgIGNob3Bfc2VtaSA9IGYkbG9jYXRlKCI7Iiwgc2hhcmVkX3Byb2MpCiskICAgICAJICAgICAgaWYgY2hvcF9zZW1pIC5sdC4gZiRsZW5ndGgoc2hhcmVkX3Byb2MpIHRoZW4gLQorICAgICAgCSAgCSAgc2hhcmVkX3Byb2MgPSBmJGV4dHJhY3QoMCwgY2hvcF9zZW1pLCBzaGFyZWRfcHJvYykKKyQgICAgIAkgICAgICB3cml0ZSBsaWJvcHQgZiRmYW8oIlVOSVZFUlNBTD0hQVMiLC0KKyAgICAgIAkgIAkJCSAgICAgZiRlZGl0KHNoYXJlZF9wcm9jLCJ1cGNhc2UiKSkKKyQgICAgIAkgIGVuZGlmCiskICAgICAJICBnb3RvIHZtYXBfbG9vcAorJFZNQVBfRU5EOgorJCAgICAgZWxzZQorJCAgICAgICAgIHdyaXRlIHN5cyRvdXRwdXQgIlVua25vd24gQXJjaGl0ZWN0dXJlIChOb3QgVkFYLCBBWFAsIG9yIElBNjQpIgorJCAgICAgICAgIHdyaXRlIHN5cyRvdXRwdXQgIk5vIG9wdGlvbnMgZmlsZSBjcmVhdGVkIgorJCAgICAgZW5kaWYKKyQgZW5kaWYKKyQgRVhJVF9NMlM6CiskIGNsb3NlL25vbG9nIG1hcAorJCBjbG9zZS9ub2xvZyBsaWJvcHQKKyQgZW5kc3Vicm91dGluZQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvbXNkb3MvTWFrZWZpbGUuYm9yIGIvemxpYi9zcmMvbXNkb3MvTWFrZWZpbGUuYm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMTJhMmMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9tc2Rvcy9NYWtlZmlsZS5ib3IKQEAgLTAsMCArMSwxMTUgQEAKKyMgTWFrZWZpbGUgZm9yIHpsaWIKKyMgQm9ybGFuZCBDKysKKyMgTGFzdCB1cGRhdGVkOiAxNS1NYXItMjAwMworCisjIFRvIHVzZSwgZG8gIm1ha2UgLWZtYWtlZmlsZS5ib3IiCisjIFRvIGNvbXBpbGUgaW4gc21hbGwgbW9kZWwsIHNldCBiZWxvdzogTU9ERUw9cworCisjIFdBUk5JTkc6IHRoZSBzbWFsbCBtb2RlbCBpcyBzdXBwb3J0ZWQgYnV0IG9ubHkgZm9yIHNtYWxsIHZhbHVlcyBvZgorIyBNQVhfV0JJVFMgYW5kIE1BWF9NRU1fTEVWRUwuIEZvciBleGFtcGxlOgorIyAgICAtRE1BWF9XQklUUz0xMSAtRERFRl9XQklUUz0xMSAtRE1BWF9NRU1fTEVWRUw9MworIyBJZiB5b3Ugd2lzaCB0byByZWR1Y2UgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgKGRlZmF1bHQgMjU2SyBmb3IgYmlnCisjIG9iamVjdHMgcGx1cyBhIGZldyBLKSwgeW91IGNhbiBhZGQgdG8gdGhlIExPQyBtYWNybyBiZWxvdzoKKyMgICAtRE1BWF9NRU1fTEVWRUw9NyAtRE1BWF9XQklUUz0xNAorIyBTZWUgemNvbmYuaCBmb3IgZGV0YWlscyBhYm91dCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cy4KKworIyAtLS0tLS0tLS0tLS0gVHVyYm8gQysrLCBCb3JsYW5kIEMrKyAtLS0tLS0tLS0tLS0KKworIyAgICBPcHRpb25hbCBub25zdGFuZGFyZCBwcmVwcm9jZXNzb3IgZmxhZ3MgKGUuZy4gLURNQVhfTUVNX0xFVkVMPTcpCisjICAgIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgZW52aXJvbm1lbnQgdmlhICJzZXQgTE9DQUxfWkxJQj0tREZPTyIgb3IgYWRkZWQKKyMgICAgdG8gdGhlIGRlY2xhcmF0aW9uIG9mIExPQyBoZXJlOgorTE9DID0gJChMT0NBTF9aTElCKQorCisjIHR5cGUgZm9yIENQVSByZXF1aXJlZDogMDogODA4NiwgMTogODAxODYsIDI6IDgwMjg2LCAzOiA4MDM4NiwgZXRjLgorQ1BVX1RZUCA9IDAKKworIyBtZW1vcnkgbW9kZWw6IG9uZSBvZiBzLCBtLCBjLCBsIChzbWFsbCwgbWVkaXVtLCBjb21wYWN0LCBsYXJnZSkKK01PREVMPWwKKworIyByZXBsYWNlIGJjYyB3aXRoIHRjYyBmb3IgVHVyYm8gQysrIDEuMCwgd2l0aCBiY2MzMiBmb3IgdGhlIDMyIGJpdCB2ZXJzaW9uCitDQz1iY2MKK0xEPWJjYworQVI9dGxpYgorCisjIGNvbXBpbGVyIGZsYWdzCisjIHJlcGxhY2UgIi1PMiIgYnkgIi1PIC1HIC1hIC1kIiBmb3IgVHVyYm8gQysrIDEuMAorQ0ZMQUdTPS1PMiAtWiAtbSQoTU9ERUwpICQoTE9DKQorCitMREZMQUdTPS1tJChNT0RFTCkgLWYtCisKKworIyB2YXJpYWJsZXMKK1pMSUJfTElCID0gemxpYl8kKE1PREVMKS5saWIKKworT0JKMSA9IGFkbGVyMzIub2JqIGNvbXByZXNzLm9iaiBjcmMzMi5vYmogZGVmbGF0ZS5vYmogZ3pjbG9zZS5vYmogZ3psaWIub2JqIGd6cmVhZC5vYmoKK09CSjIgPSBnendyaXRlLm9iaiBpbmZiYWNrLm9iaiBpbmZmYXN0Lm9iaiBpbmZsYXRlLm9iaiBpbmZ0cmVlcy5vYmogdHJlZXMub2JqIHVuY29tcHIub2JqIHp1dGlsLm9iagorT0JKUDEgPSArYWRsZXIzMi5vYmorY29tcHJlc3Mub2JqK2NyYzMyLm9iaitkZWZsYXRlLm9iaitnemNsb3NlLm9iaitnemxpYi5vYmorZ3pyZWFkLm9iagorT0JKUDIgPSArZ3p3cml0ZS5vYmoraW5mYmFjay5vYmoraW5mZmFzdC5vYmoraW5mbGF0ZS5vYmoraW5mdHJlZXMub2JqK3RyZWVzLm9iait1bmNvbXByLm9iait6dXRpbC5vYmoKKworCisjIHRhcmdldHMKK2FsbDogJChaTElCX0xJQikgZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCisKKy5jLm9iajoKKwkkKENDKSAtYyAkKENGTEFHUykgJCouYworCithZGxlcjMyLm9iajogYWRsZXIzMi5jIHpsaWIuaCB6Y29uZi5oCisKK2NvbXByZXNzLm9iajogY29tcHJlc3MuYyB6bGliLmggemNvbmYuaAorCitjcmMzMi5vYmo6IGNyYzMyLmMgemxpYi5oIHpjb25mLmggY3JjMzIuaAorCitkZWZsYXRlLm9iajogZGVmbGF0ZS5jIGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCisKK2d6Y2xvc2Uub2JqOiBnemNsb3NlLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKKworZ3psaWIub2JqOiBnemxpYi5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCisKK2d6cmVhZC5vYmo6IGd6cmVhZC5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCisKK2d6d3JpdGUub2JqOiBnendyaXRlLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKKworaW5mYmFjay5vYmo6IGluZmJhY2suYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKKyBpbmZmYXN0LmggaW5mZml4ZWQuaAorCitpbmZmYXN0Lm9iajogaW5mZmFzdC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAorIGluZmZhc3QuaAorCitpbmZsYXRlLm9iajogaW5mbGF0ZS5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAorIGluZmZhc3QuaCBpbmZmaXhlZC5oCisKK2luZnRyZWVzLm9iajogaW5mdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKKwordHJlZXMub2JqOiB0cmVlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggZGVmbGF0ZS5oIHRyZWVzLmgKKwordW5jb21wci5vYmo6IHVuY29tcHIuYyB6bGliLmggemNvbmYuaAorCit6dXRpbC5vYmo6IHp1dGlsLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAorCitleGFtcGxlLm9iajogdGVzdC9leGFtcGxlLmMgemxpYi5oIHpjb25mLmgKKworbWluaWd6aXAub2JqOiB0ZXN0L21pbmlnemlwLmMgemxpYi5oIHpjb25mLmgKKworCisjIHRoZSBjb21tYW5kIGxpbmUgaXMgY3V0IHRvIGZpdCBpbiB0aGUgTVMtRE9TIDEyOCBieXRlIGxpbWl0OgorJChaTElCX0xJQik6ICQoT0JKMSkgJChPQkoyKQorCS1kZWwgJChaTElCX0xJQikKKwkkKEFSKSAkKFpMSUJfTElCKSAkKE9CSlAxKQorCSQoQVIpICQoWkxJQl9MSUIpICQoT0JKUDIpCisKK2V4YW1wbGUuZXhlOiBleGFtcGxlLm9iaiAkKFpMSUJfTElCKQorCSQoTEQpICQoTERGTEFHUykgZXhhbXBsZS5vYmogJChaTElCX0xJQikKKworbWluaWd6aXAuZXhlOiBtaW5pZ3ppcC5vYmogJChaTElCX0xJQikKKwkkKExEKSAkKExERkxBR1MpIG1pbmlnemlwLm9iaiAkKFpMSUJfTElCKQorCit0ZXN0OiBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKKwlleGFtcGxlCisJZWNobyBoZWxsbyB3b3JsZCB8IG1pbmlnemlwIHwgbWluaWd6aXAgLWQKKworY2xlYW46CisJLWRlbCAqLm9iagorCS1kZWwgKi5saWIKKwktZGVsICouZXhlCisJLWRlbCB6bGliXyouYmFrCisJLWRlbCBmb28uZ3oKZGlmZiAtLWdpdCBhL3psaWIvc3JjL21zZG9zL01ha2VmaWxlLmRqMiBiL3psaWIvc3JjL21zZG9zL01ha2VmaWxlLmRqMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWIwMzk1Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvbXNkb3MvTWFrZWZpbGUuZGoyCkBAIC0wLDAgKzEsMTA0IEBACisjIE1ha2VmaWxlIGZvciB6bGliLiAgTW9kaWZpZWQgZm9yIGRqZ3BwIHYyLjAgYnkgRi4gSi4gRG9uYWhvZSwgMy8xNS85Ni4KKyMgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggSmVhbi1sb3VwIEdhaWxseS4KKyMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorCisjIFRvIGNvbXBpbGUsIG9yIHRvIGNvbXBpbGUgYW5kIHRlc3QsIHR5cGU6CisjCisjICAgbWFrZSAtZm1ha2VmaWxlLmRqMjsgIG1ha2UgdGVzdCAtZm1ha2VmaWxlLmRqMgorIworIyBUbyBpbnN0YWxsIGxpYnouYSwgemNvbmYuaCBhbmQgemxpYi5oIGluIHRoZSBkamdwcCBkaXJlY3RvcmllcywgdHlwZToKKyMKKyMgICAgbWFrZSBpbnN0YWxsIC1mbWFrZWZpbGUuZGoyCisjCisjIGFmdGVyIGZpcnN0IGRlZmluaW5nIExJQlJBUllfUEFUSCBhbmQgSU5DTFVERV9QQVRIIGluIGRqZ3BwLmVudiBhcworIyBpbiB0aGUgc2FtcGxlIGJlbG93IGlmIHRoZSBwYXR0ZXJuIG9mIHRoZSBESkdQUCBkaXN0cmlidXRpb24gaXMgdG8KKyMgYmUgZm9sbG93ZWQuICBSZW1lbWJlciB0aGF0LCB3aGlsZSA8c3A+J2VzIGFyb3VuZCA8PT4gYXJlIGlnbm9yZWQgaW4KKyMgbWFrZWZpbGVzLCB0aGV5IGFyZSAqbm90KiBpbiBiYXRjaCBmaWxlcyBvciBpbiBkamdwcC5lbnYuCisjIC0gLSAtIC0gLQorIyBbbWFrZV0KKyMgSU5DTFVERV9QQVRIPSVcPjtJTkNMVURFX1BBVEglJVxESkRJUiVcaW5jbHVkZQorIyBMSUJSQVJZX1BBVEg9JVw+O0xJQlJBUllfUEFUSCUlXERKRElSJVxsaWIKKyMgQlVUVD0tbTQ4NgorIyAtIC0gLSAtIC0KKyMgQWx0ZXJuYXRlbHksIHRoZXNlIHZhcmlhYmxlcyBtYXkgYmUgZGVmaW5lZCBiZWxvdywgb3ZlcnJpZGluZyB0aGUgdmFsdWVzCisjIGluIGRqZ3BwLmVudiwgYXMKKyMgSU5DTFVERV9QQVRIPWM6XHVzclxpbmNsdWRlCisjIExJQlJBUllfUEFUSD1jOlx1c3JcbGliCisKK0NDPWdjYworCisjQ0ZMQUdTPS1NTUQgLU8KKyNDRkxBR1M9LU8gLURNQVhfV0JJVFM9MTQgLURNQVhfTUVNX0xFVkVMPTcKKyNDRkxBR1M9LU1NRCAtZyAtRERFQlVHCitDRkxBR1M9LU1NRCAtTzMgJChCVVRUKSAtV2FsbCAtV3dyaXRlLXN0cmluZ3MgLVdwb2ludGVyLWFyaXRoIC1XY29udmVyc2lvbiBcCisgICAgICAgICAgICAgLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcworCisjIElmIGNwLmV4ZSBpcyBhdmFpbGFibGUsIHJlcGxhY2UgImNvcHkgL1kiIHdpdGggImNwIC1mcCIgLgorQ1A9Y29weSAvWQorIyBJZiBnbnUgaW5zdGFsbC5leGUgaXMgYXZhaWxhYmxlLCByZXBsYWNlICQoQ1ApIHdpdGggZ2luc3RhbGwuCitJTlNUQUxMPSQoQ1ApCisjIFRoZSBkZWZhdWx0IHZhbHVlIG9mIFJNIGlzICJybSAtZi4iICBJZiAicm0uZXhlIiBpcyBmb3VuZCwgY29tbWVudCBvdXQ6CitSTT1kZWwKK0xETElCUz0tTC4gLWx6CitMRD0kKENDKSAtcyAtbworTERTSEFSRUQ9JChDQykKKworSU5DTD16bGliLmggemNvbmYuaAorTElCUz1saWJ6LmEKKworQVI9YXIgcmNzCisKK3ByZWZpeD0vdXNyL2xvY2FsCitleGVjX3ByZWZpeCA9ICQocHJlZml4KQorCitPQkpTID0gYWRsZXIzMi5vIGNvbXByZXNzLm8gY3JjMzIubyBnemNsb3NlLm8gZ3psaWIubyBnenJlYWQubyBnendyaXRlLm8gXAorICAgICAgIHVuY29tcHIubyBkZWZsYXRlLm8gdHJlZXMubyB6dXRpbC5vIGluZmxhdGUubyBpbmZiYWNrLm8gaW5mdHJlZXMubyBpbmZmYXN0Lm8KKworT0JKQSA9CisjIHRvIHVzZSB0aGUgYXNtIGNvZGU6IG1ha2UgT0JKQT1tYXRjaC5vCisKK1RFU1RfT0JKUyA9IGV4YW1wbGUubyBtaW5pZ3ppcC5vCisKK2FsbDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCisKK2NoZWNrOiB0ZXN0Cit0ZXN0OiBhbGwKKwkuL2V4YW1wbGUKKwllY2hvIGhlbGxvIHdvcmxkIHwgLlxtaW5pZ3ppcCB8IC5cbWluaWd6aXAgLWQKKworJS5vIDogJS5jCisJJChDQykgJChDRkxBR1MpIC1jICQ8IC1vICRACisKK2xpYnouYTogJChPQkpTKSAkKE9CSkEpCisJJChBUikgJEAgJChPQkpTKSAkKE9CSkEpCisKKyUuZXhlIDogJS5vICQoTElCUykKKwkkKExEKSAkQCAkPCAkKExETElCUykKKworIyBJTkNMVURFX1BBVEggYW5kIExJQlJBUllfUEFUSCB3ZXJlIHNldCBmb3IgW21ha2VdIGluIGRqZ3BwLmVudiAuCisKKy5QSE9OWSA6IHVuaW5zdGFsbCBjbGVhbgorCitpbnN0YWxsOiAkKElOQ0wpICQoTElCUykKKwktQGlmIG5vdCBleGlzdCAkKElOQ0xVREVfUEFUSClcbnVsIG1rZGlyICQoSU5DTFVERV9QQVRIKQorCS1AaWYgbm90IGV4aXN0ICQoTElCUkFSWV9QQVRIKVxudWwgbWtkaXIgJChMSUJSQVJZX1BBVEgpCisJJChJTlNUQUxMKSB6bGliLmggJChJTkNMVURFX1BBVEgpCisJJChJTlNUQUxMKSB6Y29uZi5oICQoSU5DTFVERV9QQVRIKQorCSQoSU5TVEFMTCkgbGliei5hICQoTElCUkFSWV9QQVRIKQorCit1bmluc3RhbGw6CisJJChSTSkgJChJTkNMVURFX1BBVEgpXHpsaWIuaAorCSQoUk0pICQoSU5DTFVERV9QQVRIKVx6Y29uZi5oCisJJChSTSkgJChMSUJSQVJZX1BBVEgpXGxpYnouYQorCitjbGVhbjoKKwkkKFJNKSAqLmQKKwkkKFJNKSAqLm8KKwkkKFJNKSAqLmV4ZQorCSQoUk0pIGxpYnouYQorCSQoUk0pIGZvby5negorCitERVBTIDo9ICQod2lsZGNhcmQgKi5kKQoraWZuZXEgKCQoREVQUyksKQoraW5jbHVkZSAkKERFUFMpCitlbmRpZgpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvbXNkb3MvTWFrZWZpbGUuZW14IGIvemxpYi9zcmMvbXNkb3MvTWFrZWZpbGUuZW14Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMWI1N2EKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9tc2Rvcy9NYWtlZmlsZS5lbXgKQEAgLTAsMCArMSw2OSBAQAorIyBNYWtlZmlsZSBmb3IgemxpYi4gIE1vZGlmaWVkIGZvciBlbXggMC45YyBieSBDaHIuIFNwaWVsZXIsIDYvMTcvOTguCisjIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEplYW4tbG91cCBHYWlsbHkuCisjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKworIyBUbyBjb21waWxlLCBvciB0byBjb21waWxlIGFuZCB0ZXN0LCB0eXBlOgorIworIyAgIG1ha2UgLWZtYWtlZmlsZS5lbXg7ICBtYWtlIHRlc3QgLWZtYWtlZmlsZS5lbXgKKyMKKworQ0M9Z2NjCisKKyNDRkxBR1M9LU1NRCAtTworI0NGTEFHUz0tTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NworI0NGTEFHUz0tTU1EIC1nIC1EREVCVUcKK0NGTEFHUz0tTU1EIC1PMyAkKEJVVFQpIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdjb252ZXJzaW9uIFwKKyAgICAgICAgICAgICAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzCisKKyMgSWYgY3AuZXhlIGlzIGF2YWlsYWJsZSwgcmVwbGFjZSAiY29weSAvWSIgd2l0aCAiY3AgLWZwIiAuCitDUD1jb3B5IC9ZCisjIElmIGdudSBpbnN0YWxsLmV4ZSBpcyBhdmFpbGFibGUsIHJlcGxhY2UgJChDUCkgd2l0aCBnaW5zdGFsbC4KK0lOU1RBTEw9JChDUCkKKyMgVGhlIGRlZmF1bHQgdmFsdWUgb2YgUk0gaXMgInJtIC1mLiIgIElmICJybS5leGUiIGlzIGZvdW5kLCBjb21tZW50IG91dDoKK1JNPWRlbAorTERMSUJTPS1MLiAtbHpsaWIKK0xEPSQoQ0MpIC1zIC1vCitMRFNIQVJFRD0kKENDKQorCitJTkNMPXpsaWIuaCB6Y29uZi5oCitMSUJTPXpsaWIuYQorCitBUj1hciByY3MKKworcHJlZml4PS91c3IvbG9jYWwKK2V4ZWNfcHJlZml4ID0gJChwcmVmaXgpCisKK09CSlMgPSBhZGxlcjMyLm8gY29tcHJlc3MubyBjcmMzMi5vIGd6Y2xvc2UubyBnemxpYi5vIGd6cmVhZC5vIGd6d3JpdGUubyBcCisgICAgICAgdW5jb21wci5vIGRlZmxhdGUubyB0cmVlcy5vIHp1dGlsLm8gaW5mbGF0ZS5vIGluZmJhY2subyBpbmZ0cmVlcy5vIGluZmZhc3QubworCitURVNUX09CSlMgPSBleGFtcGxlLm8gbWluaWd6aXAubworCithbGw6IGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQorCit0ZXN0OiBhbGwKKwkuL2V4YW1wbGUKKwllY2hvIGhlbGxvIHdvcmxkIHwgLlxtaW5pZ3ppcCB8IC5cbWluaWd6aXAgLWQKKworJS5vIDogJS5jCisJJChDQykgJChDRkxBR1MpIC1jICQ8IC1vICRACisKK3psaWIuYTogJChPQkpTKQorCSQoQVIpICRAICQoT0JKUykKKworJS5leGUgOiAlLm8gJChMSUJTKQorCSQoTEQpICRAICQ8ICQoTERMSUJTKQorCisKKy5QSE9OWSA6IGNsZWFuCisKK2NsZWFuOgorCSQoUk0pICouZAorCSQoUk0pICoubworCSQoUk0pICouZXhlCisJJChSTSkgemxpYi5hCisJJChSTSkgZm9vLmd6CisKK0RFUFMgOj0gJCh3aWxkY2FyZCAqLmQpCitpZm5lcSAoJChERVBTKSwpCitpbmNsdWRlICQoREVQUykKK2VuZGlmCmRpZmYgLS1naXQgYS96bGliL3NyYy9tc2Rvcy9NYWtlZmlsZS5tc2MgYi96bGliL3NyYy9tc2Rvcy9NYWtlZmlsZS5tc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU4Mzc4NgotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL21zZG9zL01ha2VmaWxlLm1zYwpAQCAtMCwwICsxLDExMiBAQAorIyBNYWtlZmlsZSBmb3IgemxpYgorIyBNaWNyb3NvZnQgQyA1LjEgb3IgbGF0ZXIKKyMgTGFzdCB1cGRhdGVkOiAxOS1NYXItMjAwMworCisjIFRvIHVzZSwgZG8gIm1ha2UgbWFrZWZpbGUubXNjIgorIyBUbyBjb21waWxlIGluIHNtYWxsIG1vZGVsLCBzZXQgYmVsb3c6IE1PREVMPVMKKworIyBJZiB5b3Ugd2lzaCB0byByZWR1Y2UgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgKGRlZmF1bHQgMjU2SyBmb3IgYmlnCisjIG9iamVjdHMgcGx1cyBhIGZldyBLKSwgeW91IGNhbiBhZGQgdG8gdGhlIExPQyBtYWNybyBiZWxvdzoKKyMgICAtRE1BWF9NRU1fTEVWRUw9NyAtRE1BWF9XQklUUz0xNAorIyBTZWUgemNvbmYuaCBmb3IgZGV0YWlscyBhYm91dCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cy4KKworIyAtLS0tLS0tLS0tLS0tIE1pY3Jvc29mdCBDIDUuMSBhbmQgbGF0ZXIgLS0tLS0tLS0tLS0tLQorCisjICAgIE9wdGlvbmFsIG5vbnN0YW5kYXJkIHByZXByb2Nlc3NvciBmbGFncyAoZS5nLiAtRE1BWF9NRU1fTEVWRUw9NykKKyMgICAgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBlbnZpcm9ubWVudCB2aWEgInNldCBMT0NBTF9aTElCPS1ERk9PIiBvciBhZGRlZAorIyAgICB0byB0aGUgZGVjbGFyYXRpb24gb2YgTE9DIGhlcmU6CitMT0MgPSAkKExPQ0FMX1pMSUIpCisKKyMgVHlwZSBmb3IgQ1BVIHJlcXVpcmVkOiAwOiA4MDg2LCAxOiA4MDE4NiwgMjogODAyODYsIDM6IDgwMzg2LCBldGMuCitDUFVfVFlQID0gMAorCisjIE1lbW9yeSBtb2RlbDogb25lIG9mIFMsIE0sIEMsIEwgKHNtYWxsLCBtZWRpdW0sIGNvbXBhY3QsIGxhcmdlKQorTU9ERUw9TAorCitDQz1jbAorQ0ZMQUdTPS1ub2xvZ28gLUEkKE1PREVMKSAtRyQoQ1BVX1RZUCkgLVczIC1PYWl0IC1HcyAkKExPQykKKyMtT3ggZ2VuZXJhdGVzIGJhZCBjb2RlIHdpdGggTVNDIDUuMQorTElCX0NGTEFHUz0tWmwgJChDRkxBR1MpCisKK0xEPWxpbmsKK0xERkxBR1M9L25vaS9lL3N0OjB4MTUwMC9ub2UvZmFyY2FsbC9wYWNrY29kZQorIyAiL2ZhcmNhbGwvcGFja2NvZGUiIGFyZSBvbmx5IHVzZWZ1bCBmb3IgYGxhcmdlIGNvZGUnIG1lbW9yeSBtb2RlbHMKKyMgYnV0IHNob3VsZCBiZSBhICJuby1vcCIgZm9yIHNtYWxsIGNvZGUgbW9kZWxzLgorCisKKyMgdmFyaWFibGVzCitaTElCX0xJQiA9IHpsaWJfJChNT0RFTCkubGliCisKK09CSjEgPSBhZGxlcjMyLm9iaiBjb21wcmVzcy5vYmogY3JjMzIub2JqIGRlZmxhdGUub2JqIGd6Y2xvc2Uub2JqIGd6bGliLm9iaiBnenJlYWQub2JqCitPQkoyID0gZ3p3cml0ZS5vYmogaW5mYmFjay5vYmogaW5mZmFzdC5vYmogaW5mbGF0ZS5vYmogaW5mdHJlZXMub2JqIHRyZWVzLm9iaiB1bmNvbXByLm9iaiB6dXRpbC5vYmoKKworCisjIHRhcmdldHMKK2FsbDogICQoWkxJQl9MSUIpIGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQorCisuYy5vYmo6CisJJChDQykgLWMgJChMSUJfQ0ZMQUdTKSAkKi5jCisKK2FkbGVyMzIub2JqOiBhZGxlcjMyLmMgemxpYi5oIHpjb25mLmgKKworY29tcHJlc3Mub2JqOiBjb21wcmVzcy5jIHpsaWIuaCB6Y29uZi5oCisKK2NyYzMyLm9iajogY3JjMzIuYyB6bGliLmggemNvbmYuaCBjcmMzMi5oCisKK2RlZmxhdGUub2JqOiBkZWZsYXRlLmMgZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKKworZ3pjbG9zZS5vYmo6IGd6Y2xvc2UuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAorCitnemxpYi5vYmo6IGd6bGliLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKKworZ3pyZWFkLm9iajogZ3pyZWFkLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKKworZ3p3cml0ZS5vYmo6IGd6d3JpdGUuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAorCitpbmZiYWNrLm9iajogaW5mYmFjay5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAorIGluZmZhc3QuaCBpbmZmaXhlZC5oCisKK2luZmZhc3Qub2JqOiBpbmZmYXN0LmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCisgaW5mZmFzdC5oCisKK2luZmxhdGUub2JqOiBpbmZsYXRlLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCisgaW5mZmFzdC5oIGluZmZpeGVkLmgKKworaW5mdHJlZXMub2JqOiBpbmZ0cmVlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAorCit0cmVlcy5vYmo6IHRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBkZWZsYXRlLmggdHJlZXMuaAorCit1bmNvbXByLm9iajogdW5jb21wci5jIHpsaWIuaCB6Y29uZi5oCisKK3p1dGlsLm9iajogenV0aWwuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCisKK2V4YW1wbGUub2JqOiB0ZXN0L2V4YW1wbGUuYyB6bGliLmggemNvbmYuaAorCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCisKK21pbmlnemlwLm9iajogdGVzdC9taW5pZ3ppcC5jIHpsaWIuaCB6Y29uZi5oCisJJChDQykgLWMgJChDRkxBR1MpICQqLmMKKworCisjIHRoZSBjb21tYW5kIGxpbmUgaXMgY3V0IHRvIGZpdCBpbiB0aGUgTVMtRE9TIDEyOCBieXRlIGxpbWl0OgorJChaTElCX0xJQik6ICQoT0JKMSkgJChPQkoyKQorCWlmIGV4aXN0ICQoWkxJQl9MSUIpIGRlbCAkKFpMSUJfTElCKQorCWxpYiAkKFpMSUJfTElCKSAkKE9CSjEpOworCWxpYiAkKFpMSUJfTElCKSAkKE9CSjIpOworCitleGFtcGxlLmV4ZTogZXhhbXBsZS5vYmogJChaTElCX0xJQikKKwkkKExEKSAkKExERkxBR1MpIGV4YW1wbGUub2JqLCwsJChaTElCX0xJQik7CisKK21pbmlnemlwLmV4ZTogbWluaWd6aXAub2JqICQoWkxJQl9MSUIpCisJJChMRCkgJChMREZMQUdTKSBtaW5pZ3ppcC5vYmosLCwkKFpMSUJfTElCKTsKKwordGVzdDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCisJZXhhbXBsZQorCWVjaG8gaGVsbG8gd29ybGQgfCBtaW5pZ3ppcCB8IG1pbmlnemlwIC1kCisKK2NsZWFuOgorCS1kZWwgKi5vYmoKKwktZGVsICoubGliCisJLWRlbCAqLmV4ZQorCS1kZWwgKi5tYXAKKwktZGVsIHpsaWJfKi5iYWsKKwktZGVsIGZvby5negpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvbXNkb3MvTWFrZWZpbGUudGMgYi96bGliL3NyYy9tc2Rvcy9NYWtlZmlsZS50YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWVjODJhCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvbXNkb3MvTWFrZWZpbGUudGMKQEAgLTAsMCArMSwxMDAgQEAKKyMgTWFrZWZpbGUgZm9yIHpsaWIKKyMgVHVyYm8gQyAyLjAxLCBUdXJibyBDKysgMS4wMQorIyBMYXN0IHVwZGF0ZWQ6IDE1LU1hci0yMDAzCisKKyMgVG8gdXNlLCBkbyAibWFrZSAtZm1ha2VmaWxlLnRjIgorIyBUbyBjb21waWxlIGluIHNtYWxsIG1vZGVsLCBzZXQgYmVsb3c6IE1PREVMPXMKKworIyBXQVJOSU5HOiB0aGUgc21hbGwgbW9kZWwgaXMgc3VwcG9ydGVkIGJ1dCBvbmx5IGZvciBzbWFsbCB2YWx1ZXMgb2YKKyMgTUFYX1dCSVRTIGFuZCBNQVhfTUVNX0xFVkVMLiBGb3IgZXhhbXBsZToKKyMgICAgLURNQVhfV0JJVFM9MTEgLURNQVhfTUVNX0xFVkVMPTMKKyMgSWYgeW91IHdpc2ggdG8gcmVkdWNlIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIChkZWZhdWx0IDI1NksgZm9yIGJpZworIyBvYmplY3RzIHBsdXMgYSBmZXcgSyksIHlvdSBjYW4gYWRkIHRvIENGTEFHUyBiZWxvdzoKKyMgICAtRE1BWF9NRU1fTEVWRUw9NyAtRE1BWF9XQklUUz0xNAorIyBTZWUgemNvbmYuaCBmb3IgZGV0YWlscyBhYm91dCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cy4KKworIyAtLS0tLS0tLS0tLS0gVHVyYm8gQyAyLjAxLCBUdXJibyBDKysgMS4wMSAtLS0tLS0tLS0tLS0KK01PREVMPWwKK0NDPXRjYworTEQ9dGNjCitBUj10bGliCisjIENGTEFHUz0tTzIgLUcgLVogLW0kKE1PREVMKSAtRE1BWF9XQklUUz0xMSAtRE1BWF9NRU1fTEVWRUw9MworQ0ZMQUdTPS1PMiAtRyAtWiAtbSQoTU9ERUwpCitMREZMQUdTPS1tJChNT0RFTCkgLWYtCisKKworIyB2YXJpYWJsZXMKK1pMSUJfTElCID0gemxpYl8kKE1PREVMKS5saWIKKworT0JKMSA9IGFkbGVyMzIub2JqIGNvbXByZXNzLm9iaiBjcmMzMi5vYmogZGVmbGF0ZS5vYmogZ3pjbG9zZS5vYmogZ3psaWIub2JqIGd6cmVhZC5vYmoKK09CSjIgPSBnendyaXRlLm9iaiBpbmZiYWNrLm9iaiBpbmZmYXN0Lm9iaiBpbmZsYXRlLm9iaiBpbmZ0cmVlcy5vYmogdHJlZXMub2JqIHVuY29tcHIub2JqIHp1dGlsLm9iagorT0JKUDEgPSArYWRsZXIzMi5vYmorY29tcHJlc3Mub2JqK2NyYzMyLm9iaitkZWZsYXRlLm9iaitnemNsb3NlLm9iaitnemxpYi5vYmorZ3pyZWFkLm9iagorT0JKUDIgPSArZ3p3cml0ZS5vYmoraW5mYmFjay5vYmoraW5mZmFzdC5vYmoraW5mbGF0ZS5vYmoraW5mdHJlZXMub2JqK3RyZWVzLm9iait1bmNvbXByLm9iait6dXRpbC5vYmoKKworCisjIHRhcmdldHMKK2FsbDogJChaTElCX0xJQikgZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCisKKy5jLm9iajoKKwkkKENDKSAtYyAkKENGTEFHUykgJCouYworCithZGxlcjMyLm9iajogYWRsZXIzMi5jIHpsaWIuaCB6Y29uZi5oCisKK2NvbXByZXNzLm9iajogY29tcHJlc3MuYyB6bGliLmggemNvbmYuaAorCitjcmMzMi5vYmo6IGNyYzMyLmMgemxpYi5oIHpjb25mLmggY3JjMzIuaAorCitkZWZsYXRlLm9iajogZGVmbGF0ZS5jIGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCisKK2d6Y2xvc2Uub2JqOiBnemNsb3NlLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKKworZ3psaWIub2JqOiBnemxpYi5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCisKK2d6cmVhZC5vYmo6IGd6cmVhZC5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCisKK2d6d3JpdGUub2JqOiBnendyaXRlLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKKworaW5mYmFjay5vYmo6IGluZmJhY2suYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKKyBpbmZmYXN0LmggaW5mZml4ZWQuaAorCitpbmZmYXN0Lm9iajogaW5mZmFzdC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAorIGluZmZhc3QuaAorCitpbmZsYXRlLm9iajogaW5mbGF0ZS5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAorIGluZmZhc3QuaCBpbmZmaXhlZC5oCisKK2luZnRyZWVzLm9iajogaW5mdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKKwordHJlZXMub2JqOiB0cmVlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggZGVmbGF0ZS5oIHRyZWVzLmgKKwordW5jb21wci5vYmo6IHVuY29tcHIuYyB6bGliLmggemNvbmYuaAorCit6dXRpbC5vYmo6IHp1dGlsLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAorCitleGFtcGxlLm9iajogdGVzdC9leGFtcGxlLmMgemxpYi5oIHpjb25mLmgKKworbWluaWd6aXAub2JqOiB0ZXN0L21pbmlnemlwLmMgemxpYi5oIHpjb25mLmgKKworCisjIHRoZSBjb21tYW5kIGxpbmUgaXMgY3V0IHRvIGZpdCBpbiB0aGUgTVMtRE9TIDEyOCBieXRlIGxpbWl0OgorJChaTElCX0xJQik6ICQoT0JKMSkgJChPQkoyKQorCS1kZWwgJChaTElCX0xJQikKKwkkKEFSKSAkKFpMSUJfTElCKSAkKE9CSlAxKQorCSQoQVIpICQoWkxJQl9MSUIpICQoT0JKUDIpCisKK2V4YW1wbGUuZXhlOiBleGFtcGxlLm9iaiAkKFpMSUJfTElCKQorCSQoTEQpICQoTERGTEFHUykgZXhhbXBsZS5vYmogJChaTElCX0xJQikKKworbWluaWd6aXAuZXhlOiBtaW5pZ3ppcC5vYmogJChaTElCX0xJQikKKwkkKExEKSAkKExERkxBR1MpIG1pbmlnemlwLm9iaiAkKFpMSUJfTElCKQorCit0ZXN0OiBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKKwlleGFtcGxlCisJZWNobyBoZWxsbyB3b3JsZCB8IG1pbmlnemlwIHwgbWluaWd6aXAgLWQKKworY2xlYW46CisJLWRlbCAqLm9iagorCS1kZWwgKi5saWIKKwktZGVsICouZXhlCisJLWRlbCB6bGliXyouYmFrCisJLWRlbCBmb28uZ3oKZGlmZiAtLWdpdCBhL3psaWIvc3JjL25pbnRlbmRvZHMvTWFrZWZpbGUgYi96bGliL3NyYy9uaW50ZW5kb2RzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMzM3ZDAKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9uaW50ZW5kb2RzL01ha2VmaWxlCkBAIC0wLDAgKzEsMTI2IEBACisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisuU1VGRklYRVM6CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2lmZXEgKCQoc3RyaXAgJChERVZLSVRBUk0pKSwpCiskKGVycm9yICJQbGVhc2Ugc2V0IERFVktJVEFSTSBpbiB5b3VyIGVudmlyb25tZW50LiBleHBvcnQgREVWS0lUQVJNPTxwYXRoIHRvPmRldmtpdEFSTSIpCitlbmRpZgorCitpbmNsdWRlICQoREVWS0lUQVJNKS9kc19ydWxlcworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRBUkdFVCBpcyB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0CisjIEJVSUxEIGlzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgb2JqZWN0IGZpbGVzICYgaW50ZXJtZWRpYXRlIGZpbGVzIHdpbGwgYmUgcGxhY2VkCisjIFNPVVJDRVMgaXMgYSBsaXN0IG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgc291cmNlIGNvZGUKKyMgREFUQSBpcyBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgY29udGFpbmluZyBkYXRhIGZpbGVzCisjIElOQ0xVREVTIGlzIGEgbGlzdCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIGhlYWRlciBmaWxlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVEFSR0VUCQk6PQkkKHNoZWxsIGJhc2VuYW1lICQoQ1VSRElSKSkKK0JVSUxECQk6PQlidWlsZAorU09VUkNFUwkJOj0JLi4vLi4vCitEQVRBCQk6PQlkYXRhCitJTkNMVURFUwk6PQlpbmNsdWRlCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgb3B0aW9ucyBmb3IgY29kZSBnZW5lcmF0aW9uCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBUkNICTo9CS1tdGh1bWIgLW10aHVtYi1pbnRlcndvcmsKKworQ0ZMQUdTCTo9CS1XYWxsIC1PMlwKKwkJLW1hcmNoPWFybXY1dGUgLW10dW5lPWFybTk0NmUtcyBcCisJCS1mb21pdC1mcmFtZS1wb2ludGVyIC1mZmFzdC1tYXRoIFwKKwkJJChBUkNIKQorCitDRkxBR1MJKz0JJChJTkNMVURFKSAtREFSTTkKK0NYWEZMQUdTCTo9ICQoQ0ZMQUdTKSAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zCisKK0FTRkxBR1MJOj0JJChBUkNIKSAtbWFyY2g9YXJtdjV0ZSAtbXR1bmU9YXJtOTQ2ZS1zCitMREZMQUdTCT0JLXNwZWNzPWRzX2FybTkuc3BlY3MgLWcgJChBUkNIKSAtV2wsLU1hcCwkKG5vdGRpciAkKi5tYXApCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgbGlzdCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIGxpYnJhcmllcywgdGhpcyBtdXN0IGJlIHRoZSB0b3AgbGV2ZWwgY29udGFpbmluZworIyBpbmNsdWRlIGFuZCBsaWIKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xJQkRJUlMJOj0JJChMSUJORFMpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgbm8gcmVhbCBuZWVkIHRvIGVkaXQgYW55dGhpbmcgcGFzdCB0aGlzIHBvaW50IHVubGVzcyB5b3UgbmVlZCB0byBhZGQgYWRkaXRpb25hbAorIyBydWxlcyBmb3IgZGlmZmVyZW50IGZpbGUgZXh0ZW5zaW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraWZuZXEgKCQoQlVJTEQpLCQobm90ZGlyICQoQ1VSRElSKSkpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2V4cG9ydCBPVVRQVVQJOj0JJChDVVJESVIpL2xpYi9saWJ6LmEKKworZXhwb3J0IFZQQVRICTo9CSQoZm9yZWFjaCBkaXIsJChTT1VSQ0VTKSwkKENVUkRJUikvJChkaXIpKSBcCisJCQkkKGZvcmVhY2ggZGlyLCQoREFUQSksJChDVVJESVIpLyQoZGlyKSkKKworZXhwb3J0IERFUFNESVIJOj0JJChDVVJESVIpLyQoQlVJTEQpCisKK0NGSUxFUwkJOj0JJChmb3JlYWNoIGRpciwkKFNPVVJDRVMpLCQobm90ZGlyICQod2lsZGNhcmQgJChkaXIpLyouYykpKQorQ1BQRklMRVMJOj0JJChmb3JlYWNoIGRpciwkKFNPVVJDRVMpLCQobm90ZGlyICQod2lsZGNhcmQgJChkaXIpLyouY3BwKSkpCitTRklMRVMJCTo9CSQoZm9yZWFjaCBkaXIsJChTT1VSQ0VTKSwkKG5vdGRpciAkKHdpbGRjYXJkICQoZGlyKS8qLnMpKSkKK0JJTkZJTEVTCTo9CSQoZm9yZWFjaCBkaXIsJChEQVRBKSwkKG5vdGRpciAkKHdpbGRjYXJkICQoZGlyKS8qLiopKSkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB1c2UgQ1hYIGZvciBsaW5raW5nIEMrKyBwcm9qZWN0cywgQ0MgZm9yIHN0YW5kYXJkIEMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2lmZXEgKCQoc3RyaXAgJChDUFBGSUxFUykpLCkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlleHBvcnQgTEQJOj0JJChDQykKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Vsc2UKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlleHBvcnQgTEQJOj0JJChDWFgpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitlbmRpZgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitleHBvcnQgT0ZJTEVTCTo9CSQoYWRkc3VmZml4IC5vLCQoQklORklMRVMpKSBcCisJCQkkKENQUEZJTEVTOi5jcHA9Lm8pICQoQ0ZJTEVTOi5jPS5vKSAkKFNGSUxFUzoucz0ubykKKworZXhwb3J0IElOQ0xVREUJOj0JJChmb3JlYWNoIGRpciwkKElOQ0xVREVTKSwtSSQoQ1VSRElSKS8kKGRpcikpIFwKKwkJCSQoZm9yZWFjaCBkaXIsJChMSUJESVJTKSwtSSQoZGlyKS9pbmNsdWRlKSBcCisJCQktSSQoQ1VSRElSKS8kKEJVSUxEKQorCisuUEhPTlk6ICQoQlVJTEQpIGNsZWFuIGFsbAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCithbGw6ICQoQlVJTEQpCisJQFsgLWQgJEAgXSB8fCBta2RpciAtcCBpbmNsdWRlCisJQGNwIC4uLy4uLyouaCBpbmNsdWRlCisKK2xpYjoKKwlAWyAtZCAkQCBdIHx8IG1rZGlyIC1wICRACisJCiskKEJVSUxEKTogbGliCisJQFsgLWQgJEAgXSB8fCBta2RpciAtcCAkQAorCUAkKE1BS0UpIC0tbm8tcHJpbnQtZGlyZWN0b3J5IC1DICQoQlVJTEQpIC1mICQoQ1VSRElSKS9NYWtlZmlsZQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjbGVhbjoKKwlAZWNobyBjbGVhbiAuLi4KKwlAcm0gLWZyICQoQlVJTEQpIGxpYgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitlbHNlCisKK0RFUEVORFMJOj0JJChPRklMRVM6Lm89LmQpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgbWFpbiB0YXJnZXRzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskKE9VVFBVVCkJOgkkKE9GSUxFUykKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJS5iaW4ubwk6CSUuYmluCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJQGVjaG8gJChub3RkaXIgJDwpCisJQCQoYmluMm8pCisKKworLWluY2x1ZGUgJChERVBFTkRTKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitlbmRpZgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvbmludGVuZG9kcy9SRUFETUUgYi96bGliL3NyYy9uaW50ZW5kb2RzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTdhMzdkCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvbmludGVuZG9kcy9SRUFETUUKQEAgLTAsMCArMSw1IEBACitUaGlzIE1ha2VmaWxlIHJlcXVpcmVzIGRldmtpdEFSTSAoaHR0cDovL3d3dy5kZXZraXRwcm8ub3JnL2NhdGVnb3J5L2RldmtpdGFybS8pIGFuZCB3b3JrcyBpbnNpZGUgImNvbnRyaWIvbmRzIi4gSXQgaXMgYmFzZWQgb24gYSBkZXZraXRBUk0gdGVtcGxhdGUuCisKK0VkdWFyZG8gQ29zdGEgPGVkdWFyZG8ubS5jb3N0YUBnbWFpbC5jb20+CitKYW51YXJ5IDMsIDIwMDkKKwpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvb2xkL01ha2VmaWxlLmVteCBiL3psaWIvc3JjL29sZC9NYWtlZmlsZS5lbXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2YWIwZQotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL29sZC9NYWtlZmlsZS5lbXgKQEAgLTAsMCArMSw2OSBAQAorIyBNYWtlZmlsZSBmb3IgemxpYi4gIE1vZGlmaWVkIGZvciBlbXgvcnN4bnQgYnkgQ2hyLiBTcGllbGVyLCA2LzE2Lzk4LgorIyBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBKZWFuLWxvdXAgR2FpbGx5LgorIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisKKyMgVG8gY29tcGlsZSwgb3IgdG8gY29tcGlsZSBhbmQgdGVzdCwgdHlwZToKKyMKKyMgICBtYWtlIC1mbWFrZWZpbGUuZW14OyAgbWFrZSB0ZXN0IC1mbWFrZWZpbGUuZW14CisjCisKK0NDPWdjYyAtWndpbjMyCisKKyNDRkxBR1M9LU1NRCAtTworI0NGTEFHUz0tTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NworI0NGTEFHUz0tTU1EIC1nIC1EREVCVUcKK0NGTEFHUz0tTU1EIC1PMyAkKEJVVFQpIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdjb252ZXJzaW9uIFwKKyAgICAgICAgICAgICAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzCisKKyMgSWYgY3AuZXhlIGlzIGF2YWlsYWJsZSwgcmVwbGFjZSAiY29weSAvWSIgd2l0aCAiY3AgLWZwIiAuCitDUD1jb3B5IC9ZCisjIElmIGdudSBpbnN0YWxsLmV4ZSBpcyBhdmFpbGFibGUsIHJlcGxhY2UgJChDUCkgd2l0aCBnaW5zdGFsbC4KK0lOU1RBTEw9JChDUCkKKyMgVGhlIGRlZmF1bHQgdmFsdWUgb2YgUk0gaXMgInJtIC1mLiIgIElmICJybS5leGUiIGlzIGZvdW5kLCBjb21tZW50IG91dDoKK1JNPWRlbAorTERMSUJTPS1MLiAtbHpsaWIKK0xEPSQoQ0MpIC1zIC1vCitMRFNIQVJFRD0kKENDKQorCitJTkNMPXpsaWIuaCB6Y29uZi5oCitMSUJTPXpsaWIuYQorCitBUj1hciByY3MKKworcHJlZml4PS91c3IvbG9jYWwKK2V4ZWNfcHJlZml4ID0gJChwcmVmaXgpCisKK09CSlMgPSBhZGxlcjMyLm8gY29tcHJlc3MubyBjcmMzMi5vIGRlZmxhdGUubyBnemNsb3NlLm8gZ3psaWIubyBnenJlYWQubyBcCisgICAgICAgZ3p3cml0ZS5vIGluZmJhY2subyBpbmZmYXN0Lm8gaW5mbGF0ZS5vIGluZnRyZWVzLm8gdHJlZXMubyB1bmNvbXByLm8genV0aWwubworCitURVNUX09CSlMgPSBleGFtcGxlLm8gbWluaWd6aXAubworCithbGw6IGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQorCit0ZXN0OiBhbGwKKwkuL2V4YW1wbGUKKwllY2hvIGhlbGxvIHdvcmxkIHwgLlxtaW5pZ3ppcCB8IC5cbWluaWd6aXAgLWQKKworJS5vIDogJS5jCisJJChDQykgJChDRkxBR1MpIC1jICQ8IC1vICRACisKK3psaWIuYTogJChPQkpTKQorCSQoQVIpICRAICQoT0JKUykKKworJS5leGUgOiAlLm8gJChMSUJTKQorCSQoTEQpICRAICQ8ICQoTERMSUJTKQorCisKKy5QSE9OWSA6IGNsZWFuCisKK2NsZWFuOgorCSQoUk0pICouZAorCSQoUk0pICoubworCSQoUk0pICouZXhlCisJJChSTSkgemxpYi5hCisJJChSTSkgZm9vLmd6CisKK0RFUFMgOj0gJCh3aWxkY2FyZCAqLmQpCitpZm5lcSAoJChERVBTKSwpCitpbmNsdWRlICQoREVQUykKK2VuZGlmCmRpZmYgLS1naXQgYS96bGliL3NyYy9vbGQvTWFrZWZpbGUucmlzY29zIGIvemxpYi9zcmMvb2xkL01ha2VmaWxlLnJpc2NvcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2UyOWQzCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvb2xkL01ha2VmaWxlLnJpc2NvcwpAQCAtMCwwICsxLDE1MSBAQAorIyBQcm9qZWN0OiAgIHpsaWJfMV8wMworIyBQYXRjaGVkIGZvciB6bGliIDEuMS4yIHJ3QHNoYWRvdy5vcmcudWsgMTk5ODA0MzAKKyMgdGVzdCB3b3JrcyBvdXQtb2YtdGhlLWJveCwgaW5zdGFsbHMgYHNvbWV3aGVyZScgb24gZGVtYW5kCisKKyMgVG9vbGZsYWdzOgorQ0NmbGFncyA9IC1jIC1kZXBlbmQgIURlcGVuZCAtSUM6IC1nIC10aHJvd2JhY2sgIC1EUklTQ09TICAtZmFoCitDKytmbGFncyA9IC1jIC1kZXBlbmQgIURlcGVuZCAtSUM6IC10aHJvd2JhY2sKK0xpbmtmbGFncyA9IC1haWYgLWMrKyAtbyAkQAorT2JqQXNtZmxhZ3MgPSAtdGhyb3diYWNrIC1Ob0NhY2hlIC1kZXBlbmQgIURlcGVuZAorQ01IR2ZsYWdzID0KK0xpYkZpbGVmbGFncyA9IC1jIC1sIC1vICRACitTcXVlZXplZmxhZ3MgPSAtbyAkQAorCisjIGNoYW5nZSB0aGUgbGluZSBiZWxvdyB0byB3aGVyZSBfeW91XyB3YW50IHRoZSBsaWJyYXJ5IGluc3RhbGxlZC4KK2xpYmRlc3QgPSBsaWI6emxpYgorCisjIEZpbmFsIHRhcmdldHM6CitALmxpYjogICBALm8uYWRsZXIzMiBALm8uY29tcHJlc3MgQC5vLmNyYzMyIEAuby5kZWZsYXRlIEAuby5nemlvIFwKKyAgICAgICAgQC5vLmluZmJsb2NrIEAuby5pbmZjb2RlcyBALm8uaW5mZmFzdCBALm8uaW5mbGF0ZSBALm8uaW5mdHJlZXMgQC5vLmluZnV0aWwgQC5vLnRyZWVzIFwKKyAgICAgICAgQC5vLnVuY29tcHIgQC5vLnp1dGlsCisgICAgICAgIExpYkZpbGUgJChMaWJGaWxlZmxhZ3MpIEAuby5hZGxlcjMyIEAuby5jb21wcmVzcyBALm8uY3JjMzIgQC5vLmRlZmxhdGUgXAorICAgICAgICBALm8uZ3ppbyBALm8uaW5mYmxvY2sgQC5vLmluZmNvZGVzIEAuby5pbmZmYXN0IEAuby5pbmZsYXRlIEAuby5pbmZ0cmVlcyBALm8uaW5mdXRpbCBcCisgICAgICAgIEAuby50cmVlcyBALm8udW5jb21wciBALm8uenV0aWwKK3Rlc3Q6ICAgQC5taW5pZ3ppcCBALmV4YW1wbGUgQC5saWIKKwlAY29weSBALmxpYiBALmxpYmMgIEF+Q35ERn5Mfk5+UH5RflJTflRWCisJQGVjaG8gcnVubmluZyB0ZXN0czogaGFuZyBvbi4KKwlAL0AubWluaWd6aXAgLWYgLTkgbGliYworCUAvQC5taW5pZ3ppcCAtZCBsaWJjLWd6CisJQC9ALm1pbmlnemlwIC1mIC0xIGxpYmMKKwlAL0AubWluaWd6aXAgLWQgbGliYy1negorCUAvQC5taW5pZ3ppcCAtaCAtOSBsaWJjCisJQC9ALm1pbmlnemlwIC1kIGxpYmMtZ3oKKwlAL0AubWluaWd6aXAgLWggLTEgbGliYworCUAvQC5taW5pZ3ppcCAtZCBsaWJjLWd6CisJQC9ALm1pbmlnemlwIC05IGxpYmMKKwlAL0AubWluaWd6aXAgLWQgbGliYy1negorCUAvQC5taW5pZ3ppcCAtMSBsaWJjCisJQC9ALm1pbmlnemlwIC1kIGxpYmMtZ3oKKwlAZGlmZiBALmxpYiBALmxpYmMKKwlAZWNobyB0aGF0IHNob3VsZCBoYXZlIHJlcG9ydGVkICdALmxpYiBhbmQgQC5saWJjIGlkZW50aWNhbCcgaWYgeW91IGhhdmUgZGlmZi4KKwlAL0AuZXhhbXBsZSBALmZyZWQgQC5mcmVkCisJQGVjaG8gdGhhdCB3aWxsIGhhdmUgZ2l2ZW4gbG90cyBvZiBoZWxsbyEncy4KKworQC5taW5pZ3ppcDogICBALm8ubWluaWd6aXAgQC5saWIgQzpvLlN0dWJzCisgICAgICAgIExpbmsgJChMaW5rZmxhZ3MpIEAuby5taW5pZ3ppcCBALmxpYiBDOm8uU3R1YnMKK0AuZXhhbXBsZTogICBALm8uZXhhbXBsZSBALmxpYiBDOm8uU3R1YnMKKyAgICAgICAgTGluayAkKExpbmtmbGFncykgQC5vLmV4YW1wbGUgQC5saWIgQzpvLlN0dWJzCisKK2luc3RhbGw6IEAubGliCisJY2RpciAkKGxpYmRlc3QpCisJY2RpciAkKGxpYmRlc3QpLmgKKwlAY29weSBALmguemxpYiAkKGxpYmRlc3QpLmguemxpYiBBfkN+REZ+TH5OflB+UX5SU35UVgorCUBjb3B5IEAuaC56Y29uZiAkKGxpYmRlc3QpLmguemNvbmYgQX5DfkRGfkx+Tn5QflF+UlN+VFYKKwlAY29weSBALmxpYiAkKGxpYmRlc3QpLmxpYiAgQX5DfkRGfkx+Tn5QflF+UlN+VFYKKwlAZWNobyBva2F5LCBpbnN0YWxsZWQgemxpYiBpbiAkKGxpYmRlc3QpCisKK2NsZWFuOjsgcmVtb3ZlIEAubWluaWd6aXAKKwlyZW1vdmUgQC5leGFtcGxlCisJcmVtb3ZlIEAubGliYworCS13aXBlIEAuby4qIEZ+cn5jVgorCXJlbW92ZSBALmZyZWQKKworIyBVc2VyLWVkaXRhYmxlIGRlcGVuZGVuY2llczoKKy5jLm86CisgICAgICAgIGNjICQoY2NmbGFncykgLW8gJEAgJDwKKworIyBTdGF0aWMgZGVwZW5kZW5jaWVzOgorCisjIER5bmFtaWMgZGVwZW5kZW5jaWVzOgorby5leGFtcGxlOgljLmV4YW1wbGUKK28uZXhhbXBsZToJaC56bGliCitvLmV4YW1wbGU6CWguemNvbmYKK28ubWluaWd6aXA6CWMubWluaWd6aXAKK28ubWluaWd6aXA6CWguemxpYgorby5taW5pZ3ppcDoJaC56Y29uZgorby5hZGxlcjMyOgljLmFkbGVyMzIKK28uYWRsZXIzMjoJaC56bGliCitvLmFkbGVyMzI6CWguemNvbmYKK28uY29tcHJlc3M6CWMuY29tcHJlc3MKK28uY29tcHJlc3M6CWguemxpYgorby5jb21wcmVzczoJaC56Y29uZgorby5jcmMzMjoJYy5jcmMzMgorby5jcmMzMjoJaC56bGliCitvLmNyYzMyOgloLnpjb25mCitvLmRlZmxhdGU6CWMuZGVmbGF0ZQorby5kZWZsYXRlOgloLmRlZmxhdGUKK28uZGVmbGF0ZToJaC56dXRpbAorby5kZWZsYXRlOgloLnpsaWIKK28uZGVmbGF0ZToJaC56Y29uZgorby5nemlvOgljLmd6aW8KK28uZ3ppbzoJaC56dXRpbAorby5nemlvOgloLnpsaWIKK28uZ3ppbzoJaC56Y29uZgorby5pbmZibG9jazoJYy5pbmZibG9jaworby5pbmZibG9jazoJaC56dXRpbAorby5pbmZibG9jazoJaC56bGliCitvLmluZmJsb2NrOgloLnpjb25mCitvLmluZmJsb2NrOgloLmluZmJsb2NrCitvLmluZmJsb2NrOgloLmluZnRyZWVzCitvLmluZmJsb2NrOgloLmluZmNvZGVzCitvLmluZmJsb2NrOgloLmluZnV0aWwKK28uaW5mY29kZXM6CWMuaW5mY29kZXMKK28uaW5mY29kZXM6CWguenV0aWwKK28uaW5mY29kZXM6CWguemxpYgorby5pbmZjb2RlczoJaC56Y29uZgorby5pbmZjb2RlczoJaC5pbmZ0cmVlcworby5pbmZjb2RlczoJaC5pbmZibG9jaworby5pbmZjb2RlczoJaC5pbmZjb2Rlcworby5pbmZjb2RlczoJaC5pbmZ1dGlsCitvLmluZmNvZGVzOgloLmluZmZhc3QKK28uaW5mZmFzdDoJYy5pbmZmYXN0CitvLmluZmZhc3Q6CWguenV0aWwKK28uaW5mZmFzdDoJaC56bGliCitvLmluZmZhc3Q6CWguemNvbmYKK28uaW5mZmFzdDoJaC5pbmZ0cmVlcworby5pbmZmYXN0OgloLmluZmJsb2NrCitvLmluZmZhc3Q6CWguaW5mY29kZXMKK28uaW5mZmFzdDoJaC5pbmZ1dGlsCitvLmluZmZhc3Q6CWguaW5mZmFzdAorby5pbmZsYXRlOgljLmluZmxhdGUKK28uaW5mbGF0ZToJaC56dXRpbAorby5pbmZsYXRlOgloLnpsaWIKK28uaW5mbGF0ZToJaC56Y29uZgorby5pbmZsYXRlOgloLmluZmJsb2NrCitvLmluZnRyZWVzOgljLmluZnRyZWVzCitvLmluZnRyZWVzOgloLnp1dGlsCitvLmluZnRyZWVzOgloLnpsaWIKK28uaW5mdHJlZXM6CWguemNvbmYKK28uaW5mdHJlZXM6CWguaW5mdHJlZXMKK28uaW5mdHJlZXM6CWguaW5mZml4ZWQKK28uaW5mdXRpbDoJYy5pbmZ1dGlsCitvLmluZnV0aWw6CWguenV0aWwKK28uaW5mdXRpbDoJaC56bGliCitvLmluZnV0aWw6CWguemNvbmYKK28uaW5mdXRpbDoJaC5pbmZibG9jaworby5pbmZ1dGlsOgloLmluZnRyZWVzCitvLmluZnV0aWw6CWguaW5mY29kZXMKK28uaW5mdXRpbDoJaC5pbmZ1dGlsCitvLnRyZWVzOgljLnRyZWVzCitvLnRyZWVzOgloLmRlZmxhdGUKK28udHJlZXM6CWguenV0aWwKK28udHJlZXM6CWguemxpYgorby50cmVlczoJaC56Y29uZgorby50cmVlczoJaC50cmVlcworby51bmNvbXByOgljLnVuY29tcHIKK28udW5jb21wcjoJaC56bGliCitvLnVuY29tcHI6CWguemNvbmYKK28uenV0aWw6CWMuenV0aWwKK28uenV0aWw6CWguenV0aWwKK28uenV0aWw6CWguemxpYgorby56dXRpbDoJaC56Y29uZgpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvb2xkL1JFQURNRSBiL3psaWIvc3JjL29sZC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAwYmYwNwotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL29sZC9SRUFETUUKQEAgLTAsMCArMSwzIEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBmaWxlcyB0aGF0IGhhdmUgbm90IGJlZW4gdXBkYXRlZCBmb3IgemxpYiAxLjIueAorCisoVm9sdW50ZWVycyBhcmUgZW5jb3VyYWdlZCB0byBoZWxwIGNsZWFuIHRoaXMgdXAuICBUaGFua3MuKQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvb2xkL2Rlc2NyaXAubW1zIGIvemxpYi9zcmMvb2xkL2Rlc2NyaXAubW1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNjZkYTUKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy9vbGQvZGVzY3JpcC5tbXMKQEAgLTAsMCArMSw0OCBAQAorIyBkZXNjcmlwLm1tczogTU1TIGRlc2NyaXB0aW9uIGZpbGUgZm9yIGJ1aWxkaW5nIHpsaWIgb24gVk1TCisjIHdyaXR0ZW4gYnkgTWFydGluIFAuSi4gWmluc2VyIDxtLnppbnNlckBnc2kuZGU+CisKK2NjX2RlZnMgPQorY19kZWIgPQorCisuaWZkZWYgX19ERUNDX18KK3ByZWYgPSAvcHJlZml4PWFsbAorLmVuZGlmCisKK09CSlMgPSBhZGxlcjMyLm9iaiwgY29tcHJlc3Mub2JqLCBjcmMzMi5vYmosIGd6aW8ub2JqLCB1bmNvbXByLm9iaixcCisgICAgICAgZGVmbGF0ZS5vYmosIHRyZWVzLm9iaiwgenV0aWwub2JqLCBpbmZsYXRlLm9iaiwgaW5mYmxvY2sub2JqLFwKKyAgICAgICBpbmZ0cmVlcy5vYmosIGluZmNvZGVzLm9iaiwgaW5mdXRpbC5vYmosIGluZmZhc3Qub2JqCisKK0NGTEFHUz0gJChDX0RFQikgJChDQ19ERUZTKSAkKFBSRUYpCisKK2FsbCA6IGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQorICAgICAgICBAIHdyaXRlIHN5cyRvdXRwdXQgIiBFeGFtcGxlIGFwcGxpY2F0aW9ucyBhdmFpbGFibGUiCitsaWJ6Lm9sYiA6IGxpYnoub2xiKCQoT0JKUykpCisJQCB3cml0ZSBzeXMkb3V0cHV0ICIgbGlieiBhdmFpbGFibGUiCisKK2V4YW1wbGUuZXhlIDogZXhhbXBsZS5vYmogbGliei5vbGIKKyAgICAgICAgICAgICAgbGluayBleGFtcGxlLGxpYnoub2xiL2xpYgorCittaW5pZ3ppcC5leGUgOiBtaW5pZ3ppcC5vYmogbGliei5vbGIKKyAgICAgICAgICAgICAgbGluayBtaW5pZ3ppcCxsaWJ6Lm9sYi9saWIseDExdm1zOnh2bXN1dGlscy5vbGIvbGliCisKK2NsZWFuIDoKKwlkZWxldGUgKi5vYmo7KixsaWJ6Lm9sYjsqCisKKworIyBPdGhlciBkZXBlbmRlbmNpZXMuCithZGxlcjMyLm9iaiA6IHp1dGlsLmggemxpYi5oIHpjb25mLmgKK2NvbXByZXNzLm9iaiA6IHpsaWIuaCB6Y29uZi5oCitjcmMzMi5vYmogOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitkZWZsYXRlLm9iaiA6IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitleGFtcGxlLm9iaiA6IHpsaWIuaCB6Y29uZi5oCitnemlvLm9iaiA6IHp1dGlsLmggemxpYi5oIHpjb25mLmgKK2luZmJsb2NrLm9iaiA6IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mYmxvY2suaCBpbmZ0cmVlcy5oIGluZmNvZGVzLmggaW5mdXRpbC5oCitpbmZjb2Rlcy5vYmogOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mdXRpbC5oIGluZmNvZGVzLmggaW5mZmFzdC5oCitpbmZmYXN0Lm9iaiA6IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZ1dGlsLmggaW5mZmFzdC5oCitpbmZsYXRlLm9iaiA6IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mYmxvY2suaAoraW5mdHJlZXMub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCitpbmZ1dGlsLm9iaiA6IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZ1dGlsLmgKK21pbmlnemlwLm9iaiA6IHpsaWIuaCB6Y29uZi5oCit0cmVlcy5vYmogOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAordW5jb21wci5vYmogOiB6bGliLmggemNvbmYuaAorenV0aWwub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaApkaWZmIC0tZ2l0IGEvemxpYi9zcmMvb2xkL29zMi9NYWtlZmlsZS5vczIgYi96bGliL3NyYy9vbGQvb3MyL01ha2VmaWxlLm9zMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTA1YWFhCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvb2xkL29zMi9NYWtlZmlsZS5vczIKQEAgLTAsMCArMSwxMzYgQEAKKyMgTWFrZWZpbGUgZm9yIHpsaWIgdW5kZXIgT1MvMiB1c2luZyBHQ0MgKFBHQ0MpCisjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKworIyBUbyBjb21waWxlIGFuZCB0ZXN0LCB0eXBlOgorIyAgIGNwIE1ha2VmaWxlLm9zMiAuLgorIyAgIGNkIC4uCisjICAgbWFrZSAtZiBNYWtlZmlsZS5vczIgdGVzdAorCisjIFRoaXMgbWFrZWZpbGUgd2lsbCBidWlsZCBhIHN0YXRpYyBsaWJyYXJ5IHoubGliLCBhIHNoYXJlZCBsaWJyYXJ5CisjIHouZGxsIGFuZCBhIGltcG9ydCBsaWJyYXJ5IHpkbGwubGliLiBZb3UgY2FuIHVzZSBlaXRoZXIgei5saWIgb3IKKyMgemRsbC5saWIgYnkgc3BlY2lmeWluZyBlaXRoZXIgLWx6IG9yIC1semRsbCBvbiBnY2MncyBjb21tYW5kIGxpbmUKKworQ0M9Z2NjIC1ab21mIC1zCisKK0NGTEFHUz0tTzYgLVdhbGwKKyNDRkxBR1M9LU8gLURNQVhfV0JJVFM9MTQgLURNQVhfTUVNX0xFVkVMPTcKKyNDRkxBR1M9LWcgLURERUJVRworI0NGTEFHUz0tTzMgLVdhbGwgLVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV2NvbnZlcnNpb24gXAorIyAgICAgICAgICAgLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyBCVUcgV0FSTklORzogIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBpbmZjb2Rlcy5jIGhpdHMgYSBidWcgaW4gcGdjYy0xLjAsIHNvIHlvdSBoYXZlIHRvIHVzZSBlaXRoZXIKKyMjIC1PIyB3aGVyZSAjIDw9IDQgb3Igb25lIG9mICgtZm5vLW9tbWl0LWZyYW1lLXBvaW50ZXIgb3IgLWZuby1mb3JjZS1tZW0pCisjIyBUaGlzIGJ1ZyBpcyByZXBvcnRlZGx5IGZpeGVkIGluIHBnY2MgPjEuMCwgYnV0IHRoaXMgd2FzIG5vdCB0ZXN0ZWQKK0NGTEFHUys9LWZuby1mb3JjZS1tZW0KKworTERGTEFHUz0tcyAtTC4gLWx6ZGxsIC1aY3J0ZGxsCitMRFNIQVJFRD0kKENDKSAtcyAtWm9tZiAtWmRsbCAtWmNydGRsbAorCitWRVI9MS4xLjAKK1pMSUI9ei5saWIKK1NIQVJFRExJQj16LmRsbAorU0hBUkVETElCSU1QPXpkbGwubGliCitMSUJTPSQoWkxJQikgJChTSEFSRURMSUIpICQoU0hBUkVETElCSU1QKQorCitBUj1lbXhvbWZhciBjcgorSU1QTElCPWVteGltcAorUkFOTElCPWVjaG8KK1RBUj10YXIKK1NIRUxMPWJhc2gKKworcHJlZml4PS91c3IvbG9jYWwKK2V4ZWNfcHJlZml4ID0gJChwcmVmaXgpCisKK09CSlMgPSBhZGxlcjMyLm8gY29tcHJlc3MubyBjcmMzMi5vIGd6aW8ubyB1bmNvbXByLm8gZGVmbGF0ZS5vIHRyZWVzLm8gXAorICAgICAgIHp1dGlsLm8gaW5mbGF0ZS5vIGluZmJsb2NrLm8gaW5mdHJlZXMubyBpbmZjb2Rlcy5vIGluZnV0aWwubyBpbmZmYXN0Lm8KKworVEVTVF9PQkpTID0gZXhhbXBsZS5vIG1pbmlnemlwLm8KKworRElTVEZJTEVTID0gUkVBRE1FIElOREVYIENoYW5nZUxvZyBjb25maWd1cmUgTWFrZSpbYS16MC05XSAqLltjaF0gZGVzY3JpcC5tbXMgXAorICBhbGdvcml0aG0udHh0IHpsaWIuMyBtc2Rvcy9NYWtlKlthLXowLTldIG1zZG9zL3psaWIuZGVmIG1zZG9zL3psaWIucmMgXAorICBudC9NYWtlZmlsZS5udCBudC96bGliLmRudCAgY29udHJpYi9SRUFETUUuY29udHJpYiBjb250cmliLyoudHh0IFwKKyAgY29udHJpYi9hc20zODYvKi5hc20gY29udHJpYi9hc20zODYvKi5jIFwKKyAgY29udHJpYi9hc20zODYvKi5iYXQgY29udHJpYi9hc20zODYvemxpYnZjLmQ/PyBjb250cmliL2lvc3RyZWFtLyouY3BwIFwKKyAgY29udHJpYi9pb3N0cmVhbS8qLmggIGNvbnRyaWIvaW9zdHJlYW0yLyouaCBjb250cmliL2lvc3RyZWFtMi8qLmNwcCBcCisgIGNvbnRyaWIvdW50Z3ovTWFrZWZpbGUgY29udHJpYi91bnRnei8qLmMgY29udHJpYi91bnRnei8qLnczMgorCithbGw6IGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQorCit0ZXN0OiBhbGwKKwlATERfTElCUkFSWV9QQVRIPS46JChMRF9MSUJSQVJZX1BBVEgpIDsgZXhwb3J0IExEX0xJQlJBUllfUEFUSDsgXAorCWVjaG8gaGVsbG8gd29ybGQgfCAuL21pbmlnemlwIHwgLi9taW5pZ3ppcCAtZCB8fCBcCisJICBlY2hvICcJCSoqKiBtaW5pZ3ppcCB0ZXN0IEZBSUxFRCAqKionIDsgXAorCWlmIC4vZXhhbXBsZTsgdGhlbiBcCisJICBlY2hvICcJCSoqKiB6bGliIHRlc3QgT0sgKioqJzsgXAorCWVsc2UgXAorCSAgZWNobyAnCQkqKiogemxpYiB0ZXN0IEZBSUxFRCAqKionOyBcCisJZmkKKworJChaTElCKTogJChPQkpTKQorCSQoQVIpICRAICQoT0JKUykKKwktQCAoJChSQU5MSUIpICRAIHx8IHRydWUpID4vZGV2L251bGwgMj4mMQorCiskKFNIQVJFRExJQik6ICQoT0JKUykgb3MyL3ouZGVmCisJJChMRFNIQVJFRCkgLW8gJEAgJF4KKworJChTSEFSRURMSUJJTVApOiBvczIvei5kZWYKKwkkKElNUExJQikgLW8gJEAgJF4KKworZXhhbXBsZS5leGU6IGV4YW1wbGUubyAkKExJQlMpCisJJChDQykgJChDRkxBR1MpIC1vICRAIGV4YW1wbGUubyAkKExERkxBR1MpCisKK21pbmlnemlwLmV4ZTogbWluaWd6aXAubyAkKExJQlMpCisJJChDQykgJChDRkxBR1MpIC1vICRAIG1pbmlnemlwLm8gJChMREZMQUdTKQorCitjbGVhbjoKKwlybSAtZiAqLm8gKn4gZXhhbXBsZSBtaW5pZ3ppcCBsaWJ6LmEgbGliei5zbyogZm9vLmd6CisKK2Rpc3RjbGVhbjoJY2xlYW4KKworemlwOgorCW12IE1ha2VmaWxlIE1ha2VmaWxlfjsgY3AgLXAgTWFrZWZpbGUuaW4gTWFrZWZpbGUKKwlybSAtZiB0ZXN0LmMgenRlc3QqLmMKKwl2PWBzZWQgLW4gLWUgJ3MvXC4vL2cnIC1lICcvVkVSU0lPTiAiL3MvLioiXCguKlwpIi4qL1wxL3AnIDwgemxpYi5oYDtcCisJemlwIC11bDkgemxpYiQkdiAkKERJU1RGSUxFUykKKwltdiBNYWtlZmlsZX4gTWFrZWZpbGUKKworZGlzdDoKKwltdiBNYWtlZmlsZSBNYWtlZmlsZX47IGNwIC1wIE1ha2VmaWxlLmluIE1ha2VmaWxlCisJcm0gLWYgdGVzdC5jIHp0ZXN0Ki5jCisJZD16bGliLWBzZWQgLW4gJy9WRVJTSU9OICIvcy8uKiJcKC4qXCkiLiovXDEvcCcgPCB6bGliLmhgO1wKKwlybSAtZiAkJGQudGFyLmd6OyBcCisJaWYgdGVzdCAhIC1kIC4uLyQkZDsgdGhlbiBybSAtZiAuLi8kJGQ7IGxuIC1zIGBwd2RgIC4uLyQkZDsgZmk7IFwKKwlmaWxlcz0iIjsgXAorCWZvciBmIGluICQoRElTVEZJTEVTKTsgZG8gZmlsZXM9IiQkZmlsZXMgJCRkLyQkZiI7IGRvbmU7IFwKKwljZCAuLjsgXAorCUdaSVA9LTkgJChUQVIpIGNob2Z6ICQkZC8kJGQudGFyLmd6ICQkZmlsZXM7IFwKKwlpZiB0ZXN0ICEgLWQgJCRkOyB0aGVuIHJtIC1mICQkZDsgZmkKKwltdiBNYWtlZmlsZX4gTWFrZWZpbGUKKwordGFnczoKKwlldGFncyAqLltjaF0KKworZGVwZW5kOgorCW1ha2VkZXBlbmQgLS0gJChDRkxBR1MpIC0tICouW2NoXQorCisjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCisKK2FkbGVyMzIubzogemxpYi5oIHpjb25mLmgKK2NvbXByZXNzLm86IHpsaWIuaCB6Y29uZi5oCitjcmMzMi5vOiB6bGliLmggemNvbmYuaAorZGVmbGF0ZS5vOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAorZXhhbXBsZS5vOiB6bGliLmggemNvbmYuaAorZ3ppby5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitpbmZibG9jay5vOiBpbmZibG9jay5oIGluZnRyZWVzLmggaW5mY29kZXMuaCBpbmZ1dGlsLmggenV0aWwuaCB6bGliLmggemNvbmYuaAoraW5mY29kZXMubzogenV0aWwuaCB6bGliLmggemNvbmYuaAoraW5mY29kZXMubzogaW5mdHJlZXMuaCBpbmZibG9jay5oIGluZmNvZGVzLmggaW5mdXRpbC5oIGluZmZhc3QuaAoraW5mZmFzdC5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKK2luZmZhc3QubzogaW5mYmxvY2suaCBpbmZjb2Rlcy5oIGluZnV0aWwuaCBpbmZmYXN0LmgKK2luZmxhdGUubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZibG9jay5oCitpbmZ0cmVlcy5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKK2luZnV0aWwubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZibG9jay5oIGluZnRyZWVzLmggaW5mY29kZXMuaCBpbmZ1dGlsLmgKK21pbmlnemlwLm86IHpsaWIuaCB6Y29uZi5oCit0cmVlcy5vOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaCB0cmVlcy5oCit1bmNvbXByLm86IHpsaWIuaCB6Y29uZi5oCit6dXRpbC5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCmRpZmYgLS1naXQgYS96bGliL3NyYy9vbGQvb3MyL3psaWIuZGVmIGIvemxpYi9zcmMvb2xkL29zMi96bGliLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yzc1M2YxCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvb2xkL29zMi96bGliLmRlZgpAQCAtMCwwICsxLDUxIEBACis7Cis7IFNsaWdodGx5IG1vZGlmaWVkIHZlcnNpb24gb2YgLi4vbnQvemxpYi5kbnQgOi0pCis7CisKK0xJQlJBUlkJCVoKK0RFU0NSSVBUSU9OCSJabGliIGNvbXByZXNzaW9uIGxpYnJhcnkgZm9yIE9TLzIiCitDT0RFCQlQUkVMT0FEIE1PVkVBQkxFIERJU0NBUkRBQkxFCitEQVRBCQlQUkVMT0FEIE1PVkVBQkxFIE1VTFRJUExFCisKK0VYUE9SVFMKKyAgICBhZGxlcjMyCisgICAgY29tcHJlc3MKKyAgICBjcmMzMgorICAgIGRlZmxhdGUKKyAgICBkZWZsYXRlQ29weQorICAgIGRlZmxhdGVFbmQKKyAgICBkZWZsYXRlSW5pdDJfCisgICAgZGVmbGF0ZUluaXRfCisgICAgZGVmbGF0ZVBhcmFtcworICAgIGRlZmxhdGVSZXNldAorICAgIGRlZmxhdGVTZXREaWN0aW9uYXJ5CisgICAgZ3pjbG9zZQorICAgIGd6ZG9wZW4KKyAgICBnemVycm9yCisgICAgZ3pmbHVzaAorICAgIGd6b3BlbgorICAgIGd6cmVhZAorICAgIGd6d3JpdGUKKyAgICBpbmZsYXRlCisgICAgaW5mbGF0ZUVuZAorICAgIGluZmxhdGVJbml0Ml8KKyAgICBpbmZsYXRlSW5pdF8KKyAgICBpbmZsYXRlUmVzZXQKKyAgICBpbmZsYXRlU2V0RGljdGlvbmFyeQorICAgIGluZmxhdGVTeW5jCisgICAgdW5jb21wcmVzcworICAgIHpsaWJWZXJzaW9uCisgICAgZ3pwcmludGYKKyAgICBnenB1dGMKKyAgICBnemdldGMKKyAgICBnenNlZWsKKyAgICBnenJld2luZAorICAgIGd6dGVsbAorICAgIGd6ZW9mCisgICAgZ3pzZXRwYXJhbXMKKyAgICB6RXJyb3IKKyAgICBpbmZsYXRlU3luY1BvaW50CisgICAgZ2V0X2NyY190YWJsZQorICAgIGNvbXByZXNzMgorICAgIGd6cHV0cworICAgIGd6Z2V0cwpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvb2xkL3Zpc3VhbC1iYXNpYy50eHQgYi96bGliL3NyYy9vbGQvdmlzdWFsLWJhc2ljLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2VmZTU4Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvb2xkL3Zpc3VhbC1iYXNpYy50eHQKQEAgLTAsMCArMSwxNjAgQEAKK1NlZSBiZWxvdyBzb21lIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMgZm9yIFZpc3VhbCBCYXNpYy4KKworRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbjoKKworUTogRWFjaCB0aW1lIEkgdXNlIHRoZSBjb21wcmVzcyBmdW5jdGlvbiBJIGdldCB0aGUgLTUgZXJyb3IgKG5vdCBlbm91Z2gKKyAgIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIpLgorCitBOiBNYWtlIHN1cmUgdGhhdCB0aGUgbGVuZ3RoIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlciBpcyBwYXNzZWQgYnkKKyAgIHJlZmVyZW5jZSAoImFzIGFueSIpLCBub3QgYnkgdmFsdWUgKCJhcyBsb25nIikuIEFsc28gY2hlY2sgdGhhdAorICAgYmVmb3JlIHRoZSBjYWxsIG9mIGNvbXByZXNzIHRoaXMgbGVuZ3RoIGlzIGVxdWFsIHRvIHRoZSB0b3RhbCBzaXplIG9mCisgICB0aGUgY29tcHJlc3NlZCBidWZmZXIgYW5kIG5vdCB6ZXJvLgorCisKK0Zyb206ICJKb24gQ2FydWFuYSIgPGpvbi1uZXRAdXNhLm5ldD4KK1N1YmplY3Q6IFJlOiBIb3cgdG8gcG9ydCB6bGliIGRlY2xhcmVzIHRvIHZiPworRGF0ZTogTW9uLCAyOCBPY3QgMTk5NiAxODozMzowMyAtMDYwMAorCitHb3QgdGhlIGFuc3dlciEgKEkgaGF2ZW4ndCBoYWQgdGltZSB0byBjaGVjayB0aGlzIGJ1dCBpdCdzIHdoYXQgSSBnb3QsIGFuZAorbG9va3MgY29ycmVjdCk6CisKK0hlIGhhcyB0aGUgZm9sbG93aW5nIHJvdXRpbmVzIHdvcmtpbmc6CisgICAgICAgIGNvbXByZXNzCisgICAgICAgIHVuY29tcHJlc3MKKyAgICAgICAgZ3pvcGVuCisgICAgICAgIGd6d3JpdGUKKyAgICAgICAgZ3pyZWFkCisgICAgICAgIGd6Y2xvc2UKKworRGVjbGFyZXMgZm9sbG93OiAoUXVvdGVkIGZyb20gQ2FybG9zIFJpb3MgPGNfcmlvc0Bzb25kYS5jbD4sIGluIFZiNCBmb3JtKQorCisjSWYgV2luMTYgVGhlbiAgICdVc2UgV2luMTYgY2FsbHMuCitEZWNsYXJlIEZ1bmN0aW9uIGNvbXByZXNzIExpYiAiWkxJQi5ETEwiIChCeVZhbCBjb21wciBBcworICAgICAgICBTdHJpbmcsIGNvbXByTGVuIEFzIEFueSwgQnlWYWwgYnVmIEFzIFN0cmluZywgQnlWYWwgYnVmbGVuCisgICAgICAgIEFzIExvbmcpIEFzIEludGVnZXIKK0RlY2xhcmUgRnVuY3Rpb24gdW5jb21wcmVzcyBMaWIgIlpMSUIuRExMIiAoQnlWYWwgdW5jb21wcgorICAgICAgICBBcyBTdHJpbmcsIHVuY29tcHJMZW4gQXMgQW55LCBCeVZhbCBjb21wciBBcyBTdHJpbmcsIEJ5VmFsCisgICAgICAgIGxjb21wciBBcyBMb25nKSBBcyBJbnRlZ2VyCitEZWNsYXJlIEZ1bmN0aW9uIGd6b3BlbiBMaWIgIlpMSUIuRExMIiAoQnlWYWwgZmlsZVBhdGggQXMKKyAgICAgICAgU3RyaW5nLCBCeVZhbCBtb2RlIEFzIFN0cmluZykgQXMgTG9uZworRGVjbGFyZSBGdW5jdGlvbiBnenJlYWQgTGliICJaTElCLkRMTCIgKEJ5VmFsIGZpbGUgQXMKKyAgICAgICAgTG9uZywgQnlWYWwgdW5jb21wciBBcyBTdHJpbmcsIEJ5VmFsIHVuY29tcHJMZW4gQXMgSW50ZWdlcikKKyAgICAgICAgQXMgSW50ZWdlcgorRGVjbGFyZSBGdW5jdGlvbiBnendyaXRlIExpYiAiWkxJQi5ETEwiIChCeVZhbCBmaWxlIEFzCisgICAgICAgIExvbmcsIEJ5VmFsIHVuY29tcHIgQXMgU3RyaW5nLCBCeVZhbCB1bmNvbXByTGVuIEFzIEludGVnZXIpCisgICAgICAgIEFzIEludGVnZXIKK0RlY2xhcmUgRnVuY3Rpb24gZ3pjbG9zZSBMaWIgIlpMSUIuRExMIiAoQnlWYWwgZmlsZSBBcworICAgICAgICBMb25nKSBBcyBJbnRlZ2VyCisjRWxzZQorRGVjbGFyZSBGdW5jdGlvbiBjb21wcmVzcyBMaWIgIlpMSUIzMi5ETEwiCisgICAgICAgIChCeVZhbCBjb21wciBBcyBTdHJpbmcsIGNvbXByTGVuIEFzIEFueSwgQnlWYWwgYnVmIEFzCisgICAgICAgIFN0cmluZywgQnlWYWwgYnVmbGVuIEFzIExvbmcpIEFzIEludGVnZXIKK0RlY2xhcmUgRnVuY3Rpb24gdW5jb21wcmVzcyBMaWIgIlpMSUIzMi5ETEwiCisgICAgICAgIChCeVZhbCB1bmNvbXByIEFzIFN0cmluZywgdW5jb21wckxlbiBBcyBBbnksIEJ5VmFsIGNvbXByIEFzCisgICAgICAgIFN0cmluZywgQnlWYWwgbGNvbXByIEFzIExvbmcpIEFzIExvbmcKK0RlY2xhcmUgRnVuY3Rpb24gZ3pvcGVuIExpYiAiWkxJQjMyLkRMTCIKKyAgICAgICAgKEJ5VmFsIGZpbGUgQXMgU3RyaW5nLCBCeVZhbCBtb2RlIEFzIFN0cmluZykgQXMgTG9uZworRGVjbGFyZSBGdW5jdGlvbiBnenJlYWQgTGliICJaTElCMzIuRExMIgorICAgICAgICAoQnlWYWwgZmlsZSBBcyBMb25nLCBCeVZhbCB1bmNvbXByIEFzIFN0cmluZywgQnlWYWwKKyAgICAgICAgdW5jb21wckxlbiBBcyBMb25nKSBBcyBMb25nCitEZWNsYXJlIEZ1bmN0aW9uIGd6d3JpdGUgTGliICJaTElCMzIuRExMIgorICAgICAgICAoQnlWYWwgZmlsZSBBcyBMb25nLCBCeVZhbCB1bmNvbXByIEFzIFN0cmluZywgQnlWYWwKKyAgICAgICAgdW5jb21wckxlbiBBcyBMb25nKSBBcyBMb25nCitEZWNsYXJlIEZ1bmN0aW9uIGd6Y2xvc2UgTGliICJaTElCMzIuRExMIgorICAgICAgICAoQnlWYWwgZmlsZSBBcyBMb25nKSBBcyBMb25nCisjRW5kIElmCisKKy1Kb24gQ2FydWFuYQoram9uLW5ldEB1c2EubmV0CitNaWNyb3NvZnQgU2l0ZWJ1aWxkZXIgTmV0d29yayBMZXZlbCAxIE1lbWJlciAtIEhUTUwgV3JpdGVyJ3MgR3VpbGQgTWVtYmVyCisKKworSGVyZSBpcyBhbm90aGVyIGV4YW1wbGUgZnJvbSBNaWNoYWVsIDxtaWNoYWVsX2JvcmdzeXNAaG90bWFpbC5jb20+IHRoYXQgaGUKK3NheXMgY29uZm9ybXMgdG8gdGhlIFZCIGd1aWRlbGluZXMsIGFuZCB0aGF0IHNvbHZlcyB0aGUgcHJvYmxlbSBvZiBub3QKK2tub3dpbmcgdGhlIHVuY29tcHJlc3NlZCBzaXplIGJ5IHN0b3JpbmcgaXQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZToKKworJ0NhbGxpbmcgdGhlIGZ1bmN0aW9uczoKKydicmFja2V0IG1lYW5pbmc6IDxwYXJhbWV0ZXI+IFtvcHRpb25hbF0ge1JhbmdlIG9mIHBvc3NpYmxlIHZhbHVlc30KKydDYWxsIHN1YkNvbXByZXNzRmlsZSg8cGF0aCB3aXRoIGZpbGVuYW1lIHRvIGNvbXByZXNzPiBbLCA8cGF0aCB3aXRoCitmaWxlbmFtZSB0byB3cml0ZSB0bz4sIFtsZXZlbCBvZiBjb21wcmVzc2lvbiB7MS4uOX1dXSkKKydDYWxsIHN1YlVuY29tcHJlc3NGaWxlKDxwYXRoIHdpdGggZmlsZW5hbWUgdG8gY29tcHJlc3M+KQorCitPcHRpb24gRXhwbGljaXQKK1ByaXZhdGUgbG5ncHZ0UGNuU21sIEFzIExvbmcgJ1N0b3JlcyB2YWx1ZSBmb3IgJ2xuZ1BlcmNlbnRTbWFsbGVyJworUHJpdmF0ZSBDb25zdCBTVUNDRVNTIEFzIExvbmcgPSAwCitQcml2YXRlIENvbnN0IHN0ckZpbEV4dCBBcyBTdHJpbmcgPSAiLmNwciIKK1ByaXZhdGUgRGVjbGFyZSBGdW5jdGlvbiBsbmdmbmNDcHIgTGliICJ6bGliLmRsbCIgQWxpYXMgImNvbXByZXNzMiIgKEJ5UmVmCitkZXN0IEFzIEFueSwgQnlSZWYgZGVzdExlbiBBcyBBbnksIEJ5UmVmIHNyYyBBcyBBbnksIEJ5VmFsIHNyY0xlbiBBcyBMb25nLAorQnlWYWwgbGV2ZWwgQXMgSW50ZWdlcikgQXMgTG9uZworUHJpdmF0ZSBEZWNsYXJlIEZ1bmN0aW9uIGxuZ2ZuY1VjcCBMaWIgInpsaWIuZGxsIiBBbGlhcyAidW5jb21wcmVzcyIgKEJ5UmVmCitkZXN0IEFzIEFueSwgQnlSZWYgZGVzdExlbiBBcyBBbnksIEJ5UmVmIHNyYyBBcyBBbnksIEJ5VmFsIHNyY0xlbiBBcyBMb25nKQorQXMgTG9uZworCitQdWJsaWMgU3ViIHN1YkNvbXByZXNzRmlsZShCeVZhbCBzdHJhcmdPcmlGaWxQdGggQXMgU3RyaW5nLCBPcHRpb25hbCBCeVZhbAorc3RyYXJnQ3ByRmlsUHRoIEFzIFN0cmluZywgT3B0aW9uYWwgQnlWYWwgaW50THZsIEFzIEludGVnZXIgPSA5KQorICAgIERpbSBzdHJDcHJQdGggQXMgU3RyaW5nCisgICAgRGltIGxuZ09yaVNpeiBBcyBMb25nCisgICAgRGltIGxuZ0NwclNpeiBBcyBMb25nCisgICAgRGltIGJ5dGFyeU9yaSgpIEFzIEJ5dGUKKyAgICBEaW0gYnl0YXJ5Q3ByKCkgQXMgQnl0ZQorICAgIGxuZ09yaVNpeiA9IEZpbGVMZW4oc3RyYXJnT3JpRmlsUHRoKQorICAgIFJlRGltIGJ5dGFyeU9yaShsbmdPcmlTaXogLSAxKQorICAgIE9wZW4gc3RyYXJnT3JpRmlsUHRoIEZvciBCaW5hcnkgQWNjZXNzIFJlYWQgQXMgIzEKKyAgICAgICAgR2V0ICMxLCAsIGJ5dGFyeU9yaSgpCisgICAgQ2xvc2UgIzEKKyAgICBzdHJDcHJQdGggPSBJSWYoc3RyYXJnQ3ByRmlsUHRoID0gIiIsIHN0cmFyZ09yaUZpbFB0aCwgc3RyYXJnQ3ByRmlsUHRoKQorJ1NlbGVjdCBmaWxlIHBhdGggYW5kIG5hbWUKKyAgICBzdHJDcHJQdGggPSBzdHJDcHJQdGggJiBJSWYoUmlnaHQoc3RyQ3ByUHRoLCBMZW4oc3RyRmlsRXh0KSkgPQorc3RyRmlsRXh0LCAiIiwgc3RyRmlsRXh0KSAnQWRkIGZpbGUgZXh0ZW5zaW9uIGlmIG5vdCBleGlzdHMKKyAgICBsbmdDcHJTaXogPSAobG5nT3JpU2l6ICogMS4wMSkgKyAxMiAnQ29tcHJlc3Npb24gbmVlZHMgdGVtcG9yYXJ5IGEgYml0Cittb3JlIHNwYWNlIHRoZW4gb3JpZ2luYWwgZmlsZSBzaXplCisgICAgUmVEaW0gYnl0YXJ5Q3ByKGxuZ0NwclNpeiAtIDEpCisgICAgSWYgbG5nZm5jQ3ByKGJ5dGFyeUNwcigwKSwgbG5nQ3ByU2l6LCBieXRhcnlPcmkoMCksIGxuZ09yaVNpeiwgaW50THZsKSA9CitTVUNDRVNTIFRoZW4KKyAgICAgICAgbG5ncHZ0UGNuU21sID0gKDEjIC0gKGxuZ0NwclNpeiAvIGxuZ09yaVNpeikpICogMTAwCisgICAgICAgIFJlRGltIFByZXNlcnZlIGJ5dGFyeUNwcihsbmdDcHJTaXogLSAxKQorICAgICAgICBPcGVuIHN0ckNwclB0aCBGb3IgQmluYXJ5IEFjY2VzcyBXcml0ZSBBcyAjMQorICAgICAgICAgICAgUHV0ICMxLCAsIGJ5dGFyeUNwcigpCisgICAgICAgICAgICBQdXQgIzEsICwgbG5nT3JpU2l6ICdBZGQgdGhlIHRoZSBvcmlnaW5hbCBzaXplIHZhbHVlIHRvIHRoZSBlbmQKKyhsYXN0IDQgYnl0ZXMpCisgICAgICAgIENsb3NlICMxCisgICAgRWxzZQorICAgICAgICBNc2dCb3ggIkNvbXByZXNzaW9uIGVycm9yIgorICAgIEVuZCBJZgorICAgIEVyYXNlIGJ5dGFyeUNwcgorICAgIEVyYXNlIGJ5dGFyeU9yaQorRW5kIFN1YgorCitQdWJsaWMgU3ViIHN1YlVuY29tcHJlc3NGaWxlKEJ5VmFsIHN0cmFyZ0ZpbFB0aCBBcyBTdHJpbmcpCisgICAgRGltIGJ5dGFyeUNwcigpIEFzIEJ5dGUKKyAgICBEaW0gYnl0YXJ5T3JpKCkgQXMgQnl0ZQorICAgIERpbSBsbmdPcmlTaXogQXMgTG9uZworICAgIERpbSBsbmdDcHJTaXogQXMgTG9uZworICAgIERpbSBzdHJPcmlQdGggQXMgU3RyaW5nCisgICAgbG5nQ3ByU2l6ID0gRmlsZUxlbihzdHJhcmdGaWxQdGgpCisgICAgUmVEaW0gYnl0YXJ5Q3ByKGxuZ0NwclNpeiAtIDEpCisgICAgT3BlbiBzdHJhcmdGaWxQdGggRm9yIEJpbmFyeSBBY2Nlc3MgUmVhZCBBcyAjMQorICAgICAgICBHZXQgIzEsICwgYnl0YXJ5Q3ByKCkKKyAgICBDbG9zZSAjMQorICAgICdSZWFkIHRoZSBvcmlnaW5hbCBmaWxlIHNpemUgdmFsdWU6CisgICAgbG5nT3JpU2l6ID0gYnl0YXJ5Q3ByKGxuZ0NwclNpeiAtIDEpICogKDIgXiAyNCkgXworICAgICAgICAgICAgICArIGJ5dGFyeUNwcihsbmdDcHJTaXogLSAyKSAqICgyIF4gMTYpIF8KKyAgICAgICAgICAgICAgKyBieXRhcnlDcHIobG5nQ3ByU2l6IC0gMykgKiAoMiBeIDgpIF8KKyAgICAgICAgICAgICAgKyBieXRhcnlDcHIobG5nQ3ByU2l6IC0gNCkKKyAgICBSZURpbSBQcmVzZXJ2ZSBieXRhcnlDcHIobG5nQ3ByU2l6IC0gNSkgJ0N1dCBvZiB0aGUgb3JpZ2luYWwgc2l6ZSB2YWx1ZQorICAgIFJlRGltIGJ5dGFyeU9yaShsbmdPcmlTaXogLSAxKQorICAgIElmIGxuZ2ZuY1VjcChieXRhcnlPcmkoMCksIGxuZ09yaVNpeiwgYnl0YXJ5Q3ByKDApLCBsbmdDcHJTaXopID0gU1VDQ0VTUworVGhlbgorICAgICAgICBzdHJPcmlQdGggPSBMZWZ0KHN0cmFyZ0ZpbFB0aCwgTGVuKHN0cmFyZ0ZpbFB0aCkgLSBMZW4oc3RyRmlsRXh0KSkKKyAgICAgICAgT3BlbiBzdHJPcmlQdGggRm9yIEJpbmFyeSBBY2Nlc3MgV3JpdGUgQXMgIzEKKyAgICAgICAgICAgIFB1dCAjMSwgLCBieXRhcnlPcmkoKQorICAgICAgICBDbG9zZSAjMQorICAgIEVsc2UKKyAgICAgICAgTXNnQm94ICJVbmNvbXByZXNzaW9uIGVycm9yIgorICAgIEVuZCBJZgorICAgIEVyYXNlIGJ5dGFyeUNwcgorICAgIEVyYXNlIGJ5dGFyeU9yaQorRW5kIFN1YgorUHVibGljIFByb3BlcnR5IEdldCBsbmdQZXJjZW50U21hbGxlcigpIEFzIExvbmcKKyAgICBsbmdQZXJjZW50U21hbGxlciA9IGxuZ3B2dFBjblNtbAorRW5kIFByb3BlcnR5CmRpZmYgLS1naXQgYS96bGliL3NyYy9xbngvcGFja2FnZS5xcGcgYi96bGliL3NyYy9xbngvcGFja2FnZS5xcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWViZjZlMwotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL3FueC9wYWNrYWdlLnFwZwpAQCAtMCwwICsxLDE0MSBAQAorPFFQRzpHZW5lcmF0aW9uPgorICAgPFFQRzpPcHRpb25zPgorICAgICAgPFFQRzpVc2VyIHVuYXR0ZW5kZWQ9Im5vIiB2ZXJib3NpdHk9IjIiIGxpc3RmaWxlcz0ieWVzIi8+CisgICAgICA8UVBHOkRlZmF1bHRzIHR5cGU9InFueF9wYWNrYWdlIi8+CisgICAgICA8UVBHOlNvdXJjZT48L1FQRzpTb3VyY2U+CisgICAgICA8UVBHOlJlbGVhc2UgbnVtYmVyPSIrIi8+CisgICAgICA8UVBHOkJ1aWxkPjwvUVBHOkJ1aWxkPgorICAgICAgPFFQRzpGaWxlU29ydGluZyBzdHJpcD0ieWVzIi8+CisgICAgICA8UVBHOlBhY2thZ2UgdGFyZ2V0cz0iY29tYmluZSIvPgorICAgICAgPFFQRzpSZXBvc2l0b3J5IGdlbmVyYXRlPSJ5ZXMiLz4KKyAgICAgIDxRUEc6RmluYWxEaXI+PC9RUEc6RmluYWxEaXI+CisgICAgICA8UVBHOkNsZWFudXA+PC9RUEc6Q2xlYW51cD4KKyAgIDwvUVBHOk9wdGlvbnM+CisKKyAgIDxRUEc6UmVzcG9uc2libGU+CisgICAgICA8UVBHOkNvbXBhbnk+PC9RUEc6Q29tcGFueT4KKyAgICAgIDxRUEc6RGVwYXJ0bWVudD48L1FQRzpEZXBhcnRtZW50PgorICAgICAgPFFQRzpHcm91cD48L1FQRzpHcm91cD4KKyAgICAgIDxRUEc6VGVhbT48L1FQRzpUZWFtPgorICAgICAgPFFQRzpFbXBsb3llZT48L1FQRzpFbXBsb3llZT4KKyAgICAgIDxRUEc6RW1haWxBZGRyZXNzPjwvUVBHOkVtYWlsQWRkcmVzcz4KKyAgIDwvUVBHOlJlc3BvbnNpYmxlPgorCisgICA8UVBHOlZhbHVlcz4KKyAgICAgIDxRUEc6RmlsZXM+CisgICAgICAgICA8UVBHOkFkZCBmaWxlPSIuLi96Y29uZi5oIiBpbnN0YWxsPSIvb3B0L2luY2x1ZGUvIiB1c2VyPSJyb290OnN5cyIgcGVybWlzc2lvbj0iNjQ0Ii8+CisgICAgICAgICA8UVBHOkFkZCBmaWxlPSIuLi96bGliLmgiIGluc3RhbGw9Ii9vcHQvaW5jbHVkZS8iIHVzZXI9InJvb3Q6c3lzIiBwZXJtaXNzaW9uPSI2NDQiLz4KKyAgICAgICAgIDxRUEc6QWRkIGZpbGU9Ii4uL2xpYnouc28uMS4yLjgiIGluc3RhbGw9Ii9vcHQvbGliLyIgdXNlcj0icm9vdDpiaW4iIHBlcm1pc3Npb249IjY0NCIvPgorICAgICAgICAgPFFQRzpBZGQgZmlsZT0ibGliei5zbyIgaW5zdGFsbD0iL29wdC9saWIvIiBjb21wb25lbnQ9ImRldiIgZmlsZXR5cGU9InN5bWxpbmsiIGxpbmt0bz0ibGliei5zby4xLjIuOCIvPgorICAgICAgICAgPFFQRzpBZGQgZmlsZT0ibGliei5zby4xIiBpbnN0YWxsPSIvb3B0L2xpYi8iIGZpbGV0eXBlPSJzeW1saW5rIiBsaW5rdG89ImxpYnouc28uMS4yLjgiLz4KKyAgICAgICAgIDxRUEc6QWRkIGZpbGU9Ii4uL2xpYnouc28uMS4yLjgiIGluc3RhbGw9Ii9vcHQvbGliLyIgY29tcG9uZW50PSJzbGliIi8+CisgICAgICA8L1FQRzpGaWxlcz4KKworICAgICAgPFFQRzpQYWNrYWdlRmlsdGVyPgorICAgICAgICAgPFFQTTpQYWNrYWdlTWFuaWZlc3Q+CisgICAgICAgICAgICA8UVBNOlBhY2thZ2VEZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgIDxRUE06UGFja2FnZVR5cGU+TGlicmFyeTwvUVBNOlBhY2thZ2VUeXBlPgorICAgICAgICAgICAgICAgPFFQTTpQYWNrYWdlUmVsZWFzZU5vdGVzPjwvUVBNOlBhY2thZ2VSZWxlYXNlTm90ZXM+CisgICAgICAgICAgICAgICA8UVBNOlBhY2thZ2VSZWxlYXNlVXJnZW5jeT5NZWRpdW08L1FQTTpQYWNrYWdlUmVsZWFzZVVyZ2VuY3k+CisgICAgICAgICAgICAgICA8UVBNOlBhY2thZ2VSZXBvc2l0b3J5PjwvUVBNOlBhY2thZ2VSZXBvc2l0b3J5PgorICAgICAgICAgICAgICAgPFFQTTpGaWxlVmVyc2lvbj4yLjA8L1FQTTpGaWxlVmVyc2lvbj4KKyAgICAgICAgICAgIDwvUVBNOlBhY2thZ2VEZXNjcmlwdGlvbj4KKworICAgICAgICAgICAgPFFQTTpQcm9kdWN0RGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICA8UVBNOlByb2R1Y3ROYW1lPnpsaWI8L1FQTTpQcm9kdWN0TmFtZT4KKyAgICAgICAgICAgICAgIDxRUE06UHJvZHVjdElkZW50aWZpZXI+emxpYjwvUVBNOlByb2R1Y3RJZGVudGlmaWVyPgorICAgICAgICAgICAgICAgPFFQTTpQcm9kdWN0RW1haWw+YWxhaW4uYm9ubmVmb3lAaWNidC5jb208L1FQTTpQcm9kdWN0RW1haWw+CisgICAgICAgICAgICAgICA8UVBNOlZlbmRvck5hbWU+UHVibGljPC9RUE06VmVuZG9yTmFtZT4KKyAgICAgICAgICAgICAgIDxRUE06VmVuZG9ySW5zdGFsbE5hbWU+cHVibGljPC9RUE06VmVuZG9ySW5zdGFsbE5hbWU+CisgICAgICAgICAgICAgICA8UVBNOlZlbmRvclVSTD53d3cuZ3ppcC5vcmcvemxpYjwvUVBNOlZlbmRvclVSTD4KKyAgICAgICAgICAgICAgIDxRUE06VmVuZG9yRW1iZWRVUkw+PC9RUE06VmVuZG9yRW1iZWRVUkw+CisgICAgICAgICAgICAgICA8UVBNOlZlbmRvckVtYWlsPjwvUVBNOlZlbmRvckVtYWlsPgorICAgICAgICAgICAgICAgPFFQTTpBdXRob3JOYW1lPkplYW4tTG91cCBHYWlsbHksTWFyayBBZGxlcjwvUVBNOkF1dGhvck5hbWU+CisgICAgICAgICAgICAgICA8UVBNOkF1dGhvclVSTD53d3cuZ3ppcC5vcmcvemxpYjwvUVBNOkF1dGhvclVSTD4KKyAgICAgICAgICAgICAgIDxRUE06QXV0aG9yRW1iZWRVUkw+PC9RUE06QXV0aG9yRW1iZWRVUkw+CisgICAgICAgICAgICAgICA8UVBNOkF1dGhvckVtYWlsPnpsaWJAZ3ppcC5vcmc8L1FQTTpBdXRob3JFbWFpbD4KKyAgICAgICAgICAgICAgIDxRUE06UHJvZHVjdEljb25TbWFsbD48L1FQTTpQcm9kdWN0SWNvblNtYWxsPgorICAgICAgICAgICAgICAgPFFQTTpQcm9kdWN0SWNvbkxhcmdlPjwvUVBNOlByb2R1Y3RJY29uTGFyZ2U+CisgICAgICAgICAgICAgICA8UVBNOlByb2R1Y3REZXNjcmlwdGlvblNob3J0PkEgbWFzc2l2ZWx5IHNwaWZmeSB5ZXQgZGVsaWNhdGVseSB1bm9idHJ1c2l2ZSBjb21wcmVzc2lvbiBsaWJyYXJ5LjwvUVBNOlByb2R1Y3REZXNjcmlwdGlvblNob3J0PgorICAgICAgICAgICAgICAgPFFQTTpQcm9kdWN0RGVzY3JpcHRpb25Mb25nPnpsaWIgaXMgZGVzaWduZWQgdG8gYmUgYSBmcmVlLCBnZW5lcmFsLXB1cnBvc2UsIGxlZ2FsbHkgdW5lbmN1bWJlcmVkLCBsb3NzbGVzcyBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkgZm9yIHVzZSBvbiB2aXJ0dWFsbHkgYW55IGNvbXB1dGVyIGhhcmR3YXJlIGFuZCBvcGVyYXRpbmcgc3lzdGVtLjwvUVBNOlByb2R1Y3REZXNjcmlwdGlvbkxvbmc+CisgICAgICAgICAgICAgICA8UVBNOlByb2R1Y3REZXNjcmlwdGlvblVSTD5odHRwOi8vd3d3Lmd6aXAub3JnL3psaWI8L1FQTTpQcm9kdWN0RGVzY3JpcHRpb25VUkw+CisgICAgICAgICAgICAgICA8UVBNOlByb2R1Y3REZXNjcmlwdGlvbkVtYmVkVVJMPjwvUVBNOlByb2R1Y3REZXNjcmlwdGlvbkVtYmVkVVJMPgorICAgICAgICAgICAgPC9RUE06UHJvZHVjdERlc2NyaXB0aW9uPgorCisgICAgICAgICAgICA8UVBNOlJlbGVhc2VEZXNjcmlwdGlvbj4KKyAgICAgICAgICAgICAgIDxRUE06UmVsZWFzZVZlcnNpb24+MS4yLjg8L1FQTTpSZWxlYXNlVmVyc2lvbj4KKyAgICAgICAgICAgICAgIDxRUE06UmVsZWFzZVVyZ2VuY3k+TWVkaXVtPC9RUE06UmVsZWFzZVVyZ2VuY3k+CisgICAgICAgICAgICAgICA8UVBNOlJlbGVhc2VTdGFiaWxpdHk+U3RhYmxlPC9RUE06UmVsZWFzZVN0YWJpbGl0eT4KKyAgICAgICAgICAgICAgIDxRUE06UmVsZWFzZU5vdGVNaW5vcj48L1FQTTpSZWxlYXNlTm90ZU1pbm9yPgorICAgICAgICAgICAgICAgPFFQTTpSZWxlYXNlTm90ZU1ham9yPjwvUVBNOlJlbGVhc2VOb3RlTWFqb3I+CisgICAgICAgICAgICAgICA8UVBNOkV4Y2x1ZGVDb3VudHJpZXM+CisgICAgICAgICAgICAgICAgICA8UVBNOkNvdW50cnk+PC9RUE06Q291bnRyeT4KKyAgICAgICAgICAgICAgIDwvUVBNOkV4Y2x1ZGVDb3VudHJpZXM+CisKKyAgICAgICAgICAgICAgIDxRUE06UmVsZWFzZUNvcHlyaWdodD5ObyBMaWNlbnNlPC9RUE06UmVsZWFzZUNvcHlyaWdodD4KKyAgICAgICAgICAgIDwvUVBNOlJlbGVhc2VEZXNjcmlwdGlvbj4KKworICAgICAgICAgICAgPFFQTTpDb250ZW50RGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICA8UVBNOkNvbnRlbnRUb3BpYyB4bWxtdWx0aXBsZT0idHJ1ZSI+U29mdHdhcmUgRGV2ZWxvcG1lbnQvTGlicmFyaWVzIGFuZCBFeHRlbnNpb25zL0MgTGlicmFyaWVzPC9RUE06Q29udGVudFRvcGljPgorICAgICAgICAgICAgICAgPFFQTTpDb250ZW50S2V5d29yZD56bGliLGNvbXByZXNzaW9uPC9RUE06Q29udGVudEtleXdvcmQ+CisgICAgICAgICAgICAgICA8UVBNOlRhcmdldE9TPnFueDY8L1FQTTpUYXJnZXRPUz4KKyAgICAgICAgICAgICAgIDxRUE06SG9zdE9TPnFueDY8L1FQTTpIb3N0T1M+CisgICAgICAgICAgICAgICA8UVBNOkRpc3BsYXlFbnZpcm9ubWVudCB4bWxtdWx0aXBsZT0idHJ1ZSI+Tm9uZTwvUVBNOkRpc3BsYXlFbnZpcm9ubWVudD4KKyAgICAgICAgICAgICAgIDxRUE06VGFyZ2V0QXVkaWVuY2UgeG1sbXVsdGlwbGU9InRydWUiPkRldmVsb3BlcjwvUVBNOlRhcmdldEF1ZGllbmNlPgorICAgICAgICAgICAgPC9RUE06Q29udGVudERlc2NyaXB0aW9uPgorICAgICAgICAgPC9RUE06UGFja2FnZU1hbmlmZXN0PgorICAgICAgPC9RUEc6UGFja2FnZUZpbHRlcj4KKworICAgICAgPFFQRzpQYWNrYWdlRmlsdGVyIHByb2M9Im5vbmUiIHRhcmdldD0ibm9uZSI+CisgICAgICAgICA8UVBNOlBhY2thZ2VNYW5pZmVzdD4KKyAgICAgICAgICAgIDxRUE06UHJvZHVjdEluc3RhbGxhdGlvbkRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgIDxRUE06UHJvZHVjdFJlcXVpcmVtZW50cz48L1FQTTpQcm9kdWN0UmVxdWlyZW1lbnRzPgorICAgICAgICAgICAgPC9RUE06UHJvZHVjdEluc3RhbGxhdGlvbkRlcGVuZGVuY2llcz4KKworICAgICAgICAgICAgPFFQTTpQcm9kdWN0SW5zdGFsbGF0aW9uUHJvY2VkdXJlPgorICAgICAgICAgICAgICAgPFFQTTpTY3JpcHQgeG1sbXVsdGlwbGU9InRydWUiPgorICAgICAgICAgICAgICAgICAgPFFQTTpTY3JpcHROYW1lPjwvUVBNOlNjcmlwdE5hbWU+CisgICAgICAgICAgICAgICAgICA8UVBNOlNjcmlwdFR5cGU+SW5zdGFsbDwvUVBNOlNjcmlwdFR5cGU+CisgICAgICAgICAgICAgICAgICA8UVBNOlNjcmlwdFRpbWluZz5Qb3N0PC9RUE06U2NyaXB0VGltaW5nPgorICAgICAgICAgICAgICAgICAgPFFQTTpTY3JpcHRCbG9ja2luZz5ObzwvUVBNOlNjcmlwdEJsb2NraW5nPgorICAgICAgICAgICAgICAgICAgPFFQTTpTY3JpcHRSZXN1bHQ+SWdub3JlPC9RUE06U2NyaXB0UmVzdWx0PgorICAgICAgICAgICAgICAgICAgPFFQTTpTaG9ydERlc2NyaXB0aW9uPjwvUVBNOlNob3J0RGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICAgICA8UVBNOlVzZUJpbmFyaWVzPk5vPC9RUE06VXNlQmluYXJpZXM+CisgICAgICAgICAgICAgICAgICA8UVBNOlByaW9yaXR5Pk9wdGlvbmFsPC9RUE06UHJpb3JpdHk+CisgICAgICAgICAgICAgICA8L1FQTTpTY3JpcHQ+CisgICAgICAgICAgICA8L1FQTTpQcm9kdWN0SW5zdGFsbGF0aW9uUHJvY2VkdXJlPgorICAgICAgICAgPC9RUE06UGFja2FnZU1hbmlmZXN0PgorCisgICAgICAgICA8UVBNOkxhdW5jaD4KKyAgICAgICAgIDwvUVBNOkxhdW5jaD4KKyAgICAgIDwvUVBHOlBhY2thZ2VGaWx0ZXI+CisKKyAgICAgIDxRUEc6UGFja2FnZUZpbHRlciB0eXBlPSJjb3JlIiBjb21wb25lbnQ9Im5vbmUiPgorICAgICAgICAgPFFQTTpQYWNrYWdlTWFuaWZlc3Q+CisgICAgICAgICAgICA8UVBNOlByb2R1Y3RJbnN0YWxsYXRpb25Qcm9jZWR1cmU+CisJICAgICAgIDxRUE06T3JkZXJEZXBlbmRlbmN5IHhtbG11bHRpcGxlPSJ0cnVlIj4KKwkgICAgICAgICAgPFFQTTpPcmRlcj5JbnN0YWxsT3ZlcjwvUVBNOk9yZGVyPgorCSAgICAgICAgICA8UVBNOlByb2R1Y3Q+emxpYjwvUVBNOlByb2R1Y3Q+CisJICAgICAgIDwvUVBNOk9yZGVyRGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDwvUVBNOlByb2R1Y3RJbnN0YWxsYXRpb25Qcm9jZWR1cmU+CisgICAgICAgICA8L1FQTTpQYWNrYWdlTWFuaWZlc3Q+CisKKyAgICAgICAgIDxRUE06TGF1bmNoPgorICAgICAgICAgPC9RUE06TGF1bmNoPgorICAgICAgPC9RUEc6UGFja2FnZUZpbHRlcj4KKworICAgICAgPFFQRzpQYWNrYWdlRmlsdGVyIHR5cGU9ImNvcmUiIGNvbXBvbmVudD0iZGV2Ij4KKyAgICAgICAgIDxRUE06UGFja2FnZU1hbmlmZXN0PgorICAgICAgICAgICAgPFFQTTpQcm9kdWN0SW5zdGFsbGF0aW9uUHJvY2VkdXJlPgorCSAgICAgICA8UVBNOk9yZGVyRGVwZW5kZW5jeSB4bWxtdWx0aXBsZT0idHJ1ZSI+CisJICAgICAgICAgIDxRUE06T3JkZXI+SW5zdGFsbE92ZXI8L1FQTTpPcmRlcj4KKwkgICAgICAgICAgPFFQTTpQcm9kdWN0PnpsaWItZGV2PC9RUE06UHJvZHVjdD4KKwkgICAgICAgPC9RUE06T3JkZXJEZXBlbmRlbmN5PgorICAgICAgICAgICAgPC9RUE06UHJvZHVjdEluc3RhbGxhdGlvblByb2NlZHVyZT4KKyAgICAgICAgIDwvUVBNOlBhY2thZ2VNYW5pZmVzdD4KKworICAgICAgICAgPFFQTTpMYXVuY2g+CisgICAgICAgICA8L1FQTTpMYXVuY2g+CisgICAgICA8L1FQRzpQYWNrYWdlRmlsdGVyPgorICAgPC9RUEc6VmFsdWVzPgorPC9RUEc6R2VuZXJhdGlvbj4KZGlmZiAtLWdpdCBhL3psaWIvc3JjL3Rlc3QvZXhhbXBsZS5jIGIvemxpYi9zcmMvdGVzdC9leGFtcGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM4YTY5OQotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL3Rlc3QvZXhhbXBsZS5jCkBAIC0wLDAgKzEsNjAxIEBACisvKiBleGFtcGxlLmMgLS0gdXNhZ2UgZXhhbXBsZSBvZiB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5CisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNiwgMjAxMSBKZWFuLWxvdXAgR2FpbGx5LgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qIEAoIykgJElkJCAqLworCisjaW5jbHVkZSAiemxpYi5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBTVERDCisjICBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFZNUykgfHwgZGVmaW5lZChSSVNDT1MpCisjICBkZWZpbmUgVEVTVEZJTEUgImZvby1neiIKKyNlbHNlCisjICBkZWZpbmUgVEVTVEZJTEUgImZvby5neiIKKyNlbmRpZgorCisjZGVmaW5lIENIRUNLX0VSUihlcnIsIG1zZykgeyBcCisgICAgaWYgKGVyciAhPSBaX09LKSB7IFwKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyBlcnJvcjogJWRcbiIsIG1zZywgZXJyKTsgXAorICAgICAgICBleGl0KDEpOyBcCisgICAgfSBcCit9CisKK3pfY29uc3QgY2hhciBoZWxsb1tdID0gImhlbGxvLCBoZWxsbyEiOworLyogImhlbGxvIHdvcmxkIiB3b3VsZCBiZSBtb3JlIHN0YW5kYXJkLCBidXQgdGhlIHJlcGVhdGVkICJoZWxsbyIKKyAqIHN0cmVzc2VzIHRoZSBjb21wcmVzc2lvbiBjb2RlIGJldHRlciwgc29ycnkuLi4KKyAqLworCitjb25zdCBjaGFyIGRpY3Rpb25hcnlbXSA9ICJoZWxsbyI7Cit1TG9uZyBkaWN0SWQ7IC8qIEFkbGVyMzIgdmFsdWUgb2YgdGhlIGRpY3Rpb25hcnkgKi8KKwordm9pZCB0ZXN0X2RlZmxhdGUgICAgICAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbikpOwordm9pZCB0ZXN0X2luZmxhdGUgICAgICAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlICp1bmNvbXByLCB1TG9uZyB1bmNvbXByTGVuKSk7Cit2b2lkIHRlc3RfbGFyZ2VfZGVmbGF0ZSBPRigoQnl0ZSAqY29tcHIsIHVMb25nIGNvbXByTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGUgKnVuY29tcHIsIHVMb25nIHVuY29tcHJMZW4pKTsKK3ZvaWQgdGVzdF9sYXJnZV9pbmZsYXRlIE9GKChCeXRlICpjb21wciwgdUxvbmcgY29tcHJMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZSAqdW5jb21wciwgdUxvbmcgdW5jb21wckxlbikpOwordm9pZCB0ZXN0X2ZsdXNoICAgICAgICAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyAqY29tcHJMZW4pKTsKK3ZvaWQgdGVzdF9zeW5jICAgICAgICAgIE9GKChCeXRlICpjb21wciwgdUxvbmcgY29tcHJMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZSAqdW5jb21wciwgdUxvbmcgdW5jb21wckxlbikpOwordm9pZCB0ZXN0X2RpY3RfZGVmbGF0ZSAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbikpOwordm9pZCB0ZXN0X2RpY3RfaW5mbGF0ZSAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlICp1bmNvbXByLCB1TG9uZyB1bmNvbXByTGVuKSk7CitpbnQgIG1haW4gICAgICAgICAgICAgICBPRigoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkpOworCisKKyNpZmRlZiBaX1NPTE8KKwordm9pZCAqbXlhbGxvYyBPRigodm9pZCAqLCB1bnNpZ25lZCwgdW5zaWduZWQpKTsKK3ZvaWQgbXlmcmVlIE9GKCh2b2lkICosIHZvaWQgKikpOworCit2b2lkICpteWFsbG9jKHEsIG4sIG0pCisgICAgdm9pZCAqcTsKKyAgICB1bnNpZ25lZCBuLCBtOworeworICAgIHEgPSBaX05VTEw7CisgICAgcmV0dXJuIGNhbGxvYyhuLCBtKTsKK30KKwordm9pZCBteWZyZWUodm9pZCAqcSwgdm9pZCAqcCkKK3sKKyAgICBxID0gWl9OVUxMOworICAgIGZyZWUocCk7Cit9CisKK3N0YXRpYyBhbGxvY19mdW5jIHphbGxvYyA9IG15YWxsb2M7CitzdGF0aWMgZnJlZV9mdW5jIHpmcmVlID0gbXlmcmVlOworCisjZWxzZSAvKiAhWl9TT0xPICovCisKK3N0YXRpYyBhbGxvY19mdW5jIHphbGxvYyA9IChhbGxvY19mdW5jKTA7CitzdGF0aWMgZnJlZV9mdW5jIHpmcmVlID0gKGZyZWVfZnVuYykwOworCit2b2lkIHRlc3RfY29tcHJlc3MgICAgICBPRigoQnl0ZSAqY29tcHIsIHVMb25nIGNvbXByTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGUgKnVuY29tcHIsIHVMb25nIHVuY29tcHJMZW4pKTsKK3ZvaWQgdGVzdF9nemlvICAgICAgICAgIE9GKChjb25zdCBjaGFyICpmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlICp1bmNvbXByLCB1TG9uZyB1bmNvbXByTGVuKSk7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCBjb21wcmVzcygpIGFuZCB1bmNvbXByZXNzKCkKKyAqLwordm9pZCB0ZXN0X2NvbXByZXNzKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbikKKyAgICBCeXRlICpjb21wciwgKnVuY29tcHI7CisgICAgdUxvbmcgY29tcHJMZW4sIHVuY29tcHJMZW47Cit7CisgICAgaW50IGVycjsKKyAgICB1TG9uZyBsZW4gPSAodUxvbmcpc3RybGVuKGhlbGxvKSsxOworCisgICAgZXJyID0gY29tcHJlc3MoY29tcHIsICZjb21wckxlbiwgKGNvbnN0IEJ5dGVmKiloZWxsbywgbGVuKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiY29tcHJlc3MiKTsKKworICAgIHN0cmNweSgoY2hhciopdW5jb21wciwgImdhcmJhZ2UiKTsKKworICAgIGVyciA9IHVuY29tcHJlc3ModW5jb21wciwgJnVuY29tcHJMZW4sIGNvbXByLCBjb21wckxlbik7CisgICAgQ0hFQ0tfRVJSKGVyciwgInVuY29tcHJlc3MiKTsKKworICAgIGlmIChzdHJjbXAoKGNoYXIqKXVuY29tcHIsIGhlbGxvKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCB1bmNvbXByZXNzXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoInVuY29tcHJlc3MoKTogJXNcbiIsIChjaGFyICopdW5jb21wcik7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRlc3QgcmVhZC93cml0ZSBvZiAuZ3ogZmlsZXMKKyAqLwordm9pZCB0ZXN0X2d6aW8oZm5hbWUsIHVuY29tcHIsIHVuY29tcHJMZW4pCisgICAgY29uc3QgY2hhciAqZm5hbWU7IC8qIGNvbXByZXNzZWQgZmlsZSBuYW1lICovCisgICAgQnl0ZSAqdW5jb21wcjsKKyAgICB1TG9uZyB1bmNvbXByTGVuOworeworI2lmZGVmIE5PX0daQ09NUFJFU1MKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk5PX0daQ09NUFJFU1MgLS0gZ3oqIGZ1bmN0aW9ucyBjYW5ub3QgY29tcHJlc3NcbiIpOworI2Vsc2UKKyAgICBpbnQgZXJyOworICAgIGludCBsZW4gPSAoaW50KXN0cmxlbihoZWxsbykrMTsKKyAgICBnekZpbGUgZmlsZTsKKyAgICB6X29mZl90IHBvczsKKworICAgIGZpbGUgPSBnem9wZW4oZm5hbWUsICJ3YiIpOworICAgIGlmIChmaWxlID09IE5VTEwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnem9wZW4gZXJyb3JcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBnenB1dGMoZmlsZSwgJ2gnKTsKKyAgICBpZiAoZ3pwdXRzKGZpbGUsICJlbGxvIikgIT0gNCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6cHV0cyBlcnI6ICVzXG4iLCBnemVycm9yKGZpbGUsICZlcnIpKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgaWYgKGd6cHJpbnRmKGZpbGUsICIsICVzISIsICJoZWxsbyIpICE9IDgpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnenByaW50ZiBlcnI6ICVzXG4iLCBnemVycm9yKGZpbGUsICZlcnIpKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgZ3pzZWVrKGZpbGUsIDFMLCBTRUVLX0NVUik7IC8qIGFkZCBvbmUgemVybyBieXRlICovCisgICAgZ3pjbG9zZShmaWxlKTsKKworICAgIGZpbGUgPSBnem9wZW4oZm5hbWUsICJyYiIpOworICAgIGlmIChmaWxlID09IE5VTEwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnem9wZW4gZXJyb3JcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBzdHJjcHkoKGNoYXIqKXVuY29tcHIsICJnYXJiYWdlIik7CisKKyAgICBpZiAoZ3pyZWFkKGZpbGUsIHVuY29tcHIsICh1bnNpZ25lZCl1bmNvbXByTGVuKSAhPSBsZW4pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnenJlYWQgZXJyOiAlc1xuIiwgZ3plcnJvcihmaWxlLCAmZXJyKSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGlmIChzdHJjbXAoKGNoYXIqKXVuY29tcHIsIGhlbGxvKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCBnenJlYWQ6ICVzXG4iLCAoY2hhciopdW5jb21wcik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJnenJlYWQoKTogJXNcbiIsIChjaGFyKil1bmNvbXByKTsKKyAgICB9CisKKyAgICBwb3MgPSBnenNlZWsoZmlsZSwgLThMLCBTRUVLX0NVUik7CisgICAgaWYgKHBvcyAhPSA2IHx8IGd6dGVsbChmaWxlKSAhPSBwb3MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnenNlZWsgZXJyb3IsIHBvcz0lbGQsIGd6dGVsbD0lbGRcbiIsCisgICAgICAgICAgICAgICAgKGxvbmcpcG9zLCAobG9uZylnenRlbGwoZmlsZSkpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIGlmIChnemdldGMoZmlsZSkgIT0gJyAnKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3pnZXRjIGVycm9yXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBpZiAoZ3p1bmdldGMoJyAnLCBmaWxlKSAhPSAnICcpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnenVuZ2V0YyBlcnJvclxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgZ3pnZXRzKGZpbGUsIChjaGFyKil1bmNvbXByLCAoaW50KXVuY29tcHJMZW4pOworICAgIGlmIChzdHJsZW4oKGNoYXIqKXVuY29tcHIpICE9IDcpIHsgLyogIiBoZWxsbyEiICovCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3pnZXRzIGVyciBhZnRlciBnenNlZWs6ICVzXG4iLCBnemVycm9yKGZpbGUsICZlcnIpKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgaWYgKHN0cmNtcCgoY2hhciopdW5jb21wciwgaGVsbG8gKyA2KSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCBnemdldHMgYWZ0ZXIgZ3pzZWVrXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoImd6Z2V0cygpIGFmdGVyIGd6c2VlazogJXNcbiIsIChjaGFyKil1bmNvbXByKTsKKyAgICB9CisKKyAgICBnemNsb3NlKGZpbGUpOworI2VuZGlmCit9CisKKyNlbmRpZiAvKiBaX1NPTE8gKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUZXN0IGRlZmxhdGUoKSB3aXRoIHNtYWxsIGJ1ZmZlcnMKKyAqLwordm9pZCB0ZXN0X2RlZmxhdGUoY29tcHIsIGNvbXByTGVuKQorICAgIEJ5dGUgKmNvbXByOworICAgIHVMb25nIGNvbXByTGVuOworeworICAgIHpfc3RyZWFtIGNfc3RyZWFtOyAvKiBjb21wcmVzc2lvbiBzdHJlYW0gKi8KKyAgICBpbnQgZXJyOworICAgIHVMb25nIGxlbiA9ICh1TG9uZylzdHJsZW4oaGVsbG8pKzE7CisKKyAgICBjX3N0cmVhbS56YWxsb2MgPSB6YWxsb2M7CisgICAgY19zdHJlYW0uemZyZWUgPSB6ZnJlZTsKKyAgICBjX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisKKyAgICBlcnIgPSBkZWZsYXRlSW5pdCgmY19zdHJlYW0sIFpfREVGQVVMVF9DT01QUkVTU0lPTik7CisgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGVJbml0Iik7CisKKyAgICBjX3N0cmVhbS5uZXh0X2luICA9ICh6X2NvbnN0IHVuc2lnbmVkIGNoYXIgKiloZWxsbzsKKyAgICBjX3N0cmVhbS5uZXh0X291dCA9IGNvbXByOworCisgICAgd2hpbGUgKGNfc3RyZWFtLnRvdGFsX2luICE9IGxlbiAmJiBjX3N0cmVhbS50b3RhbF9vdXQgPCBjb21wckxlbikgeworICAgICAgICBjX3N0cmVhbS5hdmFpbF9pbiA9IGNfc3RyZWFtLmF2YWlsX291dCA9IDE7IC8qIGZvcmNlIHNtYWxsIGJ1ZmZlcnMgKi8KKyAgICAgICAgZXJyID0gZGVmbGF0ZSgmY19zdHJlYW0sIFpfTk9fRkxVU0gpOworICAgICAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOworICAgIH0KKyAgICAvKiBGaW5pc2ggdGhlIHN0cmVhbSwgc3RpbGwgZm9yY2luZyBzbWFsbCBidWZmZXJzOiAqLworICAgIGZvciAoOzspIHsKKyAgICAgICAgY19zdHJlYW0uYXZhaWxfb3V0ID0gMTsKKyAgICAgICAgZXJyID0gZGVmbGF0ZSgmY19zdHJlYW0sIFpfRklOSVNIKTsKKyAgICAgICAgaWYgKGVyciA9PSBaX1NUUkVBTV9FTkQpIGJyZWFrOworICAgICAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOworICAgIH0KKworICAgIGVyciA9IGRlZmxhdGVFbmQoJmNfc3RyZWFtKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZUVuZCIpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRlc3QgaW5mbGF0ZSgpIHdpdGggc21hbGwgYnVmZmVycworICovCit2b2lkIHRlc3RfaW5mbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pCisgICAgQnl0ZSAqY29tcHIsICp1bmNvbXByOworICAgIHVMb25nIGNvbXByTGVuLCB1bmNvbXByTGVuOworeworICAgIGludCBlcnI7CisgICAgel9zdHJlYW0gZF9zdHJlYW07IC8qIGRlY29tcHJlc3Npb24gc3RyZWFtICovCisKKyAgICBzdHJjcHkoKGNoYXIqKXVuY29tcHIsICJnYXJiYWdlIik7CisKKyAgICBkX3N0cmVhbS56YWxsb2MgPSB6YWxsb2M7CisgICAgZF9zdHJlYW0uemZyZWUgPSB6ZnJlZTsKKyAgICBkX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisKKyAgICBkX3N0cmVhbS5uZXh0X2luICA9IGNvbXByOworICAgIGRfc3RyZWFtLmF2YWlsX2luID0gMDsKKyAgICBkX3N0cmVhbS5uZXh0X291dCA9IHVuY29tcHI7CisKKyAgICBlcnIgPSBpbmZsYXRlSW5pdCgmZF9zdHJlYW0pOworICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlSW5pdCIpOworCisgICAgd2hpbGUgKGRfc3RyZWFtLnRvdGFsX291dCA8IHVuY29tcHJMZW4gJiYgZF9zdHJlYW0udG90YWxfaW4gPCBjb21wckxlbikgeworICAgICAgICBkX3N0cmVhbS5hdmFpbF9pbiA9IGRfc3RyZWFtLmF2YWlsX291dCA9IDE7IC8qIGZvcmNlIHNtYWxsIGJ1ZmZlcnMgKi8KKyAgICAgICAgZXJyID0gaW5mbGF0ZSgmZF9zdHJlYW0sIFpfTk9fRkxVU0gpOworICAgICAgICBpZiAoZXJyID09IFpfU1RSRUFNX0VORCkgYnJlYWs7CisgICAgICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlIik7CisgICAgfQorCisgICAgZXJyID0gaW5mbGF0ZUVuZCgmZF9zdHJlYW0pOworICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlRW5kIik7CisKKyAgICBpZiAoc3RyY21wKChjaGFyKil1bmNvbXByLCBoZWxsbykpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJiYWQgaW5mbGF0ZVxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJpbmZsYXRlKCk6ICVzXG4iLCAoY2hhciAqKXVuY29tcHIpOworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUZXN0IGRlZmxhdGUoKSB3aXRoIGxhcmdlIGJ1ZmZlcnMgYW5kIGR5bmFtaWMgY2hhbmdlIG9mIGNvbXByZXNzaW9uIGxldmVsCisgKi8KK3ZvaWQgdGVzdF9sYXJnZV9kZWZsYXRlKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbikKKyAgICBCeXRlICpjb21wciwgKnVuY29tcHI7CisgICAgdUxvbmcgY29tcHJMZW4sIHVuY29tcHJMZW47Cit7CisgICAgel9zdHJlYW0gY19zdHJlYW07IC8qIGNvbXByZXNzaW9uIHN0cmVhbSAqLworICAgIGludCBlcnI7CisKKyAgICBjX3N0cmVhbS56YWxsb2MgPSB6YWxsb2M7CisgICAgY19zdHJlYW0uemZyZWUgPSB6ZnJlZTsKKyAgICBjX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisKKyAgICBlcnIgPSBkZWZsYXRlSW5pdCgmY19zdHJlYW0sIFpfQkVTVF9TUEVFRCk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGVJbml0Iik7CisKKyAgICBjX3N0cmVhbS5uZXh0X291dCA9IGNvbXByOworICAgIGNfc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KWNvbXByTGVuOworCisgICAgLyogQXQgdGhpcyBwb2ludCwgdW5jb21wciBpcyBzdGlsbCBtb3N0bHkgemVyb2VzLCBzbyBpdCBzaG91bGQgY29tcHJlc3MKKyAgICAgKiB2ZXJ5IHdlbGw6CisgICAgICovCisgICAgY19zdHJlYW0ubmV4dF9pbiA9IHVuY29tcHI7CisgICAgY19zdHJlYW0uYXZhaWxfaW4gPSAodUludCl1bmNvbXByTGVuOworICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOworICAgIGlmIChjX3N0cmVhbS5hdmFpbF9pbiAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZGVmbGF0ZSBub3QgZ3JlZWR5XG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICAvKiBGZWVkIGluIGFscmVhZHkgY29tcHJlc3NlZCBkYXRhIGFuZCBzd2l0Y2ggdG8gbm8gY29tcHJlc3Npb246ICovCisgICAgZGVmbGF0ZVBhcmFtcygmY19zdHJlYW0sIFpfTk9fQ09NUFJFU1NJT04sIFpfREVGQVVMVF9TVFJBVEVHWSk7CisgICAgY19zdHJlYW0ubmV4dF9pbiA9IGNvbXByOworICAgIGNfc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpY29tcHJMZW4vMjsKKyAgICBlcnIgPSBkZWZsYXRlKCZjX3N0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGUiKTsKKworICAgIC8qIFN3aXRjaCBiYWNrIHRvIGNvbXByZXNzaW5nIG1vZGU6ICovCisgICAgZGVmbGF0ZVBhcmFtcygmY19zdHJlYW0sIFpfQkVTVF9DT01QUkVTU0lPTiwgWl9GSUxURVJFRCk7CisgICAgY19zdHJlYW0ubmV4dF9pbiA9IHVuY29tcHI7CisgICAgY19zdHJlYW0uYXZhaWxfaW4gPSAodUludCl1bmNvbXByTGVuOworICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOworCisgICAgZXJyID0gZGVmbGF0ZSgmY19zdHJlYW0sIFpfRklOSVNIKTsKKyAgICBpZiAoZXJyICE9IFpfU1RSRUFNX0VORCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRlZmxhdGUgc2hvdWxkIHJlcG9ydCBaX1NUUkVBTV9FTkRcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBlcnIgPSBkZWZsYXRlRW5kKCZjX3N0cmVhbSk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGVFbmQiKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUZXN0IGluZmxhdGUoKSB3aXRoIGxhcmdlIGJ1ZmZlcnMKKyAqLwordm9pZCB0ZXN0X2xhcmdlX2luZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKQorICAgIEJ5dGUgKmNvbXByLCAqdW5jb21wcjsKKyAgICB1TG9uZyBjb21wckxlbiwgdW5jb21wckxlbjsKK3sKKyAgICBpbnQgZXJyOworICAgIHpfc3RyZWFtIGRfc3RyZWFtOyAvKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqLworCisgICAgc3RyY3B5KChjaGFyKil1bmNvbXByLCAiZ2FyYmFnZSIpOworCisgICAgZF9zdHJlYW0uemFsbG9jID0gemFsbG9jOworICAgIGRfc3RyZWFtLnpmcmVlID0gemZyZWU7CisgICAgZF9zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOworCisgICAgZF9zdHJlYW0ubmV4dF9pbiAgPSBjb21wcjsKKyAgICBkX3N0cmVhbS5hdmFpbF9pbiA9ICh1SW50KWNvbXByTGVuOworCisgICAgZXJyID0gaW5mbGF0ZUluaXQoJmRfc3RyZWFtKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZUluaXQiKTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgZF9zdHJlYW0ubmV4dF9vdXQgPSB1bmNvbXByOyAgICAgICAgICAgIC8qIGRpc2NhcmQgdGhlIG91dHB1dCAqLworICAgICAgICBkX3N0cmVhbS5hdmFpbF9vdXQgPSAodUludCl1bmNvbXByTGVuOworICAgICAgICBlcnIgPSBpbmZsYXRlKCZkX3N0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgICAgIGlmIChlcnIgPT0gWl9TVFJFQU1fRU5EKSBicmVhazsKKyAgICAgICAgQ0hFQ0tfRVJSKGVyciwgImxhcmdlIGluZmxhdGUiKTsKKyAgICB9CisKKyAgICBlcnIgPSBpbmZsYXRlRW5kKCZkX3N0cmVhbSk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVFbmQiKTsKKworICAgIGlmIChkX3N0cmVhbS50b3RhbF9vdXQgIT0gMip1bmNvbXByTGVuICsgY29tcHJMZW4vMikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCBsYXJnZSBpbmZsYXRlOiAlbGRcbiIsIGRfc3RyZWFtLnRvdGFsX291dCk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJsYXJnZV9pbmZsYXRlKCk6IE9LXG4iKTsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCBkZWZsYXRlKCkgd2l0aCBmdWxsIGZsdXNoCisgKi8KK3ZvaWQgdGVzdF9mbHVzaChjb21wciwgY29tcHJMZW4pCisgICAgQnl0ZSAqY29tcHI7CisgICAgdUxvbmcgKmNvbXByTGVuOworeworICAgIHpfc3RyZWFtIGNfc3RyZWFtOyAvKiBjb21wcmVzc2lvbiBzdHJlYW0gKi8KKyAgICBpbnQgZXJyOworICAgIHVJbnQgbGVuID0gKHVJbnQpc3RybGVuKGhlbGxvKSsxOworCisgICAgY19zdHJlYW0uemFsbG9jID0gemFsbG9jOworICAgIGNfc3RyZWFtLnpmcmVlID0gemZyZWU7CisgICAgY19zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOworCisgICAgZXJyID0gZGVmbGF0ZUluaXQoJmNfc3RyZWFtLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04pOworICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlSW5pdCIpOworCisgICAgY19zdHJlYW0ubmV4dF9pbiAgPSAoel9jb25zdCB1bnNpZ25lZCBjaGFyICopaGVsbG87CisgICAgY19zdHJlYW0ubmV4dF9vdXQgPSBjb21wcjsKKyAgICBjX3N0cmVhbS5hdmFpbF9pbiA9IDM7CisgICAgY19zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpKmNvbXByTGVuOworICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX0ZVTExfRkxVU0gpOworICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlIik7CisKKyAgICBjb21wclszXSsrOyAvKiBmb3JjZSBhbiBlcnJvciBpbiBmaXJzdCBjb21wcmVzc2VkIGJsb2NrICovCisgICAgY19zdHJlYW0uYXZhaWxfaW4gPSBsZW4gLSAzOworCisgICAgZXJyID0gZGVmbGF0ZSgmY19zdHJlYW0sIFpfRklOSVNIKTsKKyAgICBpZiAoZXJyICE9IFpfU1RSRUFNX0VORCkgeworICAgICAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOworICAgIH0KKyAgICBlcnIgPSBkZWZsYXRlRW5kKCZjX3N0cmVhbSk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGVFbmQiKTsKKworICAgICpjb21wckxlbiA9IGNfc3RyZWFtLnRvdGFsX291dDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUZXN0IGluZmxhdGVTeW5jKCkKKyAqLwordm9pZCB0ZXN0X3N5bmMoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKQorICAgIEJ5dGUgKmNvbXByLCAqdW5jb21wcjsKKyAgICB1TG9uZyBjb21wckxlbiwgdW5jb21wckxlbjsKK3sKKyAgICBpbnQgZXJyOworICAgIHpfc3RyZWFtIGRfc3RyZWFtOyAvKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqLworCisgICAgc3RyY3B5KChjaGFyKil1bmNvbXByLCAiZ2FyYmFnZSIpOworCisgICAgZF9zdHJlYW0uemFsbG9jID0gemFsbG9jOworICAgIGRfc3RyZWFtLnpmcmVlID0gemZyZWU7CisgICAgZF9zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOworCisgICAgZF9zdHJlYW0ubmV4dF9pbiAgPSBjb21wcjsKKyAgICBkX3N0cmVhbS5hdmFpbF9pbiA9IDI7IC8qIGp1c3QgcmVhZCB0aGUgemxpYiBoZWFkZXIgKi8KKworICAgIGVyciA9IGluZmxhdGVJbml0KCZkX3N0cmVhbSk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVJbml0Iik7CisKKyAgICBkX3N0cmVhbS5uZXh0X291dCA9IHVuY29tcHI7CisgICAgZF9zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpdW5jb21wckxlbjsKKworICAgIGluZmxhdGUoJmRfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZSIpOworCisgICAgZF9zdHJlYW0uYXZhaWxfaW4gPSAodUludCljb21wckxlbi0yOyAgIC8qIHJlYWQgYWxsIGNvbXByZXNzZWQgZGF0YSAqLworICAgIGVyciA9IGluZmxhdGVTeW5jKCZkX3N0cmVhbSk7ICAgICAgICAgICAvKiBidXQgc2tpcCB0aGUgZGFtYWdlZCBwYXJ0ICovCisgICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVTeW5jIik7CisKKyAgICBlcnIgPSBpbmZsYXRlKCZkX3N0cmVhbSwgWl9GSU5JU0gpOworICAgIGlmIChlcnIgIT0gWl9EQVRBX0VSUk9SKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW5mbGF0ZSBzaG91bGQgcmVwb3J0IERBVEFfRVJST1JcbiIpOworICAgICAgICAvKiBCZWNhdXNlIG9mIGluY29ycmVjdCBhZGxlcjMyICovCisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGVyciA9IGluZmxhdGVFbmQoJmRfc3RyZWFtKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZUVuZCIpOworCisgICAgcHJpbnRmKCJhZnRlciBpbmZsYXRlU3luYygpOiBoZWwlc1xuIiwgKGNoYXIgKil1bmNvbXByKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUZXN0IGRlZmxhdGUoKSB3aXRoIHByZXNldCBkaWN0aW9uYXJ5CisgKi8KK3ZvaWQgdGVzdF9kaWN0X2RlZmxhdGUoY29tcHIsIGNvbXByTGVuKQorICAgIEJ5dGUgKmNvbXByOworICAgIHVMb25nIGNvbXByTGVuOworeworICAgIHpfc3RyZWFtIGNfc3RyZWFtOyAvKiBjb21wcmVzc2lvbiBzdHJlYW0gKi8KKyAgICBpbnQgZXJyOworCisgICAgY19zdHJlYW0uemFsbG9jID0gemFsbG9jOworICAgIGNfc3RyZWFtLnpmcmVlID0gemZyZWU7CisgICAgY19zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOworCisgICAgZXJyID0gZGVmbGF0ZUluaXQoJmNfc3RyZWFtLCBaX0JFU1RfQ09NUFJFU1NJT04pOworICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlSW5pdCIpOworCisgICAgZXJyID0gZGVmbGF0ZVNldERpY3Rpb25hcnkoJmNfc3RyZWFtLAorICAgICAgICAgICAgICAgIChjb25zdCBCeXRlZiopZGljdGlvbmFyeSwgKGludClzaXplb2YoZGljdGlvbmFyeSkpOworICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlU2V0RGljdGlvbmFyeSIpOworCisgICAgZGljdElkID0gY19zdHJlYW0uYWRsZXI7CisgICAgY19zdHJlYW0ubmV4dF9vdXQgPSBjb21wcjsKKyAgICBjX3N0cmVhbS5hdmFpbF9vdXQgPSAodUludCljb21wckxlbjsKKworICAgIGNfc3RyZWFtLm5leHRfaW4gPSAoel9jb25zdCB1bnNpZ25lZCBjaGFyICopaGVsbG87CisgICAgY19zdHJlYW0uYXZhaWxfaW4gPSAodUludClzdHJsZW4oaGVsbG8pKzE7CisKKyAgICBlcnIgPSBkZWZsYXRlKCZjX3N0cmVhbSwgWl9GSU5JU0gpOworICAgIGlmIChlcnIgIT0gWl9TVFJFQU1fRU5EKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZGVmbGF0ZSBzaG91bGQgcmVwb3J0IFpfU1RSRUFNX0VORFxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGVyciA9IGRlZmxhdGVFbmQoJmNfc3RyZWFtKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZUVuZCIpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRlc3QgaW5mbGF0ZSgpIHdpdGggYSBwcmVzZXQgZGljdGlvbmFyeQorICovCit2b2lkIHRlc3RfZGljdF9pbmZsYXRlKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbikKKyAgICBCeXRlICpjb21wciwgKnVuY29tcHI7CisgICAgdUxvbmcgY29tcHJMZW4sIHVuY29tcHJMZW47Cit7CisgICAgaW50IGVycjsKKyAgICB6X3N0cmVhbSBkX3N0cmVhbTsgLyogZGVjb21wcmVzc2lvbiBzdHJlYW0gKi8KKworICAgIHN0cmNweSgoY2hhciopdW5jb21wciwgImdhcmJhZ2UiKTsKKworICAgIGRfc3RyZWFtLnphbGxvYyA9IHphbGxvYzsKKyAgICBkX3N0cmVhbS56ZnJlZSA9IHpmcmVlOworICAgIGRfc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKKworICAgIGRfc3RyZWFtLm5leHRfaW4gID0gY29tcHI7CisgICAgZF9zdHJlYW0uYXZhaWxfaW4gPSAodUludCljb21wckxlbjsKKworICAgIGVyciA9IGluZmxhdGVJbml0KCZkX3N0cmVhbSk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVJbml0Iik7CisKKyAgICBkX3N0cmVhbS5uZXh0X291dCA9IHVuY29tcHI7CisgICAgZF9zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpdW5jb21wckxlbjsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgZXJyID0gaW5mbGF0ZSgmZF9zdHJlYW0sIFpfTk9fRkxVU0gpOworICAgICAgICBpZiAoZXJyID09IFpfU1RSRUFNX0VORCkgYnJlYWs7CisgICAgICAgIGlmIChlcnIgPT0gWl9ORUVEX0RJQ1QpIHsKKyAgICAgICAgICAgIGlmIChkX3N0cmVhbS5hZGxlciAhPSBkaWN0SWQpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVuZXhwZWN0ZWQgZGljdGlvbmFyeSIpOworICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnIgPSBpbmZsYXRlU2V0RGljdGlvbmFyeSgmZF9zdHJlYW0sIChjb25zdCBCeXRlZiopZGljdGlvbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpc2l6ZW9mKGRpY3Rpb25hcnkpKTsKKyAgICAgICAgfQorICAgICAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZSB3aXRoIGRpY3QiKTsKKyAgICB9CisKKyAgICBlcnIgPSBpbmZsYXRlRW5kKCZkX3N0cmVhbSk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVFbmQiKTsKKworICAgIGlmIChzdHJjbXAoKGNoYXIqKXVuY29tcHIsIGhlbGxvKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCBpbmZsYXRlIHdpdGggZGljdFxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJpbmZsYXRlIHdpdGggZGljdGlvbmFyeTogJXNcbiIsIChjaGFyICopdW5jb21wcik7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFVzYWdlOiAgZXhhbXBsZSBbb3V0cHV0Lmd6ICBbaW5wdXQuZ3pdXQorICovCisKK2ludCBtYWluKGFyZ2MsIGFyZ3YpCisgICAgaW50IGFyZ2M7CisgICAgY2hhciAqYXJndltdOworeworICAgIEJ5dGUgKmNvbXByLCAqdW5jb21wcjsKKyAgICB1TG9uZyBjb21wckxlbiA9IDEwMDAwKnNpemVvZihpbnQpOyAvKiBkb24ndCBvdmVyZmxvdyBvbiBNU0RPUyAqLworICAgIHVMb25nIHVuY29tcHJMZW4gPSBjb21wckxlbjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogbXlWZXJzaW9uID0gWkxJQl9WRVJTSU9OOworCisgICAgaWYgKHpsaWJWZXJzaW9uKClbMF0gIT0gbXlWZXJzaW9uWzBdKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW5jb21wYXRpYmxlIHpsaWIgdmVyc2lvblxuIik7CisgICAgICAgIGV4aXQoMSk7CisKKyAgICB9IGVsc2UgaWYgKHN0cmNtcCh6bGliVmVyc2lvbigpLCBaTElCX1ZFUlNJT04pICE9IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ3YXJuaW5nOiBkaWZmZXJlbnQgemxpYiB2ZXJzaW9uXG4iKTsKKyAgICB9CisKKyAgICBwcmludGYoInpsaWIgdmVyc2lvbiAlcyA9IDB4JTA0eCwgY29tcGlsZSBmbGFncyA9IDB4JWx4XG4iLAorICAgICAgICAgICAgWkxJQl9WRVJTSU9OLCBaTElCX1ZFUk5VTSwgemxpYkNvbXBpbGVGbGFncygpKTsKKworICAgIGNvbXByICAgID0gKEJ5dGUqKWNhbGxvYygodUludCljb21wckxlbiwgMSk7CisgICAgdW5jb21wciAgPSAoQnl0ZSopY2FsbG9jKCh1SW50KXVuY29tcHJMZW4sIDEpOworICAgIC8qIGNvbXByIGFuZCB1bmNvbXByIGFyZSBjbGVhcmVkIHRvIGF2b2lkIHJlYWRpbmcgdW5pbml0aWFsaXplZAorICAgICAqIGRhdGEgYW5kIHRvIGVuc3VyZSB0aGF0IHVuY29tcHIgY29tcHJlc3NlcyB3ZWxsLgorICAgICAqLworICAgIGlmIChjb21wciA9PSBaX05VTEwgfHwgdW5jb21wciA9PSBaX05VTEwpIHsKKyAgICAgICAgcHJpbnRmKCJvdXQgb2YgbWVtb3J5XG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyNpZmRlZiBaX1NPTE8KKyAgICBhcmdjID0gc3RybGVuKGFyZ3ZbMF0pOworI2Vsc2UKKyAgICB0ZXN0X2NvbXByZXNzKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7CisKKyAgICB0ZXN0X2d6aW8oKGFyZ2MgPiAxID8gYXJndlsxXSA6IFRFU1RGSUxFKSwKKyAgICAgICAgICAgICAgdW5jb21wciwgdW5jb21wckxlbik7CisjZW5kaWYKKworICAgIHRlc3RfZGVmbGF0ZShjb21wciwgY29tcHJMZW4pOworICAgIHRlc3RfaW5mbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pOworCisgICAgdGVzdF9sYXJnZV9kZWZsYXRlKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7CisgICAgdGVzdF9sYXJnZV9pbmZsYXRlKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7CisKKyAgICB0ZXN0X2ZsdXNoKGNvbXByLCAmY29tcHJMZW4pOworICAgIHRlc3Rfc3luYyhjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pOworICAgIGNvbXByTGVuID0gdW5jb21wckxlbjsKKworICAgIHRlc3RfZGljdF9kZWZsYXRlKGNvbXByLCBjb21wckxlbik7CisgICAgdGVzdF9kaWN0X2luZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKKworICAgIGZyZWUoY29tcHIpOworICAgIGZyZWUodW5jb21wcik7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3psaWIvc3JjL3Rlc3QvaW5mY292ZXIuYyBiL3psaWIvc3JjL3Rlc3QvaW5mY292ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTNkOTIwCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvdGVzdC9pbmZjb3Zlci5jCkBAIC0wLDAgKzEsNjcxIEBACisvKiBpbmZjb3Zlci5jIC0tIHRlc3QgemxpYidzIGluZmxhdGUgcm91dGluZXMgd2l0aCBmdWxsIGNvZGUgY292ZXJhZ2UKKyAqIENvcHlyaWdodCAoQykgMjAxMSBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogdG8gdXNlLCBkbzogLi9jb25maWd1cmUgLS1jb3ZlciAmJiBtYWtlIGNvdmVyICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgInpsaWIuaCIKKworLyogZ2V0IGRlZmluaXRpb24gb2YgaW50ZXJuYWwgc3RydWN0dXJlIHNvIHdlIGNhbiBtZXNzIHdpdGggaXQgKHNlZSBwdWxsKCkpLAorICAgYW5kIHNvIHdlIGNhbiBjYWxsIGluZmxhdGVfdHJlZXMoKSAoc2VlIGNvdmVyNSgpKSAqLworI2RlZmluZSBaTElCX0lOVEVSTkFMCisjaW5jbHVkZSAiaW5mdHJlZXMuaCIKKyNpbmNsdWRlICJpbmZsYXRlLmgiCisKKyNkZWZpbmUgbG9jYWwgc3RhdGljCisKKy8qIC0tIG1lbW9yeSB0cmFja2luZyByb3V0aW5lcyAtLSAqLworCisvKgorICAgVGhlc2UgbWVtb3J5IHRyYWNraW5nIHJvdXRpbmVzIGFyZSBwcm92aWRlZCB0byB6bGliIGFuZCB0cmFjayBhbGwgb2YgemxpYidzCisgICBhbGxvY2F0aW9ucyBhbmQgZGVhbGxvY2F0aW9ucywgY2hlY2sgZm9yIExJRk8gb3BlcmF0aW9ucywga2VlcCBhIGN1cnJlbnQKKyAgIGFuZCBoaWdoIHdhdGVyIG1hcmsgb2YgdG90YWwgYnl0ZXMgcmVxdWVzdGVkLCBvcHRpb25hbGx5IHNldCBhIGxpbWl0IG9uIHRoZQorICAgdG90YWwgbWVtb3J5IHRoYXQgY2FuIGJlIGFsbG9jYXRlZCwgYW5kIHdoZW4gZG9uZSBjaGVjayBmb3IgbWVtb3J5IGxlYWtzLgorCisgICBUaGV5IGFyZSB1c2VkIGFzIGZvbGxvd3M6CisKKyAgIHpfc3RyZWFtIHN0cm07CisgICBtZW1fc2V0dXAoJnN0cm0pICAgICAgICAgaW5pdGlhbGl6ZXMgdGhlIG1lbW9yeSB0cmFja2luZyBhbmQgc2V0cyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6YWxsb2MsIHpmcmVlLCBhbmQgb3BhcXVlIG1lbWJlcnMgb2Ygc3RybSB0byB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgdHJhY2tpbmcgZm9yIGFsbCB6bGliIG9wZXJhdGlvbnMgb24gc3RybQorICAgbWVtX2xpbWl0KCZzdHJtLCBsaW1pdCkgIHNldHMgYSBsaW1pdCBvbiB0aGUgdG90YWwgYnl0ZXMgcmVxdWVzdGVkIC0tIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0IHRoYXQgZXhjZWVkcyB0aGlzIGxpbWl0IHdpbGwgcmVzdWx0IGluIGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGlvbiBmYWlsdXJlIChyZXR1cm5zIE5VTEwpIC0tIHNldHRpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgdG8gemVybyBtZWFucyBubyBsaW1pdCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlciBtZW1fc2V0dXAoKQorICAgbWVtX3VzZWQoJnN0cm0sICJtc2ciKSAgIHByaW50cyB0byBzdGRlcnIgIm1zZyIgYW5kIHRoZSB0b3RhbCBieXRlcyB1c2VkCisgICBtZW1faGlnaCgmc3RybSwgIm1zZyIpICAgcHJpbnRzIHRvIHN0ZGVyciAibXNnIiBhbmQgdGhlIGhpZ2ggd2F0ZXIgbWFyaworICAgbWVtX2RvbmUoJnN0cm0sICJtc2ciKSAgIGVuZHMgbWVtb3J5IHRyYWNraW5nLCByZWxlYXNlcyBhbGwgYWxsb2NhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIHRyYWNraW5nIGFzIHdlbGwgYXMgbGVha2VkIHpsaWIgYmxvY2tzLCBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueS4gIElmIHRoZXJlIHdhcyBhbnl0aGluZyB1bnVzdWFsLCBzdWNoIGFzIGxlYWtlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrcywgbm9uLUZJRk8gZnJlZXMsIG9yIGZyZWVzIG9mIGFkZHJlc3NlcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQsIHRoZW4gIm1zZyIgYW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JsZW0gaXMgcHJpbnRlZCB0byBzdGRlcnIuICBJZiBldmVyeXRoaW5nIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsLCBub3RoaW5nIGlzIHByaW50ZWQuIG1lbV9kb25lIHJlc2V0cyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJtIG1lbWJlcnMgdG8gWl9OVUxMIHRvIHVzZSB0aGUgZGVmYXVsdCBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uIHJvdXRpbmVzIG9uIHRoZSBuZXh0IHpsaWIgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBzdHJtLgorICovCisKKy8qIHRoZXNlIGl0ZW1zIGFyZSBzdHJ1bmcgdG9nZXRoZXIgaW4gYSBsaW5rZWQgbGlzdCwgb25lIGZvciBlYWNoIGFsbG9jYXRpb24gKi8KK3N0cnVjdCBtZW1faXRlbSB7CisgICAgdm9pZCAqcHRyOyAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYWxsb2NhdGVkIG1lbW9yeSAqLworICAgIHNpemVfdCBzaXplOyAgICAgICAgICAgICAgICAvKiByZXF1ZXN0ZWQgc2l6ZSBvZiBhbGxvY2F0aW9uICovCisgICAgc3RydWN0IG1lbV9pdGVtICpuZXh0OyAgICAgIC8qIHBvaW50ZXIgdG8gbmV4dCBpdGVtIGluIGxpc3QsIG9yIE5VTEwgKi8KK307CisKKy8qIHRoaXMgc3RydWN0dXJlIGlzIGF0IHRoZSByb290IG9mIHRoZSBsaW5rZWQgbGlzdCwgYW5kIHRyYWNrcyBzdGF0aXN0aWNzICovCitzdHJ1Y3QgbWVtX3pvbmUgeworICAgIHN0cnVjdCBtZW1faXRlbSAqZmlyc3Q7ICAgICAvKiBwb2ludGVyIHRvIGZpcnN0IGl0ZW0gaW4gbGlzdCwgb3IgTlVMTCAqLworICAgIHNpemVfdCB0b3RhbCwgaGlnaHdhdGVyOyAgICAvKiB0b3RhbCBhbGxvY2F0aW9ucywgYW5kIGxhcmdlc3QgdG90YWwgKi8KKyAgICBzaXplX3QgbGltaXQ7ICAgICAgICAgICAgICAgLyogbWVtb3J5IGFsbG9jYXRpb24gbGltaXQsIG9yIDAgaWYgbm8gbGltaXQgKi8KKyAgICBpbnQgbm90bGlmbywgcm9ndWU7ICAgICAgICAgLyogY291bnRzIG9mIG5vbi1MSUZPIGZyZWVzIGFuZCByb2d1ZSBmcmVlcyAqLworfTsKKworLyogbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZSB0byBwYXNzIHRvIHpsaWIgKi8KK2xvY2FsIHZvaWQgKm1lbV9hbGxvYyh2b2lkICptZW0sIHVuc2lnbmVkIGNvdW50LCB1bnNpZ25lZCBzaXplKQoreworICAgIHZvaWQgKnB0cjsKKyAgICBzdHJ1Y3QgbWVtX2l0ZW0gKml0ZW07CisgICAgc3RydWN0IG1lbV96b25lICp6b25lID0gbWVtOworICAgIHNpemVfdCBsZW4gPSBjb3VudCAqIChzaXplX3Qpc2l6ZTsKKworICAgIC8qIGluZHVjZWQgYWxsb2NhdGlvbiBmYWlsdXJlICovCisgICAgaWYgKHpvbmUgPT0gTlVMTCB8fCAoem9uZS0+bGltaXQgJiYgem9uZS0+dG90YWwgKyBsZW4gPiB6b25lLT5saW1pdCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogcGVyZm9ybSBhbGxvY2F0aW9uIHVzaW5nIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LCBmaWxsIG1lbW9yeSB3aXRoIGEKKyAgICAgICBub24temVybyB2YWx1ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY29kZSBpc24ndCBkZXBlbmRpbmcgb24gemVyb3MgKi8KKyAgICBwdHIgPSBtYWxsb2MobGVuKTsKKyAgICBpZiAocHRyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbXNldChwdHIsIDB4YTUsIGxlbik7CisKKyAgICAvKiBjcmVhdGUgYSBuZXcgaXRlbSBmb3IgdGhlIGxpc3QgKi8KKyAgICBpdGVtID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWVtX2l0ZW0pKTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgIGZyZWUocHRyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGl0ZW0tPnB0ciA9IHB0cjsKKyAgICBpdGVtLT5zaXplID0gbGVuOworCisgICAgLyogaW5zZXJ0IGl0ZW0gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdCAqLworICAgIGl0ZW0tPm5leHQgPSB6b25lLT5maXJzdDsKKyAgICB6b25lLT5maXJzdCA9IGl0ZW07CisKKyAgICAvKiB1cGRhdGUgdGhlIHN0YXRpc3RpY3MgKi8KKyAgICB6b25lLT50b3RhbCArPSBpdGVtLT5zaXplOworICAgIGlmICh6b25lLT50b3RhbCA+IHpvbmUtPmhpZ2h3YXRlcikKKyAgICAgICAgem9uZS0+aGlnaHdhdGVyID0gem9uZS0+dG90YWw7CisKKyAgICAvKiByZXR1cm4gdGhlIGFsbG9jYXRlZCBtZW1vcnkgKi8KKyAgICByZXR1cm4gcHRyOworfQorCisvKiBtZW1vcnkgZnJlZSByb3V0aW5lIHRvIHBhc3MgdG8gemxpYiAqLworbG9jYWwgdm9pZCBtZW1fZnJlZSh2b2lkICptZW0sIHZvaWQgKnB0cikKK3sKKyAgICBzdHJ1Y3QgbWVtX2l0ZW0gKml0ZW0sICpuZXh0OworICAgIHN0cnVjdCBtZW1fem9uZSAqem9uZSA9IG1lbTsKKworICAgIC8qIGlmIG5vIHpvbmUsIGp1c3QgZG8gYSBmcmVlICovCisgICAgaWYgKHpvbmUgPT0gTlVMTCkgeworICAgICAgICBmcmVlKHB0cik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBwb2ludCBuZXh0IHRvIHRoZSBpdGVtIHRoYXQgbWF0Y2hlcyBwdHIsIG9yIE5VTEwgaWYgbm90IGZvdW5kIC0tIHJlbW92ZQorICAgICAgIHRoZSBpdGVtIGZyb20gdGhlIGxpbmtlZCBsaXN0IGlmIGZvdW5kICovCisgICAgbmV4dCA9IHpvbmUtPmZpcnN0OworICAgIGlmIChuZXh0KSB7CisgICAgICAgIGlmIChuZXh0LT5wdHIgPT0gcHRyKQorICAgICAgICAgICAgem9uZS0+Zmlyc3QgPSBuZXh0LT5uZXh0OyAgIC8qIGZpcnN0IG9uZSBpcyBpdCwgcmVtb3ZlIGZyb20gbGlzdCAqLworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZWFyY2ggdGhlIGxpbmtlZCBsaXN0ICovCisgICAgICAgICAgICAgICAgaXRlbSA9IG5leHQ7CisgICAgICAgICAgICAgICAgbmV4dCA9IGl0ZW0tPm5leHQ7CisgICAgICAgICAgICB9IHdoaWxlIChuZXh0ICE9IE5VTEwgJiYgbmV4dC0+cHRyICE9IHB0cik7CisgICAgICAgICAgICBpZiAobmV4dCkgeyAgICAgICAgICAgICAgICAgLyogaWYgZm91bmQsIHJlbW92ZSBmcm9tIGxpbmtlZCBsaXN0ICovCisgICAgICAgICAgICAgICAgaXRlbS0+bmV4dCA9IG5leHQtPm5leHQ7CisgICAgICAgICAgICAgICAgem9uZS0+bm90bGlmbysrOyAgICAgICAgLyogbm90IGEgTElGTyBmcmVlICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIGZvdW5kLCB1cGRhdGUgdGhlIHN0YXRpc3RpY3MgYW5kIGZyZWUgdGhlIGl0ZW0gKi8KKyAgICBpZiAobmV4dCkgeworICAgICAgICB6b25lLT50b3RhbCAtPSBuZXh0LT5zaXplOworICAgICAgICBmcmVlKG5leHQpOworICAgIH0KKworICAgIC8qIGlmIG5vdCBmb3VuZCwgdXBkYXRlIHRoZSByb2d1ZSBjb3VudCAqLworICAgIGVsc2UKKyAgICAgICAgem9uZS0+cm9ndWUrKzsKKworICAgIC8qIGluIGFueSBjYXNlLCBkbyB0aGUgcmVxdWVzdGVkIGZyZWUgd2l0aCB0aGUgc3RhbmRhcmQgbGlicmFyeSBmdW5jdGlvbiAqLworICAgIGZyZWUocHRyKTsKK30KKworLyogc2V0IHVwIGEgY29udHJvbGxlZCBtZW1vcnkgYWxsb2NhdGlvbiBzcGFjZSBmb3IgbW9uaXRvcmluZywgc2V0IHRoZSBzdHJlYW0KKyAgIHBhcmFtZXRlcnMgdG8gdGhlIGNvbnRyb2xsZWQgcm91dGluZXMsIHdpdGggb3BhcXVlIHBvaW50aW5nIHRvIHRoZSBzcGFjZSAqLworbG9jYWwgdm9pZCBtZW1fc2V0dXAoel9zdHJlYW0gKnN0cm0pCit7CisgICAgc3RydWN0IG1lbV96b25lICp6b25lOworCisgICAgem9uZSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IG1lbV96b25lKSk7CisgICAgYXNzZXJ0KHpvbmUgIT0gTlVMTCk7CisgICAgem9uZS0+Zmlyc3QgPSBOVUxMOworICAgIHpvbmUtPnRvdGFsID0gMDsKKyAgICB6b25lLT5oaWdod2F0ZXIgPSAwOworICAgIHpvbmUtPmxpbWl0ID0gMDsKKyAgICB6b25lLT5ub3RsaWZvID0gMDsKKyAgICB6b25lLT5yb2d1ZSA9IDA7CisgICAgc3RybS0+b3BhcXVlID0gem9uZTsKKyAgICBzdHJtLT56YWxsb2MgPSBtZW1fYWxsb2M7CisgICAgc3RybS0+emZyZWUgPSBtZW1fZnJlZTsKK30KKworLyogc2V0IGEgbGltaXQgb24gdGhlIHRvdGFsIG1lbW9yeSBhbGxvY2F0aW9uLCBvciAwIHRvIHJlbW92ZSB0aGUgbGltaXQgKi8KK2xvY2FsIHZvaWQgbWVtX2xpbWl0KHpfc3RyZWFtICpzdHJtLCBzaXplX3QgbGltaXQpCit7CisgICAgc3RydWN0IG1lbV96b25lICp6b25lID0gc3RybS0+b3BhcXVlOworCisgICAgem9uZS0+bGltaXQgPSBsaW1pdDsKK30KKworLyogc2hvdyB0aGUgY3VycmVudCB0b3RhbCByZXF1ZXN0ZWQgYWxsb2NhdGlvbnMgaW4gYnl0ZXMgKi8KK2xvY2FsIHZvaWQgbWVtX3VzZWQoel9zdHJlYW0gKnN0cm0sIGNoYXIgKnByZWZpeCkKK3sKKyAgICBzdHJ1Y3QgbWVtX3pvbmUgKnpvbmUgPSBzdHJtLT5vcGFxdWU7CisKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlbHUgYWxsb2NhdGVkXG4iLCBwcmVmaXgsIHpvbmUtPnRvdGFsKTsKK30KKworLyogc2hvdyB0aGUgaGlnaCB3YXRlciBhbGxvY2F0aW9uIGluIGJ5dGVzICovCitsb2NhbCB2b2lkIG1lbV9oaWdoKHpfc3RyZWFtICpzdHJtLCBjaGFyICpwcmVmaXgpCit7CisgICAgc3RydWN0IG1lbV96b25lICp6b25lID0gc3RybS0+b3BhcXVlOworCisgICAgZnByaW50ZihzdGRlcnIsICIlczogJWx1IGhpZ2ggd2F0ZXIgbWFya1xuIiwgcHJlZml4LCB6b25lLT5oaWdod2F0ZXIpOworfQorCisvKiByZWxlYXNlIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiB6b25lIC0tIGlmIHRoZXJlIGFyZSBhbnkgc3VycHJpc2VzLCBub3RpZnkgKi8KK2xvY2FsIHZvaWQgbWVtX2RvbmUoel9zdHJlYW0gKnN0cm0sIGNoYXIgKnByZWZpeCkKK3sKKyAgICBpbnQgY291bnQgPSAwOworICAgIHN0cnVjdCBtZW1faXRlbSAqaXRlbSwgKm5leHQ7CisgICAgc3RydWN0IG1lbV96b25lICp6b25lID0gc3RybS0+b3BhcXVlOworCisgICAgLyogc2hvdyBoaWdoIHdhdGVyIG1hcmsgKi8KKyAgICBtZW1faGlnaChzdHJtLCBwcmVmaXgpOworCisgICAgLyogZnJlZSBsZWZ0b3ZlciBhbGxvY2F0aW9ucyBhbmQgaXRlbSBzdHJ1Y3R1cmVzLCBpZiBhbnkgKi8KKyAgICBpdGVtID0gem9uZS0+Zmlyc3Q7CisgICAgd2hpbGUgKGl0ZW0gIT0gTlVMTCkgeworICAgICAgICBmcmVlKGl0ZW0tPnB0cik7CisgICAgICAgIG5leHQgPSBpdGVtLT5uZXh0OworICAgICAgICBmcmVlKGl0ZW0pOworICAgICAgICBpdGVtID0gbmV4dDsKKyAgICAgICAgY291bnQrKzsKKyAgICB9CisKKyAgICAvKiBpc3N1ZSBhbGVydHMgYWJvdXQgYW55dGhpbmcgdW5leHBlY3RlZCAqLworICAgIGlmIChjb3VudCB8fCB6b25lLT50b3RhbCkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIqKiAlczogJWx1IGJ5dGVzIGluICVkIGJsb2NrcyBub3QgZnJlZWRcbiIsCisgICAgICAgICAgICAgICAgcHJlZml4LCB6b25lLT50b3RhbCwgY291bnQpOworICAgIGlmICh6b25lLT5ub3RsaWZvKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIioqICVzOiAlZCBmcmVlcyBub3QgTElGT1xuIiwgcHJlZml4LCB6b25lLT5ub3RsaWZvKTsKKyAgICBpZiAoem9uZS0+cm9ndWUpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiKiogJXM6ICVkIGZyZWVzIG5vdCByZWNvZ25pemVkXG4iLAorICAgICAgICAgICAgICAgIHByZWZpeCwgem9uZS0+cm9ndWUpOworCisgICAgLyogZnJlZSB0aGUgem9uZSBhbmQgZGVsZXRlIGZyb20gdGhlIHN0cmVhbSAqLworICAgIGZyZWUoem9uZSk7CisgICAgc3RybS0+b3BhcXVlID0gWl9OVUxMOworICAgIHN0cm0tPnphbGxvYyA9IFpfTlVMTDsKKyAgICBzdHJtLT56ZnJlZSA9IFpfTlVMTDsKK30KKworLyogLS0gaW5mbGF0ZSB0ZXN0IHJvdXRpbmVzIC0tICovCisKKy8qIERlY29kZSBhIGhleGFkZWNpbWFsIHN0cmluZywgc2V0ICpsZW4gdG8gbGVuZ3RoLCBpbltdIHRvIHRoZSBieXRlcy4gIFRoaXMKKyAgIGRlY29kZXMgbGliZXJhbGx5LCBpbiB0aGF0IGhleCBkaWdpdHMgY2FuIGJlIGFkamFjZW50LCBpbiB3aGljaCBjYXNlIHR3byBpbgorICAgYSByb3cgd3JpdGVzIGEgYnl0ZS4gIE9yIHRoZXkgY2FuIGRlbGltaXRlZCBieSBhbnkgbm9uLWhleCBjaGFyYWN0ZXIsIHdoZXJlCisgICB0aGUgZGVsaW1pdGVycyBhcmUgaWdub3JlZCBleGNlcHQgd2hlbiBhIHNpbmdsZSBoZXggZGlnaXQgaXMgZm9sbG93ZWQgYnkgYQorICAgZGVsaW1pdGVyIGluIHdoaWNoIGNhc2UgdGhhdCBzaW5nbGUgZGlnaXQgd3JpdGVzIGEgYnl0ZS4gIFRoZSByZXR1cm5lZAorICAgZGF0YSBpcyBhbGxvY2F0ZWQgYW5kIG11c3QgZXZlbnR1YWxseSBiZSBmcmVlZC4gIE5VTEwgaXMgcmV0dXJuZWQgaWYgb3V0IG9mCisgICBtZW1vcnkuICBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBuZWVkZWQsIHRoZW4gbGVuIGNhbiBiZSBOVUxMLiAqLworbG9jYWwgdW5zaWduZWQgY2hhciAqaDJiKGNvbnN0IGNoYXIgKmhleCwgdW5zaWduZWQgKmxlbikKK3sKKyAgICB1bnNpZ25lZCBjaGFyICppbjsKKyAgICB1bnNpZ25lZCBuZXh0LCB2YWw7CisKKyAgICBpbiA9IG1hbGxvYygoc3RybGVuKGhleCkgKyAxKSA+PiAxKTsKKyAgICBpZiAoaW4gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbmV4dCA9IDA7CisgICAgdmFsID0gMTsKKyAgICBkbyB7CisgICAgICAgIGlmICgqaGV4ID49ICcwJyAmJiAqaGV4IDw9ICc5JykKKyAgICAgICAgICAgIHZhbCA9ICh2YWwgPDwgNCkgKyAqaGV4IC0gJzAnOworICAgICAgICBlbHNlIGlmICgqaGV4ID49ICdBJyAmJiAqaGV4IDw9ICdGJykKKyAgICAgICAgICAgIHZhbCA9ICh2YWwgPDwgNCkgKyAqaGV4IC0gJ0EnICsgMTA7CisgICAgICAgIGVsc2UgaWYgKCpoZXggPj0gJ2EnICYmICpoZXggPD0gJ2YnKQorICAgICAgICAgICAgdmFsID0gKHZhbCA8PCA0KSArICpoZXggLSAnYScgKyAxMDsKKyAgICAgICAgZWxzZSBpZiAodmFsICE9IDEgJiYgdmFsIDwgMzIpICAvKiBvbmUgZGlnaXQgZm9sbG93ZWQgYnkgZGVsaW1pdGVyICovCisgICAgICAgICAgICB2YWwgKz0gMjQwOyAgICAgICAgICAgICAgICAgLyogbWFrZSBpdCBsb29rIGxpa2UgdHdvIGRpZ2l0cyAqLworICAgICAgICBpZiAodmFsID4gMjU1KSB7ICAgICAgICAgICAgICAgIC8qIGhhdmUgdHdvIGRpZ2l0cyAqLworICAgICAgICAgICAgaW5bbmV4dCsrXSA9IHZhbCAmIDB4ZmY7ICAgIC8qIHNhdmUgdGhlIGRlY29kZWQgYnl0ZSAqLworICAgICAgICAgICAgdmFsID0gMTsgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IG92ZXIgKi8KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKCpoZXgrKyk7ICAgICAgIC8qIGdvIHRocm91Z2ggdGhlIGxvb3Agd2l0aCB0aGUgdGVybWluYXRpbmcgbnVsbCAqLworICAgIGlmIChsZW4gIT0gTlVMTCkKKyAgICAgICAgKmxlbiA9IG5leHQ7CisgICAgaW4gPSByZWFsbG9jZihpbiwgbmV4dCk7CisgICAgcmV0dXJuIGluOworfQorCisvKiBnZW5lcmljIGluZmxhdGUoKSBydW4sIHdoZXJlIGhleCBpcyB0aGUgaGV4YWRlY2ltYWwgaW5wdXQgZGF0YSwgd2hhdCBpcyB0aGUKKyAgIHRleHQgdG8gaW5jbHVkZSBpbiBhbiBlcnJvciBtZXNzYWdlLCBzdGVwIGlzIGhvdyBtdWNoIGlucHV0IGRhdGEgdG8gZmVlZAorICAgaW5mbGF0ZSgpIG9uIGVhY2ggY2FsbCwgb3IgemVybyB0byBmZWVkIGl0IGFsbCwgd2luIGlzIHRoZSB3aW5kb3cgYml0cworICAgcGFyYW1ldGVyIHRvIGluZmxhdGVJbml0MigpLCBsZW4gaXMgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIsIGFuZCBlcnIKKyAgIGlzIHRoZSBlcnJvciBjb2RlIGV4cGVjdGVkIGZyb20gdGhlIGZpcnN0IGluZmxhdGUoKSBjYWxsICh0aGUgc2Vjb25kCisgICBpbmZsYXRlKCkgY2FsbCBpcyBleHBlY3RlZCB0byByZXR1cm4gWl9TVFJFQU1fRU5EKS4gIElmIHdpbiBpcyA0NywgdGhlbgorICAgaGVhZGVyIGluZm9ybWF0aW9uIGlzIGNvbGxlY3RlZCB3aXRoIGluZmxhdGVHZXRIZWFkZXIoKS4gIElmIGEgemxpYiBzdHJlYW0KKyAgIGlzIGxvb2tpbmcgZm9yIGEgZGljdGlvbmFyeSwgdGhlbiBhbiBlbXB0eSBkaWN0aW9uYXJ5IGlzIHByb3ZpZGVkLgorICAgaW5mbGF0ZSgpIGlzIHJ1biB1bnRpbCBhbGwgb2YgdGhlIGlucHV0IGRhdGEgaXMgY29uc3VtZWQuICovCitsb2NhbCB2b2lkIGluZihjaGFyICpoZXgsIGNoYXIgKndoYXQsIHVuc2lnbmVkIHN0ZXAsIGludCB3aW4sIHVuc2lnbmVkIGxlbiwKKyAgICAgICAgICAgICAgIGludCBlcnIpCit7CisgICAgaW50IHJldDsKKyAgICB1bnNpZ25lZCBoYXZlOworICAgIHVuc2lnbmVkIGNoYXIgKmluLCAqb3V0OworICAgIHpfc3RyZWFtIHN0cm0sIGNvcHk7CisgICAgZ3pfaGVhZGVyIGhlYWQ7CisKKyAgICBtZW1fc2V0dXAoJnN0cm0pOworICAgIHN0cm0uYXZhaWxfaW4gPSAwOworICAgIHN0cm0ubmV4dF9pbiA9IFpfTlVMTDsKKyAgICByZXQgPSBpbmZsYXRlSW5pdDIoJnN0cm0sIHdpbik7CisgICAgaWYgKHJldCAhPSBaX09LKSB7CisgICAgICAgIG1lbV9kb25lKCZzdHJtLCB3aGF0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBvdXQgPSBtYWxsb2MobGVuKTsgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChvdXQgIT0gTlVMTCk7CisgICAgaWYgKHdpbiA9PSA0NykgeworICAgICAgICBoZWFkLmV4dHJhID0gb3V0OworICAgICAgICBoZWFkLmV4dHJhX21heCA9IGxlbjsKKyAgICAgICAgaGVhZC5uYW1lID0gb3V0OworICAgICAgICBoZWFkLm5hbWVfbWF4ID0gbGVuOworICAgICAgICBoZWFkLmNvbW1lbnQgPSBvdXQ7CisgICAgICAgIGhlYWQuY29tbV9tYXggPSBsZW47CisgICAgICAgIHJldCA9IGluZmxhdGVHZXRIZWFkZXIoJnN0cm0sICZoZWFkKTsgICBhc3NlcnQocmV0ID09IFpfT0spOworICAgIH0KKyAgICBpbiA9IGgyYihoZXgsICZoYXZlKTsgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChpbiAhPSBOVUxMKTsKKyAgICBpZiAoc3RlcCA9PSAwIHx8IHN0ZXAgPiBoYXZlKQorICAgICAgICBzdGVwID0gaGF2ZTsKKyAgICBzdHJtLmF2YWlsX2luID0gc3RlcDsKKyAgICBoYXZlIC09IHN0ZXA7CisgICAgc3RybS5uZXh0X2luID0gaW47CisgICAgZG8geworICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlbjsKKyAgICAgICAgc3RybS5uZXh0X291dCA9IG91dDsKKyAgICAgICAgcmV0ID0gaW5mbGF0ZSgmc3RybSwgWl9OT19GTFVTSCk7ICAgICAgIGFzc2VydChlcnIgPT0gOSB8fCByZXQgPT0gZXJyKTsKKyAgICAgICAgaWYgKHJldCAhPSBaX09LICYmIHJldCAhPSBaX0JVRl9FUlJPUiAmJiByZXQgIT0gWl9ORUVEX0RJQ1QpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKHJldCA9PSBaX05FRURfRElDVCkgeworICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZVNldERpY3Rpb25hcnkoJnN0cm0sIGluLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9EQVRBX0VSUk9SKTsKKyAgICAgICAgICAgIG1lbV9saW1pdCgmc3RybSwgMSk7CisgICAgICAgICAgICByZXQgPSBpbmZsYXRlU2V0RGljdGlvbmFyeSgmc3RybSwgb3V0LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9NRU1fRVJST1IpOworICAgICAgICAgICAgbWVtX2xpbWl0KCZzdHJtLCAwKTsKKyAgICAgICAgICAgICgoc3RydWN0IGluZmxhdGVfc3RhdGUgKilzdHJtLnN0YXRlKS0+bW9kZSA9IERJQ1Q7CisgICAgICAgICAgICByZXQgPSBpbmZsYXRlU2V0RGljdGlvbmFyeSgmc3RybSwgb3V0LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9PSyk7CisgICAgICAgICAgICByZXQgPSBpbmZsYXRlKCZzdHJtLCBaX05PX0ZMVVNIKTsgICBhc3NlcnQocmV0ID09IFpfQlVGX0VSUk9SKTsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBpbmZsYXRlQ29weSgmY29weSwgJnN0cm0pOyAgICAgICAgYXNzZXJ0KHJldCA9PSBaX09LKTsKKyAgICAgICAgcmV0ID0gaW5mbGF0ZUVuZCgmY29weSk7ICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9PSyk7CisgICAgICAgIGVyciA9IDk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgY2FyZSBuZXh0IHRpbWUgYXJvdW5kICovCisgICAgICAgIGhhdmUgKz0gc3RybS5hdmFpbF9pbjsKKyAgICAgICAgc3RybS5hdmFpbF9pbiA9IHN0ZXAgPiBoYXZlID8gaGF2ZSA6IHN0ZXA7CisgICAgICAgIGhhdmUgLT0gc3RybS5hdmFpbF9pbjsKKyAgICB9IHdoaWxlIChzdHJtLmF2YWlsX2luKTsKKyAgICBmcmVlKGluKTsKKyAgICBmcmVlKG91dCk7CisgICAgcmV0ID0gaW5mbGF0ZVJlc2V0Migmc3RybSwgLTgpOyAgICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfT0spOworICAgIHJldCA9IGluZmxhdGVFbmQoJnN0cm0pOyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX09LKTsKKyAgICBtZW1fZG9uZSgmc3RybSwgd2hhdCk7Cit9CisKKy8qIGNvdmVyIGFsbCBvZiB0aGUgbGluZXMgaW4gaW5mbGF0ZS5jIHVwIHRvIGluZmxhdGUoKSAqLworbG9jYWwgdm9pZCBjb3Zlcl9zdXBwb3J0KHZvaWQpCit7CisgICAgaW50IHJldDsKKyAgICB6X3N0cmVhbSBzdHJtOworCisgICAgbWVtX3NldHVwKCZzdHJtKTsKKyAgICBzdHJtLmF2YWlsX2luID0gMDsKKyAgICBzdHJtLm5leHRfaW4gPSBaX05VTEw7CisgICAgcmV0ID0gaW5mbGF0ZUluaXQoJnN0cm0pOyAgICAgICAgICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfT0spOworICAgIG1lbV91c2VkKCZzdHJtLCAiaW5mbGF0ZSBpbml0Iik7CisgICAgcmV0ID0gaW5mbGF0ZVByaW1lKCZzdHJtLCA1LCAzMSk7ICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfT0spOworICAgIHJldCA9IGluZmxhdGVQcmltZSgmc3RybSwgLTEsIDApOyAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX09LKTsKKyAgICByZXQgPSBpbmZsYXRlU2V0RGljdGlvbmFyeSgmc3RybSwgWl9OVUxMLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9TVFJFQU1fRVJST1IpOworICAgIHJldCA9IGluZmxhdGVFbmQoJnN0cm0pOyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX09LKTsKKyAgICBtZW1fZG9uZSgmc3RybSwgInByaW1lIik7CisKKyAgICBpbmYoIjYzIDAiLCAiZm9yY2Ugd2luZG93IGFsbG9jYXRpb24iLCAwLCAtMTUsIDEsIFpfT0spOworICAgIGluZigiNjMgMTggNSIsICJmb3JjZSB3aW5kb3cgcmVwbGFjZW1lbnQiLCAwLCAtOCwgMjU5LCBaX09LKTsKKyAgICBpbmYoIjYzIDE4IDY4IDMwIGQwIDAgMCIsICJmb3JjZSBzcGxpdCB3aW5kb3cgdXBkYXRlIiwgNCwgLTgsIDI1OSwgWl9PSyk7CisgICAgaW5mKCIzIDAiLCAidXNlIGZpeGVkIGJsb2NrcyIsIDAsIC0xNSwgMSwgWl9TVFJFQU1fRU5EKTsKKyAgICBpbmYoIiIsICJiYWQgd2luZG93IHNpemUiLCAwLCAxLCAwLCBaX1NUUkVBTV9FUlJPUik7CisKKyAgICBtZW1fc2V0dXAoJnN0cm0pOworICAgIHN0cm0uYXZhaWxfaW4gPSAwOworICAgIHN0cm0ubmV4dF9pbiA9IFpfTlVMTDsKKyAgICByZXQgPSBpbmZsYXRlSW5pdF8oJnN0cm0sIFpMSUJfVkVSU0lPTiAtIDEsIChpbnQpc2l6ZW9mKHpfc3RyZWFtKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfVkVSU0lPTl9FUlJPUik7CisgICAgbWVtX2RvbmUoJnN0cm0sICJ3cm9uZyB2ZXJzaW9uIik7CisKKyAgICBzdHJtLmF2YWlsX2luID0gMDsKKyAgICBzdHJtLm5leHRfaW4gPSBaX05VTEw7CisgICAgcmV0ID0gaW5mbGF0ZUluaXQoJnN0cm0pOyAgICAgICAgICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfT0spOworICAgIHJldCA9IGluZmxhdGVFbmQoJnN0cm0pOyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX09LKTsKKyAgICBmcHV0cygiaW5mbGF0ZSBidWlsdC1pbiBtZW1vcnkgcm91dGluZXNcbiIsIHN0ZGVycik7Cit9CisKKy8qIGNvdmVyIGFsbCBpbmZsYXRlKCkgaGVhZGVyIGFuZCB0cmFpbGVyIGNhc2VzIGFuZCBjb2RlIGFmdGVyIGluZmxhdGUoKSAqLworbG9jYWwgdm9pZCBjb3Zlcl93cmFwKHZvaWQpCit7CisgICAgaW50IHJldDsKKyAgICB6X3N0cmVhbSBzdHJtLCBjb3B5OworICAgIHVuc2lnbmVkIGNoYXIgZGljdFsyNTddOworCisgICAgcmV0ID0gaW5mbGF0ZShaX05VTEwsIDApOyAgICAgICAgICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfU1RSRUFNX0VSUk9SKTsKKyAgICByZXQgPSBpbmZsYXRlRW5kKFpfTlVMTCk7ICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9TVFJFQU1fRVJST1IpOworICAgIHJldCA9IGluZmxhdGVDb3B5KFpfTlVMTCwgWl9OVUxMKTsgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX1NUUkVBTV9FUlJPUik7CisgICAgZnB1dHMoImluZmxhdGUgYmFkIHBhcmFtZXRlcnNcbiIsIHN0ZGVycik7CisKKyAgICBpbmYoIjFmIDhiIDAgMCIsICJiYWQgZ3ppcCBtZXRob2QiLCAwLCAzMSwgMCwgWl9EQVRBX0VSUk9SKTsKKyAgICBpbmYoIjFmIDhiIDggODAiLCAiYmFkIGd6aXAgZmxhZ3MiLCAwLCAzMSwgMCwgWl9EQVRBX0VSUk9SKTsKKyAgICBpbmYoIjc3IDg1IiwgImJhZCB6bGliIG1ldGhvZCIsIDAsIDE1LCAwLCBaX0RBVEFfRVJST1IpOworICAgIGluZigiOCA5OSIsICJzZXQgd2luZG93IHNpemUgZnJvbSBoZWFkZXIiLCAwLCAwLCAwLCBaX09LKTsKKyAgICBpbmYoIjc4IDljIiwgImJhZCB6bGliIHdpbmRvdyBzaXplIiwgMCwgOCwgMCwgWl9EQVRBX0VSUk9SKTsKKyAgICBpbmYoIjc4IDljIDYzIDAgMCAwIDEgMCAxIiwgImNoZWNrIGFkbGVyMzIiLCAwLCAxNSwgMSwgWl9TVFJFQU1fRU5EKTsKKyAgICBpbmYoIjFmIDhiIDggMWUgMCAwIDAgMCAwIDAgMSAwIDAgMCAwIDAgMCIsICJiYWQgaGVhZGVyIGNyYyIsIDAsIDQ3LCAxLAorICAgICAgICBaX0RBVEFfRVJST1IpOworICAgIGluZigiMWYgOGIgOCAyIDAgMCAwIDAgMCAwIDFkIDI2IDMgMCAwIDAgMCAwIDAgMCAwIDAiLCAiY2hlY2sgZ3ppcCBsZW5ndGgiLAorICAgICAgICAwLCA0NywgMCwgWl9TVFJFQU1fRU5EKTsKKyAgICBpbmYoIjc4IDkwIiwgImJhZCB6bGliIGhlYWRlciBjaGVjayIsIDAsIDQ3LCAwLCBaX0RBVEFfRVJST1IpOworICAgIGluZigiOCBiOCAwIDAgMCAxIiwgIm5lZWQgZGljdGlvbmFyeSIsIDAsIDgsIDAsIFpfTkVFRF9ESUNUKTsKKyAgICBpbmYoIjc4IDljIDYzIDAiLCAiY29tcHV0ZSBhZGxlcjMyIiwgMCwgMTUsIDEsIFpfT0spOworCisgICAgbWVtX3NldHVwKCZzdHJtKTsKKyAgICBzdHJtLmF2YWlsX2luID0gMDsKKyAgICBzdHJtLm5leHRfaW4gPSBaX05VTEw7CisgICAgcmV0ID0gaW5mbGF0ZUluaXQyKCZzdHJtLCAtOCk7CisgICAgc3RybS5hdmFpbF9pbiA9IDI7CisgICAgc3RybS5uZXh0X2luID0gKHZvaWQgKikiXHg2MyI7CisgICAgc3RybS5hdmFpbF9vdXQgPSAxOworICAgIHN0cm0ubmV4dF9vdXQgPSAodm9pZCAqKSZyZXQ7CisgICAgbWVtX2xpbWl0KCZzdHJtLCAxKTsKKyAgICByZXQgPSBpbmZsYXRlKCZzdHJtLCBaX05PX0ZMVVNIKTsgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9NRU1fRVJST1IpOworICAgIHJldCA9IGluZmxhdGUoJnN0cm0sIFpfTk9fRkxVU0gpOyAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX01FTV9FUlJPUik7CisgICAgbWVtX2xpbWl0KCZzdHJtLCAwKTsKKyAgICBtZW1zZXQoZGljdCwgMCwgMjU3KTsKKyAgICByZXQgPSBpbmZsYXRlU2V0RGljdGlvbmFyeSgmc3RybSwgZGljdCwgMjU3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9PSyk7CisgICAgbWVtX2xpbWl0KCZzdHJtLCAoc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX3N0YXRlKSA8PCAxKSArIDI1Nik7CisgICAgcmV0ID0gaW5mbGF0ZVByaW1lKCZzdHJtLCAxNiwgMCk7ICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfT0spOworICAgIHN0cm0uYXZhaWxfaW4gPSAyOworICAgIHN0cm0ubmV4dF9pbiA9ICh2b2lkICopIlx4ODAiOworICAgIHJldCA9IGluZmxhdGVTeW5jKCZzdHJtKTsgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX0RBVEFfRVJST1IpOworICAgIHJldCA9IGluZmxhdGUoJnN0cm0sIFpfTk9fRkxVU0gpOyAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX1NUUkVBTV9FUlJPUik7CisgICAgc3RybS5hdmFpbF9pbiA9IDQ7CisgICAgc3RybS5uZXh0X2luID0gKHZvaWQgKikiXDBcMFx4ZmZceGZmIjsKKyAgICByZXQgPSBpbmZsYXRlU3luYygmc3RybSk7ICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9PSyk7CisgICAgKHZvaWQpaW5mbGF0ZVN5bmNQb2ludCgmc3RybSk7CisgICAgcmV0ID0gaW5mbGF0ZUNvcHkoJmNvcHksICZzdHJtKTsgICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfTUVNX0VSUk9SKTsKKyAgICBtZW1fbGltaXQoJnN0cm0sIDApOworICAgIHJldCA9IGluZmxhdGVVbmRlcm1pbmUoJnN0cm0sIDEpOyAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX0RBVEFfRVJST1IpOworICAgICh2b2lkKWluZmxhdGVNYXJrKCZzdHJtKTsKKyAgICByZXQgPSBpbmZsYXRlRW5kKCZzdHJtKTsgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9PSyk7CisgICAgbWVtX2RvbmUoJnN0cm0sICJtaXNjZWxsYW5lb3VzLCBmb3JjZSBtZW1vcnkgZXJyb3JzIik7Cit9CisKKy8qIGlucHV0IGFuZCBvdXRwdXQgZnVuY3Rpb25zIGZvciBpbmZsYXRlQmFjaygpICovCitsb2NhbCB1bnNpZ25lZCBwdWxsKHZvaWQgKmRlc2MsIHVuc2lnbmVkIGNoYXIgKipidWYpCit7CisgICAgc3RhdGljIHVuc2lnbmVkIGludCBuZXh0ID0gMDsKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBkYXRbXSA9IHsweDYzLCAwLCAyLCAwfTsKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSAqc3RhdGU7CisKKyAgICBpZiAoZGVzYyA9PSBaX05VTEwpIHsKKyAgICAgICAgbmV4dCA9IDA7CisgICAgICAgIHJldHVybiAwOyAgIC8qIG5vIGlucHV0IChhbHJlYWR5IHByb3ZpZGVkIGF0IG5leHRfaW4pICovCisgICAgfQorICAgIHN0YXRlID0gKHZvaWQgKikoKHpfc3RyZWFtICopZGVzYyktPnN0YXRlOworICAgIGlmIChzdGF0ZSAhPSBaX05VTEwpCisgICAgICAgIHN0YXRlLT5tb2RlID0gU1lOQzsgICAgIC8qIGZvcmNlIGFuIG90aGVyd2lzZSBpbXBvc3NpYmxlIHNpdHVhdGlvbiAqLworICAgIHJldHVybiBuZXh0IDwgc2l6ZW9mKGRhdCkgPyAoKmJ1ZiA9IGRhdCArIG5leHQrKywgMSkgOiAwOworfQorCitsb2NhbCBpbnQgcHVzaCh2b2lkICpkZXNjLCB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxlbikKK3sKKyAgICBidWYgKz0gbGVuOworICAgIHJldHVybiBkZXNjICE9IFpfTlVMTDsgICAgICAvKiBmb3JjZSBlcnJvciBpZiBkZXNjIG5vdCBudWxsICovCit9CisKKy8qIGNvdmVyIGluZmxhdGVCYWNrKCkgdXAgdG8gY29tbW9uIGRlZmxhdGUgZGF0YSBjYXNlcyBhbmQgYWZ0ZXIgdGhvc2UgKi8KK2xvY2FsIHZvaWQgY292ZXJfYmFjayh2b2lkKQoreworICAgIGludCByZXQ7CisgICAgel9zdHJlYW0gc3RybTsKKyAgICB1bnNpZ25lZCBjaGFyIHdpblszMjc2OF07CisKKyAgICByZXQgPSBpbmZsYXRlQmFja0luaXRfKFpfTlVMTCwgMCwgd2luLCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9WRVJTSU9OX0VSUk9SKTsKKyAgICByZXQgPSBpbmZsYXRlQmFja0luaXQoWl9OVUxMLCAwLCB3aW4pOyAgICAgIGFzc2VydChyZXQgPT0gWl9TVFJFQU1fRVJST1IpOworICAgIHJldCA9IGluZmxhdGVCYWNrKFpfTlVMTCwgWl9OVUxMLCBaX05VTEwsIFpfTlVMTCwgWl9OVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9TVFJFQU1fRVJST1IpOworICAgIHJldCA9IGluZmxhdGVCYWNrRW5kKFpfTlVMTCk7ICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX1NUUkVBTV9FUlJPUik7CisgICAgZnB1dHMoImluZmxhdGVCYWNrIGJhZCBwYXJhbWV0ZXJzXG4iLCBzdGRlcnIpOworCisgICAgbWVtX3NldHVwKCZzdHJtKTsKKyAgICByZXQgPSBpbmZsYXRlQmFja0luaXQoJnN0cm0sIDE1LCB3aW4pOyAgICAgIGFzc2VydChyZXQgPT0gWl9PSyk7CisgICAgc3RybS5hdmFpbF9pbiA9IDI7CisgICAgc3RybS5uZXh0X2luID0gKHZvaWQgKikiXHgwMyI7CisgICAgcmV0ID0gaW5mbGF0ZUJhY2soJnN0cm0sIHB1bGwsIFpfTlVMTCwgcHVzaCwgWl9OVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9TVFJFQU1fRU5EKTsKKyAgICAgICAgLyogZm9yY2Ugb3V0cHV0IGVycm9yICovCisgICAgc3RybS5hdmFpbF9pbiA9IDM7CisgICAgc3RybS5uZXh0X2luID0gKHZvaWQgKikiXHg2M1x4MDAiOworICAgIHJldCA9IGluZmxhdGVCYWNrKCZzdHJtLCBwdWxsLCBaX05VTEwsIHB1c2gsICZzdHJtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9CVUZfRVJST1IpOworICAgICAgICAvKiBmb3JjZSBtb2RlIGVycm9yIGJ5IG11Y2tpbmcgd2l0aCBzdGF0ZSAqLworICAgIHJldCA9IGluZmxhdGVCYWNrKCZzdHJtLCBwdWxsLCAmc3RybSwgcHVzaCwgWl9OVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9TVFJFQU1fRVJST1IpOworICAgIHJldCA9IGluZmxhdGVCYWNrRW5kKCZzdHJtKTsgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX09LKTsKKyAgICBtZW1fZG9uZSgmc3RybSwgImluZmxhdGVCYWNrIGJhZCBzdGF0ZSIpOworCisgICAgcmV0ID0gaW5mbGF0ZUJhY2tJbml0KCZzdHJtLCAxNSwgd2luKTsgICAgICBhc3NlcnQocmV0ID09IFpfT0spOworICAgIHJldCA9IGluZmxhdGVCYWNrRW5kKCZzdHJtKTsgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX09LKTsKKyAgICBmcHV0cygiaW5mbGF0ZUJhY2sgYnVpbHQtaW4gbWVtb3J5IHJvdXRpbmVzXG4iLCBzdGRlcnIpOworfQorCisvKiBkbyBhIHJhdyBpbmZsYXRlIG9mIGRhdGEgaW4gaGV4YWRlY2ltYWwgd2l0aCBib3RoIGluZmxhdGUgYW5kIGluZmxhdGVCYWNrICovCitsb2NhbCBpbnQgdHJ5KGNoYXIgKmhleCwgY2hhciAqaWQsIGludCBlcnIpCit7CisgICAgaW50IHJldDsKKyAgICB1bnNpZ25lZCBsZW4sIHNpemU7CisgICAgdW5zaWduZWQgY2hhciAqaW4sICpvdXQsICp3aW47CisgICAgY2hhciAqcHJlZml4OworICAgIHpfc3RyZWFtIHN0cm07CisKKyAgICAvKiBjb252ZXJ0IHRvIGhleCAqLworICAgIGluID0gaDJiKGhleCwgJmxlbik7CisgICAgYXNzZXJ0KGluICE9IE5VTEwpOworCisgICAgLyogYWxsb2NhdGUgd29yayBhcmVhcyAqLworICAgIHNpemUgPSBsZW4gPDwgMzsKKyAgICBvdXQgPSBtYWxsb2Moc2l6ZSk7CisgICAgYXNzZXJ0KG91dCAhPSBOVUxMKTsKKyAgICB3aW4gPSBtYWxsb2MoMzI3NjgpOworICAgIGFzc2VydCh3aW4gIT0gTlVMTCk7CisgICAgcHJlZml4ID0gbWFsbG9jKHN0cmxlbihpZCkgKyA2KTsKKyAgICBhc3NlcnQocHJlZml4ICE9IE5VTEwpOworCisgICAgLyogZmlyc3Qgd2l0aCBpbmZsYXRlICovCisgICAgc3RyY3B5KHByZWZpeCwgaWQpOworICAgIHN0cmNhdChwcmVmaXgsICItbGF0ZSIpOworICAgIG1lbV9zZXR1cCgmc3RybSk7CisgICAgc3RybS5hdmFpbF9pbiA9IDA7CisgICAgc3RybS5uZXh0X2luID0gWl9OVUxMOworICAgIHJldCA9IGluZmxhdGVJbml0Migmc3RybSwgZXJyIDwgMCA/IDQ3IDogLTE1KTsKKyAgICBhc3NlcnQocmV0ID09IFpfT0spOworICAgIHN0cm0uYXZhaWxfaW4gPSBsZW47CisgICAgc3RybS5uZXh0X2luID0gaW47CisgICAgZG8geworICAgICAgICBzdHJtLmF2YWlsX291dCA9IHNpemU7CisgICAgICAgIHN0cm0ubmV4dF9vdXQgPSBvdXQ7CisgICAgICAgIHJldCA9IGluZmxhdGUoJnN0cm0sIFpfVFJFRVMpOworICAgICAgICBhc3NlcnQocmV0ICE9IFpfU1RSRUFNX0VSUk9SICYmIHJldCAhPSBaX01FTV9FUlJPUik7CisgICAgICAgIGlmIChyZXQgPT0gWl9EQVRBX0VSUk9SIHx8IHJldCA9PSBaX05FRURfRElDVCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0gd2hpbGUgKHN0cm0uYXZhaWxfaW4gfHwgc3RybS5hdmFpbF9vdXQgPT0gMCk7CisgICAgaWYgKGVycikgeworICAgICAgICBhc3NlcnQocmV0ID09IFpfREFUQV9FUlJPUik7CisgICAgICAgIGFzc2VydChzdHJjbXAoaWQsIHN0cm0ubXNnKSA9PSAwKTsKKyAgICB9CisgICAgaW5mbGF0ZUVuZCgmc3RybSk7CisgICAgbWVtX2RvbmUoJnN0cm0sIHByZWZpeCk7CisKKyAgICAvKiB0aGVuIHdpdGggaW5mbGF0ZUJhY2sgKi8KKyAgICBpZiAoZXJyID49IDApIHsKKyAgICAgICAgc3RyY3B5KHByZWZpeCwgaWQpOworICAgICAgICBzdHJjYXQocHJlZml4LCAiLWJhY2siKTsKKyAgICAgICAgbWVtX3NldHVwKCZzdHJtKTsKKyAgICAgICAgcmV0ID0gaW5mbGF0ZUJhY2tJbml0KCZzdHJtLCAxNSwgd2luKTsKKyAgICAgICAgYXNzZXJ0KHJldCA9PSBaX09LKTsKKyAgICAgICAgc3RybS5hdmFpbF9pbiA9IGxlbjsKKyAgICAgICAgc3RybS5uZXh0X2luID0gaW47CisgICAgICAgIHJldCA9IGluZmxhdGVCYWNrKCZzdHJtLCBwdWxsLCBaX05VTEwsIHB1c2gsIFpfTlVMTCk7CisgICAgICAgIGFzc2VydChyZXQgIT0gWl9TVFJFQU1fRVJST1IpOworICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfREFUQV9FUlJPUik7CisgICAgICAgICAgICBhc3NlcnQoc3RyY21wKGlkLCBzdHJtLm1zZykgPT0gMCk7CisgICAgICAgIH0KKyAgICAgICAgaW5mbGF0ZUJhY2tFbmQoJnN0cm0pOworICAgICAgICBtZW1fZG9uZSgmc3RybSwgcHJlZml4KTsKKyAgICB9CisKKyAgICAvKiBjbGVhbiB1cCAqLworICAgIGZyZWUocHJlZml4KTsKKyAgICBmcmVlKHdpbik7CisgICAgZnJlZShvdXQpOworICAgIGZyZWUoaW4pOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIGNvdmVyIGRlZmxhdGUgZGF0YSBjYXNlcyBpbiBib3RoIGluZmxhdGUoKSBhbmQgaW5mbGF0ZUJhY2soKSAqLworbG9jYWwgdm9pZCBjb3Zlcl9pbmZsYXRlKHZvaWQpCit7CisgICAgdHJ5KCIwIDAgMCAwIDAiLCAiaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocyIsIDEpOworICAgIHRyeSgiMyAwIiwgImZpeGVkIiwgMCk7CisgICAgdHJ5KCI2IiwgImludmFsaWQgYmxvY2sgdHlwZSIsIDEpOworICAgIHRyeSgiMSAxIDAgZmUgZmYgMCIsICJzdG9yZWQiLCAwKTsKKyAgICB0cnkoImZjIDAgMCIsICJ0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyIsIDEpOworICAgIHRyeSgiNCAwIGZlIGZmIiwgImludmFsaWQgY29kZSBsZW5ndGhzIHNldCIsIDEpOworICAgIHRyeSgiNCAwIDI0IDQ5IDAiLCAiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCIsIDEpOworICAgIHRyeSgiNCAwIDI0IGU5IGZmIGZmIiwgImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiLCAxKTsKKyAgICB0cnkoIjQgMCAyNCBlOSBmZiA2ZCIsICJpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2siLCAxKTsKKyAgICB0cnkoIjQgODAgNDkgOTIgMjQgNDkgOTIgMjQgNzEgZmYgZmYgOTMgMTEgMCIsCisgICAgICAgICJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQiLCAxKTsKKyAgICB0cnkoIjQgODAgNDkgOTIgMjQgNDkgOTIgMjQgZiBiNCBmZiBmZiBjMyA4NCIsICJpbnZhbGlkIGRpc3RhbmNlcyBzZXQiLCAxKTsKKyAgICB0cnkoIjQgYzAgODEgOCAwIDAgMCAwIDIwIDdmIGViIGIgMCAwIiwgImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIsIDEpOworICAgIHRyeSgiMiA3ZSBmZiBmZiIsICJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLCAxKTsKKyAgICB0cnkoImMgYzAgODEgMCAwIDAgMCAwIDkwIGZmIDZiIDQgMCIsICJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsIDEpOworCisgICAgLyogYWxzbyB0cmFpbGVyIG1pc21hdGNoIGp1c3QgaW4gaW5mbGF0ZSgpICovCisgICAgdHJ5KCIxZiA4YiA4IDAgMCAwIDAgMCAwIDAgMyAwIDAgMCAwIDEiLCAiaW5jb3JyZWN0IGRhdGEgY2hlY2siLCAtMSk7CisgICAgdHJ5KCIxZiA4YiA4IDAgMCAwIDAgMCAwIDAgMyAwIDAgMCAwIDAgMCAwIDAgMSIsCisgICAgICAgICJpbmNvcnJlY3QgbGVuZ3RoIGNoZWNrIiwgLTEpOworICAgIHRyeSgiNSBjMCAyMSBkIDAgMCAwIDgwIGIwIGZlIDZkIDJmIDkxIDZjIiwgInB1bGwgMTciLCAwKTsKKyAgICB0cnkoIjUgZTAgODEgOTEgMjQgY2IgYjIgMmMgNDkgZTIgZiAyZSA4YiA5YSA0NyA1NiA5ZiBmYiBmZSBlYyBkMiBmZiAxZiIsCisgICAgICAgICJsb25nIGNvZGUiLCAwKTsKKyAgICB0cnkoImVkIGMwIDEgMSAwIDAgMCA0MCAyMCBmZiA1NyAxYiA0MiAyYyA0ZiIsICJsZW5ndGggZXh0cmEiLCAwKTsKKyAgICB0cnkoImVkIGNmIGMxIGIxIDJjIDQ3IDEwIGM0IDMwIGZhIDZmIDM1IDFkIDEgODIgNTkgM2QgZmIgYmUgMmUgMmEgZmMgZiBjIiwKKyAgICAgICAgImxvbmcgZGlzdGFuY2UgYW5kIGV4dHJhIiwgMCk7CisgICAgdHJ5KCJlZCBjMCA4MSAwIDAgMCAwIDgwIGEwIGZkIGE5IDE3IGE5IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAiCisgICAgICAgICIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA2IiwgIndpbmRvdyBlbmQiLCAwKTsKKyAgICBpbmYoIjIgOCAyMCA4MCAwIDMgMCIsICJpbmZsYXRlX2Zhc3QgVFlQRSByZXR1cm4iLCAwLCAtMTUsIDI1OCwKKyAgICAgICAgWl9TVFJFQU1fRU5EKTsKKyAgICBpbmYoIjYzIDE4IDUgNDAgYyAwIiwgIndpbmRvdyB3cmFwIiwgMywgLTgsIDMwMCwgWl9PSyk7Cit9CisKKy8qIGNvdmVyIHJlbWFpbmluZyBsaW5lcyBpbiBpbmZ0cmVlcy5jICovCitsb2NhbCB2b2lkIGNvdmVyX3RyZWVzKHZvaWQpCit7CisgICAgaW50IHJldDsKKyAgICB1bnNpZ25lZCBiaXRzOworICAgIHVuc2lnbmVkIHNob3J0IGxlbnNbMTZdLCB3b3JrWzE2XTsKKyAgICBjb2RlICpuZXh0LCB0YWJsZVtFTk9VR0hfRElTVFNdOworCisgICAgLyogd2UgbmVlZCB0byBjYWxsIGluZmxhdGVfdGFibGUoKSBkaXJlY3RseSBpbiBvcmRlciB0byBtYW5pZmVzdCBub3QtCisgICAgICAgZW5vdWdoIGVycm9ycywgc2luY2UgemxpYiBpbnN1cmVzIHRoYXQgZW5vdWdoIGlzIGFsd2F5cyBlbm91Z2ggKi8KKyAgICBmb3IgKGJpdHMgPSAwOyBiaXRzIDwgMTU7IGJpdHMrKykKKyAgICAgICAgbGVuc1tiaXRzXSA9ICh1bnNpZ25lZCBzaG9ydCkoYml0cyArIDEpOworICAgIGxlbnNbMTVdID0gMTU7CisgICAgbmV4dCA9IHRhYmxlOworICAgIGJpdHMgPSAxNTsKKyAgICByZXQgPSBpbmZsYXRlX3RhYmxlKERJU1RTLCBsZW5zLCAxNiwgJm5leHQsICZiaXRzLCB3b3JrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gMSk7CisgICAgbmV4dCA9IHRhYmxlOworICAgIGJpdHMgPSAxOworICAgIHJldCA9IGluZmxhdGVfdGFibGUoRElTVFMsIGxlbnMsIDE2LCAmbmV4dCwgJmJpdHMsIHdvcmspOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSAxKTsKKyAgICBmcHV0cygiaW5mbGF0ZV90YWJsZSBub3QgZW5vdWdoIGVycm9yc1xuIiwgc3RkZXJyKTsKK30KKworLyogY292ZXIgcmVtYWluaW5nIGluZmZhc3QuYyBkZWNvZGluZyBhbmQgd2luZG93IGNvcHlpbmcgKi8KK2xvY2FsIHZvaWQgY292ZXJfZmFzdCh2b2lkKQoreworICAgIGluZigiZTUgZTAgODEgYWQgNmQgY2IgYjIgMmMgYzkgMDEgMWUgNTkgNjMgYWUgN2QgZWUgZmIgNGQgZmQgYjUgMzUgNDEgNjgiCisgICAgICAgICIgZmYgN2YgMGYgMCAwIDAiLCAiZmFzdCBsZW5ndGggZXh0cmEgYml0cyIsIDAsIC04LCAyNTgsIFpfREFUQV9FUlJPUik7CisgICAgaW5mKCIyNSBmZCA4MSBiNSA2ZCA1OSBiNiA2YSA0OSBlYSBhZiAzNSA2IDM0IGViIDhjIGI5IGY2IGI5IDFlIGVmIDY3IDQ5IgorICAgICAgICAiIDUwIGZlIGZmIGZmIDNmIDAgMCIsICJmYXN0IGRpc3RhbmNlIGV4dHJhIGJpdHMiLCAwLCAtOCwgMjU4LAorICAgICAgICBaX0RBVEFfRVJST1IpOworICAgIGluZigiMyA3ZSAwIDAgMCAwIDAiLCAiZmFzdCBpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLCAwLCAtOCwgMjU4LAorICAgICAgICBaX0RBVEFfRVJST1IpOworICAgIGluZigiMWIgNyAwIDAgMCAwIDAiLCAiZmFzdCBpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiLCAwLCAtOCwgMjU4LAorICAgICAgICBaX0RBVEFfRVJST1IpOworICAgIGluZigiZCBjNyAxIGFlIGViIDM4IGMgNCA0MSBhMCA4NyA3MiBkZSBkZiBmYiAxZiBiOCAzNiBiMSAzOCA1ZCBmZiBmZiAwIiwKKyAgICAgICAgImZhc3QgMm5kIGxldmVsIGNvZGVzIGFuZCB0b28gZmFyIGJhY2siLCAwLCAtOCwgMjU4LCBaX0RBVEFfRVJST1IpOworICAgIGluZigiNjMgMTggNSA4YyAxMCA4IDAgMCAwIDAiLCAidmVyeSBjb21tb24gY2FzZSIsIDAsIC04LCAyNTksIFpfT0spOworICAgIGluZigiNjMgNjAgNjAgMTggYzkgMCA4IDE4IDE4IDE4IDI2IGMwIDI4IDAgMjkgMCAwIDAiLAorICAgICAgICAiY29udGlndW91cyBhbmQgd3JhcCBhcm91bmQgd2luZG93IiwgNiwgLTgsIDI1OSwgWl9PSyk7CisgICAgaW5mKCI2MyAwIDMgMCAwIDAgMCAwIiwgImNvcHkgZGlyZWN0IGZyb20gb3V0cHV0IiwgMCwgLTgsIDI1OSwKKyAgICAgICAgWl9TVFJFQU1fRU5EKTsKK30KKworaW50IG1haW4odm9pZCkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCB6bGliVmVyc2lvbigpKTsKKyAgICBjb3Zlcl9zdXBwb3J0KCk7CisgICAgY292ZXJfd3JhcCgpOworICAgIGNvdmVyX2JhY2soKTsKKyAgICBjb3Zlcl9pbmZsYXRlKCk7CisgICAgY292ZXJfdHJlZXMoKTsKKyAgICBjb3Zlcl9mYXN0KCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS96bGliL3NyYy90ZXN0L21pbmlnemlwLmMgYi96bGliL3NyYy90ZXN0L21pbmlnemlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMwMjVhNAotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL3Rlc3QvbWluaWd6aXAuYwpAQCAtMCwwICsxLDY1MSBAQAorLyogbWluaWd6aXAuYyAtLSBzaW11bGF0ZSBnemlwIHVzaW5nIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA2LCAyMDEwLCAyMDExIEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyoKKyAqIG1pbmlnemlwIGlzIGEgbWluaW1hbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZ3ppcCB1dGlsaXR5LiBUaGlzIGlzCisgKiBvbmx5IGFuIGV4YW1wbGUgb2YgdXNpbmcgemxpYiBhbmQgaXNuJ3QgbWVhbnQgdG8gcmVwbGFjZSB0aGUKKyAqIGZ1bGwtZmVhdHVyZWQgZ3ppcC4gTm8gYXR0ZW1wdCBpcyBtYWRlIHRvIGRlYWwgd2l0aCBmaWxlIHN5c3RlbXMKKyAqIGxpbWl0aW5nIG5hbWVzIHRvIDE0IG9yIDgrMyBjaGFyYWN0ZXJzLCBldGMuLi4gRXJyb3IgY2hlY2tpbmcgaXMKKyAqIHZlcnkgbGltaXRlZC4gU28gdXNlIG1pbmlnemlwIG9ubHkgZm9yIHRlc3Rpbmc7IHVzZSBnemlwIGZvciB0aGUKKyAqIHJlYWwgdGhpbmcuIE9uIE1TRE9TLCB1c2Ugb25seSBvbiBmaWxlIG5hbWVzIHdpdGhvdXQgZXh0ZW5zaW9uCisgKiBvciBpbiBwaXBlIG1vZGUuCisgKi8KKworLyogQCgjKSAkSWQkICovCisKKyNpbmNsdWRlICJ6bGliLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIFNUREMKKyMgIGluY2x1ZGUgPHN0cmluZy5oPgorIyAgaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2lmZGVmIFVTRV9NTUFQCisjICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgIGluY2x1ZGUgPHN5cy9tbWFuLmg+CisjICBpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQorIyAgaW5jbHVkZSA8ZmNudGwuaD4KKyMgIGluY2x1ZGUgPGlvLmg+CisjICBpZmRlZiBVTkRFUl9DRQorIyAgICBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgIGVuZGlmCisjICBkZWZpbmUgU0VUX0JJTkFSWV9NT0RFKGZpbGUpIHNldG1vZGUoZmlsZW5vKGZpbGUpLCBPX0JJTkFSWSkKKyNlbHNlCisjICBkZWZpbmUgU0VUX0JJTkFSWV9NT0RFKGZpbGUpCisjZW5kaWYKKworI2lmZGVmIF9NU0NfVkVSCisjICBkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjZW5kaWYKKworI2lmZGVmIFZNUworIyAgZGVmaW5lIHVubGluayBkZWxldGUKKyMgIGRlZmluZSBHWl9TVUZGSVggIi1neiIKKyNlbmRpZgorI2lmZGVmIFJJU0NPUworIyAgZGVmaW5lIHVubGluayByZW1vdmUKKyMgIGRlZmluZSBHWl9TVUZGSVggIi1neiIKKyMgIGRlZmluZSBmaWxlbm8oZmlsZSkgZmlsZS0+X19maWxlCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fTVdFUktTX18pICYmIF9fZGVzdF9vcyAhPSBfX2JlX29zICYmIF9fZGVzdF9vcyAhPSBfX3dpbjMyX29zCisjICBpbmNsdWRlIDx1bml4Lmg+IC8qIGZvciBmaWxlbm8gKi8KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoWl9IQVZFX1VOSVNURF9IKSAmJiAhZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKQorI2lmbmRlZiBXSU4zMiAvKiB1bmxpbmsgYWxyZWFkeSBpbiBzdGRpby5oIGZvciBXSU4zMiAqLworICBleHRlcm4gaW50IHVubGluayBPRigoY29uc3QgY2hhciAqKSk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChVTkRFUl9DRSkKKyMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgIGRlZmluZSBwZXJyb3IocykgcHdpbmVycm9yKHMpCisKKy8qIE1hcCB0aGUgV2luZG93cyBlcnJvciBudW1iZXIgaW4gRVJST1IgdG8gYSBsb2NhbGUtZGVwZW5kZW50IGVycm9yCisgICBtZXNzYWdlIHN0cmluZyBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdC4gIFR5cGljYWxseSwgdGhlIHZhbHVlcworICAgZm9yIEVSUk9SIGNvbWUgZnJvbSBHZXRMYXN0RXJyb3IuCisKKyAgIFRoZSBzdHJpbmcgcG9pbnRlZCB0byBzaGFsbCBub3QgYmUgbW9kaWZpZWQgYnkgdGhlIGFwcGxpY2F0aW9uLAorICAgYnV0IG1heSBiZSBvdmVyd3JpdHRlbiBieSBhIHN1YnNlcXVlbnQgY2FsbCB0byBzdHJ3aW5lcnJvcgorCisgICBUaGUgc3Ryd2luZXJyb3IgZnVuY3Rpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBjdXJyZW50IHNldHRpbmcKKyAgIG9mIEdldExhc3RFcnJvci4gICovCisKK3N0YXRpYyBjaGFyICpzdHJ3aW5lcnJvciAoZXJyb3IpCisgICAgIERXT1JEIGVycm9yOworeworICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMDI0XTsKKworICAgIHdjaGFyX3QgKm1zZ2J1ZjsKKyAgICBEV09SRCBsYXN0ZXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgRFdPUkQgY2hhcnMgPSBGb3JtYXRNZXNzYWdlKEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNCisgICAgICAgIHwgRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSLAorICAgICAgICBOVUxMLAorICAgICAgICBlcnJvciwKKyAgICAgICAgMCwgLyogRGVmYXVsdCBsYW5ndWFnZSAqLworICAgICAgICAoTFBWT0lEKSZtc2didWYsCisgICAgICAgIDAsCisgICAgICAgIE5VTEwpOworICAgIGlmIChjaGFycyAhPSAwKSB7CisgICAgICAgIC8qIElmIHRoZXJlIGlzIGFuIFxyXG4gYXBwZW5kZWQsIHphcCBpdC4gICovCisgICAgICAgIGlmIChjaGFycyA+PSAyCisgICAgICAgICAgICAmJiBtc2didWZbY2hhcnMgLSAyXSA9PSAnXHInICYmIG1zZ2J1ZltjaGFycyAtIDFdID09ICdcbicpIHsKKyAgICAgICAgICAgIGNoYXJzIC09IDI7CisgICAgICAgICAgICBtc2didWZbY2hhcnNdID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjaGFycyA+IHNpemVvZiAoYnVmKSAtIDEpIHsKKyAgICAgICAgICAgIGNoYXJzID0gc2l6ZW9mIChidWYpIC0gMTsKKyAgICAgICAgICAgIG1zZ2J1ZltjaGFyc10gPSAwOworICAgICAgICB9CisKKyAgICAgICAgd2NzdG9tYnMoYnVmLCBtc2didWYsIGNoYXJzICsgMSk7CisgICAgICAgIExvY2FsRnJlZShtc2didWYpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3ByaW50ZihidWYsICJ1bmtub3duIHdpbjMyIGVycm9yICglbGQpIiwgZXJyb3IpOworICAgIH0KKworICAgIFNldExhc3RFcnJvcihsYXN0ZXJyKTsKKyAgICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgdm9pZCBwd2luZXJyb3IgKHMpCisgICAgY29uc3QgY2hhciAqczsKK3sKKyAgICBpZiAocyAmJiAqcykKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogJXNcbiIsIHMsIHN0cndpbmVycm9yKEdldExhc3RFcnJvciAoKSkpOworICAgIGVsc2UKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgc3Ryd2luZXJyb3IoR2V0TGFzdEVycm9yICgpKSk7Cit9CisKKyNlbmRpZiAvKiBVTkRFUl9DRSAqLworCisjaWZuZGVmIEdaX1NVRkZJWAorIyAgZGVmaW5lIEdaX1NVRkZJWCAiLmd6IgorI2VuZGlmCisjZGVmaW5lIFNVRkZJWF9MRU4gKHNpemVvZihHWl9TVUZGSVgpLTEpCisKKyNkZWZpbmUgQlVGTEVOICAgICAgMTYzODQKKyNkZWZpbmUgTUFYX05BTUVfTEVOIDEwMjQKKworI2lmZGVmIE1BWFNFR182NEsKKyMgIGRlZmluZSBsb2NhbCBzdGF0aWMKKyAgIC8qIE5lZWRlZCBmb3Igc3lzdGVtcyB3aXRoIGxpbWl0YXRpb24gb24gc3RhY2sgc2l6ZS4gKi8KKyNlbHNlCisjICBkZWZpbmUgbG9jYWwKKyNlbmRpZgorCisjaWZkZWYgWl9TT0xPCisvKiBmb3IgWl9TT0xPLCBjcmVhdGUgc2ltcGxpZmllZCBneiogZnVuY3Rpb25zIHVzaW5nIGRlZmxhdGUgYW5kIGluZmxhdGUgKi8KKworI2lmIGRlZmluZWQoWl9IQVZFX1VOSVNURF9IKSB8fCBkZWZpbmVkKFpfTEFSR0UpCisjICBpbmNsdWRlIDx1bmlzdGQuaD4gICAgICAgLyogZm9yIHVubGluaygpICovCisjZW5kaWYKKwordm9pZCAqbXlhbGxvYyBPRigodm9pZCAqLCB1bnNpZ25lZCwgdW5zaWduZWQpKTsKK3ZvaWQgbXlmcmVlIE9GKCh2b2lkICosIHZvaWQgKikpOworCit2b2lkICpteWFsbG9jKHEsIG4sIG0pCisgICAgdm9pZCAqcTsKKyAgICB1bnNpZ25lZCBuLCBtOworeworICAgIHEgPSBaX05VTEw7CisgICAgcmV0dXJuIGNhbGxvYyhuLCBtKTsKK30KKwordm9pZCBteWZyZWUocSwgcCkKKyAgICB2b2lkICpxLCAqcDsKK3sKKyAgICBxID0gWl9OVUxMOworICAgIGZyZWUocCk7Cit9CisKK3R5cGVkZWYgc3RydWN0IGd6RmlsZV9zIHsKKyAgICBGSUxFICpmaWxlOworICAgIGludCB3cml0ZTsKKyAgICBpbnQgZXJyOworICAgIGNoYXIgKm1zZzsKKyAgICB6X3N0cmVhbSBzdHJtOworfSAqZ3pGaWxlOworCitnekZpbGUgZ3pvcGVuIE9GKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOworZ3pGaWxlIGd6ZG9wZW4gT0YoKGludCwgY29uc3QgY2hhciAqKSk7CitnekZpbGUgZ3pfb3BlbiBPRigoY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKikpOworCitnekZpbGUgZ3pvcGVuKHBhdGgsIG1vZGUpCitjb25zdCBjaGFyICpwYXRoOworY29uc3QgY2hhciAqbW9kZTsKK3sKKyAgICByZXR1cm4gZ3pfb3BlbihwYXRoLCAtMSwgbW9kZSk7Cit9CisKK2d6RmlsZSBnemRvcGVuKGZkLCBtb2RlKQoraW50IGZkOworY29uc3QgY2hhciAqbW9kZTsKK3sKKyAgICByZXR1cm4gZ3pfb3BlbihOVUxMLCBmZCwgbW9kZSk7Cit9CisKK2d6RmlsZSBnel9vcGVuKHBhdGgsIGZkLCBtb2RlKQorICAgIGNvbnN0IGNoYXIgKnBhdGg7CisgICAgaW50IGZkOworICAgIGNvbnN0IGNoYXIgKm1vZGU7Cit7CisgICAgZ3pGaWxlIGd6OworICAgIGludCByZXQ7CisKKyAgICBneiA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGd6RmlsZV9zKSk7CisgICAgaWYgKGd6ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGd6LT53cml0ZSA9IHN0cmNocihtb2RlLCAndycpICE9IE5VTEw7CisgICAgZ3otPnN0cm0uemFsbG9jID0gbXlhbGxvYzsKKyAgICBnei0+c3RybS56ZnJlZSA9IG15ZnJlZTsKKyAgICBnei0+c3RybS5vcGFxdWUgPSBaX05VTEw7CisgICAgaWYgKGd6LT53cml0ZSkKKyAgICAgICAgcmV0ID0gZGVmbGF0ZUluaXQyKCYoZ3otPnN0cm0pLCAtMSwgOCwgMTUgKyAxNiwgOCwgMCk7CisgICAgZWxzZSB7CisgICAgICAgIGd6LT5zdHJtLm5leHRfaW4gPSAwOworICAgICAgICBnei0+c3RybS5hdmFpbF9pbiA9IFpfTlVMTDsKKyAgICAgICAgcmV0ID0gaW5mbGF0ZUluaXQyKCYoZ3otPnN0cm0pLCAxNSArIDE2KTsKKyAgICB9CisgICAgaWYgKHJldCAhPSBaX09LKSB7CisgICAgICAgIGZyZWUoZ3opOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZ3otPmZpbGUgPSBwYXRoID09IE5VTEwgPyBmZG9wZW4oZmQsIGd6LT53cml0ZSA/ICJ3YiIgOiAicmIiKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3BlbihwYXRoLCBnei0+d3JpdGUgPyAid2IiIDogInJiIik7CisgICAgaWYgKGd6LT5maWxlID09IE5VTEwpIHsKKyAgICAgICAgZ3otPndyaXRlID8gZGVmbGF0ZUVuZCgmKGd6LT5zdHJtKSkgOiBpbmZsYXRlRW5kKCYoZ3otPnN0cm0pKTsKKyAgICAgICAgZnJlZShneik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBnei0+ZXJyID0gMDsKKyAgICBnei0+bXNnID0gIiI7CisgICAgcmV0dXJuIGd6OworfQorCitpbnQgZ3p3cml0ZSBPRigoZ3pGaWxlLCBjb25zdCB2b2lkICosIHVuc2lnbmVkKSk7CisKK2ludCBnendyaXRlKGd6LCBidWYsIGxlbikKKyAgICBnekZpbGUgZ3o7CisgICAgY29uc3Qgdm9pZCAqYnVmOworICAgIHVuc2lnbmVkIGxlbjsKK3sKKyAgICB6X3N0cmVhbSAqc3RybTsKKyAgICB1bnNpZ25lZCBjaGFyIG91dFtCVUZMRU5dOworCisgICAgaWYgKGd6ID09IE5VTEwgfHwgIWd6LT53cml0ZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3RybSA9ICYoZ3otPnN0cm0pOworICAgIHN0cm0tPm5leHRfaW4gPSAodm9pZCAqKWJ1ZjsKKyAgICBzdHJtLT5hdmFpbF9pbiA9IGxlbjsKKyAgICBkbyB7CisgICAgICAgIHN0cm0tPm5leHRfb3V0ID0gb3V0OworICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPSBCVUZMRU47CisgICAgICAgICh2b2lkKWRlZmxhdGUoc3RybSwgWl9OT19GTFVTSCk7CisgICAgICAgIGZ3cml0ZShvdXQsIDEsIEJVRkxFTiAtIHN0cm0tPmF2YWlsX291dCwgZ3otPmZpbGUpOworICAgIH0gd2hpbGUgKHN0cm0tPmF2YWlsX291dCA9PSAwKTsKKyAgICByZXR1cm4gbGVuOworfQorCitpbnQgZ3pyZWFkIE9GKChnekZpbGUsIHZvaWQgKiwgdW5zaWduZWQpKTsKKworaW50IGd6cmVhZChneiwgYnVmLCBsZW4pCisgICAgZ3pGaWxlIGd6OworICAgIHZvaWQgKmJ1ZjsKKyAgICB1bnNpZ25lZCBsZW47Cit7CisgICAgaW50IHJldDsKKyAgICB1bnNpZ25lZCBnb3Q7CisgICAgdW5zaWduZWQgY2hhciBpblsxXTsKKyAgICB6X3N0cmVhbSAqc3RybTsKKworICAgIGlmIChneiA9PSBOVUxMIHx8IGd6LT53cml0ZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGd6LT5lcnIpCisgICAgICAgIHJldHVybiAwOworICAgIHN0cm0gPSAmKGd6LT5zdHJtKTsKKyAgICBzdHJtLT5uZXh0X291dCA9ICh2b2lkICopYnVmOworICAgIHN0cm0tPmF2YWlsX291dCA9IGxlbjsKKyAgICBkbyB7CisgICAgICAgIGdvdCA9IGZyZWFkKGluLCAxLCAxLCBnei0+ZmlsZSk7CisgICAgICAgIGlmIChnb3QgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzdHJtLT5uZXh0X2luID0gaW47CisgICAgICAgIHN0cm0tPmF2YWlsX2luID0gMTsKKyAgICAgICAgcmV0ID0gaW5mbGF0ZShzdHJtLCBaX05PX0ZMVVNIKTsKKyAgICAgICAgaWYgKHJldCA9PSBaX0RBVEFfRVJST1IpIHsKKyAgICAgICAgICAgIGd6LT5lcnIgPSBaX0RBVEFfRVJST1I7CisgICAgICAgICAgICBnei0+bXNnID0gc3RybS0+bXNnOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA9PSBaX1NUUkVBTV9FTkQpCisgICAgICAgICAgICBpbmZsYXRlUmVzZXQoc3RybSk7CisgICAgfSB3aGlsZSAoc3RybS0+YXZhaWxfb3V0KTsKKyAgICByZXR1cm4gbGVuIC0gc3RybS0+YXZhaWxfb3V0OworfQorCitpbnQgZ3pjbG9zZSBPRigoZ3pGaWxlKSk7CisKK2ludCBnemNsb3NlKGd6KQorICAgIGd6RmlsZSBnejsKK3sKKyAgICB6X3N0cmVhbSAqc3RybTsKKyAgICB1bnNpZ25lZCBjaGFyIG91dFtCVUZMRU5dOworCisgICAgaWYgKGd6ID09IE5VTEwpCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdHJtID0gJihnei0+c3RybSk7CisgICAgaWYgKGd6LT53cml0ZSkgeworICAgICAgICBzdHJtLT5uZXh0X2luID0gWl9OVUxMOworICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN0cm0tPm5leHRfb3V0ID0gb3V0OworICAgICAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gQlVGTEVOOworICAgICAgICAgICAgKHZvaWQpZGVmbGF0ZShzdHJtLCBaX0ZJTklTSCk7CisgICAgICAgICAgICBmd3JpdGUob3V0LCAxLCBCVUZMRU4gLSBzdHJtLT5hdmFpbF9vdXQsIGd6LT5maWxlKTsKKyAgICAgICAgfSB3aGlsZSAoc3RybS0+YXZhaWxfb3V0ID09IDApOworICAgICAgICBkZWZsYXRlRW5kKHN0cm0pOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGluZmxhdGVFbmQoc3RybSk7CisgICAgZmNsb3NlKGd6LT5maWxlKTsKKyAgICBmcmVlKGd6KTsKKyAgICByZXR1cm4gWl9PSzsKK30KKworY29uc3QgY2hhciAqZ3plcnJvciBPRigoZ3pGaWxlLCBpbnQgKikpOworCitjb25zdCBjaGFyICpnemVycm9yKGd6LCBlcnIpCisgICAgZ3pGaWxlIGd6OworICAgIGludCAqZXJyOworeworICAgICplcnIgPSBnei0+ZXJyOworICAgIHJldHVybiBnei0+bXNnOworfQorCisjZW5kaWYKKworY2hhciAqcHJvZzsKKwordm9pZCBlcnJvciAgICAgICAgICAgIE9GKChjb25zdCBjaGFyICptc2cpKTsKK3ZvaWQgZ3pfY29tcHJlc3MgICAgICBPRigoRklMRSAgICppbiwgZ3pGaWxlIG91dCkpOworI2lmZGVmIFVTRV9NTUFQCitpbnQgIGd6X2NvbXByZXNzX21tYXAgT0YoKEZJTEUgICAqaW4sIGd6RmlsZSBvdXQpKTsKKyNlbmRpZgordm9pZCBnel91bmNvbXByZXNzICAgIE9GKChnekZpbGUgaW4sIEZJTEUgICAqb3V0KSk7Cit2b2lkIGZpbGVfY29tcHJlc3MgICAgT0YoKGNoYXIgICpmaWxlLCBjaGFyICptb2RlKSk7Cit2b2lkIGZpbGVfdW5jb21wcmVzcyAgT0YoKGNoYXIgICpmaWxlKSk7CitpbnQgIG1haW4gICAgICAgICAgICAgT0YoKGludCBhcmdjLCBjaGFyICphcmd2W10pKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEaXNwbGF5IGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQKKyAqLwordm9pZCBlcnJvcihtc2cpCisgICAgY29uc3QgY2hhciAqbXNnOworeworICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICVzXG4iLCBwcm9nLCBtc2cpOworICAgIGV4aXQoMSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29tcHJlc3MgaW5wdXQgdG8gb3V0cHV0IHRoZW4gY2xvc2UgYm90aCBmaWxlcy4KKyAqLworCit2b2lkIGd6X2NvbXByZXNzKGluLCBvdXQpCisgICAgRklMRSAgICppbjsKKyAgICBnekZpbGUgb3V0OworeworICAgIGxvY2FsIGNoYXIgYnVmW0JVRkxFTl07CisgICAgaW50IGxlbjsKKyAgICBpbnQgZXJyOworCisjaWZkZWYgVVNFX01NQVAKKyAgICAvKiBUcnkgZmlyc3QgY29tcHJlc3Npbmcgd2l0aCBtbWFwLiBJZiBtbWFwIGZhaWxzIChtaW5pZ3ppcCB1c2VkIGluIGEKKyAgICAgKiBwaXBlKSwgdXNlIHRoZSBub3JtYWwgZnJlYWQgbG9vcC4KKyAgICAgKi8KKyAgICBpZiAoZ3pfY29tcHJlc3NfbW1hcChpbiwgb3V0KSA9PSBaX09LKSByZXR1cm47CisjZW5kaWYKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGxlbiA9IChpbnQpZnJlYWQoYnVmLCAxLCBzaXplb2YoYnVmKSwgaW4pOworICAgICAgICBpZiAoZmVycm9yKGluKSkgeworICAgICAgICAgICAgcGVycm9yKCJmcmVhZCIpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGVuID09IDApIGJyZWFrOworCisgICAgICAgIGlmIChnendyaXRlKG91dCwgYnVmLCAodW5zaWduZWQpbGVuKSAhPSBsZW4pIGVycm9yKGd6ZXJyb3Iob3V0LCAmZXJyKSk7CisgICAgfQorICAgIGZjbG9zZShpbik7CisgICAgaWYgKGd6Y2xvc2Uob3V0KSAhPSBaX09LKSBlcnJvcigiZmFpbGVkIGd6Y2xvc2UiKTsKK30KKworI2lmZGVmIFVTRV9NTUFQIC8qIE1NQVAgdmVyc2lvbiwgTWlndWVsIEFsYnJlY2h0IDxtYWxicmVjaEBlc28ub3JnPiAqLworCisvKiBUcnkgY29tcHJlc3NpbmcgdGhlIGlucHV0IGZpbGUgYXQgb25jZSB1c2luZyBtbWFwLiBSZXR1cm4gWl9PSyBpZgorICogaWYgc3VjY2VzcywgWl9FUlJOTyBvdGhlcndpc2UuCisgKi8KK2ludCBnel9jb21wcmVzc19tbWFwKGluLCBvdXQpCisgICAgRklMRSAgICppbjsKKyAgICBnekZpbGUgb3V0OworeworICAgIGludCBsZW47CisgICAgaW50IGVycjsKKyAgICBpbnQgaWZkID0gZmlsZW5vKGluKTsKKyAgICBjYWRkcl90IGJ1ZjsgICAgLyogbW1hcCdlZCBidWZmZXIgZm9yIHRoZSBlbnRpcmUgaW5wdXQgZmlsZSAqLworICAgIG9mZl90IGJ1Zl9sZW47ICAvKiBsZW5ndGggb2YgdGhlIGlucHV0IGZpbGUgKi8KKyAgICBzdHJ1Y3Qgc3RhdCBzYjsKKworICAgIC8qIERldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgZmlsZSwgbmVlZGVkIGZvciBtbWFwOiAqLworICAgIGlmIChmc3RhdChpZmQsICZzYikgPCAwKSByZXR1cm4gWl9FUlJOTzsKKyAgICBidWZfbGVuID0gc2Iuc3Rfc2l6ZTsKKyAgICBpZiAoYnVmX2xlbiA8PSAwKSByZXR1cm4gWl9FUlJOTzsKKworICAgIC8qIE5vdyBkbyB0aGUgYWN0dWFsIG1tYXA6ICovCisgICAgYnVmID0gbW1hcCgoY2FkZHJfdCkgMCwgYnVmX2xlbiwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBpZmQsIChvZmZfdCkwKTsKKyAgICBpZiAoYnVmID09IChjYWRkcl90KSgtMSkpIHJldHVybiBaX0VSUk5POworCisgICAgLyogQ29tcHJlc3MgdGhlIHdob2xlIGZpbGUgYXQgb25jZTogKi8KKyAgICBsZW4gPSBnendyaXRlKG91dCwgKGNoYXIgKilidWYsICh1bnNpZ25lZClidWZfbGVuKTsKKworICAgIGlmIChsZW4gIT0gKGludClidWZfbGVuKSBlcnJvcihnemVycm9yKG91dCwgJmVycikpOworCisgICAgbXVubWFwKGJ1ZiwgYnVmX2xlbik7CisgICAgZmNsb3NlKGluKTsKKyAgICBpZiAoZ3pjbG9zZShvdXQpICE9IFpfT0spIGVycm9yKCJmYWlsZWQgZ3pjbG9zZSIpOworICAgIHJldHVybiBaX09LOworfQorI2VuZGlmIC8qIFVTRV9NTUFQICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVW5jb21wcmVzcyBpbnB1dCB0byBvdXRwdXQgdGhlbiBjbG9zZSBib3RoIGZpbGVzLgorICovCit2b2lkIGd6X3VuY29tcHJlc3MoaW4sIG91dCkKKyAgICBnekZpbGUgaW47CisgICAgRklMRSAgICpvdXQ7Cit7CisgICAgbG9jYWwgY2hhciBidWZbQlVGTEVOXTsKKyAgICBpbnQgbGVuOworICAgIGludCBlcnI7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGxlbiA9IGd6cmVhZChpbiwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgIGlmIChsZW4gPCAwKSBlcnJvciAoZ3plcnJvcihpbiwgJmVycikpOworICAgICAgICBpZiAobGVuID09IDApIGJyZWFrOworCisgICAgICAgIGlmICgoaW50KWZ3cml0ZShidWYsIDEsICh1bnNpZ25lZClsZW4sIG91dCkgIT0gbGVuKSB7CisgICAgICAgICAgICBlcnJvcigiZmFpbGVkIGZ3cml0ZSIpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChmY2xvc2Uob3V0KSkgZXJyb3IoImZhaWxlZCBmY2xvc2UiKTsKKworICAgIGlmIChnemNsb3NlKGluKSAhPSBaX09LKSBlcnJvcigiZmFpbGVkIGd6Y2xvc2UiKTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbXByZXNzIHRoZSBnaXZlbiBmaWxlOiBjcmVhdGUgYSBjb3JyZXNwb25kaW5nIC5neiBmaWxlIGFuZCByZW1vdmUgdGhlCisgKiBvcmlnaW5hbC4KKyAqLwordm9pZCBmaWxlX2NvbXByZXNzKGZpbGUsIG1vZGUpCisgICAgY2hhciAgKmZpbGU7CisgICAgY2hhciAgKm1vZGU7Cit7CisgICAgbG9jYWwgY2hhciBvdXRmaWxlW01BWF9OQU1FX0xFTl07CisgICAgRklMRSAgKmluOworICAgIGd6RmlsZSBvdXQ7CisKKyAgICBpZiAoc3RybGVuKGZpbGUpICsgc3RybGVuKEdaX1NVRkZJWCkgPj0gc2l6ZW9mKG91dGZpbGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGZpbGVuYW1lIHRvbyBsb25nXG4iLCBwcm9nKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyNpZiAhZGVmaW5lZChOT19zbnByaW50ZikgJiYgIWRlZmluZWQoTk9fdnNucHJpbnRmKQorICAgIHNucHJpbnRmKG91dGZpbGUsIHNpemVvZihvdXRmaWxlKSwgIiVzJXMiLCBmaWxlLCBHWl9TVUZGSVgpOworI2Vsc2UKKyAgICBzdHJjcHkob3V0ZmlsZSwgZmlsZSk7CisgICAgc3RyY2F0KG91dGZpbGUsIEdaX1NVRkZJWCk7CisjZW5kaWYKKworICAgIGluID0gZm9wZW4oZmlsZSwgInJiIik7CisgICAgaWYgKGluID09IE5VTEwpIHsKKyAgICAgICAgcGVycm9yKGZpbGUpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBvdXQgPSBnem9wZW4ob3V0ZmlsZSwgbW9kZSk7CisgICAgaWYgKG91dCA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IGd6b3BlbiAlc1xuIiwgcHJvZywgb3V0ZmlsZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGd6X2NvbXByZXNzKGluLCBvdXQpOworCisgICAgdW5saW5rKGZpbGUpOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVW5jb21wcmVzcyB0aGUgZ2l2ZW4gZmlsZSBhbmQgcmVtb3ZlIHRoZSBvcmlnaW5hbC4KKyAqLwordm9pZCBmaWxlX3VuY29tcHJlc3MoZmlsZSkKKyAgICBjaGFyICAqZmlsZTsKK3sKKyAgICBsb2NhbCBjaGFyIGJ1ZltNQVhfTkFNRV9MRU5dOworICAgIGNoYXIgKmluZmlsZSwgKm91dGZpbGU7CisgICAgRklMRSAgKm91dDsKKyAgICBnekZpbGUgaW47CisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihmaWxlKTsKKworICAgIGlmIChsZW4gKyBzdHJsZW4oR1pfU1VGRklYKSA+PSBzaXplb2YoYnVmKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBmaWxlbmFtZSB0b28gbG9uZ1xuIiwgcHJvZyk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisjaWYgIWRlZmluZWQoTk9fc25wcmludGYpICYmICFkZWZpbmVkKE5PX3ZzbnByaW50ZikKKyAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMiLCBmaWxlKTsKKyNlbHNlCisgICAgc3RyY3B5KGJ1ZiwgZmlsZSk7CisjZW5kaWYKKworICAgIGlmIChsZW4gPiBTVUZGSVhfTEVOICYmIHN0cmNtcChmaWxlK2xlbi1TVUZGSVhfTEVOLCBHWl9TVUZGSVgpID09IDApIHsKKyAgICAgICAgaW5maWxlID0gZmlsZTsKKyAgICAgICAgb3V0ZmlsZSA9IGJ1ZjsKKyAgICAgICAgb3V0ZmlsZVtsZW4tM10gPSAnXDAnOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dGZpbGUgPSBmaWxlOworICAgICAgICBpbmZpbGUgPSBidWY7CisjaWYgIWRlZmluZWQoTk9fc25wcmludGYpICYmICFkZWZpbmVkKE5PX3ZzbnByaW50ZikKKyAgICAgICAgc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwgIiVzIiwgR1pfU1VGRklYKTsKKyNlbHNlCisgICAgICAgIHN0cmNhdChpbmZpbGUsIEdaX1NVRkZJWCk7CisjZW5kaWYKKyAgICB9CisgICAgaW4gPSBnem9wZW4oaW5maWxlLCAicmIiKTsKKyAgICBpZiAoaW4gPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBnem9wZW4gJXNcbiIsIHByb2csIGluZmlsZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIG91dCA9IGZvcGVuKG91dGZpbGUsICJ3YiIpOworICAgIGlmIChvdXQgPT0gTlVMTCkgeworICAgICAgICBwZXJyb3IoZmlsZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgZ3pfdW5jb21wcmVzcyhpbiwgb3V0KTsKKworICAgIHVubGluayhpbmZpbGUpOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVXNhZ2U6ICBtaW5pZ3ppcCBbLWNdIFstZF0gWy1mXSBbLWhdIFstcl0gWy0xIHRvIC05XSBbZmlsZXMuLi5dCisgKiAgIC1jIDogd3JpdGUgdG8gc3RhbmRhcmQgb3V0cHV0CisgKiAgIC1kIDogZGVjb21wcmVzcworICogICAtZiA6IGNvbXByZXNzIHdpdGggWl9GSUxURVJFRAorICogICAtaCA6IGNvbXByZXNzIHdpdGggWl9IVUZGTUFOX09OTFkKKyAqICAgLXIgOiBjb21wcmVzcyB3aXRoIFpfUkxFCisgKiAgIC0xIHRvIC05IDogY29tcHJlc3Npb24gbGV2ZWwKKyAqLworCitpbnQgbWFpbihhcmdjLCBhcmd2KQorICAgIGludCBhcmdjOworICAgIGNoYXIgKmFyZ3ZbXTsKK3sKKyAgICBpbnQgY29weW91dCA9IDA7CisgICAgaW50IHVuY29tcHIgPSAwOworICAgIGd6RmlsZSBmaWxlOworICAgIGNoYXIgKmJuYW1lLCBvdXRtb2RlWzIwXTsKKworI2lmICFkZWZpbmVkKE5PX3NucHJpbnRmKSAmJiAhZGVmaW5lZChOT192c25wcmludGYpCisgICAgc25wcmludGYob3V0bW9kZSwgc2l6ZW9mKG91dG1vZGUpLCAiJXMiLCAid2I2ICIpOworI2Vsc2UKKyAgICBzdHJjcHkob3V0bW9kZSwgIndiNiAiKTsKKyNlbmRpZgorCisgICAgcHJvZyA9IGFyZ3ZbMF07CisgICAgYm5hbWUgPSBzdHJyY2hyKGFyZ3ZbMF0sICcvJyk7CisgICAgaWYgKGJuYW1lKQorICAgICAgYm5hbWUrKzsKKyAgICBlbHNlCisgICAgICBibmFtZSA9IGFyZ3ZbMF07CisgICAgYXJnYy0tLCBhcmd2Kys7CisKKyAgICBpZiAoIXN0cmNtcChibmFtZSwgImd1bnppcCIpKQorICAgICAgdW5jb21wciA9IDE7CisgICAgZWxzZSBpZiAoIXN0cmNtcChibmFtZSwgInpjYXQiKSkKKyAgICAgIGNvcHlvdXQgPSB1bmNvbXByID0gMTsKKworICAgIHdoaWxlIChhcmdjID4gMCkgeworICAgICAgaWYgKHN0cmNtcCgqYXJndiwgIi1jIikgPT0gMCkKKyAgICAgICAgY29weW91dCA9IDE7CisgICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItZCIpID09IDApCisgICAgICAgIHVuY29tcHIgPSAxOworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLWYiKSA9PSAwKQorICAgICAgICBvdXRtb2RlWzNdID0gJ2YnOworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLWgiKSA9PSAwKQorICAgICAgICBvdXRtb2RlWzNdID0gJ2gnOworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLXIiKSA9PSAwKQorICAgICAgICBvdXRtb2RlWzNdID0gJ1InOworICAgICAgZWxzZSBpZiAoKCphcmd2KVswXSA9PSAnLScgJiYgKCphcmd2KVsxXSA+PSAnMScgJiYgKCphcmd2KVsxXSA8PSAnOScgJiYKKyAgICAgICAgICAgICAgICgqYXJndilbMl0gPT0gMCkKKyAgICAgICAgb3V0bW9kZVsyXSA9ICgqYXJndilbMV07CisgICAgICBlbHNlCisgICAgICAgIGJyZWFrOworICAgICAgYXJnYy0tLCBhcmd2Kys7CisgICAgfQorICAgIGlmIChvdXRtb2RlWzNdID09ICcgJykKKyAgICAgICAgb3V0bW9kZVszXSA9IDA7CisgICAgaWYgKGFyZ2MgPT0gMCkgeworICAgICAgICBTRVRfQklOQVJZX01PREUoc3RkaW4pOworICAgICAgICBTRVRfQklOQVJZX01PREUoc3Rkb3V0KTsKKyAgICAgICAgaWYgKHVuY29tcHIpIHsKKyAgICAgICAgICAgIGZpbGUgPSBnemRvcGVuKGZpbGVubyhzdGRpbiksICJyYiIpOworICAgICAgICAgICAgaWYgKGZpbGUgPT0gTlVMTCkgZXJyb3IoImNhbid0IGd6ZG9wZW4gc3RkaW4iKTsKKyAgICAgICAgICAgIGd6X3VuY29tcHJlc3MoZmlsZSwgc3Rkb3V0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbGUgPSBnemRvcGVuKGZpbGVubyhzdGRvdXQpLCBvdXRtb2RlKTsKKyAgICAgICAgICAgIGlmIChmaWxlID09IE5VTEwpIGVycm9yKCJjYW4ndCBnemRvcGVuIHN0ZG91dCIpOworICAgICAgICAgICAgZ3pfY29tcHJlc3Moc3RkaW4sIGZpbGUpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGNvcHlvdXQpIHsKKyAgICAgICAgICAgIFNFVF9CSU5BUllfTU9ERShzdGRvdXQpOworICAgICAgICB9CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmICh1bmNvbXByKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvcHlvdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGd6b3BlbigqYXJndiwgInJiIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBnem9wZW4gJXNcbiIsIHByb2csICphcmd2KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZ3pfdW5jb21wcmVzcyhmaWxlLCBzdGRvdXQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGVfdW5jb21wcmVzcygqYXJndik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoY29weW91dCkgeworICAgICAgICAgICAgICAgICAgICBGSUxFICogaW4gPSBmb3BlbigqYXJndiwgInJiIik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlcnJvcigqYXJndik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gZ3pkb3BlbihmaWxlbm8oc3Rkb3V0KSwgb3V0bW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSA9PSBOVUxMKSBlcnJvcigiY2FuJ3QgZ3pkb3BlbiBzdGRvdXQiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZ3pfY29tcHJlc3MoaW4sIGZpbGUpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmaWxlX2NvbXByZXNzKCphcmd2LCBvdXRtb2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKGFyZ3YrKywgLS1hcmdjKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS96bGliL3NyYy90cmVlYnVpbGQueG1sIGIvemxpYi9zcmMvdHJlZWJ1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGQyOWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvdHJlZWJ1aWxkLnhtbApAQCAtMCwwICsxLDExNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiA/PgorPHBhY2thZ2UgbmFtZT0iemxpYiIgdmVyc2lvbj0iMS4yLjgiPgorICAgIDxsaWJyYXJ5IG5hbWU9InpsaWIiIGRsdmVyc2lvbj0iMS4yLjgiIGRsbmFtZT0ieiI+CisJPHByb3BlcnR5IG5hbWU9ImRlc2NyaXB0aW9uIj4gemlwIGNvbXByZXNzaW9uIGxpYnJhcnkgPC9wcm9wZXJ0eT4KKwk8cHJvcGVydHkgbmFtZT0iaW5jbHVkZS10YXJnZXQtZGlyIiB2YWx1ZT0iJChAUEFDS0FHRS9pbnN0YWxsLWluY2x1ZGVkaXIpIiAvPgorCisJPCEtLSBmaXhtZTogbm90IGltcGxlbWVudGVkIHlldCAtLT4KKwk8cHJvcGVydHkgbmFtZT0iY29tcGlsZXIvYy9pbmxpbmUiIHZhbHVlPSJ5ZXMiIC8+CisKKwk8aW5jbHVkZS1maWxlIG5hbWU9InpsaWIuaCIgc2NvcGU9InB1YmxpYyIgbW9kZT0iNjQ0IiAvPgorCTxpbmNsdWRlLWZpbGUgbmFtZT0iemNvbmYuaCIgc2NvcGU9InB1YmxpYyIgbW9kZT0iNjQ0IiAvPgorCisJPHNvdXJjZSBuYW1lPSJhZGxlcjMyLmMiPgorCSAgICA8ZGVwZW5kIG5hbWU9InpsaWIuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJ6Y29uZi5oIiAvPgorCTwvc291cmNlPgorCTxzb3VyY2UgbmFtZT0iY29tcHJlc3MuYyI+CisJICAgIDxkZXBlbmQgbmFtZT0iemxpYi5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9Inpjb25mLmgiIC8+CisJPC9zb3VyY2U+CisJPHNvdXJjZSBuYW1lPSJjcmMzMi5jIj4KKwkgICAgPGRlcGVuZCBuYW1lPSJ6bGliLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0iemNvbmYuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJjcmMzMi5oIiAvPgorCTwvc291cmNlPgorCTxzb3VyY2UgbmFtZT0iZ3pjbG9zZS5jIj4KKwkgICAgPGRlcGVuZCBuYW1lPSJ6bGliLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0iemNvbmYuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJnemd1dHMuaCIgLz4KKwk8L3NvdXJjZT4KKwk8c291cmNlIG5hbWU9Imd6bGliLmMiPgorCSAgICA8ZGVwZW5kIG5hbWU9InpsaWIuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJ6Y29uZi5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9Imd6Z3V0cy5oIiAvPgorCTwvc291cmNlPgorCTxzb3VyY2UgbmFtZT0iZ3pyZWFkLmMiPgorCSAgICA8ZGVwZW5kIG5hbWU9InpsaWIuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJ6Y29uZi5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9Imd6Z3V0cy5oIiAvPgorCTwvc291cmNlPgorCTxzb3VyY2UgbmFtZT0iZ3p3cml0ZS5jIj4KKwkgICAgPGRlcGVuZCBuYW1lPSJ6bGliLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0iemNvbmYuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJnemd1dHMuaCIgLz4KKwk8L3NvdXJjZT4KKwk8c291cmNlIG5hbWU9InVuY29tcHIuYyI+CisJICAgIDxkZXBlbmQgbmFtZT0iemxpYi5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9Inpjb25mLmgiIC8+CisJPC9zb3VyY2U+CisJPHNvdXJjZSBuYW1lPSJkZWZsYXRlLmMiPgorCSAgICA8ZGVwZW5kIG5hbWU9InpsaWIuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJ6Y29uZi5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9Inp1dGlsLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0iZGVmbGF0ZS5oIiAvPgorCTwvc291cmNlPgorCTxzb3VyY2UgbmFtZT0idHJlZXMuYyI+CisJICAgIDxkZXBlbmQgbmFtZT0iemxpYi5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9Inpjb25mLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0ienV0aWwuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJkZWZsYXRlLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0idHJlZXMuaCIgLz4KKwk8L3NvdXJjZT4KKwk8c291cmNlIG5hbWU9Inp1dGlsLmMiPgorCSAgICA8ZGVwZW5kIG5hbWU9InpsaWIuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJ6Y29uZi5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9Inp1dGlsLmgiIC8+CisJPC9zb3VyY2U+CisJPHNvdXJjZSBuYW1lPSJpbmZsYXRlLmMiPgorCSAgICA8ZGVwZW5kIG5hbWU9InpsaWIuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJ6Y29uZi5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9Inp1dGlsLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0iaW5mdHJlZXMuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJpbmZsYXRlLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0iaW5mZmFzdC5oIiAvPgorCTwvc291cmNlPgorCTxzb3VyY2UgbmFtZT0iaW5mYmFjay5jIj4KKwkgICAgPGRlcGVuZCBuYW1lPSJ6bGliLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0iemNvbmYuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJ6dXRpbC5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9ImluZnRyZWVzLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0iaW5mbGF0ZS5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9ImluZmZhc3QuaCIgLz4KKwk8L3NvdXJjZT4KKwk8c291cmNlIG5hbWU9ImluZnRyZWVzLmMiPgorCSAgICA8ZGVwZW5kIG5hbWU9InpsaWIuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJ6Y29uZi5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9Inp1dGlsLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0iaW5mdHJlZXMuaCIgLz4KKwk8L3NvdXJjZT4KKwk8c291cmNlIG5hbWU9ImluZmZhc3QuYyI+CisJICAgIDxkZXBlbmQgbmFtZT0iemxpYi5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9Inpjb25mLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0ienV0aWwuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJpbmZ0cmVlcy5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9ImluZmxhdGUuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJpbmZmYXN0LmgiIC8+CisJPC9zb3VyY2U+CisgICAgPC9saWJyYXJ5PgorPC9wYWNrYWdlPgorCis8IS0tCitDRkxBR1M9LU8KKyNDRkxBR1M9LU8gLURNQVhfV0JJVFM9MTQgLURNQVhfTUVNX0xFVkVMPTcKKyNDRkxBR1M9LWcgLURERUJVRworI0NGTEFHUz0tTzMgLVdhbGwgLVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV2NvbnZlcnNpb24gXAorIyAgICAgICAgICAgLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcworCisjIE9CSkEgPQorIyB0byB1c2UgdGhlIGFzbSBjb2RlOiBtYWtlIE9CSkE9bWF0Y2gubworIworbWF0Y2gubzogbWF0Y2guUworCSQoQ1BQKSBtYXRjaC5TID4gX21hdGNoLnMKKwkkKENDKSAtYyBfbWF0Y2gucworCW12IF9tYXRjaC5vIG1hdGNoLm8KKwlybSAtZiBfbWF0Y2gucworLS0+CmRpZmYgLS1naXQgYS96bGliL3NyYy90cmVlcy5jIGIvemxpYi9zcmMvdHJlZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmQ3NzU5Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvdHJlZXMuYwpAQCAtMCwwICsxLDEyMjYgQEAKKy8qIHRyZWVzLmMgLS0gb3V0cHV0IGRlZmxhdGVkIGRhdGEgdXNpbmcgSHVmZm1hbiBjb2RpbmcKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDEyIEplYW4tbG91cCBHYWlsbHkKKyAqIGRldGVjdF9kYXRhX3R5cGUoKSBmdW5jdGlvbiBwcm92aWRlZCBmcmVlbHkgYnkgQ29zbWluIFRydXRhLCAyMDA2CisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyoKKyAqICBBTEdPUklUSE0KKyAqCisgKiAgICAgIFRoZSAiZGVmbGF0aW9uIiBwcm9jZXNzIHVzZXMgc2V2ZXJhbCBIdWZmbWFuIHRyZWVzLiBUaGUgbW9yZQorICogICAgICBjb21tb24gc291cmNlIHZhbHVlcyBhcmUgcmVwcmVzZW50ZWQgYnkgc2hvcnRlciBiaXQgc2VxdWVuY2VzLgorICoKKyAqICAgICAgRWFjaCBjb2RlIHRyZWUgaXMgc3RvcmVkIGluIGEgY29tcHJlc3NlZCBmb3JtIHdoaWNoIGlzIGl0c2VsZgorICogYSBIdWZmbWFuIGVuY29kaW5nIG9mIHRoZSBsZW5ndGhzIG9mIGFsbCB0aGUgY29kZSBzdHJpbmdzIChpbgorICogYXNjZW5kaW5nIG9yZGVyIGJ5IHNvdXJjZSB2YWx1ZXMpLiAgVGhlIGFjdHVhbCBjb2RlIHN0cmluZ3MgYXJlCisgKiByZWNvbnN0cnVjdGVkIGZyb20gdGhlIGxlbmd0aHMgaW4gdGhlIGluZmxhdGUgcHJvY2VzcywgYXMgZGVzY3JpYmVkCisgKiBpbiB0aGUgZGVmbGF0ZSBzcGVjaWZpY2F0aW9uLgorICoKKyAqICBSRUZFUkVOQ0VTCisgKgorICogICAgICBEZXV0c2NoLCBMLlAuLCInRGVmbGF0ZScgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uIi4KKyAqICAgICAgQXZhaWxhYmxlIGluIGZ0cC51dS5uZXQ6L3B1Yi9hcmNoaXZpbmcvemlwL2RvYy9kZWZsYXRlLTEuMS5kb2MKKyAqCisgKiAgICAgIFN0b3JlciwgSmFtZXMgQS4KKyAqICAgICAgICAgIERhdGEgQ29tcHJlc3Npb246ICBNZXRob2RzIGFuZCBUaGVvcnksIHBwLiA0OS01MC4KKyAqICAgICAgICAgIENvbXB1dGVyIFNjaWVuY2UgUHJlc3MsIDE5ODguICBJU0JOIDAtNzE2Ny04MTU2LTUuCisgKgorICogICAgICBTZWRnZXdpY2ssIFIuCisgKiAgICAgICAgICBBbGdvcml0aG1zLCBwMjkwLgorICogICAgICAgICAgQWRkaXNvbi1XZXNsZXksIDE5ODMuIElTQk4gMC0yMDEtMDY2NzItNi4KKyAqLworCisvKiBAKCMpICRJZCQgKi8KKworLyogI2RlZmluZSBHRU5fVFJFRVNfSCAqLworCisjaW5jbHVkZSAiZGVmbGF0ZS5oIgorCisjaWZkZWYgREVCVUcKKyMgIGluY2x1ZGUgPGN0eXBlLmg+CisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb25zdGFudHMKKyAqLworCisjZGVmaW5lIE1BWF9CTF9CSVRTIDcKKy8qIEJpdCBsZW5ndGggY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CTF9CSVRTIGJpdHMgKi8KKworI2RlZmluZSBFTkRfQkxPQ0sgMjU2CisvKiBlbmQgb2YgYmxvY2sgbGl0ZXJhbCBjb2RlICovCisKKyNkZWZpbmUgUkVQXzNfNiAgICAgIDE2CisvKiByZXBlYXQgcHJldmlvdXMgYml0IGxlbmd0aCAzLTYgdGltZXMgKDIgYml0cyBvZiByZXBlYXQgY291bnQpICovCisKKyNkZWZpbmUgUkVQWl8zXzEwICAgIDE3CisvKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAzLTEwIHRpbWVzICAoMyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi8KKworI2RlZmluZSBSRVBaXzExXzEzOCAgMTgKKy8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDExLTEzOCB0aW1lcyAgKDcgYml0cyBvZiByZXBlYXQgY291bnQpICovCisKK2xvY2FsIGNvbnN0IGludCBleHRyYV9sYml0c1tMRU5HVEhfQ09ERVNdIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggbGVuZ3RoIGNvZGUgKi8KKyAgID0gezAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMH07CisKK2xvY2FsIGNvbnN0IGludCBleHRyYV9kYml0c1tEX0NPREVTXSAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGRpc3RhbmNlIGNvZGUgKi8KKyAgID0gezAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTN9OworCitsb2NhbCBjb25zdCBpbnQgZXh0cmFfYmxiaXRzW0JMX0NPREVTXS8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggYml0IGxlbmd0aCBjb2RlICovCisgICA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMyw3fTsKKworbG9jYWwgY29uc3QgdWNoIGJsX29yZGVyW0JMX0NPREVTXQorICAgPSB7MTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNX07CisvKiBUaGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcyBhcmUgc2VudCBpbiBvcmRlciBvZiBkZWNyZWFzaW5nCisgKiBwcm9iYWJpbGl0eSwgdG8gYXZvaWQgdHJhbnNtaXR0aW5nIHRoZSBsZW5ndGhzIGZvciB1bnVzZWQgYml0IGxlbmd0aCBjb2Rlcy4KKyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExvY2FsIGRhdGEuIFRoZXNlIGFyZSBpbml0aWFsaXplZCBvbmx5IG9uY2UuCisgKi8KKworI2RlZmluZSBESVNUX0NPREVfTEVOICA1MTIgLyogc2VlIGRlZmluaXRpb24gb2YgYXJyYXkgZGlzdF9jb2RlIGJlbG93ICovCisKKyNpZiBkZWZpbmVkKEdFTl9UUkVFU19IKSB8fCAhZGVmaW5lZChTVERDKQorLyogbm9uIEFOU0kgY29tcGlsZXJzIG1heSBub3QgYWNjZXB0IHRyZWVzLmggKi8KKworbG9jYWwgY3RfZGF0YSBzdGF0aWNfbHRyZWVbTF9DT0RFUysyXTsKKy8qIFRoZSBzdGF0aWMgbGl0ZXJhbCB0cmVlLiBTaW5jZSB0aGUgYml0IGxlbmd0aHMgYXJlIGltcG9zZWQsIHRoZXJlIGlzIG5vCisgKiBuZWVkIGZvciB0aGUgTF9DT0RFUyBleHRyYSBjb2RlcyB1c2VkIGR1cmluZyBoZWFwIGNvbnN0cnVjdGlvbi4gSG93ZXZlcgorICogVGhlIGNvZGVzIDI4NiBhbmQgMjg3IGFyZSBuZWVkZWQgdG8gYnVpbGQgYSBjYW5vbmljYWwgdHJlZSAoc2VlIF90cl9pbml0CisgKiBiZWxvdykuCisgKi8KKworbG9jYWwgY3RfZGF0YSBzdGF0aWNfZHRyZWVbRF9DT0RFU107CisvKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUuIChBY3R1YWxseSBhIHRyaXZpYWwgdHJlZSBzaW5jZSBhbGwgY29kZXMgdXNlCisgKiA1IGJpdHMuKQorICovCisKK3VjaCBfZGlzdF9jb2RlW0RJU1RfQ09ERV9MRU5dOworLyogRGlzdGFuY2UgY29kZXMuIFRoZSBmaXJzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIGRpc3RhbmNlcworICogMyAuLiAyNTgsIHRoZSBsYXN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgdG9wIDggYml0cyBvZgorICogdGhlIDE1IGJpdCBkaXN0YW5jZXMuCisgKi8KKwordWNoIF9sZW5ndGhfY29kZVtNQVhfTUFUQ0gtTUlOX01BVENIKzFdOworLyogbGVuZ3RoIGNvZGUgZm9yIGVhY2ggbm9ybWFsaXplZCBtYXRjaCBsZW5ndGggKDAgPT0gTUlOX01BVENIKSAqLworCitsb2NhbCBpbnQgYmFzZV9sZW5ndGhbTEVOR1RIX0NPREVTXTsKKy8qIEZpcnN0IG5vcm1hbGl6ZWQgbGVuZ3RoIGZvciBlYWNoIGNvZGUgKDAgPSBNSU5fTUFUQ0gpICovCisKK2xvY2FsIGludCBiYXNlX2Rpc3RbRF9DT0RFU107CisvKiBGaXJzdCBub3JtYWxpemVkIGRpc3RhbmNlIGZvciBlYWNoIGNvZGUgKDAgPSBkaXN0YW5jZSBvZiAxKSAqLworCisjZWxzZQorIyAgaW5jbHVkZSAidHJlZXMuaCIKKyNlbmRpZiAvKiBHRU5fVFJFRVNfSCAqLworCitzdHJ1Y3Qgc3RhdGljX3RyZWVfZGVzY19zIHsKKyAgICBjb25zdCBjdF9kYXRhICpzdGF0aWNfdHJlZTsgIC8qIHN0YXRpYyB0cmVlIG9yIE5VTEwgKi8KKyAgICBjb25zdCBpbnRmICpleHRyYV9iaXRzOyAgICAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggY29kZSBvciBOVUxMICovCisgICAgaW50ICAgICBleHRyYV9iYXNlOyAgICAgICAgICAvKiBiYXNlIGluZGV4IGZvciBleHRyYV9iaXRzICovCisgICAgaW50ICAgICBlbGVtczsgICAgICAgICAgICAgICAvKiBtYXggbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0cmVlICovCisgICAgaW50ICAgICBtYXhfbGVuZ3RoOyAgICAgICAgICAvKiBtYXggYml0IGxlbmd0aCBmb3IgdGhlIGNvZGVzICovCit9OworCitsb2NhbCBzdGF0aWNfdHJlZV9kZXNjICBzdGF0aWNfbF9kZXNjID0KK3tzdGF0aWNfbHRyZWUsIGV4dHJhX2xiaXRzLCBMSVRFUkFMUysxLCBMX0NPREVTLCBNQVhfQklUU307CisKK2xvY2FsIHN0YXRpY190cmVlX2Rlc2MgIHN0YXRpY19kX2Rlc2MgPQore3N0YXRpY19kdHJlZSwgZXh0cmFfZGJpdHMsIDAsICAgICAgICAgIERfQ09ERVMsIE1BWF9CSVRTfTsKKworbG9jYWwgc3RhdGljX3RyZWVfZGVzYyAgc3RhdGljX2JsX2Rlc2MgPQoreyhjb25zdCBjdF9kYXRhICopMCwgZXh0cmFfYmxiaXRzLCAwLCAgIEJMX0NPREVTLCBNQVhfQkxfQklUU307CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTG9jYWwgKHN0YXRpYykgcm91dGluZXMgaW4gdGhpcyBmaWxlLgorICovCisKK2xvY2FsIHZvaWQgdHJfc3RhdGljX2luaXQgT0YoKHZvaWQpKTsKK2xvY2FsIHZvaWQgaW5pdF9ibG9jayAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK2xvY2FsIHZvaWQgcHFkb3duaGVhcCAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGN0X2RhdGEgKnRyZWUsIGludCBrKSk7Citsb2NhbCB2b2lkIGdlbl9iaXRsZW4gICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCB0cmVlX2Rlc2MgKmRlc2MpKTsKK2xvY2FsIHZvaWQgZ2VuX2NvZGVzICAgICAgT0YoKGN0X2RhdGEgKnRyZWUsIGludCBtYXhfY29kZSwgdXNoZiAqYmxfY291bnQpKTsKK2xvY2FsIHZvaWQgYnVpbGRfdHJlZSAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIHRyZWVfZGVzYyAqZGVzYykpOworbG9jYWwgdm9pZCBzY2FuX3RyZWUgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY3RfZGF0YSAqdHJlZSwgaW50IG1heF9jb2RlKSk7Citsb2NhbCB2b2lkIHNlbmRfdHJlZSAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBjdF9kYXRhICp0cmVlLCBpbnQgbWF4X2NvZGUpKTsKK2xvY2FsIGludCAgYnVpbGRfYmxfdHJlZSAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK2xvY2FsIHZvaWQgc2VuZF9hbGxfdHJlZXMgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBsY29kZXMsIGludCBkY29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxjb2RlcykpOworbG9jYWwgdm9pZCBjb21wcmVzc19ibG9jayBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY29uc3QgY3RfZGF0YSAqbHRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdF9kYXRhICpkdHJlZSkpOworbG9jYWwgaW50ICBkZXRlY3RfZGF0YV90eXBlIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7Citsb2NhbCB1bnNpZ25lZCBiaV9yZXZlcnNlIE9GKCh1bnNpZ25lZCB2YWx1ZSwgaW50IGxlbmd0aCkpOworbG9jYWwgdm9pZCBiaV93aW5kdXAgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOworbG9jYWwgdm9pZCBiaV9mbHVzaCAgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOworbG9jYWwgdm9pZCBjb3B5X2Jsb2NrICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY2hhcmYgKmJ1ZiwgdW5zaWduZWQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlYWRlcikpOworCisjaWZkZWYgR0VOX1RSRUVTX0gKK2xvY2FsIHZvaWQgZ2VuX3RyZWVzX2hlYWRlciBPRigodm9pZCkpOworI2VuZGlmCisKKyNpZm5kZWYgREVCVUcKKyMgIGRlZmluZSBzZW5kX2NvZGUocywgYywgdHJlZSkgc2VuZF9iaXRzKHMsIHRyZWVbY10uQ29kZSwgdHJlZVtjXS5MZW4pCisgICAvKiBTZW5kIGEgY29kZSBvZiB0aGUgZ2l2ZW4gdHJlZS4gYyBhbmQgdHJlZSBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cyAqLworCisjZWxzZSAvKiBERUJVRyAqLworIyAgZGVmaW5lIHNlbmRfY29kZShzLCBjLCB0cmVlKSBcCisgICAgIHsgaWYgKHpfdmVyYm9zZT4yKSBmcHJpbnRmKHN0ZGVyciwiXG5jZCAlM2QgIiwoYykpOyBcCisgICAgICAgc2VuZF9iaXRzKHMsIHRyZWVbY10uQ29kZSwgdHJlZVtjXS5MZW4pOyB9CisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBPdXRwdXQgYSBzaG9ydCBMU0IgZmlyc3Qgb24gdGhlIHN0cmVhbS4KKyAqIElOIGFzc2VydGlvbjogdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gcGVuZGluZ0J1Zi4KKyAqLworI2RlZmluZSBwdXRfc2hvcnQocywgdykgeyBcCisgICAgcHV0X2J5dGUocywgKHVjaCkoKHcpICYgMHhmZikpOyBcCisgICAgcHV0X2J5dGUocywgKHVjaCkoKHVzaCkodykgPj4gOCkpOyBcCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCBhIHZhbHVlIG9uIGEgZ2l2ZW4gbnVtYmVyIG9mIGJpdHMuCisgKiBJTiBhc3NlcnRpb246IGxlbmd0aCA8PSAxNiBhbmQgdmFsdWUgZml0cyBpbiBsZW5ndGggYml0cy4KKyAqLworI2lmZGVmIERFQlVHCitsb2NhbCB2b2lkIHNlbmRfYml0cyAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBpbnQgdmFsdWUsIGludCBsZW5ndGgpKTsKKworbG9jYWwgdm9pZCBzZW5kX2JpdHMocywgdmFsdWUsIGxlbmd0aCkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGludCB2YWx1ZTsgIC8qIHZhbHVlIHRvIHNlbmQgKi8KKyAgICBpbnQgbGVuZ3RoOyAvKiBudW1iZXIgb2YgYml0cyAqLworeworICAgIFRyYWNldnYoKHN0ZGVyciwiIGwgJTJkIHYgJTR4ICIsIGxlbmd0aCwgdmFsdWUpKTsKKyAgICBBc3NlcnQobGVuZ3RoID4gMCAmJiBsZW5ndGggPD0gMTUsICJpbnZhbGlkIGxlbmd0aCIpOworICAgIHMtPmJpdHNfc2VudCArPSAodWxnKWxlbmd0aDsKKworICAgIC8qIElmIG5vdCBlbm91Z2ggcm9vbSBpbiBiaV9idWYsIHVzZSAodmFsaWQpIGJpdHMgZnJvbSBiaV9idWYgYW5kCisgICAgICogKDE2IC0gYmlfdmFsaWQpIGJpdHMgZnJvbSB2YWx1ZSwgbGVhdmluZyAod2lkdGggLSAoMTYtYmlfdmFsaWQpKQorICAgICAqIHVudXNlZCBiaXRzIGluIHZhbHVlLgorICAgICAqLworICAgIGlmIChzLT5iaV92YWxpZCA+IChpbnQpQnVmX3NpemUgLSBsZW5ndGgpIHsKKyAgICAgICAgcy0+YmlfYnVmIHw9ICh1c2gpdmFsdWUgPDwgcy0+YmlfdmFsaWQ7CisgICAgICAgIHB1dF9zaG9ydChzLCBzLT5iaV9idWYpOworICAgICAgICBzLT5iaV9idWYgPSAodXNoKXZhbHVlID4+IChCdWZfc2l6ZSAtIHMtPmJpX3ZhbGlkKTsKKyAgICAgICAgcy0+YmlfdmFsaWQgKz0gbGVuZ3RoIC0gQnVmX3NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+YmlfYnVmIHw9ICh1c2gpdmFsdWUgPDwgcy0+YmlfdmFsaWQ7CisgICAgICAgIHMtPmJpX3ZhbGlkICs9IGxlbmd0aDsKKyAgICB9Cit9CisjZWxzZSAvKiAhREVCVUcgKi8KKworI2RlZmluZSBzZW5kX2JpdHMocywgdmFsdWUsIGxlbmd0aCkgXAoreyBpbnQgbGVuID0gbGVuZ3RoO1wKKyAgaWYgKHMtPmJpX3ZhbGlkID4gKGludClCdWZfc2l6ZSAtIGxlbikge1wKKyAgICBpbnQgdmFsID0gdmFsdWU7XAorICAgIHMtPmJpX2J1ZiB8PSAodXNoKXZhbCA8PCBzLT5iaV92YWxpZDtcCisgICAgcHV0X3Nob3J0KHMsIHMtPmJpX2J1Zik7XAorICAgIHMtPmJpX2J1ZiA9ICh1c2gpdmFsID4+IChCdWZfc2l6ZSAtIHMtPmJpX3ZhbGlkKTtcCisgICAgcy0+YmlfdmFsaWQgKz0gbGVuIC0gQnVmX3NpemU7XAorICB9IGVsc2Uge1wKKyAgICBzLT5iaV9idWYgfD0gKHVzaCkodmFsdWUpIDw8IHMtPmJpX3ZhbGlkO1wKKyAgICBzLT5iaV92YWxpZCArPSBsZW47XAorICB9XAorfQorI2VuZGlmIC8qIERFQlVHICovCisKKworLyogdGhlIGFyZ3VtZW50cyBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgdGhlIHZhcmlvdXMgJ2NvbnN0YW50JyB0YWJsZXMuCisgKi8KK2xvY2FsIHZvaWQgdHJfc3RhdGljX2luaXQoKQoreworI2lmIGRlZmluZWQoR0VOX1RSRUVTX0gpIHx8ICFkZWZpbmVkKFNUREMpCisgICAgc3RhdGljIGludCBzdGF0aWNfaW5pdF9kb25lID0gMDsKKyAgICBpbnQgbjsgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqLworICAgIGludCBiaXRzOyAgICAgLyogYml0IGNvdW50ZXIgKi8KKyAgICBpbnQgbGVuZ3RoOyAgIC8qIGxlbmd0aCB2YWx1ZSAqLworICAgIGludCBjb2RlOyAgICAgLyogY29kZSB2YWx1ZSAqLworICAgIGludCBkaXN0OyAgICAgLyogZGlzdGFuY2UgaW5kZXggKi8KKyAgICB1c2ggYmxfY291bnRbTUFYX0JJVFMrMV07CisgICAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovCisKKyAgICBpZiAoc3RhdGljX2luaXRfZG9uZSkgcmV0dXJuOworCisgICAgLyogRm9yIHNvbWUgZW1iZWRkZWQgdGFyZ2V0cywgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgbm90IGluaXRpYWxpemVkOiAqLworI2lmZGVmIE5PX0lOSVRfR0xPQkFMX1BPSU5URVJTCisgICAgc3RhdGljX2xfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19sdHJlZTsKKyAgICBzdGF0aWNfbF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9sYml0czsKKyAgICBzdGF0aWNfZF9kZXNjLnN0YXRpY190cmVlID0gc3RhdGljX2R0cmVlOworICAgIHN0YXRpY19kX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2RiaXRzOworICAgIHN0YXRpY19ibF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9ibGJpdHM7CisjZW5kaWYKKworICAgIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgbGVuZ3RoICgwLi4yNTUpIC0+IGxlbmd0aCBjb2RlICgwLi4yOCkgKi8KKyAgICBsZW5ndGggPSAwOworICAgIGZvciAoY29kZSA9IDA7IGNvZGUgPCBMRU5HVEhfQ09ERVMtMTsgY29kZSsrKSB7CisgICAgICAgIGJhc2VfbGVuZ3RoW2NvZGVdID0gbGVuZ3RoOworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgKDE8PGV4dHJhX2xiaXRzW2NvZGVdKTsgbisrKSB7CisgICAgICAgICAgICBfbGVuZ3RoX2NvZGVbbGVuZ3RoKytdID0gKHVjaCljb2RlOworICAgICAgICB9CisgICAgfQorICAgIEFzc2VydCAobGVuZ3RoID09IDI1NiwgInRyX3N0YXRpY19pbml0OiBsZW5ndGggIT0gMjU2Iik7CisgICAgLyogTm90ZSB0aGF0IHRoZSBsZW5ndGggMjU1IChtYXRjaCBsZW5ndGggMjU4KSBjYW4gYmUgcmVwcmVzZW50ZWQKKyAgICAgKiBpbiB0d28gZGlmZmVyZW50IHdheXM6IGNvZGUgMjg0ICsgNSBiaXRzIG9yIGNvZGUgMjg1LCBzbyB3ZQorICAgICAqIG92ZXJ3cml0ZSBsZW5ndGhfY29kZVsyNTVdIHRvIHVzZSB0aGUgYmVzdCBlbmNvZGluZzoKKyAgICAgKi8KKyAgICBfbGVuZ3RoX2NvZGVbbGVuZ3RoLTFdID0gKHVjaCljb2RlOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgbWFwcGluZyBkaXN0ICgwLi4zMkspIC0+IGRpc3QgY29kZSAoMC4uMjkpICovCisgICAgZGlzdCA9IDA7CisgICAgZm9yIChjb2RlID0gMCA7IGNvZGUgPCAxNjsgY29kZSsrKSB7CisgICAgICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3Q7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCAoMTw8ZXh0cmFfZGJpdHNbY29kZV0pOyBuKyspIHsKKyAgICAgICAgICAgIF9kaXN0X2NvZGVbZGlzdCsrXSA9ICh1Y2gpY29kZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBc3NlcnQgKGRpc3QgPT0gMjU2LCAidHJfc3RhdGljX2luaXQ6IGRpc3QgIT0gMjU2Iik7CisgICAgZGlzdCA+Pj0gNzsgLyogZnJvbSBub3cgb24sIGFsbCBkaXN0YW5jZXMgYXJlIGRpdmlkZWQgYnkgMTI4ICovCisgICAgZm9yICggOyBjb2RlIDwgRF9DT0RFUzsgY29kZSsrKSB7CisgICAgICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3QgPDwgNzsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8ICgxPDwoZXh0cmFfZGJpdHNbY29kZV0tNykpOyBuKyspIHsKKyAgICAgICAgICAgIF9kaXN0X2NvZGVbMjU2ICsgZGlzdCsrXSA9ICh1Y2gpY29kZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBc3NlcnQgKGRpc3QgPT0gMjU2LCAidHJfc3RhdGljX2luaXQ6IDI1NitkaXN0ICE9IDUxMiIpOworCisgICAgLyogQ29uc3RydWN0IHRoZSBjb2RlcyBvZiB0aGUgc3RhdGljIGxpdGVyYWwgdHJlZSAqLworICAgIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykgYmxfY291bnRbYml0c10gPSAwOworICAgIG4gPSAwOworICAgIHdoaWxlIChuIDw9IDE0Mykgc3RhdGljX2x0cmVlW24rK10uTGVuID0gOCwgYmxfY291bnRbOF0rKzsKKyAgICB3aGlsZSAobiA8PSAyNTUpIHN0YXRpY19sdHJlZVtuKytdLkxlbiA9IDksIGJsX2NvdW50WzldKys7CisgICAgd2hpbGUgKG4gPD0gMjc5KSBzdGF0aWNfbHRyZWVbbisrXS5MZW4gPSA3LCBibF9jb3VudFs3XSsrOworICAgIHdoaWxlIChuIDw9IDI4Nykgc3RhdGljX2x0cmVlW24rK10uTGVuID0gOCwgYmxfY291bnRbOF0rKzsKKyAgICAvKiBDb2RlcyAyODYgYW5kIDI4NyBkbyBub3QgZXhpc3QsIGJ1dCB3ZSBtdXN0IGluY2x1ZGUgdGhlbSBpbiB0aGUKKyAgICAgKiB0cmVlIGNvbnN0cnVjdGlvbiB0byBnZXQgYSBjYW5vbmljYWwgSHVmZm1hbiB0cmVlIChsb25nZXN0IGNvZGUKKyAgICAgKiBhbGwgb25lcykKKyAgICAgKi8KKyAgICBnZW5fY29kZXMoKGN0X2RhdGEgKilzdGF0aWNfbHRyZWUsIExfQ09ERVMrMSwgYmxfY291bnQpOworCisgICAgLyogVGhlIHN0YXRpYyBkaXN0YW5jZSB0cmVlIGlzIHRyaXZpYWw6ICovCisgICAgZm9yIChuID0gMDsgbiA8IERfQ09ERVM7IG4rKykgeworICAgICAgICBzdGF0aWNfZHRyZWVbbl0uTGVuID0gNTsKKyAgICAgICAgc3RhdGljX2R0cmVlW25dLkNvZGUgPSBiaV9yZXZlcnNlKCh1bnNpZ25lZCluLCA1KTsKKyAgICB9CisgICAgc3RhdGljX2luaXRfZG9uZSA9IDE7CisKKyMgIGlmZGVmIEdFTl9UUkVFU19ICisgICAgZ2VuX3RyZWVzX2hlYWRlcigpOworIyAgZW5kaWYKKyNlbmRpZiAvKiBkZWZpbmVkKEdFTl9UUkVFU19IKSB8fCAhZGVmaW5lZChTVERDKSAqLworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEdlbmVyZXJhdGUgdGhlIGZpbGUgdHJlZXMuaCBkZXNjcmliaW5nIHRoZSBzdGF0aWMgdHJlZXMuCisgKi8KKyNpZmRlZiBHRU5fVFJFRVNfSAorIyAgaWZuZGVmIERFQlVHCisjICAgIGluY2x1ZGUgPHN0ZGlvLmg+CisjICBlbmRpZgorCisjICBkZWZpbmUgU0VQQVJBVE9SKGksIGxhc3QsIHdpZHRoKSBcCisgICAgICAoKGkpID09IChsYXN0KT8gIlxufTtcblxuIiA6ICAgIFwKKyAgICAgICAoKGkpICUgKHdpZHRoKSA9PSAod2lkdGgpLTEgPyAiLFxuIiA6ICIsICIpKQorCit2b2lkIGdlbl90cmVlc19oZWFkZXIoKQoreworICAgIEZJTEUgKmhlYWRlciA9IGZvcGVuKCJ0cmVlcy5oIiwgInciKTsKKyAgICBpbnQgaTsKKworICAgIEFzc2VydCAoaGVhZGVyICE9IE5VTEwsICJDYW4ndCBvcGVuIHRyZWVzLmgiKTsKKyAgICBmcHJpbnRmKGhlYWRlciwKKyAgICAgICAgICAgICIvKiBoZWFkZXIgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IHdpdGggLURHRU5fVFJFRVNfSCAqL1xuXG4iKTsKKworICAgIGZwcmludGYoaGVhZGVyLCAibG9jYWwgY29uc3QgY3RfZGF0YSBzdGF0aWNfbHRyZWVbTF9DT0RFUysyXSA9IHtcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBMX0NPREVTKzI7IGkrKykgeworICAgICAgICBmcHJpbnRmKGhlYWRlciwgInt7JTN1fSx7JTN1fX0lcyIsIHN0YXRpY19sdHJlZVtpXS5Db2RlLAorICAgICAgICAgICAgICAgIHN0YXRpY19sdHJlZVtpXS5MZW4sIFNFUEFSQVRPUihpLCBMX0NPREVTKzEsIDUpKTsKKyAgICB9CisKKyAgICBmcHJpbnRmKGhlYWRlciwgImxvY2FsIGNvbnN0IGN0X2RhdGEgc3RhdGljX2R0cmVlW0RfQ09ERVNdID0ge1xuIik7CisgICAgZm9yIChpID0gMDsgaSA8IERfQ09ERVM7IGkrKykgeworICAgICAgICBmcHJpbnRmKGhlYWRlciwgInt7JTJ1fSx7JTJ1fX0lcyIsIHN0YXRpY19kdHJlZVtpXS5Db2RlLAorICAgICAgICAgICAgICAgIHN0YXRpY19kdHJlZVtpXS5MZW4sIFNFUEFSQVRPUihpLCBEX0NPREVTLTEsIDUpKTsKKyAgICB9CisKKyAgICBmcHJpbnRmKGhlYWRlciwgImNvbnN0IHVjaCBaTElCX0lOVEVSTkFMIF9kaXN0X2NvZGVbRElTVF9DT0RFX0xFTl0gPSB7XG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRElTVF9DT0RFX0xFTjsgaSsrKSB7CisgICAgICAgIGZwcmludGYoaGVhZGVyLCAiJTJ1JXMiLCBfZGlzdF9jb2RlW2ldLAorICAgICAgICAgICAgICAgIFNFUEFSQVRPUihpLCBESVNUX0NPREVfTEVOLTEsIDIwKSk7CisgICAgfQorCisgICAgZnByaW50ZihoZWFkZXIsCisgICAgICAgICJjb25zdCB1Y2ggWkxJQl9JTlRFUk5BTCBfbGVuZ3RoX2NvZGVbTUFYX01BVENILU1JTl9NQVRDSCsxXT0ge1xuIik7CisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9NQVRDSC1NSU5fTUFUQ0grMTsgaSsrKSB7CisgICAgICAgIGZwcmludGYoaGVhZGVyLCAiJTJ1JXMiLCBfbGVuZ3RoX2NvZGVbaV0sCisgICAgICAgICAgICAgICAgU0VQQVJBVE9SKGksIE1BWF9NQVRDSC1NSU5fTUFUQ0gsIDIwKSk7CisgICAgfQorCisgICAgZnByaW50ZihoZWFkZXIsICJsb2NhbCBjb25zdCBpbnQgYmFzZV9sZW5ndGhbTEVOR1RIX0NPREVTXSA9IHtcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBMRU5HVEhfQ09ERVM7IGkrKykgeworICAgICAgICBmcHJpbnRmKGhlYWRlciwgIiUxdSVzIiwgYmFzZV9sZW5ndGhbaV0sCisgICAgICAgICAgICAgICAgU0VQQVJBVE9SKGksIExFTkdUSF9DT0RFUy0xLCAyMCkpOworICAgIH0KKworICAgIGZwcmludGYoaGVhZGVyLCAibG9jYWwgY29uc3QgaW50IGJhc2VfZGlzdFtEX0NPREVTXSA9IHtcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBEX0NPREVTOyBpKyspIHsKKyAgICAgICAgZnByaW50ZihoZWFkZXIsICIlNXUlcyIsIGJhc2VfZGlzdFtpXSwKKyAgICAgICAgICAgICAgICBTRVBBUkFUT1IoaSwgRF9DT0RFUy0xLCAxMCkpOworICAgIH0KKworICAgIGZjbG9zZShoZWFkZXIpOworfQorI2VuZGlmIC8qIEdFTl9UUkVFU19IICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSB0aGUgdHJlZSBkYXRhIHN0cnVjdHVyZXMgZm9yIGEgbmV3IHpsaWIgc3RyZWFtLgorICovCit2b2lkIFpMSUJfSU5URVJOQUwgX3RyX2luaXQocykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworeworICAgIHRyX3N0YXRpY19pbml0KCk7CisKKyAgICBzLT5sX2Rlc2MuZHluX3RyZWUgPSBzLT5keW5fbHRyZWU7CisgICAgcy0+bF9kZXNjLnN0YXRfZGVzYyA9ICZzdGF0aWNfbF9kZXNjOworCisgICAgcy0+ZF9kZXNjLmR5bl90cmVlID0gcy0+ZHluX2R0cmVlOworICAgIHMtPmRfZGVzYy5zdGF0X2Rlc2MgPSAmc3RhdGljX2RfZGVzYzsKKworICAgIHMtPmJsX2Rlc2MuZHluX3RyZWUgPSBzLT5ibF90cmVlOworICAgIHMtPmJsX2Rlc2Muc3RhdF9kZXNjID0gJnN0YXRpY19ibF9kZXNjOworCisgICAgcy0+YmlfYnVmID0gMDsKKyAgICBzLT5iaV92YWxpZCA9IDA7CisjaWZkZWYgREVCVUcKKyAgICBzLT5jb21wcmVzc2VkX2xlbiA9IDBMOworICAgIHMtPmJpdHNfc2VudCA9IDBMOworI2VuZGlmCisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgZmlyc3QgZmlsZTogKi8KKyAgICBpbml0X2Jsb2NrKHMpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgYSBuZXcgYmxvY2suCisgKi8KK2xvY2FsIHZvaWQgaW5pdF9ibG9jayhzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgaW50IG47IC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqLworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgdHJlZXMuICovCisgICAgZm9yIChuID0gMDsgbiA8IExfQ09ERVM7ICBuKyspIHMtPmR5bl9sdHJlZVtuXS5GcmVxID0gMDsKKyAgICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgIG4rKykgcy0+ZHluX2R0cmVlW25dLkZyZXEgPSAwOworICAgIGZvciAobiA9IDA7IG4gPCBCTF9DT0RFUzsgbisrKSBzLT5ibF90cmVlW25dLkZyZXEgPSAwOworCisgICAgcy0+ZHluX2x0cmVlW0VORF9CTE9DS10uRnJlcSA9IDE7CisgICAgcy0+b3B0X2xlbiA9IHMtPnN0YXRpY19sZW4gPSAwTDsKKyAgICBzLT5sYXN0X2xpdCA9IHMtPm1hdGNoZXMgPSAwOworfQorCisjZGVmaW5lIFNNQUxMRVNUIDEKKy8qIEluZGV4IHdpdGhpbiB0aGUgaGVhcCBhcnJheSBvZiBsZWFzdCBmcmVxdWVudCBub2RlIGluIHRoZSBIdWZmbWFuIHRyZWUgKi8KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlbW92ZSB0aGUgc21hbGxlc3QgZWxlbWVudCBmcm9tIHRoZSBoZWFwIGFuZCByZWNyZWF0ZSB0aGUgaGVhcCB3aXRoCisgKiBvbmUgbGVzcyBlbGVtZW50LiBVcGRhdGVzIGhlYXAgYW5kIGhlYXBfbGVuLgorICovCisjZGVmaW5lIHBxcmVtb3ZlKHMsIHRyZWUsIHRvcCkgXAore1wKKyAgICB0b3AgPSBzLT5oZWFwW1NNQUxMRVNUXTsgXAorICAgIHMtPmhlYXBbU01BTExFU1RdID0gcy0+aGVhcFtzLT5oZWFwX2xlbi0tXTsgXAorICAgIHBxZG93bmhlYXAocywgdHJlZSwgU01BTExFU1QpOyBcCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29tcGFyZXMgdG8gc3VidHJlZXMsIHVzaW5nIHRoZSB0cmVlIGRlcHRoIGFzIHRpZSBicmVha2VyIHdoZW4KKyAqIHRoZSBzdWJ0cmVlcyBoYXZlIGVxdWFsIGZyZXF1ZW5jeS4gVGhpcyBtaW5pbWl6ZXMgdGhlIHdvcnN0IGNhc2UgbGVuZ3RoLgorICovCisjZGVmaW5lIHNtYWxsZXIodHJlZSwgbiwgbSwgZGVwdGgpIFwKKyAgICh0cmVlW25dLkZyZXEgPCB0cmVlW21dLkZyZXEgfHwgXAorICAgKHRyZWVbbl0uRnJlcSA9PSB0cmVlW21dLkZyZXEgJiYgZGVwdGhbbl0gPD0gZGVwdGhbbV0pKQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlc3RvcmUgdGhlIGhlYXAgcHJvcGVydHkgYnkgbW92aW5nIGRvd24gdGhlIHRyZWUgc3RhcnRpbmcgYXQgbm9kZSBrLAorICogZXhjaGFuZ2luZyBhIG5vZGUgd2l0aCB0aGUgc21hbGxlc3Qgb2YgaXRzIHR3byBzb25zIGlmIG5lY2Vzc2FyeSwgc3RvcHBpbmcKKyAqIHdoZW4gdGhlIGhlYXAgcHJvcGVydHkgaXMgcmUtZXN0YWJsaXNoZWQgKGVhY2ggZmF0aGVyIHNtYWxsZXIgdGhhbiBpdHMKKyAqIHR3byBzb25zKS4KKyAqLworbG9jYWwgdm9pZCBwcWRvd25oZWFwKHMsIHRyZWUsIGspCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBjdF9kYXRhICp0cmVlOyAgLyogdGhlIHRyZWUgdG8gcmVzdG9yZSAqLworICAgIGludCBrOyAgICAgICAgICAgICAgIC8qIG5vZGUgdG8gbW92ZSBkb3duICovCit7CisgICAgaW50IHYgPSBzLT5oZWFwW2tdOworICAgIGludCBqID0gayA8PCAxOyAgLyogbGVmdCBzb24gb2YgayAqLworICAgIHdoaWxlIChqIDw9IHMtPmhlYXBfbGVuKSB7CisgICAgICAgIC8qIFNldCBqIHRvIHRoZSBzbWFsbGVzdCBvZiB0aGUgdHdvIHNvbnM6ICovCisgICAgICAgIGlmIChqIDwgcy0+aGVhcF9sZW4gJiYKKyAgICAgICAgICAgIHNtYWxsZXIodHJlZSwgcy0+aGVhcFtqKzFdLCBzLT5oZWFwW2pdLCBzLT5kZXB0aCkpIHsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgICAgICAvKiBFeGl0IGlmIHYgaXMgc21hbGxlciB0aGFuIGJvdGggc29ucyAqLworICAgICAgICBpZiAoc21hbGxlcih0cmVlLCB2LCBzLT5oZWFwW2pdLCBzLT5kZXB0aCkpIGJyZWFrOworCisgICAgICAgIC8qIEV4Y2hhbmdlIHYgd2l0aCB0aGUgc21hbGxlc3Qgc29uICovCisgICAgICAgIHMtPmhlYXBba10gPSBzLT5oZWFwW2pdOyAgayA9IGo7CisKKyAgICAgICAgLyogQW5kIGNvbnRpbnVlIGRvd24gdGhlIHRyZWUsIHNldHRpbmcgaiB0byB0aGUgbGVmdCBzb24gb2YgayAqLworICAgICAgICBqIDw8PSAxOworICAgIH0KKyAgICBzLT5oZWFwW2tdID0gdjsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzIGZvciBhIHRyZWUgYW5kIHVwZGF0ZSB0aGUgdG90YWwgYml0IGxlbmd0aAorICogZm9yIHRoZSBjdXJyZW50IGJsb2NrLgorICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIGZyZXEgYW5kIGRhZCBhcmUgc2V0LCBoZWFwW2hlYXBfbWF4XSBhbmQKKyAqICAgIGFib3ZlIGFyZSB0aGUgdHJlZSBub2RlcyBzb3J0ZWQgYnkgaW5jcmVhc2luZyBmcmVxdWVuY3kuCisgKiBPVVQgYXNzZXJ0aW9uczogdGhlIGZpZWxkIGxlbiBpcyBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aCwgdGhlCisgKiAgICAgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGZyZXF1ZW5jaWVzIGZvciBlYWNoIGJpdCBsZW5ndGguCisgKiAgICAgVGhlIGxlbmd0aCBvcHRfbGVuIGlzIHVwZGF0ZWQ7IHN0YXRpY19sZW4gaXMgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzCisgKiAgICAgbm90IG51bGwuCisgKi8KK2xvY2FsIHZvaWQgZ2VuX2JpdGxlbihzLCBkZXNjKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgdHJlZV9kZXNjICpkZXNjOyAgICAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovCit7CisgICAgY3RfZGF0YSAqdHJlZSAgICAgICAgPSBkZXNjLT5keW5fdHJlZTsKKyAgICBpbnQgbWF4X2NvZGUgICAgICAgICA9IGRlc2MtPm1heF9jb2RlOworICAgIGNvbnN0IGN0X2RhdGEgKnN0cmVlID0gZGVzYy0+c3RhdF9kZXNjLT5zdGF0aWNfdHJlZTsKKyAgICBjb25zdCBpbnRmICpleHRyYSAgICA9IGRlc2MtPnN0YXRfZGVzYy0+ZXh0cmFfYml0czsKKyAgICBpbnQgYmFzZSAgICAgICAgICAgICA9IGRlc2MtPnN0YXRfZGVzYy0+ZXh0cmFfYmFzZTsKKyAgICBpbnQgbWF4X2xlbmd0aCAgICAgICA9IGRlc2MtPnN0YXRfZGVzYy0+bWF4X2xlbmd0aDsKKyAgICBpbnQgaDsgICAgICAgICAgICAgIC8qIGhlYXAgaW5kZXggKi8KKyAgICBpbnQgbiwgbTsgICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciB0aGUgdHJlZSBlbGVtZW50cyAqLworICAgIGludCBiaXRzOyAgICAgICAgICAgLyogYml0IGxlbmd0aCAqLworICAgIGludCB4Yml0czsgICAgICAgICAgLyogZXh0cmEgYml0cyAqLworICAgIHVzaCBmOyAgICAgICAgICAgICAgLyogZnJlcXVlbmN5ICovCisgICAgaW50IG92ZXJmbG93ID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBiaXQgbGVuZ3RoIHRvbyBsYXJnZSAqLworCisgICAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSBzLT5ibF9jb3VudFtiaXRzXSA9IDA7CisKKyAgICAvKiBJbiBhIGZpcnN0IHBhc3MsIGNvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgKHdoaWNoIG1heQorICAgICAqIG92ZXJmbG93IGluIHRoZSBjYXNlIG9mIHRoZSBiaXQgbGVuZ3RoIHRyZWUpLgorICAgICAqLworICAgIHRyZWVbcy0+aGVhcFtzLT5oZWFwX21heF1dLkxlbiA9IDA7IC8qIHJvb3Qgb2YgdGhlIGhlYXAgKi8KKworICAgIGZvciAoaCA9IHMtPmhlYXBfbWF4KzE7IGggPCBIRUFQX1NJWkU7IGgrKykgeworICAgICAgICBuID0gcy0+aGVhcFtoXTsKKyAgICAgICAgYml0cyA9IHRyZWVbdHJlZVtuXS5EYWRdLkxlbiArIDE7CisgICAgICAgIGlmIChiaXRzID4gbWF4X2xlbmd0aCkgYml0cyA9IG1heF9sZW5ndGgsIG92ZXJmbG93Kys7CisgICAgICAgIHRyZWVbbl0uTGVuID0gKHVzaCliaXRzOworICAgICAgICAvKiBXZSBvdmVyd3JpdGUgdHJlZVtuXS5EYWQgd2hpY2ggaXMgbm8gbG9uZ2VyIG5lZWRlZCAqLworCisgICAgICAgIGlmIChuID4gbWF4X2NvZGUpIGNvbnRpbnVlOyAvKiBub3QgYSBsZWFmIG5vZGUgKi8KKworICAgICAgICBzLT5ibF9jb3VudFtiaXRzXSsrOworICAgICAgICB4Yml0cyA9IDA7CisgICAgICAgIGlmIChuID49IGJhc2UpIHhiaXRzID0gZXh0cmFbbi1iYXNlXTsKKyAgICAgICAgZiA9IHRyZWVbbl0uRnJlcTsKKyAgICAgICAgcy0+b3B0X2xlbiArPSAodWxnKWYgKiAoYml0cyArIHhiaXRzKTsKKyAgICAgICAgaWYgKHN0cmVlKSBzLT5zdGF0aWNfbGVuICs9ICh1bGcpZiAqIChzdHJlZVtuXS5MZW4gKyB4Yml0cyk7CisgICAgfQorICAgIGlmIChvdmVyZmxvdyA9PSAwKSByZXR1cm47CisKKyAgICBUcmFjZSgoc3RkZXJyLCJcbmJpdCBsZW5ndGggb3ZlcmZsb3dcbiIpKTsKKyAgICAvKiBUaGlzIGhhcHBlbnMgZm9yIGV4YW1wbGUgb24gb2JqMiBhbmQgcGljIG9mIHRoZSBDYWxnYXJ5IGNvcnB1cyAqLworCisgICAgLyogRmluZCB0aGUgZmlyc3QgYml0IGxlbmd0aCB3aGljaCBjb3VsZCBpbmNyZWFzZTogKi8KKyAgICBkbyB7CisgICAgICAgIGJpdHMgPSBtYXhfbGVuZ3RoLTE7CisgICAgICAgIHdoaWxlIChzLT5ibF9jb3VudFtiaXRzXSA9PSAwKSBiaXRzLS07CisgICAgICAgIHMtPmJsX2NvdW50W2JpdHNdLS07ICAgICAgLyogbW92ZSBvbmUgbGVhZiBkb3duIHRoZSB0cmVlICovCisgICAgICAgIHMtPmJsX2NvdW50W2JpdHMrMV0gKz0gMjsgLyogbW92ZSBvbmUgb3ZlcmZsb3cgaXRlbSBhcyBpdHMgYnJvdGhlciAqLworICAgICAgICBzLT5ibF9jb3VudFttYXhfbGVuZ3RoXS0tOworICAgICAgICAvKiBUaGUgYnJvdGhlciBvZiB0aGUgb3ZlcmZsb3cgaXRlbSBhbHNvIG1vdmVzIG9uZSBzdGVwIHVwLAorICAgICAgICAgKiBidXQgdGhpcyBkb2VzIG5vdCBhZmZlY3QgYmxfY291bnRbbWF4X2xlbmd0aF0KKyAgICAgICAgICovCisgICAgICAgIG92ZXJmbG93IC09IDI7CisgICAgfSB3aGlsZSAob3ZlcmZsb3cgPiAwKTsKKworICAgIC8qIE5vdyByZWNvbXB1dGUgYWxsIGJpdCBsZW5ndGhzLCBzY2FubmluZyBpbiBpbmNyZWFzaW5nIGZyZXF1ZW5jeS4KKyAgICAgKiBoIGlzIHN0aWxsIGVxdWFsIHRvIEhFQVBfU0laRS4gKEl0IGlzIHNpbXBsZXIgdG8gcmVjb25zdHJ1Y3QgYWxsCisgICAgICogbGVuZ3RocyBpbnN0ZWFkIG9mIGZpeGluZyBvbmx5IHRoZSB3cm9uZyBvbmVzLiBUaGlzIGlkZWEgaXMgdGFrZW4KKyAgICAgKiBmcm9tICdhcicgd3JpdHRlbiBieSBIYXJ1aGlrbyBPa3VtdXJhLikKKyAgICAgKi8KKyAgICBmb3IgKGJpdHMgPSBtYXhfbGVuZ3RoOyBiaXRzICE9IDA7IGJpdHMtLSkgeworICAgICAgICBuID0gcy0+YmxfY291bnRbYml0c107CisgICAgICAgIHdoaWxlIChuICE9IDApIHsKKyAgICAgICAgICAgIG0gPSBzLT5oZWFwWy0taF07CisgICAgICAgICAgICBpZiAobSA+IG1heF9jb2RlKSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICgodW5zaWduZWQpIHRyZWVbbV0uTGVuICE9ICh1bnNpZ25lZCkgYml0cykgeworICAgICAgICAgICAgICAgIFRyYWNlKChzdGRlcnIsImNvZGUgJWQgYml0cyAlZC0+JWRcbiIsIG0sIHRyZWVbbV0uTGVuLCBiaXRzKSk7CisgICAgICAgICAgICAgICAgcy0+b3B0X2xlbiArPSAoKGxvbmcpYml0cyAtIChsb25nKXRyZWVbbV0uTGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsb25nKXRyZWVbbV0uRnJlcTsKKyAgICAgICAgICAgICAgICB0cmVlW21dLkxlbiA9ICh1c2gpYml0czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG4tLTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBHZW5lcmF0ZSB0aGUgY29kZXMgZm9yIGEgZ2l2ZW4gdHJlZSBhbmQgYml0IGNvdW50cyAod2hpY2ggbmVlZCBub3QgYmUKKyAqIG9wdGltYWwpLgorICogSU4gYXNzZXJ0aW9uOiB0aGUgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGJpdCBsZW5ndGggc3RhdGlzdGljcyBmb3IKKyAqIHRoZSBnaXZlbiB0cmVlIGFuZCB0aGUgZmllbGQgbGVuIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuCisgKiBPVVQgYXNzZXJ0aW9uOiB0aGUgZmllbGQgY29kZSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzIG9mIG5vbgorICogICAgIHplcm8gY29kZSBsZW5ndGguCisgKi8KK2xvY2FsIHZvaWQgZ2VuX2NvZGVzICh0cmVlLCBtYXhfY29kZSwgYmxfY291bnQpCisgICAgY3RfZGF0YSAqdHJlZTsgICAgICAgICAgICAgLyogdGhlIHRyZWUgdG8gZGVjb3JhdGUgKi8KKyAgICBpbnQgbWF4X2NvZGU7ICAgICAgICAgICAgICAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi8KKyAgICB1c2hmICpibF9jb3VudDsgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoICovCit7CisgICAgdXNoIG5leHRfY29kZVtNQVhfQklUUysxXTsgLyogbmV4dCBjb2RlIHZhbHVlIGZvciBlYWNoIGJpdCBsZW5ndGggKi8KKyAgICB1c2ggY29kZSA9IDA7ICAgICAgICAgICAgICAvKiBydW5uaW5nIGNvZGUgdmFsdWUgKi8KKyAgICBpbnQgYml0czsgICAgICAgICAgICAgICAgICAvKiBiaXQgaW5kZXggKi8KKyAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIGluZGV4ICovCisKKyAgICAvKiBUaGUgZGlzdHJpYnV0aW9uIGNvdW50cyBhcmUgZmlyc3QgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY29kZSB2YWx1ZXMKKyAgICAgKiB3aXRob3V0IGJpdCByZXZlcnNhbC4KKyAgICAgKi8KKyAgICBmb3IgKGJpdHMgPSAxOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHsKKyAgICAgICAgbmV4dF9jb2RlW2JpdHNdID0gY29kZSA9IChjb2RlICsgYmxfY291bnRbYml0cy0xXSkgPDwgMTsKKyAgICB9CisgICAgLyogQ2hlY2sgdGhhdCB0aGUgYml0IGNvdW50cyBpbiBibF9jb3VudCBhcmUgY29uc2lzdGVudC4gVGhlIGxhc3QgY29kZQorICAgICAqIG11c3QgYmUgYWxsIG9uZXMuCisgICAgICovCisgICAgQXNzZXJ0IChjb2RlICsgYmxfY291bnRbTUFYX0JJVFNdLTEgPT0gKDE8PE1BWF9CSVRTKS0xLAorICAgICAgICAgICAgImluY29uc2lzdGVudCBiaXQgY291bnRzIik7CisgICAgVHJhY2V2KChzdGRlcnIsIlxuZ2VuX2NvZGVzOiBtYXhfY29kZSAlZCAiLCBtYXhfY29kZSkpOworCisgICAgZm9yIChuID0gMDsgIG4gPD0gbWF4X2NvZGU7IG4rKykgeworICAgICAgICBpbnQgbGVuID0gdHJlZVtuXS5MZW47CisgICAgICAgIGlmIChsZW4gPT0gMCkgY29udGludWU7CisgICAgICAgIC8qIE5vdyByZXZlcnNlIHRoZSBiaXRzICovCisgICAgICAgIHRyZWVbbl0uQ29kZSA9IGJpX3JldmVyc2UobmV4dF9jb2RlW2xlbl0rKywgbGVuKTsKKworICAgICAgICBUcmFjZWN2KHRyZWUgIT0gc3RhdGljX2x0cmVlLCAoc3RkZXJyLCJcbm4gJTNkICVjIGwgJTJkIGMgJTR4ICgleCkgIiwKKyAgICAgICAgICAgICBuLCAoaXNncmFwaChuKSA/IG4gOiAnICcpLCBsZW4sIHRyZWVbbl0uQ29kZSwgbmV4dF9jb2RlW2xlbl0tMSkpOworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb25zdHJ1Y3Qgb25lIEh1ZmZtYW4gdHJlZSBhbmQgYXNzaWducyB0aGUgY29kZSBiaXQgc3RyaW5ncyBhbmQgbGVuZ3Rocy4KKyAqIFVwZGF0ZSB0aGUgdG90YWwgYml0IGxlbmd0aCBmb3IgdGhlIGN1cnJlbnQgYmxvY2suCisgKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZCBmcmVxIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuCisgKiBPVVQgYXNzZXJ0aW9uczogdGhlIGZpZWxkcyBsZW4gYW5kIGNvZGUgYXJlIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoCisgKiAgICAgYW5kIGNvcnJlc3BvbmRpbmcgY29kZS4gVGhlIGxlbmd0aCBvcHRfbGVuIGlzIHVwZGF0ZWQ7IHN0YXRpY19sZW4gaXMKKyAqICAgICBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXMgbm90IG51bGwuIFRoZSBmaWVsZCBtYXhfY29kZSBpcyBzZXQuCisgKi8KK2xvY2FsIHZvaWQgYnVpbGRfdHJlZShzLCBkZXNjKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgdHJlZV9kZXNjICpkZXNjOyAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovCit7CisgICAgY3RfZGF0YSAqdHJlZSAgICAgICAgID0gZGVzYy0+ZHluX3RyZWU7CisgICAgY29uc3QgY3RfZGF0YSAqc3RyZWUgID0gZGVzYy0+c3RhdF9kZXNjLT5zdGF0aWNfdHJlZTsKKyAgICBpbnQgZWxlbXMgICAgICAgICAgICAgPSBkZXNjLT5zdGF0X2Rlc2MtPmVsZW1zOworICAgIGludCBuLCBtOyAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgaGVhcCBlbGVtZW50cyAqLworICAgIGludCBtYXhfY29kZSA9IC0xOyAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi8KKyAgICBpbnQgbm9kZTsgICAgICAgICAgLyogbmV3IG5vZGUgYmVpbmcgY3JlYXRlZCAqLworCisgICAgLyogQ29uc3RydWN0IHRoZSBpbml0aWFsIGhlYXAsIHdpdGggbGVhc3QgZnJlcXVlbnQgZWxlbWVudCBpbgorICAgICAqIGhlYXBbU01BTExFU1RdLiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLgorICAgICAqIGhlYXBbMF0gaXMgbm90IHVzZWQuCisgICAgICovCisgICAgcy0+aGVhcF9sZW4gPSAwLCBzLT5oZWFwX21heCA9IEhFQVBfU0laRTsKKworICAgIGZvciAobiA9IDA7IG4gPCBlbGVtczsgbisrKSB7CisgICAgICAgIGlmICh0cmVlW25dLkZyZXEgIT0gMCkgeworICAgICAgICAgICAgcy0+aGVhcFsrKyhzLT5oZWFwX2xlbildID0gbWF4X2NvZGUgPSBuOworICAgICAgICAgICAgcy0+ZGVwdGhbbl0gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJlZVtuXS5MZW4gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVGhlIHBremlwIGZvcm1hdCByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IG9uZSBkaXN0YW5jZSBjb2RlIGV4aXN0cywKKyAgICAgKiBhbmQgdGhhdCBhdCBsZWFzdCBvbmUgYml0IHNob3VsZCBiZSBzZW50IGV2ZW4gaWYgdGhlcmUgaXMgb25seSBvbmUKKyAgICAgKiBwb3NzaWJsZSBjb2RlLiBTbyB0byBhdm9pZCBzcGVjaWFsIGNoZWNrcyBsYXRlciBvbiB3ZSBmb3JjZSBhdCBsZWFzdAorICAgICAqIHR3byBjb2RlcyBvZiBub24gemVybyBmcmVxdWVuY3kuCisgICAgICovCisgICAgd2hpbGUgKHMtPmhlYXBfbGVuIDwgMikgeworICAgICAgICBub2RlID0gcy0+aGVhcFsrKyhzLT5oZWFwX2xlbildID0gKG1heF9jb2RlIDwgMiA/ICsrbWF4X2NvZGUgOiAwKTsKKyAgICAgICAgdHJlZVtub2RlXS5GcmVxID0gMTsKKyAgICAgICAgcy0+ZGVwdGhbbm9kZV0gPSAwOworICAgICAgICBzLT5vcHRfbGVuLS07IGlmIChzdHJlZSkgcy0+c3RhdGljX2xlbiAtPSBzdHJlZVtub2RlXS5MZW47CisgICAgICAgIC8qIG5vZGUgaXMgMCBvciAxIHNvIGl0IGRvZXMgbm90IGhhdmUgZXh0cmEgYml0cyAqLworICAgIH0KKyAgICBkZXNjLT5tYXhfY29kZSA9IG1heF9jb2RlOworCisgICAgLyogVGhlIGVsZW1lbnRzIGhlYXBbaGVhcF9sZW4vMisxIC4uIGhlYXBfbGVuXSBhcmUgbGVhdmVzIG9mIHRoZSB0cmVlLAorICAgICAqIGVzdGFibGlzaCBzdWItaGVhcHMgb2YgaW5jcmVhc2luZyBsZW5ndGhzOgorICAgICAqLworICAgIGZvciAobiA9IHMtPmhlYXBfbGVuLzI7IG4gPj0gMTsgbi0tKSBwcWRvd25oZWFwKHMsIHRyZWUsIG4pOworCisgICAgLyogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgYnkgcmVwZWF0ZWRseSBjb21iaW5pbmcgdGhlIGxlYXN0IHR3bworICAgICAqIGZyZXF1ZW50IG5vZGVzLgorICAgICAqLworICAgIG5vZGUgPSBlbGVtczsgICAgICAgICAgICAgIC8qIG5leHQgaW50ZXJuYWwgbm9kZSBvZiB0aGUgdHJlZSAqLworICAgIGRvIHsKKyAgICAgICAgcHFyZW1vdmUocywgdHJlZSwgbik7ICAvKiBuID0gbm9kZSBvZiBsZWFzdCBmcmVxdWVuY3kgKi8KKyAgICAgICAgbSA9IHMtPmhlYXBbU01BTExFU1RdOyAvKiBtID0gbm9kZSBvZiBuZXh0IGxlYXN0IGZyZXF1ZW5jeSAqLworCisgICAgICAgIHMtPmhlYXBbLS0ocy0+aGVhcF9tYXgpXSA9IG47IC8qIGtlZXAgdGhlIG5vZGVzIHNvcnRlZCBieSBmcmVxdWVuY3kgKi8KKyAgICAgICAgcy0+aGVhcFstLShzLT5oZWFwX21heCldID0gbTsKKworICAgICAgICAvKiBDcmVhdGUgYSBuZXcgbm9kZSBmYXRoZXIgb2YgbiBhbmQgbSAqLworICAgICAgICB0cmVlW25vZGVdLkZyZXEgPSB0cmVlW25dLkZyZXEgKyB0cmVlW21dLkZyZXE7CisgICAgICAgIHMtPmRlcHRoW25vZGVdID0gKHVjaCkoKHMtPmRlcHRoW25dID49IHMtPmRlcHRoW21dID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGVwdGhbbl0gOiBzLT5kZXB0aFttXSkgKyAxKTsKKyAgICAgICAgdHJlZVtuXS5EYWQgPSB0cmVlW21dLkRhZCA9ICh1c2gpbm9kZTsKKyNpZmRlZiBEVU1QX0JMX1RSRUUKKyAgICAgICAgaWYgKHRyZWUgPT0gcy0+YmxfdHJlZSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIlxubm9kZSAlZCglZCksIHNvbnMgJWQoJWQpICVkKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIG5vZGUsIHRyZWVbbm9kZV0uRnJlcSwgbiwgdHJlZVtuXS5GcmVxLCBtLCB0cmVlW21dLkZyZXEpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgLyogYW5kIGluc2VydCB0aGUgbmV3IG5vZGUgaW4gdGhlIGhlYXAgKi8KKyAgICAgICAgcy0+aGVhcFtTTUFMTEVTVF0gPSBub2RlKys7CisgICAgICAgIHBxZG93bmhlYXAocywgdHJlZSwgU01BTExFU1QpOworCisgICAgfSB3aGlsZSAocy0+aGVhcF9sZW4gPj0gMik7CisKKyAgICBzLT5oZWFwWy0tKHMtPmhlYXBfbWF4KV0gPSBzLT5oZWFwW1NNQUxMRVNUXTsKKworICAgIC8qIEF0IHRoaXMgcG9pbnQsIHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQuIFdlIGNhbiBub3cKKyAgICAgKiBnZW5lcmF0ZSB0aGUgYml0IGxlbmd0aHMuCisgICAgICovCisgICAgZ2VuX2JpdGxlbihzLCAodHJlZV9kZXNjICopZGVzYyk7CisKKyAgICAvKiBUaGUgZmllbGQgbGVuIGlzIG5vdyBzZXQsIHdlIGNhbiBnZW5lcmF0ZSB0aGUgYml0IGNvZGVzICovCisgICAgZ2VuX2NvZGVzICgoY3RfZGF0YSAqKXRyZWUsIG1heF9jb2RlLCBzLT5ibF9jb3VudCk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2NhbiBhIGxpdGVyYWwgb3IgZGlzdGFuY2UgdHJlZSB0byBkZXRlcm1pbmUgdGhlIGZyZXF1ZW5jaWVzIG9mIHRoZSBjb2RlcworICogaW4gdGhlIGJpdCBsZW5ndGggdHJlZS4KKyAqLworbG9jYWwgdm9pZCBzY2FuX3RyZWUgKHMsIHRyZWUsIG1heF9jb2RlKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgY3RfZGF0YSAqdHJlZTsgICAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovCisgICAgaW50IG1heF9jb2RlOyAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi8KK3sKKyAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovCisgICAgaW50IHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqLworICAgIGludCBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi8KKyAgICBpbnQgbmV4dGxlbiA9IHRyZWVbMF0uTGVuOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovCisgICAgaW50IGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi8KKyAgICBpbnQgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovCisgICAgaW50IG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqLworCisgICAgaWYgKG5leHRsZW4gPT0gMCkgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOworICAgIHRyZWVbbWF4X2NvZGUrMV0uTGVuID0gKHVzaCkweGZmZmY7IC8qIGd1YXJkICovCisKKyAgICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHsKKyAgICAgICAgY3VybGVuID0gbmV4dGxlbjsgbmV4dGxlbiA9IHRyZWVbbisxXS5MZW47CisgICAgICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PSBuZXh0bGVuKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkgeworICAgICAgICAgICAgcy0+YmxfdHJlZVtjdXJsZW5dLkZyZXEgKz0gY291bnQ7CisgICAgICAgIH0gZWxzZSBpZiAoY3VybGVuICE9IDApIHsKKyAgICAgICAgICAgIGlmIChjdXJsZW4gIT0gcHJldmxlbikgcy0+YmxfdHJlZVtjdXJsZW5dLkZyZXErKzsKKyAgICAgICAgICAgIHMtPmJsX3RyZWVbUkVQXzNfNl0uRnJlcSsrOworICAgICAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7CisgICAgICAgICAgICBzLT5ibF90cmVlW1JFUFpfM18xMF0uRnJlcSsrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy0+YmxfdHJlZVtSRVBaXzExXzEzOF0uRnJlcSsrOworICAgICAgICB9CisgICAgICAgIGNvdW50ID0gMDsgcHJldmxlbiA9IGN1cmxlbjsKKyAgICAgICAgaWYgKG5leHRsZW4gPT0gMCkgeworICAgICAgICAgICAgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOworICAgICAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PSBuZXh0bGVuKSB7CisgICAgICAgICAgICBtYXhfY291bnQgPSA2LCBtaW5fY291bnQgPSAzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWF4X2NvdW50ID0gNywgbWluX2NvdW50ID0gNDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIGluIGNvbXByZXNzZWQgZm9ybSwgdXNpbmcgdGhlIGNvZGVzIGluCisgKiBibF90cmVlLgorICovCitsb2NhbCB2b2lkIHNlbmRfdHJlZSAocywgdHJlZSwgbWF4X2NvZGUpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBjdF9kYXRhICp0cmVlOyAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovCisgICAgaW50IG1heF9jb2RlOyAgICAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi8KK3sKKyAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovCisgICAgaW50IHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqLworICAgIGludCBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi8KKyAgICBpbnQgbmV4dGxlbiA9IHRyZWVbMF0uTGVuOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovCisgICAgaW50IGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi8KKyAgICBpbnQgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovCisgICAgaW50IG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqLworCisgICAgLyogdHJlZVttYXhfY29kZSsxXS5MZW4gPSAtMTsgKi8gIC8qIGd1YXJkIGFscmVhZHkgc2V0ICovCisgICAgaWYgKG5leHRsZW4gPT0gMCkgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOworCisgICAgZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7CisgICAgICAgIGN1cmxlbiA9IG5leHRsZW47IG5leHRsZW4gPSB0cmVlW24rMV0uTGVuOworICAgICAgICBpZiAoKytjb3VudCA8IG1heF9jb3VudCAmJiBjdXJsZW4gPT0gbmV4dGxlbikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHsKKyAgICAgICAgICAgIGRvIHsgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy0+YmxfdHJlZSk7IH0gd2hpbGUgKC0tY291bnQgIT0gMCk7CisKKyAgICAgICAgfSBlbHNlIGlmIChjdXJsZW4gIT0gMCkgeworICAgICAgICAgICAgaWYgKGN1cmxlbiAhPSBwcmV2bGVuKSB7CisgICAgICAgICAgICAgICAgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy0+YmxfdHJlZSk7IGNvdW50LS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBc3NlcnQoY291bnQgPj0gMyAmJiBjb3VudCA8PSA2LCAiIDNfNj8iKTsKKyAgICAgICAgICAgIHNlbmRfY29kZShzLCBSRVBfM182LCBzLT5ibF90cmVlKTsgc2VuZF9iaXRzKHMsIGNvdW50LTMsIDIpOworCisgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHsKKyAgICAgICAgICAgIHNlbmRfY29kZShzLCBSRVBaXzNfMTAsIHMtPmJsX3RyZWUpOyBzZW5kX2JpdHMocywgY291bnQtMywgMyk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbmRfY29kZShzLCBSRVBaXzExXzEzOCwgcy0+YmxfdHJlZSk7IHNlbmRfYml0cyhzLCBjb3VudC0xMSwgNyk7CisgICAgICAgIH0KKyAgICAgICAgY291bnQgPSAwOyBwcmV2bGVuID0gY3VybGVuOworICAgICAgICBpZiAobmV4dGxlbiA9PSAwKSB7CisgICAgICAgICAgICBtYXhfY291bnQgPSAxMzgsIG1pbl9jb3VudCA9IDM7CisgICAgICAgIH0gZWxzZSBpZiAoY3VybGVuID09IG5leHRsZW4pIHsKKyAgICAgICAgICAgIG1heF9jb3VudCA9IDYsIG1pbl9jb3VudCA9IDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYXhfY291bnQgPSA3LCBtaW5fY291bnQgPSA0OworICAgICAgICB9CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGZvciB0aGUgYml0IGxlbmd0aHMgYW5kIHJldHVybiB0aGUgaW5kZXggaW4KKyAqIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLgorICovCitsb2NhbCBpbnQgYnVpbGRfYmxfdHJlZShzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgaW50IG1heF9ibGluZGV4OyAgLyogaW5kZXggb2YgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgb2Ygbm9uIHplcm8gZnJlcSAqLworCisgICAgLyogRGV0ZXJtaW5lIHRoZSBiaXQgbGVuZ3RoIGZyZXF1ZW5jaWVzIGZvciBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqLworICAgIHNjYW5fdHJlZShzLCAoY3RfZGF0YSAqKXMtPmR5bl9sdHJlZSwgcy0+bF9kZXNjLm1heF9jb2RlKTsKKyAgICBzY2FuX3RyZWUocywgKGN0X2RhdGEgKilzLT5keW5fZHRyZWUsIHMtPmRfZGVzYy5tYXhfY29kZSk7CisKKyAgICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlOiAqLworICAgIGJ1aWxkX3RyZWUocywgKHRyZWVfZGVzYyAqKSgmKHMtPmJsX2Rlc2MpKSk7CisgICAgLyogb3B0X2xlbiBub3cgaW5jbHVkZXMgdGhlIGxlbmd0aCBvZiB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMsIGV4Y2VwdAorICAgICAqIHRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RocyBjb2RlcyBhbmQgdGhlIDUrNSs0IGJpdHMgZm9yIHRoZSBjb3VudHMuCisgICAgICovCisKKyAgICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBiaXQgbGVuZ3RoIGNvZGVzIHRvIHNlbmQuIFRoZSBwa3ppcCBmb3JtYXQKKyAgICAgKiByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IDQgYml0IGxlbmd0aCBjb2RlcyBiZSBzZW50LiAoYXBwbm90ZS50eHQgc2F5cworICAgICAqIDMgYnV0IHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBpcyA0LikKKyAgICAgKi8KKyAgICBmb3IgKG1heF9ibGluZGV4ID0gQkxfQ09ERVMtMTsgbWF4X2JsaW5kZXggPj0gMzsgbWF4X2JsaW5kZXgtLSkgeworICAgICAgICBpZiAocy0+YmxfdHJlZVtibF9vcmRlclttYXhfYmxpbmRleF1dLkxlbiAhPSAwKSBicmVhazsKKyAgICB9CisgICAgLyogVXBkYXRlIG9wdF9sZW4gdG8gaW5jbHVkZSB0aGUgYml0IGxlbmd0aCB0cmVlIGFuZCBjb3VudHMgKi8KKyAgICBzLT5vcHRfbGVuICs9IDMqKG1heF9ibGluZGV4KzEpICsgNSs1KzQ7CisgICAgVHJhY2V2KChzdGRlcnIsICJcbmR5biB0cmVlczogZHluICVsZCwgc3RhdCAlbGQiLAorICAgICAgICAgICAgcy0+b3B0X2xlbiwgcy0+c3RhdGljX2xlbikpOworCisgICAgcmV0dXJuIG1heF9ibGluZGV4OworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgdGhlIGhlYWRlciBmb3IgYSBibG9jayB1c2luZyBkeW5hbWljIEh1ZmZtYW4gdHJlZXM6IHRoZSBjb3VudHMsIHRoZQorICogbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcywgdGhlIGxpdGVyYWwgdHJlZSBhbmQgdGhlIGRpc3RhbmNlIHRyZWUuCisgKiBJTiBhc3NlcnRpb246IGxjb2RlcyA+PSAyNTcsIGRjb2RlcyA+PSAxLCBibGNvZGVzID49IDQuCisgKi8KK2xvY2FsIHZvaWQgc2VuZF9hbGxfdHJlZXMocywgbGNvZGVzLCBkY29kZXMsIGJsY29kZXMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBpbnQgbGNvZGVzLCBkY29kZXMsIGJsY29kZXM7IC8qIG51bWJlciBvZiBjb2RlcyBmb3IgZWFjaCB0cmVlICovCit7CisgICAgaW50IHJhbms7ICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbiBibF9vcmRlciAqLworCisgICAgQXNzZXJ0IChsY29kZXMgPj0gMjU3ICYmIGRjb2RlcyA+PSAxICYmIGJsY29kZXMgPj0gNCwgIm5vdCBlbm91Z2ggY29kZXMiKTsKKyAgICBBc3NlcnQgKGxjb2RlcyA8PSBMX0NPREVTICYmIGRjb2RlcyA8PSBEX0NPREVTICYmIGJsY29kZXMgPD0gQkxfQ09ERVMsCisgICAgICAgICAgICAidG9vIG1hbnkgY29kZXMiKTsKKyAgICBUcmFjZXYoKHN0ZGVyciwgIlxuYmwgY291bnRzOiAiKSk7CisgICAgc2VuZF9iaXRzKHMsIGxjb2Rlcy0yNTcsIDUpOyAvKiBub3QgKzI1NSBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi8KKyAgICBzZW5kX2JpdHMocywgZGNvZGVzLTEsICAgNSk7CisgICAgc2VuZF9iaXRzKHMsIGJsY29kZXMtNCwgIDQpOyAvKiBub3QgLTMgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovCisgICAgZm9yIChyYW5rID0gMDsgcmFuayA8IGJsY29kZXM7IHJhbmsrKykgeworICAgICAgICBUcmFjZXYoKHN0ZGVyciwgIlxuYmwgY29kZSAlMmQgIiwgYmxfb3JkZXJbcmFua10pKTsKKyAgICAgICAgc2VuZF9iaXRzKHMsIHMtPmJsX3RyZWVbYmxfb3JkZXJbcmFua11dLkxlbiwgMyk7CisgICAgfQorICAgIFRyYWNldigoc3RkZXJyLCAiXG5ibCB0cmVlOiBzZW50ICVsZCIsIHMtPmJpdHNfc2VudCkpOworCisgICAgc2VuZF90cmVlKHMsIChjdF9kYXRhICopcy0+ZHluX2x0cmVlLCBsY29kZXMtMSk7IC8qIGxpdGVyYWwgdHJlZSAqLworICAgIFRyYWNldigoc3RkZXJyLCAiXG5saXQgdHJlZTogc2VudCAlbGQiLCBzLT5iaXRzX3NlbnQpKTsKKworICAgIHNlbmRfdHJlZShzLCAoY3RfZGF0YSAqKXMtPmR5bl9kdHJlZSwgZGNvZGVzLTEpOyAvKiBkaXN0YW5jZSB0cmVlICovCisgICAgVHJhY2V2KChzdGRlcnIsICJcbmRpc3QgdHJlZTogc2VudCAlbGQiLCBzLT5iaXRzX3NlbnQpKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIGEgc3RvcmVkIGJsb2NrCisgKi8KK3ZvaWQgWkxJQl9JTlRFUk5BTCBfdHJfc3RvcmVkX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdCkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGNoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrICovCisgICAgdWxnIHN0b3JlZF9sZW47ICAgLyogbGVuZ3RoIG9mIGlucHV0IGJsb2NrICovCisgICAgaW50IGxhc3Q7ICAgICAgICAgLyogb25lIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqLworeworICAgIHNlbmRfYml0cyhzLCAoU1RPUkVEX0JMT0NLPDwxKStsYXN0LCAzKTsgICAgLyogc2VuZCBibG9jayB0eXBlICovCisjaWZkZWYgREVCVUcKKyAgICBzLT5jb21wcmVzc2VkX2xlbiA9IChzLT5jb21wcmVzc2VkX2xlbiArIDMgKyA3KSAmICh1bGcpfjdMOworICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IChzdG9yZWRfbGVuICsgNCkgPDwgMzsKKyNlbmRpZgorICAgIGNvcHlfYmxvY2socywgYnVmLCAodW5zaWduZWQpc3RvcmVkX2xlbiwgMSk7IC8qIHdpdGggaGVhZGVyICovCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRmx1c2ggdGhlIGJpdHMgaW4gdGhlIGJpdCBidWZmZXIgdG8gcGVuZGluZyBvdXRwdXQgKGxlYXZlcyBhdCBtb3N0IDcgYml0cykKKyAqLwordm9pZCBaTElCX0lOVEVSTkFMIF90cl9mbHVzaF9iaXRzKHMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKK3sKKyAgICBiaV9mbHVzaChzKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIG9uZSBlbXB0eSBzdGF0aWMgYmxvY2sgdG8gZ2l2ZSBlbm91Z2ggbG9va2FoZWFkIGZvciBpbmZsYXRlLgorICogVGhpcyB0YWtlcyAxMCBiaXRzLCBvZiB3aGljaCA3IG1heSByZW1haW4gaW4gdGhlIGJpdCBidWZmZXIuCisgKi8KK3ZvaWQgWkxJQl9JTlRFUk5BTCBfdHJfYWxpZ24ocykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworeworICAgIHNlbmRfYml0cyhzLCBTVEFUSUNfVFJFRVM8PDEsIDMpOworICAgIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIHN0YXRpY19sdHJlZSk7CisjaWZkZWYgREVCVUcKKyAgICBzLT5jb21wcmVzc2VkX2xlbiArPSAxMEw7IC8qIDMgZm9yIGJsb2NrIHR5cGUsIDcgZm9yIEVPQiAqLworI2VuZGlmCisgICAgYmlfZmx1c2gocyk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nIGZvciB0aGUgY3VycmVudCBibG9jazogZHluYW1pYyB0cmVlcywgc3RhdGljCisgKiB0cmVlcyBvciBzdG9yZSwgYW5kIG91dHB1dCB0aGUgZW5jb2RlZCBibG9jayB0byB0aGUgemlwIGZpbGUuCisgKi8KK3ZvaWQgWkxJQl9JTlRFUk5BTCBfdHJfZmx1c2hfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgY2hhcmYgKmJ1ZjsgICAgICAgLyogaW5wdXQgYmxvY2ssIG9yIE5VTEwgaWYgdG9vIG9sZCAqLworICAgIHVsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqLworICAgIGludCBsYXN0OyAgICAgICAgIC8qIG9uZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrIGZvciBhIGZpbGUgKi8KK3sKKyAgICB1bGcgb3B0X2xlbmIsIHN0YXRpY19sZW5iOyAvKiBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGluIGJ5dGVzICovCisgICAgaW50IG1heF9ibGluZGV4ID0gMDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi8KKworICAgIC8qIEJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzIHVubGVzcyBhIHN0b3JlZCBibG9jayBpcyBmb3JjZWQgKi8KKyAgICBpZiAocy0+bGV2ZWwgPiAwKSB7CisKKyAgICAgICAgLyogQ2hlY2sgaWYgdGhlIGZpbGUgaXMgYmluYXJ5IG9yIHRleHQgKi8KKyAgICAgICAgaWYgKHMtPnN0cm0tPmRhdGFfdHlwZSA9PSBaX1VOS05PV04pCisgICAgICAgICAgICBzLT5zdHJtLT5kYXRhX3R5cGUgPSBkZXRlY3RfZGF0YV90eXBlKHMpOworCisgICAgICAgIC8qIENvbnN0cnVjdCB0aGUgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi8KKyAgICAgICAgYnVpbGRfdHJlZShzLCAodHJlZV9kZXNjICopKCYocy0+bF9kZXNjKSkpOworICAgICAgICBUcmFjZXYoKHN0ZGVyciwgIlxubGl0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkIiwgcy0+b3B0X2xlbiwKKyAgICAgICAgICAgICAgICBzLT5zdGF0aWNfbGVuKSk7CisKKyAgICAgICAgYnVpbGRfdHJlZShzLCAodHJlZV9kZXNjICopKCYocy0+ZF9kZXNjKSkpOworICAgICAgICBUcmFjZXYoKHN0ZGVyciwgIlxuZGlzdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZCIsIHMtPm9wdF9sZW4sCisgICAgICAgICAgICAgICAgcy0+c3RhdGljX2xlbikpOworICAgICAgICAvKiBBdCB0aGlzIHBvaW50LCBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGFyZSB0aGUgdG90YWwgYml0IGxlbmd0aHMgb2YKKyAgICAgICAgICogdGhlIGNvbXByZXNzZWQgYmxvY2sgZGF0YSwgZXhjbHVkaW5nIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucy4KKyAgICAgICAgICovCisKKyAgICAgICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFib3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXgKKyAgICAgICAgICogaW4gYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuCisgICAgICAgICAqLworICAgICAgICBtYXhfYmxpbmRleCA9IGJ1aWxkX2JsX3RyZWUocyk7CisKKyAgICAgICAgLyogRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nLiBDb21wdXRlIHRoZSBibG9jayBsZW5ndGhzIGluIGJ5dGVzLiAqLworICAgICAgICBvcHRfbGVuYiA9IChzLT5vcHRfbGVuKzMrNyk+PjM7CisgICAgICAgIHN0YXRpY19sZW5iID0gKHMtPnN0YXRpY19sZW4rMys3KT4+MzsKKworICAgICAgICBUcmFjZXYoKHN0ZGVyciwgIlxub3B0ICVsdSglbHUpIHN0YXQgJWx1KCVsdSkgc3RvcmVkICVsdSBsaXQgJXUgIiwKKyAgICAgICAgICAgICAgICBvcHRfbGVuYiwgcy0+b3B0X2xlbiwgc3RhdGljX2xlbmIsIHMtPnN0YXRpY19sZW4sIHN0b3JlZF9sZW4sCisgICAgICAgICAgICAgICAgcy0+bGFzdF9saXQpKTsKKworICAgICAgICBpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpIG9wdF9sZW5iID0gc3RhdGljX2xlbmI7CisKKyAgICB9IGVsc2UgeworICAgICAgICBBc3NlcnQoYnVmICE9IChjaGFyKikwLCAibG9zdCBidWYiKTsKKyAgICAgICAgb3B0X2xlbmIgPSBzdGF0aWNfbGVuYiA9IHN0b3JlZF9sZW4gKyA1OyAvKiBmb3JjZSBhIHN0b3JlZCBibG9jayAqLworICAgIH0KKworI2lmZGVmIEZPUkNFX1NUT1JFRAorICAgIGlmIChidWYgIT0gKGNoYXIqKTApIHsgLyogZm9yY2Ugc3RvcmVkIGJsb2NrICovCisjZWxzZQorICAgIGlmIChzdG9yZWRfbGVuKzQgPD0gb3B0X2xlbmIgJiYgYnVmICE9IChjaGFyKikwKSB7CisgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ6IHR3byB3b3JkcyBmb3IgdGhlIGxlbmd0aHMgKi8KKyNlbmRpZgorICAgICAgICAvKiBUaGUgdGVzdCBidWYgIT0gTlVMTCBpcyBvbmx5IG5lY2Vzc2FyeSBpZiBMSVRfQlVGU0laRSA+IFdTSVpFLgorICAgICAgICAgKiBPdGhlcndpc2Ugd2UgY2FuJ3QgaGF2ZSBwcm9jZXNzZWQgbW9yZSB0aGFuIFdTSVpFIGlucHV0IGJ5dGVzIHNpbmNlCisgICAgICAgICAqIHRoZSBsYXN0IGJsb2NrIGZsdXNoLCBiZWNhdXNlIGNvbXByZXNzaW9uIHdvdWxkIGhhdmUgYmVlbgorICAgICAgICAgKiBzdWNjZXNzZnVsLiBJZiBMSVRfQlVGU0laRSA8PSBXU0laRSwgaXQgaXMgbmV2ZXIgdG9vIGxhdGUgdG8KKyAgICAgICAgICogdHJhbnNmb3JtIGEgYmxvY2sgaW50byBhIHN0b3JlZCBibG9jay4KKyAgICAgICAgICovCisgICAgICAgIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KTsKKworI2lmZGVmIEZPUkNFX1NUQVRJQworICAgIH0gZWxzZSBpZiAoc3RhdGljX2xlbmIgPj0gMCkgeyAvKiBmb3JjZSBzdGF0aWMgdHJlZXMgKi8KKyNlbHNlCisgICAgfSBlbHNlIGlmIChzLT5zdHJhdGVneSA9PSBaX0ZJWEVEIHx8IHN0YXRpY19sZW5iID09IG9wdF9sZW5iKSB7CisjZW5kaWYKKyAgICAgICAgc2VuZF9iaXRzKHMsIChTVEFUSUNfVFJFRVM8PDEpK2xhc3QsIDMpOworICAgICAgICBjb21wcmVzc19ibG9jayhzLCAoY29uc3QgY3RfZGF0YSAqKXN0YXRpY19sdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGN0X2RhdGEgKilzdGF0aWNfZHRyZWUpOworI2lmZGVmIERFQlVHCisgICAgICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IDMgKyBzLT5zdGF0aWNfbGVuOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgc2VuZF9iaXRzKHMsIChEWU5fVFJFRVM8PDEpK2xhc3QsIDMpOworICAgICAgICBzZW5kX2FsbF90cmVlcyhzLCBzLT5sX2Rlc2MubWF4X2NvZGUrMSwgcy0+ZF9kZXNjLm1heF9jb2RlKzEsCisgICAgICAgICAgICAgICAgICAgICAgIG1heF9ibGluZGV4KzEpOworICAgICAgICBjb21wcmVzc19ibG9jayhzLCAoY29uc3QgY3RfZGF0YSAqKXMtPmR5bl9sdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGN0X2RhdGEgKilzLT5keW5fZHRyZWUpOworI2lmZGVmIERFQlVHCisgICAgICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IDMgKyBzLT5vcHRfbGVuOworI2VuZGlmCisgICAgfQorICAgIEFzc2VydCAocy0+Y29tcHJlc3NlZF9sZW4gPT0gcy0+Yml0c19zZW50LCAiYmFkIGNvbXByZXNzZWQgc2l6ZSIpOworICAgIC8qIFRoZSBhYm92ZSBjaGVjayBpcyBtYWRlIG1vZCAyXjMyLCBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gNTEyIE1CCisgICAgICogYW5kIHVMb25nIGltcGxlbWVudGVkIG9uIDMyIGJpdHMuCisgICAgICovCisgICAgaW5pdF9ibG9jayhzKTsKKworICAgIGlmIChsYXN0KSB7CisgICAgICAgIGJpX3dpbmR1cChzKTsKKyNpZmRlZiBERUJVRworICAgICAgICBzLT5jb21wcmVzc2VkX2xlbiArPSA3OyAgLyogYWxpZ24gb24gYnl0ZSBib3VuZGFyeSAqLworI2VuZGlmCisgICAgfQorICAgIFRyYWNldigoc3RkZXJyLCJcbmNvbXBybGVuICVsdSglbHUpICIsIHMtPmNvbXByZXNzZWRfbGVuPj4zLAorICAgICAgICAgICBzLT5jb21wcmVzc2VkX2xlbi03Kmxhc3QpKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTYXZlIHRoZSBtYXRjaCBpbmZvIGFuZCB0YWxseSB0aGUgZnJlcXVlbmN5IGNvdW50cy4gUmV0dXJuIHRydWUgaWYKKyAqIHRoZSBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZC4KKyAqLworaW50IFpMSUJfSU5URVJOQUwgX3RyX3RhbGx5IChzLCBkaXN0LCBsYykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIHVuc2lnbmVkIGRpc3Q7ICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqLworICAgIHVuc2lnbmVkIGxjOyAgICAvKiBtYXRjaCBsZW5ndGgtTUlOX01BVENIIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0PT0wKSAqLworeworICAgIHMtPmRfYnVmW3MtPmxhc3RfbGl0XSA9ICh1c2gpZGlzdDsKKyAgICBzLT5sX2J1ZltzLT5sYXN0X2xpdCsrXSA9ICh1Y2gpbGM7CisgICAgaWYgKGRpc3QgPT0gMCkgeworICAgICAgICAvKiBsYyBpcyB0aGUgdW5tYXRjaGVkIGNoYXIgKi8KKyAgICAgICAgcy0+ZHluX2x0cmVlW2xjXS5GcmVxKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+bWF0Y2hlcysrOworICAgICAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovCisgICAgICAgIGRpc3QtLTsgICAgICAgICAgICAgLyogZGlzdCA9IG1hdGNoIGRpc3RhbmNlIC0gMSAqLworICAgICAgICBBc3NlcnQoKHVzaClkaXN0IDwgKHVzaClNQVhfRElTVChzKSAmJgorICAgICAgICAgICAgICAgKHVzaClsYyA8PSAodXNoKShNQVhfTUFUQ0gtTUlOX01BVENIKSAmJgorICAgICAgICAgICAgICAgKHVzaClkX2NvZGUoZGlzdCkgPCAodXNoKURfQ09ERVMsICAiX3RyX3RhbGx5OiBiYWQgbWF0Y2giKTsKKworICAgICAgICBzLT5keW5fbHRyZWVbX2xlbmd0aF9jb2RlW2xjXStMSVRFUkFMUysxXS5GcmVxKys7CisgICAgICAgIHMtPmR5bl9kdHJlZVtkX2NvZGUoZGlzdCldLkZyZXErKzsKKyAgICB9CisKKyNpZmRlZiBUUlVOQ0FURV9CTE9DSworICAgIC8qIFRyeSB0byBndWVzcyBpZiBpdCBpcyBwcm9maXRhYmxlIHRvIHN0b3AgdGhlIGN1cnJlbnQgYmxvY2sgaGVyZSAqLworICAgIGlmICgocy0+bGFzdF9saXQgJiAweDFmZmYpID09IDAgJiYgcy0+bGV2ZWwgPiAyKSB7CisgICAgICAgIC8qIENvbXB1dGUgYW4gdXBwZXIgYm91bmQgZm9yIHRoZSBjb21wcmVzc2VkIGxlbmd0aCAqLworICAgICAgICB1bGcgb3V0X2xlbmd0aCA9ICh1bGcpcy0+bGFzdF9saXQqOEw7CisgICAgICAgIHVsZyBpbl9sZW5ndGggPSAodWxnKSgobG9uZylzLT5zdHJzdGFydCAtIHMtPmJsb2NrX3N0YXJ0KTsKKyAgICAgICAgaW50IGRjb2RlOworICAgICAgICBmb3IgKGRjb2RlID0gMDsgZGNvZGUgPCBEX0NPREVTOyBkY29kZSsrKSB7CisgICAgICAgICAgICBvdXRfbGVuZ3RoICs9ICh1bGcpcy0+ZHluX2R0cmVlW2Rjb2RlXS5GcmVxICoKKyAgICAgICAgICAgICAgICAoNUwrZXh0cmFfZGJpdHNbZGNvZGVdKTsKKyAgICAgICAgfQorICAgICAgICBvdXRfbGVuZ3RoID4+PSAzOworICAgICAgICBUcmFjZXYoKHN0ZGVyciwiXG5sYXN0X2xpdCAldSwgaW4gJWxkLCBvdXQgfiVsZCglbGQlJSkgIiwKKyAgICAgICAgICAgICAgIHMtPmxhc3RfbGl0LCBpbl9sZW5ndGgsIG91dF9sZW5ndGgsCisgICAgICAgICAgICAgICAxMDBMIC0gb3V0X2xlbmd0aCoxMDBML2luX2xlbmd0aCkpOworICAgICAgICBpZiAocy0+bWF0Y2hlcyA8IHMtPmxhc3RfbGl0LzIgJiYgb3V0X2xlbmd0aCA8IGluX2xlbmd0aC8yKSByZXR1cm4gMTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gKHMtPmxhc3RfbGl0ID09IHMtPmxpdF9idWZzaXplLTEpOworICAgIC8qIFdlIGF2b2lkIGVxdWFsaXR5IHdpdGggbGl0X2J1ZnNpemUgYmVjYXVzZSBvZiB3cmFwYXJvdW5kIGF0IDY0SworICAgICAqIG9uIDE2IGJpdCBtYWNoaW5lcyBhbmQgYmVjYXVzZSBzdG9yZWQgYmxvY2tzIGFyZSByZXN0cmljdGVkIHRvCisgICAgICogNjRLLTEgYnl0ZXMuCisgICAgICovCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCB0aGUgYmxvY2sgZGF0YSBjb21wcmVzc2VkIHVzaW5nIHRoZSBnaXZlbiBIdWZmbWFuIHRyZWVzCisgKi8KK2xvY2FsIHZvaWQgY29tcHJlc3NfYmxvY2socywgbHRyZWUsIGR0cmVlKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgY29uc3QgY3RfZGF0YSAqbHRyZWU7IC8qIGxpdGVyYWwgdHJlZSAqLworICAgIGNvbnN0IGN0X2RhdGEgKmR0cmVlOyAvKiBkaXN0YW5jZSB0cmVlICovCit7CisgICAgdW5zaWduZWQgZGlzdDsgICAgICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqLworICAgIGludCBsYzsgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0ID09IDApICovCisgICAgdW5zaWduZWQgbHggPSAwOyAgICAvKiBydW5uaW5nIGluZGV4IGluIGxfYnVmICovCisgICAgdW5zaWduZWQgY29kZTsgICAgICAvKiB0aGUgY29kZSB0byBzZW5kICovCisgICAgaW50IGV4dHJhOyAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyB0byBzZW5kICovCisKKyAgICBpZiAocy0+bGFzdF9saXQgIT0gMCkgZG8geworICAgICAgICBkaXN0ID0gcy0+ZF9idWZbbHhdOworICAgICAgICBsYyA9IHMtPmxfYnVmW2x4KytdOworICAgICAgICBpZiAoZGlzdCA9PSAwKSB7CisgICAgICAgICAgICBzZW5kX2NvZGUocywgbGMsIGx0cmVlKTsgLyogc2VuZCBhIGxpdGVyYWwgYnl0ZSAqLworICAgICAgICAgICAgVHJhY2Vjdihpc2dyYXBoKGxjKSwgKHN0ZGVyciwiICclYycgIiwgbGMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi8KKyAgICAgICAgICAgIGNvZGUgPSBfbGVuZ3RoX2NvZGVbbGNdOworICAgICAgICAgICAgc2VuZF9jb2RlKHMsIGNvZGUrTElURVJBTFMrMSwgbHRyZWUpOyAvKiBzZW5kIHRoZSBsZW5ndGggY29kZSAqLworICAgICAgICAgICAgZXh0cmEgPSBleHRyYV9sYml0c1tjb2RlXTsKKyAgICAgICAgICAgIGlmIChleHRyYSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbGMgLT0gYmFzZV9sZW5ndGhbY29kZV07CisgICAgICAgICAgICAgICAgc2VuZF9iaXRzKHMsIGxjLCBleHRyYSk7ICAgICAgIC8qIHNlbmQgdGhlIGV4dHJhIGxlbmd0aCBiaXRzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBkaXN0LS07IC8qIGRpc3QgaXMgbm93IHRoZSBtYXRjaCBkaXN0YW5jZSAtIDEgKi8KKyAgICAgICAgICAgIGNvZGUgPSBkX2NvZGUoZGlzdCk7CisgICAgICAgICAgICBBc3NlcnQgKGNvZGUgPCBEX0NPREVTLCAiYmFkIGRfY29kZSIpOworCisgICAgICAgICAgICBzZW5kX2NvZGUocywgY29kZSwgZHRyZWUpOyAgICAgICAvKiBzZW5kIHRoZSBkaXN0YW5jZSBjb2RlICovCisgICAgICAgICAgICBleHRyYSA9IGV4dHJhX2RiaXRzW2NvZGVdOworICAgICAgICAgICAgaWYgKGV4dHJhICE9IDApIHsKKyAgICAgICAgICAgICAgICBkaXN0IC09IGJhc2VfZGlzdFtjb2RlXTsKKyAgICAgICAgICAgICAgICBzZW5kX2JpdHMocywgZGlzdCwgZXh0cmEpOyAgIC8qIHNlbmQgdGhlIGV4dHJhIGRpc3RhbmNlIGJpdHMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvKiBsaXRlcmFsIG9yIG1hdGNoIHBhaXIgPyAqLworCisgICAgICAgIC8qIENoZWNrIHRoYXQgdGhlIG92ZXJsYXkgYmV0d2VlbiBwZW5kaW5nX2J1ZiBhbmQgZF9idWYrbF9idWYgaXMgb2s6ICovCisgICAgICAgIEFzc2VydCgodUludCkocy0+cGVuZGluZykgPCBzLT5saXRfYnVmc2l6ZSArIDIqbHgsCisgICAgICAgICAgICAgICAicGVuZGluZ0J1ZiBvdmVyZmxvdyIpOworCisgICAgfSB3aGlsZSAobHggPCBzLT5sYXN0X2xpdCk7CisKKyAgICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBsdHJlZSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2hlY2sgaWYgdGhlIGRhdGEgdHlwZSBpcyBURVhUIG9yIEJJTkFSWSwgdXNpbmcgdGhlIGZvbGxvd2luZyBhbGdvcml0aG06CisgKiAtIFRFWFQgaWYgdGhlIHR3byBjb25kaXRpb25zIGJlbG93IGFyZSBzYXRpc2ZpZWQ6CisgKiAgICBhKSBUaGVyZSBhcmUgbm8gbm9uLXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBiZWxvbmdpbmcgdG8gdGhlCisgKiAgICAgICAiYmxhY2sgbGlzdCIgKDAuLjYsIDE0Li4yNSwgMjguLjMxKS4KKyAqICAgIGIpIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBwcmludGFibGUgY2hhcmFjdGVyIGJlbG9uZ2luZyB0byB0aGUKKyAqICAgICAgICJ3aGl0ZSBsaXN0IiAoOSB7VEFCfSwgMTAge0xGfSwgMTMge0NSfSwgMzIuLjI1NSkuCisgKiAtIEJJTkFSWSBvdGhlcndpc2UuCisgKiAtIFRoZSBmb2xsb3dpbmcgcGFydGlhbGx5LXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBmb3JtIGEKKyAqICAgImdyYXkgbGlzdCIgdGhhdCBpcyBpZ25vcmVkIGluIHRoaXMgZGV0ZWN0aW9uIGFsZ29yaXRobToKKyAqICAgKDcge0JFTH0sIDgge0JTfSwgMTEge1ZUfSwgMTIge0ZGfSwgMjYge1NVQn0sIDI3IHtFU0N9KS4KKyAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBGcmVxIG9mIGR5bl9sdHJlZSBhcmUgc2V0LgorICovCitsb2NhbCBpbnQgZGV0ZWN0X2RhdGFfdHlwZShzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgLyogYmxhY2tfbWFzayBpcyB0aGUgYml0IG1hc2sgb2YgYmxhY2stbGlzdGVkIGJ5dGVzCisgICAgICogc2V0IGJpdHMgMC4uNiwgMTQuLjI1LCBhbmQgMjguLjMxCisgICAgICogMHhmM2ZmYzA3ZiA9IGJpbmFyeSAxMTExMDAxMTExMTExMTExMTEwMDAwMDAwMTExMTExMQorICAgICAqLworICAgIHVuc2lnbmVkIGxvbmcgYmxhY2tfbWFzayA9IDB4ZjNmZmMwN2ZVTDsKKyAgICBpbnQgbjsKKworICAgIC8qIENoZWNrIGZvciBub24tdGV4dHVhbCAoImJsYWNrLWxpc3RlZCIpIGJ5dGVzLiAqLworICAgIGZvciAobiA9IDA7IG4gPD0gMzE7IG4rKywgYmxhY2tfbWFzayA+Pj0gMSkKKyAgICAgICAgaWYgKChibGFja19tYXNrICYgMSkgJiYgKHMtPmR5bl9sdHJlZVtuXS5GcmVxICE9IDApKQorICAgICAgICAgICAgcmV0dXJuIFpfQklOQVJZOworCisgICAgLyogQ2hlY2sgZm9yIHRleHR1YWwgKCJ3aGl0ZS1saXN0ZWQiKSBieXRlcy4gKi8KKyAgICBpZiAocy0+ZHluX2x0cmVlWzldLkZyZXEgIT0gMCB8fCBzLT5keW5fbHRyZWVbMTBdLkZyZXEgIT0gMAorICAgICAgICAgICAgfHwgcy0+ZHluX2x0cmVlWzEzXS5GcmVxICE9IDApCisgICAgICAgIHJldHVybiBaX1RFWFQ7CisgICAgZm9yIChuID0gMzI7IG4gPCBMSVRFUkFMUzsgbisrKQorICAgICAgICBpZiAocy0+ZHluX2x0cmVlW25dLkZyZXEgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBaX1RFWFQ7CisKKyAgICAvKiBUaGVyZSBhcmUgbm8gImJsYWNrLWxpc3RlZCIgb3IgIndoaXRlLWxpc3RlZCIgYnl0ZXM6CisgICAgICogdGhpcyBzdHJlYW0gZWl0aGVyIGlzIGVtcHR5IG9yIGhhcyB0b2xlcmF0ZWQgKCJncmF5LWxpc3RlZCIpIGJ5dGVzIG9ubHkuCisgICAgICovCisgICAgcmV0dXJuIFpfQklOQVJZOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJldmVyc2UgdGhlIGZpcnN0IGxlbiBiaXRzIG9mIGEgY29kZSwgdXNpbmcgc3RyYWlnaHRmb3J3YXJkIGNvZGUgKGEgZmFzdGVyCisgKiBtZXRob2Qgd291bGQgdXNlIGEgdGFibGUpCisgKiBJTiBhc3NlcnRpb246IDEgPD0gbGVuIDw9IDE1CisgKi8KK2xvY2FsIHVuc2lnbmVkIGJpX3JldmVyc2UoY29kZSwgbGVuKQorICAgIHVuc2lnbmVkIGNvZGU7IC8qIHRoZSB2YWx1ZSB0byBpbnZlcnQgKi8KKyAgICBpbnQgbGVuOyAgICAgICAvKiBpdHMgYml0IGxlbmd0aCAqLworeworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIHJlcyA9IDA7CisgICAgZG8geworICAgICAgICByZXMgfD0gY29kZSAmIDE7CisgICAgICAgIGNvZGUgPj49IDEsIHJlcyA8PD0gMTsKKyAgICB9IHdoaWxlICgtLWxlbiA+IDApOworICAgIHJldHVybiByZXMgPj4gMTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGbHVzaCB0aGUgYml0IGJ1ZmZlciwga2VlcGluZyBhdCBtb3N0IDcgYml0cyBpbiBpdC4KKyAqLworbG9jYWwgdm9pZCBiaV9mbHVzaChzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgaWYgKHMtPmJpX3ZhbGlkID09IDE2KSB7CisgICAgICAgIHB1dF9zaG9ydChzLCBzLT5iaV9idWYpOworICAgICAgICBzLT5iaV9idWYgPSAwOworICAgICAgICBzLT5iaV92YWxpZCA9IDA7CisgICAgfSBlbHNlIGlmIChzLT5iaV92YWxpZCA+PSA4KSB7CisgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKXMtPmJpX2J1Zik7CisgICAgICAgIHMtPmJpX2J1ZiA+Pj0gODsKKyAgICAgICAgcy0+YmlfdmFsaWQgLT0gODsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRmx1c2ggdGhlIGJpdCBidWZmZXIgYW5kIGFsaWduIHRoZSBvdXRwdXQgb24gYSBieXRlIGJvdW5kYXJ5CisgKi8KK2xvY2FsIHZvaWQgYmlfd2luZHVwKHMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKK3sKKyAgICBpZiAocy0+YmlfdmFsaWQgPiA4KSB7CisgICAgICAgIHB1dF9zaG9ydChzLCBzLT5iaV9idWYpOworICAgIH0gZWxzZSBpZiAocy0+YmlfdmFsaWQgPiAwKSB7CisgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKXMtPmJpX2J1Zik7CisgICAgfQorICAgIHMtPmJpX2J1ZiA9IDA7CisgICAgcy0+YmlfdmFsaWQgPSAwOworI2lmZGVmIERFQlVHCisgICAgcy0+Yml0c19zZW50ID0gKHMtPmJpdHNfc2VudCs3KSAmIH43OworI2VuZGlmCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weSBhIHN0b3JlZCBibG9jaywgc3RvcmluZyBmaXJzdCB0aGUgbGVuZ3RoIGFuZCBpdHMKKyAqIG9uZSdzIGNvbXBsZW1lbnQgaWYgcmVxdWVzdGVkLgorICovCitsb2NhbCB2b2lkIGNvcHlfYmxvY2socywgYnVmLCBsZW4sIGhlYWRlcikKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGNoYXJmICAgICpidWY7ICAgIC8qIHRoZSBpbnB1dCBkYXRhICovCisgICAgdW5zaWduZWQgbGVuOyAgICAgLyogaXRzIGxlbmd0aCAqLworICAgIGludCAgICAgIGhlYWRlcjsgIC8qIHRydWUgaWYgYmxvY2sgaGVhZGVyIG11c3QgYmUgd3JpdHRlbiAqLworeworICAgIGJpX3dpbmR1cChzKTsgICAgICAgIC8qIGFsaWduIG9uIGJ5dGUgYm91bmRhcnkgKi8KKworICAgIGlmIChoZWFkZXIpIHsKKyAgICAgICAgcHV0X3Nob3J0KHMsICh1c2gpbGVuKTsKKyAgICAgICAgcHV0X3Nob3J0KHMsICh1c2gpfmxlbik7CisjaWZkZWYgREVCVUcKKyAgICAgICAgcy0+Yml0c19zZW50ICs9IDIqMTY7CisjZW5kaWYKKyAgICB9CisjaWZkZWYgREVCVUcKKyAgICBzLT5iaXRzX3NlbnQgKz0gKHVsZylsZW48PDM7CisjZW5kaWYKKyAgICB3aGlsZSAobGVuLS0pIHsKKyAgICAgICAgcHV0X2J5dGUocywgKmJ1ZisrKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS96bGliL3NyYy90cmVlcy5oIGIvemxpYi9zcmMvdHJlZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzU2MzlkCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvdHJlZXMuaApAQCAtMCwwICsxLDEyOCBAQAorLyogaGVhZGVyIGNyZWF0ZWQgYXV0b21hdGljYWxseSB3aXRoIC1ER0VOX1RSRUVTX0ggKi8KKworbG9jYWwgY29uc3QgY3RfZGF0YSBzdGF0aWNfbHRyZWVbTF9DT0RFUysyXSA9IHsKK3t7IDEyfSx7ICA4fX0sIHt7MTQwfSx7ICA4fX0sIHt7IDc2fSx7ICA4fX0sIHt7MjA0fSx7ICA4fX0sIHt7IDQ0fSx7ICA4fX0sCit7ezE3Mn0seyAgOH19LCB7ezEwOH0seyAgOH19LCB7ezIzNn0seyAgOH19LCB7eyAyOH0seyAgOH19LCB7ezE1Nn0seyAgOH19LAore3sgOTJ9LHsgIDh9fSwge3syMjB9LHsgIDh9fSwge3sgNjB9LHsgIDh9fSwge3sxODh9LHsgIDh9fSwge3sxMjR9LHsgIDh9fSwKK3t7MjUyfSx7ICA4fX0sIHt7ICAyfSx7ICA4fX0sIHt7MTMwfSx7ICA4fX0sIHt7IDY2fSx7ICA4fX0sIHt7MTk0fSx7ICA4fX0sCit7eyAzNH0seyAgOH19LCB7ezE2Mn0seyAgOH19LCB7eyA5OH0seyAgOH19LCB7ezIyNn0seyAgOH19LCB7eyAxOH0seyAgOH19LAore3sxNDZ9LHsgIDh9fSwge3sgODJ9LHsgIDh9fSwge3syMTB9LHsgIDh9fSwge3sgNTB9LHsgIDh9fSwge3sxNzh9LHsgIDh9fSwKK3t7MTE0fSx7ICA4fX0sIHt7MjQyfSx7ICA4fX0sIHt7IDEwfSx7ICA4fX0sIHt7MTM4fSx7ICA4fX0sIHt7IDc0fSx7ICA4fX0sCit7ezIwMn0seyAgOH19LCB7eyA0Mn0seyAgOH19LCB7ezE3MH0seyAgOH19LCB7ezEwNn0seyAgOH19LCB7ezIzNH0seyAgOH19LAore3sgMjZ9LHsgIDh9fSwge3sxNTR9LHsgIDh9fSwge3sgOTB9LHsgIDh9fSwge3syMTh9LHsgIDh9fSwge3sgNTh9LHsgIDh9fSwKK3t7MTg2fSx7ICA4fX0sIHt7MTIyfSx7ICA4fX0sIHt7MjUwfSx7ICA4fX0sIHt7ICA2fSx7ICA4fX0sIHt7MTM0fSx7ICA4fX0sCit7eyA3MH0seyAgOH19LCB7ezE5OH0seyAgOH19LCB7eyAzOH0seyAgOH19LCB7ezE2Nn0seyAgOH19LCB7ezEwMn0seyAgOH19LAore3syMzB9LHsgIDh9fSwge3sgMjJ9LHsgIDh9fSwge3sxNTB9LHsgIDh9fSwge3sgODZ9LHsgIDh9fSwge3syMTR9LHsgIDh9fSwKK3t7IDU0fSx7ICA4fX0sIHt7MTgyfSx7ICA4fX0sIHt7MTE4fSx7ICA4fX0sIHt7MjQ2fSx7ICA4fX0sIHt7IDE0fSx7ICA4fX0sCit7ezE0Mn0seyAgOH19LCB7eyA3OH0seyAgOH19LCB7ezIwNn0seyAgOH19LCB7eyA0Nn0seyAgOH19LCB7ezE3NH0seyAgOH19LAore3sxMTB9LHsgIDh9fSwge3syMzh9LHsgIDh9fSwge3sgMzB9LHsgIDh9fSwge3sxNTh9LHsgIDh9fSwge3sgOTR9LHsgIDh9fSwKK3t7MjIyfSx7ICA4fX0sIHt7IDYyfSx7ICA4fX0sIHt7MTkwfSx7ICA4fX0sIHt7MTI2fSx7ICA4fX0sIHt7MjU0fSx7ICA4fX0sCit7eyAgMX0seyAgOH19LCB7ezEyOX0seyAgOH19LCB7eyA2NX0seyAgOH19LCB7ezE5M30seyAgOH19LCB7eyAzM30seyAgOH19LAore3sxNjF9LHsgIDh9fSwge3sgOTd9LHsgIDh9fSwge3syMjV9LHsgIDh9fSwge3sgMTd9LHsgIDh9fSwge3sxNDV9LHsgIDh9fSwKK3t7IDgxfSx7ICA4fX0sIHt7MjA5fSx7ICA4fX0sIHt7IDQ5fSx7ICA4fX0sIHt7MTc3fSx7ICA4fX0sIHt7MTEzfSx7ICA4fX0sCit7ezI0MX0seyAgOH19LCB7eyAgOX0seyAgOH19LCB7ezEzN30seyAgOH19LCB7eyA3M30seyAgOH19LCB7ezIwMX0seyAgOH19LAore3sgNDF9LHsgIDh9fSwge3sxNjl9LHsgIDh9fSwge3sxMDV9LHsgIDh9fSwge3syMzN9LHsgIDh9fSwge3sgMjV9LHsgIDh9fSwKK3t7MTUzfSx7ICA4fX0sIHt7IDg5fSx7ICA4fX0sIHt7MjE3fSx7ICA4fX0sIHt7IDU3fSx7ICA4fX0sIHt7MTg1fSx7ICA4fX0sCit7ezEyMX0seyAgOH19LCB7ezI0OX0seyAgOH19LCB7eyAgNX0seyAgOH19LCB7ezEzM30seyAgOH19LCB7eyA2OX0seyAgOH19LAore3sxOTd9LHsgIDh9fSwge3sgMzd9LHsgIDh9fSwge3sxNjV9LHsgIDh9fSwge3sxMDF9LHsgIDh9fSwge3syMjl9LHsgIDh9fSwKK3t7IDIxfSx7ICA4fX0sIHt7MTQ5fSx7ICA4fX0sIHt7IDg1fSx7ICA4fX0sIHt7MjEzfSx7ICA4fX0sIHt7IDUzfSx7ICA4fX0sCit7ezE4MX0seyAgOH19LCB7ezExN30seyAgOH19LCB7ezI0NX0seyAgOH19LCB7eyAxM30seyAgOH19LCB7ezE0MX0seyAgOH19LAore3sgNzd9LHsgIDh9fSwge3syMDV9LHsgIDh9fSwge3sgNDV9LHsgIDh9fSwge3sxNzN9LHsgIDh9fSwge3sxMDl9LHsgIDh9fSwKK3t7MjM3fSx7ICA4fX0sIHt7IDI5fSx7ICA4fX0sIHt7MTU3fSx7ICA4fX0sIHt7IDkzfSx7ICA4fX0sIHt7MjIxfSx7ICA4fX0sCit7eyA2MX0seyAgOH19LCB7ezE4OX0seyAgOH19LCB7ezEyNX0seyAgOH19LCB7ezI1M30seyAgOH19LCB7eyAxOX0seyAgOX19LAore3syNzV9LHsgIDl9fSwge3sxNDd9LHsgIDl9fSwge3s0MDN9LHsgIDl9fSwge3sgODN9LHsgIDl9fSwge3szMzl9LHsgIDl9fSwKK3t7MjExfSx7ICA5fX0sIHt7NDY3fSx7ICA5fX0sIHt7IDUxfSx7ICA5fX0sIHt7MzA3fSx7ICA5fX0sIHt7MTc5fSx7ICA5fX0sCit7ezQzNX0seyAgOX19LCB7ezExNX0seyAgOX19LCB7ezM3MX0seyAgOX19LCB7ezI0M30seyAgOX19LCB7ezQ5OX0seyAgOX19LAore3sgMTF9LHsgIDl9fSwge3syNjd9LHsgIDl9fSwge3sxMzl9LHsgIDl9fSwge3szOTV9LHsgIDl9fSwge3sgNzV9LHsgIDl9fSwKK3t7MzMxfSx7ICA5fX0sIHt7MjAzfSx7ICA5fX0sIHt7NDU5fSx7ICA5fX0sIHt7IDQzfSx7ICA5fX0sIHt7Mjk5fSx7ICA5fX0sCit7ezE3MX0seyAgOX19LCB7ezQyN30seyAgOX19LCB7ezEwN30seyAgOX19LCB7ezM2M30seyAgOX19LCB7ezIzNX0seyAgOX19LAore3s0OTF9LHsgIDl9fSwge3sgMjd9LHsgIDl9fSwge3syODN9LHsgIDl9fSwge3sxNTV9LHsgIDl9fSwge3s0MTF9LHsgIDl9fSwKK3t7IDkxfSx7ICA5fX0sIHt7MzQ3fSx7ICA5fX0sIHt7MjE5fSx7ICA5fX0sIHt7NDc1fSx7ICA5fX0sIHt7IDU5fSx7ICA5fX0sCit7ezMxNX0seyAgOX19LCB7ezE4N30seyAgOX19LCB7ezQ0M30seyAgOX19LCB7ezEyM30seyAgOX19LCB7ezM3OX0seyAgOX19LAore3syNTF9LHsgIDl9fSwge3s1MDd9LHsgIDl9fSwge3sgIDd9LHsgIDl9fSwge3syNjN9LHsgIDl9fSwge3sxMzV9LHsgIDl9fSwKK3t7MzkxfSx7ICA5fX0sIHt7IDcxfSx7ICA5fX0sIHt7MzI3fSx7ICA5fX0sIHt7MTk5fSx7ICA5fX0sIHt7NDU1fSx7ICA5fX0sCit7eyAzOX0seyAgOX19LCB7ezI5NX0seyAgOX19LCB7ezE2N30seyAgOX19LCB7ezQyM30seyAgOX19LCB7ezEwM30seyAgOX19LAore3szNTl9LHsgIDl9fSwge3syMzF9LHsgIDl9fSwge3s0ODd9LHsgIDl9fSwge3sgMjN9LHsgIDl9fSwge3syNzl9LHsgIDl9fSwKK3t7MTUxfSx7ICA5fX0sIHt7NDA3fSx7ICA5fX0sIHt7IDg3fSx7ICA5fX0sIHt7MzQzfSx7ICA5fX0sIHt7MjE1fSx7ICA5fX0sCit7ezQ3MX0seyAgOX19LCB7eyA1NX0seyAgOX19LCB7ezMxMX0seyAgOX19LCB7ezE4M30seyAgOX19LCB7ezQzOX0seyAgOX19LAore3sxMTl9LHsgIDl9fSwge3szNzV9LHsgIDl9fSwge3syNDd9LHsgIDl9fSwge3s1MDN9LHsgIDl9fSwge3sgMTV9LHsgIDl9fSwKK3t7MjcxfSx7ICA5fX0sIHt7MTQzfSx7ICA5fX0sIHt7Mzk5fSx7ICA5fX0sIHt7IDc5fSx7ICA5fX0sIHt7MzM1fSx7ICA5fX0sCit7ezIwN30seyAgOX19LCB7ezQ2M30seyAgOX19LCB7eyA0N30seyAgOX19LCB7ezMwM30seyAgOX19LCB7ezE3NX0seyAgOX19LAore3s0MzF9LHsgIDl9fSwge3sxMTF9LHsgIDl9fSwge3szNjd9LHsgIDl9fSwge3syMzl9LHsgIDl9fSwge3s0OTV9LHsgIDl9fSwKK3t7IDMxfSx7ICA5fX0sIHt7Mjg3fSx7ICA5fX0sIHt7MTU5fSx7ICA5fX0sIHt7NDE1fSx7ICA5fX0sIHt7IDk1fSx7ICA5fX0sCit7ezM1MX0seyAgOX19LCB7ezIyM30seyAgOX19LCB7ezQ3OX0seyAgOX19LCB7eyA2M30seyAgOX19LCB7ezMxOX0seyAgOX19LAore3sxOTF9LHsgIDl9fSwge3s0NDd9LHsgIDl9fSwge3sxMjd9LHsgIDl9fSwge3szODN9LHsgIDl9fSwge3syNTV9LHsgIDl9fSwKK3t7NTExfSx7ICA5fX0sIHt7ICAwfSx7ICA3fX0sIHt7IDY0fSx7ICA3fX0sIHt7IDMyfSx7ICA3fX0sIHt7IDk2fSx7ICA3fX0sCit7eyAxNn0seyAgN319LCB7eyA4MH0seyAgN319LCB7eyA0OH0seyAgN319LCB7ezExMn0seyAgN319LCB7eyAgOH0seyAgN319LAore3sgNzJ9LHsgIDd9fSwge3sgNDB9LHsgIDd9fSwge3sxMDR9LHsgIDd9fSwge3sgMjR9LHsgIDd9fSwge3sgODh9LHsgIDd9fSwKK3t7IDU2fSx7ICA3fX0sIHt7MTIwfSx7ICA3fX0sIHt7ICA0fSx7ICA3fX0sIHt7IDY4fSx7ICA3fX0sIHt7IDM2fSx7ICA3fX0sCit7ezEwMH0seyAgN319LCB7eyAyMH0seyAgN319LCB7eyA4NH0seyAgN319LCB7eyA1Mn0seyAgN319LCB7ezExNn0seyAgN319LAore3sgIDN9LHsgIDh9fSwge3sxMzF9LHsgIDh9fSwge3sgNjd9LHsgIDh9fSwge3sxOTV9LHsgIDh9fSwge3sgMzV9LHsgIDh9fSwKK3t7MTYzfSx7ICA4fX0sIHt7IDk5fSx7ICA4fX0sIHt7MjI3fSx7ICA4fX0KK307CisKK2xvY2FsIGNvbnN0IGN0X2RhdGEgc3RhdGljX2R0cmVlW0RfQ09ERVNdID0gewore3sgMH0seyA1fX0sIHt7MTZ9LHsgNX19LCB7eyA4fSx7IDV9fSwge3syNH0seyA1fX0sIHt7IDR9LHsgNX19LAore3syMH0seyA1fX0sIHt7MTJ9LHsgNX19LCB7ezI4fSx7IDV9fSwge3sgMn0seyA1fX0sIHt7MTh9LHsgNX19LAore3sxMH0seyA1fX0sIHt7MjZ9LHsgNX19LCB7eyA2fSx7IDV9fSwge3syMn0seyA1fX0sIHt7MTR9LHsgNX19LAore3szMH0seyA1fX0sIHt7IDF9LHsgNX19LCB7ezE3fSx7IDV9fSwge3sgOX0seyA1fX0sIHt7MjV9LHsgNX19LAore3sgNX0seyA1fX0sIHt7MjF9LHsgNX19LCB7ezEzfSx7IDV9fSwge3syOX0seyA1fX0sIHt7IDN9LHsgNX19LAore3sxOX0seyA1fX0sIHt7MTF9LHsgNX19LCB7ezI3fSx7IDV9fSwge3sgN30seyA1fX0sIHt7MjN9LHsgNX19Cit9OworCitjb25zdCB1Y2ggWkxJQl9JTlRFUk5BTCBfZGlzdF9jb2RlW0RJU1RfQ09ERV9MRU5dID0geworIDAsICAxLCAgMiwgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA4LAorIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLAorMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsICAwLCAgMCwgMTYsIDE3LAorMTgsIDE4LCAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLAorMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LAorMjQsIDI0LCAyNCwgMjQsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LAorMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LAorMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LAorMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LAorMjcsIDI3LCAyNywgMjcsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LAorMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LAorMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LAorMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LAorMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LAorMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LAorMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOQorfTsKKworY29uc3QgdWNoIFpMSUJfSU5URVJOQUwgX2xlbmd0aF9jb2RlW01BWF9NQVRDSC1NSU5fTUFUQ0grMV09IHsKKyAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA4LCAgOSwgIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwKKzEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKzE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOSwgMTksIDE5LCAxOSwKKzE5LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwKKzIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMiwgMjIsIDIyLCAyMiwKKzIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywKKzIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwKKzI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwKKzI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwKKzI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwKKzI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwKKzI2LCAyNiwgMjYsIDI2LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywKKzI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI4Cit9OworCitsb2NhbCBjb25zdCBpbnQgYmFzZV9sZW5ndGhbTEVOR1RIX0NPREVTXSA9IHsKKzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDEwLCAxMiwgMTQsIDE2LCAyMCwgMjQsIDI4LCAzMiwgNDAsIDQ4LCA1NiwKKzY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAwCit9OworCitsb2NhbCBjb25zdCBpbnQgYmFzZV9kaXN0W0RfQ09ERVNdID0geworICAgIDAsICAgICAxLCAgICAgMiwgICAgIDMsICAgICA0LCAgICAgNiwgICAgIDgsICAgIDEyLCAgICAxNiwgICAgMjQsCisgICAzMiwgICAgNDgsICAgIDY0LCAgICA5NiwgICAxMjgsICAgMTkyLCAgIDI1NiwgICAzODQsICAgNTEyLCAgIDc2OCwKKyAxMDI0LCAgMTUzNiwgIDIwNDgsICAzMDcyLCAgNDA5NiwgIDYxNDQsICA4MTkyLCAxMjI4OCwgMTYzODQsIDI0NTc2Cit9OworCmRpZmYgLS1naXQgYS96bGliL3NyYy91bmNvbXByLmMgYi96bGliL3NyYy91bmNvbXByLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyZTk0OQotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL3VuY29tcHIuYwpAQCAtMCwwICsxLDU5IEBACisvKiB1bmNvbXByLmMgLS0gZGVjb21wcmVzcyBhIG1lbW9yeSBidWZmZXIKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzLCAyMDEwIEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogQCgjKSAkSWQkICovCisKKyNkZWZpbmUgWkxJQl9JTlRFUk5BTAorI2luY2x1ZGUgInpsaWIuaCIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIERlY29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBzb3VyY2VMZW4gaXMKKyAgIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwKKyAgIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUKKyAgIGVudGlyZSB1bmNvbXByZXNzZWQgZGF0YS4gKFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtdXN0IGhhdmUKKyAgIGJlZW4gc2F2ZWQgcHJldmlvdXNseSBieSB0aGUgY29tcHJlc3NvciBhbmQgdHJhbnNtaXR0ZWQgdG8gdGhlIGRlY29tcHJlc3NvcgorICAgYnkgc29tZSBtZWNoYW5pc20gb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBjb21wcmVzc2lvbiBsaWJyYXJ5LikKKyAgIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgYnVmZmVyLgorCisgICAgIHVuY29tcHJlc3MgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKKyAgIGVub3VnaCBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dAorICAgYnVmZmVyLCBvciBaX0RBVEFfRVJST1IgaWYgdGhlIGlucHV0IGRhdGEgd2FzIGNvcnJ1cHRlZC4KKyovCitpbnQgWkVYUE9SVCB1bmNvbXByZXNzIChkZXN0LCBkZXN0TGVuLCBzb3VyY2UsIHNvdXJjZUxlbikKKyAgICBCeXRlZiAqZGVzdDsKKyAgICB1TG9uZ2YgKmRlc3RMZW47CisgICAgY29uc3QgQnl0ZWYgKnNvdXJjZTsKKyAgICB1TG9uZyBzb3VyY2VMZW47Cit7CisgICAgel9zdHJlYW0gc3RyZWFtOworICAgIGludCBlcnI7CisKKyAgICBzdHJlYW0ubmV4dF9pbiA9ICh6X2NvbnN0IEJ5dGVmICopc291cmNlOworICAgIHN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXNvdXJjZUxlbjsKKyAgICAvKiBDaGVjayBmb3Igc291cmNlID4gNjRLIG9uIDE2LWJpdCBtYWNoaW5lOiAqLworICAgIGlmICgodUxvbmcpc3RyZWFtLmF2YWlsX2luICE9IHNvdXJjZUxlbikgcmV0dXJuIFpfQlVGX0VSUk9SOworCisgICAgc3RyZWFtLm5leHRfb3V0ID0gZGVzdDsKKyAgICBzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpKmRlc3RMZW47CisgICAgaWYgKCh1TG9uZylzdHJlYW0uYXZhaWxfb3V0ICE9ICpkZXN0TGVuKSByZXR1cm4gWl9CVUZfRVJST1I7CisKKyAgICBzdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKKyAgICBzdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CisKKyAgICBlcnIgPSBpbmZsYXRlSW5pdCgmc3RyZWFtKTsKKyAgICBpZiAoZXJyICE9IFpfT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBpbmZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKTsKKyAgICBpZiAoZXJyICE9IFpfU1RSRUFNX0VORCkgeworICAgICAgICBpbmZsYXRlRW5kKCZzdHJlYW0pOworICAgICAgICBpZiAoZXJyID09IFpfTkVFRF9ESUNUIHx8IChlcnIgPT0gWl9CVUZfRVJST1IgJiYgc3RyZWFtLmF2YWlsX2luID09IDApKQorICAgICAgICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgKmRlc3RMZW4gPSBzdHJlYW0udG90YWxfb3V0OworCisgICAgZXJyID0gaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKyAgICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvd2F0Y29tL3dhdGNvbV9mLm1hayBiL3psaWIvc3JjL3dhdGNvbS93YXRjb21fZi5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdmNGQ3NAotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL3dhdGNvbS93YXRjb21fZi5tYWsKQEAgLTAsMCArMSw0MyBAQAorIyBNYWtlZmlsZSBmb3IgemxpYgorIyBPcGVuV2F0Y29tIGZsYXQgbW9kZWwKKyMgTGFzdCB1cGRhdGVkOiAyOC1EZWMtMjAwNQorCisjIFRvIHVzZSwgZG8gIndtYWtlIC1mIHdhdGNvbV9mLm1hayIKKworQ19TT1VSQ0UgPSAgYWRsZXIzMi5jICBjb21wcmVzcy5jIGNyYzMyLmMgICBkZWZsYXRlLmMgICAgJgorCSAgICBnemNsb3NlLmMgIGd6bGliLmMgICAgZ3pyZWFkLmMgIGd6d3JpdGUuYyAgICAmCisgICAgICAgICAgICBpbmZiYWNrLmMgIGluZmZhc3QuYyAgaW5mbGF0ZS5jIGluZnRyZWVzLmMgICAmCisgICAgICAgICAgICB0cmVlcy5jICAgIHVuY29tcHIuYyAgenV0aWwuYworCitPQkpTID0gICAgICBhZGxlcjMyLm9iaiAgY29tcHJlc3Mub2JqIGNyYzMyLm9iaiAgIGRlZmxhdGUub2JqICAgICYKKwkgICAgZ3pjbG9zZS5vYmogIGd6bGliLm9iaiAgICBnenJlYWQub2JqICBnendyaXRlLm9iaiAgICAmCisgICAgICAgICAgICBpbmZiYWNrLm9iaiAgaW5mZmFzdC5vYmogIGluZmxhdGUub2JqIGluZnRyZWVzLm9iaiAgICYKKyAgICAgICAgICAgIHRyZWVzLm9iaiAgICB1bmNvbXByLm9iaiAgenV0aWwub2JqCisKK0NDICAgICAgID0gd2NjMzg2CitMSU5LRVIgICA9IHdjbDM4NgorQ0ZMQUdTICAgPSAtenEgLW1mIC0zciAtZnAzIC1zIC1idD1kb3MgLW9pbHJ0Zm0gLWZyPW51bCAtd3gKK1pMSUJfTElCID0gemxpYl9mLmxpYgorCisuQy5PQko6CisgICAgICAgICQoQ0MpICQoQ0ZMQUdTKSAkW0AKKworYWxsOiAkKFpMSUJfTElCKSBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKKworJChaTElCX0xJQik6ICQoT0JKUykKKwl3bGliIC1iIC1jICQoWkxJQl9MSUIpIC0rYWRsZXIzMi5vYmogIC0rY29tcHJlc3Mub2JqIC0rY3JjMzIub2JqCisJd2xpYiAtYiAtYyAkKFpMSUJfTElCKSAtK2d6Y2xvc2Uub2JqICAtK2d6bGliLm9iaiAgICAtK2d6cmVhZC5vYmogICAtK2d6d3JpdGUub2JqCisgICAgICAgIHdsaWIgLWIgLWMgJChaTElCX0xJQikgLStkZWZsYXRlLm9iaiAgLStpbmZiYWNrLm9iagorICAgICAgICB3bGliIC1iIC1jICQoWkxJQl9MSUIpIC0raW5mZmFzdC5vYmogIC0raW5mbGF0ZS5vYmogIC0raW5mdHJlZXMub2JqCisgICAgICAgIHdsaWIgLWIgLWMgJChaTElCX0xJQikgLSt0cmVlcy5vYmogICAgLSt1bmNvbXByLm9iaiAgLSt6dXRpbC5vYmoKKworZXhhbXBsZS5leGU6ICQoWkxJQl9MSUIpIGV4YW1wbGUub2JqCisJJChMSU5LRVIpIC1sZG9zMzJhIC1mZT1leGFtcGxlLmV4ZSBleGFtcGxlLm9iaiAkKFpMSUJfTElCKQorCittaW5pZ3ppcC5leGU6ICQoWkxJQl9MSUIpIG1pbmlnemlwLm9iagorCSQoTElOS0VSKSAtbGRvczMyYSAtZmU9bWluaWd6aXAuZXhlIG1pbmlnemlwLm9iaiAkKFpMSUJfTElCKQorCitjbGVhbjogLlNZTUJPTElDCisgICAgICAgICAgZGVsICoub2JqCisgICAgICAgICAgZGVsICQoWkxJQl9MSUIpCisgICAgICAgICAgQGVjaG8gQ2xlYW5pbmcgZG9uZQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvd2F0Y29tL3dhdGNvbV9sLm1hayBiL3psaWIvc3JjL3dhdGNvbS93YXRjb21fbC5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkzZWVkNwotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL3dhdGNvbS93YXRjb21fbC5tYWsKQEAgLTAsMCArMSw0MyBAQAorIyBNYWtlZmlsZSBmb3IgemxpYgorIyBPcGVuV2F0Y29tIGxhcmdlIG1vZGVsCisjIExhc3QgdXBkYXRlZDogMjgtRGVjLTIwMDUKKworIyBUbyB1c2UsIGRvICJ3bWFrZSAtZiB3YXRjb21fbC5tYWsiCisKK0NfU09VUkNFID0gIGFkbGVyMzIuYyAgY29tcHJlc3MuYyBjcmMzMi5jICAgZGVmbGF0ZS5jICAgICYKKwkgICAgZ3pjbG9zZS5jICBnemxpYi5jICAgIGd6cmVhZC5jICBnendyaXRlLmMgICAgJgorICAgICAgICAgICAgaW5mYmFjay5jICBpbmZmYXN0LmMgIGluZmxhdGUuYyBpbmZ0cmVlcy5jICAgJgorICAgICAgICAgICAgdHJlZXMuYyAgICB1bmNvbXByLmMgIHp1dGlsLmMKKworT0JKUyA9ICAgICAgYWRsZXIzMi5vYmogIGNvbXByZXNzLm9iaiBjcmMzMi5vYmogICBkZWZsYXRlLm9iaiAgICAmCisJICAgIGd6Y2xvc2Uub2JqICBnemxpYi5vYmogICAgZ3pyZWFkLm9iaiAgZ3p3cml0ZS5vYmogICAgJgorICAgICAgICAgICAgaW5mYmFjay5vYmogIGluZmZhc3Qub2JqICBpbmZsYXRlLm9iaiBpbmZ0cmVlcy5vYmogICAmCisgICAgICAgICAgICB0cmVlcy5vYmogICAgdW5jb21wci5vYmogIHp1dGlsLm9iagorCitDQyAgICAgICA9IHdjYworTElOS0VSICAgPSB3Y2wKK0NGTEFHUyAgID0gLXpxIC1tbCAtcyAtYnQ9ZG9zIC1vaWxydGZtIC1mcj1udWwgLXd4CitaTElCX0xJQiA9IHpsaWJfbC5saWIKKworLkMuT0JKOgorICAgICAgICAkKENDKSAkKENGTEFHUykgJFtACisKK2FsbDogJChaTElCX0xJQikgZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCisKKyQoWkxJQl9MSUIpOiAkKE9CSlMpCisJd2xpYiAtYiAtYyAkKFpMSUJfTElCKSAtK2FkbGVyMzIub2JqICAtK2NvbXByZXNzLm9iaiAtK2NyYzMyLm9iagorCXdsaWIgLWIgLWMgJChaTElCX0xJQikgLStnemNsb3NlLm9iaiAgLStnemxpYi5vYmogICAgLStnenJlYWQub2JqICAgLStnendyaXRlLm9iagorICAgICAgICB3bGliIC1iIC1jICQoWkxJQl9MSUIpIC0rZGVmbGF0ZS5vYmogIC0raW5mYmFjay5vYmoKKyAgICAgICAgd2xpYiAtYiAtYyAkKFpMSUJfTElCKSAtK2luZmZhc3Qub2JqICAtK2luZmxhdGUub2JqICAtK2luZnRyZWVzLm9iagorICAgICAgICB3bGliIC1iIC1jICQoWkxJQl9MSUIpIC0rdHJlZXMub2JqICAgIC0rdW5jb21wci5vYmogIC0renV0aWwub2JqCisKK2V4YW1wbGUuZXhlOiAkKFpMSUJfTElCKSBleGFtcGxlLm9iagorCSQoTElOS0VSKSAtZmU9ZXhhbXBsZS5leGUgZXhhbXBsZS5vYmogJChaTElCX0xJQikKKworbWluaWd6aXAuZXhlOiAkKFpMSUJfTElCKSBtaW5pZ3ppcC5vYmoKKwkkKExJTktFUikgLWZlPW1pbmlnemlwLmV4ZSBtaW5pZ3ppcC5vYmogJChaTElCX0xJQikKKworY2xlYW46IC5TWU1CT0xJQworICAgICAgICAgIGRlbCAqLm9iagorICAgICAgICAgIGRlbCAkKFpMSUJfTElCKQorICAgICAgICAgIEBlY2hvIENsZWFuaW5nIGRvbmUKZGlmZiAtLWdpdCBhL3psaWIvc3JjL3dpbjMyL0RMTF9GQVEudHh0IGIvemxpYi9zcmMvd2luMzIvRExMX0ZBUS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjMDA5MAotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL3dpbjMyL0RMTF9GQVEudHh0CkBAIC0wLDAgKzEsMzk3IEBACisKKyAgICAgICAgICAgIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zIGFib3V0IFpMSUIxLkRMTAorCisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBkZXNpZ24sIHRoZSByYXRpb25hbGUsIGFuZCB0aGUgdXNhZ2UKK29mIHRoZSBvZmZpY2lhbCBETEwgYnVpbGQgb2YgemxpYiwgbmFtZWQgWkxJQjEuRExMLiAgSWYgeW91IGhhdmUKK2dlbmVyYWwgcXVlc3Rpb25zIGFib3V0IHpsaWIsIHlvdSBzaG91bGQgc2VlIHRoZSBmaWxlICJGQVEiIGZvdW5kCitpbiB0aGUgemxpYiBkaXN0cmlidXRpb24sIG9yIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb246CisgIGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi96bGliX2ZhcS5odG1sCisKKworIDEuIFdoYXQgaXMgWkxJQjEuRExMLCBhbmQgaG93IGNhbiBJIGdldCBpdD8KKworICAtIFpMSUIxLkRMTCBpcyB0aGUgb2ZmaWNpYWwgYnVpbGQgb2YgemxpYiBhcyBhIERMTC4KKyAgICAoUGxlYXNlIHJlbWFyayB0aGUgY2hhcmFjdGVyICcxJyBpbiB0aGUgbmFtZS4pCisKKyAgICBQb2ludGVycyB0byBhIHByZWNvbXBpbGVkIFpMSUIxLkRMTCBjYW4gYmUgZm91bmQgaW4gdGhlIHpsaWIKKyAgICB3ZWIgc2l0ZSBhdDoKKyAgICAgIGh0dHA6Ly93d3cuemxpYi5uZXQvCisKKyAgICBBcHBsaWNhdGlvbnMgdGhhdCBsaW5rIHRvIFpMSUIxLkRMTCBjYW4gcmVseSBvbiB0aGUgZm9sbG93aW5nCisgICAgc3BlY2lmaWNhdGlvbjoKKworICAgICogVGhlIGV4cG9ydGVkIHN5bWJvbHMgYXJlIGV4Y2x1c2l2ZWx5IGRlZmluZWQgaW4gdGhlIHNvdXJjZQorICAgICAgZmlsZXMgInpsaWIuaCIgYW5kICJ6bGliLmRlZiIsIGZvdW5kIGluIGFuIG9mZmljaWFsIHpsaWIKKyAgICAgIHNvdXJjZSBkaXN0cmlidXRpb24uCisgICAgKiBUaGUgc3ltYm9scyBhcmUgZXhwb3J0ZWQgYnkgbmFtZSwgbm90IGJ5IG9yZGluYWwuCisgICAgKiBUaGUgZXhwb3J0ZWQgbmFtZXMgYXJlIHVuZGVjb3JhdGVkLgorICAgICogVGhlIGNhbGxpbmcgY29udmVudGlvbiBvZiBmdW5jdGlvbnMgaXMgIkMiIChDREVDTCkuCisgICAgKiBUaGUgWkxJQjEuRExMIGJpbmFyeSBpcyBsaW5rZWQgdG8gTVNWQ1JULkRMTC4KKworICAgIFRoZSBhcmNoaXZlIGluIHdoaWNoIFpMSUIxLkRMTCBpcyBidW5kbGVkIGNvbnRhaW5zIGNvbXBpbGVkCisgICAgdGVzdCBwcm9ncmFtcyB0aGF0IG11c3QgcnVuIHdpdGggYSB2YWxpZCBidWlsZCBvZiBaTElCMS5ETEwuCisgICAgSXQgaXMgcmVjb21tZW5kZWQgdG8gZG93bmxvYWQgdGhlIHByZWJ1aWx0IERMTCBmcm9tIHRoZSB6bGliCisgICAgd2ViIHNpdGUsIGluc3RlYWQgb2YgYnVpbGRpbmcgaXQgeW91cnNlbGYsIHRvIGF2b2lkIHBvdGVudGlhbAorICAgIGluY29tcGF0aWJpbGl0aWVzIHRoYXQgY291bGQgYmUgaW50cm9kdWNlZCBieSB5b3VyIGNvbXBpbGVyCisgICAgYW5kIGJ1aWxkIHNldHRpbmdzLiAgSWYgeW91IGRvIGJ1aWxkIHRoZSBETEwgeW91cnNlbGYsIHBsZWFzZQorICAgIG1ha2Ugc3VyZSB0aGF0IGl0IGNvbXBsaWVzIHdpdGggYWxsIHRoZSBhYm92ZSByZXF1aXJlbWVudHMsCisgICAgYW5kIGl0IHJ1bnMgd2l0aCB0aGUgcHJlY29tcGlsZWQgdGVzdCBwcm9ncmFtcywgYnVuZGxlZCB3aXRoCisgICAgdGhlIG9yaWdpbmFsIFpMSUIxLkRMTCBkaXN0cmlidXRpb24uCisKKyAgICBJZiwgZm9yIGFueSByZWFzb24sIHlvdSBuZWVkIHRvIGJ1aWxkIGFuIGluY29tcGF0aWJsZSBETEwsCisgICAgcGxlYXNlIHVzZSBhIGRpZmZlcmVudCBmaWxlIG5hbWUuCisKKworIDIuIFdoeSBkaWQgeW91IGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgRExMIHRvIFpMSUIxLkRMTD8KKyAgICBXaGF0IGhhcHBlbmVkIHRvIHRoZSBvbGQgWkxJQi5ETEw/CisKKyAgLSBUaGUgb2xkIFpMSUIuRExMLCBidWlsdCBmcm9tIHpsaWItMS4xLjQgb3IgZWFybGllciwgcmVxdWlyZWQKKyAgICBjb21waWxhdGlvbiBzZXR0aW5ncyB0aGF0IHdlcmUgaW5jb21wYXRpYmxlIHRvIHRob3NlIHVzZWQgYnkKKyAgICBhIHN0YXRpYyBidWlsZC4gIFRoZSBETEwgc2V0dGluZ3Mgd2VyZSBzdXBwb3NlZCB0byBiZSBlbmFibGVkCisgICAgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIFpMSUJfRExMLCBiZWZvcmUgaW5jbHVkaW5nICJ6bGliLmgiLgorICAgIEluY29ycmVjdCBoYW5kbGluZyBvZiB0aGlzIG1hY3JvIHdhcyBzaWxlbnRseSBhY2NlcHRlZCBhdAorICAgIGJ1aWxkIHRpbWUsIHJlc3VsdGluZyBpbiB0d28gbWFqb3IgcHJvYmxlbXM6CisKKyAgICAqIFpMSUJfRExMIHdhcyBtaXNzaW5nIGZyb20gdGhlIG9sZCBtYWtlZmlsZS4gIFdoZW4gYnVpbGRpbmcKKyAgICAgIHRoZSBETEwsIG5vdCBhbGwgcGVvcGxlIGFkZGVkIGl0IHRvIHRoZSBidWlsZCBvcHRpb25zLiAgSW4KKyAgICAgIGNvbnNlcXVlbmNlLCBpbmNvbXBhdGlibGUgaW5jYXJuYXRpb25zIG9mIFpMSUIuRExMIHN0YXJ0ZWQKKyAgICAgIHRvIGNpcmN1bGF0ZSBhcm91bmQgdGhlIG5ldC4KKworICAgICogV2hlbiBzd2l0Y2hpbmcgZnJvbSB1c2luZyB0aGUgc3RhdGljIGxpYnJhcnkgdG8gdXNpbmcgdGhlCisgICAgICBETEwsIGFwcGxpY2F0aW9ucyBoYWQgdG8gZGVmaW5lIHRoZSBaTElCX0RMTCBtYWNybyBhbmQKKyAgICAgIHRvIHJlY29tcGlsZSBhbGwgdGhlIHNvdXJjZXMgdGhhdCBjb250YWluZWQgY2FsbHMgdG8gemxpYgorICAgICAgZnVuY3Rpb25zLiAgRmFpbHVyZSB0byBkbyBzbyByZXN1bHRlZCBpbiBjcmVhdGluZyBiaW5hcmllcworICAgICAgdGhhdCB3ZXJlIHVuYWJsZSB0byBydW4gd2l0aCB0aGUgb2ZmaWNpYWwgWkxJQi5ETEwgYnVpbGQuCisKKyAgICBUaGUgb25seSBwb3NzaWJsZSBzb2x1dGlvbiB0aGF0IHdlIGNvdWxkIGZvcmVzZWUgd2FzIHRvIG1ha2UKKyAgICBhIGJpbmFyeS1pbmNvbXBhdGlibGUgY2hhbmdlIGluIHRoZSBETEwgaW50ZXJmYWNlLCBpbiBvcmRlciB0bworICAgIHJlbW92ZSB0aGUgZGVwZW5kZW5jeSBvbiB0aGUgWkxJQl9ETEwgbWFjcm8sIGFuZCB0byByZWxlYXNlCisgICAgdGhlIG5ldyBETEwgdW5kZXIgYSBkaWZmZXJlbnQgbmFtZS4KKworICAgIFdlIGNob3NlIHRoZSBuYW1lIFpMSUIxLkRMTCwgd2hlcmUgJzEnIGluZGljYXRlcyB0aGUgbWFqb3IKKyAgICB6bGliIHZlcnNpb24gbnVtYmVyLiAgV2UgaG9wZSB0aGF0IHdlIHdpbGwgbm90IGhhdmUgdG8gYnJlYWsKKyAgICB0aGUgYmluYXJ5IGNvbXBhdGliaWxpdHkgYWdhaW4sIGF0IGxlYXN0IG5vdCBhcyBsb25nIGFzIHRoZQorICAgIHpsaWItMS54IHNlcmllcyB3aWxsIGxhc3QuCisKKyAgICBUaGVyZSBpcyBzdGlsbCBhIFpMSUJfRExMIG1hY3JvLCB0aGF0IGNhbiB0cmlnZ2VyIGEgbW9yZQorICAgIGVmZmljaWVudCBidWlsZCBhbmQgdXNlIG9mIHRoZSBETEwsIGJ1dCBjb21wYXRpYmlsaXR5IG5vCisgICAgbG9uZ2VyIGRlcGVuZGVudHMgb24gaXQuCisKKworIDMuIENhbiBJIGJ1aWxkIFpMSUIuRExMIGZyb20gdGhlIG5ldyB6bGliIHNvdXJjZXMsIGFuZCByZXBsYWNlCisgICAgYW4gb2xkIFpMSUIuRExMLCB0aGF0IHdhcyBidWlsdCBmcm9tIHpsaWItMS4xLjQgb3IgZWFybGllcj8KKworICAtIEluIHByaW5jaXBsZSwgeW91IGNhbiBkbyBpdCBieSBhc3NpZ25pbmcgY2FsbGluZyBjb252ZW50aW9uCisgICAga2V5d29yZHMgdG8gdGhlIG1hY3JvcyBaRVhQT1JUIGFuZCBaRVhQT1JUVkEuICBJbiBwcmFjdGljZSwKKyAgICBpdCBkZXBlbmRzIG9uIHdoYXQgeW91IG1lYW4gYnkgImFuIG9sZCBaTElCLkRMTCIsIGJlY2F1c2UgdGhlCisgICAgb2xkIERMTCBleGlzdHMgaW4gc2V2ZXJhbCBtdXR1YWxseS1pbmNvbXBhdGlibGUgdmVyc2lvbnMuCisgICAgWW91IGhhdmUgdG8gZmluZCBvdXQgZmlyc3Qgd2hhdCBraW5kIG9mIGNhbGxpbmcgY29udmVudGlvbiBpcworICAgIGJlaW5nIHVzZWQgaW4geW91ciBwYXJ0aWN1bGFyIFpMSUIuRExMIGJ1aWxkLCBhbmQgdG8gdXNlIHRoZQorICAgIHNhbWUgb25lIGluIHRoZSBuZXcgYnVpbGQuICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRoaXMgaXMgYWxsCisgICAgYWJvdXQsIHlvdSBtaWdodCBiZSBiZXR0ZXIgb2ZmIGlmIHlvdSB3b3VsZCBqdXN0IGxlYXZlIHRoZSBvbGQKKyAgICBETEwgaW50YWN0LgorCisKKyA0LiBDYW4gSSBjb21waWxlIG15IGFwcGxpY2F0aW9uIHVzaW5nIHRoZSBuZXcgemxpYiBpbnRlcmZhY2UsIGFuZAorICAgIGxpbmsgaXQgdG8gYW4gb2xkIFpMSUIuRExMLCB0aGF0IHdhcyBidWlsdCBmcm9tIHpsaWItMS4xLjQgb3IKKyAgICBlYXJsaWVyPworCisgIC0gVGhlIG9mZmljaWFsIGFuc3dlciBpcyAibm8iOyB0aGUgcmVhbCBhbnN3ZXIgZGVwZW5kcyBhZ2FpbiBvbgorICAgIHdoYXQga2luZCBvZiBaTElCLkRMTCB5b3UgaGF2ZS4gIEV2ZW4gaWYgeW91IGFyZSBsdWNreSwgdGhpcworICAgIGNvdXJzZSBvZiBhY3Rpb24gaXMgdW5yZWxpYWJsZS4KKworICAgIElmIHlvdSByZWJ1aWxkIHlvdXIgYXBwbGljYXRpb24gYW5kIHlvdSBpbnRlbmQgdG8gdXNlIGEgbmV3ZXIKKyAgICB2ZXJzaW9uIG9mIHpsaWIgKHBvc3QtIDEuMS40KSwgaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8KKyAgICBsaW5rIGl0IHRvIHRoZSBuZXcgWkxJQjEuRExMLgorCisKKyA1LiBXaHkgYXJlIHRoZSB6bGliIHN5bWJvbHMgZXhwb3J0ZWQgYnkgbmFtZSwgYW5kIG5vdCBieSBvcmRpbmFsPworCisgIC0gQWx0aG91Z2ggZXhwb3J0aW5nIHN5bWJvbHMgYnkgb3JkaW5hbCBpcyBhIGxpdHRsZSBmYXN0ZXIsIGl0CisgICAgaXMgcmlza3kuICBBbnkgc2luZ2xlIGdsaXRjaCBpbiB0aGUgbWFpbnRlbmFuY2Ugb3IgdXNlIG9mIHRoZQorICAgIERFRiBmaWxlIHRoYXQgY29udGFpbnMgdGhlIG9yZGluYWxzIGNhbiByZXN1bHQgaW4gaW5jb21wYXRpYmxlCisgICAgYnVpbGRzIGFuZCBmcnVzdHJhdGluZyBjcmFzaGVzLiAgU2ltcGx5IHB1dCwgdGhlIGJlbmVmaXRzIG9mCisgICAgZXhwb3J0aW5nIHN5bWJvbHMgYnkgb3JkaW5hbCBkbyBub3QganVzdGlmeSB0aGUgcmlza3MuCisKKyAgICBUZWNobmljYWxseSwgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIG1haW50YWluIG9yZGluYWxzIGluCisgICAgdGhlIERFRiBmaWxlLCBhbmQgc3RpbGwgZXhwb3J0IHRoZSBzeW1ib2xzIGJ5IG5hbWUuICBPcmRpbmFscworICAgIGV4aXN0IGluIGV2ZXJ5IERMTCwgYW5kIGV2ZW4gaWYgdGhlIGR5bmFtaWMgbGlua2luZyBwZXJmb3JtZWQKKyAgICBhdCB0aGUgRExMIHN0YXJ0dXAgaXMgc2VhcmNoaW5nIGZvciBuYW1lcywgb3JkaW5hbHMgc2VydmUgYXMKKyAgICBoaW50cywgZm9yIGEgZmFzdGVyIG5hbWUgbG9va3VwLiAgSG93ZXZlciwgaWYgdGhlIERFRiBmaWxlCisgICAgY29udGFpbnMgb3JkaW5hbHMsIHRoZSBNaWNyb3NvZnQgbGlua2VyIGF1dG9tYXRpY2FsbHkgYnVpbGRzCisgICAgYW4gaW1wbGliIHRoYXQgd2lsbCBjYXVzZSB0aGUgZXhlY3V0YWJsZXMgbGlua2VkIHRvIGl0IHRvIHVzZQorICAgIHRob3NlIG9yZGluYWxzLCBhbmQgbm90IHRoZSBuYW1lcy4gIEl0IGlzIGludGVyZXN0aW5nIHRvCisgICAgbm90aWNlIHRoYXQgdGhlIEdOVSBsaW5rZXIgZm9yIFdpbjMyIGRvZXMgbm90IHN1ZmZlciBmcm9tIHRoaXMKKyAgICBwcm9ibGVtLgorCisgICAgSXQgaXMgcG9zc2libGUgdG8gYXZvaWQgdGhlIERFRiBmaWxlIGlmIHRoZSBleHBvcnRlZCBzeW1ib2xzCisgICAgYXJlIGFjY29tcGFuaWVkIGJ5IGEgIl9fZGVjbHNwZWMoZGxsZXhwb3J0KSIgYXR0cmlidXRlIGluIHRoZQorICAgIHNvdXJjZSBmaWxlcy4gIFlvdSBjYW4gZG8gdGhpcyBpbiB6bGliIGJ5IHByZWRlZmluaW5nIHRoZQorICAgIFpMSUJfRExMIG1hY3JvLgorCisKKyA2LiBJIHNlZSB0aGF0IHRoZSBaTElCMS5ETEwgZnVuY3Rpb25zIHVzZSB0aGUgIkMiIChDREVDTCkgY2FsbGluZworICAgIGNvbnZlbnRpb24uICBXaHkgbm90IHVzZSB0aGUgU1REQ0FMTCBjb252ZW50aW9uPworICAgIFNURENBTEwgaXMgdGhlIHN0YW5kYXJkIGNvbnZlbnRpb24gaW4gV2luMzIsIGFuZCBJIG5lZWQgaXQgaW4KKyAgICBteSBWaXN1YWwgQmFzaWMgcHJvamVjdCEKKworICAgIChGb3IgcmVhZGFiaWxpdHksIHdlIHVzZSBDREVDTCB0byByZWZlciB0byB0aGUgY29udmVudGlvbgorICAgICB0cmlnZ2VyZWQgYnkgdGhlICJfX2NkZWNsIiBrZXl3b3JkLCBTVERDQUxMIHRvIHJlZmVyIHRvCisgICAgIHRoZSBjb252ZW50aW9uIHRyaWdnZXJlZCBieSAiX19zdGRjYWxsIiwgYW5kIEZBU1RDQUxMIHRvCisgICAgIHJlZmVyIHRvIHRoZSBjb252ZW50aW9uIHRyaWdnZXJlZCBieSAiX19mYXN0Y2FsbCIuKQorCisgIC0gTW9zdCBvZiB0aGUgbmF0aXZlIFdpbmRvd3MgQVBJIGZ1bmN0aW9ucyAod2l0aG91dCB2YXJhcmdzKSB1c2UKKyAgICBpbmRlZWQgdGhlIFdJTkFQSSBjb252ZW50aW9uICh3aGljaCB0cmFuc2xhdGVzIHRvIFNURENBTEwgaW4KKyAgICBXaW4zMiksIGJ1dCB0aGUgc3RhbmRhcmQgQyBmdW5jdGlvbnMgdXNlIENERUNMLiAgSWYgYSB1c2VyCisgICAgYXBwbGljYXRpb24gaXMgaW50cmluc2ljYWxseSB0aWVkIHRvIHRoZSBXaW5kb3dzIEFQSSAoZS5nLgorICAgIGl0IGNhbGxzIG5hdGl2ZSBXaW5kb3dzIEFQSSBmdW5jdGlvbnMgc3VjaCBhcyBDcmVhdGVGaWxlKCkpLAorICAgIHNvbWV0aW1lcyBpdCBtYWtlcyBzZW5zZSB0byBkZWNvcmF0ZSBpdHMgb3duIGZ1bmN0aW9ucyB3aXRoCisgICAgV0lOQVBJLiAgQnV0IGlmIEFOU0kgQyBvciBQT1NJWCBwb3J0YWJpbGl0eSBpcyBhIGdvYWwgKGUuZy4KKyAgICBpdCBjYWxscyBzdGFuZGFyZCBDIGZ1bmN0aW9ucyBzdWNoIGFzIGZvcGVuKCkpLCBpdCBpcyBub3QgYQorICAgIHNvdW5kIGRlY2lzaW9uIHRvIHJlcXVlc3QgdGhlIGluY2x1c2lvbiBvZiA8d2luZG93cy5oPiwgb3IgdG8KKyAgICB1c2Ugbm9uLUFOU0kgY29uc3RydWN0cywgZm9yIHRoZSBzb2xlIHB1cnBvc2UgdG8gbWFrZSB0aGUgdXNlcgorICAgIGZ1bmN0aW9ucyBTVERDQUxMLWFibGUuCisKKyAgICBUaGUgZnVuY3Rpb25hbGl0eSBvZmZlcmVkIGJ5IHpsaWIgaXMgbm90IGluIHRoZSBjYXRlZ29yeSBvZgorICAgICJXaW5kb3dzIGZ1bmN0aW9uYWxpdHkiLCBidXQgaXMgbW9yZSBsaWtlICJDIGZ1bmN0aW9uYWxpdHkiLgorCisgICAgVGVjaG5pY2FsbHksIFNURENBTEwgaXMgbm90IGJhZDsgaW4gZmFjdCwgaXQgaXMgc2xpZ2h0bHkKKyAgICBmYXN0ZXIgdGhhbiBDREVDTCwgYW5kIGl0IHdvcmtzIHdpdGggdmFyaWFibGUtYXJndW1lbnQKKyAgICBmdW5jdGlvbnMsIGp1c3QgbGlrZSBDREVDTC4gIEl0IGlzIHVuZm9ydHVuYXRlIHRoYXQsIGluIHNwaXRlCisgICAgb2YgdXNpbmcgU1REQ0FMTCBpbiB0aGUgV2luZG93cyBBUEksIGl0IGlzIG5vdCB0aGUgZGVmYXVsdAorICAgIGNvbnZlbnRpb24gdXNlZCBieSB0aGUgQyBjb21waWxlcnMgdGhhdCBydW4gdW5kZXIgV2luZG93cy4KKyAgICBUaGUgcm9vdHMgb2YgdGhlIHByb2JsZW0gcmVzaWRlIGRlZXAgaW5zaWRlIHRoZSB1bnNhZmV0eSBvZgorICAgIHRoZSBLJlItc3R5bGUgZnVuY3Rpb24gcHJvdG90eXBlcywgd2hlcmUgdGhlIGFyZ3VtZW50IHR5cGVzCisgICAgYXJlIG5vdCBzcGVjaWZpZWQ7IGJ1dCB0aGF0IGlzIGFub3RoZXIgc3RvcnkgZm9yIGFub3RoZXIgZGF5LgorCisgICAgVGhlIHJlbWFpbmluZyBmYWN0IGlzIHRoYXQgQ0RFQ0wgaXMgdGhlIGRlZmF1bHQgY29udmVudGlvbi4KKyAgICBFdmVuIGlmIGFuIGV4cGxpY2l0IGNvbnZlbnRpb24gaXMgaGFyZC1jb2RlZCBpbnRvIHRoZSBmdW5jdGlvbgorICAgIHByb3RvdHlwZXMgaW5zaWRlIEMgaGVhZGVycywgcHJvYmxlbXMgbWF5IGFwcGVhci4gIFRoZQorICAgIG5lY2Vzc2l0eSB0byBleHBvc2UgdGhlIGNvbnZlbnRpb24gaW4gdXNlcnMnIGNhbGxiYWNrcyBpcyBvbmUKKyAgICBvZiB0aGVzZSBwcm9ibGVtcy4KKworICAgIFRoZSBjYWxsaW5nIGNvbnZlbnRpb24gaXNzdWVzIGFyZSBhbHNvIGltcG9ydGFudCB3aGVuIHVzaW5nCisgICAgemxpYiBpbiBvdGhlciBwcm9ncmFtbWluZyBsYW5ndWFnZXMuICBTb21lIG9mIHRoZW0sIGxpa2UgQWRhCisgICAgKEdOQVQpIGFuZCBGb3J0cmFuIChHTlUgRzc3KSwgaGF2ZSBDIGJpbmRpbmdzIGltcGxlbWVudGVkCisgICAgaW5pdGlhbGx5IG9uIFVuaXgsIGFuZCByZWx5aW5nIG9uIHRoZSBDIGNhbGxpbmcgY29udmVudGlvbi4KKyAgICBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIHByZS0gLk5FVCB2ZXJzaW9ucyBvZiBNaWNyb3NvZnQgVmlzdWFsCisgICAgQmFzaWMgcmVxdWlyZSBTVERDQUxMLCB3aGlsZSBCb3JsYW5kIERlbHBoaSBwcmVmZXJzLCBhbHRob3VnaAorICAgIGl0IGRvZXMgbm90IHJlcXVpcmUsIEZBU1RDQUxMLgorCisgICAgSW4gZmFpcm5lc3MgdG8gYWxsIHBvc3NpYmxlIHVzZXMgb2YgemxpYiBvdXRzaWRlIHRoZSBDCisgICAgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIHdlIGNob29zZSB0aGUgZGVmYXVsdCAiQyIgY29udmVudGlvbi4KKyAgICBBbnlvbmUgaW50ZXJlc3RlZCBpbiBkaWZmZXJlbnQgYmluZGluZ3Mgb3IgY29udmVudGlvbnMgaXMKKyAgICBlbmNvdXJhZ2VkIHRvIG1haW50YWluIHNwZWNpYWxpemVkIHByb2plY3RzLiAgVGhlICJjb250cmliLyIKKyAgICBkaXJlY3RvcnkgZnJvbSB0aGUgemxpYiBkaXN0cmlidXRpb24gYWxyZWFkeSBob2xkcyBhIGNvdXBsZQorICAgIG9mIGZvcmVpZ24gYmluZGluZ3MsIHN1Y2ggYXMgQWRhLCBDKyssIGFuZCBEZWxwaGkuCisKKworIDcuIEkgbmVlZCBhIERMTCBmb3IgbXkgVmlzdWFsIEJhc2ljIHByb2plY3QuICBXaGF0IGNhbiBJIGRvPworCisgIC0gRGVmaW5lIHRoZSBaTElCX1dJTkFQSSBtYWNybyBiZWZvcmUgaW5jbHVkaW5nICJ6bGliLmgiLCB3aGVuCisgICAgYnVpbGRpbmcgYm90aCB0aGUgRExMIGFuZCB0aGUgdXNlciBhcHBsaWNhdGlvbiAoZXhjZXB0IHRoYXQKKyAgICB5b3UgZG9uJ3QgbmVlZCB0byBkZWZpbmUgYW55dGhpbmcgd2hlbiB1c2luZyB0aGUgRExMIGluIFZpc3VhbAorICAgIEJhc2ljKS4gIFRoZSBaTElCX1dJTkFQSSBtYWNybyB3aWxsIHN3aXRjaCBvbiB0aGUgV0lOQVBJCisgICAgKFNURENBTEwpIGNvbnZlbnRpb24uICBUaGUgbmFtZSBvZiB0aGlzIERMTCBtdXN0IGJlIGRpZmZlcmVudAorICAgIHRoYW4gdGhlIG9mZmljaWFsIFpMSUIxLkRMTC4KKworICAgIEdpbGxlcyBWb2xsYW50IGhhcyBjb250cmlidXRlZCBhIGJ1aWxkIG5hbWVkIFpMSUJXQVBJLkRMTCwKKyAgICB3aXRoIHRoZSBaTElCX1dJTkFQSSBtYWNybyB0dXJuZWQgb24sIGFuZCB3aXRoIHRoZSBtaW5pemlwCisgICAgZnVuY3Rpb25hbGl0eSBidWlsdCBpbi4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVhZAorICAgIHRoZSBub3RlcyBpbnNpZGUgImNvbnRyaWIvdnN0dWRpby9yZWFkbWUudHh0IiwgZm91bmQgaW4gdGhlCisgICAgemxpYiBkaXN0cmlidXRpb24uCisKKworIDguIEkgbmVlZCB0byB1c2UgemxpYiBpbiBteSBNaWNyb3NvZnQgLk5FVCBwcm9qZWN0LiAgV2hhdCBjYW4gSQorICAgIGRvPworCisgIC0gSGVucmlrIFJhdm4gaGFzIGNvbnRyaWJ1dGVkIGEgLk5FVCB3cmFwcGVyIGFyb3VuZCB6bGliLiAgTG9vaworICAgIGludG8gY29udHJpYi9kb3R6bGliLywgaW5zaWRlIHRoZSB6bGliIGRpc3RyaWJ1dGlvbi4KKworCisgOS4gSWYgbXkgYXBwbGljYXRpb24gdXNlcyBaTElCMS5ETEwsIHNob3VsZCBJIGxpbmsgaXQgdG8KKyAgICBNU1ZDUlQuRExMPyAgV2h5PworCisgIC0gSXQgaXMgbm90IHJlcXVpcmVkLCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGluayB5b3VyCisgICAgYXBwbGljYXRpb24gdG8gTVNWQ1JULkRMTCwgaWYgaXQgdXNlcyBaTElCMS5ETEwuCisKKyAgICBUaGUgZXhlY3V0YWJsZXMgKC5FWEUsIC5ETEwsIGV0Yy4pIHRoYXQgYXJlIGludm9sdmVkIGluIHRoZQorICAgIHNhbWUgcHJvY2VzcyBhbmQgYXJlIHVzaW5nIHRoZSBDIHJ1bi10aW1lIGxpYnJhcnkgKGkuZS4gdGhleQorICAgIGFyZSBjYWxsaW5nIHN0YW5kYXJkIEMgZnVuY3Rpb25zKSwgbXVzdCBsaW5rIHRvIHRoZSBzYW1lCisgICAgbGlicmFyeS4gIFRoZXJlIGFyZSBzZXZlcmFsIGxpYnJhcmllcyBpbiB0aGUgV2luMzIgc3lzdGVtOgorICAgIENSVERMTC5ETEwsIE1TVkNSVC5ETEwsIHRoZSBzdGF0aWMgQyBsaWJyYXJpZXMsIGV0Yy4KKyAgICBTaW5jZSBaTElCMS5ETEwgaXMgbGlua2VkIHRvIE1TVkNSVC5ETEwsIHRoZSBleGVjdXRhYmxlcyB0aGF0CisgICAgZGVwZW5kIG9uIGl0IHNob3VsZCBhbHNvIGJlIGxpbmtlZCB0byBNU1ZDUlQuRExMLgorCisKKzEwLiBXaHkgYXJlIHlvdSBzYXlpbmcgdGhhdCBaTElCMS5ETEwgYW5kIG15IGFwcGxpY2F0aW9uIHNob3VsZAorICAgIGJlIGxpbmtlZCB0byB0aGUgc2FtZSBDIHJ1bi10aW1lIChDUlQpIGxpYnJhcnk/ICBJIGxpbmtlZCBteQorICAgIGFwcGxpY2F0aW9uIGFuZCBteSBETExzIHRvIGRpZmZlcmVudCBDIGxpYnJhcmllcyAoZS5nLiBteQorICAgIGFwcGxpY2F0aW9uIHRvIGEgc3RhdGljIGxpYnJhcnksIGFuZCBteSBETExzIHRvIE1TVkNSVC5ETEwpLAorICAgIGFuZCBldmVyeXRoaW5nIHdvcmtzIGZpbmUuCisKKyAgLSBJZiBhIHVzZXIgbGlicmFyeSBpbnZva2VzIG9ubHkgcHVyZSBXaW4zMiBBUEkgKGFjY2Vzc2libGUgdmlhCisgICAgPHdpbmRvd3MuaD4gYW5kIHRoZSByZWxhdGVkIGhlYWRlcnMpLCBpdHMgRExMIGJ1aWxkIHdpbGwgd29yaworICAgIGluIGFueSBjb250ZXh0LiAgQnV0IGlmIHRoaXMgbGlicmFyeSBpbnZva2VzIHN0YW5kYXJkIEMgQVBJLAorICAgIHRoaW5ncyBnZXQgbW9yZSBjb21wbGljYXRlZC4KKworICAgIFRoZXJlIGlzIGEgc2luZ2xlIFdpbjMyIGxpYnJhcnkgaW4gYSBXaW4zMiBzeXN0ZW0uICBFdmVyeQorICAgIGZ1bmN0aW9uIGluIHRoaXMgbGlicmFyeSByZXNpZGVzIGluIGEgc2luZ2xlIERMTCBtb2R1bGUsIHRoYXQKKyAgICBpcyBzYWZlIHRvIGNhbGwgZnJvbSBhbnl3aGVyZS4gIE9uIHRoZSBvdGhlciBoYW5kLCB0aGVyZSBhcmUKKyAgICBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUgQyBsaWJyYXJ5LCBhbmQgZWFjaCBvZiB0aGVtIGhhcyBpdHMKKyAgICBvd24gc2VwYXJhdGUgaW50ZXJuYWwgc3RhdGUuICBTdGFuZGFsb25lIGV4ZWN1dGFibGVzIGFuZCB1c2VyCisgICAgRExMcyB0aGF0IGNhbGwgc3RhbmRhcmQgQyBmdW5jdGlvbnMgbXVzdCBsaW5rIHRvIGEgQyBydW4tdGltZQorICAgIChDUlQpIGxpYnJhcnksIGJlIGl0IHN0YXRpYyBvciBzaGFyZWQgKERMTCkuICBJbnRlcm1peGluZworICAgIG9jY3VycyB3aGVuIGFuIGV4ZWN1dGFibGUgKG5vdCBuZWNlc3NhcmlseSBzdGFuZGFsb25lKSBhbmQgYQorICAgIERMTCBhcmUgbGlua2VkIHRvIGRpZmZlcmVudCBDUlRzLCBhbmQgYm90aCBhcmUgcnVubmluZyBpbiB0aGUKKyAgICBzYW1lIHByb2Nlc3MuCisKKyAgICBJbnRlcm1peGluZyBtdWx0aXBsZSBDUlRzIGlzIHBvc3NpYmxlLCBhcyBsb25nIGFzIHRoZWlyCisgICAgaW50ZXJuYWwgc3RhdGVzIGFyZSBrZXB0IGludGFjdC4gIFRoZSBNaWNyb3NvZnQgS25vd2xlZGdlIEJhc2UKKyAgICBhcnRpY2xlcyBLQjk0MjQ4ICJIT1dUTzogVXNlIHRoZSBDIFJ1bi1UaW1lIiBhbmQgS0IxNDA1ODQKKyAgICAiSE9XVE86IExpbmsgd2l0aCB0aGUgQ29ycmVjdCBDIFJ1bi1UaW1lIChDUlQpIExpYnJhcnkiCisgICAgbWVudGlvbiB0aGUgcG90ZW50aWFsIHByb2JsZW1zIHJhaXNlZCBieSBpbnRlcm1peGluZy4KKworICAgIElmIGludGVybWl4aW5nIHdvcmtzIGZvciB5b3UsIGl0J3MgYmVjYXVzZSB5b3VyIGFwcGxpY2F0aW9uCisgICAgYW5kIERMTHMgYXJlIGF2b2lkaW5nIHRoZSBjb3JydXB0aW9uIG9mIGVhY2ggb2YgdGhlIENSVHMnCisgICAgaW50ZXJuYWwgc3RhdGVzLCBtYXliZSBieSBjYXJlZnVsIGRlc2lnbiwgb3IgbWF5YmUgYnkgZm9ydHVuZS4KKworICAgIEFsc28gbm90ZSB0aGF0IGxpbmtpbmcgWkxJQjEuRExMIHRvIG5vbi1NaWNyb3NvZnQgQ1JUcywgc3VjaAorICAgIGFzIHRob3NlIHByb3ZpZGVkIGJ5IEJvcmxhbmQsIHJhaXNlcyBzaW1pbGFyIHByb2JsZW1zLgorCisKKzExLiBXaHkgYXJlIHlvdSBsaW5raW5nIFpMSUIxLkRMTCB0byBNU1ZDUlQuRExMPworCisgIC0gTVNWQ1JULkRMTCBleGlzdHMgb24gZXZlcnkgV2luZG93cyA5NSB3aXRoIGEgbmV3IHNlcnZpY2UgcGFjaworICAgIGluc3RhbGxlZCwgb3Igd2l0aCBNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIgNCBvciBsYXRlciwgYW5kCisgICAgb24gYWxsIG90aGVyIFdpbmRvd3MgNC54IG9yIGxhdGVyIChXaW5kb3dzIDk4LCBXaW5kb3dzIE5UIDQsCisgICAgb3IgbGF0ZXIpLiAgSXQgaXMgZnJlZWx5IGRpc3RyaWJ1dGFibGU7IGlmIG5vdCBwcmVzZW50IGluIHRoZQorICAgIHN5c3RlbSwgaXQgY2FuIGJlIGRvd25sb2FkZWQgZnJvbSBNaWNyb3NvZnQgb3IgZnJvbSBvdGhlcgorICAgIHNvZnR3YXJlIHByb3ZpZGVyIGZvciBmcmVlLgorCisgICAgVGhlIGZhY3QgdGhhdCBNU1ZDUlQuRExMIGRvZXMgbm90IGV4aXN0IG9uIGEgdmlyZ2luIFdpbmRvd3MgOTUKKyAgICBpcyBub3Qgc28gcHJvYmxlbWF0aWMuICBXaW5kb3dzIDk1IGlzIHNjYXJjZWx5IGZvdW5kIG5vd2FkYXlzLAorICAgIE1pY3Jvc29mdCBlbmRlZCBpdHMgc3VwcG9ydCBhIGxvbmcgdGltZSBhZ28sIGFuZCBtYW55IHJlY2VudAorICAgIGFwcGxpY2F0aW9ucyBmcm9tIHZhcmlvdXMgdmVuZG9ycywgaW5jbHVkaW5nIE1pY3Jvc29mdCwgZG8gbm90CisgICAgZXZlbiBydW4gb24gaXQuICBGdXJ0aGVybW9yZSwgbm8gc2VyaW91cyB1c2VyIHNob3VsZCBydW4KKyAgICBXaW5kb3dzIDk1IHdpdGhvdXQgYSBwcm9wZXIgdXBkYXRlIGluc3RhbGxlZC4KKworCisxMi4gV2h5IGFyZSB5b3Ugbm90IGxpbmtpbmcgWkxJQjEuRExMIHRvCisgICAgPDxteSBmYXZvcml0ZSBDIHJ1bi10aW1lIGxpYnJhcnk+PiA/CisKKyAgLSBXZSBjb25zaWRlcmVkIGFuZCBhYmFuZG9uZWQgdGhlIGZvbGxvd2luZyBhbHRlcm5hdGl2ZXM6CisKKyAgICAqIExpbmtpbmcgWkxJQjEuRExMIHRvIGEgc3RhdGljIEMgbGlicmFyeSAoTElCQy5MSUIsIG9yCisgICAgICBMSUJDTVQuTElCKSBpcyBub3QgYSBnb29kIG9wdGlvbi4gIFBlb3BsZSBhcmUgdXNpbmcgdGhlIERMTAorICAgICAgbWFpbmx5IHRvIHNhdmUgZGlzayBzcGFjZS4gIElmIHlvdSBhcmUgbGlua2luZyB5b3VyIHByb2dyYW0KKyAgICAgIHRvIGEgc3RhdGljIEMgbGlicmFyeSwgeW91IG1heSBhcyB3ZWxsIGNvbnNpZGVyIGxpbmtpbmcgemxpYgorICAgICAgaW4gc3RhdGljYWxseSwgdG9vLgorCisgICAgKiBMaW5raW5nIFpMSUIxLkRMTCB0byBDUlRETEwuRExMIGxvb2tzIGFwcGVhbGluZywgYmVjYXVzZQorICAgICAgQ1JURExMLkRMTCBpcyBwcmVzZW50IG9uIGV2ZXJ5IFdpbjMyIGluc3RhbGxhdGlvbi4KKyAgICAgIFVuZm9ydHVuYXRlbHksIGl0IGhhcyBhIHNlcmllcyBvZiBwcm9ibGVtczogaXQgZG9lcyBub3QKKyAgICAgIHdvcmsgcHJvcGVybHkgd2l0aCBNaWNyb3NvZnQncyBDKysgbGlicmFyaWVzLCBpdCBkb2VzIG5vdAorICAgICAgcHJvdmlkZSBzdXBwb3J0IGZvciA2NC1iaXQgZmlsZSBvZmZzZXRzLCAoYW5kIHNvIG9uLi4uKSwKKyAgICAgIGFuZCBNaWNyb3NvZnQgZGlzY29udGludWVkIGl0cyBzdXBwb3J0IGEgbG9uZyB0aW1lIGFnby4KKworICAgICogTGlua2luZyBaTElCMS5ETEwgdG8gTVNWQ1I3MC5ETEwgb3IgTVNWQ1I3MS5ETEwsIHN1cHBsaWVkCisgICAgICB3aXRoIHRoZSBNaWNyb3NvZnQgLk5FVCBwbGF0Zm9ybSwgYW5kIFZpc3VhbCBDKysgNy4wLzcuMSwKKyAgICAgIHJhaXNlcyBwcm9ibGVtcyByZWxhdGVkIHRvIHRoZSBzdGF0dXMgb2YgWkxJQjEuRExMIGFzIGEKKyAgICAgIHN5c3RlbSBjb21wb25lbnQuICBBY2NvcmRpbmcgdG8gdGhlIE1pY3Jvc29mdCBLbm93bGVkZ2UgQmFzZQorICAgICAgYXJ0aWNsZSBLQjMyNjkyMiAiSU5GTzogUmVkaXN0cmlidXRpb24gb2YgdGhlIFNoYXJlZCBDCisgICAgICBSdW50aW1lIENvbXBvbmVudCBpbiBWaXN1YWwgQysrIC5ORVQiLCBNU1ZDUjcwLkRMTCBhbmQKKyAgICAgIE1TVkNSNzEuRExMIGFyZSBub3Qgc3VwcG9zZWQgdG8gZnVuY3Rpb24gYXMgc3lzdGVtIERMTHMsCisgICAgICBiZWNhdXNlIHRoZXkgbWF5IGNsYXNoIHdpdGggTVNWQ1JULkRMTC4gIEluc3RlYWQsIHRoZQorICAgICAgYXBwbGljYXRpb24ncyBpbnN0YWxsZXIgaXMgc3VwcG9zZWQgdG8gcHV0IHRoZXNlIERMTHMKKyAgICAgIChpZiBuZWVkZWQpIGluIHRoZSBhcHBsaWNhdGlvbidzIHByaXZhdGUgZGlyZWN0b3J5LgorICAgICAgSWYgWkxJQjEuRExMIGRlcGVuZHMgb24gYSBub24tc3lzdGVtIHJ1bnRpbWUsIGl0IGNhbm5vdAorICAgICAgZnVuY3Rpb24gYXMgYSByZWRpc3RyaWJ1dGFibGUgc3lzdGVtIGNvbXBvbmVudC4KKworICAgICogTGlua2luZyBaTElCMS5ETEwgdG8gbm9uLU1pY3Jvc29mdCBydW50aW1lcywgc3VjaCBhcworICAgICAgQm9ybGFuZCdzLCBvciBDeWd3aW4ncywgcmFpc2VzIHByb2JsZW1zIHJlbGF0ZWQgdG8gdGhlCisgICAgICByZWxpYWJsZSBwcmVzZW5jZSBvZiB0aGVzZSBydW50aW1lcyBvbiBXaW4zMiBzeXN0ZW1zLgorICAgICAgSXQncyBlYXNpZXIgdG8gbGV0IHRoZSBETEwgYnVpbGQgb2YgemxpYiB1cCB0byB0aGUgcGVvcGxlCisgICAgICB3aG8gZGlzdHJpYnV0ZSB0aGVzZSBydW50aW1lcywgYW5kIHdobyBtYXkgcHJvY2VlZCBhcworICAgICAgZXhwbGFpbmVkIGluIHRoZSBhbnN3ZXIgdG8gUXVlc3Rpb24gMTQuCisKKworMTMuIElmIFpMSUIxLkRMTCBjYW5ub3QgYmUgbGlua2VkIHRvIE1TVkNSNzAuRExMIG9yIE1TVkNSNzEuRExMLAorICAgIGhvdyBjYW4gSSBidWlsZC91c2UgWkxJQjEuRExMIGluIE1pY3Jvc29mdCBWaXN1YWwgQysrIDcuMAorICAgIChWaXN1YWwgU3R1ZGlvIC5ORVQpIG9yIG5ld2VyPworCisgIC0gRHVlIHRvIHRoZSBwcm9ibGVtcyBleHBsYWluZWQgaW4gdGhlIE1pY3Jvc29mdCBLbm93bGVkZ2UgQmFzZQorICAgIGFydGljbGUgS0IzMjY5MjIgKHNlZSB0aGUgcHJldmlvdXMgYW5zd2VyKSwgdGhlIEMgcnVudGltZSB0aGF0CisgICAgY29tZXMgd2l0aCB0aGUgVkM3IGVudmlyb25tZW50IGlzIG5vIGxvbmdlciBjb25zaWRlcmVkIGEKKyAgICBzeXN0ZW0gY29tcG9uZW50LiAgVGhhdCBpcywgaXQgc2hvdWxkIG5vdCBiZSBhc3N1bWVkIHRoYXQgdGhpcworICAgIHJ1bnRpbWUgZXhpc3RzLCBvciBtYXkgYmUgaW5zdGFsbGVkIGluIGEgc3lzdGVtIGRpcmVjdG9yeS4KKyAgICBTaW5jZSBaTElCMS5ETEwgaXMgc3VwcG9zZWQgdG8gYmUgYSBzeXN0ZW0gY29tcG9uZW50LCBpdCBtYXkKKyAgICBub3QgZGVwZW5kIG9uIGEgbm9uLXN5c3RlbSBjb21wb25lbnQuCisKKyAgICBJbiBvcmRlciB0byBsaW5rIFpMSUIxLkRMTCBhbmQgeW91ciBhcHBsaWNhdGlvbiB0byBNU1ZDUlQuRExMCisgICAgaW4gVkM3LCB5b3UgbmVlZCB0aGUgbGlicmFyeSBvZiBWaXN1YWwgQysrIDYuMCBvciBvbGRlci4gIElmCisgICAgeW91IGRvbid0IGhhdmUgdGhpcyBsaWJyYXJ5IGF0IGhhbmQsIGl0J3MgcHJvYmFibHkgYmVzdCBub3QgdG8KKyAgICB1c2UgWkxJQjEuRExMLgorCisgICAgV2UgYXJlIGhvcGluZyB0aGF0LCBpbiB0aGUgZnV0dXJlLCBNaWNyb3NvZnQgd2lsbCBwcm92aWRlIGEKKyAgICB3YXkgdG8gYnVpbGQgYXBwbGljYXRpb25zIGxpbmtlZCB0byBhIHByb3BlciBzeXN0ZW0gcnVudGltZSwKKyAgICBmcm9tIHRoZSBWaXN1YWwgQysrIGVudmlyb25tZW50LiAgVW50aWwgdGhlbiwgeW91IGhhdmUgYQorICAgIGNvdXBsZSBvZiBhbHRlcm5hdGl2ZXMsIHN1Y2ggYXMgbGlua2luZyB6bGliIGluIHN0YXRpY2FsbHkuCisgICAgSWYgeW91ciBhcHBsaWNhdGlvbiByZXF1aXJlcyBkeW5hbWljIGxpbmtpbmcsIHlvdSBtYXkgcHJvY2VlZAorICAgIGFzIGV4cGxhaW5lZCBpbiB0aGUgYW5zd2VyIHRvIFF1ZXN0aW9uIDE0LgorCisKKzE0LiBJIG5lZWQgdG8gbGluayBteSBvd24gRExMIGJ1aWxkIHRvIGEgQ1JUIGRpZmZlcmVudCB0aGFuCisgICAgTVNWQ1JULkRMTC4gIFdoYXQgY2FuIEkgZG8/CisKKyAgLSBGZWVsIGZyZWUgdG8gcmVidWlsZCB0aGUgRExMIGZyb20gdGhlIHpsaWIgc291cmNlcywgYW5kIGxpbmsKKyAgICBpdCB0aGUgd2F5IHlvdSB3YW50LiAgWW91IHNob3VsZCwgaG93ZXZlciwgY2xlYXJseSBzdGF0ZSB0aGF0CisgICAgeW91ciBidWlsZCBpcyB1bm9mZmljaWFsLiAgWW91IHNob3VsZCBnaXZlIGl0IGEgZGlmZmVyZW50IGZpbGUKKyAgICBuYW1lLCBhbmQvb3IgaW5zdGFsbCBpdCBpbiBhIHByaXZhdGUgZGlyZWN0b3J5IHRoYXQgY2FuIGJlCisgICAgYWNjZXNzZWQgYnkgeW91ciBhcHBsaWNhdGlvbiBvbmx5LCBhbmQgaXMgbm90IHZpc2libGUgdG8gdGhlCisgICAgb3RoZXJzIChpLmUuIGl0J3MgbmVpdGhlciBpbiB0aGUgUEFUSCwgbm9yIGluIHRoZSBTWVNURU0gb3IKKyAgICBTWVNURU0zMiBkaXJlY3RvcmllcykuICBPdGhlcndpc2UsIHlvdXIgYnVpbGQgbWF5IGNsYXNoIHdpdGgKKyAgICBhcHBsaWNhdGlvbnMgdGhhdCBsaW5rIHRvIHRoZSBvZmZpY2lhbCBidWlsZC4KKworICAgIEZvciBleGFtcGxlLCBpbiBDeWd3aW4sIHpsaWIgaXMgbGlua2VkIHRvIHRoZSBDeWd3aW4gcnVudGltZQorICAgIENZR1dJTjEuRExMLCBhbmQgaXQgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIG5hbWUgQ1lHWi5ETEwuCisKKworMTUuIE1heSBJIGluY2x1ZGUgYWRkaXRpb25hbCBwaWVjZXMgb2YgY29kZSB0aGF0IEkgZmluZCB1c2VmdWwsCisgICAgbGluayB0aGVtIGluIFpMSUIxLkRMTCwgYW5kIGV4cG9ydCB0aGVtPworCisgIC0gTm8uICBBIGxlZ2l0aW1hdGUgYnVpbGQgb2YgWkxJQjEuRExMIG11c3Qgbm90IGluY2x1ZGUgY29kZQorICAgIHRoYXQgZG9lcyBub3Qgb3JpZ2luYXRlIGZyb20gdGhlIG9mZmljaWFsIHpsaWIgc291cmNlIGNvZGUuCisgICAgQnV0IHlvdSBjYW4gbWFrZSB5b3VyIG93biBwcml2YXRlIERMTCBidWlsZCwgdW5kZXIgYSBkaWZmZXJlbnQKKyAgICBmaWxlIG5hbWUsIGFzIHN1Z2dlc3RlZCBpbiB0aGUgcHJldmlvdXMgYW5zd2VyLgorCisgICAgRm9yIGV4YW1wbGUsIHpsaWIgaXMgYSBwYXJ0IG9mIHRoZSBWQ0wgbGlicmFyeSwgZGlzdHJpYnV0ZWQKKyAgICB3aXRoIEJvcmxhbmQgRGVscGhpIGFuZCBDKysgQnVpbGRlci4gIFRoZSBETEwgYnVpbGQgb2YgVkNMCisgICAgaXMgYSByZWRpc3RyaWJ1dGFibGUgZmlsZSwgbmFtZWQgVkNMeHguRExMLgorCisKKzE2LiBNYXkgSSByZW1vdmUgc29tZSBmdW5jdGlvbmFsaXR5IG91dCBvZiBaTElCMS5ETEwsIGJ5IGVuYWJsaW5nCisgICAgbWFjcm9zIGxpa2UgTk9fR1pDT01QUkVTUyBvciBOT19HWklQIGF0IGNvbXBpbGUgdGltZT8KKworICAtIE5vLiAgQSBsZWdpdGltYXRlIGJ1aWxkIG9mIFpMSUIxLkRMTCBtdXN0IHByb3ZpZGUgdGhlIGNvbXBsZXRlCisgICAgemxpYiBmdW5jdGlvbmFsaXR5LCBhcyBpbXBsZW1lbnRlZCBpbiB0aGUgb2ZmaWNpYWwgemxpYiBzb3VyY2UKKyAgICBjb2RlLiAgQnV0IHlvdSBjYW4gbWFrZSB5b3VyIG93biBwcml2YXRlIERMTCBidWlsZCwgdW5kZXIgYQorICAgIGRpZmZlcmVudCBmaWxlIG5hbWUsIGFzIHN1Z2dlc3RlZCBpbiB0aGUgcHJldmlvdXMgYW5zd2VyLgorCisKKzE3LiBJIG1hZGUgbXkgb3duIFpMSUIxLkRMTCBidWlsZC4gIENhbiBJIHRlc3QgaXQgZm9yIGNvbXBsaWFuY2U/CisKKyAgLSBXZSBwcmVmZXIgdGhhdCB5b3UgZG93bmxvYWQgdGhlIG9mZmljaWFsIERMTCBmcm9tIHRoZSB6bGliCisgICAgd2ViIHNpdGUuICBJZiB5b3UgbmVlZCBzb21ldGhpbmcgcGVjdWxpYXIgZnJvbSB0aGlzIERMTCwgeW91CisgICAgY2FuIHNlbmQgeW91ciBzdWdnZXN0aW9uIHRvIHRoZSB6bGliIG1haWxpbmcgbGlzdC4KKworICAgIEhvd2V2ZXIsIGluIGNhc2UgeW91IGRvIHJlYnVpbGQgdGhlIERMTCB5b3Vyc2VsZiwgeW91IGNhbiBydW4KKyAgICBpdCB3aXRoIHRoZSB0ZXN0IHByb2dyYW1zIGZvdW5kIGluIHRoZSBETEwgZGlzdHJpYnV0aW9uLgorICAgIFJ1bm5pbmcgdGhlc2UgdGVzdCBwcm9ncmFtcyBpcyBub3QgYSBndWFyYW50ZWUgb2YgY29tcGxpYW5jZSwKKyAgICBidXQgYSBmYWlsdXJlIGNhbiBpbXBseSBhIGRldGVjdGVkIHByb2JsZW0uCisKKyoqCisKK1RoaXMgZG9jdW1lbnQgaXMgd3JpdHRlbiBhbmQgbWFpbnRhaW5lZCBieQorQ29zbWluIFRydXRhIDxjb3NtaW50QGNzLnViYmNsdWoucm8+CmRpZmYgLS1naXQgYS96bGliL3NyYy93aW4zMi9NYWtlZmlsZS5ib3IgYi96bGliL3NyYy93aW4zMi9NYWtlZmlsZS5ib3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1MmJiYgotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL3dpbjMyL01ha2VmaWxlLmJvcgpAQCAtMCwwICsxLDExMCBAQAorIyBNYWtlZmlsZSBmb3IgemxpYgorIyBCb3JsYW5kIEMrKyBmb3IgV2luMzIKKyMKKyMgVXNhZ2U6CisjICBtYWtlIC1mIHdpbjMyL01ha2VmaWxlLmJvcgorIyAgbWFrZSAtZiB3aW4zMi9NYWtlZmlsZS5ib3IgTE9DQUxfWkxJQj0tREFTTVYgT0JKQT1tYXRjaC5vYmogT0JKUEE9K21hdGNoLm9iagorCisjIC0tLS0tLS0tLS0tLSBCb3JsYW5kIEMrKyAtLS0tLS0tLS0tLS0KKworIyBPcHRpb25hbCBub25zdGFuZGFyZCBwcmVwcm9jZXNzb3IgZmxhZ3MgKGUuZy4gLURNQVhfTUVNX0xFVkVMPTcpCisjIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgZW52aXJvbm1lbnQgdmlhICJzZXQgTE9DQUxfWkxJQj0tREZPTyIgb3IKKyMgYWRkZWQgdG8gdGhlIGRlY2xhcmF0aW9uIG9mIExPQyBoZXJlOgorTE9DID0gJChMT0NBTF9aTElCKQorCitDQyA9IGJjYzMyCitBUyA9IGJjYzMyCitMRCA9IGJjYzMyCitBUiA9IHRsaWIKK0NGTEFHUyAgPSAtYSAtZCAtay0gLU8yICQoTE9DKQorQVNGTEFHUyA9ICQoTE9DKQorTERGTEFHUyA9ICQoTE9DKQorCisKKyMgdmFyaWFibGVzCitaTElCX0xJQiA9IHpsaWIubGliCisKK09CSjEgPSBhZGxlcjMyLm9iaiBjb21wcmVzcy5vYmogY3JjMzIub2JqIGRlZmxhdGUub2JqIGd6Y2xvc2Uub2JqIGd6bGliLm9iaiBnenJlYWQub2JqCitPQkoyID0gZ3p3cml0ZS5vYmogaW5mYmFjay5vYmogaW5mZmFzdC5vYmogaW5mbGF0ZS5vYmogaW5mdHJlZXMub2JqIHRyZWVzLm9iaiB1bmNvbXByLm9iaiB6dXRpbC5vYmoKKyNPQkpBID0KK09CSlAxID0gK2FkbGVyMzIub2JqK2NvbXByZXNzLm9iaitjcmMzMi5vYmorZGVmbGF0ZS5vYmorZ3pjbG9zZS5vYmorZ3psaWIub2JqK2d6cmVhZC5vYmoKK09CSlAyID0gK2d6d3JpdGUub2JqK2luZmJhY2sub2JqK2luZmZhc3Qub2JqK2luZmxhdGUub2JqK2luZnRyZWVzLm9iait0cmVlcy5vYmordW5jb21wci5vYmorenV0aWwub2JqCisjT0JKUEE9CisKKworIyB0YXJnZXRzCithbGw6ICQoWkxJQl9MSUIpIGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQorCisuYy5vYmo6CisJJChDQykgLWMgJChDRkxBR1MpICQ8CisKKy5hc20ub2JqOgorCSQoQVMpIC1jICQoQVNGTEFHUykgJDwKKworYWRsZXIzMi5vYmo6IGFkbGVyMzIuYyB6bGliLmggemNvbmYuaAorCitjb21wcmVzcy5vYmo6IGNvbXByZXNzLmMgemxpYi5oIHpjb25mLmgKKworY3JjMzIub2JqOiBjcmMzMi5jIHpsaWIuaCB6Y29uZi5oIGNyYzMyLmgKKworZGVmbGF0ZS5vYmo6IGRlZmxhdGUuYyBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAorCitnemNsb3NlLm9iajogZ3pjbG9zZS5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCisKK2d6bGliLm9iajogZ3psaWIuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAorCitnenJlYWQub2JqOiBnenJlYWQuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAorCitnendyaXRlLm9iajogZ3p3cml0ZS5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCisKK2luZmJhY2sub2JqOiBpbmZiYWNrLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCisgaW5mZmFzdC5oIGluZmZpeGVkLmgKKworaW5mZmFzdC5vYmo6IGluZmZhc3QuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKKyBpbmZmYXN0LmgKKworaW5mbGF0ZS5vYmo6IGluZmxhdGUuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKKyBpbmZmYXN0LmggaW5mZml4ZWQuaAorCitpbmZ0cmVlcy5vYmo6IGluZnRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCisKK3RyZWVzLm9iajogdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGRlZmxhdGUuaCB0cmVlcy5oCisKK3VuY29tcHIub2JqOiB1bmNvbXByLmMgemxpYi5oIHpjb25mLmgKKworenV0aWwub2JqOiB6dXRpbC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKKworZXhhbXBsZS5vYmo6IHRlc3QvZXhhbXBsZS5jIHpsaWIuaCB6Y29uZi5oCisKK21pbmlnemlwLm9iajogdGVzdC9taW5pZ3ppcC5jIHpsaWIuaCB6Y29uZi5oCisKKworIyBGb3IgdGhlIHNha2Ugb2YgdGhlIG9sZCBCb3JsYW5kIG1ha2UsCisjIHRoZSBjb21tYW5kIGxpbmUgaXMgY3V0IHRvIGZpdCBpbiB0aGUgTVMtRE9TIDEyOCBieXRlIGxpbWl0OgorJChaTElCX0xJQik6ICQoT0JKMSkgJChPQkoyKSAkKE9CSkEpCisJLWRlbCAkKFpMSUJfTElCKQorCSQoQVIpICQoWkxJQl9MSUIpICQoT0JKUDEpCisJJChBUikgJChaTElCX0xJQikgJChPQkpQMikKKwkkKEFSKSAkKFpMSUJfTElCKSAkKE9CSlBBKQorCisKKyMgdGVzdGluZwordGVzdDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCisJZXhhbXBsZQorCWVjaG8gaGVsbG8gd29ybGQgfCBtaW5pZ3ppcCB8IG1pbmlnemlwIC1kCisKK2V4YW1wbGUuZXhlOiBleGFtcGxlLm9iaiAkKFpMSUJfTElCKQorCSQoTEQpICQoTERGTEFHUykgZXhhbXBsZS5vYmogJChaTElCX0xJQikKKworbWluaWd6aXAuZXhlOiBtaW5pZ3ppcC5vYmogJChaTElCX0xJQikKKwkkKExEKSAkKExERkxBR1MpIG1pbmlnemlwLm9iaiAkKFpMSUJfTElCKQorCisKKyMgY2xlYW51cAorY2xlYW46CisJLWRlbCAkKFpMSUJfTElCKQorCS1kZWwgKi5vYmoKKwktZGVsICouZXhlCisJLWRlbCAqLnRkcworCS1kZWwgemxpYi5iYWsKKwktZGVsIGZvby5negpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvd2luMzIvTWFrZWZpbGUuZ2NjIGIvemxpYi9zcmMvd2luMzIvTWFrZWZpbGUuZ2NjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMWRlZDYKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy93aW4zMi9NYWtlZmlsZS5nY2MKQEAgLTAsMCArMSwxODIgQEAKKyMgTWFrZWZpbGUgZm9yIHpsaWIsIGRlcml2ZWQgZnJvbSBNYWtlZmlsZS5kajIuCisjIE1vZGlmaWVkIGZvciBtaW5ndzMyIGJ5IEMuIFNwaWVsZXIsIDYvMTYvOTguCisjIFVwZGF0ZWQgZm9yIHpsaWIgMS4yLnggYnkgQ2hyaXN0aWFuIFNwaWVsZXIgYW5kIENvc21pbiBUcnV0YSwgTWFyLTIwMDMuCisjIExhc3QgdXBkYXRlZDogTWFyIDIwMTIuCisjIFRlc3RlZCB1bmRlciBDeWd3aW4gYW5kIE1pbkdXLgorCisjIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIEplYW4tbG91cCBHYWlsbHkuCisjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKworIyBUbyBjb21waWxlLCBvciB0byBjb21waWxlIGFuZCB0ZXN0LCB0eXBlIGZyb20gdGhlIHRvcCBsZXZlbCB6bGliIGRpcmVjdG9yeToKKyMKKyMgICBtYWtlIC1md2luMzIvTWFrZWZpbGUuZ2NjOyAgbWFrZSB0ZXN0IHRlc3RkbGwgLWZ3aW4zMi9NYWtlZmlsZS5nY2MKKyMKKyMgVG8gdXNlIHRoZSBhc20gY29kZSwgdHlwZToKKyMgICBjcCBjb250cmliL2FzbT84Ni9tYXRjaC5TIC4vbWF0Y2guUworIyAgIG1ha2UgTE9DPS1EQVNNViBPQkpBPW1hdGNoLm8gLWZ3aW4zMi9NYWtlZmlsZS5nY2MKKyMKKyMgVG8gaW5zdGFsbCBsaWJ6LmEsIHpjb25mLmggYW5kIHpsaWIuaCBpbiB0aGUgc3lzdGVtIGRpcmVjdG9yaWVzLCB0eXBlOgorIworIyAgIG1ha2UgaW5zdGFsbCAtZndpbjMyL01ha2VmaWxlLmdjYworIworIyBCSU5BUllfUEFUSCwgSU5DTFVERV9QQVRIIGFuZCBMSUJSQVJZX1BBVEggbXVzdCBiZSBzZXQuCisjCisjIFRvIGluc3RhbGwgdGhlIHNoYXJlZCBsaWIsIGFwcGVuZCBTSEFSRURfTU9ERT0xIHRvIHRoZSBtYWtlIGNvbW1hbmQgOgorIworIyAgIG1ha2UgaW5zdGFsbCAtZndpbjMyL01ha2VmaWxlLmdjYyBTSEFSRURfTU9ERT0xCisKKyMgTm90ZToKKyMgSWYgdGhlIHBsYXRmb3JtIGlzICpub3QqIE1pbkdXIChlLmcuIGl0IGlzIEN5Z3dpbiBvciBVV0lOKSwKKyMgdGhlIERMTCBuYW1lIHNob3VsZCBiZSBjaGFuZ2VkIGZyb20gInpsaWIxLmRsbCIuCisKK1NUQVRJQ0xJQiA9IGxpYnouYQorU0hBUkVETElCID0gemxpYjEuZGxsCitJTVBMSUIgICAgPSBsaWJ6LmRsbC5hCisKKyMKKyMgU2V0IHRvIDEgaWYgc2hhcmVkIG9iamVjdCBuZWVkcyB0byBiZSBpbnN0YWxsZWQKKyMKK1NIQVJFRF9NT0RFPTAKKworI0xPQyA9IC1EQVNNVgorI0xPQyA9IC1EREVCVUcgLWcKKworUFJFRklYID0KK0NDID0gJChQUkVGSVgpZ2NjCitDRkxBR1MgPSAkKExPQykgLU8zIC1XYWxsCisKK0FTID0gJChDQykKK0FTRkxBR1MgPSAkKExPQykgLVdhbGwKKworTEQgPSAkKENDKQorTERGTEFHUyA9ICQoTE9DKQorCitBUiA9ICQoUFJFRklYKWFyCitBUkZMQUdTID0gcmNzCisKK1JDID0gJChQUkVGSVgpd2luZHJlcworUkNGTEFHUyA9IC0tZGVmaW5lIEdDQ19XSU5EUkVTCisKK1NUUklQID0gJChQUkVGSVgpc3RyaXAKKworQ1AgPSBjcCAtZnAKKyMgSWYgR05VIGluc3RhbGwgaXMgYXZhaWxhYmxlLCByZXBsYWNlICQoQ1ApIHdpdGggaW5zdGFsbC4KK0lOU1RBTEwgPSAkKENQKQorUk0gPSBybSAtZgorCitwcmVmaXggPz0gL3Vzci9sb2NhbAorZXhlY19wcmVmaXggPSAkKHByZWZpeCkKKworT0JKUyA9IGFkbGVyMzIubyBjb21wcmVzcy5vIGNyYzMyLm8gZGVmbGF0ZS5vIGd6Y2xvc2UubyBnemxpYi5vIGd6cmVhZC5vIFwKKyAgICAgICBnendyaXRlLm8gaW5mYmFjay5vIGluZmZhc3QubyBpbmZsYXRlLm8gaW5mdHJlZXMubyB0cmVlcy5vIHVuY29tcHIubyB6dXRpbC5vCitPQkpBID0KKworYWxsOiAkKFNUQVRJQ0xJQikgJChTSEFSRURMSUIpICQoSU1QTElCKSBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUgZXhhbXBsZV9kLmV4ZSBtaW5pZ3ppcF9kLmV4ZQorCit0ZXN0OiBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKKwkuL2V4YW1wbGUKKwllY2hvIGhlbGxvIHdvcmxkIHwgLi9taW5pZ3ppcCB8IC4vbWluaWd6aXAgLWQKKwordGVzdGRsbDogZXhhbXBsZV9kLmV4ZSBtaW5pZ3ppcF9kLmV4ZQorCS4vZXhhbXBsZV9kCisJZWNobyBoZWxsbyB3b3JsZCB8IC4vbWluaWd6aXBfZCB8IC4vbWluaWd6aXBfZCAtZAorCisuYy5vOgorCSQoQ0MpICQoQ0ZMQUdTKSAtYyAtbyAkQCAkPAorCisuUy5vOgorCSQoQVMpICQoQVNGTEFHUykgLWMgLW8gJEAgJDwKKworJChTVEFUSUNMSUIpOiAkKE9CSlMpICQoT0JKQSkKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykgJChPQkpBKQorCiskKElNUExJQik6ICQoU0hBUkVETElCKQorCiskKFNIQVJFRExJQik6IHdpbjMyL3psaWIuZGVmICQoT0JKUykgJChPQkpBKSB6bGlicmMubworCSQoQ0MpIC1zaGFyZWQgLVdsLC0tb3V0LWltcGxpYiwkKElNUExJQikgJChMREZMQUdTKSBcCisJLW8gJEAgd2luMzIvemxpYi5kZWYgJChPQkpTKSAkKE9CSkEpIHpsaWJyYy5vCisJJChTVFJJUCkgJEAKKworZXhhbXBsZS5leGU6IGV4YW1wbGUubyAkKFNUQVRJQ0xJQikKKwkkKExEKSAkKExERkxBR1MpIC1vICRAIGV4YW1wbGUubyAkKFNUQVRJQ0xJQikKKwkkKFNUUklQKSAkQAorCittaW5pZ3ppcC5leGU6IG1pbmlnemlwLm8gJChTVEFUSUNMSUIpCisJJChMRCkgJChMREZMQUdTKSAtbyAkQCBtaW5pZ3ppcC5vICQoU1RBVElDTElCKQorCSQoU1RSSVApICRACisKK2V4YW1wbGVfZC5leGU6IGV4YW1wbGUubyAkKElNUExJQikKKwkkKExEKSAkKExERkxBR1MpIC1vICRAIGV4YW1wbGUubyAkKElNUExJQikKKwkkKFNUUklQKSAkQAorCittaW5pZ3ppcF9kLmV4ZTogbWluaWd6aXAubyAkKElNUExJQikKKwkkKExEKSAkKExERkxBR1MpIC1vICRAIG1pbmlnemlwLm8gJChJTVBMSUIpCisJJChTVFJJUCkgJEAKKworZXhhbXBsZS5vOiB0ZXN0L2V4YW1wbGUuYyB6bGliLmggemNvbmYuaAorCSQoQ0MpICQoQ0ZMQUdTKSAtSS4gLWMgLW8gJEAgdGVzdC9leGFtcGxlLmMKKworbWluaWd6aXAubzogdGVzdC9taW5pZ3ppcC5jIHpsaWIuaCB6Y29uZi5oCisJJChDQykgJChDRkxBR1MpIC1JLiAtYyAtbyAkQCB0ZXN0L21pbmlnemlwLmMKKworemxpYnJjLm86IHdpbjMyL3psaWIxLnJjCisJJChSQykgJChSQ0ZMQUdTKSAtbyAkQCB3aW4zMi96bGliMS5yYworCisuUEhPTlk6IGluc3RhbGwgdW5pbnN0YWxsIGNsZWFuCisKK2luc3RhbGw6IHpsaWIuaCB6Y29uZi5oICQoU1RBVElDTElCKSAkKElNUExJQikKKwlAaWYgdGVzdCAteiAiJChERVNURElSKSQoSU5DTFVERV9QQVRIKSIgLW8gLXogIiQoREVTVERJUikkKExJQlJBUllfUEFUSCkiIC1vIC16ICIkKERFU1RESVIpJChCSU5BUllfUEFUSCkiOyB0aGVuIFwKKwkJZWNobyBJTkNMVURFX1BBVEgsIExJQlJBUllfUEFUSCwgYW5kIEJJTkFSWV9QQVRIIG11c3QgYmUgc3BlY2lmaWVkOyBcCisJCWV4aXQgMTsgXAorCWZpCisJLUBta2RpciAtcCAnJChERVNURElSKSQoSU5DTFVERV9QQVRIKScKKwktQG1rZGlyIC1wICckKERFU1RESVIpJChMSUJSQVJZX1BBVEgpJyAnJChERVNURElSKSQoTElCUkFSWV9QQVRIKScvcGtnY29uZmlnCisJLWlmIFsgIiQoU0hBUkVEX01PREUpIiA9ICIxIiBdOyB0aGVuIFwKKwkJbWtkaXIgLXAgJyQoREVTVERJUikkKEJJTkFSWV9QQVRIKSc7IFwKKwkJJChJTlNUQUxMKSAkKFNIQVJFRExJQikgJyQoREVTVERJUikkKEJJTkFSWV9QQVRIKSc7IFwKKwkJJChJTlNUQUxMKSAkKElNUExJQikgJyQoREVTVERJUikkKExJQlJBUllfUEFUSCknOyBcCisJZmkKKwktJChJTlNUQUxMKSB6bGliLmggJyQoREVTVERJUikkKElOQ0xVREVfUEFUSCknCisJLSQoSU5TVEFMTCkgemNvbmYuaCAnJChERVNURElSKSQoSU5DTFVERV9QQVRIKScKKwktJChJTlNUQUxMKSAkKFNUQVRJQ0xJQikgJyQoREVTVERJUikkKExJQlJBUllfUEFUSCknCisJc2VkIFwKKwkJLWUgJ3N8QHByZWZpeEB8JHtwcmVmaXh9fGcnIFwKKwkJLWUgJ3N8QGV4ZWNfcHJlZml4QHwke2V4ZWNfcHJlZml4fXxnJyBcCisJCS1lICdzfEBsaWJkaXJAfCQoTElCUkFSWV9QQVRIKXxnJyBcCisJCS1lICdzfEBzaGFyZWRsaWJkaXJAfCQoTElCUkFSWV9QQVRIKXxnJyBcCisJCS1lICdzfEBpbmNsdWRlZGlyQHwkKElOQ0xVREVfUEFUSCl8ZycgXAorCQktZSAnc3xAVkVSU0lPTkB8J2BzZWQgLW4gLWUgJy9WRVJTSU9OICIvcy8uKiJcKC4qXCkiLiovXDEvcCcgemxpYi5oYCd8ZycgXAorCQl6bGliLnBjLmluID4gJyQoREVTVERJUikkKExJQlJBUllfUEFUSCknL3BrZ2NvbmZpZy96bGliLnBjCisKK3VuaW5zdGFsbDoKKwktaWYgWyAiJChTSEFSRURfTU9ERSkiID0gIjEiIF07IHRoZW4gXAorCQkkKFJNKSAnJChERVNURElSKSQoQklOQVJZX1BBVEgpJy8kKFNIQVJFRExJQik7IFwKKwkJJChSTSkgJyQoREVTVERJUikkKExJQlJBUllfUEFUSCknLyQoSU1QTElCKTsgXAorCWZpCisJLSQoUk0pICckKERFU1RESVIpJChJTkNMVURFX1BBVEgpJy96bGliLmgKKwktJChSTSkgJyQoREVTVERJUikkKElOQ0xVREVfUEFUSCknL3pjb25mLmgKKwktJChSTSkgJyQoREVTVERJUikkKExJQlJBUllfUEFUSCknLyQoU1RBVElDTElCKQorCitjbGVhbjoKKwktJChSTSkgJChTVEFUSUNMSUIpCisJLSQoUk0pICQoU0hBUkVETElCKQorCS0kKFJNKSAkKElNUExJQikKKwktJChSTSkgKi5vCisJLSQoUk0pICouZXhlCisJLSQoUk0pIGZvby5negorCithZGxlcjMyLm86IHpsaWIuaCB6Y29uZi5oCitjb21wcmVzcy5vOiB6bGliLmggemNvbmYuaAorY3JjMzIubzogY3JjMzIuaCB6bGliLmggemNvbmYuaAorZGVmbGF0ZS5vOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAorZ3pjbG9zZS5vOiB6bGliLmggemNvbmYuaCBnemd1dHMuaAorZ3psaWIubzogemxpYi5oIHpjb25mLmggZ3pndXRzLmgKK2d6cmVhZC5vOiB6bGliLmggemNvbmYuaCBnemd1dHMuaAorZ3p3cml0ZS5vOiB6bGliLmggemNvbmYuaCBnemd1dHMuaAoraW5mZmFzdC5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIGluZmZhc3QuaAoraW5mbGF0ZS5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIGluZmZhc3QuaAoraW5mYmFjay5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIGluZmZhc3QuaAoraW5mdHJlZXMubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCit0cmVlcy5vOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaCB0cmVlcy5oCit1bmNvbXByLm86IHpsaWIuaCB6Y29uZi5oCit6dXRpbC5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCmRpZmYgLS1naXQgYS96bGliL3NyYy93aW4zMi9NYWtlZmlsZS5tc2MgYi96bGliL3NyYy93aW4zMi9NYWtlZmlsZS5tc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdiNzczMQotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL3dpbjMyL01ha2VmaWxlLm1zYwpAQCAtMCwwICsxLDE2MyBAQAorIyBNYWtlZmlsZSBmb3IgemxpYiB1c2luZyBNaWNyb3NvZnQgKFZpc3VhbCkgQworIyB6bGliIGlzIGNvcHlyaWdodCAoQykgMTk5NS0yMDA2IEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKKyMKKyMgVXNhZ2U6CisjICAgbm1ha2UgLWYgd2luMzIvTWFrZWZpbGUubXNjICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhbmRhcmQgYnVpbGQpCisjICAgbm1ha2UgLWYgd2luMzIvTWFrZWZpbGUubXNjIExPQz0tREZPTyAgICAgICAgICAgICAgICAobm9uc3RhbmRhcmQgYnVpbGQpCisjICAgbm1ha2UgLWYgd2luMzIvTWFrZWZpbGUubXNjIExPQz0iLURBU01WIC1EQVNNSU5GIiBcCisjICAgICAgICAgT0JKQT0iaW5mZmFzMzIub2JqIG1hdGNoNjg2Lm9iaiIgICAgICAgICAgICAgICAodXNlIEFTTSBjb2RlLCB4ODYpCisjICAgbm1ha2UgLWYgd2luMzIvTWFrZWZpbGUubXNjIEFTPW1sNjQgTE9DPSItREFTTVYgLURBU01JTkYgLUkuIiBcCisjICAgICAgICAgT0JKQT0iaW5mZmFzeDY0Lm9iaiBndm1hdDY0Lm9iaiBpbmZmYXM4NjY0Lm9iaiIgICh1c2UgQVNNIGNvZGUsIHg2NCkKKworIyBUaGUgdG9wbGV2ZWwgZGlyZWN0b3J5IG9mIHRoZSBzb3VyY2UgdHJlZS4KKyMKK1RPUCA9IC4KKworIyBvcHRpb25hbCBidWlsZCBmbGFncworTE9DID0KKworIyB2YXJpYWJsZXMKK1NUQVRJQ0xJQiA9IHpsaWIubGliCitTSEFSRURMSUIgPSB6bGliMS5kbGwKK0lNUExJQiAgICA9IHpkbGwubGliCisKK0NDID0gY2wKK0FTID0gbWwKK0xEID0gbGluaworQVIgPSBsaWIKK1JDID0gcmMKK0NGTEFHUyAgPSAtbm9sb2dvIC1NRCAtVzMgLU8yIC1PeS0gLVppIC1GZCJ6bGliIiAkKExPQykKK1dGTEFHUyAgPSAtRF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSAtRF9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEUKK0FTRkxBR1MgPSAtY29mZiAtWmkgJChMT0MpCitMREZMQUdTID0gLW5vbG9nbyAtZGVidWcgLWluY3JlbWVudGFsOm5vIC1vcHQ6cmVmCitBUkZMQUdTID0gLW5vbG9nbworUkNGTEFHUyA9IC9kV0lOMzIgL3IKKworT0JKUyA9IGFkbGVyMzIub2JqIGNvbXByZXNzLm9iaiBjcmMzMi5vYmogZGVmbGF0ZS5vYmogZ3pjbG9zZS5vYmogZ3psaWIub2JqIGd6cmVhZC5vYmogXAorICAgICAgIGd6d3JpdGUub2JqIGluZmJhY2sub2JqIGluZmxhdGUub2JqIGluZnRyZWVzLm9iaiBpbmZmYXN0Lm9iaiB0cmVlcy5vYmogdW5jb21wci5vYmogenV0aWwub2JqCitPQkpBID0KKworCisjIHRhcmdldHMKK2FsbDogJChTVEFUSUNMSUIpICQoU0hBUkVETElCKSAkKElNUExJQikgXAorICAgICBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUgZXhhbXBsZV9kLmV4ZSBtaW5pZ3ppcF9kLmV4ZQorCiskKFNUQVRJQ0xJQik6ICQoT0JKUykgJChPQkpBKQorCSQoQVIpICQoQVJGTEFHUykgLW91dDokQCAkKE9CSlMpICQoT0JKQSkKKworJChJTVBMSUIpOiAkKFNIQVJFRExJQikKKworJChTSEFSRURMSUIpOiAkKFRPUCkvd2luMzIvemxpYi5kZWYgJChPQkpTKSAkKE9CSkEpIHpsaWIxLnJlcworCSQoTEQpICQoTERGTEFHUykgLWRlZjokKFRPUCkvd2luMzIvemxpYi5kZWYgLWRsbCAtaW1wbGliOiQoSU1QTElCKSBcCisJICAtb3V0OiRAIC1iYXNlOjB4NUE0QzAwMDAgJChPQkpTKSAkKE9CSkEpIHpsaWIxLnJlcworCWlmIGV4aXN0ICRALm1hbmlmZXN0IFwKKwkgIG10IC1ub2xvZ28gLW1hbmlmZXN0ICRALm1hbmlmZXN0IC1vdXRwdXRyZXNvdXJjZTokQDsyCisKK2V4YW1wbGUuZXhlOiBleGFtcGxlLm9iaiAkKFNUQVRJQ0xJQikKKwkkKExEKSAkKExERkxBR1MpIGV4YW1wbGUub2JqICQoU1RBVElDTElCKQorCWlmIGV4aXN0ICRALm1hbmlmZXN0IFwKKwkgIG10IC1ub2xvZ28gLW1hbmlmZXN0ICRALm1hbmlmZXN0IC1vdXRwdXRyZXNvdXJjZTokQDsxCisKK21pbmlnemlwLmV4ZTogbWluaWd6aXAub2JqICQoU1RBVElDTElCKQorCSQoTEQpICQoTERGTEFHUykgbWluaWd6aXAub2JqICQoU1RBVElDTElCKQorCWlmIGV4aXN0ICRALm1hbmlmZXN0IFwKKwkgIG10IC1ub2xvZ28gLW1hbmlmZXN0ICRALm1hbmlmZXN0IC1vdXRwdXRyZXNvdXJjZTokQDsxCisKK2V4YW1wbGVfZC5leGU6IGV4YW1wbGUub2JqICQoSU1QTElCKQorCSQoTEQpICQoTERGTEFHUykgLW91dDokQCBleGFtcGxlLm9iaiAkKElNUExJQikKKwlpZiBleGlzdCAkQC5tYW5pZmVzdCBcCisJICBtdCAtbm9sb2dvIC1tYW5pZmVzdCAkQC5tYW5pZmVzdCAtb3V0cHV0cmVzb3VyY2U6JEA7MQorCittaW5pZ3ppcF9kLmV4ZTogbWluaWd6aXAub2JqICQoSU1QTElCKQorCSQoTEQpICQoTERGTEFHUykgLW91dDokQCBtaW5pZ3ppcC5vYmogJChJTVBMSUIpCisJaWYgZXhpc3QgJEAubWFuaWZlc3QgXAorCSAgbXQgLW5vbG9nbyAtbWFuaWZlc3QgJEAubWFuaWZlc3QgLW91dHB1dHJlc291cmNlOiRAOzEKKworeyQoVE9QKX0uYy5vYmo6CisJJChDQykgLWMgJChXRkxBR1MpICQoQ0ZMQUdTKSAkPAorCit7JChUT1ApL3Rlc3R9LmMub2JqOgorCSQoQ0MpIC1jIC1JJChUT1ApICQoV0ZMQUdTKSAkKENGTEFHUykgJDwKKworeyQoVE9QKS9jb250cmliL21hc214NjR9LmMub2JqOgorCSQoQ0MpIC1jICQoV0ZMQUdTKSAkKENGTEFHUykgJDwKKworeyQoVE9QKS9jb250cmliL21hc214NjR9LmFzbS5vYmo6CisJJChBUykgLWMgJChBU0ZMQUdTKSAkPAorCit7JChUT1ApL2NvbnRyaWIvbWFzbXg4Nn0uYXNtLm9iajoKKwkkKEFTKSAtYyAkKEFTRkxBR1MpICQ8CisKK2FkbGVyMzIub2JqOiAkKFRPUCkvYWRsZXIzMi5jICQoVE9QKS96bGliLmggJChUT1ApL3pjb25mLmgKKworY29tcHJlc3Mub2JqOiAkKFRPUCkvY29tcHJlc3MuYyAkKFRPUCkvemxpYi5oICQoVE9QKS96Y29uZi5oCisKK2NyYzMyLm9iajogJChUT1ApL2NyYzMyLmMgJChUT1ApL3psaWIuaCAkKFRPUCkvemNvbmYuaCAkKFRPUCkvY3JjMzIuaAorCitkZWZsYXRlLm9iajogJChUT1ApL2RlZmxhdGUuYyAkKFRPUCkvZGVmbGF0ZS5oICQoVE9QKS96dXRpbC5oICQoVE9QKS96bGliLmggJChUT1ApL3pjb25mLmgKKworZ3pjbG9zZS5vYmo6ICQoVE9QKS9nemNsb3NlLmMgJChUT1ApL3psaWIuaCAkKFRPUCkvemNvbmYuaCAkKFRPUCkvZ3pndXRzLmgKKworZ3psaWIub2JqOiAkKFRPUCkvZ3psaWIuYyAkKFRPUCkvemxpYi5oICQoVE9QKS96Y29uZi5oICQoVE9QKS9nemd1dHMuaAorCitnenJlYWQub2JqOiAkKFRPUCkvZ3pyZWFkLmMgJChUT1ApL3psaWIuaCAkKFRPUCkvemNvbmYuaCAkKFRPUCkvZ3pndXRzLmgKKworZ3p3cml0ZS5vYmo6ICQoVE9QKS9nendyaXRlLmMgJChUT1ApL3psaWIuaCAkKFRPUCkvemNvbmYuaCAkKFRPUCkvZ3pndXRzLmgKKworaW5mYmFjay5vYmo6ICQoVE9QKS9pbmZiYWNrLmMgJChUT1ApL3p1dGlsLmggJChUT1ApL3psaWIuaCAkKFRPUCkvemNvbmYuaCAkKFRPUCkvaW5mdHJlZXMuaCAkKFRPUCkvaW5mbGF0ZS5oIFwKKyAgICAgICAgICAgICAkKFRPUCkvaW5mZmFzdC5oICQoVE9QKS9pbmZmaXhlZC5oCisKK2luZmZhc3Qub2JqOiAkKFRPUCkvaW5mZmFzdC5jICQoVE9QKS96dXRpbC5oICQoVE9QKS96bGliLmggJChUT1ApL3pjb25mLmggJChUT1ApL2luZnRyZWVzLmggJChUT1ApL2luZmxhdGUuaCBcCisgICAgICAgICAgICAgJChUT1ApL2luZmZhc3QuaAorCitpbmZsYXRlLm9iajogJChUT1ApL2luZmxhdGUuYyAkKFRPUCkvenV0aWwuaCAkKFRPUCkvemxpYi5oICQoVE9QKS96Y29uZi5oICQoVE9QKS9pbmZ0cmVlcy5oICQoVE9QKS9pbmZsYXRlLmggXAorICAgICAgICAgICAgICQoVE9QKS9pbmZmYXN0LmggJChUT1ApL2luZmZpeGVkLmgKKworaW5mdHJlZXMub2JqOiAkKFRPUCkvaW5mdHJlZXMuYyAkKFRPUCkvenV0aWwuaCAkKFRPUCkvemxpYi5oICQoVE9QKS96Y29uZi5oICQoVE9QKS9pbmZ0cmVlcy5oCisKK3RyZWVzLm9iajogJChUT1ApL3RyZWVzLmMgJChUT1ApL3p1dGlsLmggJChUT1ApL3psaWIuaCAkKFRPUCkvemNvbmYuaCAkKFRPUCkvZGVmbGF0ZS5oICQoVE9QKS90cmVlcy5oCisKK3VuY29tcHIub2JqOiAkKFRPUCkvdW5jb21wci5jICQoVE9QKS96bGliLmggJChUT1ApL3pjb25mLmgKKworenV0aWwub2JqOiAkKFRPUCkvenV0aWwuYyAkKFRPUCkvenV0aWwuaCAkKFRPUCkvemxpYi5oICQoVE9QKS96Y29uZi5oCisKK2d2bWF0NjQub2JqOiAkKFRPUCkvY29udHJpYlxtYXNteDY0XGd2bWF0NjQuYXNtCisKK2luZmZhc3g2NC5vYmo6ICQoVE9QKS9jb250cmliXG1hc214NjRcaW5mZmFzeDY0LmFzbQorCitpbmZmYXM4NjY0Lm9iajogJChUT1ApL2NvbnRyaWJcbWFzbXg2NFxpbmZmYXM4NjY0LmMgJChUT1ApL3p1dGlsLmggJChUT1ApL3psaWIuaCAkKFRPUCkvemNvbmYuaCBcCisJCSQoVE9QKS9pbmZ0cmVlcy5oICQoVE9QKS9pbmZsYXRlLmggJChUT1ApL2luZmZhc3QuaAorCitpbmZmYXMzMi5vYmo6ICQoVE9QKS9jb250cmliXG1hc214ODZcaW5mZmFzMzIuYXNtCisKK21hdGNoNjg2Lm9iajogJChUT1ApL2NvbnRyaWJcbWFzbXg4NlxtYXRjaDY4Ni5hc20KKworZXhhbXBsZS5vYmo6ICQoVE9QKS90ZXN0L2V4YW1wbGUuYyAkKFRPUCkvemxpYi5oICQoVE9QKS96Y29uZi5oCisKK21pbmlnemlwLm9iajogJChUT1ApL3Rlc3QvbWluaWd6aXAuYyAkKFRPUCkvemxpYi5oICQoVE9QKS96Y29uZi5oCisKK3psaWIxLnJlczogJChUT1ApL3dpbjMyL3psaWIxLnJjCisJJChSQykgJChSQ0ZMQUdTKSAvZm8kQCAkKFRPUCkvd2luMzIvemxpYjEucmMKKworIyB0ZXN0aW5nCit0ZXN0OiBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKKwlleGFtcGxlCisJZWNobyBoZWxsbyB3b3JsZCB8IG1pbmlnemlwIHwgbWluaWd6aXAgLWQKKwordGVzdGRsbDogZXhhbXBsZV9kLmV4ZSBtaW5pZ3ppcF9kLmV4ZQorCWV4YW1wbGVfZAorCWVjaG8gaGVsbG8gd29ybGQgfCBtaW5pZ3ppcF9kIHwgbWluaWd6aXBfZCAtZAorCisKKyMgY2xlYW51cAorY2xlYW46CisJLWRlbCAkKFNUQVRJQ0xJQikKKwktZGVsICQoU0hBUkVETElCKQorCS1kZWwgJChJTVBMSUIpCisJLWRlbCAqLm9iagorCS1kZWwgKi5yZXMKKwktZGVsICouZXhwCisJLWRlbCAqLmV4ZQorCS1kZWwgKi5wZGIKKwktZGVsICoubWFuaWZlc3QKKwktZGVsIGZvby5negpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvd2luMzIvUkVBRE1FLVdJTjMyLnR4dCBiL3psaWIvc3JjL3dpbjMyL1JFQURNRS1XSU4zMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q3N2Q1MgotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL3dpbjMyL1JFQURNRS1XSU4zMi50eHQKQEAgLTAsMCArMSwxMDMgQEAKK1pMSUIgREFUQSBDT01QUkVTU0lPTiBMSUJSQVJZCisKK3psaWIgMS4yLjggaXMgYSBnZW5lcmFsIHB1cnBvc2UgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LiAgQWxsIHRoZSBjb2RlIGlzCit0aHJlYWQgc2FmZS4gIFRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkgaXMgZGVzY3JpYmVkIGJ5IFJGQ3MKKyhSZXF1ZXN0IGZvciBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlcworaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTk1MC50eHQgKHpsaWIgZm9ybWF0KSwgcmZjMTk1MS50eHQgKGRlZmxhdGUgZm9ybWF0KQorYW5kIHJmYzE5NTIudHh0IChnemlwIGZvcm1hdCkuCisKK0FsbCBmdW5jdGlvbnMgb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYXJlIGRvY3VtZW50ZWQgaW4gdGhlIGZpbGUgemxpYi5oCisodm9sdW50ZWVyIHRvIHdyaXRlIG1hbiBwYWdlcyB3ZWxjb21lLCBjb250YWN0IHpsaWJAZ3ppcC5vcmcpLiAgVHdvIGNvbXBpbGVkCitleGFtcGxlcyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhpcyBwYWNrYWdlLCBleGFtcGxlIGFuZCBtaW5pZ3ppcC4gIFRoZSBleGFtcGxlX2QKK2FuZCBtaW5pZ3ppcF9kIGZsYXZvcnMgdmFsaWRhdGUgdGhhdCB0aGUgemxpYjEuZGxsIGZpbGUgaXMgd29ya2luZyBjb3JyZWN0bHkuCisKK1F1ZXN0aW9ucyBhYm91dCB6bGliIHNob3VsZCBiZSBzZW50IHRvIDx6bGliQGd6aXAub3JnPi4gIFRoZSB6bGliIGhvbWUgcGFnZQoraXMgaHR0cDovL3psaWIubmV0LyAuICBCZWZvcmUgcmVwb3J0aW5nIGEgcHJvYmxlbSwgcGxlYXNlIGNoZWNrIHRoaXMgc2l0ZSB0bwordmVyaWZ5IHRoYXQgeW91IGhhdmUgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHpsaWI7IG90aGVyd2lzZSBnZXQgdGhlIGxhdGVzdAordmVyc2lvbiBhbmQgY2hlY2sgd2hldGhlciB0aGUgcHJvYmxlbSBzdGlsbCBleGlzdHMgb3Igbm90LgorCitQTEVBU0UgcmVhZCBETExfRkFRLnR4dCwgYW5kIHRoZSB0aGUgemxpYiBGQVEgaHR0cDovL3psaWIubmV0L3psaWJfZmFxLmh0bWwKK2JlZm9yZSBhc2tpbmcgZm9yIGhlbHAuCisKKworTWFuaWZlc3Q6CisKK1RoZSBwYWNrYWdlIHpsaWItMS4yLjgtd2luMzIteDg2LnppcCB3aWxsIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBmaWxlczoKKworICBSRUFETUUtV0lOMzIudHh0IFRoaXMgZG9jdW1lbnQKKyAgQ2hhbmdlTG9nICAgICAgICBDaGFuZ2VzIHNpbmNlIHByZXZpb3VzIHpsaWIgcGFja2FnZXMKKyAgRExMX0ZBUS50eHQgICAgICBGcmVxdWVudGx5IGFza2VkIHF1ZXN0aW9ucyBhYm91dCB6bGliMS5kbGwKKyAgemxpYi4zLnBkZiAgICAgICBEb2N1bWVudGF0aW9uIG9mIHRoaXMgbGlicmFyeSBpbiBBZG9iZSBBY3JvYmF0IGZvcm1hdAorCisgIGV4YW1wbGUuZXhlICAgICAgQSBzdGF0aWNhbGx5LWJvdW5kIGV4YW1wbGUgKHVzaW5nIHpsaWIubGliLCBub3QgdGhlIGRsbCkKKyAgZXhhbXBsZS5wZGIgICAgICBTeW1ib2xpYyBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIGV4YW1wbGUuZXhlCisKKyAgZXhhbXBsZV9kLmV4ZSAgICBBIHpsaWIxLmRsbCBib3VuZCBleGFtcGxlICh1c2luZyB6ZGxsLmxpYikKKyAgZXhhbXBsZV9kLnBkYiAgICBTeW1ib2xpYyBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIGV4YW1wbGVfZC5leGUKKworICBtaW5pZ3ppcC5leGUgICAgIEEgc3RhdGljYWxseS1ib3VuZCB0ZXN0IHByb2dyYW0gKHVzaW5nIHpsaWIubGliLCBub3QgdGhlIGRsbCkKKyAgbWluaWd6aXAucGRiICAgICBTeW1ib2xpYyBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIG1pbmlnemlwLmV4ZQorCisgIG1pbmlnemlwX2QuZXhlICAgQSB6bGliMS5kbGwgYm91bmQgdGVzdCBwcm9ncmFtICh1c2luZyB6ZGxsLmxpYikKKyAgbWluaWd6aXBfZC5wZGIgICBTeW1ib2xpYyBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIG1pbmlnemlwX2QuZXhlCisKKyAgemxpYi5oICAgICAgICAgICBJbnN0YWxsIHRoZXNlIGZpbGVzIGludG8gdGhlIGNvbXBpbGVycycgSU5DTFVERSBwYXRoIHRvCisgIHpjb25mLmggICAgICAgICAgY29tcGlsZSBwcm9ncmFtcyB3aGljaCB1c2UgemxpYi5saWIgb3IgemRsbC5saWIKKworICB6ZGxsLmxpYiAgICAgICAgIEluc3RhbGwgdGhlc2UgZmlsZXMgaW50byB0aGUgY29tcGlsZXJzJyBMSUIgcGF0aCBpZiBsaW5raW5nCisgIHpkbGwuZXhwICAgICAgICAgYSBjb21waWxlZCBwcm9ncmFtIHRvIHRoZSB6bGliMS5kbGwgYmluYXJ5CisKKyAgemxpYi5saWIgICAgICAgICBJbnN0YWxsIHRoZXNlIGZpbGVzIGludG8gdGhlIGNvbXBpbGVycycgTElCIHBhdGggdG8gbGluayB6bGliCisgIHpsaWIucGRiICAgICAgICAgaW50byBjb21waWxlZCBwcm9ncmFtcywgd2l0aG91dCB6bGliMS5kbGwgcnVudGltZSBkZXBlbmRlbmN5CisgICAgICAgICAgICAgICAgICAgKHpsaWIucGRiIHByb3ZpZGVzIGRlYnVnZ2luZyBpbmZvIHRvIHRoZSBjb21waWxlIHRpbWUgbGlua2VyKQorCisgIHpsaWIxLmRsbCAgICAgICAgSW5zdGFsbCB0aGlzIGJpbmFyeSBzaGFyZWQgbGlicmFyeSBpbnRvIHRoZSBzeXN0ZW0gUEFUSCwgb3IKKyAgICAgICAgICAgICAgICAgICB0aGUgcHJvZ3JhbSdzIHJ1bnRpbWUgZGlyZWN0b3J5ICh3aGVyZSB0aGUgLmV4ZSByZXNpZGVzKQorICB6bGliMS5wZGIgICAgICAgIEluc3RhbGwgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHpsaWIxLmRsbCwgaW4gb3JkZXIgdG8gZGVidWcKKyAgICAgICAgICAgICAgICAgICBhbiBhcHBsaWNhdGlvbiBjcmFzaCB1c2luZyBXaW5EYmcgb3Igc2ltaWxhciB0b29scy4KKworQWxsIC5wZGIgZmlsZXMgYWJvdmUgYXJlIGVudGlyZWx5IG9wdGlvbmFsLCBidXQgYXJlIHZlcnkgdXNlZnVsIHRvIGEgZGV2ZWxvcGVyCithdHRlbXB0aW5nIHRvIGRpYWdub3NlIHByb2dyYW0gbWlzYmVoYXZpb3Igb3IgYSBjcmFzaC4gIE1hbnkgYWRkaXRpb25hbAoraW1wb3J0YW50IGZpbGVzIGZvciBkZXZlbG9wZXJzIGNhbiBiZSBmb3VuZCBpbiB0aGUgemxpYjEyNy56aXAgc291cmNlIHBhY2thZ2UKK2F2YWlsYWJsZSBmcm9tIGh0dHA6Ly96bGliLm5ldC8gLSByZXZpZXcgdGhhdCBwYWNrYWdlJ3MgUkVBRE1FIGZpbGUgZm9yIGRldGFpbHMuCisKKworQWNrbm93bGVkZ21lbnRzOgorCitUaGUgZGVmbGF0ZSBmb3JtYXQgdXNlZCBieSB6bGliIHdhcyBkZWZpbmVkIGJ5IFBoaWwgS2F0ei4gIFRoZSBkZWZsYXRlIGFuZAoremxpYiBzcGVjaWZpY2F0aW9ucyB3ZXJlIHdyaXR0ZW4gYnkgTC4gIFBldGVyIERldXRzY2guICBUaGFua3MgdG8gYWxsIHRoZQorcGVvcGxlIHdobyByZXBvcnRlZCBwcm9ibGVtcyBhbmQgc3VnZ2VzdGVkIHZhcmlvdXMgaW1wcm92ZW1lbnRzIGluIHpsaWI7IHRoZXkKK2FyZSB0b28gbnVtZXJvdXMgdG8gY2l0ZSBoZXJlLgorCisKK0NvcHlyaWdodCBub3RpY2U6CisKKyAgKEMpIDE5OTUtMjAxMiBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyCisKKyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorCisgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCisgIEplYW4tbG91cCBHYWlsbHkgICAgICAgIE1hcmsgQWRsZXIKKyAgamxvdXBAZ3ppcC5vcmcgICAgICAgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQorCitJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCB3ZSB3b3VsZCBhcHByZWNpYXRlICpub3QqIHJlY2VpdmluZworbGVuZ3RoeSBsZWdhbCBkb2N1bWVudHMgdG8gc2lnbi4gIFRoZSBzb3VyY2VzIGFyZSBwcm92aWRlZCBmb3IgZnJlZSBidXQgd2l0aG91dAord2FycmFudHkgb2YgYW55IGtpbmQuICBUaGUgbGlicmFyeSBoYXMgYmVlbiBlbnRpcmVseSB3cml0dGVuIGJ5IEplYW4tbG91cAorR2FpbGx5IGFuZCBNYXJrIEFkbGVyOyBpdCBkb2VzIG5vdCBpbmNsdWRlIHRoaXJkLXBhcnR5IGNvZGUuCisKK0lmIHlvdSByZWRpc3RyaWJ1dGUgbW9kaWZpZWQgc291cmNlcywgd2Ugd291bGQgYXBwcmVjaWF0ZSB0aGF0IHlvdSBpbmNsdWRlIGluCit0aGUgZmlsZSBDaGFuZ2VMb2cgaGlzdG9yeSBpbmZvcm1hdGlvbiBkb2N1bWVudGluZyB5b3VyIGNoYW5nZXMuICBQbGVhc2UgcmVhZAordGhlIEZBUSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGlzdHJpYnV0aW9uIG9mIG1vZGlmaWVkIHNvdXJjZSB2ZXJzaW9ucy4KZGlmZiAtLWdpdCBhL3psaWIvc3JjL3dpbjMyL1Zpc3VhbEMudHh0IGIvemxpYi9zcmMvd2luMzIvVmlzdWFsQy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc5YTVmYwotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL3dpbjMyL1Zpc3VhbEMudHh0CkBAIC0wLDAgKzEsMyBAQAorCitUbyBidWlsZCB6bGliIHVzaW5nIHRoZSBNaWNyb3NvZnQgVmlzdWFsIEMrKyBlbnZpcm9ubWVudCwKK3VzZSB0aGUgYXBwcm9wcmlhdGUgcHJvamVjdCBmcm9tIHRoZSBwcm9qZWN0cy8gZGlyZWN0b3J5LgpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvd2luMzIvemxpYi5kZWYgYi96bGliL3NyYy93aW4zMi96bGliLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWNlNjU1Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvd2luMzIvemxpYi5kZWYKQEAgLTAsMCArMSw4NiBAQAorOyB6bGliIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeQorRVhQT1JUUworOyBiYXNpYyBmdW5jdGlvbnMKKyAgICB6bGliVmVyc2lvbgorICAgIGRlZmxhdGUKKyAgICBkZWZsYXRlRW5kCisgICAgaW5mbGF0ZQorICAgIGluZmxhdGVFbmQKKzsgYWR2YW5jZWQgZnVuY3Rpb25zCisgICAgZGVmbGF0ZVNldERpY3Rpb25hcnkKKyAgICBkZWZsYXRlQ29weQorICAgIGRlZmxhdGVSZXNldAorICAgIGRlZmxhdGVQYXJhbXMKKyAgICBkZWZsYXRlVHVuZQorICAgIGRlZmxhdGVCb3VuZAorICAgIGRlZmxhdGVQZW5kaW5nCisgICAgZGVmbGF0ZVByaW1lCisgICAgZGVmbGF0ZVNldEhlYWRlcgorICAgIGluZmxhdGVTZXREaWN0aW9uYXJ5CisgICAgaW5mbGF0ZUdldERpY3Rpb25hcnkKKyAgICBpbmZsYXRlU3luYworICAgIGluZmxhdGVDb3B5CisgICAgaW5mbGF0ZVJlc2V0CisgICAgaW5mbGF0ZVJlc2V0MgorICAgIGluZmxhdGVQcmltZQorICAgIGluZmxhdGVNYXJrCisgICAgaW5mbGF0ZUdldEhlYWRlcgorICAgIGluZmxhdGVCYWNrCisgICAgaW5mbGF0ZUJhY2tFbmQKKyAgICB6bGliQ29tcGlsZUZsYWdzCis7IHV0aWxpdHkgZnVuY3Rpb25zCisgICAgY29tcHJlc3MKKyAgICBjb21wcmVzczIKKyAgICBjb21wcmVzc0JvdW5kCisgICAgdW5jb21wcmVzcworICAgIGd6b3BlbgorICAgIGd6ZG9wZW4KKyAgICBnemJ1ZmZlcgorICAgIGd6c2V0cGFyYW1zCisgICAgZ3pyZWFkCisgICAgZ3p3cml0ZQorICAgIGd6cHJpbnRmCisgICAgZ3p2cHJpbnRmCisgICAgZ3pwdXRzCisgICAgZ3pnZXRzCisgICAgZ3pwdXRjCisgICAgZ3pnZXRjCisgICAgZ3p1bmdldGMKKyAgICBnemZsdXNoCisgICAgZ3pzZWVrCisgICAgZ3pyZXdpbmQKKyAgICBnenRlbGwKKyAgICBnem9mZnNldAorICAgIGd6ZW9mCisgICAgZ3pkaXJlY3QKKyAgICBnemNsb3NlCisgICAgZ3pjbG9zZV9yCisgICAgZ3pjbG9zZV93CisgICAgZ3plcnJvcgorICAgIGd6Y2xlYXJlcnIKKzsgbGFyZ2UgZmlsZSBmdW5jdGlvbnMKKyAgICBnem9wZW42NAorICAgIGd6c2VlazY0CisgICAgZ3p0ZWxsNjQKKyAgICBnem9mZnNldDY0CisgICAgYWRsZXIzMl9jb21iaW5lNjQKKyAgICBjcmMzMl9jb21iaW5lNjQKKzsgY2hlY2tzdW0gZnVuY3Rpb25zCisgICAgYWRsZXIzMgorICAgIGNyYzMyCisgICAgYWRsZXIzMl9jb21iaW5lCisgICAgY3JjMzJfY29tYmluZQorOyB2YXJpb3VzIGhhY2tzLCBkb24ndCBsb29rIDopCisgICAgZGVmbGF0ZUluaXRfCisgICAgZGVmbGF0ZUluaXQyXworICAgIGluZmxhdGVJbml0XworICAgIGluZmxhdGVJbml0Ml8KKyAgICBpbmZsYXRlQmFja0luaXRfCisgICAgZ3pnZXRjXworICAgIHpFcnJvcgorICAgIGluZmxhdGVTeW5jUG9pbnQKKyAgICBnZXRfY3JjX3RhYmxlCisgICAgaW5mbGF0ZVVuZGVybWluZQorICAgIGluZmxhdGVSZXNldEtlZXAKKyAgICBkZWZsYXRlUmVzZXRLZWVwCisgICAgZ3pvcGVuX3cKZGlmZiAtLWdpdCBhL3psaWIvc3JjL3dpbjMyL3psaWIxLnJjIGIvemxpYi9zcmMvd2luMzIvemxpYjEucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMwZmVlZAotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL3dpbjMyL3psaWIxLnJjCkBAIC0wLDAgKzEsNDAgQEAKKyNpbmNsdWRlIDx3aW52ZXIuaD4KKyNpbmNsdWRlICIuLi96bGliLmgiCisKKyNpZmRlZiBHQ0NfV0lORFJFUworVlNfVkVSU0lPTl9JTkZPCQlWRVJTSU9OSU5GTworI2Vsc2UKK1ZTX1ZFUlNJT05fSU5GTwkJVkVSU0lPTklORk8JTU9WRUFCTEUgSU1QVVJFIExPQURPTkNBTEwgRElTQ0FSREFCTEUKKyNlbmRpZgorICBGSUxFVkVSU0lPTgkJWkxJQl9WRVJfTUFKT1IsWkxJQl9WRVJfTUlOT1IsWkxJQl9WRVJfUkVWSVNJT04sMAorICBQUk9EVUNUVkVSU0lPTglaTElCX1ZFUl9NQUpPUixaTElCX1ZFUl9NSU5PUixaTElCX1ZFUl9SRVZJU0lPTiwwCisgIEZJTEVGTEFHU01BU0sJCVZTX0ZGSV9GSUxFRkxBR1NNQVNLCisjaWZkZWYgX0RFQlVHCisgIEZJTEVGTEFHUwkJMQorI2Vsc2UKKyAgRklMRUZMQUdTCQkwCisjZW5kaWYKKyAgRklMRU9TCQlWT1NfX1dJTkRPV1MzMgorICBGSUxFVFlQRQkJVkZUX0RMTAorICBGSUxFU1VCVFlQRQkJMAkvLyBub3QgdXNlZAorQkVHSU4KKyAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICBCRUdJTgorICAgIEJMT0NLICIwNDA5MDRFNCIKKyAgICAvL2xhbmd1YWdlIElEID0gVS5TLiBFbmdsaXNoLCBjaGFyIHNldCA9IFdpbmRvd3MsIE11bHRpbGluZ3VhbAorICAgIEJFR0lOCisgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwJInpsaWIgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5XDAiCisgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLAlaTElCX1ZFUlNJT04gIlwwIgorICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsCSJ6bGliMS5kbGxcMCIKKyAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsCSIoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgJiBNYXJrIEFkbGVyXDAiCisgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsCSJ6bGliMS5kbGxcMCIKKyAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsCSJ6bGliXDAiCisgICAgICBWQUxVRSAiUHJvZHVjdFZlcnNpb24iLAlaTElCX1ZFUlNJT04gIlwwIgorICAgICAgVkFMVUUgIkNvbW1lbnRzIiwJCSJGb3IgbW9yZSBpbmZvcm1hdGlvbiB2aXNpdCBodHRwOi8vd3d3LnpsaWIubmV0L1wwIgorICAgIEVORAorICBFTkQKKyAgQkxPQ0sgIlZhckZpbGVJbmZvIgorICBCRUdJTgorICAgIFZBTFVFICJUcmFuc2xhdGlvbiIsIDB4MDQwOSwgMTI1MgorICBFTkQKK0VORApkaWZmIC0tZ2l0IGEvemxpYi9zcmMvemNvbmYuaCBiL3psaWIvc3JjL3pjb25mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk2ZmZmMgotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL3pjb25mLmgKQEAgLTAsMCArMSw1MTEgQEAKKy8qIHpjb25mLmggLS0gY29uZmlndXJhdGlvbiBvZiB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5CisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5LgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qIEAoIykgJElkJCAqLworCisjaWZuZGVmIFpDT05GX0gKKyNkZWZpbmUgWkNPTkZfSAorCisvKgorICogSWYgeW91ICpyZWFsbHkqIG5lZWQgYSB1bmlxdWUgcHJlZml4IGZvciBhbGwgdHlwZXMgYW5kIGxpYnJhcnkgZnVuY3Rpb25zLAorICogY29tcGlsZSB3aXRoIC1EWl9QUkVGSVguIFRoZSAic3RhbmRhcmQiIHpsaWIgc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGhvdXQgaXQuCisgKiBFdmVuIGJldHRlciB0aGFuIGNvbXBpbGluZyB3aXRoIC1EWl9QUkVGSVggd291bGQgYmUgdG8gdXNlIGNvbmZpZ3VyZSB0byBzZXQKKyAqIHRoaXMgcGVybWFuZW50bHkgaW4gemNvbmYuaCB1c2luZyAiLi9jb25maWd1cmUgLS16cHJlZml4Ii4KKyAqLworI2lmZGVmIFpfUFJFRklYICAgICAvKiBtYXkgYmUgc2V0IHRvICNpZiAxIGJ5IC4vY29uZmlndXJlICovCisjICBkZWZpbmUgWl9QUkVGSVhfU0VUCisKKy8qIGFsbCBsaW5rZWQgc3ltYm9scyAqLworIyAgZGVmaW5lIF9kaXN0X2NvZGUgICAgICAgICAgICB6X19kaXN0X2NvZGUKKyMgIGRlZmluZSBfbGVuZ3RoX2NvZGUgICAgICAgICAgel9fbGVuZ3RoX2NvZGUKKyMgIGRlZmluZSBfdHJfYWxpZ24gICAgICAgICAgICAgel9fdHJfYWxpZ24KKyMgIGRlZmluZSBfdHJfZmx1c2hfYml0cyAgICAgICAgel9fdHJfZmx1c2hfYml0cworIyAgZGVmaW5lIF90cl9mbHVzaF9ibG9jayAgICAgICB6X190cl9mbHVzaF9ibG9jaworIyAgZGVmaW5lIF90cl9pbml0ICAgICAgICAgICAgICB6X190cl9pbml0CisjICBkZWZpbmUgX3RyX3N0b3JlZF9ibG9jayAgICAgIHpfX3RyX3N0b3JlZF9ibG9jaworIyAgZGVmaW5lIF90cl90YWxseSAgICAgICAgICAgICB6X190cl90YWxseQorIyAgZGVmaW5lIGFkbGVyMzIgICAgICAgICAgICAgICB6X2FkbGVyMzIKKyMgIGRlZmluZSBhZGxlcjMyX2NvbWJpbmUgICAgICAgel9hZGxlcjMyX2NvbWJpbmUKKyMgIGRlZmluZSBhZGxlcjMyX2NvbWJpbmU2NCAgICAgel9hZGxlcjMyX2NvbWJpbmU2NAorIyAgaWZuZGVmIFpfU09MTworIyAgICBkZWZpbmUgY29tcHJlc3MgICAgICAgICAgICAgIHpfY29tcHJlc3MKKyMgICAgZGVmaW5lIGNvbXByZXNzMiAgICAgICAgICAgICB6X2NvbXByZXNzMgorIyAgICBkZWZpbmUgY29tcHJlc3NCb3VuZCAgICAgICAgIHpfY29tcHJlc3NCb3VuZAorIyAgZW5kaWYKKyMgIGRlZmluZSBjcmMzMiAgICAgICAgICAgICAgICAgel9jcmMzMgorIyAgZGVmaW5lIGNyYzMyX2NvbWJpbmUgICAgICAgICB6X2NyYzMyX2NvbWJpbmUKKyMgIGRlZmluZSBjcmMzMl9jb21iaW5lNjQgICAgICAgel9jcmMzMl9jb21iaW5lNjQKKyMgIGRlZmluZSBkZWZsYXRlICAgICAgICAgICAgICAgel9kZWZsYXRlCisjICBkZWZpbmUgZGVmbGF0ZUJvdW5kICAgICAgICAgIHpfZGVmbGF0ZUJvdW5kCisjICBkZWZpbmUgZGVmbGF0ZUNvcHkgICAgICAgICAgIHpfZGVmbGF0ZUNvcHkKKyMgIGRlZmluZSBkZWZsYXRlRW5kICAgICAgICAgICAgel9kZWZsYXRlRW5kCisjICBkZWZpbmUgZGVmbGF0ZUluaXQyXyAgICAgICAgIHpfZGVmbGF0ZUluaXQyXworIyAgZGVmaW5lIGRlZmxhdGVJbml0XyAgICAgICAgICB6X2RlZmxhdGVJbml0XworIyAgZGVmaW5lIGRlZmxhdGVQYXJhbXMgICAgICAgICB6X2RlZmxhdGVQYXJhbXMKKyMgIGRlZmluZSBkZWZsYXRlUGVuZGluZyAgICAgICAgel9kZWZsYXRlUGVuZGluZworIyAgZGVmaW5lIGRlZmxhdGVQcmltZSAgICAgICAgICB6X2RlZmxhdGVQcmltZQorIyAgZGVmaW5lIGRlZmxhdGVSZXNldCAgICAgICAgICB6X2RlZmxhdGVSZXNldAorIyAgZGVmaW5lIGRlZmxhdGVSZXNldEtlZXAgICAgICB6X2RlZmxhdGVSZXNldEtlZXAKKyMgIGRlZmluZSBkZWZsYXRlU2V0RGljdGlvbmFyeSAgel9kZWZsYXRlU2V0RGljdGlvbmFyeQorIyAgZGVmaW5lIGRlZmxhdGVTZXRIZWFkZXIgICAgICB6X2RlZmxhdGVTZXRIZWFkZXIKKyMgIGRlZmluZSBkZWZsYXRlVHVuZSAgICAgICAgICAgel9kZWZsYXRlVHVuZQorIyAgZGVmaW5lIGRlZmxhdGVfY29weXJpZ2h0ICAgICB6X2RlZmxhdGVfY29weXJpZ2h0CisjICBkZWZpbmUgZ2V0X2NyY190YWJsZSAgICAgICAgIHpfZ2V0X2NyY190YWJsZQorIyAgaWZuZGVmIFpfU09MTworIyAgICBkZWZpbmUgZ3pfZXJyb3IgICAgICAgICAgICAgIHpfZ3pfZXJyb3IKKyMgICAgZGVmaW5lIGd6X2ludG1heCAgICAgICAgICAgICB6X2d6X2ludG1heAorIyAgICBkZWZpbmUgZ3pfc3Ryd2luZXJyb3IgICAgICAgIHpfZ3pfc3Ryd2luZXJyb3IKKyMgICAgZGVmaW5lIGd6YnVmZmVyICAgICAgICAgICAgICB6X2d6YnVmZmVyCisjICAgIGRlZmluZSBnemNsZWFyZXJyICAgICAgICAgICAgel9nemNsZWFyZXJyCisjICAgIGRlZmluZSBnemNsb3NlICAgICAgICAgICAgICAgel9nemNsb3NlCisjICAgIGRlZmluZSBnemNsb3NlX3IgICAgICAgICAgICAgel9nemNsb3NlX3IKKyMgICAgZGVmaW5lIGd6Y2xvc2VfdyAgICAgICAgICAgICB6X2d6Y2xvc2VfdworIyAgICBkZWZpbmUgZ3pkaXJlY3QgICAgICAgICAgICAgIHpfZ3pkaXJlY3QKKyMgICAgZGVmaW5lIGd6ZG9wZW4gICAgICAgICAgICAgICB6X2d6ZG9wZW4KKyMgICAgZGVmaW5lIGd6ZW9mICAgICAgICAgICAgICAgICB6X2d6ZW9mCisjICAgIGRlZmluZSBnemVycm9yICAgICAgICAgICAgICAgel9nemVycm9yCisjICAgIGRlZmluZSBnemZsdXNoICAgICAgICAgICAgICAgel9nemZsdXNoCisjICAgIGRlZmluZSBnemdldGMgICAgICAgICAgICAgICAgel9nemdldGMKKyMgICAgZGVmaW5lIGd6Z2V0Y18gICAgICAgICAgICAgICB6X2d6Z2V0Y18KKyMgICAgZGVmaW5lIGd6Z2V0cyAgICAgICAgICAgICAgICB6X2d6Z2V0cworIyAgICBkZWZpbmUgZ3pvZmZzZXQgICAgICAgICAgICAgIHpfZ3pvZmZzZXQKKyMgICAgZGVmaW5lIGd6b2Zmc2V0NjQgICAgICAgICAgICB6X2d6b2Zmc2V0NjQKKyMgICAgZGVmaW5lIGd6b3BlbiAgICAgICAgICAgICAgICB6X2d6b3BlbgorIyAgICBkZWZpbmUgZ3pvcGVuNjQgICAgICAgICAgICAgIHpfZ3pvcGVuNjQKKyMgICAgaWZkZWYgX1dJTjMyCisjICAgICAgZGVmaW5lIGd6b3Blbl93ICAgICAgICAgICAgICB6X2d6b3Blbl93CisjICAgIGVuZGlmCisjICAgIGRlZmluZSBnenByaW50ZiAgICAgICAgICAgICAgel9nenByaW50ZgorIyAgICBkZWZpbmUgZ3p2cHJpbnRmICAgICAgICAgICAgIHpfZ3p2cHJpbnRmCisjICAgIGRlZmluZSBnenB1dGMgICAgICAgICAgICAgICAgel9nenB1dGMKKyMgICAgZGVmaW5lIGd6cHV0cyAgICAgICAgICAgICAgICB6X2d6cHV0cworIyAgICBkZWZpbmUgZ3pyZWFkICAgICAgICAgICAgICAgIHpfZ3pyZWFkCisjICAgIGRlZmluZSBnenJld2luZCAgICAgICAgICAgICAgel9nenJld2luZAorIyAgICBkZWZpbmUgZ3pzZWVrICAgICAgICAgICAgICAgIHpfZ3pzZWVrCisjICAgIGRlZmluZSBnenNlZWs2NCAgICAgICAgICAgICAgel9nenNlZWs2NAorIyAgICBkZWZpbmUgZ3pzZXRwYXJhbXMgICAgICAgICAgIHpfZ3pzZXRwYXJhbXMKKyMgICAgZGVmaW5lIGd6dGVsbCAgICAgICAgICAgICAgICB6X2d6dGVsbAorIyAgICBkZWZpbmUgZ3p0ZWxsNjQgICAgICAgICAgICAgIHpfZ3p0ZWxsNjQKKyMgICAgZGVmaW5lIGd6dW5nZXRjICAgICAgICAgICAgICB6X2d6dW5nZXRjCisjICAgIGRlZmluZSBnendyaXRlICAgICAgICAgICAgICAgel9nendyaXRlCisjICBlbmRpZgorIyAgZGVmaW5lIGluZmxhdGUgICAgICAgICAgICAgICB6X2luZmxhdGUKKyMgIGRlZmluZSBpbmZsYXRlQmFjayAgICAgICAgICAgel9pbmZsYXRlQmFjaworIyAgZGVmaW5lIGluZmxhdGVCYWNrRW5kICAgICAgICB6X2luZmxhdGVCYWNrRW5kCisjICBkZWZpbmUgaW5mbGF0ZUJhY2tJbml0XyAgICAgIHpfaW5mbGF0ZUJhY2tJbml0XworIyAgZGVmaW5lIGluZmxhdGVDb3B5ICAgICAgICAgICB6X2luZmxhdGVDb3B5CisjICBkZWZpbmUgaW5mbGF0ZUVuZCAgICAgICAgICAgIHpfaW5mbGF0ZUVuZAorIyAgZGVmaW5lIGluZmxhdGVHZXRIZWFkZXIgICAgICB6X2luZmxhdGVHZXRIZWFkZXIKKyMgIGRlZmluZSBpbmZsYXRlSW5pdDJfICAgICAgICAgel9pbmZsYXRlSW5pdDJfCisjICBkZWZpbmUgaW5mbGF0ZUluaXRfICAgICAgICAgIHpfaW5mbGF0ZUluaXRfCisjICBkZWZpbmUgaW5mbGF0ZU1hcmsgICAgICAgICAgIHpfaW5mbGF0ZU1hcmsKKyMgIGRlZmluZSBpbmZsYXRlUHJpbWUgICAgICAgICAgel9pbmZsYXRlUHJpbWUKKyMgIGRlZmluZSBpbmZsYXRlUmVzZXQgICAgICAgICAgel9pbmZsYXRlUmVzZXQKKyMgIGRlZmluZSBpbmZsYXRlUmVzZXQyICAgICAgICAgel9pbmZsYXRlUmVzZXQyCisjICBkZWZpbmUgaW5mbGF0ZVNldERpY3Rpb25hcnkgIHpfaW5mbGF0ZVNldERpY3Rpb25hcnkKKyMgIGRlZmluZSBpbmZsYXRlR2V0RGljdGlvbmFyeSAgel9pbmZsYXRlR2V0RGljdGlvbmFyeQorIyAgZGVmaW5lIGluZmxhdGVTeW5jICAgICAgICAgICB6X2luZmxhdGVTeW5jCisjICBkZWZpbmUgaW5mbGF0ZVN5bmNQb2ludCAgICAgIHpfaW5mbGF0ZVN5bmNQb2ludAorIyAgZGVmaW5lIGluZmxhdGVVbmRlcm1pbmUgICAgICB6X2luZmxhdGVVbmRlcm1pbmUKKyMgIGRlZmluZSBpbmZsYXRlUmVzZXRLZWVwICAgICAgel9pbmZsYXRlUmVzZXRLZWVwCisjICBkZWZpbmUgaW5mbGF0ZV9jb3B5cmlnaHQgICAgIHpfaW5mbGF0ZV9jb3B5cmlnaHQKKyMgIGRlZmluZSBpbmZsYXRlX2Zhc3QgICAgICAgICAgel9pbmZsYXRlX2Zhc3QKKyMgIGRlZmluZSBpbmZsYXRlX3RhYmxlICAgICAgICAgel9pbmZsYXRlX3RhYmxlCisjICBpZm5kZWYgWl9TT0xPCisjICAgIGRlZmluZSB1bmNvbXByZXNzICAgICAgICAgICAgel91bmNvbXByZXNzCisjICBlbmRpZgorIyAgZGVmaW5lIHpFcnJvciAgICAgICAgICAgICAgICB6X3pFcnJvcgorIyAgaWZuZGVmIFpfU09MTworIyAgICBkZWZpbmUgemNhbGxvYyAgICAgICAgICAgICAgIHpfemNhbGxvYworIyAgICBkZWZpbmUgemNmcmVlICAgICAgICAgICAgICAgIHpfemNmcmVlCisjICBlbmRpZgorIyAgZGVmaW5lIHpsaWJDb21waWxlRmxhZ3MgICAgICB6X3psaWJDb21waWxlRmxhZ3MKKyMgIGRlZmluZSB6bGliVmVyc2lvbiAgICAgICAgICAgel96bGliVmVyc2lvbgorCisvKiBhbGwgemxpYiB0eXBlZGVmcyBpbiB6bGliLmggYW5kIHpjb25mLmggKi8KKyMgIGRlZmluZSBCeXRlICAgICAgICAgICAgICAgICAgel9CeXRlCisjICBkZWZpbmUgQnl0ZWYgICAgICAgICAgICAgICAgIHpfQnl0ZWYKKyMgIGRlZmluZSBhbGxvY19mdW5jICAgICAgICAgICAgel9hbGxvY19mdW5jCisjICBkZWZpbmUgY2hhcmYgICAgICAgICAgICAgICAgIHpfY2hhcmYKKyMgIGRlZmluZSBmcmVlX2Z1bmMgICAgICAgICAgICAgel9mcmVlX2Z1bmMKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgZGVmaW5lIGd6RmlsZSAgICAgICAgICAgICAgICB6X2d6RmlsZQorIyAgZW5kaWYKKyMgIGRlZmluZSBnel9oZWFkZXIgICAgICAgICAgICAgel9nel9oZWFkZXIKKyMgIGRlZmluZSBnel9oZWFkZXJwICAgICAgICAgICAgel9nel9oZWFkZXJwCisjICBkZWZpbmUgaW5fZnVuYyAgICAgICAgICAgICAgIHpfaW5fZnVuYworIyAgZGVmaW5lIGludGYgICAgICAgICAgICAgICAgICB6X2ludGYKKyMgIGRlZmluZSBvdXRfZnVuYyAgICAgICAgICAgICAgel9vdXRfZnVuYworIyAgZGVmaW5lIHVJbnQgICAgICAgICAgICAgICAgICB6X3VJbnQKKyMgIGRlZmluZSB1SW50ZiAgICAgICAgICAgICAgICAgel91SW50ZgorIyAgZGVmaW5lIHVMb25nICAgICAgICAgICAgICAgICB6X3VMb25nCisjICBkZWZpbmUgdUxvbmdmICAgICAgICAgICAgICAgIHpfdUxvbmdmCisjICBkZWZpbmUgdm9pZHAgICAgICAgICAgICAgICAgIHpfdm9pZHAKKyMgIGRlZmluZSB2b2lkcGMgICAgICAgICAgICAgICAgel92b2lkcGMKKyMgIGRlZmluZSB2b2lkcGYgICAgICAgICAgICAgICAgel92b2lkcGYKKworLyogYWxsIHpsaWIgc3RydWN0cyBpbiB6bGliLmggYW5kIHpjb25mLmggKi8KKyMgIGRlZmluZSBnel9oZWFkZXJfcyAgICAgICAgICAgel9nel9oZWFkZXJfcworIyAgZGVmaW5lIGludGVybmFsX3N0YXRlICAgICAgICB6X2ludGVybmFsX3N0YXRlCisKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX01TRE9TX18pICYmICFkZWZpbmVkKE1TRE9TKQorIyAgZGVmaW5lIE1TRE9TCisjZW5kaWYKKyNpZiAoZGVmaW5lZChPU18yKSB8fCBkZWZpbmVkKF9fT1MyX18pKSAmJiAhZGVmaW5lZChPUzIpCisjICBkZWZpbmUgT1MyCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9XSU5ET1dTKSAmJiAhZGVmaW5lZChXSU5ET1dTKQorIyAgZGVmaW5lIFdJTkRPV1MKKyNlbmRpZgorI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpIHx8IGRlZmluZWQoX19XSU4zMl9fKQorIyAgaWZuZGVmIFdJTjMyCisjICAgIGRlZmluZSBXSU4zMgorIyAgZW5kaWYKKyNlbmRpZgorI2lmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChXSU5ET1dTKSkgJiYgIWRlZmluZWQoV0lOMzIpCisjICBpZiAhZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19GTEFUX18pICYmICFkZWZpbmVkKF9fMzg2X18pCisjICAgIGlmbmRlZiBTWVMxNkJJVAorIyAgICAgIGRlZmluZSBTWVMxNkJJVAorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisvKgorICogQ29tcGlsZSB3aXRoIC1ETUFYU0VHXzY0SyBpZiB0aGUgYWxsb2MgZnVuY3Rpb24gY2Fubm90IGFsbG9jYXRlIG1vcmUKKyAqIHRoYW4gNjRrIGJ5dGVzIGF0IGEgdGltZSAobmVlZGVkIG9uIHN5c3RlbXMgd2l0aCAxNi1iaXQgaW50KS4KKyAqLworI2lmZGVmIFNZUzE2QklUCisjICBkZWZpbmUgTUFYU0VHXzY0SworI2VuZGlmCisjaWZkZWYgTVNET1MKKyMgIGRlZmluZSBVTkFMSUdORURfT0sKKyNlbmRpZgorCisjaWZkZWYgX19TVERDX1ZFUlNJT05fXworIyAgaWZuZGVmIFNUREMKKyMgICAgZGVmaW5lIFNUREMKKyMgIGVuZGlmCisjICBpZiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyMgICAgaWZuZGVmIFNUREM5OQorIyAgICAgIGRlZmluZSBTVERDOTkKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU5ET1dTKSB8fCBkZWZpbmVkKFdJTjMyKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoX19IT1NfQUlYX18pKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX09TNDAwX18pICYmICFkZWZpbmVkKFNUREMpICAgIC8qIGlTZXJpZXMgKGZvcm1lcmx5IEFTLzQwMCkuICovCisjICBkZWZpbmUgU1REQworI2VuZGlmCisKKyNpZm5kZWYgU1REQworIyAgaWZuZGVmIGNvbnN0IC8qIGNhbm5vdCB1c2UgIWRlZmluZWQoU1REQykgJiYgIWRlZmluZWQoY29uc3QpIG9uIE1hYyAqLworIyAgICBkZWZpbmUgY29uc3QgICAgICAgLyogbm90ZTogbmVlZCBhIG1vcmUgZ2VudGxlIHNvbHV0aW9uIGhlcmUgKi8KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoWkxJQl9DT05TVCkgJiYgIWRlZmluZWQoel9jb25zdCkKKyMgIGRlZmluZSB6X2NvbnN0IGNvbnN0CisjZWxzZQorIyAgZGVmaW5lIHpfY29uc3QKKyNlbmRpZgorCisvKiBTb21lIE1hYyBjb21waWxlcnMgbWVyZ2UgYWxsIC5oIGZpbGVzIGluY29ycmVjdGx5OiAqLworI2lmIGRlZmluZWQoX19NV0VSS1NfXyl8fGRlZmluZWQoYXBwbGVjKXx8ZGVmaW5lZChUSElOS19DKXx8ZGVmaW5lZChfX1NDX18pCisjICBkZWZpbmUgTk9fRFVNTVlfREVDTAorI2VuZGlmCisKKy8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqLworI2lmbmRlZiBNQVhfTUVNX0xFVkVMCisjICBpZmRlZiBNQVhTRUdfNjRLCisjICAgIGRlZmluZSBNQVhfTUVNX0xFVkVMIDgKKyMgIGVsc2UKKyMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOQorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBNYXhpbXVtIHZhbHVlIGZvciB3aW5kb3dCaXRzIGluIGRlZmxhdGVJbml0MiBhbmQgaW5mbGF0ZUluaXQyLgorICogV0FSTklORzogcmVkdWNpbmcgTUFYX1dCSVRTIG1ha2VzIG1pbmlnemlwIHVuYWJsZSB0byBleHRyYWN0IC5neiBmaWxlcworICogY3JlYXRlZCBieSBnemlwLiAoRmlsZXMgY3JlYXRlZCBieSBtaW5pZ3ppcCBjYW4gc3RpbGwgYmUgZXh0cmFjdGVkIGJ5CisgKiBnemlwLikKKyAqLworI2lmbmRlZiBNQVhfV0JJVFMKKyMgIGRlZmluZSBNQVhfV0JJVFMgICAxNSAvKiAzMksgTFo3NyB3aW5kb3cgKi8KKyNlbmRpZgorCisvKiBUaGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgZGVmbGF0ZSBhcmUgKGluIGJ5dGVzKToKKyAgICAgICAgICAgICgxIDw8ICh3aW5kb3dCaXRzKzIpKSArICAoMSA8PCAobWVtTGV2ZWwrOSkpCisgdGhhdCBpczogMTI4SyBmb3Igd2luZG93Qml0cz0xNSAgKyAgMTI4SyBmb3IgbWVtTGV2ZWwgPSA4ICAoZGVmYXVsdCB2YWx1ZXMpCisgcGx1cyBhIGZldyBraWxvYnl0ZXMgZm9yIHNtYWxsIG9iamVjdHMuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byByZWR1Y2UKKyB0aGUgZGVmYXVsdCBtZW1vcnkgcmVxdWlyZW1lbnRzIGZyb20gMjU2SyB0byAxMjhLLCBjb21waWxlIHdpdGgKKyAgICAgbWFrZSBDRkxBR1M9Ii1PIC1ETUFYX1dCSVRTPTE0IC1ETUFYX01FTV9MRVZFTD03IgorIE9mIGNvdXJzZSB0aGlzIHdpbGwgZ2VuZXJhbGx5IGRlZ3JhZGUgY29tcHJlc3Npb24gKHRoZXJlJ3Mgbm8gZnJlZSBsdW5jaCkuCisKKyAgIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBpbmZsYXRlIGFyZSAoaW4gYnl0ZXMpIDEgPDwgd2luZG93Qml0cworIHRoYXQgaXMsIDMySyBmb3Igd2luZG93Qml0cz0xNSAoZGVmYXVsdCB2YWx1ZSkgcGx1cyBhIGZldyBraWxvYnl0ZXMKKyBmb3Igc21hbGwgb2JqZWN0cy4KKyovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgZGVjbGFyYXRpb25zICovCisKKyNpZm5kZWYgT0YgLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLworIyAgaWZkZWYgU1REQworIyAgICBkZWZpbmUgT0YoYXJncykgIGFyZ3MKKyMgIGVsc2UKKyMgICAgZGVmaW5lIE9GKGFyZ3MpICAoKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFpfQVJHIC8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIHN0ZGFyZyAqLworIyAgaWYgZGVmaW5lZChTVERDKSB8fCBkZWZpbmVkKFpfSEFWRV9TVERBUkdfSCkKKyMgICAgZGVmaW5lIFpfQVJHKGFyZ3MpICBhcmdzCisjICBlbHNlCisjICAgIGRlZmluZSBaX0FSRyhhcmdzKSAgKCkKKyMgIGVuZGlmCisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBmb3IgRkFSIGFyZSBuZWVkZWQgb25seSBmb3IgTVNET1MgbWl4ZWQKKyAqIG1vZGVsIHByb2dyYW1taW5nIChzbWFsbCBvciBtZWRpdW0gbW9kZWwgd2l0aCBzb21lIGZhciBhbGxvY2F0aW9ucykuCisgKiBUaGlzIHdhcyB0ZXN0ZWQgb25seSB3aXRoIE1TQzsgZm9yIG90aGVyIE1TRE9TIGNvbXBpbGVycyB5b3UgbWF5IGhhdmUKKyAqIHRvIGRlZmluZSBOT19NRU1DUFkgaW4genV0aWwuaC4gIElmIHlvdSBkb24ndCBuZWVkIHRoZSBtaXhlZCBtb2RlbCwKKyAqIGp1c3QgZGVmaW5lIEZBUiB0byBiZSBlbXB0eS4KKyAqLworI2lmZGVmIFNZUzE2QklUCisjICBpZiBkZWZpbmVkKE1fSTg2U00pIHx8IGRlZmluZWQoTV9JODZNTSkKKyAgICAgLyogTVNDIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLworIyAgICBkZWZpbmUgU01BTExfTUVESVVNCisjICAgIGlmZGVmIF9NU0NfVkVSCisjICAgICAgZGVmaW5lIEZBUiBfZmFyCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgRkFSIGZhcgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmIChkZWZpbmVkKF9fU01BTExfXykgfHwgZGVmaW5lZChfX01FRElVTV9fKSkKKyAgICAgLyogVHVyYm8gQyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KKyMgICAgZGVmaW5lIFNNQUxMX01FRElVTQorIyAgICBpZmRlZiBfX0JPUkxBTkRDX18KKyMgICAgICBkZWZpbmUgRkFSIF9mYXIKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBGQVIgZmFyCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdJTkRPV1MpIHx8IGRlZmluZWQoV0lOMzIpCisgICAvKiBJZiBidWlsZGluZyBvciB1c2luZyB6bGliIGFzIGEgRExMLCBkZWZpbmUgWkxJQl9ETEwuCisgICAgKiBUaGlzIGlzIG5vdCBtYW5kYXRvcnksIGJ1dCBpdCBvZmZlcnMgYSBsaXR0bGUgcGVyZm9ybWFuY2UgaW5jcmVhc2UuCisgICAgKi8KKyMgIGlmZGVmIFpMSUJfRExMCisjICAgIGlmIGRlZmluZWQoV0lOMzIpICYmICghZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IChfX0JPUkxBTkRDX18gPj0gMHg1MDApKQorIyAgICAgIGlmZGVmIFpMSUJfSU5URVJOQUwKKyMgICAgICAgIGRlZmluZSBaRVhURVJOIGV4dGVybiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICAgICBlbHNlCisjICAgICAgICBkZWZpbmUgWkVYVEVSTiBleHRlcm4gX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmICAvKiBaTElCX0RMTCAqLworICAgLyogSWYgYnVpbGRpbmcgb3IgdXNpbmcgemxpYiB3aXRoIHRoZSBXSU5BUEkvV0lOQVBJViBjYWxsaW5nIGNvbnZlbnRpb24sCisgICAgKiBkZWZpbmUgWkxJQl9XSU5BUEkuCisgICAgKiBDYXV0aW9uOiB0aGUgc3RhbmRhcmQgWkxJQjEuRExMIGlzIE5PVCBjb21waWxlZCB1c2luZyBaTElCX1dJTkFQSS4KKyAgICAqLworIyAgaWZkZWYgWkxJQl9XSU5BUEkKKyMgICAgaWZkZWYgRkFSCisjICAgICAgdW5kZWYgRkFSCisjICAgIGVuZGlmCisjICAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyAgICAgLyogTm8gbmVlZCBmb3IgX2V4cG9ydCwgdXNlIFpMSUIuREVGIGluc3RlYWQuICovCisgICAgIC8qIEZvciBjb21wbGV0ZSBXaW5kb3dzIGNvbXBhdGliaWxpdHksIHVzZSBXSU5BUEksIG5vdCBfX3N0ZGNhbGwuICovCisjICAgIGRlZmluZSBaRVhQT1JUIFdJTkFQSQorIyAgICBpZmRlZiBXSU4zMgorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgV0lOQVBJVgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBGQVIgQ0RFQ0wKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fQkVPU19fKQorIyAgaWZkZWYgWkxJQl9ETEwKKyMgICAgaWZkZWYgWkxJQl9JTlRFUk5BTAorIyAgICAgIGRlZmluZSBaRVhQT1JUICAgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBaRVhQT1JUICAgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBaRVhURVJOCisjICBkZWZpbmUgWkVYVEVSTiBleHRlcm4KKyNlbmRpZgorI2lmbmRlZiBaRVhQT1JUCisjICBkZWZpbmUgWkVYUE9SVAorI2VuZGlmCisjaWZuZGVmIFpFWFBPUlRWQQorIyAgZGVmaW5lIFpFWFBPUlRWQQorI2VuZGlmCisKKyNpZm5kZWYgRkFSCisjICBkZWZpbmUgRkFSCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9fTUFDVFlQRVNfXykKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgQnl0ZTsgIC8qIDggYml0cyAqLworI2VuZGlmCit0eXBlZGVmIHVuc2lnbmVkIGludCAgIHVJbnQ7ICAvKiAxNiBiaXRzIG9yIG1vcmUgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgdUxvbmc7IC8qIDMyIGJpdHMgb3IgbW9yZSAqLworCisjaWZkZWYgU01BTExfTUVESVVNCisgICAvKiBCb3JsYW5kIEMvQysrIGFuZCBzb21lIG9sZCBNU0MgdmVyc2lvbnMgaWdub3JlIEZBUiBpbnNpZGUgdHlwZWRlZiAqLworIyAgZGVmaW5lIEJ5dGVmIEJ5dGUgRkFSCisjZWxzZQorICAgdHlwZWRlZiBCeXRlICBGQVIgQnl0ZWY7CisjZW5kaWYKK3R5cGVkZWYgY2hhciAgRkFSIGNoYXJmOwordHlwZWRlZiBpbnQgICBGQVIgaW50ZjsKK3R5cGVkZWYgdUludCAgRkFSIHVJbnRmOwordHlwZWRlZiB1TG9uZyBGQVIgdUxvbmdmOworCisjaWZkZWYgU1REQworICAgdHlwZWRlZiB2b2lkIGNvbnN0ICp2b2lkcGM7CisgICB0eXBlZGVmIHZvaWQgRkFSICAgKnZvaWRwZjsKKyAgIHR5cGVkZWYgdm9pZCAgICAgICAqdm9pZHA7CisjZWxzZQorICAgdHlwZWRlZiBCeXRlIGNvbnN0ICp2b2lkcGM7CisgICB0eXBlZGVmIEJ5dGUgRkFSICAgKnZvaWRwZjsKKyAgIHR5cGVkZWYgQnl0ZSAgICAgICAqdm9pZHA7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFpfVTQpICYmICFkZWZpbmVkKFpfU09MTykgJiYgZGVmaW5lZChTVERDKQorIyAgaW5jbHVkZSA8bGltaXRzLmg+CisjICBpZiAoVUlOVF9NQVggPT0gMHhmZmZmZmZmZlVMKQorIyAgICBkZWZpbmUgWl9VNCB1bnNpZ25lZAorIyAgZWxpZiAoVUxPTkdfTUFYID09IDB4ZmZmZmZmZmZVTCkKKyMgICAgZGVmaW5lIFpfVTQgdW5zaWduZWQgbG9uZworIyAgZWxpZiAoVVNIUlRfTUFYID09IDB4ZmZmZmZmZmZVTCkKKyMgICAgZGVmaW5lIFpfVTQgdW5zaWduZWQgc2hvcnQKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFpfVTQKKyAgIHR5cGVkZWYgWl9VNCB6X2NyY190OworI2Vsc2UKKyAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyB6X2NyY190OworI2VuZGlmCisKKyNpZiAxICAgIC8qIHdhcyBzZXQgdG8gI2lmIDEgYnkgLi9jb25maWd1cmUgKi8KKyMgIGRlZmluZSBaX0hBVkVfVU5JU1REX0gKKyNlbmRpZgorCisjaWYgMSAgICAvKiB3YXMgc2V0IHRvICNpZiAxIGJ5IC4vY29uZmlndXJlICovCisjICBkZWZpbmUgWl9IQVZFX1NUREFSR19ICisjZW5kaWYKKworI2lmZGVmIFNUREMKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAgICAgLyogZm9yIG9mZl90ICovCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUREMpIHx8IGRlZmluZWQoWl9IQVZFX1NUREFSR19IKQorIyAgaWZuZGVmIFpfU09MTworIyAgICBpbmNsdWRlIDxzdGRhcmcuaD4gICAgICAgICAvKiBmb3IgdmFfbGlzdCAqLworIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisjICBpZm5kZWYgWl9TT0xPCisjICAgIGluY2x1ZGUgPHN0ZGRlZi5oPiAgICAgICAgIC8qIGZvciB3Y2hhcl90ICovCisjICBlbmRpZgorI2VuZGlmCisKKy8qIGEgbGl0dGxlIHRyaWNrIHRvIGFjY29tbW9kYXRlIGJvdGggIiNkZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRSIgYW5kCisgKiAiI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIDEiIGFzIHJlcXVlc3RpbmcgNjQtYml0IG9wZXJhdGlvbnMsIChldmVuCisgKiB0aG91Z2ggdGhlIGZvcm1lciBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZSBMRlMgZG9jdW1lbnQpLCBidXQgY29uc2lkZXJpbmcKKyAqIGJvdGggIiN1bmRlZiBfTEFSR0VGSUxFNjRfU09VUkNFIiBhbmQgIiNkZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRSAwIiBhcworICogZXF1aXZhbGVudGx5IHJlcXVlc3Rpbmcgbm8gNjQtYml0IG9wZXJhdGlvbnMKKyAqLworI2lmIGRlZmluZWQoX0xBUkdFRklMRTY0X1NPVVJDRSkgJiYgLV9MQVJHRUZJTEU2NF9TT1VSQ0UgLSAtMSA9PSAxCisjICB1bmRlZiBfTEFSR0VGSUxFNjRfU09VUkNFCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19XQVRDT01DX18pICYmICFkZWZpbmVkKFpfSEFWRV9VTklTVERfSCkKKyMgIGRlZmluZSBaX0hBVkVfVU5JU1REX0gKKyNlbmRpZgorI2lmbmRlZiBaX1NPTE8KKyMgIGlmIGRlZmluZWQoWl9IQVZFX1VOSVNURF9IKSB8fCBkZWZpbmVkKF9MQVJHRUZJTEU2NF9TT1VSQ0UpCisjICAgIGluY2x1ZGUgPHVuaXN0ZC5oPiAgICAgICAgIC8qIGZvciBTRUVLXyosIG9mZl90LCBhbmQgX0xGUzY0X0xBUkdFRklMRSAqLworIyAgICBpZmRlZiBWTVMKKyMgICAgICBpbmNsdWRlIDx1bml4aW8uaD4gICAgICAgLyogZm9yIG9mZl90ICovCisjICAgIGVuZGlmCisjICAgIGlmbmRlZiB6X29mZl90CisjICAgICAgZGVmaW5lIHpfb2ZmX3Qgb2ZmX3QKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX0xGUzY0X0xBUkdFRklMRSkgJiYgX0xGUzY0X0xBUkdFRklMRS0wCisjICBkZWZpbmUgWl9MRlM2NAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9MQVJHRUZJTEU2NF9TT1VSQ0UpICYmIGRlZmluZWQoWl9MRlM2NCkKKyMgIGRlZmluZSBaX0xBUkdFNjQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfRklMRV9PRkZTRVRfQklUUykgJiYgX0ZJTEVfT0ZGU0VUX0JJVFMtMCA9PSA2NCAmJiBkZWZpbmVkKFpfTEZTNjQpCisjICBkZWZpbmUgWl9XQU5UNjQKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoU0VFS19TRVQpICYmICFkZWZpbmVkKFpfU09MTykKKyMgIGRlZmluZSBTRUVLX1NFVCAgICAgICAgMCAgICAgICAvKiBTZWVrIGZyb20gYmVnaW5uaW5nIG9mIGZpbGUuICAqLworIyAgZGVmaW5lIFNFRUtfQ1VSICAgICAgICAxICAgICAgIC8qIFNlZWsgZnJvbSBjdXJyZW50IHBvc2l0aW9uLiAgKi8KKyMgIGRlZmluZSBTRUVLX0VORCAgICAgICAgMiAgICAgICAvKiBTZXQgZmlsZSBwb2ludGVyIHRvIEVPRiBwbHVzICJvZmZzZXQiICovCisjZW5kaWYKKworI2lmbmRlZiB6X29mZl90CisjICBkZWZpbmUgel9vZmZfdCBsb25nCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9XSU4zMikgJiYgZGVmaW5lZChaX0xBUkdFNjQpCisjICBkZWZpbmUgel9vZmY2NF90IG9mZjY0X3QKKyNlbHNlCisjICBpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKFpfU09MTykKKyMgICAgZGVmaW5lIHpfb2ZmNjRfdCBfX2ludDY0CisjICBlbHNlCisjICAgIGRlZmluZSB6X29mZjY0X3Qgel9vZmZfdAorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBNVlMgbGlua2VyIGRvZXMgbm90IHN1cHBvcnQgZXh0ZXJuYWwgbmFtZXMgbGFyZ2VyIHRoYW4gOCBieXRlcyAqLworI2lmIGRlZmluZWQoX19NVlNfXykKKyAgI3ByYWdtYSBtYXAoZGVmbGF0ZUluaXRfLCJERUlOIikKKyAgI3ByYWdtYSBtYXAoZGVmbGF0ZUluaXQyXywiREVJTjIiKQorICAjcHJhZ21hIG1hcChkZWZsYXRlRW5kLCJERUVORCIpCisgICNwcmFnbWEgbWFwKGRlZmxhdGVCb3VuZCwiREVCTkQiKQorICAjcHJhZ21hIG1hcChpbmZsYXRlSW5pdF8sIklOSU4iKQorICAjcHJhZ21hIG1hcChpbmZsYXRlSW5pdDJfLCJJTklOMiIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVFbmQsIklORU5EIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZVN5bmMsIklOU1kiKQorICAjcHJhZ21hIG1hcChpbmZsYXRlU2V0RGljdGlvbmFyeSwiSU5TRURJIikKKyAgI3ByYWdtYSBtYXAoY29tcHJlc3NCb3VuZCwiQ01CTkQiKQorICAjcHJhZ21hIG1hcChpbmZsYXRlX3RhYmxlLCJJTlRBQkwiKQorICAjcHJhZ21hIG1hcChpbmZsYXRlX2Zhc3QsIklORkEiKQorICAjcHJhZ21hIG1hcChpbmZsYXRlX2NvcHlyaWdodCwiSU5DT1BZIikKKyNlbmRpZgorCisjZW5kaWYgLyogWkNPTkZfSCAqLwpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvemNvbmYuaC5jbWFrZWluIGIvemxpYi9zcmMvemNvbmYuaC5jbWFrZWluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MzAxOWMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy96Y29uZi5oLmNtYWtlaW4KQEAgLTAsMCArMSw1MTMgQEAKKy8qIHpjb25mLmggLS0gY29uZmlndXJhdGlvbiBvZiB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5CisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5LgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qIEAoIykgJElkJCAqLworCisjaWZuZGVmIFpDT05GX0gKKyNkZWZpbmUgWkNPTkZfSAorI2NtYWtlZGVmaW5lIFpfUFJFRklYCisjY21ha2VkZWZpbmUgWl9IQVZFX1VOSVNURF9ICisKKy8qCisgKiBJZiB5b3UgKnJlYWxseSogbmVlZCBhIHVuaXF1ZSBwcmVmaXggZm9yIGFsbCB0eXBlcyBhbmQgbGlicmFyeSBmdW5jdGlvbnMsCisgKiBjb21waWxlIHdpdGggLURaX1BSRUZJWC4gVGhlICJzdGFuZGFyZCIgemxpYiBzaG91bGQgYmUgY29tcGlsZWQgd2l0aG91dCBpdC4KKyAqIEV2ZW4gYmV0dGVyIHRoYW4gY29tcGlsaW5nIHdpdGggLURaX1BSRUZJWCB3b3VsZCBiZSB0byB1c2UgY29uZmlndXJlIHRvIHNldAorICogdGhpcyBwZXJtYW5lbnRseSBpbiB6Y29uZi5oIHVzaW5nICIuL2NvbmZpZ3VyZSAtLXpwcmVmaXgiLgorICovCisjaWZkZWYgWl9QUkVGSVggICAgIC8qIG1heSBiZSBzZXQgdG8gI2lmIDEgYnkgLi9jb25maWd1cmUgKi8KKyMgIGRlZmluZSBaX1BSRUZJWF9TRVQKKworLyogYWxsIGxpbmtlZCBzeW1ib2xzICovCisjICBkZWZpbmUgX2Rpc3RfY29kZSAgICAgICAgICAgIHpfX2Rpc3RfY29kZQorIyAgZGVmaW5lIF9sZW5ndGhfY29kZSAgICAgICAgICB6X19sZW5ndGhfY29kZQorIyAgZGVmaW5lIF90cl9hbGlnbiAgICAgICAgICAgICB6X190cl9hbGlnbgorIyAgZGVmaW5lIF90cl9mbHVzaF9iaXRzICAgICAgICB6X190cl9mbHVzaF9iaXRzCisjICBkZWZpbmUgX3RyX2ZsdXNoX2Jsb2NrICAgICAgIHpfX3RyX2ZsdXNoX2Jsb2NrCisjICBkZWZpbmUgX3RyX2luaXQgICAgICAgICAgICAgIHpfX3RyX2luaXQKKyMgIGRlZmluZSBfdHJfc3RvcmVkX2Jsb2NrICAgICAgel9fdHJfc3RvcmVkX2Jsb2NrCisjICBkZWZpbmUgX3RyX3RhbGx5ICAgICAgICAgICAgIHpfX3RyX3RhbGx5CisjICBkZWZpbmUgYWRsZXIzMiAgICAgICAgICAgICAgIHpfYWRsZXIzMgorIyAgZGVmaW5lIGFkbGVyMzJfY29tYmluZSAgICAgICB6X2FkbGVyMzJfY29tYmluZQorIyAgZGVmaW5lIGFkbGVyMzJfY29tYmluZTY0ICAgICB6X2FkbGVyMzJfY29tYmluZTY0CisjICBpZm5kZWYgWl9TT0xPCisjICAgIGRlZmluZSBjb21wcmVzcyAgICAgICAgICAgICAgel9jb21wcmVzcworIyAgICBkZWZpbmUgY29tcHJlc3MyICAgICAgICAgICAgIHpfY29tcHJlc3MyCisjICAgIGRlZmluZSBjb21wcmVzc0JvdW5kICAgICAgICAgel9jb21wcmVzc0JvdW5kCisjICBlbmRpZgorIyAgZGVmaW5lIGNyYzMyICAgICAgICAgICAgICAgICB6X2NyYzMyCisjICBkZWZpbmUgY3JjMzJfY29tYmluZSAgICAgICAgIHpfY3JjMzJfY29tYmluZQorIyAgZGVmaW5lIGNyYzMyX2NvbWJpbmU2NCAgICAgICB6X2NyYzMyX2NvbWJpbmU2NAorIyAgZGVmaW5lIGRlZmxhdGUgICAgICAgICAgICAgICB6X2RlZmxhdGUKKyMgIGRlZmluZSBkZWZsYXRlQm91bmQgICAgICAgICAgel9kZWZsYXRlQm91bmQKKyMgIGRlZmluZSBkZWZsYXRlQ29weSAgICAgICAgICAgel9kZWZsYXRlQ29weQorIyAgZGVmaW5lIGRlZmxhdGVFbmQgICAgICAgICAgICB6X2RlZmxhdGVFbmQKKyMgIGRlZmluZSBkZWZsYXRlSW5pdDJfICAgICAgICAgel9kZWZsYXRlSW5pdDJfCisjICBkZWZpbmUgZGVmbGF0ZUluaXRfICAgICAgICAgIHpfZGVmbGF0ZUluaXRfCisjICBkZWZpbmUgZGVmbGF0ZVBhcmFtcyAgICAgICAgIHpfZGVmbGF0ZVBhcmFtcworIyAgZGVmaW5lIGRlZmxhdGVQZW5kaW5nICAgICAgICB6X2RlZmxhdGVQZW5kaW5nCisjICBkZWZpbmUgZGVmbGF0ZVByaW1lICAgICAgICAgIHpfZGVmbGF0ZVByaW1lCisjICBkZWZpbmUgZGVmbGF0ZVJlc2V0ICAgICAgICAgIHpfZGVmbGF0ZVJlc2V0CisjICBkZWZpbmUgZGVmbGF0ZVJlc2V0S2VlcCAgICAgIHpfZGVmbGF0ZVJlc2V0S2VlcAorIyAgZGVmaW5lIGRlZmxhdGVTZXREaWN0aW9uYXJ5ICB6X2RlZmxhdGVTZXREaWN0aW9uYXJ5CisjICBkZWZpbmUgZGVmbGF0ZVNldEhlYWRlciAgICAgIHpfZGVmbGF0ZVNldEhlYWRlcgorIyAgZGVmaW5lIGRlZmxhdGVUdW5lICAgICAgICAgICB6X2RlZmxhdGVUdW5lCisjICBkZWZpbmUgZGVmbGF0ZV9jb3B5cmlnaHQgICAgIHpfZGVmbGF0ZV9jb3B5cmlnaHQKKyMgIGRlZmluZSBnZXRfY3JjX3RhYmxlICAgICAgICAgel9nZXRfY3JjX3RhYmxlCisjICBpZm5kZWYgWl9TT0xPCisjICAgIGRlZmluZSBnel9lcnJvciAgICAgICAgICAgICAgel9nel9lcnJvcgorIyAgICBkZWZpbmUgZ3pfaW50bWF4ICAgICAgICAgICAgIHpfZ3pfaW50bWF4CisjICAgIGRlZmluZSBnel9zdHJ3aW5lcnJvciAgICAgICAgel9nel9zdHJ3aW5lcnJvcgorIyAgICBkZWZpbmUgZ3pidWZmZXIgICAgICAgICAgICAgIHpfZ3pidWZmZXIKKyMgICAgZGVmaW5lIGd6Y2xlYXJlcnIgICAgICAgICAgICB6X2d6Y2xlYXJlcnIKKyMgICAgZGVmaW5lIGd6Y2xvc2UgICAgICAgICAgICAgICB6X2d6Y2xvc2UKKyMgICAgZGVmaW5lIGd6Y2xvc2VfciAgICAgICAgICAgICB6X2d6Y2xvc2VfcgorIyAgICBkZWZpbmUgZ3pjbG9zZV93ICAgICAgICAgICAgIHpfZ3pjbG9zZV93CisjICAgIGRlZmluZSBnemRpcmVjdCAgICAgICAgICAgICAgel9nemRpcmVjdAorIyAgICBkZWZpbmUgZ3pkb3BlbiAgICAgICAgICAgICAgIHpfZ3pkb3BlbgorIyAgICBkZWZpbmUgZ3plb2YgICAgICAgICAgICAgICAgIHpfZ3plb2YKKyMgICAgZGVmaW5lIGd6ZXJyb3IgICAgICAgICAgICAgICB6X2d6ZXJyb3IKKyMgICAgZGVmaW5lIGd6Zmx1c2ggICAgICAgICAgICAgICB6X2d6Zmx1c2gKKyMgICAgZGVmaW5lIGd6Z2V0YyAgICAgICAgICAgICAgICB6X2d6Z2V0YworIyAgICBkZWZpbmUgZ3pnZXRjXyAgICAgICAgICAgICAgIHpfZ3pnZXRjXworIyAgICBkZWZpbmUgZ3pnZXRzICAgICAgICAgICAgICAgIHpfZ3pnZXRzCisjICAgIGRlZmluZSBnem9mZnNldCAgICAgICAgICAgICAgel9nem9mZnNldAorIyAgICBkZWZpbmUgZ3pvZmZzZXQ2NCAgICAgICAgICAgIHpfZ3pvZmZzZXQ2NAorIyAgICBkZWZpbmUgZ3pvcGVuICAgICAgICAgICAgICAgIHpfZ3pvcGVuCisjICAgIGRlZmluZSBnem9wZW42NCAgICAgICAgICAgICAgel9nem9wZW42NAorIyAgICBpZmRlZiBfV0lOMzIKKyMgICAgICBkZWZpbmUgZ3pvcGVuX3cgICAgICAgICAgICAgIHpfZ3pvcGVuX3cKKyMgICAgZW5kaWYKKyMgICAgZGVmaW5lIGd6cHJpbnRmICAgICAgICAgICAgICB6X2d6cHJpbnRmCisjICAgIGRlZmluZSBnenZwcmludGYgICAgICAgICAgICAgel9nenZwcmludGYKKyMgICAgZGVmaW5lIGd6cHV0YyAgICAgICAgICAgICAgICB6X2d6cHV0YworIyAgICBkZWZpbmUgZ3pwdXRzICAgICAgICAgICAgICAgIHpfZ3pwdXRzCisjICAgIGRlZmluZSBnenJlYWQgICAgICAgICAgICAgICAgel9nenJlYWQKKyMgICAgZGVmaW5lIGd6cmV3aW5kICAgICAgICAgICAgICB6X2d6cmV3aW5kCisjICAgIGRlZmluZSBnenNlZWsgICAgICAgICAgICAgICAgel9nenNlZWsKKyMgICAgZGVmaW5lIGd6c2VlazY0ICAgICAgICAgICAgICB6X2d6c2VlazY0CisjICAgIGRlZmluZSBnenNldHBhcmFtcyAgICAgICAgICAgel9nenNldHBhcmFtcworIyAgICBkZWZpbmUgZ3p0ZWxsICAgICAgICAgICAgICAgIHpfZ3p0ZWxsCisjICAgIGRlZmluZSBnenRlbGw2NCAgICAgICAgICAgICAgel9nenRlbGw2NAorIyAgICBkZWZpbmUgZ3p1bmdldGMgICAgICAgICAgICAgIHpfZ3p1bmdldGMKKyMgICAgZGVmaW5lIGd6d3JpdGUgICAgICAgICAgICAgICB6X2d6d3JpdGUKKyMgIGVuZGlmCisjICBkZWZpbmUgaW5mbGF0ZSAgICAgICAgICAgICAgIHpfaW5mbGF0ZQorIyAgZGVmaW5lIGluZmxhdGVCYWNrICAgICAgICAgICB6X2luZmxhdGVCYWNrCisjICBkZWZpbmUgaW5mbGF0ZUJhY2tFbmQgICAgICAgIHpfaW5mbGF0ZUJhY2tFbmQKKyMgIGRlZmluZSBpbmZsYXRlQmFja0luaXRfICAgICAgel9pbmZsYXRlQmFja0luaXRfCisjICBkZWZpbmUgaW5mbGF0ZUNvcHkgICAgICAgICAgIHpfaW5mbGF0ZUNvcHkKKyMgIGRlZmluZSBpbmZsYXRlRW5kICAgICAgICAgICAgel9pbmZsYXRlRW5kCisjICBkZWZpbmUgaW5mbGF0ZUdldEhlYWRlciAgICAgIHpfaW5mbGF0ZUdldEhlYWRlcgorIyAgZGVmaW5lIGluZmxhdGVJbml0Ml8gICAgICAgICB6X2luZmxhdGVJbml0Ml8KKyMgIGRlZmluZSBpbmZsYXRlSW5pdF8gICAgICAgICAgel9pbmZsYXRlSW5pdF8KKyMgIGRlZmluZSBpbmZsYXRlTWFyayAgICAgICAgICAgel9pbmZsYXRlTWFyaworIyAgZGVmaW5lIGluZmxhdGVQcmltZSAgICAgICAgICB6X2luZmxhdGVQcmltZQorIyAgZGVmaW5lIGluZmxhdGVSZXNldCAgICAgICAgICB6X2luZmxhdGVSZXNldAorIyAgZGVmaW5lIGluZmxhdGVSZXNldDIgICAgICAgICB6X2luZmxhdGVSZXNldDIKKyMgIGRlZmluZSBpbmZsYXRlU2V0RGljdGlvbmFyeSAgel9pbmZsYXRlU2V0RGljdGlvbmFyeQorIyAgZGVmaW5lIGluZmxhdGVHZXREaWN0aW9uYXJ5ICB6X2luZmxhdGVHZXREaWN0aW9uYXJ5CisjICBkZWZpbmUgaW5mbGF0ZVN5bmMgICAgICAgICAgIHpfaW5mbGF0ZVN5bmMKKyMgIGRlZmluZSBpbmZsYXRlU3luY1BvaW50ICAgICAgel9pbmZsYXRlU3luY1BvaW50CisjICBkZWZpbmUgaW5mbGF0ZVVuZGVybWluZSAgICAgIHpfaW5mbGF0ZVVuZGVybWluZQorIyAgZGVmaW5lIGluZmxhdGVSZXNldEtlZXAgICAgICB6X2luZmxhdGVSZXNldEtlZXAKKyMgIGRlZmluZSBpbmZsYXRlX2NvcHlyaWdodCAgICAgel9pbmZsYXRlX2NvcHlyaWdodAorIyAgZGVmaW5lIGluZmxhdGVfZmFzdCAgICAgICAgICB6X2luZmxhdGVfZmFzdAorIyAgZGVmaW5lIGluZmxhdGVfdGFibGUgICAgICAgICB6X2luZmxhdGVfdGFibGUKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgZGVmaW5lIHVuY29tcHJlc3MgICAgICAgICAgICB6X3VuY29tcHJlc3MKKyMgIGVuZGlmCisjICBkZWZpbmUgekVycm9yICAgICAgICAgICAgICAgIHpfekVycm9yCisjICBpZm5kZWYgWl9TT0xPCisjICAgIGRlZmluZSB6Y2FsbG9jICAgICAgICAgICAgICAgel96Y2FsbG9jCisjICAgIGRlZmluZSB6Y2ZyZWUgICAgICAgICAgICAgICAgel96Y2ZyZWUKKyMgIGVuZGlmCisjICBkZWZpbmUgemxpYkNvbXBpbGVGbGFncyAgICAgIHpfemxpYkNvbXBpbGVGbGFncworIyAgZGVmaW5lIHpsaWJWZXJzaW9uICAgICAgICAgICB6X3psaWJWZXJzaW9uCisKKy8qIGFsbCB6bGliIHR5cGVkZWZzIGluIHpsaWIuaCBhbmQgemNvbmYuaCAqLworIyAgZGVmaW5lIEJ5dGUgICAgICAgICAgICAgICAgICB6X0J5dGUKKyMgIGRlZmluZSBCeXRlZiAgICAgICAgICAgICAgICAgel9CeXRlZgorIyAgZGVmaW5lIGFsbG9jX2Z1bmMgICAgICAgICAgICB6X2FsbG9jX2Z1bmMKKyMgIGRlZmluZSBjaGFyZiAgICAgICAgICAgICAgICAgel9jaGFyZgorIyAgZGVmaW5lIGZyZWVfZnVuYyAgICAgICAgICAgICB6X2ZyZWVfZnVuYworIyAgaWZuZGVmIFpfU09MTworIyAgICBkZWZpbmUgZ3pGaWxlICAgICAgICAgICAgICAgIHpfZ3pGaWxlCisjICBlbmRpZgorIyAgZGVmaW5lIGd6X2hlYWRlciAgICAgICAgICAgICB6X2d6X2hlYWRlcgorIyAgZGVmaW5lIGd6X2hlYWRlcnAgICAgICAgICAgICB6X2d6X2hlYWRlcnAKKyMgIGRlZmluZSBpbl9mdW5jICAgICAgICAgICAgICAgel9pbl9mdW5jCisjICBkZWZpbmUgaW50ZiAgICAgICAgICAgICAgICAgIHpfaW50ZgorIyAgZGVmaW5lIG91dF9mdW5jICAgICAgICAgICAgICB6X291dF9mdW5jCisjICBkZWZpbmUgdUludCAgICAgICAgICAgICAgICAgIHpfdUludAorIyAgZGVmaW5lIHVJbnRmICAgICAgICAgICAgICAgICB6X3VJbnRmCisjICBkZWZpbmUgdUxvbmcgICAgICAgICAgICAgICAgIHpfdUxvbmcKKyMgIGRlZmluZSB1TG9uZ2YgICAgICAgICAgICAgICAgel91TG9uZ2YKKyMgIGRlZmluZSB2b2lkcCAgICAgICAgICAgICAgICAgel92b2lkcAorIyAgZGVmaW5lIHZvaWRwYyAgICAgICAgICAgICAgICB6X3ZvaWRwYworIyAgZGVmaW5lIHZvaWRwZiAgICAgICAgICAgICAgICB6X3ZvaWRwZgorCisvKiBhbGwgemxpYiBzdHJ1Y3RzIGluIHpsaWIuaCBhbmQgemNvbmYuaCAqLworIyAgZGVmaW5lIGd6X2hlYWRlcl9zICAgICAgICAgICB6X2d6X2hlYWRlcl9zCisjICBkZWZpbmUgaW50ZXJuYWxfc3RhdGUgICAgICAgIHpfaW50ZXJuYWxfc3RhdGUKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fTVNET1NfXykgJiYgIWRlZmluZWQoTVNET1MpCisjICBkZWZpbmUgTVNET1MKKyNlbmRpZgorI2lmIChkZWZpbmVkKE9TXzIpIHx8IGRlZmluZWQoX19PUzJfXykpICYmICFkZWZpbmVkKE9TMikKKyMgIGRlZmluZSBPUzIKKyNlbmRpZgorI2lmIGRlZmluZWQoX1dJTkRPV1MpICYmICFkZWZpbmVkKFdJTkRPV1MpCisjICBkZWZpbmUgV0lORE9XUworI2VuZGlmCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkgfHwgZGVmaW5lZChfX1dJTjMyX18pCisjICBpZm5kZWYgV0lOMzIKKyMgICAgZGVmaW5lIFdJTjMyCisjICBlbmRpZgorI2VuZGlmCisjaWYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTkRPV1MpKSAmJiAhZGVmaW5lZChXSU4zMikKKyMgIGlmICFkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX0ZMQVRfXykgJiYgIWRlZmluZWQoX18zODZfXykKKyMgICAgaWZuZGVmIFNZUzE2QklUCisjICAgICAgZGVmaW5lIFNZUzE2QklUCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKy8qCisgKiBDb21waWxlIHdpdGggLURNQVhTRUdfNjRLIGlmIHRoZSBhbGxvYyBmdW5jdGlvbiBjYW5ub3QgYWxsb2NhdGUgbW9yZQorICogdGhhbiA2NGsgYnl0ZXMgYXQgYSB0aW1lIChuZWVkZWQgb24gc3lzdGVtcyB3aXRoIDE2LWJpdCBpbnQpLgorICovCisjaWZkZWYgU1lTMTZCSVQKKyMgIGRlZmluZSBNQVhTRUdfNjRLCisjZW5kaWYKKyNpZmRlZiBNU0RPUworIyAgZGVmaW5lIFVOQUxJR05FRF9PSworI2VuZGlmCisKKyNpZmRlZiBfX1NURENfVkVSU0lPTl9fCisjICBpZm5kZWYgU1REQworIyAgICBkZWZpbmUgU1REQworIyAgZW5kaWYKKyMgIGlmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorIyAgICBpZm5kZWYgU1REQzk5CisjICAgICAgZGVmaW5lIFNUREM5OQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKFdJTkRPV1MpIHx8IGRlZmluZWQoV0lOMzIpKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChfX0hPU19BSVhfXykpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fT1M0MDBfXykgJiYgIWRlZmluZWQoU1REQykgICAgLyogaVNlcmllcyAoZm9ybWVybHkgQVMvNDAwKS4gKi8KKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKworI2lmbmRlZiBTVERDCisjICBpZm5kZWYgY29uc3QgLyogY2Fubm90IHVzZSAhZGVmaW5lZChTVERDKSAmJiAhZGVmaW5lZChjb25zdCkgb24gTWFjICovCisjICAgIGRlZmluZSBjb25zdCAgICAgICAvKiBub3RlOiBuZWVkIGEgbW9yZSBnZW50bGUgc29sdXRpb24gaGVyZSAqLworIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChaTElCX0NPTlNUKSAmJiAhZGVmaW5lZCh6X2NvbnN0KQorIyAgZGVmaW5lIHpfY29uc3QgY29uc3QKKyNlbHNlCisjICBkZWZpbmUgel9jb25zdAorI2VuZGlmCisKKy8qIFNvbWUgTWFjIGNvbXBpbGVycyBtZXJnZSBhbGwgLmggZmlsZXMgaW5jb3JyZWN0bHk6ICovCisjaWYgZGVmaW5lZChfX01XRVJLU19fKXx8ZGVmaW5lZChhcHBsZWMpfHxkZWZpbmVkKFRISU5LX0MpfHxkZWZpbmVkKF9fU0NfXykKKyMgIGRlZmluZSBOT19EVU1NWV9ERUNMCisjZW5kaWYKKworLyogTWF4aW11bSB2YWx1ZSBmb3IgbWVtTGV2ZWwgaW4gZGVmbGF0ZUluaXQyICovCisjaWZuZGVmIE1BWF9NRU1fTEVWRUwKKyMgIGlmZGVmIE1BWFNFR182NEsKKyMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOAorIyAgZWxzZQorIyAgICBkZWZpbmUgTUFYX01FTV9MRVZFTCA5CisjICBlbmRpZgorI2VuZGlmCisKKy8qIE1heGltdW0gdmFsdWUgZm9yIHdpbmRvd0JpdHMgaW4gZGVmbGF0ZUluaXQyIGFuZCBpbmZsYXRlSW5pdDIuCisgKiBXQVJOSU5HOiByZWR1Y2luZyBNQVhfV0JJVFMgbWFrZXMgbWluaWd6aXAgdW5hYmxlIHRvIGV4dHJhY3QgLmd6IGZpbGVzCisgKiBjcmVhdGVkIGJ5IGd6aXAuIChGaWxlcyBjcmVhdGVkIGJ5IG1pbmlnemlwIGNhbiBzdGlsbCBiZSBleHRyYWN0ZWQgYnkKKyAqIGd6aXAuKQorICovCisjaWZuZGVmIE1BWF9XQklUUworIyAgZGVmaW5lIE1BWF9XQklUUyAgIDE1IC8qIDMySyBMWjc3IHdpbmRvdyAqLworI2VuZGlmCisKKy8qIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBkZWZsYXRlIGFyZSAoaW4gYnl0ZXMpOgorICAgICAgICAgICAgKDEgPDwgKHdpbmRvd0JpdHMrMikpICsgICgxIDw8IChtZW1MZXZlbCs5KSkKKyB0aGF0IGlzOiAxMjhLIGZvciB3aW5kb3dCaXRzPTE1ICArICAxMjhLIGZvciBtZW1MZXZlbCA9IDggIChkZWZhdWx0IHZhbHVlcykKKyBwbHVzIGEgZmV3IGtpbG9ieXRlcyBmb3Igc21hbGwgb2JqZWN0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHJlZHVjZQorIHRoZSBkZWZhdWx0IG1lbW9yeSByZXF1aXJlbWVudHMgZnJvbSAyNTZLIHRvIDEyOEssIGNvbXBpbGUgd2l0aAorICAgICBtYWtlIENGTEFHUz0iLU8gLURNQVhfV0JJVFM9MTQgLURNQVhfTUVNX0xFVkVMPTciCisgT2YgY291cnNlIHRoaXMgd2lsbCBnZW5lcmFsbHkgZGVncmFkZSBjb21wcmVzc2lvbiAodGhlcmUncyBubyBmcmVlIGx1bmNoKS4KKworICAgVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGluZmxhdGUgYXJlIChpbiBieXRlcykgMSA8PCB3aW5kb3dCaXRzCisgdGhhdCBpcywgMzJLIGZvciB3aW5kb3dCaXRzPTE1IChkZWZhdWx0IHZhbHVlKSBwbHVzIGEgZmV3IGtpbG9ieXRlcworIGZvciBzbWFsbCBvYmplY3RzLgorKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSBkZWNsYXJhdGlvbnMgKi8KKworI2lmbmRlZiBPRiAvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCisjICBpZmRlZiBTVERDCisjICAgIGRlZmluZSBPRihhcmdzKSAgYXJncworIyAgZWxzZQorIyAgICBkZWZpbmUgT0YoYXJncykgICgpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgWl9BUkcgLyogZnVuY3Rpb24gcHJvdG90eXBlcyBmb3Igc3RkYXJnICovCisjICBpZiBkZWZpbmVkKFNUREMpIHx8IGRlZmluZWQoWl9IQVZFX1NUREFSR19IKQorIyAgICBkZWZpbmUgWl9BUkcoYXJncykgIGFyZ3MKKyMgIGVsc2UKKyMgICAgZGVmaW5lIFpfQVJHKGFyZ3MpICAoKQorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGZvciBGQVIgYXJlIG5lZWRlZCBvbmx5IGZvciBNU0RPUyBtaXhlZAorICogbW9kZWwgcHJvZ3JhbW1pbmcgKHNtYWxsIG9yIG1lZGl1bSBtb2RlbCB3aXRoIHNvbWUgZmFyIGFsbG9jYXRpb25zKS4KKyAqIFRoaXMgd2FzIHRlc3RlZCBvbmx5IHdpdGggTVNDOyBmb3Igb3RoZXIgTVNET1MgY29tcGlsZXJzIHlvdSBtYXkgaGF2ZQorICogdG8gZGVmaW5lIE5PX01FTUNQWSBpbiB6dXRpbC5oLiAgSWYgeW91IGRvbid0IG5lZWQgdGhlIG1peGVkIG1vZGVsLAorICoganVzdCBkZWZpbmUgRkFSIHRvIGJlIGVtcHR5LgorICovCisjaWZkZWYgU1lTMTZCSVQKKyMgIGlmIGRlZmluZWQoTV9JODZTTSkgfHwgZGVmaW5lZChNX0k4Nk1NKQorICAgICAvKiBNU0Mgc21hbGwgb3IgbWVkaXVtIG1vZGVsICovCisjICAgIGRlZmluZSBTTUFMTF9NRURJVU0KKyMgICAgaWZkZWYgX01TQ19WRVIKKyMgICAgICBkZWZpbmUgRkFSIF9mYXIKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBGQVIgZmFyCisjICAgIGVuZGlmCisjICBlbmRpZgorIyAgaWYgKGRlZmluZWQoX19TTUFMTF9fKSB8fCBkZWZpbmVkKF9fTUVESVVNX18pKQorICAgICAvKiBUdXJibyBDIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLworIyAgICBkZWZpbmUgU01BTExfTUVESVVNCisjICAgIGlmZGVmIF9fQk9STEFORENfXworIyAgICAgIGRlZmluZSBGQVIgX2ZhcgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIEZBUiBmYXIKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoV0lORE9XUykgfHwgZGVmaW5lZChXSU4zMikKKyAgIC8qIElmIGJ1aWxkaW5nIG9yIHVzaW5nIHpsaWIgYXMgYSBETEwsIGRlZmluZSBaTElCX0RMTC4KKyAgICAqIFRoaXMgaXMgbm90IG1hbmRhdG9yeSwgYnV0IGl0IG9mZmVycyBhIGxpdHRsZSBwZXJmb3JtYW5jZSBpbmNyZWFzZS4KKyAgICAqLworIyAgaWZkZWYgWkxJQl9ETEwKKyMgICAgaWYgZGVmaW5lZChXSU4zMikgJiYgKCFkZWZpbmVkKF9fQk9STEFORENfXykgfHwgKF9fQk9STEFORENfXyA+PSAweDUwMCkpCisjICAgICAgaWZkZWYgWkxJQl9JTlRFUk5BTAorIyAgICAgICAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICAgIGVsc2UKKyMgICAgICAgIGRlZmluZSBaRVhURVJOIGV4dGVybiBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYgIC8qIFpMSUJfRExMICovCisgICAvKiBJZiBidWlsZGluZyBvciB1c2luZyB6bGliIHdpdGggdGhlIFdJTkFQSS9XSU5BUElWIGNhbGxpbmcgY29udmVudGlvbiwKKyAgICAqIGRlZmluZSBaTElCX1dJTkFQSS4KKyAgICAqIENhdXRpb246IHRoZSBzdGFuZGFyZCBaTElCMS5ETEwgaXMgTk9UIGNvbXBpbGVkIHVzaW5nIFpMSUJfV0lOQVBJLgorICAgICovCisjICBpZmRlZiBaTElCX1dJTkFQSQorIyAgICBpZmRlZiBGQVIKKyMgICAgICB1bmRlZiBGQVIKKyMgICAgZW5kaWYKKyMgICAgaW5jbHVkZSA8d2luZG93cy5oPgorICAgICAvKiBObyBuZWVkIGZvciBfZXhwb3J0LCB1c2UgWkxJQi5ERUYgaW5zdGVhZC4gKi8KKyAgICAgLyogRm9yIGNvbXBsZXRlIFdpbmRvd3MgY29tcGF0aWJpbGl0eSwgdXNlIFdJTkFQSSwgbm90IF9fc3RkY2FsbC4gKi8KKyMgICAgZGVmaW5lIFpFWFBPUlQgV0lOQVBJCisjICAgIGlmZGVmIFdJTjMyCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBXSU5BUElWCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIEZBUiBDREVDTAorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19CRU9TX18pCisjICBpZmRlZiBaTElCX0RMTAorIyAgICBpZmRlZiBaTElCX0lOVEVSTkFMCisjICAgICAgZGVmaW5lIFpFWFBPUlQgICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIFpFWFBPUlQgICBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFpFWFRFUk4KKyMgIGRlZmluZSBaRVhURVJOIGV4dGVybgorI2VuZGlmCisjaWZuZGVmIFpFWFBPUlQKKyMgIGRlZmluZSBaRVhQT1JUCisjZW5kaWYKKyNpZm5kZWYgWkVYUE9SVFZBCisjICBkZWZpbmUgWkVYUE9SVFZBCisjZW5kaWYKKworI2lmbmRlZiBGQVIKKyMgIGRlZmluZSBGQVIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX19NQUNUWVBFU19fKQordHlwZWRlZiB1bnNpZ25lZCBjaGFyICBCeXRlOyAgLyogOCBiaXRzICovCisjZW5kaWYKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgdUludDsgIC8qIDE2IGJpdHMgb3IgbW9yZSAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nICB1TG9uZzsgLyogMzIgYml0cyBvciBtb3JlICovCisKKyNpZmRlZiBTTUFMTF9NRURJVU0KKyAgIC8qIEJvcmxhbmQgQy9DKysgYW5kIHNvbWUgb2xkIE1TQyB2ZXJzaW9ucyBpZ25vcmUgRkFSIGluc2lkZSB0eXBlZGVmICovCisjICBkZWZpbmUgQnl0ZWYgQnl0ZSBGQVIKKyNlbHNlCisgICB0eXBlZGVmIEJ5dGUgIEZBUiBCeXRlZjsKKyNlbmRpZgordHlwZWRlZiBjaGFyICBGQVIgY2hhcmY7Cit0eXBlZGVmIGludCAgIEZBUiBpbnRmOwordHlwZWRlZiB1SW50ICBGQVIgdUludGY7Cit0eXBlZGVmIHVMb25nIEZBUiB1TG9uZ2Y7CisKKyNpZmRlZiBTVERDCisgICB0eXBlZGVmIHZvaWQgY29uc3QgKnZvaWRwYzsKKyAgIHR5cGVkZWYgdm9pZCBGQVIgICAqdm9pZHBmOworICAgdHlwZWRlZiB2b2lkICAgICAgICp2b2lkcDsKKyNlbHNlCisgICB0eXBlZGVmIEJ5dGUgY29uc3QgKnZvaWRwYzsKKyAgIHR5cGVkZWYgQnl0ZSBGQVIgICAqdm9pZHBmOworICAgdHlwZWRlZiBCeXRlICAgICAgICp2b2lkcDsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoWl9VNCkgJiYgIWRlZmluZWQoWl9TT0xPKSAmJiBkZWZpbmVkKFNUREMpCisjICBpbmNsdWRlIDxsaW1pdHMuaD4KKyMgIGlmIChVSU5UX01BWCA9PSAweGZmZmZmZmZmVUwpCisjICAgIGRlZmluZSBaX1U0IHVuc2lnbmVkCisjICBlbGlmIChVTE9OR19NQVggPT0gMHhmZmZmZmZmZlVMKQorIyAgICBkZWZpbmUgWl9VNCB1bnNpZ25lZCBsb25nCisjICBlbGlmIChVU0hSVF9NQVggPT0gMHhmZmZmZmZmZlVMKQorIyAgICBkZWZpbmUgWl9VNCB1bnNpZ25lZCBzaG9ydAorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgWl9VNAorICAgdHlwZWRlZiBaX1U0IHpfY3JjX3Q7CisjZWxzZQorICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIHpfY3JjX3Q7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVU5JU1REX0ggICAgLyogbWF5IGJlIHNldCB0byAjaWYgMSBieSAuL2NvbmZpZ3VyZSAqLworIyAgZGVmaW5lIFpfSEFWRV9VTklTVERfSAorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUREFSR19IICAgIC8qIG1heSBiZSBzZXQgdG8gI2lmIDEgYnkgLi9jb25maWd1cmUgKi8KKyMgIGRlZmluZSBaX0hBVkVfU1REQVJHX0gKKyNlbmRpZgorCisjaWZkZWYgU1REQworIyAgaWZuZGVmIFpfU09MTworIyAgICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gICAgICAvKiBmb3Igb2ZmX3QgKi8KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1REQykgfHwgZGVmaW5lZChaX0hBVkVfU1REQVJHX0gpCisjICBpZm5kZWYgWl9TT0xPCisjICAgIGluY2x1ZGUgPHN0ZGFyZy5oPiAgICAgICAgIC8qIGZvciB2YV9saXN0ICovCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgaW5jbHVkZSA8c3RkZGVmLmg+ICAgICAgICAgLyogZm9yIHdjaGFyX3QgKi8KKyMgIGVuZGlmCisjZW5kaWYKKworLyogYSBsaXR0bGUgdHJpY2sgdG8gYWNjb21tb2RhdGUgYm90aCAiI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIiBhbmQKKyAqICIjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UgMSIgYXMgcmVxdWVzdGluZyA2NC1iaXQgb3BlcmF0aW9ucywgKGV2ZW4KKyAqIHRob3VnaCB0aGUgZm9ybWVyIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIExGUyBkb2N1bWVudCksIGJ1dCBjb25zaWRlcmluZworICogYm90aCAiI3VuZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UiIGFuZCAiI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIDAiIGFzCisgKiBlcXVpdmFsZW50bHkgcmVxdWVzdGluZyBubyA2NC1iaXQgb3BlcmF0aW9ucworICovCisjaWYgZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKSAmJiAtX0xBUkdFRklMRTY0X1NPVVJDRSAtIC0xID09IDEKKyMgIHVuZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX1dBVENPTUNfXykgJiYgIWRlZmluZWQoWl9IQVZFX1VOSVNURF9IKQorIyAgZGVmaW5lIFpfSEFWRV9VTklTVERfSAorI2VuZGlmCisjaWZuZGVmIFpfU09MTworIyAgaWYgZGVmaW5lZChaX0hBVkVfVU5JU1REX0gpIHx8IGRlZmluZWQoX0xBUkdFRklMRTY0X1NPVVJDRSkKKyMgICAgaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAgICAgLyogZm9yIFNFRUtfKiwgb2ZmX3QsIGFuZCBfTEZTNjRfTEFSR0VGSUxFICovCisjICAgIGlmZGVmIFZNUworIyAgICAgIGluY2x1ZGUgPHVuaXhpby5oPiAgICAgICAvKiBmb3Igb2ZmX3QgKi8KKyMgICAgZW5kaWYKKyMgICAgaWZuZGVmIHpfb2ZmX3QKKyMgICAgICBkZWZpbmUgel9vZmZfdCBvZmZfdAorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTEZTNjRfTEFSR0VGSUxFKSAmJiBfTEZTNjRfTEFSR0VGSUxFLTAKKyMgIGRlZmluZSBaX0xGUzY0CisjZW5kaWYKKworI2lmIGRlZmluZWQoX0xBUkdFRklMRTY0X1NPVVJDRSkgJiYgZGVmaW5lZChaX0xGUzY0KQorIyAgZGVmaW5lIFpfTEFSR0U2NAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9GSUxFX09GRlNFVF9CSVRTKSAmJiBfRklMRV9PRkZTRVRfQklUUy0wID09IDY0ICYmIGRlZmluZWQoWl9MRlM2NCkKKyMgIGRlZmluZSBaX1dBTlQ2NAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChTRUVLX1NFVCkgJiYgIWRlZmluZWQoWl9TT0xPKQorIyAgZGVmaW5lIFNFRUtfU0VUICAgICAgICAwICAgICAgIC8qIFNlZWsgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4gICovCisjICBkZWZpbmUgU0VFS19DVVIgICAgICAgIDEgICAgICAgLyogU2VlayBmcm9tIGN1cnJlbnQgcG9zaXRpb24uICAqLworIyAgZGVmaW5lIFNFRUtfRU5EICAgICAgICAyICAgICAgIC8qIFNldCBmaWxlIHBvaW50ZXIgdG8gRU9GIHBsdXMgIm9mZnNldCIgKi8KKyNlbmRpZgorCisjaWZuZGVmIHpfb2ZmX3QKKyMgIGRlZmluZSB6X29mZl90IGxvbmcKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX1dJTjMyKSAmJiBkZWZpbmVkKFpfTEFSR0U2NCkKKyMgIGRlZmluZSB6X29mZjY0X3Qgb2ZmNjRfdAorI2Vsc2UKKyMgIGlmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoWl9TT0xPKQorIyAgICBkZWZpbmUgel9vZmY2NF90IF9faW50NjQKKyMgIGVsc2UKKyMgICAgZGVmaW5lIHpfb2ZmNjRfdCB6X29mZl90CisjICBlbmRpZgorI2VuZGlmCisKKy8qIE1WUyBsaW5rZXIgZG9lcyBub3Qgc3VwcG9ydCBleHRlcm5hbCBuYW1lcyBsYXJnZXIgdGhhbiA4IGJ5dGVzICovCisjaWYgZGVmaW5lZChfX01WU19fKQorICAjcHJhZ21hIG1hcChkZWZsYXRlSW5pdF8sIkRFSU4iKQorICAjcHJhZ21hIG1hcChkZWZsYXRlSW5pdDJfLCJERUlOMiIpCisgICNwcmFnbWEgbWFwKGRlZmxhdGVFbmQsIkRFRU5EIikKKyAgI3ByYWdtYSBtYXAoZGVmbGF0ZUJvdW5kLCJERUJORCIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVJbml0XywiSU5JTiIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVJbml0Ml8sIklOSU4yIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZUVuZCwiSU5FTkQiKQorICAjcHJhZ21hIG1hcChpbmZsYXRlU3luYywiSU5TWSIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVTZXREaWN0aW9uYXJ5LCJJTlNFREkiKQorICAjcHJhZ21hIG1hcChjb21wcmVzc0JvdW5kLCJDTUJORCIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVfdGFibGUsIklOVEFCTCIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVfZmFzdCwiSU5GQSIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVfY29weXJpZ2h0LCJJTkNPUFkiKQorI2VuZGlmCisKKyNlbmRpZiAvKiBaQ09ORl9IICovCmRpZmYgLS1naXQgYS96bGliL3NyYy96Y29uZi5oLmluIGIvemxpYi9zcmMvemNvbmYuaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTg3YTc3Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvemNvbmYuaC5pbgpAQCAtMCwwICsxLDUxMSBAQAorLyogemNvbmYuaCAtLSBjb25maWd1cmF0aW9uIG9mIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogQCgjKSAkSWQkICovCisKKyNpZm5kZWYgWkNPTkZfSAorI2RlZmluZSBaQ09ORl9ICisKKy8qCisgKiBJZiB5b3UgKnJlYWxseSogbmVlZCBhIHVuaXF1ZSBwcmVmaXggZm9yIGFsbCB0eXBlcyBhbmQgbGlicmFyeSBmdW5jdGlvbnMsCisgKiBjb21waWxlIHdpdGggLURaX1BSRUZJWC4gVGhlICJzdGFuZGFyZCIgemxpYiBzaG91bGQgYmUgY29tcGlsZWQgd2l0aG91dCBpdC4KKyAqIEV2ZW4gYmV0dGVyIHRoYW4gY29tcGlsaW5nIHdpdGggLURaX1BSRUZJWCB3b3VsZCBiZSB0byB1c2UgY29uZmlndXJlIHRvIHNldAorICogdGhpcyBwZXJtYW5lbnRseSBpbiB6Y29uZi5oIHVzaW5nICIuL2NvbmZpZ3VyZSAtLXpwcmVmaXgiLgorICovCisjaWZkZWYgWl9QUkVGSVggICAgIC8qIG1heSBiZSBzZXQgdG8gI2lmIDEgYnkgLi9jb25maWd1cmUgKi8KKyMgIGRlZmluZSBaX1BSRUZJWF9TRVQKKworLyogYWxsIGxpbmtlZCBzeW1ib2xzICovCisjICBkZWZpbmUgX2Rpc3RfY29kZSAgICAgICAgICAgIHpfX2Rpc3RfY29kZQorIyAgZGVmaW5lIF9sZW5ndGhfY29kZSAgICAgICAgICB6X19sZW5ndGhfY29kZQorIyAgZGVmaW5lIF90cl9hbGlnbiAgICAgICAgICAgICB6X190cl9hbGlnbgorIyAgZGVmaW5lIF90cl9mbHVzaF9iaXRzICAgICAgICB6X190cl9mbHVzaF9iaXRzCisjICBkZWZpbmUgX3RyX2ZsdXNoX2Jsb2NrICAgICAgIHpfX3RyX2ZsdXNoX2Jsb2NrCisjICBkZWZpbmUgX3RyX2luaXQgICAgICAgICAgICAgIHpfX3RyX2luaXQKKyMgIGRlZmluZSBfdHJfc3RvcmVkX2Jsb2NrICAgICAgel9fdHJfc3RvcmVkX2Jsb2NrCisjICBkZWZpbmUgX3RyX3RhbGx5ICAgICAgICAgICAgIHpfX3RyX3RhbGx5CisjICBkZWZpbmUgYWRsZXIzMiAgICAgICAgICAgICAgIHpfYWRsZXIzMgorIyAgZGVmaW5lIGFkbGVyMzJfY29tYmluZSAgICAgICB6X2FkbGVyMzJfY29tYmluZQorIyAgZGVmaW5lIGFkbGVyMzJfY29tYmluZTY0ICAgICB6X2FkbGVyMzJfY29tYmluZTY0CisjICBpZm5kZWYgWl9TT0xPCisjICAgIGRlZmluZSBjb21wcmVzcyAgICAgICAgICAgICAgel9jb21wcmVzcworIyAgICBkZWZpbmUgY29tcHJlc3MyICAgICAgICAgICAgIHpfY29tcHJlc3MyCisjICAgIGRlZmluZSBjb21wcmVzc0JvdW5kICAgICAgICAgel9jb21wcmVzc0JvdW5kCisjICBlbmRpZgorIyAgZGVmaW5lIGNyYzMyICAgICAgICAgICAgICAgICB6X2NyYzMyCisjICBkZWZpbmUgY3JjMzJfY29tYmluZSAgICAgICAgIHpfY3JjMzJfY29tYmluZQorIyAgZGVmaW5lIGNyYzMyX2NvbWJpbmU2NCAgICAgICB6X2NyYzMyX2NvbWJpbmU2NAorIyAgZGVmaW5lIGRlZmxhdGUgICAgICAgICAgICAgICB6X2RlZmxhdGUKKyMgIGRlZmluZSBkZWZsYXRlQm91bmQgICAgICAgICAgel9kZWZsYXRlQm91bmQKKyMgIGRlZmluZSBkZWZsYXRlQ29weSAgICAgICAgICAgel9kZWZsYXRlQ29weQorIyAgZGVmaW5lIGRlZmxhdGVFbmQgICAgICAgICAgICB6X2RlZmxhdGVFbmQKKyMgIGRlZmluZSBkZWZsYXRlSW5pdDJfICAgICAgICAgel9kZWZsYXRlSW5pdDJfCisjICBkZWZpbmUgZGVmbGF0ZUluaXRfICAgICAgICAgIHpfZGVmbGF0ZUluaXRfCisjICBkZWZpbmUgZGVmbGF0ZVBhcmFtcyAgICAgICAgIHpfZGVmbGF0ZVBhcmFtcworIyAgZGVmaW5lIGRlZmxhdGVQZW5kaW5nICAgICAgICB6X2RlZmxhdGVQZW5kaW5nCisjICBkZWZpbmUgZGVmbGF0ZVByaW1lICAgICAgICAgIHpfZGVmbGF0ZVByaW1lCisjICBkZWZpbmUgZGVmbGF0ZVJlc2V0ICAgICAgICAgIHpfZGVmbGF0ZVJlc2V0CisjICBkZWZpbmUgZGVmbGF0ZVJlc2V0S2VlcCAgICAgIHpfZGVmbGF0ZVJlc2V0S2VlcAorIyAgZGVmaW5lIGRlZmxhdGVTZXREaWN0aW9uYXJ5ICB6X2RlZmxhdGVTZXREaWN0aW9uYXJ5CisjICBkZWZpbmUgZGVmbGF0ZVNldEhlYWRlciAgICAgIHpfZGVmbGF0ZVNldEhlYWRlcgorIyAgZGVmaW5lIGRlZmxhdGVUdW5lICAgICAgICAgICB6X2RlZmxhdGVUdW5lCisjICBkZWZpbmUgZGVmbGF0ZV9jb3B5cmlnaHQgICAgIHpfZGVmbGF0ZV9jb3B5cmlnaHQKKyMgIGRlZmluZSBnZXRfY3JjX3RhYmxlICAgICAgICAgel9nZXRfY3JjX3RhYmxlCisjICBpZm5kZWYgWl9TT0xPCisjICAgIGRlZmluZSBnel9lcnJvciAgICAgICAgICAgICAgel9nel9lcnJvcgorIyAgICBkZWZpbmUgZ3pfaW50bWF4ICAgICAgICAgICAgIHpfZ3pfaW50bWF4CisjICAgIGRlZmluZSBnel9zdHJ3aW5lcnJvciAgICAgICAgel9nel9zdHJ3aW5lcnJvcgorIyAgICBkZWZpbmUgZ3pidWZmZXIgICAgICAgICAgICAgIHpfZ3pidWZmZXIKKyMgICAgZGVmaW5lIGd6Y2xlYXJlcnIgICAgICAgICAgICB6X2d6Y2xlYXJlcnIKKyMgICAgZGVmaW5lIGd6Y2xvc2UgICAgICAgICAgICAgICB6X2d6Y2xvc2UKKyMgICAgZGVmaW5lIGd6Y2xvc2VfciAgICAgICAgICAgICB6X2d6Y2xvc2VfcgorIyAgICBkZWZpbmUgZ3pjbG9zZV93ICAgICAgICAgICAgIHpfZ3pjbG9zZV93CisjICAgIGRlZmluZSBnemRpcmVjdCAgICAgICAgICAgICAgel9nemRpcmVjdAorIyAgICBkZWZpbmUgZ3pkb3BlbiAgICAgICAgICAgICAgIHpfZ3pkb3BlbgorIyAgICBkZWZpbmUgZ3plb2YgICAgICAgICAgICAgICAgIHpfZ3plb2YKKyMgICAgZGVmaW5lIGd6ZXJyb3IgICAgICAgICAgICAgICB6X2d6ZXJyb3IKKyMgICAgZGVmaW5lIGd6Zmx1c2ggICAgICAgICAgICAgICB6X2d6Zmx1c2gKKyMgICAgZGVmaW5lIGd6Z2V0YyAgICAgICAgICAgICAgICB6X2d6Z2V0YworIyAgICBkZWZpbmUgZ3pnZXRjXyAgICAgICAgICAgICAgIHpfZ3pnZXRjXworIyAgICBkZWZpbmUgZ3pnZXRzICAgICAgICAgICAgICAgIHpfZ3pnZXRzCisjICAgIGRlZmluZSBnem9mZnNldCAgICAgICAgICAgICAgel9nem9mZnNldAorIyAgICBkZWZpbmUgZ3pvZmZzZXQ2NCAgICAgICAgICAgIHpfZ3pvZmZzZXQ2NAorIyAgICBkZWZpbmUgZ3pvcGVuICAgICAgICAgICAgICAgIHpfZ3pvcGVuCisjICAgIGRlZmluZSBnem9wZW42NCAgICAgICAgICAgICAgel9nem9wZW42NAorIyAgICBpZmRlZiBfV0lOMzIKKyMgICAgICBkZWZpbmUgZ3pvcGVuX3cgICAgICAgICAgICAgIHpfZ3pvcGVuX3cKKyMgICAgZW5kaWYKKyMgICAgZGVmaW5lIGd6cHJpbnRmICAgICAgICAgICAgICB6X2d6cHJpbnRmCisjICAgIGRlZmluZSBnenZwcmludGYgICAgICAgICAgICAgel9nenZwcmludGYKKyMgICAgZGVmaW5lIGd6cHV0YyAgICAgICAgICAgICAgICB6X2d6cHV0YworIyAgICBkZWZpbmUgZ3pwdXRzICAgICAgICAgICAgICAgIHpfZ3pwdXRzCisjICAgIGRlZmluZSBnenJlYWQgICAgICAgICAgICAgICAgel9nenJlYWQKKyMgICAgZGVmaW5lIGd6cmV3aW5kICAgICAgICAgICAgICB6X2d6cmV3aW5kCisjICAgIGRlZmluZSBnenNlZWsgICAgICAgICAgICAgICAgel9nenNlZWsKKyMgICAgZGVmaW5lIGd6c2VlazY0ICAgICAgICAgICAgICB6X2d6c2VlazY0CisjICAgIGRlZmluZSBnenNldHBhcmFtcyAgICAgICAgICAgel9nenNldHBhcmFtcworIyAgICBkZWZpbmUgZ3p0ZWxsICAgICAgICAgICAgICAgIHpfZ3p0ZWxsCisjICAgIGRlZmluZSBnenRlbGw2NCAgICAgICAgICAgICAgel9nenRlbGw2NAorIyAgICBkZWZpbmUgZ3p1bmdldGMgICAgICAgICAgICAgIHpfZ3p1bmdldGMKKyMgICAgZGVmaW5lIGd6d3JpdGUgICAgICAgICAgICAgICB6X2d6d3JpdGUKKyMgIGVuZGlmCisjICBkZWZpbmUgaW5mbGF0ZSAgICAgICAgICAgICAgIHpfaW5mbGF0ZQorIyAgZGVmaW5lIGluZmxhdGVCYWNrICAgICAgICAgICB6X2luZmxhdGVCYWNrCisjICBkZWZpbmUgaW5mbGF0ZUJhY2tFbmQgICAgICAgIHpfaW5mbGF0ZUJhY2tFbmQKKyMgIGRlZmluZSBpbmZsYXRlQmFja0luaXRfICAgICAgel9pbmZsYXRlQmFja0luaXRfCisjICBkZWZpbmUgaW5mbGF0ZUNvcHkgICAgICAgICAgIHpfaW5mbGF0ZUNvcHkKKyMgIGRlZmluZSBpbmZsYXRlRW5kICAgICAgICAgICAgel9pbmZsYXRlRW5kCisjICBkZWZpbmUgaW5mbGF0ZUdldEhlYWRlciAgICAgIHpfaW5mbGF0ZUdldEhlYWRlcgorIyAgZGVmaW5lIGluZmxhdGVJbml0Ml8gICAgICAgICB6X2luZmxhdGVJbml0Ml8KKyMgIGRlZmluZSBpbmZsYXRlSW5pdF8gICAgICAgICAgel9pbmZsYXRlSW5pdF8KKyMgIGRlZmluZSBpbmZsYXRlTWFyayAgICAgICAgICAgel9pbmZsYXRlTWFyaworIyAgZGVmaW5lIGluZmxhdGVQcmltZSAgICAgICAgICB6X2luZmxhdGVQcmltZQorIyAgZGVmaW5lIGluZmxhdGVSZXNldCAgICAgICAgICB6X2luZmxhdGVSZXNldAorIyAgZGVmaW5lIGluZmxhdGVSZXNldDIgICAgICAgICB6X2luZmxhdGVSZXNldDIKKyMgIGRlZmluZSBpbmZsYXRlU2V0RGljdGlvbmFyeSAgel9pbmZsYXRlU2V0RGljdGlvbmFyeQorIyAgZGVmaW5lIGluZmxhdGVHZXREaWN0aW9uYXJ5ICB6X2luZmxhdGVHZXREaWN0aW9uYXJ5CisjICBkZWZpbmUgaW5mbGF0ZVN5bmMgICAgICAgICAgIHpfaW5mbGF0ZVN5bmMKKyMgIGRlZmluZSBpbmZsYXRlU3luY1BvaW50ICAgICAgel9pbmZsYXRlU3luY1BvaW50CisjICBkZWZpbmUgaW5mbGF0ZVVuZGVybWluZSAgICAgIHpfaW5mbGF0ZVVuZGVybWluZQorIyAgZGVmaW5lIGluZmxhdGVSZXNldEtlZXAgICAgICB6X2luZmxhdGVSZXNldEtlZXAKKyMgIGRlZmluZSBpbmZsYXRlX2NvcHlyaWdodCAgICAgel9pbmZsYXRlX2NvcHlyaWdodAorIyAgZGVmaW5lIGluZmxhdGVfZmFzdCAgICAgICAgICB6X2luZmxhdGVfZmFzdAorIyAgZGVmaW5lIGluZmxhdGVfdGFibGUgICAgICAgICB6X2luZmxhdGVfdGFibGUKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgZGVmaW5lIHVuY29tcHJlc3MgICAgICAgICAgICB6X3VuY29tcHJlc3MKKyMgIGVuZGlmCisjICBkZWZpbmUgekVycm9yICAgICAgICAgICAgICAgIHpfekVycm9yCisjICBpZm5kZWYgWl9TT0xPCisjICAgIGRlZmluZSB6Y2FsbG9jICAgICAgICAgICAgICAgel96Y2FsbG9jCisjICAgIGRlZmluZSB6Y2ZyZWUgICAgICAgICAgICAgICAgel96Y2ZyZWUKKyMgIGVuZGlmCisjICBkZWZpbmUgemxpYkNvbXBpbGVGbGFncyAgICAgIHpfemxpYkNvbXBpbGVGbGFncworIyAgZGVmaW5lIHpsaWJWZXJzaW9uICAgICAgICAgICB6X3psaWJWZXJzaW9uCisKKy8qIGFsbCB6bGliIHR5cGVkZWZzIGluIHpsaWIuaCBhbmQgemNvbmYuaCAqLworIyAgZGVmaW5lIEJ5dGUgICAgICAgICAgICAgICAgICB6X0J5dGUKKyMgIGRlZmluZSBCeXRlZiAgICAgICAgICAgICAgICAgel9CeXRlZgorIyAgZGVmaW5lIGFsbG9jX2Z1bmMgICAgICAgICAgICB6X2FsbG9jX2Z1bmMKKyMgIGRlZmluZSBjaGFyZiAgICAgICAgICAgICAgICAgel9jaGFyZgorIyAgZGVmaW5lIGZyZWVfZnVuYyAgICAgICAgICAgICB6X2ZyZWVfZnVuYworIyAgaWZuZGVmIFpfU09MTworIyAgICBkZWZpbmUgZ3pGaWxlICAgICAgICAgICAgICAgIHpfZ3pGaWxlCisjICBlbmRpZgorIyAgZGVmaW5lIGd6X2hlYWRlciAgICAgICAgICAgICB6X2d6X2hlYWRlcgorIyAgZGVmaW5lIGd6X2hlYWRlcnAgICAgICAgICAgICB6X2d6X2hlYWRlcnAKKyMgIGRlZmluZSBpbl9mdW5jICAgICAgICAgICAgICAgel9pbl9mdW5jCisjICBkZWZpbmUgaW50ZiAgICAgICAgICAgICAgICAgIHpfaW50ZgorIyAgZGVmaW5lIG91dF9mdW5jICAgICAgICAgICAgICB6X291dF9mdW5jCisjICBkZWZpbmUgdUludCAgICAgICAgICAgICAgICAgIHpfdUludAorIyAgZGVmaW5lIHVJbnRmICAgICAgICAgICAgICAgICB6X3VJbnRmCisjICBkZWZpbmUgdUxvbmcgICAgICAgICAgICAgICAgIHpfdUxvbmcKKyMgIGRlZmluZSB1TG9uZ2YgICAgICAgICAgICAgICAgel91TG9uZ2YKKyMgIGRlZmluZSB2b2lkcCAgICAgICAgICAgICAgICAgel92b2lkcAorIyAgZGVmaW5lIHZvaWRwYyAgICAgICAgICAgICAgICB6X3ZvaWRwYworIyAgZGVmaW5lIHZvaWRwZiAgICAgICAgICAgICAgICB6X3ZvaWRwZgorCisvKiBhbGwgemxpYiBzdHJ1Y3RzIGluIHpsaWIuaCBhbmQgemNvbmYuaCAqLworIyAgZGVmaW5lIGd6X2hlYWRlcl9zICAgICAgICAgICB6X2d6X2hlYWRlcl9zCisjICBkZWZpbmUgaW50ZXJuYWxfc3RhdGUgICAgICAgIHpfaW50ZXJuYWxfc3RhdGUKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fTVNET1NfXykgJiYgIWRlZmluZWQoTVNET1MpCisjICBkZWZpbmUgTVNET1MKKyNlbmRpZgorI2lmIChkZWZpbmVkKE9TXzIpIHx8IGRlZmluZWQoX19PUzJfXykpICYmICFkZWZpbmVkKE9TMikKKyMgIGRlZmluZSBPUzIKKyNlbmRpZgorI2lmIGRlZmluZWQoX1dJTkRPV1MpICYmICFkZWZpbmVkKFdJTkRPV1MpCisjICBkZWZpbmUgV0lORE9XUworI2VuZGlmCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkgfHwgZGVmaW5lZChfX1dJTjMyX18pCisjICBpZm5kZWYgV0lOMzIKKyMgICAgZGVmaW5lIFdJTjMyCisjICBlbmRpZgorI2VuZGlmCisjaWYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTkRPV1MpKSAmJiAhZGVmaW5lZChXSU4zMikKKyMgIGlmICFkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX0ZMQVRfXykgJiYgIWRlZmluZWQoX18zODZfXykKKyMgICAgaWZuZGVmIFNZUzE2QklUCisjICAgICAgZGVmaW5lIFNZUzE2QklUCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKy8qCisgKiBDb21waWxlIHdpdGggLURNQVhTRUdfNjRLIGlmIHRoZSBhbGxvYyBmdW5jdGlvbiBjYW5ub3QgYWxsb2NhdGUgbW9yZQorICogdGhhbiA2NGsgYnl0ZXMgYXQgYSB0aW1lIChuZWVkZWQgb24gc3lzdGVtcyB3aXRoIDE2LWJpdCBpbnQpLgorICovCisjaWZkZWYgU1lTMTZCSVQKKyMgIGRlZmluZSBNQVhTRUdfNjRLCisjZW5kaWYKKyNpZmRlZiBNU0RPUworIyAgZGVmaW5lIFVOQUxJR05FRF9PSworI2VuZGlmCisKKyNpZmRlZiBfX1NURENfVkVSU0lPTl9fCisjICBpZm5kZWYgU1REQworIyAgICBkZWZpbmUgU1REQworIyAgZW5kaWYKKyMgIGlmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorIyAgICBpZm5kZWYgU1REQzk5CisjICAgICAgZGVmaW5lIFNUREM5OQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKFdJTkRPV1MpIHx8IGRlZmluZWQoV0lOMzIpKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChfX0hPU19BSVhfXykpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fT1M0MDBfXykgJiYgIWRlZmluZWQoU1REQykgICAgLyogaVNlcmllcyAoZm9ybWVybHkgQVMvNDAwKS4gKi8KKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKworI2lmbmRlZiBTVERDCisjICBpZm5kZWYgY29uc3QgLyogY2Fubm90IHVzZSAhZGVmaW5lZChTVERDKSAmJiAhZGVmaW5lZChjb25zdCkgb24gTWFjICovCisjICAgIGRlZmluZSBjb25zdCAgICAgICAvKiBub3RlOiBuZWVkIGEgbW9yZSBnZW50bGUgc29sdXRpb24gaGVyZSAqLworIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChaTElCX0NPTlNUKSAmJiAhZGVmaW5lZCh6X2NvbnN0KQorIyAgZGVmaW5lIHpfY29uc3QgY29uc3QKKyNlbHNlCisjICBkZWZpbmUgel9jb25zdAorI2VuZGlmCisKKy8qIFNvbWUgTWFjIGNvbXBpbGVycyBtZXJnZSBhbGwgLmggZmlsZXMgaW5jb3JyZWN0bHk6ICovCisjaWYgZGVmaW5lZChfX01XRVJLU19fKXx8ZGVmaW5lZChhcHBsZWMpfHxkZWZpbmVkKFRISU5LX0MpfHxkZWZpbmVkKF9fU0NfXykKKyMgIGRlZmluZSBOT19EVU1NWV9ERUNMCisjZW5kaWYKKworLyogTWF4aW11bSB2YWx1ZSBmb3IgbWVtTGV2ZWwgaW4gZGVmbGF0ZUluaXQyICovCisjaWZuZGVmIE1BWF9NRU1fTEVWRUwKKyMgIGlmZGVmIE1BWFNFR182NEsKKyMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOAorIyAgZWxzZQorIyAgICBkZWZpbmUgTUFYX01FTV9MRVZFTCA5CisjICBlbmRpZgorI2VuZGlmCisKKy8qIE1heGltdW0gdmFsdWUgZm9yIHdpbmRvd0JpdHMgaW4gZGVmbGF0ZUluaXQyIGFuZCBpbmZsYXRlSW5pdDIuCisgKiBXQVJOSU5HOiByZWR1Y2luZyBNQVhfV0JJVFMgbWFrZXMgbWluaWd6aXAgdW5hYmxlIHRvIGV4dHJhY3QgLmd6IGZpbGVzCisgKiBjcmVhdGVkIGJ5IGd6aXAuIChGaWxlcyBjcmVhdGVkIGJ5IG1pbmlnemlwIGNhbiBzdGlsbCBiZSBleHRyYWN0ZWQgYnkKKyAqIGd6aXAuKQorICovCisjaWZuZGVmIE1BWF9XQklUUworIyAgZGVmaW5lIE1BWF9XQklUUyAgIDE1IC8qIDMySyBMWjc3IHdpbmRvdyAqLworI2VuZGlmCisKKy8qIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBkZWZsYXRlIGFyZSAoaW4gYnl0ZXMpOgorICAgICAgICAgICAgKDEgPDwgKHdpbmRvd0JpdHMrMikpICsgICgxIDw8IChtZW1MZXZlbCs5KSkKKyB0aGF0IGlzOiAxMjhLIGZvciB3aW5kb3dCaXRzPTE1ICArICAxMjhLIGZvciBtZW1MZXZlbCA9IDggIChkZWZhdWx0IHZhbHVlcykKKyBwbHVzIGEgZmV3IGtpbG9ieXRlcyBmb3Igc21hbGwgb2JqZWN0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHJlZHVjZQorIHRoZSBkZWZhdWx0IG1lbW9yeSByZXF1aXJlbWVudHMgZnJvbSAyNTZLIHRvIDEyOEssIGNvbXBpbGUgd2l0aAorICAgICBtYWtlIENGTEFHUz0iLU8gLURNQVhfV0JJVFM9MTQgLURNQVhfTUVNX0xFVkVMPTciCisgT2YgY291cnNlIHRoaXMgd2lsbCBnZW5lcmFsbHkgZGVncmFkZSBjb21wcmVzc2lvbiAodGhlcmUncyBubyBmcmVlIGx1bmNoKS4KKworICAgVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGluZmxhdGUgYXJlIChpbiBieXRlcykgMSA8PCB3aW5kb3dCaXRzCisgdGhhdCBpcywgMzJLIGZvciB3aW5kb3dCaXRzPTE1IChkZWZhdWx0IHZhbHVlKSBwbHVzIGEgZmV3IGtpbG9ieXRlcworIGZvciBzbWFsbCBvYmplY3RzLgorKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSBkZWNsYXJhdGlvbnMgKi8KKworI2lmbmRlZiBPRiAvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCisjICBpZmRlZiBTVERDCisjICAgIGRlZmluZSBPRihhcmdzKSAgYXJncworIyAgZWxzZQorIyAgICBkZWZpbmUgT0YoYXJncykgICgpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgWl9BUkcgLyogZnVuY3Rpb24gcHJvdG90eXBlcyBmb3Igc3RkYXJnICovCisjICBpZiBkZWZpbmVkKFNUREMpIHx8IGRlZmluZWQoWl9IQVZFX1NUREFSR19IKQorIyAgICBkZWZpbmUgWl9BUkcoYXJncykgIGFyZ3MKKyMgIGVsc2UKKyMgICAgZGVmaW5lIFpfQVJHKGFyZ3MpICAoKQorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGZvciBGQVIgYXJlIG5lZWRlZCBvbmx5IGZvciBNU0RPUyBtaXhlZAorICogbW9kZWwgcHJvZ3JhbW1pbmcgKHNtYWxsIG9yIG1lZGl1bSBtb2RlbCB3aXRoIHNvbWUgZmFyIGFsbG9jYXRpb25zKS4KKyAqIFRoaXMgd2FzIHRlc3RlZCBvbmx5IHdpdGggTVNDOyBmb3Igb3RoZXIgTVNET1MgY29tcGlsZXJzIHlvdSBtYXkgaGF2ZQorICogdG8gZGVmaW5lIE5PX01FTUNQWSBpbiB6dXRpbC5oLiAgSWYgeW91IGRvbid0IG5lZWQgdGhlIG1peGVkIG1vZGVsLAorICoganVzdCBkZWZpbmUgRkFSIHRvIGJlIGVtcHR5LgorICovCisjaWZkZWYgU1lTMTZCSVQKKyMgIGlmIGRlZmluZWQoTV9JODZTTSkgfHwgZGVmaW5lZChNX0k4Nk1NKQorICAgICAvKiBNU0Mgc21hbGwgb3IgbWVkaXVtIG1vZGVsICovCisjICAgIGRlZmluZSBTTUFMTF9NRURJVU0KKyMgICAgaWZkZWYgX01TQ19WRVIKKyMgICAgICBkZWZpbmUgRkFSIF9mYXIKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBGQVIgZmFyCisjICAgIGVuZGlmCisjICBlbmRpZgorIyAgaWYgKGRlZmluZWQoX19TTUFMTF9fKSB8fCBkZWZpbmVkKF9fTUVESVVNX18pKQorICAgICAvKiBUdXJibyBDIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLworIyAgICBkZWZpbmUgU01BTExfTUVESVVNCisjICAgIGlmZGVmIF9fQk9STEFORENfXworIyAgICAgIGRlZmluZSBGQVIgX2ZhcgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIEZBUiBmYXIKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoV0lORE9XUykgfHwgZGVmaW5lZChXSU4zMikKKyAgIC8qIElmIGJ1aWxkaW5nIG9yIHVzaW5nIHpsaWIgYXMgYSBETEwsIGRlZmluZSBaTElCX0RMTC4KKyAgICAqIFRoaXMgaXMgbm90IG1hbmRhdG9yeSwgYnV0IGl0IG9mZmVycyBhIGxpdHRsZSBwZXJmb3JtYW5jZSBpbmNyZWFzZS4KKyAgICAqLworIyAgaWZkZWYgWkxJQl9ETEwKKyMgICAgaWYgZGVmaW5lZChXSU4zMikgJiYgKCFkZWZpbmVkKF9fQk9STEFORENfXykgfHwgKF9fQk9STEFORENfXyA+PSAweDUwMCkpCisjICAgICAgaWZkZWYgWkxJQl9JTlRFUk5BTAorIyAgICAgICAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICAgIGVsc2UKKyMgICAgICAgIGRlZmluZSBaRVhURVJOIGV4dGVybiBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYgIC8qIFpMSUJfRExMICovCisgICAvKiBJZiBidWlsZGluZyBvciB1c2luZyB6bGliIHdpdGggdGhlIFdJTkFQSS9XSU5BUElWIGNhbGxpbmcgY29udmVudGlvbiwKKyAgICAqIGRlZmluZSBaTElCX1dJTkFQSS4KKyAgICAqIENhdXRpb246IHRoZSBzdGFuZGFyZCBaTElCMS5ETEwgaXMgTk9UIGNvbXBpbGVkIHVzaW5nIFpMSUJfV0lOQVBJLgorICAgICovCisjICBpZmRlZiBaTElCX1dJTkFQSQorIyAgICBpZmRlZiBGQVIKKyMgICAgICB1bmRlZiBGQVIKKyMgICAgZW5kaWYKKyMgICAgaW5jbHVkZSA8d2luZG93cy5oPgorICAgICAvKiBObyBuZWVkIGZvciBfZXhwb3J0LCB1c2UgWkxJQi5ERUYgaW5zdGVhZC4gKi8KKyAgICAgLyogRm9yIGNvbXBsZXRlIFdpbmRvd3MgY29tcGF0aWJpbGl0eSwgdXNlIFdJTkFQSSwgbm90IF9fc3RkY2FsbC4gKi8KKyMgICAgZGVmaW5lIFpFWFBPUlQgV0lOQVBJCisjICAgIGlmZGVmIFdJTjMyCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBXSU5BUElWCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIEZBUiBDREVDTAorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19CRU9TX18pCisjICBpZmRlZiBaTElCX0RMTAorIyAgICBpZmRlZiBaTElCX0lOVEVSTkFMCisjICAgICAgZGVmaW5lIFpFWFBPUlQgICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIFpFWFBPUlQgICBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFpFWFRFUk4KKyMgIGRlZmluZSBaRVhURVJOIGV4dGVybgorI2VuZGlmCisjaWZuZGVmIFpFWFBPUlQKKyMgIGRlZmluZSBaRVhQT1JUCisjZW5kaWYKKyNpZm5kZWYgWkVYUE9SVFZBCisjICBkZWZpbmUgWkVYUE9SVFZBCisjZW5kaWYKKworI2lmbmRlZiBGQVIKKyMgIGRlZmluZSBGQVIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX19NQUNUWVBFU19fKQordHlwZWRlZiB1bnNpZ25lZCBjaGFyICBCeXRlOyAgLyogOCBiaXRzICovCisjZW5kaWYKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgdUludDsgIC8qIDE2IGJpdHMgb3IgbW9yZSAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nICB1TG9uZzsgLyogMzIgYml0cyBvciBtb3JlICovCisKKyNpZmRlZiBTTUFMTF9NRURJVU0KKyAgIC8qIEJvcmxhbmQgQy9DKysgYW5kIHNvbWUgb2xkIE1TQyB2ZXJzaW9ucyBpZ25vcmUgRkFSIGluc2lkZSB0eXBlZGVmICovCisjICBkZWZpbmUgQnl0ZWYgQnl0ZSBGQVIKKyNlbHNlCisgICB0eXBlZGVmIEJ5dGUgIEZBUiBCeXRlZjsKKyNlbmRpZgordHlwZWRlZiBjaGFyICBGQVIgY2hhcmY7Cit0eXBlZGVmIGludCAgIEZBUiBpbnRmOwordHlwZWRlZiB1SW50ICBGQVIgdUludGY7Cit0eXBlZGVmIHVMb25nIEZBUiB1TG9uZ2Y7CisKKyNpZmRlZiBTVERDCisgICB0eXBlZGVmIHZvaWQgY29uc3QgKnZvaWRwYzsKKyAgIHR5cGVkZWYgdm9pZCBGQVIgICAqdm9pZHBmOworICAgdHlwZWRlZiB2b2lkICAgICAgICp2b2lkcDsKKyNlbHNlCisgICB0eXBlZGVmIEJ5dGUgY29uc3QgKnZvaWRwYzsKKyAgIHR5cGVkZWYgQnl0ZSBGQVIgICAqdm9pZHBmOworICAgdHlwZWRlZiBCeXRlICAgICAgICp2b2lkcDsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoWl9VNCkgJiYgIWRlZmluZWQoWl9TT0xPKSAmJiBkZWZpbmVkKFNUREMpCisjICBpbmNsdWRlIDxsaW1pdHMuaD4KKyMgIGlmIChVSU5UX01BWCA9PSAweGZmZmZmZmZmVUwpCisjICAgIGRlZmluZSBaX1U0IHVuc2lnbmVkCisjICBlbGlmIChVTE9OR19NQVggPT0gMHhmZmZmZmZmZlVMKQorIyAgICBkZWZpbmUgWl9VNCB1bnNpZ25lZCBsb25nCisjICBlbGlmIChVU0hSVF9NQVggPT0gMHhmZmZmZmZmZlVMKQorIyAgICBkZWZpbmUgWl9VNCB1bnNpZ25lZCBzaG9ydAorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgWl9VNAorICAgdHlwZWRlZiBaX1U0IHpfY3JjX3Q7CisjZWxzZQorICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIHpfY3JjX3Q7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVU5JU1REX0ggICAgLyogbWF5IGJlIHNldCB0byAjaWYgMSBieSAuL2NvbmZpZ3VyZSAqLworIyAgZGVmaW5lIFpfSEFWRV9VTklTVERfSAorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUREFSR19IICAgIC8qIG1heSBiZSBzZXQgdG8gI2lmIDEgYnkgLi9jb25maWd1cmUgKi8KKyMgIGRlZmluZSBaX0hBVkVfU1REQVJHX0gKKyNlbmRpZgorCisjaWZkZWYgU1REQworIyAgaWZuZGVmIFpfU09MTworIyAgICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gICAgICAvKiBmb3Igb2ZmX3QgKi8KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1REQykgfHwgZGVmaW5lZChaX0hBVkVfU1REQVJHX0gpCisjICBpZm5kZWYgWl9TT0xPCisjICAgIGluY2x1ZGUgPHN0ZGFyZy5oPiAgICAgICAgIC8qIGZvciB2YV9saXN0ICovCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgaW5jbHVkZSA8c3RkZGVmLmg+ICAgICAgICAgLyogZm9yIHdjaGFyX3QgKi8KKyMgIGVuZGlmCisjZW5kaWYKKworLyogYSBsaXR0bGUgdHJpY2sgdG8gYWNjb21tb2RhdGUgYm90aCAiI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIiBhbmQKKyAqICIjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UgMSIgYXMgcmVxdWVzdGluZyA2NC1iaXQgb3BlcmF0aW9ucywgKGV2ZW4KKyAqIHRob3VnaCB0aGUgZm9ybWVyIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIExGUyBkb2N1bWVudCksIGJ1dCBjb25zaWRlcmluZworICogYm90aCAiI3VuZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UiIGFuZCAiI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIDAiIGFzCisgKiBlcXVpdmFsZW50bHkgcmVxdWVzdGluZyBubyA2NC1iaXQgb3BlcmF0aW9ucworICovCisjaWYgZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKSAmJiAtX0xBUkdFRklMRTY0X1NPVVJDRSAtIC0xID09IDEKKyMgIHVuZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX1dBVENPTUNfXykgJiYgIWRlZmluZWQoWl9IQVZFX1VOSVNURF9IKQorIyAgZGVmaW5lIFpfSEFWRV9VTklTVERfSAorI2VuZGlmCisjaWZuZGVmIFpfU09MTworIyAgaWYgZGVmaW5lZChaX0hBVkVfVU5JU1REX0gpIHx8IGRlZmluZWQoX0xBUkdFRklMRTY0X1NPVVJDRSkKKyMgICAgaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAgICAgLyogZm9yIFNFRUtfKiwgb2ZmX3QsIGFuZCBfTEZTNjRfTEFSR0VGSUxFICovCisjICAgIGlmZGVmIFZNUworIyAgICAgIGluY2x1ZGUgPHVuaXhpby5oPiAgICAgICAvKiBmb3Igb2ZmX3QgKi8KKyMgICAgZW5kaWYKKyMgICAgaWZuZGVmIHpfb2ZmX3QKKyMgICAgICBkZWZpbmUgel9vZmZfdCBvZmZfdAorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTEZTNjRfTEFSR0VGSUxFKSAmJiBfTEZTNjRfTEFSR0VGSUxFLTAKKyMgIGRlZmluZSBaX0xGUzY0CisjZW5kaWYKKworI2lmIGRlZmluZWQoX0xBUkdFRklMRTY0X1NPVVJDRSkgJiYgZGVmaW5lZChaX0xGUzY0KQorIyAgZGVmaW5lIFpfTEFSR0U2NAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9GSUxFX09GRlNFVF9CSVRTKSAmJiBfRklMRV9PRkZTRVRfQklUUy0wID09IDY0ICYmIGRlZmluZWQoWl9MRlM2NCkKKyMgIGRlZmluZSBaX1dBTlQ2NAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChTRUVLX1NFVCkgJiYgIWRlZmluZWQoWl9TT0xPKQorIyAgZGVmaW5lIFNFRUtfU0VUICAgICAgICAwICAgICAgIC8qIFNlZWsgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4gICovCisjICBkZWZpbmUgU0VFS19DVVIgICAgICAgIDEgICAgICAgLyogU2VlayBmcm9tIGN1cnJlbnQgcG9zaXRpb24uICAqLworIyAgZGVmaW5lIFNFRUtfRU5EICAgICAgICAyICAgICAgIC8qIFNldCBmaWxlIHBvaW50ZXIgdG8gRU9GIHBsdXMgIm9mZnNldCIgKi8KKyNlbmRpZgorCisjaWZuZGVmIHpfb2ZmX3QKKyMgIGRlZmluZSB6X29mZl90IGxvbmcKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX1dJTjMyKSAmJiBkZWZpbmVkKFpfTEFSR0U2NCkKKyMgIGRlZmluZSB6X29mZjY0X3Qgb2ZmNjRfdAorI2Vsc2UKKyMgIGlmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoWl9TT0xPKQorIyAgICBkZWZpbmUgel9vZmY2NF90IF9faW50NjQKKyMgIGVsc2UKKyMgICAgZGVmaW5lIHpfb2ZmNjRfdCB6X29mZl90CisjICBlbmRpZgorI2VuZGlmCisKKy8qIE1WUyBsaW5rZXIgZG9lcyBub3Qgc3VwcG9ydCBleHRlcm5hbCBuYW1lcyBsYXJnZXIgdGhhbiA4IGJ5dGVzICovCisjaWYgZGVmaW5lZChfX01WU19fKQorICAjcHJhZ21hIG1hcChkZWZsYXRlSW5pdF8sIkRFSU4iKQorICAjcHJhZ21hIG1hcChkZWZsYXRlSW5pdDJfLCJERUlOMiIpCisgICNwcmFnbWEgbWFwKGRlZmxhdGVFbmQsIkRFRU5EIikKKyAgI3ByYWdtYSBtYXAoZGVmbGF0ZUJvdW5kLCJERUJORCIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVJbml0XywiSU5JTiIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVJbml0Ml8sIklOSU4yIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZUVuZCwiSU5FTkQiKQorICAjcHJhZ21hIG1hcChpbmZsYXRlU3luYywiSU5TWSIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVTZXREaWN0aW9uYXJ5LCJJTlNFREkiKQorICAjcHJhZ21hIG1hcChjb21wcmVzc0JvdW5kLCJDTUJORCIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVfdGFibGUsIklOVEFCTCIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVfZmFzdCwiSU5GQSIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVfY29weXJpZ2h0LCJJTkNPUFkiKQorI2VuZGlmCisKKyNlbmRpZiAvKiBaQ09ORl9IICovCmRpZmYgLS1naXQgYS96bGliL3NyYy96bGliLjMgYi96bGliL3NyYy96bGliLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE2MGU2MgotLS0gL2Rldi9udWxsCisrKyBiL3psaWIvc3JjL3psaWIuMwpAQCAtMCwwICsxLDE1MSBAQAorLlRIIFpMSUIgMyAiMjggQXByIDIwMTMiCisuU0ggTkFNRQoremxpYiBcLSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGxpYnJhcnkKKy5TSCBTWU5PUFNJUworW3NlZQorLkkgemxpYi5oCitmb3IgZnVsbCBkZXNjcmlwdGlvbl0KKy5TSCBERVNDUklQVElPTgorVGhlCisuSSB6bGliCitsaWJyYXJ5IGlzIGEgZ2VuZXJhbCBwdXJwb3NlIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KK1RoZSBjb2RlIGlzIHRocmVhZCBzYWZlLCBhc3N1bWluZyB0aGF0IHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGZ1bmN0aW9ucwordXNlZCBhcmUgdGhyZWFkIHNhZmUsIHN1Y2ggYXMgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMuCitJdCBwcm92aWRlcyBpbi1tZW1vcnkgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gZnVuY3Rpb25zLAoraW5jbHVkaW5nIGludGVncml0eSBjaGVja3Mgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhLgorVGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHN1cHBvcnRzIG9ubHkgb25lIGNvbXByZXNzaW9uIG1ldGhvZCAoZGVmbGF0aW9uKQorYnV0IG90aGVyIGFsZ29yaXRobXMgbWF5IGJlIGFkZGVkIGxhdGVyCit3aXRoIHRoZSBzYW1lIHN0cmVhbSBpbnRlcmZhY2UuCisuTFAKK0NvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAgaWYgdGhlIGJ1ZmZlcnMgYXJlIGxhcmdlIGVub3VnaAorb3IgY2FuIGJlIGRvbmUgYnkgcmVwZWF0ZWQgY2FsbHMgb2YgdGhlIGNvbXByZXNzaW9uIGZ1bmN0aW9uLgorSW4gdGhlIGxhdHRlciBjYXNlLAordGhlIGFwcGxpY2F0aW9uIG11c3QgcHJvdmlkZSBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1lIHRoZSBvdXRwdXQKKyhwcm92aWRpbmcgbW9yZSBvdXRwdXQgc3BhY2UpIGJlZm9yZSBlYWNoIGNhbGwuCisuTFAKK1RoZSBsaWJyYXJ5IGFsc28gc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbgorLklSIGd6aXAgKDEpCisoLmd6KSBmb3JtYXQKK3dpdGggYW4gaW50ZXJmYWNlIHNpbWlsYXIgdG8gdGhhdCBvZiBzdGRpby4KKy5MUAorVGhlIGxpYnJhcnkgZG9lcyBub3QgaW5zdGFsbCBhbnkgc2lnbmFsIGhhbmRsZXIuCitUaGUgZGVjb2RlciBjaGVja3MgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEsCitzbyB0aGUgbGlicmFyeSBzaG91bGQgbmV2ZXIgY3Jhc2ggZXZlbiBpbiB0aGUgY2FzZSBvZiBjb3JydXB0ZWQgaW5wdXQuCisuTFAKK0FsbCBmdW5jdGlvbnMgb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYXJlIGRvY3VtZW50ZWQgaW4gdGhlIGZpbGUKKy5JUiB6bGliLmggLgorVGhlIGRpc3RyaWJ1dGlvbiBzb3VyY2UgaW5jbHVkZXMgZXhhbXBsZXMgb2YgdXNlIG9mIHRoZSBsaWJyYXJ5CitpbiB0aGUgZmlsZXMKKy5JIHRlc3QvZXhhbXBsZS5jCithbmQKKy5JUiB0ZXN0L21pbmlnemlwLmMsCithcyB3ZWxsIGFzIG90aGVyIGV4YW1wbGVzIGluIHRoZQorLklSIGV4YW1wbGVzLworZGlyZWN0b3J5LgorLkxQCitDaGFuZ2VzIHRvIHRoaXMgdmVyc2lvbiBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgZmlsZQorLkkgQ2hhbmdlTG9nCit0aGF0IGFjY29tcGFuaWVzIHRoZSBzb3VyY2UuCisuTFAKKy5JIHpsaWIKK2lzIGF2YWlsYWJsZSBpbiBKYXZhIHVzaW5nIHRoZSBqYXZhLnV0aWwuemlwIHBhY2thZ2U6CisuSVAKK2h0dHA6Ly9qYXZhLnN1bi5jb20vZGV2ZWxvcGVyL3RlY2huaWNhbEFydGljbGVzL1Byb2dyYW1taW5nL2NvbXByZXNzaW9uLworLkxQCitBIFBlcmwgaW50ZXJmYWNlIHRvCisuSVIgemxpYiAsCit3cml0dGVuIGJ5IFBhdWwgTWFycXVlc3MgKHBtcXNAY3Bhbi5vcmcpLAoraXMgYXZhaWxhYmxlIGF0IENQQU4gKENvbXByZWhlbnNpdmUgUGVybCBBcmNoaXZlIE5ldHdvcmspIHNpdGVzLAoraW5jbHVkaW5nOgorLklQCitodHRwOi8vc2VhcmNoLmNwYW4ub3JnL35wbXFzL0lPLUNvbXByZXNzLVpsaWIvCisuTFAKK0EgUHl0aG9uIGludGVyZmFjZSB0bworLklSIHpsaWIgLAord3JpdHRlbiBieSBBLk0uIEt1Y2hsaW5nIChhbWtAbWFnbmV0LmNvbSksCitpcyBhdmFpbGFibGUgaW4gUHl0aG9uIDEuNSBhbmQgbGF0ZXIgdmVyc2lvbnM6CisuSVAKK2h0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS96bGliLmh0bWwKKy5MUAorLkkgemxpYgoraXMgYnVpbHQgaW50bworLklSIHRjbDoKKy5JUAoraHR0cDovL3dpa2kudGNsLnRrLzQ2MTAKKy5MUAorQW4gZXhwZXJpbWVudGFsIHBhY2thZ2UgdG8gcmVhZCBhbmQgd3JpdGUgZmlsZXMgaW4gLnppcCBmb3JtYXQsCit3cml0dGVuIG9uIHRvcCBvZgorLkkgemxpYgorYnkgR2lsbGVzIFZvbGxhbnQgKGluZm9Ad2luaW1hZ2UuY29tKSwKK2lzIGF2YWlsYWJsZSBhdDoKKy5JUAoraHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC9taW5pemlwLmh0bWwKK2FuZCBhbHNvIGluIHRoZQorLkkgY29udHJpYi9taW5pemlwCitkaXJlY3Rvcnkgb2YgdGhlIG1haW4KKy5JIHpsaWIKK3NvdXJjZSBkaXN0cmlidXRpb24uCisuU0ggIlNFRSBBTFNPIgorVGhlCisuSSB6bGliCit3ZWIgc2l0ZSBjYW4gYmUgZm91bmQgYXQ6CisuSVAKK2h0dHA6Ly96bGliLm5ldC8KKy5MUAorVGhlIGRhdGEgZm9ybWF0IHVzZWQgYnkgdGhlIHpsaWIgbGlicmFyeSBpcyBkZXNjcmliZWQgYnkgUkZDCisoUmVxdWVzdCBmb3IgQ29tbWVudHMpIDE5NTAgdG8gMTk1MiBpbiB0aGUgZmlsZXM6CisuSVAKK2h0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzE5NTAgKGZvciB0aGUgemxpYiBoZWFkZXIgYW5kIHRyYWlsZXIgZm9ybWF0KQorLmJyCitodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMxOTUxIChmb3IgdGhlIGRlZmxhdGUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdCkKKy5icgoraHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMTk1MiAoZm9yIHRoZSBnemlwIGhlYWRlciBhbmQgdHJhaWxlciBmb3JtYXQpCisuTFAKK01hcmsgTmVsc29uIHdyb3RlIGFuIGFydGljbGUgYWJvdXQKKy5JIHpsaWIKK2ZvciB0aGUgSmFuLiAxOTk3IGlzc3VlIG9mICBEci4gRG9iYidzIEpvdXJuYWw7CithIGNvcHkgb2YgdGhlIGFydGljbGUgaXMgYXZhaWxhYmxlIGF0OgorLklQCitodHRwOi8vbWFya25lbHNvbi51cy8xOTk3LzAxLzAxL3psaWItZW5naW5lLworLlNIICJSRVBPUlRJTkcgUFJPQkxFTVMiCitCZWZvcmUgcmVwb3J0aW5nIGEgcHJvYmxlbSwKK3BsZWFzZSBjaGVjayB0aGUKKy5JIHpsaWIKK3dlYiBzaXRlIHRvIHZlcmlmeSB0aGF0IHlvdSBoYXZlIHRoZSBsYXRlc3QgdmVyc2lvbiBvZgorLklSIHpsaWIgOworb3RoZXJ3aXNlLAorb2J0YWluIHRoZSBsYXRlc3QgdmVyc2lvbiBhbmQgc2VlIGlmIHRoZSBwcm9ibGVtIHN0aWxsIGV4aXN0cy4KK1BsZWFzZSByZWFkIHRoZQorLkkgemxpYgorRkFRIGF0OgorLklQCitodHRwOi8vemxpYi5uZXQvemxpYl9mYXEuaHRtbAorLkxQCitiZWZvcmUgYXNraW5nIGZvciBoZWxwLgorU2VuZCBxdWVzdGlvbnMgYW5kL29yIGNvbW1lbnRzIHRvIHpsaWJAZ3ppcC5vcmcsCitvciAoZm9yIHRoZSBXaW5kb3dzIERMTCB2ZXJzaW9uKSB0byBHaWxsZXMgVm9sbGFudCAoaW5mb0B3aW5pbWFnZS5jb20pLgorLlNIIEFVVEhPUlMKK1ZlcnNpb24gMS4yLjgKK0NvcHlyaWdodCAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgKGpsb3VwQGd6aXAub3JnKQorYW5kIE1hcmsgQWRsZXIgKG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUpLgorLkxQCitUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcy1pcywiCit3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCitJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KK1NlZSB0aGUgZGlzdHJpYnV0aW9uIGRpcmVjdG9yeSB3aXRoIHJlc3BlY3QgdG8gcmVxdWlyZW1lbnRzCitnb3Zlcm5pbmcgcmVkaXN0cmlidXRpb24uCitUaGUgZGVmbGF0ZSBmb3JtYXQgdXNlZCBieQorLkkgemxpYgord2FzIGRlZmluZWQgYnkgUGhpbCBLYXR6LgorVGhlIGRlZmxhdGUgYW5kCisuSSB6bGliCitzcGVjaWZpY2F0aW9ucyB3ZXJlIHdyaXR0ZW4gYnkgTC4gUGV0ZXIgRGV1dHNjaC4KK1RoYW5rcyB0byBhbGwgdGhlIHBlb3BsZSB3aG8gcmVwb3J0ZWQgcHJvYmxlbXMgYW5kIHN1Z2dlc3RlZCB2YXJpb3VzCitpbXByb3ZlbWVudHMgaW4KKy5JUiB6bGliIDsKK3dobyBhcmUgdG9vIG51bWVyb3VzIHRvIGNpdGUgaGVyZS4KKy5MUAorVU5JWCBtYW51YWwgcGFnZSBieSBSLiBQLiBDLiBSb2RnZXJzLAorVS5TLiBOYXRpb25hbCBMaWJyYXJ5IG9mIE1lZGljaW5lIChyb2RnZXJzQG5sbS5uaWguZ292KS4KKy5cIiBlbmQgb2YgbWFuIHBhZ2UKZGlmZiAtLWdpdCBhL3psaWIvc3JjL3psaWIuMy5wZGYgYi96bGliL3NyYy96bGliLjMucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNDZiNWQKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy96bGliLjMucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3psaWIvc3JjL3psaWIuaCBiL3psaWIvc3JjL3psaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTBjNzY3Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvemxpYi5oCkBAIC0wLDAgKzEsMTc2OCBAQAorLyogemxpYi5oIC0tIGludGVyZmFjZSBvZiB0aGUgJ3psaWInIGdlbmVyYWwgcHVycG9zZSBjb21wcmVzc2lvbiBsaWJyYXJ5CisgIHZlcnNpb24gMS4yLjgsIEFwcmlsIDI4dGgsIDIwMTMKKworICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyCisKKyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorCisgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCisgIEplYW4tbG91cCBHYWlsbHkgICAgICAgIE1hcmsgQWRsZXIKKyAgamxvdXBAZ3ppcC5vcmcgICAgICAgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQorCisKKyAgVGhlIGRhdGEgZm9ybWF0IHVzZWQgYnkgdGhlIHpsaWIgbGlicmFyeSBpcyBkZXNjcmliZWQgYnkgUkZDcyAoUmVxdWVzdCBmb3IKKyAgQ29tbWVudHMpIDE5NTAgdG8gMTk1MiBpbiB0aGUgZmlsZXMgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMTk1MAorICAoemxpYiBmb3JtYXQpLCByZmMxOTUxIChkZWZsYXRlIGZvcm1hdCkgYW5kIHJmYzE5NTIgKGd6aXAgZm9ybWF0KS4KKyovCisKKyNpZm5kZWYgWkxJQl9ICisjZGVmaW5lIFpMSUJfSAorCisjaW5jbHVkZSAiemNvbmYuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFpMSUJfVkVSU0lPTiAiMS4yLjgiCisjZGVmaW5lIFpMSUJfVkVSTlVNIDB4MTI4MAorI2RlZmluZSBaTElCX1ZFUl9NQUpPUiAxCisjZGVmaW5lIFpMSUJfVkVSX01JTk9SIDIKKyNkZWZpbmUgWkxJQl9WRVJfUkVWSVNJT04gOAorI2RlZmluZSBaTElCX1ZFUl9TVUJSRVZJU0lPTiAwCisKKy8qCisgICAgVGhlICd6bGliJyBjb21wcmVzc2lvbiBsaWJyYXJ5IHByb3ZpZGVzIGluLW1lbW9yeSBjb21wcmVzc2lvbiBhbmQKKyAgZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMsIGluY2x1ZGluZyBpbnRlZ3JpdHkgY2hlY2tzIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YS4KKyAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHN1cHBvcnRzIG9ubHkgb25lIGNvbXByZXNzaW9uIG1ldGhvZCAoZGVmbGF0aW9uKQorICBidXQgb3RoZXIgYWxnb3JpdGhtcyB3aWxsIGJlIGFkZGVkIGxhdGVyIGFuZCB3aWxsIGhhdmUgdGhlIHNhbWUgc3RyZWFtCisgIGludGVyZmFjZS4KKworICAgIENvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAgaWYgdGhlIGJ1ZmZlcnMgYXJlIGxhcmdlIGVub3VnaCwKKyAgb3IgY2FuIGJlIGRvbmUgYnkgcmVwZWF0ZWQgY2FsbHMgb2YgdGhlIGNvbXByZXNzaW9uIGZ1bmN0aW9uLiAgSW4gdGhlIGxhdHRlcgorICBjYXNlLCB0aGUgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWUgdGhlIG91dHB1dAorICAocHJvdmlkaW5nIG1vcmUgb3V0cHV0IHNwYWNlKSBiZWZvcmUgZWFjaCBjYWxsLgorCisgICAgVGhlIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQgdXNlZCBieSBkZWZhdWx0IGJ5IHRoZSBpbi1tZW1vcnkgZnVuY3Rpb25zIGlzCisgIHRoZSB6bGliIGZvcm1hdCwgd2hpY2ggaXMgYSB6bGliIHdyYXBwZXIgZG9jdW1lbnRlZCBpbiBSRkMgMTk1MCwgd3JhcHBlZAorICBhcm91bmQgYSBkZWZsYXRlIHN0cmVhbSwgd2hpY2ggaXMgaXRzZWxmIGRvY3VtZW50ZWQgaW4gUkZDIDE5NTEuCisKKyAgICBUaGUgbGlicmFyeSBhbHNvIHN1cHBvcnRzIHJlYWRpbmcgYW5kIHdyaXRpbmcgZmlsZXMgaW4gZ3ppcCAoLmd6KSBmb3JtYXQKKyAgd2l0aCBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGF0IG9mIHN0ZGlvIHVzaW5nIHRoZSBmdW5jdGlvbnMgdGhhdCBzdGFydAorICB3aXRoICJneiIuICBUaGUgZ3ppcCBmb3JtYXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIHpsaWIgZm9ybWF0LiAgZ3ppcCBpcyBhCisgIGd6aXAgd3JhcHBlciwgZG9jdW1lbnRlZCBpbiBSRkMgMTk1Miwgd3JhcHBlZCBhcm91bmQgYSBkZWZsYXRlIHN0cmVhbS4KKworICAgIFRoaXMgbGlicmFyeSBjYW4gb3B0aW9uYWxseSByZWFkIGFuZCB3cml0ZSBnemlwIHN0cmVhbXMgaW4gbWVtb3J5IGFzIHdlbGwuCisKKyAgICBUaGUgemxpYiBmb3JtYXQgd2FzIGRlc2lnbmVkIHRvIGJlIGNvbXBhY3QgYW5kIGZhc3QgZm9yIHVzZSBpbiBtZW1vcnkKKyAgYW5kIG9uIGNvbW11bmljYXRpb25zIGNoYW5uZWxzLiAgVGhlIGd6aXAgZm9ybWF0IHdhcyBkZXNpZ25lZCBmb3Igc2luZ2xlLQorICBmaWxlIGNvbXByZXNzaW9uIG9uIGZpbGUgc3lzdGVtcywgaGFzIGEgbGFyZ2VyIGhlYWRlciB0aGFuIHpsaWIgdG8gbWFpbnRhaW4KKyAgZGlyZWN0b3J5IGluZm9ybWF0aW9uLCBhbmQgdXNlcyBhIGRpZmZlcmVudCwgc2xvd2VyIGNoZWNrIG1ldGhvZCB0aGFuIHpsaWIuCisKKyAgICBUaGUgbGlicmFyeSBkb2VzIG5vdCBpbnN0YWxsIGFueSBzaWduYWwgaGFuZGxlci4gIFRoZSBkZWNvZGVyIGNoZWNrcworICB0aGUgY29uc2lzdGVuY3kgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSwgc28gdGhlIGxpYnJhcnkgc2hvdWxkIG5ldmVyIGNyYXNoCisgIGV2ZW4gaW4gY2FzZSBvZiBjb3JydXB0ZWQgaW5wdXQuCisqLworCit0eXBlZGVmIHZvaWRwZiAoKmFsbG9jX2Z1bmMpIE9GKCh2b2lkcGYgb3BhcXVlLCB1SW50IGl0ZW1zLCB1SW50IHNpemUpKTsKK3R5cGVkZWYgdm9pZCAgICgqZnJlZV9mdW5jKSAgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBhZGRyZXNzKSk7CisKK3N0cnVjdCBpbnRlcm5hbF9zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3Qgel9zdHJlYW1fcyB7CisgICAgel9jb25zdCBCeXRlZiAqbmV4dF9pbjsgICAgIC8qIG5leHQgaW5wdXQgYnl0ZSAqLworICAgIHVJbnQgICAgIGF2YWlsX2luOyAgLyogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhdCBuZXh0X2luICovCisgICAgdUxvbmcgICAgdG90YWxfaW47ICAvKiB0b3RhbCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKi8KKworICAgIEJ5dGVmICAgICpuZXh0X291dDsgLyogbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlICovCisgICAgdUludCAgICAgYXZhaWxfb3V0OyAvKiByZW1haW5pbmcgZnJlZSBzcGFjZSBhdCBuZXh0X291dCAqLworICAgIHVMb25nICAgIHRvdGFsX291dDsgLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIgKi8KKworICAgIHpfY29uc3QgY2hhciAqbXNnOyAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovCisgICAgc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqc3RhdGU7IC8qIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqLworCisgICAgYWxsb2NfZnVuYyB6YWxsb2M7ICAvKiB1c2VkIHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLworICAgIGZyZWVfZnVuYyAgemZyZWU7ICAgLyogdXNlZCB0byBmcmVlIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLworICAgIHZvaWRwZiAgICAgb3BhcXVlOyAgLyogcHJpdmF0ZSBkYXRhIG9iamVjdCBwYXNzZWQgdG8gemFsbG9jIGFuZCB6ZnJlZSAqLworCisgICAgaW50ICAgICBkYXRhX3R5cGU7ICAvKiBiZXN0IGd1ZXNzIGFib3V0IHRoZSBkYXRhIHR5cGU6IGJpbmFyeSBvciB0ZXh0ICovCisgICAgdUxvbmcgICBhZGxlcjsgICAgICAvKiBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqLworICAgIHVMb25nICAgcmVzZXJ2ZWQ7ICAgLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KK30gel9zdHJlYW07CisKK3R5cGVkZWYgel9zdHJlYW0gRkFSICp6X3N0cmVhbXA7CisKKy8qCisgICAgIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIHBhc3NlZCB0byBhbmQgZnJvbSB6bGliIHJvdXRpbmVzLiAgU2VlIFJGQyAxOTUyCisgIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIG1lYW5pbmdzIG9mIHRoZXNlIGZpZWxkcy4KKyovCit0eXBlZGVmIHN0cnVjdCBnel9oZWFkZXJfcyB7CisgICAgaW50ICAgICB0ZXh0OyAgICAgICAvKiB0cnVlIGlmIGNvbXByZXNzZWQgZGF0YSBiZWxpZXZlZCB0byBiZSB0ZXh0ICovCisgICAgdUxvbmcgICB0aW1lOyAgICAgICAvKiBtb2RpZmljYXRpb24gdGltZSAqLworICAgIGludCAgICAgeGZsYWdzOyAgICAgLyogZXh0cmEgZmxhZ3MgKG5vdCB1c2VkIHdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKi8KKyAgICBpbnQgICAgIG9zOyAgICAgICAgIC8qIG9wZXJhdGluZyBzeXN0ZW0gKi8KKyAgICBCeXRlZiAgICpleHRyYTsgICAgIC8qIHBvaW50ZXIgdG8gZXh0cmEgZmllbGQgb3IgWl9OVUxMIGlmIG5vbmUgKi8KKyAgICB1SW50ICAgIGV4dHJhX2xlbjsgIC8qIGV4dHJhIGZpZWxkIGxlbmd0aCAodmFsaWQgaWYgZXh0cmEgIT0gWl9OVUxMKSAqLworICAgIHVJbnQgICAgZXh0cmFfbWF4OyAgLyogc3BhY2UgYXQgZXh0cmEgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi8KKyAgICBCeXRlZiAgICpuYW1lOyAgICAgIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGZpbGUgbmFtZSBvciBaX05VTEwgKi8KKyAgICB1SW50ICAgIG5hbWVfbWF4OyAgIC8qIHNwYWNlIGF0IG5hbWUgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi8KKyAgICBCeXRlZiAgICpjb21tZW50OyAgIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGNvbW1lbnQgb3IgWl9OVUxMICovCisgICAgdUludCAgICBjb21tX21heDsgICAvKiBzcGFjZSBhdCBjb21tZW50IChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovCisgICAgaW50ICAgICBoY3JjOyAgICAgICAvKiB0cnVlIGlmIHRoZXJlIHdhcyBvciB3aWxsIGJlIGEgaGVhZGVyIGNyYyAqLworICAgIGludCAgICAgZG9uZTsgICAgICAgLyogdHJ1ZSB3aGVuIGRvbmUgcmVhZGluZyBnemlwIGhlYWRlciAobm90IHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKi8KK30gZ3pfaGVhZGVyOworCit0eXBlZGVmIGd6X2hlYWRlciBGQVIgKmd6X2hlYWRlcnA7CisKKy8qCisgICAgIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbiB3aGVuIGF2YWlsX2luIGhhcyBkcm9wcGVkCisgICB0byB6ZXJvLiAgSXQgbXVzdCB1cGRhdGUgbmV4dF9vdXQgYW5kIGF2YWlsX291dCB3aGVuIGF2YWlsX291dCBoYXMgZHJvcHBlZAorICAgdG8gemVyby4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGluaXRpYWxpemUgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIGJlZm9yZQorICAgY2FsbGluZyB0aGUgaW5pdCBmdW5jdGlvbi4gIEFsbCBvdGhlciBmaWVsZHMgYXJlIHNldCBieSB0aGUgY29tcHJlc3Npb24KKyAgIGxpYnJhcnkgYW5kIG11c3Qgbm90IGJlIHVwZGF0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorCisgICAgIFRoZSBvcGFxdWUgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHdpbGwgYmUgcGFzc2VkIGFzIHRoZSBmaXJzdAorICAgcGFyYW1ldGVyIGZvciBjYWxscyBvZiB6YWxsb2MgYW5kIHpmcmVlLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBjdXN0b20KKyAgIG1lbW9yeSBtYW5hZ2VtZW50LiAgVGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYXR0YWNoZXMgbm8gbWVhbmluZyB0byB0aGUKKyAgIG9wYXF1ZSB2YWx1ZS4KKworICAgICB6YWxsb2MgbXVzdCByZXR1cm4gWl9OVUxMIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggbWVtb3J5IGZvciB0aGUgb2JqZWN0LgorICAgSWYgemxpYiBpcyB1c2VkIGluIGEgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb24sIHphbGxvYyBhbmQgemZyZWUgbXVzdCBiZQorICAgdGhyZWFkIHNhZmUuCisKKyAgICAgT24gMTYtYml0IHN5c3RlbXMsIHRoZSBmdW5jdGlvbnMgemFsbG9jIGFuZCB6ZnJlZSBtdXN0IGJlIGFibGUgdG8gYWxsb2NhdGUKKyAgIGV4YWN0bHkgNjU1MzYgYnl0ZXMsIGJ1dCB3aWxsIG5vdCBiZSByZXF1aXJlZCB0byBhbGxvY2F0ZSBtb3JlIHRoYW4gdGhpcyBpZgorICAgdGhlIHN5bWJvbCBNQVhTRUdfNjRLIGlzIGRlZmluZWQgKHNlZSB6Y29uZi5oKS4gIFdBUk5JTkc6IE9uIE1TRE9TLCBwb2ludGVycworICAgcmV0dXJuZWQgYnkgemFsbG9jIGZvciBvYmplY3RzIG9mIGV4YWN0bHkgNjU1MzYgYnl0ZXMgKm11c3QqIGhhdmUgdGhlaXIKKyAgIG9mZnNldCBub3JtYWxpemVkIHRvIHplcm8uICBUaGUgZGVmYXVsdCBhbGxvY2F0aW9uIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IHRoaXMKKyAgIGxpYnJhcnkgZW5zdXJlcyB0aGlzIChzZWUgenV0aWwuYykuICBUbyByZWR1Y2UgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgYXZvaWQKKyAgIGFueSBhbGxvY2F0aW9uIG9mIDY0SyBvYmplY3RzLCBhdCB0aGUgZXhwZW5zZSBvZiBjb21wcmVzc2lvbiByYXRpbywgY29tcGlsZQorICAgdGhlIGxpYnJhcnkgd2l0aCAtRE1BWF9XQklUUz0xNCAoc2VlIHpjb25mLmgpLgorCisgICAgIFRoZSBmaWVsZHMgdG90YWxfaW4gYW5kIHRvdGFsX291dCBjYW4gYmUgdXNlZCBmb3Igc3RhdGlzdGljcyBvciBwcm9ncmVzcworICAgcmVwb3J0cy4gIEFmdGVyIGNvbXByZXNzaW9uLCB0b3RhbF9pbiBob2xkcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUKKyAgIHVuY29tcHJlc3NlZCBkYXRhIGFuZCBtYXkgYmUgc2F2ZWQgZm9yIHVzZSBpbiB0aGUgZGVjb21wcmVzc29yIChwYXJ0aWN1bGFybHkKKyAgIGlmIHRoZSBkZWNvbXByZXNzb3Igd2FudHMgdG8gZGVjb21wcmVzcyBldmVyeXRoaW5nIGluIGEgc2luZ2xlIHN0ZXApLgorKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogY29uc3RhbnRzICovCisKKyNkZWZpbmUgWl9OT19GTFVTSCAgICAgIDAKKyNkZWZpbmUgWl9QQVJUSUFMX0ZMVVNIIDEKKyNkZWZpbmUgWl9TWU5DX0ZMVVNIICAgIDIKKyNkZWZpbmUgWl9GVUxMX0ZMVVNIICAgIDMKKyNkZWZpbmUgWl9GSU5JU0ggICAgICAgIDQKKyNkZWZpbmUgWl9CTE9DSyAgICAgICAgIDUKKyNkZWZpbmUgWl9UUkVFUyAgICAgICAgIDYKKy8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KKworI2RlZmluZSBaX09LICAgICAgICAgICAgMAorI2RlZmluZSBaX1NUUkVBTV9FTkQgICAgMQorI2RlZmluZSBaX05FRURfRElDVCAgICAgMgorI2RlZmluZSBaX0VSUk5PICAgICAgICAoLTEpCisjZGVmaW5lIFpfU1RSRUFNX0VSUk9SICgtMikKKyNkZWZpbmUgWl9EQVRBX0VSUk9SICAgKC0zKQorI2RlZmluZSBaX01FTV9FUlJPUiAgICAoLTQpCisjZGVmaW5lIFpfQlVGX0VSUk9SICAgICgtNSkKKyNkZWZpbmUgWl9WRVJTSU9OX0VSUk9SICgtNikKKy8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXMKKyAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy4KKyAqLworCisjZGVmaW5lIFpfTk9fQ09NUFJFU1NJT04gICAgICAgICAwCisjZGVmaW5lIFpfQkVTVF9TUEVFRCAgICAgICAgICAgICAxCisjZGVmaW5lIFpfQkVTVF9DT01QUkVTU0lPTiAgICAgICA5CisjZGVmaW5lIFpfREVGQVVMVF9DT01QUkVTU0lPTiAgKC0xKQorLyogY29tcHJlc3Npb24gbGV2ZWxzICovCisKKyNkZWZpbmUgWl9GSUxURVJFRCAgICAgICAgICAgIDEKKyNkZWZpbmUgWl9IVUZGTUFOX09OTFkgICAgICAgIDIKKyNkZWZpbmUgWl9STEUgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgWl9GSVhFRCAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWl9ERUZBVUxUX1NUUkFURUdZICAgIDAKKy8qIGNvbXByZXNzaW9uIHN0cmF0ZWd5OyBzZWUgZGVmbGF0ZUluaXQyKCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KKworI2RlZmluZSBaX0JJTkFSWSAgIDAKKyNkZWZpbmUgWl9URVhUICAgICAxCisjZGVmaW5lIFpfQVNDSUkgICAgWl9URVhUICAgLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCAxLjIuMiBhbmQgZWFybGllciAqLworI2RlZmluZSBaX1VOS05PV04gIDIKKy8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi8KKworI2RlZmluZSBaX0RFRkxBVEVEICAgOAorLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICh0aGUgb25seSBvbmUgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbikgKi8KKworI2RlZmluZSBaX05VTEwgIDAgIC8qIGZvciBpbml0aWFsaXppbmcgemFsbG9jLCB6ZnJlZSwgb3BhcXVlICovCisKKyNkZWZpbmUgemxpYl92ZXJzaW9uIHpsaWJWZXJzaW9uKCkKKy8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdmVyc2lvbnMgPCAxLjAuMiAqLworCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2ljIGZ1bmN0aW9ucyAqLworCitaRVhURVJOIGNvbnN0IGNoYXIgKiBaRVhQT1JUIHpsaWJWZXJzaW9uIE9GKCh2b2lkKSk7CisvKiBUaGUgYXBwbGljYXRpb24gY2FuIGNvbXBhcmUgemxpYlZlcnNpb24gYW5kIFpMSUJfVkVSU0lPTiBmb3IgY29uc2lzdGVuY3kuCisgICBJZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGRpZmZlcnMsIHRoZSBsaWJyYXJ5IGNvZGUgYWN0dWFsbHkgdXNlZCBpcyBub3QKKyAgIGNvbXBhdGlibGUgd2l0aCB0aGUgemxpYi5oIGhlYWRlciBmaWxlIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiAgVGhpcyBjaGVjaworICAgaXMgYXV0b21hdGljYWxseSBtYWRlIGJ5IGRlZmxhdGVJbml0IGFuZCBpbmZsYXRlSW5pdC4KKyAqLworCisvKgorWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdCBPRigoel9zdHJlYW1wIHN0cm0sIGludCBsZXZlbCkpOworCisgICAgIEluaXRpYWxpemVzIHRoZSBpbnRlcm5hbCBzdHJlYW0gc3RhdGUgZm9yIGNvbXByZXNzaW9uLiAgVGhlIGZpZWxkcworICAgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5IHRoZSBjYWxsZXIuICBJZgorICAgemFsbG9jIGFuZCB6ZnJlZSBhcmUgc2V0IHRvIFpfTlVMTCwgZGVmbGF0ZUluaXQgdXBkYXRlcyB0aGVtIHRvIHVzZSBkZWZhdWx0CisgICBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KKworICAgICBUaGUgY29tcHJlc3Npb24gbGV2ZWwgbXVzdCBiZSBaX0RFRkFVTFRfQ09NUFJFU1NJT04sIG9yIGJldHdlZW4gMCBhbmQgOToKKyAgIDEgZ2l2ZXMgYmVzdCBzcGVlZCwgOSBnaXZlcyBiZXN0IGNvbXByZXNzaW9uLCAwIGdpdmVzIG5vIGNvbXByZXNzaW9uIGF0IGFsbAorICAgKHRoZSBpbnB1dCBkYXRhIGlzIHNpbXBseSBjb3BpZWQgYSBibG9jayBhdCBhIHRpbWUpLiAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OCisgICByZXF1ZXN0cyBhIGRlZmF1bHQgY29tcHJvbWlzZSBiZXR3ZWVuIHNwZWVkIGFuZCBjb21wcmVzc2lvbiAoY3VycmVudGx5CisgICBlcXVpdmFsZW50IHRvIGxldmVsIDYpLgorCisgICAgIGRlZmxhdGVJbml0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiBsZXZlbCBpcyBub3QgYSB2YWxpZCBjb21wcmVzc2lvbiBsZXZlbCwgb3IKKyAgIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gKHpsaWJfdmVyc2lvbikgaXMgaW5jb21wYXRpYmxlCisgICB3aXRoIHRoZSB2ZXJzaW9uIGFzc3VtZWQgYnkgdGhlIGNhbGxlciAoWkxJQl9WRVJTSU9OKS4gIG1zZyBpcyBzZXQgdG8gbnVsbAorICAgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIGRlZmxhdGVJbml0IGRvZXMgbm90IHBlcmZvcm0gYW55IGNvbXByZXNzaW9uOgorICAgdGhpcyB3aWxsIGJlIGRvbmUgYnkgZGVmbGF0ZSgpLgorKi8KKworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGUgT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgZmx1c2gpKTsKKy8qCisgICAgZGVmbGF0ZSBjb21wcmVzc2VzIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHN0b3BzIHdoZW4gdGhlIGlucHV0CisgIGJ1ZmZlciBiZWNvbWVzIGVtcHR5IG9yIHRoZSBvdXRwdXQgYnVmZmVyIGJlY29tZXMgZnVsbC4gIEl0IG1heSBpbnRyb2R1Y2UKKyAgc29tZSBvdXRwdXQgbGF0ZW5jeSAocmVhZGluZyBpbnB1dCB3aXRob3V0IHByb2R1Y2luZyBhbnkgb3V0cHV0KSBleGNlcHQgd2hlbgorICBmb3JjZWQgdG8gZmx1c2guCisKKyAgICBUaGUgZGV0YWlsZWQgc2VtYW50aWNzIGFyZSBhcyBmb2xsb3dzLiAgZGVmbGF0ZSBwZXJmb3JtcyBvbmUgb3IgYm90aCBvZiB0aGUKKyAgZm9sbG93aW5nIGFjdGlvbnM6CisKKyAgLSBDb21wcmVzcyBtb3JlIGlucHV0IHN0YXJ0aW5nIGF0IG5leHRfaW4gYW5kIHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbgorICAgIGFjY29yZGluZ2x5LiAgSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAorICAgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKSwgbmV4dF9pbiBhbmQgYXZhaWxfaW4gYXJlIHVwZGF0ZWQgYW5kCisgICAgcHJvY2Vzc2luZyB3aWxsIHJlc3VtZSBhdCB0aGlzIHBvaW50IGZvciB0aGUgbmV4dCBjYWxsIG9mIGRlZmxhdGUoKS4KKworICAtIFByb3ZpZGUgbW9yZSBvdXRwdXQgc3RhcnRpbmcgYXQgbmV4dF9vdXQgYW5kIHVwZGF0ZSBuZXh0X291dCBhbmQgYXZhaWxfb3V0CisgICAgYWNjb3JkaW5nbHkuICBUaGlzIGFjdGlvbiBpcyBmb3JjZWQgaWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBub24gemVyby4KKyAgICBGb3JjaW5nIGZsdXNoIGZyZXF1ZW50bHkgZGVncmFkZXMgdGhlIGNvbXByZXNzaW9uIHJhdGlvLCBzbyB0aGlzIHBhcmFtZXRlcgorICAgIHNob3VsZCBiZSBzZXQgb25seSB3aGVuIG5lY2Vzc2FyeSAoaW4gaW50ZXJhY3RpdmUgYXBwbGljYXRpb25zKS4gIFNvbWUKKyAgICBvdXRwdXQgbWF5IGJlIHByb3ZpZGVkIGV2ZW4gaWYgZmx1c2ggaXMgbm90IHNldC4KKworICAgIEJlZm9yZSB0aGUgY2FsbCBvZiBkZWZsYXRlKCksIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgYXQgbGVhc3QKKyAgb25lIG9mIHRoZSBhY3Rpb25zIGlzIHBvc3NpYmxlLCBieSBwcm92aWRpbmcgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtaW5nIG1vcmUKKyAgb3V0cHV0LCBhbmQgdXBkYXRpbmcgYXZhaWxfaW4gb3IgYXZhaWxfb3V0IGFjY29yZGluZ2x5OyBhdmFpbF9vdXQgc2hvdWxkCisgIG5ldmVyIGJlIHplcm8gYmVmb3JlIHRoZSBjYWxsLiAgVGhlIGFwcGxpY2F0aW9uIGNhbiBjb25zdW1lIHRoZSBjb21wcmVzc2VkCisgIG91dHB1dCB3aGVuIGl0IHdhbnRzLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwgKGF2YWlsX291dAorICA9PSAwKSwgb3IgYWZ0ZXIgZWFjaCBjYWxsIG9mIGRlZmxhdGUoKS4gIElmIGRlZmxhdGUgcmV0dXJucyBaX09LIGFuZCB3aXRoCisgIHplcm8gYXZhaWxfb3V0LCBpdCBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBtYWtpbmcgcm9vbSBpbiB0aGUgb3V0cHV0CisgIGJ1ZmZlciBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIG1vcmUgb3V0cHV0IHBlbmRpbmcuCisKKyAgICBOb3JtYWxseSB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byBaX05PX0ZMVVNILCB3aGljaCBhbGxvd3MgZGVmbGF0ZSB0bworICBkZWNpZGUgaG93IG11Y2ggZGF0YSB0byBhY2N1bXVsYXRlIGJlZm9yZSBwcm9kdWNpbmcgb3V0cHV0LCBpbiBvcmRlciB0bworICBtYXhpbWl6ZSBjb21wcmVzc2lvbi4KKworICAgIElmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIFpfU1lOQ19GTFVTSCwgYWxsIHBlbmRpbmcgb3V0cHV0IGlzCisgIGZsdXNoZWQgdG8gdGhlIG91dHB1dCBidWZmZXIgYW5kIHRoZSBvdXRwdXQgaXMgYWxpZ25lZCBvbiBhIGJ5dGUgYm91bmRhcnksIHNvCisgIHRoYXQgdGhlIGRlY29tcHJlc3NvciBjYW4gZ2V0IGFsbCBpbnB1dCBkYXRhIGF2YWlsYWJsZSBzbyBmYXIuICAoSW4KKyAgcGFydGljdWxhciBhdmFpbF9pbiBpcyB6ZXJvIGFmdGVyIHRoZSBjYWxsIGlmIGVub3VnaCBvdXRwdXQgc3BhY2UgaGFzIGJlZW4KKyAgcHJvdmlkZWQgYmVmb3JlIHRoZSBjYWxsLikgRmx1c2hpbmcgbWF5IGRlZ3JhZGUgY29tcHJlc3Npb24gZm9yIHNvbWUKKyAgY29tcHJlc3Npb24gYWxnb3JpdGhtcyBhbmQgc28gaXQgc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIG5lY2Vzc2FyeS4gIFRoaXMKKyAgY29tcGxldGVzIHRoZSBjdXJyZW50IGRlZmxhdGUgYmxvY2sgYW5kIGZvbGxvd3MgaXQgd2l0aCBhbiBlbXB0eSBzdG9yZWQgYmxvY2sKKyAgdGhhdCBpcyB0aHJlZSBiaXRzIHBsdXMgZmlsbGVyIGJpdHMgdG8gdGhlIG5leHQgYnl0ZSwgZm9sbG93ZWQgYnkgZm91ciBieXRlcworICAoMDAgMDAgZmYgZmYpLgorCisgICAgSWYgZmx1c2ggaXMgc2V0IHRvIFpfUEFSVElBTF9GTFVTSCwgYWxsIHBlbmRpbmcgb3V0cHV0IGlzIGZsdXNoZWQgdG8gdGhlCisgIG91dHB1dCBidWZmZXIsIGJ1dCB0aGUgb3V0cHV0IGlzIG5vdCBhbGlnbmVkIHRvIGEgYnl0ZSBib3VuZGFyeS4gIEFsbCBvZiB0aGUKKyAgaW5wdXQgZGF0YSBzbyBmYXIgd2lsbCBiZSBhdmFpbGFibGUgdG8gdGhlIGRlY29tcHJlc3NvciwgYXMgZm9yIFpfU1lOQ19GTFVTSC4KKyAgVGhpcyBjb21wbGV0ZXMgdGhlIGN1cnJlbnQgZGVmbGF0ZSBibG9jayBhbmQgZm9sbG93cyBpdCB3aXRoIGFuIGVtcHR5IGZpeGVkCisgIGNvZGVzIGJsb2NrIHRoYXQgaXMgMTAgYml0cyBsb25nLiAgVGhpcyBhc3N1cmVzIHRoYXQgZW5vdWdoIGJ5dGVzIGFyZSBvdXRwdXQKKyAgaW4gb3JkZXIgZm9yIHRoZSBkZWNvbXByZXNzb3IgdG8gZmluaXNoIHRoZSBibG9jayBiZWZvcmUgdGhlIGVtcHR5IGZpeGVkIGNvZGUKKyAgYmxvY2suCisKKyAgICBJZiBmbHVzaCBpcyBzZXQgdG8gWl9CTE9DSywgYSBkZWZsYXRlIGJsb2NrIGlzIGNvbXBsZXRlZCBhbmQgZW1pdHRlZCwgYXMKKyAgZm9yIFpfU1lOQ19GTFVTSCwgYnV0IHRoZSBvdXRwdXQgaXMgbm90IGFsaWduZWQgb24gYSBieXRlIGJvdW5kYXJ5LCBhbmQgdXAgdG8KKyAgc2V2ZW4gYml0cyBvZiB0aGUgY3VycmVudCBibG9jayBhcmUgaGVsZCB0byBiZSB3cml0dGVuIGFzIHRoZSBuZXh0IGJ5dGUgYWZ0ZXIKKyAgdGhlIG5leHQgZGVmbGF0ZSBibG9jayBpcyBjb21wbGV0ZWQuICBJbiB0aGlzIGNhc2UsIHRoZSBkZWNvbXByZXNzb3IgbWF5IG5vdAorICBiZSBwcm92aWRlZCBlbm91Z2ggYml0cyBhdCB0aGlzIHBvaW50IGluIG9yZGVyIHRvIGNvbXBsZXRlIGRlY29tcHJlc3Npb24gb2YKKyAgdGhlIGRhdGEgcHJvdmlkZWQgc28gZmFyIHRvIHRoZSBjb21wcmVzc29yLiAgSXQgbWF5IG5lZWQgdG8gd2FpdCBmb3IgdGhlIG5leHQKKyAgYmxvY2sgdG8gYmUgZW1pdHRlZC4gIFRoaXMgaXMgZm9yIGFkdmFuY2VkIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdG8gY29udHJvbAorICB0aGUgZW1pc3Npb24gb2YgZGVmbGF0ZSBibG9ja3MuCisKKyAgICBJZiBmbHVzaCBpcyBzZXQgdG8gWl9GVUxMX0ZMVVNILCBhbGwgb3V0cHV0IGlzIGZsdXNoZWQgYXMgd2l0aAorICBaX1NZTkNfRkxVU0gsIGFuZCB0aGUgY29tcHJlc3Npb24gc3RhdGUgaXMgcmVzZXQgc28gdGhhdCBkZWNvbXByZXNzaW9uIGNhbgorICByZXN0YXJ0IGZyb20gdGhpcyBwb2ludCBpZiBwcmV2aW91cyBjb21wcmVzc2VkIGRhdGEgaGFzIGJlZW4gZGFtYWdlZCBvciBpZgorICByYW5kb20gYWNjZXNzIGlzIGRlc2lyZWQuICBVc2luZyBaX0ZVTExfRkxVU0ggdG9vIG9mdGVuIGNhbiBzZXJpb3VzbHkgZGVncmFkZQorICBjb21wcmVzc2lvbi4KKworICAgIElmIGRlZmxhdGUgcmV0dXJucyB3aXRoIGF2YWlsX291dCA9PSAwLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFnYWluCisgIHdpdGggdGhlIHNhbWUgdmFsdWUgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgKHVwZGF0ZWQKKyAgYXZhaWxfb3V0KSwgdW50aWwgdGhlIGZsdXNoIGlzIGNvbXBsZXRlIChkZWZsYXRlIHJldHVybnMgd2l0aCBub24temVybworICBhdmFpbF9vdXQpLiAgSW4gdGhlIGNhc2Ugb2YgYSBaX0ZVTExfRkxVU0ggb3IgWl9TWU5DX0ZMVVNILCBtYWtlIHN1cmUgdGhhdAorICBhdmFpbF9vdXQgaXMgZ3JlYXRlciB0aGFuIHNpeCB0byBhdm9pZCByZXBlYXRlZCBmbHVzaCBtYXJrZXJzIGR1ZSB0bworICBhdmFpbF9vdXQgPT0gMCBvbiByZXR1cm4uCisKKyAgICBJZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byBaX0ZJTklTSCwgcGVuZGluZyBpbnB1dCBpcyBwcm9jZXNzZWQsCisgIHBlbmRpbmcgb3V0cHV0IGlzIGZsdXNoZWQgYW5kIGRlZmxhdGUgcmV0dXJucyB3aXRoIFpfU1RSRUFNX0VORCBpZiB0aGVyZSB3YXMKKyAgZW5vdWdoIG91dHB1dCBzcGFjZTsgaWYgZGVmbGF0ZSByZXR1cm5zIHdpdGggWl9PSywgdGhpcyBmdW5jdGlvbiBtdXN0IGJlCisgIGNhbGxlZCBhZ2FpbiB3aXRoIFpfRklOSVNIIGFuZCBtb3JlIG91dHB1dCBzcGFjZSAodXBkYXRlZCBhdmFpbF9vdXQpIGJ1dCBubworICBtb3JlIGlucHV0IGRhdGEsIHVudGlsIGl0IHJldHVybnMgd2l0aCBaX1NUUkVBTV9FTkQgb3IgYW4gZXJyb3IuICBBZnRlcgorICBkZWZsYXRlIGhhcyByZXR1cm5lZCBaX1NUUkVBTV9FTkQsIHRoZSBvbmx5IHBvc3NpYmxlIG9wZXJhdGlvbnMgb24gdGhlIHN0cmVhbQorICBhcmUgZGVmbGF0ZVJlc2V0IG9yIGRlZmxhdGVFbmQuCisKKyAgICBaX0ZJTklTSCBjYW4gYmUgdXNlZCBpbW1lZGlhdGVseSBhZnRlciBkZWZsYXRlSW5pdCBpZiBhbGwgdGhlIGNvbXByZXNzaW9uCisgIGlzIHRvIGJlIGRvbmUgaW4gYSBzaW5nbGUgc3RlcC4gIEluIHRoaXMgY2FzZSwgYXZhaWxfb3V0IG11c3QgYmUgYXQgbGVhc3QgdGhlCisgIHZhbHVlIHJldHVybmVkIGJ5IGRlZmxhdGVCb3VuZCAoc2VlIGJlbG93KS4gIFRoZW4gZGVmbGF0ZSBpcyBndWFyYW50ZWVkIHRvCisgIHJldHVybiBaX1NUUkVBTV9FTkQuICBJZiBub3QgZW5vdWdoIG91dHB1dCBzcGFjZSBpcyBwcm92aWRlZCwgZGVmbGF0ZSB3aWxsCisgIG5vdCByZXR1cm4gWl9TVFJFQU1fRU5ELCBhbmQgaXQgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYXMgZGVzY3JpYmVkIGFib3ZlLgorCisgICAgZGVmbGF0ZSgpIHNldHMgc3RybS0+YWRsZXIgdG8gdGhlIGFkbGVyMzIgY2hlY2tzdW0gb2YgYWxsIGlucHV0IHJlYWQKKyAgc28gZmFyICh0aGF0IGlzLCB0b3RhbF9pbiBieXRlcykuCisKKyAgICBkZWZsYXRlKCkgbWF5IHVwZGF0ZSBzdHJtLT5kYXRhX3R5cGUgaWYgaXQgY2FuIG1ha2UgYSBnb29kIGd1ZXNzIGFib3V0CisgIHRoZSBpbnB1dCBkYXRhIHR5cGUgKFpfQklOQVJZIG9yIFpfVEVYVCkuICBJbiBkb3VidCwgdGhlIGRhdGEgaXMgY29uc2lkZXJlZAorICBiaW5hcnkuICBUaGlzIGZpZWxkIGlzIG9ubHkgZm9yIGluZm9ybWF0aW9uIHB1cnBvc2VzIGFuZCBkb2VzIG5vdCBhZmZlY3QgdGhlCisgIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpbiBhbnkgbWFubmVyLgorCisgICAgZGVmbGF0ZSgpIHJldHVybnMgWl9PSyBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQKKyAgcHJvY2Vzc2VkIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgWl9TVFJFQU1fRU5EIGlmIGFsbCBpbnB1dCBoYXMgYmVlbgorICBjb25zdW1lZCBhbmQgYWxsIG91dHB1dCBoYXMgYmVlbiBwcm9kdWNlZCAob25seSB3aGVuIGZsdXNoIGlzIHNldCB0bworICBaX0ZJTklTSCksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUKKyAgaWYgbmV4dF9pbiBvciBuZXh0X291dCB3YXMgWl9OVUxMKSwgWl9CVUZfRVJST1IgaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUKKyAgKGZvciBleGFtcGxlIGF2YWlsX2luIG9yIGF2YWlsX291dCB3YXMgemVybykuICBOb3RlIHRoYXQgWl9CVUZfRVJST1IgaXMgbm90CisgIGZhdGFsLCBhbmQgZGVmbGF0ZSgpIGNhbiBiZSBjYWxsZWQgYWdhaW4gd2l0aCBtb3JlIGlucHV0IGFuZCBtb3JlIG91dHB1dAorICBzcGFjZSB0byBjb250aW51ZSBjb21wcmVzc2luZy4KKyovCisKKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlRW5kIE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICAgQWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoaXMgc3RyZWFtIGFyZSBmcmVlZC4KKyAgIFRoaXMgZnVuY3Rpb24gZGlzY2FyZHMgYW55IHVucHJvY2Vzc2VkIGlucHV0IGFuZCBkb2VzIG5vdCBmbHVzaCBhbnkgcGVuZGluZworICAgb3V0cHV0LgorCisgICAgIGRlZmxhdGVFbmQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgc3RyZWFtIHdhcyBmcmVlZAorICAgcHJlbWF0dXJlbHkgKHNvbWUgaW5wdXQgb3Igb3V0cHV0IHdhcyBkaXNjYXJkZWQpLiAgSW4gdGhlIGVycm9yIGNhc2UsIG1zZworICAgbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYSBzdGF0aWMgc3RyaW5nICh3aGljaCBtdXN0IG5vdCBiZQorICAgZGVhbGxvY2F0ZWQpLgorKi8KKworCisvKgorWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKworICAgICBJbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgc3RyZWFtIHN0YXRlIGZvciBkZWNvbXByZXNzaW9uLiAgVGhlIGZpZWxkcworICAgbmV4dF9pbiwgYXZhaWxfaW4sIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieQorICAgdGhlIGNhbGxlci4gIElmIG5leHRfaW4gaXMgbm90IFpfTlVMTCBhbmQgYXZhaWxfaW4gaXMgbGFyZ2UgZW5vdWdoICh0aGUKKyAgIGV4YWN0IHZhbHVlIGRlcGVuZHMgb24gdGhlIGNvbXByZXNzaW9uIG1ldGhvZCksIGluZmxhdGVJbml0IGRldGVybWluZXMgdGhlCisgICBjb21wcmVzc2lvbiBtZXRob2QgZnJvbSB0aGUgemxpYiBoZWFkZXIgYW5kIGFsbG9jYXRlcyBhbGwgZGF0YSBzdHJ1Y3R1cmVzCisgICBhY2NvcmRpbmdseTsgb3RoZXJ3aXNlIHRoZSBhbGxvY2F0aW9uIHdpbGwgYmUgZGVmZXJyZWQgdG8gdGhlIGZpcnN0IGNhbGwgb2YKKyAgIGluZmxhdGUuICBJZiB6YWxsb2MgYW5kIHpmcmVlIGFyZSBzZXQgdG8gWl9OVUxMLCBpbmZsYXRlSW5pdCB1cGRhdGVzIHRoZW0gdG8KKyAgIHVzZSBkZWZhdWx0IGFsbG9jYXRpb24gZnVuY3Rpb25zLgorCisgICAgIGluZmxhdGVJbml0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgbWVtb3J5LCBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZQorICAgdmVyc2lvbiBhc3N1bWVkIGJ5IHRoZSBjYWxsZXIsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBwYXJhbWV0ZXJzIGFyZQorICAgaW52YWxpZCwgc3VjaCBhcyBhIG51bGwgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlLiAgbXNnIGlzIHNldCB0byBudWxsIGlmCisgICB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgaW5mbGF0ZUluaXQgZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbgorICAgYXBhcnQgZnJvbSBwb3NzaWJseSByZWFkaW5nIHRoZSB6bGliIGhlYWRlciBpZiBwcmVzZW50OiBhY3R1YWwgZGVjb21wcmVzc2lvbgorICAgd2lsbCBiZSBkb25lIGJ5IGluZmxhdGUoKS4gIChTbyBuZXh0X2luIGFuZCBhdmFpbF9pbiBtYXkgYmUgbW9kaWZpZWQsIGJ1dAorICAgbmV4dF9vdXQgYW5kIGF2YWlsX291dCBhcmUgdW51c2VkIGFuZCB1bmNoYW5nZWQuKSBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbgorICAgb2YgaW5mbGF0ZUluaXQoKSBkb2VzIG5vdCBwcm9jZXNzIGFueSBoZWFkZXIgaW5mb3JtYXRpb24gLS0gdGhhdCBpcyBkZWZlcnJlZAorICAgdW50aWwgaW5mbGF0ZSgpIGlzIGNhbGxlZC4KKyovCisKKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IGZsdXNoKSk7CisvKgorICAgIGluZmxhdGUgZGVjb21wcmVzc2VzIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHN0b3BzIHdoZW4gdGhlIGlucHV0CisgIGJ1ZmZlciBiZWNvbWVzIGVtcHR5IG9yIHRoZSBvdXRwdXQgYnVmZmVyIGJlY29tZXMgZnVsbC4gIEl0IG1heSBpbnRyb2R1Y2UKKyAgc29tZSBvdXRwdXQgbGF0ZW5jeSAocmVhZGluZyBpbnB1dCB3aXRob3V0IHByb2R1Y2luZyBhbnkgb3V0cHV0KSBleGNlcHQgd2hlbgorICBmb3JjZWQgdG8gZmx1c2guCisKKyAgVGhlIGRldGFpbGVkIHNlbWFudGljcyBhcmUgYXMgZm9sbG93cy4gIGluZmxhdGUgcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCisgIGZvbGxvd2luZyBhY3Rpb25zOgorCisgIC0gRGVjb21wcmVzcyBtb3JlIGlucHV0IHN0YXJ0aW5nIGF0IG5leHRfaW4gYW5kIHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbgorICAgIGFjY29yZGluZ2x5LiAgSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAorICAgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKSwgbmV4dF9pbiBpcyB1cGRhdGVkIGFuZCBwcm9jZXNzaW5nIHdpbGwKKyAgICByZXN1bWUgYXQgdGhpcyBwb2ludCBmb3IgdGhlIG5leHQgY2FsbCBvZiBpbmZsYXRlKCkuCisKKyAgLSBQcm92aWRlIG1vcmUgb3V0cHV0IHN0YXJ0aW5nIGF0IG5leHRfb3V0IGFuZCB1cGRhdGUgbmV4dF9vdXQgYW5kIGF2YWlsX291dAorICAgIGFjY29yZGluZ2x5LiAgaW5mbGF0ZSgpIHByb3ZpZGVzIGFzIG11Y2ggb3V0cHV0IGFzIHBvc3NpYmxlLCB1bnRpbCB0aGVyZSBpcworICAgIG5vIG1vcmUgaW5wdXQgZGF0YSBvciBubyBtb3JlIHNwYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyIChzZWUgYmVsb3cgYWJvdXQKKyAgICB0aGUgZmx1c2ggcGFyYW1ldGVyKS4KKworICAgIEJlZm9yZSB0aGUgY2FsbCBvZiBpbmZsYXRlKCksIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgYXQgbGVhc3QKKyAgb25lIG9mIHRoZSBhY3Rpb25zIGlzIHBvc3NpYmxlLCBieSBwcm92aWRpbmcgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtaW5nIG1vcmUKKyAgb3V0cHV0LCBhbmQgdXBkYXRpbmcgdGhlIG5leHRfKiBhbmQgYXZhaWxfKiB2YWx1ZXMgYWNjb3JkaW5nbHkuICBUaGUKKyAgYXBwbGljYXRpb24gY2FuIGNvbnN1bWUgdGhlIHVuY29tcHJlc3NlZCBvdXRwdXQgd2hlbiBpdCB3YW50cywgZm9yIGV4YW1wbGUKKyAgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsIChhdmFpbF9vdXQgPT0gMCksIG9yIGFmdGVyIGVhY2ggY2FsbCBvZgorICBpbmZsYXRlKCkuICBJZiBpbmZsYXRlIHJldHVybnMgWl9PSyBhbmQgd2l0aCB6ZXJvIGF2YWlsX291dCwgaXQgbXVzdCBiZQorICBjYWxsZWQgYWdhaW4gYWZ0ZXIgbWFraW5nIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIgYmVjYXVzZSB0aGVyZSBtaWdodCBiZQorICBtb3JlIG91dHB1dCBwZW5kaW5nLgorCisgICAgVGhlIGZsdXNoIHBhcmFtZXRlciBvZiBpbmZsYXRlKCkgY2FuIGJlIFpfTk9fRkxVU0gsIFpfU1lOQ19GTFVTSCwgWl9GSU5JU0gsCisgIFpfQkxPQ0ssIG9yIFpfVFJFRVMuICBaX1NZTkNfRkxVU0ggcmVxdWVzdHMgdGhhdCBpbmZsYXRlKCkgZmx1c2ggYXMgbXVjaAorICBvdXRwdXQgYXMgcG9zc2libGUgdG8gdGhlIG91dHB1dCBidWZmZXIuICBaX0JMT0NLIHJlcXVlc3RzIHRoYXQgaW5mbGF0ZSgpCisgIHN0b3AgaWYgYW5kIHdoZW4gaXQgZ2V0cyB0byB0aGUgbmV4dCBkZWZsYXRlIGJsb2NrIGJvdW5kYXJ5LiAgV2hlbiBkZWNvZGluZworICB0aGUgemxpYiBvciBnemlwIGZvcm1hdCwgdGhpcyB3aWxsIGNhdXNlIGluZmxhdGUoKSB0byByZXR1cm4gaW1tZWRpYXRlbHkKKyAgYWZ0ZXIgdGhlIGhlYWRlciBhbmQgYmVmb3JlIHRoZSBmaXJzdCBibG9jay4gIFdoZW4gZG9pbmcgYSByYXcgaW5mbGF0ZSwKKyAgaW5mbGF0ZSgpIHdpbGwgZ28gYWhlYWQgYW5kIHByb2Nlc3MgdGhlIGZpcnN0IGJsb2NrLCBhbmQgd2lsbCByZXR1cm4gd2hlbiBpdAorICBnZXRzIHRvIHRoZSBlbmQgb2YgdGhhdCBibG9jaywgb3Igd2hlbiBpdCBydW5zIG91dCBvZiBkYXRhLgorCisgICAgVGhlIFpfQkxPQ0sgb3B0aW9uIGFzc2lzdHMgaW4gYXBwZW5kaW5nIHRvIG9yIGNvbWJpbmluZyBkZWZsYXRlIHN0cmVhbXMuCisgIEFsc28gdG8gYXNzaXN0IGluIHRoaXMsIG9uIHJldHVybiBpbmZsYXRlKCkgd2lsbCBzZXQgc3RybS0+ZGF0YV90eXBlIHRvIHRoZQorICBudW1iZXIgb2YgdW51c2VkIGJpdHMgaW4gdGhlIGxhc3QgYnl0ZSB0YWtlbiBmcm9tIHN0cm0tPm5leHRfaW4sIHBsdXMgNjQgaWYKKyAgaW5mbGF0ZSgpIGlzIGN1cnJlbnRseSBkZWNvZGluZyB0aGUgbGFzdCBibG9jayBpbiB0aGUgZGVmbGF0ZSBzdHJlYW0sIHBsdXMKKyAgMTI4IGlmIGluZmxhdGUoKSByZXR1cm5lZCBpbW1lZGlhdGVseSBhZnRlciBkZWNvZGluZyBhbiBlbmQtb2YtYmxvY2sgY29kZSBvcgorICBkZWNvZGluZyB0aGUgY29tcGxldGUgaGVhZGVyIHVwIHRvIGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBkZWZsYXRlCisgIHN0cmVhbS4gIFRoZSBlbmQtb2YtYmxvY2sgd2lsbCBub3QgYmUgaW5kaWNhdGVkIHVudGlsIGFsbCBvZiB0aGUgdW5jb21wcmVzc2VkCisgIGRhdGEgZnJvbSB0aGF0IGJsb2NrIGhhcyBiZWVuIHdyaXR0ZW4gdG8gc3RybS0+bmV4dF9vdXQuICBUaGUgbnVtYmVyIG9mCisgIHVudXNlZCBiaXRzIG1heSBpbiBnZW5lcmFsIGJlIGdyZWF0ZXIgdGhhbiBzZXZlbiwgZXhjZXB0IHdoZW4gYml0IDcgb2YKKyAgZGF0YV90eXBlIGlzIHNldCwgaW4gd2hpY2ggY2FzZSB0aGUgbnVtYmVyIG9mIHVudXNlZCBiaXRzIHdpbGwgYmUgbGVzcyB0aGFuCisgIGVpZ2h0LiAgZGF0YV90eXBlIGlzIHNldCBhcyBub3RlZCBoZXJlIGV2ZXJ5IHRpbWUgaW5mbGF0ZSgpIHJldHVybnMgZm9yIGFsbAorICBmbHVzaCBvcHRpb25zLCBhbmQgc28gY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBhbW91bnQgb2YgY3VycmVudGx5CisgIGNvbnN1bWVkIGlucHV0IGluIGJpdHMuCisKKyAgICBUaGUgWl9UUkVFUyBvcHRpb24gYmVoYXZlcyBhcyBaX0JMT0NLIGRvZXMsIGJ1dCBpdCBhbHNvIHJldHVybnMgd2hlbiB0aGUKKyAgZW5kIG9mIGVhY2ggZGVmbGF0ZSBibG9jayBoZWFkZXIgaXMgcmVhY2hlZCwgYmVmb3JlIGFueSBhY3R1YWwgZGF0YSBpbiB0aGF0CisgIGJsb2NrIGlzIGRlY29kZWQuICBUaGlzIGFsbG93cyB0aGUgY2FsbGVyIHRvIGRldGVybWluZSB0aGUgbGVuZ3RoIG9mIHRoZQorICBkZWZsYXRlIGJsb2NrIGhlYWRlciBmb3IgbGF0ZXIgdXNlIGluIHJhbmRvbSBhY2Nlc3Mgd2l0aGluIGEgZGVmbGF0ZSBibG9jay4KKyAgMjU2IGlzIGFkZGVkIHRvIHRoZSB2YWx1ZSBvZiBzdHJtLT5kYXRhX3R5cGUgd2hlbiBpbmZsYXRlKCkgcmV0dXJucworICBpbW1lZGlhdGVseSBhZnRlciByZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBkZWZsYXRlIGJsb2NrIGhlYWRlci4KKworICAgIGluZmxhdGUoKSBzaG91bGQgbm9ybWFsbHkgYmUgY2FsbGVkIHVudGlsIGl0IHJldHVybnMgWl9TVFJFQU1fRU5EIG9yIGFuCisgIGVycm9yLiAgSG93ZXZlciBpZiBhbGwgZGVjb21wcmVzc2lvbiBpcyB0byBiZSBwZXJmb3JtZWQgaW4gYSBzaW5nbGUgc3RlcCAoYQorICBzaW5nbGUgY2FsbCBvZiBpbmZsYXRlKSwgdGhlIHBhcmFtZXRlciBmbHVzaCBzaG91bGQgYmUgc2V0IHRvIFpfRklOSVNILiAgSW4KKyAgdGhpcyBjYXNlIGFsbCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCBhbmQgYWxsIHBlbmRpbmcgb3V0cHV0IGlzIGZsdXNoZWQ7CisgIGF2YWlsX291dCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIGFsbCBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgZm9yIHRoZQorICBvcGVyYXRpb24gdG8gY29tcGxldGUuICAoVGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG1heSBoYXZlIGJlZW4KKyAgc2F2ZWQgYnkgdGhlIGNvbXByZXNzb3IgZm9yIHRoaXMgcHVycG9zZS4pIFRoZSB1c2Ugb2YgWl9GSU5JU0ggaXMgbm90CisgIHJlcXVpcmVkIHRvIHBlcmZvcm0gYW4gaW5mbGF0aW9uIGluIG9uZSBzdGVwLiAgSG93ZXZlciBpdCBtYXkgYmUgdXNlZCB0bworICBpbmZvcm0gaW5mbGF0ZSB0aGF0IGEgZmFzdGVyIGFwcHJvYWNoIGNhbiBiZSB1c2VkIGZvciB0aGUgc2luZ2xlIGluZmxhdGUoKQorICBjYWxsLiAgWl9GSU5JU0ggYWxzbyBpbmZvcm1zIGluZmxhdGUgdG8gbm90IG1haW50YWluIGEgc2xpZGluZyB3aW5kb3cgaWYgdGhlCisgIHN0cmVhbSBjb21wbGV0ZXMsIHdoaWNoIHJlZHVjZXMgaW5mbGF0ZSdzIG1lbW9yeSBmb290cHJpbnQuICBJZiB0aGUgc3RyZWFtCisgIGRvZXMgbm90IGNvbXBsZXRlLCBlaXRoZXIgYmVjYXVzZSBub3QgYWxsIG9mIHRoZSBzdHJlYW0gaXMgcHJvdmlkZWQgb3Igbm90CisgIGVub3VnaCBvdXRwdXQgc3BhY2UgaXMgcHJvdmlkZWQsIHRoZW4gYSBzbGlkaW5nIHdpbmRvdyB3aWxsIGJlIGFsbG9jYXRlZCBhbmQKKyAgaW5mbGF0ZSgpIGNhbiBiZSBjYWxsZWQgYWdhaW4gdG8gY29udGludWUgdGhlIG9wZXJhdGlvbiBhcyBpZiBaX05PX0ZMVVNIIGhhZAorICBiZWVuIHVzZWQuCisKKyAgICAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgaW5mbGF0ZSgpIGFsd2F5cyBmbHVzaGVzIGFzIG11Y2ggb3V0cHV0IGFzCisgIHBvc3NpYmxlIHRvIHRoZSBvdXRwdXQgYnVmZmVyLCBhbmQgYWx3YXlzIHVzZXMgdGhlIGZhc3RlciBhcHByb2FjaCBvbiB0aGUKKyAgZmlyc3QgY2FsbC4gIFNvIHRoZSBlZmZlY3RzIG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiBhcmUKKyAgb24gdGhlIHJldHVybiB2YWx1ZSBvZiBpbmZsYXRlKCkgYXMgbm90ZWQgYmVsb3csIHdoZW4gaW5mbGF0ZSgpIHJldHVybnMgZWFybHkKKyAgd2hlbiBaX0JMT0NLIG9yIFpfVFJFRVMgaXMgdXNlZCwgYW5kIHdoZW4gaW5mbGF0ZSgpIGF2b2lkcyB0aGUgYWxsb2NhdGlvbiBvZgorICBtZW1vcnkgZm9yIGEgc2xpZGluZyB3aW5kb3cgd2hlbiBaX0ZJTklTSCBpcyB1c2VkLgorCisgICAgIElmIGEgcHJlc2V0IGRpY3Rpb25hcnkgaXMgbmVlZGVkIGFmdGVyIHRoaXMgY2FsbCAoc2VlIGluZmxhdGVTZXREaWN0aW9uYXJ5CisgIGJlbG93KSwgaW5mbGF0ZSBzZXRzIHN0cm0tPmFkbGVyIHRvIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZiB0aGUgZGljdGlvbmFyeQorICBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IgYW5kIHJldHVybnMgWl9ORUVEX0RJQ1Q7IG90aGVyd2lzZSBpdCBzZXRzCisgIHN0cm0tPmFkbGVyIHRvIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZiBhbGwgb3V0cHV0IHByb2R1Y2VkIHNvIGZhciAodGhhdCBpcywKKyAgdG90YWxfb3V0IGJ5dGVzKSBhbmQgcmV0dXJucyBaX09LLCBaX1NUUkVBTV9FTkQgb3IgYW4gZXJyb3IgY29kZSBhcyBkZXNjcmliZWQKKyAgYmVsb3cuICBBdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0sIGluZmxhdGUoKSBjaGVja3MgdGhhdCBpdHMgY29tcHV0ZWQgYWRsZXIzMgorICBjaGVja3N1bSBpcyBlcXVhbCB0byB0aGF0IHNhdmVkIGJ5IHRoZSBjb21wcmVzc29yIGFuZCByZXR1cm5zIFpfU1RSRUFNX0VORAorICBvbmx5IGlmIHRoZSBjaGVja3N1bSBpcyBjb3JyZWN0LgorCisgICAgaW5mbGF0ZSgpIGNhbiBkZWNvbXByZXNzIGFuZCBjaGVjayBlaXRoZXIgemxpYi13cmFwcGVkIG9yIGd6aXAtd3JhcHBlZAorICBkZWZsYXRlIGRhdGEuICBUaGUgaGVhZGVyIHR5cGUgaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseSwgaWYgcmVxdWVzdGVkIHdoZW4KKyAgaW5pdGlhbGl6aW5nIHdpdGggaW5mbGF0ZUluaXQyKCkuICBBbnkgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZSBnemlwCisgIGhlYWRlciBpcyBub3QgcmV0YWluZWQsIHNvIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdGhhdCBpbmZvcm1hdGlvbiBzaG91bGQKKyAgaW5zdGVhZCB1c2UgcmF3IGluZmxhdGUsIHNlZSBpbmZsYXRlSW5pdDIoKSBiZWxvdywgb3IgaW5mbGF0ZUJhY2soKSBhbmQKKyAgcGVyZm9ybSB0aGVpciBvd24gcHJvY2Vzc2luZyBvZiB0aGUgZ3ppcCBoZWFkZXIgYW5kIHRyYWlsZXIuICBXaGVuIHByb2Nlc3NpbmcKKyAgZ3ppcC13cmFwcGVkIGRlZmxhdGUgZGF0YSwgc3RybS0+YWRsZXIzMiBpcyBzZXQgdG8gdGhlIENSQy0zMiBvZiB0aGUgb3V0cHV0CisgIHByb2R1Y3RlZCBzbyBmYXIuICBUaGUgQ1JDLTMyIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgZ3ppcCB0cmFpbGVyLgorCisgICAgaW5mbGF0ZSgpIHJldHVybnMgWl9PSyBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQgcHJvY2Vzc2VkCisgIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgWl9TVFJFQU1fRU5EIGlmIHRoZSBlbmQgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBoYXMKKyAgYmVlbiByZWFjaGVkIGFuZCBhbGwgdW5jb21wcmVzc2VkIG91dHB1dCBoYXMgYmVlbiBwcm9kdWNlZCwgWl9ORUVEX0RJQ1QgaWYgYQorICBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYXQgdGhpcyBwb2ludCwgWl9EQVRBX0VSUk9SIGlmIHRoZSBpbnB1dCBkYXRhIHdhcworICBjb3JydXB0ZWQgKGlucHV0IHN0cmVhbSBub3QgY29uZm9ybWluZyB0byB0aGUgemxpYiBmb3JtYXQgb3IgaW5jb3JyZWN0IGNoZWNrCisgIHZhbHVlKSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdHJ1Y3R1cmUgd2FzIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUKKyAgbmV4dF9pbiBvciBuZXh0X291dCB3YXMgWl9OVUxMKSwgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5LAorICBaX0JVRl9FUlJPUiBpZiBubyBwcm9ncmVzcyBpcyBwb3NzaWJsZSBvciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZQorICBvdXRwdXQgYnVmZmVyIHdoZW4gWl9GSU5JU0ggaXMgdXNlZC4gIE5vdGUgdGhhdCBaX0JVRl9FUlJPUiBpcyBub3QgZmF0YWwsIGFuZAorICBpbmZsYXRlKCkgY2FuIGJlIGNhbGxlZCBhZ2FpbiB3aXRoIG1vcmUgaW5wdXQgYW5kIG1vcmUgb3V0cHV0IHNwYWNlIHRvCisgIGNvbnRpbnVlIGRlY29tcHJlc3NpbmcuICBJZiBaX0RBVEFfRVJST1IgaXMgcmV0dXJuZWQsIHRoZSBhcHBsaWNhdGlvbiBtYXkKKyAgdGhlbiBjYWxsIGluZmxhdGVTeW5jKCkgdG8gbG9vayBmb3IgYSBnb29kIGNvbXByZXNzaW9uIGJsb2NrIGlmIGEgcGFydGlhbAorICByZWNvdmVyeSBvZiB0aGUgZGF0YSBpcyBkZXNpcmVkLgorKi8KKworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVFbmQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7CisvKgorICAgICBBbGwgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhpcyBzdHJlYW0gYXJlIGZyZWVkLgorICAgVGhpcyBmdW5jdGlvbiBkaXNjYXJkcyBhbnkgdW5wcm9jZXNzZWQgaW5wdXQgYW5kIGRvZXMgbm90IGZsdXNoIGFueSBwZW5kaW5nCisgICBvdXRwdXQuCisKKyAgICAgaW5mbGF0ZUVuZCByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdGF0ZQorICAgd2FzIGluY29uc2lzdGVudC4gIEluIHRoZSBlcnJvciBjYXNlLCBtc2cgbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYQorICAgc3RhdGljIHN0cmluZyAod2hpY2ggbXVzdCBub3QgYmUgZGVhbGxvY2F0ZWQpLgorKi8KKworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBBZHZhbmNlZCBmdW5jdGlvbnMgKi8KKworLyoKKyAgICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIG9ubHkgaW4gc29tZSBzcGVjaWFsIGFwcGxpY2F0aW9ucy4KKyovCisKKy8qCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVJbml0MiBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHdpbmRvd0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBtZW1MZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHN0cmF0ZWd5KSk7CisKKyAgICAgVGhpcyBpcyBhbm90aGVyIHZlcnNpb24gb2YgZGVmbGF0ZUluaXQgd2l0aCBtb3JlIGNvbXByZXNzaW9uIG9wdGlvbnMuICBUaGUKKyAgIGZpZWxkcyBuZXh0X2luLCB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkgdGhlCisgICBjYWxsZXIuCisKKyAgICAgVGhlIG1ldGhvZCBwYXJhbWV0ZXIgaXMgdGhlIGNvbXByZXNzaW9uIG1ldGhvZC4gIEl0IG11c3QgYmUgWl9ERUZMQVRFRCBpbgorICAgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LgorCisgICAgIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyB0aGUgYmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSB3aW5kb3cgc2l6ZQorICAgKHRoZSBzaXplIG9mIHRoZSBoaXN0b3J5IGJ1ZmZlcikuICBJdCBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIDguLjE1IGZvciB0aGlzCisgICB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiAgTGFyZ2VyIHZhbHVlcyBvZiB0aGlzIHBhcmFtZXRlciByZXN1bHQgaW4gYmV0dGVyCisgICBjb21wcmVzc2lvbiBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZgorICAgZGVmbGF0ZUluaXQgaXMgdXNlZCBpbnN0ZWFkLgorCisgICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgLTguLi0xNSBmb3IgcmF3IGRlZmxhdGUuICBJbiB0aGlzIGNhc2UsIC13aW5kb3dCaXRzCisgICBkZXRlcm1pbmVzIHRoZSB3aW5kb3cgc2l6ZS4gIGRlZmxhdGUoKSB3aWxsIHRoZW4gZ2VuZXJhdGUgcmF3IGRlZmxhdGUgZGF0YQorICAgd2l0aCBubyB6bGliIGhlYWRlciBvciB0cmFpbGVyLCBhbmQgd2lsbCBub3QgY29tcHV0ZSBhbiBhZGxlcjMyIGNoZWNrIHZhbHVlLgorCisgICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgZ3JlYXRlciB0aGFuIDE1IGZvciBvcHRpb25hbCBnemlwIGVuY29kaW5nLiAgQWRkCisgICAxNiB0byB3aW5kb3dCaXRzIHRvIHdyaXRlIGEgc2ltcGxlIGd6aXAgaGVhZGVyIGFuZCB0cmFpbGVyIGFyb3VuZCB0aGUKKyAgIGNvbXByZXNzZWQgZGF0YSBpbnN0ZWFkIG9mIGEgemxpYiB3cmFwcGVyLiAgVGhlIGd6aXAgaGVhZGVyIHdpbGwgaGF2ZSBubworICAgZmlsZSBuYW1lLCBubyBleHRyYSBkYXRhLCBubyBjb21tZW50LCBubyBtb2RpZmljYXRpb24gdGltZSAoc2V0IHRvIHplcm8pLCBubworICAgaGVhZGVyIGNyYywgYW5kIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHdpbGwgYmUgc2V0IHRvIDI1NSAodW5rbm93bikuICBJZiBhCisgICBnemlwIHN0cmVhbSBpcyBiZWluZyB3cml0dGVuLCBzdHJtLT5hZGxlciBpcyBhIGNyYzMyIGluc3RlYWQgb2YgYW4gYWRsZXIzMi4KKworICAgICBUaGUgbWVtTGV2ZWwgcGFyYW1ldGVyIHNwZWNpZmllcyBob3cgbXVjaCBtZW1vcnkgc2hvdWxkIGJlIGFsbG9jYXRlZAorICAgZm9yIHRoZSBpbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS4gIG1lbUxldmVsPTEgdXNlcyBtaW5pbXVtIG1lbW9yeSBidXQgaXMKKyAgIHNsb3cgYW5kIHJlZHVjZXMgY29tcHJlc3Npb24gcmF0aW87IG1lbUxldmVsPTkgdXNlcyBtYXhpbXVtIG1lbW9yeSBmb3IKKyAgIG9wdGltYWwgc3BlZWQuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA4LiAgU2VlIHpjb25mLmggZm9yIHRvdGFsIG1lbW9yeSB1c2FnZQorICAgYXMgYSBmdW5jdGlvbiBvZiB3aW5kb3dCaXRzIGFuZCBtZW1MZXZlbC4KKworICAgICBUaGUgc3RyYXRlZ3kgcGFyYW1ldGVyIGlzIHVzZWQgdG8gdHVuZSB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtLiAgVXNlIHRoZQorICAgdmFsdWUgWl9ERUZBVUxUX1NUUkFURUdZIGZvciBub3JtYWwgZGF0YSwgWl9GSUxURVJFRCBmb3IgZGF0YSBwcm9kdWNlZCBieSBhCisgICBmaWx0ZXIgKG9yIHByZWRpY3RvciksIFpfSFVGRk1BTl9PTkxZIHRvIGZvcmNlIEh1ZmZtYW4gZW5jb2Rpbmcgb25seSAobm8KKyAgIHN0cmluZyBtYXRjaCksIG9yIFpfUkxFIHRvIGxpbWl0IG1hdGNoIGRpc3RhbmNlcyB0byBvbmUgKHJ1bi1sZW5ndGgKKyAgIGVuY29kaW5nKS4gIEZpbHRlcmVkIGRhdGEgY29uc2lzdHMgbW9zdGx5IG9mIHNtYWxsIHZhbHVlcyB3aXRoIGEgc29tZXdoYXQKKyAgIHJhbmRvbSBkaXN0cmlidXRpb24uICBJbiB0aGlzIGNhc2UsIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gaXMgdHVuZWQgdG8KKyAgIGNvbXByZXNzIHRoZW0gYmV0dGVyLiAgVGhlIGVmZmVjdCBvZiBaX0ZJTFRFUkVEIGlzIHRvIGZvcmNlIG1vcmUgSHVmZm1hbgorICAgY29kaW5nIGFuZCBsZXNzIHN0cmluZyBtYXRjaGluZzsgaXQgaXMgc29tZXdoYXQgaW50ZXJtZWRpYXRlIGJldHdlZW4KKyAgIFpfREVGQVVMVF9TVFJBVEVHWSBhbmQgWl9IVUZGTUFOX09OTFkuICBaX1JMRSBpcyBkZXNpZ25lZCB0byBiZSBhbG1vc3QgYXMKKyAgIGZhc3QgYXMgWl9IVUZGTUFOX09OTFksIGJ1dCBnaXZlIGJldHRlciBjb21wcmVzc2lvbiBmb3IgUE5HIGltYWdlIGRhdGEuICBUaGUKKyAgIHN0cmF0ZWd5IHBhcmFtZXRlciBvbmx5IGFmZmVjdHMgdGhlIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBub3QgdGhlCisgICBjb3JyZWN0bmVzcyBvZiB0aGUgY29tcHJlc3NlZCBvdXRwdXQgZXZlbiBpZiBpdCBpcyBub3Qgc2V0IGFwcHJvcHJpYXRlbHkuCisgICBaX0ZJWEVEIHByZXZlbnRzIHRoZSB1c2Ugb2YgZHluYW1pYyBIdWZmbWFuIGNvZGVzLCBhbGxvd2luZyBmb3IgYSBzaW1wbGVyCisgICBkZWNvZGVyIGZvciBzcGVjaWFsIGFwcGxpY2F0aW9ucy4KKworICAgICBkZWZsYXRlSW5pdDIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIGFueSBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBhbiBpbnZhbGlkCisgICBtZXRob2QpLCBvciBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uICh6bGliX3ZlcnNpb24pIGlzCisgICBpbmNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiBhc3N1bWVkIGJ5IHRoZSBjYWxsZXIgKFpMSUJfVkVSU0lPTikuICBtc2cgaXMKKyAgIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICBkZWZsYXRlSW5pdDIgZG9lcyBub3QgcGVyZm9ybSBhbnkKKyAgIGNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBkZWZsYXRlKCkuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVTZXREaWN0aW9uYXJ5IE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludCAgZGljdExlbmd0aCkpOworLyoKKyAgICAgSW5pdGlhbGl6ZXMgdGhlIGNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gYnl0ZSBzZXF1ZW5jZQorICAgd2l0aG91dCBwcm9kdWNpbmcgYW55IGNvbXByZXNzZWQgb3V0cHV0LiAgV2hlbiB1c2luZyB0aGUgemxpYiBmb3JtYXQsIHRoaXMKKyAgIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGRlZmxhdGVJbml0LCBkZWZsYXRlSW5pdDIgb3IKKyAgIGRlZmxhdGVSZXNldCwgYW5kIGJlZm9yZSBhbnkgY2FsbCBvZiBkZWZsYXRlLiAgV2hlbiBkb2luZyByYXcgZGVmbGF0ZSwgdGhpcworICAgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgZWl0aGVyIGJlZm9yZSBhbnkgY2FsbCBvZiBkZWZsYXRlLCBvciBpbW1lZGlhdGVseQorICAgYWZ0ZXIgdGhlIGNvbXBsZXRpb24gb2YgYSBkZWZsYXRlIGJsb2NrLCBpLmUuIGFmdGVyIGFsbCBpbnB1dCBoYXMgYmVlbgorICAgY29uc3VtZWQgYW5kIGFsbCBvdXRwdXQgaGFzIGJlZW4gZGVsaXZlcmVkIHdoZW4gdXNpbmcgYW55IG9mIHRoZSBmbHVzaAorICAgb3B0aW9ucyBaX0JMT0NLLCBaX1BBUlRJQUxfRkxVU0gsIFpfU1lOQ19GTFVTSCwgb3IgWl9GVUxMX0ZMVVNILiAgVGhlCisgICBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgbXVzdCB1c2UgZXhhY3RseSB0aGUgc2FtZSBkaWN0aW9uYXJ5IChzZWUKKyAgIGluZmxhdGVTZXREaWN0aW9uYXJ5KS4KKworICAgICBUaGUgZGljdGlvbmFyeSBzaG91bGQgY29uc2lzdCBvZiBzdHJpbmdzIChieXRlIHNlcXVlbmNlcykgdGhhdCBhcmUgbGlrZWx5CisgICB0byBiZSBlbmNvdW50ZXJlZCBsYXRlciBpbiB0aGUgZGF0YSB0byBiZSBjb21wcmVzc2VkLCB3aXRoIHRoZSBtb3N0IGNvbW1vbmx5CisgICB1c2VkIHN0cmluZ3MgcHJlZmVyYWJseSBwdXQgdG93YXJkcyB0aGUgZW5kIG9mIHRoZSBkaWN0aW9uYXJ5LiAgVXNpbmcgYQorICAgZGljdGlvbmFyeSBpcyBtb3N0IHVzZWZ1bCB3aGVuIHRoZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQgaXMgc2hvcnQgYW5kIGNhbiBiZQorICAgcHJlZGljdGVkIHdpdGggZ29vZCBhY2N1cmFjeTsgdGhlIGRhdGEgY2FuIHRoZW4gYmUgY29tcHJlc3NlZCBiZXR0ZXIgdGhhbgorICAgd2l0aCB0aGUgZGVmYXVsdCBlbXB0eSBkaWN0aW9uYXJ5LgorCisgICAgIERlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiB0aGUgY29tcHJlc3Npb24gZGF0YSBzdHJ1Y3R1cmVzIHNlbGVjdGVkIGJ5CisgICBkZWZsYXRlSW5pdCBvciBkZWZsYXRlSW5pdDIsIGEgcGFydCBvZiB0aGUgZGljdGlvbmFyeSBtYXkgaW4gZWZmZWN0IGJlCisgICBkaXNjYXJkZWQsIGZvciBleGFtcGxlIGlmIHRoZSBkaWN0aW9uYXJ5IGlzIGxhcmdlciB0aGFuIHRoZSB3aW5kb3cgc2l6ZQorICAgcHJvdmlkZWQgaW4gZGVmbGF0ZUluaXQgb3IgZGVmbGF0ZUluaXQyLiAgVGh1cyB0aGUgc3RyaW5ncyBtb3N0IGxpa2VseSB0byBiZQorICAgdXNlZnVsIHNob3VsZCBiZSBwdXQgYXQgdGhlIGVuZCBvZiB0aGUgZGljdGlvbmFyeSwgbm90IGF0IHRoZSBmcm9udC4gIEluCisgICBhZGRpdGlvbiwgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZGVmbGF0ZSB3aWxsIHVzZSBhdCBtb3N0IHRoZSB3aW5kb3cKKyAgIHNpemUgbWludXMgMjYyIGJ5dGVzIG9mIHRoZSBwcm92aWRlZCBkaWN0aW9uYXJ5LgorCisgICAgIFVwb24gcmV0dXJuIG9mIHRoaXMgZnVuY3Rpb24sIHN0cm0tPmFkbGVyIGlzIHNldCB0byB0aGUgYWRsZXIzMiB2YWx1ZQorICAgb2YgdGhlIGRpY3Rpb25hcnk7IHRoZSBkZWNvbXByZXNzb3IgbWF5IGxhdGVyIHVzZSB0aGlzIHZhbHVlIHRvIGRldGVybWluZQorICAgd2hpY2ggZGljdGlvbmFyeSBoYXMgYmVlbiB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLiAgKFRoZSBhZGxlcjMyIHZhbHVlCisgICBhcHBsaWVzIHRvIHRoZSB3aG9sZSBkaWN0aW9uYXJ5IGV2ZW4gaWYgb25seSBhIHN1YnNldCBvZiB0aGUgZGljdGlvbmFyeSBpcworICAgYWN0dWFsbHkgdXNlZCBieSB0aGUgY29tcHJlc3Nvci4pIElmIGEgcmF3IGRlZmxhdGUgd2FzIHJlcXVlc3RlZCwgdGhlbiB0aGUKKyAgIGFkbGVyMzIgdmFsdWUgaXMgbm90IGNvbXB1dGVkIGFuZCBzdHJtLT5hZGxlciBpcyBub3Qgc2V0LgorCisgICAgIGRlZmxhdGVTZXREaWN0aW9uYXJ5IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiBhCisgICBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoZS5nLiAgZGljdGlvbmFyeSBiZWluZyBaX05VTEwpIG9yIHRoZSBzdHJlYW0gc3RhdGUgaXMKKyAgIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUgaWYgZGVmbGF0ZSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhpcyBzdHJlYW0KKyAgIG9yIGlmIG5vdCBhdCBhIGJsb2NrIGJvdW5kYXJ5IGZvciByYXcgZGVmbGF0ZSkuICBkZWZsYXRlU2V0RGljdGlvbmFyeSBkb2VzCisgICBub3QgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IGRlZmxhdGUoKS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUNvcHkgT0YoKHpfc3RyZWFtcCBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgel9zdHJlYW1wIHNvdXJjZSkpOworLyoKKyAgICAgU2V0cyB0aGUgZGVzdGluYXRpb24gc3RyZWFtIGFzIGEgY29tcGxldGUgY29weSBvZiB0aGUgc291cmNlIHN0cmVhbS4KKworICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiBzZXZlcmFsIGNvbXByZXNzaW9uIHN0cmF0ZWdpZXMgd2lsbCBiZQorICAgdHJpZWQsIGZvciBleGFtcGxlIHdoZW4gdGhlcmUgYXJlIHNldmVyYWwgd2F5cyBvZiBwcmUtcHJvY2Vzc2luZyB0aGUgaW5wdXQKKyAgIGRhdGEgd2l0aCBhIGZpbHRlci4gIFRoZSBzdHJlYW1zIHRoYXQgd2lsbCBiZSBkaXNjYXJkZWQgc2hvdWxkIHRoZW4gYmUgZnJlZWQKKyAgIGJ5IGNhbGxpbmcgZGVmbGF0ZUVuZC4gIE5vdGUgdGhhdCBkZWZsYXRlQ29weSBkdXBsaWNhdGVzIHRoZSBpbnRlcm5hbAorICAgY29tcHJlc3Npb24gc3RhdGUgd2hpY2ggY2FuIGJlIHF1aXRlIGxhcmdlLCBzbyB0aGlzIHN0cmF0ZWd5IGlzIHNsb3cgYW5kIGNhbgorICAgY29uc3VtZSBsb3RzIG9mIG1lbW9yeS4KKworICAgICBkZWZsYXRlQ29weSByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudAorICAgKHN1Y2ggYXMgemFsbG9jIGJlaW5nIFpfTlVMTCkuICBtc2cgaXMgbGVmdCB1bmNoYW5nZWQgaW4gYm90aCBzb3VyY2UgYW5kCisgICBkZXN0aW5hdGlvbi4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVJlc2V0IE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGRlZmxhdGVFbmQgZm9sbG93ZWQgYnkgZGVmbGF0ZUluaXQsCisgICBidXQgZG9lcyBub3QgZnJlZSBhbmQgcmVhbGxvY2F0ZSBhbGwgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLiAgVGhlCisgICBzdHJlYW0gd2lsbCBrZWVwIHRoZSBzYW1lIGNvbXByZXNzaW9uIGxldmVsIGFuZCBhbnkgb3RoZXIgYXR0cmlidXRlcyB0aGF0CisgICBtYXkgaGF2ZSBiZWVuIHNldCBieSBkZWZsYXRlSW5pdDIuCisKKyAgICAgZGVmbGF0ZVJlc2V0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoc3VjaCBhcyB6YWxsb2Mgb3Igc3RhdGUgYmVpbmcgWl9OVUxMKS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVBhcmFtcyBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmF0ZWd5KSk7CisvKgorICAgICBEeW5hbWljYWxseSB1cGRhdGUgdGhlIGNvbXByZXNzaW9uIGxldmVsIGFuZCBjb21wcmVzc2lvbiBzdHJhdGVneS4gIFRoZQorICAgaW50ZXJwcmV0YXRpb24gb2YgbGV2ZWwgYW5kIHN0cmF0ZWd5IGlzIGFzIGluIGRlZmxhdGVJbml0Mi4gIFRoaXMgY2FuIGJlCisgICB1c2VkIHRvIHN3aXRjaCBiZXR3ZWVuIGNvbXByZXNzaW9uIGFuZCBzdHJhaWdodCBjb3B5IG9mIHRoZSBpbnB1dCBkYXRhLCBvcgorICAgdG8gc3dpdGNoIHRvIGEgZGlmZmVyZW50IGtpbmQgb2YgaW5wdXQgZGF0YSByZXF1aXJpbmcgYSBkaWZmZXJlbnQgc3RyYXRlZ3kuCisgICBJZiB0aGUgY29tcHJlc3Npb24gbGV2ZWwgaXMgY2hhbmdlZCwgdGhlIGlucHV0IGF2YWlsYWJsZSBzbyBmYXIgaXMKKyAgIGNvbXByZXNzZWQgd2l0aCB0aGUgb2xkIGxldmVsIChhbmQgbWF5IGJlIGZsdXNoZWQpOyB0aGUgbmV3IGxldmVsIHdpbGwgdGFrZQorICAgZWZmZWN0IG9ubHkgYXQgdGhlIG5leHQgY2FsbCBvZiBkZWZsYXRlKCkuCisKKyAgICAgQmVmb3JlIHRoZSBjYWxsIG9mIGRlZmxhdGVQYXJhbXMsIHRoZSBzdHJlYW0gc3RhdGUgbXVzdCBiZSBzZXQgYXMgZm9yCisgICBhIGNhbGwgb2YgZGVmbGF0ZSgpLCBzaW5jZSB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBpbnB1dCBtYXkgaGF2ZSB0byBiZQorICAgY29tcHJlc3NlZCBhbmQgZmx1c2hlZC4gIEluIHBhcnRpY3VsYXIsIHN0cm0tPmF2YWlsX291dCBtdXN0IGJlIG5vbi16ZXJvLgorCisgICAgIGRlZmxhdGVQYXJhbXMgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKKyAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IG9yIGlmIGEgcGFyYW1ldGVyIHdhcyBpbnZhbGlkLCBaX0JVRl9FUlJPUiBpZgorICAgc3RybS0+YXZhaWxfb3V0IHdhcyB6ZXJvLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlVHVuZSBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ29vZF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2xhenksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmljZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2NoYWluKSk7CisvKgorICAgICBGaW5lIHR1bmUgZGVmbGF0ZSdzIGludGVybmFsIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMuICBUaGlzIHNob3VsZCBvbmx5IGJlCisgICB1c2VkIGJ5IHNvbWVvbmUgd2hvIHVuZGVyc3RhbmRzIHRoZSBhbGdvcml0aG0gdXNlZCBieSB6bGliJ3MgZGVmbGF0ZSBmb3IKKyAgIHNlYXJjaGluZyBmb3IgdGhlIGJlc3QgbWF0Y2hpbmcgc3RyaW5nLCBhbmQgZXZlbiB0aGVuIG9ubHkgYnkgdGhlIG1vc3QKKyAgIGZhbmF0aWMgb3B0aW1pemVyIHRyeWluZyB0byBzcXVlZXplIG91dCB0aGUgbGFzdCBjb21wcmVzc2VkIGJpdCBmb3IgdGhlaXIKKyAgIHNwZWNpZmljIGlucHV0IGRhdGEuICBSZWFkIHRoZSBkZWZsYXRlLmMgc291cmNlIGNvZGUgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZQorICAgbWF4X2xhenksIGdvb2RfbGVuZ3RoLCBuaWNlX2xlbmd0aCwgYW5kIG1heF9jaGFpbiBwYXJhbWV0ZXJzLgorCisgICAgIGRlZmxhdGVUdW5lKCkgY2FuIGJlIGNhbGxlZCBhZnRlciBkZWZsYXRlSW5pdCgpIG9yIGRlZmxhdGVJbml0MigpLCBhbmQKKyAgIHJldHVybnMgWl9PSyBvbiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBmb3IgYW4gaW52YWxpZCBkZWZsYXRlIHN0cmVhbS4KKyAqLworCitaRVhURVJOIHVMb25nIFpFWFBPUlQgZGVmbGF0ZUJvdW5kIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIHNvdXJjZUxlbikpOworLyoKKyAgICAgZGVmbGF0ZUJvdW5kKCkgcmV0dXJucyBhbiB1cHBlciBib3VuZCBvbiB0aGUgY29tcHJlc3NlZCBzaXplIGFmdGVyCisgICBkZWZsYXRpb24gb2Ygc291cmNlTGVuIGJ5dGVzLiAgSXQgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZGVmbGF0ZUluaXQoKSBvcgorICAgZGVmbGF0ZUluaXQyKCksIGFuZCBhZnRlciBkZWZsYXRlU2V0SGVhZGVyKCksIGlmIHVzZWQuICBUaGlzIHdvdWxkIGJlIHVzZWQKKyAgIHRvIGFsbG9jYXRlIGFuIG91dHB1dCBidWZmZXIgZm9yIGRlZmxhdGlvbiBpbiBhIHNpbmdsZSBwYXNzLCBhbmQgc28gd291bGQgYmUKKyAgIGNhbGxlZCBiZWZvcmUgZGVmbGF0ZSgpLiAgSWYgdGhhdCBmaXJzdCBkZWZsYXRlKCkgY2FsbCBpcyBwcm92aWRlZCB0aGUKKyAgIHNvdXJjZUxlbiBpbnB1dCBieXRlcywgYW4gb3V0cHV0IGJ1ZmZlciBhbGxvY2F0ZWQgdG8gdGhlIHNpemUgcmV0dXJuZWQgYnkKKyAgIGRlZmxhdGVCb3VuZCgpLCBhbmQgdGhlIGZsdXNoIHZhbHVlIFpfRklOSVNILCB0aGVuIGRlZmxhdGUoKSBpcyBndWFyYW50ZWVkCisgICB0byByZXR1cm4gWl9TVFJFQU1fRU5ELiAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgY29tcHJlc3NlZCBzaXplIHRvCisgICBiZSBsYXJnZXIgdGhhbiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgZGVmbGF0ZUJvdW5kKCkgaWYgZmx1c2ggb3B0aW9ucyBvdGhlcgorICAgdGhhbiBaX0ZJTklTSCBvciBaX05PX0ZMVVNIIGFyZSB1c2VkLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlUGVuZGluZyBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqcGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYml0cykpOworLyoKKyAgICAgZGVmbGF0ZVBlbmRpbmcoKSByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgYW5kIGJpdHMgb2Ygb3V0cHV0IHRoYXQgaGF2ZQorICAgYmVlbiBnZW5lcmF0ZWQsIGJ1dCBub3QgeWV0IHByb3ZpZGVkIGluIHRoZSBhdmFpbGFibGUgb3V0cHV0LiAgVGhlIGJ5dGVzIG5vdAorICAgcHJvdmlkZWQgd291bGQgYmUgZHVlIHRvIHRoZSBhdmFpbGFibGUgb3V0cHV0IHNwYWNlIGhhdmluZyBiZWluZyBjb25zdW1lZC4KKyAgIFRoZSBudW1iZXIgb2YgYml0cyBvZiBvdXRwdXQgbm90IHByb3ZpZGVkIGFyZSBiZXR3ZWVuIDAgYW5kIDcsIHdoZXJlIHRoZXkKKyAgIGF3YWl0IG1vcmUgYml0cyB0byBqb2luIHRoZW0gaW4gb3JkZXIgdG8gZmlsbCBvdXQgYSBmdWxsIGJ5dGUuICBJZiBwZW5kaW5nCisgICBvciBiaXRzIGFyZSBaX05VTEwsIHRoZW4gdGhvc2UgdmFsdWVzIGFyZSBub3Qgc2V0LgorCisgICAgIGRlZmxhdGVQZW5kaW5nIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KKyAqLworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVQcmltZSBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSk7CisvKgorICAgICBkZWZsYXRlUHJpbWUoKSBpbnNlcnRzIGJpdHMgaW4gdGhlIGRlZmxhdGUgb3V0cHV0IHN0cmVhbS4gIFRoZSBpbnRlbnQKKyAgIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IG9mZiB0aGUgZGVmbGF0ZSBvdXRwdXQgd2l0aCB0aGUgYml0cworICAgbGVmdG92ZXIgZnJvbSBhIHByZXZpb3VzIGRlZmxhdGUgc3RyZWFtIHdoZW4gYXBwZW5kaW5nIHRvIGl0LiAgQXMgc3VjaCwgdGhpcworICAgZnVuY3Rpb24gY2FuIG9ubHkgYmUgdXNlZCBmb3IgcmF3IGRlZmxhdGUsIGFuZCBtdXN0IGJlIHVzZWQgYmVmb3JlIHRoZSBmaXJzdAorICAgZGVmbGF0ZSgpIGNhbGwgYWZ0ZXIgYSBkZWZsYXRlSW5pdDIoKSBvciBkZWZsYXRlUmVzZXQoKS4gIGJpdHMgbXVzdCBiZSBsZXNzCisgICB0aGFuIG9yIGVxdWFsIHRvIDE2LCBhbmQgdGhhdCBtYW55IG9mIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHZhbHVlCisgICB3aWxsIGJlIGluc2VydGVkIGluIHRoZSBvdXRwdXQuCisKKyAgICAgZGVmbGF0ZVByaW1lIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgcm9vbSBpbiB0aGUgaW50ZXJuYWwgYnVmZmVyIHRvIGluc2VydCB0aGUgYml0cywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlCisgICBzb3VyY2Ugc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVTZXRIZWFkZXIgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnel9oZWFkZXJwIGhlYWQpKTsKKy8qCisgICAgIGRlZmxhdGVTZXRIZWFkZXIoKSBwcm92aWRlcyBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBmb3Igd2hlbiBhIGd6aXAKKyAgIHN0cmVhbSBpcyByZXF1ZXN0ZWQgYnkgZGVmbGF0ZUluaXQyKCkuICBkZWZsYXRlU2V0SGVhZGVyKCkgbWF5IGJlIGNhbGxlZAorICAgYWZ0ZXIgZGVmbGF0ZUluaXQyKCkgb3IgZGVmbGF0ZVJlc2V0KCkgYW5kIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCBvZgorICAgZGVmbGF0ZSgpLiAgVGhlIHRleHQsIHRpbWUsIG9zLCBleHRyYSBmaWVsZCwgbmFtZSwgYW5kIGNvbW1lbnQgaW5mb3JtYXRpb24KKyAgIGluIHRoZSBwcm92aWRlZCBnel9oZWFkZXIgc3RydWN0dXJlIGFyZSB3cml0dGVuIHRvIHRoZSBnemlwIGhlYWRlciAoeGZsYWcgaXMKKyAgIGlnbm9yZWQgLS0gdGhlIGV4dHJhIGZsYWdzIGFyZSBzZXQgYWNjb3JkaW5nIHRvIHRoZSBjb21wcmVzc2lvbiBsZXZlbCkuICBUaGUKKyAgIGNhbGxlciBtdXN0IGFzc3VyZSB0aGF0LCBpZiBub3QgWl9OVUxMLCBuYW1lIGFuZCBjb21tZW50IGFyZSB0ZXJtaW5hdGVkIHdpdGgKKyAgIGEgemVybyBieXRlLCBhbmQgdGhhdCBpZiBleHRyYSBpcyBub3QgWl9OVUxMLCB0aGF0IGV4dHJhX2xlbiBieXRlcyBhcmUKKyAgIGF2YWlsYWJsZSB0aGVyZS4gIElmIGhjcmMgaXMgdHJ1ZSwgYSBnemlwIGhlYWRlciBjcmMgaXMgaW5jbHVkZWQuICBOb3RlIHRoYXQKKyAgIHRoZSBjdXJyZW50IHZlcnNpb25zIG9mIHRoZSBjb21tYW5kLWxpbmUgdmVyc2lvbiBvZiBnemlwICh1cCB0aHJvdWdoIHZlcnNpb24KKyAgIDEuMy54KSBkbyBub3Qgc3VwcG9ydCBoZWFkZXIgY3JjJ3MsIGFuZCB3aWxsIHJlcG9ydCB0aGF0IGl0IGlzIGEgIm11bHRpLXBhcnQKKyAgIGd6aXAgZmlsZSIgYW5kIGdpdmUgdXAuCisKKyAgICAgSWYgZGVmbGF0ZVNldEhlYWRlciBpcyBub3QgdXNlZCwgdGhlIGRlZmF1bHQgZ3ppcCBoZWFkZXIgaGFzIHRleHQgZmFsc2UsCisgICB0aGUgdGltZSBzZXQgdG8gemVybywgYW5kIG9zIHNldCB0byAyNTUsIHdpdGggbm8gZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQKKyAgIGZpZWxkcy4gIFRoZSBnemlwIGhlYWRlciBpcyByZXR1cm5lZCB0byB0aGUgZGVmYXVsdCBzdGF0ZSBieSBkZWZsYXRlUmVzZXQoKS4KKworICAgICBkZWZsYXRlU2V0SGVhZGVyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KKyovCisKKy8qCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0MiBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICB3aW5kb3dCaXRzKSk7CisKKyAgICAgVGhpcyBpcyBhbm90aGVyIHZlcnNpb24gb2YgaW5mbGF0ZUluaXQgd2l0aCBhbiBleHRyYSBwYXJhbWV0ZXIuICBUaGUKKyAgIGZpZWxkcyBuZXh0X2luLCBhdmFpbF9pbiwgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQKKyAgIGJlZm9yZSBieSB0aGUgY2FsbGVyLgorCisgICAgIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyB0aGUgYmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSBtYXhpbXVtIHdpbmRvdworICAgc2l6ZSAodGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgYnVmZmVyKS4gIEl0IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uMTUgZm9yCisgICB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZiBpbmZsYXRlSW5pdCBpcyB1c2VkCisgICBpbnN0ZWFkLiAgd2luZG93Qml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgd2luZG93Qml0cyB2YWx1ZQorICAgcHJvdmlkZWQgdG8gZGVmbGF0ZUluaXQyKCkgd2hpbGUgY29tcHJlc3NpbmcsIG9yIGl0IG11c3QgYmUgZXF1YWwgdG8gMTUgaWYKKyAgIGRlZmxhdGVJbml0MigpIHdhcyBub3QgdXNlZC4gIElmIGEgY29tcHJlc3NlZCBzdHJlYW0gd2l0aCBhIGxhcmdlciB3aW5kb3cKKyAgIHNpemUgaXMgZ2l2ZW4gYXMgaW5wdXQsIGluZmxhdGUoKSB3aWxsIHJldHVybiB3aXRoIHRoZSBlcnJvciBjb2RlCisgICBaX0RBVEFfRVJST1IgaW5zdGVhZCBvZiB0cnlpbmcgdG8gYWxsb2NhdGUgYSBsYXJnZXIgd2luZG93LgorCisgICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgemVybyB0byByZXF1ZXN0IHRoYXQgaW5mbGF0ZSB1c2UgdGhlIHdpbmRvdyBzaXplIGluCisgICB0aGUgemxpYiBoZWFkZXIgb2YgdGhlIGNvbXByZXNzZWQgc3RyZWFtLgorCisgICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgLTguLi0xNSBmb3IgcmF3IGluZmxhdGUuICBJbiB0aGlzIGNhc2UsIC13aW5kb3dCaXRzCisgICBkZXRlcm1pbmVzIHRoZSB3aW5kb3cgc2l6ZS4gIGluZmxhdGUoKSB3aWxsIHRoZW4gcHJvY2VzcyByYXcgZGVmbGF0ZSBkYXRhLAorICAgbm90IGxvb2tpbmcgZm9yIGEgemxpYiBvciBnemlwIGhlYWRlciwgbm90IGdlbmVyYXRpbmcgYSBjaGVjayB2YWx1ZSwgYW5kIG5vdAorICAgbG9va2luZyBmb3IgYW55IGNoZWNrIHZhbHVlcyBmb3IgY29tcGFyaXNvbiBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uICBUaGlzCisgICBpcyBmb3IgdXNlIHdpdGggb3RoZXIgZm9ybWF0cyB0aGF0IHVzZSB0aGUgZGVmbGF0ZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0CisgICBzdWNoIGFzIHppcC4gIFRob3NlIGZvcm1hdHMgcHJvdmlkZSB0aGVpciBvd24gY2hlY2sgdmFsdWVzLiAgSWYgYSBjdXN0b20KKyAgIGZvcm1hdCBpcyBkZXZlbG9wZWQgdXNpbmcgdGhlIHJhdyBkZWZsYXRlIGZvcm1hdCBmb3IgY29tcHJlc3NlZCBkYXRhLCBpdCBpcworICAgcmVjb21tZW5kZWQgdGhhdCBhIGNoZWNrIHZhbHVlIHN1Y2ggYXMgYW4gYWRsZXIzMiBvciBhIGNyYzMyIGJlIGFwcGxpZWQgdG8KKyAgIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBhcyBpcyBkb25lIGluIHRoZSB6bGliLCBnemlwLCBhbmQgemlwIGZvcm1hdHMuICBGb3IKKyAgIG1vc3QgYXBwbGljYXRpb25zLCB0aGUgemxpYiBmb3JtYXQgc2hvdWxkIGJlIHVzZWQgYXMgaXMuICBOb3RlIHRoYXQgY29tbWVudHMKKyAgIGFib3ZlIG9uIHRoZSB1c2UgaW4gZGVmbGF0ZUluaXQyKCkgYXBwbGllcyB0byB0aGUgbWFnbml0dWRlIG9mIHdpbmRvd0JpdHMuCisKKyAgICAgd2luZG93Qml0cyBjYW4gYWxzbyBiZSBncmVhdGVyIHRoYW4gMTUgZm9yIG9wdGlvbmFsIGd6aXAgZGVjb2RpbmcuICBBZGQKKyAgIDMyIHRvIHdpbmRvd0JpdHMgdG8gZW5hYmxlIHpsaWIgYW5kIGd6aXAgZGVjb2Rpbmcgd2l0aCBhdXRvbWF0aWMgaGVhZGVyCisgICBkZXRlY3Rpb24sIG9yIGFkZCAxNiB0byBkZWNvZGUgb25seSB0aGUgZ3ppcCBmb3JtYXQgKHRoZSB6bGliIGZvcm1hdCB3aWxsCisgICByZXR1cm4gYSBaX0RBVEFfRVJST1IpLiAgSWYgYSBnemlwIHN0cmVhbSBpcyBiZWluZyBkZWNvZGVkLCBzdHJtLT5hZGxlciBpcyBhCisgICBjcmMzMiBpbnN0ZWFkIG9mIGFuIGFkbGVyMzIuCisKKyAgICAgaW5mbGF0ZUluaXQyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgbWVtb3J5LCBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZQorICAgdmVyc2lvbiBhc3N1bWVkIGJ5IHRoZSBjYWxsZXIsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBwYXJhbWV0ZXJzIGFyZQorICAgaW52YWxpZCwgc3VjaCBhcyBhIG51bGwgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlLiAgbXNnIGlzIHNldCB0byBudWxsIGlmCisgICB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgaW5mbGF0ZUluaXQyIGRvZXMgbm90IHBlcmZvcm0gYW55IGRlY29tcHJlc3Npb24KKyAgIGFwYXJ0IGZyb20gcG9zc2libHkgcmVhZGluZyB0aGUgemxpYiBoZWFkZXIgaWYgcHJlc2VudDogYWN0dWFsIGRlY29tcHJlc3Npb24KKyAgIHdpbGwgYmUgZG9uZSBieSBpbmZsYXRlKCkuICAoU28gbmV4dF9pbiBhbmQgYXZhaWxfaW4gbWF5IGJlIG1vZGlmaWVkLCBidXQKKyAgIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgYXJlIHVudXNlZCBhbmQgdW5jaGFuZ2VkLikgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24KKyAgIG9mIGluZmxhdGVJbml0MigpIGRvZXMgbm90IHByb2Nlc3MgYW55IGhlYWRlciBpbmZvcm1hdGlvbiAtLSB0aGF0IGlzCisgICBkZWZlcnJlZCB1bnRpbCBpbmZsYXRlKCkgaXMgY2FsbGVkLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlU2V0RGljdGlvbmFyeSBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqZGljdGlvbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgIGRpY3RMZW5ndGgpKTsKKy8qCisgICAgIEluaXRpYWxpemVzIHRoZSBkZWNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gdW5jb21wcmVzc2VkIGJ5dGUKKyAgIHNlcXVlbmNlLiAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBhIGNhbGwgb2YgaW5mbGF0ZSwKKyAgIGlmIHRoYXQgY2FsbCByZXR1cm5lZCBaX05FRURfRElDVC4gIFRoZSBkaWN0aW9uYXJ5IGNob3NlbiBieSB0aGUgY29tcHJlc3NvcgorICAgY2FuIGJlIGRldGVybWluZWQgZnJvbSB0aGUgYWRsZXIzMiB2YWx1ZSByZXR1cm5lZCBieSB0aGF0IGNhbGwgb2YgaW5mbGF0ZS4KKyAgIFRoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgbXVzdCB1c2UgZXhhY3RseSB0aGUgc2FtZSBkaWN0aW9uYXJ5IChzZWUKKyAgIGRlZmxhdGVTZXREaWN0aW9uYXJ5KS4gIEZvciByYXcgaW5mbGF0ZSwgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGF0IGFueQorICAgdGltZSB0byBzZXQgdGhlIGRpY3Rpb25hcnkuICBJZiB0aGUgcHJvdmlkZWQgZGljdGlvbmFyeSBpcyBzbWFsbGVyIHRoYW4gdGhlCisgICB3aW5kb3cgYW5kIHRoZXJlIGlzIGFscmVhZHkgZGF0YSBpbiB0aGUgd2luZG93LCB0aGVuIHRoZSBwcm92aWRlZCBkaWN0aW9uYXJ5CisgICB3aWxsIGFtZW5kIHdoYXQncyB0aGVyZS4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGluc3VyZSB0aGF0IHRoZSBkaWN0aW9uYXJ5CisgICB0aGF0IHdhcyB1c2VkIGZvciBjb21wcmVzc2lvbiBpcyBwcm92aWRlZC4KKworICAgICBpbmZsYXRlU2V0RGljdGlvbmFyeSByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgYQorICAgcGFyYW1ldGVyIGlzIGludmFsaWQgKGUuZy4gIGRpY3Rpb25hcnkgYmVpbmcgWl9OVUxMKSBvciB0aGUgc3RyZWFtIHN0YXRlIGlzCisgICBpbmNvbnNpc3RlbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgZ2l2ZW4gZGljdGlvbmFyeSBkb2Vzbid0IG1hdGNoIHRoZQorICAgZXhwZWN0ZWQgb25lIChpbmNvcnJlY3QgYWRsZXIzMiB2YWx1ZSkuICBpbmZsYXRlU2V0RGljdGlvbmFyeSBkb2VzIG5vdAorICAgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgc3Vic2VxdWVudCBjYWxscyBvZgorICAgaW5mbGF0ZSgpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlR2V0RGljdGlvbmFyeSBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlZiAqZGljdGlvbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgICpkaWN0TGVuZ3RoKSk7CisvKgorICAgICBSZXR1cm5zIHRoZSBzbGlkaW5nIGRpY3Rpb25hcnkgYmVpbmcgbWFpbnRhaW5lZCBieSBpbmZsYXRlLiAgZGljdExlbmd0aCBpcworICAgc2V0IHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGRpY3Rpb25hcnksIGFuZCB0aGF0IG1hbnkgYnl0ZXMgYXJlIGNvcGllZAorICAgdG8gZGljdGlvbmFyeS4gIGRpY3Rpb25hcnkgbXVzdCBoYXZlIGVub3VnaCBzcGFjZSwgd2hlcmUgMzI3NjggYnl0ZXMgaXMKKyAgIGFsd2F5cyBlbm91Z2guICBJZiBpbmZsYXRlR2V0RGljdGlvbmFyeSgpIGlzIGNhbGxlZCB3aXRoIGRpY3Rpb25hcnkgZXF1YWwgdG8KKyAgIFpfTlVMTCwgdGhlbiBvbmx5IHRoZSBkaWN0aW9uYXJ5IGxlbmd0aCBpcyByZXR1cm5lZCwgYW5kIG5vdGhpbmcgaXMgY29waWVkLgorICAgU2ltaWxhcnksIGlmIGRpY3RMZW5ndGggaXMgWl9OVUxMLCB0aGVuIGl0IGlzIG5vdCBzZXQuCisKKyAgICAgaW5mbGF0ZUdldERpY3Rpb25hcnkgcmV0dXJucyBaX09LIG9uIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZQorICAgc3RyZWFtIHN0YXRlIGlzIGluY29uc2lzdGVudC4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZVN5bmMgT0YoKHpfc3RyZWFtcCBzdHJtKSk7CisvKgorICAgICBTa2lwcyBpbnZhbGlkIGNvbXByZXNzZWQgZGF0YSB1bnRpbCBhIHBvc3NpYmxlIGZ1bGwgZmx1c2ggcG9pbnQgKHNlZSBhYm92ZQorICAgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiBkZWZsYXRlIHdpdGggWl9GVUxMX0ZMVVNIKSBjYW4gYmUgZm91bmQsIG9yIHVudGlsIGFsbAorICAgYXZhaWxhYmxlIGlucHV0IGlzIHNraXBwZWQuICBObyBvdXRwdXQgaXMgcHJvdmlkZWQuCisKKyAgICAgaW5mbGF0ZVN5bmMgc2VhcmNoZXMgZm9yIGEgMDAgMDAgRkYgRkYgcGF0dGVybiBpbiB0aGUgY29tcHJlc3NlZCBkYXRhLgorICAgQWxsIGZ1bGwgZmx1c2ggcG9pbnRzIGhhdmUgdGhpcyBwYXR0ZXJuLCBidXQgbm90IGFsbCBvY2N1cnJlbmNlcyBvZiB0aGlzCisgICBwYXR0ZXJuIGFyZSBmdWxsIGZsdXNoIHBvaW50cy4KKworICAgICBpbmZsYXRlU3luYyByZXR1cm5zIFpfT0sgaWYgYSBwb3NzaWJsZSBmdWxsIGZsdXNoIHBvaW50IGhhcyBiZWVuIGZvdW5kLAorICAgWl9CVUZfRVJST1IgaWYgbm8gbW9yZSBpbnB1dCB3YXMgcHJvdmlkZWQsIFpfREFUQV9FUlJPUiBpZiBubyBmbHVzaCBwb2ludAorICAgaGFzIGJlZW4gZm91bmQsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQuCisgICBJbiB0aGUgc3VjY2VzcyBjYXNlLCB0aGUgYXBwbGljYXRpb24gbWF5IHNhdmUgdGhlIGN1cnJlbnQgY3VycmVudCB2YWx1ZSBvZgorICAgdG90YWxfaW4gd2hpY2ggaW5kaWNhdGVzIHdoZXJlIHZhbGlkIGNvbXByZXNzZWQgZGF0YSB3YXMgZm91bmQuICBJbiB0aGUKKyAgIGVycm9yIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiBtYXkgcmVwZWF0ZWRseSBjYWxsIGluZmxhdGVTeW5jLCBwcm92aWRpbmcgbW9yZQorICAgaW5wdXQgZWFjaCB0aW1lLCB1bnRpbCBzdWNjZXNzIG9yIGVuZCBvZiB0aGUgaW5wdXQgZGF0YS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUNvcHkgT0YoKHpfc3RyZWFtcCBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgel9zdHJlYW1wIHNvdXJjZSkpOworLyoKKyAgICAgU2V0cyB0aGUgZGVzdGluYXRpb24gc3RyZWFtIGFzIGEgY29tcGxldGUgY29weSBvZiB0aGUgc291cmNlIHN0cmVhbS4KKworICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiByYW5kb21seSBhY2Nlc3NpbmcgYSBsYXJnZSBzdHJlYW0uICBUaGUKKyAgIGZpcnN0IHBhc3MgdGhyb3VnaCB0aGUgc3RyZWFtIGNhbiBwZXJpb2RpY2FsbHkgcmVjb3JkIHRoZSBpbmZsYXRlIHN0YXRlLAorICAgYWxsb3dpbmcgcmVzdGFydGluZyBpbmZsYXRlIGF0IHRob3NlIHBvaW50cyB3aGVuIHJhbmRvbWx5IGFjY2Vzc2luZyB0aGUKKyAgIHN0cmVhbS4KKworICAgICBpbmZsYXRlQ29weSByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudAorICAgKHN1Y2ggYXMgemFsbG9jIGJlaW5nIFpfTlVMTCkuICBtc2cgaXMgbGVmdCB1bmNoYW5nZWQgaW4gYm90aCBzb3VyY2UgYW5kCisgICBkZXN0aW5hdGlvbi4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZVJlc2V0IE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGluZmxhdGVFbmQgZm9sbG93ZWQgYnkgaW5mbGF0ZUluaXQsCisgICBidXQgZG9lcyBub3QgZnJlZSBhbmQgcmVhbGxvY2F0ZSBhbGwgdGhlIGludGVybmFsIGRlY29tcHJlc3Npb24gc3RhdGUuICBUaGUKKyAgIHN0cmVhbSB3aWxsIGtlZXAgYXR0cmlidXRlcyB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IGJ5IGluZmxhdGVJbml0Mi4KKworICAgICBpbmZsYXRlUmVzZXQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKKyAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IChzdWNoIGFzIHphbGxvYyBvciBzdGF0ZSBiZWluZyBaX05VTEwpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlUmVzZXQyIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbmRvd0JpdHMpKTsKKy8qCisgICAgIFRoaXMgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgaW5mbGF0ZVJlc2V0LCBidXQgaXQgYWxzbyBwZXJtaXRzIGNoYW5naW5nCisgICB0aGUgd3JhcCBhbmQgd2luZG93IHNpemUgcmVxdWVzdHMuICBUaGUgd2luZG93Qml0cyBwYXJhbWV0ZXIgaXMgaW50ZXJwcmV0ZWQKKyAgIHRoZSBzYW1lIGFzIGl0IGlzIGZvciBpbmZsYXRlSW5pdDIuCisKKyAgICAgaW5mbGF0ZVJlc2V0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgKHN1Y2ggYXMgemFsbG9jIG9yIHN0YXRlIGJlaW5nIFpfTlVMTCksIG9yIGlmCisgICB0aGUgd2luZG93Qml0cyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZVByaW1lIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpKTsKKy8qCisgICAgIFRoaXMgZnVuY3Rpb24gaW5zZXJ0cyBiaXRzIGluIHRoZSBpbmZsYXRlIGlucHV0IHN0cmVhbS4gIFRoZSBpbnRlbnQgaXMKKyAgIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IGluZmxhdGluZyBhdCBhIGJpdCBwb3NpdGlvbiBpbiB0aGUKKyAgIG1pZGRsZSBvZiBhIGJ5dGUuICBUaGUgcHJvdmlkZWQgYml0cyB3aWxsIGJlIHVzZWQgYmVmb3JlIGFueSBieXRlcyBhcmUgdXNlZAorICAgZnJvbSBuZXh0X2luLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIHdpdGggcmF3IGluZmxhdGUsIGFuZAorICAgc2hvdWxkIGJlIHVzZWQgYmVmb3JlIHRoZSBmaXJzdCBpbmZsYXRlKCkgY2FsbCBhZnRlciBpbmZsYXRlSW5pdDIoKSBvcgorICAgaW5mbGF0ZVJlc2V0KCkuICBiaXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDE2LCBhbmQgdGhhdCBtYW55IG9mIHRoZQorICAgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB2YWx1ZSB3aWxsIGJlIGluc2VydGVkIGluIHRoZSBpbnB1dC4KKworICAgICBJZiBiaXRzIGlzIG5lZ2F0aXZlLCB0aGVuIHRoZSBpbnB1dCBzdHJlYW0gYml0IGJ1ZmZlciBpcyBlbXB0aWVkLiAgVGhlbgorICAgaW5mbGF0ZVByaW1lKCkgY2FuIGJlIGNhbGxlZCBhZ2FpbiB0byBwdXQgYml0cyBpbiB0aGUgYnVmZmVyLiAgVGhpcyBpcyB1c2VkCisgICB0byBjbGVhciBvdXQgYml0cyBsZWZ0b3ZlciBhZnRlciBmZWVkaW5nIGluZmxhdGUgYSBibG9jayBkZXNjcmlwdGlvbiBwcmlvcgorICAgdG8gZmVlZGluZyBpbmZsYXRlIGNvZGVzLgorCisgICAgIGluZmxhdGVQcmltZSByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCisqLworCitaRVhURVJOIGxvbmcgWkVYUE9SVCBpbmZsYXRlTWFyayBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0d28gdmFsdWVzLCBvbmUgaW4gdGhlIGxvd2VyIDE2IGJpdHMgb2YgdGhlIHJldHVybgorICAgdmFsdWUsIGFuZCB0aGUgb3RoZXIgaW4gdGhlIHJlbWFpbmluZyB1cHBlciBiaXRzLCBvYnRhaW5lZCBieSBzaGlmdGluZyB0aGUKKyAgIHJldHVybiB2YWx1ZSBkb3duIDE2IGJpdHMuICBJZiB0aGUgdXBwZXIgdmFsdWUgaXMgLTEgYW5kIHRoZSBsb3dlciB2YWx1ZSBpcworICAgemVybywgdGhlbiBpbmZsYXRlKCkgaXMgY3VycmVudGx5IGRlY29kaW5nIGluZm9ybWF0aW9uIG91dHNpZGUgb2YgYSBibG9jay4KKyAgIElmIHRoZSB1cHBlciB2YWx1ZSBpcyAtMSBhbmQgdGhlIGxvd2VyIHZhbHVlIGlzIG5vbi16ZXJvLCB0aGVuIGluZmxhdGUgaXMgaW4KKyAgIHRoZSBtaWRkbGUgb2YgYSBzdG9yZWQgYmxvY2ssIHdpdGggdGhlIGxvd2VyIHZhbHVlIGVxdWFsaW5nIHRoZSBudW1iZXIgb2YKKyAgIGJ5dGVzIGZyb20gdGhlIGlucHV0IHJlbWFpbmluZyB0byBjb3B5LiAgSWYgdGhlIHVwcGVyIHZhbHVlIGlzIG5vdCAtMSwgdGhlbgorICAgaXQgaXMgdGhlIG51bWJlciBvZiBiaXRzIGJhY2sgZnJvbSB0aGUgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGlucHV0IG9mCisgICB0aGUgY29kZSAobGl0ZXJhbCBvciBsZW5ndGgvZGlzdGFuY2UgcGFpcikgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4gIEluCisgICB0aGF0IGNhc2UgdGhlIGxvd2VyIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWxyZWFkeSBlbWl0dGVkIGZvciB0aGF0CisgICBjb2RlLgorCisgICAgIEEgY29kZSBpcyBiZWluZyBwcm9jZXNzZWQgaWYgaW5mbGF0ZSBpcyB3YWl0aW5nIGZvciBtb3JlIGlucHV0IHRvIGNvbXBsZXRlCisgICBkZWNvZGluZyBvZiB0aGUgY29kZSwgb3IgaWYgaXQgaGFzIGNvbXBsZXRlZCBkZWNvZGluZyBidXQgaXMgd2FpdGluZyBmb3IKKyAgIG1vcmUgb3V0cHV0IHNwYWNlIHRvIHdyaXRlIHRoZSBsaXRlcmFsIG9yIG1hdGNoIGRhdGEuCisKKyAgICAgaW5mbGF0ZU1hcmsoKSBpcyB1c2VkIHRvIG1hcmsgbG9jYXRpb25zIGluIHRoZSBpbnB1dCBkYXRhIGZvciByYW5kb20KKyAgIGFjY2Vzcywgd2hpY2ggbWF5IGJlIGF0IGJpdCBwb3NpdGlvbnMsIGFuZCB0byBub3RlIHRob3NlIGNhc2VzIHdoZXJlIHRoZQorICAgb3V0cHV0IG9mIGEgY29kZSBtYXkgc3BhbiBib3VuZGFyaWVzIG9mIHJhbmRvbSBhY2Nlc3MgYmxvY2tzLiAgVGhlIGN1cnJlbnQKKyAgIGxvY2F0aW9uIGluIHRoZSBpbnB1dCBzdHJlYW0gY2FuIGJlIGRldGVybWluZWQgZnJvbSBhdmFpbF9pbiBhbmQgZGF0YV90eXBlCisgICBhcyBub3RlZCBpbiB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBaX0JMT0NLIGZsdXNoIHBhcmFtZXRlciBmb3IgaW5mbGF0ZS4KKworICAgICBpbmZsYXRlTWFyayByZXR1cm5zIHRoZSB2YWx1ZSBub3RlZCBhYm92ZSBvciAtMSA8PCAxNiBpZiB0aGUgcHJvdmlkZWQKKyAgIHNvdXJjZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUdldEhlYWRlciBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd6X2hlYWRlcnAgaGVhZCkpOworLyoKKyAgICAgaW5mbGF0ZUdldEhlYWRlcigpIHJlcXVlc3RzIHRoYXQgZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gYmUgc3RvcmVkIGluIHRoZQorICAgcHJvdmlkZWQgZ3pfaGVhZGVyIHN0cnVjdHVyZS4gIGluZmxhdGVHZXRIZWFkZXIoKSBtYXkgYmUgY2FsbGVkIGFmdGVyCisgICBpbmZsYXRlSW5pdDIoKSBvciBpbmZsYXRlUmVzZXQoKSwgYW5kIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCBvZiBpbmZsYXRlKCkuCisgICBBcyBpbmZsYXRlKCkgcHJvY2Vzc2VzIHRoZSBnemlwIHN0cmVhbSwgaGVhZC0+ZG9uZSBpcyB6ZXJvIHVudGlsIHRoZSBoZWFkZXIKKyAgIGlzIGNvbXBsZXRlZCwgYXQgd2hpY2ggdGltZSBoZWFkLT5kb25lIGlzIHNldCB0byBvbmUuICBJZiBhIHpsaWIgc3RyZWFtIGlzCisgICBiZWluZyBkZWNvZGVkLCB0aGVuIGhlYWQtPmRvbmUgaXMgc2V0IHRvIC0xIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgd2lsbCBiZQorICAgbm8gZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gZm9ydGhjb21pbmcuICBOb3RlIHRoYXQgWl9CTE9DSyBvciBaX1RSRUVTIGNhbiBiZQorICAgdXNlZCB0byBmb3JjZSBpbmZsYXRlKCkgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IGFmdGVyIGhlYWRlciBwcm9jZXNzaW5nIGlzCisgICBjb21wbGV0ZSBhbmQgYmVmb3JlIGFueSBhY3R1YWwgZGF0YSBpcyBkZWNvbXByZXNzZWQuCisKKyAgICAgVGhlIHRleHQsIHRpbWUsIHhmbGFncywgYW5kIG9zIGZpZWxkcyBhcmUgZmlsbGVkIGluIHdpdGggdGhlIGd6aXAgaGVhZGVyCisgICBjb250ZW50cy4gIGhjcmMgaXMgc2V0IHRvIHRydWUgaWYgdGhlcmUgaXMgYSBoZWFkZXIgQ1JDLiAgKFRoZSBoZWFkZXIgQ1JDCisgICB3YXMgdmFsaWQgaWYgZG9uZSBpcyBzZXQgdG8gb25lLikgSWYgZXh0cmEgaXMgbm90IFpfTlVMTCwgdGhlbiBleHRyYV9tYXgKKyAgIGNvbnRhaW5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSB0byBleHRyYS4gIE9uY2UgZG9uZSBpcyB0cnVlLAorICAgZXh0cmFfbGVuIGNvbnRhaW5zIHRoZSBhY3R1YWwgZXh0cmEgZmllbGQgbGVuZ3RoLCBhbmQgZXh0cmEgY29udGFpbnMgdGhlCisgICBleHRyYSBmaWVsZCwgb3IgdGhhdCBmaWVsZCB0cnVuY2F0ZWQgaWYgZXh0cmFfbWF4IGlzIGxlc3MgdGhhbiBleHRyYV9sZW4uCisgICBJZiBuYW1lIGlzIG5vdCBaX05VTEwsIHRoZW4gdXAgdG8gbmFtZV9tYXggY2hhcmFjdGVycyBhcmUgd3JpdHRlbiB0aGVyZSwKKyAgIHRlcm1pbmF0ZWQgd2l0aCBhIHplcm8gdW5sZXNzIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIG5hbWVfbWF4LiAgSWYKKyAgIGNvbW1lbnQgaXMgbm90IFpfTlVMTCwgdGhlbiB1cCB0byBjb21tX21heCBjaGFyYWN0ZXJzIGFyZSB3cml0dGVuIHRoZXJlLAorICAgdGVybWluYXRlZCB3aXRoIGEgemVybyB1bmxlc3MgdGhlIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gY29tbV9tYXguICBXaGVuIGFueQorICAgb2YgZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQgYXJlIG5vdCBaX05VTEwgYW5kIHRoZSByZXNwZWN0aXZlIGZpZWxkIGlzIG5vdAorICAgcHJlc2VudCBpbiB0aGUgaGVhZGVyLCB0aGVuIHRoYXQgZmllbGQgaXMgc2V0IHRvIFpfTlVMTCB0byBzaWduYWwgaXRzCisgICBhYnNlbmNlLiAgVGhpcyBhbGxvd3MgdGhlIHVzZSBvZiBkZWZsYXRlU2V0SGVhZGVyKCkgd2l0aCB0aGUgcmV0dXJuZWQKKyAgIHN0cnVjdHVyZSB0byBkdXBsaWNhdGUgdGhlIGhlYWRlci4gIEhvd2V2ZXIgaWYgdGhvc2UgZmllbGRzIGFyZSBzZXQgdG8KKyAgIGFsbG9jYXRlZCBtZW1vcnksIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHdpbGwgbmVlZCB0byBzYXZlIHRob3NlIHBvaW50ZXJzCisgICBlbHNld2hlcmUgc28gdGhhdCB0aGV5IGNhbiBiZSBldmVudHVhbGx5IGZyZWVkLgorCisgICAgIElmIGluZmxhdGVHZXRIZWFkZXIgaXMgbm90IHVzZWQsIHRoZW4gdGhlIGhlYWRlciBpbmZvcm1hdGlvbiBpcyBzaW1wbHkKKyAgIGRpc2NhcmRlZC4gIFRoZSBoZWFkZXIgaXMgYWx3YXlzIGNoZWNrZWQgZm9yIHZhbGlkaXR5LCBpbmNsdWRpbmcgdGhlIGhlYWRlcgorICAgQ1JDIGlmIHByZXNlbnQuICBpbmZsYXRlUmVzZXQoKSB3aWxsIHJlc2V0IHRoZSBwcm9jZXNzIHRvIGRpc2NhcmQgdGhlIGhlYWRlcgorICAgaW5mb3JtYXRpb24uICBUaGUgYXBwbGljYXRpb24gd291bGQgbmVlZCB0byBjYWxsIGluZmxhdGVHZXRIZWFkZXIoKSBhZ2FpbiB0bworICAgcmV0cmlldmUgdGhlIGhlYWRlciBmcm9tIHRoZSBuZXh0IGd6aXAgc3RyZWFtLgorCisgICAgIGluZmxhdGVHZXRIZWFkZXIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKKyAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LgorKi8KKworLyoKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2tJbml0IE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IHdpbmRvd0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBGQVIgKndpbmRvdykpOworCisgICAgIEluaXRpYWxpemUgdGhlIGludGVybmFsIHN0cmVhbSBzdGF0ZSBmb3IgZGVjb21wcmVzc2lvbiB1c2luZyBpbmZsYXRlQmFjaygpCisgICBjYWxscy4gIFRoZSBmaWVsZHMgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIGluIHN0cm0gbXVzdCBiZSBpbml0aWFsaXplZAorICAgYmVmb3JlIHRoZSBjYWxsLiAgSWYgemFsbG9jIGFuZCB6ZnJlZSBhcmUgWl9OVUxMLCB0aGVuIHRoZSBkZWZhdWx0IGxpYnJhcnktCisgICBkZXJpdmVkIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIGFyZSB1c2VkLiAgd2luZG93Qml0cyBpcyB0aGUgYmFzZSB0d28KKyAgIGxvZ2FyaXRobSBvZiB0aGUgd2luZG93IHNpemUsIGluIHRoZSByYW5nZSA4Li4xNS4gIHdpbmRvdyBpcyBhIGNhbGxlcgorICAgc3VwcGxpZWQgYnVmZmVyIG9mIHRoYXQgc2l6ZS4gIEV4Y2VwdCBmb3Igc3BlY2lhbCBhcHBsaWNhdGlvbnMgd2hlcmUgaXQgaXMKKyAgIGFzc3VyZWQgdGhhdCBkZWZsYXRlIHdhcyB1c2VkIHdpdGggc21hbGwgd2luZG93IHNpemVzLCB3aW5kb3dCaXRzIG11c3QgYmUgMTUKKyAgIGFuZCBhIDMySyBieXRlIHdpbmRvdyBtdXN0IGJlIHN1cHBsaWVkIHRvIGJlIGFibGUgdG8gZGVjb21wcmVzcyBnZW5lcmFsCisgICBkZWZsYXRlIHN0cmVhbXMuCisKKyAgICAgU2VlIGluZmxhdGVCYWNrKCkgZm9yIHRoZSB1c2FnZSBvZiB0aGVzZSByb3V0aW5lcy4KKworICAgICBpbmZsYXRlQmFja0luaXQgd2lsbCByZXR1cm4gWl9PSyBvbiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiBhbnkgb2YKKyAgIHRoZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLCBaX01FTV9FUlJPUiBpZiB0aGUgaW50ZXJuYWwgc3RhdGUgY291bGQgbm90IGJlCisgICBhbGxvY2F0ZWQsIG9yIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBkb2VzIG5vdCBtYXRjaAorICAgdGhlIHZlcnNpb24gb2YgdGhlIGhlYWRlciBmaWxlLgorKi8KKwordHlwZWRlZiB1bnNpZ25lZCAoKmluX2Z1bmMpIE9GKCh2b2lkIEZBUiAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6X2NvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICogRkFSICopKTsKK3R5cGVkZWYgaW50ICgqb3V0X2Z1bmMpIE9GKCh2b2lkIEZBUiAqLCB1bnNpZ25lZCBjaGFyIEZBUiAqLCB1bnNpZ25lZCkpOworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVCYWNrIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2Z1bmMgaW4sIHZvaWQgRkFSICppbl9kZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2Z1bmMgb3V0LCB2b2lkIEZBUiAqb3V0X2Rlc2MpKTsKKy8qCisgICAgIGluZmxhdGVCYWNrKCkgZG9lcyBhIHJhdyBpbmZsYXRlIHdpdGggYSBzaW5nbGUgY2FsbCB1c2luZyBhIGNhbGwtYmFjaworICAgaW50ZXJmYWNlIGZvciBpbnB1dCBhbmQgb3V0cHV0LiAgVGhpcyBpcyBwb3RlbnRpYWxseSBtb3JlIGVmZmljaWVudCB0aGFuCisgICBpbmZsYXRlKCkgZm9yIGZpbGUgaS9vIGFwcGxpY2F0aW9ucywgaW4gdGhhdCBpdCBhdm9pZHMgY29weWluZyBiZXR3ZWVuIHRoZQorICAgb3V0cHV0IGFuZCB0aGUgc2xpZGluZyB3aW5kb3cgYnkgc2ltcGx5IG1ha2luZyB0aGUgd2luZG93IGl0c2VsZiB0aGUgb3V0cHV0CisgICBidWZmZXIuICBpbmZsYXRlKCkgY2FuIGJlIGZhc3RlciBvbiBtb2Rlcm4gQ1BVcyB3aGVuIHVzZWQgd2l0aCBsYXJnZQorICAgYnVmZmVycy4gIGluZmxhdGVCYWNrKCkgdHJ1c3RzIHRoZSBhcHBsaWNhdGlvbiB0byBub3QgY2hhbmdlIHRoZSBvdXRwdXQKKyAgIGJ1ZmZlciBwYXNzZWQgYnkgdGhlIG91dHB1dCBmdW5jdGlvbiwgYXQgbGVhc3QgdW50aWwgaW5mbGF0ZUJhY2soKSByZXR1cm5zLgorCisgICAgIGluZmxhdGVCYWNrSW5pdCgpIG11c3QgYmUgY2FsbGVkIGZpcnN0IHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZQorICAgYW5kIHRvIGluaXRpYWxpemUgdGhlIHN0YXRlIHdpdGggdGhlIHVzZXItcHJvdmlkZWQgd2luZG93IGJ1ZmZlci4KKyAgIGluZmxhdGVCYWNrKCkgbWF5IHRoZW4gYmUgdXNlZCBtdWx0aXBsZSB0aW1lcyB0byBpbmZsYXRlIGEgY29tcGxldGUsIHJhdworICAgZGVmbGF0ZSBzdHJlYW0gd2l0aCBlYWNoIGNhbGwuICBpbmZsYXRlQmFja0VuZCgpIGlzIHRoZW4gY2FsbGVkIHRvIGZyZWUgdGhlCisgICBhbGxvY2F0ZWQgc3RhdGUuCisKKyAgICAgQSByYXcgZGVmbGF0ZSBzdHJlYW0gaXMgb25lIHdpdGggbm8gemxpYiBvciBnemlwIGhlYWRlciBvciB0cmFpbGVyLgorICAgVGhpcyByb3V0aW5lIHdvdWxkIG5vcm1hbGx5IGJlIHVzZWQgaW4gYSB1dGlsaXR5IHRoYXQgcmVhZHMgemlwIG9yIGd6aXAKKyAgIGZpbGVzIGFuZCB3cml0ZXMgb3V0IHVuY29tcHJlc3NlZCBmaWxlcy4gIFRoZSB1dGlsaXR5IHdvdWxkIGRlY29kZSB0aGUKKyAgIGhlYWRlciBhbmQgcHJvY2VzcyB0aGUgdHJhaWxlciBvbiBpdHMgb3duLCBoZW5jZSB0aGlzIHJvdXRpbmUgZXhwZWN0cyBvbmx5CisgICB0aGUgcmF3IGRlZmxhdGUgc3RyZWFtIHRvIGRlY29tcHJlc3MuICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBub3JtYWwKKyAgIGJlaGF2aW9yIG9mIGluZmxhdGUoKSwgd2hpY2ggZXhwZWN0cyBlaXRoZXIgYSB6bGliIG9yIGd6aXAgaGVhZGVyIGFuZAorICAgdHJhaWxlciBhcm91bmQgdGhlIGRlZmxhdGUgc3RyZWFtLgorCisgICAgIGluZmxhdGVCYWNrKCkgdXNlcyB0d28gc3Vicm91dGluZXMgc3VwcGxpZWQgYnkgdGhlIGNhbGxlciB0aGF0IGFyZSB0aGVuCisgICBjYWxsZWQgYnkgaW5mbGF0ZUJhY2soKSBmb3IgaW5wdXQgYW5kIG91dHB1dC4gIGluZmxhdGVCYWNrKCkgY2FsbHMgdGhvc2UKKyAgIHJvdXRpbmVzIHVudGlsIGl0IHJlYWRzIGEgY29tcGxldGUgZGVmbGF0ZSBzdHJlYW0gYW5kIHdyaXRlcyBvdXQgYWxsIG9mIHRoZQorICAgdW5jb21wcmVzc2VkIGRhdGEsIG9yIHVudGlsIGl0IGVuY291bnRlcnMgYW4gZXJyb3IuICBUaGUgZnVuY3Rpb24ncworICAgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHR5cGVzIGFyZSBkZWZpbmVkIGFib3ZlIGluIHRoZSBpbl9mdW5jIGFuZCBvdXRfZnVuYworICAgdHlwZWRlZnMuICBpbmZsYXRlQmFjaygpIHdpbGwgY2FsbCBpbihpbl9kZXNjLCAmYnVmKSB3aGljaCBzaG91bGQgcmV0dXJuIHRoZQorICAgbnVtYmVyIG9mIGJ5dGVzIG9mIHByb3ZpZGVkIGlucHV0LCBhbmQgYSBwb2ludGVyIHRvIHRoYXQgaW5wdXQgaW4gYnVmLiAgSWYKKyAgIHRoZXJlIGlzIG5vIGlucHV0IGF2YWlsYWJsZSwgaW4oKSBtdXN0IHJldHVybiB6ZXJvLS1idWYgaXMgaWdub3JlZCBpbiB0aGF0CisgICBjYXNlLS1hbmQgaW5mbGF0ZUJhY2soKSB3aWxsIHJldHVybiBhIGJ1ZmZlciBlcnJvci4gIGluZmxhdGVCYWNrKCkgd2lsbCBjYWxsCisgICBvdXQob3V0X2Rlc2MsIGJ1ZiwgbGVuKSB0byB3cml0ZSB0aGUgdW5jb21wcmVzc2VkIGRhdGEgYnVmWzAuLmxlbi0xXS4gIG91dCgpCisgICBzaG91bGQgcmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb3Igbm9uLXplcm8gb24gZmFpbHVyZS4gIElmIG91dCgpIHJldHVybnMKKyAgIG5vbi16ZXJvLCBpbmZsYXRlQmFjaygpIHdpbGwgcmV0dXJuIHdpdGggYW4gZXJyb3IuICBOZWl0aGVyIGluKCkgbm9yIG91dCgpCisgICBhcmUgcGVybWl0dGVkIHRvIGNoYW5nZSB0aGUgY29udGVudHMgb2YgdGhlIHdpbmRvdyBwcm92aWRlZCB0bworICAgaW5mbGF0ZUJhY2tJbml0KCksIHdoaWNoIGlzIGFsc28gdGhlIGJ1ZmZlciB0aGF0IG91dCgpIHVzZXMgdG8gd3JpdGUgZnJvbS4KKyAgIFRoZSBsZW5ndGggd3JpdHRlbiBieSBvdXQoKSB3aWxsIGJlIGF0IG1vc3QgdGhlIHdpbmRvdyBzaXplLiAgQW55IG5vbi16ZXJvCisgICBhbW91bnQgb2YgaW5wdXQgbWF5IGJlIHByb3ZpZGVkIGJ5IGluKCkuCisKKyAgICAgRm9yIGNvbnZlbmllbmNlLCBpbmZsYXRlQmFjaygpIGNhbiBiZSBwcm92aWRlZCBpbnB1dCBvbiB0aGUgZmlyc3QgY2FsbCBieQorICAgc2V0dGluZyBzdHJtLT5uZXh0X2luIGFuZCBzdHJtLT5hdmFpbF9pbi4gIElmIHRoYXQgaW5wdXQgaXMgZXhoYXVzdGVkLCB0aGVuCisgICBpbigpIHdpbGwgYmUgY2FsbGVkLiAgVGhlcmVmb3JlIHN0cm0tPm5leHRfaW4gbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUKKyAgIGNhbGxpbmcgaW5mbGF0ZUJhY2soKS4gIElmIHN0cm0tPm5leHRfaW4gaXMgWl9OVUxMLCB0aGVuIGluKCkgd2lsbCBiZSBjYWxsZWQKKyAgIGltbWVkaWF0ZWx5IGZvciBpbnB1dC4gIElmIHN0cm0tPm5leHRfaW4gaXMgbm90IFpfTlVMTCwgdGhlbiBzdHJtLT5hdmFpbF9pbgorICAgbXVzdCBhbHNvIGJlIGluaXRpYWxpemVkLCBhbmQgdGhlbiBpZiBzdHJtLT5hdmFpbF9pbiBpcyBub3QgemVybywgaW5wdXQgd2lsbAorICAgaW5pdGlhbGx5IGJlIHRha2VuIGZyb20gc3RybS0+bmV4dF9pblswIC4uICBzdHJtLT5hdmFpbF9pbiAtIDFdLgorCisgICAgIFRoZSBpbl9kZXNjIGFuZCBvdXRfZGVzYyBwYXJhbWV0ZXJzIG9mIGluZmxhdGVCYWNrKCkgaXMgcGFzc2VkIGFzIHRoZQorICAgZmlyc3QgcGFyYW1ldGVyIG9mIGluKCkgYW5kIG91dCgpIHJlc3BlY3RpdmVseSB3aGVuIHRoZXkgYXJlIGNhbGxlZC4gIFRoZXNlCisgICBkZXNjcmlwdG9ycyBjYW4gYmUgb3B0aW9uYWxseSB1c2VkIHRvIHBhc3MgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGNhbGxlci0KKyAgIHN1cHBsaWVkIGluKCkgYW5kIG91dCgpIGZ1bmN0aW9ucyBuZWVkIHRvIGRvIHRoZWlyIGpvYi4KKworICAgICBPbiByZXR1cm4sIGluZmxhdGVCYWNrKCkgd2lsbCBzZXQgc3RybS0+bmV4dF9pbiBhbmQgc3RybS0+YXZhaWxfaW4gdG8KKyAgIHBhc3MgYmFjayBhbnkgdW51c2VkIGlucHV0IHRoYXQgd2FzIHByb3ZpZGVkIGJ5IHRoZSBsYXN0IGluKCkgY2FsbC4gIFRoZQorICAgcmV0dXJuIHZhbHVlcyBvZiBpbmZsYXRlQmFjaygpIGNhbiBiZSBaX1NUUkVBTV9FTkQgb24gc3VjY2VzcywgWl9CVUZfRVJST1IKKyAgIGlmIGluKCkgb3Igb3V0KCkgcmV0dXJuZWQgYW4gZXJyb3IsIFpfREFUQV9FUlJPUiBpZiB0aGVyZSB3YXMgYSBmb3JtYXQgZXJyb3IKKyAgIGluIHRoZSBkZWZsYXRlIHN0cmVhbSAoaW4gd2hpY2ggY2FzZSBzdHJtLT5tc2cgaXMgc2V0IHRvIGluZGljYXRlIHRoZSBuYXR1cmUKKyAgIG9mIHRoZSBlcnJvciksIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gd2FzIG5vdCBwcm9wZXJseSBpbml0aWFsaXplZC4KKyAgIEluIHRoZSBjYXNlIG9mIFpfQlVGX0VSUk9SLCBhbiBpbnB1dCBvciBvdXRwdXQgZXJyb3IgY2FuIGJlIGRpc3Rpbmd1aXNoZWQKKyAgIHVzaW5nIHN0cm0tPm5leHRfaW4gd2hpY2ggd2lsbCBiZSBaX05VTEwgb25seSBpZiBpbigpIHJldHVybmVkIGFuIGVycm9yLiAgSWYKKyAgIHN0cm0tPm5leHRfaW4gaXMgbm90IFpfTlVMTCwgdGhlbiB0aGUgWl9CVUZfRVJST1Igd2FzIGR1ZSB0byBvdXQoKSByZXR1cm5pbmcKKyAgIG5vbi16ZXJvLiAgKGluKCkgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGJlZm9yZSBvdXQoKSwgc28gc3RybS0+bmV4dF9pbiBpcworICAgYXNzdXJlZCB0byBiZSBkZWZpbmVkIGlmIG91dCgpIHJldHVybnMgbm9uLXplcm8uKSBOb3RlIHRoYXQgaW5mbGF0ZUJhY2soKQorICAgY2Fubm90IHJldHVybiBaX09LLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0VuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgIEFsbCBtZW1vcnkgYWxsb2NhdGVkIGJ5IGluZmxhdGVCYWNrSW5pdCgpIGlzIGZyZWVkLgorCisgICAgIGluZmxhdGVCYWNrRW5kKCkgcmV0dXJucyBaX09LIG9uIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0KKyAgIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCisqLworCitaRVhURVJOIHVMb25nIFpFWFBPUlQgemxpYkNvbXBpbGVGbGFncyBPRigodm9pZCkpOworLyogUmV0dXJuIGZsYWdzIGluZGljYXRpbmcgY29tcGlsZS10aW1lIG9wdGlvbnMuCisKKyAgICBUeXBlIHNpemVzLCB0d28gYml0cyBlYWNoLCAwMCA9IDE2IGJpdHMsIDAxID0gMzIsIDEwID0gNjQsIDExID0gb3RoZXI6CisgICAgIDEuMDogc2l6ZSBvZiB1SW50CisgICAgIDMuMjogc2l6ZSBvZiB1TG9uZworICAgICA1LjQ6IHNpemUgb2Ygdm9pZHBmIChwb2ludGVyKQorICAgICA3LjY6IHNpemUgb2Ygel9vZmZfdAorCisgICAgQ29tcGlsZXIsIGFzc2VtYmxlciwgYW5kIGRlYnVnIG9wdGlvbnM6CisgICAgIDg6IERFQlVHCisgICAgIDk6IEFTTVYgb3IgQVNNSU5GIC0tIHVzZSBBU00gY29kZQorICAgICAxMDogWkxJQl9XSU5BUEkgLS0gZXhwb3J0ZWQgZnVuY3Rpb25zIHVzZSB0aGUgV0lOQVBJIGNhbGxpbmcgY29udmVudGlvbgorICAgICAxMTogMCAocmVzZXJ2ZWQpCisKKyAgICBPbmUtdGltZSB0YWJsZSBidWlsZGluZyAoc21hbGxlciBjb2RlLCBidXQgbm90IHRocmVhZC1zYWZlIGlmIHRydWUpOgorICAgICAxMjogQlVJTERGSVhFRCAtLSBidWlsZCBzdGF0aWMgYmxvY2sgZGVjb2RpbmcgdGFibGVzIHdoZW4gbmVlZGVkCisgICAgIDEzOiBEWU5BTUlDX0NSQ19UQUJMRSAtLSBidWlsZCBDUkMgY2FsY3VsYXRpb24gdGFibGVzIHdoZW4gbmVlZGVkCisgICAgIDE0LDE1OiAwIChyZXNlcnZlZCkKKworICAgIExpYnJhcnkgY29udGVudCAoaW5kaWNhdGVzIG1pc3NpbmcgZnVuY3Rpb25hbGl0eSk6CisgICAgIDE2OiBOT19HWkNPTVBSRVNTIC0tIGd6KiBmdW5jdGlvbnMgY2Fubm90IGNvbXByZXNzICh0byBhdm9pZCBsaW5raW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmxhdGUgY29kZSB3aGVuIG5vdCBuZWVkZWQpCisgICAgIDE3OiBOT19HWklQIC0tIGRlZmxhdGUgY2FuJ3Qgd3JpdGUgZ3ppcCBzdHJlYW1zLCBhbmQgaW5mbGF0ZSBjYW4ndCBkZXRlY3QKKyAgICAgICAgICAgICAgICAgICAgYW5kIGRlY29kZSBnemlwIHN0cmVhbXMgKHRvIGF2b2lkIGxpbmtpbmcgY3JjIGNvZGUpCisgICAgIDE4LTE5OiAwIChyZXNlcnZlZCkKKworICAgIE9wZXJhdGlvbiB2YXJpYXRpb25zIChjaGFuZ2VzIGluIGxpYnJhcnkgZnVuY3Rpb25hbGl0eSk6CisgICAgIDIwOiBQS1pJUF9CVUdfV09SS0FST1VORCAtLSBzbGlnaHRseSBtb3JlIHBlcm1pc3NpdmUgaW5mbGF0ZQorICAgICAyMTogRkFTVEVTVCAtLSBkZWZsYXRlIGFsZ29yaXRobSB3aXRoIG9ubHkgb25lLCBsb3dlc3QgY29tcHJlc3Npb24gbGV2ZWwKKyAgICAgMjIsMjM6IDAgKHJlc2VydmVkKQorCisgICAgVGhlIHNwcmludGYgdmFyaWFudCB1c2VkIGJ5IGd6cHJpbnRmICh6ZXJvIGlzIGJlc3QpOgorICAgICAyNDogMCA9IHZzKiwgMSA9IHMqIC0tIDEgbWVhbnMgbGltaXRlZCB0byAyMCBhcmd1bWVudHMgYWZ0ZXIgdGhlIGZvcm1hdAorICAgICAyNTogMCA9ICpucHJpbnRmLCAxID0gKnByaW50ZiAtLSAxIG1lYW5zIGd6cHJpbnRmKCkgbm90IHNlY3VyZSEKKyAgICAgMjY6IDAgPSByZXR1cm5zIHZhbHVlLCAxID0gdm9pZCAtLSAxIG1lYW5zIGluZmVycmVkIHN0cmluZyBsZW5ndGggcmV0dXJuZWQKKworICAgIFJlbWFpbmRlcjoKKyAgICAgMjctMzE6IDAgKHJlc2VydmVkKQorICovCisKKyNpZm5kZWYgWl9TT0xPCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHV0aWxpdHkgZnVuY3Rpb25zICovCisKKy8qCisgICAgIFRoZSBmb2xsb3dpbmcgdXRpbGl0eSBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZiB0aGUgYmFzaWMKKyAgIHN0cmVhbS1vcmllbnRlZCBmdW5jdGlvbnMuICBUbyBzaW1wbGlmeSB0aGUgaW50ZXJmYWNlLCBzb21lIGRlZmF1bHQgb3B0aW9ucworICAgYXJlIGFzc3VtZWQgKGNvbXByZXNzaW9uIGxldmVsIGFuZCBtZW1vcnkgdXNhZ2UsIHN0YW5kYXJkIG1lbW9yeSBhbGxvY2F0aW9uCisgICBmdW5jdGlvbnMpLiAgVGhlIHNvdXJjZSBjb2RlIG9mIHRoZXNlIHV0aWxpdHkgZnVuY3Rpb25zIGNhbiBiZSBtb2RpZmllZCBpZgorICAgeW91IG5lZWQgc3BlY2lhbCBvcHRpb25zLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBjb21wcmVzcyBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZWYgKnNvdXJjZSwgdUxvbmcgc291cmNlTGVuKSk7CisvKgorICAgICBDb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gIHNvdXJjZUxlbiBpcworICAgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAgVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwgc2l6ZQorICAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBhdCBsZWFzdCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkKKyAgIGNvbXByZXNzQm91bmQoc291cmNlTGVuKS4gIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlCisgICBjb21wcmVzc2VkIGJ1ZmZlci4KKworICAgICBjb21wcmVzcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0CisgICBidWZmZXIuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGNvbXByZXNzMiBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpKTsKKy8qCisgICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgVGhlIGxldmVsCisgICBwYXJhbWV0ZXIgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgaW4gZGVmbGF0ZUluaXQuICBzb3VyY2VMZW4gaXMgdGhlIGJ5dGUKKyAgIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsIHNpemUgb2YgdGhlCisgICBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgYXQgbGVhc3QgdGhlIHZhbHVlIHJldHVybmVkIGJ5CisgICBjb21wcmVzc0JvdW5kKHNvdXJjZUxlbikuICBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZQorICAgY29tcHJlc3NlZCBidWZmZXIuCisKKyAgICAgY29tcHJlc3MyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyLAorICAgWl9TVFJFQU1fRVJST1IgaWYgdGhlIGxldmVsIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorKi8KKworWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNvbXByZXNzQm91bmQgT0YoKHVMb25nIHNvdXJjZUxlbikpOworLyoKKyAgICAgY29tcHJlc3NCb3VuZCgpIHJldHVybnMgYW4gdXBwZXIgYm91bmQgb24gdGhlIGNvbXByZXNzZWQgc2l6ZSBhZnRlcgorICAgY29tcHJlc3MoKSBvciBjb21wcmVzczIoKSBvbiBzb3VyY2VMZW4gYnl0ZXMuICBJdCB3b3VsZCBiZSB1c2VkIGJlZm9yZSBhCisgICBjb21wcmVzcygpIG9yIGNvbXByZXNzMigpIGNhbGwgdG8gYWxsb2NhdGUgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgdW5jb21wcmVzcyBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4pKTsKKy8qCisgICAgIERlY29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBzb3VyY2VMZW4gaXMKKyAgIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsIHNpemUKKyAgIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIGVudGlyZQorICAgdW5jb21wcmVzc2VkIGRhdGEuICAoVGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG11c3QgaGF2ZSBiZWVuIHNhdmVkCisgICBwcmV2aW91c2x5IGJ5IHRoZSBjb21wcmVzc29yIGFuZCB0cmFuc21pdHRlZCB0byB0aGUgZGVjb21wcmVzc29yIGJ5IHNvbWUKKyAgIG1lY2hhbmlzbSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIGNvbXByZXNzaW9uIGxpYnJhcnkuKSBVcG9uIGV4aXQsIGRlc3RMZW4KKyAgIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGJ1ZmZlci4KKworICAgICB1bmNvbXByZXNzIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90CisgICBlbm91Z2ggbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQKKyAgIGJ1ZmZlciwgb3IgWl9EQVRBX0VSUk9SIGlmIHRoZSBpbnB1dCBkYXRhIHdhcyBjb3JydXB0ZWQgb3IgaW5jb21wbGV0ZS4gIEluCisgICB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20sIHVuY29tcHJlc3MoKSB3aWxsIGZpbGwgdGhlIG91dHB1dAorICAgYnVmZmVyIHdpdGggdGhlIHVuY29tcHJlc3NlZCBkYXRhIHVwIHRvIHRoYXQgcG9pbnQuCisqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBnemlwIGZpbGUgYWNjZXNzIGZ1bmN0aW9ucyAqLworCisvKgorICAgICBUaGlzIGxpYnJhcnkgc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbiBnemlwICguZ3opIGZvcm1hdCB3aXRoCisgICBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGF0IG9mIHN0ZGlvLCB1c2luZyB0aGUgZnVuY3Rpb25zIHRoYXQgc3RhcnQgd2l0aAorICAgImd6Ii4gIFRoZSBnemlwIGZvcm1hdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgemxpYiBmb3JtYXQuICBnemlwIGlzIGEgZ3ppcAorICAgd3JhcHBlciwgZG9jdW1lbnRlZCBpbiBSRkMgMTk1Miwgd3JhcHBlZCBhcm91bmQgYSBkZWZsYXRlIHN0cmVhbS4KKyovCisKK3R5cGVkZWYgc3RydWN0IGd6RmlsZV9zICpnekZpbGU7ICAgIC8qIHNlbWktb3BhcXVlIGd6aXAgZmlsZSBkZXNjcmlwdG9yICovCisKKy8qCitaRVhURVJOIGd6RmlsZSBaRVhQT1JUIGd6b3BlbiBPRigoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbW9kZSkpOworCisgICAgIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuICBUaGUgbW9kZSBwYXJhbWV0ZXIgaXMgYXMKKyAgIGluIGZvcGVuICgicmIiIG9yICJ3YiIpIGJ1dCBjYW4gYWxzbyBpbmNsdWRlIGEgY29tcHJlc3Npb24gbGV2ZWwgKCJ3YjkiKSBvcgorICAgYSBzdHJhdGVneTogJ2YnIGZvciBmaWx0ZXJlZCBkYXRhIGFzIGluICJ3YjZmIiwgJ2gnIGZvciBIdWZmbWFuLW9ubHkKKyAgIGNvbXByZXNzaW9uIGFzIGluICJ3YjFoIiwgJ1InIGZvciBydW4tbGVuZ3RoIGVuY29kaW5nIGFzIGluICJ3YjFSIiwgb3IgJ0YnCisgICBmb3IgZml4ZWQgY29kZSBjb21wcmVzc2lvbiBhcyBpbiAid2I5RiIuICAoU2VlIHRoZSBkZXNjcmlwdGlvbiBvZgorICAgZGVmbGF0ZUluaXQyIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdHJhdGVneSBwYXJhbWV0ZXIuKSAgJ1QnIHdpbGwKKyAgIHJlcXVlc3QgdHJhbnNwYXJlbnQgd3JpdGluZyBvciBhcHBlbmRpbmcgd2l0aCBubyBjb21wcmVzc2lvbiBhbmQgbm90IHVzaW5nCisgICB0aGUgZ3ppcCBmb3JtYXQuCisKKyAgICAgImEiIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgInciIHRvIHJlcXVlc3QgdGhhdCB0aGUgZ3ppcCBzdHJlYW0gdGhhdCB3aWxsCisgICBiZSB3cml0dGVuIGJlIGFwcGVuZGVkIHRvIHRoZSBmaWxlLiAgIisiIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLCBzaW5jZQorICAgcmVhZGluZyBhbmQgd3JpdGluZyB0byB0aGUgc2FtZSBnemlwIGZpbGUgaXMgbm90IHN1cHBvcnRlZC4gIFRoZSBhZGRpdGlvbiBvZgorICAgIngiIHdoZW4gd3JpdGluZyB3aWxsIGNyZWF0ZSB0aGUgZmlsZSBleGNsdXNpdmVseSwgd2hpY2ggZmFpbHMgaWYgdGhlIGZpbGUKKyAgIGFscmVhZHkgZXhpc3RzLiAgT24gc3lzdGVtcyB0aGF0IHN1cHBvcnQgaXQsIHRoZSBhZGRpdGlvbiBvZiAiZSIgd2hlbgorICAgcmVhZGluZyBvciB3cml0aW5nIHdpbGwgc2V0IHRoZSBmbGFnIHRvIGNsb3NlIHRoZSBmaWxlIG9uIGFuIGV4ZWN2ZSgpIGNhbGwuCisKKyAgICAgVGhlc2UgZnVuY3Rpb25zLCBhcyB3ZWxsIGFzIGd6aXAsIHdpbGwgcmVhZCBhbmQgZGVjb2RlIGEgc2VxdWVuY2Ugb2YgZ3ppcAorICAgc3RyZWFtcyBpbiBhIGZpbGUuICBUaGUgYXBwZW5kIGZ1bmN0aW9uIG9mIGd6b3BlbigpIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZQorICAgc3VjaCBhIGZpbGUuICAoQWxzbyBzZWUgZ3pmbHVzaCgpIGZvciBhbm90aGVyIHdheSB0byBkbyB0aGlzLikgIFdoZW4KKyAgIGFwcGVuZGluZywgZ3pvcGVuIGRvZXMgbm90IHRlc3Qgd2hldGhlciB0aGUgZmlsZSBiZWdpbnMgd2l0aCBhIGd6aXAgc3RyZWFtLAorICAgbm9yIGRvZXMgaXQgbG9vayBmb3IgdGhlIGVuZCBvZiB0aGUgZ3ppcCBzdHJlYW1zIHRvIGJlZ2luIGFwcGVuZGluZy4gIGd6b3BlbgorICAgd2lsbCBzaW1wbHkgYXBwZW5kIGEgZ3ppcCBzdHJlYW0gdG8gdGhlIGV4aXN0aW5nIGZpbGUuCisKKyAgICAgZ3pvcGVuIGNhbiBiZSB1c2VkIHRvIHJlYWQgYSBmaWxlIHdoaWNoIGlzIG5vdCBpbiBnemlwIGZvcm1hdDsgaW4gdGhpcworICAgY2FzZSBnenJlYWQgd2lsbCBkaXJlY3RseSByZWFkIGZyb20gdGhlIGZpbGUgd2l0aG91dCBkZWNvbXByZXNzaW9uLiAgV2hlbgorICAgcmVhZGluZywgdGhpcyB3aWxsIGJlIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkgYnkgbG9va2luZyBmb3IgdGhlIG1hZ2ljIHR3by0KKyAgIGJ5dGUgZ3ppcCBoZWFkZXIuCisKKyAgICAgZ3pvcGVuIHJldHVybnMgTlVMTCBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkLCBpZiB0aGVyZSB3YXMKKyAgIGluc3VmZmljaWVudCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIGd6RmlsZSBzdGF0ZSwgb3IgaWYgYW4gaW52YWxpZCBtb2RlIHdhcworICAgc3BlY2lmaWVkIChhbiAncicsICd3Jywgb3IgJ2EnIHdhcyBub3QgcHJvdmlkZWQsIG9yICcrJyB3YXMgcHJvdmlkZWQpLgorICAgZXJybm8gY2FuIGJlIGNoZWNrZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSByZWFzb24gZ3pvcGVuIGZhaWxlZCB3YXMgdGhhdCB0aGUKKyAgIGZpbGUgY291bGQgbm90IGJlIG9wZW5lZC4KKyovCisKK1pFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pkb3BlbiBPRigoaW50IGZkLCBjb25zdCBjaGFyICptb2RlKSk7CisvKgorICAgICBnemRvcGVuIGFzc29jaWF0ZXMgYSBnekZpbGUgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIGZkLiAgRmlsZSBkZXNjcmlwdG9ycworICAgYXJlIG9idGFpbmVkIGZyb20gY2FsbHMgbGlrZSBvcGVuLCBkdXAsIGNyZWF0LCBwaXBlIG9yIGZpbGVubyAoaWYgdGhlIGZpbGUKKyAgIGhhcyBiZWVuIHByZXZpb3VzbHkgb3BlbmVkIHdpdGggZm9wZW4pLiAgVGhlIG1vZGUgcGFyYW1ldGVyIGlzIGFzIGluIGd6b3Blbi4KKworICAgICBUaGUgbmV4dCBjYWxsIG9mIGd6Y2xvc2Ugb24gdGhlIHJldHVybmVkIGd6RmlsZSB3aWxsIGFsc28gY2xvc2UgdGhlIGZpbGUKKyAgIGRlc2NyaXB0b3IgZmQsIGp1c3QgbGlrZSBmY2xvc2UoZmRvcGVuKGZkLCBtb2RlKSkgY2xvc2VzIHRoZSBmaWxlIGRlc2NyaXB0b3IKKyAgIGZkLiAgSWYgeW91IHdhbnQgdG8ga2VlcCBmZCBvcGVuLCB1c2UgZmQgPSBkdXAoZmRfa2VlcCk7IGd6ID0gZ3pkb3BlbihmZCwKKyAgIG1vZGUpOy4gIFRoZSBkdXBsaWNhdGVkIGRlc2NyaXB0b3Igc2hvdWxkIGJlIHNhdmVkIHRvIGF2b2lkIGEgbGVhaywgc2luY2UKKyAgIGd6ZG9wZW4gZG9lcyBub3QgY2xvc2UgZmQgaWYgaXQgZmFpbHMuICBJZiB5b3UgYXJlIHVzaW5nIGZpbGVubygpIHRvIGdldCB0aGUKKyAgIGZpbGUgZGVzY3JpcHRvciBmcm9tIGEgRklMRSAqLCB0aGVuIHlvdSB3aWxsIGhhdmUgdG8gdXNlIGR1cCgpIHRvIGF2b2lkCisgICBkb3VibGUtY2xvc2UoKWluZyB0aGUgZmlsZSBkZXNjcmlwdG9yLiAgQm90aCBnemNsb3NlKCkgYW5kIGZjbG9zZSgpIHdpbGwKKyAgIGNsb3NlIHRoZSBhc3NvY2lhdGVkIGZpbGUgZGVzY3JpcHRvciwgc28gdGhleSBuZWVkIHRvIGhhdmUgZGlmZmVyZW50IGZpbGUKKyAgIGRlc2NyaXB0b3JzLgorCisgICAgIGd6ZG9wZW4gcmV0dXJucyBOVUxMIGlmIHRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlIHRoZQorICAgZ3pGaWxlIHN0YXRlLCBpZiBhbiBpbnZhbGlkIG1vZGUgd2FzIHNwZWNpZmllZCAoYW4gJ3InLCAndycsIG9yICdhJyB3YXMgbm90CisgICBwcm92aWRlZCwgb3IgJysnIHdhcyBwcm92aWRlZCksIG9yIGlmIGZkIGlzIC0xLiAgVGhlIGZpbGUgZGVzY3JpcHRvciBpcyBub3QKKyAgIHVzZWQgdW50aWwgdGhlIG5leHQgZ3oqIHJlYWQsIHdyaXRlLCBzZWVrLCBvciBjbG9zZSBvcGVyYXRpb24sIHNvIGd6ZG9wZW4KKyAgIHdpbGwgbm90IGRldGVjdCBpZiBmZCBpcyBpbnZhbGlkICh1bmxlc3MgZmQgaXMgLTEpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBnemJ1ZmZlciBPRigoZ3pGaWxlIGZpbGUsIHVuc2lnbmVkIHNpemUpKTsKKy8qCisgICAgIFNldCB0aGUgaW50ZXJuYWwgYnVmZmVyIHNpemUgdXNlZCBieSB0aGlzIGxpYnJhcnkncyBmdW5jdGlvbnMuICBUaGUKKyAgIGRlZmF1bHQgYnVmZmVyIHNpemUgaXMgODE5MiBieXRlcy4gIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIKKyAgIGd6b3BlbigpIG9yIGd6ZG9wZW4oKSwgYW5kIGJlZm9yZSBhbnkgb3RoZXIgY2FsbHMgdGhhdCByZWFkIG9yIHdyaXRlIHRoZQorICAgZmlsZS4gIFRoZSBidWZmZXIgbWVtb3J5IGFsbG9jYXRpb24gaXMgYWx3YXlzIGRlZmVycmVkIHRvIHRoZSBmaXJzdCByZWFkIG9yCisgICB3cml0ZS4gIFR3byBidWZmZXJzIGFyZSBhbGxvY2F0ZWQsIGVpdGhlciBib3RoIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSB3aGVuCisgICB3cml0aW5nLCBvciBvbmUgb2YgdGhlIHNwZWNpZmllZCBzaXplIGFuZCB0aGUgb3RoZXIgdHdpY2UgdGhhdCBzaXplIHdoZW4KKyAgIHJlYWRpbmcuICBBIGxhcmdlciBidWZmZXIgc2l6ZSBvZiwgZm9yIGV4YW1wbGUsIDY0SyBvciAxMjhLIGJ5dGVzIHdpbGwKKyAgIG5vdGljZWFibHkgaW5jcmVhc2UgdGhlIHNwZWVkIG9mIGRlY29tcHJlc3Npb24gKHJlYWRpbmcpLgorCisgICAgIFRoZSBuZXcgYnVmZmVyIHNpemUgYWxzbyBhZmZlY3RzIHRoZSBtYXhpbXVtIGxlbmd0aCBmb3IgZ3pwcmludGYoKS4KKworICAgICBnemJ1ZmZlcigpIHJldHVybnMgMCBvbiBzdWNjZXNzLCBvciAtMSBvbiBmYWlsdXJlLCBzdWNoIGFzIGJlaW5nIGNhbGxlZAorICAgdG9vIGxhdGUuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGd6c2V0cGFyYW1zIE9GKChnekZpbGUgZmlsZSwgaW50IGxldmVsLCBpbnQgc3RyYXRlZ3kpKTsKKy8qCisgICAgIER5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgb3Igc3RyYXRlZ3kuICBTZWUgdGhlIGRlc2NyaXB0aW9uCisgICBvZiBkZWZsYXRlSW5pdDIgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMuCisKKyAgICAgZ3pzZXRwYXJhbXMgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBmaWxlIHdhcyBub3QKKyAgIG9wZW5lZCBmb3Igd3JpdGluZy4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3pyZWFkIE9GKChnekZpbGUgZmlsZSwgdm9pZHAgYnVmLCB1bnNpZ25lZCBsZW4pKTsKKy8qCisgICAgIFJlYWRzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4gIElmCisgICB0aGUgaW5wdXQgZmlsZSBpcyBub3QgaW4gZ3ppcCBmb3JtYXQsIGd6cmVhZCBjb3BpZXMgdGhlIGdpdmVuIG51bWJlciBvZgorICAgYnl0ZXMgaW50byB0aGUgYnVmZmVyIGRpcmVjdGx5IGZyb20gdGhlIGZpbGUuCisKKyAgICAgQWZ0ZXIgcmVhY2hpbmcgdGhlIGVuZCBvZiBhIGd6aXAgc3RyZWFtIGluIHRoZSBpbnB1dCwgZ3pyZWFkIHdpbGwgY29udGludWUKKyAgIHRvIHJlYWQsIGxvb2tpbmcgZm9yIGFub3RoZXIgZ3ppcCBzdHJlYW0uICBBbnkgbnVtYmVyIG9mIGd6aXAgc3RyZWFtcyBtYXkgYmUKKyAgIGNvbmNhdGVuYXRlZCBpbiB0aGUgaW5wdXQgZmlsZSwgYW5kIHdpbGwgYWxsIGJlIGRlY29tcHJlc3NlZCBieSBnenJlYWQoKS4KKyAgIElmIHNvbWV0aGluZyBvdGhlciB0aGFuIGEgZ3ppcCBzdHJlYW0gaXMgZW5jb3VudGVyZWQgYWZ0ZXIgYSBnemlwIHN0cmVhbSwKKyAgIHRoYXQgcmVtYWluaW5nIHRyYWlsaW5nIGdhcmJhZ2UgaXMgaWdub3JlZCAoYW5kIG5vIGVycm9yIGlzIHJldHVybmVkKS4KKworICAgICBnenJlYWQgY2FuIGJlIHVzZWQgdG8gcmVhZCBhIGd6aXAgZmlsZSB0aGF0IGlzIGJlaW5nIGNvbmN1cnJlbnRseSB3cml0dGVuLgorICAgVXBvbiByZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBpbnB1dCwgZ3pyZWFkIHdpbGwgcmV0dXJuIHdpdGggdGhlIGF2YWlsYWJsZQorICAgZGF0YS4gIElmIHRoZSBlcnJvciBjb2RlIHJldHVybmVkIGJ5IGd6ZXJyb3IgaXMgWl9PSyBvciBaX0JVRl9FUlJPUiwgdGhlbgorICAgZ3pjbGVhcmVyciBjYW4gYmUgdXNlZCB0byBjbGVhciB0aGUgZW5kIG9mIGZpbGUgaW5kaWNhdG9yIGluIG9yZGVyIHRvIHBlcm1pdAorICAgZ3pyZWFkIHRvIGJlIHRyaWVkIGFnYWluLiAgWl9PSyBpbmRpY2F0ZXMgdGhhdCBhIGd6aXAgc3RyZWFtIHdhcyBjb21wbGV0ZWQKKyAgIG9uIHRoZSBsYXN0IGd6cmVhZC4gIFpfQlVGX0VSUk9SIGluZGljYXRlcyB0aGF0IHRoZSBpbnB1dCBmaWxlIGVuZGVkIGluIHRoZQorICAgbWlkZGxlIG9mIGEgZ3ppcCBzdHJlYW0uICBOb3RlIHRoYXQgZ3pyZWFkIGRvZXMgbm90IHJldHVybiAtMSBpbiB0aGUgZXZlbnQKKyAgIG9mIGFuIGluY29tcGxldGUgZ3ppcCBzdHJlYW0uICBUaGlzIGVycm9yIGlzIGRlZmVycmVkIHVudGlsIGd6Y2xvc2UoKSwgd2hpY2gKKyAgIHdpbGwgcmV0dXJuIFpfQlVGX0VSUk9SIGlmIHRoZSBsYXN0IGd6cmVhZCBlbmRlZCBpbiB0aGUgbWlkZGxlIG9mIGEgZ3ppcAorICAgc3RyZWFtLiAgQWx0ZXJuYXRpdmVseSwgZ3plcnJvciBjYW4gYmUgdXNlZCBiZWZvcmUgZ3pjbG9zZSB0byBkZXRlY3QgdGhpcworICAgY2FzZS4KKworICAgICBnenJlYWQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSByZWFkLCBsZXNzIHRoYW4KKyAgIGxlbiBmb3IgZW5kIG9mIGZpbGUsIG9yIC0xIGZvciBlcnJvci4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3p3cml0ZSBPRigoZ3pGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWRwYyBidWYsIHVuc2lnbmVkIGxlbikpOworLyoKKyAgICAgV3JpdGVzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4KKyAgIGd6d3JpdGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyB3cml0dGVuIG9yIDAgaW4gY2FzZSBvZgorICAgZXJyb3IuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUVkEgZ3pwcmludGYgWl9BUkcoKGd6RmlsZSBmaWxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikpOworLyoKKyAgICAgQ29udmVydHMsIGZvcm1hdHMsIGFuZCB3cml0ZXMgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29tcHJlc3NlZCBmaWxlIHVuZGVyCisgICBjb250cm9sIG9mIHRoZSBmb3JtYXQgc3RyaW5nLCBhcyBpbiBmcHJpbnRmLiAgZ3pwcmludGYgcmV0dXJucyB0aGUgbnVtYmVyIG9mCisgICB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiwgb3IgMCBpbiBjYXNlIG9mIGVycm9yLiAgVGhlIG51bWJlciBvZgorICAgdW5jb21wcmVzc2VkIGJ5dGVzIHdyaXR0ZW4gaXMgbGltaXRlZCB0byA4MTkxLCBvciBvbmUgbGVzcyB0aGFuIHRoZSBidWZmZXIKKyAgIHNpemUgZ2l2ZW4gdG8gZ3pidWZmZXIoKS4gIFRoZSBjYWxsZXIgc2hvdWxkIGFzc3VyZSB0aGF0IHRoaXMgbGltaXQgaXMgbm90CisgICBleGNlZWRlZC4gIElmIGl0IGlzIGV4Y2VlZGVkLCB0aGVuIGd6cHJpbnRmKCkgd2lsbCByZXR1cm4gYW4gZXJyb3IgKDApIHdpdGgKKyAgIG5vdGhpbmcgd3JpdHRlbi4gIEluIHRoaXMgY2FzZSwgdGhlcmUgbWF5IGFsc28gYmUgYSBidWZmZXIgb3ZlcmZsb3cgd2l0aAorICAgdW5wcmVkaWN0YWJsZSBjb25zZXF1ZW5jZXMsIHdoaWNoIGlzIHBvc3NpYmxlIG9ubHkgaWYgemxpYiB3YXMgY29tcGlsZWQgd2l0aAorICAgdGhlIGluc2VjdXJlIGZ1bmN0aW9ucyBzcHJpbnRmKCkgb3IgdnNwcmludGYoKSBiZWNhdXNlIHRoZSBzZWN1cmUgc25wcmludGYoKQorICAgb3IgdnNucHJpbnRmKCkgZnVuY3Rpb25zIHdlcmUgbm90IGF2YWlsYWJsZS4gIFRoaXMgY2FuIGJlIGRldGVybWluZWQgdXNpbmcKKyAgIHpsaWJDb21waWxlRmxhZ3MoKS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3pwdXRzIE9GKChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqcykpOworLyoKKyAgICAgV3JpdGVzIHRoZSBnaXZlbiBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUsIGV4Y2x1ZGluZworICAgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyLgorCisgICAgIGd6cHV0cyByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLgorKi8KKworWkVYVEVSTiBjaGFyICogWkVYUE9SVCBnemdldHMgT0YoKGd6RmlsZSBmaWxlLCBjaGFyICpidWYsIGludCBsZW4pKTsKKy8qCisgICAgIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZSB1bnRpbCBsZW4tMSBjaGFyYWN0ZXJzIGFyZSByZWFkLCBvciBhCisgICBuZXdsaW5lIGNoYXJhY3RlciBpcyByZWFkIGFuZCB0cmFuc2ZlcnJlZCB0byBidWYsIG9yIGFuIGVuZC1vZi1maWxlCisgICBjb25kaXRpb24gaXMgZW5jb3VudGVyZWQuICBJZiBhbnkgY2hhcmFjdGVycyBhcmUgcmVhZCBvciBpZiBsZW4gPT0gMSwgdGhlCisgICBzdHJpbmcgaXMgdGVybWluYXRlZCB3aXRoIGEgbnVsbCBjaGFyYWN0ZXIuICBJZiBubyBjaGFyYWN0ZXJzIGFyZSByZWFkIGR1ZQorICAgdG8gYW4gZW5kLW9mLWZpbGUgb3IgbGVuIDwgMSwgdGhlbiB0aGUgYnVmZmVyIGlzIGxlZnQgdW50b3VjaGVkLgorCisgICAgIGd6Z2V0cyByZXR1cm5zIGJ1ZiB3aGljaCBpcyBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcsIG9yIGl0IHJldHVybnMgTlVMTAorICAgZm9yIGVuZC1vZi1maWxlIG9yIGluIGNhc2Ugb2YgZXJyb3IuICBJZiB0aGVyZSB3YXMgYW4gZXJyb3IsIHRoZSBjb250ZW50cyBhdAorICAgYnVmIGFyZSBpbmRldGVybWluYXRlLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBnenB1dGMgT0YoKGd6RmlsZSBmaWxlLCBpbnQgYykpOworLyoKKyAgICAgV3JpdGVzIGMsIGNvbnZlcnRlZCB0byBhbiB1bnNpZ25lZCBjaGFyLCBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuICBnenB1dGMKKyAgIHJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGd6Z2V0YyBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIFJlYWRzIG9uZSBieXRlIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4gIGd6Z2V0YyByZXR1cm5zIHRoaXMgYnl0ZSBvciAtMQorICAgaW4gY2FzZSBvZiBlbmQgb2YgZmlsZSBvciBlcnJvci4gIFRoaXMgaXMgaW1wbGVtZW50ZWQgYXMgYSBtYWNybyBmb3Igc3BlZWQuCisgICBBcyBzdWNoLCBpdCBkb2VzIG5vdCBkbyBhbGwgb2YgdGhlIGNoZWNraW5nIHRoZSBvdGhlciBmdW5jdGlvbnMgZG8uICBJLmUuCisgICBpdCBkb2VzIG5vdCBjaGVjayB0byBzZWUgaWYgZmlsZSBpcyBOVUxMLCBub3Igd2hldGhlciB0aGUgc3RydWN0dXJlIGZpbGUKKyAgIHBvaW50cyB0byBoYXMgYmVlbiBjbG9iYmVyZWQgb3Igbm90LgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBnenVuZ2V0YyBPRigoaW50IGMsIGd6RmlsZSBmaWxlKSk7CisvKgorICAgICBQdXNoIG9uZSBjaGFyYWN0ZXIgYmFjayBvbnRvIHRoZSBzdHJlYW0gdG8gYmUgcmVhZCBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyCisgICBvbiB0aGUgbmV4dCByZWFkLiAgQXQgbGVhc3Qgb25lIGNoYXJhY3RlciBvZiBwdXNoLWJhY2sgaXMgYWxsb3dlZC4KKyAgIGd6dW5nZXRjKCkgcmV0dXJucyB0aGUgY2hhcmFjdGVyIHB1c2hlZCwgb3IgLTEgb24gZmFpbHVyZS4gIGd6dW5nZXRjKCkgd2lsbAorICAgZmFpbCBpZiBjIGlzIC0xLCBhbmQgbWF5IGZhaWwgaWYgYSBjaGFyYWN0ZXIgaGFzIGJlZW4gcHVzaGVkIGJ1dCBub3QgcmVhZAorICAgeWV0LiAgSWYgZ3p1bmdldGMgaXMgdXNlZCBpbW1lZGlhdGVseSBhZnRlciBnem9wZW4gb3IgZ3pkb3BlbiwgYXQgbGVhc3QgdGhlCisgICBvdXRwdXQgYnVmZmVyIHNpemUgb2YgcHVzaGVkIGNoYXJhY3RlcnMgaXMgYWxsb3dlZC4gIChTZWUgZ3pidWZmZXIgYWJvdmUuKQorICAgVGhlIHB1c2hlZCBjaGFyYWN0ZXIgd2lsbCBiZSBkaXNjYXJkZWQgaWYgdGhlIHN0cmVhbSBpcyByZXBvc2l0aW9uZWQgd2l0aAorICAgZ3pzZWVrKCkgb3IgZ3pyZXdpbmQoKS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3pmbHVzaCBPRigoZ3pGaWxlIGZpbGUsIGludCBmbHVzaCkpOworLyoKKyAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLiAgVGhlIHBhcmFtZXRlciBmbHVzaAorICAgaXMgYXMgaW4gdGhlIGRlZmxhdGUoKSBmdW5jdGlvbi4gIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHpsaWIgZXJyb3IgbnVtYmVyCisgICAoc2VlIGZ1bmN0aW9uIGd6ZXJyb3IgYmVsb3cpLiAgZ3pmbHVzaCBpcyBvbmx5IHBlcm1pdHRlZCB3aGVuIHdyaXRpbmcuCisKKyAgICAgSWYgdGhlIGZsdXNoIHBhcmFtZXRlciBpcyBaX0ZJTklTSCwgdGhlIHJlbWFpbmluZyBkYXRhIGlzIHdyaXR0ZW4gYW5kIHRoZQorICAgZ3ppcCBzdHJlYW0gaXMgY29tcGxldGVkIGluIHRoZSBvdXRwdXQuICBJZiBnendyaXRlKCkgaXMgY2FsbGVkIGFnYWluLCBhIG5ldworICAgZ3ppcCBzdHJlYW0gd2lsbCBiZSBzdGFydGVkIGluIHRoZSBvdXRwdXQuICBnenJlYWQoKSBpcyBhYmxlIHRvIHJlYWQgc3VjaAorICAgY29uY2F0ZW50ZWQgZ3ppcCBzdHJlYW1zLgorCisgICAgIGd6Zmx1c2ggc2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gc3RyaWN0bHkgbmVjZXNzYXJ5IGJlY2F1c2UgaXQgd2lsbAorICAgZGVncmFkZSBjb21wcmVzc2lvbiBpZiBjYWxsZWQgdG9vIG9mdGVuLgorKi8KKworLyoKK1pFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6c2VlayBPRigoZ3pGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpfb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKSk7CisKKyAgICAgU2V0cyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IGd6cmVhZCBvciBnendyaXRlIG9uIHRoZSBnaXZlbgorICAgY29tcHJlc3NlZCBmaWxlLiAgVGhlIG9mZnNldCByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLiAgVGhlIHdoZW5jZSBwYXJhbWV0ZXIgaXMgZGVmaW5lZCBhcyBpbiBsc2VlaygyKTsKKyAgIHRoZSB2YWx1ZSBTRUVLX0VORCBpcyBub3Qgc3VwcG9ydGVkLgorCisgICAgIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3IgcmVhZGluZywgdGhpcyBmdW5jdGlvbiBpcyBlbXVsYXRlZCBidXQgY2FuIGJlCisgICBleHRyZW1lbHkgc2xvdy4gIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZywgb25seSBmb3J3YXJkIHNlZWtzIGFyZQorICAgc3VwcG9ydGVkOyBnenNlZWsgdGhlbiBjb21wcmVzc2VzIGEgc2VxdWVuY2Ugb2YgemVyb2VzIHVwIHRvIHRoZSBuZXcKKyAgIHN0YXJ0aW5nIHBvc2l0aW9uLgorCisgICAgIGd6c2VlayByZXR1cm5zIHRoZSByZXN1bHRpbmcgb2Zmc2V0IGxvY2F0aW9uIGFzIG1lYXN1cmVkIGluIGJ5dGVzIGZyb20KKyAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuY29tcHJlc3NlZCBzdHJlYW0sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IsIGluCisgICBwYXJ0aWN1bGFyIGlmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZyBhbmQgdGhlIG5ldyBzdGFydGluZyBwb3NpdGlvbgorICAgd291bGQgYmUgYmVmb3JlIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnenJld2luZCBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIFJld2luZHMgdGhlIGdpdmVuIGZpbGUuIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIG9ubHkgZm9yIHJlYWRpbmcuCisKKyAgICAgZ3pyZXdpbmQoZmlsZSkgaXMgZXF1aXZhbGVudCB0byAoaW50KWd6c2VlayhmaWxlLCAwTCwgU0VFS19TRVQpCisqLworCisvKgorWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgICAgZ3p0ZWxsIE9GKChnekZpbGUgZmlsZSkpOworCisgICAgIFJldHVybnMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUgZ2l2ZW4KKyAgIGNvbXByZXNzZWQgZmlsZS4gIFRoaXMgcG9zaXRpb24gcmVwcmVzZW50cyBhIG51bWJlciBvZiBieXRlcyBpbiB0aGUKKyAgIHVuY29tcHJlc3NlZCBkYXRhIHN0cmVhbSwgYW5kIGlzIHplcm8gd2hlbiBzdGFydGluZywgZXZlbiBpZiBhcHBlbmRpbmcgb3IKKyAgIHJlYWRpbmcgYSBnemlwIHN0cmVhbSBmcm9tIHRoZSBtaWRkbGUgb2YgYSBmaWxlIHVzaW5nIGd6ZG9wZW4oKS4KKworICAgICBnenRlbGwoZmlsZSkgaXMgZXF1aXZhbGVudCB0byBnenNlZWsoZmlsZSwgMEwsIFNFRUtfQ1VSKQorKi8KKworLyoKK1pFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6b2Zmc2V0IE9GKChnekZpbGUgZmlsZSkpOworCisgICAgIFJldHVybnMgdGhlIGN1cnJlbnQgb2Zmc2V0IGluIHRoZSBmaWxlIGJlaW5nIHJlYWQgb3Igd3JpdHRlbi4gIFRoaXMgb2Zmc2V0CisgICBpbmNsdWRlcyB0aGUgY291bnQgb2YgYnl0ZXMgdGhhdCBwcmVjZWRlIHRoZSBnemlwIHN0cmVhbSwgZm9yIGV4YW1wbGUgd2hlbgorICAgYXBwZW5kaW5nIG9yIHdoZW4gdXNpbmcgZ3pkb3BlbigpIGZvciByZWFkaW5nLiAgV2hlbiByZWFkaW5nLCB0aGUgb2Zmc2V0CisgICBkb2VzIG5vdCBpbmNsdWRlIGFzIHlldCB1bnVzZWQgYnVmZmVyZWQgaW5wdXQuICBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSB1c2VkCisgICBmb3IgYSBwcm9ncmVzcyBpbmRpY2F0b3IuICBPbiBlcnJvciwgZ3pvZmZzZXQoKSByZXR1cm5zIC0xLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBnemVvZiBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIFJldHVybnMgdHJ1ZSAoMSkgaWYgdGhlIGVuZC1vZi1maWxlIGluZGljYXRvciBoYXMgYmVlbiBzZXQgd2hpbGUgcmVhZGluZywKKyAgIGZhbHNlICgwKSBvdGhlcndpc2UuICBOb3RlIHRoYXQgdGhlIGVuZC1vZi1maWxlIGluZGljYXRvciBpcyBzZXQgb25seSBpZiB0aGUKKyAgIHJlYWQgdHJpZWQgdG8gZ28gcGFzdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCwgYnV0IGNhbWUgdXAgc2hvcnQuICBUaGVyZWZvcmUsCisgICBqdXN0IGxpa2UgZmVvZigpLCBnemVvZigpIG1heSByZXR1cm4gZmFsc2UgZXZlbiBpZiB0aGVyZSBpcyBubyBtb3JlIGRhdGEgdG8KKyAgIHJlYWQsIGluIHRoZSBldmVudCB0aGF0IHRoZSBsYXN0IHJlYWQgcmVxdWVzdCB3YXMgZm9yIHRoZSBleGFjdCBudW1iZXIgb2YKKyAgIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgd2lsbCBoYXBwZW4gaWYgdGhlIGlucHV0IGZpbGUgc2l6ZQorICAgaXMgYW4gZXhhY3QgbXVsdGlwbGUgb2YgdGhlIGJ1ZmZlciBzaXplLgorCisgICAgIElmIGd6ZW9mKCkgcmV0dXJucyB0cnVlLCB0aGVuIHRoZSByZWFkIGZ1bmN0aW9ucyB3aWxsIHJldHVybiBubyBtb3JlIGRhdGEsCisgICB1bmxlc3MgdGhlIGVuZC1vZi1maWxlIGluZGljYXRvciBpcyByZXNldCBieSBnemNsZWFyZXJyKCkgYW5kIHRoZSBpbnB1dCBmaWxlCisgICBoYXMgZ3Jvd24gc2luY2UgdGhlIHByZXZpb3VzIGVuZCBvZiBmaWxlIHdhcyBkZXRlY3RlZC4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3pkaXJlY3QgT0YoKGd6RmlsZSBmaWxlKSk7CisvKgorICAgICBSZXR1cm5zIHRydWUgKDEpIGlmIGZpbGUgaXMgYmVpbmcgY29waWVkIGRpcmVjdGx5IHdoaWxlIHJlYWRpbmcsIG9yIGZhbHNlCisgICAoMCkgaWYgZmlsZSBpcyBhIGd6aXAgc3RyZWFtIGJlaW5nIGRlY29tcHJlc3NlZC4KKworICAgICBJZiB0aGUgaW5wdXQgZmlsZSBpcyBlbXB0eSwgZ3pkaXJlY3QoKSB3aWxsIHJldHVybiB0cnVlLCBzaW5jZSB0aGUgaW5wdXQKKyAgIGRvZXMgbm90IGNvbnRhaW4gYSBnemlwIHN0cmVhbS4KKworICAgICBJZiBnemRpcmVjdCgpIGlzIHVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZ3pvcGVuKCkgb3IgZ3pkb3BlbigpIGl0IHdpbGwKKyAgIGNhdXNlIGJ1ZmZlcnMgdG8gYmUgYWxsb2NhdGVkIHRvIGFsbG93IHJlYWRpbmcgdGhlIGZpbGUgdG8gZGV0ZXJtaW5lIGlmIGl0CisgICBpcyBhIGd6aXAgZmlsZS4gIFRoZXJlZm9yZSBpZiBnemJ1ZmZlcigpIGlzIHVzZWQsIGl0IHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlCisgICBnemRpcmVjdCgpLgorCisgICAgIFdoZW4gd3JpdGluZywgZ3pkaXJlY3QoKSByZXR1cm5zIHRydWUgKDEpIGlmIHRyYW5zcGFyZW50IHdyaXRpbmcgd2FzCisgICByZXF1ZXN0ZWQgKCJ3VCIgZm9yIHRoZSBnem9wZW4oKSBtb2RlKSwgb3IgZmFsc2UgKDApIG90aGVyd2lzZS4gIChOb3RlOgorICAgZ3pkaXJlY3QoKSBpcyBub3QgbmVlZGVkIHdoZW4gd3JpdGluZy4gIFRyYW5zcGFyZW50IHdyaXRpbmcgbXVzdCBiZQorICAgZXhwbGljaXRseSByZXF1ZXN0ZWQsIHNvIHRoZSBhcHBsaWNhdGlvbiBhbHJlYWR5IGtub3dzIHRoZSBhbnN3ZXIuICBXaGVuCisgICBsaW5raW5nIHN0YXRpY2FsbHksIHVzaW5nIGd6ZGlyZWN0KCkgd2lsbCBpbmNsdWRlIGFsbCBvZiB0aGUgemxpYiBjb2RlIGZvcgorICAgZ3ppcCBmaWxlIHJlYWRpbmcgYW5kIGRlY29tcHJlc3Npb24sIHdoaWNoIG1heSBub3QgYmUgZGVzaXJlZC4pCisqLworCitaRVhURVJOIGludCBaRVhQT1JUICAgIGd6Y2xvc2UgT0YoKGd6RmlsZSBmaWxlKSk7CisvKgorICAgICBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpZiBuZWNlc3NhcnksIGNsb3NlcyB0aGUgY29tcHJlc3NlZCBmaWxlIGFuZAorICAgZGVhbGxvY2F0ZXMgdGhlIChkZSljb21wcmVzc2lvbiBzdGF0ZS4gIE5vdGUgdGhhdCBvbmNlIGZpbGUgaXMgY2xvc2VkLCB5b3UKKyAgIGNhbm5vdCBjYWxsIGd6ZXJyb3Igd2l0aCBmaWxlLCBzaW5jZSBpdHMgc3RydWN0dXJlcyBoYXZlIGJlZW4gZGVhbGxvY2F0ZWQuCisgICBnemNsb3NlIG11c3Qgbm90IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBmaWxlLCBqdXN0IGFzIGZyZWUKKyAgIG11c3Qgbm90IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBhbGxvY2F0aW9uLgorCisgICAgIGd6Y2xvc2Ugd2lsbCByZXR1cm4gWl9TVFJFQU1fRVJST1IgaWYgZmlsZSBpcyBub3QgdmFsaWQsIFpfRVJSTk8gb24gYQorICAgZmlsZSBvcGVyYXRpb24gZXJyb3IsIFpfTUVNX0VSUk9SIGlmIG91dCBvZiBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIHRoZQorICAgbGFzdCByZWFkIGVuZGVkIGluIHRoZSBtaWRkbGUgb2YgYSBnemlwIHN0cmVhbSwgb3IgWl9PSyBvbiBzdWNjZXNzLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBnemNsb3NlX3IgT0YoKGd6RmlsZSBmaWxlKSk7CitaRVhURVJOIGludCBaRVhQT1JUIGd6Y2xvc2VfdyBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIFNhbWUgYXMgZ3pjbG9zZSgpLCBidXQgZ3pjbG9zZV9yKCkgaXMgb25seSBmb3IgdXNlIHdoZW4gcmVhZGluZywgYW5kCisgICBnemNsb3NlX3coKSBpcyBvbmx5IGZvciB1c2Ugd2hlbiB3cml0aW5nIG9yIGFwcGVuZGluZy4gIFRoZSBhZHZhbnRhZ2UgdG8KKyAgIHVzaW5nIHRoZXNlIGluc3RlYWQgb2YgZ3pjbG9zZSgpIGlzIHRoYXQgdGhleSBhdm9pZCBsaW5raW5nIGluIHpsaWIKKyAgIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gY29kZSB0aGF0IGlzIG5vdCB1c2VkIHdoZW4gb25seSByZWFkaW5nIG9yIG9ubHkKKyAgIHdyaXRpbmcgcmVzcGVjdGl2ZWx5LiAgSWYgZ3pjbG9zZSgpIGlzIHVzZWQsIHRoZW4gYm90aCBjb21wcmVzc2lvbiBhbmQKKyAgIGRlY29tcHJlc3Npb24gY29kZSB3aWxsIGJlIGluY2x1ZGVkIHRoZSBhcHBsaWNhdGlvbiB3aGVuIGxpbmtpbmcgdG8gYSBzdGF0aWMKKyAgIHpsaWIgbGlicmFyeS4KKyovCisKK1pFWFRFUk4gY29uc3QgY2hhciAqIFpFWFBPUlQgZ3plcnJvciBPRigoZ3pGaWxlIGZpbGUsIGludCAqZXJybnVtKSk7CisvKgorICAgICBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgbGFzdCBlcnJvciB3aGljaCBvY2N1cnJlZCBvbiB0aGUgZ2l2ZW4KKyAgIGNvbXByZXNzZWQgZmlsZS4gIGVycm51bSBpcyBzZXQgdG8gemxpYiBlcnJvciBudW1iZXIuICBJZiBhbiBlcnJvciBvY2N1cnJlZAorICAgaW4gdGhlIGZpbGUgc3lzdGVtIGFuZCBub3QgaW4gdGhlIGNvbXByZXNzaW9uIGxpYnJhcnksIGVycm51bSBpcyBzZXQgdG8KKyAgIFpfRVJSTk8gYW5kIHRoZSBhcHBsaWNhdGlvbiBtYXkgY29uc3VsdCBlcnJubyB0byBnZXQgdGhlIGV4YWN0IGVycm9yIGNvZGUuCisKKyAgICAgVGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IG1vZGlmeSB0aGUgcmV0dXJuZWQgc3RyaW5nLiAgRnV0dXJlIGNhbGxzIHRvCisgICB0aGlzIGZ1bmN0aW9uIG1heSBpbnZhbGlkYXRlIHRoZSBwcmV2aW91c2x5IHJldHVybmVkIHN0cmluZy4gIElmIGZpbGUgaXMKKyAgIGNsb3NlZCwgdGhlbiB0aGUgc3RyaW5nIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgZ3plcnJvciB3aWxsIG5vIGxvbmdlciBiZQorICAgYXZhaWxhYmxlLgorCisgICAgIGd6ZXJyb3IoKSBzaG91bGQgYmUgdXNlZCB0byBkaXN0aW5ndWlzaCBlcnJvcnMgZnJvbSBlbmQtb2YtZmlsZSBmb3IgdGhvc2UKKyAgIGZ1bmN0aW9ucyBhYm92ZSB0aGF0IGRvIG5vdCBkaXN0aW5ndWlzaCB0aG9zZSBjYXNlcyBpbiB0aGVpciByZXR1cm4gdmFsdWVzLgorKi8KKworWkVYVEVSTiB2b2lkIFpFWFBPUlQgZ3pjbGVhcmVyciBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIENsZWFycyB0aGUgZXJyb3IgYW5kIGVuZC1vZi1maWxlIGZsYWdzIGZvciBmaWxlLiAgVGhpcyBpcyBhbmFsb2dvdXMgdG8gdGhlCisgICBjbGVhcmVycigpIGZ1bmN0aW9uIGluIHN0ZGlvLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNvbnRpbnVpbmcgdG8gcmVhZCBhIGd6aXAKKyAgIGZpbGUgdGhhdCBpcyBiZWluZyB3cml0dGVuIGNvbmN1cnJlbnRseS4KKyovCisKKyNlbmRpZiAvKiAhWl9TT0xPICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrc3VtIGZ1bmN0aW9ucyAqLworCisvKgorICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCByZWxhdGVkIHRvIGNvbXByZXNzaW9uIGJ1dCBhcmUgZXhwb3J0ZWQKKyAgIGFueXdheSBiZWNhdXNlIHRoZXkgbWlnaHQgYmUgdXNlZnVsIGluIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUgY29tcHJlc3Npb24KKyAgIGxpYnJhcnkuCisqLworCitaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMiBPRigodUxvbmcgYWRsZXIsIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKSk7CisvKgorICAgICBVcGRhdGUgYSBydW5uaW5nIEFkbGVyLTMyIGNoZWNrc3VtIHdpdGggdGhlIGJ5dGVzIGJ1ZlswLi5sZW4tMV0gYW5kCisgICByZXR1cm4gdGhlIHVwZGF0ZWQgY2hlY2tzdW0uICBJZiBidWYgaXMgWl9OVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlCisgICByZXF1aXJlZCBpbml0aWFsIHZhbHVlIGZvciB0aGUgY2hlY2tzdW0uCisKKyAgICAgQW4gQWRsZXItMzIgY2hlY2tzdW0gaXMgYWxtb3N0IGFzIHJlbGlhYmxlIGFzIGEgQ1JDMzIgYnV0IGNhbiBiZSBjb21wdXRlZAorICAgbXVjaCBmYXN0ZXIuCisKKyAgIFVzYWdlIGV4YW1wbGU6CisKKyAgICAgdUxvbmcgYWRsZXIgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOworCisgICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7CisgICAgICAgYWRsZXIgPSBhZGxlcjMyKGFkbGVyLCBidWZmZXIsIGxlbmd0aCk7CisgICAgIH0KKyAgICAgaWYgKGFkbGVyICE9IG9yaWdpbmFsX2FkbGVyKSBlcnJvcigpOworKi8KKworLyoKK1pFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmUgT0YoKHVMb25nIGFkbGVyMSwgdUxvbmcgYWRsZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgel9vZmZfdCBsZW4yKSk7CisKKyAgICAgQ29tYmluZSB0d28gQWRsZXItMzIgY2hlY2tzdW1zIGludG8gb25lLiAgRm9yIHR3byBzZXF1ZW5jZXMgb2YgYnl0ZXMsIHNlcTEKKyAgIGFuZCBzZXEyIHdpdGggbGVuZ3RocyBsZW4xIGFuZCBsZW4yLCBBZGxlci0zMiBjaGVja3N1bXMgd2VyZSBjYWxjdWxhdGVkIGZvcgorICAgZWFjaCwgYWRsZXIxIGFuZCBhZGxlcjIuICBhZGxlcjMyX2NvbWJpbmUoKSByZXR1cm5zIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZgorICAgc2VxMSBhbmQgc2VxMiBjb25jYXRlbmF0ZWQsIHJlcXVpcmluZyBvbmx5IGFkbGVyMSwgYWRsZXIyLCBhbmQgbGVuMi4gIE5vdGUKKyAgIHRoYXQgdGhlIHpfb2ZmX3QgdHlwZSAobGlrZSBvZmZfdCkgaXMgYSBzaWduZWQgaW50ZWdlci4gIElmIGxlbjIgaXMKKyAgIG5lZ2F0aXZlLCB0aGUgcmVzdWx0IGhhcyBubyBtZWFuaW5nIG9yIHV0aWxpdHkuCisqLworCitaRVhURVJOIHVMb25nIFpFWFBPUlQgY3JjMzIgICBPRigodUxvbmcgY3JjLCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbikpOworLyoKKyAgICAgVXBkYXRlIGEgcnVubmluZyBDUkMtMzIgd2l0aCB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXSBhbmQgcmV0dXJuIHRoZQorICAgdXBkYXRlZCBDUkMtMzIuICBJZiBidWYgaXMgWl9OVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVpcmVkCisgICBpbml0aWFsIHZhbHVlIGZvciB0aGUgY3JjLiAgUHJlLSBhbmQgcG9zdC1jb25kaXRpb25pbmcgKG9uZSdzIGNvbXBsZW1lbnQpIGlzCisgICBwZXJmb3JtZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24gc28gaXQgc2hvdWxkbid0IGJlIGRvbmUgYnkgdGhlIGFwcGxpY2F0aW9uLgorCisgICBVc2FnZSBleGFtcGxlOgorCisgICAgIHVMb25nIGNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOworCisgICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7CisgICAgICAgY3JjID0gY3JjMzIoY3JjLCBidWZmZXIsIGxlbmd0aCk7CisgICAgIH0KKyAgICAgaWYgKGNyYyAhPSBvcmlnaW5hbF9jcmMpIGVycm9yKCk7CisqLworCisvKgorWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmUgT0YoKHVMb25nIGNyYzEsIHVMb25nIGNyYzIsIHpfb2ZmX3QgbGVuMikpOworCisgICAgIENvbWJpbmUgdHdvIENSQy0zMiBjaGVjayB2YWx1ZXMgaW50byBvbmUuICBGb3IgdHdvIHNlcXVlbmNlcyBvZiBieXRlcywKKyAgIHNlcTEgYW5kIHNlcTIgd2l0aCBsZW5ndGhzIGxlbjEgYW5kIGxlbjIsIENSQy0zMiBjaGVjayB2YWx1ZXMgd2VyZQorICAgY2FsY3VsYXRlZCBmb3IgZWFjaCwgY3JjMSBhbmQgY3JjMi4gIGNyYzMyX2NvbWJpbmUoKSByZXR1cm5zIHRoZSBDUkMtMzIKKyAgIGNoZWNrIHZhbHVlIG9mIHNlcTEgYW5kIHNlcTIgY29uY2F0ZW5hdGVkLCByZXF1aXJpbmcgb25seSBjcmMxLCBjcmMyLCBhbmQKKyAgIGxlbjIuCisqLworCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZhcmlvdXMgaGFja3MsIGRvbid0IGxvb2sgOikgKi8KKworLyogZGVmbGF0ZUluaXQgYW5kIGluZmxhdGVJbml0IGFyZSBtYWNyb3MgdG8gYWxsb3cgY2hlY2tpbmcgdGhlIHpsaWIgdmVyc2lvbgorICogYW5kIHRoZSBjb21waWxlcidzIHZpZXcgb2Ygel9zdHJlYW06CisgKi8KK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUluaXRfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSkpOworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdF8gT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSkpOworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdDJfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50ICBsZXZlbCwgaW50ICBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aW5kb3dCaXRzLCBpbnQgbWVtTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJhdGVneSwgY29uc3QgY2hhciAqdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbV9zaXplKSk7CitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0Ml8gT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgIHdpbmRvd0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSkpOworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0luaXRfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IHdpbmRvd0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1fc2l6ZSkpOworI2RlZmluZSBkZWZsYXRlSW5pdChzdHJtLCBsZXZlbCkgXAorICAgICAgICBkZWZsYXRlSW5pdF8oKHN0cm0pLCAobGV2ZWwpLCBaTElCX1ZFUlNJT04sIChpbnQpc2l6ZW9mKHpfc3RyZWFtKSkKKyNkZWZpbmUgaW5mbGF0ZUluaXQoc3RybSkgXAorICAgICAgICBpbmZsYXRlSW5pdF8oKHN0cm0pLCBaTElCX1ZFUlNJT04sIChpbnQpc2l6ZW9mKHpfc3RyZWFtKSkKKyNkZWZpbmUgZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSkgXAorICAgICAgICBkZWZsYXRlSW5pdDJfKChzdHJtKSwobGV2ZWwpLChtZXRob2QpLCh3aW5kb3dCaXRzKSwobWVtTGV2ZWwpLFwKKyAgICAgICAgICAgICAgICAgICAgICAoc3RyYXRlZ3kpLCBaTElCX1ZFUlNJT04sIChpbnQpc2l6ZW9mKHpfc3RyZWFtKSkKKyNkZWZpbmUgaW5mbGF0ZUluaXQyKHN0cm0sIHdpbmRvd0JpdHMpIFwKKyAgICAgICAgaW5mbGF0ZUluaXQyXygoc3RybSksICh3aW5kb3dCaXRzKSwgWkxJQl9WRVJTSU9OLCBcCisgICAgICAgICAgICAgICAgICAgICAgKGludClzaXplb2Yoel9zdHJlYW0pKQorI2RlZmluZSBpbmZsYXRlQmFja0luaXQoc3RybSwgd2luZG93Qml0cywgd2luZG93KSBcCisgICAgICAgIGluZmxhdGVCYWNrSW5pdF8oKHN0cm0pLCAod2luZG93Qml0cyksICh3aW5kb3cpLCBcCisgICAgICAgICAgICAgICAgICAgICAgWkxJQl9WRVJTSU9OLCAoaW50KXNpemVvZih6X3N0cmVhbSkpCisKKyNpZm5kZWYgWl9TT0xPCisKKy8qIGd6Z2V0YygpIG1hY3JvIGFuZCBpdHMgc3VwcG9ydGluZyBmdW5jdGlvbiBhbmQgZXhwb3NlZCBkYXRhIHN0cnVjdHVyZS4gIE5vdGUKKyAqIHRoYXQgdGhlIHJlYWwgaW50ZXJuYWwgc3RhdGUgaXMgbXVjaCBsYXJnZXIgdGhhbiB0aGUgZXhwb3NlZCBzdHJ1Y3R1cmUuCisgKiBUaGlzIGFiYnJldmlhdGVkIHN0cnVjdHVyZSBleHBvc2VzIGp1c3QgZW5vdWdoIGZvciB0aGUgZ3pnZXRjKCkgbWFjcm8uICBUaGUKKyAqIHVzZXIgc2hvdWxkIG5vdCBtZXNzIHdpdGggdGhlc2UgZXhwb3NlZCBlbGVtZW50cywgc2luY2UgdGhlaXIgbmFtZXMgb3IKKyAqIGJlaGF2aW9yIGNvdWxkIGNoYW5nZSBpbiB0aGUgZnV0dXJlLCBwZXJoYXBzIGV2ZW4gY2FwcmljaW91c2x5LiAgVGhleSBjYW4KKyAqIG9ubHkgYmUgdXNlZCBieSB0aGUgZ3pnZXRjKCkgbWFjcm8uICBZb3UgaGF2ZSBiZWVuIHdhcm5lZC4KKyAqLworc3RydWN0IGd6RmlsZV9zIHsKKyAgICB1bnNpZ25lZCBoYXZlOworICAgIHVuc2lnbmVkIGNoYXIgKm5leHQ7CisgICAgel9vZmY2NF90IHBvczsKK307CitaRVhURVJOIGludCBaRVhQT1JUIGd6Z2V0Y18gT0YoKGd6RmlsZSBmaWxlKSk7ICAvKiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisjaWZkZWYgWl9QUkVGSVhfU0VUCisjICB1bmRlZiB6X2d6Z2V0YworIyAgZGVmaW5lIHpfZ3pnZXRjKGcpIFwKKyAgICAgICAgICAoKGcpLT5oYXZlID8gKChnKS0+aGF2ZS0tLCAoZyktPnBvcysrLCAqKChnKS0+bmV4dCkrKykgOiBnemdldGMoZykpCisjZWxzZQorIyAgZGVmaW5lIGd6Z2V0YyhnKSBcCisgICAgICAgICAgKChnKS0+aGF2ZSA/ICgoZyktPmhhdmUtLSwgKGcpLT5wb3MrKywgKigoZyktPm5leHQpKyspIDogZ3pnZXRjKGcpKQorI2VuZGlmCisKKy8qIHByb3ZpZGUgNjQtYml0IG9mZnNldCBmdW5jdGlvbnMgaWYgX0xBUkdFRklMRTY0X1NPVVJDRSBkZWZpbmVkLCBhbmQvb3IKKyAqIGNoYW5nZSB0aGUgcmVndWxhciBmdW5jdGlvbnMgdG8gNjQgYml0cyBpZiBfRklMRV9PRkZTRVRfQklUUyBpcyA2NCAoaWYKKyAqIGJvdGggYXJlIHRydWUsIHRoZSBhcHBsaWNhdGlvbiBnZXRzIHRoZSAqNjQgZnVuY3Rpb25zLCBhbmQgdGhlIHJlZ3VsYXIKKyAqIGZ1bmN0aW9ucyBhcmUgY2hhbmdlZCB0byA2NCBiaXRzKSAtLSBpbiBjYXNlIHRoZXNlIGFyZSBzZXQgb24gc3lzdGVtcworICogd2l0aG91dCBsYXJnZSBmaWxlIHN1cHBvcnQsIF9MRlM2NF9MQVJHRUZJTEUgbXVzdCBhbHNvIGJlIHRydWUKKyAqLworI2lmZGVmIFpfTEFSR0U2NAorICAgWkVYVEVSTiBnekZpbGUgWkVYUE9SVCBnem9wZW42NCBPRigoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKKyAgIFpFWFRFUk4gel9vZmY2NF90IFpFWFBPUlQgZ3pzZWVrNjQgT0YoKGd6RmlsZSwgel9vZmY2NF90LCBpbnQpKTsKKyAgIFpFWFRFUk4gel9vZmY2NF90IFpFWFBPUlQgZ3p0ZWxsNjQgT0YoKGd6RmlsZSkpOworICAgWkVYVEVSTiB6X29mZjY0X3QgWkVYUE9SVCBnem9mZnNldDY0IE9GKChnekZpbGUpKTsKKyAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmU2NCBPRigodUxvbmcsIHVMb25nLCB6X29mZjY0X3QpKTsKKyAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lNjQgT0YoKHVMb25nLCB1TG9uZywgel9vZmY2NF90KSk7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFpMSUJfSU5URVJOQUwpICYmIGRlZmluZWQoWl9XQU5UNjQpCisjICBpZmRlZiBaX1BSRUZJWF9TRVQKKyMgICAgZGVmaW5lIHpfZ3pvcGVuIHpfZ3pvcGVuNjQKKyMgICAgZGVmaW5lIHpfZ3pzZWVrIHpfZ3pzZWVrNjQKKyMgICAgZGVmaW5lIHpfZ3p0ZWxsIHpfZ3p0ZWxsNjQKKyMgICAgZGVmaW5lIHpfZ3pvZmZzZXQgel9nem9mZnNldDY0CisjICAgIGRlZmluZSB6X2FkbGVyMzJfY29tYmluZSB6X2FkbGVyMzJfY29tYmluZTY0CisjICAgIGRlZmluZSB6X2NyYzMyX2NvbWJpbmUgel9jcmMzMl9jb21iaW5lNjQKKyMgIGVsc2UKKyMgICAgZGVmaW5lIGd6b3BlbiBnem9wZW42NAorIyAgICBkZWZpbmUgZ3pzZWVrIGd6c2VlazY0CisjICAgIGRlZmluZSBnenRlbGwgZ3p0ZWxsNjQKKyMgICAgZGVmaW5lIGd6b2Zmc2V0IGd6b2Zmc2V0NjQKKyMgICAgZGVmaW5lIGFkbGVyMzJfY29tYmluZSBhZGxlcjMyX2NvbWJpbmU2NAorIyAgICBkZWZpbmUgY3JjMzJfY29tYmluZSBjcmMzMl9jb21iaW5lNjQKKyMgIGVuZGlmCisjICBpZm5kZWYgWl9MQVJHRTY0CisgICAgIFpFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuNjQgT0YoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7CisgICAgIFpFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6c2VlazY0IE9GKChnekZpbGUsIHpfb2ZmX3QsIGludCkpOworICAgICBaRVhURVJOIHpfb2ZmX3QgWkVYUE9SVCBnenRlbGw2NCBPRigoZ3pGaWxlKSk7CisgICAgIFpFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6b2Zmc2V0NjQgT0YoKGd6RmlsZSkpOworICAgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lNjQgT0YoKHVMb25nLCB1TG9uZywgel9vZmZfdCkpOworICAgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgY3JjMzJfY29tYmluZTY0IE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmX3QpKTsKKyMgIGVuZGlmCisjZWxzZQorICAgWkVYVEVSTiBnekZpbGUgWkVYUE9SVCBnem9wZW4gT0YoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7CisgICBaRVhURVJOIHpfb2ZmX3QgWkVYUE9SVCBnenNlZWsgT0YoKGd6RmlsZSwgel9vZmZfdCwgaW50KSk7CisgICBaRVhURVJOIHpfb2ZmX3QgWkVYUE9SVCBnenRlbGwgT0YoKGd6RmlsZSkpOworICAgWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgZ3pvZmZzZXQgT0YoKGd6RmlsZSkpOworICAgWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGFkbGVyMzJfY29tYmluZSBPRigodUxvbmcsIHVMb25nLCB6X29mZl90KSk7CisgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgY3JjMzJfY29tYmluZSBPRigodUxvbmcsIHVMb25nLCB6X29mZl90KSk7CisjZW5kaWYKKworI2Vsc2UgLyogWl9TT0xPICovCisKKyAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmUgT0YoKHVMb25nLCB1TG9uZywgel9vZmZfdCkpOworICAgWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmUgT0YoKHVMb25nLCB1TG9uZywgel9vZmZfdCkpOworCisjZW5kaWYgLyogIVpfU09MTyAqLworCisvKiBoYWNrIGZvciBidWdneSBjb21waWxlcnMgKi8KKyNpZiAhZGVmaW5lZChaVVRJTF9IKSAmJiAhZGVmaW5lZChOT19EVU1NWV9ERUNMKQorICAgIHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSB7aW50IGR1bW15O307CisjZW5kaWYKKworLyogdW5kb2N1bWVudGVkIGZ1bmN0aW9ucyAqLworWkVYVEVSTiBjb25zdCBjaGFyICAgKiBaRVhQT1JUIHpFcnJvciAgICAgICAgICAgT0YoKGludCkpOworWkVYVEVSTiBpbnQgICAgICAgICAgICBaRVhQT1JUIGluZmxhdGVTeW5jUG9pbnQgT0YoKHpfc3RyZWFtcCkpOworWkVYVEVSTiBjb25zdCB6X2NyY190IEZBUiAqIFpFWFBPUlQgZ2V0X2NyY190YWJsZSAgICBPRigodm9pZCkpOworWkVYVEVSTiBpbnQgICAgICAgICAgICBaRVhQT1JUIGluZmxhdGVVbmRlcm1pbmUgT0YoKHpfc3RyZWFtcCwgaW50KSk7CitaRVhURVJOIGludCAgICAgICAgICAgIFpFWFBPUlQgaW5mbGF0ZVJlc2V0S2VlcCBPRigoel9zdHJlYW1wKSk7CitaRVhURVJOIGludCAgICAgICAgICAgIFpFWFBPUlQgZGVmbGF0ZVJlc2V0S2VlcCBPRigoel9zdHJlYW1wKSk7CisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKFpfU09MTykKK1pFWFRFUk4gZ3pGaWxlICAgICAgICAgWkVYUE9SVCBnem9wZW5fdyBPRigoY29uc3Qgd2NoYXJfdCAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbW9kZSkpOworI2VuZGlmCisjaWYgZGVmaW5lZChTVERDKSB8fCBkZWZpbmVkKFpfSEFWRV9TVERBUkdfSCkKKyMgIGlmbmRlZiBaX1NPTE8KK1pFWFRFUk4gaW50ICAgICAgICAgICAgWkVYUE9SVFZBIGd6dnByaW50ZiBaX0FSRygoZ3pGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCB2YSkpOworIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogWkxJQl9IICovCmRpZmYgLS1naXQgYS96bGliL3NyYy96bGliLm1hcCBiL3psaWIvc3JjL3psaWIubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YzY2NDcKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy96bGliLm1hcApAQCAtMCwwICsxLDgzIEBACitaTElCXzEuMi4wIHsKKyAgZ2xvYmFsOgorICAgIGNvbXByZXNzQm91bmQ7CisgICAgZGVmbGF0ZUJvdW5kOworICAgIGluZmxhdGVCYWNrOworICAgIGluZmxhdGVCYWNrRW5kOworICAgIGluZmxhdGVCYWNrSW5pdF87CisgICAgaW5mbGF0ZUNvcHk7CisgIGxvY2FsOgorICAgIGRlZmxhdGVfY29weXJpZ2h0OworICAgIGluZmxhdGVfY29weXJpZ2h0OworICAgIGluZmxhdGVfZmFzdDsKKyAgICBpbmZsYXRlX3RhYmxlOworICAgIHpjYWxsb2M7CisgICAgemNmcmVlOworICAgIHpfZXJybXNnOworICAgIGd6X2Vycm9yOworICAgIGd6X2ludG1heDsKKyAgICBfKjsKK307CisKK1pMSUJfMS4yLjAuMiB7CisgICAgZ3pjbGVhcmVycjsKKyAgICBnenVuZ2V0YzsKKyAgICB6bGliQ29tcGlsZUZsYWdzOworfSBaTElCXzEuMi4wOworCitaTElCXzEuMi4wLjggeworICAgIGRlZmxhdGVQcmltZTsKK30gWkxJQl8xLjIuMC4yOworCitaTElCXzEuMi4yIHsKKyAgICBhZGxlcjMyX2NvbWJpbmU7CisgICAgY3JjMzJfY29tYmluZTsKKyAgICBkZWZsYXRlU2V0SGVhZGVyOworICAgIGluZmxhdGVHZXRIZWFkZXI7Cit9IFpMSUJfMS4yLjAuODsKKworWkxJQl8xLjIuMi4zIHsKKyAgICBkZWZsYXRlVHVuZTsKKyAgICBnemRpcmVjdDsKK30gWkxJQl8xLjIuMjsKKworWkxJQl8xLjIuMi40IHsKKyAgICBpbmZsYXRlUHJpbWU7Cit9IFpMSUJfMS4yLjIuMzsKKworWkxJQl8xLjIuMy4zIHsKKyAgICBhZGxlcjMyX2NvbWJpbmU2NDsKKyAgICBjcmMzMl9jb21iaW5lNjQ7CisgICAgZ3pvcGVuNjQ7CisgICAgZ3pzZWVrNjQ7CisgICAgZ3p0ZWxsNjQ7CisgICAgaW5mbGF0ZVVuZGVybWluZTsKK30gWkxJQl8xLjIuMi40OworCitaTElCXzEuMi4zLjQgeworICAgIGluZmxhdGVSZXNldDI7CisgICAgaW5mbGF0ZU1hcms7Cit9IFpMSUJfMS4yLjMuMzsKKworWkxJQl8xLjIuMy41IHsKKyAgICBnemJ1ZmZlcjsKKyAgICBnem9mZnNldDsKKyAgICBnem9mZnNldDY0OworICAgIGd6Y2xvc2VfcjsKKyAgICBnemNsb3NlX3c7Cit9IFpMSUJfMS4yLjMuNDsKKworWkxJQl8xLjIuNS4xIHsKKyAgICBkZWZsYXRlUGVuZGluZzsKK30gWkxJQl8xLjIuMy41OworCitaTElCXzEuMi41LjIgeworICAgIGRlZmxhdGVSZXNldEtlZXA7CisgICAgZ3pnZXRjXzsKKyAgICBpbmZsYXRlUmVzZXRLZWVwOworfSBaTElCXzEuMi41LjE7CisKK1pMSUJfMS4yLjcuMSB7CisgICAgaW5mbGF0ZUdldERpY3Rpb25hcnk7CisgICAgZ3p2cHJpbnRmOworfSBaTElCXzEuMi41LjI7CmRpZmYgLS1naXQgYS96bGliL3NyYy96bGliLnBjIGIvemxpYi9zcmMvemxpYi5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTU0ZmNmCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvemxpYi5wYwpAQCAtMCwwICsxLDEzIEBACitwcmVmaXg9L3Vzci9sb2NhbAorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9JHtleGVjX3ByZWZpeH0vbGliCitzaGFyZWRsaWJkaXI9JHtsaWJkaXJ9CitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCisKK05hbWU6IHpsaWIKK0Rlc2NyaXB0aW9uOiB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKK1ZlcnNpb246IDEuMi44CisKK1JlcXVpcmVzOgorTGliczogLUwke2xpYmRpcn0gLUwke3NoYXJlZGxpYmRpcn0gLWx6CitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvemxpYi9zcmMvemxpYi5wYy5jbWFrZWluIGIvemxpYi9zcmMvemxpYi5wYy5jbWFrZWluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZTY0MjkKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy96bGliLnBjLmNtYWtlaW4KQEAgLTAsMCArMSwxMyBAQAorcHJlZml4PUBDTUFLRV9JTlNUQUxMX1BSRUZJWEAKK2V4ZWNfcHJlZml4PUBDTUFLRV9JTlNUQUxMX1BSRUZJWEAKK2xpYmRpcj1ASU5TVEFMTF9MSUJfRElSQAorc2hhcmVkbGliZGlyPUBJTlNUQUxMX0xJQl9ESVJACitpbmNsdWRlZGlyPUBJTlNUQUxMX0lOQ19ESVJACisKK05hbWU6IHpsaWIKK0Rlc2NyaXB0aW9uOiB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKK1ZlcnNpb246IEBWRVJTSU9OQAorCitSZXF1aXJlczoKK0xpYnM6IC1MJHtsaWJkaXJ9IC1MJHtzaGFyZWRsaWJkaXJ9IC1segorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL3psaWIvc3JjL3psaWIucGMuaW4gYi96bGliL3NyYy96bGliLnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNWFjZjkKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy96bGliLnBjLmluCkBAIC0wLDAgKzEsMTMgQEAKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitzaGFyZWRsaWJkaXI9QHNoYXJlZGxpYmRpckAKK2luY2x1ZGVkaXI9QGluY2x1ZGVkaXJACisKK05hbWU6IHpsaWIKK0Rlc2NyaXB0aW9uOiB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKK1ZlcnNpb246IEBWRVJTSU9OQAorCitSZXF1aXJlczoKK0xpYnM6IC1MJHtsaWJkaXJ9IC1MJHtzaGFyZWRsaWJkaXJ9IC1segorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL3psaWIvc3JjL3psaWIyYW5zaSBiL3psaWIvc3JjL3psaWIyYW5zaQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNWUzZTE2Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvemxpYjJhbnNpCkBAIC0wLDAgKzEsMTUyIEBACisjIS91c3IvYmluL3BlcmwKKworIyBUcmFuc2Zvcm0gSyZSIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgaW50byBBTlNJIGVxdWl2YWxlbnQuCisjCisjIEF1dGhvcjogUGF1bCBNYXJxdWVzcworIyBWZXJzaW9uOiAxLjAKKyMgRGF0ZTogMyBPY3RvYmVyIDIwMDYKKworIyBUT0RPCisjCisjIEFzdW1lcyBubyBmdW5jdGlvbiBwb2ludGVyIHBhcmFtZXRlcnMuIHVubGVzcyB0aGV5IGFyZSB0eXBlZGVmZWQuCisjIEFzc3VtZXMgbm8gbGl0ZXJhbCBzdHJpbmdzIHRoYXQgbG9vayBsaWtlIGZ1bmN0aW9uIGRlZmluaXRpb25zCisjIEFzc3VtZXMgZnVuY3Rpb25zIHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK2xvY2FsICQvOworJF8gPSA8PjsKKworbXkgJHNwID0gcXJ7IFxzKiAoPzogL1wqIC4qPyBcKi8gKT8gXHMqIH14OyAjIGFzc3VtZSBubyBuZXN0ZWQgY29tbWVudHMKKworbXkgJGQxICAgID0gcXJ7ICRzcCAoPzogW1x3XCpcc10rICRzcCkqICRzcCBcdysgJHNwIFtcW1xdXHNdKiAkc3AgfXggOworbXkgJGRlY2wgID0gcXJ7ICRzcCAoPzogXHcrICRzcCApKyAkZDEgfXhvIDsKK215ICRkTGlzdCA9IHFyeyAkc3AgJGRlY2wgKD86ICRzcCAsICRkMSApKiAkc3AgOyAkc3AgfXhvIDsKKworCit3aGlsZSAocy9eCisgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgIyBTdGFydCAkMQorICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICMgICBTdGFydCAkMgorICAgICAgICAgICAgICAgICAgICAuKj8gICAgICAgICMgICAgIE1pbmltYWwgZWF0IGNvbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgKCBeIFx3IFtcd1xzXCpdKyApICAgICMgICAgICQzIC0tIGZ1bmN0aW9uIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgXHMqICAgICAgICAjICAgICBvcHRpb25hbCB3aGl0ZXNwYWNlCisgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgIyAkMiAtIE1hdGNoZWQgdXAgdG8gYmVmb3JlIHBhcmFtZXRlciBsaXN0CisKKyAgICAgICAgICAgICAgICBcKCBccyogICAgICAgICAjIExpdGVyYWwgIigiICsgb3B0aW9uYWwgd2hpdGVzcGFjZQorICAgICAgICAgICAgICAgICggW15cKV0rICkgICAgICMgJDQgLSBvbmUgb3IgbW9yZSBhbnl0aGluZ3MgZXhjZXB0ICIpIgorICAgICAgICAgICAgICAgIFxzKiBcKSAgICAgICAgICMgb3B0aW9uYWwgd2hpdGVzcGFjZSBzdXJyb3VuZGluZyBhIExpdGVyYWwgIikiCisKKyAgICAgICAgICAgICAgICAoICg/OiAkZExpc3QgKSsgKSAjICQ1CisKKyAgICAgICAgICAgICAgICAkc3AgXiB7ICAgICAgICAjIGxpdGVyYWwgInsiIGF0IHN0YXJ0IG9mIGxpbmUKKyAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAjIFJlbWVtYmVyIHRvICQxCisgICAgICAgIC8veHNvbQorICAgICAgKQoreworICAgIG15ICRhbGwgPSAkMSA7CisgICAgbXkgJHByZWZpeCA9ICQyOworICAgIG15ICRwYXJhbV9saXN0ID0gJDQgOworICAgIG15ICRwYXJhbXMgPSAkNTsKKworICAgIFN0cmlwQ29tbWVudHMoJHBhcmFtcyk7CisgICAgU3RyaXBDb21tZW50cygkcGFyYW1fbGlzdCk7CisgICAgJHBhcmFtX2xpc3QgPX4gcy9eXHMrLy87CisgICAgJHBhcmFtX2xpc3QgPX4gcy9ccyskLy87CisKKyAgICBteSAkaSA9IDAgOworICAgIG15ICVwTGlzdCA9IG1hcCB7ICRfID0+ICRpKysgfQorICAgICAgICAgICAgICAgIHNwbGl0IC9ccyosXHMqLywgJHBhcmFtX2xpc3Q7CisgICAgbXkgJHBNYXRjaCA9ICcoXGInIC4gam9pbignfCcsIGtleXMgJXBMaXN0KSAuICdcYilcVyokJyA7CisKKyAgICBteSBAcGFyYW1zID0gc3BsaXQgL1xzKjtccyovLCAkcGFyYW1zOworICAgIG15IEBvdXRQYXJhbXMgPSAoKTsKKyAgICBmb3JlYWNoIG15ICRwIChAcGFyYW1zKQorICAgIHsKKyAgICAgICAgaWYgKCRwID1+IC8sLykKKyAgICAgICAgeworICAgICAgICAgICAgbXkgQGJpdHMgPSBzcGxpdCAvXHMqLFxzKi8sICRwOworICAgICAgICAgICAgbXkgJGZpcnN0ID0gc2hpZnQgQGJpdHM7CisgICAgICAgICAgICAkZmlyc3QgPX4gcy9eXHMqLy87CisgICAgICAgICAgICBwdXNoIEBvdXRQYXJhbXMsICRmaXJzdDsKKyAgICAgICAgICAgICRmaXJzdCA9fiAvXihcdytccyopLzsKKyAgICAgICAgICAgIG15ICR0eXBlID0gJDEgOworICAgICAgICAgICAgcHVzaCBAb3V0UGFyYW1zLCBtYXAgeyAkdHlwZSAuICRfIH0gQGJpdHM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAkcCA9fiBzL15ccysvLzsKKyAgICAgICAgICAgIHB1c2ggQG91dFBhcmFtcywgJHA7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIG15ICV0bXAgPSBtYXAgeyAvJHBNYXRjaC87ICAkXyA9PiAkcExpc3R7JDF9ICB9CisgICAgICAgICAgICAgIEBvdXRQYXJhbXMgOworCisgICAgQG91dFBhcmFtcyA9IG1hcCAgeyAiICAgICRfIiB9CisgICAgICAgICAgICAgICAgIHNvcnQgeyAkdG1weyRhfSA8PT4gJHRtcHskYn0gfQorICAgICAgICAgICAgICAgICBAb3V0UGFyYW1zIDsKKworICAgIHByaW50ICRwcmVmaXggOworICAgIHByaW50ICIoXG4iIC4gam9pbigiLFxuIiwgQG91dFBhcmFtcykgLiAiKVxuIjsKKyAgICBwcmludCAieyIgOworCit9CisKKyMgT3V0cHV0IGFueSB0cmFpbGluZyBjb2RlLgorcHJpbnQgOworZXhpdCAwOworCisKK3N1YiBTdHJpcENvbW1lbnRzCit7CisKKyAgbm8gd2FybmluZ3M7CisKKyAgIyBTdHJpcCBDICYgQysrIGNvbWVudHMKKyAgIyBGcm9tIHRoZSBwZXJsZmFxCisgICRfWzBdID1+CisKKyAgICBzeworICAgICAgIC9cKiAgICAgICAgICMjICBTdGFydCBvZiAvKiAuLi4gKi8gY29tbWVudAorICAgICAgIFteKl0qXCorICAgICMjICBOb24tKiBmb2xsb3dlZCBieSAxLW9yLW1vcmUgKidzCisgICAgICAgKAorICAgICAgICAgW14vKl1bXipdKlwqKworICAgICAgICkqICAgICAgICAgICMjICAwLW9yLW1vcmUgdGhpbmdzIHdoaWNoIGRvbid0IHN0YXJ0IHdpdGggLworICAgICAgICAgICAgICAgICAgICMjICAgIGJ1dCBkbyBlbmQgd2l0aCAnKicKKyAgICAgICAvICAgICAgICAgICAjIyAgRW5kIG9mIC8qIC4uLiAqLyBjb21tZW50CisKKyAgICAgfCAgICAgICAgICMjICAgICBPUiAgQysrIENvbW1lbnQKKyAgICAgICAvLyAgICAgICAgICAjIyBTdGFydCBvZiBDKysgY29tbWVudCAvLworICAgICAgIFteXG5dKiAgICAgICMjIGZvbGxvd2VkIGJ5IDAtb3ItbW9yZSBub24gZW5kIG9mIGxpbmUgY2hhcmFjdGVycworCisgICAgIHwgICAgICAgICAjIyAgICAgT1IgIHZhcmlvdXMgdGhpbmdzIHdoaWNoIGFyZW4ndCBjb21tZW50czoKKworICAgICAgICgKKyAgICAgICAgICIgICAgICAgICAgICMjICBTdGFydCBvZiAiIC4uLiAiIHN0cmluZworICAgICAgICAgKAorICAgICAgICAgICBcXC4gICAgICAgICAgICMjICBFc2NhcGVkIGNoYXIKKyAgICAgICAgIHwgICAgICAgICAgICAgICAjIyAgICBPUgorICAgICAgICAgICBbXiJcXF0gICAgICAgICMjICBOb24gIlwKKyAgICAgICAgICkqCisgICAgICAgICAiICAgICAgICAgICAjIyAgRW5kIG9mICIgLi4uICIgc3RyaW5nCisKKyAgICAgICB8ICAgICAgICAgIyMgICAgIE9SCisKKyAgICAgICAgICcgICAgICAgICAgICMjICBTdGFydCBvZiAnIC4uLiAnIHN0cmluZworICAgICAgICAgKAorICAgICAgICAgICBcXC4gICAgICAgICAgICMjICBFc2NhcGVkIGNoYXIKKyAgICAgICAgIHwgICAgICAgICAgICAgICAjIyAgICBPUgorICAgICAgICAgICBbXidcXF0gICAgICAgICMjICBOb24gJ1wKKyAgICAgICAgICkqCisgICAgICAgICAnICAgICAgICAgICAjIyAgRW5kIG9mICcgLi4uICcgc3RyaW5nCisKKyAgICAgICB8ICAgICAgICAgIyMgICAgIE9SCisKKyAgICAgICAgIC4gICAgICAgICAgICMjICBBbnl0aGluZyBvdGhlciBjaGFyCisgICAgICAgICBbXi8iJ1xcXSogICAjIyAgQ2hhcnMgd2hpY2ggZG9lc24ndCBzdGFydCBhIGNvbW1lbnQsIHN0cmluZyBvciBlc2NhcGUKKyAgICAgICApCisgICAgIH17JDJ9Z3hzOworCit9CmRpZmYgLS1naXQgYS96bGliL3NyYy96dXRpbC5jIGIvemxpYi9zcmMvenV0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2QyZWJlCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi9zcmMvenV0aWwuYwpAQCAtMCwwICsxLDMyNCBAQAorLyogenV0aWwuYyAtLSB0YXJnZXQgZGVwZW5kZW50IHV0aWxpdHkgZnVuY3Rpb25zIGZvciB0aGUgY29tcHJlc3Npb24gbGlicmFyeQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUsIDIwMTAsIDIwMTEsIDIwMTIgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBAKCMpICRJZCQgKi8KKworI2luY2x1ZGUgInp1dGlsLmgiCisjaWZuZGVmIFpfU09MTworIyAgaW5jbHVkZSAiZ3pndXRzLmgiCisjZW5kaWYKKworI2lmbmRlZiBOT19EVU1NWV9ERUNMCitzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgICAgICB7aW50IGR1bW15O307IC8qIGZvciBidWdneSBjb21waWxlcnMgKi8KKyNlbmRpZgorCit6X2NvbnN0IGNoYXIgKiBjb25zdCB6X2Vycm1zZ1sxMF0gPSB7CisibmVlZCBkaWN0aW9uYXJ5IiwgICAgIC8qIFpfTkVFRF9ESUNUICAgICAgIDIgICovCisic3RyZWFtIGVuZCIsICAgICAgICAgIC8qIFpfU1RSRUFNX0VORCAgICAgIDEgICovCisiIiwgICAgICAgICAgICAgICAgICAgIC8qIFpfT0sgICAgICAgICAgICAgIDAgICovCisiZmlsZSBlcnJvciIsICAgICAgICAgIC8qIFpfRVJSTk8gICAgICAgICAoLTEpICovCisic3RyZWFtIGVycm9yIiwgICAgICAgIC8qIFpfU1RSRUFNX0VSUk9SICAoLTIpICovCisiZGF0YSBlcnJvciIsICAgICAgICAgIC8qIFpfREFUQV9FUlJPUiAgICAoLTMpICovCisiaW5zdWZmaWNpZW50IG1lbW9yeSIsIC8qIFpfTUVNX0VSUk9SICAgICAoLTQpICovCisiYnVmZmVyIGVycm9yIiwgICAgICAgIC8qIFpfQlVGX0VSUk9SICAgICAoLTUpICovCisiaW5jb21wYXRpYmxlIHZlcnNpb24iLC8qIFpfVkVSU0lPTl9FUlJPUiAoLTYpICovCisiIn07CisKKworY29uc3QgY2hhciAqIFpFWFBPUlQgemxpYlZlcnNpb24oKQoreworICAgIHJldHVybiBaTElCX1ZFUlNJT047Cit9CisKK3VMb25nIFpFWFBPUlQgemxpYkNvbXBpbGVGbGFncygpCit7CisgICAgdUxvbmcgZmxhZ3M7CisKKyAgICBmbGFncyA9IDA7CisgICAgc3dpdGNoICgoaW50KShzaXplb2YodUludCkpKSB7CisgICAgY2FzZSAyOiAgICAgYnJlYWs7CisgICAgY2FzZSA0OiAgICAgZmxhZ3MgKz0gMTsgICAgIGJyZWFrOworICAgIGNhc2UgODogICAgIGZsYWdzICs9IDI7ICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAgICBmbGFncyArPSAzOworICAgIH0KKyAgICBzd2l0Y2ggKChpbnQpKHNpemVvZih1TG9uZykpKSB7CisgICAgY2FzZSAyOiAgICAgYnJlYWs7CisgICAgY2FzZSA0OiAgICAgZmxhZ3MgKz0gMSA8PCAyOyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OiAgICAgZmxhZ3MgKz0gMiA8PCAyOyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogICAgZmxhZ3MgKz0gMyA8PCAyOworICAgIH0KKyAgICBzd2l0Y2ggKChpbnQpKHNpemVvZih2b2lkcGYpKSkgeworICAgIGNhc2UgMjogICAgIGJyZWFrOworICAgIGNhc2UgNDogICAgIGZsYWdzICs9IDEgPDwgNDsgICAgICAgIGJyZWFrOworICAgIGNhc2UgODogICAgIGZsYWdzICs9IDIgPDwgNDsgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAgIGZsYWdzICs9IDMgPDwgNDsKKyAgICB9CisgICAgc3dpdGNoICgoaW50KShzaXplb2Yoel9vZmZfdCkpKSB7CisgICAgY2FzZSAyOiAgICAgYnJlYWs7CisgICAgY2FzZSA0OiAgICAgZmxhZ3MgKz0gMSA8PCA2OyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OiAgICAgZmxhZ3MgKz0gMiA8PCA2OyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogICAgZmxhZ3MgKz0gMyA8PCA2OworICAgIH0KKyNpZmRlZiBERUJVRworICAgIGZsYWdzICs9IDEgPDwgODsKKyNlbmRpZgorI2lmIGRlZmluZWQoQVNNVikgfHwgZGVmaW5lZChBU01JTkYpCisgICAgZmxhZ3MgKz0gMSA8PCA5OworI2VuZGlmCisjaWZkZWYgWkxJQl9XSU5BUEkKKyAgICBmbGFncyArPSAxIDw8IDEwOworI2VuZGlmCisjaWZkZWYgQlVJTERGSVhFRAorICAgIGZsYWdzICs9IDEgPDwgMTI7CisjZW5kaWYKKyNpZmRlZiBEWU5BTUlDX0NSQ19UQUJMRQorICAgIGZsYWdzICs9IDEgPDwgMTM7CisjZW5kaWYKKyNpZmRlZiBOT19HWkNPTVBSRVNTCisgICAgZmxhZ3MgKz0gMUwgPDwgMTY7CisjZW5kaWYKKyNpZmRlZiBOT19HWklQCisgICAgZmxhZ3MgKz0gMUwgPDwgMTc7CisjZW5kaWYKKyNpZmRlZiBQS1pJUF9CVUdfV09SS0FST1VORAorICAgIGZsYWdzICs9IDFMIDw8IDIwOworI2VuZGlmCisjaWZkZWYgRkFTVEVTVAorICAgIGZsYWdzICs9IDFMIDw8IDIxOworI2VuZGlmCisjaWYgZGVmaW5lZChTVERDKSB8fCBkZWZpbmVkKFpfSEFWRV9TVERBUkdfSCkKKyMgIGlmZGVmIE5PX3ZzbnByaW50ZgorICAgIGZsYWdzICs9IDFMIDw8IDI1OworIyAgICBpZmRlZiBIQVNfdnNwcmludGZfdm9pZAorICAgIGZsYWdzICs9IDFMIDw8IDI2OworIyAgICBlbmRpZgorIyAgZWxzZQorIyAgICBpZmRlZiBIQVNfdnNucHJpbnRmX3ZvaWQKKyAgICBmbGFncyArPSAxTCA8PCAyNjsKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZWxzZQorICAgIGZsYWdzICs9IDFMIDw8IDI0OworIyAgaWZkZWYgTk9fc25wcmludGYKKyAgICBmbGFncyArPSAxTCA8PCAyNTsKKyMgICAgaWZkZWYgSEFTX3NwcmludGZfdm9pZAorICAgIGZsYWdzICs9IDFMIDw8IDI2OworIyAgICBlbmRpZgorIyAgZWxzZQorIyAgICBpZmRlZiBIQVNfc25wcmludGZfdm9pZAorICAgIGZsYWdzICs9IDFMIDw8IDI2OworIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorICAgIHJldHVybiBmbGFnczsKK30KKworI2lmZGVmIERFQlVHCisKKyMgIGlmbmRlZiB2ZXJib3NlCisjICAgIGRlZmluZSB2ZXJib3NlIDAKKyMgIGVuZGlmCitpbnQgWkxJQl9JTlRFUk5BTCB6X3ZlcmJvc2UgPSB2ZXJib3NlOworCit2b2lkIFpMSUJfSU5URVJOQUwgel9lcnJvciAobSkKKyAgICBjaGFyICptOworeworICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIG0pOworICAgIGV4aXQoMSk7Cit9CisjZW5kaWYKKworLyogZXhwb3J0ZWQgdG8gYWxsb3cgY29udmVyc2lvbiBvZiBlcnJvciBjb2RlIHRvIHN0cmluZyBmb3IgY29tcHJlc3MoKSBhbmQKKyAqIHVuY29tcHJlc3MoKQorICovCitjb25zdCBjaGFyICogWkVYUE9SVCB6RXJyb3IoZXJyKQorICAgIGludCBlcnI7Cit7CisgICAgcmV0dXJuIEVSUl9NU0coZXJyKTsKK30KKworI2lmIGRlZmluZWQoX1dJTjMyX1dDRSkKKyAgICAvKiBUaGUgTWljcm9zb2Z0IEMgUnVuLVRpbWUgTGlicmFyeSBmb3IgV2luZG93cyBDRSBkb2Vzbid0IGhhdmUKKyAgICAgKiBlcnJuby4gIFdlIGRlZmluZSBpdCBhcyBhIGdsb2JhbCB2YXJpYWJsZSB0byBzaW1wbGlmeSBwb3J0aW5nLgorICAgICAqIEl0cyB2YWx1ZSBpcyBhbHdheXMgMCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLgorICAgICAqLworICAgIGludCBlcnJubyA9IDA7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX01FTUNQWQorCit2b2lkIFpMSUJfSU5URVJOQUwgem1lbWNweShkZXN0LCBzb3VyY2UsIGxlbikKKyAgICBCeXRlZiogZGVzdDsKKyAgICBjb25zdCBCeXRlZiogc291cmNlOworICAgIHVJbnQgIGxlbjsKK3sKKyAgICBpZiAobGVuID09IDApIHJldHVybjsKKyAgICBkbyB7CisgICAgICAgICpkZXN0KysgPSAqc291cmNlKys7IC8qID8/PyB0byBiZSB1bnJvbGxlZCAqLworICAgIH0gd2hpbGUgKC0tbGVuICE9IDApOworfQorCitpbnQgWkxJQl9JTlRFUk5BTCB6bWVtY21wKHMxLCBzMiwgbGVuKQorICAgIGNvbnN0IEJ5dGVmKiBzMTsKKyAgICBjb25zdCBCeXRlZiogczI7CisgICAgdUludCAgbGVuOworeworICAgIHVJbnQgajsKKworICAgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykgeworICAgICAgICBpZiAoczFbal0gIT0gczJbal0pIHJldHVybiAyKihzMVtqXSA+IHMyW2pdKS0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBaTElCX0lOVEVSTkFMIHptZW16ZXJvKGRlc3QsIGxlbikKKyAgICBCeXRlZiogZGVzdDsKKyAgICB1SW50ICBsZW47Cit7CisgICAgaWYgKGxlbiA9PSAwKSByZXR1cm47CisgICAgZG8geworICAgICAgICAqZGVzdCsrID0gMDsgIC8qID8/PyB0byBiZSB1bnJvbGxlZCAqLworICAgIH0gd2hpbGUgKC0tbGVuICE9IDApOworfQorI2VuZGlmCisKKyNpZm5kZWYgWl9TT0xPCisKKyNpZmRlZiBTWVMxNkJJVAorCisjaWZkZWYgX19UVVJCT0NfXworLyogVHVyYm8gQyBpbiAxNi1iaXQgbW9kZSAqLworCisjICBkZWZpbmUgTVlfWkNBTExPQworCisvKiBUdXJibyBDIG1hbGxvYygpIGRvZXMgbm90IGFsbG93IGR5bmFtaWMgYWxsb2NhdGlvbiBvZiA2NEsgYnl0ZXMKKyAqIGFuZCBmYXJtYWxsb2MoNjRLKSByZXR1cm5zIGEgcG9pbnRlciB3aXRoIGFuIG9mZnNldCBvZiA4LCBzbyB3ZQorICogbXVzdCBmaXggdGhlIHBvaW50ZXIuIFdhcm5pbmc6IHRoZSBwb2ludGVyIG11c3QgYmUgcHV0IGJhY2sgdG8gaXRzCisgKiBvcmlnaW5hbCBmb3JtIGluIG9yZGVyIHRvIGZyZWUgaXQsIHVzZSB6Y2ZyZWUoKS4KKyAqLworCisjZGVmaW5lIE1BWF9QVFIgMTAKKy8qIDEwKjY0SyA9IDY0MEsgKi8KKworbG9jYWwgaW50IG5leHRfcHRyID0gMDsKKwordHlwZWRlZiBzdHJ1Y3QgcHRyX3RhYmxlX3MgeworICAgIHZvaWRwZiBvcmdfcHRyOworICAgIHZvaWRwZiBuZXdfcHRyOworfSBwdHJfdGFibGU7CisKK2xvY2FsIHB0cl90YWJsZSB0YWJsZVtNQVhfUFRSXTsKKy8qIFRoaXMgdGFibGUgaXMgdXNlZCB0byByZW1lbWJlciB0aGUgb3JpZ2luYWwgZm9ybSBvZiBwb2ludGVycworICogdG8gbGFyZ2UgYnVmZmVycyAoNjRLKS4gU3VjaCBwb2ludGVycyBhcmUgbm9ybWFsaXplZCB3aXRoIGEgemVybyBvZmZzZXQuCisgKiBTaW5jZSBNU0RPUyBpcyBub3QgYSBwcmVlbXB0aXZlIG11bHRpdGFza2luZyBPUywgdGhpcyB0YWJsZSBpcyBub3QKKyAqIHByb3RlY3RlZCBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiBUaGlzIGhhY2sgZG9lc24ndCB3b3JrIGFueXdheSBvbgorICogYSBwcm90ZWN0ZWQgc3lzdGVtIGxpa2UgT1MvMi4gVXNlIE1pY3Jvc29mdCBDIGluc3RlYWQuCisgKi8KKwordm9pZHBmIFpMSUJfSU5URVJOQUwgemNhbGxvYyAodm9pZHBmIG9wYXF1ZSwgdW5zaWduZWQgaXRlbXMsIHVuc2lnbmVkIHNpemUpCit7CisgICAgdm9pZHBmIGJ1ZiA9IG9wYXF1ZTsgLyoganVzdCB0byBtYWtlIHNvbWUgY29tcGlsZXJzIGhhcHB5ICovCisgICAgdWxnIGJzaXplID0gKHVsZylpdGVtcypzaXplOworCisgICAgLyogSWYgd2UgYWxsb2NhdGUgbGVzcyB0aGFuIDY1NTIwIGJ5dGVzLCB3ZSBhc3N1bWUgdGhhdCBmYXJtYWxsb2MKKyAgICAgKiB3aWxsIHJldHVybiBhIHVzYWJsZSBwb2ludGVyIHdoaWNoIGRvZXNuJ3QgaGF2ZSB0byBiZSBub3JtYWxpemVkLgorICAgICAqLworICAgIGlmIChic2l6ZSA8IDY1NTIwTCkgeworICAgICAgICBidWYgPSBmYXJtYWxsb2MoYnNpemUpOworICAgICAgICBpZiAoKih1c2gqKSZidWYgIT0gMCkgcmV0dXJuIGJ1ZjsKKyAgICB9IGVsc2UgeworICAgICAgICBidWYgPSBmYXJtYWxsb2MoYnNpemUgKyAxNkwpOworICAgIH0KKyAgICBpZiAoYnVmID09IE5VTEwgfHwgbmV4dF9wdHIgPj0gTUFYX1BUUikgcmV0dXJuIE5VTEw7CisgICAgdGFibGVbbmV4dF9wdHJdLm9yZ19wdHIgPSBidWY7CisKKyAgICAvKiBOb3JtYWxpemUgdGhlIHBvaW50ZXIgdG8gc2VnOjAgKi8KKyAgICAqKCh1c2gqKSZidWYrMSkgKz0gKCh1c2gpKCh1Y2gqKWJ1Zi0wKSArIDE1KSA+PiA0OworICAgICoodXNoKikmYnVmID0gMDsKKyAgICB0YWJsZVtuZXh0X3B0cisrXS5uZXdfcHRyID0gYnVmOworICAgIHJldHVybiBidWY7Cit9CisKK3ZvaWQgWkxJQl9JTlRFUk5BTCB6Y2ZyZWUgKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBwdHIpCit7CisgICAgaW50IG47CisgICAgaWYgKCoodXNoKikmcHRyICE9IDApIHsgLyogb2JqZWN0IDwgNjRLICovCisgICAgICAgIGZhcmZyZWUocHRyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBGaW5kIHRoZSBvcmlnaW5hbCBwb2ludGVyICovCisgICAgZm9yIChuID0gMDsgbiA8IG5leHRfcHRyOyBuKyspIHsKKyAgICAgICAgaWYgKHB0ciAhPSB0YWJsZVtuXS5uZXdfcHRyKSBjb250aW51ZTsKKworICAgICAgICBmYXJmcmVlKHRhYmxlW25dLm9yZ19wdHIpOworICAgICAgICB3aGlsZSAoKytuIDwgbmV4dF9wdHIpIHsKKyAgICAgICAgICAgIHRhYmxlW24tMV0gPSB0YWJsZVtuXTsKKyAgICAgICAgfQorICAgICAgICBuZXh0X3B0ci0tOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHB0ciA9IG9wYXF1ZTsgLyoganVzdCB0byBtYWtlIHNvbWUgY29tcGlsZXJzIGhhcHB5ICovCisgICAgQXNzZXJ0KDAsICJ6Y2ZyZWU6IHB0ciBub3QgZm91bmQiKTsKK30KKworI2VuZGlmIC8qIF9fVFVSQk9DX18gKi8KKworCisjaWZkZWYgTV9JODYKKy8qIE1pY3Jvc29mdCBDIGluIDE2LWJpdCBtb2RlICovCisKKyMgIGRlZmluZSBNWV9aQ0FMTE9DCisKKyNpZiAoIWRlZmluZWQoX01TQ19WRVIpIHx8IChfTVNDX1ZFUiA8PSA2MDApKQorIyAgZGVmaW5lIF9oYWxsb2MgIGhhbGxvYworIyAgZGVmaW5lIF9oZnJlZSAgIGhmcmVlCisjZW5kaWYKKwordm9pZHBmIFpMSUJfSU5URVJOQUwgemNhbGxvYyAodm9pZHBmIG9wYXF1ZSwgdUludCBpdGVtcywgdUludCBzaXplKQoreworICAgIGlmIChvcGFxdWUpIG9wYXF1ZSA9IDA7IC8qIHRvIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KKyAgICByZXR1cm4gX2hhbGxvYygobG9uZylpdGVtcywgc2l6ZSk7Cit9CisKK3ZvaWQgWkxJQl9JTlRFUk5BTCB6Y2ZyZWUgKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBwdHIpCit7CisgICAgaWYgKG9wYXF1ZSkgb3BhcXVlID0gMDsgLyogdG8gbWFrZSBjb21waWxlciBoYXBweSAqLworICAgIF9oZnJlZShwdHIpOworfQorCisjZW5kaWYgLyogTV9JODYgKi8KKworI2VuZGlmIC8qIFNZUzE2QklUICovCisKKworI2lmbmRlZiBNWV9aQ0FMTE9DIC8qIEFueSBzeXN0ZW0gd2l0aG91dCBhIHNwZWNpYWwgYWxsb2MgZnVuY3Rpb24gKi8KKworI2lmbmRlZiBTVERDCitleHRlcm4gdm9pZHAgIG1hbGxvYyBPRigodUludCBzaXplKSk7CitleHRlcm4gdm9pZHAgIGNhbGxvYyBPRigodUludCBpdGVtcywgdUludCBzaXplKSk7CitleHRlcm4gdm9pZCAgIGZyZWUgICBPRigodm9pZHBmIHB0cikpOworI2VuZGlmCisKK3ZvaWRwZiBaTElCX0lOVEVSTkFMIHpjYWxsb2MgKG9wYXF1ZSwgaXRlbXMsIHNpemUpCisgICAgdm9pZHBmIG9wYXF1ZTsKKyAgICB1bnNpZ25lZCBpdGVtczsKKyAgICB1bnNpZ25lZCBzaXplOworeworICAgIGlmIChvcGFxdWUpIGl0ZW1zICs9IHNpemUgLSBzaXplOyAvKiBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCisgICAgcmV0dXJuIHNpemVvZih1SW50KSA+IDIgPyAodm9pZHBmKW1hbGxvYyhpdGVtcyAqIHNpemUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkcGYpY2FsbG9jKGl0ZW1zLCBzaXplKTsKK30KKwordm9pZCBaTElCX0lOVEVSTkFMIHpjZnJlZSAob3BhcXVlLCBwdHIpCisgICAgdm9pZHBmIG9wYXF1ZTsKKyAgICB2b2lkcGYgcHRyOworeworICAgIGZyZWUocHRyKTsKKyAgICBpZiAob3BhcXVlKSByZXR1cm47IC8qIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KK30KKworI2VuZGlmIC8qIE1ZX1pDQUxMT0MgKi8KKworI2VuZGlmIC8qICFaX1NPTE8gKi8KZGlmZiAtLWdpdCBhL3psaWIvc3JjL3p1dGlsLmggYi96bGliL3NyYy96dXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YWIwNmIKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3NyYy96dXRpbC5oCkBAIC0wLDAgKzEsMjUzIEBACisvKiB6dXRpbC5oIC0tIGludGVybmFsIGludGVyZmFjZSBhbmQgY29uZmlndXJhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcworICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCisgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCisgKi8KKworLyogQCgjKSAkSWQkICovCisKKyNpZm5kZWYgWlVUSUxfSAorI2RlZmluZSBaVVRJTF9ICisKKyNpZmRlZiBIQVZFX0hJRERFTgorIyAgZGVmaW5lIFpMSUJfSU5URVJOQUwgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSAoImhpZGRlbiIpKSkKKyNlbHNlCisjICBkZWZpbmUgWkxJQl9JTlRFUk5BTAorI2VuZGlmCisKKyNpbmNsdWRlICJ6bGliLmgiCisKKyNpZiBkZWZpbmVkKFNUREMpICYmICFkZWZpbmVkKFpfU09MTykKKyMgIGlmICEoZGVmaW5lZChfV0lOMzJfV0NFKSAmJiBkZWZpbmVkKF9NU0NfVkVSKSkKKyMgICAgaW5jbHVkZSA8c3RkZGVmLmg+CisjICBlbmRpZgorIyAgaW5jbHVkZSA8c3RyaW5nLmg+CisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaWZkZWYgWl9TT0xPCisgICB0eXBlZGVmIGxvbmcgcHRyZGlmZl90OyAgLyogZ3Vlc3MgLS0gd2lsbCBiZSBjYXVnaHQgaWYgZ3Vlc3MgaXMgd3JvbmcgKi8KKyNlbmRpZgorCisjaWZuZGVmIGxvY2FsCisjICBkZWZpbmUgbG9jYWwgc3RhdGljCisjZW5kaWYKKy8qIGNvbXBpbGUgd2l0aCAtRGxvY2FsIGlmIHlvdXIgZGVidWdnZXIgY2FuJ3QgZmluZCBzdGF0aWMgc3ltYm9scyAqLworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIHVjaDsKK3R5cGVkZWYgdWNoIEZBUiB1Y2hmOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1c2g7Cit0eXBlZGVmIHVzaCBGQVIgdXNoZjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgdWxnOworCitleHRlcm4gel9jb25zdCBjaGFyICogY29uc3Qgel9lcnJtc2dbMTBdOyAvKiBpbmRleGVkIGJ5IDItemxpYl9lcnJvciAqLworLyogKHNpemUgZ2l2ZW4gdG8gYXZvaWQgc2lsbHkgd2FybmluZ3Mgd2l0aCBWaXN1YWwgQysrKSAqLworCisjZGVmaW5lIEVSUl9NU0coZXJyKSB6X2Vycm1zZ1taX05FRURfRElDVC0oZXJyKV0KKworI2RlZmluZSBFUlJfUkVUVVJOKHN0cm0sZXJyKSBcCisgIHJldHVybiAoc3RybS0+bXNnID0gRVJSX01TRyhlcnIpLCAoZXJyKSkKKy8qIFRvIGJlIHVzZWQgb25seSB3aGVuIHRoZSBzdGF0ZSBpcyBrbm93biB0byBiZSB2YWxpZCAqLworCisgICAgICAgIC8qIGNvbW1vbiBjb25zdGFudHMgKi8KKworI2lmbmRlZiBERUZfV0JJVFMKKyMgIGRlZmluZSBERUZfV0JJVFMgTUFYX1dCSVRTCisjZW5kaWYKKy8qIGRlZmF1bHQgd2luZG93Qml0cyBmb3IgZGVjb21wcmVzc2lvbi4gTUFYX1dCSVRTIGlzIGZvciBjb21wcmVzc2lvbiBvbmx5ICovCisKKyNpZiBNQVhfTUVNX0xFVkVMID49IDgKKyMgIGRlZmluZSBERUZfTUVNX0xFVkVMIDgKKyNlbHNlCisjICBkZWZpbmUgREVGX01FTV9MRVZFTCAgTUFYX01FTV9MRVZFTAorI2VuZGlmCisvKiBkZWZhdWx0IG1lbUxldmVsICovCisKKyNkZWZpbmUgU1RPUkVEX0JMT0NLIDAKKyNkZWZpbmUgU1RBVElDX1RSRUVTIDEKKyNkZWZpbmUgRFlOX1RSRUVTICAgIDIKKy8qIFRoZSB0aHJlZSBraW5kcyBvZiBibG9jayB0eXBlICovCisKKyNkZWZpbmUgTUlOX01BVENIICAzCisjZGVmaW5lIE1BWF9NQVRDSCAgMjU4CisvKiBUaGUgbWluaW11bSBhbmQgbWF4aW11bSBtYXRjaCBsZW5ndGhzICovCisKKyNkZWZpbmUgUFJFU0VUX0RJQ1QgMHgyMCAvKiBwcmVzZXQgZGljdGlvbmFyeSBmbGFnIGluIHpsaWIgaGVhZGVyICovCisKKyAgICAgICAgLyogdGFyZ2V0IGRlcGVuZGVuY2llcyAqLworCisjaWYgZGVmaW5lZChNU0RPUykgfHwgKGRlZmluZWQoV0lORE9XUykgJiYgIWRlZmluZWQoV0lOMzIpKQorIyAgZGVmaW5lIE9TX0NPREUgIDB4MDAKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgaWYgZGVmaW5lZChfX1RVUkJPQ19fKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKyMgICAgICBpZiAoX19TVERDX18gPT0gMSkgJiYgKGRlZmluZWQoX19MQVJHRV9fKSB8fCBkZWZpbmVkKF9fQ09NUEFDVF9fKSkKKyAgICAgICAgIC8qIEFsbG93IGNvbXBpbGF0aW9uIHdpdGggQU5TSSBrZXl3b3JkcyBvbmx5IGVuYWJsZWQgKi8KKyAgICAgICAgIHZvaWQgX0NkZWNsIGZhcmZyZWUoIHZvaWQgKmJsb2NrICk7CisgICAgICAgICB2b2lkICpfQ2RlY2wgZmFybWFsbG9jKCB1bnNpZ25lZCBsb25nIG5ieXRlcyApOworIyAgICAgIGVsc2UKKyMgICAgICAgIGluY2x1ZGUgPGFsbG9jLmg+CisjICAgICAgZW5kaWYKKyMgICAgZWxzZSAvKiBNU0Mgb3IgREpHUFAgKi8KKyMgICAgICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEFNSUdBCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFZBWEMpIHx8IGRlZmluZWQoVk1TKQorIyAgZGVmaW5lIE9TX0NPREUgIDB4MDIKKyMgIGRlZmluZSBGX09QRU4obmFtZSwgbW9kZSkgXAorICAgICBmb3BlbigobmFtZSksIChtb2RlKSwgIm1iYz02MCIsICJjdHg9c3RtIiwgInJmbT1maXgiLCAibXJzPTUxMiIpCisjZW5kaWYKKworI2lmIGRlZmluZWQoQVRBUkkpIHx8IGRlZmluZWQoYXRhcmlzdCkKKyMgIGRlZmluZSBPU19DT0RFICAweDA1CisjZW5kaWYKKworI2lmZGVmIE9TMgorIyAgZGVmaW5lIE9TX0NPREUgIDB4MDYKKyMgIGlmIGRlZmluZWQoTV9JODYpICYmICFkZWZpbmVkKFpfU09MTykKKyMgICAgaW5jbHVkZSA8bWFsbG9jLmg+CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKE1BQ09TKSB8fCBkZWZpbmVkKFRBUkdFVF9PU19NQUMpCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwNworIyAgaWZuZGVmIFpfU09MTworIyAgICBpZiBkZWZpbmVkKF9fTVdFUktTX18pICYmIF9fZGVzdF9vcyAhPSBfX2JlX29zICYmIF9fZGVzdF9vcyAhPSBfX3dpbjMyX29zCisjICAgICAgaW5jbHVkZSA8dW5peC5oPiAvKiBmb3IgZmRvcGVuICovCisjICAgIGVsc2UKKyMgICAgICBpZm5kZWYgZmRvcGVuCisjICAgICAgICBkZWZpbmUgZmRvcGVuKGZkLG1vZGUpIE5VTEwgLyogTm8gZmRvcGVuKCkgKi8KKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgVE9QUzIwCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwYQorI2VuZGlmCisKKyNpZmRlZiBXSU4zMgorIyAgaWZuZGVmIF9fQ1lHV0lOX18gIC8qIEN5Z3dpbiBpcyBVbml4LCBub3QgV2luMzIgKi8KKyMgICAgZGVmaW5lIE9TX0NPREUgIDB4MGIKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fNTBTRVJJRVMgLyogUHJpbWUvUFJJTU9TICovCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9CRU9TXykgfHwgZGVmaW5lZChSSVNDT1MpCisjICBkZWZpbmUgZmRvcGVuKGZkLG1vZGUpIE5VTEwgLyogTm8gZmRvcGVuKCkgKi8KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+IDYwMCkpICYmICFkZWZpbmVkIF9fSU5URVJJWAorIyAgaWYgZGVmaW5lZChfV0lOMzJfV0NFKQorIyAgICBkZWZpbmUgZmRvcGVuKGZkLG1vZGUpIE5VTEwgLyogTm8gZmRvcGVuKCkgKi8KKyMgICAgaWZuZGVmIF9QVFJESUZGX1RfREVGSU5FRAorICAgICAgIHR5cGVkZWYgaW50IHB0cmRpZmZfdDsKKyMgICAgICBkZWZpbmUgX1BUUkRJRkZfVF9ERUZJTkVECisjICAgIGVuZGlmCisjICBlbHNlCisjICAgIGRlZmluZSBmZG9wZW4oZmQsdHlwZSkgIF9mZG9wZW4oZmQsdHlwZSkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiAhZGVmaW5lZChNU0RPUykKKyAgI3ByYWdtYSB3YXJuIC04MDA0CisgICNwcmFnbWEgd2FybiAtODAwOAorICAjcHJhZ21hIHdhcm4gLTgwNjYKKyNlbmRpZgorCisvKiBwcm92aWRlIHByb3RvdHlwZXMgZm9yIHRoZXNlIHdoZW4gYnVpbGRpbmcgemxpYiB3aXRob3V0IExGUyAqLworI2lmICFkZWZpbmVkKF9XSU4zMikgJiYgXAorICAgICghZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKSB8fCBfTEZTNjRfTEFSR0VGSUxFLTAgPT0gMCkKKyAgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lNjQgT0YoKHVMb25nLCB1TG9uZywgel9vZmZfdCkpOworICAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lNjQgT0YoKHVMb25nLCB1TG9uZywgel9vZmZfdCkpOworI2VuZGlmCisKKyAgICAgICAgLyogY29tbW9uIGRlZmF1bHRzICovCisKKyNpZm5kZWYgT1NfQ09ERQorIyAgZGVmaW5lIE9TX0NPREUgIDB4MDMgIC8qIGFzc3VtZSBVbml4ICovCisjZW5kaWYKKworI2lmbmRlZiBGX09QRU4KKyMgIGRlZmluZSBGX09QRU4obmFtZSwgbW9kZSkgZm9wZW4oKG5hbWUpLCAobW9kZSkpCisjZW5kaWYKKworICAgICAgICAgLyogZnVuY3Rpb25zICovCisKKyNpZiBkZWZpbmVkKHB5cikgfHwgZGVmaW5lZChaX1NPTE8pCisjICBkZWZpbmUgTk9fTUVNQ1BZCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNNQUxMX01FRElVTSkgJiYgIWRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9fU0NfXykKKyAvKiBVc2Ugb3VyIG93biBmdW5jdGlvbnMgZm9yIHNtYWxsIGFuZCBtZWRpdW0gbW9kZWwgd2l0aCBNU0MgPD0gNS4wLgorICAqIFlvdSBtYXkgaGF2ZSB0byB1c2UgdGhlIHNhbWUgc3RyYXRlZ3kgZm9yIEJvcmxhbmQgQyAodW50ZXN0ZWQpLgorICAqIFRoZSBfX1NDX18gY2hlY2sgaXMgZm9yIFN5bWFudGVjLgorICAqLworIyAgZGVmaW5lIE5PX01FTUNQWQorI2VuZGlmCisjaWYgZGVmaW5lZChTVERDKSAmJiAhZGVmaW5lZChIQVZFX01FTUNQWSkgJiYgIWRlZmluZWQoTk9fTUVNQ1BZKQorIyAgZGVmaW5lIEhBVkVfTUVNQ1BZCisjZW5kaWYKKyNpZmRlZiBIQVZFX01FTUNQWQorIyAgaWZkZWYgU01BTExfTUVESVVNIC8qIE1TRE9TIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLworIyAgICBkZWZpbmUgem1lbWNweSBfZm1lbWNweQorIyAgICBkZWZpbmUgem1lbWNtcCBfZm1lbWNtcAorIyAgICBkZWZpbmUgem1lbXplcm8oZGVzdCwgbGVuKSBfZm1lbXNldChkZXN0LCAwLCBsZW4pCisjICBlbHNlCisjICAgIGRlZmluZSB6bWVtY3B5IG1lbWNweQorIyAgICBkZWZpbmUgem1lbWNtcCBtZW1jbXAKKyMgICAgZGVmaW5lIHptZW16ZXJvKGRlc3QsIGxlbikgbWVtc2V0KGRlc3QsIDAsIGxlbikKKyMgIGVuZGlmCisjZWxzZQorICAgdm9pZCBaTElCX0lOVEVSTkFMIHptZW1jcHkgT0YoKEJ5dGVmKiBkZXN0LCBjb25zdCBCeXRlZiogc291cmNlLCB1SW50IGxlbikpOworICAgaW50IFpMSUJfSU5URVJOQUwgem1lbWNtcCBPRigoY29uc3QgQnl0ZWYqIHMxLCBjb25zdCBCeXRlZiogczIsIHVJbnQgbGVuKSk7CisgICB2b2lkIFpMSUJfSU5URVJOQUwgem1lbXplcm8gT0YoKEJ5dGVmKiBkZXN0LCB1SW50IGxlbikpOworI2VuZGlmCisKKy8qIERpYWdub3N0aWMgZnVuY3Rpb25zICovCisjaWZkZWYgREVCVUcKKyMgIGluY2x1ZGUgPHN0ZGlvLmg+CisgICBleHRlcm4gaW50IFpMSUJfSU5URVJOQUwgel92ZXJib3NlOworICAgZXh0ZXJuIHZvaWQgWkxJQl9JTlRFUk5BTCB6X2Vycm9yIE9GKChjaGFyICptKSk7CisjICBkZWZpbmUgQXNzZXJ0KGNvbmQsbXNnKSB7aWYoIShjb25kKSkgel9lcnJvcihtc2cpO30KKyMgIGRlZmluZSBUcmFjZSh4KSB7aWYgKHpfdmVyYm9zZT49MCkgZnByaW50ZiB4IDt9CisjICBkZWZpbmUgVHJhY2V2KHgpIHtpZiAoel92ZXJib3NlPjApIGZwcmludGYgeCA7fQorIyAgZGVmaW5lIFRyYWNldnYoeCkge2lmICh6X3ZlcmJvc2U+MSkgZnByaW50ZiB4IDt9CisjICBkZWZpbmUgVHJhY2VjKGMseCkge2lmICh6X3ZlcmJvc2U+MCAmJiAoYykpIGZwcmludGYgeCA7fQorIyAgZGVmaW5lIFRyYWNlY3YoYyx4KSB7aWYgKHpfdmVyYm9zZT4xICYmIChjKSkgZnByaW50ZiB4IDt9CisjZWxzZQorIyAgZGVmaW5lIEFzc2VydChjb25kLG1zZykKKyMgIGRlZmluZSBUcmFjZSh4KQorIyAgZGVmaW5lIFRyYWNldih4KQorIyAgZGVmaW5lIFRyYWNldnYoeCkKKyMgIGRlZmluZSBUcmFjZWMoYyx4KQorIyAgZGVmaW5lIFRyYWNlY3YoYyx4KQorI2VuZGlmCisKKyNpZm5kZWYgWl9TT0xPCisgICB2b2lkcGYgWkxJQl9JTlRFUk5BTCB6Y2FsbG9jIE9GKCh2b2lkcGYgb3BhcXVlLCB1bnNpZ25lZCBpdGVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNpemUpKTsKKyAgIHZvaWQgWkxJQl9JTlRFUk5BTCB6Y2ZyZWUgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgcHRyKSk7CisjZW5kaWYKKworI2RlZmluZSBaQUxMT0Moc3RybSwgaXRlbXMsIHNpemUpIFwKKyAgICAgICAgICAgKCooKHN0cm0pLT56YWxsb2MpKSgoc3RybSktPm9wYXF1ZSwgKGl0ZW1zKSwgKHNpemUpKQorI2RlZmluZSBaRlJFRShzdHJtLCBhZGRyKSAgKCooKHN0cm0pLT56ZnJlZSkpKChzdHJtKS0+b3BhcXVlLCAodm9pZHBmKShhZGRyKSkKKyNkZWZpbmUgVFJZX0ZSRUUocywgcCkge2lmIChwKSBaRlJFRShzLCBwKTt9CisKKy8qIFJldmVyc2UgdGhlIGJ5dGVzIGluIGEgMzItYml0IHZhbHVlICovCisjZGVmaW5lIFpTV0FQMzIocSkgKCgoKHEpID4+IDI0KSAmIDB4ZmYpICsgKCgocSkgPj4gOCkgJiAweGZmMDApICsgXAorICAgICAgICAgICAgICAgICAgICAoKChxKSAmIDB4ZmYwMCkgPDwgOCkgKyAoKChxKSAmIDB4ZmYpIDw8IDI0KSkKKworI2VuZGlmIC8qIFpVVElMX0ggKi8KZGlmZiAtLWdpdCBhL3psaWIvdXBkYXRlX3psaWIuc2ggYi96bGliL3VwZGF0ZV96bGliLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQxMTkzYWEKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3VwZGF0ZV96bGliLnNoCkBAIC0wLDAgKzEsNDIgQEAKKyMhL2Jpbi9iYXNoCisjIFJ1biB3aXRoIG5vIGFyZ3VtZW50cyBmcm9tIGFueSBkaXJlY3RvcnksIHdpdGggbm8gc3BlY2lhbCBzZXR1cCByZXF1aXJlZC4KKworIyBBYm9ydCBpZiBhbnkgY29tbWFuZCByZXR1cm5zIGFuIGVycm9yIGV4aXQgc3RhdHVzLCBvciBpZiBhbiB1bmRlZmluZWQKKyMgdmFyaWFibGUgaXMgdXNlZC4KK3NldCAtZQorc2V0IC11CisKK2Jhc2VfZGlyPSQocmVhbHBhdGggJChkaXJuYW1lICQwKSkKKworIyBFeHRyYWN0IHRoZSBsYXRlc3QgdmVyc2lvbiBmcm9tIHRoZSB3ZWIgcGFnZS4KK25ld192ZXJzaW9uPSQod2dldCAtTyAtIC0tbm8tdmVyYm9zZSAtcSBodHRwOi8vemxpYi5uZXQvIHwgXAorICAgICAgICAgICAgICBncmVwICdodHRwOi8vemxpYi5uZXQvemxpYi1bMC05XS4qLnRhci5neicgfCBcCisgICAgICAgICAgICAgIHNlZCAncy8uKnpsaWItXCguKlwpXC50YXJcLmd6LiovXDEvJykKK3Rnel9maWxlPSJ6bGliLSRuZXdfdmVyc2lvbi50YXIuZ3oiCisKK2VjaG8gIlVwZ3JhZGluZyB6bGliIHRvIHZlcnNpb24gJG5ld192ZXJzaW9uLi4uIgorZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKworZWNobyAiRG93bmxvYWRpbmcgJHRnel9maWxlLi4uIgord2dldCAtTyAvdG1wLyR0Z3pfZmlsZSAtLW5vLXZlcmJvc2UgImh0dHA6Ly96bGliLm5ldC8kdGd6X2ZpbGUiCisKK2VjaG8gIkNsZWFuaW5nIG91dCBvbGQgdmVyc2lvbi4uLiIKK3NyY19kaXI9JGJhc2VfZGlyL3NyYworcm0gLXJmICRzcmNfZGlyCisKK2VjaG8gIlVucGFja2luZyBuZXcgdmVyc2lvbi4uLiIKK2NkICRiYXNlX2RpcgordGFyIHp4ZiAvdG1wLyR0Z3pfZmlsZQorbXYgemxpYi0kbmV3X3ZlcnNpb24gc3JjCisKK2VjaG8gIkNvbmZpZ3VyaW5nIG5ldyB2ZXJzaW9uLi4uIgorY2Qgc3JjCisuL2NvbmZpZ3VyZQorcm0gTWFrZWZpbGUgY29uZmlndXJlLmxvZworY2QgLi4KKworZWNobyAiRml4aW5nIE5PVElDRSBmaWxlLi4uIgorZ3JlcCAtQTIxICdDb3B5cmlnaHQgbm90aWNlOicgc3JjL1JFQURNRSB8IHRhaWwgLTIwID4gTk9USUNFCisKK21kNV9zdW09JChtZDVzdW0gL3RtcC8kdGd6X2ZpbGUpCitlY2hvICJNRDU6ICRtZDVfc3VtIgpkaWZmIC0tZ2l0IGEvemxpYi96Y29uZi5oIGIvemxpYi96Y29uZi5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjllOTgxODUKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3pjb25mLmgKQEAgLTAsMCArMSBAQAorc3JjL3pjb25mLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS96bGliL3psaWIuaCBiL3psaWIvemxpYi5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmQzN2JlOTYKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3psaWIuaApAQCAtMCwwICsxIEBACitzcmMvemxpYi5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvemxpYi96dXRpbC5oIGIvemxpYi96dXRpbC5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjEyZTU5ODYKLS0tIC9kZXYvbnVsbAorKysgYi96bGliL3p1dGlsLmgKQEAgLTAsMCArMSBAQAorc3JjL3p1dGlsLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCg==