ZGlmZiAtLWdpdCBhL0FVVEhPUlMgYi9BVVRIT1JTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhOGNiNGEKLS0tIC9kZXYvbnVsbAorKysgYi9BVVRIT1JTCkBAIC0wLDAgKzEsNTQgQEAKK1ZhWCNuOCAocmVhbCBuYW1lIHVua25vd24pIHdyb3RlIHNoYXJlZF9zcmMvZnN5c19leHQyZnMuYy4KKworSGVpa28gU2Nocm9lZGVyIHJld3JvdGUgc2hhcmVkX3NyYy9zdGFnZTEuUyB0byBiZSBtb3JlIHJlYWRhYmxlLgorCitUaGUgZm9sbG93aW5nIGF1dGhvcnMgYXNzaWduZWQgY29weXJpZ2h0IG9uIHRoZWlyIHdvcmsgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb246CisKK0VyaWNoIFN0ZWZhbiBCb2xleW4gb3JpZ2luYWxseSBkZXNpZ25lZCBhbmQgaW1wbGVtZW50ZWQgR1JVQi4KKworR29yZG9uIE1hdHppZ2tlaXQgYWRvcHRlZCBHUlVCIGludG8gdGhlIEdOVSBQcm9qZWN0LiAgSGUgZml4ZWQgc2V2ZXJhbAorYnVncywgYWRkZWQgc3ltYm9saWMgbGluayBzdXBwb3J0IHRvIHNoYXJlZF9zcmMvZnN5c19leHQyZnMuYywgYW5kCitiZWdhbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgL3NiaW4vZ3J1Yi4gSGUgd2FzIGFuIG9mZmljaWFsIG1haW50YWluZXIuCisKK1lvc2hpbm9yaSBLLiBPa3VqaSBjb250cmlidXRlZCBtYW55IGJ1Z2ZpeGVzIGFuZCBuZXcgZmVhdHVyZXMsIHN1Y2ggYXMKK3dvcmtpbmcgTEJBIHN1cHBvcnQsIC9zYmluL2dydWIgc3VwcG9ydCBmb3IgY29uZmlndXJhdGlvbiBmaWxlcywgdGhlCitzY3JpcHQgL3NiaW4vZ3J1Yi1pbnN0YWxsLCB0aGUgdXRpbGl0eSAvYmluL21iY2hrLCB0aGUgbmV3IGVuZ2luZSBmb3IKK2J1aWx0aW4gY29tbWFuZHMsIGRpc2sgc3dhcHBpbmcgc3VwcG9ydCwga2V5Ym9hcmQgY29uZmlndXJhdGlvbiBzdXBwb3J0LAorbmV0d29yayBzdXBwb3J0LCBvbmxpbmUgaGVscCBzdXBwb3J0LCBjb21tYW5kLWxpbmUgaGlzdG9yeSBzdXBwb3J0LAoraGlkZGVuIG1lbnUgc3VwcG9ydCwgdGhlIG5ldyBMaW51eCBsb2FkZXIsIHNlcmlhbCB0ZXJtaW5hbCBzdXBwb3J0LAorc2luZ2xlLWxpbmUgZWRpdGluZyBzdXBwb3J0LCB0aGUgdXRpbGl0eSAvc2Jpbi9ncnViLW1kNS1jcnlwdCwgdGhlIG5ldworR1JVQiBtYW51YWwsIGFuZCBzZXZlcmFsIG5ldyBjb21tYW5kcy4gSGUgaXMgdGhlIGN1cnJlbnQgb2ZmaWNpYWwKK21haW50YWluZXIuCisKK1BldGVyIEFzdHJhbmQgYWRkZWQgc3VwcG9ydCBmb3IgYSBjb2xvciBtZW51LgorCitQYXZlbCBSb3NraW4gY29udHJpYnV0ZWQgbWFueSBidWdmaXhlcyBhbmQgbmV3IGZlYXR1cmVzLCBzdWNoIGFzIEZyZWVCU0QKK3N1cHBvcnQgZm9yIHRoZSBncnViIHNoZWxsLCBhbmQgY29uZmlndXJlIHByb2Nlc3MgY2xlYW51cHMuCisKK0tsYXVzIFJlaWNobCB3cm90ZSBzdGFnZTIvZnN5c19taW5peC5jLgorCitQZXIgTHVuZGJlcmcgYWRkZWQgZ3JhcGhpY3Mgc3VwcG9ydCB0byB0aGUgTXVsdGlib290IFNwZWNpZmljYXRpb24uCisKK0pvY2hlbiBIb2VuaWNrZSByZXdyb3RlIHN0YWdlMi9mc3lzX2ZhdC5jIGFuZCB3cm90ZQorc3RhZ2UyL2ZzeXNfcmVpc2VyZnMuYyBhbmQgc3RhZ2UyL21kNS5jLgorCitDaHJpc3RvcGggUGxhdHRuZXIgYWRkZWQgc3VwcG9ydCBmb3IgTmV0IEJvb3QgSW1hZ2UgUHJvcG9zYWwuCisKK0ZyYW5rIE1laG5lcnQgYWRkZWQgc3VwcG9ydCBmb3IgaGVyY3VsZXMgY29uc29sZS4KKworS3Jpc3RvZmZlciBCcmFuZW15ciBhZGRlZCBWU1RhIGZpbGVzeXN0ZW0gc3VwcG9ydC4KKworU2VyZ3VlaSBUenVrYW5vdiBhZGRlZCBKRlMgYW5kIFhGUyBzdXBwb3J0LgorCitKYXNvbiBUaG9tYXMgYWRkZWQgTGludXggREFDOTYwIHN1cHBvcnQgYW5kIHN1cHBvcnQgZm9yIGhpZGluZy91bmhpZGluZworbG9naWNhbCBwYXJ0aXRpb25zLCBhbmQgZGlkIGEgc2lnbmlmaWNhbnQgYnVnZml4IGZvciB0aGUgdGVybWluYWwgc3R1ZmYuCisKK1RpbG1hbm4gQnViZWNrIGFkZGVkIHN1cHBvcnQgZm9yIHZ0MTAwLWluY29tcGF0aWJsZSB0ZXJtaW5hbHMuCisKK0tCIFNyaXJhbSBhZGRlZCBhIGJldHRlciBkZXRlY3Rpb24gb2YgRkFUIGZpbGVzeXN0ZW0gYW5kIGZpeGVkIGEKK25ldHdvcmsgZGV2aWNlIGNvbXBsZXRpb24uCisKK0VyaWMgS3ZhYWxlbiBmaXhlZCBhIGxvdCBvZiBwcm9ibGVtcyBpbiB0aGUgR1JVQiBtYW51YWwuCisKK0xlb25pZCBMaXNvdnNraXkgYWRkZWQgRWwgVG9yaXRvIHN1cHBvcnQuCmRpZmYgLS1naXQgYS9BbmRyb2lkLm1rIGIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDAwMGE0Ci0tLSAvZGV2L251bGwKKysrIGIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE5MiBAQAorIyMgQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMjCisjIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyMKKyMjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMjCisjIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMjCisKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQoraWZlcSAoJChUQVJHRVRfQVJDSCkseDg2KQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBGaXJzdCwgYnVpbGQgc3RhZ2UxCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgICAgIHN0YWdlMS9zdGFnZTEuUworCitMT0NBTF9DRkxBR1MgOj0gXAorICAgICAgICAtV2FsbCAtV21pc3NpbmctcHJvdG90eXBlcyAtV3VudXNlZCAtV3NoYWRvdyBcCisgICAgICAgIC1XcG9pbnRlci1hcml0aCAtZmFsaWduLWp1bXBzPTEgLWZhbGlnbi1sb29wcz0xIFwKKyAgICAgICAgLWZhbGlnbi1mdW5jdGlvbnM9MSAtV3VuZGVmCitMT0NBTF9DRkxBR1MgKz0gLW0zMiAtTzIgLWZuby1idWlsdGluIC1ub3N0ZGluYworCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvc3RhZ2UxCisKK0xPQ0FMX01PRFVMRSA6PSBncnViX3N0YWdlMQorTE9DQUxfTU9EVUxFX1BBVEggOj0gJChQUk9EVUNUX09VVCkvZ3J1YgorCitMT0NBTF9TWVNURU1fU0hBUkVEX0xJQlJBUklFUyA6PQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PQorCitpbmNsdWRlICQoQlVJTERfUkFXX0VYRUNVVEFCTEUpCisKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKSA6IFBSSVZBVEVfTElOS19TQ1JJUFQgOj0KKyQoTE9DQUxfQlVJTFRfTU9EVUxFKSA6IFBSSVZBVEVfTElCUyA6PQorJChMT0NBTF9CVUlMVF9NT0RVTEUpIDogUFJJVkFURV9SQVdfRVhFQ1VUQUJMRV9MREZMQUdTIDo9IFwKKwktbm9zdGRsaWIgLU4gLVR0ZXh0PTdDMDAgLW1lbGZfaTM4NgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBGb3Igc3RhZ2UyLCB3ZSBoYXZlIHRvIGRvIGl0IGluIHNldmVyYWwgcGFydHMuCisjIyAgIDEpIEJ1aWxkIHByZV9zdGFnZTIgdGhhdCBjb250YWlucyBhbGwgdGhlIHNvdXJjZS4KKyMjICAgMikgR2V0IHRoZSBzaXplIG9mIHByZV9zdGFnZTIgZnJvbSAoMSkgYW5kIGdlbmVyYXRlIGEgaGVhZGVyIGZpbGUuCisjIyAgIDMpIEJ1aWxkIHRoZSAic3RhcnQgc2VjdG9yIiB3aXRoIHRoZSBoZWFkZXIgZmlsZS4KKyMjICAgNCkgY29uY2F0ZW5hdGUgc3RhcnQgKyBwcmVfc3RhZ2UyIGludG8gc3RhZ2UyLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgU28sIGJ1aWxkIHByZV9zdGFnZTIgdGFyZ2V0ICAoMSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJc3RhZ2UyL2FzbS5TIFwKKwlzdGFnZTIvYmlvcy5jIFwKKwlzdGFnZTIvYm9vdC5jIFwKKwlzdGFnZTIvYnVpbHRpbnMuYyBcCisJc3RhZ2UyL2NoYXJfaW8uYyBcCisJc3RhZ2UyL2NtZGxpbmUuYyBcCisJc3RhZ2UyL2NvbW1vbi5jIFwKKwlzdGFnZTIvY29uc29sZS5jIFwKKwlzdGFnZTIvZGlza19pby5jIFwKKwlzdGFnZTIvZnN5c19leHQyZnMuYyBcCisJc3RhZ2UyL2d1bnppcC5jIFwKKwlzdGFnZTIvc2VyaWFsLmMgXAorCXN0YWdlMi9zbXAtaW1wcy5jIFwKKwlzdGFnZTIvc3RhZ2UyLmMgXAorCXN0YWdlMi90ZXJtaW5mby5jIFwKKwlzdGFnZTIvdHBhcm0uYyBcCisJc3RhZ2UyL3ByZXNldF9tZW51LmMKKworTE9DQUxfQ0ZMQUdTIDo9IFwKKwktV2FsbCAtV21pc3NpbmctcHJvdG90eXBlcyAtV3VudXNlZCAtV3NoYWRvdyBcCisJLVdwb2ludGVyLWFyaXRoIC1mYWxpZ24tanVtcHM9MSAtZmFsaWduLWxvb3BzPTEgXAorCS1mYWxpZ24tZnVuY3Rpb25zPTEgLVd1bmRlZgorCitMT0NBTF9DRkxBR1MgKz0gLW0zMiAtT3MgLWZuby1idWlsdGluIC1ub3N0ZGluYworCitMT0NBTF9DRkxBR1MgKz0gLURIQVZFX0NPTkZJR19IIC1ERlNZU19FWFQyRlM9MSAtRFNVUFBPUlRfU0VSSUFMPTEKKworTE9DQUxfQ0ZMQUdTICs9IC1EUFJFU0VUX01FTlVfRVhURVJOQUwKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJJChMT0NBTF9QQVRIKS9zdGFnZTEgXAorCSQoTE9DQUxfUEFUSCkvc3RhZ2UyCisKK0xPQ0FMX01PRFVMRSA6PSBncnViX3ByZV9zdGFnZTIKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoUFJPRFVDVF9PVVQpL2dydWIKKworTE9DQUxfU1lTVEVNX1NIQVJFRF9MSUJSQVJJRVMgOj0KK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0KKworaW5jbHVkZSAkKEJVSUxEX1JBV19FWEVDVVRBQkxFKQorCiskKExPQ0FMX0JVSUxUX01PRFVMRSkgOiBQUklWQVRFX0xJTktfU0NSSVBUIDo9CiskKExPQ0FMX0JVSUxUX01PRFVMRSkgOiBQUklWQVRFX0xJQlMgOj0KKyQoTE9DQUxfQlVJTFRfTU9EVUxFKSA6IFBSSVZBVEVfUkFXX0VYRUNVVEFCTEVfTERGTEFHUyA6PSBcCisJLW5vc3RkbGliIC1OIC1UdGV4dD04MjAwIC1tZWxmX2kzODYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBHZW5lcmF0ZSB0aGUgc3RhZ2UyIHN0YXJ0IGZpbGUgICgyKSArICgzKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwlzdGFnZTIvc3RhcnQuUworCitMT0NBTF9DRkxBR1MgOj0gXAorCS1XYWxsIC1XbWlzc2luZy1wcm90b3R5cGVzIC1XdW51c2VkIC1Xc2hhZG93IFwKKwktV3BvaW50ZXItYXJpdGggLWZhbGlnbi1qdW1wcz0xIC1mYWxpZ24tbG9vcHM9MSBcCisJLWZhbGlnbi1mdW5jdGlvbnM9MSAtV3VuZGVmCisKK0xPQ0FMX0NGTEFHUyArPSAtbTMyIC1PcyAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jCisKK0xPQ0FMX0NGTEFHUyArPSAtREhBVkVfQ09ORklHX0ggLURGU1lTX0VYVDJGUz0xIC1EU1VQUE9SVF9TRVJJQUw9MQorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKwkkKExPQ0FMX1BBVEgpL3N0YWdlMSBcCisJJChMT0NBTF9QQVRIKS9zdGFnZTIKKworTE9DQUxfU1lTVEVNX1NIQVJFRF9MSUJSQVJJRVMgOj0KK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0KKworTE9DQUxfTU9EVUxFIDo9IGdydWJfc3RhcnRfc3RhZ2UyCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFBST0RVQ1RfT1VUKS9ncnViCisKKyMgPGdlbmVyYXRlIHRoZSBoZWFkZXIgZmlsZT4KK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFWEVDVVRBQkxFUworaW50ZXJtZWRpYXRlcyA6PSAkKGNhbGwgbG9jYWwtaW50ZXJtZWRpYXRlcy1kaXIpCisKK1NUQUdFMl9TSVpFX09CSiA6PSAkKGludGVybWVkaWF0ZXMpL3N0YWdlMl9zaXplLmgKKyQoU1RBR0UyX1NJWkVfT0JKKSA6IFBSSVZBVEVfQ1VTVE9NX1RPT0wgPSBcCisJZWNobyAiXCNkZWZpbmUgU1RBR0UyX1NJWkUgYHN0YXQgLWMgJyVzJyAkPGAiID4gJEAKKworTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMgOj0gJChTVEFHRTJfU0laRV9PQkopCiskKFNUQUdFMl9TSVpFX09CSik6ICQoUFJPRFVDVF9PVVQpL2dydWIvZ3J1Yl9wcmVfc3RhZ2UyCisJQGVjaG8gInRhcmdldCBHZW5lcmF0aW5nOiAkQCIgCisJJCh0cmFuc2Zvcm0tZ2VuZXJhdGVkLXNvdXJjZSkKKyMgPC9nZW5lcmF0ZSB0aGUgaGVhZGVyIGZpbGU+CisKK2luY2x1ZGUgJChCVUlMRF9SQVdfRVhFQ1VUQUJMRSkKKworJChhbGxfb2JqZWN0cyk6ICQoU1RBR0UyX1NJWkVfT0JKKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpIDogUFJJVkFURV9MSU5LX1NDUklQVCA6PQorJChMT0NBTF9CVUlMVF9NT0RVTEUpIDogUFJJVkFURV9MSUJTIDo9CiskKExPQ0FMX0JVSUxUX01PRFVMRSkgOiBQUklWQVRFX1JBV19FWEVDVVRBQkxFX0xERkxBR1MgOj0gXAorCS1ub3N0ZGxpYiAtTiAtVHRleHQ9ODIwMCAtbWVsZl9pMzg2CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgR2VuZXJhdGUgdGhlIHJlYWwgZGVhbCBzdGFnZTIgICg0KQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworbXlfZmlsZXMgOj0gJChQUk9EVUNUX09VVCkvZ3J1Yi9ncnViX3N0YXJ0X3N0YWdlMiBcCisJJChQUk9EVUNUX09VVCkvZ3J1Yi9ncnViX3ByZV9zdGFnZTIKKworZmlsZSA6PSAkKFBST0RVQ1RfT1VUKS9ncnViL2dydWJfc3RhZ2UyCiskKGZpbGUpIDogJChteV9maWxlcykgCisJQGVjaG8gInRhcmdldCBDcmVhdGluZzogJEAiCisJJChoaWRlKSBjYXQgJF4gPiAkQAorQUxMX1BSRUJVSUxUICs9ICQoZmlsZSkKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgR2VuZXJhdGUgYSBmdWxsIHN0YWdlMStzdGFnZTIgYmluIHRoYXQgd2UgY2FuIGp1c3QgZHJvcCBAIG9mZnNldCAwIG9uIGRpc2sKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorZ3J1Yl9zdGFnZTEgOj0gJChQUk9EVUNUX09VVCkvZ3J1Yi9ncnViX3N0YWdlMQorZ3J1Yl9zdGFnZTIgOj0gJChQUk9EVUNUX09VVCkvZ3J1Yi9ncnViX3N0YWdlMgorZ3J1Yl9mdWxsIDo9ICQoUFJPRFVDVF9PVVQpL2dydWIvZ3J1Yi5iaW4KKworJChncnViX2Z1bGwpIDogJChncnViX3N0YWdlMSkgJChncnViX3N0YWdlMikKKwlAZWNobyAidGFyZ2V0IEdlbmVyYXRpbmcgR1JVQiBiaW46ICRAIgorCSQoaGlkZSkgcm0gLWYgJEAKKwkkKGhpZGUpIGRkIGlmPSQoZ3J1Yl9zdGFnZTEpIG9mPSRAIGJzPTUxMiBjb3VudD0xIDI+L2Rldi9udWxsCisJJChoaWRlKSBkZCBpZj0kKGdydWJfc3RhZ2UyKSBvZj0kQCBicz01MTIgc2Vlaz0xIDI+L2Rldi9udWxsCitBTExfUFJFQlVJTFQgKz0gJChncnViX2Z1bGwpCisKK2VuZGlmICMgeDg2CitlbmRpZiAjICEgc2ltCmRpZmYgLS1naXQgYS9CVUdTIGIvQlVHUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGMxZjcyCi0tLSAvZGV2L251bGwKKysrIGIvQlVHUwpAQCAtMCwwICsxLDcgQEAKK1NlZSB0aGUgQnVnIFRyYWNraW5nIFN5c3RlbSBmb3IgR05VIEdSVUIgb24gU2F2YW5uYWguIFRoZSBVUkwgaXM6CisKK2h0dHA6Ly9zYXZhbm5haC5nbnUub3JnL2J1Z3MvP2dyb3VwX2lkPTY4ICh3aXRob3V0IFNTTCkKKworb3IKKworaHR0cHM6Ly9zYXZhbm5haC5nbnUub3JnL2J1Z3MvP2dyb3VwX2lkPTY4ICh3aXRoIFNTTCkKZGlmZiAtLWdpdCBhL0NPUFlJTkcgYi9DT1BZSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYjU4NmIKLS0tIC9kZXYvbnVsbAorKysgYi9DT1BZSU5HCkBAIC0wLDAgKzEsMzQwIEBACisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eXkgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjkzMDMzCi0tLSAvZGV2L251bGwKKysrIGIvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsOTA3NSBAQAorMjAwNS0wNS0wOCAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBjb25maWd1cmUuYWMgKEFDX0lOSVQpOiBVcGdyYWRlZCB0byAwLjk3LgorCisJKiBjb21waWxlOiBDb3BpZWQgZnJvbSBBdXRvbWFrZSAxLjkuNC4KKwkqIGNvbmZpZy5ndWVzczogTGlrZXdpc2UuCisJKiBjb25maWcuc3ViOiBMaWtld2lzZS4KKwkqIGRlcGNvbXA6IExpa2V3aXNlLgorCSogaW5zdGFsbC1zaDogTGlrZXdpc2UuCisJKiBtaXNzaW5nOiBMaWtld2lzZS4KKwkqIG1raW5zdGFsbGRpcnM6IExpa2V3aXNlLgorCSogbWRhdGUtc2g6IExpa2V3aXNlLgorCSogZG9jcy90ZXhpbmZvLnRleDogTGlrZXdpc2UuCisKKzIwMDUtMDUtMDggIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogc3RhZ2UyL2ZzeXNfeGZzLmMgKG5leHRfZGVudHJ5KTogVXNlIGFycmF5cyBvZiBhcnJheXMgaW5zdGVhZCBvZgorCWFycmF5cyBvZiBwb2ludGVycyBmb3IgVVNVQUwsIHRvIGF2b2lkIHJlYWQtb25seSBzdHJpbmdzLiBSZXBvcnRlZAorCWJ5IFN2ZW4gV2VnZW5lciA8c3dlZ2VuZXJAZ2VudG9vLm9yZz4uCisKKzIwMDUtMDMtMjggIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogbGliL2RldmljZS5jIChnZXRfZHJpdmVfZ2VvbWV0cnkpOiBVc2UgU1QuU1RfU0laRSBpbnN0ZWFkIG9mCisJU1QuU1RfQkxPQ0tTIHRvIGdldCB0aGUgdG90YWwgbnVtYmVyIG9mIHNlY3RvcnMsIGJlY2F1c2Ugc3RfYmxvY2tzCisJaXMgbm90IHRoZSBzYW1lIGlmIGl0IGlzIGEgc3BhcnNlIGZpbGUuCisKKzIwMDUtMDMtMTkgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogc3RhZ2UyL3N0YWdlMi5jIChjbWFpbik6IEluaXRpYWxpemUgREVGQVVMVF9GSUxFIHRvIGFuIGVtcHR5CisJc3RyaW5nLiBSZXBvcnRlZCBieSBOQVRPUkkgU2hpbiA8bmF0b3JpQGFkbS5zLnUtdG9reW8uYWMuanA+LgorCisyMDA1LTAzLTE1ICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIHN0YWdlMi9mc3lzX2ZhdC5jIChmYXRfbW91bnQpOiBJZ25vcmUgdGhlIDNyZCBiaXQgb2YgYSBtZWRpYQorCWRlc2NyaXB0b3IsIGJlY2F1c2Ugc29tZSBCSU9TZXMgb3ZlcndyaXRlIHRoaXMgdmFsdWUsIGFjY29yZGluZworCXRvIHRoZSBzdG9yYWdlIG1vZGUgKGUuZy4gVVNCIEZsb3BweSBvciBVU0IgSEREKS4KKworMjAwNS0wMi0xNiAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBncnViL2FzbXN0dWIuYyAoZ3J1Yl9zdGFnZTIpOiBSZW1vdmUgdGhlIGF0dHJpYnV0ZSBgdm9sYXRpbGUnCisJZnJvbSBkb2l0LiBJIGhvcGUgdGhpcyBjaGFuZ2UgaXMgc2FmZSBmb3IgYWxsIGNvbXBpbGVycy4KKworMjAwNS0wMi0xNSAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoaW5zdGFsbF9mdW5jKTogSWYgREVTVF9EUklWRSBpcyBhIGhhcmQKKwlkaXNrLCBlbmFibGUgdGhlIHdvcmthcm91bmQgaW4gU3RhZ2UgMSBieSByZXBsYWNpbmcgdGhlIGptcAorCXdpdGggZG91YmxlIG5vcCdzLgorCisJKiBzdGFnZTEvc3RhZ2UxLmggKFNUQUdFMV9CT09UX0RSSVZFX0NIRUNLKTogTmV3IG1hY3JvLgorCShTVEFHRTFfQk9PVF9EUklWRV9NQVNLKTogUmVtb3ZlZC4KKworCSogc3RhZ2UxL3N0YWdlMS5TIChib290X2RyaXZlX2NoZWNrKTogTmV3IGxhYmVsLiBUaGlzIGltcGxlbWVudHMKKwlhIGRpZmZlcmVudCB3b3JrYXJvdW5kIGZvciBidWdneSBCSU9TZXMgd2hpY2ggZG9uJ3QgcGFzcyBib290CisJZHJpdmUgY29ycmVjdGx5LiBUaGlzIGlzIGVmZmVjdGl2ZSBmb3IgQklPU2VzIHdoaWNoIHBhc3MgYSB2YWx1ZQorCXdpdGhvdXQgdGhlIHNldmVudGggYml0ICgweDgwKS4KKwkoYm9vdF9kcml2ZV9tYXNrKTogUmVtb3ZlZC4KKworMjAwNS0wMi0wMyAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBncnViL2FzbXN0dWIuYyAoY29uc29sZV9jdXJyZW50X2NvbG9yKTogTWFrZSBpdCBnbG9iYWwgYXMKKwlkZWNsYXJlZC4KKwkoZ3J1Yl9zdGFnZTIpOiBUd2VhayB0aGUgZGVjbGFyYXRpb24gYW5kIHRoZSBkZWZpbml0aW9uIG9mIHRoZQorCW5lc3RlZCBmdW5jdGlvbiBkb2l0LgorCisyMDA1LTAyLTAyICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIHN0YWdlMi9zbXAtaW1wcy5oIChpbXBzX2FueV9uZXdfYXBpY3MpOiBSZW1vdmVkLgorCShpbXBzX2VuYWJsZWQpOiBMaWtld2lzZS4KKwkoaW1wc19sYXBpY19hZGRyKTogTGlrZXdpc2UuCisJKGltcHNfbnVtX2NwdXMpOiBMaWtld2lzZS4KKwkoaW1wc19jcHVfYXBpY19tYXApOiBMaWtld2lzZS4KKwkoaW1wc19hcGljX2NwdV9tYXApOiBMaWtld2lzZS4KKworCSogc3RhZ2UyL01ha2VmaWxlLmFtIChsaWJncnViX2FfQ0ZMQUdTKTogUmVtb3ZlCisJLWZ3cml0YWJsZS1zdHJpbmdzLiBOb3QgcmVxdWlyZWQgZm9yIHRoZSBncnViIHNoZWxsIGFjdHVhbGx5LgorCisJKiBncnViL01ha2VmaWxlLmFtIChBTV9DRkxBR1MpOiBMaWtld2lzZS4KKworMjAwNS0wMi0wMSAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBncnViL2FzbXN0dWIuYyAoZ3J1Yl9zdGFnZTIpOiBVc2UgYXV0byBpbnN0ZWFkIG9mIHN0YXRpYyBmb3IKKwluZXN0ZWQgZnVuY3Rpb25zLgorCisJKiBzdGFnZTIvY2hhcl9pby5jIChtZW1jaGVjaykgW0dSVUJfVVRJTF06IExpa2V3aXNlLgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoYmxvY2tsaXN0X2Z1bmMpOiBMaWtld2lzZS4KKwkoY29sb3JfZnVuYyk6IExpa2V3aXNlLgorCShpbnN0YWxsX2Z1bmMpOiBMaWtld2lzZS4KKwkoc2V0a2V5X2Z1bmMpOiBMaWtld2lzZS4KKworCSogbGliL2RldmljZS5jIChyZWFkX2RldmljZV9tYXApOiBMaWtld2lzZS4KKworMjAwNS0wMS0zMCAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisgICAgICAgICogY29uZmlndXJlLmFjIChBQ19JTklUKTogVXBncmFkZWQgdG8gMC45Ni4KKworMjAwNC0xMC0xMSBKYXNvbiBUaG9tYXMgPGphc29uQHN0YWZmLnBuYy5jb20uYXU+CisKKwlQYXRjaCBmcm9tIFN0ZWZhbnVzIER1IFRvaXQgIDxzamR1dG9pdEB1d2F0ZXJsb28uY2E+CisJKiBkb2NzL2tlcm5lbC5jLnRleGkgKGNtYWluKTogSW5jcmVtZW1lbnQgbW9kIGJ5IG9uZSwgaW5zdGVhZCBvZgorCXNpemVvZihtb2R1bGVfdCksIHNpbmNlIGl0J3MgYWxyZWFkeSBhIHBvaW50ZXIgb2YgdHlwZSBtb2R1bGVfdC4KKwkqIGRvY3Mva2VybmVsLmMgKGNtYWluKTogRG8gdGhlIHNhbWUuCisKKzIwMDQtMDktMjAgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogZG9jcy9pbnRlcm5hbHMudGV4aSAoSW50ZXJuYWxzKTogQ2hhbmdlZCB0byBhbiBhcHBlbmRpeC4KKworCSogZG9jcy9ncnViLnRleGkgKEBzZXRjaGFwdGVybmV3cGFnZSk6IENoYW5nZWQgdG8gb2RkIGZyb20gb2ZmLgorCShAY29udGVudHMpOiBNb3ZlZCB0byB0aGUgYmVnaW5uaW5nLgorCShGdXR1cmUpOiBDaGFuZ2VkIHRvIGFuIGFwcGVuZGl4LgorCisyMDA0LTA4LTE3ICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIHN0YWdlMi9jbWRsaW5lLmMgKHJ1bl9zY3JpcHQpOiBGaXggYSByZXZlcnNlZCBjb25kaXRpb25hbC4KKwlSZXBvcnRlZCBieSBBbGJhbiBDcmVxdXkgPGFsYmFuLmNyZXF1eUBhcGluYy5vcmc+LgorCisyMDA0LTA4LTA3ICBKYXNvbiBUaG9tYXMgIDxqYXNvbkBzdGFmZi5wbmMuY29tLmF1PgorCQorCUZyb20gTWljaGFlbCBIb2huYmF1bSA8aG9obmJhdW1AdXMuaWJtLmNvbT46CisJKiBzdGFnZTIvZnN5c19leHQyZnMuYyAoZXh0MmZzX3JlYWQpOiBIYW5kbGUgc3BhcnNlIGZpbGVzLgorCisyMDA0LTA3LTI0ICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIHN0YWdlMi9zdGFnZTIuYyAoY21haW4pOiBUZXJtaW5hdGUgREVGQVVMVF9GSUxFIHdpdGggTlVMCisJY29ycmVjdGx5LiBSZXBvcnRlZCBieSBBbGJhbiBDcmVxdXkgPGFsYmFuLmNyZXF1eUBhcGluYy5vcmc+LgorCisyMDA0LTA3LTIxICBSb2JlcnQgTWlsbGFuICA8cm9iZXJ0bWhAZ251Lm9yZz4KKworCVBhdGNoIGZyb20gRGF2aWQgV2VpbmVoYWxsIDx0YW9AZGViaWFuLm9yZz4KKwkqIHV0aWwvbWtiaW1hZ2U6IEZpeCBYU0ktaXNtcyAoZm9yIHN1cHBvcnRpbmcgUE9TSVgtb25seSBzaGVsbHMpLgorCisyMDA0LTA3LTIwICBSb2JlcnQgTWlsbGFuICA8cm9iZXJ0bWhAZ251Lm9yZz4KKworCSogdXRpbC9ncnViLWluc3RhbGwuaW46IERldGVjdCBHTlUvaypCU0Qgc3lzdGVtcyBhcyB3ZWxsLgorCisyMDA0LTA3LTE2ICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIHV0aWwvZ3J1Yi1pbnN0YWxsLmluIChjb252ZXJ0KTogRml4IHRoZSBzZWQgc3RhdGVtZW50IGZvcgorCUxpbnV4LiBUaGUgZXhwcmVzc2lvbiB3YXMgYW1iaWdpb3VzIGluIHNvbWUgY2FzZXMuCisKKzIwMDQtMDYtMjkgIFJvYmVydCBNaWxsYW4gIDxyb2JlcnRtaEBnbnUub3JnPgorCisJKiB1dGlsL2dydWItc2V0LWRlZmF1bHQuaW46IEZpeCBtaW5vciBzeW50YXggZXJyb3IgKG5vbi1lc2NhcGVkCisJY2hhcmFjdGVycykuCisKKzIwMDQtMDYtMjQgIFJvYmVydCBNaWxsYW4gIDxyb2JlcnRtaEBnbnUub3JnPgorCisJRml4ZXMgZm9yIEZIUyBjb21wbGlhbmNlLiAoL3Vzci9zaGFyZSBpcyBmb3IgYXJjaC1pbmRlcGVuZGFudCBkYXRhKQorCSogc3RhZ2UxL01ha2VmaWxlLmFtOiBNb3ZlIHN0YWdlIGZpbGVzIHRvIHBrZ2xpYmRpci4KKwkqIHN0YWdlMi9NYWtlZmlsZS5hbTogTGlrZXdpc2UuCisJKiBkb2NzL2dydWIudGV4aTogcywvdXNyL3NoYXJlLC91c3IvbGliLGcuCisJKiB1dGlsL2dydWItaW1hZ2UuaW46IExvb2sgZm9yIHN0YWdlIGZpbGVzIGluIHBrZ2xpYmRpci4KKwkqIHV0aWwvZ3J1Yi1pbnN0YWxsLmluOiBMaWtld2lzZS4KKworCSogdXRpbC9ncnViLWluc3RhbGwuaW46IEltcHJvdmUgdXNhZ2UgbWVzc2FnZS4KKworMjAwNC0wNi0yMCAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJVGhpcyBpcyBhIGJpZyBjaGFuZ2Ugb24gc2F2aW5nIGEgZGVmYXVsdCBlbnRyeS4gVGhpcyBjaGFuZ2UKKwltYWtlcyBpdCBwb3NzaWJsZSB0byBzZXQgdXAgYSBxdWl0ZSByb2J1c3Qgc3lzdGVtIHVzaW5nIEdSVUIuCisJTm93IHdlIGRvIG5vdCB1c2UgdGhlIHNlY29uZCBzZWN0b3Igb2YgU3RhZ2UgMiB0byBzdG9yZSBhbgorCWVudHJ5IG51bWJlciBidXQgdXNlIHRoZSBmaWxlIC9ib290L2dydWIvZGVmYXVsdC4gVGhpcyBmaWxlCisJbXVzdCBiZSBnZW5lcmF0ZWQgYnkgZ3J1Yi1zZXQtZGVmYXVsdCwgYWx0aG91Z2ggdGhpcyBmaWxlIGlzCisJcGxhaW4tdGV4dC4KKwkKKwkqIHV0aWwvZ3J1Yi1zZXQtZGVmYXVsdC5pbjogTmV3IGZpbGUuCisJCisJKiB1dGlsL2dydWItaW5zdGFsbC5pbiAoZ3J1Yl9zZXRfZGVmYXVsdCk6IE5ldyB2YXJpYWJsZS4KKwlVc2UgL2dydWIgaW5zdGVhZCBvZiAvYm9vdC9ncnViIG9uIE9wZW5CU0QgYXMgd2VsbCBhcyBOZXRCU0QuCisJUnVuIGdydWItc2V0LWRlZmF1bHQgdG8gbWFrZSBhIGRlZmF1bHQgZmlsZS4KKworCSogdXRpbC9NYWtlZmlsZS5hbSAoc2Jpbl9TQ1JJUFRTKTogQWRkZWQgZ3J1Yi1zZXQtZGVmYXVsdC4KKworCSogc3RhZ2UyL3N0YWdlMi5jIChydW5fbWVudSk6IENoYW5nZSB0aGUgZmFsbGJhY2sgaGFuZGxpbmcgdG8KKwlzdXBwb3J0IG11bHRpcGxlIGZhbGxiYWNrIGVudHJpZXMuCisJKGNtYWluKTogTGlrZXdpc2UuIEFsc28sIGdldCBhIHNhdmVkIGVudHJ5IGZyb20gYSBkZWZhdWx0IGZpbGUKKwlpZiBwb3NzaWJsZSwgYmVmb3JlIHJlYWRpbmcgYSBjb25maWcgZmlsZS4KKworCSogc3RhZ2UyL3NoYXJlZC5oIChERUZBVUxUX0ZJTEVfQlVGKTogTmV3IG1hY3JvLgorCShERUZBVUxUX0ZJTEVfQlVGTEVOKTogTGlrZXdpc2UuCisJKENNRExJTkVfQlVGKTogU2V0IHRvIERFRkFVTFRfRklMRV9CVUYgKyBERUZBVUxUX0ZJTEVfQlVGTEVOLgorCShNRU5VX0JVRkxFTik6IFNldCB0byAweDgwMDAgKyBQQVNTV09SRF9CVUYgLSBNRU5VX0JVRi4KKwkoZmFsbGJhY2tfZW50cnkpOiBSZW1vdmVkLgorCShmYWxsYmFja19lbnRyaWVzKTogRGVjbGFyZWQuCisJKGZhbGxiYWNrX2VudHJ5bm8pOiBMaWtld2lzZS4KKwkoTUFYX0ZBTExCQUNLX0VOVFJJRVMpOiBOZXcgbWFjcm8uCisKKwkqIHN0YWdlMi9jbWRsaW5lLmMgKHJ1bl9zY3JpcHQpOiBVc2UgRkFMTEJBQ0tfRU5UUllOTyBpbnN0ZWFkIG9mCisJRkFMTEJBQ0tfRU5UUlkuCisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChmYWxsYmFja19lbnRyeSk6IFJlbW92ZWQuCisJKGZhbGxiYWNrX2VudHJ5bm8pOiBOZXcgdmFyaWFibGUuCisJKGZhbGxiYWNrX2VudHJpZXMpOiBMaWtld2lzZS4KKwkoaW5pdF9jb25maWcpOiBJbml0aWFsaXplIEZBTExCQUNLX0VOVFJZTk8gYW5kIEZBTExCQUNLX0VOVFJJRVMuCisJKGZhbGxiYWNrX2Z1bmMpOiBSZXdyaXR0ZW4gY29tcGxldGVseS4KKwkoc2F2ZWRlZmF1bHRfZnVuYyk6IExpa2V3aXNlLgorCisJKiBkb2NzL2dydWIudGV4aSAoZ3J1Yi1zZXQtZGVmYXVsdCk6IE5ldyBkaXJlbnRyeS4KKwkoSW5zdGFsbGF0aW9uKTogRGVzY3JpYmUgZ3J1Yi1zZXQtZGVmYXVsdCBmb3IgbWFudWFsCisJaW5zdGFsbGF0aW9ucy4KKwkoTWFraW5nIHlvdXIgc3lzdGVtIHJvYnVzdCk6IE5ldyBzZWN0aW9uLgorCShCb290aW5nIG9uY2Utb25seSk6IE5ldyBzdWJzZWN0aW9uLgorCShCb290aW5nIGZhbGxiYWNrIHN5c3RlbXMpOiBMaWtld2lzZS4KKwkoZmFsbGJhY2spOiBEZXNjcmliZSBtdWx0aXBsZSBmYWxsYmFjayBlbnRyaWVzLgorCShzYXZlZGVmYXVsdCk6IERlc2NyaWJlIGFuIG9wdGlvbmFsIGFyZ3VtZW50LgorCShJbnZva2luZyBncnViLXNldC1kZWZhdWx0KTogTmV3IGNoYXB0ZXIuCisJKEZ1dHVyZSk6IFJlcGxhY2VkIHdpdGggYSBkZXNjcmlwdGlvbiBhYm91dCBHUlVCIDIuCisKKwkqIGNvbmZpZ3VyZS5hYyAoQUNfQ09ORklHX0ZJTEVTKTogQWRkZWQgdXRpbC9ncnViLXNldC1kZWZhdWx0LgorCisyMDA0LTA2LTE5ICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIHN0YWdlMi91ZnMyLmggKGludDhfdCk6IFJlbmFtZWQgdG8gLi4uCisJKGdydWJfdWludDhfdCk6IC4uLiB0aGlzLgorCShpbnQxNl90KTogUmVuYW1lZCB0byAuLi4KKwkoZ3J1Yl9pbnQxNl90KTogLi4uIHRoaXMuCisJKGludDMyX3QpOiBSZW5hbWVkIHRvIC4uLgorCShncnViX2ludDMyX3QpOiAuLi4gdGhpcy4KKwkoaW50NjRfdCk6IFJlbmFtZWQgdG8gLi4uCisJKGdydWJfaW50NjRfdCk6IC4uLiB0aGlzLgorCSh1aW50OF90KTogUmVuYW1lZCB0byAuLi4KKwkoZ3J1Yl91aW50OF90KTogLi4uIHRoaXMuCisJKHVpbnQxNl90KTogUmVuYW1lZCB0byAuLi4KKwkoZ3J1Yl91aW50MTZfdCk6IC4uLiB0aGlzLgorCSh1aW50MzJfdCk6IFJlbmFtZWQgdG8gLi4uCisJKGdydWJfdWludDMyX3QpOiAuLi4gdGhpcy4KKwkodWludDY0X3QpOiBSZW5hbWVkIHRvIC4uLgorCShncnViX3VpbnQ2NF90KTogLi4uIHRoaXMuCisJKHVfY2hhcik6IFJlbmFtZWQgdG8gLi4uCisJKGdydWJfdV9jaGFyKTogLi4uIHRoaXMuCisJKHVfaW50KTogUmVuYW1lZCB0byAuLi4KKwkoZ3J1Yl91X2ludCk6IC4uLiB0aGlzLgorCSh1X2ludDhfdCk6IFJlbmFtZWQgdG8gLi4uCisJKGdydWJfdV9pbnQ4X3QpOiAuLi4gdGhpcy4KKwkodV9pbnQxNl90KTogUmVuYW1lZCB0byAuLi4KKwkoZ3J1Yl91X2ludDE2X3QpOiAuLi4gdGhpcy4KKwkodV9pbnQzMl90KTogUmVuYW1lZCB0byAuLi4KKwkoZ3J1Yl91X2ludDMyX3QpOiAuLi4gdGhpcy4KKwkodV9pbnQ2NF90KTogUmVuYW1lZCB0byAuLi4KKwkoZ3J1Yl91X2ludDY0X3QpOiAuLi4gdGhpcy4KKwkoaW5vX3QpOiBSZW5hbWVkIHRvIC4uLgorCShncnViX2lub190KTogLi4uIHRoaXMuCisJQWxsIGNhbGxlcnMgYXJlIGNoYW5nZWQuCisKKzIwMDQtMDYtMTQgIEplcm9lbiBEZWtrZXJzICA8amVyb2VuQGRla2tlcnMuY3g+CisKKwkqIHN0YWdlMi91ZnMyLmggKF9fdWludDhfdCk6IFJlbW92ZS4KKwkoX191aW50MTZfdCk6IExpa2V3aXNlLgorCShfX3VpbnQzMl90KTogTGlrZXdpc2UuCisJKF9fdWludDY0X3QpOiBMaWtld2lzZS4KKwkoaW5vX3QpOiBUeXBlZGVmIHRvIHVpbnQzMl90LgorCisyMDA0LTA2LTEzICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIHN0YWdlMi9NYWtlZmlsZS5hbSAobm9pbnN0X0hFQURFUlMpOiBBZGRlZCB1ZnMyLmguCisJCisyMDA0LTA2LTEzICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYyAoQUNfSU5JVCk6IFVwZ3JhZGVkIHRvIDAuOTUuCisKKzIwMDQtMDUtMjMgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogc3RhZ2UyL2NoYXJfaW8uYyAoZ3J1Yl9pc3NwYWNlKTogVXNlIGEgc3dpdGNoIHNlbnRlbnNlIGluc3RlYWQKKwlvZiBhbiBpZiBzZW50ZW5zZSwgYmVjYXVzZSB0aGF0IHJlZHVjZXMgdGhlIHNpemUuCisKKwkqIGxpYi9kZXZpY2UuYyAocmVhZF9kZXZpY2VfbWFwKTogQ2hhbmdlIHRoZSBtYXggbnVtYmVyIG9mIERSSVZFCisJdG8gMTI3IGZyb20gOC4gVGhpcyB3YXMgdG9vIHN0cmljdC4KKworCSogc3RhZ2UyL2FzbS5TIChzdG9wX2Zsb3BweSk6IENhbGwgcHVzaGEgYW5kIHBvcGEgb3V0c2lkZSB0aGUKKwlibG9jayBvZiByZWFsIG1vZGUgY29kZS4gUmVwb3J0ZWQgYnkgR3VpbGxlbSBKb3ZlcgorCTxndWlsbGVtQGRlYmlhbi5vcmc+LgorCisyMDA0LTA1LTIwICBEYW1pYW4gSXZlcmVpZ2ggIDxkYW1pYW5AY2lzY28uY29tPgorCisJKiBuZXRib290L21haW4uYzogRml4ZWQgYm9vdHAgb25seSBjb2RlIHNvIHRoYXQgb3B0aW9ucworCXdvcmsgcHJvcGVybHkuIFRoaXMgZml4IGlzIG9idmlvdXMgd2hlbiBjb21wYXJlZCB3aXRoIHRoZQorCURIQ1AgY29kZS4KKworMjAwNC0wNS0xNyAgUGF2ZWwgUm9za2luICA8cHJvc2tpQGdudS5vcmc+CisKKwkqIHN0YWdlMi9jaGFyX2lvLmMgKHNhZmVfcGFyc2VfbWF4aW50KTogRGlzYWJsZSBmb3Igc3RhZ2UgMS41LgorCShncnViX3RvbG93ZXIpOiBEaXNhYmxlIGZvciBzdGFnZSAxLjUgZXhjZXB0IGZhdF9zdGFnZTFfNS4KKwkoZ3J1Yl9tZW1jbXApOiBEaXNhYmxlIGZvciBzdGFnZSAxLjUgZXhjZXB0IGlzbzk2NjBfc3RhZ2UxXzUuCisKKzIwMDQtMDUtMTQgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCUZyb20gU2VyZ2V5IE1hdHZleWNodWsgPHNlbUBjaWFtLnJ1PjoKKwkqIHN0YWdlMi9zaXplX3Rlc3Q6IEFkZGVkIGEgY2hlY2sgZm9yIHVmczJfc3RhZ2UxXzUuCisKKwkqIHN0YWdlMi9zaGFyZWQuaCAoU1RBR0UyX0lEX1VGUzJfU1RBR0UxXzUpOiBOZXcgbWFjcm8uCisJW0ZTWVNfVUZTMl0gKFNUQUdFMl9JRCk6IFNldCB0byBTVEFHRTJfSURfVUZTMl9TVEFHRTFfNS4KKworCSogc3RhZ2UyL2ZpbGVzeXMuaCAoRlNZU19VRlMyX05VTSk6IE5ldyBtYWNyby4KKwlbRlNZU19VRlMyXSAodWZzMl9tb3VudCk6IE5ldyBwcm90b3R5cGUuCisJW0ZTWVNfVUZTMl0gKHVmczJfcmVhZCk6IExpa2V3aXNlLgorCVtGU1lTX1VGUzJdICh1ZnMyX2Rpcik6IExpa2V3aXNlLgorCVtGU1lTX1VGUzJdICh1ZnMyX2VtYmVkKTogTGlrZXdpc2UuCisJKE5VTV9GU1lTKTogQWRkZWQgRlNZU19VRlMyX05VTS4KKworCSogc3RhZ2UyL2Rpc2tfaW8uYyAoZnN5c190YWJsZSk6IEFkZGVkIGFuIHVmczIgZW50cnkuCisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChzZXR1cF9mdW5jKTogQWRkZWQgdWZzMiBpbnRvIHRoZQorCVNUQUdFMV81X01BUC4KKworCSogc3RhZ2UyL01ha2VmaWxlLmFtIChsaWJncnViX2FfU09VUkNFUyk6IEFkZGVkIGZzeXNfdWZzMi5jLgorCShsaWJncnViX2FfQ0ZMQUdTKTogQWRkZWQgLURGU1lTX1VGUzI9MS4KKwkocGtnZGF0YV9EQVRBKTogQWRkZWQgdWZzMl9zdGFnZTFfNS4KKwkobm9pbnN0X1BST0dSQU1TKTogQWRkZWQgdWZzMl9zdGFnZTFfNS5leGVjLgorCSh1ZnMyX3N0YWdlMV81X2V4ZWNfU09VUkNFUyk6IE5ldyB2YXJpYWJsZS4KKwkodWZzMl9zdGFnZTFfNV9leGVjX0NGTEFHUyk6IExpa2V3aXNlLgorCSh1ZnMyX3N0YWdlMV81X2V4ZWNfQ0NBU0ZMQUdTKTogTGlrZXdpc2UuCisJKHVmczJfc3RhZ2UxXzVfZXhlY19MREZMQUdTKTogTGlrZXdpc2UuCisKKwkqIGdydWIvTWFrZWZpbGUuYW0gKEFNX0NQUEZMQUdTKTogQWRkZWQgLURGU1lTX0lTTzk2NjA9MSwKKwktREZTWVNfSkZTPTEsIC1ERlNZU19SRUlTRVJGUz0xLCAtREZTWVNfVUZTMj0xLCAtREZTWVNfVlNUQUZTPTEsCisJLURGU1lTX1hGUz0xLCBhbmQgLURVU0VfTUQ1X1BBU1NXT1JEUz0xLgorCisJKiBjb25maWd1cmUuYWMgKC0tZGlzYWJsZS11ZnMyKTogTmV3IG9wdGlvbi4KKworCSogc3RhZ2UyL2ZzeXNfdWZzMi5jOiBOZXcgZmlsZS4KKwkqIHN0YWdlMi91ZnMyLmg6IExpa2V3aXNlLgorCisyMDA0LTA1LTEwICBSb2JlcnQgTWlsbGFuICA8cm9iZXJ0bWhAZ251Lm9yZz4KKworCSogbGliL2RldmljZS5jOiBNYW5nbGUgX19GcmVlQlNEXyogbWFjcm8gdXNhZ2UgdG8gc3VwcG9ydAorCWtGcmVlQlNELWJhc2VkIG5vbi1GcmVlQlNEIHN5c3RlbXMgKGkuZS4gR05VL2tGcmVlQlNEKS4KKworCUltcGxlbWVudCBydW50aW1lIGRldGVjdGlvbiBvZiB2ZXJzaW9uIG9mIGtGcmVlQlNELiBOb3cgaWYKKwl3ZSBidWlsZCBhZ2FpbnN0IGtGcmVlQlNEIDUueCBoZWFkZXJzIHRoZSBHUlVCIHNoZWxsIHdpbGwgd29yayBvbgorCWJvdGggNC54IGFuZCA1LnguCisKKwlSZXBsYWNlIGB1X2ludF90JyB0eXBlcyB3aXRoIHBvcnRhYmxlIGB1bnNpZ25lZCBpbnQnIGFuZCBvbGQKKwlyZWZlcmVuY2UgdG8gYGdlb21ldHJ5JyBzdHJ1Y3R1cmUgdG8gbmV3IGBnZW9tJyBvbmUuCisKKwkqIGRvY3MvbWVudS5sc3Q6IFNwbGl0IEdOVS9rRnJlZUJTRCBhbmQgR05VL2tOZXRCU0QgYXMgc2VwYXJhdGUKKwlvcHRpb25zIHRoYW4gRnJlZUJTRCBhbmQgTmV0QlNELCByZXNwZWN0aXZlbHkuIFRoZXJlIGFyZSBtaW5vcgorCWRpZmZlcmVuY2VzIG5vdyAoZGlmZmVyZW50IHBhdGhzKS4KKworMjAwNC0wNS0wMyAgUGF2ZWwgUm9za2luICA8cHJvc2tpQGdudS5vcmc+CisKKwkqIHN0YWdlMi9jaGFyX2lvLmMgKGNvbnZlcnRfdG9fYXNjaWkpOiBSZW1vdmUgIiViIiBzdXBwb3J0LgorCUl0J3Mgbm9uLXN0YW5kYXJkIGFuZCBpcyBub3QgdXNlZCBhbnltb3JlLgorCShncnViX3ByaW50Zik6IExpa2V3aXNlLgorCisyMDA0LTA0LTI5ICBSb2JlcnQgTWlsbGFuICA8cm9iZXJ0bWhAZ251Lm9yZz4KKworCUZyb20gWWFubiBEaXJzb24gIDxkaXJzb25AZGViaWFuLm9yZz46CisJKiB1dGlsL21rYmltYWdlOiBNaXNjIHN5bnRheCBmaXhlcy4KKworMjAwNC0wNC0yOSAgSmVyb2VuIERla2tlcnMgIDxqZXJvZW5AZGVra2Vycy5jeD4KKworCSogc3RhZ2UyL2NoYXJfaW8uYyAoZ3J1Yl9tZW1jbXApOiBEZWZpbmUgZm9yIHN0YWdlMS41IHRvby4KKworCSogc3RhZ2UyL2ZzeXNfaXNvOTY2MC5jIChpc285NjYwX21vdW50KTogVXNlIG1lbWNtcCgpIGluc3RlYWQgb2YKKwlfX2J1aWx0aW5fbWVtY21wKCkuCisJKGlzbzk2NjBfZGlyKTogTGlrZXdpc2UuCisKKzIwMDQtMDQtMjYgIENocmlzdGlhbiBKb25lcyAgPGNoam9uZXNAYWxlcGgwLmNvbT4KKworCSogZG9jcy9ncnViLnRleGkgKE1ha2luZyBhIEdSVUIgYm9vdGFibGUgQ0QtUk9NKTogbWlub3IgZWRpdHMsCisJaW5jbHVkaW5nIGEgZmV3IGNvbXBhdGliaWxpdHkgbm90ZXMgYW5kIGEgY2hhbmdlIHRvCisJLWJvb3QtbG9hZC1zaXplIDQgZm9yIHRoZSBta2lzb2ZzIGNvbW1hbmQuCisKKzIwMDQtMDQtMjIgIEplcm9lbiBEZWtrZXJzICA8amVyb2VuQGRla2tlcnMuY3g+CisKKwkqIE1ha2VmaWxlLmFtIChBVVRPTUFLRV9PUFRJT05TKTogQWRkICJnbnUiLgorCSogY29uZmlndXJlLmFjOiBVcGRhdGUgdG8gd29yayB3aXRoIGF1dG9tYWtlIDEuOCwgcXVvdGUgYWxsCisJQUNfREVGVU4ncyBjb3JyZWN0bHkgYW5kIHByb3ZpZGUgZGVzY3JpcHRpb25zIGZvciBBQ19ERUZJTkUncy4KKwkqIGFjaW5jbHVkZS5tNDogTGlrZXdpc2UuCisJKiBhY2NvbmZpZy5oOiBSZW1vdmVkLgorCQorCSogc3RhZ2UxL01ha2VmaWxlLmFtICguZXhlYyk6IFVzZSBzdWZmaXggcnVsZXMgaW5zdGVhZCBvZiBwYXR0ZXJuCisJcnVsZXMuCisJKiBzdGFnZTIvTWFrZWZpbGUuYW0gKC5leGVjKTogTGlrZXdpc2UuCisKKzIwMDQtMDQtMTggIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogZG9jcy9ncnViLnRleGkgKE1ha2luZyBhIEdSVUIgYm9vdGFibGUgQ0QtUk9NKTogTmV3IHNlY3Rpb24uCisKKwkqIHN0YWdlMi9kaXNrX2lvLmMgKHNldF9kZXZpY2UpOiBVc2UgQ0ggaW5zdGVhZCBvZiAqREVWSUNFIHRvCisJdGVzdCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIERFVklDRSwgYmVjYXVzZSBERVZJQ0UgaXMKKwlpbmNyZW1lbnRlZC4KKwlSZXBvcnRlZCBieSBCZXJuaGFyZCBUcmV1dHdlaW4uCisKKzIwMDQtMDQtMTUgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogbmV0Ym9vdC9mc3lzX3RmdHAuYyAoYnVmX2ZpbGwpOiBDYXN0IDEgdG8gdW5zaWduZWQgc2hvcnQKKwlleHBsaWNpdGx5IHNvIHRoYXQgdGhlIGNvbnN0YW50IGRvZXNuJ3QgZXh0ZW5kIHVuc2lnbmVkIHNob3J0CisJdG8gaW50IGF1dG9tYXRpY2FsbHkuCisJUmVwb3J0ZWQgYnkgRWR1YXJkIEd1em92c2t5IDxlZ3V6b3Zza0BlbnRlcmFzeXMuY29tPi4KKworCSogZG9jcy9ncnViLnRleGkgKEludm9raW5nIGdydWItbWQ1LWNyeXB0KTogRml4ZWQgdGhlIGNoYXB0ZXIKKwluYW1lLgorCVJlcG9ydGVkIGJ5IE1hcnRpbiBQb29sIDxtYnBAc291cmNlZnJvZy5uZXQ+LgorCisyMDA0LTA0LTA0ICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIGNvbmZpZ3VyZS5hYyAoU1RBR0UyX0NGTEFHUyk6IENoZWNrIGlmIC1mbm8tc3RhY2stcHJvdGVjdG9yIGlzCisJc3VwcG9ydGVkIGJ5IEdDQy4gSWYgeWVzLCBhZGRlZCB0aGUgb3B0aW9uLiBUaGlzIGlzIG5lY2Vzc2FyeQorCWZvciBPcGVuQlNELCBiZWNhdXNlIHRoZSBzdGFjayBwcm90ZWN0b3IgZGVmaW5lcyBhZGRpdGlvbmFsCisJc3ltYm9scy4gUmVwb3J0ZWQgYnkgdWMuc2hlZGEgPHVjLnNoZWRhQGxhcG9zdGUubmV0Pi4KKworMjAwNC0wMy0yOCAgUGF2ZWwgUm9za2luICA8cHJvc2tpQGdudS5vcmc+CisKKwkqIHN0YWdlMi9ib290LmM6IEltcGx5IC0tbm8tbWVtLW9wdGlvbiBmb3IgTGludXgga2VybmVscyB3aXRoCisJcHJvdG9jb2wgdmVyc2lvbiAyLjAzIGFuZCBhYm92ZSAoTGludXggMi40LjE4IGFuZCBuZXdlcikuCisKKzIwMDQtMDMtMjcgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogc3RhZ2UyL2NoYXJfaW8uYyBbIUdSVUJfVVRJTF0gKG1lbWNweSk6IE5ldyBmdW5jdGlvbi4gSXQgaXMKKwlkZWZpbmVkIGFzIGFuIGFsaWFzIG9mIGdydWJfbWVtbW92ZS4gVGhpcyBpcyBjb3BpZWQgZnJvbSBHUlVCIDIuCisKKwkqIHN0YWdlMi9kaXNrX2lvLmMgKHByaW50X2NvbXBsZXRpb25zKTogU2ltcGxpZmllZCBjb25kaXRpb25hbHMKKwl0byBtYWtlIGl0IGVhc2llciB0byBlZGl0IHRoZSBmaWxlIHdpdGggRW1hY3MuCisJQWRkZWQgc3VwcG9ydCBmb3IgKGNkKS4KKwkoc2V0X2RldmljZSk6IExpa2V3aXNlLgorCisJKiBzdGFnZTIvY29tbW9uLmMgKGluaXRfYmlvc19pbmZvKTogQ2hlY2sgaWYgQk9PVF9EUklWRSBpcyBhCisJQ0RST00gZHJpdmUuIElmIGl0IGlzIHRydWUsIHNldCBDRFJPTV9EUklWRSB0byBCT09UX0RSSVZFLgorCShjZHJvbV9kcml2ZSk6IE5ldyB2YXJpYWJsZS4KKworCUZyb20gTGVvbmlkIExpc292c2tpeSA8bGx5QHBpc2VtLm5ldD46CisJKiBzdGFnZTIvc3RhcnRfZWx0b3JpdG8uUzogTmV3IGZpbGUuCisKKwkqIHN0YWdlMi9zdGFnZTIuYyAocnVuX21lbnUpOiBVc2UgR1JVQl9JTlZBTElEX0RSSVZFIGluc3RlYWQgb2YKKwkweEZGLgorCisJKiBzdGFnZTIvc2hhcmVkLmggKFNUQUdFMl9JRF9JU085NjYwX1NUQUdFMV81KTogTmV3IG1hY3JvLgorCVtGU1lTX0lTTzk2NjBdIChTVEFHRTJfSUQpOiBTZXQgdG8gU1RBR0UyX0lEX0lTTzk2NjBfU1RBR0UxXzUuCisJKHN0cnVjdCBnZW9tZXRyeSk6IEFkZGVkIGEgbmV3IG1lbWJlciBgYHNlY3Rvcl9zaXplJycuCisJKEJJT1NESVNLX0ZMQUdfQ0RST00pOiBOZXcgbWFjcm8uCisJKGNkcm9tX2RyaXZlKTogRGVjbGFyZWQuCisKKwkqIHN0YWdlMi9mc3lzX2lzbzk2NjAuYzogTmV3IGZpbGUuCisJKiBzdGFnZTIvaXNvOTY2MC5oOiBMaWtld2lzZS4KKworCSogc3RhZ2UyL2ZpbGVzeXMuaCAoRlNZU19JU085NjYwX05VTSk6IE5ldyBtYWNyby4KKwlbRlNZU19JU085NjYwXSAoaXNvOTY2MF9tb3VudCk6IERlY2xhcmVkLgorCVtGU1lTX0lTTzk2NjBdIChpc285NjYwX3JlYWQpOiBMaWtld2lzZS4KKwlbRlNZU19JU085NjYwXSAoaXNvOTY2MF9kaXIpOiBMaWtld2lzZS4KKwkoTlVNX0ZTWVMpOiBBZGRlZCBGU1lTX0lTTzk2NjBfTlVNLgorCisJKiBzdGFnZTIvZGlza19pby5jIChmc3lzX3RhYmxlKSBbRlNZU19JU085NjYwXTogQWRkZWQgaXNvOTY2MC4KKwkoY3VycmVudF9kcml2ZSk6IFVzZSBHUlVCX0lOVkFMSURfRFJJVkUuCisJKGxvZzIpOiBOZXcgZnVuY3Rpb24uCisJKHJhd3JlYWQpOiBVc2UgQlVGX0dFT00uU0VDVE9SX1NJWkUgaW5zdGVhZCBvZiBTRUNUT1JfU0laRS4KKwlDaGFuZ2UgdGhlIHR5cGUgb2YgQlVGQUREUiBmcm9tIGludCB0byBjaGFyICouCisJVXNlIGEgdmlydHVhbCB0cmFjayB0byBtYWtlIHN1cmUgdGhhdCBvbmUgdHJhY2sgZml0cyBpbiB0aGUKKwlidWZmZXIuCisJKHNhbmVfcGFydGl0aW9uKTogQWxsb3cgQ1VSUkVOVF9EUklWRSB0byBiZSBDRFJPTV9EUklWRSwgYmVjYXVzZQorCWEgYmlvcyBkcml2ZSBmb3IgYSBDRC1ST00gaXMgb2Z0ZW4gYXNzaWduZWQgdG8gZ3JlYXRlciB0aGFuCisJMHg4OC4KKwkoc2V0X2RldmljZSk6IFVzZSBHUlVCX0lOVkFMSURfRFJJVkUgaW5zdGVhZCBvZiAweEZGLgorCShzZXR1cF9wYXJ0KTogTGlrZXdpc2UuCisKKwkqIHN0YWdlMi9jbWRsaW5lLmMgKGluaXRfY21kbGluZSk6IFVzZSBHUlVCX0lOVkFMSURfRFJJVkUuCisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChpbnN0YWxsX2Z1bmMpOiBVc2UgR1JVQl9JTlZBTElEX0RSSVZFLgorCShzZXR1cF9mdW5jKTogQWRkZWQgaXNvOTY2MF9zdGFnZTFfNS4KKworCSogc3RhZ2UyL2Jpb3MuYyAoYmlvc2Rpc2spOiBEb24ndCBmYWxsIGJhY2sgdG8gdGhlIENIUyBtb2RlCisJaWYgdGhlIGRyaXZlIGlzIGEgQ0RST00uCisJKGdldF9jZGluZm8pOiBOZXcgZnVuY3Rpb24uCisJKGdldF9kaXNraW5mbyk6IENhbGwgZ2V0X2NkaW5mbyBpZiB0aGUgZHJpdmUgaXMgZ3JlYXRlciB0aGFuIG9yCisJZXF1YWwgdG8gMHg4OCBvciB0aGUgZHJpdmUgc3VwcG9ydHMgTEJBLgorCVNldCB0aGUgc2VjdG9yIHNpemUgdG8gU0VDVE9SX1NJWkUgaWYgaXQgaXMgbm90IGEgQ0QtUk9NLgorCisJKiBzdGFnZTIvYXNtLlMgKGJpb3NkaXNrX2ludDEzX2V4dGVuc2lvbnMpOiBUYWtlIGEgd29yZAorCWFyZ3VtZW50IEFYIGluc3RlYWQgb2YgYSBieXRlIGFyZ3VtZW50IEFILgorCShnZXRfZGlza2luZm9faW50MTNfZXh0ZW5zaW9ucyk6IFJlbW92ZWQuCisKKwkqIHN0YWdlMi9NYWtlZmlsZS5hbSAobm9pbnN0X0hFQURFUlMpOiBBZGRlZCBpc285NjYwLmguCisJKGxpYmdydWJfYV9TT1VSQ0VTKTogQWRkZWQgZnN5c19pc285NjYwLmMuCisJKGxpYmdydWJfYV9DRkxBR1MpOiBBZGRlZCAtREZTWVNfSVNPOTY2MD0xLgorCShwa2dkYXRhX0RBVEEpOiBBZGRlZCBpc285NjYwX3N0YWdlMV81IGFuZCBzdGFnZTJfZWx0b3JpdG8uCisJKG5vaW5zdF9QUk9HUkFNUyk6IEFkZGVkIGlzbzk2NjBfc3RhZ2UxXzUuZXhlYyBhbmQKKwlzdGFydF9lbHRvcml0by5leGVjLgorCShub2luc3RfREFUQSk6IEFkZGVkIHN0YXJ0X2VsdG9yaXRvLgorCShwcmVfc3RhZ2UyX2V4ZWNfU09VUkNFUyk6IEFkZGVkIGZzeXNfaXNvOTY2MC5jLgorCShTVEFSVF9FTFRPUklUT19MSU5LKTogTmV3IHZhcmlhYmxlLgorCShzdGFydF9lbHRvcml0b19leGVjX1NPVVJDRVMpOiBMaWtld2lzZS4KKwkoc3RhcnRfZWx0b3JpdG9fZXhlY19DQ0FTRkxBR1MpOiBMaWtld2lzZS4KKwkoc3RhcnRfZWx0b3JpdG9fZXhlY19MREZMQUdTKTogTGlrZXdpc2UuCisJKHN0YXJ0X2VsdG9yaXRvX2V4ZWMtc3RhcnQuJChPQkpFWFQpKTogTmV3IGRlcGVuZGVuY3kuCisJKHN0YWdlMl9lbHRvcml0byk6IE5ldyB0YXJnZXQuCisJKGlzbzk2NjBfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTKTogTmV3IHZhcmlhYmxlLgorCShpc285NjYwX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKTogTGlrZXdpc2UuCisJKGlzbzk2NjBfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MpOiBMaWtld2lzZS4KKwkoaXNvOTY2MF9zdGFnZTFfNV9leGVjX0xERkxBR1MpOiBMaWtld2lzZS4KKworCSogc3RhZ2UxL3N0YWdlMS5oIChHUlVCX0lOVkFMSURfRFJJVkUpOiBOZXcgbWFjcm8uCisKKwkqIHN0YWdlMS9zdGFnZTEuUyAoYm9vdF9kcml2ZSk6IFVzZSB0aGUgbWFjcm8gR1JVQl9JTlZBTElEX0RSSVZFLgorCShyZWFsX3N0YXJ0KTogTGlrZXdpc2UuCisKKwkqIGxpYi9kZXZpY2UuYyAoZ2V0X2RyaXZlX2dlb21ldHJ5KTogU2V0IEdFT00tPlNFQ1RPUl9TSVpFIHRvCisJU0VDVE9SX1NJWkUgYnkgZGVmYXVsdC4KKworCSogY29uZmlndXJlLmFjICgtLWRpc2FibGUtaXNvOTY2MCk6IE5ldyBvcHRpb24uCisKKzIwMDQtMDMtMTMgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKwkKKwlGcm9tIERhbmllbGUgWmVsYW50ZSA8emVsZGFuQGVtYWlsLml0PjoKKwkqIHN0YWdlMi9hc20uUyAoc3RvcF9mbG9wcHkpOiBVc2UgSU5UIDEzLCBBSD0wMGggdG8gc3RvcCB0aGUKKwlmbG9wcHkgY29udHJvbGxlciBpbnN0ZWFkIG9mIGEgZGlyZWN0IEkvTy4KKworMjAwNC0wMy0xMiAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBzdGFnZTIvc2VyaWFsLmMgKHNlcmlhbF9wdXRjaGFyKTogSGFuZGxlIHRoZSBjaGFyYWN0ZXIgY29kZQorCTEyNyBhcyBhIGJhY2tzcGFjZS4gUmVwb3J0ZWQgYnkgRmxvcmlhbiBFbmdlbGhhcmR0CisJPGYuZW5nZWxoYXJkdEBnbXgubmV0Pi4KKworMjAwNC0wMy0xMiAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJRnJvbSBCb2ppIFRvbnkgS2FubmFudGhhbmFtIDxib2ppLnQua2FubmFudGhhbmFtQGludGVsLmNvbT46CisJKiB1dGlsL2dydWItaW5zdGFsbC5pbiAoY29udmVydCk6IEFkZCBzdXBwb3J0IGZvciBBVEFSQUlECisJZGV2aWNlIG5hbWVzLgorCSogbGliL2RldmljZS5jIChnZXRfYXRhcmFpZF9kaXNrX25hbWUpIFtfX2xpbnV4X19dOiBOZXcKKwlmdW5jdGlvbi4KKwkoaW5pdF9kZXZpY2VfbWFwKSBbX19saW51eF9fXTogUHJvYmUgQVRBUkFJRCBkaXNrcy4KKworCSogc3RhZ2UyL3NpemVfdGVzdCAoY2hlY2spOiBEb24ndCB1c2UgdGhlIGxvY2FsIHN0YXRlbWVudCBhbnkKKwlsb25nZXIuIEl0IHdhcyB1bm5lZWRlZCBhY3R1YWxseS4gUmVwb3J0ZWQgYnkgUGF1bCBKYXJjLgorCisyMDA0LTAzLTEyICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisJCisJRnJvbSBTZXJnZXkgTWF0dmV5Y2h1ayA8c2VtQGNpYW0ucnU+OgorCSogbGliL2RldmljZS5jIChnZXRfZHJpdmVfZ2VvbWV0cnkpOiBEbyBub3Qgb3BlbiB0aGUgc2FtZSBkZXZpY2UKKwltb3JlIHRoYW4gb25jZSB1bm5lY2Vzc2FyaWx5LgorCShnZXRfZHJpdmVfZ2VvbWV0cnkpIFtfX0ZyZWVCU0RfdmVyc2lvbiA+PSA1MDAwNDBdOiBVc2UgbmV3CisJaW9jdGwgbWV0aG9kcy4KKwkoZ2V0X2Zsb3BweV9kaXNrX25hbWUpIFtfX0ZyZWVCU0RfXyA+PSA0XTogVXNlIC9kZXYvZmQlZCByYXRoZXIKKwl0aGFuIC9kZXYvcmZkJWQuCisJKGdldF9pZGVfZGlza19uYW1lKSBbX19GcmVlQlNEX18gPj0gNF06IFVzZSAvZGV2L2FkJWQgcmF0aGVyCisJdGhhbiAvZGV2L3JhZCVkLgorCShnZXRfc2NzaV9kaXNrX25hbWUpIFtfX0ZyZWVCU0RfXyA+PSA0XTogVXNlIC9kZXYvZGElZCByYXRoZXIKKwl0aGFuIC9kZXYvcmRhJWQuCisJKiBncnViL2FzbXN0dWIuYyAoZ2V0X2Rpc2tpbmZvKTogQ2hlY2sgaWYgRVJSTk8gaXMgRVBFUk0gYXMKKwl3ZWxsLgorCisyMDA0LTAyLTI4ICBKZXJvZW4gRGVra2VycyAgPGplcm9lbkBkZWtrZXJzLmN4PgorCisJKiBkb2NzL2dydWIudGV4aSAocGFydG5ldyk6IENoYW5nZSBAdmFye3RvfSB0byBAdmFye2xlbn0uCisKKzIwMDQtMDItMTggIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCUZyb20gWXVyeSBWLiBVbWFuZXRzIDx1bWthQG5hbWVzeXMuY29tPjoKKwkqIHN0YWdlMi9mc3lzX3JlaXNlcmZzLmMgKFJFSVNFUjNGU19TVVBFUl9NQUdJQ19TVFJJTkcpOiBOZXcKKwltYWNyby4KKwkocmVpc2VyZnNfbW91bnQpOiBBZGRlZCBjaGVja3MgZm9yIFJlaXNlckZTIDMuCisJKHJlaXNlcmZzX2VtYmVkKTogTGlrZXdpc2UuCisKKzIwMDQtMDEtMjUgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogZG9jcy9ncnViLnRleGkgKE9idGFpbmluZyBhbmQgQnVpbGRpbmcgR1JVQik6IEluc3RlYWQgb2YKKwlkZXNjcmliaW5nIGhvdyB0byB1c2UgdGhlIGFub25jdnMgbWV0aG9kLCBzcGVjaWZ5IHRoZSBVUkwgb2YKKwl0aGUgZGVzY3JpcHRpb24gcGFnZSBvbiBTYXZhbm5haC4KKwlSZXBvcnRlZCBieSBCZXJuaGFyZCBUcmV1dHdlaW4uCisKKzIwMDQtMDEtMTggIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCUZyb20gVGhvbWFzIFNjaHdpbmdlIDxraXNjaGRlQGdteC5uZXQ+OgorCSogZ3J1Yi9NYWtlZmlsZS5hbSAoQU1fQ1BQRkxBR1MpOiBOZXcgdmFyaWFibGUuCisJKEFNX0NGTEFHUyk6IFJlbW92ZWQgYWxsIGNwcCBmbGFncy4KKworCSogc3RhZ2UyL3hmcy5oIChfX2ludDhfdCk6IFJlbmFtZWQgdG8gLi4uCisJKHhmc19pbnQ4X3QpOiAuLi4gdGhpcy4KKwkoX191aW50OF90KTogUmVuYW1lZCB0byAuLi4KKwkoeGZzX3VpbnQ4X3QpOiAuLi4gdGhpcy4KKwkoX19pbnQxNl90KTogUmVuYW1lZCB0byAuLi4KKwkoeGZzX2ludDE2X3QpOiAuLi4gdGhpcy4KKwkoX191aW50MTZfdCk6IFJlbmFtZWQgdG8gLi4uCisJKHhmc191aW50MTZfdCk6IC4uLiB0aGlzLgorCShfX2ludDMyX3QpOiBSZW5hbWVkIHRvIC4uLgorCSh4ZnNfaW50MzJfdCk6IC4uLiB0aGlzLgorCShfX3VpbnQzMl90KTogUmVuYW1lZCB0byAuLi4KKwkoeGZzX3VpbnQzMl90KTogLi4uIHRoaXMuCisJKF9faW50NjRfdCk6IFJlbmFtZWQgdG8gLi4uCisJKHhmc19pbnQ2NF90KTogLi4uIHRoaXMuCisJKF9fdWludDY0X3QpOiBSZW5hbWVkIHRvIC4uLgorCSh4ZnNfdWludDY0X3QpOiAuLi4gdGhpcy4KKwlBbGwgY2FsbGVycyBhcmUgY2hhbmdlZC54CisKKwlGcm9tIEVnbW9udCBLb2JsaW5nZXIgPGVnbW9udEB1aHVsaW51eC5odT46CisJKiB1dGlsL2dydWItaW5zdGFsbC5pbjogU3VwcG9ydCBhbiBpbnN0YWxsIGRldmljZXMgaW4gR1JVQidzCisJbm90YXRpb24gd2l0aG91dCBwYXJlbnRoZXNlcy4KKworCSogZG9jcy9ncnViLnRleGkgKEluc3RhbGxpbmcgR1JVQiB1c2luZyBncnViLWluc3RhbGwpOiBBZGRlZCBhbgorCWV4YW1wbGUgb2YgdXNpbmcgZ3J1Yi1pbnN0YWxsIHdpdGhvdXQgcGFyZW50aGVzZXMuCisKKzIwMDQtMDEtMTggIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKwkKKwkqIHV0aWwvZ3J1Yi1pbnN0YWxsLmluOiBVc2UgdGhlIGZpcnN0IHdvcmQgb2YgR1JVQl9TSEVMTCB3aGVuCisJY2hlY2tpbmcgaWYgdGhlIGdydWIgc2hlbGwgaXMgcHJlc2VudC4gVGhpcyBpcyBuZWNlc3NhcnkgdG8KKwlzdXBwb3J0IG9wdGlvbnMgdG8gdGhlIGdydWIgc2hlbGwgKGUuZy4gZ3J1YiAtLXJlYWQtb25seSkuCisKKwlGcm9tIEVyaWMgS3ZhYWxlbiA8RV9LdmFhbGVuLkFybmVzZW5Abm9vcy5mcj46CisJKiBkb2NzL2dydWIudGV4aTogTWFueSBidWcgZml4ZXMuCisKKzIwMDQtMDEtMTcgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogbGliL2RldmljZS5jIFtfX2xpbnV4X19dIChNQUpPUik6IFN1cHBvcnQgMzIgYml0IGFuZCA2NCBiaXQKKwlkZXZfdC4gVGhpcyBjb2RlIGlzIHN0b2xlbiBmcm9tIGdsaWJjLgorCVN1Z2dlc3RlZCBieSBTaGVuIEZlbmcgPHNoZW5AbmFuamluZy1mbnN0LmNvbT4uCisKKzIwMDQtMDEtMTEgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogc3RhZ2UyL3Rlcm1pbmZvLmMgKHRpX3NldF90ZXJtKTogVXNlIGEgcG9pbnRlciB0byBzdHJ1Y3QKKwl0ZXJtaW5mbyBpbnN0ZWFkIHRvIGF2b2lkIEdDQydzIGJ1Zywgd2hpY2ggaW5zZXJ0cyBhIHJlZmVyZW5jZQorCXRvIG1lbWNweSBpbXBsaWNpdGx5LgorCSh0aV9nZXRfdGVybSk6IExpa2V3aXNlLgorCUFsbCBjYWxsZXJzIGFyZSBmaXhlZC4KKworCSogc3RhZ2UyL3Rlcm1pbmZvLmggKHRpX3NldF90ZXJtKTogVXBkYXRlZC4KKwkodGlfZ2V0X3Rlcm0pOiBMaWtld2lzZS4KKworCSogc3RhZ2UyL3NoYXJlZC5oIChzdHJ1Y3QgbGludXhfa2VybmVsX2hlYWRlcik6IE5ldyBtZW1iZXIsCisJaW5pdHJkX21heF9hZGRyZXNzLiBEZWZpbmVkIGluIHRoZSBib290IHByb3RvY29sIDIuMDMgb3IgaGlnaGVyLgorCisJKiBzdGFnZTIvYm9vdC5jIChsb2FkX2luaXRyZCk6IElmIHRoZSBib290IHByb3RvY29sIGlzIGdyZWF0ZXIKKwl0aGFuIG9yIGVxdWFsIHRvIDIuMDMsIHVzZSB0aGUgZmllbGQgYGBpbml0cmRfbWF4X2FkZHJlc3MnJworCWluc3RlYWQgb2YgTElOVVhfSU5JVFJEX01BWF9BRERSRVNTLgorCisyMDAzLTEyLTMwICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIHN0YWdlMi9mc3lzX2V4dDJmcy5jIChleHQyX2lzX2Zhc3Rfc3ltbGluayk6IE5ldyBmdW5jdGlvbi4KKwkoZXh0MmZzX2Rpcik6IFVzZSBleHQyX2lzX2Zhc3Rfc3ltbGluayB0byBjaGVjayBpZiB0aGUgY3VycmVudAorCWlub2RlIGlzIGEgZmFzdCBvciBzbG93IHN5bWxpbmsuIFRoaXMgY2hhbmdlIHdhcyByZXF1aXJlZAorCWJlY2F1c2UgTGludXggbm93IHVzZXMgYWNsIHNlcmlvdXNseSAoaS5lLiBpbmNvbXBhdGliaWxpdHkpLgorCVJlcG9ydGVkIGJ5IENocmlzIFBlQmVuaXRvIDxwZWJlbml0b0BnZW50b28ub3JnPiBhbmQgU2VlbWFudAorCUt1bGxlZW4gPHNlZW1hbnRAZ2VudG9vLm9yZz4KKworMjAwMy0xMS0zMCAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBsaWIvZGV2aWNlLmMgKHJlYWRfZGV2aWNlX21hcCkgKHNob193YXJuaW5nKTogTmV3IGludGVybmFsCisJZnVuY3Rpb24uCisJKHJlYWRfZGV2aWNlX21hcCk6IElmIERSSVZFIGlzIGdyZWF0ZXIgdGhhbiA4LCBlbWl0IGEgd2FybmluZworCWFuZCBpZ25vcmUgdGhlIGRyaXZlLCByYXRoZXIgdGhhbiBleGl0aW5nIGFibm9ybWFsbHkuCisJUmVwb3J0ZWQgYnkgR3JlZyBOZXdieSA8bmV3YnlAYXJzYy5lZHU+LgorCisyMDAzLTEwLTE5ICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwlNaWdyYXRlZCB0byBuZXdlciBhdXRvdG9vbHMuIEFsc28sIGRvbid0IGluc3RhbGwgbWtiaW1hZ2UKKwliZWNhdXNlIGl0cyBuYW1lIGlzIHRvbyBnZW5lcmFsIGFuZCBpdCBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZQorCUdOVSBDb2RpbmcgU3RhbmRhcmRzIGluIHNvbWUgcG9pbnRzLgorCQorCSogdXRpbC9NYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IE5ldyB2YXJpYWJsZS4KKwkoc2Jpbl9TQ1JJUFRTKTogUmVtb3ZlZCBta2JpbWFnZS4KKwkobm9pbnN0X1NDUklQVFMpOiBBZGRlZCBta2JpbWFnZS4KKworCSogc3RhZ2UxL01ha2VmaWxlLmFtIChBTV9BU0ZMQUdTKTogUmVuYW1lZCB0byAuLi4KKwkoQU1fQ0NBU0ZMQUdTKTogLi4uIHRoaXMuCisKKwkqIHN0YWdlMi9NYWtlZmlsZS5hbSAocHJlX3N0YWdlMl9leGVjX0FTRkxBR1MpOiBSZW5hbWVkIHRvIC4uLgorCShwcmVfc3RhZ2UyX2V4ZWNfQ0NBU0ZMQUdTKTogLi4uIHRoaXMuCisJKHN0YXJ0X2V4ZWNfQVNGTEFHUyk6IFJlbmFtZWQgdG8gLi4uCisJKHN0YXJ0X2V4ZWNfQ0NBU0ZMQUdTKTogLi4uIHRoaXMuCisJKGUyZnNfc3RhZ2UxXzVfZXhlY19BU0ZMQUdTKTogUmVuYW1lZCB0byAuLi4KKwkoZTJmc19zdGFnZTFfNV9leGVjX0NDQVNGTEFHUyk6IC4uLiB0aGlzLgorCShmYXRfc3RhZ2UxXzVfZXhlY19BU0ZMQUdTKTogUmVuYW1lZCB0byAuLi4KKwkoZmF0X3N0YWdlMV81X2V4ZWNfQ0NBU0ZMQUdTKTogLi4uIHRoaXMuCisJKGZmc19zdGFnZTFfNV9leGVjX0FTRkxBR1MpOiBSZW5hbWVkIHRvIC4uLgorCShmZnNfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MpOiAuLi4gdGhpcy4KKwkobWluaXhfc3RhZ2UxXzVfZXhlY19BU0ZMQUdTKTogUmVuYW1lZCB0byAuLi4KKwkobWluaXhfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MpOiAuLi4gdGhpcy4KKwkocmVpc2VyZnNfc3RhZ2UxXzVfZXhlY19BU0ZMQUdTKTogUmVuYW1lZCB0byAuLi4KKwkocmVpc2VyZnNfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MpOiAuLi4gdGhpcy4KKwkodnN0YWZzX3N0YWdlMV81X2V4ZWNfQVNGTEFHUyk6IFJlbmFtZWQgdG8gLi4uCisJKHZzdGFmc19zdGFnZTFfNV9leGVjX0NDQVNGTEFHUyk6IC4uLiB0aGlzLgorCShqZnNfc3RhZ2UxXzVfZXhlY19BU0ZMQUdTKTogUmVuYW1lZCB0byAuLi4KKwkoamZzX3N0YWdlMV81X2V4ZWNfQ0NBU0ZMQUdTKTogLi4uIHRoaXMuCisJKHhmc19zdGFnZTFfNV9leGVjX0FTRkxBR1MpOiBSZW5hbWVkIHRvIC4uLgorCSh4ZnNfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MpOiAuLi4gdGhpcy4KKwkoZGlza2xlc3NfZXhlY19BU0ZMQUdTKTogUmVuYW1lZCB0byAuLi4KKwkoZGlza2xlc3NfZXhlY19DQ0FTRkxBR1MpOiAuLi4gdGhpcy4KKwkobmJsb2FkZXJfZXhlY19BU0ZMQUdTKTogUmVuYW1lZCB0byAuLi4KKwkobmJsb2FkZXJfZXhlY19DQ0FTRkxBR1MpOiAuLi4gdGhpcy4KKwkocHhlbG9hZGVyX2V4ZWNfQVNGTEFHUyk6IFJlbmFtZWQgdG8gLi4uCisJKHB4ZWxvYWRlcl9leGVjX0NDQVNGTEFHUyk6IC4uLiB0aGlzLgorCisJKiBjb25maWd1cmUuaW46IFJlbW92ZWQuCisJKiBjb25maWd1cmUuYWM6IE5ldyBmaWxlLiBNb3N0bHkgZGVyaXZlZCBmcm9tIGNvbmZpZ3VyZS5pbi4KKwkKKzIwMDMtMTAtMTkgIFlvc2hpbm9yaSBPS1VKSSAgPG9rdWppQGVuYnVnLm9yZz4KKworCUZyb20gS0IgU3JpcmFtIDxtYWlsX2tiQHlhaG9vLmNvbT46CisJKiBzdGFnZTIvZGlza19pby5jIChzZXRfZGV2aWNlKSBbU1VQUE9SVF9ORVRCT09UXTogQWRkZWQgc3VwcG9ydAorCWZvciBhIGNvbXBsZXRpb24gb2YgYSBuZXR3b3JrIGRldmljZS4KKwkocHJpbnRfY29tcGxldGlvbnMpOiBMaWtld2lzZS4KKworMjAwMy0xMC0xMCAgUm9iZXJ0IE1pbGxhbiAgPHJvYmVydG1oQGdudS5vcmc+CisKKwkqIGNvbmZpZy5ndWVzczogVXBkYXRlIGZyb20gb2ZmaWNpYWwgc291cmNlIChDVlMpLgorCSogY29uZmlnLnN1YjogTGlrZXdpc2UuCisKKzIwMDMtMDktMTggIFJvYmVydCBNaWxsYW4gIDxyb2JlcnRtaEBnbnUub3JnPgorCisJKiBkb2NzL3RleGluZm8udGV4OiBVcGRhdGUgZnJvbSBmdHAuZ251Lm9yZy4KKworMjAwMy0wOS0wNSAgS0IgU3JpcmFtICA8bWFpbF9rYkB5YWhvby5jb20+CisKKwkqIHN0YWdlMi9mc3lzX2ZhdC5jOiBGaXggbWlzc2RldGVjdGlvbiBvZiBleHQyZnMgYXMgZmF0ZnMuCisKKzIwMDMtMDktMDUgIFJvYmVydCBNaWxsYW4gIDxyb2JlcnRtaEBnbnUub3JnPgorCisJKiBkb2NzL21lbnUubHN0IChHTlUvTGludXgpOiBBZGQgY29tbWVudGVkIGluaXRyZCBjb21tYW5kLCB3aGljaAorCWlzIGNvbnNpc3RlbnQgd2l0aCBkb2N1bWVudGF0aW9uLgorCisyMDAzLTA5LTAxICBSb2JlcnQgTWlsbGFuICA8cm9iZXJ0bWhAZ251Lm9yZz4KKworCSogZG9jcy9tZW51LmxzdDogQWRkIE5ldEJTRCwgT3BlbkJTRCwgR05VL0tGcmVlQlNEIGFuZAorCUdOVS9LTmV0QlNELgorCisyMDAzLTA4LTEzICBKYXNvbiBUaG9tYXMgIDxqYXNvbkBpbnRvbG9neS5jb20uYXU+CisKKwkqIHV0aWwvZ3J1Yi1pbnN0YWxsLmluIChyZXNvbHZlX3N5bWxpbmspOiBOZXcgZnVuY3Rpb24gdG8KKwlyZXNvbHZlIHN5bWxpbmtzLgorCShmaW5kX2RldmljZSk6IE1vdmVkIHN5bWxpbmsgY29kZSB0byBuZXcgZnVuY3Rpb24uCisJQmVmb3JlIHdlIGNvbnZlcnQgdGhlIGluc3RhbGxfZGV2aWNlIHdlIGF0dGVtcHQgdG8gcmVzb2x2ZSBpdCBpZgorCWl0cyBhIHN5bWxpbmsgdXNpbmcgdGhlIG5ldyBmdW5jdGlvbi4KKwkqIHV0aWwvbWJjaGsuYyAoY2hlY2tfbXVsdGlib290KTogVGhlIHNlbnNlIG9mIGFuIGVycm9yIG1lc3NhZ2UKKwl3YXMgaW52ZXJ0ZWQuCisJUmVwb3J0ZWQgYnkgVGltb3RoeSBCYWxkd2luIDxULkUuQmFsZHdpbjk5QG1lbWJlcnMubGVlZHMuYWMudWs+LgorCisyMDAzLTA4LTEyICBKb2NoZW4gSG9lbmlja2UgIDxqb2NoZW5AZ251Lm9yZz4KKworCSogc3RhZ2UyL2ZzeXNfcmVpc2VyZnMuYyAocmVhZF90cmVlX25vZGUpOiBGaXhlZCBhIHR5cG87IG9ubHkKKwltYXR0ZXJzIGZvciB2ZXJ5IGxhcmdlIGZzIHdoZW4gdHJlZSBkb2Vzbid0IGZpdCBpbiBjYWNoZS4KKwkoSUhfS0VZX09GRlNFVCk6IERvbid0IGNoZWNrIGZvciBJTkZPLT52ZXJzaW9uLiAgVGhlcmUgYXJlCisJYWN0dWFsbHkgb2xkIHZlcnNpb24gZmlsZSBzeXN0ZW1zIHRoYXQgdXNlIG5ldyB2ZXJzaW9uIGl0ZW1zLgorCShJSF9LRVlfSVNUWVBFKTogTGlrZXdpc2UuCisJKHJlaXNlcmZzX2Rpcik6IExpa2V3aXNlLgorCisyMDAzLTA4LTA5ICBUaGllcnJ5IExhcm9uZGUgIDx0bGFyb25kZUBwb2x5bnVtLm9yZz4KKworCSogdXRpbC9ta2JpbWFnZTogTmV3IEZpbGUuIGBta2JpbWFnZScgZGVwZW5kcyBvbiBHUlVCIGFuZAorCWV4aXN0ZWQJZWxzZXdoZXJlLiBJdCBpcyBub3cgcGFydCBvZiBHUlVCIHNvIHRoYXQgcGVvcGxlIGNhbgorCWZpeC9jb250cmlidXRlLgorCSogdXRpbC9NYWtlZmlsZS5hbSAoc2Jpbl9TQ1JJUFRTKTogQWRkZWQgc2NyaXB0IGBta2JpbWFnZScKKworMjAwMy0wOC0wMSAgSmFzb24gVGhvbWFzICA8amFzb25AaW50b2xvZ3kuY29tLmF1PgorCisJKiB1dGlsL2dydWItaW5zdGFsbC5pbjogc3VwcG9ydCAtLW5vLWZsb3BweQorCVRoaXMgYWxsb3cgdXNlcnMgdG8gc3BlY2lmeSB0aGUgLS1uby1mbG9wcHkgb3B0aW9uIHdoaWNoCisJaXMgcGFzc2VkIG9udG8gdGhlIGdydWIgc2hlbGwsIHNvIGl0IGRvZXMgbm90IHByb2JlIHRoZSBmbG9wcHkKKwlkcml2ZS4gCisJUGF0Y2ggZnJvbSBrZXNoYUBkaWVkYXMuc29mdGVuLmt0dS5sdAorCisyMDAzLTA2LTE3ICBKb2NoZW4gSG9lbmlja2UgIDxqb2NoZW5AZ251Lm9yZz4KKworCSogc3RhZ2UyL2ZzeXNfcmVpc2VyZnMuYyAocmVpc2VyZnNfbW91bnQpOiBDbGVhciB0aGUgbm9kZSBjYWNoZS4KKwlUaGlzIGZpeGVzIGEgcHJvYmxlbSB3aGVyZSBmaWxlcyBmcm9tIG90aGVyIHBhcnRpdGlvbnMgYXBwZWFyIGF0CisJdGhlIHdyb25nIHBhcnRpdGlvbi4gIFByb2JsZW0gcmVwb3J0ZWQgYnkgSm9oYW4gUmVnaW4uCisKKzIwMDMtMDUtMDQgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogZG9jcy9ncnViLnRleGkgKHBhcnRuZXcpOiBGaXhlZCB0aGUgaW5jb25zaXN0ZW5jeSBiZXR3ZWVuIHRoZQorCWltcGxlbWVudGF0aW9uIGFuZCB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlIGxhc3QgYXJndW1lbnQgaXMgdGhlCisJbGVuZ3RoIGluc3RlYWQgb2YgdGhlIGVuZGluZyBhZGRyZXNzLgorCVJlcG9ydGVkIGJ5IERhbmllbCBGYXJyZWxsIDxzMjEwODI4N0BzdHVkZW50LnJtaXQuZWR1LmF1Pi4KKworMjAwMy0wMy0xOSAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJRnJvbSBBZGFtIExhY2tvcnp5bnNraSA8YWRhbUBvcy5pbmYudHUtZHJlc2Rlbi5kZT46CisJKiBzdGFnZTIvc2hhcmVkLmggKEtFWV9OUEFHRSk6IENoYW5nZWQgdG8gMHg1MTAwLgorCShLRVlfUFBBR0UpOiBDaGFuZ2VkIHRvIDB4NDkwMC4KKworMjAwMy0wMy0xOSAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBzdGFnZTIvYm9vdC5jIChsb2FkX2ltYWdlKTogQ2hlY2sgaWYgREFUQV9MRU4gcGx1cyBTRUNUT1JfU0laRQorCWlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBNVUxUSUJPT1RfU0VBUkNILCBpbnN0ZWFkIG9mIGlmCisJREFUQV9MRU4gaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIE1VTFRJQk9PVF9TRUFSQ0guCisJUmVwb3J0ZWQgYnkgTmVlbGthbnRoIE5hdHUgPG5lZWxuYXR1QHlhaG9vLmNvbT4uCisKKzIwMDMtMDMtMTAgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCUZyb20gQW5kcmV3IFdhbHJvbmQgPGFuZHJld0B3YWxyb25kLm9yZz46CisJKiBzdGFnZTIvZnN5c19yZWlzZXJmcy5jIChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9oZWFkZXIpOgorCVJlbW92ZSBhbiB1bm5lY2Vzc2FyeSBgYGxvbmcnJy4KKworMjAwMy0wMy0xMCAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJRnJvbSBUaWxtYW5uIEJ1YmVjazoKKwkqIHN0YWdlMi9idWlsdGlucy5jIFtTVVBQT1JUX1NFUklBTF0gKHRlcm1pbmZvX2Z1bmMpOiBVbmVzY2FwZQorCWFyZ3VtZW50cyBiZWZvcmUgY29weWluZyB0aGVtLCBhbmQgZXNjYXBlIHNlcXVlbmNlcyBiZWZvcmUKKwlwcmludGluZyB0aGVtLgorCSogc3RhZ2UyL3Rlcm1pbmZvLmggKFRFUk1JTkZPX0xFTik6IENoYW5nZWQgdG8gNDAuCisKKzIwMDMtMDItMjAgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogdXRpbC9ncnViLWluc3RhbGwuaW4gKGZpbmRfZGV2aWNlKTogRml4IHRoZSBzZWQgc2NyaXB0LgorCisyMDAzLTAyLTE3ICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIGxpYi9kZXZpY2UuYyAoY2hlY2tfZGV2aWNlKTogSWYgREVWSUNFIGlzIGVtcHR5LCBqdXN0IHJldHVybgorCTEuCisJKGdldF9zY3NpX2Rpc2tfbmFtZSkgW19fUU5YTlRPX19dOiBNYWtlIE5BTUUgZW1wdHksIGJlY2F1c2UgU0NTSQorCWRpc2tzIGFyZSBkZXRlY3RlZCBhcyBJREUgZGlza3Mgb24gUU5YIFJUUC4KKworCUZyb20gVGFrZXRvIEthYmUgPGthYmVAc3JhLXRvaG9rdS5jby5qcD46CisJKiBsaWIvZGV2aWNlLmMgKGdldF9pZGVfZGlza19uYW1lKSBbX19RTlhOVE9fX106IFNldCBOQU1FIHRvCisJIi9kZXYvaGRYIi4KKwkoZ2V0X2Zsb3BweV9kaXNrX25hbWUpIFtfX1FOWE5UT19fXTogU2V0IE5BTUUgdG8gIi9kZXYvZmRYIi4KKwkqIHN0YWdlMi9tYl9pbmZvLmggKHN0cnVjdCBBZGRyUmFuZ2VEZXNjKTogU3BlY2lmaWVkIHdpdGggdGhlCisJYXR0cmlidXRlIHBhY2tlZC4KKwkqIHN0YWdlMi9zaGFyZWQuaCAoc3RydWN0IG1tYXJfZGVzYyk6IExpa2V3aXNlLgorCisyMDAzLTAxLTI5ICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwlGcm9tIElsZ3VpeiBMYXR5cG92OgorCSogY29uZmlndXJlLmluOiBGaXggYSBzeW50YXggZXJyb3IgaW4gYSBzZWQgc2NyaXB0LgorCSogc3RhZ2UyL2Jpb3MuYyAoZ2V0X2Rpc2tpbmZvKTogUGhvZW5peEJJT1MgNC4wIFJldmlzaW9uIDYuMCAKKwlmb3IgWkYgTWljcm8gbWlnaHQgdW5kZXJzdGFuZCB0aGUgZ3JlYXRlciBidWZmZXIgc2l6ZSBmb3IgdGhlCisJImdldCBkcml2ZSBwYXJhbWV0ZXJzIiBpbnQgMHgxMyBjYWxsIGluIGl0cyBvd24gd2F5LiAgCisJU3VwcG9zZWRseSB0aGUgQklPUyBhc3N1bWVzIGV2ZW4gYmlnZ2VyIHNwYWNlIGlzIGF2YWlsYWJsZSBhbmQKKwl0aHVzIGNvcnJ1cHRzIHRoZSBzdGFjay4gIFRoaXMgaXMgd2h5IHdlIHNwZWNpZnkgdGhlIGV4YWN0bHkgCisJbmVjZXNzYXJ5IHNpemUgb2YgMHg0MiBieXRlcy4KKworMjAwMy0wMS0yNSAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJRnJvbSBTdGV2ZW4gRGljayA8c3NkLmdudUBtbWFlLnVjZi5lZHU+OgorCSogc3RhZ2UyL3BjX3NsaWNlLmggKFBDX1NMSUNFX1RZUEVfREVMTF9VVElMKTogTmV3IG1hY3JvLgorCShJU19QQ19TTElDRV9UWVBFX0ZBVCk6IFJlY29nbml6ZSBQQ19TTElERV9UWVBFX0RFTExfVVRJTCBhcworCXdlbGwuCisKKzIwMDMtMDEtMjUgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCUZyb20gS2Fyc3RlbiBTY2hlaWJsZXIgPGthcnN0ZW4uc2NoZWlibGVyQHN0dWRlbnQudW5pLWhhbGxlLmRlPjoKKwkqIHN0YWdlMi90ZXJtaW5mby5jICh0ZXJtKTogRG9uJ3QgdXNlIGEgQzk5LXN0eWxlIGluaXRpYWxpemVyLgorCisyMDAzLTAxLTE2ICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwlGcm9tIEguSi4gTHUgPGhqbEBnbnUub3JnPjoKKwkqIHN0YWdlMi9kaXNrX2lvLmMgKHBhcnRfc3RhcnQpOiBVc2UgdW5zaWduZWQgbG9uZyB0byBzdXBwb3J0CisJbGFyZ2UgZGlza3MuCisJKHBhcnRfbGVuZ3RoKTogTGlrZXdpc2UuCisJKiBzdGFnZTIvc2hhcmVkLmggKHBhcnRfc3RhcnQpOiBMaWtld2lzZS4KKwkocGFydF9sZW5ndGgpOiBMaWtld2lzZS4KKworMjAwMy0wMS0wNSAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBjb25maWd1cmUuaW4gKENGTEFHUyk6IFdoZW4gdGhlIGRlZmF1bHQgQ0ZMQUdTIGlzIHVzZWQsCisJZWxpbWluYXRlIC1PMiBhbmQgLWcgZnJvbSBDRkxBR1MsIGJlY2F1c2UgQXV0b2NvbmYgbWF5CisJYXV0b21hdGljYWxseSBzZXQgQ0ZMQUdTIHRvIHRoZW0uCisKKzIwMDMtMDEtMDIgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCUZyb20gSmVyZW15IEthdHo6CisJKiBjb25maWd1cmUuaW46IFN1cHBvcnQgYnVpbGRpbmcgb24geDg2XzY0IHdpdGggZ2NjIC1tMzIuCisKKzIwMDMtMDEtMDIgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCUZyb20gSmVyZW15IEthdHo6CisJKiBzdGFnZTIvZnN5c19leHQyZnMuYyAoZXh0MmZzX2Rpcik6IEluaXRpYWxpemUgU1RSX0NISyB0byBzaHV0CisJdXAgR0NDLgorCSogc3RhZ2UyL2ZzeXNfbWluaXguYyAobWluaXhfZGlyKTogTGlrZXdpc2UuCisKKzIwMDItMTItMjEgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogc3RhZ2UyL2FzbS5TIChnYXRlQTIwKTogRmlyc3QsIHRyeSBhIEJJT1MgY2FsbCAoSU5UIDE1SCwKKwlBWD0yNDAwLzI0MDEpLiBVc2UgdGhlIGtleWJvYXJkIGNvbnRyb2xsZXIsIG9ubHkgaWYgdGhhdCBmYWlsZWQuCisKKzIwMDItMTItMTEgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCUFkZCBhIHdvcmthcm91bmQgZm9yIGJ1Z2d5IEJJT1NlcyB3aGljaCBkb24ndCBwYXNzIGJvb3QgZHJpdmUKKwljb3JyZWN0bHkuIFRoZSBpZGVhIGlzIHRoYXQgR1JVQiBmb3JjZXMgdGhlIGZpeGVkIGRpc2sgZmxhZworCXdoZW4gYm9vdGVkIGZyb20gYSBoYXJkIGRpc2suIFdoZW4gQklPUyBsb2FkcyBHUlVCIGRpcmVjdGx5LAorCXRoZSBib290IGRyaXZlIG11c3QgYmUgZWl0aGVyIG9mIDB4MDAgYW5kIDB4ODAsIHNvIHRoaXMgc2hvdWxkCisJd29yaywgaWYgdGhvc2UgQklPU2VzIGFsd2F5cyBwYXNzIHplcm8gdG8gJWRsLiBBRkFJSywgdGhpcworCWFzc3VtcHRpb24gaXMgYWx3YXlzIGNvcnJlY3QuCisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChpbnN0YWxsX2Z1bmMpOiBTdG9yZSB0aGUgZml4ZWQgZGlzayBmbGFnIG9mCisJdGhlIGRlc3RpbmF0aW9uIGRyaXZlIGluIEJPT1RfRFJJVkVfTUFTSyBpbiBTdGFnZSAxLgorCisJKiBzdGFnZTEvc3RhZ2UxLmggKFNUQUdFMV9CT09UX0RSSVZFX01BU0spOiBOZXcgbWFjcm8uCisKKwkqIHN0YWdlMS9zdGFnZTEuUyAoYm9vdF9kcml2ZV9tYXNrKTogTmV3IHZhcmlhYmxlLiBJdCBpcyBvcidlZAorCXRvICVkbC4KKworMjAwMi0xMi0wOSAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBzdGFnZTIvY2hhcl9pby5jIChpbml0X3BhZ2UpOiBDaGFuZ2UgdGhlIHNvZnR3YXJlIG5hbWUgZnJvbQorCSJHUlVCIiB0byAiR05VIEdSVUIiLiBUaGlzIHdhcyBpbmFjY3VyYXRlLiBSZXBvcnRlZCBieSBDaWFyYW4KKwlPJ1Jpb3JkYW4gPGNvcmlvcmRhbkBjb21wc29jLmNvbT4uCisKKzIwMDItMTItMDQgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGVtYmVkX2Z1bmMpOiBXaGVuIGNoZWNraW5nIGlmIHRoZSBkaXNrIGNhbgorCXN0b3JlIFN0YWdlIDEuNSwgY2hlY2sgZXZlcnkgcGFydGl0aW9uLCBpZiBpdCBpc24ndCBlbXB0eS4KKworMjAwMi0xMi0wNCAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBzdGFnZTIvc3RhZ2UyLmMgKHByaW50X2VudHJ5KTogUHV0IGEgcmlnaHQgYXJyb3csIGlmIHRoZSBlbnRyeQorCWlzIGxvbmdlciB0aGFuIDcxIGNoYXJhY3RlcnMuIFJlcG9ydGVkIGJ5IFBhdmVsIFJvc2tpbi4KKworMjAwMi0xMi0wNCAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBzdGFnZTIvZGlza19pby5jIChzZXRfZGV2aWNlKTogSWYgJyhuJyBpcyBnaXZlbiwgYWRkICdkJyBpbnRvCisJREVWSUNFLiBSZXBvcnRlZCBieSBQYXZlbCBSb3NraW4uCisKKzIwMDItMTItMDMgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCUNoYW5nZSB0aGUgdGVybWluYWwgc3RydWN0dXJlIGEgYml0LCB0byB0dXJuIHRoZSBjdXJzb3Igc3RhdGUKKwlleHBsaWNpdGx5LiBTdWdnZXN0ZWQgYnkgUGF2ZWwgUm9za2luLgorCQorCSogc3RhZ2UyL3Rlcm0uaCAoc3RydWN0IHRlcm1fZW50cnkpOiBSZW1vdmUgdGhlIG1lbWJlcgorCWBub2N1cnNvcicgYW5kIGFkZCBgc2V0Y3Vyc29yJy4KKwlbIVNUQUdFMV81XSAoY29uc29sZV9zZXRjdXJzb3IpOiBOZXcgcHJvdG90eXBlLgorCVtTVVBQT1JUX0hFUkNVTEVTXSAoaGVyY3VsZXNfc2V0Y3Vyc29yKTogTGlrZXdpc2UuCisJWyFTVEFHRTFfNV0gKGNvbnNvbGVfbm9jdXJzb3IpOiBSZW1vdmVkLgorCVtTVVBQT1JUX0hFUkNVTEVTXSAoaGVyY3VsZXNfbm9jdXJzb3IpOiBMaWtld2lzZS4KKworCSogc3RhZ2UyL3N0YWdlMi5jIChydW5fbWVudSk6IENhbGwgc2V0Y3Vyc29yIGluc3RlYWQgb2YKKwlub2N1cnNvci4KKwlDYWxsIHNldGN1cnNvciB3aXRoIDEgYmVmb3JlIHN0YXJ0aW5nIGEgYm9vdCBlbnRyeS4KKworCSogc3RhZ2UyL3NoYXJlZC5oIChub2N1cnNvcik6IFJlbW92ZWQuCisJKHNldGN1cnNvcik6IE5ldyBwcm90b3R5cGUuCisKKwkqIHN0YWdlMi9oZXJjdWxlcy5jIChoZXJjX2N1cnNvcl9zdGF0ZSk6IE5ldyB2YXJpYWJsZS4KKwkoaGVyY190dXJuX2N1cnNvcik6IFJlbW92ZWQuCisJKGhlcmN1bGVzX25vY3Vyc29yKTogTGlrZXdpc2UuCisJKGhlcmN1bGVzX3NldGN1cnNvcik6IE5ldyBmdW5jdGlvbi4KKworCSogc3RhZ2UyL2NoYXJfaW8uYyAoZ2V0X2NtZGxpbmUpOiBUdXJuIG9uIHRoZSBjdXJzb3IgYXQgdGhlCisJYmVnaW5uaW5nLCBhbmQgcmVzdG9yZSBpdCBiZWZvcmUgcmV0dXJuaW5nLgorCShub2N1cnNvcik6IFJlbW92ZWQuCisJKHNldGN1cnNvcik6IE5ldyBmdW5jdGlvbi4KKworCSogc3RhZ2UyL2FzbS5TIChjb25zb2xlX2N1cnNvcl9zdGF0ZSk6IE5ldyB2YXJpYWJsZS4KKwkoY29uc29sZV9jdXJzb3Jfc2hhcGUpOiBMaWtld2lzZS4KKwkoY29uc29sZV9zZXRjdXJzb3IpOiBOZXcgZnVuY3Rpb24uCisJKGNvbnNvbGVfbm9jdXJzb3IpOiBSZW1vdmVkLgorCisJKiBncnViL2FzbXN0dWIuYyAoY29uc29sZV9zZXRjdXJzb3IpOiBOZXcgZnVuY3Rpb24uCisJKGhlcmN1bGVzX3NldGN1cnNvcik6IExpa2V3aXNlLgorCShjb25zb2xlX25vY3Vyc29yKTogUmVtb3ZlZC4KKwkoaGVyY3VsZXNfbm9jdXJzb3IpOiBMaWtld2lzZS4KKworMjAwMi0xMi0wMyAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBkb2NzL2dydWIudGV4aSAodGVybWluZm8pOiBGaXggYSBtaXNsZWFkaW5nIEVuZ2xpc2ggc2VudGVuY2UuCisJUmVwb3J0ZWQgYnkgUGF2ZWwgUm9za2luLgorCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGJ1aWx0aW5fdGVybWluZm8pOiBMaWtld2lzZS4KKworMjAwMi0xMi0wMSAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJRnJvbSBBbGV4YW5kZXIgTGFuZ2VyIDxhbGV4QGJpZy5lbmRpYW4uZGU+OgorCSogc3RhZ2UyL2ZyZWVic2QuaCAoUkJfR0RCKTogTmV3IG1hY3JvLgorCShSQl9NVVRFKTogTGlrZXdpc2UuCisJKFJCX01VTFRJUExFKTogTGlrZXdpc2UuCisKKwkqIHN0YWdlMi9ib290LmMgKGJzZF9ib290KTogU2V0IHRoZSBiaXRzIG9mIFJCX01VTFRJUExFLCBSQl9HREIKKwlhbmQgUkJfTVVURSB3aGVuICItRCIsICItZyIgYW5kICItbSIgYXJlIHNwZWNpZmllZCwKKwlyZXNwZWN0aXZlbHkuCisKKzIwMDItMTItMDEgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogZG9jcy9ncnViLnRleGkgKFJlcG9ydGluZyBidWdzKTogU3BlY2lmeSB0aGUgcHJvamVjdCBwYWdlIG9mCisJdGhlIEJUUyBpbnN0ZWFkIG9mIHRoZSBCVFMgaXRzZWxmLgorCisyMDAyLTExLTMwICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIGRvY3MvTWFrZWZpbGUuYW0gKG1hbl9NQU5TKTogQWRkZWQgZ3J1Yi10ZXJtaW5mby44LgorCSgkKHNyY2RpcikvZ3J1Yl90ZXJtaW5mby44KTogTmV3IHRhcmdldC4KKwkqIHV0aWxzL2dydWItdGVybWluZm8uaW46IE5ldyBmaWxlLgorCSogdXRpbC9NYWtlZmlsZS5hbSAoc2Jpbl9TQ1JJUFRTKTogQWRkZWQgZ3J1Yi10ZXJtaW5mby4KKwkqIGNvbmZpZ3VyZS5pbiAoQUNfT1VUUFVUKTogQWRkZWQgdXRpbC9ncnViLXRlcm1pbmZvLgorCisJKiBkb2NzL2dydWIudGV4aSAodGVybWluZm8pOiBOZXcgc3Vic2VjdGlvbi4KKwkoSW52b2tpbmcgZ3J1Yi10ZXJtaW5mbyk6IE5ldyBjaGFwdGVyLgorCisJRnJvbSBUaWxtYW5uIEJ1YmVjayA8dC5idWJlY2tAcmVpbmZvcm0uZGU+OgorCSogc3RhZ2UyL01ha2VmaWxlLmFtIChub2luc3RfSEVBREVSUyk6IEFkZGVkIHRlcm1pbmZvLmggYW5kCisJdHBhcm0uaC4KKwkobGliZ3J1Yl9hX1NPVVJDRVMpOiBBZGRlZCB0ZXJtaW5mby5jIGFuZCB0cGFybS5jLgorCShwcmVfc3RhZ2UyX2V4ZV9TT1VSQ0VTKTogTGlrZXdpc2UuCisJKiBzdGFnZTIvdGVybWluZm8uYzogTmV3IGZpbGUuCisJKiBzdGFnZTIvdGVybWluZm8uaDogTGlrZXdpc2UuCisJKiBzdGFnZTIvdHBhcm0uYzogTGlrZXdpc2UuCisJKiBzdGFnZTIvdHBhcm0uaDogTGlrZXdpc2UuCisJKiBzdGFnZTIvc3RhZ2UyLmMgKGdldF9saW5lX2Zyb21fY29uZmlnKTogRml4IGhhbmRsaW5nIG9mCisJYmFja3NsYXNoZXMuCisJKiBzdGFnZTIvY2hhcl9pby5jIChncnViX3B1dHN0cik6IE5ldyBmdW5jdGlvbi4KKwkoZ3J1Yl9wcmludGYpOiBVc2UgZ3J1Yl9wdXRzdHIuCisJKHN1YnN0cmluZyk6IEFkZCBjb25zdCBpbnRvIGJvdGggYXJndW1lbnRzLgorCSogc3RhZ2UyL2J1aWx0aW5zLmMgW1NVUFBPUlRfU0VSSUFMXTogSW5jbHVkZSB0ZXJtaW5mby5oLgorCVtTVVBQT1JUX1NFUklBTF0gKHRlcm1pbmZvX2Z1bmMpOiBOZXcgZnVuY3Rpb24uCisJW1NVUFBPUlRfU0VSSUFMXSAoYnVpbHRpbl90ZXJtaW5mbyk6IE5ldyB2YXJpYWJsZS4KKwkgKGJ1aWx0aW5fdGFibGUpIFtTVVBQT1JUX1NFUklBTF06IEFkZGVkIGEgcG9pbnRlciB0bworCUJVSUxUSU5fVEVSTUlORk8uCisJKiBzdGFnZTIvc2VyaWFsLmMgKHNlcmlhbF9nb3RveHkpOiBVc2UgdGlfY3Vyc29yX2FkZHJlc3MuCisJKHNlcmlhbF9jbHMpOiBVc2UgdGlfY2xlYXJfc2NyZWVuLgorCShzZXJpYWxfaGlnaGxpZ2h0KTogdXNlIHRpX2VudGVyX3N0YW5kb3V0X21vZGUgYW5kCisJdGlfZXhpdF9zdGFuZG91dF9tb2RlLgorCisyMDAyLTExLTMwICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIHN0YWdlMi9kaXNrX2lvLmMgKHJhd3JlYWQpOiBNYWtlIHN1cmUgdGhhdCBTRUNUT1IgaXMgdmFsaWQuCisJSWYgbm90LCBzZXQgRVJSTlVNIHRvIEVSUl9HRU9NIGFuZCByZXR1cm4gemVyby4gVGhpcyBjaGVjayBpcworCWNyaXRpY2FsIHdoZW4gYSBwYXJ0aXRpb24gdGFibGUgaXMgY29ycnVwdGVkLgorCisyMDAyLTExLTI4ICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIHN0YWdlMi9hc20uUyAoY29uc29sZV9jbHMpOiBXcml0ZSBzcGFjZXMgdG8gdGhlIGVudGlyZSBzY3JlZW4KKwlpbnN0ZWFkIG9mIGdldHRpbmcvc2V0dGluZyB0aGUgdmlkZW8gbW9kZSwgYmVjYXVzZSB0aGlzIGZsaWNrZXJzCisJdGhlIHNjcmVlbiBhbmQgaXMgcXVpdGUgYW5ub3lpbmcsIGlmIHVzaW5nIGEgTENELgorCisyMDAyLTExLTE1ICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIGRvY3MvZ3J1Yi50ZXhpIChRTlgpOiBOZXcgc3Vic2VjdGlvbi4gUmVwb3J0ZWQgYnkKKwlNYXJpYW4tTmljb2xhZSBWLiBJT04gPG1hcmlhbl9pb25Abm9vcy5mcj4uCisKKzIwMDItMTAtMjggIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogZ3J1Yi9hc21zdHViLmMgKGNvbnNvbGVfdHJhbnNsYXRlX2tleSk6IERlYWwgd2l0aCBLRVlfUFBBR0UKKwlhbmQgS0VZX05QQUdFLgorCSogc3RhZ2UyL3NlcmlhbC5jIChzZXJpYWxfdHJhbnNsYXRlX2tleV9zZXF1ZW5jZSk6IEFkZGVkIHR3byBuZXcKKwljb2RlcyBmb3IgUGFnZSBVcCBhbmQgUGFnZSBEb3duLgorCSogc3RhZ2UyL2FzbS5TICh0cmFuc2xhdGlvbl90YWJsZSk6IEFkZGVkIGVudHJpZXMgZm9yIEtFWV9QUEFHRQorCWFuZCBLRVlfTlBBR0UuCisJKiBzdGFnZTIvc3RhZ2UyLmMgKHJ1bl9tZW51KTogRGVhbCB3aXRoIFBhZ2UgVXAgYW5kIFBhZ2UgRG93bi4KKwlBbHNvIHJlY29nbml6ZSB0aGUgcmlnaHQga2V5IGZvciB0aGUgc2VsZWN0aW9uIG9mIGEgYm9vdCBlbnRyeS4KKwlTdWdnZXN0ZWQgYnkgQWRhbSBMYWNrb3J6eW5za2kgPGFkYW1Ab3MuaW5mLnR1LWRyZXNkZW4uZGU+LgorCisyMDAyLTEwLTEwICBKYXNvbiBUaG9tYXMgIDxqYXNvbkB0b3BpYy5jb20uYXU+CisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChzZXR1cF9mdW5jKTogQWRkZWQgbWlzc2luZyBzcGFjZSB0byAtLWZvcmNlLWxiYQorCW9wdGlvbi4gUmVwb3J0ZWQgYnkgS2VubmV0aCBDcnVkdXAgPGtlbm55QHBhbml4LmNvbT4KKworMjAwMi0xMC0wNiAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBzdGFnZTIvYXNtLlMgKGdhdGVBMjApOiBPdXRwdXQgYSBkdW1teSBjb21tYW5kICgweGZmKSwgYXMgYQorCXdvcmthcm91bmQgZm9yIFVTQiBrZXlib2FyZCBoYW5naW5nIHByb2JsZW0uIFN1Z2dlc3RlZCBieQorCUhpZGV0b3NoaSBOaXNoaW1ha2kgPG5pc2hpbWFraUBteHMubmVzLm5lYy5jby5qcD4uCisKKzIwMDItMTAtMDYgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogY29uZmlndXJlLmluIChmYWxpZ25fbG9vcF9mbGFnKTogTmV3IHZhcmlhYmxlLiBTZXQgdG8gaWYgR0NDCisJc3VwcG9ydHMgYC1mYWxpZ24tKicuIElmIHRydWUsIHVzZSBgLWZhbGlnbi1qdW1wcycsCisJYC1mYWxpZ24tbG9vcHMnIGFuZCBgLWZhbGlnbi1mdW5jdGlvbnMnIGluc3RlYWQgb2YKKwlgLW1hbGlnbi1qdW1wcycsIGAtbWFsaWduLWxvb3BzJyBhbmQgYC1tYWxpZ24tZnVuY3Rpb25zJywKKwliZWNhdXNlIGAtbWFsaWduLSonIGFyZSBvYnNvbGV0ZSBpbiBHQ0MgMy54LiBSZXBvcnRlZCBieSBKZXJlbXkKKwlLYXR6LgorCisyMDAyLTA5LTEzICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIHN0YWdlMi9zZXJpYWwuYyAoZmlsbF9pbnB1dF9idWYpOiBUYWtlIGEgbmV3IGFyZ3VtZW50IE5PV0FJVC4KKwlJZiBOT1dBSVQgaXMgdHJ1ZSwgZG9uJ3QgbG9vcC4KKwlBbGwgY2FsbGVycyBhcmUgY2hhbmdlZC4KKworMjAwMi0wOS0wOCAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBjb25maWd1cmUuaW4gKC0tZGlzYWJsZS1zZXJpYWwpOiBGaXggYSB0eXBvIGluIHRoZQorCWRlc2NyaXB0aW9uLgorCisyMDAyLTA4LTIwICBKYXNvbiBUaG9tYXMgPGphc29uQHRvcGljLmNvbS5hdT4KKworCUNoYW5nZWQgaGlnaGxpZ2h0IHN0YXRlIGNvZGUgZm9yIGhlcmN1bGVzLCBjb25zb2xlIGFuZCBzZXJpYWwuCisJVGhlIHN0YXRlIHdhcyAwIC0gbm9ybWFsIG9yIDEgLSBoaWdobGlnaHQuCisJVGhlIHN0YXRlIGlzIG5vdyBkZWZpbmVkIHVzaW5nIGFuIGVudW0gY2FsbGVkIGNvbG9yX3N0YXRlLgorCisJKiBzdGFnZTIvdGVybS5oIChjb2xvcl9zdGF0ZSk6IE5ldyBlbnVtLgorCShDT0xPUl9TVEFURV9TVEFOREFSRCk6IFN0YW5kYXJkIGNvbG9yIHRvIHVzZSB3aGVuIG5vdCB1c2luZworCXVzZXIgZGVmaW5lZC4KKwkoQ09MT1JfU1RBVEVfTk9STUFMKTogVXNlciBkZWZpbmVkIG5vcm1hbCBjb2xvci4KKwkoQ09MT1JfU1RBVEVfSElHSExJR0hUKTogVXNlciBkZWZpbmVkIGhpZ2hsaWdodCBjb2xvci4KKwkoY29uc29sZV9oaWdobGlnaHQpOiBSZW5hbWVkIHRvIGNvbnNvbGVfc2V0Y29sb3JzdGF0ZS4KKwkoc2VyaWFsX2hpZ2hsaWdodCk6IFJlbmFtZWQgdG8gc2VyaWFsX3NldGNvbG9yc3RhdGUuCisJKGhlcmN1bGVzX2hpZ2hsaWdodCk6IFJlbmFtZWQgdG8gaGVyY3VsZXNfc2V0Y29sb3JzdGF0ZS4KKwkqIHN0YWdlMi9oZXJjdWxlcy5jIChoZXJjX2hpZ2hsaWdodF9zdGF0ZSk6IFJlbW92ZWQuCisJKGhlcmNfc3RhbmRhcmRfY29sb3IpOiBOZXcgdmFyaWFibGUuCisJKGhlcmNfY29sb3Jfc3RhdGUpOiBMaWtld2lzZS4KKwkoaGVyY19oaWdobGlnaHQpOiBSZW5hbWVkIHRvIGhlcmNfc2V0Y29sb3JzdGF0ZS4KKwkoaGVyY19zZXRjb2xvcnN0YXRlKTogQWRkZWQgc3dpdGNoIHRvIGhhbmRsZSBuZXcgc3RhdGVzLgorCSogc3RhZ2UyL2NvbnNvbGUuYyAoY29uc29sZV9oaWdobGlnaHRfc3RhdGUpOiBSZW1vdmVkLgorCShjb25zb2xlX3N0YW5kYXJkX2NvbG9yKTogTmV3IHZhcmlhYmxlLgorCShjb25zb2xlX2NvbG9yX3N0YXRlKTogTGlrZXdpc2UuCisJKGNvbnNvbGVfaGlnaGxpZ2h0KTogUmVuYW1lZCB0byBjb25zb2xlX3NldGNvbG9yc3RhdGUuCisJKGNvbnNvbGVfc2V0Y29sb3JzdGF0ZSk6IEFkZGVkIHN3aXRjaCB0byBoYW5kbGUgbmV3IHN0YXRlcy4KKwkqIHN0YWdlMi9zZXJpYWwuYyAoc2VyaWFsX2hpZ2hsaWdodCk6IFJlbmFtZWQgdG8KKwlzZXJpYWxfc2V0Y29sb3JzdGF0ZS4KKwkoc2VyaWFsX3NldGNvbG9yc3RhdGUpOiBBZGp1c3RlZCAnaWYnIHRvIHN1aXQgbmV3IHN0YXRlcy4KKwkqIGdydWIvYXNtc3R1Yi5jIChjb25zb2xlX2hpZ2hsaWdodCk6IFJlbmFtZWQgdG8KKwljb25zb2xlX3NldGNvbG9yc3RhdGUuCisJKGNvbnNvbGVfc2V0Y29sb3JzdGF0ZSk6IEFkanVzdGVkICdpZicgdG8gc3VpdCBuZXcgc3RhdGVzLgorCSogc3RhZ2UyL3N0YWdlMi5jIChwcmludF9lbnRyeSk6IFNldCBjb2xvciBzdGF0ZXMgdXNpbmcgbmV3CisJc3RhdGVzLgorCShwcmludF9ib3JkZXIpOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9zdGFnZTIuYyAocnVuX21lbnUpOiBSZXZlcnNlIGlmICghKSB0byBpZiAoKSBmb3IKKwl1bmlmb3JtaXR0eS4KKworMjAwMi0wNy0xMiAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBzdGFnZTIvYm9vdC5jIChsb2FkX2ltYWdlKTogUmV3cml0ZSB0aGUgTGludXggYm9vdGluZyBzdXBwb3J0CisJcmFkaWNhbGx5LiBOb3cgaXQgc2hvdWxkIHdvcmsgZXZlbiBvbiBhIG1hY2hpbmUgaGF2aW5nLCBzYXksCisJb25seSAxMjhLQiwgdGhlb3JldGljYWxseS4gT2YgY291cnNlLCBHUlVCIGl0c2VsZiBkb2Vzbid0IHdvcmsKKwlvbiBzdWNoIGEgc3lzdGVtLCB0aG91Z2guCisJKGxvYWRfaW5pdHJkKTogSW5pdGlhbGl6ZSBMSCBiYXNlZCBvbiBDVVJfQUREUiwgYmVjYXVzZSB0aGUKKwlsb2NhdGlvbiBiZWNvbWVzIGR5bmFtaWMuCisJKiBzdGFnZTIvc2hhcmVkLmggKExJTlVYX01BWF9TRVRVUF9TRUNUUyk6IFNldCB0byA2NC4KKwkoTElOVVhfSEVBUF9FTkRfT0ZGU0VUKTogU2V0IHRvICgweDkwMDAgLSAweDIwMCkuCisJKExJTlVYX1NUQUdJTkdfQVJFQSk6IFJlbW92ZWQuCisJKExJTlVYX1NFVFVQKTogTGlrZXdpc2UuCisJKExJTlVYX0tFUk5FTCk6IExpa2V3aXNlLgorCShMSU5VWF9LRVJORUxfTUFYTEVOKTogTGlrZXdpc2UuCisJKExJTlVYX1NFVFVQX1NFRyk6IExpa2V3aXNlLgorCShMSU5VWF9JTklUX1NFRyk6IExpa2V3aXNlLgorCShMSU5VWF9TRVRVUF9TVEFDSyk6IFNldCB0byAweDkwMDAuCisJKExJTlVYX0JaSU1BR0VfQUREUik6IE5ldyBtYWNyby4KKwkoTElOVVhfWklNQUdFX0FERFIpOiBMaWtld2lzZS4KKwkoTElOVVhfT0xEX1JFQUxfTU9ERV9BRERSKTogTGlrZXdpc2UuCisJKENMX01ZX0xPQ0FUSU9OKTogUmVtb3ZlZC4KKwkoQ0xfTVlfRU5EX0FERFIpOiBMaWtld2lzZS4KKwkoQ0xfQkFTRV9BRERSKTogTGlrZXdpc2UuCisJKENMX01BR0lDKTogUmVuYW1lZCB0byAuLi4KKwkoTElOVVhfQ0xfTUFHSUMpOiAuLi4gdGhpcy4KKwkoTElOVVhfQ0xfT0ZGU0VUKTogTmV3IG1hY3JvLgorCShMSU5VWF9DTF9FTkRfT0ZGU0VUKTogTGlrZXdpc2UuCisJKExJTlVYX1NFVFVQX01PVkVfU0laRSk6IExpa2V3aXNlLgorCShzdHJ1Y3QgbGludXhfa2VybmVsX2hlYWRlcik6IENoYW5nZSB0aGUgdHlwZSBvZiB0aGUgbWVtYmVyCisJImNtZF9saW5lX3B0ciIgdG8gY2hhciAqLgorCShsaW51eF9kYXRhX3RtcF9hZGRyKTogRGVjbGFyZWQuCisJKGxpbnV4X2RhdGFfcmVhbF9hZGRyKTogTGlrZXdpc2UuCisJKiBzdGFnZTIvYXNtLlMgWyFTVEFHRTFfNV0gKGxpbnV4X2RhdGFfdG1wX2FkZHIpOiBOZXcgdmFyaWFibGUuCisJWyFTVEFHRTFfNV0gKGxpbnV4X2RhdGFfcmVhbF9hZGRyKTogTGlrZXdpc2UuCisJWyFTVEFHRTFfNV0gKGJpZ19saW51eF9ib290KTogQ29weSB0aGUgcmVhbCBtb2RlIHBhcnQgZnJvbQorCUxJTlVYX0RBVEFfVE1QX0FERFIgdG8gTElOVVhfREFUQV9SRUFMX0FERFIuCisJKiBncnViL2FzbXN0dWIuYyAobGludXhfZGF0YV90bXBfYWRkcik6IE5ldyB2YXJpYWJsZS4KKwkobGludXhfZGF0YV9yZWFsX2FkZHIpOiBMaWtld2lzZS4KKworMjAwMi0wNy0wOSAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCQorCUZyb20gTWFyayBLZXR0ZW5pcyA8a2V0dGVuaXNAY2hlbGxvLm5sPjoKKwkqIHN0YWdlMi9ib290LmMgKGxvYWRfaW1hZ2UpOiBSZWNvZ25pemUgbmV3ZXIgRnJlZUJTRCBrZXJuZWxzLgorCSogc3RhZ2UyL2kzODYtZWxmLmggKEVJX09TQUJJKTogTmV3IG1hY3JvLgorCShFSV9BQklWRVJTSU9OKTogTGlrZXdpc2UuCisJKEVMRk9TQUJJX0ZSRUVCU0QpOiBMaWtld2lzZS4KKwkoRUlfUEFEKTogU2V0IHRvIDkuCisKKzIwMDItMDctMDYgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogc3RhZ2UyL3NoYXJlZC5oIChib290X3BhcnRfb2Zmc2V0KTogUmVtb3ZlZC4KKwkKKwkqIHN0YWdlMi9kaXNrX2lvLmMgKHNldF9ib290ZGV2KTogQ29weSB0aGUgcGFydGl0aW9uIGluZm9ybWF0aW9uCisJaGVyZS4gTm93IHRoaXMgZnVuY3Rpb24gY2FuIGNhbGwgcmF3cmVhZCwgc28gaXQgY2FuIGZhaWwuCisJKGJvb3RfcGFydF9vZmZzZXQpOiBSZW1vdmVkLgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoYm9vdF9mdW5jKTogRG9uJ3QgY29weSB0aGUgcGFydGl0aW9uCisJaW5mb3JtYXRpb24gaGVyZS4KKwkocmVhbF9yb290X2Z1bmMpOiBDaGVjayBFUlJOVU0gYWZ0ZXIgY2FsbGluZyBzZXRfYm9vdGRldi4KKworMjAwMi0wNy0wNCAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBkb2NzL2dydWIudGV4aSAoUmVwb3J0aW5nIGJ1Z3MpOiBVc2UgdGhlIGdyb3VwIG5hbWUgKGkuZS4KKwlncnViKSBpbnN0ZWFkIG9mIHRoZSBncm91cCBpZCAoaS5lLiA2OCkgZm9yIHRoZSBVUkwgb2YgdGhlIEJUUy4KKworMjAwMi0wNy0wMyAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBzdGFnZTIvc2VyaWFsLmMgWyFHUlVCX1VUSUxdIChpbmIpOiBBZGRlZCBhIGRlbGF5IGludG8gdGhpcworCWZ1bmN0aW9uIGl0c2VsZi4KKwlbIUdSVUJfVVRJTF0gKG91dGIpOiBMaWtld2lzZS4KKwlbIUdSVUJfVVRJTF0gKHNlcmlhbF9od19wdXQpOiBJbmNyZWFzZSB0aGUgdGltZW91dCB2YWx1ZSwgYW5kCisJZG9uJ3QgY2FsbCBzZXJpYWxfaHdfZGVsYXkgZXhwbGljaXRseSBhbnkgbG9uZ2VyLgorCShmaWxsX2lucHV0X2J1Zik6IEluY3JlYXNlIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLCByZXNldAorCXRoZSBjb3VudGVyIHRvIHplcm8gYWZ0ZXIgZ2V0dGluZyBhIHZhbGlkIGNoYXJhY3RlciwgYW5kIGRvbid0CisJY2FsbCBzZXJpYWxfaHdfZGVsYXkgZXhwbGljaXRseSBhbnkgbG9uZ2VyLgorCisyMDAyLTA3LTAzICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIHN0YWdlMi9zZXJpYWwuYyBbIUdSVUJfVVRJTF0gKHNlcmlhbF9od19mZXRjaCk6IEZpeGVkIGEgdHlwby4KKwlSZXBvcnRlZCBieSBJbGd1aXogTGF0eXBvdi4KKworMjAwMi0wNy0wMSAgWW9zaGlub3JpIEsuIE9rdWppIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIE1ha2VmaWxlLmFtIChBVVRPTUFLRV9PUFRJT05TKTogTmV3IHZhcmlhYmxlLiBTcGVjaWZ5IHRoZQorCXJlcXVpcmVkIEF1dG9tYWtlIHZlcnNpb24gZXhwbGljaXRseS4KKwkKKzIwMDItMDYtMzAgIFlvc2hpbm9yaSBLLiBPa3VqaSA8b2t1amlAZW5idWcub3JnPgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyBbU1VQUE9SVF9TRVJJQUwgfHwgU1VQUE9SVF9IRVJDVUxFU10KKwkodGVybWluYWxfZnVuYyk6IFNldCBDVVJSRU5UX1RFUk0gdG8gZWFjaCBvZiBzZWxlY3RlZCB0ZXJtaW5hbHMKKwliZWZvcmUgY2FsbGluZyBncnViX3ByaW50ZiwgYW5kIHJlc3RvcmUgQ1VSUkVOVF9URVJNIGFmdGVyIGl0LgorCVJlcG9ydGVkIGJ5IElsZ3VpeiBMYXR5cG92LgorCVByZXBlbmQgYSBjYXJyaWFnZSByZXR1cm4gdG8gdGhlIHByb21wdGluZyBtZXNzYWdlLCBiZWNhdXNlIGl0CisJaXMgdWdseSB0aGF0IHRoZSBzYW1lIG1lc3NhZ2VzIGZ1bGZpbGwgdGhlIHdob2xlIHNjcmVlbi4KKworMjAwMi0wNi0zMCAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBzdGFnZTIvc2VyaWFsLmMgWyFHUlVCX1VUSUxdIChzZXJpYWxfaHdfZmV0Y2gpOiBGaXhlZCB0aGUKKwljb25kaXRpb25hbCBzdGF0ZW1lbnQuIFJlcG9ydGVkIGJ5IElsZ3VpeiBMYXR5cG92LgorCQorMjAwMi0wNi0yNCAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBNQUlOVEVOQU5DRTogTmV3IGZpbGUuCisJCisyMDAyLTA2LTE1ICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIHN0YWdlMi9kaXNrX2lvLmMgW1NVUFBPUlRfTkVUQk9PVF0gKEdSVUIpOiBEZWZpbmVkLgorCVtTVVBQT1JUX05FVEJPT1RdOiBJbmNsdWRlIGV0aGVyYm9vdC5oLgorCVshU1RBR0UxXzVdIChwcmludF9jb21wbGV0aW9ucykgW1NVUFBPUlRfTkVUQk9PVF06IFdoZW4KKwljb21wbGV0aW5nIGEgZGlzayBuYW1lLCBpZiBORVRXT1JLX1JFQURZIGlzIHRydWUsIGFkZCAibmQiIGFzIGEKKwljb21wbGV0aW9uLgorCQorMjAwMi0wNi0xNSAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBzdGFnZTIvZnN5c194ZnMuYyAobGUzMik6IERvbid0IHVzZSBic3dhcCwgYnV0IHVzZSB4Y2hnYiBhbmQKKwlyb2xsLCBiZWNhdXNlIDM4NiBkb2Vzbid0IGhhdmUgYnN3YXAuIFJlcG9ydGVkIGJ5IEZyb2RlIFZhdHZlZHQKKwlGamVsZCA8ZnJvZGVmQGFjbS5vcmc+LgorCQorMjAwMi0wNi0xMiAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBuZXRib290L21haW4uYyAoaWZjb25maWcpOiBJZiBHVyBpcyBzcGVjaWZpZWQsIGNsZWFyIG91dCB0aGUKKwlBUlAgZW50cnkgZm9yIHRoZSBnYXRld2F5LiBJZiBTVlIgaXMgc3BlY2lmaWVkLCBjbGVhciBvdXQgdGhlCisJQVJQIGVudHJ5IGZvciB0aGUgc2VydmVyLiBSZXBvcnRlZCBieSBVd2UgRGFubm93c2tpCisJPHVkM0BpcmEudWthLmRlPi4KKwkKKzIwMDItMDYtMTIgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogdXRpbC9ncnViLW1kNS1jcnlwdC5pbjogUHJvbXB0IHRvIHJldHlwZSBhIHBhc3N3b3JkLCBhbmQgY2hlY2sKKwlpZiB0aGUgcGFzc3dvcmRzIG1hdGNoZXMuIFN1Z2dlc3RlZCBieSBNYXR0IFBlcnJ5CisJPG1hdHRAcHJpbWVmYWN0b3IuY29tPi4KKwlBbHNvLCBkb24ndCB1c2UgUGVybCBhbnkgbG9uZ2VyLCBiZWNhdXNlICpCU0QncyBzaCBhbmQgR05VCisJc3VwcG9ydCBgYHJlYWQgLXInJywgYW5kIEdSVUIgZG9lc24ndCBzdXBwb3J0IGFueSBvdGhlcgorCW9wZXJhdGluZyBzeXN0ZW0gYW55d2F5LgorCQorMjAwMi0wNi0xMiAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJVGhlIHRlcm1pbmFsIGhhbmRsaW5nIGNvZGUgaXMgcmV3cml0dGVuIHJhZGljYWxseS4KKwkKKwkqIHN0YWdlMi9jb25zb2xlLmM6IE5ldyBmaWxlLgorCSogc3RhZ2UyL3Rlcm0uaDogTGlrZXdpc2UuCisJCisJKiBzdGFnZTIvTWFrZWZpbGUuYW0gKG5vaW5zdF9IRUFERVJTKTogQWRkZWQgdGVybS5oLgorCShsaWJncnViX2FfU09VUkNFUyk6IEFkZGVkIHNlcmlhbC5jLgorCShwcmVfc3RhZ2UyX2V4ZWNfU09VUkNFUyk6IEFkZGVkIGNvbnNvbGUuYy4KKworCSogc3RhZ2UyL2FzbS5TIChjb25zb2xlX3B1dGNoYXIpOiBSZXdyaXR0ZW4gZnJvbSBzY3JhdGNoLgorCVshU1RBR0UxXzVdICh0cmFuc2xhdGlvbl90YWJsZSk6IE5ldyB2YXJpYWJsZS4KKwlbIVNUQUdFMV81XSAodHJhbnNsYXRlX2tleWNvZGUpOiBOZXcgZnVuY3Rpb24uCisJWyFTVEFHRTFfNV0gKGNvbnNvbGVfZ2V0a2V5KTogQ2FsbCB0cmFuc2xhdGVfa2V5Y29kZS4KKwlbIVNUQUdFMV81XSAoY29uc29sZV9jaGVja2tleSk6IExpa2V3aXNlLgorCVshU1RBR0UxXzVdIChub2N1cnNvcik6IFJlbmFtZWQgdG8gLi4uCisJWyFTVEFHRTFfNV0gKGNvbnNvbGVfbm9jdXJzb3IpOiAuLi4gdGhpcy4KKwlbIVNUQUdFMV81XSAoY29uc29sZV9zZXRfYXR0cmliKTogUmVtb3ZlZC4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmM6IEluY2x1ZGUgdGVybS5oLgorCSh0ZXJtaW5hbCk6IFJlbW92ZWQuCisJKG5vcm1hbF9jb2xvcik6IExpa2V3aXNlLgorCShoaWdobGlnaHRfY29sb3IpOiBMaWtld2lzZS4KKwkoY2F0X2Z1bmMpOiBEaXNwbGF5IGEgcXVlc3Rpb24gbWFyayB3aGVuIGEgbm9uLXByaW50YWJsZQorCWNoYXJhY3RlciB3YXMgcmVhZC4KKwkodGVybWluYWxfZnVuYyk6IFJld3JpdHRlbiBhbG1vc3QgZnJvbSBzY3JhdGNoLgorCisJKiBzdGFnZTIvY2hhcl9pby5jOiBJbmNsdWRlIHRlcm0uaC4KKwlbIVNUQUdFMV81XSAoYXV0b19maWxsKTogUmVtb3ZlZC4KKwlbIVNUQUdFMV81XSAodGVybV90YWJsZSk6IE5ldyB2YXJpYWJsZS4KKwlbIVNUQUdFMV81XSAoY3VycmVudF90ZXJtKTogTGlrZXdpc2UuCisJWyFTVEFHRTFfNV0gKHJlYWxfZ2V0X2NtZGxpbmUpOiBOZXcgZnVuY3Rpb24uIFRoZSBjb2RlIHdhcworCXN0b2xlbiBmcm9tIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mIGdldF9jbWRsaW5lLgorCVshU1RBR0UxXzVdIChnZXRfY21kbGluZSk6IFJld3JpdHRlbiBmcm9tIHNjcmF0Y2guCisJWyFTVEFHRTFfNV0gKHRyYW5zbGF0ZV9rZXljb2RlKTogUmVtb3ZlZC4KKwlbIVNUQUdFMV81XSAoZ2V0a2V5KTogUmV3cml0dGVuIGZyb20gc2NyYXRjaC4KKwlbIVNUQUdFMV81XSAoY2hlY2trZXkpOiBMaWtld2lzZS4KKwkoZ3J1Yl9wdXRjaGFyKTogTGlrZXdpc2UuCisJWyFTVEFHRTFfNV0gKGdvdG94eSk6IExpa2V3aXNlLgorCVshU1RBR0UxXzVdIChnZXR4eSk6IExpa2V3aXNlLgorCVshU1RBR0UxXzVdIChjbHMpOiBMaWtld2lzZS4KKwlbIVNUQUdFMV81XSAobm9jdXJzb3IpOiBOZXcgZnVuY3Rpb24uCisJW1NVUFBPUlRfU0VSSUFMXSAoc2VyaWFsX2dldHh5KTogUmVtb3ZlZC4KKwlbU1VQUE9SVF9TRVJJQUxdIChzZXJpYWxfZ290b3h5KTogTGlrZXdpc2UuCisJW1NVUFBPUlRfU0VSSUFMXSAoc2VyaWFsX2Nscyk6IExpa2V3aXNlLgorCVtTVVBQT1JUX1NFUklBTF0gKHNlcmlhbF9nZXR4eSk6IExpa2V3aXNlLgorCVshU1RBR0UxXzVdIChzZXRfYXR0cmliKTogTGlrZXdpc2UuCisKKwkqIHN0YWdlMi9jbWRsaW5lLmMgKGluaXRfY21kbGluZSk6IFNldCBDT1VOVF9MSU5FUyB0byAtMS4KKworCSogc3RhZ2UyL2NvbW1vbi5jIFshU1RBR0UxXzVdIChlcnJfbGlzdCk6IFJlbW92ZWQKKwlFUlJfTkVFRF9TRVJJQUwgYW5kIGFkZGVkIEVSUl9ERVZfTkVFRF9JTklULgorCisJKiBzdGFnZTIvaGVyY3VsZXMuYzogUmV3cml0dGVuIGFsbW9zdCBmcm9tIHNjcmF0Y2guCisJKiBzdGFnZTIvaGVyY3VsZXMuaCAoaGVyY19wdXRjaGFyKTogUmVtb3ZlZC4KKwkoaGVyY19jbHMpOiBMaWtld2lzZS4KKwkoaGVyY19nZXR4eSk6IExpa2V3aXNlLgorCShoZXJjX2dvdG94eSk6IExpa2V3aXNlLgorCShoZXJjX3NldF9hdHRyaWIpOiBMaWtld2lzZS4KKworCSogc3RhZ2UyL3NlcmlhbC5jOiBSZXdyaXR0ZW4gYWxtb3N0IGZyb20gc2NyYXRjaC4KKwkqIHN0YWdlMi9zZXJpYWwuaDogTGlrZXdpc2UuCisKKwkqIHN0YWdlMi9zaGFyZWQuaCBbR1JVQl9VVElMXSAoRElTUF9VTCk6IFNldCB0byB0aGUgc2FtZSB2YWx1ZQorCWFzIFZHQSdzLgorCVtHUlVCX1VUSUxdIChESVNQX1VSKTogTGlrZXdpc2UuCisJW0dSVUJfVVRJTF0gKERJU1BfTEwpOiBMaWtld2lzZS4KKwlbR1JVQl9VVElMXSAoRElTUF9MUik6IExpa2V3aXNlLgorCVtHUlVCX1VUSUxdIChESVNQX0hPUklaKTogTGlrZXdpc2UuCisJW0dSVUJfVVRJTF0gKERJU1BfVkVSVCk6IExpa2V3aXNlLgorCVtHUlVCX1VUSUxdIChESVNQX0xFRlQpOiBMaWtld2lzZS4KKwlbR1JVQl9VVElMXSAoRElTUF9SSUdIVCk6IExpa2V3aXNlLgorCVtHUlVCX1VUSUxdIChESVNQX1VQKTogTGlrZXdpc2UuCisJW0dSVUJfVVRJTF0gKERJU1BfRE9XTik6IExpa2V3aXNlLgorCShncnViX2Vycm9yX3QpOiBSZW1vdmVkIEVSUl9ORUVEX1NFUklBTC4KKwlBZGRlZCBFUlJfREVWX05FRURfSU5JVC4KKwkobm9ybWFsX2NvbG9yKTogUmVtb3ZlZC4KKwkoaGlnaGxpZ2h0X2NvbG9yKTogTGlrZXdpc2UuCisJKGNvbnNvbGVfY2xzKTogUmVtb3ZlZCwgYmVjYXVzZSB0aGlzIGlzIGRlY2xhcmVkIGluIHRlcm0uaC4KKwkoY29uc29sZV9nZXR4eSk6IExpa2V3aXNlLgorCShjb25zb2xlX2dvdG94eSk6IExpa2V3aXNlLgorCShjb25zb2xlX3B1dGNoYXIpOiBMaWtld2lzZS4KKwkoY29uc29sZV9nZXRrZXkpOiBMaWtld2lzZS4KKwkoY29uc29sZV9jaGVja2tleSk6IExpa2V3aXNlLgorCShjb25zb2xlX3NldF9hdHRyaWIpOiBSZW1vdmVkLgorCShzZXRfYXR0cmliKTogTGlrZXdpc2UuCisJW0dSVUJfVVRJTF0gKG5vY3Vyc29yKTogRGVjbGFyZWQuCisJKGF1dG9fZmlsbCk6IFJlbW92ZWQuCisJKHRlcm1pbmFsKTogTGlrZXdpc2UuCisJKFRFUk1JTkFMX0NPTlNPTEUpOiBMaWtld2lzZS4KKwkoVEVSTUlOQUxfU0VSSUFMKTogTGlrZXdpc2UuCisJKFRFUk1JTkFMX0hFUkNVTEVTKTogTGlrZXdpc2UuCisJKFRFUk1JTkFMX0RVTUIpOiBMaWtld2lzZS4KKwkodHJhbnNsYXRlX2tleWNvZGUpOiBMaWtld2lzZS4KKworCSogc3RhZ2UyL3N0YWdlMi5jOiBJbmNsdWRlIHRlcm0uaC4KKwkocHJpbnRfZW50cnkpOiBSZXdyaXR0ZW4gZnJvbSBzY3JhdGNoLgorCShwcmludF9lbnRyaWVzKTogTGlrZXdpc2UuCisJKHByaW50X2JvcmRlcik6IExpa2V3aXNlLgorCShzZXRfbGluZSk6IFJlbW92ZWQuCisJKHNldF9saW5lX25vcm1hbCk6IExpa2V3aXNlLgorCShzZXRfbGluZV9oaWdobGlnaHQpOiBMaWtld2lzZS4KKwkKKwkqIGdydWIvTWFrZWZpbGUuYW0gKEFNX0NGTEFHUyk6IEFkZGVkIC1EU1VQUE9SVF9IRVJDVUxFUz0xLgorCQorCSogZ3J1Yi9hc21zdHViLmM6IERvbid0IGluY2x1ZGUgaGVyY3VsZXMuaC4gSW5jbHVkZSB0ZXJtLmguCisJKGNvbnNvbGVfY3VycmVudF9jb2xvcik6IE5ldyB2YXJpYWJsZS4KKwkoY29uc29sZV90cmFuc2xhdGVfa2V5KTogTmV3IGZ1bmN0aW9uLgorCShjb25zb2xlX2NoZWNra2V5KTogUmV3cml0dGVuIGZyb20gc2NyYXRjaC4KKwkoY29uc29sZV9nZXRrZXkpOiBMaWtld2lzZS4KKwkoY29uc29sZV9wdXRjaGFyKTogTGlrZXdpc2UuCisJKGNvbnNvbGVfc2V0X2F0dHJpYik6IFJlbW92ZWQuCisJKGNvbnNvbGVfaGlnaGxpZ2h0KTogTmV3IGZ1bmN0aW9uLgorCShjb25zb2xlX3NldGNvbG9yKTogTGlrZXdpc2UuCisJKGNvbnNvbGVfbm9jdXJzb3IpOiBMaWtld2lzZS4KKwkoc2VyaWFsX2dldGtleSk6IFJlbW92ZWQuCisJKHNlcmlhbF9jaGVja2tleSk6IExpa2V3aXNlLgorCShzZXJpYWxfcHV0Y2hhcik6IExpa2V3aXNlLgorCShzZXJpYWxfZXhpc3RzKTogTGlrZXdpc2UuCisJKHNlcmlhbF9nZXRfcG9ydCk6IExpa2V3aXNlLgorCShzZXJpYWxfaW5pdCk6IExpa2V3aXNlLgorCShzZXJpYWxfaHdfZmV0Y2gpOiBOZXcgZnVuY3Rpb24uCisJKHNlcmlhbF9od19wdXQpOiBMaWtld2lzZS4KKwkoc2VyaWFsX2h3X2RlbGF5KTogTGlrZXdpc2UuCisJKHNlcmlhbF9od19nZXRfcG9ydCk6IExpa2V3aXNlLgorCShzZXJpYWxfaHdfaW5pdCk6IExpa2V3aXNlLgorCShzZXRfc2VyaWFsX2RldmljZSk6IFJlbmFtZWQgdG8gLi4uCisJKHNlcmlhbF9zZXRfZGV2aWNlKTogLi4uIHRoaXMuCisJKGhlcmNfcHV0Y2hhcik6IFJlbmFtZWQgdG8gLi4uCisJKGhlcmN1bGVzX3B1dGNoYXIpOiAuLi4gdGhpcy4KKwkoaGVyY19jbHMpOiBSZW5hbWVkIHRvIC4uLgorCShoZXJjdWxlc19jbHMpOiAuLi4gdGhpcy4KKwkoaGVyY19nZXR4eSk6IFJlbmFtZWQgdG8gLi4uCisJKGhlcmN1bGVzX2dldHh5KTogLi4uIHRoaXMuCisJKGhlcmNfZ290b3h5KTogUmVuYW1lZCB0byAuLi4KKwkoaGVyY3VsZXNfZ290b3h5KTogLi4uIHRoaXMuCisJKGhlcmN1bGVzX2hpZ2hsaWdodCk6IE5ldyBmdW5jdGlvbi4KKwkoaGVyY3VsZXNfc2V0Y29sb3IpOiBMaWtld2lzZS4KKwkoaGVyY3VsZXNfbm9jdXJzb3IpOiBMaWtld2lzZS4KKwkoaGVyY19zZXRfYXR0cmliKTogUmVtb3ZlZC4KKworCSogZ3J1Yi9tYWluLmM6IEluY2x1ZGUgdGVybS5oLgorCShtYWluKTogSWYgVVNFX0NVUlNFUyBpcyBmYWxzZSwgc2V0IENVUlJFTlRfVEVSTS0+RkxBR1MgdG8KKwlURVJNX05PX0VESVQgfCBURVJNX0RVTUIuIFRFUk1JTkFMIGlzIG5vdCB1c2VkIGFueSBsb25nZXIuCisJCisyMDAyLTA2LTAxICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIGRvY3MvZ3J1Yi50ZXhpIChGQVEpOiBSZW1vdmVkLiBTZWUgdGhlIEdOVSBHUlVCIEZBUSBvbiB0aGUgd2ViCisJaW5zdGVhZC4KKwkKKzIwMDItMDUtMzEgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogZG9jcy9ncnViLnRleGkgKFJlcG9ydGluZyBidWdzKTogUmVjb21tZW5kIHVzaW5nIHRoZSBCVFMgb24KKwlTYXZhbm5haCByYXRoZXIgdGhhbiB0aGUgbGlzdCBidWctZ3J1Yi4KKwkKKzIwMDItMDUtMjUgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGJvb3RfZnVuYyk6IExvYWQgdGhlIGJvb3QgcGFydGl0aW9uCisJaW5mb3JtYXRpb24sIG9ubHkgaWYgdGhlIGFkZHJlc3Mgb2YgdGhlIGJvb3QgcGFydGl0aW9uIGVudHJ5IGlzCisJc2V0IGFwcHJvcHJpYXRlbHkuCisJKHJlYWxfcm9vdF9mdW5jKTogSWYgQVRURU1QVF9NT1VOVCBpcyBmYWxzZSwgY2FsbCBvcGVuX3BhcnRpdGlvbgorCWFuZCBpZiBzdWNjZXNzZnVsLCBjYWxsIHNldF9ib290ZGV2LCB0byBzZXQgdGhlIG9mZnNldCBvZiB0aGUKKwlib290IHBhcnRpdGlvbiBhbmQgdGhlIGFkZHJlc3Mgb2YgdGhlIGJvb3QgcGFldGl0aW9uIGVudHJ5LgorCUlGIEFUVEVNUFRfTU9VTlQgaXMgZmFsc2UsIGRvbid0IHNldCBCT09UREVWLiBUaGUgQlNEIGV2aWwgaGFjaworCWlzIHVzZWxlc3Mgd2l0aCB0aGUgY29tbWFuZCAicm9vdG5vdmVyaWZ5IiBhbnl3YXkuCisJKiBzdGFnZTIvZGlza19pby5jIChib290X3BhcnRfYWRkcik6IEluaXRpYWxpemVkIHdpdGggemVybworCWV4cGxpY2l0bHksIHRvIGVtcGhhc2l6ZSB0aGF0IGl0IGlzIGludmFsaWQuCisJCisyMDAyLTA1LTI0ICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChyZWFsX3Jvb3RfZnVuYyk6IE5ldyBmdW5jdGlvbi4KKwkocm9vdF9mdW5jKTogSnVzdCBjYWxsIHJlYWxfcm9vdF9mdW5jLgorCShyb290bm92ZXJpZnlfZnVuYyk6IExpa2V3aXNlLgorCQorMjAwMi0wNS0yMyAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBjb25maWd1cmUuaW4gKEFNX0lOSVRfQVVUT01BS0UpOiBDaGFuZ2VkIHRoZSB2ZXJzaW9uIG51bWJlciB0bworCTAuOTMuCisJCisyMDAyLTA1LTIzICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwlEZWZpbmUgdGhlIGJlaGF2aW9yIG9mIHRoZSBib290IGxvYWRlciB3aGVuIHRoZSBsb2FkIGVuZCBhZGRyZXNzCisJYW5kIHRoZSBic3MgZW5kIGFkZHJlc3MgYXJlIHplcm8gaW4gdGhlIE11bHRpYm9vdCBTcGVjaWZpY2F0aW9uLAorCWFuZCBhZGQgdGhlIHN1cHBvcnQgaW50byBHUlVCLiBJJ3ZlIG1vZGlmaWVkIGEgcGF0Y2ggZnJvbSBZdXJpCisJWmFwb3JvZ2V0cyA8eXVyaXpAdWtyLm5ldD4uCisJCisJKiBzdGFnZTIvYm9vdC5jIChsb2FkX2ltYWdlKTogSW4gdGhlIGNhc2Ugb2YgTXVsdGlib290IGEub3V0CisJa2x1ZGdlLCBzZXQgdGhlIGxvYWQgZW5kIGFkZHJlc3MgdG8gdGhlIGxvYWQgYWRkcmVzcyBwbHVzIHRoZQorCXNpemUgb2YgdGhlIE9TIGltYWdlIGZpbGUsIGlmIGl0IGlzIHplcm8uIFNpbWlsYXJseSwgc2V0IHRoZSBic3MKKwllbmQgYWRkcmVzcyB0byB0aGUgbG9hZCBlbmQgYWRkcmVzcywgaWYgaXQgaXMgemVyby4KKwkKKwkqIHV0aWwvbWJjaGsuYyAoY2hlY2tfbXVsdGlib290KTogRG9uJ3QgY2hlY2sgaWYgdGhlIGxvYWQKKwlhZGRyZXNzIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbG9hZCBlbmQgYWRkcmVzcywgaWYgdGhlCisJbG9hZCBlbmQgYWRkcmVzcyBpcyB6ZXJvLiBEb24ndCBjaGVjayBpZiB0aGUgbG9hZCBlbmQgYWRkcmVzcyBpcworCWdyZWF0ZXIgdGhhbiB0aGUgYnNzIGVuZCBhZGRyZXNzLCBpZiB0aGUgYnNzIGVuZCBhZGRyZXNzIGlzCisJemVyby4gQW5kLCBkb24ndCBjaGVjayBpZiB0aGUgbG9hZCBlbmQgYWRkcmVzcyBpcyBsZXNzIHRoYW4gb3IKKwllcXVhbCB0byB0aGUgZW50cnkgYWRkcmVzcywgaWYgdGhlIGxvYWQgZW5kIGFkZHJlc3MgaXMgemVyby4KKwkKKwkqIGRvY3MvbXVsdGlib290LnRleGkgKFRoZSBhZGRyZXNzIGZpZWxkcyBvZiBNdWx0aWJvb3QgaGVhZGVyKToKKwlBZGRlZCBkZXNjcmlwdGlvbnMgYWJvdXQgdGhlIGJlaGF2aW9yIG9mIHRoZSBib290IGxvYWRlciB3aGVuCisJTE9BRF9FTkRfQUREUiBpcyB6ZXJvIGFuZCBCU1NfRU5EX0FERFIgaXMgemVyby4KKwkKKzIwMDItMDUtMjIgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGJvb3RfZnVuYyk6IElmIERFQlVHIGlzIHRydWUsIHByaW50CisJQk9PVF9EUklWRSBhbmQgQk9PVF9QQVJUX09GRlNFVC4KKwlEb24ndCBzZXQgRVJSTlVNIGFmdGVyIHJhd3JlYWQgZmFpbGVkLCBiZWNhdXNlIHJhd3JlYWQgc2hvdWxkCisJc2V0IEVSUk5VTSBpdHNlbGYuCisJCisyMDAyLTA1LTIwICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIGxpYi9kZXZpY2UuYyAocmVhZF9kZXZpY2VfbWFwKTogU2hvdyBhbiBlcnJvciBtZXNzYWdlIGFuZCBleGl0CisJYWJub3JtYWxseSwgaWYgTUFQW0RSSVZFXSBoYXMgYWxyZWFkeSBiZWVuIGZpbGxlZC4KKwkqIHV0aWwvZ3J1Yi1pbnN0YWxsLmluOiBJZiB0aGVyZSBpcyBhbnkgZHVsaWNhdGVkIGVudHJ5LCBwcmludAorCWFuIGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQgYWJub3JtYWxseS4KKwkKKzIwMDItMDUtMjAgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogbGliL2RldmljZS5jOiBEb24ndCBpbmNsdWRlIGxpbnV4L2hkcmVnLmgsIGxpbnV4L21ham9yLmgsCisJb3IgbGludXgva2Rldl90LmguCisJW19fbGludXhfX10gKEhESU9fR0VUR0VPKTogRGVmaW5lZC4KKwlbX19saW51eF9fXSAoaGRfZ2VvbWV0cnkpOiBMaWtld2lzZS4KKwlbX19saW51eF9fXSAoRkxPUFBZX01BSk9SKTogTGlrZXdpc2UuCisJW19fbGludXhfX10gKE1JTk9SQklUUyk6IExpa2V3aXNlLgorCVtfX2xpbnV4X19dIChNQUpPUik6IExpa2V3aXNlLgorCQorMjAwMi0wNS0wOCAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBuZXRib290L2ZzeXNfdGZ0cC5jICh0ZnRwX3JlYWQpOiBEb24ndCBjYWxsIGJ1Zl9maWxsIHVubGVzcworCVNJWkUgaXMgcG9zaXRpdmUuCisJCisyMDAyLTA1LTA4ICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIG5ldGJvb3QvZXRoZXJib290LmggKEVUSF9NQVhfTVRVKTogQmVjYXVzZSBzb21lIERIQ1AvQk9PVFAKKwlzZXJ2ZXJzIGRvbid0IHRyZWF0IHRoZSBtYXhpbXVtIGxlbmd0aCB0aGUgc2FtZSBhcyBFdGhlcmJvb3QsCisJc3VidHJhY3QgdGhlIHNpemUgb2YgYW4gSVAgaGVhZGVyIGFuZCB0aGF0IG9mIGFuIFVEUCBoZWFkZXIuCisJCisyMDAyLTA0LTMwICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwlGcm9tIEplYW4tSmFjcXVlcyBNaWNoZWwgPGpqbWljaGVsQGxpbmJveC5jb20+OgorCSogc3RhZ2UyL2Jvb3QuYyAobG9hZF9pbWFnZSk6IEZvciBMaW51eCwgY2hlY2sgaWYgREFUQV9MRU4gaXMKKwlncmVhdGVyIHRoYW4gTVVMVElCT09UX1NFQVJDSC4gSWYgdGhhdCdzIHRydWUsIHJlYWQgdGhlIHJlc3QKKwlhZnRlciBjb3B5aW5nIGRhdGEgYWxyZWFkeSByZWFkIGluIEJVRkZFUi4KKwkKKzIwMDItMDQtMzAgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogc3RhZ2UyL2Jvb3QuYyAobG9hZF9pbWFnZSk6IEZvciBMaW51eCwgZG9uJ3QgY2hlY2sgaWYgdGhlCisJbGVuZ3RoIG9mIHByb3RlY3RlZCBtb2RlIGNvZGUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZQorCWV4cGVjdGVkIGxlbmd0aCBtaW51cyAxNi4gSW5zdGVhZCwganVzdCBjaGVjayBpZiBubyBlcnJvcgorCW9jY3VycmVkLiBUaGF0IHdhcyBwcm9ibGVtYXRpYywgYmVjYXVzZSBtZW1kaXNrIGhhcyBubyBwcm90ZWN0ZWQKKwltb2RlIGNvZGUuIEFsc28sIEkgZG9uJ3Qgc2VlIHdoYXQgdGhlIG1hZ2ljIG51bWJlciAxNiB3YXMgZm9yLgorCQorMjAwMi0wNC0yOSAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyBbU1VQUE9SVF9TRVJJQUxdICh0ZXJtaW5hbF9mdW5jKTogQWRkZWQgYQorCW5ldyBvcHRpb24gYGAtLXNpbGVudCcnLiBUaGlzIHN1cHByZXNzZXMgbWVzc2FnZXMsIGlmIHNwZWNpZmllZC4KKwkKKzIwMDItMDQtMjkgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogY29uZmlnLmd1ZXNzOiBOZXcgdXBzdHJlYW0gdmVyc2lvbi4KKwkqIGNvbmZpZy5zdWI6IExpa2V3aXNlLgorCQorMjAwMi0wNC0yMCAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBuZXRib290L2NvbmZpZy5jIChQQ0lfTklDKSBbSU5DTFVERV9EQVZJQ09NXTogRml4IHR5cG9zLgorCVJlcG9ydGVkIGJ5IEp1bGllbiBQZXJyb3QgPGp1bGllbi5wZXJyb3RAaWllLmNuYW0uZnI+LgorCQorMjAwMi0wNC0xNyAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyBbU1VQUE9SVF9TRVJJQUxdICh0ZXJtaW5hbF9mdW5jKTogU2V0CisJQ09VTlRfTElORVMgdG8gLTEsIHRvIGRpc2FibGUgdGhlIHBhZ2VyLgorCQorMjAwMi0wNC0xNiAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBkb2NzL2dydWIudGV4aSAoT2J0YWluaW5nIGFuZCBCdWlsZGluZyBHUlVCKTogVXBkYXRlIHRoZSBsaW5rCisJdG8gdGhlIGJpbnV0aWxzIHNpdGUuCisKKzIwMDItMDQtMDYgIFBhdmVsIFJvc2tpbiAgPHByb3NraUBnbnUub3JnPgorCisJKiB1dGlsL2dydWItaW5zdGFsbC5pbjogRml4IGhhcmRjb2RlZCAvZGV2L2hkYTEuCisKKzIwMDItMDQtMDYgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgW0dSVUJfVVRJTF0gKGR1bXBfZnVuYyk6IE5ldyBmdW5jdGlvbi4KKwlbR1JVQl9VVElMXSAoYnVpbHRpbl9kdW1wKTogTmV3IHZhcmlhYmxlLgorCShidWlsdGluX3RhYmxlKSBbR1JVQl9VVElMXTogQWRkZWQgYSBwb2ludGVyIHRvIEJVSUxUSU5fRFVNUC4KKwkqIHV0aWwvZ3J1Yi1pbnN0YWxsLmluOiBNYWtlIHN1cmUgdGhhdCBHUlVCIHJlYWRzIHRoZSBzYW1lCisJaW1hZ2VzIGFzIHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0gYnkgY29tcGFyaW5nIHRoZSByZXN1bHQgb2YKKwlydW5uaW5nIHRoZSBjb21tYW5kICJkdW1wIiB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgT1MgZmlsZS4KKwkKKzIwMDItMDQtMDQgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgKHNldHVwX2Z1bmMpOiBEb24ndCBlbWJlZCBhIGRyaXZlIG51bWJlciwgaWYKKwl1bm5lY2Vzc2FyeS4KKwkKKzIwMDItMDMtMjkgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogZG9jcy9ncnViLnRleGkgKEdlbmVyYWwgY29tbWFuZHMpOiBBZGRlZCBgYHBhZ2VyJycgaW50byB0aGUKKwltZW51LgorCShwYWdlcik6IE5ldyBzdWJzZWN0aW9uLgorCSh0ZXJtaW5hbCk6IEFkZGVkIGEgZGVzY3JpcHRpb24gYWJvdXQgdGhlIG9wdGlvbgorCWBgLS1saW5lcz1MSU5FUycnLgorCisJKiBjb25maWd1cmUuaW4gKEFDX0lOSVRfQVVUT01BS0UpOiBTZXQgdGhlIHZlcnNpb24gbnVtYmVyIHRvCisJMC45Mi4KKwkKKzIwMDItMDMtMjYgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogbmV0Ym9vdC9lZXBybzEwMC5jIChlZXBybzEwMF9wcm9iZSk6IEluY3JlYXNlIHRoZSBkZWxheSBhdCB0aGUKKwlpbml0aWFsaXphdGlvbi4KKwkKKzIwMDItMDMtMjYgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogc3RhZ2UyL2Jvb3QuYyAobGludXhfbWVtX3NpemUpOiBOZXcgdmFyaWFibGUuCisJKGxvYWRfaW1hZ2UpOiBDaGVjayBhIG1lbT0gb3B0aW9uIGFuZCBzZXQgTElOVVhfTUVNX1NJWkUgdG8gdGhlCisJc3BlY2lmaWVkIG1lbW9yeSBzaXplLCBpZiBhbnkuIE90aGVyd2lzZSwgdG8gemVyby4gV2hlbiBhbgorCW92ZXJmbG93IGlzIGRldGVjdGVkLCB1c2UgTElOVVhfSU5JVFJEX01BWF9BRERSRVNTIGluc3RlYWQuCisJKGxvYWRfaW5pdHJkKTogSWYgTElOVVhfTUVNX1NJWkUgaXMgbm9uLXplcm8sIHVzZSBpdCBpbnN0ZWFkIG9mCisJdGhlIGFjdHVhbCBtZW1vcnkgc2l6ZS4KKwkqIHN0YWdlMi9jaGFyX2lvLmMgKHNhZmVfcGFyc2VfbWF4aW50KTogVXNlIEVSUl9OVU1CRVJfT1ZFUkZMT1cKKwlpbnN0ZWFkIG9mIEVSUl9OVU1CRVJfUEFSU0lORywgd2hlbiBhbiBvdmVyZmxvdyBvY2N1cnMuCisJKiBzdGFnZTIvY29tbW9uLmMgWyFTVEFHRTFfNV0gKGVycl9saXN0KTogQWRkZWQKKwlFUlJfTlVNQkVSX09WRVJGTE9XLgorCSogc3RhZ2UyL3NoYXJlZC5oIChFUlJfTlVNQkVSX09WRVJGTE9XKTogTmV3IGNvbnN0YW50LgorCQorMjAwMi0wMy0yNCAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBzdGFnZTIvc3RhZ2UyLmMgKHJ1bl9tZW51KTogQ2FsbCBjbHMgb3V0c2lkZSB0aGUgbG9vcCB0byBydW4KKwlzY3JpcHRzLgorCSogc3RhZ2UyL2NtZGxpbmUuYyAocnVuX3NjcmlwdCk6IFByb21wdCBhIHVzZXIncyBpbnRlcnZlbnRpb24sCisJb25seSB3aGVuIEZBTExCQUNLX0VOVFJZIGlzIG5lZ2F0aXZlLgorCQorMjAwMi0wMi0xMSAgUGF2ZWwgUm9za2luICA8cHJvc2tpQGdudS5vcmc+CisKKwkqIHV0aWwvZ3J1Yi1pbnN0YWxsLmluIChmaW5kX2RldmljZSk6IE5ldyBmdW5jdGlvbiAtIGZpbmQgYmxvY2sKKwlkZXZpY2UgZm9yIGdpdmVuIGZpbGUgb3IgZGlyZWN0b3J5LiAgUmVzb2x2ZSBzeW1saW5rcyB0byBmaXgKKwlwcm9ibGVtIG9uIExpbnV4IHdpdGggZGV2ZnMgYW5kIG9sZCBkZXZpY2UgbmFtZXMgaW4gL2V0Yy9mc3RhYi4KKwlVc2UgZmluZF9kZXZpY2UoKSBmb3Igcm9vdF9kZXZpY2UsIGJvb3RkaXJfZGV2aWNlIGFuZAorCWdydWJkaXJfZGV2aWNlLgorCisyMDAyLTAyLTA4ICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIGdydWIvbWFpbi5jIChPUFRfTk9fUEFHRVIpOiBOZXcgbWFjcm8uCisJKGxvbmdvcHRzKTogQWRkZWQgYW4gZW50cnkgZm9yICItLW5vLXBhZ2VyIi4KKwkodXNhZ2UpOiBBZGRlZCBhIGRlc2NyaXB0aW9uIGFib3V0ICItLW5vLXBhZ2VyIi4KKwkobWFpbik6IEluIGNhc2Ugb2YgT1BUX05PX1BBR0VSLCBzZXQgVVNFX1BBR0VSIHRvIHplcm8uIFRoZSBzYW1lCisJdGhpbmcgaXMgZG9uZSB3aXRoIE9QVF9CQVRDSCwgYmVjYXVzZSB0aGUgcGFnZXIgaXMganVzdCBoYXJtZnVsCisJaW4gYmF0Y2ggbW9kZS4KKwkKKzIwMDItMDItMDggIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGhlbHBfZnVuYyk6IFNob3cgYWxsIHRoZSBjb21tYW5kcyBydW5uYWJsZQorCXdpdGggdGhlIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UsIGlmICItLWFsbCIgaXMgc3BlY2lmaWVkLgorCQorMjAwMi0wMi0wOCAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJQW4gaW50ZXJuYWwgcGFnZXIgaXMgaW1wbGVtZW50ZWQuCisJCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAocGFnZXJfZnVuYyk6IE5ldyBmdW5jdGlvbi4KKwkoYnVpbHRpbl9wYWdlcik6IE5ldyB2YXJpYWJsZS4KKwkodGVybWluYWxfZnVuYyk6IE5ldyBvcHRpb24sICItLWxpbmVzPUxJTkVTIiBpcyBhZGRlZC4gSWYgdGhpcworCW9wdGlvbiBpcyBzcGVjaWZpZWQsIHNldCBNQVhfTElORVMgdG8gdGhlIHZhbHVlLiBPdGhlcndpc2UsIHNldAorCU1BWF9MSU5FUyB0byAyNC4KKwkodmJlcHJvYmVfZnVuYyk6IFJlbW92ZSB0aGUgcGFnZXIgY29kZSBzcGVjaWZpYyB0byB0aGlzCisJZnVuY3Rpb24uCisJKGJ1aWx0aW5fdGFibGUpOiBBZGRlZCBhIHBvaW50ZXIgdG8gQlVJTFRJTl9QQUdFUi4KKwkqIHN0YWdlMi9jaGFyX2lvLmMgKG1heF9saW5lcykgWyFTVEFHRTFfNV06IE5ldyB2YXJpYWJsZS4KKwkoY291bnRfbGluZXMpIFshU1RBR0UxXzVdOiBMaWtld2lzZS4KKwkodXNlX3BhZ2VyKSBbIVNUQUdFMV81XTogTGlrZXdpc2UuCisJKGdydWJfcHV0Y2hhcikgWyFTVEFHRTFfNV06IGlmIEMgaXMgYSBuZXdsaW5lIGFuZCBDT1VOVF9MSU5FUyBpcworCW5vdCAtMSwgY291bnQgdXAgdGhlIG51bWJlciBvZiBsaW5lcy4gSWYgaXQgZXhjZWVkcyB0aGUgbWF4aW11bQorCW51bWJlciBvZiBsaW5lcyBtaW51cyAyLCBzaG93IGEgbWVzc2FnZSBhbmQgd2FpdCBmb3IgaW5wdXQgb2YKKwlyZXR1cm4ga2V5LiAibWludXMgMiIgaXMgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIG1lc3NhZ2UKKwlwcmludGVkIGJ5IHRoaXMgaW50ZXJuYWwgcGFnZXIuCisJKiBzdGFnZTIvY21kbGluZS5jIChlbnRlcl9jbWRsaW5lKTogSWYgVVNFX1BBR0VSIGlzIHRydWUsIHNldAorCUNPVU5UX0xJTkVTIHRvIHplcm8sIGJlZm9yZSBydW5uaW5nIGEgY29tbWFuZCwgYW5kIHJlc2V0CisJQ09VTlRfTElORVMgdG8gLTEgYWZ0ZXIgdGhhdC4KKwkqIHN0YWdlMi9zaGFyZWQuaCAobWF4X2xpbmVzKSBbIVNUQUdFMV81XTogRGVjbGFyZWQuCisJKGNvdW50X2xpbmVzKSBbIVNUQUdFMV81XTogTGlrZXdpc2UuCisJKHVzZV9wYWdlcikgWyFTVEFHRTFfNV06IExpa2V3aXNlLgorCQorMjAwMi0wMi0wOCAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBzdGFnZTIvZnN5c19qZnMuYyAoamZzX3JlYWQpIFtTVEFHRTFfNV06IFNldCBhbmQgcmVzZXQKKwlESVNLX1JFQURfRlVOQyBldmVuIGluIFN0YWdlIDEuNS4KKwkqIHN0YWdlMi9mc3lzX3hmcy5jICh4ZnNfcmVhZCkgW1NUQUdFMV81XTogTGlrZXdpc2UuCisKKwkqIHN0YWdlMi9zdGFnZTFfNS5jIChzYXZlZF9zZWN0b3IpOiBJbml0aWFsaXplZCB3aXRoIC0xLgorCShjbWFpbik6IENoZWNrIGlmIFNBVkVEX1NFQ1RPUiB3YXMgc2V0IGFwcHJvcHJpYXRlbHkgYWZ0ZXIKKwlyZWFkaW5nIHRoZSBzZWNvbmQgc2VjdG9yIG9mIFN0YWdlIDIuIElmIFNBVkVEX1NFQ1RPUiBpcyBub3QKKwlzZXQgKGkuZS4gaXQgaXMgZXF1YWwgdG8gLTEpLCBwcmludCBhbiBlcnJvciBhbmQgc3RvcC4KKwkKKzIwMDItMDItMDUgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgKHNldHVwX2Z1bmMpOiBBZGQgYSBWU1RhIGZzIGVudHJ5IGludG8KKwlTVEFHRTFfNV9NQVAuCisJCisyMDAyLTAyLTA1ICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIHN0YWdlMi9zaGFyZWQuaCAoQlVJTFRJTl9IRUxQX0xJU1QpOiBOZXcgbWFjcm8uIFVzZWQgZm9yCisJY29tbWFuZHMgd2hvc2UgaGVscCBtZXNzYWdlcyBhcmUgbGlzdGVkIHdoZW4gbm8gYXJndW1lbnQgaXMKKwlzcGVjaWZpZWQgdG8gdGhlIGNvbW1hbmQgImhlbHAiLgorCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGJ1aWx0aW5fYmxvY2tsaXN0KTogQWRkZWQgdGhlIGF0dHJpYnV0ZQorCUJVSUxUSU5fSEVMUF9MSVNULgorCShidWlsdGluX2Jvb3QpOiBMaWtld2lzZS4KKwkoYnVpbHRpbl9ib290cCk6IExpa2V3aXNlLgorCShidWlsdGluX2NhdCk6IExpa2V3aXNlLgorCShidWlsdGluX2NoYWlubG9hZGVyKTogTGlrZXdpc2UuCisJKGJ1aWx0aW5fY29sb3IpOiBMaWtld2lzZS4KKwkoYnVpbHRpbl9jb25maWdmaWxlKTogTGlrZXdpc2UuCisJKGJ1aWx0aW5fZGV2aWNlKTogTGlrZXdpc2UuCisJKGJ1aWx0aW5fZGhjcCk6IExpa2V3aXNlLgorCShidWlsdGluX2Rpc3BsYXlhcG0pOiBMaWtld2lzZS4KKwkoYnVpbHRpbl9kaXNwbGF5bWVtKTogTGlrZXdpc2UuCisJKGJ1aWx0aW5fZmluZCk6IExpa2V3aXNlLgorCShidWlsdGluX2dlb21ldHJ5KTogTGlrZXdpc2UuCisJKGJ1aWx0aW5faGFsdCk6IExpa2V3aXNlLgorCShidWlsdGluX2hlbHApOiBMaWtld2lzZS4KKwkoYnVpbHRpbl9oaWRlKTogTGlrZXdpc2UuCisJKGJ1aWx0aW5faWZjb25maWcpOiBMaWtld2lzZS4KKwkoYnVpbHRpbl9pbml0cmQpOiBMaWtld2lzZS4KKwkoYnVpbHRpbl9rZXJuZWwpOiBMaWtld2lzZS4KKwkoYnVpbHRpbl9tYWtlYWN0aXZlKTogTGlrZXdpc2UuCisJKGJ1aWx0aW5fbWFwKTogTGlrZXdpc2UuCisJKGJ1aWx0aW5fbWQ1Y3J5cHQpOiBMaWtld2lzZS4KKwkoYnVpbHRpbl9tb2R1bGUpOiBMaWtld2lzZS4KKwkoYnVpbHRpbl9tb2R1bGVub3VuemlwKTogTGlrZXdpc2UuCisJKGJ1aWx0aW5fcGFydG5ldyk6IExpa2V3aXNlLgorCShidWlsdGluX3BhcnR0eXBlKTogTGlrZXdpc2UuCisJKGJ1aWx0aW5fcXVpdCk6IExpa2V3aXNlLgorCShidWlsdGluX3JhcnApOiBMaWtld2lzZS4KKwkoYnVpbHRpbl9yZWJvb3QpOiBMaWtld2lzZS4KKwkoYnVpbHRpbl9yb290KTogTGlrZXdpc2UuCisJKGJ1aWx0aW5fcm9vdG5vdmVyaWZ5KTogTGlrZXdpc2UuCisJKGJ1aWx0aW5fc2VyaWFsKTogTGlrZXdpc2UuCisJKGJ1aWx0aW5fc2V0a2V5KTogTGlrZXdpc2UuCisJKGJ1aWx0aW5fc2V0dXApOiBMaWtld2lzZS4KKwkoYnVpbHRpbl90ZXJtaW5hbCk6IExpa2V3aXNlLgorCShidWlsdGluX3Rlc3R2YmUpOiBMaWtld2lzZS4KKwkoYnVpbHRpbl90ZnRwc2VydmVyKTogTGlrZXdpc2UuCisJKGJ1aWx0aW5fdW5oaWRlKTogTGlrZXdpc2UuCisJKGJ1aWx0aW5fdXBwZXJtZW0pOiBMaWtld2lzZS4KKwkoYnVpbHRpbl92YmVwcm9iZSk6IExpa2V3aXNlLgorCisJKGhlbHBfZnVuYyk6IFdoZW4gbm8gYXJndW1lbnQgaXMgc3BlY2lmaWVkLCBpZiB0aGUgbGFzdCBlbnRyeQorCXdhcyBhdCB0aGUgbGVmdCBjb2x1bW4sIHByaW50IGFuIGV4dHJhIG5ld2xpbmUuCisJCisyMDAyLTAyLTA1ICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBlbmJ1Zy5vcmc+CisKKwkqIHN0YWdlMi9zaGFyZWQuaCAoQlVJTFRJTl9ISURERU4pOiBSZW5hbWVkIHRvIC4uLgorCShCVUlMVElOX05PX0VDSE8pOiAuLi4gdGhpcy4gVGhlIG9sZCBuYW1lIHdhcyB0b28gZGlmZmljdWx0IHRvCisJc2VlIF93aGF0XyB3YXMgaGlkZGVuLgorCQorMjAwMi0wMi0wNSAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZW5idWcub3JnPgorCisJKiBuZXRib290L21pc2MuYyAodHdpZGRsZSk6IEdvIGJhY2sgdG8gdGhlIGJhciBwcm9ncmVzcywgY29waWVkCisJZnJvbSBldGhlcmJvb3QtNS4wLjUvc3JjL21pc2MuYy4gRXhlY3V0ZSB0aGUgY29kZSBvbmx5IGlmIERFQlVHCisJaXMgdHJ1ZS4KKwkKKzIwMDItMDItMDUgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGVuYnVnLm9yZz4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGRpc3BsYXltZW1fZnVuYyk6IFVzZSBoZXggZGlnaXRzIHRvIGRpc3BsYXkKKwlmb3IgY29uc2lzdGVuY3kuCisJCisyMDAyLTAyLTA0ICBKYXNvbiBUaG9tYXMgIDxqYXNvbkB0b3BpYy5jb20uYWg+CisKKwlGcm9tIERlbmlzIEtpdHptYW4gIDxka2l0em1hbkBibHVlLndlZWcudWlvd2EuZWR1PjoKKwkqIHN0YWdlMi9NYWtlZmlsZS5hbSAobGliZ3J1Yl9hX0NGTEFHUyk6IEZpeGVkIGEgdHlwby4KKwlGU1lTX1hGUywgVVNFX01ENV9QQVNTV09SRFMsIFNVUFBPUlRfU0VSSUFMLCBhbmQKKwlTVVBQT1JUX0hFUkNVTEVTIGRpZCBub3QgZ2V0IGRlZmluZWQuCisKKzIwMDItMDEtMjAgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHV0aWwvZ3J1Yi1pbWFnZS5pbjogQ2hlY2sgc3RhZ2UyIGluc3RlYWQgb2Ygc3RhZ2UyLmMgdG8KKwlkZXRlcm1pbmUgd2hlcmUgdGhlIHNjcmlwdCBpcyBpbnZva2VkLCBiZWNhdXNlIHNyY2RpciBtYXkgbm90CisJYmUgdXNlZCBmb3IgdGhlIGNvbXBpbGF0aW9uLgorCQorMjAwMi0wMS0yMCAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZ251Lm9yZz4KKworCSogZ3J1Yi9hc21zdHViLmMgKGNvbnNvbGVfcHV0Y2hhcik6IFdoZW4gbm90IHVzaW5nIGN1cnNlcywKKwlpZ25vcmUgYSBjYXJyaWFnZSByZXR1cm4sIGJlY2F1c2UgYSBuZXdsaW5lIGluIFVuaXggaXMgb25seSBhCisJbGluZSBmZWVkLgorCQorMjAwMi0wMS0xOCAgS2xhdXMgUmVpY2hsICA8S2xhdXMuUmVpY2hsQGFsY2F0ZWwuYXQ+CisKKwkqIHN0YWdlMi9mc3lzX21pbml4LmMgKG1pbml4X2Rpcik6IEZpeGVkIGJ1ZyBnZXR0aW5nIGZpbGVuYW1lcworCXdpdGggTUFYTkFNRUxFTiByaWdodC4KKworCSogc3RhZ2UyL2NoYXJfaW8uYyAoZ2V0X2NtZGxpbmUsIGNsX3JlZnJlc2gpOiBJZiBURVJNSU5BTF9EVU1CCisJc2VjdGlvbiBpcyBhbHdheXMgMC4KKwlMaW5lIGlzIG9ubHkgY2xlYXJlZCBpZiAhVEVSTUlOQUxfRFVNQi4KKworCSogZ3J1Yi9tYWluLmMgKHVzZV9jdXJzZXMpOiBJbml0aWFsaXplIHRvIDAgaWYgIUhBVkVfTElCQ1VSU0VTCisJKG1haW4pOiBDaGVjayBmb3IgY3Vyc2VzIHVzZSBhbmQgc2V0IHRlcm1pbmFsIHRvIGR1bWIgaWYgd2UKKwlkb24ndCB1c2UgaXQgKGhlbHBzIGZvciAtLWJhdGNoIGFuZCB2YXJpYW50cyBvZiBub24tY3Vyc2VzCisJc2V0dXApLgorCisyMDAyLTAxLTE1ICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBnbnUub3JnPgorCisJKiBjb25maWd1cmUuaW4gKEFNX0lOSVRfQVVUT01BS0UpOiBUaGUgdmVyc2lvbiBudW1iZXIgaXMKKwl1cGdyYWRlZCB0byAwLjkxLgorCQorMjAwMi0wMS0xNSAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZ251Lm9yZz4KKworCSogZG9jcy9ncnViLnRleGkgKFByZXNldCBNZW51KTogTmV3IGNoYXB0ZXIuCisJCisyMDAyLTAxLTE1ICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBnbnUub3JnPgorCisJKiBkb2NzL2dydWIudGV4aTogQWRkZWQgc29tZSB0ZXh0IGFib3V0IEpGUyBhbmQgWEZTLgorCQorMjAwMi0wMS0wOCAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZ251Lm9yZz4KKworCSogZ3J1Yi9tYWluLmMgKHVzZV9wcmVzZXRfbWVudSk6IE5ldyB2YXJpYWJsZS4KKwkoT1BUX1BSRVNFVF9NRU5VKTogTmV3IG1hY3JvLgorCShsb25nb3B0cyk6IEFkZGVkIGFuIGVudHJ5IGZvciAiLS1wcmVzZXQtbWVudSIuCisJKHVzYWdlKTogQWRkZWQgYSBkZXNjcmlwdGlvbiBmb3IgIi0tcHJlc2V0LW1lbnUiLiBBbHNvLCBjaGFuZ2UKKwl0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBkZXNjcmlwdGlvbiBmb3IgIi0tZGV2aWNlLW1hcCIgdG8KKwlsb3dlciBjYXNlIGZvciBjb25zaXN0ZW5jeS4KKwkobWFpbik6IFNldCBVU0VfUFJFU0VUX01FTlUgdG8gMSBpbiB0aGUgY2FzZSBvZiBPUFRfUFJFU0VUX01FTlUuCisJKiBzdGFnZTIvc2hhcmVkLmggKHVzZV9wcmVzZXRfbWVudSk6IERlY2xhcmVkLgorCSogc3RhZ2UyL3N0YWdlMi5jIFtQUkVTRVRfTUVOVV9TVFJJTkcgfHwgU1VQUE9SVF9ESVNLTEVTU10KKwkob3Blbl9wcmVzZXRfbWVudSkgW0dSVUJfVVRJTF06IElmIFVTRV9QUkVTRVRfTUVOVSBpcyBmYWxzZSwKKwlyZXR1cm4gemVybyBpbW1lZGlhdGVseS4KKworMjAwMi0wMS0wOCAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UyL2NvbW1vbi5jIFtTVVBQT1JUX0RJU0tMRVNTXQorCShzZXR1cF9kaXNrbGVzc19lbnZpcm9ubWVudCk6IFJlbW92ZWQuIFRoZSBmZWF0dXJlIGlzIG1vdmVkIHRvCisJdGhlIHByZXNldCBtZW51LgorCSogc3RhZ2UyL3N0YWdlMi5jIFtTVVBQT1JUX0RJU0tMRVNTXSAocHJlc2V0X21lbnUpOiBTZXQgdG8gdGhlCisJc3RyaW5nICJib290cFxuIi4KKwlbU1VQUE9SVF9ESVNLTEVTU10gKHByZXNldF9tZW51X29mZnNldCk6IERlZmluZWQsIGFzIGlmCisJUFJFU0VUX01FTlVfU1RSSU5HIGlzIGRlZmluZWQuCisJW1NVUFBPUlRfRElTS0xFU1NdIChvcGVuX3ByZXNldF9tZW51KTogTGlrZXdpc2UuCisJW1NVUFBPUlRfRElTS0xFU1NdIChyZWFkX2Zyb21fcHJlc2V0X21lbnUpOiBMaWtld2lzZS4KKwlbU1VQUE9SVF9ESVNLTEVTU10gKGNsb3NlX3ByZXNldF9tZW51KTogTGlrZXdpc2UuCisJCisyMDAyLTAxLTA2ICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBnbnUub3JnPgorCisJVGhlIHByZXNldCBtZW51IGhhcyBhIHByaW9yaXR5IG92ZXIgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKwlTdWdnZXN0ZWQgYnkgQ2hyaXN0b3BoIFBsYXR0bmVyLgorCQorCSogc3RhZ2UyL3N0YWdlMi5jIFtQUkVTRVRfTUVOVV9TVFJJTkddIChvcGVuX3ByZXNldF9tZW51KToKKwlDaGVjayBpZiBQUkVTRVRfTUVOVSBpcyBub3QgTlVMTC4KKwlbUFJFU0VUX01FTlVfU1RSSU5HXSAoY2xvc2VfcHJlc2V0X21lbnUpOiBTZXQgUFJFU0VUX01FTlUgdG8KKwlOVUxMLgorCShjbWFpbik6IE5ldyBpbnRlcm5hbCBmdW5jdGlvbiwgcmVzZXQuIFRoaXMgZnVuY3Rpb24gcmVzZXRzCisJQVVUT19GSUxMLCBDT05GSUdfTEVOLCBNRU5VX0xFTiwgTlVNX0VOVFJJRVMsIENPTkZJR19FTlRSSUVTLAorCU1FTlVfRU5UUklFUyBhbmQgY2FsbCBpbml0X2NvbmZpZy4KKwlUcnkgdG8gb3BlbiB0aGUgcHJlc2V0IG1lbnUgZmlyc3QsIGFuZCB0cnkgdG8gb3BlbiB0aGUKKwljb25maWd1cmF0aW9uIGZpbGUsIG9ubHkgaWYgdGhhdCBmYWlsZWQuCisJRXZlbiBpZiB0aGUgcHJlc2V0IG1lbnUgd2FzIHJlYWQsIHRyeSB0byBvcGVuIHRoZSBjb25maWd1cmF0aW9uCisJZmlsZS4gVGhpcyB0aW1lLCBvcGVuaW5nIHRoZSBwcmVzZXQgbWVudSBuZXZlciBzdWNjZWVkLCBiZWNhdXNlCisJY2xvc2VfcHJlc2V0X21lbnUgZW5zdXJlcyB0aGF0IHRoZSBwcmVzZXQgbWVudSBpcyBhdmFpbGFibGUgYXQKKwltb3N0IG9uY2UuCisJCisyMDAyLTAxLTA2ICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBnbnUub3JnPgorCisJKiBuZXRib290L21pc2MuYyAoaW5ldF9hdG9uKTogRG9uJ3QgY2hlY2sgaWYgKlAgaXMgYW4gYXN0ZXJpc2ssCisJaWYgSSBpcyAzLiBSZXBvcnRlZCBieSBSaWNrIChoaXMgcmVhbCBuYW1lIGFuZCBhZGRyZXNzIGFyZQorCXVua25vd24pLgorCQorMjAwMi0wMS0wMyAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZ251Lm9yZz4KKworCVVwZGF0ZSB0aGUgbmV0Ym9vdCBzdHVmZiB0byBFdGhlcmJvb3QtNS4wLjUuCisJCisJKiBjb25maWd1cmUuaW4gKC0tZW5hYmxlLTNjNTkwKTogUmVtb3ZlZC4gVGhpcyB3YXMgYSBtaXN0YWtlLgorCSgtLWVuYWJsZS1kYXZpY29tKTogTmV3IG9wdGlvbi4KKwkoLS1lbmFibGUtZWVwcm8pOiBMaWtld2lzZS4KKwkoLS1lbmFibGUtbmF0c2VtaSk6IExpa2V3aXNlLgorCSgtLWVuYWJsZS1uaTUwMTApOiBMaWtld2lzZS4KKwkoLS1lbmFibGUtc2lzOTAwKTogTGlrZXdpc2UuCisJKC0tZW5hYmxlLXc4OWM4NDApOiBMaWtld2lzZS4KKwkoLS1lbmFibGUtM2M1MDktaGFjayk6IFJlbW92ZWQuCisJKC0tZW5hYmxlLW5zODM5MC1mb3JjZS0xNmJpdCk6IExpa2V3aXNlLgorCisJKiBuZXRib290L01ha2VmaWxlLmFtIChsaWJkcml2ZXJzX2FfU09VUkNFUyk6IEFkZGVkIHRpbWVyLmMgYW5kCisJdGltZXIuaC4KKwkoRVhUUkFfbGliZHJpdmVyc19hX1NPVVJDRVMpOiBBZGRlZCBkYXZpY29tLmMsIGVlcHJvLmMsIGZhMzExLmMsCisJbmF0c2VtaS5jLCBuaTUwMTAuYywgc2lzOTAwLmMsIHNpczkwMC5oLCB0bGFuLmMgYW5kIHc4OWM4NDAuYy4KKwkoRVhUUkFfRElTVCk6IEFkZGVkIHNpczkwMC50eHQuCisJKDNjNTk1X2RyaXZlcnMpOiBSZW1vdmUgM2M1OTAubyBmcm9tIHRoaXMuCisJKGRhdmljb21fZHJpdmVycyk6IE5ldyB2YXJpYWJsZS4KKwkoZWVwcm9fZHJpdmVycyk6IExpa2V3aXNlLgorCShuYXRzZW1pX2RyaXZlcnMpOiBMaWtld2lzZS4KKwkobmk1MDEwX2RyaXZlcnMpOiBMaWtld2lzZS4KKwkoc2lzOTAwX2RyaXZlcnMpOiBMaWtld2lzZS4KKwkodzg5Yzg0MF9kcml2ZXJzKTogTGlrZXdpc2UuCisJKDNjNTkwX29fQ0ZMQUdTKTogUmVtb3ZlZC4KKwkoZGF2aWNvbV9vX0NGTEFHUyk6IE5ldyB2YXJpYWJsZS4KKwkoZWVwcm9fb19DRkxBR1MpOiBMaWtld2lzZS4KKwkobmF0c2VtaV9vX0NGTEFHUyk6IExpa2V3aXNlLgorCShuaTUwMTBfb19DRkxBR1MpOiBMaWtld2lzZS4KKwkoc2lzOTAwX29fQ0ZMQUdTKTogTGlrZXdpc2UuCisJKHc4OWM4NDBfb19DRkxBR1MpOiBMaWtld2lzZS4KKworCSogbmV0Ym9vdC9kYXZpY29tLmM6IE5ldyBmaWxlLCBmcm9tIEV0aGVyYm9vdC01LjAuNS4KKwkqIG5ldGJvb3QvZWVwcm8uYzogTGlrZXdpc2UuCisJKiBuZXRib290L25hdHNlbWkuYzogTGlrZXdpc2UuCisJKiBuZXRib290L25pNTAxMC5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3Qvc2lzOTAwLmM6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9zaXM5MDAuaDogTGlrZXdpc2UuCisJKiBuZXRib290L3NpczkwMC50eHQ6IExpa2V3aXNlLgorCSogbmV0Ym9vdC90aW1lci5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvdGltZXIuaDogTGlrZXdpc2UuCisJKiBuZXRib290L3c4OWM4NDAuYzogTGlrZXdpc2UuCisJKiBuZXRib290L2ZhMzExLmM6IExpa2V3aXNlLgorCSogbmV0Ym9vdC90bGFuLmM6IExpa2V3aXNlLgorCQorCSogbmV0Ym9vdC8zYzUwOS5jOiBDb3BpZWQgZnJvbSBFdGhlcmJvb3QtNS4wLjUuCisJKiBuZXRib290LzNjNTA5Lmg6IExpa2V3aXNlLgorCSogbmV0Ym9vdC8zYzU5NS5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvM2M5MHguYzogTGlrZXdpc2UuCisJKiBuZXRib290LzNjOTB4LnR4dDogTGlrZXdpc2UuCisJKiBuZXRib290L2NhcmRzLmg6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9jczg5eDAuYzogTGlrZXdpc2UuCisJKiBuZXRib290L2RlcGNhLmM6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9lZXBybzEwMC5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvZXBpYzEwMC5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvaTgyNTg2LmM6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9sYW5jZS5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvbGludXgtYXNtLXN0cmluZy5oOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvbmljLmg6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9uczgzOTAuYzogTGlrZXdpc2UuCisJKiBuZXRib290L25zODM5MC5oOiBMaWtld2lzZS4KKwkqIG5ldGJvb3Qvb3R1bGlwLmM6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9wY2kuaDogTGlrZXdpc2UuCisJKiBuZXRib290L3J0bDgxMzkuYzogTGlrZXdpc2UuCisJKiBuZXRib290L3NrX2cxNi5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3Qvc21jOTAwMC5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvdGlhcmEuYzogTGlrZXdpc2UuCisJKiBuZXRib290L3R1bGlwLmM6IExpa2V3aXNlLgorCSogbmV0Ym9vdC92aWEtcmhpbmUuYzogTGlrZXdpc2UuCisJCisJKiBuZXRib290L2NvbmZpZy5jOiBBcHBsaWVkIGEgZGlmZiBiZXR3ZWVuIEV0aGVyYm9vdC00LjYuNCBhbmQKKwlFdGhlcmJvb3QtNS4wLjUgbWFudWFsbHkuCisJKiBuZXRib290L21haW4uYzogTGlrZXdpc2UuCisJKiBuZXRib290L3BjaS5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvZXRoZXJib290Lmg6IFJld3JpdHRlbiBtb3N0bHkgZnJvbSBzY3JhdGNoLCBiYXNlZCBvbgorCXRoZSBzYW1lIGZpbGUgaW4gRXRoZXJib290LTUuMC41LgorCSogbmV0Ym9vdC9taXNjLmM6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9vc2RlcC5oOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvZnN5c190ZnRwLmMgKEdSVUIpOiBEZWZpbmVkLgorCShidWZfZmlsbCk6IFVzZSByZmMyMTMxX3NsZWVwX2ludGVydmFsIGluc3RlYWQgb2YgcmZjOTUxX3NsZWVwLgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyBbU1VQUE9SVF9ORVRCT09UXSAoR1JVQik6IERlZmluZWQuCisJKGJvb3RfZnVuYykgW1NVUFBPUlRfTkVUQk9PVF06IENhbGwgY2xlYW51cF9uZXQuCisJKiBzdGFnZTIvY21kbGluZS5jIFtTVVBQT1JUX0RJU0tMRVNTXSAoR1JVQik6IERlZmluZWQuCisJKiBzdGFnZTIvY29tbW9uLmMgW1NVUFBPUlRfRElTS0xFU1NdIChHUlVCKTogTGlrZXdpc2UuCisJCisyMDAyLTAxLTAyICBKZXJlbXkgS2F0eiAgPGthdHpqQHJlZGhhdC5jb20+CisJCisJKiB1dGlsL2dydWItaW5zdGFsbC5pbjogU3VwcG9ydCB1c2luZyBta3RlbXAgYXMgd2VsbCBhcyB0ZW1wZmlsZQorCWZvciBzZWN1cmUgdGVtcG9yYXJ5IGZpbGUgY3JlYXRpb24uCisKKzIwMDItMDEtMDIgIEplcmVteSBLYXR6ICA8a2F0empAcmVkaGF0LmNvbT4KKwkKKwkqIHN0YWdlMi9tZDUuYyAobWQ1X3Bhc3N3b3JkKTogRW5zdXJlIHRoZSBwYXNzd29yZCBleGlzdHMgYmVmb3JlCisJdHJ5aW5nIHRvIGNoZWNrIGFnYWluc3QgdGhlIG1kNSBjcnlwdGVkIHZlcnNpb24uCisKKzIwMDEtMTItMzAgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMS9zdGFnZTEuUzogRG9uJ3QgY2FsbCBJTlQgMTMsIEFIPTQ4SCwgYmVjYXVzZSBpdCBpcworCWRpZmZpY3VsdCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCB0aGUgd29ya2Fyb3VuZCBpbXBsZW1lbnRlZAorCWluIHRoZSBwcmV2aW91cyBjaGFuZ2UgZHVlIHRvIHRoZSBzaXplIGxpbWl0IG9mIFN0YWdlIDEuCisJCisJKGxiYV9tb2RlKSBbTk9fQlVHR1lfQklPU19JTl9USEVfV09STERdOiBEb24ndCBjaGVjayB0aGUKKwlnZW9tZXRyeSBleHBsaWNpdGx5LiBUaGlzIHNob3VsZG4ndCBiZSBoYXJtZnVsLCBhcyBJTlQgMTMsCisJQUg9NDJIIHNob3VsZCB0YWtlIGNhcmUgb2YgaXQsIGFuZCBpZiB5b3UgY2Fubm90IHJlYWQgU3RhZ2UgMgorCWV2ZW4gd2l0aCBMQkEgYmVjYXVzZSBvZiBhIGdlb21ldHJ5IHByb2JsZW0sIHlvdSBjYW4gbmV2ZXIgcmVhZAorCWl0LgorCisJKiBzdGFnZTIvc3RhcnQuUyAobGJhX21vZGUpIFtOT19CVUdHWV9CSU9TX0lOX1RIRV9XT1JMRF06CisJTGlrZXdpc2UuCisJCisyMDAxLTEyLTMwICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvYmlvcy5jIChnZXRfZGlza2luZm8pOiBDbGVhciBvdXQgdGhlIHN0cnVjdHVyZSBEUlAKKwliZWZvcmUgY2FsbGluZyBnZXRfZGlza2luZm9faW50MTNfZXh0ZW5zaW9ucywgYmVjYXVzZSB0aGUgUmFsZgorCUJyb3duJ3MgSW50ZXJydXB0IExpc3Qgc2F5cyB0aGF0IERlbGwgbWFjaGluZXMgdXNpbmcgUGhvZW5peEJJT1MKKwk0LjAgUmVsZWFzZSA2LjAgZmFpbCwgaWYgRFJQLkZMQUdTIGlzIG5vdCB6ZXJvLiBTZXR0aW5nIHRoZQorCWVudGlyZSBzdHJ1Y3R1cmUgdG8gemVybyBtYXkgYmUgb3ZlcmtpbGwsIGJ1dCBpdCBzaG91bGQgYmUgc2FmZS4KKwkKKwkqIHN0YWdlMi9jaGFyX2lvLmMgW1NUQUdFMV81XSAoZ3J1Yl9tZW1zZXQpOiBEZWZpbmVkLgorCQorMjAwMS0xMi0zMCAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZ251Lm9yZz4KKworCUZyb20gSm9obiBHb2VyemVuIDxqZ29lcnplbkBjb21wbGV0ZS5vcmc+OgorCSogdXRpbC9ncnViLWluc3RhbGwuaW4gKGNvbnZlcnQpOiBBZGRlZCBOZXRCU0Qgc3VwcG9ydC4KKwkKKzIwMDEtMTItMzAgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHV0aWwvZ3J1Yi1pbnN0YWxsLmluOiBTZXQgR1JVQl9QUkVGSVggYW5kIEJPT1RESVIgdG8gIi9ncnViIgorCWFuZCAiJHtyb290ZGlyfSIgcmVzcGVjdGl2ZWx5IGluIE5ldEJTRC4KKwkKKzIwMDEtMTItMzAgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChidWlsdGluX2dlb21ldHJ5KTogQWRkIGV4dHJhIHNwYWNlCisJY2hhcmFjdGVycyBpbnRvIHRoZSBsb25nIGRlc2NyaXB0aW9uLgorCShidWlsdGluX2tlcm5lbCk6IExpa2V3aXNlLgorCShidWlsdGluX3ZiZXByb2JlKTogTGlrZXdpc2UuCisJCisyMDAxLTEyLTE5ICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBnbnUub3JnPgorCisJRnJvbSBNaWNoYWVsIFN1bGxpdmFuIDxtaWtlQHRyZGxuay5jb20+OgorCSogc3RhZ2UxL3N0YWdlMS5TIChyZWFsX3N0YXJ0KTogQWRkZWQgYSB3b3JrYXJvdW5kIGZvciBBU1QgQklPUywKKwliZWNhdXNlIGl0IGNsb2JiZXJzICVkbCB3aXRoIElOVCAxMywgQUg9NDFILgorCisyMDAxLTEyLTE5ICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvZnN5c19mYXQuYyAoZmF0X3JlYWQpOiBGaXggdGhlIGNvbnRyYWRpY3RvcnkgY29tbWVudC4KKwlSZXBvcnRlZCBieSBGaWxpcCBWYW4gUmFlbWRvbmNrIDxtZWNoYW5peEBkaWdpYmVsLm9yZz4uCisJCisyMDAxLTEyLTExICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoZGlzcGxheWFwbV9mdW5jKTogRG9uJ3QgdXNlIG11bHRpLWxpbmUKKwlzdHJpbmcgbGl0ZXJhbHMgYnV0IHN0cmluZyBjb25jYXRlbmF0aW9uIGluc3RlYWQsIHRvIHN1cHByZXNzCisJd2FybmluZ3MgZnJvbSBnY2MtMy4wLnguCisJKiBzdGFnZTIvY21kbGluZS5jIChwcmludF9jbWRsaW5lX21lc3NhZ2UpOiBMaWtld2lzZS4KKwkqIHV0aWwvbWJjaGsuYyAodXNhZ2UpOiBMaWtld2lzZS4KKwkKKwkqIHN0YWdlMi9zbXAtaW1wcy5jIChpbXBzX3JlYWRfY29uZmlnX3RhYmxlKTogQWRkIGEgYnJlYWsKKwlzdGF0ZW1lbnQgYWZ0ZXIgdGhlIGxhYmVsIGBgZGVmYXVsdCcnLgorCQorCSogdXRpbC9tYmNoay5jOiBJbmNsdWRlIDxzdGRsaWIuaD4gZm9yIHRoZSBwcm90b3R5cGUgb2YgZXhpdC4KKworCSogc3RhZ2UyL3NlcmlhbC5jIChzZXJpYWxfcG9ydCk6IEluaXRpYWxpemUgd2l0aCAwIGluc3RlYWQgb2YKKwktMSwgYXMgYW4gaW52YWxpZCB2YWx1ZSwgYmVjYXVzZSBTRVJJQUxfUE9SVCBpcyB1bnNpZ25lZC4gVGhpcworCWNoYW5nZSBzaG91bGRuJ3QgYWZmZWN0IGFueXRoaW5nLgorCShzZXJpYWxfZXhpc3RzKTogRm9yIHRoZSBhYm92ZSBjaGFuZ2UsIGNoZWNrIFNFUklBTF9QT1JUIHdpdGggMAorCWluc3RlYWQgb2YgLTEuCisJCisyMDAxLTEyLTEwICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvc2hhcmVkLmggKEVSUl9OT19ESVNLX1NQQUNFKTogTmV3IGNvbnN0YW50LgorCSogc3RhZ2UyL2NvbW1vbi5jIChlcnJfbGlzdCk6IEFkZGVkIGFuIGVudHJ5IGZvcgorCUVSUl9OT19ESVNLX1NQQUNFLgorCSogZG9jcy9ncnViLnRleGkgKFN0YWdlMiBlcnJvcnMpOiBBZGRlZCB0aGUgZGVzY3JpcHRpb24uCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoZW1iZWRfZnVuYyk6IFVzZSBFUlJfTk9fRElTS19TUEFDRSBpbnN0ZWFkCisJb2YgRVJSX0RFVl9WQUxVRVMgd2hlbiB0aGUgc3BhcmUgc3BhY2UgaXMgdG9vIHNtYWxsLiBTdWdnZXN0ZWQKKwlieSBFcmljIE11bXBvd2VyIDxub2N0dXJuZUBwZXJtYWJpdC5jb20+LgorCQorMjAwMS0xMi0xMCAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZ251Lm9yZz4KKworCSogZ3J1Yi9hc21zdHViLmM6IEluY2x1ZGUgPHNpZ25hbC5oPi4KKwkoZ3J1Yl9zdGFnZTIpIFtIQVZFX0xJQkNVUlNFU106IElmIFVTRV9DVVJTRVMgaXMgdHJ1ZSwgaWdub3JlCisJdGhlIHNpZ25hbCBTSUdXSU5DSC4gUmVwb3J0ZWQgYnkgQ2hyaXN0aWFuIEh1ZG9uCisJPGNocmlzaEBkZWJpYW4ub3JnPi4KKworMjAwMS0xMS0yOSAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZ251Lm9yZz4KKworCUZyb20gSmFzb24gVGhvbWFzOgorCSogc3RhZ2UyL2Rpc2tfaW8uYyAoc2V0X3BhcnRpdGlvbl9oaWRkZW5fZmxhZyk6IENvbXBsZXRlIHJld3JpdGUKKwlvZiB0aGlzIGZ1bmN0aW9uIHdoaWNoIG5vdyBzdXBwb3J0cyBsb2dpY2FsIHBhcnRpdGlvbnMuCisJCisyMDAxLTExLTEyICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBnbnUub3JnPgorCisJKiBkb2NzL2dydWIudGV4aTogVGhlIGNvcHlyaWdodCBvZiB0aGlzIGZpbGUgaXMgb25seSBoZWxkIGJ5CisJRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCBhcyBFcmljaCBCb2xleW4gaGFzIGFzc2lnbmVkIGhpcworCWNvcHlyaWdodCB0byB0aGUgRlNGLgorCSogc3RhZ2UxL3N0YWdlMS5TOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9hc20uUzogTGlrZXdpc2UuCisJKiBzdGFnZTIvYm9vdC5jOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9idWlsdGlucy5jOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9jaGFyX2lvLmM6IExpa2V3aXNlLgorCSogc3RhZ2UyL2NtZGxpbmUuYzogTGlrZXdpc2UuCisJKiBzdGFnZTIvY29tbW9uLmM6IExpa2V3aXNlLgorCSogc3RhZ2UyL2Rpc2tfaW8uYzogTGlrZXdpc2UuCisJKiBzdGFnZTIvZmF0Lmg6IExpa2V3aXNlLgorCSogc3RhZ2UyL2ZpbGVzeXMuaDogTGlrZXdpc2UuCisJKiBzdGFnZTIvZnJlZWJzZC5oOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9mc3lzX2V4dDJmcy5jOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9mc3lzX2ZhdC5jOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9mc3lzX2Zmcy5jOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9ndW56aXAuYzogTGlrZXdpc2UuCisJKiBzdGFnZTIvaTM4Ni1lbGYuaDogTGlrZXdpc2UuCisJKiBzdGFnZTIvbWJfaGVhZGVyLmg6IExpa2V3aXNlLgorCSogc3RhZ2UyL21iX2luZm8uaDogTGlrZXdpc2UuCisJKiBzdGFnZTIvcGNfc2xpY2UuaDogTGlrZXdpc2UuCisJKiBzdGFnZTIvc2hhcmVkLmg6IExpa2V3aXNlLgorCSogc3RhZ2UyL3N0YWdlMV81LmM6IExpa2V3aXNlLgorCSogc3RhZ2UyL3N0YWdlMi5jOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9zdGFydC5TOiBMaWtld2lzZS4KKwkKKzIwMDEtMTEtMDcgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9idWlsdGlucy5jICh0ZXJtaW5hbF9mdW5jKSBbIVNVUFBPUlRfU0VSSUFMXTogRGlzYWJsZQorCXRoZSB3YWl0IGNvZGUsIGFzIGl0IGlzIHVzYWJsZSBvbmx5IHdoZW4gc2VyaWFsIHN1cHBvcnQgaXMgb24uCisJUmVwb3J0ZWQgYnkgS2FybCBIYW1tYXIgPGthcmxAa2FsbGUuY3NiLmtpLnNlPi4KKwkKKzIwMDEtMTAtMjcgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGdudS5vcmc+CisKKwlKRlMgYW5kIFhGUyBzdXBwb3J0IGlzIGFkZGVkLgorCQorCUZyb20gU2VyZ3VlaSBUenVrYW5vdiA8dHp1a2Fub3ZAbmFyb2QucnU+OgorCSogY29uZmlndXJlLmluICgtLWRpc2FibGUtamZzKTogTmV3IG9wdGlvbi4KKwkoLS1kaXNhYmxlLXhmcyk6IExpa2V3aXNlLgorCSogc3RhZ2UyL01ha2VmaWxlLmFtIChub2luc3RfSEVBREVSUyk6IEFkZGVkIGpmcy5oIGFuZCB4ZnMuaC4KKwkobGliZ3J1Yl9hX1NPVVJDRVMpOiBBZGRlZCBmc3lzX2pmcy5jIGFuZCBmc3lzX3hmcy5jLgorCShsaWJncnViX2FfQ0ZMQUdTKTogQWRkZWQgLURGU1lTX0pGUz0xIGFuZCAtREZTWVNfWEZTPTEuCisJKHBrZ2RhdGFfREFUQSk6IEFkZGVkIGpmc19zdGFnZTFfNSBhbmQgeGZzX3N0YWdlMV81LgorCShub2luc3RfUFJPR1JBTVMpOiBBZGRlZCBqZnNfc3RhZ2UxXzUuZXhlYyBhbmQKKwl4ZnNfc3RhZ2UxXzUuZXhlYy4KKwkocHJlX3N0YWdlMl9leGVjX1NPVVJDRVMpOiBBZGRlZCBmc3lzX2pmcy5jIGFuZCBmc3lzX3hmcy5jLgorCShqZnNfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTKTogTmV3IHZhcmlhYmxlLgorCShqZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpOiBMaWtld2lzZS4KKwkoamZzX3N0YWdlMV81X2V4ZWNfQVNGTEFHUyk6IExpa2V3aXNlLgorCShqZnNfc3RhZ2UxXzVfZXhlY19MREZMQUdTKTogTGlrZXdpc2UuCisJKHhmc19zdGFnZTFfNV9leGVjX1NPVVJDRVMpOiBMaWtld2lzZS4KKwkoeGZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKTogTGlrZXdpc2UuCisJKHhmc19zdGFnZTFfNV9leGVjX0FTRkxBR1MpOiBMaWtld2lzZS4KKwkoeGZzX3N0YWdlMV81X2V4ZWNfTERGTEFHUyk6IExpa2V3aXNlLgorCSogc3RhZ2UyL2J1aWx0aW5zLmMgKHNldHVwX2Z1bmMpOiBBZGQgaXRlbXMgZm9yIEpGUyBhbmQgWEZTIGludG8KKwlTVEFHRTFfNV9NQVAuCisJKiBzdGFnZTIvZGlza19pby5jIChmc3lzX3RhYmxlKTogQWRkZWQgZW50cmllcyBmb3IgSkZTIGFuZCBYRlMuCisJKiBzdGFnZTIvZmlsZXN5cy5oIFtGU1lTX0pGU10gKEZTWVNfSkZTX05VTSk6IFNldCB0byAxLgorCVtGU1lTX0pGU10gKGpmc19tb3VudCk6IERlY2xhcmVkLgorCVtGU1lTX0pGU10gKGpmc19yZWFkKTogTGlrZXdpc2UuCisJW0ZTWVNfSkZTXSAoamZzX2Rpcik6IExpa2V3aXNlLgorCVtGU1lTX0pGU10gKGpmc19lbWJlZCk6IExpa2V3aXNlLgorCVshRlNZU19KRlNdIChGU1lTX0pGU19OVU0pOiBTZXQgdG8gMC4KKwlbRlNZU19YRlNdIChGU1lTX1hGU19OVU0pOiBTZXQgdG8gMS4KKwlbRlNZU19YRlNdICh4ZnNfbW91bnQpOiBEZWNsYXJlZC4KKwlbRlNZU19YRlNdICh4ZnNfcmVhZCk6IExpa2V3aXNlLgorCVtGU1lTX1hGU10gKHhmc19kaXIpOiBMaWtld2lzZS4KKwkoTlVNX0ZTWVMpOiBBZGRlZCBGU1lTX0pGU19OVU0gYW5kIEZTWVNfWEZTX05VTS4KKwkqIHN0YWdlMi9zaGFyZWQuaCAoU1RBR0UyX0lEX0pGU19TVEFHRTFfNSk6IE5ldyBtYWNyby4KKwkoU1RBR0UyX0lEX1hGU19TVEFHRTFfNSk6IExpa2V3aXNlLgorCVtGU1lTX0pGU10gKFNUQUdFMl9JRCk6IFNldCB0byBTVEFHRTJfSURfSkZTX1NUQUdFMV81LgorCVtGU1lTX1hGU10gKFNUQUdFMl9JRCk6IFNldCB0byBTVEFHRTJfSURfWEZTX1NUQUdFMV81LgorCSogc3RhZ2UyL2ZzeXNfamZzLmM6IE5ldyBmaWxlLgorCSogc3RhZ2UyL2ZzeXNfeGZzLmM6IExpa2V3aXNlLgorCSogc3RhZ2UyL2pmcy5oOiBMaWtld2lzZS4KKwkqIHN0YWdlMi94ZnMuaDogTGlrZXdpc2UuCisKKzIwMDEtMTAtMjcgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9hcG0uUzogQWx3YXlzIGRpc2Nvbm5lY3QgZnJvbSBBUE0uIFdyaXR0ZW4gYnkgRXJpY2gKKwlTdGVmYW4gQm9sZXluLgorCisJKiB1dGlsL01ha2VmaWxlLmFtIChub2luc3RfREFUQSk6IFJlbW92ZWQuCisJKEVYVFJBX0RJU1QpOiBMaWtld2lzZS4KKwkKKzIwMDEtMTAtMTQgIEdvcmRvbiBNYXR6aWdrZWl0ICA8Z29yZEBmaWcub3JnPgorCisJKiBjb25maWd1cmUuaW46IEV4cGxpY2l0bHkgY2FsbCBfQU1fREVQRU5ERU5DSUVTKENDKSBmb3IgdGhlCisJYmVuZWZpdCBvZiBvbGRlciBBdXRvY29uZnMuCisKKzIwMDEtMTAtMTMgIFlvc2hpbm9yaSBLLiBPa3VqaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIG5ldGJvb3QvZnN5c190ZnRwLmMgKHRmdHBfcmVhZCk6IE1vdmUgdGhlIHVudXNlZCBkYXRhCisJZm9yd2FyZHMsIG9ubHkgaWYgQU1UIGlzIG1vcmUgdGhhbiB6ZXJvLiBJZiBBTVQgaXMgbm90IHBvc2l0aXZlLAorCXN1YnRyYWN0IEJVRl9SRUFEIGZyb20gU0FWRURfRklMRVBPUyBhbmQgc2V0IEJVRl9SRUFEIHRvIHplcm8sCisJdG8gc2tpcCB0aGUgd2hvbGUgYnVmZmVyLiBSZXBvcnRlZCBieSBGcmFuayBNZWhuZXJ0LgorCQorMjAwMS0xMC0xMyAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZ251Lm9yZz4KKworCURvbid0IHVzZSBnZXRfZGlza2luZm9fZmxvcHB5LiBSZXBvcnRlZCBieSBCZW4gTGlibGl0CisJPGxpYmxpdEBlZWNzLmJlcmtlbGV5LmVkdT4uCisJCisJKiBzdGFnZTIvYXNtLlMgKGdldF9kaXNraW5mb19mbG9wcHkpOiBSZW1vdmVkIChieSBjcHApLgorCSogc3RhZ2UyL2Jpb3MuYyAoZ2V0X2Rpc2tpbmZvX2Zsb3BweSk6IFJlbW92ZWQuCisJKGdldF9kaXNraW5mbyk6IERvbid0IGNhbGwgZ2V0X2Rpc2tpbmZvX2Zsb3BweSBhbnkgbG9uZ2VyLgorCQorMjAwMS0xMC0xMyAgWW9zaGlub3JpIEsuIE9rdWppICA8b2t1amlAZ251Lm9yZz4KKworCUJhc2VkIG9uIGEgcGF0Y2ggZnJvbSBKZXJlbXkgS2F0eiA8a2F0empAcmVkaGF0LmNvbT46CisJKiBkb2NzL2dydWIudGV4aSAoU3RhZ2UyIGVycm9ycyk6IEFkZGVkIGRvY3VtZW50YXRpb24gb24gdGhlCisJZXJyb3IgbnVtYmVyIDMzIChTZXJpYWwgZGV2aWNlIG5vdCBjb25maWd1cmVkKS4KKwkqIGdydWIvYXNtc3R1Yi5jIChzZXJpYWxfZXhpc3RzKTogTmV3IGZ1bmN0aW9uLgorCSogc3RhZ2UyL3NlcmlhbC5jIChzZXJpYWxfZXhpc3RzKTogTGlrZXdpc2UuCisJKiBzdGFnZTIvc2VyaWFsLmggKHNlcmlhbF9leGlzdHMpOiBOZXcgcHJvdG90eXBlLgorCSogc3RhZ2UyL3NoYXJlZC5oIChncnViX2Vycm9yX3QpOiBFUlJfTkVFRF9TRVJJQUwgaXMgYWRkZWQuCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAodGVybWluYWxfZnVuYykgW1NVUFBPUlRfU0VSSUFMXTogSWYgYQorCXNlcmlhbCBkZXZpY2UgaXMgbm90IGNvbmZpZ3VyZWQgeWV0LCByZXN0b3JlIHRoZSB0ZXJtaW5hbCBhbmQKKwlzZXQgRVJSTlVNIHRvIEVSUl9ORUVEX1NFUklBTC4KKwkqIHN0YWdlMi9jb21tb24uYyAoZXJyX2xpc3QpOiBBZGRlZCBhbiBpdGVtIGZvciBFUlJfTkVFRF9TRVJJQUwuCisJCisyMDAxLTEwLTEzICBZb3NoaW5vcmkgSy4gT2t1amkgIDxva3VqaUBnbnUub3JnPgorCisJRnJvbSBKYXNvbiBUaG9tYXMgPGphc29uQHRvcGljLmNvbS5hdT46CisJKiB1dGlsL2dydWItaW5zdGFsbC5pbiAoY29udmVydCk6IEFkZCBzdXBwb3J0IGZvciBEQUM5NjAuCisKKwlGcm9tIEFkcmlhbiBQaGlsbGlwcyA8YS5waGlsbGlwc0Bkbm1pLm5vPjoKKwkqIGxpYi9kZXZpY2UuYyAoZ2V0X2RhYzk2MF9kaXNrX25hbWUpOiBOZXcgZnVuY3Rpb24uCisJKGluaXRfZGV2aWNlX21hcCkgW19fbGludXhfX106IEFkZCBzdXBwb3J0IGZvciBEQUM5NjAuCisJCisyMDAxLTEwLTExICBKb2NoZW4gSG9lbmlja2UgIDxqb2NoZW5AZ251Lm9yZz4KKworCSogc3RhZ2UyL2ZzeXNfcmVpc2VyZnMuYyAocmVpc2VyZnNfc3VwZXJfYmxvY2spOiBVcGRhdGVkCisJdG8gYmV0dGVyIG1hdGNoIHJlY2VudCByZWlzZXJmcyB2ZXJzaW9ucy4KKwkocmVpc2VyZnNfbW91bnQpOiBIYW5kbGUgY2FzZXMgd2hlcmUgam91cm5hbCBjYW4ndCBiZSBmb3VuZCwKKwllLmcuIGpvdXJuYWwgb24gYW5vdGhlciBkaXNrIG9yIHVuZXhwZWN0ZWQgam91cm5hbCBwYXJhbWV0ZXJzLgorCUluIHRoYXQgY2FzZSB0aGUgam91cm5hbCBpc24ndCB1c2VkLgorCQorMjAwMS0xMC0xMCAgSm9jaGVuIEhvZW5pY2tlICA8am9jaGVuQGdudS5vcmc+CisKKwkqIHN0YWdlMi9mc3lzX3JlaXNlcmZzLmMgKHJlaXNlcmZzX21vdW50KTogIERvbid0IGxvb2sgYXQKKwl0aGUgc3VwZXJibG9jayBmaWVsZCBzX2pvdXJuYWxfYmxvY2tfY291bnQgYW55bW9yZS4gIEl0IHVzZWQKKwl0byBjb250YWluIDAsIGl0IG5ldmVyIGNvbnRhaW5lZCBhIHZhbGlkIHZhbHVlLCBhbmQgbm93IEkKKwloYXZlIGEgcmVwb3J0IHRoYXQgaXQgY2FuIGNvbnRhaW4gYW4gaW52YWxpZCB2YWx1ZS4KKwlCdWcgcmVwb3J0ZWQgYnkgSmltIENhbGV5IDxjYWxleUBjaGVzY28uY29tPi4KKwkKKzIwMDEtMDktMjQgIEpvY2hlbiBIb2VuaWNrZSAgPGpvY2hlbkBnbnUub3JnPgorCisJKiBzdGFnZTIvZnN5c19yZWlzZXJmcy5jIChyZWlzZXJmc19kaXIpOiAgU2V0IGVycm51bSB0byAKKwlFUlJfRlNZU19DT1JSVVBUIGlmIGEgc3ltbGluayBjYW4ndCBiZSByZWFkIGZvciBzb21lIHJlYXNvbiwKKwlidXQgbm8gZXJyb3IgaXMgc2V0IGJ5IHJlYWQuCisJCisyMDAxLTA4LTA4ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJRnJvbSBEZXJyaWsgUGF0ZXMgPGRwYXRlc0Bkc2RrMTIubmV0PjoKKwkqIHN0YWdlMi9hc20uUyBbIVNUQUdFMV81XSAoZ3J1Yl9oYWx0KTogU2V0IHRoZSBsZXZlbCBvZiBBUE0KKwlzdXBwb3J0IHRvIDEuMSwgYmVmb3JlIHR1cm5pbmcgb2ZmIHRoZSBwb3dlciBzdGF0ZS4KKwkKKzIwMDEtMDgtMDggIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHV0aWwvZ3J1Yi1tZDUtY3J5cHQuaW46IFByZWZpeCBiYWNrcXVvdGVzIHdpdGggYmFja3NsYXNoZXMgaW4KKwlzdHJpbmdzLiAgRnJvbSBGZXJuYW5kbyBTaWx2ZWlyYS4KKwkKKzIwMDEtMDgtMDIgIEdvcmRvbiBNYXR6aWdrZWl0ICA8Z29yZEBmaWcub3JnPgorCisJKiBzdGFnZTIvY29tbW9uLmMgKGluaXRfYmlvc19pbmZvKTogSWdub3JlIHplcm8tbGVuZ3RoIG1lbW9yeQorCXJhbmdlcy4gIEZyb20gRGVycmlrIFBhdGVzIDxkcGF0ZXNAZHNkazEyLm5ldD4uCisKKzIwMDEtMDctMjYgIEpvY2hlbiBIb2VuaWNrZSAgPGpvY2hlbkBnbnUub3JnPgorCisJKiBzdGFnZTIvTWFrZWZpbGUuYW0gKGxpYmdydWJfYV9DRkxBR1MpOiBFbmFibGUgVVNFX01ENV9QQVNTV09SRFMKKwlmb3IgbGliZ3J1Yi4gIFByZXZpb3VzbHkgdGhhdCB3YXMgaW1wbGljaXRseSBkb25lIGJ5IGNvbmZpZ3VyZS5pbgorCXVudGlsIHRoZSBwYXRjaCBmcm9tIDIwMDEtMDctMDQsIHdoaWNoIG1vdmVkIHRoYXQgZmxhZyBmcm9tIENGTEFHUworCXRvIEZTWVNfQ0ZMQUdTLiAgUmVwb3J0ZWQgYnkgWUFNQUdVQ0hJIFNoaW5nbworCTxzaGluZ29Aa2lwLmlpcy50b3lhbWEtdS5hYy5qcD4KKworMjAwMS0wNy0xMyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogdXRpbC9ncnViLWluc3RhbGwuaW4gKGNvbnZlcnQpOiBSZWNvZ25pemUgdGhlIG5hbWluZyBzY2hlbWUKKwlmb3IgTGludXggZGV2ZnMgZmxvcHB5IGRldmljZXMuIFJlcG9ydGVkIGJ5IEphc29uIFRob21hcworCTxqYXNvbkB0b3BpYy5jb20uYXU+LgorCQorMjAwMS0wNy0wNyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogbmV0Ym9vdC9jb21waWxlOiBOZXcgZmlsZS4gVGhpcyB3YXMgYWxzbyBtaXNzaW5nLi4uIEhvdyBtYW55CisJYGBjb21waWxlJydzIGRvZXMgYXV0b21ha2Ugd2FudD8KKwkKKzIwMDEtMDctMDcgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwlGcm9tIEphbiBaZXJlYmVja2kgPGphbi5saXN0QGVsaXRlLXBmZXJkZS5kZT46CisJKiBhY2luY2x1ZGUubTQgKGdydWJfREVGSU5FX0ZJTEUpOiBFc2NhcGUgZG91YmxlLXF1b3RhdGlvbnMgYXMKKwl3ZWxsLgorCQorMjAwMS0wNy0wNSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogY29uZmlndXJlLmluIChBTV9JTklUX0FVVE9NQUtFKTogU2V0IHRoZSB2ZXJzaW9uIG51bWJlciB0bworCTAuOTAuCisKKzIwMDEtMDctMDUgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwlVZ2hoISBJIGZvcmdvdCB0byBhZGQgdGhpcyBmaWxlIHRvIHRoZSBDVlMuCisKKwkqIGRvY3MvY29tcGlsZTogTmV3IGZpbGUuCisJCisyMDAxLTA3LTA1ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBkb2NzL2dydWIudGV4aTogVXBkYXRlZC4KKwkKKzIwMDEtMDctMDUgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9ib290LmMgKGxvYWRfaW5pdHJkKSBbIU5PX0RFQ09NUFJFU1NJT05dOiBTZXQKKwlOT19ERUNPTVBSRVNTSU9OIHRvIG9uZSBiZWZvcmUgb3BlbmluZyBJTklUUkQsIHNvIHRoYXQgR1JVQgorCWRvZXNuJ3QgZGVjb21wcmVzcyBhbiBpbml0cmQgYXV0b21hdGljYWxseS4gUmVwb3J0ZWQgYnkKKwlUaGllcnJ5IExhcm9uZGUuCisJCisyMDAxLTA3LTA0ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvY29tcGlsZTogTmV3IGZpbGUuCisJKiBkb2NzL21kYXRlLXNoOiBMaWtld2lzZS4KKwkqIGRvY3MvdGV4aW5mby50ZXg6IExpa2V3aXNlLgorCSogY29tcGlsZTogUmVtb3ZlZC4KKwkqIG1kYXRlLXNoOiBMaWtld2lzZS4KKwkqIHRleGluZm8udGV4OiBMaWtld2lzZS4KKwkqIGNvbmZpZy5ndWVzczogVXBkYXRlZCBmcm9tIGF1dG9tYWtlLTEuNGguCisJKiBjb25maWcuc3ViOiBMaWtld2lzZS4KKwkqIGRlcGNvbXA6IExpa2V3aXNlLgorCSogaW5zdGFsbC1zaDogTGlrZXdpc2UuCisJKiBtaXNzaW5nOiBMaWtld2lzZS4KKwkqIG1raW5zdGFsbGRpcnM6IExpa2V3aXNlLgorCSogY29uZmlndXJlLmluIChBUyk6IE5ldyB2YXJpYWJsZS4KKwkoQVNGTEFHUyk6IExpa2V3aXNlLgorCSgtLWRpc2FibGUtbWQ1LXBhc3N3b3JkKTogVXNlIEZTWVNfQ0ZMQUdTIGluc3RlYWQgb2YgQ0ZMQUdTLgorCSogc3RhZ2UxL01ha2VmaWxlLmFtIChBTV9DRkxBR1MpOiBSZW5hbWVkIHRvIC4uLgorCShBTV9BU0ZMQUdTKTogLi4uIHRoaXMuCisJKiBzdGFnZTIvTWFrZWZpbGUuYW0gKHByZV9zdGFnZTJfZXhlY19BU0ZMQUdTKTogTmV3IHZhcmlhYmxlLgorCShzdGFydF9leGVjX0NGTEFHUyk6IFJlbmFtZWQgdG8gLi4uCisJKHN0YXJ0X2V4ZWNfQVNGTEFHUyk6IC4uLiB0aGlzLgorCShzdGFydF9leGVjLXN0YXJ0Lm8pOiBSZW5hbWVkIHRvIC4uLgorCShzdGFydF9leGVjLXN0YXJ0LiQoT0JKRVhUKSk6IC4uLiB0aGlzLgorCShlMmZzX3N0YWdlMV81X2V4ZWNfQVNGTEFHUyk6IE5ldyB2YXJpYWJsZS4KKwkoZmF0X3N0YWdlMV81X2V4ZWNfQVNGTEFHUyk6IExpa2V3aXNlLgorCShmZnNfc3RhZ2UxXzVfZXhlY19BU0ZMQUdTKTogTGlrZXdpc2UuCisJKG1pbml4X3N0YWdlMV81X2V4ZWNfQVNGTEFHUyk6IExpa2V3aXNlLgorCShyZWlzZXJmc19zdGFnZTFfNV9leGVjX0FTRkxBR1MpOiBMaWtld2lzZS4KKwkodnN0YWZzX3N0YWdlMV81X2V4ZWNfQVNGTEFHUyk6IExpa2V3aXNlLgorCShkaXNrbGVzc19leGVjX0FTRkxBR1MpOiBMaWtld2lzZS4KKwkobmJsb2FkZXJfZXhlY19DRkxBR1MpOiBSZW5hbWVkIHRvIC4uLgorCShuYmxvYWRlcl9leGVjX0FTRkxBR1MpOiAuLi4gdGhpcy4KKwkobmJsb2FkZXJfZXhlYy1uYmxvYWRlci5vKTogUmVuYW1lZCB0byAuLi4KKwkobmJsb2FkZXJfZXhlYy1uYmxvYWRlci4kKE9CSkVYVCkpOiAuLi4gdGhpcy4KKwkocHhlbG9hZGVyX2V4ZWNfQ0ZMQUdTKTogUmVuYW1lZCB0byAuLi4KKwkocHhlbG9hZGVyX2V4ZWNfQVNGTEFHUyk6IC4uLiB0aGlzLgorCShweGVsb2FkZXJfZXhlYy1weGVsb2FkZXIuJChPQkpFWFQpKTogTmV3IHRhcmdldC4KKworMjAwMS0wNy0wMyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKwkKKwlGcm9tIEp1bGllbiBCb3JkZXQgPGp1bGllbi5ib3JkZXRAaW50LWV2cnkuZnI+OgorCSogc3RhZ2UyL2kzODYtZWxmLmggKEVsZjMyX1NoZHIpOiBOZXcgdHlwZS4KKwkqIHN0YWdlMi9ib290LmMgKGxvYWRfaW1hZ2UpOiBBZGRlZCBFTEYgc3ltYm9sIGxvYWRpbmcgc3VwcG9ydC4KKwkKKzIwMDEtMDYtMjIgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9jaGFyX2lvLmMgW1NUQUdFMV81XSAoZ3J1Yl9zdHJjbXApOiBEZWZpbmVkLCBldmVuCisJZm9yIFN0YWdlIDEuNS4gU2VlIHRoZWNvbW1lbnQsIGZvciBhIHBvc3NpYmxlIGZ1dHVyZSBzdHJhdGVneS4KKwkqIHN0YWdlMi9mc3lzX3ZzdGFmcy5jIFshRlNZU19WU1RBRlNdOiBEb24ndCBkZWZpbmUgYW55dGhpbmcuCisJW1NUQUdFMV81XSAoZ3J1Yl9zdHJjbXApOiBSZW1vdmVkLgorCShnZXRfZmlsZV9pbmZvKTogTWFkZSBzdGF0aWMuCisJKHZzdGFmc19yZWFkZGlyKTogTGlrZXdpc2UuCisJKHZzdGFmc19uZXh0ZGlyKTogTGlrZXdpc2UuCisJKGN1cnJfZXh0KTogTGlrZXdpc2UuCisJKGN1cnJlbnRfZGlyZW50cnkpOiBMaWtld2lzZS4KKwkoY3VycmVudF9ibG9ja3Bvcyk6IExpa2V3aXNlLgorCShhKTogTGlrZXdpc2UuCisJCisyMDAxLTA2LTIyICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJVlNUYSBmaWxlc3lzdGVtIHN1cHBvcnQgaXMgYWRkZWQuCisJCisJRnJvbSBLcmlzdG9mZmVyIEJy5W5lbXlyIDx6dGlvbkBzd2lwbmV0LnNlPjoKKwkqIHN0YWdlMi9jb25maWd1cmUuaW4gKC0tZGlzYWJsZS12c3RhZnMpOiBOZXcgb3B0aW9uLgorCSogc3RhZ2UyL01ha2VmaWxlLmFtIChub2luc3RfSEVBREVSUyk6IEFkZGVkIHZzdGFmcy5oLgorCShsaWJncnViX2FfU09VUkNFUyk6IEFkZGVkIGZzeXNfdnN0YWZzLmMuCisJKGxpYmdydWJfYV9DRkxBR1MpOiBBZGRlZCAtREZTWVNfVlNUQUZTPTEuCisJKHBrZ2RhdGFfREFUQSk6IEFkZGVkIHZzdGFmc19zdGFnZTFfNS4KKwkobm9pbnN0X1BST0dSQU1TKTogQWRkZWQgdnN0YWZzX3N0YWdlMV81LmV4ZWMuCisJKHByZV9zdGFnZTJfZXhlY19TT1VSQ0VTKTogQWRkZWQgZnN5c192c3RhZnMuYy4KKwkodnN0YWZzX3N0YWdlMV81X2V4ZWNfU09VUkNFUyk6IE5ldyB2YXJpYWJsZS4KKwkodnN0YWZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKTogTGlrZXdpc2UuCisJKHZzdGFmc19zdGFnZTFfNV9leGVjX0xERkxBR1MpOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9kaXNrX2lvLmMgKGZzeXNfdGFibGUpOiBBZGRlZCBhbiBlbnRyeSBmb3IgdnN0YWZzLgorCSogc3RhZ2UyL2ZpbGVzeXMuaCBbRlNZU19WU1RBRlNdIChGU1lTX1ZTVEFGU19OVU0pOiBEZWZpbmVkIGFzCisJMS4KKwlbRlNZU19WU1RBRlNdICh2c3RhZnNfbW91bnQpOiBOZXcgcHJvdG90eXBlLgorCVtGU1lTX1ZTVEFGU10gKHZzdGFmc19yZWFkKTogTGlrZXdpc2UuCisJW0ZTWVNfVlNUQUZTXSAodnN0YWZzX2Rpcik6IExpa2V3aXNlLgorCVshRlNZU19WU1RBRlNdIChGU1lTX1ZTVEFGU19OVU0pOiBEZWZpbmVkIGFzIDAuCisJKE5VTV9GU1lTKTogQWRkZWQgRlNZU19WU1RBRlNfTlVNLgorCSogc3RhZ2UyL3BjX3NsaWNlLmggKFBDX1NMSUNFX1RZUEVfVlNUQUZTKTogTmV3IG1hY3JvLgorCSogc3RhZ2UyL3NoYXJlZC5oIChTVEFHRTJfSURfVlNUQUZTX1NUQUdFMV81KTogTGlrZXdpc2UuCisJW1NUQUdFMV81ICYmIEZTWVNfVlNUQUZTXSAoU1RBR0UyX0lEKTogRGVmaW5lZCBhcworCVNUQUdFMl9JRF9WU1RBRlNfU1RBR0UxXzUuCisJKiBzdGFnZTIvdnN0YWZzLmg6IE5ldyBmaWxlLgorCSogc3RhZ2UyL2ZzeXNfdnN0YWZzLmM6IExpa2V3aXNlLgorCQorMjAwMS0wNi0yMiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCUZyb20gVGhpZXJyeSBMYXJvbmRlIDx0aGllcnJ5QGNyaTc0Lm9yZz46CisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoY29uZmlnZmlsZV9mdW5jKTogQWRkZWQgYSBwcm90b3R5cGUuCisJKGJvb3RwX2Z1bmMpOiBJZiBgLS13aXRoLWNvbmZpZ2ZpbGUnIGlzIGdpdmVuLCBzZXQKKwlXSVRIX0NPTkZJR0ZJTEUgdG8gb25lLCBhbmQgY2FsbCBjb25maWdmaWxlX2Z1bmMgd2l0aAorCUNPTkZJR19GSUxFLgorCQorMjAwMS0wNi0yMSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogZG9jcy9ncnViLnRleGk6IFVwZGF0ZSB0aGUgbG9jYXRpb24gb2YgdGhlIENWUyByZXBvc2l0b3J5CisJWy9ob21lL2N2cyAtPiAvY3Zzcm9vdC9ncnViXS4KKwkqIFJFQURNRTogTGlrZXdpc2UuCisJCisyMDAxLTA2LTE5ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvYm9vdC5jIChsb2FkX2ltYWdlKTogSWYgdGhlIGltYWdlIGlzIGEgTXVsdGlib290IEVMRiBPUworCWltYWdlLCBnZXQgdGhlIHBoeXNpY2FsIGVudHJ5IGFkZHJlc3MsIHdoZW4gYSBsb2FkZWQgbWVtb3J5CisJc2VnbWVudCBjb250YWlucyBpdC4gQW5kLCBzZXQgRU5UUllfQUREUiB0byBpdCwgYWZ0ZXIgcHJpbnRpbmcKKwlvdXQgdGhlIHZpcnR1YWwgb25lLiBTdWdnZXN0ZWQgYnkgUm9nZWxpbyBNLiBTZXJyYW5vIEpyLgorCTxyb2dlbGlvQHZpY3RvcmlvLmNvbT4uCisJCisyMDAxLTA1LTMwICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBkb2NzL2dydWIudGV4aTogRml4IHNvbWUgdHlwb3MuIFJlcG9ydGVkIGJ5IEZsb3JpYW4gSGF0YXQKKwk8bWluaW5ldEB3YW5hZG9vLmZyPi4KKwkKKzIwMDEtMDUtMjkgIFBhdmVsIFJvc2tpbiAgPHByb3NraUBnbnUub3JnPgorCisJKiBjb25maWd1cmUuaW4gKEFDX09VVFBVVCk6IFJlbW92ZSBkZWJpYW4vTWFrZWZpbGUuCisKKzIwMDEtMDUtMjggIEdvcmRvbiBNYXR6aWdrZWl0ICA8Z29yZEBmaWcub3JnPgorCisJKiBNYWtlZmlsZS5hbSAoU1VCRElSUyk6IFJlbW92ZSByZWZlcmVuY2UgdG8gZGViaWFuIGRpcmVjdG9yeS4KKwlQYWNrYWdpbmcgaXMgbm8gbG9uZ2VyIGRvbmUgYnkgdGhlIEdSVUIgdGVhbS4KKworMjAwMS0wNS0wMyAgR29yZG9uIE1hdHppZ2tlaXQgIDxnb3JkQGZpZy5vcmc+CisKKwkqIHN0YWdlMS9zdGFnZTEuUyAobnRfbWFnaWMpOiBFeHBsaWNpdGx5IHJlc2VydmUgc3BhY2UgZm9yIHRoZSBOVAorCW1hZ2ljIG51bWJlci4KKworMjAwMS0wNS0yNSAgS2xhdXMgUmVpY2hsICA8S2xhdXMuUmVpY2hsQGFsY2F0ZWwuYXQ+CisKKwkqIHN0YWdlMi9zdGFnZTIuYyAocHJpbnRfZW50cmllc19yYXcpOiBOZXcgZnVuY3Rpb24uCisJKHJ1bl9tZW51KTogVXNlIGl0IHRvIGltcGxlbWVudCBtZW51ICYgY29tbWFuZC1saXN0IGlmIG9uIGR1bWIKKwl0ZXJtaW5hbHMuICAKKwlDaGFuZ2VzIGFyZToKKwkgIEFkanVzdCBGSVJTVF9FTlRSWSBvbmx5IG9uIG5vbi1kdW1iIHRlcm1pbmFscy4KKwkgIFNldHRpbmcgb2YgU0hPV19NRU5VIGlzIGhvbm91cmVkIGFsc28gb24gZHVtYgorCSAgICB0ZXJtaW5hbHMuIAorCSAgTGlrZWx5IGlmIFNIT1dfTUVOVSBpcyBmYWxzZSwgRVNDIGJyaW5ncyBoZXIgdG8gdGhlCisJICAgIG1lbnUgLSBub3QgdG8gdGhlIGNvbW1hbmQtbGluZSBhcyBiZWZvcmUuCisJICBQUklOVF9CT1JERVIsIEdPVE9YWSwgU0VUX0xJTkVfeHh4IGFyZSBvbmx5IGNhbGxlZCBpZgorCSAgICBub3Qgb24gZHVtYiB0ZXJtaW5hbHMuCisJICBTaG93IGVudHJ5IG51bWJlciB3aGVuIHRpbWVvdXQgaXMgcnVubmluZyBpZiB0ZXJtaW5hbCBpcyBkdW1iLgorCSAgUHJvbXB0IHdpdGggZW50cnkgbnVtYmVyIHdoZW4gd2FpdGluZyBmb3Iga2V5cy4KKworMjAwMS0wNS0xNCAgUGF2ZWwgUm9za2luICA8cHJvc2tpQGdudS5vcmc+CisKKwkqIHN0YWdlMi9zaGFyZWQuaCAoRU5UUlkpOiBSZW1vdmUgdW5uZWNlc3NhcnkgYCMjJy4KKworMjAwMS0wNS0wMyAgSm9jaGVuIEhvZW5pY2tlICA8am9jaGVuQGdudS5vcmc+CisKKwkqIGdydWIvYXNtc3R1Yi5jIChiaW9zZGlzayk6IFdvcmsgYXJvdW5kIGEgYnVnIGluIGxpbnV4J3MgZXoKKwlyZW1hcHBpbmcuICBQcm9ibGVtIHJlcG9ydGVkIGJ5IEJlbiBCeWVyIDxiYnllckByaWNlLmVkdT4uCisJCisyMDAxLTAzLTI4ICBHb3Jkb24gTWF0emlna2VpdCAgPGdvcmRAZmlnLm9yZz4KKworCSogc3RhZ2UyL2Jvb3QuYyAobG9hZF9pbWFnZSk6IERvbid0IGNhc3QgZW50cnlfYWRkciB0byBhbiBpbnQsIG9yCisJdGhlIHRvcCBiaXQgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyB0aGUgc2lnbi4KKworMjAwMS0wMy0xNiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCUZyb20gQm9kbyBSdWVza2FtcCA8YnJAaXRjaGlnby5jb20+OgorCSogc3RhZ2UyL2Jvb3QuYyAobG9hZF9pbml0cmQpOiBBdm9pZCB0aGUgbGFzdCA2NGtiIGZvcgorCUxpbnV4IDIuMi54IGJ1Zy4KKwkKKzIwMDEtMDMtMDMgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIGRvY3MvbXVsdGlib290LnRleGkgKEhpc3RvcnkpOiBXcml0dGVuLgorCQorMjAwMS0wMi0yOCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCUZyb20gSEFTRUdBV0EgVG9tb2tpIDx0aGFzZWdhd2FAbXRhLmJpZ2xvYmUubmUuanA+OgorCSogbGliL2RldmljZS5jIChnZXRfaWRlX2Rpc2tfbmFtZSkgW19fRnJlZUJTRF9fXTogQWRkIHN1cHBvcnQKKwlmb3IgRnJlZUJTRC00LjAgb3IgbGF0ZXIuIFVzZSAiL2Rldi9yYWQwIi4KKwkqIHV0aWwvZ3J1Yi1pbnN0YWxsLmluIChjb252ZXJ0KTogQWRkIGNvZGUgZm9yIEZyZWVCU0QKKwlkaXNrbGFiZWxzLgorCisyMDAxLTAyLTI4ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJRnJvbSBUaGllcnJ5IExhcm9uZGUgPHRoaWVycnlAY3JpNzQub3JnPjoKKwkqIHN0YWdlMi9zdGFnZTIuYyAoY21haW4pOiBJZiB0aGUgZGVmYXVsdCBlbnRyeSBpcyB3cm9uZywgc2V0IGl0CisJdG8gRkFMTEJBQ0tfRU5UUlkgaWYgRkFMTEJBQ0tfRU5UUlkgaXMgdmFsaWQsIG90aGVyd2lzZSBzZXQgaXQKKwl0byB6ZXJvLiBTdWdnZXN0ZWQgYnkgTmljb2xhcyBCb29zIDxuaWNvbGFzLmJvb3NAd2FuYWRvby5mcj4uCisJCisyMDAxLTAyLTI4ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBhY2NvbmZpZy5oIChBVVRPX0xJTlVYX01FTV9PUFQpOiBOZXcgZW50cnkuCisJKiBjb25maWd1cmUuaW4gKC0tZGlzYWJsZS1hdXRvLWxpbnV4LW1lbS1vcHQpOiBOZXcgb3B0aW9uLgorCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGtlcm5lbF9mdW5jKSBbIUFVVE9fTElOVVhfTUVNX09QVF06IEFkZAorCUtFUk5FTF9MT0FEX05PX01FTV9PUFRJT04gaW50byBMT0FEX0ZMQUdTLCB3aGV0aGVyIHRoZSB1c2VyCisJc3BlY2lmaWVzIC0tbm8tbWVtLW9wdGlvbiBvciBub3QuCisJCisyMDAxLTAyLTI3ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoY2hhaW5sb2FkZXJfZnVuYyk6IERvbid0IGNoZWNrIGlmIHRoZQorCWN1cnJlbnQgcGFydGl0aW9uIGlzIEZBVCwgYnV0IGNoZWNrIGlmIGl0IGhhcyBhIEZBVCBwYXJ0aXRpb24KKwl0eXBlIGFuZCB0aGUgQlBCIGhhcyBhIHN5c3RlbSBpZCBzdGFydGluZyB3aXRoICJNU1dJTiIuCisJCisyMDAxLTAyLTI3ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJQWRkZWQgaGVyY3VsZXMgc3VwcG9ydCBiYXNlZCBvbiBhIHBhdGNoIGJ5IEZyYW5rIE1laG5lcnQKKwk8Zm0zQG9zLmluZi50dS1kcmVzZGVuLmRlPi4gSSB0cmFuc2xhdGVkIGhpcyBhc3NlbWJseSBjb2RlIGludG8KKwlDLCBhbmQgc2VwYXJhdGVkIGhlcmN1bGVzIGZyb20gdGhlIG5vcm1hbCBjb25zb2xlLgorCQorCSogY29uZmlndXJlLmluICgtLWRpc2FibGUtaGVyY3VsZXMpOiBOZXcgb3B0aW9uLgorCQorCSogZ3J1Yi9hc21zdHViLmM6IEluY2x1ZGUgPGhlcmN1bGVzLmg+LgorCShzZXRfYXR0cmliKTogUmVuYW1lZCB0byAuLi4KKwkoY29uc29sZV9zZXRfYXR0cmliKTogLi4uIHRoaXMuCisJKGhlcmNfY2xzKTogTmV3IGZ1bmN0aW9uLgorCShoZXJjX2dldHh5KTogTGlrZXdpc2UuCisJKGhlcmNfZ290b3h5KTogTGlrZXdpc2UuCisJKGhlcmNfcHV0Y2hhcik6IExpa2V3aXNlLgorCShoZXJjX3NldF9hdHRyaWIpOiBMaWtld2lzZS4KKwkKKwkqIHN0YWdlMi9NYWtlZmlsZS5hbSAobm9pbnN0X0hFQURFUlMpOiBBZGRlZCBoZXJjdWxlcy5oLgorCShsaWJncnViX2FfQ0ZMQUdTKTogQWRkZWQgLURTVVBQT1JUX0hFUkNVTEVTPTEuCisJKEhFUkNVTEVTX0ZMQUdTKTogTmV3IHZhcmlhYmxlLgorCShTVEFHRTJfQ09NUElMRSk6IEFkZGVkICQoSEVSQ1VMRVNfRkxBR1MpLgorCShwcmVfc3RhZ2UyX2V4ZWNfU09VUkNFUyk6IEFkZGVkIGhlcmN1bGVzLmMuCisJKiBzdGFnZTIvYXNtLlMgWyFTVEFHRTFfNV0gKHNldF9hdHRyaWIpIFJlbmFtZWQgdG8gLi4uCisJWyFTVEFHRTFfNV0gKGNvbnNvbGVfc2V0X2F0dHJpYik6IC4uLiB0aGlzLgorCSogc3RhZ2UyL2J1aWx0aW5zLmMgW1NVUFBPUlRfSEVSQ1VMRVNdICh0ZXJtaW5hbF9mdW5jKTogQWRkZWQKKwloZXJjdWxlcyBzdXBwb3J0LgorCShidWlsdGluX3RhYmxlKSBbU1VQUE9SVF9IRVJDVUxFU106IEFkZGVkIGEgcG9pbnRlciB0bworCUJVSUxUSU5fVEVSTUlOQUwuCisJKiBzdGFnZTIvY2hhcl9pby5jIFtTVVBQT1JUX0hFUkNVTEVTXTogSW5jbHVkZSA8aGVyY3VsZXMuaD4uCisJWyFTVEFHRTFfNV0gKGdldF9jbWRsaW5lKSBbU1VQUE9SVF9IRVJDVUxFU106IEFkZGVkIGhlcmN1bGVzCisJc3VwcG9ydC4KKwlbIVNUQUdFMV81XSAoZ2V0a2V5KSBbU1VQUE9SVF9IRVJDVUxFU106IExpa2V3aXNlLgorCVshU1RBR0UxXzVdIChjaGVja2tleSkgW1NVUFBPUlRfSEVSQ1VMRVNdOiBMaWtld2lzZS4KKwkoZ3J1Yl9wdXRjaGFyKSBbU1VQUE9SVF9IRVJDVUxFU106IExpa2V3aXNlLgorCVshU1RBR0UxXzVdIChnb3RveHkpIFtTVVBQT1JUX0hFUkNVTEVTXTogTGlrZXdpc2UuCisJWyFTVEFHRTFfNV0gKGdldHh5KSBbU1VQUE9SVF9IRVJDVUxFU106IExpa2V3aXNlLgorCVshU1RBR0UxXzVdIChjbHMpIFtTVVBQT1JUX0hFUkNVTEVTXTogTGlrZXdpc2UuCisJKHNldF9hdHRyaWIpOiBOZXcgZnVuY3Rpb24uCisJKiBzdGFnZTIvc2hhcmVkLmggKGNvbnNvbGVfc2V0X2F0dHJpYik6IERlY2xhcmVkLgorCShURVJNSU5BTF9IRVJDVUxFUyk6IE5ldyBtYWNyby4KKwkqIHN0YWdlMi9zdGFnZTIuYyAocnVuX21lbnUpIFtTVVBQT1JUX0hFUkNVTEVTXTogQWRkZWQgaGVyY3VsZXMKKwlzdXBwb3J0LgorCSogc3RhZ2UyL2hlcmN1bGVzLmg6IE5ldyBmaWxlLgorCSogc3RhZ2UyL2hlcmN1bGVzLmM6IExpa2V3aXNlLgorCQorMjAwMS0wMi0xNyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCUZyb20gIlRyZXV0d2VpbjsgQmVybmhhcmQiCisJPEJlcm5oYXJkLlRyZXV0d2VpbkBWZXJ3YWx0dW5nLlVuaS1NdWVuY2hlbi5ERT46CisJKiBkb2NzL2dydWIudGV4aSAoRE9TL1dpbmRvd3MpOiBJbXByb3ZlZCB0aGUgcmVhZGFiaWxpdHkuCisJCisyMDAxLTAyLTExICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBkb2NzL2dydWIudGV4aSAoQ29tbWFuZC1saW5lIGFuZCBtZW51IGNvbW1hbmRzKTogUmVuYW1lZCB0byAuLi4KKwkoR2VuZXJhbCBjb21tYW5kcyk6IC4uLiB0aGlzLgorCQorMjAwMS0wMi0wOCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UyL2FzbS5TIFtTVEFHRTFfNV0gKGNoYWluX3N0YWdlMik6IFNhdmUgdGhlIHNlY29uZCBzZWN0b3IKKwlvZiBzdGFnZTIgaW4gJWVjeCB0ZW1wb3JhcmlseSwgYW5kIHNldCAlZWJwIHRvICVlY3ggYWZ0ZXIKKwlzd2l0Y2hpbmcgdG8gcHJvdGVjdGVkIG1vZGUuIEkgZm9yZ290IHRoYXQgJWVicCBpcyBicm9rZW4gYnkKKwlyb3RfdG9fcmVhbC4gUmVwb3J0ZWQgYnkgVG9ydmFsZCBSaWVnZWwKKwk8dHIxNkBpbmYudHUtZHJlc2Rlbi5kZT4uCisJCisyMDAxLTAyLTA4ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBkb2NzL2dydWItbmV3LnRleGk6IE1vdmVkIHRvIC4uLgorCSogZG9jcy9ncnViLnRleGk6IC4uLiBoZXJlLiBBbmQsIGluY2x1ZGUgaW50ZXJuYWxzLnRleGkuCisJKiBkb2NzL2ludGVybmFscy50ZXhpOiBOZXcgZmlsZS4KKwkqIGRvY3MvcHJvZy1yZWYudGV4aTogUmVtb3ZlZC4KKwkqIGRvY3MvdXNlci1yZWYudGV4aTogTGlrZXdpc2UuCisJKiBkb2NzL3R1dG9yaWFsLnRleGk6IExpa2V3aXNlLgorCSogZG9jcy9hcHBlbmRpY2VzLnRleGk6IExpa2V3aXNlLgorCSogZG9jcy9NYWtlZmlsZS5hbSAoZ3J1Yl9URVhJTkZPUyk6IFJlbW92ZWQgcHJvZy1yZWYudGV4aSwKKwl1c2VyLXJlZi50ZXhpLCB0dXRvcmlhbC50ZXhpLCBhbmQgYXBwZW5kaWNlcy50ZXhpLiBBZGRlZAorCWludGVybmFscy50ZXhpLgorCQorMjAwMS0wMi0wMyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCUZyb20gRXJpayBTY2hvZW5mZWxkZXIgPHNjaG9lbmZyQGdhZXJ0bmVyLmRlPjoKKwkqIHN0YWdlMi9zaGFyZWQuaCAoTElOVVhfSU5JVFJEX01BWF9BRERSRVNTKTogQ2hhbmdlZCBmcm9tCisJMHgzQzAwMDAwMCB0byAweDM4MDAwMDAwLgorCQorMjAwMS0wMi0wMyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgKHNhdmVkZWZhdWx0X2Z1bmMpCisJWyFTVVBQT1JUX0RJU0tMRVNTICYmICFHUlVCX1VUSUxdOiBDaGVjayBpZiB0aGUgdmVyc2lvbgorCWNvbnRhaW5lZCBpbiB0aGUgYnVmZmVyIG1hdGNoZXMgdG8gY3VycmVudCBvbmUgYXMgd2VsbC4KKwkKKzIwMDEtMDItMDIgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChzYXZlZGVmYXVsdF9mdW5jKQorCVshU1VQUE9SVF9ESVNLTEVTUyAmJiAhR1JVQl9VVElMXTogQ2hlY2sgaWYgdGhlIHN0YWdlMiBpZCBpcworCVNUQUdFMl9JRF9TVEFHRTIuIFN1Z2dlc3RlZCBieSBKb2NoZW4gSG9lbmlja2UuCisJCisJKiBzdGFnZTIvc3RhZ2UyLmMgKGNtYWluKTogSWYgREVGQVVMVF9FTlRSWSBpcyBvdXQgb2YgZW50cmllcywKKwlyZXNldCBERUZBVUxUX0VOVFJZIHRvIHplcm8uCisJCisyMDAxLTAyLTAyICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJTWFrZSBzYXZlZGVmYXVsdCB3b3JrYWJsZSBldmVuIHdpdGggU3RhZ2UgMS41LiBSZXBvcnRlZCBieQorCVRoaWVycnkgTGFyb25kZSA8dGhpZXJyeUBjcmk3NC5vcmc+LgorCQorCSogZ3J1Yi9hc21zdHViLmMgKGNoYWluX3N0YWdlMik6IEFkZGVkIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQsCisJU0VDT05EX1NFQ1RPUi4KKwkqIHN0YWdlMi9hc20uUyBbU1RBR0UxXzVdIChjaGFpbl9zdGFnZTIpOiBTZXQgJWVicCB0bworCVNFQ09ORF9TRUNUT1IuCisJKiBzdGFnZTIvZGlza19pby5jIFtTVEFHRTFfNV0gKGRpc2tfcmVhZF9ob29rKTogRGVmaW5lZC4KKwlbU1RBR0UxXzVdIChkaXNrX3JlYWRfZnVuYyk6IExpa2V3aXNlLgorCShyYXdyZWFkKSBbU1RBR0UxXzVdOiBIYW5kbGUgRElTS19SRUFEX0ZVTkMuCisJKGdydWJfcmVhZCkgW1NUQUdFMV81XTogTGlrZXdpc2UuCisJKiBzdGFnZTIvZnN5c19leHQyZnMuYyAoZXh0MmZzX3JlYWQpIFtTVEFHRTFfNV06IExpa2V3aXNlLgorCSogc3RhZ2UyL2ZzeXNfZmF0LmMgKGZhdF9yZWFkKSBbU1RBR0UxXzVdOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9mc3lzX2Zmcy5jIChmZnNfcmVhZCkgW1NUQUdFMV81XTogTGlrZXdpc2UuCisJKiBzdGFnZTIvZnN5c19taW5peC5jIChtaW5peF9yZWFkKSBbU1RBR0UxXzVdOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9mc3lzX3JlaXNlcmZzLmMgKHJlaXNlcmZzX3JlYWQpIFtTVEFHRTFfNV06IExpa2V3aXNlLgorCQorMjAwMS0wMi0wMiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogbmV0Ym9vdC9jb25maWcuYyBbR1JVQiAmJiBJTkNMVURFX1BDSV0gKHBjaV9kaXNwYXRjaF90YWJsZSk6CisJTmV3IHN0cnVjdHVyZS4KKwlbR1JVQiAmJiBJTkNMVURFX1BDSV0gKFBDSV9OSUMpOiBOZXcgdmFyaWFibGUuCisJKGV0aF9wcm9iZSkgW0dSVUIgJiYgSU5DTFVERV9QQ0ldOiBJZiBhIFBDSSBOSUMgY2FuZGlkYXRlIGlzCisJcHJlc2VudCwgcHJvYmUgaXQgZmlyc3QuCisJCisyMDAxLTAxLTI3ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJRnJvbSBEYW5pbG8gR29kZWMgPGRhbmNpQGFnZW5kYS5zaT46CisJKiBzdGFnZTIvcGNfc2xpY2UuaCAoUENfU0xJQ0VfVFlQRV9MSU5VWF9SQUlEKTogTmV3IG1hY3JvLgorCSogc3RhZ2UyL2ZzeXNfZXh0MmZzLmMgKGV4dDJmc19tb3VudCk6IEFkZCBhIGNoZWNrIGZvcgorCVBDX1NMSUNFX0xJTlVYX1JBSUQuCisJCisyMDAxLTAxLTI3ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJRnJvbSBCZXJuaGFyZCBUcmV1dHdlaW4KKwk8QmVybmhhcmQuVHJldXR3ZWluQFZlcndhbHR1bmcuVW5pLU11ZW5jaGVuLkRFPjoKKwkqIGRvY3MvZ3J1Yi1uZXcudGV4aSAoRE9TL1dpbmRvd3MpOiBNYWRlIG1vcmUgcmVhZGFibGUuCisJCisyMDAxLTAxLTI3ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBkb2NzL211bHRpYm9vdC50ZXhpOiBTdGFydCByZW9yZ2FuaXppbmcgTXVsdGlib290CisJU3BlY2lmaWNhdGlvbi4KKwkKKzIwMDEtMDEtMTUgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwlGcm9tIFRoaWVycnkgTGFyb25kZSA8dGhpZXJyeS5sYXJvbmRlQHBvbHludW0uY29tPjoKKwkqIGRvY3MvdXNlci1yZWYudGV4aSAoQ29tbWFuZC1saW5lIGFuZCBtZW51IGNvbW1hbmRzKTogVXBkYXRlCisJdGhlIGRlc2NyaXB0aW9uIGFib3V0IHNldGtleS4KKwkqIHN0YWdlMi9idWlsdGlucy5jIChzZXRrZXlfZnVuYyk6IFdoZW4gY2hlY2tpbmcgaWYgVE9fS0VZIGFuZAorCUZST01fS0VZIGFyZSBzcGVjaWZpZWQsIHNlZSAqVE9fS0VZIGFuZCAqRlJPTV9LRVkgaW5zdGVhZCBvZgorCVRPX0tFWSBhbmQgRlJPTV9LRVksIHJlc3BlY3RpdmVseS4KKwkKKzIwMDEtMDEtMTMgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwlGcm9tIFRoaWVycnkgTGFyb25kZSA8dGhpZXJyeS5sYXJvbmRlQHBvbHludW0uY29tPjoKKwkqIHV0aWwvZ3J1Yi1tZDUtY3J5cHQuaW4gKHByZWZpeCk6IE5ldyB2YXJpYWJsZS4KKwkoZXhlY19wcmVmaXgpOiBMaWtld2lzZS4KKwkoc2JpbmRpcik6IExpa2V3aXNlLgorCQorMjAwMS0wMS0xMiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogZG9jcy9tdWx0aWJvb3QuaCBbX19FTEZfX10gKE1VTFRJQk9PVF9IRUFERVJfRkxBR1MpOiBEZWZpbmVkCisJYXMgMHgwMDAwMDAwMyBpbnN0ZWFkIG9mIDB4MDAwMTAwMDMuCisJKiBkb2NzL2Jvb3QuUyAobXVsdGlib290X2hlYWRlcikgW19fRUxGX19dOiBEb24ndCBkZWZpbmUgYS5vdXQKKwlrbHVkZ2UgaW5mb3JtYXRpb24uCisJCisJKiBkb2NzL01ha2VmaWxlLmFtIChFWFRSQV9QUk9HUkFNUyk6IE5ldyB2YXJpYWJsZS4KKwlbQlVJTERfRVhBTVBMRV9LRVJORUxdIChub2luc3RfREFUQSk6IFJlbW92ZWQuCisJW0JVSUxEX0VYQU1QTEVfS0VSTkVMXSAobm9pbnN0X1BST0dSQU1TKTogQ2hhbmdlZCB0byBrZXJuZWwuCisJW0JVSUxEX0VYQU1QTEVfS0VSTkVMXSAoa2VybmVsX2V4ZWNfU09VUkNFUyk6IFJlbmFtZWQgdG8gLi4uCisJW0JVSUxEX0VYQU1QTEVfS0VSTkVMXSAoa2VybmVsX1NPVVJDRVMpOiAuLi4gdGhpcy4KKwlbQlVJTERfRVhBTVBMRV9LRVJORUxdIChrZXJuZWxfZXhlY19DRkxBR1MpOiBSZW5hbWVkIHRvIC4uLgorCVtCVUlMRF9FWEFNUExFX0tFUk5FTF0gKGtlcm5lbF9DRkxBR1MpOiAuLi4gdGhpcy4KKwlbQlVJTERfRVhBTVBMRV9LRVJORUxdIChrZXJuZWxfZXhlY19MREZMQUdTKTogUmVuYW1lZCB0byAuLi4KKwlbQlVJTERfRVhBTVBMRV9LRVJORUxdIChrZXJuZWxfTERGTEFHUyk6IC4uLiB0aGlzLgorCVtCVUlMRF9FWEFNUExFX0tFUk5FTF0gKGtlcm5lbCk6IFJlbW92ZWQuCisJW0JVSUxEX0VYQU1QTEVfS0VSTkVMXSAoYm9vdC5vKTogTmV3IGRlcGVuZGVuY3kuCisJKENMRUFORklMRVMpOiBOZXcgdmFyaWFibGUuCisJCisyMDAxLTAxLTExICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyBbU1VQUE9SVF9ORVRCT09UXSAoaWZjb25maWdfZnVuYyk6IEFsd2F5cworCXByaW50IGN1cnJlbnQgbmV0d29yayBjb25maWd1cmF0aW9uLgorCVtTVVBQT1JUX05FVEJPT1RdICh0ZnRwc2VydmVyX2Z1bmMpOiBVc2UgaWZjb25maWcgaW5zdGVhZCBvZgorCWFycF9zZXJ2ZXJfb3ZlcnJpZGUuCisJKiBuZXRib290L21haW4uYyAoYXJwX3NlcnZlcl9vdmVycmlkZSk6IFJlbW92ZWQuCisJKiBuZXRib290L2V0aGVyYm9vdC5oIChhcnBfc2VydmVyX292ZXJyaWRlKTogTGlrZXdpc2UuCisKKzIwMDEtMDEtMTEgIEV1Z2VuZSBEb3VkaW5lICA8ZHVkaW5AbnAubmsubm9ybmlrLnJ1PgorCQorCSogc3RhZ2UyL2J1aWx0aW5zLmMgW1NVUFBPUlRfTkVUQk9PVF0gKGlmY29uZmlnX2Z1bmMpOiBOZXcKKwlmdW5jdGlvbiB0byBjb25maWd1cmUgbmV0d29yayBpbnRlcmZhY2UgZnJvbSBjb21tYW5kIGxpbmUuCisJW1NVUFBPUlRfTkVUQk9PVF0gKGJ1aWx0aW5faWZjb25maWcpOiBOZXcgdmFyaWFibGUuCisJW1NVUFBPUlRfTkVUQk9PVF0gKGJ1aWx0aW5fdGFibGUpOiBBZGRlZCBhIHBvaW50ZXIgdG8KKwlCVUlMVElOX0lGQ09ORklHLgorCSogbmV0Ym9vdC9tYWluLmMgKGlmY29uZmlnKTogTmV3IGZ1bmN0aW9uLgorCSogbmV0Ym9vdC9ldGhlcmJvb3QuaCAoaWZjb25maWcpOiBBZGRlZCB0aGUgcHJvdG90eXBlLgorCQorMjAwMS0wMS0xMSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogZG9jcy9NYWtlZmlsZS5hbSBbQlVJTERfRVhBTVBMRV9LRVJORUxdIChub2luc3RfREFUQSk6IE5ldworCXZhcmlhYmxlLgorCVtCVUlMRF9FWEFNUExFX0tFUk5FTF0gKG5vaW5zdF9QUk9HUkFNUyk6IExpa2V3aXNlLgorCVtCVUlMRF9FWEFNUExFX0tFUk5FTF0gKGtlcm5lbF9leGVjX1NPVVJDRVMpOiBMaWtld2lzZS4KKwlbQlVJTERfRVhBTVBMRV9LRVJORUxdIChrZXJuZWxfZXhlY19DRkxBR1MpOiBMaWtld2lzZS4KKwlbQlVJTERfRVhBTVBMRV9LRVJORUxdIChrZXJuZWxfZXhlY19MREZMQUdTKTogTGlrZXdpc2UuCisJW0JVSUxEX0VYQU1QTEVfS0VSTkVMXSAoa2VybmVsKTogTmV3IHRhcmdldC4KKwkqIGNvbmZpZ3VyZS5pbiAoLS1lbmFibGUtZXhhbXBsZS1rZXJuZWwpOiBOZXcgb3B0aW9uLgorCisJKiBkb2NzL2tlcm5lbC5jIChjbWFpbik6IENhc3QgdW5zaWduZWQgbG9uZyB2YXJpYWJsZXMgdG8KKwl1bnNpZ25lZCBleHBsaWNpdGx5LCB0byBzdXBwcmVzcyBHQ0Mgd2FybmluZ3MuCisJCisyMDAxLTAxLTA4ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvc2hhcmVkLmggKEJPT1RTRUNfQlBCX0hJRERFTl9TRUNUT1JTKTogTmV3IG1hY3JvLgorCQorCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGNoYWlubG9hZGVyX2Z1bmMpOiBJZiBDVVJSRU5UX1BBUlRJVElPTiBpcworCUZBVCwgc2V0IHRoZSBoaWRkZW4gc2VjdG9ycyBmaWVsZCBvZiB0aGUgQlBCIHRvIFBBUlRfU1RBUlQsIHRvCisJYXZvaWQgYSBXaW5kb3dzIGJ1ZyB3aGljaCBhZmZlY3RzIG9ubHkgd2hlbiBXaW5kb3dzIGlzIGJvb3RlZAorCWZyb20gYSBsb2dpY2FsIHBhcnRpdGlvbi4gQW5kLCBjbGVhciBFUlJOVU0gYWZ0ZXIgdGVzdGluZyBpZiBhCisJcGFydGl0aW9uIGlzIEZBVCwgYmVjYXVzZSBvcGVuX3BhcnRpdGlvbiBvciBmYXRfbW91bnQgbWF5IHNldAorCUVSUk5VTS4gUmVwb3J0ZWQgYnkgSW5nbyBLb3JiIDxpbmdvQGFrYW5hLmRlPi4KKwkKKzIwMDEtMDEtMDcgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChib290X2Z1bmMpOiBJbiB0aGUgY2hhaW4tbG9hZGluZyBtb2RlLAorCWNsZWFyIHRoZSBhY3RpdmUgZmxhZyBvZiBlYWNoIG9mIHRoZSBsb2FkZWQgcGFydGl0aW9uIGVudHJpZXMsCisJYW5kIHRoZW4gc2V0IHRoZSBhY3RpdmUgZmxhZyBvZiB0aGUgYm9vdGVkIHBhcnRpdGlvbiBpbWFnZS4KKwkKKzIwMDEtMDEtMDQgIEpvY2hlbiBIb2VuaWNrZSAgPGpvY2hlbkBnbnUub3JnPgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoZW1iZWRfZnVuYyk6IENhbGwgb3Blbl9wYXJ0aXRpb24oKSBldmVuIGZvcgorIAlNQlIsIHNvIHRoYXQgcGFydF9zdGFydCBpcyBjb3JyZWN0LiAgVGhpcyBmaXhlcyBhIGJ1ZyByZXBvcnRlZCBieQorIAlNYXR0aGlhcyBHcmFuYmVycnkgPG1hdHRoaWFzQHNsdXJwZWUub3JnPi4KKwkKKzIwMDAtMTItMjIgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9kaXNrX2lvLmMgKG1ha2Vfc2F2ZWRfYWN0aXZlKTogQ2hhbmdlIHRoZSB2YXJpYWJsZSBuYW1lCisJYGBNQlInJyB0byBsb3dlciBjYXNlLgorCShzZXRfcGFydGl0aW9uX2hpZGRlbl9mbGFnKTogTGlrZXdpc2UuCisJCisyMDAwLTEyLTIwICBKb2NoZW4gSG9lbmlja2UgIDxqb2NoZW5AZ251Lm9yZz4KKworCUZyb20gQ2VkcmljIFdhcmUgPHdhcmVAY29tLmVuc3QuZnI+OgorCSogc3RhZ2UyL2ZzeXNfZXh0Mi5jIChleHQyZnNfbW91bnQpOiBEZXRlY3QgZXh0MiBwYXJ0aXRpb25zIGluCisJYSBPcGVuQlNEL05ldEJTRCBGU19FWFQyRlMgc2xpY2UuCisJKiBzdGFnZTIvcGNfc2xpY2UuaCAoRlNfQURPUyk6IE5ldyBNYWNybyBmcm9tIE9wZW5CU0QvTmV0QlNELgorCShGU19IRlMpOiBMaWtld2lzZS4KKwkoRlNfRklMRUNPUkUpOiBMaWtld2lzZS4KKwkoRlNfRVhUMkZTKTogTGlrZXdpc2UuCisJCisyMDAwLTEyLTE3ICBKb2NoZW4gSG9lbmlja2UgIDxqb2NoZW5AZ251Lm9yZz4KKworCSogc3RhZ2UyL2Rpc2tfaW8uYyAocmF3cmVhZCk6IENoZWNrIGlmIHRoZXJlIGlzIGEgRVpEIHBhcnRpdGlvbgorCWFuZCByZW1hcCBzZWN0b3IgMCB0byBzZWN0b3IgMSBsaWtlIEVaLUJJT1MgZG9lcy4KKwkocmF3d3JpdGUpOiBOZXcgZnVuY3Rpb24gdG8gd3JpdGUgdG8gZGlzay4gIEFsc28gZG9lcyBFWkQKKwlyZW1hcHBpbmcuCisJKGRldndyaXRlKTogTmV3IGZ1bmN0aW9uLiAgRG9lcyB0aGUgc3BlY2lhbCByZW1hcHBpbmcgdG8KKwlwYXJ0aXRpb25zIG5lZWRlZCBmb3IgbGludXguICBUaGlzIGNvbnRhaW5zIHRoZSBjb2RlIHRoYXQgd2FzCisJcHJldmlvdXNseSBkdXBsaWNhdGVkIGluIGVtYmVkX2Z1bmMgYW5kIGluc3RhbGxfZnVuYyBhdCBzZXZlcmFsCisJcGxhY2VzLgorCShtYWtlX3NhdmVkX2FjdGl2ZSk6IFVzZSByYXd3cml0ZS4gRG9uJ3QgdXNlIFNDUkFUQ0hTRUcsIGFzIGl0IGlzCisJbmVlZGVkIGJ5IGRldndyaXRlLgorCShzZXRfcGFydGl0aW9uX2hpZGRlbl9mbGFnKTogTGlrZXdpc2UuCQorCSogc3RhZ2UyL2Rpc2tfaW8uaCAocmF3d3JpdGUpOiBOZXcgZnVuY3Rpb24uCisJKGRldndyaXRlKTogTGlrZXdpc2UuCisJKiBzdGFnZTIvcGNfc2xpY2UuaCAoUENfU0xJQ0VfVFlQRV9FWkQpOiBOZXcgbWFjcm8uCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoZW1iZWRfaW5mbyk6IE5ldyB2YXJpYWJsZSB0byBzdG9yZSB0aGUKKwlwb3NpdGlvbiBvZiB0aGUgZW1iZWRkZWQgc3RhZ2UxXzUgZm9yIHNldHVwX2Z1bmMuCisJKGVtYmVkX2Z1bmMpOiBEb24ndCBlbWJlZCBhZnRlciB0aGUgTUJSIGlmIGFuIEVaLUJJT1MgaXMgZGV0ZWN0ZWQKKwl0aGVyZS4gIFVzZSB0aGUgbmV3IGRldndyaXRlIG1ldGhvZC4gIElmIGVtYmVkZGluZyBpcyBzdWNjZXNzZnVsCisJc3RvcmUgcG9zaXRpb24gaW4gZW1iZWRfaW5mby4KKwkoaW5zdGFsbF9mdW5jKTogVXNlIGRldndyaXRlLiAgRG9uJ3QgdXNlIFNDUkFUQ0hTRUcuCisJKHBhcnRuZXdfZnVuYyk6IFVzZSByYXd3cml0ZS4gIERvbid0IHVzZSBTQ1JBVENIU0VHLgorCShwYXJ0dHlwZV9mdW5jKTogTGlrZXdpc2UuCisJKHNhdmVkZWZhdWx0X2Z1bmMpOiBMaWtld2lzZS4KKwkoc2V0dXBfZnVuYyk6IE5ldyBuZXN0ZWQgZnVuY3Rpb24gZW1iZWRfc3RhZ2UxXzUuICBTdGFnZTFfNSBpcyBub3cKKwlhbHNvIGJlIGVtYmVkZGVkIGludG8gZmlsZXN5c3RlbXMgd2hpY2ggc3VwcG9ydHMgdGhhdC4KKwkKKzIwMDAtMTItMTcgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChjaGFpbmxvYWRlcl9mdW5jKTogU2V0IEVSUk5VTSB0bworCUVSUl9FWEVDX0ZPUk1BVCwgd2hlbiBFUlJOVU0gaXMgRVJSX05PTkUsIGV2ZW4gaWYgZ3J1Yl9yZWFkCisJZmFpbHMgaW4gcmVhZGluZyBvbmUgc2VjdG9yLgorCQorMjAwMC0xMi0xNCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogZG9jcy9wcm9nLXJlZi50ZXhpIChQYXJ0aXRpb24gdHlwZXMpOiBSZXdyaXRlIHRoZSBmb290bm90ZXMuCisJU3VnZ2VzdGVkIGJ5IFJhbGYuTWVkb3dAdC1vbmxpbmUuZGUgKFJhbGYgTWVkb3cpLgorCQorMjAwMC0xMi0xNCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCUZyb20gRXJpayBTY2hvZW5mZWxkZXIgPHNjaG9lbmZyQGdhZXJ0bmVyLmRlPjoKKwkqIHV0aWwvZ3J1Yi1pbnN0YWxsLmluIChjb252ZXJ0KTogUmV2aXNlZCB0aGUgZml4IGZvciBmbG9wcHkKKwlkZXZpY2UgaGFuZGxpbmcuCisJCisyMDAwLTEyLTE0ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJRnJvbSBIT1JJS0FXQSBLYXp1bm9yaSA8a2F6LWhvcmlAdGtkLmF0dC5uZS5qcD46CisJKiBzdGFnZTIvYmlvcy5jIChnZXRfZGlza2luZm8pOiBBcHBlbmQgMTYgYnl0ZXMgZHVtbXkgZGF0YSB0bworCURSUCwgYmVjYXVzZSB0aGUgQklPUyBvZiBUaGlua3BhZCBYMjAgd3JpdGUgYSBnYXJiYWdlIGJleW9uZCB0aGUKKwlzaXplIG9mIHRoZSBzdHJ1Y3R1cmUuCisJCisyMDAwLTEyLTA5ICBKb2NoZW4gSG9lbmlja2UgIDxqb2NoZW5AZ251Lm9yZz4KKworCSogc3RhZ2UyL2Rpc2tfaW8uYyAobmV4dF9wYXJ0aXRpb24pOiBNYXNrIG91dCBic2QgcGFydGl0aW9uIHN1YgorCXR5cGUgd2hlbiBjaGVja2luZyBpZiBsYXN0IHBhcnRpdGlvbiB3YXMgYSBic2QgcGFydGl0aW9uLgorCVJlcG9ydGVkIGJ5IEhlaWtraSBWYXRpYWluZW4gPGhlc3N1QGNzLnR1dC5maT4uCisJCisyMDAwLTEyLTA5ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJRnJvbSBMZWVuZGVydCBNZXllciA8bGVlbi5tZXllckBob21lLm5sPjoKKwkqIHV0aWwvZ3J1Yi1pbnN0YWxsLmluIChjb252ZXJ0KTogSWYgYSBmbG9wcHkgZGV2aWNlIGlzCisJc3BlY2lmaWVkLCByZW1vdmUgZXZlcnl0aGluZyBmcm9tICR0bXBfcGFydC4KKwkKKzIwMDAtMTItMDkgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIGxpYi9kZXZpY2UuYyBbX19saW51eF9fXSAod3JpdGVfdG9fcGFydGl0aW9uKTogVXNlIHN0cmNweQorCWluc3RlYWQgb2Ygc3RyY2F0LCB0byBvdmVyd3JpdGUgIi9kaXNjIi4gUmVwb3J0ZWQgYnkgVGhpYWdvCisJTWFjaWVpcmEgPHRoaWFnb21AbWFpbC5jb20+LgorCQorMjAwMC0xMi0wNSAgSm9jaGVuIEhvZW5pY2tlICA8am9jaGVuQGdudS5vcmc+CisKKwkqIHN0YWdlMi9mc3lzX21pbml4LmMgKG1pbml4X21vdW50KTogQ29ycmVjdGVkIHRoZSBjaGVjayBmb3IKKwlJU19QQ19TTElDRV9UWVBFX01JTklYOyBtaW5peCB3YXMgb25seSB3b3JraW5nIGlmIHNsaWNlIHR5cGUgd2FzCisJd3JvbmchIFJlcG9ydGVkIGJ5IFJhbGYgTWVkb3cgPHJhbGYubWVkb3dAdC1vbmxpbmUuZGU+LgorCQorMjAwMC0xMS0yNyAgSm9jaGVuIEhvZW5pY2tlICA8am9jaGVuQGdudS5vcmc+CisKKwkqIHN0YWdlMi9mc3lzX3JlaXNlcmZzLmM6IEhhbmRsZSBpdGVtcyB3aXRoIG9sZCB2ZXJzaW9uIGtleSBvbgorCW5ldyB2ZXJzaW9uIHJlaXNlcmZzIHBhcnRpdGlvbi4KKwkoS19PRkZTRVQpOiBSZW1vdmVkLgorCShJSF9LRVlfT0ZGU0VUKTogTmV3IE1hY3JvLCB3aGljaCBjaGVja3MgaXRlbSBoZWFkIHZlcnNpb24uCisJKElIX0tFWV9JU09GRlNFVCk6IExpa2V3aXNlLgorCShyZWlzZXJmc19yZWFkKTogVXNlIG5ldyBtYWNyb3MuCisJKHJlaXNlcmZzX2Rpcik6IEZpeGVkIHZlcnNpb24gY2hlY2sgZm9yID40R0Igc3RhdCBlbnRyaWVzLgorCQorMjAwMC0xMS0yNyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UyL2NvbW1vbi5jIChpbml0X2Jpb3NfaW5mbykgWyFTVEFHRTFfNV06IERvbid0IGNhbGwKKwl0cmFja19pbnQxMywgYmVjYXVzZSB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBoYW5ncyB1cCBpbiBzb21lCisJZW52aXJvbm1lbnRzLgorCQorMjAwMC0xMS0yNyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogZ3J1Yi9hc21zdHViLmMgKHNlcmlhbF9pbml0KSBbIU9fU1lOQ106IERvbid0IHNwZWNpZnkgT19TWU5DCisJdG8gb3BlbiBTRVJJQUxfREVWSUNFLgorCShzZXJpYWxfaW5pdCkgW09fRlNZTkNdOiBTcGVjaWZ5IE9fRlNZTkMgdG8gb3BlbiBTRVJJQUxfREVWSUNFLgorCVJlcG9ydGVkIGJ5IEZhcmlkIEhhamppIDxmYXJpZC5oYWpqaUBvYi5rYW1wLm5ldD4uCisJCisyMDAwLTExLTIyICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJRnJvbSBWZXNhIEphYXNrZWxhaW5lbiA8amFhc2tlbGFAdGlldG9teXJza3kuZmk+OgorCSogc3RhZ2UyL2J1aWx0aW5zLmMgKHRlc3R2YmVfZnVuYyk6IERvbid0IHNldCB0aGUgYml0IDE0IG9mIGEKKwlWQkUgbW9kZSBudW1iZXIgZXhwbGljaXRseSB3aGVuIGNhbGxpbmcgZ2V0X3ZiZV9tb2RlX2luZm8uCisJKHZiZXByb2JlX2Z1bmMpOiBMaWtld2lzZS4KKwkKKzIwMDAtMTEtMjIgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwlUaGUgY29kZSBmb3IgdGhlICJJTlQgMTNIIHRyYWNraW5nIHRlY2huaXF1ZSIgaXMgc29tZXdoYXQKKwlzaW1wbGlmaWVkLgorCisJKiBzdGFnZTIvYXNtLlMgWyFTVEFHRTFfNV0gKHRyYWNrX2ludDEzKTogRG9uJ3QgcmVwbGFjZSBhbiBpbnQxMworCWhhbmRsZXIgd2l0aCBzZXRfdGZfaW50MTNfaGFuZGxlci4gSW5zdGVhZCwgdHJhY2tfaW50MTMgaXRzZWxmCisJZW11bGF0ZXMgYW4gaW50MTMgaW50ZXJydXB0LgorCVshU1RBR0UxXzVdIChzZXRfdGZfaW50MTNfaGFuZGxlcik6IFJlbW92ZWQuCisJWyFTVEFHRTFfNV0gKGludDFfaGFuZGxlcik6IFVzZSBtb3Z6YncgaW5zdGVhZCBvZiB4b3JiIGFuZCBtb3ZiLgorCQorMjAwMC0xMS0xNSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogYWNjb25maWcuaCAoUFJFU0VUX01FTlVfU1RSSU5HKTogTmV3IGVudHJ5LgorCSogYWNpbmNsdWRlLm00IChncnViX0RFRklORV9GSUxFKTogTmV3IE00IG1hY3JvLgorCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1wcmVzZXQtbWVudSk6IE5ldyBvcHRpb24uCisJKiBzdGFnZTIvc3RhZ2UyLmMgW1BSRVNFVF9NRU5VX1NUUklOR10gKHByZXNldF9tZW51KTogTmV3CisJdmFyaWFibGUuCisJW1BSRVNFVF9NRU5VX1NUUklOR10gKHByZXNldF9tZW51X29mZnNldCk6IExpa2V3aXNlLgorCVtQUkVTRVRfTUVOVV9TVFJJTkddIChvcGVuX3ByZXNldF9tZW51KTogTmV3IGZ1bmN0aW9uLgorCVtQUkVTRVRfTUVOVV9TVFJJTkddIChyZWFkX2Zyb21fcHJlc2V0X21lbnUpOiBMaWtld2lzZS4KKwlbUFJFU0VUX01FTlVfU1RSSU5HXSAoY2xvc2VfcHJlc2V0X21lbnUpOiBMaWtld2lzZS4KKwlbIVBSRVNFVF9NRU5VX1NUUklOR10gKG9wZW5fcHJlc2V0X21lbnUpOiBOZXcgbWFjcm8uCisJWyFQUkVTRVRfTUVOVV9TVFJJTkddIChyZWFkX2Zyb21fcHJlc2V0X21lbnUpOiBMaWtld2lzZS4KKwlbIVBSRVNFVF9NRU5VX1NUUklOR10gKGNsb3NlX3ByZXNldF9tZW51KTogTGlrZXdpc2UuCisJKGdldF9saW5lX2Zyb21fY29uZmlnKTogQWNjZXB0IGEgbmV3IGFyZ3VtZW50IFJFQURfRlJPTV9GSUxFLgorCUlmIGl0IGlzIGZhbHNlLCByZWFkIGRhdGEgZnJvbSB0aGUgcHJlc2V0IG1lbnUgaW5zdGVhZC4KKwkoY21haW4pOiBJZiBncnViX29wZW4gZmFpbHMgaW4gb3BlbmluZyB0aGUgY29uZmlndXJhdGlvbiBmaWxlLAorCXRoZW4gdHJ5IHRvIG9wZW4gdGhlIHByZXNldCBtZW51LgorCQorMjAwMC0xMS0xMSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCUZyb20gSmFuIEZyaWNrZSA8ZnJpY2tlQHVuaS1ncmVpZnN3YWxkLmRlPjoKKwkqIHN0YWdlMi9hc20uUyBbIVNUQUdFMV81XSAoc2V0X3ZiZV9tb2RlKTogQWRkIGEgbWlzc2luZyBgJCcKKwlwcmVmaXguCisJCisyMDAwLTExLTExICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvYmlvcy5jIChnZXRfZGlza2luZm8pOiBJZiBCSU9TIHN1cHBvcnRzIExCQSBidXQgZG9lc24ndAorCXJldHVybiB0aGUgY29ycmVjdCB0b3RhbCBudW1iZXIgb2Ygc2VjdG9ycywgY29tcHV0ZSB0aGlzIGJ5CisJQy9IL1MgcmV0dXJuZWQgYnkgZ2V0X2Rpc2tpbmZvX2ludDEzX2V4dGVuc2lvbnMgaW5zdGVhZCBvZgorCWdldF9kaXNraW5mb19zdGFuZGFyZC4KKwkKKzIwMDAtMTEtMDkgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9kaXNrX2lvLmMgKG1ha2Vfc2F2ZWRfYWN0aXZlKTogU2V0IEVSUk5VTSB0bworCUVSUl9ERVZfVkFMVUVTIGluc3RlYWQgb2YgRVJSX05PX1BBUlQsIHdoZW4gdGhlIHNhdmUgcGFydGl0aW9uCisJaXMgbm90IGEgcHJpbWFyeSBwYXJ0aXRpb24uCisJCisyMDAwLTExLTA1ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBkb2NzL3VzZXItcmVmLnRleGkgKEZlYXR1cmVzKTogVXBkYXRlIHRoZSBVUkwgb2YgZ3J1Yi85OC4KKwkKKzIwMDAtMTEtMDMgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwlWQkUgc3VwcG9ydCBpcyBfcGFydGlhbGx5XyBpbXBsZW1lbnRlZC4KKwkKKwkqIHN0YWdlMi9tYl9oZWFkZXIuaCAobXVsdGlib290X2hlYWRlcik6IEFkZGVkIG5ldyBmaWVsZHMsCisJbW9kZV90eXBlLCB3aWR0aCwgaGVpZ2h0LCBhbmQgZGVwdGguCisJKE1VTFRJQk9PVF9GT1VORCk6IENoZWNrIGlmIE1VTFRJQk9PVF9WSURFT19NT0RFIGlzIHNldCwgYW5kCisJY2hlY2sgaWYgTEVOIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA0OCwgaWYgc2V0LgorCShNVUxUSUJPT1RfVU5TVVBQT1JURUQpOiBTZXQgdG8gMHgwMDAwRkZGOC4KKwkoTVVMVElCT09UX1ZJREVPX01PREUpOiBOZXcgbWFjcm8uCisJKiBzdGFnZTIvbWJfaW5mby5oIChtdWx0aWJvb3RfaW5mbyk6IEFkZGVkIG5ldyBmaWVsZHMsCisJdmJlX2NvbnRyb2xfaW5mbywgdmJlX21vZGVfaW5mbywgdmJlX21vZGUsIHZiZV9pbnRlcmZhY2Vfc2VnLAorCXZiZV9pbnRlcmZhY2Vfb2ZmLCBhbmQgdmJlX2ludGVyZmFjZV9sZW4uCisJKE1CX0lORk9fVklERU9fSU5GTyk6IE5ldyBtYWNyby4KKwkKKwkqIHN0YWdlMi9zaGFyZWQuaCAodmJlX2NvbnRyb2xsZXIpOiBOZXcgc3RydWN0dXJlLgorCSh2YmVfbW9kZSk6IExpa2V3aXNlLgorCShnZXRfdmJlX2NvbnRyb2xsZXJfaW5mbyk6IERlY2xhcmVkLgorCShnZXRfdmJlX21vZGVfaW5mbyk6IExpa2V3aXNlLgorCShzZXRfdmJlX21vZGUpOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9hc20uUyBbIVNUQUdFMV81XSAoZ2V0X3ZiZV9jb250cm9sbGVyX2luZm8pOiBOZXcKKwlmdW5jdGlvbi4KKwlbIVNUQUdFMV81XSAoZ2V0X3ZiZV9tb2RlX2luZm8pOiBMaWtld2lzZS4KKwlbIVNUQUdFMV81XSAoc2V0X3ZiZV9tb2RlKTogTGlrZXdpc2UuCisJKiBncnViL2FzbXN0dWIuYyAoZ2V0X3ZiZV9jb250cm9sbGVyX2luZm8pOiBMaWtld2lzZS4KKwkoZ2V0X3ZiZV9tb2RlX2luZm8pOiBMaWtld2lzZS4KKwkoc2V0X3ZiZV9tb2RlKTogTGlrZXdpc2UuCisKKwkqIHN0YWdlMi9idWlsdGlucy5jICh0ZXN0dmJlX2Z1bmMpOiBOZXcgZnVuY3Rpb24uCisJKGJ1aWx0aW5fdGVzdHZiZSk6IE5ldyB2YXJpYWJsZS4KKwkodmJlcHJvYmVfZnVuYyk6IE5ldyBmdW5jdGlvbi4KKwkoYnVpbHRpbl92YmVwcm9iZSk6IE5ldyB2YXJpYWJsZS4KKwkoYnVpbHRpbl90YWJsZSk6IEFkZGVkIHBvaW50ZXJzIHRvIEJVSUxUSU5fVEVTVFZCRSBhbmQKKwlCVUlMVElOX1ZCRVBST0JFLgorCQorMjAwMC0xMS0wMSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogZG9jcy9oZWxwMm1hbjogQ29waWVkIGZyb20gaGVscDJtYW4tMS4yMy4KKwkKKzIwMDAtMTAtMjkgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9hc20uUyBbU1RBR0UxXzVdOiBEb24ndCBpbmNsdWRlIHNldGptcC5TIG9yIGFwbS5TLgorCQorMjAwMC0xMC0yNyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogbGliL2RldmljZS5jIChyZWFkX2RldmljZV9tYXApOiBEb24ndCBwYXJzZSBhIGxpbmUsIGlmIGl0IGlzCisJZW1wdHkuIFJlcG9ydGVkIGJ5IEhvbGdlciBCYXVlciA8YmF1ZXJAaXRzbS51bmktc3R1dHRnYXJ0LmRlPi4KKwkKKzIwMDAtMTAtMjUgIEpvY2hlbiBIb2VuaWNrZSAgPGpvY2hlbkBnbnUub3JnPgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAobWQ1Y3J5cHRfZnVuYyk6IFVzZSBhbGwgYml0cyBvZiBjdXJydGlja3MgKCkKKwl0byBnZW5lcmF0ZSB0aGUgc2FsdC4gIFRoZSBvbGQgY29kZSB3b3VsZCBvZnRlbiBwcm9kdWNlIHRoZSBzYW1lCisJb25lIGNoYXJhY3RlciBzYWx0LgorCisyMDAwLTEwLTI1ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvYXBtLlMgKGdldF9hcG1faW5mbyk6IEZpeCBhIHNlcmlvdXMgdHlwbzogcHJvdF90b19yZWFsCisJLT4gcmVhbF90b19wcm90LiBVbW0sIEkgY2FuJ3QgdW5kZXJzdGFuZCB3aHkgaXQgd29ya2VkIGZvciBtZSEKKwkKKzIwMDAtMTAtMjQgIEpvY2hlbiBIb2VuaWNrZSAgPGpvY2hlbkBnbnUub3JnPgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoc2V0dXBfZnVuYyk6IFdoZW4gaW52b2tpbmcgaW5zdGFsbCB3aXRoIGFuCisgCWVtYmVkZGVkIHN0YWdlMV81IGdpdmUgdGhlIHBhdGggdG8gbWVudS5sc3QgYXMgcmVhbF9jb25maWdfZmlsZS4KKworMjAwMC0xMC0yMyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogZG9jcy9tdWx0aWJvb3QudGV4aTogVXBncmFkZWQgdG8gMC42LjkyLgorCShCb290IGluZm9ybWF0aW9uIGZvcm1hdCk6IFJlLWRlc2lnbmVkIHRoZSBncmFwaGljcyB0YWJsZS4KKwkKKzIwMDAtMTAtMjIgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIGRvY3MvdHV0b3JpYWwudGV4aTogTWlzY2VsbGFuZW91cyB1cGRhdGVzLgorCSogZG9jcy91c2VyLXJlZi50ZXhpOiBMaWtld2lzZS4KKwkqIGRvY3MvYXBwZW5kaWNlcy50ZXhpOiBMaWtld2lzZS4KKwkKKzIwMDAtMTAtMjIgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHV0aWwvZ3J1Yi1pbnN0YWxsLmluICh1c2FnZSk6IFJlbW92ZWQgdW5uZWNlc3NhcnkgY29tbWFzLgorCQorCSogdXRpbC9ncnViLW1kNS1jcnlwdC5pbjogTmV3IGZpbGUuCisJKiB1dGlsL01ha2VmaWxlLmFtIChzYmluX1NDUklQVFMpOiBBZGRlZCBncnViLW1kNS1jcnlwdC4KKwkqIGNvbmZpZ3VyZS5pbiAoQUNfT1VUUFVUKTogQWRkZWQgdXRpbC9ncnViLW1kNS1jcnlwdC4KKwkqIGRvY3MvTWFrZWZpbGUuYW0gKG1hbl9NQU5TKTogQWRkZWQgZ3J1Yi1tZDUtY3J5cHQuOC4KKwlbTUFJTlRBSU5FUl9NT0RFXSAoJChzcmNkaXIpL2dydWItbWQ1LWNyeXB0LjgpOiBOZXcgdGFyZ2V0LgorCSogZG9jcy9ncnViLW1kNS1jcnlwdC44OiBOZXcgZmlsZS4gR2VuZXJhdGVkIGJ5IGhlbHAybWFuLgorCisJKiBkb2NzL2dydWIudGV4aSAoZ3J1Yi1tZDUtY3J5cHQpOiBOZXcgZGlyZW50cnkuCisJKEludm9raW5nIGdydWItbWQ1LWNyeXB0KTogTmV3IGVudHJ5LgorCSogZG9jcy91c2VyLXJlZi50ZXhpIChJbnZva2luZyBncnViLW1kNS1jcnlwdCk6IE5ldyBjaGFwdGVyLgorCQorMjAwMC0xMC0yMiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCUZyb20gTWF0dGhpYXMgR3JhbmJlcnJ5IDxtYXR0aGlhc0BzbHVycGVlLm9yZz46CisJKiB1dGlsL2dydWItaW5zdGFsbC5pbiAoY29udmVydCk6IEFkZGVkIGJhY2tzbGFzaGVzIGludG8KKwljb250aW51b3VzIGxpbmVzLgorCQorMjAwMC0xMC0yMSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UyL21kNS5jIChjaGVja19tZDVfcGFzc3dvcmQpOiBSZW1vdmVkLgorCShtZDVfcGFzc3dvcmQpOiBOZXcgZnVuY3Rpb24uIE1vc3RseSBjb3BpZWQgZnJvbQorCWNoZWNrX21kNV9wYXNzd29yZC4KKwkobWQ1X2luaXQpOiBNYWRlIHN0YXRpYy4KKwkobWQ1X3VwZGF0ZSk6IExpa2V3aXNlLgorCShtZDVfZmluYWwpOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9tZDUuaCAoY2hlY2tfbWQ1X3Bhc3N3b3JkKTogQ2hhbmdlZCB0byBqdXN0IGEgbWFjcm8uCisJKG1kNV9wYXNzd29yZCk6IERlY2xhcmVkLgorCShtYWtlX21kNV9wYXNzd29yZCk6IE5ldyBtYWNyby4KKwkqIHN0YWdlMi9jaGFyX2lvLmMgWyFTVEFHRTFfNV0gKGdydWJfc3Ryc3RyKTogUmV3cml0ZW4sIGJlY2F1c2UKKwlpdCB3YXMgdG9vIGJ1Z2d5LgorCSogc3RhZ2UyL2J1aWx0aW5zLmMgW1VTRV9NRDVfUEFTU1dPUkRTXSAobWQ1Y3J5cHRfZnVuYyk6IE5ldworCWZ1bmN0aW9uLgorCVtVU0VfTUQ1X1BBU1NXT1JEU10gKGJ1aWx0aW5fbWQ1Y3J5cHQpOiBOZXcgdmFyaWFibGUuCisJKGJ1aWx0aW5fdGFibGUpIFtVU0VfTUQ1X1BBU1NXT1JEU106IEFkZGVkIGEgcG9pbnRlciB0bworCUJVSUxUSU5fTUQ1Q1JZUFQuCisJKiBkb2NzL3R1dG9yaWFsLnRleGkgKFNlY3VyaXR5KTogQWRkZWQgYSBwYXJhZ3JhcGggYWJvdXQKKwltZDVjcnlwdC4KKwkKKzIwMDAtMTAtMjEgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIGRvY3MvdXNlci1yZWYudGV4aTogRml4ZWQgc2V2ZXJhbCB0eXBvcyBhbmQgc29tZSBpbmFwcHJvcHJpYXRlCisJdGV4aW5mbyBjb21tYW5kcywgYW5kIHVwZGF0ZSB0aGUgZGVzY3JpcHRpb25zIGFib3V0IHNvbWUKKwljb21tYW5kcy4KKwkKKzIwMDAtMTAtMjAgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChkaXNwbGF5YXBtX2Z1bmMpOiBOZXcgZnVuY3Rpb24uCisJKGJ1aWx0aW5fZGlzcGxheWFwbSk6IE5ldyB2YXJpYWJsZS4KKwkoYnVpbHRpbl90YWJsZSk6IEFkZGVkIGEgcG9pbnRlciB0byBCVUlMVElOX0RJU1BMQVlBUE0uCisJCisyMDAwLTEwLTIwICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJQVBNIEJJT1MgdGFibGUgc3VwcG9ydCBpcyBhZGRlZCwgYmFzZWQgb24gYSBwYXRjaCBieSBNYXR0IFlvdXJzdAorCTx5b3Vyc3RAbWl0LmVkdT4uCisJCisJKiBkb2NzL211bHRpYm9vdC50ZXhpIChCb290IGluZm9ybWF0aW9uIGZvcm1hdCk6IEFkZGVkIHRoZQorCWRlZmluaXRpb24gb2YgQVBNIHRhYmxlIGZvcm1hdC4KKwkKKwkqIHN0YWdlMi9tYl9pbmZvLmggKGFwbV9pbmZvKTogTmV3IHN0cnVjdHVyZS4KKwkobXVsdGlib290X2luZm8pOiBBZGRlZCBhIG5ldyBlbGVtZW50LCBhcG1fdGFibGUuCisJKE1CX0lORk9fQVBNX1RBQkxFKTogTmV3IG1hY3JvLgorCSogc3RhZ2UyL2FzbS5TIChhcG1fYmlvc19pbmZvKTogTmV3IHZhcmlhYmxlLgorCUluY2x1ZGUgImFwbS5TIi4KKwkqIHN0YWdlMi9hcG0uUzogTmV3IGZpbGUuCisJKiBzdGFnZTIvY29tbW9uLmMgKGluaXRfYmlvc19pbmZvKSBbIVNUQUdFMV81XTogQWRkZWQgQVBNIEJJT1MKKwl0YWJsZSBzdXBwb3J0LgorCSogc3RhZ2UyL3NoYXJlZC5oIChhcG1fYmlvc19pbmZvKTogRGVjbGFyZWQuCisJKGdldF9hcG1faW5mbyk6IExpa2V3aXNlLgorCSogc3RhZ2UyL01ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogQWRkZWQgYXBtLlMuCisJKiBncnViL2FzbXN0dWIuYyAoYXBtX2Jpb3NfaW5mbyk6IE5ldyB2YXJpYWJsZS4KKwkoZ2V0X2FwbV9pbmZvKTogTmV3IGZ1bmN0aW9uLgorCQorMjAwMC0xMC0xOSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCVNlZ3JlZ2F0ZSBmdW5jdGlvbnMgd2hpY2ggYXJlIGNvcHlyaWdodGVkIGRpZmZlcmVudGx5LgorCQorCSogc3RhZ2UyL3NldGptcC5TOiBOZXcgZmlsZS4KKwkqIHN0YWdlMi9NYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEFkZGVkIHNldGptcC5TLgorCSogc3RhZ2UyL2FzbS5TOiBJbmNsdWRlICJzZXRqbXAuUyIuCisJKGdydWJfc2V0am1wKTogTW92ZWQgdG8gLi4uCisJKiBzdGFnZTIvc2V0am1wLlMgKGdydWJfc2V0am1wKTogLi4uIGhlcmUuCisJKiBzdGFnZTIvYXNtLlMgKGdydWJfbG9uZ2ptcCk6IE1vdmVkIHRvIC4uLgorCSogc3RhZ2UyL3NldGptcC5TIChncnViX2xvbmdqbXApOiAuLi4gaGVyZS4KKwkKKzIwMDAtMTAtMTggIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9NYWtlZmlsZS5hbSAobm9pbnN0X0hFQURFUlMpOiBBZGRlZCBtZDUuaC4gUmVwb3J0ZWQgYnkKKwlWb2xrZXIgQXVndXN0aW4gPFZvbGtlci5BdWd1c3RpbkBzdHVkLnVuaS1yZWdlbnNidXJnLmRlPi4KKwkKKzIwMDAtMTAtMTcgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIGNvbmZpZ3VyZS5pbiAoLS1kaXNhYmxlLW1kNXBhc3N3b3JkKTogUmVuYW1lZCB0byAuLi4KKwkoLS1kaXNhYmxlLW1kNS1wYXNzd29yZCk6IC4uLiB0aGlzLiBKdXN0IGZvciBteSBwcmVmZXJlbmNlLgorCQorMjAwMC0xMC0xNyAgSm9jaGVuIEhvZW5pY2tlICA8am9jaGVuQGdudS5vcmc+CisKKwlBZGRlZCBNRDUgcGFzc3dvcmRzIGFuZCBleHRlbmRlZCBwYXNzd29yZCBjb21tYW5kOgorCQorCSogY29uZmlndXJlLmluICgtLWRpc2FibGUtbWQ1cGFzc3dvcmQpOiBOZXcgb3B0aW9uLgorCSogc3RhZ2UyL01ha2VmaWxlLmFtIChsaWJncnViX2FfU09VUkNFUyk6IEFkZGVkIG1kNS5jLgorCShwcmVfc3RhZ2UyX2V4ZWNfU09VUkNFUyk6IExpa2V3aXNlLgorCSogc3RhZ2UyL21kNS5jOiBOZXcgZmlsZS4KKwkqIHN0YWdlMi9zaGFyZWQuaCAocGFzc3dvcmRfdCk6IE5ldyB0eXBlLgorCShwYXNzd29yZF90eXBlKTogTmV3IHZhcmlhYmxlLgorCShCVUlMVElOX0hJRERFTik6IE5ldyBmbGFnLCBkZXNjcmliaW5nIHRoYXQgYSBjb21tYW5kIHNob3VsZCBub3QKKwliZSBwcmludGVkIHdoZW4gYm9vdGluZyB0aGUgZW50cnkuCisJKGNoZWNrX3Bhc3N3b3JkKTogTmV3IGZ1bmN0aW9uLgorCSogc3RhZ2UyL2NtZGxpbmUuYyAocnVuX3NjcmlwdCk6IERvbid0IHNob3cgY29tbWFuZHMgdGhhdCBoYXZlCisJdGhlIGhpZGRlbiBhdHRyaWJ1dGUuCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAocGFzc3dvcmRfdHlwZSk6IE5ldyB2YXJpYWJsZS4KKwkoY2hlY2tfcGFzc3dvcmQpOiBOZXcgZnVuY3Rpb24uCisJKHBhc3N3b3JkX2Z1bmMpOiBIYW5kbGUgdGhlIC0tbWQ1IG9wdGlvbiBhbmQgc2V0IHBhc3N3b3JkX3R5cGUuCisJQ2hlY2sgaWYgaW4gQ01ETElORSBvciBTQ1JJUFQgbW9kZSBhbmQgYXNrIHBhc3N3b3JkIGltbWVkaWF0ZWx5LgorCShidWlsdGluX3Bhc3N3b3JkKTogQWxzbyBhbGxvdyBwYXNzd29yZHMgaW4gQ01ETElORSBtb2RlLCBtYWtlCisJaXQgaGlkZGVuLCBzbyB0aGUgdXNlciB3b250IHNlZSB0aGUgcGFzc3dvcmQgaGUgc2hvdWxkIGVudGVyLgorCUNoYW5nZWQgY29tbWFuZCBkZXNjcmlwdGlvbi4KKwkoYnVpbHRpbl9wYXVzZSk6IE1ha2UgdGhlIGNvbW1hbmQgaGlkZGVuLgorCShwYXVzZV9mdW5jKTogUHJpbnQgYXJndW1lbnQsIHNpbmNlIHRoZSBjb21tYW5kIGlzIG5vdyBoaWRkZW4uCisJKiBzdGFnZTIvc3RhZ2UyLmMgKHJ1bl9tZW51KTogQ2FsbCBjaGVja19wYXNzd29yZCB0byBjaGVjayBwYXNzd29yZC4KKwkqIGRvY3MvdHV0b3JpYWwudGV4aSAoU2VjdXJpdHkpOiBEZXNjcmliZSB0aGUgbmV3IGZlYXR1cmVzIG9mIHRoZQorCXBhc3N3b3JkIGNvbW1hbmRzLgorCSogZG9jcy91c2VyLXJlZi50ZXhpIChNZW51LXNwZWNpZmljIGNvbW1hbmRzKTogcGFzc3dvcmQgY29tbWFuZAorIAltb3ZlZCAuLi4KKwkoQ29tbWFuZC1saW5lIGFuZCBtZW51IGNvbW1hbmRzKTogLi4uIHRvIGhlcmUuICBOZXcgZmVhdHVyZXMgCisJZG91bWVudGVkLgorCQorMjAwMC0xMC0xNyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgKHNldGtleV9mdW5jKTogQ2xlYXIgdGhlIGFsbCBlbGVtZW50cyBvZgorCUJJT1NfS0VZX01BUCBhbmQgQVNDSUlfS0VZX01BUCBpbnN0ZWFkIG9mIG9ubHkgdGhlIGZpcnN0CisJZWxlbWVudHMsIHdoZW4gVE9fS0VZIGlzIE5VTEwuCisJCisyMDAwLTEwLTE2ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvYm9vdC5jIChsb2FkX2ltYWdlKTogV2hlbiBoYW5kbGluZyBMaW51eCBjbWRsaW5lLCBkb24ndAorCWNvcHkgYSBudWxsIGNoYXJhY3RlciBmcm9tIFNSQyB0byBERVNULCBiZWNhdXNlIHRoaXMgaW5zZXJ0ZWQgYW4KKwlleHRyYSBudWxsIGNoYXJhY3RlciBpbnRvIHRoZSBjbWRsaW5lLiBSZXBvcnRlZCBieSBSb2JlcnQKKwlCaWhsbWV5ZXIgPHJvYmJlQG9yY3VzLnByaXYuYXQ+LgorCQorMjAwMC0xMC0xNiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCVNvbWUgb2YgdGhlIG5ldyBNdWx0aWJvb3QgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZC4gQVBNIHN1cHBvcnQKKwlhbmQgVkVTQSBzdXBwb3J0IGFyZSBub3Qgc3RyaWN0bHkgZGVmaW5lZCBvciBpbXBsZW1lbnRlZCB5ZXQuCisJCisJKiBkb2NzL211bHRpYm9vdC50ZXhpIChUb3ApOiBJbmNyZWFzZSB0aGUgdmVyc2lvbiBudW1iZXIuCisJKEJvb3QgaW5mb3JtYXRpb24gZm9ybWF0KTogQ2hhbmdlZCB0aGUgZHJpdmUgaW5mb3JtYXRpb24gZm9ybWF0LAorCWJlY2F1c2UgaXQgd2FzIG5vdCBzdHJhaWdodGZvcndhcmQuCisJCisJKiBncnViL2FzbXN0dWIuYyAoaW9fbWFwKTogTmV3IHZhcmlhYmxlLgorCSh0cmFja19pbnQxMyk6IE5ldyBmdW5jdGlvbi4KKwkoZ2V0X3JvbV9jb25maWdfdGFibGUpOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9zdGFnZTIuYyAoY21haW4pOiBTZXQgQ09ORklHX0VOVFJJRVMgdG8gTUJJLkRSSVZFU19BRERSCisJKyBNQkkuRFJJVkVTLkxFTkdUSCBpbnN0ZWFkIG9mIE1CSS5NTUFQX0FERFIgKyBNQkkuTU1BUF9MRU5HVEguCisJKiBzdGFnZTIvY29tbW9uLmMgKGluaXRfYmlvc19pbmZvKSBbIVNUQUdFMV81XTogQWRkZWQgc3VwcG9ydAorCWZvciBkcml2ZSBpbmZvLCBST00gY29uZmlnIHRhYmxlLCBhbmQgYm9vdCBsb2FkZXIgbmFtZSBmZWF0dXJlcworCW9mIHRoZSBNdWx0aWJvb3QgU3BlY2lmaWNhdGlvbi4KKwkqIHN0YWdlMi9tYl9pbmZvLmggKGRyaXZlX2luZm8pOiBOZXcgc3RydWN0dXJlLgorCShNQl9ESV9DSFNfTU9ERSk6IE5ldyBtYWNyby4KKwkoTUJfRElfTEJBX01PREUpOiBMaWtld2lzZS4KKwkobXVsdGlib290X2luZm8pOiBBZGRlZCBkcml2ZXNfbGVuZ3RoLCBkcml2ZXNfYWRkciwKKwljb25maWdfdGFibGUsIGFuZCBib290X2xvYWRlcl9uYW1lLgorCShNQl9JTkZPX0RSSVZFX0lORk8pOiBOZXcgbWFjcm8uCisJKE1CX0lORk9fQ09ORklHX1RBQkxFKTogTGlrZXdpc2UuCisJKE1CX0lORk9fQk9PVF9MT0FERVJfTkFNRSk6IExpa2V3aXNlLgorCSogc3RhZ2UyL2FzbS5TIChnZXRfcm9tX2NvbmZpZ190YWJsZSk6IE5ldyBmdW5jdGlvbi4KKwkqIHN0YWdlMi9zaGFyZWQuaCAoZ2V0X3JvbV9jb25maWdfdGFibGUpOiBEZWNsYXJlZC4KKwkKKzIwMDAtMTAtMTYgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHV0aWwvZ3J1Yi1pbnN0YWxsLmluIChjb252ZXJ0KTogQ2hlY2sgb25seSBpZiB0aGUgZmlsZSBleGlzdHMsCisJaW5zdGVhZCBvZiBjaGVja2luZyBpZiB0aGUgZmlsZSBpcyBhIGJsb2NrIGRldmljZSBhcyB3ZWxsLgorCUJlY2F1c2UsIGluIGEgc2FuZSBvcGVyYXRpbmcgc3lzdGVtLCBpdCBzaG91bGQgYmUgYSBjaGFyIGRldmljZQorCWJ1dCBub3QgYSBibG9jayBkZXZpY2UgKHVubGlrZSBMaW51eCksIGFuZCBpdCBtYXkgYmUgYSBzeW1ib2xpYworCWxpbmsgKHRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgdXNlIExpbnV4J3MgZGV2ZnMgd2l0aG91dCBkZXZmc2QpLgorCShyZWNoZWNrKTogTmV3IHZhcmlhYmxlLiBTZXQgdG8gIm5vIiBieSBkZWZhdWx0LCBhbmQgc2V0IHRvCisJInllcyIsIGlmIHlvdSBzcGVjaWZ5IHRoZSBuZXcgb3B0aW9uIGBgLS1yZWNoZWNrJycuIElmICRyZWNoZWNrCisJaXMgInllcyIsIHJlbW92ZSB0aGUgZGV2aWNlIG1hcCBmaWxlLCBpZiBwcmVzZW50LgorCQorMjAwMC0xMC0xNiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCUZyb20gUm9kZXJpY2ggU2NodXBwOgorCSogbGliL2RldmljZS5jOiBJbmNsdWRlIDxsaW1pdHMuaD4uCisJW19fbGludXhfX10gKGhhdmVfZGV2ZnMpOiBOZXcgZnVuY3Rpb24uCisJKGdldF9mbG9wcHlfZGlza19uYW1lKSBbX19saW51eF9fXTogSWYgZGV2ZnMgaXMgc3VwcG9ydGVkLCB1c2UKKwl0aGUgbmFtZSAiL2Rldi9mbG9wcHkvTiIgaW5zdGVhZC4KKwkoaW5pdF9kZXZpY2VfbWFwKSBbX19saW51eF9fXTogSWYgZGV2ZnMgaXMgc3VwcG9ydGVkLCB1c2UKKwkiL2Rldi9kaXNjcy9kaXNjTiIgaW5zdGVhZC4KKwlbX19saW51eF9fXSAod3JpdGVfdG9fcGFydGl0aW9uKTogQ2hhbmdlIHRoZSBzaXplIG9mIERFViB0bworCVBBVEhfTUFYIGluc3RlYWQgb2YgNjQuCisJSWYgZGV2ZnMgaXMgc3VwcG9ydGVkLCByZXBsYWNlICIvZGlzYyIgaW4gdGhlIGRldmljZSBuYW1lIHdpdGgKKwkiL3BhcnQiLgorCQorMjAwMC0xMC0xNSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCUZyb20gUm9kZXJpY2ggU2NodXBwIDxyc2NoQEV4cGVyVGVhbS5kZT46CisJKiB1dGlsL2dydWItaW5zdGFsbC5pbiAoY29udmVydCk6IEFkZGVkIHN1cHBvcnQgZm9yICJuYXRpdmUiCisJZGV2ZnMgZGV2aWNlIG5hbWVzLgorCQorMjAwMC0xMC0xNCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogZG9jcy90dXRvcmlhbC50ZXhpIChTZXJpYWwgdGVybWluYWwpOiBGaXhlZCBhIHR5cG8uCisJKiBkb2NzL3VzZXItcmVmLnRleGkgKEdSVUIgaW1hZ2VzKTogTmV3IGNoYXB0ZXIuCisJKiBkb2NzL2dydWIudGV4aTogQWRkZWQgYW4gZW50cnkgZm9yIHRoZSBjaGFwdGVyICJHUlVCIGltYWdlcyIuCisJCisyMDAwLTEwLTE0ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoc2V0a2V5X2Z1bmMpOiBJZiBUT19LRVkgaXMgTlVMTCAoaS5lLiB0aGUKKwl1c2VyIHNwZWNpZmllcyBubyBhcmd1bWVudCksIGNsZWFyIEJJT1NfS0VZX01BUCBhbmQKKwlBU0NJSV9LRVlfTUFQLgorCUlmIFRPX0tFWSBpcyBub24tTlVMTCBidXQgRlJPTV9LRVkgaXMgTlVMTCwgc2V0IEVSUk5VTSB0bworCUVSUl9CQURfQVJHVU1FTlQgYW5kIHJldHVybiBvbmUuCisJCisyMDAwLTEwLTEzICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBkb2NzL2dydWIudGV4aTogQWRkZWQgYW4gZW50cnkgZm9yIHRoZSBuZXcgY2hhcHRlciAiU2VjdXJpdHkiLAorCWFuZCB0aGUgb3JkZXIgb2YgdGhlIGNoYXB0ZXJzIGluIHRoZSBUdXRvcmlhbCBNYW51YWwgd2FzCisJY2hhbmdlZC4KKwkqIGRvY3MvdHV0b3JpYWwudGV4aSAoQ29uZmlndXJhdGlvbik6IE1vdmVkIHRvIHJpZ2h0IGFmdGVyIHRoZQorCWNoYXB0ZXIgIkJvb3RpbmciLgorCShTZWN1cml0eSk6IE5ldyBjaGFwdGVyLgorCQorMjAwMC0xMC0xMCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCUZyb20gQWxlc3NhbmRybyBSdWJpbmk6CisJKiB1dGlsL2dydWItaW5zdGFsbC5pbiAocm9vdF9kZXZpY2UpOiBVc2UgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbgorCSdzJS4qXCgvZGV2L1teIAldKlwpLiolXDElJyBpbnN0ZWFkIG9mCisJJ3MlLipcKC9kZXYvW2EtejAtOV0qXCkuKiVcMSUnLgorCShib290ZGlyX2RldmljZSk6IExpa2V3aXNlLgorCShncnViZGlyX2RldmljZSk6IExpa2V3aXNlLgorCQorMjAwMC0xMC0xMCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UyL3N0YXJ0LlMgKGNvcHlfYnVmZmVyKTogVXNlIHB1c2hhIGFuZCBwb3BhIGluc3RlYWQgb2YKKwlwdXNoaW5nIGFuZCBwb3BpbmcgJWRpIGFuZCAlc2kgaW5kaXZpZHVhbGx5LCB0byByZWR1Y2UgdGhlIGNvZGUKKwlzaXplIGFuZCBzYXZlICVjeCBhcyB3ZWxsLiBSZXBvcnRlZCBieSBIZXJiZXJ0IE5hY2h0bmViZWwKKwk8bmFjaHRuZWJAaWFlZS50dXdpZW4uYWMuYXQ+LgorCQorMjAwMC0xMC0xMCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCUZyb20gRGFuaWVsIFBpdHRtYW4gPGRhbmllbEByaW1zcGFjZS5uZXQ+OgorCSogc3RhZ2UyL2J1aWx0aW5zLmMgKHNldGtleV9mdW5jKTogQ2hlY2sgaWYKKwlLRVlTWU1fVEFCTEVbSV0uVU5TSElGVEVEX05BTUUgYW5kIEtFWVNZTV9UQUJMRVtJXS5TSElGVEVEX05BTUUKKwlhcmUgbm90IE5VTExzLCBiZWZvcmUgY2FsbGluZyBncnViX3N0cmNtcC4KKwkKKzIwMDAtMTAtMDggIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHV0aWwvZ3J1Yi1pbnN0YWxsLmluIChncnViX3ByZWZpeCk6IE5ldyB2YXJpYWJsZS4gVGhlIGRlZmF1bHQKKwlpcyAiL2Jvb3QvZ3J1YiIuCisJSWYgdGhlIHVzZXIgaGFzIGEgc2VwYXJhdGUgYm9vdCBwYXJ0aXRpb24sIHNldCBncnViX3ByZWZpeAorCWluc3RlYWQgb2YgZ3J1YmRpciB0byAiL2dydWIiLgorCVdoZW4gcnVubmluZyB0aGUgY29tbWFuZCAic2V0dXAiLCBzcGVjaWZ5ICRncnViX3ByZWZpeCBpbnN0ZWFkCisJb2YgJGdydWJkaXIgdG8gdGhlIG9wdGlvbiAiLS1wcmVmaXgiLgorCVJlcG9ydCBieSBUaGllcnJ5IExhcm9uZGUuCisJCisyMDAwLTEwLTA4ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoZmluZF9mdW5jKTogQ2xlYXIgRVJSTlVNIGFmdGVyIHRoZSBsYXN0CisJY2FsbCBvZiBuZXh0X3BhcnRpdGlvbiwgYmVjYXVzZSBpdCBhbHdheXMgc2V0cyBFUlJOVU0uIFJlcG9ydGVkCisJYnkgVGhpZXJyeSBMYXJvbmRlIDx0aGllcnJ5Lmxhcm9uZGVAcG9seW51bS5jb20+LgorCQorMjAwMC0xMC0wNyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogbGliL2RldmljZS5jIFtfX2xpbnV4X19dICh3cml0ZV90b19wYXJ0aXRpb24pOiBPcGVuIERFViB3aXRoCisJT19SRFdSIGluc3RlYWQgb2YgT19PUk9OTFkuCisJCisyMDAwLTEwLTA2ICBBbGVzc2FuZHJvIFJ1YmluaSAgPHJ1YmluaUBnbnUub3JnPgorCisJKiBkb2NzL3VzZXItcmVmLnRleGkgKENvbW1hbmRzKTogQWRkZWQgbWlzc2luZyBjb21tYW5kcyBhbmQKKwlyZXdvcmRlZCBwYXJ0IG9mIHRoZSB0ZXh0LgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoc2VyaWFsX2Z1bmMpOiBVbnN3YXAgdGhlIHNldHRpbmcgb2YgInNwZWVkIgorCWFuZCAicG9ydCIuCisKKzIwMDAtMTAtMDYgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChzZXR1cF9mdW5jKTogQXBwZW5kICIuLi4gIiB0byB0aGUKKwltZXNzYWdlcyB3aGVuIGNhbGxpbmcgZW1iZWRfZnVuYyBhbmQgaW5zdGFsbF9mdW5jLCBhbmQgcHJpbnQKKwl0aGUgcmVzdWx0LgorCURvbid0IGp1bXAgdG8gdGhlIGxhYmVsICJmYWlsIiwgZXZlbiB3aGVuIGVtYmVkX2Z1bmMgZmFpbGVkLgorCQorMjAwMC0xMC0wNSAgR29yZG9uIE1hdHppZ2tlaXQgIDxnb3JkQGZpZy5vcmc+CisKKwkqIHN0YWdlMi9kaXNrX2lvLmMgKHJlYWxfb3Blbl9wYXJ0aXRpb24pOiBNYWtlIHN1cmUgdGhhdCBidWZfZ2VvbQorCWNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IGRyaXZlIGJlZm9yZSB1c2luZyBpdC4KKworCSogbGliL2RldmljZS5jIChnZXRfZHJpdmVfZ2VvbWV0cnkpOiBVc2UgZnN0YXQgaWYgdGhlIG5hdGl2ZQorCWdlb21ldHJ5IG1ldGhvZHMgZmFpbCwgc3VjaCBhcyB3aGVuIHRoZSBkcml2ZSBpcyBtYXBwZWQgdG8gYQorCXJlZ3VsYXIgZmlsZS4KKworCSogZG9jcy90dXRvcmlhbC50ZXhpOiBBZGQgYEBrYmR7Li4ufScgdG8gZXhhbXBsZXMgaW4gb3JkZXIgdG8KKwlkaWZmZXJlbnRpYXRlIGJldHdlZW4gY29tbWFuZCBvdXRwdXQgYW5kIGNoYXJhY3RlcnMgdGhlIHVzZXIKKwlzaG91bGQgdHlwZS4KKwkqIGRvY3MvdXNlci1yZWYudGV4aTogTGlrZXdpc2UuCisKKzIwMDAtMTAtMDUgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIGRvY3MvZ3J1Yi50ZXhpOiBBZGRlZCBhbiBlbnRyeSBmb3IgdGhlIGNoYXB0ZXIgIlNlcmlhbAorCXRlcm1pbmFsIi4KKwkqIGRvY3MvdHV0b3JpYWwudGV4aSAoU2VyaWFsIHRlcm1pbmFsKTogTmV3IGNoYXB0ZXIuCisJCisyMDAwLTEwLTA0ICBHb3Jkb24gTWF0emlna2VpdCAgPGdvcmRAZmlnLm9yZz4KKworCSogdXRpbC9ncnViLWltYWdlIChWRVJTSU9OKTogRml4IHZlcnNpb24gY2FsY3VsYXRpb24gdG8gdG9sZXJhdGUKKwlgKEdOVSBHUlVCIDAuNS45NiknLXN0eWxlIHZlcnNpb25zLgorCisJKiBkb2NzL2dydWIudGV4aTogUmVtb3ZlIGJyYWNlcyBmcm9tIGBAdW5udW1iZXJlZCcgc2VjdGlvbnMgc28KKwl0aGF0IHRleGkyaHRtbCBkb2Vzbid0IGNvbXBsYWluLgorCisJKiBkZWJpYW4vcnVsZXM6IEJ1aWxkIEhUTUwgZG9jdW1lbnRhdGlvbiB0byBhcHBlYXNlIHRoZSBEZWJpYW4KKwltYXNzZXMuCisKKzIwMDAtMTAtMDQgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9mc3lzX3JlaXNlcmZzLmMgKHJlaXNlcmZzX21vdW50KTogQ29tcGFyZSBQQVJUX0xFTkdUSAorCXdpdGggU1VQRVJCTE9DSyArIChzaXplb2Yoc3VwZXIpID4+IFNFQ1RPUl9CSVRTKSBpbnN0ZWFkIG9mCisJc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jaykuIFJlcG9ydGVkIGJ5IEpvY2hlbgorCUhvZW5pY2tlLgorCQorMjAwMC0xMC0wNSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogY29uZmlndXJlLmluIChBTV9JTklUX0FVVE9NQUtFKTogVGhlIHZlcnNpb24gbnVtYmVyIGlzIHNldCB0bworCTAuNS45Ny4gVGhpcyB2ZXJzaW9uIG51bWJlciBpcyBhIGR1bW15LCBhcyB3ZSB3aWxsIG5ldmVyIHJlbGVhc2UKKwkwLjUuOTcgYWN0dWFsbHkuCisJCisyMDAwLTEwLTAxICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBsaWIvZGV2aWNlLmMgW19fbGludXhfX106IERvbid0IGluY2x1ZGUgPGxpbnV4L2Nkcm9tLmg+LgorCVtfX2xpbnV4X18gJiYgIUNEUk9NX0dFVF9DQVBBQklMSVRZXSAoQ0RST01fR0VUX0NBUEFCSUxJVFkpOgorCURlZmluZWQgYXMgMHg1MzMxLgorCQorMjAwMC0xMC0wMSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogbGliL2RldmljZS5jIChnZXRfZHJpdmVfZ2VvbWV0cnkpIFtfX0dOVV9fXTogR2V0IHRoZSBudW1iZXIgb2YKKwl0b3RhbCBzZWN0b3JzIGJ5IGZzdGF0LiBUaGUgcmVzdCBhcmUgZmlsbGVkIHdpdGggYXJiaXRyYXJ5CisJdmFsdWVzLgorCQorMjAwMC0wOS0zMCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogdXRpbC9ncnViLWluc3RhbGwuaW4gKGNvbnZlcnQpOiBUaGUgY29kZSBmb3IgZ251KiAoaS5lLgorCUdOVS9IdXJkKSB3YXMgcmV3cml0dGVuLCBzaW5jZSBpdCBkaWRuJ3Qgd29yayBmb3IgQlNECisJcGFydGl0aW9ucy4KKwlVc2UgIiR0bXBfZGlzayAqJCIgaW5zdGVhZCBvZiAiJHRtcF9kaXNrIiB0byBnZXQgdGhlIGRyaXZlIG5hbWUuCisJCisyMDAwLTA5LTMwICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvZnN5c19yZWlzZXJmcy5jIChyZWlzZXJmc19tb3VudCk6IENoZWNrIGlmIHRoZSBsZW5ndGgKKwlvZiB0aGUgcGFydGl0aW9uIGlzIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiBhIHN1cGVyIGJsb2NrLCBiZWZvcmUKKwlhdHRlbXB0aW5nIHRvIHJlYWQgdGhlIHN1cGVyIGJsb2NrLgorCisJKiBncnViL2FzbXN0dWIuYyAoY29uc29sZV9wdXRjaGFyKQorCVtIQVZFX0xJQkNVUlNFU19IICYmIFJFRlJFU0hfSU1NRURJQVRFTFldOiBDYWxsIHJlZnJlc2gsIHRvIGVhc2UKKwlkZWJ1Z2dpbmcuCisJCisyMDAwLTA5LTMwICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJQWRkZWQgdHdvIG5ldyBjb21tYW5kcywgInBhcnRuZXciIGFuZCAicGFydHR5cGUiLCBiYXNlZCBvbiB0aGUKKwlwYXRjaCBieSBTdGVmYW4gT25kcmVqaWNrYSA8b25kcmVqQGlkYXRhLnNrPjoKKwkqIHN0YWdlMi9idWlsdGlucy5jIChwYXJ0bmV3X2Z1bmMpOiBOZXcgZnVuY3Rpb24uCisJKGJ1aWx0aW5fcGFydG5ldyk6IE5ldyB2YXJpYWJsZS4KKwkocGFydHR5cGVfZnVuYyk6IE5ldyBmdW5jdGlvbi4KKwkoYnVpbHRpbl9wYXJ0dHlwZSk6IE5ldyB2YXJpYWJsZS4KKwkoYnVpbHRpbl90YWJsZSk6IEFkZGVkIHBvaW50ZXJzIHRvIEJVSUxUSU5fUEFSVE5FVyBhbmQgdG8KKwlCVUlMVElOX1BBUlRUWVBFLgorCQorMjAwMC0wOS0yOSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGZpbmRfZnVuYyk6IE5ldyB2YXJpYWJsZSBHT1RfRklMRSBpcyBzZXQgdG8KKwlvbmUgaWYgRklMRU5BTUUgaXMgZm91bmQuIE90aGVyd2lzZSwgaXQgaXMgc2V0IHRvIHplcm8uCisJQ2xlYXIgRVJSTlVNIGF0IHRoZSBlbmQgaW4gdGhlIGxvb3AgZm9yIGZsb3BwaWVzLCB0byBlbnN1cmUgdGhhdAorCUVSUk5VTSBpcyBjbGVhcmVkIGJlZm9yZSBleGFtaW5pbmcgaGFyZCBkaXNrcy4KKwlSZXdyaXRlIHRoZSBsb29wIGZvciBoYXJkIGRpc2tzIHVzaW5nIG5leHRfcGFydGl0aW9ucywgc28gdGhpcworCWZ1bmN0aW9uIG5vdyBjaGVja3MgYWxsIHBhcnRpdGlvbnMgeW91IGhhdmUgY2VydGFpbmx5LgorCUlmIEdPVF9GSUxFIGlzIG5vbi16ZXJvLCBzZXQgRVJSTlVNIHRvIEVSUl9GSUxFX05PVF9GT1VORCBhbmQKKwlyZXR1cm4gb25lLgorCQorMjAwMC0wOS0yOSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UyL2Rpc2tfaW8uYyAoY2hlY2tfQlNEX3BhcnRzKTogUmVtb3ZlZC4KKwkobmV4dF9wYXJ0aXRpb24pOiBOZXcgZnVuY3Rpb24uCisJKHJlYWxfb3Blbl9wYXJ0aXRpb24pOiBSZXdyaXR0ZW4gdXNpbmcgbmV4dF9wYXJ0aXRpb24uCisJKHNldF9kZXZpY2UpIFshU1RBR0UxXzVdOiBTa2lwIGEgY29tbWEgaW4gREVWSUNFLCBldmVuIHdoZW4gdGhlCisJQlNEIHBhcnRpdGlvbiBpcyBub3Qgc3BlY2lmaWVkLgorCVshU1RBR0UxXzVdIChwcmludF9jb21wbGV0aW9ucyk6IERvbid0IGFwcGVuZCAnKScgaWYgdGhlCisJcGFydGl0aW9uIGlzIGEgUEMgc2xpY2Ugd2hpY2ggbWF5IGhhdmUgQlNEIHBhcnRpdGlvbnMuIEluc3RlYWQsCisJdHJ5IHRvIGNvbXBsZXRlIHRoZSBjb21tYW5kLWxpbmUgd2l0aCBwb3NzaWJsZSBwYXJ0aXRpb25zLgorCSogc3RhZ2UyL3NoYXJlZC5oIChuZXh0X3BhcnRpdGlvbik6IERlY2xhcmVkLgorCQorMjAwMC0wOS0yNyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1zZXJpYWwpOiBDaGFuZ2VkIHRvIC4uLgorCSgtLWRpc2FibGUtc2VyaWFsKTogLi4uIHRoaXMuIE5vdyB0aGUgc2VyaWFsIHN1cHBvcnQgaXMgZW5hYmxlZAorCWJ5IGRlZmF1bHQuCisJCisyMDAwLTA5LTI3ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvY2hhcl9pby5jIFshU1RBR0UxXzVdIChnZXRfY21kbGluZSkgWyFTVVBQT1JUX1NFUklBTF06IAorCURvbid0IGNoZWNrIGlmIHRoZSB0ZXJtaW5hbCBpcyBkdW1iLiBJZiB0aGUgdGVybWluYWwgaXMgY29uc29sZSwKKwlhbHdheXMgdXNlIGNvbnNvbGUgZnVuY3Rpb25zLgorCSogc3RhZ2UyL2J1aWx0aW5zLmMgWyFTVVBQT1JUX05FVEJPT1RdIChib290cF9mdW5jKTogVW5kZWZpbmVkLgorCVshU1VQUE9SVF9ORVRCT09UXSAoYnVpbHRpbl9ib290cCk6IExpa2V3aXNlLgorCVshR1JVQl9VVElMXSAoZGV2aWNlX2Z1bmMpOiBMaWtld2lzZS4KKwlbIUdSVUJfVVRJTF0gKGJ1aWx0aW5fZGV2aWNlKTogTGlrZXdpc2UuCisJWyFTVVBQT1JUX05FVEJPT1RdIChkaGNwX2Z1bmMpOiBMaWtld2lzZS4KKwlbIVNVUFBPUlRfTkVUQk9PVF0gKGJ1aWx0aW5fZGhjcCk6IExpa2V3aXNlLgorCVshR1JVQl9VVElMXSAocXVpdF9mdW5jKTogTGlrZXdpc2UuCisJWyFHUlVCX1VUSUxdIChidWlsdGluX3F1aXQpOiBMaWtld2lzZS4KKwlbIVNVUFBPUlRfTkVUQk9PVF0gKHJhcnBfZnVuYyk6IExpa2V3aXNlLgorCVshU1VQUE9SVF9ORVRCT09UXSAoYnVpbHRpbl9yYXJwKTogTGlrZXdpc2UuCisJWyFTVVBQT1JUX1NFUklBTF0gKHNlcmlhbF9mdW5jKTogTGlrZXdpc2UuCisJWyFTVVBQT1JUX1NFUklBTF0gKGJ1aWx0aW5fc2VyaWFsKTogTGlrZXdpc2UuCisJWyFTVVBQT1JUX1NFUklBTF0gKHRlcm1pbmFsX2Z1bmMpOiBMaWtld2lzZS4KKwlbIVNVUFBPUlRfU0VSSUFMXSAoYnVpbHRpbl90ZXJtaW5hbCk6IExpa2V3aXNlLgorCVshU1VQUE9SVF9ORVRCT09UXSAodGZ0cHNlcnZlcl9mdW5jKTogTGlrZXdpc2UuCisJWyFTVVBQT1JUX05FVEJPT1RdIChidWlsdGluX3RmdHBzZXJ2ZXIpOiBMaWtld2lzZS4KKwkoYnVpbHRpbl90YWJsZSkgWyFTVVBQT1JUX05FVEJPT1RdOiBSZW1vdmVkIHRoZSBwb2ludGVycyB0bworCUJVSUxUSU5fQk9PVFAsIEJVSUxUSU5fREhDUCwgQlVJTFRJTl9SQVJQLCBhbmQKKwlCVUlMVElOX1RGVFBTRVJWRVIuCisJKGJ1aWx0aW5fdGFibGUpIFshU1VQUE9SVF9TRVJJQUxdOiBSZW1vdmVkIHRoZSBwb2ludGVycyB0bworCUJVSUxUSU5fU0VSSUFMIGFuZCBCVUlMVElOX1RFUk1JTkFMLgorCShidWlsdGluX3RhYmxlKSBbIUdSVUJfVVRJTF06IFJlbW92ZWQgdGhlIHBvaW50ZXJzIHRvCisJQlVJTFRJTl9ERVZJQ0UgYW5kIEJVSUxUSU5fUVVJVC4KKwkKKzIwMDAtMDktMjYgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHV0aWwvZ3J1Yi1pbnN0YWxsLmluIChib290ZGlyX2RldmljZSk6IE5ldyB2YXJpYWJsZS4gSWYKKwkkYm9vdGRpcl9kZXZpY2UgaXMgbm90IHRoZSBzYW1lIGFzICRyb290X2RldmljZSwgc2V0IHJvb3RfZGV2aWNlCisJYW5kIGdydWJkaXIgdG8gJGJvb3RkaXJfZGV2aWNlIGFuZCAiL2dydWIiLCByZXNwZWN0aXZlbHkuCisJQWRkIC0tcHJlZml4PSRncnViZGlyIGludG8gdGhlIGNvbW1hbmQgInNldHVwIi4KKwkKKzIwMDAtMDktMjYgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwlBZGQgLS1wcmVmaXg9RElSIHRvIHRoZSBjb21tYW5kICJzZXR1cCIuCisJCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoc2V0dXBfZnVuYyk6IE5ldyBuZXN0ZWQgZnVuY3Rpb24sCisJY2hlY2tfZmlsZSBjaGVja3MgaWYgdGhlIGZpbGUgRklMRSBleGlzdHMuCisJUmVtb3ZlIHRoZSBwcmVmaXggIi9ib290L2dydWIiIGluIFNUQUdFMV81X01BUC4KKwlEb24ndCBoYXJkY29kZSAiL2Jvb3QvZ3J1Yi9zdGFnZTEiLCAiL2Jvb3QvZ3J1Yi9zdGFnZTIiLCBvcgorCSIvYm9vdC9ncnViL21lbnUubHN0Ii4gSW5zdGVhZCwgY2hlY2sgaWYgQVJHIGNvbnRhaW5zCisJIi0tcHJlZml4PSIsIGFuZCBpZiBzcGVjaWZpZWQsIHNldCBQUkVGSVggdG8gdGhlIHZhbHVlLgorCUlmIG5vdCBzcGVjaWZpZWQsIGNoZWNrICIvYm9vdC9ncnViL3N0YWdlMSIgYW5kLCBpZiBub3QgZm91bmQsCisJY2hlY2sgIi9ncnViL3N0YWdlMSIuIElmIGEgc3RhZ2UxIHdhcyBmb3VuZCwgc2V0IFBSRUZJWCB0byB0aGUKKwlkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgdGhlIHN0YWdlMS4KKwkKKzIwMDAtMDktMTIgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwlBZGQgYWRkaXRpb25hbCBtYWdpYyB0byBhdm9pZCBhIGJ1ZyBpbiBMaW51eC4gKnNpZ2gqCisJCisJKiBzdGFnZTIvYm9vdC5jIChsb2FkX2ltYWdlKTogQ29weSBTUkMgdG8gREVTVCBmaXJzdCwgYW5kIGFwcGVuZAorCWEgIm1lbT0iIG9wdGlvbiB0byBERVNUIGluc3RlYWQgb2YgcHJlcGVuZGluZy4KKwkKKzIwMDAtMDktMTEgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwlSZXBvcnRlZCBieSBBbGVzc2FuZHJvIFJ1YmluaToKKwkqIHN0YWdlMi9mc3lzX21pbml4LmMgKG1pbml4X21vdW50KTogQ2hlY2sgaWYgQ1VSUkVOVF9TTElDRSBpcyBhCisJcGFydGl0aW9uIHR5cGUgZm9yIG1pbml4IGZzLCB1c2luZyB0aGUgbWFjcm8KKwlJU19QQ19TTElDRV9UWVBFX01JTklYLgorCSogc3RhZ2UyL3BjX3NsaWNlLmggKFBDX1NMSUNFX1RZUEVfTElOVVhfTUlOSVgpOiBOZXcgbWFjcm8uCisJKElTX1BDX1NMSUNFX1RZUEVfTUlOSVgpOiBMaWtld2lzZS4KKwkKKzIwMDAtMDktMDkgIEFsZXNzYW5kcm8gUnViaW5pICA8cnViaW5pQG1vcmdhbmEuc3lzdGVteS5pdD4KKworCSogc3RhZ2UxL3N0YWdlMS5TIChub3RpZmljYXRpb25fc3RyaW5nKTogUHJpbnQgIkdSVUIgIiBpbnN0ZWFkCisJb2YgInN0YWdlMSAiLgorCSogc3RhZ2UyL3N0YXJ0LlMgW1NUQUdFMV81XSAobm90aWZpY2F0aW9uX3N0cmluZyk6IFByaW50CisJIkxvYWRpbmcgc3RhZ2UxLjUiIGluc3RlYWQgb2YgInN0YWdlMS41ICIuCisJWyFTVEFHRTFfNV0gKG5vdGlmaWNhdGlvbl9zdHJpbmcpOiBQcmludCAiTG9hZGluZyBzdGFnZTIiCisJaW5zdGVhZCBvZiAic3RhZ2UyICIuCisJKG5vdGlmaWNhdGlvbl9zdGVwKTogTmV3IGxhYmVsLCBmb2xsb3dlZCBieSBhIHN0cmluZyAiLiIuCisJKG5vdGlmaWNhdGlvbl9kb25lKTogTmV3IGxhYmVsLCBmb2xsb3dlZCBieSBhIHN0cmluZyAiXHJcbiIuCisJKGNvcHlfYnVmZmVyKTogUHJpbnQgTk9USUZJQ0FUSU9OX1NURVAgYWZ0ZXIgY29weWluZyB0aGUgYnVmZmVyLgorCShib290aXQpOiBQcmludCBOT1RJRklDQVRJT05fRE9ORSBiZWZvcmUgcmVzdG9yaW5nICVkeC4KKwkKKzIwMDAtMDktMDkgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwlGcm9tIEFsZXNzYW5kcm8gUnViaW5pOgorCSogY29uZmlndXJlLmluIChDUFBGTEFHUyk6IEFkZGVkIC1tYWxpZ24tanVtcHM9MSwKKwktbWFsaWduLWxvb3BzPTEgYW5kIC1tYWxpZ24tZnVuY3Rpb25zPTEuCisJCisyMDAwLTA5LTA3ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJRnJvbSBIYWwgU255ZGVyIDxoYWxAdmFpbHN5cy5jb20+OgorCSogbGliL2RldmljZS5jIChnZXRfZHJpdmVfZ2VvbWV0cnkpIFtfX0ZyZWVCU0RfXyB8fCBfX05ldEJTRF9fCisJfHwgX19PcGVuQlNEX19dOiBDYWxsIGlvY3RsIGZvciBGRCBpbnN0ZWFkIG9mCisJRElTS1NbRFJJVkVdLkZMQUdTLiBUaGlzIHdhcyBhIG1pc3Rha2Ugd2hlbiBJIHNlZ3JlZ2F0ZWQgdGhpcworCWZ1bmN0aW9uIGZyb20gYXNtc3R1Yi5jLgorCQorMjAwMC0wOS0wNyAgQWxlc3NhbmRybyBSdWJpbmkgIDxydWJpbmlAZ251Lm9yZz4KKworCSogZG9jcy90dXRvcmlhbC50ZXhpOiBGaXhlZCBhIGZldyB0eXBvcyBhbmQgbWlub3IgaW1wcmVjaXNpb25zLgorCSogZG9jcy9wcm9nLXJlZi50ZXhpOiBMaWtld2lzZS4KKwkqIGRvY3MvdXNlci1yZWYudGV4aTogTGlrZXdpc2UuCisKKzIwMDAtMDktMDcgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwlGcm9tIEFsZXNzYW5kcm8gUnViaW5pOgorCSogc3RhZ2UyL2J1aWx0aW5zLmMgKHRlcm1pbmFsX2Z1bmMpOiBSZW5hbWUgVElNRU9VVCB0byBUTywgdG8KKwlzdXBwcmVzcyBHQ0Mgd2FybmluZ3MuCisJKiBncnViL2FzbXN0dWIuYyAoc2VyaWFsX2NoZWNra2V5KTogTGlrZXdpc2UuCisJCisyMDAwLTA5LTA2ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvY2hhcl9pby5jIFshU1RBR0UxXzVdIChhdXRvX2ZpbGwpOiBOZXcgdmFyaWFibGUuCisJWyFTVEFHRTFfNV0gKGdldF9jbWRsaW5lKTogU2F2ZSBBVVRPX0ZJTEwgaW4gU0FWRURfQVVUT19GSUxMIGluCisJdGhlIGJlZ2lubmluZyBhbmQgcmVzdG9yZSBBVVRPX0ZJTEwgYmVmb3JlIHJldHVybi4KKwlTZXQgQVVUT19GSUxMIHRvIG9uZSBhbmQgemVybyBiZWZvcmUgYW5kIGFmdGVyIGNhbGxpbmcKKwlwcmludF9jb21wbGV0aW9ucywgcmVzcGVjdGl2ZWx5LgorCShncnViX3B1dGNoYXIpIFshU1RBR0UxXzVdOiBVc2UgYSBzdGF0aWMgdmFyaWFibGUgQ09MIHRvIHRyYWNrCisJdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJzb3IuIElmIEMgaXMgYSBjYXJyaWFnZSByZXR1cm4sIGNsZWFyCisJQ09MLiBJZiBDIGlzIGEgYmFja3NwYWNlIGFuZCBDT0wgaXMgcG9zaXRpdmUsIGRlY3JlYXNlIENPTC4gSWYgQworCWlzIGEgcHJpbnRhYmxlIGNoYXJhY3RlciwgaW5jcmVhc2UgQ09MLiBJbiB0aGlzIGNhc2UsIGlmCisJQVVUT19GSUxMIGlzIG5vbi16ZXJvIGFuZCBDT0wgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDc5LAorCXB1dCBhIG5ld2xpbmUgYXV0b21hdGljYWxseS4KKwkqIHN0YWdlMi9zaGFyZWQuaCAoYXV0b19maWxsKTogRGVjbGFyZWQuCisJKiBzdGFnZTIvc3RhZ2UyLmMgKHJ1bl9tZW51KTogSW4gdGhlIG1lbnUgaW50ZXJmYWNlLCBkaXNhYmxlIHRoZQorCWF1dG8gZmlsbCBtb2RlIChpLmUuIHNldCBBVVRPX0ZJTEwgdG8gemVybyksIGFuZCBlbmFibGUgaXQgYWdhaW4KKwl3aGVuIGJvb3RpbmcgYW4gZW50cnkuCisJKGNtYWluKTogSW5pdGlhbGl6ZSBBVVRPX0ZJTEwgKGkuZS4gc2V0IGl0IHRvIG9uZSkgaW4gdGhlCisJYmVnaW5uaW5nIG9mIHRoZSBsb29wLgorCQorMjAwMC0wOS0wNiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCUFkZCBzdXBwb3J0IGZvciAiYm9vdCBwcmV2aW91c2x5IGJvb3RlZCBlbnRyeSBieSBkZWZhdWx0IiwgYmFzZWQKKwlvbiB0aGUgcGF0Y2ggYnkgTWlrZSBNZXllciA8bXdtQG1pcmVkLm9yZz4sIGJ1dCBJJ3ZlIG1vZGlmaWVkCisJaGlzIHBhdGNoIHRob3JvdWdobHkuCisJCisJKiBncnViL2FzbXN0dWIuYyAoc2F2ZWRfZW50cnlubyk6IE5ldyB2YXJpYWJsZS4gVGhpcyBpcyBhIGR1bW15LgorCSogc3RhZ2UxL3N0YWdlMS5oIChDT01QQVRfVkVSU0lPTl9NSU5PUik6IEluY3JlbWVudGVkLgorCSogc3RhZ2UyL2FzbS5TIChzYXZlZF9lbnRyeW5vKTogTmV3IHZhcmlhYmxlLgorCShjb2Rlc3RhcnQpIFshU1VQUE9SVF9ESVNLTEVTU106IFNldCBJTlNUQUxMX1NFQ09ORF9TRUNUT1IgdG8KKwklZWJwLiAlZWJwIGlzIHNldCBpbiBzdGFydC5TLgorCShpbnN0YWxsX3NlY29uZF9zZWN0b3IpOiBOZXcgdmFyaWFibGUuCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoY3VycmVudF9lbnRyeW5vKTogTmV3IHZhcmlhYmxlLgorCShkZWZhdWx0X2Z1bmMpIFshU1VQUE9SVF9ESVNLTEVTU106IElmIEFSRyBpcyAic2F2ZWQiLCBzZXQKKwlERUZBVUxUX0VOVFJZIHRvIFNBVkVEX0VOVFJZTk8uCisJKHNhdmVkZWZhdWx0X2Z1bmMpOiBOZXcgZnVuY3Rpb24uCisJKGJ1aWx0aW5fc2F2ZWRlZmF1bHQpOiBOZXcgdmFyaWFibGUuCisJKGJ1aWx0aW5fdGFibGUpOiBBZGRlZCBhIHBvaW50ZXIgdG8gQlVJTFRJTl9TQVZFREVGQVVMVC4KKwkqIHN0YWdlMi9zaGFyZWQuaCAoU1RBR0UyX1NBVkVEX0VOVFJZTk8pOiBOZXcgbWFjcm8uCisJKFNUQUdFMl9TVEFHRTJfSUQpOiBDaGFuZ2VkIHRvIDB4MTAuCisJKFNUQUdFMl9GT1JDRV9MQkEpOiBDaGFnZWQgdG8gMHgxMS4KKwkoU1RBR0UyX1ZFUl9TVFJfT0ZGUyk6IENoYW5nZWQgdG8gMHgxMi4KKwkoaW5zdGFsbF9zZWNvbmRfc2VjdG9yKTogRGVjbGFyZWQuCisJKHNhdmVkX2VudHJ5bm8pOiBMaWtld2lzZS4KKwkoY3VycmVudF9lbnRyeW5vKTogTGlrZXdpc2UuCisJKiBzdGFnZTIvc3RhZ2UyLmMgKHJ1bl9tZW51KTogU2V0IENVUlJFTlRfRU5UUllOTyB0byBGSVJTVF9FTlRSWQorCSsgRU5UUllOTywgcmlnaHQgYmVmb3JlIGNhbGxpbmcgcnVuX3NjcmlwdC4KKwkqIHN0YWdlMi9zdGFydC5TIChzdGFydCk6IFNhdmUgdGhlIHNlY3RvciBudW1iZXIgb2YgdGhlIHNlY29uZAorCXNlY3RvciBpbiAlZWJwLgorCQorMjAwMC0wOS0wNSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UxL3N0YWdlMS5TIChsYmFfbW9kZSkgWyFOT19CVUdHWV9CSU9TX0lOX1RIRV9XT1JMRF06CisJRG9uJ3QgY2hlY2sgZm9yIHRoZSBnZW9tZXRyeSwgc2luY2Ugc29tZSBCSU9TZXMgZG9uJ3QgcmV0dXJuIHRoZQorCW51bWJlciBvZiB0b3RhbCBzZWN0b3JzIGNvcnJlY3RseSwgZXZlbiBpZiB0aGV5IGhhdmUgd29ya2luZyBMQkEKKwlzdXBwb3J0LgorCSogc3RhZ2UyL3N0YXJ0LlMgKGxiYV9tb2RlKSBbIU5PX0JVR0dZX0JJT1NfSU5fVEhFX1dPUkxEXToKKwlMaWtld2lzZS4KKwkqIHN0YWdlMi9iaW9zLmMgKGJpb3NkaXNrKSBbIU5PX0JVR0dZX0JJT1NfSU5fVEhFX1dPUkxEXToKKwlMaWtld2lzZS4KKwlSZXBvcnRlZCBieSBKYW4gRnJpY2tlIDxmcmlja2VAdW5pLWdyZWlmc3dhbGQuZGU+IGFuZCBQaXhlbAorCTxwaXhlbEBtYW5kcmFrZXNvZnQuY29tPi4KKwkKKzIwMDAtMDktMDUgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwlGcm9tIEFsZXNzYW5kcm8gUnViaW5pIDxydWJpbmlAZ251Lm9yZz46CisJKiBzdGFnZTIvY2hhcl9pby5jIChwcmludF9lcnJvcikgWyFTVEFHRTFfNV06IFByaW50IEVSUk5VTSBsaWtlCisJIkVycm9yIDk6IFVua25vd24gYm9vdCBmYWlsdXJlIi4KKwkocHJpbnRfZXJyb3IpIFtTVEFHRTFfNV06IERvbid0IHByaW50IGEgY29sb24uCisJKiB1dGlsL2dydWItaW5zdGFsbC5pbjogV2hlbiBjaGVja2luZyBpZiBhbiBlcnJvciBvY2N1cnJlZCwgdXNlCisJdGhlIGV4cHJlc3Npb24gIkVycm9yIFswLTldKjogIiBpbnN0ZWFkIG9mICJFcnJvcjogIi4KKwkqIGRvY3MvdXNlci1yZWYudGV4aSAoU3RhZ2UxLjUgZXJyb3JzKTogVXBkYXRlZCwgc2luY2UgdGhlIGVycm9yCisJZm9ybSBjaGFuZ2VkLgorCQorMjAwMC0wOS0wNCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UyL3N0YWdlMi5jIChydW5fbWVudSkgW0dSVUJfVVRJTF06IFNldCBESVNQX1VQIGFuZAorCURJU1BfRE9XTiB0byBBQ1NfVUFSUk9XIGFuZCBBQ1NfREFSUk9XLCByZXNwZWN0aXZlbHkuIERvbid0IGNhbGwKKwlncnViX3ByaW50ZiBoZXJlLgorCShydW5fbWVudSkgWyFHUlVCX1VUSUxdOiBEb24ndCBjYWxsIGdydWJfcHJpbnRmIGhlcmUuIEluc3RlYWQsCisJY2FsbCBpdC4uLgorCShydW5fbWVudSk6IC4uLiBoZXJlLgorCSogc3RhZ2UyL3NoYXJlZC5oIChBQ1NfVUxDT1JORVIpOiBBbHdheXMgZGVmaW5lIHRoaXMgb3Vyc2VsdmVzLAorCXdoZXRoZXIgeW91ciBjdXJzZXMgbGlicmFyeSBoYXMgdGhlIGRlZmluaXRpb24uCisJKEFDU19VUkNPUk5FUik6IExpa2V3aXNlLgorCShBQ1NfTExDT1JORVIpOiBMaWtld2lzZS4KKwkoQUNTX0xSQ09STkVSKTogTGlrZXdpc2UuCisJKEFDU19ITElORSk6IExpa2V3aXNlLgorCShBQ1NfVkxJTkUpOiBMaWtld2lzZS4KKwkoQUNTX0xBUlJPVyk6IExpa2V3aXNlLgorCShBQ1NfUkFSUk9XKTogTGlrZXdpc2UuCisJKEFDU19VQVJST1cpOiBMaWtld2lzZS4KKwkoQUNTX0RBUlJPVyk6IExpa2V3aXNlLgorCisJKiBzdGFnZTIvY2hhcl9pby5jIFtTVVBQT1JUX1NFUklBTF0gKHNlcmlhbF9jbHMpOiBJZiB0aGUKKwl0ZXJtaW5hbCBpcyBkdW1iLCBqdXN0IHB1dCBhIG5ld2xpbmUuCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAodGVybWluYWxfZnVuYykgW1NVUFBPUlRfU0VSSUFMXTogV2hlbgorCWNob29zaW5nIGEgdGVybWluYWwsIGRvbid0IHNldCBURVJNSU5BTCB0byB0aGUgdHlwZSBvZiB0aGUKKwl0ZXJtaW5hbC4gSW5zdGVhZCwgYXBwbHkgYSBsb2dpY2FsIEFORCBvcGVyYXRpb24gd2l0aAorCVRFUk1JTkFMX0RVTUIsIHNpbmNlIHByZXZpb3VzIGNvZGUgYnJ1c2hlZCBvZmYgdGhlIGR1bWIKKwlhdHRyaWJ1dGUuCisJCisyMDAwLTA5LTA0ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvc3RhZ2UyLmMgKHJ1bl9tZW51KTogSWYgU0hPV19NRU5VIGlzIHplcm8sIHByaW50IGEKKwltZXNzYWdlIHdpdGggdGhlIHRpbWVvdXQgcGVyIHNlY29uZC4KKwlJZiBHUlVCX1RJTUVPVVQgaXMgbmVnYXRpdmUsIHNldCBTSE9XX01FTlUgdG8gb25lLCBzaW5jZSB0aGUKKwljb25kaXRpb24gIm5vIHRpbWVvdXQgYW5kIG5vIGludGVyZmFjZSIgaXMgbm9uc2Vuc2UuCisJSWYgR1JVQl9USU1FT1VUIGlzIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiB6ZXJvIGFuZCB0aGUKKwl0ZXJtaW5hbCBpcyBkdW1iLCBzZXQgU0hPV19NRU5VIHRvIHplcm8uCisJSWYgU0hPV19NRU5VIGlzIG5vbi16ZXJvIGFuZCB0aGUgdGVybWluYWwgaXMgZHVtYiwgZW50ZXIgdGhlCisJY29tbWFuZC1saW5lIGludGVyZmFjZSBpbnN0ZWFkLiBJZiBBVVRIIGlzIGZhbHNlIGFuZCBQQVNTV09SRCBpcworCW5vbi1OVUxMLCBwcm9tcHQgdGhlIHVzZXIgdG8gZW50ZXIgYSBwYXNzd29yZCB1bnRpbCB0aGUgZW50ZXJlZAorCXBhc3N3b3JkIGlzIGlkZW50aWNhbCB0byBQQVNTV09SRC4KKwkKKzIwMDAtMDktMDMgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHV0aWwvZ3J1Yi1pbnN0YWxsLmluOiBGaXggYSB0eXBvOiBncnViX2RpciAtPiBncnViZGlyLgorCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGluc3RhbGxfZnVuYykgW0dSVUJfVVRJTF06IE9wZW4gYSBTdGFnZSAyCisJd2l0aCAicisiIGluc3RlYWQgb2YgInIiLCBhcyBHUlVCIG5lZWRzIHRvIG92ZXJ3cml0ZSBpdC4KKwkKKzIwMDAtMDktMDIgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9zdGFnZTIuYyAocnVuX21lbnUpOiBEb24ndCB1c2UgZWl0aGVyIGBwJyBvciBgbicgdG8KKwltb3ZlIHRoZSBjdXJzb3IsIGJlY2F1c2UgYHAnIGlzIGFscmVhZHkgdXNlZCBmb3IgYW5vdGhlcgorCXB1cnBvc2UgKHBhc3N3b3JkKS4KKwkocnVuX21lbnUpIFtTVVBQT1JUX1NFUklBTF06IERvbid0IHNldCB0aGUgdmFyaWFibGVzIERJU1BfVVAgYW5kCisJRElTUF9ET1dOIGF0IHRoZSBzdGFydCB0aW1lLiBJbnN0ZWFkLCBzZXQgdGhlbSBqdXN0IGJlZm9yZSB1c2luZworCXRoZW0gYWN0dWFsbHksIGJlY2F1c2UgVEVSTUlOQUwgbWF5IGNoYW5nZSB3aGVuIHJ1bm5pbmcgYSBtZW51LgorCQorMjAwMC0wOS0wMSAgS2xhdXMgUmVpY2hsICA8S2xhdXMuUmVpY2hsQGFsY2F0ZWwuYXQ+CisKKwkqIHN0YWdlMi9zdGFnZTIuYyAocnVuX21lbnUpOiBTZXR1cCBhbmQgdXNlIGRpc3BfdXAsIGRpc3BfZG93bgorCWRlcGVuZGluZyBvbiB0aGUgdGVybWluYWwgbW9kZS4KKwkocnVuX21lbnUpOiBBbGxvdyAnXicgKHJlc3AuICdwJykgYW5kICd2JyAocmVzcCAnbicpIGtleXMgd2UKKwlkZXNjcmliZWQgaW4gb3VyIGhlbHAgYWJvdmUgKHJlc3AuIGF1dGhvcnMgcHJlZmVyZW5jZXMpLgorCisyMDAwLTA4LTMxICBLbGF1cyBSZWljaGwgIDxLbGF1cy5SZWljaGxAYWxjYXRlbC5hdD4KKworCSogc3RhZ2UyL3N0YWdlMi5jIChzZXRfbGluZSk6IEdvIGJhY2sgb25lIGNoYXIsIHdoaWNoIGlzCisJY29uc2lzdGVudCB3aXRoIHRoZSBvcmlnaW5hbCBzaXR1YXRpb24sIHdoZW4gYSB0aW1lb3V0IHdhcworCXJ1bm5pbmcuICAKKwkocnVuX21lbnUpOiBJZiBHUlVCX1RJTUVPVVQgaXMgc3RvcHBlZCBkb24ndCBsb29wIGJ1c3kgb3ZlcgorCUNIRUNLS0VZLCBqdXN0IHJlbGF4IGluIEdFVEtFWS4gCisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChzZXJpYWxfZnVuYyk6IC0tc3BlZWQgaGFuZGxpbmc6IGNvcnJlY3RlZAorCXR5cG86IHNldCBTUEVFRCBpbnN0ZWFkIG9mIFBPUlQuIAorCQorMjAwMC0wOC0zMSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgKHRlcm1pbmFsX2Z1bmMpOiBBZGRlZCB0d28gbmV3IG9wdGlvbnMsCisJLS1kdW1iIGFuZCAtLXRpbWVvdXQ9U0VDUy4KKwkqIHN0YWdlMi9jaGFyX2lvLmMgWyFTVEFHRTFfNV0gKGdldGtleSk6IFVzZSBsb2dpY2FsIEFORAorCW9wZXJhdGlvbnMsIHdoZW4gY2hlY2tpbmcgaWYgdGhlIHRlcm1pbmFsIGlzIGEgY29uc29sZSBvciBhCisJc2VyaWFsIHRlcm1pbmFsLgorCVshU1RBR0UxXzVdIChnZXRrZXkpIFtTVVBQT1JUX1NFUklBTF06IERvbid0IGNoZWNrIGlmIGJvdGgKKwlURVJNSU5BTF9DT05TT0xFIGFuZCBURVJNSU5BTF9TRVJJQUwgYXJlIHNldCBpbiBURVJNSU5BTC4KKwkKKzIwMDAtMDgtMzEgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMS9zdGFnZTEuUyAoTU9WX01FTV9UT19BTCk6IE5ldyBtYWNyby4KKwkocmVhbF9zdGFydCk6IFVzZSB0aGUgbWFjcm8gTU9WX01FTV9UT19BTCBpbnN0ZWFkIG9mIHVzaW5nIG1vdmIKKwlkaXJlY3RseSwgYmVjYXVzZSBiaW51dGlscy0yLjkuMS4wLnggZG9lc24ndCBwcm9kdWNlIGEgc2hvcnQKKwlvcGNvZGUgZm9yIGl0IGF1dG9tYXRpY2FsbHkuIFJlcG9ydGVkIGJ5IEFsZXNzYW5kcm8gUnViaW5pCisJPHJ1YmluaUBnbnUub3JnPi4KKworMjAwMC0wOC0zMCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogY29uZmlndXJlLmluIChDUFBGTEFHUyk6IFJlbW92ZSAtV3VuZGVmIGJ5IGRlZmF1bHQuIEFkZCB0aGUKKwlvcHRpb24gb25seSBpZiB0aGUgQyBjb21waWxlciBzdXBwb3J0cyBpdCwgYmVjYXVzZSBHQ0MgMi43LngKKwlkb2Vzbid0IHN1cHBvcnQgaXQuCisJKiBncnViL21haW4uYyAobG9uZ29wdHMpOiBUaGUgdHlwZSBvZiB0aGUgYXJndW1lbnQgZm9yICJob2xkIiBpcworCWNoYW5nZWQgdG8gT1BUSU9OQUxfQVJHVU1FTlQuCisJKG1haW4pOiBJZiAtLWhvbGQgaXMgc3BlY2lmaWVkLCBjaGVjayBpZiBPUFRBUkcgaXMgemVyby4gSWYgc28sCisJc2V0IEhPTEQgdG8gLTEsIG90aGVyd2lzZSwgc2V0IGl0IHRvIHRoZSBkaWdpdCBPUFRBUkcuCisJSWYgSE9MRCBpcyBncmVhdGVyIHRoYW4gemVybywgZGVjcmVhc2UgaXQgb25jZSBwZXIgbG9vcC4KKwkKKzIwMDAtMDgtMzAgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwlUaGUgY29tbWFuZC1saW5lIGludGVyZmFjZSBpcyBzd2l0Y2hlZCB0byBzaW5nbGUtbGluZSBlZGl0aW5nCisJbW9kZS4KKwkKKwkqIHN0YWdlMi9jaGFyX2lvLmMgWyFTVEFHRTFfNV0gKGdldF9jbWRsaW5lKTogRXh0ZW5zaXZlbHkKKwlyZXdyaXR0ZW4uIFRoZSBuZXN0ZWQgZnVuY3Rpb25zIGNsX3ByaW50IGFuZCBjbF9raWxsX3RvX2VuZCBhcmUKKwlyZW1vdmVkLCBjbF9yZWZyZXNoLCBjbF9iYWNrd2FyZCwgY2xfZm9yd2FyZCBhbmQgY2xfZGVsZXRlIGFyZQorCWFkZGVkLCBhbmQsIGNsX2luaXQgYW5kIGNsX2luc2VydCBhcmUgcmV3cml0dGVuIGZyb20gc2NyYXRjaC4KKwlTZWUgdGhlIHNvdXJjZSBjb2RlLCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gSSBkb24ndCB0aGluayB0aGlzCisJa2luZCBvZiBjaGFuZ2VzIGNhbiBiZSByZXByZXNlbnRlZCBpbiBDaGFuZ2VMb2cuCisJWyFTVEFHRTFfNV0gKENNRExJTkVfV0lEVEgpOiBOZXcgbWFjcm8uCisJWyFTVEFHRTFfNV0gKENNRExJTkVfTUFSR0lOKTogTGlrZXdpc2UuCisJKiBzdGFnZTIvc2hhcmVkLmggKFRFUk1JTkFMX0RVTUIpOiBMaWtld2lzZS4KKwkKKzIwMDAtMDgtMjggIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIGdydWIvYXNtc3R1Yi5jIChjb25zb2xlX3B1dGNoYXIpIFtIQVZFX0xJQkNVUlNFU106IElmCisJVVNFX0NVUlNFUyBpcyB0cnVlLCBlbXVsYXRlIGEgbmV3IGxpbmUgbGlrZSBhIG9yZGluYXJ5IHRlcm1pbmFsLAorCWJlY2F1c2UgbmN1cnNlcyB0cmVhdHMgaXQgYmFkbHkuIElmIGN1cnJlbnQgcG9zaXRpb24gb24geS1heGlzCisJaXMgdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuLCBjYWxsIHNjcm9sbC4gT3RoZXJ3aXNlLCBjYWxsIG1vdmUKKwl3aXRoIHRoZSBhcmd1bWVudHMsIFkgKyAxIGFuZCBYLCB3aGVyZSBYIGFuZCBZIGFyZSBjdXJyZW50CisJcG9zaXRpb24gb2YgdGhlIGN1cnNvci4KKwkKKzIwMDAtMDgtMjggIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9hc20uUyAoY29uc29sZV9wdXRjaGFyKTogRG9uJ3QgcHJpbnQgYSBjYXJyaWFnZSByZXR1cm4KKwl3aGVuIEMgaXMgYSBuZXdsaW5lLgorCSogc3RhZ2UyL2NoYXJfaW8uYyAoZ3J1Yl9wdXRjaGFyKTogQ2FsbCBncnViX3B1dGNoYXIgd2l0aCB0aGUKKwlhcnVnbWVudCBzZXQgdG8gYSBjYXJyaWFnZSByZXR1cm4sIGlmIEMgaXMgYSBuZXdsaW5lLgorCVshU1RBR0UxXzUgJiYgU1VQUE9SVF9TRVJJQUxdOiBEb24ndCBwcmludCBhIGNhcnJpYWdlIHJldHVybgorCXdoZW4gQyBpcyBhIG5ld2xpbmUuCisJCisyMDAwLTA4LTI3ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBsaWIvZGV2aWNlLmMgW19fbGludXhfX106IERvbid0IGluY2x1ZGUgbGludXgvZnMuaC4KKwlbIUJMS0dFVFNJWkVdIChCTEtHRVRTSVpFKTogRGVmaW5lZCBhcyBfSU8oMHgxMiw5NikuCisJKiBncnViL2FzbXN0dWIuYyBbX19saW51eF9fXTogRG9uJ3QgaW5jbHVkZSBsaW51eC9mcy5oLgorCQorMjAwMC0wOC0yNyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCVByZXNlcnZlIGEgbWFnaWMgbnVtYmVyIHVzZWQgYnkgV2luZG93cyBOVCBpbiBhIE1CUi4gU2hpdCEKKwlSZXBvcnRlZCBieSBLaGltZW5rbyBWaWN0b3IuCisJCisJKiBzdGFnZTEvc3RhZ2UxLmggKFNUQUdFMV9XSU5ET1dTX05UX01BR0lDKTogTmV3IG1hY3JvLgorCSogc3RhZ2UxL3N0YWdlMS5TIChjb3B5X2J1ZmZlcik6IFVzZSBwdXNoYSBhbmQgcG9wYSwgaW5zdGVhZCBvZgorCXB1c2hpbmcvcG9waW5nICVjeCBhbmQgJXNpIHNlcGFyYXRlbHksIHRvIHJlZHVjZSB0aGUgY29kZSBzaXplLgorCShudF9tYWdpYyk6IE5ldyBsYWJlbC4gU2V0IHRoZSBvZmZzZXQgdG8gX3N0YXJ0IHBsdXMKKwlTVEFHRTFfV0lORE9XU19OVF9NQUdJQworCShwYXJ0X3N0YXJ0KTogTmV3IGxhYmVsLgorCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGluc3RhbGxfZnVuYyk6IElmIERFU1RfRFJJVkUgaXMgYSBoYXJkCisJZGlzaywgY29weSB0aGUgcG9zc2libGUgcGFydGl0aW9uIHRhYmxlIGFuZCBXaW5kb3dzIE5UIG1hZ2ljIHRvCisJU1RBR0UxX0JVRkZFUiBmcm9tIE9MRF9TRUNULgorCQorMjAwMC0wOC0yNiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UyL2NoYXJfaW8uYyAodHJhbnNsYXRlX2tleWNvZGUpIFtTVVBQT1JUX1NFUklBTF06IERvbid0CisJZHJhaW4gdGhlIGlucHV0IGJ1ZmZlciwgc2luY2UgdGhhdCB3YXMgaXJyaXRhdGluZy4KKwkKKzIwMDAtMDgtMjYgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwlEb24ndCBzYXZlL3Jlc3RvcmUgZnJhZ2lsZSByZWdpc3RlcnMgdW5uZWNlc3NhcmlseS4KKwkKKwkqIHN0YWdlMi9hc20uUyBbIVNUQUdFMV81XSAodHJhY2tfaW50MTMpOiBEb24ndCBzYXZlL3Jlc3RvcmUKKwklZWN4LCAlZWR4LCBvciAlZWF4LgorCVshU1RBR0UxXzVdIChzZXRfaW50MTNfaGFuZGxlcik6IExpa2V3aXNlLgorCShiaW9zZGlza19pbnQxM19leHRlbnNpb25zKTogTGlrZXdpc2UuCisJKGJpb3NkaXNrX3N0YW5kYXJkKTogTGlrZXdpc2UuCisJKGNoZWNrX2ludDEzX2V4dGVuc2lvbnMpOiBMaWtld2lzZS4KKwkoZ2V0X2Rpc2tpbmZvX2ludDEzX2V4dGVuc2lvbnMpOiBMaWtld2lzZS4KKwkoZ2V0X2Rpc2tpbmZvX3N0YW5kYXJkKTogTGlrZXdpc2UuCisJKGdldF9kaXNraW5mb19mbG9wcHkpOiBMaWtld2lzZS4KKwlbIVNUQUdFMV81XSAoZ2V0X2Vpc2FtZW1zaXplKTogTGlrZXdpc2UuCisJWyFTVEFHRTFfNV0gKGdldF9tbWFwX2VudHJ5KTogTGlrZXdpc2UuCisJWyFTVEFHRTFfNV0gKGNvbnNvbGVfY2xzKTogTGlrZXdpc2UuCisJWyFTVEFHRTFfNV0gKG5vY3Vyc29yKTogTGlrZXdpc2UuCisJWyFTVEFHRTFfNV0gKGNvbnNvbGVfZ2V0eHkpOiBMaWtld2lzZS4KKwlbIVNUQUdFMV81XSAoY29uc29sZV9nb3RveHkpOiBMaWtld2lzZS4KKwlbIVNUQUdFMV81XSAoc2V0X2F0dHJpYik6IExpa2V3aXNlLgorCVshU1RBR0UxXzVdIChnZXRydHNlY3MpOiBMaWtld2lzZS4KKwlbIVNUQUdFMV81XSAoY3VycnRpY2tzKTogTGlrZXdpc2UsIGFuZCBkb24ndCB6ZXJvICVlYXgKKwlleHBsaWNpdGx5LCBzaW5jZSBwcm90X3RvX3JlYWwgZG9lcyB0aGF0LgorCQorMjAwMC0wOC0yNSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UyL2NoYXJfaW8uYyBbIVNUQUdFMV81XSAodHJhbnNsYXRlX2tleWNvZGUpOiBOZXcKKwlmdW5jdGlvbi4gVGhlIHNlcmlhbCBwYXJ0IGlzIHN0b2xlbiBmcm9tIHRoZSBwYXRjaCBieSBDaHJpc3RvcGgKKwlQbGF0dG5lci4KKwlbIVNUQUdFMV81XSAoZ2V0X2NtZGxpbmUpOiBDYWxsIHRyYW5zbGF0ZV9rZXljb2RlIGluc3RlYWQgb2YKKwl0cmFuc2xhdGluZyBzcGVjaWFsIGtleSBjb2RlcyBpbnRvIEFTQ0lJIGNoYXJhY3RlcnMgYnkgaXRzZWxmLgorCSogc3RhZ2UyL3N0YWdlMi5jIChydW5fbWVudSk6IFdyYXAgZ2V0a2V5IHdpdGggdGhlIG1hY3JvCisJQVNDSUlfQ0hBUiwgd2hlbiBjaGVja2luZyBpZiBFU0MgaXMgcHJlc3NlZC4KKwlDYWxsIHRyYW5zbGF0ZV9rZXljb2RlIGFzIHdlbGwgYXMgZ2V0a2V5LCB1bmxlc3MgY2hlY2trZXkKKwlyZXR1cm5zIC0xLiBTbyBkb24ndCBjaGVjayBpZiBDIGlzIEtFWV9ET1dOIG9yIEtFWV9VUC4gQW5kIGRvbid0CisJdXNlIHRoZSBtYWNybyBBU0NJSV9DSEFSIGZvciBDIGV4cGxpY2l0bHkuCisJKiBzdGFnZTIvc2hhcmVkLmggKHRyYW5zbGF0ZV9rZXljb2RlKTogRGVjbGFyZWQuCisJCisyMDAwLTA4LTI0ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyBbR1JVQl9VVElMXTogSW5jbHVkZSBzdGRpby5oIGJlZm9yZQorCXNoYXJlZC5oLiBSZXBvcnRlZCBieSBNYXRoaWV1IENob3VxdWV0LVN0cmluZ2VyCisJPG1jaG91cXVlQGNzLnN0ZXZlbnMtdGVjaC5lZHU+LgorCQorMjAwMC0wOC0yMSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1zZXJpYWwtc3BlZWQtZW11bGF0aW9uKTogTmV3IG9wdGlvbi4KKwkoU0VSSUFMX1NQRUVEX1NJTVVMQVRJT04pOiBOZXcgY29uZGl0aW9uYWwuCisJKiBncnViL01ha2VmaWxlLmFtIChTRVJJQUxfRkxBR1MpOiBOZXcgdmFyaWFibGUuIFNldAorCS1EU1VQUE9SVF9TRVJJQUw9MSBhbmQgLURTSU1VTEFURV9TTE9XTkVTU19PRl9TRVJJQUw9MSwgaWYKKwlTRVJJQUxfU1BFRURfU0lNVUxBVElPTiBpcyBkZWZpbmVkLCBvdGhlcndpc2UsIHNldCBpdCB0bworCW9ubHkgLURTVVBQT1JUX1NFUklBTD0xLgorCShBTV9DRkxBR1MpOiBSZW1vdmVkIC1EU1VQUE9SVF9TRVJJQUw9MSBhbmQgYWRkZWQKKwkkKFNFUklBTF9GTEFHUykuCisJKiBncnViL2FzbXN0dWIuYyBbU0lNVUxBVEVfU0xPV05FU1NfT0ZfU0VSSUFMXSAoc2VyaWFsX3NwZWVkKToKKwlOZXcgdmFyaWFibGUuCisJKGdydWJfc2V0am1wKTogUmVtb3ZlZC4KKwkoZ3J1Yl9sb25nam1wKTogTGlrZXdpc2UuCisJKHNlcmlhbF9nZXRrZXkpIFtTSU1VTEFURV9TTE9XTkVTU19PRl9TRVJJQUxdOiBXYWl0IGZvcgorCTEwMDAwMDAgLyAoU0VSSUFMX1NQRUVEID4+IDMpIG1pY3Jvc2Vjb25kcyB1c2luZyBnZXR0aW1lb2ZkYXkuCisJKHNlcmlhbF9wdXRjaGFyKSBbU0lNVUxBVEVfU0xPV05FU1NfT0ZfU0VSSUFMXTogTGlrZXdpc2UuCisJKHNlcmlhbF9pbml0KSBbU0lNVUxBVEVfU0xPV05FU1NfT0ZfU0VSSUFMXTogU2V0IFNFUklBTF9TUEVFRCB0bworCVNQRUVELgorCSogc3RhZ2UyL2J1aWx0aW5zLmMgKHNlcmlhbF9mdW5jKSBbU1VQUE9SVF9TRVJJQUxdOiBBZGRlZAorCWEgbmV3IG9wdGlvbiwgYC0tc3BlZWQnLgorCShidWlsdGluX3NlcmlhbCk6IEFkZGVkIGEgZGVzY3JpcHRpb24gYWJvdXQgLS1zcGVlZC4KKwkodGVybWluYWxfZnVuYyk6IFdoZW4gZ2V0IGEga2V5IGZyb20gYSBzZXJpYWwgZGV2aWNlLCBpZiBHUlVCIGlzCisJaW4gdGhlIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UsIGNhbGwgZ3J1Yl9sb25nam1wIHdpdGgKKwlSRVNUQVJUX0NNRExJTkVfRU5WLCBpbnN0ZWFkIG9mIGluaXRfcGFnZS4KKwkqIHN0YWdlMi9jbWRsaW5lLmMgKHJlc3RhcnRfY21kbGluZV9lbnYpOiBOZXcgdmFyaWFibGUuCisJKGVudGVyX2NtZGxpbmUpOiBDYWxsIGdydWJfc2V0am1wIHdpdGggUkVTVEFSVF9DTURMSU5FX0VOViBhZnRlcgorCWNhbGxpbmcgaW5pdF9jbWRsaW5lLgorCShydW5fc2NyaXB0KTogUnVuIEJVSUxUSU4tPkZVTkMgd2l0aCBCVUlMVElOX1NDUklQVCBpbnN0ZWFkIG9mCisJQlVJTFRJTl9DTURMSU5FLgorCSogc3RhZ2UyL3NoYXJlZC5oIChCVUlMVElOX1NDUklQVCk6IE5ldyBtYWNyby4KKwlbR1JVQl9VVElMXSAoZ3J1Yl9zZXRqbXApOiBEZWZpbmVkIGFzIHNldGptcC4KKwlbR1JVQl9VVElMXSAoZ3J1Yl9sb25nam1wKTogRGVmaW5lZCBhcyBsb25nam1wLgorCShyZXN0YXJ0X2NtZGxpbmVfZW52KTogRGVjbGFyZWQuCisJCisyMDAwLTA4LTIwICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBjb25maWd1cmUuaW4gKC0tZW5hYmxlLXNlcmlhbCk6IE5ldyBvcHRpb24uIFNlcmlhbCB0ZXJtaW5hbAorCXN1cHBvcnQgd2lsbCBiZSBlbmFibGVkIGJ5IGRlZmF1bHQsIG9uY2UgaXQgaXMgc3RhYmlsaXplZC4KKwkoU0VSSUFMX1NVUFBPUlQpOiBOZXcgY29uZGl0aW9uYWwuCisJKiBncnViL01ha2VmaWxlLmFtIChBTV9DRkxBR1MpOiBBZGRlZCAtRFNVUFBPUlRfU0VSSUFMPTEuCisJKiBncnViL2FzbXN0dWIuYyAoY2xzKTogUmVuYW1lZCB0byAuLi4KKwkoY29uc29sZV9jbHMpOiAuLi4gdGhpcy4KKwkoZ2V0eHkpOiBSZW5hbWVkIHRvIC4uLgorCShjb25zb2xlX2dldHh5KTogLi4uIHRoaXMuCisJKGdvdG94eSk6IFJlbmFtZWQgdG8gLi4uCisJKGNvbnNvbGVfZ290b3h5KTogLi4uIHRoaXMuCisJKiBzdGFnZTIvTWFrZWZpbGUuYW0gKGxpYmdydWJfYV9DRkxBR1MpOiBBZGRlZAorCS1EU1VQUE9SVF9TRVJJQUw9MS4KKwkoTkVUQk9PVF9GTEFHUyk6IE5ldyB2YXJpYWJsZS4KKwkoU0VSSUFMX0ZMQUdTKTogTGlrZXdpc2UuCisJKFNUQUdFMl9DT01QSUxFKTogQWRkZWQgJChORVRCT09UX0ZMQUdTKSBhbmQgJChTRVJJQUxfRkxBR1MpLgorCSogc3RhZ2UyL2FzbS5TIFshU1RBR0UxXzVdIChjbHMpOiBSZW5hbWVkIHRvIC4uLgorCVshU1RBR0UxXzVdIChjb25zb2xlX2Nscyk6IC4uLiB0aGlzLgorCVshU1RBR0UxXzVdIChnZXR4eSk6IFJlbmFtZWQgdG8gLi4uCisJWyFTVEFHRTFfNV0gKGNvbnNvbGVfZ2V0eHkpOiAuLi4gdGhpcy4KKwlbIVNUQUdFMV81XSAoZ290b3h5KTogUmVuYW1lZCB0byAuLi4KKwlbIVNUQUdFMV81XSAoY29uc29sZV9nb3RveHkpOiAuLi4gdGhpcy4KKwkqIHN0YWdlMi9idWlsdGlucy5jICh0ZXJtaW5hbF9mdW5jKTogSWYgdGhlIGJpdCBmbGFnCisJQlVJTFRJTl9DTURMSU5FIGluIEZMQUdTIGlzIHNldCwgY2FsbCBpbml0X3BhZ2UuIEJ1dCB0aGlzIHNob3VsZAorCWJlIGZpeGVkIHNvIHRoYXQgaXQgcmVzdGFydHMgZW50ZXJfY21kbGluZSBpbnN0ZWFkLgorCSogc3RhZ2UyL2NoYXJfaW8uYyBbIVNUQUdFMV81XSAoZ290b3h5KTogTmV3IGZ1bmN0aW9uLgorCVshU1RBR0UxXzVdIChzZXJpYWxfZ290b3h5KTogTGlrZXdpc2UuCisJWyFTVEFHRTFfNV0gKGdldHh5KTogTGlrZXdpc2UuCisJWyFTVEFHRTFfNV0gKHNlcmlhbF9nZXR4eSk6IExpa2V3aXNlLgorCVshU1RBR0UxXzVdIChjbHMpOiBMaWtld2lzZS4KKwlbIVNUQUdFMV81XSAoc2VyaWFsX2Nscyk6IExpa2V3aXNlLgorCSogc3RhZ2UyL3NlcmlhbC5oIChzZXJpYWxfY2xzKTogRGVjbGFyZWQuCisJKHNlcmlhbF9nZXR4eSk6IExpa2V3aXNlLgorCShzZXJpYWxfZ290b3h5KTogTGlrZXdpc2UuCisJKiBzdGFnZTIvc2hhcmVkLmggKGNvbnNvbGVfY2xzKTogTGlrZXdpc2UuCisJKGNvbnNvbGVfZ2V0eHkpOiBMaWtld2lzZS4KKwkoY29uc29sZV9nb3RveHkpOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9zdGFnZTIuYyAocHJpbnRfZW50cmllcyk6IElmIHNlcmlhbCB0ZXJtaW5hbCBpcworCWVuYWJsZWQsIHByaW50IEFDU19VQVJST1cgYW5kIEFDU19EQVJST1cgaW5zdGVhZCBvZiBESVNQX1VQIGFuZAorCURJU1BfRE9XTiwgcmVzcGVjdGl2ZWx5LgorCShwcmludF9ib3JkZXIpOiBJZiBzZXJpYWwgdGVybWluYWwgaXMgZW5hYmxlZCwgcHJpbnQKKwlBQ1NfVUxDT1JORVIsIEFDU19VUkNPUk5FUiwgQUNTX0xMQ09STkVSLCBBQ1NfTFJDT1JORVIsCisJQUNTX0hMSU5FIGFuZCBBQ1NfVkxJTkUgaW5zdGVhZCBvZiBESVNQX1VMLCBESVNQX1VSLCBESVNQX0xMLAorCURJU1BfTFIsIERJU1BfSE9SSVogYW5kIERJU1BfVkVSVCwgcmVzcGVjdGl2ZWx5LgorCShwcmludF9ib3JkZXIpIFtTVVBQT1JUX1NFUklBTF06IENvbG9yIHRoZSBtZW51IG9ubHkgaWYgY29uc29sZQorCWlzIHVzZWQuCisJKHNldF9saW5lKTogVGFrZSB0d28gbW9yZSBhcmd1bWVudHMsIEVOVFJZTk8gYW5kIE1FTlVfRU5UUklFUy4KKwkoc2V0X2xpbmVfbm9ybWFsKTogTGlrZXdpc2UuCisJKHNldF9saW5lX2hpZ2hsaWdodCk6IExpa2V3aXNlLgorCShzZXRfbGluZSkgW1NVUFBPUlRfU0VSSUFMXTogSWYgc2VyaWFsIHRlcm1pbmFsIGlzIGVuYWJsZWQsIGdldAorCXRoZSBtZW51IGVudHJ5IHdob3NlIGF0dHJpYnV0ZXMgYXJlIGJlaW5nIGNoYW5nZWQgYW5kIHJlZHJhdyB0aGUKKwlsaW5lLgorCShzZXRfbGluZV9oaWdobGlnaHQpIFtTVVBQT1JUX1NFUklBTF06IElmIHNlcmlhbCB0ZXJtaW5hbCBpcworCWVuYWJsZWQsIHByaW50IGBFU0MgWyA3IG0nIGFuZCBgRVNDIFsgMCBtJyBiZWZvcmUgYW5kIGFmdGVyCisJY2FsbGluZyBzZXRfbGluZSwgcmVzcGVjdGl2ZWx5LgorCShydW5fbWVudSkgW1NVUFBPUlRfU0VSSUFMXTogQ2FsbCBub2N1cnNvciBvbmx5IGlmIGNvbnNvbGUgaXMKKwl1c2VkLgorCQorMjAwMC0wOC0yMCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCU5vdyB0aGUgc2VyaWFsIGNvbnNvbGUgc3VwcG9ydCBpcyBwYXJ0aWFsbHkgd29ya2luZy4KKwkKKwkqIGdydWIvYXNtc3R1Yi5jIChzZXJpYWxfY2hlY2trZXkpOiBTcGVjaWZ5IGEgcG9pbnRlciB0byBUSU1FT1VUCisJYXMgdGhlIGZpZnRoIGFyZ3VtZW50IHRvIHNlbGVjdC4KKwkoc2VyaWFsX2dldF9wb3J0KTogTmV3IGZ1bmN0aW9uLiBKdXN0IGEgZHVtbXkuCisJKHNlcmlhbF9pbml0KTogSWYgYSBzZXJpYWwgZGV2aWNlIGlzIG9wZW5lZCwgY2xvc2UgU0VSSUFMX0ZECisJYmVmb3JlIG9wZWluZyBhIG5ldyBzZXJpYWwgZGV2aWNlLgorCURvbid0IHNwZWNpZnkgT19OREVMQVkgdG8gb3Blbi4KKwkqIHN0YWdlMi9idWlsdGlucy5jIFtTVVBQT1JUX1NFUklBTF06IEluY2x1ZGUgc2VyaWFsLmguCisJKHNlcmlhbF9mdW5jKTogTmV3IGZ1bmN0aW9uLgorCShidWlsdGluX3NlcmlhbCk6IE5ldyB2YXJpYWJsZS4KKwkodGVybWluYWxfZnVuYyk6IE5ldyBmdW5jdGlvbi4KKwkoYnVpbHRpbl90ZXJtaW5hbCk6IE5ldyB2YXJpYWJsZS4KKwkoYnVpbHRpbl90YWJsZSk6IEFkZCBwb2ludGVycyB0byBCVUlMVElOX1NFUklBTCBhbmQKKwlCVUlMVElOX1RFUk1JTkFMLgorCSogc3RhZ2UyL2NoYXJfaW8uYyBbU1VQUE9SVF9TRVJJQUxdOiBJbmNsdWRlIHNlcmlhbC5oLgorCShnZXRrZXkpIFtTVVBQT1JUX1NFUklBTF06IElmIGJvdGggVEVSTUlOQUxfQ09OU09MRSBhbmQKKwlURVJNSU5BTF9TRVJJQUwgYXJlIHNldCBpbiBURVJNSU5BTCBzaW11bHRhbmVvdXNseSwgcHJpbnQgYQorCXdhcm5pbmcgYW5kIGZvcmNlIHRoZSBjb25zb2xlIHRlcm1pbmFsLgorCShjaGVja2tleSkgW1NVUFBPUlRfU0VSSUFMXTogSWYgVEVSTUlOQUxfU0VSSUFMIGlzIHNldCBpbgorCVRFUk1JTkFMLCBjYWxsIHNlcmlhbF9jaGVja2tleS4KKwkoZ3J1Yl9wdXRjaGFyKSBbU1VQUE9SVF9TRVJJQUxdOiBJZiBURVJNSU5BTF9TRVJJQUwgaXMgc2V0IGluCisJVEVSTUlOQUwsIGNhbGwgc2VyaWFsX3B1dGNoYXIuIElmIEMgaXMgYSBuZXdsaW5lLCBwcmludCBhCisJY2FycmlhZ2UgcmV0dXJuLCBiZWZvcmUgcHJpbnRpbmcgYSBuZXdsaW5lLgorCQorMjAwMC0wOC0xNSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCVRoZSBpbWFnZSBgbmJncnViJyBub3cgcmVsb2NhdGVzIGl0c2VsZiBmcm9tIDB4MTAwMDAgdG8gMHg4MDAwLAorCXNpbmNlIHRoZSBOZXR3b3JrIEJvb3QgSW1hZ2UgUHJvcG9zYWwgZG9lc24ndCBwZXJtaXQgYSBzZWNvbmQKKwlsb2FkZXIgdG8gYmUgbG9hZGVkIGJlbG93IDB4MTAwMDAuIFJlcG9ydGVkIGJ5IE1hdHRoaWFzCisJS3JldHNjaG1lciA8TWNDcmF0Y2hAZ214Lm5ldD4uCisJCisJKiBNYWtlZmlsZS5hbSAoTkJMT0FERVJfTElOSyk6IE5ldyB2YXJpYWJsZS4KKwkobmJsb2FkZXJfZXhlY19MREZMQUdTKTogU2V0IHRvICQoTkJMT0FERVJfTElOSykgaW5zdGVhZCBvZgorCSQoU1RBUlRfTElOSykuCisJKiBzdGFnZTIvbmJpLmggKE5CSV9ERVNUX0FERFIpOiBDaGFuZ2VkIHRvIDB4MTAwMDAuCisJKE5CSV9ERVNUX1NFRyk6IE5ldyBtYWNyby4KKwkoTkJJX0RFU1RfT0ZGKTogTGlrZXdpc2UuCisJKFJFTE9DQVRFRF9BRERSKTogTGlrZXdpc2UuCisJKFJFTE9DQVRFRF9TRUcpOiBMaWtld2lzZS4KKwkoUkVMT0NBVEVEX09GRik6IExpa2V3aXNlLgorCShTVEFHRTJfU1RBUlRfQUREUik6IExpa2V3aXNlLgorCSogc3RhZ2UyL25ibG9hZGVyLlM6IEFkZGVkIC5jb2RlMTYgZGlyZWN0aXZlIGF0IHRoZSBzdGFydCBvZiB0aGUKKwljb2RlLgorCVNldCB0aGUgc2VnbWVudCBhbmQgdGhlIG9mZnNldCBvZiB0aGUgbG9hZCBhZGRyZXNzIHRvCisJTkJJX0RFU1RfU0VHIGFuZCBOQklfREVTVF9PRkYsIHJlc3BlY3RpdmVseS4KKwlTZXQgdGhlIHNlZ21lbnQgYW5kIHRoZSBvZmZzZXQgb2YgdGhlIHN0YXJ0IGFkZHJlc3MgdG8KKwlOQklfREVTVF9TRUcgYW5kIE5CSV9ERVNUX09GRiArIHJlbG9jYXRlIC0gX3N0YXJ0LCByZXNwZWN0aXZlbHkuCisJQWRkZWQgYSByb3V0aW5lIGZvciByZWxvY2F0aW5nIGl0c2VsZi4KKwkocmVsb2NhdGUpOiBOZXcgbGFiZWwuCisJKGNvcHlfcmVzdCk6IExpa2V3aXNlLgorCShjb3B5X2xvb3ApOiBMaWtld2lzZS4KKwkoY29weSk6IExpa2V3aXNlLgorCShib290X3N0YWdlMik6IExpa2V3aXNlLgorCQorMjAwMC0wOC0xMyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogZ3J1Yi9tYWluLmMgKG1haW4pOiBNb3ZlIHRoZSB2ZXJzaW9uIG51bWJlciBpbnNpZGUgdGhlCisJcGFyZW50aGVzZXMsIHNpbmNlIHRoZSBncnViIHNoZWxsIGlzIG1lcmVseSBvbmUgb2YgdGhlIHByb2dyYW1zCisJaW5jbHVkZWQgaW4gR05VIEdSVUIuCisJCisyMDAwLTA4LTEzICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJQWRkIGEgc2VyaWFsIGRldmljZSBlbXVsYXRpb24gaW50byB0aGUgZ3J1YiBzaGVsbC4KKwkKKwkqIGdydWIvYXNtc3R1Yi5jOiBJbmNsdWRlIHN5cy90aW1lLmggYW5kIHRlcm1pb3MuaC4KKwkoc2VyaWFsX2ZkKTogTmV3IHZhcmlhYmxlLgorCShzZXJpYWxfZGV2aWNlKTogTGlrZXdpc2UuCisJKHNlcmlhbF9nZXRrZXkpOiBOZXcgZnVuY3Rpb24uCisJKHNlcmlhbF9jaGVja2tleSk6IExpa2V3aXNlLgorCShzZXJpYWxfcHV0Y2hhcik6IExpa2V3aXNlLgorCShnZXRfdGVybWlvc19zcGVlZCk6IExpa2V3aXNlLgorCShzZXJpYWxfaW5pdCk6IExpa2V3aXNlLgorCShzZXRfc2VyaWFsX2RldmljZSk6IExpa2V3aXNlLgorCShncnViX3N0YWdlMik6IFJlc3RvcmUgU0VSSUFMX0RFVklDRSBhbmQgU0VSSUFMX0ZELCBpZiB0aGV5IHdlcmUKKwlhbGxvY2F0ZWQuCisJKiBzdGFnZTIvc2VyaWFsLmggW0dSVUJfVVRJTF0gKHNldF9zZXJpYWxfZGV2aWNlKTogRGVjbGFyZWQuCisJCisyMDAwLTA4LTEzICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvYXNtLlMgKGNvZGVzdGFydCkgW1NVUFBPUlRfRElTS0xFU1NdOiBEb24ndCByZXNldCBhCisJZGlzayBzeXN0ZW0uIFRoYXQgaXMgbm90IG9ubHkgdW5jZXNzYXJ5IGJ1dCBhbHNvIGhhcm1mdWwuCisJCisyMDAwLTA4LTEyICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJQWRkIGEgc2VyaWFsIGRldmljZSBkcml2ZXIgKGJ1dCBvbmx5IHRoZSBkcml2ZXIpLgorCQorCSogc3RhZ2UyL3NlcmlhbC5jOiBOZXcgZmlsZS4KKwkqIHN0YWdlMi9zZXJpYWwuaDogTGlrZXdpc2UuCisJKiBzdGFnZTIvc2hhcmVkLmggKHNlcmlhbF9nZXRrZXkpOiBNb3ZlZCB0byBzdGFnZTIvc2VyaWFsLmguCisJKHNlcmlhbF9jaGVja2tleSk6IExpa2V3aXNlLgorCShzZXJpYWxfcHV0Y2hhcik6IExpa2V3aXNlLgorCSogc3RhZ2UyL01ha2VmaWxlLmFtIChub2luc3RfSEVBREVSUyk6IEFkZGVkIHNlcmlhbC5oLgorCShwcmVfc3RhZ2UyX2V4ZWNfU09VUkNFUyk6IEFkZGVkIHNlcmlhbC5jLgorCisyMDAwLTA4LTEwICBQYXZlbCBSb3NraW4gIDxwcm9za2lAZ251Lm9yZz4KKworCSogZG9jcy90dXRvcmlhbC50ZXhpOiBNaW5vciBmaXhlcy4KKworMjAwMC0wOC0xMCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogZG9jcy90dXRvcmlhbC50ZXhpIChJbnN0YWxsYXRpb24pOiBEaXZpZGVkIGludG8gdGhyZWUgc2VjdGlvbnMKKwlpbnN0ZWFkIG9mIHR3byBzZWN0aW9ucy4gRG9uJ3QgZGVzY3JpYmUgdGhlIHVzYWdlIG9mIHRoZSB0aGUKKwlncnViIHNoZWxsIGFueSBsb25nZXIuIEluc3RlYWQsIGhvdyB0byB1c2UgZ3J1Yi1pbnN0YWxsIGlzCisJZG9jdW1lbnRlZC4KKwkKKzIwMDAtMDgtMDkgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9idWlsdGlucy5jIFtHUlVCX1VUSUxdOiBJbmNsdWRlIHN0ZGlvLmguCisJKGVtYmVkX2Z1bmMpIFtHUlVCX1VUSUwgJiYgX19saW51eF9fXTogV2hlbiBlbWJlZGRpbmcgYSBTdGFnZQorCTEuNSBpbnRvIGEgcGFydGl0aW9uLCBjYWxsIHdyaXRlX3RvX3BhcnRpdGlvbiBpbnN0ZWFkIG9mCisJYmlvc2Rpc2suCisJKGluc3RhbGxfZnVuYyk6IFNldCBERVNUX1BBUlRJVElPTiB0byB0aGUgcGFydGl0aW9uIHdoZXJlIFN0YWdlCisJMSByZXNpZGVzLgorCVNldCBTUkNfUEFSVF9TVEFSVCB0byB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgcGFydGl0aW9uCisJd2hlcmUgU3RhZ2UgMiByZXNpZGVzLgorCShpbnN0YWxsX2Z1bmMpIFtHUlVCX1VUSUxdOiBTZXQgU1RBR0UyX09TX0ZJTEUgdG8gdGhlIGZpbGUgbmFtZQorCW9mIFN0YWdlIDIgdW5kZXIgYW4gT1MsIGlmIHRoZSBuZXcgb3B0aW9uICItLXN0YWdlMiIgaXMKKwlzcGVjaWZpZWQuIE90aGVyd2lzZSwgc2V0IGl0IHRvIG51bGwuCisJSWYgU1RBR0UyX09TX0ZJTEUgaXMgbm90IG51bGwsIG1vZGlmeSB0aGUgU3RhZ2UgMiB2aWEgdGhlCisJZmlsZXN5c3RlbSBzZXJ2aWNlZCBieSB0aGUgT1MuCisJKGluc3RhbGxfZnVuYykgW0dSVUJfVVRJTCAmJiBfX2xpbnV4X19dOiBJZiBTVEFHRTJfT1NfRklMRSBpcworCW51bGwgYnV0IHRoZSBTdGFnZTIgcmVzaWRlcyBpbiBhIHBhcnRpdGlvbiwgdXNlCisJd3JpdGVfdG9fcGFydGl0aW9uLgorCUlmIERFU1RfUEFSVElUSU9OIGlzIG5vdCAweEZGRkZGRiwgdXNlIHdyaXRlX3RvX3BhcnRpdGlvbiwgdG8KKwllbWJlZCBTdGFnZSAxLgorCShzZXR1cF9mdW5jKSBbR1JVQl9VVElMXTogSWYgLS1zdGFnZTIgaXMgc3BlY2lmaWVkLCBzZXQKKwlTVEFHRTJfQVJHIHRvIHRoZSBzdHJpbmcgcG9pbnRpbmcgdG8gdGhlIG9wdGlvbi4gT3RoZXJ3aXNlLCBzZXQKKwlpdCB0byBudWxsLgorCShzZXR1cF9mdW5jKSBbIUdSVUJfVVRJTF06IFNldCBTVEFHRTJfQVJHIHRvIG51bGwuCisJKHNldHVwX2Z1bmMpOiBJZiBTVEFHRTJfQVJHIGlzIG5vdCBudWxsLCBhZGQgU1RBR0UyX0FSRyBhbmQgYQorCXNwYWNlIGNoYXJhY3RlciBpbnRvIENNRF9BUkcuCisJKiBsaWIvZGV2aWNlLmMgKF9MQVJHRUZJTEVfU09VUkNFKTogRGVmaW5lZC4KKwkoX0ZJTEVfT0ZGU0VUX0JJVFMpOiBMaWtld2lzZS4KKwlbX19saW51eF9fXSAod3JpdGVfdG9fcGFydGl0aW9uKTogTmV3IGZ1bmN0aW9uLgorCSogbGliL2RldmljZS5oIFtfX2xpbnV4X19dICh3cml0ZV90b19wYXJ0aXRpb24pOiBEZWNsYXJlZC4KKwkqIHV0aWwvZ3J1Yi1pbnN0YWxsLmluOiBTcGVjaWZ5IHRoZSBvcHRpb24gIi0tc3RhZ2UyIiBmb3IgdGhlCisJY29tbWFuZCAic2V0dXAiLgorCQorMjAwMC0wOC0wNCAgSm9jaGVuIEhvZW5pY2tlICA8am9jaGVuQGdudS5vcmc+CisKKwkqIHN0YWdlMi9mc3lzX2ZhdC5jIChmYXRfc3VwZXJibG9jayk6IGNsdXN0X2VvZl9tYXJrZXIgYWRkZWQuCisJKGZhdF9tb3VudCk6IEluaXRpYWxpemUgY2x1c3RfZW9mX21hcmtlciB0byAweGZmOCwgMHhmZmY4LCBvcgorCTB4ZmZmZmZmOCwgZGVwZW5kaW5nIG9uIGZhdCBzaXplLiAgU3VwcG9ydCBmb3Igc2luZ2xlIGFjdGl2ZSBGQVQKKwlhZGRlZCAoRkFUMzIgZXh0ZW5zaW9uKS4gQ2hhbmdlZCB0aGUgYm91bmRhcnkgYmV0d2VlbiBGQVQxMiBhbmQKKwlGQVQxNiwgYWdhaW4uICBUaGUgTWljcm9zb2Z0IEtCIGFydGljbGUgUTY1NTQxIHNlZW1zIHRvIGJlIHdyb25nCisJaGVyZSwgSSBnbyB3aXRoIG10b29scyBhbmQgdGhlIHByZXZpb3VzIGJlaGF2aW91ciBvZiBncnViOiBGQVQxMgorCWlmZiBudW1iZXIgb2YgY2x1c3RlcnMgKHdpdGhvdXQgY291bnRpbmcgdGhlIHR3byBub25leGlzdGluZworCWNsdXN0ZXJzKSBpcyBsZXNzIG9yIGVxdWFsIDQwOTUuCisJKGZhdF9yZWFkKTogUmVwb3J0IGVycm9yIGlmIGNsdXN0ZXIgbnVtYmVyIGlzIHRvbyBiaWcsIGJ1dCBub3QKKwlncmVhdGVyIG9yIGVxdWFsIGNsdXN0X2VvZl9tYXJrZXIuCisJKiBzdGFnZTIvZnN5c19yZWlzZXJmcy5jIChqb3VybmFsX2luaXQpOiBGaXhlZCBjYWxjdWxhdGlvbiBvZgorCWpvdXJuYWxfdHJhbnNhY3Rpb24uCisJCisyMDAwLTA4LTAxICBKb2NoZW4gSG9lbmlja2UgIDxqb2NoZW5AZ251Lm9yZz4KKworCSogc3RhZ2UyL2ZzeXNfcmVpc2VyZnMuYzogU3ltbGluayBzdXBwb3J0IGFkZGVkLgorCShTX0lTTE5LKTogTmV3IG1hY3JvLgorCShQQVRIX01BWCk6IExpa2V3aXNlLgorCShNQVhfTElOS19DT1VOVCk6IExpa2V3aXNlLgorCShyZWlzZXJmc19kaXIpOiBDaGVjayBmb3Igc3ltbGluayBhbmQgaGFuZGxlIHRoZW0uCisJKHJlYWRfdHJlZV9ub2RlKTogVGFrZSBhIGJsb2NrIG51bWJlciBhbmQgY2hlY2sgaWYgdHJlZSBub2RlIHdhcworIAlhbHJlYWR5IHJlYWQgaW4uICBJZiBub3QgdXBkYXRlIHRoZSBJTkZPLT5ibG9ja3MgZmllbGQuCisJKG5leHRfa2V5KTogQ2hhbmdlZCBjYWxsIG9mIHJlYWRfdHJlZV9ub2RlLgorCShzZWFyY2hfc3RhdCk6IExpa2V3aXNlLgorCShqb3VybmFsX2luaXQpOiBGaXhlZCBhIHNtYWxsIGJ1Zy4gIFNvbWUgZGVidWdnaW5nIG1lc3NhZ2VzIGFkZGVkLgorCQorMjAwMC0wNy0zMSAgUGF2ZWwgUm9za2luICA8cHJvc2tpQGdudS5vcmc+CisKKwkqIGdydWIvYXNtc3R1Yi5jIChiaW9zZGlzaykgW19fbGludXhfX106IFRoZSBmaXJzdCBhcmd1bWVudCBmb3IKKwlfbGxzZWVrIHJlbmFtZWQgZnJvbSAic2Vla2VkX2ZkIiB0byAiZmlsZWRlcyIuCisKKzIwMDAtMDctMzAgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIGRvY3MvYXBwZW5kaWNlcy50ZXhpIChGQVEpOiBBZGRlZCB0aGUgYW5zd2VyIGZvciB0aGUgc2VwYXJhdGUKKwlib290IHBhcnRpdGlvbiBwcm9ibGVtLgorCQorMjAwMC0wNy0zMCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCVVwZGF0ZSB0aGUgbmV0d29yayBzdXBwb3J0IHRvIEV0aGVyYm9vdC00LjYuNC4KKwkKKwlGcm9tIERhbmllbCBXYWduZXIgPHdhZ2lAZ214LmNoPjoKKwkqIG5ldGJvb3QvM2M1MDkuYzogQ29waWVkIGZyb20gRXRoZXJib290LTQuNi40LgorCSogbmV0Ym9vdC8zYzUwOS5oOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvY2FyZHMuaDogTGlrZXdpc2UuCisJKiBuZXRib290L25zODM5MC5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3Qvc2tfZzE2LmM6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9za19nMTYuaDogTGlrZXdpc2UuCisJKiBuZXRib290L3R1bGlwLmM6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9wY2kuaDogTGlrZXdpc2UuCisJKiBuZXRib290L21haW4uYyAoZGhjcGRpc2NvdmVyKTogVXBkYXRlZC4KKwkoZGhjcHJlcXVlc3QpOiBMaWtld2lzZS4KKwkoYm9vdHApOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvUkVBRE1FLm5ldGJvb3Q6IEFkZGVkIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbmV3CisJb3B0aW9uIC0tZW5hYmxlLW5zODM5MC1mb3JjZS0xNmJpdC4KKwkqIGNvbmZpZ3VyZS5pbiAoLS1lbmFibGUtbnM4MzkwLWZvcmNlLTE2Yml0KTogTmV3IG9wdGlvbi4KKworCSogbmV0Ym9vdC9jb25maWcuYzogVXBkYXRlZC4KKworMjAwMC0wNy0yOSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCVRoZSBMaW51eCB6SW1hZ2Ugc3VwcG9ydCBpcyB3b3JraW5nIG5vdy4KKwkKKwkqIHN0YWdlMi9hc20uUyAobGludXhfYm9vdCk6IEFkZCAzIGludG8gJWVjeCBhbmQgc2hpZnQgJWVjeCB0bworCXRoZSByaWdodCBieSAyIGJpdHMsIGluc3RlYWQgb2Ygc2hpZnQgJWVjeCB0byB0aGUgbGVmdCBieSAyCisJYml0cy4KKwkKKzIwMDAtMDctMjkgIEpvY2hlbiBIb2VuaWNrZSAgPGpvY2hlbkBnbnUub3JnPgorCisJKiBzdGFnZTIvZnN5c19yZWlzZXJmcy5jIChibG9ja19yZWFkKTogQ2hhbmdlZCB0aGUgdmFyaWFibGUgImxlbiIKKwl0byAial9sZW4iIChpdCBzaGFkb3dlZCBhIHBhcmFtZXRlcikuCisJCisyMDAwLTA3LTI5ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBjb25maWd1cmUuaW4gKENQUEZMQUdTKTogQWRkZWQgLVdzaGFkb3csIC1XcG9pbnRlci1hcml0aCBhbmQKKwktV3VuZGVmLCBhcyBHQ0Mgc29tZXRpbWVzIG1vcmUgY2xldmVyIHRoYW4gbWUuIDopCisJKiBzdGFnZTIvc2hhcmVkLmggWyFBU01fRklMRV0gKG11bHRpX2Jvb3QpOiBDaGFuZ2UgdGhlIG5hbWUgb2YKKwl0aGUgc2Vjb25kIGFyZ3VtZW50IGZyb20gIm1iaSIgdG8gIm1iX2luZm8iLgorCVshQVNNX0ZJTEVdIChiaW9zZGlzayk6IFJlbmFtZSB0aGUgZmlyc3QgYXJndW1lbnQgInJlYWQiIHRvCisJInN1YmZ1bmMiLgorCSogbGliL2RldmljZS5oIChpbml0X2RldmljZV9tYXApOiBDaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHRoaXJkCisJYXJndW1lbnQgZnJvbSAiZmxvcHB5X2Rpc2tzIiB0byAibm9fZmxvcHBpZXMiLgorCSogbGliL2RldmljZS5jIChyZWFkX2RldmljZV9tYXApOiBSZW5hbWUgdGhlIGludGVybmFsIGZ1bmN0aW9uCisJInByaW50X2Vycm9yIiB0byAic2hvd19lcnJvciIuCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoaW5zdGFsbF9mdW5jKTogUmVuYW1lIENPTkZJR19GSUxFIHRvCisJUkVBTF9DT05GSUcuCisJKHNldHVwX2Z1bmMpOiBSZW5hbWUgSU5TVEFMTF9EUklWRSwgSU5TVEFMTF9QQVJUSVRJT04gYW5kCisJQ09ORklHX0ZJTEUgdG8gSU5TVEFMTEVEX0RSSVZFLCBJTlNUQUxMRURfUEFSVElUSU9OIGFuZAorCUNPTkZJR19GSUxFTkFNRSwgcmVzcGVjdGl2ZWx5LgorCSogc3RhZ2UyL2NoYXJfaW8uYyAoY29udmVydF90b19hc2NpaSk6IFJlbmFtZSB0aGUgaW50ZXJuYWwKKwl2YXJpYWJsZSBDIHRvIFRNUC4KKwkoZ2V0X2NtZGxpbmUpOiBSZW5hbWUgS0lMTCB0byBLSUxMX0JVRi4KKwlSZW5hbWUgdGhlIHNlY29uZCBhcmd1bWVudCBmb3IgY2xfcHJpbnQgdG8gUkVBTF9FQ0hPX0NIQVIgZnJvbQorCUVDSE9fQ0hBUi4KKwkqIHN0YWdlMi9zdGFnZTIuYyAocnVuX21lbnUpOiBSZW5hbWUgdGhlIGludGVybmFsIHZhcmlhYmxlCisJTlVNX0VOVFJJRVMgdG8gTkVXX05VTV9FTlRSSUVTLgorCShjbWFpbik6IFJlbmFtZSBLSUxMIHRvIEtJTExfQlVGLgorCSogc3RhZ2UyL2Rpc2tfaW5vZGVfZmZzLmg6IENoZWNrIGlmIEJZVEVfTVNGIGlzIGRlZmluZWQgYmVmb3JlCisJY2hlY2tpbmcgdGhlIHZhbHVlLgorCSogc3RhZ2UyL2ZzeXNfZXh0MmZzLmMgKGV4dDJmc19kaXIpOiBDaGVjayBpZiBFMkRFQlVHIGlzCisJZGVmaW5lZCwgaW5zdGVhZCBvZiBpZiB0aGUgdmFsdWUgaXMgbm9uLXplcm8uCisJKiBncnViL2FzbXN0dWIuYzogQ2hlY2sgaWYgX19HTElCQ19fIGlzIGRlZmluZWQgYmVmb3JlIGNoZWNraW5nCisJdGhlIHZhbHVlLgorCShiaW9zZGlzaykgW19fbGludXhfX106IExpa2V3aXNlLgorCVJlbmFtZSB0aGUgZmlyc3QgYXJndW1lbnQgZm9yIF9sbHNlZWsgdG8gInNlZWtlZF9mZCIgZnJvbSAiZmQiLgorCShtdWx0aV9ib290KTogUmVuYW1lIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gIm1iX2luZm8iIGZyb20KKwkibWJpIi4KKwkKKzIwMDAtMDctMjcgIEdvcmRvbiBNYXR6aWdrZWl0ICA8Z29yZEBmaWcub3JnPgorCisJKiB1dGlsL2dydWItaW1hZ2UuaW46IEluaXRpYWwgY3V0IGF0IGEgc2NyaXB0IGZvciBjcmVhdGluZyBHUlVCCisJYm9vdCBpbWFnZXMuCisJKiB1dGlsL01ha2VmaWxlLmFtIChub2luc3RfU0NSSVBUUyk6IEFkZGVkIGdydWItaW1hZ2UuCisJKiBjb25maWd1cmUuaW4gKEFDX09VVFBVVCk6IEFkZGVkIHV0aWwvZ3J1Yi1pbWFnZS4KKworMjAwMC0wNy0yNyAgSm9jaGVuIEhvZW5pY2tlICA8am9jaGVuQGdudS5vcmc+CisKKwkqIHN0YWdlMi9hc20uUyAoY2hlY2tfaW50MTNfZXh0ZW5zaW9ucyk6IEZpeGVkIHRoZSBlZmZlY3Qgb2YKKwl0aGUgLS1mb3JjZS1sYmEgc3dpdGNoIGluIHN0YWdlMi9zdGFnZTFfNS4KKwkKKzIwMDAtMDctMjUgIEpvY2hlbiBIb2VuaWNrZSAgPGpvY2hlbkBnbnUub3JnPgorCisJKiBzdGFnZTIvZnN5c19mYXQuYyAoZmF0X21vdW50KTogRml4ZWQgY2FsY3VsYXRpb24gb2YgbnVtX2NsdXN0LgorCUl0IHdhcyBvZmYgYnkgdHdvLCBzaW5jZSB0aGUgdHdvIG5vbiBleGlzdGluZyBjbHVzdGVycyAwIGFuZCAxCisJd2VyZSBub3QgdGFrZW4gaW50byBhY2NvdW50LiAgQWxzbyBmaXhlZCB0aGUgYm91bmRhcnkgYmV0d2VlbgorCUZBVDEyIGFuZCBGQVQxNi4KKwkKKzIwMDAtMDctMjUgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9hc20uUyBbIVNUQUdFMV81XSAobGludXhfdGV4dF9sZW4pOiBOZXcgdmFyaWFibGUuCisJWyFTVEFHRTFfNV0gKGxpbnV4X2Jvb3QpOiBEb24ndCBzZXQgJWVheCB0byBMSU5VWF9TRVRVUAorCW1lYW5pbmdsZXNzbHkuCisJU2V0ICVlY3ggdG8gTElOVVhfVEVYVF9MRU4gaW5zdGVhZCBvZiBMSU5VWF9LRVJORUxfTUFYTEVOLgorCVshU1RBR0UxXzVdIChiaWdfbGludXhfYm9vdCk6IERpc2FibGUgaW50ZXJydXB0cyBiZWZvcmUgY2hhbmdpbmcKKwl0aGUgc3RhY2sgcG9pbnRlci4KKwlDaGFuZ2UgJXNzIHJpZ2h0IGJlZm9yZSAlc3AuCisJUmV2ZXJzZSB0aGUgYXJndW1lbnRzIGZvciBsam1wLiBBIHNlZ21lbnQgbXVzdCBiZSBhZnRlciBhbgorCW9mZnNldC4gKnNpZ2gqCisJKiBzdGFnZTIvYm9vdC5jIChsb2FkX2ltYWdlKTogU2V0IExJTlVYX1RFWFRfTEVOIHRvIFRFWFRfTEVOLAorCWlmIGEgTGludXgga2VybmVsIGlzIGxvYWRlZCBzdWNjZXNzZnVsbHkuCisJKiBzdGFnZTIvc2hhcmVkLmggKExJTlVYX1ZJRF9NT0RFX09GRlNFVCk6IFJlbW92ZWQuCisJWyFBU01fRklMRV0gKGxpbnV4X2tlcm5lbF9oZWFkZXIpOiBDaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIG1lbWJlcgorCWBoZWFwX2VuZF9wdHInIHRvIHVuc2lnbmVkIHNob3J0LgorCVshQVNNX0ZJTEVdIChsaW51eF90ZXh0X2xlbik6IERlY2xhcmVkLgorCQorMjAwMC0wNy0yNCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCUNvbXBseSB3aXRoIHRoZSBMaW51eC9pMzg2IGJvb3QgcHJvdG9jb2wgdmVyc2lvbiAyLjAyLgorCQorCSogc3RhZ2UyL2FzbS5TIFshU1RBR0UxXzVdIChsaW51eF9ib290KTogU2V0IHRoZSBsZW5ndGggb2YgbW92ZWQKKwlieXRlcyB0byBMSU5VWF9LRVJORUxfTUFYTEVOIGluc3RlYWQgb2YKKwlMSU5VWF9LRVJORUxfTEVOX09GRlNFVCglZWF4KSwgc2luY2UgdGhlIGZpZWxkIGlzIG9ic29sZXRlLgorCVshU1RBR0UxXzVdIChiaWdfbGludXhfYm9vdCk6IERvbid0IHVzZSBTRUdNRU5UIG9yIE9GRlNFVC4KKwlJbnN0ZWFkLCBlbWJlZCB0aGUgc2VnbWVudCBhbmQgdGhlIG9mZnNldCBpbiB0aGUgY29kZSBpdHNlbGYuCisJU2V0ICVkcywgJWVzLCAlZnMgYW5kICVncyB0byAlYXggKExJTlVYX0lOSVRfU0VHKS4KKwkqIHN0YWdlMi9ib290LmMgKGxvYWRfaW1hZ2UpOiBSZXdyaXRlIHRoZSBMaW51eCBzdXBwb3J0IGNvZGUKKwloZWF2aWx5LiBVc2UgYSBzdHJ1Y3R1cmUgaW5zdGVhZCBvZiBhIGJhdGNoIG9mIG1hY3JvcywgdG8gYWNjZXNzCisJYSBMaW51eCBrZXJuZWwgaGVhZGVyLgorCShsb2FkX2luaXRyZCk6IElmIE1PVkVUTyBwbHVzIExFTiBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KKwlMSU5VWF9JTklUUkRfTUFYX0FERFJFU1MsIHNldCBNT1ZFVE8gdG8gTElOVVhfSU5JVFJEX01BWF9BRERSRVNTCisJbWludXMgTEVOIHdpdGggcGFnZSBhbGlnbmVkLgorCSogc3RhZ2UyL3NoYXJlZC5oIChMSU5VWF9NQUdJQ19TSUdOQVRVUkUpOiBOZXcgbWFjcm8uCisJKExJTlVYX0RFRkFVTFRfU0VUVVBfU0VDVFMpOiBMaWtld2lzZS4KKwkoTElOVVhfRkxBR19DQU5fVVNFX0hFQVApOiBMaWtld2lzZS4KKwkoTElOVVhfSU5JVFJEX01BWF9BRERSRVNTKTogTGlrZXdpc2UuCisJKExJTlVYX01BWF9TRVRVUF9TRUNUUyk6IExpa2V3aXNlLgorCShMSU5VWF9CT09UX0xPQURFUl9UWVBFKTogTGlrZXdpc2UuCisJKExJTlVYX0hFQVBfRU5EX09GRlNFVCk6IExpa2V3aXNlLgorCShMSU5VWF9TRVRVUF9NQVhMRU4pOiBSZW1vdmVkLgorCShMSU5VWF9LRVJORUxfTEVOX09GRlNFVCk6IExpa2V3aXNlLgorCShMSU5VWF9TRVRVUF9MRU5fT0ZGU0VUKTogTGlrZXdpc2UuCisJKExJTlVYX1NFVFVQX1NUQUNLKTogU2V0IHRvIDB4N0YwMCBpbnN0ZWFkIG9mIDB4M0ZGNCAod2h5IHdhcyBpdAorCXRoaXMgdmFsdWU/KS4KKwkoTElOVVhfU0VUVVBfTE9BREVSKTogUmVtb3ZlZC4KKwkoTElOVVhfU0VUVVBfTE9BRF9GTEFHUyk6IExpa2V3aXNlLgorCShMSU5VWF9TRVRVUF9DT0RFX1NUQVJUKTogTGlrZXdpc2UuCisJKExJTlVYX1NFVFVQX0lOSVRSRCk6IExpa2V3aXNlLgorCShDTF9NWV9MT0NBVElPTik6IFNldCB0byBSQVdfQUREUigweDk3RjAwKSBpbnN0ZWFkIG9mCisJUkFXX0FERFIoMHg5MjAwMCkuCisJKENMX01ZX0VORF9BRERSKTogU2V0IHRvIFJBV19hZGRyKDB4OTdGRkYpIGluc3RlYWQgb2YKKwlSQVdfQUREUigweDkyMEZGKS4KKwkoQ0xfTUFHSUNfQUREUik6IFJlbW92ZWQuCisJKENMX09GRlNFVCk6IExpa2V3aXNlLgorCVshQVNNX0ZJTEVdIChzdHJ1Y3QgbGludXhfa2VybmVsX2hlYWRlcik6IE5ldyBzdHJ1Y3R1cmUgdGFnLgorCQorMjAwMC0wNy0yMyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogZG9jcy90dXRvcmlhbC50ZXhpOiBGaXggc29tZSBzeW50YXggZXJyb3JzIGFuZCBhbWJpZ3VvdXMKKwlzZW50ZW5jZXMuIFN1Z2dlc3RlZCBieSBNLiBNZWlhcmFzaGkgPG1lc0BzdC5yaW0ub3IuanA+LgorCQorMjAwMC0wNy0xNCAgS2hpbWVua28gVmljdG9yICA8Z3J1YkBraGltLnNjaDU3Lm1zay5ydT4KKworCSogc3RhZ2UyL2Jvb3QuYyAobG9hZF9pbWFnZSk6IFdoZW4gZ2V0dGluZyB0aGUgdGV4dCBsZW5ndGggb2YgYSAKKwlMaW51eCBrZXJuZWwsIHVzZSB1bnNpZ25lZCBsb25nIGluc3RlYWQgb2YgdW5zaWduZWQgc2hvcnQuCisJCisyMDAwLTA3LTEzICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBsaWIvZGV2aWNlLmM6IEluY2x1ZGUgZXJybm8uaC4gUmVwb3J0ZWQgYnkgVGhpZXJyeSBERUxIQUlTRQorCTx0aGllcnJ5LmRlbGhhaXNlQGRlbGhhaXNlLmNvbT4uCisJCisyMDAwLTA3LTEyICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJSnVzdCB0byBzdGFydCBpbXBsZW1lbnRpbmcgc2VyaWFsIGNvbnNvbGUgc3VwcG9ydC4uLgorCQorCSogc3RhZ2UyL2FzbS5TIChncnViX3B1dGNoYXIpOiBSZW5hbWVkIHRvIC4uLgorCShjb25zb2xlX3B1dGNoYXIpOiAuLi4gdGhpcy4KKwlbIVNUQUdFMV81XSAoZ2V0a2V5KTogUmVuYW1lZCB0byAuLi4KKwlbIVNUQUdFMV81XSAoY29uc29sZV9nZXRrZXkpOiAuLi4gdGhpcy4KKwlbIVNUQUdFMV81XSAoY2hlY2trZXkpOiBSZW5hbWVkIHRvIC4uLgorCVshU1RBR0UxXzVdIChjb25zb2xlX2NoZWNra2V5KTogLi4uIHRoaXMuCisJKiBzdGFnZTIvY2hhcl9pby5jIFshU1RBR0UxXzVdIChnZXRrZXkpOiBOZXcgZnVuY3Rpb24uCisJWyFTVEFHRTFfNV0gKGNoZWNra2V5KTogTGlrZXdpc2UuCisJKGdydWJfcHV0Y2hhcik6IExpa2V3aXNlLgorCSogc3RhZ2UyL3NoYXJlZC5oIFshU1RBR0UxXzVdICh0ZXJtaW5hbCk6IERlY2xhcmVkLgorCVshU1RBR0UxXzVdIChURVJNSU5BTF9DT05TT0xFKTogTmV3IG1hY3JvLgorCVshU1RBR0UxXzVdIChURVJNSU5BTF9TRVJJQUwpOiBMaWtld2lzZS4KKwkoY29uc29sZV9wdXRjaGFyKTogRGVjbGFyZWQuCisJKHNlcmlhbF9wdXRjaGFyKTogTGlrZXdpc2UuCisJKGNvbnNvbGVfZ2V0a2V5KTogTGlrZXdpc2UuCisJKHNlcmlhbF9nZXRrZXkpOiBMaWtld2lzZS4KKwkoY29uc29sZV9jaGVja2tleSk6IExpa2V3aXNlLgorCShzZXJpYWxfY2hlY2trZXkpOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9idWlsdGlucy5jICh0ZXJtaW5hbCk6IE5ldyBnbG9iYWwgdmFyaWFibGUuIFRoZSBkZWZhdWx0CisJaXMgVEVSTUlOQUxfQ09OU09MRS4KKwkqIGdydWIvYXNtc3R1Yi5jIChncnViX3B1dGNoYXIpOiBSZW5hbWVkIHRvIC4uLgorCShjb25zb2xlX3B1dGNoYXIpOiAuLi4gdGhpcy4KKwkoZ2V0a2V5KTogUmVuYW1lZCB0byAuLi4KKwkoY29uc29sZV9nZXRrZXkpOiAuLi4gdGhpcy4KKwkoY2hlY2trZXkpOiBSZW5hbWVkIHRvIC4uLgorCShjb25zb2xlX2NoZWNra2V5KTogLi4uIHRoaXMuCisJCisyMDAwLTA3LTEyICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvTWFrZWZpbGUuYW0gKGxpYmdydWJfYV9DRkxBR1MpOiBBZGRlZAorCS1JJCh0b3Bfc3JjZGlyKS9saWIuCisJKiBzdGFnZTIvYnVpbHRpbnMuYyBbR1JVQl9VVElMXTogSW5jbHVkZSBkZXZpY2UuaC4KKwkKKzIwMDAtMDctMTIgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwlTZWdyZWF0ZSBPUy1zcGVjaWZpYyBoZWxwZXIgZnVuY3Rpb25zIGZyb20gYXNtc3R1Yi5jLgorCQorCSogZ3J1Yi9hc21zdHViLmMgW19fbGludXhfX106IERvbid0IGluY2x1ZGUgbGludXgvaGRyZWcuaCwKKwlsaW51eC9tYWpvci5oLCBsaW51eC9rZGV2X3QuaCwgb3IgbGludXgvY2Ryb20uaC4KKwlbX19GcmVlQlNEX18gfHwgX19OZXRCU0RfXyB8fCBfX09wZW5CU0RfX106IERvbid0IGluY2x1ZGUKKwlzeXMvaW9jdGwuaCwgc3lzL2Rpc2tsYWJlbC5oLCBvciBzeXMvaW9jdGwuaC4KKwlbSEFWRV9PUEVORElTS106IERvbid0IGluY2x1ZGUgdXRpbC5oLgorCUluY2x1ZGUgZGV2aWNlLmguCisJKERFRkFVTFRfRkRfQ1lMSU5ERVJTKTogUmVtb3ZlZC4KKwkoREVGQVVMVF9GRF9IRUFEUyk6IExpa2V3aXNlLgorCShERUZBVUxUX0ZEX1NFQ1RPUlMpOiBMaWtld2lzZS4KKwkoREVGQVVMVF9IRF9DWUxJTkRFUlMpOiBMaWtld2lzZS4KKwkoREVGQVVMVF9IRF9IRUFEUyk6IExpa2V3aXNlLgorCShERUZBVUxUX0hEX1NFQ1RPUlMpOiBMaWtld2lzZS4KKwkoTlVNX0RJU0tTKTogTGlrZXdpc2UuCisJKGluaXRfZGV2aWNlX21hcCk6IExpa2V3aXNlLgorCShnZXRfZmxvcHB5X2Rpc2tfbmFtZSk6IExpa2V3aXNlLgorCShnZXRfaWRlX2Rpc2tfbmFtZSk6IExpa2V3aXNlLgorCShnZXRfc2NzaV9kaXNrX25hbWUpOiBMaWtld2lzZS4KKwkoY2hlY2tfZGV2aWNlKTogTGlrZXdpc2UuCisJKGdldF9kcml2ZV9nZW9tZXRyeSk6IExpa2V3aXNlLgorCSogZ3J1Yi9tYWluLmMgKG5vX2Zsb3BweSk6IFJlbW92ZWQuCisJKHByb2JlX3NlY29uZF9mbG9wcHkpOiBMaWtld2lzZS4KKwkoZmxvcHB5X2Rpc2tzKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KKwkobWFpbik6IFNldCBGTE9QUFlfRElTS1MgdG8gemVybywgaWYgT1BUX05PX0ZMT1BQWS4gU2V0CisJRkxPUFBZX0RJU0tTIHRvIHR3bywgaWYgT1BUX1BST0JFX1NFQ09ORF9GTE9QUFkuCisJKiBsaWIvTWFrZWZpbGUuYW0gKEFNX0NGTEFHUyk6IE5ldyB2YXJpYWJsZS4KKwkqIGxpYi9kZXZpY2UuaDogTmV3IGZpbGUuCisJKiBsaWIvZGV2aWNlLmM6IExpa2V3aXNlLgorCSogc3RhZ2UyL3NoYXJlZC5oIChub19mbG9wcHkpOiBSZW1vdmVkLgorCShwcm9iZV9zZWNvbmRfZmxvcHB5KTogTGlrZXdpc2UuCisJKGNoZWNrX2RldmljZSk6IExpa2V3aXNlLgorCShmbG9wcHlfZGlza3MpOiBEZWNsYXJlZC4KKwkKKzIwMDAtMDctMDIgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIGdydWIvbWFpbi5jICh1c2FnZSk6IEVuY2xvc2UgdGhlIG1haWwgYWRkcmVzcyB3aXRoIHBhcmVudGhlc2VzCisJYW5kIGFkZCBhIHBlcmlvZCBpbnRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuIFRoYXQncyBqdXN0IGEKKwljb3NtZXRpYyBjaGFuZ2UuCisJCisyMDAwLTA3LTAyICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBkb2NzL2FwcGVuZGljZXMudGV4aSAoT2J0YWluaW5nIGFuZCBCdWlsZGluZyBHUlVCKTogSW5kaWNhdGUKKwl0aGUgQ3lnbnVzJ3MgYmludXRpbHMgd2VicGFnZSBpbnN0ZWFkIG9mIHRoZSBoamwncyBzaXRlLCBzaW5jZQorCXlvdSBjYW4gbm93IHVzZSBhIHB1YmxpYyByZWxlYXNlIChpLmUuIDIuMTApLgorCQorMjAwMC0wNi0yMyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UyL2Jvb3QuYyAobG9hZF9pbWFnZSk6IFRha2UgYW4gYWRkaXRpb25hbCBhcmd1bWVudAorCUxPQURfRkxBR1MuCisJSWYgdGhlIGtlcm5lbCB0eXBlIGlzIExpbnV4IGFuZCB0aGUgYml0CisJS0VSTkVMX0xPQURfTk9fTUVNX09QVElPTiBpbiBMT0FEX0ZMQUdTIGlzIHNldCwgZG9uJ3QgcGFzcyBhCisJTGludXgncyBtZW0gb3B0aW9uIGF1dG9tYXRpY2FsbHkuCisJKiBzdGFnZTIvc2hhcmVkLmggKGxvYWRfaW1hZ2UpOiBBZGRlZCB0aGUgbmV3IGFyZ3VtZW50LgorCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGtlcm5lbF9mdW5jKTogSWYgYC0tbm8tbWVtLW9wdGlvbicgaXMKKwlzcGVjaWZpZWQsIHNldCB0aGUgYml0IEtFUk5FTF9MT0FEX05PX01FTV9PUFRJT04gaW4gTE9BRF9GTEFHUywKKwlvdGhlcndpc2UsIExPQURfRkxBR1MgaXMgemVyby4KKwkKKzIwMDAtMDYtMjIgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIGRvY3MvdHV0b3JpYWwudGV4aTogRml4ZWQgc29tZSB0eXBvcyBhbmQgc3ludGF4IGVycm9ycy4KKwkqIGRvY3MvdXNlci1yZWYudGV4aTogTGlrZXdpc2UuCisJCisyMDAwLTA2LTIxICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvc3RhZ2UyLmMgKHJ1bl9tZW51KTogSW5pdGlhbGl6ZSBDVVJfRU5UUlkgYXQgdGhlCisJZGVmaW5pdGlvbi4KKwlJZiBTSE9XX01FTlUgaXMgemVybywgZG9uJ3QgZGlzcGxheSB0aGUgbWVudSBpbnRlcmZhY2UuIEluc3RlYWQsCisJd2FpdCB1bnRpbCB0aGUgdGltZW91dCBpcyBleHBpcmVkIGFuZCB0aGVuIGJvb3QgdGhlIGRlZmF1bHQKKwllbnRyeS4gSWYgdGhlIHVzZXIgcHJlc3NlcyBgRVNDJyBkdXJpbmcgdGhlIHRpbWVvdXQsIHNldAorCVNIT1dfTUVOVSB0byBvbmUgYW5kIGJyZWFrIHRoZSBsb29wLgorCURpc3BsYXkgdGhlIG1lbnUgaWYgU0hPV19NRU5VIGlzIHRydWUsIGluc3RlYWQgb2YgaWYKKwlHUlVCX1RJTUVPVVQgaXMgbm9uLXplcm8uCisJU2V0IFNIT1dfTUVOVSB0byBvbmUgYmVmb3JlIGdvIHRvIHRoZSBsYWJlbCBgcmVzdGFydCcuCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoc2hvd19tZW51KTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KKwkoaGlkZGVubWVudV9mdW5jKTogTmV3IGZ1bmN0aW9uLgorCShidWlsdGluX2hpZGRlbm1lbnUpOiBOZXcgdmFyaWFibGUuCisJKGJ1aWx0aW5fdGFibGUpOiBBZGRlZCBhIHBvaW50ZXIgdG8gQlVJTFRJTl9ISURERU5NRU5VLgorCSogc3RhZ2UyL3NoYXJlZC5oIChzaG93X21lbnUpOiBEZWNsYXJlZC4KKwkKKzIwMDAtMDYtMTkgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIGRvY3MvbWRhdGUtc2g6IE1vdmVkIHRvIC4uLgorCSogbWRhdGUtc2g6IC4uLiBoZXJlLgorCSogZG9jcy90ZXhpbmZvLnRleDogTW92ZWQgdG8gLi4uCisJKiB0ZXhpbmZvLnRleDogLi4uIGhlcmUuCisJCisyMDAwLTA2LTA5ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvbWJfaW5mby5oIChBZGRyUmFuZ2VEZXNjKTogVXNlIG9uZSA2NGJpdHMgZmllbGQgaW5zdGVhZAorCW9mIHR3byAzMmJpdHMgZmllbGRzIGZvciBCYXNlQWRkciBhbmQgTGVuZ3RoLCByZXNwZWN0aXZlbHkuCisJQmFzZUFkZHJMb3cgKyBCYXNlQWRkckhpZ2ggLT4gQmFzZUFkZHIsIExlbmd0aExvdyArIExlbmd0aEhpZ2gKKwktPiBMZW5ndGguCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoZGlzcGxheW1lbV9mdW5jKTogUHJpbnQgQmFzZUFkZHIgPj4gMzIsCisJQmFzZUFkZHIgJiAweEZGRkZGRkZGLCBMZW5ndGggPj4gMzIgYW5kIExlbmd0aCAmIDB4RkZGRkZGRkYsCisJaW5zdGVhZCBvZiBCYXNlQWRkckxvdywgQmFzZUFkZHJIaWdoLCBMZW5ndGhMb3cgYW5kIExlbmd0aEhpZ2gsCisJZm9yIE1BUC4KKwkqIHN0YWdlMi9jb21tb24uYyAoZmFrZW1hcCk6IEFkanVzdGVkIHRvIHRoZSBuZXcgZGVmaW5pdGlvbiBvZgorCUFkZHJSYW5nZURlc2MuCisJKG1tYXBfYXZhaWxfYXQpOiBDaGFuZ2UgdGhlIHR5cGUgb2YgVE9QIHRvIHVuc2lnbmVkIGxvbmcgbG9uZy4KKwlJZiBUT1AgaXMgZ3JlYXRlciB0aGFuIDB4RkZGRkZGRkYsIHNldCBpdCB0byAweEZGRkZGRkZGLCBzaW5jZQorCUdSVUIgaXRzZWxmIGNhbm5vdCBkZWFsIHdpdGggNjRiaXRzIGFkZHJlc3NlcyBhdCB0aGUgbW9tZW50LgorCShpbml0X2Jpb3NfaW5mbyk6IFdoZW4gZ2V0dGluZyBhIG1heGltdW0gYXZhaWxhYmxlIGFkZHJlc3MgZnJvbQorCXRoZSBtZW1vcnkgbWFwLCB1c2UgYSBuZXcgdW5zaWduZWQgbG9uZyBsb25nIHZhcmlhYmxlIE1BWF9BRERSCisJYXMgdGhlIHRlbXBvcmFyeSB2YXJpYWJsZSBpbnN0ZWFkIG9mIE1FTVRNUC4gVGhpcyBzaG91bGQgYWxsb3cKKwlHUlVCIHRvIGRldGVjdCBhdCBtb3N0IDRUQi4KKwkKKzIwMDAtMDYtMTggIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIGRvY3MvYXBwZW5kaWNlcy50ZXhpIChGQVEpOiBBZGRlZCBhbiBxdWVzdGlvbiBhYm91dCBMaW51eCdzCisJYG1lbT0nIG9wdGlvbiBhbmQgdGhlIGFuc3dlci4KKwkKKzIwMDAtMDYtMTcgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9ib290LmMgKGxvYWRfaW1hZ2UpOiBQYXNzIGEgbWVtIG9wdGlvbiB0byBMaW51eCwgb25seQorCWlmIFNSQyBoYXMgbm8gc3Vic3RyaW5nICJtZW09Ii4KKwkKKzIwMDAtMDYtMTcgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9jb21waWxlOiBSZW1vdmVkLgorCSogbmV0Ym9vdC9jb21waWxlOiBMaWtld2lzZS4KKwkqIGNvbXBpbGU6IE5ldyBmaWxlLiBDb3BpZWQgZnJvbSBBdXRvbWFrZS4KKwkKKzIwMDAtMDYtMTYgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9ib290LmMgKGxvYWRfaW1hZ2UpOiBEb24ndCByZW1vdmUgdGhlIHZnYSBvcHRpb24gYWZ0ZXIKKwlwYXJzaW5nIGl0LiBTdWdnZXN0ZWQgYnkgVGltIFJpa2VyLgorCisyMDAwLTA2LTE1ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvYXNtLlMgKGdydWJfaGFsdCk6IFVzZSBqbXAgaW5zdGVhZCBvZiBqYywgaWYgSU5UIDE1CisJQVg9NTMwN2ggZmFpbHMuCisJCisyMDAwLTA2LTE1ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBjb25maWd1cmUuaW4gKEFNX0lOSVRfQVVUT01BS0UpOiBJbmNyZWFzZSB0aGUgdmVyc2lvbiBudW1iZXIuCisJSSB3aXNoIHRoYXQgMC41Ljk2IHdpbGwgbm90IGJlIHJlbGVhc2VkIGFjdHVhbGx5Li4uCisJCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoaGFsdF9mdW5jKTogTmV3IGZ1bmN0aW9uLgorCShidWlsdGluX2hhbHQpOiBOZXcgdmFyaWFibGUuCisJKHJlYm9vdF9mdW5jKTogTmV3IGZ1bmN0aW9uLgorCShidWlsdGluX3JlYm9vdCk6IE5ldyB2YXJpYWJsZS4KKwkoYnVpbHRpbl90YWJsZSk6IEFkZGVkIHBvaW50ZXJzIHRvIEJVSUxUSU5fSEFMVCBhbmQKKwlCVUlMVElOX1JFQk9PVC4KKwkqIHN0YWdlMi9hc20uUyAoZ3J1Yl9oYWx0KTogTmV3IGZ1bmN0aW9uLgorCShncnViX3JlYm9vdCk6IExpa2V3aXNlLgorCSogc3RhZ2UyL3NoYXJlZC5oIChncnViX2hhbHQpOiBEZWNsYXJlZC4KKwkoZ3J1Yl9yZWJvb3QpOiBMaWtld2lzZS4KKwkqIGdydWIvYXNtc3R1Yi5jIChncnViX3JlYm9vdCk6IE5ldyBmdW5jdGlvbi4KKwkoZ3J1Yl9oYWx0KTogTGlrZXdpc2UuCisJCisyMDAwLTA2LTEyICBHb3Jkb24gTWF0emlna2VpdCAgPGdvcmRAZmlnLm9yZz4KKworCSogc3RhZ2UyL3N0YWdlMi5jIChydW5fbWVudSk6IERvbid0IGRpc3BsYXkgdGhlIG1lbnUgaWYgdGhlCisJdGltZW91dCBpcyB6ZXJvLiAgVGhpcyBtYWtlcyBmb3IgY2xlYW5lciB1c2UgYXMgYSBub25pbnRlcmFjdGl2ZQorCWJvb3Rsb2FkZXIuCisKKzIwMDAtMDYtMTEgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIGRvY3MvdHV0b3JpYWwudGV4aSAoR05VL0xpbnV4KTogQWRkZWQgYSBjYXV0aW9uIGFib3V0IHRoZQorCSJtZW09IiBvcHRpb24uCisJCisyMDAwLTA2LTExICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiB1dGlsL2dydWItaW5zdGFsbC5pbiAoY29udmVydCk6IFdoZW4gJGhvc3Rfb3MgaXMgbGludXgqLCB1c2UKKwl0aGUgZXhwcmVzc2lvbiAncyVcKFtzaF1kW2Etel1cKVswLTldKiQlXDElJyBpbnN0ZWFkIG9mCisJJ3MlWzAtOV0qJCUlJywgdG8gZ2V0IHJpZCBvZiB0aGUgcGFydGl0aW9uIHBhcnQuIFRoaXMgZml4ZXMgdGhlCisJYnVnICIvZGV2L2ZkMCIgLT4gIi9kZXYvZmQiLiAoQnV0IGRvbid0IHlvdSB0aGluayB0aGUgbmFtaW5nIGlzCisJcXVpdGUgaW5jb25zaXN0ZW50IHdpdGggaGFyZCBkaXNrcz8gV2h5IG5vdCAvZGV2L2ZkW2Etel0/KQorCVJlcG9ydCBieSBQYXZlbCBSb3NraW4uCisJCisyMDAwLTA2LTA4ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBkb2NzL3R1dG9yaWFsLnRleGkgKE5ldHdvcmspOiBUaGUgYm9keSBpcyBtb3ZlZCB0byAuLi4KKwkoR2VuZXJhbCB1c2FnZSBvZiBuZXR3b3JrIHN1cHBvcnQpOiAuLi4gdGhpcyBuZXcgc2VjdGlvbi4KKwkoRGlza2xlc3MpOiBOZXcgc2VjdGlvbi4KKwkqIGRvY3MvdXNlci1yZWYudGV4aSAoR2VuZXJhbCBjb21tYW5kcyk6IEFkZGVkIGEgZGVzY3JpcHRpb24KKwlhYm91dCB0aGUgY29tbWFuZCAidGZ0cHNlcnZlciIuCisJCisyMDAwLTA2LTA4ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBuZXRib290L21haW4uYyAoZGVjb2RlX3JmYzE1MzMpIFtHUlVCXTogRWxpbWluYXRlIHRyYWlsaW5nCisJTlVMcyBpbiB0aGUgTlZUIHN0cmluZyBmb3IgYSBjb25maWd1cmF0aW9uIGZpbGUgbmFtZSwgaWYgYW55LgorCShkZWNvZGVfcmZjMTUzMyk6IExpa2V3aXNlLCBpZiBFeHRlbnNpb25zIFBhdGggaXMgcHJlc2VudCwKKwllbGltaW5hdGUgdGhlIHRyYWlsaW5nIE5VTHMsIGlmIGFueS4KKwlBbHNvLCBjaGVjayB0aGUgbGVuZ3RoIGNhcmVmdWxseSB0byBlbnN1cmUgdGhhdCBFWFRQQVRIIGNhbiBmaXQKKwlpbiBGTkFNRS4KKwkKKzIwMDAtMDYtMDYgIEpvY2hlbiBIb2VuaWNrZSAgPGpvY2hlbkBnbnUub3JnPgorCisJKiBzdGFnZTIvZnN5c19yZWlzZXJmcy5jOiBBZGRlZCBqb3VybmFsaW5nIHRvIHJlaXNlci4KKwkocmVpc2VyZnNfam91cm5hbF9kZXNjKTogbmV3IHN0cnVjdHVyZS4KKwkocmVpc2VyZnNfam91cm5hbF9jb21taXQpOiBsaWtld2lzZS4KKyAJKHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyKTogbGlrZXdpc2UuCisJKGZzeXNfcmVpc2VyX2luZm8pOiBBZGRlZCBmaWVsZHMgZm9yIGpvdXJuYWxpbmcuCisJKGpvdXJuYWxfcmVhZCk6IG5ldyBmdW5jdGlvbi4KKwkoam91cm5hbF9pbml0KSBsaWtld2lzZS4KKwkoYmxvY2tfcmVhZCk6IE5ldyBmdW5jdGlvbiB0byByZWFkIHJlaXNlcmZzIGJsb2Nrcywgd2hpY2ggcmVhZHMKKwlmcm9tIHRoZSBqb3VybmFsIGlmIGl0IGNvbnRhaW5zIG5ld2VyIHZlcnNpb25zLiBBbGwgcmVsZXZhbnQKKwlkZXZyZWFkIGNhbGxzIGFyZSByZXBsYWNlZCB3aXRoIGNhbGxzIHRvIHRoaXMgbWV0aG9kLgorCShyZWlzZXJmc19tb3VudCk6IENoZWNrIGZvciBqb3VybmFsaW5nIHN1cGVyIGJsb2NrIGFuZCBjYWxsCisJam91cm5hbF9pbml0LgorCisyMDAwLTA2LTA2ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBuZXRib290L21haW4uYyAoZGhjcHJlcXVlc3QpIFtHUlVCXTogU2V0IHRoZSBsZW5ndGggb2YgdGhlCisJUGFyYW1ldGVyIFJlcXVlc3QgTGlzdCB0byAoNCArIDIpLgorCVNldCB0aGUgbGlzdCB0byBSRkMxNTMzX1ZFTkRPUl9NQUdJQyBhbmQKKwlSRkMxNTMzX1ZFTkRPUl9DT05GSUdGSUxFIGluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZAorCXBhcmFtZXRlcnMuCisJKGRlY29kZV9yZmMxNTMzKSBbR1JVQl06IElmIEMgaXMgZXF1YWwgdG8KKwlSRkMxNTMzX1ZFTkRPUl9DT05GSUdGSUxFLCBjb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgdGFnIHRvCisJQ09ORklHX0ZJTEUuCisJSWYgQyBpcyBlcXVhbCB0byBSRkMxNTMzX1ZFTkRPUl9NQUdJQywgaW5jcmVtZW50CisJVkVORE9SRVhUX0lTVkFMSUQuCisJKiBuZXRib290L2V0aGVyYm9vdC5oIFtHUlVCXSAoUkZDMTUzM19WRU5ET1JfQ09ORklHRklMRSk6IE5ldworCW1hY3JvLiBEZWZpbmVkIGFzIDE1MC4KKwkKKzIwMDAtMDYtMDMgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9hc20uUyAoY2hlY2tfaW50MTNfZXh0ZW5zaW9ucyk6IENoZWNrIHRoZSBiaXRtYXAgb25seQorCWlmIEZPUkNFX0xCQSBpcyB6ZXJvLgorCSogc3RhZ2UyL2Jpb3MuYyAoZ2V0X2Rpc2tpbmZvKTogR2V0IHJpZCBvZiB0aGUgd3JvbmcgY2hlY2sgZm9yCisJdGhlIGJpdCAwIG9mIERSUC5GTEFHUy4gTm93IHRoZSBiaXRtYXAgY2hlY2sgaXMgY29ycmVjdGx5CisJcGVyZm9ybWVkIGluIHRoZSBmdW5jdGlvbiBjaGVja19pbnQxM19leHRlbnNpb25zLgorCQorMjAwMC0wNi0wMiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogZG9jcy91c2VyLXJlZi50ZXhpIChJbnZva2luZyB0aGUgZ3J1YiBzaGVsbCk6IEFkZGVkIGEgY2F1dGlvbi4KKwlXaHkgZG9uJ3Qgc28gbWFueSBwZW9wbGUgc3RpbGwgdW5kZXJzdGFuZCB0aGF0IEJJT1MgZHJpdmUKKwludW1iZXJpbmcgYXJlIGRpZmZlcmVudCBmcm9tIE9TIGRldmljZSBuYW1pbmc/IEhvdyBtYW55IGNhdXRpb25zCisJYW5kIHdhcm5pbmdzIHNob3VsZCB3ZSB3cml0ZSBpbiB0aGUgZG9jdW1lbnRhdGlvbj8gU2lnaC4KKwkKKzIwMDAtMDYtMDEgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwlGcm9tIENoaXAgU2FsemVuYmVyZzoKKwkqIHN0YWdlMi9jbWRsaW5lLmMgKGVudGVyX2NtZGxpbmUpIFtTVVBQT1JUX0RJU0tMRVNTXTogUmVkaXNwbGF5CisJbmV0d29yayBjb25maWd1cmF0aW9uIGFmdGVyIGNsZWFyaW5nIHNjcmVlbiwgYmVmb3JlIGZpcnN0IHByb21wdC4KKworCSogc3RhZ2UyL2NtZGxpbmUuYzogSW5jbHVkZSA8c2hhcmVkLmg+IGluc3RlYWQgb2YgInNoYXJlZC5oIi4KKwlbU1VQUE9SVF9ESVNLTEVTU106IEluY2x1ZGUgPGV0aGVyYm9vdC5oPi4KKworMjAwMC0wNi0wMSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgKHNldHVwX2Z1bmMpOiBDaGVjayBpZiBJTlNUQUxMX0RSSVZFIGlzIGEKKwloYXJkIGRpc2sgYXMgd2VsbCBhcyBJTUFHRV9EUklWRSwgYmVmb3JlIHRyeWluZyB0byBpbnN0YWxsIGEKKwlTdGFnZSAxLjUuIFJlcG9ydGVkIGJ5IFBhdmVsIFJvc2tpbi4KKwkKKzIwMDAtMDUtMzEgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIGFjaW5jbHVkZS5tNCAoZ3J1Yl9BU01fQUJTT0xVVEVfV0lUSE9VVF9BU1RFUklTSyk6IE5ldworCWZ1bmN0aW9uLiBDaGVjayBpZiBHQVMgcmVxdWlyZXMgYWJzb2x1dGUgaW5kaXJlY3QgY2FsbHMvanVtcHMKKwl3aXRoIE5PIGFzdGVyaXNrLgorCSogY29uZmlndXJlLmluOiBDYWxsIGdydWJfQVNNX0FCU09MVVRFX1dJVEhPVVRfQVNURVJJU0suCisJKiBhY2NvbmZpZy5oIChBQlNPTFVURV9XSVRIT1VUX0FTVEVSSVNLKTogTmV3IG1hY3JvIGVudHJ5LgorCSogbmV0Ym9vdC9wY2kuYyAoYmlvczMyX3NlcnZpY2UpIFshQUJTT0xVVEVfV0lUSE9VVF9BU1RFUklTS106CisJUHJlZml4IHRoZSBvcGVyYW5kIHRvICJsY2FsbCIgd2l0aCBgKicuCisJKHBjaWJpb3NfcmVhZF9jb25maWdfYnl0ZSkgWyFBQlNPTFVURV9XSVRIT1VUX0FTVEVSSVNLXToKKwlMaWtld2lzZS4KKwkocGNpYmlvc19yZWFkX2NvbmZpZ193b3JkKSBbIUFCU09MVVRFX1dJVEhPVVRfQVNURVJJU0tdOgorCUxpa2V3aXNlLgorCShwY2liaW9zX3JlYWRfY29uZmlnX2R3b3JkKSBbIUFCU09MVVRFX1dJVEhPVVRfQVNURVJJU0tdOgorCUxpa2V3aXNlLgorCShwY2liaW9zX3dyaXRlX2NvbmZpZ19ieXRlKSBbIUFCU09MVVRFX1dJVEhPVVRfQVNURVJJU0tdOgorCUxpa2V3aXNlLgorCShwY2liaW9zX3dyaXRlX2NvbmZpZ193b3JkKSBbIUFCU09MVVRFX1dJVEhPVVRfQVNURVJJU0tdOgorCUxpa2V3aXNlLgorCShwY2liaW9zX3dyaXRlX2NvbmZpZ19kd29yZCkgWyFBQlNPTFVURV9XSVRIT1VUX0FTVEVSSVNLXToKKwlMaWtld2lzZS4KKwkoY2hlY2tfcGNpYmlvcykgWyFBQlNPTFVURV9XSVRIT1VUX0FTVEVSSVNLXTogTGlrZXdpc2UuCisJKiBzdGFnZTIvYXNtLlMgKGNoYWluX3N0YWdlMSkgWyFBQlNPTFVURV9XSVRIT1VUX0FTVEVSSVNLXToKKwlQcmVmaXggdGhlIG9wZXJhbmQgdG8gImxqbXAiIHdpdGggYConLgorCShjaGFpbl9zdGFnZTIpIFshQUJTT0xVVEVfV0lUSE9VVF9BU1RFUklTS106IExpa2V3aXNlLgorCShiaWdfbGludXhfYm9vdCkgWyFBQlNPTFVURV9XSVRIT1VUX0FTVEVSSVNLXTogTGlrZXdpc2UuCisJCisyMDAwLTA1LTI5ICBDaGlwIFNhbHplbmJlcmcgIDxjaGlwQHZhbGludXguY29tPgorCisJKiBzdGFnZTIvc2hhcmVkLmggKGdydWJfbWVtbW92ZSk6IFByb3RvdHlwZSB0byB1c2Ugdm9pZCAqLgorCSogc3RhZ2UyL2NoYXJfaW8uYyAoZ3J1Yl9tZW1tb3ZlKTogRGVmaW5lIGxpa2V3aXNlLgorCisyMDAwLTA1LTMwICBHb3Jkb24gTWF0emlna2VpdCAgPGdvcmRAZmlnLm9yZz4KKworCSogZG9jcy91c2VyLXJlZi50ZXhpIChTdGFnZTIgZXJyb3JzKTogVXBkYXRlIGVycm9yIG1lc3NhZ2VzLgorCisyMDAwLTA1LTI5ICBQYXZlbCBSb3NraW4gIDxwYXZlbF9yb3NraW5AZ2VvY2l0aWVzLmNvbT4KKworCSogdXRpbC9ncnViLWluc3RhbGwuaW46IEZpeCBhIHR5cG8gdGhhdCBwcmV2ZW50ZWQgZXJyb3IgbWVzc2FnZXMKKwlmcm9tIGFwcGVhcmluZy4KKwlDb3B5IGFuZCByZW1vdmUgZmlsZXMgaW5kaXZpZHVhbGx5IGFuZCBleGl0IHdpdGggYW4gZXJyb3IgYXMKKwlzb29uIGFzIGl0IGZhaWxzLgorCVNob3cgJGxvZ19maWxlIGlmIC0tZGVidWcgd2FzIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCisKKzIwMDAtMDQtMTkgIEdvcmRvbiBNYXR6aWdrZWl0ICA8Z29yZEBmaWcub3JnPgorCisJKiBzdGFnZTIvY21kbGluZS5jIChlbnRlcl9jbWRsaW5lKTogRG9uJ3QgZ2l2ZSBlcnJvcnMgb24gZW1wdHkKKwljb21tYW5kIGxpbmVzLgorCisJKiBzdGFnZTIvY29tbW9uLmMgKGVycl9saXN0KTogQ2xlYW4gdXAgd29yZGluZ3Mgc2xpZ2h0bHkuCisKKzIwMDAtMDUtMjkgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwlCYXNlZCBvbiBhIHBhdGNoIGJ5IE5lYWwgSCBXYWxmaWVsZCA8bmVhbEB3YWxmaWVsZC5vcmc+OgorCSogbmV0Ym9vdC9taXNjLmMgW0dSVUJdIChpbmV0X2F0b24pOiBEZWZpbmVkLgorCSogbmV0Ym9vdC9tYWluLmMgKGFycF9zZXJ2ZXJfb3ZlcnJpZGUpOiBOZXcgZnVuY3Rpb24uCisJKiBuZXRib290L2V0aGVyYm9vdC5oIFtHUlVCXSAoYXJwX3NlcnZlcl9vdmVycmlkZSk6IERlY2xhcmVkLgorCShpbmV0X2F0b24pOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9idWlsdGlucy5jICh0ZnRwc2VydmVyX2Z1bmMpOiBOZXcgZnVuY3Rpb24uCisJKGJ1aWx0aW5fdGZ0cHNlcnZlcik6IE5ldyB2YXJpYWJsZS4KKwkoYnVpbHRpbl90YWJsZSk6IEFkZGVkIGEgcG9pbnRlciB0byBCVUlMVElOX1RGVFBTRVJWRVIuCisJCisyMDAwLTA1LTI4ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvYXNtLlMgKGNvZGVzdGFydCk6IEZpeCBhIHR5cG86IERJU0tMRVNTX1NVUFBPUlQgLT4KKwlTVVBQT1JUX0RJU0tMRVNTLgorCSogc3RhZ2UyL25ibG9hZGVyLlM6IEZpeCB0aGUgaW1hZ2UgbGVuZ3RoIGFuZCB0aGUgbWVtb3J5IGxlbmd0aAorCWZpZWxkcy4gVGhleSBzaG91bGRuJ3QgY29udGFpbiB0aGUgZmlyc3Qgc2VjdG9yIGZvciBhIHRhZy4KKwlNbWguLi4sIHRoYXQgaXMgdW5jbGVhciBhcyBmYXIgYXMgSSBzZWUgdGhlIE5ldCBCb290IEltYWdlCisJUHJvcG9zYWwuLi4KKwkqIHN0YWdlMi9zaGFyZWQuaCAoU1RBQ0tPRkYpOiBFbmNsb3NlZCB3aXRoIHBhcmVudGhlc2VzLgorCShQUk9UU1RBQ0tJTklUKTogTGlrZXdpc2UuCisJCisyMDAwLTA1LTI3ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJQWRkIGRpc2tsZXNzIHN1cHBvcnQsIG1vc3RseSBiYXNlZCBvbiBwYXRjaGVzIGJ5IENocmlzdG9waAorCVBsYXR0bmVyIDxDaHJpc3RvcGguUGxhdHRuZXJAZG90LmF0PiwgYnV0IGFsc28gYmFzZWQgb24gYSBwYXRjaAorCWJ5IENoaXAgU2FsemVuYmVyZyA8Y2hpcEB2YWxpbnV4LmNvbT4gZm9yIFBYRS4gT2YgY291cnNlLCBJJ3ZlCisJbW9kaWZpZWQgYm90aCB0aGUgcGF0Y2hlcyB0aG9yb3VnaGx5IHRvIGFkYXB0IHRoZW0gdG8gbXkKKwlwcmVmZXJlbmNlLgorCisJKiBjb25maWd1cmUuaW4gKC0tZW5hYmxlLWRpc2tsZXNzKTogTmV3IG9wdGlvbi4gU2V0IGEKKwljb25kaXRpb25hbCBESVNLTEVTU19TVVBQT1JULgorCSogc3RhZ2UyL01ha2VmaWxlLmFtIChub2luc3RfSEVBREVSUyk6IEFkZGVkIG5iaS5oLgorCShFWFRSQV9QUk9HUkFNUyk6IE5ldyB2YXJpYWJsZS4KKwkocGtnZGF0YV9EQVRBKSBbRElTS0xFU1NfU1VQUE9SVF06IEFkZGVkCisJbmJncnViIGFuZCBweGVncnViLgorCShub2luc3RfREFUQSkgW0RJU0tMRVNTX1NVUFBPUlRdOiBBZGRlZCBuYmxvYWRlciwgcHhlbG9hZGVyIGFuZAorCWRpc2tsZXNzLgorCShub2luc3RfUFJPR1JBTVMpIFtESVNLTEVTU19TVVBQT1JUXTogQWRkZWQgbmJsb2FkZXIuZXhlYywKKwlweGVsb2FkZXIuZXhlYyBhbmQgZGlza2xlc3MuZXhlYy4KKwkoUFhFTE9BREVSX0xJTkspOiBOZXcgdmFyaWFibGUuCisJKEJVSUxUX1NPVVJDRVMpIFtESVNLTEVTU19TVVBQT1JUXTogQWRkZWQgZGlza2xlc3Nfc2l6ZS5oLgorCShkaXNrbGVzc19leGVjX1NPVVJDRVMpOiBOZXcgdmFyaWFibGUuCisJKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKTogTGlrZXdpc2UuCisJKGRpc2tsZXNzX2V4ZWNfTERGTEFHUyk6IExpa2V3aXNlLgorCShkaXNrbGVzc19leGVjX0xEQUREKTogTGlrZXdpc2UuCisJKGRpc2tsZXNzX3NpemUuaCk6IE5ldyB0YXJnZXQuCisJKG5ibG9hZGVyX2V4ZWNfU09VUkNFUyk6IE5ldyB2YXJpYWJsZS4KKwkobmJsb2FkZXJfZXhlY19DRkxBR1MpOiBMaWtld2lzZS4KKwkobmJsb2FkZXJfZXhlY19MREZMQUdTKTogTGlrZXdpc2UuCisJKG5ibG9hZGVyX2V4ZWMtbmJsb2FkZXIubyk6IE5ldyBkZXBlbmRlbmN5LgorCShuYmdydWIpOiBOZXcgdGFyZ2V0LgorCShweGVsb2FkZXJfZXhlY19TT1VSQ0VTKTogbmV3IHZhcmlhYmxlLgorCShweGVsb2FkZXJfZXhlY19DRkxBR1MpOiBMaWtld2lzZS4KKwkocHhlbG9hZGVyX2V4ZWNfTERGTEFHUyk6IExpa2V3aXNlLgorCShweGVncnViKTogTmV3IHRhcmdldC4KKwkqIHN0YWdlMi9hc20uUyAoaW5zdGFsbF9wYXJ0aXRpb24pOiBTZXQgdG8gMHhGRkZGRkYgaW5zdGVhZCBvZgorCTB4MDIwMDAwLiBXaGF0IHdhcyB0aGUgYmVuZWZpdCBmcm9tIHRoZSBwcmV2aW91cyBzZXR0aW5nPworCShjb2Rlc3RhcnQpIFtTVVBQT1JUX0RJU0tMRVNTXTogRG9uJ3QgbW92ZSAlZGwgdG8gQk9PVF9EUklWRS4KKwkoYm9vdF9kcml2ZSkgW1NVUFBPUlRfRElTS0xFU1NdOiBTZXQgdG8gTkVUV09SS19EUklWRSBpbnN0ZWFkIG9mCisJemVyby4KKwkqIHN0YWdlMi9jb21tb24uYzogSW5jbHVkZSA8c2hhcmVkLmg+IGluc3RlYWQgb2YgInNoYXJlZC5oIiwKKwlqdXN0IGZvciBhIGNvc21ldGljIHJlYXNvbi4KKwlbU1VQUE9SVF9ESVNLTEVTU106IEluY2x1ZGUgZXRoZXJib290LmguCisJW1NVUFBPUlRfRElTS0xFU1NdIChzZXR1cF9kaXNrbGVzc19lbnZpcm9ubWVudCk6IE5ldyBpbnRlcm5hbAorCWZ1bmN0aW9uLgorCShpbml0X2Jpb3NfaW5mbykgW1NVUFBPUlRfRElTS0xFU1NdOiBDYWxsCisJc2V0dXBfZGlza2xlc3NfZW52aXJvbm1lbnQgYWZ0ZXIgdGhlIG1lbW9yeSBpbml0aWFsaXphdGlvbiBpcworCWZpbmlzaGVkLiBSZXR1cm4gaWYgZmFpbHMuCisJKiBzdGFnZTIvbmJsb2FkZXIuUzogTmV3IGZpbGUuCisJKiBzdGFnZTIvcHhlbG9hZGVyLlM6IExpa2V3aXNlLgorCSogc3RhZ2UyL25iaS5oOiBMaWtld2lzZS4KKwkKKzIwMDAtMDUtMjUgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIG5ldGJvb3QvZnN5c190ZnRwLmMgKGJ1Zl9maWxsKTogV2FybiB3aGVuIGFtYXppbmcgdGhpbmdzCisJaGFwcGVuLgorCSh0ZnRwX2Rpcik6IFJldmVydCBwcmV2aW91cyBjaGFuZ2UuIERvbid0IHVzZSBURlRQX01JTl9QQUNLRVQKKwlidXQgY2FsY3VsYXRlIHRoZSBhcHByb3ByaWF0ZSBsZW5ndGguCisJCisyMDAwLTA1LTIzICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBuZXRib290L2ZzeXNfdGZ0cC5jICh0ZnRwX2Rpcik6IEFwcGVuZCAiMFwwIiB0byB0aGUgcmVxdWVzdAorCXN0cmluZywgYmVjYXVzZSB0aGUgInRzaXplIiBvcHRpb24gbXVzdCBiZSBmb2xsb3dlZCBieSB6ZXJvLAorCWFjY29yZGluZyB0byBSRkMgMjM0OS4KKwkKKzIwMDAtMDUtMjIgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwlTeW5jaHJvbml6ZSB0aGUgZG9jdW1lbnRhdGlvbiB3aXRoIHRoZSBjb2RlLgorCQorCSogZG9jcy91c2VyLXJlZi50ZXhpOiBBZGRlZCBSZWlzZXJGUyBhcyBhIHN1cHBvcnRlZCBmaWxlc3lzdGVtLgorCVVwZGF0ZWQgdGhlIGRlc2NyaXB0aW9ucyBhYm91dCBgcGFzc3dvcmQnLCBgaW5zdGFsbCcsIGBrZXJuZWwnLAorCWFuZCBgc2V0dXAnLgorCUFkZGVkIGEgZGVzY3JpcHRpb24gYWJvdXQgYGxvY2snLgorCUFkZGVkIGRlc2NyaXB0aW9ucyBhYm91dCBFUlJfVU5BTElHTkVEIGFuZCBFUlJfUFJJVklMRUdFRC4KKwlBZGRlZCBhIGRlc2NyaXB0aW9uIGFib3V0IHRoZSBvcHRpb24gYC0tZm9yY2UtbGJhJyBvZgorCXRoZSBwcm9ncmFtIGBncnViLWluc3RhbGwnLgorCSogZG9jcy90dXRvcmlhbC50ZXhpOiBVcGRhdGVkIHRoZSBzdWJzZWN0aW9uIGZvciBOZXRCU0QuCisJCisyMDAwLTA1LTIxICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvYXNtLlMgKHNldF9pbnQxM19oYW5kbGVyKTogRG9uJ3QgdXNlIE1CSSB0byBnZXQgdGhlCisJbG93ZXIgbWVtb3J5IHNpemUuIEluc3RlYWQsIGRlY3JlYXNlIGl0IGluIHRoZSBCSU9TIG1lbW9yeQorCWRpcmVjdGx5IGFuZCBzZXQgJWVheCB0byBpdCwgc2luY2UgTUJJLk1FTV9MT1dFUiBtYXkgbm90IGJlIHRoZQorCXNhbWUgYXMgWzB4NDEzXSBhbnkgbG9uZ2VyIGR1ZSB0byB0aGUgcHJldmlvdXMgY2hhbmdlLgorCisJKiBncnViL2FzbXN0dWIuYyAoQ09OVkVOVElPTkFMX01FTVNJWkUpOiBDaGFuZ2VkIHRvIDY0MCAqIDEwMjQKKwlmcm9tIDY0MC4gWW91IGRpZG4ndCBsaWtlIHRoZSBpbmNvbnNpc3RlbmN5IGJldHdlZW4KKwlFWFRFTkRFRF9NRU1TSVpFIGFuZCBDT05WRU5USU9OQUxfTUVNU0laRSwgZGlkIHlvdT8KKwkoZ2V0X21lbXNpemUpOiBSZXR1cm4gQ09OVkVOVElPTkFMX01FTVNJWkUgPj4gMTAgaW5zdGVhZCBvZgorCUNPTlZFTlRJT05BTF9NRU1TSVpFLCBpZiBUWVBFIGlzIHplcm8uCisJKGdldF9laXNhbWVtc2l6ZSk6IFJldHVybiBFWFRFTkRFRF9NRU1TSVpFID4+IDEwIGluc3RlYWQgb2YKKwlFWFRFTkRFRF9NRU1TSVpFIC8gMTAyNC4gSnVzdCBhIGNvc21ldGljIGNoYW5nZS4KKwkoTU1BUl9ERVNDX0xFTkdUSCk6IE5ldyBtYWNyby4gRGVmaW5lZCBhcyAyMC4KKwkoZ2V0X21tYXBfZW50cnkpOiBEZWZpbmUgYSBuZXcgdmFyaWFibGUgREVTQ19UQUJMRSBzdGF0aWNhbGx5LCAKKwlhbmQgY29weSB0aGUgQ09OVHRoIGVudHJ5IHRvICpERVNDIGlmIENPTlQgaXMgYSBjb3JyZWN0IGluZGV4LgorCQorMjAwMC0wNS0yMSAgQ2hpcCBTYWx6ZW5iZXJnICA8Y2hpcEB2YWxpbnV4LmNvbT4KKworCSogc3RhZ2UyL2NvbW1vbi5jIChtbWFwX2F2YWlsX2F0KTogTmV3IGZ1bmN0aW9uLCBhYnN0cmFjdGVkIG91dAorCW9mIGluaXRfYmlvc19pbmZvLCB0byBzY2FuIEU4MjAgbWVtb3J5IG1hcC4KKwkoaW5pdF9iaW9zX2luZm8pOiBVc2UgbW1hcF9hdmFpbF9hdCBmb3IgX2JvdGhfIE1CSS5NRU1fVVBQRVIgYW5kCisJTUJJLk1FTV9MT1dFUi4KKworMjAwMC0wNS0xNyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCVVwZGF0ZSB0aGUgbmV0d29yayBzdXBwb3J0IHRvIEV0aGVyYm9vdC00LjYuMS4KKworCSogbmV0Ym9vdC9jb25maWcuYyAocGNpX25pY19saXN0KSBbSU5DTFVERV9UVUxJUF06IEFkZGVkIGFuCisJZW50cnkgZm9yIERhdmljb20gOTEwMi4KKwkqIG5ldGJvb3QvZXBpYzEwMC5jOiBKdXN0IGNvcGllZC4KKwkqIG5ldGJvb3QvcGNpLmg6IExpa2V3aXNlLgorCSogbmV0Ym9vdC90dWxpcC5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvZXRoZXJib290LmggKHRmdHApOiBDaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIGZpcnN0CisJYXJndW1lbnQgdG8gY29uc3QgY2hhciAqIGZyb20gY2hhciAqLgorCSogbmV0Ym9vdC9tYWluLmMgKHRmdHApOiBMaWtld2lzZS4KKwkKKzIwMDAtMDUtMTMgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHV0aWwvZ3J1Yi1pbnN0YWxsLmluOiBJZiB0aGUgcHJvZ3JhbSBgY3AnIGZhaWxzLCBleGl0IHdpdGggdGhlCisJc3RhdHVzIGNvZGUgMS4gU3VnZ2VzdGVkIGJ5IFBhdmVsIFJvc2tpbi4KKwkKKzIwMDAtMDUtMTMgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwlGcm9tIFBpeGVsIDxwaXhlbEBtYW5kcmFrZXNvZnQuY29tPjoKKwkqIHN0YWdlMi9wY19zbGljZS5oIChQQ19TTElDRV9UWVBFX0xJTlVYX0VYVEVOREVEKTogTmV3IG1hY3JvLgorCShJU19QQ19TTElDRV9UWVBFX0VYVEVOREVEKTogQWRkZWQgYSBjaGVjayBmb3IKKwlQQ19TTElDRV9UWVBFX0xJTlVYX0VYVEVOREVELgorCQorMjAwMC0wNS0wNSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UyL2NvbW1vbi5jIChpbml0X2Jpb3NfaW5mbykgWyFTVEFHRTFfNV06IFdoZW4gdGhlIG1lbW9yeQorCW1hcCBpcyBwcmVzZW50LCBzZWFyY2ggdGhlIG1heGltdW0gZm9yIE1FTVRNUCBpbiBieXRlcyBpbnN0ZWFkCisJb2Yga2lsb2J5dGVzIGFuZCBzZXQgRVhURU5ERURfTUVNT1JZIHRvIE1FTVRNUCBtaW51cyAxTUIgaW4KKwlraWxvYnl0ZXMuCisJCisyMDAwLTA1LTA1ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJSWdub3JlIGFueSBtZW1vcnkgaG9sZXMgd2hlbiBwYXNzaW5nIHRoZSBtYXhpbXVtIG1lbW9yeSBhZGRyZXNzCisJdG8gbm9uLU11bHRpYm9vdCBrZXJuZWxzIChpLmUuIExpbnV4IGFuZCAqQlNEKS4KKwkKKwkqIHN0YWdlMi9jb21tb24uYyBbIVNUQUdFMV81XSAoZXh0ZW5kZWRfbWVtb3J5KTogTmV3IGdsb2JhbAorCXZhcmlhYmxlLgorCShpbml0X2Jpb3NfaW5mbykgWyFTVEFHRTFfNV06IENoYW5nZSB0aGUgdHlwZSBvZiBDT05ULCBNRU1UTVAKKwlhbmQgQUREUiB0byB1bnNpZ25lZCBsb25nIGZyb20gaW50LgorCVNldCBFWFRFTkRFRF9NRU1PUlkgdG8gTUJJLk1FTV9VUFBFUiBieSBkZWZhdWx0LgorCUlmIE1CSS5NTUFQX0xFTkdUSCBpcyBub3QgemVybywgc2V0IEVYVEVOREVEX01FTU9SWSB0byB0aGUKKwltYXhpbXVtIGF2YWlsYWJsZSBhZGRyZXNzLCBpZ25vcmluZyBhbnkgbWVtb3J5IGhvbGVzLgorCUlmIE1CSS5NTUFQX0xFTkdUSCBpcyB6ZXJvIGJ1dCBnZXRfZWlzYW1lbXNpemUgcmV0dXJucyBvdGhlcgorCXRoYW4gLTEsIHNldCBFWFRFTkRFRF9NRU1PUlkgdG8gKENPTlQgPj4gMTApICsgMHgzYzAwIGlmIENPTlQgaXMKKwlub24temVybywgb3RoZXJ3aXNlLCBzZXQgaXQgdG8gTUVNVE1QLgorCSogc3RhZ2UyL3NoYXJlZC5oIFshU1RBR0UxXzVdIChleHRlbmRlZF9tZW1vcnkpOiBEZWNsYXJlZC4KKwkqIHN0YWdlMi9ib290LmMgKGxvYWRfaW1hZ2UpOiBBbHdheXMgcGFzcyB0aGUgIm1lbT0iIG9wdGlvbiB0byBhCisJTGludXgga2VybmVsLCB1c2luZyBFWFRFTkRFRF9NRU1PUlkgaW5zdGVhZCBvZiBNQkkuTUVNX1VQUEVSLgorCShic2RfYm9vdCk6IFVzZSBFWFRFTkRFRF9NRU1PUlkgaW5zdGVhZCBvZiBNQkkuTUVNX1VQUEVSLgorCQorMjAwMC0wNC0zMCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UxL3N0YWdlMS5TIChtZXNzYWdlKTogVXNlIGxvZHNiIGluc3RlYWQgb2YgaW5jdyBhbmQgbW92Yi4KKwlGcm9tIEFuZHJldyBDbGF1c2VuIDxjbGF1c2VuQGdudS5vcmc+LgorCisJKiBzdGFnZTEvc3RhZ2UxLlMgKGNvcHlfYnVmZmVyKTogU2V0ICVjeCB0byAweDEwMCBhbmQgdXNlIG1vdnN3CisJaW5zdGVhZCBvZiBtb3ZzYiwgc2luY2UgaXQgaXMgZ3VhcmFudGVlZCB0aGF0IHRoZSByZWdpb24gaXMKKwlwcm9wZXJseSBhbGlnbmVkLgorCQorMjAwMC0wNC0yOSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgKHNldHVwX2Z1bmMpOiBVc2UgU0VDVE9SX0JJVFMgaW5zdGVhZCBvZgorCVNFQ1RPUl9TSVpFIHRvIGNvbXB1dGUgQkxPQ0tTSVpFLgorCisyMDAwLTA0LTI2ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBuZXRib290L2RlcGNhLmM6IENvcGllZCBmcm9tIEV0aGVyYm9vdC00LjYuMC4KKwkKKzIwMDAtMDQtMjMgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwlNb3JlIHNlY3VyaXR5LXJlbGF0ZWQgZmVhdHVyZXMuCisJCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoYXV0aCk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCisJKGNvbmZpZ2ZpbGVfZnVuYyk6IENsZWFyIEFVVEggYmVmb3JlIGp1bXBpbmcgdG8gY21haW4uCisJKGxvY2tfZnVuYyk6IE5ldyBmdW5jdGlvbi4KKwkoYnVpbHRpbl9sb2NrKTogTmV3IHZhcmlhYmxlLgorCShwYXNzd29yZF9mdW5jKTogTWFrZSBzdXJlIHRoYXQgTEVOICsgMiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8KKwlQQVNTV09SRF9CVUZMRU4sIGJlY2F1c2Ugbm93IHRoZSBwYXNzd29yZCBtdXN0IGJlIHRlcm1pbmF0ZWQKKwl3aXRoIGRvdWJsZSBOVUxzLCBpbiBvcmRlciB0byBwZXJtaXQgYW4gZW1wdHkgY29uZmlndXJhdGlvbiBmaWxlCisJbmFtZS4KKwlDb3B5IExFTiBieXRlcyBmcm9tIEFSRyB0byBQQVNTV09SRCwgaW5zdGVhZCBvZiBMRU4gKyAxIGJ5dGVzLgorCUNsZWFyIHRoZSByZXN0IG9mIHRoZSBidWZmZXIgUEFTU1dPUkQuCisJKGJ1aWx0aW5fdGFibGUpOiBBZGRlZCBhIHBvaW50ZXIgdG8gQlVJTFRJTl9MT0NLLgorCSogc3RhZ2UyL2NvbW1vbi5jIChlcnJfbGlzdCk6IEFkZGVkIGFuIGVudHJ5IGZvciBFUlJfUFJJVklMRUdFRC4KKwkqIHN0YWdlMi9zdGFnZTIuYyAocnVuX21lbnUpOiBJZiBBVVRIIGlzIHRydWUsIHNob3cgdGhlIG1lc3NhZ2VzCisJZm9yIGEgbm9uLXBhc3N3b3JkIGNvbmZpZ3VyYXRpb24sIGV2ZW4gaWYgUEFTU1dPUkQgaXMgbm90IE5VTEwuCisJTGlrZXdpc2UsIGlmIEFVVEggaXMgdHJ1ZSwgYWxsb3cgdGhlIHVzZXIgdG8gdXNlIHByaXZpbGVnZWQKKwlpbnN0cnVjdGlvbnMgKHN1Y2ggYXMgYGMnKS4KKwlJZiBhIGNvcnJlY3QgcGFzc3dvcmQgaXMgZW50ZXJlZCwgY2hlY2sgaWYgKlBQVFIgaXMgTlVMIG9yIG5vdC4KKwlJZiBpdCBpcyBOVUwsIHNldCBBVVRIIHRvIDEgYW5kIGdvIHRvIHRoZSBsYWJlbCByZXN0YXJ0LAorCW90aGVyd2lzZSwgY29weSBQUFRSIHRvIE5FV19GSUxFLCBjbGVhciBBVVRILCBhbmQgcmV0dXJuLgorCSogc3RhZ2UyL3NoYXJlZC5oIChncnViX2Vycm9yX3QpOiBBZGRlZCBhIG5ldyBjb25zdGFudAorCUVSUl9QUklWSUxFR0VELgorCShhdXRoKTogRGVjbGFyZWQuCisJCisyMDAwLTA0LTIzICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBkb2NzL3VzZXItcmVmLnRleGkgKENvbW1hbmQtbGluZS1zcGVjaWZpYyBjb21tYW5kcyk6IERvbid0IHVzZQorCXRoZSBjb21tYW5kIEB2YXIgZm9yIHRoZSBhcmd1bWVudCAiZmlsZSIgdG8gdGhlIGNvbW1hbmQKKwkiY29uZmlnZmlsZSIgb24gdGhlIGRlZmluaXRpb24uCisJCisyMDAwLTA0LTIyICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJVXBkYXRlIHRoZSBuZXR3b3JrIHN1cHBvcnQgdG8gRXRoZXJib290IDQuNS44LgorCisJKiBjb25maWd1cmUuaW4gKC0tZW5hYmxlLTNjNTkwKTogTmV3IG9wdGlvbi4KKwkoLS1lbmFibGUtM2M1OTUpOiBMaWtld2lzZS4KKwkoLS1lbmFibGUtZGVwY2EpOiBMaWtld2lzZS4KKwkoLS1lbmFibGUtbGFuY2UpOiBMaWtld2lzZS4KKwkoLS1lbmFibGUtbnM4MzkwKTogTGlrZXdpc2UuCisJKC0tZW5hYmxlLW50dWxpcCk6IExpa2V3aXNlLgorCSgtLWVuYWJsZS1sYW5jZXBjaSk6IFJlbW92ZWQuCisJKC0tZW5hYmxlLW5lcGNpKTogTGlrZXdpc2UuCisJKC0tZW5hYmxlLW90dWxpcCk6IExpa2V3aXNlLgorCSgtLWVuYWJsZS1zbWM5MDAwKTogVGhlIGR1cGxpY2F0ZWQgb25lIGlzIG5hbWVkIHRvIC4uLgorCSgtLWVuYWJsZS1zbWM5MDAwLXNjYW4pOiAuLi4gdGhpcy4gVGhpcyB3YXMgYSB0eXBvLCBwZXJoYXBzLgorCQorCSogbmV0Ym9vdC9NYWtlZmlsZS5hbSAobGliZHJpdmVyc19hX1NPVVJDRVMpOiBSZW1vdmVkCisJYnl0ZW9yZGVyLmgsIGlmLmgsIG5ldGJvb3RfY29uZmlnLmggYW5kIG5ldGRldmljZS5oLCBhbmQgYWRkZWQKKwljYXJkcy5oLgorCShFWFRSQV9saWJkcml2ZXJzX2FfU09VUkNFUyk6IFJlbW92ZWQgbnR1bGlwLmMgYW5kIHR1bGlwLmgsIGFuZAorCWFkZGVkIDNjNTk1LmMsIDNjNTk1LmgsIGRlcGNhLmMsIG90dWxpcC5jIGFuZCBvdHVsaXAuaC4KKwkobGliZHJpdmVyc19hX0NGTEFHUyk6IERlZmluZSBGU1lTX1RGVFAgYXMgMSBpbnN0ZWFkIG9mIGVtcHR5LgorCShFWFRSQV9ESVNUKTogUmVtb3ZlZCBudHVsaXAudHh0LCBhbmQgYWRkZWQgY3M4OXgwLnR4dCBhbmQKKwl0dWxpcC50eHQuCisJKDNjNTk1X2RyaXZlcnMpOiBOZXcgdmFyaWFibGUuCisJKGRlcGNhX2RyaXZlcnMpOiBMaWtld2lzZS4KKwkobGFuY2VfZHJpdmVycyk6IFJlbW92ZWQgbGFuY2VwY2kubyBhbmQgYWRkZWQgbGFuY2Uuby4KKwkobnM4MzkwX2RyaXZlcnMpOiBSZW1vdmVkIG5lcGNpLm8gYW5kIGFkZGVkIG5zODM5MC5vLgorCShudHVsaXBfZHJpdmVycyk6IERlbGV0ZWQuCisJKG90dWxpcF9kcml2ZXJzKTogTmV3IHZhcmlhYmxlLgorCSgkKDNjNTk1X2RyaXZlcnMpKTogTmV3IHRhcmdldC4KKwkoJChkZXBjYV9kcml2ZXJzKSk6IExpa2V3aXNlLgorCSgkKG50dWxpcF9kcml2ZXJzKSk6IERlbGV0ZWQuCisJKCQob3R1bGlwX2RyaXZlcnMpKTogTmV3IHRhcmdldC4KKwkoM2M1OTBfb19DRkxBR1MpOiBOZXcgdmFyaWFibGUuCisJKDNjNTk1X29fQ0ZMQUdTKTogTGlrZXdpc2UuCisJKGRlcGNhX29fQ0ZMQUdTKTogTGlrZXdpc2UuCisJKGxhbmNlcGNpX29fQ0ZMQUdTKTogRGVsZXRlZC4KKwkobGFuY2Vfb19DRkxBR1MpOiBOZXcgdmFyaWFibGUuCisJKG5lcGNpX29fQ0ZMQUdTKTogRGVsZXRlZC4KKwkobnM4MzkwX29fQ0ZMQUdTKTogTmV3IHZhcmlhYmxlLgorCShudHVsaXBfb19DRkxBR1MpOiBEZWxldGVkLgorCShvdHVsaXBfb19DRkxBR1MpOiBOZXcgdmFyaWFibGUuCisJCisJKiBuZXRib290LzNjOTB4LmM6IFVwZGF0ZWQgdG8gRXRoZXJib290LTQuNS44LgorCSogbmV0Ym9vdC8zYzkweC50eHQ6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9jczg5eDAuYzogTGlrZXdpc2UuCisJKiBuZXRib290L2NzODl4MC5oOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvZWVwcm8xMDAuYzogTGlrZXdpc2UuCisJKiBuZXRib290L2VwaWMxMDAuYzogTGlrZXdpc2UuCisJKiBuZXRib290L2VwaWMxMDAuaDogTGlrZXdpc2UuCisJKiBuZXRib290L2k4MjU4Ni5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvbGFuY2UuYzogTGlrZXdpc2UuCisJKiBuZXRib290L2xpbnV4LWFzbS1pby5oOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvbGludXgtYXNtLXN0cmluZy5oOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvbmljLmg6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9uczgzOTAuYzogTGlrZXdpc2UuCisJKiBuZXRib290L25zODM5MC5oOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvcGNpLmM6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9wY2kuaDogTGlrZXdpc2UuCisJKiBuZXRib290L3J0bDgxMzkuYzogTGlrZXdpc2UuCisJKiBuZXRib290L3NrX2cxNi5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3Qvc2tfZzE2Lmg6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9zbWM5MDAwLmM6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9zbWM5MDAwLmg6IExpa2V3aXNlLgorCSogbmV0Ym9vdC90aWFyYS5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvdHVsaXAuYzogTGlrZXdpc2UuCisJKiBuZXRib290L3ZpYS1yaGluZS5jOiBMaWtld2lzZS4KKworCSogbmV0Ym9vdC9jb25maWcuYzogVXBkYXRlZCB0byBFdGhlcmJvb3QtNC41LjggYW5kIG1vZGlmaWVkIChzZWUKKwliZWxvdykuCisJW0dSVUJdIChwcmludF9jb25maWcpOiBVbmRlZmluZWQuCisJKGV0aF9wcm9iZSkgW0dSVUJdOiBJZiBQUk9CRUQgaXMgdHJ1ZSwgZG8gbm90aGluZy4gT3RoZXJ3aXNlLAorCWNsZWFyIE5FVFdPUktfUkVBRFkgYW5kIEFSUFRBQkxFLCBzZXQgUk9NIHRvIFJPTV9JTkZPX0xPQ0FUSU9OLAorCWFuZCBzZXQgUFJPQkVEIHRvIDEgaWYgc3VjY2VlZHMuCisJKiBuZXRib290L2V0aGVyYm9vdC5oOiBMaWtld2lzZSwKKwkoR1JVQik6IE5ldyBtYWNyby4KKwlbR1JVQl06IEluY2x1ZGUgPHNoYXJlZC5oPi4KKwlbR1JVQl0gKE5PX0RIQ1BfU1VQUE9SVCk6IFVuZGVmaW5lZC4KKwlbR1JVQl0gKFJFTE9DKTogRGVmaW5lZCBhcyB6ZXJvLgorCVtHUlVCXSAoSU5URVJOQUxfQk9PVFBfREFUQSk6IERlZmluZWQgYXMgb25lLgorCVtHUlVCXSAoVVNFX0lOVEVSTkFMX0JVRkZFUik6IExpa2V3aXNlLgorCVtHUlVCXSAoQkFDS09GRl9MSU1JVCk6IERlZmluZWQgYXMgNy4KKwlbR1JVQl0gKENUUkxfQyk6IE5ldyBtYWNyby4KKwlbR1JVQl0gKHByaW50X25ldHdvcmtfY29uZmlndXJhdGlvbik6IERlY2xhcmVkLgorCVtHUlVCXSAoaXBfYWJvcnQpOiBMaWtld2lzZS4KKwlbR1JVQl0gKG5ldHdvcmtfcmVhZHkpOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvZnN5c190ZnRwLmM6IERvbid0IGluY2x1ZGUgPG5ldGJvb3RfY29uZmlnLmg+LgorCShpc29ja2V0KTogUmVuYW1lZCB0byAuLi4KKwkoaXBvcnQpOiAuLi4gdGhpcy4KKwkob3NvY2tldCk6IFJlbmFtZWQgdG8gLi4uCisJKG9wb3J0KTogLi4uIHRoaXMuCisJKGJjb3VudGVyKTogTmV3IHZhcmlhYmxlLgorCShidWZfZmlsbCk6IFdoZW4gY2hlY2tpbmcgdGhlIGJsb2NrIG9yZGVyLCBzZWUgQkNPVU5URVIgYXMgd2VsbAorCWFzIEJMT0NLLgorCURvbid0IHByb2Nlc3MgYSBwYWNrZXQsIGlmIEJMT0NLIG1pbnVzIFBSRVZCTE9DSyBpcyBub3QgMSwKKwlpbnN0ZWFkIG9mIGlmIEJMT0NLIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBQUkVWQkxPQ0suCisJSW5jcmVtZW50IEJDT1VOVEVSIGFmdGVyIHJlc2V0aW5nIFJFVFJZLgorCShzZW5kX3JycSk6IENsZWFyIEJDT1VOVEVSLgorCUNhbGwgYXdhaXRfcmVwbHkgd2l0aCBBV0FJVF9RRFJBSU4uCisJKiBuZXRib290L21haW4uYzogRG9uJ3QgaW5jbHVkZSA8bmV0Ym9vdF9jb25maWcuaD4uCisJKGRoY3BkaXNjb3Zlcik6IE1hZGUgY29uc3QuCisJKGRoY3ByZXF1ZXN0KTogTGlrZXdpc2UuIFVwZGF0ZWQgdGhlIGNvbnRlbnRzLgorCShicm9hZGNhc3QpOiBNYWRlIGNvbnN0LgorCSh1ZHBfdHJhbnNtaXQpOiBDb3BpZWQuCisJKHRmdHApOiBMaWtld2lzZS4KKwkoYm9vdHApOiBMaWtld2lzZS4KKwkocmFycCk6IExpa2V3aXNlLgorCShhd2FpdF9yZXBseSk6IExpa2V3aXNlLgorCShkZWNvZGVfcmZjMTUzMyk6IExpa2V3aXNlLgorCShyZmM5NTFfc2xlZXApOiBMaWtld2lzZS4KKwkoY2xlYW51cF9uZXQpOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvbWlzYy5jIChzbGVlcCk6IENvcGllZC4KKwkodHdpZGRsZSk6IExpa2V3aXNlLgorCShnZXRkZWMpOiBMaWtld2lzZS4KKwkqIG5ldGJvb3Qvb3NkZXAuaDogQ29waWVkIGFuZCBtb2RpZmllZCAoc2VlIGJlbG93KS4KKwlbR1JVQl0gKEVUSEVSQk9PVDMyKTogVXNlZCB0aGUgc2FtZSBkZWZpbml0aW9uIGFzIExpbnV4IGFuZAorCUZyZWVCU0QuCisJW0dSVUJdIChudG9obCk6IExpa2V3aXNlLgorCVtHUlVCXSAoaHRvbmwpOiBMaWtld2lzZS4KKwlbR1JVQl0gKG50b2hzKTogTGlrZXdpc2UuCisJW0dSVUJdIChodG9ucyk6IExpa2V3aXNlLgorCVtHUlVCXSAoc3dhcDMyKTogTGlrZXdpc2UuCisJW0dSVUJdIChzd2FwMTYpOiBMaWtld2lzZS4KKwlbR1JVQl06IEluY2x1ZGUgImxpbnV4LWFzbS1pby5oIi4KKworCSogbmV0Ym9vdC9ieXRlb3JkZXIuaDogUmVtb3ZlZC4KKwkqIG5ldGJvb3QvaWYuaDogTGlrZXdpc2UuCisJKiBuZXRib290L25ldGJvb3RfY29uZmlnLmg6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9uZXRkZXZpY2UuaDogTGlrZXdpc2UuCisJKiBuZXRib290L250dWxpcC5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvbnR1bGlwLnR4dDogTGlrZXdpc2UuCisJKiBuZXRib290L3R1bGlwLmg6IExpa2V3aXNlLgorCQorCSogbmV0Ym9vdC8zYzU5NS5jOiBOZXcgZmlsZS4gQ29waWVkIGZyb20gRXRoZXJib290LTQuNS44LgorCSogbmV0Ym9vdC8zYzU5NS5oOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvY2FyZHMuaDogTGlrZXdpc2UuCisJKiBuZXRib290L2NzODl4MC50eHQ6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9kZXBjYS5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3Qvb3R1bGlwLmM6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9vdHVsaXAuaDogTGlrZXdpc2UuCisJKiBuZXRib290L3R1bGlwLnR4dDogTGlrZXdpc2UuCisJCisyMDAwLTAyLTI5ICBKb2NoZW4gSG9lbmlja2UgIDxqb2NoZW5AZ251Lm9yZz4KKworCSogc3RhZ2UyL2NvbW1vbi5jIChlcnJfbGlzdCk6IEFkZGVkIG1lc3NhZ2UgZm9yIEVSUl9VTkFMSUdORUQuCisJKiBzdGFnZTIvc2hhcmVkLmggWyFTVEFHRTFfNV0gKGRpc2tfcmVhZF9ob29rLGRpc2tfcmVhZF9mdW5jKTogTmV3CisgCXBhcmFtZXRlcnMgb2Zmc2V0IGFuZCBsZW5ndGguCisJKEVSUl9VTkFMSUdORUQpOiBOZXcgZXJyb3IgY29kZS4KKwkqIHN0YWdlMi9kaXNrX2lvLmMgKHJhd3JlYWQpIFshU1RBR0UxXzVdOiBDYWxsIGRpc2tfcmVhZF9mdW5jIHdpdGgKKwlvZmZzZXQgYW5kIGxlbmd0aC4KKwkqIHN0YWdlMi9idWlsdGluLmMgKGRpc2tfcmVhZF9wcmludF9mdW5jKTogUHJpbnQgb2Zmc2V0IGFuZCBsZW5ndGguCisJKGJsb2NrbGlzdF9mdW5jKTogUHJpbnQgZGV0YWlsZWQgYnl0ZSByYW5nZXMgZm9yIHBhcnRpYWwgc2VjdG9ycy4KKwkoaW5zdGFsbF9mdW5jKTogRGV0ZWN0IHBhcnRpYWwgc2VjdG9ycyBhbmQgcHJpbnQgZXJyb3IgbWVzc2FnZS4KKworMjAwMC0wNC0xOCAgUGF2ZWwgUm9za2luICA8cGF2ZWxfcm9za2luQGdlb2NpdGllcy5jb20+CisKKwkqIHV0aWwvZ3J1Yi1pbnN0YWxsLmluOiBEb24ndCB1c2UgYCEnIGluIGB0ZXN0JyBmb3IgbW9yZQorCXBvcnRhYmlsaXR5LgorCURvbid0IHVzZSBgZm9yJyB3aXRob3V0IGBpbicgZm9yIGNvbXBhdGFiaWxpdHkgd2l0aCBhc2guCisJQ2hlY2sgaW5zdGFsbF9kZXZpY2UgYmVmb3JlIHJ1bm5pbmcgZ3J1YiBpZiBwb3NzaWJsZS4gQWRkZWQKKwllcnJvciBtZXNzYWdlcyBpZiBpbnN0YWxsX2RldmljZSBpcyBub3Qgc2V0IG9yIG5vdCB1bmlxdWUuCisJRXhpdCBpZiBta2RpciBmYWlscy4KKwlBZGQgYSBtZXNzYWdlIGFib3V0IHN1Y2Nlc3NmdWwgaW5zdGFsbGF0aW9uLgorCVJlbW92ZSB1bm5lZWRlZCBiYWNrc2xhc2ggaW4gdGhlIGZpbmFsIG1lc3NhZ2UuCisJKGNvbnZlcnQpOiB1c2UgYHRlc3QgLWInIGluc3RlYWQgb2YgYHRlc3QgLWUnIGJlY2F1c2UgYXNoCisJZG9lc24ndAl1bmRlcnN0YW5kIHRoZSBsYXRlci4gQ29ycmVjdCBlcnJvciBtZXNzYWdlIGFjY29yZGluZ2x5LgorCQorMjAwMC0wNC0xNyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCVRoZSB1c2VyIGRvZXNuJ3QgaGF2ZSB0byByZWNvbXBpbGUgR1JVQiBmb3IgaGlzL2hlciBidWdneSBCSU9TCisJYW55IGxvbmdlci4gSXQgaXMgY29uZmlndXJhYmxlIHRvIGlnbm9yZSB0aGUgTEJBIHN1cHBvcnQgYml0bWFwCisJYXQgdGhlIGluc3RhbGxhdGlvbiB0aW1lLgorCQorCSogc3RhZ2UxL3N0YWdlMS5TIChmb3JjZV9sYmEpOiBOZXcgdmFyaWFibGUuCisJKHN0YWdlMl9hZGRyZXNzKTogTW92ZWQgZm9yd2FyZHMsIHRvIGFsaWduIHNvbWUgdmFyaWFibGVzIGluCisJbmF0dXJhbCBib3VuZGFyaWVzLgorCShyZWFsX3N0YXJ0KTogQ2hlY2sgaWYgRk9SQ0VfTEJBIGlzIG5vbi16ZXJvLCBpZiBzbywganVtcCB0bworCXNraXBfbGJhX2JpdG1hcF9jaGVjaywgb3RoZXJ3aXNlLCBjaGVjayBpZiBiaXQgMCBvZiB0aGUgc3VwcG9ydAorCWJpdG1hcCBpcyBub24temVyby4KKwlEb24ndCB1c2UgI2lmZGVmIGZvciBDSEVDS19MQkFfU1VQUE9SVF9CSVRNQVAuCisJKHNraXBfbGJhX2JpdG1hcF9jaGVjayk6IE5ldyBsYWJlbC4KKwkqIHN0YWdlMS9zdGFnZTEuaCAoQ09NUEFUX1ZFUlNJT05fTUlOT1IpOiBTZXQgdG8gMS4KKwkoU1RBR0UxX0ZPUkNFX0xCQSk6IE5ldyBtYWNyby4KKwkoU1RBR0UxX1NUQUdFMl9BRERSRVNTKTogU2V0IHRvIDB4NDIuCisJKFNUQUdFMV9TVEFHRTJfU0VDVE9SKTogU2V0IHRvIDB4NDQuCisJKFNUQUdFMV9TVEFHRTJfU0VHTUVOVCk6IFNldCB0byAweDQ4LgorCSogc3RhZ2UyL2FzbS5TIChmb3JjZV9sYmEpOiBOZXcgdmFyaWFibGUuCisJKiBzdGFnZTIvYmlvcy5jIChnZXRfZGlza2luZm8pOiBEb24ndCB1c2UgI2lmZGVmIGZvcgorCUNIRUNLX0xCQV9TVVBQT1JUX0JJVE1BUC4gSW5zdGVhZCwgY2hlY2sgaWYgRk9SQ0VfTEJBIGlzCisJbm9uLXplcm8uIElmIHNvLCBkb24ndCBjaGVjayB0aGUgYml0IDAgb2YgRFJQLkZMQUcuCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoaW5zdGFsbF9mdW5jKTogQ2hlY2sgaWYgYSBuZXcgb3B0aW9uCisJYC0tZm9yY2UtbGJhJyBpcyBzcGVjaWZpZWQuIElmIHNwZWNpZmllZCwgc2V0IElTX0ZPUkNFX0xCQSB0byAxCisJYW5kIHNldCBBUkcgdG8gYSB2YWx1ZSByZXR1cm5lZCBieSBza2lwX3RvLiBPdGhlcndpc2UsCisJSVNfRk9SQ0VfTEJBIGlzIHplcm8uCisJU2V0IHRoZSAiZm9yY2UgTEJBIiBmbGFnIGluIFNUQUdFMV9CVUZGRVIgKHRoZSBvZmZzZXQgaXMKKwlTVEFHRTFfRk9SQ0VfTEJBKSB0byBJU19GT1JDRV9MQkEuCisJTGlrZXdpc2UsIHNldCB0aGUgImZvcmNlIExCQSIgZmxhZyBpbiBTVEFHRTJfU0VDT05EX0JVRkZFUgorCSh0aGUgb2Zmc2V0IGlzIFNUQUdFMl9GT1JDRV9MQkEpIHRvIElTX0ZPUkNFX0xCQS4KKwlJZiBJU19TVEFHRTFfNSBpcyB0cnVlLCB0aGVuIG1vZGlmeSB0aGUgU3RhZ2UyLCByZWdhcmRsZXNzIG9mCisJdGhlIHByZXNlbmNlIG9mIHRoZSBvcHRpb24gUkVBTF9DT05GSUdfRklMRS4gU2V0IHRoZSAiZm9yY2UgTEJBIgorCWZsYWcgaW4gU0NSQVRDSEFERFIgKHRoZSBvZmZzZXQgaXMgU1RBR0UyX0ZPUkNFX0xCQSkgdG8KKwlJU19GT1JDRV9MQkEuCisJKGJ1aWx0aW5faW5zdGFsbCk6IEFkZGVkIGRlc2NyaXB0aW9uIGFib3V0IGAtLWZvcmNlLWxiYScgaW50bworCXRoZSBkb2NzLgorCShzZXR1cF9mdW5jKTogQ2hlY2sgaWYgYC0tZm9yY2UtbGJhJyBpcyBzcGVjaWZpZWQgaW4gQVJHLiBJZgorCXNwZWNpZmllZCwgc2V0IElTX0ZPUkNFX0xCQSB0byAxIGFuZCBzZXQgQVJHIHRvIGEgdmFsdWUgcmV0dXJuZWQKKwlieSBza2lwX3RvLiBPdGhlcndpc2UsIElTX0ZPUkNFX0xCQSBpcyB6ZXJvLgorCUlmIElTX0ZPUkNFX0xCQSBpcyB0cnVlLCBwcmVwZW5kICItLWZvcmNlLWxiYSAiIHRvIENNRF9BUkcuCisJKGJ1aWx0aW5fc2V0dXApOiBBZGRlZCBkZXNjcmlwdGlvbnMgYWJvdXQgYC0tZm9yY2UtbGJhJyBpbnRvIHRoZQorCWRvY3MuCisJKiBzdGFnZTIvc2hhcmVkLmggKFNUQUdFMl9GT1JDRV9MQkEpOiBOZXcgbWFjcm8uCisJKFNUQUdFMl9WRVJfU1RSX09GRlMpOiBTZXQgdG8gMHhlLgorCShmb3JjZV9sYmEpOiBEZWNsYXJlZC4KKwkqIHV0aWwvZ3J1Yi1pbnN0YWxsLmluIChmb3JjZV9sYmEpOiBOZXcgdmFyaWFibGUuIFNldCB0byBhbgorCWVtcHR5IHN0aW5nIGJ5IGRlZmF1bHQuCisJKHVzYWdlKTogQWRkZWQgYSBkZXNjcmlwdGlvbiBhYm91dCBgLS1mb3JjZS1sYmEnLgorCSgtLWZvcmNlLWxiYSk6IENoZWNrZWQgaW4gdGhlIG9wdGlvbiBoYW5kbGluZyBjb2RlLiBJZgorCXNwZWNpZmllZCwgc2V0IEZPUkNFX0xCQSB0byAiLS1mb3JjZS1sYmEiLgorCVJ1biB0aGUgY29tbWFuZCAic2V0dXAiIHdpdGggJGZvcmNlX2xiYSBhZGRlZCBiZWZvcmUKKwkkaW5zdGFsbF9kcml2ZS4KKwkqIGNvbmZpZ3VyZS5pbiAoLS1kaXNhYmxlLWxiYS1zdXBwb3J0LWJpdG1hcCk6IFJlbW92ZWQuCisJCisyMDAwLTA0LTE1ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiB1dGlsL2dydWItaW5zdGFsbC5pbiAocm9vdF9kZXZpY2UpOiBBcHBlbmQgYC8nIHRvICR7cm9vdGRpcn0sCisJc2luY2UgUk9PVERJUiBtYXkgYmUgZW1wdHkuIFJlcG9ydGVkIGJ5IFNhdG9zaGkgTmFnYXlhc3UKKwk8c25hZ2FAb2FrLmZvcnVzLm9yLmpwPi4KKwkKKzIwMDAtMDQtMTUgIEpvY2hlbiBIb2VuaWNrZSAgPGpvY2hlbkBnbnUub3JnPgorCisJKiBjb25maWd1cmUuaW46IEFkZGVkIC0tZGlzYWJsZS1yZWlzZXJmcyBvcHRpb24uCisJKiBzdGFnZTIvTWFrZWZpbGUuYW0gKGxpYmdydWJfYV9TT1VSQ0VTKTogQWRkZWQgZnN5c19yZWlzZXJmcy5jLgorCShsaWJncnViX2FfQ0ZMQUdTKTogQWRkZWQgLURGU1lTX1JFSVNFUkZTPTEuCisJKHBrZ2RhdGFfREFUQSk6IEFkZGVkIHJlaXNlcmZzX3N0YWdlMV81LgorCShub2luc3RfUFJPR1JBTVMpOiBBZGRlZCByZWlzZXJmc19zdGFnZTFfNS5leGVjLgorCShwcmVfc3RhZ2UyX2V4ZWNfU09VUkNFUyk6IEFkZGVkIGZzeXNfcmVpc2VyZnMuYy4KKwkocmVpc2VyZnNfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTKTogTmV3IHZhcmlhYmxlLgorCShyZWlzZXJmc19zdGFnZTFfNV9leGVjX0NGTEFHUyk6IExpa2V3aXNlLgorCShyZWlzZXJmc19zdGFnZTFfNV9leGVjX0xERkxBR1MpOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9kaXNrX2lvLmMgKGZzeXNfdGFibGUpOiBBZGRlZCByZWlzZXJmcyBlbnRyeS4KKwkqIHN0YWdlMi9maWxlc3lzLmggKEZTWVNfUkVJU0VSRlNfTlVNKTogTmV3IG1hY3JvLgorCVtGU1lTX1JFSVNFUkZTXSAocmVpc2VyZnNfbW91bnQsIHJlaXNlcmZzX3JlYWQsIHJlaXNlcmZzX2RpciwKKyAJcmVpc2VyZnNfZW1iZWQpOiBEZWNsYXJlIGV4dGVybmFsIGZ1bmN0aW9uIGZyb20gZnN5c19yZWlzZXJmcy5jLgorCVshTlVNX0ZTWVNdIChOVU1fRlNZUyk6IEFkZGVkIEZTWVNfUkVJU0VSRlNfTlVNLgorCSogc3RhZ2UyL2J1aWx0aW5zLmMgKHNldHVwX2Z1bmMpOiBBZGRlZCByZWlzZXJmcyB0bworCVNUQUdFMV81X01BUC4KKwkqIHN0YWdlMi9zaGFyZWQuaCAoU1RBR0UyX0lEX1JFSVNFUkZTX1NUQUdFMV81KTogTmV3IG1hY3JvLgorCVtTVEFHRTFfNV0gW0ZTWVNfUkVJU0VSRlNdIChTVEFHRTJfSUQpOiBEZWZpbmVkIHRvCisgCVNUQUdFMl9JRF9SRUlTRVJGU19TVEFHRTFfNS4KKwkqIHN0YWdlMi9mc3lzX3JlaXNlcmZzLmM6IE5ldyBmaWxlLgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoZW1iZWRfZnVuYyk6IENhbGwgb3Blbl9kZXZpY2UgaW5zdGVhZCBvZgorCW9wZW5fcGFydGl0aW9uLgorCURvbid0IGNoZWNrIGlmIHRoZSBmaWxlc3lzdGVtIGlzIEZGUy4gSW5zdGVhZCwgY2hlY2sgaWYKKwlGU1lTX1RBQkxFW0ZTWVNfVFlQRV0uRU1CRURfRlVOQyBpcyBOVUxMIGFuZCwgaWYgbm90LCBjYWxsIGl0LgorCShmaW5kX2Z1bmMpOiBXaGVuIENVUlJFTlRfU0xJQ0UgaXMgbm90IGEgQlNEIHNsaWNlLCBjaGVjayBpZiB0aGUKKwlmaWxlIGNhbiBiZSBvcGVuZWQsIG9ubHkgaWYgb3Blbl9kZXZpY2Ugc3VjY2VlZHMuCisJKiBzdGFnZTIvZmlsZXN5cy5oIChmc3lzX3RhYmxlKTogTmV3IGVudHJ5IGVtYmVkX2Z1bmMuCisJKGZmc19lbWJlZCk6IERlY2xhcmVkLgorCSogc3RhZ2UyL2Rpc2tfaW8uYyAoZnN5c190YWJsZSk6IEZpbGwgZW1iZWRfZnVuYyBlbnRyaWVzLiBUaGUKKwllbnRyeSBmb3IgRkZTIGlzIGZmc19lbWJlZCBhbmQgdGhlIG90aGVycyBhcmUgTlVMTHMuCisJKiBzdGFnZTIvZnN5c19mZnMuYyAoZmZzX2VtYmVkKTogTmV3IGZ1bmN0aW9uLgorCisJKiBzdGFnZTIvc2hhcmVkLmggKFNFQ1RPUl9TSElGVCk6IE5ldyBjb25zdGFudCB3aXRoCisJKDEgPDwgU0VDVE9SX1NISUZUKSA9PSBTRUNUT1JfU0laRS4KKwkqIHN0YWdlMi9zaGFyZWQuaCBbIU5PX0JMT0NLX0ZJTEVTXSAoYmxvY2tfZmlsZXMpOiBObyBsb25nZXIKKwlleHRlcm4uCisJKiBzdGFnZTIvZGlza19pby5jIFshTk9fQkxPQ0tfRklMRVNdIChibG9ja19maWxlcyk6IExpa2V3aXNlLgorCShyYXdyZWFkLCBkZXZyZWFkKTogVXNlIFNFQ1RPUl9CSVRTLgorCShyYXdyZWFkKTogRml4ZWQgY2FsY3VsYXRpb24gb2YgQlVGQUREUiBpZiBhbiBlcnJvciBvY2N1cmVkLiBTZXQKKwlpdCB0byBCVUZGRVJBRERSICsgQllURV9PRkZTRVQgaW5zdGVhZCBvZiBCVUZGRVJTRUcgKworCUJZVEVfT0ZGU0VULgorCShncnViX2Nsb3NlKSBbIU5PX0JMT0NLX0ZJTEVTXTogSWYgQkxPQ0tfRklMRSBpcyBub24temVybywKKwlyZXR1cm4gaW1tZWRpYXRlbHkuCisJKGdydWJfY2xvc2UpOiBEb24ndCBjaGVjayBpZiBGU1lTX1RZUEUgaXMgTlVNX0ZTWVMuCisJKiBzdGFnZTIvZnN5c19mYXQuYyAobG9nMik6IE5ldyBpbmxpbmUgZnVuY3Rpb24uCisJKGZhdF9tb3VudCk6IFVzZSBsb2cyIGluc3RlYWQgb2YgY2FsY3VsYXRpbmcgdGhlIHNpemUvYml0IGJ5IGEKKwlsb29wLgorCisyMDAwLTA0LTEyICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBjb25maWd1cmUuaW46IFVzZSBBQ19QQVRIX1BST0cgaW5zdGVhZCBvZiBBQ19QQVRIX1RPT0wsCisJYmVjYXVzZSBJIGRvbid0IHdhbnQgdG8gdXNlIHRoZSBDVlMgdmVyc2lvbi4gTm93IHlvdSBjYW4gdXNlCisJYXV0b2NvbmYgMi4xMy4KKwkKKzIwMDAtMDQtMTAgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9zdGFnZTIuYyAocnVuX21lbnUpOiBJbiB0aGUgY2FzZSB3aGVyZSBDIGlzIGBvJywgY2hlY2sKKwlpZiBFTlRSWU5PIGlzIGxlc3MgdGhhbiAxMS4gSWYgbm90LCBpbmNyZWFzZSBGSVJTVF9FTlRSWSBpbnN0ZWFkCisJb2YgRU5UUllOTy4gUmVwb3J0ZWQgYnkgUGl4ZWwgPHBpeGVsQG1hbmRyYWtlc29mdC5jb20+LgorCQorMjAwMC0wNC0wOSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UxL2RlcGNvbXA6IFJlbW92ZWQsIGJlY2F1c2UgaXQgbWFrZXMgYG1ha2UgZGlzdCcKKwl1bndvcmthYmxlLgorCisJRm9yIGRldmVsb3BlcnM6IERvbid0IHJ1biBhdXRvbWFrZSB3aXRoIC0tYWRkLW1pc3NpbmcuIEluc3RlYWQsCisJeW91IHNob3VsZCBzcGVjaWZ5IC0tZm9yY2UtbWlzc2luZy4gSWYgeW91IHJlYWxseSB3YW50IHRvIGFkZCBhCisJc2NyaXB0IGZyb20gYXV0b21ha2UsIGNvcHkgaXQgYXQgaGFuZC4gKnNpZ2gqCisJCisyMDAwLTA0LTA1ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoa2VybmVsX2Z1bmMpOiBBZGRlZCBtaXNzaW5nIGBgc2l6ZScnCisJYXJndW1lbnRzIGludG8gYGdydWJfbWVtY21wJ3MuIFJlcG9ydGVkIGJ5IENocmlzdG9waCBQbGF0dG5lcgorCTxjaHJpc3RvcGgucGxhdHRuZXJAZG90LmF0Pi4KKworCUZyb20gVG9yc3RlbiBEdXdlIDxkdXdlQGNhbGRlcmEuZGU+OgorCSogc3RhZ2UyL2Jvb3QuYyAobG9hZF9pbml0cmQpOiBNYXNrIHRoZSBhZGRyZXNzIHdpdGggMHgzRkZGRkZGRgorCWluc3RlYWQgb2YgMHhGRkZGRkZGRiB0byBwbGFjZSB0aGUgaW5pdHJkIGJlbG93IDFHQi4KKwkobG9hZF9pbWFnZSk6IEluIExpbnV4IGJvb3QsIGFkZCB0aGUgb3B0aW9uICJtZW09IiBvbmx5IGlmIG1vcmUKKwl0aGFuIDY0TUIgYXJlIHByZXNlbnQuCisJKiBncnViL2FzbXN0dWIuYyBbX19saW51eF9fXTogSW5jbHVkZSA8bGludXgvY2Ryb20uaD4gZm9yCisJQ0RST01fR0VUX0NBUEFCSUxJVFkuCisJW19fRnJlZUJTRF9fIHx8IF9fTmV0QlNEX18gfHwgX19PcGVuQlNEX19dOiBJbmNsdWRlIDxzeXMvY2Rpby5oPgorCWZvciBDRElPQ0NMUkRFQlVHLgorCShjaGVja19kZXZpY2UpIFtfX2xpbnV4X19dIFtDRFJPTV9HRVRfQ0FQQUJJTElUWV06IElmIGlvY3RsIGZvcgorCUNEUk9NX0dFVF9DQVBBSUJJTElUWSBzdWNjZWVkcywgcmV0dXJuIHplcm8uCisJW19fRnJlZUJTRF9fIHx8IF9fTmV0QlNEX18gfHwgX19PcGVuQlNEX19dIFtDRElPQ0NMUkRFQlVHXTogSWYKKwlpb2N0bCBmb3IgQ0RJT0NDTFJERUJVRyBzdWNjZWVkcywgcmV0dXJuIHplcm8uCisKKwkqIHN0YWdlMi9ib290LmMgKGxvYWRfaW5pdHJkKTogU3VidHJhY3QgMHgxMDAwIChvbmUgcGFnZSBzaXplKQorCWZyb20gTU9WRVRPLCB0byBhdm9pZCBhIExpbnV4IDIuMy54eCdzIGJ1Zy4KKwkKKzIwMDAtMDQtMDMgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwlBZGQgYSBkaXJ0eSBoYWNrIGludG8gdGhlIGtlcm5lbCBsb2FkZXIgc28gdGhhdCB0aGUgdXNlciBjYW4KKwlmb3JjZSBHUlVCIHRvIGxvYWQgTmV0QlNEIEVMRiBrZXJuZWxzLiBUaGUgc3VwcG9ydCBjb2RlIGlzCisJbW9zdGx5IHN0b2xlbiBmcm9tIGEgcGF0Y2ggYnkgUGF2ZWwgUm9za2luLgorCQorCSogc3RhZ2UyL2Jvb3QuYyAobG9hZF9pbWFnZSk6IEFkZGVkIGFuIG9wdGlvbmFsIGFyZ3VtZW50CisJU1VHR0VTVEVEX1RZUEUuCisJSWYgQlVGRkVSIGlzIGEgYm9vdGFibGUgRUxGIGltYWdlIGFuZCBTVUdHRVNURURfVFlQRSBpcworCUtFUk5FTF9UWVBFX05FVEJTRCwgdGhlbiBsb2FkIGl0IGFzIGFuIEVMRiBpbWFnZSBhbmQgc2V0IFNUUjIgdG8KKwkiTmV0QlNEIiBhbmQgVFlQRSB0byBTVUdHRVNURURfVFlQRS4KKwlJZiB0aGUgaW1hZ2UgaXMgYSBMaW51eCBrZXJuZWwgYW5kIFNVR0dFU1RFRF9UWVBFIGlzIG5vdAorCUtFUk5FTF9UWVBFX05PTkUsIG1ha2Ugc3VyZSB0aGF0IFNVR0dFU1RFRF9UWVBFIG1hdGNoZXMgdXAgdG8KKwl0aGUgTGludXgga2VybmVsIHR5cGUuCisJSWYgVFlQRSBpcyBLRVJORUxfVFlQRV9ORVRCU0QsIHNldCBNRU1BRERSIHRvCisJUkFXX0FERFIgKHBoZHItPnBhZGRyICYgMHhGRkZGRkYpIGxpa2UgRnJlZUJTRC4KKwlJZiBTVUdHRVNURURfVFlQRSBpcyBub3QgS0VSTkVMX1RZUEVfTk9ORSwgbWFrZSBzdXJlIHRoYXQKKwlTVUdHRVNURURfVFlQRSBpcyBlcXVhbCB0byBUWVBFLgorCShic2RfYm9vdCk6IElmIFRZUEUgaXMgbm90IEtFUk5FTF9UWVBFX0ZSRUVCU0QgKGkuZS4gTmV0QlNEIG9yCisJT3BlbkJTRCkgYW5kIHRoZSBiaXQgTUJfSU5GT19BT1VUX1NZTVMgaXMgc2V0LCBzZXQgRU5EX01BUksgdG8KKwlNQkkuU1lNUy5BLkFERFIgKyA0ICsgTUJJLlNZTVMuQS5UQUJTSVpFICsgTUJJLlNZTVMuQS5TVFJTSVpFLgorCUlmIHRoZSBiaXQgaXMgY2xlYXIsIHNldCBFTkRfTUFSSyB0byAwLgorCVBhc3MgRU5EX01BUksgdG8gKkVOVFJZX0FERFIgaW5zdGVhZCBvZiBkaXJlY3RseSBjYWxjdWxhdGluZyB0aGUKKwllbmQgb2Ygc3ltYm9scy4KKwkqIHN0YWdlMi9zaGFyZWQuaCAobG9hZF9pbWFnZSk6IEFkZGVkIHRoZSBhcmd1bWVudAorCVNVR0dFU1RFRF9UWVBFIHRvIHRoZSBwcm90b3R5cGUuCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoa2VybmVsX2Z1bmMpOiBBZGRlZCBhIG5ldyBvcHRpb24sCisJYC0tdHlwZT1UWVBFJy4gQ2hlY2sgaWYgQVJHIGlzIHN0YXJ0ZWQgd2l0aCAiLS10eXBlPSIuCisJSWYgc28sIHNldCBTVUdHRVNURURfVFlQRSB0byBLRVJORUxfVFlQRV9ORVRCU0QsCisJS0VSTkVMX1RZUEVfRlJFRUJTRCwgS0VSTkVMX1RZUEVfTkVUQlNELCBLRVJORUxfVFlQRV9MSU5VWCwKKwlLRVJORUxfVFlQRV9CSUdfTElOVVgsIEtFUk5FTF9UWVBFX01VTFRJQk9PVCBpZiBBUkcgaXMgIm5ldGJzZCIsCisJImZyZWVic2QiLCAib3BlbmJzZCIsICJsaW51eCIsICJiaWdsaW51eCIsICJtdWx0aWJvb3QiLAorCXJlc3BlY3RpdmVseS4gT3RoZXJ3aXNlLCBzZXQgRVJSTlVNIHRvIEVSUl9CQURfQVJHVU1FTlQgYW5kCisJcmV0dXJuIDEuIFNldCBLRVJORUxfQVJHIHRvIGEgc3RyaW5nIGFmdGVyIHRoZSBvcHRpb24uCisJKGJ1aWx0aW5fa2VybmVsKTogQWRkZWQgYSBkZXNjcmlwdGlvbiBhYm91dCB0aGUgbmV3IG9wdGlvbi4KKwkKKzIwMDAtMDQtMDMgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9zdGFnZTIuYyAocnVuX21lbnUpIFtHUlVCX1VUSUxdOiBSZW1vdmVkIGEgbmVzdGVkCisJIiNpZmRlZiBHUlVCX1VUSUwiIC4uLiAiI2VuZGlmIi4KKwkqIHN0YWdlMi9idWlsdGlucy5jICh1bmhpZGVfZnVuYyk6IERvbid0IG1vZGlmeSBTQVZFRF9EUklWRSBvcgorCVNBVkVEX1BBUlRJVElPTi4KKwkoaGlkZV9mdW5jKTogTGlrZXdpc2UuCisJKiBzdGFnZTIvZGlza19pby5jIChzZXRfcGFydGl0aW9uX2hpZGRlbl9mbGFnKTogVXNlCisJQ1VSUkVOVF9EUklWRSBhbmQgQ1VSUkVOVF9QQVJUSVRJT04gaW5zdGVhZCBvZiBTQVZFRF9EUklWRSBhbmQKKwlTQVZFRF9QQVJUSVRJT04uIENoZWNrIGlmIGJpdCA3IGluIENVUlJFTlRfRFJJVkUgaXMgbm9uLXplcm8KKwlpbnN0ZWFkIG9mIGlmIENVUlJFTlRfRFJJVkUgaXMgbm9uLXplcm8uCisKKwkqIGdydWIvYXNtc3R1Yi5jIChpbml0X2RldmljZV9tYXApOiBDaGFuZ2UgdGhlIG1lc3NhZ2UKKwkiUHJvYmUgZGV2aWNlcy4uLiIgdG8gIlByb2JpbmcgZGV2aWNlcy4uLiIuIFN1Z2dlc3RlZCBieSBOZWFsIEgKKwlXYWxmaWVsZC4KKworCSogc3RhZ2UyL3BjX3NsaWNlLmggKFBDX1NMSUNFX1RZUEVfSElEREVOX0ZMQUcpOiBNb3ZlIHRoZQorCWRlZmluaXRpb24gYmVmb3JlIHRoZSBQQyBwYXJ0aXRpb24gdHlwZSBkZWZpbml0aW9ucy4KKwkoSVNfUENfU0xJQ0VfVFlQRV9GQVQpOiBDbGVhciB0aGUgaGlkZGVuIGZsYWcgaW4gVFlQRSBiZWZvcmUKKwljaGVja2luZyBpZiBUWVBFIGlzIGVpdGhlciBvZiB0aGUgRkFUIHBhcnRpdGlvbiB0eXBlcy4gUmVwb3J0ZWQKKwlieSBUaG9tYXMgU2Nod2Vpa2xlIDx0c2Nod2Vpa2xlQGZpZHVjaWEuZGU+LgorCQorMjAwMC0wNC0wMiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgKHNldHVwX2Z1bmMpOiBEb24ndCByZWFkIGEgc3RhZ2UgMS41IHRvIGdldAorCXRoZSBzaXplLiBVc2UgRklMRU1BWCBpbnN0ZWFkLgorCUlmIGVtYmVkX2Z1bmMgZmFpbHMgKGkuZS4gRVJSTlVNIGlzIG5vbi16ZXJvKSwgZ290byBmYWlsLgorCQorMjAwMC0wNC0wMiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCVN1Z2dlc3RlZCBieSBOZWFsIEggV2FsZmllbGQgPG5lYWxAd2FsZmllbGQub3JnPjoKKwkqIHN0YWdlMi9jb21tb24uYyAoaW5pdF9iaW9zX2luZm8pOiBSZW1vdmVkIGEgbmVzdGVkCisJIiNpZm5kZWYgU1RBR0UxXzUiIC4uLiAiI2VuZGlmIi4KKwkqIHV0aWwvZ3J1Yi1pbnN0YWxsLmluOiBRdW90ZSBtb3N0IG9mIHRoZSByZWZlcmVuY2VzIHRvCisJc2hlbGwgdmFyaWFibGVzIGJ5IGRvdWJsZSBxdW90YXRpb24gbWFya3MuCisJKHVzYWdlKTogQWRkZWQgYSBkZXNjcmlwdGlvbiBhYm91dCB0aGUgYXJndW1lbnQuCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoc2V0dXBfZnVuYyk6IENoYW5nZSBlYWNoIG9mIHRoZSBtZXNzYWdlcworCXdoZW4gcnVubmluZyBlbWJlZF9mdW5jIGFuZCBpbnN0YWxsX2Z1bmMuICJSdW4iIC0+ICJSdW5uaW5nIi4KKwlJZiBpbnN0YWxsX2Z1bmMgc3VjY2VlZHMsIHByaW50IGEgbWVzc2FnZSAoIkRvbmUuIikuCisKKwlGcm9tIEZyYW5rIE1laG5lcnQgPGZtM0Bvcy5pbmYudHUtZHJlc2Rlbi5kZT46CisJKiBzdGFnZTIvY2hhcl9pby5jIChjb252ZXJ0X3RvX2FzY2lpKSBbIVNUQUdFMV81XTogQWNjZXB0ICdYJworCWFuZCAnYicgYXMgd2VsbC4gSWYgQyBpcyAnWCcgb3IgJ2InLCB0aGVuIHNldCBNVUxUIHRvIDE2LgorCShncnViX3ByaW50Zik6IFNldCBhIG5ldyB2YXJpYWJsZSBNQVNLIHRvIDB4RkZGRkZGRkYgYnkgZGVmYXVsdC4KKwlNYXNrICpEQVRBUFRSIHdpdGggTUFTSyB3aGVuIGNhbGxpbmcgY29udmVydF90b19hc2NpaS4KKwkoZ3J1Yl9wcmludGYpIFshU1RBR0UxXzVdOiBBZGRlZCAnYicgYW5kICdYJy4gSWYgQyBpcyAnYicsIHNldAorCU1BU0sgdG8gMHhGRiBhbmQgZmFsbCB0aHJvdWdoIHRvIHRoZSBjYXNlICd1Jy4gJ1gnIGlzIHRoZSBzYW1lCisJYXMgJ3gnLgorCisJRnJvbSBKb3NpcCBSb2RpbiA8am95QGNpYmFsaWEuZ2t2ay5ocj46CisJKiBncnViLnRleGk6IFNldmVyYWwgYXdrd2FyZCBFbmdsaXNoIHNlbnRlbmNlcyBhcmUgZml4ZWQuCisJKiB0dXRvcmlhbC50ZXhpOiBMaWtld2lzZS4KKwkqIHVzZXItcmVmLnRleGk6IExpa2V3aXNlLgorCSogYXBwZW5kaWNlcy50ZXhpOiBMaWtld2lzZS4KKwkKKzIwMDAtMDMtMjcgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMS9kZXBjb21wOiBOZXcgZmlsZS4gQXV0b21ha2UgZm9yY2VzIHRvIGluc3RhbGwgaXQuIFRoaXMKKwlpcyBhIGtub3duIGJ1Zywgc28gSSB3aWxsIHJlbW92ZSB0aGlzIHdoZW4gVG9tIGZpeGVzIGl0LgorCSogY29uZmlndXJlLmluIChBTV9JTklUX0FVVE9NQUtFKTogRG9uJ3QgZ2V0IHRoZSBwYWNrYWdlIG5hbWUKKwlhbmQgdGhlIHZlcnNpb24gZnJvbSBkZWJpYW4vY2hhbmdlbG9nLiBUaGlzIGlzIGEgd29ya2Fyb3VuZC4KKwkKKzIwMDAtMDMtMjAgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9NYWtlZmlsZS5hbSAobm9kaXN0X3BrZ2RhdGFfREFUQSk6IFJlbmFtZWQgdG8gLi4uCisJKHBrZ2RhdGFfREFUQSk6IC4uLiB0aGlzLiBEQVRBIGlzIG5vdCBkaXN0cmlidXRlZCBieSBkZWZhdWx0LgorCShDTEVBTkZJTEVTKTogRGVsZXRlIHRoZSBmaXJzdCBvbmUuIEkgZG9uJ3Qga25vdyB3aHkgdGhpcworCXZhcmlhYmxlIHdhcyBkdXBsaWNhdGVkLgorCVNldCB0byAkKHBrZ2RhdGFfREFUQSkgaW5zdGVhZCBvZiAkKG5vZGlzdF9wa2dkYXRhX0RBVEEpLgorCShzdGFydF9leGVjX0RFUEVOREVOQ0lFUyk6IFJlbW92ZWQuIFRoaXMgZG9lc24ndCBtYWtlIHNlbnNlLgorCShzdGFydF9leGVjLXN0YXJ0Lm8pOiBOZXcgcnVsZS4KKwkqIGRlcGNvbXA6IE5ldyBmaWxlLiBDb3BpZWQgZnJvbSBhdXRvbWFrZS4KKwkqIG1pc3Npbmc6IFVwZGF0ZWQgZnJvbSBhdXRvbWFrZS4KKwkKKzIwMDAtMDMtMTUgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIG5ldGJvb3QvTWFrZWZpbGUuYW0gKEVYVFJBX2xpYmRyaXZlcnNfYV9TT1VSQ0VTKTogM2M4OXgwLmggLT4KKwljczg5eDAuaC4gSnVzdCBhIHR5cG8uCisJCisyMDAwLTAzLTEwICBHb3Jkb24gTWF0emlna2VpdCAgPGdvcmRAZmlnLm9yZz4KKworCSogZGViaWFuL3J1bGVzOiBTdHJpcCBtYmNoay4KKworCSogZGViaWFuL3Bvc3RpbnN0OiBGaXggdXAgL3Vzci9kb2Mgc3ltbGluayBjcmVhdGlvbi4KKworMjAwMC0wMy0wMSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogbmV0Ym9vdC9mc3lzX3RmdHAuYyAodGZ0cF9kaXIpOiBBZGQgQlVGX1JFQUQgaW50byBGSUxFTUFYCisJYWZ0ZXIgQlVGX0VPRiBiZWNvbWVzIG5vbi16ZXJvLiBSZXBvcnRlZCBieSBQZXIgTHVuZGJlcmcuCisJCisyMDAwLTAzLTAxICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoY29sb3JfZnVuYyk6IFJldHVybiAxIGlmIHNhZmVfcGFyc2VfbWF4aW50CisJcmV0dXJucyB6ZXJvIGluc3RlYWQgb2Ygbm9uLXplcm8uIFJlcG9ydGVkIGJ5IE1hZ251cyBIb2xtYmVyZworCTxwdWNrb0BseXNhdG9yLmxpdS5zZT4uCisJCisyMDAwLTAyLTI5ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBncnViL2FzbXN0dWIuYyBbX19saW51eF9fXTogSW5jbHVkZSA8bGludXgva2Rldl90Lmg+IGZvciB0aGUKKwltYWNybyBNQUpPUi4gRnJvbSBLYWxsZSBPbGF2aSBOaWVtaXRhbG8gPHRvc2lAZWVzMi5vdWx1LmZpPi4KKwkKKzIwMDAtMDItMjcgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIGRvY3MvdHV0b3JpYWwudGV4aSAoTmV0d29yayk6IE5ldyBjaGFwdGVyLgorCQorMjAwMC0wMi0yNiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogZG9jcy9oZWxwMm1hbjogVXBncmFkZWQgdG8gMS4wMjAuCisJKiBkb2NzL2dydWIuODogUmVnZW5lcmF0ZWQuCisJKiBkb2NzL2dydWItaW5zdGFsbC44OiBMaWtld2lzZS4KKwkqIGRvY3MvbWJjaGsuMTogTGlrZXdpc2UuCisKKwkqIGRvY3MvdHV0b3JpYWwudGV4aSAoQm9vdCk6IFJld3JpdHRlbiBoZWF2aWx5LiBBZGRlZCB0aGUgbm90ZXMKKwlvbiBGcmVlQlNELCBOZXRCU0QsIE9wZW5CU0QsIERPUy9XaW5kb3dzIGFuZCBTQ08gVW5peFdhcmUuCisJKiBkb2NzL21lbnUubHN0OiBMb2FkICIvYm9vdC9sb2FkZXIiIGluc3RlYWQgb2YgIi9rZXJuZWwiIGluIHRoZQorCUZyZWVCU0QgZW50cnkuIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBkb2N1bWVudGF0aW9uLgorCQorMjAwMC0wMi0yNSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogbmV0Ym9vdC9mc3lzX3RmdHAuYyAodGZ0cF9yZWFkKTogU2V0IEJVRl9SRUFEIHRvIHplcm8gaWYKKwlGSUxFUE9TIGlzIGxlc3MgdGhhbiBTQVZFRF9GSUxFUE9TLCBiZWZvcmUgY2FsbGluZyBidWZfZmlsbC4KKwlEb24ndCBkaXNjYXJkIGFsbCBvZiB0aGUgY29waWVkIGRhdGEgc28gdGhhdCB3ZSBjYW4gbW92ZSBGSUxFUE9TCisJYmFja3dhcmRzIGNoZWFwbHkuIE5vdyBTQVZFRF9GSUxFUE9TIGluZGljYXRlcyB0aGUgZmlsZSBwb3NpdGlvbgorCWNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgQlVGLiBJZiAoRklMRVBPUyAtCisJU0FWRURfRklMRVBPUykgaXMgZ3JlYXRlciB0aGFuIChGU1lTX0JVRkxFTiAvIDIpLCBtb3ZlIHRoZSBkYXRhCisJZm9yd2FyZHMgYW5kIGFkZCAoRlNZU19CVUZMRU4gLyAyKSBpbnRvIFNBVkVEX0ZJTEVQT1MgYW5kCisJc3VidHJhY3QgdGhlIHNhbWUgdmFsdWUgZnJvbSBCVUZfUkVBRC4KKwkKKzIwMDAtMDItMjQgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9kaXNrX2lvLmMgWyFTVEFHRTFfNV0gKHByaW50X2ZzeXNfdHlwZSk6IE1hc2sKKwlDVVJSRU5UX1NMSUNFIHdpdGggMHhGRiB3aGVuIHByaW50aW5nIHRoZSBwYXJ0aXRpb24gdHlwZS4KKworCSogZ3J1Yi9hc21zdHViLmMgW19fbGludXhfX106IEluY2x1ZGUgPGxpbnV4L21ham9yLmg+IGZvciB0aGUKKwlkZWZpbml0aW9uIEZMT1BQWV9NQUpPUi4KKwkoY2hlY2tfZGV2aWNlKSBbX19saW51eF9fXTogU2tpcCB0aGUgSERJT19HRVRHRU8gaW9jdGwgaWYgdGhlCisJbWFqb3IgbnVtYmVyIG9mIFNULlNUX1JERVYgaXMgRkxPUFBZX01BSk9SLgorCQorMjAwMC0wMi0yMSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UyL2Rpc2tfaW8uYyAoY2hlY2tfQlNEX3BhcnRzKSBbIVNUQUdFMV81XTogVXNlIHRoZSB0ZXJtCisJIkJTRCBzdWItcGFydGl0aW9uIiBpbnN0ZWFkIG9mICJCU0Qgc2xpY2UiIGZvciBjb25zaXN0ZW5jeS4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGJvb3RfZnVuYyk6IENvcHkgdGhlIHBhcnRpdGlvbiB0YWJsZSB0bworCUJPT1RfUEFSVF9UQUJMRSBpbnN0ZWFkIG9mIChCT09UU0VDX0xPQ0FUSU9OICsKKwlCT09UU0VDX1BBUlRfT0ZGU0VUKS4gRG9uJ3QgdXNlIGdydWJfbWVtbW92ZSwgYnV0IGNvcHkgaXQKKwlkaXJlY3RseSwgc2luY2UgbWVtY2hlY2sgaXMgdG9vIHN0cmljdC4KKwkqIHN0YWdlMi9kaXNrX2lvLmMgKHJlYWxfb3Blbl9wYXJ0aXRpb24pIFshU1RBR0UxXzVdOiBTZXQKKwlDVVJfUEFSVF9BRERSIHRvIChCT09UX1BBUlRfVEFCTEUgKyAoaSA8PCA0KSkuCisJKiBzdGFnZTIvc2hhcmVkLmggKEJPT1RfUEFSVF9UQUJMRSk6IE5ldyBtYWNyby4KKwkoY2hhaW5fc3RhZ2UxKTogQ2hhbmdlIHRoZSB0eXBlcyBvZiBhbGwgdGhlIGFyZ3VtZW50cyB0bworCXVuc2lnbmVkIGxvbmcuCisJKGNoYWluX3N0YWdlMik6IExpa2V3aXNlLgorCSogZ3J1Yi9hc21zdHViLmMgKGNoYWluX3N0YWdlMSk6IEFkanVzdGVkIHRvIHRoZSBwcm90b3R5cGUuCisJKGNoYWluX3N0YWdlMik6IExpa2V3aXNlLgorCQorMjAwMC0wMi0yMSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UyL2Rpc2tfaW8uYyAoY2hlY2tfQlNEX3BhcnRzKSBbIVNUQUdFMV81XTogSWYgdGhlIEJTRAorCWxhYmVsIGlzIGludmFsaWQsIHByaW50IGEgbWVzc2FnZSB3aXRoIHRoZSBwYXJ0aXRpb24gdHlwZSBpbiB0aGUKKwljYXNlIHdoZXJlIEZMQUdTIGlzIG5vbi16ZXJvIGFuZCBET19DT01QTEVUSU9OIGlzIHplcm8uCisJCisyMDAwLTAyLTIwICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBkb2NzL3VzZXItcmVmLnRleGkgKENvbW1hbmQtbGluZS1zcGVjaWZpYyBjb21tYW5kcyk6IEFkZGVkIGEKKwlkZXNjcmlwdGlvbiBhYm91dCAiY21wIi4KKwkqIGRvY3MvYXBwZW5kaWNlcy50ZXhpIChSZXBvcnRpbmcgYnVncyk6IFJld3JpdHRlbi4KKwkKKzIwMDAtMDItMjAgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwlVcGRhdGUgdGhlIG5ldGJvb3QgY29kZSB0byBFdGhlcmJvb3QgNC40LjMuCisJCisJKiBuZXRib290L25ldGJvb3RfY29uZmlnLmg6IENvcGllZCBmcm9tIGV0aGVyYm9vdC00LjQuMy4KKwkqIG5ldGJvb3QvY3M4OXgwLmg6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9jczg5eDAuYzogTGlrZXdpc2UuCisJKiBuZXRib290L2k4MjU4Ni5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvbGFuY2UuYzogTGlrZXdpc2UuCisJKiBuZXRib290L2xpbnV4LWFzbS1zdHJpbmcuaDogTGlrZXdpc2UuCisJKiBuZXRib290L25pYy5oOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvbnR1bGlwLmM6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9vc2RlcC5oOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvcGNpLmg6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9wY2kuYzogTGlrZXdpc2UuCisJKiBuZXRib290L3J0bDgxMzkuYzogTGlrZXdpc2UuCisJKiBuZXRib290L3RpYXJhLmM6IExpa2V3aXNlLgorCQorMjAwMC0wMi0xOSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGNtcF9mdW5jKTogTmV3IGZ1bmN0aW9uLgorCShidWlsdGluX2NtcCk6IE5ldyB2YXJpYWJsZS4KKwkoYnVpbHRpbl90YWJsZSk6IEFkZGVkIGEgcG9pbnRlciB0byBCVUlMVElOX0NNUC4KKworCSogc3RhZ2UyL2ZzeXNfZmF0LmMgKGZhdF9tb3VudCk6IENoZWNrIGlmIEJQQi5TRUNUU19QRVJfQ0xVU1QgaXMKKwl6ZXJvIGFmdGVyIHJlYWRpbmcgdGhlIEJQQiB0byBhdm9pZCB6ZXJvIGRpdmlzaW9uLgorCQorMjAwMC0wMi0xOCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UyL2Rpc2tfaW8uYyBbIVNUQUdFMV81XSAobWFrZV9zYXZlZF9hY3RpdmUpOiBNYWtlIHN1cmUKKwl0aGF0IFNBVkVEX1BBUlRJVElPTiBpcyBub3QgYW4gZXh0ZW5kZWQgcGFydGl0aW9uLgorCUlmIFNBVkVEX0RSSVZFIGlzIG5vdCBhIGhhcmQgZGlzayBkcml2ZSwgc2V0IEVSUk5VTSB0bworCUVSUl9ERVZfVkFMVUVTIGFuZCByZXR1cm4gemVyby4KKworCSogbmV0Ym9vdC8zYzU5eC5jOiBSZW1vdmVkLgorCSogbmV0Ym9vdC9NYWtlZmlsZS5hbSAoRVhUUkFfbGliZHJpdmVyc19hX1NPVVJDRVMpOiBEZWxldGVkCisJM2M1OXguYy4KKwkoM2M1OXhfZHJpdmVycyk6IERlbGV0ZWQuCisJKDNjNTl4X29fQ0ZMQUdTKTogTGlrZXdpc2UuCisJKiBjb25maWd1cmUuaW4gKC0tZW5hYmxlLTNjNTl4KTogTGlrZXdpc2UuCisJCisyMDAwLTAyLTE3ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBjb25maWd1cmUuaW4gKC0tZW5hYmxlLTNjOTB4KTogQWRkIC1ESU5DTFVERV8zQzkwWD0xIGluc3RlYWQKKwlvZiAtRElOQ0xVREVfM0M5MHg9MS4gVGhpcyB3YXMganVzdCBhIHR5cG8uIFJlcG9ydGVkIGJ5IFBlcgorCUx1bmRiZXJnLgorCQorMjAwMC0wMi0xNyAgSm9jaGVuIEhvZW5pY2tlICA8am9jaGVuQGdudS5vcmc+CisJCisJKiBzdGFnZTIvZnN5c19mYXQuYyAoZmF0X3JlYWQpOiBGb3Jnb3QgdG8gaW5jcmVhc2UgQlVGLgorCShmYXRfZGlyKTogVXNlIGZhdF9yZWFkIGluc3RlYWQgb2YgZ3J1Yl9yZWFkOyB0aGlzIG1ha2VzCisJc2V0dGluZyB0aGUgRlNNQVggdW5uZWNlc3NhcnkuCisJKGZhdF9tb3VudCk6IEZTTUFYIGlzIG5vIGxvbmdlciBzZXQuCisJCisyMDAwLTAyLTE2ICBKb2NoZW4gSG9lbmlja2UgIDxqb2NoZW5AZ251Lm9yZz4KKworCSogc3RhZ2UyL2NoYXJfaW8uYyAoZ3J1Yl9pc3NwYWNlKTogTWFrZSBjYXJyaWFnZSByZXR1cm4gYSB3aGl0ZQorCXNwYWNlLgorCQorCSogc3RhZ2UyL2ZzeXNfZmF0LmMgKGZhdF9kaXIpOiBMb25nIGZpbGVuYW1lIHN1cHBvcnQuCisJKE5BTUVfQlVGKTogTmV3IG1hY3JvLgorCSogc3RhZ2UyL2ZhdC5oIChGQVRfTE9OR0RJUl9JRCwgRkFUX0xPTkdESVJfQUxJQVNDSEVDS1NVTSwKKwlGQVRfQVRUUklCX0xPTkdOQU1FKTogTmV3IE1hY3Jvcy4KKworCSogc3RhZ2UyL2ZzeXNfZmF0LmMgKGZhdF9jcmVhdGVfYmxvY2tsaXN0KTogRGVsZXRlZCwgaW5zdGVhZAorCWZhdF9yZWFkIGlzIGltcGxlbWVudGVkLgorCShmYXRfcmVhZCk6IG5ldyBmdW5jdGlvbi4KKwkqIHN0YWdlMi9kaXNrX2lvLmMgKGZzeXNfdGFibGUpOiBVc2UgZmF0X3JlYWQuCisJKiBzdGFnZTIvZmlsZXN5cy5oOiBEZWNsYXJlIGZhdF9yZWFkLCByZW1vdmUgTk9fQkxPQ0tfRklMRVMKKwloYWNrLgorCSogc3RhZ2UyL01ha2VmaWxlLmFtOiBDb21waWxlIGZhdF9zdGFnZTFfNSB3aXRoCisJLUROT19CTE9DS19GSUxFUz0xLgorCQorCSogc3RhZ2UyL2ZhdC5oIChmYXRfYnBiKTogTmV3IHN0cnVjdHVyZSBkZXNjcmliaW5nIGJwYi4KKwkoRkFUX0NWVF9VMTYpOiBOZXcgbWFjcm8uCisJKEZBVF9CUEJfQ0hFQ0tfU0lHLCBGQVRfQlBCX05VTV9TRUNUT1JTLAorCUZBVF9CUEJfQllURVNfUEVSX1NFQ1RPUiwgRkFUX0JQQl9TRUNUX1BFUl9DTFVTLCBGQVRfQlBCX05VTUZBVCwKKwlGQVRfQlBCX1JFU0VSVkVEX1NFQ1RPUlMsIEZBVF9CUEJfRkFUX1NFQ1RPUlNfMTYsCisJRkFUX0JQQl9GQVRfU0VDVE9SU18zMiwgRkFUX0JQQl9JU19GQVQzMiwgRkFUX0JQQl9GQVRfU0VDVE9SUywKKwlGQVRfQlBCX0ZBVF9TVEFSVCwgRkFUX0JQQl9ST09UX0RJUl9DTFVTVEVSLAorCUZBVF9CUEJfSElEREVOX1NFQ1RPUlMsIEZBVF9CUEJfUk9PVF9ESVJfU1RBUlQsCisJRkFUX0JQQl9ST09UX0RJUl9MRU5HVEgsIEZBVF9CUEJfREFUQV9PRkZTRVQsCisJRkFUX0JQQl9OVU1fQ0xVU1QpOiBNYWNyb3MgcmVtb3ZlZC4KKwkqIHN0YWdlMi9mc3lzX2ZhdC5jIChmYXRfc3VwZXJibG9jayk6IE5ldyBzdHJ1Y3R1cmUgY29udGFpbmluZworCWFsbCBpbmZvIGFib3V0IGN1cnJlbnRseSBtb3VudGVkIGZpbGVzeXN0ZW0uCisJKEZBVF9TVVBFUik6IE5ldyBNYWNyby4KKwkoQlBCKTogTWFjcm8gcmVtb3ZvZC4KKwkoZmF0X21vdW50KTogVXNlIGZhdF9icGIgc3RydWN0dXJlLCBmaWxsIEZBVF9TVVBFUi4KKwkoZmF0X3JlYWQsIGZhdF9kaXIpOiBVc2UgRkFUX1NVUEVSIGluZm8uCisKKzIwMDAtMDItMTYgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwlQYXNzIHRoZSBib290IHBhcnRpdGlvbiBpbmZvcm1hdGlvbiB0byBhIGNoYWluLWxvYWRlciwgaW4gdGhlCisJcGFydGl0aW9uIHRhYmxlIGFyZWEgb2YgdGhlIGxvYWRlciwgaW5zdGVhZCBvZiByaWdodCBiZWZvcmUgdGhlCisJbG9hZGVkIGFkZHJlc3MuIFJlcG9ydGVkIGJ5IHRha2VoaXJvQGNvcmFsLm9jbi5uZS5qcCAoVGFrZWhpcm8KKwlTdXp1a2kpLgorCQorCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGNoYWlubG9hZGVyX2Z1bmMpOiBFbWJlZCB0aGUgcGFydGl0aW9uCisJdGFibGUgb2YgdGhlIGJvb3QgZHJpdmUgaW4gdGhlIHBhcnRpdGlvbiB0YWJsZSBhcmVhIG9mIHRoZQorCWNoYWluLWxvYWRlciwgaWYgdGhlIGJvb3QgZHJpdmUgaXMgYSBoYXJkIGRpc2sgZHJpdmUuCisJUGFzcyBCT09UX1BBUlRfQUREUiBpbnN0ZWFkIG9mIChCT09UU0VDX0xPQ0FUSU9OIC0gMTYpIGFzIHRoZQorCXRoaXJkIGFyZ3VtZW50IGZvciB0aGUgZnVuY3Rpb24gY2hhaW5fc3RhZ2UxLgorCSogc3RhZ2UyL2Rpc2tfaW8uYyBbIVNUQUdFMV81XSAoYm9vdF9wYXJ0X2FkZHIpOiBOZXcgdmFyaWFibGUuCisJWyFTVEFHRTFfNV0gKGJvb3RfcGFydF9vZmZzZXQpOiBMaWtld2lzZS4KKwlbIVNUQUdFMV81XSAoY3VyX3BhcnRfb2Zmc2V0KTogTGlrZXdpc2UuCisJWyFTVEFHRTFfNV0gKGN1cl9wYXJ0X2FkZHIpOiBMaWtld2lzZS4KKwlbIVNUQUdFMV81XSAoY3VyX3BhcnRfZGVzYyk6IFJlbW92ZWQuCisJKHJlYWxfb3Blbl9wYXJ0aXRpb24pIFshU1RBR0UxXzVdOiBTZXQgQ1VSX1BBUlRfT0ZGU0VUIGFuZAorCUNVUl9QQVJUX0FERFIgdG8gUEFSVF9PRkZTRVQgYW5kIChCT09UU0VDX0xPQ0FUSU9OICsKKwlQQ19TTElDRV9PRkZTRVQgKyAoaSA8PCA0KSksIHJlc3BlY3RpdmVseS4KKwlbIVNUQUdFMV81XSAoc2V0X2Jvb3RkZXYpOiBTZXQgQk9PVF9QQVJUX09GRlNFVCBhbmQKKwlCT09UX1BBUlRfQUREUiB0byBDVVJfUEFSVF9PRkZTRVQgYW5kIENVUl9QQVJUX0FERFIsCisJcmVzcGVjdGl2ZWx5LgorCSogc3RhZ2UyL3NoYXJlZC5oIChib290X3BhcnRfYWRkcik6IERlY2xhcmVkLgorCShib290X3BhcnRfb2Zmc2V0KTogTGlrZXdpc2UuCisJCisyMDAwLTAyLTEyICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoZ2VvbWV0cnlfZnVuYyk6IEF0dGVtcHQgdG8gcmVhZCB0aGUgZmlyc3QKKwlzZWN0b3IgdG8gZXhhbWluZSBpZiBMQkEgbW9kZSBpcyByZWFsbHkgc3VwcG9ydGVkLgorCisJKiBuZXRib290L2ZzeXNfdGZ0cC5jIChidWZfZmlsbCkgW1RGVFBfREVCVUddOiBBZGRlZCBzb21lIGRlYnVnCisJbWVzc2FnZXMuCisJKHNlbmRfcnJxKSBbVEZUUF9ERUJVR106IExpa2V3aXNlLgorCSh0ZnRwX3JlYWQpIFtURlRQX0RFQlVHXTogTGlrZXdpc2UuCisJKHRmdHBfZGlyKSBbVEZUUF9ERUJVR106IExpa2V3aXNlLgorCSh0ZnRwX2Nsb3NlKSBbVEZUUF9ERUJVR106IExpa2V3aXNlLgorCSh0ZnRwX3JlYWQpOiBDYWxsIGJ1Zl9maWxsIHdpdGggdGhlIGFyZ3VtZW50IDEgZmlyc3QsIGlmIEZJTEVQT1MKKwloYXMgYmVlbiBtb3ZlZCBiYWNrd2FyZHMsIGFuZCB1c2UgZ3J1Yl9tZW1tb3ZlIGZvciBjb3B5aW5nCisJU0FWRURfVFAgdG8gVFAgaW5zdGVhZCBvZiBhIGRpcmVjdCBhc3NpZ25tZW50LgorCUlmIHNlbmRfcnJxIGZhaWxzLCBzZXQgRVJSTlVNIHRvIEVSUl9XUklURSBpbnN0ZWFkIG9mIEVSUl9SRUFELgorCUNoZWNrIGlmIEJVRl9SRUFEIGlzIHplcm8gaW5zdGVhZCBvZiBpZiBCVUZfRU9GIGlzIG5vbi16ZXJvIGF0CisJdGhlIGVuZCBvZiB0aGUgbG9vcC4KKwkodGZ0cF9kaXIpOiBTZXQgRVJSTlVNIHRvIEVSUl9XUklURSBpbnN0ZWFkIG9mIEVSUl9SRUFELCBpZgorCXNlbmRfcnJxIGZhaWxzLgorCVNhdmUgVFAgYW5kIExFTiBpbiBTQVZFRF9UUCBhbmQgU0FWRURfTEVOIHJlc3BlY3RpdmVseSBiZWZvcmUKKwlidWZfZmlsbCBpbnN0ZWFkIG9mIGFmdGVyIGl0LCBiZWNhdXNlIGl0IGRlc3Ryb3lzIHRoZSBjb250ZW50cworCW9mIFRQLgorCSogbmV0Ym9vdC9tYWluLmMgKHByaW50X25ldHdvcmtfY29uZmlndXJhdGlvbik6IFRoZSBvcmRlciBvZiB0aGUKKwlhcmd1bWVudHMgZm9yIGdydWJfc3ByaW50ZiBpbiB0aGUgbG9jYWwgZnVuY3Rpb24gc3ByaW50X2lwX2FkZHIKKwlpcyByZXZlcnNlZC4KKworCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1wYWNrZXRfcmV0cmFuc21pc3Npb24pOiBSZW5hbWVkIHRvIC4uLgorCSgtLWRpc2FibGUtcGFja2V0LXJldHJhbnNtaXNzaW9uKTogLi4uIHRoaXMuIEFzc3VtZSB0aGF0IGEKKwluZXR3b3JrCWlzIGNvbmdlc3RlZCBieSBkZWZhdWx0LgorCQorMjAwMC0wMi0xMSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCUZyb20gUGF2ZWwgUm9za2luOgorCSogc3RhZ2UyL3NoYXJlZC5oIFshR1JVQl9TSEFSRURfSEVBREVSXSAoR1JVQl9TSEFSRURfSEVBREVSKToKKwlEZWZpbmVkLgorCVtHUlVCX1NIQVJFRF9IRUFERVJdOiBEb24ndCBkZWNsYXJlIG9yIGRlZmluZSBhbnl0aGluZy4KKworCSogbmV0Ym9vdC9tYWluLmMgKHByaW50X25ldHdvcmtfY29uZmlndXJhdGlvbik6IE5ldyBmdW5jdGlvbi4KKwkoYXdhaXRfcmVwbHkpOiBDaGVjayBmb3IgQ29udHJvbC1DIGluc3RlYWQgb2YgRVNDLCBiZWNhdXNlIEdSVUIKKwlhbHJlYWR5IHVzZXMgRVNDIGZvciBhbm90aGVyIHB1cnBvc2UuCisJKHJmYzk1MV9zbGVlcCk6IENoZWNrIGZvciB0aGUga2V5IGlucHV0IGluIHRoZSBsb29wLiBJZgorCUNvbnRyb2wtQyBpcyBwdXNoZWQsIHJldHVybiBpbW1lZGlhdGVseS4KKwkqIG5ldGJvb3QvZXRoZXJib290IChwcmludF9uZXR3b3JrX2NvbmZpZ3VyYXRpb24pOiBEZWNsYXJlZC4KKwkoQ1RSTF9DKTogTmV3IG1hY3JvLgorCShFU0MpOiBVbmRlZmluZWQuCisJKiBuZXRib290L2NvbmZpZy5jIChldGhfcHJvYmUpOiBDbGVhciBBUlBUQUJMRSBhZnRlciBjbGVhcmluZworCU5FVFdPUktfUkVBRFkuCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoYm9vdHBfZnVuYyk6IENhbGwKKwlwcmludF9uZXR3b3JrX2NvbmZpZ3VyYXRpb24gaWYgYm9vdHAgc3VjY2VlZHMuCisJKHJhcnBfZnVuYyk6IENhbGwgcHJpbnRfbmV0d29ya19jb25maWd1cmF0aW9uIGlmIHJhcnAgc3VjY2VlZHMuCisJCisyMDAwLTAyLTExICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJRnJvbSBQZXIgTHVuZGJlcmcgPHBsdW5kaXNAYnlnZ2Rvay5zZT46CisJKiBkb2NzL211bHRpYm9vdC50ZXhpOiBBZGRlZCBncmFwaGljcyBzdXBwb3J0LgorCQorMjAwMC0wMi0xMCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogZG9jcy9tdWx0aWJvb3QudGV4aSAoVG9wKTogRG93bmdyYWRlIHRoZSB2ZXJzaW9uIHRvIDAuNi45MCwKKwlzaW5jZSB3ZSBuZWVkIG1vcmUgd29yayB0byByZWxlYXNlIGl0IGFzIDAuNy4KKwkKKzIwMDAtMDItMTAgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9NYWtlZmlsZS5hbSBbTkVUQk9PVF9TVVBQT1JUXSAoU1RBR0UyX0NPTVBJTEUpOiBBZGRlZAorCS1JJCh0b3Bfc3JjZGlyKS9uZXRib290IGFuZCAtRFNVUFBPUlRfTkVUQk9PVD0xLgorCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGJvb3RwX2Z1bmMpOiBOZXcgZnVuY3Rpb24uCisJKGRoY3BfZnVuYyk6IExpa2V3aXNlLgorCShyYXJwX2Z1bmMpOiBMaWtld2lzZS4KKwkoYnVpbHRpbl9ib290cCk6IE5ldyB2YXJpYWJsZS4KKwkoYnVpbHRpbl9kaGNwKTogTGlrZXdpc2UuCisJKGJ1aWx0aW5fcmFycCk6IExpa2V3aXNlLgorCShidWlsdGluX3RhYmxlKTogQWRkZWQgcG9pbnRlcnMgdG8gQlVJTFRJTl9CT09UUCwgQlVJTFRJTl9ESENQCisJYW5kIEJVSUxUSU5fUkFSUC4KKwkqIGRvY3MvdXNlci1yZWYudGV4aSAoR2VuZXJhbCBDb21tYW5kcyk6IEFkZGVkIGRlc2NyaXB0aW9ucworCWFib3V0ICJib290cCIsICJkaGNwIiBhbmQgInJhcnAiLgorCQorCSogbmV0Ym9vdC9tYWluLmMgKGJvb3RwKSBbIU5PX0RIQ1BfU1VQUE9SVF06IEFkZGVkIGNhc3RzIHRvCisJc3VwcHJlc3MgZ2NjIHdhcm5pbmdzLgorCShkZWNvZGVfcmZjMTUzMykgWyFOT19ESENQX1NVUFBPUlRdOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvM2M5MHguYzogSW5jbHVkZSB0aGUgbG9jYWwgInBjaS5oIiBpbnN0ZWFkIG9mCisJPGxpbnV4L3BjaS5oPiBldmVuIGlmIF9fRnJlZUJTRF9fIGlzIHVuZGVmaW5lZC4KKwkKKzIwMDAtMDItMDkgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwlGcm9tIEpvY2hlbiBIb2VuaWNrZToKKwkqIHN0YWdlMi9mc3lzX2ZhdC5jIChmYXRfY3JlYXRlX2Jsb2NrbGlzdCk6IFRoZSBwcmV2aW91cyBjaGFuZ2UKKwlpcyByZXZlcnNlZC4gU2V0IEZJUlNUX0ZBVF9FTlRSWSB0byBhIHVuc2lnbmVkIGxvbmcgdmFsdWUgaW4KKwlGQVRfQlVGICsgKE5FV19NQVBCTE9DSyAtIE1BUEJMT0NLKSBpbnN0ZWFkIG9mIGEgdW5zaWduZWQgc2hvcnQKKwl2YWx1ZS4gTWFzayBGSVJTVF9GQVRfRU5UUlkgd2l0aCAweEZGRiBpZiBGQVRfU0laRSBpcyBlcXVhbCB0bworCTMsIHdoZXRoZXIgdGhlIGJpdCAwIG9mIExBU1RfRkFUX0VOVFJZIGlzIHNldCBvciBub3QuCisKKwkqIG5ldGJvb3QvY29uZmlnLmMgKGV0aF9wcm9iZSk6IElmIFBST0JFRCBpcyBzZXQgdG8gbm9uLXplcm8sCisJcmV0dXJuIDEgd2l0aG91dCBwcm9iaW5nIGV0aGVybmV0IGNhcmRzLiBDbGVhciBORVRXT1JLX1JFQURZLiBJZgorCSpULT5FVEhfUFJPQkUgcmV0dXJuIHN1Y2Vzc2Z1bGx5LCBzZXQgUFJPQkVEIHRvIDEuCisJKiBuZXRib290L21haW4uYyAocmFycCk6IENhbGwgZXRoX3Byb2JlIGFuZCByZXR1cm4gemVybyBpZgorCWZhaWxzLiBDbGVhciBORVRXT1JLX1JFQURZIGF0IGZpcnN0LCBhbmQgc2V0IE5FVFdPUktfUkVBRFkgdG8gMQorCWlmIFJFVFJZIGlzIGxlc3MgdGhhbiBNQVhfQVJQX1JFVFJJRVMuIElmIElQX0FCT1JUIGlzIG5vbi16ZXJvLAorCXJldHVybiB6ZXJvIGluc3RlYWQgb2Ygb25lLgorCShib290cCk6IENhbGwgZXRoX3Byb2JlIGFuZCByZXR1cm4gemVybyBpZiBmYWlscy4gQ2xlYXIKKwlORVRXT1JLX1JFQURZIGF0IGZpcnN0LCBhbmQgc2V0IE5FVFdPUktfUkVBRFkgdG8gMSBpZgorCWF3YWl0X3JlcGx5IHJldHVybnMgc3VjY2Vzc2Z1bGx5LgorCShib290cCkgW1Q1MDlIQUNLXTogSWYgRkxBRyBpcyBub24temVybywgc2tpcCBjYWxsaW5nCisJYXdhaXRfcmVwbHkuIERvbid0IGNhbGwgYXdhaXRfcmVwbHkgaGVyZSBhbnkgbW9yZS4KKwkoYm9vdHApIFshTk9fREhDUF9TVVBQT1JUXTogSWYgYW55IGFjayBwYWNrZXQgaXMgbm90IHJlYWNoZWQKKwl3aXRoaW4gTUFYX0JPT1RQX1JFVFJJRVMgdGltZXMsIHJldHVybiB6ZXJvLiBJZiBESENQX1JFUExZIGlzbid0CisJREhDUE9GRkVSLCBzZXQgTkVUV09SS19SRUFEWSB0byBvbmUgYW5kIHJldHVybiBvbmUuCisJKiBuZXRib290L2V0aGVyYm9vdC5oIChOT19ESENQX1NVUFBPUlQpOiBVbmRlZmluZWQuCisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChwcmludF9yb290X2RldmljZSk6IFVzZSB0aGUgbWFjcm8KKwlORVRXT1JLX0RSSVZFIGluc3RlYWQgb2YgMHgyMC4KKwkqIHN0YWdlMi9kaXNrX2lvLmMgWyFTVEFHRTFfNV0gKHNhbmVfcGFydGl0aW9uKTogTGlrZXdpc2UuCisJKHJlYWxfb3Blbl9wYXJ0aXRpb24pIFshU1RBR0UxXzVdOiBMaWtld2lzZS4KKwkoc2V0X2RldmljZSkgWyFTVEFHRTFfNV06IExpa2V3aXNlLgorCQorMjAwMC0wMi0wOCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogZ3J1Yi9hc21zdHViLmMgKGJpb3NkaXNrKSBbX19saW51eF9fXTogVXNlIF9sbHNlZWsgd2hlbgorCV9fR0xJQkNfTUlOT1JfXyBpcyBsZXNzIHRoYW4gMSBldmVuIGlmIF9fR0xJQkNfXyBpcyAyLiBSZXBvcnRlZAorCWJ5IEdvcmFuIEtvcnVnYSA8Z29yYW4ua29ydWdhQGhlcm1lcy5zaT4uCisKKwkqIGNvbmZpZ3VyZS5pbiAoLS1kaXNhYmxlLWxiYS1zdXBwb3J0LWJpdG1hcC1jaGVjayk6IE5ldyBvcHRpb24uCisJRG9uJ3QgZGVmaW5lIENIRUNLX0xCQV9TVVBQT1JUX0JJVE1BUCBpZiBzcGVjaWZpZWQuCisJKiBzdGFnZTEvc3RhZ2UxLlMgKHJlYWxfc3RhcnQpOiBDaGVjayBpZiBBSD0weDQyIGlzIHN1cHBvcnRlZCBpZgorCUNIRUNLX0xCQV9TVVBQT1JUX0JJVE1BUCBpbnN0ZWFkIG9mIE5PX0JVR0dZX0JJT1NfSU5fVEhFX1dPUkxECisJaXMgZGVmaW5lZC4KKwkqIHN0YWdlMi9iaW9zLmMgKGdldF9kaXNraW5mbyk6IENoZWNrIGlmIExCQSByZWFkL3dyaXRlCisJZnVuY3Rpb25zIGFyZSBzdXBwb3J0ZWQgaWZmIENIRUNLX0xCQV9TVVBQT1JUX0JJVE1BUCBpcyBkZWZpbmVkLAorCWluc3RlYWQgb2YgTk9fQlVHR1lfQklPU19JTl9USEVfV09STEQuCisJCisyMDAwLTAyLTA3ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJVGhlIG5ldGJvb3Qgc3VwcG9ydCBpcyBoZWF2aWx5IHJld3JpdHRlbiwgYmFzZWQgb24KKwlFdGhlcmJvb3QtNC40LjIuIFRoZSBjdXJyZW50IG9uZSBkb2Vzbid0IHdvcmsgeWV0LCBzbyBjaGVjayBvdXQKKwlHUlVCIHdpdGggdGhlIHRhZyAiZHJlc2Rlbl9uZXRib290X2NvZGUiIGlmIHlvdSBuZWVkIHdvcmtpbmcKKwlvbmUuCisJCisJKiBjb25maWd1cmUuaW4gKC0tZW5hYmxlLXRmdHApOiBEZWxldGVkLgorCShGU1lTX0NGTEFHUyk6IGBBQ19TVUJTVCdlZCByaWdodCBiZWZvcmUgQUNfT1VUUFVULgorCShORVRCT09UX0RSSVZFUlMpOiBOZXcgdmFyaWFibGUuIEFDX1NVQlNUIHRoaXMgYWZ0ZXIgZXhhbWluaW5nCisJdGhlIGRyaXZlciBvcHRpb25zLgorCSgtLWVuYWJsZS1wYWNrZXQtcmV0cmFuc21pc3Npb24pOiBOZXcgb3B0aW9uLgorCSgtLWVuYWJsZS1wY2ktZGlyZWN0KTogTGlrZXdpc2UuCisJKC0tZW5hYmxlLTNjNTA5KTogTGlrZXdpc2UuCisJKC0tZW5hYmxlLTNjNTI5KTogTGlrZXdpc2UuCisJKC0tZW5hYmxlLTNjOTB4KTogTGlrZXdpc2UuCisJKC0tZW5hYmxlLWNzODl4MCk6IExpa2V3aXNlLgorCSgtLWVuYWJsZS1lcGljMTAwKTogTGlrZXdpc2UuCisJKC0tZW5hYmxlLTNjNTA3KTogTGlrZXdpc2UuCisJKC0tZW5hYmxlLWV4b3MyMDUpOiBMaWtld2lzZS4KKwkoLS1lbmFibGUtbmk1MjEwKTogTGlrZXdpc2UuCisJKC0tZW5hYmxlLWxhbmNlcGNpKTogTGlrZXdpc2UuCisJKC0tZW5hYmxlLW5lMjEwMCk6IExpa2V3aXNlLgorCSgtLWVuYWJsZS1uaTY1MTApOiBMaWtld2lzZS4KKwkoLS1lbmFibGUtM2M1MDMpOiBMaWtld2lzZS4KKwkoLS1lbmFibGUtbnR1bGlwKTogTGlrZXdpc2UuCisJKC0tZW5hYmxlLXJ0bDgxMzkpOiBMaWtld2lzZS4KKwkoLS1lbmFibGUtc2stZzE2KTogTGlrZXdpc2UuCisJKC0tZW5hYmxlLXNtYzkwMDApOiBMaWtld2lzZS4KKwkoLS1lbmFibGUtdGlhcmEpOiBMaWtld2lzZS4KKwkoLS1lbmFibGUtdHVsaXApOiBMaWtld2lzZS4KKwkoLS1lbmFibGUtdmlhLXJoaW5lKTogTGlrZXdpc2UuCisJKC0tZW5hYmxlLTNjNTAzLXNobWVtKTogTGlrZXdpc2UuCisJKC0tZW5hYmxlLTNjNTAzLWF1aSk6IExpa2V3aXNlLgorCSgtLWVuYWJsZS0zYzUwOS1oYWNrKTogTGlrZXdpc2UuCisJKC0tZW5hYmxlLWNvbXBleC1ybDIwMDAtZml4KTogTGlrZXdpc2UuCisJKC0tZW5hYmxlLXNtYzkwMDAtc2Nhbik6IExpa2V3aXNlLgorCSgtLWVuYWJsZS10NTAzKTogRGVsZXRlZC4KKwkoLS1lbmFibGUtbGFuY2UpOiBMaWtld2lzZS4KKwkoLS1lbmFibGUtY3MpOiBMaWtld2lzZS4KKworCSogbmV0Ym9vdC9tYWluLmM6IE5ldyBmaWxlLiBDb3BpZWQgYW5kIG1vZGlmaWVkLgorCSogbmV0Ym9vdC9saW51eC1hc20taW8uaDogTGlrZXdpc2UuCisJKiBuZXRib290L2V0aGVyYm9vdC5oOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvbWlzYy5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvdmlhLXJoaW5lLmM6IExpa2V3aXNlLgorCSogbmV0Ym9vdC8zYzkweC5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvM2M5MHgudHh0OiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvZXBpYzEwMC5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvZXBpYzEwMC5oOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvaTgyNTg2LmM6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9saW51eC1hc20tc3RyaW5nLmg6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9udHVsaXAuYzogTGlrZXdpc2UuCisJKiBuZXRib290L250dWxpcC50eHQ6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9vc2RlcC5oOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvcnRsODEzOS5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3Qvc2tfZzE2LmM6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9za19nMTYuaDogTGlrZXdpc2UuCisJKiBuZXRib290L3NtYzkwMDAuYzogTGlrZXdpc2UuCisJKiBuZXRib290L3NtYzkwMDAuaDogTGlrZXdpc2UuCisJKiBuZXRib290L3RpYXJhLmM6IExpa2V3aXNlLgorCSogbmV0Ym9vdC90dWxpcC5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvdHVsaXAuaDogTGlrZXdpc2UuCisJKiBuZXRib290L1JFQURNRS5uZXRib290OiBOZXcgZmlsZS4gTW9zdCBpbmZvcm1hdGlvbiBpcyBzdG9sZW4KKwlmcm9tIE1ha2VmaWxlIGFuZCBDb25maWcuMzIgaW4gRXRoZXJib290LgorCSogbmV0Ym9vdC8zYzUwOS5jOiBDb3BpZWQgZnJvbSBFdGhlcmJvb3QuIFRoZSBvcmlnaW5hbCBpcworCXJlbW92ZWQuCisJKiBuZXRib290LzNjNTA5Lmg6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9jczg5eDAuYzogTGlrZXdpc2UuCisJKiBuZXRib290L2VlcHJvMTAwLmM6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9sYW5jZS5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvbnM4MzkwLmM6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9uczgzOTAuaDogTGlrZXdpc2UuCisJKiBuZXRib290L3BjaS5jOiBMaWtld2lzZS4KKwkKKwkqIG5ldGJvb3QvM2M1OXguYzogSW5jbHVkZSBldGhlcmJvb3QuaCBpbnN0ZWFkIG5ldGJvb3QuaC4KKwkqIG5ldGJvb3QvY29uZmlnLmM6IENvcGllZCBmcm9tIEV0aGVyYm9vdCBhbmQgYWRkZWQgdGhlIDNjNTl4CisJZW50cmllcy4KKwkqIG5ldGJvb3QvcGNpLmg6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9mc3lzX3RmdHAuYzogRW50aXJlbHkgcmV3cml0dGVuIGJhc2VkIG9uIG1haW4uYyBpbgorCUV0aGVyYm9vdC4KKworCSogbmV0Ym9vdC9pby5oOiBSZW1vdmVkLgorCSogbmV0Ym9vdC9pcC5oOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvaXAuYzogTGlrZXdpc2UuCisJKiBuZXRib290L25ldGJvb3QuaDogTGlrZXdpc2UuCisJCisJKiBuZXRib290L01ha2VmaWxlLmFtIChJTkNMVURFUyk6IEFkZGVkIC1JJCh0b3Bfc3JjZGlyKS9zdGFnZTIuCisJKERSSVZFUlMpOiBSZW1vdmVkLgorCShsaWJkcml2ZXJzX2FfU09VUkNFUyk6IEFkZGVkIGV0aGVyYm9vdC5oLCBsaW51eC1hc20taW8uaCwKKwlsaW51eC1hc20tc3RyaW5nLmgsIG1haW4uYywgbWlzYy5jIGFuZCBvc2RlcC5oLiBEZWxldGVkIGlvLmgsCisJaXAuaCwgaXAuYywgbmV0Ym9vdC5oIGFuZCAkKERSSVZFUlMpLgorCShFWFRSQV9saWJkcml2ZXJzX2FfU09VUkNFUyk6IE5ldyB2YXJpYWJsZS4KKwkobGliZHJpdmVyc19hX0xJQkFERCk6IFNldCB0byBATkVUQk9PVF9EUklWRVJTQC4KKwkobGliZHJpdmVyc19hX0RFUEVOREVOQ0lFUyk6IE5ldyB2YXJpYWJsZS4KKwkoRVhUUkFfRElTVCk6IExpa2V3aXNlLgorCSgzYzUwOV9kcml2ZXJzKTogTmV3IHZhcmlhYmxlLiBEZWZpbmUgYSBuZXcgcnVsZSBmb3IgdGhlIHZhbHVlLgorCSgzYzU5eF9kcml2ZXJzKTogTGlrZXdpc2UuCisJKDNjOTB4X2RyaXZlcnMpOiBMaWtld2lzZS4KKwkoY3M4OXgwX2RyaXZlcnMpOiBMaWtld2lzZS4KKwkoZWVwcm8xMDBfZHJpdmVycyk6IExpa2V3aXNlLgorCShlcGljMTAwX2RyaXZlcnMpOiBMaWtld2lzZS4KKwkoaTgyNTg2X2RyaXZlcnMpOiBMaWtld2lzZS4KKwkobGFuY2VfZHJpdmVycyk6IExpa2V3aXNlLgorCShuczgzOTBfZHJpdmVycyk6IExpa2V3aXNlLgorCShudHVsaXBfZHJpdmVycyk6IExpa2V3aXNlLgorCShydGw4MTM5X2RyaXZlcnMpOiBMaWtld2lzZS4KKwkoc2tfZzE2X2RyaXZlcnMpOiBMaWtld2lzZS4KKwkoc21jOTAwMF9kcml2ZXJzKTogTGlrZXdpc2UuCisJKHRpYXJhX2RyaXZlcnMpOiBMaWtld2lzZS4KKwkodHVsaXBfZHJpdmVycyk6IExpa2V3aXNlLgorCSh2aWFfcmhpbmVfZHJpdmVycyk6IExpa2V3aXNlLgorCSh0NTAzX29fQ0ZMQUdTKTogUmVtb3ZlZC4KKwkobmVwY2lfb19DRkxBR1MpOiBTZXQgdG8gLURJTkNMVURFX05FUENJPTEuCisJKG5lX29fQ0ZMQUdTKTogU2V0IHRvIC1ESU5DTFVERV9ORT0xLgorCSh3ZF9vX0NGTEFHUyk6IFNldCB0byAtRElOQ0xVREVfV0Q9MS4KKwkoM2M1MDlfb19DRkxBR1MpOiBMaWtld2lzZS4KKwkoM2M1Mjlfb19DRkxBR1MpOiBMaWtld2lzZS4KKwkoM2M1OXhfb19DRkxBR1MpOiBMaWtld2lzZS4KKwkoM2M5MHhfb19DRkxBR1MpOiBMaWtld2lzZS4KKwkoY3M4OXgwX29fQ0ZMQUdTKTogTGlrZXdpc2UuCisJKGVlcHJvMTAwX29fQ0ZMQUdTKTogTGlrZXdpc2UuCisJKGVwaWMxMDBfb19DRkxBR1MpOiBMaWtld2lzZS4KKwkoM2M1MDdfb19DRkxBR1MpOiBMaWtld2lzZS4KKwkoZXhvczIwNV9vX0NGTEFHUyk6IExpa2V3aXNlLgorCShuaTUyMTBfb19DRkxBR1MpOiBMaWtld2lzZS4KKwkobGFuY2VwY2lfb19DRkxBR1MpOiBMaWtld2lzZS4KKwkobmUyMTAwX29fQ0ZMQUdTKTogTGlrZXdpc2UuCisJKG5pNjUxMF9vX0NGTEFHUyk6IExpa2V3aXNlLgorCSgzYzUwM19vX0NGTEFHUyk6IExpa2V3aXNlLgorCShudHVsaXBfb19DRkxBR1MpOiBMaWtld2lzZS4KKwkocnRsODEzOV9vX0NGTEFHUyk6IExpa2V3aXNlLgorCShza19nMTZfb19DRkxBR1MpOiBMaWtld2lzZS4KKwkoc21jOTAwMF9vX0NGTEFHUyk6IExpa2V3aXNlLgorCSh0aWFyYV9vX0NGTEFHUyk6IExpa2V3aXNlLgorCSh0dWxpcF9vX0NGTEFHUyk6IExpa2V3aXNlLgorCSh2aWFfcmhpbmVfb19DRkxBR1MpOiBMaWtld2lzZS4KKworCSogc3RhZ2UyL2NoYXJfaW8uYyAobnVsX3Rlcm1pbmF0ZSk6IENoYW5nZWQgdGhlIHR5cGUgb2YgdGhlCisJcmV0dXJuIHZhbHVlIHRvIGludC4gUmV0dXJuIHRoZSBvcmlnaW5hbCBjaGFyYWN0ZXIgY2hhbmdlZCB0bworCU5VTC4KKwkqIHN0YWdlMi9zaGFyZWQuaCAoTkVUV09SS19EUklWRSk6IE5ldyBtYWNyby4KKwkobnVsX3Rlcm1pbmF0ZSk6IEFkanVzdGVkIHRvIHRoZSBkZWZpbml0aW9uLgorCSogc3RhZ2UyL2d1bnppcC5jIChndW56aXBfdGVzdF9oZWFkZXIpOiBSZW1vdmVkIHRoZSBURlRQIGNoZWNrCisJZW50aXJlbHkuIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgYmVjYXVzZSB3ZSBub3cgY2FuIG9idGFpbgorCXRoZSBjb3JyZWN0IHNpemUgb2YgYSBmaWxlIGV2ZW4gZm9yIFRGVFAuCisJCisyMDAwLTAyLTA3ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBnbnUub3JnPgorCisJKiBzdGFnZTIvYXNtLlM6IFVuZG8gdGhlIHByZXZpb3VzIGNoYW5nZXMuIElzCisJYmludXRpbHMtMi45LjUuMC4yNSB0b28gc3RyaWN0IHRvIHJldGFpbiB0aGUgY29tcGF0aWJpbGl0eT8KKwlSZXBvcnRlZCBieSBLYWxsZSBPbGF2aSBOaWVtaXRhbG8gPHRvc2lAZWVzMi5vdWx1LmZpPi4KKwkKKzIwMDAtMDItMDMgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9jbWRsaW5lLmMgKGVudGVyX2NtZGxpbmUpOiBTZXQgQlVGX0RSSVZFIHRvIC0xIGJlZm9yZQorCXJ1bm5pbmcgYSBjb21tYW5kIHRvIGludmFsaWRhdGUgdGhlIGNhY2hlLgorCShydW5fc2NyaXB0KTogTGlrZXdpc2UuCisJKiBzdGFnZTIvY2hhcl9pby5jIChnZXRfY21kbGluZSk6IFNldCBCVUZfRFJJVkUgdG8gLTEgYmVmb3JlIHRoZQorCWNvbXBsZXRpb24gdG8gaW52YWxpZGF0ZSB0aGUgY2FjaGUuCisJUmVwb3J0ZWQgYnkgSmVmZiBTaGVpbmJlcmcgPGplZmZzaEBlcm9scy5jb20+LgorCisJKiBjb25maWd1cmUuaW46IFVzZSBBQ19QQVRIX1RPT0wgaW5zdGVhZCBvZiBBQ19QQVRIX1BST0cuCisJKiBzdGFnZTIvYXNtLlMgKGNoYWluX3N0YWdlMSk6IFByZXBlbmQgYConIHRvIHRoZSBhcmd1bWVudCBmb3IKKwlsam1wLgorCShjaGFpbl9zdGFnZTIpOiBMaWtld2lzZS4KKwkoYmlnX2xpbnV4X2Jvb3QpOiBMaWtld2lzZS4KKwkKKzIwMDAtMDEtMTkgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHV0aWwvZ3J1Yi1pbnN0YWxsLmluICgtLXJvb3QpOiBSZW5hbWVkIHRvIC4uLgorCSgtLXJvb3QtZGlyZWN0b3J5KTogLi4uIHRoaXMsIHNpbmNlICJyb290IiBpcyB2YWd1ZS4KKwkqIGRvY3MvdXNlci1yZWYudGV4aSAoSW52b2tpbmcgZ3J1Yi1pbnN0YWxsKTogQWRqdXN0ZWQgdG8gdGhlCisJY2hhbmdlIGFib3ZlLCBhbmQgYWRkZWQgYW4gZXhhbXBsZSBob3cgdG8gdXNlIC0tcm9vdC1kaXJlY3RvcnkuCisJKiBkb2NzL2dydWItaW5zdGFsbC44OiBSZWdlbmVyYXRlZC4KKworCSogZG9jcy9hcHBlbmRpY2VzLnRleGkgKEZBUSk6IEFkZGVkIGFuIGl0ZW0gYWJvdXQgdGhlIHN1Y2tlZAorCVNDU0kgcHJvYmxlbS4KKwkKKzIwMDAtMDEtMTUgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChjaGFpbmxvYWRlcl9mdW5jKTogSWYgLS1mb3JjZSBpcyBzcGVjaWZpZWQKKwlpbiBBUkcsIGRvbid0IGNoZWNrIGZvciB0aGUgc2lnbmF0dXJlLgorCSogZG9jcy90dXRvcmlhbC50ZXhpIChDaGFpbi1sb2FkaW5nKTogQWRkZWQgYSBjYXV0aW9uIGFib3V0IHNvbWUKKwlkZWZlY3RpdmUgYm9vdCBsb2FkZXJzIGFuZCAtLWZvcmNlLgorCSogZG9jcy91c2VyLXJlZi50ZXhpIChDb21tYW5kLWxpbmUtc3BlY2lmaWMgY29tbWFuZHMpOiBBZGRlZCBhCisJZGVzY3JpcHRpb24gYWJvdXQgLS1mb3JjZS4KKwkKKzIwMDAtMDEtMTEgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIGRvY3MvcHJvZy1yZWYudGV4aSAoTEJBIG1vZGUgZGlzayBJL08pOiBBZGRlZCBhIGZvb3Rub3RlIGFib3V0CisJYSBidWdneSBCSU9TLgorCQorMjAwMC0wMS0xMSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UxL3N0YWdlMS5TIFshTk9fQlVHR1lfQklPU19JTl9USEVfV09STERdOiBEb24ndCBjaGVjayBpZgorCUxCQSByZWFkIGlzIHN1cHBvcnRlZC4gQW55d2F5LCBmYWxsYmFjayB0byB0aGUgQ0hTIG1vZGUgaWYKKwlmYWlscy4KKwkKKzIwMDAtMDEtMTAgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9iaW9zLmMgKE5PX0lOVDEzX0ZBTExCQUNLKTogVW5kZWZpbmVkLgorCShnZXRfZGlza2luZm8pIFshTk9fQlVHR1lfQklPU19JTl9USEVfV09STERdOiBEbyBub3QgY2hlY2sgaWYKKwliaXQgMCBpbiBEUlAuRkxBR1MgaXMgc2V0LCBiZWNhdXNlIGF0IGxlYXN0IG9uZSBCSU9TIGRvZXMgbm90CisJc2V0IGl0IGNvcnJlY3RseS4gUmVwb3J0ZWQgYnkgIkZvcmV2ZXIgc2hhbGwgSSBiZS4iCisJPHppbnhAbGludXhmcmVhay5jb20+LgorCisJKiB1dGlsL2dydWItaW5zdGFsbC5pbjogSGFuZGxlIHRoZSBuZXcgb3B0aW9ucyBgLS1yb290JyBhbmQKKwlgLS1ncnViLXNoZWxsJy4KKwkocm9vdGRpcik6IE5ldyB2YXJpYWJsZS4KKwkodXNhZ2UpOiBQcmludCB0aGUgaGVscCBtZXNzYWdlcyBhYm91dCB0aGUgb3B0aW9ucyAtLXJvb3QgYW5kCisJLS1ncnViLXNoZWxsLgorCShib290ZGlyKTogSW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIG9wdGlvbiBhbmFseXNpcy4KKwkoZ3J1YmRpcik6IExpa2V3aXNlLgorCShkZXZpY2VfbWFwKTogTGlrZXdpc2UuCisJKHJvb3RfZGV2aWNlKTogU2V0IHRvIHRoZSByZXN1bHQgZm9yIHRoZSBkaXJlY3RvcnkgUk9PVERJUgorCWluc3RlYWQgb2YgIi8iLgorCSogZG9jcy91c2VyLXJlZi50ZXhpIChJbnZva2luZyBncnViLWluc3RhbGwpOiBBZGRlZCB0aGUKKwlkZXNjcmlwdGlvbnMgYWJvdXQgLS1yb290IGFuZCAtLWdydWItc2hlbGwuCisJKiBkb2NzL2dydWItaW5zdGFsbC44OiBSZWdlbmVyYXRlZC4KKwkKKzIwMDAtMDEtMDggIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHV0aWwvZ3J1Yi1pbnN0YWxsLmluIChncnViZGlyX2RldmljZSk6IE5ldyB2YXJpYWJsZS4KKwlJZiBHUlVCRElSX0RFVklDRSBpcyBub3QgZXF1YWwgdG8gUk9PVF9ERVZJQ0UsIHByaW50IGFuIGVycm9yCisJbWVzc2FnZSBhbmQgZXhpdC4KKwkqIFJFQURNRTogQWRkZWQgYSBjYXV0aW9uIGFib3V0IEF1dG9tYWtlLgorCSogVE9ETzogVXBkYXRlZC4gT25seSB0aGUgdGhpbmdzIHRoYXQgc2hvdWxkIGJlIGRvbmUgdW50aWwgMC42CisJaGF2ZSBvbmUgb3IgbW9yZSBleGNsYW1hdGlvbnMuIFRoaW5ncyB3aXRoIHplcm8gZXhjbGFtYXRpb24KKwl3aWxsIGJlIGRvbmUgYWZ0ZXIgMC42IHVubGVzcyBzb21lb25lIHNlbmRzIGEgcGF0Y2ggZm9yIGl0LgorCQorMjAwMC0wMS0wNSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogZ3J1Yi9hc21zdHViLmM6IEluY2x1ZGUgdGhlIGhlYWRlciBzaGFyZWQuaCBhZnRlciBpbmNsdWRpbmcKKwlhbGwgdGhlIHN5c3RlbSBoZWFkZXJzLCBidXQgbm90IGJlZm9yZS4KKwkoRVhURU5ERURfTUVNU0laRSk6IFJlZHVjZWQgdG8gM01CLgorCShncnViX3NldGptcCk6IE5ldyBmdW5jdGlvbi4KKwkoZ3J1Yl9sb25nam1wKTogTGlrZXdpc2UuCisJKiBncnViL21haW4uYzogSW5jbHVkZSBzZXRqbXAuaC4KKwkqIHN0YWdlMi9hc20uUyAoZ3J1Yl9zZXRqbXApOiBOZXcgZnVuY3Rpb24uIFN0b2xlbiBmcm9tIHRoZQorCU9TS2l0ICh3aGljaCBzdG9sZSBpdCBmcm9tIE1hY2gpLgorCShncnViX2xvbmdqbXApOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9zaGFyZWQuaCBbR1JVQl9VVElMXSAoZ3J1Yl9qbXBfYnVmKTogTmV3IHR5cGUuCisJWyFHUlVCX1VUSUxdIChncnViX2ptcF9idWYpOiBOZXcgbWFjcm8uIERlZmluZWQgYXMgam1wX2J1Zi4KKwkoZ3J1Yl9zZXRqbXApOiBEZWNsYXJlZC4KKwkoZ3J1Yl9sb25nam1wKTogTGlrZXdpc2UuCisJKHJlc3RhcnRfZW52KTogTGlrZXdpc2UuCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoY29uZmlnZmlsZV9mdW5jKTogVXNlIGdydWJfbG9uZ2ptcCBpbnN0ZWFkCisJb2YgaW52b2tpbmcgY21haW4gYWdhaW4uCisJKiBzdGFnZTIvc3RhZ2UyLmMgKHJlc3RhcnRfZW52KTogTmV3IHZhcmlhYmxlLgorCShjbWFpbik6IENhbGwgZ3J1Yl9zZXRqbXAgZmlyc3QgdG8gaW5pdGlhbGl6ZSBSRVNUQVJUX0VOVi4KKwkKKzIwMDAtMDEtMDMgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIGRvY3MvbXVsdGlib290LnRleGkgKEJvb3QgaW5mb3JtYXRpb24gZm9ybWF0KTogQWRkZWQgdGhlCisJZGVzY3JpcHRpb25zIGFib3V0IHRoZSBmaWVsZHMgImNvbmZpZ190YWJsZSIgYW5kCisJImJvb3RfbG9hZGVyX25hbWUiLgorCQorMTk5OS0xMi0zMSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgKHNldHVwX2Z1bmMpIFshTk9fQlVHR1lfQklPU19JTl9USEVfV09STERdOgorCVNwZWNpZnkgdGhlIG9wdGlvbiBgZCcsIHdoZXRoZXIgSU5TVEFMTF9EUklWRSBpcyBpZGVudGljYWwgd2l0aAorCUlNQUdFX0RSSVZFIG9yIG5vdC4KKwkqIGRvY3MvdXNlci1yZWYudGV4aSAoQ29tbWFuZC1saW5lLXNwZWNpZmljIGNvbW1hbmRzKTogQWRkZWQgYQorCWNhdXRpb24gYWJvdXQgYnVnZ3kgQklPU2VzIHdoaWNoIGRvbid0IHBhc3MgYSBib290aW5nIGRyaXZlCisJcHJvcGVybHkuCisKKwkqIGRvY3Mvc3JjMnRleGk6IEFkZGVkIGFuIGV4dHJhIHNwYWNlIGludG8gdGhlIGZpcnN0IGxpbmUsIGZvcgorCXRoZSBwb3J0YWJpbGl0eSBpc3N1ZS4KKworCSogZG9jcy9hcHBlbmRpY2VzLnRleGkgKE9idGFpbmluZyBhbmQgQnVpbGRpbmcgR1JVQik6IFVwZGF0ZSB0aGUKKwlpbmZvcm1hdGlvbiBvbiB0aGUgZnRwIHNpdGUgYW5kIHRoZSBDVlMgcmVwb3NpdG9yeS4KKwkKKzE5OTktMTItMzAgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChibG9ja2xpc3RfZnVuYyk6IE5ldyBmdW5jdGlvbi4KKwkoYnVpbHRpbl9ibG9ja2xpc3QpOiBOZXcgdmFyaWFibGUuCisJKGJ1aWx0aW5fdGFibGUpOiBBZGRlZCBhIHBvaW50ZXIgdG8gQlVJTFRJTl9CTE9DS0xJU1QuCisJKiBkb2NzL3VzZXItcmVmLnRleGkgKENvbW1hbmQtbGluZS1zcGVjaWZpYyBjb21tYW5kcyk6IEFkZGVkIGEKKwlkZXNjcmlwdGlvbiBhYm91dCB0aGUgY29tbWFuZCAiYmxvY2tsaXN0Ii4KKwkKKzE5OTktMTItMzAgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGdudS5vcmc+CisKKwkqIHN0YWdlMi9kaXNrX2lvLmMgKGdydWJfc2Vlayk6IE5ldyBmdW5jdGlvbi4KKwkqIHN0YWdlMi9zaGFyZWQuaCAoZ3J1Yl9zZWVrKTogRGVjbGFyZWQuCisJKiBzdGFnZTIvYm9vdC5jIChsb2FkX2ltYWdlKTogVXNlIGdydWJfc2VlayBpbnN0ZWFkIG9mIHNldHRpbmcKKwlGSUxFUE9TIHRvIGEgbmV3IHZhbHVlIGRpcmVjdGx5LgorCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGluc3RhbGxfZnVuYyk6IExpa2V3aXNlLgorCSh0ZXN0bG9hZF9mdW5jKTogTGlrZXdpc2UuCisKKwkqIGRvY3MvZ3J1Yi50ZXhpOiBVc2UgYSBzaW5nbGUgZGlyZW50cnkgY29tbWFuZCBmb3IgYWxsIHRoZQorCWVudHJpZXMgaW5zdGVhZCBvZiBvbmUgcGVyIGVudHJ5LgorCQorMTk5OS0xMi0yOSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAZ251Lm9yZz4KKworCSogZ3J1Yi9hc21zdHViLmMgKGNoZWNrX2RldmljZSkgW19fbGludXhfX106IENoZWNrIGlmIERFVklDRSBpcworCWEgQ0QtUk9NIGRyaXZlIGJ5IHRoZSBIRElPX0dFVEdFTyBpb2N0bC4gSWYgc28sIHRoZW4gcmV0dXJuCisJemVyby4gUmVwb3J0ZWQgYnkgUGF2ZWwgUm9za2luLgorCisJKiBzdGFnZTIvTWFrZWZpbGUuYW0gKG5vZGlzdF9ub2luc3RfREFUQSk6IFJlbmFtZWQgdG8gLi4uCisJKG5vaW5zdF9EQVRBKTogLi4uIHRoaXMuIFRoZSBwcmltYXJ5IERBVEEgaXMgYG5vZGlzdCcgYnkKKwlkZWZhdWx0LCBhdCBsZWFzdCB0aGVvcmV0aWNhbGx5LiBSZXBvcnRlZCBieSBLbGF1cyBSZWljaGwuCisKKwkqIHN0YWdlMi9iaW9zLmMgKGdldF9kaXNraW5mbyk6IFNldCB0aGUgTEJBIGZsYWcgaW4gR0VPTUVUUlkKKwlvbmx5IGlmIGJpdCAwIGluIERSUC5GTEFHUyBpcyBzZXQuIFJlcG9ydGVkIGJ5IFphY2sgV2VpbmJlcmcKKwk8emFja0ByYWJpLmNvbHVtYmlhLmVkdT4uCisKKwlGcm9tIFBhdmVsIFJvc2tpbjoKKwkqIGdydWIvYXNtc3R1Yi5jIChpbml0X2RldmljZV9tYXApOiBJbmNyZWFzZSB0aGUgbnVtYmVyIG9mCisJZGV2aWNlcyB0byBiZSBwcm9iZWQgdG8gOCBmb3IgSURFIGRpc2tzIGFuZCAxNiBmb3IgU0NTSQorCWRpc2tzLiBSZXBvcnRlZCBieSBBbnRvbiBBbmlzaW1vdiA8YWFAYmVzdGxpbnV4Lm5ldD4uCisJCisxOTk5LTEyLTA2ICBHb3Jkb24gTWF0emlna2VpdCAgPGdvcmRAZmlnLm9yZz4KKworCSogUkVBRE1FIChERVZFTE9QRVJTKTogQ2hhbmdlIENWUyBsb2NhdGlvbiB0byBzdWJ2ZXJzaW9ucy4KKworMTk5OS0xMS0zMCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogc3RhZ2UyL2Rpc2tfaW8uYyAocmVhbF9vcGVuX3BhcnRpdGlvbik6IElmIFNMSUNFX05PIGlzIGdyZWF0ZXIKKwl0aGFuIG9yIGVxdWFsIHRvIFBDX1NMSUNFX01BWCwgc2tpcCBhbnkgZXh0ZW5kZWQgcGFydGl0aW9uLCB3aGVuCisJc2VhcmNoaW5nIGZvciB0aGUgcmlnaHQgcGFydGl0aW9uLiBSZXBvcnRlZCBieSBXZWlsLCBTdGVmYW4gMzczMgorCUVQRS0yNCA8U3RlZmFuLldlaWxAZGUuaGVpZGVsYmVyZy5jb20+LgorCisxOTk5LTExLTE5ICBHb3Jkb24gTWF0emlna2VpdCAgPGdvcmRAZmlnLm9yZz4KKworCSogZ3J1Yi9hc21zdHViLmMgKGdldGtleSk6IFN0b3AgaW1tZWRpYXRlbHkgaWYgd2UgZ2V0IGFuIEVPRi4KKworCSogc3RhZ2UyL3N0YWdlMi5jIChjbWFpbik6IFRlbGwgZW50ZXJfY21kbGluZSB0byBydW4gZm9yZXZlci4KKwkocnVuX21lbnUpOiBUZWxsIHByaW50X2NtZGxpbmVfbWVzc2FnZSBhbmQgZW50ZXJfY21kbGluZSB0aGF0IHdlCisJd29uJ3QgcnVuIGZvcmV2ZXIuCisJKiBzdGFnZTIvY21kbGluZS5jIChlbnRlcl9jbWRsaW5lKTogTmV3IGFyZ3VtZW50LCBGT1JFVkVSLCBmb3IKKwl3aGVuIEVTQyBzaG91bGRuJ3QgYWxsb3cgYW4gZXhpdC4gIFBhc3MgaXQgdG8KKwlwcmludF9jbWRsaW5lX21lc3NhZ2UuCisJKHByaW50X2NtZGxpbmVfbWVzc2FnZSk6IFVzZSBuZXcgYXJndW1lbnQsIEZPUkVWRVIsIHRvIGRlY2lkZQorCXdoZXRoZXIgdG8gdGVsbCB0aGUgdXNlciB0aGF0IEVTQyBleGl0cy4KKworMTk5OS0xMS0xOCAgR29yZG9uIE1hdHppZ2tlaXQgIDxnb3JkQGZpZy5vcmc+CisKKwkqIGRlYmlhbi9ydWxlcyAoYmluYXJ5LWFyY2gpOiBEb24ndCBzdHJpcCBvciBnZW5lcmF0ZSBzaGFyZWQKKwlsaWJyYXJ5IGRlcGVuZGVuY2llcyBmb3IgL3Vzci9zYmluL2dydWItaW5zdGFsbCwgc2luY2UgaXQncyBhCisJc2NyaXB0LgorCisJKiB1dGlsL2dydWItaW5zdGFsbC5pbjogQ3JlYXRlIHNhZmUgdGVtcG9yYXJ5IGxvZyBmaWxlcyB1c2luZworCS9iaW4vdGVtcGZpbGUgaWYgaXQgaXMgZXhlY3V0YWJsZS4KKworMTk5OS0xMS0xNyAgR29yZG9uIE1hdHppZ2tlaXQgIDxnb3JkQGZpZy5vcmc+CisKKwkqIHN0YWdlMS9NYWtlZmlsZS5hbSAoTERGTEFHUyk6IENvbnNvbGlkYXRlIG11bHRpcGxlIC1XbCBmbGFncy4KKwkqIHN0YWdlMi9NYWtlZmlsZS5hbSAoUFJFX1NUQUdFMl9MSU5LKTogTGlrZXdpc2UuCisJKFNUQVJUX0xJTkspOiBMaWtld2lzZS4KKwkoU1RBR0UxXzVfTElOSyk6IExpa2V3aXNlLgorCisxOTk5LTExLTE5ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiB1dGlsL2dydWItaW5zdGFsbC5pbiAoZGVidWcpOiBOZXcgdmFyaWFibGUuCisJKGNvbnZlcnQpOiBJZiB0aGUgZGV2aWNlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZW4gZW1pdCBhbgorCWVycm9yLiBHZXQgdGhlIEdSVUIgZHJpdmUgaW5zdGVhZCBvZiB0aGUgT1MgZGV2aWNlLgorCUlmIC0tZGVidWcgaXMgc3BlY2lmaWVkLCB0aGVuIHNldCAkZGVidWcgdG8geWVzLgorCUlmICRkZWJ1ZyBpcyB5ZXMsIHJ1biAic2V0IC14Ii4KKwlNYWtlIHN1cmUgdGhhdCBzdGFnZTEgYW5kIHN0YWdlMiBleGlzdC4KKwlXaGVuIGNoZWNraW5nIGZvciBJTlNUQUxMX0RFVklDRSwgdXNlICJjYXNlIiBpbnN0ZWFkIG9mICJlbGlmInMuCisJTWFrZSBzdXJlIHRoYXQgJGluc3RhbGxfZHJpdmUgaXMgbm90IGVtcHR5LgorCUxpa2V3aXNlLCBtYWtlIHN1cmUgdGhhdCAkcm9vdF9kcml2ZSBpcyBub3QgZW1wdHkuCisJQW55IGVycm9yIG1lc3NhZ2UgaXMgcmVkaXJlY3RlZCB0byB0aGUgc3RhbmRhcmQgZXJyb3IuCisKKzE5OTktMTEtMTkgIFBhdmVsIFJvc2tpbiAgPHBhdmVsX3Jvc2tpbkBnZW9jaXRpZXMuY29tPgorCisJKiBzdGFnZTIvTWFrZWZpbGUuYW0gKG5vaW5zdF9EQVRBKTogUmVuYW1lZCB0byAuLi4KKwkobm9kaXN0X25vaW5zdF9EQVRBKTogLi4uIHRoaXMuCisJKiB1dGlsL01ha2VmaWxlLmFtOiBzYmluX1NDUklQUyAtPiBzYmluX1NDUklQVFMuCisJKiB1dGlsL2dydWItaW5zdGFsbC5pbjogZ3J1Yl9kaXIgLT4gZ3J1YmRpci4KKwlDaGVjayBpZiAkZ3J1Yl9zaGVsbCBleGlzdHMgYmVmb3JlIHJ1bm5pbmcgaXQuCisJKGNvbnZlcnQpOiBBZGRlZCBhIG1pc3NpbmcgInRlc3QiIGFmdGVyICJpZiIuCisKKzE5OTktMTEtMTggIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIGNvbmZpZ3VyZS5pbjogT3V0cHV0IGdydWItaW5zdGFsbC4KKwkqIHV0aWwvTWFrZWZpbGUuYW0gKHNiaW5fU0NSSVBUUyk6IE5ldyB2YXJpYWJsZS4KKwkqIHV0aWwvZ3J1Yi1pbnN0YWxsLmluOiBOZXcgZmlsZS4KKwkqIGRvY3MvTWFrZWZpbGUuYW0gKG1hbl9NQU5TKTogQWRkZWQgZ3J1Yi1pbnN0YWxsLjguCisJW01BSU5UQUlORVJfTU9ERV0gKCQoc3JjZGlyKS9ncnViLWluc3RhbGwuOCk6IE5ldyB0YXJnZXQuCisJKiBkb2NzL2dydWItaW5zdGFsbC44OiBOZXcgZmlsZS4gR2VuZXJhdGVkIGJ5IGhlbHAybWFuLgorCSogZG9jcy91c2VyLXJlZi50ZXhpIChJbnZva2luZyBncnViLWluc3RhbGwpOiBOZXcgY2hhcHRlci4KKworMTk5OS0xMS0xNiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCUZyb20gUGF2ZWwgUm9za2luOgorCSogc3RhZ2UxL3N0YWdlMS5TOiBDaGVjayBmb3IgdGhlIEFQSSBzdWJzZXQgc3VwcG9ydCBiaXRtYXAKKwlyZXR1cm5lZCBieSBJTlQgMTMgQUg9NDhoLCBhbmQganVtcCB0byBjaHNfbW9kZSBpZiBBSD00MmggaXMgbm90CisJc3VwcG9ydGVkLgorCisxOTk5LTExLTEzICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoaW5zdGFsbF9mdW5jKTogV2hlbiB1c2luZyBhIFN0YWdlIDEuNSwgc2V0CisJQ1VSUkVOVF9EUklWRSB0byBTQVZFRF9EUklWRSBhbmQgQ1VSUkVOVF9QQVJUSVRJT04gdG8KKwlTQVZFRF9QQVJUSVRJT04gaWYgc2V0X2RldmljZSBmYWlscy4gSWYgQ1VSUkVOVF9EUklWRSBpcyBlcXVhbAorCXRvIFNSQ19EUklWRSwgdGhlbiBzZXQgQ1VSUkVOVF9EUklWRSB0byAweEZGLiBXZSBkb24ndCB3YW50IHRvCisJZW1iZWQgYW55IGRyaXZlIG51bWJlciB3aGVuZXZlciBwb3NzaWJsZS4KKwkqIHN0YWdlMi9kaXNrX2lvLmMgKHNldF9kZXZpY2UpIFtTVEFHRTFfNV06IEFsd2F5cyBzZXQKKwlDVVJSRU5UX1BBUlRJVElPTiB0byBQQVJUSVRJT04uCisKKzE5OTktMTEtMTMgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwlGcm9tIFBhdmVsIFJvc2tpbjoKKwkqIHN0YWdlMS9zdGFnZTEuUyAobGJhX21vZGUpOiBKdW1wIHRvIGNoc19tb2RlIGlmIElOVCAxMyBBSD00MmgKKwlmYWlscy4KKworMTk5OS0xMS0xMiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCURvIG5vdCB1c2UgdGhlIGRldmljZSBtYXAgZmlsZSB1bmxlc3MgLS1kZXZpY2UtbWFwIGlzIHNwZWNpZmllZC4KKworCSogZ3J1Yi9tYWluLmMgKGRldmljZV9tYXBfZmlsZSk6IFNldCB0byAwLgorCShkZWZhdWx0X2RldmljZV9tYXBfZmlsZSk6IFJlbW92ZWQuCisJKHVzYWdlKTogRG8gbm90IHByaW50IERFRkFVTFRfREVWSUNFX01BUF9GSUxFLgorCSogZ3J1Yi9hc21zdHViLmMgKGluaXRfZGV2aWNlX21hcCk6IElmIERFVklDRV9NQVBfRklMRSBpcyBOVUxMLAorCWRvIG5vdCB0cnkgdG8gb3BlbiB0aGUgZGV2aWNlIG1hcCBmaWxlLgorCVNldCBGUCB0byBOVUxMIGJ5IGRlZmF1bHQuCisJKiBkb2NzL2dydWIuODogUmVnZW5lcmF0ZWQuCisKKzE5OTktMTEtMTEgIE1pY2hhZWwgSG9obXV0aCAgPGhvaG11dGhAaW5ub2NlbnQuY29tPgorCisJKiBzdGFnZTIvYm9vdC5jIChsb2FkX2ltYWdlKTogZ3J1Yl9jbG9zZSB3YXMgY2FsbGVkIGFmdGVyCisJcmV0dXJuLCBzbyBleGNoYW5nZSB0aGUgb3JkZXIuCisJKiBzdGFnZTIvc3RhZ2UxXzUuYyAoY21haW4pOiBDYWxsIGdydWJfY2xvc2UgYWZ0ZXIgZ3J1Yl9yZWFkLgorCVNldCBSRVQgdG8gdGhlIHZhbHVlIHJldHVybmVkIGJ5IGdydWJfcmVhZCwgYW5kIGlmIFJFVCBpcworCW5vbi16ZXJvLCBjYWxsIGNoYWluX3N0YWdlMi4KKwkqIHN0YWdlMS9NYWtlZmlsZS5hbSAoQlVJTFRfU09VUkNFUyk6IFJlbW92ZWQuCisJKENMRUFORklMRVMpOiBTZXQgdG8gJChub2Rpc3RfcGtnZGF0YV9EQVRBKS4KKworMTk5OS0xMS0xMSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCVN1Z2dlc3RlZCBieSBLbGF1cyBSZWljaGw6CisJKiBzdGFnZTIvYnVpbHRpbnMuYyAocHJpbnRfcm9vdF9kZXZpY2UpOiBOZXcgZnVuY3Rpb24uCisJKHJvb3RfZnVuYyk6IElmIG5vIGFyZ3VtZW50IGlzIHNwZWNpZmllZCwgY2FsbCB0aGUgZnVuY3Rpb24KKwlwcmludF9yb290X2RldmljZSBhbmQgcmV0dXJuLgorCShyb290bm92ZXJpZnlfZnVuYyk6IExpa2V3aXNlLgorCSogc3RhZ2UyL2Rpc2tfaW8uYyBbIVNUQUdFMV81XSAocHJpbnRfY29tcGxldGlvbnMpOiBDYWxsCisJcHJpbnRfZXJyb3IgZXZlbiBpZiBJU19GSUxFTkFNRSBpcyB6ZXJvLgorCUlmIEVSUk5VTSBpcyBub24temVybywgdGhlbiByZXR1cm4gLTEuCisJKiBzdGFnZTIvY2hhcl9pby5jIFshU1RBR0UxXzVdIChnZXRfY21kbGluZSk6IENsZWFyIEVSUk5VTSBhZnRlcgorCWNhbGxpbmcgcHJpbnRfY29tcGxldGlvbnMgdG8gcHJpbnQgdGhlIGxpc3QgYXMgd2VsbC4KKworCSogc3RhZ2UyL2FzbS5TIFshU1RBR0UxXzVdIChjdXJydGlja3MpOiBTZXQgJWVheCB0byAlY3g6JWR4CisJY29ycmVjdGx5LiBSZXBvcnRlZCBieSBNaWNoYWVsIEhvaG11dGguCisKKzE5OTktMTEtMDYgIEtsYXVzIFJlaWNobCAgPEtsYXVzLlJlaWNobEBhbGNhdGVsLmF0PgorCisJKiBncnViL2FzbXN0dWIuYyAoZ2V0X2Rpc2tpbmZvKSBbX19saW51eF9fXTogQWZ0ZXIgb3BlbmluZyB0aGUKKwlkcml2ZSwgZmx1c2ggdGhlIGNhY2hlLCBvdGhlciBwcm9ncyBtYXkgaGF2ZSBsZWZ0IG92ZXIgc29tZXRoaW5nCisJaW4gdGhlIGNhY2hlLgorCisxOTk5LTExLTAzICBHb3Jkb24gTWF0emlna2VpdCAgPGdvcmRAZmlnLm9yZz4KKworCSogZGViaWFuL3J1bGVzOiBBZGQgdmFyaWFibGVzIGZvciBjcm9zcy1jb21waWxhdGlvbi4KKworCSogZGViaWFuL2NvbnRyb2wgKFN0YW5kYXJkcy1WZXJzaW9uKTogVXBkYXRlIHRvIHZlcnNpb24gMy4xLjAuCisJKiBkZWJpYW4vcnVsZXMgKGJ1aWxkKTogSW5zdGFsbCBtYW5wYWdlcyBpbnRvIC91c3Ivc2hhcmUvbWFuLCBhbmQKKwlpbmZvIGludG8gL3Vzci9zaGFyZS9pbmZvIGluIGFjY29yZGFuY2Ugd2l0aCBGSFMuCisJKGJpbmFyeS1hcmNoKTogTGlrZXdpc2UsIGFuZCBwdXQgZG9jcyBpbnRvIC91c3Ivc2hhcmUvZG9jLgorCSogZGViaWFuL3Bvc3RpbnN0OiBVc2UgL3Vzci9zaGFyZS9pbmZvLCBhbmQgbWFuYWdlIGNvbXBhdGliaWxpdHkKKwkvdXNyL2RvYy9ncnViIC0+IC91c3Ivc2hhcmUvZG9jL2dydWIgc3ltbGluay4KKwkqIGRlYmlhbi9wcmVybTogTGlrZXdpc2UuCisKKwkqIHN0YWdlMi9NYWtlZmlsZS5hbSAoQ0xFQU5GSUxFUyk6IENoYW5nZSB0bworCSQobm9kaXN0X3BrZ2RhdGFfREFUQSkgc28gdGhhdCB0aGUgcmF3IGJpbmFyeSBmaWxlcyBhcmUgZGVsZXRlZC4KKwkqIHN0YWdlMS9NYWtlZmlsZS5hbSAoQ0xFQU5GSUxFUyk6IExpa2V3aXNlLgorCisxOTk5LTExLTA2ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBncnViL2FzbXN0dWIuYyAoZ3J1Yl9wdXRjaGFyKSBbSEFWRV9MSUJDVVJTRVNdOiBEbyBub3QgY2FsbAorCXdyZWZyZXNoLiBUaGlzIHdhcyBqdXN0IGFuIGFjY2lkZW50LiBTb3JyeS4KKworCVJlcG9ydGVkIGJ5IEFsYW4gTWNMZWFuIDxhbWNsQGZsYXNoLm5ldD46CisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoZW1iZWRfZnVuYyk6IFRoZSBzZWN0b3IgYXJndW1lbnQgZm9yIHRoZQorCWZ1bmN0aW9uIGJpb3NkaXNrIGlzIGNoYW5nZWQgZnJvbSBTRUNUT1IgKyBJICogU0VDVE9SX1NJWkUgdG8KKwlTRUNUT1IgKyBJLgorCShmaW5kX2Z1bmMpOiBDbGVhciBFUlJOVU0gYmVmb3JlIGVhY2ggb2YgdGhlIGF0dGVtcHRzLgorCisxOTk5LTExLTA1ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBkb2NzL211bHRpYm9vdC50ZXhpIChCb290IGluZm9ybWF0aW9uIGZvcm1hdCk6IEFkZCB0aGUgbWVtYmVycworCWBkcml2ZXNfYWRkcicgYW5kIGBkcml2ZXNfY291bnQnIGludG8gdGhlIE11bHRpYm9vdCBpbmZvcm1hdGlvbgorCXN0cnVjdHVyZSwgYW5kIGFkZGVkIHRoZSBkZXNjcmlwdGlvbnMuCisKKzE5OTktMTEtMDMgIEdvcmRvbiBNYXR6aWdrZWl0ICA8Z29yZEBmaWcub3JnPgorCisJKiB1dGlsL21iY2hrLmMgKG1haW4pOiBNb3ZlIHRoZSB2ZXJzaW9uIG51bWJlciBpbnNpZGUgdGhlCisJcGFyZW50aGVzZXMgc2luY2UgaXQgaXMgdGhlIEdSVUIgcGFja2FnZSB2ZXJzaW9uLCBub3QganVzdCBhbgorCW1iY2hrLXNwZWNpZmljIHZlcnNpb24uCisKKzE5OTktMTAtMzAgIEdvcmRvbiBNYXR6aWdrZWl0ICA8Z29yZEBmaWcub3JnPgorCisJKiBkZWJpYW4vcnVsZXMgKGJpbmFyeS1hcmNoKTogQ29tcHJlc3MgbWFuIHBhZ2VzLgorCVN0cmlwIHRoZSBncnViIHNoZWxsLgorCUluc3RhbGwgZXhhbXBsZXMuCisKKzE5OTktMTEtMDMgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIGRvY3MvdHV0b3JpYWwudGV4aTogRml4IHR5cG9zIGJ5IGlzcGVsbC4KKwkqIGRvY3MvdXNlci1yZWYudGV4aTogTGlrZXdpc2UuCisJKiBkb2NzL3Byb2ctcmVmLnRleGk6IExpa2V3aXNlLgorCSogZG9jcy9hcHBlbmRpY2VzLnRleGk6IExpa2V3aXNlLgorCisxOTk5LTExLTAzICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBzdGFnZTIvZnN5c19leHQyZnMuYyAoc3RydWN0IGV4dDJfZGlyX2VudHJ5KTogQ2hhbmdlZCB0aGUgdHlwZQorCW9mIGBuYW1lX2xlbicgdG8gX191OCBhbmQgYWRkZWQgdGhlIG5ldyBtZW1iZXIgYGZpbGVfdHlwZScgYWZ0ZXIKKwlpdC4gVGhpcyBpcyBzdG9sZW4gZnJvbSBsaW51eC9leHQyX2ZzLmggaW4gTGludXggMi4yLjEzLgorCVJlcG9ydGVkIGJ5IEJlbiBIYXJyaXMgPGJqaDIxQGNhbS5hYy51az4uCisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChkZXZpY2VfZnVuYykgW0dSVUJfVVRJTF06IENhbGwKKwludWxfdGVybWluYXRlIGJlZm9yZSBjYWxsaW5nIGNoZWNrX2RldmljZS4KKworMTk5OS0xMS0wMiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogc3RhZ2UyL2Rpc2tfaW8uYyAocmVhbF9vcGVuX3BhcnRpdGlvbik6IENoZWNrIGZvciB0aGUgcmlnaHQKKwlwYXJ0aXRpb24gZm9yIGFueSBleHRlbmRlZCBwYXJ0aXRpb24gYXMgd2VsbC4gU2V0IEVYVCB0byBJIGFmdGVyCisJdGhlIGNoZWNrIGlzIGRvbmUuIFJlcG9ydGVkIGJ5IEplZmYgU2NoZWluYmVyZworCTxqZWZmc2hAZXJvbHMuY29tPi4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGNvbG9yX2Z1bmMpOiBVc2UgdGhlIGZ1bmN0aW9uCisJbnVsX3Rlcm1pbmF0ZS4KKwkoZGV2aWNlX2Z1bmMpIFtHUlVCX1VUSUxdOiBMaWtld2lzZS4KKwkoaGVscF9mdW5jKTogTGlrZXdpc2UuCisJKGluc3RhbGxfZnVuYyk6IFNhdmUgQ1VSUkVOVF9EUklWRSwgQ1VSUkVOVF9QQVJUSVRJT04gYW5kCisJQlVHX0dFT00gaW4gU1JDX0RSSVZFLCBTUkNfUEFSVElUSU9OIGFuZCBTUkNfR0VPTSByZXNwZWN0aXZlbHksCisJYW5kIHVzZSB0aGVtIHdoZW4gcGF0Y2hpbmcgdGhlIFN0YWdlIDIuCisJTlVMLXRlcm1pbmF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlbmFtZSBDT05GSUdfRklMRU5BTUUuCisJSWYgSVNfU1RBR0UxXzUgaXMgdHJ1ZSwgdGhlbiBjaGVjayBpZiB0aGUgInJlYWwgY29uZmlnIGZpbGUiCisJb3B0aW9uIGlzIHByZXNlbnQsIGFuZCwgaWYgc28sIHBhdGNoIHRoZSBTdGFnZSAyIENPTkZJR19GSUxFTkFNRQorCXdpdGggdGhlIGNvbmZpZ3VyYXRpb24gZmlsZW5hbWUgUkVBTF9DT05GSUdfRklMRU5BTUUuCisJKHNldGtleV9mdW5jKTogVXNlIG51bF90ZXJtaW5hdGUgaW5zdGVhZCBvZiB0aGUgbG9jYWwgZnVuY3Rpb24KKwludWxsX3Rlcm1pbmF0ZS4KKwkqIHN0YWdlMi9jaGFyX2lvLmMgWyFTVEFHRTFfNV0gKG51bF90ZXJtaW5hdGUpOiBOZXcgZnVuY3Rpb24uCisJKiBzdGFnZTIvc2hhcmVkLmggKG51bF90ZXJtaW5hdGUpOiBEZWNsYXJlZC4KKworMTk5OS0xMS0wMSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogZG9jcy9ncnViLnRleGk6IEFkZCAiSS9PIHBvcnRzIGRldGVjdGlvbiIgaW50byB0aGUgbWVudS4KKwkqIGRvY3MvdXNlci1yZWYudGV4aTogQWRkZWQgYSBkZXNjcmlwdGlvbiBhYm91dCB0aGUgY29tbWFuZAorCSJpb3Byb2JlIi4KKwkqIGRvY3MvcHJvZy1yZWYudGV4aSAoSS9PIHBvcnRzIGRldGVjdGlvbik6IE5ldyBjaGFwdGVyLgorCisxOTk5LTExLTAxICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJRnJvbSBQYXZlbCBSb3NraW46CisJKiBzdGFnZTIvYXNtLlMgKGludDFfaGFuZGxlcik6IFVzZSBFWFRfQyhpb19tYXApIGluc3RlYWQgb2YKKwlpb19tYXAuCisJKGludDFfaGFuZGxlcik6IFVzZSBFWFRfQyhiaW9zX2tleV9tYXApIGluc3RlYWQgb2YgYmlvc19rZXlfbWFwLgorCSogZ3J1Yi9hc21zdHViLmMgW19fT3BlbkJTRF9fXTogSW5jbHVkZSA8c3lzL2lvY3RsLmg+IGFuZAorCTxzeXMvZGlza2xhYmVsLmg+LgorCVtfX09wZW5CU0RfX10gKGdldF9mbG9wcHlfZGlza19uYW1lKTogQWRkZWQgc3VwcG9ydCBmb3IgT3BlbkJTRC4KKwlbX19PcGVuQlNEX19dIChnZXRfaWRlX2Rpc2tfbmFtZSk6IExpa2V3aXNlLgorCVtfX09wZW5CU0RfX10gKGdldF9zY3NpX2Rpc2tfbmFtZSk6IExpa2V3aXNlLgorCShnZXRfZHJpdmVfZ2VvbWV0cnkpIFtfX09wZW5CU0RfX106IFVzZSBmb3IgT3BlbkJTRCB0aGUgc2FtZQorCWlvY3RsIGFzIGZvciBOZXRCU0QgYW5kIEZyZWVCU0QuCisKKzE5OTktMTAtMzEgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIGdydWIvYXNtc3R1Yi5jIChpbml0X2RldmljZV9tYXApOiBBZGQgYSBmbG9wcHkgZGV2aWNlIG5hbWUKKwlpbnRvIHRoZSBkZXZpY2UgbWFwIGZpbGUgZXZlbiBpZiBjaGVja19kZXZpY2UgZmFpbHMuCisJKiBzdGFnZTIvY2hhcl9pby5jIFshU1RBR0UxXzVdIChnZXRfY21kbGluZSk6IENsZWFyIEVSUk5VTSBhZnRlcgorCWNhbGxpbmcgcHJpbnRfY29tcGxldGlvbnMuCisKKzE5OTktMTAtMjkgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHN0YWdlMi9hc20uUyAodHJhY2tfaW50MTMpOiBEZWZpbmVkIHVuY29uZGl0aW9uYWxseS4gRG8gbm90CisJdXNlIGludDMgYW55IG1vcmUsIGJ1dCByZXBsYWNlIHRoZSBpbnQxMyBoYW5kbGVyIHdpdGgKKwlzZXRfdGZfaW50MTNfaGFuZGxlci4KKwkoaW50MV9oYW5kbGVyKTogRGVmaW5lZCB1bmNvbmRpdGlvbmFsbHkuIERvIG5vdCBjaGVjayBmb3IgMHgwRi4KKwlBZGQgbWlzc2luZyBgJCdzLiBJZiB0aGUgY29kZSBpcyAweEVDLTB4RUYsIHVzZSAlZHggaW5zdGVhZCBvZgorCWltbWVkaWF0ZS4gSWYgdGhlIGNvZGUgaXMgMHhFNC0weEU3LCB1c2UgaW1tZWRpYXRlIGluc3RlYWQgb2YKKwklZHguIFNldCAlZHMgdG8gemVybyBiZWZvcmUgc2Nhbm5pbmcgSU9fTUFQLiBDaGVjayBmb3IgdGhlCisJYnVmZmVyIG92ZXJydW4gb2YgSU9fTUFQIGJlZm9yZSBhZGRpbmcgYSBwb3J0LgorCVshREVGSU5FX1RSQUNLX0lOVDEzXSAoaW50MTNfZmlyc3RfaW5zdHJ1Y3Rpb24pOiBSZW1vdmVkLgorCVshREVGSU5FX1RSQUNLX0lOVDEzXSAoaW50M19oYW5kbGVyKTogTGlrZXdpc2UuCisJKHNldF90Zl9pbnQxM19oYW5kbGVyKTogTmV3IGludGVycnVwdCBoYW5kbGVyLgorCShzZXRfdGZfaW50MTNfb2Zmc2V0KTogTmV3IHZhcmlhYmxlLgorCShzZXRfdGZfaW50MTNfc2VnbWVudCk6IExpa2V3aXNlLgorCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGlvcHJvYmVfZnVuYyk6IE5ldyBmdW5jdGlvbi4KKwkoYnVpbHRpbl9pb3Byb2JlKTogTmV3IHZhcmlhYmxlLgorCShidWlsdGluX3RhYmxlKTogQWRkZWQgYSBwb2ludGVyIHRvIEJVSUxUSU5fSU9QUk9CRS4KKwkqIHN0YWdlMi9zaGFyZWQuaCAoSU9fTUFQX1NJWkUpOiBOZXcgbWFjcm8uCisJKHRyYWNrX2ludDEzKTogRGVjbGFyZWQuCisJKGlvX21hcCk6IExpa2V3aXNlLgorCisxOTk5LTEwLTI5ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBzdGFnZTIvY2hhcl9pby5jIChwcmludF9lcnJvcikgWyFTVEFHRTFfNV06IFByaW50ICJFcnJvcjoiCisJYmVmb3JlIHByaW50IHRoZSBlcnJvciBtZXNzYWdlLgorCShwcmludF9lcnJvcik6IERvIG5vdCBjbGVhciBFUlJOVU0uCisJKiBzdGFnZTIvY21kbGluZS5jIChydW5fc2NyaXB0KTogSWYgRVJSTlVNIGlzIG5vbi16ZXJvLCBzZXQKKwlFUlJOVU0gdG8gRVJSX05PTkUuCisJKGVudGVyX2NtZGxpbmUpOiBDbGVhciBFUlJOVU0gYWZ0ZXIgcHJpbnRfZXJyb3IuCisKKzE5OTktMTAtMjggIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwlGcm9tIFBhdmVsIFJvc2tpbjoKKwkqIHN0YWdlMi9zdGFnZTIuYyAocnVuX21lbnUpIFtHUlVCX1VUSUxdOiBEbyBub3QgdXNlIElCTSBzcGVjaWFsCisJY2hhcmFjdGVycyBpbiB0aGUgbWVzc2FnZSwgYnV0IHVzZSBhc2NpaSBuYW1lcyBpbnN0ZWFkLgorCShydW5fbWVudSkgWyFHUlVCX1VUSUxdOiBVc2UgRElTUF9VUCBhbmQgRElTUF9ET1dOIGluc3RlYWQgb2YKKwl0aGUgYXNjaWkgY29kZXMuCisJKiBzdGFnZTIvc2hhcmVkLmggWyFBQ1NfVUxDT1JORVJdIChBQ1NfVUxDT1JORVIpOiBOZXcgbWFjcm8uCisJWyFBQ1NfVUxDT1JORVJdIChBQ1NfVVJDT1JORVIpOiBMaWtld2lzZS4KKwlbIUFDU19VTENPUk5FUl0gKEFDU19MTENPUk5FUik6IExpa2V3aXNlLgorCVshQUNTX1VMQ09STkVSXSAoQUNTX0xSQ09STkVSKTogTGlrZXdpc2UuCisJWyFBQ1NfVUxDT1JORVJdIChBQ1NfSExJTkUpOiBMaWtld2lzZS4KKwlbIUFDU19VTENPUk5FUl0gKEFDU19WTElORSk6IExpa2V3aXNlLgorCVshQUNTX1VMQ09STkVSXSAoQUNTX0xBUlJPVyk6IExpa2V3aXNlLgorCVshQUNTX1VMQ09STkVSXSAoQUNTX1JBUlJPVyk6IExpa2V3aXNlLgorCVshQUNTX1VMQ09STkVSXSAoQUNTX1VBUlJPVyk6IExpa2V3aXNlLgorCVshQUNTX1VMQ09STkVSXSAoQUNTX0RBUlJPVyk6IExpa2V3aXNlLgorCVtHUlVCX1VUSUxdIChESVNQX1VMKTogU2V0IHRvIEFDU19VTENPUk5FUi4KKwlbR1JVQl9VVElMXSAoRElTUF9VUik6IFNldCB0byBBQ1NfVVJDT1JORVIuCisJW0dSVUJfVVRJTF0gKERJU1BfTEwpOiBTZXQgdG8gQUNTX0xMQ09STkVSLgorCVtHUlVCX1VUSUxdIChESVNQX0xSKTogU2V0IHRvIEFDU19MUkNPUk5FUi4KKwlbR1JVQl9VVElMXSAoRElTUF9IT1JJWik6IFNldCB0byBBQ1NfSExJTkUuCisJW0dSVUJfVVRJTF0gKERJU1BfVkVSVCk6IFNldCB0byBBQ1NfVkxJTkUuCisJW0dSVUJfVVRJTF0gKERJU1BfTEVGVCk6IFNldCB0byBBQ1NfTEFSUk9XLgorCVtHUlVCX1VUSUxdIChESVNQX1JJR0hUKTogU2V0IHRvIEFDU19SQVJST1cuCisJW0dSVUJfVVRJTF0gKERJU1BfVVApOiBTZXQgdG8gQUNTX1VBUlJPVy4KKwlbR1JVQl9VVElMXSAoRElTUF9ET1dOKTogU2V0IHRvIEFDU19EQVJST1cuCisKKzE5OTktMTAtMjggIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChrZXljb2RlX2Z1bmMpOiBSZW1vdmVkLgorCShidWlsdGluX2tleWNvZGUpOiBMaWtld2lzZS4KKwkoc3RydWN0IGtleXN5bSk6IE5ldyBzdHJ1Y3R1cmUuCisJKGtleXN5bV90YWJsZSk6IE5ldyB2YXJpYWJsZS4KKwkoc2V0a2V5X2Z1bmMpOiBOZXcgZnVuY3Rpb24uCisJKGJ1aWx0aW5fc2V0a2V5KTogTmV3IHZhcmlhYmxlLgorCShidWlsdGluX3RhYmxlKTogUmVtb3ZlZCB0aGUgcG9pbnRlciB0byBCVUlMVElOX0tFWUNPREUsIGFuZAorCWFkZGVkIGEgcG9pbnRlciB0byBCVUlMVElOX1NFVEtFWS4KKwkqIHN0YWdlMi9jb21tb24uYyBbIVNUQUdFMV81XSAoZXJyX2xpc3QpOiBBZGRlZAorCUVSUl9CQURfQVJHVU1FTlQuCisJKiBzdGFnZTIvc2hhcmVkLmggKGdydWJfZXJyb3JfdCk6IEFkZGVkIEVSUl9CQURfQVJHVU1FTlQuCisJKEtFWV9NQVBfU0laRSk6IFNldCB0byAxMjguCisJKGFzY2lpX2tleV9tYXApOiBEZWNsYXJlZC4KKwkqIHN0YWdlMi9hc20uUyBbIVNUQUdFMV81XSAocmVtYXBfYXNjaWlfY2hhcik6IE5ldyBmdW5jdGlvbi4KKwlbIVNUQUdFMV81XSAoYXNjaWlfa2V5X21hcCk6IE5ldyB2YXJpYWJsZS4KKwlbIVNUQUdFMV81XSAoZ2V0a2V5KTogQ2FsbCByZW1hcF9hc2NpaV9jaGFyIGFmdGVyIGludDE2LgorCVshU1RBR0UxXzVdIChjaGVja2tleSk6IExpa2V3aXNlLgorCSogZ3J1Yi9hc21zdHViLmMgKGFzY2lpX2tleV9tYXApOiBOZXcgdmFyaWFibGUuCisJKiBkb2NzL3VzZXItcmVmLnRleGkgKEdlbmVyYWwgY29tbWFuZHMpOiBBZGRlZCBhIGRlc2NyaXB0aW9uCisJYWJvdXQgdGhlIGNvbW1hbmQgInNldGtleSIuCisJKFN0YWdlMiBlcnJvcnMpOiBBZGRlZCBhIGRlc2NyaXB0aW9uIGFib3V0IEVSUl9CQURfQVJHVU1FTlQuCisKKzE5OTktMTAtMjcgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHN0YWdlMi9kaXNrX2lvLmMgKHNldF9kZXZpY2UpIFshU1RBR0UxXzVdOiBSZW1vdmUgdGhlCisJcHJlbGltaW5hcnkgTWFjaC1zdHlsZSBkZXZpY2UgbmFtZSBzdXBwb3J0LiBJJ3ZlIGRlY2lkZWQgdGhhdAorCXRoZSBzdXBwb3J0IGlzIG5vdCBuZWNlc3NhcnkuCisJKHNldHVwX3BhcnQpIFshU1RBR0UxXzVdOiBEbyBub3Qgc3RyaXAgdGhlIGxlYWRpbmcgIi9kZXYvIi4KKwkqIGRvY3MvaGVscDJtYW46IFVwZ3JhZGVkIHRvIDEuMDE2LgorCSogZG9jcy9tYmNoay4xOiBSZWdlbmVyYXRlZC4KKwkqIGRvY3MvZ3J1Yi44OiBMaWtld2lzZS4KKwkqIGdydWIvYXNtc3R1Yi5jOiBSZW5hbWUgS0VZX01BUCB0byBCSU9TX0tFWV9NQVAuCisKKwkqIHN0YWdlMi9hc20uUyBbIVNUQUdFMV81XSAoc2V0X2ludDE1X2hhbmRsZXIpOiBVc2UgMCBpbnN0ZWFkIG9mCisJdGhlIG1heGltdW0gbnVtYmVyIGZvciB0aGUgc2VnbWVudC4KKwlbIVNUQUdFMV81XSAodW5zZXRfaW50MTVfaGFuZGxlcik6IExpa2V3aXNlLgorCVshU1RBR0UxXzVdIChpbnQxNV9oYW5kbGVyKTogQWxtb3N0IHJld3JpdHRlbi4gSWYgbm9uLWNhcnJpZXIsCisJaWdub3JlIHRoZSBzY2FuY29kZS4gSWYgdGhlIHNjYW5jb2RlIGlzIEUxIG9yIEUwLCB0aGVuIHNldAorCUlOVDE1X1NLSVBfRkxBRyB0byAweDc0LCBhbmQgaWYgdGhlIHByZXZpb3VzIHNjYW5jb2RlIGlzIEUxIG9yCisJRTAsIHNldCBJTlQxNV9TS0lQX0ZMQUcgdG8gMHhlYS4gQ2xlYXIgYml0IDcgaW4gJWRsLiBTYXZlIGJpdCA3CisJb2YgJWFsIGluICVibC4gRG8gbm90IGxjYWxsLiBVc2UgbGptcCBpbnN0ZWFkLgorCVshU1RBR0UxXzVdIChrZXlfbWFwKTogUmVuYW1lZCB0byAuLi4KKwlbIVNUQUdFMV81XSAoYmlvc19rZXlfbWFwKTogLi4uIHRoaXMuCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoa2V5Y29kZV9mdW5jKTogQ2hlY2sgaWYgRlJPTSBpcyBncmVhdGVyCisJdGhhbiAweGZmIGluc3RlYWQgb2YgZG91YmxlLWNoZWNraW5nIGZvciBUTy4gVXNlIEJJT1NfS0VZX01BUAorCWluc3RlYWQgb2YgS0VZX01BUC4KKwkqIHN0YWdlMi9zaGFyZWQuaCAoS0VZX01BUF9TSVpFKTogU2V0IHRvIDMyLgorCShrZXlfbWFwKTogUmVtb3ZlZC4KKwkoYmlvc19rZXlfbWFwKTogRGVjbGFyZWQuCisKKzE5OTktMTAtMjYgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwlOb3cgdGhlIEJJT1MgZHJpdmUgcmVtYXBwaW5nIGlzIGZ1bmN0aW9uYWwuCisKKwkqIHN0YWdlMi9hc20uUyBbREVGSU5FX1RSQUNLX0lOVDEzXSAodHJhY2tfaW50MTMpOiBVc2UgJWVkaQorCWluc3RlYWQgb2YgZGlyZWN0IGFkZHJlc3Nlcy4KKwlQcmVmaXggREFUQTMyIHRvIHRoZSBjYWxscyBmb3IgcmVhbF90b19wcm90IGFuZCBwcm90X3RvX3JlYWwuCisJRml4IHRoZSBhZGRyZXNzIG9mIERSSVZFOiA0KCVlYnApIC0+IDgoJWVicCkuCisJKHNldF9pbnQxNV9oYW5kbGVyKTogVXNlICVlZGkgaW5zdGVhZCBvZiBkaXJlY3QgYWRkcmVzc2VzLgorCSh1bnNldF9pbnQxNV9oYW5kbGVyKTogTGlrZXdpc2UuCisJKHNldF9pbnQxM19oYW5kbGVyKTogQ29weSBEUklWRV9NQVBfU0laRSAqIDIgYnl0ZXMgaW5zdGVhZCBvZgorCURSSVZFX01BUF9TSVpFIGJ5dGVzIG9mIE1BUC4KKwlGaXggdGhlIGFkZHJlc3Mgb2YgTUFQOiA0KCVlYnApIC0+IDgoJWVicCkuCisJVXNlICVlZGkgaW5zdGVhZCBvZiBkaXJlY3QgYWRkcmVzc2VzLgorCShpbnQxM19oYW5kbGVyKTogRG8gbm90IHNldCAlZHMgdG8gJWNzLiBVc2UgdGhlIHNlZ21lbnQgb3ZlcnJpZGUKKwlwcmVmaXggb2YgJWNzIGluc3RlYWQuCisJUHVzaCB0aGUgZmxhZ3MgcHVzaGVkIGJ5IHRoZSBjYWxsZWUgaW5zdGVhZCBvZiB0aGUgY3VycmVudC4KKwlTZXQgdGhlIGZsYWdzIGluIHRoZSBzdGFjayB0byB0aGUgZmxhZ3MgcmV0dXJuZWQgYnkgdGhlIG9yaWdpbmFsCisJaW50MTMgY2FsbC4KKwkoZHJpdmVfbWFwKTogNGJ5dGVzLWFsaWduZWQuCisJKiBzdGFnZTIvZGlza19pby5jIChncnViX2Nsb3NlKTogRG8gbm90IHNldCBFUlJOVU0gZXZlbiBpZgorCUZTWVNfVFlQRSBpcyBOVU1fRlNZUy4KKworMTk5OS0xMC0yNSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogc3RhZ2UxL3N0YWdlMS5TOiBMb25nIGp1bXAgdG8gcmVhbF9zdGFydCwgYmVjYXVzZSBzb21lIGJvZ3VzCisJQklPU2VzIGp1bXAgdG8gMDdDMDowMDAwIGluc3RlYWQgb2YgMDAwMDo3QzAwLgorCShyZWFsX3N0YXJ0KTogTmV3IGxhYmVsLgorCSogZG9jcy9NYWtlZmlsZS5hbSAoZ3J1Yi5pbmZvKTogUmVtb3ZlZC4gVXNlIHRoZSBkZWZhdWx0IHJ1bGUKKwlpbnN0ZWFkLgorCisxOTk5LTEwLTI1ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBzdGFnZTIvYXNtLlMgW0RFRklORV9UUkFDS19JTlQxM10gKGludDNfaGFuZGxlcik6IFNhdmUgdGhlCisJbW9kaWZpZWQgRkxBR1MgaW4gNiglYnApIGluc3RlYWQgb2YgNCglYnApLgorCURlY3JlYXNlICVieCBiZWZvcmUgcmVzdG9yaW5nIHRoZSBmaXJzdCBpbnN0cnVjdGlvbi4KKwlbREVGSU5FX1RSQUNLX0lOVDEzXSAodHJhY2tfaW50MTMpOiBHbyB0byB0aGUgcmVhbCBtb2RlIGJlZm9yZQorCXNldHRpbmcgdXAgdGhlIHJlZ2lzdGVycyBmb3IgdGhlIGludDEzIGNhbGwuCisKKzE5OTktMTAtMjQgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwlBZGQgdGhlIHByb3RvdHlwZSBvZiBhIGZ1bmN0aW9uIHRvIHByb2JlIEkvTyBwb3J0cyB1c2VkIGZvciBhCisJQklPUyBkcml2ZS4KKworCSogc3RhZ2UyL2FzbS5TIFtERUZJTkVfVFJBQ0tfSU5UMTNdICh0cmFja19pbnQxMyk6IE5ldyBmdW5jdGlvbi4KKwlbREVGSU5FX1RSQUNLX0lOVDEzXSAoaW50MV9oYW5kbGVyKTogTmV3IGludGVycnVwdCBoYW5kbGVyIGZvcgorCXRoZSByZWFsIG1vZGUuCisJW0RFRklORV9UUkFDS19JTlQxM10gKGludDNfaGFuZGxlcik6IExpa2V3aXNlLgorCVtERUZJTkVfVFJBQ0tfSU5UMTNdIChpb19tYXApOiBOZXcgdmFyaWFibGUuCisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChxdWl0X2Z1bmMpIFshR1JVQl9VVElMXTogRml4IGEgdHlwby4KKworMTk5OS0xMC0yNCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCVRoZSBuZXcgR1JVQiBtYW51YWwgYmVjb21lcyBvZmZpY2lhbC4KKworCSogZG9jcy9ncnViLnRleGk6IFJlcGxhY2VkIHdpdGggbmV3LWdydWIudGV4aS4KKwkqIGRvY3MvbmV3LWdydWIudGV4aTogUmVtb3ZlZC4KKwkqIGRvY3MvTWFrZWZpbGUuYW0gKGdydWJfVEVYSU5GT1MpOiBOZXcgdmFyaWFibGUuCisJKFVORklOSVNIRURfTUFOVUFMUyk6IFJlbW92ZWQuCisJKEVYVFJBX0RJU1QpOiBEZWxldGVkICQoVU5GSU5JU0hFRF9NQU5VQUxTKS4KKworMTk5OS0xMC0yNCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGRldmljZV9mdW5jKSBbIUdSVUJfVVRJTF06IFNldCBFUlJOVU0gdG8KKwlFUlJfVU5SRUNPR0lOSVpFRCBhbmQgcmV0dXJuIDEuCisJKGltcHNwcm9iZV9mdW5jKSBbR1JVQl9VVElMXTogTGlrZXdpc2UuCisJKHF1aXRfZnVuYykgWyFHUlVCX1VUSUxdOiBMaWtld2lzZS4KKwkqIGRvY3MvdHV0b3JpYWwudGV4aTogUmVuYW1lICJEZXZpY2UgU3ludGF4IiB0byAiRmlsZW5hbWUiLgorCUFkZGVkIG1hbnkgY3Jvc3MtcmVmZXJlbmNlcy4KKwkqIGRvY3MvbmV3LWdydWIudGV4aTogIkRldmljZSBTeW50YXgiIC0+ICJGaWxlbmFtZSIuCisJKiBkb2NzL3VzZXItcmVmLnRleGk6IEZpeCB0eXBvcyBhbmQgYWRkZWQgc29tZSBjcm9zcy1yZWZlcmVuY2VzLgorCSogZG9jcy9wcm9nLXJlZi50ZXhpOiBMaWtld2lzZS4KKwkqIGRvY3MvYXBwZW5kaWNlcy50ZXhpOiBMaWtld2lzZS4KKworMTk5OS0xMC0yMyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgKG1hcF9mdW5jKTogSWYgQklPU19EUklWRV9NQVAgYWxyZWFkeQorCWNvbnRhaW5zIEZST00sIG92ZXJyaWRlIHRoZSBleGlzdHNpbmcgZW50cnkuCisJSWYgVE8gaXMgZXF1YWwgdG8gRlJPTSwgZGVsZXRlIHRoZSBleGlzdGluZyBlbnRyeSBpZiBhbnkuCisJKGtleWNvZGVfZnVuYyk6IExpa2V3aXNlLgorCSogZG9jcy91c2VyLXJlZi50ZXhpIChDb21tYW5kKTogVXNlIHRoZSBsaXN0IG9mIGBAZGVmZm4ncworCWluc3RlYWQgb2YgQHRhYmxlLgorCShCYXNpYyB1c2FnZSk6IFVzZSBAb3B0aW9uIGluc3RlYWQgb2YgQGNvZGUuCisJKEludm9raW5nIG1iY2hrKTogTGlrZXdpc2UuCisKKzE5OTktMTAtMjMgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHN0YWdlMi9hc20uUyBbIVNUQUdFMV81XSAoc2V0X2ludDE1X2hhbmRsZXIpOiBOZXcgZnVuY3Rpb24uCisJWyFTVEFHRTFfNV0gKHVuc2V0X2ludDE1X2hhbmRsZXIpOiBMaWtld2lzZS4KKwlbIVNUQUdFMV81XSAoaW50MTVfaGFuZGxlcik6IE5ldyBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIHJlYWwKKwltb2RlLgorCVshU1RBR0UxXzVdIChpbnQxNV9vZmZzZXQpOiBOZXcgdmFyaWFibGUuCisJWyFTVEFHRTFfNV0gKGludDE1X3NlZ21lbnQpOiBMaWtld2lzZS4KKwlbIVNUQUdFMV81XSAoa2V5X21hcCk6IExpa2V3aXNlLgorCVshU1RBR0UxXzVdIChzZXRfaW50MTNfaGFuZGxlcik6IFVzZSB0aGUgbWFjcm8gQUJTIGZvcgorCUlOVDEzX09GRlNFVCBhbmQgSU5UMTNfU0VHTUVOVC4KKwkqIHN0YWdlMi9zaGFyZWQuaCAoS0VZX01BUF9TSVpFKTogTmV3IG1hY3JvLgorCShzZXRfaW50MTVfaGFuZGxlcik6IERlY2xhcmVkLgorCSh1bnNldF9pbnQxNV9oYW5kbGVyKTogTGlrZXdpc2UuCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoYm9vdF9mdW5jKTogRG8gbm90IGFsbG93IEkgdG8gYmUgZXF1YWwgdG8KKwlEUklWRV9NQVBfU0laRS4KKwlDYWxsIHVuc2V0X2ludDE1X2hhbmRsZXIgdW5sZXNzIEtFUk5FTF9UWVBFIGlzIEtFUk5FTF9UWVBFX05PTkUuCisJKG1hcF9mdW5jKTogU2VhcmNoIGZvciBhbiBlbXB0eSBzbG90IHRpbGwgSSBpcyBsZXNzIHRoYW4KKwlEUklWRV9NQVBfU0laRS4KKwlDaGVjayBpZiBJIGlzIGVxdWFsIHRvIERSSVZFX01BUF9TSVpFIGluc3RlYWQgb2YgaWYgSSBpcyBncmVhdGVyCisJdGhhbiBEUklWRV9NQVBfU0laRS4KKwkoa2V5Y29kZV9mdW5jKTogTmV3IGZ1bmN0aW9uLgorCShidWlsdGluX2tleWNvZGUpOiBOZXcgdmFyaWFibGUuCisJKGJ1aWx0aW5fdGFibGUpOiBBZGRlZCBhIHBvaW50ZXIgdG8gQlVJTFRJTl9LRVlDT0RFLgorCSogZ3J1Yi9hc21zdHViLmMgKHNldF9pbnQxNV9oYW5kbGVyKTogTmV3IGZ1bmN0aW9uLgorCSh1bnNldF9pbnQxNV9oYW5kbGVyKTogTGlrZXdpc2UuCisJKGtleV9tYXApOiBOZXcgdmFyaWFibGUuCisKKzE5OTktMTAtMjMgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwlGcm9tIE1pY2hhZWwgSG9obXV0aCA8aG9obXV0aEBpbm5vY2VudC5jb20+OgorCSogYWNjb25maWcuaCAoSEFWRV9VU0NPUkVfVVNDT1JFX0JTU19TVEFSVF9TWU1CT0wpOiBBZGRlZCB0aGUKKwlgdW5kZWYnIGVudHJ5LgorCShIQVZFX0VEQVRBX1NZTUJPTCk6IExpa2V3aXNlLgorCShIQVZFX1VTQ09SRV9FREFUQV9TWU1CT0wpOiBMaWtld2lzZS4KKwkqIGFjaW5jbHVkZS5tNCAoZ3J1Yl9DSEVDS19VU0NPUkVfVVNDT1JFX0JTU19TVEFSVF9TWU1CT0wpOiBOZXcKKwlmdW5jdGlvbi4KKwkoZ3J1Yl9DSEVDS19FREFUQV9TWU1CT0wpOiBMaWtld2lzZS4KKwkoZ3J1Yl9DSEVDS19VU0NPUkVfRURBVEFfU1lNQk9MKTogTGlrZXdpc2UuCisJKiBjb25maWd1cmUuaW46IENoZWNrIGZvciBfX2JzcywgZWRhdGEgYW5kIF9lZGF0YS4KKwkqIG5ldGJvb3QvTWFrZWZpbGUuYW0gKERSSVZFUlMpOiBEZWxldGVkIG5zODM5MC5jIGFuZCBuczgzOTAuaC4KKwkobGliZHJpdmVyc19hX0xJQkFERCk6IE5ldyB2YXJpYWJsZS4KKwkoJChsaWJkcml2ZXJzX2FfTElCQUREKSk6IE5ldyB0YXJnZXQuCisJKG5lcGNpX29fQ0ZMQUdTKTogTmV3IHZhcmlhYmxlLgorCShuZV9vX0NGTEFHUyk6IExpa2V3aXNlLgorCSh3ZF9vX0NGTEFHUyk6IExpa2V3aXNlLgorCSh0NTAzX29fQ0ZMQUdTKTogTGlrZXdpc2UuCisJKiBuZXRib290L2ZzeXNfdGZ0cC5jICh0ZnRwX2Nsb3NlKTogTmV3IGZ1bmN0aW9uLgorCSogc3RhZ2UyL2Jvb3QuYyAobG9hZF9pbWFnZSk6IENhbGwgZ3J1Yl9jbG9zZSBiZWZvcmUgcmV0dXJuLgorCShsb2FkX2luaXRyZCk6IExpa2V3aXNlLgorCShsb2FkX21vZHVsZSk6IExpa2V3aXNlLgorCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGNhdF9mdW5jKTogTGlrZXdpc2UuCisJKGNoYWlubG9hZGVyX2Z1bmMpOiBMaWtld2lzZS4KKwkoY29uZmlnZmlsZV9mdW5jKTogTGlrZXdpc2UuCisJKGVtYmVkX2Z1bmMpOiBMaWtld2lzZS4KKwkoZmluZF9mdW5jKTogTGlrZXdpc2UuCisJKGluc3RhbGxfZnVuYyk6IFNldCBJU19PUEVOIHRvIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBncnViX29wZW4uCisJSWYgSVNfT1BFTiBpcyBub24temVybywgY2FsbCBncnViX2Nsb3NlIGJlZm9yZSByZXR1cm4uCisJKHNldHVwX2Z1bmMpOiBDYWxsIGdydWJfY2xvc2UgYWZ0ZXIgZ3J1Yl9vcGVuLgorCSh0ZXN0bG9hZCk6IENhbGwgZ3J1Yl9jbG9zZSBiZWZvcmUgcmV0dXJuLgorCSogc3RhZ2UyL2Rpc2tfaW8uYyAoZnN5c190YWJsZSk6IEFkZCB0aGUgYGNsb3NlJyBtZW1iZXIgaW50bworCWVhY2ggb2YgdGhlIGVudHJpZXMuIEZvciBURlRQLCB0ZnRwX2Nsb3NlIGlzIGFkZGVkLCBhbmQgZm9yIHRoZQorCXJlc3QsIE5VTEwgaXMgYWRkZWQuCisJKGdydWJfcmVhZCk6ICJ8IiAtPiAifHwiLgorCShncnViX2Nsb3NlKTogTmV3IGZ1bmN0aW9uLgorCSogc3RhZ2UyL2ZpbGVzeXMuaCBbRlNZU19URlRQXSAodGZ0cF9jbG9zZSk6IERlY2xhcmVkLgorCShzdHJ1Y3QgZnN5c19lbnRyeSk6IEFkZGVkIGNsb3NlX2Z1bmMuCisJKiBzdGFnZTIvc2hhcmVkLmggKGdydWJfY2xvc2UpOiBEZWNsYXJlZC4KKwkqIHN0YWdlMi9zdGFnZTFfNS5jIChjbWFpbik6IENhbGwgZ3J1Yl9jbG9zZSBhZnRlciBncnViX29wZW4uCisJKiBzdGFnZTIvc3RhZ2UyLmMgKGNtYWluKTogQ2xlYXIgRVJSTlVNIGFmdGVyIGNhbGxpbmcKKwlmaW5kX2NvbW1hbmQgdG8ganVzdCBpZ25vcmUgdGhlIGVycm9yIGNvZGUuCisJQ2FsbCBncnViX2Nsb3NlIGFmdGVyIGxvYWRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKworCSogc3RhZ2UyL2FzbS5TIChtYWluKTogQ2xlYW4gb3V0IHRoZSBic3MuCisKKzE5OTktMTAtMjMgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIGRvY3MvbmV3LWdydWIudGV4aTogVXBkYXRlZC4KKwkqIGRvY3MvdXNlci1yZWYudGV4aTogTGlrZXdpc2UuCisJKiBkb2NzL3R1dG9yaWFsLnRleGk6IExpa2V3aXNlLgorCSogZG9jcy9wcm9nLXJlZi50ZXhpOiBMaWtld2lzZS4KKwkqIGRvY3MvYXBwZW5kaWNlcy50ZXhpOiBMaWtld2lzZS4KKworMTk5OS0xMC0yMiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogZG9jcy9wcm9nLXJlZi50ZXhpOiBOZXcgZmlsZS4KKwkqIGRvY3MvYXBwZW5kaWNlcy50ZXhpOiBMaWtld2lzZS4KKwkqIGRvY3MvTWFrZWZpbGUuYW0gKFVORklOSVNIRURfTUFOVUFMUyk6IEFkZGVkIHByb2ctcmVmLnRleGkgYW5kCisJYXBwZW5kaWNlcy50ZXhpLgorCisxOTk5LTEwLTIyICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBkb2NzL3VzZXItcmVmLnRleGk6IE5ldyBmaWxlLgorCSogZG9jcy9NYWtlZmlsZS5hbSAoVU5GSU5JU0hFRF9NQU5VQUxTKTogQWRkZWQgdXNlci1yZWQudGV4aS4KKworMTk5OS0xMC0yMSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCUFkZCBCSU9TIGRyaXZlIHJlbWFwcGluZyBzdXBwb3J0IGZvciBjaGFpbi1sb2FkaW5nIHNvbWUgZm9vbGlzaAorCW9wZXJhdGluZyBzeXN0ZW1zLgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoYmlvc19kcml2ZV9tYXApOiBOZXcgdmFyaWFibGUuCisJKGJvb3RfZnVuYyk6IElmIEtFUk5FTF9UWVBFIGlzIEtFUk5FTF9UWVBFX0NIQUlOTE9BREVSLCBjaGVjaworCWlmIEJJT1NfRFJJVkVfTUFQIGNvbnRhaW5zIG1lYW5pbmdmdWwgdmFsdWVzLiBJZiBzbywgc2VhcmNoIGZvcgorCVNBVkVEX0RSSVZFIGluIEJJT1NfRFJJVkVfTUFQIGFuZCBleGNoYW5nZSBTQVZFRF9EUklWRSB3aXRoIHRoZQorCW1hcHBlZCBkcml2ZSBpZiBmb3VuZC4gQW5kIHRoZW4gY2FsbCBzZXRfaW50MTNfaGFuZGxlci4KKwkobWFwX2Z1bmMpOiBOZXcgZnVuY3Rpb24uCisJKGJ1aWx0aW5fbWFwKTogTmV3IHZhcmlhYmxlLgorCShidWlsdGluX3RhYmxlKTogQWRkZWQgYSBwb2ludGVyIHRvIEJVSUxUSU5fTUFQLgorCSogc3RhZ2UyL2FzbS5TIChBQlMpOiBOZXcgbWFjcm8uCisJWyFTVEFHRTFfNV0gKHNldF9pbnQxM19oYW5kbGVyKTogTmV3IGZ1bmN0aW9uLgorCVshU1RBR0UxXzVdIChpbnQxM19oYW5kbGVyKTogTmV3IGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgcmVhbAorCW1vZGUuCisJWyFTVEFHRTFfNV0gKGRyaXZlX21hcCk6IE5ldyB2YXJpYWJsZS4KKwlbIVNUQUdFMV81XSAoaW50MTNfaGFuZGxlcl9lbmQpOiBOZXcgbGFiZWwgdXNlZCBmb3IganVzdAorCWNvbXB1dGluZyB0aGUgZW5kIGFkZHJlc3Mgb2YgaW50MTNfaGFuZGxlci4KKwkqIHN0YWdlMi9zaGFyZWQuaCAoRFJJVkVfTUFQX1NJWkUpOiBOZXcgbWFjcm8uCisJKHNldF9pbnQxM19oYW5kbGVyKTogRGVjbGFyZWQuCisJKiBncnViL2FzbXN0dWIuYyAoc2V0X2ludDEzX2hhbmRsZXIpOiBOZXcgZnVuY3Rpb24uIERvIG5vdGhpbmcuCisKKzE5OTktMTAtMjAgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChmaW5kX2Z1bmMpOiBQcmludCBvbmx5IHRoZSBkZXZpY2UgbmFtZXMuCisJKiBkb2NzL3R1dG9yaWFsLnRleGk6IE5ldyBmaWxlLgorCSogZG9jcy9NYWtlZmlsZS5hbSAoVU5GSU5JU0hFRF9NQU5VQUxTKTogQWRkZWQgdHV0b3JpYWwudGV4aS4KKwkoJS5jLnRleGkpOiBVc2UgJChTSEVMTCkgaW5zdGVhZCBvZiAvYmluL3NoLgorCSglLmgudGV4aSk6IExpa2V3aXNlLgorCSglLlMudGV4aSk6IExpa2V3aXNlLgorCisxOTk5LTEwLTIwICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBzdGFnZTIvY2hhcl9pby5jIChtZW1jaGVjayk6IEZpeCB0aGUgY2hlY2tzOiAiPD0iIC0+ICI8Ii4KKwlSZXBvcnRlZCBieSBNaWtlIEhpY2tzIDxoaWNrMDA4OEB1bW4uZWR1Pi4KKworMTk5OS0xMC0xOSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGZpbmRfZnVuYyk6IE5ldyBmdW5jdGlvbi4KKwkoYnVpbHRpbl9maW5kKTogTmV3IHZhcmlhYmxlLgorCShoaWRlX2Z1bmMpOiBTYXZlIFNBVkVEX0RSSVZFIGFuZCBTQVZFRF9QQVJUSVRJT04gdG8gVE1QX0RSSVZFCisJYW5kIFRNUF9QQVJUSVRJT04sIHJlc3BlY3RpdmVseSwgYW5kIHJlc290cmUgdGhlbSBiZWZvcmUgcmV0dXJuLgorCSh1bmhpZGVfZnVuYyk6IExpa2V3aXNlLgorCShzZXR1cF9mdW5jKTogTGlrZXdpc2UuIEFuZCBzZXQgU0FWRURfRFJJVkUgYW5kIFNBVkVEX1BBUlRJVElPTgorCWluc3RlYWQgb2YgQ1VSUkVOVF9EUklWRSBhbmQgQ1VSUkVOVF9QQVJUSVRJT04gdG8gSU1BR0VfRFJJVkUKKwlhbmQgSU1BR0VfUEFSVElUSU9OIGJlZm9yZSBydW5uaW5nIGluc3RhbGxfZnVuYy4KKwkoYnVpbHRpbl90YWJsZSk6IEFkZGVkIGEgcG9pbnRlciB0byBCVUlMVElOX0ZJTkQuCisKKzE5OTktMTAtMTkgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIGRvY3MvTWFrZWZpbGUuYW0gKFVORklOSVNIRURfTUFOVUFMUyk6IE5ldyB2YXJpYWJsZS4KKwkoRVhUUkFfRElTVCk6IEFkZGVkICQoVU5GSU5JU0hFRF9NQU5VQUxTKS4KKwkqIGRvY3MvbmV3LWdydWIudGV4aTogTmV3IGZpbGUuCisKKzE5OTktMTAtMTkgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIGRvY3MvTWFrZWZpbGUuYW0gKG1hbl9NQU5TKTogQWRkZWQgbWJjaGsuMS4KKwlbTUFJTlRBSU5FUl9NT0RFXSAobWJjaGsuMSk6IE5ldyB0YXJnZXQuCisJKiBkb2NzL21iY2hrLjE6IE5ldyBmaWxlLiBHZW5lcmF0ZWQgYnkgaGVscDJtYW4uCisKKzE5OTktMTAtMTggIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIE1ha2VmaWxlLmFtIChTVUJESVJTKTogQWRkZWQgdXRpbC4KKwkqIGNvbmZpZ3VyZS5pbjogT3V0cHV0IHV0aWwvTWFrZWZpbGUuCisJKiB1dGlsL01ha2VmaWxlLmFtOiBOZXcgZmlsZS4KKwkqIHV0aWwvbWJjaGsuYzogTGlrZXdpc2UuCisJKiB1dGlsL01ha2VmaWxlLmluOiBMaWtld2lzZS4gR2VuZXJhdGVkIGJ5IGF1dG9tYWtlLgorCisxOTk5LTEwLTE3ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBkb2NzL01ha2VmaWxlLmFtICgudGV4aSk6IENhbmNlbGVkIGJlY2F1c2UgdGhlIGRlcGVuZGVjaWVzIGNhbgorCWJlIGNpcmN1bGF0ZWQuCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoZW1iZWRfZnVuYyk6IFNldCBCVUZfVFJBQ0sgdG8gLTEgYmVmb3JlCisJd3JpdGluZwl0aGUgU3RhZ2UgMS41IHRvIHRoZSBkaXNrIHRvIGNsZWFyIHRoZSBjYWNoZS4KKworMTk5OS0xMC0xNyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogc3RhZ2UyL2Jvb3QuYyAobG9hZF9pbml0cmQpOiBDaGFuZ2UgdHlwZXMgb2YgKlJBTURJU0sgYW5kCisJTU9WRVRPIHRvIHVuc2lnbmVkIGxvbmcuCisJQXBwbHkgdGhlIG1hY3JvIFJBV19BRERSIHRvIE1PVkVUTy4KKworMTk5OS0xMC0xNiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogZG9jcy9tdWx0aWJvb3QudGV4aTogSW5jbHVkZSB0aGUgZXhhbXBsZSBzb3VyY2UgZmlsZXMgb2YgYQorCU11bHRpYm9vdCBrZXJuZWwuCisJKiBkb2NzL3NyYzJ0ZXhpOiBOZXcgZmlsZS4KKwkqIGRvY3MvYm9vdC5TOiBMaWtld2lzZS4KKwkqIGRvY3MvbXVsdGlib290Lmg6IExpa2V3aXNlLgorCSogZG9jcy9rZXJuZWwuYzogTGlrZXdpc2UuCisJKiBkb2NzL2Jvb3QuUy50ZXhpOiBMaWtld2lzZS4KKwkqIGRvY3MvbXVsdGlib290LmgudGV4aTogTGlrZXdpc2UuCisJKiBkb2NzL2tlcm5lbC5jLnRleGk6IExpa2V3aXNlLgorCSogZG9jcy9NYWtlZmlsZS5hbSAoRVhBTVBMRVMpOiBOZXcgdmFyaWxhYmxlLgorCShtdWx0aWJvb3RfVEVYSU5GT1MpOiBMaWtld2lzZS4KKwkoU1JDMlRFWEkpOiBMaWtld2lzZS4KKwkobm9pbnN0X1NDUklQVFMpOiBBZGRlZCAkKFNSQzJURVhJKS4KKwkoRVhUUkFfRElTVCk6IEFkZGVkICQoRVhBTVBMRVMpIGFuZCAkKG11bHRpYm9vdF9URVhJTkZPUykuCisJKCUuYy50ZXhpKTogTmV3IHRhcmdldC4KKwkoJS5oLnRleGkpOiBMaWtld2lzZS4KKwkoJS5TLnRleGkpOiBMaWtld2lzZS4KKworMTk5OS0wOS0yMiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworICAgICAgICAqIG11bHRpYm9vdC50ZXhpIChCSU9TIGRldmljZSBtYXBwaW5nIHRlY2huaXF1ZXMpOiBOZXcgc2VjdGlvbi4KKyAgICAgICAgU3RvbGVuIGZyb20gYmlvc19tYXBwaW5nLnR4dCBpbiBncnViLTAuNS4KKyAgICAgICAgKERhdGEgY29tcGFyaXNvbiB0ZWNobmlxdWUpOiBOZXcgc3Vic2VjdGlvbi4KKyAgICAgICAgKEkvTyByZXN0cmljdGlvbiB0ZWNobmlxdWUpOiBMaWtld2lzZS4KKyAgICAgICAgKEV4YW1wbGUgT1MgY29kZSk6IFJld3JpdGVkIGZyb20gc2NyYXRjaC4KKworMTk5OS0wOS0yMSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworICAgICAgICAqIG11bHRpYm9vdC50ZXhpOiBSZW5hbWUgTXVsdGlib290IFN0YW5kYXJkIHRvIE11bHRpYm9vdAorICAgICAgICBTcGVjaWZpY2F0aW9uIGFuZCB1cGdyYWRlIHRoZSB2ZXJzaW9uIHRvIDAuNy4gTWFueSBjbGVhbnVwcworICAgICAgICBhcmUgZG9uZS4KKworMTk5OS0xMC0xNSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgKHNldHVwX2Z1bmMpOiBTYXZlIENVUlJFTlRfRFJJVkUgYW5kCisJQ1VSUkVOVF9QQVJUSVRJT04gaW50byBJTUFHRV9EUklWRSBhbmQgSU1BR0VfUEFSVElUSU9OCisJcmVzcGVjdGl2ZWx5LCBhbmQgcmVzdG9yZSB0aGVtIGJlZm9yZSBydW5uaW5nIGluc3RhbGxfZnVuYy4KKwlVc2UgREVWSUNFIGluc3RlYWQgb2YgQlVGRkVSIHRvIHN0b3JlIHRoZSBkZXZpY2UgbmFtZS4KKwlDaGFuZ2UgZWFjaCB0eXBlIG9mIFNUQUdFMSwgU1RBR0UyIGFuZCBDT05GSUdfRklMRSB0byBhbiBhcnJheQorCW9mIGNoYXIuCisJSWYgaW5zdGFsbGluZyB0aGUgU3RhZ2UgMSBpbnRvIGEgTUJSLCBlbWJlZCB0aGUgU3RhZ2UgMS41IGluIHRoZQorCXNlY3RvcnMgcmlnaHQgYWZ0ZXIgaXQuCisJUmV0dXJuIHRoZSByZXN1bHQgb2YgaW5zdGFsbF9mdW5jIGluc3RlYWQgb2YgemVyby4KKworMTk5OS0xMC0xNCAgUGF2ZWwgUm9za2luICA8cGF2ZWxfcm9za2luQGdlb2NpdGllcy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIG9wZW5kaXNrIGluIGxpYnV0aWwuCisJKiBncnViL2FzbXN0dWIuYyBbX19GcmVlQlNEX18gfHwgX19OZXRCU0RfX106IEluY2x1ZGUKKwk8c3lzL2lvY3RsLmg+LgorCVtIQVZFX09QRU5ESVNLXTogSW5jbHVkZSA8dXRpbC5oPi4KKwlbX19OZXRCU0RfX10gKGdldF9mbG9wcHlfZGlza19uYW1lKTogQWRkZWQgc3VwcG9ydCBmb3IgTmV0QlNELgorCVtfX05ldEJTRF9fICYmIEhBVkVfT1BFTkRJU0tdIChnZXRfaWRlX2Rpc2tfbmFtZSk6IExpa2V3aXNlLgorCVtfX05ldEJTRF9fICYmIEhBVkVfT1BFTkRJU0tdIChnZXRfc2NzaV9kaXNrX25hbWUpOiBMaWtld2lzZS4KKwkoZ2V0X2RyaXZlX2dlb21ldHJ5KSBbX19OZXRCU0RfX106IFVzZSBmb3IgTmV0QlNEIHRoZSBzYW1lIGlvY3RsCisJYXMgZm9yIEZyZWVCU0QuCisKKzE5OTktMTAtMTMgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIGdydWIvYXNtc3R1Yi5jIChhc3NpZ25fZGV2aWNlX25hbWUpOiBJZiBERVZJQ0UgaXMgTlVMTCwgc2V0CisJREVWSUNFX01BUFtEUklWRV0gdG8gTlVMTC4KKwkoZ2V0X2Rpc2tpbmZvKTogSWYgb3BlbiBvciByZWFkIGZhaWxzLCBjYWxsIGFzc2lnbl9kZXZpY2VfbmFtZQorCXRvIGRpc2FibGUgYWNjZXNzaW5nIHRoZSBkcml2ZSBEUklWRS4KKwkoZ3J1Yl9zdGFnZTIpOiBUaGUgZGV2aWNlIG1hcHBpbmcgcm91dGluZSBpcyBtb3ZlZCB0byAuLi4KKwkoaW5pdF9kZXZpY2VfbWFwKTogLi4uIGhlcmUuIFRoaXMgbmV3IGZ1bmN0aW9uIGFsc28gcmVhZHMvd3JpdGVzCisJYSBkZXZpY2UgbWFwIGZpbGUuIElmIERFVklDRV9NQVBfRklMRSBhbHJlYWR5IGV4aXN0cywgdGhlbiB1c2UKKwl0aGUgZGF0YSBpbiBpdCBpbnN0ZWFkIG9mIHByb2JpbmcgZGV2aWNlcy4gT3RoZXJ3aXNlLCBndWVzcyB0aGUKKwltYXAgYmV0d2VlbiBCSU9TIGRyaXZlcyBhbmQgT1MgZGV2aWNlcywgYW5kIHdyaXRlIGl0IHRvIHRoZSBmaWxlCisJREVWSUNFX01BUF9GSUxFIGlmIGl0IGNhbiBiZSBvcGVuZWQuCisJKiBncnViL21haW4uYyAoZGV2aWNlX21hcF9maWxlKTogTmV3IHZhcmlhYmxlLgorCShkZWZhdWx0X2RldmljZV9tYXBfZmlsZSk6IExpa2V3aXNlLgorCShPUFRfREVWSUNFX01BUCk6IE5ldyBtYWNyby4KKwkobG9uZ29wdHMpOiBBZGRlZCBhbiBlbnRyeSBmb3IgImRldmljZS1tYXAiLgorCSh1c2FnZSk6IFByaW50IHRoZSB1c2FnZSBhYm91dCAtLWRldmljZS1tYXAgYXMgd2VsbC4KKwkobWFpbik6IFNldCBERUZBVUxUX0RFVklDRV9NQVBfRklMRSB0byBERVZJQ0VfTUFQX0ZJTEUuIElmCisJT1BUX0RFVklDRV9NQVAgaXMgZm91bmQsIHNldCBERVZJQ0VfTUFQX0ZJTEUgdG8gYSBkdXBsaWNhdGVkCisJc3RyaW5nIG9mIE9QVEFSRy4KKwkqIHN0YWdlMi9zaGFyZWQuaCBbR1JVQl9VVElMXSAoZGV2aWNlX21hcF9maWxlKTogRGVjbGFyZWQuCisJKiBkb2NzL2dydWIuODogUmVnZW5lcmF0ZWQuCisKKzE5OTktMTAtMTMgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChjb2xvcl9mdW5jKTogRG8gbm90IHNldCBOT1JNQUxfQ09MT1Igb3IKKwlISUdITElHSFRfQ09MT1IgZGlyZWN0bHksIGJ1dCB1c2UgTkVXX05PUk1BTF9DT0xPUiBhbmQKKwlORVdfSElHSExJR0hUX0NPTE9SIGFzIHRlbXBvcmFyeSBzdG9yYWdlcyBpbnN0ZWFkLgorCU5ldyBpbnRlcm5hbCBmdW5jdGlvbiBgY29sb3JfbnVtYmVyJyBpcyB1c2VkIHRvIGNvbnZlcnQgYQorCXN5bWJvbGljIGNvbG9yIHJlcHJlc2VudGF0aW9uIGludG8gYSBjb2xvciBudW1iZXIuCisJVHJ5IGNvbG9yX251bWJlciBhdCBmaXJzdCwgYW5kIGlmIGZhaWxzLCB0aGVuIHRyeQorCXNhZmVfcGFyc2VfbWF4aW50IGZvciBlYWNoIG9mIE5PUk1BTCBhbmQgSElHSExJR0hULgorCShidWlsdGluX2NvbG9yKTogVGhlIGxvbmcgZG9jIGRvZXMgbm90IGRlc2NyaWJlIHRoZSByYXcgbnVtYmVyCisJc3ludGF4IGJ1dCB0aGUgc3ltYm9saWMgY29sb3IgbmFtZSBzeW50YXguCisJKiBkb2NzL2dydWIudGV4aSAoQ29tbWFuZHMpOiBBZGp1c3RlZCB0byB0aGUgbG9uZyBkb2Mgb2YKKwlCVUlMVElOX0NPTE9SLgorCSogZG9jcy9tZW51LmxzdDogQWRkIGV4YW1wbGVzIG9mICJmYWxsYmFjayIgYW5kICJjb2xvciIuCisKKzE5OTktMTAtMTMgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHN0YWdlMi9jaGFyX2lvLmMgWyFTVEFHRTFfNV0gKGdldF9jbWRsaW5lKTogSWYgQyBpcyBhIG5ld2xpbmUKKwlvciBhIHJldHVybiwgdGhlbiBzZXQgTFBPUyB0byBMTEVOIGFuZCBjYWxsIHRoZSBmdW5jdGlvbgorCWNsX3NldGNwb3MuCisJWyFTVEFHRTFfNV0gKGdydWJfc3RybmNhdCk6IE5ldyBmdW5jdGlvbi4KKwkqIHN0YWdlMi9idWlsdGlucy5jIChlbWJlZF9mdW5jKTogTmV3IGZ1bmN0aW9uLgorCShidWlsdGluX2VtYmVkKTogTmV3IHZhcmlsYWJsZS4KKwkoc2V0dXBfZnVuYyk6IE5ldyBmdW5jdGlvbi4KKwkoYnVpbHRpbl9zZXR1cCk6IE5ldyB2YXJpbGFibGUuCisJKGJ1aWx0aW5fdGFibGUpOiBBZGRlZCBhIHBvaW50ZXIgdG8gQlVJTFRJTl9FTUJFRCBhbmQgYSBwb2ludGVyCisJdG8gQlVJTFRJTl9TRVRVUC4KKwkqIHN0YWdlMi9zaGFyZWQuaCAoZ3J1Yl9zdHJuY2F0KTogRGVjbGFyZWQuCisKKwkqIHN0YWdlMi9NYWtlZmlsZS5hbSAoc3RhZ2UyX3NpemUuaCk6IC4uL3N0YWdlMi9zdGFnZTIgLT4KKwlwcmVfc3RhZ2UyLiBSZXBvcnRlZCBieSBQYXZlbCBSb3NraW4uCisKKzE5OTktMTAtMTIgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwlGcm9tIFBhdmVsIFJvc2tpbjoKKwkqIGFjaW5jbHVkZS5tNCAoZ3J1Yl9QUk9HX09CSkNPUFlfQUJTT0xVVEUpOiBtYWluIC0+IGNtYWluLgorCSogc3RhZ2UyL2Jvb3QuYyAobG9hZF9pbWFnZSk6IE9ubHkgQ1VSX0FERFIsIG5vdCBFTlRSWV9BRERSCisJc2hvdWxkIGJlIDFNLWFsaWduZWQgZm9yIE5ldEJTRC4gRG9uJ3QgYWxpZ24gc3ltYm9sIHRhYmxlIG9uIDRrCisJYm91bmRhcmllcyBpZiB0aGUga2VybmVsIGRvZXNuJ3QgcmVxdWlyZSBpdC4KKworMTk5OS0xMC0xMCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogc3RhZ2UyL2FzbS5TIFshU1RBR0UxXzVdIChzdGFydCk6IE5ldyBsYWJlbCB0byBmb3JjZSBsZCBxdWlldC4KKwlbIVNUQUdFMV81XSAoX3N0YXJ0KTogTGlrZXdpc2UuCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoaW5zdGFsbF9mdW5jKTogUmV3cml0dGVuIGhlYXZpbHkgYWxtb3N0CisJZnJvbSBzY3JhdGNoLiBBcyB0aGUgYmxvY2tsaXN0IHdhcyBtb3ZlZCB0byB0aGUgZmlyc3Qgc2VjdG9yIG9mCisJU3RhZ2UgMiwgYWx3YXlzIHdyaXRlIHNlY3RvcnMgb2YgU3RhZ2UgMiB0byB0aGUgZGlzay4KKwkqIHN0YWdlMS9zdGFnZTEuaCAoU1RBR0UxX1NUQUdFMl9TRUNUT1IpOiAweDQwIC0+IDB4NDEuCisJKFNUQUdFMV9TVEFHRTJfQUREUkVTUyk6IDB4NDQgLT4gMHg0NS4KKwkoU1RBR0UxX1NUQUdFMl9TRUdNRU5UKTogMHg0NiAtPiAweDQ3LgorCShTVEFHRTFfQk9PVF9EUklWRSk6IDB4M2YgLT4gMHg0MC4KKworMTk5OS0xMC0wOSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCVN0YWdlMSBzdXBwb3J0cyBib3RoIHRoZSBDSFMgbW9kZSBhbmQgdGhlIExCQSBtb2RlLgorCisJKiBzdGFnZTEvTWFrZWZpbGUuYW0gKG5vZGlzdF9wa2dkYXRhX0RBVEEpOiBSZW1vdmVkIHN0YWdlMV9sYmEuCisJKEJVSUxUX1NPVVJDRVMpOiBEZWxldGVkLgorCShDTEVBTkZJTEVTKTogTGlrZXdpc2UuCisJKG5vaW5zdF9QUk9HUkFNUyk6IFJlbW92ZWQgc3RhZ2UxX2xiYS5leGVjLgorCShzdGFnZTFfZXhlY19TT1VSQ0VTKTogUmVtb3ZlZCBzdGFnZTJfc2l6ZS5oLgorCShzdGFnZTJfc2l6ZS5oKTogRGVsZXRlZC4KKwkoc3RhZ2UxX2xiYV9leGVjX1NPVVJDRVMpOiBMaWtld2lzZS4KKwkqIHN0YWdlMS9zdGFnZTEuUzogUmV3cml0dGVuIGZyb20gc2NyYXRjaC4KKwkqIHN0YWdlMS9zdGFnZTFfbGJhLlM6IERlbGV0ZWQuCisJKiBzdGFnZTEvc3RhZ2UxLmggKENPTVBBVF9WRVJTSU9OX01BSk9SKTogU2V0IHRvIDMuCisJKENPTVBBVF9WRVJTSU9OX01JTk9SKTogU2V0IHRvIDAuCisJKFNUQUdFMV9WRVJfTUFKX09GRlMpOiBTZXQgdG8gMHgzZS4KKwkoU1RBR0UxX0ZJUlNUTElTVCk6IERlbGV0ZWQuCisJKFNUQUdFMV9JTlNUQUxMU0VHKTogTGlrZXdpc2UuCisJKFNUQUdFMV9JTlNUQUxMQUREUik6IExpa2V3aXNlLgorCShTVEFHRTFfTUlOUEFSQU1TSVpFKTogTGlrZXdpc2UuCisJKFNUQUdFMV9MSVNUU0laRSk6IExpa2V3aXNlLgorCShTVEFHRTFfSURfT0ZGU0VUKTogTGlrZXdpc2UuCisJKFNUQUdFMV9JRF9DSFMpOiBMaWtld2lzZS4KKwkoU1RBR0UxX0lEX0xCQSk6IExpa2V3aXNlLgorCShTVEFHRTFfU1RBR0UyX1NFQ1RPUik6IE5ldyBtYWNyby4KKwkoU1RBR0UxX1NUQUdFMl9BRERSRVNTKTogTGlrZXdpc2UuCisJKFNUQUdFMV9TVEFHRTJfU0VHTUVOVCk6IExpa2V3aXNlLgorCShTVEFHRTFfQk9PVF9EUklWRSk6IExpa2V3aXNlLgorCSogc3RhZ2UyL3N0YXJ0LlM6IE5ldyBmaWxlLgorCSogc3RhZ2UyL01ha2VmaWxlLmFtIChub2luc3RfREFUQSk6IE5ldyB2YXJpYWJsZS4KKwkoQ0xFQU5GSUxFUyk6IFNldCB0byAiJChub2Rpc3RfcGtnZGF0YV9EQVRBKSAkKG5vaW5zdF9EQVRBKQorCSQoQlVJTFRfU09VUkNFUykiLgorCShub2luc3RfUFJPR1JBTVMpOiBSZW1vdmVkIHN0YWdlMi5leGVjLCBhbmQgYWRkZWQgc3RhcnQuZXhlYyBhbmQKKwlwcmVfc3RhZ2UyLmV4ZWMuCisJKFNUQUdFMl9MSU5LKTogRGVsZXRlZC4KKwkoUFJFX1NUQUdFMl9MSU5LKTogTmV3IHZhcmlhYmxlLgorCShTVEFSVF9MSU5LKTogTGlrZXdpc2UuCisJKHN0YWdlMl9leGVjX1NPVVJDRVMpOiBEZWxldGVkLgorCShzdGFnZTJfZXhlY19DRkxBR1MpOiBMaWtld2lzZS4KKwkoc3RhZ2UyX2V4ZWNfTERGTEFHUyk6IExpa2V3aXNlLgorCVtORVRCT09UX1NVUFBPUlRdIChzdGFnZTJfZXhlY19MREFERCk6IExpa2V3aXNlLgorCShwcmVfc3RhZ2UyX2V4ZWNfU09VUkNFUyk6IE5ldyB2YXJpYWJsZS4KKwkocHJlX3N0YWdlMl9leGVjX0NGTEFHUyk6IExpa2V3aXNlLgorCShwcmVfc3RhZ2UyX2V4ZWNfTERGTEFHUyk6IExpa2V3aXNlLgorCVtORVRCT09UX1NVUFBPUlRdIChwcmVfc3RhZ2UyX2V4ZWNfTERBREQpOiBMaWtld2lzZS4KKwkoQlVJTFRfU09VUkNFUyk6IExpa2V3aXNlLgorCShzdGFydF9leGVjX1NPVVJDRVMpOiBMaWtld2lzZS4KKwkoc3RhcnRfZXhlY19DRkxBR1MpOiBMaWtld2lzZS4KKwkoc3RhcnRfZXhlY19MREZMQUdTKTogTGlrZXdpc2UuCisJKHN0YXJ0X2V4ZWNfREVQRU5ERU5DSUVTKTogTGlrZXdpc2UuCisJKHN0YWdlMl9zaXplLmgpOiBOZXcgcnVsZS4KKwkoc3RhZ2UyKTogTGlrZXdpc2UuCisJKGUyZnNfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTKTogQWRkZWQgc3RhcnQuUy4KKwkoZmF0X3N0YWdlMV81X2V4ZWNfU09VUkNFUyk6IExpa2V3aXNlLgorCShmZnNfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTKTogTGlrZXdpc2UuCisJKG1pbml4X3N0YWdlMV81X2V4ZWNfU09VUkNFUyk6IExpa2V3aXNlLgorCSogc3RhZ2UyL2FzbS5TIChzdGFydCk6IFJlbmFtZWQgdG8gLi4uCisJKG1haW4pOiAuLi4gdGhpcy4KKwlbU1RBR0UxXzVdIChtYWluKTogSnVtcCB0byAoY29kZXN0YXJ0IC0gRVhUX0MobWFpbikgKyAweDIyMDApCisJaW5zdGVhZCBvZiAoY29kZXN0YXJ0IC0gRVhUX0Moc3RhcnQpICsgMHgyMDAwKS4KKwlbIVNUQUdFMV81XSAobWFpbik6IEp1bXAgdG8gKGNvZGVzdGFydCAtIEVYVF9DKG1haW4pICsgMHg4MjAwKQorCWluc3RlYWQgb2YgKGNvZGVzdGFydCAtIEVYVF9DKHN0YXJ0KSArIDB4ODAwMCkuCisJW1NUQUdFMV81XSAoY2hhaW5fc3RhZ2UyKTogVXNlIG1haW4gaW5zdGVhZCBvZiBzdGFydC4KKwkqIHN0YWdlMi9zaGFyZWQuaCAoQk9PVFNFQ19MSVNUU0laRSk6IE5ldyBtYWNyby4KKwkqIHN0YWdlMi9zdGFnZTFfNS5jOiBDaGFuZ2UgdGhlIHNlY29uZCBhcmd1bWVudCBmb3IgY2hhaW5fc3RhZ2UyCisJdG8gMHg4MjAwLgorCisxOTk5LTEwLTA4ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBjb25maWd1cmUuaW4gKC0td2l0aC1iaW51dGlscyk6IE5ldyBvcHRpb24gdG8gc3BlY2lmeSBhCisJZGlyZWN0b3J5IHRvIGZpbmQgYmludXRpbHMuCisJKENGTEFHUyk6IElmIFdJVEhfQklOVVRJTFMgaXMgbm90IGVtcHR5LCBhZGRlZCB0aGUgb3B0aW9uIGAtQicuCisJKExEKTogRG8gbm90IGNoZWNrIGZvciB0aGlzLiBXZSBkb24ndCB1c2UgbGQgZGlyZWN0bHkgYW55d2F5LgorCShSQU5MSUIpOiBJZiBXSVRIX0JJTlVUSUxTIGlzIG5vdCBlbXB0eSwgc2VhcmNoIHRoZSBkaXJlY3RvcnkKKwlXSVRIX0JJTlVUSUxTIGZpcnN0LgorCShPQkpDT1BZKTogTGlrZXdpc2UuCisJKiBhY2luY2x1ZGUubTQgKGdydWJfQVNNX1VTQ09SRSk6IEFkZCBDRkxBR1MgaW50bworCUFDX1RSWV9DT01NQU5ELgorCShncnViX0FTTV9BRERSMzIpOiBMaWtld2lzZS4KKwkoZ3J1Yl9BU01fUFJFRklYX1JFUVVJUkVNRU5UKTogTGlrZXdpc2UuCisJKGdydWJfUFJPR19PQkpDT1BZX0FCU09MVVRFKTogVXNlIENDIGluc3RlYWQgb2YgTEQuCisKKzE5OTktMTAtMDQgIFBhdmVsIFJvc2tpbiAgPHBhdmVsX3Jvc2tpbkBnZW9jaXRpZXMuY29tPgorCisJKiBzdGFnZTIvZnJlZWJzZC5oIChzdHJ1Y3QgYm9vdGluZm8pOiBOZXcgbWVtYmVyLCBiaV9iaW9zX2Rldi4KKwkqIHN0YWdlMi9ib290LmMgKGJzZF9ib290KTogU2V0IEJJLkJJX0JJT1NfREVWIHRvIFNBVkVEX0RSSVZFLgorCisxOTk5LTEwLTA0ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJRnJvbSBQYXZlbCBSb3NraW46CisJKiBkb2NzL2dydWIudGV4aTogRml4IHR5cG9zLgorCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGluc3RhbGxfZnVuYyk6IFJlZm9ybWF0IHRoZSB3YXJuaW5nIG1lc3NhZ2UKKwlhYm91dCB0aGUgb3B0aW9uIGBkJy4KKworMTk5OS0xMC0wMyAgR29yZG9uIE1hdHppZ2tlaXQgIDxnb3JkQGZpZy5vcmc+CisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChpbnN0YWxsX2Z1bmMpOiBGaXggY2hlY2sgZm9yIHRoZSBTdGFnZSAyIGlkLgorCUZyb20gUGF2ZWwgUm9za2luLgorCisJKiBkZWJpYW4vTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgcG9zdGluc3QgYW5kIHByZXJtLgorCisxOTk5LTEwLTAzICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoYm9vdF9mdW5jKTogUGFzcyBNQkkuQ01ETElORSBpbnN0ZWFkIG9mIEFSRworCXRvIGJzZF9ib290LgorCisxOTk5LTEwLTAzICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBzdGFnZTIvZ3VuemlwLmMgKGd1bnppcF90ZXN0X2hlYWRlcik6IENoZWNrIGlmIENVUlJFTlRfRFJJVkUKKwlpcyAweDIwIGluc3RlYWQgb2YgaWYgdGhlIGZzIHR5cGUgaXMgVEZUUCwgYmVjYXVzZSBHUlVCIGRvZXMgbm90CisJbW91bnQgQ1VSUkVOVF9EUklWRSB3aGVuIHVzaW5nIGEgYmxvY2sgZmlsZS4gUmVwb3J0ZWQgYnkgUGF2ZWwKKwlSb3NraW4uCisKKzE5OTktMTAtMDIgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChjYXRfZnVuYyk6IERvIG5vdCByZWFkIHRoZSB3aG9sZSBvZiBhIGZpbGUKKwlhdCBvbmUgdGltZS4gSW5zdGVhZCwgcmVwZWF0IHJlYWRpbmcgb25lIGJ5dGUgYW5kIHByaW50IGl0IG9uCisJdGhlIHNjcmVlbi4KKwkqIGRvY3MvZ3J1Yi50ZXhpIChDb21tYW5kIGxpbmUpOiBMaXN0IHRoZSBhdmFpbGFibGUga2V5CisJYmluZGluZ3MuCisJKENvbW1hbmRzKTogQWRkZWQgZGVzY3JpcHRpb25zIGFib3V0ICJnZW9tZXRyeSIsICJkZXZpY2UiIGFuZAorCSJjYXQiLgorCisxOTk5LTEwLTAyICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJTm93IGl0IGlzIHBvc3NpYmxlIHRvIGJ1aWxkIHRoZSBncnViIHNoZWxsIHdpdGggb2xkIEJTRCBjdXJzZXMuCisKKwkqIHN0YWdlMi9zaGFyZWQuaCBbIUFfTk9STUFMXSAoQV9OT1JNQUwpOiBTZXQgdG8gemVyby4KKwlbIUFfUkVWRVJTRSAmJiBBX1NUQU5ET1VUXSAoQV9SRVZFUlNFKTogU2V0IHRvIEFfU1RBTkRPVVQuCisJWyFBX1JFVkVSU0UgJiYgIUFfU1RBTkRPVVRdIChBX1JFVkVSU0UpOiBTZXQgdG8gemVyby4KKworMTk5OS0wOS0zMCAgUGF2ZWwgUm9za2luICA8cGF2ZWxfcm9za2luQGdlb2NpdGllcy5jb20+CisKKwkqIHN0YWdlMi9kaXNrX2lvLmMgKHNldF9ib290ZGV2KTogTWFzayAweDdGIGluc3RlYWQgb2YgMHg3OSBvZgorCXRoZSBkZXZpY2UgbnVtYmVyLgorCisxOTk5LTEwLTAxICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBjb25maWd1cmUuaW4gKC0td2l0aG91dC1jdXJzZXMpOiBOZXcgb3B0aW9uLiBJZiBXSVRIX0NVUlNFUyBpcworCW5vLCBkbyBub3QgY2hlY2sgZm9yIGN1cnNlcy4KKworCSogc3RhZ2UyL2Rpc2tfaW8uYyAoc2V0X2RldmljZSkgW1NUQUdFMV81XTogQ2hhbmdlIHRoZSB0eXBlIG9mCisJREVWIHRvIHVuc2lnbmVkIGxvbmcuCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoaW5zdGFsbF9mdW5jKTogQWx3YXlzIGNoZWNrIGZvciB0aGUgU3RhZ2UgMgorCWlkIGluIEZJTEUuCisJUmVwb3J0ZWQgYnkgUGF2ZWwgUm9za2luLgorCisxOTk5LTA5LTMwICBHb3Jkb24gTWF0emlna2VpdCAgPGdvcmRAZmlnLm9yZz4KKworCSogZGViaWFuL3Bvc3RpbnN0OiBOZXcgZmlsZSB0byBjYWxsIGluc3RhbGwtaW5mby4KKwkqIGRlYmlhbi9wcmVybTogTGlrZXdpc2UuCisJKiBkZWJpYW4vcnVsZXMgKGJpbmFyeS1hcmNoKTogQWRkIHBvc3RpbnN0IGFuZCBwcmVybSwgY29tcHJlc3MgdGhlCisJaW5mbyBmaWxlcywgYW5kIGNhbGwgZHBrZy1zaGxpYmRlcHMuCisKKwkqIHN0YWdlMi9jbWRsaW5lLmMgKHNraXBfdG8pOiBSZXN0cnVjdHVyZSwgYW5kIGNvdW50IHRhYnMgYXMKKwl3aGl0ZXNwYWNlLgorCShmaW5kX2NvbW1hbmQpOiBMaWtld2lzZS4KKworMTk5OS0wOS0zMCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogZ3J1Yi9nZXRvcHQuYzogTW92ZWQgdG8gLi4uCisJKiBsaWIvZ2V0b3B0LmM6IC4uLiBoZXJlLgorCSogZ3J1Yi9nZXRvcHQxLmM6IE1vdmVkIHRvIC4uLgorCSogbGliL2dldG9wdDEuYzogLi4uIGhlcmUuCisJKiBncnViL2dldG9wdC5oOiBNb3ZlZCB0byAuLi4KKwkqIGxpYi9nZXRvcHQuaDogLi4uIGhlcmUuCisJKiBncnViL01ha2VmaWxlLmFtIChBTV9DRkxBR1MpOiBBZGRlZCAtSSQodG9wX3NyY2RpcikvbGliLgorCShncnViX0xEQUREKTogQWRkZWQgLi4vbGliL2xpYmNvbW1vbi5hLgorCSogbGliL01ha2VmaWxlLmFtOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmFtIChTVUJESVJTKTogQWRkZWQgbGliLgorCSogY29uZmlndXJlLmluOiBsaWIvTWFrZWZpbGUgaXMgYWRkZWQgaW50byB0aGUgYXJndW1lbnRzIGZvcgorCUFDX09VVFBVVC4KKworMTk5OS0wOS0zMCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCUZyb20gUGF2ZWwgUm9za2luOgorCSogc3RhZ2UyL2RlZnMuaCAodGltZV90KTogUmVuYW1lZCB0byAuLi4KKwkobWFjaF90aW1lX3QpOiAuLi4gdGhpcy4KKwkoZGFkZHJfdCk6IFJlbmFtZWQgdG8gLi4uCisJKG1hY2hfZGFkZHJfdCk6IC4uLiB0aGlzLgorCSh1aWRfdCk6IFJlbmFtZWQgdG8gLi4uCisJKG1hY2hfdWlkX3QpOiAuLi4gdGhpcy4KKwkoZ2lkX3QpOiBSZW5hbWVkIHRvIC4uLgorCShtYWNoX2dpZF90KTogLi4uIHRoaXMuCisJKGlub190KTogUmVuYW1lZCB0byAuLi4KKwkobWFjaF9pbm9fdCk6IC4uLiB0aGlzLgorCSogc3RhZ2UyL2Rpc2tfaW5vZGUuaCAoRkZTX01BWF9GQVNUTElOS19TSVpFKTogVXNlIG1hY2hfZGFkZHJfdAorCWluc3RlYWQgb2YgZGFkZHJfdC4KKwkoc3RydWN0IGljb21tb24pOiBVc2UgbWFjaF91aWRfdCwgbWFjaF9naWRfdCwgbWFjaF90aW1lX3QgYW5kCisJbWFjaF9kYWRkcl90LCBpbnN0ZWFkIG9mIHVpZF90LCBnaWRfdCwgdGltZV90IGFuZCBkYWRkcl90LgorCSogc3RhZ2UyL2ZzLmggKEJCTE9DSyk6IFVzZSBtYWNoX2RhZGRyX3QgaW5zdGVhZCBvZiBhZGRyX3QuCisJKFNCTE9DSyk6IExpa2V3aXNlLgorCShST09USU5PKTogVXNlIG1hY2hfaW5vX3QgaW5zdGVhZCBvZiBpbm9fdC4KKwkoc3RydWN0IGZzKTogVXNlIG1hY2hfZGFkZHJfdCBhbmQgbWFjaF90aW1lX3QgaW5zdGVhZCBvZiBkYWRkcl90CisJYW5kIHRpbWVfdC4KKwkoc3RydWN0IGNnKTogVXNlIG1hY2hfdGltZV90IGluc3RlYWQgb2YgdGltZV90LgorCShzdHJ1Y3Qgb2NnKTogTGlrZXdpc2UuCisJKGNnYmFzZSk6IFVzZSBtYWNoX2RhZGRyX3QgaW5zdGVhZCBvZiBkYWRkcl90LgorCShpdG9kKTogTGlrZXdpc2UuCisKKzE5OTktMDktMzAgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIGFjaW5jbHVkZS5tNCAoZ3J1Yl9DSEVDS19TVEFSVF9TWU1CT0wpOiBVc2UgQUNfVFJZX0xJTksKKwlpbnN0ZWFkIG9mIEFDX1RSWV9DT01NQU5ELgorCShncnViX0NIRUNLX1VTQ09SRV9TVEFSVF9TWU1CT0wpOiBMaWtld2lzZS4KKwkoZ3J1Yl9DSEVDS19FTkRfU1lNQk9MKTogTGlrZXdpc2UuCisJKGdydWJfQ0hFQ0tfVVNDT1JFX0VORF9TWU1CT0wpOiBMaWtld2lzZS4KKworCSogc3RhZ2UyL2Rpc2tfaW8uYyAoc2V0X2RldmljZSkgWyFTVEFHRTFfNV06IFVzZSBSRVNVTFQgaW5zdGVhZAorCW9mIFJFVFZBTCB0byBjaGVjayBpZiB0aGUgYW5hbHlzaXMgc3VjY2VlZHMuCisKKzE5OTktMDktMjkgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChpbnN0YWxsX2Z1bmMpOiBJZiB0aGUgU3RhZ2UgMiBpZCBpbiBGSUxFIGlzCisJbm90IFNUQUdFMl9JRF9TVEFHRTIsIHNldCBJU19TVEFHRTFfNSB0byAxLCBvdGhlcndpc2UgdG8gMC4KKwlVc2UgQ09ORklHX0ZJTEVfTE9DQVRJT04gdG8gcG9pbnQgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBuYW1lIG9mCisJYSBjb25maWd1cmF0aW9uIGZpbGUgaW4gU3RhZ2UgMi4KKwlJZiB0aGUgb3B0aW9uIGBwJyBpcyBwcmVzZW50IGFuZCBJU19TVEFHRTFfNSBpcyBub24temVybywgcmVzZXQKKwl0aGUgZGV2aWNlIGluZm9ybWF0aW9uIGluIENPTkZJR19GSUxFX0xPQ0FUSU9OLgorCShjYXRfZnVuYyk6IE5ldyBmdW5jdGlvbi4KKwkoYnVpbHRpbl9jYXQpOiBOZXcgdmFyaWFibGUuCisJKGJ1aWx0aW5fdGFibGUpOiBBZGRlZCBhIHBvaW50ZXIgdG8gQlVJTFRJTl9DQVQuCisJKGdlb21ldHJ5X2Z1bmMpOiBDYWxsIHJlYWxfb3Blbl9wYXJ0aXRpb24gd2l0aCB0aGUgYXJndW1lbnQgMQorCWFmdGVyIHByaW50aW5nIG91dCB0aGUgZHJpdmUgaW5mb3JtYXRpb24uCisJKiBzdGFnZTIvZGlza19pby5jIChyZWFsX29wZW5fcGFydGl0aW9uKTogTWFkZSBnbG9iYWwuCisJWyFTVEFHRTFfNV0gKHByaW50X2NvbXBsZXRpb25zKTogSW4gdGhlIGNvbW1hbmQgY29tcGxldGlvbiBhbmQKKwl0aGUgZmlsZW5hbWUgY29tcGxldGlvbiwgcHJpbnQgYSBuZXdsaW5lIGF0IHRoZSBsYXN0IGlmCisJSVNfQ09NUExFVElPTiBpcyB6ZXJvLgorCSogc3RhZ2UyL3NoYXJlZC5oIChyZWFsX29wZW5fcGFydGl0aW9uKTogRGVjbGFyZWQuCisJKiBzdGFnZTIvZnN5c19leHQyZnMuYyAoZXh0MmZzX2Rpcik6IERvIG5vdCBwcmludCBhIG5ld2xpbmUgZXZlbgorCWlmIFBSSU5UX1BPU1NJQklMSVRJRVMgaXMgbGVzcyB0aGFuIHplcm8uCisJKiBzdGFnZTIvZnN5c19mZnMuYyAoZmZzX2Rpcik6IExpa2V3aXNlLgorCSogc3RhZ2UyL2ZzeXNfZmF0LmMgKGZhdF9kaXIpOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9mc3lzX21pbml4LmMgKG1pbml4X2Rpcik6IExpa2V3aXNlLgorCisxOTk5LTA5LTI5ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBzdGFnZTEvc3RhZ2UxLlMgWyFGRlNfU1RBR0UxXzVdIChibG9ja2xpc3RfZGVmYXVsdF9sZW4pOiBEbworCW5vdCBkaXZpZGUgdGhlIHNpemUgYnkgNTEyLCBidXQgc2hpZnQgdGhlIHNpemUgdG8gdGhlIHJpZ2h0IGJ5CisJOSBpbnN0ZWFkLCBiZWNhdXNlIG9mIGEgYmludXRpbHMtMi45LjEuMC54IGJ1Zy4KKwkqIHN0YWdlMS9zdGFnZTFfbGJhLlMgWyFGRlNfU1RBR0UxXzVdIChibG9ja2xpc3RfZGVmYXVsdF9sZW4pOgorCUxpa2V3aXNlLgorCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGluc3RhbGxfZnVuYyk6IFdoZW4gaW5zdGFsbGluZyBTdGFnZSAxLjUsCisJaWYgc2V0X2RldmljZSByZXR1cm5zIE5VTEwsIHRoZW4gc2V0IENVUlJFTlRfRFJJVkUgdG8gMHhGRiBhbmQKKwlDT05GSUdfRklMRSB0byBQVFIuCisKKzE5OTktMDktMjYgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHN0YWdlMi9jaGFyX2lvLmMgWyFTVEFHRTFfNV0gKGdldF9jbWRsaW5lKTogSW4gY2xfaW5zZXJ0LCBjYWxsCisJY2xfc2V0Y3BvcyBiZWZvcmUgcHJpbnRpbmcgQlVGLCBldmVuIGlmIExQT1MgaXMgZXF1YWwgdG8gTExFTi4KKwlJbiB0aGUgY29tcGxldGlvbiwgaWYgUkVUIGlzIHplcm8sIGRvIG5vdCBjYWxsIGNsX2luaXQuCisJKiBzdGFnZTIvZGlza19pby5jIFshU1RBR0UxXzVdIChwcmludF9jb21wbGV0aW9ucyk6IEluIHRoZQorCWZpbGVuYW1lIGNvbXBsZXRpb24sIGlmIFVOSVFVRSBpcyAxLCBjaGVjayBpZiBVTklRVUVfU1RSSU5HIGlzIGEKKwlkaXJlY3Rvcnkgb3Igbm90LiBJZiBzbywgYXBwZW5kICcvJyB0byBCVUYuCisJSW4gdGhlIHBhcnRpdGlvbiBjb21wbGV0aW9uLCBpZiBJU19DT01QTEVUSU9OIGlzIG5vbi16ZXJvIGFuZAorCSpVTklRVUVfU1RSSU5HIGlzIG5vdCBOVUwsIGNvcHkgVU5JUVVFX1NUUklORyB0byBQVFIuIERvIG5vdAorCWFwcGVuZCAnLycuCisJKHJlYWxfb3Blbl9wYXJ0aXRpb24pIFshU1RBR0UxXzVdOiBJZiBET19DT01QUkVTU0lPTiBpcyBub24temVybywKKwljYWxsIHByaW50X2FfY29tcGxldGlvbi4KKwkoY2hlY2tfQlNEX3BhcnRzKSBbIVNUQUdFMV81XTogTGlrZXdpc2UuCisJWyFTVEFHRTFfNV0gKHByaW50X2FfY29tcGxldGlvbik6IElnbm9yZSBOQU1FIGlmIGl0IGlzICIuIiBvcgorCSIuLiIuCisKKzE5OTktMDktMjUgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIGFjaW5jbHVkZS5tNCAoZ3J1Yl9DSEVDS19VU0NPUkVfRU5EX1NZTUJPTCk6IERvIG5vdCBjYWxsCisJQUNfREVGSU5FIHdpdGhpbiBBQ19DQUNIRV9WQUwuIENhbGwgaXQgYWZ0ZXIgQUNfQ0FDSEVfVkFMLgorCSogc3RhZ2UyL01ha2VmaWxlLmFtIChTVEFHRTFfNV9DT01QSUxFKTogRG8gbm90IGRlZmluZQorCUNPTkZJR19GSUxFX0FTTS4KKwkqIHN0YWdlMi9hc20uUyAoY29uZmlnX2ZpbGUpIFtTVEFHRTFfNV06IFNldCB0aGUgZmlyc3QgNCBieXRlcworCXRvIDB4ZmZmZmZmZmYgYW5kIHRoZSBmb2xsb3dpbmcgdG8gIi9ib290L2dydWIvc3RhZ2UyIi4KKwkoY29uZmlnX2ZpbGUpIFshU1RBR0UxXzVdOiBTZXQgdG8gIi9ib290L2dydWIvbWVudS5sc3QiLgorCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGluc3RhbGxfZnVuYyk6IFJlYWQgYSBTdGFnZSAyIGJlZm9yZQorCWhhbmRsaW5nIHRoZSBgcCcgb3B0aW9uLgorCUlmIHRoZSBgY29uZmlnZmlsZScgb3B0aW9uIGlzIHByZXNlbnQgYW5kIEZJTEUgaXMgYSBTdGFnZSAyLAorCXRyYW5zbGF0ZSB0aGUgZGV2aWNlIG5hbWUgdG8gdGhlIGludGVybmFsIGRldmljZSByZXByZXNlbnRhdGlvbgorCWFuZCBjb3B5IHRoZSByZXN1bHQgdG8gU1RSLgorCSogc3RhZ2UyL2Rpc2tfaW8uYyBbU1RBR0UxXzVdIChzYW5lX3BhcnRpdGlvbik6IEVsaW1pbmF0ZWQuCisJW1NUQUdFMV81XSAoaW5jb21wbGV0ZSk6IExpa2V3aXNlLgorCVtTVEFHRTFfNV0gKGRpc2tfY2hvaWNlKTogTGlrZXdpc2UuCisJW1NUQUdFMV81XSAocGFydF9jaG9pY2UpOiBMaWtld2lzZS4KKwkoc2V0X2RldmljZSkgW1NUQUdFMV81XTogQXNzdW1lIHRoYXQgdGhlIGZpcnN0IDQgYnl0ZXMgb2YgREVWSUNFCisJaXMgYSBkZXZpY2UgbnVtYmVyLiBTZXQgRFJJVkUgdG8gdGhlIGZvcnRoIGJ5dGUgb2YgREVWIGFuZAorCVBBUlRJVElPTiB0byB0aGUgZmlyc3QgMyBieXRlcyBvZiBERVYuIElmIERSSVZFIGlzIDB4RkYsIHNldAorCUNVUlJFTlRfRFJJVkUgYW5kIENVUlJFTlRfUEFSVElUSU9OIHRvIFNBVkVEX0RSSVZFIGFuZAorCVNBVkVEX1BBUlRJVElPTiwgcmVzcGVjdGl2ZWx5LiBPdGhlcndpc2Ugc2V0IHRvIERSSVZFIGFuZAorCVBBUlRJVElPTiwgcmVzcGVjdGl2ZWx5LgorCShzZXR1cF9wYXJ0KSBbU1RBR0UxXzVdOiBBbHdheXMgY2FsbCBzZXRfZGV2aWNlLgorCisxOTk5LTA5LTI0ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBhY2luY2x1ZGUubTQgKGdydWJfQ0hFQ0tfRU5EX1NZTUJPTCk6IEFkZCBhIG1pc3NpbmcKKwlkb3VibGUtcXVvdGUuIFJlcG9ydGVkIGJ5IEpvaGFubmVzIEtyb2VnZXIKKwk8aGFubmVAc3F1aXJyZWwub3dsLmRlPi4KKworMTk5OS0wOS0xNCAgR29yZG9uIE1hdHppZ2tlaXQgIDxnb3JkQGZpZy5vcmc+CisKKwkqIHN0YWdlMS9zdGFnZTEuUyAoYmxvY2tsaXN0X2RlZmF1bHRfc3RhcnQpOiBOZXcgbGFiZWwgZm9yIGRlZmF1bHQKKwlibG9ja2xpc3Qgc3RhcnQgc2VjdG9yLgorCShibG9ja2xpc3RfZGVmYXVsdF9sZW4pOiBOZXcgbGFiZWwgZm9yIGRlZmF1bHQgYmxvY2tsaXN0IGxlbmd0aC4KKwkoYmxvY2tsaXN0X2RlZmF1bHRfc2VnKTogTmV3IGxhYmVsIGZvciBkZWZhdWx0IGJsb2NrbGlzdCBzZWdtZW50LgorCSogc3RhZ2UxL3N0YWdlMV9sYmEuUyAoYmxvY2tsaXN0X2RlZmF1bHRfc3RhcnQpOiBMaWtld2lzZS4KKwkoYmxvY2tsaXN0X2RlZmF1bHRfbGVuKTogTGlrZXdpc2UuCisJKGJsb2NrbGlzdF9kZWZhdWx0X3NlZyk6IExpa2V3aXNlLgorCisxOTk5LTA5LTIzICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBhY2luY2x1ZGUubTQgKGdydWJfQVNNX0FERFIzMik6IEZpcnN0LCBjcmVhdGUgYSB0ZW1wbGF0ZQorCXNvdXJjZSBmaWxlICJjb25mdGVzdC5zLmluIiwgYW5kIHRoZW4sIHJlcGxhY2UgQEFERFIzMkAgd2l0aAorCSJhZGRyMzIiIGlmIEdSVUJfQ1ZfQVNNX1BSRUZJWF9SRVFVSVJFTUVOVCBpcyB5ZXMsIG90aGVyd2lzZSwKKwlyZXBsYWNlIGl0IHdpdGggImFkZHIzMjsiLiBSZXBvcnRlZCBieSBKb2huIFRvYmV5CisJPHNwYW1Aam9obi1lZHdpbi10b2JleS5vcmc+LgorCisxOTk5LTA5LTIzICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoZGVidWdfZnNfcHJpbnRfZnVuYyk6IFJlbmFtZWQgdG8gLi4uCisJKGRpc2tfcmVhZF9wcmludF9mdW5jKTogLi4uIHRoaXMuCisJKGZzdGVzdF9mdW5jKTogVXNlIERJU0tfUkVBRF9IT09LIGluc3RlYWQgb2YgREVCVUdfRlMuCisJKGluc3RhbGxfZnVuYyk6IFJlbmFtZSBkZWJ1Z19mc19zYXZlc2VjdF9mdW5jIHRvCisJZGlza19yZWFkX3NhdmVzZWN0X2Z1bmMuCisJUmVuYW1lIGRlYnVnX2ZzX2Jsb2NrbGlzdF9mdW5jIHRvIGRpc2tfcmVhZF9ibG9ja2xpc3RfZnVuYy4KKwlVc2UgRElTS19SRUFEX0hPT0sgaW5zdGVhZCBvZiBERUJVR19GUy4KKwkodGVzdGxvYWRfZnVuYyk6IFVzZSBESVNLX1JFQURfSE9PSyBpbnN0ZWFkIG9mIERFQlVHX0ZTLgorCSogc3RhZ2UyL2Rpc2tfaW8uYyBbIVNUQUdFMV81XSAoZGVidWdfZnMpOiBSZW5hbWVkIHRvIC4uLgorCVshU1RBR0UxXzVdIChkaXNrX3JlYWRfaG9vayk6IC4uLiB0aGlzLgorCVshU1RBR0UxXzVdIChkZWJ1Z19mc19mdW5jKTogUmVuYW1lZCB0byAuLi4KKwlbIVNUQUdFMV81XSAoZGlza19yZWFkX2Z1bmMpOiAuLi4gdGhpcy4KKwkocmF3cmVhZCkgWyFTVEFHRTFfNV06IFVzZSBESVNLX1JFQURfSE9PSyBhbmQgRElTS19SRUFEX0ZVTkMKKwlpbnN0ZWFkCW9mIERFQlVHX0ZTIGFuZCBERUJVR19GU19GVU5DLgorCShncnViX3JlYWQpIFshU1RBR0UxXzVdOiBMaWtld2lzZS4KKwkoZGV2cmVhZCkgWyFTVEFHRTFfNV06IFVzZSBESVNLX1JFQURfSE9PSyBpbnN0ZWFkIG9mIERFQlVHX0ZTLgorCSogc3RhZ2UyL2ZzeXNfZXh0MmZzLmMgKGV4dDJmc19yZWFkKSBbIVNUQUdFMV81XTogVXNlCisJRElTS19SRUFEX0hPT0sgYW5kIERJU0tfUkVBRF9GVU5DIGluc3RlYWQgb2YgREVCVUdfRlMgYW5kCisJREVCVUdfRlNfRlVOQy4KKwkqIHN0YWdlMi9mc3lzX2Zmcy5jIChmZnNfcmVhZCkgWyFTVEFHRTFfNV06IExpa2V3aXNlLgorCSogc3RhZ2UyL2ZzeXNfbWluaXguYyAobWluaXhfcmVhZCkgWyFTVEFHRTFfNV06IExpa2V3aXNlLgorCSogc3RhZ2UyL3NoYXJlZC5oIFshU1RBR0UxXzVdIChkZWJ1Z19mcyk6IFJlbmFtZWQgdG8gLi4uCisJWyFTVEFHRTFfNV0gKGRpc2tfcmVhZF9ob29rKTogLi4uIHRoaXMuCisJWyFTVEFHRTFfNV0gKGRlYnVnX2ZzX2Z1bmMpOiBSZW5hbWVkIHRvIC4uLgorCVshU1RBR0UxXzVdIChkaXNrX3JlYWRfZnVuYyk6IC4uLiB0aGlzLgorCSogZG9jcy9ncnViLnRleGk6IExpa2V3aXNlLCByZXBsYWNlIGRlYnVnX2ZzIGFuZCBkZWJ1Z19mc19mdW5jCisJd2l0aCBkaXNrX3JlYWRfaG9vayBhbmQgZGlza19yZWFkX2Z1bmMsIHJlc3BlY3RpdmVseS4KKworMTk5OS0wOS0yMyAgUGF2ZWwgUm9za2luICA8cGF2ZWxfcm9za2luQGdlb2NpdGllcy5jb20+CisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChpbnN0YWxsX2Z1bmMpOiBOZXcgbG9jYWwgZnVuY3Rpb24sCisJZGVidWdfZnNfc2F2ZXNlY3RfZnVuYy4gVXNlIGRlYnVnX2ZzX3NhdmVzZWN0X2Z1bmMgdG8gZGV0ZXJtaW5lCisJdGhlIGZpcnN0IHNlY3RvciBvZiBTdGFnZTIuIFdyaXRlIFN0YWdlIDEgYWZ0ZXIgcGF0Y2hpbmcgU3RhZ2UKKwkyLgorCisxOTk5LTA5LTIyICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBhY2luY2x1ZGUubTQgKGdydWJfQVNNX1VTQ09SRSk6IERvIG5vdCBkZWZpbmUgSEFWRV9BU01fVVNDT1JFCisJd2l0aGluIEFDX0NBQ0hFX1ZBTC4gRGVmaW5lIGl0IGFmdGVyIEFDX0NBQ0hFX1ZBTCBpZgorCUdSVUJfQ1ZfQVNNX1VTQ09SRSBpcyB5ZXMuCisKKzE5OTktMDktMjAgIEVkbXVuZCBHUklNTEVZIEVWQU5TICA8ZWRtdW5kb0ByYW5vLmRlbW9uLmNvLnVrPgorCisJKiBuZXRib290LzNjNTl4LmM6IElOQ0xVREVfM2M1OXggaXMgcmVwbGFjZWQgYnkgSU5DTFVERV8zQzU5WAorIAl0aHJvdWdob3V0LgorCSogbmV0Ym9vdC9jb25maWcuYzogTGlrZXdpc2UuCisJKiBuZXRib290L2lvLmggKF9fSU5TKTogTmV3IG1hY3JvLgorCShfX09VVFMpOiBMaWtld2lzZS4KKwkob3V0bCk6IExpa2V3aXNlLgorCShpbmwpOiBMaWtld2lzZS4KKwkob3V0bF9wKTogTGlrZXdpc2UuCisJKGlubF9wKTogTGlrZXdpc2UuCisJQ2FsbCBfX0lOUyB3aXRoIHRoZSBhcmd1bWVudCBgYicsIHdpdGggYHcnIGFuZCB3aXRoIGBsJyB0bworCWRlZmluZSBpbnNiLCBpbnN3IGFuZCBpbnNsLCByZXNwZWN0aXZlbHkuIExpa2V3aXNlLCBDYWxsIF9fT1VUUworCXdpdGggYGInLCB3aXRoIGB3JyBhbmQgd2l0aCBgbCcgdG8gZGVmaW5lIG91dHNiLCBvdXR3IGFuZCBvdXRsLAorCXJlc3BlY3RpdmVseS4KKwkqIG5ldGJvb3QvcGNpLmggKFBDSV9WRU5ET1JfSURfVk9SVEVYKTogTmV3IG1hY3JvLgorIAkoUENJX0RFVklDRV9JRF9WT1JURVhfM2M1OTUpOiBMaWtld2lzZS4gRGVmaW5lZCBhcyBhIHJhbmRvbQorCXZhbHVlLgorCisxOTk5LTA5LTIwICBFZHdhcmQgS2lsbGlwcyAgPGVraWxsaXBzQHRyaXRvbi5uZXQ+CisKKwkqIHN0YWdlMi9kaXNrX2lvLmMgKHNldF9wYXJ0aXRpb25faGlkZGVuX2ZsYWcpOiBTZXQvY2xlYXIgdGhlCisJaGlkZGVuIGZsYWcsIHdoZXRoZXIgdGhlIGhpZGRlbiBmbGFnIGlzIHNldCBvciBub3QuCisKKzE5OTktMDktMjEgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChpbnN0YWxsX2Z1bmMpOiBEbyBub3Qgc2V0IERFQlVHX0ZTIGF0IHRoZQorCWZpcnN0IHJlYWQuIFNldCBpdCB0byBERUJVR19GU19CTE9DS0xJU1RfRlVOQyB3aGVuIHJlYWRpbmcgdGhlCisJd2hvbGUgb2YgU3RhZ2UgMi4gU2V0IEZJTEVQT1MgdG8gemVybyBhdCB0aGUgc2FtZSB0aW1lIHRvIHJlYWQKKwlmcm9tIHRoZSBiZWdpbm5pbmcgb2YgU3RhZ2UgMi4gUmVwb3J0ZWQgYnkgUGF2ZWwgUm9za2luLgorCisxOTk5LTA5LTIwICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJVGhlIGFyZ3VtZW50IEFERFIgZm9yIHRoZSBjb21tYW5kIGluc3RhbGwgaXMgbm93IG9wdGlvbmFsLgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoaW5zdGFsbF9mdW5jKTogSWYgcGFyc2luZyBBRERSIGZhaWxzLCBzZXQKKwlJTlNUQUxMQUREUiB0byB6ZXJvIGFuZCBzZXQgUFRSIHRvIEFERFIuCisJSWYgSU5TVEFMTEFERFIgaXMgemVybyBhZnRlciBwYXJzaW5nIHRoZSBjb21tYW5kLWxpbmUsIGNoZWNrIGlmCisJdGhlIFN0YWdlIDIgaWQgaXMgU1RBR0UyX0lEX1NUQUdFMi4gSWYgc28sIHNldCBJTlNUQUxMQUREUiB0bworCTB4ODAwMCwgb3RoZXJ3aXNlIHNldCBpdCB0byAweDIwMDAuCisJU2V0IHRoZSBpbnN0YWxsIGFkZHJlc3MgaW4gdGhlIFN0YWdlIDEgYWZ0ZXIgdGhlIGF1dG9tYXRpYworCWRldGVybWluYXRpb24gaXMgY29tcGxldGVkLgorCShidWlsdGluX2luc3RhbGwpOiBTYXkgdGhhdCBBRERSIGlzIG9wdGlvbmFsIGluIHRoZSBoZWxwCisJbWVzc2FnZS4KKwkqIGRvY3MvZ3J1Yi50ZXhpOiBTeW5jaHJvbml6ZSB0aGUgZGVzY3JpcHRpb24gYWJvdXQgaW5zdGFsbCB0bworCWJ1aWx0aW5zLmMuIFJlbW92ZSBleHBsaWNpdCBhZGRyZXNzIGFyZ3VtZW50cyBmcm9tIGFsbCB0aGUKKwlleGFtcGxlcy4gQWRkIGEgZGVzY3JpcHRpb24gYWJvdXQgaGVscC4KKwkqIGRvY3MvbWVudS5sc3Q6IERvIG5vdCBzcGVjaWZ5IHRoZSBhZGRyZXNzIGFyZ3VtZW50IGZvcgorCWluc3RhbGwuCisKKzE5OTktMDktMTkgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwlUaGUgY29tcGxldGlvbiBjb2RlIGlzIGhlYXZpbHkgbW9kaWZpZWQuCisKKwkqIHN0YWdlMi9jaGFyX2lvLmMgWyFTVEFHRTFfNV0gKGdldF9jbWRsaW5lKTogSW4gdGhlIGNvbXBsZXRpb24KKwljb2RlLCB1c2UgQ09NUExFVElPTl9CVUZGRVIgdG8gZ2V0IHRoZSBjb21wbGV0aW9uIGluc3RlYWQgb2YKKwl3cml0aW5nIHRvIEJVRiBkaXJlY3RseS4KKwlTYXZlIHRoZSBwb3NpdGlvbiBvZiBhIHBvc3NpYmxlIGVxdWFsIGNoYXJhY3RlciBhZnRlciBhIGNvbW1hbmQKKwlpbiBFUVVBTF9QT1MgYW5kIHJlcGxhY2UgdGhlIGVxdWFsIGNoYXJhY3RlciB3aXRoIGEgc3BhY2UKKwl0ZW1wb3JhcmlseSBmb3IgdGhlIGNvZGUgc2ltcGxpY2l0eS4KKwlBdCBmaXJzdCwganVzdCBnZXQgY29tcGxldGlvbnMsIGFuZCwgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZQorCWNvbXBsZXRpb25zLCB0aGVuIHByaW50IHRoZSBsaXN0IG9mIHRoZSBjb21wbGV0aW9ucy4KKwkqIHN0YWdlMi9kaXNrX2lvLmMgWyFTVEFHRTFfNV0gKGRvX2NvbXBsZXRpb24pOiBOZXcgdmFyaWFibGUuCisJWyFTVEFHRTFfNV0gKHVuaXF1ZSk6IE1vdmVkIHRoZSBkZWZpbml0aW9uIG5lYXIgdGhlIGJlZ2lubmluZy4KKwlbIVNUQUdFMV81XSAodW5pcXVlX3N0cmluZyk6IExpa2V3aXNlLiBBbmQgY2hhbmdlZCB0aGUgdHlwZSB0bworCWNoYXIgKi4KKwkoY2hlY2tfQlNEX3BhcnRzKSBbIVNUQUdFMV81XTogSWYgRE9fQ09NUExFVElPTiBpcyBub24temVybywgZG8KKwlub3QgcHJpbnQgYW55dGhpbmcuCisJKHJlYWxfb3Blbl9wYXJ0aXRpb24pIFshU1RBR0UxXzVdOiBMaWtld2lzZS4KKwlbIVNUQUdFMV81XSAocHJpbnRfZnN5c190eXBlKTogTGlrZXdpc2UuCisJWyFTVEFHRTFfNV0gKHByaW50X2FfY29tcGxldGlvbik6IFRoZSBhcmd1bWVudCBGSUxFTkFNRSBpcworCXJlbmFtZWQJdG8gTkFNRS4KKwlJZiBET19DT01QTEVUSU9OIGlzIG5vbi16ZXJvLCBnZXQgdGhlIHVuaXF1ZSBwYXJ0IGZyb20gTkFNRSBhbmQKKwlzZXQgVU5JUVVFX1NUUklORyB0byBpdC4KKwlJZiBET19DT01QTEVUSU9OIGlzIHplcm8sIGp1c3QgcHJpbnQgTkFNRS4KKwlEbyBub3QgY2FsbCBwcmludGYgdW5jb25kaXRpb25hbGx5LgorCVshU1RBR0UxXzVdIChwcmludF9jb21wbGV0aW9ucyk6IEFjY2VwdCB0d28gYXJndWVtZW50cworCUlTX0ZJTEVOQU1FIGFuZCBJU19DT01QTEVUSU9OIGluc3RlYWQgb2YgRklMRU5BTUUuCisJU2V0IFVOSVFVRV9TVFJJTkcgdG8gVU5JUVVFX0JVRi4KKwlTZXQgRE9fQ09NUExFVElPTiB0byBJU19DT01QTEVUSU9OIGFuZCBzZXQgaXQgdG8gemVybyBiZWZvcmUKKwlyZXR1cm5pbmcuCisJSWYgSVNfRklMRU5BTUUgaXMgemVybywgdGhlbiBjb21wbGV0ZSBidWlsdGluIGNvbW1hbmRzIGFuZAorCXJldHVybiBVTklRVUUgLSAxLgorCVVzZSBCVUYgaW5zdGVhZCBvZiBGSUxFTkFNRS4KKwlJZiBJU19DT01QTEVUSU9OIGlzIG5vbi16ZXJvLCBkbyBub3QgcHJpbnQgYW55dGhpbmcuCisJQ29weSBVTklRVUVfU1RSSU5HIHRvIFBUUiBvbmx5IGlmIElTX0NPTVBMRVRJT04gYW5kCisJKlVOSVFVRV9TVFJJTkcgYXJlIG5vbi16ZXJvLgorCSogc3RhZ2UyL3NoYXJlZC5oIChDT01QTEVUSU9OX0JVRik6IE5ldyBtYWNyby4KKwkoQ09NUExFVElPTl9CVUZMRU4pOiBMaWtld2lzZS4KKwkoVU5JUVVFX0JVRik6IExpa2V3aXNlLgorCShVTklRVUVfQlVGTEVOKTogTGlrZXdpc2UuCisJKE1FTlVfQlVGKTogU2V0IHRvIFVOSVFVRV9CVUYgKyBVTklRVUVfQlVGTEVOLgorCShNRU5VX0JVRkxFTik6IFNldCB0byAweDgwMDAgKyBQQVNTV09SRF9CVUYgLSBVTklRVUVfQlVGLgorCShwcmludF9jb21wbGV0aW9ucyk6IEFkanVzdGVkIHRvIHRoZSBkZWZpbml0aW9uLgorCisxOTk5LTA5LTE5ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBhY2luY2x1ZGUubTQgKGdydWJfQVNNX1BSRUZJWF9SRVFVSVJFTUVOVCk6IERvIG5vdCBjYWxsCisJQUNfREVGSU5FX1VOUVVPVEVzIHdpdGhpbiBBQ19DQUNIRV9WQUwuIERlZmluZSBBRERSMzIgYW5kIERBVEEzMgorCWFmdGVyIGl0LgorCShncnViX0NIRUNLX1NUQVJUX1NZTUJPTCk6IERvIG5vdCBjYWxsIEFDX0RFRklORSB3aXRoaW4KKwlBQ19DQUNIRV9WQUwuIERlZmluZSBIQVZFX1NUQVJUX1NZTUJPTCBhZnRlciBpdC4KKwkoZ3J1Yl9DSEVDS19VU0NPUkVfU1RBUlRfU1lNQk9MKTogRG8gbm90IGNhbGwgQUNfREVGSU5FIHdpdGhpbgorCUFDX0NBQ0hFX1ZBTC4gRGVmaW5lIEhBVkVfVVNDT1JFX1NUQVJUX1NZTUJPTCBhZnRlciBpdC4KKwkoZ3J1Yl9DSEVDS19FTkRfU1lNQk9MKTogRG8gbm90IGNhbGwgQUNfREVGSU5FIHdpdGhpbgorCUFDX0NBQ0hFX1ZBTC4gRGVmaW5lIEhBVkVfRU5EX1NZTUJPTCBhZnRlciBpdC4KKwkoZ3J1Yl9DSEVDS19VU0NPUkVfRU5EX1NZTUJPTCk6IERvIG5vdCBjYWxsIEFDX0RFRklORSB3aXRoaW4KKwlBQ19DQUNIRV9WQUwuIERlZmluZSBIQVZFX1VTQ09SRV9FTkRfU1lNQk9MIGFmdGVyIGl0LgorCisxOTk5LTA5LTE3ICBQYXZlbCBSb3NraW4gIDxwYXZlbF9yb3NraW5AZ2VvY2l0aWVzLmNvbT4KKworCSogYWNjb25maWcuaCAoQUREUjMyKTogUmVtb3ZlZC4gVGhpcyBlbnRyeSBpcyBhdXRvbWF0aWNhbGx5CisJY3JlYXRlZCBieSBhdXRvaGVhZGVyLgorCShEQVRBMzIpOiBMaWtld2lzZS4KKwkqIGFjaW5jbHVkZS5tNCAoZ3J1Yl9BU01fQUREMzIpOiBVc2UgQUREUjMyIGluc3RlYWQgb2YgYWRkcjMyLgorCVJlcXVpcmUgZ3J1Yl9BU01fUFJFRklYX1JFUVVJUkVNRU5ULgorCShncnViX0FTTV9QUkVGSVhfUkVRVUlSRU1FTlQpOiBEZWZpbmUgQUREUjMyIGFuZCBEQVRBMzIuCisJKiBjb25maWd1cmUuaW46IENhbGwgZ3J1Yl9BU01fUFJFRklYX1JFUVVJUkVNRU5UIGJlZm9yZQorCWdydWJfQVNNX0FERFIzMi4gRG8gbm90IGRlZmluZSBBRERSMzIgYW5kIERBVEEzMi4KKwkqIHN0YWdlMS9zdGFnZTEuUyAoYWZ0ZXJfQlBCKTogVXNlIEFCUyhmaXJzdGxpc3QpIGluc3RlYWQgb2YKKwlmaXJzdGxpc3QuCisJKE1TRyk6IFVzZSBBQlMoeCkgaW5zdGVhZCBvZiB4LgorCShwcm9iZV9sb29wKTogVXNlIHRoZSBtYWNybyBNU0cgZm9yIGZkX3Byb2JlX2Vycm9yX3N0cmluZy4KKwkqIHN0YWdlMS9zdGFnZTFfbGJhLlMgKGFmdGVyX0JQQik6IFVzZSBBQlMoZmlyc3RsaXN0KSBpbnN0ZWFkIG9mCisJZmlyc3RsaXN0LgorCShNU0cpOiBVc2UgQUJTKHgpIGluc3RlYWQgb2YgeC4KKwkqIHN0YWdlMi9hc20uUyAocHV0Y2hhcik6IFJlbmFtZWQgdG8gLi4uCisJKGdydWJfcHV0Y2hhcik6IC4uLiB0aGlzLgorCisxOTk5LTA5LTE4ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBzdGFnZTIvZ3VuemlwLmMgKHJlc2V0X2xpbmFsbG9jKTogVXNlIHRoZSBtYWNybyBSQVdfQUREUgorCWJlZm9yZSBzZXR0aW5nIExJTkFMTE9DX1RPUEFERFIuCisJKiBzdGFnZTIvc2hhcmVkLmggWyFHUlVCX1VUSUxdIChSQVdfQUREUik6IEFkZGVkIHBhcmVudGhlc2lzZXMKKwl0byBhdm9pZCBhIGdjYyB3YXJuaW5nLgorCVshR1JVQl9VVElMXSAoUkFXX1NFRyk6IExpa2V3aXNlLgorCisxOTk5LTA5LTE4ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBhY2luY2x1ZGUubTQgKGdydWJfQ0hFQ0tfU1RBUlRfU1lNQk9MKTogTmV3IGZ1bmN0aW9uLgorCShncnViX0NIRUNLX1VTQ09SRV9TVEFSVF9TWU1CT0wpOiBMaWtld2lzZS4KKwkoZ3J1Yl9DSEVDS19FTkRfU1lNQk9MKTogTGlrZXdpc2UuCisJKGdydWJfQ0hFQ0tfVVNDT1JFX1NZTUJPTCk6IExpa2V3aXNlLgorCSogY29uZmlndXJlLmluOiBDYWxsIGdydWJfQ0hFQ0tfU1RBUlRfU1lNQk9MIGFuZAorCWdydWJfQ0hFQ0tfVVNDT1JFX1NUQVJUX1NZTUJPTCwgYW5kIGlmIG5laXRoZXIgc3RhcnQgbm9yIF9zdGFydAorCWlzIGRlZmluZWQsIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQuCisJTGlrZXdpc2UsIGNhbGwgZ3J1Yl9DSEVDS19FTkRfU1lNQk9MIGFuZAorCWdydWJfQ0hFQ0tfVVNDT1JFX0VORF9TWU1CT0wsIGFuZCBpZiBuZWl0aGVyIGVuZCBub3IgX2VuZCBpcworCWRlZmluZWQsIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQuCisJKiBhY2NvbmZpZy5oIChIQVZFX1NUQVJUX1NZTUJPTCk6IEFkZGVkIHRoZSAidW5kZWYiIGVudHJ5LgorCShIQVZFX1VTQ09SRV9TVEFSVF9TWU1CT0wpOiBMaWtld2lzZS4KKwkoSEFWRV9FTkRfU1lNQk9MKTogTGlrZXdpc2UuCisJKEhBVkVfVVNDT1JFX0VORF9TWU1CT0wpOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9jaGFyX2lvLmMgKG1lbWNoZWNrKTogUmVuYW1lIHRoZSBhcmd1bWVudCBTVEFSVCB0bworCUFERFIuIEFkZGVkIHR3byBtaXNzaW5nIGVxdWFsIGNoYXJhY3RlcnMuCisJW0dSVUJfVVRJTF06IERlZmluZSBuZXcgbG9jYWwgZnVuY3Rpb25zIHN0YXJ0X2FkZHIgYW5kIGVuZF9hZGRyLgorCVtHUlVCX1VUSUwgJiYgSEFWRV9TVEFSVF9TWU1CT0xdOiBUaGUgZnVuY3Rpb24gc3RhcnRfYWRkcgorCXJldHVybnMgU1RBUlQuCisJW0dSVUJfVVRJTCAmJiBIQVZFX1VTQ09SRV9TVEFSVF9TWU1CT0xdOiBUaGUgZnVuY3Rpb24gc3RhcnRfYWRkcgorCXJldHVybnMgX1NUQVJULgorCVtHUlVCX1VUSUwgJiYgSEFWRV9FTkRfU1lNQk9MXTogVGhlIGZ1bmN0aW9uIGVuZF9hZGRyIHJldHVybnMKKwlFTkQuCisJW0dSVUJfVVRJTCAmJiBIQVZFX1VTQ09SRV9FTkRfU1lNQk9MXTogVGhlIGZ1bmN0aW9uIGVuZF9hZGRyCisJcmV0dXJucyBfRU5ELgorCVtHUlVCX1VUSUxdOiBJZiBBRERSIGlzIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiB0aGUgYWRkcmVzcworCXJldHVybmVkIGJ5IHN0YXJ0X2FkZHIsIGFuZCBBRERSIHBsdXMgTEVOIGlzIGxlc3MgdGhhbiB0aGUKKwlhZGRyZXNzIHJldHVybmVkIGJ5IGVuZF9hZGRyLCByZXR1cm4gISBFUlJOVU0uCisJKiBzdGFnZTIvYXNtLlMgKGdldF9jb2RlX2VuZCkgW0hBVkVfRU5EX1NZTUJPTF06IFVzZSAkZW5kIGFzIHRoZQorCWVuZCBvZiB0aGUgYnNzLgorCVtIQVZFX1VTQ09SRV9FTkRfU1lNQk9MXTogVXNlICRfZW5kIGFzIHRoZSBlbmQgb2YgdGhlIGJzcy4KKwkqIHN0YWdlMi9kaXNrX2lvLmMgWyFTVEFHRTFfNV0gKGN1cl9wYXJ0X2Rlc2MpOiBNYWRlIHN0YXRpYy4KKwlOZWVkIG5vdCB0byBiZSBnbG9iYWwgYW55IGxvbmdlci4KKworMTk5OS0wOS0xNyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogc3RhZ2UyL2NoYXJfaW8uYyBbIVNUQUdFMV81XSAoZ2V0X2NtZGxpbmUpOiBUaGUgYXJndW1lbnQKKwlDT01QTEVUSU9OIGlzIHJlbmFtZWQgdG8gUkVBRExJTkUuCisJRG8gbm90IGluaXRpYWxpemUgS0lMTCBoZXJlLgorCVRBQiwgQy1hLCBDLWUsIEMtZiwgQy1iLCBDLXUsIEMtaywgQy15LCBDLXAgYW5kIEMtbiBhcmUgaGFuZGxlZAorCW9ubHkgaWYgUkVBRExJTkUgaXMgbm9uLXplcm8uCisJSWYgRUNIT19DSEFSIGlzIG5vdCBOVUwsIGRvIG5vdCByZW1vdmUgdGhlIGxlYWRpbmcgc3BhY2VzIGluIEJVRi4KKwlBZGQgQ01ETElORSBpbnRvIHRoZSBoaXN0b3J5IGxpc3Qgb25seSBpZiBSRUFETElORSBpcyBub24temVyby4KKwkqIHN0YWdlMi9zdGFnZTIuYyAoY21haW4pOiBJbml0aWFsaXplIHRoZSBraWxsIGJ1ZmZlci4KKworMTk5OS0wOS0xNyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCUtpbGxpbmcsIHlhbmtpbmcgYW5kIG1hbmlwdWxhdGluZyB0aGUgaGlzdG9yeSBhcmUgc3VwcG9ydGVkLgorCisJKiBzdGFnZTIvc2hhcmVkLmggKGN1cl9jbWRsaW5lKTogUmVtb3ZlZC4KKwkoTUFYX0NNRExJTkUpOiBNb3ZlZCBuZWFyIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisJKE5FV19IRUFQU0laRSk6IExpa2V3aXNlLgorCShDTURMSU5FX0JVRkxFTik6IFNldCB0byBNQVhfQ01ETElORS4KKwkoS0lMTF9CVUYpOiBOZXcgbWFjcm8uCisJKEtJTExfQlVGTEVOKTogTGlrZXdpc2UuCisJKEhJU1RPUllfQlVGKTogTGlrZXdpc2UuCisJKEhJU1RPUllfU0laRSk6IExpa2V3aXNlLgorCShISVNUT1JZX0JVRkxFTik6IExpa2V3aXNlLgorCShNRU5VX0JVRik6IFNldCB0byBISVNUT1JZX0JVRiArIEhJU1RPUllfQlVGTEVOLgorCShNRU5VX0JVRkxFTik6IFNldCB0byAweDgwMDAgKyBQQVNTV09SRF9CVUYgLSBISVNUT1JZX0JVRi4KKwkoc3RyY3B5KTogTmV3IG1hY3JvLgorCShncnViX3N0cmNweSk6IERlbGFyZWQuCisJKiBzdGFnZTIvYm9vdC5jIChjdXJfY21kbGluZSk6IFJlbW92ZWQuCisJKiBzdGFnZTIvY2hhcl9pby5jIFshU1RBR0UxXzVdIChncnViX3N0cmNweSk6IE5ldyBmdW5jdGlvbi4KKwlbIVNUQUdFMV81XSAoZ2V0X2hpc3RvcnkpOiBMaWtld2lzZS4KKwlbIVNUQUdFMV81XSAoYWRkX2hpc3RvcnkpOiBMaWtld2lzZS4KKwlbIVNUQUdFMV81XSAoZ2V0X2NtZGxpbmUpOiBVc2UgQlVGIGluc3RlYWQgb2YgQ01ETElORSBmb3IgdGhlCisJd29ya2luZyBidWZmZXIgZm9yIHRoZSBjb21tYW5kLWxpbmUuCisJQSBuZXcgZnVuY3Rpb24gY2xfaW5zZXJ0IGlzIHVzZWQgdG8gaW5zZXJ0IGEgc3RyaW5nIHRvIHRoZQorCWNvbW1hbmQtbGluZS4KKwlJbiB0aGUgY2FzZSB3aGVyZSBDLXUgb3IgQy1rIGlzIHByZXNzZWQsIGNvcHkgdGhlIHN0cmluZyBiZWluZworCWRlbGV0ZWQgdG8gS0lMTC4KKwlJZiBDLXkgaXMgcHJlc3NlZCwgaW5zZXJ0IEtJTEwgdG8gdGhlIGNvbW1hbmQtbGluZS4KKwlJZiBDLXAgaXMgcHJlc3NlZCwgZmV0Y2ggdGhlIHByZXZpb3VzIGNvbW1hbmQgZnJvbSB0aGUgaGlzdG9yeQorCWxpc3QgSElTVE9SWSwgYW5kIGlmIEMtbiBpcyBwcmVzc2VkLCBmZXRjaCB0aGUgbmV4dCBjb21tYW5kIGZyb20KKwlpdC4KKwlJZiBMUE9TIGlzIGxlc3MgdGhhbiBMTEVOLCBhZGQgQ01ETElORSBpbnRvIHRoZSBoaXN0b3J5IGxpc3QuCisJSWYgQyBpcyBlcXVhbCB0byBLRVlfVVAsIHNldCBDIHRvIDE2LCBhbmQgaWYgQyBpcyBlcXVhbCB0bworCUtFWV9ET1dOLCBzZXQgQyB0byAxNC4KKwlbIVNUQUdFMV81XSAobnVtX2hpc3RvcnkpOiBOZXcgdmFyaWFibGUuCisKKzE5OTktMDktMTUgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHN0YWdlMi9zaXplX3Rlc3Q6IERvIG5vdCBjaGVjayBmb3IgdGhlIHNpemUgb2YgU3RhZ2UgMi4KKwkqIHN0YWdlMS9NYWtlZmlsZS5hbSAoc3RhZ2UyX3NpemUuaCk6IFVzZSBgc2V0JyBhbmQgYGVjaG8nCisJaW5zdGVhZCBvZiBhd2ssIHNpbmNlIHdlIGNhbm5vdCBleHBlY3QgYXdrIGlzIHByZXNlbnQuIFJlbW92ZQorCXN0YWdlMl9zaXplLmggYmVmb3JlIGNyZWF0aW5nIGl0LgorCisxOTk5LTA5LTE1ICBQYXZlbCBSb3NraW4gIDxwYXZlbF9yb3NraW5AZ2VvY2l0aWVzLmNvbT4KKworCSogTWFrZWZpbGUuYW0gKFNVQkRJUlMpOiBQdXQgc3RhZ2UxIGFmdGVyIHN0YWdlMiBzbyB0aGF0IHN0YWdlMgorCWlzIGJ1aWx0IGJlZm9yZSBzdGFnZTEuCisJKiBzdGFnZTEvTWFrZWZpbGUuYW0gKEJVSUxUX1NPVVJDRVMpOiBOZXcgdmFyaWxhYmxlLgorCShDTEVBTkZJTEVTKTogQWRkZWQgQlVJTFRfU09VUkNFUy4KKwkoc3RhZ2UxX2V4ZWNfU09VUkNFUyk6IEFkZGVkIHN0YWdlMl9zaXplLmguCisJKHN0YWdlMV9sYmFfZXhlY19TT1VSQ0VTKTogTGlrZXdpc2UuCisJKHN0YWdlMl9zaXplLmgpOiBOZXcgcnVsZS4KKwkqIHN0YWdlMS9zdGFnZTEuUzogSW5jbHVkZSA8c3RhZ2UyX3NpemUuaD4gYW5kIHVzZSBTVEFHRTJfU0laRQorCXRvIGRldGVybWluZSBob3cgbXVjaCBudW1iZXIgb2Ygc2VjdG9ycyB0byBiZSByZWFkIHdoZW4gbG9hZGluZworCVN0YWdlIDIuCisJKiBzdGFnZTEvc3RhZ2UxX2xiYS5TOiBMaWtld2lzZS4KKworMTk5OS0wOS0xNSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogbmV0Ym9vdC9jb25maWcuaDogTW92ZWQgdG8gLi4uCisJKiBuZXRib290L25ldGJvb3RfY29uZmlnLmg6IC4uLiBoZXJlLgorCSogbmV0Ym9vdC9jb25maWcuYzogSW5jbHVkZSBuZXRib290X2NvbmZpZy5oIGluc3RlYWQgb2YgY29uZmlnLmguCisJKiBuZXRib290L2ZzeXNfdGZ0cC5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvaXAuYzogTGlrZXdpc2UuCisJKiBuZXRib290L01ha2VmaWxlLmFtIChsaWJkcml2ZXJzX2FfU09VUkNFUyk6IFJlbW92ZWQgY29uZmlnLmgKKwlhbmQgYWRkZWQgbmV0Ym9vdF9jb25maWcuaC4KKworMTk5OS0wOS0xNCAgUGF2ZWwgUm9za2luICA8cGF2ZWxfcm9za2luQGdlb2NpdGllcy5jb20+CisKKwkqIGdydWIvYXNtc3R1Yi5jIFtfX2xpbnV4X19dOiBPbiBHTGliYyAyLjAgYW5kIG5ld2VyIHVzZSBsc2VlaywKKwlkb24ndCBpbmNsdWRlIDxsaW51eC9mcy5oPiBhbmQgZGVmaW5lIEJMS0ZMU0JVRiBpZiBuZWVkZWQuCisKKzE5OTktMDktMTQgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwlOb3cgdGhlIGdydWIgc2hlbGwgd29ya3MgZmluZSBvbiBGcmVlQlNELiBBIHBhdGNoIGJ5IFBhdmVsCisJUm9za2luIGlzIG1vZGlmaWVkIGFuZCBhcHBsaWVkLgorCisJKiBncnViL2FzbXN0dWIuYyAoZ2V0X2RyaXZlX2dlb21ldHJ5KTogTmV3IGZ1bmN0aW9uLgorCShnZXRfZGlza2luZm8pOiBVc2UgZ2V0X2RyaXZlX2dlb21ldHJ5IHRvIHNldCB0aGUgZ2VvbWV0cnkgb2YKKwlEUklWRS4KKworMTk5OS0wOS0xNCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1uZSk6IE1hZGUgdGhlIGRlc2NyaXB0aW9uIG1vcmUgY2xlYXIuCisJKC0tZW5hYmxlLW5lcGNpKTogTGlrZXdpc2UuCisJKC0tZW5hYmxlLXdkKTogTGlrZXdpc2UuCisJKC0tZW5hYmxlLXQ1MDMpOiBMaWtld2lzZS4KKwkoLS1lbmFibGUtdDUwOSk6IExpa2V3aXNlLgorCSgtLWVuYWJsZS0zYzU5eCk6IExpa2V3aXNlLgorCSgtLWVuYWJsZS1sYW5jZSk6IExpa2V3aXNlLgorCSgtLWVuYWJsZS1jcyk6IExpa2V3aXNlLgorCSgtLWVuYWJsZS1lZXBybzEwMCk6IExpa2V3aXNlLgorCSgtLWVuYWJsZS13ZC1kZWZhdWx0X21lbSk6IFJlbmFtZWQgdG8gLi4uCisJKC0tZW5hYmxlLXdkLWRlZmF1bHQtbWVtKTogLi4uIHRoaXMuCisJKC0tZW5hYmxlLWNzLXNjYW4pOiBDb3JyZWN0ZWQgdGhlIGRlc2NyaXB0aW9uLgorCShORVRCT09UX1NVUFBPUlQpOiBEZWZpbmVkIGlmIE5FVF9DRkxBR1MgaXMgbm90IGVtcHR5LgorCSogc3RhZ2UyL01ha2VmaWxlLmFtIChzdGFnZTJfZXhlY19MREFERCk6IERlZmluZWQgb25seSBpZgorCU5FVEJPT1RfU1VQUE9SVCBpcyB0cnVlLgorCSogbmV0Ym9vdC9NYWtlZmlsZS5hbSAoTElCRFJJVkVSUyk6IE5ldyB2YXJpYWJsZS4gSWYKKwlORVRCT09UX1NVUFBPUlQgaXMgdHJ1ZSwgc2V0IHRvIGxpYmRyaXZlci5hLCBvdGhlcndpc2Ugc2V0IHRvIGFuCisJZW1wdHkgc3RyaW5nLgorCShub2luc3RfTElCUkFSSUVTKTogU2V0IHRvIExJQkRSSVZFUlMuCisJKERSSVZFUlMpOiBBZGRlZCAzYzUwOS5oLCBjczg5eDAuaCBhbmQgbnM4MzkwLmguCisJKGxpYmRyaXZlcnNfYV9TT1VSQ0VTKTogQWRkZWQgYnl0ZW9yZGVyLmgsIGNvbmZpZy5oLCBpZi5oLCBpby5oLAorCWlwLmgsIG5ldGJvb3QuaCwgbmV0ZGV2aWNlLmgsIG5pYy5oIGFuZCBwaWMuaC4KKwkobGliZHJpdmVyc19hX0NGTEFHUyk6IEFkZGVkIC1mbm8tYnVpbHRpbiBhbmQgLW5vc3RkaW5jIGFuZAorCXJlbW92ZWQgLU8yLgorCSogc3RhZ2UyL2NoYXJfaW8uYyAoZ3J1Yl9zcHJpbnRmKTogQWRkZWQgcGFyZW50aGVzaXNlcyB0byBhdm9pZAorCWdjYyB3YXJuaW5ncy4KKwkqIHN0YWdlMi9ndW56aXAuYyAoZ3VuemlwX3Rlc3RfaGVhZGVyKTogQ2hlY2sgaWYgRlNZU19UWVBFIGlzCisJVEZUUC4gSWYgc28sIHNldCBJU19URlRQIHRvIG5vbi16ZXJvLCBvdGhlcndpc2UgdG8gemVyby4gQW5kLAorCXVzZSBJU19URlRQIHRvIGNoZWNrIGlmIHdlIGhhdmUgR1pJUF9DUkMgaW5zdGVhZCBvZiB0aGUgZXF1YXRpb24KKwkiRklMRU1BWCA9PSAxNiAqIDEwMjQgKiAxMDI0Ii4KKworMTk5OS0wOS0xMyAgRWRtdW5kIEdSSU1MRVkgRVZBTlMgIDxlZG11bmRvQHJhbm8uZGVtb24uY28udWs+CisKKwlUaGUgbmV0Ym9vdCBzdXBwb3J0IGluIHRoZSBEcmVzZGVuIHZlcnNpb24gb2YgR1JVQiBpcyBpbnRlZ3JhdGVkLgorCisJKiBNYWtlZmlsZS5hbSAoU1VCRElSUyk6IEFkZGVkIG5ldGJvb3QuCisJKiBjb25maWd1cmUuaW4gKC0tZW5hYmxlLXRmdHApOiBOZXcgb3B0aW9uLgorCSgtLWVuYWJsZS1uZSk6IExpa2V3aXNlLgorCSgtLWVuYWJsZS1uZXBjaSk6IExpa2V3aXNlLgorCSgtLWVuYWJsZS13ZCk6IExpa2V3aXNlLgorCSgtLWVuYWJsZS10NTAzKTogTGlrZXdpc2UuCisJKC0tZW5hYmxlLXQ1MDkpOiBMaWtld2lzZS4KKwkoLS1lbmFibGUtM2M1OXgpOiBMaWtld2lzZS4KKwkoLS1lbmFibGUtbGFuY2UpOiBMaWtld2lzZS4KKwkoLS1lbmFibGUtY3MpOiBMaWtld2lzZS4KKwkoLS1lbmFibGUtZWVwcm8xMDApOiBMaWtld2lzZS4KKwkoLS1lbmFibGUtbmUtc2Nhbik6IExpa2V3aXNlLgorCSgtLWVuYWJsZS13ZC1kZWZhdWx0X21lbSk6IExpa2V3aXNlLgorCSgtLWVuYWJsZS1jcy1zY2FuKTogTGlrZXdpc2UuCisJKE5FVF9DRkxBR1MpOiBOZXcgdmFyaWFibGUuCisJKE5FVF9FWFRSQUZMQUdTKTogTGlrZXdpc2UuCisJRG8gQUNfT1VUUFVUIGZvciBuZXRib290L01ha2VmaWxlIGFzIHdlbGwuCisJKiBzdGFnZTEvc3RhZ2UxLlM6IFNldCB0aGUgbnVtYmVyIG9mIHNlY3RvcnMgZm9yIFN0YWdlIDIgdG8gMTMwLgorCSogc3RhZ2UxL3N0YWdlMV9sYmEuUzogTGlrZXdpc2UuCisJKiBzdGFnZTIvTWFrZWZpbGUuYW0gKHN0YWdlMl9leGVjX0xEQUREKTogQWRkZWQKKwkuLi9uZXRib290L2xpYmRyaXZlcnMuYS4KKwkqIHN0YWdlMi9hc20uUyBbIVNUQUdFMV81XSAoY3VycnRpY2tzKTogTmV3IGZ1bmN0aW9uLgorCSogc3RhZ2UyL2NoYXJfaW8uYyBbIVNUQUdFMV81XSAoZ3J1Yl9zcHJpbnRmKTogTGlrZXdpc2UuCisJWyFTVEFHRTFfNV0gKGdydWJfbWVtY21wKTogTGlrZXdpc2UuCisJKiBzdGFnZTIvZGlza19pby5jIChmc3lzX3RhYmxlKSBbRlNZU19URlRQXTogQWRkZWQgYW4gZW50cnkgZm9yCisJdGZ0cC4KKwkoc2FuZV9wYXJ0aXRpb24pIFshU1RBR0UxXzVdOiBJZiBDVVJSRU5UX0RSSVZFIGlzIGEgbmV0d29yaworCWRyaXZlLCByZXR1cm4gMS4KKwkocmVhbF9vcGVuX3BhcnRpdGlvbikgWyFTVEFHRTFfNV06IExpa2V3aXNlLgorCShzZXRfZGV2aWNlKTogSWYgREVWSUNFIGNvbnRhaW5zIGEgbmV0d29yayBkcml2ZSwgc2V0CisJQ1VSUkVOVF9EUklWRSB0byAweDIwLgorCSogc3RhZ2UyL2ZpbGVzeXMuaCBbRlNZU19URlRQXSAoRlNZU19URlRQX05VTSk6IERlZmluZWQgYXMgMS4KKwlbIUZTWVNfVEZUUF0gKEZTWVNfVEZUUF9OVU0pOiBEZWZpbmVkIGFzIDAuCisJKE5VTV9GU1lTKTogQWRkZWQgRlNZU19URlRQX05VTS4KKwkqIHN0YWdlMi9ndW56aXAuYyAoZ3VuemlwX3Rlc3RfaGVhZGVyKTogSWYgRklMRU1BWCA+PSAxNk1CLCBkbworCW5vdCB0cnkgdG8gZXhhbWluZSB0aGUgbGFzdCA4IGJ5dGVzIG9mIHRoZSBmaWxlLiBUaGlzIGlzCisJcmVxdWlyZWQgZm9yIGNvbXByZXNzZWQgZmlsZXMgYnkgVEZUUC4KKwkqIHN0YWdlMi9zaGFyZWQuaCAoc3ByaW50Zik6IE5ldyBtYWNyby4KKwkobWVtY21wKTogTGlrZXdpc2UuCisJKGN1cnJ0aWNrcyk6IERlY2xhcmVkLgorCShncnViX3NwcmludGYpOiBMaWtld2lzZS4KKwkoZ3J1Yl9tZW1jbXApOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9zaXplX3Rlc3Q6IFNldCB0aGUgbWF4aW11bSBzaXplIG9mIFN0YWdlIDIgdG8gNjY1NjAuCisJKiBuZXRib290LzNjNTA5LmM6IE5ldyBmaWxlLgorCSogbmV0Ym9vdC8zYzUwOS5oOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvM2M1OXguYzogTGlrZXdpc2UuCisJKiBuZXRib290L01ha2VmaWxlLmFtOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvTWFrZWZpbGUuaW46IExpa2V3aXNlLgorCSogbmV0Ym9vdC9ieXRlb3JkZXIuaDogTGlrZXdpc2UuCisJKiBuZXRib290L2NvbXBpbGU6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9jb25maWcuYzogTGlrZXdpc2UuCisJKiBuZXRib290L2NvbmZpZy5oOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvY3M4OXgwLmM6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9jczg5eDAuaDogTGlrZXdpc2UuCisJKiBuZXRib290L2VlcHJvMTAwLmM6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9mc3lzX3RmdHAuYzogTGlrZXdpc2UuCisJKiBuZXRib290L2lmLmg6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9pby5oOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvaXAuYzogTGlrZXdpc2UuCisJKiBuZXRib290L2lwLmg6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9sYW5jZS5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvbmV0Ym9vdC5oOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvbmV0ZGV2aWNlLmg6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9uaWMuaDogTGlrZXdpc2UuCisJKiBuZXRib290L25zODM5MC5jOiBMaWtld2lzZS4KKwkqIG5ldGJvb3QvbnM4MzkwLmg6IExpa2V3aXNlLgorCSogbmV0Ym9vdC9wY2kuYzogTGlrZXdpc2UuCisJKiBuZXRib290L3BjaS5oOiBMaWtld2lzZS4KKworMTk5OS0wOS0xMyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUpOiBEbyBub3QgdXNlIG91ciBvd24KKwlydWxlLCBidXQgdXNlIEFNX01BSU5UQUlORVJfTU9ERSBpbnN0ZWFkLiBJZiB0aGUgbWFpbnRhaW5lciBtb2RlCisJaXMgZW5hYmxlZCwgdGhlbiBjaGVjayBmb3IgcGVybCwgYW5kIGlmIGl0IGlzIG5vdCBmb3VuZCwgcHJpbnQKKwlhbiBlcnJvciBtZXNzYWdlIGFuZCBhYm9ydC4KKwkqIGRvY3MvTWFrZWZpbGUuYW0gKGdydWIuOCk6IFJlZ2VuZXJhdGVkIGlmIE1BSU5UQUlORVJfTU9ERSBpcworCWRlZmluZWQsIGluc3RlYWQgb2YgR1JVQl9NQUlOVC4gVXNlIHRoZSB2YXJpYWJsZSBQRVJMIHJhdGhlcgorCXRoYW4gcnVubmluZyBoZWxwMm1hbiBkaXJlY3RseS4KKworMTk5OS0wOS0xMyAgUGF2ZWwgUm9za2luICA8cGF2ZWxfcm9za2luQGdlb2NpdGllcy5jb20+CisKKwkqIHN0YWdlMi9wY19zbGljZS5oIChJU19QQ19TTElDRV9UWVBFX0VYVEVOREVEKTogTmV3IG1hY3JvLgorCSogc3RhZ2UyL2Rpc2tfaW8uYyAocmVhbF9vcGVuX3BhcnRpdGlvbik6IFVzZQorCUlTX1BDX1NMSUNFX1RZUEVfRVhURU5ERUQgaW5zdGVhZCBvZiBjb21wYXJpbmcgQ1VSUkVOVF9TTElDRQorCXdpdGggdGhlIGV4dGVuZGVkIHBhcnRpdGlvbiB0eXBlcy4KKworMTk5OS0wOS0xMSAgUGF2ZWwgUm9za2luICA8cGF2ZWxfcm9za2luQGdlb2NpdGllcy5jb20+CisKKwkqIGFjY29uZmlnLmg6IE5ldyBmaWxlIGZvciBhdXRvaGVhZGVyIHN1cHBvcnQuCisJKiBhY2luY2x1ZGUubTQgKGdydWJfQVNNX0VYVF9DKSBSZW5hbWVkIHRvIC4uLgorCShncnViX0FTTV9VU0NPUkUpOiAuLi4gdGhpcy4gRGVmaW5lIEhBVkVfQVNNX1VTQ09SRSBpZiBhIEMKKwlzeW1ib2wgZ2V0cyBhbiB1bmRlcnNjb3JlIGFmdGVyIGNvbXBpbGluZyB0byBhc3NlbWJsZXIuCisJKiBjb25maWd1cmUuaW46IEFkZGVkIEFNX0NPTkZJR19IRUFERVIuIEF1dG9jb25mIDIuMTMgaXMgbm93CisJcmVxdWlyZWQuIFRlc3QgZm9yIHdnZXRjaCgpLCBub3QgZ2V0Y2goKSBpbiAtbFtuXWN1cnNlcy4KKwkqIHN0YWdlMi9zaGFyZWQuaCAoRVhUX0MpOiBEZWZpbmVkLgorCUluY2x1ZGUgdGhlIGJlc3QgZXhpc3RpbmcgaGVhZGVyIGZvciBbbl1jdXJzZXMuCisKKzE5OTktMDktMTIgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHN0YWdlMi9ib290LmMgKGxvYWRfaW1hZ2UpOiBVc2UgQ1VSUkVOVF9EUklWRSBhbmQKKwlDVVJSRU5UX1BBUlRJVElPTiBpbnN0ZWFkIG9mIFNBVkVEX0RSSVZFIGFuZCBTQVZFRF9QQVJUSVRJT04gZm9yCisJdGhlIGJvb3QgZGV2aWNlIGluIHRoZSBNdWx0aWJvb3QgaW5mb3JtYXRpb24uIFJlcG9ydGVkIGJ5CisJU3RlcGhlbiBFYXJseSA8c3RldmVAZ3JlZW5lbmQub3JnLnVrPi4KKworMTk5OS0wOS0xMiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogc3RhZ2UyL2Rpc2tfaW8uYyAoc2FuZV9wYXJ0aXRpb24pIFtTVEFHRTFfNV06IERlZmluZWQuCisJKHNldF9kZXZpY2UpOiBVc2Ugc2FuZV9wYXJ0aXRpb24gdG8gbWFrZSBzdXJlIHRoYXQgQ1VSUkVOVF9EUklWRQorCWhhcyBhIHZhbGlkIHZhbHVlLiBSZXBvcnRlZCBieSBQYXZlbCBSb3NraW4uCisKKzE5OTktMDktMTEgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwlGcm9tIFBhdmVsIFJvc2tpbjoKKwkqIHN0YWdlMi9idWlsdGlucy5jIChkZXZpY2VfZnVuYykgW0dSVUJfVVRJTF06IFVzZSBjaGVja19kZXZpY2UKKwlpbiBvcmRlciB0byBtYWtlIHN1cmUgdGhhdCBERVZJQ0UgZXhpc3RzLgorCSogZ3J1Yi9hc21zdHViLmMgKGNoZWNrX2RldmljZSk6IE5ldyBmdW5jdGlvbi4KKwkoZ3J1Yl9zdGFnZTIpOiBVc2UgY2hlY2tfZGV2aWNlIHRvIHByb2JlIGEgZGV2aWNlLgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAoZ2VvbWV0cnlfZnVuYykgW0dSVUJfVVRJTF06IENvcHkgdGhlCisJbW9kaWZpZWQgZ2VvbWV0cnkgdG8gR0VPTSBhbmQgcmVzZXQgQlVGX0RSSVZFLiBSZXBvcnRlZCBieSBQYXZlbAorCVJvc2tpbi4KKworCSogZ3J1Yi9tYWluLmMgKG5vX2Zsb3BweSk6IE5ldyB2YXJpYWJsZS4KKwkocHJvYmVfc2Vjb25kX2Zsb3BweSk6IExpa2V3aXNlLgorCShPUFRfTk9fRkxPUFBZKTogTmV3IG1hY3JvLgorCShPUFRfUFJPQkVfU0VDT05EX0ZMT1BQWSk6IExpa2V3aXNlLgorCShsb25nb3B0cyk6IEFkZGVkIG5vLWZsb3BweSBhbmQgcHJvYmUtc2Vjb25kLWZsb3BweS4KKwkodXNhZ2UpOiBBZGRlZCB0aGUgZGVzY3JpcHRpb25zIGFib3V0IC0tbm8tZmxvcHB5IGFuZAorCS0tcHJvYmUtc2Vjb25kLWZsb3BweS4KKwkobWFpbik6IEhhbmRsZSBPUFRfUFJPQkVfU0VDT05EX0ZMT1BQWSBhbmQgT1BUX05PX0ZMT1BQWS4KKwkqIGdydWIvYXNtc3R1Yi5jIChncnViX3N0YWdlMik6IFByaW50IGEgbWVzc2FnZSBiZWZvcmUgdGhlIHByb2JlCisJcm91dGluZS4gSWYgTk9fRkxPUFBZIGlzIG5vbi16ZXJvLCBkbyBub3QgcHJvYmUgYW55IGZsb3BweSBkcml2ZS4KKwlJZiBQUk9CRV9TRUNPTkRfRkxPUFBZIGlzIHplcm8sIHNraXAgdGhlIHByb2JlIG9mIHRoZSBzZWNvbmQKKwlmbG9wcHkgZHJpdmUuCisJKGdldF9mbG9wcHlfZGlza19uYW1lKTogTmV3IGZ1bmN0aW9uLgorCShnZXRfaWRlX2Rpc2tfbmFtZSk6IExpa2V3aXNlLgorCShnZXRfc2NzaV9kaXNrX25hbWUpOiBMaWtld2lzZS4KKworMTk5OS0wOS0xMCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGRldmljZV9mdW5jKTogTmV3IGZ1bmN0aW9uLgorCShidWlsdGluX2RldmljZSk6IE5ldyB2YXJpYWJsZS4KKwkoYnVpbHRpbl90YWJsZSk6IEFkZGVkIHRoZSBwb2ludGVyIHRvIEJVSUxUSU5fREVWSUNFLgorCShidWlsdGluX2dlb21ldHJ5KSBbR1JVQl9VVElMXTogQWNjZXB0IGV4dHJhIGFyZ3VtZW50cywKKwlDWUxJTkRFUiwgSEVBRCwgU0VDVE9SIGFuZCBUT1RBTF9TRUNUT1IsIGFuZCwgaWYgdGhleSBhcmUgZm91bmQsCisJc2V0IHRoZSBnZW9tZXRyeSBvZiBhIGRyaXZlIHNwZWNpZmllZCB0byB0aGVtLgorCSogZ3J1Yi9hc21zdHViLmMgKGRpc2tzKTogTWFkZSBnbG9iYWwuCisJKGFzc2lnbl9kZXZpY2VfbmFtZSk6IE5ldyBmdW5jdGlvbi4KKworMTk5OS0wOS0wOSAgR29yZG9uIE1hdHppZ2tlaXQgIDxnb3JkQGZpZy5vcmc+CisKKwkqIGRvY3MvZ3J1Yi50ZXhpIChDb21tYW5kcyk6IFN5bmNocm9uaXplIGRlc2NyaXB0aW9ucyB3aXRoCisJYnVpbHRpbnMuYy4KKworCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGhpZGVfZnVuYyk6IFVzZSBzZXRfcGFydGl0aW9uX2hpZGRlbl9mbGFnLgorCSh1bmhpZGVfZnVuYyk6IExpa2V3aXNlLgorCU1hbnkgaGVscCBtZXNzYWdlIGNsZWFudXBzLiAgRnJvbSBQYXZlbCBSb3NraW4uCisKKwkqIHN0YWdlMi9zaGFyZWQuaCAoc2V0X3BhcnRpdGlvbl9oaWRkZW5fZmxhZyk6IERlY2xhcmUuCisKKwkqIHN0YWdlMi9kaXNrX2lvLmMgKHNldF9wYXJ0aXRpb25faGlkZGVuX2ZsYWcpOiBOZXcgZnVuY3Rpb24KKwltZXJnZWQgZnJvbSBoaWRlX3BhcnRpdGlvbiBhbmQgdW5oaWRlX3BhcnRpdGlvbi4gIE1ha2Ugc3VyZSB3ZSBPUgorCXdpdGggdGhlIGludmVyc2Ugb2YgdGhlIGZsYWcgYml0IHJhdGhlciB0aGFuIFhPUmluZyB0byB1bmhpZGUgdGhlCisJcGFydGl0aW9uLgorCisxOTk5LTA5LTEwICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBncnViL2FzbXN0dWIuYyAoX0ZJTEVfT0ZGU0VUX0JJVFMpOiBEZWZpbmVkLgorCShiaW9zZGlzaykgWyFfX2xpbnV4X19dOiBQYXNzIHRoZSBvZmZzZXQgYXJndW1lbnQgYXMgb2ZmX3QKKwlpbnN0ZWFkIG9mIGludCB0byBsc2VlaywgYW5kIGNvbXBhcmUgdGhlIHJldHVybiB2YWx1ZSB3aXRoCisJT0ZGU0VULiBSZXBvcnRlZCBieSBQYXZlbCBSb3NraW4uCisJKGdydWJfc3RhZ2UyKSBbIV9fbGludXhfXyAmJiAhX19HTlVfX106IFByaW50IGEgd2FybmluZyBtZXNzYWdlLgorCisxOTk5LTA5LTA4ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBzdGFnZTIvc3RhZ2UyLmMgKHJ1bl9tZW51KTogSWYgcnVuX3NjcmlwdCBpcyBzdWNjZXNzZnVsbHkKKwlmaW5pc2hlZCwgYnJlYWsgdGhlIGxvb3AuIFJlcG9ydGVkIGJ5IFBhdmVsIFJvc2tpbi4KKwlEbyBub3Qgd2FpdCBhbiBpbnB1dCBjaGFyYWN0ZXIgd2hlbiBGQUxMQkFDS19FTlRSWSBpcyBsZXNzIHRoYW4KKwl6ZXJvLgorCSogc3RhZ2UyL2NtZGxpbmUuYyAocnVuX3NjcmlwdCk6IElmIEVSUk5VTSBpcyBub24temVybywgd2FpdCBhbgorCWlucHV0IGNoYXJhY3Rlciwgd2hldGhlciBGQUxMQkFDSyBpcyBsZXNzIHRoYW4gemVybyBvciBub3QuCisKKzE5OTktMDktMDYgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHN0YWdlMi9idWlsdGlucy5jIChjb25maWdmaWxlX2Z1bmMpOiBOZXcgZnVuY3Rpb24uCisJKGJ1aWx0aW5fY29uZmlnZmlsZSk6IE5ldyB2YXJpYWJsZS4KKwkoYnVpbHRpbl90YWJsZSk6IEFkZGVkIHRoZSBwb2ludGVyIHRvIEJVSUxUSU5fQ09ORklHRklMRS4KKworMTk5OS0wOS0wNiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCUZyb20gUGF2ZWwgUm9za2luOgorCSogc3RhZ2UyL2FzbS5TIFshU1RBR0UxXzVdIChjaGFpbl9zdGFnZTIpOiBEZWxldGVkLgorCVtTVEFHRTFfNV0gKGdldF9jb2RlX2VuZCk6IExpa2V3aXNlLgorCSogc3RhZ2UyL2NoYXJfaW8uYyAoZ3J1Yl9zdHJuY2F0KTogTGlrZXdpc2UuCisJKiBzdGFnZTIvY29tbW9uLmMgW1NUQUdFMV81XSAoc2F2ZWRfbWVtX3VwcGVyKTogTGlrZXdpc2UuCisJKiBzdGFnZTIvc21wLWltcHMuYyAoaW1wc19yZWxlYXNlX2NwdXMpOiBMaWtld2lzZS4KKwkoaW1wc19hbnlfbmV3X2FwaWNzKTogTWFkZSBzdGF0aWMuCisJKGltcHNfZW5hYmxlZCk6IExpa2V3aXNlLgorCShpbXBzX251bV9jcHVzKTogTGlrZXdpc2UuCisJKGltcHNfbGFwaWNfYWRkcik6IExpa2V3aXNlLgorCShpbXBzX2NwdV9hcGljX21hcCk6IExpa2V3aXNlLgorCShpbXBzX2FwaWNfY3B1X21hcCk6IExpa2V3aXNlLgorCisxOTk5LTA5LTA2ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBzdGFnZTIvYnVpbHRpbnMuYyAodGVzdGxvYWRfZnVuYyk6IEZpeCB0aGUgdHlwb3M6IDB4MjAwMDAwMCAtPgorCTB4MjAwMDAwIGFuZCAweDMwMDAwMDAgLT4gMHgzMDAwMDAuCisKKzE5OTktMDktMDYgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwlGcm9tIEhpc2F6dW1pIEtlbmppIDxuZWxAc29yYW5la28uY29tPjoKKwkqIHN0YWdlMi9mc3lzX2Zmcy5jIChtYXBibG9ja19vZmZzZXQpOiBOZXcgdmFyaWFibGUuCisJKG1hcGJsb2NrX2JzaXplKTogTGlrZXdpc2UuCisJKE1BUEJVRik6IE5ldyBtYWNyby4KKwkoTUFQQlVGX0xFTik6IExpa2V3aXNlLgorCShmZnNfbW91bnQpOiBTZXQgTUFQQkxPQ0tfT0ZGU0VUIHRvIC0xLgorCShibG9ja19tYXApOiBBZGRlZCBwYXJ0aWFsIHJlYWQgc3VwcG9ydC4KKworMTk5OS0wOS0wNiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogc3RhZ2UyL2NtZGxpbmUuYyAoZmluZF9jb21tYW5kKTogSWYgQ09NTUFORCBpcyBsZXNzIHRoYW4KKwkoKkJVSUxUSU4pLT5OQU1FIGluIGRpY3Rpb25hcnkgb3JkZXIsIGJyZWFrIHRoZSBsb29wLgorCSogc3RhZ2UyL2J1aWx0aW5zLmMgKGJ1aWx0aW5fY2hhaW5sb2FkZXIpOiBDYXBpdGFsaXplIHRoZQorCXZhcmlhYmxlIG5hbWUgaW4gdGhlIHNob3J0IGRvYy4KKwkoYnVpbHRpbl9jb2xvcik6IExpa2V3aXNlLgorCShidWlsdGluX2dlb21ldHJ5KTogTGlrZXdpc2UuCisJKGJ1aWx0aW5faGVscCk6IExpa2V3aXNlLgorCShidWlsdGluX2hpZGUpOiBMaWtld2lzZS4KKwkoYnVpbHRpbl9pbml0cmQpOiBMaWtld2lzZS4KKwkoYnVpbHRpbl9pbnN0YWxsKTogTGlrZXdpc2UuCisJKGJ1aWx0aW5fa2VybmVsKTogTGlrZXdpc2UuCisJKGJ1aWx0aW5fbW9kdWxlKTogTGlrZXdpc2UuCisJKGJ1aWx0aW5fbW9kdWxlbm91bnppcCk6IExpa2V3aXNlLgorCShidWlsdGluX3BhdXNlKTogTGlrZXdpc2UuCisJKGJ1aWx0aW5fcmVhZCk6IExpa2V3aXNlLgorCShidWlsdGluX3Jvb3QpOiBMaWtld2lzZS4KKwkoYnVpbHRpbl90ZXN0bG9hZCk6IExpa2V3aXNlLgorCShidWlsdGluX3VuaGlkZSk6IExpa2V3aXNlLgorCShidWlsdGluX3VwcGVybWVtKTogTGlrZXdpc2UuCisKKzE5OTktMDktMDUgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwlUaGUgaW50ZXJuYWwgb2YgdGhlIGNvbW1hbmQgaGFuZGxpbmcgaXMgaGVhdmlseSBtb2RpZmllZCwgYW5kCisJYSBuZXcgY29tbWFuZCAiaGVscCIgaXMgYWRkZWQuCisKKwkqIHN0YWdlMS9zdGFnZTEuUzogU2V0IHRoZSBudW1iZXIgb2Ygc2VjdG9ycyBmb3IgU3RhZ2UgMiB0byAxMTAuCisJKiBzdGFnZTEvc3RhZ2UxX2xiYS5TOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9idWlsdGlucy5jOiBOZXcgZmlsZS4KKwkqIHN0YWdlMi9NYWtlZmlsZS5hbSAobGliZ3J1Yl9hX1NPVVJDRVMpOiBBZGRlZCBidWlsdGlucy5jLgorCShzdGFnZTJfZXhlY19TT1VSQ0VTKTogTGlrZXdpc2UuCisJKiBzdGFnZTIvYm9vdC5jIChsb2FkX2ltYWdlKTogUmV0dXJuIGtlcm5lbF90IGluc3RlYWQgaW50LgorCShic2RfYm9vdCk6IENoYW5nZSB0aGUgdHlwZSBvZiB0aGUgZmlyc3QgYXJndW1lbnQgdG8ga2VybmVsX3QuCisJKiBzdGFnZTIvY2hhcl9pby5jIChnZXRfY21kbGluZSk6IERvIG5vdCBhY2NlcHQgdGhlIGFyZ3VtZW50CisJQ09NTUFORFMgYW5kIGFjY2VwdCB0aGUgYXJndW1lbnQgQ09NUExFVElPTi4KKwlQcmludCBjb21wbGV0aW9ucyBvbmx5IGlmIENPTVBMRVRJT04gaXMgbm9uLXplcm8uCisJUHJpbnQgdGhlIGxpc3Qgb2Ygc2hvcnQgZG9jcyB3aGVuIHRoZSBjb21tYW5kIGlzIGNvbXBsZXRlZC4KKwkqIHN0YWdlMi9jbWRsaW5lLmMgW0dSVUJfVVRJTF06IERvIG5vdCBpbmNsdWRlIGFwaWMuaCBhbmQKKwlzbXAtaW1wcy5oLgorCShmYWxsYmFjayk6IERlbGV0ZWQuCisJKHBhc3N3b3JkKTogTGlrZXdpc2UuCisJKGRlYnVnKTogTGlrZXdpc2UuCisJKG5vcm1hbF9jb2xvcik6IExpa2V3aXNlLgorCShoaWdobGlnaHRfY29sb3IpOiBMaWtld2lzZS4KKwkocHJpbnRfY21kbGluZV9tZXNzYWdlKTogTmV3IGZ1bmN0aW9uLgorCShjb21tYW5kcyk6IERlbGV0ZWQuCisJKGRlYnVnX2ZzX3ByaW50X2Z1bmMpOiBMaWtld2lzZS4KKwkoaW5zdGFsbGFkZHIpOiBMaWtld2lzZS4KKwkoaW5zdGFsbGxpc3QpOiBMaWtld2lzZS4KKwkoaW5zdGFsbHNlY3QpOiBMaWtld2lzZS4KKwkoZGVidWdfZnNfYmxvY2tsaXN0X2Z1bmMpOiBMaWtld2lzZS4KKwkoZmluZF9jb21tYW5kKTogTmV3IGZ1bmN0aW9uLgorCShpbml0X2NtZGxpbmUpOiBJbml0aWFsaXplIHRoZSBkYXRhIGZvciB0aGUgY29tbWFuZC1saW5lCisJaW50ZXJmYWNlLiBUaGUgZnVuY3Rpb24gdG8gcHJpbnQgdGhlIG1lc3NhZ2UgaXMgbW92ZWQgdG8KKwlwcmludF9jbWRsaW5lX21lc3NhZ2UuCisJKGVudGVyX2NtZGxpbmUpOiBSZXdyaXR0ZW4gZnJvbSBzY3JhdGNoLiBOb3cgZGVhbCB3aXRoIG9ubHkgdGhlCisJcHVyZSBjb21tYW5kLWxpbmUgYW5kIHRoZSBmdW5jdGlvbiB0byBkZWFsIHdpdGggYSBtZW51IGVudHJ5IGlzCisJbW92ZWQgdG8gcnVuX3NjcmlwdC4KKwkocnVuX3NjcmlwdCk6IE5ldyBmdW5jdGlvbi4KKwkqIHN0YWdlMi9zaGFyZWQuaCAoUEFTU1dPUkRfQlVGKTogTmV3IG1hY3JvLgorCShQQVNTV09SRF9CVUZMRU4pOiBMaWtld2lzZS4KKwkoQ01ETElORV9CVUYpOiBMaWtld2lzZS4KKwkoQ01ETElORV9CVUZMRU4pOiBMaWtld2lzZS4KKwkoTUVOVV9CVUYpOiBMaWtld2lzZS4KKwkoTUVOVV9CVUZMRU4pOiBMaWtld2lzZS4KKwkoZmFsbGJhY2spOiBEZWxldGVkLgorCShmYWxsYmFja19lbnRyeSk6IERlY2xhcmVkLgorCShkZWZhdWx0X2VudHJ5KTogTGlrZXdpc2UuCisJKEJVSUxUSU5fQ01ETElORSk6IE5ldyBtYWNyby4KKwkoQlVJTFRJTl9NRU5VKTogTGlrZXdpc2UuCisJKEJVSUxUSU5fVElUTEUpOiBMaWtld2lzZS4KKwkoc3RydWN0IGJ1aWx0aW4pOiBOZXcgdGFnLgorCShidWlsdGluX3RhYmxlKTogRGVjbGFyZWQuCisJKGNtZGxpbmVfdCk6IERlbGV0ZWQuCisJKGtlcm5lbF90KTogTmV3IHR5cGUuCisJKGtlcm5lbF90eXBlKTogRGVjbGFyZWQuCisJKGdydWJfdGltZW91dCk6IExpa2V3aXNlLgorCShpbml0X2J1aWx0aW5zKTogTGlrZXdpc2UuCisJKGluaXRfY29uZmlnKTogTGlrZXdpc2UuCisJKGZpbmRfY29tbWFuZCk6IExpa2V3aXNlLgorCShwcmludF9jbWRsaW5lX21lc3NhZ2UpOiBMaWtld2lzZS4KKwkocnVuX3NjcmlwdCk6IExpa2V3aXNlLgorCVshU1RBR0UxXzVdIChic2RfYm9vdCk6IERlbGV0ZWQuCisJWyFTVEFHRTFfNV0gKGxvYWRfaW1hZ2UpOiBMaWtld2lzZS4KKwlbIVNUQUdFMV81XSAobG9hZF9tb2R1bGUpOiBMaWtld2lzZS4KKwlbIVNUQUdFMV81XSAobG9hZF9pbml0cmQpOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9zaXplX3Rlc3Q6IFNldCB0aGUgbWF4aW11bSBzaXplIG9mIFN0YWdlIDIgdG8gNTYzMjAuCisJKiBzdGFnZTIvc3RhZ2UyLmMgKGdydWJfdGltZW91dCk6IERlbGV0ZWQuCisJKG1lbnVfdCk6IExpa2V3aXNlLgorCShydW5fbWVudSk6IENoYW5nZWQgdGhlIHJldHVybiB0eXBlIHRvIHZvaWQuCisJVXNlIEZBTExCQUNLX0VOVFJZIGluc3RlYWQgb2YgRkFMTEJBQ0suCisJRG8gbm90IGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgZW50ZXJfY21kbGluZS4KKwkocnVuX21lbnUpIFtHUlVCX1VUSUxdOiBDYWxsIHN0b3AgaW5zdGVhZCBvZiByZXR1cm5pbmcKKwlNRU5VX0FCT1JULgorCShjbWFpbik6IFNldCBNRU5VX0VOVFJJRVMgdG8gTUVOVV9CVUYuCisJQ2FsbCBpbml0X2NvbmZpZyBpbnN0ZWFkIG9mIGNsZWFyaW5nIHRoZSB2YXJpYWJsZXMgZGlyZWN0bHkuCisJVXNlIENNRExJTkVfQlVGIGZvciB0aGUgY29tbWFuZC1saW5lIGJ1ZmZlciBpbnN0ZWFkIG9mIHRoZQorCXN0YWNrLgorCUFkYXB0ZWQgdGhlIGFuYWx5c2lzIHJvdXRpbmUgZm9yIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgdG8gdGhlCisJbmV3IGJ1aWx0aW4gY29tbWFuZHMgaW50ZXJmYWNlLgorCVJ1biBlbnRlcl9jbWRsaW5lIGZvcmV2ZXIuCisJSWYgcnVuX21lbnUgcmV0dXJucywgcmVzdGFydCB0aGUgbG9vcC4KKworMTk5OS0wOS0wNCAgUGF2ZWwgUm9za2luICA8cGF2ZWxfcm9za2luQGdlb2NpdGllcy5jb20+CisKKwkqIGRvY3MvbWVudS5sc3Q6IE1vcmUgbWVhbmluZ2Z1bCBleGFtcGxlcy4gTm90IHVzaW5nICgweDgwLDApCisJbm90YXRpb24gYW55bW9yZS4KKwkqIHN0YWdlMi9zdGFnZTIuYyAocnVuX21lbnUpOiBFcmFzZSB0aGUgZW50ZXJlZCBwYXNzd29yZCBiZWZvcmUKKwlnZXRfY21kbGluZSgpLiBIZWxwIG9uIFRBQiBkaXNhYmxlZCB3aGVuIGVudGVyaW5nIHRoZSBwYXNzd29yZC4KKwkqIHN0YWdlMi9jaGFyX2lvLmMgKGdldF9jbWRsaW5lKTogUmVzdG9yZSBjb21tYW5kLWxpbmUgZXZlbiBpZgorCXRoZXJlIGlzIG5vIGhlbHAgc3RyaW5nLgorCSogY29uZmlndXJlLmluOiAtLWRpc2FibGUtZ3VuemlwIGRpc2FibGVzIGRlY29tcHJlc3Npb24gaW4KKwlzdGFnZTIuCisJKiBzdGFnZTIvZ3VuemlwLmMgW05PX0RFQ09NUFJFU1NJT05dOiBEaXNhYmxlIGFsbCBjb2RlIGlmCisJZGVjb21wcmVzc2lvbiBpcyBkaXNhYmxlZC4KKworMTk5OS0wOS0wMyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogc3RhZ2UyL2Jvb3QuYyAobG9hZF9pbWFnZSk6IFVzZSBQSERSLT5QX1BBRERSIGluc3RlYWQgb2YKKwlQSERSLT5QX1ZBRERSLiBSZXBvcnRlZCBieSBSYW1vbiB2YW4gSGFuZGVsIDx2aGFuZGVsQGNoZW0udnUubmw+LgorCisxOTk5LTA5LTAzICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBkb2NzL2hlbHAybWFuOiBVcGdyYWRlZCB0byAxLjAxMy4KKwkqIGRvY3MvZ3J1Yi44OiBSZWdlbmVyYXRlZC4KKworMTk5OS0wOS0wMiAgUGF2ZWwgUm9za2luICA8cGF2ZWxfcm9za2luQGdlb2NpdGllcy5jb20+CisKKwkqIHN0YWdlMi9jbWRsaW5lLmMgKGVudGVyX2NtZGxpbmUpIFtHUlVCX1VUSUxdOiBBZGQgYSBzcGFjZSBpbgorCXRoZSBMQkEgd2FybmluZwltZXNzYWdlLgorCisxOTk5LTA5LTAyICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJVGhlIGNoYXJhY3RlciBgPScgYWZ0ZXIgYSBjb21tYW5kIGlzIG5vdyBvcHRpb25hbC4KKworCSogc3RhZ2UyL2NoYXJfaW8uYyAoZ2V0X2NtZGxpbmUpOiBTZWFyY2ggZm9yIGEgc3BhY2Ugb3IgYSBlcXVhbAorCWNoYXJhY3RlciBhZnRlciB0aGUgZmlyc3Qgd29yZCBpbiBDTURMSU5FIHdoZW4gVEFCIGxpc3RzCisJY29tcGxldGlvbnMsIGluc3RlYWQgb2YganVzdCBzZWFyY2hpbmcgZm9yIGEgZXFhdWwgY2hhcmFjdGVyLgorCSogc3RhZ2UyL2NtZGxpbmUuYyAoc2tpcF90byk6IFRyZWF0IHRoZSBjaGFyYWN0ZXIgYD0nIGFzIGEgc3BhY2UKKwlpZiBBRlRFUl9FUVVBTCBpcyBub24temVyby4KKwkoY29tbWFuZHMpOiBEZWxldGUgYWxsIHRoZSBlcXVhbCBjaGFyYWN0ZXJzLgorCSogZG9jcy9tZW51LmxzdDogTGlrZXdpc2UuCisJKiBkb2NzL2dydWIudGV4aTogTGlrZXdpc2UuCisKKzE5OTktMDktMDEgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIGdydWIvYXNtc3R1Yi5jIChlbnZfZm9yX2V4aXQpOiBOZXcgdmFyaWFibGUuCisJKGdydWJfc3RhZ2UyKTogRG8gYSBzZXRqbXAgaW4gZG9pdCwgYW5kIHdoZW4gaXQgcmV0dXJucworCW5vbi16ZXJvLCBzZXQgU1RBVFVTIHRvIDEgaWYgRVJSTlVNIGlzIG5vbi16ZXJvLgorCShzdG9wKTogQ2FsbCBsb25nam1wIGluc3RlYWQgb2YgZXhpdC4KKworMTk5OS0wOC0zMSAgUGF2ZWwgUm9za2luICA8cGF2ZWxfcm9za2luQGdlb2NpdGllcy5jb20+CisKKwkqIHN0YWdlMi9ib290LmMgW0dSVUJfVVRJTF0gKGJzZF9ib290X2VudHJ5KTogTmV3IGZ1bmN0aW9uLgorCShic2RfYm9vdCkgW0dSVUJfVVRJTF06IFNldCBFTlRSWV9BRERSIHRvIEJTRF9CT09UX0VOVFJZIHRvIGZha2UKKwl0aGUgKkJTRCBib290LgorCisxOTk5LTA4LTMxICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBzdGFnZTIvZnN5c19mYXQuYyAoZmF0X2NyZWF0ZV9ibG9ja2xpc3QpOiBDYXN0IEZBVF9CVUYgdG8KKwl1bnNpZ25lZCBzaG9ydCAqIGluc3RlYWQgb2YgdW5zaWduZWQgbG9uZyAqLiBTdWdnZXN0ZWQgYnkgUGF2ZWwKKwlSb3NraW4uCisKKzE5OTktMDgtMzAgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwlGcm9tIEVkd2FyZCBLaWxsaXBzIDxla2lsbGlwc0B0cml0b24ubmV0PjoKKwkqIHN0YWdlMi9jbWRsaW5lLmMgKGNvbW1hbmRzKTogQWRkZWQgaGlkZSBhbmQgdW5oaWRlLgorCShlbnRlcl9jbWRsaW5lKTogTGlrZXdpc2UuCisJKiBzdGFnZTIvZGlza19pby5jICh1bmhpZGVfcGFydGl0aW9uKTogTmV3IGZ1bmN0aW9uLgorCShoaWRlX3BhcnRpdGlvbik6IExpa2V3aXNlLgorCSogc3RhZ2UyL3BjX3NsaWNlLmggKFBDX1NMSUNFX1RZUEVfSElEREVOX0ZMQUcpOiBOZXcgbWFjcm8uCisKKzE5OTktMDgtMjkgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwlGcm9tIFBhdmVsIFJvc2tpbiA8cGF2ZWxfcm9za2luQGdlb2NpdGllcy5jb20+OgorCSogc3RhZ2UyL2ZzeXNfbWluaXguYyAobmFtZWxlbik6IE5ldyB2YXJpYWJsZS4KKwkoTUlOSVhfTkFNRV9MRU4pOiBEZWxldGVkLgorCShtaW5peF9tb3VudCk6IFNldCBOQU1FTEVOIHRvIDE0IGlmIFNVUFJUQkxPQ0stPlNfTUFHSUMgaXMKKwlNSU5JWF9TVVBFUl9NQUdJQywgYW5kIHNldCBOQU1FTEVOIHRvIDMwIGlmIGl0IGlzCisJTUlOSVhfU1VQRVJfTUFHSUMyLgorCShtaW5peF9kaXIpOiBVc2UgTkFNRUxFTiBpbnN0ZWFkIG9mIE1JTklYX05BTUVfTEVOLgorCisxOTk5LTA4LTI5ICBQYXZlbCBSb3NraW4gIDxwYXZlbF9yb3NsaW5AZ2VvY2l0aWVzLmNvbT4KKworCSogZ3J1Yi9NYWtlZmlsZS5hbSwgc3RhZ2UxL01ha2VmaWxlLmFtLCBzdGFnZTIvTWFrZWZpbGUuYW06CisJQXZvaWQgdXNpbmcgdmFyaWFibGVzIGluY2xvc2VkIGluICdAJyBiZWNhdXNlIHRoZXkgY2Fubm90IGJlCisJb3ZlcnJpZGRlbiBhdCB0aGUgbWFrZSB0aW1lLgorCisxOTk5LTA4LTI5ICBQYXZlbCBSb3NraW4gIDxwYXZlbF9yb3NraW5AZ2VvY2l0aWVzLmNvbT4KKworCSogc3RhZ2UyL2ZzeXNfZmF0LmMgKGZhdF9jcmVhdGVfYmxvY2tsaXN0KTogUmV0dXJuIDEgZm9yIHRoZQorCXJvb3QgZGlyZWN0b3J5IG9uIEZBVDEyIGFuZCBGQVQxNi4KKworMTk5OS0wOC0yNyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogc3RhZ2UyL2Jvb3QuYyAobG9hZF9pbWFnZSk6IEFjY2VwdCB0d28gYXJndW1lbnRzLCBLRVJORUwgYW5kCisJQVJHLiBBbmQgdXNlIHRoZW0gaW5zdGVhZCBvZiBDVVJfQ01ETElORS4KKwkobG9hZF9tb2R1bGUpOiBBY2NlcHQgdHdvIGFyZ3VtZW50cywgTU9EVUxFIGFuZCBBUkcuIEFuZCB1c2UKKwl0aGVtIGluc3RlYWQgb2YgQ1VSX0NNRExJTkUuCisJKGxvYWRfaW5pdHJkKTogQWNjZXB0IG9uZSBhcmd1bWVudCwgSU5JVFJELiBBbmQgdXNlIGl0IGluc3RlYWQKKwlvZiBDVVJfQ01ETElORS4KKwkoYnNkX2Jvb3QpOiBBY2NlcHQgb25lIGFkZGl0aW9uYWwgYXJndW1lbnQsIEFSRy4gQW5kIHVzZSBpdAorCWluc3RlYWQgb2YgQ1VSX0NNRExJTkUuCisJKiBzdGFnZTIvY21kbGluZS5jIChlbnRlcl9jbWRsaW5lKTogVXNlIE1CX0NNRExJTkUgaW5zdGVhZCBvZgorCUhFQVAgZm9yIHRoZSBNdWx0aWJvb3QgY29tbWFuZC1saW5lIGJ1ZmZlci4KKwkqIHN0YWdlMi9zaGFyZWQuaCAoTUJfQ01ETElORV9CVUYpOiBOZXcgbWFjcm8uCisJKE1CX0NNRExJTkVfQlVGTEVOKTogTGlrZXdpc2UuCisKKzE5OTktMDgtMjYgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIGRvY3MvTWFrZWZpbGUuYW0gW0dSVUJfTUFJTlRdIChncnViLjgpOiBUaGUgYXJndW1lbnQgZm9yIHRoZQorCW9wdGlvbiAtLW5hbWUgaXMgY2hhbmdlZCB0byAidGhlIGdydWIgc2hlbGwiLgorCSogZG9jcy9ncnViLjg6IFJlZ2VuZXJhdGVkLgorCSogZG9jcy9ncnViLnRleGk6IERvIG5vdCB1c2UgdGhlIG5hbWUgInRoZSBTdGFnZSAyIGVtdWxhdG9yIiBhbnkKKwltb3JlLiBVc2UgdGhlIG5hbWUgInRoZSBncnViIHNoZWxsIiBpbnN0ZWFkLgorCisxOTk5LTA4LTI2ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJRnJvbSBLbGF1cyBSZWljaGwgPGtsYXVzLnJlaWNobEBhbGNhdGVsLmF0PjoKKwkqIHN0YWdlMi9mc3lzX21pbml4LmM6IE5ldyBmaWxlLgorCSogc3RhZ2UyL3NpemVfdGVzdDogQWRkZWQgYSBjaGVjayBmb3IgdGhlIHNpemUgb2YgbWluaXhfc3RhZ2UxXzUuCisJKiBzdGFnZTIvTWFrZWZpbGUuYW0gKGxpYmdydWJfYV9TT1VSQ0VTKTogQWRkZWQgZnN5c19taW5peC5jLgorCShsaWJncnViX2FfQ0ZMQUdTKTogQWRkZWQgLURGU1lTX01JTklYPTEuCisJKG5vZGlzdF9wa2dkYXRhX0RBVEEpOiBBZGRlZCBtaW5peF9zdGFnZTFfNS4KKwkobm9pbnN0X1BST0dSQU1TKTogQWRkZWQgbWluaXhfc3RhZ2UxXzUuZXhlYy4KKwkoc3RhZ2UyX2V4ZWNfU09VUkNFUyk6IEFkZGVkIGZzeXNfbWluaXguYy4KKwkobWluaXhfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTKTogTmV3IHZhcmlhYmxlLgorCShtaW5peF9zdGFnZTFfNV9leGVjX0NGTEFHUyk6IExpa2V3aXNlLgorCShtaW5peF9zdGFnZTFfNV9leGVjX0xERkxBR1MpOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9wY19zbGljZS5oIChQQ19TTElDRV9UWVBFX01JTklYKTogTmV3IG1hY3JvLgorCSogc3RhZ2UyL2Rpc2tfaW8uYyAoZnN5c190YWJsZSkgW0ZTWVNfTUlOSVhdOiBBZGRlZCBtaW5peCBlbnRyeS4KKwkqIHN0YWdlMi9maWxlc3lzLmggW0ZTWVNfTUlOSVhdIChGU1lTX01JTklYX05VTSk6IFNldCB0byAxLgorCVshRlNZU19NSU5JWF0gKEZTWVNfTUlOSVhfTlVNKTogU2V0IHRvIDAuCisJWyFOVU1fRlNZU10gKE5VTV9GU1lTKTogQWRkZWQgRlNZU19NSU5JWF9OVU0uCisJKiBzdGFnZTIvc2hhcmVkLmggKFNUQUdFMl9JRF9NSU5JWF9TVEFHRTFfNSk6IE5ldyBtYWNyby4KKwlbU1RBR0UxXzUgJiYgRlNZU19NSU5JWF0gKFNUQUdFMl9JRCk6IFNldCB0bworCVNUQUdFMl9JRF9NSU5JWF9TVEFHRTFfNS4KKwkqIGdydWIvTWFrZWZpbGUuYW0gKEFNX0NGTEFHUyk6IEFkZGVkIC1ERlNZU19NSU5JWD0xLgorCSogY29uZmlndXJlLmluICgtLWRpc2FibGUtbWluaXgpOiBOZXcgb3B0aW9uLgorCisxOTk5LTA4LTI1ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJRnJvbSBKb2NoZW4gSG9lbmlja2UgPGpvY2hlbkBnbnUub3JnPjoKKwkqIHN0YWdlMi9mYXQuaCAoRkFUX0JQQl9GQVRfU0VDVE9SU18xNik6IE5ldyBtYWNyby4KKwkoRkFUX0JQQl9GQVRfU0VDVE9SU18zMik6IExpa2V3aXNlLgorCShGQVRfQlBCX0lTX0ZBVDMyKTogTGlrZXdpc2UuCisJKEZBVF9CUEJfUk9PVF9ESVJfQ0xVU1RFUik6IExpa2V3aXNlLgorCShGQVRfQlBCX0ZBVF9TRUNUT1JTKTogSWYgRkFUX0JQQl9GQVRfU0VDVE9SU18xNiByZXR1cm5zCisJYSBub24temVybyB2YWx1ZSwgcmV0dXJuIGl0LiBPdGhlcndpc2UgcmV0dXJuCisJRkFUX0JQQl9GQVRfU0VDVE9SU18zMi4KKwkoRkFUX0RJUkVOVFJZX0ZJUlNUX0NMVVNURVIpOiBDb3JyZWN0ZWQuCisJKiBzdGFnZTIvZnN5c19mYXQuYyAocm9vdF9kaXIpOiBOZXcgdmFyaWFibGUuCisJKGZhdF9tb3VudCk6IFVzZSB0aGUgbWFjcm8gSVNfUENfU0xJQ0VfVFlQRV9GQVQgaW5zdGVhZCBvZgorCWNoZWNraW5nIGZvciBlYWNoIGZzIHR5cGVzIGRpcmVjdGx5LgorCU9taXQgdGhlID42NCBzZWN0b3JzIGNoZWNrLgorCUlmIHRoZSBjdXJyZW50IGZzIHR5cGUgaXMgRkFUMzIsIHRoZW4gc2V0IEZBVF9TSVpFIHRvIDggYW5kCisJZ2V0IHRoZSByb290IGZyb20gQlBCLgorCShmYXRfY3JlYXRlX2Jsb2NrbGlzdCk6IFVzZSB0aGUgbWFjcm8gU0VDVE9SX1NJWkUgaW5zdGVhZCBvZiBhCisJbWFnaWMgbnVtYmVyLgorCShmYXRfZGlyKTogU2V0IE1BUCB0byBST09UX0RJUiBpbnN0ZWFkIG9mIC0xLgorCSogc3RhZ2UyL3BjX3NsaWNlLmggKFBDX1NMSUNFX1RZUEVfRkFUMzIpOiBOZXcgbWFjcm8uCisJKFBDX1NMSUNFX1RZUEVfRkFUMzJfTEJBKTogTGlrZXdpc2UuCisJKFBDX1NMSUNFX1RZUEVfRkFUMTZfTEJBKTogTGlrZXdpc2UuCisJKElTX1BDX1NMSUNFX1RZUEVfRkFUKTogTGlrZXdpc2UuCisKKzE5OTktMDgtMjUgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHN0YWdlMi9mc3lzX2Zmcy5jIChmZnNfbW91bnQpOiBEbyBub3Qgc2hpZnQgdGhlIGZzIHR5cGUKKwlGU19CU0RGRlMuIFJlcG9ydGVkIGJ5IFRha2VoaXJvIFN1enVraQorCTx0YWtlaGlyb0Bjb3JhbC5vY24ubmUuanA+LgorCSogc3RhZ2UyL2ZzeXNfZmF0LmMgKGZhdF9tb3VudCk6IERvIG5vdCBzaGlmdCB0aGUgZnMgdHlwZQorCUZTX01TRE9TLgorCisxOTk5LTA4LTEzICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJUGF2ZWwgUm9za2luJ3MgcGF0Y2ggdGhhdCBhZGRzIG5ldyBvcHRpb25zIHRvIGRpc2FibGUgYXJiaXRyYXJ5CisJZmlsZXN5c3RlbXMgaXMgaGVhdmlseSBtb2RpZmllZCBhbmQgYXBwbGllZC4KKworCSogY29uZmlndXJlLmluICgtLWRpc2FibGUtZXh0MmZzKTogTmV3IG9wdGlvbi4KKwkoLS1kaXNhYmxlLWZhdCk6IExpa2V3aXNlLgorCSgtLWRpc2FibGUtZmZzKTogTGlrZXdpc2UuCisJKEZTWVNfQ0ZMQUdTKTogTmV3IHZhcmlhYmxlLiBTZXQgdG8gZmlsZXN5c3RlbXMgdGhlIHVzZXIgY2hvb3NlLgorCSogZ3J1Yi9NYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTKTogQWRkZWQgLURGU1lTX0VYVDJGUz0xLAorCS1ERlNZU19GQVQ9MSBhbmQgLURGU1lTX0ZGUz0xLgorCSogc3RhZ2UyL01ha2VmaWxlLmFtIChsaWJncnViX2FfQ0ZMQUdTKTogTGlrZXdpc2UuCisJKHN0YWdlMl9leGVjX0NGTEFHUyk6IEFkZGVkIEBGU1lTX0NGTEFHU0AuCisJKiBzdGFnZTIvZmlsZXN5cy5oCisJWyEoRlNZU19GRlMgfHwgRlNZU19GQVQgfHwgRlNZU19FWFQyRlMpXSAoRlNZU19GRlMpOiBEZWxldGVkLgorCVshKEZTWVNfRkZTIHx8IEZTWVNfRkFUIHx8IEZTWVNfRVhUMkZTKV0gKEZTWVNfRkFUKTogTGlrZXdpc2UuCisJWyEoRlNZU19GRlMgfHwgRlNZU19GQVQgfHwgRlNZU19FWFQyRlMpXSAoRlNZU19FWFQyRlMpOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9mc3lzX2V4dDJmcy5jIFshRlNZU19FWFQyRlNdOiBEbyBub3QgZGVmaW5lIGFueXRoaW5nLgorCSogc3RhZ2UyL2ZzeXNfZmF0LmMgWyFGU1lTX0ZBVF06IExpa2V3aXNlLgorCSogc3RhZ2UyL2ZzeXNfZmZzLmMgWyFGU1lTX0ZGU106IExpa2V3aXNlLgorCisxOTk5LTA4LTEyICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBzdGFnZTEvc3RhZ2UxX2xiYS5TOiBVc2UgU1RBR0UxX0RSUF9BRERSIGZvciB0aGUgYWRkcmVzcyBvZgorCWRyaXZlIHBhcmFtZXRlcnMgaW5zdGVhZCBvZiBEUklWRV9QQVJBTUVURVIuCisJKGRyaXZlX3BhcmFtZXRlcik6IERlbGV0ZWQuCisJKiBzdGFnZTEvc3RhZ2UxLmggKFNUQUdFMV9EUlBfQUREUik6IE5ldyBtYWNyby4KKwkoU1RBR0UxX0RSUF9TSVpFKTogTGlrZXdpc2UuCisKKzE5OTktMDgtMTEgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHN0YWdlMi9iaW9zLmMgKGdldF9kaXNraW5mbyk6IEluIExCQSBtb2RlLCBzZXQgVE9UQUxfU0VDVE9SUworCXRvIHRoZSBsb3cgMzJiaXRzIG9mIERSUC5UT1RBTF9TRUNUT1JTIGluc3RlYWQgb2YgdGhlIG11bHRpcGxlCisJb2YgQ0hTLgorCSogc3RhZ2UyL2NtZGxpbmUuYyAoZW50ZXJfY21kbGluZSkgW0dSVUJfVVRJTF06IEluIHRoZSBjb21tYW5kCisJImdlb21ldHJ5IiwgcHJpbnQgdGhlIGRldmljZSBmaWxlIG5hbWUgaW5zdGVhZCBvZiBDSFMvTEJBCisJaW5mb3JtYXRpb24uCisJKiBzdGFnZTIvc2hhcmVkLmggKGRldmljZV9tYXApOiBEZWNsYXJlZC4KKwkqIGdydWIvYXNtc3R1Yi5jIChkZXZpY2VfbWFwKTogRGVmaW5lZCBhcyBhIGdsb2JhbCB2YXJpYWJsZQorCWluc3RlYWQgb2YgYSBsb2NhbCB2YXJpYWJsZS4KKworMTk5OS0wOC0xMCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCVN1cHBvcnQgdGhlIE5ldEJTRCBhbmQgT3BlbkJTRCBwYXJ0aXRpb24gc2xpY2VzLgorCisJKiBzdGFnZTIvcGNfc2xpY2UuaCAoUENfU0xJQ0VfVFlQRV9CU0QpOiBEZWxldGVkLgorCShQQ19TTElDRV9UWVBFX0ZSRUVCU0QpOiBOZXcgbWFjcm8uCisJKFBDX1NMSUNFX1RZUEVfT1BFTkJTRCk6IExpa2V3aXNlLgorCShQQ19TTElDRV9UWVBFX05FVEJTRCk6IExpa2V3aXNlLgorCShJU19QQ19TTElDRV9UWVBFX0JTRF9XSVRIX0ZTKTogTGlrZXdpc2UuCisJKElTX1BDX1NMSUNFX1RZUEVfQlNEKTogTGlrZXdpc2UuCisJKiBzdGFnZTIvZnN5c19mZnMuYyAoZmZzX21vdW50KTogVXNlIHRoZSBtYWNybworCUlTX1BDX1NMSUNFX1RZUEVfQlNEX1dJVEhfRlMgaW5zdGVhZCBvZiBjaGVja2luZyBpZgorCUNVUlJFQ1RfU0xJQ0UgaXMgZXF1YWwgdG8gdGhlIEJTRCBwYXJ0aXRpb24gdHlwZSBkaXJlY3RseS4KKwkqIHN0YWdlMi9mc3lzX2V4dDJmcy5jIChleHQyZnNfbW91bnQpOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9mc3lzX2ZhdC5jIChmYXRfbW91bnQpOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9kaXNrX2lvLmMgKGNoZWNrX0JTRF9wYXJ0cyk6IFNldCB0aGUgbG93IGJpdHMgb2YKKwlDVVJSRU5UX1NMSUNFIHRvIFBDX1NMSUNFX1RZUEVfRlJFRUJTRCBpbnN0ZWFkIG9mCisJUENfU0xJQ0VfVFlQRV9CU0QuCisJKHJlYWxfb3Blbl9wYXJ0aXRpb24pOiBVc2UgdGhlIG1hY3JvIElTX1BDX1NMSUNFX1RZUEVfQlNEIGluc3RlYWQKKwlvZiBjaGVja2luZyBpZiBDVVJSRU5UX1NMSUNFIGlzCWVxdWFsIHRvIHRoZSBCU0QgcGFydGl0aW9uIHR5cGUKKwlkaXJlY3RseS4KKworMTk5OS0wOC0wOSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogc3RhZ2UyL2NtZGxpbmUuYyAoY29tbWFuZHMpOiBBZGRlZCBnZW9tZXRyeS4KKwkoZW50ZXJfY21kbGluZSk6IElmIENVUl9IRUFQIGhhcyB0aGUgc3RyaW5nICJnZW9tZXRyeSIsIHByaW50CisJb3V0IHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIGRyaXZlIHRoYXQgdGhlIGFyZ3VtZW50IHJlcHJlc2VudHMuCisKKzE5OTktMDgtMDkgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHN0YWdlMi9zdGFnZTIuYyAocnVuX21lbnUpOiBUZXJtaW5hdGUgdGhlIHN0cmluZyBQQVNTV09SRAorCWJlZm9yZSBjaGVja2luZyBpZiBFTlRFUkVEIGlzIGlkZW50aWNhbCB0byBQQVNTV09SRC4gUmVwb3J0ZWQKKwlieSBNYXJrIEx1bmRlYmVyZyA8YWEwMjZAcGdmbi5iYy5jYT4uCisKKzE5OTktMDgtMDggIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHN0YWdlMi9zdGFnZTIuYyAoc2V0X2xpbmVfbm9ybWFsKTogTmV3IGZ1bmN0aW9uLgorCShzZXRfbGluZV9oaWdobGlnaHQpOiBMaWtld2lzZS4KKwkocnVuX21lbnUpOiBEbyBub3QgY2FsbCB0aGUgZnVuY3Rpb24gc2V0X2xpbmUgZGlyZWN0bHkgYW55CisJbG9uZ2VyLCBjYWxsIHNldF9saW5lX25vcm1hbCBhbmQgc2V0X2xpbmVfaGlnaGxpZ2h0IGluc3RlYWQuCisKKwlGcm9tIFBhdmVsIFJvc2tpbjoKKwkqIHN0YWdlMi9zdGFnZTIuYyAocnVuX21lbnUpIFtHUlVCX1VUSUxdOiBRdWl0IHdoZW4gcHVzaGluZyB0aGUKKwlrZXkgYHEnLgorCisxOTk5LTA4LTA1ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBhY2luY2x1ZGUubTQgKGdydWJfQVNNX1BSRUZJWF9SRVFVSVJFTUVOVCk6IE5ldyBmdW5jdGlvbi4KKwkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBncnViX0FTTV9QUkVGSVhfUkVRVUlSRU1FTlQsIGFuZCBkZWZpbmUKKwlBRERSMzIgYW5kIERBVEEzMiBiYXNlZCBvbiB0aGUgcmVzdWx0LgorCSogc3RhZ2UyL2FzbS5TOiBSZXBsYWNlIGFkZHIzMiBhbmQgZGF0YTMyIHByZWZpeGVzIHdpdGgJQUREUjMyCisJYW5kIERBVEEzMiByZXNwZWN0aXZlbHkuCisKKzE5OTktMDgtMDUgIFBhdmVsIFJvc2tpbiAgPHBhdmVsX3Jvc2tpbkBnZW9jaXRpZXMuY29tPgorCisJKiBzdGFnZTIvYm9vdC5jIChsb2FkX2ltYWdlKTogVXNlIFJBV19BRERSIG1hY3JvIHdoZW4gbG9hZGluZworCWFuIGEub3V0IGtlcm5lbC4KKworMTk5OS0wOC0wNCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogc3RhZ2UyL2FzbS5TOiBNYWtlIGVhY2ggb2YgdGhlIGFkZHIzMiBhbmQgZGF0YTMyIHByZWZpeGVzCisJYXBwZWFyIGluIHRoZSBzYW1lIGxpbmUgYXMgaXQgbW9kaWZpZXMsIGFzIHRoZSBnYXMgbWFudWFsIGluCisJYmludXRpbHMtMi45LjUuMC40IHNheXMgIml0IG11c3QgYmUgaW4gdGhlIHNhbWUgbGluZSIuCisKKzE5OTktMDgtMDQgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIGJvb3QuYyAobG9hZF9pbWFnZSk6IEZpeCBhIHN0cmNtcCB0ZXN0LiBSZXBvcnRlZCBieSBQYXZlbAorCVJvc2tpbiA8cGF2ZWxfcm9za2luQGdlb2NpdGllcy5jb20+LgorCisxOTk5LTA4LTAzICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJRnJvbSAiRGFuIEouIFdhbHRlcnMiIDxkandAY3MudXRleGFzLmVkdT46CisJKiBzdGFnZTIvaTM4Ni1lbGYuaCAoRUlfQlJBTkQpOiBOZXcgbWFjcm8uCisJKiBzdGFnZTIvYm9vdC5jIChsb2FkX2ltYWdlKTogSWYgdGhlIGtlcm5lbCBpcyBFTEYsIGNoZWNrIGlmIGl0CisJaXMgYSBGcmVlQlNEIGtlcm5lbCBhcyB3ZWxsIGFzIGEgTXVsdGlib290IGtlcm5lbCwgYW5kIGlmIGl0IGlzCisJYSBGcmVlQlNEIGtlcm5lbCwgdGhlbiBtYXNrIEVOVFJZX0FERFIgc2luY2UgRnJlZUJTRCByZXF1aXJlcworCXRoYXQuIExpa2V3aXNlLCBtYXNrIE1FTUFERFIuCisJKGJzZF9ib290KTogU2V0IHRoZSBiaV9zeW10YWIgYW5kIHRoZSBiaV9lc3ltdGFiIG1lbWJlcnMgb2YgQkkKKwlvbmx5IGlmIE1CSS5GTEFHUyBoYXMgdGhlIGZsYWcgTUJfSU5GT19BT1VUX1NZTVMuIE90aGVyd2lzZSwKKwljbGVhciB0aGVtLgorCisxOTk5LTA3LTMwICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJRnJvbSBQYXZlbCBSb3NraW4gPHBhdmVsX3Jvc2tpbkBnZW9jaXRpZXMuY29tPjoKKwkqIGdydWIvZ2V0b3B0LmM6IE5ldyBmaWxlLiBDb3BpZWQgZnJvbSB0ZXhpbmZvLTMuMTJuLgorCSogZ3J1Yi9nZXRvcHQxLmM6IExpa2V3aXNlLgorCSogZ3J1Yi9nZXRvcHQuaDogTGlrZXdpc2UuCisJKiBncnViL01ha2VmaWxlLmFtIChncnViX1NPVVJDRVMpOiBBZGRlZCBnZXRvcHQuYywgZ2V0b3B0MS5jIGFuZAorCWdldG9wdC5oLgorCSogY29uZmlndXJlLmluOiBDaGVjayBmb3Igc3RyaW5nLmggYW5kIHN0cmluZ3MuaC4KKwkqIGdydWIvYXNtc3R1Yi5jIChncnViX3N0YWdlMik6IEZpeCBhIG1pc29yZGVyaW5nIGluIHRoZSBvdXRwdXQKKwlmb3JtYXQgb2YgdGhlIGlubGluZSBhc3NlbWJseS4KKworMTk5OS0wNy0zMCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCUZyb20gUGF2ZWwgUm9za2luIDxwYXZlbF9yb3NraW5AZ2VvY2l0aWVzLmNvbT46CisJKiBzdGFnZTIvYXNtLlMgKGdldF9kaXNraW5mb19zdGFuZGFyZCk6IElmIHRoZSBudW1iZXIgb2Ygc2VjdG9ycworCXJldHVybmVkIGlzIHplcm8sIHRoZW4gcmV0dXJuIGFuIGVycm9yIGNvZGUsIGV2ZW4gaWYgbm9uLWNhcnJpZXIuCisKKzE5OTktMDctMTUgIEdvcmRvbiBNYXR6aWdrZWl0ICA8Z29yZEB6ZW4uZmlnLm9yZz4KKworCSogZG9jcy9NYWtlZmlsZS5hbSAoZ3J1Yi5pbmZvKTogVXNlIGFuIHVnbHkgaGFjayB0byBkb3duZ3JhZGUKKyAJZ3J1Yi50ZXhpIHNvIHRoYXQgaXQgd29ya3Mgd2l0aCBEZWJpYW4ncyB2ZXJzaW9uIG9mIHRleGluZm8uCisKKzE5OTktMDctMjYgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHN0YWdlMi9iaW9zLmMgKGdldF9kaXNraW5mbyk6IFdoZW4gRFJJVkUgaXMgYSBmbG9wcHkgZHJpdmUsCisJdHJ5IHN0YW5kYXJkIHByb2JlIHJvdXRpbmUgYXQgZmlyc3QuIFJlcG9ydGVkIGJ5IFBldGVyIEFzdHJhbmQKKwk8YWx0aWNAbHlzYXRvci5saXUuc2U+LgorCisJKiBncnViL21haW4uYyAobWFpbik6IENhbGwgcHJpbnRmIGluc3RlYWQgb2YgZ3J1Yl9wcmludGYuCisJUmVwb3J0ZWQgYnkgS2xhdXMgUmVpY2hsIDxhODcwOTE4MkB1bmV0LnVuaXZpZS5hYy5hdD4uCisKKzE5OTktMDctMTUgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHN0YWdlMi9jbWRsaW5lLmMgKHNraXBfdG8pOiBEb24ndCBpbmNyZWFzZSBDTURMSU5FIGlmIHRoZQorCWNoYXJhY3RlciB0byB3aGljaCBDTURMSU5FIHBvaW50cyBpcyBOVUwuCisKKwkqIHN0YWdlMi9NYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IFJlbW92ZWQgc21wLWltcHMuYy4KKwkoc3RhZ2UyX2V4ZWNfU09VUkNFUyk6IEFkZGVkIHNtcC1pbXBzLmMuCisJKiBzdGFnZTIvY21kbGluZS5jIFshR1JVQl9VVElMXSAoSU1QU19ERUJVRykgKEtFUk5FTF9QUklOVCkKKwkoQ01PU19XUklURV9CWVRFKSAoQ01PU19SRUFEX0JZVEUpIChQSFlTX1RPX1ZJUlRVQUwpCisJKFZJUlRVQUxfVE9fUEhZUykgKGluYikgKG91dGIpIChjbW9zX3dyaXRlX2J5dGUpCisJKGNtb3NfcmVhZF9ieXRlKTogVGhlc2UgYXJlIG5vdyBkZWZpbmVkIGluIC4uLgorCSogc3RhZ2UyL3NtcC1pbXBzLmMgKElNUFNfREVCVUcpIChLRVJORUxfUFJJTlQpCisJKENNT1NfV1JJVEVfQllURSkgKENNT1NfUkVBRF9CWVRFKSAoUEhZU19UT19WSVJUVUFMKQorCShWSVJUVUFMX1RPX1BIWVMpIChpbmIpIChvdXRiKSAoY21vc193cml0ZV9ieXRlKQorCShjbW9zX3JlYWRfYnl0ZSk6IC4uLiBoZXJlLgorCSogc3RhZ2UyL2NtZGxpbmUuYyBbIUdSVUJfVVRJTF06IEluY2x1ZGUgYXBpYy5oIGFuZCBzbXAtaW1wcy5oLgorCisxOTk5LTA3LTE0ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJVGhlIGZ1bmN0aW9uIHVuZ2V0Y2ggaXMgc2ltdWxhdGVkIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHVzZSBhCisJYnVnZ3kgY3Vyc2VzLgorCisJKiBncnViL2FzbXN0dWIuYyBbSEFWRV9MSUJDVVJTRVNdIChzYXZlX2NoYXIpOiBOZXcgdmFyaWFibGUuCisJKGdldGtleSkgW0hBVkVfTElCQ1VSU0VTXTogSWYgU0FWRV9DSEFSIGlzIG5vdCBFUlIsIHJldHVybgorCVNBVkVfQ0hBUiBhbmQgY2xlYXIgaXQuCisJKGNoZWNra2V5KSBbSEFWRV9MSUJDVVJTRVNdOiBJZiBTQVZFX0NIQVIgaXMgbm90IEVSUiwgcmV0dXJuCisJU0FWRV9DSEFSLiBJZiBDIGlzIG5vdCBFUlIsIHNldCBTQVZFX0NIQVIgdG8gQy4KKworMTk5OS0wNy0xNCAgUGF2ZWwgUm9za2luICA8cGF2ZWxfcm9za2luQGdlb2NpdGllcy5jb20+CisKKwkqIHN0YWdlMi9jaGFyX2lvLmMgKGdldF9jbWRsaW5lKSBbR1JVQl9VVElMXTogUmVjb2duaXplCisJYmFja3NwYWNlIHdoZW4gbmN1cnNlcyBmYWlscyB0byBkbyB0aGlzLgorCisJKiBncnViL2FzbXN0dWIuYyAoZ3J1Yl9zdGFnZTIpIFtIQVZFX0xJQkNVUlNFU106IENhbGwgd3RpbWVvdXQKKwlpbnN0ZWFkIG9mIG5vZGVsYXkuCisJKGdldGtleSkgW0hBVkVfTElCQ1VSU0VTXTogTGlrZXdpc2UuCisKKzE5OTktMDctMTQgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHN0YWdlMS9zdGFnZTFfbGJhLlMgKHByb2JlX3ZhbHVlcyk6IE5ldyB2YXJpYWJsZS4gVGhpcyBpcyBub3QKKwl1c2VkIGFjdHVhbGx5LCBidXQgcHJldmVudHMgYGluc3RhbGwnIGNvbW1hbmQgZnJvbSBmYWlsaW5nCisJYm9ndXNseS4KKworMTk5OS0wNy0xNCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCUFsbCBjb25zdGFudHMgaW4gc3RhZ2UxcyBhcmUgbW92ZWQgdG8gc3RhZ2UxLmggYW5kIHJlbmFtZWQKKwlhcHByb3ByaWF0ZWx5LCBhbmQgaW5jbHVkZSBzdGFnZTEuaCBpbnN0ZWFkLgorCisJKiBncnViL01ha2VmaWxlLmFtIChBTV9DRkxBR1MpOiBBZGRlZCB0aGUgaW5jbHVkZSBwYXRoIHRvIHN0YWdlMS4KKwkqIHN0YWdlMi9NYWtlZmlsZS5hbSAoSU5DTFVERVMpOiBOZXcgdmFyaWFibGUuCisJKiBzdGFnZTEvTWFrZWZpbGUuYW0gKHN0YWdlMV9leGVjX1NPVVJDRVMpOiBBZGRlZCBzdGFnZTEuaAorCShzdGFnZTFfbGJhX2V4ZWNfU09VUkNFUyk6IExpa2V3aXNlLgorCSogc3RhZ2UxL3N0YWdlMS5oOiBOZXcgZmlsZS4KKwkqIHN0YWdlMS9zdGFnZTEuUyAoU0lHTkFUVVJFKTogUmVuYW1lZCB0byAuLi4KKwkqIHN0YWdlMS9zdGFnZTEuaCAoU1RBR0UxX1NJR05BVFVSRSk6IC4uLiB0aGlzLgorCSogc3RhZ2UxL3N0YWdlMS5TIChCUEJFTkQpOiBSZW5hbWVkIHRvIC4uLgorCSogc3RhZ2UxL3N0YWdlMS5oIChTVEFHRTFfQlBCRU5EKTogLi4uIHRoaXMuCisJKiBzdGFnZTEvc3RhZ2UxLlMgKFBBUlRTVEFSVCk6IFJlbmFtZWQgdG8gLi4uCisJKiBzdGFnZTEvc3RhZ2UxLmggKFNUQUdFMV9QQVJUU1RBUlQpOiAuLi4gdGhpcy4KKwkqIHN0YWdlMS9zdGFnZTEuUyAoTUlOUEFSTVNJWik6IFJlbmFtZWQgdG8gLi4uCisJKiBzdGFnZTEvc3RhZ2UxLmggKFNUQUdFMV9NSU5QQVJNU0laRSk6IC4uLiB0aGlzLgorCSogc3RhZ2UxL3N0YWdlMS5TIChMSVNUU0laKTogUmVuYW1lZCB0byAuLi4KKwkqIHN0YWdlMS9zdGFnZTEuaCAoU1RBR0UxX0xJU1RTSVpFKTogLi4uIHRoaXMuCisJKiBzdGFnZTEvc3RhZ2UxLlMgKFJFQUxTVEFDSyk6IFJlbmFtZWQgdG8gLi4uCisJKiBzdGFnZTEvc3RhZ2UxLmggKFNUQUdFMV9TVEFDS1NFRyk6IC4uLiB0aGlzLgorCSogc3RhZ2UxL3N0YWdlMS5TIChCVUZGRVJTRUcpOiBSZW5hbWVkIHRvIC4uLgorCSogc3RhZ2UxL3N0YWdlMS5oIChTVEFHRTFfQlVGRkVSU0VHKTogLi4uIHRoaXMuCisJKiBzdGFnZTEvc3RhZ2UxLlMgKEJJT1NfSERfRkxBRyk6IFJlbmFtZWQgdG8gLi4uCisJKiBzdGFnZTEvc3RhZ2UxLmggKFNUQUdFMV9CSU9TX0hEX0ZMQUcpOiAuLi4gdGhpcy4KKwkqIHN0YWdlMS9zdGFnZTFfbGJhLlMgKFNJR05BVFVSRSk6IFJlbW92ZWQuCisJKiBzdGFnZTEvc3RhZ2UxX2xiYS5TIChCUEJFTkQpOiBMaWtld2lzZS4KKwkqIHN0YWdlMS9zdGFnZTFfbGJhLlMgKFBBUlRTVEFSVCk6IExpa2V3aXNlLgorCSogc3RhZ2UxL3N0YWdlMV9sYmEuUyAoTUlOUEFSTVNJWik6IExpa2V3aXNlLgorCSogc3RhZ2UxL3N0YWdlMV9sYmEuUyAoTElTVFNJWik6IExpa2V3aXNlLgorCSogc3RhZ2UxL3N0YWdlMV9sYmEuUyAoUkVBTFNUQUNLKTogTGlrZXdpc2UuCisJKiBzdGFnZTEvc3RhZ2UxX2xiYS5TIChCVUZGRVJTRUcpOiBMaWtld2lzZS4KKwkqIHN0YWdlMS9zdGFnZTFfbGJhLlMgKEJJT1NfSERfRkxBRyk6IExpa2V3aXNlLgorCisJKiBzdGFnZTEvc3RhZ2UxLlMgKHN0YWdlMV9pZCk6IE5ldyB2YXJpYWJsZS4KKwkqIHN0YWdlMS9zdGFnZTFfbGJhLlMgKHN0YWdlMV9pZCk6IExpa2V3aXNlLgorCSogc3RhZ2UxL3N0YWdlMS5oIChDT01QQVRfVkVSU0lPTl9NSU5PUik6IFNldCB0byAyLgorCShTVEFHRTFfSURfT0ZGU0VUKTogTmV3IG1hY3JvLgorCShTVEFHRTFfSURfQ0hTKTogTGlrZXdpc2UuCisJKFNUQUdFMV9JRF9MQkEpOiBMaWtld2lzZS4KKwkqIHN0YWdlMi9jbWRsaW5lLmMgKGVudGVyX2NtZGxpbmUpIFshR1JVQl9VVElMXTogV2hlbiBydW5uaW5nCisJdGhlIGNvbW1hbmQgYGluc3RhbGwnIGFuZCBTVEFHRTFfRklMRSBpcyBzdGFnZTFfbGJhLCBjaGVjayBpZgorCUxCQSBpcyBzdXBwb3J0ZWQuCisJKGVudGVyX2NtZGxpbmUpIFtHUlVCX1VUSUxdOiBJbiB0aGUgc2FtZSBjYXNlIGFib3ZlLCBjaGVjayBvbmx5CisJaWYgQ1VSUkVOVF9EUklWRSBpcyBhIGhhcmQgZGlzayBhbmQsIGlmIHNvLCBwcmludCBhIHdhcm5pbmcKKwltZXNzYWdlLCBiZWNhdXNlIC9zYmluL2dydWIgY2Fubm90IGRldGVjdCBpZiBMQkEgaXMgc3VwcG9ydGVkIG9yCisJbm90LgorCisJKiBzdGFnZTEvc3RhZ2UxX2xiYS5TOiBGaXggYSBidWcgdGhhdCBpbmNvcnJlY3RseSBhc3NpZ25zIHRoZQorCXNlZ21lbnQgb2YgYnVmZmVyIGFkZHJlc3MuCisKKzE5OTktMDctMTMgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHN0YWdlMi9ib290LmMgKGxvYWRfaW1hZ2UpOiBXaGVuIHJlbW92aW5nICJ2Z2E9Li4uIiwgbWVtbW92ZQorCXRoZSBsZW5ndGggb2YgVkdBX0VORCBwbHVzIG9uZS4KKworMTk5OS0wNy0xMiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogc3RhZ2UyL2Jpb3MuYyAoZ2V0X2Rpc2tpbmZvKTogSW4gTEJBIG1vZGUsIGNvbXB1dGUKKwlUT1RBTF9TRUNUT1JTIGZyb20gRFJQIGluc3RlYWQgb2YgR0VPTUVUUlkuCisJQ2xlYXIgR0VPTUVUUlktPkZMQUdTIGZpcnN0LgorCisJKiBzdGFnZTIvYm9vdC5jIChsb2FkX2ltYWdlKTogRml4IGludmVydGVkIGxpbmVzLgorCisxOTk5LTA3LTEyICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJU3VwcG9ydCBMaW51eCB2aWRlbyBtb2RlIHNlbGVjdGlvbi4KKworCSogc3RhZ2UyL3NoYXJlZC5oIChMSU5VWF9WSURfTU9ERV9PRkZTRVQpOiBOZXcgbWFjcm8uCisJKExJTlVYX1ZJRF9NT0RFX05PUk1BTCk6IExpa2V3aXNlLgorCShMSU5VWF9WSURfTU9ERV9FWFRFTkRFRCk6IExpa2V3aXNlLgorCShMSU5VWF9WSURfTU9ERV9BU0spOiBMaWtld2lzZS4KKwlbIVdJVEhPVVRfTElCQ19TVFVCU10gKHN0cmxlbik6IExpa2V3aXNlLgorCShncnViX3N0cmxlbik6IERlY2xhcmVkLgorCSogc3RhZ2UyL2Jvb3QuYyAobG9hZF9pbWFnZSk6IEFkZGVkIExpbnV4IHZpZGVvIG1vZGUgc2VsZWN0aW9uLgorCSogc3RhZ2UyL2NoYXJfaW8uYyBbIVNUQUdFMV81XSAoZ3J1Yl9zdHJsZW4pOiBOZXcgZnVuY3Rpb24uCisKKzE5OTktMDctMTIgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHN0YWdlMi9jaGFyX2lvLmMgKHByaW50X2Vycm9yKTogUHJpbnQgRVJSTlVNIGluIHRoZSBmb3JtYXQgb2YKKwkldSBpbnN0ZWFkIG9mICVkLgorCShjb252ZXJ0X3RvX2FzY2lpKSBbU1RBR0UxXzVdOiBFbGltaW5hdGUgdGhlIGB4JyBhbmQgYGQnCisJaGFuZGxpbmcgY29kZS4KKwkoZ3J1Yl9wcmludGYpOiBEZWNsYXJlIEZPUk1BVCBhcyBgY29uc3QgY2hhciAqJy4KKwkoZ3J1Yl9wcmludGYpIFtTVEFHRTFfNV06IEVsaW1pbmF0ZSB0aGUgYHgnIGFuZCBgZCcgaGFuZGxpbmcKKwljb2RlLgorCShnZXRfYmFzZWRfZGlnaXQpOiBSZW1vdmVkLgorCShzYWZlX3BhcnNlX21heGludCk6IFJlbW92ZSB1bm5lY2Vzc2FyeSBgcmVnaXN0ZXInIHByZWZpeGVzLAorCWJlY2F1c2UgR0NDIGRvZXMgYmV0dGVyIG9wdGltaXphdGlvbi4KKwlEZWNsYXJlIERJR0lUIGFzIGB1bnNpZ25lZCBpbnQnIGFuZCBjYWxjdWxhdGUgdGhlIHZhbHVlIGJ5IG1vcmUKKwljb21wYWN0IGluc3RydWN0aW9ucy4KKwlbIVNUQUdFMV81XSAoZ3J1Yl9zdHJuY2F0KTogRGVjbGFyZSBTMiBhcyBgY29uc3QgY2hhciAqJy4KKwlbIVNUQUdFMV81XSAoZ3J1Yl9zdHJjbXApOiBEZWNsYXJlIFMxIGFuZCBTMiBhcyBgY29uc3QgY2hhciAqJy4KKwlbIVNUQUdFMV81XSAoZ3J1Yl9zdHJzdHIpOiBMaWtld2lzZS4KKwkoZ3J1Yl9tZW1tb3ZlKTogRGVjbGFyZSBGUk9NIGFzIGBjb25zdCBjaGFyIConLgorCVRoZSBjb3B5IGNvZGUgaXMgcmVwbGFjZWQgd2l0aCBpbmxpbmUgYXNzZW1ibHkgY29kZSBzdG9sZW4gZnJvbQorCUxpbnV4LTIuMi4yLgorCisJKiBzdGFnZTIvc2hhcmVkLmggKGdydWJfcHJpbnRmKSA6IENvcnJlY3RlZC4KKwkoZ3J1Yl9zdHJuY2F0KTogTGlrZXdpc2UuCisJKGdydWJfbWVtbW92ZSk6IExpa2V3aXNlLgorCShncnViX3N0cnN0cik6IExpa2V3aXNlLgorCShncnViX3N0cmNtcCk6IExpa2V3aXNlLgorCisxOTk5LTA3LTExICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBzdGFnZTEvc3RhZ2UxLlMgKHNlY3RvcnMpOiBDaGFuZ2UgdGhlIHNpemUgdG8gbG9uZy4KKwkoaGVhZHMpOiBMaWtld2lzZS4KKwkoc2VjdG9yX3N0YXJ0KTogTmV3IHZhcmlhYmxlLgorCShoZWFkX3N0YXJ0KTogTGlrZXdpc2UuCisJKGN5bGluZGVyX3N0YXJ0KTogTGlrZXdpc2UuCisJKGZpbmFsX2luaXQpOiBTZXQgJXNpIHRvIFNFQ1RPUlMgZmlyc3QsIGFuZCB1c2UgJXNpIGZvciBtZW1vcnkKKwlyZWZlcmVuY2VzLgorCVplcm8gJWVheCBzbyB0aGF0IHRoZSBoaWdoIDE2IGJpdHMgYXJlIGFsd2F5cyB6ZXJvLgorCVNldCAlZGkgdG8gRklSU1RMSVNUIC0gTElTVFNJWiBpbnN0ZWFkIG9mIEZJUlNUTElTVC4KKwkoYm9vdGxvb3ApOiBPbWl0IHRoZSBjb21wbGV4IENIUyByZWNvbXB1dGF0aW9uLCBhbmQgYWx3YXlzCisJY29tcHV0ZSB0aGVtIGZyb20gTEJBIGFkZHJlc3MgaW5zdGVhZC4KKwlDYWxsIDMyYml0cyBkaXYgaW5zdHJ1Y3Rpb25zIGluc3RlYWQgb2YgMTZiaXRzIGRpdiBpbnN0cnVjdGlvbnMuCisJVXBkYXRlIHRoZSBwb3NpdGlvbiB3aGVyZSB0byBsb2FkIGRhdGEgZnJvbSBhdCB0aGUgZW5kIG9mIHRoaXMKKwlsb29wLCBpbnN0ZWFkIG9mIHRoZSBiZWdpbm5pbmcuCisKKwkqIHN0YWdlMS9zdGFnZTFfbGJhLlM6IE5ldyBmaWxlLgorCSogc3RhZ2UxL01ha2VmaWxlLmFtIChub2Rpc3RfcGtnZGF0YV9EQVRBKTogQWRkZWQgc3RhZ2UxX2xiYS4KKwkoTERGTEFHUyk6IE5ldyB2YXJpYWJsZS4KKwkobm9pbnN0X1BST0dSQU1TKTogQWRkZWQgc3RhZ2UxX2xiYS5leGVjLgorCShzdGFnZTFfbGJhX2V4ZWNfU09VUkNFUyk6IE5ldyB2YXJpYWJsZS4KKwkoJTogJS5leGVjKTogTmV3IHJ1bGUuCisKKzE5OTktMDYtMjggIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIGdydWIvbWFpbi5jIChtYWluKTogVGhlIHRoaXJkIGFyZ3VtZW50IGZvciBzdHJ0b3VsIGlzIGNoYW5nZWQKKwl0byAwIGluIHRoZSBjYXNlIHdoZXJlIGFuIG9wdGlvbiBpcyBPUFRfSU5TVEFMTF9QQVJUSUlPTi4KKwlSZXBvcnRlZCBieSBQYXZlbCBSb3NraW4gPHBhdmVsX3Jvc2tpbkBnZW9jaXRpZXMuY29tPi4KKworMTk5OS0wNi0yNyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogc3RhZ2UyL3NoYXJlZC5oIChTVEFHRTJfU1RBR0UyX0lEKTogTmV3IG1hY3JvLgorCShTVEFHRTJfVkVSX1NUUl9PRkZTKTogU2V0IHRvIDB4ZC4KKwkoU1RBR0UyX0lEX1NUQUdFMik6IE5ldyBtYWNyby4KKwkoU1RBR0UyX0lEX0ZGU19TVEFHRTFfNSk6IExpa2V3aXNlLgorCShTVEFHRTJfSURfRTJGU19TVEFHRTFfNSk6IExpa2V3aXNlLgorCShTVEFHRTJfSURfRkFUX1NUQUdFMV81KTogTGlrZXdpc2UuCisJKFNUQUdFMl9JRCkgWyFTVEFHRTFfNV06IERlZmluZWQgYXMgU1RBR0UyX0lEX1NUQUdFMi4KKwkoU1RBR0UyX0lEKSBbU1RBR0UxXzVdIFtGU1lTX0ZGU106IERlZmluZWQgYXMKKwlTVEFHRTJfSURfRkZTX1NUQUdFMV81LgorCShTVEFHRTJfSUQpIFtTVEFHRTFfNV0gW0ZTWVNfRVhUMkZTXTogRGVmaW5lZCBhcworCVNUQUdFMl9JRF9TVEFHRTFfNS4KKwkoU1RBR0UyX0lEKSBbU1RBR0UxXzVdIFtGU1lTX0ZBVF06IERlZmluZWQgYXMKKwlTVEFHRTJfSURfRkFUX1NUQUdFMV81LgorCShDT01QQVRfVkVSU0lPTl9NSU5PUik6IFNldCB0byAxLgorCSogc3RhZ2UyL2FzbS5TIChzdGFnZTJfaWQpOiBOZXcgdmFyaWFibGUuCisJKiBzdGFnZTEvc3RhZ2UxLlM6IENoYW5nZSB0aGUgbWlub3IgdmVyc2lvbiB0byAxLgorCisxOTk5LTA2LTI3ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBjb25maWd1cmUuaW4gKENGTEFHUyk6IFNldCB0byAiLWciLCBzaW5jZSBvbmx5IHRoaXMgZmxhZyBpcworCWFsd2F5cyBzaGFyYWJsZS4KKwkoU1RBR0UxX0NGTEFHUyk6IFNldCB0byAiLU8yIiwgYW5kIEFDX1NVQlNUIHRoaXMuCisJKEdSVUJfQ0ZMQUdTKTogTGlrZXdpc2UuCisJKHNhdmVkX0NGTEFHUyk6IE5ldyB2YXJpYWJsZSBmb3IgdGVtcG9yYXJpbHkgc2F2aW5nIENGTEFHUy4KKwkoU1RBR0UyX0NGTEFHUyk6IFNldCB0byAiLU9zIiBpZiB0aGlzIG9wdGlvbiBpcyBhdmFpbGFibGUsCisJb3RoZXJ3aXNlIHNldCB0byAiLWZuby1zdHJlbmd0aC1yZWR1Y2UgLWZuby11bnJvbGwtbG9vcHMiLAorCWFuZCB0aGVuIEFDX1NVQlNUIHRoaXMuCisJKiBncnViL01ha2VmaWxlLmFtIChBTV9DRkxBR1MpOiBQcmVwZW5kZWQgQEdSVUJfQ0ZMQUdTQC4KKwkqIHN0YWdlMS9NYWtlZmlsZS5hbSAoQU1fQ0ZMQUdTKTogUHJlcGVuZGVkIEBTVEFHRTFfQ0ZMQUdTQC4KKwkqIHN0YWdlMi9NYWtlZmlsZS5hbSAobGliZ3J1Yl9hX0NGTEFHUyk6IFByZXBlbmVkIEBHUlVCX0NGTEFHU0AuCisJKFNUQUdFMl9DT01QSUxFKTogUHJlcGVuZGVkIEBTVEFHRTJfQ0ZMQUdTQC4KKworCSogc3RhZ2UyL2FzbS5TIChjaGFpbl9zdGFnZTIpOiBQYXNzIENVUlJFTlRfUEFSVElUSU9OIGFuZAorCUNVUlJFTlRfRFJJVkUsIGluc3RlYWQgb2YgSU5TVEFMTF9QQVJUSVRJT04gYW5kIEJPT1RfRFJJVkUuCisKKzE5OTktMDYtMjcgIFBhdmVsIFJvc2tpbiAgPHBhdmVsX3Jvc2tpbkBnZW9jaXRpZXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IHNldCBDRkxBR1MgdG8gIi1PcyAtZyIgZm9yIGNvbXBpbGVycyB3aGljaAorCXVuZGVyc3RhbmQgIi1PcyIgaWYgQ0ZMQUdTIGlzIG5vdCBhbHJlYWR5IHNldC4gVXNlCisJIi1PMiAtZm5vLXN0cmVuZ3RoLXJlZHVjZSAtZm5vLXVucm9sbC1sb29wcyAtZyIgZm9yIG9sZGVyIGdjYworCXZlcnNpb25zLgorCisxOTk5LTA2LTI1ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBzdGFnZTIvZGlza19pby5jIChhdHRlbXB0X21vdW50KSBbU1RBR0UxXzVdOiBTZXQgRlNZU19UWVBFIHRvCisJMCwgYW5kIHNldCBpdCB0byBOVU1fRlNZUyBpZiBtb3VudCBmYWlscy4KKwkocmVhbF9vcGVuX3BhcnRpdGlvbik6IENhbGwgcmF3cmVhZCBpbiBTdGFnZSAxLjUgYXMgd2VsbC4KKworMTk5OS0wNi0yNCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogTWFrZWZpbGUuYW0gKFNVQkRJUlMpOiBDaGFuZ2UgdGhlIG9yZGVyIG9mIHRoZSBkaXJlY3RvcmllcyBzbworCXRoYXQgYSBkaXJlY3Rvcnkgd2lsbCBiZSBtYWRlIGFmdGVyIHRoZSBkZXBlbmRlbnQgZGlyZWN0b3JpZXMKKwlhcmUgbWFkZS4gYGdydWInIGRlcGVuZHMgb24gYHN0YWdlMicsIGFuZCBgZG9jcycgZGVwZW5kcyBvbgorCWBncnViJy4gRG8gbm90IG1ha2UgaW4gcGFyYWxsZWwuCisJKiBkb2NzL2hlbHAybWFuOiBDb3BpZWQgZnJvbSBoZWxwMm1hbi0xLjAxMiwgd2hpY2ggY29udGFpbnMgbXkKKwlwcmV2aW91cyBjaGFuZ2UuCisJKiBkb2NzL2dydWIuODogUmVnZW5lcmF0ZWQuCisKKzE5OTktMDYtMjQgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwlCdWlsZCBwcm9jZXNzIGlzIGNsZWFuZWQgdXAuIFN0YWdlIDIgYW5kIFN0YWdlIDEuNSdzIGFyZSBhbGwKKwlidWlsdCBpbiB0aGUgZGlyZWN0b3J5IHN0YWdlMi4KKworCUZyb20gUGF2ZWwgUm9za2luIDxwYXZlbF9yb3NraW5AZ2VvY2l0aWVzLmNvbT46CisJKiBNYWtlZmlsZS5hbSAoU1VCRElSUyk6IGUyZnNfc3RhZ2UxXzUsIGZmc19zdGFnZTFfNSwKKwlmYXRfc3RhZ2UxXzUgYW5kIHNoYXJlZF9zcmMgYXJlIHJlbW92ZWQuCisJKERJU1RDTEVBTkZJTEVTKTogRGVsZXRlZC4KKwkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19QUk9HX1JBTkxJQi4KKwkoQUNfSU5JVCk6IENoYW5nZSB0aGUgYXJndW1lbnQgdG8gc3RhZ2UyL3N0YWdlMi5jLgorCShMSUJTKTogUmVuYW1lZCB0byAuLi4KKwkoR1JVQl9MSUJTKTogLi4uIHRoaXMsIGFuZCBjYWxsIEFDX1NVQlNUIGZvciB0aGlzLgorCU91ciBvd24gcnVsZXMgYXJlIHJlbW92ZWQuCisJKEFDX09VVFBVVCk6IGUyZnNfc3RhZ2UxXzUvTWFrZWZpbGUsIGZmc19zdGFnZTFfNS9NYWtlZmlsZSwKKwlmYXRfc3RhZ2UxXzUvTWFrZWZpbGUgYW5kIHNoYXJlZF9zcmMvTWFrZWZpbGUgYXJlIHJlbW92ZWQuCisJKiBkb2NzL01ha2VmaWxlLmFtIChIRUxQMk1BTik6IFRoZSBwcmVmaXggJChzcmNkaXIpIGlzIHJlbW92ZWQuCisJW0dSVUJfTUFJTlRdOiBQcmVwZW5kICQoc3JjZGlyKSB0byAkKEhFTFAyTUFOKS4KKwkqIGUyZnNfc3RhZ2UxXzUvTWFrZWZpbGUuYW06IERlbGV0ZWQuCisJKiBlMmZzX3N0YWdlMV81L01ha2VmaWxlLmluOiBMaWtld2lzZS4KKwkqIGZhdF9zdGFnZTFfNS9NYWtlZmlsZS5hbTogTGlrZXdpc2UuCisJKiBmYXRfc3RhZ2UxXzUvTWFrZWZpbGUuaW46IExpa2V3aXNlLgorCSogZmZzX3N0YWdlMV81L01ha2VmaWxlLmFtOiBMaWtld2lzZS4KKwkqIGZmc19zdGFnZTFfNS9NYWtlZmlsZS5pbjogTGlrZXdpc2UuCisJKiBncnViL01ha2VmaWxlLmFtIChDTEVBTkZJTEVTKTogTGlrZXdpc2UuCisJKENPTVBJTEUpOiBMaWtld2lzZS4KKwkoSU5DTFVERVMpOiBMaWtld2lzZS4KKwkoREVQX0ZJTEVTKTogTGlrZXdpc2UuCisJKEBTSEFSRURfU1JDX1JVTEVTQCk6IExpa2V3aXNlLgorCShBTV9DRkxBR1MpOiBOZXcgdmFyaWFibGUuCisJKGdydWJfTERBREQpOiBTZXQgdG8gdGhlIGxpYnJhcnkgbGliZ3J1Yi5hIGFuZCBAR1JVQl9MSUJTQC4KKwkqIHNoYXJlZF9zcmMvTWFrZWZpbGUuYW06IERlbGV0ZWQuCisJKiBzaGFyZWRfc3JjL01ha2VmaWxlLmluOiBMaWtld2lzZS4KKwkqIHNoYXJlZF9zcmMvYXBpYy5oOiBNb3ZlZCB0byAuLi4KKwkqIHN0YWdlMi9hcGljLmg6IC4uLiBoZXJlLgorCSogc2hhcmVkX3NyYy9hc20uUzogTW92ZWQgdG8gLi4uCisJKiBzdGFnZTIvYXNtLlM6IC4uLiBoZXJlLgorCSogc2hhcmVkX3NyYy9iaW9zLmM6IE1vdmVkIHRvIC4uLgorCSogc3RhZ2UyL2Jpb3MuYzogLi4uIGhlcmUuCisJKiBzaGFyZWRfc3JjL2Jvb3QuYzogTW92ZWQgdG8gLi4uCisJKiBzdGFnZTIvYm9vdC5jOiAuLi4gaGVyZS4KKwkqIHNoYXJlZF9zcmMvY2hhcl9pby5jOiBNb3ZlZCB0byAuLi4KKwkqIHN0YWdlMi9jaGFyX2lvLmM6IC4uLiBoZXJlLgorCSogc2hhcmVkX3NyYy9jbWRsaW5lLmM6IE1vdmVkIHRvIC4uLgorCSogc3RhZ2UyL2NtZGxpbmUuYzogLi4uIGhlcmUuCisJKiBzaGFyZWRfc3JjL2NvbW1vbi5jOiBNb3ZlZCB0byAuLi4KKwkqIHN0YWdlMi9jb21tb24uYzogLi4uIGhlcmUuCisJKiBzaGFyZWRfc3JjL2RlZnMuaDogTW92ZWQgdG8gLi4uCisJKiBzdGFnZTIvZGVmcy5oOiAuLi4gaGVyZS4KKwkqIHNoYXJlZF9zcmMvZGlyLmg6IE1vdmVkIHRvIC4uLgorCSogc3RhZ2UyL2Rpci5oOiAuLi4gaGVyZS4KKwkqIHNoYXJlZF9zcmMvZGlza19pbm9kZS5oOiBNb3ZlZCB0byAuLi4KKwkqIHN0YWdlMi9kaXNrX2lub2RlLmg6IC4uLiBoZXJlLgorCSogc2hhcmVkX3NyYy9kaXNrX2lub2RlX2Zmcy5oOiBNb3ZlZCB0byAuLi4KKwkqIHN0YWdlMi9kaXNrX2lub2RlX2Zmcy5oOiAuLi4gaGVyZS4KKwkqIHNoYXJlZF9zcmMvZGlza19pby5jOiBNb3ZlZCB0byAuLi4KKwkqIHN0YWdlMi9kaXNrX2lvLmM6IC4uLiBoZXJlLgorCSogc2hhcmVkX3NyYy9mYXQuaDogTW92ZWQgdG8gLi4uCisJKiBzdGFnZTIvZmF0Lmg6IC4uLiBoZXJlLgorCSogc2hhcmVkX3NyYy9maWxlc3lzLmg6IE1vdmVkIHRvIC4uLgorCSogc3RhZ2UyL2ZpbGVzeXMuaDogLi4uIGhlcmUuCisJKiBzaGFyZWRfc3JjL2ZyZWVic2QuaDogTW92ZWQgdG8gLi4uCisJKiBzdGFnZTIvZnJlZWJzZC5oOiAuLi4gaGVyZS4KKwkqIHNoYXJlZF9zcmMvZnMuaDogTW92ZWQgdG8gLi4uCisJKiBzdGFnZTIvZnMuaDogLi4uIGhlcmUuCisJKiBzaGFyZWRfc3JjL2ZzeXNfZXh0MmZzLmM6IE1vdmVkIHRvIC4uLgorCSogc3RhZ2UyL2ZzeXNfZXh0MmZzLmM6IC4uLiBoZXJlLgorCSogc2hhcmVkX3NyYy9mc3lzX2ZhdC5jOiBNb3ZlZCB0byAuLi4KKwkqIHN0YWdlMi9mc3lzX2ZhdC5jOiAuLi4gaGVyZS4KKwkqIHNoYXJlZF9zcmMvZnN5c19mZnMuYzogTW92ZWQgdG8gLi4uCisJKiBzdGFnZTIvZnN5c19mZnMuYzogLi4uIGhlcmUuCisJKiBzaGFyZWRfc3JjL2d1bnppcC5jOiBNb3ZlZCB0byAuLi4KKwkqIHN0YWdlMi9ndW56aXAuYzogLi4uIGhlcmUuCisJKiBzaGFyZWRfc3JjL2kzODYtZWxmLmg6IE1vdmVkIHRvIC4uLgorCSogc3RhZ2UyL2kzODYtZWxmLmg6IC4uLiBoZXJlLgorCSogc2hhcmVkX3NyYy9pbWdhY3RfYW91dC5oOiBNb3ZlZCB0byAuLi4KKwkqIHN0YWdlMi9pbWdhY3RfYW91dC5oOiAuLi4gaGVyZS4KKwkqIHNoYXJlZF9zcmMvbWJfaGVhZGVyLmg6IE1vdmVkIHRvIC4uLgorCSogc3RhZ2UyL21iX2hlYWRlci5oOiAuLi4gaGVyZS4KKwkqIHNoYXJlZF9zcmMvbWJfaW5mby5oOiBNb3ZlZCB0byAuLi4KKwkqIHN0YWdlMi9tYl9pbmZvLmg6IC4uLiBoZXJlLgorCSogc2hhcmVkX3NyYy9wY19zbGljZS5oOiBNb3ZlZCB0byAuLi4KKwkqIHN0YWdlMi9wY19zbGljZS5oOiAuLi4gaGVyZS4KKwkqIHNoYXJlZF9zcmMvc2hhcmVkLmg6IE1vdmVkIHRvIC4uLgorCSogc3RhZ2UyL3NoYXJlZC5oOiAuLi4gaGVyZS4KKwkqIHNoYXJlZF9zcmMvc21wLWltcHMuYzogTW92ZWQgdG8gLi4uCisJKiBzdGFnZTIvc21wLWltcHMuYzogLi4uIGhlcmUuCisJKiBzaGFyZWRfc3JjL3NtcC1pbXBzLmg6IE1vdmVkIHRvIC4uLgorCSogc3RhZ2UyL3NtcC1pbXBzLmg6IC4uLiBoZXJlLgorCSogc2hhcmVkX3NyYy9zdGFnZTFfNS5jOiBNb3ZlZCB0byAuLi4KKwkqIHN0YWdlMi9zdGFnZTFfNS5jOiAuLi4gaGVyZS4KKwkqIHNoYXJlZF9zcmMvc3RhZ2UyLmM6IE1vdmVkIHRvIC4uLgorCSogc3RhZ2UyL3N0YWdlMi5jOiAuLi4gaGVyZS4KKwkqIHN0YWdlMS9NYWtlZmlsZS5hbSAocGtnZGF0YV9EQVRBKTogUmVuYW1lZCB0byAuLi4KKwkobm9kaXN0X3BrZ2RhdGFfREFUQSk6IC4uLiB0aGlzLgorCShDT01QSUxFKTogRGVsZXRlZC4KKwkoQU1fQ0ZMQUdTKTogTmV3IHZhcmlhYmxlLgorCSogc3RhZ2UyL01ha2VmaWxlLmFtOiBDb21wbGV0ZWx5IHJld3JpdHRlbiBmcm9tIHNjcmF0Y2guCisJKFRFU1RTKTogTmV3IHZhcmlhYmxlLgorCShub2luc3RfU0NSSVBUUyk6IExpa2V3aXNlLgorCShub2luc3RfSEVBREVSUyk6IExpa2V3aXNlLgorCShFWFRSQV9ESVNUKTogU2V0IHRvIHNtcC1pbXBzLmMgYW5kICQobm9pbnN0X1NDUklQVFMpLgorCShub2luc3RfTElCUkFSSUVTKTogTmV3IHZhcmlhYmxlLgorCShsaWJncnViX2FfU09VUkNFUyk6IExpa2V3aXNlLgorCShsaWJncnViX2FfQ0ZMQUdTKTogTGlrZXdpc2UuCisJKHBrZ2RhdGFfREFUQSk6IERlbGV0ZWQuCisJKG5vZGlzdF9wa2dkYXRhX0RBVEEpOiBOZXcgdmFyaWFibGUuCisJKE1PU1RMWUNMRUFORklMRVMpOiBTZXQgdG8gJChub2luc3RfUFJPR1JBTVMpLgorCShDT01QSUxFKTogRGVsZXRlZC4KKwkoSU5DTFVERVMpOiBMaWtld2lzZS4KKwkoc3RhZ2UyX2V4ZWNfTERBREQpOiBMaWtld2lzZS4KKwkoREVQX0ZJTEVTKTogTGlrZXdpc2UuCisJKHN0YWdlMl9leGVjX1NPVVJDRVMpOiBTZXQgdG8gdGhlIGFjdHVhbCBzb3VyY2UgZmlsZXMgaW5zdGVhZCBvZgorCWR1bW15LgorCShESVNURklMRVMpOiBEZWxldGVkLgorCShzdGFnZTIuZXhlYyk6IExpa2V3aXNlLgorCShzdGFnZTIpOiBMaWtld2lzZS4KKwkoQFNIQVJFRF9TUkNfUlVMRVNAKTogTGlrZXdpc2UuCisJKG5vaW5zdF9QUk9HUkFNUyk6IFNldCB0byBleGVjdXRhYmxlIGZvcm1hdHMgb2YgU3RhZ2UgMiBhbmQKKwlTdGFnZSAxLjUncy4KKwkoU1RBR0UyX0xJTkspOiBOZXcgdmFyaWFibGUuCisJKFNUQUdFMl9DT01QSUxFKTogTGlrZXdpc2UuCisJKFNUQUdFMV81X0xJTkspOiBMaWtld2lzZS4KKwkoU1RBR0UxXzVfQ09NUElMRSk6IExpa2V3aXNlLgorCShzdGFnZTJfZXhlY19DRkxBR1MpOiBMaWtld2lzZS4KKwkoc3RhZ2UyX2V4ZWNfTERGTEFHUyk6IExpa2V3aXNlLgorCShlMmZzX3N0YWdlMV81X2V4ZWNfU09VUkNFUyk6IExpa2V3aXNlLgorCShlMmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKTogTGlrZXdpc2UuCisJKGUyZnNfc3RhZ2UxXzVfZXhlY19MREZMQUdTKTogTGlrZXdpc2UuCisJKGZhdF9zdGFnZTFfNV9leGVjX1NPVVJDRVMpOiBMaWtld2lzZS4KKwkoZmF0X3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKTogTGlrZXdpc2UuCisJKGZhdF9zdGFnZTFfNV9leGVjX0xERkxBR1MpOiBMaWtld2lzZS4KKwkoZmZzX3N0YWdlMV81X2V4ZWNfU09VUkNFUyk6IExpa2V3aXNlLgorCShmZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpOiBMaWtld2lzZS4KKwkoZmZzX3N0YWdlMV81X2V4ZWNfTERGTEFHUyk6IExpa2V3aXNlLgorCSglIDogJS5leGVjKTogTmV3IHJ1bGUuCisKKwkqIHN0YWdlMi9zaXplX3Rlc3Q6IE5ldyBmaWxlLCBmb3IgY2hlY2tpbmcgZm9yIHRoZSBzaXplcyBvZgorCVN0YWdlIDIgYW5kIFN0YWdlIDEuNSdzLgorCisxOTk5LTA2LTI0ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBzdGFnZTEvc3RhZ2UxLlM6IENhbGwgdGVzdGIgaW5zdGVhZCBvZiBhbmRiIHdoZW4gY2hlY2tpbmcgaWYKKwl0aGUgZHJpdmUgaXMgYSBmbG9wcHkuCisKKzE5OTktMDYtMjMgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIGdydWIvYXNtc3R1Yi5jIFtfX2xpbnV4X19dOiBJbmNsdWRlIGxpbnV4L2ZzLmggZm9yIEJMS0ZMU0JVRi4KKwkoZ3J1Yl9zdGFnZTIpOiBDYWxsIHN5bmMgYmVmb3JlIGFuZCBhZnRlciBjYWxsaW5nIGRvaXQuCisJKGd1cmJfc3RhZ2UyKSBbX19saW51eF9fXTogSW52YWxpZGF0ZSBidWZmZXIgY2FjaGVzIGJ5IEJMS0ZMU0JVRgorCWlvY3RsLgorCSogZ3J1Yi9tYWluLmMgKG1haW4pOiBDYWxsIHN5bmMgZmlyc3QuIFN1Z2dlc3RlZCBieSBQYXZlbCBSb3NraW4KKwk8cGF2ZWxfcm9za2luQGdlb2NpdGllcy5jb20+LgorCisJKiBjb25maWd1cmUuaW46IEN1cnNlcyBsaWJyYXJpZXMgYXJlIGFsd2F5cyBjaGVja2VkLgorCSgtLWVuYWJsZS1zYmluLWdydWIpOiBEZWxldGVkLiBOb3cgL3NiaW4vZ3J1YiBpcyBhbHdheXMgYnVpbHQuCisJKC0tZW5hYmxlLW1haW50YWluZXItbW9kZSk6IE5ldyBvcHRpb24uCisJKiBncnViL01ha2VmaWxlLmFtIChFWFRSQV9QUk9HUkFNUyk6IERlbGV0ZWQuCisJKHNiaW5fUFJPR1JBTVMpOiBKdXN0IHNldCB0byBncnViLgorCSogZG9jcy9NYWtlZmlsZS5hbSAobWFuX01BTlMpOiBOZXcgdmFyaWFibGUuCisJKEhFTFAyTUFOKTogTGlrZXdpc2UuCisJKG5vaW5zdF9TQ1JJUFRTKTogTGlrZXdpc2UuCisJKEVYVFJBX0RJU1QpOiBBZGQgJChtYW5fTUFOUykgYW5kICQobm9pbnN0X1NDUklQVFMpLgorCVtHUlVCX01BSU5UXTogRGVmaW5lIHRoZSBydWxlIGZvciB0aGUgL3NiaW4vZ3J1YiBtYW51YWwuCisJKiBkb2NzL2hlbHAybWFuOiBDb3BpZWQgZnJvbSB0ZXhpbmZvLTMuMTJpLgorCSgtLXNlY3Rpb24pOiBOZXcgb3B0aW9uIHRvIHNwZWNpZnkgd2hpY2ggc2VjdGlvbiBhIG1hbnVhbAorCWJlbG9uZ3MJdG8uCisJKG9wdF9zZWN0aW9uKTogTmV3IHZhcmlhYmxlLgorCShzZWN0aW9uKTogTGlrZXdpc2UuCisJKiBkb2NzL2dydWIuODogUHJvZHVjZWQgYnkgaGVscDJtYW4gYXV0b21hdGljYWxseS4KKworMTk5OS0wNi0yMiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogc2hhcmVkX3NyYy9jaGFyX2lvLmMgKGdldF9jbWRsaW5lKTogQWRkIHR3byBtaXNzaW5nIGBicmVhaydzLgorCisJKiBzaGFyZWRfc3JjL2NtZGxpbmUuYyAoY29tbWFuZHMpOiBBZGQgcXVpdC4KKwkoZW50ZXJfY21kbGluZSk6IENoYW5nZSB0aGUgcmV0dXJuIHR5cGUJdG8gY21kbGluZV90LCBhbmQgcmV0dXJuCisJQ01ETElORV9PSyBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgQ01ETElORV9FUlJPUiBpZiBmYWlsLgorCShlbnRlcl9jbWRsaW5lKSBbR1JVQl9VVElMXTogUmV0dXJuIENNRExJTkVfQUJPUlQgaWYgQ1VSX0hFQVAKKwljb250YWlucyAicXVpdCIuCisJWyFHUlVCX1VUSUxdOiBKdXN0IHByaW50IGFuIGFubm90YXRpb24gbWVzc2FnZS4KKwkqIHNoYXJlZF9zcmMvc2hhcmVkLmggKGNtZGxpbmVfdCk6IE5ldyBlbnVtIHR5cGUuCisJKGVudGVyX2NtZGxpbmUpOiBDaGFuZ2UgdGhlIHJldHVybiB0eXBlIHRvIGNtZGxpbmVfdC4KKwkoY21haW4pOiBSZW1vdmUgYGBub3JldHVybicnIGF0dHJpYnV0ZS4KKwkqIHNoYXJlZF9zcmMvc3RhZ2UyLmMgKG1lbnVfdCk6IE5ldyBlbnVtIHR5cGUuCisJKHJ1bl9tZW51KTogQ2hhbmdlIHRoZSByZXR1cm4gdHlwZSB0byBtZW51X3QuCisJSWYgZW50ZXJfY21kbGluZSByZXR1cm5zIENNRExJTkVfQUJPUlQsIHRoZW4gcmV0dXJuIE1FTlVfQUJPUlQsCisJb3RoZXJ3aXNlIHJldHVybiBNRU5VX09LLgorCShjbWFpbik6IElmIGVudGVyX2NtZGxpbmUgYWJvcnRzLCB0aGVuIGJyZWFrIHRoZSBjb21tYW5kLWxpbmUKKwlsb29wIGFuZCByZXR1cm4uIElmIHJ1bl9tZW51IGFib3J0cywgdGhlbiByZXR1cm4uCisKKzE5OTktMDYtMjIgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHNoYXJlZF9zcmMvTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgYmlvcy5jLiBSZXBvcnRlZCBieQorCVBhdmVsIFJvc2tpbiA8cGF2ZWxfcm9za2luQGdlb2NpdGllcy5jb20+LgorCisxOTk5LTA2LTIxICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBkb2NzL01ha2VmaWxlLmFtIChodG1sKTogRGVsZXRlZC4KKwkodHh0KTogTGlrZXdpc2UuCisJKEVYVFJBX0RJU1QpOiAkKHR4dCkgYW5kICQoaHRtbCkgYXJlIHJlbW92ZWQuCisJKiBkb2NzL2Jvb3QtcHJvcG9zYWwuaHRtbDogUmVtb3ZlZC4KKwkqIGRvY3MvZXJyb3JzLmh0bWw6IExpa2V3aXNlLgorCSogZG9jcy9mYXEuaHRtbDogTGlrZXdpc2UuCisJKiBkb2NzL2dydWIuaHRtbDogTGlrZXdpc2UuCisJKiBkb2NzL2luc3RhbGwuaHRtbDogTGlrZXdpc2UuCisJKiBkb2NzL21lbTY0bWIuaHRtbDogTGlrZXdpc2UuCisJKiBkb2NzL3RlY2huaWNhbC5odG1sOiBMaWtld2lzZS4KKwkqIGRvY3MvdXNpbmcuaHRtbDogTGlrZXdpc2UuCisJKiBkb2NzL1BDX3BhcnRpdGlvbmluZy50eHQ6IExpa2V3aXNlLgorCSogZG9jcy9iaW9zX21hcHBpbmcudHh0OiBMaWtld2lzZS4KKwkqIGRvY3MvY29tbWFuZHMudHh0OiBMaWtld2lzZS4KKwkqIGRvY3MvZW1iZWRkZWRfZGF0YS50eHQ6IExpa2V3aXNlLgorCSogZG9jcy9maWxlc3lzdGVtLnR4dDogTGlrZXdpc2UuCisKKzE5OTktMDYtMjEgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwlGcm9tIEFsZXhhbmRlciBLLiBIdWRlayA8YWxleGh1ZGVrQGhvbWUuY29tPjoKKwkqIHNoYXJlZF9zcmMvZGlza19pby5jIChyZWFsX29wZW5fcGFydGl0aW9uKTogQ2hlY2sgaWYKKwlDVVJSRU5UX1NMSUNFIGlzIGVxdWFsIHRvIFBDX1NMSUNFX1RZUEVfV0lOOTVfRVhURU5ERUQgYXMgd2VsbC4KKwkqIHNoYXJlZF9zcmMvcGNfc2xpY2UuYyAoUENfU0xJQ0VfVFlQRV9XSU45NV9FWFRFTkRFRCk6IE5ldworCW1hY3JvLgorCSogc2hhcmVkX3NyYy9iaW9zLmMgKGJpb3NkaXNrKTogQ2xlYXIgdGhlIHJlc2VydmVkIG1lbWJlciBvZiBEQVAuCisKKzE5OTktMDYtMDggIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwlDb2xvci1tZW51IHN1cHBvcnQgYmFzZWQgb24gUGV0ZXIgQXN0cmFuZAorCTxhbHRpY0BseXNhdG9yLmxpdS5zZT4ncyBwYXRjaC4KKworCSogc2hhcmVkX3NyYy9hc20uUyAobm9jdXJzb3IpOiBOZXcgZnVuY3Rpb24uCisJKiBzaGFyZWRfc3JjL2NtZGxpbmUuYyAobm9ybWFsX2NvbG9yKTogTmV3IHZhcmlhYmxlLgorCShoaWdobGlnaHRfY29sb3IpOiBMaWtld2lzZS4KKwkoY29tbWFuZHMpOiBBZGRlZCAiY29sb3IiIGNvbW1hbmQuCisJKGVudGVyX2NtZGxpbmUpOiBIYW5kbGUgdGhlIGNvbG9yIGNvbW1hbmQuCisJKiBzaGFyZWRfc3JjL3NoYXJlZC5oIChub3JtYWxfY29sb3IpOiBEZWNsYXJlZC4KKwkoaGlnaGxpZ2h0X2NvbG9yKTogTGlrZXdpc2UuCisJWyFHUlVCX1VUSUxdIChub2N1cnNvcik6IExpa2V3aXNlLgorCSogc2hhcmVkX3NyYy9zdGFnZTIuYyAocHJpbnRfYm9yZGVyKSBbIUdSVUJfVVRJTF06IENvbG9yIHRoZQorCW1lbnUuCisJKHJ1bl9tZW51KSBbIUdSVUJfVVRJTF06IENhbGwgbm9jdXJzb3IsIGFuZCBjYWxsIHNldF9saW5lIHdpdGgKKwl0aGUgc2Vjb25kIGFyZ3VtZW50IEhJR0hMSUdIVF9DT0xPUiB3aGVuIGhpZ2hsaWdodGluZyBhIGxpbmUsCisJYW5kIE5PUk1BTF9DT0xPUiB3aGVuIGRyYXdpbmcgYSBub3JtYWwgbGluZS4KKwkoY21haW4pOiBJbml0aWFsaXplIG5vcm1hbF9jb2xvciBhbmQgaGlnaGxpZ2h0X2NvbG9yLiBIYW5kbGUKKwl0aGUgY29sb3IgY29tbWFuZCBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlIGNvbW1hbmQtbGluZQorCWludGVyZmFjZS4KKworMTk5OS0wNi0wNyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogZTJmc19zdGFnZTFfNS9NYWtlZmlsZS5hbSAoSU1QT1JUQU5UX1NJWkVfTElNSVQpOiBTZXQgdG8gMzE3NDQuCisJKiBmYXRfc3RhZ2UxXzUvTWFrZWZpbGUuYW0gKElNUE9SVEFOVF9TSVpFX0xJTUlUKTogTGlrZXdpc2UuCisKKzE5OTktMDYtMDYgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwlUaGUgZGVidWcgdmVyc2lvbiBvZiBTdGFnZSAyIGlzIHJlbW92ZWQuCisKKwkqIHNoYXJlZF9zcmMvY21kbGluZS5jOiBUaGUgaW1wcyBjb2RlIGlzIG5vdyBkZWZpbmVkIGlmIEdSVUJfVVRJTAorCWlzIG5vdCBkZWZpbmVkLCBidXQgbm90IGlmIERFQlVHLgorCShkZWJ1Zyk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCisJKGNvbW1hbmRzKTogQWxsIGNvbW1hbmRzIGFyZSBhbHdheXMgZW5hYmxlZCwgYW5kIGFkZGVkICJkZWJ1ZyIuCisJKGRlYnVnX2ZzX3ByaW50X2Z1bmMpOiBEZWZpbmVkIHVuY29uZGl0aW9uYWxseS4KKwkoZGVidWdfZnNfYmxvY2tsaXN0X2Z1bmMpOiBJZiBERUJVRyBpcyB0cnVlLCB0aGVuIGNhbGwgcHJpbnRmLgorCShlbnRlcl9jbWRsaW5lKTogSGFuZGxlICJ0ZXN0bG9hZCIsICJyZWFkIiwgImZzdGVzdCIsCisJImltcHNwcm9iZSIgYW5kICJkaXNwbGF5bWVtIiB1bmNvbmRpdGlvbmFsbHksIGFuZCBhZGRlZCAiZGVidWciCisJaGFuZGxpbmcuCisJW0dSVUJfVVRJTF06IElmIGEgY29tbWFuZCBpcyBpbXBzcHJvYmUsIGp1c3QgZmFpbHMuCisJKiBzaGFyZWRfc3JjL2Rpc2tfaW8uYyAoZGV2cmVhZCkgWyFTVEFHRTFfNV06IElmIERFQlVHX0ZTIGFuZAorCURFQlVHIGFyZSB0cnVlLCB0aGVuIGNhbGwgcHJpbnRmLgorCSogc2hhcmVkX3NyYy9hc20uUyAocGF0Y2hfY29kZSk6IERlZmluZWQgdW5jb25kaXRpb25hbGx5LgorCShwYXRjaF9jb2RlX2VuZCk6IExpa2V3aXNlLgorCSogc3RhZ2UxL3N0YWdlMS5TIChmaXJzdGxpc3QpIFshRkZTX1NUQUdFMV81XTogSW5jcmVhc2UgdGhlCisJbnVtYmVyIG9mIHNlY3RvcnMgdG8gOTAsIGJlY2F1c2UgU3RhZ2UgMiBpcyBsYXJnZXIgdGhhbiA4MAorCXNlY3RvcnMuCisJKiBjb25maWd1cmUuaW46IFRoZSBvcHRpb24gLS1lbmFibGUtZGVidWcgaXMgcmVtb3ZlZCwgYW5kIGRvCisJbm90IG91dHB1dCAic3RhZ2UyX2RlYnVnL01ha2VmaWxlIi4KKwkqIE1ha2VmaWxlLmFtIChTVUJESVJTKTogc3RhZ2UyX2RlYnVnIGlzIHJlbW92ZWQuCisJKiBzdGFnZTJfZGVidWcvTWFrZWZpbGUuYW06IERlbGV0ZWQuCisJKiBzdGFnZTJfZGVidWcvTWFrZWZpbGUuaW46IExpa2V3aXNlLgorCisxOTk5LTA2LTAyICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBncnViL21haW4uYyAodmVyYm9zZSk6IE5ldyB2YXJpYWJsZS4KKwkocmVhZF9vbmx5KTogTGlrZXdpc2UuCisJKE9QVF9WRVJCT1NFKTogTmV3IG1hY3JvLgorCShPUFRfUkVBRF9PTkxZKTogTGlrZXdpc2UuCisJKGxvbmdvcHRzKTogQWRkIC0tcmVhZC1vbmx5IGFuZCAtLXZlcmJvc2Ugb3B0aW9ucy4KKwkodXNhZ2UpOiBBZGQgdGhlIGRlc2NyaXB0aW9ucyBhYm91dCAtLXJlYWQtb25seSBhbmQgLS12ZXJib3NlLgorCShtYWluKTogSGFuZGxlIE9QVF9WRVJCT1NFIGFuZCBPUFRfUkVBRF9PTkxZLgorCUlmIEhPTEQgYW5kIFZFUkJPU0UgYXJlIG5vbi16ZXJvLCB0aGVuIGRpc3BsYXkgdGhlIG1lc3NhZ2UKKwlhYm91dCBob3cgdG8gcmVzdGFydCAvc2Jpbi9ncnViLgorCisJKiBzaGFyZWRfc3JjL3NoYXJlZC5oICh2ZXJib3NlKSBbR1JVQl9VVElMXTogRGVjbGFyZWQuCisJKHJlYWRfb25seSkgW0dSVUJfVVRJTF06IExpa2V3aXNlLgorCisJKiBncnViL2FzbXN0dWIuYyAoaGV4X2R1bXApOiBOZXcgZnVuY3Rpb24uCisJKGJpb3NkaXNrKTogSW4gdGhlIGNhc2Ugd2hlcmUgU1VCRlVOQyBpcworCUJJT1NESVNLX1dSSVRFLCBjaGVjayBmb3IgUkVBRF9PTkxZIGFuZCBjYWxsIG53cml0ZSBpZgorCVJFQURfT05MWSBpcyB6ZXJvLiBJZiBWRVJCT1NFIGlzIG5vbi16ZXJvLCBkaXNwbGF5IHdoYXQgR1JVQgorCXdpbGwgdHJ5IHRvIGRvLgorCShnZXRfZGlza2luZm8pOiBPcGVuIERFVk5BTUUgd2l0aCB0aGUgbW9kZSBPX1JEV1IgaWYgUkVBRF9PTkxZCisJaXMgemVybywgYW5kIGF0dGVtcHQgdG8gb3BlbiBERVZOQU1FIHdpdGggdGhlIG1vZGUgT19SRE9OTFkKKwlyZWdhcmRsZXNzIG9mIEVSUk5PIGlmIFJFQURfT05MWSBpcyBub24temVyby4gSWYgVkVSQk9TRSBpcworCW5vbi16ZXJvLCB0aGVuIGRpc3BsYXkgdGhlIGRyaXZlIERSSVZFIGFuZCB0aGUgZmlsZSBERVZOQU1FLgorCisJKiBzaGFyZWRfc3JjL2Rpc2tfaW8uYyAoc2V0X2RldmljZSkgW1NUQUdFMV81XTogRWxpbWluYXRlCisJY29tcGxldGlvbiBjb2RlLgorCisxOTk5LTA2LTAxICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBncnViL2FzbXN0dWIuYzogRG8gbm90IHVzZSBJX0FNX1ZFUllfQlJBVkUgYW55IG1vcmUuCisJKGdydWJfc3RhZ2UyKTogRGVsZXRlIGZpcnN0X3Njc2lfZGlzayBhbmQgYWRkIGEgdmFyaWFibGUKKwludW1faGQsIHdoaWNoIGlzIHVzZWQgZm9yIGNvdW50aW5nIGhvdyBtYW55IGRyaXZlcyBhcmUKKwlkZXRlY3RlZC4KKwlJbml0aWFsaXplIHRoZSBmbGFncyBtZW1iZXIgb2YgZWFjaCBlbGVtZW50IG9mIGRpc2tzIHRvIC0xCisJaW5zdGVhZCBvZiAwLCBhbmQgY2hlY2sgaWYgaXQgaXMgZXF1YWwgdG8gLTEgaW5zdGVhZCBvZiAwIHdoZW4KKwljbG9zZSBpdC4KKwkoZ2V0X2Rpc2tpbmZvKTogVHJlYXQgLTEgYXMgbm9uLWNhY2hpbmcgc3RhdGUgaW5zdGVhZCBvZiAwLgorCisxOTk5LTA2LTAxICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJUmVwb3J0ZWQgZnJvbSBLbGF1cyBSZWljaGwgPGE4NzA5MTgyQHVuZXQudW5pdmllLmFjLmF0PjoKKwkqIGRvY3MvLmN2c2lnbm9yZTogTmV3IGZpbGUuCisJKiBzaGFyZWRfc3JjL2Rpc2tfaW8uYyAocHJpbnRfYV9jb21wbGV0aW9uKTogTmV3IGZ1bmN0aW9uCisJd2hpY2ggc2F2ZXMgd2hhdCBoYXMgYmVlbiBwcmludGVkIHRvIFVOSVFVRV9TVFJJTkcgYW5kIHByaW50ZgorCWl0LgorCSh1bmlxdWUpIFshU1RBR0UxXzVdOiBOZXcgdmFyaWFibGUuCisJKHVuaXF1ZV9zdHJpbmcpOiBMaWtld2lzZS4KKwkocHJpbnRfY29tcGxldGlvbnMpOiBVc2UgcHJpbnRfYV9jb21wbGV0aW9uLCBhbmQgaW1wcm92ZSB0aGUKKwljb21wbGV0aW9uIGZhY2lsaXR5LgorCSogc2hhcmVkX3NyYy9mc3lzX2V4dDJmcy5jIChleHQyZnNfZGlyKSBbIVNUQUdFMV81XTogVXNlCisJcHJpbnRfYV9jb21wbGV0aW9uIGluc3RlYWQgb2YganVzdCBwcmludGYuCisJKiBzaGFyZWRfc3JjL2ZzeXNfZmZzLmMgKGZmc19kaXIpIFshU1RBR0UxXzVdOiBMaWtld2lzZS4KKwkqIHNoYXJlZF9zcmMvZnN5c19mYXQuYyAoZmF0X2RpcikgWyFTVEFHRTFfNV06IExpa2V3aXNlLgorCSogc2hhcmVkX3NyYy9zaGFyZWQuaCAocHJpbnRfYV9jb21wbGV0aW9uKTogRGVjbGFyZWQuCisJKiBzaGFyZWRfc3JjL2NtZGxpbmUuYyAoZW50ZXJfY21kbGluZSk6IEV4cGxpY2l0bHkgY2FzdAorCWludCB0byBwb2ludGVyIHRvIGNoYXIgZm9yIGdydWJfcmVhZC4KKwkqIGdydWIvYXNtc3R1Yi5jIChncnViX3N0YWdlMikgW19fbGludXhfX106IERvbid0IHVzZSAvZGV2L2ZkMS4KKwlQcm9iZSA0IElERSBkcml2ZXMgaW5zdGVhZCBvZiAyLgorCShiaW9zZGlzaykgW19fbGludXhfX106IEFkZCBhIHByb3RvdHlwZSBmb3IgX2xsc2Vlay4KKwkqIHNoYXJlZF9zcmMvY2hhcl9pby5jIChnZXRfY21kbGluZSk6IFVwZGF0ZSBMUE9TIGFuZCBMTEVOX09MRAorCXdoZW4gdGhlIGZ1bmN0b24gcHJpbnRfY29tcGxldGlvbiBtb2RpZmllcyBDTURMSU5FLgorCSogc2hhcmVkX3NyYy9zdGFnZTIuYyAoZ2V0X2xpbmVfZnJvbV9jb25maWcpOiBGaXggTElURVJBTAorCWhhbmRsaW5nLgorCisxOTk5LTA1LTI1ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBncnViL2FzbXN0dWIuYyAoZ3J1Yl9zdGFnZTIpOiBGaXggYSBtZW1vcnkgbGVhayB0aGF0IEZQIGlzCisJbm90IGNsb3NlZC4KKworMTk5OS0wNS0yNSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogZ3J1Yi9tYWluLmM6IFJlcGxhY2UgT1BUX0RJU0FCTEVfQ09ORklHX0ZJTEUgYW5kCisJT1BUX0RJU0FCTEVfQ1VSU0VTIHdpdGggT1BUX05PX0NPTkZJR19GSUxFIGFuZCBPUFRfTk9fQ1VSU0VTCisJcmVzcGVjdGl2ZWx5LgorCShsb25nb3B0cyk6IFJlbmFtZSBmcm9tICJkaXNhYmxlLWNvbmZpZy1maWxlIiB0bworCSJuby1jb25maWctZmlsZSIsIGFuZCBmcm9tICJkaXNhYmxlLWN1cnNlcyIgdG8gIm5vLWN1cnNlcyIuCisJKHVzYWdlKTogVXNlICJncnViIiBpbnN0ZWFkIG9mIEFSR1ZbMF0sIHJlYWQgdGhlIHN0YW5kYXJkcy4KKwlDaGFuZ2UgdGhlIGhlbHAgbWVzc2FnZSBhY2NvcmRpbmcgdG8gdGhlIGNoYW5nZXMgYWJvdmUuCisJKG1haW4pOiBIYW5kbGUgT1BUX05PX0NPTkZJR19GSUxFIGFuZCBPUFRfTk9fQ1VSU0VTLCBpbnN0ZWFkCisJb2YgT1BUX0RJU0FCTEVfQ09ORklHX0ZJTEUgYW5kIE9QVF9ESVNBQkxFX0NVUlNFUy4KKworMTk5OS0wNS0yMSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogZG9jcy9UT0RPOiBNb3ZlZCB0byAuLi4KKwkqIFRPRE86IC4uLiBoZXJlLgorCSogZG9jcy9CVUdTOiBNb3ZlZCB0byAuLi4KKwkqIEJVR1M6IC4uLiBoZXJlLgorCSogZG9jcy9DT1BZSU5HOiBSZW1vdmVkLgorCSogZG9jcy9NYWtlZmlsZS5hbSAoRVhUUkFfRElTVCk6IEdldCByaWQgb2YgQlVHUy4KKwkqIE1ha2VmaWxlLmFtIChFWFRSQV9ESVNUKTogU2V0IHRvIEJVR1MuCisKKzE5OTktMDUtMTcgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIGFjaW5jbHVkZS5tNCAoZ3J1Yl9BU01fRVhUX0MpOiBEbyBub3Qgb3ZlcnJ1biB0aGUgY29tbWFuZAorCXNoaWZ0LiBSZXBvcnRlZCBieSBQYXZlbCBSb3NraW4gPHBhYmVsX3Jvc2tpbkBnZW9jaXRpZXMuY29tPi4KKworMTk5OS0wNS0xNCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogZG9jcy9NYWtlZmlsZS5hbSAoaW5mb19URVhJTkZPUyk6IEFkZGVkIG11bHRpYm9vdC50ZXhpLgorCSogZG9jcy9tdWx0aWJvb3QudGV4aTogTmV3IGZpbGUuIEZyb20gS3VuaWhpcm8gSXNoaWd1cm8uCisKKzE5OTktMDUtMTIgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIGdydWIvYXNtc3R1Yi5jOiBJbmNsdWRlIDxlcnJuby5oPi4gUmVwb3J0ZWQgYnkgS3VuaWhpcm8KKwlJc2hpZ3VybyA8a3VuaWhpcm9AemVicmEub3JnPi4KKworMTk5OS0wNS0xMSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCVJlcG9ydGVkIGJ5IEJyaWFuIEJydW5zd2ljayA8YnJpYW5Ac2thcnBzZXkuZGVtb24uY28udWs+OgorCSogc2hhcmVkX3NyYy9hc20uUyAoc3RhcnQpIFtTVEFHRTFfNV06IEp1bXAgdG8gMHgwOjB4MjAwMC4KKwkqIHNoYXJlZF9zcmMvY21kbGluZS5jIChlbnRlcl9jbWRsaW5lKTogRG9lc24ndCBjaGVjayBmb3IgdGhlIGp1bXAKKwlhZGRyZXNzIGluIHN0YWdlMi4gV2UgYXJlIG5vdCBwYXJhbm9pZC4KKwlBZGQgYSBtaXNzaW5nIFJBV19BRERSIG1hY3JvLgorCSogc2hhcmVkX3NyYy9kaXNraW8uYyAoZ3J1Yl9vcGVuKTogQ2FsbCBzZXR1cF9wYXJ0IGV2ZW4gaW4gc3RhZ2UxLjUuCisJQW5kLCBpbmNsdWRlIG5lY2Vzc2FyeSBmdW5jdGlvbnMgdGhhdCB3ZXJlIGVsaW1pbmF0ZWQgaW5jb3JyZWN0bHkuCisJKiBzaGFyZWRfc3JjL2NoYXJfaW8uYyBbU1RBR0UxXzVdOiBFbGltaW5hdGUgdW5uZWNlc3NhcnkgZnVuY3Rpb25zCisJZm9yIHN0YWdlMS41LgorCisJKiBncnViL2FzbXN0dWIuYyAobnJlYWQpOiBOZXcgZnVuY3Rpb24uIEhhbmRsZSBFSU5UUi4KKwkobndyaXRlKTogTGlrZXdpc2UuCisJKGJpb3NkaXNrKSBbSV9BTV9WRVJZX0JSQVZFXTogV2hlbiBTVUJGVU5DIGlzIEJJT1NESVNLX1dSSVRFLCBjYWxsCisJbndyaXRlLgorCisJUmVwb3J0ZWQgYnkgUGF2ZWwgUm9za2luIDxwYXZlbF9yb3NraW5AZ2VvY2l0aWVzLmNvbT46CisJKiBzaGFyZWRfc3JjL2ZzeXNfZXh0MmZzLmMgKG9mZl90KTogUmVuYW1lZCB0byAuLi4KKwkobGludXhfb2ZmX3QpOiAuLi4gdGhpcy4KKwkqIHNoYXJlZF9zcmMvZGVmcy5oIChvZmZfdCk6IFJlbmFtZWQgdG8gLi4uCisJKG1hY2hfb2ZmX3QpOiAuLi4gdGhpcy4KKwkqIHNoYXJlZF9zcmMvZnMuaCAoQkJPRkYpOiBVc2UgbWFjaF9vZmZfdCBpbnN0ZWFkIG9mIG9mZl90LgorCShTQk9GRik6IExpa2V3aXNlLgorCisJKiBlMmZzX3N0YWdlMV81L01ha2VmaWxlLmFtIChJTVBPUlRBTlRfU0laRV9MSU1JVCk6IFNldCB0byA4MTkyMC4KKwkqIGZhdF9zdGFnZTFfNS9NYWtlZmlsZS5hbSAoSU1QT1JUQU5UX1NJWkVfTElNSVQpOiBMaWtld2lzZS4KKwkqIGZmc19zdGFnZTFfNS9NYWtlZmlsZS5hbSAoSU1QT1JUQU5UX1NJWkVfTElNSVQpOiBTZXQgdG8gNzE2OC4KKworMTk5OS0wNS0wMyAgR29yZG9uIE1hdHppZ2tlaXQgIDxnb3JkQHRyaWNrLmZpZy5vcmc+CisKKwlGcm9tIFBhdmVsIFJvc2tpbjoKKwkqIHNoYXJlZF9zcmMvc2hhcmVkLmg6IFJlZGVjbGFyZS4KKworCSogZ3J1Yi9tYWluLmMgKG1haW4pOiBVc2Ugc3RybmNweSByYXRoZXIgdGhhbiBwb2ludGVyIGFzc2lnbm1lbnQKKwl0byBzZXQgdGhlIGNvbmZpZyBmaWxlIG5hbWUuCisKKwkqIGdydWIvYXNtc3R1Yi5jOiBNYWtlIGNvbmZpZ19maWxlIGEgc3RhdGljIGFycmF5LCBub3QgYSBwb2ludGVyLgorCUNvcnJlY3QgdGhlIHZhbHVlIG9mIFZFUlNJT05fU1RSSU5HLgorCisxOTk5LTA0LTEwICBHb3Jkb24gTWF0emlna2VpdCAgPGdvcmRAdHJpY2suZmlnLm9yZz4KKworCSogZGViaWFuL3J1bGVzIChidWlsZCk6IEluc3RhbGwgaW50byAvbGliIGluc3RlYWQgb2YgL3NoYXJlLgorCisxOTk5LTA1LTAzICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJUHJlbGltaW5hcnkgbm9uLWludGVyYWN0aXZlIHVzZSBzdXBwb3J0LgorCisJKiBncnViL21haW4uYyAodXNlX2NvbmZpZ19maWxlKTogTmV3IHZhcmlhYmxlLgorCSh1c2VfY3Vyc2VzKTogTGlrZXdpc2UuCisJKE9QVF9ESVNBQkxFX0NPTkZJR19GSUxFKTogTmV3IGNvbnN0YW50LgorCShPUFRfRElTQUJMRV9DVVJTRVMpOiBMaWtld2lzZS4KKwkoT1BUX0JBVENIKTogTGlrZXdpc2UuCisJKGxvbmdvcHRzKTogQWRkIG5ldyBvcHRpb25zLCAtLWRpc2FibGUtY29uZmlnLWZpbGUsIC0tZGlzYWJsZS1jdXJzZXMsCisJYW5kIC0tYmF0Y2guCisJKHVzYWdlKTogUHJpbnQgdGhlIGhlbHAgbWVzc2FnZXMgYWJvdXQgdGhlc2UgbmV3IG9wdGlvbnMuCisJKG1haW4pOiBIYW5kbGUgdGhlbS4KKworCSogZ3J1Yi9hc21zdHViLmMgKGdydWJfc3RhZ2UyKSBbSEFWRV9MSUJDVVJTRVNdOiBJZiAhIFVTRV9DVVJTRVMsCisJZmFsbGJhY2sgbm9uLWN1cnNlcyBjb2RlLgorCShzdG9wKSBbSEFWRV9MSUJDVVJTRVNdOiBMaWtld2lzZS4KKwkoY2xzKSBbSEFWRV9MSUJDVVJTRVNdOiBMaWtld2lzZS4KKwkoZ2V0eHkpIFtIQVZFX0xJQkNVUlNFU106IExpa2V3aXNlLgorCShnb3RveHkpIFtIQVZFX0xJQkNVUlNFU106IExpa2V3aXNlLgorCShncnViX3B1dGNoYXIpIFtIQVZFX0xJQkNVUlNFU106IExpa2V3aXNlLgorCShnZXRrZXkpIFtIQVZFX0xJQkNVUlNFU106IExpa2V3aXNlLgorCShjaGVja2tleSkgW0hBVkVfTElCQ1VSU0VTXTogTGlrZXdpc2UuCisJKHNldF9hdHRyaWIpIFtIQVZFX0xJQkNVUlNFU106IExpa2V3aXNlLgorCisJKiBzaGFyZWRfc3JjL2NtZGxpbmUuYyAoZW50ZXJfY21kbGluZSk6IERvIG5vdCB1c2UgZ2V0YywgYnV0IHVzZQorCWdldGtleS4KKworCSogc2hhcmVkX3NyYy9zdGFnZTIuYyAoY21haW4pIFtHUlVCX1VUSUxdOiBDaGVjayBpZiBVU0VfQ09ORklHX0ZJTEUKKwlpcyBub24temVybyBvciBub3QuCisKKwkqIHNoYXJlZF9zcmMvc2hhcmVkLmggKGdldGMpOiBSZW1vdmVkLgorCSh1c2VfY29uZmlnX2ZpbGUpIFtHUlVCX1VUSUxdOiBBZGQgdGhlIGRlY2xhcmF0aW9uLgorCSh1c2VfY3Vyc2VzKSBbR1JVQl9VVElMXTogTGlrZXdpc2UuCisKKzE5OTktMDUtMDIgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIHNoYXJlZF9zcmMvYXNtLlMgKGJpb3NkaXNrX3N0YW5kYXJkKTogUG9wICVlYnAgY29ycmVjdGx5LCByZXBvcnRlZAorCWJ5IFBhdmVsIFJvc2tpbiA8cGF2ZWxfcm9za2luQGdlb2NpdGllcy5jb20+LgorCisxOTk5LTA0LTI1ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBkb2NzL21lbnUubHN0OiBSZXdyaXR0ZW4sIHNvIHRoYXQgaXQgY29udGFpbnMgdXAtdG8tZGF0ZQorCWluZm9ybWF0aW9uIGFuZCBGQVFpc2ggY29uZmlndXJhdGlvbiBleGFtcGxlcy4KKworMTk5OS0wNC0wOSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogc2hhcmVkX3NyYy9hc20uUyAoZ2V0X2Rpc2tpbmZvX2Zsb3BweSk6IENvcnJlY3QgdGhlIG51bWJlciBvZiBoZWFkcworCWFuZCB0aGUgb25lIG9mIGN5bGluZGVycy4KKworMTk5OS0wNC0wNiAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogZ3J1Yi9hc21zdHViLmMgKGdldF9kaXNraW5mbyk6IENvbXB1dGUgdGhlIHRvdGFsIG51bWJlciBvZiBzZWN0b3JzCisJZm9yIERSSVZFLgorCisJKiBzaGFyZWRfc3JjL2FzbS5TIChnZXRfZGlza2luZm9fc3RhbmRhcmQpOiBDbGVhciB0aGUgZGF0YSBzZWdtZW50CisJYWZ0ZXIgY2FsbGluZyBpbnQgMHgxMy4gUmVzdG9yZSB0aGUgYmFzZSBwb2ludGVyIGFmdGVyIHJldHVybmluZworCXRvIHByb3RlY3RlZCBtb2RlLgorCShnZXRfZGlza2luZm9fZmxvcHB5KTogTGlrZXdpc2UuCisKKwkqIHNoYXJlZF9zcmMvYmlvcy5jIChnZXRfZGlza2luZm8pOiBBbHdheXMgc2V0IHRoZSBzaXplIG9mIERSUCB0bworCXRoZSBtYXggc2l6ZSBvZiBEUlAsIHJlZ2FyZGxlc3Mgb2YgdGhlIG1ham9yIHZlcnNpb24gb2YgZXh0ZW5zaW9ucy4KKworMTk5OS0wNC0wMyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogc2hhcmVkX3NyYy9zaGFyZWQuaCAoc3RydWN0IGdlb21ldHJ5KTogRGVjbGFyZSB0b3RhbF9zZWN0b3JzIGFzCisJdW5zaWduZWQgbG9uZyBpbnN0ZWFkIG9mIHVuc2lnbmVkIGxvbmcgbG9uZywgYmVjYXVzZSBHUlVCIHJlcHJlc2VudHMKKwlhIHNlY3RvciBudW1iZXIgYnkgNGJ5dGVzIGludGVnZXIsIHNvIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZS4KKworCSogc2hhcmVkX3NyYy9iaW9zLmMgKGJpb3NkaXNrKSBbIU5PX0lOVDEzX0ZBTExCQUNLXTogUmVjb21wdXRlCisJVE9UQUxfU0VDVE9SUyBhY2NvcmRpbmcgdG8gQ0hTIGluZm9ybWF0aW9uLgorCShnZXRfZGlza2luZm8pIFtERUJVR106IFByaW50IHRoZSBnZW9tZXRyeSBvZiBEUklWRS4KKworCSogc2hhcmVkX3NyYy9kaXNrX2lvLmMgKHJlYWxfb3Blbl9wYXJ0aXRpb24pOiBTZXQgUEFSVF9MRU5HVEggdG8KKwlCVUZfR0VPTS5UT1RBTF9TRUNUT1JTLgorCisxOTk5LTA0LTAxICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBkb2NzL3RleGluZm8udGV4OiBDb3BpZWQgZnJvbSBhdXRvbWFrZS0xLjRhLgorCisJKiBjb25maWd1cmUuaW4gKFNIQVJFRF9TUkNfUlVMRVMpOiBBZGQgYmlvcyBpbnRvIHNoYXJlZCBzb3VyY2VzLgorCisJKiBlMmZzX3N0YWdlMV81L01ha2VmaWxlLmFtIChlMmZzX3N0YWdlMV81X2V4ZWNfTERBREQpOiBBZGRlZCBiaW9zLm8uCisJKiBmYXRfc3RhZ2UxXzUvTWFrZWZpbGUuYW0gKGZhdF9zdGFnZTFfNV9leGVjX0xEQUREKTogTGlrZXdpc2UuCisJKiBmZnNfc3RhZ2UxXzUvTWFrZWZpbGUuYW0gKGZmc19zdGFnZTFfNV9leGVjX0xEQUREKTogTGlrZXdpc2UuCisJKiBzdGFnZTIvTWFrZWZpbGUuYW0gKHN0YWdlMl9leGVjX0xEQUREKTogTGlrZXdpc2UuCisJKiBzdGFnZTJfZGVidWcvTWFrZWZpbGUuYW0gKHN0YWdlMl9kZWJ1Z19leGVjX0xEQUREKTogTGlrZXdpc2UuCisKKwkqIHNoYXJlZF9zcmMvTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGRlZCBiaW9zLmMuCisKKwkqIHNoYXJlZF9zcmMvYXNtLlMgKGJpb3NkaXNrKTogRGVsZXRlZC4gTm93IGRlZmluZWQgaW4gYmlvcy5jLgorCShnZXRfZGlza2luZm8pOiBMaWtld2lzZS4KKwkoYmlvc2Rpc2tfaW50MTNfZXh0ZW5zaW9ucyk6IE5ldyBmdW5jdGlvbi4KKwkoYmlvc2Rpc2tfc3RhbmRhcmQpOiBMaWtld2lzZS4KKwkoY2hlY2tfaW50MTNfZXh0ZW5zaW9ucyk6IExpa2V3aXNlLgorCShnZXRfZGlza2luZm9faW50MTNfZXh0ZW5zaW9ucyk6IExpa2V3aXNlLgorCShnZXRfZGlza2luZm9fc3RhbmRhcmQpOiBMaWtld2lzZS4KKwkoZ2V0X2Rpc2tpbmZvX2Zsb3BweSk6IExpa2V3aXNlLgorCisJKiBzaGFyZWRfc3JjL2Jpb3MuYzogTmV3IGZpbGUuCisKKwkqIHNoYXJlZF9zcmMvc2hhcmVkLmggKHN0cnVjdCBnZW9tZXRyeSk6IEFkZGVkIG5ldyBtZW1iZXIsCisJdG90YWxfc2VjdG9ycy4KKworMTk5OS0wMy0yOCAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogc2hhcmVkX3NyYy9zdGFnZTIuYyAocHJpbnRfZW50cmllcyk6IENvcnJlY3RseSBhc3NpZ24gTUVOVV9FTlRSSUVTCisJdGhlIGVudHJpZXMgc3RhcnRpbmcgZnJvbSBGSVJTVC4KKworMTk5OS0wMy0yNyAgR29yZG9uIE1hdHppZ2tlaXQgIDxnb3JkQHRyaWNrLmZpZy5vcmc+CisKKwkqIENoYW5nZSBldmVyeXRoaW5nIHRvIHVzZSBtZW1zZXQgYW5kIG1lbW1vdmUgaW5zdGVhZCBvZiBiemVybyBhbmQKKwliY29weS4gIEdOQidzIE5vdCBCU0QuCisKKwkqIHNoYXJlZF9zcmMvc2hhcmVkLmggKGdydWJfbWVtc2V0KTogQWRhcHRlZCBmcm9tIGdydWJfYnplcm8uCisJKGdydWJfbWVtbW92ZSk6IEFkYXB0ZWQgZnJvbSBncnViX2Jjb3B5LgorCisJKiBncnViL2FzbXN0dWIuYyAoY2hlY2trZXkpOiBGaXggdW50ZXJtaW5hdGVkIGNvbW1lbnQuCisKKwkqIHNoYXJlZF9zcmMvY2hhcl9pby5jIChncnViX3ByaW50Zik6IFJlbmFtZWQgZnJvbSBwcmludGYuCisJKGdydWJfdG9sb3dlcik6IFJlbmFtZWQgZnJvbSB0b2xvd2VyLgorCShncnViX2lzc3BhY2UpOiBSZW5hbWVkIGZyb20gaXNzcGFjZS4KKwkoZ3J1Yl9zdHJuY2F0KTogUmVuYW1lZCBmcm9tIHN0cm5jYXQuCisJKGdydWJfc3Ryc3RyKTogUmVuYW1lZCBmcm9tIHN0cnN0ci4KKwkoZ3J1Yl9iY29weSk6IFJlbmFtZWQgZnJvbSBiY29weS4KKwkoZ3J1Yl9iemVybyk6IFJlbmFtZWQgZnJvbSBiemVyby4KKworCUZyb20gQnJhZGZvcmQgSG92aW5lbjoKKwkqIHNoYXJlZF9zcmMvY2hhcl9pby5jIChnZXRfY21kbGluZSk6IEFkZCBuZXcgYXJndW1lbnQgdG8gaGlkZQorCXBhc3N3b3JkIGVudHJ5LgorCShncnViX3N0cmNtcCk6IE5ldyBmdW5jdGlvbi4KKwkqIHNoYXJlZF9zcmMvc2hhcmVkLmggKGdldF9jbWRsaW5lKTogRml4IGRlY2xhcmF0aW9uLgorCShncnViX3N0cmNtcCk6IERlY2xhcmUuCisJKiBzaGFyZWRfc3JjL3N0YWdlMi5jIChydW5fbWVudSk6IFVzZSBnZXRfY21kbGluZSB3aXRoIGFuCisJRUNIT19DSEFSIG9mIGAqJy4gIFRoaXMgcHJvdGVjdHMgYWdhaW5zdCBib3RoIGJydXRlLWZvcmNlIGFuZAorCXNpZGVsb25nLWdsYW5jZSBwYXNzd29yZCBjcmFja2luZyBhdHRlbXB0cy4KKworCSogZ3J1Yi9tYWluLmMgKHVzYWdlKTogRGlzcGxheSBkZWZhdWx0cyBmb3Igc3RhZ2UyIG9wdGlvbnMuCisKKwkqIGdydWIvYXNtc3R1Yi5jIFtXSVRIT1VUX0xJQkNfU1RVQlNdOiBSZW5hbWVkIGZyb20KKwlOT19SRU1BUFBJTkdfTElCQ19GVU5DVElPTlMuCisJKiBncnViL21haW4uYzogTGlrZXdpc2UuCisJKiBzaGFyZWRfc3JjL3NoYXJlZC5oOiBMaWtld2lzZS4KKworMTk5OS0wMy0yNyAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogZ3J1Yi9hc21zdHViLmMgKHNldF9hdHRyaWIpOiBVc2UgaW5jaCBhbmQgYWRkY2gsIGluc3RlYWQgb2YKKwljaGdhdCwgYmVjYXVzZSBjaGdhdCBkb2Vzbid0IHdvcmsgYXMgZXhwZWN0ZWQuCisKKzE5OTktMDMtMjYgIE9LVUpJIFlvc2hpbm9yaSAgPG9rdWppQGt1aWNyLmt5b3RvLXUuYWMuanA+CisKKwkqIGdydWIvYXNtc3R1Yi5jIChncnViX3N0YWdlMikgW0hBVkVfTElCQ1VSU0VTXTogQ2FsbCBub2RlbGF5LgorCShjaGVja2tleSkgW0hBVkVfTElCQ1VSU0VTXTogSWYgZ2V0dGluZyBhbiBpbnB1dCBjaGFyYWN0ZXIsIHRoZW4KKwl1bmdldGNoIGl0LCBiZWNhdXNlIGNoZWNra2V5IHNob3VsZG4ndCBtb2RpZnkgdGhlIGlucHV0IHF1ZXVlLgorCisJVXNlIGZpbGUgZGVzY3JpcHRvcnMgaW5zdGVhZCBvZiBmaWxlIHBvaW50ZXJzIHRvIHN1cHBvcnQKKwk+NEdCIGRpc2tzIGluIExpbnV4LgorCisJKiBncnViL2FzbXN0dWIuYyAoZ3J1Yl9zdGFnZTIpOiBDYWxsIGNsb3NlIGluc3RlYWQgb2YgZmNsb3NlLgorCShnZXRfZGlza2luZm8pOiBDYWxsIG9wZW4gaW5zdGVhZCBvZiBmb3Blbi4KKwkoYmlvc2Rpc2spIFtfX2xpbnV4X19dOiBVc2UgX2xsc2VlayBpbnN0ZWFkIG9mIGxzZWVrLgorCShiaW9zZGlzayk6IENhbGwgcmVhZCBpbnN0ZWFkIG9mIGZyZWFkLgorCisJQWRkIG9wdGlvbnMgc28gdGhhdCB0aGUgdXNlciBjYW4gc3BlY2lmeSB0aGUgY29uZmlnIGZpbGUuCisKKwkqIGdydWIvTWFrZWZpbGUuYW0gKENQUEZMQUdTKTogVXNlIC1md3JpdGFibGUtc3RyaW5ncywgYmVjYXVzZQorCWdydWIgYXNzdW1lcyB0aGF0IGFsbCBzdHJpbmdzIHJlc2lkZXMgYXQgdGhlIGRhdGEgc2VjdGlvbi4KKworCSogZ3J1Yi9tYWluLmM6IERlZmluZSBOT19SRU1BUFBJTkdfTElCQ19GVU5DVElPTlMgYmVmb3JlIGluY2x1ZGluZworCXNoYXJlZC5oLgorCShPUFRfQ09ORklHX0ZJTEUpOiBOZXcgbWFjcm8uCisJKE9QVF9JTlNUQUxMX1BBUlRJVElPTik6IExpa2V3aXNlLgorCShPUFRfQk9PVF9EUklWRSk6IExpa2V3aXNlLgorCShsb25nb3B0cyk6IEFkZCBuZXcgb3B0aW9ucywgY29uZmlnLWZpbGUsIGluc3RhbGwtcGFydGl0aW9uIGFuZAorCWJvb3QtZHJpdmUuCisJKHVzYWdlKTogQWRkIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGVtLgorCShtYWluKTogQWRkIGhhbmRsaW5nIGNvZGUgZm9yIE9QVF9DT05GSUdfRklMRSwgT1BUX0lOU1RBTExfUEFSVElUSU9OCisJYW5kIE9QVF9CT09UX0RSSVZFLgorCisJKiBncnViL2FzbXN0dWIuYzogRGVmaW5lIE5PX1JFTUFQUElOR19MSUJDX0ZVTkNUSU9OUyBiZWZvcmUgaW5jbHVkaW5nCisJc2hhcmVkLmguCisJKGNvbmZpZ19maWxlKTogTWFrZSBpdCBjaGFyICogaW5zdGVhZCBvZiBjaGFyIFtdLgorCShnZXRydHNlY3MpOiBSZXR1cm4gY3VycmVudCB0aW1lIGluc3RlYWQgb2YgMHhmZi4KKworCSogc2hhcmVkX3NyYy9zaGFyZWQuaCBbTk9fUkVNQVBQSU5HX0xJQkNfRlVOQ1RJT05TXTogRG9uJ3QgZGVmaW5lCisJbGliYy1BUEktY29tcGF0aWJsZSBmdW5jdGlvbiBuYW1lcy4KKwkoY29uZmlnX2ZpbGUpOiBDaGFuZ2UgdGhlIHByb3RvdHlwZSBmcm9tIGNoYXIgW10gdG8gY2hhciAqLgorCShncnViX3B1dGNoYXIpOiBSZW5hbWVkIGZyb20gcHV0Y2hhci4KKworMTk5OS0wMy0yNSAgT0tVSkkgWW9zaGlub3JpICA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KKworCSogY2hhcl9pby5jIChnZXRfY21kbGluZSk6IENhbGwgY2xfc2V0Y3BvcyBldmVuIGlmIGxwb3MgPT0gbGxlbiwKKwliZWNhdXNlIG5jdXJzZXMgd29uJ3QgdXBkYXRlIHRoZSBjdXJzb3IgcG9zaXRpb24uCisKKwkqIGdydWIvbWFpbi5jIChPUFRfSE9MRCk6IE5ldyBtYWNyby4KKwkobG9uZ29wdHMpOiBOZXcgb3B0aW9uIC0taG9sZC4KKwkodXNhZ2UpOiBBZGQgdGhlIGRvY3VtZW50YXRpb24gYWJvdXQgLS1ob2xkLgorCShtYWluKTogU2V0IGhvbGQgaWYgLS1ob2xkIGlzIHNwZWNpZmllZC4gV2FpdCB1bnRpbCBjbGVhcmVkLgorCisxOTk5LTAzLTIyICBHb3Jkb24gTWF0emlna2VpdCAgPGdvcmRAdHJpY2suZmlnLm9yZz4KKworCSogc2hhcmVkX3NyYy9jbWRsaW5lLmMgKGVudGVyX2NtZGxpbmUpOiBDaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mCisJc2V0X2RldmljZSBpbiB0aGUgYHJvb3QnIGNvbW1hbmQuCisKKwkqIHNoYXJlZF9zcmMvY2hhcl9pby5jIChtZW1jaGVjayk6IFNwZWNpYWwtY2FzZSBjdXJfcGFydF9kZXNjIGFuZAorCXJlZW5hYmxlIG1lbW9yeSBjaGVja2luZy4KKworMTk5OS0wMy0yMSAgR29yZG9uIE1hdHppZ2tlaXQgIDxnb3JkQHRyaWNrLmZpZy5vcmc+CisKKwkqIHNoYXJlZF9zcmMvYm9vdC5jIChsb2FkX2ltYWdlKTogTWFrZSBzdXJlIHdlIHVzZSB0aGUgbWFwcGVkCisJYWRkcmVzcyBiZWZvcmUgYWN0dWFsbHkgd3JpdGluZyBkYXRhIHRvIG1lbWFkZHIuCisKKwkqIHNoYXJlZF9zcmMvY2hhcl9pby5jIChnZXRfY21kbGluZSk6IE9ubHkgemVyby10ZXJtaW5hdGUgaWYgdGhlcmUKKwl3ZXJlIGxlYWRpbmcgYmxhbmtzLiAgVGhpcyBwcmV2ZW50cyBhY2NpZGVudGFsIHRydW5jYXRpb24gb2YKKwljb21tYW5kcy4KKworCSogZ3J1Yi9hc21zdHViLmMgKGdldF9kaXNraW5mbyk6IENhY2hlIGRldmljZSBnZW9tZXRyaWVzIGFzIHdlbGwKKwlhcyBmaWxlIGhhbmRsZXMuCisJVXNlIHRoZSBMaW51eCBIRElPX0dFVEdFTyBpb2N0bCB0byBtYWtlIGEgYmV0dGVyIGd1ZXNzIGF0IGhhcmQKKwlkaXNrIGdlb21ldHJpZXMuCisKKzE5OTktMDMtMTYgIEdvcmRvbiBNYXR6aWdrZWl0ICA8Z29yZEB0cmljay5maWcub3JnPgorCisJKiBzaGFyZWRfc3JjL3NoYXJlZC5oIChnZW9tZXRyeV90KTogRGVsZXRlIHR5cGVkZWYsIHVudGlsIHdlCisJYWN0dWFsbHkgdXNlIGl0LgorCisxOTk5LTAzLTE2ICBPS1VKSSBZb3NoaW5vcmkgIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisJKiBzaGFyZWRfc3JjL2FzbS5TIChiaW9zZGlzayk6IFVzZSBhIHN0cnVjdHVyZSBmb3IgZ2VvbWV0cnkKKwlpbnN0ZWFkIG9mIGEgaW50ZWdlci4KKwkoZ2V0X2Rpc2tpbmZvKTogVGFrZSBhIHBvaW50ZXIgdG8gYSBnZW9tZXRyeSBzdHJ1Y3R1cmUgYXMgdGhlCisJc2Vjb25kIGFyZ3VtZW50LCBhbmQgZmlsbCBhIGdlb21ldHJ5IGluIGl0LiBSZXR1cm4gMSBpZiBhbiBlcnJvcgorCW9jY3Vycywgb3RoZXJ3aXNlIHJldHVybiAwLgorCSogc2hhcmVkX3NyYy9ib290LmMgKGJzZF9ib290KTogQ29tcHV0ZSBCSU9TIGdlb21ldHJpZXMgZm9yIEJTRC4KKwkqIHNoYXJlZF9zcmMvY21kbGluZS5jIChlbnRlcl9jbWRsaW5lKTogRGVjbGFyZSBkZXN0X2dlb20gYXMKKwlzdHJ1Y3QgZ2VvbWV0cnkuCisJKiBzaGFyZWRfc3JjL2Rpc2tfaW8uYyAoYnVmX2dlb20pOiBEZWNsYXJlIGFzIHN0cnVjdCBnZW9tZXRyeS4KKwkqIHNoYXJlZF9zcmMvZmlsZXN5cy5oIChTRUNUT1JTKTogRGVsZXRlZC4KKwkoSEVBRFMpOiBMaWtld2lzZS4KKwkoQ1lMSU5ERVJTKTogTGlrZXdpc2UuCisJKiBzaGFyZWRfc3JjL3NoYXJlZC5oIChCSU9TRElTS19GTEFHX0xCQV9FWFRFTlNJT04pOiBOZXcgbWFjcm8uCisJKHN0cnVjdCBnZW9tZXRyeSk6IE5ldyBzdHJ1Y3R1cmUuCisJKGJ1Zl9nZW9tKTogQ29ycmVjdCB0aGUgcHJvdG90eXBlLgorCShnZXRfZGlza2luZm8pOiBMaWtld2lzZS4KKwkoYmlvc2Rpc2spOiBMaWtld2lzZS4KKworMTk5OS0wMy0xNSAgR29yZG9uIE1hdHppZ2tlaXQgIDxnb3JkQHRyaWNrLmZpZy5vcmc+CisKKwkqIGdydWIvYXNtc3R1Yi5jIChkb2l0KTogTmVzdGVkIGZ1bmN0aW9uIHRvIGdldCBhIGNsZWFuIHN0YWNrCisJZnJhbWUgd2hpbGUgaW4gZ3J1Yl9zdGFnZTIuCisJVXNlIGRpZmZlcmVudCBhc3NlbWJsZXIgbWFnaWMuICBGcm9tIE9LVUpJIFlvc2hpbm9yaS4KKworMTk5OS0wMy0xNCAgR29yZG9uIE1hdHppZ2tlaXQgIDxnb3JkQHRyaWNrLmZpZy5vcmc+CisKKwkqIHNoYXJlZF9zcmMvc3RhZ2UyLmMgKHJ1bl9tZW51KTogVXNlIEFfUkVWRVJTRSBhbmQgQV9OT1JNQUwKKwljb25zdGFudHMgaW5zdGVhZCBvZiBtYWdpYyBudW1iZXJzLgorCisJKiBzaGFyZWRfc3JjL3NoYXJlZC5oIChBX1JFVkVSU0UpOiBSZW5hbWVkIGZyb20gQVRUUl9JTlZFUlNFIGZvcgorCWNvbXBhdGliaWxpdHkgd2l0aCBjdXJzZXMuCisJKEFfTk9STUFMKTogUmVuYW1lZCBmcm9tIEFUVFJfTk9STUFMLgorCisJKiBzaGFyZWRfc3JjL2NtZGxpbmUuYyAoZW50ZXJfY21kbGluZSk6IENoYW5nZSBwcm9tcHQgdG8gImdydWI+ICIuCisJKGVudGVyX2NtZGxpbmUpOiBPbmx5IGFib3J0IHRoZSBib290IGlmIHdlIGFyZSBpbiBhIHNjcmlwdC4KKworCSogc2hhcmVkX3NyYy9zdGFnZTIuYyAocnVuX21lbnUpOiBDaGFuZ2UgcHJvbXB0cyB0byAiZ3J1YiBlZGl0PiAiLgorCisJKiBzaGFyZWRfc3JjL2NoYXJfaW8uYyAobWVtY2hlY2spOiBVc2UgUkFXX0FERFIgdG8gY29tcHV0ZSBtZW1vcnkKKwlsb2NhdGlvbnMuCisJKGdldF9jbWRsaW5lKTogQ2hhbmdlIHRoZSBgZ290byBuZXh0IGxpbmUnIGNvZGUgdG8gYWNjb3VudCBmb3IKKwluZXdsaW5lcyBkZWxldGluZyB0byBlbmQgb2YgbGluZSB1bmRlciBjdXJzZXMuCisKKwkqIElubnVtZXJhYmxlIGNsZWFudXBzIHRvIGZpeCB3YXJuaW5ncy4gIFRoZXJlIGFyZSBzdGlsbCB0b28gbWFueQorCXR5cGVjYXN0cyBpbiB0aGUgd3JvbmcgcGxhY2VzIChpbnQgdmFyaWFibGVzIHVzZWQgdG8gaG9sZAorCXBvaW50ZXJzLCB0aGVuIGNhc3RlZCB0byBhIHBvaW50ZXIgdHlwZSksIGJ1dCB0aGluZ3MgbG9vayBiZXR0ZXIuCisKKwkqIGNvbmZpZ3VyZS5pbiAoQ1BQRkxBR1MpOiBCdW1wIHVwIEdDQyB3YXJuaW5ncyB0byAtV2FsbAorCS1XbWlzc2luZy1wcm90b3R5cGVzIC1XdW51c2VkLgorCisJKiBzaGFyZWRfc3JjL3NoYXJlZC5oOiBEZWxldGUgc3R1cGlkIGRlY2xhcmF0aW9ucywgYW5kIHRvdGFsbHkKKwlyZWFycmFuZ2UgZm9yIGNsYXJpdHkuCisJKGluYiwgb3V0Yik6IE1vdmUgdG8gY21kbGluZS5jLCBzaW5jZSBpdCdzIG9ubHkgdXNlZCB0aGVyZS4KKwkocHJpbnRfcG9zc2liaWxpdGllcywgZnNtYXgsIGZzeXNfdGFibGUpOiBNb3ZlIGRlZmluaXRpb25zIHRvCisJZGlza19pby5jLgorCisJKiBncnViL2FzbXN0dWIuYzogRmlsbCBpbiBtb3JlIHN0dWJzLgorCisxOTk5LTAzLTEzICBHb3Jkb24gTWF0emlna2VpdCAgPGdvcmRAdHJpY2suZmlnLm9yZz4KKworCSogc2hhcmVkX3NyYy9ndW56aXAuYyAoYm9yZGVyKTogUmVuYW1lIHRvIGJpdG9yZGVyLCB0byByZXNvbHZlCisJY2xhc2ggd2l0aCBjdXJzZXMuCisJKiBzaGFyZWRfc3JjL3N0YWdlMi5jICh0aW1lb3V0KTogUmVuYW1lIHRvIGdydWJfdGltZW91dC4KKworCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgY3Vyc2VzIGxpYnJhcmllcyBmb3IgdXNlIHdpdGgKKwkvc2Jpbi9ncnViLgorCisJKiBzaGFyZWRfc3JjL3NoYXJlZC5oIChLRVlfREVMRVRFKTogUmVuYW1lIHRvIEtFWV9EQywgZm9yCisJY29tcGF0aWJpbGl0eSB3aXRoIGN1cnNlcy4KKwkoS0VZX0lOU0VSVCk6IFJlbmFtZSB0byBLRVlfSUMuCisJKEtFWV9QR0ROKTogUmVuYW1lIHRvIEtFWV9OUEFHRS4KKwkoS0VZX1BHVVApOiBSZW5hbWUgdG8gS0VZX1BQQUdFLgorCisJKiBzaGFyZWRfc3JjL2FzbS5TIChhc21fZ2V0a2V5KTogUmVuYW1lZCB0byBnZXRrZXkuCisKKwkqIHNoYXJlZF9zcmMvY2hhcl9pby5jIChnZXRrZXkpOiBEZWxldGUsIGJlY2F1c2UgaXQncyB1c2VsZXNzLgorCisJKiBzaGFyZWRfc3JjL3NoYXJlZC5oOiBSZXNvbHZlIG5hbWUgY2xhc2hlcyB3aXRoIGxpYmMgYnkgcmVuYW1pbmcKKwlvdmVybGFwcGluZyBmdW5jdGlvbnMgdG8gaGF2ZSBncnViXyBwcmVmaXhlcywgdGhlbiBkZWZpbmluZworCW1hY3Jvcy4KKworCSogZ3J1Yi9hc21zdHViLmMgKHN0YXJ0X3N0YWdlMik6IE1ha2Ugc29tZSBhc3NlcnRpb25zIGFib3V0IG91cgorCXNjcmF0Y2ggbWVtb3J5IGFyZWEuCisKKwkqIHNoYXJlZF9zcmMvc2hhcmVkLmggKGVuZCk6IERlbGV0ZSBkZWNsYXJhdGlvbi4KKwkoUkFXX0FERFIsIFJBV19TRUcpOiBNYWNyb3MgdG8gcmVkaXJlY3QgL3NiaW4vZ3J1YiBtZW1vcnkgcmVxdWVzdHMKKwl0aHJvdWdoIGdydWJfc2NyYXRjaF9tZW0uCisKKwkqIGdydWIvYXNtc3R1Yi5jIChnZXRfbWVtX21hcCk6IEltcGxlbWVudCwgc2ltdWxhdGluZyA0TUIKKwljb250aWd1b3VzIG1lbW9yeS4KKwkoZ2V0X2NvZGVfZW5kKTogSW1wbGVtZW50LCBzaW11bGF0aW5nIHdpdGggYSBtYWxsb2NlZCBhcmVhLgorCWdydWIvYXNtc3R1Yi5jIChzdGFydF9zdGFnZTIpOiBJbml0aWFsaXplIGdydWJfc2NyYXRjaF9tZW0uCisKKwkqIHNoYXJlZF9zcmMvYXNtLlMgKGdldF9tZW1fbWFwKTogU29tZSBCSU9TZXMgZXhwZWN0IHRoZSBoaWdoIHdvcmQKKwlvZiAlZWF4IHRvIGJlIHplcm8uCisJKGdldF9jb2RlX2VuZCk6IE1vdmUgdGhpcyBmcm9tIGNvbW1vbi5jIHNvIHRoYXQgd2UgY2FuIHN0dWIgaXQgb3V0CisJaW4gdGhlIHNpbXVsYXRvci4KKworCSogZGViaWFuL3J1bGVzOiBNYWtlIHN1cmUgaW5mbyBmaWxlcyBlbmQgdXAgaW4gL3Vzci9pbmZvLCBub3QKKwkvaW5mby4KKworMTk5OS0wMy0xMCAgR29yZG9uIE1hdHppZ2tlaXQgIDxnb3JkQHRyaWNrLmZpZy5vcmc+CisKKwkqIHNoYXJlZF9zcmMvYXNtLlMgKGJpb3NkaXNrKTogTWFrZSBMQkEgbW9kZSB3b3JrIGNvcnJlY3RseS4gIEZyb20KKwlPS1VKSSBZb3NoaW5vcmkuCisJVW5jb25kaXRpb25hbGx5IGRlZmluZSBOT19JTlQxM19GQUxMQkFDSyB1bnRpbCB3ZSByZWxlYXNlIEdSVUIKKwkwLjYuICBUaGlzIHdpbGwgaGVscCBkZWJ1ZyBhbnkgcHJvYmxlbXMgd2l0aCB0aGUgTEJBIHN1cHBvcnQgdW50aWwKKwl0aGVuLgorCisxOTk5LTAzLTA5ICBHb3Jkb24gTWF0emlna2VpdCAgPGdvcmRAdHJpY2suZmlnLm9yZz4KKworCSogc2hhcmVkX3NyYy9hc20uUyAoYmlvc2Rpc2spOiBDb21wdXRlIGxvY2F0aW9uIG9mCisJZGlza19hZGRyZXNzX3BhY2tldCBjb3JyZWN0bHkuICBGcm9tIE9LVUpJIFlvc2hpbm9yaS4KKworMTk5OS0wMy0wOCAgR29yZG9uIE1hdHppZ2tlaXQgIDxnb3JkQHRyaWNrLmZpZy5vcmc+CisKKwkqIGRvY3MvZ3J1Yi50ZXhpOiBOZXcgVGV4aW5mbyBkb2N1bWVudGF0aW9uLgorCisJKiBzaGFyZWRfc3JjL2Rpc2tfaW8uYyAoc2V0X2RldmljZSk6IEZpcnN0IHN0YWIgYXQgaW50ZXJwcmV0aW5nCisJTWFjaC1zdHlsZSBwYXJ0aXRpb24gbmFtaW5nLgorCisJKiBzaGFyZWRfc3JjL3N0YWdlMi5jIChydW5fbWVudSk6IERvbid0IHNheSBpdCB3YXMgYSBmYWlsdXJlIGlmCisJZW50ZXJfY21kbGluZSByZXR1cm5zIG5vbnplcm8uLi4ganVzdCB3YWl0IGZvciBhIGtleS4KKworCSogc2hhcmVkX3NyYy9jbWRsaW5lLmMgKGVudGVyX2NtZGxpbmUpOiBSZXR1cm4gbm9uemVybywgYW5kIGF2b2lkCisJdGhlIGZhbGxiYWNrIGNvbW1hbmQgaWYgd2UgZGlkIGFuIGluc3RhbGwuCisKKwkqIHNoYXJlZF9zcmMvYXNtLlMgKF9zdGFydCk6IE5ldyBleHBsaWNpdCBzeW1ib2wgdG8gc3VwcmVzcworCXdhcm5pbmdzLgorCisJKiBlMmZzX3N0YWdlMV81L01ha2VmaWxlLmFtIChOT19GQU5DWV9TVFVGRik6IFJlbmFtZWQgdG8gU1RBR0UxXzUsCisJc2luY2UgdGhhdCBkZXNjcmliZXMgdGhpcyBjb25kaXRpb25hbCBtb3JlIGFjY3VyYXRlbHkuCisJKiBmYXRfc3RhZ2UxXzUvTWFrZWZpbGUuYW06IExpa2V3aXNlLgorCSogZmZzX3N0YWdlMV81L01ha2VmaWxlLmFtOiBMaWtld2lzZS4KKwkqIHNoYXJlZF9zcmMvYXNtLlM6IExpa2V3aXNlLgorCSogc2hhcmVkX3NyYy9jaGFyX2lvLmM6IExpa2V3aXNlLgorCSogc2hhcmVkX3NyYy9jb21tb24uYzogTGlrZXdpc2UuCisJKiBzaGFyZWRfc3JjL2Rpc2tfaW8uYzogTGlrZXdpc2UuCisJKiBzaGFyZWRfc3JjL2ZzeXNfZXh0MmZzLmM6IExpa2V3aXNlLgorCSogc2hhcmVkX3NyYy9mc3lzX2Zmcy5jOiBMaWtld2lzZS4KKwkqIHNoYXJlZF9zcmMvc2hhcmVkLmg6IExpa2V3aXNlLgorCisxOTk5LTAzLTA3ICBHb3Jkb24gTWF0emlna2VpdCAgPGdvcmRAdHJpY2suZmlnLm9yZz4KKworCSogY29uZmlndXJlLmluIChTSEFSRURfU1JDX1JVTEVTKTogQXV0b21hdGljYWxseSBnZW5lcmF0ZQorCU1ha2VmaWxlIGRlcGVuZGVuY2llcyBmb3IgZmlsZXMgaW4gc2hhcmVkX3NyYy4KKwllMmZzX3N0YWdlMV81L01ha2VmaWxlLmFtOiBVc2UgdGhlbS4KKwlmYXRfc3RhZ2UxXzUvTWFrZWZpbGUuYW06IExpa2V3aXNlLgorCWZmc19zdGFnZTFfNS9NYWtlZmlsZS5hbTogTGlrZXdpc2UuCisJZ3J1Yi9NYWtlZmlsZS5hbTogTGlrZXdpc2UuCisJc3RhZ2UyL01ha2VmaWxlLmFtOiBMaWtld2lzZS4KKwlzdGFnZTJfZGVidWcvTWFrZWZpbGUuYW06IExpa2V3aXNlLgorCisJKiBzaGFyZWRfc3JjL2Rpc2tfaW5vZGUuaDogRml4IHR5cG86IGlfaWMgc2hvdWxkbid0IGJlIGRlZmluZWQuCisKKwkqIHNoYXJlZF9zcmMvZnN5c19mZnMuYyAoYmxvY2tfbWFwKTogTWFrZSBzdGF0aWMsIHNpbmNlIHRoaXMKKwlmdW5jdGlvbiBpc24ndCB1c2VkIG91dHNpZGUgb2YgaXRzIGRlZmluaW5nIGZpbGUuCisKKwkqIHNoYXJlZF9zcmMvZGlza19pby5jIFtOT19GQU5DWV9TVFVGRl06IEVsaW1pbmF0ZSBhIHdob2xlIGJ1bmNoCisJbW9yZSBmdW5jdGlvbnMgZnJvbSB0aGUgc3RhZ2UxLjUuICBGcm9tIE9LVUpJIFlvc2hpbm9yaS4KKwkqIHNoYXJlZF9zcmMvZnN5c19mZnMuYzogTGlrZXdpc2UuCisJKiBzaGFyZWRfc3JjL2NoYXJfaW8uYzogTGlrZXdpc2UuCisKKzE5OTktMDMtMDUgIEdvcmRvbiBNYXR6aWdrZWl0ICA8Z29yZEB0cmljay5maWcub3JnPgorCisJKiBzaGFyZWRfc3JjL2NoYXJfaW8uYyAoZ2V0a2V5KTogRG9uJ3Qgc2V0IEJVRl9EUklWRSB0byAtMS4KKwlCVUZfRFJJVkUgaGFzIG5vdGhpbmcgYXQgYWxsIHRvIGRvIHdpdGggZ2V0a2V5LgorCisJKiBzaGFyZWRfc3JjL2NvbW1vbi5jIChlcnJfbGlzdCk6IENoYW5nZSBkZXNjcmlwdGlvbiBvZiBFUlJfR0VPTQorCXRvIGJlIG1vcmUgaW5mb3JtYXRpdmUuCisKKwkqIE1ha2VmaWxlLmFtIChjb25maWd1cmUpOiBEZXBlbmQgb24gZGViaWFuL2NoYW5nZWxvZy4KKworCSogY29uZmlndXJlLmluIChob3N0X2NwdSk6IE1ha2UgYWxsIGZ1bGx5IGkzODYtY29tcGF0aWJsZSBDUFVzIGJlCisJaWRlbnRpZmllZCBhcyBpMzg2LgorCShBTV9JTklUX0FVVE9NQUtFKTogRmV0Y2ggdmFsdWVzIGZvciBQQUNLQUdFIGFuZCBWRVJTSU9OIGZyb20KKwlkZWJpYW4vY2hhbmdlbG9nLCBzbyB0aGF0IHdlIG9ubHkgaGF2ZSBvbmUgZmlsZSB0byB1cGRhdGUuCisKKwkqIHNoYXJlZF9zcmMvYXNtLlMgKGdldF9kaXNraW5mbyk6IEZpeCBhIGZldyBiaXQtdHdpZGRsaW5nIGJ1Z3MgaW4KKwl0aGUgQklPUyBleHRlbnNpb24gZGV0ZWN0aW9uIGNvZGUuCisJKGJpb3NkaXNrKSBbQVdBUkRfSU5UMTNfRVhURU5TSU9OU106IFByZWxpbWluYXJ5IGltcGxlbWVudGF0aW9uCisJb2YgQXdhcmQncyBlbmNvZGluZyBvZiBjeWxpbmRlciBiaXRzIDEwIGFuZCAxMS4KKwkoYmlvc2Rpc2spIFtOT19JTlQxM19GQUxMQkFDS106IElmIGRlZmluZWQsIGRvbid0IHVzZSB0aGUgc3RhbmRhcmQKKwlkaXNrIGludGVyZmFjZSBpZiB0aGUgZXh0ZW5kZWQgaW50ZXJmYWNlIGZhaWxzLgorCisJKiBjb25maWd1cmUuaW46IE1ha2Ugc3VyZSAkKGhvc3RfY3B1KSBhbmQgJChob3N0X3ZlbmRvcikgYXJlCisJc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUuCisKKwkqIGUyZnNfc3RhZ2UxXzUvTWFrZWZpbGUuYW0gKHBrZ2RhdGFkaXIpOiBJbnN0YWxsIGZpbGVzIGluCisJJChkYXRhZGlyKS9ncnViLyQoaG9zdF9jcHUpLSQoaG9zdF92ZW5kb3IpLgorCSogZmF0X3N0YWdlMV81L01ha2VmaWxlLmFtOiBMaWtld2lzZS4KKwkqIGZmc19zdGFnZTFfNS9NYWtlZmlsZS5hbTogTGlrZXdpc2UuCisJKiBzdGFnZTEvTWFrZWZpbGUuYW06IExpa2V3aXNlLgorCSogc3RhZ2UyL01ha2VmaWxlLmFtOiBMaWtld2lzZS4KKwkqIHN0YWdlMl9kZWJ1Zy9NYWtlZmlsZS5hbTogTGlrZXdpc2UuCisKKzE5OTktMDMtMDMgIEdvcmRvbiBNYXR6aWdrZWl0ICA8Z29yZEB0cmljay5maWcub3JnPgorCisJKiBzaGFyZWRfc3JjL2FzbS5TIChiaW9zZGlzayk6IFVzZSBMQkEgbW9kZSBpZiBoaWdoIG5pYmJsZSBvZgorCUdFT01FVFJZIGlzIG5vbnplcm8uCisJKGdldF9kaXNraW5mbyk6IFNldCBoaWdoIG5pYmJsZSBvZiBHRU9NRVRSWSAoMHhmMDAwMDAwMCkgdG8gMSBpZgorCUxCQSBtb2RlIGlzIGRldGVjdGVkLgorCisxOTk5LTAzLTAyICBHb3Jkb24gTWF0emlna2VpdCAgPGdvcmRAdHJpY2suZmlnLm9yZz4KKworCSogc2hhcmVkX3NyYy9kaXNrX2lvLmMgKG1ha2Vfc2F2ZWRfYWN0aXZlKTogVXNlIEJJT1NESVNLX1JFQUQgYW5kCisJQklPU0RJU0tfV1JJVEUuCisKKwkqIHNoYXJlZF9zcmMvY21kbGluZS5jIChlbnRlcl9jbWRsaW5lKTogVXNlIEJJT1NESVNLX1dSSVRFLgorCisJKiBzaGFyZWRfc3JjL3NoYXJlZC5oIChCSU9TRElTS19TVUJGVU5DX1JFQUQsCisJQklPU0RJU0tfU1VCRlVOQ19XUklURSk6IERlbGV0ZSBjb25zdGFudHMuCisKKwkqIHNoYXJlZF9zcmMvYXNtLlMgKGJpb3NkaXNrKTogQ2hhbmdlIHN1YmZ1bmMgYXJndW1lbnQgdG8gYmUKKwlyZWFkPTAsIHdyaXRlPTEuCisKKwkqIGNvbmZpZ3VyZS5pbjogRHJvcCByZWR1bmRhbnQgQUNfUFJPR19JTlNUQUxMLiAgRnJvbSBPS1VKSQorCVlvc2hpbm9yaS4KKworMTk5OS0wMy0wMSAgR29yZG9uIE1hdHppZ2tlaXQgIDxnb3JkQHRyaWNrLmZpZy5vcmc+CisKKwkqIGRlYmlhbi9ydWxlcyAoYmluYXJ5LWFyY2gpOiBQcm9wZXJseSBpbnN0YWxsIFJFQURNRS5kZWJpYW4uCisKKwkqIGFjaW5jbHVkZS5tNCAoZ3J1Yl9PQkpDT1BZX0FCU09MVVRFKTogRG9uJ3QgZm9yZ2V0IHRvIG1vdmUgdGhlCisJb2xkIGJpbmFyeSBvdXQgb2YgdGhlIHdheSBiZWZvcmUgcmVlbnRlcmluZyB0aGUgbG9vcC4KKwkoZ3J1Yl9BU01fQUREUjMyKTogRGVsZXRlIGNvbmZ0ZXN0IGZpbGVzIGFmdGVyIHJ1bm5pbmcgdGhlIHRlc3QuCisKKwkqIGRlYmlhbi9ydWxlcyAoYmluYXJ5LWFyY2gpOiBSZW1vdmUgZW1wdHkgL3NiaW4gZGlyZWN0b3J5IHVudGlsCisJL3NiaW4vZ3J1YiBpcyBpbnN0YWxsZWQuICBVc2UgJChERVNURElSKSBpbnN0ZWFkIG9mICQocHJlZml4KSB0bworCWluc3RhbGwgZmlsZXMuCisKKwkqIHNoYXJlZF9zcmMvYXNtLlMgKHZlcnNpb25fc3RyaW5nKTogU2V0IHRoZSB2ZXJzaW9uIHN0cmluZyBmcm9tCisJdGhlIFZFUlNJT04gc3BlY2lmaWVkIGluIGNvbmZpZ3VyZS5pbi4KKworCSogQ2hhbmdlIGFsbCBNYWtlZmlsZXMgaW50byBNYWtlZmlsZS5hbXMuICBNYW55IG1ham9yIGJ1aWxkCisJZW52aXJvbm1lbnQgY2hhbmdlcyB0byBnZXQgQXV0b21ha2UvQXV0b2NvbmYgd29ya2luZyBuaWNlbHkuCisKKzE5OTktMDItMjggIEdvcmRvbiBNYXR6aWdrZWl0ICA8Z29yZEB0cmljay5maWcub3JnPgorCisJKiBORVdTOiBNb3ZlZCBmcm9tIGRvY3MvTkVXUy4KKworCSogY29uZmlndXJlLmluLCBhY2luY2x1ZGUubTQ6IE5ldyBmaWxlcyBmb3IgQXV0b2NvbmYuICBGcm9tIE9LVUpJCisJWW9zaGlub3JpLgorCisJKiBBVVRIT1JTLCBJTlNUQUxMOiBOZXcgZmlsZXMuCisKKzE5OTktMDItMjQgIEdvcmRvbiBNYXR6aWdrZWl0ICA8Z29yZEB0cmljay5maWcub3JnPgorCisJKiBzdGFnZTEvc3RhZ2UxLlMgKGFmdGVyX0JQQik6IERvIGEgaGFyZCBkaXNrIHByb2JlIGZpcnN0LCBzbyB0aGF0CisJd2UgY2FuIHdvcmsgd2l0aCBJREUgZmxvcHBpZXMgKGxpa2UgdGhlIExTLTEyMCkuCisKKwkqIFJ1biBHTlUgSW5kZW50IG9uICovKi5bY2hdLgorCisxOTk5LTAyLTIxICBHb3Jkb24gTWF0emlna2VpdCAgPGdvcmRAdHJpY2suZmlnLm9yZz4KKworCSogZGViaWFuOiBBZGQgdG8gdGhlIGRpc3RyaWJ1dGlvbiwgc2luY2Ugd2UgbWFpbnRhaW4gdGhlIEdSVUIKKwlEZWJpYW4gcGFja2FnZSBvdXJzZWx2ZXMuCisKKwkqIGdydWIvYXNtc3R1Yi5jOiBOZXcgZmlsZSB0byBpbXBsZW1lbnQgc3R1YmJlZCBhc3NlbWJseSBmdW5jdGlvbnMKKwl1bmRlciBVbml4LgorCisJKiBzdGFnZTEvTWFrZWZpbGU6IERlbGV0ZSBzcHVyaW91cyBkZXBlbmRlbmNpZXMgb24gTWFrZWZpbGUuCisJKiBzdGFnZTIvTWFrZWZpbGU6IExpa2V3aXNlLgorCSogc3RhZ2UyX2RlYnVnL01ha2VmaWxlOiBMaWtld2lzZS4KKwkqIGdydWIvTWFrZWZpbGU6IExpa2V3aXNlLgorCisJKiBzaGFyZWRfc3JjL2ZzeXNfZXh0MmZzLmMgKGV4dDJmc19kaXIpOiBGb2xsb3cgc3ltYm9saWMgbGlua3MKKwlyYXRoZXIgdGhhbiBnaXZpbmcgYW4gZXJyb3IuCisKKwkqIHNoYXJlZF9zcmMvY29tbW9uLmMgKGVycl9saXN0KTogVXNlIGxhYmVsZWQgZWxlbWVudHMgdG8KKwlhc3NvY2lhdGUgbWVzc2FnZXMgd2l0aCBlcnJvciBjb2Rlcy4KKwkqIHNoYXJlZF9zcmMvc2hhcmVkLmg6IE1ha2UgZXJyb3IgY29kZXMgaW50byBhbiBlbnVtZXJhdGVkIHR5cGUuCisKKwkqIHNoYXJlZF9zcmMvY29tbW9uLmMgKGVycl9saXN0KTogQWRkIEVSUl9TWU1MSU5LX0xPT1AuCisJKiBzaGFyZWRfc3JjL3NoYXJlZC5oOiBMaWtld2lzZS4KKworCSogc2hhcmVkX3NyYy9jaGFyX2lvLmMgKGJjb3B5KTogRG9uJ3QgbWFrZSBhbnkgYXNzdW1wdGlvbnMgYWJvdXQKKwl0aGUgbGVuZ3RoIG9mIGFuIHVuc2lnbmVkIGxvbmcuCisKKwkqIGdydWIvTWFrZWZpbGU6IFRyZWF0IENGTEFHUywgQ1BQRkxBR1MsIExERkxBR1MgYWNjb3JkaW5nIHRvCisJR05VIHN0YW5kYXJkcy4KKwkqIHN0YWdlMi9NYWtlZmlsZTogTGlrZXdpc2UuCisJKiBlMmZzX3N0YWdlMV81L01ha2VmaWxlOiBMaWtld2lzZS4KKwkqIGZhdF9zdGFnZTFfNS9NYWtlZmlsZTogTGlrZXdpc2UuCisJKiBmZnNfc3RhZ2UxXzUvTWFrZWZpbGU6IExpa2V3aXNlLgorCisxOTk5LTAyLTIwICBHb3Jkb24gTWF0emlna2VpdCAgPGdvcmRAdHJpY2suZmlnLm9yZz4KKworCSogZG9jcy9pbmRleC5odG1sOiBSZW5hbWUgdG8gZ3J1Yi5odG1sLCBzbyB0aGF0IHdlIGRvbid0IGhpZGUKKwlmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBmcm9tIGEgd2ViIGJyb3dzZXIuCisKKzE5OTktMDItMTUgIEdvcmRvbiBNYXR6aWdrZWl0ICA8Z29yZEB0cmljay5maWcub3JnPgorCisJKiBNYWtlZmlsZS5lbmQgKFBST0dTKTogQWRkIGdydWIuCisKKwkqIGdydWIvbWFpbi5jOiBOZXcgZmlsZS4KKworCSogZ3J1Yi9NYWtlZmlsZTogTmV3IGRpcmVjdG9yeSB0byBjb250YWluIHRoZSBzdGFnZTIgVW5peCBwcm9ncmFtLgorCisJKiBzaGFyZWRfc3JjL2NtZGxpbmUuYzogVXNlIHN1YnN0cmluZy4KKwkqIHNoYXJlZF9zcmMvZnN5c19leHQyZnMuYzogTGlrZXdpc2UuCisJKiBzaGFyZWRfc3JjL2ZzeXNfZmF0LmM6IExpa2V3aXNlLgorCSogc2hhcmVkX3NyYy9mc3lzX2Zmcy5jOiBMaWtld2lzZS4KKwkqIHNoYXJlZF9zcmMvc3RhZ2UyLmM6IExpa2V3aXNlLgorCisJKiBzaGFyZWRfc3JjL3NoYXJlZC5oOiBEZWxldGUgc3RyY21wLCBkZWNsYXJlIHN1YnN0cmluZy4KKworCSogc2hhcmVkX3NyYy9jaGFyX2lvLmMgKHN0cmNtcCk6IFJlbmFtZSB0byBgc3Vic3RyaW5nJywgYmVjYXVzZQorCXRoaXMgZnVuY3Rpb24gZG9lc24ndCBiZWhhdmUgdGhlIHNhbWUgYXMgbGliYydzIHN0cmNtcC4KKworMTk5OS0wMi0xNCAgR29yZG9uIE1hdHppZ2tlaXQgIDxnb3JkQHRyaWNrLmZpZy5vcmc+CisKKwkqIHNoYXJlZF9zcmMvc2hhcmVkLmg6IChhZGRyMzIsIGRhdGEzMik6IERlbGV0ZSBkZWZpbml0aW9ucy4KKworCSogc3RhZ2UxL3N0YWdlMS5TOiBNb2RpZnkgdG8gdXNlIEdBUydzIG5ldyAuY29kZTE2IHNlbWFudGljcy4KKwlzaGFyZWRfc3JjL2FzbS5TOiBMaWtld2lzZS4KKworCSogY29uZmlndXJlOiBUZXN0IHRvIHNlZSBpZiB0aGUgYGFkZHIzMicgaW5zdHJ1Y3Rpb24gaXMgc3VwcG9ydGVkLgorCUlhbiBMYW5jZSBUYXlsb3Igc2F5cyB0aGF0IEdBUydzIGludGVycHJldGF0aW9uIG9mIGAuY29kZTE2JyBoYXMKKwljaGFuZ2VkLiAgT2xkZXIgdmVyc2lvbnMgYWx3YXlzIGdlbmVyYXRlZCAzMi1iaXQgY29kZSwgYnV0CisJaW1wbGljaXRseSBpbnNlcnRlZCBhZGRyMzIgYW5kIGRhdGEzMiB3aGVuIC5jb2RlMTYgd2FzIGdpdmVuLgorCU5ld2VyIHZlcnNpb25zIGdlbmVyYXRlIDE2LWJpdCBjb2RlLCBhbmQgcmVxdWlyZSBtYW51YWwgYWRkcjMyIGFuZAorCWRhdGEzMiBvdmVycmlkZXMuCisKKwkqIHNoYXJlZF9zcmMvc2hhcmVkLmg6IEFkZCBzb21lIGFzc2VydGlvbnMgdG8gY2hlY2sgdGhhdCBidWZmZXIKKwlhZGRyZXNzZXMgYXJlIHByb3Blcmx5IGRlZmluZWQuCisKKzE5OTktMDItMTIgIEdvcmRvbiBNYXR6aWdrZWl0ICA8Z29yZEB0cmljay5maWcub3JnPgorCisJKiBzaGFyZWRfc3JjL3N0YWdlMi5jIChydW5fbWVudSk6IFBhdXNlIGlmIHdlIGZhaWxlZCB0byBib290IGJvdGgKKwl0aGUgZGVmYXVsdCBhbmQgZmFsbGJhY2sgZW50cmllcy4KKworCSogY29uZmlndXJlOiBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCBHQVMgYWN0dWFsbHkgaG9ub3JzIC5jb2RlMTYKKwlkaXJlY3RpdmVzLgorCisxOTk5LTAyLTAyICBHb3Jkb24gTWF0emlna2VpdCAgPGdvcmRAdHJpY2suZmlnLm9yZz4KKworCSogc2hhcmVkX3NyYy9hc20uUzogRml4IHR5cG8gdGhhdCBjYWxsZWQgaW50ZXJydXB0IDB4ZCAoZGVjaW1hbAorCTEzKSBpbnN0ZWFkIG9mIDB4MTMuCisKKzE5OTktMDEtMzEgIEdvcmRvbiBNYXR6aWdrZWl0ICA8Z29yZEB0cmljay5maWcub3JnPgorCisJKiBlMmZzX3N0YWdlMV81L01ha2VmaWxlOiBBdm9pZCBncmF0dWl0b3VzIGRlcGVuZGVuY2llcyBvbgorCU1ha2VmaWxlLgorCSogZmF0X3N0YWdlMV81L01ha2VmaWxlOiBMaWtld2lzZS4KKwkqIGZmc19zdGFnZTFfNS9NYWtlZmlsZTogTGlrZXdpc2UuCisKKwkqIE1ha2VmaWxlLmVuZCAoUFJPR1MpOiBBZGQgZTJmc19zdGFnZTFfNSwgZmF0X3N0YWdlMV81LCBhbmQKKwlncnViaW5zdC4KKwkoZGlzdGNsZWFuKTogTmV3IEdOVSBzdGFuZGFyZCBydWxlLgorCisxOTk4LTEwLTIzICBHb3Jkb24gTWF0emlna2VpdCAgPGdvcmRAdHJpY2suZmlnLm9yZz4KKworCSogY29uZmlndXJlOiBBY2NlcHQgYC0taG9zdCcgYXMgYSBzeW5vbnltIGZvciBgLS10YXJnZXQnLCBhbmQKKwlhY2NlcHQgYSBub24tb3B0aW9uYWwgYXJndW1lbnQgYXMgdGhlIHRhcmdldCBuYW1lLiAgSm9pbiB0aGUKKwlwcmVmaXggdG8gdGhlIHRvb2wgbmFtZSB3aXRoIGEgaHlwaGVuLgorCisJKiBzaGFyZWRfc3JjL2Rpc2tfaW8uYyAocHJpbnRfZnN5c190eXBlKTogQWx3YXlzIHByaW50IHRoZQorCXBhcnRpdGlvbiB0eXBlLgorCisJKiBzaGFyZWRfc3JjL3N0YWdlMi5jIChydW5fbWVudSk6IENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQorCWZhbGxiYWNrIGVudHJ5IGlzIG5vbm5lZ2F0aXZlLgorCShydW5fbWVudSk6IEZvciBjb25zaXN0ZW5jeSwgdXNlIGBlJyByYXRoZXIgdGhhbiBlbnRlciB0byBlZGl0IHRoZQorCWNvbW1hbmQgZW50cnkuCmRpZmYgLS1naXQgYS9JTlNUQUxMIGIvSU5TVEFMTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmE2OGE2Ci0tLSAvZGV2L251bGwKKysrIGIvSU5TVEFMTApAQCAtMCwwICsxLDI2NiBAQAorLSotIFRleHQgLSotCisKK1RoaXMgaXMgdGhlIEdSVUIuICBXZWxjb21lLgorCitUaGlzIGZpbGUgY29udGFpbnMgaW5zdHJ1Y3Rpb25zIGZvciBjb21waWxpbmcgYW5kIGluc3RhbGxpbmcgdGhlIEdSVUIuCisKK1RoZSBSZXF1aXJlbWVudHMKKz09PT09PT09PT09PT09PT0KKworR1JVQiBkZXBlbmRzIG9uIHNvbWUgc29mdHdhcmUgcGFja2FnZXMgaW5zdGFsbGVkIGludG8geW91ciBzeXN0ZW0uIElmCit5b3UgZG9uJ3QgaGF2ZSBhbnkgb2YgdGhlbSwgcGxlYXNlIG9idGFpbiBhbmQgaW5zdGFsbCB0aGVtIGJlZm9yZQorY29uZmlndXJpbmcgdGhlIEdSVUIuCisKKyogR0NDCisKKyAgUHJvYmFibHkgZXZlcnkgcmVjZW50IEdDQyBzaG91bGQgd29yaywgYnV0IHdlIHJlY29tbWVuZCBHQ0MgMi45NSBhbmQKKyAgbGF0ZXIsIHNpbmNlIHlvdSBjYW4gY3JlYXRlIHNtYWxsZXIgYmluYXJ5IGltYWdlcy4gU2VlIHRoZSB3ZWIgcGFnZQorICA8aHR0cDovL2djYy5nbnUub3JnLz4uCisKKyogR05VIE1ha2UKKworICBGb3Igbm93LCB0aGUgTWFrZWZpbGVzIHByb2R1Y2VkIGJ5IEF1dG9tYWtlIGRlcGVuZHMgb24gR05VIE1ha2UuIFNlZQorICB0aGUgd2ViIHBhZ2UgPGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9tYWtlL21ha2UuaHRtbD4uCisKKyogR05VIGJpbnV0aWxzIDIuOS4xLjAuMjMgb3IgbGF0ZXIKKworICBCaW51dGlscyBoYXMgY2hhbmdlZCB0aGUgYmVoYXZpb3Igb2YgMTZiaXQgYXNzZW1ibGVyIGJldHdlZW4gMi45LjEKKyAgYW5kIDIuOS4xLjAueCwgYW5kIHdlIHN1cHBvcnQgb25seSAyLjkuMS4wLnggYW5kIGhpZ2hlci4gSW4KKyAgcGFydGljdWxhciwgd2UgcmVjb21tZW5kIHVzaW5nIGJpbnV0aWxzIDIuMTAsIHNpbmNlIGl0IGlzIHRoZSBvbmx5CisgIHB1YmxpYyByZWxlYXNlIHRoYXQgc3VwcG9ydHMgcmVhbCAxNmJpdCBtb2RlLiBQbGVhc2UgdGFrZSBhIGxvb2sgYXQKKyAgdGhlIHdlYiBwYWdlIDxodHRwOi8vc291cmNld2FyZS5jeWdudXMuY29tL2JpbnV0aWxzLz4sIGZvciBtb3JlCisgIGluZm9ybWF0aW9uLiBOb3RlIHRoYXQgeW91IGRvbid0IGhhdmUgdG8gaW5zdGFsbCBpdCBpbnRvIGFueSBzeXN0ZW0KKyAgZGlyZWN0b3J5LiBTZWUgdGhlIHNlY3Rpb24gIk9wZXJhdGlvbiBDb250cm9scyIsIGlmIHlvdSB3YW50IHRvCisgIGluc3RhbGwgYmludXRpbHMgaW50byB5b3VyIG93biBkaXJlY3RvcnkuCisKK0lmIHlvdSdkIGxpa2UgdG8gZGV2ZWxvcCBHUlVCLCB0aGVzZSBiZWxvdyBhcmUgYWxzbyByZXF1aXJlZC4gRG9uJ3QKK2ZvcmdldCB0byBzcGVjaWZ5IHRoZSBvcHRpb24gYC0tZW5hYmxlLW1haW50YWluZXItbW9kZScgd2hlbiBydW5uaW5nIHRoZQorY29uZmlndXJlIHNjcmlwdC4KKworKiBUZXhpbmZvIDQuMCBvciBsYXRlcgorCisgIFdlIHVzZSBzb21lIG5ldyBtYWNyb3MgaW4gdGhlIGRvY3VtZW50cywgc28geW91IG5lZWQgYSByZWNlbnQKKyAgVGV4aW5mbyByZWxlYXNlLiBTZWUgdGhlIHdlYiBwYWdlCisgIDxodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvdGV4aW5mby90ZXhpbmZvLmh0bWw+LgorCisqIERldmVsb3BlcnM6IEdOVSBBdXRvY29uZiAyLjV4IGFuZCBHTlUgQXV0b21ha2UgMS43IG9yIGxhdGVyCisKKyAgWW91IHNob3VsZCBub3QgbmVlZCBBdXRvbWFrZSBqdXN0IHRvIGNvbXBpbGUgR1JVQiwgYnV0IHlvdSB3aWxsIG5lZWQKKyAgaXQgaWYgeW91IGVkaXQgYW55IG9mIHRoZSBidWlsZCBmaWxlcyAoTWFrZWZpbGUuYW0sIGNvbmZpZ3VyZS5pbiwKKyAgZXRjKS4gIFdlIHVzZSB0aGUgbmV3ICJwZXItZXhlY3V0YWJsZSBmbGFncyIgZmVhdHVyZSBmb3VuZCBpbiB0aGUKKyAgbGF0ZXN0IHJlbGVhc2Ugb2YgYXV0b21ha2UuICBTZWUgdGhlIHdlYiBwYWdlCisgIDxodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b21ha2UvYXV0b21ha2UuaHRtbD4uCisKKworQ29uZmlndXJpbmcgdGhlIEdSVUIKKz09PT09PT09PT09PT09PT09PT09CisKK1RoZSBgY29uZmlndXJlJyBzaGVsbCBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgY29ycmVjdCB2YWx1ZXMgZm9yCit2YXJpb3VzIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIHVzZWQgZHVyaW5nIGNvbXBpbGF0aW9uLiAgSXQgdXNlcwordGhvc2UgdmFsdWVzIHRvIGNyZWF0ZSBhIGBNYWtlZmlsZScgaW4gZWFjaCBkaXJlY3Rvcnkgb2YgdGhlIHBhY2thZ2UuCitJdCBtYXkgYWxzbyBjcmVhdGUgb25lIG9yIG1vcmUgYC5oJyBmaWxlcyBjb250YWluaW5nIHN5c3RlbS1kZXBlbmRlbnQKK2RlZmluaXRpb25zLiAgRmluYWxseSwgaXQgY3JlYXRlcyBhIHNoZWxsIHNjcmlwdCBgY29uZmlnLnN0YXR1cycgdGhhdAoreW91IGNhbiBydW4gaW4gdGhlIGZ1dHVyZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLCBhCitmaWxlIGBjb25maWcuY2FjaGUnIHRoYXQgc2F2ZXMgdGhlIHJlc3VsdHMgb2YgaXRzIHRlc3RzIHRvIHNwZWVkIHVwCityZWNvbmZpZ3VyaW5nLCBhbmQgYSBmaWxlIGBjb25maWcubG9nJyBjb250YWluaW5nIGNvbXBpbGVyIG91dHB1dAorKHVzZWZ1bCBtYWlubHkgZm9yIGRlYnVnZ2luZyBgY29uZmlndXJlJykuCisKK0lmIHlvdSBuZWVkIHRvIGRvIHVudXN1YWwgdGhpbmdzIHRvIGNvbXBpbGUgdGhlIHBhY2thZ2UsIHBsZWFzZSB0cnkgdG8KK2ZpZ3VyZSBvdXQgaG93IGBjb25maWd1cmUnIGNvdWxkIGNoZWNrIHdoZXRoZXIgdG8gZG8gdGhlbSwgYW5kIG1haWwKK2RpZmZzIG9yIGluc3RydWN0aW9ucyB0byB0aGUgYWRkcmVzcyBnaXZlbiBpbiB0aGUgYFJFQURNRScgc28gdGhleSBjYW4KK2JlIGNvbnNpZGVyZWQgZm9yIHRoZSBuZXh0IHJlbGVhc2UuICBJZiBhdCBzb21lIHBvaW50IGBjb25maWcuY2FjaGUnCitjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisKK1RoZSBmaWxlIGBjb25maWd1cmUuaW4nIGlzIHVzZWQgdG8gY3JlYXRlIGBjb25maWd1cmUnIGJ5IGEgcHJvZ3JhbQorY2FsbGVkIGBhdXRvY29uZicuICBZb3Ugb25seSBuZWVkIGBjb25maWd1cmUuaW4nIGlmIHlvdSB3YW50IHRvIGNoYW5nZQoraXQgb3IgcmVnZW5lcmF0ZSBgY29uZmlndXJlJyB1c2luZyBhIG5ld2VyIHZlcnNpb24gb2YgYGF1dG9jb25mJy4KKworCitCdWlsZGluZyB0aGUgR1JVQgorPT09PT09PT09PT09PT09PT0KKworVGhlIHNpbXBsZXN0IHdheSB0byBjb21waWxlIHRoaXMgcGFja2FnZSBpczoKKworICAxLiBgY2QnIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgcGFja2FnZSdzIHNvdXJjZSBjb2RlIGFuZAorICAgICB0eXBlIGAuL2NvbmZpZ3VyZScgdG8gY29uZmlndXJlIHRoZSBwYWNrYWdlIGZvciB5b3VyIHN5c3RlbS4gIElmCisgICAgIHlvdSdyZSB1c2luZyBgY3NoJyBvbiBhbiBvbGQgdmVyc2lvbiBvZiBTeXN0ZW0gViwgeW91IG1pZ2h0IG5lZWQKKyAgICAgdG8gdHlwZSBgc2ggLi9jb25maWd1cmUnIGluc3RlYWQgdG8gcHJldmVudCBgY3NoJyBmcm9tIHRyeWluZyB0bworICAgICBleGVjdXRlIGBjb25maWd1cmUnIGl0c2VsZi4KKworICAgICBSdW5uaW5nIGBjb25maWd1cmUnIHRha2VzIGF3aGlsZS4gIFdoaWxlIHJ1bm5pbmcsIGl0IHByaW50cyBzb21lCisgICAgIG1lc3NhZ2VzIHRlbGxpbmcgd2hpY2ggZmVhdHVyZXMgaXQgaXMgY2hlY2tpbmcgZm9yLgorCisgIDIuIFR5cGUgYG1ha2UnIHRvIGNvbXBpbGUgdGhlIHBhY2thZ2UuCisKKyAgMy4gT3B0aW9uYWxseSwgdHlwZSBgbWFrZSBjaGVjaycgdG8gcnVuIGFueSBzZWxmLXRlc3RzIHRoYXQgY29tZSB3aXRoCisgICAgIHRoZSBwYWNrYWdlLgorCisgIDQuIFR5cGUgYG1ha2UgaW5zdGFsbCcgdG8gaW5zdGFsbCB0aGUgcHJvZ3JhbXMgYW5kIGFueSBkYXRhIGZpbGVzIGFuZAorICAgICBkb2N1bWVudGF0aW9uLgorCisgIDUuIFlvdSBjYW4gcmVtb3ZlIHRoZSBwcm9ncmFtIGJpbmFyaWVzIGFuZCBvYmplY3QgZmlsZXMgZnJvbSB0aGUKKyAgICAgc291cmNlIGNvZGUgZGlyZWN0b3J5IGJ5IHR5cGluZyBgbWFrZSBjbGVhbicuICBUbyBhbHNvIHJlbW92ZSB0aGUKKyAgICAgZmlsZXMgdGhhdCBgY29uZmlndXJlJyBjcmVhdGVkIChzbyB5b3UgY2FuIGNvbXBpbGUgdGhlIHBhY2thZ2UgZm9yCisgICAgIGEgZGlmZmVyZW50IGtpbmQgb2YgY29tcHV0ZXIpLCB0eXBlIGBtYWtlIGRpc3RjbGVhbicuICBUaGVyZSBpcworICAgICBhbHNvIGEgYG1ha2UgbWFpbnRhaW5lci1jbGVhbicgdGFyZ2V0LCBidXQgdGhhdCBpcyBpbnRlbmRlZCBtYWlubHkKKyAgICAgZm9yIHRoZSBwYWNrYWdlJ3MgZGV2ZWxvcGVycy4gIElmIHlvdSB1c2UgaXQsIHlvdSBtYXkgaGF2ZSB0byBnZXQKKyAgICAgYWxsIHNvcnRzIG9mIG90aGVyIHByb2dyYW1zIGluIG9yZGVyIHRvIHJlZ2VuZXJhdGUgZmlsZXMgdGhhdCBjYW1lCisgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworCitDb21waWxpbmcgRm9yIE11bHRpcGxlIEFyY2hpdGVjdHVyZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitZb3UgY2FuIGNvbXBpbGUgdGhlIHBhY2thZ2UgZm9yIG1vcmUgdGhhbiBvbmUga2luZCBvZiBjb21wdXRlciBhdCB0aGUKK3NhbWUgdGltZSwgYnkgcGxhY2luZyB0aGUgb2JqZWN0IGZpbGVzIGZvciBlYWNoIGFyY2hpdGVjdHVyZSBpbiB0aGVpcgorb3duIGRpcmVjdG9yeS4gIGBjZCcgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSB5b3Ugd2FudCB0aGUgb2JqZWN0IGZpbGVzCithbmQgZXhlY3V0YWJsZXMgdG8gZ28gYW5kIHJ1biB0aGUgYGNvbmZpZ3VyZScgc2NyaXB0LiAgYGNvbmZpZ3VyZScKK2F1dG9tYXRpY2FsbHkgY2hlY2tzIGZvciB0aGUgc291cmNlIGNvZGUgaW4gdGhlIGRpcmVjdG9yeSB0aGF0CitgY29uZmlndXJlJyBpcyBpbiBhbmQgaW4gYC4uJy4KKworCitJbnN0YWxsYXRpb24gTmFtZXMKKz09PT09PT09PT09PT09PT09PQorCitCeSBkZWZhdWx0LCBgbWFrZSBpbnN0YWxsJyB3aWxsIGluc3RhbGwgdGhlIHBhY2thZ2UncyBmaWxlcyBpbgorYC91c3IvbG9jYWwvYmluJywgYC91c3IvbG9jYWwvbWFuJywgZXRjLiAgWW91IGNhbiBzcGVjaWZ5IGFuCitpbnN0YWxsYXRpb24gcHJlZml4IGJ5IGdpdmluZyBgY29uZmlndXJlJyB0aGUgb3B0aW9uIGAtLXByZWZpeD1QQVRIJy4KKworWW91IGNhbiBzcGVjaWZ5IHNlcGFyYXRlIGluc3RhbGxhdGlvbiBwcmVmaXhlcyBmb3IKK2FyY2hpdGVjdHVyZS1zcGVjaWZpYyBmaWxlcyBhbmQgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzLiAgSWYKK3lvdSBnaXZlIGBjb25maWd1cmUnIHRoZSBvcHRpb24gYC0tZXhlYy1wcmVmaXg9UEFUSCcsIHRoZSBwYWNrYWdlIHdpbGwKK3VzZSBQQVRIIGFzIHRoZSBwcmVmaXggZm9yIGluc3RhbGxpbmcgcHJvZ3JhbXMgYW5kIGxpYnJhcmllcy4KK0RvY3VtZW50YXRpb24gYW5kIG90aGVyIGRhdGEgZmlsZXMgd2lsbCBzdGlsbCB1c2UgdGhlIHJlZ3VsYXIgcHJlZml4LgorCitJbiBhZGRpdGlvbiwgaWYgeW91IHVzZSBhbiB1bnVzdWFsIGRpcmVjdG9yeSBsYXlvdXQgeW91IGNhbiBnaXZlCitvcHRpb25zIGxpa2UgYC0tYmluZGlyPVBBVEgnIHRvIHNwZWNpZnkgZGlmZmVyZW50IHZhbHVlcyBmb3IKK3BhcnRpY3VsYXIga2luZHMgb2YgZmlsZXMuICBSdW4gYGNvbmZpZ3VyZSAtLWhlbHAnIGZvciBhIGxpc3Qgb2YgdGhlCitkaXJlY3RvcmllcyB5b3UgY2FuIHNldCBhbmQgd2hhdCBraW5kcyBvZiBmaWxlcyBnbyBpbiB0aGVtLgorCitJZiB0aGUgcGFja2FnZSBzdXBwb3J0cyBpdCwgeW91IGNhbiBjYXVzZSBwcm9ncmFtcyB0byBiZSBpbnN0YWxsZWQKK3dpdGggYW4gZXh0cmEgcHJlZml4IG9yIHN1ZmZpeCBvbiB0aGVpciBuYW1lcyBieSBnaXZpbmcgYGNvbmZpZ3VyZScKK3RoZSBvcHRpb24gYC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYJyBvciBgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVgnLgorCitQbGVhc2Ugbm90ZSwgaG93ZXZlciwgdGhhdCB0aGUgR1JVQiBrbm93cyB3aGVyZSBpdCBpcyBsb2NhdGVkIGluIHRoZQorZmlsZXN5c3RlbS4gIElmIHlvdSBoYXZlIGluc3RhbGxlZCBpdCBpbiBhbiB1bnVzdWFsIGxvY2F0aW9uLCB0aGUKK3N5c3RlbSBtaWdodCBub3Qgd29yayBwcm9wZXJseSwgb3IgYXQgYWxsLiAgVGhlIGNoaWVmIHV0aWxpdHkgb2YgdGhlc2UKK29wdGlvbnMgZm9yIHRoZSBHUlVCIGlzIHRvIGFsbG93IHlvdSB0byAiaW5zdGFsbCIgaW4gc29tZSBhbHRlcm5hdGUKK2xvY2F0aW9uLCBhbmQgdGhlbiBjb3B5IHRoZXNlIHRvIHRoZSBhY3R1YWwgcm9vdCBmaWxlc3lzdGVtIGxhdGVyLgorCisKK1NoYXJpbmcgRGVmYXVsdHMKKz09PT09PT09PT09PT09PT0KKworSWYgeW91IHdhbnQgdG8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvciBgY29uZmlndXJlJyBzY3JpcHRzIHRvIHNoYXJlLAoreW91IGNhbiBjcmVhdGUgYSBzaXRlIHNoZWxsIHNjcmlwdCBjYWxsZWQgYGNvbmZpZy5zaXRlJyB0aGF0IGdpdmVzCitkZWZhdWx0IHZhbHVlcyBmb3IgdmFyaWFibGVzIGxpa2UgYENDJywgYGNhY2hlX2ZpbGUnLCBhbmQgYHByZWZpeCcuCitgY29uZmlndXJlJyBsb29rcyBmb3IgYFBSRUZJWC9zaGFyZS9jb25maWcuc2l0ZScgaWYgaXQgZXhpc3RzLCB0aGVuCitgUFJFRklYL2V0Yy9jb25maWcuc2l0ZScgaWYgaXQgZXhpc3RzLiAgT3IsIHlvdSBjYW4gc2V0IHRoZQorYENPTkZJR19TSVRFJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgbG9jYXRpb24gb2YgdGhlIHNpdGUgc2NyaXB0LgorQSB3YXJuaW5nOiBub3QgYWxsIGBjb25maWd1cmUnIHNjcmlwdHMgbG9vayBmb3IgYSBzaXRlIHNjcmlwdC4KKworCitPcGVyYXRpb24gQ29udHJvbHMKKz09PT09PT09PT09PT09PT09PQorCisgICBgY29uZmlndXJlJyByZWNvZ25pemVzIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyB0byBjb250cm9sIGhvdyBpdAorb3BlcmF0ZXMuCisKK2AtLWNhY2hlLWZpbGU9RklMRScKKyAgICAgVXNlIGFuZCBzYXZlIHRoZSByZXN1bHRzIG9mIHRoZSB0ZXN0cyBpbiBGSUxFIGluc3RlYWQgb2YKKyAgICAgYC4vY29uZmlnLmNhY2hlJy4gIFNldCBGSUxFIHRvIGAvZGV2L251bGwnIHRvIGRpc2FibGUgY2FjaGluZywgZm9yCisgICAgIGRlYnVnZ2luZyBgY29uZmlndXJlJy4KKworYC0taGVscCcKKyAgICAgUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIGBjb25maWd1cmUnLCBhbmQgZXhpdC4KKworYC0tcXVpZXQnCitgLS1zaWxlbnQnCitgLXEnCisgICAgIERvIG5vdCBwcmludCBtZXNzYWdlcyBzYXlpbmcgd2hpY2ggY2hlY2tzIGFyZSBiZWluZyBtYWRlLgorCitgLS1zcmNkaXI9RElSJworICAgICBMb29rIGZvciB0aGUgcGFja2FnZSdzIHNvdXJjZSBjb2RlIGluIGRpcmVjdG9yeSBESVIuICBVc3VhbGx5CisgICAgIGBjb25maWd1cmUnIGNhbiBkZXRlcm1pbmUgdGhhdCBkaXJlY3RvcnkgYXV0b21hdGljYWxseS4KKworYC0tdmVyc2lvbicKKyAgICAgUHJpbnQgdGhlIHZlcnNpb24gb2YgQXV0b2NvbmYgdXNlZCB0byBnZW5lcmF0ZSB0aGUgYGNvbmZpZ3VyZScKKyAgICAgc2NyaXB0LCBhbmQgZXhpdC4KKworYC0tZW5hYmxlLW1haW50YWluZXItbW9kZScKKyAgICAgRW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsIChhbmQgc29tZXRpbWVzCisgICAgIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXIuIElmIHlvdSBhcmUgYSBHUlVCIGRldmVsb3BlciwKKyAgICAgaXQgaXMgYSBnb29kIGlkZWEgdG8gc3BlY2lmeSB0aGlzIG9wdGlvbi4KKworYC0tZGlzYWJsZS1leHQyZnMnCisgICAgIE9taXQgdGhlIGV4dDJmcyBzdXBwb3J0IGluIFN0YWdlIDIuCisKK2AtLWRpc2FibGUtZmF0JworICAgICBPbWl0IHRoZSBGQVQgc3VwcG9ydCBpbiBTdGFnZSAyLgorCitgLS1kaXNhYmxlLWZmcycKKyAgICAgT21pdCB0aGUgRkZTIHN1cHBvcnQgaW4gU3RhZ2UgMi4KKworYC0tZGlzYWJsZS1taW5peCcKKyAgICAgT21pdCB0aGUgTWluaXggZnMgc3VwcG9ydCBpbiBTdGFnZSAyLgorCitgLS1kaXNhYmxlLXJlaXNlcmZzJworICAgICBPbWl0IHRoZSBSZWlzZXJGUyBzdXBwb3J0IGluIFN0YWdlIDIuCisKK2AtLWRpc2FibGUtdnN0YWZzJworICAgICBPbWl0IHRoZSBWU1RhIGZpbGVzeXN0ZW0gc3VwcG9ydCBpbiBTdGFnZSAyLgorCitgLS1kaXNhYmxlLWpmcycKKyAgICAgT21pdCB0aGUgSkZTIHN1cHBvcnQgaW4gU3RhZ2UgMi4KKworYC0tZGlzYWJsZS14ZnMnCisgICAgIE9taXQgdGhlIFhGUyBzdXBwb3J0IGluIFN0YWdlIDIuCisKK2AtLWRpc2FibGUtdWZzMicKKyAgICAgT21pdCB0aGUgVUZTMiBzdXBwb3J0IGluIFN0YWdlIDIuCisKK2AtLWRpc2FibGUtaXNvOTY2MCcKKyAgICAgT21pdCB0aGUgSVNPOTY2MCBzdXBwb3J0IGluIFN0YWdlIDIuCisKK2AtLWRpc2FibGUtZ3VuemlwJworICAgICBPbWl0IHRoZSBkZWNvbXByZXNzaW9uIHN1cHBvcnQgaW4gU3RhZ2UgMi4KKworYC0tZGlzYWJsZS1tZDUtcGFzc3dvcmQnCisgICAgIE9taXQgdGhlIE1ENSBwYXNzd29yZCBzdXBwb3J0IGluIFN0YWdlMi4KKworYC0td2l0aC1iaW51dGlscz1QQVRIJworICAgICBTZWFyY2ggdGhlIHBhdGggUEFUSCB0byBmaW5kIGJpbnV0aWxzLiBJZiB5b3UgaGF2ZSBpbnN0YWxsZWQgeW91cgorICAgICBiaW51dGlscyBleGVjdXRhYmxlcyBpbnRvIGFuIHVudXN1YWwgbG9jYXRpb24gd2hlcmUgR0NDIGRvZXNuJ3QKKyAgICAgc2VhcmNoIGJ5IGRlZmF1bHQsIHVzZSB0aGlzIG9wdGlvbi4KKworYC0td2l0aG91dC1jdXJzZXMnCisgICAgIERvbid0IHVzZSB0aGUgY3Vyc2VzIGxpYnJhcnkuCisKK2AtLWRpc2FibGUtaGVyY3VsZXMnCisgICAgIE9taXQgdGhlIGhlcmN1bGVzIGNvbnNvbGUgc3VwcG9ydCBpbiBTdGFnZSAyLgorCitgLS1kaXNhYmxlLXNlcmlhbCcKKyAgICAgT21pdCB0aGUgc2VyaWFsIHRlcm1pbmFsIHN1cHBvcnQgaW4gU3RhZ2UgMi4KKworYC0tZW5hYmxlLXNlcmlhbC1zcGVlZC1zaW11bGF0aW9uJworICAgICBTaW11bGF0ZSB0aGUgc2xvd25lc3Mgb2YgYSBzZXJpYWwgZGV2aWNlIGluIHRoZSBncnViIHNoZWxsLiBUaGlzCisgICAgIG9wdGlvbiBpcyB1c2VmdWwgZm9yIEdSVUIgZGV2ZWxvcGVycywgYXMgeW91IGNhbiB0ZXN0IHRoZQorICAgICBwZXJmb3JtYW5jZSBvZiBhIHRlcm1pbmFsIGVtdWxhdGlvbiBldmVuIG9uIHBzZXVkbyB0ZXJtaW5hbHMuCisKK2AtLWVuYWJsZS1wcmVzZXQtbWVudT1GSUxFJworICAgICBQcmVzZXQgYSBtZW51IGZpbGUgRklMRSBpbiBTdGFnZSAyLiBUaGlzIGlzIHVzZWZ1bCwgaWYgeW91IGNhbm5vdAorICAgICBwdXQgYSBjb25maWd1cmF0aW9uIGZpbGUgb24gYSBmaWxlc3lzdGVtIGZvciBzb21lIHJlYXNvbiAoZS5nLiB3aGVuCisgICAgIHlvdSBuZWVkIHRvIHNldCB0aGUgZGVmYXVsdCB0ZXJtaW5hbCB0byBhIHNlcmlhbCB0ZXJtaW5hbCBpbiBhbgorICAgICBlbWJlZGRlZCBzeXN0ZW0pLgorCitgLS1lbmFibGUtZXhhbXBsZS1rZXJuZWwnCisgICAgIEJ1aWxkIHRoZSBleGFtcGxlIE11bHRpYm9vdCBrZXJuZWwgaW4gdGhlIGRpcmVjdG9yeSAiZG9jcyIuIFlvdQorICAgICB3aWxsIGJlIGFibGUgdG8gYm9vdCB0aGUgaW1hZ2UgImtlcm5lbCIgd2l0aCBHUlVCLgorCitgLS1kaXNhYmxlLWF1dG8tbGludXgtbWVtLW9wdCcKKyAgICAgRG9uJ3QgcGFzcyB0aGUgIm1lbT0iIG9wdGlvbiBhdXRvbWF0aWNhbGx5LCB3aGVuIGJvb3RpbmcgTGludXguCisgICAgIFlvdSBjYW4gYWxzbyBkaXNhYmxlIHRoZSBmZWF0dXJlIGF0IHJ1biB0aW1lLgorCisKK2Bjb25maWd1cmUnIGFsc28gYWNjZXB0cyBzZXZlcmFsIG9wdGlvbnMgZm9yIHRoZSBuZXR3b3JrIHN1cHBvcnQuIFNlZQordGhlIGZpbGUgYG5ldGJvb3QvUkVBRE1FLm5ldGJvb3QnLCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KZGlmZiAtLWdpdCBhL01BSU5URU5BTkNFIGIvTUFJTlRFTkFOQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NlN2IzZgotLS0gL2Rldi9udWxsCisrKyBiL01BSU5URU5BTkNFCkBAIC0wLDAgKzEsNjAgQEAKKy0qLSB0ZXh0IC0qLQorCitUaGlzIGlzIGEgbGlzdCBvZiByYW5kb20gbm90ZXMgZm9yIEdSVUIgbWFpbnRhaW5lcnMuIElmIHlvdSBhcmUgbm90IGEKK21haW50YWluZXIsIHlvdSBuZWVkIHRvIGFzayBtYWludGFpbmVycyB0byBkbyB0aGVzZSBpbnN0ZWFkIG9mIGRvaW5nCit0aGVzZSB5b3Vyc2VsZi4KKworSG93IHRvIHVwZGF0ZSB0aGUgb25saW5lIG1hbnVhbDogKEZJWE1FOiB0aGlzIGlzIG9ic29lbGV0ZSkKKzEuIENvcHkgZG9jcy8qLnRleGkgKGV4Y2x1ZGluZyAibXVsdGlib290LnRleGkiKSB0byBmZW5jZXBvc3QuZ251Lm9yZy4KKzIuIE1ha2UgYSBzeW1ib2xpYyBsaW5rIGZyb20gfm1vaGl0L2dudWRvYy9nbnVkb2NfdGVtcGxhdGUgdG8gdGhlCisgICBkaXJlY3RvcnkgdW5kZXIgd2hpY2ggKi50ZXhpIHdlcmUgY29waWVkLCBpZiB0aGUgbGluayBpc24ndCBwcmVzZW50LgorMy4gUnVuIGBgfm1vaGl0L2dudWRvYy9nZW5kb2NzLnNoIGdydWIgIkdOVSBHUlVCIE1hbnVhbCInJy4KKzQuIENvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkgYGBtYW51YWwnJyB0bworICAgZ251ZGlzdC5nbnUub3JnOn5mdHAvZ251L01hbnVhbHMvZ3J1Yi1WRVJTSU9OIChWRVJTSU9OIGlzLCBmb3IKKyAgIGV4YW1wbGUsIDEuMCkuCis1LiBSdW4gYGBsbiAtc2YgZ3J1Yi1WRVJTSU9OIGdydWInJyBpbiBnbnVkaXN0LmdudS5vcmc6fmZ0cC9nbnUvTWFudWFscy4KKzYuIFJ1biBgYGNkIGdydWI7IGxuIC1zIGdydWIuaHRtbCBpbmRleC5odG1sJycuCis3LiBWZXJpZnkgdGhlIG5ldyBvbmxpbmUgbWFudWFsIHdpdGggYSBXV1cgYnJvd3Nlci4KKzguIFVwZGF0ZSBtYW51YWwuaHRtbCBieSBoYW5kLgorCitIb3cgdG8gcmVsZWFzZSBhIHZlcnNpb246CisxLiBDaGVjayBvdXQgdGhlIHNvdXJjZSB0cmVlIGZyb20gdGhlIENWUyBmcm9tIHNjcmF0Y2guCisyLiBDaGVjayBpZiBgYG1ha2UgZGlzdGNoZWNrJycgc3VjY2VlZHMuCiszLiBSdW4gYGB1dGlsL2dydWItaW1hZ2UnJy4KKzQuIENoZWNrIHRoZSByZXN1bHRlZCBpbWFnZXMsIGZvciBleGFtcGxlLCB1c2luZyBib2Nocy4KKzUuIENvcHkgZ3J1Yi1WRVJTSU9OLnRhci5neiwgZ3J1Yi1WRVJTSU9OLWkzODYtcGMudGFyLmd6IGFuZAorICAgZ3J1Yi1WRVJTSU9OLWkzODYtcGMuZXh0MmZzIHRvIGZlbmNlcG9zdC5nbnUub3JnOn5mdHAvZ251L2dydWIuCis2LiBNb3ZlIG9sZGVyIGZpbGVzIGluIHRoYXQgZGlyZWN0b3J5IGFib3ZlIHRvIHRoZSBkaXJlY3RvcnkgYGBvbGQnJywKKyAgIGlmIHlvdSB0aGluayB0aGV5IGFyZSBleWVzb3Jlcy4KKzcuIFBvc3QgYW4gYW5ub3VuY2VtZW50IHRvIGJ1Zy1ncnViQGdudS5vcmcuIEl0IHdvdWxkIGJlIGEgZ29vZCBpZGVhIHRvCisgICBzZW5kIGEgY2FyYm9uIGNvcHkgdG8gYnVnLWh1cmRAZ251Lm9yZyBhbmQKKyAgIGRlYmlhbi1odXJkQGxpc3RzLmRlYmlhbi5vcmcuIElmIHRoZSBhbm5vdW5jZW1lbnQgaXMgZm9yIGEgc3RhYmxlCisgICB2ZXJzaW9uLCB5b3UgY2FuIGluZm9ybSBpbmZvLWdudUBnbnUub3JnIGFzIHdlbGwuCis4LiBPcHRpb25hbGx5LCBwb3N0IGFuIGFubm91bmNlbWVudCB0byBGcmVzaG1lYXQubmV0LgorCitMZWdhbCBpc3N1ZXM6CisxLiBJZiBhIHBhdGNoIGlzIG5vdCBzaWduaWZpY2FudCAoaW4gc2l6ZSksIHlvdSBkb24ndCBoYXZlIHRvIGNhcmUgYWJvdXQKKyAgIHRoZSBjb3B5cmlnaHQuCisyLiBJZiBhIHBhdGNoIGlzIHNpZ25pZmljYW50LCB5b3Ugc2hvdWxkbid0IGFwcGx5IHRoZSBwYXRjaCB0byB0aGUgQ1ZTLgorICAgQmVmb3JlIGRvaW5nIHRoYXQsIHlvdSBtdXN0IGFzayB0aGUgY29udHJpYnV0b3IgdG8gYXNzaWduIG9yIGRpc2NsYWltCisgICB0aGUgY29weXJpZ2h0LiBTZW5kIGBgL2dkL2dudW9yZy9yZXF1ZXN0LWFzc2lnbi5jaGFuZ2VzJycgb3IKKyAgIGBgL2dkL2dudW9yZy9yZXF1ZXN0LWFzc2lnbi5mdXR1cmUnJyB0byB0aGUgY29udHJpYnV0b3IsIGFuZCB3YWl0CisgICB1bnRpbCB0aGUgRlNGIGZpbmlzaGVzIHRoZSBsZWdhbCB3b3JrLgorMy4gWW91IGNhbiBjaGVjayBpZiBhIGNvbnRyaWJ1dG9yIGhhcyBhbHJlYWR5IGFzc2lnbmVkIGhpcy9oZXIgY29weXJpZ2h0CisgICB0byB0aGUgRlNGIGJ5IGxvb2tpbmcgYXQgYGAvZ2QvZ251b3JnL2NvcHlyaWdodC5saXN0JycuCisKK1doYXQgeW91IHNob3VsZCBoYXZlIGluIHlvdXIgbWluZDoKKzEuIERvbid0IGFkZCBmZWF0dXJlcyB1bm5lY2Vzc2FyaWx5ISBZb3UgbWF5IHRoaW5rIGl0IGlzIGEgR29vZCBUaGluZyB0bworICAgaGF2ZSBtb3JlIGZlYXR1cmVzLCBidXQgeW91IG11c3QgYmUgcHJlcGFyZWQgZm9yIG1vcmUgYnVyZGVucy4KKyAgIERPIFRIQVQgT05MWSBJRiBZT1UgQkVMSUVWRSBUSEFUIFRIRSBGRUFUVVJFIElTIEVTU0VOVElBTC4KKzIuIERvbid0IGJyZWFrIGJhY2t3YXJkLWNvbXBhdGliaWxpdHkhIERvbid0IGFwcGx5IGFueSBwYXRjaCB3aGljaCBjb3VsZAorICAgYnJlYWsgZXhpc3RpbmcgZmVhdHVyZXMuIE90aGVyd2lzZSB5b3Ugd291bGQgcmVjZWl2ZSBhIGxvdCBvZgorICAgY29tcGxhaW50cy4gRE8gVEhBVCBPTkxZIElGIFlPVSBCRUxJRVZFIFRIQVQgVEhFIElOQ09NUEFUSUJJTElUWSBJUworICAgSU5FVklUQUJMRS4KKzMuIFdyaXRlIGdvb2QgY29kZS4gQmUgbm90IHNhdGlzZmllZCB3aXRoIGFkIGhvYyB3b3JrYXJvdW5kcyBvciBxdWljaworICAgaGFja3MuIE5FVkVSIFdSSVRFIEJBRCBDT0RFLgorCitSZXNvdXJjZXM6CisqIGh0dHA6Ly93d3cuZ251Lm9yZy9wcmVwL21haW50YWluX3RvYy5odG1sCisqIGh0dHA6Ly93d3cuZ251Lm9yZy9wcmVwL3N0YW5kYXJkc190b2MuaHRtbAorKiBodHRwOi8vd3d3LmdudS5vcmcvc2VydmVyL2ZzZi1odG1sLXN0eWxlLXNoZWV0Lmh0bWwKZGlmZiAtLWdpdCBhL01PRFVMRV9MSUNFTlNFX0dQTCBiL01PRFVMRV9MSUNFTlNFX0dQTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvTU9EVUxFX0xJQ0VOU0VfR1BMCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5hbSBiL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYTlhNGYKLS0tIC9kZXYvbnVsbAorKysgYi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQgQEAKKyMgRG8gbm90IGNoYW5nZSB0aGlzIG9yZGVyIGlmIHlvdSBkb24ndCBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KK0FVVE9NQUtFX09QVElPTlMgPSAxLjcgZ251CitTVUJESVJTID0gbmV0Ym9vdCBzdGFnZTIgc3RhZ2UxIGxpYiBncnViIHV0aWwgZG9jcworRVhUUkFfRElTVCA9IEJVR1MgTUFJTlRFTkFOQ0UKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmluIGIvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY1MjM2NgotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNjA1IEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjkuNCBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3RvcF9idWlsZGRpciA9IC4KK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK0lOU1RBTEwgPSBASU5TVEFMTEAKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK0RJU1RfQ09NTU9OID0gUkVBRE1FICQoYW1fX2NvbmZpZ3VyZV9kZXBzKSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gXAorCSQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHNyY2RpcikvY29uZmlnLmguaW4gXAorCSQodG9wX3NyY2RpcikvY29uZmlndXJlIEFVVEhPUlMgQ09QWUlORyBDaGFuZ2VMb2cgSU5TVEFMTCBORVdTIFwKKwlUSEFOS1MgVE9ETyBjb21waWxlIGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGRlcGNvbXAgaW5zdGFsbC1zaCBcCisJbWlzc2luZyBta2luc3RhbGxkaXJzCitzdWJkaXIgPSAuCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2luY2x1ZGUubTQgXAorCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK2FtX19DT05GSUdfRElTVENMRUFOX0ZJTEVTID0gY29uZmlnLnN0YXR1cyBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBcCisgY29uZmlndXJlLmxpbmVubyBjb25maWd1cmUuc3RhdHVzLmxpbmVubworbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycworQ09ORklHX0hFQURFUiA9IGNvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorU09VUkNFUyA9CitESVNUX1NPVVJDRVMgPQorUkVDVVJTSVZFX1RBUkdFVFMgPSBhbGwtcmVjdXJzaXZlIGNoZWNrLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKKwlodG1sLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKKwlpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAorCWluc3RhbGwtcmVjdXJzaXZlIGluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIFwKKwlwZGYtcmVjdXJzaXZlIHBzLXJlY3Vyc2l2ZSB1bmluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAorCXVuaW5zdGFsbC1yZWN1cnNpdmUKK0VUQUdTID0gZXRhZ3MKK0NUQUdTID0gY3RhZ3MKK0RJU1RfU1VCRElSUyA9ICQoU1VCRElSUykKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitkaXN0ZGlyID0gJChQQUNLQUdFKS0kKFZFUlNJT04pCit0b3BfZGlzdGRpciA9ICQoZGlzdGRpcikKK2FtX19yZW1vdmVfZGlzdGRpciA9IFwKKyAgeyB0ZXN0ICEgLWQgJChkaXN0ZGlyKSBcCisgICAgfHwgeyBmaW5kICQoZGlzdGRpcikgLXR5cGUgZCAhIC1wZXJtIC0yMDAgLWV4ZWMgY2htb2QgdSt3IHt9ICc7JyBcCisgICAgICAgICAmJiBybSAtZnIgJChkaXN0ZGlyKTsgfTsgfQorRElTVF9BUkNISVZFUyA9ICQoZGlzdGRpcikudGFyLmd6CitHWklQX0VOViA9IC0tYmVzdAorZGlzdHVuaW5zdGFsbGNoZWNrX2xpc3RmaWxlcyA9IGZpbmQgLiAtdHlwZSBmIC1wcmludAorZGlzdGNsZWFuY2hlY2tfbGlzdGZpbGVzID0gZmluZCAuIC10eXBlIGYgLXByaW50CitBQ0xPQ0FMID0gQEFDTE9DQUxACitBTURFUF9GQUxTRSA9IEBBTURFUF9GQUxTRUAKK0FNREVQX1RSVUUgPSBAQU1ERVBfVFJVRUAKK0FNVEFSID0gQEFNVEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitCVUlMRF9FWEFNUExFX0tFUk5FTF9GQUxTRSA9IEBCVUlMRF9FWEFNUExFX0tFUk5FTF9GQUxTRUAKK0JVSUxEX0VYQU1QTEVfS0VSTkVMX1RSVUUgPSBAQlVJTERfRVhBTVBMRV9LRVJORUxfVFJVRUAKK0NDID0gQENDQAorQ0NBUyA9IEBDQ0FTQAorQ0NBU0ZMQUdTID0gQENDQVNGTEFHU0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitESVNLTEVTU19TVVBQT1JUX0ZBTFNFID0gQERJU0tMRVNTX1NVUFBPUlRfRkFMU0VACitESVNLTEVTU19TVVBQT1JUX1RSVUUgPSBARElTS0xFU1NfU1VQUE9SVF9UUlVFQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRlNZU19DRkxBR1MgPSBARlNZU19DRkxBR1NACitHUlVCX0NGTEFHUyA9IEBHUlVCX0NGTEFHU0AKK0dSVUJfTElCUyA9IEBHUlVCX0xJQlNACitIRVJDVUxFU19TVVBQT1JUX0ZBTFNFID0gQEhFUkNVTEVTX1NVUFBPUlRfRkFMU0VACitIRVJDVUxFU19TVVBQT1JUX1RSVUUgPSBASEVSQ1VMRVNfU1VQUE9SVF9UUlVFQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMREZMQUdTID0gQExERkxBR1NACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUlOVEFJTkVSX01PREVfRkFMU0UgPSBATUFJTlRBSU5FUl9NT0RFX0ZBTFNFQAorTUFJTlRBSU5FUl9NT0RFX1RSVUUgPSBATUFJTlRBSU5FUl9NT0RFX1RSVUVACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK05FVEJPT1RfRFJJVkVSUyA9IEBORVRCT09UX0RSSVZFUlNACitORVRCT09UX1NVUFBPUlRfRkFMU0UgPSBATkVUQk9PVF9TVVBQT1JUX0ZBTFNFQAorTkVUQk9PVF9TVVBQT1JUX1RSVUUgPSBATkVUQk9PVF9TVVBQT1JUX1RSVUVACitORVRfQ0ZMQUdTID0gQE5FVF9DRkxBR1NACitORVRfRVhUUkFGTEFHUyA9IEBORVRfRVhUUkFGTEFHU0AKK09CSkNPUFkgPSBAT0JKQ09QWUAKK09CSkVYVCA9IEBPQkpFWFRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAorUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACitQRVJMID0gQFBFUkxACitSQU5MSUIgPSBAUkFOTElCQAorU0VSSUFMX1NQRUVEX1NJTVVMQVRJT05fRkFMU0UgPSBAU0VSSUFMX1NQRUVEX1NJTVVMQVRJT05fRkFMU0VACitTRVJJQUxfU1BFRURfU0lNVUxBVElPTl9UUlVFID0gQFNFUklBTF9TUEVFRF9TSU1VTEFUSU9OX1RSVUVACitTRVJJQUxfU1VQUE9SVF9GQUxTRSA9IEBTRVJJQUxfU1VQUE9SVF9GQUxTRUAKK1NFUklBTF9TVVBQT1JUX1RSVUUgPSBAU0VSSUFMX1NVUFBPUlRfVFJVRUAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTVEFHRTFfQ0ZMQUdTID0gQFNUQUdFMV9DRkxBR1NACitTVEFHRTJfQ0ZMQUdTID0gQFNUQUdFMl9DRkxBR1NACitTVFJJUCA9IEBTVFJJUEAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfT0JKQ09QWSA9IEBhY19jdF9PQkpDT1BZQAorYWNfY3RfUkFOTElCID0gQGFjX2N0X1JBTkxJQkAKK2FjX2N0X1NUUklQID0gQGFjX2N0X1NUUklQQAorYW1fX2Zhc3RkZXBDQ19GQUxTRSA9IEBhbV9fZmFzdGRlcENDX0ZBTFNFQAorYW1fX2Zhc3RkZXBDQ19UUlVFID0gQGFtX19mYXN0ZGVwQ0NfVFJVRUAKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorZGF0YWRpciA9IEBkYXRhZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwcmVmaXggPSBAcHJlZml4QAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAorCisjIERvIG5vdCBjaGFuZ2UgdGhpcyBvcmRlciBpZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCitBVVRPTUFLRV9PUFRJT05TID0gMS43IGdudQorU1VCRElSUyA9IG5ldGJvb3Qgc3RhZ2UyIHN0YWdlMSBsaWIgZ3J1YiB1dGlsIGRvY3MKK0VYVFJBX0RJU1QgPSBCVUdTIE1BSU5URU5BTkNFCithbGw6IGNvbmZpZy5oCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLXJlY3Vyc2l2ZQorCisuU1VGRklYRVM6CithbS0tcmVmcmVzaDoKKwlAOgorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgZWNobyAnIGNkICQoc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSAnOyBcCisJICAgICAgY2QgJChzcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251ICBcCisJCSYmIGV4aXQgMDsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgIE1ha2VmaWxlJzsgXAorCWNkICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgIE1ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgZWNobyAnICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyc7IFwKKwkgICAgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKSAkKEFDTE9DQUxfQU1GTEFHUykKKworY29uZmlnLmg6IHN0YW1wLWgxCisJQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCisJICBybSAtZiBzdGFtcC1oMTsgXAorCSAgJChNQUtFKSBzdGFtcC1oMTsgXAorCWVsc2UgOjsgZmkKKworc3RhbXAtaDE6ICQoc3JjZGlyKS9jb25maWcuaC5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBybSAtZiBzdGFtcC1oMQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgKKyQoc3JjZGlyKS9jb25maWcuaC5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykgCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9IRUFERVIpCisJcm0gLWYgc3RhbXAtaDEKKwl0b3VjaCAkQAorCitkaXN0Y2xlYW4taGRyOgorCS1ybSAtZiBjb25maWcuaCBzdGFtcC1oMQordW5pbnN0YWxsLWluZm8tYW06CisKKyMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCisjIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KKyMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKKyMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJworIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKKyMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCiskKFJFQ1VSU0lWRV9UQVJHRVRTKToKKwlAc2V0IGZub3JkICQkTUFLRUZMQUdTOyBhbWY9JCQyOyBcCisJZG90X3NlZW49bm87IFwKKwl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAorCSAgICBkb3Rfc2Vlbj15ZXM7IFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKKwkgIGVsc2UgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAorCSAgZmk7IFwKKwkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAorCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCisJZG9uZTsgXAorCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAorCWZpOyB0ZXN0IC16ICIkJGZhaWwiCisKK21vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBcCittYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZToKKwlAc2V0IGZub3JkICQkTUFLRUZMQUdTOyBhbWY9JCQyOyBcCisJZG90X3NlZW49bm87IFwKKwljYXNlICIkQCIgaW4gXAorCSAgZGlzdGNsZWFuLSogfCBtYWludGFpbmVyLWNsZWFuLSopIGxpc3Q9JyQoRElTVF9TVUJESVJTKScgOzsgXAorCSAgKikgbGlzdD0nJChTVUJESVJTKScgOzsgXAorCWVzYWM7IFwKKwlyZXY9Jyc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gOjsgZWxzZSBcCisJICAgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlyZXY9IiQkcmV2IC4iOyBcCisJdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAorCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKKwkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCisJICBlbHNlIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKKwkgIGZpOyBcCisJICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAorCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgordGFncy1yZWN1cnNpdmU6CisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8IChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAorCWRvbmUKK2N0YWdzLXJlY3Vyc2l2ZToKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGN0YWdzKTsgXAorCWRvbmUKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZQordGFnczogVEFHUworCitUQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgY29uZmlnLmguaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwl0YWdzPTsgXAorCWhlcmU9YHB3ZGA7IFwKKwlpZiAoJChFVEFHUykgLS1ldGFncy1pbmNsdWRlIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKwkgIGluY2x1ZGVfb3B0aW9uPS0tZXRhZ3MtaW5jbHVkZTsgXAorCSAgZW1wdHlfZml4PS47IFwKKwllbHNlIFwKKwkgIGluY2x1ZGVfb3B0aW9uPS0taW5jbHVkZTsgXAorCSAgZW1wdHlfZml4PTsgXAorCWZpOyBcCisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICB0ZXN0ICEgLWYgJCRzdWJkaXIvVEFHUyB8fCBcCisJICAgICAgdGFncz0iJCR0YWdzICQkaW5jbHVkZV9vcHRpb249JCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgY29uZmlnLmguaW4gJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJHRhZ3MkJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCisJICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCisJICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICQkdGFncyAkJHVuaXF1ZTsgXAorCWZpCitjdGFnczogQ1RBR1MKK0NUQUdTOiBjdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpIGNvbmZpZy5oLmluICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpIGNvbmZpZy5oLmluICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdGFncyAkJHVuaXF1ZQorCitHVEFHUzoKKwloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAorCSAgJiYgY2QgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICQkaGVyZQorCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncworCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKwlta2RpciAkKGRpc3RkaXIpCisJJChta2Rpcl9wKSAkKGRpc3RkaXIpL3V0aWwKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAnc3wufC58ZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCisJICBjYXNlICQkZmlsZSBpbiBcCisJICAgICQoc3JjZGlyKS8qKSBmaWxlPWBlY2hvICIkJGZpbGUiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCisJICAgICQodG9wX3NyY2RpcikvKikgZmlsZT1gZWNobyAiJCRmaWxlIiB8IHNlZCAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3wiYDs7IFwKKwkgIGVzYWM7IFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGRpcj1gZWNobyAiJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgIGlmIHRlc3QgIiQkZGlyIiAhPSAiJCRmaWxlIiAmJiB0ZXN0ICIkJGRpciIgIT0gIi4iOyB0aGVuIFwKKwkgICAgZGlyPSIvJCRkaXIiOyBcCisJICAgICQobWtkaXJfcCkgIiQoZGlzdGRpcikkJGRpciI7IFwKKwkgIGVsc2UgXAorCSAgICBkaXI9Jyc7IFwKKwkgIGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtcFIgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1wUiAkJGQvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCisJbGlzdD0nJChESVNUX1NVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRzdWJkaXIiIFwKKwkgICAgfHwgJChta2Rpcl9wKSAiJChkaXN0ZGlyKS8kJHN1YmRpciIgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgICAgZGlzdGRpcj1gJChhbV9fY2QpICQoZGlzdGRpcikgJiYgcHdkYDsgXAorCSAgICB0b3BfZGlzdGRpcj1gJChhbV9fY2QpICQodG9wX2Rpc3RkaXIpICYmIHB3ZGA7IFwKKwkgICAgKGNkICQkc3ViZGlyICYmIFwKKwkgICAgICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCisJICAgICAgICB0b3BfZGlzdGRpcj0iJCR0b3BfZGlzdGRpciIgXAorCSAgICAgICAgZGlzdGRpcj0iJCRkaXN0ZGlyLyQkc3ViZGlyIiBcCisJICAgICAgICBkaXN0ZGlyKSBcCisJICAgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKKwktZmluZCAkKGRpc3RkaXIpIC10eXBlIGQgISAtcGVybSAtNzc3IC1leGVjIGNobW9kIGErcnd4IHt9IFw7IC1vIFwKKwkgICEgLXR5cGUgZCAhIC1wZXJtIC00NDQgLWxpbmtzIDEgLWV4ZWMgY2htb2QgYStyIHt9IFw7IC1vIFwKKwkgICEgLXR5cGUgZCAhIC1wZXJtIC00MDAgLWV4ZWMgY2htb2QgYStyIHt9IFw7IC1vIFwKKwkgICEgLXR5cGUgZCAhIC1wZXJtIC00NDQgLWV4ZWMgJChTSEVMTCkgJChpbnN0YWxsX3NoKSAtYyAtbSBhK3Ige30ge30gXDsgXAorCXx8IGNobW9kIC1SIGErciAkKGRpc3RkaXIpCitkaXN0LWd6aXA6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnRhci5negorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCitkaXN0LWJ6aXAyOiBkaXN0ZGlyCisJdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IGJ6aXAyIC05IC1jID4kKGRpc3RkaXIpLnRhci5iejIKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKworZGlzdC10YXJaOiBkaXN0ZGlyCisJdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IGNvbXByZXNzIC1jID4kKGRpc3RkaXIpLnRhci5aCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3Qtc2hhcjogZGlzdGRpcgorCXNoYXIgJChkaXN0ZGlyKSB8IEdaSVA9JChHWklQX0VOVikgZ3ppcCAtYyA+JChkaXN0ZGlyKS5zaGFyLmd6CisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3QtemlwOiBkaXN0ZGlyCisJLXJtIC1mICQoZGlzdGRpcikuemlwCisJemlwIC1ycSAkKGRpc3RkaXIpLnppcCAkKGRpc3RkaXIpCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3QgZGlzdC1hbGw6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnRhci5negorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCisjIFRoaXMgdGFyZ2V0IHVudGFycyB0aGUgZGlzdCBmaWxlIGFuZCB0cmllcyBhIFZQQVRIIGNvbmZpZ3VyYXRpb24uICBUaGVuCisjIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHNlbGYtY29udGFpbmVkIGJ5IG1ha2luZyBhbm90aGVyCisjIHRhcmZpbGUuCitkaXN0Y2hlY2s6IGRpc3QKKwljYXNlICckKERJU1RfQVJDSElWRVMpJyBpbiBcCisJKi50YXIuZ3oqKSBcCisJICBHWklQPSQoR1pJUF9FTlYpIGd1bnppcCAtYyAkKGRpc3RkaXIpLnRhci5neiB8ICQoYW1fX3VudGFyKSA7O1wKKwkqLnRhci5iejIqKSBcCisJICBidW56aXAyIC1jICQoZGlzdGRpcikudGFyLmJ6MiB8ICQoYW1fX3VudGFyKSA7O1wKKwkqLnRhci5aKikgXAorCSAgdW5jb21wcmVzcyAtYyAkKGRpc3RkaXIpLnRhci5aIHwgJChhbV9fdW50YXIpIDs7XAorCSouc2hhci5neiopIFwKKwkgIEdaSVA9JChHWklQX0VOVikgZ3VuemlwIC1jICQoZGlzdGRpcikuc2hhci5neiB8IHVuc2hhciA7O1wKKwkqLnppcCopIFwKKwkgIHVuemlwICQoZGlzdGRpcikuemlwIDs7XAorCWVzYWMKKwljaG1vZCAtUiBhLXcgJChkaXN0ZGlyKTsgY2htb2QgYSt3ICQoZGlzdGRpcikKKwlta2RpciAkKGRpc3RkaXIpL19idWlsZAorCW1rZGlyICQoZGlzdGRpcikvX2luc3QKKwljaG1vZCBhLXcgJChkaXN0ZGlyKQorCWRjX2luc3RhbGxfYmFzZT1gJChhbV9fY2QpICQoZGlzdGRpcikvX2luc3QgJiYgcHdkIHwgc2VkIC1lICdzLF5bXjpcXC9dOltcXC9dLC8sJ2AgXAorCSAgJiYgZGNfZGVzdGRpcj0iJCR7VE1QRElSLS90bXB9L2FtLWRjLSQkJCQvIiBcCisJICAmJiBjZCAkKGRpc3RkaXIpL19idWlsZCBcCisJICAmJiAuLi9jb25maWd1cmUgLS1zcmNkaXI9Li4gLS1wcmVmaXg9IiQkZGNfaW5zdGFsbF9iYXNlIiBcCisJICAgICQoRElTVENIRUNLX0NPTkZJR1VSRV9GTEFHUykgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZHZpIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbGNoZWNrIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHVuaW5zdGFsbCBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0dW5pbnN0YWxsY2hlY2tfZGlyPSIkJGRjX2luc3RhbGxfYmFzZSIgXAorCSAgICAgICAgZGlzdHVuaW5zdGFsbGNoZWNrIFwKKwkgICYmIGNobW9kIC1SIGEtdyAiJCRkY19pbnN0YWxsX2Jhc2UiIFwKKwkgICYmICh7IFwKKwkgICAgICAgKGNkIC4uLy4uICYmIHVtYXNrIDA3NyAmJiBta2RpciAiJCRkY19kZXN0ZGlyIikgXAorCSAgICAgICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBERVNURElSPSIkJGRjX2Rlc3RkaXIiIGluc3RhbGwgXAorCSAgICAgICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBERVNURElSPSIkJGRjX2Rlc3RkaXIiIHVuaW5zdGFsbCBcCisJICAgICAgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIERFU1RESVI9IiQkZGNfZGVzdGRpciIgXAorCSAgICAgICAgICAgIGRpc3R1bmluc3RhbGxjaGVja19kaXI9IiQkZGNfZGVzdGRpciIgZGlzdHVuaW5zdGFsbGNoZWNrOyBcCisJICAgICAgfSB8fCB7IHJtIC1yZiAiJCRkY19kZXN0ZGlyIjsgZXhpdCAxOyB9KSBcCisJICAmJiBybSAtcmYgIiQkZGNfZGVzdGRpciIgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdCBcCisJICAmJiBybSAtcmYgJChESVNUX0FSQ0hJVkVTKSBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0Y2xlYW5jaGVjaworCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCUAoZWNobyAiJChkaXN0ZGlyKSBhcmNoaXZlcyByZWFkeSBmb3IgZGlzdHJpYnV0aW9uOiAiOyBcCisJICBsaXN0PSckKERJU1RfQVJDSElWRVMpJzsgZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSkgfCBcCisJICBzZWQgLWUgJzF7aDtzLy4vPS9nO3A7eDt9JyAtZSAnJCR7cDt4O30nCitkaXN0dW5pbnN0YWxsY2hlY2s6CisJQGNkICQoZGlzdHVuaW5zdGFsbGNoZWNrX2RpcikgXAorCSYmIHRlc3QgYCQoZGlzdHVuaW5zdGFsbGNoZWNrX2xpc3RmaWxlcykgfCB3YyAtbGAgLWxlIDEgXAorCSAgIHx8IHsgZWNobyAiRVJST1I6IGZpbGVzIGxlZnQgYWZ0ZXIgdW5pbnN0YWxsOiIgOyBcCisJICAgICAgICBpZiB0ZXN0IC1uICIkKERFU1RESVIpIjsgdGhlbiBcCisJICAgICAgICAgIGVjaG8gIiAgKGNoZWNrIERFU1RESVIgc3VwcG9ydCkiOyBcCisJICAgICAgICBmaSA7IFwKKwkgICAgICAgICQoZGlzdHVuaW5zdGFsbGNoZWNrX2xpc3RmaWxlcykgOyBcCisJICAgICAgICBleGl0IDE7IH0gPiYyCitkaXN0Y2xlYW5jaGVjazogZGlzdGNsZWFuCisJQGlmIHRlc3QgJyQoc3JjZGlyKScgPSAuIDsgdGhlbiBcCisJICBlY2hvICJFUlJPUjogZGlzdGNsZWFuY2hlY2sgY2FuIG9ubHkgcnVuIGZyb20gYSBWUEFUSCBidWlsZCIgOyBcCisJICBleGl0IDEgOyBcCisJZmkKKwlAdGVzdCBgJChkaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMpIHwgd2MgLWxgIC1lcSAwIFwKKwkgIHx8IHsgZWNobyAiRVJST1I6IGZpbGVzIGxlZnQgaW4gYnVpbGQgZGlyZWN0b3J5IGFmdGVyIGRpc3RjbGVhbjoiIDsgXAorCSAgICAgICAkKGRpc3RjbGVhbmNoZWNrX2xpc3RmaWxlcykgOyBcCisJICAgICAgIGV4aXQgMTsgfSA+JjIKK2NoZWNrLWFtOiBhbGwtYW0KK2NoZWNrOiBjaGVjay1yZWN1cnNpdmUKK2FsbC1hbTogTWFrZWZpbGUgY29uZmlnLmgKK2luc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKK2luc3RhbGxkaXJzLWFtOgoraW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCit1bmluc3RhbGw6IHVuaW5zdGFsbC1yZWN1cnNpdmUKKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKKwktcm0gLWYgJChhbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUykKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1yZWN1cnNpdmUKKworZHZpLWFtOgorCitodG1sOiBodG1sLXJlY3Vyc2l2ZQorCitpbmZvOiBpbmZvLXJlY3Vyc2l2ZQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tcmVjdXJzaXZlCisKK2luc3RhbGwtbWFuOgorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCisJLXJtIC1mICQoYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMpCisJLXJtIC1yZiAkKHRvcF9zcmNkaXIpL2F1dG9tNHRlLmNhY2hlCisJLXJtIC1mIE1ha2VmaWxlCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1yZWN1cnNpdmUKKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWdlbmVyaWMKKworcGRmOiBwZGYtcmVjdXJzaXZlCisKK3BkZi1hbToKKworcHM6IHBzLXJlY3Vyc2l2ZQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtaW5mby1hbQorCit1bmluc3RhbGwtaW5mbzogdW5pbnN0YWxsLWluZm8tcmVjdXJzaXZlCisKKy5QSE9OWTogJChSRUNVUlNJVkVfVEFSR0VUUykgQ1RBR1MgR1RBR1MgYWxsIGFsbC1hbSBhbS0tcmVmcmVzaCBjaGVjayBcCisJY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBjbGVhbi1yZWN1cnNpdmUgY3RhZ3MgXAorCWN0YWdzLXJlY3Vyc2l2ZSBkaXN0IGRpc3QtYWxsIGRpc3QtYnppcDIgZGlzdC1nemlwIGRpc3Qtc2hhciBcCisJZGlzdC10YXJaIGRpc3QtemlwIGRpc3RjaGVjayBkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tdGFncyBcCisJZGlzdGNsZWFuY2hlY2sgZGlzdGRpciBkaXN0dW5pbnN0YWxsY2hlY2sgZHZpIGR2aS1hbSBodG1sIFwKKwlodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIFwKKwlpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWluZm8gXAorCWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBcCisJaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIGluc3RhbGxkaXJzLWFtIG1haW50YWluZXItY2xlYW4gXAorCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSBcCisJbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1yZWN1cnNpdmUgcGRmIFwKKwlwZGYtYW0gcHMgcHMtYW0gdGFncyB0YWdzLXJlY3Vyc2l2ZSB1bmluc3RhbGwgdW5pbnN0YWxsLWFtIFwKKwl1bmluc3RhbGwtaW5mby1hbQorCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9ORVdTIGIvTkVXUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjM3NDUwCi0tLSAvZGV2L251bGwKKysrIGIvTkVXUwpAQCAtMCwwICsxLDU1OCBAQAorTkVXUyAtIGxpc3Qgb2YgdXNlci12aXNpYmxlIGNoYW5nZXMgYmV0d2VlbiByZWxlYXNlcyBvZiBHUlVCCisKK05ldyBpbiAwLjk3IC0gMjAwNS0wNS0wODoKKyogRml4IHRoZSBwcm90b3R5cGVzIGFuZCB0aGUgZGVmaW5pdGlvbnMgb2YgbmVzdGVkIGZ1bmN0aW9ucy4gVGhpcyB3YXMKKyAgcmVxdWlyZWQgZm9yIGdjYy00LgorKiBJbXBsZW1lbnQgYSBtb3JlIHJvYnVzdCB3b3JrYXJvdW5kIGZvciBidWdneSBCSU9TZXMgd2hpY2ggZG9uJ3QgcGFzcworICBib290IGRyaXZlIGNvcnJlY3RseSAobm90YWJseSBmb3IgSFAgVmVjdHJhKS4KKworTmV3IGluIDAuOTYgLSAyMDA1LTAxLTMwOgorKiBUaGUgY29tbWFuZCAiZmFsbGJhY2siIHN1cHBvcnRzIG11dGlwbGUgZmFsbGJhY2sgZW50cmllcy4KKyogVGhlIGNvbW1hbmQgInNhdmVkZWZhdWx0IiBzdXBwb3J0cyBhbiBvcHRpb25hbCBhcmd1bWVudCB3aGljaAorICBpcyB0aGUgbnVtYmVyIG9mIG5leHQgYm9vdCBlbnRyeSBvciB0aGUgc3BlY2lhbCBrZXl3b3JkIGBmYWxsYmFjaycuCisqIE5ldyB1dGlsaXR5ICJncnViLXNldC1kZWZhdWx0Ii4KKyogTmV3IHNlY3Rpb24gIk1ha2luZyB5b3VyIHN5c3RlbSByb2J1c3QiIGluIHRoZSBtYW51YWwuCisKK05ldyBpbiAwLjk1IC0gMjAwNC0wNi0xMzoKKyogQWRkIHN1cHBvcnQgZm9yIFJlaXNlckZTIDMuCisqIEZpeCBzdXBwb3J0IGZvciBGcmVlQlNEIDUuCisqIFN1cHBvcnQgQVRBUkFJRCBmb3IgTGludXggaW4gdGhlIGdydWIgc2hlbGwgYW5kIGdydWItaW5zdGFsbC4KKyogQWRkIENEUk9NIHN1cHBvcnQgZm9yIEVsIFRvcml0byB3aXRoIG5vIGVtdWxhdGlvbiBtb2RlLiBZb3UgY2FuIHVzZQorICAoY2QpIGFzIGEgQ0RST00gZHJpdmUgaW4gdGhlIGNvbmZpZyBmaWxlLgorKiBPcHRpb24gLS1uby1tZW0tb3B0aW9uIGlzIGltcGxpZWQgZm9yIExpbnV4IDIuNC4xOCBhbmQgbmV3ZXIuCisqIEFkZCBzdXBwb3J0IGZvciBVRlMyLgorCitOZXcgaW4gMC45NCAtIDIwMDQtMDEtMjU6CisqIFN1cHBvcnQgYnVpbGRpbmcgb24geDg2LTY0IHdpdGggZ2NjIC1tMzIuCisqIFVzZSBhIEJJT1MgY2FsbCB0byB0dXJuIG9uL29mZiBHYXRlIEEyMC4gVGhpcyBzaG91bGQgc29sdmUgdmFyaW91cworICBwcm9ibGVtcyByZWxhdGVkIHRvIEdhdGUgQTIwIGluIG1vZGVybiBCSU9TZXMuCisqIEFkZCBhIHdvcmthcm91bmQgZm9yIGJ1Z2d5IEJJT1NlcyAobm90YWJseSBIUCBWZWN0cmEgc2VyaWVzKSB3aGljaAorICBkb24ndCBwYXNzIHRoZSBib290IGRyaXZlIGNvcnJlY3RseS4KKyogRGlzcGxheSAiR05VIEdSVUIiIGluc3RlYWQgb2YgIkdSVUIiIGluIHRoZSBtZW51LgorKiBBZGQgc3VwcG9ydCBmb3IgUU5YIFJUUCBpbnRvIHRoZSBncnViIHNoZWxsLgorKiBBZGQgc3VwcG9ydCBmb3IgdGhlIGluaXRyZCBtYXggYWRkcmVzcyBvZiBhIGtlcm5lbCBoZWFkZXIgaW4gTGludXguCisqIFN1cHBvcnQgMzIgYml0IGFuZCA2NCBiaXQgZGV2X3QuCisqIEFkZCBzdXBwb3J0IGZvciBhbiBpbnN0YWxsIGRldmljZSBpbiBHUlVCJ3Mgbm90YXRpb24gd2l0aCBubworICBwYXJlbnRoZXNpcyAoZS5nLiBncnViLWluc3RhbGwgaGQwKS4KKyogSW1wcm92ZSB0aGUgbWFudWFsIGEgbG90LgorCitOZXcgaW4gMC45MyAtIDIwMDItMTItMDg6CisqIERlZmluZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJvb3QgbG9hZGVyIHdoZW4gdGhlIGxvYWQgZW5kIGFkZHJlc3MgaXMKKyAgemVybyBhbmQgdGhlIGJzcyBlbmQgYWRkcmVzcyBpcyB6ZXJvIGluIHRoZSBNdWx0aWJvb3QgU3BlY2lmaWNhdGlvbi4KKyAgQWxzbywgYWRkIHRoZSBzdXBwb3J0IGludG8gR1JVQi4KKyogRmluYWxseSwgd2UgaGF2ZSBhIEJ1ZyBUcmFja2luZyBTeXN0ZW0hIE5vdyB0aGUgcHJlZmVyYWJsZSB3YXkgdG8KKyAgcmVwb3J0IGJ1Z3MgaXMgdG8gdXNlIHRoZSBCVFMgcmF0aGVyIHRoYW4gc2VuZGluZyBlLW1haWwgdG8gYnVnLWdydWIuCisgIFNlZSA8aHR0cDovL2J1Z2NvbW0uZW5idWcub3JnLz9wcm9qZWN0PWdydWImbW9kZT1wcm9qZWN0PiwgZm9yIG1vcmUKKyAgZGV0YWlscy4KKyogVGhlIGFwcGVuZGl4ICJGQVEiIGluIHRoZSBtYW51YWwgaXMgcmVtb3ZlZC4gU2VlIHRoZSBHTlUgR1JVQiBGQVEgb24KKyAgdGhlIHdlYiA8aHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dydWIvZ3J1Yi1mYXEuaHRtbD4gaW5zdGVhZC4KKyogVGhlIHRlcm1pbmFsIGhhbmRsaW5nIGNvZGUgaXMgcmV3cml0dGVuIHJhZGljYWxseSwgYW5kIG1hbnkgYnVnZml4ZXMKKyAgYXJlIG1hZGUgYXQgdGhlIHNhbWUgdGltZS4KKyogVGhlIGNvbW1hbmQgImNvbG9yIiBpcyBlZmZlY3RpdmUgZXZlbiBpbiB0aGUgY29tbWFuZC1saW5lLgorKiBUaGUgY29tbWFuZCAidGVybWluYWwiIHRha2VzIHR3byBuZXcgb3B0aW9ucywgYGAtLW5vLWVjaG8nJyBhbmQKKyAgYGAtLW5vLWVkaXQnJy4gSWYgeW91IHNwZWNpZnkgYGAtLW5vLWVjaG8nJywgR1JVQiB3b24ndCBlY2hvIGJhY2sKKyAgaW5wdXQgY2hhcmFjdGVycy4gSWYgeW91IHNwZWNpZnkgYGAtLW5vLWVkaXQnJywgR1JVQiB3aWxsIGRpc2FibGUgdGhlCisgIEJBU0gtbGlrZSBlZGl0aW5nIGZlYXR1cmUuIFRoZXNlIG9wdGlvbnMgYXJlIHVzZWZ1bCB3aGVuIHVzaW5nIGFuCisgIGludGVsbGlnZW50IHRlcm1pbmFsIChzdWNoIGFzIHRoZSBjb21pbnQgbW9kZSBpbiBHTlUgRW1hY3MpLgorKiBUaGUgdXRpbGl0eSBgYGdydWItbWQ1LWNyeXB0JycgcHJvbXB0cyB0byByZXR5cGUgYSBwYXNzd29yZCBhbmQgY2hlY2tzCisgIGlmIHRoZSBwYXNzd29yZHMgbWF0Y2guCisqIFN1cHBvcnQgZm9yIGJvb3RpbmcgTGludXggaXMgcmV3cml0dGVuLCBzbyBHUlVCIG5vdyBzdXBwb3J0cworICBsYXJnZS1FQkRBIHN5c3RlbXMuCisqIFRoZSBtZW51IGludGVyZmFjZXMgc3VwcG9ydHMgUGFnZSBVcCwgUGFnZSBEb3duLCBhbmQgUmlnaHQgS2V5LgorKiBOZXcgY29tbWFuZCAidGVybWluZm8iLCBmb3IgdnQxMDAtaW5jb21wYXRpYmxlIHRlcm1pbmFscy4KKyogTmV3IG9wdGlvbnMsIGBgLUQnJywgYGAtZycnIGFuZCBgYC1tJycgYXJlIHN1cHBvcnRlZCBmb3IgRnJlZUJTRC4KKworTmV3IGluIDAuOTIgLSAyMDAyLTA0LTMwOgorKiBUaGUgY29tbWFuZCAiZGlzcGxheW1lbSIgdXNlcyBvbmx5IGhleCBkaWdpdHMgZm9yIGNvbnNpc3RlbmN5LgorKiBUaGUgbmV0Ym9vdCBjb2RlIGdvZXMgYmFjayB0byB0aGUgcHJvZ3Jlc3MgYmFycyBpbnN0ZWFkIG9mIGRvdHMsIGZvcgorICB0aGUgbm90YXRpb24gb2YgZGF0YSB0cmFuc2ZlcnMuIEFuZCwgdGhhdCBpcyBkaXNwbGF5ZWQgb25seSBpbiBkZWJ1ZworICBtb2RlLCB0aGF0IGlzIHRvIHNheSwgbm90aGluZyBpcyBkaXNwbGF5ZWQgYnkgZGVmYXVsdC4gUmVtZW1iZXIgdGhhdAorICB5b3UgY2FuIHR1cm4gb24gZGVidWcgbW9kZSB2aWEgdGhlIGNvbW1hbmQgImRlYnVnIi4KKyogVGhlIGNvbW1hbmQgImhlbHAiIGRvZXNuJ3Qgc2hvdyBhbGwgdGhlIGF2YWlsYWJsZSBjb21tYW5kcyBieSBkZWZhdWx0LAorICB3aGVuIG5vIGFyZ3VtZW50IGlzIHNwZWNpZmllZC4gUmFyZWx5IHVzZWQgY29tbWFuZHMgKHN1Y2ggYXMKKyAgInRlc3Rsb2FkIikgYW5kIHVzZWxlc3MgY29tbWFuZHMgaW4gaW50ZXJhY3RpdmUgdXNlIChzdWNoIGFzCisgICJzYXZlZGVmYXVsdCIpIGFyZSBoaWRkZW4uIElmIHlvdSB3YW50IHRvIHNlZSBoZWxwIG1lc3NhZ2VzIGZvciB0aG9zZQorICBjb21tYW5kcywgc3BlY2lmeSB0aGUgbmV3IG9wdGlvbiAiLS1hbGwiLgorKiBBIGJ1aWx0LWluLCBgbW9yZSctbGlrZSBwYWdlciBpcyBhZGRlZC4gV2hlbiBhIGNvbW1hbmQgcHJpbnRzIHRvbyBtYW55CisgIGxpbmVzIHRvIGZpdCB0aGUgc2NyZWVuLCBHUlVCIHdhaXRzIHVudGlsIHlvdSBoaXQgcmV0dXJuIGtleS4gVGhpcworICBmZWF0dXJlIGNhbiBiZSB0dXJuZWQgb2ZmIGJ5IHRoZSBuZXcgY29tbWFuZCAicGFnZXIiLgorKiBUaGUgY29tbWFuZCAidGVybWluYWwiIGFjY2VwdHMgYSBuZXcgb3B0aW9uLCAiLS1saW5lcz1MSU5FUyIuIFlvdSBjYW4KKyAgc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaW5lcyBhcmJpdHJhcmlseSB3aXRoIHRoaXMgb3B0aW9uLiBJZiB5b3UKKyAgZG9uJ3Qgc3BlY2lmeSBpdCwgdGhlIG1heGltdW0gbnVtYmVyIHdpbGwgYmUgMjQuCisqIFRoZSBjb21tYW5kICJ0ZXJtaW5hbCIgYWNjZXB0cyBhbm90aGVyIG5ldyBvcHRpb24sICItLXNpbGVudCIuIFlvdSBjYW4KKyAgc3VwcHJlc3MgdGhlICJQcmVzcyBhbnkga2V5IHRvIGNvbnRpbnVlIiBtZXNzYWdlIHdpdGggdGhpcyBvcHRpb24uCisqIFRoZSBtZW09IG9wdGlvbiBmb3IgTGludXggaXMgcmVjb2duaXplZCBhbmQgdXNlZCB0byBsaW1pdCB0aGUgbWF4aW11bQorICBhZGRyZXNzIG9mIGluaXRyZC4KKyogQSBmYWxsYmFjayBlbnRyeSBpcyBleGVjdXRlZCBpbW1lZGlhdGVseSBhZnRlciBhIGRlZmF1bHQgZW50cnksCisgIHdpdGhvdXQgcHJvbXB0aW5nIGEgdXNlcidzIGludGVydmVudGlvbiwgYXMgdGhlIG1hbnVhbCBoYXMgZXZlciBiZWVuCisgIHNheWluZy4KKyogVGhlIHV0aWxpdHkgYGBncnViLWluc3RhbGwnJyBtYWtlcyBzdXJlIHRoYXQgR1JVQiBpbWFnZXMgaGF2ZSBiZWVuCisgIHdyaXR0ZW4gdG8gYSBwaHlzaWNhbCBkaXNrIGNvbXBsZXRlbHkuIFRvIGFzc2lzdCB0aGlzIGZlYXR1cmUsIGEgbmV3CisgIGNvbW1hbmQgImR1bXAiIGlzIGFkZGVkLgorCitOZXcgaW4gMC45MSAtIDIwMDItMDEtMjE6CisqIFN1cHBvcnQgZm9yIExpbnV4IERBQzk2MCBpcyBhZGRlZC4KKyogSkZTIGFuZCBYRlMgc3VwcG9ydCBpcyBhZGRlZC4KKyogVGhlIGNvbW1hbmRzICJoaWRlIiBhbmQgInVuaGlkZSIgc3VwcG9ydCBsb2dpY2FsIHBhcnRpdGlvbnMuCisqIFRoZSB1dGlsaXR5IGBgZ3J1Yi1pbnN0YWxsJycgc3VwcG9ydHMgTmV0QlNELgorKiBUaGUgbmV0d29yayBzdXBwb3J0IGlzIHVwZGF0ZWQgdG8gRXRoZXJib290LTUuMC41LgorKiBUaGUgbWFubmVyIG9mIGhhbmRsaW5nIHRoZSBwcmVzZXQgbWVudSBjaGFuZ2VzLiBJbiB0aGUgcHJldmlvdXMKKyAgaW1wbGVtZW50YXRpb24sIHRoZSBwcmVzZXQgbWVudSBpcyB1c2VkIG9ubHkgd2hlbiBvcGVuaW5nIHRoZQorICBjb25maWd1cmF0aW9uIGZpbGUgZmFpbGVkLiBOb3cgdHJ5IHRvIHVzZSB0aGUgcHJlc2V0IG1lbnUgZmlyc3QuIEFuZCwKKyAgaWYgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBhdmFpbGFibGUsIGl0IGlzIHJlYWQgYWZ0ZXIgcmVhZG9pbmcgdGhlCisgIHByZXNldCBtZW51LiBJbiB0aGlzIGNhc2UsIG1lbnUgZW50cmllcyBpbiB0aGUgcHJlc2V0IG1lbnUgKGlmIGFueSkKKyAgYXJlIG92ZXJyaWRlZCBieSB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorKiBEaXNrbGVzcyBzdXBwb3J0IGlzIGEgYml0IGNoYW5nZWQuIEluIHRoZSBwcmV2aW91cywgR1JVQiBzZXQgdXAgYQorICBuZXR3b3JrIGF1dG9tYXRpY2FsbHkgdmlhIGEgc3BlY2lhbCBmdW5jdGlvbi4gSW4gdGhlIGN1cnJlbnQsIHRoZQorICBmdW5jdGlvbiBpcyBnb25lIGFuZCB0aGUgcHJlc2V0IG1lbnUgZmVhdHVyZSBpcyB1c2VkIChpLmUuIGp1c3QKKyAgZXhlY3V0ZSB0aGUgY29tbWFuZCAiYm9vdHAiIGFzIGlmIHlvdSBzcGVjaWZpZWQgaXQgaW4gdGhlIHByZXNldAorICBtZW51KS4gVGhpcyBoYXMgbm8gaW1wYWN0IGFnYWluc3QgbW9zdCB1c2VycywgYnV0IHlvdSBzaG91bGQgdGFrZSBjYXJlCisgIGlmIHVzaW5nIHRoZSBwcmVzZXQgbWVudSBmb3IgeW91ciBvd24gcHVycG9zZSwgYmVjYXVzZSBHUlVCIGRvZXNuJ3QKKyAgY2FsbCAiYm9vdHAiIGltcGxpY2l0bHkgd2hlbiB0aGUgcHJlc2V0IG1lbnUgaXMgdXNlZCBleHBsaWNpdGx5LiBJbgorICB0aGlzIGNhc2UsIHlvdSB3b3VsZCBwcm9iYWJseSBuZWVkIHRvIGluc2VydCBjb21tYW5kcyB0byBpbml0aWFsaXplIGEKKyAgbmV0d29yayBpbnRvIHlvdXIgcHJlc2V0IG1lbnUuCisqIEltcG9ydGFudCBidWdmaXhlcyBhcmUgbWFkZSBmb3IgUmVpc2VyRlMsIEFQTSwgVEZUUCwgTEJBLCBldGMuCisKK05ldyBpbiAwLjkwIC0gMjAwMS0wNy0xMToKKyogVGhlIGNvbW1hbmQgInNldGtleSIgcmVzZXRzIGtleSBtYXBwaW5ncywgd2hlbiBubyBhcmd1bWVudCBpcworICBzcGVjaWZpZWQuCisqIExpbnV4IGRldmZzIHN1cHBvcnQgaXMgYWRkZWQuCisqIFRoZSB1dGlsaXR5IGBgZ3J1Yi1pbnN0YWxsJycgYWNjZXB0cyBhIG5ldyBvcHRpb24sIGAtLXJlY2hlY2snLiBJZgorICB0aGlzIG9wdGlvbiBpcyBzcGVjaWZpZWQsIHByb2JlIGEgZGV2aWNlIG1hcCwgZXZlbiBpZiBpdCBhbHJlYWR5CisgIGV4aXN0cy4gWW91IHNob3VsZCB1c2UgdGhpcyBvcHRpb24gd2hlbmV2ZXIgeW91IGFkZC9yZW1vdmUgYSBkaXNrLgorKiBUaGUgY29tbWFuZCAicGFzc3dvcmQiIHN1cHBvcnRzIGEgbWQ1IHBhc3N3b3JkIGlmIHRoZSBvcHRpb24gYC0tbWQ1JworICBpcyBnaXZlbi4gIFRoaXMgY29tbWFuZCBjYW4gbm93IGFsc28gYmUgdXNlZCB0byBwcm90ZWN0IHNwZWNpZmljIG1lbnUKKyAgaXRlbXMgd2l0aCB0aGVpciBvd24gcGFzc3dvcmRzLgorKiBOZXcgY29tbWFuZCwgImRpc3BsYXlhcG0iLgorKiBOZXcgY29tbWFuZCwgIm1kNWNyeXB0Ii4KKyogVGhlIG5ldyB1dGlsaXR5IGBgZ3J1Yi1tZDUtY3J5cHQnJyBpcyBhIGZyb250ZW5kIG9mIHRoZSBncnViIHNoZWxsLiBJdAorICBlbmNyeXB0cyBhIHBhc3N3b3JkIGluIE1ENSBmb3JtYXQuCisqIE5ldyBjb21tYW5kcywgInRlc3R2YmUiIGFuZCAidmJlcHJvYmUiLgorKiBUaGUgY29uZmlndXJlIHNjcmlwdCBhY2NlcHRzIGEgbmV3IG9wdGlvbiwgYC0tZW5hYmxlLXByZXNldC1tZW51Jy4gWW91CisgIGNhbiBlbWJlZCBhbiBhcmJpdHJhcnkgY29uZmlndXJhdGlvbiB3aGljaCB3aWxsIGJlIHVzZWQgd2hlbiBTdGFnZSAyCisgIGNhbm5vdCBvcGVuIGEgcmVhbCBjb25maWd1cmF0aW9uIGZpbGUsIHdpdGggdGhpcyBvcHRpb24uIFRoZSBhcmd1bWVudAorICBtdXN0IGJlIGFuIGV4aXN0aW5nIGZpbGUuCisqIEVaLUJJT1Mgc3VwcG9ydCBpcyBhZGRlZC4KKyogQm9vdGluZyBXaW5kb3dzIGZyb20gYSBsb2dpY2FsIHBhcnRpdGlvbiBpcyBzdXBwb3J0ZWQuCisqIFRoZSBleGFtcGxlIE11bHRpYm9vdCBrZXJuZWwgaW4gdGhlIGRpcmVjdG9yeSAiZG9jcyIgaXMgYnVpbHQsIGlmIHlvdQorICBzcGVjaWZ5IHRoZSBvcHRpb24gYC0tZW5hYmxlLWV4YW1wbGUta2VybmVsJyB0byB0aGUgY29uZmlndXJlIHNjcmlwdC4KKyogTmV3IGNvbW1hbmQsICJpZmNvbmZpZyIuCisqIExpbnV4IHNvZnR3YXJlIFJBSUQgc3VwcG9ydCBpcyBhZGRlZCAob25seSBmb3IgUkFJRC0xKS4KKyogSGVyY3VsZXMgc3VwcG9ydCBpcyBhZGRlZC4KKyogVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGFjY2VwdHMgYC0tZGlzYWJsZS1hdXRvLWxpbnV4LW1lbS1vcHQnLCB3aGljaAorICBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyB5b3Ugc3BlY2lmeSB0aGUgb3B0aW9uIGAtLW5vLW1lbS1vcHRpb24nIHRvIHRoZQorICBjb21tYW5kICJrZXJuZWwiLgorKiBKdW1wIHRvIHRoZSBwaHlzaWNhbCBlbnRyeSBhZGRyZXNzIG9mIGEgTXVsdGlib290IGtlcm5lbCB3aGVuIGJvb3RpbmcKKyAgaXQgdXAuIFRoZSBvbGQgYmVoYXZpb3Igd2FzIHRvIHVzZSB0aGUgdmlydHVhbCBvbmUsIHJlZ2FyZGxlc3Mgb2YgdGhlCisgIHNldHRpbmcgb2YgdGhlIHBoeXNpY2FsIGFkZHJlc3MuCisqIFRoZSBjb21tYW5kcyAiYm9vdHAiIGFuZCAiZGhjcCIgYWNjZXB0cyBhIG5ldyBvcHRpb24KKyAgYC0td2l0aC1jb25maWdmaWxlJywgc28gdGhhdCB5b3UgY2FuIGxvYWQgYSByZW1vdGVseSBzcGVjaWZpZWQKKyAgY29uZmlndXJhdGlvbiBmaWxlIGF1dG9tYXRpY2FsbHksIGxpa2UgdGhlIG5ldHdvcmsgYm9vdCBpbWFnZXMuCisqIFZTVGEgZmlsZXN5c3RlbSBzdXBwb3J0IGlzIGFkZGVkLgorKiBFTEYgc3ltYm9sIGxvYWRpbmcgc3VwcG9ydCBpcyBhZGRlZC4KKworTmV3IGluIDAuNS45NiAtIDIwMDAtMTAtMDQ6CisqIE5ldyBjb21tYW5kcywgInJlYm9vdCIgYW5kICJoYWx0Ii4KKyogTmV3IGNvbW1hbmQsICJoaWRkZW5tZW51Ii4gWW91IGNhbiBoaWRlIHRoZSBtZW51IGludGVyZmFjZSBieSBkZWZhdWx0CisgIHdpdGggdGhpcyBjb21tYW5kLgorKiBZb3UgY2FuIHNwZWNpZnkgYC0tbm8tbWVtLW9wdGlvbicgdG8gdGhlIGNvbW1hbmQgImtlcm5lbCIsIGlmIHlvdSB3YW50CisgIEdSVUIgbm90IHRvIHBhc3MgYSBMaW51eCdzIG1lbSBvcHRpb24gYXV0b21hdGljYWxseS4KKyogTm93IEdSVUIgaXMgY29tcGxpYW50IHdpdGggdGhlIExpbnV4L2kzODYgYm9vdCBwcm90b2NvbCB2ZXJzaW9uIDIuMDIuCisqIFRoZSBuZXR3b3JrIHN1cHBvcnQgaXMgdXBkYXRlZCB0byBFdGhlcmJvb3QtNC42LjQuCisqIFN5bWxpbmtzIGluIFJlaXNlckZTIGFyZSBzdXBwb3J0ZWQuCisqIEFkZCBhIHdvcmthcm91bmQgaW50byB0aGUgZ3J1YiBzaGVsbCwgc28gdGhhdCBpdCB3b3JrcyBmaW5lIGV2ZW4gdW5kZXIKKyAgTGludXggMi40LgorKiBBZGQgYSBuZXcgb3B0aW9uIGAtLXN0YWdlMicgaW50byB0aGUgY29tbWFuZHMgImluc3RhbGwiIGFuZCAic2V0dXAiLAorICB0byBsZXQgdGhlIGdydWIgc2hlbGwga25vdyB3aGF0IHRoZSBmaWxlIG5hbWUgb2YgU3RhZ2UgMiBpcyB1bmRlciB5b3VyCisgIG9wZXJhdGluZyBzeXN0ZW0uIFlvdSBtdXN0IHNwZWNpZnkgdGhlIG9wdGlvbiBjb3JyZWN0bHksIGlmIHlvdSBjYW5ub3QKKyAgdW5tb3VudCB0aGUgcGFydGl0aW9uIHdoZXJlIEdSVUIgaW1hZ2VzIHJlc2lkZS4gV2UnZCByZWNvbW1lbmQgX25vdF8KKyAgdXNpbmcgdGhvc2UgY29tbWFuZHMgZGlyZWN0bHksIGJ1dCB1c2luZyB0aGUgdXRpbGl0eSAiZ3J1Yi1pbnN0YWxsIgorICBpbnN0ZWFkLCBiZWNhdXNlIHRoaXMgaXMgc2FmZXIuCisqIE9uZSB2aW9sYXRpb24gYWdhaW5zdCB0aGUgTmV0d29yayBCb290IEltYWdlIFByb3Bvc2FsIHdhcyBmb3VuZCBhbmQKKyAgZml4ZWQuIFNvIG5vdyB0aGUgaW1hZ2UgYG5iZ3J1YicgY2FuIHdvcmsgZmluZSBldmVuIHdpdGggYSBjYXJkIHN1Y2gKKyAgYXMgcnRsODEzOS4KKyogU2VyaWFsIHRlcm1pbmFsIHN1cHBvcnQgaXMgYWRkZWQuIFRoZSBjb25maWd1cmUgc2NyaXB0IGFjY2VwdHMKKyAgYSBuZXcgb3B0aW9uIGAtLWRpc2FibGUtc2VyaWFsJy4gVW5sZXNzIGl0IGlzIHNwZWNpZmllZCwgeW91IGNhbiB1c2UKKyAgdHdvIG5ldyBjb21tYW5kcywgInNlcmlhbCIgYW5kICJ0ZXJtaW5hbCIgaW4gdGhlIGNvbW1hbmQtbGluZSBhbmQgdGhlCisgIG1lbnUuIFNlZSB0aGUgbWFudWFsLCBmb3IgbW9yZSBkZXRhaWxzLgorKiBQcmVzZXJ2ZSB0aGUgcG9zc2libGUgbWFnaWMgbnVtYmVyIHVzZWQgYnkgV2luZG93cyBOVCBpbiBhIE1CUi4KKyogVGhlIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UgaXMgc3dpdGNoZWQgdG8gc2luZ2xlLWxpbmUgZWRpdGluZyBtb2RlLgorKiBPbmx5IGZvciBkZXZlbG9wZXJzOiB0aGUgY29uZmlndXJlIHNjcmlwdCBhY2NlcHRzCisgIGAtLWVuYWJsZS1zZXJpYWwtc3BlZWQtc2ltdWxhdGlvbicsIHdoaWNoIGlzIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvCisgIHNpbXVsYXRlIHRoZSBzcGVlZCBvZiBhIHNlcmlhbCBkZXZpY2Ugb24gYSBwc3VlZG8gdGVybWluYWwuCisqIEFsc28gb25seSBmb3IgZGV2ZWxvcGVyczogeW91IGNhbiBzcGVjaWZ5IGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRvIHRoZQorICBvcHRpb24gYC0taG9sZCcgZm9yIHRoZSBncnViIHNoZWxsLiBUaGUgYXJndW1lbnQgbWVhbnMgaG93IG1hbnkKKyAgc2Vjb25kcyB0aGUgZ3J1YiBzaGVsbCBzaG91bGQgd2FpdCB1bnRpbCBkaXZpbmcgaW50byB0aGUgbWFpbiByb3V0aW5lLgorKiBOZXcgY29tbWFuZCwgInNhdmVkZWZhdWx0Ii4gTm93IHlvdSBjYW4gc2F2ZSBjdXJyZW50IGVudHJ5IG51bWJlciB0bworICB5b3VyIGRpc2sgd2l0aCB0aGlzIGNvbW1hbmQgYW5kIHRoZW4geW91IGNhbiBzZXQgdGhlIGRlZmF1bHQgYm9vdAorICBlbnRyeSB0byBpdCBieSB0aGUgY29tbWFuZCAiZGVmYXVsdCBzYXZlZCIuCisqIEFkZCBhIG5ldyBvcHRpb24gYC0tcHJlZml4JyBpbnRvIHRoZSBjb21tYW5kICJzZXR1cCIsIHNvIHRoYXQgeW91IGNhbgorICBzcGVjaWZ5IHRoZSBuYW1lIG9mIGEgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIEdSVUIgaW1hZ2VzLiBBbmQsIHRoZQorICBiZWhhdmlvciBvZiB0aGlzIGNvbW1hbmQgY2hhbmdlZCBzbGlnaHRseSwgdGhhdCBpcywgdGhpcyBjb21tYW5kIG5vdworICBzZWFyY2hzIHN0YWdlMSBhdXRvbWF0aWNhbGx5IHVuZGVyICIvYm9vdC9ncnViIiBhbmQgIi9ncnViIiwgdW5sZXNzCisgIHlvdSBzcGVjaWZ5IHRoZSBvcHRpb24gYC0tcHJlZml4Jy4KKyogVGhlIHV0aWxpdHkgYGdydWItaW5zdGFsbCcgcmVjb2duaXplcyBhIHNlcGFyYXRlIGJvb3QgcGFydGl0aW9uCisgIGF1dG9tYXRpY2FsbHkuCisqIE5ldyBjb21tYW5kcywgInBhcnRuZXciIGFuZCAicGFydHR5cGUiLiBZb3UgY2FuIG1vZGlmeSBwYXJ0aXRpb24KKyAgdGFibGVzIHdpdGggdGhlc2UgY29tbWFuZHMuCisKK05ldyBpbiAwLjUuOTUgLSAyMDAwLTA2LTI3OgorKiBOZXRCU0QgRUxGIGtlcm5lbCBzdXBwb3J0IGlzIGFkZGVkLiBZb3UgaGF2ZSB0byBzcGVjaWZ5IHRoZSBuZXcgb3B0aW9uCisgIHRvIHRoZSBjb21tYW5kICJrZXJuZWwiLiBTZWUgYmVsb3cuCisqIEFkZGVkIGEgbmV3IG9wdGlvbiBgLS10eXBlPVRZUEUnIGludG8gdGhlIGNvbW1hbmQgImtlcm5lbCIuIFRoaXMKKyAgb3B0aW9uIHN1Z2dlc3RzIHdoYXQgdHlwZSBvZiBrZXJuZWwgeW91IHdhbnQgdG8gbG9hZC4gVFlQRSBtdXN0IGJlCisgIGVpdGhlciBvZiAibmV0YnNkIiwgImZyZWVic2QiLCAib3BlbmJzZCIsICJsaW51eCIsICJiaWdsaW51eCIgYW5kCisgICJtdWx0aWJvb3QiLiBBY3R1YWxseSwgdGhpcyBvcHRpb24gd2lsbCBiZSBuZWNlc3Nhcnkgb25seSBpZiB5b3Ugd2FudAorICB0byBsb2FkIGEgTmV0QlNEIEVMRiBrZXJuZWwsIGJlY2F1c2UgR1JVQiBjYW4gYXV0b21hdGljYWxseSBkZXRlcm1pbmUKKyAgYSBrZXJuZWwgdHlwZSBpbiB0aGUgb3RoZXIgY2FzZXMuCisqIFJlaXNlckZTIHN1cHBvcnQgaXMgYWRkZWQuCisqIEFkZGVkIGEgbmV3IG9wdGlvbiBgLS1mb3JjZS1sYmEnIGludG8gdGhlIGNvbW1hbmQgImluc3RhbGwiLiBUaGlzCisgIG9wdGlvbiBkaXNhYmxlcyBzb21lIHNhbml0eSBjaGVja3MgZm9yIExCQSBtb2RlIChidXQgbm90IGFsbCkuIElmIHlvdQorICBhcmUgc3VyZSB0aGF0IHlvdXIgbWFjaGluZSBzdXBwb3J0cyBMQkEgbW9kZSBidXQgR1JVQiBkb2Vzbid0IHdvcmsgaW4KKyAgTEJBIG1vZGUsIHlvdSBzaG91bGQgc3BlY2lmeSBpdC4gSXQgaXMgbmVjZXNzYXJ5IGlmIHlvdXIgQklPUyBpcyB0b28KKyAgYnVnZ3kuIEluIHRoZSBwcmV2aW91cyB2ZXJzaW9uLCBpdCB3YXMgYSBjb21waWxlLXRpbWUgb3B0aW9uLCBidXQgeW91CisgIGRvbid0IGhhdmUgdG8gcmVjb21waWxlIEdSVUIgYW55IGxvbmdlci4KKyogTGlrZXdpc2UsIG5vdyB0aGUgY29tbWFuZCAic2V0dXAiIGFuZCB0aGUgc2NyaXB0ICJncnViLWluc3RhbGwiIGFsc28KKyAgYWNjZXB0IGAtLWZvcmNlLWxiYScgb3B0aW9uLiBTcGVjaWZ5aW5nIHRoaXMgb3B0aW9uIHRvICJzZXR1cCIgb3IKKyAgImdydWItaW5zdGFsbCIgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyB0byB0aGUgY29tbWFuZCAiaW5zdGFsbCIuCisqIFRoZSBjb25maWd1cmUgc2NyaXB0IGRvZXNuJ3QgYWNjZXB0IHRoZSBvcHRpb24KKyAgYC0tZGlzYWJsZS1sYmEtc3VwcG9ydC1iaXRtYXAtY2hlY2snIGFueSBsb25nZXIuIFVzZSB0aGUgb3B0aW9uIGFib3ZlLgorKiBUaGUgbmV0d29yayBzdXBwb3J0IGlzIHVwZGF0ZWQgdG8gRXRoZXJib290LTQuNi4xLiBTbyBub3cgd2UgaGF2ZQorICAzQ29tNTl4IGFuZCBERVBDQSBkcml2ZXJzLgorKiBOb3cgeW91IGNhbiBvbWl0IHRoZSBjb25maWd1cmF0aW9uIGZpbGUgYXJndW1lbnQgdG8gdGhlIGNvbW1hbmQKKyAgInBhc3N3b3JkIi4gSWYgeW91IG9taXQgaXQsIHRoZW4gR1JVQiB3aWxsIGp1c3QgdW5sb2NrIHByaXZpbGVnZWQKKyAgaW5zdHJ1Y3Rpb25zIChzdWNoIGFzIGBjJykgd2hlbiB5b3UgZW50ZXIgYSBjb3JyZWN0IHBhc3N3b3JkLgorKiBUaGUgbmV3IGNvbW1hbmQgImxvY2siIGNhbiBiZSB1c2VkIHRvIHByZXZlbnQgZW5kLXVzZXJzIGZyb20gZXhlY3V0aW5nCisgIGFyYml0cmFyeSBtZW51IGVudHJpZXMuIFRoaXMgY29tbWFuZCB3aWxsIGVtaXQgYW4gZXJyb3IgdW50aWwgdGhlIHVzZXIKKyAgZW50ZXJzIGEgY29ycmVjdCBwYXNzd29yZC4KKyogUmVjb2duaXplIHRoZSBMaW51eCBleHRlbmRlZCBwYXJ0aXRpb24gdHlwZS4KKyogUGFzcyBhIGNvcnJlY3QgbWVtb3J5IHNpemUgdG8gTGludXggYW5kICpCU0QuCisqIERpc2tsZXNzIHN1cHBvcnQgaXMgYWRkZWQuIE5vdyBjb25maWd1cmUgYWNjZXB0cyAtLWVuYWJsZS1kaXNrbGVzcywKKyAgYW5kICJtYWtlIiB3aWxsIHByb2R1Y2UgdHdvIGFkZGl0aW9uYWwgaW1hZ2VzLCBgYG5iZ3J1YicnIGZvciBOZXQgQm9vdAorICBJbWFnZSBQcm9wb3NhbCBhbmQgYGBweGVncnViJycgZm9yIFByZWJvb3QgRXhlY3V0aW9uIEVudmlyb25tZW50LiBTZWUKKyAgdGhlIGRvY3VtZW50YXRpb24sIGZvciBtb3JlIGRldGFpbHMuCisqIFRoZSBjb21tYW5kICJ0ZnRwc2VydmVyIiBvdmVycmlkZXMgYSBURlRQIHNlcnZlciBhZGRyZXNzIHJldHVybmVkIGJ5IGEKKyAgQk9PVFAgc2VydmVyLCBhIERIQ1Agc2VydmVyIG9yIGEgUkFSUCBzZXJ2ZXIuCisqIEZpeCBhIHNlcmlvdXMgYnVnIGFib3V0IExCQSBzdXBwb3J0LiBJdCBpcyBwb3NzaWJsZSB0aGF0IHlvdSBkb24ndAorICBkaXNhYmxlIHRoZSBMQkEgc3VwcG9ydCBiaXRtYXAgY2hlY2sgYW55IGxvbmdlci4gUGxlYXNlIHNlbmQgYSByZXBvcnQsCisgIGlmIHlvdSBtdXN0IHN0aWxsIGRpc2FibGUgaXQuIFdlIG5lZWQgdG8ga25vdyBpZiB3ZSBzaG91bGQgZ2V0IHJpZCBvZgorICB0aGUgb3B0aW9uLgorCitOZXcgaW4gMC41Ljk0IC0gMjAwMC0wMy0wNjoKKyogU3RhZ2UgMSBzdXBwb3J0cyBib3RoIHRoZSBMQkEgbW9kZSBhbmQgdGhlIENIUyBtb2RlLgorKiBUaGUgTmV0QlNEIGFuZCBPcGVuQlNEIGJvb3QgYnVnIGlzIGZpeGVkLgorKiBUaGUgbW9yZSBhdXRvbWF0aWMgaW5zdGFsbGF0aW9uIGNvbW1hbmQgInNldHVwIiBpcyBhZGRlZC4KKyogVGhlIGNvbW1hbmQgImVtYmVkIiBlbWJlZHMgYSBTdGFnZSAxLjUgaW4gdGhlIHNlY3RvcnMgYWZ0ZXIgYSBNQlIuCisqIFN1cHBvcnQgc3ltYm9saWMgY29sb3IgbmFtZSBzeW50YXggaW4gdGhlIGNvbW1hbmQgImNvbG9yIi4KKyogVGhlIGdydWIgc2hlbGwgbG9hZHMgdGhlIEJJT1MgZHJpdmUgbWFwcGluZyBpbmZvcm1hdGlvbiBmcm9tIGEgZGV2aWNlCisgIG1hcCBmaWxlIGlmIGl0IGlzIHNwZWNpZmllZCBhbmQgY2FuIGJlIG9wZW5lZC4gSWYgbm90IGZvdW5kLCB0cnkgdG8KKyAgY3JlYXRlIGl0IGJhc2VkIG9uIHRoZSBndWVzc2VkIGluZm9ybWF0aW9uLgorKiBOZXRCU0Qgc3VwcG9ydCBpbiB0aGUgZ3J1YiBzaGVsbCBpcyBpbXByb3ZlZC4KKyogQSBzaW1wbGUgY2hlY2tlciBmb3IgdGhlIGZvcm1hdCBvZiBhIE11bHRpYm9vdCBrZXJuZWwsIGBgbWJjaGsnJywgaXMKKyAgYWRkZWQuCisqIFRoZSBjb21tYW5kICJmaW5kIiBzZWFyY2hlcyBmb3IgYSBmaWxlbmFtZSBpbiBhbGwgZGV2aWNlcyBhbmQgcHJpbnQKKyAgdGhlIGxpc3Qgb2YgdGhlIGRldmljZXMgd2hpY2ggY29udGFpbiB0aGUgZmlsZS4KKyogVGhlIGNvbW1hbmQgIm1hcCIgbWFwcyBhIGRyaXZlIHRvIGFub3RoZXIgZHJpdmUgc28gdGhhdCB3ZSBjYW4KKyAgY2hhaW4tbG9hZCBzb21lIGZvb2xpc2ggb3BlcmF0aW5nIHN5c3RlbXMgKHN1Y2ggYXMgRE9TKSBldmVuIGlmIHN1Y2gKKyAgYW4gb3BlcmF0aW5nIHN5c3RlbSByZXNpZGVzIGF0IGEgbm9uLWZpcnN0IGRyaXZlLgorKiBUaGUgY29tbWFuZCAic2V0a2V5IiBtYXBzIGEga2V5IHRvIGFub3RoZXIuCisqIFRoZSBHUlVCIG1hbnVhbCBpcyByZXdyaXR0ZW4sIGFuZCBub3cgY29uc2lzdHMgb2YgdGhyZWUgcGFydHMgYW5kCisgIGFwcGVuZGljZXMuCisqIFRoZSBjb21tYW5kICJpb3Byb2JlIiBkZXRlY3RzIHdoYXQgSS9PIHBvcnRzIGFyZSB1c2VkIGZvciBhIEJJT1MKKyAgZHJpdmUuCisqIE9wZW5CU0Qgc3VwcG9ydCBpbiB0aGUgZ3J1YiBzaGVsbCBpcyBpbXByb3ZlZC4KKyogVGhlIGNvbW1hbmQgImluc3RhbGwiIGNhbiBub3cgcGF0Y2ggYSBTdGFnZSAyIHdpdGggYSBkaWZmZXJlbnQKKyAgZmlsZW5hbWUgZnJvbSAiL2Jvb3QvZ3J1Yi9tZW51LmxzdCIgZXZlbiBpZiBhIFN0YWdlIDEuNSBpcyB1c2VkLgorKiBOZXcgcHJvZ3JhbSwgYGBncnViLWluc3RhbGwnJy4KKyogVGhlIGNvbW1hbmQgImJsb2NrbGlzdCIgcHJpbnRzIHRoZSBibG9ja2xpc3Qgbm90YXRpb24gb2YgYSBmaWxlLgorKiBUaGUgY29tbWFuZCAiY2hhaW5sb2FkZXIiIG5vdyBhY2NlcHRzIGFuIG9wdGlvbiAiLS1mb3JjZSIsIHdoaWNoIGlzCisgIHJlcXVpcmVkIGlmIHlvdSB3YW50IHRvIGNoYWluLWxvYWQgYSBib290IGxvYWRlciBkZWZlY3RpdmUgaW4gdGhlCisgIHNpZ25hdHVyZSwgc3VjaCBhcyBTQ08gVW5peHdhcmUgNy4xLgorKiBUaGUgbmV0Ym9vdCBzdXBwb3J0IGlzIGhlYXZpbHkgcmV3cml0dGVuLCBiYXNlZCBvbiBFdGhlcmJvb3QtNC40LjMuCisgIE1vc3Qgb2YgdGhlIGRldmljZSBkcml2ZXJzIGFyZSBzdG9sZW4gZnJvbSBpdCwgc28gd2Ugbm93IGhhdmUgbWFueQorICBuZXR3b3JrIGRyaXZlcnMuIFNlZSBuZXRib290L1JFQURNRS5uZXRib290IGZvciBtb3JlIGRldGFpbHMuCisqIE5vdyBjb25maWd1cmUgYWNjZXB0cyB0aGUgb3B0aW9uIGAtLWRpc2FibGUtbGJhLXN1cHBvcnQtYml0bWFwLWNoZWNrJworICB0byBpZ25vcmUgYW4gaW5jb3JyZWN0IExCQSBzdXBwb3J0IGJpdG1hcCByZXR1cm5lZCBieSBhIGJ1Z2d5IEJJT1MuIElmCisgIHlvdSBhcmUgc3VyZSB0aGF0IHlvdXIgQklPUyBkb2VzIHN1cHBvcnQgTEJBIG1vZGUgYnV0IEdSVUIgZG9lc24ndAorICB3b3JrIGluIExCQSBtb2RlLCByZWNvbXBpbGUgR1JVQiB3aXRoIHRoaXMgb3B0aW9uIHNwZWNpZmllZC4gWW91IGNhbgorICBjaGVjayBpZiBHUlVCIGFjY2Vzc2VzIGEgZHJpdmUgaW4gTEJBIG1vZGUgYnkgdGhlIGNvbW1hbmQgImdlb21ldHJ5Ii4KKyogTmV3IGNvbW1hbmRzICJib290cCIsICJkaGNwIiBhbmQgInJhcnAiIGNhbiBiZSB1c2VkIHRvIGluaXRpYWxpemUgYQorICBuZXR3b3JrIGRldmljZSBhbmQgZ2V0IElQIGFkZHJlc3NlcyBmcm9tIGEgbmV0d29yay4KKyogTG9uZyBmaWxlbmFtZSBzdXBwb3J0IGluIHRoZSBGQVQgZmlsZXN5c3RlbSBpcyBhZGRlZC4KKyogVGhlIGNvbW1hbmQgImNtcCIgY29tcGFyZXMgZWFjaCBieXRlcyBpbiB0d28gZmlsZXMuCisKK05ldyBpbiAwLjUuOTMgLSAxOTk5LTEwLTMwOgorKiBFTEYgZm9ybWF0IG9mIEZyZWVCU0Qga2VybmVsIGlzIHN1cHBvcnRlZC4KKyogU3VwcG9ydCB0aGUgcGFydGl0aW9uIGlkcyBmb3IgTmV0QlNEIGFuZCBPcGVuQlNELgorKiBFeGl0IGZyb20gdGhlIGdydWIgc2hlbGwganVzdCBieSBwdXNoaW5nIHRoZSBrZXkgYHEnIGluIHRoZSBtZW51LgorKiBOZXcgb3B0aW9ucyBmb3IgY29uZmlndXJlIGNhbiBkaXNhYmxlIHNvbWUgZnVuY3Rpb25zIGluIFN0YWdlIDIuIFNlZQorICB0aGUgb3V0cHV0IGZyb20gYGNvbmZpZ3VyZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLgorKiBGQVQzMiBzdXBwb3J0IGlzIGFkZGVkLgorKiBNaW5peCBmcyBzdXBwb3J0IGlzIGFkZGVkLgorKiBOZXcgY29tbWFuZHMgImhpZGUiIGFuZCAidW5oaWRlIi4KKyogVGhlIGNoYXJhY3RlciBgPScgYWZ0ZXIgYSBjb21tYW5kIGlzIG5vdCBuZWNlc3NhcnkgYW55IGxvbmdlciwgYnV0IGl0CisgIGlzIHN1cHBvcnRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKyogVGhlIGNvbW1hbmQgImhlbHAiIGRpc3BsYXlzIGhlbHBmdWwgaW5mb3JtYXRpb24gYWJvdXQgYnVpbHRpbgorICBjb21tYW5kcy4KKyogVGhlIGNvbW1hbmQgImdlb21ldHJ5IiBkaXNwbGF5cyB0aGUgaW5mb3JtYXRpb24gb2YgYSBkcml2ZSBzcGVjaWZpZWQKKyAgYW5kIHNldCB0aGUgZ2VvbWV0cnkgdG8gYXJiaXRyYXJ5IEMvSC9TIHZhbHVlcyBpZiB0aGUgb3B0aW9uYWwKKyAgYXJndW1lbnRzIGFyZSB1c2VkLgorKiBUaGUgY29tbWFuZCAiY29uZmlnZmlsZSIgbG9hZHMgYSBjb25maWd1cmF0aW9uIGZpbGUgaW50ZXJhY3RpdmVseS4KKyogVGhlIGNvbW1hbmQgImRldmljZSIgYXNzaWducyBhIEJJT1MgZHJpdmUgdG8gYW4gYXJiaXRyYXJ5IGZpbGVuYW1lIGluCisgIHRoZSBncnViIHNoZWxsLgorKiBUaGUgb3B0aW9uIGAtLW5vLWZsb3BweScgZm9yY2UgdGhlIGdydWIgc2hlbGwgdG8gYXNzdW1lIHRoYXQgdGhlcmUgaXMKKyAgbm8gZmxvcHB5LCBhbmQgdGhlIG9wdGlvbiBgLS1wcm9iZS1zZWNvbmQtZmxvcHB5JyBlbmFibGVzIHRoZSBwcm9iZSBvZgorICB0aGUgc2Vjb25kIGZsb3BweSBkcml2ZS4KKyogSW50ZWdyYXRlZCB0aGUgbmV0Ym9vdCBzdXBwb3J0IGluIHRoZSBEcmVzZGVuIHZlcnNpb24gb2YgR1JVQi4KKyogRnJlZUJTRCBzdXBwb3J0IGluIHRoZSBncnViIHNoZWxsIGlzIGltcHJvdmVkLgorKiBLaWxsaW5nIChDLXUgYW5kIEMtayksIHlhbmtpbmcgKEMteSkgYW5kIG1hbmlwdWxhdGluZyB0aGUgaGlzdG9yeQorICAoQy1wIGFuZCBDLW4pIGFyZSBzdXBwb3J0ZWQuCisqIFRoZSBhZGRyZXNzIGFyZ3VtZW50IGZvciB0aGUgY29tbWFuZCAiaW5zdGFsbCIgaXMgbm93IG9wdGlvbmFsLgorKiBCZXR0ZXIgY29tcGxldGlvbiBzdXBwb3J0LgorKiBUaGUgY29tbWFuZCAiY2F0IiBkaXNwbGF5cyB0aGUgY29udGVudHMgb2YgYSBmaWxlLgorCitOZXcgaW4gMC41LjkyIC0gMTk5OS0wNy0yNjoKKyogQnVnIGZpeGVzIChpLmUuIFN0YWdlIDEuNSBjYW4gd29yayBmaW5lIGFnYWluKS4KKyogVGhlIC9zYmluL2dydWIgc3RhZ2UyIHNpbXVsYXRvciBub3cgd29ya3MgYXQgbGVhc3Qgb24gR05VL0xpbnV4LCBhbmQKKyAgdXNlcyB0aGUgTGludXggSERJT19HRVRHRU8gaW9jdGwgdG8gZGV0ZXJtaW5lIGhhcmQgZGlzayBnZW9tZXRyeS4KKyogVEFCIG5vdCBvbmx5IGxpc3RzIGZpbGVuYW1lcywgYnV0IGFsc28gY29tcGxldGVzIGEgZmlsZW5hbWUgd2hlbiB0aGUKKyAgZmlsZW5hbWUgaXMgdW5pcXVlLgorKiBQYXNzd29yZCBpcyBub3QgZWNob2VkIGJhY2ssIHB1dCBhbiBhc3RlcmlzayBmb3IgZWFjaCBvZiBpbnB1dAorICBjaGFyYWN0ZXJzLgorKiBzdGFnZTJfZGVidWcgaXMgcmVtb3ZlZCwgYW5kIHRoZSBkZWJ1Z2dpbmcgZmVhdHVyZXMgYXJlIGFkZGVkIGludG8KKyAgc3RhZ2UyLgorKiBDb2xvciBtZW51IHN1cHBvcnQuCisqIE5ldyBjb21tYW5kICJxdWl0Ii4KKyogVGhlIG1hbiBwYWdlIGZvciAvc2Jpbi9ncnViLgorKiBBbGwgZG9jdW1lbnRzIGJlY29tZSBUZXhpbmZvLgorKiBMaW51eCB2aWRlbyBtb2RlIHNlbGVjdGlvbiBpcyBzdXBwb3J0ZWQuCisqIFRoZSBuZXcgU3RhZ2UgMSBgc3RhZ2UxX2xiYScgc3VwcG9ydHMgTEJBIGFkZHJlc3NpbmcgbW9kZS4KKworTmV3IGluIDAuNS45MSAtIDE5OTktMDMtMTQsIEdvcmRvbiBNYXR6aWdrZWl0OgorKiBMQkEgYW5kIHByZWxpbWluYXJ5IEFXQVJEIEJJT1MgZGlzayBleHRlbnNpb24gc3VwcG9ydC4KKyogU3RhcnRlZCBkb2NzL2dydWIudGV4aS4KKyogL3NiaW4vZ3J1YiBHVUkgbm93IHdvcmtzIChidXQgaXQgZG9lc24ndCB5ZXQgYWNjZXNzIGRpc2tzIHByb3Blcmx5KS4KKyAgUnVuIGBjb25maWd1cmUgLS1lbmFibGUtc2Jpbi1ncnViJyB0byBidWlsZCB0aGlzIHByb2dyYW0gaW4gdGhlIGdydWIKKyAgc3ViZGlyZWN0b3J5LgorCitOZXcgaW4gMC41LjkwIC0gMTk5OS0wMy0wMSwgR29yZG9uIE1hdHppZ2tlaXQ6CisqIEJ1ZyBmaXhlcy4KKyogR1JVQiB1bmRlcnN0YW5kcyBzeW1saW5rcyBvbiBleHQyZnMgKGJ1dCBzdGlsbCBub3QgZmZzKS4KKyogTWFueSBzb3VyY2UgY29kZSBhbmQgYnVpbGQgY2xlYW51cHMgdG8gY29tcGx5IHdpdGggR05VIHN0YW5kYXJkcy4KKworTmV3IGluIDAuNSAtIDE5OTgtMDgtMjAsIEVyaWNoIEJvbGV5bjoKKworKiBJbXByb3ZlZCBlcnJvciBtZXNzYWdlcyBpbiB0aGUgc3RhZ2UxIHRvIGJlIHN0cmluZ3MgKGVhc2llciB0byByZWFkCisgIHRoYW4gdGhlIHByZXZpb3VzIGNhc2Ugb2Ygc2luZ2xlIGNoYXJhY3RlcnMpLCBhbmQgcmVtb3ZlZCBhbnkKKyAgZGlzcGxheSBpbiB0aGUgY2FzZSBvZiBubyBlcnJvciAobGVzcyBjb25mdXNpbmcpLgorCisqIE5ldyBkb2N1bWVudCBkZXNjcmliaW5nIGVycm9yIGNvbmRpdGlvbnMgYW5kIG1lc3NhZ2VzLgorCisqIEltcHJvdmVkIGNvbmZpZ3VyZS9idWlsZCBwcm9jZXNzLgorCisqIE1hZGUgdGhlIGVhcmx5IGJvb3R1cCBpbnRlcnJ1cHQtc2FmZS4gIFdhc24ndCBkb2luZyBjbGkvc3RpIHdoZW4KKyAgbmVjZXNzYXJ5IHNvbWV0aW1lcy4KKworKiBHUlVCIG5vdyBzaHV0cyBvZmYgdGhlIGZsb3BweSBiZWZvcmUgdHJhbnNmZXJyaW5nIGNvbnRyb2wgdG8gYW55CisgIG90aGVyIHByb2dyYW1zL21vZHVsZXMvbG9hZGVycy4gIChjaGFpbi1sb2FkaW5nIGRvZXNuJ3QgbWF0dGVyIGhlcmUsCisgIGp1c3QgbG9hZGluZyAzMi1iaXQgbW9kdWxlcy9rZXJuZWxzKQorCisqIEZpeGVkIGEgZmV3IHN0dXBpZCBidWdzLCBpbmNsdWRpbmcgYSBzZXZlcmFsIGluIHRoZSBleHQyZnMgY29kZS4KKworKiBMaW51eCBib290IGZvcm1hdCBzdXBwb3J0IGV4dGVuZGVkIGZyb20ganVzdCAiekltYWdlIiB0byBpbmNsdWRlCisgICJiekltYWdlIiBhbmQgaW5pdGlhbCByYW1kaXNrIChhbHNvIGNhbGxlZCAiaW5pdHJkIikgc3VwcG9ydCBmb3IKKyAgYm90aC4gICJpbml0cmQiIHN1cHBvcnQgaXMgdW50ZXN0ZWQsIGJ1dCB0aGUgY3JpdGljYWwgcGFydHMgd2VyZQorICB0YWtlbiBmcm9tIGEgc3VwcGxpZWQgcGF0Y2ggYW5kIHNlZW0gT0suCisKKyogU2V2ZXJhbCBuZXcgY29tbWFuZCBmZWF0dXJlcy4gIFNlZSB0aGUgY29tbWFuZC1saXN0aW5nIGZvciBkZXRhaWxzLgorCitOZXcgaW4gMC40IC0gMTk5OC0wMy0xOSwgRXJpY2ggQm9sZXluOgorCisqIEdSVUIgbm93IGNvcnJlY3RseSBwb2ludHMgRVM6U0kgYXQgYSBwYXJ0aXRpb24gZGVzY3JpcHRvciB3aGVuCisgIGNoYWluLWxvYWRpbmcuCisKKyogTWFueSBtaW5vciBidWdzIGZpeGVkIChzb21lIGluIHRoZSBidWlsZCBzY3JpcHRzKS4KKworKiBJbnRlbCBNUFMgMS40IGNvbmZpZy9jaGVjayBjb2RlIGlzIHRvdGFsbHkgbmV3LCBhbmQgdGhlICJzeXNjbWQ9IgorICBjb21tYW5kIGlzIGNvbXBsZXRlbHkgcmVtb3ZlZC4gIENoZWNrIGNvbW1hbmQtbGlzdGluZyBmb3IgZGV0YWlscy4KKworVmVyc2lvbiAwLjQtcHJlLCBFcmljaCBCb2xleW46CisKKyogUmVvcmdhbml6ZWQgZG9jcywgbW92ZWQgbW9zdCAiTk9URSIgaXRlbXMgdG8gYSBGQVEgKHdpdGggbmV3IGVudHJpZXMKKyAgYXMgd2VsbCkuCisKKyogTm93IHN1cHBvcnRzIGF1dG9tYXRpYyBkZWNvbXByZXNzaW9uIG9mIGFueSBmaWxlcyBsb2FkZWQgdmlhIHRoZQorICBHUlVCIHN0YWdlMiBmaWxlc3lzdGVtIGNvZGUuICBTaW1wbHkgY29tcHJlc3MgdGhlIGZpbGUgdXNpbmcgR05VCisgIGd6aXAgbm9ybWFsbHksIHRoZW4gd2hlbiBsb2FkaW5nLCB0aGUgR1JVQiBpbnRlcm5hbHMgd2lsbCBzZWUgdGhlCisgIGNvbnRlbnRzIGluIHRoZSBkZWNvbXByZXNzZWQgc3RhdGUuLi4gIGkuZS4gYWxsIEdSVUIgZnVuY3Rpb25zCisgIG9wZXJhdGUgbm9ybWFsbHkgYXMgaWYgaXQgaXMgdGhlIHVuY29tcHJlc3NlZCBmaWxlLiAgQW4gZXh0cmEKKyAgdmVyc2lvbiBvZiB0aGUgIm1vZHVsZSIgbG9hZGluZyBmdW5jdGlvbiBoYXMgYmVlbiBhZGRlZCB3aGljaAorICBkaXNhYmxlcyB0aGlzIGZ1bmN0aW9uYWxpdHkgaWYgZGVzaXJlZCAoaW4gYWxsIHRoZSBvdGhlciBjYXNlcywgbm90CisgIGRlY29tcHJlc3NpbmcgZG9lc24ndCBtYWtlIHNlbnNlKS4KKworKiBDaGFuZ2VkIGRldmljZSBzdHJpbmdzIHVzZWQgaW4gZmlsZXN5c3RlbSBjb2RlIHRvIG1vcmUgbG9naWNhbAorICBmb3JtYXQuICBBZGRlZCAicmVsYXRpdmUiIGRpc2sgYW5kIHBhcnRpdGlvbiBjYXBhYmlsaXR5LCBzZWUKKyAgY29tbWFuZC1saXN0aW5nIGFuZCBmaWxlc3lzdGVtIHN5bnRheCBkZXNjcmlwdGlvbiBmb3IgZGV0YWlscy4KKworKiAiaW5zdGFsbD0iIGNvbW1hbmQgdmFzdGx5IGltcHJvdmVkLiAgQWxzbyBtb3ZlZCB0byBub24tZGVidWcgYXJlYS4KKyAgQ2hlY2sgY29tbWFuZC1saXN0aW5nIGFuZCBpbnN0YWxsIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCisKKyogQWRkZWQgc2V2ZXJhbCBuZXcgY29tbWFuZHM6ICJyb290bm92ZXJpZnk9IiwgInVwcGVybWVtPSIsIGFuZCBhIG5ldworICBkZWJ1ZyBjb21tYW5kICJkaXNwbGF5bWVtIi4gIENoZWNrIGNvbW1hbmQtbGlzdGluZyBmb3IgZGV0YWlscy4KKworKiBBZGRlZCB2ZXJzaW9uaW5nIG51bWJlcnMgKGFuZCBzdWJzZXF1ZW50bHkgYnJva2UgY29tcGF0aWJpbGl0eSB3aXRoCisgIHNvbWUgb2YgdGhlIHByZXZpb3VzIGNvZGUsIHNvIEdSVUIgc2hvdWxkIGJlIHJlLWluc3RhbGxlZCEpLgorCisqIEFkZGVkIHVuYXR0ZW5kZWQgYm9vdGluZyBzdXBwb3J0IHZpYSBuZXcgImZhbGxiYWNrPSIgY29tbWFuZC4KKworKiBEdXJpbmcgZGVidWcgcHJvYmUgb2YgU01QIGNvbmZpZ3VyYXRpb24gdGFibGUgY29tcGF0aWJsZSB3aXRoIEludGVsCisgIE1QUyAxLjQgc3RhbmRhcmQsIEdSVUIgbm93IGNoZWNrcyBmb3IgYSBwb2ludGVyIGluIHRoZSBFQkRBLgorCisqIFVzaW5nIGEgImRlZmF1bHQ9IiBlbnRyeSBncmVhdGVyIHRoYW4gMTEgY2F1c2VkIHRoZSBVSSB0byBkbyBmdW5ueQorICB0aGluZ3MgKGl0IGRpZG4ndCBwcmUtc2Nyb2xsIHRoZSBsaXN0IHRvIHRoZSBhcHByb3ByaWF0ZSBwbGFjZSkuCisKKyogUmVhZGluZyBmaWxlcyBvbiBGQVQgZmxvcHBpZXMgaGFkIHlldCBtb3JlIHByb2JsZW1zIHJlbGF0ZWQgYnkgbWFueQorICB1c2VycyBvZiB2ZXJzaW9uIDAuMyA2LzE3Lzk2LiAgQWdhaW4sIGFsbCBrbm93biBwcm9ibGVtcyBmaXhlZC4KKworKiAiRXh0ZW5kZWQiIHBhcnRpdGlvbnMgbm93IHdvcmsgKHN0aWxsIGNhbm5vdCBtYWtlIGFuIGV4dGVuZGVkCisgIHBhcnRpdGlvbiBhY3RpdmUgd2l0aCAibWFrZWFjdGl2ZSIgY29tbWFuZCkuCisKKyogVGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIGdyZWF0bHkgc2ltcGxpZmllZCwgbm93IHVzaW5nIGFuCisgIGF1dG9jb25mLWxpa2UgImNvbmZpZ3VyZSIgc2NyaXB0LgorCitOZXcgaW4gMC4zLTE5OTYwNjE3IC0gMTk5Ni0wNi0xNywgRXJpY2ggQm9sZXluOgorCisqIFlldCBtb3JlIGRvY3VtZW50YXRpb24gaW1wcm92ZW1lbnRzLgorCisqIEtub3duIGJ1Z3MgaW4gZmxvcHB5IG9wZXJhdGlvbiBmaXhlZCAoMTItYml0IEZBVCBkaWRuJ3Qgd29yayBmb3IKKyAgbW9zdCBjYXNlcywgYW5kIGluc2VydGluZyBvdGhlciBmbG9wcGllcyBkaWRuJ3QgZmx1c2ggdGhlIGZpbGVzeXN0ZW0KKyAgY2FjaGUpLgorCisqIE5BU1RZIHVuaW5pdGlhbGl6ZWQgcG9pbnRlciBidWcgY2F1c2luZyAicmF3IiBmbG9wcHkgb3BlcmF0aW9uIHRvCisgIGNyYXNoIG9uIHNldmVyYWwgUENzIGlzIG5vdyBmaXhlZC4gIFRoaXMgc2VlbXMgdG8gaGF2ZSBiZWVuIHRoZSByb290CisgIGNhdXNlIG9mIGFsbCBvZiB0aGUgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyB0aGF0IGhhdmUgY3VycmVudGx5IGJlZW4KKyAgb2JzZXJ2ZWQuCisKKyogZGVidWctbW9kZSBjb21tYW5kIGFkZGVkIHRvIGF1dG9tYXRlIG1vc3QgZGlmZmljdWx0IHN0ZXAgb2YKKyAgaW5zdGFsbGF0aW9uIGZvciBjb21tb24gY2FzZXMgKG5ldyBpbnN0YWxsIG1ldGhvZCAjNCkuCisKKyogVGVzdGluZyAibWluaS1kZWJ1Z2dlciIgbm93IG1lcmdlZCB3aXRoIGNvbW1hbmQtbGluZSB3aGVuICJERUJVRyIKKyAgZGVmaW5lZCBpbiBjb21waWxlIChubyBTWVNERUJVRyBvcHRpb24gYW55bW9yZSkuICBTZWUgZGVzY3JpcHRpb24gb2YKKyAgY29tbWFuZHMgaW4gdGhlIGNvbW1hbmQtbGluZSBmb3IgZGV0YWlscy4KKworTmV3IGluIDAuMy0xOTk2MDYwMiAtIDE5OTYtMDYtMDIsIEVyaWNoIEJvbGV5bjoKKworKiBDb21wbGV0ZWQgaW5pdGlhbCBsaWNlbnNlcy4KKworKiBJbml0aWFsIGZpbGVzeXN0ZW0gZG9jdW1lbnRhdGlvbiB3cml0dGVuLgorCisqIEJsb2NrLWxpc3QgYW5kIEZBVCBmaWxlc3lzdGVtcyBub3cgd29yayBhcyBkb2N1bWVudGVkIChpbgorICBwYXJ0aWN1bGFyLCBmb3IgdGhlIGJsb2NrbGlzdCBmaWxlc3lzdGVtLCBzaG9ydGN1dHMgbGlrZSAiKzEiIGZvcgorICAiMCsxLDUxMiIgbm93IHdvcmsgY29ycmVjdGx5KS4KKworKiBGaXhlZCBzZXZlcmFsIHByb2JsZW1zIChvbGQgYW5kIG5ldykgaW4gdGhlIHZhcmlvdXMgZmlsZXN5c3RlbXMgKGZvcgorICBleGFtcGxlLCB0aGUgZXh0MmZzIGZpbGVzeXN0ZW0gY29kZSBpcyBub3cgbXVjaCBmYXN0ZXIsIGFzIGl0IGNhY2hlcworICBzb21lIG1hcHBpbmcgYmxvY2tzIHdoZXJlIGl0IGRpZG4ndCBhdCBhbGwgYmVmb3JlKS4gIEZpbGVzeXN0ZW0KKyAgc2VtYW50aWNzIGFyZSBtdWNoIG1vcmUgdW5pZm9ybSBhcyB3ZWxsIChzeW1ib2xpYyBsaW5rcyBhbmQgcmVhZGluZworICBhIGRpcmVjdG9yeSBhcyBhIGZpbGUgbm93IHJldHVybiBlcnJvcnMgd2hlcmUgaXQgd291bGQgc2lsZW50bHkgZmFpbAorICBiZWZvcmUpLgorCisqICJtYWtlYWN0aXZlIiBub3cgd29ya3MgZm9yIHN0YW5kYXJkIFBDIHBhcnRpdGlvbnMgb24gaGFyZCBkaXNrcyAobm90CisgIGV4dGVuZGVkIHBhcnRpdGlvbnMuLi4gIHNvIGFueSBQQyBwYXJ0aXRpb24gbnVtYmVyIGFib3ZlIDMgd2lsbCBnaXZlCisgIGEgIm5vIHN1Y2ggcGFydGl0aW9uIiBlcnJvcikuICBJZiBhIEJTRCBzdWItcGFydGl0aW9uIGlzIGlzIHVzZWQsIGl0CisgIHdpbGwgaWdub3JlIGl0LCBhbmQgb25seSB1c2UgdGhlIHByaW1hcnkgUEMgcGFydGl0aW9uIG51bWJlci4KKworTmV3IGluIDAuMy0xOTk2MDUyMCAtIDE5OTYtMDUtMjAsIEVyaWNoIEJvbGV5bjoKKworKiBVcGRhdGVkIGluc3RydWN0aW9ucyAodGhvdWdoIHN0aWxsIHZlcnkgc3BhcnNlKS4KKworKiBOZXcgZmxvcHB5IHByb2JlICh3b3JrcyBtdWNoIGxpa2UgdGhlIExpbnV4IGZsb3BweSBib290IHByb2JlKQorICBhdHRlbXB0cyB0byBmaW5kIHRoZSBzaXplIG9mIGEgZmxvcHB5IGluIGEgZHJpdmUuICBNaWdodCBzdGlsbCBuZWVkCisgIHdvcmshICBQbGVhc2UgdHJ5IG9uIHZhcmlvdXMgZmxvcHB5IGRyaXZlcyB3aXRoIHZhcmlvdXMgbWVkaWEhCisKKyogTmV3IGZsb3BweSBoYW5kbGVyIHdpbGwgY2xhaW0gYSBub24tZXhpc3RlbnQgZHJpdmUgaWYgdGhlIGZsb3BweQorICBkaXNrIGlzbid0IHByZXNlbnQgaW4gdGhlIGRyaXZlLiAgKGZvciBleGFtcGxlLCBpdCB3b24ndCBiZSBvbiB0aGUKKyAgbGlzdCBvZiBpbnN0YWxsZWQgZHJpdmVzIHVubGVzcyBhIGZsb3BweSBpcyBwcmVzZW50KQorCisqIFN0YWdlMSBub3cgY29tcGF0aWJsZSB3aXRoIGJvdGggYSBoYXJkIGRpc2sgTUJSIGFuZCB0aGUgRE9TIEJJT1MKKyAgcGFyYW1ldGVyIGJsb2NrIChzZWUgImluc3RhbGwvUkVBRE1FIiBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0aGlzCisgIGNhbiBiZSB1c2VkKS4KKworKiBCbG9jay1saXN0IGZpbGVzeXN0ZW0gcGFydGlhbGx5IHdvcmtzLCBhcyBkZXNjcmliZWQgaW4gdGhlIGZpbGUKKyAgIk5PVEVTIi4gIExvYWRpbmcgYW4gYS5vdXQgb3IgZWxmIGtlcm5lbCB3b24ndCB3b3JrIHdpdGggaXQsIGJ1dCBhbGwKKyAgb3RoZXIgZmlsZXR5cGVzIHByZXR0eSBtdWNoIHNob3VsZC4gIChjZXJ0YWlubHkgY2hhaW4tbG9hZGluZyB3b3JrcworICBPSykKKworICBOT1RFOiB5b3UgbXVzdCB1c2UgdGhlIGZ1bGwgZm9ybWF0ICIwKzEsNTEyIiBmb3IganVzdCBoZSBmaXJzdAorICBibG9jay4uLiAgbm8gcGFyYW1ldGVycyBjYW4gYmUgaW1wbGljaXQgaW4gdGhpcyB2ZXJzaW9uLi4gVEhpcyBpcworICBiZWluZyBmaXhlZCB0b28uCisKKyogTGludXggZXh0MiBmaWxlc3lzdGVtIHdvcmtzLiAgKGl0J3MgdmVyeSBzbG93IGZvciBiaWcgZmlsZXMsIGJ1dAorICB0aGlzIGlzIGJlaW5nIGZpeGVkKQorCisqIExpbnV4IGJvb3QgdHlwZSBub3cgc3VwcG9ydGVkLiAgVXNlIGEgc3RhbmRhcmQgcGlnZ3liYWNrZWQgaW1hZ2UgYXMKKyAgd2l0aCBMSUxPLiAgUHV0IGluIGhhY2sgdG8gc3VwcG9ydCA+NjRNQiB2aWEgR1JVQiBwbGFjaW5nIHRoZSBSQU0KKyAgc2l6ZSBhcyB0aGUgZmlyc3QgaXRlbSBvbiB0aGUgY29tbWFuZC1saW5lIGF1dG9tYXRpY2FsbHkuICBNdXN0IHBhc3MKKyAgcm9vdCBwYXJ0aXRpb24gb24gY29tbWFuZC1saW5lIHVzaW5nIG5vcm1hbCBMaW51eCBzeW50YXguLi4gIGlmIG5vdCwKKyAgaXQgdXNlcyBpdCdzIGJ1aWx0aW4gcm9vdCBwYXJ0aXRpb24uCisKKyogU3VwcG9ydHMgY2hhaW4tbG9hZGluZy4gIEZvciBkZXRhaWxzLCBzZWUgIkNPTU1BTkRTIiBhbmQgdGhlCisgIGV4YW1wbGVzIGRpcmVjdG9yeS4gICh3YXMgYWJsZSB0byBib290IERPUyBhbmQgV2luZG93cyBOVCBvbiBteSB0ZXN0CisgIGJveCkuICBOT1RFIHRoYXQgdGhlICJyb290IHBhcnRpdGlvbiIgbXVzdCBiZSBzZXQgdG8gd29yayByaWdodC4KKyAgIm1ha2VhY3RpdmUiIGlzIGN1cnJlbnRseSBhIG5vLW9wLgorCisqIFNldmVyYWwgd2VpcmQgYnVncyBmaXhlZC4gIE9uZSBpbXBvcnRhbnQgbm90ZTogSWYgeW91IHJlY29tcGlsZSwgaXQKKyAgd2lsbCB3YXJuIGFib3V0IGEgY2xhc2ggd2l0aCBidWlsdGluICJzdHJjbXAiLiAgVGhpcyBpcyBub3JtYWwuLi4KKyAgZG8gTk9UIHJlbW92ZSB0aGUgc3RyY21wIGRlZmluaXRpb24sIGFzIHRoZW4gR0NDIHdpbGwgcG9zc2libHkgcHV0CisgIGlubGluZSBjb2RlIGZyb20gaXQncyBvd24gYnVpbHRpbiBmdW5jdGlvbiBpbiBzb21lIHBsYWNlcy4gKG15CisgIHN0cmNtcCBoYXMgc2xpZ2h0bHkgZGlmZmVyZW50IGZ1bmN0aW9uYWxpdHksIGhlbmNlIHRoZSBwcm9ibGVtKQorCisqIE1pbmktZGVidWdnZXIgaXMgY3VycmVudGx5IGJyb2tlbi4KKworTmV3IGluIDAuMiAtIDE5OTYtMDQtMTIsIEVyaWNoIEJvbGV5bjoKKworKiBDb21wbGV0ZWx5IG5ldyBtZW51LWJhc2VkIFVJLiAgU2VlICJDT01NQU5EUyIgYW5kIHRoZSBleGFtcGxlcworICBkaXJlY3RvcnkgZm9yIGRldGFpbHMuICBOT1RFIHRoYXQgdGhlIGFyZ3VtZW50IHRvIGEgY29tbWFuZCBtdXN0IGJlCisgIHByZWNlZGVkIGJ5IGEgc3BhY2UgYmV0d2VlbiBpdCBhbmQgdGhlICc9JywgaW4gYm90aCB0aGUgY29uZmlnIGZpbGUKKyAgYW5kIHRoZSBjb21tYW5kLWxpbmUuICBUaGlzIHdpbGwgYmUgZml4ZWQuCisKK05ldyBpbiAwLjEgLSAxOTk2LTAzLTMxLCBFcmljaCBCb2xleW46CisKKyogTmV3ZXIgdmVyc2lvbiBvZiBNdWx0aWJvb3QgU3RhbmRhcmQgKHZlcnNpb24gMC42KSBzdXBwb3J0ZWQuCisKKyogQXV0b2RldGVjdHMga2VybmVsIHR5cGVzLiAgU3VwcG9ydHMgTXVsdGlib290LCBGcmVlQlNELCBOZXRCU0QKKyAgKExpbnV4IGlzbid0IGZpbmlzaGVkKS4KKworKiBTdGFnZSAxLjUgd29ya3Mgbm93LiAgRGVmYXVsdCBzZXR1cCBpcyBub3cgZm9yIHdvcmtpbmcgd2l0aCBhIEJTRAorICBGRlMgZmxvcHB5IGxvYWRpbmcgIi9ncnViL3N0YWdlMiIgYXMgdGhlIG1haW4gYm9vdGxvYWRlci4KKworKiBGaWxlc3lzdGVtIHN1cHBvcnQgaW1wcm92ZWQuICBJdCBkaWRuJ3Qgd29yayBvbiBtYW55IGZsb3BwaWVzIGJlZm9yZQorICAocHJvYmxlbSB3aXRoIHRoZSBwYXJ0aXRpb24tZGV0ZWN0aW9uIGNvZGUpLgorCisqIE1lbW9yeSBwcm9iZSBub3cgc3VwcG9ydHMgYXJiaXRyYXJ5IGFtb3VudHMgb2YgUkFNIChzb21lIHRlY2huaWNhbAorICBsaW1pdGF0aW9ucyBleGlzdCwgc2VlIE11bHRpYm9vdCBzdGFuZGFyZCB2ZXJzaW9uIDAuNiBmb3IgZGV0YWlscykuCisKKyogQSBtaW5pLWRlYnVnZ2VyIGlzIGluY2x1ZGVkIGJ5IGRlZmF1bHQsIGFjdGl2YXRlZCBieSBoaXR0aW5nICd+JyBvbgorICB0aGUgY29tbWFuZC1saW5lIChpdCBtaWdodCBpbnRlcmZlcmUgd2l0aCB0aGluZ3MsIGJ1dCBpdCBzZWVtcyBPSworICBmb3IgbXkgYWxwaGEtdGVzdGluZykuICBUaGUgY29tbWFuZHMgYXJlIGluIHRoZSBmdW5jdGlvbgorICAiZW50ZXJfc3lzZGVidWciIGRlZmluZWQgaW4gImNvbW1vbi5jIi4gIElmIHlvdSBoYXZlIGFuIEludGVsIE1QUy0KKyAgY29tcGF0aWJsZSBtYWNoaW5lLCB0aGVyZSBhcmUgZXh0cmEgY29tbWFuZHMgZW5hYmxlZCBmb3IgU01QIGNwdQorICB0ZXN0aW5nLiAgJ3EnIGV4aXRzIGFuZCBnb2VzIGJhY2sgdG8gd2hhdCB5b3Ugd2VyZSBkb2luZyBiZWZvcmUuCisKK05ldyBpbiAwLjAtMTk5NjAyMDYgLSAxOTk2LTAyLTA2LCBFcmljaCBCb2xleW46CisKKyogTmV3ZXIgdmVyc2lvbiBvZiBNdWx0aWJvb3QgU3RhbmRhcmQgKHZlcnNpb24gMC40KSBzdXBwb3J0ZWQuCisKK05ldyBpbiAwLjAtMTk5NTEyMTAgLSAxOTk1LTEyLTEwLCBFcmljaCBCb2xleW46CisKKyogWW91IGNhbiBub3cgcGVyZm9ybSBUQUItYmFzZWQgY29tcGxldGlvbiBsaXN0aW5nIG9mIGFueSB2YWxpZAorICBwYXJ0aWFsbHkgY29tcGxldGVkIGRpc2svcGFydGl0aW9uL2ZpbGUtbmFtZSBjb21iaW5hdGlvbi4gIFRyeSBpdAorICBvdXQgdG8gc2VlIHdoYXQgeW91IGxpa2UsIGV4YW1wbGVzIGFyZSBpbiB0aGUgTk9URVMgZmlsZSB1bmRlcgorICAiRGV2aWNlIGNvbXBsZXRpb24iLgorCisqIEZpeGVkIGEgYnVnIGNhdXNpbmcgdGhlIG1lbW9yeSBzaXplIHJvdXRpbmUgdG8gc29tZXRpbWVzIHJlcG9ydAorICByaWRpY3Vsb3VzIHZhbHVlcy4KKworKiBGaXhlZCBzb21lIGRvY3VtZW50YXRpb24gKHdoYXQgbGl0dGxlIHRoZXJlIGlzIDotLyBhbmQgYSBmZXcKKyAgYXNzZW1ibHkgYnVncyBpbiB0aGUgQklPUyBhY2Nlc3Mgcm91dGluZXMgdGhhdCBub2JvZHkgcmVwb3J0ZWQgeWV0LAorICBzbyBJIHdvbid0IGRldGFpbCBpdCBoZXJlLgpkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMjMzZjcKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUKQEAgLTAsMCArMSwyMyBAQAorVGhpcyBpcyBHTlUgR1JVQiwgdGhlIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlci4gIEdSVUIgaXMgaW50ZW5kZWQgdG8KK3Byb3ZpZGUgaW1wb3J0YW50IGJvb3Rsb2FkZXIgZmVhdHVyZXMgdGhhdCBhcmUgbWlzc2luZyBmcm9tIHR5cGljYWwKK3BlcnNvbmFsIGNvbXB1dGVyIEJJT1NlczoKKworICAtIHByb3ZpZGVzIGZ1bGx5LWZlYXR1cmVkIGNvbW1hbmQgbGluZSBhbmQgZ3JhcGhpY2FsIGludGVyZmFjZXMKKyAgLSByZWNvZ25pemVzIGZkaXNrIHBhcnRpdGlvbnMgYW5kIEJTRCBkaXNrbGFiZWxzCisgIC0gY2FuIGR5bmFtaWNhbGx5IHJlYWQgTGludXggZXh0MmZzLCBSZWlzZXJGUywgSkZTIGFuZCBYRlMsIEJTRCB1ZnMsCisgICAgTVMtRE9TIEZBVDE2IGFuZCBGQVQzMiwgTWluaXggZnMsIGFuZCBWU1RhIGZzIGZpbGVzeXN0ZW1zLCBwbHVzCisgICAgaGFyZGNvZGVkIGJsb2NrbGlzdHMKKyAgLSBjYW4gYm9vdCBNdWx0aWJvb3QtY29tcGxpYW50IGtlcm5lbHMgKHN1Y2ggYXMgR05VIE1hY2gpLCBhcyB3ZWxsCisgICAgYXMgc3RhbmRhcmQgTGludXggYW5kICpCU0Qga2VybmVscworCitTZWUgdGhlIGZpbGUgTkVXUyBmb3IgYSBkZXNjcmlwdGlvbiBvZiByZWNlbnQgY2hhbmdlcyB0byBHUlVCLgorCitJZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gdGhlIG5ldHdvcmsgc3VwcG9ydCwgc2VlIHRoZSBmaWxlCitSRUFETUUubmV0Ym9vdCB1bmRlciB0aGUgZGlyZWN0b3J5IG5ldGJvb3QuCisKK1NlZSB0aGUgZmlsZSBJTlNUQUxMIGZvciBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGJ1aWxkIGFuZCBpbnN0YWxsIHRoZQorR1JVQiBkYXRhIGFuZCBwcm9ncmFtIGZpbGVzLiBTZWUgdGhlIEdSVUIgbWFudWFsIGZvciBkZXRhaWxzIGFib3V0Cit1c2luZyBHUlVCIGFzIHlvdXIgYm9vdCBsb2FkZXIuIFR5cGUgImluZm8gZ3J1YiIgaW4gdGhlIHNoZWxsIHByb21wdC4KKworUGxlYXNlIHZpc2l0IHRoZSBvZmZpY2lhbCB3ZWIgcGFnZSBvZiBHTlUgR1JVQiwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCitUaGUgVVJMIGlzIDxodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ3J1Yi9ncnViLmh0bWw+LgpkaWZmIC0tZ2l0IGEvVEhBTktTIGIvVEhBTktTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1M2RhMWEKLS0tIC9kZXYvbnVsbAorKysgYi9USEFOS1MKQEAgLTAsMCArMSwxMjMgQEAKK0dSVUIgd291bGQgbm90IGJlIHdoYXQgaXQgaXMgdG9kYXkgd2l0aG91dCB0aGUgaW52YWx1YWJsZSBoZWxwIG9mCitldmVyeWJvZHkgd2hvIHdhcyBraW5kIGVub3VnaCB0byBzcGVuZCB0aW1lIHRlc3RpbmcgaXQgYW5kIHJlcG9ydGluZworYnVncy4KKworVGhlIGZvbGxvd2luZyBwZW9wbGUgbWFkZSBlc3BlY2lhbGx5IGdyYWNpb3VzIGNvbnRyaWJ1dGlvbnMgb2YgdGhlaXIKK3RpbWUgYW5kIGVuZXJneSBpbiBoZWxwaW5nIHRvIHRyYWNrIGRvd24gYnVncywgYWRkIG5ldyBmZWF0dXJlcywgYW5kCitnZW5lcmFsbHkgYXNzaXN0IGluIHRoZSBHUlVCIG1haW50YWluZXJzaGlwIHByb2Nlc3M6CisKK0FkYW0gTGFja29yenluc2tpIDxhZGFtQG9zLmluZi50dS1kcmVzZGVuLmRlPgorQWRyaWFuIFBoaWxsaXBzIDxhLnBoaWxsaXBzQGRubWkubm8+CitBbGJhbiBDcmVxdXkgPGFsYmFuLmNyZXF1eUBhcGluYy5vcmc+CitBbGVzc2FuZHJvIFJ1YmluaSA8cnViaW5pQGdudS5vcmc+CitBbGV4YW5kZXIgSy4gSHVkZWsgPGFsZXhodWRla0Bob21lLmNvbT4KK0FsZXhhbmRlciBMYW5nZXIgPGFsZXhAYmlnLmVuZGlhbi5kZT4KK0FsZnJlZCBNLiBTem1pZHQgPGFtc0BrZW1pc3Rlbi5udT4KK0FuZHJldyBDbGF1c2VuIDxjbGF1c2VuQGdudS5vcmc+CitBbmRyZXcgV2Fscm9uZCA8YW5kcmV3QHdhbHJvbmQub3JnPgorQmVuIExpYmxpdCA8bGlibGl0QGVlY3MuYmVya2VsZXkuZWR1PgorQmVybmhhcmQgVHJldXR3ZWluIDxCZXJuaGFyZC5UcmV1dHdlaW5AVmVyd2FsdHVuZy5VbmktTXVlbmNoZW4uREU+CitCb2RvIFJ1ZXNrYW1wIDxickBpdGNoaWdvLmNvbT4uCitCb2ppIFRvbnkgS2FubmFudGhhbmFtIDxib2ppLnQua2FubmFudGhhbmFtQGludGVsLmNvbT4KK0JyYWRmb3JkIEhvdmluZW4gPGhvdmluZW5AcmVkcm9zZS5uZXQ+CitCcmlhbiBCcnVuc3dpY2sgPGJyaWFuQHNrYXJwc2V5LmRlbW9uLmNvLnVrPgorQnJ5YW4gRm9yZCA8YmFmb3JkQGNzLnV0YWguZWR1PgorQ2VkcmljIFdhcmUgPHdhcmVAY29tLmVuc3QuZnI+CitDaGlwIFNhbHplbmJlcmcgPGNoaXBAdmFsaW51eC5jb20+CitDaHJpc3RpYW4gSm9uZXMgPGNoam9uZXNAYWxlcGgwLmNvbT4KK0NocmlzdG9waCBQbGF0dG5lciA8Q2hyaXN0b3BoLlBsYXR0bmVyQGRvdC5hdD4KK0RhbWlhbiBJdmVyZWlnaCA8ZGFtaWFuQGNpc2NvLmNvbT4KK0RhdmlkIFdlaW5laGFsbCA8dGFvQGRlYmlhbi5vcmc+CitEYW4gSi4gV2FsdGVycyA8ZGp3QGNzLnV0ZXhhcy5lZHU+CitEYW5pZWwgRmFycmVsbCA8czIxMDgyODdAc3R1ZGVudC5ybWl0LmVkdS5hdT4KK0RhbmllbCBQaXR0bWFuIDxkYW5pZWxAcmltc3BhY2UubmV0PgorRGFuaWVsIFdhZ25lciA8d2FnaUBnbXguY2g+CitEYW5pbG8gR29kZWMgPGRhbmNpQGFnZW5kYS5zaT4KK0Rlbm5pcyBLaXR6bWFuIDxkZW5uaXMta2l0em1hbkB1aW93YS5lZHU+CitEZXJyaWsgUGF0ZXMgPGRwYXRlc0Bkc2RrMTIubmV0PgorRWRtdW5kIEdSSU1MRVkgRVZBTlMgPGVkbXVuZG9AcmFuby5kZW1vbi5jby51az4KK0VkdWFyZCBHdXpvdnNreSA8ZWd1em92c2tAZW50ZXJhc3lzLmNvbT4KK0Vkd2FyZCBLaWxsaXBzIDxla2lsbGlwc0B0cml0b24ubmV0PgorRWdtb250IEtvYmxpbmdlciA8ZWdtb250QHVodWxpbnV4Lmh1PgorRXJpYyBIYW5jaHJvdyA8ZXJpY2hAbWljcm9zb2Z0LmNvbT4KK0VyaWsgU2Nob2VuZmVsZGVyIDxzY2hvZW5mckBnYWVydG5lci5kZT4KK0V1Z2VuZSBEb3VkaW5lIDxkdWRpbkBucC5uay5ub3JuaWsucnU+CitGbG9yaWFuIEhhdGF0IDxtaW5pbmV0QHdhbmFkb28uZnI+CitGcmFuayBNZWhuZXJ0IDxmbTNAb3MuaW5mLnR1LWRyZXNkZW4uZGU+CitHYXJ5IFBvcHBpdHogPGdwb3BwaXR6QHRhY2h5b24ubmV0PgorR29yYW4gS29ydWdhIDxnb3Jhbi5rb3J1Z2FAaGVybWVzLnNpPgorSGFsIFNueWRlciA8aGFsQHZhaWxzeXMuY29tPgorSEFTRUdBV0EgVG9tb2tpIDx0aGFzZWdhd2FAbXRhLmJpZ2xvYmUubmUuanA+CitIZWlra2kgVmF0aWFpbmVuIDxoZXNzdUBjcy50dXQuZmk+CitIZWlrbyBTY2hyb2VkZXIgPGhlaWtvQHBvb2wuaW5mb3JtYXRpay5yd3RoLWFhY2hlbi5kZT4KK0hlbnJpayBOb3Jkc3Ryb20gPGhub0BtYXJhc3lzdGVtcy5jb20+CitIZXJiZXJ0IE5hY2h0bmViZWwgPG5hY2h0bmViQGlhZWUudHV3aWVuLmFjLmF0PgorSGlkZXRvc2hpIE5pc2hpbWFraSA8bmlzaGltYWtpQG14cy5uZXMubmVjLmNvLmpwPgorSGlzYXp1bWkgS2VuamkgPG5lbEBzb3JhbmVrby5jb20+CitIT1JJS0FXQSBLYXp1bm9yaSA8a2F6LWhvcmlAdGtkLmF0dC5uZS5qcD4KK0lsZ3VpeiBMYXR5cG92IDxpbGF0eXBvdkBzdXBlcmJ0LmNvbT4KK0phbiBGcmlja2UgPGZyaWNrZUB1bmktZ3JlaWZzd2FsZC5kZT4KK0phbiBaZXJlYmVja2kgPGphbi5saXN0QGVsaXRlLXBmZXJkZS5kZT4KK0phc29uIFRob21hcyA8amFzb25AdG9waWMuY29tLmF1PgorSmVhbi1KYWNxdWVzIE1pY2hlbCA8amptaWNoZWxAbGluYm94LmNvbT4KK0plcmVteSBLYXR6IDxrYXR6akByZWRoYXQuY29tPgorSm9jaGVuIEhvZW5pY2tlIDxqb2NoZW5AZ251Lm9yZz4KK0pvaGFubmVzIEtyb2VnZXIgPGhhbm5lQHNxdWlycmVsLm93bC5kZT4KK0pvaG4gR29lcnplbiA8amdvZXJ6ZW5AY29tcGxldGUub3JnPgorSm9obiBUb2JleSA8c3BhbUBqb2huLWVkd2luLXRvYmV5Lm9yZz4KK0pvc2lwIFJvZGluIDxqb3lAY2liYWxpYS5na3ZrLmhyPgorSnVsaWVuIEJvcmRldCA8anVsaWVuLmJvcmRldEBpbnQtZXZyeS5mcj4KK0p1bGllbiBQZXJyb3QgPGp1bGllbi5wZXJyb3RAaWllLmNuYW0uZnI+CitLYWxsZSBPbGF2aSBOaWVtaXRhbG8gPHRvc2lAZWVzMi5vdWx1LmZpPgorS2Fyc3RlbiBTY2hlaWJsZXIgPGthcnN0ZW4uc2NoZWlibGVyQHN0dWRlbnQudW5pLWhhbGxlLmRlPgorS0IgU3JpcmFtIDxtYWlsX2tiQHlhaG9vLmNvbT4KK0toaW1lbmtvIFZpY3RvciA8Z3J1YkBraGltLnNjaDU3Lm1zay5ydT4KK0tsYXVzIFJlaWNobCA8a2xhdXMucmVpY2hsQGFsY2F0ZWwuYXQ+CitLcmlzdG9mZmVyIEJyYW5lbXlyIDx6dGlvbkBzd2lwbmV0LnNlPgorS3VuaWhpcm8gSXNoaWd1cm8gPGt1bmloaXJvQHplYnJhLm9yZz4KK0xlZW5kZXJ0IE1leWVyIDxsZWVuLm1leWVyQGhvbWUubmw+CitMZW9uaWQgTGlzb3Zza2l5IDxsbHlAcGlzZW0ubmV0PgorTS4gTWVpYXJhc2hpIDxtZXNAc3QucmltLm9yLmpwPgorTWFyayBLZXR0ZW5pcyA8a2V0dGVuaXNAY2hlbGxvLm5sPgorTWFyayBMdW5kZWJlcmcgPGFhMDI2QHBnZm4uYmMuY2E+CitNYXR0IFBlcnJ5IDxtYXR0QHByaW1lZmFjdG9yLmNvbT4KK01hdHQgWW91cnN0IDx5b3Vyc3RAbWl0LmVkdT4KK01hdHRoaWFzIEdyYW5iZXJyeSA8bWF0dGhpYXNAc2x1cnBlZS5vcmc+CitNYXR0aGlhcyBLcmV0c2NobWVyIDxtLmtyZXRzY2htZXJAYnNkZ2VyLm9yZz4KK01pY2hhZWwgSG9obXV0aCA8aG9obXV0aEBpbm5vY2VudC5jb20+CitNaWNoYWVsIFN1bGxpdmFuIDxtaWtlQHRyZGxuay5jb20+CitNaWtlIE1leWVyIDxtd21AbWlyZWQub3JnPgorTWlsZXMgQmFkZXIgPG1pbGVzQGdudS5vcmc+CitOQVRPUkkgU2hpbiA8bmF0b3JpQGFkbS5zLnUtdG9reW8uYWMuanA+CitOZWFsIEggV2FsZmllbGQgPG5lYWxAd2FsZmllbGQub3JnPgorTmVlbGthbnRoIE5hdHUgPG5lZWxuYXR1QHlhaG9vLmNvbT4KK09LVUpJIFlvc2hpbm9yaSA8b2t1amlAa3VpY3Iua3lvdG8tdS5hYy5qcD4KK1BhdmVsIFJvc2tpbiA8cGF2ZWxfcm9za2luQGdlb2NpdGllcy5jb20+CitQZXIgTHVuZGJlcmcgPHBsdW5kaXNAYnlnZ2Rvay5zZT4KK1BldGVyIEFzdHJhbmQgPGFsdGljQGx5c2F0b3IubGl1LnNlPgorUmFsZiBNZWRvdyA8cmFsZi5tZWRvd0B0LW9ubGluZS5kZT4KK1JhbW9uIHZhbiBIYW5kZWwgPHZoYW5kZWxAY2hlbS52dS5ubD4KK1JvYmVydCBNaWxsYW4gIDxyb2JlcnRtaEBnbnUub3JnPgorUm9kZXJpY2ggU2NodXBwIDxyc2NoQEV4cGVyVGVhbS5kZT4KK1JvZ2VsaW8gTS4gU2VycmFubyBKci4gPHJvZ2VsaW9AdmljdG9yaW8uY29tPgorU2VyZ2V5IE1hdHZleWNodWsgPHNlbUBjaWFtLnJ1PgorU2VyZ3VlaSBUenVrYW5vdiA8dHp1a2Fub3ZAbmFyb2QucnU+CitTdGVmYW4gT25kcmVqaWNrYSA8b25kcmVqQGlkYXRhLnNrPgorU3RlcGhlbiBFYXJseSA8c3RldmVAZ3JlZW5lbmQub3JnLnVrPgorU3RldmVuIERpY2sgPHNzZC5nbnVAbW1hZS51Y2YuZWR1PgorU3ZlbiBXZWdlbmVyIDxzd2VnZW5lckBnZW50b28ub3JnPgorVGFrZWhpcm8gU3V6dWtpIDx0YWtlaGlyb0Bjb3JhbC5vY24ubmUuanA+CitUYWtldG8gS2FiZSA8a2FiZUBzcmEtdG9ob2t1LmNvLmpwPgorVGhpZXJyeSBERUxIQUlTRSA8dGhpZXJyeS5kZWxoYWlzZUBkZWxoYWlzZS5jb20+CitUaGllcnJ5IExhcm9uZGUgPHRoaWVycnkubGFyb25kZUBwb2x5bnVtLmNvbT4KK1Rob21hcyBTY2h3ZWlrbGUgPHRzY2h3ZWlrbGVAZmlkdWNpYS5kZT4KK1Rob21hcyBTY2h3aW5nZSA8a2lzY2hkZUBnbXgubmV0PgorVGlsbWFubiBCdWJlY2sgPHQuYnViZWNrQHJlaW5mb3JtLmRlPgorVGltb3RoeSBCYWxkd2luIDxULkUuQmFsZHdpbjk5QG1lbWJlcnMubGVlZHMuYWMudWs+CitUb3JzdGVuIER1d2UgPGR1d2VAY2FsZGVyYS5kZT4KK1V3ZSBEYW5ub3dza2kgPHVkM0BpcmEudWthLmRlPgorVmFYI244IDx2YXhAbGlua2RlYWQucGFyYW5vaWEuY29tPgorVmVzYSBKYWFza2VsYWluZW4gPGphYXNrZWxhQHRpZXRvbXlyc2t5LmZpPgorWWVkaWR5YWggQmFyLURhdmlkIDxkaWRpQHBvc3QudGF1LmFjLmlsPgorWXVyeSBWLiBVbWFuZXRzIDx1bWthQG5hbWVzeXMuY29tPgorWXVyaSBaYXBvcm9nZXRzIDx5dXJpekB1a3IubmV0PgpkaWZmIC0tZ2l0IGEvVE9ETyBiL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiYzhkMAotLS0gL2Rldi9udWxsCisrKyBiL1RPRE8KQEAgLTAsMCArMSwxMDIgQEAKKy0qLSBNb2RlOiBPdXRsaW5lIC0qLQorCitCZWZvcmUgd29ya2luZyBvbiBhbnl0aGluZyBpbiB0aGlzIGZpbGUsIGl0J3MgdmVyeSBpbXBvcnRhbnQgdGhhdCB5b3UKK21ha2UgY29udGFjdCB3aXRoIHRoZSBjb3JlIEdSVUIgZGV2ZWxvcGVycy4gVGhpbmdzIGhlcmVpbiBtaWdodCBiZQorc2xpZ2h0bHkgb3V0IG9mIGRhdGUgb3Igb3RoZXJ3aXNlIG5vdCBlYXN5IHRvIHVuZGVyc3RhbmQgYXQgZmlyc3QKK2dsYW5jZS4gU28gd3JpdGUgdG8gPGJ1Zy1ncnViQGdudS5vcmc+IGZpcnN0LgorCitQcmlvcml0aWVzOgorICBSZXBvcnRlZCBidWdzIGdlbmVyYWxseSBoYXZlIHRvcCBwcmlvcml0eS4KKyAgTm9uLXJlcG9ydGVkIGFuZCBub24tZW5jb3VudGVyZWQgYnVncyAodGhpbmdzIHdlIGtub3cgZG9uJ3Qgd29yaywKKyAgICBidXQgZG9uJ3QgcmVhbGx5IGltcGVkZSB0aGluZ3MpIGhhdmUgbG93ZXIgcHJpb3JpdHkuCisgIFRoaW5ncyBpbiB0aGlzIGZpbGUgYXJlIHJhbmtlZCB3aXRoIG9uZSB0byB0aHJlZSAhOyB0aGUgbW9yZSwgdGhlCisgIGhpZ2hlciBwcmlvcml0eS4KKworCitUaGluZ3MgdGhhdCBzaG91bGQgYmUgZG9uZSBiZWZvcmUgMS4wOgorCisqIEZpbmlzaCB0aGUgTXVsdGlib290IFNwZWljaWZpY2F0aW9uIDAuNy4gISEhCisKKyogQWRkIG1vcmUgLS1kaXNhYmxlLUZPTyBvcHRpb25zIHRvIGNvbmZpZ3VyZSwgc28gdGhhdCB5b3UgY2FuIGNyZWF0ZSBhCisgIG1pbmltdW0gR1JVQiBpbWFnZS4gVGhpcyBpcyB1c2VmdWwgZm9yIGJvb3QgZmxvcHBpZXMgYmVjYXVzZSBvZiB0aGUgc2l6ZQorICByZXN0cmljdGlvbi4gIQorCisqIEltcGxlbWVudCBhIG5ldyB2ZXJzaW9uIG9mIHRyYWNrX2ludDEzLCB1c2luZyBWaXJ0dWFsIDgwODYgTW9kZS4gISEhCisKKyogQWRkIG1pc3NpbmcgZmVhdHVyZXMgb2YgZ3JhcGhpY3Mgc3VwcG9ydC4gISEKKworVGhpbmdzIHRoYXQgc2hvdWxkIF9ub3RfIGJlIGRvbmUgYmVmb3JlIDEuMDoKKworKiBBZGQgY29uZmlndXJhdGlvbiBpbmNsdXNpb24gc3VwcG9ydCBieSBhZGRpbmcgYSBjb21tYW5kICJpbmNsdWRlIi4gIQorCisqIEFkZCBhdXRvbWF0aWMgY29uZmlndXJhdGlvbiBzdXBwb3J0LgorCisqIEFkZCBidW56aXAyIHN1cHBvcnQuCisKKyogRGVmaW5lIHRoZSBtb2R1bGUgc3lzdGVtLgorCisqIEFkZCBCU0Qgc3ludGF4IHN1cHBvcnQsIHVzaW5nIHJlc3VsdHMgb2YgaW9wcm9iZSB0byBtYXAgZHJpdmVzLiAhCisgICgweDFmMC0weDFmNyA9IHByaW1hcnkgSURFLCAweDE3MC0weDE3NiA9IHNlY29uZGFyeSwKKyAgIDB4MWU4LTB4MWVmID0gdGVydGlhcnksIDB4MTY4LTB4MTZmID0gcXVhdGVybmFyeSkuCisKKyogQWRkIGEgcmVhbCBzY3JpcHRpbmcgbGFuZ3VhZ2UsIHBvc3NpYmx5IHJldGFpbmluZyBiYWNrd2FyZAorICBjb21wYXRpYmlsaXR5IHNvIHRoYXQgb2xkIGNvbmZpZyBmaWxlcyBjYW4gYmUgdXNlZC4KKworKiBBZGQgaW50ZXJuYXRpb25hbGl6YXRpb24gc3VwcG9ydCwgZW11bGF0aW5nIGdldHRleHQgYXMgbXVjaCBhcyBpcworICBmZWFzaWJsZS4KKworKiBTdXBwb3J0IG90aGVyIGFyY2hpdGVjdHVyZXMgdGhhbiBpMzg2LXBjLgorCisqIEFkZCByZWFsIG1lbW9yeSBtYW5hZ2VtZW50LgorCisKK1RoaW5ncyB0aGF0IG1heSBiZSBkb25lIGFueXRpbWU6CisKKyogUG9ydCB0aGUgc2NyaXB0IGBgZ3J1Yi1pbnN0YWxsJycgdG8gT3BlbkJTRC4gQXQgbGVhc3QgeW91IHdpbGwgaGF2ZSB0bworICBtb2RpZnkgdGhlIGZ1bmN0aW9uIGBjb252ZXJ0JyBzbyB0aGF0IGl0IGNhbiB0cmFuc2xhdGUgYSBuYXRpdmUgZGV2aWNlCisgIG5hbWUgaW50byB0aGUgY29ycmVzcG9uZGluZyBHUlVCIGRyaXZlIHJlcHJlc2VudGF0aW9uLiAhCisKKyogQWRkIGEgY29tbWFuZCB0byBydW4gYSBHUlVCIHNjcmlwdCBmaWxlLiAhIQorCisqIEFkZCBjb21tYW5kcyB0byBtYW5pcHVsYXRlIHRoZSBtZW51IGZyb20gdGhlIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UuICEKKworKiBNYWtlIHN5bWJvbGljIGxpbmtzIHdvcmsgZm9yIEJTRCBGRlMuCisKKyogQWRkIGluZGlyZWN0IGJsb2NrIHN1cHBvcnQgdG8gdGhlIEJTRCBGRlMgZmlsZXN5c3RlbSBjb2RlLCBzbyBmaWxlcworICBsYXJnZXIgdGhhbiAxNk1CIGNhbiBiZSByZWFkLgorCisqIEZpeC11cCBGcmVlQlNELCBOZXRCU0QgKGFuZCBPcGVuQlNEID8pIGNvbW1hbmQtbGluZSBib290CisgIHBhcmFtZXRlcnMuCisKKyogU3VwcG9ydCBlbWJlZGRpbmcgYSBTdGFnZSAxLjUgaW4gdGhlICJib290bG9hZGVyIiBhcmVhIG9mIGEgRkZTCisgIHBhcnRpdGlvbi4gKFdlIGFscmVhZHkgaGF2ZSB0aGUgY29kZSwgYnV0IG5lZWQgYW4gYXBwcm92YWwgYnkgYW4KKyAgZXhwZXJ0IGJlZm9yZSB0dXJuaW5nIG9uIHRoZSBzdXBwb3J0LiBBbnkgdm9sdW50ZWVycz8pCisKKyogU3VwcG9ydCBlbWJlZGRpbmcgYSBTdGFnZSAxLjUgaW4gdGhlIEVYVDJfQk9PVF9MT0FERVJfSU5PIG9mIGFuIGV4dDJmcworICBwYXJ0aXRpb24sIHNvIHRoYXQgaXQgd29uJ3QgYmUgYWNjaWRlbnRhbGx5IGVyYXNlZCBvciBtb2RpZmllZCBieQorICB0aGUga2VybmVsLgorCisqIEFkZCBJU0EgUG5QIHN1cHBvcnQuCisKKyogQWRkIG1vcmUgZmlsZXN5c3RlbXMgc3VwcG9ydCAoTlRGUywgZXRjLikKKworKiBBZGQgbW9yZSByZW1vdGUgY29uc29sZSBzdXBwb3J0IChwYXJhbGxlbCBhbmQgbmV0KS4KKworKiBBZGQgKHJlYWwpIFJBSUQgc3VwcG9ydC4KKworPyBBZGQgYSBwYXJ0aXRpb24gbmFtaW5nIHN5bnRheCB0aGF0IG1lYW5zIGBgdGhlIGZpcnN0IHBhcnRpdGlvbiBvZgorICB0aGlzIHR5cGUnJy4gIFdlIG5lZWQgdGhpcyBmb3IgY2xlYW4gSHVyZCBpbnN0YWxsIGZsb3BwaWVzLgorICBOb3BlLiAgSW1wcm92aW5nIHRoZSBgZmluZCcgY29tbWFuZCB3b3VsZCBzb2x2ZSB0aGlzIHByb2JsZW0uCisKKyogQWRkIENEUk9NLWNoYWlubG9hZGluZyBzdXBwb3J0LiBJdCB3b3VsZCBiZSBlbm91Z2ggdG8gc3VwcG9ydCBvbmx5CisgIEJJT1NlcyB3aGljaCBoYXZlIGJvb3RhYmxlLUNEUk9NIHN1cHBvcnQgKHNvIHlvdSBtYXkgdXNlIHRoZSAiQm9vdGFibGUKKyAgQ0RST00iIEJJT1MgY2FsbHMpLiBJdCBpcyBub3QgdHJpdmlhbCB0byBzdXBwb3J0IEJJT1NlcyB3aXRob3V0IHRoZQorICBjYXBhYmlsaXR5IHRvIGJvb3QgQ0RST00uCisKKz8gRGl2aWRlIHB4ZWdydWIgaW50byB0d28gcGFydHMsIHNvIHRoZSBpbml0aWFsIGltYWdlIGRvZXNuJ3QgZXhjZWVkCisgIHRoZSAzMktCIGxpbWl0LiBJJ20gbm90IHN1cmUgaWYgdGhpcyBpcyByZWFsbHkgbmVjZXNzYXJ5LCBiZWNhdXNlIHRoZQorICBQWEUgc3RhbmRhcmQganVzdCBzYXlzIHRoYXQgaXQgaXMgX3JlY29tbWVuZGVkXyB0byBpbXByb3ZlIHRoZQorICBtb2R1bGFyaXR5IG9mIGEgYm9vdCBpbWFnZS4gT2J2aW91c2x5LCB0aGlzIHJlYXNvbiBkb2Vzbid0IGFwcGx5IHRvCisgIEdSVUIsIGFzIHB4ZWdydWIgaXMgbWVyZWx5IGEgc2Vjb25kYXJ5IGJvb3QgbG9hZGVyLiBTbyB3aGV0aGVyIHRoaXMKKyAgdGFzayBzaG91bGQgYmUgZG9uZSBkZXBlbmRzIG9uIGlmIGV4aXN0aW5nIFBYRSBST01zIHN1cHBvcnQgPjMyS0IKKyAgaW1hZ2VzIG9yIG5vdCwgYWZ0ZXIgYWxsLgpkaWZmIC0tZ2l0IGEvYWNpbmNsdWRlLm00IGIvYWNpbmNsdWRlLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ODgzOWMKLS0tIC9kZXYvbnVsbAorKysgYi9hY2luY2x1ZGUubTQKQEAgLTAsMCArMSwzNjYgQEAKK2RubCBncnViX0FTTV9VU0NPUkUgY2hlY2tzIGlmIEMgc3ltYm9scyBnZXQgYW4gdW5kZXJzY29yZSBhZnRlcgorZG5sIGNvbXBpbGluZyB0byBhc3NlbWJsZXIuCitkbmwgV3JpdHRlbiBieSBQYXZlbCBSb3NraW4uIEJhc2VkIG9uIGdydWJfQVNNX0VYVF9DIHdyaXR0ZW4gYnkKK2RubCBFcmljaCBCb2xleW4gYW5kIG1vZGlmaWVkIGJ5IE9LVUpJIFlvc2hpbm9yaQorQUNfREVGVU4oW2dydWJfQVNNX1VTQ09SRV0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pCitBQ19NU0dfQ0hFQ0tJTkcoW2lmIEMgc3ltYm9scyBnZXQgYW4gdW5kZXJzY29yZSBhZnRlciBjb21waWxhdGlvbl0pCitBQ19DQUNIRV9WQUwoZ3J1Yl9jdl9hc21fdXNjb3JlLAorW2NhdCA+IGNvbmZ0ZXN0LmMgPDxcRU9GCitpbnQKK2Z1bmMgKGludCAqbGlzdCkKK3sKKyAgKmxpc3QgPSAwOworICByZXR1cm4gKmxpc3Q7Cit9CitFT0YKKworaWYgQUNfVFJZX0NPTU1BTkQoWyR7Q0MtY2N9ICR7Q0ZMQUdTfSAtUyBjb25mdGVzdC5jXSkgJiYgdGVzdCAtcyBjb25mdGVzdC5zOyB0aGVuCisgIHRydWUKK2Vsc2UKKyAgQUNfTVNHX0VSUk9SKFske0NDLWNjfSBmYWlsZWQgdG8gcHJvZHVjZSBhc3NlbWJseSBjb2RlXSkKK2ZpCisKK2lmIGdyZXAgX2Z1bmMgY29uZnRlc3QucyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgZ3J1Yl9jdl9hc21fdXNjb3JlPXllcworZWxzZQorICBncnViX2N2X2FzbV91c2NvcmU9bm8KK2ZpCisKK3JtIC1mIGNvbmZ0ZXN0Kl0pCisKK2lmIHRlc3QgIngkZ3J1Yl9jdl9hc21fdXNjb3JlIiA9IHh5ZXM7IHRoZW4KKyAgQUNfREVGSU5FX1VOUVVPVEVEKFtIQVZFX0FTTV9VU0NPUkVdLCAkZ3J1Yl9jdl9hc21fdXNjb3JlLAorICAgIFtEZWZpbmUgaWYgQyBzeW1ib2xzIGdldCBhbiB1bmRlcnNjb3JlIGFmdGVyIGNvbXBpbGF0aW9uXSkKK2ZpCisKK0FDX01TR19SRVNVTFQoWyRncnViX2N2X2FzbV91c2NvcmVdKQorXSkKKworCitkbmwgU29tZSB2ZXJzaW9ucyBvZiBgb2JqY29weSAtTyBiaW5hcnknIHZhcnkgdGhlaXIgb3V0cHV0IGRlcGVuZGluZworZG5sIG9uIHRoZSBsaW5rIGFkZHJlc3MuCitBQ19ERUZVTihbZ3J1Yl9QUk9HX09CSkNPUFlfQUJTT0xVVEVdLAorW0FDX01TR19DSEVDS0lORyhbd2hldGhlciAke09CSkNPUFl9IHdvcmtzIGZvciBhYnNvbHV0ZSBhZGRyZXNzZXNdKQorQUNfQ0FDSEVfVkFMKGdydWJfY3ZfcHJvZ19vYmpjb3B5X2Fic29sdXRlLAorW2NhdCA+IGNvbmZ0ZXN0LmMgPDxcRU9GCit2b2lkCitjbWFpbiAodm9pZCkKK3sKKyAgICooKGludCAqKSAweDEwMDApID0gMjsKK30KK0VPRgorCitpZiBBQ19UUllfRVZBTChhY19jb21waWxlKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0Lm87IHRoZW4gOgorZWxzZQorICBBQ19NU0dfRVJST1IoWyR7Q0MtY2N9IGNhbm5vdCBjb21waWxlIEMgc291cmNlIGNvZGVdKQorZmkKK2dydWJfY3ZfcHJvZ19vYmpjb3B5X2Fic29sdXRlPXllcworZm9yIGxpbmtfYWRkciBpbiAyMDAwIDgwMDAgN0MwMDsgZG8KKyAgaWYgQUNfVFJZX0NPTU1BTkQoWyR7Q0MtY2N9ICR7Q0ZMQUdTfSAtbm9zdGRsaWIgLVdsLC1OIC1XbCwtVHRleHQgLVdsLCRsaW5rX2FkZHIgY29uZnRlc3QubyAtbyBjb25mdGVzdC5leGVjXSk7IHRoZW4gOgorICBlbHNlCisgICAgQUNfTVNHX0VSUk9SKFske0NDLWNjfSBjYW5ub3QgbGluayBhdCBhZGRyZXNzICRsaW5rX2FkZHJdKQorICBmaQorICBpZiBBQ19UUllfQ09NTUFORChbJHtPQkpDT1BZLW9iamNvcHl9IC1PIGJpbmFyeSBjb25mdGVzdC5leGVjIGNvbmZ0ZXN0XSk7IHRoZW4gOgorICBlbHNlCisgICAgQUNfTVNHX0VSUk9SKFske09CSkNPUFktb2JqY29weX0gY2Fubm90IGNyZWF0ZSBiaW5hcnkgZmlsZXNdKQorICBmaQorICBpZiB0ZXN0ICEgLWYgY29uZnRlc3Qub2xkIHx8IEFDX1RSWV9DT01NQU5EKFtjbXAgLXMgY29uZnRlc3Qub2xkIGNvbmZ0ZXN0XSk7IHRoZW4KKyAgICBtdiAtZiBjb25mdGVzdCBjb25mdGVzdC5vbGQKKyAgZWxzZQorICAgIGdydWJfY3ZfcHJvZ19vYmpjb3B5X2Fic29sdXRlPW5vCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0Kl0pCitBQ19NU0dfUkVTVUxUKFskZ3J1Yl9jdl9wcm9nX29iamNvcHlfYWJzb2x1dGVdKV0pCisKK2RubCBNYXNzIGNvbmZ1c2lvbiEKK2RubCBPbGRlciB2ZXJzaW9ucyBvZiBHQVMgaW50ZXJwcmV0IGAuY29kZTE2JyB0byBtZWFuIGBgZ2VuZXJhdGUgMzItYml0CitkbmwgaW5zdHJ1Y3Rpb25zLCBidXQgaW1wbGljaXRseSBpbnNlcnQgYWRkcjMyIGFuZCBkYXRhMzIgYnl0ZXMgc28KK2RubCB0aGF0IHRoZSBjb2RlIHdvcmtzIGluIHJlYWwgbW9kZScnLgorZG5sCitkbmwgTmV3ZXIgdmVyc2lvbnMgb2YgR0FTIGludGVycHJldCBgLmNvZGUxNicgdG8gbWVhbiBgYGdlbmVyYXRlIDE2LWJpdAorZG5sIGluc3RydWN0aW9ucywnJyB3aGljaCBzZWVtcyByaWdodC4gIFRoaXMgcmVxdWlyZXMgdGhlIHByb2dyYW1tZXIKK2RubCB0byBleHBsaWNpdGx5IGluc2VydCBhZGRyMzIgYW5kIGRhdGEzMiBpbnN0cnVjdGlvbnMgd2hlbiB0aGV5IHdhbnQKK2RubCB0aGVtLgorZG5sCitkbmwgV2Ugb25seSBzdXBwb3J0IHRoZSBuZXdlciB2ZXJzaW9ucywgYmVjYXVzZSB0aGUgb2xkIHZlcnNpb25zIGNhdXNlCitkbmwgbWFqb3IgcGFpbiwgYnkgcmVxdWlyaW5nIG1hbnVhbCBhc3NlbWJseSB0byBnZXQgMTYtYml0IGluc3RydWN0aW9ucyBpbnRvCitkbmwgc3RhZ2UxL3N0YWdlMS5TLgorQUNfREVGVU4oW2dydWJfQVNNX0FERFIzMl0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pCitBQ19SRVFVSVJFKFtncnViX0FTTV9QUkVGSVhfUkVRVUlSRU1FTlRdKQorQUNfTVNHX0NIRUNLSU5HKFtmb3IgLmNvZGUxNiBhZGRyMzIgYXNzZW1ibGVyIHN1cHBvcnRdKQorQUNfQ0FDSEVfVkFMKGdydWJfY3ZfYXNtX2FkZHIzMiwKK1tjYXQgPiBjb25mdGVzdC5zLmluIDw8XEVPRgorCS5jb2RlMTYKK2wxOglAQUREUjMyQAltb3ZiCSVhbCwgbDEKK0VPRgorCitpZiB0ZXN0ICJ4JGdydWJfY3ZfYXNtX3ByZWZpeF9yZXF1aXJlbWVudCIgPSB4eWVzOyB0aGVuCisgIHNlZCAtZSBzL0BBRERSMzJAL2FkZHIzMi8gPCBjb25mdGVzdC5zLmluID4gY29uZnRlc3QucworZWxzZQorICBzZWQgLWUgcy9AQUREUjMyQC9hZGRyMzJcOy8gPCBjb25mdGVzdC5zLmluID4gY29uZnRlc3QucworZmkKKworaWYgQUNfVFJZX0NPTU1BTkQoWyR7Q0MtY2N9ICR7Q0ZMQUdTfSAtYyBjb25mdGVzdC5zXSkgJiYgdGVzdCAtcyBjb25mdGVzdC5vOyB0aGVuCisgIGdydWJfY3ZfYXNtX2FkZHIzMj15ZXMKK2Vsc2UKKyAgZ3J1Yl9jdl9hc21fYWRkcjMyPW5vCitmaQorCitybSAtZiBjb25mdGVzdCpdKQorCitBQ19NU0dfUkVTVUxUKFskZ3J1Yl9jdl9hc21fYWRkcjMyXSldKQorCitkbmwKK2RubCBMYXRlciB2ZXJzaW9ucyBvZiBHQVMgcmVxdWlyZXMgdGhhdCBhZGRyMzIgYW5kIGRhdGEzMiBwcmVmaXhlcworZG5sIGFwcGVhciBpbiB0aGUgc2FtZSBsaW5lcyBhcyB0aGUgaW5zdHJ1Y3Rpb25zIHRoZXkgbW9kaWZ5LCB3aGlsZQorZG5sIGVhcmxpZXIgdmVyc2lvbnMgcmVxdWlyZXMgdGhhdCB0aGV5IGFwcGVhciBpbiBzZXBhcmF0ZSBsaW5lcy4KK0FDX0RFRlVOKFtncnViX0FTTV9QUkVGSVhfUkVRVUlSRU1FTlRdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKQorQUNfTVNHX0NIRUNLSU5HKGRubAorW3doZXRoZXIgYWRkcjMyIG11c3QgYmUgaW4gdGhlIHNhbWUgbGluZSBhcyB0aGUgaW5zdHJ1Y3Rpb25dKQorQUNfQ0FDSEVfVkFMKGdydWJfY3ZfYXNtX3ByZWZpeF9yZXF1aXJlbWVudCwKK1tjYXQgPiBjb25mdGVzdC5zIDw8XEVPRgorCS5jb2RlMTYKK2wxOglhZGRyMzIJbW92YgklYWwsIGwxCitFT0YKKworaWYgQUNfVFJZX0NPTU1BTkQoWyR7Q0MtY2N9ICR7Q0ZMQUdTfSAtYyBjb25mdGVzdC5zXSkgJiYgdGVzdCAtcyBjb25mdGVzdC5vOyB0aGVuCisgIGdydWJfY3ZfYXNtX3ByZWZpeF9yZXF1aXJlbWVudD15ZXMKK2Vsc2UKKyAgZ3J1Yl9jdl9hc21fcHJlZml4X3JlcXVpcmVtZW50PW5vCitmaQorCitybSAtZiBjb25mdGVzdCpdKQorCitpZiB0ZXN0ICJ4JGdydWJfY3ZfYXNtX3ByZWZpeF9yZXF1aXJlbWVudCIgPSB4eWVzOyB0aGVuCisgIGdydWJfdG1wX2FkZHIzMj0iYWRkcjMyIgorICBncnViX3RtcF9kYXRhMzI9ImRhdGEzMiIKK2Vsc2UKKyAgZ3J1Yl90bXBfYWRkcjMyPSJhZGRyMzI7IgorICBncnViX3RtcF9kYXRhMzI9ImRhdGEzMjsiCitmaQorCitBQ19ERUZJTkVfVU5RVU9URUQoW0FERFIzMl0sICRncnViX3RtcF9hZGRyMzIsCisgIFtEZWZpbmUgaXQgdG8gXCJhZGRyMzJcIiBvciBcImFkZHIzMjtcIiB0byBtYWtlIEdBUyBoYXBweV0pCitBQ19ERUZJTkVfVU5RVU9URUQoW0RBVEEzMl0sICRncnViX3RtcF9kYXRhMzIsCisgIFtEZWZpbmUgaXQgdG8gXCJkYXRhMzJcIiBvciBcImRhdGEzMjtcIiB0byBtYWtlIEdBUyBoYXBweV0pCisKK0FDX01TR19SRVNVTFQoWyRncnViX2N2X2FzbV9wcmVmaXhfcmVxdWlyZW1lbnRdKV0pCisKK2RubAorZG5sIE9sZGVyIHZlcnNpb25zIG9mIEdBUyByZXF1aXJlIHRoYXQgYWJzb2x1dGUgaW5kaXJlY3QgY2FsbHMvanVtcHMgYXJlCitkbmwgbm90IHByZWZpeGVkIHdpdGggYConLCB3aGlsZSBsYXRlciB2ZXJzaW9ucyB3YXJuIGlmIG5vdCBwcmVmaXhlZC4KK0FDX0RFRlVOKFtncnViX0FTTV9BQlNPTFVURV9XSVRIT1VUX0FTVEVSSVNLXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSkKK0FDX01TR19DSEVDS0lORyhkbmwKK1t3aGV0aGVyIGFuIGFic29sdXRlIGluZGlyZWN0IGNhbGwvanVtcCBtdXN0IG5vdCBiZSBwcmVmaXhlZCB3aXRoIGFuIGFzdGVyaXNrXSkKK0FDX0NBQ0hFX1ZBTChncnViX2N2X2FzbV9hYnNvbHV0ZV93aXRob3V0X2FzdGVyaXNrLAorW2NhdCA+IGNvbmZ0ZXN0LnMgPDxcRU9GCisJbGNhbGwJKihvZmZzZXQpCQorb2Zmc2V0OgorCS5sb25nCTAKKwkud29yZAkwCitFT0YKKworaWYgQUNfVFJZX0NPTU1BTkQoWyR7Q0MtY2N9ICR7Q0ZMQUdTfSAtYyBjb25mdGVzdC5zXSkgJiYgdGVzdCAtcyBjb25mdGVzdC5vOyB0aGVuCisgIGdydWJfY3ZfYXNtX2Fic29sdXRlX3dpdGhvdXRfYXN0ZXJpc2s9bm8KK2Vsc2UKKyAgZ3J1Yl9jdl9hc21fYWJzb2x1dGVfd2l0aG91dF9hc3Rlcmlzaz15ZXMKK2ZpCisKK3JtIC1mIGNvbmZ0ZXN0Kl0pCisKK2lmIHRlc3QgIngkZ3J1Yl9jdl9hc21fYWJzb2x1dGVfd2l0aG91dF9hc3RlcmlzayIgPSB4eWVzOyB0aGVuCisgIEFDX0RFRklORShBQlNPTFVURV9XSVRIT1VUX0FTVEVSSVNLLCAxLCBbRGVmaW5lIGlmIGFuIGFic29sdXRlIGluZGlyZWN0IGNhbGwvanVtcCBtdXN0IE5PVCBiZSBwcmVmaXhlZCB3aXRoIGAqJ10pCitmaQorCitBQ19NU0dfUkVTVUxUKFskZ3J1Yl9jdl9hc21fYWJzb2x1dGVfd2l0aG91dF9hc3Rlcmlza10pXSkKKworZG5sCitkbmwgZ3J1Yl9DSEVDS19TVEFSVF9TWU1CT0wgY2hlY2tzIGlmIHN0YXJ0IGlzIGF1dG9tYXRpY2FsbHkgZGVmaW5lZCBieQorZG5sIHRoZSBjb21waWxlci4KK2RubCBXcml0dGVuIGJ5IE9LVUpJIFlvc2hpbm9yaQorQUNfREVGVU4oW2dydWJfQ0hFQ0tfU1RBUlRfU1lNQk9MXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSkKK0FDX01TR19DSEVDS0lORyhbaWYgc3RhcnQgaXMgZGVmaW5lZCBieSB0aGUgY29tcGlsZXJdKQorQUNfQ0FDSEVfVkFMKGdydWJfY3ZfY2hlY2tfc3RhcnRfc3ltYm9sLAorW0FDX1RSWV9MSU5LKFtdLCBbYXNtICgiaW5jbCBzdGFydCIpXSwKKyAgIGdydWJfY3ZfY2hlY2tfc3RhcnRfc3ltYm9sPXllcywKKyAgIGdydWJfY3ZfY2hlY2tfc3RhcnRfc3ltYm9sPW5vKV0pCisKK2lmIHRlc3QgIngkZ3J1Yl9jdl9jaGVja19zdGFydF9zeW1ib2wiID0geHllczsgdGhlbgorICBBQ19ERUZJTkUoSEFWRV9TVEFSVF9TWU1CT0wsIDEsIFtEZWZpbmUgaWYgc3RhcnQgaXMgZGVmaW5lZF0pCitmaQorCitBQ19NU0dfUkVTVUxUKFskZ3J1Yl9jdl9jaGVja19zdGFydF9zeW1ib2xdKQorXSkKKworZG5sCitkbmwgZ3J1Yl9DSEVDS19VU0NPUkVfU1RBUlRfU1lNQk9MIGNoZWNrcyBpZiBfc3RhcnQgaXMgYXV0b21hdGljYWxseQorZG5sIGRlZmluZWQgYnkgdGhlIGNvbXBpbGVyLgorZG5sIFdyaXR0ZW4gYnkgT0tVSkkgWW9zaGlub3JpCitBQ19ERUZVTihbZ3J1Yl9DSEVDS19VU0NPUkVfU1RBUlRfU1lNQk9MXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSkKK0FDX01TR19DSEVDS0lORyhbaWYgX3N0YXJ0IGlzIGRlZmluZWQgYnkgdGhlIGNvbXBpbGVyXSkKK0FDX0NBQ0hFX1ZBTChncnViX2N2X2NoZWNrX3VzY29yZV9zdGFydF9zeW1ib2wsCitbQUNfVFJZX0xJTksoW10sIFthc20gKCJpbmNsIF9zdGFydCIpXSwKKyAgIGdydWJfY3ZfY2hlY2tfdXNjb3JlX3N0YXJ0X3N5bWJvbD15ZXMsCisgICBncnViX2N2X2NoZWNrX3VzY29yZV9zdGFydF9zeW1ib2w9bm8pXSkKKworaWYgdGVzdCAieCRncnViX2N2X2NoZWNrX3VzY29yZV9zdGFydF9zeW1ib2wiID0geHllczsgdGhlbgorICBBQ19ERUZJTkUoSEFWRV9VU0NPUkVfU1RBUlRfU1lNQk9MLCAxLCBbRGVmaW5lIGlmIF9zdGFydCBpcyBkZWZpbmVkXSkKK2ZpCisKK0FDX01TR19SRVNVTFQoWyRncnViX2N2X2NoZWNrX3VzY29yZV9zdGFydF9zeW1ib2xdKQorXSkKKworZG5sCitkbmwgZ3J1Yl9DSEVDS19VU0NPUkVfVVNDT1JFX0JTU19TVEFSVF9TWU1CT0wgY2hlY2tzIGlmIF9fYnNzX3N0YXJ0IGlzCitkbmwgYXV0b21hdGljYWxseSBkZWZpbmVkIGJ5IHRoZSBjb21waWxlci4KK2RubCBXcml0dGVuIGJ5IE1pY2hhZWwgSG9obW90aC4KK0FDX0RFRlVOKFtncnViX0NIRUNLX1VTQ09SRV9VU0NPUkVfQlNTX1NUQVJUX1NZTUJPTF0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pCitBQ19NU0dfQ0hFQ0tJTkcoW2lmIF9fYnNzX3N0YXJ0IGlzIGRlZmluZWQgYnkgdGhlIGNvbXBpbGVyXSkKK0FDX0NBQ0hFX1ZBTChncnViX2N2X2NoZWNrX3VzY29yZV91c2NvcmVfYnNzX3N0YXJ0X3N5bWJvbCwKK1tBQ19UUllfTElOSyhbXSwgW2FzbSAoImluY2wgX19ic3Nfc3RhcnQiKV0sCisgICBncnViX2N2X2NoZWNrX3VzY29yZV91c2NvcmVfYnNzX3N0YXJ0X3N5bWJvbD15ZXMsCisgICBncnViX2N2X2NoZWNrX3VzY29yZV91c2NvcmVfYnNzX3N0YXJ0X3N5bWJvbD1ubyldKQorCitpZiB0ZXN0ICJ4JGdydWJfY3ZfY2hlY2tfdXNjb3JlX3VzY29yZV9ic3Nfc3RhcnRfc3ltYm9sIiA9IHh5ZXM7IHRoZW4KKyAgQUNfREVGSU5FKEhBVkVfVVNDT1JFX1VTQ09SRV9CU1NfU1RBUlRfU1lNQk9MLCAxLCBbRGVmaW5lIGlmIF9fYnNzX3N0YXJ0IGlzIGRlZmluZWRdKQorZmkKKworQUNfTVNHX1JFU1VMVChbJGdydWJfY3ZfY2hlY2tfdXNjb3JlX3VzY29yZV9ic3Nfc3RhcnRfc3ltYm9sXSkKK10pCisKK2RubAorZG5sIGdydWJfQ0hFQ0tfRURBVEFfU1lNQk9MIGNoZWNrcyBpZiBlZGF0YSBpcyBhdXRvbWF0aWNhbGx5IGRlZmluZWQgYnkgdGhlCitkbmwgY29tcGlsZXIuCitkbmwgV3JpdHRlbiBieSBNaWNoYWVsIEhvaG11dGguCitBQ19ERUZVTihbZ3J1Yl9DSEVDS19FREFUQV9TWU1CT0xdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKQorQUNfTVNHX0NIRUNLSU5HKFtpZiBlZGF0YSBpcyBkZWZpbmVkIGJ5IHRoZSBjb21waWxlcl0pCitBQ19DQUNIRV9WQUwoZ3J1Yl9jdl9jaGVja19lZGF0YV9zeW1ib2wsCitbQUNfVFJZX0xJTksoW10sIFthc20gKCJpbmNsIGVkYXRhIildLAorICAgZ3J1Yl9jdl9jaGVja19lZGF0YV9zeW1ib2w9eWVzLAorICAgZ3J1Yl9jdl9jaGVja19lZGF0YV9zeW1ib2w9bm8pXSkKKworaWYgdGVzdCAieCRncnViX2N2X2NoZWNrX2VkYXRhX3N5bWJvbCIgPSB4eWVzOyB0aGVuCisgIEFDX0RFRklORShIQVZFX0VEQVRBX1NZTUJPTCwgMSwgW0RlZmluZSBpZiBlZGF0YSBpcyBkZWZpbmVkXSkKK2ZpCisKK0FDX01TR19SRVNVTFQoWyRncnViX2N2X2NoZWNrX2VkYXRhX3N5bWJvbF0pCitdKQorCitkbmwKK2RubCBncnViX0NIRUNLX1VTQ09SRV9FREFUQV9TWU1CT0wgY2hlY2tzIGlmIF9lZGF0YSBpcyBhdXRvbWF0aWNhbGx5CitkbmwgZGVmaW5lZCBieSB0aGUgY29tcGlsZXIuCitkbmwgV3JpdHRlbiBieSBNaWNoYWVsIEhvaG11dGguCitBQ19ERUZVTihbZ3J1Yl9DSEVDS19VU0NPUkVfRURBVEFfU1lNQk9MXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSkKK0FDX01TR19DSEVDS0lORyhbaWYgX2VkYXRhIGlzIGRlZmluZWQgYnkgdGhlIGNvbXBpbGVyXSkKK0FDX0NBQ0hFX1ZBTChncnViX2N2X2NoZWNrX3VzY29yZV9lZGF0YV9zeW1ib2wsCitbQUNfVFJZX0xJTksoW10sIFthc20gKCJpbmNsIF9lZGF0YSIpXSwKKyAgIGdydWJfY3ZfY2hlY2tfdXNjb3JlX2VkYXRhX3N5bWJvbD15ZXMsCisgICBncnViX2N2X2NoZWNrX3VzY29yZV9lZGF0YV9zeW1ib2w9bm8pXSkKKworaWYgdGVzdCAieCRncnViX2N2X2NoZWNrX3VzY29yZV9lZGF0YV9zeW1ib2wiID0geHllczsgdGhlbgorICBBQ19ERUZJTkUoSEFWRV9VU0NPUkVfRURBVEFfU1lNQk9MLCAxLCBbRGVmaW5lIGlmIF9lZGF0YSBpcyBkZWZpbmVkXSkKK2ZpCisKK0FDX01TR19SRVNVTFQoWyRncnViX2N2X2NoZWNrX3VzY29yZV9lZGF0YV9zeW1ib2xdKQorXSkKKworZG5sCitkbmwgZ3J1Yl9DSEVDS19FTkRfU1lNQk9MIGNoZWNrcyBpZiBlbmQgaXMgYXV0b21hdGljYWxseSBkZWZpbmVkIGJ5IHRoZQorZG5sIGNvbXBpbGVyLgorZG5sIFdyaXR0ZW4gYnkgT0tVSkkgWW9zaGlub3JpCitBQ19ERUZVTihbZ3J1Yl9DSEVDS19FTkRfU1lNQk9MXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSkKK0FDX01TR19DSEVDS0lORyhbaWYgZW5kIGlzIGRlZmluZWQgYnkgdGhlIGNvbXBpbGVyXSkKK0FDX0NBQ0hFX1ZBTChncnViX2N2X2NoZWNrX2VuZF9zeW1ib2wsCitbQUNfVFJZX0xJTksoW10sIFthc20gKCJpbmNsIGVuZCIpXSwKKyAgIGdydWJfY3ZfY2hlY2tfZW5kX3N5bWJvbD15ZXMsCisgICBncnViX2N2X2NoZWNrX2VuZF9zeW1ib2w9bm8pXSkKKworaWYgdGVzdCAieCRncnViX2N2X2NoZWNrX2VuZF9zeW1ib2wiID0geHllczsgdGhlbgorICBBQ19ERUZJTkUoSEFWRV9FTkRfU1lNQk9MLCAxLCBbRGVmaW5lIGlmIGVuZCBpcyBkZWZpbmVkXSkKK2ZpCisKK0FDX01TR19SRVNVTFQoWyRncnViX2N2X2NoZWNrX2VuZF9zeW1ib2xdKQorXSkKKworZG5sCitkbmwgZ3J1Yl9DSEVDS19VU0NPUkVfRU5EX1NZTUJPTCBjaGVja3MgaWYgX2VuZCBpcyBhdXRvbWF0aWNhbGx5IGRlZmluZWQKK2RubCBieSB0aGUgY29tcGlsZXIuCitkbmwgV3JpdHRlbiBieSBPS1VKSSBZb3NoaW5vcmkKK0FDX0RFRlVOKFtncnViX0NIRUNLX1VTQ09SRV9FTkRfU1lNQk9MXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSkKK0FDX01TR19DSEVDS0lORyhbaWYgX2VuZCBpcyBkZWZpbmVkIGJ5IHRoZSBjb21waWxlcl0pCitBQ19DQUNIRV9WQUwoZ3J1Yl9jdl9jaGVja191c2NvcmVfZW5kX3N5bWJvbCwKK1tBQ19UUllfTElOSyhbXSwgW2FzbSAoImluY2wgX2VuZCIpXSwKKyAgIGdydWJfY3ZfY2hlY2tfdXNjb3JlX2VuZF9zeW1ib2w9eWVzLAorICAgZ3J1Yl9jdl9jaGVja191c2NvcmVfZW5kX3N5bWJvbD1ubyldKQorCitpZiB0ZXN0ICJ4JGdydWJfY3ZfY2hlY2tfdXNjb3JlX2VuZF9zeW1ib2wiID0geHllczsgdGhlbgorICBBQ19ERUZJTkUoSEFWRV9VU0NPUkVfRU5EX1NZTUJPTCwgMSwgW0RlZmluZSBpZiBlbmQgaXMgZGVmaW5lZF0pCitmaQorCitBQ19NU0dfUkVTVUxUKFskZ3J1Yl9jdl9jaGVja191c2NvcmVfZW5kX3N5bWJvbF0pCitdKQorCitkbmwgZ3J1Yl9ERUZJTkVfRklMRShNQUNST19OQU1FLCBGSUxFX05BTUUsIERFU0NSSVBUSU9OKQorZG5sIGdydWJfREVGSU5FX0ZJTEUgZGVmaW5lcyBhIG1hY3JvIGFzIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgc2FmZWx5LgorZG5sIFJlcGxhY2Ugc29tZSBlc2NhcGUgc2VxdWVuY2VzLCBiZWNhdXNlIGF1dG9jb25mIGRvZXNuJ3QgaGFuZGxlIHRoZW0KK2RubCBncmFjZWZ1bGx5LgorZG5sIFdyaXR0ZW4gYnkgT0tVSkkgWW9zaGlub3JpLgorQUNfREVGVU4oW2dydWJfREVGSU5FX0ZJTEVdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKQorIyBCZWNhdXNlIGVhcmx5IHZlcnNpb25zIG9mIEdOVSBzZWQgMy54IGFyZSB0b28gYnVnZ3ksIHVzZSBhIEMgcHJvZ3JhbQorIyBpbnN0ZWFkIG9mIHNoZWxsIGNvbW1hbmRzLiAqc2lnaCoKK2NhdCA+Y29uZnRlc3QuYyA8PFxFT0YKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQKK21haW4gKHZvaWQpCit7CisgIGludCBjOworCisgIHdoaWxlICgoYyA9IGdldGNoYXIgKCkpICE9IEVPRikKKyAgICB7CisgICAgICBzd2l0Y2ggKGMpCisgICAgICAgIHsKKwljYXNlICdcbic6CisJICBmcHV0cyAoIlxcbiIsIHN0ZG91dCk7CisJICBicmVhazsKKwljYXNlICdccic6CisJICBmcHV0cyAoIlxcciIsIHN0ZG91dCk7CisJICBicmVhazsKKwljYXNlICdcXCc6CisJICBmcHV0cyAoIlxcXFwiLCBzdGRvdXQpOworCSAgYnJlYWs7CisJY2FzZSAnIic6CisJICBmcHV0cyAoIlxcXCIiLCBzdGRvdXQpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHB1dGNoYXIgKGMpOworCX0KKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CitFT0YKKworaWYgQUNfVFJZX0NPTU1BTkQoWyR7Q0MtY2N9ICR7Q0ZMQUdTfSBjb25mdGVzdC5jIC1vIGNvbmZ0ZXN0XSkgJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgorICBncnViX3RtcF92YWx1ZT1gLi9jb25mdGVzdCA8ICJbJDJdImAKK2Vsc2UKKyAgQUNfTVNHX0VSUk9SKFske0NDLWNjfSBmYWlsZWQgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlIGZpbGVdKQorZmkKKworQUNfREVGSU5FX1VOUVVPVEVEKFskMV0sICIkZ3J1Yl90bXBfdmFsdWUiLCBbJDNdKQorcm0gLWYgY29uZnRlc3QqCitdKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC5tNCBiL2FjbG9jYWwubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE2OTFmNgotLS0gL2Rldi9udWxsCisrKyBiL2FjbG9jYWwubTQKQEAgLTAsMCArMSwxMDYxIEBACisjIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS45LjQgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNAorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBHZW5lcmF0ZWQgZnJvbSBhbXZlcnNpb24uaW47IGRvIG5vdCBlZGl0IGJ5IGhhbmQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorCisjIEFNX0FVVE9NQUtFX1ZFUlNJT04oVkVSU0lPTikKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBdXRvbWFrZSBYLlkgdHJhY2VzIHRoaXMgbWFjcm8gdG8gZW5zdXJlIGFjbG9jYWwubTQgaGFzIGJlZW4KKyMgZ2VuZXJhdGVkIGZyb20gdGhlIG00IGZpbGVzIGFjY29tcGFueWluZyBBdXRvbWFrZSBYLlkuCitBQ19ERUZVTihbQU1fQVVUT01BS0VfVkVSU0lPTl0sIFthbV9fYXBpX3ZlcnNpb249IjEuOSJdKQorCisjIEFNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT04KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDYWxsIEFNX0FVVE9NQUtFX1ZFUlNJT04gc28gaXQgY2FuIGJlIHRyYWNlZC4KKyMgVGhpcyBmdW5jdGlvbiBpcyBBQ19SRVFVSVJFZCBieSBBQ19JTklUX0FVVE9NQUtFLgorQUNfREVGVU4oW0FNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT05dLAorCSBbQU1fQVVUT01BS0VfVkVSU0lPTihbMS45LjRdKV0pCisKKyMgQU1fQVVYX0RJUl9FWFBBTkQKKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorIyAwMjExMS0xMzA3LCBVU0EuCisKKyMgRm9yIHByb2plY3RzIHVzaW5nIEFDX0NPTkZJR19BVVhfRElSKFtmb29dKSwgQXV0b2NvbmYgc2V0cworIyAkYWNfYXV4X2RpciB0byBgJHNyY2Rpci9mb28nLiAgSW4gb3RoZXIgcHJvamVjdHMsIGl0IGlzIHNldCB0bworIyBgJHNyY2RpcicsIGAkc3JjZGlyLy4uJywgb3IgYCRzcmNkaXIvLi4vLi4nLgorIworIyBPZiBjb3Vyc2UsIEF1dG9tYWtlIG11c3QgaG9ub3IgdGhpcyB2YXJpYWJsZSB3aGVuZXZlciBpdCBjYWxscyBhCisjIHRvb2wgZnJvbSB0aGUgYXV4aWxpYXJ5IGRpcmVjdG9yeS4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgJHNyY2RpciAoYW5kCisjIHRoZXJlZm9yZSAkYWNfYXV4X2RpciBhcyB3ZWxsKSBjYW4gYmUgZWl0aGVyIGFic29sdXRlIG9yIHJlbGF0aXZlLAorIyBkZXBlbmRpbmcgb24gaG93IGNvbmZpZ3VyZSBpcyBydW4uICBUaGlzIGlzIHByZXR0eSBhbm5veWluZywgc2luY2UKKyMgaXQgbWFrZXMgJGFjX2F1eF9kaXIgcXVpdGUgdW51c2FibGUgaW4gc3ViZGlyZWN0b3JpZXM6IGluIHRoZSB0b3AKKyMgc291cmNlIGRpcmVjdG9yeSwgYW55IGZvcm0gd2lsbCB3b3JrIGZpbmUsIGJ1dCBpbiBzdWJkaXJlY3RvcmllcyBhCisjIHJlbGF0aXZlIHBhdGggbmVlZHMgdG8gYmUgYWRqdXN0ZWQgZmlyc3QuCisjCisjICRhY19hdXhfZGlyL21pc3NpbmcKKyMgICAgZmFpbHMgd2hlbiBjYWxsZWQgZnJvbSBhIHN1YmRpcmVjdG9yeSBpZiAkYWNfYXV4X2RpciBpcyByZWxhdGl2ZQorIyAkdG9wX3NyY2Rpci8kYWNfYXV4X2Rpci9taXNzaW5nCisjICAgIGZhaWxzIGlmICRhY19hdXhfZGlyIGlzIGFic29sdXRlLAorIyAgICBmYWlscyB3aGVuIGNhbGxlZCBmcm9tIGEgc3ViZGlyZWN0b3J5IGluIGEgVlBBVEggYnVpbGQgd2l0aAorIyAgICAgICAgICBhIHJlbGF0aXZlICRhY19hdXhfZGlyCisjCisjIFRoZSByZWFzb24gb2YgdGhlIGxhdHRlciBmYWlsdXJlIGlzIHRoYXQgJHRvcF9zcmNkaXIgYW5kICRhY19hdXhfZGlyCisjIGFyZSBib3RoIHByZWZpeGVkIGJ5ICRzcmNkaXIuICBJbiBhbiBpbi1zb3VyY2UgYnVpbGQgdGhpcyBpcyB1c3VhbGx5CisjIGhhcm1sZXNzIGJlY2F1c2UgJHNyY2RpciBpcyBgLicsIGJ1dCB0aGluZ3Mgd2lsbCBicm9rZSB3aGVuIHlvdQorIyBzdGFydCBhIFZQQVRIIGJ1aWxkIG9yIHVzZSBhbiBhYnNvbHV0ZSAkc3JjZGlyLgorIworIyBTbyB3ZSBjb3VsZCB1c2Ugc29tZXRoaW5nIHNpbWlsYXIgdG8gJHRvcF9zcmNkaXIvJGFjX2F1eF9kaXIvbWlzc2luZywKKyMgaWZmIHdlIHN0cmlwIHRoZSBsZWFkaW5nICRzcmNkaXIgZnJvbSAkYWNfYXV4X2Rpci4gIFRoYXQgd291bGQgYmU6CisjICAgYW1fYXV4X2Rpcj0nXCQodG9wX3NyY2RpcikvJ2BleHByICIkYWNfYXV4X2RpciIgOiAiJHNyY2Rpci8vKlwoLipcKSJgCisjIGFuZCB0aGVuIHdlIHdvdWxkIGRlZmluZSAkTUlTU0lORyBhcworIyAgIE1JU1NJTkc9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9taXNzaW5nIgorIyBUaGlzIHdpbGwgd29yayBhcyBsb25nIGFzIE1JU1NJTkcgaXMgbm90IGNhbGxlZCBmcm9tIGNvbmZpZ3VyZSwgYmVjYXVzZQorIyB1bmZvcnR1bmF0ZWx5ICQodG9wX3NyY2RpcikgaGFzIG5vIG1lYW5pbmcgaW4gY29uZmlndXJlLgorIyBIb3dldmVyIHRoZXJlIGFyZSBvdGhlciB2YXJpYWJsZXMsIGxpa2UgQ0MsIHdoaWNoIGFyZSBvZnRlbiB1c2VkIGluCisjIGNvbmZpZ3VyZSwgYW5kIGNvdWxkIHRoZXJlZm9yZSBub3QgdXNlIHRoaXMgImZpeGVkIiAkYWNfYXV4X2Rpci4KKyMKKyMgQW5vdGhlciBzb2x1dGlvbiwgdXNlZCBoZXJlLCBpcyB0byBhbHdheXMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuCisjIGFic29sdXRlIFBBVEguICBUaGUgZHJhd2JhY2sgaXMgdGhhdCB1c2luZyBhYnNvbHV0ZSBwYXRocyBwcmV2ZW50IGEKKyMgY29uZmlndXJlZCB0cmVlIHRvIGJlIG1vdmVkIHdpdGhvdXQgcmVjb25maWd1cmF0aW9uLgorCitBQ19ERUZVTihbQU1fQVVYX0RJUl9FWFBBTkRdLAorW2RubCBSZWx5IG9uIGF1dG9jb25mIHRvIHNldCB1cCBDRFBBVEggcHJvcGVybHkuCitBQ19QUkVSRVEoWzIuNTBdKWRubAorIyBleHBhbmQgJGFjX2F1eF9kaXIgdG8gYW4gYWJzb2x1dGUgcGF0aAorYW1fYXV4X2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAorXSkKKworIyBBTV9DT05ESVRJT05BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk3LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyMgMDIxMTEtMTMwNywgVVNBLgorCisjIHNlcmlhbCA2CisKKyMgQU1fQ09ORElUSU9OQUwoTkFNRSwgU0hFTEwtQ09ORElUSU9OKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSBhIGNvbmRpdGlvbmFsLgorQUNfREVGVU4oW0FNX0NPTkRJVElPTkFMXSwKK1tBQ19QUkVSRVEoMi41MilkbmwKKyBpZmVsc2UoWyQxXSwgW1RSVUVdLCAgW0FDX0ZBVEFMKFskMDogaW52YWxpZCBjb25kaXRpb246ICQxXSldLAorCVskMV0sIFtGQUxTRV0sIFtBQ19GQVRBTChbJDA6IGludmFsaWQgY29uZGl0aW9uOiAkMV0pXSlkbmwKK0FDX1NVQlNUKFskMV9UUlVFXSkKK0FDX1NVQlNUKFskMV9GQUxTRV0pCitpZiAkMjsgdGhlbgorICAkMV9UUlVFPQorICAkMV9GQUxTRT0nIycKK2Vsc2UKKyAgJDFfVFJVRT0nIycKKyAgJDFfRkFMU0U9CitmaQorQUNfQ09ORklHX0NPTU1BTkRTX1BSRSgKK1tpZiB0ZXN0IC16ICIkeyQxX1RSVUV9IiAmJiB0ZXN0IC16ICIkeyQxX0ZBTFNFfSI7IHRoZW4KKyAgQUNfTVNHX0VSUk9SKFtbY29uZGl0aW9uYWwgIiQxIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5Ll1dKQorZmldKV0pCisKKyMgc2VyaWFsIDcJCQkJCQktKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyMgMDIxMTEtMTMwNywgVVNBLgorCisKKyMgVGhlcmUgYXJlIGEgZmV3IGRpcnR5IGhhY2tzIGJlbG93IHRvIGF2b2lkIGxldHRpbmcgYEFDX1BST0dfQ0MnIGJlCisjIHdyaXR0ZW4gaW4gY2xlYXIsIGluIHdoaWNoIGNhc2UgYXV0b21ha2UsIHdoZW4gcmVhZGluZyBhY2xvY2FsLm00LAorIyB3aWxsIHRoaW5rIGl0IHNlZXMgYSAqdXNlKiwgYW5kIHRoZXJlZm9yZSB3aWxsIHRyaWdnZXIgYWxsIGl0J3MKKyMgQyBzdXBwb3J0IG1hY2hpbmVyeS4gIEFsc28gbm90ZSB0aGF0IGl0IG1lYW5zIHRoYXQgYXV0b3NjYW4sIHNlZWluZworIyBDQyBldGMuIGluIHRoZSBNYWtlZmlsZSwgd2lsbCBhc2sgZm9yIGFuIEFDX1BST0dfQ0MgdXNlLi4uCisKKworCisjIF9BTV9ERVBFTkRFTkNJRVMoTkFNRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZWUgaG93IHRoZSBjb21waWxlciBpbXBsZW1lbnRzIGRlcGVuZGVuY3kgY2hlY2tpbmcuCisjIE5BTUUgaXMgIkNDIiwgIkNYWCIsICJHQ0oiLCBvciAiT0JKQyIuCisjIFdlIHRyeSBhIGZldyB0ZWNobmlxdWVzIGFuZCB1c2UgdGhhdCB0byBzZXQgYSBzaW5nbGUgY2FjaGUgdmFyaWFibGUuCisjCisjIFdlIGRvbid0IEFDX1JFUVVJUkUgdGhlIGNvcnJlc3BvbmRpbmcgQUNfUFJPR19DQyBzaW5jZSB0aGUgbGF0dGVyIHdhcworIyBtb2RpZmllZCB0byBpbnZva2UgX0FNX0RFUEVOREVOQ0lFUyhDQyk7IHdlIHdvdWxkIGhhdmUgYSBjaXJjdWxhcgorIyBkZXBlbmRlbmN5LCBhbmQgZ2l2ZW4gdGhhdCB0aGUgdXNlciBpcyBub3QgZXhwZWN0ZWQgdG8gcnVuIHRoaXMgbWFjcm8sCisjIGp1c3QgcmVseSBvbiBBQ19QUk9HX0NDLgorQUNfREVGVU4oW19BTV9ERVBFTkRFTkNJRVNdLAorW0FDX1JFUVVJUkUoW0FNX1NFVF9ERVBESVJdKWRubAorQUNfUkVRVUlSRShbQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdKWRubAorQUNfUkVRVUlSRShbQU1fTUFLRV9JTkNMVURFXSlkbmwKK0FDX1JFUVVJUkUoW0FNX0RFUF9UUkFDS10pZG5sCisKK2lmZWxzZShbJDFdLCBDQywgICBbZGVwY2M9IiRDQyIgICBhbV9jb21waWxlcl9saXN0PV0sCisgICAgICAgWyQxXSwgQ1hYLCAgW2RlcGNjPSIkQ1hYIiAgYW1fY29tcGlsZXJfbGlzdD1dLAorICAgICAgIFskMV0sIE9CSkMsIFtkZXBjYz0iJE9CSkMiIGFtX2NvbXBpbGVyX2xpc3Q9J2djYzMgZ2NjJ10sCisgICAgICAgWyQxXSwgR0NKLCAgW2RlcGNjPSIkR0NKIiAgYW1fY29tcGlsZXJfbGlzdD0nZ2NjMyBnY2MnXSwKKyAgICAgICAgICAgICAgICAgICBbZGVwY2M9IiQkMSIgICBhbV9jb21waWxlcl9saXN0PV0pCisKK0FDX0NBQ0hFX0NIRUNLKFtkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjY10sCisgICAgICAgICAgICAgICBbYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGVdLAorW2lmIHRlc3QgLXogIiRBTURFUF9UUlVFIiAmJiB0ZXN0IC1mICIkYW1fZGVwY29tcCI7IHRoZW4KKyAgIyBXZSBtYWtlIGEgc3ViZGlyIGFuZCBkbyB0aGUgdGVzdHMgdGhlcmUuICBPdGhlcndpc2Ugd2UgY2FuIGVuZCB1cAorICAjIG1ha2luZyBib2d1cyBmaWxlcyB0aGF0IHdlIGRvbid0IGtub3cgYWJvdXQgYW5kIG5ldmVyIHJlbW92ZS4gIEZvcgorICAjIGluc3RhbmNlIGl0IHdhcyByZXBvcnRlZCB0aGF0IG9uIEhQLVVYIHRoZSBnY2MgdGVzdCB3aWxsIGVuZCB1cAorICAjIG1ha2luZyBhIGR1bW15IGZpbGUgbmFtZWQgYEQnIC0tIGJlY2F1c2UgYC1NRCcgbWVhbnMgYHB1dCB0aGUgb3V0cHV0CisgICMgaW4gRCcuCisgIG1rZGlyIGNvbmZ0ZXN0LmRpcgorICAjIENvcHkgZGVwY29tcCB0byBzdWJkaXIgYmVjYXVzZSBvdGhlcndpc2Ugd2Ugd29uJ3QgZmluZCBpdCBpZiB3ZSdyZQorICAjIHVzaW5nIGEgcmVsYXRpdmUgZGlyZWN0b3J5LgorICBjcCAiJGFtX2RlcGNvbXAiIGNvbmZ0ZXN0LmRpcgorICBjZCBjb25mdGVzdC5kaXIKKyAgIyBXZSB3aWxsIGJ1aWxkIG9iamVjdHMgYW5kIGRlcGVuZGVuY2llcyBpbiBhIHN1YmRpcmVjdG9yeSBiZWNhdXNlCisgICMgaXQgaGVscHMgdG8gZGV0ZWN0IGluYXBwbGljYWJsZSBkZXBlbmRlbmN5IG1vZGVzLiAgRm9yIGluc3RhbmNlCisgICMgYm90aCBUcnU2NCdzIGNjIGFuZCBJQ0Mgc3VwcG9ydCAtTUQgdG8gb3V0cHV0IGRlcGVuZGVuY2llcyBhcyBhCisgICMgc2lkZSBlZmZlY3Qgb2YgY29tcGlsYXRpb24sIGJ1dCBJQ0Mgd2lsbCBwdXQgdGhlIGRlcGVuZGVuY2llcyBpbgorICAjIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aGlsZSBUcnU2NCB3aWxsIHB1dCB0aGVtIGluIHRoZSBvYmplY3QKKyAgIyBkaXJlY3RvcnkuCisgIG1rZGlyIHN1YgorCisgIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKKyAgaWYgdGVzdCAiJGFtX2NvbXBpbGVyX2xpc3QiID0gIiI7IHRoZW4KKyAgICAgYW1fY29tcGlsZXJfbGlzdD1gc2VkIC1uIFsncy9eIypcKFthLXpBLVowLTldKlwpKSQvXDEvcCddIDwgLi9kZXBjb21wYAorICBmaQorICBmb3IgZGVwbW9kZSBpbiAkYW1fY29tcGlsZXJfbGlzdDsgZG8KKyAgICAjIFNldHVwIGEgc291cmNlIHdpdGggbWFueSBkZXBlbmRlbmNpZXMsIGJlY2F1c2Ugc29tZSBjb21waWxlcnMKKyAgICAjIGxpa2UgdG8gd3JhcCBsYXJnZSBkZXBlbmRlbmN5IGxpc3RzIG9uIGNvbHVtbiA4MCAod2l0aCBcKSwgYW5kCisgICAgIyB3ZSBzaG91bGQgbm90IGNob29zZSBhIGRlcGNvbXAgbW9kZSB3aGljaCBpcyBjb25mdXNlZCBieSB0aGlzLgorICAgICMKKyAgICAjIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlc2UgZmlsZXMgZm9yIGVhY2ggdGVzdCwgYXMgdGhlIGNvbXBpbGVyIG1heQorICAgICMgb3ZlcndyaXRlIHNvbWUgb2YgdGhlbSB3aGVuIHRlc3Rpbmcgd2l0aCBvYnNjdXJlIGNvbW1hbmQgbGluZXMuCisgICAgIyBUaGlzIGhhcHBlbnMgYXQgbGVhc3Qgd2l0aCB0aGUgQUlYIEMgY29tcGlsZXIuCisgICAgOiA+IHN1Yi9jb25mdGVzdC5jCisgICAgZm9yIGkgaW4gMSAyIDMgNCA1IDY7IGRvCisgICAgICBlY2hvICcjaW5jbHVkZSAiY29uZnRzdCckaScuaCInID4+IHN1Yi9jb25mdGVzdC5jCisgICAgICAjIFVzaW5nIGA6ID4gc3ViL2NvbmZ0c3QkaS5oJyBjcmVhdGVzIG9ubHkgc3ViL2NvbmZ0c3QxLmggd2l0aAorICAgICAgIyBTb2xhcmlzIDgncyB7L3Vzcix9L2Jpbi9zaC4KKyAgICAgIHRvdWNoIHN1Yi9jb25mdHN0JGkuaAorICAgIGRvbmUKKyAgICBlY2hvICIke2FtX19pbmNsdWRlfSAke2FtX19xdW90ZX1zdWIvY29uZnRlc3QuUG8ke2FtX19xdW90ZX0iID4gY29uZm1mCisKKyAgICBjYXNlICRkZXBtb2RlIGluCisgICAgbm9zaWRlZWZmZWN0KQorICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCisgICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KKwljb250aW51ZQorICAgICAgZWxzZQorCWJyZWFrCisgICAgICBmaQorICAgICAgOzsKKyAgICBub25lKSBicmVhayA7OworICAgIGVzYWMKKyAgICAjIFdlIGNoZWNrIHdpdGggYC1jJyBhbmQgYC1vJyBmb3IgdGhlIHNha2Ugb2YgdGhlICJkYXNobXN0ZG91dCIKKyAgICAjIG1vZGUuICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgU3VuUHJvIEMrKyBjb21waWxlciBkb2VzIG5vdCBwcm9wZXJseQorICAgICMgaGFuZGxlIGAtTSAtbycsIGFuZCB3ZSBuZWVkIHRvIGRldGVjdCB0aGlzLgorICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAorICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9c3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IFwKKyAgICAgICBkZXBmaWxlPXN1Yi9jb25mdGVzdC5QbyB0bXBkZXBmaWxlPXN1Yi9jb25mdGVzdC5UUG8gXAorICAgICAgICRTSEVMTCAuL2RlcGNvbXAgJGRlcGNjIC1jIC1vIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuYyBcCisgICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCisgICAgICAgZ3JlcCBzdWIvY29uZnRzdDYuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAjIGljYyBkb2Vzbid0IGNob2tlIG9uIHVua25vd24gb3B0aW9ucywgaXQgd2lsbCBqdXN0IGlzc3VlIHdhcm5pbmdzCisgICAgICAjIG9yIHJlbWFya3MgKGV2ZW4gd2l0aCAtV2Vycm9yKS4gIFNvIHdlIGdyZXAgc3RkZXJyIGZvciBhbnkgbWVzc2FnZQorICAgICAgIyB0aGF0IHNheXMgYW4gb3B0aW9uIHdhcyBpZ25vcmVkIG9yIG5vdCBzdXBwb3J0ZWQuCisgICAgICAjIFdoZW4gZ2l2ZW4gLU1QLCBpY2MgNy4wIGFuZCA3LjEgY29tcGxhaW4gdGh1c2x5OgorICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHdhcm5pbmc6IGlnbm9yaW5nIG9wdGlvbiAnLU0nOyBubyBhcmd1bWVudCByZXF1aXJlZAorICAgICAgIyBUaGUgZGlhZ25vc2lzIGNoYW5nZWQgaW4gaWNjIDguMDoKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSByZW1hcms6IG9wdGlvbiAnLU1QJyBub3Qgc3VwcG9ydGVkCisgICAgICBpZiAoZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgfHwKKyAgICAgICAgICBncmVwICdub3Qgc3VwcG9ydGVkJyBjb25mdGVzdC5lcnIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCisgICAgICAgIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPSRkZXBtb2RlCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKworICBjZCAuLgorICBybSAtcmYgY29uZnRlc3QuZGlyCitlbHNlCisgIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKK2ZpCitdKQorQUNfU1VCU1QoWyQxREVQTU9ERV0sIFtkZXBtb2RlPSRhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZV0pCitBTV9DT05ESVRJT05BTChbYW1fX2Zhc3RkZXAkMV0sIFsKKyAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKKyAgJiYgdGVzdCAiJGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzNdKQorXSkKKworCisjIEFNX1NFVF9ERVBESVIKKyMgLS0tLS0tLS0tLS0tLQorIyBDaG9vc2UgYSBkaXJlY3RvcnkgbmFtZSBmb3IgZGVwZW5kZW5jeSBmaWxlcy4KKyMgVGhpcyBtYWNybyBpcyBBQ19SRVFVSVJFZCBpbiBfQU1fREVQRU5ERU5DSUVTCitBQ19ERUZVTihbQU1fU0VUX0RFUERJUl0sCitbQUNfUkVRVUlSRShbQU1fU0VUX0xFQURJTkdfRE9UXSlkbmwKK0FDX1NVQlNUKFtERVBESVJdLCBbIiR7YW1fX2xlYWRpbmdfZG90fWRlcHMiXSlkbmwKK10pCisKKworIyBBTV9ERVBfVFJBQ0sKKyMgLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQU1fREVQX1RSQUNLXSwKK1tBQ19BUkdfRU5BQkxFKGRlcGVuZGVuY3ktdHJhY2tpbmcsCitbICAtLWRpc2FibGUtZGVwZW5kZW5jeS10cmFja2luZyAgc3BlZWRzIHVwIG9uZS10aW1lIGJ1aWxkCisgIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgICBkbyBub3QgcmVqZWN0IHNsb3cgZGVwZW5kZW5jeSBleHRyYWN0b3JzXSkKK2lmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubzsgdGhlbgorICBhbV9kZXBjb21wPSIkYWNfYXV4X2Rpci9kZXBjb21wIgorICBBTURFUEJBQ0tTTEFTSD0nXCcKK2ZpCitBTV9DT05ESVRJT05BTChbQU1ERVBdLCBbdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vXSkKK0FDX1NVQlNUKFtBTURFUEJBQ0tTTEFTSF0pCitdKQorCisjIEdlbmVyYXRlIGNvZGUgdG8gc2V0IHVwIGRlcGVuZGVuY3kgdHJhY2tpbmcuICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNAorIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyMgMDIxMTEtMTMwNywgVVNBLgorCisjc2VyaWFsIDIKKworIyBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKK1tmb3IgbWYgaW4gJENPTkZJR19GSUxFUzsgZG8KKyAgIyBTdHJpcCBNRiBzbyB3ZSBlbmQgdXAgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgbWY9YGVjaG8gIiRtZiIgfCBzZWQgLWUgJ3MvOi4qJC8vJ2AKKyAgIyBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYW4gQXV0b21ha2UgZ2VuZXJhdGVkIE1ha2VmaWxlIG9yIG5vdC4KKyAgIyBXZSB1c2VkIHRvIG1hdGNoIG9ubHkgdGhlIGZpbGVzIG5hbWVkIGBNYWtlZmlsZS5pbicsIGJ1dAorICAjIHNvbWUgcGVvcGxlIHJlbmFtZSB0aGVtOyBzbyBpbnN0ZWFkIHdlIGxvb2sgYXQgdGhlIGZpbGUgY29udGVudC4KKyAgIyBHcmVwJ2luZyB0aGUgZmlyc3QgbGluZSBpcyBub3QgZW5vdWdoOiBzb21lIHBlb3BsZSBwb3N0LXByb2Nlc3MKKyAgIyBlYWNoIE1ha2VmaWxlLmluIGFuZCBhZGQgYSBuZXcgbGluZSBvbiB0b3Agb2YgZWFjaCBmaWxlIHRvIHNheSBzby4KKyAgIyBTbyBsZXQncyBncmVwIHdob2xlIGZpbGUuCisgIGlmIGdyZXAgJ14jLipnZW5lcmF0ZWQgYnkgYXV0b21ha2UnICRtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgZGlycGFydD1gQVNfRElSTkFNRSgiJG1mIilgCisgIGVsc2UKKyAgICBjb250aW51ZQorICBmaQorICAjIEV4dHJhY3QgdGhlIGRlZmluaXRpb24gb2YgREVQRElSLCBhbV9faW5jbHVkZSwgYW5kIGFtX19xdW90ZQorICAjIGZyb20gdGhlIE1ha2VmaWxlIHdpdGhvdXQgcnVubmluZyBgbWFrZScuCisgIERFUERJUj1gc2VkIC1uICdzL15ERVBESVIgPSAvL3AnIDwgIiRtZiJgCisgIHRlc3QgLXogIiRERVBESVIiICYmIGNvbnRpbnVlCisgIGFtX19pbmNsdWRlPWBzZWQgLW4gJ3MvXmFtX19pbmNsdWRlID0gLy9wJyA8ICIkbWYiYAorICB0ZXN0IC16ICJhbV9faW5jbHVkZSIgJiYgY29udGludWUKKyAgYW1fX3F1b3RlPWBzZWQgLW4gJ3MvXmFtX19xdW90ZSA9IC8vcCcgPCAiJG1mImAKKyAgIyBXaGVuIHVzaW5nIGFuc2kya25yLCBVIG1heSBiZSBlbXB0eSBvciBhbiB1bmRlcnNjb3JlOyBleHBhbmQgaXQKKyAgVT1gc2VkIC1uICdzL15VID0gLy9wJyA8ICIkbWYiYAorICAjIEZpbmQgYWxsIGRlcGVuZGVuY3kgb3V0cHV0IGZpbGVzLCB0aGV5IGFyZSBpbmNsdWRlZCBmaWxlcyB3aXRoCisgICMgJChERVBESVIpIGluIHRoZWlyIG5hbWVzLiAgV2UgaW52b2tlIHNlZCB0d2ljZSBiZWNhdXNlIGl0IGlzIHRoZQorICAjIHNpbXBsZXN0IGFwcHJvYWNoIHRvIGNoYW5naW5nICQoREVQRElSKSB0byBpdHMgYWN0dWFsIHZhbHVlIGluIHRoZQorICAjIGV4cGFuc2lvbi4KKyAgZm9yIGZpbGUgaW4gYHNlZCAtbiAiCisgICAgcy9eJGFtX19pbmNsdWRlICRhbV9fcXVvdGVcKC4qKERFUERJUikuKlwpJGFtX19xdW90ZSInJC9cMS9wJyA8IiRtZiIgfCBcCisgICAgICAgc2VkIC1lICdzL1wkKERFUERJUikvJyIkREVQRElSIicvZycgLWUgJ3MvXCRVLyciJFUiJy9nJ2A7IGRvCisgICAgIyBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMuCisgICAgdGVzdCAtZiAiJGRpcnBhcnQvJGZpbGUiICYmIGNvbnRpbnVlCisgICAgZmRpcj1gQVNfRElSTkFNRShbIiRmaWxlIl0pYAorICAgIEFTX01LRElSX1AoWyRkaXJwYXJ0LyRmZGlyXSkKKyAgICAjIGVjaG8gImNyZWF0aW5nICRkaXJwYXJ0LyRmaWxlIgorICAgIGVjaG8gJyMgZHVtbXknID4gIiRkaXJwYXJ0LyRmaWxlIgorICBkb25lCitkb25lCitdKSMgX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTCisKKworIyBBTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGlzIG1hY3JvIHNob3VsZCBvbmx5IGJlIGludm9rZWQgb25jZSAtLSB1c2UgdmlhIEFDX1JFUVVJUkUuCisjCisjIFRoaXMgY29kZSBpcyBvbmx5IHJlcXVpcmVkIHdoZW4gYXV0b21hdGljIGRlcGVuZGVuY3kgdHJhY2tpbmcKKyMgaXMgZW5hYmxlZC4gIEZJWE1FLiAgVGhpcyBjcmVhdGVzIGVhY2ggYC5QJyBmaWxlIHRoYXQgd2Ugd2lsbAorIyBuZWVkIGluIG9yZGVyIHRvIGJvb3RzdHJhcCB0aGUgZGVwZW5kZW5jeSBoYW5kbGluZyBjb2RlLgorQUNfREVGVU4oW0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKK1tBQ19DT05GSUdfQ09NTUFORFMoW2RlcGZpbGVzXSwKKyAgICAgW3Rlc3QgeCIkQU1ERVBfVFJVRSIgIT0geCIiIHx8IF9BTV9PVVRQVVRfREVQRU5ERU5DWV9DT01NQU5EU10sCisgICAgIFtBTURFUF9UUlVFPSIkQU1ERVBfVFJVRSIgYWNfYXV4X2Rpcj0iJGFjX2F1eF9kaXIiXSkKK10pCisKKyMgRG8gYWxsIHRoZSB3b3JrIGZvciBBdXRvbWFrZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaCBzb21lIGNoZWNrcyBhcmUgb25seSBuZWVkZWQgaWYKKyMgeW91ciBwYWNrYWdlIGRvZXMgY2VydGFpbiB0aGluZ3MuICBCdXQgdGhpcyBpc24ndCByZWFsbHkgYSBiaWcgZGVhbC4KKworIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorIyAwMjExMS0xMzA3LCBVU0EuCisKKyMgc2VyaWFsIDExCisKKyMgQU1fSU5JVF9BVVRPTUFLRShQQUNLQUdFLCBWRVJTSU9OLCBbTk8tREVGSU5FXSkKKyMgQU1fSU5JVF9BVVRPTUFLRShbT1BUSU9OU10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoZSBjYWxsIHdpdGggUEFDS0FHRSBhbmQgVkVSU0lPTiBhcmd1bWVudHMgaXMgdGhlIG9sZCBzdHlsZQorIyBjYWxsIChwcmUgYXV0b2NvbmYtMi41MCksIHdoaWNoIGlzIGJlaW5nIHBoYXNlZCBvdXQuICBQQUNLQUdFCisjIGFuZCBWRVJTSU9OIHNob3VsZCBub3cgYmUgcGFzc2VkIHRvIEFDX0lOSVQgYW5kIHJlbW92ZWQgZnJvbQorIyB0aGUgY2FsbCB0byBBTV9JTklUX0FVVE9NQUtFLgorIyBXZSBzdXBwb3J0IGJvdGggY2FsbCBzdHlsZXMgZm9yIHRoZSB0cmFuc2l0aW9uLiAgQWZ0ZXIKKyMgdGhlIG5leHQgQXV0b21ha2UgcmVsZWFzZSwgQXV0b2NvbmYgY2FuIG1ha2UgdGhlIEFDX0lOSVQKKyMgYXJndW1lbnRzIG1hbmRhdG9yeSwgYW5kIHRoZW4gd2UgY2FuIGRlcGVuZCBvbiBhIG5ldyBBdXRvY29uZgorIyByZWxlYXNlIGFuZCBkcm9wIHRoZSBvbGQgY2FsbCBzdXBwb3J0LgorQUNfREVGVU4oW0FNX0lOSVRfQVVUT01BS0VdLAorW0FDX1BSRVJFUShbMi41OF0pZG5sCitkbmwgQXV0b2NvbmYgd2FudHMgdG8gZGlzYWxsb3cgQU1fIG5hbWVzLiAgV2UgZXhwbGljaXRseSBhbGxvdworZG5sIHRoZSBvbmVzIHdlIGNhcmUgYWJvdXQuCittNF9wYXR0ZXJuX2FsbG93KFteQU1fW0EtWl0rRkxBR1MkXSlkbmwKK0FDX1JFUVVJUkUoW0FNX1NFVF9DVVJSRU5UX0FVVE9NQUtFX1ZFUlNJT05dKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSlkbmwKKyMgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAoraWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJgorICAgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KKyAgQUNfTVNHX0VSUk9SKFtzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3RdKQorZmkKKworIyB0ZXN0IHdoZXRoZXIgd2UgaGF2ZSBjeWdwYXRoCitpZiB0ZXN0IC16ICIkQ1lHUEFUSF9XIjsgdGhlbgorICBpZiAoY3lncGF0aCAtLXZlcnNpb24pID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KKyAgICBDWUdQQVRIX1c9J2N5Z3BhdGggLXcnCisgIGVsc2UKKyAgICBDWUdQQVRIX1c9ZWNobworICBmaQorZmkKK0FDX1NVQlNUKFtDWUdQQVRIX1ddKQorCisjIERlZmluZSB0aGUgaWRlbnRpdHkgb2YgdGhlIHBhY2thZ2UuCitkbmwgRGlzdGluZ3Vpc2ggYmV0d2VlbiBvbGQtc3R5bGUgYW5kIG5ldy1zdHlsZSBjYWxscy4KK200X2lmdmFsKFskMl0sCitbbTRfaWZ2YWwoWyQzXSwgW19BTV9TRVRfT1BUSU9OKFtuby1kZWZpbmVdKV0pZG5sCisgQUNfU1VCU1QoW1BBQ0tBR0VdLCBbJDFdKWRubAorIEFDX1NVQlNUKFtWRVJTSU9OXSwgWyQyXSldLAorW19BTV9TRVRfT1BUSU9OUyhbJDFdKWRubAorIEFDX1NVQlNUKFtQQUNLQUdFXSwgWydBQ19QQUNLQUdFX1RBUk5BTUUnXSlkbmwKKyBBQ19TVUJTVChbVkVSU0lPTl0sIFsnQUNfUEFDS0FHRV9WRVJTSU9OJ10pXSlkbmwKKworX0FNX0lGX09QVElPTihbbm8tZGVmaW5lXSwsCitbQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQorIEFDX0RFRklORV9VTlFVT1RFRChWRVJTSU9OLCAiJFZFUlNJT04iLCBbVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZV0pXSlkbmwKKworIyBTb21lIHRvb2xzIEF1dG9tYWtlIG5lZWRzLgorQUNfUkVRVUlSRShbQU1fU0FOSVRZX0NIRUNLXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0FSR19QUk9HUkFNXSlkbmwKK0FNX01JU1NJTkdfUFJPRyhBQ0xPQ0FMLCBhY2xvY2FsLSR7YW1fX2FwaV92ZXJzaW9ufSkKK0FNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYpCitBTV9NSVNTSU5HX1BST0coQVVUT01BS0UsIGF1dG9tYWtlLSR7YW1fX2FwaV92ZXJzaW9ufSkKK0FNX01JU1NJTkdfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyKQorQU1fTUlTU0lOR19QUk9HKE1BS0VJTkZPLCBtYWtlaW5mbykKK0FNX1BST0dfSU5TVEFMTF9TSAorQU1fUFJPR19JTlNUQUxMX1NUUklQCitBQ19SRVFVSVJFKFtBTV9QUk9HX01LRElSX1BdKWRubAorIyBXZSBuZWVkIGF3ayBmb3IgdGhlICJjaGVjayIgdGFyZ2V0LiAgVGhlIHN5c3RlbSAiYXdrIiBpcyBiYWQgb24KKyMgc29tZSBwbGF0Zm9ybXMuCitBQ19SRVFVSVJFKFtBQ19QUk9HX0FXS10pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSlkbmwKK0FDX1JFUVVJUkUoW0FNX1NFVF9MRUFESU5HX0RPVF0pZG5sCitfQU1fSUZfT1BUSU9OKFt0YXItdXN0YXJdLCBbX0FNX1BST0dfVEFSKFt1c3Rhcl0pXSwKKyAgICAgICAgICAgICAgW19BTV9JRl9PUFRJT04oW3Rhci1wYXhdLCBbX0FNX1BST0dfVEFSKFtwYXhdKV0sCisJICAgICAgCQkgICAgIFtfQU1fUFJPR19UQVIoW3Y3XSldKV0pCitfQU1fSUZfT1BUSU9OKFtuby1kZXBlbmRlbmNpZXNdLCwKK1tBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DQ10sCisgICAgICAgICAgICAgICAgICBbX0FNX0RFUEVOREVOQ0lFUyhDQyldLAorICAgICAgICAgICAgICAgICAgW2RlZmluZShbQUNfUFJPR19DQ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZm4oW0FDX1BST0dfQ0NdKVtfQU1fREVQRU5ERU5DSUVTKENDKV0pXSlkbmwKK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NYWF0sCisgICAgICAgICAgICAgICAgICBbX0FNX0RFUEVOREVOQ0lFUyhDWFgpXSwKKyAgICAgICAgICAgICAgICAgIFtkZWZpbmUoW0FDX1BST0dfQ1hYXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmbihbQUNfUFJPR19DWFhdKVtfQU1fREVQRU5ERU5DSUVTKENYWCldKV0pZG5sCitdKQorXSkKKworCisjIFdoZW4gY29uZmlnLnN0YXR1cyBnZW5lcmF0ZXMgYSBoZWFkZXIsIHdlIG11c3QgdXBkYXRlIHRoZSBzdGFtcC1oIGZpbGUuCisjIFRoaXMgZmlsZSByZXNpZGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY29uZmlnIGhlYWRlcgorIyB0aGF0IGlzIGdlbmVyYXRlZC4gIFRoZSBzdGFtcCBmaWxlcyBhcmUgbnVtYmVyZWQgdG8gaGF2ZSBkaWZmZXJlbnQgbmFtZXMuCisKKyMgQXV0b2NvbmYgY2FsbHMgX0FDX0FNX0NPTkZJR19IRUFERVJfSE9PSyAod2hlbiBkZWZpbmVkKSBpbiB0aGUKKyMgbG9vcCB3aGVyZSBjb25maWcuc3RhdHVzIGNyZWF0ZXMgdGhlIGhlYWRlcnMsIHNvIHdlIGNhbiBnZW5lcmF0ZQorIyBvdXIgc3RhbXAgZmlsZXMgdGhlcmUuCitBQ19ERUZVTihbX0FDX0FNX0NPTkZJR19IRUFERVJfSE9PS10sCitbIyBDb21wdXRlICQxJ3MgaW5kZXggaW4gJGNvbmZpZ19oZWFkZXJzLgorX2FtX3N0YW1wX2NvdW50PTEKK2ZvciBfYW1faGVhZGVyIGluICRjb25maWdfaGVhZGVycyA6OyBkbworICBjYXNlICRfYW1faGVhZGVyIGluCisgICAgJDEgfCAkMToqICkKKyAgICAgIGJyZWFrIDs7CisgICAgKiApCisgICAgICBfYW1fc3RhbXBfY291bnQ9YGV4cHIgJF9hbV9zdGFtcF9jb3VudCArIDFgIDs7CisgIGVzYWMKK2RvbmUKK2VjaG8gInRpbWVzdGFtcCBmb3IgJDEiID5gQVNfRElSTkFNRShbJDFdKWAvc3RhbXAtaFtdJF9hbV9zdGFtcF9jb3VudF0pCisKKyMgQU1fUFJPR19JTlNUQUxMX1NICisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZWZpbmUgJGluc3RhbGxfc2guCisKKyMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyMgMDIxMTEtMTMwNywgVVNBLgorCitBQ19ERUZVTihbQU1fUFJPR19JTlNUQUxMX1NIXSwKK1tBQ19SRVFVSVJFKFtBTV9BVVhfRElSX0VYUEFORF0pZG5sCitpbnN0YWxsX3NoPSR7aW5zdGFsbF9zaC0iJGFtX2F1eF9kaXIvaW5zdGFsbC1zaCJ9CitBQ19TVUJTVChpbnN0YWxsX3NoKV0pCisKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorIyBDb3B5cmlnaHQgKEMpIDIwMDMgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyMgMDIxMTEtMTMwNywgVVNBLgorCisjIHNlcmlhbCAxCisKKyMgQ2hlY2sgd2hldGhlciB0aGUgdW5kZXJseWluZyBmaWxlLXN5c3RlbSBzdXBwb3J0cyBmaWxlbmFtZXMKKyMgd2l0aCBhIGxlYWRpbmcgZG90LiAgRm9yIGluc3RhbmNlIE1TLURPUyBkb2Vzbid0LgorQUNfREVGVU4oW0FNX1NFVF9MRUFESU5HX0RPVF0sCitbcm0gLXJmIC50c3QgMj4vZGV2L251bGwKK21rZGlyIC50c3QgMj4vZGV2L251bGwKK2lmIHRlc3QgLWQgLnRzdDsgdGhlbgorICBhbV9fbGVhZGluZ19kb3Q9LgorZWxzZQorICBhbV9fbGVhZGluZ19kb3Q9XworZmkKK3JtZGlyIC50c3QgMj4vZGV2L251bGwKK0FDX1NVQlNUKFthbV9fbGVhZGluZ19kb3RdKV0pCisKKyMgQWRkIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvcHRpb24gdG8gY29uZmlndXJlLgorIyBGcm9tIEppbSBNZXllcmluZworCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNAorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisjIDAyMTExLTEzMDcsIFVTQS4KKworIyBzZXJpYWwgMworCitBQ19ERUZVTihbQU1fTUFJTlRBSU5FUl9NT0RFXSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzXSkKKyAgZG5sIG1haW50YWluZXItbW9kZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0CisgIEFDX0FSR19FTkFCTEUobWFpbnRhaW5lci1tb2RlLAorWyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlICBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKKwkJCSAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcl0sCisgICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwsCisgICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vKQorICBBQ19NU0dfUkVTVUxUKFskVVNFX01BSU5UQUlORVJfTU9ERV0pCisgIEFNX0NPTkRJVElPTkFMKE1BSU5UQUlORVJfTU9ERSwgW3Rlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXNdKQorICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKKyAgQUNfU1VCU1QoTUFJTlQpZG5sCitdCispCisKK0FVX0RFRlVOKFtqbV9NQUlOVEFJTkVSX01PREVdLCBbQU1fTUFJTlRBSU5FUl9NT0RFXSkKKworIyBDaGVjayB0byBzZWUgaG93ICdtYWtlJyB0cmVhdHMgaW5jbHVkZXMuCS0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorIyAwMjExMS0xMzA3LCBVU0EuCisKKyMgc2VyaWFsIDIKKworIyBBTV9NQUtFX0lOQ0xVREUoKQorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB0byBzZWUgaG93IG1ha2UgdHJlYXRzIGluY2x1ZGVzLgorQUNfREVGVU4oW0FNX01BS0VfSU5DTFVERV0sCitbYW1fbWFrZT0ke01BS0UtbWFrZX0KK2NhdCA+IGNvbmZpbmMgPDwgJ0VORCcKK2FtX19kb2l0OgorCUBlY2hvIGRvbmUKKy5QSE9OWTogYW1fX2RvaXQKK0VORAorIyBJZiB3ZSBkb24ndCBmaW5kIGFuIGluY2x1ZGUgZGlyZWN0aXZlLCBqdXN0IGNvbW1lbnQgb3V0IHRoZSBjb2RlLgorQUNfTVNHX0NIRUNLSU5HKFtmb3Igc3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5ICRhbV9tYWtlXSkKK2FtX19pbmNsdWRlPSIjIgorYW1fX3F1b3RlPQorX2FtX3Jlc3VsdD1ub25lCisjIEZpcnN0IHRyeSBHTlUgbWFrZSBzdHlsZSBpbmNsdWRlLgorZWNobyAiaW5jbHVkZSBjb25maW5jIiA+IGNvbmZtZgorIyBXZSBncmVwIG91dCBgRW50ZXJpbmcgZGlyZWN0b3J5JyBhbmQgYExlYXZpbmcgZGlyZWN0b3J5JworIyBtZXNzYWdlcyB3aGljaCBjYW4gb2NjdXIgaWYgYHcnIGVuZHMgdXAgaW4gTUFLRUZMQUdTLgorIyBJbiBwYXJ0aWN1bGFyIHdlIGRvbid0IGxvb2sgYXQgYF5tYWtlOicgYmVjYXVzZSBHTlUgbWFrZSBtaWdodAorIyBiZSBpbnZva2VkIHVuZGVyIHNvbWUgb3RoZXIgbmFtZSAodXN1YWxseSAiZ21ha2UiKSwgaW4gd2hpY2gKKyMgY2FzZSBpdCBwcmludHMgaXRzIG5ldyBuYW1lIGluc3RlYWQgb2YgYG1ha2UnLgoraWYgdGVzdCAiYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGwgfCBncmVwIC12ICdpbmcgZGlyZWN0b3J5J2AiID0gImRvbmUiOyB0aGVuCisgICBhbV9faW5jbHVkZT1pbmNsdWRlCisgICBhbV9fcXVvdGU9CisgICBfYW1fcmVzdWx0PUdOVQorZmkKKyMgTm93IHRyeSBCU0QgbWFrZSBzdHlsZSBpbmNsdWRlLgoraWYgdGVzdCAiJGFtX19pbmNsdWRlIiA9ICIjIjsgdGhlbgorICAgZWNobyAnLmluY2x1ZGUgImNvbmZpbmMiJyA+IGNvbmZtZgorICAgaWYgdGVzdCAiYCRhbV9tYWtlIC1zIC1mIGNvbmZtZiAyPiAvZGV2L251bGxgIiA9ICJkb25lIjsgdGhlbgorICAgICAgYW1fX2luY2x1ZGU9LmluY2x1ZGUKKyAgICAgIGFtX19xdW90ZT0iXCIiCisgICAgICBfYW1fcmVzdWx0PUJTRAorICAgZmkKK2ZpCitBQ19TVUJTVChbYW1fX2luY2x1ZGVdKQorQUNfU1VCU1QoW2FtX19xdW90ZV0pCitBQ19NU0dfUkVTVUxUKFskX2FtX3Jlc3VsdF0pCitybSAtZiBjb25maW5jIGNvbmZtZgorXSkKKworIyAgLSotIEF1dG9jb25mIC0qLQorCisKKyMgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyMgMDIxMTEtMTMwNywgVVNBLgorCisjIHNlcmlhbCAzCisKKyMgQU1fTUlTU0lOR19QUk9HKE5BTUUsIFBST0dSQU0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0FNX01JU1NJTkdfUFJPR10sCitbQUNfUkVRVUlSRShbQU1fTUlTU0lOR19IQVNfUlVOXSkKKyQxPSR7JDEtIiR7YW1fbWlzc2luZ19ydW59JDIifQorQUNfU1VCU1QoJDEpXSkKKworCisjIEFNX01JU1NJTkdfSEFTX1JVTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVmaW5lIE1JU1NJTkcgaWYgbm90IGRlZmluZWQgc28gZmFyIGFuZCB0ZXN0IGlmIGl0IHN1cHBvcnRzIC0tcnVuLgorIyBJZiBpdCBkb2VzLCBzZXQgYW1fbWlzc2luZ19ydW4gdG8gdXNlIGl0LCBvdGhlcndpc2UsIHRvIG5vdGhpbmcuCitBQ19ERUZVTihbQU1fTUlTU0lOR19IQVNfUlVOXSwKK1tBQ19SRVFVSVJFKFtBTV9BVVhfRElSX0VYUEFORF0pZG5sCit0ZXN0IHgiJHtNSVNTSU5HK3NldH0iID0geHNldCB8fCBNSVNTSU5HPSJcJHtTSEVMTH0gJGFtX2F1eF9kaXIvbWlzc2luZyIKKyMgVXNlIGV2YWwgdG8gZXhwYW5kICRTSEVMTAoraWYgZXZhbCAiJE1JU1NJTkcgLS1ydW4gdHJ1ZSI7IHRoZW4KKyAgYW1fbWlzc2luZ19ydW49IiRNSVNTSU5HIC0tcnVuICIKK2Vsc2UKKyAgYW1fbWlzc2luZ19ydW49CisgIEFDX01TR19XQVJOKFtgbWlzc2luZycgc2NyaXB0IGlzIHRvbyBvbGQgb3IgbWlzc2luZ10pCitmaQorXSkKKworIyBBTV9QUk9HX01LRElSX1AKKyMgLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHdoZXRoZXIgYG1rZGlyIC1wJyBpcyBzdXBwb3J0ZWQsIGZhbGxiYWNrIHRvIG1raW5zdGFsbGRpcnMgb3RoZXJ3aXNlLgorCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisjIDAyMTExLTEzMDcsIFVTQS4KKworIyBBdXRvbWFrZSAxLjggdXNlZCBgbWtkaXIgLW0gMDc1NSAtcCAtLScgdG8gZW5zdXJlIHRoYXQgZGlyZWN0b3JpZXMKKyMgY3JlYXRlZCBieSBgbWFrZSBpbnN0YWxsJyBhcmUgYWx3YXlzIHdvcmxkIHJlYWRhYmxlLCBldmVuIGlmIHRoZQorIyBpbnN0YWxsZXIgaGFwcGVucyB0byBoYXZlIGFuIG92ZXJseSByZXN0cmljdGl2ZSB1bWFzayAoZS5nLiAwNzcpLgorIyBUaGlzIHdhcyBhIG1pc3Rha2UuICBUaGVyZSBhcmUgYXQgbGVhc3QgdHdvIHJlYXNvbnMgd2h5IHdlIG11c3Qgbm90CisjIHVzZSBgLW0gMDc1NSc6CisjICAgLSBpdCBjYXVzZXMgc3BlY2lhbCBiaXRzIGxpa2UgU0dJRCB0byBiZSBpZ25vcmVkLAorIyAgIC0gaXQgbWF5IGJlIHRvbyByZXN0cmljdGl2ZSAoc29tZSBzZXR1cHMgZXhwZWN0IDc3NSBkaXJlY3RvcmllcykuCisjCisjIERvIG5vdCB1c2UgLW0gMDc1NSBhbmQgbGV0IHBlb3BsZSBjaG9vc2Ugd2hhdGV2ZXIgdGhleSBleHBlY3QgYnkKKyMgc2V0dGluZyB1bWFzay4KKyMKKyMgV2UgY2Fubm90IGFjY2VwdCBhbnkgaW1wbGVtZW50YXRpb24gb2YgYG1rZGlyJyB0aGF0IHJlY29nbml6ZXMgYC1wJy4KKyMgU29tZSBpbXBsZW1lbnRhdGlvbnMgKHN1Y2ggYXMgU29sYXJpcyA4J3MpIGFyZSBub3QgdGhyZWFkLXNhZmU6IGlmIGEKKyMgcGFyYWxsZWwgbWFrZSB0cmllcyB0byBydW4gYG1rZGlyIC1wIGEvYicgYW5kIGBta2RpciAtcCBhL2MnCisjIGNvbmN1cnJlbnRseSwgYm90aCB2ZXJzaW9uIGNhbiBkZXRlY3QgdGhhdCBhLyBpcyBtaXNzaW5nLCBidXQgb25seQorIyBvbmUgY2FuIGNyZWF0ZSBpdCBhbmQgdGhlIG90aGVyIHdpbGwgZXJyb3Igb3V0LiAgQ29uc2VxdWVudGx5IHdlCisjIHJlc3RyaWN0IG91cnNlbHZlcyB0byBHTlUgbWFrZSAodXNpbmcgdGhlIC0tdmVyc2lvbiBvcHRpb24gZW5zdXJlcworIyB0aGlzLikKK0FDX0RFRlVOKFtBTV9QUk9HX01LRElSX1BdLAorW2lmIG1rZGlyIC1wIC0tdmVyc2lvbiAuID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICEgLWQgLi8tLXZlcnNpb247IHRoZW4KKyAgIyBXZSB1c2VkIHRvIGtlZXBpbmcgdGhlIGAuJyBhcyBmaXJzdCBhcmd1bWVudCwgaW4gb3JkZXIgdG8KKyAgIyBhbGxvdyAkKG1rZGlyX3ApIHRvIGJlIHVzZWQgd2l0aG91dCBhcmd1bWVudC4gIEFzIGluCisgICMgICAkKG1rZGlyX3ApICQoc29tZWRpcikKKyAgIyB3aGVyZSAkKHNvbWVkaXIpIGlzIGNvbmRpdGlvbmFsbHkgZGVmaW5lZC4gIEhvd2V2ZXIgdGhpcyBpcyB3cm9uZworICAjIGZvciB0d28gcmVhc29uczoKKyAgIyAgMS4gaWYgdGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkIGJ5IGEgdXNlciB3aG8gY2Fubm90IHdyaXRlIGAuJworICAjICAgICBtYWtlIGluc3RhbGwgd2lsbCBmYWlsLAorICAjICAyLiB0aGUgYWJvdmUgY29tbWVudCBzaG91bGQgbW9zdCBjZXJ0YWlubHkgcmVhZAorICAjICAgICAkKG1rZGlyX3ApICQoREVTVERJUikkKHNvbWVkaXIpCisgICMgICAgIHNvIGl0IGRvZXMgbm90IHdvcmsgd2hlbiAkKHNvbWVkaXIpIGlzIHVuZGVmaW5lZCBhbmQKKyAgIyAgICAgJChERVNURElSKSBpcyBub3QuCisgICMgIFRvIHN1cHBvcnQgdGhlIGxhdHRlciBjYXNlLCB3ZSBoYXZlIHRvIHdyaXRlCisgICMgICAgIHRlc3QgLXogIiQoc29tZWRpcikiIHx8ICQobWtkaXJfcCkgJChERVNURElSKSQoc29tZWRpciksCisgICMgIHNvIHRoZSBgLicgdHJpY2sgaXMgcG9pbnRsZXNzLgorICBta2Rpcl9wPSdta2RpciAtcCAtLScKK2Vsc2UKKyAgIyBPbiBOZXh0U3RlcCBhbmQgT3BlblN0ZXAsIHRoZSBgbWtkaXInIGNvbW1hbmQgZG9lcyBub3QKKyAgIyByZWNvZ25pemUgYW55IG9wdGlvbi4gIEl0IHdpbGwgaW50ZXJwcmV0IGFsbCBvcHRpb25zIGFzCisgICMgZGlyZWN0b3JpZXMgdG8gY3JlYXRlLCBhbmQgdGhlbiBhYm9ydCBiZWNhdXNlIGAuJyBhbHJlYWR5CisgICMgZXhpc3RzLgorICBmb3IgZCBpbiAuLy1wIC4vLS12ZXJzaW9uOworICBkbworICAgIHRlc3QgLWQgJGQgJiYgcm1kaXIgJGQKKyAgZG9uZQorICAjICQobWtpbnN0YWxsZGlycykgaXMgZGVmaW5lZCBieSBBdXRvbWFrZSBpZiBta2luc3RhbGxkaXJzIGV4aXN0cy4KKyAgaWYgdGVzdCAtZiAiJGFjX2F1eF9kaXIvbWtpbnN0YWxsZGlycyI7IHRoZW4KKyAgICBta2Rpcl9wPSckKG1raW5zdGFsbGRpcnMpJworICBlbHNlCisgICAgbWtkaXJfcD0nJChpbnN0YWxsX3NoKSAtZCcKKyAgZmkKK2ZpCitBQ19TVUJTVChbbWtkaXJfcF0pXSkKKworIyBIZWxwZXIgZnVuY3Rpb25zIGZvciBvcHRpb24gaGFuZGxpbmcuICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisjIDAyMTExLTEzMDcsIFVTQS4KKworIyBzZXJpYWwgMgorCisjIF9BTV9NQU5HTEVfT1BUSU9OKE5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0FNX01BTkdMRV9PUFRJT05dLAorW1tfQU1fT1BUSU9OX11tNF9icGF0c3Vic3QoJDEsIFtbXmEtekEtWjAtOV9dXSwgW19dKV0pCisKKyMgX0FNX1NFVF9PUFRJT04oTkFNRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNldCBvcHRpb24gTkFNRS4gIFByZXNlbnRseSB0aGF0IG9ubHkgbWVhbnMgZGVmaW5pbmcgYSBmbGFnIGZvciB0aGlzIG9wdGlvbi4KK0FDX0RFRlVOKFtfQU1fU0VUX09QVElPTl0sCitbbTRfZGVmaW5lKF9BTV9NQU5HTEVfT1BUSU9OKFskMV0pLCAxKV0pCisKKyMgX0FNX1NFVF9PUFRJT05TKE9QVElPTlMpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT1BUSU9OUyBpcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIEF1dG9tYWtlIG9wdGlvbnMuCitBQ19ERUZVTihbX0FNX1NFVF9PUFRJT05TXSwKK1tBQ19GT1JFQUNIKFtfQU1fT3B0aW9uXSwgWyQxXSwgW19BTV9TRVRfT1BUSU9OKF9BTV9PcHRpb24pXSldKQorCisjIF9BTV9JRl9PUFRJT04oT1BUSU9OLCBJRi1TRVQsIFtJRi1OT1QtU0VUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeGVjdXRlIElGLVNFVCBpZiBPUFRJT04gaXMgc2V0LCBJRi1OT1QtU0VUIG90aGVyd2lzZS4KK0FDX0RFRlVOKFtfQU1fSUZfT1BUSU9OXSwKK1ttNF9pZnNldChfQU1fTUFOR0xFX09QVElPTihbJDFdKSwgWyQyXSwgWyQzXSldKQorCisjCisjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLgorIworCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMjAwMCwgMjAwMSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisjIDAyMTExLTEzMDcsIFVTQS4KKworIyBzZXJpYWwgMworCisjIEFNX1NBTklUWV9DSEVDSworIyAtLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBTV9TQU5JVFlfQ0hFQ0tdLAorW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lXSkKKyMgSnVzdCBpbiBjYXNlCitzbGVlcCAxCitlY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0LmZpbGUKKyMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKKyMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQorIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcworIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKKyMgZGlyZWN0b3J5KS4KK2lmICgKKyAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSAyPiAvZGV2L251bGxgCisgICBpZiB0ZXN0ICIkWypdIiA9ICJYIjsgdGhlbgorICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KKyAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlYAorICAgZmkKKyAgIHJtIC1mIGNvbmZ0ZXN0LmZpbGUKKyAgIGlmIHRlc3QgIiRbKl0iICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0LmZpbGUiIFwKKyAgICAgICYmIHRlc3QgIiRbKl0iICE9ICJYIGNvbmZ0ZXN0LmZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCisKKyAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KKyAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKKyAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKKyAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KKyAgICAgIEFDX01TR19FUlJPUihbbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgorYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudF0pCisgICBmaQorCisgICB0ZXN0ICIkWzJdIiA9IGNvbmZ0ZXN0LmZpbGUKKyAgICkKK3RoZW4KKyAgICMgT2suCisgICA6CitlbHNlCisgICBBQ19NU0dfRVJST1IoW25ld2x5IGNyZWF0ZWQgZmlsZSBpcyBvbGRlciB0aGFuIGRpc3RyaWJ1dGVkIGZpbGVzIQorQ2hlY2sgeW91ciBzeXN0ZW0gY2xvY2tdKQorZmkKK0FDX01TR19SRVNVTFQoeWVzKV0pCisKKyMgQU1fUFJPR19JTlNUQUxMX1NUUklQCisKKyMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyMgMDIxMTEtMTMwNywgVVNBLgorCisjIE9uZSBpc3N1ZSB3aXRoIHZlbmRvciBgaW5zdGFsbCcgKGV2ZW4gR05VKSBpcyB0aGF0IHlvdSBjYW4ndAorIyBzcGVjaWZ5IHRoZSBwcm9ncmFtIHVzZWQgdG8gc3RyaXAgYmluYXJpZXMuICBUaGlzIGlzIGVzcGVjaWFsbHkKKyMgYW5ub3lpbmcgaW4gY3Jvc3MtY29tcGlsaW5nIGVudmlyb25tZW50cywgd2hlcmUgdGhlIGJ1aWxkJ3Mgc3RyaXAKKyMgaXMgdW5saWtlbHkgdG8gaGFuZGxlIHRoZSBob3N0J3MgYmluYXJpZXMuCisjIEZvcnR1bmF0ZWx5IGluc3RhbGwtc2ggd2lsbCBob25vciBhIFNUUklQUFJPRyB2YXJpYWJsZSwgc28gd2UKKyMgYWx3YXlzIHVzZSBpbnN0YWxsLXNoIGluIGBtYWtlIGluc3RhbGwtc3RyaXAnLCBhbmQgaW5pdGlhbGl6ZQorIyBTVFJJUFBST0cgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIFNUUklQIHZhcmlhYmxlIChzZXQgYnkgdGhlIHVzZXIpLgorQUNfREVGVU4oW0FNX1BST0dfSU5TVEFMTF9TVFJJUF0sCitbQUNfUkVRVUlSRShbQU1fUFJPR19JTlNUQUxMX1NIXSlkbmwKKyMgSW5zdGFsbGVkIGJpbmFyaWVzIGFyZSB1c3VhbGx5IHN0cmlwcGVkIHVzaW5nIGBzdHJpcCcgd2hlbiB0aGUgdXNlcgorIyBydW4gYG1ha2UgaW5zdGFsbC1zdHJpcCcuICBIb3dldmVyIGBzdHJpcCcgbWlnaHQgbm90IGJlIHRoZSByaWdodAorIyB0b29sIHRvIHVzZSBpbiBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudHMsIHRoZXJlZm9yZSBBdXRvbWFrZQorIyB3aWxsIGhvbm9yIHRoZSBgU1RSSVAnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG92ZXJydWxlIHRoaXMgcHJvZ3JhbS4KK2RubCBEb24ndCB0ZXN0IGZvciAkY3Jvc3NfY29tcGlsaW5nID0geWVzLCBiZWNhdXNlIGl0IG1pZ2h0IGJlIGBtYXliZScuCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSBubzsgdGhlbgorICBBQ19DSEVDS19UT09MKFtTVFJJUF0sIFtzdHJpcF0sIDopCitmaQorSU5TVEFMTF9TVFJJUF9QUk9HUkFNPSJcJHtTSEVMTH0gXCQoaW5zdGFsbF9zaCkgLWMgLXMiCitBQ19TVUJTVChbSU5TVEFMTF9TVFJJUF9QUk9HUkFNXSldKQorCisjIENoZWNrIGhvdyB0byBjcmVhdGUgYSB0YXJiYWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAyMDA0ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisjIDAyMTExLTEzMDcsIFVTQS4KKworIyBzZXJpYWwgMQorCisKKyMgX0FNX1BST0dfVEFSKEZPUk1BVCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgaG93IHRvIGNyZWF0ZSBhIHRhcmJhbGwgaW4gZm9ybWF0IEZPUk1BVC4KKyMgRk9STUFUIHNob3VsZCBiZSBvbmUgb2YgYHY3JywgYHVzdGFyJywgb3IgYHBheCcuCisjCisjIFN1YnN0aXR1dGUgYSB2YXJpYWJsZSAkKGFtX190YXIpIHRoYXQgaXMgYSBjb21tYW5kCisjIHdyaXRpbmcgdG8gc3Rkb3V0IGEgRk9STUFULXRhcmJhbGwgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5CisjICR0YXJkaXIuCisjICAgICB0YXJkaXI9ZGlyZWN0b3J5ICYmICQoYW1fX3RhcikgPiByZXN1bHQudGFyCisjCisjIFN1YnN0aXR1dGUgYSB2YXJpYWJsZSAkKGFtX191bnRhcikgdGhhdCBleHRyYWN0IHN1Y2gKKyMgYSB0YXJiYWxsIHJlYWQgZnJvbSBzdGRpbi4KKyMgICAgICQoYW1fX3VudGFyKSA8IHJlc3VsdC50YXIKK0FDX0RFRlVOKFtfQU1fUFJPR19UQVJdLAorWyMgQWx3YXlzIGRlZmluZSBBTVRBUiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KK0FNX01JU1NJTkdfUFJPRyhbQU1UQVJdLCBbdGFyXSkKK200X2lmKFskMV0sIFt2N10sCisgICAgIFthbV9fdGFyPScke0FNVEFSfSBjaG9mIC0gIiQkdGFyZGlyIic7IGFtX191bnRhcj0nJHtBTVRBUn0geGYgLSddLAorICAgICBbbTRfY2FzZShbJDFdLCBbdXN0YXJdLCwgW3BheF0sLAorICAgICAgICAgICAgICBbbTRfZmF0YWwoW1Vua25vd24gdGFyIGZvcm1hdF0pXSkKK0FDX01TR19DSEVDS0lORyhbaG93IHRvIGNyZWF0ZSBhICQxIHRhciBhcmNoaXZlXSkKKyMgTG9vcCBvdmVyIGFsbCBrbm93biBtZXRob2RzIHRvIGNyZWF0ZSBhIHRhciBhcmNoaXZlIHVudGlsIG9uZSB3b3Jrcy4KK19hbV90b29scz0nZ251dGFyIG00X2lmKFskMV0sIFt1c3Rhcl0sIFtwbGFpbnRhcl0pIHBheCBjcGlvIG5vbmUnCitfYW1fdG9vbHM9JHthbV9jdl9wcm9nX3Rhcl8kMS0kX2FtX3Rvb2xzfQorIyBEbyBub3QgZm9sZCB0aGUgYWJvdmUgdHdvIGxpbmUgaW50byBvbmUsIGJlY2F1c2UgVHJ1NjQgc2ggYW5kCisjIFNvbGFyaXMgc2ggd2lsbCBub3QgZ3JvayBzcGFjZXMgaW4gdGhlIHJocyBvZiBgLScuCitmb3IgX2FtX3Rvb2wgaW4gJF9hbV90b29scworZG8KKyAgY2FzZSAkX2FtX3Rvb2wgaW4KKyAgZ251dGFyKQorICAgIGZvciBfYW1fdGFyIGluIHRhciBnbnV0YXIgZ3RhcjsKKyAgICBkbworICAgICAgQU1fUlVOX0xPRyhbJF9hbV90YXIgLS12ZXJzaW9uXSkgJiYgYnJlYWsKKyAgICBkb25lCisgICAgYW1fX3Rhcj0iJF9hbV90YXIgLS1mb3JtYXQ9bTRfaWYoWyQxXSwgW3BheF0sIFtwb3NpeF0sIFskMV0pIC1jaGYgLSAiJyIkJHRhcmRpciInCisgICAgYW1fX3Rhcl89IiRfYW1fdGFyIC0tZm9ybWF0PW00X2lmKFskMV0sIFtwYXhdLCBbcG9zaXhdLCBbJDFdKSAtY2hmIC0gIiciJHRhcmRpciInCisgICAgYW1fX3VudGFyPSIkX2FtX3RhciAteGYgLSIKKyAgICA7OworICBwbGFpbnRhcikKKyAgICAjIE11c3Qgc2tpcCBHTlUgdGFyOiBpZiBpdCBkb2VzIG5vdCBzdXBwb3J0IC0tZm9ybWF0PSBpdCBkb2Vzbid0IGNyZWF0ZQorICAgICMgdXN0YXIgdGFyYmFsbCBlaXRoZXIuCisgICAgKHRhciAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMSAmJiBjb250aW51ZQorICAgIGFtX190YXI9J3RhciBjaGYgLSAiJCR0YXJkaXIiJworICAgIGFtX190YXJfPSd0YXIgY2hmIC0gIiR0YXJkaXIiJworICAgIGFtX191bnRhcj0ndGFyIHhmIC0nCisgICAgOzsKKyAgcGF4KQorICAgIGFtX190YXI9J3BheCAtTCAteCAkMSAtdyAiJCR0YXJkaXIiJworICAgIGFtX190YXJfPSdwYXggLUwgLXggJDEgLXcgIiR0YXJkaXIiJworICAgIGFtX191bnRhcj0ncGF4IC1yJworICAgIDs7CisgIGNwaW8pCisgICAgYW1fX3Rhcj0nZmluZCAiJCR0YXJkaXIiIC1wcmludCB8IGNwaW8gLW8gLUggJDEgLUwnCisgICAgYW1fX3Rhcl89J2ZpbmQgIiR0YXJkaXIiIC1wcmludCB8IGNwaW8gLW8gLUggJDEgLUwnCisgICAgYW1fX3VudGFyPSdjcGlvIC1pIC1IICQxIC1kJworICAgIDs7CisgIG5vbmUpCisgICAgYW1fX3Rhcj1mYWxzZQorICAgIGFtX190YXJfPWZhbHNlCisgICAgYW1fX3VudGFyPWZhbHNlCisgICAgOzsKKyAgZXNhYworCisgICMgSWYgdGhlIHZhbHVlIHdhcyBjYWNoZWQsIHN0b3Agbm93LiAgV2UganVzdCB3YW50ZWQgdG8gaGF2ZSBhbV9fdGFyCisgICMgYW5kIGFtX191bnRhciBzZXQuCisgIHRlc3QgLW4gIiR7YW1fY3ZfcHJvZ190YXJfJDF9IiAmJiBicmVhaworCisgICMgdGFyL3VudGFyIGEgZHVtbXkgZGlyZWN0b3J5LCBhbmQgc3RvcCBpZiB0aGUgY29tbWFuZCB3b3JrcworICBybSAtcmYgY29uZnRlc3QuZGlyCisgIG1rZGlyIGNvbmZ0ZXN0LmRpcgorICBlY2hvIEdyZXBNZSA+IGNvbmZ0ZXN0LmRpci9maWxlCisgIEFNX1JVTl9MT0coW3RhcmRpcj1jb25mdGVzdC5kaXIgJiYgZXZhbCAkYW1fX3Rhcl8gPmNvbmZ0ZXN0LnRhcl0pCisgIHJtIC1yZiBjb25mdGVzdC5kaXIKKyAgaWYgdGVzdCAtcyBjb25mdGVzdC50YXI7IHRoZW4KKyAgICBBTV9SVU5fTE9HKFskYW1fX3VudGFyIDxjb25mdGVzdC50YXJdKQorICAgIGdyZXAgR3JlcE1lIGNvbmZ0ZXN0LmRpci9maWxlID4vZGV2L251bGwgMj4mMSAmJiBicmVhaworICBmaQorZG9uZQorcm0gLXJmIGNvbmZ0ZXN0LmRpcgorCitBQ19DQUNIRV9WQUwoW2FtX2N2X3Byb2dfdGFyXyQxXSwgW2FtX2N2X3Byb2dfdGFyXyQxPSRfYW1fdG9vbF0pCitBQ19NU0dfUkVTVUxUKFskYW1fY3ZfcHJvZ190YXJfJDFdKV0pCitBQ19TVUJTVChbYW1fX3Rhcl0pCitBQ19TVUJTVChbYW1fX3VudGFyXSkKK10pICMgX0FNX1BST0dfVEFSCisKK200X2luY2x1ZGUoW2FjaW5jbHVkZS5tNF0pCmRpZmYgLS1naXQgYS9hbmRyb2lkLmxzdCBiL2FuZHJvaWQubHN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkLmxzdApkaWZmIC0tZ2l0IGEvY29tcGlsZSBiL2NvbXBpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2QyMTcwMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGUKQEAgLTAsMCArMSwxNDIgQEAKKyMhIC9iaW4vc2gKKyMgV3JhcHBlciBmb3IgY29tcGlsZXJzIHdoaWNoIGRvIG5vdCB1bmRlcnN0YW5kIGAtYyAtbycuCisKK3NjcmlwdHZlcnNpb249MjAwNC0xMC0xMi4wOAorCisjIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMywgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgV3JpdHRlbiBieSBUb20gVHJvbWV5IDx0cm9tZXlAY3lnbnVzLmNvbT4uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIFRoaXMgZmlsZSBpcyBtYWludGFpbmVkIGluIEF1dG9tYWtlLCBwbGVhc2UgcmVwb3J0CisjIGJ1Z3MgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPiBvciBzZW5kIHBhdGNoZXMgdG8KKyMgPGF1dG9tYWtlLXBhdGNoZXNAZ251Lm9yZz4uCisKK2Nhc2UgJDEgaW4KKyAgJycpCisgICAgIGVjaG8gIiQwOiBObyBjb21tYW5kLiAgVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKKyAgICAgZXhpdCAxOworICAgICA7OworICAtaCB8IC0taCopCisgICAgY2F0IDw8XEVPRgorVXNhZ2U6IGNvbXBpbGUgWy0taGVscF0gWy0tdmVyc2lvbl0gUFJPR1JBTSBbQVJHU10KKworV3JhcHBlciBmb3IgY29tcGlsZXJzIHdoaWNoIGRvIG5vdCB1bmRlcnN0YW5kIGAtYyAtbycuCitSZW1vdmUgYC1vIGRlc3QubycgZnJvbSBBUkdTLCBydW4gUFJPR1JBTSB3aXRoIHRoZSByZW1haW5pbmcKK2FyZ3VtZW50cywgYW5kIHJlbmFtZSB0aGUgb3V0cHV0IGFzIGV4cGVjdGVkLgorCitJZiB5b3UgYXJlIHRyeWluZyB0byBidWlsZCBhIHdob2xlIHBhY2thZ2UgdGhpcyBpcyBub3QgdGhlCityaWdodCBzY3JpcHQgdG8gcnVuOiBwbGVhc2Ugc3RhcnQgYnkgcmVhZGluZyB0aGUgZmlsZSBgSU5TVEFMTCcuCisKK1JlcG9ydCBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uCitFT0YKKyAgICBleGl0IDAKKyAgICA7OworICAtdiB8IC0tdiopCisgICAgZWNobyAiY29tcGlsZSAkc2NyaXB0dmVyc2lvbiIKKyAgICBleGl0IDAKKyAgICA7OworZXNhYworCitvZmlsZT0KK2NmaWxlPQorZWF0PQorCitmb3IgYXJnCitkbworICBpZiB0ZXN0IC1uICIkZWF0IjsgdGhlbgorICAgIGVhdD0KKyAgZWxzZQorICAgIGNhc2UgJDEgaW4KKyAgICAgIC1vKQorCSMgY29uZmlndXJlIG1pZ2h0IGNob29zZSB0byBydW4gY29tcGlsZSBhcyBgY29tcGlsZSBjYyAtbyBmb28gZm9vLmMnLgorCSMgU28gd2Ugc3RyaXAgYC1vIGFyZycgb25seSBpZiBhcmcgaXMgYW4gb2JqZWN0LgorCWVhdD0xCisJY2FzZSAkMiBpbgorCSAgKi5vIHwgKi5vYmopCisJICAgIG9maWxlPSQyCisJICAgIDs7CisJICAqKQorCSAgICBzZXQgeCAiJEAiIC1vICIkMiIKKwkgICAgc2hpZnQKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgICouYykKKwljZmlsZT0kMQorCXNldCB4ICIkQCIgIiQxIgorCXNoaWZ0CisJOzsKKyAgICAgICopCisJc2V0IHggIiRAIiAiJDEiCisJc2hpZnQKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgc2hpZnQKK2RvbmUKKworaWYgdGVzdCAteiAiJG9maWxlIiB8fCB0ZXN0IC16ICIkY2ZpbGUiOyB0aGVuCisgICMgSWYgbm8gYC1vJyBvcHRpb24gd2FzIHNlZW4gdGhlbiB3ZSBtaWdodCBoYXZlIGJlZW4gaW52b2tlZCBmcm9tIGEKKyAgIyBwYXR0ZXJuIHJ1bGUgd2hlcmUgd2UgZG9uJ3QgbmVlZCBvbmUuICBUaGF0IGlzIG9rIC0tIHRoaXMgaXMgYQorICAjIG5vcm1hbCBjb21waWxhdGlvbiB0aGF0IHRoZSBsb3NpbmcgY29tcGlsZXIgY2FuIGhhbmRsZS4gIElmIG5vCisgICMgYC5jJyBmaWxlIHdhcyBzZWVuIHRoZW4gd2UgYXJlIHByb2JhYmx5IGxpbmtpbmcuICBUaGF0IGlzIGFsc28KKyAgIyBvay4KKyAgZXhlYyAiJEAiCitmaQorCisjIE5hbWUgb2YgZmlsZSB3ZSBleHBlY3QgY29tcGlsZXIgdG8gY3JlYXRlLgorY29maWxlPWBlY2hvICIkY2ZpbGUiIHwgc2VkIC1lICdzfF4uKi98fCcgLWUgJ3MvXC5jJC8uby8nYAorCisjIENyZWF0ZSB0aGUgbG9jayBkaXJlY3RvcnkuCisjIE5vdGU6IHVzZSBgWy8uLV0nIGhlcmUgdG8gZW5zdXJlIHRoYXQgd2UgZG9uJ3QgdXNlIHRoZSBzYW1lIG5hbWUKKyMgdGhhdCB3ZSBhcmUgdXNpbmcgZm9yIHRoZSAubyBmaWxlLiAgQWxzbywgYmFzZSB0aGUgbmFtZSBvbiB0aGUgZXhwZWN0ZWQKKyMgb2JqZWN0IGZpbGUgbmFtZSwgc2luY2UgdGhhdCBpcyB3aGF0IG1hdHRlcnMgd2l0aCBhIHBhcmFsbGVsIGJ1aWxkLgorbG9ja2Rpcj1gZWNobyAiJGNvZmlsZSIgfCBzZWQgLWUgJ3N8Wy8uLV18X3xnJ2AuZAord2hpbGUgdHJ1ZTsgZG8KKyAgaWYgbWtkaXIgIiRsb2NrZGlyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBicmVhaworICBmaQorICBzbGVlcCAxCitkb25lCisjIEZJWE1FOiByYWNlIGNvbmRpdGlvbiBoZXJlIGlmIHVzZXIga2lsbHMgYmV0d2VlbiBta2RpciBhbmQgdHJhcC4KK3RyYXAgInJtZGlyICckbG9ja2Rpcic7IGV4aXQgMSIgMSAyIDE1CisKKyMgUnVuIHRoZSBjb21waWxlLgorIiRAIgorcmV0PSQ/CisKK2lmIHRlc3QgLWYgIiRjb2ZpbGUiOyB0aGVuCisgIG12ICIkY29maWxlIiAiJG9maWxlIgorZWxpZiB0ZXN0IC1mICIke2NvZmlsZX1iaiI7IHRoZW4KKyAgbXYgIiR7Y29maWxlfWJqIiAiJG9maWxlIgorZmkKKworcm1kaXIgIiRsb2NrZGlyIgorZXhpdCAkcmV0CisKKyMgTG9jYWwgVmFyaWFibGVzOgorIyBtb2RlOiBzaGVsbC1zY3JpcHQKKyMgc2gtaW5kZW50YXRpb246IDIKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgorIyB0aW1lLXN0YW1wLWVuZDogIiQiCisjIEVuZDoKZGlmZiAtLWdpdCBhL2NvbmZpZy5ndWVzcyBiL2NvbmZpZy5ndWVzcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MjI5NDcxCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnLmd1ZXNzCkBAIC0wLDAgKzEsMTQ1MyBAQAorIyEgL2Jpbi9zaAorIyBBdHRlbXB0IHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lLgorIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKKyMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCit0aW1lc3RhbXA9JzIwMDQtMTEtMTInCisKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lciA8cGVyQGJvdGhuZXIuY29tPi4KKyMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uICBTdWJtaXQgYSBjb250ZXh0CisjIGRpZmYgYW5kIGEgcHJvcGVybHkgZm9ybWF0dGVkIENoYW5nZUxvZyBlbnRyeS4KKyMKKyMgVGhpcyBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUgc2ltaWxhciB0bworIyBjb25maWcuc3ViLiAgSWYgaXQgc3VjY2VlZHMsIGl0IHByaW50cyB0aGUgc3lzdGVtIG5hbWUgb24gc3Rkb3V0LCBhbmQKKyMgZXhpdHMgd2l0aCAwLiAgT3RoZXJ3aXNlLCBpdCBleGl0cyB3aXRoIDEuCisjCisjIFRoZSBwbGFuIGlzIHRoYXQgdGhpcyBjYW4gYmUgY2FsbGVkIGJ5IGNvbmZpZ3VyZSBzY3JpcHRzIGlmIHlvdQorIyBkb24ndCBzcGVjaWZ5IGFuIGV4cGxpY2l0IGJ1aWxkIHN5c3RlbSB0eXBlLgorCittZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXQorCitPdXRwdXQgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgc3lzdGVtIFxgJG1lJyBpcyBydW4gb24uCisKK09wZXJhdGlvbiBtb2RlczoKKyAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKKworUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKKwordmVyc2lvbj0iXAorR05VIGNvbmZpZy5ndWVzcyAoJHRpbWVzdGFtcCkKKworT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLgorQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0CitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KK3dhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKKworaGVscD0iCitUcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisKKyMgUGFyc2UgY29tbWFuZCBsaW5lCit3aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCisgICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDAgOzsKKyAgICAtLXZlcnNpb24gfCAtdiApCisgICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCAwIDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDAgOzsKKyAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKKyAgICAgICBzaGlmdDsgYnJlYWsgOzsKKyAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCisgICAgICAgYnJlYWsgOzsKKyAgICAtKiApCisgICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIiA+JjIKKyAgICAgICBleGl0IDEgOzsKKyAgICAqICkKKyAgICAgICBicmVhayA7OworICBlc2FjCitkb25lCisKK2lmIHRlc3QgJCMgIT0gMDsgdGhlbgorICBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKKyAgZXhpdCAxCitmaQorCit0cmFwICdleGl0IDEnIDEgMiAxNQorCisjIENDX0ZPUl9CVUlMRCAtLSBjb21waWxlciB1c2VkIGJ5IHRoaXMgc2NyaXB0LiBOb3RlIHRoYXQgdGhlIHVzZSBvZiBhCisjIGNvbXBpbGVyIHRvIGFpZCBpbiBzeXN0ZW0gZGV0ZWN0aW9uIGlzIGRpc2NvdXJhZ2VkIGFzIGl0IHJlcXVpcmVzCisjIHRlbXBvcmFyeSBmaWxlcyB0byBiZSBjcmVhdGVkIGFuZCwgYXMgeW91IGNhbiBzZWUgYmVsb3csIGl0IGlzIGEKKyMgaGVhZGFjaGUgdG8gZGVhbCB3aXRoIGluIGEgcG9ydGFibGUgZmFzaGlvbi4KKworIyBIaXN0b3JpY2FsbHksIGBDQ19GT1JfQlVJTEQnIHVzZWQgdG8gYmUgbmFtZWQgYEhPU1RfQ0MnLiBXZSBzdGlsbAorIyB1c2UgYEhPU1RfQ0MnIGlmIGRlZmluZWQsIGJ1dCBpdCBpcyBkZXByZWNhdGVkLgorCisjIFBvcnRhYmxlIHRtcCBkaXJlY3RvcnkgY3JlYXRpb24gaW5zcGlyZWQgYnkgdGhlIEF1dG9jb25mIHRlYW0uCisKK3NldF9jY19mb3JfYnVpbGQ9JwordHJhcCAiZXhpdGNvZGU9XCQ/OyAocm0gLWYgXCR0bXBmaWxlcyAyPi9kZXYvbnVsbDsgcm1kaXIgXCR0bXAgMj4vZGV2L251bGwpICYmIGV4aXQgXCRleGl0Y29kZSIgMCA7Cit0cmFwICJybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbDsgZXhpdCAxIiAxIDIgMTMgMTUgOworOiAke1RNUERJUj0vdG1wfSA7CisgeyB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kIC1xICIkVE1QRElSL2NnWFhYWFhYIikgMj4vZGV2L251bGxgICYmIHRlc3QgLW4gIiR0bXAiICYmIHRlc3QgLWQgIiR0bXAiIDsgfSB8fAorIHsgdGVzdCAtbiAiJFJBTkRPTSIgJiYgdG1wPSRUTVBESVIvY2ckJC0kUkFORE9NICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgOyB9IHx8CisgeyB0bXA9JFRNUERJUi9jZy0kJCAmJiAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApICYmIGVjaG8gIldhcm5pbmc6IGNyZWF0aW5nIGluc2VjdXJlIHRlbXAgZGlyZWN0b3J5IiA+JjIgOyB9IHx8CisgeyBlY2hvICIkbWU6IGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluICRUTVBESVIiID4mMiA7IGV4aXQgMSA7IH0gOworZHVtbXk9JHRtcC9kdW1teSA7Cit0bXBmaWxlcz0iJGR1bW15LmMgJGR1bW15Lm8gJGR1bW15LnJlbCAkZHVtbXkiIDsKK2Nhc2UgJENDX0ZPUl9CVUlMRCwkSE9TVF9DQywkQ0MgaW4KKyAsLCkgICAgZWNobyAiaW50IHg7IiA+ICRkdW1teS5jIDsKKwlmb3IgYyBpbiBjYyBnY2MgYzg5IGM5OSA7IGRvCisJICBpZiAoJGMgLWMgLW8gJGR1bW15Lm8gJGR1bW15LmMpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwkgICAgIENDX0ZPUl9CVUlMRD0iJGMiOyBicmVhayA7CisJICBmaSA7CisJZG9uZSA7CisJaWYgdGVzdCB4IiRDQ19GT1JfQlVJTEQiID0geCA7IHRoZW4KKwkgIENDX0ZPUl9CVUlMRD1ub19jb21waWxlcl9mb3VuZCA7CisJZmkKKwk7OworICwsKikgICBDQ19GT1JfQlVJTEQ9JENDIDs7CisgLCosKikgIENDX0ZPUl9CVUlMRD0kSE9TVF9DQyA7OworZXNhYyA7JworCisjIFRoaXMgaXMgbmVlZGVkIHRvIGZpbmQgdW5hbWUgb24gYSBQeXJhbWlkIE9TeCB3aGVuIHJ1biBpbiB0aGUgQlNEIHVuaXZlcnNlLgorIyAoZ2hhemlAbm9jLnJ1dGdlcnMuZWR1IDE5OTQtMDgtMjQpCitpZiAodGVzdCAtZiAvLmF0dGJpbi91bmFtZSkgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCVBBVEg9JFBBVEg6Ly5hdHRiaW4gOyBleHBvcnQgUEFUSAorZmkKKworVU5BTUVfTUFDSElORT1gKHVuYW1lIC1tKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfTUFDSElORT11bmtub3duCitVTkFNRV9SRUxFQVNFPWAodW5hbWUgLXIpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9SRUxFQVNFPXVua25vd24KK1VOQU1FX1NZU1RFTT1gKHVuYW1lIC1zKSAyPi9kZXYvbnVsbGAgIHx8IFVOQU1FX1NZU1RFTT11bmtub3duCitVTkFNRV9WRVJTSU9OPWAodW5hbWUgLXYpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9WRVJTSU9OPXVua25vd24KKworIyBOb3RlOiBvcmRlciBpcyBzaWduaWZpY2FudCAtIHRoZSBjYXNlIGJyYW5jaGVzIGFyZSBub3QgZXhjbHVzaXZlLgorCitjYXNlICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIGluCisgICAgKjpOZXRCU0Q6KjoqKQorCSMgTmV0QlNEIChuYnNkKSB0YXJnZXRzIHNob3VsZCAod2hlcmUgYXBwbGljYWJsZSkgbWF0Y2ggb25lIG9yCisJIyBtb3JlIG9mIHRoZSB0dXBwbGVzOiAqLSotbmV0YnNkZWxmKiwgKi0qLW5ldGJzZGFvdXQqLAorCSMgKi0qLW5ldGJzZGVjb2ZmKiBhbmQgKi0qLW5ldGJzZCouICBGb3IgdGFyZ2V0cyB0aGF0IHJlY2VudGx5CisJIyBzd2l0Y2hlZCB0byBFTEYsICotKi1uZXRic2QqIHdvdWxkIHNlbGVjdCB0aGUgb2xkCisJIyBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGlzIHByb3ZpZGVzIGJvdGggZm9yd2FyZAorCSMgY29tcGF0aWJpbGl0eSBhbmQgYSBjb25zaXN0ZW50IG1lY2hhbmlzbSBmb3Igc2VsZWN0aW5nIHRoZQorCSMgb2JqZWN0IGZpbGUgZm9ybWF0LgorCSMKKwkjIE5vdGU6IE5ldEJTRCBkb2Vzbid0IHBhcnRpY3VsYXJseSBjYXJlIGFib3V0IHRoZSB2ZW5kb3IKKwkjIHBvcnRpb24gb2YgdGhlIG5hbWUuICBXZSBhbHdheXMgc2V0IGl0IHRvICJ1bmtub3duIi4KKwlzeXNjdGw9InN5c2N0bCAtbiBody5tYWNoaW5lX2FyY2giCisJVU5BTUVfTUFDSElORV9BUkNIPWAoL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBcCisJICAgIC91c3Ivc2Jpbi8kc3lzY3RsIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bilgCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgorCSAgICBhcm1lYikgbWFjaGluZT1hcm1lYi11bmtub3duIDs7CisJICAgIGFybSopIG1hY2hpbmU9YXJtLXVua25vd24gOzsKKwkgICAgc2gzZWwpIG1hY2hpbmU9c2hsLXVua25vd24gOzsKKwkgICAgc2gzZWIpIG1hY2hpbmU9c2gtdW5rbm93biA7OworCSAgICAqKSBtYWNoaW5lPSR7VU5BTUVfTUFDSElORV9BUkNIfS11bmtub3duIDs7CisJZXNhYworCSMgVGhlIE9wZXJhdGluZyBTeXN0ZW0gaW5jbHVkaW5nIG9iamVjdCBmb3JtYXQsIGlmIGl0IGhhcyBzd2l0Y2hlZAorCSMgdG8gRUxGIHJlY2VudGx5LCBvciB3aWxsIGluIHRoZSBmdXR1cmUuCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgorCSAgICBhcm0qfGkzODZ8bTY4a3xuczMya3xzaDMqfHNwYXJjfHZheCkKKwkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQlpZiBlY2hvIF9fRUxGX18gfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAorCQkJfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbAorCQl0aGVuCisJCSAgICAjIE9uY2UgYWxsIHV0aWxpdGllcyBjYW4gYmUgRUNPRkYgKG5ldGJzZGVjb2ZmKSBvciBhLm91dCAobmV0YnNkYW91dCkuCisJCSAgICAjIFJldHVybiBuZXRic2QgZm9yIGVpdGhlci4gIEZJWD8KKwkJICAgIG9zPW5ldGJzZAorCQllbHNlCisJCSAgICBvcz1uZXRic2RlbGYKKwkJZmkKKwkJOzsKKwkgICAgKikKKwkgICAgICAgIG9zPW5ldGJzZAorCQk7OworCWVzYWMKKwkjIFRoZSBPUyByZWxlYXNlCisJIyBEZWJpYW4gR05VL05ldEJTRCBtYWNoaW5lcyBoYXZlIGEgZGlmZmVyZW50IHVzZXJsYW5kLCBhbmQKKwkjIHRodXMsIG5lZWQgYSBkaXN0aW5jdCB0cmlwbGV0LiBIb3dldmVyLCB0aGV5IGRvIG5vdCBuZWVkCisJIyBrZXJuZWwgdmVyc2lvbiBpbmZvcm1hdGlvbiwgc28gaXQgY2FuIGJlIHJlcGxhY2VkIHdpdGggYQorCSMgc3VpdGFibGUgdGFnLCBpbiB0aGUgc3R5bGUgb2YgbGludXgtZ251LgorCWNhc2UgIiR7VU5BTUVfVkVSU0lPTn0iIGluCisJICAgIERlYmlhbiopCisJCXJlbGVhc2U9Jy1nbnUnCisJCTs7CisJICAgICopCisJCXJlbGVhc2U9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCisJCTs7CisJZXNhYworCSMgU2luY2UgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNOgorCSMgY29udGFpbnMgcmVkdW5kYW50IGluZm9ybWF0aW9uLCB0aGUgc2hvcnRlciBmb3JtOgorCSMgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0gaXMgdXNlZC4KKwllY2hvICIke21hY2hpbmV9LSR7b3N9JHtyZWxlYXNlfSIKKwlleGl0IDAgOzsKKyAgICBhbWQ2NDpPcGVuQlNEOio6KikKKwllY2hvIHg4Nl82NC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgYW1pZ2E6T3BlbkJTRDoqOiopCisJZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBjYXRzOk9wZW5CU0Q6KjoqKQorCWVjaG8gYXJtLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBocDMwMDpPcGVuQlNEOio6KikKKwllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGx1bmE4OGs6T3BlbkJTRDoqOiopCisgICAgCWVjaG8gbTg4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbWFjNjhrOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbWFjcHBjOk9wZW5CU0Q6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbXZtZTY4azpPcGVuQlNEOio6KikKKwllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG12bWU4OGs6T3BlbkJTRDoqOiopCisJZWNobyBtODhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtdm1lcHBjOk9wZW5CU0Q6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgc2dpOk9wZW5CU0Q6KjoqKQorCWVjaG8gbWlwczY0LXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBzdW4zOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpPcGVuQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICo6ZWtrb0JTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZWtrb2JzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtYWNwcGM6TWlyQlNEOio6KikKKwllY2hvIHBvd2VycHBjLXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICo6TWlyQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1taXJic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgYWxwaGE6T1NGMToqOiopCisJY2FzZSAkVU5BTUVfUkVMRUFTRSBpbgorCSo0LjApCisJCVVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQzfSdgCisJCTs7CisJKjUuKikKKwkgICAgICAgIFVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQ0fSdgCisJCTs7CisJZXNhYworCSMgQWNjb3JkaW5nIHRvIENvbXBhcSwgL3Vzci9zYmluL3BzcmluZm8gaGFzIGJlZW4gYXZhaWxhYmxlIG9uCisJIyBPU0YvMSBhbmQgVHJ1NjQgc3lzdGVtcyBwcm9kdWNlZCBzaW5jZSAxOTk1LiAgSSBob3BlIHRoYXQKKwkjIGNvdmVycyBtb3N0IHN5c3RlbXMgcnVubmluZyB0b2RheS4gIFRoaXMgY29kZSBwaXBlcyB0aGUgQ1BVCisJIyB0eXBlcyB0aHJvdWdoIGhlYWQgLW4gMSwgc28gd2Ugb25seSBkZXRlY3QgdGhlIHR5cGUgb2YgQ1BVIDAuCisJQUxQSEFfQ1BVX1RZUEU9YC91c3Ivc2Jpbi9wc3JpbmZvIC12IHwgc2VkIC1uIC1lICdzL14gIFRoZSBhbHBoYSBcKC4qXCkgcHJvY2Vzc29yLiokL1wxL3AnIHwgaGVhZCAtbiAxYAorCWNhc2UgIiRBTFBIQV9DUFVfVFlQRSIgaW4KKwkgICAgIkVWNCAoMjEwNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJFVjQuNSAoMjEwNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJMQ0E0ICgyMTA2Ni8yMTA2OCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKKwkgICAgIkVWNSAoMjExNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiIDs7CisJICAgICJFVjUuNiAoMjExNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1NiIgOzsKKwkgICAgIkVWNS42ICgyMTE2NFBDKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiIDs7CisJICAgICJFVjUuNyAoMjExNjRQQykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU3IiA7OworCSAgICAiRVY2ICgyMTI2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NiIgOzsKKwkgICAgIkVWNi43ICgyMTI2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY3IiA7OworCSAgICAiRVY2LjhDQiAoMjEyNjRDKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi44QUwgKDIxMjY0QikiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOENYICgyMTI2NEQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjlBICgyMTI2NC9FVjY5QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjkiIDs7CisJICAgICJFVjcgKDIxMzY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY3IiA7OworCSAgICAiRVY3LjkgKDIxMzY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NzkiIDs7CisJZXNhYworCSMgQSBQbi5uIHZlcnNpb24gaXMgYSBwYXRjaGVkIHZlcnNpb24uCisJIyBBIFZuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIHZlcnNpb24uCisJIyBBIFRuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIGZpZWxkIHRlc3QgdmVyc2lvbi4KKwkjIEEgWG4ubiB2ZXJzaW9uIGlzIGFuIHVucmVsZWFzZWQgZXhwZXJpbWVudGFsIGJhc2VsZXZlbC4KKwkjIDEuMiB1c2VzICIxLjIiIGZvciB1bmFtZSAtci4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLW9zZmBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXltQVlRYXS8vJyB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKwlleGl0IDAgOzsKKyAgICBBbHBoYVwgKjpXaW5kb3dzX05UKjoqKQorCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KKwkjIFNob3VsZCB3ZSBjaGFuZ2UgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQKKwkjIG9mIHRoZSBzcGVjaWZpYyBBbHBoYSBtb2RlbD8KKwllY2hvIGFscGhhLXBjLWludGVyaXgKKwlleGl0IDAgOzsKKyAgICAyMTA2NDpXaW5kb3dzX05UOjUwOjMpCisJZWNobyBhbHBoYS1kZWMtd2lubnQzLjUKKwlleGl0IDAgOzsKKyAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKKwllY2hvIG02OGstdW5rbm93bi1zeXN2NAorCWV4aXQgMDs7CisgICAgKjpbQWFdbWlnYVtPb11bU3NdOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hbWlnYW9zCisJZXhpdCAwIDs7CisgICAgKjpbTW1db3JwaFtPb11bU3NdOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1tb3JwaG9zCisJZXhpdCAwIDs7CisgICAgKjpPUy8zOTA6KjoqKQorCWVjaG8gaTM3MC1pYm0tb3BlbmVkaXRpb24KKwlleGl0IDAgOzsKKyAgICAqOnovVk06KjoqKQorCWVjaG8gczM5MC1pYm0tenZtb2UKKwlleGl0IDAgOzsKKyAgICAqOk9TNDAwOio6KikKKyAgICAgICAgZWNobyBwb3dlcnBjLWlibS1vczQwMAorCWV4aXQgMCA7OworICAgIGFybTpSSVNDKjoxLlswMTJdKjoqfGFybTpyaXNjaXg6MS5bMDEyXSo6KikKKwllY2hvIGFybS1hY29ybi1yaXNjaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwOzsKKyAgICBTUjI/MDE6SEktVVgvTVBQOio6KiB8IFNSODAwMDpISS1VWC9NUFA6KjoqKQorCWVjaG8gaHBwYTEuMS1oaXRhY2hpLWhpdXhtcHAKKwlleGl0IDA7OworICAgIFB5cmFtaWQqOk9TeCo6KjoqIHwgTUlTKjpPU3gqOio6KiB8IE1JUyo6U01QX0RDLU9TeCo6KjoqKQorCSMgYWtlZUB3cGRpczAzLndwYWZiLmFmLm1pbCAoRWFybGUgRi4gQWtlKSBjb250cmlidXRlZCBNSVMgYW5kIE5JTEUuCisJaWYgdGVzdCAiYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAiID0gYXR0IDsgdGhlbgorCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zeXN2MworCWVsc2UKKwkJZWNobyBweXJhbWlkLXB5cmFtaWQtYnNkCisJZmkKKwlleGl0IDAgOzsKKyAgICBOSUxFKjoqOio6ZGNvc3gpCisJZWNobyBweXJhbWlkLXB5cmFtaWQtc3ZyNAorCWV4aXQgMCA7OworICAgIERSUz82MDAwOnVuaXg6NC4wOjYqKQorCWVjaG8gc3BhcmMtaWNsLW54NgorCWV4aXQgMCA7OworICAgIERSUz82MDAwOlVOSVhfU1Y6NC4yKjo3KiB8IERSUz82MDAwOmlzaXM6NC4yKjo3KikKKwljYXNlIGAvdXNyL2Jpbi91bmFtZSAtcGAgaW4KKwkgICAgc3BhcmMpIGVjaG8gc3BhcmMtaWNsLW54NyAmJiBleGl0IDAgOzsKKwllc2FjIDs7CisgICAgc3VuNEg6U3VuT1M6NS4qOiopCisJZWNobyBzcGFyYy1oYWwtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDAgOzsKKyAgICBzdW40KjpTdW5PUzo1Lio6KiB8IHRhZHBvbGUqOlN1bk9TOjUuKjoqKQorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCAwIDs7CisgICAgaTg2cGM6U3VuT1M6NS4qOiopCisJZWNobyBpMzg2LXBjLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCAwIDs7CisgICAgc3VuNCo6U3VuT1M6Nio6KikKKwkjIEFjY29yZGluZyB0byBjb25maWcuc3ViLCB0aGlzIGlzIHRoZSBwcm9wZXIgd2F5IHRvIGNhbm9uaWNhbGl6ZQorCSMgU3VuT1M2LiAgSGFyZCB0byBndWVzcyBleGFjdGx5IHdoYXQgU3VuT1M2IHdpbGwgYmUgbGlrZSwgYnV0CisJIyBpdCdzIGxpa2VseSB0byBiZSBtb3JlIGxpa2UgU29sYXJpcyB0aGFuIFN1bk9TNC4KKwllY2hvIHNwYXJjLXN1bi1zb2xhcmlzM2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgMCA7OworICAgIHN1bjQqOlN1bk9TOio6KikKKwljYXNlICJgL3Vzci9iaW4vYXJjaCAta2AiIGluCisJICAgIFNlcmllcyp8UzQqKQorCQlVTkFNRV9SRUxFQVNFPWB1bmFtZSAtdmAKKwkJOzsKKwllc2FjCisJIyBKYXBhbmVzZSBMYW5ndWFnZSB2ZXJzaW9ucyBoYXZlIGEgdmVyc2lvbiBudW1iZXIgbGlrZSBgNC4xLjMtSkwnLgorCWVjaG8gc3BhcmMtc3VuLXN1bm9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fLydgCisJZXhpdCAwIDs7CisgICAgc3VuMyo6U3VuT1M6KjoqKQorCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgc3VuKjoqOjQuMkJTRDoqKQorCVVOQU1FX1JFTEVBU0U9YChzZWQgMXEgL2V0Yy9tb3RkIHwgYXdrICd7cHJpbnQgc3Vic3RyKCQ1LDEsMyl9JykgMj4vZGV2L251bGxgCisJdGVzdCAieCR7VU5BTUVfUkVMRUFTRX0iID0gIngiICYmIFVOQU1FX1JFTEVBU0U9MworCWNhc2UgImAvYmluL2FyY2hgIiBpbgorCSAgICBzdW4zKQorCQllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCSAgICBzdW40KQorCQllY2hvIHNwYXJjLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwkJOzsKKwllc2FjCisJZXhpdCAwIDs7CisgICAgYXVzaHA6U3VuT1M6KjoqKQorCWVjaG8gc3BhcmMtYXVzcGV4LXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICMgVGhlIHNpdHVhdGlvbiBmb3IgTWlOVCBpcyBhIGxpdHRsZSBjb25mdXNpbmcuICBUaGUgbWFjaGluZSBuYW1lCisgICAgIyBjYW4gYmUgdmlydHVhbGx5IGV2ZXJ5dGhpbmcgKGV2ZXJ5dGhpbmcgd2hpY2ggaXMgbm90CisgICAgIyAiYXRhcmlzdCIgb3IgImF0YXJpc3RlIiBhdCBsZWFzdCBzaG91bGQgaGF2ZSBhIHByb2Nlc3NvcgorICAgICMgPiBtNjgwMDApLiAgVGhlIHN5c3RlbSBuYW1lIHJhbmdlcyBmcm9tICJNaU5UIiBvdmVyICJGcmVlTWlOVCIKKyAgICAjIHRvIHRoZSBsb3dlcmNhc2UgdmVyc2lvbiAibWludCIgKG9yICJmcmVlbWludCIpLiAgRmluYWxseQorICAgICMgdGhlIHN5c3RlbSBuYW1lICJUT1MiIGRlbm90ZXMgYSBzeXN0ZW0gd2hpY2ggaXMgYWN0dWFsbHkgbm90CisgICAgIyBNaU5ULiAgQnV0IE1pTlQgaXMgZG93bndhcmQgY29tcGF0aWJsZSB0byBUT1MsIHNvIHRoaXMgc2hvdWxkCisgICAgIyBiZSBubyBwcm9ibGVtLgorICAgIGF0YXJpc3RbZV06Kk1pTlQ6KjoqIHwgYXRhcmlzdFtlXToqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBhdGFyaSo6Kk1pTlQ6KjoqIHwgYXRhcmkqOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCisJZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgMCA7OworICAgICpmYWxjb24qOipNaU5UOio6KiB8ICpmYWxjb24qOiptaW50Oio6KiB8ICpmYWxjb24qOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtaWxhbio6Kk1pTlQ6KjoqIHwgbWlsYW4qOiptaW50Oio6KiB8ICptaWxhbio6KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay1taWxhbi1taW50JHtVTkFNRV9SRUxFQVNFfQorICAgICAgICBleGl0IDAgOzsKKyAgICBoYWRlcyo6Kk1pTlQ6KjoqIHwgaGFkZXMqOiptaW50Oio6KiB8ICpoYWRlcyo6KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay1oYWRlcy1taW50JHtVTkFNRV9SRUxFQVNFfQorICAgICAgICBleGl0IDAgOzsKKyAgICAqOipNaU5UOio6KiB8ICo6Km1pbnQ6KjoqIHwgKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLXVua25vd24tbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCAwIDs7CisgICAgbTY4azptYWNodGVuOio6KikKKwllY2hvIG02OGstYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBwb3dlcnBjOm1hY2h0ZW46KjoqKQorCWVjaG8gcG93ZXJwYy1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFJJU0MqOk1hY2g6KjoqKQorCWVjaG8gbWlwcy1kZWMtbWFjaF9ic2Q0LjMKKwlleGl0IDAgOzsKKyAgICBSSVNDKjpVTFRSSVg6KjoqKQorCWVjaG8gbWlwcy1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFZBWCo6VUxUUklYKjoqOiopCisJZWNobyB2YXgtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAyMDIwOkNMSVg6KjoqIHwgMjQzMDpDTElYOio6KikKKwllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworI2lmZGVmIF9fY3BsdXNwbHVzCisjaW5jbHVkZSA8c3RkaW8uaD4gIC8qIGZvciBwcmludGYoKSBwcm90b3R5cGUgKi8KKwlpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworI2Vsc2UKKwlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKmFyZ3ZbXTsgeworI2VuZGlmCisJI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQorCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfU1ZSNCkKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N2cjRcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9CU0Q0MykgfHwgZGVmaW5lZChTWVNUWVBFX0JTRCkKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc2JzZFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNlbmRpZgorCSAgZXhpdCAoLTEpOworCX0KK0VPRgorCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIFwKKwkgICYmICRkdW1teSBgZWNobyAiJHtVTkFNRV9SRUxFQVNFfSIgfCBzZWQgLW4gJ3MvXChbMC05XSpcKS4qL1wxL3AnYCBcCisJICAmJiBleGl0IDAKKwllY2hvIG1pcHMtbWlwcy1yaXNjb3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgTW90b3JvbGE6UG93ZXJNQVhfT1M6KjoqKQorCWVjaG8gcG93ZXJwYy1tb3Rvcm9sYS1wb3dlcm1heAorCWV4aXQgMCA7OworICAgIE1vdG9yb2xhOio6NC4zOlBMOC0qKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKKwlleGl0IDAgOzsKKyAgICBOaWdodF9IYXdrOio6KjpQb3dlck1BWF9PUyB8IFN5bmVyZ3k6UG93ZXJNQVhfT1M6KjoqKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKKwlleGl0IDAgOzsKKyAgICBOaWdodF9IYXdrOlBvd2VyX1VOSVg6KjoqKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJ1bml4CisJZXhpdCAwIDs7CisgICAgbTg4azpDWC9VWDo3KjoqKQorCWVjaG8gbTg4ay1oYXJyaXMtY3h1eDcKKwlleGl0IDAgOzsKKyAgICBtODhrOio6NCo6UjQqKQorCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2NAorCWV4aXQgMCA7OworICAgIG04OGs6KjozKjpSMyopCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCisJZXhpdCAwIDs7CisgICAgQVZpaU9OOmRndXg6KjoqKQorICAgICAgICAjIERHL1VYIHJldHVybnMgQVZpaU9OIGZvciBhbGwgYXJjaGl0ZWN0dXJlcworICAgICAgICBVTkFNRV9QUk9DRVNTT1I9YC91c3IvYmluL3VuYW1lIC1wYAorCWlmIFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMDAgXSB8fCBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTEwIF0KKwl0aGVuCisJICAgIGlmIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0gbTg4a2RndXhlbGZ4IF0gfHwgXAorCSAgICAgICBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IHggXQorCSAgICB0aGVuCisJCWVjaG8gbTg4ay1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQorCSAgICBlbHNlCisJCWVjaG8gbTg4ay1kZy1kZ3V4YmNzJHtVTkFNRV9SRUxFQVNFfQorCSAgICBmaQorCWVsc2UKKwkgICAgZWNobyBpNTg2LWRnLWRndXgke1VOQU1FX1JFTEVBU0V9CisJZmkKKyAJZXhpdCAwIDs7CisgICAgTTg4KjpEb2xwaGluT1M6KjoqKQkjIERvbHBoaW5PUyAoU1ZSMykKKwllY2hvIG04OGstZG9scGhpbi1zeXN2MworCWV4aXQgMCA7OworICAgIE04OCo6KjpSMyo6KikKKwkjIERlbHRhIDg4ayBzeXN0ZW0gcnVubmluZyBTVlIzCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCisJZXhpdCAwIDs7CisgICAgWEQ4OCo6KjoqOiopICMgVGVrdHJvbml4IFhEODggc3lzdGVtIHJ1bm5pbmcgVVRla1YgKFNWUjMpCisJZWNobyBtODhrLXRla3Ryb25peC1zeXN2MworCWV4aXQgMCA7OworICAgIFRlazQzWzAtOV1bMC05XTpVVGVrOio6KikgIyBUZWt0cm9uaXggNDMwMCBzeXN0ZW0gcnVubmluZyBVVGVrIChCU0QpCisJZWNobyBtNjhrLXRla3Ryb25peC1ic2QKKwlleGl0IDAgOzsKKyAgICAqOklSSVgqOio6KikKKwllY2hvIG1pcHMtc2dpLWlyaXhgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vZydgCisJZXhpdCAwIDs7CisgICAgPz8/Pz8/Pz86QUlYPzpbMTJdLjE6MikgICAjIEFJWCAyLjIuMSBvciBBSVggMi4xLjEgaXMgUlQvUEMgQUlYLgorCWVjaG8gcm9tcC1pYm0tYWl4ICAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAorCWV4aXQgMCA7OyAgICAgICAgICAgICAgIyBOb3RlIHRoYXQ6IGVjaG8gIidgdW5hbWUgLXNgJyIgZ2l2ZXMgJ0FJWCAnCisgICAgaSo4NjpBSVg6KjoqKQorCWVjaG8gaTM4Ni1pYm0tYWl4CisJZXhpdCAwIDs7CisgICAgaWE2NDpBSVg6KjoqKQorCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgorCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAorCWVsc2UKKwkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tYWl4JHtJQk1fUkVWfQorCWV4aXQgMCA7OworICAgICo6QUlYOjI6MykKKwlpZiBncmVwIGJvczMyNSAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQlzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkJI2luY2x1ZGUgPHN5cy9zeXN0ZW1jZmcuaD4KKworCQltYWluKCkKKwkJCXsKKwkJCWlmICghX19wb3dlcl9wYygpKQorCQkJCWV4aXQoMSk7CisJCQlwdXRzKCJwb3dlcnBjLWlibS1haXgzLjIuNSIpOworCQkJZXhpdCgwKTsKKwkJCX0KK0VPRgorCQkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiAkZHVtbXkgJiYgZXhpdCAwCisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQorCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAorCWVsc2UKKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMgorCWZpCisJZXhpdCAwIDs7CisgICAgKjpBSVg6KjpbNDVdKQorCUlCTV9DUFVfSUQ9YC91c3Ivc2Jpbi9sc2RldiAtQyAtYyBwcm9jZXNzb3IgLVMgYXZhaWxhYmxlIHwgc2VkIDFxIHwgYXdrICd7IHByaW50ICQxIH0nYAorCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVsICR7SUJNX0NQVV9JRH0gfCBncmVwICcgUE9XRVInID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlJQk1fQVJDSD1yczYwMDAKKwllbHNlCisJCUlCTV9BUkNIPXBvd2VycGMKKwlmaQorCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgorCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAorCWVsc2UKKwkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KKwlleGl0IDAgOzsKKyAgICAqOkFJWDoqOiopCisJZWNobyByczYwMDAtaWJtLWFpeAorCWV4aXQgMCA7OworICAgIGlibXJ0OjQuNEJTRDoqfHJvbXAtaWJtOkJTRDoqKQorCWVjaG8gcm9tcC1pYm0tYnNkNC40CisJZXhpdCAwIDs7CisgICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIEJTRCBhbmQKKwllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCisJZXhpdCAwIDs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKKyAgICAqOkJPU1g6KjoqKQorCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAorCWV4aXQgMCA7OworICAgIERQWC8yPzAwOkIuTy5TLjoqOiopCisJZWNobyBtNjhrLWJ1bGwtc3lzdjMKKwlleGl0IDAgOzsKKyAgICA5MDAwL1szNF0/Pzo0LjNic2Q6MS4qOiopCisJZWNobyBtNjhrLWhwLWJzZAorCWV4aXQgMCA7OworICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCisJZWNobyBtNjhrLWhwLWJzZDQuNAorCWV4aXQgMCA7OworICAgIDkwMDAvWzM0Njc4XT8/OkhQLVVYOio6KikKKwlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKKwljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgorCSAgICA5MDAwLzMxPyApICAgICAgICAgICAgSFBfQVJDSD1tNjgwMDAgOzsKKwkgICAgOTAwMC9bMzRdPz8gKSAgICAgICAgIEhQX0FSQ0g9bTY4ayA7OworCSAgICA5MDAwL1s2NzhdWzAtOV1bMC05XSkKKwkJaWYgWyAteCAvdXNyL2Jpbi9nZXRjb25mIF07IHRoZW4KKwkJICAgIHNjX2NwdV92ZXJzaW9uPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0NQVV9WRVJTSU9OIDI+L2Rldi9udWxsYAorICAgICAgICAgICAgICAgICAgICBzY19rZXJuZWxfYml0cz1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19LRVJORUxfQklUUyAyPi9kZXYvbnVsbGAKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzY19jcHVfdmVyc2lvbn0iIGluCisgICAgICAgICAgICAgICAgICAgICAgNTIzKSBIUF9BUkNIPSJocHBhMS4wIiA7OyAjIENQVV9QQV9SSVNDMV8wCisgICAgICAgICAgICAgICAgICAgICAgNTI4KSBIUF9BUkNIPSJocHBhMS4xIiA7OyAjIENQVV9QQV9SSVNDMV8xCisgICAgICAgICAgICAgICAgICAgICAgNTMyKSAgICAgICAgICAgICAgICAgICAgICAjIENQVV9QQV9SSVNDMl8wCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NjX2tlcm5lbF9iaXRzfSIgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgMzIpIEhQX0FSQ0g9ImhwcGEyLjBuIiA7OworICAgICAgICAgICAgICAgICAgICAgICAgICA2NCkgSFBfQVJDSD0iaHBwYTIuMHciIDs7CisJCQkgICcnKSBIUF9BUkNIPSJocHBhMi4wIiA7OyAgICMgSFAtVVggMTAuMjAKKyAgICAgICAgICAgICAgICAgICAgICAgIGVzYWMgOzsKKyAgICAgICAgICAgICAgICAgICAgZXNhYworCQlmaQorCQlpZiBbICIke0hQX0FSQ0h9IiA9ICIiIF07IHRoZW4KKwkJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJICAgIHNlZCAncy9eICAgICAgICAgICAgICAvLycgPDwgRU9GID4kZHVtbXkuYworCisgICAgICAgICAgICAgICNkZWZpbmUgX0hQVVhfU09VUkNFCisgICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAgICAgICAgICAgI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisgICAgICAgICAgICAgIGludCBtYWluICgpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQorICAgICAgICAgICAgICAgICAgbG9uZyBiaXRzID0gc3lzY29uZihfU0NfS0VSTkVMX0JJVFMpOworICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgIGxvbmcgY3B1ICA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7CisKKyAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY3B1KQorICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7CisgICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMSIpOyBicmVhazsKKyAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MyXzA6CisgICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKKyAgICAgICAgICAgICAgCSAgICBzd2l0Y2ggKGJpdHMpCisgICAgICAgICAgICAgIAkJeworICAgICAgICAgICAgICAJCWNhc2UgNjQ6IHB1dHMgKCJocHBhMi4wdyIpOyBicmVhazsKKyAgICAgICAgICAgICAgCQljYXNlIDMyOiBwdXRzICgiaHBwYTIuMG4iKTsgYnJlYWs7CisgICAgICAgICAgICAgIAkJZGVmYXVsdDogcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7CisgICAgICAgICAgICAgIAkJfSBicmVhazsKKyAgICAgICAgICAgICAgI2Vsc2UgIC8qICFkZWZpbmVkKF9TQ19LRVJORUxfQklUUykgKi8KKyAgICAgICAgICAgICAgCSAgICBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgIAlkZWZhdWx0OiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgIGV4aXQgKDApOworICAgICAgICAgICAgICB9CitFT0YKKwkJICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIDI+L2Rldi9udWxsKSAmJiBIUF9BUkNIPWAkZHVtbXlgCisJCSAgICB0ZXN0IC16ICIkSFBfQVJDSCIgJiYgSFBfQVJDSD1ocHBhCisJCWZpIDs7CisJZXNhYworCWlmIFsgJHtIUF9BUkNIfSA9ICJocHBhMi4wdyIgXQorCXRoZW4KKwkgICAgIyBhdm9pZCBkb3VibGUgZXZhbHVhdGlvbiBvZiAkc2V0X2NjX2Zvcl9idWlsZAorCSAgICB0ZXN0IC1uICIkQ0NfRk9SX0JVSUxEIiB8fCBldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJICAgIGlmIGVjaG8gX19MUDY0X18gfCAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0pIHwgZ3JlcCBfX0xQNjRfXyA+L2Rldi9udWxsCisJICAgIHRoZW4KKwkJSFBfQVJDSD0iaHBwYTIuMHciCisJICAgIGVsc2UKKwkJSFBfQVJDSD0iaHBwYTY0IgorCSAgICBmaQorCWZpCisJZWNobyAke0hQX0FSQ0h9LWhwLWhwdXgke0hQVVhfUkVWfQorCWV4aXQgMCA7OworICAgIGlhNjQ6SFAtVVg6KjoqKQorCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAorCWVjaG8gaWE2NC1ocC1ocHV4JHtIUFVYX1JFVn0KKwlleGl0IDAgOzsKKyAgICAzMDUwKjpISS1VWDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI2luY2x1ZGUgPHVuaXN0ZC5oPgorCWludAorCW1haW4gKCkKKwl7CisJICBsb25nIGNwdSA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7CisJICAvKiBUaGUgb3JkZXIgbWF0dGVycywgYmVjYXVzZSBDUFVfSVNfSFBfTUM2OEsgZXJyb25lb3VzbHkgcmV0dXJucworCSAgICAgdHJ1ZSBmb3IgQ1BVX1BBX1JJU0MxXzAuICBDUFVfSVNfUEFfUklTQyByZXR1cm5zIGNvcnJlY3QKKwkgICAgIHJlc3VsdHMsIGhvd2V2ZXIuICAqLworCSAgaWYgKENQVV9JU19QQV9SSVNDIChjcHUpKQorCSAgICB7CisJICAgICAgc3dpdGNoIChjcHUpCisJCXsKKwkJICBjYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGNhc2UgQ1BVX1BBX1JJU0MyXzA6IHB1dHMgKCJocHBhMi4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBkZWZhdWx0OiBwdXRzICgiaHBwYS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAoQ1BVX0lTX0hQX01DNjhLIChjcHUpKQorCSAgICBwdXRzICgibTY4ay1oaXRhY2hpLWhpdXh3ZTIiKTsKKwkgIGVsc2UgcHV0cyAoInVua25vd24taGl0YWNoaS1oaXV4d2UyIik7CisJICBleGl0ICgwKTsKKwl9CitFT0YKKwkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiAkZHVtbXkgJiYgZXhpdCAwCisJZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgorCWV4aXQgMCA7OworICAgIDkwMDAvNz8/OjQuM2JzZDoqOiogfCA5MDAwLzg/Wzc5XTo0LjNic2Q6KjoqICkKKwllY2hvIGhwcGExLjEtaHAtYnNkCisJZXhpdCAwIDs7CisgICAgOTAwMC84Pz86NC4zYnNkOio6KikKKwllY2hvIGhwcGExLjAtaHAtYnNkCisJZXhpdCAwIDs7CisgICAgKjk/Pyo6TVBFL2lYOio6KiB8ICozMDAwKjpNUEUvaVg6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1tcGVpeAorCWV4aXQgMCA7OworICAgIGhwNz8/Ok9TRjE6KjoqIHwgaHA4P1s3OV06T1NGMToqOiogKQorCWVjaG8gaHBwYTEuMS1ocC1vc2YKKwlleGl0IDAgOzsKKyAgICBocDg/PzpPU0YxOio6KikKKwllY2hvIGhwcGExLjAtaHAtb3NmCisJZXhpdCAwIDs7CisgICAgaSo4NjpPU0YxOio6KikKKwlpZiBbIC14IC91c3Ivc2Jpbi9zeXN2ZXJzaW9uIF0gOyB0aGVuCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjFtaworCWVsc2UKKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMQorCWZpCisJZXhpdCAwIDs7CisgICAgcGFyaXNjKjpMaXRlcyo6KjoqKQorCWVjaG8gaHBwYTEuMS1ocC1saXRlcworCWV4aXQgMCA7OworICAgIEMxKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzEqOiopCisJZWNobyBjMS1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgMCA7OworICAgIEMyKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzIqOiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorICAgICAgICBleGl0IDAgOzsKKyAgICBDMzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzQqOiopCisJZWNobyBjMzQtY29udmV4LWJzZAorICAgICAgICBleGl0IDAgOzsKKyAgICBDMzgqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzgqOiopCisJZWNobyBjMzgtY29udmV4LWJzZAorICAgICAgICBleGl0IDAgOzsKKyAgICBDNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkM0KjoqKQorCWVjaG8gYzQtY29udmV4LWJzZAorICAgICAgICBleGl0IDAgOzsKKyAgICBDUkFZKlktTVA6KjoqOiopCisJZWNobyB5bXAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDAgOzsKKyAgICBDUkFZKltBLVpdOTA6KjoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSBcCisJfCBzZWQgLWUgJ3MvQ1JBWS4qXChbQS1aXTkwXCkvXDEvJyBcCisJICAgICAgLWUgeS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8gXAorCSAgICAgIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDAgOzsKKyAgICBDUkFZKlRTOio6KjoqKQorCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCAwIDs7CisgICAgQ1JBWSpUM0U6KjoqOiopCisJZWNobyBhbHBoYWV2NS1jcmF5LXVuaWNvc21rJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCAwIDs7CisgICAgQ1JBWSpTVjE6KjoqOiopCisJZWNobyBzdjEtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDAgOzsKKyAgICAqOlVOSUNPUy9tcDoqOiopCisJZWNobyBjcmF5bnYtY3JheS11bmljb3NtcCR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgMCA7OworICAgIEYzMFswMV06VU5JWF9TeXN0ZW1fVjoqOiogfCBGNzAwOlVOSVhfU3lzdGVtX1Y6KjoqKQorCUZVSklUU1VfUFJPQz1gdW5hbWUgLW0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgICAgICAgIEZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKKyAgICAgICAgRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy8gL18vJ2AKKyAgICAgICAgZWNobyAiJHtGVUpJVFNVX1BST0N9LWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKKyAgICAgICAgZXhpdCAwIDs7CisgICAgNTAwMDpVTklYX1N5c3RlbV9WOjQuKjoqKQorICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCisgICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvIC9fLydgCisgICAgICAgIGVjaG8gInNwYXJjLWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKKwlleGl0IDAgOzsKKyAgICBpKjg2OkJTRC8zODY6KjoqIHwgaSo4NjpCU0QvT1M6KjoqIHwgKjpBc2NlbmRcIEVtYmVkZGVkL09TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBzcGFyYyo6QlNEL09TOio6KikKKwllY2hvIHNwYXJjLXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOkJTRC9PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOkZyZWVCU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgCisJZXhpdCAwIDs7CisgICAgaSo6Q1lHV0lOKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1jeWd3aW4KKwlleGl0IDAgOzsKKyAgICBpKjpNSU5HVyo6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluZ3czMgorCWV4aXQgMCA7OworICAgIGkqOlBXKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1wdzMyCisJZXhpdCAwIDs7CisgICAgeDg2OkludGVyaXgqOlszNF0qKQorCWVjaG8gaTU4Ni1wYy1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvXC4uKi8vJworCWV4aXQgMCA7OworICAgIFszNDVdODY6V2luZG93c185NToqIHwgWzM0NV04NjpXaW5kb3dzXzk4OiogfCBbMzQ1XTg2OldpbmRvd3NfTlQ6KikKKwllY2hvIGkke1VOQU1FX01BQ0hJTkV9LXBjLW1rcworCWV4aXQgMCA7OworICAgIGkqOldpbmRvd3NfTlQqOiogfCBQZW50aXVtKjpXaW5kb3dzX05UKjoqKQorCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KKwkjIEl0IGFsc28gY29uZmxpY3RzIHdpdGggcHJlLTIuMCB2ZXJzaW9ucyBvZiBBVCZUIFVXSU4uIFNob3VsZCB3ZQorCSMgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQgb2YgaTM4Nj8KKwllY2hvIGk1ODYtcGMtaW50ZXJpeAorCWV4aXQgMCA7OworICAgIGkqOlVXSU4qOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXV3aW4KKwlleGl0IDAgOzsKKyAgICBwKjpDWUdXSU4qOiopCisJZWNobyBwb3dlcnBjbGUtdW5rbm93bi1jeWd3aW4KKwlleGl0IDAgOzsKKyAgICBwcmVwKjpTdW5PUzo1Lio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCAwIDs7CisgICAgKjpHTlU6KjoqKQorCSMgdGhlIEdOVSBzeXN0ZW0KKwllY2hvIGBlY2hvICR7VU5BTUVfTUFDSElORX18c2VkIC1lICdzLFstL10uKiQsLCdgLXVua25vd24tZ251YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MsLy4qJCwsJ2AKKwlleGl0IDAgOzsKKyAgICAqOkdOVS8qOio6KikKKwkjIG90aGVyIHN5c3RlbXMgd2l0aCBHTlUgbGliYyBhbmQgdXNlcmxhbmQKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1gZWNobyAke1VOQU1FX1NZU1RFTX0gfCBzZWQgJ3MsXlteL10qLywsJyB8IHRyICdbQS1aXScgJ1thLXpdJ2BgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgLWdudQorCWV4aXQgMCA7OworICAgIGkqODY6TWluaXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5peAorCWV4aXQgMCA7OworICAgIGFybSo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIGNyaXM6TGludXg6KjoqKQorCWVjaG8gY3Jpcy1heGlzLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIGNyaXN2MzI6TGludXg6KjoqKQorCWVjaG8gY3Jpc3YzMi1heGlzLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIGZydjpMaW51eDoqOiopCisgICAgCWVjaG8gZnJ2LXVua25vd24tbGludXgtZ251CisJZXhpdCAwIDs7CisgICAgaWE2NDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCAwIDs7CisgICAgbTMycio6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIG02OCo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIG1pcHM6TGludXg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSN1bmRlZiBDUFUKKwkjdW5kZWYgbWlwcworCSN1bmRlZiBtaXBzZWwKKwkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQorCUNQVT1taXBzZWwKKwkjZWxzZQorCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpCisJQ1BVPW1pcHMKKwkjZWxzZQorCUNQVT0KKwkjZW5kaWYKKwkjZW5kaWYKK0VPRgorCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwIF5DUFU9YAorCXRlc3QgeCIke0NQVX0iICE9IHggJiYgZWNobyAiJHtDUFV9LXVua25vd24tbGludXgtZ251IiAmJiBleGl0IDAKKwk7OworICAgIG1pcHM2NDpMaW51eDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI3VuZGVmIENQVQorCSN1bmRlZiBtaXBzNjQKKwkjdW5kZWYgbWlwczY0ZWwKKwkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQorCUNQVT1taXBzNjRlbAorCSNlbHNlCisJI2lmIGRlZmluZWQoX19NSVBTRUJfXykgfHwgZGVmaW5lZChfX01JUFNFQikgfHwgZGVmaW5lZChfTUlQU0VCKSB8fCBkZWZpbmVkKE1JUFNFQikKKwlDUFU9bWlwczY0CisJI2Vsc2UKKwlDUFU9CisJI2VuZGlmCisJI2VuZGlmCitFT0YKKwlldmFsIGAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgZ3JlcCBeQ1BVPWAKKwl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIGVjaG8gIiR7Q1BVfS11bmtub3duLWxpbnV4LWdudSIgJiYgZXhpdCAwCisJOzsKKyAgICBwcGM6TGludXg6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIHBwYzY0OkxpbnV4Oio6KikKKwllY2hvIHBvd2VycGM2NC11bmtub3duLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIGFscGhhOkxpbnV4Oio6KikKKwljYXNlIGBzZWQgLW4gJy9eY3B1IG1vZGVsL3MvXi4qOiBcKC4qXCkvXDEvcCcgPCAvcHJvYy9jcHVpbmZvYCBpbgorCSAgRVY1KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjUgOzsKKwkgIEVWNTYpICBVTkFNRV9NQUNISU5FPWFscGhhZXY1NiA7OworCSAgUENBNTYpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgUENBNTcpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgRVY2KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjYgOzsKKwkgIEVWNjcpICBVTkFNRV9NQUNISU5FPWFscGhhZXY2NyA7OworCSAgRVY2OCopIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY4IDs7CisgICAgICAgIGVzYWMKKwlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIC9iaW4vc2ggfCBncmVwIGxkLnNvLjEgPi9kZXYvbnVsbAorCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuIExJQkM9ImxpYmMxIiA7IGVsc2UgTElCQz0iIiA7IGZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251JHtMSUJDfQorCWV4aXQgMCA7OworICAgIHBhcmlzYzpMaW51eDoqOiogfCBocHBhOkxpbnV4Oio6KikKKwkjIExvb2sgZm9yIENQVSBsZXZlbAorCWNhc2UgYGdyZXAgJ15jcHVbXmEtel0qOicgL3Byb2MvY3B1aW5mbyAyPi9kZXYvbnVsbCB8IGN1dCAtZCcgJyAtZjJgIGluCisJICBQQTcqKSBlY2hvIGhwcGExLjEtdW5rbm93bi1saW51eC1nbnUgOzsKKwkgIFBBOCopIGVjaG8gaHBwYTIuMC11bmtub3duLWxpbnV4LWdudSA7OworCSAgKikgICAgZWNobyBocHBhLXVua25vd24tbGludXgtZ251IDs7CisJZXNhYworCWV4aXQgMCA7OworICAgIHBhcmlzYzY0OkxpbnV4Oio6KiB8IGhwcGE2NDpMaW51eDoqOiopCisJZWNobyBocHBhNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBzMzkwOkxpbnV4Oio6KiB8IHMzOTB4OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWxpbnV4CisJZXhpdCAwIDs7CisgICAgc2g2NCo6TGludXg6KjoqKQorICAgIAllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBzaCo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIHNwYXJjOkxpbnV4Oio6KiB8IHNwYXJjNjQ6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgMCA7OworICAgIHg4Nl82NDpMaW51eDoqOiopCisJZWNobyB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBpKjg2OkxpbnV4Oio6KikKKwkjIFRoZSBCRkQgbGlua2VyIGtub3dzIHdoYXQgdGhlIGRlZmF1bHQgb2JqZWN0IGZpbGUgZm9ybWF0IGlzLCBzbworCSMgZmlyc3Qgc2VlIGlmIGl0IHdpbGwgdGVsbCB1cy4gY2QgdG8gdGhlIHJvb3QgZGlyZWN0b3J5IHRvIHByZXZlbnQKKwkjIHByb2JsZW1zIHdpdGggb3RoZXIgcHJvZ3JhbXMgb3IgZGlyZWN0b3JpZXMgY2FsbGVkIGBsZCcgaW4gdGhlIHBhdGguCisJIyBTZXQgTENfQUxMPUMgdG8gZW5zdXJlIGxkIG91dHB1dHMgbWVzc2FnZXMgaW4gRW5nbGlzaC4KKwlsZF9zdXBwb3J0ZWRfdGFyZ2V0cz1gY2QgLzsgTENfQUxMPUMgbGQgLS1oZWxwIDI+JjEgXAorCQkJIHwgc2VkIC1uZSAnL3N1cHBvcnRlZCB0YXJnZXRzOi8hZAorCQkJCSAgICBzL1sgCV1bIAldKi8gL2cKKwkJCQkgICAgcy8uKnN1cHBvcnRlZCB0YXJnZXRzOiAqLy8KKwkJCQkgICAgcy8gLiovLworCQkJCSAgICBwJ2AKKyAgICAgICAgY2FzZSAiJGxkX3N1cHBvcnRlZF90YXJnZXRzIiBpbgorCSAgZWxmMzItaTM4NikKKwkJVEVOVEFUSVZFPSIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudSIKKwkJOzsKKwkgIGEub3V0LWkzODYtbGludXgpCisJCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251YW91dCIKKwkJZXhpdCAwIDs7CisJICBjb2ZmLWkzODYpCisJCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251Y29mZiIKKwkJZXhpdCAwIDs7CisJICAiIikKKwkJIyBFaXRoZXIgYSBwcmUtQkZEIGEub3V0IGxpbmtlciAobGludXgtZ251b2xkbGQpIG9yCisJCSMgb25lIHRoYXQgZG9lcyBub3QgZ2l2ZSB1cyB1c2VmdWwgLS1oZWxwLgorCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudW9sZGxkIgorCQlleGl0IDAgOzsKKwllc2FjCisJIyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGVmYXVsdCBjb21waWxlciBpcyBhLm91dCBvciBlbGYKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKwkjaWZkZWYgX19FTEZfXworCSMgaWZkZWYgX19HTElCQ19fCisJIyAgaWYgX19HTElCQ19fID49IDIKKwlMSUJDPWdudQorCSMgIGVsc2UKKwlMSUJDPWdudWxpYmMxCisJIyAgZW5kaWYKKwkjIGVsc2UKKwlMSUJDPWdudWxpYmMxCisJIyBlbmRpZgorCSNlbHNlCisJI2lmZGVmIF9fSU5URUxfQ09NUElMRVIKKwlMSUJDPWdudQorCSNlbHNlCisJTElCQz1nbnVhb3V0CisJI2VuZGlmCisJI2VuZGlmCisJI2lmZGVmIF9fZGlldGxpYmNfXworCUxJQkM9ZGlldGxpYmMKKwkjZW5kaWYKK0VPRgorCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwIF5MSUJDPWAKKwl0ZXN0IHgiJHtMSUJDfSIgIT0geCAmJiBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LSR7TElCQ30iICYmIGV4aXQgMAorCXRlc3QgeCIke1RFTlRBVElWRX0iICE9IHggJiYgZWNobyAiJHtURU5UQVRJVkV9IiAmJiBleGl0IDAKKwk7OworICAgIGkqODY6RFlOSVgvcHR4OjQqOiopCisJIyBwdHggNC4wIGRvZXMgdW5hbWUgLXMgY29ycmVjdGx5LCB3aXRoIERZTklYL3B0eCBpbiB0aGVyZS4KKwkjIGVhcmxpZXIgdmVyc2lvbnMgYXJlIG1lc3NlZCB1cCBhbmQgcHV0IHRoZSBub2RlbmFtZSBpbiBib3RoCisJIyBzeXNuYW1lIGFuZCBub2RlbmFtZS4KKwllY2hvIGkzODYtc2VxdWVudC1zeXN2NAorCWV4aXQgMCA7OworICAgIGkqODY6VU5JWF9TVjo0LjJNUDoyLiopCisgICAgICAgICMgVW5peHdhcmUgaXMgYW4gb2Zmc2hvb3Qgb2YgU1ZSNCwgYnV0IGl0IGhhcyBpdHMgb3duIHZlcnNpb24KKyAgICAgICAgIyBudW1iZXIgc2VyaWVzIHN0YXJ0aW5nIHdpdGggMi4uLgorICAgICAgICAjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCisJIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgorICAgICAgICAjIFVzZSBzeXN2NC4ydXcuLi4gc28gdGhhdCBzeXN2NCogbWF0Y2hlcyBpdC4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjQuMnV3JHtVTkFNRV9WRVJTSU9OfQorCWV4aXQgMCA7OworICAgIGkqODY6T1MvMjoqOiopCisJIyBJZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCBgdW5hbWUnLCB0aGVuIEVNWCBVbml4IGNvbXBhdGliaWxpdHkKKwkjIGlzIHByb2JhYmx5IGluc3RhbGxlZC4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtb3MyLWVteAorCWV4aXQgMCA7OworICAgIGkqODY6WFRTLTMwMDoqOlNUT1ApCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3RvcAorCWV4aXQgMCA7OworICAgIGkqODY6YXRoZW9zOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hdGhlb3MKKwlleGl0IDAgOzsKKwlpKjg2OnN5bGxhYmxlOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lsbGFibGUKKwlleGl0IDAgOzsKKyAgICBpKjg2Okx5bnhPUzoyLio6KiB8IGkqODY6THlueE9TOjMuWzAxXSo6KiB8IGkqODY6THlueE9TOjQuMCo6KikKKwllY2hvIGkzODYtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgaSo4NjoqRE9TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbXNkb3NkamdwcAorCWV4aXQgMCA7OworICAgIGkqODY6Kjo0Lio6KiB8IGkqODY6U1lTVEVNX1Y6NC4qOiopCisJVU5BTUVfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgJ3MvXC9NUCQvLydgCisJaWYgZ3JlcCBOb3ZlbGwgL3Vzci9pbmNsdWRlL2xpbmsuaCA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bml2ZWwtc3lzdiR7VU5BTUVfUkVMfQorCWVsc2UKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Yke1VOQU1FX1JFTH0KKwlmaQorCWV4aXQgMCA7OworICAgIGkqODY6Kjo1Ols3OF0qKQorCWNhc2UgYC9iaW4vdW5hbWUgLVggfCBncmVwICJeTWFjaGluZSJgIGluCisJICAgICo0ODYqKQkgICAgIFVOQU1FX01BQ0hJTkU9aTQ4NiA7OworCSAgICAqUGVudGl1bSkJICAgICBVTkFNRV9NQUNISU5FPWk1ODYgOzsKKwkgICAgKlBlbnQqfCpDZWxlcm9uKSBVTkFNRV9NQUNISU5FPWk2ODYgOzsKKwllc2FjCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0ke1VOQU1FX1NZU1RFTX0ke1VOQU1FX1ZFUlNJT059CisJZXhpdCAwIDs7CisgICAgaSo4NjoqOjMuMjoqKQorCWlmIHRlc3QgLWYgL3Vzci9vcHRpb25zL2NiLm5hbWU7IHRoZW4KKwkJVU5BTUVfUkVMPWBzZWQgLW4gJ3MvLipWZXJzaW9uIC8vcCcgPC91c3Ivb3B0aW9ucy9jYi5uYW1lYAorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtaXNjJFVOQU1FX1JFTAorCWVsaWYgL2Jpbi91bmFtZSAtWCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgorCQlVTkFNRV9SRUw9YCgvYmluL3VuYW1lIC1YfGdyZXAgUmVsZWFzZXxzZWQgLWUgJ3MvLio9IC8vJylgCisJCSgvYmluL3VuYW1lIC1YfGdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgorCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudGl1bScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNTg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50ICpJSScgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAorCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2CisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCisJZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCisJZmkKKwlleGl0IDAgOzsKKyAgICBwYzoqOio6KikKKwkjIExlZnQgaGVyZSBmb3IgY29tcGF0aWJpbGl0eToKKyAgICAgICAgIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKKyAgICAgICAgIyB0aGUgcHJvY2Vzc29yLCBzbyB3ZSBwbGF5IHNhZmUgYnkgYXNzdW1pbmcgaTM4Ni4KKwllY2hvIGkzODYtcGMtbXNkb3NkamdwcAorICAgICAgICBleGl0IDAgOzsKKyAgICBJbnRlbDpNYWNoOjMqOiopCisJZWNobyBpMzg2LXBjLW1hY2gzCisJZXhpdCAwIDs7CisgICAgcGFyYWdvbjoqOio6KikKKwllY2hvIGk4NjAtaW50ZWwtb3NmMQorCWV4aXQgMCA7OworICAgIGk4NjA6Kjo0Lio6KikgIyBpODYwLVNWUjQKKwlpZiBncmVwIFN0YXJkZW50IC91c3IvaW5jbHVkZS9zeXMvdWFkbWluLmggPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCSAgZWNobyBpODYwLXN0YXJkZW50LXN5c3Yke1VOQU1FX1JFTEVBU0V9ICMgU3RhcmRlbnQgVmlzdHJhIGk4NjAtU1ZSNAorCWVsc2UgIyBBZGQgb3RoZXIgaTg2MC1TVlI0IHZlbmRvcnMgYmVsb3cgYXMgdGhleSBhcmUgZGlzY292ZXJlZC4KKwkgIGVjaG8gaTg2MC11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9ICAjIFVua25vd24gaTg2MC1TVlI0CisJZmkKKwlleGl0IDAgOzsKKyAgICBtaW5pKjpDVElYOlNZUyo1OiopCisJIyAibWluaWZyYW1lIgorCWVjaG8gbTY4MDEwLWNvbnZlcmdlbnQtc3lzdgorCWV4aXQgMCA7OworICAgIG1jNjhrOlVOSVg6U1lTVEVNNTozLjUxbSkKKwllY2hvIG02OGstY29udmVyZ2VudC1zeXN2CisJZXhpdCAwIDs7CisgICAgTTY4MD8wOkQtTklYOjUuMzoqKQorCWVjaG8gbTY4ay1kaWFiLWRuaXgKKwlleGl0IDAgOzsKKyAgICBNNjgqOio6UjNWWzU2NzhdKjoqKQorCXRlc3QgLXIgL3N5c1Y2OCAmJiBlY2hvICdtNjhrLW1vdG9yb2xhLXN5c3YnICYmIGV4aXQgMCA7OworICAgIDNbMzQ1XT8/Oio6NC4wOjMuMCB8IDNbMzRdPz9BOio6NC4wOjMuMCB8IDNbMzRdPz8sKjoqOjQuMDozLjAgfCAzWzM0XT8/Lyo6Kjo0LjA6My4wIHwgNDQwMDoqOjQuMDozLjAgfCA0ODUwOio6NC4wOjMuMCB8IFNLQTQwOio6NC4wOjMuMCB8IFNEUzI6Kjo0LjA6My4wIHwgU0hHMjoqOjQuMDozLjAgfCBTNzUwMSo6Kjo0LjA6My4wKQorCU9TX1JFTD0nJworCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAorCSYmIE9TX1JFTD0uYHNlZCAtbiAncy9bXiBdKiBbXiBdKiBcKFswLTldWzAtOV1cKS4qL1wxL3AnIDwgL2V0Yy8ucmVsaWRgCisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisJICAmJiBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH0gJiYgZXhpdCAwCisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBlbnRpdW0gPi9kZXYvbnVsbCBcCisJICAmJiBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH0gJiYgZXhpdCAwIDs7CisgICAgM1szNF0/PzoqOjQuMDoqIHwgM1szNF0/PywqOio6NC4wOiopCisgICAgICAgIC9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAorICAgICAgICAgICYmIGVjaG8gaTQ4Ni1uY3Itc3lzdjQgJiYgZXhpdCAwIDs7CisgICAgbTY4KjpMeW54T1M6Mi4qOiogfCBtNjgqOkx5bnhPUzozLjAqOiopCisJZWNobyBtNjhrLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG1jNjgwMzA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKKwllY2hvIG02OGstYXRhcmktc3lzdjQKKwlleGl0IDAgOzsKKyAgICBUU1VOQU1JOkx5bnhPUzoyLio6KikKKwllY2hvIHNwYXJjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHJzNjAwMDpMeW54T1M6Mi4qOiopCisJZWNobyByczYwMDAtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgUG93ZXJQQzpMeW54T1M6Mi4qOiogfCBQb3dlclBDOkx5bnhPUzozLlswMV0qOiogfCBQb3dlclBDOkx5bnhPUzo0LjAqOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFNNW0JFXVM6VU5JWF9TVjoqOiopCisJZWNobyBtaXBzLWRkZS1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFJNKjpSZWxpYW50VU5JWC0qOio6KikKKwllY2hvIG1pcHMtc25pLXN5c3Y0CisJZXhpdCAwIDs7CisgICAgUk0qOlNJTklYLSo6KjoqKQorCWVjaG8gbWlwcy1zbmktc3lzdjQKKwlleGl0IDAgOzsKKyAgICAqOlNJTklYLSo6KjoqKQorCWlmIHVuYW1lIC1wIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCisJCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zbmktc3lzdjQKKwllbHNlCisJCWVjaG8gbnMzMmstc25pLXN5c3YKKwlmaQorCWV4aXQgMCA7OworICAgIFBFTlRJVU06Kjo0LjAqOiopICMgVW5pc3lzIGBDbGVhclBhdGggSE1QIElYIDQwMDAnIFNWUjQvTVAgZWZmb3J0CisgICAgICAgICAgICAgICAgICAgICAgIyBzYXlzIDxSaWNoYXJkLk0uQmFydGVsQGNjTWFpbC5DZW5zdXMuR09WPgorICAgICAgICBlY2hvIGk1ODYtdW5pc3lzLXN5c3Y0CisgICAgICAgIGV4aXQgMCA7OworICAgICo6VU5JWF9TeXN0ZW1fVjo0KjpGVFgqKQorCSMgRnJvbSBHZXJhbGQgSGV3ZXMgPGhld2VzQG9wZW5tYXJrZXQuY29tPi4KKwkjIEhvdyBhYm91dCBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBzdHJhdHVzIGFyY2hpdGVjdHVyZXM/IC1kam0KKwllY2hvIGhwcGExLjEtc3RyYXR1cy1zeXN2NAorCWV4aXQgMCA7OworICAgICo6KjoqOkZUWCopCisJIyBGcm9tIHNlYW5mQHN3ZGMuc3RyYXR1cy5jb20uCisJZWNobyBpODYwLXN0cmF0dXMtc3lzdjQKKwlleGl0IDAgOzsKKyAgICAqOlZPUzoqOiopCisJIyBGcm9tIFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20uCisJZWNobyBocHBhMS4xLXN0cmF0dXMtdm9zCisJZXhpdCAwIDs7CisgICAgbWM2OCo6QS9VWDoqOiopCisJZWNobyBtNjhrLWFwcGxlLWF1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBuZXdzKjpORVdTLU9TOjYqOiopCisJZWNobyBtaXBzLXNvbnktbmV3c29zNgorCWV4aXQgMCA7OworICAgIFJbMzRdMDAwOipTeXN0ZW1fVio6KjoqIHwgUjQwMDA6VU5JWF9TWVNWOio6KiB8IFIqMDAwOlVOSVhfU1Y6KjoqKQorCWlmIFsgLWQgL3Vzci9uZWMgXTsgdGhlbgorCSAgICAgICAgZWNobyBtaXBzLW5lYy1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWVsc2UKKwkgICAgICAgIGVjaG8gbWlwcy11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZmkKKyAgICAgICAgZXhpdCAwIDs7CisgICAgQmVCb3g6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIGhhcmR3YXJlIG1hZGUgYnkgQmUsIFBQQyBvbmx5LgorCWVjaG8gcG93ZXJwYy1iZS1iZW9zCisJZXhpdCAwIDs7CisgICAgQmVNYWM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIE1hYyBvciBNYWMgY2xvbmUsIFBQQyBvbmx5LgorCWVjaG8gcG93ZXJwYy1hcHBsZS1iZW9zCisJZXhpdCAwIDs7CisgICAgQmVQQzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gSW50ZWwgUEMgY29tcGF0aWJsZS4KKwllY2hvIGk1ODYtcGMtYmVvcworCWV4aXQgMCA7OworICAgIFNYLTQ6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g0LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFNYLTU6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g1LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFNYLTY6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g2LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIFBvd2VyKjpSaGFwc29keToqOiopCisJZWNobyBwb3dlcnBjLWFwcGxlLXJoYXBzb2R5JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICo6UmhhcHNvZHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOkRhcndpbjoqOiopCisJVU5BTUVfUFJPQ0VTU09SPWB1bmFtZSAtcGAgfHwgVU5BTUVfUFJPQ0VTU09SPXVua25vd24KKwljYXNlICRVTkFNRV9QUk9DRVNTT1IgaW4KKwkgICAgKjg2KSBVTkFNRV9QUk9DRVNTT1I9aTY4NiA7OworCSAgICB1bmtub3duKSBVTkFNRV9QUk9DRVNTT1I9cG93ZXJwYyA7OworCWVzYWMKKwllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS1hcHBsZS1kYXJ3aW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpwcm9jbnRvKjoqOiogfCAqOlFOWDpbMDEyMzQ1Njc4OV0qOiopCisJVU5BTUVfUFJPQ0VTU09SPWB1bmFtZSAtcGAKKwlpZiB0ZXN0ICIkVU5BTUVfUFJPQ0VTU09SIiA9ICJ4ODYiOyB0aGVuCisJCVVOQU1FX1BST0NFU1NPUj1pMzg2CisJCVVOQU1FX01BQ0hJTkU9cGMKKwlmaQorCWVjaG8gJHtVTkFNRV9QUk9DRVNTT1J9LSR7VU5BTUVfTUFDSElORX0tbnRvLXFueCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOlFOWDoqOjQqKQorCWVjaG8gaTM4Ni1wYy1xbngKKwlleGl0IDAgOzsKKyAgICBOU1ItPzpOT05TVE9QX0tFUk5FTDoqOiopCisJZWNobyBuc3ItdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOk5vblN0b3AtVVg6KjoqKQorCWVjaG8gbWlwcy1jb21wYXEtbm9uc3RvcHV4CisJZXhpdCAwIDs7CisgICAgQlMyMDAwOlBPU0lYKjoqOiopCisJZWNobyBiczIwMDAtc2llbWVucy1zeXN2CisJZXhpdCAwIDs7CisgICAgRFMvKjpVTklYX1N5c3RlbV9WOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tJHtVTkFNRV9TWVNURU19LSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOlBsYW45Oio6KikKKwkjICJ1bmFtZSAtbSIgaXMgbm90IGNvbnNpc3RlbnQsIHNvIHVzZSAkY3B1dHlwZSBpbnN0ZWFkLiAzODYKKwkjIGlzIGNvbnZlcnRlZCB0byBpMzg2IGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIHg4NgorCSMgb3BlcmF0aW5nIHN5c3RlbXMuCisJaWYgdGVzdCAiJGNwdXR5cGUiID0gIjM4NiI7IHRoZW4KKwkgICAgVU5BTUVfTUFDSElORT1pMzg2CisJZWxzZQorCSAgICBVTkFNRV9NQUNISU5FPSIkY3B1dHlwZSIKKwlmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXBsYW45CisJZXhpdCAwIDs7CisgICAgKjpUT1BTLTEwOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdG9wczEwCisJZXhpdCAwIDs7CisgICAgKjpURU5FWDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRlbmV4CisJZXhpdCAwIDs7CisgICAgS1MxMDpUT1BTLTIwOio6KiB8IEtMMTA6VE9QUy0yMDoqOiogfCBUWVBFNDpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLWRlYy10b3BzMjAKKwlleGl0IDAgOzsKKyAgICBYS0wtMTpUT1BTLTIwOio6KiB8IFRZUEU1OlRPUFMtMjA6KjoqKQorCWVjaG8gcGRwMTAteGtsLXRvcHMyMAorCWV4aXQgMCA7OworICAgICo6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRvcHMyMAorCWV4aXQgMCA7OworICAgICo6SVRTOio6KikKKwllY2hvIHBkcDEwLXVua25vd24taXRzCisJZXhpdCAwIDs7CisgICAgU0VJOio6KjpTRUlVWCkKKyAgICAgICAgZWNobyBtaXBzLXNlaS1zZWl1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOkRyYWdvbkZseToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZHJhZ29uZmx5YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYAorCWV4aXQgMCA7OworICAgICo6KlZNUzoqOiopCisgICAgCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgICAgQSopIGVjaG8gYWxwaGEtZGVjLXZtcyAmJiBleGl0IDAgOzsKKwkgICAgSSopIGVjaG8gaWE2NC1kZWMtdm1zICYmIGV4aXQgMCA7OworCSAgICBWKikgZWNobyB2YXgtZGVjLXZtcyAmJiBleGl0IDAgOzsKKwllc2FjIDs7CisgICAgKjpYRU5JWDoqOlN5c1YpCisJZWNobyBpMzg2LXBjLXhlbml4CisJZXhpdCAwIDs7Citlc2FjCisKKyNlY2hvICcoTm8gdW5hbWUgY29tbWFuZCBvciB1bmFtZSBvdXRwdXQgbm90IHJlY29nbml6ZWQuKScgMT4mMgorI2VjaG8gIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgMT4mMgorCitldmFsICRzZXRfY2NfZm9yX2J1aWxkCitjYXQgPiRkdW1teS5jIDw8RU9GCisjaWZkZWYgX1NFUVVFTlRfCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyBpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI2VuZGlmCittYWluICgpCit7CisjaWYgZGVmaW5lZCAoc29ueSkKKyNpZiBkZWZpbmVkIChNSVBTRUIpCisgIC8qIEJGRCB3YW50cyAiYnNkIiBpbnN0ZWFkIG9mICJuZXdzb3MiLiAgUGVyaGFwcyBCRkQgc2hvdWxkIGJlIGNoYW5nZWQsCisgICAgIEkgZG9uJ3Qga25vdy4uLi4gICovCisgIHByaW50ZiAoIm1pcHMtc29ueS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisgIHByaW50ZiAoIm02OGstc29ueS1uZXdzb3Mlc1xuIiwKKyNpZmRlZiBORVdTT1M0CisgICAgICAgICAgIjQiCisjZWxzZQorCSAgIiIKKyNlbmRpZgorICAgICAgICAgKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19hcm0pICYmIGRlZmluZWQgKF9fYWNvcm4pICYmIGRlZmluZWQgKF9fdW5peCkKKyAgcHJpbnRmICgiYXJtLWFjb3JuLXJpc2NpeCIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoaHAzMDApICYmICFkZWZpbmVkIChocHV4KQorICBwcmludGYgKCJtNjhrLWhwLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChOZVhUKQorI2lmICFkZWZpbmVkIChfX0FSQ0hJVEVDVFVSRV9fKQorI2RlZmluZSBfX0FSQ0hJVEVDVFVSRV9fICJtNjhrIgorI2VuZGlmCisgIGludCB2ZXJzaW9uOworICB2ZXJzaW9uPWAoaG9zdGluZm8gfCBzZWQgLW4gJ3MvLipOZVhUIE1hY2ggXChbMC05XSpcKS4qL1wxL3AnKSAyPi9kZXYvbnVsbGA7CisgIGlmICh2ZXJzaW9uIDwgNCkKKyAgICBwcmludGYgKCIlcy1uZXh0LW5leHRzdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOworICBlbHNlCisgICAgcHJpbnRmICgiJXMtbmV4dC1vcGVuc3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKKyAgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKE1VTFRJTUFYKSB8fCBkZWZpbmVkIChuMTYpCisjaWYgZGVmaW5lZCAoVU1BWFYpCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1zeXN2XG4iKTsgZXhpdCAoMCk7CisjZWxzZQorI2lmIGRlZmluZWQgKENNVSkKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLW1hY2hcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fMzg2QlNEX18pCisgIHByaW50ZiAoImkzODYtcGMtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKHNlcXVlbnQpCisjaWYgZGVmaW5lZCAoaTM4NikKKyAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChuczMyMDAwKQorICBwcmludGYgKCJuczMyay1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NFUVVFTlRfKQorICAgIHN0cnVjdCB1dHNuYW1lIHVuOworCisgICAgdW5hbWUoJnVuKTsKKworICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMiIsIDIpID09IDApIHsKKwlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MlxuIik7IGV4aXQgKDApOworICAgIH0KKyAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjEiLCAyKSA9PSAwKSB7IC8qIFhYWCBpcyBWMSBjb3JyZWN0PyAqLworCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgxXG4iKTsgZXhpdCAoMCk7CisgICAgfQorICAgIHByaW50ZiAoImkzODYtc2VxdWVudC1wdHhcbiIpOyBleGl0ICgwKTsKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkICh2YXgpCisjIGlmICFkZWZpbmVkICh1bHRyaXgpCisjICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgIGlmIGRlZmluZWQgKEJTRCkKKyMgICBpZiBCU0QgPT0gNDMKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zXG4iKTsgZXhpdCAoMCk7CisjICAgZWxzZQorIyAgICBpZiBCU0QgPT0gMTk5MDA2CisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM3Jlbm9cbiIpOyBleGl0ICgwKTsKKyMgICAgZWxzZQorICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZWxzZQorICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7CisjICBlbmRpZgorIyBlbHNlCisgICAgcHJpbnRmICgidmF4LWRlYy11bHRyaXhcbiIpOyBleGl0ICgwKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoYWxsaWFudCkgJiYgZGVmaW5lZCAoaTg2MCkKKyAgcHJpbnRmICgiaTg2MC1hbGxpYW50LWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyAgZXhpdCAoMSk7Cit9CitFT0YKKworJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwgJiYgJGR1bW15ICYmIGV4aXQgMAorCisjIEFwb2xsb3MgcHV0IHRoZSBzeXN0ZW0gdHlwZSBpbiB0aGUgZW52aXJvbm1lbnQuCisKK3Rlc3QgLWQgL3Vzci9hcG9sbG8gJiYgeyBlY2hvICR7SVNQfS1hcG9sbG8tJHtTWVNUWVBFfTsgZXhpdCAwOyB9CisKKyMgQ29udmV4IHZlcnNpb25zIHRoYXQgcHJlZGF0ZSB1bmFtZSBjYW4gdXNlIGdldHN5c2luZm8oMSkKKworaWYgWyAteCAvdXNyL2NvbnZleC9nZXRzeXNpbmZvIF0KK3RoZW4KKyAgICBjYXNlIGBnZXRzeXNpbmZvIC1mIGNwdV90eXBlYCBpbgorICAgIGMxKikKKwllY2hvIGMxLWNvbnZleC1ic2QKKwlleGl0IDAgOzsKKyAgICBjMiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorCWV4aXQgMCA7OworICAgIGMzNCopCisJZWNobyBjMzQtY29udmV4LWJzZAorCWV4aXQgMCA7OworICAgIGMzOCopCisJZWNobyBjMzgtY29udmV4LWJzZAorCWV4aXQgMCA7OworICAgIGM0KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKwlleGl0IDAgOzsKKyAgICBlc2FjCitmaQorCitjYXQgPiYyIDw8RU9GCiskMDogdW5hYmxlIHRvIGd1ZXNzIHN5c3RlbSB0eXBlCisKK1RoaXMgc2NyaXB0LCBsYXN0IG1vZGlmaWVkICR0aW1lc3RhbXAsIGhhcyBmYWlsZWQgdG8gcmVjb2duaXplCit0aGUgb3BlcmF0aW5nIHN5c3RlbSB5b3UgYXJlIHVzaW5nLiBJdCBpcyBhZHZpc2VkIHRoYXQgeW91Citkb3dubG9hZCB0aGUgbW9zdCB1cCB0byBkYXRlIHZlcnNpb24gb2YgdGhlIGNvbmZpZyBzY3JpcHRzIGZyb20KKworICAgIGZ0cDovL2Z0cC5nbnUub3JnL3B1Yi9nbnUvY29uZmlnLworCitJZiB0aGUgdmVyc2lvbiB5b3UgcnVuICgkMCkgaXMgYWxyZWFkeSB1cCB0byBkYXRlLCBwbGVhc2UKK3NlbmQgdGhlIGZvbGxvd2luZyBkYXRhIGFuZCBhbnkgaW5mb3JtYXRpb24geW91IHRoaW5rIG1pZ2h0IGJlCitwZXJ0aW5lbnQgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIG5lZWRlZAoraW5mb3JtYXRpb24gdG8gaGFuZGxlIHlvdXIgc3lzdGVtLgorCitjb25maWcuZ3Vlc3MgdGltZXN0YW1wID0gJHRpbWVzdGFtcAorCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKy9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbGAKKworaG9zdGluZm8gICAgICAgICAgICAgICA9IGAoaG9zdGluZm8pIDI+L2Rldi9udWxsYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbGAKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbGAKKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsYAorCitVTkFNRV9NQUNISU5FID0gJHtVTkFNRV9NQUNISU5FfQorVU5BTUVfUkVMRUFTRSA9ICR7VU5BTUVfUkVMRUFTRX0KK1VOQU1FX1NZU1RFTSAgPSAke1VOQU1FX1NZU1RFTX0KK1VOQU1FX1ZFUlNJT04gPSAke1VOQU1FX1ZFUlNJT059CitFT0YKKworZXhpdCAxCisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgorIyB0aW1lLXN0YW1wLWVuZDogIiciCisjIEVuZDoKZGlmZiAtLWdpdCBhL2NvbmZpZy5oIGIvY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIxMzcyYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy5oCkBAIC0wLDAgKzEsMTA3IEBACisvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBjb25maWd1cmUuICAqLworLyogY29uZmlnLmguaW4uICBHZW5lcmF0ZWQgZnJvbSBjb25maWd1cmUuYWMgYnkgYXV0b2hlYWRlci4gICovCisKKy8qIERlZmluZSBpZiBhbiBhYnNvbHV0ZSBpbmRpcmVjdCBjYWxsL2p1bXAgbXVzdCBOT1QgYmUgcHJlZml4ZWQgd2l0aCBgKicgKi8KKy8qICN1bmRlZiBBQlNPTFVURV9XSVRIT1VUX0FTVEVSSVNLICovCisKKy8qIERlZmluZSBpdCB0byBcImFkZHIzMlwiIG9yIFwiYWRkcjMyO1wiIHRvIG1ha2UgR0FTIGhhcHB5ICovCisjZGVmaW5lIEFERFIzMiBhZGRyMzIKKworLyogRGVmaW5lIGlmIHlvdSBkb24ndCB3YW50IHRvIHBhc3MgdGhlIG1lbT0gb3B0aW9uIHRvIExpbnV4ICovCisvKiAjdW5kZWYgQVVUT19MSU5VWF9NRU1fT1BUICovCisKKy8qIERlZmluZSBpdCB0byBcImRhdGEzMlwiIG9yIFwiZGF0YTMyO1wiIHRvIG1ha2UgR0FTIGhhcHB5ICovCisjZGVmaW5lIERBVEEzMiBkYXRhMzIKKworLyogRGVmaW5lIGlmIEMgc3ltYm9scyBnZXQgYW4gdW5kZXJzY29yZSBhZnRlciBjb21waWxhdGlvbiAqLworLyogI3VuZGVmIEhBVkVfQVNNX1VTQ09SRSAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGN1cnNlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9DVVJTRVNfSCAxCisKKy8qIERlZmluZSBpZiBlZGF0YSBpcyBkZWZpbmVkICovCisjZGVmaW5lIEhBVkVfRURBVEFfU1lNQk9MIDEKKworLyogRGVmaW5lIGlmIGVuZCBpcyBkZWZpbmVkICovCisjZGVmaW5lIEhBVkVfRU5EX1NZTUJPTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIGN1cnNlcyBsaWJyYXJ5ICovCisjZGVmaW5lIEhBVkVfTElCQ1VSU0VTIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfTUVNT1JZX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5jdXJzZXMvY3Vyc2VzLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfTkNVUlNFU19DVVJTRVNfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5jdXJzZXMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfTkNVUlNFU19IIDEKKworLyogRGVmaW5lIGlmIG9wZW5kaXNrKCkgaW4gLWx1dGlsIGNhbiBiZSB1c2VkICovCisvKiAjdW5kZWYgSEFWRV9PUEVORElTSyAqLworCisvKiBEZWZpbmUgaWYgc3RhcnQgaXMgZGVmaW5lZCAqLworLyogI3VuZGVmIEhBVkVfU1RBUlRfU1lNQk9MICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NURElOVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RETElCX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19TVEFUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKKworLyogRGVmaW5lIGlmIF9lZGF0YSBpcyBkZWZpbmVkICovCisjZGVmaW5lIEhBVkVfVVNDT1JFX0VEQVRBX1NZTUJPTCAxCisKKy8qIERlZmluZSBpZiBlbmQgaXMgZGVmaW5lZCAqLworI2RlZmluZSBIQVZFX1VTQ09SRV9FTkRfU1lNQk9MIDEKKworLyogRGVmaW5lIGlmIF9zdGFydCBpcyBkZWZpbmVkICovCisjZGVmaW5lIEhBVkVfVVNDT1JFX1NUQVJUX1NZTUJPTCAxCisKKy8qIERlZmluZSBpZiBfX2Jzc19zdGFydCBpcyBkZWZpbmVkICovCisjZGVmaW5lIEhBVkVfVVNDT1JFX1VTQ09SRV9CU1NfU1RBUlRfU1lNQk9MIDEKKworLyogTmFtZSBvZiBwYWNrYWdlICovCisjZGVmaW5lIFBBQ0tBR0UgImdydWIiCisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiYnVnLWdydWJAZ251Lm9yZyIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX05BTUUgIkdSVUIiCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIkdSVUIgMC45NyIKKworLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgImdydWIiCisKKy8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiMC45NyIKKworLyogRGVmaW5lIGlmIHRoZXJlIGlzIHVzZXIgc3BlY2lmaWVkIHByZXNldCBtZW51IHN0cmluZyAqLworLyogI3VuZGVmIFBSRVNFVF9NRU5VX1NUUklORyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKKworLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLworI2RlZmluZSBWRVJTSU9OICIwLjk3IgpkaWZmIC0tZ2l0IGEvY29uZmlnLmguaW4gYi9jb25maWcuaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGQ3YzhjCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnLmguaW4KQEAgLTAsMCArMSwxMDYgQEAKKy8qIGNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmFjIGJ5IGF1dG9oZWFkZXIuICAqLworCisvKiBEZWZpbmUgaWYgYW4gYWJzb2x1dGUgaW5kaXJlY3QgY2FsbC9qdW1wIG11c3QgTk9UIGJlIHByZWZpeGVkIHdpdGggYConICovCisjdW5kZWYgQUJTT0xVVEVfV0lUSE9VVF9BU1RFUklTSworCisvKiBEZWZpbmUgaXQgdG8gXCJhZGRyMzJcIiBvciBcImFkZHIzMjtcIiB0byBtYWtlIEdBUyBoYXBweSAqLworI3VuZGVmIEFERFIzMgorCisvKiBEZWZpbmUgaWYgeW91IGRvbid0IHdhbnQgdG8gcGFzcyB0aGUgbWVtPSBvcHRpb24gdG8gTGludXggKi8KKyN1bmRlZiBBVVRPX0xJTlVYX01FTV9PUFQKKworLyogRGVmaW5lIGl0IHRvIFwiZGF0YTMyXCIgb3IgXCJkYXRhMzI7XCIgdG8gbWFrZSBHQVMgaGFwcHkgKi8KKyN1bmRlZiBEQVRBMzIKKworLyogRGVmaW5lIGlmIEMgc3ltYm9scyBnZXQgYW4gdW5kZXJzY29yZSBhZnRlciBjb21waWxhdGlvbiAqLworI3VuZGVmIEhBVkVfQVNNX1VTQ09SRQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGN1cnNlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0NVUlNFU19ICisKKy8qIERlZmluZSBpZiBlZGF0YSBpcyBkZWZpbmVkICovCisjdW5kZWYgSEFWRV9FREFUQV9TWU1CT0wKKworLyogRGVmaW5lIGlmIGVuZCBpcyBkZWZpbmVkICovCisjdW5kZWYgSEFWRV9FTkRfU1lNQk9MCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9JTlRUWVBFU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIGN1cnNlcyBsaWJyYXJ5ICovCisjdW5kZWYgSEFWRV9MSUJDVVJTRVMKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9NRU1PUllfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5jdXJzZXMvY3Vyc2VzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTkNVUlNFU19DVVJTRVNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5jdXJzZXMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9OQ1VSU0VTX0gKKworLyogRGVmaW5lIGlmIG9wZW5kaXNrKCkgaW4gLWx1dGlsIGNhbiBiZSB1c2VkICovCisjdW5kZWYgSEFWRV9PUEVORElTSworCisvKiBEZWZpbmUgaWYgc3RhcnQgaXMgZGVmaW5lZCAqLworI3VuZGVmIEhBVkVfU1RBUlRfU1lNQk9MCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RESU5UX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVFJJTkdfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NUQVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19UWVBFU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfVU5JU1REX0gKKworLyogRGVmaW5lIGlmIF9lZGF0YSBpcyBkZWZpbmVkICovCisjdW5kZWYgSEFWRV9VU0NPUkVfRURBVEFfU1lNQk9MCisKKy8qIERlZmluZSBpZiBlbmQgaXMgZGVmaW5lZCAqLworI3VuZGVmIEhBVkVfVVNDT1JFX0VORF9TWU1CT0wKKworLyogRGVmaW5lIGlmIF9zdGFydCBpcyBkZWZpbmVkICovCisjdW5kZWYgSEFWRV9VU0NPUkVfU1RBUlRfU1lNQk9MCisKKy8qIERlZmluZSBpZiBfX2Jzc19zdGFydCBpcyBkZWZpbmVkICovCisjdW5kZWYgSEFWRV9VU0NPUkVfVVNDT1JFX0JTU19TVEFSVF9TWU1CT0wKKworLyogTmFtZSBvZiBwYWNrYWdlICovCisjdW5kZWYgUEFDS0FHRQorCisvKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KKyN1bmRlZiBQQUNLQUdFX0JVR1JFUE9SVAorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9OQU1FCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1NUUklORworCisvKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9UQVJOQU1FCisKKy8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9WRVJTSU9OCisKKy8qIERlZmluZSBpZiB0aGVyZSBpcyB1c2VyIHNwZWNpZmllZCBwcmVzZXQgbWVudSBzdHJpbmcgKi8KKyN1bmRlZiBQUkVTRVRfTUVOVV9TVFJJTkcKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCisjdW5kZWYgU1REQ19IRUFERVJTCisKKy8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KKyN1bmRlZiBWRVJTSU9OCmRpZmYgLS1naXQgYS9jb25maWcubG9nIGIvY29uZmlnLmxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzU2ZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnLmxvZwpAQCAtMCwwICsxLDk1NyBAQAorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisKK0l0IHdhcyBjcmVhdGVkIGJ5IEdSVUIgY29uZmlndXJlIDAuOTcsIHdoaWNoIHdhcworZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjU5LiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCisKKyAgJCAuL2NvbmZpZ3VyZSAtLWRpc2FibGUtYXV0by1saW51eC1tZW0tb3B0IC0tZW5hYmxlLXByZXNldC1tZW51PWFuZHJvaWQubHN0IC0tZGlzYWJsZS1mZnMgLS1kaXNhYmxlLXVmczIgLS1kaXNhYmxlLW1pbml4IC0tZGlzYWJsZS1yZWlzZXJmcyAtLWRpc2FibGUtdnN0YWZzIC0tZGlzYWJsZS1qZnMgLS1kaXNhYmxlLXhmcyAtLWRpc2FibGUtaXNvOTY2MAorCisjIyAtLS0tLS0tLS0gIyMKKyMjIFBsYXRmb3JtLiAjIworIyMgLS0tLS0tLS0tICMjCisKK2hvc3RuYW1lID0gd2VwcGFyZC5jb3JwLmdvb2dsZS5jb20KK3VuYW1lIC1tID0geDg2XzY0Cit1bmFtZSAtciA9IDIuNi4xOC41LWdnMjZ3b3Jrc3RhdGlvbi1taXhlZDY0LTMyCit1bmFtZSAtcyA9IExpbnV4Cit1bmFtZSAtdiA9ICMxIFNNUCBNb24gRmViIDExIDE2OjQ1OjQ5IFBTVCAyMDA4CisKKy91c3IvYmluL3VuYW1lIC1wID0gdW5rbm93bgorL2Jpbi91bmFtZSAtWCAgICAgPSB1bmtub3duCisKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSB4ODZfNjQKKy91c3IvYmluL2FyY2ggLWsgICAgICAgPSB1bmtub3duCisvdXNyL2NvbnZleC9nZXRzeXNpbmZvID0gdW5rbm93bgoraG9zdGluZm8gICAgICAgICAgICAgICA9IHVua25vd24KKy9iaW4vbWFjaGluZSAgICAgICAgICAgPSB1bmtub3duCisvdXNyL2Jpbi9vc2xldmVsICAgICAgID0gdW5rbm93bgorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IHVua25vd24KKworUEFUSDogL3Vzci9sb2NhbC94ZmNlNC40L2JpbgorUEFUSDogL3Vzci9sb2NhbC94ZmNlNC40L2JpbgorUEFUSDogL3Vzci9sb2NhbC9zeW1saW5rcworUEFUSDogL3Vzci9sb2NhbC9zY3JpcHRzCitQQVRIOiAvdXNyL2xvY2FsL3NiaW4KK1BBVEg6IC91c3IvbG9jYWwvYmluCitQQVRIOiAvdXNyL3NiaW4KK1BBVEg6IC91c3IvYmluCitQQVRIOiAvc2JpbgorUEFUSDogL2JpbgorUEFUSDogL3Vzci9iaW4vWDExCisKKworIyMgLS0tLS0tLS0tLS0gIyMKKyMjIENvcmUgdGVzdHMuICMjCisjIyAtLS0tLS0tLS0tLSAjIworCitjb25maWd1cmU6MTQzNDogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbAorY29uZmlndXJlOjE0ODk6IHJlc3VsdDogL3Vzci9iaW4vaW5zdGFsbCAtYworY29uZmlndXJlOjE1MDA6IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZQorY29uZmlndXJlOjE1NDM6IHJlc3VsdDogeWVzCitjb25maWd1cmU6MTYwODogY2hlY2tpbmcgZm9yIGdhd2sKK2NvbmZpZ3VyZToxNjI0OiBmb3VuZCAvdXNyL2Jpbi9nYXdrCitjb25maWd1cmU6MTYzNDogcmVzdWx0OiBnYXdrCitjb25maWd1cmU6MTY0NDogY2hlY2tpbmcgd2hldGhlciBtYWtlIHNldHMgJChNQUtFKQorY29uZmlndXJlOjE2NjQ6IHJlc3VsdDogeWVzCitjb25maWd1cmU6MTgzOTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUKK2NvbmZpZ3VyZToxODU3OiByZXN1bHQ6IHg4Nl82NC11bmtub3duLWxpbnV4LWdudQorY29uZmlndXJlOjE4NjU6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUKK2NvbmZpZ3VyZToxODc5OiByZXN1bHQ6IHg4Nl82NC11bmtub3duLWxpbnV4LWdudQorY29uZmlndXJlOjE5MDM6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzCitjb25maWd1cmU6MTkxMjogcmVzdWx0OiBubworY29uZmlndXJlOjIwMjg6IGNoZWNraW5nIGZvciBnY2MKK2NvbmZpZ3VyZToyMDQ0OiBmb3VuZCAvdXNyL2Jpbi9nY2MKK2NvbmZpZ3VyZToyMDU0OiByZXN1bHQ6IGdjYworY29uZmlndXJlOjIxMTI6IGNoZWNraW5nIGZvciBnY2MKK2NvbmZpZ3VyZToyMTM4OiByZXN1bHQ6IGdjYworY29uZmlndXJlOjIzODI6IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIHZlcnNpb24KK2NvbmZpZ3VyZToyMzg1OiBnY2MgLS12ZXJzaW9uIDwvZGV2L251bGwgPiY1CitnY2MgKEdDQykgNC4wLjMgKFVidW50dSA0LjAuMy0xdWJ1bnR1NSkKK0NvcHlyaWdodCAoQykgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCit3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworY29uZmlndXJlOjIzODg6ICQ/ID0gMAorY29uZmlndXJlOjIzOTA6IGdjYyAtdiA8L2Rldi9udWxsID4mNQorVXNpbmcgYnVpbHQtaW4gc3BlY3MuCitUYXJnZXQ6IGk0ODYtbGludXgtZ251CitDb25maWd1cmVkIHdpdGg6IC4uL3NyYy9jb25maWd1cmUgLXYgLS1lbmFibGUtbGFuZ3VhZ2VzPWMsYysrLGphdmEsZjk1LG9iamMsYWRhLHRyZWVsYW5nIC0tcHJlZml4PS91c3IgLS1lbmFibGUtc2hhcmVkIC0td2l0aC1zeXN0ZW0temxpYiAtLWxpYmV4ZWNkaXI9L3Vzci9saWIgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgLS1lbmFibGUtdGhyZWFkcz1wb3NpeCAtLWVuYWJsZS1ubHMgLS1wcm9ncmFtLXN1ZmZpeD0tNC4wIC0tZW5hYmxlLV9fY3hhX2F0ZXhpdCAtLWVuYWJsZS1jbG9jYWxlPWdudSAtLWVuYWJsZS1saWJzdGRjeHgtZGVidWcgLS1lbmFibGUtamF2YS1hd3Q9Z3RrLWRlZmF1bHQgLS1lbmFibGUtZ3RrLWNhaXJvIC0td2l0aC1qYXZhLWhvbWU9L3Vzci9saWIvanZtL2phdmEtMS40LjItZ2NqLTQuMC0xLjQuMi4wL2pyZSAtLWVuYWJsZS1tcGZyIC0tZGlzYWJsZS13ZXJyb3IgLS13aXRoLXR1bmU9cGVudGl1bTQgLS1lbmFibGUtY2hlY2tpbmc9cmVsZWFzZSBpNDg2LWxpbnV4LWdudQorVGhyZWFkIG1vZGVsOiBwb3NpeAorZ2NjIHZlcnNpb24gNC4wLjMgKFVidW50dSA0LjAuMy0xdWJ1bnR1NSkKK2NvbmZpZ3VyZToyMzkzOiAkPyA9IDAKK2NvbmZpZ3VyZToyMzk1OiBnY2MgLVYgPC9kZXYvbnVsbCA+JjUKK2djYzogJy1WJyBvcHRpb24gbXVzdCBoYXZlIGFyZ3VtZW50Citjb25maWd1cmU6MjM5ODogJD8gPSAxCitjb25maWd1cmU6MjQyMTogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lCitjb25maWd1cmU6MjQyNDogZ2NjIC1tMzIgICAgY29uZnRlc3QuYyAgPiY1Citjb25maWd1cmU6MjQyNzogJD8gPSAwCitjb25maWd1cmU6MjQ3MzogcmVzdWx0OiBhLm91dAorY29uZmlndXJlOjI0Nzg6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MKK2NvbmZpZ3VyZToyNDg0OiAuL2Eub3V0Citjb25maWd1cmU6MjQ4NzogJD8gPSAwCitjb25maWd1cmU6MjUwNDogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZToyNTExOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmcKK2NvbmZpZ3VyZToyNTEzOiByZXN1bHQ6IG5vCitjb25maWd1cmU6MjUxNjogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcworY29uZmlndXJlOjI1MTg6IGdjYyAtbyBjb25mdGVzdCAtbTMyICAgIGNvbmZ0ZXN0LmMgID4mNQorY29uZmlndXJlOjI1MjE6ICQ/ID0gMAorY29uZmlndXJlOjI1NDY6IHJlc3VsdDogCitjb25maWd1cmU6MjU1MjogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMKK2NvbmZpZ3VyZToyNTczOiBnY2MgLWMgLW0zMiAgIGNvbmZ0ZXN0LmMgPiY1Citjb25maWd1cmU6MjU3NjogJD8gPSAwCitjb25maWd1cmU6MjU5ODogcmVzdWx0OiBvCitjb25maWd1cmU6MjYwMjogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyCitjb25maWd1cmU6MjYyNjogZ2NjIC1jIC1tMzIgICBjb25mdGVzdC5jID4mNQorY29uZmlndXJlOjI2MzI6ICQ/ID0gMAorY29uZmlndXJlOjI2MzY6IHRlc3QgLXogCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorY29uZmlndXJlOjI2Mzk6ICQ/ID0gMAorY29uZmlndXJlOjI2NDI6IHRlc3QgLXMgY29uZnRlc3QubworY29uZmlndXJlOjI2NDU6ICQ/ID0gMAorY29uZmlndXJlOjI2NTg6IHJlc3VsdDogeWVzCitjb25maWd1cmU6MjY2NDogY2hlY2tpbmcgd2hldGhlciBnY2MgYWNjZXB0cyAtZworY29uZmlndXJlOjI2ODU6IGdjYyAtYyAtZyAgY29uZnRlc3QuYyA+JjUKK2NvbmZpZ3VyZToyNjkxOiAkPyA9IDAKK2NvbmZpZ3VyZToyNjk1OiB0ZXN0IC16IAorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnIKK2NvbmZpZ3VyZToyNjk4OiAkPyA9IDAKK2NvbmZpZ3VyZToyNzAxOiB0ZXN0IC1zIGNvbmZ0ZXN0Lm8KK2NvbmZpZ3VyZToyNzA0OiAkPyA9IDAKK2NvbmZpZ3VyZToyNzE1OiByZXN1bHQ6IHllcworY29uZmlndXJlOjI3MzI6IGNoZWNraW5nIGZvciBnY2Mgb3B0aW9uIHRvIGFjY2VwdCBBTlNJIEMKK2NvbmZpZ3VyZToyODAyOiBnY2MgIC1jIC1tMzIgICBjb25mdGVzdC5jID4mNQorY29uZmlndXJlOjI4MDg6ICQ/ID0gMAorY29uZmlndXJlOjI4MTI6IHRlc3QgLXogCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorY29uZmlndXJlOjI4MTU6ICQ/ID0gMAorY29uZmlndXJlOjI4MTg6IHRlc3QgLXMgY29uZnRlc3QubworY29uZmlndXJlOjI4MjE6ICQ/ID0gMAorY29uZmlndXJlOjI4Mzk6IHJlc3VsdDogbm9uZSBuZWVkZWQKK2NvbmZpZ3VyZToyODU3OiBnY2MgLWMgLW0zMiAgIGNvbmZ0ZXN0LmMgPiY1Citjb25mdGVzdC5jOjI6IGVycm9yOiBzeW50YXggZXJyb3IgYmVmb3JlICdtZScKK2NvbmZpZ3VyZToyODYzOiAkPyA9IDEKK2NvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOgorfCAjaWZuZGVmIF9fY3BsdXNwbHVzCit8ICAgY2hva2UgbWUKK3wgI2VuZGlmCitjb25maWd1cmU6MzAwNzogY2hlY2tpbmcgZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSBtYWtlCitjb25maWd1cmU6MzAzNTogcmVzdWx0OiBHTlUKK2NvbmZpZ3VyZTozMDYzOiBjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mIGdjYworY29uZmlndXJlOjMxNTM6IHJlc3VsdDogZ2NjMworY29uZmlndXJlOjMxNzQ6IGNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgZ2NjCitjb25maWd1cmU6MzI2NDogcmVzdWx0OiBnY2MzCitjb25maWd1cmU6MzM3NjogY2hlY2tpbmcgZm9yIHJhbmxpYgorY29uZmlndXJlOjMzOTI6IGZvdW5kIC91c3IvYmluL3JhbmxpYgorY29uZmlndXJlOjM0MDM6IHJlc3VsdDogcmFubGliCitjb25maWd1cmU6MzQyOTogY2hlY2tpbmcgd2hldGhlciBvcHRpbWl6YXRpb24gZm9yIHNpemUgd29ya3MKK2NvbmZpZ3VyZTozNDUzOiBnY2MgLWMgLU9zIC1nICBjb25mdGVzdC5jID4mNQorY29uZmlndXJlOjM0NTk6ICQ/ID0gMAorY29uZmlndXJlOjM0NjM6IHRlc3QgLXogCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorY29uZmlndXJlOjM0NjY6ICQ/ID0gMAorY29uZmlndXJlOjM0Njk6IHRlc3QgLXMgY29uZnRlc3QubworY29uZmlndXJlOjM0NzI6ICQ/ID0gMAorY29uZmlndXJlOjM0ODU6IHJlc3VsdDogeWVzCitjb25maWd1cmU6MzQ5NDogY2hlY2tpbmcgd2hldGhlciBnY2MgaGFzIC1mbm8tc3RhY2stcHJvdGVjdG9yCitjb25maWd1cmU6MzUxODogZ2NjIC1jIC1mbm8tc3RhY2stcHJvdGVjdG9yICBjb25mdGVzdC5jID4mNQorY2MxOiBlcnJvcjogdW5yZWNvZ25pemVkIGNvbW1hbmQgbGluZSBvcHRpb24gIi1mbm8tc3RhY2stcHJvdGVjdG9yIgorY29uZmlndXJlOjM1MjQ6ICQ/ID0gMQorY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6Cit8IC8qIGNvbmZkZWZzLmguICAqLworfCAKK3wgI2RlZmluZSBQQUNLQUdFX05BTUUgIkdSVUIiCit8ICNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJncnViIgorfCAjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiMC45NyIKK3wgI2RlZmluZSBQQUNLQUdFX1NUUklORyAiR1JVQiAwLjk3IgorfCAjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICJidWctZ3J1YkBnbnUub3JnIgorfCAjZGVmaW5lIFBBQ0tBR0UgImdydWIiCit8ICNkZWZpbmUgVkVSU0lPTiAiMC45NyIKK3wgLyogZW5kIGNvbmZkZWZzLmguICAqLworfCAKK3wgaW50Cit8IG1haW4gKCkKK3wgeworfCAKK3wgICA7Cit8ICAgcmV0dXJuIDA7Cit8IH0KK2NvbmZpZ3VyZTozNTUwOiByZXN1bHQ6IG5vCitjb25maWd1cmU6MzU2NjogY2hlY2tpbmcgd2hldGhlciAtV3VuZGVmIHdvcmtzCitjb25maWd1cmU6MzU5MDogZ2NjIC1jIC1tMzIgLWcgLVd1bmRlZiBjb25mdGVzdC5jID4mNQorY29uZmlndXJlOjM1OTY6ICQ/ID0gMAorY29uZmlndXJlOjM2MDA6IHRlc3QgLXogCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorY29uZmlndXJlOjM2MDM6ICQ/ID0gMAorY29uZmlndXJlOjM2MDY6IHRlc3QgLXMgY29uZnRlc3QubworY29uZmlndXJlOjM2MDk6ICQ/ID0gMAorY29uZmlndXJlOjM2MjI6IHJlc3VsdDogeWVzCitjb25maWd1cmU6MzYyNzogY2hlY2tpbmcgd2hldGhlciAtZmFsaWduLWxvb3BzIHdvcmtzCitjb25maWd1cmU6MzY1MTogZ2NjIC1jIC1tMzIgLWcgLWZhbGlnbi1sb29wcz0xIGNvbmZ0ZXN0LmMgPiY1Citjb25maWd1cmU6MzY1NzogJD8gPSAwCitjb25maWd1cmU6MzY2MTogdGVzdCAteiAKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCitjb25maWd1cmU6MzY2NDogJD8gPSAwCitjb25maWd1cmU6MzY2NzogdGVzdCAtcyBjb25mdGVzdC5vCitjb25maWd1cmU6MzY3MDogJD8gPSAwCitjb25maWd1cmU6MzY4MzogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZTozNzgwOiBjaGVja2luZyBmb3Igb2JqY29weQorY29uZmlndXJlOjM3OTY6IGZvdW5kIC91c3IvYmluL29iamNvcHkKK2NvbmZpZ3VyZTozODA2OiByZXN1bHQ6IG9iamNvcHkKK2NvbmZpZ3VyZTozODIyOiBjaGVja2luZyBpZiBDIHN5bWJvbHMgZ2V0IGFuIHVuZGVyc2NvcmUgYWZ0ZXIgY29tcGlsYXRpb24KK2NvbmZpZ3VyZTozODM3OiBnY2MgLW0zMiAtZyAtUyBjb25mdGVzdC5jCitjb25maWd1cmU6Mzg0MDogJD8gPSAwCitjb25maWd1cmU6Mzg2NzogcmVzdWx0OiBubworY29uZmlndXJlOjM4NzA6IGNoZWNraW5nIHdoZXRoZXIgb2JqY29weSB3b3JrcyBmb3IgYWJzb2x1dGUgYWRkcmVzc2VzCitjb25maWd1cmU6Mzg4MzogZ2NjIC1jIC1tMzIgLWcgIC1XYWxsIC1XbWlzc2luZy1wcm90b3R5cGVzIC1XdW51c2VkIC1Xc2hhZG93IC1XcG9pbnRlci1hcml0aCAtZmFsaWduLWp1bXBzPTEgLWZhbGlnbi1sb29wcz0xIC1mYWxpZ24tZnVuY3Rpb25zPTEgLVd1bmRlZiBjb25mdGVzdC5jID4mNQorY29uZnRlc3QuYzozOiB3YXJuaW5nOiBubyBwcmV2aW91cyBwcm90b3R5cGUgZm9yICdjbWFpbicKK2NvbmZpZ3VyZTozODg2OiAkPyA9IDAKK2NvbmZpZ3VyZTozODk2OiBnY2MgLW0zMiAtZyAtbm9zdGRsaWIgLVdsLC1OIC1XbCwtVHRleHQgLVdsLDIwMDAgY29uZnRlc3QubyAtbyBjb25mdGVzdC5leGVjCisvdXNyL2Jpbi9sZDogd2FybmluZzogY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sIF9zdGFydDsgZGVmYXVsdGluZyB0byAwMDAwMDAwMDAwMDAyMDAwCitjb25maWd1cmU6Mzg5OTogJD8gPSAwCitjb25maWd1cmU6MzkwNzogb2JqY29weSAtTyBiaW5hcnkgY29uZnRlc3QuZXhlYyBjb25mdGVzdAorY29uZmlndXJlOjM5MTA6ICQ/ID0gMAorY29uZmlndXJlOjM4OTY6IGdjYyAtbTMyIC1nIC1ub3N0ZGxpYiAtV2wsLU4gLVdsLC1UdGV4dCAtV2wsODAwMCBjb25mdGVzdC5vIC1vIGNvbmZ0ZXN0LmV4ZWMKKy91c3IvYmluL2xkOiB3YXJuaW5nOiBjYW5ub3QgZmluZCBlbnRyeSBzeW1ib2wgX3N0YXJ0OyBkZWZhdWx0aW5nIHRvIDAwMDAwMDAwMDAwMDgwMDAKK2NvbmZpZ3VyZTozODk5OiAkPyA9IDAKK2NvbmZpZ3VyZTozOTA3OiBvYmpjb3B5IC1PIGJpbmFyeSBjb25mdGVzdC5leGVjIGNvbmZ0ZXN0Citjb25maWd1cmU6MzkxMDogJD8gPSAwCitjb25maWd1cmU6MzkxODogY21wIC1zIGNvbmZ0ZXN0Lm9sZCBjb25mdGVzdAorY29uZmlndXJlOjM5MjE6ICQ/ID0gMAorY29uZmlndXJlOjM4OTY6IGdjYyAtbTMyIC1nIC1ub3N0ZGxpYiAtV2wsLU4gLVdsLC1UdGV4dCAtV2wsN0MwMCBjb25mdGVzdC5vIC1vIGNvbmZ0ZXN0LmV4ZWMKKy91c3IvYmluL2xkOiB3YXJuaW5nOiBjYW5ub3QgZmluZCBlbnRyeSBzeW1ib2wgX3N0YXJ0OyBkZWZhdWx0aW5nIHRvIDAwMDAwMDAwMDAwMDdjMDAKK2NvbmZpZ3VyZTozODk5OiAkPyA9IDAKK2NvbmZpZ3VyZTozOTA3OiBvYmpjb3B5IC1PIGJpbmFyeSBjb25mdGVzdC5leGVjIGNvbmZ0ZXN0Citjb25maWd1cmU6MzkxMDogJD8gPSAwCitjb25maWd1cmU6MzkxODogY21wIC1zIGNvbmZ0ZXN0Lm9sZCBjb25mdGVzdAorY29uZmlndXJlOjM5MjE6ICQ/ID0gMAorY29uZmlndXJlOjM5MzI6IHJlc3VsdDogeWVzCitjb25maWd1cmU6Mzk0MTogY2hlY2tpbmcgd2hldGhlciBhZGRyMzIgbXVzdCBiZSBpbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSBpbnN0cnVjdGlvbgorY29uZmlndXJlOjM5NTI6IGdjYyAtbTMyIC1nIC1jIGNvbmZ0ZXN0LnMKK2NvbmZpZ3VyZTozOTU1OiAkPyA9IDAKK2NvbmZpZ3VyZTozOTg1OiByZXN1bHQ6IHllcworY29uZmlndXJlOjM5OTA6IGNoZWNraW5nIGZvciAuY29kZTE2IGFkZHIzMiBhc3NlbWJsZXIgc3VwcG9ydAorY29uZmlndXJlOjQwMDc6IGdjYyAtbTMyIC1nIC1jIGNvbmZ0ZXN0LnMKK2NvbmZpZ3VyZTo0MDEwOiAkPyA9IDAKK2NvbmZpZ3VyZTo0MDIxOiByZXN1bHQ6IHllcworY29uZmlndXJlOjQwMzA6IGNoZWNraW5nIHdoZXRoZXIgYW4gYWJzb2x1dGUgaW5kaXJlY3QgY2FsbC9qdW1wIG11c3Qgbm90IGJlIHByZWZpeGVkIHdpdGggYW4gYXN0ZXJpc2sKK2NvbmZpZ3VyZTo0MDQzOiBnY2MgLW0zMiAtZyAtYyBjb25mdGVzdC5zCitjb25maWd1cmU6NDA0NjogJD8gPSAwCitjb25maWd1cmU6NDA2NTogcmVzdWx0OiBubworY29uZmlndXJlOjQwNjk6IGNoZWNraW5nIGlmIHN0YXJ0IGlzIGRlZmluZWQgYnkgdGhlIGNvbXBpbGVyCitjb25maWd1cmU6NDA5MDogZ2NjIC1vIGNvbmZ0ZXN0IC1tMzIgLWcgIC1XYWxsIC1XbWlzc2luZy1wcm90b3R5cGVzIC1XdW51c2VkIC1Xc2hhZG93IC1XcG9pbnRlci1hcml0aCAtZmFsaWduLWp1bXBzPTEgLWZhbGlnbi1sb29wcz0xIC1mYWxpZ24tZnVuY3Rpb25zPTEgLVd1bmRlZiAgY29uZnRlc3QuYyAgPiY1CisvdG1wL2NjblR2b1JsLm86IEluIGZ1bmN0aW9uIGBtYWluJzovaG9tZS9kbWl0cml5ei9zcmMtbGNsL2FuZHJvaWQteDg2L2RldmljZS90b29scy9ncnViLTAuOTcvY29uZnRlc3QuYzoxNzogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgc3RhcnQnCitjb2xsZWN0MjogbGQgcmV0dXJuZWQgMSBleGl0IHN0YXR1cworY29uZmlndXJlOjQwOTY6ICQ/ID0gMQorY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6Cit8IC8qIGNvbmZkZWZzLmguICAqLworfCAKK3wgI2RlZmluZSBQQUNLQUdFX05BTUUgIkdSVUIiCit8ICNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJncnViIgorfCAjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiMC45NyIKK3wgI2RlZmluZSBQQUNLQUdFX1NUUklORyAiR1JVQiAwLjk3IgorfCAjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICJidWctZ3J1YkBnbnUub3JnIgorfCAjZGVmaW5lIFBBQ0tBR0UgImdydWIiCit8ICNkZWZpbmUgVkVSU0lPTiAiMC45NyIKK3wgI2RlZmluZSBBRERSMzIgYWRkcjMyCit8ICNkZWZpbmUgREFUQTMyIGRhdGEzMgorfCAvKiBlbmQgY29uZmRlZnMuaC4gICovCit8IAorfCBpbnQKK3wgbWFpbiAoKQorfCB7Cit8IGFzbSAoImluY2wgc3RhcnQiKQorfCAgIDsKK3wgICByZXR1cm4gMDsKK3wgfQorY29uZmlndXJlOjQxMzE6IHJlc3VsdDogbm8KK2NvbmZpZ3VyZTo0MTM1OiBjaGVja2luZyBpZiBfc3RhcnQgaXMgZGVmaW5lZCBieSB0aGUgY29tcGlsZXIKK2NvbmZpZ3VyZTo0MTU2OiBnY2MgLW8gY29uZnRlc3QgLW0zMiAtZyAgLVdhbGwgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVd1bnVzZWQgLVdzaGFkb3cgLVdwb2ludGVyLWFyaXRoIC1mYWxpZ24tanVtcHM9MSAtZmFsaWduLWxvb3BzPTEgLWZhbGlnbi1mdW5jdGlvbnM9MSAtV3VuZGVmICBjb25mdGVzdC5jICA+JjUKK2NvbmZpZ3VyZTo0MTYyOiAkPyA9IDAKK2NvbmZpZ3VyZTo0MTY2OiB0ZXN0IC16IAorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnIKK2NvbmZpZ3VyZTo0MTY5OiAkPyA9IDAKK2NvbmZpZ3VyZTo0MTcyOiB0ZXN0IC1zIGNvbmZ0ZXN0Citjb25maWd1cmU6NDE3NTogJD8gPSAwCitjb25maWd1cmU6NDE5NzogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZTo0MjA4OiBjaGVja2luZyBpZiBfX2Jzc19zdGFydCBpcyBkZWZpbmVkIGJ5IHRoZSBjb21waWxlcgorY29uZmlndXJlOjQyMjk6IGdjYyAtbyBjb25mdGVzdCAtbTMyIC1nICAtV2FsbCAtV21pc3NpbmctcHJvdG90eXBlcyAtV3VudXNlZCAtV3NoYWRvdyAtV3BvaW50ZXItYXJpdGggLWZhbGlnbi1qdW1wcz0xIC1mYWxpZ24tbG9vcHM9MSAtZmFsaWduLWZ1bmN0aW9ucz0xIC1XdW5kZWYgIGNvbmZ0ZXN0LmMgID4mNQorY29uZmlndXJlOjQyMzU6ICQ/ID0gMAorY29uZmlndXJlOjQyMzk6IHRlc3QgLXogCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorY29uZmlndXJlOjQyNDI6ICQ/ID0gMAorY29uZmlndXJlOjQyNDU6IHRlc3QgLXMgY29uZnRlc3QKK2NvbmZpZ3VyZTo0MjQ4OiAkPyA9IDAKK2NvbmZpZ3VyZTo0MjcwOiByZXN1bHQ6IHllcworY29uZmlndXJlOjQyNzQ6IGNoZWNraW5nIGlmIF9lZGF0YSBpcyBkZWZpbmVkIGJ5IHRoZSBjb21waWxlcgorY29uZmlndXJlOjQyOTU6IGdjYyAtbyBjb25mdGVzdCAtbTMyIC1nICAtV2FsbCAtV21pc3NpbmctcHJvdG90eXBlcyAtV3VudXNlZCAtV3NoYWRvdyAtV3BvaW50ZXItYXJpdGggLWZhbGlnbi1qdW1wcz0xIC1mYWxpZ24tbG9vcHM9MSAtZmFsaWduLWZ1bmN0aW9ucz0xIC1XdW5kZWYgIGNvbmZ0ZXN0LmMgID4mNQorY29uZmlndXJlOjQzMDE6ICQ/ID0gMAorY29uZmlndXJlOjQzMDU6IHRlc3QgLXogCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorY29uZmlndXJlOjQzMDg6ICQ/ID0gMAorY29uZmlndXJlOjQzMTE6IHRlc3QgLXMgY29uZnRlc3QKK2NvbmZpZ3VyZTo0MzE0OiAkPyA9IDAKK2NvbmZpZ3VyZTo0MzM2OiByZXN1bHQ6IHllcworY29uZmlndXJlOjQzNDA6IGNoZWNraW5nIGlmIGVkYXRhIGlzIGRlZmluZWQgYnkgdGhlIGNvbXBpbGVyCitjb25maWd1cmU6NDM2MTogZ2NjIC1vIGNvbmZ0ZXN0IC1tMzIgLWcgIC1XYWxsIC1XbWlzc2luZy1wcm90b3R5cGVzIC1XdW51c2VkIC1Xc2hhZG93IC1XcG9pbnRlci1hcml0aCAtZmFsaWduLWp1bXBzPTEgLWZhbGlnbi1sb29wcz0xIC1mYWxpZ24tZnVuY3Rpb25zPTEgLVd1bmRlZiAgY29uZnRlc3QuYyAgPiY1Citjb25maWd1cmU6NDM2NzogJD8gPSAwCitjb25maWd1cmU6NDM3MTogdGVzdCAteiAKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCitjb25maWd1cmU6NDM3NDogJD8gPSAwCitjb25maWd1cmU6NDM3NzogdGVzdCAtcyBjb25mdGVzdAorY29uZmlndXJlOjQzODA6ICQ/ID0gMAorY29uZmlndXJlOjQ0MDI6IHJlc3VsdDogeWVzCitjb25maWd1cmU6NDQxNDogY2hlY2tpbmcgaWYgZW5kIGlzIGRlZmluZWQgYnkgdGhlIGNvbXBpbGVyCitjb25maWd1cmU6NDQzNTogZ2NjIC1vIGNvbmZ0ZXN0IC1tMzIgLWcgIC1XYWxsIC1XbWlzc2luZy1wcm90b3R5cGVzIC1XdW51c2VkIC1Xc2hhZG93IC1XcG9pbnRlci1hcml0aCAtZmFsaWduLWp1bXBzPTEgLWZhbGlnbi1sb29wcz0xIC1mYWxpZ24tZnVuY3Rpb25zPTEgLVd1bmRlZiAgY29uZnRlc3QuYyAgPiY1Citjb25maWd1cmU6NDQ0MTogJD8gPSAwCitjb25maWd1cmU6NDQ0NTogdGVzdCAteiAKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCitjb25maWd1cmU6NDQ0ODogJD8gPSAwCitjb25maWd1cmU6NDQ1MTogdGVzdCAtcyBjb25mdGVzdAorY29uZmlndXJlOjQ0NTQ6ICQ/ID0gMAorY29uZmlndXJlOjQ0NzY6IHJlc3VsdDogeWVzCitjb25maWd1cmU6NDQ4MDogY2hlY2tpbmcgaWYgX2VuZCBpcyBkZWZpbmVkIGJ5IHRoZSBjb21waWxlcgorY29uZmlndXJlOjQ1MDE6IGdjYyAtbyBjb25mdGVzdCAtbTMyIC1nICAtV2FsbCAtV21pc3NpbmctcHJvdG90eXBlcyAtV3VudXNlZCAtV3NoYWRvdyAtV3BvaW50ZXItYXJpdGggLWZhbGlnbi1qdW1wcz0xIC1mYWxpZ24tbG9vcHM9MSAtZmFsaWduLWZ1bmN0aW9ucz0xIC1XdW5kZWYgIGNvbmZ0ZXN0LmMgID4mNQorY29uZmlndXJlOjQ1MDc6ICQ/ID0gMAorY29uZmlndXJlOjQ1MTE6IHRlc3QgLXogCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorY29uZmlndXJlOjQ1MTQ6ICQ/ID0gMAorY29uZmlndXJlOjQ1MTc6IHRlc3QgLXMgY29uZnRlc3QKK2NvbmZpZ3VyZTo0NTIwOiAkPyA9IDAKK2NvbmZpZ3VyZTo0NTQyOiByZXN1bHQ6IHllcworY29uZmlndXJlOjQ1NjI6IGNoZWNraW5nIGZvciBvcGVuZGlzayBpbiAtbHV0aWwKK2NvbmZpZ3VyZTo0NTkyOiBnY2MgLW8gY29uZnRlc3QgLW0zMiAtZyAgLVdhbGwgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVd1bnVzZWQgLVdzaGFkb3cgLVdwb2ludGVyLWFyaXRoIC1mYWxpZ24tanVtcHM9MSAtZmFsaWduLWxvb3BzPTEgLWZhbGlnbi1mdW5jdGlvbnM9MSAtV3VuZGVmICBjb25mdGVzdC5jIC1sdXRpbCAgID4mNQorL3RtcC9jY083cERYSS5vOiBJbiBmdW5jdGlvbiBgbWFpbic6L2hvbWUvZG1pdHJpeXovc3JjLWxjbC9hbmRyb2lkLXg4Ni9kZXZpY2UvdG9vbHMvZ3J1Yi0wLjk3L2NvbmZ0ZXN0LmM6MzA6IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYG9wZW5kaXNrJworY29sbGVjdDI6IGxkIHJldHVybmVkIDEgZXhpdCBzdGF0dXMKK2NvbmZpZ3VyZTo0NTk4OiAkPyA9IDEKK2NvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOgorfCAvKiBjb25mZGVmcy5oLiAgKi8KK3wgCit8ICNkZWZpbmUgUEFDS0FHRV9OQU1FICJHUlVCIgorfCAjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiZ3J1YiIKK3wgI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjAuOTciCit8ICNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIkdSVUIgMC45NyIKK3wgI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiYnVnLWdydWJAZ251Lm9yZyIKK3wgI2RlZmluZSBQQUNLQUdFICJncnViIgorfCAjZGVmaW5lIFZFUlNJT04gIjAuOTciCit8ICNkZWZpbmUgQUREUjMyIGFkZHIzMgorfCAjZGVmaW5lIERBVEEzMiBkYXRhMzIKK3wgI2RlZmluZSBIQVZFX1VTQ09SRV9TVEFSVF9TWU1CT0wgMQorfCAjZGVmaW5lIEhBVkVfVVNDT1JFX1VTQ09SRV9CU1NfU1RBUlRfU1lNQk9MIDEKK3wgI2RlZmluZSBIQVZFX1VTQ09SRV9FREFUQV9TWU1CT0wgMQorfCAjZGVmaW5lIEhBVkVfRURBVEFfU1lNQk9MIDEKK3wgI2RlZmluZSBIQVZFX0VORF9TWU1CT0wgMQorfCAjZGVmaW5lIEhBVkVfVVNDT1JFX0VORF9TWU1CT0wgMQorfCAvKiBlbmQgY29uZmRlZnMuaC4gICovCit8IAorfCAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworfCAjaWZkZWYgX19jcGx1c3BsdXMKK3wgZXh0ZXJuICJDIgorfCAjZW5kaWYKK3wgLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorfCAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworfCBjaGFyIG9wZW5kaXNrICgpOworfCBpbnQKK3wgbWFpbiAoKQorfCB7Cit8IG9wZW5kaXNrICgpOworfCAgIDsKK3wgICByZXR1cm4gMDsKK3wgfQorY29uZmlndXJlOjQ2MjQ6IHJlc3VsdDogbm8KK2NvbmZpZ3VyZTo0NjM4OiBjaGVja2luZyBmb3Igd2dldGNoIGluIC1sbmN1cnNlcworY29uZmlndXJlOjQ2Njg6IGdjYyAtbyBjb25mdGVzdCAtbTMyIC1nICAtV2FsbCAtV21pc3NpbmctcHJvdG90eXBlcyAtV3VudXNlZCAtV3NoYWRvdyAtV3BvaW50ZXItYXJpdGggLWZhbGlnbi1qdW1wcz0xIC1mYWxpZ24tbG9vcHM9MSAtZmFsaWduLWZ1bmN0aW9ucz0xIC1XdW5kZWYgIGNvbmZ0ZXN0LmMgLWxuY3Vyc2VzICAgPiY1Citjb25maWd1cmU6NDY3NDogJD8gPSAwCitjb25maWd1cmU6NDY3ODogdGVzdCAteiAKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCitjb25maWd1cmU6NDY4MTogJD8gPSAwCitjb25maWd1cmU6NDY4NDogdGVzdCAtcyBjb25mdGVzdAorY29uZmlndXJlOjQ2ODc6ICQ/ID0gMAorY29uZmlndXJlOjQ3MDA6IHJlc3VsdDogeWVzCitjb25maWd1cmU6NDc5NTogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IKK2NvbmZpZ3VyZTo0ODMwOiBnY2MgLUUgIC1XYWxsIC1XbWlzc2luZy1wcm90b3R5cGVzIC1XdW51c2VkIC1Xc2hhZG93IC1XcG9pbnRlci1hcml0aCAtZmFsaWduLWp1bXBzPTEgLWZhbGlnbi1sb29wcz0xIC1mYWxpZ24tZnVuY3Rpb25zPTEgLVd1bmRlZiBjb25mdGVzdC5jCitjb25maWd1cmU6NDgzNjogJD8gPSAwCitjb25maWd1cmU6NDg2ODogZ2NjIC1FICAtV2FsbCAtV21pc3NpbmctcHJvdG90eXBlcyAtV3VudXNlZCAtV3NoYWRvdyAtV3BvaW50ZXItYXJpdGggLWZhbGlnbi1qdW1wcz0xIC1mYWxpZ24tbG9vcHM9MSAtZmFsaWduLWZ1bmN0aW9ucz0xIC1XdW5kZWYgY29uZnRlc3QuYworY29uZnRlc3QuYzoyMDoyODogZXJyb3I6IGFjX25vbmV4aXN0ZW50Lmg6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKK2NvbmZpZ3VyZTo0ODc0OiAkPyA9IDEKK2NvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOgorfCAvKiBjb25mZGVmcy5oLiAgKi8KK3wgCit8ICNkZWZpbmUgUEFDS0FHRV9OQU1FICJHUlVCIgorfCAjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiZ3J1YiIKK3wgI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjAuOTciCit8ICNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIkdSVUIgMC45NyIKK3wgI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiYnVnLWdydWJAZ251Lm9yZyIKK3wgI2RlZmluZSBQQUNLQUdFICJncnViIgorfCAjZGVmaW5lIFZFUlNJT04gIjAuOTciCit8ICNkZWZpbmUgQUREUjMyIGFkZHIzMgorfCAjZGVmaW5lIERBVEEzMiBkYXRhMzIKK3wgI2RlZmluZSBIQVZFX1VTQ09SRV9TVEFSVF9TWU1CT0wgMQorfCAjZGVmaW5lIEhBVkVfVVNDT1JFX1VTQ09SRV9CU1NfU1RBUlRfU1lNQk9MIDEKK3wgI2RlZmluZSBIQVZFX1VTQ09SRV9FREFUQV9TWU1CT0wgMQorfCAjZGVmaW5lIEhBVkVfRURBVEFfU1lNQk9MIDEKK3wgI2RlZmluZSBIQVZFX0VORF9TWU1CT0wgMQorfCAjZGVmaW5lIEhBVkVfVVNDT1JFX0VORF9TWU1CT0wgMQorfCAjZGVmaW5lIEhBVkVfTElCQ1VSU0VTIDEKK3wgLyogZW5kIGNvbmZkZWZzLmguICAqLworfCAjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK2NvbmZpZ3VyZTo0OTEzOiByZXN1bHQ6IGdjYyAtRQorY29uZmlndXJlOjQ5Mzc6IGdjYyAtRSAgLVdhbGwgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVd1bnVzZWQgLVdzaGFkb3cgLVdwb2ludGVyLWFyaXRoIC1mYWxpZ24tanVtcHM9MSAtZmFsaWduLWxvb3BzPTEgLWZhbGlnbi1mdW5jdGlvbnM9MSAtV3VuZGVmIGNvbmZ0ZXN0LmMKK2NvbmZpZ3VyZTo0OTQzOiAkPyA9IDAKK2NvbmZpZ3VyZTo0OTc1OiBnY2MgLUUgIC1XYWxsIC1XbWlzc2luZy1wcm90b3R5cGVzIC1XdW51c2VkIC1Xc2hhZG93IC1XcG9pbnRlci1hcml0aCAtZmFsaWduLWp1bXBzPTEgLWZhbGlnbi1sb29wcz0xIC1mYWxpZ24tZnVuY3Rpb25zPTEgLVd1bmRlZiBjb25mdGVzdC5jCitjb25mdGVzdC5jOjIwOjI4OiBlcnJvcjogYWNfbm9uZXhpc3RlbnQuaDogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorY29uZmlndXJlOjQ5ODE6ICQ/ID0gMQorY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6Cit8IC8qIGNvbmZkZWZzLmguICAqLworfCAKK3wgI2RlZmluZSBQQUNLQUdFX05BTUUgIkdSVUIiCit8ICNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJncnViIgorfCAjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiMC45NyIKK3wgI2RlZmluZSBQQUNLQUdFX1NUUklORyAiR1JVQiAwLjk3IgorfCAjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICJidWctZ3J1YkBnbnUub3JnIgorfCAjZGVmaW5lIFBBQ0tBR0UgImdydWIiCit8ICNkZWZpbmUgVkVSU0lPTiAiMC45NyIKK3wgI2RlZmluZSBBRERSMzIgYWRkcjMyCit8ICNkZWZpbmUgREFUQTMyIGRhdGEzMgorfCAjZGVmaW5lIEhBVkVfVVNDT1JFX1NUQVJUX1NZTUJPTCAxCit8ICNkZWZpbmUgSEFWRV9VU0NPUkVfVVNDT1JFX0JTU19TVEFSVF9TWU1CT0wgMQorfCAjZGVmaW5lIEhBVkVfVVNDT1JFX0VEQVRBX1NZTUJPTCAxCit8ICNkZWZpbmUgSEFWRV9FREFUQV9TWU1CT0wgMQorfCAjZGVmaW5lIEhBVkVfRU5EX1NZTUJPTCAxCit8ICNkZWZpbmUgSEFWRV9VU0NPUkVfRU5EX1NZTUJPTCAxCit8ICNkZWZpbmUgSEFWRV9MSUJDVVJTRVMgMQorfCAvKiBlbmQgY29uZmRlZnMuaC4gICovCit8ICNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgorY29uZmlndXJlOjUwMjU6IGNoZWNraW5nIGZvciBlZ3JlcAorY29uZmlndXJlOjUwMzU6IHJlc3VsdDogZ3JlcCAtRQorY29uZmlndXJlOjUwNDA6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzCitjb25maWd1cmU6NTA2NTogZ2NjIC1jIC1tMzIgLWcgIC1XYWxsIC1XbWlzc2luZy1wcm90b3R5cGVzIC1XdW51c2VkIC1Xc2hhZG93IC1XcG9pbnRlci1hcml0aCAtZmFsaWduLWp1bXBzPTEgLWZhbGlnbi1sb29wcz0xIC1mYWxpZ24tZnVuY3Rpb25zPTEgLVd1bmRlZiBjb25mdGVzdC5jID4mNQorY29uZmlndXJlOjUwNzE6ICQ/ID0gMAorY29uZmlndXJlOjUwNzU6IHRlc3QgLXogCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorY29uZmlndXJlOjUwNzg6ICQ/ID0gMAorY29uZmlndXJlOjUwODE6IHRlc3QgLXMgY29uZnRlc3QubworY29uZmlndXJlOjUwODQ6ICQ/ID0gMAorY29uZmlndXJlOjUxNzM6IGdjYyAtbyBjb25mdGVzdCAtbTMyIC1nICAtV2FsbCAtV21pc3NpbmctcHJvdG90eXBlcyAtV3VudXNlZCAtV3NoYWRvdyAtV3BvaW50ZXItYXJpdGggLWZhbGlnbi1qdW1wcz0xIC1mYWxpZ24tbG9vcHM9MSAtZmFsaWduLWZ1bmN0aW9ucz0xIC1XdW5kZWYgIGNvbmZ0ZXN0LmMgID4mNQorY29uZnRlc3QuYzogSW4gZnVuY3Rpb24gJ21haW4nOgorY29uZnRlc3QuYzozNzogd2FybmluZzogaW1wbGljaXQgZGVjbGFyYXRpb24gb2YgZnVuY3Rpb24gJ2V4aXQnCitjb25mdGVzdC5jOjM3OiB3YXJuaW5nOiBpbmNvbXBhdGlibGUgaW1wbGljaXQgZGVjbGFyYXRpb24gb2YgYnVpbHQtaW4gZnVuY3Rpb24gJ2V4aXQnCitjb25maWd1cmU6NTE3NjogJD8gPSAwCitjb25maWd1cmU6NTE3ODogLi9jb25mdGVzdAorY29uZmlndXJlOjUxODE6ICQ/ID0gMAorY29uZmlndXJlOjUxOTY6IHJlc3VsdDogeWVzCitjb25maWd1cmU6NTIyMDogY2hlY2tpbmcgZm9yIHN5cy90eXBlcy5oCitjb25maWd1cmU6NTIzNjogZ2NjIC1jIC1tMzIgLWcgIC1XYWxsIC1XbWlzc2luZy1wcm90b3R5cGVzIC1XdW51c2VkIC1Xc2hhZG93IC1XcG9pbnRlci1hcml0aCAtZmFsaWduLWp1bXBzPTEgLWZhbGlnbi1sb29wcz0xIC1mYWxpZ24tZnVuY3Rpb25zPTEgLVd1bmRlZiBjb25mdGVzdC5jID4mNQorY29uZnRlc3QuYzoyMjo1OiB3YXJuaW5nOiAiSEFWRV9TWVNfVFlQRVNfSCIgaXMgbm90IGRlZmluZWQKK2NvbmZ0ZXN0LmM6MjU6NTogd2FybmluZzogIkhBVkVfU1lTX1NUQVRfSCIgaXMgbm90IGRlZmluZWQKK2NvbmZ0ZXN0LmM6MzY6NTogd2FybmluZzogIkhBVkVfU1RSSU5HX0giIGlzIG5vdCBkZWZpbmVkCitjb25mdGVzdC5jOjQyOjU6IHdhcm5pbmc6ICJIQVZFX1NUUklOR1NfSCIgaXMgbm90IGRlZmluZWQKK2NvbmZ0ZXN0LmM6NDU6NTogd2FybmluZzogIkhBVkVfSU5UVFlQRVNfSCIgaXMgbm90IGRlZmluZWQKK2NvbmZ0ZXN0LmM6NDg6Njogd2FybmluZzogIkhBVkVfU1RESU5UX0giIGlzIG5vdCBkZWZpbmVkCitjb25mdGVzdC5jOjUyOjU6IHdhcm5pbmc6ICJIQVZFX1VOSVNURF9IIiBpcyBub3QgZGVmaW5lZAorY29uZmlndXJlOjUyNDI6ICQ/ID0gMAorY29uZmlndXJlOjUyNDY6IHRlc3QgLXogCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorY29uZmlndXJlOjUyNDk6ICQ/ID0gMAorY29uZmlndXJlOjUyNTI6IHRlc3QgLXMgY29uZnRlc3QubworY29uZmlndXJlOjUyNTU6ICQ/ID0gMAorY29uZmlndXJlOjUyNjY6IHJlc3VsdDogeWVzCitjb25maWd1cmU6NTIyMDogY2hlY2tpbmcgZm9yIHN5cy9zdGF0LmgKK2NvbmZpZ3VyZTo1MjM2OiBnY2MgLWMgLW0zMiAtZyAgLVdhbGwgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVd1bnVzZWQgLVdzaGFkb3cgLVdwb2ludGVyLWFyaXRoIC1mYWxpZ24tanVtcHM9MSAtZmFsaWduLWxvb3BzPTEgLWZhbGlnbi1mdW5jdGlvbnM9MSAtV3VuZGVmIGNvbmZ0ZXN0LmMgPiY1Citjb25mdGVzdC5jOjI2OjU6IHdhcm5pbmc6ICJIQVZFX1NZU19TVEFUX0giIGlzIG5vdCBkZWZpbmVkCitjb25mdGVzdC5jOjM3OjU6IHdhcm5pbmc6ICJIQVZFX1NUUklOR19IIiBpcyBub3QgZGVmaW5lZAorY29uZnRlc3QuYzo0Mzo1OiB3YXJuaW5nOiAiSEFWRV9TVFJJTkdTX0giIGlzIG5vdCBkZWZpbmVkCitjb25mdGVzdC5jOjQ2OjU6IHdhcm5pbmc6ICJIQVZFX0lOVFRZUEVTX0giIGlzIG5vdCBkZWZpbmVkCitjb25mdGVzdC5jOjQ5OjY6IHdhcm5pbmc6ICJIQVZFX1NURElOVF9IIiBpcyBub3QgZGVmaW5lZAorY29uZnRlc3QuYzo1Mzo1OiB3YXJuaW5nOiAiSEFWRV9VTklTVERfSCIgaXMgbm90IGRlZmluZWQKK2NvbmZpZ3VyZTo1MjQyOiAkPyA9IDAKK2NvbmZpZ3VyZTo1MjQ2OiB0ZXN0IC16IAorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnIKK2NvbmZpZ3VyZTo1MjQ5OiAkPyA9IDAKK2NvbmZpZ3VyZTo1MjUyOiB0ZXN0IC1zIGNvbmZ0ZXN0Lm8KK2NvbmZpZ3VyZTo1MjU1OiAkPyA9IDAKK2NvbmZpZ3VyZTo1MjY2OiByZXN1bHQ6IHllcworY29uZmlndXJlOjUyMjA6IGNoZWNraW5nIGZvciBzdGRsaWIuaAorY29uZmlndXJlOjUyMzY6IGdjYyAtYyAtbTMyIC1nICAtV2FsbCAtV21pc3NpbmctcHJvdG90eXBlcyAtV3VudXNlZCAtV3NoYWRvdyAtV3BvaW50ZXItYXJpdGggLWZhbGlnbi1qdW1wcz0xIC1mYWxpZ24tbG9vcHM9MSAtZmFsaWduLWZ1bmN0aW9ucz0xIC1XdW5kZWYgY29uZnRlc3QuYyA+JjUKK2NvbmZ0ZXN0LmM6Mzg6NTogd2FybmluZzogIkhBVkVfU1RSSU5HX0giIGlzIG5vdCBkZWZpbmVkCitjb25mdGVzdC5jOjQ0OjU6IHdhcm5pbmc6ICJIQVZFX1NUUklOR1NfSCIgaXMgbm90IGRlZmluZWQKK2NvbmZ0ZXN0LmM6NDc6NTogd2FybmluZzogIkhBVkVfSU5UVFlQRVNfSCIgaXMgbm90IGRlZmluZWQKK2NvbmZ0ZXN0LmM6NTA6Njogd2FybmluZzogIkhBVkVfU1RESU5UX0giIGlzIG5vdCBkZWZpbmVkCitjb25mdGVzdC5jOjU0OjU6IHdhcm5pbmc6ICJIQVZFX1VOSVNURF9IIiBpcyBub3QgZGVmaW5lZAorY29uZmlndXJlOjUyNDI6ICQ/ID0gMAorY29uZmlndXJlOjUyNDY6IHRlc3QgLXogCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorY29uZmlndXJlOjUyNDk6ICQ/ID0gMAorY29uZmlndXJlOjUyNTI6IHRlc3QgLXMgY29uZnRlc3QubworY29uZmlndXJlOjUyNTU6ICQ/ID0gMAorY29uZmlndXJlOjUyNjY6IHJlc3VsdDogeWVzCitjb25maWd1cmU6NTIyMDogY2hlY2tpbmcgZm9yIHN0cmluZy5oCitjb25maWd1cmU6NTIzNjogZ2NjIC1jIC1tMzIgLWcgIC1XYWxsIC1XbWlzc2luZy1wcm90b3R5cGVzIC1XdW51c2VkIC1Xc2hhZG93IC1XcG9pbnRlci1hcml0aCAtZmFsaWduLWp1bXBzPTEgLWZhbGlnbi1sb29wcz0xIC1mYWxpZ24tZnVuY3Rpb25zPTEgLVd1bmRlZiBjb25mdGVzdC5jID4mNQorY29uZnRlc3QuYzozOTo1OiB3YXJuaW5nOiAiSEFWRV9TVFJJTkdfSCIgaXMgbm90IGRlZmluZWQKK2NvbmZ0ZXN0LmM6NDU6NTogd2FybmluZzogIkhBVkVfU1RSSU5HU19IIiBpcyBub3QgZGVmaW5lZAorY29uZnRlc3QuYzo0ODo1OiB3YXJuaW5nOiAiSEFWRV9JTlRUWVBFU19IIiBpcyBub3QgZGVmaW5lZAorY29uZnRlc3QuYzo1MTo2OiB3YXJuaW5nOiAiSEFWRV9TVERJTlRfSCIgaXMgbm90IGRlZmluZWQKK2NvbmZ0ZXN0LmM6NTU6NTogd2FybmluZzogIkhBVkVfVU5JU1REX0giIGlzIG5vdCBkZWZpbmVkCitjb25maWd1cmU6NTI0MjogJD8gPSAwCitjb25maWd1cmU6NTI0NjogdGVzdCAteiAKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCitjb25maWd1cmU6NTI0OTogJD8gPSAwCitjb25maWd1cmU6NTI1MjogdGVzdCAtcyBjb25mdGVzdC5vCitjb25maWd1cmU6NTI1NTogJD8gPSAwCitjb25maWd1cmU6NTI2NjogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZTo1MjIwOiBjaGVja2luZyBmb3IgbWVtb3J5LmgKK2NvbmZpZ3VyZTo1MjM2OiBnY2MgLWMgLW0zMiAtZyAgLVdhbGwgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVd1bnVzZWQgLVdzaGFkb3cgLVdwb2ludGVyLWFyaXRoIC1mYWxpZ24tanVtcHM9MSAtZmFsaWduLWxvb3BzPTEgLWZhbGlnbi1mdW5jdGlvbnM9MSAtV3VuZGVmIGNvbmZ0ZXN0LmMgPiY1Citjb25mdGVzdC5jOjQ2OjU6IHdhcm5pbmc6ICJIQVZFX1NUUklOR1NfSCIgaXMgbm90IGRlZmluZWQKK2NvbmZ0ZXN0LmM6NDk6NTogd2FybmluZzogIkhBVkVfSU5UVFlQRVNfSCIgaXMgbm90IGRlZmluZWQKK2NvbmZ0ZXN0LmM6NTI6Njogd2FybmluZzogIkhBVkVfU1RESU5UX0giIGlzIG5vdCBkZWZpbmVkCitjb25mdGVzdC5jOjU2OjU6IHdhcm5pbmc6ICJIQVZFX1VOSVNURF9IIiBpcyBub3QgZGVmaW5lZAorY29uZmlndXJlOjUyNDI6ICQ/ID0gMAorY29uZmlndXJlOjUyNDY6IHRlc3QgLXogCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorY29uZmlndXJlOjUyNDk6ICQ/ID0gMAorY29uZmlndXJlOjUyNTI6IHRlc3QgLXMgY29uZnRlc3QubworY29uZmlndXJlOjUyNTU6ICQ/ID0gMAorY29uZmlndXJlOjUyNjY6IHJlc3VsdDogeWVzCitjb25maWd1cmU6NTIyMDogY2hlY2tpbmcgZm9yIHN0cmluZ3MuaAorY29uZmlndXJlOjUyMzY6IGdjYyAtYyAtbTMyIC1nICAtV2FsbCAtV21pc3NpbmctcHJvdG90eXBlcyAtV3VudXNlZCAtV3NoYWRvdyAtV3BvaW50ZXItYXJpdGggLWZhbGlnbi1qdW1wcz0xIC1mYWxpZ24tbG9vcHM9MSAtZmFsaWduLWZ1bmN0aW9ucz0xIC1XdW5kZWYgY29uZnRlc3QuYyA+JjUKK2NvbmZ0ZXN0LmM6NDc6NTogd2FybmluZzogIkhBVkVfU1RSSU5HU19IIiBpcyBub3QgZGVmaW5lZAorY29uZnRlc3QuYzo1MDo1OiB3YXJuaW5nOiAiSEFWRV9JTlRUWVBFU19IIiBpcyBub3QgZGVmaW5lZAorY29uZnRlc3QuYzo1Mzo2OiB3YXJuaW5nOiAiSEFWRV9TVERJTlRfSCIgaXMgbm90IGRlZmluZWQKK2NvbmZ0ZXN0LmM6NTc6NTogd2FybmluZzogIkhBVkVfVU5JU1REX0giIGlzIG5vdCBkZWZpbmVkCitjb25maWd1cmU6NTI0MjogJD8gPSAwCitjb25maWd1cmU6NTI0NjogdGVzdCAteiAKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCitjb25maWd1cmU6NTI0OTogJD8gPSAwCitjb25maWd1cmU6NTI1MjogdGVzdCAtcyBjb25mdGVzdC5vCitjb25maWd1cmU6NTI1NTogJD8gPSAwCitjb25maWd1cmU6NTI2NjogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZTo1MjIwOiBjaGVja2luZyBmb3IgaW50dHlwZXMuaAorY29uZmlndXJlOjUyMzY6IGdjYyAtYyAtbTMyIC1nICAtV2FsbCAtV21pc3NpbmctcHJvdG90eXBlcyAtV3VudXNlZCAtV3NoYWRvdyAtV3BvaW50ZXItYXJpdGggLWZhbGlnbi1qdW1wcz0xIC1mYWxpZ24tbG9vcHM9MSAtZmFsaWduLWZ1bmN0aW9ucz0xIC1XdW5kZWYgY29uZnRlc3QuYyA+JjUKK2NvbmZ0ZXN0LmM6NTE6NTogd2FybmluZzogIkhBVkVfSU5UVFlQRVNfSCIgaXMgbm90IGRlZmluZWQKK2NvbmZ0ZXN0LmM6NTQ6Njogd2FybmluZzogIkhBVkVfU1RESU5UX0giIGlzIG5vdCBkZWZpbmVkCitjb25mdGVzdC5jOjU4OjU6IHdhcm5pbmc6ICJIQVZFX1VOSVNURF9IIiBpcyBub3QgZGVmaW5lZAorY29uZmlndXJlOjUyNDI6ICQ/ID0gMAorY29uZmlndXJlOjUyNDY6IHRlc3QgLXogCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorY29uZmlndXJlOjUyNDk6ICQ/ID0gMAorY29uZmlndXJlOjUyNTI6IHRlc3QgLXMgY29uZnRlc3QubworY29uZmlndXJlOjUyNTU6ICQ/ID0gMAorY29uZmlndXJlOjUyNjY6IHJlc3VsdDogeWVzCitjb25maWd1cmU6NTIyMDogY2hlY2tpbmcgZm9yIHN0ZGludC5oCitjb25maWd1cmU6NTIzNjogZ2NjIC1jIC1tMzIgLWcgIC1XYWxsIC1XbWlzc2luZy1wcm90b3R5cGVzIC1XdW51c2VkIC1Xc2hhZG93IC1XcG9pbnRlci1hcml0aCAtZmFsaWduLWp1bXBzPTEgLWZhbGlnbi1sb29wcz0xIC1mYWxpZ24tZnVuY3Rpb25zPTEgLVd1bmRlZiBjb25mdGVzdC5jID4mNQorY29uZnRlc3QuYzo1OTo1OiB3YXJuaW5nOiAiSEFWRV9VTklTVERfSCIgaXMgbm90IGRlZmluZWQKK2NvbmZpZ3VyZTo1MjQyOiAkPyA9IDAKK2NvbmZpZ3VyZTo1MjQ2OiB0ZXN0IC16IAorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnIKK2NvbmZpZ3VyZTo1MjQ5OiAkPyA9IDAKK2NvbmZpZ3VyZTo1MjUyOiB0ZXN0IC1zIGNvbmZ0ZXN0Lm8KK2NvbmZpZ3VyZTo1MjU1OiAkPyA9IDAKK2NvbmZpZ3VyZTo1MjY2OiByZXN1bHQ6IHllcworY29uZmlndXJlOjUyMjA6IGNoZWNraW5nIGZvciB1bmlzdGQuaAorY29uZmlndXJlOjUyMzY6IGdjYyAtYyAtbTMyIC1nICAtV2FsbCAtV21pc3NpbmctcHJvdG90eXBlcyAtV3VudXNlZCAtV3NoYWRvdyAtV3BvaW50ZXItYXJpdGggLWZhbGlnbi1qdW1wcz0xIC1mYWxpZ24tbG9vcHM9MSAtZmFsaWduLWZ1bmN0aW9ucz0xIC1XdW5kZWYgY29uZnRlc3QuYyA+JjUKK2NvbmZ0ZXN0LmM6NjA6NTogd2FybmluZzogIkhBVkVfVU5JU1REX0giIGlzIG5vdCBkZWZpbmVkCitjb25maWd1cmU6NTI0MjogJD8gPSAwCitjb25maWd1cmU6NTI0NjogdGVzdCAteiAKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCitjb25maWd1cmU6NTI0OTogJD8gPSAwCitjb25maWd1cmU6NTI1MjogdGVzdCAtcyBjb25mdGVzdC5vCitjb25maWd1cmU6NTI1NTogJD8gPSAwCitjb25maWd1cmU6NTI2NjogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZTo1Mjg3OiBjaGVja2luZyBmb3Igc3RyaW5nLmgKK2NvbmZpZ3VyZTo1MjkyOiByZXN1bHQ6IHllcworY29uZmlndXJlOjUyODc6IGNoZWNraW5nIGZvciBzdHJpbmdzLmgKK2NvbmZpZ3VyZTo1MjkyOiByZXN1bHQ6IHllcworY29uZmlndXJlOjUyOTY6IGNoZWNraW5nIG5jdXJzZXMvY3Vyc2VzLmggdXNhYmlsaXR5Citjb25maWd1cmU6NTMwODogZ2NjIC1jIC1tMzIgLWcgIC1XYWxsIC1XbWlzc2luZy1wcm90b3R5cGVzIC1XdW51c2VkIC1Xc2hhZG93IC1XcG9pbnRlci1hcml0aCAtZmFsaWduLWp1bXBzPTEgLWZhbGlnbi1sb29wcz0xIC1mYWxpZ24tZnVuY3Rpb25zPTEgLVd1bmRlZiBjb25mdGVzdC5jID4mNQorY29uZnRlc3QuYzo2NjoyODogZXJyb3I6IG5jdXJzZXMvY3Vyc2VzLmg6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKK2NvbmZpZ3VyZTo1MzE0OiAkPyA9IDEKK2NvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOgorfCAvKiBjb25mZGVmcy5oLiAgKi8KK3wgCit8ICNkZWZpbmUgUEFDS0FHRV9OQU1FICJHUlVCIgorfCAjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiZ3J1YiIKK3wgI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjAuOTciCit8ICNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIkdSVUIgMC45NyIKK3wgI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiYnVnLWdydWJAZ251Lm9yZyIKK3wgI2RlZmluZSBQQUNLQUdFICJncnViIgorfCAjZGVmaW5lIFZFUlNJT04gIjAuOTciCit8ICNkZWZpbmUgQUREUjMyIGFkZHIzMgorfCAjZGVmaW5lIERBVEEzMiBkYXRhMzIKK3wgI2RlZmluZSBIQVZFX1VTQ09SRV9TVEFSVF9TWU1CT0wgMQorfCAjZGVmaW5lIEhBVkVfVVNDT1JFX1VTQ09SRV9CU1NfU1RBUlRfU1lNQk9MIDEKK3wgI2RlZmluZSBIQVZFX1VTQ09SRV9FREFUQV9TWU1CT0wgMQorfCAjZGVmaW5lIEhBVkVfRURBVEFfU1lNQk9MIDEKK3wgI2RlZmluZSBIQVZFX0VORF9TWU1CT0wgMQorfCAjZGVmaW5lIEhBVkVfVVNDT1JFX0VORF9TWU1CT0wgMQorfCAjZGVmaW5lIEhBVkVfTElCQ1VSU0VTIDEKK3wgI2RlZmluZSBTVERDX0hFQURFUlMgMQorfCAjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQorfCAjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCit8ICNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCit8ICNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCit8ICNkZWZpbmUgSEFWRV9NRU1PUllfSCAxCit8ICNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQorfCAjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCit8ICNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCit8ICNkZWZpbmUgSEFWRV9VTklTVERfSCAxCit8ICNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCit8ICNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQorfCAvKiBlbmQgY29uZmRlZnMuaC4gICovCit8ICNpbmNsdWRlIDxzdGRpby5oPgorfCAjaWYgSEFWRV9TWVNfVFlQRVNfSAorfCAjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorfCAjZW5kaWYKK3wgI2lmIEhBVkVfU1lTX1NUQVRfSAorfCAjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+Cit8ICNlbmRpZgorfCAjaWYgU1REQ19IRUFERVJTCit8ICMgaW5jbHVkZSA8c3RkbGliLmg+Cit8ICMgaW5jbHVkZSA8c3RkZGVmLmg+Cit8ICNlbHNlCit8ICMgaWYgSEFWRV9TVERMSUJfSAorfCAjICBpbmNsdWRlIDxzdGRsaWIuaD4KK3wgIyBlbmRpZgorfCAjZW5kaWYKK3wgI2lmIEhBVkVfU1RSSU5HX0gKK3wgIyBpZiAhU1REQ19IRUFERVJTICYmIEhBVkVfTUVNT1JZX0gKK3wgIyAgaW5jbHVkZSA8bWVtb3J5Lmg+Cit8ICMgZW5kaWYKK3wgIyBpbmNsdWRlIDxzdHJpbmcuaD4KK3wgI2VuZGlmCit8ICNpZiBIQVZFX1NUUklOR1NfSAorfCAjIGluY2x1ZGUgPHN0cmluZ3MuaD4KK3wgI2VuZGlmCit8ICNpZiBIQVZFX0lOVFRZUEVTX0gKK3wgIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgorfCAjZWxzZQorfCAjIGlmIEhBVkVfU1RESU5UX0gKK3wgIyAgaW5jbHVkZSA8c3RkaW50Lmg+Cit8ICMgZW5kaWYKK3wgI2VuZGlmCit8ICNpZiBIQVZFX1VOSVNURF9ICit8ICMgaW5jbHVkZSA8dW5pc3RkLmg+Cit8ICNlbmRpZgorfCAjaW5jbHVkZSA8bmN1cnNlcy9jdXJzZXMuaD4KK2NvbmZpZ3VyZTo1MzM3OiByZXN1bHQ6IG5vCitjb25maWd1cmU6NTM0MTogY2hlY2tpbmcgbmN1cnNlcy9jdXJzZXMuaCBwcmVzZW5jZQorY29uZmlndXJlOjUzNTE6IGdjYyAtRSAgLVdhbGwgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVd1bnVzZWQgLVdzaGFkb3cgLVdwb2ludGVyLWFyaXRoIC1mYWxpZ24tanVtcHM9MSAtZmFsaWduLWxvb3BzPTEgLWZhbGlnbi1mdW5jdGlvbnM9MSAtV3VuZGVmIGNvbmZ0ZXN0LmMKK2NvbmZ0ZXN0LmM6MzI6Mjg6IGVycm9yOiBuY3Vyc2VzL2N1cnNlcy5oOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5Citjb25maWd1cmU6NTM1NzogJD8gPSAxCitjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoKK3wgLyogY29uZmRlZnMuaC4gICovCit8IAorfCAjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiR1JVQiIKK3wgI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgImdydWIiCit8ICNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIwLjk3IgorfCAjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJHUlVCIDAuOTciCit8ICNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgImJ1Zy1ncnViQGdudS5vcmciCit8ICNkZWZpbmUgUEFDS0FHRSAiZ3J1YiIKK3wgI2RlZmluZSBWRVJTSU9OICIwLjk3IgorfCAjZGVmaW5lIEFERFIzMiBhZGRyMzIKK3wgI2RlZmluZSBEQVRBMzIgZGF0YTMyCit8ICNkZWZpbmUgSEFWRV9VU0NPUkVfU1RBUlRfU1lNQk9MIDEKK3wgI2RlZmluZSBIQVZFX1VTQ09SRV9VU0NPUkVfQlNTX1NUQVJUX1NZTUJPTCAxCit8ICNkZWZpbmUgSEFWRV9VU0NPUkVfRURBVEFfU1lNQk9MIDEKK3wgI2RlZmluZSBIQVZFX0VEQVRBX1NZTUJPTCAxCit8ICNkZWZpbmUgSEFWRV9FTkRfU1lNQk9MIDEKK3wgI2RlZmluZSBIQVZFX1VTQ09SRV9FTkRfU1lNQk9MIDEKK3wgI2RlZmluZSBIQVZFX0xJQkNVUlNFUyAxCit8ICNkZWZpbmUgU1REQ19IRUFERVJTIDEKK3wgI2RlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKK3wgI2RlZmluZSBIQVZFX1NZU19TVEFUX0ggMQorfCAjZGVmaW5lIEhBVkVfU1RETElCX0ggMQorfCAjZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQorfCAjZGVmaW5lIEhBVkVfTUVNT1JZX0ggMQorfCAjZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKK3wgI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQorfCAjZGVmaW5lIEhBVkVfU1RESU5UX0ggMQorfCAjZGVmaW5lIEhBVkVfVU5JU1REX0ggMQorfCAjZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQorfCAjZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKK3wgLyogZW5kIGNvbmZkZWZzLmguICAqLworfCAjaW5jbHVkZSA8bmN1cnNlcy9jdXJzZXMuaD4KK2NvbmZpZ3VyZTo1Mzc3OiByZXN1bHQ6IG5vCitjb25maWd1cmU6NTQxMjogY2hlY2tpbmcgZm9yIG5jdXJzZXMvY3Vyc2VzLmgKK2NvbmZpZ3VyZTo1NDE5OiByZXN1bHQ6IG5vCitjb25maWd1cmU6NTI5NjogY2hlY2tpbmcgbmN1cnNlcy5oIHVzYWJpbGl0eQorY29uZmlndXJlOjUzMDg6IGdjYyAtYyAtbTMyIC1nICAtV2FsbCAtV21pc3NpbmctcHJvdG90eXBlcyAtV3VudXNlZCAtV3NoYWRvdyAtV3BvaW50ZXItYXJpdGggLWZhbGlnbi1qdW1wcz0xIC1mYWxpZ24tbG9vcHM9MSAtZmFsaWduLWZ1bmN0aW9ucz0xIC1XdW5kZWYgY29uZnRlc3QuYyA+JjUKK2NvbmZpZ3VyZTo1MzE0OiAkPyA9IDAKK2NvbmZpZ3VyZTo1MzE4OiB0ZXN0IC16IAorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnIKK2NvbmZpZ3VyZTo1MzIxOiAkPyA9IDAKK2NvbmZpZ3VyZTo1MzI0OiB0ZXN0IC1zIGNvbmZ0ZXN0Lm8KK2NvbmZpZ3VyZTo1MzI3OiAkPyA9IDAKK2NvbmZpZ3VyZTo1MzM3OiByZXN1bHQ6IHllcworY29uZmlndXJlOjUzNDE6IGNoZWNraW5nIG5jdXJzZXMuaCBwcmVzZW5jZQorY29uZmlndXJlOjUzNTE6IGdjYyAtRSAgLVdhbGwgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVd1bnVzZWQgLVdzaGFkb3cgLVdwb2ludGVyLWFyaXRoIC1mYWxpZ24tanVtcHM9MSAtZmFsaWduLWxvb3BzPTEgLWZhbGlnbi1mdW5jdGlvbnM9MSAtV3VuZGVmIGNvbmZ0ZXN0LmMKK2NvbmZpZ3VyZTo1MzU3OiAkPyA9IDAKK2NvbmZpZ3VyZTo1Mzc3OiByZXN1bHQ6IHllcworY29uZmlndXJlOjU0MTI6IGNoZWNraW5nIGZvciBuY3Vyc2VzLmgKK2NvbmZpZ3VyZTo1NDE5OiByZXN1bHQ6IHllcworY29uZmlndXJlOjUyOTY6IGNoZWNraW5nIGN1cnNlcy5oIHVzYWJpbGl0eQorY29uZmlndXJlOjUzMDg6IGdjYyAtYyAtbTMyIC1nICAtV2FsbCAtV21pc3NpbmctcHJvdG90eXBlcyAtV3VudXNlZCAtV3NoYWRvdyAtV3BvaW50ZXItYXJpdGggLWZhbGlnbi1qdW1wcz0xIC1mYWxpZ24tbG9vcHM9MSAtZmFsaWduLWZ1bmN0aW9ucz0xIC1XdW5kZWYgY29uZnRlc3QuYyA+JjUKK2NvbmZpZ3VyZTo1MzE0OiAkPyA9IDAKK2NvbmZpZ3VyZTo1MzE4OiB0ZXN0IC16IAorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnIKK2NvbmZpZ3VyZTo1MzIxOiAkPyA9IDAKK2NvbmZpZ3VyZTo1MzI0OiB0ZXN0IC1zIGNvbmZ0ZXN0Lm8KK2NvbmZpZ3VyZTo1MzI3OiAkPyA9IDAKK2NvbmZpZ3VyZTo1MzM3OiByZXN1bHQ6IHllcworY29uZmlndXJlOjUzNDE6IGNoZWNraW5nIGN1cnNlcy5oIHByZXNlbmNlCitjb25maWd1cmU6NTM1MTogZ2NjIC1FICAtV2FsbCAtV21pc3NpbmctcHJvdG90eXBlcyAtV3VudXNlZCAtV3NoYWRvdyAtV3BvaW50ZXItYXJpdGggLWZhbGlnbi1qdW1wcz0xIC1mYWxpZ24tbG9vcHM9MSAtZmFsaWduLWZ1bmN0aW9ucz0xIC1XdW5kZWYgY29uZnRlc3QuYworY29uZmlndXJlOjUzNTc6ICQ/ID0gMAorY29uZmlndXJlOjUzNzc6IHJlc3VsdDogeWVzCitjb25maWd1cmU6NTQxMjogY2hlY2tpbmcgZm9yIGN1cnNlcy5oCitjb25maWd1cmU6NTQxOTogcmVzdWx0OiB5ZXMKK2NvbmZpZ3VyZTo2MDcyOiBnY2MgLW0zMiAtZyBjb25mdGVzdC5jIC1vIGNvbmZ0ZXN0Citjb25maWd1cmU6NjA3NTogJD8gPSAwCitjb25maWd1cmU6NjMwNTogY3JlYXRpbmcgLi9jb25maWcuc3RhdHVzCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIFJ1bm5pbmcgY29uZmlnLnN0YXR1cy4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworVGhpcyBmaWxlIHdhcyBleHRlbmRlZCBieSBHUlVCIGNvbmZpZy5zdGF0dXMgMC45Nywgd2hpY2ggd2FzCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNTkuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKKworICBDT05GSUdfRklMRVMgICAgPSAKKyAgQ09ORklHX0hFQURFUlMgID0gCisgIENPTkZJR19MSU5LUyAgICA9IAorICBDT05GSUdfQ09NTUFORFMgPSAKKyAgJCAuL2NvbmZpZy5zdGF0dXMgCisKK29uIHdlcHBhcmQuY29ycC5nb29nbGUuY29tCisKK2NvbmZpZy5zdGF0dXM6NzM5OiBjcmVhdGluZyBNYWtlZmlsZQorY29uZmlnLnN0YXR1czo3Mzk6IGNyZWF0aW5nIHN0YWdlMS9NYWtlZmlsZQorY29uZmlnLnN0YXR1czo3Mzk6IGNyZWF0aW5nIHN0YWdlMi9NYWtlZmlsZQorY29uZmlnLnN0YXR1czo3Mzk6IGNyZWF0aW5nIGRvY3MvTWFrZWZpbGUKK2NvbmZpZy5zdGF0dXM6NzM5OiBjcmVhdGluZyBsaWIvTWFrZWZpbGUKK2NvbmZpZy5zdGF0dXM6NzM5OiBjcmVhdGluZyB1dGlsL01ha2VmaWxlCitjb25maWcuc3RhdHVzOjczOTogY3JlYXRpbmcgZ3J1Yi9NYWtlZmlsZQorY29uZmlnLnN0YXR1czo3Mzk6IGNyZWF0aW5nIG5ldGJvb3QvTWFrZWZpbGUKK2NvbmZpZy5zdGF0dXM6NzM5OiBjcmVhdGluZyB1dGlsL2dydWItaW1hZ2UKK2NvbmZpZy5zdGF0dXM6NzM5OiBjcmVhdGluZyB1dGlsL2dydWItaW5zdGFsbAorY29uZmlnLnN0YXR1czo3Mzk6IGNyZWF0aW5nIHV0aWwvZ3J1Yi1tZDUtY3J5cHQKK2NvbmZpZy5zdGF0dXM6NzM5OiBjcmVhdGluZyB1dGlsL2dydWItdGVybWluZm8KK2NvbmZpZy5zdGF0dXM6NzM5OiBjcmVhdGluZyB1dGlsL2dydWItc2V0LWRlZmF1bHQKK2NvbmZpZy5zdGF0dXM6ODQzOiBjcmVhdGluZyBjb25maWcuaAorY29uZmlnLnN0YXR1czoxMTU3OiBleGVjdXRpbmcgZGVwZmlsZXMgY29tbWFuZHMKKworIyMgLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgQ2FjaGUgdmFyaWFibGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLSAjIworCithY19jdl9idWlsZD14ODZfNjQtdW5rbm93bi1saW51eC1nbnUKK2FjX2N2X2J1aWxkX2FsaWFzPXg4Nl82NC11bmtub3duLWxpbnV4LWdudQorYWNfY3ZfY19jb21waWxlcl9nbnU9eWVzCithY19jdl9lbnZfQ0Nfc2V0PQorYWNfY3ZfZW52X0NDX3ZhbHVlPQorYWNfY3ZfZW52X0NGTEFHU19zZXQ9CithY19jdl9lbnZfQ0ZMQUdTX3ZhbHVlPQorYWNfY3ZfZW52X0NQUEZMQUdTX3NldD0KK2FjX2N2X2Vudl9DUFBGTEFHU192YWx1ZT0KK2FjX2N2X2Vudl9DUFBfc2V0PQorYWNfY3ZfZW52X0NQUF92YWx1ZT0KK2FjX2N2X2Vudl9MREZMQUdTX3NldD0KK2FjX2N2X2Vudl9MREZMQUdTX3ZhbHVlPQorYWNfY3ZfZW52X2J1aWxkX2FsaWFzX3NldD0KK2FjX2N2X2Vudl9idWlsZF9hbGlhc192YWx1ZT0KK2FjX2N2X2Vudl9ob3N0X2FsaWFzX3NldD0KK2FjX2N2X2Vudl9ob3N0X2FsaWFzX3ZhbHVlPQorYWNfY3ZfZW52X3RhcmdldF9hbGlhc19zZXQ9CithY19jdl9lbnZfdGFyZ2V0X2FsaWFzX3ZhbHVlPQorYWNfY3ZfZXhlZXh0PQorYWNfY3ZfaGVhZGVyX2N1cnNlc19oPXllcworYWNfY3ZfaGVhZGVyX2ludHR5cGVzX2g9eWVzCithY19jdl9oZWFkZXJfbWVtb3J5X2g9eWVzCithY19jdl9oZWFkZXJfbmN1cnNlc19jdXJzZXNfaD1ubworYWNfY3ZfaGVhZGVyX25jdXJzZXNfaD15ZXMKK2FjX2N2X2hlYWRlcl9zdGRjPXllcworYWNfY3ZfaGVhZGVyX3N0ZGludF9oPXllcworYWNfY3ZfaGVhZGVyX3N0ZGxpYl9oPXllcworYWNfY3ZfaGVhZGVyX3N0cmluZ19oPXllcworYWNfY3ZfaGVhZGVyX3N0cmluZ3NfaD15ZXMKK2FjX2N2X2hlYWRlcl9zeXNfc3RhdF9oPXllcworYWNfY3ZfaGVhZGVyX3N5c190eXBlc19oPXllcworYWNfY3ZfaGVhZGVyX3VuaXN0ZF9oPXllcworYWNfY3ZfaG9zdD14ODZfNjQtdW5rbm93bi1saW51eC1nbnUKK2FjX2N2X2hvc3RfYWxpYXM9eDg2XzY0LXVua25vd24tbGludXgtZ251CithY19jdl9saWJfbmN1cnNlc193Z2V0Y2g9eWVzCithY19jdl9saWJfdXRpbF9vcGVuZGlzaz1ubworYWNfY3Zfb2JqZXh0PW8KK2FjX2N2X3BhdGhfaW5zdGFsbD0nL3Vzci9iaW4vaW5zdGFsbCAtYycKK2FjX2N2X3Byb2dfQVdLPWdhd2sKK2FjX2N2X3Byb2dfQ1BQPSdnY2MgLUUnCithY19jdl9wcm9nX2FjX2N0X0NDPWdjYworYWNfY3ZfcHJvZ19hY19jdF9PQkpDT1BZPW9iamNvcHkKK2FjX2N2X3Byb2dfYWNfY3RfUkFOTElCPXJhbmxpYgorYWNfY3ZfcHJvZ19jY19nPXllcworYWNfY3ZfcHJvZ19jY19zdGRjPQorYWNfY3ZfcHJvZ19lZ3JlcD0nZ3JlcCAtRScKK2FjX2N2X3Byb2dfbWFrZV9tYWtlX3NldD15ZXMKK2FtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPWdjYzMKK2dydWJfY3ZfYXNtX2Fic29sdXRlX3dpdGhvdXRfYXN0ZXJpc2s9bm8KK2dydWJfY3ZfYXNtX2FkZHIzMj15ZXMKK2dydWJfY3ZfYXNtX3ByZWZpeF9yZXF1aXJlbWVudD15ZXMKK2dydWJfY3ZfYXNtX3VzY29yZT1ubworZ3J1Yl9jdl9jaGVja19lZGF0YV9zeW1ib2w9eWVzCitncnViX2N2X2NoZWNrX2VuZF9zeW1ib2w9eWVzCitncnViX2N2X2NoZWNrX3N0YXJ0X3N5bWJvbD1ubworZ3J1Yl9jdl9jaGVja191c2NvcmVfZWRhdGFfc3ltYm9sPXllcworZ3J1Yl9jdl9jaGVja191c2NvcmVfZW5kX3N5bWJvbD15ZXMKK2dydWJfY3ZfY2hlY2tfdXNjb3JlX3N0YXJ0X3N5bWJvbD15ZXMKK2dydWJfY3ZfY2hlY2tfdXNjb3JlX3VzY29yZV9ic3Nfc3RhcnRfc3ltYm9sPXllcworZ3J1Yl9jdl9wcm9nX29iamNvcHlfYWJzb2x1dGU9eWVzCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBPdXRwdXQgdmFyaWFibGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworQUNMT0NBTD0nJHtTSEVMTH0gL2hvbWUvZG1pdHJpeXovc3JjLWxjbC9hbmRyb2lkLXg4Ni9kZXZpY2UvdG9vbHMvZ3J1Yi0wLjk3L21pc3NpbmcgLS1ydW4gYWNsb2NhbC0xLjknCitBTURFUEJBQ0tTTEFTSD0nXCcKK0FNREVQX0ZBTFNFPScjJworQU1ERVBfVFJVRT0nJworQU1UQVI9JyR7U0hFTEx9IC9ob21lL2RtaXRyaXl6L3NyYy1sY2wvYW5kcm9pZC14ODYvZGV2aWNlL3Rvb2xzL2dydWItMC45Ny9taXNzaW5nIC0tcnVuIHRhcicKK0FVVE9DT05GPScke1NIRUxMfSAvaG9tZS9kbWl0cml5ei9zcmMtbGNsL2FuZHJvaWQteDg2L2RldmljZS90b29scy9ncnViLTAuOTcvbWlzc2luZyAtLXJ1biBhdXRvY29uZicKK0FVVE9IRUFERVI9JyR7U0hFTEx9IC9ob21lL2RtaXRyaXl6L3NyYy1sY2wvYW5kcm9pZC14ODYvZGV2aWNlL3Rvb2xzL2dydWItMC45Ny9taXNzaW5nIC0tcnVuIGF1dG9oZWFkZXInCitBVVRPTUFLRT0nJHtTSEVMTH0gL2hvbWUvZG1pdHJpeXovc3JjLWxjbC9hbmRyb2lkLXg4Ni9kZXZpY2UvdG9vbHMvZ3J1Yi0wLjk3L21pc3NpbmcgLS1ydW4gYXV0b21ha2UtMS45JworQVdLPSdnYXdrJworQlVJTERfRVhBTVBMRV9LRVJORUxfRkFMU0U9JycKK0JVSUxEX0VYQU1QTEVfS0VSTkVMX1RSVUU9JyMnCitDQz0nZ2NjJworQ0NBUz0nZ2NjJworQ0NBU0ZMQUdTPSckKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChDUFBGTEFHUykgJChDRkxBR1MpJworQ0NERVBNT0RFPSdkZXBtb2RlPWdjYzMnCitDRkxBR1M9Jy1tMzIgLWcnCitDUFA9J2djYyAtRScKK0NQUEZMQUdTPScgLVdhbGwgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVd1bnVzZWQgLVdzaGFkb3cgLVdwb2ludGVyLWFyaXRoIC1mYWxpZ24tanVtcHM9MSAtZmFsaWduLWxvb3BzPTEgLWZhbGlnbi1mdW5jdGlvbnM9MSAtV3VuZGVmJworQ1lHUEFUSF9XPSdlY2hvJworREVGUz0nLURIQVZFX0NPTkZJR19IJworREVQRElSPScuZGVwcycKK0RJU0tMRVNTX1NVUFBPUlRfRkFMU0U9JycKK0RJU0tMRVNTX1NVUFBPUlRfVFJVRT0nIycKK0VDSE9fQz0nJworRUNIT19OPSctbicKK0VDSE9fVD0nJworRUdSRVA9J2dyZXAgLUUnCitFWEVFWFQ9JycKK0ZTWVNfQ0ZMQUdTPScgLURGU1lTX0VYVDJGUz0xIC1ERlNZU19GQVQ9MSAtRFVTRV9NRDVfUEFTU1dPUkRTPTEnCitHUlVCX0NGTEFHUz0nLU8yJworR1JVQl9MSUJTPScgLWxuY3Vyc2VzJworSEVSQ1VMRVNfU1VQUE9SVF9GQUxTRT0nIycKK0hFUkNVTEVTX1NVUFBPUlRfVFJVRT0nJworSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKK0lOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKK0lOU1RBTExfU0NSSVBUPScke0lOU1RBTEx9JworSU5TVEFMTF9TVFJJUF9QUk9HUkFNPScke1NIRUxMfSAkKGluc3RhbGxfc2gpIC1jIC1zJworTERGTEFHUz0nJworTElCT0JKUz0nJworTElCUz0nJworTFRMSUJPQkpTPScnCitNQUlOVD0nIycKK01BSU5UQUlORVJfTU9ERV9GQUxTRT0nJworTUFJTlRBSU5FUl9NT0RFX1RSVUU9JyMnCitNQUtFSU5GTz0nJHtTSEVMTH0gL2hvbWUvZG1pdHJpeXovc3JjLWxjbC9hbmRyb2lkLXg4Ni9kZXZpY2UvdG9vbHMvZ3J1Yi0wLjk3L21pc3NpbmcgLS1ydW4gbWFrZWluZm8nCitORVRCT09UX0RSSVZFUlM9JycKK05FVEJPT1RfU1VQUE9SVF9GQUxTRT0nJworTkVUQk9PVF9TVVBQT1JUX1RSVUU9JyMnCitORVRfQ0ZMQUdTPScnCitORVRfRVhUUkFGTEFHUz0nIC1EQ09OR0VTVEVEPTEgLURORV9TQ0FOPTB4MjgwLDB4MzAwLDB4MzIwLDB4MzQwIC1EV0RfREVGQVVMVF9NRU09MHhDQzAwMCcKK09CSkNPUFk9J29iamNvcHknCitPQkpFWFQ9J28nCitQQUNLQUdFPSdncnViJworUEFDS0FHRV9CVUdSRVBPUlQ9J2J1Zy1ncnViQGdudS5vcmcnCitQQUNLQUdFX05BTUU9J0dSVUInCitQQUNLQUdFX1NUUklORz0nR1JVQiAwLjk3JworUEFDS0FHRV9UQVJOQU1FPSdncnViJworUEFDS0FHRV9WRVJTSU9OPScwLjk3JworUEFUSF9TRVBBUkFUT1I9JzonCitQRVJMPScnCitSQU5MSUI9J3JhbmxpYicKK1NFUklBTF9TUEVFRF9TSU1VTEFUSU9OX0ZBTFNFPScnCitTRVJJQUxfU1BFRURfU0lNVUxBVElPTl9UUlVFPScjJworU0VSSUFMX1NVUFBPUlRfRkFMU0U9JyMnCitTRVJJQUxfU1VQUE9SVF9UUlVFPScnCitTRVRfTUFLRT0nJworU0hFTEw9Jy9iaW4vc2gnCitTVEFHRTFfQ0ZMQUdTPSctTzInCitTVEFHRTJfQ0ZMQUdTPSctT3MnCitTVFJJUD0nJworVkVSU0lPTj0nMC45NycKK2FjX2N0X0NDPSdnY2MnCithY19jdF9PQkpDT1BZPSdvYmpjb3B5JworYWNfY3RfUkFOTElCPSdyYW5saWInCithY19jdF9TVFJJUD0nJworYW1fX2Zhc3RkZXBDQ19GQUxTRT0nIycKK2FtX19mYXN0ZGVwQ0NfVFJVRT0nJworYW1fX2luY2x1ZGU9J2luY2x1ZGUnCithbV9fbGVhZGluZ19kb3Q9Jy4nCithbV9fcXVvdGU9JycKK2FtX190YXI9JyR7QU1UQVJ9IGNob2YgLSAiJCR0YXJkaXIiJworYW1fX3VudGFyPScke0FNVEFSfSB4ZiAtJworYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitidWlsZD0neDg2XzY0LXVua25vd24tbGludXgtZ251JworYnVpbGRfYWxpYXM9JycKK2J1aWxkX2NwdT0neDg2XzY0JworYnVpbGRfb3M9J2xpbnV4LWdudScKK2J1aWxkX3ZlbmRvcj0ndW5rbm93bicKK2RhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKK2V4ZWNfcHJlZml4PScke3ByZWZpeH0nCitob3N0PSd4ODZfNjQtdW5rbm93bi1saW51eC1nbnUnCitob3N0X2FsaWFzPScnCitob3N0X2NwdT0neDg2XzY0JworaG9zdF9vcz0nbGludXgtZ251JworaG9zdF92ZW5kb3I9J3Vua25vd24nCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK2luZm9kaXI9JyR7cHJlZml4fS9pbmZvJworaW5zdGFsbF9zaD0nL2hvbWUvZG1pdHJpeXovc3JjLWxjbC9hbmRyb2lkLXg4Ni9kZXZpY2UvdG9vbHMvZ3J1Yi0wLjk3L2luc3RhbGwtc2gnCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworbWFuZGlyPScke3ByZWZpeH0vbWFuJworbWtkaXJfcD0nbWtkaXIgLXAgLS0nCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitwcmVmaXg9Jy91c3IvbG9jYWwnCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSdzLHgseCwnCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwordGFyZ2V0X2FsaWFzPScnCisKKyMjIC0tLS0tLS0tLS0tICMjCisjIyBjb25mZGVmcy5oLiAjIworIyMgLS0tLS0tLS0tLS0gIyMKKworI2RlZmluZSBBRERSMzIgYWRkcjMyCisjZGVmaW5lIERBVEEzMiBkYXRhMzIKKyNkZWZpbmUgSEFWRV9DVVJTRVNfSCAxCisjZGVmaW5lIEhBVkVfRURBVEFfU1lNQk9MIDEKKyNkZWZpbmUgSEFWRV9FTkRfU1lNQk9MIDEKKyNkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKKyNkZWZpbmUgSEFWRV9MSUJDVVJTRVMgMQorI2RlZmluZSBIQVZFX01FTU9SWV9IIDEKKyNkZWZpbmUgSEFWRV9OQ1VSU0VTX0ggMQorI2RlZmluZSBIQVZFX1NURElOVF9IIDEKKyNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCisjZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKKyNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQorI2RlZmluZSBIQVZFX1NUUklOR19IIDEKKyNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCisjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCisjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQorI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKKyNkZWZpbmUgSEFWRV9VU0NPUkVfRURBVEFfU1lNQk9MIDEKKyNkZWZpbmUgSEFWRV9VU0NPUkVfRU5EX1NZTUJPTCAxCisjZGVmaW5lIEhBVkVfVVNDT1JFX1NUQVJUX1NZTUJPTCAxCisjZGVmaW5lIEhBVkVfVVNDT1JFX1VTQ09SRV9CU1NfU1RBUlRfU1lNQk9MIDEKKyNkZWZpbmUgUEFDS0FHRSAiZ3J1YiIKKyNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgImJ1Zy1ncnViQGdudS5vcmciCisjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiR1JVQiIKKyNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIkdSVUIgMC45NyIKKyNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJncnViIgorI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjAuOTciCisjZGVmaW5lIFBSRVNFVF9NRU5VX1NUUklORyAiIgorI2RlZmluZSBTVERDX0hFQURFUlMgMQorI2RlZmluZSBWRVJTSU9OICIwLjk3IgorCitjb25maWd1cmU6IGV4aXQgMApkaWZmIC0tZ2l0IGEvY29uZmlnLnN0YXR1cyBiL2NvbmZpZy5zdGF0dXMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzg0NjFlZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy5zdGF0dXMKQEAgLTAsMCArMSwxMjQ4IEBACisjISAvYmluL3NoCisjIEdlbmVyYXRlZCBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyMgY29uZmlndXJlLCBpcyBpbiBjb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworZGVidWc9ZmFsc2UKK2FjX2NzX3JlY2hlY2s9ZmFsc2UKK2FjX2NzX3NpbGVudD1mYWxzZQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworIyBCZSBCb3VybmUgY29tcGF0aWJsZQoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCitlbGlmIHRlc3QgLW4gIiR7QkFTSF9WRVJTSU9OK3NldH0iICYmIChzZXQgLW8gcG9zaXgpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBzZXQgLW8gcG9zaXgKK2ZpCitEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCisKKyMgU3VwcG9ydCB1bnNldCB3aGVuIHBvc3NpYmxlLgoraWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX3Vuc2V0PXVuc2V0CitlbHNlCisgIGFzX3Vuc2V0PWZhbHNlCitmaQorCisKKyMgV29yayBhcm91bmQgYnVncyBpbiBwcmUtMy4wIFVXSU4ga3NoLgorJGFzX3Vuc2V0IEVOViBNQUlMIE1BSUxQQVRICitQUzE9JyQgJworUFMyPSc+ICcKK1BTND0nKyAnCisKKyMgTkxTIG51aXNhbmNlcy4KK2ZvciBhc192YXIgaW4gXAorICBMQU5HIExBTkdVQUdFIExDX0FERFJFU1MgTENfQUxMIExDX0NPTExBVEUgTENfQ1RZUEUgTENfSURFTlRJRklDQVRJT04gXAorICBMQ19NRUFTVVJFTUVOVCBMQ19NRVNTQUdFUyBMQ19NT05FVEFSWSBMQ19OQU1FIExDX05VTUVSSUMgTENfUEFQRVIgXAorICBMQ19URUxFUEhPTkUgTENfVElNRQorZG8KKyAgaWYgKHNldCAreDsgdGVzdCAteiAiYChldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIpIDI+JjFgIik7IHRoZW4KKyAgICBldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIKKyAgZWxzZQorICAgICRhc191bnNldCAkYXNfdmFyCisgIGZpCitkb25lCisKKyMgUmVxdWlyZWQgdG8gdXNlIGJhc2VuYW1lLgoraWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfZXhwcj1leHByCitlbHNlCisgIGFzX2V4cHI9ZmFsc2UKK2ZpCisKK2lmIChiYXNlbmFtZSAvKSA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAiWGBiYXNlbmFtZSAvIDI+JjFgIiA9ICJYLyI7IHRoZW4KKyAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKK2Vsc2UKKyAgYXNfYmFzZW5hbWU9ZmFsc2UKK2ZpCisKKworIyBOYW1lIG9mIHRoZSBleGVjdXRhYmxlLgorYXNfbWU9YCRhc19iYXNlbmFtZSAiJDAiIHx8CiskYXNfZXhwciBYLyIkMCIgOiAnLiovXChbXi9dW14vXSpcKS8qJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvXCkkJyBcfCBcCisJIC4gICAgIDogJ1woLlwpJyAyPi9kZXYvbnVsbCB8fAorZWNobyBYLyIkMCIgfAorICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXC9cKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXC9cKFwvXCkuKi97IHMvL1wxLzsgcTsgfQorICAJICBzLy4qLy4vOyBxJ2AKKworCisjIFBBVEggbmVlZHMgQ1IsIGFuZCBMSU5FTk8gbmVlZHMgQ1IgYW5kIFBBVEguCisjIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCithc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKK2FzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJworYXNfY3JfTGV0dGVycz0kYXNfY3JfbGV0dGVycyRhc19jcl9MRVRURVJTCithc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCithc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKKworIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCitpZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgorICBlY2hvICIjISAvYmluL3NoIiA+Y29uZiQkLnNoCisgIGVjaG8gICJleGl0IDAiICAgPj5jb25mJCQuc2gKKyAgY2htb2QgK3ggY29uZiQkLnNoCisgIGlmIChQQVRIPSIvbm9uZXhpc3RlbnQ7LiI7IGNvbmYkJC5zaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgUEFUSF9TRVBBUkFUT1I9JzsnCisgIGVsc2UKKyAgICBQQVRIX1NFUEFSQVRPUj06CisgIGZpCisgIHJtIC1mIGNvbmYkJC5zaAorZmkKKworCisgIGFzX2xpbmVub18xPSRMSU5FTk8KKyAgYXNfbGluZW5vXzI9JExJTkVOTworICBhc19saW5lbm9fMz1gKGV4cHIgJGFzX2xpbmVub18xICsgMSkgMj4vZGV2L251bGxgCisgIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgorICB0ZXN0ICJ4JGFzX2xpbmVub18zIiAgPSAieCRhc19saW5lbm9fMiIgIHx8IHsKKyAgIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gcGF0aCBhdCBhbGwKKyAgIyByZWxhdGl2ZSBvciBub3QuCisgIGNhc2UgJDAgaW4KKyAgICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7CisgICAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhaworZG9uZQorCisgICAgICAgOzsKKyAgZXNhYworICAjIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCisgICMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgorICBpZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCisgICAgYXNfbXlzZWxmPSQwCisgIGZpCisgIGlmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KKyAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgcGF0aCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgcGF0aCIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICBmaQorICBjYXNlICRDT05GSUdfU0hFTEwgaW4KKyAgJycpCisgICAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAvYmluJFBBVEhfU0VQQVJBVE9SL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYXNfYmFzZSBpbiBzaCBiYXNoIGtzaCBzaDU7IGRvCisJIGNhc2UgJGFzX2RpciBpbgorCSAvKikKKwkgICBpZiAoIiRhc19kaXIvJGFzX2Jhc2UiIC1jICcKKyAgYXNfbGluZW5vXzE9JExJTkVOTworICBhc19saW5lbm9fMj0kTElORU5PCisgIGFzX2xpbmVub18zPWAoZXhwciAkYXNfbGluZW5vXzEgKyAxKSAyPi9kZXYvbnVsbGAKKyAgdGVzdCAieCRhc19saW5lbm9fMSIgIT0gIngkYXNfbGluZW5vXzIiICYmCisgIHRlc3QgIngkYXNfbGluZW5vXzMiICA9ICJ4JGFzX2xpbmVub18yIiAnKSAyPi9kZXYvbnVsbDsgdGhlbgorCSAgICAgJGFzX3Vuc2V0IEJBU0hfRU5WIHx8IHRlc3QgIiR7QkFTSF9FTlYrc2V0fSIgIT0gc2V0IHx8IHsgQkFTSF9FTlY9OyBleHBvcnQgQkFTSF9FTlY7IH0KKwkgICAgICRhc191bnNldCBFTlYgfHwgdGVzdCAiJHtFTlYrc2V0fSIgIT0gc2V0IHx8IHsgRU5WPTsgZXhwb3J0IEVOVjsgfQorCSAgICAgQ09ORklHX1NIRUxMPSRhc19kaXIvJGFzX2Jhc2UKKwkgICAgIGV4cG9ydCBDT05GSUdfU0hFTEwKKwkgICAgIGV4ZWMgIiRDT05GSUdfU0hFTEwiICIkMCIgJHsxKyIkQCJ9CisJICAgZmk7OworCSBlc2FjCisgICAgICAgZG9uZQorZG9uZQorOzsKKyAgZXNhYworCisgICMgQ3JlYXRlICRhc19tZS5saW5lbm8gYXMgYSBjb3B5IG9mICRhc19teXNlbGYsIGJ1dCB3aXRoICRMSU5FTk8KKyAgIyB1bmlmb3JtbHkgcmVwbGFjZWQgYnkgdGhlIGxpbmUgbnVtYmVyLiAgVGhlIGZpcnN0ICdzZWQnIGluc2VydHMgYQorICAjIGxpbmUtbnVtYmVyIGxpbmUgYmVmb3JlIGVhY2ggbGluZTsgdGhlIHNlY29uZCAnc2VkJyBkb2VzIHRoZSByZWFsCisgICMgd29yay4gIFRoZSBzZWNvbmQgc2NyaXB0IHVzZXMgJ04nIHRvIHBhaXIgZWFjaCBsaW5lLW51bWJlciBsaW5lCisgICMgd2l0aCB0aGUgbnVtYmVyZWQgbGluZSwgYW5kIGFwcGVuZHMgdHJhaWxpbmcgJy0nIGR1cmluZworICAjIHN1YnN0aXR1dGlvbiBzbyB0aGF0ICRMSU5FTk8gaXMgbm90IGEgc3BlY2lhbCBjYXNlIGF0IGxpbmUgZW5kLgorICAjIChSYWphIFIgSGFyaW5hdGggc3VnZ2VzdGVkIHNlZCAnPScsIGFuZCBQYXVsIEVnZ2VydCB3cm90ZSB0aGUKKyAgIyBzZWNvbmQgJ3NlZCcgc2NyaXB0LiAgQmxhbWUgTGVlIEUuIE1jTWFob24gZm9yIHNlZCdzIHN5bnRheC4gIDotKQorICBzZWQgJz0nIDwkYXNfbXlzZWxmIHwKKyAgICBzZWQgJworICAgICAgTgorICAgICAgcywkLC0sCisgICAgICA6IGxvb3AKKyAgICAgIHMsXlwoWyckYXNfY3JfZGlnaXRzJ10qXClcKC4qXClbJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXVwpLFwxXDJcMVwzLAorICAgICAgdCBsb29wCisgICAgICBzLC0kLCwKKyAgICAgIHMsXlsnJGFzX2NyX2RpZ2l0cyddKlxuLCwKKyAgICAnID4kYXNfbWUubGluZW5vICYmCisgIGNobW9kICt4ICRhc19tZS5saW5lbm8gfHwKKyAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCisgICMgRG9uJ3QgdHJ5IHRvIGV4ZWMgYXMgaXQgY2hhbmdlcyAkWzBdLCBjYXVzaW5nIGFsbCBzb3J0IG9mIHByb2JsZW1zCisgICMgKHRoZSBkaXJuYW1lIG9mICRbMF0gaXMgbm90IHRoZSBwbGFjZSB3aGVyZSB3ZSBtaWdodCBmaW5kIHRoZQorICAjIG9yaWdpbmFsIGFuZCBzbyBvbi4gIEF1dG9jb25mIGlzIGVzcGVjaWFsbHkgc2Vuc2libGUgdG8gdGhpcykuCisgIC4gLi8kYXNfbWUubGluZW5vCisgICMgRXhpdCBzdGF0dXMgaXMgdGhhdCBvZiB0aGUgbGFzdCBjb21tYW5kLgorICBleGl0Cit9CisKKworY2FzZSBgZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsM2AsYGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsM2AgaW4KKyAgKmMqLC1uKikgRUNIT19OPSBFQ0hPX0M9JworJyBFQ0hPX1Q9JwknIDs7CisgICpjKiwqICApIEVDSE9fTj0tbiBFQ0hPX0M9IEVDSE9fVD0gOzsKKyAgKikgICAgICAgRUNIT19OPSBFQ0hPX0M9J1xjJyBFQ0hPX1Q9IDs7Citlc2FjCisKK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQorZWNobyA+Y29uZiQkLmZpbGUKK2lmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICAjIFdlIGNvdWxkIGp1c3QgY2hlY2sgZm9yIERKR1BQOyBidXQgdGhpcyB0ZXN0IGEpIHdvcmtzIGIpIGlzIG1vcmUgZ2VuZXJpYworICAjIGFuZCBjKSB3aWxsIHJlbWFpbiB2YWxpZCBvbmNlIERKR1BQIHN1cHBvcnRzIHN5bWxpbmtzIChESkdQUCAyLjA0KS4KKyAgaWYgdGVzdCAtZiBjb25mJCQuZXhlOyB0aGVuCisgICAgIyBEb24ndCB1c2UgbG4gYXQgYWxsOyB3ZSBkb24ndCBoYXZlIGFueSBsaW5rcworICAgIGFzX2xuX3M9J2NwIC1wJworICBlbHNlCisgICAgYXNfbG5fcz0nbG4gLXMnCisgIGZpCitlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19sbl9zPWxuCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wJworZmkKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCisKK2lmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfbWtkaXJfcD06CitlbHNlCisgIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCisgIGFzX21rZGlyX3A9ZmFsc2UKK2ZpCisKK2FzX2V4ZWN1dGFibGVfcD0idGVzdCAtZiIKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgorYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCithc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisKKyMgSUZTCisjIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLgorYXNfbmw9JworJworSUZTPSIgCSRhc19ubCIKKworIyBDRFBBVEguCiskYXNfdW5zZXQgQ0RQQVRICisKK2V4ZWMgNj4mMQorCisjIE9wZW4gdGhlIGxvZyByZWFsIHNvb24sIHRvIGtlZXAgXCRbMF0gYW5kIHNvIG9uIG1lYW5pbmdmdWwsIGFuZCB0bworIyByZXBvcnQgYWN0dWFsIGlucHV0IHZhbHVlcyBvZiBDT05GSUdfRklMRVMgZXRjLiBpbnN0ZWFkIG9mIHRoZWlyCisjIHZhbHVlcyBhZnRlciBvcHRpb25zIGhhbmRsaW5nLiAgTG9nZ2luZyAtLXZlcnNpb24gZXRjLiBpcyBPSy4KK2V4ZWMgNT4+Y29uZmlnLmxvZworeworICBlY2hvCisgIHNlZCAnaDtzLy4vLS9nO3MvXi4uLi8jIyAvO3MvLi4uJC8gIyMvO3A7eDtwO3gnIDw8X0FTQk9YCisjIyBSdW5uaW5nICRhc19tZS4gIyMKK19BU0JPWAorfSA+JjUKK2NhdCA+JjUgPDxfQ1NFT0YKKworVGhpcyBmaWxlIHdhcyBleHRlbmRlZCBieSBHUlVCICRhc19tZSAwLjk3LCB3aGljaCB3YXMKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi41OS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcworCisgIENPTkZJR19GSUxFUyAgICA9ICRDT05GSUdfRklMRVMKKyAgQ09ORklHX0hFQURFUlMgID0gJENPTkZJR19IRUFERVJTCisgIENPTkZJR19MSU5LUyAgICA9ICRDT05GSUdfTElOS1MKKyAgQ09ORklHX0NPTU1BTkRTID0gJENPTkZJR19DT01NQU5EUworICAkICQwICRACisKK19DU0VPRgorZWNobyAib24gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgIiA+JjUKK2VjaG8gPiY1Citjb25maWdfZmlsZXM9IiBNYWtlZmlsZSBzdGFnZTEvTWFrZWZpbGUgc3RhZ2UyL01ha2VmaWxlIGRvY3MvTWFrZWZpbGUgbGliL01ha2VmaWxlIHV0aWwvTWFrZWZpbGUgZ3J1Yi9NYWtlZmlsZSBuZXRib290L01ha2VmaWxlIHV0aWwvZ3J1Yi1pbWFnZSB1dGlsL2dydWItaW5zdGFsbCB1dGlsL2dydWItbWQ1LWNyeXB0IHV0aWwvZ3J1Yi10ZXJtaW5mbyB1dGlsL2dydWItc2V0LWRlZmF1bHQiCitjb25maWdfaGVhZGVycz0iIGNvbmZpZy5oIgorY29uZmlnX2NvbW1hbmRzPSIgZGVwZmlsZXMiCisKK2FjX2NzX3VzYWdlPSJcCitcYCRhc19tZScgaW5zdGFudGlhdGVzIGZpbGVzIGZyb20gdGVtcGxhdGVzIGFjY29yZGluZyB0byB0aGUKK2N1cnJlbnQgY29uZmlndXJhdGlvbi4KKworVXNhZ2U6ICQwIFtPUFRJT05TXSBbRklMRV0uLi4KKworICAtaCwgLS1oZWxwICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC1WLCAtLXZlcnNpb24gICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorICAtcSwgLS1xdWlldCAgICAgIGRvIG5vdCBwcmludCBwcm9ncmVzcyBtZXNzYWdlcworICAtZCwgLS1kZWJ1ZyAgICAgIGRvbid0IHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMKKyAgICAgIC0tcmVjaGVjayAgICB1cGRhdGUgJGFzX21lIGJ5IHJlY29uZmlndXJpbmcgaW4gdGhlIHNhbWUgY29uZGl0aW9ucworICAtLWZpbGU9RklMRVs6VEVNUExBVEVdCisJCSAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgRklMRQorICAtLWhlYWRlcj1GSUxFWzpURU1QTEFURV0KKwkJICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gaGVhZGVyIEZJTEUKKworQ29uZmlndXJhdGlvbiBmaWxlczoKKyRjb25maWdfZmlsZXMKKworQ29uZmlndXJhdGlvbiBoZWFkZXJzOgorJGNvbmZpZ19oZWFkZXJzCisKK0NvbmZpZ3VyYXRpb24gY29tbWFuZHM6CiskY29uZmlnX2NvbW1hbmRzCisKK1JlcG9ydCBidWdzIHRvIDxidWctYXV0b2NvbmZAZ251Lm9yZz4uIgorYWNfY3NfdmVyc2lvbj0iXAorR1JVQiBjb25maWcuc3RhdHVzIDAuOTcKK2NvbmZpZ3VyZWQgYnkgLi9jb25maWd1cmUsIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi41OSwKKyAgd2l0aCBvcHRpb25zIFwiJy0tZGlzYWJsZS1hdXRvLWxpbnV4LW1lbS1vcHQnICctLWVuYWJsZS1wcmVzZXQtbWVudT1hbmRyb2lkLmxzdCcgJy0tZGlzYWJsZS1mZnMnICctLWRpc2FibGUtdWZzMicgJy0tZGlzYWJsZS1taW5peCcgJy0tZGlzYWJsZS1yZWlzZXJmcycgJy0tZGlzYWJsZS12c3RhZnMnICctLWRpc2FibGUtamZzJyAnLS1kaXNhYmxlLXhmcycgJy0tZGlzYWJsZS1pc285NjYwJ1wiCisKK0NvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgY29uZmlnLnN0YXR1cyBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LiIKK3NyY2Rpcj0uCitJTlNUQUxMPSIvdXNyL2Jpbi9pbnN0YWxsIC1jIgorIyBJZiBubyBmaWxlIGFyZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIsIHRoZW4gd2UgbmVlZCB0byBwcm92aWRlIGRlZmF1bHQKKyMgdmFsdWUuICBCeSB3ZSBuZWVkIHRvIGtub3cgaWYgZmlsZXMgd2VyZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCithY19uZWVkX2RlZmF1bHRzPToKK3doaWxlIHRlc3QgJCMgIT0gMAorZG8KKyAgY2FzZSAkMSBpbgorICAtLSo9KikKKyAgICBhY19vcHRpb249YGV4cHIgIngkMSIgOiAneFwoW149XSpcKT0nYAorICAgIGFjX29wdGFyZz1gZXhwciAieCQxIiA6ICd4W149XSo9XCguKlwpJ2AKKyAgICBhY19zaGlmdD06CisgICAgOzsKKyAgLSopCisgICAgYWNfb3B0aW9uPSQxCisgICAgYWNfb3B0YXJnPSQyCisgICAgYWNfc2hpZnQ9c2hpZnQKKyAgICA7OworICAqKSAjIFRoaXMgaXMgbm90IGFuIG9wdGlvbiwgc28gdGhlIHVzZXIgaGFzIHByb2JhYmx5IGdpdmVuIGV4cGxpY2l0CisgICAgICMgYXJndW1lbnRzLgorICAgICBhY19vcHRpb249JDEKKyAgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIGVzYWMKKworICBjYXNlICRhY19vcHRpb24gaW4KKyAgIyBIYW5kbGluZyBvZiB0aGUgb3B0aW9ucy4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgYWNfY3NfcmVjaGVjaz06IDs7CisgIC0tdmVyc2lvbiB8IC0tdmVycyogfCAtViApCisgICAgZWNobyAiJGFjX2NzX3ZlcnNpb24iOyBleGl0IDAgOzsKKyAgLS1oZSB8IC0taCkKKyAgICAjIENvbmZsaWN0IGJldHdlZW4gLS1oZWxwIGFuZCAtLWhlYWRlcgorICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGFtYmlndW91cyBvcHRpb246ICQxCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBhbWJpZ3VvdXMgb3B0aW9uOiAkMQorVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworICAtLWhlbHAgfCAtLWhlbCB8IC1oICkKKyAgICBlY2hvICIkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKKyAgLS1kZWJ1ZyB8IC0tZCogfCAtZCApCisgICAgZGVidWc9OiA7OworICAtLWZpbGUgfCAtLWZpbCB8IC0tZmkgfCAtLWYgKQorICAgICRhY19zaGlmdAorICAgIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyAkYWNfb3B0YXJnIgorICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OworICAtLWhlYWRlciB8IC0taGVhZGUgfCAtLWhlYWQgfCAtLWhlYSApCisgICAgJGFjX3NoaWZ0CisgICAgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyAkYWNfb3B0YXJnIgorICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCB8IC0tc2kgfCAtLXMpCisgICAgYWNfY3Nfc2lsZW50PTogOzsKKworICAjIFRoaXMgaXMgYW4gZXJyb3IuCisgIC0qKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiB1bnJlY29nbml6ZWQgb3B0aW9uOiAkMQorVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogdW5yZWNvZ25pemVkIG9wdGlvbjogJDEKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7CisKKyAgKikgYWNfY29uZmlnX3RhcmdldHM9IiRhY19jb25maWdfdGFyZ2V0cyAkMSIgOzsKKworICBlc2FjCisgIHNoaWZ0Citkb25lCisKK2FjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPQorCitpZiAkYWNfY3Nfc2lsZW50OyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKKyAgYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9IiRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLXNpbGVudCIKK2ZpCisKK2lmICRhY19jc19yZWNoZWNrOyB0aGVuCisgIGVjaG8gInJ1bm5pbmcgL2Jpbi9zaCAuL2NvbmZpZ3VyZSAiICctLWRpc2FibGUtYXV0by1saW51eC1tZW0tb3B0JyAnLS1lbmFibGUtcHJlc2V0LW1lbnU9YW5kcm9pZC5sc3QnICctLWRpc2FibGUtZmZzJyAnLS1kaXNhYmxlLXVmczInICctLWRpc2FibGUtbWluaXgnICctLWRpc2FibGUtcmVpc2VyZnMnICctLWRpc2FibGUtdnN0YWZzJyAnLS1kaXNhYmxlLWpmcycgJy0tZGlzYWJsZS14ZnMnICctLWRpc2FibGUtaXNvOTY2MCcgJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzICIgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iID4mNgorICBleGVjIC9iaW4vc2ggLi9jb25maWd1cmUgJy0tZGlzYWJsZS1hdXRvLWxpbnV4LW1lbS1vcHQnICctLWVuYWJsZS1wcmVzZXQtbWVudT1hbmRyb2lkLmxzdCcgJy0tZGlzYWJsZS1mZnMnICctLWRpc2FibGUtdWZzMicgJy0tZGlzYWJsZS1taW5peCcgJy0tZGlzYWJsZS1yZWlzZXJmcycgJy0tZGlzYWJsZS12c3RhZnMnICctLWRpc2FibGUtamZzJyAnLS1kaXNhYmxlLXhmcycgJy0tZGlzYWJsZS1pc285NjYwJyAkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24KK2ZpCisKKyMKKyMgSU5JVC1DT01NQU5EUyBzZWN0aW9uLgorIworCitBTURFUF9UUlVFPSIiIGFjX2F1eF9kaXI9Ii4iCisKK2ZvciBhY19jb25maWdfdGFyZ2V0IGluICRhY19jb25maWdfdGFyZ2V0cworZG8KKyAgY2FzZSAiJGFjX2NvbmZpZ190YXJnZXQiIGluCisgICMgSGFuZGxpbmcgb2YgYXJndW1lbnRzLgorICAiTWFrZWZpbGUiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIE1ha2VmaWxlIiA7OworICAic3RhZ2UxL01ha2VmaWxlIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBzdGFnZTEvTWFrZWZpbGUiIDs7CisgICJzdGFnZTIvTWFrZWZpbGUiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHN0YWdlMi9NYWtlZmlsZSIgOzsKKyAgImRvY3MvTWFrZWZpbGUiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGRvY3MvTWFrZWZpbGUiIDs7CisgICJsaWIvTWFrZWZpbGUiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYi9NYWtlZmlsZSIgOzsKKyAgInV0aWwvTWFrZWZpbGUiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHV0aWwvTWFrZWZpbGUiIDs7CisgICJncnViL01ha2VmaWxlIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBncnViL01ha2VmaWxlIiA7OworICAibmV0Ym9vdC9NYWtlZmlsZSIgKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbmV0Ym9vdC9NYWtlZmlsZSIgOzsKKyAgInV0aWwvZ3J1Yi1pbWFnZSIgKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdXRpbC9ncnViLWltYWdlIiA7OworICAidXRpbC9ncnViLWluc3RhbGwiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHV0aWwvZ3J1Yi1pbnN0YWxsIiA7OworICAidXRpbC9ncnViLW1kNS1jcnlwdCIgKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdXRpbC9ncnViLW1kNS1jcnlwdCIgOzsKKyAgInV0aWwvZ3J1Yi10ZXJtaW5mbyIgKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdXRpbC9ncnViLXRlcm1pbmZvIiA7OworICAidXRpbC9ncnViLXNldC1kZWZhdWx0IiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB1dGlsL2dydWItc2V0LWRlZmF1bHQiIDs7CisgICJkZXBmaWxlcyIgKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgZGVwZmlsZXMiIDs7CisgICJjb25maWcuaCIgKSBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTIGNvbmZpZy5oIiA7OworICAqKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkYWNfY29uZmlnX3RhcmdldCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkYWNfY29uZmlnX3RhcmdldCIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7CisgIGVzYWMKK2RvbmUKKworIyBJZiB0aGUgdXNlciBkaWQgbm90IHVzZSB0aGUgYXJndW1lbnRzIHRvIHNwZWNpZnkgdGhlIGl0ZW1zIHRvIGluc3RhbnRpYXRlLAorIyB0aGVuIHRoZSBlbnZ2YXIgaW50ZXJmYWNlIGlzIHVzZWQuICBTZXQgb25seSB0aG9zZSB0aGF0IGFyZSBub3QuCisjIFdlIHVzZSB0aGUgbG9uZyBmb3JtIGZvciB0aGUgZGVmYXVsdCBhc3NpZ25tZW50IGJlY2F1c2Ugb2YgYW4gZXh0cmVtZWx5CisjIGJpemFycmUgYnVnIG9uIFN1bk9TIDQuMS4zLgoraWYgJGFjX25lZWRfZGVmYXVsdHM7IHRoZW4KKyAgdGVzdCAiJHtDT05GSUdfRklMRVMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0ZJTEVTPSRjb25maWdfZmlsZXMKKyAgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiA9IHNldCB8fCBDT05GSUdfSEVBREVSUz0kY29uZmlnX2hlYWRlcnMKKyAgdGVzdCAiJHtDT05GSUdfQ09NTUFORFMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0NPTU1BTkRTPSRjb25maWdfY29tbWFuZHMKK2ZpCisKKyMgSGF2ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIGNvbnZlbmllbmNlLiAgTWFrZSBpdCBpbiB0aGUgYnVpbGQgdHJlZQorIyBzaW1wbHkgYmVjYXVzZSB0aGVyZSBpcyBubyByZWFzb24gdG8gcHV0IGl0IGhlcmUsIGFuZCBpbiBhZGRpdGlvbiwKKyMgY3JlYXRpbmcgYW5kIG1vdmluZyBmaWxlcyBmcm9tIC90bXAgY2FuIHNvbWV0aW1lcyBjYXVzZSBwcm9ibGVtcy4KKyMgQ3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgYW5kIGhvb2sgZm9yIGl0cyByZW1vdmFsIHVubGVzcyBkZWJ1Z2dpbmcuCiskZGVidWcgfHwKK3sKKyAgdHJhcCAnZXhpdF9zdGF0dXM9JD87IHJtIC1yZiAkdG1wICYmIGV4aXQgJGV4aXRfc3RhdHVzJyAwCisgIHRyYXAgJ3sgKGV4aXQgMSk7IGV4aXQgMTsgfScgMSAyIDEzIDE1Cit9CisKKyMgQ3JlYXRlIGEgKHNlY3VyZSkgdG1wIGRpcmVjdG9yeSBmb3IgdG1wIGZpbGVzLgorCit7CisgIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgLXEgIi4vY29uZnN0YXRYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYKKyAgdGVzdCAtbiAiJHRtcCIgJiYgdGVzdCAtZCAiJHRtcCIKK30gIHx8Cit7CisgIHRtcD0uL2NvbmZzdGF0JCQtJFJBTkRPTQorICAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApCit9IHx8Cit7CisgICBlY2hvICIkbWU6IGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluIC4iID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Cit9CisKKworIworIyBDT05GSUdfRklMRVMgc2VjdGlvbi4KKyMKKworIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBzY3JpcHRzIGlmIHRoZXJlIGFyZSBubyBDT05GSUdfRklMRVMuCisjIFRoaXMgaGFwcGVucyBmb3IgaW5zdGFuY2Ugd2hlbiAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgKK2lmIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiOyB0aGVuCisgICMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCisgIHNlZCAncy8sQC9AQC87IHMvQCwvQEAvOyBzLyw7dCB0JC9AO3QgdC87IC9AO3QgdCQvcy9bXFwmLF0vXFwmL2c7CisgICBzL0BALyxALzsgcy9AQC9ALC87IHMvQDt0IHQkLyw7dCB0LycgPiR0bXAvc3Vicy5zZWQgPDxcQ0VPRgorcyxAU0hFTExALC9iaW4vc2gsO3QgdAorcyxAUEFUSF9TRVBBUkFUT1JALDosO3QgdAorcyxAUEFDS0FHRV9OQU1FQCxHUlVCLDt0IHQKK3MsQFBBQ0tBR0VfVEFSTkFNRUAsZ3J1Yiw7dCB0CitzLEBQQUNLQUdFX1ZFUlNJT05ALDAuOTcsO3QgdAorcyxAUEFDS0FHRV9TVFJJTkdALEdSVUIgMC45Nyw7dCB0CitzLEBQQUNLQUdFX0JVR1JFUE9SVEAsYnVnLWdydWJAZ251Lm9yZyw7dCB0CitzLEBleGVjX3ByZWZpeEAsJHtwcmVmaXh9LDt0IHQKK3MsQHByZWZpeEAsL3Vzci9sb2NhbCw7dCB0CitzLEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCxzLHgseCwsO3QgdAorcyxAYmluZGlyQCwke2V4ZWNfcHJlZml4fS9iaW4sO3QgdAorcyxAc2JpbmRpckAsJHtleGVjX3ByZWZpeH0vc2Jpbiw7dCB0CitzLEBsaWJleGVjZGlyQCwke2V4ZWNfcHJlZml4fS9saWJleGVjLDt0IHQKK3MsQGRhdGFkaXJALCR7cHJlZml4fS9zaGFyZSw7dCB0CitzLEBzeXNjb25mZGlyQCwke3ByZWZpeH0vZXRjLDt0IHQKK3MsQHNoYXJlZHN0YXRlZGlyQCwke3ByZWZpeH0vY29tLDt0IHQKK3MsQGxvY2Fsc3RhdGVkaXJALCR7cHJlZml4fS92YXIsO3QgdAorcyxAbGliZGlyQCwke2V4ZWNfcHJlZml4fS9saWIsO3QgdAorcyxAaW5jbHVkZWRpckAsJHtwcmVmaXh9L2luY2x1ZGUsO3QgdAorcyxAb2xkaW5jbHVkZWRpckAsL3Vzci9pbmNsdWRlLDt0IHQKK3MsQGluZm9kaXJALCR7cHJlZml4fS9pbmZvLDt0IHQKK3MsQG1hbmRpckAsJHtwcmVmaXh9L21hbiw7dCB0CitzLEBidWlsZF9hbGlhc0AsLDt0IHQKK3MsQGhvc3RfYWxpYXNALCw7dCB0CitzLEB0YXJnZXRfYWxpYXNALCw7dCB0CitzLEBERUZTQCwtREhBVkVfQ09ORklHX0gsO3QgdAorcyxARUNIT19DQCwsO3QgdAorcyxARUNIT19OQCwtbiw7dCB0CitzLEBFQ0hPX1RALCw7dCB0CitzLEBMSUJTQCwsO3QgdAorcyxASU5TVEFMTF9QUk9HUkFNQCwke0lOU1RBTEx9LDt0IHQKK3MsQElOU1RBTExfU0NSSVBUQCwke0lOU1RBTEx9LDt0IHQKK3MsQElOU1RBTExfREFUQUAsJHtJTlNUQUxMfSAtbSA2NDQsO3QgdAorcyxAQ1lHUEFUSF9XQCxlY2hvLDt0IHQKK3MsQFBBQ0tBR0VALGdydWIsO3QgdAorcyxAVkVSU0lPTkAsMC45Nyw7dCB0CitzLEBBQ0xPQ0FMQCwke1NIRUxMfSAvaG9tZS9kbWl0cml5ei9zcmMtbGNsL2FuZHJvaWQteDg2L2RldmljZS90b29scy9ncnViLTAuOTcvbWlzc2luZyAtLXJ1biBhY2xvY2FsLTEuOSw7dCB0CitzLEBBVVRPQ09ORkAsJHtTSEVMTH0gL2hvbWUvZG1pdHJpeXovc3JjLWxjbC9hbmRyb2lkLXg4Ni9kZXZpY2UvdG9vbHMvZ3J1Yi0wLjk3L21pc3NpbmcgLS1ydW4gYXV0b2NvbmYsO3QgdAorcyxAQVVUT01BS0VALCR7U0hFTEx9IC9ob21lL2RtaXRyaXl6L3NyYy1sY2wvYW5kcm9pZC14ODYvZGV2aWNlL3Rvb2xzL2dydWItMC45Ny9taXNzaW5nIC0tcnVuIGF1dG9tYWtlLTEuOSw7dCB0CitzLEBBVVRPSEVBREVSQCwke1NIRUxMfSAvaG9tZS9kbWl0cml5ei9zcmMtbGNsL2FuZHJvaWQteDg2L2RldmljZS90b29scy9ncnViLTAuOTcvbWlzc2luZyAtLXJ1biBhdXRvaGVhZGVyLDt0IHQKK3MsQE1BS0VJTkZPQCwke1NIRUxMfSAvaG9tZS9kbWl0cml5ei9zcmMtbGNsL2FuZHJvaWQteDg2L2RldmljZS90b29scy9ncnViLTAuOTcvbWlzc2luZyAtLXJ1biBtYWtlaW5mbyw7dCB0CitzLEBpbnN0YWxsX3NoQCwvaG9tZS9kbWl0cml5ei9zcmMtbGNsL2FuZHJvaWQteDg2L2RldmljZS90b29scy9ncnViLTAuOTcvaW5zdGFsbC1zaCw7dCB0CitzLEBTVFJJUEAsLDt0IHQKK3MsQGFjX2N0X1NUUklQQCwsO3QgdAorcyxASU5TVEFMTF9TVFJJUF9QUk9HUkFNQCwke1NIRUxMfSAkKGluc3RhbGxfc2gpIC1jIC1zLDt0IHQKK3MsQG1rZGlyX3BALG1rZGlyIC1wIC0tLDt0IHQKK3MsQEFXS0AsZ2F3ayw7dCB0CitzLEBTRVRfTUFLRUAsLDt0IHQKK3MsQGFtX19sZWFkaW5nX2RvdEAsLiw7dCB0CitzLEBBTVRBUkAsJHtTSEVMTH0gL2hvbWUvZG1pdHJpeXovc3JjLWxjbC9hbmRyb2lkLXg4Ni9kZXZpY2UvdG9vbHMvZ3J1Yi0wLjk3L21pc3NpbmcgLS1ydW4gdGFyLDt0IHQKK3MsQGFtX190YXJALCR7QU1UQVJ9IGNob2YgLSAiJCR0YXJkaXIiLDt0IHQKK3MsQGFtX191bnRhckAsJHtBTVRBUn0geGYgLSw7dCB0CitzLEBidWlsZEAseDg2XzY0LXVua25vd24tbGludXgtZ251LDt0IHQKK3MsQGJ1aWxkX2NwdUAseDg2XzY0LDt0IHQKK3MsQGJ1aWxkX3ZlbmRvckAsdW5rbm93biw7dCB0CitzLEBidWlsZF9vc0AsbGludXgtZ251LDt0IHQKK3MsQGhvc3RALHg4Nl82NC11bmtub3duLWxpbnV4LWdudSw7dCB0CitzLEBob3N0X2NwdUAseDg2XzY0LDt0IHQKK3MsQGhvc3RfdmVuZG9yQCx1bmtub3duLDt0IHQKK3MsQGhvc3Rfb3NALGxpbnV4LWdudSw7dCB0CitzLEBNQUlOVEFJTkVSX01PREVfVFJVRUAsIyw7dCB0CitzLEBNQUlOVEFJTkVSX01PREVfRkFMU0VALCw7dCB0CitzLEBNQUlOVEAsIyw7dCB0CitzLEBQRVJMQCwsO3QgdAorcyxAQ0NALGdjYyw7dCB0CitzLEBhY19jdF9DQ0AsZ2NjLDt0IHQKK3MsQENGTEFHU0AsLW0zMiAtZyw7dCB0CitzLEBMREZMQUdTQCwsO3QgdAorcyxAQ1BQRkxBR1NALCAtV2FsbCAtV21pc3NpbmctcHJvdG90eXBlcyAtV3VudXNlZCAtV3NoYWRvdyAtV3BvaW50ZXItYXJpdGggLWZhbGlnbi1qdW1wcz0xIC1mYWxpZ24tbG9vcHM9MSAtZmFsaWduLWZ1bmN0aW9ucz0xIC1XdW5kZWYsO3QgdAorcyxARVhFRVhUQCwsO3QgdAorcyxAT0JKRVhUQCxvLDt0IHQKK3MsQERFUERJUkAsLmRlcHMsO3QgdAorcyxAYW1fX2luY2x1ZGVALGluY2x1ZGUsO3QgdAorcyxAYW1fX3F1b3RlQCwsO3QgdAorcyxAQU1ERVBfVFJVRUAsLDt0IHQKK3MsQEFNREVQX0ZBTFNFQCwjLDt0IHQKK3MsQEFNREVQQkFDS1NMQVNIQCxcLDt0IHQKK3MsQENDREVQTU9ERUAsZGVwbW9kZT1nY2MzLDt0IHQKK3MsQGFtX19mYXN0ZGVwQ0NfVFJVRUAsLDt0IHQKK3MsQGFtX19mYXN0ZGVwQ0NfRkFMU0VALCMsO3QgdAorcyxAQ0NBU0AsZ2NjLDt0IHQKK3MsQFJBTkxJQkAscmFubGliLDt0IHQKK3MsQGFjX2N0X1JBTkxJQkAscmFubGliLDt0IHQKK3MsQFNUQUdFMV9DRkxBR1NALC1PMiw7dCB0CitzLEBTVEFHRTJfQ0ZMQUdTQCwtT3MsO3QgdAorcyxAR1JVQl9DRkxBR1NALC1PMiw7dCB0CitzLEBPQkpDT1BZQCxvYmpjb3B5LDt0IHQKK3MsQGFjX2N0X09CSkNPUFlALG9iamNvcHksO3QgdAorcyxAR1JVQl9MSUJTQCwgLWxuY3Vyc2VzLDt0IHQKK3MsQENQUEAsZ2NjIC1FLDt0IHQKK3MsQEVHUkVQQCxncmVwIC1FLDt0IHQKK3MsQE5FVEJPT1RfU1VQUE9SVF9UUlVFQCwjLDt0IHQKK3MsQE5FVEJPT1RfU1VQUE9SVF9GQUxTRUAsLDt0IHQKK3MsQERJU0tMRVNTX1NVUFBPUlRfVFJVRUAsIyw7dCB0CitzLEBESVNLTEVTU19TVVBQT1JUX0ZBTFNFQCwsO3QgdAorcyxASEVSQ1VMRVNfU1VQUE9SVF9UUlVFQCwsO3QgdAorcyxASEVSQ1VMRVNfU1VQUE9SVF9GQUxTRUAsIyw7dCB0CitzLEBTRVJJQUxfU1VQUE9SVF9UUlVFQCwsO3QgdAorcyxAU0VSSUFMX1NVUFBPUlRfRkFMU0VALCMsO3QgdAorcyxAU0VSSUFMX1NQRUVEX1NJTVVMQVRJT05fVFJVRUAsIyw7dCB0CitzLEBTRVJJQUxfU1BFRURfU0lNVUxBVElPTl9GQUxTRUAsLDt0IHQKK3MsQEJVSUxEX0VYQU1QTEVfS0VSTkVMX1RSVUVALCMsO3QgdAorcyxAQlVJTERfRVhBTVBMRV9LRVJORUxfRkFMU0VALCw7dCB0CitzLEBGU1lTX0NGTEFHU0AsIC1ERlNZU19FWFQyRlM9MSAtREZTWVNfRkFUPTEgLURVU0VfTUQ1X1BBU1NXT1JEUz0xLDt0IHQKK3MsQE5FVF9DRkxBR1NALCw7dCB0CitzLEBORVRfRVhUUkFGTEFHU0AsIC1EQ09OR0VTVEVEPTEgLURORV9TQ0FOPTB4MjgwLDB4MzAwLDB4MzIwLDB4MzQwIC1EV0RfREVGQVVMVF9NRU09MHhDQzAwMCw7dCB0CitzLEBORVRCT09UX0RSSVZFUlNALCw7dCB0CitzLEBDQ0FTRkxBR1NALCQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKENQUEZMQUdTKSAkKENGTEFHUyksO3QgdAorcyxATElCT0JKU0AsLDt0IHQKK3MsQExUTElCT0JKU0AsLDt0IHQKK0NFT0YKKworICAjIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAorICAjIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KKyAgYWNfbWF4X3NlZF9saW5lcz00OAorICBhY19zZWRfZnJhZz0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KKyAgYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCisgIGFjX2VuZD0kYWNfbWF4X3NlZF9saW5lcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCisgIGFjX21vcmVfbGluZXM9OgorICBhY19zZWRfY21kcz0KKyAgd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCisgICAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCisgICAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgJHRtcC9zdWJzLnNlZCA+JHRtcC9zdWJzLmZyYWcKKyAgICBlbHNlCisgICAgICBzZWQgIiR7YWNfZW5kfXEiICR0bXAvc3Vicy5zZWQgPiR0bXAvc3Vicy5mcmFnCisgICAgZmkKKyAgICBpZiB0ZXN0ICEgLXMgJHRtcC9zdWJzLmZyYWc7IHRoZW4KKyAgICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKKyAgICBlbHNlCisgICAgICAjIFRoZSBwdXJwb3NlIG9mIHRoZSBsYWJlbCBhbmQgb2YgdGhlIGJyYW5jaGluZyBjb25kaXRpb24gaXMgdG8KKyAgICAgICMgc3BlZWQgdXAgdGhlIHNlZCBwcm9jZXNzaW5nIChpZiB0aGVyZSBhcmUgbm8gYEAnIGF0IGFsbCwgdGhlcmUKKyAgICAgICMgaXMgbm8gbmVlZCB0byBicm93c2UgYW55IG9mIHRoZSBzdWJzdGl0dXRpb25zKS4KKyAgICAgICMgVGhlc2UgYXJlIHRoZSB0d28gZXh0cmEgc2VkIGNvbW1hbmRzIG1lbnRpb25lZCBhYm92ZS4KKyAgICAgIChlY2hvICc6dAorICAvQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiJyAmJiBjYXQgJHRtcC9zdWJzLmZyYWcpID4kdG1wL3N1YnMtJGFjX3NlZF9mcmFnLnNlZAorICAgICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorCWFjX3NlZF9jbWRzPSJzZWQgLWYgJHRtcC9zdWJzLSRhY19zZWRfZnJhZy5zZWQiCisgICAgICBlbHNlCisJYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiAkdG1wL3N1YnMtJGFjX3NlZF9mcmFnLnNlZCIKKyAgICAgIGZpCisgICAgICBhY19zZWRfZnJhZz1gZXhwciAkYWNfc2VkX2ZyYWcgKyAxYAorICAgICAgYWNfYmVnPSRhY19lbmQKKyAgICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfbGluZXNgCisgICAgZmkKKyAgZG9uZQorICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgICAgYWNfc2VkX2NtZHM9Y2F0CisgIGZpCitmaSAjIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiCisKK2ZvciBhY19maWxlIGluIDogJENPTkZJR19GSUxFUzsgZG8gdGVzdCAieCRhY19maWxlIiA9IHg6ICYmIGNvbnRpbnVlCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAkYWNfZmlsZSBpbgorICAtIHwgKjotIHwgKjotOiogKSAjIGlucHV0IGZyb20gc3RkaW4KKwljYXQgPiR0bXAvc3RkaW4KKwlhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsW146XSo6LCwnYAorCWFjX2ZpbGU9YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyw6LiosLCdgIDs7CisgICo6KiApIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyxbXjpdKjosLCdgCisJYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLDouKiwsJ2AgOzsKKyAgKiApICAgYWNfZmlsZV9pbj0kYWNfZmlsZS5pbiA7OworICBlc2FjCisKKyAgIyBDb21wdXRlIEBzcmNkaXJALCBAdG9wX3NyY2RpckAsIGFuZCBASU5TVEFMTEAgZm9yIHN1YmRpcmVjdG9yaWVzLgorICBhY19kaXI9YChkaXJuYW1lICIkYWNfZmlsZSIpIDI+L2Rldi9udWxsIHx8CiskYXNfZXhwciBYIiRhY19maWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvXCknIFx8IFwKKwkgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgiJGFjX2ZpbGUiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXClbXi9dLioveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYAorICB7IGlmICRhc19ta2Rpcl9wOyB0aGVuCisgICAgbWtkaXIgLXAgIiRhY19kaXIiCisgIGVsc2UKKyAgICBhc19kaXI9IiRhY19kaXIiCisgICAgYXNfZGlycz0KKyAgICB3aGlsZSB0ZXN0ICEgLWQgIiRhc19kaXIiOyBkbworICAgICAgYXNfZGlycz0iJGFzX2RpciAkYXNfZGlycyIKKyAgICAgIGFzX2Rpcj1gKGRpcm5hbWUgIiRhc19kaXIiKSAyPi9kZXYvbnVsbCB8fAorJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IFwKKwkgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgiJGFzX2RpciIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKVteL10uKi97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wpLioveyBzLy9cMS87IHE7IH0KKyAgCSAgcy8uKi8uLzsgcSdgCisgICAgZG9uZQorICAgIHRlc3QgISAtbiAiJGFzX2RpcnMiIHx8IG1rZGlyICRhc19kaXJzCisgIGZpIHx8IHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5IFwiJGFjX2RpclwiIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5IFwiJGFjX2RpclwiIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OyB9CisKKyAgYWNfYnVpbGRkaXI9LgorCitpZiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgIGFjX2Rpcl9zdWZmaXg9L2BlY2hvICIkYWNfZGlyIiB8IHNlZCAncyxeXC5bXFwvXSwsJ2AKKyAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgYWNfdG9wX2J1aWxkZGlyPWBlY2hvICIkYWNfZGlyX3N1ZmZpeCIgfCBzZWQgJ3MsL1teXFwvXSosLi4vLGcnYAorZWxzZQorICBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXI9CitmaQorCitjYXNlICRzcmNkaXIgaW4KKyAgLikgICMgTm8gLS1zcmNkaXIgb3B0aW9uLiAgV2UgYXJlIGJ1aWxkaW5nIGluIHBsYWNlLgorICAgIGFjX3NyY2Rpcj0uCisgICAgaWYgdGVzdCAteiAiJGFjX3RvcF9idWlsZGRpciI7IHRoZW4KKyAgICAgICBhY190b3Bfc3JjZGlyPS4KKyAgICBlbHNlCisgICAgICAgYWNfdG9wX3NyY2Rpcj1gZWNobyAkYWNfdG9wX2J1aWxkZGlyIHwgc2VkICdzLC8kLCwnYAorICAgIGZpIDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgcGF0aC4KKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpciA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgYWNfc3JjZGlyPSRhY190b3BfYnVpbGRkaXIkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXIkc3JjZGlyIDs7Citlc2FjCisKKyMgRG8gbm90IHVzZSBgY2QgZm9vICYmIHB3ZGAgdG8gY29tcHV0ZSBhYnNvbHV0ZSBwYXRocywgYmVjYXVzZQorIyB0aGUgZGlyZWN0b3JpZXMgbWF5IG5vdCBleGlzdC4KK2Nhc2UgYHB3ZGAgaW4KKy4pIGFjX2Fic19idWlsZGRpcj0iJGFjX2RpciI7OworKikKKyAgY2FzZSAiJGFjX2RpciIgaW4KKyAgLikgYWNfYWJzX2J1aWxkZGlyPWBwd2RgOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfYnVpbGRkaXI9IiRhY19kaXIiOzsKKyAgKikgYWNfYWJzX2J1aWxkZGlyPWBwd2RgLyIkYWNfZGlyIjs7CisgIGVzYWM7OworZXNhYworY2FzZSAkYWNfYWJzX2J1aWxkZGlyIGluCisuKSBhY19hYnNfdG9wX2J1aWxkZGlyPSR7YWNfdG9wX2J1aWxkZGlyfS47OworKikKKyAgY2FzZSAke2FjX3RvcF9idWlsZGRpcn0uIGluCisgIC4pIGFjX2Fic190b3BfYnVpbGRkaXI9JGFjX2Fic19idWlsZGRpcjs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3RvcF9idWlsZGRpcj0ke2FjX3RvcF9idWlsZGRpcn0uOzsKKyAgKikgYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfYWJzX2J1aWxkZGlyLyR7YWNfdG9wX2J1aWxkZGlyfS47OworICBlc2FjOzsKK2VzYWMKK2Nhc2UgJGFjX2Fic19idWlsZGRpciBpbgorLikgYWNfYWJzX3NyY2Rpcj0kYWNfc3JjZGlyOzsKKyopCisgIGNhc2UgJGFjX3NyY2RpciBpbgorICAuKSBhY19hYnNfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXI7OworICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic19zcmNkaXI9JGFjX3NyY2Rpcjs7CisgICopIGFjX2Fic19zcmNkaXI9JGFjX2Fic19idWlsZGRpci8kYWNfc3JjZGlyOzsKKyAgZXNhYzs7Citlc2FjCitjYXNlICRhY19hYnNfYnVpbGRkaXIgaW4KKy4pIGFjX2Fic190b3Bfc3JjZGlyPSRhY190b3Bfc3JjZGlyOzsKKyopCisgIGNhc2UgJGFjX3RvcF9zcmNkaXIgaW4KKyAgLikgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX2Fic19idWlsZGRpcjs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3RvcF9zcmNkaXI7OworICAqKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyLyRhY190b3Bfc3JjZGlyOzsKKyAgZXNhYzs7Citlc2FjCisKKworICBjYXNlICRJTlNUQUxMIGluCisgIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX0lOU1RBTEw9JElOU1RBTEwgOzsKKyAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkZGlyJElOU1RBTEwgOzsKKyAgZXNhYworCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyAkYWNfZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQorICAgIHJtIC1mICIkYWNfZmlsZSIKKyAgZmkKKyAgIyBMZXQncyBzdGlsbCBwcmV0ZW5kIGl0IGlzIGBjb25maWd1cmUnIHdoaWNoIGluc3RhbnRpYXRlcyAoaS5lLiwgZG9uJ3QKKyAgIyB1c2UgJGFzX21lKSwgcGVvcGxlIHdvdWxkIGJlIHN1cnByaXNlZCB0byByZWFkOgorICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLworICBpZiB0ZXN0IHgiJGFjX2ZpbGUiID0geC07IHRoZW4KKyAgICBjb25maWd1cmVfaW5wdXQ9CisgIGVsc2UKKyAgICBjb25maWd1cmVfaW5wdXQ9IiRhY19maWxlLiAgIgorICBmaQorICBjb25maWd1cmVfaW5wdXQ9JGNvbmZpZ3VyZV9pbnB1dCJHZW5lcmF0ZWQgZnJvbSBgZWNobyAkYWNfZmlsZV9pbiB8CisJCQkJICAgICBzZWQgJ3MsLiovLCwnYCBieSBjb25maWd1cmUuIgorCisgICMgRmlyc3QgbG9vayBmb3IgdGhlIGlucHV0IGZpbGVzIGluIHRoZSBidWlsZCB0cmVlLCBvdGhlcndpc2UgaW4gdGhlCisgICMgc3JjIHRyZWUuCisgIGFjX2ZpbGVfaW5wdXRzPWBJRlM9OgorICAgIGZvciBmIGluICRhY19maWxlX2luOyBkbworICAgICAgY2FzZSAkZiBpbgorICAgICAgLSkgZWNobyAkdG1wL3N0ZGluIDs7CisgICAgICBbXFwvJF0qKQorCSAjIEFic29sdXRlIChjYW4ndCBiZSBET1Mtc3R5bGUsIGFzIElGUz06KQorCSB0ZXN0IC1mICIkZiIgfHwgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKwkgZWNobyAiJGYiOzsKKyAgICAgICopICMgUmVsYXRpdmUKKwkgaWYgdGVzdCAtZiAiJGYiOyB0aGVuCisJICAgIyBCdWlsZCB0cmVlCisJICAgZWNobyAiJGYiCisJIGVsaWYgdGVzdCAtZiAiJHNyY2Rpci8kZiI7IHRoZW4KKwkgICAjIFNvdXJjZSB0cmVlCisJICAgZWNobyAiJHNyY2Rpci8kZiIKKwkgZWxzZQorCSAgICMgL2Rldi9udWxsIHRyZWUKKwkgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCSBmaTs7CisgICAgICBlc2FjCisgICAgZG9uZWAgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9CisgIHNlZCAiL15bCSBdKlZQQVRIWwkgXSo9L3sKK3MvOipcJChzcmNkaXIpOiovOi87CitzLzoqXCR7c3JjZGlyfToqLzovOworcy86KkBzcmNkaXJAOiovOi87CitzL15cKFtePV0qPVsJIF0qXCk6Ki9cMS87CitzLzoqJC8vOworcy9eW149XSo9WwkgXSokLy87Cit9CisKKzp0CisvQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiCitzLEBjb25maWd1cmVfaW5wdXRALCRjb25maWd1cmVfaW5wdXQsO3QgdAorcyxAc3JjZGlyQCwkYWNfc3JjZGlyLDt0IHQKK3MsQGFic19zcmNkaXJALCRhY19hYnNfc3JjZGlyLDt0IHQKK3MsQHRvcF9zcmNkaXJALCRhY190b3Bfc3JjZGlyLDt0IHQKK3MsQGFic190b3Bfc3JjZGlyQCwkYWNfYWJzX3RvcF9zcmNkaXIsO3QgdAorcyxAYnVpbGRkaXJALCRhY19idWlsZGRpciw7dCB0CitzLEBhYnNfYnVpbGRkaXJALCRhY19hYnNfYnVpbGRkaXIsO3QgdAorcyxAdG9wX2J1aWxkZGlyQCwkYWNfdG9wX2J1aWxkZGlyLDt0IHQKK3MsQGFic190b3BfYnVpbGRkaXJALCRhY19hYnNfdG9wX2J1aWxkZGlyLDt0IHQKK3MsQElOU1RBTExALCRhY19JTlNUQUxMLDt0IHQKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4kdG1wL291dAorICBybSAtZiAkdG1wL3N0ZGluCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKyAgICBtdiAkdG1wL291dCAkYWNfZmlsZQorICBlbHNlCisgICAgY2F0ICR0bXAvb3V0CisgICAgcm0gLWYgJHRtcC9vdXQKKyAgZmkKKworZG9uZQorCisjCisjIENPTkZJR19IRUFERVIgc2VjdGlvbi4KKyMKKworIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKKyMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KKyMKKyMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KK2FjX2RBPSdzLF5cKFsJIF0qXCkjXChbCSBdKmRlZmluZVsJIF1bCSBdKlwpJworYWNfZEI9J1sJIF0uKiQsXDEjXDInCithY19kQz0nICcKK2FjX2REPScsO3QnCisjIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfdUE9J3MsXlwoWwkgXSpcKSNcKFsJIF0qXCl1bmRlZlwoWwkgXVsJIF0qXCknCithY191Qj0nJCxcMSNcMmRlZmluZVwzJworYWNfdUM9JyAnCithY191RD0nLDt0JworCitmb3IgYWNfZmlsZSBpbiA6ICRDT05GSUdfSEVBREVSUzsgZG8gdGVzdCAieCRhY19maWxlIiA9IHg6ICYmIGNvbnRpbnVlCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAkYWNfZmlsZSBpbgorICAtIHwgKjotIHwgKjotOiogKSAjIGlucHV0IGZyb20gc3RkaW4KKwljYXQgPiR0bXAvc3RkaW4KKwlhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsW146XSo6LCwnYAorCWFjX2ZpbGU9YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyw6LiosLCdgIDs7CisgICo6KiApIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyxbXjpdKjosLCdgCisJYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLDouKiwsJ2AgOzsKKyAgKiApICAgYWNfZmlsZV9pbj0kYWNfZmlsZS5pbiA7OworICBlc2FjCisKKyAgdGVzdCB4IiRhY19maWxlIiAhPSB4LSAmJiB7IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyAkYWNfZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQorCisgICMgRmlyc3QgbG9vayBmb3IgdGhlIGlucHV0IGZpbGVzIGluIHRoZSBidWlsZCB0cmVlLCBvdGhlcndpc2UgaW4gdGhlCisgICMgc3JjIHRyZWUuCisgIGFjX2ZpbGVfaW5wdXRzPWBJRlM9OgorICAgIGZvciBmIGluICRhY19maWxlX2luOyBkbworICAgICAgY2FzZSAkZiBpbgorICAgICAgLSkgZWNobyAkdG1wL3N0ZGluIDs7CisgICAgICBbXFwvJF0qKQorCSAjIEFic29sdXRlIChjYW4ndCBiZSBET1Mtc3R5bGUsIGFzIElGUz06KQorCSB0ZXN0IC1mICIkZiIgfHwgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKwkgIyBEbyBxdW90ZSAkZiwgdG8gcHJldmVudCBET1MgcGF0aHMgZnJvbSBiZWluZyBJRlMnZC4KKwkgZWNobyAiJGYiOzsKKyAgICAgICopICMgUmVsYXRpdmUKKwkgaWYgdGVzdCAtZiAiJGYiOyB0aGVuCisJICAgIyBCdWlsZCB0cmVlCisJICAgZWNobyAiJGYiCisJIGVsaWYgdGVzdCAtZiAiJHNyY2Rpci8kZiI7IHRoZW4KKwkgICAjIFNvdXJjZSB0cmVlCisJICAgZWNobyAiJHNyY2Rpci8kZiIKKwkgZWxzZQorCSAgICMgL2Rldi9udWxsIHRyZWUKKwkgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCSBmaTs7CisgICAgICBlc2FjCisgICAgZG9uZWAgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9CisgICMgUmVtb3ZlIHRoZSB0cmFpbGluZyBzcGFjZXMuCisgIHNlZCAncy9bCSBdKiQvLycgJGFjX2ZpbGVfaW5wdXRzID4kdG1wL2luCisKKyAgIyBIYW5kbGUgYWxsIHRoZSAjZGVmaW5lIHRlbXBsYXRlcyBvbmx5IGlmIG5lY2Vzc2FyeS4KKyAgaWYgZ3JlcCAiXlsJIF0qI1sJIF0qZGVmaW5lIiAkdG1wL2luID4vZGV2L251bGw7IHRoZW4KKyAgIyBJZiB0aGVyZSBhcmUgbm8gZGVmaW5lcywgd2UgbWF5IGhhdmUgYW4gZW1wdHkgaWYvZmkKKyAgOgorICBjYXQgPiR0bXAvZGVmaW5lcy5zZWQgPDxDRU9GCisvXlsJIF0qI1sJIF0qZGVmaW5lLyFiCit0IGNscgorOiBjbHIKKyR7YWNfZEF9UEFDS0FHRV9OQU1FJHthY19kQn1QQUNLQUdFX05BTUUke2FjX2RDfSJHUlVCIiR7YWNfZER9Ciske2FjX2RBfVBBQ0tBR0VfVEFSTkFNRSR7YWNfZEJ9UEFDS0FHRV9UQVJOQU1FJHthY19kQ30iZ3J1YiIke2FjX2REfQorJHthY19kQX1QQUNLQUdFX1ZFUlNJT04ke2FjX2RCfVBBQ0tBR0VfVkVSU0lPTiR7YWNfZEN9IjAuOTciJHthY19kRH0KKyR7YWNfZEF9UEFDS0FHRV9TVFJJTkcke2FjX2RCfVBBQ0tBR0VfU1RSSU5HJHthY19kQ30iR1JVQiAwLjk3IiR7YWNfZER9Ciske2FjX2RBfVBBQ0tBR0VfQlVHUkVQT1JUJHthY19kQn1QQUNLQUdFX0JVR1JFUE9SVCR7YWNfZEN9ImJ1Zy1ncnViQGdudS5vcmciJHthY19kRH0KKyR7YWNfZEF9UEFDS0FHRSR7YWNfZEJ9UEFDS0FHRSR7YWNfZEN9ImdydWIiJHthY19kRH0KKyR7YWNfZEF9VkVSU0lPTiR7YWNfZEJ9VkVSU0lPTiR7YWNfZEN9IjAuOTciJHthY19kRH0KKyR7YWNfZEF9QUREUjMyJHthY19kQn1BRERSMzIke2FjX2RDfWFkZHIzMiR7YWNfZER9Ciske2FjX2RBfURBVEEzMiR7YWNfZEJ9REFUQTMyJHthY19kQ31kYXRhMzIke2FjX2REfQorJHthY19kQX1IQVZFX1VTQ09SRV9TVEFSVF9TWU1CT0wke2FjX2RCfUhBVkVfVVNDT1JFX1NUQVJUX1NZTUJPTCR7YWNfZEN9MSR7YWNfZER9Ciske2FjX2RBfUhBVkVfVVNDT1JFX1VTQ09SRV9CU1NfU1RBUlRfU1lNQk9MJHthY19kQn1IQVZFX1VTQ09SRV9VU0NPUkVfQlNTX1NUQVJUX1NZTUJPTCR7YWNfZEN9MSR7YWNfZER9Ciske2FjX2RBfUhBVkVfVVNDT1JFX0VEQVRBX1NZTUJPTCR7YWNfZEJ9SEFWRV9VU0NPUkVfRURBVEFfU1lNQk9MJHthY19kQ30xJHthY19kRH0KKyR7YWNfZEF9SEFWRV9FREFUQV9TWU1CT0wke2FjX2RCfUhBVkVfRURBVEFfU1lNQk9MJHthY19kQ30xJHthY19kRH0KKyR7YWNfZEF9SEFWRV9FTkRfU1lNQk9MJHthY19kQn1IQVZFX0VORF9TWU1CT0wke2FjX2RDfTEke2FjX2REfQorJHthY19kQX1IQVZFX1VTQ09SRV9FTkRfU1lNQk9MJHthY19kQn1IQVZFX1VTQ09SRV9FTkRfU1lNQk9MJHthY19kQ30xJHthY19kRH0KKyR7YWNfZEF9SEFWRV9MSUJDVVJTRVMke2FjX2RCfUhBVkVfTElCQ1VSU0VTJHthY19kQ30xJHthY19kRH0KKyR7YWNfZEF9U1REQ19IRUFERVJTJHthY19kQn1TVERDX0hFQURFUlMke2FjX2RDfTEke2FjX2REfQorJHthY19kQX1IQVZFX1NZU19UWVBFU19IJHthY19kQn1IQVZFX1NZU19UWVBFU19IJHthY19kQ30xJHthY19kRH0KKyR7YWNfZEF9SEFWRV9TWVNfU1RBVF9IJHthY19kQn1IQVZFX1NZU19TVEFUX0gke2FjX2RDfTEke2FjX2REfQorJHthY19kQX1IQVZFX1NURExJQl9IJHthY19kQn1IQVZFX1NURExJQl9IJHthY19kQ30xJHthY19kRH0KKyR7YWNfZEF9SEFWRV9TVFJJTkdfSCR7YWNfZEJ9SEFWRV9TVFJJTkdfSCR7YWNfZEN9MSR7YWNfZER9Ciske2FjX2RBfUhBVkVfTUVNT1JZX0gke2FjX2RCfUhBVkVfTUVNT1JZX0gke2FjX2RDfTEke2FjX2REfQorJHthY19kQX1IQVZFX1NUUklOR1NfSCR7YWNfZEJ9SEFWRV9TVFJJTkdTX0gke2FjX2RDfTEke2FjX2REfQorJHthY19kQX1IQVZFX0lOVFRZUEVTX0gke2FjX2RCfUhBVkVfSU5UVFlQRVNfSCR7YWNfZEN9MSR7YWNfZER9Ciske2FjX2RBfUhBVkVfU1RESU5UX0gke2FjX2RCfUhBVkVfU1RESU5UX0gke2FjX2RDfTEke2FjX2REfQorJHthY19kQX1IQVZFX1VOSVNURF9IJHthY19kQn1IQVZFX1VOSVNURF9IJHthY19kQ30xJHthY19kRH0KKyR7YWNfZEF9SEFWRV9TVFJJTkdfSCR7YWNfZEJ9SEFWRV9TVFJJTkdfSCR7YWNfZEN9MSR7YWNfZER9Ciske2FjX2RBfUhBVkVfU1RSSU5HU19IJHthY19kQn1IQVZFX1NUUklOR1NfSCR7YWNfZEN9MSR7YWNfZER9Ciske2FjX2RBfUhBVkVfTkNVUlNFU19IJHthY19kQn1IQVZFX05DVVJTRVNfSCR7YWNfZEN9MSR7YWNfZER9Ciske2FjX2RBfUhBVkVfQ1VSU0VTX0gke2FjX2RCfUhBVkVfQ1VSU0VTX0gke2FjX2RDfTEke2FjX2REfQorJHthY19kQX1QUkVTRVRfTUVOVV9TVFJJTkcke2FjX2RCfVBSRVNFVF9NRU5VX1NUUklORyR7YWNfZEN9IiIke2FjX2REfQorQ0VPRgorICBzZWQgLWYgJHRtcC9kZWZpbmVzLnNlZCAkdG1wL2luID4kdG1wL291dAorICBybSAtZiAkdG1wL2luCisgIG12ICR0bXAvb3V0ICR0bXAvaW4KKworICBmaSAjIGdyZXAKKworICAjIEhhbmRsZSBhbGwgdGhlICN1bmRlZiB0ZW1wbGF0ZXMKKyAgY2F0ID4kdG1wL3VuZGVmcy5zZWQgPDxDRU9GCisvXlsJIF0qI1sJIF0qdW5kZWYvIWIKK3QgY2xyCis6IGNscgorJHthY191QX1QQUNLQUdFX05BTUUke2FjX3VCfVBBQ0tBR0VfTkFNRSR7YWNfdUN9IkdSVUIiJHthY191RH0KKyR7YWNfdUF9UEFDS0FHRV9UQVJOQU1FJHthY191Qn1QQUNLQUdFX1RBUk5BTUUke2FjX3VDfSJncnViIiR7YWNfdUR9Ciske2FjX3VBfVBBQ0tBR0VfVkVSU0lPTiR7YWNfdUJ9UEFDS0FHRV9WRVJTSU9OJHthY191Q30iMC45NyIke2FjX3VEfQorJHthY191QX1QQUNLQUdFX1NUUklORyR7YWNfdUJ9UEFDS0FHRV9TVFJJTkcke2FjX3VDfSJHUlVCIDAuOTciJHthY191RH0KKyR7YWNfdUF9UEFDS0FHRV9CVUdSRVBPUlQke2FjX3VCfVBBQ0tBR0VfQlVHUkVQT1JUJHthY191Q30iYnVnLWdydWJAZ251Lm9yZyIke2FjX3VEfQorJHthY191QX1QQUNLQUdFJHthY191Qn1QQUNLQUdFJHthY191Q30iZ3J1YiIke2FjX3VEfQorJHthY191QX1WRVJTSU9OJHthY191Qn1WRVJTSU9OJHthY191Q30iMC45NyIke2FjX3VEfQorJHthY191QX1BRERSMzIke2FjX3VCfUFERFIzMiR7YWNfdUN9YWRkcjMyJHthY191RH0KKyR7YWNfdUF9REFUQTMyJHthY191Qn1EQVRBMzIke2FjX3VDfWRhdGEzMiR7YWNfdUR9Ciske2FjX3VBfUhBVkVfVVNDT1JFX1NUQVJUX1NZTUJPTCR7YWNfdUJ9SEFWRV9VU0NPUkVfU1RBUlRfU1lNQk9MJHthY191Q30xJHthY191RH0KKyR7YWNfdUF9SEFWRV9VU0NPUkVfVVNDT1JFX0JTU19TVEFSVF9TWU1CT0wke2FjX3VCfUhBVkVfVVNDT1JFX1VTQ09SRV9CU1NfU1RBUlRfU1lNQk9MJHthY191Q30xJHthY191RH0KKyR7YWNfdUF9SEFWRV9VU0NPUkVfRURBVEFfU1lNQk9MJHthY191Qn1IQVZFX1VTQ09SRV9FREFUQV9TWU1CT0wke2FjX3VDfTEke2FjX3VEfQorJHthY191QX1IQVZFX0VEQVRBX1NZTUJPTCR7YWNfdUJ9SEFWRV9FREFUQV9TWU1CT0wke2FjX3VDfTEke2FjX3VEfQorJHthY191QX1IQVZFX0VORF9TWU1CT0wke2FjX3VCfUhBVkVfRU5EX1NZTUJPTCR7YWNfdUN9MSR7YWNfdUR9Ciske2FjX3VBfUhBVkVfVVNDT1JFX0VORF9TWU1CT0wke2FjX3VCfUhBVkVfVVNDT1JFX0VORF9TWU1CT0wke2FjX3VDfTEke2FjX3VEfQorJHthY191QX1IQVZFX0xJQkNVUlNFUyR7YWNfdUJ9SEFWRV9MSUJDVVJTRVMke2FjX3VDfTEke2FjX3VEfQorJHthY191QX1TVERDX0hFQURFUlMke2FjX3VCfVNURENfSEVBREVSUyR7YWNfdUN9MSR7YWNfdUR9Ciske2FjX3VBfUhBVkVfU1lTX1RZUEVTX0gke2FjX3VCfUhBVkVfU1lTX1RZUEVTX0gke2FjX3VDfTEke2FjX3VEfQorJHthY191QX1IQVZFX1NZU19TVEFUX0gke2FjX3VCfUhBVkVfU1lTX1NUQVRfSCR7YWNfdUN9MSR7YWNfdUR9Ciske2FjX3VBfUhBVkVfU1RETElCX0gke2FjX3VCfUhBVkVfU1RETElCX0gke2FjX3VDfTEke2FjX3VEfQorJHthY191QX1IQVZFX1NUUklOR19IJHthY191Qn1IQVZFX1NUUklOR19IJHthY191Q30xJHthY191RH0KKyR7YWNfdUF9SEFWRV9NRU1PUllfSCR7YWNfdUJ9SEFWRV9NRU1PUllfSCR7YWNfdUN9MSR7YWNfdUR9Ciske2FjX3VBfUhBVkVfU1RSSU5HU19IJHthY191Qn1IQVZFX1NUUklOR1NfSCR7YWNfdUN9MSR7YWNfdUR9Ciske2FjX3VBfUhBVkVfSU5UVFlQRVNfSCR7YWNfdUJ9SEFWRV9JTlRUWVBFU19IJHthY191Q30xJHthY191RH0KKyR7YWNfdUF9SEFWRV9TVERJTlRfSCR7YWNfdUJ9SEFWRV9TVERJTlRfSCR7YWNfdUN9MSR7YWNfdUR9Ciske2FjX3VBfUhBVkVfVU5JU1REX0gke2FjX3VCfUhBVkVfVU5JU1REX0gke2FjX3VDfTEke2FjX3VEfQorJHthY191QX1IQVZFX1NUUklOR19IJHthY191Qn1IQVZFX1NUUklOR19IJHthY191Q30xJHthY191RH0KKyR7YWNfdUF9SEFWRV9TVFJJTkdTX0gke2FjX3VCfUhBVkVfU1RSSU5HU19IJHthY191Q30xJHthY191RH0KKyR7YWNfdUF9SEFWRV9OQ1VSU0VTX0gke2FjX3VCfUhBVkVfTkNVUlNFU19IJHthY191Q30xJHthY191RH0KKyR7YWNfdUF9SEFWRV9DVVJTRVNfSCR7YWNfdUJ9SEFWRV9DVVJTRVNfSCR7YWNfdUN9MSR7YWNfdUR9Ciske2FjX3VBfVBSRVNFVF9NRU5VX1NUUklORyR7YWNfdUJ9UFJFU0VUX01FTlVfU1RSSU5HJHthY191Q30iIiR7YWNfdUR9CitzLF5bCSBdKiNbCSBdKnVuZGVmWwkgXVsJIF0qW2EtekEtWl9dW2EtekEtWl8wLTldKiwvKiAmICovLAorQ0VPRgorICBzZWQgLWYgJHRtcC91bmRlZnMuc2VkICR0bXAvaW4gPiR0bXAvb3V0CisgIHJtIC1mICR0bXAvaW4KKyAgbXYgJHRtcC9vdXQgJHRtcC9pbgorCisgICMgTGV0J3Mgc3RpbGwgcHJldGVuZCBpdCBpcyBgY29uZmlndXJlJyB3aGljaCBpbnN0YW50aWF0ZXMgKGkuZS4sIGRvbid0CisgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKKyAgIyAgICAvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBjb25maWcuc3RhdHVzLiAgKi8KKyAgaWYgdGVzdCB4IiRhY19maWxlIiA9IHgtOyB0aGVuCisgICAgZWNobyAiLyogR2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4gICovIiA+JHRtcC9jb25maWcuaAorICBlbHNlCisgICAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYnkgY29uZmlndXJlLiAgKi8iID4kdG1wL2NvbmZpZy5oCisgIGZpCisgIGNhdCAkdG1wL2luID4+JHRtcC9jb25maWcuaAorICBybSAtZiAkdG1wL2luCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKyAgICBpZiBkaWZmICRhY19maWxlICR0bXAvY29uZmlnLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNQorZWNobyAiJGFzX21lOiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNjt9CisgICAgZWxzZQorICAgICAgYWNfZGlyPWAoZGlybmFtZSAiJGFjX2ZpbGUiKSAyPi9kZXYvbnVsbCB8fAorJGFzX2V4cHIgWCIkYWNfZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoL1wpJyBcfCBcCisJIC4gICAgIDogJ1woLlwpJyAyPi9kZXYvbnVsbCB8fAorZWNobyBYIiRhY19maWxlIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpW14vXS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXCkuKi97IHMvL1wxLzsgcTsgfQorICAJICBzLy4qLy4vOyBxJ2AKKyAgICAgIHsgaWYgJGFzX21rZGlyX3A7IHRoZW4KKyAgICBta2RpciAtcCAiJGFjX2RpciIKKyAgZWxzZQorICAgIGFzX2Rpcj0iJGFjX2RpciIKKyAgICBhc19kaXJzPQorICAgIHdoaWxlIHRlc3QgISAtZCAiJGFzX2RpciI7IGRvCisgICAgICBhc19kaXJzPSIkYXNfZGlyICRhc19kaXJzIgorICAgICAgYXNfZGlyPWAoZGlybmFtZSAiJGFzX2RpciIpIDI+L2Rldi9udWxsIHx8CiskYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgXAorCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKK2VjaG8gWCIkYXNfZGlyIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpW14vXS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXCkuKi97IHMvL1wxLzsgcTsgfQorICAJICBzLy4qLy4vOyBxJ2AKKyAgICBkb25lCisgICAgdGVzdCAhIC1uICIkYXNfZGlycyIgfHwgbWtkaXIgJGFzX2RpcnMKKyAgZmkgfHwgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgXCIkYWNfZGlyXCIiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgXCIkYWNfZGlyXCIiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KKworICAgICAgcm0gLWYgJGFjX2ZpbGUKKyAgICAgIG12ICR0bXAvY29uZmlnLmggJGFjX2ZpbGUKKyAgICBmaQorICBlbHNlCisgICAgY2F0ICR0bXAvY29uZmlnLmgKKyAgICBybSAtZiAkdG1wL2NvbmZpZy5oCisgIGZpCisjIENvbXB1dGUgJGFjX2ZpbGUncyBpbmRleCBpbiAkY29uZmlnX2hlYWRlcnMuCitfYW1fc3RhbXBfY291bnQ9MQorZm9yIF9hbV9oZWFkZXIgaW4gJGNvbmZpZ19oZWFkZXJzIDo7IGRvCisgIGNhc2UgJF9hbV9oZWFkZXIgaW4KKyAgICAkYWNfZmlsZSB8ICRhY19maWxlOiogKQorICAgICAgYnJlYWsgOzsKKyAgICAqICkKKyAgICAgIF9hbV9zdGFtcF9jb3VudD1gZXhwciAkX2FtX3N0YW1wX2NvdW50ICsgMWAgOzsKKyAgZXNhYworZG9uZQorZWNobyAidGltZXN0YW1wIGZvciAkYWNfZmlsZSIgPmAoZGlybmFtZSAkYWNfZmlsZSkgMj4vZGV2L251bGwgfHwKKyRhc19leHByIFgkYWNfZmlsZSA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYJGFjX2ZpbGUgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCRhY19maWxlIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgkYWNfZmlsZSA6ICdYXCgvXCknIFx8IFwKKwkgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgkYWNfZmlsZSB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpW14vXS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXCkuKi97IHMvL1wxLzsgcTsgfQorICAJICBzLy4qLy4vOyBxJ2Avc3RhbXAtaCRfYW1fc3RhbXBfY291bnQKK2RvbmUKKworIworIyBDT05GSUdfQ09NTUFORFMgc2VjdGlvbi4KKyMKK2ZvciBhY19maWxlIGluIDogJENPTkZJR19DT01NQU5EUzsgZG8gdGVzdCAieCRhY19maWxlIiA9IHg6ICYmIGNvbnRpbnVlCisgIGFjX2Rlc3Q9YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyw6LiosLCdgCisgIGFjX3NvdXJjZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLFteOl0qOiwsJ2AKKyAgYWNfZGlyPWAoZGlybmFtZSAiJGFjX2Rlc3QiKSAyPi9kZXYvbnVsbCB8fAorJGFzX2V4cHIgWCIkYWNfZGVzdCIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYWNfZGVzdCIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYWNfZGVzdCIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYWNfZGVzdCIgOiAnWFwoL1wpJyBcfCBcCisJIC4gICAgIDogJ1woLlwpJyAyPi9kZXYvbnVsbCB8fAorZWNobyBYIiRhY19kZXN0IiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpW14vXS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXCkuKi97IHMvL1wxLzsgcTsgfQorICAJICBzLy4qLy4vOyBxJ2AKKyAgeyBpZiAkYXNfbWtkaXJfcDsgdGhlbgorICAgIG1rZGlyIC1wICIkYWNfZGlyIgorICBlbHNlCisgICAgYXNfZGlyPSIkYWNfZGlyIgorICAgIGFzX2RpcnM9CisgICAgd2hpbGUgdGVzdCAhIC1kICIkYXNfZGlyIjsgZG8KKyAgICAgIGFzX2RpcnM9IiRhc19kaXIgJGFzX2RpcnMiCisgICAgICBhc19kaXI9YChkaXJuYW1lICIkYXNfZGlyIikgMj4vZGV2L251bGwgfHwKKyRhc19leHByIFgiJGFzX2RpciIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoL1wpJyBcfCBcCisJIC4gICAgIDogJ1woLlwpJyAyPi9kZXYvbnVsbCB8fAorZWNobyBYIiRhc19kaXIiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXClbXi9dLioveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYAorICAgIGRvbmUKKyAgICB0ZXN0ICEgLW4gIiRhc19kaXJzIiB8fCBta2RpciAkYXNfZGlycworICBmaSB8fCB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSBcIiRhY19kaXJcIiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSBcIiRhY19kaXJcIiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTsgfQorCisgIGFjX2J1aWxkZGlyPS4KKworaWYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICBhY19kaXJfc3VmZml4PS9gZWNobyAiJGFjX2RpciIgfCBzZWQgJ3MsXlwuW1xcL10sLCdgCisgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgIGFjX3RvcF9idWlsZGRpcj1gZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzLC9bXlxcL10qLC4uLyxnJ2AKK2Vsc2UKKyAgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyPQorZmkKKworY2FzZSAkc3JjZGlyIGluCisgIC4pICAjIE5vIC0tc3JjZGlyIG9wdGlvbi4gIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KKyAgICBhY19zcmNkaXI9LgorICAgIGlmIHRlc3QgLXogIiRhY190b3BfYnVpbGRkaXIiOyB0aGVuCisgICAgICAgYWNfdG9wX3NyY2Rpcj0uCisgICAgZWxzZQorICAgICAgIGFjX3RvcF9zcmNkaXI9YGVjaG8gJGFjX3RvcF9idWlsZGRpciB8IHNlZCAncywvJCwsJ2AKKyAgICBmaSA7OworICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIHBhdGguCisgICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKKyAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyJHNyY2RpciRhY19kaXJfc3VmZml4CisgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyJHNyY2RpciA7OworZXNhYworCisjIERvIG5vdCB1c2UgYGNkIGZvbyAmJiBwd2RgIHRvIGNvbXB1dGUgYWJzb2x1dGUgcGF0aHMsIGJlY2F1c2UKKyMgdGhlIGRpcmVjdG9yaWVzIG1heSBub3QgZXhpc3QuCitjYXNlIGBwd2RgIGluCisuKSBhY19hYnNfYnVpbGRkaXI9IiRhY19kaXIiOzsKKyopCisgIGNhc2UgIiRhY19kaXIiIGluCisgIC4pIGFjX2Fic19idWlsZGRpcj1gcHdkYDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX2J1aWxkZGlyPSIkYWNfZGlyIjs7CisgICopIGFjX2Fic19idWlsZGRpcj1gcHdkYC8iJGFjX2RpciI7OworICBlc2FjOzsKK2VzYWMKK2Nhc2UgJGFjX2Fic19idWlsZGRpciBpbgorLikgYWNfYWJzX3RvcF9idWlsZGRpcj0ke2FjX3RvcF9idWlsZGRpcn0uOzsKKyopCisgIGNhc2UgJHthY190b3BfYnVpbGRkaXJ9LiBpbgorICAuKSBhY19hYnNfdG9wX2J1aWxkZGlyPSRhY19hYnNfYnVpbGRkaXI7OworICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic190b3BfYnVpbGRkaXI9JHthY190b3BfYnVpbGRkaXJ9Ljs7CisgICopIGFjX2Fic190b3BfYnVpbGRkaXI9JGFjX2Fic19idWlsZGRpci8ke2FjX3RvcF9idWlsZGRpcn0uOzsKKyAgZXNhYzs7Citlc2FjCitjYXNlICRhY19hYnNfYnVpbGRkaXIgaW4KKy4pIGFjX2Fic19zcmNkaXI9JGFjX3NyY2Rpcjs7CisqKQorICBjYXNlICRhY19zcmNkaXIgaW4KKyAgLikgYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfc3JjZGlyPSRhY19zcmNkaXI7OworICAqKSBhY19hYnNfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXIvJGFjX3NyY2Rpcjs7CisgIGVzYWM7OworZXNhYworY2FzZSAkYWNfYWJzX2J1aWxkZGlyIGluCisuKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfdG9wX3NyY2Rpcjs7CisqKQorICBjYXNlICRhY190b3Bfc3JjZGlyIGluCisgIC4pIGFjX2Fic190b3Bfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXI7OworICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic190b3Bfc3JjZGlyPSRhY190b3Bfc3JjZGlyOzsKKyAgKikgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX2Fic19idWlsZGRpci8kYWNfdG9wX3NyY2Rpcjs7CisgIGVzYWM7OworZXNhYworCisKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXhlY3V0aW5nICRhY19kZXN0IGNvbW1hbmRzIiA+JjUKK2VjaG8gIiRhc19tZTogZXhlY3V0aW5nICRhY19kZXN0IGNvbW1hbmRzIiA+JjY7fQorICBjYXNlICRhY19kZXN0IGluCisgICAgZGVwZmlsZXMgKSB0ZXN0IHgiJEFNREVQX1RSVUUiICE9IHgiIiB8fCBmb3IgbWYgaW4gJENPTkZJR19GSUxFUzsgZG8KKyAgIyBTdHJpcCBNRiBzbyB3ZSBlbmQgdXAgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgbWY9YGVjaG8gIiRtZiIgfCBzZWQgLWUgJ3MvOi4qJC8vJ2AKKyAgIyBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYW4gQXV0b21ha2UgZ2VuZXJhdGVkIE1ha2VmaWxlIG9yIG5vdC4KKyAgIyBXZSB1c2VkIHRvIG1hdGNoIG9ubHkgdGhlIGZpbGVzIG5hbWVkIGBNYWtlZmlsZS5pbicsIGJ1dAorICAjIHNvbWUgcGVvcGxlIHJlbmFtZSB0aGVtOyBzbyBpbnN0ZWFkIHdlIGxvb2sgYXQgdGhlIGZpbGUgY29udGVudC4KKyAgIyBHcmVwJ2luZyB0aGUgZmlyc3QgbGluZSBpcyBub3QgZW5vdWdoOiBzb21lIHBlb3BsZSBwb3N0LXByb2Nlc3MKKyAgIyBlYWNoIE1ha2VmaWxlLmluIGFuZCBhZGQgYSBuZXcgbGluZSBvbiB0b3Agb2YgZWFjaCBmaWxlIHRvIHNheSBzby4KKyAgIyBTbyBsZXQncyBncmVwIHdob2xlIGZpbGUuCisgIGlmIGdyZXAgJ14jLipnZW5lcmF0ZWQgYnkgYXV0b21ha2UnICRtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgZGlycGFydD1gKGRpcm5hbWUgIiRtZiIpIDI+L2Rldi9udWxsIHx8CiskYXNfZXhwciBYIiRtZiIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkbWYiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJG1mIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRtZiIgOiAnWFwoL1wpJyBcfCBcCisJIC4gICAgIDogJ1woLlwpJyAyPi9kZXYvbnVsbCB8fAorZWNobyBYIiRtZiIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKVteL10uKi97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wpLioveyBzLy9cMS87IHE7IH0KKyAgCSAgcy8uKi8uLzsgcSdgCisgIGVsc2UKKyAgICBjb250aW51ZQorICBmaQorICAjIEV4dHJhY3QgdGhlIGRlZmluaXRpb24gb2YgREVQRElSLCBhbV9faW5jbHVkZSwgYW5kIGFtX19xdW90ZQorICAjIGZyb20gdGhlIE1ha2VmaWxlIHdpdGhvdXQgcnVubmluZyBgbWFrZScuCisgIERFUERJUj1gc2VkIC1uICdzL15ERVBESVIgPSAvL3AnIDwgIiRtZiJgCisgIHRlc3QgLXogIiRERVBESVIiICYmIGNvbnRpbnVlCisgIGFtX19pbmNsdWRlPWBzZWQgLW4gJ3MvXmFtX19pbmNsdWRlID0gLy9wJyA8ICIkbWYiYAorICB0ZXN0IC16ICJhbV9faW5jbHVkZSIgJiYgY29udGludWUKKyAgYW1fX3F1b3RlPWBzZWQgLW4gJ3MvXmFtX19xdW90ZSA9IC8vcCcgPCAiJG1mImAKKyAgIyBXaGVuIHVzaW5nIGFuc2kya25yLCBVIG1heSBiZSBlbXB0eSBvciBhbiB1bmRlcnNjb3JlOyBleHBhbmQgaXQKKyAgVT1gc2VkIC1uICdzL15VID0gLy9wJyA8ICIkbWYiYAorICAjIEZpbmQgYWxsIGRlcGVuZGVuY3kgb3V0cHV0IGZpbGVzLCB0aGV5IGFyZSBpbmNsdWRlZCBmaWxlcyB3aXRoCisgICMgJChERVBESVIpIGluIHRoZWlyIG5hbWVzLiAgV2UgaW52b2tlIHNlZCB0d2ljZSBiZWNhdXNlIGl0IGlzIHRoZQorICAjIHNpbXBsZXN0IGFwcHJvYWNoIHRvIGNoYW5naW5nICQoREVQRElSKSB0byBpdHMgYWN0dWFsIHZhbHVlIGluIHRoZQorICAjIGV4cGFuc2lvbi4KKyAgZm9yIGZpbGUgaW4gYHNlZCAtbiAiCisgICAgcy9eJGFtX19pbmNsdWRlICRhbV9fcXVvdGVcKC4qKERFUERJUikuKlwpJGFtX19xdW90ZSInJC9cMS9wJyA8IiRtZiIgfCBcCisgICAgICAgc2VkIC1lICdzL1wkKERFUERJUikvJyIkREVQRElSIicvZycgLWUgJ3MvXCRVLyciJFUiJy9nJ2A7IGRvCisgICAgIyBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMuCisgICAgdGVzdCAtZiAiJGRpcnBhcnQvJGZpbGUiICYmIGNvbnRpbnVlCisgICAgZmRpcj1gKGRpcm5hbWUgIiRmaWxlIikgMj4vZGV2L251bGwgfHwKKyRhc19leHByIFgiJGZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGZpbGUiIDogJ1hcKC9cKScgXHwgXAorCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKK2VjaG8gWCIkZmlsZSIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKVteL10uKi97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wpLioveyBzLy9cMS87IHE7IH0KKyAgCSAgcy8uKi8uLzsgcSdgCisgICAgeyBpZiAkYXNfbWtkaXJfcDsgdGhlbgorICAgIG1rZGlyIC1wICRkaXJwYXJ0LyRmZGlyCisgIGVsc2UKKyAgICBhc19kaXI9JGRpcnBhcnQvJGZkaXIKKyAgICBhc19kaXJzPQorICAgIHdoaWxlIHRlc3QgISAtZCAiJGFzX2RpciI7IGRvCisgICAgICBhc19kaXJzPSIkYXNfZGlyICRhc19kaXJzIgorICAgICAgYXNfZGlyPWAoZGlybmFtZSAiJGFzX2RpciIpIDI+L2Rldi9udWxsIHx8CiskYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgXAorCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKK2VjaG8gWCIkYXNfZGlyIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpW14vXS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXCkuKi97IHMvL1wxLzsgcTsgfQorICAJICBzLy4qLy4vOyBxJ2AKKyAgICBkb25lCisgICAgdGVzdCAhIC1uICIkYXNfZGlycyIgfHwgbWtkaXIgJGFzX2RpcnMKKyAgZmkgfHwgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGRpcnBhcnQvJGZkaXIiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGRpcnBhcnQvJGZkaXIiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KKworICAgICMgZWNobyAiY3JlYXRpbmcgJGRpcnBhcnQvJGZpbGUiCisgICAgZWNobyAnIyBkdW1teScgPiAiJGRpcnBhcnQvJGZpbGUiCisgIGRvbmUKK2RvbmUKKyA7OworICBlc2FjCitkb25lCisKK3sgKGV4aXQgMCk7IGV4aXQgMDsgfQpkaWZmIC0tZ2l0IGEvY29uZmlnLnN1YiBiL2NvbmZpZy5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTg3YjE3ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy5zdWIKQEAgLTAsMCArMSwxNTY2IEBACisjISAvYmluL3NoCisjIENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBzdWJyb3V0aW5lIHNjcmlwdC4KKyMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCisjICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKwordGltZXN0YW1wPScyMDA0LTExLTMwJworCisjIFRoaXMgZmlsZSBpcyAoaW4gcHJpbmNpcGxlKSBjb21tb24gdG8gQUxMIEdOVSBzb2Z0d2FyZS4KKyMgVGhlIHByZXNlbmNlIG9mIGEgbWFjaGluZSBpbiB0aGlzIGZpbGUgc3VnZ2VzdHMgdGhhdCBTT01FIEdOVSBzb2Z0d2FyZQorIyBjYW4gaGFuZGxlIHRoYXQgbWFjaGluZS4gIEl0IGRvZXMgbm90IGltcGx5IEFMTCBHTlUgc29mdHdhcmUgY2FuLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisjIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4gIFN1Ym1pdCBhIGNvbnRleHQKKyMgZGlmZiBhbmQgYSBwcm9wZXJseSBmb3JtYXR0ZWQgQ2hhbmdlTG9nIGVudHJ5LgorIworIyBDb25maWd1cmF0aW9uIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgYW5kIGNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gdHlwZS4KKyMgU3VwcGx5IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB0eXBlIGFzIGFuIGFyZ3VtZW50LgorIyBJZiBpdCBpcyBpbnZhbGlkLCB3ZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgZXhpdCB3aXRoIGNvZGUgMS4KKyMgT3RoZXJ3aXNlLCB3ZSBwcmludCB0aGUgY2Fub25pY2FsIGNvbmZpZyB0eXBlIG9uIHN0ZG91dCBhbmQgc3VjY2VlZC4KKworIyBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBHTlUgcGFja2FnZXMKKyMgYW5kIHJlY29nbml6ZSBhbGwgdGhlIENQVSB0eXBlcywgc3lzdGVtIHR5cGVzIGFuZCBhbGlhc2VzCisjIHRoYXQgYXJlIG1lYW5pbmdmdWwgd2l0aCAqYW55KiBHTlUgc29mdHdhcmUuCisjIEVhY2ggcGFja2FnZSBpcyByZXNwb25zaWJsZSBmb3IgcmVwb3J0aW5nIHdoaWNoIHZhbGlkIGNvbmZpZ3VyYXRpb25zCisjIGl0IGRvZXMgbm90IHN1cHBvcnQuICBUaGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBkaXN0aW5ndWlzaAorIyBhIGZhaWx1cmUgdG8gc3VwcG9ydCBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gZnJvbSBhIG1lYW5pbmdsZXNzCisjIGNvbmZpZ3VyYXRpb24uCisKKyMgVGhlIGdvYWwgb2YgdGhpcyBmaWxlIGlzIHRvIG1hcCBhbGwgdGhlIHZhcmlvdXMgdmFyaWF0aW9ucyBvZiBhIGdpdmVuCisjIG1hY2hpbmUgc3BlY2lmaWNhdGlvbiBpbnRvIGEgc2luZ2xlIHNwZWNpZmljYXRpb24gaW4gdGhlIGZvcm06CisjCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCisjIG9yIGluIHNvbWUgY2FzZXMsIHRoZSBuZXdlciBmb3VyLXBhcnQgZm9ybToKKyMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCisjIEl0IGlzIHdyb25nIHRvIGVjaG8gYW55IG90aGVyIHR5cGUgb2Ygc3BlY2lmaWNhdGlvbi4KKworbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCisKK3VzYWdlPSJcCitVc2FnZTogJDAgW09QVElPTl0gQ1BVLU1GUi1PUFNZUworICAgICAgICQwIFtPUFRJT05dIEFMSUFTCisKK0Nhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gbmFtZS4KKworT3BlcmF0aW9uIG1vZGVzOgorICAtaCwgLS1oZWxwICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLXQsIC0tdGltZS1zdGFtcCAgIHByaW50IGRhdGUgb2YgbGFzdCBtb2RpZmljYXRpb24sIHRoZW4gZXhpdAorICAtdiwgLS12ZXJzaW9uICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorCitSZXBvcnQgYnVncyBhbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uIgorCit2ZXJzaW9uPSJcCitHTlUgY29uZmlnLnN1YiAoJHRpbWVzdGFtcCkKKworQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0CitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KK3dhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKKworaGVscD0iCitUcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisKKyMgUGFyc2UgY29tbWFuZCBsaW5lCit3aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCisgICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDAgOzsKKyAgICAtLXZlcnNpb24gfCAtdiApCisgICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCAwIDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDAgOzsKKyAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKKyAgICAgICBzaGlmdDsgYnJlYWsgOzsKKyAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCisgICAgICAgYnJlYWsgOzsKKyAgICAtKiApCisgICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIgorICAgICAgIGV4aXQgMSA7OworCisgICAgKmxvY2FsKikKKyAgICAgICAjIEZpcnN0IHBhc3MgdGhyb3VnaCBhbnkgbG9jYWwgbWFjaGluZSB0eXBlcy4KKyAgICAgICBlY2hvICQxCisgICAgICAgZXhpdCAwOzsKKworICAgICogKQorICAgICAgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworY2FzZSAkIyBpbgorIDApIGVjaG8gIiRtZTogbWlzc2luZyBhcmd1bWVudCRoZWxwIiA+JjIKKyAgICBleGl0IDE7OworIDEpIDs7CisgKikgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgICAgZXhpdCAxOzsKK2VzYWMKKworIyBTZXBhcmF0ZSB3aGF0IHRoZSB1c2VyIGdhdmUgaW50byBDUFUtQ09NUEFOWSBhbmQgT1Mgb3IgS0VSTkVMLU9TIChpZiBhbnkpLgorIyBIZXJlIHdlIG11c3QgcmVjb2duaXplIGFsbCB0aGUgdmFsaWQgS0VSTkVMLU9TIGNvbWJpbmF0aW9ucy4KK21heWJlX29zPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMi8nYAorY2FzZSAkbWF5YmVfb3MgaW4KKyAgbnRvLXFueCogfCBsaW51eC1nbnUqIHwgbGludXgtZGlldGxpYmMgfCBsaW51eC11Y2xpYmMqIHwgdWNsaW51eC11Y2xpYmMqIHwgdWNsaW51eC1nbnUqIHwgXAorICBrZnJlZWJzZCotZ251KiB8IGtuZXRic2QqLWdudSogfCBuZXRic2QqLWdudSogfCBzdG9ybS1jaGFvcyogfCBvczItZW14KiB8IHJ0bWstbm92YSopCisgICAgb3M9LSRtYXliZV9vcworICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wxLydgCisgICAgOzsKKyAgKikKKyAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzLy1bXi1dKiQvLydgCisgICAgaWYgWyAkYmFzaWNfbWFjaGluZSAhPSAkMSBdCisgICAgdGhlbiBvcz1gZWNobyAkMSB8IHNlZCAncy8uKi0vLS8nYAorICAgIGVsc2Ugb3M9OyBmaQorICAgIDs7Citlc2FjCisKKyMjIyBMZXQncyByZWNvZ25pemUgY29tbW9uIG1hY2hpbmVzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcyBzbworIyMjIHRoYXQgdGhpbmdzIGxpa2UgY29uZmlnLnN1YiBkZWNzdGF0aW9uLTMxMDAgd29yay4gIFdlIGFsc28KKyMjIyByZWNvZ25pemUgc29tZSBtYW51ZmFjdHVyZXJzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcywgc28gd2UKKyMjIyBjYW4gcHJvdmlkZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIGJlbG93LgorY2FzZSAkb3MgaW4KKwktc3VuKm9zKikKKwkJIyBQcmV2ZW50IGZvbGxvd2luZyBjbGF1c2UgZnJvbSBoYW5kbGluZyB0aGlzIGludmFsaWQgaW5wdXQuCisJCTs7CisJLWRlYyogfCAtbWlwcyogfCAtc2VxdWVudCogfCAtZW5jb3JlKiB8IC1wYzUzMiogfCAtc2dpKiB8IC1zb255KiB8IFwKKwktYXR0KiB8IC03MzAwKiB8IC0zMzAwKiB8IC1kZWx0YSogfCAtbW90b3JvbGEqIHwgLXN1blsyMzRdKiB8IFwKKwktdW5pY29tKiB8IC1pYm0qIHwgLW5leHQgfCAtaHAgfCAtaXNpKiB8IC1hcG9sbG8gfCAtYWx0b3MqIHwgXAorCS1jb252ZXJnZW50KiB8IC1uY3IqIHwgLW5ld3MgfCAtMzIqIHwgLTM2MDAqIHwgLTMxMDAqIHwgLWhpdGFjaGkqIHxcCisJLWNbMTIzXSogfCAtY29udmV4KiB8IC1zdW4gfCAtY3JkcyB8IC1vbXJvbiogfCAtZGcgfCAtdWx0cmEgfCAtdHRpKiB8IFwKKwktaGFycmlzIHwgLWRvbHBoaW4gfCAtaGlnaGxldmVsIHwgLWdvdWxkIHwgLWNibSB8IC1ucyB8IC1tYXNzY29tcCB8IFwKKwktYXBwbGUgfCAtYXhpcyB8IC1rbnV0aCB8IC1jcmF5KQorCQlvcz0KKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1zaW0gfCAtY2lzY28gfCAtb2tpIHwgLXdlYyB8IC13aW5ib25kKQorCQlvcz0KKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1zY291dCkKKwkJOzsKKwktd3JzKQorCQlvcz0tdnh3b3JrcworCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLWNob3J1c29zKikKKwkJb3M9LWNob3J1c29zCisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKyAJLWNob3J1c3JkYikKKyAJCW9zPS1jaG9ydXNyZGIKKwkJYmFzaWNfbWFjaGluZT0kMQorIAkJOzsKKwktaGl1eCopCisJCW9zPS1oaXV4d2UyCisJCTs7CisJLXNjbzUpCisJCW9zPS1zY28zLjJ2NQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzQpCisJCW9zPS1zY28zLjJ2NAorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzMuMi5bNC05XSopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy9zY28zLjIuL3NjbzMuMnYvJ2AKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28zLjJ2WzQtOV0qKQorCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbyopCisJCW9zPS1zY28zLjJ2MgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXVkayopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktaXNjKQorCQlvcz0taXNjMi4yCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktY2xpeCopCisJCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1pbnRlcmdyYXBoCisJCTs7CisJLWlzYyopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktbHlueCopCisJCW9zPS1seW54b3MKKwkJOzsKKwktcHR4KikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1zZXF1ZW50LydgCisJCTs7CisJLXdpbmRvd3NudCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy93aW5kb3dzbnQvd2lubnQvJ2AKKwkJOzsKKwktcHNvcyopCisJCW9zPS1wc29zCisJCTs7CisJLW1pbnQgfCAtbWludFswLTldKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCisJCW9zPS1taW50CisJCTs7Citlc2FjCisKKyMgRGVjb2RlIGFsaWFzZXMgZm9yIGNlcnRhaW4gQ1BVLUNPTVBBTlkgY29tYmluYXRpb25zLgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aG91dCBjb21wYW55IG5hbWUuCisJIyBTb21lIGFyZSBvbWl0dGVkIGhlcmUgYmVjYXVzZSB0aGV5IGhhdmUgc3BlY2lhbCBtZWFuaW5ncyBiZWxvdy4KKwkxNzUwYSB8IDU4MCBcCisJfCBhMjlrIFwKKwl8IGFscGhhIHwgYWxwaGFldls0LThdIHwgYWxwaGFldjU2IHwgYWxwaGFldjZbNzhdIHwgYWxwaGFwY2E1WzY3XSBcCisJfCBhbHBoYTY0IHwgYWxwaGE2NGV2WzQtOF0gfCBhbHBoYTY0ZXY1NiB8IGFscGhhNjRldjZbNzhdIHwgYWxwaGE2NHBjYTVbNjddIFwKKwl8IGFtMzNfMi4wIFwKKwl8IGFyYyB8IGFybSB8IGFybVtibF1lIHwgYXJtZVtsYl0gfCBhcm12WzIzNDVdIHwgYXJtdlszNDVdW2xiXSB8IGF2ciBcCisJfCBjNHggfCBjbGlwcGVyIFwKKwl8IGQxMHYgfCBkMzB2IHwgZGx4IHwgZHNwMTZ4eCBcCisJfCBmcjMwIHwgZnJ2IFwKKwl8IGg4MzAwIHwgaDg1MDAgfCBocHBhIHwgaHBwYTEuWzAxXSB8IGhwcGEyLjAgfCBocHBhMi4wW253XSB8IGhwcGE2NCBcCisJfCBpMzcwIHwgaTg2MCB8IGk5NjAgfCBpYTY0IFwKKwl8IGlwMmsgfCBpcTIwMDAgXAorCXwgbTMyciB8IG0zMnJsZSB8IG02ODAwMCB8IG02OGsgfCBtODhrIHwgbWF4cSB8IG1jb3JlIFwKKwl8IG1pcHMgfCBtaXBzYmUgfCBtaXBzZWIgfCBtaXBzZWwgfCBtaXBzbGUgXAorCXwgbWlwczE2IFwKKwl8IG1pcHM2NCB8IG1pcHM2NGVsIFwKKwl8IG1pcHM2NHZyIHwgbWlwczY0dnJlbCBcCisJfCBtaXBzNjRvcmlvbiB8IG1pcHM2NG9yaW9uZWwgXAorCXwgbWlwczY0dnI0MTAwIHwgbWlwczY0dnI0MTAwZWwgXAorCXwgbWlwczY0dnI0MzAwIHwgbWlwczY0dnI0MzAwZWwgXAorCXwgbWlwczY0dnI1MDAwIHwgbWlwczY0dnI1MDAwZWwgXAorCXwgbWlwc2lzYTMyIHwgbWlwc2lzYTMyZWwgXAorCXwgbWlwc2lzYTMycjIgfCBtaXBzaXNhMzJyMmVsIFwKKwl8IG1pcHNpc2E2NCB8IG1pcHNpc2E2NGVsIFwKKwl8IG1pcHNpc2E2NHIyIHwgbWlwc2lzYTY0cjJlbCBcCisJfCBtaXBzaXNhNjRzYjEgfCBtaXBzaXNhNjRzYjFlbCBcCisJfCBtaXBzaXNhNjRzcjcxayB8IG1pcHNpc2E2NHNyNzFrZWwgXAorCXwgbWlwc3R4MzkgfCBtaXBzdHgzOWVsIFwKKwl8IG1uMTAyMDAgfCBtbjEwMzAwIFwKKwl8IG1zcDQzMCBcCisJfCBuczE2ayB8IG5zMzJrIFwKKwl8IG9wZW5yaXNjIHwgb3IzMiBcCisJfCBwZHAxMCB8IHBkcDExIHwgcGogfCBwamwgXAorCXwgcG93ZXJwYyB8IHBvd2VycGM2NCB8IHBvd2VycGM2NGxlIHwgcG93ZXJwY2xlIHwgcHBjYmUgXAorCXwgcHlyYW1pZCBcCisJfCBzaCB8IHNoWzEyMzRdIHwgc2hbMjNdZSB8IHNoWzM0XWViIHwgc2hiZSB8IHNobGUgfCBzaFsxMjM0XWxlIHwgc2gzZWxlIFwKKwl8IHNoNjQgfCBzaDY0bGUgXAorCXwgc3BhcmMgfCBzcGFyYzY0IHwgc3BhcmM4NnggfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSB8IHNwYXJjdjggfCBzcGFyY3Y5IHwgc3BhcmN2OWIgXAorCXwgc3Ryb25nYXJtIFwKKwl8IHRhaG9lIHwgdGh1bWIgfCB0aWM0eCB8IHRpYzgwIHwgdHJvbiBcCisJfCB2ODUwIHwgdjg1MGUgXAorCXwgd2UzMmsgXAorCXwgeDg2IHwgeHNjYWxlIHwgeHNjYWxlZVtibF0gfCB4c3Rvcm15MTYgfCB4dGVuc2EgXAorCXwgejhrKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJOzsKKwltNjgxMSB8IG02OGhjMTEgfCBtNjgxMiB8IG02OGhjMTIpCisJCSMgTW90b3JvbGEgNjhIQzExLzEyLgorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJb3M9LW5vbmUKKwkJOzsKKwltODgxMTAgfCBtNjgwWzEyMzQ2XTAgfCBtNjgzPzIgfCBtNjgzNjAgfCBtNTIwMCB8IHY3MCB8IHc2NSB8IHo4aykKKwkJOzsKKworCSMgV2UgdXNlIGBwYycgcmF0aGVyIHRoYW4gYHVua25vd24nCisJIyBiZWNhdXNlICgxKSB0aGF0J3Mgd2hhdCB0aGV5IG5vcm1hbGx5IGFyZSwgYW5kCisJIyAoMikgdGhlIHdvcmQgInVua25vd24iIHRlbmRzIHRvIGNvbmZ1c2UgYmVnaW5uaW5nIHVzZXJzLgorCWkqODYgfCB4ODZfNjQpCisJICBiYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXBjCisJICA7OworCSMgT2JqZWN0IGlmIG1vcmUgdGhhbiBvbmUgY29tcGFueSBuYW1lIHdvcmQuCisJKi0qLSopCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGggY29tcGFueSBuYW1lLgorCTU4MC0qIFwKKwl8IGEyOWstKiBcCisJfCBhbHBoYS0qIHwgYWxwaGFldls0LThdLSogfCBhbHBoYWV2NTYtKiB8IGFscGhhZXY2Wzc4XS0qIFwKKwl8IGFscGhhNjQtKiB8IGFscGhhNjRldls0LThdLSogfCBhbHBoYTY0ZXY1Ni0qIHwgYWxwaGE2NGV2Nls3OF0tKiBcCisJfCBhbHBoYXBjYTVbNjddLSogfCBhbHBoYTY0cGNhNVs2N10tKiB8IGFyYy0qIFwKKwl8IGFybS0qICB8IGFybWJlLSogfCBhcm1sZS0qIHwgYXJtZWItKiB8IGFybXYqLSogXAorCXwgYXZyLSogXAorCXwgYnMyMDAwLSogXAorCXwgY1sxMjNdKiB8IGMzMC0qIHwgW2NqdF05MC0qIHwgYzR4LSogfCBjNTR4LSogfCBjNTV4LSogfCBjNngtKiBcCisJfCBjbGlwcGVyLSogfCBjcmF5bnYtKiB8IGN5ZHJhLSogXAorCXwgZDEwdi0qIHwgZDMwdi0qIHwgZGx4LSogXAorCXwgZWx4c2ktKiBcCisJfCBmMzBbMDFdLSogfCBmNzAwLSogfCBmcjMwLSogfCBmcnYtKiB8IGZ4ODAtKiBcCisJfCBoODMwMC0qIHwgaDg1MDAtKiBcCisJfCBocHBhLSogfCBocHBhMS5bMDFdLSogfCBocHBhMi4wLSogfCBocHBhMi4wW253XS0qIHwgaHBwYTY0LSogXAorCXwgaSo4Ni0qIHwgaTg2MC0qIHwgaTk2MC0qIHwgaWE2NC0qIFwKKwl8IGlwMmstKiB8IGlxMjAwMC0qIFwKKwl8IG0zMnItKiB8IG0zMnJsZS0qIFwKKwl8IG02ODAwMC0qIHwgbTY4MFswMTIzNDZdMC0qIHwgbTY4MzYwLSogfCBtNjgzPzItKiB8IG02OGstKiBcCisJfCBtODgxMTAtKiB8IG04OGstKiB8IG1heHEtKiB8IG1jb3JlLSogXAorCXwgbWlwcy0qIHwgbWlwc2JlLSogfCBtaXBzZWItKiB8IG1pcHNlbC0qIHwgbWlwc2xlLSogXAorCXwgbWlwczE2LSogXAorCXwgbWlwczY0LSogfCBtaXBzNjRlbC0qIFwKKwl8IG1pcHM2NHZyLSogfCBtaXBzNjR2cmVsLSogXAorCXwgbWlwczY0b3Jpb24tKiB8IG1pcHM2NG9yaW9uZWwtKiBcCisJfCBtaXBzNjR2cjQxMDAtKiB8IG1pcHM2NHZyNDEwMGVsLSogXAorCXwgbWlwczY0dnI0MzAwLSogfCBtaXBzNjR2cjQzMDBlbC0qIFwKKwl8IG1pcHM2NHZyNTAwMC0qIHwgbWlwczY0dnI1MDAwZWwtKiBcCisJfCBtaXBzaXNhMzItKiB8IG1pcHNpc2EzMmVsLSogXAorCXwgbWlwc2lzYTMycjItKiB8IG1pcHNpc2EzMnIyZWwtKiBcCisJfCBtaXBzaXNhNjQtKiB8IG1pcHNpc2E2NGVsLSogXAorCXwgbWlwc2lzYTY0cjItKiB8IG1pcHNpc2E2NHIyZWwtKiBcCisJfCBtaXBzaXNhNjRzYjEtKiB8IG1pcHNpc2E2NHNiMWVsLSogXAorCXwgbWlwc2lzYTY0c3I3MWstKiB8IG1pcHNpc2E2NHNyNzFrZWwtKiBcCisJfCBtaXBzdHgzOS0qIHwgbWlwc3R4MzllbC0qIFwKKwl8IG1taXgtKiBcCisJfCBtc3A0MzAtKiBcCisJfCBub25lLSogfCBucDEtKiB8IG5zMTZrLSogfCBuczMyay0qIFwKKwl8IG9yaW9uLSogXAorCXwgcGRwMTAtKiB8IHBkcDExLSogfCBwai0qIHwgcGpsLSogfCBwbi0qIHwgcG93ZXItKiBcCisJfCBwb3dlcnBjLSogfCBwb3dlcnBjNjQtKiB8IHBvd2VycGM2NGxlLSogfCBwb3dlcnBjbGUtKiB8IHBwY2JlLSogXAorCXwgcHlyYW1pZC0qIFwKKwl8IHJvbXAtKiB8IHJzNjAwMC0qIFwKKwl8IHNoLSogfCBzaFsxMjM0XS0qIHwgc2hbMjNdZS0qIHwgc2hbMzRdZWItKiB8IHNoYmUtKiBcCisJfCBzaGxlLSogfCBzaFsxMjM0XWxlLSogfCBzaDNlbGUtKiB8IHNoNjQtKiB8IHNoNjRsZS0qIFwKKwl8IHNwYXJjLSogfCBzcGFyYzY0LSogfCBzcGFyYzg2eC0qIHwgc3BhcmNsZXQtKiB8IHNwYXJjbGl0ZS0qIFwKKwl8IHNwYXJjdjgtKiB8IHNwYXJjdjktKiB8IHNwYXJjdjliLSogfCBzdHJvbmdhcm0tKiB8IHN2MS0qIHwgc3g/LSogXAorCXwgdGFob2UtKiB8IHRodW1iLSogXAorCXwgdGljMzAtKiB8IHRpYzR4LSogfCB0aWM1NHgtKiB8IHRpYzU1eC0qIHwgdGljNngtKiB8IHRpYzgwLSogXAorCXwgdHJvbi0qIFwKKwl8IHY4NTAtKiB8IHY4NTBlLSogfCB2YXgtKiBcCisJfCB3ZTMyay0qIFwKKwl8IHg4Ni0qIHwgeDg2XzY0LSogfCB4cHMxMDAtKiB8IHhzY2FsZS0qIHwgeHNjYWxlZVtibF0tKiBcCisJfCB4c3Rvcm15MTYtKiB8IHh0ZW5zYS0qIFwKKwl8IHltcC0qIFwKKwl8IHo4ay0qKQorCQk7OworCSMgUmVjb2duaXplIHRoZSB2YXJpb3VzIG1hY2hpbmUgbmFtZXMgYW5kIGFsaWFzZXMgd2hpY2ggc3RhbmQKKwkjIGZvciBhIENQVSB0eXBlIGFuZCBhIGNvbXBhbnkgYW5kIHNvbWV0aW1lcyBldmVuIGFuIE9TLgorCTM4NmJzZCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LWJzZAorCQk7OworCTNiMSB8IDczMDAgfCA3MzAwLWF0dCB8IGF0dC03MzAwIHwgcGM3MzAwIHwgc2FmYXJpIHwgdW5peHBjKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1hdHQKKwkJOzsKKwkzYiopCisJCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0CisJCTs7CisJYTI5a2hpZikKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tdWRpCisJCTs7CisgICAgCWFiYWN1cykKKwkJYmFzaWNfbWFjaGluZT1hYmFjdXMtdW5rbm93bgorCQk7OworCWFkb2JlNjhrKQorCQliYXNpY19tYWNoaW5lPW02ODAxMC1hZG9iZQorCQlvcz0tc2NvdXQKKwkJOzsKKwlhbGxpYW50IHwgZng4MCkKKwkJYmFzaWNfbWFjaGluZT1meDgwLWFsbGlhbnQKKwkJOzsKKwlhbHRvcyB8IGFsdG9zMzA2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFsdG9zCisJCTs7CisJYW0yOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ub25lCisJCW9zPS1ic2QKKwkJOzsKKwlhbWQ2NCkKKwkJYmFzaWNfbWFjaGluZT14ODZfNjQtcGMKKwkJOzsKKwlhbWQ2NC0qKQorCQliYXNpY19tYWNoaW5lPXg4Nl82NC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCWFtZGFobCkKKwkJYmFzaWNfbWFjaGluZT01ODAtYW1kYWhsCisJCW9zPS1zeXN2CisJCTs7CisJYW1pZ2EgfCBhbWlnYS0qKQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQk7OworCWFtaWdhb3MgfCBhbWlnYWRvcykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LWFtaWdhb3MKKwkJOzsKKwlhbWlnYXVuaXggfCBhbWl4KQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQlvcz0tc3lzdjQKKwkJOzsKKwlhcG9sbG82OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbworCQlvcz0tc3lzdgorCQk7OworCWFwb2xsbzY4YnNkKQorCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCisJCW9zPS1ic2QKKwkJOzsKKwlhdXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQorCQlvcz0tYXV4CisJCTs7CisJYmFsYW5jZSkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1zZXF1ZW50CisJCW9zPS1keW5peAorCQk7OworCWM5MCkKKwkJYmFzaWNfbWFjaGluZT1jOTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJY29udmV4LWMxKQorCQliYXNpY19tYWNoaW5lPWMxLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMyKQorCQliYXNpY19tYWNoaW5lPWMyLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzMikKKwkJYmFzaWNfbWFjaGluZT1jMzItY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzM0KQorCQliYXNpY19tYWNoaW5lPWMzNC1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzgpCisJCWJhc2ljX21hY2hpbmU9YzM4LWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY3JheSB8IGo5MCkKKwkJYmFzaWNfbWFjaGluZT1qOTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJY3JheW52KQorCQliYXNpY19tYWNoaW5lPWNyYXludi1jcmF5CisJCW9zPS11bmljb3NtcAorCQk7OworCWNyMTZjKQorCQliYXNpY19tYWNoaW5lPWNyMTZjLXVua25vd24KKwkJb3M9LWVsZgorCQk7OworCWNyZHMgfCB1bm9zKQorCQliYXNpY19tYWNoaW5lPW02OGstY3JkcworCQk7OworCWNyaXN2MzIgfCBjcmlzdjMyLSogfCBldHJheGZzKikKKwkJYmFzaWNfbWFjaGluZT1jcmlzdjMyLWF4aXMKKwkJOzsKKwljcmlzIHwgY3Jpcy0qIHwgZXRyYXgqKQorCQliYXNpY19tYWNoaW5lPWNyaXMtYXhpcworCQk7OworCWNyeCkKKwkJYmFzaWNfbWFjaGluZT1jcngtdW5rbm93bgorCQlvcz0tZWxmCisJCTs7CisJZGEzMCB8IGRhMzAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWRhMzAKKwkJOzsKKwlkZWNzdGF0aW9uIHwgZGVjc3RhdGlvbi0zMTAwIHwgcG1heCB8IHBtYXgtKiB8IHBtaW4gfCBkZWMzMTAwIHwgZGVjc3RhdG4pCisJCWJhc2ljX21hY2hpbmU9bWlwcy1kZWMKKwkJOzsKKwlkZWNzeXN0ZW0xMCogfCBkZWMxMCopCisJCWJhc2ljX21hY2hpbmU9cGRwMTAtZGVjCisJCW9zPS10b3BzMTAKKwkJOzsKKwlkZWNzeXN0ZW0yMCogfCBkZWMyMCopCisJCWJhc2ljX21hY2hpbmU9cGRwMTAtZGVjCisJCW9zPS10b3BzMjAKKwkJOzsKKwlkZWx0YSB8IDMzMDAgfCBtb3Rvcm9sYS0zMzAwIHwgbW90b3JvbGEtZGVsdGEgXAorCSAgICAgIHwgMzMwMC1tb3Rvcm9sYSB8IGRlbHRhLW1vdG9yb2xhKQorCQliYXNpY19tYWNoaW5lPW02OGstbW90b3JvbGEKKwkJOzsKKwlkZWx0YTg4KQorCQliYXNpY19tYWNoaW5lPW04OGstbW90b3JvbGEKKwkJb3M9LXN5c3YzCisJCTs7CisJZGpncHApCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1wYworCQlvcz0tbXNkb3NkamdwcAorCQk7OworCWRweDIwIHwgZHB4MjAtKikKKwkJYmFzaWNfbWFjaGluZT1yczYwMDAtYnVsbAorCQlvcz0tYm9zeAorCQk7OworCWRweDIqIHwgZHB4MiotYnVsbCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKKwkJb3M9LXN5c3YzCisJCTs7CisJZWJtb24yOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LWVibW9uCisJCTs7CisJZWx4c2kpCisJCWJhc2ljX21hY2hpbmU9ZWx4c2ktZWx4c2kKKwkJb3M9LWJzZAorCQk7OworCWVuY29yZSB8IHVtYXggfCBtbWF4KQorCQliYXNpY19tYWNoaW5lPW5zMzJrLWVuY29yZQorCQk7OworCWVzMTgwMCB8IE9TRTY4ayB8IG9zZTY4ayB8IG9zZSB8IE9TRSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWVyaWNzc29uCisJCW9zPS1vc2UKKwkJOzsKKwlmeDI4MDApCisJCWJhc2ljX21hY2hpbmU9aTg2MC1hbGxpYW50CisJCTs7CisJZ2VuaXgpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstbnMKKwkJOzsKKwlnbWljcm8pCisJCWJhc2ljX21hY2hpbmU9dHJvbi1nbWljcm8KKwkJb3M9LXN5c3YKKwkJOzsKKwlnbzMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LWdvMzIKKwkJOzsKKwloMzA1MHIqIHwgaGl1eCopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCisJCW9zPS1oaXV4d2UyCisJCTs7CisJaDgzMDBobXMpCisJCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJaDgzMDB4cmF5KQorCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKKwkJb3M9LXhyYXkKKwkJOzsKKwloODUwMGhtcykKKwkJYmFzaWNfbWFjaGluZT1oODUwMC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwloYXJyaXMpCisJCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKKwkJb3M9LXN5c3YzCisJCTs7CisJaHAzMDAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCTs7CisJaHAzMDBic2QpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQlvcz0tYnNkCisJCTs7CisJaHAzMDBocHV4KQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJb3M9LWhwdXgKKwkJOzsKKwlocDNrOVswLTldWzAtOV0gfCBocDlbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocDlrMlswLTldWzAtOV0gfCBocDlrMzFbMC05XSkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtaHAKKwkJOzsKKwlocDlrM1syLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQk7OworCWhwOWs2WzAtOV1bMC05XSB8IGhwNlswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwOWs3WzAtNzldWzAtOV0gfCBocDdbMC03OV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azc4WzAtOV0gfCBocDc4WzAtOV0pCisJCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzY3XTEgfCBocDhbNjddMSB8IGhwOWs4MFsyNF0gfCBocDgwWzI0XSB8IGhwOWs4Wzc4XTkgfCBocDhbNzhdOSB8IGhwOWs4OTMgfCBocDg5MykKKwkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbMC05XVsxMzY3OV0gfCBocDhbMC05XVsxMzY3OV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzAtOV1bMC05XSB8IGhwOFswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwcGEtbmV4dCkKKwkJb3M9LW5leHRzdGVwMworCQk7OworCWhwcGFvc2YpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQlvcz0tb3NmCisJCTs7CisJaHBwcm8pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQlvcz0tcHJvZWxmCisJCTs7CisJaTM3MC1pYm0qIHwgaWJtKikKKwkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQorCQk7OworIyBJJ20gbm90IHN1cmUgd2hhdCAiU3lzdjMyIiBtZWFucy4gIFNob3VsZCB0aGlzIGJlIHN5c3YzLjI/CisJaSo4NnYzMikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2MzIKKwkJOzsKKwlpKjg2djQqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3Y0CisJCTs7CisJaSo4NnYpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdgorCQk7OworCWkqODZzb2wyKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJaTM4Nm1hY2gpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1tYWNoCisJCW9zPS1tYWNoCisJCTs7CisJaTM4Ni12c3RhIHwgdnN0YSkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LXZzdGEKKwkJOzsKKwlpcmlzIHwgaXJpczRkKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2dpCisJCWNhc2UgJG9zIGluCisJCSAgICAtaXJpeCopCisJCQk7OworCQkgICAgKikKKwkJCW9zPS1pcml4NAorCQkJOzsKKwkJZXNhYworCQk7OworCWlzaTY4IHwgaXNpKQorCQliYXNpY19tYWNoaW5lPW02OGstaXNpCisJCW9zPS1zeXN2CisJCTs7CisJbTg4ay1vbXJvbiopCisJCWJhc2ljX21hY2hpbmU9bTg4ay1vbXJvbgorCQk7OworCW1hZ251bSB8IG0zMjMwKQorCQliYXNpY19tYWNoaW5lPW1pcHMtbWlwcworCQlvcz0tc3lzdgorCQk7OworCW1lcmxpbikKKwkJYmFzaWNfbWFjaGluZT1uczMyay11dGVrCisJCW9zPS1zeXN2CisJCTs7CisJbWluZ3czMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1taW5ndzMyCisJCTs7CisJbWluaWZyYW1lKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1jb252ZXJnZW50CisJCTs7CisJKm1pbnQgfCAtbWludFswLTldKiB8ICpNaU5UIHwgKk1pTlRbMC05XSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQorCQlvcz0tbWludAorCQk7OworCW1pcHMzKi0qKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYAorCQk7OworCW1pcHMzKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AtdW5rbm93bgorCQk7OworCW1vbml0b3IpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKKwkJb3M9LWNvZmYKKwkJOzsKKwltb3JwaG9zKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgorCQlvcz0tbW9ycGhvcworCQk7OworCW1zZG9zKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LW1zZG9zCisJCTs7CisJbXZzKQorCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCisJCW9zPS1tdnMKKwkJOzsKKwluY3IzMDAwKQorCQliYXNpY19tYWNoaW5lPWk0ODYtbmNyCisJCW9zPS1zeXN2NAorCQk7OworCW5ldGJzZDM4NikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LW5ldGJzZAorCQk7OworCW5ldHdpbmRlcikKKwkJYmFzaWNfbWFjaGluZT1hcm12NGwtcmViZWwKKwkJb3M9LWxpbnV4CisJCTs7CisJbmV3cyB8IG5ld3M3MDAgfCBuZXdzODAwIHwgbmV3czkwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5ld3MxMDAwKQorCQliYXNpY19tYWNoaW5lPW02ODAzMC1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZXdzLTM2MDAgfCByaXNjLW5ld3MpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZWN2NzApCisJCWJhc2ljX21hY2hpbmU9djcwLW5lYworCQlvcz0tc3lzdgorCQk7OworCW5leHQgfCBtKi1uZXh0ICkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5leHQKKwkJY2FzZSAkb3MgaW4KKwkJICAgIC1uZXh0c3RlcCogKQorCQkJOzsKKwkJICAgIC1uczIqKQorCQkgICAgICBvcz0tbmV4dHN0ZXAyCisJCQk7OworCQkgICAgKikKKwkJICAgICAgb3M9LW5leHRzdGVwMworCQkJOzsKKwkJZXNhYworCQk7OworCW5oMzAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhhcnJpcworCQlvcz0tY3h1eAorCQk7OworCW5oWzQ1XTAwMCkKKwkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcworCQlvcz0tY3h1eAorCQk7OworCW5pbmR5OTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKKwkJb3M9LW5pbmR5CisJCTs7CisJbW9uOTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKKwkJb3M9LW1vbjk2MAorCQk7OworCW5vbnN0b3B1eCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLWNvbXBhcQorCQlvcz0tbm9uc3RvcHV4CisJCTs7CisJbnAxKQorCQliYXNpY19tYWNoaW5lPW5wMS1nb3VsZAorCQk7OworCW5zci10YW5kZW0pCisJCWJhc2ljX21hY2hpbmU9bnNyLXRhbmRlbQorCQk7OworCW9wNTBuLSogfCBvcDYwYy0qKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwlvcjMyIHwgb3IzMi0qKQorCQliYXNpY19tYWNoaW5lPW9yMzItdW5rbm93bgorCQlvcz0tY29mZgorCQk7OworCW9zNDAwKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtaWJtCisJCW9zPS1vczQwMAorCQk7OworCU9TRTY4MDAwIHwgb3NlNjgwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWVyaWNzc29uCisJCW9zPS1vc2UKKwkJOzsKKwlvczY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5vbmUKKwkJb3M9LW9zNjhrCisJCTs7CisJcGEtaGl0YWNoaSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwlwYXJhZ29uKQorCQliYXNpY19tYWNoaW5lPWk4NjAtaW50ZWwKKwkJb3M9LW9zZgorCQk7OworCXBiZCkKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy10dGkKKwkJOzsKKwlwYmIpCisJCWJhc2ljX21hY2hpbmU9bTY4ay10dGkKKwkJOzsKKwlwYzUzMiB8IHBjNTMyLSopCisJCWJhc2ljX21hY2hpbmU9bnMzMmstcGM1MzIKKwkJOzsKKwlwZW50aXVtIHwgcDUgfCBrNSB8IGs2IHwgbmV4Z2VuIHwgdmlhYzMpCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1wYworCQk7OworCXBlbnRpdW1wcm8gfCBwNiB8IDZ4ODYgfCBhdGhsb24gfCBhdGhsb25fKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCTs7CisJcGVudGl1bWlpIHwgcGVudGl1bTIgfCBwZW50aXVtaWlpIHwgcGVudGl1bTMpCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQk7OworCXBlbnRpdW00KQorCQliYXNpY19tYWNoaW5lPWk3ODYtcGMKKwkJOzsKKwlwZW50aXVtLSogfCBwNS0qIHwgazUtKiB8IGs2LSogfCBuZXhnZW4tKiB8IHZpYWMzLSopCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW1wcm8tKiB8IHA2LSogfCA2eDg2LSogfCBhdGhsb24tKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bWlpLSogfCBwZW50aXVtMi0qIHwgcGVudGl1bWlpaS0qIHwgcGVudGl1bTMtKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bTQtKikKKwkJYmFzaWNfbWFjaGluZT1pNzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcG4pCisJCWJhc2ljX21hY2hpbmU9cG4tZ291bGQKKwkJOzsKKwlwb3dlcikJYmFzaWNfbWFjaGluZT1wb3dlci1pYm0KKwkJOzsKKwlwcGMpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCisJCTs7CisJcHBjLSopCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwY2xlIHwgcG93ZXJwY2xpdHRsZSB8IHBwYy1sZSB8IHBvd2VycGMtbGl0dGxlKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS11bmtub3duCisJCTs7CisJcHBjbGUtKiB8IHBvd2VycGNsaXR0bGUtKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGM2NCkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjQtdW5rbm93bgorCQk7OworCXBwYzY0LSopIGJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjNjRsZSB8IHBvd2VycGM2NGxpdHRsZSB8IHBwYzY0LWxlIHwgcG93ZXJwYzY0LWxpdHRsZSkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS11bmtub3duCisJCTs7CisJcHBjNjRsZS0qIHwgcG93ZXJwYzY0bGl0dGxlLSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwczIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1pYm0KKwkJOzsKKwlwdzMyKQorCQliYXNpY19tYWNoaW5lPWk1ODYtdW5rbm93bgorCQlvcz0tcHczMgorCQk7OworCXJvbTY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4aworCQlvcz0tY29mZgorCQk7OworCXJtWzQ2XTAwKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2llbWVucworCQk7OworCXJ0cGMgfCBydHBjLSopCisJCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KKwkJOzsKKwlzMzkwIHwgczM5MC0qKQorCQliYXNpY19tYWNoaW5lPXMzOTAtaWJtCisJCTs7CisJczM5MHggfCBzMzkweC0qKQorCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQorCQk7OworCXNhMjkyMDApCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCXNiMSkKKwkJYmFzaWNfbWFjaGluZT1taXBzaXNhNjRzYjEtdW5rbm93bgorCQk7OworCXNiMWVsKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2E2NHNiMWVsLXVua25vd24KKwkJOzsKKwlzZWkpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zZWkKKwkJb3M9LXNlaXV4CisJCTs7CisJc2VxdWVudCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKKwkJOzsKKwlzaCkKKwkJYmFzaWNfbWFjaGluZT1zaC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwlzaDY0KQorCQliYXNpY19tYWNoaW5lPXNoNjQtdW5rbm93bgorCQk7OworCXNwYXJjbGl0ZS13cnMgfCBzaW1zby13cnMpCisJCWJhc2ljX21hY2hpbmU9c3BhcmNsaXRlLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXNwczcpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCisJCW9zPS1zeXN2MgorCQk7OworCXNwdXIpCisJCWJhc2ljX21hY2hpbmU9c3B1ci11bmtub3duCisJCTs7CisJc3QyMDAwKQorCQliYXNpY19tYWNoaW5lPW02OGstdGFuZGVtCisJCTs7CisJc3RyYXR1cykKKwkJYmFzaWNfbWFjaGluZT1pODYwLXN0cmF0dXMKKwkJb3M9LXN5c3Y0CisJCTs7CisJc3VuMikKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCTs7CisJc3VuMm9zMykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW4yb3M0KQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjNvczMpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjNvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjRvczMpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW40b3M0KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNHNvbDIpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zb2xhcmlzMgorCQk7OworCXN1bjMgfCBzdW4zLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJOzsKKwlzdW40KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQk7OworCXN1bjM4NiB8IHN1bjM4NmkgfCByb2FkcnVubmVyKQorCQliYXNpY19tYWNoaW5lPWkzODYtc3VuCisJCTs7CisJc3YxKQorCQliYXNpY19tYWNoaW5lPXN2MS1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwlzeW1tZXRyeSkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKKwkJb3M9LWR5bml4CisJCTs7CisJdDNlKQorCQliYXNpY19tYWNoaW5lPWFscGhhZXY1LWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXQ5MCkKKwkJYmFzaWNfbWFjaGluZT10OTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJdGljNTR4IHwgYzU0eCopCisJCWJhc2ljX21hY2hpbmU9dGljNTR4LXVua25vd24KKwkJb3M9LWNvZmYKKwkJOzsKKwl0aWM1NXggfCBjNTV4KikKKwkJYmFzaWNfbWFjaGluZT10aWM1NXgtdW5rbm93bgorCQlvcz0tY29mZgorCQk7OworCXRpYzZ4IHwgYzZ4KikKKwkJYmFzaWNfbWFjaGluZT10aWM2eC11bmtub3duCisJCW9zPS1jb2ZmCisJCTs7CisJdHgzOSkKKwkJYmFzaWNfbWFjaGluZT1taXBzdHgzOS11bmtub3duCisJCTs7CisJdHgzOWVsKQorCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5ZWwtdW5rbm93bgorCQk7OworCXRvYWQxKQorCQliYXNpY19tYWNoaW5lPXBkcDEwLXhrbAorCQlvcz0tdG9wczIwCisJCTs7CisJdG93ZXIgfCB0b3dlci0zMikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5jcgorCQk7OworCXRwZikKKwkJYmFzaWNfbWFjaGluZT1zMzkweC1pYm0KKwkJb3M9LXRwZgorCQk7OworCXVkaTI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tdWRpCisJCTs7CisJdWx0cmEzKQorCQliYXNpY19tYWNoaW5lPWEyOWstbnl1CisJCW9zPS1zeW0xCisJCTs7CisJdjgxMCB8IG5lY3Y4MTApCisJCWJhc2ljX21hY2hpbmU9djgxMC1uZWMKKwkJb3M9LW5vbmUKKwkJOzsKKwl2YXh2KQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJb3M9LXN5c3YKKwkJOzsKKwl2bXMpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQlvcz0tdm1zCisJCTs7CisJdnBwKnx2eHx2eC0qKQorCQliYXNpY19tYWNoaW5lPWYzMDEtZnVqaXRzdQorCQk7OworCXZ4d29ya3M5NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl2eHdvcmtzNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl2eHdvcmtzMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJdzY1KikKKwkJYmFzaWNfbWFjaGluZT13NjUtd2RjCisJCW9zPS1ub25lCisJCTs7CisJdzg5ay0qKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAorCQlvcz0tcHJvZWxmCisJCTs7CisJeGJveCkKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCW9zPS1taW5ndzMyCisJCTs7CisJeHBzIHwgeHBzMTAwKQorCQliYXNpY19tYWNoaW5lPXhwczEwMC1ob25leXdlbGwKKwkJOzsKKwl5bXApCisJCWJhc2ljX21hY2hpbmU9eW1wLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXo4ay0qLWNvZmYpCisJCWJhc2ljX21hY2hpbmU9ejhrLXVua25vd24KKwkJb3M9LXNpbQorCQk7OworCW5vbmUpCisJCWJhc2ljX21hY2hpbmU9bm9uZS1ub25lCisJCW9zPS1ub25lCisJCTs7CisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgbWFudWZhY3R1cmVyIG9mIGNlcnRhaW4gQ1BVIHR5cGVzLiAgSXQgaXMgaW4KKyMgc29tZSBjYXNlcyB0aGUgb25seSBtYW51ZmFjdHVyZXIsIGluIG90aGVycywgaXQgaXMgdGhlIG1vc3QgcG9wdWxhci4KKwl3ODlrKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAorCQk7OworCW9wNTBuKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCisJCTs7CisJb3A2MGMpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJOzsKKwlyb21wKQorCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCisJCTs7CisJbW1peCkKKwkJYmFzaWNfbWFjaGluZT1tbWl4LWtudXRoCisJCTs7CisJcnM2MDAwKQorCQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KKwkJOzsKKwl2YXgpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQk7OworCXBkcDEwKQorCQkjIHRoZXJlIGFyZSBtYW55IGNsb25lcywgc28gREVDIGlzIG5vdCBhIHNhZmUgYmV0CisJCWJhc2ljX21hY2hpbmU9cGRwMTAtdW5rbm93bgorCQk7OworCXBkcDExKQorCQliYXNpY19tYWNoaW5lPXBkcDExLWRlYworCQk7OworCXdlMzJrKQorCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAorCQk7OworCXNoMyB8IHNoNCB8IHNoWzM0XWViIHwgc2hbMTIzNF1sZSB8IHNoWzIzXWVsZSkKKwkJYmFzaWNfbWFjaGluZT1zaC11bmtub3duCisJCTs7CisJc2g2NCkKKwkJYmFzaWNfbWFjaGluZT1zaDY0LXVua25vd24KKwkJOzsKKwlzcGFyYyB8IHNwYXJjdjggfCBzcGFyY3Y5IHwgc3BhcmN2OWIpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCTs7CisJY3lkcmEpCisJCWJhc2ljX21hY2hpbmU9Y3lkcmEtY3lkcm9tZQorCQk7OworCW9yaW9uKQorCQliYXNpY19tYWNoaW5lPW9yaW9uLWhpZ2hsZXZlbAorCQk7OworCW9yaW9uMTA1KQorCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaGlnaGxldmVsCisJCTs7CisJbWFjIHwgbXB3IHwgbWFjLW1wdykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCisJCTs7CisJcG1hYyB8IHBtYWMtbXB3KQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtYXBwbGUKKwkJOzsKKwkqLXVua25vd24pCisJCSMgTWFrZSBzdXJlIHRvIG1hdGNoIGFuIGFscmVhZHktY2Fub25pY2FsaXplZCBtYWNoaW5lIG5hbWUuCisJCTs7CisJKikKKwkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCisJCWV4aXQgMQorCQk7OworZXNhYworCisjIEhlcmUgd2UgY2Fub25pY2FsaXplIGNlcnRhaW4gYWxpYXNlcyBmb3IgbWFudWZhY3R1cmVycy4KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkqLWRpZ2l0YWwqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2RpZ2l0YWwuKi9kZWMvJ2AKKwkJOzsKKwkqLWNvbW1vZG9yZSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvY29tbW9kb3JlLiovY2JtLydgCisJCTs7CisJKikKKwkJOzsKK2VzYWMKKworIyBEZWNvZGUgbWFudWZhY3R1cmVyLXNwZWNpZmljIGFsaWFzZXMgZm9yIGNlcnRhaW4gb3BlcmF0aW5nIHN5c3RlbXMuCisKK2lmIFsgeCIkb3MiICE9IHgiIiBdCit0aGVuCitjYXNlICRvcyBpbgorICAgICAgICAjIEZpcnN0IG1hdGNoIHNvbWUgc3lzdGVtIHR5cGUgYWxpYXNlcworICAgICAgICAjIHRoYXQgbWlnaHQgZ2V0IGNvbmZ1c2VkIHdpdGggdmFsaWQgc3lzdGVtIHR5cGVzLgorCSMgLXNvbGFyaXMqIGlzIGEgYmFzaWMgc3lzdGVtIHR5cGUsIHdpdGggdGhpcyBvbmUgZXhjZXB0aW9uLgorCS1zb2xhcmlzMSB8IC1zb2xhcmlzMS4qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c29sYXJpczF8c3Vub3M0fCdgCisJCTs7CisJLXNvbGFyaXMpCisJCW9zPS1zb2xhcmlzMgorCQk7OworCS1zdnI0KikKKwkJb3M9LXN5c3Y0CisJCTs7CisJLXVuaXh3YXJlKikKKwkJb3M9LXN5c3Y0LjJ1dworCQk7OworCS1nbnUvbGludXgqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8Z251L2xpbnV4fGxpbnV4LWdudXwnYAorCQk7OworCSMgRmlyc3QgYWNjZXB0IHRoZSBiYXNpYyBzeXN0ZW0gdHlwZXMuCisJIyBUaGUgcG9ydGFibGUgc3lzdGVtcyBjb21lcyBmaXJzdC4KKwkjIEVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gQSAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgorCSMgLXN5c3YqIGlzIG5vdCBoZXJlIGJlY2F1c2UgaXQgY29tZXMgbGF0ZXIsIGFmdGVyIHN5c3ZyNC4KKwktZ251KiB8IC1ic2QqIHwgLW1hY2gqIHwgLW1pbml4KiB8IC1nZW5peCogfCAtdWx0cml4KiB8IC1pcml4KiBcCisJICAgICAgfCAtKnZtcyogfCAtc2NvKiB8IC1lc2l4KiB8IC1pc2MqIHwgLWFpeCogfCAtc3Vub3MgfCAtc3Vub3NbMzRdKlwKKwkgICAgICB8IC1ocHV4KiB8IC11bm9zKiB8IC1vc2YqIHwgLWx1bmEqIHwgLWRndXgqIHwgLXNvbGFyaXMqIHwgLXN5bSogXAorCSAgICAgIHwgLWFtaWdhb3MqIHwgLWFtaWdhZG9zKiB8IC1tc2RvcyogfCAtbmV3c29zKiB8IC11bmljb3MqIHwgLWFvZiogXAorCSAgICAgIHwgLWFvcyogXAorCSAgICAgIHwgLW5pbmR5KiB8IC12eHNpbSogfCAtdnh3b3JrcyogfCAtZWJtb24qIHwgLWhtcyogfCAtbXZzKiBcCisJICAgICAgfCAtY2xpeCogfCAtcmlzY29zKiB8IC11bmlwbHVzKiB8IC1pcmlzKiB8IC1ydHUqIHwgLXhlbml4KiBcCisJICAgICAgfCAtaGl1eCogfCAtMzg2YnNkKiB8IC1rbmV0YnNkKiB8IC1taXJic2QqIHwgLW5ldGJzZCogfCAtb3BlbmJzZCogXAorCSAgICAgIHwgLWVra29ic2QqIHwgLWtmcmVlYnNkKiB8IC1mcmVlYnNkKiB8IC1yaXNjaXgqIHwgLWx5bnhvcyogXAorCSAgICAgIHwgLWJvc3gqIHwgLW5leHRzdGVwKiB8IC1jeHV4KiB8IC1hb3V0KiB8IC1lbGYqIHwgLW9hYmkqIFwKKwkgICAgICB8IC1wdHgqIHwgLWNvZmYqIHwgLWVjb2ZmKiB8IC13aW5udCogfCAtZG9tYWluKiB8IC12c3RhKiBcCisJICAgICAgfCAtdWRpKiB8IC1lYWJpKiB8IC1saXRlcyogfCAtaWVlZSogfCAtZ28zMiogfCAtYXV4KiBcCisJICAgICAgfCAtY2hvcnVzb3MqIHwgLWNob3J1c3JkYiogXAorCSAgICAgIHwgLWN5Z3dpbiogfCAtcGUqIHwgLXBzb3MqIHwgLW1vc3MqIHwgLXByb2VsZiogfCAtcnRlbXMqIFwKKwkgICAgICB8IC1taW5ndzMyKiB8IC1saW51eC1nbnUqIHwgLWxpbnV4LXVjbGliYyogfCAtdXhwdiogfCAtYmVvcyogfCAtbXBlaXgqIHwgLXVkayogXAorCSAgICAgIHwgLWludGVyaXgqIHwgLXV3aW4qIHwgLW1rcyogfCAtcmhhcHNvZHkqIHwgLWRhcndpbiogfCAtb3BlbmVkKiBcCisJICAgICAgfCAtb3BlbnN0ZXAqIHwgLW9za2l0KiB8IC1jb25peCogfCAtcHczMiogfCAtbm9uc3RvcHV4KiBcCisJICAgICAgfCAtc3Rvcm0tY2hhb3MqIHwgLXRvcHMxMCogfCAtdGVuZXgqIHwgLXRvcHMyMCogfCAtaXRzKiBcCisJICAgICAgfCAtb3MyKiB8IC12b3MqIHwgLXBhbG1vcyogfCAtdWNsaW51eCogfCAtbnVjbGV1cyogXAorCSAgICAgIHwgLW1vcnBob3MqIHwgLXN1cGVydXgqIHwgLXJ0bWsqIHwgLXJ0bWstbm92YSogfCAtd2luZGlzcyogXAorCSAgICAgIHwgLXBvd2VybWF4KiB8IC1kbml4KiB8IC1ueDYgfCAtbng3IHwgLXNlaSogfCAtZHJhZ29uZmx5KikKKwkjIFJlbWVtYmVyLCBlYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCisJCTs7CisJLXFueCopCisJCWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkJICAgIHg4Ni0qIHwgaSo4Ni0qKQorCQkJOzsKKwkJICAgICopCisJCQlvcz0tbnRvJG9zCisJCQk7OworCQllc2FjCisJCTs7CisJLW50by1xbngqKQorCQk7OworCS1udG8qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bnRvfG50by1xbnh8J2AKKwkJOzsKKwktc2ltIHwgLWVzMTgwMCogfCAtaG1zKiB8IC14cmF5IHwgLW9zNjhrKiB8IC1ub25lKiB8IC12ODhyKiBcCisJICAgICAgfCAtd2luZG93cyogfCAtb3N4IHwgLWFidWcgfCAtbmV0d2FyZSogfCAtb3M5KiB8IC1iZW9zKiBcCisJICAgICAgfCAtbWFjb3MqIHwgLW1wdyogfCAtbWFnaWMqIHwgLW1taXh3YXJlKiB8IC1tb245NjAqIHwgLWxuZXdzKikKKwkJOzsKKwktbWFjKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG1hY3xtYWNvc3wnYAorCQk7OworCS1saW51eC1kaWV0bGliYykKKwkJb3M9LWxpbnV4LWRpZXRsaWJjCisJCTs7CisJLWxpbnV4KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGxpbnV4fGxpbnV4LWdudXwnYAorCQk7OworCS1zdW5vczUqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M1fHNvbGFyaXMyfCdgCisJCTs7CisJLXN1bm9zNiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczZ8c29sYXJpczN8J2AKKwkJOzsKKwktb3BlbmVkKikKKwkJb3M9LW9wZW5lZGl0aW9uCisJCTs7CisgICAgICAgIC1vczQwMCopCisJCW9zPS1vczQwMAorCQk7OworCS13aW5jZSopCisJCW9zPS13aW5jZQorCQk7OworCS1vc2Zyb3NlKikKKwkJb3M9LW9zZnJvc2UKKwkJOzsKKwktb3NmKikKKwkJb3M9LW9zZgorCQk7OworCS11dGVrKikKKwkJb3M9LWJzZAorCQk7OworCS1keW5peCopCisJCW9zPS1ic2QKKwkJOzsKKwktYWNpcyopCisJCW9zPS1hb3MKKwkJOzsKKwktYXRoZW9zKikKKwkJb3M9LWF0aGVvcworCQk7OworCS1zeWxsYWJsZSopCisJCW9zPS1zeWxsYWJsZQorCQk7OworCS0zODZic2QpCisJCW9zPS1ic2QKKwkJOzsKKwktY3RpeCogfCAtdXRzKikKKwkJb3M9LXN5c3YKKwkJOzsKKwktbm92YSopCisJCW9zPS1ydG1rLW5vdmEKKwkJOzsKKwktbnMyICkKKwkJb3M9LW5leHRzdGVwMgorCQk7OworCS1uc2sqKQorCQlvcz0tbnNrCisJCTs7CisJIyBQcmVzZXJ2ZSB0aGUgdmVyc2lvbiBudW1iZXIgb2Ygc2luaXg1LgorCS1zaW5peDUuKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNpbml4fHN5c3Z8J2AKKwkJOzsKKwktc2luaXgqKQorCQlvcz0tc3lzdjQKKwkJOzsKKyAgICAgICAgLXRwZiopCisJCW9zPS10cGYKKwkJOzsKKwktdHJpdG9uKikKKwkJb3M9LXN5c3YzCisJCTs7CisJLW9zcyopCisJCW9zPS1zeXN2MworCQk7OworCS1zdnI0KQorCQlvcz0tc3lzdjQKKwkJOzsKKwktc3ZyMykKKwkJb3M9LXN5c3YzCisJCTs7CisJLXN5c3ZyNCkKKwkJb3M9LXN5c3Y0CisJCTs7CisJIyBUaGlzIG11c3QgY29tZSBhZnRlciAtc3lzdnI0LgorCS1zeXN2KikKKwkJOzsKKwktb3NlKikKKwkJb3M9LW9zZQorCQk7OworCS1lczE4MDAqKQorCQlvcz0tb3NlCisJCTs7CisJLXhlbml4KQorCQlvcz0teGVuaXgKKwkJOzsKKwktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQorCQlvcz0tbWludAorCQk7OworCS1hcm9zKikKKwkJb3M9LWFyb3MKKwkJOzsKKwkta2FvcyopCisJCW9zPS1rYW9zCisJCTs7CisJLXp2bW9lKQorCQlvcz0tenZtb2UKKwkJOzsKKwktbm9uZSkKKwkJOzsKKwkqKQorCQkjIEdldCByaWQgb2YgdGhlIGAtJyBhdCB0aGUgYmVnaW5uaW5nIG9mICRvcy4KKwkJb3M9YGVjaG8gJG9zIHwgc2VkICdzL1teLV0qLS8vJ2AKKwkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBzeXN0ZW0gXGAkb3NcJyBub3QgcmVjb2duaXplZCAxPiYyCisJCWV4aXQgMQorCQk7OworZXNhYworZWxzZQorCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgY29tZSB3aXRoIHZhcmlvdXMgbWFjaGluZXMuCisjIFRoZSB2YWx1ZSBzaG91bGQgYmUgd2hhdCB0aGUgdmVuZG9yIGN1cnJlbnRseSBzaGlwcyBvdXQgdGhlIGRvb3Igd2l0aCB0aGVpcgorIyBtYWNoaW5lIG9yIHB1dCBhbm90aGVyIHdheSwgdGhlIG1vc3QgcG9wdWxhciBvcyBwcm92aWRlZCB3aXRoIHRoZSBtYWNoaW5lLgorCisjIE5vdGUgdGhhdCBpZiB5b3UncmUgZ29pbmcgdG8gdHJ5IHRvIG1hdGNoICItTUFOVUZBQ1RVUkVSIiBoZXJlIChzYXksCisjICItc3VuIiksIHRoZW4geW91IGhhdmUgdG8gdGVsbCB0aGUgY2FzZSBzdGF0ZW1lbnQgdXAgdG93YXJkcyB0aGUgdG9wCisjIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZyBzeXN0ZW0uICBPdGhlcndpc2UsIGNvZGUgYWJvdmUKKyMgd2lsbCBzaWduYWwgYW4gZXJyb3Igc2F5aW5nIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZworIyBzeXN0ZW0sIGFuZCB3ZSdsbCBuZXZlciBnZXQgdG8gdGhpcyBwb2ludC4KKworY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotYWNvcm4pCisJCW9zPS1yaXNjaXgxLjIKKwkJOzsKKwlhcm0qLXJlYmVsKQorCQlvcz0tbGludXgKKwkJOzsKKwlhcm0qLXNlbWkpCisJCW9zPS1hb3V0CisJCTs7CisgICAgYzR4LSogfCB0aWM0eC0qKQorICAgICAgICBvcz0tY29mZgorICAgICAgICA7OworCSMgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIHRoZSAqLWRlYyBlbnRyeS4KKwlwZHAxMC0qKQorCQlvcz0tdG9wczIwCisJCTs7CisJcGRwMTEtKikKKwkJb3M9LW5vbmUKKwkJOzsKKwkqLWRlYyB8IHZheC0qKQorCQlvcz0tdWx0cml4NC4yCisJCTs7CisJbTY4Ki1hcG9sbG8pCisJCW9zPS1kb21haW4KKwkJOzsKKwlpMzg2LXN1bikKKwkJb3M9LXN1bm9zNC4wLjIKKwkJOzsKKwltNjgwMDAtc3VuKQorCQlvcz0tc3Vub3MzCisJCSMgVGhpcyBhbHNvIGV4aXN0cyBpbiB0aGUgY29uZmlndXJlIHByb2dyYW0sIGJ1dCB3YXMgbm90IHRoZQorCQkjIGRlZmF1bHQuCisJCSMgb3M9LXN1bm9zNAorCQk7OworCW02OCotY2lzY28pCisJCW9zPS1hb3V0CisJCTs7CisJbWlwcyotY2lzY28pCisJCW9zPS1lbGYKKwkJOzsKKwltaXBzKi0qKQorCQlvcz0tZWxmCisJCTs7CisJb3IzMi0qKQorCQlvcz0tY29mZgorCQk7OworCSotdHRpKQkjIG11c3QgYmUgYmVmb3JlIHNwYXJjIGVudHJ5IG9yIHdlIGdldCB0aGUgd3Jvbmcgb3MuCisJCW9zPS1zeXN2MworCQk7OworCXNwYXJjLSogfCAqLXN1bikKKwkJb3M9LXN1bm9zNC4xLjEKKwkJOzsKKwkqLWJlKQorCQlvcz0tYmVvcworCQk7OworCSotaWJtKQorCQlvcz0tYWl4CisJCTs7CisgICAgCSota251dGgpCisJCW9zPS1tbWl4d2FyZQorCQk7OworCSotd2VjKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi13aW5ib25kKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi1va2kpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLWhwKQorCQlvcz0taHB1eAorCQk7OworCSotaGl0YWNoaSkKKwkJb3M9LWhpdXgKKwkJOzsKKwlpODYwLSogfCAqLWF0dCB8ICotbmNyIHwgKi1hbHRvcyB8ICotbW90b3JvbGEgfCAqLWNvbnZlcmdlbnQpCisJCW9zPS1zeXN2CisJCTs7CisJKi1jYm0pCisJCW9zPS1hbWlnYW9zCisJCTs7CisJKi1kZykKKwkJb3M9LWRndXgKKwkJOzsKKwkqLWRvbHBoaW4pCisJCW9zPS1zeXN2MworCQk7OworCW02OGstY2N1cikKKwkJb3M9LXJ0dQorCQk7OworCW04OGstb21yb24qKQorCQlvcz0tbHVuYQorCQk7OworCSotbmV4dCApCisJCW9zPS1uZXh0c3RlcAorCQk7OworCSotc2VxdWVudCkKKwkJb3M9LXB0eAorCQk7OworCSotY3JkcykKKwkJb3M9LXVub3MKKwkJOzsKKwkqLW5zKQorCQlvcz0tZ2VuaXgKKwkJOzsKKwlpMzcwLSopCisJCW9zPS1tdnMKKwkJOzsKKwkqLW5leHQpCisJCW9zPS1uZXh0c3RlcDMKKwkJOzsKKwkqLWdvdWxkKQorCQlvcz0tc3lzdgorCQk7OworCSotaGlnaGxldmVsKQorCQlvcz0tYnNkCisJCTs7CisJKi1lbmNvcmUpCisJCW9zPS1ic2QKKwkJOzsKKwkqLXNnaSkKKwkJb3M9LWlyaXgKKwkJOzsKKwkqLXNpZW1lbnMpCisJCW9zPS1zeXN2NAorCQk7OworCSotbWFzc2NvbXApCisJCW9zPS1ydHUKKwkJOzsKKwlmMzBbMDFdLWZ1aml0c3UgfCBmNzAwLWZ1aml0c3UpCisJCW9zPS11eHB2CisJCTs7CisJKi1yb202OGspCisJCW9zPS1jb2ZmCisJCTs7CisJKi0qYnVnKQorCQlvcz0tY29mZgorCQk7OworCSotYXBwbGUpCisJCW9zPS1tYWNvcworCQk7OworCSotYXRhcmkqKQorCQlvcz0tbWludAorCQk7OworCSopCisJCW9zPS1ub25lCisJCTs7Citlc2FjCitmaQorCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGtub3cgdGhlIG9zLCBhbmQgdGhlIENQVSB0eXBlLCBidXQgbm90IHRoZQorIyBtYW51ZmFjdHVyZXIuICBXZSBwaWNrIHRoZSBsb2dpY2FsIG1hbnVmYWN0dXJlci4KK3ZlbmRvcj11bmtub3duCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi11bmtub3duKQorCQljYXNlICRvcyBpbgorCQkJLXJpc2NpeCopCisJCQkJdmVuZG9yPWFjb3JuCisJCQkJOzsKKwkJCS1zdW5vcyopCisJCQkJdmVuZG9yPXN1bgorCQkJCTs7CisJCQktYWl4KikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1iZW9zKikKKwkJCQl2ZW5kb3I9YmUKKwkJCQk7OworCQkJLWhwdXgqKQorCQkJCXZlbmRvcj1ocAorCQkJCTs7CisJCQktbXBlaXgqKQorCQkJCXZlbmRvcj1ocAorCQkJCTs7CisJCQktaGl1eCopCisJCQkJdmVuZG9yPWhpdGFjaGkKKwkJCQk7OworCQkJLXVub3MqKQorCQkJCXZlbmRvcj1jcmRzCisJCQkJOzsKKwkJCS1kZ3V4KikKKwkJCQl2ZW5kb3I9ZGcKKwkJCQk7OworCQkJLWx1bmEqKQorCQkJCXZlbmRvcj1vbXJvbgorCQkJCTs7CisJCQktZ2VuaXgqKQorCQkJCXZlbmRvcj1ucworCQkJCTs7CisJCQktbXZzKiB8IC1vcGVuZWQqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLW9zNDAwKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1wdHgqKQorCQkJCXZlbmRvcj1zZXF1ZW50CisJCQkJOzsKKwkJCS10cGYqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC13aW5kaXNzKikKKwkJCQl2ZW5kb3I9d3JzCisJCQkJOzsKKwkJCS1hdXgqKQorCQkJCXZlbmRvcj1hcHBsZQorCQkJCTs7CisJCQktaG1zKikKKwkJCQl2ZW5kb3I9aGl0YWNoaQorCQkJCTs7CisJCQktbXB3KiB8IC1tYWNvcyopCisJCQkJdmVuZG9yPWFwcGxlCisJCQkJOzsKKwkJCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCisJCQkJdmVuZG9yPWF0YXJpCisJCQkJOzsKKwkJCS12b3MqKQorCQkJCXZlbmRvcj1zdHJhdHVzCisJCQkJOzsKKwkJZXNhYworCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICJzL3Vua25vd24vJHZlbmRvci8iYAorCQk7OworZXNhYworCitlY2hvICRiYXNpY19tYWNoaW5lJG9zCitleGl0IDAKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCisjIHRpbWUtc3RhbXAtZW5kOiAiJyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUzN2FiODkKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWd1cmUKQEAgLTAsMCArMSw3NjM5IEBACisjISAvYmluL3NoCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi41OSBmb3IgR1JVQiAwLjk3LgorIworIyBSZXBvcnQgYnVncyB0byA8YnVnLWdydWJAZ251Lm9yZz4uCisjCisjIENvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNNHNoIEluaXRpYWxpemF0aW9uLiAgIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIEJlIEJvdXJuZSBjb21wYXRpYmxlCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKK2VsaWYgdGVzdCAtbiAiJHtCQVNIX1ZFUlNJT04rc2V0fSIgJiYgKHNldCAtbyBwb3NpeCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHNldCAtbyBwb3NpeAorZmkKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKKworIyBTdXBwb3J0IHVuc2V0IHdoZW4gcG9zc2libGUuCitpZiAoIChNQUlMPTYwOyB1bnNldCBNQUlMKSB8fCBleGl0KSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfdW5zZXQ9dW5zZXQKK2Vsc2UKKyAgYXNfdW5zZXQ9ZmFsc2UKK2ZpCisKKworIyBXb3JrIGFyb3VuZCBidWdzIGluIHByZS0zLjAgVVdJTiBrc2guCiskYXNfdW5zZXQgRU5WIE1BSUwgTUFJTFBBVEgKK1BTMT0nJCAnCitQUzI9Jz4gJworUFM0PScrICcKKworIyBOTFMgbnVpc2FuY2VzLgorZm9yIGFzX3ZhciBpbiBcCisgIExBTkcgTEFOR1VBR0UgTENfQUREUkVTUyBMQ19BTEwgTENfQ09MTEFURSBMQ19DVFlQRSBMQ19JREVOVElGSUNBVElPTiBcCisgIExDX01FQVNVUkVNRU5UIExDX01FU1NBR0VTIExDX01PTkVUQVJZIExDX05BTUUgTENfTlVNRVJJQyBMQ19QQVBFUiBcCisgIExDX1RFTEVQSE9ORSBMQ19USU1FCitkbworICBpZiAoc2V0ICt4OyB0ZXN0IC16ICJgKGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcikgMj4mMWAiKTsgdGhlbgorICAgIGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcgorICBlbHNlCisgICAgJGFzX3Vuc2V0ICRhc192YXIKKyAgZmkKK2RvbmUKKworIyBSZXF1aXJlZCB0byB1c2UgYmFzZW5hbWUuCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworaWYgKGJhc2VuYW1lIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC8gMj4mMWAiID0gIlgvIjsgdGhlbgorICBhc19iYXNlbmFtZT1iYXNlbmFtZQorZWxzZQorICBhc19iYXNlbmFtZT1mYWxzZQorZmkKKworCisjIE5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCithc19tZT1gJGFzX2Jhc2VuYW1lICIkMCIgfHwKKyRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCisJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJDAiIDogJ1hcKC9cKSQnIFx8IFwKKwkgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgvIiQwIiB8CisgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcL1woXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcL1woXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYAorCisKKyMgUEFUSCBuZWVkcyBDUiwgYW5kIExJTkVOTyBuZWVkcyBDUiBhbmQgUEFUSC4KKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KK2FzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JworYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCithc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKK2FzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKK2FzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cworCisjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisgIGVjaG8gIiMhIC9iaW4vc2giID5jb25mJCQuc2gKKyAgZWNobyAgImV4aXQgMCIgICA+PmNvbmYkJC5zaAorICBjaG1vZCAreCBjb25mJCQuc2gKKyAgaWYgKFBBVEg9Ii9ub25leGlzdGVudDsuIjsgY29uZiQkLnNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBQQVRIX1NFUEFSQVRPUj0nOycKKyAgZWxzZQorICAgIFBBVEhfU0VQQVJBVE9SPToKKyAgZmkKKyAgcm0gLWYgY29uZiQkLnNoCitmaQorCisKKyAgYXNfbGluZW5vXzE9JExJTkVOTworICBhc19saW5lbm9fMj0kTElORU5PCisgIGFzX2xpbmVub18zPWAoZXhwciAkYXNfbGluZW5vXzEgKyAxKSAyPi9kZXYvbnVsbGAKKyAgdGVzdCAieCRhc19saW5lbm9fMSIgIT0gIngkYXNfbGluZW5vXzIiICYmCisgIHRlc3QgIngkYXNfbGluZW5vXzMiICA9ICJ4JGFzX2xpbmVub18yIiAgfHwgeworICAjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBwYXRoIGF0IGFsbAorICAjIHJlbGF0aXZlIG9yIG5vdC4KKyAgY2FzZSAkMCBpbgorICAgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKKyAgICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCitkb25lCisKKyAgICAgICA7OworICBlc2FjCisgICMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKKyAgIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCisgIGlmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KKyAgICBhc19teXNlbGY9JDAKKyAgZmkKKyAgaWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIHBhdGgiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgIGZpCisgIGNhc2UgJENPTkZJR19TSEVMTCBpbgorICAnJykKKyAgICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluIC9iaW4kUEFUSF9TRVBBUkFUT1IvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhc19iYXNlIGluIHNoIGJhc2gga3NoIHNoNTsgZG8KKwkgY2FzZSAkYXNfZGlyIGluCisJIC8qKQorCSAgIGlmICgiJGFzX2Rpci8kYXNfYmFzZSIgLWMgJworICBhc19saW5lbm9fMT0kTElORU5PCisgIGFzX2xpbmVub18yPSRMSU5FTk8KKyAgYXNfbGluZW5vXzM9YChleHByICRhc19saW5lbm9fMSArIDEpIDI+L2Rldi9udWxsYAorICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKKyAgdGVzdCAieCRhc19saW5lbm9fMyIgID0gIngkYXNfbGluZW5vXzIiICcpIDI+L2Rldi9udWxsOyB0aGVuCisJICAgICAkYXNfdW5zZXQgQkFTSF9FTlYgfHwgdGVzdCAiJHtCQVNIX0VOVitzZXR9IiAhPSBzZXQgfHwgeyBCQVNIX0VOVj07IGV4cG9ydCBCQVNIX0VOVjsgfQorCSAgICAgJGFzX3Vuc2V0IEVOViB8fCB0ZXN0ICIke0VOVitzZXR9IiAhPSBzZXQgfHwgeyBFTlY9OyBleHBvcnQgRU5WOyB9CisJICAgICBDT05GSUdfU0hFTEw9JGFzX2Rpci8kYXNfYmFzZQorCSAgICAgZXhwb3J0IENPTkZJR19TSEVMTAorCSAgICAgZXhlYyAiJENPTkZJR19TSEVMTCIgIiQwIiAkezErIiRAIn0KKwkgICBmaTs7CisJIGVzYWMKKyAgICAgICBkb25lCitkb25lCis7OworICBlc2FjCisKKyAgIyBDcmVhdGUgJGFzX21lLmxpbmVubyBhcyBhIGNvcHkgb2YgJGFzX215c2VsZiwgYnV0IHdpdGggJExJTkVOTworICAjIHVuaWZvcm1seSByZXBsYWNlZCBieSB0aGUgbGluZSBudW1iZXIuICBUaGUgZmlyc3QgJ3NlZCcgaW5zZXJ0cyBhCisgICMgbGluZS1udW1iZXIgbGluZSBiZWZvcmUgZWFjaCBsaW5lOyB0aGUgc2Vjb25kICdzZWQnIGRvZXMgdGhlIHJlYWwKKyAgIyB3b3JrLiAgVGhlIHNlY29uZCBzY3JpcHQgdXNlcyAnTicgdG8gcGFpciBlYWNoIGxpbmUtbnVtYmVyIGxpbmUKKyAgIyB3aXRoIHRoZSBudW1iZXJlZCBsaW5lLCBhbmQgYXBwZW5kcyB0cmFpbGluZyAnLScgZHVyaW5nCisgICMgc3Vic3RpdHV0aW9uIHNvIHRoYXQgJExJTkVOTyBpcyBub3QgYSBzcGVjaWFsIGNhc2UgYXQgbGluZSBlbmQuCisgICMgKFJhamEgUiBIYXJpbmF0aCBzdWdnZXN0ZWQgc2VkICc9JywgYW5kIFBhdWwgRWdnZXJ0IHdyb3RlIHRoZQorICAjIHNlY29uZCAnc2VkJyBzY3JpcHQuICBCbGFtZSBMZWUgRS4gTWNNYWhvbiBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCisgIHNlZCAnPScgPCRhc19teXNlbGYgfAorICAgIHNlZCAnCisgICAgICBOCisgICAgICBzLCQsLSwKKyAgICAgIDogbG9vcAorICAgICAgcyxeXChbJyRhc19jcl9kaWdpdHMnXSpcKVwoLipcKVskXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dXCksXDFcMlwxXDMsCisgICAgICB0IGxvb3AKKyAgICAgIHMsLSQsLAorICAgICAgcyxeWyckYXNfY3JfZGlnaXRzJ10qXG4sLAorICAgICcgPiRhc19tZS5saW5lbm8gJiYKKyAgY2htb2QgK3ggJGFzX21lLmxpbmVubyB8fAorICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisKKyAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKKyAgIyAodGhlIGRpcm5hbWUgb2YgJFswXSBpcyBub3QgdGhlIHBsYWNlIHdoZXJlIHdlIG1pZ2h0IGZpbmQgdGhlCisgICMgb3JpZ2luYWwgYW5kIHNvIG9uLiAgQXV0b2NvbmYgaXMgZXNwZWNpYWxseSBzZW5zaWJsZSB0byB0aGlzKS4KKyAgLiAuLyRhc19tZS5saW5lbm8KKyAgIyBFeGl0IHN0YXR1cyBpcyB0aGF0IG9mIHRoZSBsYXN0IGNvbW1hbmQuCisgIGV4aXQKK30KKworCitjYXNlIGBlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzYCxgZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzYCBpbgorICAqYyosLW4qKSBFQ0hPX049IEVDSE9fQz0nCisnIEVDSE9fVD0nCScgOzsKKyAgKmMqLCogICkgRUNIT19OPS1uIEVDSE9fQz0gRUNIT19UPSA7OworICAqKSAgICAgICBFQ0hPX049IEVDSE9fQz0nXGMnIEVDSE9fVD0gOzsKK2VzYWMKKworaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfZXhwcj1leHByCitlbHNlCisgIGFzX2V4cHI9ZmFsc2UKK2ZpCisKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCitlY2hvID5jb25mJCQuZmlsZQoraWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICMgV2UgY291bGQganVzdCBjaGVjayBmb3IgREpHUFA7IGJ1dCB0aGlzIHRlc3QgYSkgd29ya3MgYikgaXMgbW9yZSBnZW5lcmljCisgICMgYW5kIGMpIHdpbGwgcmVtYWluIHZhbGlkIG9uY2UgREpHUFAgc3VwcG9ydHMgc3ltbGlua3MgKERKR1BQIDIuMDQpLgorICBpZiB0ZXN0IC1mIGNvbmYkJC5leGU7IHRoZW4KKyAgICAjIERvbid0IHVzZSBsbiBhdCBhbGw7IHdlIGRvbid0IGhhdmUgYW55IGxpbmtzCisgICAgYXNfbG5fcz0nY3AgLXAnCisgIGVsc2UKKyAgICBhc19sbl9zPSdsbiAtcycKKyAgZmkKK2VsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2xuX3M9bG4KK2Vsc2UKKyAgYXNfbG5fcz0nY3AgLXAnCitmaQorcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKKworaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19ta2Rpcl9wPToKK2Vsc2UKKyAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKKyAgYXNfbWtkaXJfcD1mYWxzZQorZmkKKworYXNfZXhlY3V0YWJsZV9wPSJ0ZXN0IC1mIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCithc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KK2FzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKworIyBJRlMKKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuCithc19ubD0nCisnCitJRlM9IiAJJGFzX25sIgorCisjIENEUEFUSC4KKyRhc191bnNldCBDRFBBVEgKKworCisjIE5hbWUgb2YgdGhlIGhvc3QuCisjIGhvc3RuYW1lIG9uIHNvbWUgc3lzdGVtcyAoU1ZSMy4yLCBMaW51eCkgcmV0dXJucyBhIGJvZ3VzIGV4aXQgc3RhdHVzLAorIyBzbyB1bmFtZSBnZXRzIHJ1biB0b28uCithY19ob3N0bmFtZT1gKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKKworZXhlYyA2PiYxCisKKyMKKyMgSW5pdGlhbGl6YXRpb25zLgorIworYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorYWNfY29uZmlnX2xpYm9ial9kaXI9LgorY3Jvc3NfY29tcGlsaW5nPW5vCitzdWJkaXJzPQorTUZMQUdTPQorTUFLRUZMQUdTPQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKworIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgorIyBUaGlzIHZhcmlhYmxlIHNlZW1zIG9ic29sZXRlLiAgSXQgc2hvdWxkIHByb2JhYmx5IGJlIHJlbW92ZWQsIGFuZAorIyBvbmx5IGFjX21heF9zZWRfbGluZXMgc2hvdWxkIGJlIHVzZWQuCis6ICR7YWNfbWF4X2hlcmVfbGluZXM9Mzh9CisKKyMgSWRlbnRpdHkgb2YgdGhpcyBwYWNrYWdlLgorUEFDS0FHRV9OQU1FPSdHUlVCJworUEFDS0FHRV9UQVJOQU1FPSdncnViJworUEFDS0FHRV9WRVJTSU9OPScwLjk3JworUEFDS0FHRV9TVFJJTkc9J0dSVUIgMC45NycKK1BBQ0tBR0VfQlVHUkVQT1JUPSdidWctZ3J1YkBnbnUub3JnJworCithY191bmlxdWVfZmlsZT0ic3RhZ2UyL3N0YWdlMi5jIgorIyBGYWN0b3JpbmcgZGVmYXVsdCBoZWFkZXJzIGZvciBtb3N0IHRlc3RzLgorYWNfaW5jbHVkZXNfZGVmYXVsdD0iXAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWYgSEFWRV9TWVNfVFlQRVNfSAorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1lTX1NUQVRfSAorIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWYgU1REQ19IRUFERVJTCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbHNlCisjIGlmIEhBVkVfU1RETElCX0gKKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBlbmRpZgorI2VuZGlmCisjaWYgSEFWRV9TVFJJTkdfSAorIyBpZiAhU1REQ19IRUFERVJTICYmIEhBVkVfTUVNT1JZX0gKKyMgIGluY2x1ZGUgPG1lbW9yeS5oPgorIyBlbmRpZgorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1RSSU5HU19ICisjIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2lmIEhBVkVfSU5UVFlQRVNfSAorIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2Vsc2UKKyMgaWYgSEFWRV9TVERJTlRfSAorIyAgaW5jbHVkZSA8c3RkaW50Lmg+CisjIGVuZGlmCisjZW5kaWYKKyNpZiBIQVZFX1VOSVNURF9ICisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmIgorCithY19zdWJzdF92YXJzPSdTSEVMTCBQQVRIX1NFUEFSQVRPUiBQQUNLQUdFX05BTUUgUEFDS0FHRV9UQVJOQU1FIFBBQ0tBR0VfVkVSU0lPTiBQQUNLQUdFX1NUUklORyBQQUNLQUdFX0JVR1JFUE9SVCBleGVjX3ByZWZpeCBwcmVmaXggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSBiaW5kaXIgc2JpbmRpciBsaWJleGVjZGlyIGRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBsb2NhbHN0YXRlZGlyIGxpYmRpciBpbmNsdWRlZGlyIG9sZGluY2x1ZGVkaXIgaW5mb2RpciBtYW5kaXIgYnVpbGRfYWxpYXMgaG9zdF9hbGlhcyB0YXJnZXRfYWxpYXMgREVGUyBFQ0hPX0MgRUNIT19OIEVDSE9fVCBMSUJTIElOU1RBTExfUFJPR1JBTSBJTlNUQUxMX1NDUklQVCBJTlNUQUxMX0RBVEEgQ1lHUEFUSF9XIFBBQ0tBR0UgVkVSU0lPTiBBQ0xPQ0FMIEFVVE9DT05GIEFVVE9NQUtFIEFVVE9IRUFERVIgTUFLRUlORk8gaW5zdGFsbF9zaCBTVFJJUCBhY19jdF9TVFJJUCBJTlNUQUxMX1NUUklQX1BST0dSQU0gbWtkaXJfcCBBV0sgU0VUX01BS0UgYW1fX2xlYWRpbmdfZG90IEFNVEFSIGFtX190YXIgYW1fX3VudGFyIGJ1aWxkIGJ1aWxkX2NwdSBidWlsZF92ZW5kb3IgYnVpbGRfb3MgaG9zdCBob3N0X2NwdSBob3N0X3ZlbmRvciBob3N0X29zIE1BSU5UQUlORVJfTU9ERV9UUlVFIE1BSU5UQUlORVJfTU9ERV9GQUxTRSBNQUlOVCBQRVJMIENDIGFjX2N0X0NDIENGTEFHUyBMREZMQUdTIENQUEZMQUdTIEVYRUVYVCBPQkpFWFQgREVQRElSIGFtX19pbmNsdWRlIGFtX19xdW90ZSBBTURFUF9UUlVFIEFNREVQX0ZBTFNFIEFNREVQQkFDS1NMQVNIIENDREVQTU9ERSBhbV9fZmFzdGRlcENDX1RSVUUgYW1fX2Zhc3RkZXBDQ19GQUxTRSBDQ0FTIFJBTkxJQiBhY19jdF9SQU5MSUIgU1RBR0UxX0NGTEFHUyBTVEFHRTJfQ0ZMQUdTIEdSVUJfQ0ZMQUdTIE9CSkNPUFkgYWNfY3RfT0JKQ09QWSBHUlVCX0xJQlMgQ1BQIEVHUkVQIE5FVEJPT1RfU1VQUE9SVF9UUlVFIE5FVEJPT1RfU1VQUE9SVF9GQUxTRSBESVNLTEVTU19TVVBQT1JUX1RSVUUgRElTS0xFU1NfU1VQUE9SVF9GQUxTRSBIRVJDVUxFU19TVVBQT1JUX1RSVUUgSEVSQ1VMRVNfU1VQUE9SVF9GQUxTRSBTRVJJQUxfU1VQUE9SVF9UUlVFIFNFUklBTF9TVVBQT1JUX0ZBTFNFIFNFUklBTF9TUEVFRF9TSU1VTEFUSU9OX1RSVUUgU0VSSUFMX1NQRUVEX1NJTVVMQVRJT05fRkFMU0UgQlVJTERfRVhBTVBMRV9LRVJORUxfVFJVRSBCVUlMRF9FWEFNUExFX0tFUk5FTF9GQUxTRSBGU1lTX0NGTEFHUyBORVRfQ0ZMQUdTIE5FVF9FWFRSQUZMQUdTIE5FVEJPT1RfRFJJVkVSUyBDQ0FTRkxBR1MgTElCT0JKUyBMVExJQk9CSlMnCithY19zdWJzdF9maWxlcz0nJworCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCithY19pbml0X2hlbHA9CithY19pbml0X3ZlcnNpb249ZmFsc2UKKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitjYWNoZV9maWxlPS9kZXYvbnVsbAorZXhlY19wcmVmaXg9Tk9ORQorbm9fY3JlYXRlPQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorCisjIEluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb3B0aW9ucy4KKyMgVGhlc2UgYXJlIGxlZnQgdW5leHBhbmRlZCBzbyB1c2VycyBjYW4gIm1ha2UgaW5zdGFsbCBleGVjX3ByZWZpeD0vZm9vIgorIyBhbmQgYWxsIHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgYmFzZWQgb24gZXhlY19wcmVmaXgKKyMgYnkgZGVmYXVsdCB3aWxsIGFjdHVhbGx5IGNoYW5nZS4KKyMgVXNlIGJyYWNlcyBpbnN0ZWFkIG9mIHBhcmVucyBiZWNhdXNlIHNoLCBwZXJsLCBldGMuIGFsc28gYWNjZXB0IHRoZW0uCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitpbmZvZGlyPScke3ByZWZpeH0vaW5mbycKK21hbmRpcj0nJHtwcmVmaXh9L21hbicKKworYWNfcHJldj0KK2ZvciBhY19vcHRpb24KK2RvCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgYWNfb3B0YXJnPWBleHByICJ4JGFjX29wdGlvbiIgOiAneFtePV0qPVwoLipcKSdgCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICRhY19vcHRpb24gaW4KKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSRhY19vcHRhcmcgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGRfYWxpYXMgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGRfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9JGFjX29wdGFyZyA7OworCisgIC0tY29uZmlnLWNhY2hlIHwgLUMpCisgICAgY2FjaGVfZmlsZT1jb25maWcuY2FjaGUgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCisgIHwgLS1kYT0qKQorICAgIGRhdGFkaXI9JGFjX29wdGFyZyA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY19mZWF0dXJlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZGlzYWJsZS1cKC4qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX2ZlYXR1cmUiIDogIi4qW14tXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY19mZWF0dXJlIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmUgfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgImVuYWJsZV8kYWNfZmVhdHVyZT1ubyIgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSplbmFibGUtXChbXj1dKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY19mZWF0dXJlIiA6ICIuKlteLV8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfZmVhdHVyZSIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlIHwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICRhY19vcHRpb24gaW4KKyAgICAgICo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgImVuYWJsZV8kYWNfZmVhdHVyZT0nJGFjX29wdGFyZyciIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLWgpCisgICAgYWNfaW5pdF9oZWxwPWxvbmcgOzsKKyAgLWhlbHA9ciogfCAtLWhlbHA9ciogfCAtLWhlbD1yKiB8IC0taGU9ciogfCAtaHIqKQorICAgIGFjX2luaXRfaGVscD1yZWN1cnNpdmUgOzsKKyAgLWhlbHA9cyogfCAtLWhlbHA9cyogfCAtLWhlbD1zKiB8IC0taGU9cyogfCAtaHMqKQorICAgIGFjX2luaXRfaGVscD1zaG9ydCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdF9hbGlhcyA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3RfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSRhY19vcHRhcmcgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKyAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKKyAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMgfCAtbikKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9JGFjX29wdGFyZyA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9JGFjX29wdGFyZyA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSRhY19vcHRhcmcgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSRhY19vcHRhcmcgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldF9hbGlhcyA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0X2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtVikKKyAgICBhY19pbml0X3ZlcnNpb249OiA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY19wYWNrYWdlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aC1cKFtePV0qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3BhY2thZ2UiIDogIi4qW14tXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY19wYWNrYWdlIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAkYWNfb3B0aW9uIGluCisgICAgICAqPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJ3aXRoXyRhY19wYWNrYWdlPSckYWNfb3B0YXJnJyIgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfcGFja2FnZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGhvdXQtXCguKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY19wYWNrYWdlIiA6ICIuKlteLV8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfcGFja2FnZSIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlIHwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJ3aXRoXyRhY19wYWNrYWdlPW5vIiA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9JGFjX29wdGFyZyA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0kYWNfb3B0YXJnIDs7CisKKyAgLSopIHsgZWNobyAiJGFzX21lOiBlcnJvcjogdW5yZWNvZ25pemVkIG9wdGlvbjogJGFjX29wdGlvbgorVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgOzsKKworICAqPSopCisgICAgYWNfZW52dmFyPWBleHByICJ4JGFjX29wdGlvbiIgOiAneFwoW149XSpcKT0nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX2VudnZhciIgOiAiLipbXl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgdmFyaWFibGUgbmFtZTogJGFjX2VudnZhciIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgCisgICAgZXZhbCAiJGFjX2VudnZhcj0nJGFjX29wdGFyZyciCisgICAgZXhwb3J0ICRhY19lbnZ2YXIgOzsKKworICAqKQorICAgICMgRklYTUU6IHNob3VsZCBiZSByZW1vdmVkIGluIGF1dG9jb25mIDMuMC4KKyAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IHlvdSBzaG91bGQgdXNlIC0tYnVpbGQsIC0taG9zdCwgLS10YXJnZXQiID4mMgorICAgIGV4cHIgIngkYWNfb3B0aW9uIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpbnZhbGlkIGhvc3QgdHlwZTogJGFjX29wdGlvbiIgPiYyCisgICAgOiAke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufQorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgYWNfb3B0aW9uPS0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYAorICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gJGFjX29wdGlvbiIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKKyMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIHBhdGhzLgorZm9yIGFjX3ZhciBpbiBleGVjX3ByZWZpeCBwcmVmaXgKK2RvCisgIGV2YWwgYWNfdmFsPSRgZWNobyAkYWNfdmFyYAorICBjYXNlICRhY192YWwgaW4KKyAgICBbXFwvJF0qIHwgPzpbXFwvXSogfCBOT05FIHwgJycgKSA7OworICAgICopICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGV4cGVjdGVkIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIGZvciAtLSRhY192YXI6ICRhY192YWwiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKKyAgZXNhYworZG9uZQorCisjIEJlIHN1cmUgdG8gaGF2ZSBhYnNvbHV0ZSBwYXRocy4KK2ZvciBhY192YXIgaW4gYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhZGlyIHN5c2NvbmZkaXIgc2hhcmVkc3RhdGVkaXIgXAorCSAgICAgIGxvY2Fsc3RhdGVkaXIgbGliZGlyIGluY2x1ZGVkaXIgb2xkaW5jbHVkZWRpciBpbmZvZGlyIG1hbmRpcgorZG8KKyAgZXZhbCBhY192YWw9JGBlY2hvICRhY192YXJgCisgIGNhc2UgJGFjX3ZhbCBpbgorICAgIFtcXC8kXSogfCA/OltcXC9dKiApIDs7CisgICAgKikgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogZXhwZWN0ZWQgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgZm9yIC0tJGFjX3ZhcjogJGFjX3ZhbCIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworICBlc2FjCitkb25lCisKKyMgVGhlcmUgbWlnaHQgYmUgcGVvcGxlIHdobyBkZXBlbmQgb24gdGhlIG9sZCBicm9rZW4gYmVoYXZpb3I6IGAkaG9zdCcKKyMgdXNlZCB0byBob2xkIHRoZSBhcmd1bWVudCBvZiAtLWhvc3QgZXRjLgorIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgorYnVpbGQ9JGJ1aWxkX2FsaWFzCitob3N0PSRob3N0X2FsaWFzCit0YXJnZXQ9JHRhcmdldF9hbGlhcworCisjIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCitpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiICE9IHg7IHRoZW4KKyAgaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgPSB4OyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPW1heWJlCisgICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJZiB5b3Ugd2FudGVkIHRvIHNldCB0aGUgLS1idWlsZCB0eXBlLCBkb24ndCB1c2UgLS1ob3N0LgorICAgIElmIGEgY3Jvc3MgY29tcGlsZXIgaXMgZGV0ZWN0ZWQgdGhlbiBjcm9zcyBjb21waWxlIG1vZGUgd2lsbCBiZSB1c2VkLiIgPiYyCisgIGVsaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgIT0gIngkaG9zdF9hbGlhcyI7IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9eWVzCisgIGZpCitmaQorCithY190b29sX3ByZWZpeD0KK3Rlc3QgLW4gIiRob3N0X2FsaWFzIiAmJiBhY190b29sX3ByZWZpeD0kaG9zdF9hbGlhcy0KKwordGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAorCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgorICBhY19jb25mZGlyPWAoZGlybmFtZSAiJDAiKSAyPi9kZXYvbnVsbCB8fAorJGFzX2V4cHIgWCIkMCIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoL1wpJyBcfCBcCisJIC4gICAgIDogJ1woLlwpJyAyPi9kZXYvbnVsbCB8fAorZWNobyBYIiQwIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpW14vXS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXCkuKi97IHMvL1wxLzsgcTsgfQorICAJICBzLy4qLy4vOyBxJ2AKKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgc291cmNlcyAoJGFjX3VuaXF1ZV9maWxlKSBpbiAkYWNfY29uZmRpciBvciAuLiIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgZWxzZQorICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgc291cmNlcyAoJGFjX3VuaXF1ZV9maWxlKSBpbiAkc3JjZGlyIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICBmaQorZmkKKyhjZCAkc3JjZGlyICYmIHRlc3QgLXIgLi8kYWNfdW5pcXVlX2ZpbGUpIDI+L2Rldi9udWxsIHx8CisgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogc291cmNlcyBhcmUgaW4gJHNyY2RpciwgYnV0IFxgY2QgJHNyY2RpcicgZG9lcyBub3Qgd29yayIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK3NyY2Rpcj1gZWNobyAiJHNyY2RpciIgfCBzZWQgJ3MlXChbXlxcL11cKVtcXC9dKiQlXDElJ2AKK2FjX2Vudl9idWlsZF9hbGlhc19zZXQ9JHtidWlsZF9hbGlhcytzZXR9CithY19lbnZfYnVpbGRfYWxpYXNfdmFsdWU9JGJ1aWxkX2FsaWFzCithY19jdl9lbnZfYnVpbGRfYWxpYXNfc2V0PSR7YnVpbGRfYWxpYXMrc2V0fQorYWNfY3ZfZW52X2J1aWxkX2FsaWFzX3ZhbHVlPSRidWlsZF9hbGlhcworYWNfZW52X2hvc3RfYWxpYXNfc2V0PSR7aG9zdF9hbGlhcytzZXR9CithY19lbnZfaG9zdF9hbGlhc192YWx1ZT0kaG9zdF9hbGlhcworYWNfY3ZfZW52X2hvc3RfYWxpYXNfc2V0PSR7aG9zdF9hbGlhcytzZXR9CithY19jdl9lbnZfaG9zdF9hbGlhc192YWx1ZT0kaG9zdF9hbGlhcworYWNfZW52X3RhcmdldF9hbGlhc19zZXQ9JHt0YXJnZXRfYWxpYXMrc2V0fQorYWNfZW52X3RhcmdldF9hbGlhc192YWx1ZT0kdGFyZ2V0X2FsaWFzCithY19jdl9lbnZfdGFyZ2V0X2FsaWFzX3NldD0ke3RhcmdldF9hbGlhcytzZXR9CithY19jdl9lbnZfdGFyZ2V0X2FsaWFzX3ZhbHVlPSR0YXJnZXRfYWxpYXMKK2FjX2Vudl9DQ19zZXQ9JHtDQytzZXR9CithY19lbnZfQ0NfdmFsdWU9JENDCithY19jdl9lbnZfQ0Nfc2V0PSR7Q0Mrc2V0fQorYWNfY3ZfZW52X0NDX3ZhbHVlPSRDQworYWNfZW52X0NGTEFHU19zZXQ9JHtDRkxBR1Mrc2V0fQorYWNfZW52X0NGTEFHU192YWx1ZT0kQ0ZMQUdTCithY19jdl9lbnZfQ0ZMQUdTX3NldD0ke0NGTEFHUytzZXR9CithY19jdl9lbnZfQ0ZMQUdTX3ZhbHVlPSRDRkxBR1MKK2FjX2Vudl9MREZMQUdTX3NldD0ke0xERkxBR1Mrc2V0fQorYWNfZW52X0xERkxBR1NfdmFsdWU9JExERkxBR1MKK2FjX2N2X2Vudl9MREZMQUdTX3NldD0ke0xERkxBR1Mrc2V0fQorYWNfY3ZfZW52X0xERkxBR1NfdmFsdWU9JExERkxBR1MKK2FjX2Vudl9DUFBGTEFHU19zZXQ9JHtDUFBGTEFHUytzZXR9CithY19lbnZfQ1BQRkxBR1NfdmFsdWU9JENQUEZMQUdTCithY19jdl9lbnZfQ1BQRkxBR1Nfc2V0PSR7Q1BQRkxBR1Mrc2V0fQorYWNfY3ZfZW52X0NQUEZMQUdTX3ZhbHVlPSRDUFBGTEFHUworYWNfZW52X0NQUF9zZXQ9JHtDUFArc2V0fQorYWNfZW52X0NQUF92YWx1ZT0kQ1BQCithY19jdl9lbnZfQ1BQX3NldD0ke0NQUCtzZXR9CithY19jdl9lbnZfQ1BQX3ZhbHVlPSRDUFAKKworIworIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgorIworaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAibG9uZyI7IHRoZW4KKyAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgY2F0IDw8X0FDRU9GCitcYGNvbmZpZ3VyZScgY29uZmlndXJlcyBHUlVCIDAuOTcgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgorCitVc2FnZTogJDAgW09QVElPTl0uLi4gW1ZBUj1WQUxVRV0uLi4KKworVG8gYXNzaWduIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZS5nLiwgQ0MsIENGTEFHUy4uLiksIHNwZWNpZnkgdGhlbSBhcworVkFSPVZBTFVFLiAgU2VlIGJlbG93IGZvciBkZXNjcmlwdGlvbnMgb2Ygc29tZSBvZiB0aGUgdXNlZnVsIHZhcmlhYmxlcy4KKworRGVmYXVsdHMgZm9yIHRoZSBvcHRpb25zIGFyZSBzcGVjaWZpZWQgaW4gYnJhY2tldHMuCisKK0NvbmZpZ3VyYXRpb246CisgIC1oLCAtLWhlbHAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0CisgICAgICAtLWhlbHA9c2hvcnQgICAgICAgIGRpc3BsYXkgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGlzIHBhY2thZ2UKKyAgICAgIC0taGVscD1yZWN1cnNpdmUgICAgZGlzcGxheSB0aGUgc2hvcnQgaGVscCBvZiBhbGwgdGhlIGluY2x1ZGVkIHBhY2thZ2VzCisgIC1WLCAtLXZlcnNpb24gICAgICAgICAgIGRpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorICAtcSwgLS1xdWlldCwgLS1zaWxlbnQgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgICAgIC0tY2FjaGUtZmlsZT1GSUxFICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUgW2Rpc2FibGVkXQorICAtQywgLS1jb25maWctY2FjaGUgICAgICBhbGlhcyBmb3IgXGAtLWNhY2hlLWZpbGU9Y29uZmlnLmNhY2hlJworICAtbiwgLS1uby1jcmVhdGUgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAgICAgLS1zcmNkaXI9RElSICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciBcYC4uJ10KKworX0FDRU9GCisKKyAgY2F0IDw8X0FDRU9GCitJbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorCQkJICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorCQkJICBbUFJFRklYXQorCitCeSBkZWZhdWx0LCBcYG1ha2UgaW5zdGFsbCcgd2lsbCBpbnN0YWxsIGFsbCB0aGUgZmlsZXMgaW4KK1xgJGFjX2RlZmF1bHRfcHJlZml4L2JpbicsIFxgJGFjX2RlZmF1bHRfcHJlZml4L2xpYicgZXRjLiAgWW91IGNhbiBzcGVjaWZ5CithbiBpbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gXGAkYWNfZGVmYXVsdF9wcmVmaXgnIHVzaW5nIFxgLS1wcmVmaXgnLAorZm9yIGluc3RhbmNlIFxgLS1wcmVmaXg9XCRIT01FJy4KKworRm9yIGJldHRlciBjb250cm9sLCB1c2UgdGhlIG9wdGlvbnMgYmVsb3cuCisKK0ZpbmUgdHVuaW5nIG9mIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6CisgIC0tYmluZGlyPURJUiAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBbRVBSRUZJWC9saWJleGVjXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbUFJFRklYL3NoYXJlXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgQyBoZWFkZXIgZmlsZXMgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIFsvdXNyL2luY2x1ZGVdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIFtQUkVGSVgvaW5mb10KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBbUFJFRklYL21hbl0KK19BQ0VPRgorCisgIGNhdCA8PFxfQUNFT0YKKworUHJvZ3JhbSBuYW1lczoKKyAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggICAgICAgICAgICBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCAgICAgICAgICAgIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0gICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKworU3lzdGVtIHR5cGVzOgorICAtLWJ1aWxkPUJVSUxEICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtndWVzc2VkXQorICAtLWhvc3Q9SE9TVCAgICAgICBjcm9zcy1jb21waWxlIHRvIGJ1aWxkIHByb2dyYW1zIHRvIHJ1biBvbiBIT1NUIFtCVUlMRF0KK19BQ0VPRgorZmkKKworaWYgdGVzdCAtbiAiJGFjX2luaXRfaGVscCI7IHRoZW4KKyAgY2FzZSAkYWNfaW5pdF9oZWxwIGluCisgICAgIHNob3J0IHwgcmVjdXJzaXZlICkgZWNobyAiQ29uZmlndXJhdGlvbiBvZiBHUlVCIDAuOTc6Ijs7CisgICBlc2FjCisgIGNhdCA8PFxfQUNFT0YKKworT3B0aW9uYWwgRmVhdHVyZXM6CisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAorCQkJICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyCisgIC0tZGlzYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nICBzcGVlZHMgdXAgb25lLXRpbWUgYnVpbGQKKyAgLS1lbmFibGUtZGVwZW5kZW5jeS10cmFja2luZyAgIGRvIG5vdCByZWplY3Qgc2xvdyBkZXBlbmRlbmN5IGV4dHJhY3RvcnMKKyAgLS1kaXNhYmxlLWV4dDJmcyAgICAgICAgZGlzYWJsZSBleHQyZnMgc3VwcG9ydCBpbiBTdGFnZSAyCisgIC0tZGlzYWJsZS1mYXQgICAgICAgICAgIGRpc2FibGUgRkFUIHN1cHBvcnQgaW4gU3RhZ2UgMgorICAtLWRpc2FibGUtZmZzICAgICAgICAgICBkaXNhYmxlIEZGUyBzdXBwb3J0IGluIFN0YWdlIDIKKyAgLS1kaXNhYmxlLXVmczIgICAgICAgICAgZGlzYWJsZSBVRlMyIHN1cHBvcnQgaW4gU3RhZ2UgMgorICAtLWRpc2FibGUtbWluaXggICAgICAgICBkaXNhYmxlIE1pbml4IGZzIHN1cHBvcnQgaW4gU3RhZ2UgMgorICAtLWRpc2FibGUtcmVpc2VyZnMgICAgICBkaXNhYmxlIFJlaXNlckZTIHN1cHBvcnQgaW4gU3RhZ2UgMgorICAtLWRpc2FibGUtdnN0YWZzICAgICAgICBkaXNhYmxlIFZTVGEgRlMgc3VwcG9ydCBpbiBTdGFnZSAyCisgIC0tZGlzYWJsZS1qZnMgICAgICAgICAgIGRpc2FibGUgSUJNIEpGUyBzdXBwb3J0IGluIFN0YWdlIDIKKyAgLS1kaXNhYmxlLXhmcyAgICAgICAgICAgZGlzYWJsZSBTR0kgWEZTIHN1cHBvcnQgaW4gU3RhZ2UgMgorICAtLWRpc2FibGUtaXNvOTY2MCAgICAgICBkaXNhYmxlIElTTzk2NjAgc3VwcG9ydCBpbiBTdGFnZSAyCisgIC0tZGlzYWJsZS1ndW56aXAgICAgICAgIGRpc2FibGUgZGVjb21wcmVzc2lvbiBpbiBTdGFnZSAyCisgIC0tZGlzYWJsZS1tZDUtcGFzc3dvcmQgIGRpc2FibGUgTUQ1IHBhc3N3b3JkIHN1cHBvcnQgaW4gU3RhZ2UgMgorICAtLWRpc2FibGUtcGFja2V0LXJldHJhbnNtaXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cm4gb2ZmIHBhY2tldCByZXRyYW5zbWlzc2lvbgorICAtLWVuYWJsZS1wY2ktZGlyZWN0ICAgICBhY2Nlc3MgUENJIGRpcmVjdGx5IGluc3RlYWQgb2YgdXNpbmcgQklPUworICAtLWVuYWJsZS0zYzUwOSAgICAgICAgICBlbmFibGUgM0NvbTUwOSBkcml2ZXIKKyAgLS1lbmFibGUtM2M1MjkgICAgICAgICAgZW5hYmxlIDNDb201MjkgZHJpdmVyCisgIC0tZW5hYmxlLTNjNTk1ICAgICAgICAgIGVuYWJsZSAzQ29tNTk1IGRyaXZlcgorICAtLWVuYWJsZS0zYzkweCAgICAgICAgICBlbmFibGUgM0NvbTkweCBkcml2ZXIKKyAgLS1lbmFibGUtY3M4OXgwICAgICAgICAgZW5hYmxlIENTODl4MCBkcml2ZXIKKyAgLS1lbmFibGUtZGF2aWNvbSAgICAgICAgZW5hYmxlIERhdmljb20gZHJpdmVyCisgIC0tZW5hYmxlLWRlcGNhICAgICAgICAgIGVuYWJsZSBERVBDQSBhbmQgRXRoZXJXT1JLUyBkcml2ZXIKKyAgLS1lbmFibGUtZWVwcm8gICAgICAgICAgZW5hYmxlIEV0aGVyZXhwcmVzcyBQcm8vMTAgZHJpdmVyCisgIC0tZW5hYmxlLWVlcHJvMTAwICAgICAgIGVuYWJsZSBFdGhlcmV4cHJlc3MgUHJvLzEwMCBkcml2ZXIKKyAgLS1lbmFibGUtZXBpYzEwMCAgICAgICAgZW5hYmxlIFNNQyA4M2MxNzAgRVBJQy8xMDAgZHJpdmVyCisgIC0tZW5hYmxlLTNjNTA3ICAgICAgICAgIGVuYWJsZSAzQ29tNTA3IGRyaXZlcgorICAtLWVuYWJsZS1leG9zMjA1ICAgICAgICBlbmFibGUgRVhPUzIwNSBkcml2ZXIKKyAgLS1lbmFibGUtbmk1MjEwICAgICAgICAgZW5hYmxlIFJhY2FsLUludGVybGFuIE5JNTIxMCBkcml2ZXIKKyAgLS1lbmFibGUtbGFuY2UgICAgICAgICAgZW5hYmxlIExhbmNlIFBDSSBQQ05ldC8zMiBkcml2ZXIKKyAgLS1lbmFibGUtbmUyMTAwICAgICAgICAgZW5hYmxlIE5vdmVsbCBORTIxMDAgZHJpdmVyCisgIC0tZW5hYmxlLW5pNjUxMCAgICAgICAgIGVuYWJsZSBSYWNhbC1JbnRlcmxhbiBOSTY1MTAgZHJpdmVyCisgIC0tZW5hYmxlLW5hdHNlbWkgICAgICAgIGVuYWJsZSBOYXRTZW1pIERQODM4MXggZHJpdmVyCisgIC0tZW5hYmxlLW5pNTAxMCAgICAgICAgIGVuYWJsZSBSYWNhbC1JbnRlcmxhbiBOSTUwMTAgZHJpdmVyCisgIC0tZW5hYmxlLTNjNTAzICAgICAgICAgIGVuYWJsZSAzQ29tNTAzIGRyaXZlcgorICAtLWVuYWJsZS1uZSAgICAgICAgICAgICBlbmFibGUgTkUxMDAwLzIwMDAgSVNBIGRyaXZlcgorICAtLWVuYWJsZS1uczgzOTAgICAgICAgICBlbmFibGUgTkUyMDAwIFBDSSBkcml2ZXIKKyAgLS1lbmFibGUtd2QgICAgICAgICAgICAgZW5hYmxlIFdEODAwMy84MDEzLCBTTUM4MjE2Lzg0MTYgZHJpdmVyCisgIC0tZW5hYmxlLW90dWxpcCAgICAgICAgIGVuYWJsZSBvbGQgVHVsaXAgZHJpdmVyCisgIC0tZW5hYmxlLXJ0bDgxMzkgICAgICAgIGVuYWJsZSBSZWFsdGVrIDgxMzkgZHJpdmVyCisgIC0tZW5hYmxlLXNpczkwMCAgICAgICAgIGVuYWJsZSBTSVMgOTAwIGFuZCBTSVMgNzAxNiBkcml2ZXIKKyAgLS1lbmFibGUtc2stZzE2ICAgICAgICAgZW5hYmxlIFNjaG5laWRlciBhbmQgS29jaCBHMTYgZHJpdmVyCisgIC0tZW5hYmxlLXNtYzkwMDAgICAgICAgIGVuYWJsZSBTTUM5MDAwIGRyaXZlcgorICAtLWVuYWJsZS10aWFyYSAgICAgICAgICBlbmFibGUgVGlhcmEgZHJpdmVyCisgIC0tZW5hYmxlLXR1bGlwICAgICAgICAgIGVuYWJsZSBUdWxpcCBkcml2ZXIKKyAgLS1lbmFibGUtdmlhLXJoaW5lICAgICAgZW5hYmxlIFJoaW5lLUkvSUkgZHJpdmVyCisgIC0tZW5hYmxlLXc4OWM4NDAgICAgICAgIGVuYWJsZSBXaW5ib25kIFc4OWM4NDAsIENvbXBleCBSTDEwMC1BVFggZHJpdmVyCisgIC0tZW5hYmxlLTNjNTAzLXNobWVtICAgIHVzZSAzYzUwMyBzaGFyZWQgbWVtb3J5IG1vZGUKKyAgLS1lbmFibGUtM2M1MDMtYXVpICAgICAgdXNlIEFVSSBieSBkZWZhdWx0IG9uIDNjNTAzIGNhcmRzCisgIC0tZW5hYmxlLWNvbXBleC1ybDIwMDAtZml4CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhpcyBpZiB5b3UgaGF2ZSBhIENvbXBleCBSTDIwMDAgUENJCisgIC0tZW5hYmxlLXNtYzkwMDAtc2Nhbj1MSVNUCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JlIGZvciBTTUM5MDAwIEkvTyBhZGRyZXNzZXMgdXNpbmcgTElTVAorICAtLWVuYWJsZS1uZS1zY2FuPUxJU1QgICBwcm9iZSBmb3IgTkUgYmFzZSBhZGRyZXNzIHVzaW5nIExJU1QKKyAgLS1lbmFibGUtd2QtZGVmYXVsdC1tZW09TUVNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0aGUgZGVmYXVsdCBtZW1vcnkgbG9jYXRpb24gZm9yIFdEL1NNQworICAtLWVuYWJsZS1jcy1zY2FuPUxJU1QgICBwcm9iZSBmb3IgQ1M4OXgwIGJhc2UgYWRkcmVzcyB1c2luZyBMSVNUCisgIC0tZW5hYmxlLWRpc2tsZXNzICAgICAgIGVuYWJsZSBkaXNrbGVzcyBzdXBwb3J0CisgIC0tZGlzYWJsZS1oZXJjdWxlcyAgICAgIGRpc2FibGUgaGVyY3VsZXMgdGVybWluYWwgc3VwcG9ydAorICAtLWRpc2FibGUtc2VyaWFsICAgICAgICBkaXNhYmxlIHNlcmlhbCB0ZXJtaW5hbCBzdXBwb3J0CisgIC0tZW5hYmxlLXNlcmlhbC1zcGVlZC1zaW11bGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbXVsYXRlIHRoZSBzbG93bmVzcyBvZiBhIHNlcmlhbCBkZXZpY2UKKyAgLS1lbmFibGUtcHJlc2V0LW1lbnU9RklMRQorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZXQgYSBtZW51IGZpbGUgRklMRSBpbiBTdGFnZSAyCisgIC0tZW5hYmxlLWV4YW1wbGUta2VybmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkIHRoZSBleGFtcGxlIE11bHRpYm9vdCBrZXJuZWwKKyAgLS1kaXNhYmxlLWF1dG8tbGludXgtbWVtLW9wdAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb24ndCBwYXNzIExpbnV4IG1lbT0gb3B0aW9uIGF1dG9tYXRpY2FsbHkKKworT3B0aW9uYWwgUGFja2FnZXM6CisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0td2l0aC1iaW51dGlscz1ESVIgICAgIHNlYXJjaCB0aGUgZGlyZWN0b3J5IERJUiB0byBmaW5kIGJpbnV0aWxzCisgIC0td2l0aG91dC1jdXJzZXMgICAgICAgIGRvIG5vdCB1c2UgY3Vyc2VzCisKK1NvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOgorICBDQyAgICAgICAgICBDIGNvbXBpbGVyIGNvbW1hbmQKKyAgQ0ZMQUdTICAgICAgQyBjb21waWxlciBmbGFncworICBMREZMQUdTICAgICBsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKKyAgICAgICAgICAgICAgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxsaWIgZGlyPgorICBDUFBGTEFHUyAgICBDL0MrKyBwcmVwcm9jZXNzb3IgZmxhZ3MsIGUuZy4gLUk8aW5jbHVkZSBkaXI+IGlmIHlvdSBoYXZlCisgICAgICAgICAgICAgIGhlYWRlcnMgaW4gYSBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGluY2x1ZGUgZGlyPgorICBDUFAgICAgICAgICBDIHByZXByb2Nlc3NvcgorCitVc2UgdGhlc2UgdmFyaWFibGVzIHRvIG92ZXJyaWRlIHRoZSBjaG9pY2VzIG1hZGUgYnkgYGNvbmZpZ3VyZScgb3IgdG8gaGVscAoraXQgdG8gZmluZCBsaWJyYXJpZXMgYW5kIHByb2dyYW1zIHdpdGggbm9uc3RhbmRhcmQgbmFtZXMvbG9jYXRpb25zLgorCitSZXBvcnQgYnVncyB0byA8YnVnLWdydWJAZ251Lm9yZz4uCitfQUNFT0YKK2ZpCisKK2lmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gInJlY3Vyc2l2ZSI7IHRoZW4KKyAgIyBJZiB0aGVyZSBhcmUgc3ViZGlycywgcmVwb3J0IHRoZWlyIHNwZWNpZmljIC0taGVscC4KKyAgYWNfcG9wZGlyPWBwd2RgCisgIGZvciBhY19kaXIgaW4gOiAkYWNfc3ViZGlyc19hbGw7IGRvIHRlc3QgIngkYWNfZGlyIiA9IHg6ICYmIGNvbnRpbnVlCisgICAgdGVzdCAtZCAkYWNfZGlyIHx8IGNvbnRpbnVlCisgICAgYWNfYnVpbGRkaXI9LgorCitpZiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgIGFjX2Rpcl9zdWZmaXg9L2BlY2hvICIkYWNfZGlyIiB8IHNlZCAncyxeXC5bXFwvXSwsJ2AKKyAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgYWNfdG9wX2J1aWxkZGlyPWBlY2hvICIkYWNfZGlyX3N1ZmZpeCIgfCBzZWQgJ3MsL1teXFwvXSosLi4vLGcnYAorZWxzZQorICBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXI9CitmaQorCitjYXNlICRzcmNkaXIgaW4KKyAgLikgICMgTm8gLS1zcmNkaXIgb3B0aW9uLiAgV2UgYXJlIGJ1aWxkaW5nIGluIHBsYWNlLgorICAgIGFjX3NyY2Rpcj0uCisgICAgaWYgdGVzdCAteiAiJGFjX3RvcF9idWlsZGRpciI7IHRoZW4KKyAgICAgICBhY190b3Bfc3JjZGlyPS4KKyAgICBlbHNlCisgICAgICAgYWNfdG9wX3NyY2Rpcj1gZWNobyAkYWNfdG9wX2J1aWxkZGlyIHwgc2VkICdzLC8kLCwnYAorICAgIGZpIDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgcGF0aC4KKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpciA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgYWNfc3JjZGlyPSRhY190b3BfYnVpbGRkaXIkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXIkc3JjZGlyIDs7Citlc2FjCisKKyMgRG8gbm90IHVzZSBgY2QgZm9vICYmIHB3ZGAgdG8gY29tcHV0ZSBhYnNvbHV0ZSBwYXRocywgYmVjYXVzZQorIyB0aGUgZGlyZWN0b3JpZXMgbWF5IG5vdCBleGlzdC4KK2Nhc2UgYHB3ZGAgaW4KKy4pIGFjX2Fic19idWlsZGRpcj0iJGFjX2RpciI7OworKikKKyAgY2FzZSAiJGFjX2RpciIgaW4KKyAgLikgYWNfYWJzX2J1aWxkZGlyPWBwd2RgOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfYnVpbGRkaXI9IiRhY19kaXIiOzsKKyAgKikgYWNfYWJzX2J1aWxkZGlyPWBwd2RgLyIkYWNfZGlyIjs7CisgIGVzYWM7OworZXNhYworY2FzZSAkYWNfYWJzX2J1aWxkZGlyIGluCisuKSBhY19hYnNfdG9wX2J1aWxkZGlyPSR7YWNfdG9wX2J1aWxkZGlyfS47OworKikKKyAgY2FzZSAke2FjX3RvcF9idWlsZGRpcn0uIGluCisgIC4pIGFjX2Fic190b3BfYnVpbGRkaXI9JGFjX2Fic19idWlsZGRpcjs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3RvcF9idWlsZGRpcj0ke2FjX3RvcF9idWlsZGRpcn0uOzsKKyAgKikgYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfYWJzX2J1aWxkZGlyLyR7YWNfdG9wX2J1aWxkZGlyfS47OworICBlc2FjOzsKK2VzYWMKK2Nhc2UgJGFjX2Fic19idWlsZGRpciBpbgorLikgYWNfYWJzX3NyY2Rpcj0kYWNfc3JjZGlyOzsKKyopCisgIGNhc2UgJGFjX3NyY2RpciBpbgorICAuKSBhY19hYnNfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXI7OworICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic19zcmNkaXI9JGFjX3NyY2Rpcjs7CisgICopIGFjX2Fic19zcmNkaXI9JGFjX2Fic19idWlsZGRpci8kYWNfc3JjZGlyOzsKKyAgZXNhYzs7Citlc2FjCitjYXNlICRhY19hYnNfYnVpbGRkaXIgaW4KKy4pIGFjX2Fic190b3Bfc3JjZGlyPSRhY190b3Bfc3JjZGlyOzsKKyopCisgIGNhc2UgJGFjX3RvcF9zcmNkaXIgaW4KKyAgLikgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX2Fic19idWlsZGRpcjs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3RvcF9zcmNkaXI7OworICAqKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyLyRhY190b3Bfc3JjZGlyOzsKKyAgZXNhYzs7Citlc2FjCisKKyAgICBjZCAkYWNfZGlyCisgICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmU7IG90aGVyd2lzZSBnZXQgQ3lnbnVzIHN0eWxlIGNvbmZpZ3VyZS4KKyAgICBpZiB0ZXN0IC1mICRhY19zcmNkaXIvY29uZmlndXJlLmdudTsgdGhlbgorICAgICAgZWNobworICAgICAgJFNIRUxMICRhY19zcmNkaXIvY29uZmlndXJlLmdudSAgLS1oZWxwPXJlY3Vyc2l2ZQorICAgIGVsaWYgdGVzdCAtZiAkYWNfc3JjZGlyL2NvbmZpZ3VyZTsgdGhlbgorICAgICAgZWNobworICAgICAgJFNIRUxMICRhY19zcmNkaXIvY29uZmlndXJlICAtLWhlbHA9cmVjdXJzaXZlCisgICAgZWxpZiB0ZXN0IC1mICRhY19zcmNkaXIvY29uZmlndXJlLmFjIHx8CisJICAgdGVzdCAtZiAkYWNfc3JjZGlyL2NvbmZpZ3VyZS5pbjsgdGhlbgorICAgICAgZWNobworICAgICAgJGFjX2NvbmZpZ3VyZSAtLWhlbHAKKyAgICBlbHNlCisgICAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2RpciIgPiYyCisgICAgZmkKKyAgICBjZCAkYWNfcG9wZGlyCisgIGRvbmUKK2ZpCisKK3Rlc3QgLW4gIiRhY19pbml0X2hlbHAiICYmIGV4aXQgMAoraWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgorICBjYXQgPDxcX0FDRU9GCitHUlVCIGNvbmZpZ3VyZSAwLjk3CitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNTkKKworQ29weXJpZ2h0IChDKSAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KK2dpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KK19BQ0VPRgorICBleGl0IDAKK2ZpCitleGVjIDU+Y29uZmlnLmxvZworY2F0ID4mNSA8PF9BQ0VPRgorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisKK0l0IHdhcyBjcmVhdGVkIGJ5IEdSVUIgJGFzX21lIDAuOTcsIHdoaWNoIHdhcworZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjU5LiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCisKKyAgJCAkMCAkQAorCitfQUNFT0YKK3sKK2NhdCA8PF9BU1VOQU1FCisjIyAtLS0tLS0tLS0gIyMKKyMjIFBsYXRmb3JtLiAjIworIyMgLS0tLS0tLS0tICMjCisKK2hvc3RuYW1lID0gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisvYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGwgICAgIHx8IGVjaG8gdW5rbm93bmAKKworL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbCAgICAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAoraG9zdGluZm8gICAgICAgICAgICAgICA9IGAoaG9zdGluZm8pIDI+L2Rldi9udWxsICAgICAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi9tYWNoaW5lICAgICAgICAgICA9IGAoL2Jpbi9tYWNoaW5lKSAyPi9kZXYvbnVsbCAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGwgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorCitfQVNVTkFNRQorCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGVjaG8gIlBBVEg6ICRhc19kaXIiCitkb25lCisKK30gPiY1CisKK2NhdCA+JjUgPDxfQUNFT0YKKworCisjIyAtLS0tLS0tLS0tLSAjIworIyMgQ29yZSB0ZXN0cy4gIyMKKyMjIC0tLS0tLS0tLS0tICMjCisKK19BQ0VPRgorCisKKyMgS2VlcCBhIHRyYWNlIG9mIHRoZSBjb21tYW5kIGxpbmUuCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgU3RyaXAgb3V0IC0tc2lsZW50IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNvcmQgaXQgZm9yIGZ1dHVyZSBydW5zLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YS1jaGFyYWN0ZXJzLgorIyBNYWtlIHR3byBwYXNzZXMgdG8gYWxsb3cgZm9yIHByb3BlciBkdXBsaWNhdGUtYXJndW1lbnQgc3VwcHJlc3Npb24uCithY19jb25maWd1cmVfYXJncz0KK2FjX2NvbmZpZ3VyZV9hcmdzMD0KK2FjX2NvbmZpZ3VyZV9hcmdzMT0KK2FjX3NlcD0KK2FjX211c3Rfa2VlcF9uZXh0PWZhbHNlCitmb3IgYWNfcGFzcyBpbiAxIDIKK2RvCisgIGZvciBhY19hcmcKKyAgZG8KKyAgICBjYXNlICRhY19hcmcgaW4KKyAgICAtbm8tY3JlYXRlIHwgLS1uby1jKiB8IC1uIHwgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tciopIGNvbnRpbnVlIDs7CisgICAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICAgIGNvbnRpbnVlIDs7CisgICAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9cIlwnXSopCisgICAgICBhY19hcmc9YGVjaG8gIiRhY19hcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgZXNhYworICAgIGNhc2UgJGFjX3Bhc3MgaW4KKyAgICAxKSBhY19jb25maWd1cmVfYXJnczA9IiRhY19jb25maWd1cmVfYXJnczAgJyRhY19hcmcnIiA7OworICAgIDIpCisgICAgICBhY19jb25maWd1cmVfYXJnczE9IiRhY19jb25maWd1cmVfYXJnczEgJyRhY19hcmcnIgorICAgICAgaWYgdGVzdCAkYWNfbXVzdF9rZWVwX25leHQgPSB0cnVlOyB0aGVuCisJYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UgIyBHb3QgdmFsdWUsIGJhY2sgdG8gbm9ybWFsLgorICAgICAgZWxzZQorCWNhc2UgJGFjX2FyZyBpbgorCSAgKj0qIHwgLS1jb25maWctY2FjaGUgfCAtQyB8IC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKiBcCisJICB8IC1lbmFibGUtKiB8IC0tZW5hYmxlLSogfCAtZ2FzIHwgLS1nKiB8IC1uZnAgfCAtLW5mKiBcCisJICB8IC1xIHwgLXF1aWV0IHwgLS1xKiB8IC1zaWxlbnQgfCAtLXNpbCogfCAtdiB8IC12ZXJiKiBcCisJICB8IC13aXRoLSogfCAtLXdpdGgtKiB8IC13aXRob3V0LSogfCAtLXdpdGhvdXQtKiB8IC0teCkKKwkgICAgY2FzZSAiJGFjX2NvbmZpZ3VyZV9hcmdzMCAiIGluCisJICAgICAgIiRhY19jb25maWd1cmVfYXJnczEiKiIgJyRhY19hcmcnICIqICkgY29udGludWUgOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgLSogKSBhY19tdXN0X2tlZXBfbmV4dD10cnVlIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MkYWNfc2VwJyRhY19hcmcnIgorICAgICAgIyBHZXQgcmlkIG9mIHRoZSBsZWFkaW5nIHNwYWNlLgorICAgICAgYWNfc2VwPSIgIgorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKK2RvbmUKKyRhc191bnNldCBhY19jb25maWd1cmVfYXJnczAgfHwgdGVzdCAiJHthY19jb25maWd1cmVfYXJnczArc2V0fSIgIT0gc2V0IHx8IHsgYWNfY29uZmlndXJlX2FyZ3MwPTsgZXhwb3J0IGFjX2NvbmZpZ3VyZV9hcmdzMDsgfQorJGFzX3Vuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMSB8fCB0ZXN0ICIke2FjX2NvbmZpZ3VyZV9hcmdzMStzZXR9IiAhPSBzZXQgfHwgeyBhY19jb25maWd1cmVfYXJnczE9OyBleHBvcnQgYWNfY29uZmlndXJlX2FyZ3MxOyB9CisKKyMgV2hlbiBpbnRlcnJ1cHRlZCBvciBleGl0J2QsIGNsZWFudXAgdGVtcG9yYXJ5IGZpbGVzLCBhbmQgY29tcGxldGUKKyMgY29uZmlnLmxvZy4gIFdlIHJlbW92ZSBjb21tZW50cyBiZWNhdXNlIGFueXdheSB0aGUgcXVvdGVzIGluIHRoZXJlCisjIHdvdWxkIGNhdXNlIHByb2JsZW1zIG9yIGxvb2sgdWdseS4KKyMgV0FSTklORzogQmUgc3VyZSBub3QgdG8gdXNlIHNpbmdsZSBxdW90ZXMgaW4gdGhlcmUsIGFzIHNvbWUgc2hlbGxzLAorIyBzdWNoIGFzIG91ciBEVSA1LjAgZnJpZW5kLCB3aWxsIHRoZW4gYGNsb3NlJyB0aGUgdHJhcC4KK3RyYXAgJ2V4aXRfc3RhdHVzPSQ/CisgICMgU2F2ZSBpbnRvIGNvbmZpZy5sb2cgc29tZSBpbmZvcm1hdGlvbiB0aGF0IG1pZ2h0IGhlbHAgaW4gZGVidWdnaW5nLgorICB7CisgICAgZWNobworCisgICAgY2F0IDw8XF9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgQ2FjaGUgdmFyaWFibGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLSAjIworX0FTQk9YCisgICAgZWNobworICAgICMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCit7CisgIChzZXQpIDI+JjEgfAorICAgIGNhc2UgYChhY19zcGFjZT0nIiciJyAnIiciJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KKyAgICAqYWNfc3BhY2U9XCAqKQorICAgICAgc2VkIC1uIFwKKwkicy8nIiciJy8nIiciJ1xcXFwnIiciJyciJyInL2c7CisJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSciJyInXFwyJyInIicvcCIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIHNlZCAtbiBcCisJInMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9XFwyL3AiCisgICAgICA7OworICAgIGVzYWM7Cit9CisgICAgZWNobworCisgICAgY2F0IDw8XF9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE91dHB1dCB2YXJpYWJsZXMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLSAjIworX0FTQk9YCisgICAgZWNobworICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X3ZhcnMKKyAgICBkbworICAgICAgZXZhbCBhY192YWw9JGBlY2hvICRhY192YXJgCisgICAgICBlY2hvICIkYWNfdmFyPSciJyInJGFjX3ZhbCciJyInIgorICAgIGRvbmUgfCBzb3J0CisgICAgZWNobworCisgICAgaWYgdGVzdCAtbiAiJGFjX3N1YnN0X2ZpbGVzIjsgdGhlbgorICAgICAgY2F0IDw8XF9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLSAjIworIyMgT3V0cHV0IGZpbGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLSAjIworX0FTQk9YCisgICAgICBlY2hvCisgICAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF9maWxlcworICAgICAgZG8KKwlldmFsIGFjX3ZhbD0kYGVjaG8gJGFjX3ZhcmAKKwllY2hvICIkYWNfdmFyPSciJyInJGFjX3ZhbCciJyInIgorICAgICAgZG9uZSB8IHNvcnQKKyAgICAgIGVjaG8KKyAgICBmaQorCisgICAgaWYgdGVzdCAtcyBjb25mZGVmcy5oOyB0aGVuCisgICAgICBjYXQgPDxcX0FTQk9YCisjIyAtLS0tLS0tLS0tLSAjIworIyMgY29uZmRlZnMuaC4gIyMKKyMjIC0tLS0tLS0tLS0tICMjCitfQVNCT1gKKyAgICAgIGVjaG8KKyAgICAgIHNlZCAiL14kL2QiIGNvbmZkZWZzLmggfCBzb3J0CisgICAgICBlY2hvCisgICAgZmkKKyAgICB0ZXN0ICIkYWNfc2lnbmFsIiAhPSAwICYmCisgICAgICBlY2hvICIkYXNfbWU6IGNhdWdodCBzaWduYWwgJGFjX3NpZ25hbCIKKyAgICBlY2hvICIkYXNfbWU6IGV4aXQgJGV4aXRfc3RhdHVzIgorICB9ID4mNQorICBybSAtZiBjb3JlICouY29yZSAmJgorICBybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzKiBjb25mJCQqICRhY19jbGVhbl9maWxlcyAmJgorICAgIGV4aXQgJGV4aXRfc3RhdHVzCisgICAgICcgMAorZm9yIGFjX3NpZ25hbCBpbiAxIDIgMTMgMTU7IGRvCisgIHRyYXAgJ2FjX3NpZ25hbD0nJGFjX3NpZ25hbCc7IHsgKGV4aXQgMSk7IGV4aXQgMTsgfScgJGFjX3NpZ25hbAorZG9uZQorYWNfc2lnbmFsPTAKKworIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KK3JtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAorIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCitlY2hvID5jb25mZGVmcy5oCisKKyMgUHJlZGVmaW5lZCBwcmVwcm9jZXNzb3IgdmFyaWFibGVzLgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiJFBBQ0tBR0VfTkFNRSIKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICIkUEFDS0FHRV9UQVJOQU1FIgorX0FDRU9GCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIiRQQUNLQUdFX1ZFUlNJT04iCitfQUNFT0YKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIkUEFDS0FHRV9TVFJJTkciCitfQUNFT0YKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICIkUEFDS0FHRV9CVUdSRVBPUlQiCitfQUNFT0YKKworCisjIExldCB0aGUgc2l0ZSBmaWxlIHNlbGVjdCBhbiBhbHRlcm5hdGUgY2FjaGUgZmlsZSBpZiBpdCB3YW50cyB0by4KKyMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCitpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCisgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBlbHNlCisgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBmaQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbworICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY2O30KKyAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKKyAgICAuICIkYWNfc2l0ZV9maWxlIgorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwKKyAgIyBmaWxlcyBhY3R1YWxseSksIHNvIHdlIGF2b2lkIGRvaW5nIHRoYXQuCisgIGlmIHRlc3QgLWYgIiRjYWNoZV9maWxlIjsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4KKyAgICAgIFtcXC9dKiB8ID86W1xcL10qICkgLiAkY2FjaGVfZmlsZTs7CisgICAgICAqKSAgICAgICAgICAgICAgICAgICAgICAuIC4vJGNhY2hlX2ZpbGU7OworICAgIGVzYWMKKyAgZmkKK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgPiRjYWNoZV9maWxlCitmaQorCisjIENoZWNrIHRoYXQgdGhlIHByZWNpb3VzIHZhcmlhYmxlcyBzYXZlZCBpbiB0aGUgY2FjaGUgaGF2ZSBrZXB0IHRoZSBzYW1lCisjIHZhbHVlLgorYWNfY2FjaGVfY29ycnVwdGVkPWZhbHNlCitmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwKKwkgICAgICAgc2VkIC1uICdzL15hY19lbnZfXChbYS16QS1aXzAtOV0qXClfc2V0PS4qL1wxL3AnYDsgZG8KKyAgZXZhbCBhY19vbGRfc2V0PVwkYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQKKyAgZXZhbCBhY19uZXdfc2V0PVwkYWNfZW52XyR7YWNfdmFyfV9zZXQKKyAgZXZhbCBhY19vbGRfdmFsPSJcJGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWUiCisgIGV2YWwgYWNfbmV3X3ZhbD0iXCRhY19lbnZfJHthY192YXJ9X3ZhbHVlIgorICBjYXNlICRhY19vbGRfc2V0LCRhY19uZXdfc2V0IGluCisgICAgc2V0LCkKKyAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KKyAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7CisgICAgLHNldCkKKyAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgbm90IHNldCBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQorICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKKyAgICAsKTs7CisgICAgKikKKyAgICAgIGlmIHRlc3QgIngkYWNfb2xkX3ZhbCIgIT0gIngkYWNfbmV3X3ZhbCI7IHRoZW4KKwl7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjI7fQorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86ICAgZm9ybWVyIHZhbHVlOiAgJGFjX29sZF92YWwiID4mNQorZWNobyAiJGFzX21lOiAgIGZvcm1lciB2YWx1ZTogICRhY19vbGRfdmFsIiA+JjI7fQorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86ICAgY3VycmVudCB2YWx1ZTogJGFjX25ld192YWwiID4mNQorZWNobyAiJGFzX21lOiAgIGN1cnJlbnQgdmFsdWU6ICRhY19uZXdfdmFsIiA+JjI7fQorCWFjX2NhY2hlX2NvcnJ1cHRlZD06CisgICAgICBmaTs7CisgIGVzYWMKKyAgIyBQYXNzIHByZWNpb3VzIHZhcmlhYmxlcyB0byBjb25maWcuc3RhdHVzLgorICBpZiB0ZXN0ICIkYWNfbmV3X3NldCIgPSBzZXQ7IHRoZW4KKyAgICBjYXNlICRhY19uZXdfdmFsIGluCisgICAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9cIlwnXSopCisgICAgICBhY19hcmc9JGFjX3Zhcj1gZWNobyAiJGFjX25ld192YWwiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgKikgYWNfYXJnPSRhY192YXI9JGFjX25ld192YWwgOzsKKyAgICBlc2FjCisgICAgY2FzZSAiICRhY19jb25maWd1cmVfYXJncyAiIGluCisgICAgICAqIiAnJGFjX2FyZycgIiopIDs7ICMgQXZvaWQgZHVwcy4gIFVzZSBvZiBxdW90ZXMgZW5zdXJlcyBhY2N1cmFjeS4KKyAgICAgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworICAgIGVzYWMKKyAgZmkKK2RvbmUKK2lmICRhY19jYWNoZV9jb3JydXB0ZWQ7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mMjt9CisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogcnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisgICAgICAgICAgYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyBjb25maWcuaCIKKworYW1fX2FwaV92ZXJzaW9uPSIxLjkiCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KKyAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL3NodG9vbDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL3NodG9vbCBpbnN0YWxsIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKK2FjX2NvbmZpZ19ndWVzcz0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyIKK2FjX2NvbmZpZ19zdWI9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIgorYWNfY29uZmlndXJlPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlndXJlIiAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCisKKyMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAorIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCisjIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKKyMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCisjIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKKyMgSVJJWCAvc2Jpbi9pbnN0YWxsCisjIEFJWCAvYmluL2luc3RhbGwKKyMgQW1pZ2FPUyAvQy9pbnN0YWxsLCB3aGljaCBpbnN0YWxscyBib290YmxvY2tzIG9uIGZsb3BweSBkaXNjcworIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyBPUy8yJ3Mgc3lzdGVtIGluc3RhbGwsIHdoaWNoIGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgoraWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KK2Nhc2UgJGFzX2Rpci8gaW4KKyAgLi8gfCAuLy8gfCAvY0MvKiB8IFwKKyAgL2V0Yy8qIHwgL3Vzci9zYmluLyogfCAvdXNyL2V0Yy8qIHwgL3NiaW4vKiB8IC91c3IvYWZzd3MvYmluLyogfCBcCisgID86XFwvb3MyXFwvaW5zdGFsbFxcLyogfCA/OlxcL09TMlxcL0lOU1RBTExcXC8qIHwgXAorICAvdXNyL3VjYi8qICkgOzsKKyAgKikKKyAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAorICAgICMgYnkgZGVmYXVsdC4KKyAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKwlpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IjsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKwkgICAgZ3JlcCBkc3Btc2cgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCisJICAgIDoKKwkgIGVsaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKwkgICAgZ3JlcCBwd3BsdXMgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIHByb2dyYW0tc3BlY2lmaWMgaW5zdGFsbCBzY3JpcHQgdXNlZCBieSBIUCBwd3BsdXMtLWRvbid0IHVzZS4KKwkgICAgOgorCSAgZWxzZQorCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCisJICAgIGJyZWFrIDMKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICBkb25lCisgICAgOzsKK2VzYWMKK2RvbmUKKworCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9JGFjX2N2X3BhdGhfaW5zdGFsbAorICBlbHNlCisgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQorICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KKyAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCisgIGZpCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJElOU1RBTEwiID4mNQorZWNobyAiJHtFQ0hPX1R9JElOU1RBTEwiID4mNgorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLi4uICRFQ0hPX0MiID4mNgorIyBKdXN0IGluIGNhc2UKK3NsZWVwIDEKK2VjaG8gdGltZXN0YW1wID4gY29uZnRlc3QuZmlsZQorIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncworIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCisjIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCisjIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZworIyBkaXJlY3RvcnkpLgoraWYgKAorICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIDI+IC9kZXYvbnVsbGAKKyAgIGlmIHRlc3QgIiQqIiA9ICJYIjsgdGhlbgorICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KKyAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlYAorICAgZmkKKyAgIHJtIC1mIGNvbmZ0ZXN0LmZpbGUKKyAgIGlmIHRlc3QgIiQqIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdC5maWxlIiBcCisgICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3QuZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKworICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgorICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQorICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQorICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgorICAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgorYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCithbGlhcyBpbiB5b3VyIGVudmlyb25tZW50IiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICBmaQorCisgICB0ZXN0ICIkMiIgPSBjb25mdGVzdC5maWxlCisgICApCit0aGVuCisgICAjIE9rLgorICAgOgorZWxzZQorICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCitDaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKK0NoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2Cit0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCRwcm9ncmFtX3ByZWZpeCw7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisjIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KK3Rlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkLCRwcm9ncmFtX3N1ZmZpeCw7JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCisjIEJ5IGRlZmF1bHQgd2FzIGBzLHgseCcsIHJlbW92ZSBpdCBpZiB1c2VsZXNzLgorY2F0IDw8XF9BQ0VPRiA+Y29uZnRlc3Quc2VkCitzL1tcXCRdLyYmL2c7cy87cyx4LHgsJC8vCitfQUNFT0YKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9YGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWUgfCBzZWQgLWYgY29uZnRlc3Quc2VkYAorcm0gY29uZnRlc3Quc2VkCisKKyMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuIGFic29sdXRlIHBhdGgKK2FtX2F1eF9kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKKwordGVzdCB4IiR7TUlTU0lORytzZXR9IiA9IHhzZXQgfHwgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciCisjIFVzZSBldmFsIHRvIGV4cGFuZCAkU0hFTEwKK2lmIGV2YWwgIiRNSVNTSU5HIC0tcnVuIHRydWUiOyB0aGVuCisgIGFtX21pc3NpbmdfcnVuPSIkTUlTU0lORyAtLXJ1biAiCitlbHNlCisgIGFtX21pc3NpbmdfcnVuPQorICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBcYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBcYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmciID4mMjt9CitmaQorCitpZiBta2RpciAtcCAtLXZlcnNpb24gLiA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAhIC1kIC4vLS12ZXJzaW9uOyB0aGVuCisgICMgV2UgdXNlZCB0byBrZWVwaW5nIHRoZSBgLicgYXMgZmlyc3QgYXJndW1lbnQsIGluIG9yZGVyIHRvCisgICMgYWxsb3cgJChta2Rpcl9wKSB0byBiZSB1c2VkIHdpdGhvdXQgYXJndW1lbnQuICBBcyBpbgorICAjICAgJChta2Rpcl9wKSAkKHNvbWVkaXIpCisgICMgd2hlcmUgJChzb21lZGlyKSBpcyBjb25kaXRpb25hbGx5IGRlZmluZWQuICBIb3dldmVyIHRoaXMgaXMgd3JvbmcKKyAgIyBmb3IgdHdvIHJlYXNvbnM6CisgICMgIDEuIGlmIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZCBieSBhIHVzZXIgd2hvIGNhbm5vdCB3cml0ZSBgLicKKyAgIyAgICAgbWFrZSBpbnN0YWxsIHdpbGwgZmFpbCwKKyAgIyAgMi4gdGhlIGFib3ZlIGNvbW1lbnQgc2hvdWxkIG1vc3QgY2VydGFpbmx5IHJlYWQKKyAgIyAgICAgJChta2Rpcl9wKSAkKERFU1RESVIpJChzb21lZGlyKQorICAjICAgICBzbyBpdCBkb2VzIG5vdCB3b3JrIHdoZW4gJChzb21lZGlyKSBpcyB1bmRlZmluZWQgYW5kCisgICMgICAgICQoREVTVERJUikgaXMgbm90LgorICAjICBUbyBzdXBwb3J0IHRoZSBsYXR0ZXIgY2FzZSwgd2UgaGF2ZSB0byB3cml0ZQorICAjICAgICB0ZXN0IC16ICIkKHNvbWVkaXIpIiB8fCAkKG1rZGlyX3ApICQoREVTVERJUikkKHNvbWVkaXIpLAorICAjICBzbyB0aGUgYC4nIHRyaWNrIGlzIHBvaW50bGVzcy4KKyAgbWtkaXJfcD0nbWtkaXIgLXAgLS0nCitlbHNlCisgICMgT24gTmV4dFN0ZXAgYW5kIE9wZW5TdGVwLCB0aGUgYG1rZGlyJyBjb21tYW5kIGRvZXMgbm90CisgICMgcmVjb2duaXplIGFueSBvcHRpb24uICBJdCB3aWxsIGludGVycHJldCBhbGwgb3B0aW9ucyBhcworICAjIGRpcmVjdG9yaWVzIHRvIGNyZWF0ZSwgYW5kIHRoZW4gYWJvcnQgYmVjYXVzZSBgLicgYWxyZWFkeQorICAjIGV4aXN0cy4KKyAgZm9yIGQgaW4gLi8tcCAuLy0tdmVyc2lvbjsKKyAgZG8KKyAgICB0ZXN0IC1kICRkICYmIHJtZGlyICRkCisgIGRvbmUKKyAgIyAkKG1raW5zdGFsbGRpcnMpIGlzIGRlZmluZWQgYnkgQXV0b21ha2UgaWYgbWtpbnN0YWxsZGlycyBleGlzdHMuCisgIGlmIHRlc3QgLWYgIiRhY19hdXhfZGlyL21raW5zdGFsbGRpcnMiOyB0aGVuCisgICAgbWtkaXJfcD0nJChta2luc3RhbGxkaXJzKScKKyAgZWxzZQorICAgIG1rZGlyX3A9JyQoaW5zdGFsbF9zaCkgLWQnCisgIGZpCitmaQorCitmb3IgYWNfcHJvZyBpbiBnYXdrIG1hd2sgbmF3ayBhd2sKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX0FXSytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQVdLIjsgdGhlbgorICBhY19jdl9wcm9nX0FXSz0iJEFXSyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfQVdLPSIkYWNfcHJvZyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK0FXSz0kYWNfY3ZfcHJvZ19BV0sKK2lmIHRlc3QgLW4gIiRBV0siOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRBV0siID4mNQorZWNobyAiJHtFQ0hPX1R9JEFXSyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgdGVzdCAtbiAiJEFXSyIgJiYgYnJlYWsKK2RvbmUKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCQoTUFLRSkiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpLi4uICRFQ0hPX0MiID4mNgorc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5LDouLystLF9fX3BfLCdgCitpZiBldmFsICJ0ZXN0IFwiXCR7YWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0K3NldH1cIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC5tYWtlIDw8XF9BQ0VPRgorYWxsOgorCUBlY2hvICdhY19tYWtldGVtcD0iJChNQUtFKSInCitfQUNFT0YKKyMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgorZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAoraWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgorICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKK2Vsc2UKKyAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5tYWtlCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2CisgIFNFVF9NQUtFPQorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CisgIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKK2ZpCisKK3JtIC1yZiAudHN0IDI+L2Rldi9udWxsCitta2RpciAudHN0IDI+L2Rldi9udWxsCitpZiB0ZXN0IC1kIC50c3Q7IHRoZW4KKyAgYW1fX2xlYWRpbmdfZG90PS4KK2Vsc2UKKyAgYW1fX2xlYWRpbmdfZG90PV8KK2ZpCitybWRpciAudHN0IDI+L2Rldi9udWxsCisKKyMgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAoraWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJgorICAgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biBcIm1ha2UgZGlzdGNsZWFuXCIgdGhlcmUgZmlyc3QiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biBcIm1ha2UgZGlzdGNsZWFuXCIgdGhlcmUgZmlyc3QiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKKyMgdGVzdCB3aGV0aGVyIHdlIGhhdmUgY3lncGF0aAoraWYgdGVzdCAteiAiJENZR1BBVEhfVyI7IHRoZW4KKyAgaWYgKGN5Z3BhdGggLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisgICAgQ1lHUEFUSF9XPSdjeWdwYXRoIC13JworICBlbHNlCisgICAgQ1lHUEFUSF9XPWVjaG8KKyAgZmkKK2ZpCisKKworIyBEZWZpbmUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYWNrYWdlLgorIFBBQ0tBR0U9J2dydWInCisgVkVSU0lPTj0nMC45NycKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgorX0FDRU9GCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBWRVJTSU9OICIkVkVSU0lPTiIKK19BQ0VPRgorCisjIFNvbWUgdG9vbHMgQXV0b21ha2UgbmVlZHMuCisKK0FDTE9DQUw9JHtBQ0xPQ0FMLSIke2FtX21pc3NpbmdfcnVufWFjbG9jYWwtJHthbV9fYXBpX3ZlcnNpb259In0KKworCitBVVRPQ09ORj0ke0FVVE9DT05GLSIke2FtX21pc3NpbmdfcnVufWF1dG9jb25mIn0KKworCitBVVRPTUFLRT0ke0FVVE9NQUtFLSIke2FtX21pc3NpbmdfcnVufWF1dG9tYWtlLSR7YW1fX2FwaV92ZXJzaW9ufSJ9CisKKworQVVUT0hFQURFUj0ke0FVVE9IRUFERVItIiR7YW1fbWlzc2luZ19ydW59YXV0b2hlYWRlciJ9CisKKworTUFLRUlORk89JHtNQUtFSU5GTy0iJHthbV9taXNzaW5nX3J1bn1tYWtlaW5mbyJ9CisKK2luc3RhbGxfc2g9JHtpbnN0YWxsX3NoLSIkYW1fYXV4X2Rpci9pbnN0YWxsLXNoIn0KKworIyBJbnN0YWxsZWQgYmluYXJpZXMgYXJlIHVzdWFsbHkgc3RyaXBwZWQgdXNpbmcgYHN0cmlwJyB3aGVuIHRoZSB1c2VyCisjIHJ1biBgbWFrZSBpbnN0YWxsLXN0cmlwJy4gIEhvd2V2ZXIgYHN0cmlwJyBtaWdodCBub3QgYmUgdGhlIHJpZ2h0CisjIHRvb2wgdG8gdXNlIGluIGNyb3NzLWNvbXBpbGF0aW9uIGVudmlyb25tZW50cywgdGhlcmVmb3JlIEF1dG9tYWtlCisjIHdpbGwgaG9ub3IgdGhlIGBTVFJJUCcgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gb3ZlcnJ1bGUgdGhpcyBwcm9ncmFtLgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0gbm87IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9c3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9c3RyaXA7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfU1RSSVArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgorICBhY19jdl9wcm9nX1NUUklQPSIkU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX1NUUklQPSIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKK2ZpCitmaQorU1RSSVA9JGFjX2N2X3Byb2dfU1RSSVAKK2lmIHRlc3QgLW4gIiRTVFJJUCI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJFNUUklQIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRTVFJJUCIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19TVFJJUCI7IHRoZW4KKyAgYWNfY3RfU1RSSVA9JFNUUklQCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAic3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHN0cmlwOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X1NUUklQK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9TVFJJUCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0iJGFjX2N0X1NUUklQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0ic3RyaXAiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19hY19jdF9TVFJJUCIgJiYgYWNfY3ZfcHJvZ19hY19jdF9TVFJJUD0iOiIKK2ZpCitmaQorYWNfY3RfU1RSSVA9JGFjX2N2X3Byb2dfYWNfY3RfU1RSSVAKK2lmIHRlc3QgLW4gIiRhY19jdF9TVFJJUCI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X1NUUklQIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdF9TVFJJUCIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgU1RSSVA9JGFjX2N0X1NUUklQCitlbHNlCisgIFNUUklQPSIkYWNfY3ZfcHJvZ19TVFJJUCIKK2ZpCisKK2ZpCitJTlNUQUxMX1NUUklQX1BST0dSQU09Ilwke1NIRUxMfSBcJChpbnN0YWxsX3NoKSAtYyAtcyIKKworIyBXZSBuZWVkIGF3ayBmb3IgdGhlICJjaGVjayIgdGFyZ2V0LiAgVGhlIHN5c3RlbSAiYXdrIiBpcyBiYWQgb24KKyMgc29tZSBwbGF0Zm9ybXMuCisjIEFsd2F5cyBkZWZpbmUgQU1UQVIgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisKK0FNVEFSPSR7QU1UQVItIiR7YW1fbWlzc2luZ19ydW59dGFyIn0KKworYW1fX3Rhcj0nJHtBTVRBUn0gY2hvZiAtICIkJHRhcmRpciInOyBhbV9fdW50YXI9JyR7QU1UQVJ9IHhmIC0nCisKKworCisKKworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCiskYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMSB8fAorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuICRhY19jb25maWdfc3ViIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gJGFjX2NvbmZpZ19zdWIiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X2J1aWxkK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2N2X2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwordGVzdCAteiAiJGFjX2N2X2J1aWxkX2FsaWFzIiAmJgorICBhY19jdl9idWlsZF9hbGlhcz1gJGFjX2NvbmZpZ19ndWVzc2AKK3Rlc3QgLXogIiRhY19jdl9idWlsZF9hbGlhcyIgJiYKKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBndWVzcyBidWlsZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorYWNfY3ZfYnVpbGQ9YCRhY19jb25maWdfc3ViICRhY19jdl9idWlsZF9hbGlhc2AgfHwKKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2J1aWxkX2FsaWFzIGZhaWxlZCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfYnVpbGRfYWxpYXMgZmFpbGVkIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfYnVpbGQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2J1aWxkIiA+JjYKK2J1aWxkPSRhY19jdl9idWlsZAorYnVpbGRfY3B1PWBlY2hvICRhY19jdl9idWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitidWlsZF92ZW5kb3I9YGVjaG8gJGFjX2N2X2J1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2J1aWxkX29zPWBlY2hvICRhY19jdl9idWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCisKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9ob3N0K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2N2X2hvc3RfYWxpYXM9JGhvc3RfYWxpYXMKK3Rlc3QgLXogIiRhY19jdl9ob3N0X2FsaWFzIiAmJgorICBhY19jdl9ob3N0X2FsaWFzPSRhY19jdl9idWlsZF9hbGlhcworYWNfY3ZfaG9zdD1gJGFjX2NvbmZpZ19zdWIgJGFjX2N2X2hvc3RfYWxpYXNgIHx8CisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6ICRhY19jb25maWdfc3ViICRhY19jdl9ob3N0X2FsaWFzIGZhaWxlZCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiAkYWNfY29uZmlnX3N1YiAkYWNfY3ZfaG9zdF9hbGlhcyBmYWlsZWQiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9ob3N0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9ob3N0IiA+JjYKK2hvc3Q9JGFjX2N2X2hvc3QKK2hvc3RfY3B1PWBlY2hvICRhY19jdl9ob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2hvc3RfdmVuZG9yPWBlY2hvICRhY19jdl9ob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2hvc3Rfb3M9YGVjaG8gJGFjX2N2X2hvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorCisKKworY2FzZSAiJGhvc3RfY3B1IiBpbgoraVszNDU2XTg2KSBob3N0X2NwdT1pMzg2IDs7Cit4ODZfNjQpIGhvc3RfY3B1PXg4Nl82NCA7OworKikgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogdW5zdXBwb3J0ZWQgQ1BVIHR5cGUiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogdW5zdXBwb3J0ZWQgQ1BVIHR5cGUiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKK2VzYWMKKworCisKKworIworIyBPcHRpb25zCisjCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzLi4uICRFQ0hPX0MiID4mNgorICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3IgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX21haW50YWluZXJfbW9kZSIKKyAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsCitlbHNlCisgIFVTRV9NQUlOVEFJTkVSX01PREU9bm8KK2ZpOworICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkVVNFX01BSU5UQUlORVJfTU9ERSIgPiY1CitlY2hvICIke0VDSE9fVH0kVVNFX01BSU5UQUlORVJfTU9ERSIgPiY2CisKKworaWYgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllczsgdGhlbgorICBNQUlOVEFJTkVSX01PREVfVFJVRT0KKyAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPScjJworZWxzZQorICBNQUlOVEFJTkVSX01PREVfVFJVRT0nIycKKyAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPQorZmkKKworICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKKworCitpZiB0ZXN0ICJ4JGVuYWJsZV9tYWludGFpbmVyX21vZGUiID0geHllczsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInBlcmwiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHBlcmw7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfUEVSTCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXNlICRQRVJMIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX1BFUkw9IiRQRVJMIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wYXRoX1BFUkw9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworICA7OworZXNhYworZmkKK1BFUkw9JGFjX2N2X3BhdGhfUEVSTAorCitpZiB0ZXN0IC1uICIkUEVSTCI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJFBFUkwiID4mNQorZWNobyAiJHtFQ0hPX1R9JFBFUkwiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIGlmIHRlc3QgLXogIiRQRVJMIjsgdGhlbgorICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHBlcmwgbm90IGZvdW5kIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IHBlcmwgbm90IGZvdW5kIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgIGZpCitmaQorCisjIFRoaXMgc2hvdWxkIGJlIGNoZWNrZWQgYmVmb3JlIEFDX1BST0dfQ0MKK2lmIHRlc3QgIngkQ0ZMQUdTIiA9IHg7IHRoZW4KKyAgZGVmYXVsdF9DRkxBR1M9eWVzCitmaQorCitpZiB0ZXN0ICJ4JGhvc3RfY3B1IiA9IHh4ODZfNjQ7IHRoZW4KKyAgQ0ZMQUdTPSItbTMyICRDRkxBR1MiCitmaQorCisjCisjIFByb2dyYW1zCisjCisKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1nY2M7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWdjYyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1CitlY2hvICIke0VDSE9fVH0kQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iZ2NjIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdF9DQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgQ0M9JGFjX2N0X0NDCitlbHNlCisgIENDPSIkYWNfY3ZfcHJvZ19DQyIKK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1nY2M7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWdjYyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1CitlY2hvICIke0VDSE9fVH0kQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iZ2NjIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdF9DQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgQ0M9JGFjX2N0X0NDCitlbHNlCisgIENDPSIkYWNfY3ZfcHJvZ19DQyIKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Y2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9Y2M7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWNjIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19DQyI7IHRoZW4KKyAgYWNfY3RfQ0M9JENDCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iY2MiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCithY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0NDIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworICBDQz0kYWNfY3RfQ0MKK2Vsc2UKKyAgQ0M9IiRhY19jdl9wcm9nX0NDIgorZmkKKworZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBhY19wcm9nX3JlamVjdGVkPW5vCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGlmIHRlc3QgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCisgICAgICAgY29udGludWUKKyAgICAgZmkKKyAgICBhY19jdl9wcm9nX0NDPSJjYyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCisgIHNoaWZ0CisgIGlmIHRlc3QgJCMgIT0gMDsgdGhlbgorICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgorICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KKyAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9IiRhc19kaXIvJGFjX3dvcmQkezErJyAnfSRAIgorICBmaQorZmkKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgZm9yIGFjX3Byb2cgaW4gY2wKKyAgZG8KKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ0M9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDQyIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgICB0ZXN0IC1uICIkQ0MiICYmIGJyZWFrCisgIGRvbmUKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICBmb3IgYWNfcHJvZyBpbiBjbAorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfcHJvZyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCitpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfQ0MiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIHRlc3QgLW4gIiRhY19jdF9DQyIgJiYgYnJlYWsKK2RvbmUKKworICBDQz0kYWNfY3RfQ0MKK2ZpCisKK2ZpCisKKwordGVzdCAteiAiJENDIiAmJiB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCisjIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCitlY2hvICIkYXNfbWU6JExJTkVOTzoiIFwKKyAgICAgImNoZWNraW5nIGZvciBDIGNvbXBpbGVyIHZlcnNpb24iID4mNQorYWNfY29tcGlsZXI9YHNldCBYICRhY19jb21waWxlOyBlY2hvICQyYAoreyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZXIgLS12ZXJzaW9uIDwvZGV2L251bGwgPiY1XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA8L2Rldi9udWxsID4mNSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQoreyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZXIgLXYgPC9kZXYvbnVsbCA+JjVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZXIgLXYgPC9kZXYvbnVsbCA+JjUpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KK3sgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVyIC1WIDwvZGV2L251bGwgPiY1XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGVyIC1WIDwvZGV2L251bGwgPiY1KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9CisKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCithY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcworYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyBhLm91dCBhLmV4ZSBiLm91dCIKKyMgVHJ5IHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIHdpdGhvdXQgLW8gZmlyc3QsIGRpc3JlZ2FyZCBhLm91dC4KKyMgSXQgd2lsbCBoZWxwIHVzIGRpYWdub3NlIGJyb2tlbiBjb21waWxlcnMsIGFuZCBmaW5kaW5nIG91dCBhbiBpbnR1aXRpb24KKyMgb2YgZXhlZXh0LgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZS4uLiAkRUNIT19DIiA+JjYKK2FjX2xpbmtfZGVmYXVsdD1gZWNobyAiJGFjX2xpbmsiIHwgc2VkICdzLyAtbyAqY29uZnRlc3RbXiBdKi8vJ2AKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtfZGVmYXVsdFwiIikgPiY1CisgIChldmFsICRhY19saW5rX2RlZmF1bHQpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KKyAgIyBGaW5kIHRoZSBvdXRwdXQsIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QgbGlrZWx5LiAgVGhpcyBzY2hlbWUgaXMKKyMgbm90IHJvYnVzdCB0byBqdW5rIGluIGAuJywgaGVuY2UgZ28gdG8gd2lsZGNhcmRzIChhLiopIG9ubHkgYXMgYSBsYXN0CisjIHJlc29ydC4KKworIyBCZSBjYXJlZnVsIHRvIGluaXRpYWxpemUgdGhpcyB2YXJpYWJsZSwgc2luY2UgaXQgdXNlZCB0byBiZSBjYWNoZWQuCisjIE90aGVyd2lzZSBhbiBvbGQgY2FjaGUgdmFsdWUgb2YgYG5vJyBsZWQgdG8gYEVYRUVYVCA9IG5vJyBpbiBhIE1ha2VmaWxlLgorYWNfY3ZfZXhlZXh0PQorIyBiLm91dCBpcyBjcmVhdGVkIGJ5IGk5NjAgY29tcGlsZXJzLgorZm9yIGFjX2ZpbGUgaW4gYV9vdXQuZXhlIGEuZXhlIGNvbmZ0ZXN0LmV4ZSBhLm91dCBjb25mdGVzdCBhLiogY29uZnRlc3QuKiBiLm91dAorZG8KKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubyB8ICoub2JqICkKKwk7OworICAgIGNvbmZ0ZXN0LiRhY19leHQgKQorCSMgVGhpcyBpcyB0aGUgc291cmNlIGZpbGUuCisJOzsKKyAgICBbYWJdLm91dCApCisJIyBXZSBmb3VuZCB0aGUgZGVmYXVsdCBleGVjdXRhYmxlLCBidXQgZXhlZXh0PScnIGlzIG1vc3QKKwkjIGNlcnRhaW5seSByaWdodC4KKwlicmVhazs7CisgICAgKi4qICkKKwlhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKKwkjIEZJWE1FOiBJIGJlbGlldmUgd2UgZXhwb3J0IGFjX2N2X2V4ZWV4dCBmb3IgTGlidG9vbCwKKwkjIGJ1dCBpdCB3b3VsZCBiZSBjb29sIHRvIGZpbmQgb3V0IGlmIGl0J3MgdHJ1ZS4gIERvZXMgYW55Ym9keQorCSMgbWFpbnRhaW4gTGlidG9vbD8gLS1ha2ltLgorCWV4cG9ydCBhY19jdl9leGVleHQKKwlicmVhazs7CisgICAgKiApCisJYnJlYWs7OworICBlc2FjCitkb25lCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK3sgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9CitmaQorCithY19leGVleHQ9JGFjX2N2X2V4ZWV4dAorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2ZpbGUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2ZpbGUiID4mNgorCisjIENoZWNrIHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKKyMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4uLiAkRUNIT19DIiA+JjYKKyMgRklYTUU6IFRoZXNlIGNyb3NzIGNvbXBpbGVyIGhhY2tzIHNob3VsZCBiZSByZW1vdmVkIGZvciBBdXRvY29uZiAzLjAKKyMgSWYgbm90IGNyb3NzIGNvbXBpbGluZywgY2hlY2sgdGhhdCB3ZSBjYW4gcnVuIGEgc2ltcGxlIHByb2dyYW0uCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSB5ZXM7IHRoZW4KKyAgaWYgeyBhY190cnk9Jy4vJGFjX2ZpbGUnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9bm8KKyAgZWxzZQorICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0gbWF5YmU7IHRoZW4KKwljcm9zc19jb21waWxpbmc9eWVzCisgICAgZWxzZQorCXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KK0lmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biBDIGNvbXBpbGVkIHByb2dyYW1zLgorSWYgeW91IG1lYW50IHRvIGNyb3NzIGNvbXBpbGUsIHVzZSBcYC0taG9zdCcuCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGZpCisgIGZpCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2CisKK3JtIC1mIGEub3V0IGEuZXhlIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCBiLm91dAorYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKKyMgQ2hlY2sgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgorIyB0aGUgY29tcGlsZXIgaXMgYnJva2VuLCBvciB3ZSBjcm9zcyBjb21waWxlLgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZy4uLiAkRUNIT19DIiA+JjYKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRjcm9zc19jb21waWxpbmciID4mNQorZWNobyAiJHtFQ0hPX1R9JGNyb3NzX2NvbXBpbGluZyIgPiY2CisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcy4uLiAkRUNIT19DIiA+JjYKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgorICAjIElmIGJvdGggYGNvbmZ0ZXN0LmV4ZScgYW5kIGBjb25mdGVzdCcgYXJlIGBwcmVzZW50JyAod2VsbCwgb2JzZXJ2YWJsZSkKKyMgY2F0Y2ggYGNvbmZ0ZXN0LmV4ZScuICBGb3IgaW5zdGFuY2Ugd2l0aCBDeWd3aW4sIGBscyBjb25mdGVzdCcgd2lsbAorIyB3b3JrIHByb3Blcmx5IChpLmUuLCByZWZlciB0byBgY29uZnRlc3QuZXhlJyksIHdoaWxlIGl0IHdvbid0IHdpdGgKKyMgYHJtJy4KK2ZvciBhY19maWxlIGluIGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBjb25mdGVzdC4qOyBkbworICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5vIHwgKi5vYmogKSA7OworICAgICouKiApIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAorCSAgZXhwb3J0IGFjX2N2X2V4ZWV4dAorCSAgYnJlYWs7OworICAgICogKSBicmVhazs7CisgIGVzYWMKK2RvbmUKK2Vsc2UKKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKK3JtIC1mIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dAorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2V4ZWV4dCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfZXhlZXh0IiA+JjYKKworcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorRVhFRVhUPSRhY19jdl9leGVleHQKK2FjX2V4ZWV4dD0kRVhFRVhUCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3Zfb2JqZXh0K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iagoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisgIGZvciBhY19maWxlIGluIGAobHMgY29uZnRlc3QubyBjb25mdGVzdC5vYmo7IGxzIGNvbmZ0ZXN0LiopIDI+L2Rldi9udWxsYDsgZG8KKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnICkgOzsKKyAgICAqKSBhY19jdl9vYmpleHQ9YGV4cHIgIiRhY19maWxlIiA6ICcuKlwuXCguKlwpJ2AKKyAgICAgICBicmVhazs7CisgIGVzYWMKK2RvbmUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIG9iamVjdCBmaWxlczogY2Fubm90IGNvbXBpbGUKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworcm0gLWYgY29uZnRlc3QuJGFjX2N2X29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X29iamV4dCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3Zfb2JqZXh0IiA+JjYKK09CSkVYVD0kYWNfY3Zfb2JqZXh0CithY19vYmpleHQ9JE9CSkVYVAorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlci4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfY19jb21waWxlcl9nbnUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworI2lmbmRlZiBfX0dOVUNfXworICAgICAgIGNob2tlIG1lCisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2NvbXBpbGVyX2dudT15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY29tcGlsZXJfZ251PW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorYWNfY3ZfY19jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQorCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY2CitHQ0M9YHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllcyAmJiBlY2hvIHllc2AKK2FjX3Rlc3RfQ0ZMQUdTPSR7Q0ZMQUdTK3NldH0KK2FjX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKK0NGTEFHUz0iLWciCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2NfZytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9wcm9nX2NjX2c9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2N2X3Byb2dfY2NfZz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19nIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2NjX2ciID4mNgoraWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgorICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0KKyAgZmkKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IEFOU0kgQyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBBTlNJIEMuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2Nfc3RkYytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jdl9wcm9nX2NjX3N0ZGM9bm8KK2FjX3NhdmVfQ0M9JENDCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisvKiBNb3N0IG9mIHRoZSBmb2xsb3dpbmcgdGVzdHMgYXJlIHN0b2xlbiBmcm9tIFJDUyA1LjcncyBzcmMvY29uZi5zaC4gICovCitzdHJ1Y3QgYnVmIHsgaW50IHg7IH07CitGSUxFICogKCpyY3NvcGVuKSAoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpOworc3RhdGljIGNoYXIgKmUgKHAsIGkpCisgICAgIGNoYXIgKipwOworICAgICBpbnQgaTsKK3sKKyAgcmV0dXJuIHBbaV07Cit9CitzdGF0aWMgY2hhciAqZiAoY2hhciAqICgqZykgKGNoYXIgKiosIGludCksIGNoYXIgKipwLCAuLi4pCit7CisgIGNoYXIgKnM7CisgIHZhX2xpc3QgdjsKKyAgdmFfc3RhcnQgKHYscCk7CisgIHMgPSBnIChwLCB2YV9hcmcgKHYsaW50KSk7CisgIHZhX2VuZCAodik7CisgIHJldHVybiBzOworfQorCisvKiBPU0YgNC4wIENvbXBhcSBjYyBpcyBzb21lIHNvcnQgb2YgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdC4gIEl0IGhhcworICAgZnVuY3Rpb24gcHJvdG90eXBlcyBhbmQgc3R1ZmYsIGJ1dCBub3QgJ1x4SEgnIGhleCBjaGFyYWN0ZXIgY29uc3RhbnRzLgorICAgVGhlc2UgZG9uJ3QgcHJvdm9rZSBhbiBlcnJvciB1bmZvcnR1bmF0ZWx5LCBpbnN0ZWFkIGFyZSBzaWxlbnRseSB0cmVhdGVkCisgICBhcyAneCcuICBUaGUgZm9sbG93aW5nIGluZHVjZXMgYW4gZXJyb3IsIHVudGlsIC1zdGQxIGlzIGFkZGVkIHRvIGdldAorICAgcHJvcGVyIEFOU0kgbW9kZS4gIEN1cmlvdXNseSAnXHgwMCchPSd4JyBhbHdheXMgY29tZXMgb3V0IHRydWUsIGZvciBhbgorICAgYXJyYXkgc2l6ZSBhdCBsZWFzdC4gIEl0J3MgbmVjZXNzYXJ5IHRvIHdyaXRlICdceDAwJz09MCB0byBnZXQgc29tZXRoaW5nCisgICB0aGF0J3MgdHJ1ZSBvbmx5IHdpdGggLXN0ZDEuICAqLworaW50IG9zZjRfY2NfYXJyYXkgWydceDAwJyA9PSAwID8gMSA6IC0xXTsKKworaW50IHRlc3QgKGludCBpLCBkb3VibGUgeCk7CitzdHJ1Y3QgczEge2ludCAoKmYpIChpbnQgYSk7fTsKK3N0cnVjdCBzMiB7aW50ICgqZikgKGRvdWJsZSBhKTt9OworaW50IHBhaXJuYW1lcyAoaW50LCBjaGFyICoqLCBGSUxFICooKikoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpLCBpbnQsIGludCk7CitpbnQgYXJnYzsKK2NoYXIgKiphcmd2OworaW50CittYWluICgpCit7CityZXR1cm4gZiAoZSwgYXJndiwgMCkgIT0gYXJndlswXSAgfHwgIGYgKGUsIGFyZ3YsIDEpICE9IGFyZ3ZbMV07CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKKyMgRG9uJ3QgdHJ5IGdjYyAtYW5zaTsgdGhhdCB0dXJucyBvZmYgdXNlZnVsIGV4dGVuc2lvbnMgYW5kCisjIGJyZWFrcyBzb21lIHN5c3RlbXMnIGhlYWRlciBmaWxlcy4KKyMgQUlYCQkJLXFsYW5nbHZsPWFuc2kKKyMgVWx0cml4IGFuZCBPU0YvMQktc3RkMQorIyBIUC1VWCAxMC4yMCBhbmQgbGF0ZXIJLUFlCisjIEhQLVVYIG9sZGVyIHZlcnNpb25zCS1BYSAtRF9IUFVYX1NPVVJDRQorIyBTVlI0CQkJLVhjIC1EX19FWFRFTlNJT05TX18KK2ZvciBhY19hcmcgaW4gIiIgLXFsYW5nbHZsPWFuc2kgLXN0ZDEgLUFlICItQWEgLURfSFBVWF9TT1VSQ0UiICItWGMgLURfX0VYVEVOU0lPTlNfXyIKK2RvCisgIENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgorICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X3Byb2dfY2Nfc3RkYz0kYWNfYXJnCiticmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0LiRhY19leHQgY29uZnRlc3QuJGFjX29iamV4dAorQ0M9JGFjX3NhdmVfQ0MKKworZmkKKworY2FzZSAieCRhY19jdl9wcm9nX2NjX3N0ZGMiIGluCisgIHh8eG5vKQorICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vbmUgbmVlZGVkIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vbmUgbmVlZGVkIiA+JjYgOzsKKyAgKikKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19zdGRjIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2NjX3N0ZGMiID4mNgorICAgIENDPSIkQ0MgJGFjX2N2X3Byb2dfY2Nfc3RkYyIgOzsKK2VzYWMKKworIyBTb21lIHBlb3BsZSB1c2UgYSBDKysgY29tcGlsZXIgdG8gY29tcGlsZSBDLiAgU2luY2Ugd2UgdXNlIGBleGl0JywKKyMgaW4gQysrIHdlIG5lZWQgdG8gZGVjbGFyZSBpdC4gIEluIGNhc2Ugc29tZW9uZSB1c2VzIHRoZSBzYW1lIGNvbXBpbGVyCisjIGZvciBib3RoIGNvbXBpbGluZyBDIGFuZCBDKysgd2UgbmVlZCB0byBoYXZlIHRoZSBDKysgY29tcGlsZXIgZGVjaWRlCisjIHRoZSBkZWNsYXJhdGlvbiBvZiBleGl0LCBzaW5jZSBpdCdzIHRoZSBtb3N0IGRlbWFuZGluZyBlbnZpcm9ubWVudC4KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorI2lmbmRlZiBfX2NwbHVzcGx1cworICBjaG9rZSBtZQorI2VuZGlmCitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgZm9yIGFjX2RlY2xhcmF0aW9uIGluIFwKKyAgICcnIFwKKyAgICdleHRlcm4gIkMiIHZvaWQgc3RkOjpleGl0IChpbnQpIHRocm93ICgpOyB1c2luZyBzdGQ6OmV4aXQ7JyBcCisgICAnZXh0ZXJuICJDIiB2b2lkIHN0ZDo6ZXhpdCAoaW50KTsgdXNpbmcgc3RkOjpleGl0OycgXAorICAgJ2V4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpIHRocm93ICgpOycgXAorICAgJ2V4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpOycgXAorICAgJ3ZvaWQgZXhpdCAoaW50KTsnCitkbworICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19kZWNsYXJhdGlvbgorI2luY2x1ZGUgPHN0ZGxpYi5oPgoraW50CittYWluICgpCit7CitleGl0ICg0Mik7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitjb250aW51ZQorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfZGVjbGFyYXRpb24KK2ludAorbWFpbiAoKQoreworZXhpdCAoNDIpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGJyZWFrCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Citkb25lCitybSAtZiBjb25mdGVzdCoKK2lmIHRlc3QgLW4gIiRhY19kZWNsYXJhdGlvbiI7IHRoZW4KKyAgZWNobyAnI2lmZGVmIF9fY3BsdXNwbHVzJyA+PmNvbmZkZWZzLmgKKyAgZWNobyAkYWNfZGVjbGFyYXRpb24gICAgICA+PmNvbmZkZWZzLmgKKyAgZWNobyAnI2VuZGlmJyAgICAgICAgICAgICA+PmNvbmZkZWZzLmgKK2ZpCisKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKK0RFUERJUj0iJHthbV9fbGVhZGluZ19kb3R9ZGVwcyIKKworICAgICAgICAgIGFjX2NvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyBkZXBmaWxlcyIKKworCithbV9tYWtlPSR7TUFLRS1tYWtlfQorY2F0ID4gY29uZmluYyA8PCAnRU5EJworYW1fX2RvaXQ6CisJQGVjaG8gZG9uZQorLlBIT05ZOiBhbV9fZG9pdAorRU5ECisjIElmIHdlIGRvbid0IGZpbmQgYW4gaW5jbHVkZSBkaXJlY3RpdmUsIGp1c3QgY29tbWVudCBvdXQgdGhlIGNvZGUuCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSAkYW1fbWFrZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2UuLi4gJEVDSE9fQyIgPiY2CithbV9faW5jbHVkZT0iIyIKK2FtX19xdW90ZT0KK19hbV9yZXN1bHQ9bm9uZQorIyBGaXJzdCB0cnkgR05VIG1ha2Ugc3R5bGUgaW5jbHVkZS4KK2VjaG8gImluY2x1ZGUgY29uZmluYyIgPiBjb25mbWYKKyMgV2UgZ3JlcCBvdXQgYEVudGVyaW5nIGRpcmVjdG9yeScgYW5kIGBMZWF2aW5nIGRpcmVjdG9yeScKKyMgbWVzc2FnZXMgd2hpY2ggY2FuIG9jY3VyIGlmIGB3JyBlbmRzIHVwIGluIE1BS0VGTEFHUy4KKyMgSW4gcGFydGljdWxhciB3ZSBkb24ndCBsb29rIGF0IGBebWFrZTonIGJlY2F1c2UgR05VIG1ha2UgbWlnaHQKKyMgYmUgaW52b2tlZCB1bmRlciBzb21lIG90aGVyIG5hbWUgKHVzdWFsbHkgImdtYWtlIiksIGluIHdoaWNoCisjIGNhc2UgaXQgcHJpbnRzIGl0cyBuZXcgbmFtZSBpbnN0ZWFkIG9mIGBtYWtlJy4KK2lmIHRlc3QgImAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsIHwgZ3JlcCAtdiAnaW5nIGRpcmVjdG9yeSdgIiA9ICJkb25lIjsgdGhlbgorICAgYW1fX2luY2x1ZGU9aW5jbHVkZQorICAgYW1fX3F1b3RlPQorICAgX2FtX3Jlc3VsdD1HTlUKK2ZpCisjIE5vdyB0cnkgQlNEIG1ha2Ugc3R5bGUgaW5jbHVkZS4KK2lmIHRlc3QgIiRhbV9faW5jbHVkZSIgPSAiIyI7IHRoZW4KKyAgIGVjaG8gJy5pbmNsdWRlICJjb25maW5jIicgPiBjb25mbWYKKyAgIGlmIHRlc3QgImAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCIgPSAiZG9uZSI7IHRoZW4KKyAgICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCisgICAgICBhbV9fcXVvdGU9IlwiIgorICAgICAgX2FtX3Jlc3VsdD1CU0QKKyAgIGZpCitmaQorCisKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRfYW1fcmVzdWx0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRfYW1fcmVzdWx0IiA+JjYKK3JtIC1mIGNvbmZpbmMgY29uZm1mCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nIG9yIC0tZGlzYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciCisKK2ZpOworaWYgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vOyB0aGVuCisgIGFtX2RlcGNvbXA9IiRhY19hdXhfZGlyL2RlcGNvbXAiCisgIEFNREVQQkFDS1NMQVNIPSdcJworZmkKKworCitpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiAhPSB4bm87IHRoZW4KKyAgQU1ERVBfVFJVRT0KKyAgQU1ERVBfRkFMU0U9JyMnCitlbHNlCisgIEFNREVQX1RSVUU9JyMnCisgIEFNREVQX0ZBTFNFPQorZmkKKworCisKKworZGVwY2M9IiRDQyIgICBhbV9jb21waWxlcl9saXN0PQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgorICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCisgICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCisgICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCisgICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKKyAgIyBpbiBEJy4KKyAgbWtkaXIgY29uZnRlc3QuZGlyCisgICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCisgICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCisgIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCisgIGNkIGNvbmZ0ZXN0LmRpcgorICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKKyAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKKyAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKKyAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCisgICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAorICAjIGRpcmVjdG9yeS4KKyAgbWtkaXIgc3ViCisKKyAgYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQorICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgorICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnIDwgLi9kZXBjb21wYAorICBmaQorICBmb3IgZGVwbW9kZSBpbiAkYW1fY29tcGlsZXJfbGlzdDsgZG8KKyAgICAjIFNldHVwIGEgc291cmNlIHdpdGggbWFueSBkZXBlbmRlbmNpZXMsIGJlY2F1c2Ugc29tZSBjb21waWxlcnMKKyAgICAjIGxpa2UgdG8gd3JhcCBsYXJnZSBkZXBlbmRlbmN5IGxpc3RzIG9uIGNvbHVtbiA4MCAod2l0aCBcKSwgYW5kCisgICAgIyB3ZSBzaG91bGQgbm90IGNob29zZSBhIGRlcGNvbXAgbW9kZSB3aGljaCBpcyBjb25mdXNlZCBieSB0aGlzLgorICAgICMKKyAgICAjIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlc2UgZmlsZXMgZm9yIGVhY2ggdGVzdCwgYXMgdGhlIGNvbXBpbGVyIG1heQorICAgICMgb3ZlcndyaXRlIHNvbWUgb2YgdGhlbSB3aGVuIHRlc3Rpbmcgd2l0aCBvYnNjdXJlIGNvbW1hbmQgbGluZXMuCisgICAgIyBUaGlzIGhhcHBlbnMgYXQgbGVhc3Qgd2l0aCB0aGUgQUlYIEMgY29tcGlsZXIuCisgICAgOiA+IHN1Yi9jb25mdGVzdC5jCisgICAgZm9yIGkgaW4gMSAyIDMgNCA1IDY7IGRvCisgICAgICBlY2hvICcjaW5jbHVkZSAiY29uZnRzdCckaScuaCInID4+IHN1Yi9jb25mdGVzdC5jCisgICAgICAjIFVzaW5nIGA6ID4gc3ViL2NvbmZ0c3QkaS5oJyBjcmVhdGVzIG9ubHkgc3ViL2NvbmZ0c3QxLmggd2l0aAorICAgICAgIyBTb2xhcmlzIDgncyB7L3Vzcix9L2Jpbi9zaC4KKyAgICAgIHRvdWNoIHN1Yi9jb25mdHN0JGkuaAorICAgIGRvbmUKKyAgICBlY2hvICIke2FtX19pbmNsdWRlfSAke2FtX19xdW90ZX1zdWIvY29uZnRlc3QuUG8ke2FtX19xdW90ZX0iID4gY29uZm1mCisKKyAgICBjYXNlICRkZXBtb2RlIGluCisgICAgbm9zaWRlZWZmZWN0KQorICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCisgICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KKwljb250aW51ZQorICAgICAgZWxzZQorCWJyZWFrCisgICAgICBmaQorICAgICAgOzsKKyAgICBub25lKSBicmVhayA7OworICAgIGVzYWMKKyAgICAjIFdlIGNoZWNrIHdpdGggYC1jJyBhbmQgYC1vJyBmb3IgdGhlIHNha2Ugb2YgdGhlICJkYXNobXN0ZG91dCIKKyAgICAjIG1vZGUuICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgU3VuUHJvIEMrKyBjb21waWxlciBkb2VzIG5vdCBwcm9wZXJseQorICAgICMgaGFuZGxlIGAtTSAtbycsIGFuZCB3ZSBuZWVkIHRvIGRldGVjdCB0aGlzLgorICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAorICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9c3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IFwKKyAgICAgICBkZXBmaWxlPXN1Yi9jb25mdGVzdC5QbyB0bXBkZXBmaWxlPXN1Yi9jb25mdGVzdC5UUG8gXAorICAgICAgICRTSEVMTCAuL2RlcGNvbXAgJGRlcGNjIC1jIC1vIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuYyBcCisgICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCisgICAgICAgZ3JlcCBzdWIvY29uZnRzdDYuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAjIGljYyBkb2Vzbid0IGNob2tlIG9uIHVua25vd24gb3B0aW9ucywgaXQgd2lsbCBqdXN0IGlzc3VlIHdhcm5pbmdzCisgICAgICAjIG9yIHJlbWFya3MgKGV2ZW4gd2l0aCAtV2Vycm9yKS4gIFNvIHdlIGdyZXAgc3RkZXJyIGZvciBhbnkgbWVzc2FnZQorICAgICAgIyB0aGF0IHNheXMgYW4gb3B0aW9uIHdhcyBpZ25vcmVkIG9yIG5vdCBzdXBwb3J0ZWQuCisgICAgICAjIFdoZW4gZ2l2ZW4gLU1QLCBpY2MgNy4wIGFuZCA3LjEgY29tcGxhaW4gdGh1c2x5OgorICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHdhcm5pbmc6IGlnbm9yaW5nIG9wdGlvbiAnLU0nOyBubyBhcmd1bWVudCByZXF1aXJlZAorICAgICAgIyBUaGUgZGlhZ25vc2lzIGNoYW5nZWQgaW4gaWNjIDguMDoKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSByZW1hcms6IG9wdGlvbiAnLU1QJyBub3Qgc3VwcG9ydGVkCisgICAgICBpZiAoZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgfHwKKyAgICAgICAgICBncmVwICdub3Qgc3VwcG9ydGVkJyBjb25mdGVzdC5lcnIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCisgICAgICAgIGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPSRkZXBtb2RlCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKworICBjZCAuLgorICBybSAtcmYgY29uZnRlc3QuZGlyCitlbHNlCisgIGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKK2ZpCisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjYKK0NDREVQTU9ERT1kZXBtb2RlPSRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZQorCisKKworaWYKKyAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKKyAgJiYgdGVzdCAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzM7IHRoZW4KKyAgYW1fX2Zhc3RkZXBDQ19UUlVFPQorICBhbV9fZmFzdGRlcENDX0ZBTFNFPScjJworZWxzZQorICBhbV9fZmFzdGRlcENDX1RSVUU9JyMnCisgIGFtX19mYXN0ZGVwQ0NfRkFMU0U9CitmaQorCisKKyMgV2UgbmVlZCB0aGlzIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBBdXRvY29uZi4KKworZGVwY2M9IiRDQyIgICBhbV9jb21waWxlcl9saXN0PQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiAkZGVwY2MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mICRkZXBjYy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgorICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCisgICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCisgICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCisgICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKKyAgIyBpbiBEJy4KKyAgbWtkaXIgY29uZnRlc3QuZGlyCisgICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCisgICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCisgIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCisgIGNkIGNvbmZ0ZXN0LmRpcgorICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKKyAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKKyAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKKyAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCisgICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAorICAjIGRpcmVjdG9yeS4KKyAgbWtkaXIgc3ViCisKKyAgYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQorICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgorICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gJ3MvXiMqXChbYS16QS1aMC05XSpcKSkkL1wxL3AnIDwgLi9kZXBjb21wYAorICBmaQorICBmb3IgZGVwbW9kZSBpbiAkYW1fY29tcGlsZXJfbGlzdDsgZG8KKyAgICAjIFNldHVwIGEgc291cmNlIHdpdGggbWFueSBkZXBlbmRlbmNpZXMsIGJlY2F1c2Ugc29tZSBjb21waWxlcnMKKyAgICAjIGxpa2UgdG8gd3JhcCBsYXJnZSBkZXBlbmRlbmN5IGxpc3RzIG9uIGNvbHVtbiA4MCAod2l0aCBcKSwgYW5kCisgICAgIyB3ZSBzaG91bGQgbm90IGNob29zZSBhIGRlcGNvbXAgbW9kZSB3aGljaCBpcyBjb25mdXNlZCBieSB0aGlzLgorICAgICMKKyAgICAjIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlc2UgZmlsZXMgZm9yIGVhY2ggdGVzdCwgYXMgdGhlIGNvbXBpbGVyIG1heQorICAgICMgb3ZlcndyaXRlIHNvbWUgb2YgdGhlbSB3aGVuIHRlc3Rpbmcgd2l0aCBvYnNjdXJlIGNvbW1hbmQgbGluZXMuCisgICAgIyBUaGlzIGhhcHBlbnMgYXQgbGVhc3Qgd2l0aCB0aGUgQUlYIEMgY29tcGlsZXIuCisgICAgOiA+IHN1Yi9jb25mdGVzdC5jCisgICAgZm9yIGkgaW4gMSAyIDMgNCA1IDY7IGRvCisgICAgICBlY2hvICcjaW5jbHVkZSAiY29uZnRzdCckaScuaCInID4+IHN1Yi9jb25mdGVzdC5jCisgICAgICAjIFVzaW5nIGA6ID4gc3ViL2NvbmZ0c3QkaS5oJyBjcmVhdGVzIG9ubHkgc3ViL2NvbmZ0c3QxLmggd2l0aAorICAgICAgIyBTb2xhcmlzIDgncyB7L3Vzcix9L2Jpbi9zaC4KKyAgICAgIHRvdWNoIHN1Yi9jb25mdHN0JGkuaAorICAgIGRvbmUKKyAgICBlY2hvICIke2FtX19pbmNsdWRlfSAke2FtX19xdW90ZX1zdWIvY29uZnRlc3QuUG8ke2FtX19xdW90ZX0iID4gY29uZm1mCisKKyAgICBjYXNlICRkZXBtb2RlIGluCisgICAgbm9zaWRlZWZmZWN0KQorICAgICAgIyBhZnRlciB0aGlzIHRhZywgbWVjaGFuaXNtcyBhcmUgbm90IGJ5IHNpZGUtZWZmZWN0LCBzbyB0aGV5J2xsCisgICAgICAjIG9ubHkgYmUgdXNlZCB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgICAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9kZXBlbmRlbmN5X3RyYWNraW5nIiA9IHh5ZXM7IHRoZW4KKwljb250aW51ZQorICAgICAgZWxzZQorCWJyZWFrCisgICAgICBmaQorICAgICAgOzsKKyAgICBub25lKSBicmVhayA7OworICAgIGVzYWMKKyAgICAjIFdlIGNoZWNrIHdpdGggYC1jJyBhbmQgYC1vJyBmb3IgdGhlIHNha2Ugb2YgdGhlICJkYXNobXN0ZG91dCIKKyAgICAjIG1vZGUuICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgU3VuUHJvIEMrKyBjb21waWxlciBkb2VzIG5vdCBwcm9wZXJseQorICAgICMgaGFuZGxlIGAtTSAtbycsIGFuZCB3ZSBuZWVkIHRvIGRldGVjdCB0aGlzLgorICAgIGlmIGRlcG1vZGU9JGRlcG1vZGUgXAorICAgICAgIHNvdXJjZT1zdWIvY29uZnRlc3QuYyBvYmplY3Q9c3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IFwKKyAgICAgICBkZXBmaWxlPXN1Yi9jb25mdGVzdC5QbyB0bXBkZXBmaWxlPXN1Yi9jb25mdGVzdC5UUG8gXAorICAgICAgICRTSEVMTCAuL2RlcGNvbXAgJGRlcGNjIC1jIC1vIHN1Yi9jb25mdGVzdC4ke09CSkVYVC1vfSBzdWIvY29uZnRlc3QuYyBcCisgICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCisgICAgICAgZ3JlcCBzdWIvY29uZnRzdDYuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99IHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAjIGljYyBkb2Vzbid0IGNob2tlIG9uIHVua25vd24gb3B0aW9ucywgaXQgd2lsbCBqdXN0IGlzc3VlIHdhcm5pbmdzCisgICAgICAjIG9yIHJlbWFya3MgKGV2ZW4gd2l0aCAtV2Vycm9yKS4gIFNvIHdlIGdyZXAgc3RkZXJyIGZvciBhbnkgbWVzc2FnZQorICAgICAgIyB0aGF0IHNheXMgYW4gb3B0aW9uIHdhcyBpZ25vcmVkIG9yIG5vdCBzdXBwb3J0ZWQuCisgICAgICAjIFdoZW4gZ2l2ZW4gLU1QLCBpY2MgNy4wIGFuZCA3LjEgY29tcGxhaW4gdGh1c2x5OgorICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHdhcm5pbmc6IGlnbm9yaW5nIG9wdGlvbiAnLU0nOyBubyBhcmd1bWVudCByZXF1aXJlZAorICAgICAgIyBUaGUgZGlhZ25vc2lzIGNoYW5nZWQgaW4gaWNjIDguMDoKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSByZW1hcms6IG9wdGlvbiAnLU1QJyBub3Qgc3VwcG9ydGVkCisgICAgICBpZiAoZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgfHwKKyAgICAgICAgICBncmVwICdub3Qgc3VwcG9ydGVkJyBjb25mdGVzdC5lcnIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCisgICAgICAgIGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPSRkZXBtb2RlCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKworICBjZCAuLgorICBybSAtcmYgY29uZnRlc3QuZGlyCitlbHNlCisgIGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKK2ZpCisKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYW1fY3ZfQ0NfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA+JjYKK0NDREVQTU9ERT1kZXBtb2RlPSRhbV9jdl9DQ19kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZQorCisKKworaWYKKyAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKKyAgJiYgdGVzdCAiJGFtX2N2X0NDX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzM7IHRoZW4KKyAgYW1fX2Zhc3RkZXBDQ19UUlVFPQorICBhbV9fZmFzdGRlcENDX0ZBTFNFPScjJworZWxzZQorICBhbV9fZmFzdGRlcENDX1RSVUU9JyMnCisgIGFtX19mYXN0ZGVwQ0NfRkFMU0U9CitmaQorCisKKworQ0NBUz0iJENDIgorCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1iaW51dGlscyBvciAtLXdpdGhvdXQtYmludXRpbHMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2JpbnV0aWxzK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2JpbnV0aWxzIgorCitmaTsKKworaWYgdGVzdCAieCR3aXRoX2JpbnV0aWxzIiAhPSB4OyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfUkFOTElCK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhc2UgJFJBTkxJQiBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCithc19kdW1teT0iIiR3aXRoX2JpbnV0aWxzOiRQQVRIIiIKK2ZvciBhc19kaXIgaW4gJGFzX2R1bW15CitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3BhdGhfUkFOTElCPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCisKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfUkFOTElCIiAmJiBhY19jdl9wYXRoX1JBTkxJQj0iOiIKKyAgOzsKK2VzYWMKK2ZpCitSQU5MSUI9JGFjX2N2X3BhdGhfUkFOTElCCisKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRSQU5MSUIiID4mNQorZWNobyAiJHtFQ0hPX1R9JFJBTkxJQiIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19SQU5MSUIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCitSQU5MSUI9JGFjX2N2X3Byb2dfUkFOTElCCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkUkFOTElCIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRSQU5MSUIiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIjsgdGhlbgorICBhY19jdF9SQU5MSUI9JFJBTkxJQgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X1JBTkxJQitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0iJGFjX2N0X1JBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSJyYW5saWIiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIiICYmIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSI6IgorZmkKK2ZpCithY19jdF9SQU5MSUI9JGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCCitpZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfUkFOTElCIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdF9SQU5MSUIiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIFJBTkxJQj0kYWNfY3RfUkFOTElCCitlbHNlCisgIFJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgorZmkKKworZmkKKworIyBvcHRpbWl6YXRpb24gZmxhZ3MKK2lmIHRlc3QgIngkYWNfY3ZfY19jb21waWxlcl9nbnUiID0geHllczsgdGhlbgorICBpZiB0ZXN0ICJ4JGRlZmF1bHRfQ0ZMQUdTIiA9IHh5ZXM7IHRoZW4KKyAgICAjIEF1dG9jb25mIG1heSBzZXQgQ0ZMQUdTIHRvIC1PMiBhbmQvb3IgLWcuIFNvIGVsaW1pbmF0ZSB0aGVtLgorICAgIENGTEFHUz0iYGVjaG8gJENGTEFHUyB8IHNlZCAtZSAncy8tZy8vZycgLWUgJ3MvLU9bMC05XS8vZydgIC1nIgorICAgICMgSWYgdGhlIHVzZXIgc3BlY2lmeSB0aGUgZGlyZWN0b3J5IGZvciBiaW51dGlscywgYWRkIHRoZSBvcHRpb24gYC1CJy4KKyAgICBpZiB0ZXN0ICJ4JHdpdGhfYmludXRpbHMiICE9IHg7IHRoZW4KKyAgICAgIENGTEFHUz0iLUIkd2l0aF9iaW51dGlscy8gJENGTEFHUyIKKyAgICBmaQorICAgIFNUQUdFMV9DRkxBR1M9Ii1PMiIKKyAgICBHUlVCX0NGTEFHUz0iLU8yIgorCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBvcHRpbWl6YXRpb24gZm9yIHNpemUgd29ya3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIG9wdGltaXphdGlvbiBmb3Igc2l6ZSB3b3Jrcy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7c2l6ZV9mbGFnK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisKKyAgICAgIHNhdmVkX0NGTEFHUz0kQ0ZMQUdTCisgICAgICBDRkxBR1M9Ii1PcyAtZyIKKyAgICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIHNpemVfZmxhZz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworc2l6ZV9mbGFnPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgICAgQ0ZMQUdTPSRzYXZlZF9DRkxBR1MKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRzaXplX2ZsYWciID4mNQorZWNobyAiJHtFQ0hPX1R9JHNpemVfZmxhZyIgPiY2CisgICAgaWYgdGVzdCAieCRzaXplX2ZsYWciID0geHllczsgdGhlbgorICAgICAgU1RBR0UyX0NGTEFHUz0iLU9zIgorICAgIGVsc2UKKyAgICAgIFNUQUdFMl9DRkxBR1M9Ii1PMiAtZm5vLXN0cmVuZ3RoLXJlZHVjZSAtZm5vLXVucm9sbC1sb29wcyIKKyAgICBmaQorICAgICMgT3BlbkJTRCBoYXMgYSBHQ0MgZXh0ZW5zaW9uIGZvciBwcm90ZWN0aW5nIGFwcGxpY2F0aW9ucyBmcm9tCisgICAgIyBzdGFjayBzbWFzaGluZyBhdHRhY2tzLCBidXQgR1JVQiBkb2Vzbid0IHdhbnQgdGhpcyBmZWF0dXJlLgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIGdjYyBoYXMgLWZuby1zdGFjay1wcm90ZWN0b3IiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIGdjYyBoYXMgLWZuby1zdGFjay1wcm90ZWN0b3IuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke25vX3N0YWNrX3Byb3RlY3Rvcl9mbGFnK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisKKyAgICAgIHNhdmVkX0NGTEFHUz0kQ0ZMQUdTCisgICAgICBDRkxBR1M9Ii1mbm8tc3RhY2stcHJvdGVjdG9yIgorICAgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgbm9fc3RhY2tfcHJvdGVjdG9yX2ZsYWc9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK25vX3N0YWNrX3Byb3RlY3Rvcl9mbGFnPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgICAgQ0ZMQUdTPSRzYXZlZF9DRkxBR1MKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRub19zdGFja19wcm90ZWN0b3JfZmxhZyIgPiY1CitlY2hvICIke0VDSE9fVH0kbm9fc3RhY2tfcHJvdGVjdG9yX2ZsYWciID4mNgorICAgIGlmIHRlc3QgIngkbm9fc3RhY2tfcHJvdGVjdG9yX2ZsYWciID0geHllczsgdGhlbgorICAgICAgU1RBR0UyX0NGTEFHUz0iJFNUQUdFMl9DRkxBR1MgLWZuby1zdGFjay1wcm90ZWN0b3IiCisgICAgZmkKKyAgZmkKK2ZpCisKKworCisKKworIyBFbmZvcmNlIGNvZGluZyBzdGFuZGFyZHMuCitDUFBGTEFHUz0iJENQUEZMQUdTIC1XYWxsIC1XbWlzc2luZy1wcm90b3R5cGVzIC1XdW51c2VkIC1Xc2hhZG93IgorQ1BQRkxBR1M9IiRDUFBGTEFHUyAtV3BvaW50ZXItYXJpdGgiCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIC1XdW5kZWYgd29ya3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIC1XdW5kZWYgd29ya3MuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke3VuZGVmX2ZsYWcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKworICBzYXZlZF9DUFBGTEFHUz0iJENQUEZMQUdTIgorICBDUFBGTEFHUz0iLVd1bmRlZiIKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgdW5kZWZfZmxhZz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKwordW5kZWZfZmxhZz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgQ1BQRkxBR1M9IiRzYXZlZF9DUFBGTEFHUyIKKworZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICR1bmRlZl9mbGFnIiA+JjUKK2VjaG8gIiR7RUNIT19UfSR1bmRlZl9mbGFnIiA+JjYKKworIyBUaGUgb3B0aW9ucyBgLWZhbGlnbi0qJyBhcmUgc3VwcG9ydGVkIGJ5IGdjYyAzLjAgb3IgbGF0ZXIuCisjIFByb2JhYmx5IGl0IGlzIHN1ZmZpY2llbnQgdG8gb25seSBjaGVjayBmb3IgLWZhbGlnbi1sb29wcy4KK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIC1mYWxpZ24tbG9vcHMgd29ya3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIC1mYWxpZ24tbG9vcHMgd29ya3MuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2ZhbGlnbl9sb29wX2ZsYWcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKworICBzYXZlZF9DUFBGTEFHUz0iJENQUEZMQUdTIgorICBDUFBGTEFHUz0iLWZhbGlnbi1sb29wcz0xIgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBmYWxpZ25fbG9vcF9mbGFnPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitmYWxpZ25fbG9vcF9mbGFnPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBDUFBGTEFHUz0iJHNhdmVkX0NQUEZMQUdTIgorCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGZhbGlnbl9sb29wX2ZsYWciID4mNQorZWNobyAiJHtFQ0hPX1R9JGZhbGlnbl9sb29wX2ZsYWciID4mNgorCisjIEZvcmNlIG5vIGFsaWdubWVudCB0byBzYXZlIHNwYWNlLgoraWYgdGVzdCAieCRmYWxpZ25fbG9vcF9mbGFnIiA9IHh5ZXM7IHRoZW4KKyAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtZmFsaWduLWp1bXBzPTEgLWZhbGlnbi1sb29wcz0xIC1mYWxpZ24tZnVuY3Rpb25zPTEiCitlbHNlCisgIENQUEZMQUdTPSIkQ1BQRkxBR1MgLW1hbGlnbi1qdW1wcz0xIC1tYWxpZ24tbG9vcHM9MSAtbWFsaWduLWZ1bmN0aW9ucz0xIgorZmkKKworaWYgdGVzdCAieCR1bmRlZl9mbGFnIiA9IHh5ZXM7IHRoZW4KKyAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtV3VuZGVmIgorZmkKKworaWYgdGVzdCAieCR3aXRoX2JpbnV0aWxzIiAhPSB4OyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAib2JqY29weSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgb2JqY29weTsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9PQkpDT1BZK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhc2UgJE9CSkNPUFkgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfT0JKQ09QWT0iJE9CSkNPUFkiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCithc19kdW1teT0iIiR3aXRoX2JpbnV0aWxzOiRQQVRIIiIKK2ZvciBhc19kaXIgaW4gJGFzX2R1bW15CitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgIGFjX2N2X3BhdGhfT0JKQ09QWT0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCisgIDs7Citlc2FjCitmaQorT0JKQ09QWT0kYWNfY3ZfcGF0aF9PQkpDT1BZCisKK2lmIHRlc3QgLW4gIiRPQkpDT1BZIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkT0JKQ09QWSIgPiY1CitlY2hvICIke0VDSE9fVH0kT0JKQ09QWSIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9b2JqY29weSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1vYmpjb3B5OyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX09CSkNPUFkrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJE9CSkNPUFkiOyB0aGVuCisgIGFjX2N2X3Byb2dfT0JKQ09QWT0iJE9CSkNPUFkiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX09CSkNPUFk9IiR7YWNfdG9vbF9wcmVmaXh9b2JqY29weSIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorCitmaQorZmkKK09CSkNPUFk9JGFjX2N2X3Byb2dfT0JKQ09QWQoraWYgdGVzdCAtbiAiJE9CSkNPUFkiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRPQkpDT1BZIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRPQkpDT1BZIiA+JjYKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorZmkKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX09CSkNPUFkiOyB0aGVuCisgIGFjX2N0X09CSkNPUFk9JE9CSkNPUFkKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJvYmpjb3B5Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBvYmpjb3B5OyBhY193b3JkPSQyCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X09CSkNPUFkrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X09CSkNPUFkiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfT0JKQ09QWT0iJGFjX2N0X09CSkNPUFkiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X09CSkNPUFk9Im9iamNvcHkiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCithY19jdF9PQkpDT1BZPSRhY19jdl9wcm9nX2FjX2N0X09CSkNPUFkKK2lmIHRlc3QgLW4gIiRhY19jdF9PQkpDT1BZIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfT0JKQ09QWSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfT0JKQ09QWSIgPiY2CitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjYKK2ZpCisKKyAgT0JKQ09QWT0kYWNfY3RfT0JKQ09QWQorZWxzZQorICBPQkpDT1BZPSIkYWNfY3ZfcHJvZ19PQkpDT1BZIgorZmkKKworZmkKKworIyBEZWZpbmVkIGluIGFjaW5jbHVkZS5tNC4KKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmIEMgc3ltYm9scyBnZXQgYW4gdW5kZXJzY29yZSBhZnRlciBjb21waWxhdGlvbiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmIEMgc3ltYm9scyBnZXQgYW4gdW5kZXJzY29yZSBhZnRlciBjb21waWxhdGlvbi4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7Z3J1Yl9jdl9hc21fdXNjb3JlK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxcRU9GCitpbnQKK2Z1bmMgKGludCAqbGlzdCkKK3sKKyAgKmxpc3QgPSAwOworICByZXR1cm4gKmxpc3Q7Cit9CitFT0YKKworaWYgeyBhY190cnk9JyR7Q0MtY2N9ICR7Q0ZMQUdTfSAtUyBjb25mdGVzdC5jJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QuczsgdGhlbgorICB0cnVlCitlbHNlCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6ICR7Q0MtY2N9IGZhaWxlZCB0byBwcm9kdWNlIGFzc2VtYmx5IGNvZGUiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogJHtDQy1jY30gZmFpbGVkIHRvIHByb2R1Y2UgYXNzZW1ibHkgY29kZSIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworaWYgZ3JlcCBfZnVuYyBjb25mdGVzdC5zID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBncnViX2N2X2FzbV91c2NvcmU9eWVzCitlbHNlCisgIGdydWJfY3ZfYXNtX3VzY29yZT1ubworZmkKKworcm0gLWYgY29uZnRlc3QqCitmaQorCisKK2lmIHRlc3QgIngkZ3J1Yl9jdl9hc21fdXNjb3JlIiA9IHh5ZXM7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0FTTV9VU0NPUkUgJGdydWJfY3ZfYXNtX3VzY29yZQorX0FDRU9GCisKK2ZpCisKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRncnViX2N2X2FzbV91c2NvcmUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGdydWJfY3ZfYXNtX3VzY29yZSIgPiY2CisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyICR7T0JKQ09QWX0gd29ya3MgZm9yIGFic29sdXRlIGFkZHJlc3NlcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgJHtPQkpDT1BZfSB3b3JrcyBmb3IgYWJzb2x1dGUgYWRkcmVzc2VzLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtncnViX2N2X3Byb2dfb2JqY29weV9hYnNvbHV0ZStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC5jIDw8XEVPRgordm9pZAorY21haW4gKHZvaWQpCit7CisgICAqKChpbnQgKikgMHgxMDAwKSA9IDI7Cit9CitFT0YKKworaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1CisgIChldmFsICRhY19jb21waWxlKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHRlc3QgLXMgY29uZnRlc3QubzsgdGhlbiA6CitlbHNlCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6ICR7Q0MtY2N9IGNhbm5vdCBjb21waWxlIEMgc291cmNlIGNvZGUiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogJHtDQy1jY30gY2Fubm90IGNvbXBpbGUgQyBzb3VyY2UgY29kZSIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKK2dydWJfY3ZfcHJvZ19vYmpjb3B5X2Fic29sdXRlPXllcworZm9yIGxpbmtfYWRkciBpbiAyMDAwIDgwMDAgN0MwMDsgZG8KKyAgaWYgeyBhY190cnk9JyR7Q0MtY2N9ICR7Q0ZMQUdTfSAtbm9zdGRsaWIgLVdsLC1OIC1XbCwtVHRleHQgLVdsLCRsaW5rX2FkZHIgY29uZnRlc3QubyAtbyBjb25mdGVzdC5leGVjJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuIDoKKyAgZWxzZQorICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6ICR7Q0MtY2N9IGNhbm5vdCBsaW5rIGF0IGFkZHJlc3MgJGxpbmtfYWRkciIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiAke0NDLWNjfSBjYW5ub3QgbGluayBhdCBhZGRyZXNzICRsaW5rX2FkZHIiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgZmkKKyAgaWYgeyBhY190cnk9JyR7T0JKQ09QWS1vYmpjb3B5fSAtTyBiaW5hcnkgY29uZnRlc3QuZXhlYyBjb25mdGVzdCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbiA6CisgIGVsc2UKKyAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiAke09CSkNPUFktb2JqY29weX0gY2Fubm90IGNyZWF0ZSBiaW5hcnkgZmlsZXMiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogJHtPQkpDT1BZLW9iamNvcHl9IGNhbm5vdCBjcmVhdGUgYmluYXJ5IGZpbGVzIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgIGZpCisgIGlmIHRlc3QgISAtZiBjb25mdGVzdC5vbGQgfHwgeyBhY190cnk9J2NtcCAtcyBjb25mdGVzdC5vbGQgY29uZnRlc3QnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgICBtdiAtZiBjb25mdGVzdCBjb25mdGVzdC5vbGQKKyAgZWxzZQorICAgIGdydWJfY3ZfcHJvZ19vYmpjb3B5X2Fic29sdXRlPW5vCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGdydWJfY3ZfcHJvZ19vYmpjb3B5X2Fic29sdXRlIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRncnViX2N2X3Byb2dfb2JqY29weV9hYnNvbHV0ZSIgPiY2CitpZiB0ZXN0ICJ4JGdydWJfY3ZfcHJvZ19vYmpjb3B5X2Fic29sdXRlIiAhPSB4eWVzOyB0aGVuCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IEdSVUIgcmVxdWlyZXMgYSB3b3JraW5nIGFic29sdXRlIG9iamNvcHk7IHVwZ3JhZGUgeW91ciBiaW51dGlscyIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBHUlVCIHJlcXVpcmVzIGEgd29ya2luZyBhYnNvbHV0ZSBvYmpjb3B5OyB1cGdyYWRlIHlvdXIgYmludXRpbHMiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgYWRkcjMyIG11c3QgYmUgaW4gdGhlIHNhbWUgbGluZSBhcyB0aGUgaW5zdHJ1Y3Rpb24iID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIGFkZHIzMiBtdXN0IGJlIGluIHRoZSBzYW1lIGxpbmUgYXMgdGhlIGluc3RydWN0aW9uLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtncnViX2N2X2FzbV9wcmVmaXhfcmVxdWlyZW1lbnQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QucyA8PFxFT0YKKwkuY29kZTE2CitsMToJYWRkcjMyCW1vdmIJJWFsLCBsMQorRU9GCisKK2lmIHsgYWNfdHJ5PScke0NDLWNjfSAke0NGTEFHU30gLWMgY29uZnRlc3QucycKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0Lm87IHRoZW4KKyAgZ3J1Yl9jdl9hc21fcHJlZml4X3JlcXVpcmVtZW50PXllcworZWxzZQorICBncnViX2N2X2FzbV9wcmVmaXhfcmVxdWlyZW1lbnQ9bm8KK2ZpCisKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworCitpZiB0ZXN0ICJ4JGdydWJfY3ZfYXNtX3ByZWZpeF9yZXF1aXJlbWVudCIgPSB4eWVzOyB0aGVuCisgIGdydWJfdG1wX2FkZHIzMj0iYWRkcjMyIgorICBncnViX3RtcF9kYXRhMzI9ImRhdGEzMiIKK2Vsc2UKKyAgZ3J1Yl90bXBfYWRkcjMyPSJhZGRyMzI7IgorICBncnViX3RtcF9kYXRhMzI9ImRhdGEzMjsiCitmaQorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgQUREUjMyICRncnViX3RtcF9hZGRyMzIKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgREFUQTMyICRncnViX3RtcF9kYXRhMzIKK19BQ0VPRgorCisKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRncnViX2N2X2FzbV9wcmVmaXhfcmVxdWlyZW1lbnQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGdydWJfY3ZfYXNtX3ByZWZpeF9yZXF1aXJlbWVudCIgPiY2CisKKworCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIC5jb2RlMTYgYWRkcjMyIGFzc2VtYmxlciBzdXBwb3J0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIC5jb2RlMTYgYWRkcjMyIGFzc2VtYmxlciBzdXBwb3J0Li4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtncnViX2N2X2FzbV9hZGRyMzIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3Qucy5pbiA8PFxFT0YKKwkuY29kZTE2CitsMToJQEFERFIzMkAJbW92YgklYWwsIGwxCitFT0YKKworaWYgdGVzdCAieCRncnViX2N2X2FzbV9wcmVmaXhfcmVxdWlyZW1lbnQiID0geHllczsgdGhlbgorICBzZWQgLWUgcy9AQUREUjMyQC9hZGRyMzIvIDwgY29uZnRlc3Qucy5pbiA+IGNvbmZ0ZXN0LnMKK2Vsc2UKKyAgc2VkIC1lIHMvQEFERFIzMkAvYWRkcjMyXDsvIDwgY29uZnRlc3Qucy5pbiA+IGNvbmZ0ZXN0LnMKK2ZpCisKK2lmIHsgYWNfdHJ5PScke0NDLWNjfSAke0NGTEFHU30gLWMgY29uZnRlc3QucycKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0Lm87IHRoZW4KKyAgZ3J1Yl9jdl9hc21fYWRkcjMyPXllcworZWxzZQorICBncnViX2N2X2FzbV9hZGRyMzI9bm8KK2ZpCisKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZ3J1Yl9jdl9hc21fYWRkcjMyIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRncnViX2N2X2FzbV9hZGRyMzIiID4mNgoraWYgdGVzdCAieCRncnViX2N2X2FzbV9hZGRyMzIiICE9IHh5ZXM7IHRoZW4KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogR1JVQiByZXF1aXJlcyBHQVMgLmNvZGUxNiBhZGRyMzIgc3VwcG9ydDsgdXBncmFkZSB5b3VyIGJpbnV0aWxzIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IEdSVUIgcmVxdWlyZXMgR0FTIC5jb2RlMTYgYWRkcjMyIHN1cHBvcnQ7IHVwZ3JhZGUgeW91ciBiaW51dGlscyIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBhbiBhYnNvbHV0ZSBpbmRpcmVjdCBjYWxsL2p1bXAgbXVzdCBub3QgYmUgcHJlZml4ZWQgd2l0aCBhbiBhc3RlcmlzayIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgYW4gYWJzb2x1dGUgaW5kaXJlY3QgY2FsbC9qdW1wIG11c3Qgbm90IGJlIHByZWZpeGVkIHdpdGggYW4gYXN0ZXJpc2suLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2dydWJfY3ZfYXNtX2Fic29sdXRlX3dpdGhvdXRfYXN0ZXJpc2src2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QucyA8PFxFT0YKKwlsY2FsbAkqKG9mZnNldCkKK29mZnNldDoKKwkubG9uZwkwCisJLndvcmQJMAorRU9GCisKK2lmIHsgYWNfdHJ5PScke0NDLWNjfSAke0NGTEFHU30gLWMgY29uZnRlc3QucycKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0Lm87IHRoZW4KKyAgZ3J1Yl9jdl9hc21fYWJzb2x1dGVfd2l0aG91dF9hc3Rlcmlzaz1ubworZWxzZQorICBncnViX2N2X2FzbV9hYnNvbHV0ZV93aXRob3V0X2FzdGVyaXNrPXllcworZmkKKworcm0gLWYgY29uZnRlc3QqCitmaQorCisKK2lmIHRlc3QgIngkZ3J1Yl9jdl9hc21fYWJzb2x1dGVfd2l0aG91dF9hc3RlcmlzayIgPSB4eWVzOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEFCU09MVVRFX1dJVEhPVVRfQVNURVJJU0sgMQorX0FDRU9GCisKK2ZpCisKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRncnViX2N2X2FzbV9hYnNvbHV0ZV93aXRob3V0X2FzdGVyaXNrIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRncnViX2N2X2FzbV9hYnNvbHV0ZV93aXRob3V0X2FzdGVyaXNrIiA+JjYKKworCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgc3RhcnQgaXMgZGVmaW5lZCBieSB0aGUgY29tcGlsZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiBzdGFydCBpcyBkZWZpbmVkIGJ5IHRoZSBjb21waWxlci4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7Z3J1Yl9jdl9jaGVja19zdGFydF9zeW1ib2wrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworYXNtICgiaW5jbCBzdGFydCIpCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgZ3J1Yl9jdl9jaGVja19zdGFydF9zeW1ib2w9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2dydWJfY3ZfY2hlY2tfc3RhcnRfc3ltYm9sPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKworaWYgdGVzdCAieCRncnViX2N2X2NoZWNrX3N0YXJ0X3N5bWJvbCIgPSB4eWVzOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfU1RBUlRfU1lNQk9MIDEKK19BQ0VPRgorCitmaQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZ3J1Yl9jdl9jaGVja19zdGFydF9zeW1ib2wiID4mNQorZWNobyAiJHtFQ0hPX1R9JGdydWJfY3ZfY2hlY2tfc3RhcnRfc3ltYm9sIiA+JjYKKworCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgX3N0YXJ0IGlzIGRlZmluZWQgYnkgdGhlIGNvbXBpbGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgX3N0YXJ0IGlzIGRlZmluZWQgYnkgdGhlIGNvbXBpbGVyLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtncnViX2N2X2NoZWNrX3VzY29yZV9zdGFydF9zeW1ib2wrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworYXNtICgiaW5jbCBfc3RhcnQiKQorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGdydWJfY3ZfY2hlY2tfdXNjb3JlX3N0YXJ0X3N5bWJvbD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZ3J1Yl9jdl9jaGVja191c2NvcmVfc3RhcnRfc3ltYm9sPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKworaWYgdGVzdCAieCRncnViX2N2X2NoZWNrX3VzY29yZV9zdGFydF9zeW1ib2wiID0geHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBIQVZFX1VTQ09SRV9TVEFSVF9TWU1CT0wgMQorX0FDRU9GCisKK2ZpCisKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRncnViX2N2X2NoZWNrX3VzY29yZV9zdGFydF9zeW1ib2wiID4mNQorZWNobyAiJHtFQ0hPX1R9JGdydWJfY3ZfY2hlY2tfdXNjb3JlX3N0YXJ0X3N5bWJvbCIgPiY2CisKK2lmIHRlc3QgIngkZ3J1Yl9jdl9jaGVja19zdGFydF9zeW1ib2wiICE9ICJ4eWVzIiBcCisJLWEgIngkZ3J1Yl9jdl9jaGVja191c2NvcmVfc3RhcnRfc3ltYm9sIiAhPSAieHllcyI7IHRoZW4KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogTmVpdGhlciBzdGFydCBub3IgX3N0YXJ0IGlzIGRlZmluZWQiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogTmVpdGhlciBzdGFydCBub3IgX3N0YXJ0IGlzIGRlZmluZWQiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmIF9fYnNzX3N0YXJ0IGlzIGRlZmluZWQgYnkgdGhlIGNvbXBpbGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgX19ic3Nfc3RhcnQgaXMgZGVmaW5lZCBieSB0aGUgY29tcGlsZXIuLi4gJEVDSE9fQyIgPiY2CitpZiB0ZXN0ICIke2dydWJfY3ZfY2hlY2tfdXNjb3JlX3VzY29yZV9ic3Nfc3RhcnRfc3ltYm9sK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKK2FzbSAoImluY2wgX19ic3Nfc3RhcnQiKQorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGdydWJfY3ZfY2hlY2tfdXNjb3JlX3VzY29yZV9ic3Nfc3RhcnRfc3ltYm9sPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCitncnViX2N2X2NoZWNrX3VzY29yZV91c2NvcmVfYnNzX3N0YXJ0X3N5bWJvbD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCisKK2lmIHRlc3QgIngkZ3J1Yl9jdl9jaGVja191c2NvcmVfdXNjb3JlX2Jzc19zdGFydF9zeW1ib2wiID0geHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBIQVZFX1VTQ09SRV9VU0NPUkVfQlNTX1NUQVJUX1NZTUJPTCAxCitfQUNFT0YKKworZmkKKworZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGdydWJfY3ZfY2hlY2tfdXNjb3JlX3VzY29yZV9ic3Nfc3RhcnRfc3ltYm9sIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRncnViX2N2X2NoZWNrX3VzY29yZV91c2NvcmVfYnNzX3N0YXJ0X3N5bWJvbCIgPiY2CisKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmIF9lZGF0YSBpcyBkZWZpbmVkIGJ5IHRoZSBjb21waWxlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmIF9lZGF0YSBpcyBkZWZpbmVkIGJ5IHRoZSBjb21waWxlci4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7Z3J1Yl9jdl9jaGVja191c2NvcmVfZWRhdGFfc3ltYm9sK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKK2FzbSAoImluY2wgX2VkYXRhIikKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBncnViX2N2X2NoZWNrX3VzY29yZV9lZGF0YV9zeW1ib2w9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2dydWJfY3ZfY2hlY2tfdXNjb3JlX2VkYXRhX3N5bWJvbD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCisKK2lmIHRlc3QgIngkZ3J1Yl9jdl9jaGVja191c2NvcmVfZWRhdGFfc3ltYm9sIiA9IHh5ZXM7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgSEFWRV9VU0NPUkVfRURBVEFfU1lNQk9MIDEKK19BQ0VPRgorCitmaQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZ3J1Yl9jdl9jaGVja191c2NvcmVfZWRhdGFfc3ltYm9sIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRncnViX2N2X2NoZWNrX3VzY29yZV9lZGF0YV9zeW1ib2wiID4mNgorCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiBlZGF0YSBpcyBkZWZpbmVkIGJ5IHRoZSBjb21waWxlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmIGVkYXRhIGlzIGRlZmluZWQgYnkgdGhlIGNvbXBpbGVyLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHtncnViX2N2X2NoZWNrX2VkYXRhX3N5bWJvbCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7Cithc20gKCJpbmNsIGVkYXRhIikKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBncnViX2N2X2NoZWNrX2VkYXRhX3N5bWJvbD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworZ3J1Yl9jdl9jaGVja19lZGF0YV9zeW1ib2w9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworCitpZiB0ZXN0ICJ4JGdydWJfY3ZfY2hlY2tfZWRhdGFfc3ltYm9sIiA9IHh5ZXM7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgSEFWRV9FREFUQV9TWU1CT0wgMQorX0FDRU9GCisKK2ZpCisKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRncnViX2N2X2NoZWNrX2VkYXRhX3N5bWJvbCIgPiY1CitlY2hvICIke0VDSE9fVH0kZ3J1Yl9jdl9jaGVja19lZGF0YV9zeW1ib2wiID4mNgorCitpZiB0ZXN0ICJ4JGdydWJfY3ZfY2hlY2tfdXNjb3JlX3VzY29yZV9ic3Nfc3RhcnRfc3ltYm9sIiAhPSAieHllcyIgXAorCS1hICJ4JGdydWJfY3ZfY2hlY2tfdXNjb3JlX2VkYXRhX3N5bWJvbCIgIT0gInh5ZXMiIFwKKwktYSAieCRncnViX2N2X2NoZWNrX2VkYXRhX3N5bWJvbCIgIT0gInh5ZXMiOyB0aGVuCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IE5vbmUgb2YgX19ic3Nfc3RhcnQsIF9lZGF0YSwgZWRhdGEgZGVmaW5lZCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBOb25lIG9mIF9fYnNzX3N0YXJ0LCBfZWRhdGEsIGVkYXRhIGRlZmluZWQiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmIGVuZCBpcyBkZWZpbmVkIGJ5IHRoZSBjb21waWxlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmIGVuZCBpcyBkZWZpbmVkIGJ5IHRoZSBjb21waWxlci4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7Z3J1Yl9jdl9jaGVja19lbmRfc3ltYm9sK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKK2FzbSAoImluY2wgZW5kIikKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBncnViX2N2X2NoZWNrX2VuZF9zeW1ib2w9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2dydWJfY3ZfY2hlY2tfZW5kX3N5bWJvbD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCisKK2lmIHRlc3QgIngkZ3J1Yl9jdl9jaGVja19lbmRfc3ltYm9sIiA9IHh5ZXM7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgSEFWRV9FTkRfU1lNQk9MIDEKK19BQ0VPRgorCitmaQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZ3J1Yl9jdl9jaGVja19lbmRfc3ltYm9sIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRncnViX2N2X2NoZWNrX2VuZF9zeW1ib2wiID4mNgorCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiBfZW5kIGlzIGRlZmluZWQgYnkgdGhlIGNvbXBpbGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgX2VuZCBpcyBkZWZpbmVkIGJ5IHRoZSBjb21waWxlci4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7Z3J1Yl9jdl9jaGVja191c2NvcmVfZW5kX3N5bWJvbCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7Cithc20gKCJpbmNsIF9lbmQiKQorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGdydWJfY3ZfY2hlY2tfdXNjb3JlX2VuZF9zeW1ib2w9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2dydWJfY3ZfY2hlY2tfdXNjb3JlX2VuZF9zeW1ib2w9bm8KK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworCitpZiB0ZXN0ICJ4JGdydWJfY3ZfY2hlY2tfdXNjb3JlX2VuZF9zeW1ib2wiID0geHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBIQVZFX1VTQ09SRV9FTkRfU1lNQk9MIDEKK19BQ0VPRgorCitmaQorCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZ3J1Yl9jdl9jaGVja191c2NvcmVfZW5kX3N5bWJvbCIgPiY1CitlY2hvICIke0VDSE9fVH0kZ3J1Yl9jdl9jaGVja191c2NvcmVfZW5kX3N5bWJvbCIgPiY2CisKK2lmIHRlc3QgIngkZ3J1Yl9jdl9jaGVja19lbmRfc3ltYm9sIiAhPSAieHllcyIgXAorCS1hICJ4JGdydWJfY3ZfY2hlY2tfdXNjb3JlX2VuZF9zeW1ib2wiICE9ICJ4eWVzIjsgdGhlbgorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBOZWl0aGVyIGVuZCBub3IgX2VuZCBpcyBkZWZpbmVkIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IE5laXRoZXIgZW5kIG5vciBfZW5kIGlzIGRlZmluZWQiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKKyMgQ2hlY2sgZm9yIGN1cnNlcyBsaWJyYXJpZXMuCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtY3Vyc2VzIG9yIC0td2l0aG91dC1jdXJzZXMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2N1cnNlcytzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9jdXJzZXMiCisKK2ZpOworCisjIEdldCB0aGUgZmlsZW5hbWUgb3IgdGhlIHdob2xlIGRpc2sgYW5kIG9wZW4gaXQuCisjIEtub3duIHRvIHdvcmsgb24gTmV0QlNELgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBvcGVuZGlzayBpbiAtbHV0aWwiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igb3BlbmRpc2sgaW4gLWx1dGlsLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9saWJfdXRpbF9vcGVuZGlzaytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHV0aWwgICRMSUJTIgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgb3BlbmRpc2sgKCk7CitpbnQKK21haW4gKCkKK3sKK29wZW5kaXNrICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2xpYl91dGlsX29wZW5kaXNrPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl9saWJfdXRpbF9vcGVuZGlzaz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl91dGlsX29wZW5kaXNrIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfdXRpbF9vcGVuZGlzayIgPiY2CitpZiB0ZXN0ICRhY19jdl9saWJfdXRpbF9vcGVuZGlzayA9IHllczsgdGhlbgorICBHUlVCX0xJQlM9IiRHUlVCX0xJQlMgLWx1dGlsIgorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBIQVZFX09QRU5ESVNLIDEKK19BQ0VPRgorCitmaQorCisKKyMgVW5sZXNzIHRoZSB1c2VyIHNwZWNpZnkgLS13aXRob3V0LWN1cnNlcywgY2hlY2sgZm9yIGN1cnNlcy4KK2lmIHRlc3QgIngkd2l0aF9jdXJzZXMiICE9ICJ4bm8iOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igd2dldGNoIGluIC1sbmN1cnNlcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB3Z2V0Y2ggaW4gLWxuY3Vyc2VzLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9saWJfbmN1cnNlc193Z2V0Y2grc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxuY3Vyc2VzICAkTElCUyIKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIHdnZXRjaCAoKTsKK2ludAorbWFpbiAoKQoreword2dldGNoICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CisgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgorCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2xpYl9uY3Vyc2VzX3dnZXRjaD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfY3ZfbGliX25jdXJzZXNfd2dldGNoPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX25jdXJzZXNfd2dldGNoIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfbmN1cnNlc193Z2V0Y2giID4mNgoraWYgdGVzdCAkYWNfY3ZfbGliX25jdXJzZXNfd2dldGNoID0geWVzOyB0aGVuCisgIEdSVUJfTElCUz0iJEdSVUJfTElCUyAtbG5jdXJzZXMiCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfTElCQ1VSU0VTIDEKK19BQ0VPRgorCitlbHNlCisgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igd2dldGNoIGluIC1sY3Vyc2VzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHdnZXRjaCBpbiAtbGN1cnNlcy4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2N1cnNlc193Z2V0Y2grc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxjdXJzZXMgICRMSUJTIgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgd2dldGNoICgpOworaW50CittYWluICgpCit7Cit3Z2V0Y2ggKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgYWNfY3ZfbGliX2N1cnNlc193Z2V0Y2g9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2FjX2N2X2xpYl9jdXJzZXNfd2dldGNoPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX2N1cnNlc193Z2V0Y2giID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9jdXJzZXNfd2dldGNoIiA+JjYKK2lmIHRlc3QgJGFjX2N2X2xpYl9jdXJzZXNfd2dldGNoID0geWVzOyB0aGVuCisgIEdSVUJfTElCUz0iJEdSVUJfTElCUyAtbGN1cnNlcyIKKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgSEFWRV9MSUJDVVJTRVMgMQorX0FDRU9GCisKK2ZpCisKK2ZpCisKK2ZpCisKKworCisjIENoZWNrIGZvciBoZWFkZXJzLgorYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IuLi4gJEVDSE9fQyIgPiY2CisjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgoraWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KKyAgQ1BQPQorZmkKK2lmIHRlc3QgLXogIiRDUFAiOyB0aGVuCisgIGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DUFArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAorICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3BwIiAiL2xpYi9jcHAiCisgICAgZG8KKyAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworZG8KKyAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYworICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKyAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCQkgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1CisgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBhY19jcHBfZXJyPSRhY19jX3ByZXByb2Nfd2Fybl9mbGFnCisgICAgYWNfY3BwX2Vycj0kYWNfY3BwX2VyciRhY19jX3dlcnJvcl9mbGFnCisgIGVsc2UKKyAgICBhY19jcHBfZXJyPQorICBmaQorZWxzZQorICBhY19jcHBfZXJyPXllcworZmkKK2lmIHRlc3QgLXogIiRhY19jcHBfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorCisgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub24tZXhpc3RlbnQgaGVhZGVycworICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgorX0FDRU9GCitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1CisgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBhY19jcHBfZXJyPSRhY19jX3ByZXByb2Nfd2Fybl9mbGFnCisgICAgYWNfY3BwX2Vycj0kYWNfY3BwX2VyciRhY19jX3dlcnJvcl9mbGFnCisgIGVsc2UKKyAgICBhY19jcHBfZXJyPQorICBmaQorZWxzZQorICBhY19jcHBfZXJyPXllcworZmkKK2lmIHRlc3QgLXogIiRhY19jcHBfZXJyIjsgdGhlbgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK2lmICRhY19wcmVwcm9jX29rOyB0aGVuCisgIGJyZWFrCitmaQorCisgICAgZG9uZQorICAgIGFjX2N2X3Byb2dfQ1BQPSRDUFAKKworZmkKKyAgQ1BQPSRhY19jdl9wcm9nX0NQUAorZWxzZQorICBhY19jdl9wcm9nX0NQUD0kQ1BQCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENQUCIgPiY1CitlY2hvICIke0VDSE9fVH0kQ1BQIiA+JjYKK2FjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworZG8KKyAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYworICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKyAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCQkgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1CisgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBhY19jcHBfZXJyPSRhY19jX3ByZXByb2Nfd2Fybl9mbGFnCisgICAgYWNfY3BwX2Vycj0kYWNfY3BwX2VyciRhY19jX3dlcnJvcl9mbGFnCisgIGVsc2UKKyAgICBhY19jcHBfZXJyPQorICBmaQorZWxzZQorICBhY19jcHBfZXJyPXllcworZmkKK2lmIHRlc3QgLXogIiRhY19jcHBfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorCisgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub24tZXhpc3RlbnQgaGVhZGVycworICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgorX0FDRU9GCitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1CisgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBhY19jcHBfZXJyPSRhY19jX3ByZXByb2Nfd2Fybl9mbGFnCisgICAgYWNfY3BwX2Vycj0kYWNfY3BwX2VyciRhY19jX3dlcnJvcl9mbGFnCisgIGVsc2UKKyAgICBhY19jcHBfZXJyPQorICBmaQorZWxzZQorICBhY19jcHBfZXJyPXllcworZmkKK2lmIHRlc3QgLXogIiRhY19jcHBfZXJyIjsgdGhlbgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisKK2RvbmUKKyMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK2lmICRhY19wcmVwcm9jX29rOyB0aGVuCisgIDoKK2Vsc2UKKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQyBwcmVwcm9jZXNzb3IgXCIkQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBDIHByZXByb2Nlc3NvciBcIiRDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQorCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBlZ3JlcCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBlZ3JlcC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19lZ3JlcCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiBlY2hvIGEgfCAoZ3JlcCAtRSAnKGF8YiknKSA+L2Rldi9udWxsIDI+JjEKKyAgICB0aGVuIGFjX2N2X3Byb2dfZWdyZXA9J2dyZXAgLUUnCisgICAgZWxzZSBhY19jdl9wcm9nX2VncmVwPSdlZ3JlcCcKKyAgICBmaQorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2VncmVwIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2VncmVwIiA+JjYKKyBFR1JFUD0kYWNfY3ZfcHJvZ19lZ3JlcAorCisKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICRFQ0hPX0MiID4mNgoraWYgdGVzdCAiJHthY19jdl9oZWFkZXJfc3RkYytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2hlYWRlcl9zdGRjPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCithY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIDoKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpZiAoKCcgJyAmIDB4MEZGKSA9PSAweDAyMCkKKyMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKyMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKKyNlbHNlCisjIGRlZmluZSBJU0xPV0VSKGMpIFwKKwkJICAgKCgnYScgPD0gKGMpICYmIChjKSA8PSAnaScpIFwKKwkJICAgICB8fCAoJ2onIDw9IChjKSAmJiAoYykgPD0gJ3InKSBcCisJCSAgICAgfHwgKCdzJyA8PSAoYykgJiYgKGMpIDw9ICd6JykpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gKChjKSB8IDB4NDApIDogKGMpKQorI2VuZGlmCisKKyNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCitpbnQKK21haW4gKCkKK3sKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICBpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpCisJfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpCisgICAgICBleGl0KDIpOworICBleGl0ICgwKTsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2xpbmspIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyggZXhpdCAkYWNfc3RhdHVzICkKK2FjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitmaQorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKK19BQ0VPRgorCitmaQorCisjIE9uIElSSVggNS4zLCBzeXMvdHlwZXMgYW5kIGludHR5cGVzLmggYXJlIGNvbmZsaWN0aW5nLgorCisKKworCisKKworCisKKworZm9yIGFjX2hlYWRlciBpbiBzeXMvdHlwZXMuaCBzeXMvc3RhdC5oIHN0ZGxpYi5oIHN0cmluZy5oIG1lbW9yeS5oIHN0cmluZ3MuaCBcCisJCSAgaW50dHlwZXMuaCBzdGRpbnQuaCB1bmlzdGQuaAorZG8KK2FzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2CitpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKworI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKKwkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj15ZXMiCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK2V2YWwgIiRhc19hY19IZWFkZXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjUKK2VjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjYKK2lmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworCisKKworCisKK2ZvciBhY19oZWFkZXIgaW4gc3RyaW5nLmggc3RyaW5ncy5oIG5jdXJzZXMvY3Vyc2VzLmggbmN1cnNlcy5oIGN1cnNlcy5oCitkbworYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCitpZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNgoraWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY19IZWFkZXIrc2V0fVwiID0gc2V0IjsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZmkKK2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjUKK2VjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjYKK2Vsc2UKKyAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/CitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eS4uLiAkRUNIT19DIiA+JjYKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyNpbmNsdWRlIDwkYWNfaGVhZGVyPgorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCisJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworYWNfaGVhZGVyX2NvbXBpbGVyPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjYKKworIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/CitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UuLi4gJEVDSE9fQyIgPiY2CitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDwkYWNfaGVhZGVyPgorX0FDRU9GCitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dFwiIikgPiY1CisgIChldmFsICRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGw7IHRoZW4KKyAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICBhY19jcHBfZXJyPSRhY19jX3ByZXByb2Nfd2Fybl9mbGFnCisgICAgYWNfY3BwX2Vycj0kYWNfY3BwX2VyciRhY19jX3dlcnJvcl9mbGFnCisgIGVsc2UKKyAgICBhY19jcHBfZXJyPQorICBmaQorZWxzZQorICBhY19jcHBfZXJyPXllcworZmkKK2lmIHRlc3QgLXogIiRhY19jcHBfZXJyIjsgdGhlbgorICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICBhY19oZWFkZXJfcHJlcHJvYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9wcmVwcm9jIiA+JjYKKworIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/CitjYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluCisgIHllczpubzogKQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQorICAgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworICAgIDs7CisgIG5vOnllczoqICkKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjI7fQorICAgICgKKyAgICAgIGNhdCA8PFxfQVNCT1gKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIFJlcG9ydCB0aGlzIHRvIGJ1Zy1ncnViQGdudS5vcmcgIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKK19BU0JPWAorICAgICkgfAorICAgICAgc2VkICJzL14vJGFzX21lOiBXQVJOSU5HOiAgICAgLyIgPiYyCisgICAgOzsKK2VzYWMKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNgoraWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY19IZWFkZXIrc2V0fVwiID0gc2V0IjsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBldmFsICIkYXNfYWNfSGVhZGVyPVwkYWNfaGVhZGVyX3ByZXByb2MiCitmaQorZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNQorZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNgorCitmaQoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCisjIENoZWNrIGZvciB1c2VyIG9wdGlvbnMuCisKKyMgZmlsZXN5c3RlbXMgc3VwcG9ydC4KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1leHQyZnMgb3IgLS1kaXNhYmxlLWV4dDJmcyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9leHQyZnMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX2V4dDJmcyIKKworZmk7CisKK2lmIHRlc3QgeCIkZW5hYmxlX2V4dDJmcyIgIT0geG5vOyB0aGVuCisgIEZTWVNfQ0ZMQUdTPSIkRlNZU19DRkxBR1MgLURGU1lTX0VYVDJGUz0xIgorZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZhdCBvciAtLWRpc2FibGUtZmF0IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2ZhdCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfZmF0IgorCitmaTsKKworaWYgdGVzdCB4IiRlbmFibGVfZmF0IiAhPSB4bm87IHRoZW4KKyAgRlNZU19DRkxBR1M9IiRGU1lTX0NGTEFHUyAtREZTWVNfRkFUPTEiCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZmZzIG9yIC0tZGlzYWJsZS1mZnMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfZmZzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9mZnMiCisKK2ZpOworCitpZiB0ZXN0IHgiJGVuYWJsZV9mZnMiICE9IHhubzsgdGhlbgorICBGU1lTX0NGTEFHUz0iJEZTWVNfQ0ZMQUdTIC1ERlNZU19GRlM9MSIKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS11ZnMyIG9yIC0tZGlzYWJsZS11ZnMyIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3VmczIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3VmczIiCisKK2ZpOworCitpZiB0ZXN0IHgiJGVuYWJsZV91ZnMyIiAhPSB4bm87IHRoZW4KKyAgRlNZU19DRkxBR1M9IiRGU1lTX0NGTEFHUyAtREZTWVNfVUZTMj0xIgorZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1pbml4IG9yIC0tZGlzYWJsZS1taW5peCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9taW5peCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbWluaXgiCisKK2ZpOworCitpZiB0ZXN0IHgiJGVuYWJsZV9taW5peCIgIT0geG5vOyB0aGVuCisgIEZTWVNfQ0ZMQUdTPSIkRlNZU19DRkxBR1MgLURGU1lTX01JTklYPTEiCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcmVpc2VyZnMgb3IgLS1kaXNhYmxlLXJlaXNlcmZzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3JlaXNlcmZzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9yZWlzZXJmcyIKKworZmk7CisKK2lmIHRlc3QgeCIkZW5hYmxlX3JlaXNlcmZzIiAhPSB4bm87IHRoZW4KKyAgRlNZU19DRkxBR1M9IiRGU1lTX0NGTEFHUyAtREZTWVNfUkVJU0VSRlM9MSIKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS12c3RhZnMgb3IgLS1kaXNhYmxlLXZzdGFmcyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV92c3RhZnMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3ZzdGFmcyIKKworZmk7CisKK2lmIHRlc3QgeCIkZW5hYmxlX3ZzdGFmcyIgIT0geG5vOyB0aGVuCisgIEZTWVNfQ0ZMQUdTPSIkRlNZU19DRkxBR1MgLURGU1lTX1ZTVEFGUz0xIgorZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWpmcyBvciAtLWRpc2FibGUtamZzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2pmcytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfamZzIgorCitmaTsKKworaWYgdGVzdCB4IiRlbmFibGVfamZzIiAhPSB4bm87IHRoZW4KKyAgRlNZU19DRkxBR1M9IiRGU1lTX0NGTEFHUyAtREZTWVNfSkZTPTEiCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUteGZzIG9yIC0tZGlzYWJsZS14ZnMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfeGZzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV94ZnMiCisKK2ZpOworCitpZiB0ZXN0IHgiJGVuYWJsZV94ZnMiICE9IHhubzsgdGhlbgorICBGU1lTX0NGTEFHUz0iJEZTWVNfQ0ZMQUdTIC1ERlNZU19YRlM9MSIKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1pc285NjYwIG9yIC0tZGlzYWJsZS1pc285NjYwIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2lzbzk2NjArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX2lzbzk2NjAiCisKK2ZpOworCitpZiB0ZXN0IHgiJGVuYWJsZV9pc285NjYwIiAhPSB4bm87IHRoZW4KKyAgRlNZU19DRkxBR1M9IiRGU1lTX0NGTEFHUyAtREZTWVNfSVNPOTY2MD0xIgorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZ3VuemlwIG9yIC0tZGlzYWJsZS1ndW56aXAgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfZ3VuemlwK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9ndW56aXAiCisKK2ZpOworCitpZiB0ZXN0IHgiJGVuYWJsZV9ndW56aXAiID0geG5vOyB0aGVuCisgIEZTWVNfQ0ZMQUdTPSIkRlNZU19DRkxBR1MgLUROT19ERUNPTVBSRVNTSU9OPTEiCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWQ1LXBhc3N3b3JkIG9yIC0tZGlzYWJsZS1tZDUtcGFzc3dvcmQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbWQ1X3Bhc3N3b3JkK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9tZDVfcGFzc3dvcmQiCisKK2ZpOworaWYgdGVzdCAieCRlbmFibGVfbWQ1X3Bhc3N3b3JkIiAhPSB4bm87IHRoZW4KKyAgRlNZU19DRkxBR1M9IiRGU1lTX0NGTEFHUyAtRFVTRV9NRDVfUEFTU1dPUkRTPTEiCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcGFja2V0LXJldHJhbnNtaXNzaW9uIG9yIC0tZGlzYWJsZS1wYWNrZXQtcmV0cmFuc21pc3Npb24gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfcGFja2V0X3JldHJhbnNtaXNzaW9uK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9wYWNrZXRfcmV0cmFuc21pc3Npb24iCisKK2ZpOworaWYgdGVzdCAieCRlbmFibGVfcGFja2V0X3JldHJhbnNtaXNzaW9uIiAhPSB4bm87IHRoZW4KKyAgTkVUX0VYVFJBRkxBR1M9IiRORVRfRVhUUkFGTEFHUyAtRENPTkdFU1RFRD0xIgorZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXBjaS1kaXJlY3Qgb3IgLS1kaXNhYmxlLXBjaS1kaXJlY3Qgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfcGNpX2RpcmVjdCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfcGNpX2RpcmVjdCIKKworZmk7CitpZiB0ZXN0ICJ4JGVuYWJsZV9wY2lfZGlyZWN0IiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0VYVFJBRkxBR1M9IiRORVRfRVhUUkFGTEFHUyAtRENPTkZJR19QQ0lfRElSRUNUPTEiCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtM2M1MDkgb3IgLS1kaXNhYmxlLTNjNTA5IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlXzNjNTA5K3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV8zYzUwOSIKKworZmk7CitpZiB0ZXN0ICJ4JGVuYWJsZV8zYzUwOSIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV8zQzUwOSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIDNjNTA5Lm8iCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtM2M1Mjkgb3IgLS1kaXNhYmxlLTNjNTI5IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlXzNjNTI5K3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV8zYzUyOSIKKworZmk7CitpZiB0ZXN0ICJ4JGVuYWJsZV8zYzUyOSIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV8zQzUyOT0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgM2M1MjkubyIKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS0zYzU5NSBvciAtLWRpc2FibGUtM2M1OTUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfM2M1OTUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlXzNjNTk1IgorCitmaTsKK2lmIHRlc3QgIngkZW5hYmxlXzNjNTk1IiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFXzNDNTk1PTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyAzYzU5NS5vIgorZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLTNjOTB4IG9yIC0tZGlzYWJsZS0zYzkweCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV8zYzkweCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfM2M5MHgiCisKK2ZpOworaWYgdGVzdCAieCRlbmFibGVfM2M5MHgiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfM0M5MFg9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIDNjOTB4Lm8iCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY3M4OXgwIG9yIC0tZGlzYWJsZS1jczg5eDAgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfY3M4OXgwK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9jczg5eDAiCisKK2ZpOworaWYgdGVzdCAieCRlbmFibGVfY3M4OXgwIiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX0NTODlYMD0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgY3M4OXgwLm8iCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGF2aWNvbSBvciAtLWRpc2FibGUtZGF2aWNvbSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9kYXZpY29tK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9kYXZpY29tIgorCitmaTsKK2lmIHRlc3QgIngkZW5hYmxlX2Rhdmljb20iID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfREFWSUNPTT0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgZGF2aWNvbS5vIgorZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWRlcGNhIG9yIC0tZGlzYWJsZS1kZXBjYSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9kZXBjYStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfZGVwY2EiCisKK2ZpOworaWYgdGVzdCAieCRlbmFibGVfZGVwY2EiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfREVQQ0E9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIGRlcGNhLm8iCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZWVwcm8gb3IgLS1kaXNhYmxlLWVlcHJvIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2VlcHJvK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9lZXBybyIKKworZmk7CitpZiB0ZXN0ICJ4JGVuYWJsZV9lZXBybyIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9FRVBSTz0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgZWVwcm8ubyIKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1lZXBybzEwMCBvciAtLWRpc2FibGUtZWVwcm8xMDAgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfZWVwcm8xMDArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX2VlcHJvMTAwIgorCitmaTsKK2lmIHRlc3QgIngkZW5hYmxlX2VlcHJvMTAwIiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX0VFUFJPMTAwPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBlZXBybzEwMC5vIgorZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWVwaWMxMDAgb3IgLS1kaXNhYmxlLWVwaWMxMDAgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfZXBpYzEwMCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfZXBpYzEwMCIKKworZmk7CitpZiB0ZXN0ICJ4JGVuYWJsZV9lcGljMTAwIiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX0VQSUMxMDA9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIGVwaWMxMDAubyIKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS0zYzUwNyBvciAtLWRpc2FibGUtM2M1MDcgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfM2M1MDcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlXzNjNTA3IgorCitmaTsKK2lmIHRlc3QgIngkZW5hYmxlXzNjNTA3IiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFXzNDNTA3PTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyAzYzUwNy5vIgorZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWV4b3MyMDUgb3IgLS1kaXNhYmxlLWV4b3MyMDUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfZXhvczIwNStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfZXhvczIwNSIKKworZmk7CitpZiB0ZXN0ICJ4JGVuYWJsZV9leG9zMjA1IiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX0VYT1MyMDU9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIGV4b3MyMDUubyIKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1uaTUyMTAgb3IgLS1kaXNhYmxlLW5pNTIxMCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9uaTUyMTArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX25pNTIxMCIKKworZmk7CitpZiB0ZXN0ICJ4JGVuYWJsZV9uaTUyMTAiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfTkk1MjEwPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBuaTUyMTAubyIKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1sYW5jZSBvciAtLWRpc2FibGUtbGFuY2Ugd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbGFuY2Urc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX2xhbmNlIgorCitmaTsKK2lmIHRlc3QgIngkZW5hYmxlX2xhbmNlIiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX0xBTkNFPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBsYW5jZS5vIgorZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5lMjEwMCBvciAtLWRpc2FibGUtbmUyMTAwIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX25lMjEwMCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbmUyMTAwIgorCitmaTsKK2lmIHRlc3QgIngkZW5hYmxlX25lMjEwMCIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9ORTIxMDA9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIG5lMjEwMC5vIgorZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5pNjUxMCBvciAtLWRpc2FibGUtbmk2NTEwIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX25pNjUxMCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbmk2NTEwIgorCitmaTsKK2lmIHRlc3QgIngkZW5hYmxlX25pNjUxMCIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9OSTY1MTA9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIG5pNjUxMC5vIgorZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5hdHNlbWkgb3IgLS1kaXNhYmxlLW5hdHNlbWkgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbmF0c2VtaStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbmF0c2VtaSIKKworZmk7CitpZiB0ZXN0ICJ4JGVuYWJsZV9uYXRzZW1pIiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX05BVFNFTUk9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIG5hdHNlbWkubyIKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1uaTUwMTAgb3IgLS1kaXNhYmxlLW5pNTAxMCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9uaTUwMTArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX25pNTAxMCIKKworZmk7CitpZiB0ZXN0ICJ4JGVuYWJsZV9uaTUwMTAiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfTkk1MDEwPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBuaTUwMTAubyIKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS0zYzUwMyBvciAtLWRpc2FibGUtM2M1MDMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfM2M1MDMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlXzNjNTAzIgorCitmaTsKK2lmIHRlc3QgIngkZW5hYmxlXzNjNTAzIiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFXzNDNTAzPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyAzYzUwMy5vIgorZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5lIG9yIC0tZGlzYWJsZS1uZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9uZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbmUiCisKK2ZpOworaWYgdGVzdCAieCRlbmFibGVfbmUiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfTkU9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIG5lLm8iCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbnM4MzkwIG9yIC0tZGlzYWJsZS1uczgzOTAgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbnM4MzkwK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9uczgzOTAiCisKK2ZpOworaWYgdGVzdCAieCRlbmFibGVfbnM4MzkwIiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX05TODM5MD0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgbnM4MzkwLm8iCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtd2Qgb3IgLS1kaXNhYmxlLXdkIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3dkK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV93ZCIKKworZmk7CitpZiB0ZXN0ICJ4JGVuYWJsZV93ZCIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9XRD0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgd2QubyIKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1vdHVsaXAgb3IgLS1kaXNhYmxlLW90dWxpcCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9vdHVsaXArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX290dWxpcCIKKworZmk7CitpZiB0ZXN0ICJ4JGVuYWJsZV9vdHVsaXAiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfT1RVTElQPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBvdHVsaXAubyIKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ydGw4MTM5IG9yIC0tZGlzYWJsZS1ydGw4MTM5IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3J0bDgxMzkrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3J0bDgxMzkiCisKK2ZpOworaWYgdGVzdCAieCRlbmFibGVfcnRsODEzOSIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9SVEw4MTM5PTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBydGw4MTM5Lm8iCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2lzOTAwIG9yIC0tZGlzYWJsZS1zaXM5MDAgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2lzOTAwK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaXM5MDAiCisKK2ZpOworaWYgdGVzdCAieCRlbmFibGVfc2lzOTAwIiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX1NJUzkwMD0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgc2lzOTAwLm8iCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2stZzE2IG9yIC0tZGlzYWJsZS1zay1nMTYgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2tfZzE2K3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9za19nMTYiCisKK2ZpOworaWYgdGVzdCAieCRlbmFibGVfc2tfZzE2IiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX1NLX0cxNj0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgc2tfZzE2Lm8iCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc21jOTAwMCBvciAtLWRpc2FibGUtc21jOTAwMCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zbWM5MDAwK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zbWM5MDAwIgorCitmaTsKK2lmIHRlc3QgIngkZW5hYmxlX3NtYzkwMDAiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfU01DOTAwMD0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgc21jOTAwMC5vIgorZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRpYXJhIG9yIC0tZGlzYWJsZS10aWFyYSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV90aWFyYStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfdGlhcmEiCisKK2ZpOworaWYgdGVzdCAieCRlbmFibGVfdGlhcmEiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfVElBUkE9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIHRpYXJhLm8iCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdHVsaXAgb3IgLS1kaXNhYmxlLXR1bGlwIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3R1bGlwK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV90dWxpcCIKKworZmk7CitpZiB0ZXN0ICJ4JGVuYWJsZV90dWxpcCIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9UVUxJUD0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgdHVsaXAubyIKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS12aWEtcmhpbmUgb3IgLS1kaXNhYmxlLXZpYS1yaGluZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV92aWFfcmhpbmUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3ZpYV9yaGluZSIKKworZmk7CitpZiB0ZXN0ICJ4JGVuYWJsZV92aWFfcmhpbmUiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfVklBX1JISU5FPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyB2aWFfcmhpbmUubyIKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS13ODljODQwIG9yIC0tZGlzYWJsZS13ODljODQwIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3c4OWM4NDArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3c4OWM4NDAiCisKK2ZpOworaWYgdGVzdCAieCRlbmFibGVfdzg5Yzg0MCIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9XODlDODQwPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyB3ODljODQwLm8iCitmaQorCisKKworaWYgdGVzdCAieCRORVRfQ0ZMQUdTIiAhPSB4OyB0aGVuCisgIE5FVEJPT1RfU1VQUE9SVF9UUlVFPQorICBORVRCT09UX1NVUFBPUlRfRkFMU0U9JyMnCitlbHNlCisgIE5FVEJPT1RfU1VQUE9SVF9UUlVFPScjJworICBORVRCT09UX1NVUFBPUlRfRkFMU0U9CitmaQorCitpZiB0ZXN0ICJ4JE5FVF9DRkxBR1MiICE9IHg7IHRoZW4KKyAgRlNZU19DRkxBR1M9IiRGU1lTX0NGTEFHUyAtREZTWVNfVEZUUD0xIgorZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLTNjNTAzLXNobWVtIG9yIC0tZGlzYWJsZS0zYzUwMy1zaG1lbSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV8zYzUwM19zaG1lbStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfM2M1MDNfc2htZW0iCisKK2ZpOworaWYgdGVzdCAieCRlbmFibGVfM2M1MDNfc2htZW0iID0geHllczsgdGhlbgorICBORVRfRVhUUkFGTEFHUz0iJE5FVF9FWFRSQUZMQUdTIC1EVDUwM19TSE1FTT0xIgorZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLTNjNTAzLWF1aSBvciAtLWRpc2FibGUtM2M1MDMtYXVpIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlXzNjNTAzX2F1aStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfM2M1MDNfYXVpIgorCitmaTsKK2lmIHRlc3QgIngkZW5hYmxlXzNjNTAzX2F1aSIgPSB4eWVzOyB0aGVuCisgIE5FVF9FWFRSQUZMQUdTPSIkTkVUX0VYVFJBRkxBR1MgLURUNTAzX0FVST0xIgorZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWNvbXBleC1ybDIwMDAtZml4IG9yIC0tZGlzYWJsZS1jb21wZXgtcmwyMDAwLWZpeCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9jb21wZXhfcmwyMDAwX2ZpeCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfY29tcGV4X3JsMjAwMF9maXgiCisKK2ZpOworaWYgdGVzdCAieCRlbmFibGVfY29tcGV4X3JsMjAwMF9maXgiID0geHllczsgdGhlbgorICBORVRfRVhUUkFGTEFHUz0iJE5FVF9FWFRSQUZMQUdTIC1EQ09NUEVYX1JMMjAwMF9GSVg9MSIKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zbWM5MDAwLXNjYW4gb3IgLS1kaXNhYmxlLXNtYzkwMDAtc2NhbiB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zbWM5MDAwX3NjYW4rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NtYzkwMDBfc2NhbiIKKyAgTkVUX0VYVFJBRkxBR1M9IiRORVRfRVhUUkFGTEFHUyAtRFNNQzkwMDBfU0NBTj0kZW5hYmxlX3NtYzkwMDBfc2NhbiIKK2ZpOworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmUtc2NhbiBvciAtLWRpc2FibGUtbmUtc2NhbiB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9uZV9zY2FuK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9uZV9zY2FuIgorICBORVRfRVhUUkFGTEFHUz0iJE5FVF9FWFRSQUZMQUdTIC1ETkVfU0NBTj0kZW5hYmxlX25lX3NjYW4iCitlbHNlCisgIE5FVF9FWFRSQUZMQUdTPSIkTkVUX0VYVFJBRkxBR1MgLURORV9TQ0FOPTB4MjgwLDB4MzAwLDB4MzIwLDB4MzQwIgorZmk7CisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS13ZC1kZWZhdWx0LW1lbSBvciAtLWRpc2FibGUtd2QtZGVmYXVsdC1tZW0gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfd2RfZGVmYXVsdF9tZW0rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3dkX2RlZmF1bHRfbWVtIgorICBORVRfRVhUUkFGTEFHUz0iJE5FVF9FWFRSQUZMQUdTIC1EV0RfREVGQVVMVF9NRU09JGVuYWJsZV93ZF9kZWZhdWx0X21lbSIKK2Vsc2UKKyAgTkVUX0VYVFJBRkxBR1M9IiRORVRfRVhUUkFGTEFHUyAtRFdEX0RFRkFVTFRfTUVNPTB4Q0MwMDAiCitmaTsKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWNzLXNjYW4gb3IgLS1kaXNhYmxlLWNzLXNjYW4gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfY3Nfc2NhbitzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfY3Nfc2NhbiIKKyAgTkVUX0VYVFJBRkxBR1M9IiRORVRfRVhUUkFGTEFHUyAtRENTX1NDQU49JGVuYWJsZV9jc19zY2FuIgorZmk7CisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1kaXNrbGVzcyBvciAtLWRpc2FibGUtZGlza2xlc3Mgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfZGlza2xlc3Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX2Rpc2tsZXNzIgorCitmaTsKKworCitpZiB0ZXN0ICJ4JGVuYWJsZV9kaXNrbGVzcyIgPSB4eWVzOyB0aGVuCisgIERJU0tMRVNTX1NVUFBPUlRfVFJVRT0KKyAgRElTS0xFU1NfU1VQUE9SVF9GQUxTRT0nIycKK2Vsc2UKKyAgRElTS0xFU1NfU1VQUE9SVF9UUlVFPScjJworICBESVNLTEVTU19TVVBQT1JUX0ZBTFNFPQorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtaGVyY3VsZXMgb3IgLS1kaXNhYmxlLWhlcmN1bGVzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2hlcmN1bGVzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9oZXJjdWxlcyIKKworZmk7CisKKworaWYgdGVzdCAieCRlbmFibGVfaGVyY3VsZXMiICE9IHhubzsgdGhlbgorICBIRVJDVUxFU19TVVBQT1JUX1RSVUU9CisgIEhFUkNVTEVTX1NVUFBPUlRfRkFMU0U9JyMnCitlbHNlCisgIEhFUkNVTEVTX1NVUFBPUlRfVFJVRT0nIycKKyAgSEVSQ1VMRVNfU1VQUE9SVF9GQUxTRT0KK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNlcmlhbCBvciAtLWRpc2FibGUtc2VyaWFsIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NlcmlhbCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2VyaWFsIgorCitmaTsKKworCitpZiB0ZXN0ICJ4JGVuYWJsZV9zZXJpYWwiICE9IHhubzsgdGhlbgorICBTRVJJQUxfU1VQUE9SVF9UUlVFPQorICBTRVJJQUxfU1VQUE9SVF9GQUxTRT0nIycKK2Vsc2UKKyAgU0VSSUFMX1NVUFBPUlRfVFJVRT0nIycKKyAgU0VSSUFMX1NVUFBPUlRfRkFMU0U9CitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zZXJpYWwtc3BlZWQtc2ltdWxhdGlvbiBvciAtLWRpc2FibGUtc2VyaWFsLXNwZWVkLXNpbXVsYXRpb24gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2VyaWFsX3NwZWVkX3NpbXVsYXRpb24rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NlcmlhbF9zcGVlZF9zaW11bGF0aW9uIgorCitmaTsKKworCitpZiB0ZXN0ICJ4JGVuYWJsZV9zZXJpYWxfc3BlZWRfc2ltdWxhdGlvbiIgPSB4eWVzOyB0aGVuCisgIFNFUklBTF9TUEVFRF9TSU1VTEFUSU9OX1RSVUU9CisgIFNFUklBTF9TUEVFRF9TSU1VTEFUSU9OX0ZBTFNFPScjJworZWxzZQorICBTRVJJQUxfU1BFRURfU0lNVUxBVElPTl9UUlVFPScjJworICBTRVJJQUxfU1BFRURfU0lNVUxBVElPTl9GQUxTRT0KK2ZpCisKKworIyBTYW5pdHkgY2hlY2suCitpZiB0ZXN0ICJ4JGVuYWJsZV9kaXNrbGVzcyIgPSB4eWVzOyB0aGVuCisgIGlmIHRlc3QgIngkTkVUX0NGTEFHUyIgPSB4OyB0aGVuCisgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogWW91IG11c3QgZW5hYmxlIGF0IGxlYXN0IG9uZSBuZXR3b3JrIGRyaXZlciIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBZb3UgbXVzdCBlbmFibGUgYXQgbGVhc3Qgb25lIG5ldHdvcmsgZHJpdmVyIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgIGZpCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcHJlc2V0LW1lbnUgb3IgLS1kaXNhYmxlLXByZXNldC1tZW51IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3ByZXNldF9tZW51K3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9wcmVzZXRfbWVudSIKKworZmk7CitpZiB0ZXN0ICJ4JGVuYWJsZV9wcmVzZXRfbWVudSIgPSB4OyB0aGVuCisgIDoKK2Vsc2UKKyAgaWYgdGVzdCAtciAkZW5hYmxlX3ByZXNldF9tZW51OyB0aGVuCisKKyMgQmVjYXVzZSBlYXJseSB2ZXJzaW9ucyBvZiBHTlUgc2VkIDMueCBhcmUgdG9vIGJ1Z2d5LCB1c2UgYSBDIHByb2dyYW0KKyMgaW5zdGVhZCBvZiBzaGVsbCBjb21tYW5kcy4gKnNpZ2gqCitjYXQgPmNvbmZ0ZXN0LmMgPDxcRU9GCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50CittYWluICh2b2lkKQoreworICBpbnQgYzsKKworICB3aGlsZSAoKGMgPSBnZXRjaGFyICgpKSAhPSBFT0YpCisgICAgeworICAgICAgc3dpdGNoIChjKQorICAgICAgICB7CisJY2FzZSAnXG4nOgorCSAgZnB1dHMgKCJcXG4iLCBzdGRvdXQpOworCSAgYnJlYWs7CisJY2FzZSAnXHInOgorCSAgZnB1dHMgKCJcXHIiLCBzdGRvdXQpOworCSAgYnJlYWs7CisJY2FzZSAnXFwnOgorCSAgZnB1dHMgKCJcXFxcIiwgc3Rkb3V0KTsKKwkgIGJyZWFrOworCWNhc2UgJyInOgorCSAgZnB1dHMgKCJcXFwiIiwgc3Rkb3V0KTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBwdXRjaGFyIChjKTsKKwl9CisgICAgfQorCisgIHJldHVybiAwOworfQorRU9GCisKK2lmIHsgYWNfdHJ5PScke0NDLWNjfSAke0NGTEFHU30gY29uZnRlc3QuYyAtbyBjb25mdGVzdCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCisgIGdydWJfdG1wX3ZhbHVlPWAuL2NvbmZ0ZXN0IDwgIiRlbmFibGVfcHJlc2V0X21lbnUiYAorZWxzZQorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiAke0NDLWNjfSBmYWlsZWQgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlIGZpbGUiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogJHtDQy1jY30gZmFpbGVkIHRvIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSBmaWxlIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUFJFU0VUX01FTlVfU1RSSU5HICIkZ3J1Yl90bXBfdmFsdWUiCitfQUNFT0YKKworcm0gLWYgY29uZnRlc3QqCisKKyAgZWxzZQorICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IENhbm5vdCByZWFkIHRoZSBwcmVzZXQgbWVudSBmaWxlICRlbmFibGVfcHJlc2V0X21lbnUiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogQ2Fubm90IHJlYWQgdGhlIHByZXNldCBtZW51IGZpbGUgJGVuYWJsZV9wcmVzZXRfbWVudSIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICBmaQorZmkKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWV4YW1wbGUta2VybmVsIG9yIC0tZGlzYWJsZS1leGFtcGxlLWtlcm5lbCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9leGFtcGxlX2tlcm5lbCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfZXhhbXBsZV9rZXJuZWwiCisKK2ZpOworCisKK2lmIHRlc3QgIngkZW5hYmxlX2V4YW1wbGVfa2VybmVsIiA9IHh5ZXM7IHRoZW4KKyAgQlVJTERfRVhBTVBMRV9LRVJORUxfVFJVRT0KKyAgQlVJTERfRVhBTVBMRV9LRVJORUxfRkFMU0U9JyMnCitlbHNlCisgIEJVSUxEX0VYQU1QTEVfS0VSTkVMX1RSVUU9JyMnCisgIEJVSUxEX0VYQU1QTEVfS0VSTkVMX0ZBTFNFPQorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtYXV0by1saW51eC1tZW0tb3B0IG9yIC0tZGlzYWJsZS1hdXRvLWxpbnV4LW1lbS1vcHQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfYXV0b19saW51eF9tZW1fb3B0K3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9hdXRvX2xpbnV4X21lbV9vcHQiCisKK2ZpOworaWYgdGVzdCAieCRlbmFibGVfYXV0b19saW51eF9tZW1fb3B0IiA9IHhubzsgdGhlbgorICA6CitlbHNlCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEFVVE9fTElOVVhfTUVNX09QVCAxCitfQUNFT0YKKworZmkKKworCisKKworCisKK0NDQVNGTEFHUz0nJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKScKKworCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY19jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMgTWFrZWZpbGUgc3RhZ2UxL01ha2VmaWxlIHN0YWdlMi9NYWtlZmlsZSBkb2NzL01ha2VmaWxlIGxpYi9NYWtlZmlsZSB1dGlsL01ha2VmaWxlIGdydWIvTWFrZWZpbGUgbmV0Ym9vdC9NYWtlZmlsZSB1dGlsL2dydWItaW1hZ2UgdXRpbC9ncnViLWluc3RhbGwgdXRpbC9ncnViLW1kNS1jcnlwdCB1dGlsL2dydWItdGVybWluZm8gdXRpbC9ncnViLXNldC1kZWZhdWx0IgorCitjYXQgPmNvbmZjYWNoZSA8PFxfQUNFT0YKKyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCisjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLCBzZWUgY29uZmlndXJlJ3Mgb3B0aW9uIC0tY29uZmlnLWNhY2hlLgorIyBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuICBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndAorIyB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisjCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdAorIyB0aGUgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCisjIGBhY19jdl9lbnZfZm9vJyB2YXJpYWJsZXMgKHNldCBvciB1bnNldCkgd2lsbCBiZSBvdmVycmlkZGVuIHdoZW4KKyMgbG9hZGluZyB0aGlzIGZpbGUsIG90aGVyICp1bnNldCogYGFjX2N2X2Zvbycgd2lsbCBiZSBhc3NpZ25lZCB0aGUKKyMgZm9sbG93aW5nIHZhbHVlcy4KKworX0FDRU9GCisKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgoreworICAoc2V0KSAyPiYxIHwKKyAgICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgorICAgICphY19zcGFjZT1cICopCisgICAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlCisgICAgICAjIHN1YnN0aXR1dGlvbiB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKyAgICAgIHNlZCAtbiBcCisJInMvJy8nXFxcXCcnL2c7CisJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcXDInL3AiCisgICAgICA7OworICAgICopCisgICAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgICAgc2VkIC1uIFwKKwkicy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT1cXDIvcCIKKyAgICAgIDs7CisgICAgZXNhYzsKK30gfAorICBzZWQgJworICAgICB0IGNsZWFyCisgICAgIDogY2xlYXIKKyAgICAgcy9eXChbXj1dKlwpPVwoLipbe31dLipcKSQvdGVzdCAiJHtcMStzZXR9IiA9IHNldCB8fCAmLworICAgICB0IGVuZAorICAgICAvXmFjX2N2X2Vudi8hcy9eXChbXj1dKlwpPVwoLipcKSQvXDE9JHtcMT1cMn0vCisgICAgIDogZW5kJyA+PmNvbmZjYWNoZQoraWYgZGlmZiAkY2FjaGVfZmlsZSBjb25mY2FjaGUgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDo7IGVsc2UKKyAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgorICAgIHRlc3QgIngkY2FjaGVfZmlsZSIgIT0gIngvZGV2L251bGwiICYmIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAgIGNhdCBjb25mY2FjaGUgPiRjYWNoZV9maWxlCisgIGVsc2UKKyAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKKyMgVlBBVEggbWF5IGNhdXNlIHRyb3VibGUgd2l0aCBzb21lIG1ha2VzLCBzbyB3ZSByZW1vdmUgJChzcmNkaXIpLAorIyAke3NyY2Rpcn0gYW5kIEBzcmNkaXJAIGZyb20gVlBBVEggaWYgc3JjZGlyIGlzICIuIiwgc3RyaXAgbGVhZGluZyBhbmQKKyMgdHJhaWxpbmcgY29sb25zIGFuZCB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgbGluZSBpZiBWUEFUSCBiZWNvbWVzIGVtcHR5CisjIChhY3R1YWxseSB3ZSBsZWF2ZSBhbiBlbXB0eSBsaW5lIHRvIHByZXNlcnZlIGxpbmUgbnVtYmVycykuCitpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorICBhY192cHN1Yj0nL15bCSBdKlZQQVRIWwkgXSo9L3sKK3MvOipcJChzcmNkaXIpOiovOi87CitzLzoqXCR7c3JjZGlyfToqLzovOworcy86KkBzcmNkaXJAOiovOi87CitzL15cKFtePV0qPVsJIF0qXCk6Ki9cMS87CitzLzoqJC8vOworcy9eW149XSo9WwkgXSokLy87Cit9JworZmkKKworREVGUz0tREhBVkVfQ09ORklHX0gKKworYWNfbGlib2Jqcz0KK2FjX2x0bGlib2Jqcz0KK2ZvciBhY19pIGluIDogJExJQk9CSlM7IGRvIHRlc3QgIngkYWNfaSIgPSB4OiAmJiBjb250aW51ZQorICAjIDEuIFJlbW92ZSB0aGUgZXh0ZW5zaW9uLCBhbmQgJFUgaWYgYWxyZWFkeSBpbnN0YWxsZWQuCisgIGFjX2k9YGVjaG8gIiRhY19pIiB8CisJIHNlZCAncy9cJFVcLi8uLztzL1wubyQvLztzL1wub2JqJC8vJ2AKKyAgIyAyLiBBZGQgdGhlbS4KKyAgYWNfbGlib2Jqcz0iJGFjX2xpYm9ianMgJGFjX2lcJFUuJGFjX29iamV4dCIKKyAgYWNfbHRsaWJvYmpzPSIkYWNfbHRsaWJvYmpzICRhY19pIickVS5sbycKK2RvbmUKK0xJQk9CSlM9JGFjX2xpYm9ianMKKworTFRMSUJPQkpTPSRhY19sdGxpYm9ianMKKworCitpZiB0ZXN0IC16ICIke01BSU5UQUlORVJfTU9ERV9UUlVFfSIgJiYgdGVzdCAteiAiJHtNQUlOVEFJTkVSX01PREVfRkFMU0V9IjsgdGhlbgorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb25kaXRpb25hbCBcIk1BSU5UQUlORVJfTU9ERVwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNvbmRpdGlvbmFsIFwiTUFJTlRBSU5FUl9NT0RFXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCitpZiB0ZXN0IC16ICIke0FNREVQX1RSVUV9IiAmJiB0ZXN0IC16ICIke0FNREVQX0ZBTFNFfSI7IHRoZW4KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY29uZGl0aW9uYWwgXCJBTURFUFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNvbmRpdGlvbmFsIFwiQU1ERVBcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKK2lmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDQ19UUlVFfSIgJiYgdGVzdCAteiAiJHthbV9fZmFzdGRlcENDX0ZBTFNFfSI7IHRoZW4KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY29uZGl0aW9uYWwgXCJhbV9fZmFzdGRlcENDXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY29uZGl0aW9uYWwgXCJhbV9fZmFzdGRlcENDXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCitpZiB0ZXN0IC16ICIke2FtX19mYXN0ZGVwQ0NfVFJVRX0iICYmIHRlc3QgLXogIiR7YW1fX2Zhc3RkZXBDQ19GQUxTRX0iOyB0aGVuCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNvbmRpdGlvbmFsIFwiYW1fX2Zhc3RkZXBDQ1wiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQoraWYgdGVzdCAteiAiJHtORVRCT09UX1NVUFBPUlRfVFJVRX0iICYmIHRlc3QgLXogIiR7TkVUQk9PVF9TVVBQT1JUX0ZBTFNFfSI7IHRoZW4KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY29uZGl0aW9uYWwgXCJORVRCT09UX1NVUFBPUlRcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjb25kaXRpb25hbCBcIk5FVEJPT1RfU1VQUE9SVFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQoraWYgdGVzdCAteiAiJHtESVNLTEVTU19TVVBQT1JUX1RSVUV9IiAmJiB0ZXN0IC16ICIke0RJU0tMRVNTX1NVUFBPUlRfRkFMU0V9IjsgdGhlbgorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb25kaXRpb25hbCBcIkRJU0tMRVNTX1NVUFBPUlRcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjb25kaXRpb25hbCBcIkRJU0tMRVNTX1NVUFBPUlRcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKK2lmIHRlc3QgLXogIiR7SEVSQ1VMRVNfU1VQUE9SVF9UUlVFfSIgJiYgdGVzdCAteiAiJHtIRVJDVUxFU19TVVBQT1JUX0ZBTFNFfSI7IHRoZW4KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY29uZGl0aW9uYWwgXCJIRVJDVUxFU19TVVBQT1JUXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY29uZGl0aW9uYWwgXCJIRVJDVUxFU19TVVBQT1JUXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCitpZiB0ZXN0IC16ICIke1NFUklBTF9TVVBQT1JUX1RSVUV9IiAmJiB0ZXN0IC16ICIke1NFUklBTF9TVVBQT1JUX0ZBTFNFfSI7IHRoZW4KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY29uZGl0aW9uYWwgXCJTRVJJQUxfU1VQUE9SVFwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNvbmRpdGlvbmFsIFwiU0VSSUFMX1NVUFBPUlRcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKK2lmIHRlc3QgLXogIiR7U0VSSUFMX1NQRUVEX1NJTVVMQVRJT05fVFJVRX0iICYmIHRlc3QgLXogIiR7U0VSSUFMX1NQRUVEX1NJTVVMQVRJT05fRkFMU0V9IjsgdGhlbgorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb25kaXRpb25hbCBcIlNFUklBTF9TUEVFRF9TSU1VTEFUSU9OXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY29uZGl0aW9uYWwgXCJTRVJJQUxfU1BFRURfU0lNVUxBVElPTlwiIHdhcyBuZXZlciBkZWZpbmVkLgorVXN1YWxseSB0aGlzIG1lYW5zIHRoZSBtYWNybyB3YXMgb25seSBpbnZva2VkIGNvbmRpdGlvbmFsbHkuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQoraWYgdGVzdCAteiAiJHtCVUlMRF9FWEFNUExFX0tFUk5FTF9UUlVFfSIgJiYgdGVzdCAteiAiJHtCVUlMRF9FWEFNUExFX0tFUk5FTF9GQUxTRX0iOyB0aGVuCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvbmRpdGlvbmFsIFwiQlVJTERfRVhBTVBMRV9LRVJORUxcIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5LiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjb25kaXRpb25hbCBcIkJVSUxEX0VYQU1QTEVfS0VSTkVMXCIgd2FzIG5ldmVyIGRlZmluZWQuCitVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIG1hY3JvIHdhcyBvbmx5IGludm9rZWQgY29uZGl0aW9uYWxseS4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKKzogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KK2FjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCithY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzICRDT05GSUdfU1RBVFVTIgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNQorZWNobyAiJGFzX21lOiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY2O30KK2NhdCA+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKKyMhICRTSEVMTAorIyBHZW5lcmF0ZWQgYnkgJGFzX21lLgorIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisjIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisjIGNvbmZpZ3VyZSwgaXMgaW4gY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2RlYnVnPWZhbHNlCithY19jc19yZWNoZWNrPWZhbHNlCithY19jc19zaWxlbnQ9ZmFsc2UKK1NIRUxMPVwke0NPTkZJR19TSEVMTC0kU0hFTEx9CitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE00c2ggSW5pdGlhbGl6YXRpb24uICAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKKyMgQmUgQm91cm5lIGNvbXBhdGlibGUKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworZWxpZiB0ZXN0IC1uICIke0JBU0hfVkVSU0lPTitzZXR9IiAmJiAoc2V0IC1vIHBvc2l4KSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgc2V0IC1vIHBvc2l4CitmaQorRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAorCisjIFN1cHBvcnQgdW5zZXQgd2hlbiBwb3NzaWJsZS4KK2lmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc191bnNldD11bnNldAorZWxzZQorICBhc191bnNldD1mYWxzZQorZmkKKworCisjIFdvcmsgYXJvdW5kIGJ1Z3MgaW4gcHJlLTMuMCBVV0lOIGtzaC4KKyRhc191bnNldCBFTlYgTUFJTCBNQUlMUEFUSAorUFMxPSckICcKK1BTMj0nPiAnCitQUzQ9JysgJworCisjIE5MUyBudWlzYW5jZXMuCitmb3IgYXNfdmFyIGluIFwKKyAgTEFORyBMQU5HVUFHRSBMQ19BRERSRVNTIExDX0FMTCBMQ19DT0xMQVRFIExDX0NUWVBFIExDX0lERU5USUZJQ0FUSU9OIFwKKyAgTENfTUVBU1VSRU1FTlQgTENfTUVTU0FHRVMgTENfTU9ORVRBUlkgTENfTkFNRSBMQ19OVU1FUklDIExDX1BBUEVSIFwKKyAgTENfVEVMRVBIT05FIExDX1RJTUUKK2RvCisgIGlmIChzZXQgK3g7IHRlc3QgLXogImAoZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyKSAyPiYxYCIpOyB0aGVuCisgICAgZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyCisgIGVsc2UKKyAgICAkYXNfdW5zZXQgJGFzX3ZhcgorICBmaQorZG9uZQorCisjIFJlcXVpcmVkIHRvIHVzZSBiYXNlbmFtZS4KK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitpZiAoYmFzZW5hbWUgLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLyAyPiYxYCIgPSAiWC8iOyB0aGVuCisgIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCitlbHNlCisgIGFzX2Jhc2VuYW1lPWZhbHNlCitmaQorCisKKyMgTmFtZSBvZiB0aGUgZXhlY3V0YWJsZS4KK2FzX21lPWAkYXNfYmFzZW5hbWUgIiQwIiB8fAorJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoL1wpJCcgXHwgXAorCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKK2VjaG8gWC8iJDAiIHwKKyAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwvXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwvXChcL1wpLioveyBzLy9cMS87IHE7IH0KKyAgCSAgcy8uKi8uLzsgcSdgCisKKworIyBQQVRIIG5lZWRzIENSLCBhbmQgTElORU5PIG5lZWRzIENSIGFuZCBQQVRILgorIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgorYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCithc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKK2FzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUworYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JworYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCisKKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgoraWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgZWNobyAiIyEgL2Jpbi9zaCIgPmNvbmYkJC5zaAorICBlY2hvICAiZXhpdCAwIiAgID4+Y29uZiQkLnNoCisgIGNobW9kICt4IGNvbmYkJC5zaAorICBpZiAoUEFUSD0iL25vbmV4aXN0ZW50Oy4iOyBjb25mJCQuc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgIFBBVEhfU0VQQVJBVE9SPSc7JworICBlbHNlCisgICAgUEFUSF9TRVBBUkFUT1I9OgorICBmaQorICBybSAtZiBjb25mJCQuc2gKK2ZpCisKKworICBhc19saW5lbm9fMT0kTElORU5PCisgIGFzX2xpbmVub18yPSRMSU5FTk8KKyAgYXNfbGluZW5vXzM9YChleHByICRhc19saW5lbm9fMSArIDEpIDI+L2Rldi9udWxsYAorICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKKyAgdGVzdCAieCRhc19saW5lbm9fMyIgID0gIngkYXNfbGluZW5vXzIiICB8fCB7CisgICMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIHBhdGggYXQgYWxsCisgICMgcmVsYXRpdmUgb3Igbm90LgorICBjYXNlICQwIGluCisgICAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OworICAgICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKK2RvbmUKKworICAgICAgIDs7CisgIGVzYWMKKyAgIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJworICAjIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KKyAgaWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgorICAgIGFzX215c2VsZj0kMAorICBmaQorICBpZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCisgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIHBhdGgiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIHBhdGgiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgZmkKKyAgY2FzZSAkQ09ORklHX1NIRUxMIGluCisgICcnKQorICAgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gL2JpbiRQQVRIX1NFUEFSQVRPUi91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFzX2Jhc2UgaW4gc2ggYmFzaCBrc2ggc2g1OyBkbworCSBjYXNlICRhc19kaXIgaW4KKwkgLyopCisJICAgaWYgKCIkYXNfZGlyLyRhc19iYXNlIiAtYyAnCisgIGFzX2xpbmVub18xPSRMSU5FTk8KKyAgYXNfbGluZW5vXzI9JExJTkVOTworICBhc19saW5lbm9fMz1gKGV4cHIgJGFzX2xpbmVub18xICsgMSkgMj4vZGV2L251bGxgCisgIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgorICB0ZXN0ICJ4JGFzX2xpbmVub18zIiAgPSAieCRhc19saW5lbm9fMiIgJykgMj4vZGV2L251bGw7IHRoZW4KKwkgICAgICRhc191bnNldCBCQVNIX0VOViB8fCB0ZXN0ICIke0JBU0hfRU5WK3NldH0iICE9IHNldCB8fCB7IEJBU0hfRU5WPTsgZXhwb3J0IEJBU0hfRU5WOyB9CisJICAgICAkYXNfdW5zZXQgRU5WIHx8IHRlc3QgIiR7RU5WK3NldH0iICE9IHNldCB8fCB7IEVOVj07IGV4cG9ydCBFTlY7IH0KKwkgICAgIENPTkZJR19TSEVMTD0kYXNfZGlyLyRhc19iYXNlCisJICAgICBleHBvcnQgQ09ORklHX1NIRUxMCisJICAgICBleGVjICIkQ09ORklHX1NIRUxMIiAiJDAiICR7MSsiJEAifQorCSAgIGZpOzsKKwkgZXNhYworICAgICAgIGRvbmUKK2RvbmUKKzs7CisgIGVzYWMKKworICAjIENyZWF0ZSAkYXNfbWUubGluZW5vIGFzIGEgY29weSBvZiAkYXNfbXlzZWxmLCBidXQgd2l0aCAkTElORU5PCisgICMgdW5pZm9ybWx5IHJlcGxhY2VkIGJ5IHRoZSBsaW5lIG51bWJlci4gIFRoZSBmaXJzdCAnc2VkJyBpbnNlcnRzIGEKKyAgIyBsaW5lLW51bWJlciBsaW5lIGJlZm9yZSBlYWNoIGxpbmU7IHRoZSBzZWNvbmQgJ3NlZCcgZG9lcyB0aGUgcmVhbAorICAjIHdvcmsuICBUaGUgc2Vjb25kIHNjcmlwdCB1c2VzICdOJyB0byBwYWlyIGVhY2ggbGluZS1udW1iZXIgbGluZQorICAjIHdpdGggdGhlIG51bWJlcmVkIGxpbmUsIGFuZCBhcHBlbmRzIHRyYWlsaW5nICctJyBkdXJpbmcKKyAgIyBzdWJzdGl0dXRpb24gc28gdGhhdCAkTElORU5PIGlzIG5vdCBhIHNwZWNpYWwgY2FzZSBhdCBsaW5lIGVuZC4KKyAgIyAoUmFqYSBSIEhhcmluYXRoIHN1Z2dlc3RlZCBzZWQgJz0nLCBhbmQgUGF1bCBFZ2dlcnQgd3JvdGUgdGhlCisgICMgc2Vjb25kICdzZWQnIHNjcmlwdC4gIEJsYW1lIExlZSBFLiBNY01haG9uIGZvciBzZWQncyBzeW50YXguICA6LSkKKyAgc2VkICc9JyA8JGFzX215c2VsZiB8CisgICAgc2VkICcKKyAgICAgIE4KKyAgICAgIHMsJCwtLAorICAgICAgOiBsb29wCisgICAgICBzLF5cKFsnJGFzX2NyX2RpZ2l0cyddKlwpXCguKlwpWyRdTElORU5PXChbXickYXNfY3JfYWxudW0nX11cKSxcMVwyXDFcMywKKyAgICAgIHQgbG9vcAorICAgICAgcywtJCwsCisgICAgICBzLF5bJyRhc19jcl9kaWdpdHMnXSpcbiwsCisgICAgJyA+JGFzX21lLmxpbmVubyAmJgorICBjaG1vZCAreCAkYXNfbWUubGluZW5vIHx8CisgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcworICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKKyAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpYmxlIHRvIHRoaXMpLgorICAuIC4vJGFzX21lLmxpbmVubworICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KKyAgZXhpdAorfQorCisKK2Nhc2UgYGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDNgLGBlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDNgIGluCisgICpjKiwtbiopIEVDSE9fTj0gRUNIT19DPScKKycgRUNIT19UPScJJyA7OworICAqYyosKiAgKSBFQ0hPX049LW4gRUNIT19DPSBFQ0hPX1Q9IDs7CisgICopICAgICAgIEVDSE9fTj0gRUNIT19DPSdcYycgRUNIT19UPSA7OworZXNhYworCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKK2VjaG8gPmNvbmYkJC5maWxlCitpZiBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKyAgIyBXZSBjb3VsZCBqdXN0IGNoZWNrIGZvciBESkdQUDsgYnV0IHRoaXMgdGVzdCBhKSB3b3JrcyBiKSBpcyBtb3JlIGdlbmVyaWMKKyAgIyBhbmQgYykgd2lsbCByZW1haW4gdmFsaWQgb25jZSBESkdQUCBzdXBwb3J0cyBzeW1saW5rcyAoREpHUFAgMi4wNCkuCisgIGlmIHRlc3QgLWYgY29uZiQkLmV4ZTsgdGhlbgorICAgICMgRG9uJ3QgdXNlIGxuIGF0IGFsbDsgd2UgZG9uJ3QgaGF2ZSBhbnkgbGlua3MKKyAgICBhc19sbl9zPSdjcCAtcCcKKyAgZWxzZQorICAgIGFzX2xuX3M9J2xuIC1zJworICBmaQorZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfbG5fcz1sbgorZWxzZQorICBhc19sbl9zPSdjcCAtcCcKK2ZpCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQorCitpZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX21rZGlyX3A9OgorZWxzZQorICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAorICBhc19ta2Rpcl9wPWZhbHNlCitmaQorCithc19leGVjdXRhYmxlX3A9InRlc3QgLWYiCisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KK2FzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgorYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworCisjIElGUworIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4KK2FzX25sPScKKycKK0lGUz0iIAkkYXNfbmwiCisKKyMgQ0RQQVRILgorJGFzX3Vuc2V0IENEUEFUSAorCitleGVjIDY+JjEKKworIyBPcGVuIHRoZSBsb2cgcmVhbCBzb29uLCB0byBrZWVwIFwkWzBdIGFuZCBzbyBvbiBtZWFuaW5nZnVsLCBhbmQgdG8KKyMgcmVwb3J0IGFjdHVhbCBpbnB1dCB2YWx1ZXMgb2YgQ09ORklHX0ZJTEVTIGV0Yy4gaW5zdGVhZCBvZiB0aGVpcgorIyB2YWx1ZXMgYWZ0ZXIgb3B0aW9ucyBoYW5kbGluZy4gIExvZ2dpbmcgLS12ZXJzaW9uIGV0Yy4gaXMgT0suCitleGVjIDU+PmNvbmZpZy5sb2cKK3sKKyAgZWNobworICBzZWQgJ2g7cy8uLy0vZztzL14uLi4vIyMgLztzLy4uLiQvICMjLztwO3g7cDt4JyA8PF9BU0JPWAorIyMgUnVubmluZyAkYXNfbWUuICMjCitfQVNCT1gKK30gPiY1CitjYXQgPiY1IDw8X0NTRU9GCisKK1RoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgR1JVQiAkYXNfbWUgMC45Nywgd2hpY2ggd2FzCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNTkuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKKworICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCisgIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUworICBDT05GSUdfTElOS1MgICAgPSAkQ09ORklHX0xJTktTCisgIENPTkZJR19DT01NQU5EUyA9ICRDT05GSUdfQ09NTUFORFMKKyAgJCAkMCAkQAorCitfQ1NFT0YKK2VjaG8gIm9uIGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYCIgPiY1CitlY2hvID4mNQorX0FDRU9GCisKKyMgRmlsZXMgdGhhdCBjb25maWcuc3RhdHVzIHdhcyBtYWRlIGZvci4KK2lmIHRlc3QgLW4gIiRhY19jb25maWdfZmlsZXMiOyB0aGVuCisgIGVjaG8gImNvbmZpZ19maWxlcz1cIiRhY19jb25maWdfZmlsZXNcIiIgPj4kQ09ORklHX1NUQVRVUworZmkKKworaWYgdGVzdCAtbiAiJGFjX2NvbmZpZ19oZWFkZXJzIjsgdGhlbgorICBlY2hvICJjb25maWdfaGVhZGVycz1cIiRhY19jb25maWdfaGVhZGVyc1wiIiA+PiRDT05GSUdfU1RBVFVTCitmaQorCitpZiB0ZXN0IC1uICIkYWNfY29uZmlnX2xpbmtzIjsgdGhlbgorICBlY2hvICJjb25maWdfbGlua3M9XCIkYWNfY29uZmlnX2xpbmtzXCIiID4+JENPTkZJR19TVEFUVVMKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY19jb25maWdfY29tbWFuZHMiOyB0aGVuCisgIGVjaG8gImNvbmZpZ19jb21tYW5kcz1cIiRhY19jb25maWdfY29tbWFuZHNcIiIgPj4kQ09ORklHX1NUQVRVUworZmkKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCisKK2FjX2NzX3VzYWdlPSJcCitcYCRhc19tZScgaW5zdGFudGlhdGVzIGZpbGVzIGZyb20gdGVtcGxhdGVzIGFjY29yZGluZyB0byB0aGUKK2N1cnJlbnQgY29uZmlndXJhdGlvbi4KKworVXNhZ2U6ICQwIFtPUFRJT05TXSBbRklMRV0uLi4KKworICAtaCwgLS1oZWxwICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC1WLCAtLXZlcnNpb24gICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorICAtcSwgLS1xdWlldCAgICAgIGRvIG5vdCBwcmludCBwcm9ncmVzcyBtZXNzYWdlcworICAtZCwgLS1kZWJ1ZyAgICAgIGRvbid0IHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMKKyAgICAgIC0tcmVjaGVjayAgICB1cGRhdGUgJGFzX21lIGJ5IHJlY29uZmlndXJpbmcgaW4gdGhlIHNhbWUgY29uZGl0aW9ucworICAtLWZpbGU9RklMRVs6VEVNUExBVEVdCisJCSAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgRklMRQorICAtLWhlYWRlcj1GSUxFWzpURU1QTEFURV0KKwkJICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gaGVhZGVyIEZJTEUKKworQ29uZmlndXJhdGlvbiBmaWxlczoKKyRjb25maWdfZmlsZXMKKworQ29uZmlndXJhdGlvbiBoZWFkZXJzOgorJGNvbmZpZ19oZWFkZXJzCisKK0NvbmZpZ3VyYXRpb24gY29tbWFuZHM6CiskY29uZmlnX2NvbW1hbmRzCisKK1JlcG9ydCBidWdzIHRvIDxidWctYXV0b2NvbmZAZ251Lm9yZz4uIgorX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCithY19jc192ZXJzaW9uPSJcXAorR1JVQiBjb25maWcuc3RhdHVzIDAuOTcKK2NvbmZpZ3VyZWQgYnkgJDAsIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi41OSwKKyAgd2l0aCBvcHRpb25zIFxcImBlY2hvICIkYWNfY29uZmlndXJlX2FyZ3MiIHwgc2VkICdzL1tcXCIiXGBcJF0vXFxcXCYvZydgXFwiCisKK0NvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgY29uZmlnLnN0YXR1cyBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LiIKK3NyY2Rpcj0kc3JjZGlyCitJTlNUQUxMPSIkSU5TVEFMTCIKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKyMgSWYgbm8gZmlsZSBhcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLCB0aGVuIHdlIG5lZWQgdG8gcHJvdmlkZSBkZWZhdWx0CisjIHZhbHVlLiAgQnkgd2UgbmVlZCB0byBrbm93IGlmIGZpbGVzIHdlcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgorYWNfbmVlZF9kZWZhdWx0cz06Cit3aGlsZSB0ZXN0ICQjICE9IDAKK2RvCisgIGNhc2UgJDEgaW4KKyAgLS0qPSopCisgICAgYWNfb3B0aW9uPWBleHByICJ4JDEiIDogJ3hcKFtePV0qXCk9J2AKKyAgICBhY19vcHRhcmc9YGV4cHIgIngkMSIgOiAneFtePV0qPVwoLipcKSdgCisgICAgYWNfc2hpZnQ9OgorICAgIDs7CisgIC0qKQorICAgIGFjX29wdGlvbj0kMQorICAgIGFjX29wdGFyZz0kMgorICAgIGFjX3NoaWZ0PXNoaWZ0CisgICAgOzsKKyAgKikgIyBUaGlzIGlzIG5vdCBhbiBvcHRpb24sIHNvIHRoZSB1c2VyIGhhcyBwcm9iYWJseSBnaXZlbiBleHBsaWNpdAorICAgICAjIGFyZ3VtZW50cy4KKyAgICAgYWNfb3B0aW9uPSQxCisgICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OworICBlc2FjCisKKyAgY2FzZSAkYWNfb3B0aW9uIGluCisgICMgSGFuZGxpbmcgb2YgdGhlIG9wdGlvbnMuCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBhY19jc19yZWNoZWNrPTogOzsKKyAgLS12ZXJzaW9uIHwgLS12ZXJzKiB8IC1WICkKKyAgICBlY2hvICIkYWNfY3NfdmVyc2lvbiI7IGV4aXQgMCA7OworICAtLWhlIHwgLS1oKQorICAgICMgQ29uZmxpY3QgYmV0d2VlbiAtLWhlbHAgYW5kIC0taGVhZGVyCisgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogYW1iaWd1b3VzIG9wdGlvbjogJDEKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGFtYmlndW91cyBvcHRpb246ICQxCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7CisgIC0taGVscCB8IC0taGVsIHwgLWggKQorICAgIGVjaG8gIiRhY19jc191c2FnZSI7IGV4aXQgMCA7OworICAtLWRlYnVnIHwgLS1kKiB8IC1kICkKKyAgICBkZWJ1Zz06IDs7CisgIC0tZmlsZSB8IC0tZmlsIHwgLS1maSB8IC0tZiApCisgICAgJGFjX3NoaWZ0CisgICAgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTICRhY19vcHRhcmciCisgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIC0taGVhZGVyIHwgLS1oZWFkZSB8IC0taGVhZCB8IC0taGVhICkKKyAgICAkYWNfc2hpZnQKKyAgICBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTICRhY19vcHRhcmciCisgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsIHwgLS1zaSB8IC0tcykKKyAgICBhY19jc19zaWxlbnQ9OiA7OworCisgICMgVGhpcyBpcyBhbiBlcnJvci4KKyAgLSopIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICQxCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiB1bnJlY29nbml6ZWQgb3B0aW9uOiAkMQorVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKworICAqKSBhY19jb25maWdfdGFyZ2V0cz0iJGFjX2NvbmZpZ190YXJnZXRzICQxIiA7OworCisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9CisKK2lmICRhY19jc19zaWxlbnQ7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorICBhY19jb25maWd1cmVfZXh0cmFfYXJncz0iJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tc2lsZW50IgorZmkKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgoraWYgXCRhY19jc19yZWNoZWNrOyB0aGVuCisgIGVjaG8gInJ1bm5pbmcgJFNIRUxMICQwICIgJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgIiAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIgPiY2CisgIGV4ZWMgJFNIRUxMICQwICRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uCitmaQorCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKKyMKKyMgSU5JVC1DT01NQU5EUyBzZWN0aW9uLgorIworCitBTURFUF9UUlVFPSIkQU1ERVBfVFJVRSIgYWNfYXV4X2Rpcj0iJGFjX2F1eF9kaXIiCisKK19BQ0VPRgorCisKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCitmb3IgYWNfY29uZmlnX3RhcmdldCBpbiAkYWNfY29uZmlnX3RhcmdldHMKK2RvCisgIGNhc2UgIiRhY19jb25maWdfdGFyZ2V0IiBpbgorICAjIEhhbmRsaW5nIG9mIGFyZ3VtZW50cy4KKyAgIk1ha2VmaWxlIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBNYWtlZmlsZSIgOzsKKyAgInN0YWdlMS9NYWtlZmlsZSIgKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgc3RhZ2UxL01ha2VmaWxlIiA7OworICAic3RhZ2UyL01ha2VmaWxlIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBzdGFnZTIvTWFrZWZpbGUiIDs7CisgICJkb2NzL01ha2VmaWxlIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBkb2NzL01ha2VmaWxlIiA7OworICAibGliL01ha2VmaWxlIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBsaWIvTWFrZWZpbGUiIDs7CisgICJ1dGlsL01ha2VmaWxlIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB1dGlsL01ha2VmaWxlIiA7OworICAiZ3J1Yi9NYWtlZmlsZSIgKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZ3J1Yi9NYWtlZmlsZSIgOzsKKyAgIm5ldGJvb3QvTWFrZWZpbGUiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIG5ldGJvb3QvTWFrZWZpbGUiIDs7CisgICJ1dGlsL2dydWItaW1hZ2UiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHV0aWwvZ3J1Yi1pbWFnZSIgOzsKKyAgInV0aWwvZ3J1Yi1pbnN0YWxsIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB1dGlsL2dydWItaW5zdGFsbCIgOzsKKyAgInV0aWwvZ3J1Yi1tZDUtY3J5cHQiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHV0aWwvZ3J1Yi1tZDUtY3J5cHQiIDs7CisgICJ1dGlsL2dydWItdGVybWluZm8iICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHV0aWwvZ3J1Yi10ZXJtaW5mbyIgOzsKKyAgInV0aWwvZ3J1Yi1zZXQtZGVmYXVsdCIgKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdXRpbC9ncnViLXNldC1kZWZhdWx0IiA7OworICAiZGVwZmlsZXMiICkgQ09ORklHX0NPTU1BTkRTPSIkQ09ORklHX0NPTU1BTkRTIGRlcGZpbGVzIiA7OworICAiY29uZmlnLmgiICkgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyBjb25maWcuaCIgOzsKKyAgKikgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW52YWxpZCBhcmd1bWVudDogJGFjX2NvbmZpZ190YXJnZXQiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBhcmd1bWVudDogJGFjX2NvbmZpZ190YXJnZXQiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworICBlc2FjCitkb25lCisKKyMgSWYgdGhlIHVzZXIgZGlkIG5vdCB1c2UgdGhlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBpdGVtcyB0byBpbnN0YW50aWF0ZSwKKyMgdGhlbiB0aGUgZW52dmFyIGludGVyZmFjZSBpcyB1c2VkLiAgU2V0IG9ubHkgdGhvc2UgdGhhdCBhcmUgbm90LgorIyBXZSB1c2UgdGhlIGxvbmcgZm9ybSBmb3IgdGhlIGRlZmF1bHQgYXNzaWdubWVudCBiZWNhdXNlIG9mIGFuIGV4dHJlbWVseQorIyBiaXphcnJlIGJ1ZyBvbiBTdW5PUyA0LjEuMy4KK2lmICRhY19uZWVkX2RlZmF1bHRzOyB0aGVuCisgIHRlc3QgIiR7Q09ORklHX0ZJTEVTK3NldH0iID0gc2V0IHx8IENPTkZJR19GSUxFUz0kY29uZmlnX2ZpbGVzCisgIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0hFQURFUlM9JGNvbmZpZ19oZWFkZXJzCisgIHRlc3QgIiR7Q09ORklHX0NPTU1BTkRTK3NldH0iID0gc2V0IHx8IENPTkZJR19DT01NQU5EUz0kY29uZmlnX2NvbW1hbmRzCitmaQorCisjIEhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjb252ZW5pZW5jZS4gIE1ha2UgaXQgaW4gdGhlIGJ1aWxkIHRyZWUKKyMgc2ltcGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVhc29uIHRvIHB1dCBpdCBoZXJlLCBhbmQgaW4gYWRkaXRpb24sCisjIGNyZWF0aW5nIGFuZCBtb3ZpbmcgZmlsZXMgZnJvbSAvdG1wIGNhbiBzb21ldGltZXMgY2F1c2UgcHJvYmxlbXMuCisjIENyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnksIGFuZCBob29rIGZvciBpdHMgcmVtb3ZhbCB1bmxlc3MgZGVidWdnaW5nLgorJGRlYnVnIHx8Cit7CisgIHRyYXAgJ2V4aXRfc3RhdHVzPSQ/OyBybSAtcmYgJHRtcCAmJiBleGl0ICRleGl0X3N0YXR1cycgMAorICB0cmFwICd7IChleGl0IDEpOyBleGl0IDE7IH0nIDEgMiAxMyAxNQorfQorCisjIENyZWF0ZSBhIChzZWN1cmUpIHRtcCBkaXJlY3RvcnkgZm9yIHRtcCBmaWxlcy4KKworeworICB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kIC1xICIuL2NvbmZzdGF0WFhYWFhYIikgMj4vZGV2L251bGxgICYmCisgIHRlc3QgLW4gIiR0bXAiICYmIHRlc3QgLWQgIiR0bXAiCit9ICB8fAoreworICB0bXA9Li9jb25mc3RhdCQkLSRSQU5ET00KKyAgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKQorfSB8fAoreworICAgZWNobyAiJG1lOiBjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAuIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorfQorCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKKworIworIyBDT05GSUdfRklMRVMgc2VjdGlvbi4KKyMKKworIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBzY3JpcHRzIGlmIHRoZXJlIGFyZSBubyBDT05GSUdfRklMRVMuCisjIFRoaXMgaGFwcGVucyBmb3IgaW5zdGFuY2Ugd2hlbiAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgKK2lmIHRlc3QgLW4gIlwkQ09ORklHX0ZJTEVTIjsgdGhlbgorICAjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorICBzZWQgJ3MvLEAvQEAvOyBzL0AsL0BALzsgcy8sO3QgdFwkL0A7dCB0LzsgL0A7dCB0XCQvcy9bXFxcXCYsXS9cXFxcJi9nOworICAgcy9AQC8sQC87IHMvQEAvQCwvOyBzL0A7dCB0XCQvLDt0IHQvJyA+XCR0bXAvc3Vicy5zZWQgPDxcXENFT0YKK3MsQFNIRUxMQCwkU0hFTEwsO3QgdAorcyxAUEFUSF9TRVBBUkFUT1JALCRQQVRIX1NFUEFSQVRPUiw7dCB0CitzLEBQQUNLQUdFX05BTUVALCRQQUNLQUdFX05BTUUsO3QgdAorcyxAUEFDS0FHRV9UQVJOQU1FQCwkUEFDS0FHRV9UQVJOQU1FLDt0IHQKK3MsQFBBQ0tBR0VfVkVSU0lPTkAsJFBBQ0tBR0VfVkVSU0lPTiw7dCB0CitzLEBQQUNLQUdFX1NUUklOR0AsJFBBQ0tBR0VfU1RSSU5HLDt0IHQKK3MsQFBBQ0tBR0VfQlVHUkVQT1JUQCwkUEFDS0FHRV9CVUdSRVBPUlQsO3QgdAorcyxAZXhlY19wcmVmaXhALCRleGVjX3ByZWZpeCw7dCB0CitzLEBwcmVmaXhALCRwcmVmaXgsO3QgdAorcyxAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAsJHByb2dyYW1fdHJhbnNmb3JtX25hbWUsO3QgdAorcyxAYmluZGlyQCwkYmluZGlyLDt0IHQKK3MsQHNiaW5kaXJALCRzYmluZGlyLDt0IHQKK3MsQGxpYmV4ZWNkaXJALCRsaWJleGVjZGlyLDt0IHQKK3MsQGRhdGFkaXJALCRkYXRhZGlyLDt0IHQKK3MsQHN5c2NvbmZkaXJALCRzeXNjb25mZGlyLDt0IHQKK3MsQHNoYXJlZHN0YXRlZGlyQCwkc2hhcmVkc3RhdGVkaXIsO3QgdAorcyxAbG9jYWxzdGF0ZWRpckAsJGxvY2Fsc3RhdGVkaXIsO3QgdAorcyxAbGliZGlyQCwkbGliZGlyLDt0IHQKK3MsQGluY2x1ZGVkaXJALCRpbmNsdWRlZGlyLDt0IHQKK3MsQG9sZGluY2x1ZGVkaXJALCRvbGRpbmNsdWRlZGlyLDt0IHQKK3MsQGluZm9kaXJALCRpbmZvZGlyLDt0IHQKK3MsQG1hbmRpckAsJG1hbmRpciw7dCB0CitzLEBidWlsZF9hbGlhc0AsJGJ1aWxkX2FsaWFzLDt0IHQKK3MsQGhvc3RfYWxpYXNALCRob3N0X2FsaWFzLDt0IHQKK3MsQHRhcmdldF9hbGlhc0AsJHRhcmdldF9hbGlhcyw7dCB0CitzLEBERUZTQCwkREVGUyw7dCB0CitzLEBFQ0hPX0NALCRFQ0hPX0MsO3QgdAorcyxARUNIT19OQCwkRUNIT19OLDt0IHQKK3MsQEVDSE9fVEAsJEVDSE9fVCw7dCB0CitzLEBMSUJTQCwkTElCUyw7dCB0CitzLEBJTlNUQUxMX1BST0dSQU1ALCRJTlNUQUxMX1BST0dSQU0sO3QgdAorcyxASU5TVEFMTF9TQ1JJUFRALCRJTlNUQUxMX1NDUklQVCw7dCB0CitzLEBJTlNUQUxMX0RBVEFALCRJTlNUQUxMX0RBVEEsO3QgdAorcyxAQ1lHUEFUSF9XQCwkQ1lHUEFUSF9XLDt0IHQKK3MsQFBBQ0tBR0VALCRQQUNLQUdFLDt0IHQKK3MsQFZFUlNJT05ALCRWRVJTSU9OLDt0IHQKK3MsQEFDTE9DQUxALCRBQ0xPQ0FMLDt0IHQKK3MsQEFVVE9DT05GQCwkQVVUT0NPTkYsO3QgdAorcyxAQVVUT01BS0VALCRBVVRPTUFLRSw7dCB0CitzLEBBVVRPSEVBREVSQCwkQVVUT0hFQURFUiw7dCB0CitzLEBNQUtFSU5GT0AsJE1BS0VJTkZPLDt0IHQKK3MsQGluc3RhbGxfc2hALCRpbnN0YWxsX3NoLDt0IHQKK3MsQFNUUklQQCwkU1RSSVAsO3QgdAorcyxAYWNfY3RfU1RSSVBALCRhY19jdF9TVFJJUCw7dCB0CitzLEBJTlNUQUxMX1NUUklQX1BST0dSQU1ALCRJTlNUQUxMX1NUUklQX1BST0dSQU0sO3QgdAorcyxAbWtkaXJfcEAsJG1rZGlyX3AsO3QgdAorcyxAQVdLQCwkQVdLLDt0IHQKK3MsQFNFVF9NQUtFQCwkU0VUX01BS0UsO3QgdAorcyxAYW1fX2xlYWRpbmdfZG90QCwkYW1fX2xlYWRpbmdfZG90LDt0IHQKK3MsQEFNVEFSQCwkQU1UQVIsO3QgdAorcyxAYW1fX3RhckAsJGFtX190YXIsO3QgdAorcyxAYW1fX3VudGFyQCwkYW1fX3VudGFyLDt0IHQKK3MsQGJ1aWxkQCwkYnVpbGQsO3QgdAorcyxAYnVpbGRfY3B1QCwkYnVpbGRfY3B1LDt0IHQKK3MsQGJ1aWxkX3ZlbmRvckAsJGJ1aWxkX3ZlbmRvciw7dCB0CitzLEBidWlsZF9vc0AsJGJ1aWxkX29zLDt0IHQKK3MsQGhvc3RALCRob3N0LDt0IHQKK3MsQGhvc3RfY3B1QCwkaG9zdF9jcHUsO3QgdAorcyxAaG9zdF92ZW5kb3JALCRob3N0X3ZlbmRvciw7dCB0CitzLEBob3N0X29zQCwkaG9zdF9vcyw7dCB0CitzLEBNQUlOVEFJTkVSX01PREVfVFJVRUAsJE1BSU5UQUlORVJfTU9ERV9UUlVFLDt0IHQKK3MsQE1BSU5UQUlORVJfTU9ERV9GQUxTRUAsJE1BSU5UQUlORVJfTU9ERV9GQUxTRSw7dCB0CitzLEBNQUlOVEAsJE1BSU5ULDt0IHQKK3MsQFBFUkxALCRQRVJMLDt0IHQKK3MsQENDQCwkQ0MsO3QgdAorcyxAYWNfY3RfQ0NALCRhY19jdF9DQyw7dCB0CitzLEBDRkxBR1NALCRDRkxBR1MsO3QgdAorcyxATERGTEFHU0AsJExERkxBR1MsO3QgdAorcyxAQ1BQRkxBR1NALCRDUFBGTEFHUyw7dCB0CitzLEBFWEVFWFRALCRFWEVFWFQsO3QgdAorcyxAT0JKRVhUQCwkT0JKRVhULDt0IHQKK3MsQERFUERJUkAsJERFUERJUiw7dCB0CitzLEBhbV9faW5jbHVkZUAsJGFtX19pbmNsdWRlLDt0IHQKK3MsQGFtX19xdW90ZUAsJGFtX19xdW90ZSw7dCB0CitzLEBBTURFUF9UUlVFQCwkQU1ERVBfVFJVRSw7dCB0CitzLEBBTURFUF9GQUxTRUAsJEFNREVQX0ZBTFNFLDt0IHQKK3MsQEFNREVQQkFDS1NMQVNIQCwkQU1ERVBCQUNLU0xBU0gsO3QgdAorcyxAQ0NERVBNT0RFQCwkQ0NERVBNT0RFLDt0IHQKK3MsQGFtX19mYXN0ZGVwQ0NfVFJVRUAsJGFtX19mYXN0ZGVwQ0NfVFJVRSw7dCB0CitzLEBhbV9fZmFzdGRlcENDX0ZBTFNFQCwkYW1fX2Zhc3RkZXBDQ19GQUxTRSw7dCB0CitzLEBDQ0FTQCwkQ0NBUyw7dCB0CitzLEBSQU5MSUJALCRSQU5MSUIsO3QgdAorcyxAYWNfY3RfUkFOTElCQCwkYWNfY3RfUkFOTElCLDt0IHQKK3MsQFNUQUdFMV9DRkxBR1NALCRTVEFHRTFfQ0ZMQUdTLDt0IHQKK3MsQFNUQUdFMl9DRkxBR1NALCRTVEFHRTJfQ0ZMQUdTLDt0IHQKK3MsQEdSVUJfQ0ZMQUdTQCwkR1JVQl9DRkxBR1MsO3QgdAorcyxAT0JKQ09QWUAsJE9CSkNPUFksO3QgdAorcyxAYWNfY3RfT0JKQ09QWUAsJGFjX2N0X09CSkNPUFksO3QgdAorcyxAR1JVQl9MSUJTQCwkR1JVQl9MSUJTLDt0IHQKK3MsQENQUEAsJENQUCw7dCB0CitzLEBFR1JFUEAsJEVHUkVQLDt0IHQKK3MsQE5FVEJPT1RfU1VQUE9SVF9UUlVFQCwkTkVUQk9PVF9TVVBQT1JUX1RSVUUsO3QgdAorcyxATkVUQk9PVF9TVVBQT1JUX0ZBTFNFQCwkTkVUQk9PVF9TVVBQT1JUX0ZBTFNFLDt0IHQKK3MsQERJU0tMRVNTX1NVUFBPUlRfVFJVRUAsJERJU0tMRVNTX1NVUFBPUlRfVFJVRSw7dCB0CitzLEBESVNLTEVTU19TVVBQT1JUX0ZBTFNFQCwkRElTS0xFU1NfU1VQUE9SVF9GQUxTRSw7dCB0CitzLEBIRVJDVUxFU19TVVBQT1JUX1RSVUVALCRIRVJDVUxFU19TVVBQT1JUX1RSVUUsO3QgdAorcyxASEVSQ1VMRVNfU1VQUE9SVF9GQUxTRUAsJEhFUkNVTEVTX1NVUFBPUlRfRkFMU0UsO3QgdAorcyxAU0VSSUFMX1NVUFBPUlRfVFJVRUAsJFNFUklBTF9TVVBQT1JUX1RSVUUsO3QgdAorcyxAU0VSSUFMX1NVUFBPUlRfRkFMU0VALCRTRVJJQUxfU1VQUE9SVF9GQUxTRSw7dCB0CitzLEBTRVJJQUxfU1BFRURfU0lNVUxBVElPTl9UUlVFQCwkU0VSSUFMX1NQRUVEX1NJTVVMQVRJT05fVFJVRSw7dCB0CitzLEBTRVJJQUxfU1BFRURfU0lNVUxBVElPTl9GQUxTRUAsJFNFUklBTF9TUEVFRF9TSU1VTEFUSU9OX0ZBTFNFLDt0IHQKK3MsQEJVSUxEX0VYQU1QTEVfS0VSTkVMX1RSVUVALCRCVUlMRF9FWEFNUExFX0tFUk5FTF9UUlVFLDt0IHQKK3MsQEJVSUxEX0VYQU1QTEVfS0VSTkVMX0ZBTFNFQCwkQlVJTERfRVhBTVBMRV9LRVJORUxfRkFMU0UsO3QgdAorcyxARlNZU19DRkxBR1NALCRGU1lTX0NGTEFHUyw7dCB0CitzLEBORVRfQ0ZMQUdTQCwkTkVUX0NGTEFHUyw7dCB0CitzLEBORVRfRVhUUkFGTEFHU0AsJE5FVF9FWFRSQUZMQUdTLDt0IHQKK3MsQE5FVEJPT1RfRFJJVkVSU0AsJE5FVEJPT1RfRFJJVkVSUyw7dCB0CitzLEBDQ0FTRkxBR1NALCRDQ0FTRkxBR1MsO3QgdAorcyxATElCT0JKU0AsJExJQk9CSlMsO3QgdAorcyxATFRMSUJPQkpTQCwkTFRMSUJPQkpTLDt0IHQKK0NFT0YKKworX0FDRU9GCisKKyAgY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCisgICMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCisgICMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorICBhY19tYXhfc2VkX2xpbmVzPTQ4CisgIGFjX3NlZF9mcmFnPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgorICBhY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KKyAgYWNfZW5kPSRhY19tYXhfc2VkX2xpbmVzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KKyAgYWNfbW9yZV9saW5lcz06CisgIGFjX3NlZF9jbWRzPQorICB3aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KKyAgICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKyAgICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiAkdG1wL3N1YnMuc2VkID4kdG1wL3N1YnMuZnJhZworICAgIGVsc2UKKyAgICAgIHNlZCAiJHthY19lbmR9cSIgJHRtcC9zdWJzLnNlZCA+JHRtcC9zdWJzLmZyYWcKKyAgICBmaQorICAgIGlmIHRlc3QgISAtcyAkdG1wL3N1YnMuZnJhZzsgdGhlbgorICAgICAgYWNfbW9yZV9saW5lcz1mYWxzZQorICAgIGVsc2UKKyAgICAgICMgVGhlIHB1cnBvc2Ugb2YgdGhlIGxhYmVsIGFuZCBvZiB0aGUgYnJhbmNoaW5nIGNvbmRpdGlvbiBpcyB0bworICAgICAgIyBzcGVlZCB1cCB0aGUgc2VkIHByb2Nlc3NpbmcgKGlmIHRoZXJlIGFyZSBubyBgQCcgYXQgYWxsLCB0aGVyZQorICAgICAgIyBpcyBubyBuZWVkIHRvIGJyb3dzZSBhbnkgb2YgdGhlIHN1YnN0aXR1dGlvbnMpLgorICAgICAgIyBUaGVzZSBhcmUgdGhlIHR3byBleHRyYSBzZWQgY29tbWFuZHMgbWVudGlvbmVkIGFib3ZlLgorICAgICAgKGVjaG8gJzp0CisgIC9AW2EtekEtWl9dW2EtekEtWl8wLTldKkAvIWInICYmIGNhdCAkdG1wL3N1YnMuZnJhZykgPiR0bXAvc3Vicy0kYWNfc2VkX2ZyYWcuc2VkCisgICAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisJYWNfc2VkX2NtZHM9InNlZCAtZiAkdG1wL3N1YnMtJGFjX3NlZF9mcmFnLnNlZCIKKyAgICAgIGVsc2UKKwlhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mICR0bXAvc3Vicy0kYWNfc2VkX2ZyYWcuc2VkIgorICAgICAgZmkKKyAgICAgIGFjX3NlZF9mcmFnPWBleHByICRhY19zZWRfZnJhZyArIDFgCisgICAgICBhY19iZWc9JGFjX2VuZAorICAgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9saW5lc2AKKyAgICBmaQorICBkb25lCisgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgICBhY19zZWRfY21kcz1jYXQKKyAgZmkKK2ZpICMgdGVzdCAtbiAiJENPTkZJR19GSUxFUyIKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKK2ZvciBhY19maWxlIGluIDogJENPTkZJR19GSUxFUzsgZG8gdGVzdCAieCRhY19maWxlIiA9IHg6ICYmIGNvbnRpbnVlCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAkYWNfZmlsZSBpbgorICAtIHwgKjotIHwgKjotOiogKSAjIGlucHV0IGZyb20gc3RkaW4KKwljYXQgPiR0bXAvc3RkaW4KKwlhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsW146XSo6LCwnYAorCWFjX2ZpbGU9YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyw6LiosLCdgIDs7CisgICo6KiApIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyxbXjpdKjosLCdgCisJYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLDouKiwsJ2AgOzsKKyAgKiApICAgYWNfZmlsZV9pbj0kYWNfZmlsZS5pbiA7OworICBlc2FjCisKKyAgIyBDb21wdXRlIEBzcmNkaXJALCBAdG9wX3NyY2RpckAsIGFuZCBASU5TVEFMTEAgZm9yIHN1YmRpcmVjdG9yaWVzLgorICBhY19kaXI9YChkaXJuYW1lICIkYWNfZmlsZSIpIDI+L2Rldi9udWxsIHx8CiskYXNfZXhwciBYIiRhY19maWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvXCknIFx8IFwKKwkgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgiJGFjX2ZpbGUiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXClbXi9dLioveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYAorICB7IGlmICRhc19ta2Rpcl9wOyB0aGVuCisgICAgbWtkaXIgLXAgIiRhY19kaXIiCisgIGVsc2UKKyAgICBhc19kaXI9IiRhY19kaXIiCisgICAgYXNfZGlycz0KKyAgICB3aGlsZSB0ZXN0ICEgLWQgIiRhc19kaXIiOyBkbworICAgICAgYXNfZGlycz0iJGFzX2RpciAkYXNfZGlycyIKKyAgICAgIGFzX2Rpcj1gKGRpcm5hbWUgIiRhc19kaXIiKSAyPi9kZXYvbnVsbCB8fAorJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IFwKKwkgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgiJGFzX2RpciIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKVteL10uKi97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wpLioveyBzLy9cMS87IHE7IH0KKyAgCSAgcy8uKi8uLzsgcSdgCisgICAgZG9uZQorICAgIHRlc3QgISAtbiAiJGFzX2RpcnMiIHx8IG1rZGlyICRhc19kaXJzCisgIGZpIHx8IHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5IFwiJGFjX2RpclwiIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5IFwiJGFjX2RpclwiIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OyB9CisKKyAgYWNfYnVpbGRkaXI9LgorCitpZiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgIGFjX2Rpcl9zdWZmaXg9L2BlY2hvICIkYWNfZGlyIiB8IHNlZCAncyxeXC5bXFwvXSwsJ2AKKyAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgYWNfdG9wX2J1aWxkZGlyPWBlY2hvICIkYWNfZGlyX3N1ZmZpeCIgfCBzZWQgJ3MsL1teXFwvXSosLi4vLGcnYAorZWxzZQorICBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXI9CitmaQorCitjYXNlICRzcmNkaXIgaW4KKyAgLikgICMgTm8gLS1zcmNkaXIgb3B0aW9uLiAgV2UgYXJlIGJ1aWxkaW5nIGluIHBsYWNlLgorICAgIGFjX3NyY2Rpcj0uCisgICAgaWYgdGVzdCAteiAiJGFjX3RvcF9idWlsZGRpciI7IHRoZW4KKyAgICAgICBhY190b3Bfc3JjZGlyPS4KKyAgICBlbHNlCisgICAgICAgYWNfdG9wX3NyY2Rpcj1gZWNobyAkYWNfdG9wX2J1aWxkZGlyIHwgc2VkICdzLC8kLCwnYAorICAgIGZpIDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgcGF0aC4KKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpciA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgYWNfc3JjZGlyPSRhY190b3BfYnVpbGRkaXIkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXIkc3JjZGlyIDs7Citlc2FjCisKKyMgRG8gbm90IHVzZSBgY2QgZm9vICYmIHB3ZGAgdG8gY29tcHV0ZSBhYnNvbHV0ZSBwYXRocywgYmVjYXVzZQorIyB0aGUgZGlyZWN0b3JpZXMgbWF5IG5vdCBleGlzdC4KK2Nhc2UgYHB3ZGAgaW4KKy4pIGFjX2Fic19idWlsZGRpcj0iJGFjX2RpciI7OworKikKKyAgY2FzZSAiJGFjX2RpciIgaW4KKyAgLikgYWNfYWJzX2J1aWxkZGlyPWBwd2RgOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfYnVpbGRkaXI9IiRhY19kaXIiOzsKKyAgKikgYWNfYWJzX2J1aWxkZGlyPWBwd2RgLyIkYWNfZGlyIjs7CisgIGVzYWM7OworZXNhYworY2FzZSAkYWNfYWJzX2J1aWxkZGlyIGluCisuKSBhY19hYnNfdG9wX2J1aWxkZGlyPSR7YWNfdG9wX2J1aWxkZGlyfS47OworKikKKyAgY2FzZSAke2FjX3RvcF9idWlsZGRpcn0uIGluCisgIC4pIGFjX2Fic190b3BfYnVpbGRkaXI9JGFjX2Fic19idWlsZGRpcjs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3RvcF9idWlsZGRpcj0ke2FjX3RvcF9idWlsZGRpcn0uOzsKKyAgKikgYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfYWJzX2J1aWxkZGlyLyR7YWNfdG9wX2J1aWxkZGlyfS47OworICBlc2FjOzsKK2VzYWMKK2Nhc2UgJGFjX2Fic19idWlsZGRpciBpbgorLikgYWNfYWJzX3NyY2Rpcj0kYWNfc3JjZGlyOzsKKyopCisgIGNhc2UgJGFjX3NyY2RpciBpbgorICAuKSBhY19hYnNfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXI7OworICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic19zcmNkaXI9JGFjX3NyY2Rpcjs7CisgICopIGFjX2Fic19zcmNkaXI9JGFjX2Fic19idWlsZGRpci8kYWNfc3JjZGlyOzsKKyAgZXNhYzs7Citlc2FjCitjYXNlICRhY19hYnNfYnVpbGRkaXIgaW4KKy4pIGFjX2Fic190b3Bfc3JjZGlyPSRhY190b3Bfc3JjZGlyOzsKKyopCisgIGNhc2UgJGFjX3RvcF9zcmNkaXIgaW4KKyAgLikgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX2Fic19idWlsZGRpcjs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3RvcF9zcmNkaXI7OworICAqKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyLyRhY190b3Bfc3JjZGlyOzsKKyAgZXNhYzs7Citlc2FjCisKKworICBjYXNlICRJTlNUQUxMIGluCisgIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX0lOU1RBTEw9JElOU1RBTEwgOzsKKyAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkZGlyJElOU1RBTEwgOzsKKyAgZXNhYworCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyAkYWNfZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQorICAgIHJtIC1mICIkYWNfZmlsZSIKKyAgZmkKKyAgIyBMZXQncyBzdGlsbCBwcmV0ZW5kIGl0IGlzIGBjb25maWd1cmUnIHdoaWNoIGluc3RhbnRpYXRlcyAoaS5lLiwgZG9uJ3QKKyAgIyB1c2UgJGFzX21lKSwgcGVvcGxlIHdvdWxkIGJlIHN1cnByaXNlZCB0byByZWFkOgorICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLworICBpZiB0ZXN0IHgiJGFjX2ZpbGUiID0geC07IHRoZW4KKyAgICBjb25maWd1cmVfaW5wdXQ9CisgIGVsc2UKKyAgICBjb25maWd1cmVfaW5wdXQ9IiRhY19maWxlLiAgIgorICBmaQorICBjb25maWd1cmVfaW5wdXQ9JGNvbmZpZ3VyZV9pbnB1dCJHZW5lcmF0ZWQgZnJvbSBgZWNobyAkYWNfZmlsZV9pbiB8CisJCQkJICAgICBzZWQgJ3MsLiovLCwnYCBieSBjb25maWd1cmUuIgorCisgICMgRmlyc3QgbG9vayBmb3IgdGhlIGlucHV0IGZpbGVzIGluIHRoZSBidWlsZCB0cmVlLCBvdGhlcndpc2UgaW4gdGhlCisgICMgc3JjIHRyZWUuCisgIGFjX2ZpbGVfaW5wdXRzPWBJRlM9OgorICAgIGZvciBmIGluICRhY19maWxlX2luOyBkbworICAgICAgY2FzZSAkZiBpbgorICAgICAgLSkgZWNobyAkdG1wL3N0ZGluIDs7CisgICAgICBbXFwvJF0qKQorCSAjIEFic29sdXRlIChjYW4ndCBiZSBET1Mtc3R5bGUsIGFzIElGUz06KQorCSB0ZXN0IC1mICIkZiIgfHwgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKwkgZWNobyAiJGYiOzsKKyAgICAgICopICMgUmVsYXRpdmUKKwkgaWYgdGVzdCAtZiAiJGYiOyB0aGVuCisJICAgIyBCdWlsZCB0cmVlCisJICAgZWNobyAiJGYiCisJIGVsaWYgdGVzdCAtZiAiJHNyY2Rpci8kZiI7IHRoZW4KKwkgICAjIFNvdXJjZSB0cmVlCisJICAgZWNobyAiJHNyY2Rpci8kZiIKKwkgZWxzZQorCSAgICMgL2Rldi9udWxsIHRyZWUKKwkgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCSBmaTs7CisgICAgICBlc2FjCisgICAgZG9uZWAgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9CitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCisgIHNlZCAiJGFjX3Zwc3ViCiskZXh0cmFzdWIKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCis6dAorL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYgorcyxAY29uZmlndXJlX2lucHV0QCwkY29uZmlndXJlX2lucHV0LDt0IHQKK3MsQHNyY2RpckAsJGFjX3NyY2Rpciw7dCB0CitzLEBhYnNfc3JjZGlyQCwkYWNfYWJzX3NyY2Rpciw7dCB0CitzLEB0b3Bfc3JjZGlyQCwkYWNfdG9wX3NyY2Rpciw7dCB0CitzLEBhYnNfdG9wX3NyY2RpckAsJGFjX2Fic190b3Bfc3JjZGlyLDt0IHQKK3MsQGJ1aWxkZGlyQCwkYWNfYnVpbGRkaXIsO3QgdAorcyxAYWJzX2J1aWxkZGlyQCwkYWNfYWJzX2J1aWxkZGlyLDt0IHQKK3MsQHRvcF9idWlsZGRpckAsJGFjX3RvcF9idWlsZGRpciw7dCB0CitzLEBhYnNfdG9wX2J1aWxkZGlyQCwkYWNfYWJzX3RvcF9idWlsZGRpciw7dCB0CitzLEBJTlNUQUxMQCwkYWNfSU5TVEFMTCw7dCB0CisiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+JHRtcC9vdXQKKyAgcm0gLWYgJHRtcC9zdGRpbgorICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisgICAgbXYgJHRtcC9vdXQgJGFjX2ZpbGUKKyAgZWxzZQorICAgIGNhdCAkdG1wL291dAorICAgIHJtIC1mICR0bXAvb3V0CisgIGZpCisKK2RvbmUKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCisKKyMKKyMgQ09ORklHX0hFQURFUiBzZWN0aW9uLgorIworCisjIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQorIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgorIworIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgorYWNfZEE9J3MsXlwoWwkgXSpcKSNcKFsJIF0qZGVmaW5lWwkgXVsJIF0qXCknCithY19kQj0nWwkgXS4qJCxcMSNcMicKK2FjX2RDPScgJworYWNfZEQ9Jyw7dCcKKyMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCithY191QT0ncyxeXChbCSBdKlwpI1woWwkgXSpcKXVuZGVmXChbCSBdWwkgXSpcKScKK2FjX3VCPSckLFwxI1wyZGVmaW5lXDMnCithY191Qz0nICcKK2FjX3VEPScsO3QnCisKK2ZvciBhY19maWxlIGluIDogJENPTkZJR19IRUFERVJTOyBkbyB0ZXN0ICJ4JGFjX2ZpbGUiID0geDogJiYgY29udGludWUKKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICRhY19maWxlIGluCisgIC0gfCAqOi0gfCAqOi06KiApICMgaW5wdXQgZnJvbSBzdGRpbgorCWNhdCA+JHRtcC9zdGRpbgorCWFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyxbXjpdKjosLCdgCisJYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLDouKiwsJ2AgOzsKKyAgKjoqICkgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLFteOl0qOiwsJ2AKKwlhY19maWxlPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsOi4qLCwnYCA7OworICAqICkgICBhY19maWxlX2luPSRhY19maWxlLmluIDs7CisgIGVzYWMKKworICB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtICYmIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRhY19maWxlIiA+JjUKK2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNjt9CisKKyAgIyBGaXJzdCBsb29rIGZvciB0aGUgaW5wdXQgZmlsZXMgaW4gdGhlIGJ1aWxkIHRyZWUsIG90aGVyd2lzZSBpbiB0aGUKKyAgIyBzcmMgdHJlZS4KKyAgYWNfZmlsZV9pbnB1dHM9YElGUz06CisgICAgZm9yIGYgaW4gJGFjX2ZpbGVfaW47IGRvCisgICAgICBjYXNlICRmIGluCisgICAgICAtKSBlY2hvICR0bXAvc3RkaW4gOzsKKyAgICAgIFtcXC8kXSopCisJICMgQWJzb2x1dGUgKGNhbid0IGJlIERPUy1zdHlsZSwgYXMgSUZTPTopCisJIHRlc3QgLWYgIiRmIiB8fCB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCSAjIERvIHF1b3RlICRmLCB0byBwcmV2ZW50IERPUyBwYXRocyBmcm9tIGJlaW5nIElGUydkLgorCSBlY2hvICIkZiI7OworICAgICAgKikgIyBSZWxhdGl2ZQorCSBpZiB0ZXN0IC1mICIkZiI7IHRoZW4KKwkgICAjIEJ1aWxkIHRyZWUKKwkgICBlY2hvICIkZiIKKwkgZWxpZiB0ZXN0IC1mICIkc3JjZGlyLyRmIjsgdGhlbgorCSAgICMgU291cmNlIHRyZWUKKwkgICBlY2hvICIkc3JjZGlyLyRmIgorCSBlbHNlCisJICAgIyAvZGV2L251bGwgdHJlZQorCSAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisJIGZpOzsKKyAgICAgIGVzYWMKKyAgICBkb25lYCB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KKyAgIyBSZW1vdmUgdGhlIHRyYWlsaW5nIHNwYWNlcy4KKyAgc2VkICdzL1sJIF0qJC8vJyAkYWNfZmlsZV9pbnB1dHMgPiR0bXAvaW4KKworX0FDRU9GCisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byB0d28gc2VkIHNjcmlwdHMsIGBjb25mdGVzdC5kZWZpbmVzJyBhbmQKKyMgYGNvbmZ0ZXN0LnVuZGVmcycsIHRoYXQgc3Vic3RpdHV0ZXMgdGhlIHByb3BlciB2YWx1ZXMgaW50bworIyBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgVGhlIGZpcnN0IGhhbmRsZXMgYCNkZWZpbmUnCisjIHRlbXBsYXRlcywgYW5kIHRoZSBzZWNvbmQgYCN1bmRlZicgdGVtcGxhdGVzLgorIyBBbmQgZmlyc3Q6IFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbgorIyBjb25maWcuc3RhdHVzLiAgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQKKyMgaW4gY29uZmlnLnN0YXR1cy4KK3JtIC1mIGNvbmZ0ZXN0LmRlZmluZXMgY29uZnRlc3QudW5kZWZzCisjIFVzaW5nIGEgaGVyZSBkb2N1bWVudCBpbnN0ZWFkIG9mIGEgc3RyaW5nIHJlZHVjZXMgdGhlIHF1b3RpbmcgbmlnaHRtYXJlLgorIyBQdXR0aW5nIGNvbW1lbnRzIGluIHNlZCBzY3JpcHRzIGlzIG5vdCBwb3J0YWJsZS4KKyMKKyMgYGVuZCcgaXMgdXNlZCB0byBhdm9pZCB0aGF0IHRoZSBzZWNvbmQgbWFpbiBzZWQgY29tbWFuZCAobWVhbnQgZm9yCisjIDAtYXJ5IENQUCBtYWNyb3MpIGFwcGxpZXMgdG8gbi1hcnkgbWFjcm8gZGVmaW5pdGlvbnMuCisjIFNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiBmb3IgYGNsZWFyJy4KK2NhdCA+Y29uZmRlZjJzZWQuc2VkIDw8XF9BQ0VPRgorcy9bXFwmLF0vXFwmL2cKK3MsW1xcJGBdLFxcJixnCit0IGNsZWFyCis6IGNsZWFyCitzLF5bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKlwoW14JIChdW14JIChdKlwpXCgoW14pXSopXClbCSBdKlwoLipcKSQsJHthY19kQX1cMSR7YWNfZEJ9XDFcMiR7YWNfZEN9XDMke2FjX2REfSxncAordCBlbmQKK3MsXlsJIF0qI1sJIF0qZGVmaW5lWwkgXVsJIF0qXChbXgkgXVteCSBdKlwpWwkgXSpcKC4qXCkkLCR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9LGdwCis6IGVuZAorX0FDRU9GCisjIElmIHNvbWUgbWFjcm9zIHdlcmUgY2FsbGVkIHNldmVyYWwgdGltZXMgdGhlcmUgbWlnaHQgYmUgc2V2ZXJhbCB0aW1lcworIyB0aGUgc2FtZSAjZGVmaW5lcywgd2hpY2ggaXMgdXNlbGVzcy4gIE5ldmVydGhlbGVzcywgd2UgbWF5IG5vdCB3YW50IHRvCisjIHNvcnQgdGhlbSwgc2luY2Ugd2Ugd2FudCB0aGUgKmxhc3QqIEFDLURFRklORSB0byBiZSBob25vcmVkLgordW5pcSBjb25mZGVmcy5oIHwgc2VkIC1uIC1mIGNvbmZkZWYyc2VkLnNlZCA+Y29uZnRlc3QuZGVmaW5lcworc2VkICdzL2FjX2QvYWNfdS9nJyBjb25mdGVzdC5kZWZpbmVzID5jb25mdGVzdC51bmRlZnMKK3JtIC1mIGNvbmZkZWYyc2VkLnNlZAorCisjIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCisjIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCisjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KK2NhdCA+PmNvbmZ0ZXN0LnVuZGVmcyA8PFxfQUNFT0YKK3MsXlsJIF0qI1sJIF0qdW5kZWZbCSBdWwkgXSpbYS16QS1aX11bYS16QS1aXzAtOV0qLC8qICYgKi8sCitfQUNFT0YKKworIyBCcmVhayB1cCBjb25mdGVzdC5kZWZpbmVzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uIHRoZSBzaXplCisjIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vICgxMDAgY21kcykuCitlY2hvICcgICMgSGFuZGxlIGFsbCB0aGUgI2RlZmluZSB0ZW1wbGF0ZXMgb25seSBpZiBuZWNlc3NhcnkuJyA+PiRDT05GSUdfU1RBVFVTCitlY2hvICcgIGlmIGdyZXAgIl5bCSBdKiNbCSBdKmRlZmluZSIgJHRtcC9pbiA+L2Rldi9udWxsOyB0aGVuJyA+PiRDT05GSUdfU1RBVFVTCitlY2hvICcgICMgSWYgdGhlcmUgYXJlIG5vIGRlZmluZXMsIHdlIG1heSBoYXZlIGFuIGVtcHR5IGlmL2ZpJyA+PiRDT05GSUdfU1RBVFVTCitlY2hvICcgIDonID4+JENPTkZJR19TVEFUVVMKK3JtIC1mIGNvbmZ0ZXN0LnRhaWwKK3doaWxlIGdyZXAgLiBjb25mdGVzdC5kZWZpbmVzID4vZGV2L251bGwKK2RvCisgICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byAkdG1wL2RlZmluZXMuc2VkLgorICBlY2hvICcgIGNhdCA+JHRtcC9kZWZpbmVzLnNlZCA8PENFT0YnID4+JENPTkZJR19TVEFUVVMKKyAgIyBTcGVlZCB1cDogZG9uJ3QgY29uc2lkZXIgdGhlIG5vbiBgI2RlZmluZScgbGluZXMuCisgIGVjaG8gJy9eWwkgXSojWwkgXSpkZWZpbmUvIWInID4+JENPTkZJR19TVEFUVVMKKyAgIyBXb3JrIGFyb3VuZCB0aGUgZm9yZ2V0LXRvLXJlc2V0LXRoZS1mbGFnIGJ1Zy4KKyAgZWNobyAndCBjbHInID4+JENPTkZJR19TVEFUVVMKKyAgZWNobyAnOiBjbHInID4+JENPTkZJR19TVEFUVVMKKyAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC5kZWZpbmVzID4+JENPTkZJR19TVEFUVVMKKyAgZWNobyAnQ0VPRgorICBzZWQgLWYgJHRtcC9kZWZpbmVzLnNlZCAkdG1wL2luID4kdG1wL291dAorICBybSAtZiAkdG1wL2luCisgIG12ICR0bXAvb3V0ICR0bXAvaW4KKycgPj4kQ09ORklHX1NUQVRVUworICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QuZGVmaW5lcyA+Y29uZnRlc3QudGFpbAorICBybSAtZiBjb25mdGVzdC5kZWZpbmVzCisgIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QuZGVmaW5lcworZG9uZQorcm0gLWYgY29uZnRlc3QuZGVmaW5lcworZWNobyAnICBmaSAjIGdyZXAnID4+JENPTkZJR19TVEFUVVMKK2VjaG8gPj4kQ09ORklHX1NUQVRVUworCisjIEJyZWFrIHVwIGNvbmZ0ZXN0LnVuZGVmcyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbiB0aGUgc2l6ZQorIyBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvbyAoMTAwIGNtZHMpLgorZWNobyAnICAjIEhhbmRsZSBhbGwgdGhlICN1bmRlZiB0ZW1wbGF0ZXMnID4+JENPTkZJR19TVEFUVVMKK3JtIC1mIGNvbmZ0ZXN0LnRhaWwKK3doaWxlIGdyZXAgLiBjb25mdGVzdC51bmRlZnMgPi9kZXYvbnVsbAorZG8KKyAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvICR0bXAvdW5kZWZzLnNlZC4KKyAgZWNobyAnICBjYXQgPiR0bXAvdW5kZWZzLnNlZCA8PENFT0YnID4+JENPTkZJR19TVEFUVVMKKyAgIyBTcGVlZCB1cDogZG9uJ3QgY29uc2lkZXIgdGhlIG5vbiBgI3VuZGVmJworICBlY2hvICcvXlsJIF0qI1sJIF0qdW5kZWYvIWInID4+JENPTkZJR19TVEFUVVMKKyAgIyBXb3JrIGFyb3VuZCB0aGUgZm9yZ2V0LXRvLXJlc2V0LXRoZS1mbGFnIGJ1Zy4KKyAgZWNobyAndCBjbHInID4+JENPTkZJR19TVEFUVVMKKyAgZWNobyAnOiBjbHInID4+JENPTkZJR19TVEFUVVMKKyAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC51bmRlZnMgPj4kQ09ORklHX1NUQVRVUworICBlY2hvICdDRU9GCisgIHNlZCAtZiAkdG1wL3VuZGVmcy5zZWQgJHRtcC9pbiA+JHRtcC9vdXQKKyAgcm0gLWYgJHRtcC9pbgorICBtdiAkdG1wL291dCAkdG1wL2luCisnID4+JENPTkZJR19TVEFUVVMKKyAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnVuZGVmcyA+Y29uZnRlc3QudGFpbAorICBybSAtZiBjb25mdGVzdC51bmRlZnMKKyAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC51bmRlZnMKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0LnVuZGVmcworCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKyAgIyBMZXQncyBzdGlsbCBwcmV0ZW5kIGl0IGlzIGBjb25maWd1cmUnIHdoaWNoIGluc3RhbnRpYXRlcyAoaS5lLiwgZG9uJ3QKKyAgIyB1c2UgJGFzX21lKSwgcGVvcGxlIHdvdWxkIGJlIHN1cnByaXNlZCB0byByZWFkOgorICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLworICBpZiB0ZXN0IHgiJGFjX2ZpbGUiID0geC07IHRoZW4KKyAgICBlY2hvICIvKiBHZW5lcmF0ZWQgYnkgY29uZmlndXJlLiAgKi8iID4kdG1wL2NvbmZpZy5oCisgIGVsc2UKKyAgICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBieSBjb25maWd1cmUuICAqLyIgPiR0bXAvY29uZmlnLmgKKyAgZmkKKyAgY2F0ICR0bXAvaW4gPj4kdG1wL2NvbmZpZy5oCisgIHJtIC1mICR0bXAvaW4KKyAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgorICAgIGlmIGRpZmYgJGFjX2ZpbGUgJHRtcC9jb25maWcuaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY1CitlY2hvICIkYXNfbWU6ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY2O30KKyAgICBlbHNlCisgICAgICBhY19kaXI9YChkaXJuYW1lICIkYWNfZmlsZSIpIDI+L2Rldi9udWxsIHx8CiskYXNfZXhwciBYIiRhY19maWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvXCknIFx8IFwKKwkgLiAgICAgOiAnXCguXCknIDI+L2Rldi9udWxsIHx8CitlY2hvIFgiJGFjX2ZpbGUiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXClbXi9dLioveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYAorICAgICAgeyBpZiAkYXNfbWtkaXJfcDsgdGhlbgorICAgIG1rZGlyIC1wICIkYWNfZGlyIgorICBlbHNlCisgICAgYXNfZGlyPSIkYWNfZGlyIgorICAgIGFzX2RpcnM9CisgICAgd2hpbGUgdGVzdCAhIC1kICIkYXNfZGlyIjsgZG8KKyAgICAgIGFzX2RpcnM9IiRhc19kaXIgJGFzX2RpcnMiCisgICAgICBhc19kaXI9YChkaXJuYW1lICIkYXNfZGlyIikgMj4vZGV2L251bGwgfHwKKyRhc19leHByIFgiJGFzX2RpciIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoL1wpJyBcfCBcCisJIC4gICAgIDogJ1woLlwpJyAyPi9kZXYvbnVsbCB8fAorZWNobyBYIiRhc19kaXIiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXClbXi9dLioveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYAorICAgIGRvbmUKKyAgICB0ZXN0ICEgLW4gIiRhc19kaXJzIiB8fCBta2RpciAkYXNfZGlycworICBmaSB8fCB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSBcIiRhY19kaXJcIiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSBcIiRhY19kaXJcIiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTsgfQorCisgICAgICBybSAtZiAkYWNfZmlsZQorICAgICAgbXYgJHRtcC9jb25maWcuaCAkYWNfZmlsZQorICAgIGZpCisgIGVsc2UKKyAgICBjYXQgJHRtcC9jb25maWcuaAorICAgIHJtIC1mICR0bXAvY29uZmlnLmgKKyAgZmkKKyMgQ29tcHV0ZSAkYWNfZmlsZSdzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KK19hbV9zdGFtcF9jb3VudD0xCitmb3IgX2FtX2hlYWRlciBpbiAkY29uZmlnX2hlYWRlcnMgOjsgZG8KKyAgY2FzZSAkX2FtX2hlYWRlciBpbgorICAgICRhY19maWxlIHwgJGFjX2ZpbGU6KiApCisgICAgICBicmVhayA7OworICAgICogKQorICAgICAgX2FtX3N0YW1wX2NvdW50PWBleHByICRfYW1fc3RhbXBfY291bnQgKyAxYCA7OworICBlc2FjCitkb25lCitlY2hvICJ0aW1lc3RhbXAgZm9yICRhY19maWxlIiA+YChkaXJuYW1lICRhY19maWxlKSAyPi9kZXYvbnVsbCB8fAorJGFzX2V4cHIgWCRhY19maWxlIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgkYWNfZmlsZSA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYJGFjX2ZpbGUgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCRhY19maWxlIDogJ1hcKC9cKScgXHwgXAorCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKK2VjaG8gWCRhY19maWxlIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXClbXi9dLioveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYC9zdGFtcC1oJF9hbV9zdGFtcF9jb3VudAorZG9uZQorX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKworIworIyBDT05GSUdfQ09NTUFORFMgc2VjdGlvbi4KKyMKK2ZvciBhY19maWxlIGluIDogJENPTkZJR19DT01NQU5EUzsgZG8gdGVzdCAieCRhY19maWxlIiA9IHg6ICYmIGNvbnRpbnVlCisgIGFjX2Rlc3Q9YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyw6LiosLCdgCisgIGFjX3NvdXJjZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLFteOl0qOiwsJ2AKKyAgYWNfZGlyPWAoZGlybmFtZSAiJGFjX2Rlc3QiKSAyPi9kZXYvbnVsbCB8fAorJGFzX2V4cHIgWCIkYWNfZGVzdCIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYWNfZGVzdCIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYWNfZGVzdCIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYWNfZGVzdCIgOiAnWFwoL1wpJyBcfCBcCisJIC4gICAgIDogJ1woLlwpJyAyPi9kZXYvbnVsbCB8fAorZWNobyBYIiRhY19kZXN0IiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpW14vXS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXCkuKi97IHMvL1wxLzsgcTsgfQorICAJICBzLy4qLy4vOyBxJ2AKKyAgeyBpZiAkYXNfbWtkaXJfcDsgdGhlbgorICAgIG1rZGlyIC1wICIkYWNfZGlyIgorICBlbHNlCisgICAgYXNfZGlyPSIkYWNfZGlyIgorICAgIGFzX2RpcnM9CisgICAgd2hpbGUgdGVzdCAhIC1kICIkYXNfZGlyIjsgZG8KKyAgICAgIGFzX2RpcnM9IiRhc19kaXIgJGFzX2RpcnMiCisgICAgICBhc19kaXI9YChkaXJuYW1lICIkYXNfZGlyIikgMj4vZGV2L251bGwgfHwKKyRhc19leHByIFgiJGFzX2RpciIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoL1wpJyBcfCBcCisJIC4gICAgIDogJ1woLlwpJyAyPi9kZXYvbnVsbCB8fAorZWNobyBYIiRhc19kaXIiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXClbXi9dLioveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cKS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIHMvLiovLi87IHEnYAorICAgIGRvbmUKKyAgICB0ZXN0ICEgLW4gIiRhc19kaXJzIiB8fCBta2RpciAkYXNfZGlycworICBmaSB8fCB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSBcIiRhY19kaXJcIiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSBcIiRhY19kaXJcIiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTsgfQorCisgIGFjX2J1aWxkZGlyPS4KKworaWYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICBhY19kaXJfc3VmZml4PS9gZWNobyAiJGFjX2RpciIgfCBzZWQgJ3MsXlwuW1xcL10sLCdgCisgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgIGFjX3RvcF9idWlsZGRpcj1gZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzLC9bXlxcL10qLC4uLyxnJ2AKK2Vsc2UKKyAgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyPQorZmkKKworY2FzZSAkc3JjZGlyIGluCisgIC4pICAjIE5vIC0tc3JjZGlyIG9wdGlvbi4gIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KKyAgICBhY19zcmNkaXI9LgorICAgIGlmIHRlc3QgLXogIiRhY190b3BfYnVpbGRkaXIiOyB0aGVuCisgICAgICAgYWNfdG9wX3NyY2Rpcj0uCisgICAgZWxzZQorICAgICAgIGFjX3RvcF9zcmNkaXI9YGVjaG8gJGFjX3RvcF9idWlsZGRpciB8IHNlZCAncywvJCwsJ2AKKyAgICBmaSA7OworICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIHBhdGguCisgICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKKyAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyJHNyY2RpciRhY19kaXJfc3VmZml4CisgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyJHNyY2RpciA7OworZXNhYworCisjIERvIG5vdCB1c2UgYGNkIGZvbyAmJiBwd2RgIHRvIGNvbXB1dGUgYWJzb2x1dGUgcGF0aHMsIGJlY2F1c2UKKyMgdGhlIGRpcmVjdG9yaWVzIG1heSBub3QgZXhpc3QuCitjYXNlIGBwd2RgIGluCisuKSBhY19hYnNfYnVpbGRkaXI9IiRhY19kaXIiOzsKKyopCisgIGNhc2UgIiRhY19kaXIiIGluCisgIC4pIGFjX2Fic19idWlsZGRpcj1gcHdkYDs7CisgIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX2J1aWxkZGlyPSIkYWNfZGlyIjs7CisgICopIGFjX2Fic19idWlsZGRpcj1gcHdkYC8iJGFjX2RpciI7OworICBlc2FjOzsKK2VzYWMKK2Nhc2UgJGFjX2Fic19idWlsZGRpciBpbgorLikgYWNfYWJzX3RvcF9idWlsZGRpcj0ke2FjX3RvcF9idWlsZGRpcn0uOzsKKyopCisgIGNhc2UgJHthY190b3BfYnVpbGRkaXJ9LiBpbgorICAuKSBhY19hYnNfdG9wX2J1aWxkZGlyPSRhY19hYnNfYnVpbGRkaXI7OworICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic190b3BfYnVpbGRkaXI9JHthY190b3BfYnVpbGRkaXJ9Ljs7CisgICopIGFjX2Fic190b3BfYnVpbGRkaXI9JGFjX2Fic19idWlsZGRpci8ke2FjX3RvcF9idWlsZGRpcn0uOzsKKyAgZXNhYzs7Citlc2FjCitjYXNlICRhY19hYnNfYnVpbGRkaXIgaW4KKy4pIGFjX2Fic19zcmNkaXI9JGFjX3NyY2Rpcjs7CisqKQorICBjYXNlICRhY19zcmNkaXIgaW4KKyAgLikgYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfc3JjZGlyPSRhY19zcmNkaXI7OworICAqKSBhY19hYnNfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXIvJGFjX3NyY2Rpcjs7CisgIGVzYWM7OworZXNhYworY2FzZSAkYWNfYWJzX2J1aWxkZGlyIGluCisuKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfdG9wX3NyY2Rpcjs7CisqKQorICBjYXNlICRhY190b3Bfc3JjZGlyIGluCisgIC4pIGFjX2Fic190b3Bfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXI7OworICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic190b3Bfc3JjZGlyPSRhY190b3Bfc3JjZGlyOzsKKyAgKikgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX2Fic19idWlsZGRpci8kYWNfdG9wX3NyY2Rpcjs7CisgIGVzYWM7OworZXNhYworCisKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXhlY3V0aW5nICRhY19kZXN0IGNvbW1hbmRzIiA+JjUKK2VjaG8gIiRhc19tZTogZXhlY3V0aW5nICRhY19kZXN0IGNvbW1hbmRzIiA+JjY7fQorICBjYXNlICRhY19kZXN0IGluCisgICAgZGVwZmlsZXMgKSB0ZXN0IHgiJEFNREVQX1RSVUUiICE9IHgiIiB8fCBmb3IgbWYgaW4gJENPTkZJR19GSUxFUzsgZG8KKyAgIyBTdHJpcCBNRiBzbyB3ZSBlbmQgdXAgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgbWY9YGVjaG8gIiRtZiIgfCBzZWQgLWUgJ3MvOi4qJC8vJ2AKKyAgIyBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYW4gQXV0b21ha2UgZ2VuZXJhdGVkIE1ha2VmaWxlIG9yIG5vdC4KKyAgIyBXZSB1c2VkIHRvIG1hdGNoIG9ubHkgdGhlIGZpbGVzIG5hbWVkIGBNYWtlZmlsZS5pbicsIGJ1dAorICAjIHNvbWUgcGVvcGxlIHJlbmFtZSB0aGVtOyBzbyBpbnN0ZWFkIHdlIGxvb2sgYXQgdGhlIGZpbGUgY29udGVudC4KKyAgIyBHcmVwJ2luZyB0aGUgZmlyc3QgbGluZSBpcyBub3QgZW5vdWdoOiBzb21lIHBlb3BsZSBwb3N0LXByb2Nlc3MKKyAgIyBlYWNoIE1ha2VmaWxlLmluIGFuZCBhZGQgYSBuZXcgbGluZSBvbiB0b3Agb2YgZWFjaCBmaWxlIHRvIHNheSBzby4KKyAgIyBTbyBsZXQncyBncmVwIHdob2xlIGZpbGUuCisgIGlmIGdyZXAgJ14jLipnZW5lcmF0ZWQgYnkgYXV0b21ha2UnICRtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgZGlycGFydD1gKGRpcm5hbWUgIiRtZiIpIDI+L2Rldi9udWxsIHx8CiskYXNfZXhwciBYIiRtZiIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkbWYiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJG1mIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRtZiIgOiAnWFwoL1wpJyBcfCBcCisJIC4gICAgIDogJ1woLlwpJyAyPi9kZXYvbnVsbCB8fAorZWNobyBYIiRtZiIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKVteL10uKi97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wpLioveyBzLy9cMS87IHE7IH0KKyAgCSAgcy8uKi8uLzsgcSdgCisgIGVsc2UKKyAgICBjb250aW51ZQorICBmaQorICAjIEV4dHJhY3QgdGhlIGRlZmluaXRpb24gb2YgREVQRElSLCBhbV9faW5jbHVkZSwgYW5kIGFtX19xdW90ZQorICAjIGZyb20gdGhlIE1ha2VmaWxlIHdpdGhvdXQgcnVubmluZyBgbWFrZScuCisgIERFUERJUj1gc2VkIC1uICdzL15ERVBESVIgPSAvL3AnIDwgIiRtZiJgCisgIHRlc3QgLXogIiRERVBESVIiICYmIGNvbnRpbnVlCisgIGFtX19pbmNsdWRlPWBzZWQgLW4gJ3MvXmFtX19pbmNsdWRlID0gLy9wJyA8ICIkbWYiYAorICB0ZXN0IC16ICJhbV9faW5jbHVkZSIgJiYgY29udGludWUKKyAgYW1fX3F1b3RlPWBzZWQgLW4gJ3MvXmFtX19xdW90ZSA9IC8vcCcgPCAiJG1mImAKKyAgIyBXaGVuIHVzaW5nIGFuc2kya25yLCBVIG1heSBiZSBlbXB0eSBvciBhbiB1bmRlcnNjb3JlOyBleHBhbmQgaXQKKyAgVT1gc2VkIC1uICdzL15VID0gLy9wJyA8ICIkbWYiYAorICAjIEZpbmQgYWxsIGRlcGVuZGVuY3kgb3V0cHV0IGZpbGVzLCB0aGV5IGFyZSBpbmNsdWRlZCBmaWxlcyB3aXRoCisgICMgJChERVBESVIpIGluIHRoZWlyIG5hbWVzLiAgV2UgaW52b2tlIHNlZCB0d2ljZSBiZWNhdXNlIGl0IGlzIHRoZQorICAjIHNpbXBsZXN0IGFwcHJvYWNoIHRvIGNoYW5naW5nICQoREVQRElSKSB0byBpdHMgYWN0dWFsIHZhbHVlIGluIHRoZQorICAjIGV4cGFuc2lvbi4KKyAgZm9yIGZpbGUgaW4gYHNlZCAtbiAiCisgICAgcy9eJGFtX19pbmNsdWRlICRhbV9fcXVvdGVcKC4qKERFUERJUikuKlwpJGFtX19xdW90ZSInJC9cMS9wJyA8IiRtZiIgfCBcCisgICAgICAgc2VkIC1lICdzL1wkKERFUERJUikvJyIkREVQRElSIicvZycgLWUgJ3MvXCRVLyciJFUiJy9nJ2A7IGRvCisgICAgIyBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMuCisgICAgdGVzdCAtZiAiJGRpcnBhcnQvJGZpbGUiICYmIGNvbnRpbnVlCisgICAgZmRpcj1gKGRpcm5hbWUgIiRmaWxlIikgMj4vZGV2L251bGwgfHwKKyRhc19leHByIFgiJGZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGZpbGUiIDogJ1hcKC9cKScgXHwgXAorCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKK2VjaG8gWCIkZmlsZSIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKVteL10uKi97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXC9cKSQveyBzLy9cMS87IHE7IH0KKyAgCSAgL15YXChcL1wpLioveyBzLy9cMS87IHE7IH0KKyAgCSAgcy8uKi8uLzsgcSdgCisgICAgeyBpZiAkYXNfbWtkaXJfcDsgdGhlbgorICAgIG1rZGlyIC1wICRkaXJwYXJ0LyRmZGlyCisgIGVsc2UKKyAgICBhc19kaXI9JGRpcnBhcnQvJGZkaXIKKyAgICBhc19kaXJzPQorICAgIHdoaWxlIHRlc3QgISAtZCAiJGFzX2RpciI7IGRvCisgICAgICBhc19kaXJzPSIkYXNfZGlyICRhc19kaXJzIgorICAgICAgYXNfZGlyPWAoZGlybmFtZSAiJGFzX2RpciIpIDI+L2Rldi9udWxsIHx8CiskYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgXAorCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKK2VjaG8gWCIkYXNfZGlyIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpW14vXS4qL3sgcy8vXDEvOyBxOyB9CisgIAkgIC9eWFwoXC9cL1wpJC97IHMvL1wxLzsgcTsgfQorICAJICAvXlhcKFwvXCkuKi97IHMvL1wxLzsgcTsgfQorICAJICBzLy4qLy4vOyBxJ2AKKyAgICBkb25lCisgICAgdGVzdCAhIC1uICIkYXNfZGlycyIgfHwgbWtkaXIgJGFzX2RpcnMKKyAgZmkgfHwgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGRpcnBhcnQvJGZkaXIiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGRpcnBhcnQvJGZkaXIiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KKworICAgICMgZWNobyAiY3JlYXRpbmcgJGRpcnBhcnQvJGZpbGUiCisgICAgZWNobyAnIyBkdW1teScgPiAiJGRpcnBhcnQvJGZpbGUiCisgIGRvbmUKK2RvbmUKKyA7OworICBlc2FjCitkb25lCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCisKK3sgKGV4aXQgMCk7IGV4aXQgMDsgfQorX0FDRU9GCitjaG1vZCAreCAkQ09ORklHX1NUQVRVUworYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKKworCisjIGNvbmZpZ3VyZSBpcyB3cml0aW5nIHRvIGNvbmZpZy5sb2csIGFuZCB0aGVuIGNhbGxzIGNvbmZpZy5zdGF0dXMuCisjIGNvbmZpZy5zdGF0dXMgZG9lcyBpdHMgb3duIHJlZGlyZWN0aW9uLCBhcHBlbmRpbmcgdG8gY29uZmlnLmxvZy4KKyMgVW5mb3J0dW5hdGVseSwgb24gRE9TIHRoaXMgZmFpbHMsIGFzIGNvbmZpZy5sb2cgaXMgc3RpbGwga2VwdCBvcGVuCisjIGJ5IGNvbmZpZ3VyZSwgc28gY29uZmlnLnN0YXR1cyB3b24ndCBiZSBhYmxlIHRvIHdyaXRlIHRvIGl0OyBpdHMKKyMgb3V0cHV0IGlzIHNpbXBseSBkaXNjYXJkZWQuICBTbyB3ZSBleGVjIHRoZSBGRCB0byAvZGV2L251bGwsCisjIGVmZmVjdGl2ZWx5IGNsb3NpbmcgY29uZmlnLmxvZywgc28gaXQgY2FuIGJlIHByb3Blcmx5IChyZSlvcGVuZWQgYW5kCisjIGFwcGVuZGVkIHRvIGJ5IGNvbmZpZy5zdGF0dXMuICBXaGVuIGNvbWluZyBiYWNrIHRvIGNvbmZpZ3VyZSwgd2UKKyMgbmVlZCB0byBtYWtlIHRoZSBGRCBhdmFpbGFibGUgYWdhaW4uCitpZiB0ZXN0ICIkbm9fY3JlYXRlIiAhPSB5ZXM7IHRoZW4KKyAgYWNfY3Nfc3VjY2Vzcz06CisgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0KKyAgdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYKKyAgICBhY19jb25maWdfc3RhdHVzX2FyZ3M9IiRhY19jb25maWdfc3RhdHVzX2FyZ3MgLS1xdWlldCIKKyAgZXhlYyA1Pi9kZXYvbnVsbAorICAkU0hFTEwgJENPTkZJR19TVEFUVVMgJGFjX2NvbmZpZ19zdGF0dXNfYXJncyB8fCBhY19jc19zdWNjZXNzPWZhbHNlCisgIGV4ZWMgNT4+Y29uZmlnLmxvZworICAjIFVzZSB8fCwgbm90ICYmLCB0byBhdm9pZCBleGl0aW5nIGZyb20gdGhlIGlmIHdpdGggJD8gPSAxLCB3aGljaAorICAjIHdvdWxkIG1ha2UgY29uZmlndXJlIGZhaWwgaWYgdGhpcyBpcyB0aGUgbGFzdCBpbnN0cnVjdGlvbi4KKyAgJGFjX2NzX3N1Y2Nlc3MgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9CitmaQorCmRpZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI5ZTFkOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ3VyZS5hYwpAQCAtMCwwICsxLDY3MCBAQAorZG5sIENvbmZpZ3VyZSBzY3JpcHQgZm9yIEdSVUIuCitkbmwgQ29weXJpZ2h0IDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwMywyMDA0LDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK2RubCBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG5sIGRvY3VtZW50YXRpb24gaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgYm90aCB0aGUgY29weXJpZ2h0Citkbmwgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIG9mIHRoZQorZG5sIHNvZnR3YXJlLCBkZXJpdmF0aXZlIHdvcmtzIG9yIG1vZGlmaWVkIHZlcnNpb25zLCBhbmQgYW55IHBvcnRpb25zCitkbmwgdGhlcmVvZiwgYW5kIHRoYXQgYm90aCBub3RpY2VzIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uCitkbmwKK2RubCBUSEUgRlJFRSBTT0ZUV0FSRSBGT1VOREFUSU9OIEFMTE9XUyBGUkVFIFVTRSBPRiBUSElTIFNPRlRXQVJFIElOIElUUworZG5sICJBUyBJUyIgQ09ORElUSU9OLiAgVEhFIEZSRUUgU09GVFdBUkUgRk9VTkRBVElPTiBESVNDTEFJTVMgQU5ZCitkbmwgTElBQklMSVRZIE9GIEFOWSBLSU5EIEZPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIFRIRQorZG5sIFVTRSBPRiBUSElTIFNPRlRXQVJFLgorCitBQ19QUkVSRVEoMi41NykKK0FDX0lOSVQoW0dSVUJdLCBbMC45N10sIFtidWctZ3J1YkBnbnUub3JnXSkKK0FDX0NPTkZJR19TUkNESVIoW3N0YWdlMi9zdGFnZTIuY10pCitBQ19DT05GSUdfSEVBREVSKFtjb25maWcuaF0pCitBTV9JTklUX0FVVE9NQUtFCisKK0FDX0NBTk9OSUNBTF9IT1NUCisKK2Nhc2UgIiRob3N0X2NwdSIgaW4KK2lbWzM0NTZdXTg2KSBob3N0X2NwdT1pMzg2IDs7Cit4ODZfNjQpIGhvc3RfY3B1PXg4Nl82NCA7OworKikgQUNfTVNHX0VSUk9SKFt1bnN1cHBvcnRlZCBDUFUgdHlwZV0pIDs7Citlc2FjCisKK0FDX1NVQlNUKGhvc3RfY3B1KQorQUNfU1VCU1QoaG9zdF92ZW5kb3IpCisKKyMKKyMgT3B0aW9ucworIworCitBTV9NQUlOVEFJTkVSX01PREUKK2lmIHRlc3QgIngkZW5hYmxlX21haW50YWluZXJfbW9kZSIgPSB4eWVzOyB0aGVuCisgIEFDX1BBVEhfUFJPRyhQRVJMLHBlcmwpCisgIGlmIHRlc3QgLXogIiRQRVJMIjsgdGhlbgorICAgIEFDX01TR19FUlJPUihbcGVybCBub3QgZm91bmRdKQorICBmaQorZmkKKworIyBUaGlzIHNob3VsZCBiZSBjaGVja2VkIGJlZm9yZSBBQ19QUk9HX0NDCitpZiB0ZXN0ICJ4JENGTEFHUyIgPSB4OyB0aGVuCisgIGRlZmF1bHRfQ0ZMQUdTPXllcworZmkKKworaWYgdGVzdCAieCRob3N0X2NwdSIgPSB4eDg2XzY0OyB0aGVuCisgIENGTEFHUz0iLW0zMiAkQ0ZMQUdTIgorZmkKKworIworIyBQcm9ncmFtcworIworCitBQ19DSEVDS19UT09MKENDLCBnY2MpCitBQ19QUk9HX0NDCisjIFdlIG5lZWQgdGhpcyBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgQXV0b2NvbmYuCitfQU1fREVQRU5ERU5DSUVTKENDKQorCitkbmwgQmVjYXVzZSByZWNlbnQgYXV0b21ha2UgY29tcGxhaW5zIGFib3V0IEFTLCBzZXQgaXQgaGVyZS4KK0NDQVM9IiRDQyIKK0FDX1NVQlNUKENDQVMpCisKK0FDX0FSR19XSVRIKGJpbnV0aWxzLAorICBbICAtLXdpdGgtYmludXRpbHM9RElSICAgICBzZWFyY2ggdGhlIGRpcmVjdG9yeSBESVIgdG8gZmluZCBiaW51dGlsc10pCisKK2lmIHRlc3QgIngkd2l0aF9iaW51dGlscyIgIT0geDsgdGhlbgorZG5sIEFDX1BBVEhfVE9PTCBpcyBub3Qgc2VlbiBpbiBhdXRvY29uZiAyLjEzLCBzbyB1c2UgQUNfUEFUSF9QUk9HCitkbmwgaW5zdGVhZCBmb3Igbm93LiBJdCBpcyBwcmVmZXJhYmxlIHdoZW4geW91IGNyb3NzLWNvbXBpbGUgR1JVQi4KK2RubCAgQUNfUEFUSF9UT09MKFJBTkxJQiwgcmFubGliLCA6LCAiJHdpdGhfYmludXRpbHM6JFBBVEgiKQorICBBQ19QQVRIX1BST0coUkFOTElCLCByYW5saWIsIDosICIkd2l0aF9iaW51dGlsczokUEFUSCIpCitlbHNlCisgIEFDX1BST0dfUkFOTElCCitmaQorCisjIG9wdGltaXphdGlvbiBmbGFncworaWYgdGVzdCAieCRhY19jdl9wcm9nX2djYyIgPSB4eWVzOyB0aGVuCisgIGlmIHRlc3QgIngkZGVmYXVsdF9DRkxBR1MiID0geHllczsgdGhlbgorICAgICMgQXV0b2NvbmYgbWF5IHNldCBDRkxBR1MgdG8gLU8yIGFuZC9vciAtZy4gU28gZWxpbWluYXRlIHRoZW0uCisgICAgQ0ZMQUdTPSJgZWNobyAkQ0ZMQUdTIHwgc2VkIC1lICdzLy1nLy9nJyAtZSAncy8tT1tbMC05XV0vL2cnYCAtZyIKKyAgICAjIElmIHRoZSB1c2VyIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSBmb3IgYmludXRpbHMsIGFkZCB0aGUgb3B0aW9uIGAtQicuCisgICAgaWYgdGVzdCAieCR3aXRoX2JpbnV0aWxzIiAhPSB4OyB0aGVuCisgICAgICBDRkxBR1M9Ii1CJHdpdGhfYmludXRpbHMvICRDRkxBR1MiCisgICAgZmkKKyAgICBTVEFHRTFfQ0ZMQUdTPSItTzIiCisgICAgR1JVQl9DRkxBR1M9Ii1PMiIKKyAgICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBvcHRpbWl6YXRpb24gZm9yIHNpemUgd29ya3NdLCBzaXplX2ZsYWcsIFsKKyAgICAgIHNhdmVkX0NGTEFHUz0kQ0ZMQUdTCisgICAgICBDRkxBR1M9Ii1PcyAtZyIKKyAgICAgIEFDX1RSWV9DT01QSUxFKCwgLCBzaXplX2ZsYWc9eWVzLCBzaXplX2ZsYWc9bm8pCisgICAgICBDRkxBR1M9JHNhdmVkX0NGTEFHUworICAgIF0pCisgICAgaWYgdGVzdCAieCRzaXplX2ZsYWciID0geHllczsgdGhlbgorICAgICAgU1RBR0UyX0NGTEFHUz0iLU9zIgorICAgIGVsc2UKKyAgICAgIFNUQUdFMl9DRkxBR1M9Ii1PMiAtZm5vLXN0cmVuZ3RoLXJlZHVjZSAtZm5vLXVucm9sbC1sb29wcyIKKyAgICBmaQorICAgICMgT3BlbkJTRCBoYXMgYSBHQ0MgZXh0ZW5zaW9uIGZvciBwcm90ZWN0aW5nIGFwcGxpY2F0aW9ucyBmcm9tCisgICAgIyBzdGFjayBzbWFzaGluZyBhdHRhY2tzLCBidXQgR1JVQiBkb2Vzbid0IHdhbnQgdGhpcyBmZWF0dXJlLgorICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGdjYyBoYXMgLWZuby1zdGFjay1wcm90ZWN0b3JdLAorCQkgICBub19zdGFja19wcm90ZWN0b3JfZmxhZywgWworICAgICAgc2F2ZWRfQ0ZMQUdTPSRDRkxBR1MKKyAgICAgIENGTEFHUz0iLWZuby1zdGFjay1wcm90ZWN0b3IiCisgICAgICBBQ19UUllfQ09NUElMRSgsCisJCSAgICAgLAorCQkgICAgIG5vX3N0YWNrX3Byb3RlY3Rvcl9mbGFnPXllcywKKwkJICAgICBub19zdGFja19wcm90ZWN0b3JfZmxhZz1ubykKKyAgICAgIENGTEFHUz0kc2F2ZWRfQ0ZMQUdTCisgICAgXSkKKyAgICBpZiB0ZXN0ICJ4JG5vX3N0YWNrX3Byb3RlY3Rvcl9mbGFnIiA9IHh5ZXM7IHRoZW4KKyAgICAgIFNUQUdFMl9DRkxBR1M9IiRTVEFHRTJfQ0ZMQUdTIC1mbm8tc3RhY2stcHJvdGVjdG9yIgorICAgIGZpCisgIGZpCitmaQorCitBQ19TVUJTVChTVEFHRTFfQ0ZMQUdTKQorQUNfU1VCU1QoU1RBR0UyX0NGTEFHUykKK0FDX1NVQlNUKEdSVUJfQ0ZMQUdTKQorCisjIEVuZm9yY2UgY29kaW5nIHN0YW5kYXJkcy4KK0NQUEZMQUdTPSIkQ1BQRkxBR1MgLVdhbGwgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVd1bnVzZWQgLVdzaGFkb3ciCitDUFBGTEFHUz0iJENQUEZMQUdTIC1XcG9pbnRlci1hcml0aCIKKworQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgLVd1bmRlZiB3b3Jrc10sIHVuZGVmX2ZsYWcsIFsKKyAgc2F2ZWRfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKKyAgQ1BQRkxBR1M9Ii1XdW5kZWYiCisgIEFDX1RSWV9DT01QSUxFKCwgLCB1bmRlZl9mbGFnPXllcywgdW5kZWZfZmxhZz1ubykKKyAgQ1BQRkxBR1M9IiRzYXZlZF9DUFBGTEFHUyIKK10pCisKKyMgVGhlIG9wdGlvbnMgYC1mYWxpZ24tKicgYXJlIHN1cHBvcnRlZCBieSBnY2MgMy4wIG9yIGxhdGVyLgorIyBQcm9iYWJseSBpdCBpcyBzdWZmaWNpZW50IHRvIG9ubHkgY2hlY2sgZm9yIC1mYWxpZ24tbG9vcHMuCitBQ19DQUNIRV9DSEVDSyhbd2hldGhlciAtZmFsaWduLWxvb3BzIHdvcmtzXSwgW2ZhbGlnbl9sb29wX2ZsYWddLCBbCisgIHNhdmVkX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCisgIENQUEZMQUdTPSItZmFsaWduLWxvb3BzPTEiCisgIEFDX1RSWV9DT01QSUxFKCwgLCBbZmFsaWduX2xvb3BfZmxhZz15ZXNdLCBbZmFsaWduX2xvb3BfZmxhZz1ub10pCisgIENQUEZMQUdTPSIkc2F2ZWRfQ1BQRkxBR1MiCitdKQorCisjIEZvcmNlIG5vIGFsaWdubWVudCB0byBzYXZlIHNwYWNlLgoraWYgdGVzdCAieCRmYWxpZ25fbG9vcF9mbGFnIiA9IHh5ZXM7IHRoZW4KKyAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtZmFsaWduLWp1bXBzPTEgLWZhbGlnbi1sb29wcz0xIC1mYWxpZ24tZnVuY3Rpb25zPTEiCitlbHNlCisgIENQUEZMQUdTPSIkQ1BQRkxBR1MgLW1hbGlnbi1qdW1wcz0xIC1tYWxpZ24tbG9vcHM9MSAtbWFsaWduLWZ1bmN0aW9ucz0xIgorZmkKKworaWYgdGVzdCAieCR1bmRlZl9mbGFnIiA9IHh5ZXM7IHRoZW4KKyAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtV3VuZGVmIgorZmkKKworaWYgdGVzdCAieCR3aXRoX2JpbnV0aWxzIiAhPSB4OyB0aGVuCitkbmwgIEFDX1BBVEhfVE9PTChPQkpDT1BZLCBvYmpjb3B5LCAsICIkd2l0aF9iaW51dGlsczokUEFUSCIpCisgIEFDX1BBVEhfUFJPRyhPQkpDT1BZLCBvYmpjb3B5LCAsICIkd2l0aF9iaW51dGlsczokUEFUSCIpCitlbHNlCisgIEFDX0NIRUNLX1RPT0woT0JKQ09QWSwgb2JqY29weSkKK2ZpCisKKyMgRGVmaW5lZCBpbiBhY2luY2x1ZGUubTQuCitncnViX0FTTV9VU0NPUkUKK2dydWJfUFJPR19PQkpDT1BZX0FCU09MVVRFCitpZiB0ZXN0ICJ4JGdydWJfY3ZfcHJvZ19vYmpjb3B5X2Fic29sdXRlIiAhPSB4eWVzOyB0aGVuCisgIEFDX01TR19FUlJPUihbR1JVQiByZXF1aXJlcyBhIHdvcmtpbmcgYWJzb2x1dGUgb2JqY29weTsgdXBncmFkZSB5b3VyIGJpbnV0aWxzXSkKK2ZpCisKK2dydWJfQVNNX1BSRUZJWF9SRVFVSVJFTUVOVAorCitncnViX0FTTV9BRERSMzIKK2lmIHRlc3QgIngkZ3J1Yl9jdl9hc21fYWRkcjMyIiAhPSB4eWVzOyB0aGVuCisgIEFDX01TR19FUlJPUihbR1JVQiByZXF1aXJlcyBHQVMgLmNvZGUxNiBhZGRyMzIgc3VwcG9ydDsgdXBncmFkZSB5b3VyIGJpbnV0aWxzXSkKK2ZpCisKK2dydWJfQVNNX0FCU09MVVRFX1dJVEhPVVRfQVNURVJJU0sKKworZ3J1Yl9DSEVDS19TVEFSVF9TWU1CT0wKK2dydWJfQ0hFQ0tfVVNDT1JFX1NUQVJUX1NZTUJPTAoraWYgdGVzdCAieCRncnViX2N2X2NoZWNrX3N0YXJ0X3N5bWJvbCIgIT0gInh5ZXMiIFwKKwktYSAieCRncnViX2N2X2NoZWNrX3VzY29yZV9zdGFydF9zeW1ib2wiICE9ICJ4eWVzIjsgdGhlbgorICBBQ19NU0dfRVJST1IoW05laXRoZXIgc3RhcnQgbm9yIF9zdGFydCBpcyBkZWZpbmVkXSkKK2ZpCisKK2dydWJfQ0hFQ0tfVVNDT1JFX1VTQ09SRV9CU1NfU1RBUlRfU1lNQk9MCitncnViX0NIRUNLX1VTQ09SRV9FREFUQV9TWU1CT0wKK2dydWJfQ0hFQ0tfRURBVEFfU1lNQk9MCitpZiB0ZXN0ICJ4JGdydWJfY3ZfY2hlY2tfdXNjb3JlX3VzY29yZV9ic3Nfc3RhcnRfc3ltYm9sIiAhPSAieHllcyIgXAorCS1hICJ4JGdydWJfY3ZfY2hlY2tfdXNjb3JlX2VkYXRhX3N5bWJvbCIgIT0gInh5ZXMiIFwKKwktYSAieCRncnViX2N2X2NoZWNrX2VkYXRhX3N5bWJvbCIgIT0gInh5ZXMiOyB0aGVuCisgIEFDX01TR19FUlJPUihbTm9uZSBvZiBfX2Jzc19zdGFydCwgX2VkYXRhLCBlZGF0YSBkZWZpbmVkXSkKK2ZpCisKK2dydWJfQ0hFQ0tfRU5EX1NZTUJPTAorZ3J1Yl9DSEVDS19VU0NPUkVfRU5EX1NZTUJPTAoraWYgdGVzdCAieCRncnViX2N2X2NoZWNrX2VuZF9zeW1ib2wiICE9ICJ4eWVzIiBcCisJLWEgIngkZ3J1Yl9jdl9jaGVja191c2NvcmVfZW5kX3N5bWJvbCIgIT0gInh5ZXMiOyB0aGVuCisgIEFDX01TR19FUlJPUihbTmVpdGhlciBlbmQgbm9yIF9lbmQgaXMgZGVmaW5lZF0pCitmaQorCisjIENoZWNrIGZvciBjdXJzZXMgbGlicmFyaWVzLgorQUNfQVJHX1dJVEgoY3Vyc2VzLAorICBbICAtLXdpdGhvdXQtY3Vyc2VzICAgICAgICBkbyBub3QgdXNlIGN1cnNlc10pCisKKyMgR2V0IHRoZSBmaWxlbmFtZSBvciB0aGUgd2hvbGUgZGlzayBhbmQgb3BlbiBpdC4KKyMgS25vd24gdG8gd29yayBvbiBOZXRCU0QuCitBQ19DSEVDS19MSUIodXRpbCwgb3BlbmRpc2ssIFtHUlVCX0xJQlM9IiRHUlVCX0xJQlMgLWx1dGlsIgorICBBQ19ERUZJTkUoSEFWRV9PUEVORElTSywgMSwgW0RlZmluZSBpZiBvcGVuZGlzaygpIGluIC1sdXRpbCBjYW4gYmUgdXNlZF0pXSkKKworIyBVbmxlc3MgdGhlIHVzZXIgc3BlY2lmeSAtLXdpdGhvdXQtY3Vyc2VzLCBjaGVjayBmb3IgY3Vyc2VzLgoraWYgdGVzdCAieCR3aXRoX2N1cnNlcyIgIT0gInhubyI7IHRoZW4KKyAgQUNfQ0hFQ0tfTElCKG5jdXJzZXMsIHdnZXRjaCwgW0dSVUJfTElCUz0iJEdSVUJfTElCUyAtbG5jdXJzZXMiCisgIEFDX0RFRklORShIQVZFX0xJQkNVUlNFUywgMSwgW0RlZmluZSBpZiB5b3UgaGF2ZSBhIGN1cnNlcyBsaWJyYXJ5XSldLAorICAgIFtBQ19DSEVDS19MSUIoY3Vyc2VzLCB3Z2V0Y2gsIFtHUlVCX0xJQlM9IiRHUlVCX0xJQlMgLWxjdXJzZXMiCisgICAgICAgQUNfREVGSU5FKEhBVkVfTElCQ1VSU0VTLCAxLCBbRGVmaW5lIGlmIHlvdSBoYXZlIGEgY3Vyc2VzIGxpYnJhcnldKV0pXSkKK2ZpCisKK0FDX1NVQlNUKEdSVUJfTElCUykKKworIyBDaGVjayBmb3IgaGVhZGVycy4KK0FDX0NIRUNLX0hFQURFUlMoc3RyaW5nLmggc3RyaW5ncy5oIG5jdXJzZXMvY3Vyc2VzLmggbmN1cnNlcy5oIGN1cnNlcy5oKQorCisjIENoZWNrIGZvciB1c2VyIG9wdGlvbnMuCisKKyMgZmlsZXN5c3RlbXMgc3VwcG9ydC4KK0FDX0FSR19FTkFCTEUoZXh0MmZzLAorICBbICAtLWRpc2FibGUtZXh0MmZzICAgICAgICBkaXNhYmxlIGV4dDJmcyBzdXBwb3J0IGluIFN0YWdlIDJdKQorCitpZiB0ZXN0IHgiJGVuYWJsZV9leHQyZnMiICE9IHhubzsgdGhlbgorICBGU1lTX0NGTEFHUz0iJEZTWVNfQ0ZMQUdTIC1ERlNZU19FWFQyRlM9MSIKK2ZpCisKK0FDX0FSR19FTkFCTEUoZmF0LAorICBbICAtLWRpc2FibGUtZmF0ICAgICAgICAgICBkaXNhYmxlIEZBVCBzdXBwb3J0IGluIFN0YWdlIDJdKQorCitpZiB0ZXN0IHgiJGVuYWJsZV9mYXQiICE9IHhubzsgdGhlbgorICBGU1lTX0NGTEFHUz0iJEZTWVNfQ0ZMQUdTIC1ERlNZU19GQVQ9MSIKK2ZpCisKK0FDX0FSR19FTkFCTEUoZmZzLAorICBbICAtLWRpc2FibGUtZmZzICAgICAgICAgICBkaXNhYmxlIEZGUyBzdXBwb3J0IGluIFN0YWdlIDJdKQorCitpZiB0ZXN0IHgiJGVuYWJsZV9mZnMiICE9IHhubzsgdGhlbgorICBGU1lTX0NGTEFHUz0iJEZTWVNfQ0ZMQUdTIC1ERlNZU19GRlM9MSIKK2ZpCisKK0FDX0FSR19FTkFCTEUodWZzMiwKKyAgWyAgLS1kaXNhYmxlLXVmczIgICAgICAgICAgZGlzYWJsZSBVRlMyIHN1cHBvcnQgaW4gU3RhZ2UgMl0pCisKK2lmIHRlc3QgeCIkZW5hYmxlX3VmczIiICE9IHhubzsgdGhlbgorICBGU1lTX0NGTEFHUz0iJEZTWVNfQ0ZMQUdTIC1ERlNZU19VRlMyPTEiCitmaQorCitBQ19BUkdfRU5BQkxFKG1pbml4LAorICBbICAtLWRpc2FibGUtbWluaXggICAgICAgICBkaXNhYmxlIE1pbml4IGZzIHN1cHBvcnQgaW4gU3RhZ2UgMl0pCisKK2lmIHRlc3QgeCIkZW5hYmxlX21pbml4IiAhPSB4bm87IHRoZW4KKyAgRlNZU19DRkxBR1M9IiRGU1lTX0NGTEFHUyAtREZTWVNfTUlOSVg9MSIKK2ZpCisKK0FDX0FSR19FTkFCTEUocmVpc2VyZnMsCisgIFsgIC0tZGlzYWJsZS1yZWlzZXJmcyAgICAgIGRpc2FibGUgUmVpc2VyRlMgc3VwcG9ydCBpbiBTdGFnZSAyXSkKKworaWYgdGVzdCB4IiRlbmFibGVfcmVpc2VyZnMiICE9IHhubzsgdGhlbgorICBGU1lTX0NGTEFHUz0iJEZTWVNfQ0ZMQUdTIC1ERlNZU19SRUlTRVJGUz0xIgorZmkKKworQUNfQVJHX0VOQUJMRSh2c3RhZnMsCisgIFsgIC0tZGlzYWJsZS12c3RhZnMgICAgICAgIGRpc2FibGUgVlNUYSBGUyBzdXBwb3J0IGluIFN0YWdlIDJdKQorCitpZiB0ZXN0IHgiJGVuYWJsZV92c3RhZnMiICE9IHhubzsgdGhlbgorICBGU1lTX0NGTEFHUz0iJEZTWVNfQ0ZMQUdTIC1ERlNZU19WU1RBRlM9MSIKK2ZpCisKK0FDX0FSR19FTkFCTEUoamZzLAorICBbICAtLWRpc2FibGUtamZzICAgICAgICAgICBkaXNhYmxlIElCTSBKRlMgc3VwcG9ydCBpbiBTdGFnZSAyXSkKKworaWYgdGVzdCB4IiRlbmFibGVfamZzIiAhPSB4bm87IHRoZW4KKyAgRlNZU19DRkxBR1M9IiRGU1lTX0NGTEFHUyAtREZTWVNfSkZTPTEiCitmaQorCitBQ19BUkdfRU5BQkxFKHhmcywKKyAgWyAgLS1kaXNhYmxlLXhmcyAgICAgICAgICAgZGlzYWJsZSBTR0kgWEZTIHN1cHBvcnQgaW4gU3RhZ2UgMl0pCisKK2lmIHRlc3QgeCIkZW5hYmxlX3hmcyIgIT0geG5vOyB0aGVuCisgIEZTWVNfQ0ZMQUdTPSIkRlNZU19DRkxBR1MgLURGU1lTX1hGUz0xIgorZmkKKworQUNfQVJHX0VOQUJMRShpc285NjYwLAorICBbICAtLWRpc2FibGUtaXNvOTY2MCAgICAgICBkaXNhYmxlIElTTzk2NjAgc3VwcG9ydCBpbiBTdGFnZSAyXSkKKworaWYgdGVzdCB4IiRlbmFibGVfaXNvOTY2MCIgIT0geG5vOyB0aGVuCisgIEZTWVNfQ0ZMQUdTPSIkRlNZU19DRkxBR1MgLURGU1lTX0lTTzk2NjA9MSIKK2ZpCisKK2RubCBBQ19BUkdfRU5BQkxFKHRmdHAsCitkbmwgWyAgLS1lbmFibGUtdGZ0cCAgICAgICAgICAgZW5hYmxlIFRGVFAgc3VwcG9ydCBpbiBTdGFnZSAyXSkKK2RubCAKK2RubCAjaWYgdGVzdCB4IiRlbmFibGVfdGZ0cCIgPSB4eWVzOyB0aGVuCitkbmwgRlNZU19DRkxBR1M9IiRGU1lTX0NGTEFHUyAtREZTWVNfVEZUUD0xIgorZG5sIGZpCisKK0FDX0FSR19FTkFCTEUoZ3VuemlwLAorICBbICAtLWRpc2FibGUtZ3VuemlwICAgICAgICBkaXNhYmxlIGRlY29tcHJlc3Npb24gaW4gU3RhZ2UgMl0pCisKK2lmIHRlc3QgeCIkZW5hYmxlX2d1bnppcCIgPSB4bm87IHRoZW4KKyAgRlNZU19DRkxBR1M9IiRGU1lTX0NGTEFHUyAtRE5PX0RFQ09NUFJFU1NJT049MSIKK2ZpCisKK0FDX0FSR19FTkFCTEUobWQ1LXBhc3N3b3JkLAorICBbICAtLWRpc2FibGUtbWQ1LXBhc3N3b3JkICBkaXNhYmxlIE1ENSBwYXNzd29yZCBzdXBwb3J0IGluIFN0YWdlIDJdKQoraWYgdGVzdCAieCRlbmFibGVfbWQ1X3Bhc3N3b3JkIiAhPSB4bm87IHRoZW4KKyAgRlNZU19DRkxBR1M9IiRGU1lTX0NGTEFHUyAtRFVTRV9NRDVfUEFTU1dPUkRTPTEiCitmaQorCitkbmwgVGhlIG5ldGJvb3Qgc3VwcG9ydC4KK2RubCBHZW5lcmFsIG9wdGlvbnMuCitBQ19BUkdfRU5BQkxFKHBhY2tldC1yZXRyYW5zbWlzc2lvbiwKKyAgWyAgLS1kaXNhYmxlLXBhY2tldC1yZXRyYW5zbWlzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJuIG9mZiBwYWNrZXQgcmV0cmFuc21pc3Npb25dKQoraWYgdGVzdCAieCRlbmFibGVfcGFja2V0X3JldHJhbnNtaXNzaW9uIiAhPSB4bm87IHRoZW4KKyAgTkVUX0VYVFJBRkxBR1M9IiRORVRfRVhUUkFGTEFHUyAtRENPTkdFU1RFRD0xIgorZmkKKworQUNfQVJHX0VOQUJMRShwY2ktZGlyZWN0LAorICBbICAtLWVuYWJsZS1wY2ktZGlyZWN0ICAgICBhY2Nlc3MgUENJIGRpcmVjdGx5IGluc3RlYWQgb2YgdXNpbmcgQklPU10pCitpZiB0ZXN0ICJ4JGVuYWJsZV9wY2lfZGlyZWN0IiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0VYVFJBRkxBR1M9IiRORVRfRVhUUkFGTEFHUyAtRENPTkZJR19QQ0lfRElSRUNUPTEiCitmaQorCitkbmwgRGV2aWNlIGRyaXZlcnMuCitBQ19BUkdfRU5BQkxFKDNjNTA5LAorICBbICAtLWVuYWJsZS0zYzUwOSAgICAgICAgICBlbmFibGUgM0NvbTUwOSBkcml2ZXJdKQoraWYgdGVzdCAieCRlbmFibGVfM2M1MDkiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfM0M1MDkiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyAzYzUwOS5vIgorZmkKKworQUNfQVJHX0VOQUJMRSgzYzUyOSwKKyAgWyAgLS1lbmFibGUtM2M1MjkgICAgICAgICAgZW5hYmxlIDNDb201MjkgZHJpdmVyXSkKK2lmIHRlc3QgIngkZW5hYmxlXzNjNTI5IiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFXzNDNTI5PTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyAzYzUyOS5vIgorZmkKKworQUNfQVJHX0VOQUJMRSgzYzU5NSwKKyAgWyAgLS1lbmFibGUtM2M1OTUgICAgICAgICAgZW5hYmxlIDNDb201OTUgZHJpdmVyXSkKK2lmIHRlc3QgIngkZW5hYmxlXzNjNTk1IiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFXzNDNTk1PTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyAzYzU5NS5vIgorZmkKKworQUNfQVJHX0VOQUJMRSgzYzkweCwKKyAgWyAgLS1lbmFibGUtM2M5MHggICAgICAgICAgZW5hYmxlIDNDb205MHggZHJpdmVyXSkKK2lmIHRlc3QgIngkZW5hYmxlXzNjOTB4IiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFXzNDOTBYPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyAzYzkweC5vIgorZmkKKworQUNfQVJHX0VOQUJMRShjczg5eDAsCisgIFsgIC0tZW5hYmxlLWNzODl4MCAgICAgICAgIGVuYWJsZSBDUzg5eDAgZHJpdmVyXSkKK2lmIHRlc3QgIngkZW5hYmxlX2NzODl4MCIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9DUzg5WDA9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIGNzODl4MC5vIgorZmkKKworQUNfQVJHX0VOQUJMRShkYXZpY29tLAorICBbICAtLWVuYWJsZS1kYXZpY29tICAgICAgICBlbmFibGUgRGF2aWNvbSBkcml2ZXJdKQoraWYgdGVzdCAieCRlbmFibGVfZGF2aWNvbSIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9EQVZJQ09NPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBkYXZpY29tLm8iCitmaQorCitBQ19BUkdfRU5BQkxFKGRlcGNhLAorICBbICAtLWVuYWJsZS1kZXBjYSAgICAgICAgICBlbmFibGUgREVQQ0EgYW5kIEV0aGVyV09SS1MgZHJpdmVyXSkKK2lmIHRlc3QgIngkZW5hYmxlX2RlcGNhIiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX0RFUENBPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBkZXBjYS5vIgorZmkKKworQUNfQVJHX0VOQUJMRShlZXBybywKKyAgWyAgLS1lbmFibGUtZWVwcm8gICAgICAgICAgZW5hYmxlIEV0aGVyZXhwcmVzcyBQcm8vMTAgZHJpdmVyXSkKK2lmIHRlc3QgIngkZW5hYmxlX2VlcHJvIiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX0VFUFJPPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBlZXByby5vIgorZmkKKworQUNfQVJHX0VOQUJMRShlZXBybzEwMCwKKyAgWyAgLS1lbmFibGUtZWVwcm8xMDAgICAgICAgZW5hYmxlIEV0aGVyZXhwcmVzcyBQcm8vMTAwIGRyaXZlcl0pCitpZiB0ZXN0ICJ4JGVuYWJsZV9lZXBybzEwMCIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9FRVBSTzEwMD0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgZWVwcm8xMDAubyIKK2ZpCisKK0FDX0FSR19FTkFCTEUoZXBpYzEwMCwKKyAgWyAgLS1lbmFibGUtZXBpYzEwMCAgICAgICAgZW5hYmxlIFNNQyA4M2MxNzAgRVBJQy8xMDAgZHJpdmVyXSkKK2lmIHRlc3QgIngkZW5hYmxlX2VwaWMxMDAiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfRVBJQzEwMD0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgZXBpYzEwMC5vIgorZmkKKworQUNfQVJHX0VOQUJMRSgzYzUwNywKKyAgWyAgLS1lbmFibGUtM2M1MDcgICAgICAgICAgZW5hYmxlIDNDb201MDcgZHJpdmVyXSkKK2lmIHRlc3QgIngkZW5hYmxlXzNjNTA3IiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFXzNDNTA3PTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyAzYzUwNy5vIgorZmkKKworQUNfQVJHX0VOQUJMRShleG9zMjA1LAorICBbICAtLWVuYWJsZS1leG9zMjA1ICAgICAgICBlbmFibGUgRVhPUzIwNSBkcml2ZXJdKQoraWYgdGVzdCAieCRlbmFibGVfZXhvczIwNSIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9FWE9TMjA1PTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBleG9zMjA1Lm8iCitmaQorCitBQ19BUkdfRU5BQkxFKG5pNTIxMCwKKyAgWyAgLS1lbmFibGUtbmk1MjEwICAgICAgICAgZW5hYmxlIFJhY2FsLUludGVybGFuIE5JNTIxMCBkcml2ZXJdKQoraWYgdGVzdCAieCRlbmFibGVfbmk1MjEwIiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX05JNTIxMD0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgbmk1MjEwLm8iCitmaQorCitBQ19BUkdfRU5BQkxFKGxhbmNlLAorICBbICAtLWVuYWJsZS1sYW5jZSAgICAgICAgICBlbmFibGUgTGFuY2UgUENJIFBDTmV0LzMyIGRyaXZlcl0pCitpZiB0ZXN0ICJ4JGVuYWJsZV9sYW5jZSIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9MQU5DRT0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgbGFuY2UubyIKK2ZpCisKK0FDX0FSR19FTkFCTEUobmUyMTAwLAorICBbICAtLWVuYWJsZS1uZTIxMDAgICAgICAgICBlbmFibGUgTm92ZWxsIE5FMjEwMCBkcml2ZXJdKQoraWYgdGVzdCAieCRlbmFibGVfbmUyMTAwIiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX05FMjEwMD0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgbmUyMTAwLm8iCitmaQorCitBQ19BUkdfRU5BQkxFKG5pNjUxMCwKKyAgWyAgLS1lbmFibGUtbmk2NTEwICAgICAgICAgZW5hYmxlIFJhY2FsLUludGVybGFuIE5JNjUxMCBkcml2ZXJdKQoraWYgdGVzdCAieCRlbmFibGVfbmk2NTEwIiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX05JNjUxMD0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgbmk2NTEwLm8iCitmaQorCitBQ19BUkdfRU5BQkxFKG5hdHNlbWksCisgIFsgIC0tZW5hYmxlLW5hdHNlbWkgICAgICAgIGVuYWJsZSBOYXRTZW1pIERQODM4MXggZHJpdmVyXSkKK2lmIHRlc3QgIngkZW5hYmxlX25hdHNlbWkiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfTkFUU0VNST0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgbmF0c2VtaS5vIgorZmkKKworQUNfQVJHX0VOQUJMRShuaTUwMTAsCisgIFsgIC0tZW5hYmxlLW5pNTAxMCAgICAgICAgIGVuYWJsZSBSYWNhbC1JbnRlcmxhbiBOSTUwMTAgZHJpdmVyXSkKK2lmIHRlc3QgIngkZW5hYmxlX25pNTAxMCIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9OSTUwMTA9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIG5pNTAxMC5vIgorZmkKKworQUNfQVJHX0VOQUJMRSgzYzUwMywKKyAgWyAgLS1lbmFibGUtM2M1MDMgICAgICAgICAgZW5hYmxlIDNDb201MDMgZHJpdmVyXSkKK2lmIHRlc3QgIngkZW5hYmxlXzNjNTAzIiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFXzNDNTAzPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyAzYzUwMy5vIgorZmkKKworQUNfQVJHX0VOQUJMRShuZSwKKyAgWyAgLS1lbmFibGUtbmUgICAgICAgICAgICAgZW5hYmxlIE5FMTAwMC8yMDAwIElTQSBkcml2ZXJdKQoraWYgdGVzdCAieCRlbmFibGVfbmUiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfTkU9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIG5lLm8iCitmaQorCitBQ19BUkdfRU5BQkxFKG5zODM5MCwKKyAgWyAgLS1lbmFibGUtbnM4MzkwICAgICAgICAgZW5hYmxlIE5FMjAwMCBQQ0kgZHJpdmVyXSkKK2lmIHRlc3QgIngkZW5hYmxlX25zODM5MCIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9OUzgzOTA9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIG5zODM5MC5vIgorZmkKKworQUNfQVJHX0VOQUJMRSh3ZCwKKyAgWyAgLS1lbmFibGUtd2QgICAgICAgICAgICAgZW5hYmxlIFdEODAwMy84MDEzLCBTTUM4MjE2Lzg0MTYgZHJpdmVyXSkKK2lmIHRlc3QgIngkZW5hYmxlX3dkIiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX1dEPTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyB3ZC5vIgorZmkKKworQUNfQVJHX0VOQUJMRShvdHVsaXAsCisgIFsgIC0tZW5hYmxlLW90dWxpcCAgICAgICAgIGVuYWJsZSBvbGQgVHVsaXAgZHJpdmVyXSkKK2lmIHRlc3QgIngkZW5hYmxlX290dWxpcCIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9PVFVMSVA9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIG90dWxpcC5vIgorZmkKKworQUNfQVJHX0VOQUJMRShydGw4MTM5LAorICBbICAtLWVuYWJsZS1ydGw4MTM5ICAgICAgICBlbmFibGUgUmVhbHRlayA4MTM5IGRyaXZlcl0pCitpZiB0ZXN0ICJ4JGVuYWJsZV9ydGw4MTM5IiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX1JUTDgxMzk9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIHJ0bDgxMzkubyIKK2ZpCisKK0FDX0FSR19FTkFCTEUoc2lzOTAwLAorICBbICAtLWVuYWJsZS1zaXM5MDAgICAgICAgICBlbmFibGUgU0lTIDkwMCBhbmQgU0lTIDcwMTYgZHJpdmVyXSkKK2lmIHRlc3QgIngkZW5hYmxlX3NpczkwMCIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9TSVM5MDA9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIHNpczkwMC5vIgorZmkKKworQUNfQVJHX0VOQUJMRShzay1nMTYsCisgIFsgIC0tZW5hYmxlLXNrLWcxNiAgICAgICAgIGVuYWJsZSBTY2huZWlkZXIgYW5kIEtvY2ggRzE2IGRyaXZlcl0pCitpZiB0ZXN0ICJ4JGVuYWJsZV9za19nMTYiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfU0tfRzE2PTEiCisgIE5FVEJPT1RfRFJJVkVSUz0iJE5FVEJPT1RfRFJJVkVSUyBza19nMTYubyIKK2ZpCisKK0FDX0FSR19FTkFCTEUoc21jOTAwMCwKKyAgWyAgLS1lbmFibGUtc21jOTAwMCAgICAgICAgZW5hYmxlIFNNQzkwMDAgZHJpdmVyXSkKK2lmIHRlc3QgIngkZW5hYmxlX3NtYzkwMDAiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfU01DOTAwMD0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgc21jOTAwMC5vIgorZmkKKworQUNfQVJHX0VOQUJMRSh0aWFyYSwKKyAgWyAgLS1lbmFibGUtdGlhcmEgICAgICAgICAgZW5hYmxlIFRpYXJhIGRyaXZlcl0pCitpZiB0ZXN0ICJ4JGVuYWJsZV90aWFyYSIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9USUFSQT0xIgorICBORVRCT09UX0RSSVZFUlM9IiRORVRCT09UX0RSSVZFUlMgdGlhcmEubyIKK2ZpCisKK0FDX0FSR19FTkFCTEUodHVsaXAsCisgIFsgIC0tZW5hYmxlLXR1bGlwICAgICAgICAgIGVuYWJsZSBUdWxpcCBkcml2ZXJdKQoraWYgdGVzdCAieCRlbmFibGVfdHVsaXAiID0geHllczsgdGhlbgorICBORVRfQ0ZMQUdTPSIkTkVUX0NGTEFHUyAtRElOQ0xVREVfVFVMSVA9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIHR1bGlwLm8iCitmaQorCitBQ19BUkdfRU5BQkxFKHZpYS1yaGluZSwKKyAgWyAgLS1lbmFibGUtdmlhLXJoaW5lICAgICAgZW5hYmxlIFJoaW5lLUkvSUkgZHJpdmVyXSkKK2lmIHRlc3QgIngkZW5hYmxlX3ZpYV9yaGluZSIgPSB4eWVzOyB0aGVuCisgIE5FVF9DRkxBR1M9IiRORVRfQ0ZMQUdTIC1ESU5DTFVERV9WSUFfUkhJTkU9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIHZpYV9yaGluZS5vIgorZmkKKworQUNfQVJHX0VOQUJMRSh3ODljODQwLAorICBbICAtLWVuYWJsZS13ODljODQwICAgICAgICBlbmFibGUgV2luYm9uZCBXODljODQwLCBDb21wZXggUkwxMDAtQVRYIGRyaXZlcl0pCitpZiB0ZXN0ICJ4JGVuYWJsZV93ODljODQwIiA9IHh5ZXM7IHRoZW4KKyAgTkVUX0NGTEFHUz0iJE5FVF9DRkxBR1MgLURJTkNMVURFX1c4OUM4NDA9MSIKKyAgTkVUQk9PVF9EUklWRVJTPSIkTkVUQk9PVF9EUklWRVJTIHc4OWM4NDAubyIKK2ZpCisKK2RubCBDaGVjayBpZiB0aGUgbmV0Ym9vdCBzdXBwb3J0IGlzIHR1cm5lZCBvbi4KK0FNX0NPTkRJVElPTkFMKE5FVEJPT1RfU1VQUE9SVCwgdGVzdCAieCRORVRfQ0ZMQUdTIiAhPSB4KQoraWYgdGVzdCAieCRORVRfQ0ZMQUdTIiAhPSB4OyB0aGVuCisgIEZTWVNfQ0ZMQUdTPSIkRlNZU19DRkxBR1MgLURGU1lTX1RGVFA9MSIKK2ZpCisKK2RubCBFeHRyYSBvcHRpb25zLgorQUNfQVJHX0VOQUJMRSgzYzUwMy1zaG1lbSwKKyAgWyAgLS1lbmFibGUtM2M1MDMtc2htZW0gICAgdXNlIDNjNTAzIHNoYXJlZCBtZW1vcnkgbW9kZV0pCitpZiB0ZXN0ICJ4JGVuYWJsZV8zYzUwM19zaG1lbSIgPSB4eWVzOyB0aGVuCisgIE5FVF9FWFRSQUZMQUdTPSIkTkVUX0VYVFJBRkxBR1MgLURUNTAzX1NITUVNPTEiCitmaQorCitBQ19BUkdfRU5BQkxFKDNjNTAzLWF1aSwKKyAgWyAgLS1lbmFibGUtM2M1MDMtYXVpICAgICAgdXNlIEFVSSBieSBkZWZhdWx0IG9uIDNjNTAzIGNhcmRzXSkKK2lmIHRlc3QgIngkZW5hYmxlXzNjNTAzX2F1aSIgPSB4eWVzOyB0aGVuCisgIE5FVF9FWFRSQUZMQUdTPSIkTkVUX0VYVFJBRkxBR1MgLURUNTAzX0FVST0xIgorZmkKKworQUNfQVJHX0VOQUJMRShjb21wZXgtcmwyMDAwLWZpeCwKKyAgWyAgLS1lbmFibGUtY29tcGV4LXJsMjAwMC1maXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSB0aGlzIGlmIHlvdSBoYXZlIGEgQ29tcGV4IFJMMjAwMCBQQ0ldKQoraWYgdGVzdCAieCRlbmFibGVfY29tcGV4X3JsMjAwMF9maXgiID0geHllczsgdGhlbgorICBORVRfRVhUUkFGTEFHUz0iJE5FVF9FWFRSQUZMQUdTIC1EQ09NUEVYX1JMMjAwMF9GSVg9MSIKK2ZpCisKK0FDX0FSR19FTkFCTEUoc21jOTAwMC1zY2FuLAorICBbICAtLWVuYWJsZS1zbWM5MDAwLXNjYW49TElTVAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iZSBmb3IgU01DOTAwMCBJL08gYWRkcmVzc2VzIHVzaW5nIExJU1RdLAorICBbTkVUX0VYVFJBRkxBR1M9IiRORVRfRVhUUkFGTEFHUyAtRFNNQzkwMDBfU0NBTj0kZW5hYmxlX3NtYzkwMDBfc2NhbiJdKQorCitBQ19BUkdfRU5BQkxFKG5lLXNjYW4sCisgIFsgIC0tZW5hYmxlLW5lLXNjYW49TElTVCAgIHByb2JlIGZvciBORSBiYXNlIGFkZHJlc3MgdXNpbmcgTElTVF0sCisgIFtORVRfRVhUUkFGTEFHUz0iJE5FVF9FWFRSQUZMQUdTIC1ETkVfU0NBTj0kZW5hYmxlX25lX3NjYW4iXSwKKyAgW05FVF9FWFRSQUZMQUdTPSIkTkVUX0VYVFJBRkxBR1MgLURORV9TQ0FOPTB4MjgwLDB4MzAwLDB4MzIwLDB4MzQwIl0pCisKK0FDX0FSR19FTkFCTEUod2QtZGVmYXVsdC1tZW0sCisgIFsgIC0tZW5hYmxlLXdkLWRlZmF1bHQtbWVtPU1FTQorICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdGhlIGRlZmF1bHQgbWVtb3J5IGxvY2F0aW9uIGZvciBXRC9TTUNdLAorICBbTkVUX0VYVFJBRkxBR1M9IiRORVRfRVhUUkFGTEFHUyAtRFdEX0RFRkFVTFRfTUVNPSRlbmFibGVfd2RfZGVmYXVsdF9tZW0iXSwKKyAgW05FVF9FWFRSQUZMQUdTPSIkTkVUX0VYVFJBRkxBR1MgLURXRF9ERUZBVUxUX01FTT0weENDMDAwIl0pCisKK0FDX0FSR19FTkFCTEUoY3Mtc2NhbiwKKyAgWyAgLS1lbmFibGUtY3Mtc2Nhbj1MSVNUICAgcHJvYmUgZm9yIENTODl4MCBiYXNlIGFkZHJlc3MgdXNpbmcgTElTVF0sCisgIFtORVRfRVhUUkFGTEFHUz0iJE5FVF9FWFRSQUZMQUdTIC1EQ1NfU0NBTj0kZW5hYmxlX2NzX3NjYW4iXSkKKworZG5sIERpc2tsZXNzCitBQ19BUkdfRU5BQkxFKGRpc2tsZXNzLAorICBbICAtLWVuYWJsZS1kaXNrbGVzcyAgICAgICBlbmFibGUgZGlza2xlc3Mgc3VwcG9ydF0pCitBTV9DT05ESVRJT05BTChESVNLTEVTU19TVVBQT1JULCB0ZXN0ICJ4JGVuYWJsZV9kaXNrbGVzcyIgPSB4eWVzKQorCitkbmwgSGVyY3VsZXMgdGVybWluYWwKK0FDX0FSR19FTkFCTEUoaGVyY3VsZXMsCisgIFsgIC0tZGlzYWJsZS1oZXJjdWxlcyAgICAgIGRpc2FibGUgaGVyY3VsZXMgdGVybWluYWwgc3VwcG9ydF0pCitBTV9DT05ESVRJT05BTChIRVJDVUxFU19TVVBQT1JULCB0ZXN0ICJ4JGVuYWJsZV9oZXJjdWxlcyIgIT0geG5vKQorCitkbmwgU2VyaWFsIHRlcm1pbmFsCitBQ19BUkdfRU5BQkxFKHNlcmlhbCwKKyAgWyAgLS1kaXNhYmxlLXNlcmlhbCAgICAgICAgZGlzYWJsZSBzZXJpYWwgdGVybWluYWwgc3VwcG9ydF0pCitBTV9DT05ESVRJT05BTChTRVJJQUxfU1VQUE9SVCwgdGVzdCAieCRlbmFibGVfc2VyaWFsIiAhPSB4bm8pCisKK2RubCBTaW11bGF0aW9uIG9mIHRoZSBzbG93bmVzcyBvZiBhIHNlcmlhbCBkZXZpY2UuCitBQ19BUkdfRU5BQkxFKHNlcmlhbC1zcGVlZC1zaW11bGF0aW9uLAorICBbICAtLWVuYWJsZS1zZXJpYWwtc3BlZWQtc2ltdWxhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICBzaW11bGF0ZSB0aGUgc2xvd25lc3Mgb2YgYSBzZXJpYWwgZGV2aWNlXSkKK0FNX0NPTkRJVElPTkFMKFNFUklBTF9TUEVFRF9TSU1VTEFUSU9OLAorICB0ZXN0ICJ4JGVuYWJsZV9zZXJpYWxfc3BlZWRfc2ltdWxhdGlvbiIgPSB4eWVzKQorCisjIFNhbml0eSBjaGVjay4KK2lmIHRlc3QgIngkZW5hYmxlX2Rpc2tsZXNzIiA9IHh5ZXM7IHRoZW4KKyAgaWYgdGVzdCAieCRORVRfQ0ZMQUdTIiA9IHg7IHRoZW4KKyAgICBBQ19NU0dfRVJST1IoW1lvdSBtdXN0IGVuYWJsZSBhdCBsZWFzdCBvbmUgbmV0d29yayBkcml2ZXJdKQorICBmaQorZmkKKworZG5sIEVtYmVkIGEgbWVudSBzdHJpbmcgaW4gR1JVQiBpdHNlbGYuCitBQ19BUkdfRU5BQkxFKHByZXNldC1tZW51LAorICBbICAtLWVuYWJsZS1wcmVzZXQtbWVudT1GSUxFCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNldCBhIG1lbnUgZmlsZSBGSUxFIGluIFN0YWdlIDJdKQoraWYgdGVzdCAieCRlbmFibGVfcHJlc2V0X21lbnUiID0geDsgdGhlbgorICA6CitlbHNlCisgIGlmIHRlc3QgLXIgJGVuYWJsZV9wcmVzZXRfbWVudTsgdGhlbgorICAgIGdydWJfREVGSU5FX0ZJTEUoUFJFU0VUX01FTlVfU1RSSU5HLCBbJGVuYWJsZV9wcmVzZXRfbWVudV0sCisgICAgCQkgICAgIFtEZWZpbmUgaWYgdGhlcmUgaXMgdXNlciBzcGVjaWZpZWQgcHJlc2V0IG1lbnUgc3RyaW5nXSkKKyAgZWxzZQorICAgIEFDX01TR19FUlJPUihbQ2Fubm90IHJlYWQgdGhlIHByZXNldCBtZW51IGZpbGUgJGVuYWJsZV9wcmVzZXRfbWVudV0pCisgIGZpCitmaQorCitkbmwgQnVpbGQgdGhlIGV4YW1wbGUgTXVsdGlib290IGtlcm5lbC4KK0FDX0FSR19FTkFCTEUoZXhhbXBsZS1rZXJuZWwsCisgIFsgIC0tZW5hYmxlLWV4YW1wbGUta2VybmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkIHRoZSBleGFtcGxlIE11bHRpYm9vdCBrZXJuZWxdKQorQU1fQ09ORElUSU9OQUwoQlVJTERfRVhBTVBMRV9LRVJORUwsIHRlc3QgIngkZW5hYmxlX2V4YW1wbGVfa2VybmVsIiA9IHh5ZXMpCisKK2RubCBBdXRvbWF0aWMgTGludXggbWVtPSBvcHRpb24uCitBQ19BUkdfRU5BQkxFKGF1dG8tbGludXgtbWVtLW9wdCwKKyAgWyAgLS1kaXNhYmxlLWF1dG8tbGludXgtbWVtLW9wdAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb24ndCBwYXNzIExpbnV4IG1lbT0gb3B0aW9uIGF1dG9tYXRpY2FsbHldKQoraWYgdGVzdCAieCRlbmFibGVfYXV0b19saW51eF9tZW1fb3B0IiA9IHhubzsgdGhlbgorICA6CitlbHNlCisgIEFDX0RFRklORShBVVRPX0xJTlVYX01FTV9PUFQsIDEsIFtEZWZpbmUgaWYgeW91IGRvbid0IHdhbnQgdG8gcGFzcyB0aGUgbWVtPSBvcHRpb24gdG8gTGludXhdKQorZmkKKworZG5sIE5vdyBzdWJzdGl0dXRlIHRoZSB2YXJpYWJsZXMuCitBQ19TVUJTVChGU1lTX0NGTEFHUykKK0FDX1NVQlNUKE5FVF9DRkxBR1MpCitBQ19TVUJTVChORVRfRVhUUkFGTEFHUykKK0FDX1NVQlNUKE5FVEJPT1RfRFJJVkVSUykKKworZG5sIEJlY2F1c2UgcmVjZW50IGF1dG9tYWtlIGNvbXBsYWlucyBhYm91dCBDQ0FTRkxBR1MsIHNldCBpdCBoZXJlLgorQ0NBU0ZMQUdTPSckKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChDUFBGTEFHUykgJChDRkxBR1MpJworQUNfU1VCU1QoQ0NBU0ZMQUdTKQorCisKK2RubCBPdXRwdXQuCitBQ19DT05GSUdfRklMRVMoW01ha2VmaWxlIHN0YWdlMS9NYWtlZmlsZSBzdGFnZTIvTWFrZWZpbGUgXAorCQkgZG9jcy9NYWtlZmlsZSBsaWIvTWFrZWZpbGUgdXRpbC9NYWtlZmlsZSBcCisJCSBncnViL01ha2VmaWxlIG5ldGJvb3QvTWFrZWZpbGUgdXRpbC9ncnViLWltYWdlIFwKKwkJIHV0aWwvZ3J1Yi1pbnN0YWxsIHV0aWwvZ3J1Yi1tZDUtY3J5cHQgXAorCQkgdXRpbC9ncnViLXRlcm1pbmZvIHV0aWwvZ3J1Yi1zZXQtZGVmYXVsdF0pCitBQ19PVVRQVVQKZGlmZiAtLWdpdCBhL2RlcGNvbXAgYi9kZXBjb21wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjExZTJkM2IKLS0tIC9kZXYvbnVsbAorKysgYi9kZXBjb21wCkBAIC0wLDAgKzEsNTIyIEBACisjISAvYmluL3NoCisjIGRlcGNvbXAgLSBjb21waWxlIGEgcHJvZ3JhbSBnZW5lcmF0aW5nIGRlcGVuZGVuY2llcyBhcyBzaWRlLWVmZmVjdHMKKworc2NyaXB0dmVyc2lvbj0yMDA0LTA1LTMxLjIzCisKKyMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAzLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyMgMDIxMTEtMTMwNywgVVNBLgorCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4uCisKK2Nhc2UgJDEgaW4KKyAgJycpCisgICAgIGVjaG8gIiQwOiBObyBjb21tYW5kLiAgVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKKyAgICAgZXhpdCAxOworICAgICA7OworICAtaCB8IC0taCopCisgICAgY2F0IDw8XEVPRgorVXNhZ2U6IGRlcGNvbXAgWy0taGVscF0gWy0tdmVyc2lvbl0gUFJPR1JBTSBbQVJHU10KKworUnVuIFBST0dSQU1TIEFSR1MgdG8gY29tcGlsZSBhIGZpbGUsIGdlbmVyYXRpbmcgZGVwZW5kZW5jaWVzCithcyBzaWRlLWVmZmVjdHMuCisKK0Vudmlyb25tZW50IHZhcmlhYmxlczoKKyAgZGVwbW9kZSAgICAgRGVwZW5kZW5jeSB0cmFja2luZyBtb2RlLgorICBzb3VyY2UgICAgICBTb3VyY2UgZmlsZSByZWFkIGJ5IGBQUk9HUkFNUyBBUkdTJy4KKyAgb2JqZWN0ICAgICAgT2JqZWN0IGZpbGUgb3V0cHV0IGJ5IGBQUk9HUkFNUyBBUkdTJy4KKyAgREVQRElSICAgICAgZGlyZWN0b3J5IHdoZXJlIHRvIHN0b3JlIGRlcGVuZGVuY2llcy4KKyAgZGVwZmlsZSAgICAgRGVwZW5kZW5jeSBmaWxlIHRvIG91dHB1dC4KKyAgdG1wZGVwZmlsZSAgVGVtcG9yYXJ5IGZpbGUgdG8gdXNlIHdoZW4gb3V0cHV0aW5nIGRlcGVuZGVuY2llcy4KKyAgbGlidG9vbCAgICAgV2hldGhlciBsaWJ0b29sIGlzIHVzZWQgKHllcy9ubykuCisKK1JlcG9ydCBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uCitFT0YKKyAgICBleGl0IDAKKyAgICA7OworICAtdiB8IC0tdiopCisgICAgZWNobyAiZGVwY29tcCAkc2NyaXB0dmVyc2lvbiIKKyAgICBleGl0IDAKKyAgICA7OworZXNhYworCitpZiB0ZXN0IC16ICIkZGVwbW9kZSIgfHwgdGVzdCAteiAiJHNvdXJjZSIgfHwgdGVzdCAteiAiJG9iamVjdCI7IHRoZW4KKyAgZWNobyAiZGVwY29tcDogVmFyaWFibGVzIHNvdXJjZSwgb2JqZWN0IGFuZCBkZXBtb2RlIG11c3QgYmUgc2V0IiAxPiYyCisgIGV4aXQgMQorZmkKKworIyBEZXBlbmRlbmNpZXMgZm9yIHN1Yi9iYXIubyBvciBzdWIvYmFyLm9iaiBnbyBpbnRvIHN1Yi8uZGVwcy9iYXIuUG8uCitkZXBmaWxlPSR7ZGVwZmlsZS1gZWNobyAiJG9iamVjdCIgfAorICBzZWQgJ3N8W15cXC9dKiR8JyR7REVQRElSLS5kZXBzfScvJnw7c3xcLlwoW14uXSpcKSR8LlBcMXw7c3xQb2JqJHxQb3wnYH0KK3RtcGRlcGZpbGU9JHt0bXBkZXBmaWxlLWBlY2hvICIkZGVwZmlsZSIgfCBzZWQgJ3MvXC5cKFteLl0qXCkkLy5UXDEvJ2B9CisKK3JtIC1mICIkdG1wZGVwZmlsZSIKKworIyBTb21lIG1vZGVzIHdvcmsganVzdCBsaWtlIG90aGVyIG1vZGVzLCBidXQgdXNlIGRpZmZlcmVudCBmbGFncy4gIFdlCisjIHBhcmFtZXRlcml6ZSBoZXJlLCBidXQgc3RpbGwgbGlzdCB0aGUgbW9kZXMgaW4gdGhlIGJpZyBjYXNlIGJlbG93LAorIyB0byBtYWtlIGRlcGVuZC5tNCBlYXNpZXIgdG8gd3JpdGUuICBOb3RlIHRoYXQgd2UgKmNhbm5vdCogdXNlIGEgY2FzZQorIyBoZXJlLCBiZWNhdXNlIHRoaXMgZmlsZSBjYW4gb25seSBjb250YWluIG9uZSBjYXNlIHN0YXRlbWVudC4KK2lmIHRlc3QgIiRkZXBtb2RlIiA9IGhwOyB0aGVuCisgICMgSFAgY29tcGlsZXIgdXNlcyAtTSBhbmQgbm8gZXh0cmEgYXJnLgorICBnY2NmbGFnPS1NCisgIGRlcG1vZGU9Z2NjCitmaQorCitpZiB0ZXN0ICIkZGVwbW9kZSIgPSBkYXNoWG1zdGRvdXQ7IHRoZW4KKyAgICMgVGhpcyBpcyBqdXN0IGxpa2UgZGFzaG1zdGRvdXQgd2l0aCBhIGRpZmZlcmVudCBhcmd1bWVudC4KKyAgIGRhc2htZmxhZz0teE0KKyAgIGRlcG1vZGU9ZGFzaG1zdGRvdXQKK2ZpCisKK2Nhc2UgIiRkZXBtb2RlIiBpbgorZ2NjMykKKyMjIGdjYyAzIGltcGxlbWVudHMgZGVwZW5kZW5jeSB0cmFja2luZyB0aGF0IGRvZXMgZXhhY3RseSB3aGF0CisjIyB3ZSB3YW50LiAgWWF5ISAgTm90ZTogZm9yIHNvbWUgcmVhc29uIGxpYnRvb2wgMS40IGRvZXNuJ3QgbGlrZQorIyMgaXQgaWYgLU1EIC1NUCBjb21lcyBhZnRlciB0aGUgLU1GIHN0dWZmLiAgSG1tLgorICAiJEAiIC1NVCAiJG9iamVjdCIgLU1EIC1NUCAtTUYgIiR0bXBkZXBmaWxlIgorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgbXYgIiR0bXBkZXBmaWxlIiAiJGRlcGZpbGUiCisgIDs7CisKK2djYykKKyMjIFRoZXJlIGFyZSB2YXJpb3VzIHdheXMgdG8gZ2V0IGRlcGVuZGVuY3kgb3V0cHV0IGZyb20gZ2NjLiAgSGVyZSdzCisjIyB3aHkgd2UgcGljayB0aGlzIHJhdGhlciBvYnNjdXJlIG1ldGhvZDoKKyMjIC0gRG9uJ3Qgd2FudCB0byB1c2UgLU1EIGJlY2F1c2Ugd2UnZCBsaWtlIHRoZSBkZXBlbmRlbmNpZXMgdG8gZW5kCisjIyAgIHVwIGluIGEgc3ViZGlyLiAgSGF2aW5nIHRvIHJlbmFtZSBieSBoYW5kIGlzIHVnbHkuCisjIyAgIChXZSBtaWdodCBlbmQgdXAgZG9pbmcgdGhpcyBhbnl3YXkgdG8gc3VwcG9ydCBvdGhlciBjb21waWxlcnMuKQorIyMgLSBUaGUgREVQRU5ERU5DSUVTX09VVFBVVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBtYWtlcyBnY2MgYWN0IGxpa2UKKyMjICAgLU1NLCBub3QgLU0gKGRlc3BpdGUgd2hhdCB0aGUgZG9jcyBzYXkpLgorIyMgLSBVc2luZyAtTSBkaXJlY3RseSBtZWFucyBydW5uaW5nIHRoZSBjb21waWxlciB0d2ljZSAoZXZlbiB3b3JzZQorIyMgICB0aGFuIHJlbmFtaW5nKS4KKyAgaWYgdGVzdCAteiAiJGdjY2ZsYWciOyB0aGVuCisgICAgZ2NjZmxhZz0tTUQsCisgIGZpCisgICIkQCIgLVdwLCIkZ2NjZmxhZyR0bXBkZXBmaWxlIgorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgcm0gLWYgIiRkZXBmaWxlIgorICBlY2hvICIkb2JqZWN0IDogXFwiID4gIiRkZXBmaWxlIgorICBhbHBoYT1BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6CisjIyBUaGUgc2Vjb25kIC1lIGV4cHJlc3Npb24gaGFuZGxlcyBET1Mtc3R5bGUgZmlsZSBuYW1lcyB3aXRoIGRyaXZlIGxldHRlcnMuCisgIHNlZCAtZSAncy9eW146XSo6IC8gLycgXAorICAgICAgLWUgJ3MvXlsnJGFscGhhJ106XC9bXjpdKjogLyAvJyA8ICIkdG1wZGVwZmlsZSIgPj4gIiRkZXBmaWxlIgorIyMgVGhpcyBuZXh0IHBpZWNlIG9mIG1hZ2ljIGF2b2lkcyB0aGUgYGRlbGV0ZWQgaGVhZGVyIGZpbGUnIHByb2JsZW0uCisjIyBUaGUgcHJvYmxlbSBpcyB0aGF0IHdoZW4gYSBoZWFkZXIgZmlsZSB3aGljaCBhcHBlYXJzIGluIGEgLlAgZmlsZQorIyMgaXMgZGVsZXRlZCwgdGhlIGRlcGVuZGVuY3kgY2F1c2VzIG1ha2UgdG8gZGllIChiZWNhdXNlIHRoZXJlIGlzCisjIyB0eXBpY2FsbHkgbm8gd2F5IHRvIHJlYnVpbGQgdGhlIGhlYWRlcikuICBXZSBhdm9pZCB0aGlzIGJ5IGFkZGluZworIyMgZHVtbXkgZGVwZW5kZW5jaWVzIGZvciBlYWNoIGhlYWRlciBmaWxlLiAgVG9vIGJhZCBnY2MgZG9lc24ndCBkbworIyMgdGhpcyBmb3IgdXMgZGlyZWN0bHkuCisgIHRyICcgJyAnCisnIDwgIiR0bXBkZXBmaWxlIiB8CisjIyBTb21lIHZlcnNpb25zIG9mIGdjYyBwdXQgYSBzcGFjZSBiZWZvcmUgdGhlIGA6Jy4gIE9uIHRoZSB0aGVvcnkKKyMjIHRoYXQgdGhlIHNwYWNlIG1lYW5zIHNvbWV0aGluZywgd2UgYWRkIGEgc3BhY2UgdG8gdGhlIG91dHB1dCBhcworIyMgd2VsbC4KKyMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCisjIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgorICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2hwKQorICAjIFRoaXMgY2FzZSBleGlzdHMgb25seSB0byBsZXQgZGVwZW5kLm00IGRvIGl0cyB3b3JrLiAgSXQgd29ya3MgYnkKKyAgIyBsb29raW5nIGF0IHRoZSB0ZXh0IG9mIHRoaXMgc2NyaXB0LiAgVGhpcyBjYXNlIHdpbGwgbmV2ZXIgYmUgcnVuLAorICAjIHNpbmNlIGl0IGlzIGNoZWNrZWQgZm9yIGFib3ZlLgorICBleGl0IDEKKyAgOzsKKworc2dpKQorICBpZiB0ZXN0ICIkbGlidG9vbCIgPSB5ZXM7IHRoZW4KKyAgICAiJEAiICItV3AsLU1EdXBkYXRlLCR0bXBkZXBmaWxlIgorICBlbHNlCisgICAgIiRAIiAtTUR1cGRhdGUgIiR0bXBkZXBmaWxlIgorICBmaQorICBzdGF0PSQ/CisgIGlmIHRlc3QgJHN0YXQgLWVxIDA7IHRoZW4gOgorICBlbHNlCisgICAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICAgIGV4aXQgJHN0YXQKKyAgZmkKKyAgcm0gLWYgIiRkZXBmaWxlIgorCisgIGlmIHRlc3QgLWYgIiR0bXBkZXBmaWxlIjsgdGhlbiAgIyB5ZXMsIHRoZSBzb3VyY2VmaWxlIGRlcGVuZCBvbiBvdGhlciBmaWxlcworICAgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCisKKyAgICAjIENsaXAgb2ZmIHRoZSBpbml0aWFsIGVsZW1lbnQgKHRoZSBkZXBlbmRlbnQpLiAgRG9uJ3QgdHJ5IHRvIGJlCisgICAgIyBjbGV2ZXIgYW5kIHJlcGxhY2UgdGhpcyB3aXRoIHNlZCBjb2RlLCBhcyBJUklYIHNlZCB3b24ndCBoYW5kbGUKKyAgICAjIGxpbmVzIHdpdGggbW9yZSB0aGFuIGEgZml4ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKDQwOTYgaW4KKyAgICAjIElSSVggNi4yIHNlZCwgODE5MiBpbiBJUklYIDYuNSkuICBXZSBhbHNvIHJlbW92ZSBjb21tZW50IGxpbmVzOworICAgICMgdGhlIElSSVggY2MgYWRkcyBjb21tZW50cyBsaWtlIGAjOmZlYycgdG8gdGhlIGVuZCBvZiB0aGUKKyAgICAjIGRlcGVuZGVuY3kgbGluZS4KKyAgICB0ciAnICcgJworJyA8ICIkdG1wZGVwZmlsZSIgXAorICAgIHwgc2VkIC1lICdzL14uKlwubzovLycgLWUgJ3MvIy4qJC8vJyAtZSAnL14kLyBkJyB8IFwKKyAgICB0ciAnCisnICcgJyA+PiAkZGVwZmlsZQorICAgIGVjaG8gPj4gJGRlcGZpbGUKKworICAgICMgVGhlIHNlY29uZCBwYXNzIGdlbmVyYXRlcyBhIGR1bW15IGVudHJ5IGZvciBlYWNoIGhlYWRlciBmaWxlLgorICAgIHRyICcgJyAnCisnIDwgIiR0bXBkZXBmaWxlIiBcCisgICB8IHNlZCAtZSAncy9eLipcLm86Ly8nIC1lICdzLyMuKiQvLycgLWUgJy9eJC8gZCcgLWUgJ3MvJC86LycgXAorICAgPj4gJGRlcGZpbGUKKyAgZWxzZQorICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0CisgICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCisgICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KKyAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgorICBmaQorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2FpeCkKKyAgIyBUaGUgQyBmb3IgQUlYIENvbXBpbGVyIHVzZXMgLU0gYW5kIG91dHB1dHMgdGhlIGRlcGVuZGVuY2llcworICAjIGluIGEgLnUgZmlsZS4gIEluIG9sZGVyIHZlcnNpb25zLCB0aGlzIGZpbGUgYWx3YXlzIGxpdmVzIGluIHRoZQorICAjIGN1cnJlbnQgZGlyZWN0b3J5LiAgQWxzbywgdGhlIEFJWCBjb21waWxlciBwdXRzIGAkb2JqZWN0OicgYXQgdGhlCisgICMgc3RhcnQgb2YgZWFjaCBsaW5lOyAkb2JqZWN0IGRvZXNuJ3QgaGF2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCisgICMgVmVyc2lvbiA2IHVzZXMgdGhlIGRpcmVjdG9yeSBpbiBib3RoIGNhc2VzLgorICBzdHJpcHBlZD1gZWNobyAiJG9iamVjdCIgfCBzZWQgJ3MvXCguKlwpXC4uKiQvXDEvJ2AKKyAgdG1wZGVwZmlsZT0iJHN0cmlwcGVkLnUiCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgICIkQCIgLVdjLC1NCisgIGVsc2UKKyAgICAiJEAiIC1NCisgIGZpCisgIHN0YXQ9JD8KKworICBpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZSI7IHRoZW4gOgorICBlbHNlCisgICAgc3RyaXBwZWQ9YGVjaG8gIiRzdHJpcHBlZCIgfCBzZWQgJ3MsXi4qLywsJ2AKKyAgICB0bXBkZXBmaWxlPSIkc3RyaXBwZWQudSIKKyAgZmkKKworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisKKyAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCisgICAgb3V0bmFtZT0iJHN0cmlwcGVkLm8iCisgICAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcuCisgICAgIyBEbyB0d28gcGFzc2VzLCBvbmUgdG8ganVzdCBjaGFuZ2UgdGhlc2UgdG8KKyAgICAjIGAkb2JqZWN0OiBkZXBlbmRlbnQuaCcgYW5kIG9uZSB0byBzaW1wbHkgYGRlcGVuZGVudC5oOicuCisgICAgc2VkIC1lICJzLF4kb3V0bmFtZTosJG9iamVjdCA6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICAgIHNlZCAtZSAicyxeJG91dG5hbWU6IFwoLipcKSQsXDE6LCIgPCAiJHRtcGRlcGZpbGUiID4+ICIkZGVwZmlsZSIKKyAgZWxzZQorICAgICMgVGhlIHNvdXJjZWZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgZGVwZW5kZW5jaWVzLCBzbyBqdXN0CisgICAgIyBzdG9yZSBhIGR1bW15IGNvbW1lbnQgbGluZSwgdG8gYXZvaWQgZXJyb3JzIHdpdGggdGhlIE1ha2VmaWxlCisgICAgIyAiaW5jbHVkZSBiYXNlbmFtZS5QbG8iIHNjaGVtZS4KKyAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgorICBmaQorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2ljYykKKyAgIyBJbnRlbCdzIEMgY29tcGlsZXIgdW5kZXJzdGFuZHMgYC1NRCAtTUYgZmlsZScuICBIb3dldmVyIG9uCisgICMgICAgaWNjIC1NRCAtTUYgZm9vLmQgLWMgLW8gc3ViL2Zvby5vIHN1Yi9mb28uYworICAjIElDQyA3LjAgd2lsbCBmaWxsIGZvby5kIHdpdGggc29tZXRoaW5nIGxpa2UKKyAgIyAgICBmb28ubzogc3ViL2Zvby5jCisgICMgICAgZm9vLm86IHN1Yi9mb28uaAorICAjIHdoaWNoIGlzIHdyb25nLiAgV2Ugd2FudDoKKyAgIyAgICBzdWIvZm9vLm86IHN1Yi9mb28uYworICAjICAgIHN1Yi9mb28ubzogc3ViL2Zvby5oCisgICMgICAgc3ViL2Zvby5jOgorICAjICAgIHN1Yi9mb28uaDoKKyAgIyBJQ0MgNy4xIHdpbGwgb3V0cHV0CisgICMgICAgZm9vLm86IHN1Yi9mb28uYyBzdWIvZm9vLmgKKyAgIyBhbmQgd2lsbCB3cmFwIGxvbmcgbGluZXMgdXNpbmcgXCA6CisgICMgICAgZm9vLm86IHN1Yi9mb28uYyAuLi4gXAorICAjICAgICBzdWIvZm9vLmggLi4uIFwKKyAgIyAgICAgLi4uCisKKyAgIiRAIiAtTUQgLU1GICIkdG1wZGVwZmlsZSIKKyAgc3RhdD0kPworICBpZiB0ZXN0ICRzdGF0IC1lcSAwOyB0aGVuIDoKKyAgZWxzZQorICAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgICBleGl0ICRzdGF0CisgIGZpCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgIyBFYWNoIGxpbmUgaXMgb2YgdGhlIGZvcm0gYGZvby5vOiBkZXBlbmRlbnQuaCcsCisgICMgb3IgYGZvby5vOiBkZXAxLmggZGVwMi5oIFwnLCBvciBgIGRlcDMuaCBkZXA0LmggXCcuCisgICMgRG8gdHdvIHBhc3Nlcywgb25lIHRvIGp1c3QgY2hhbmdlIHRoZXNlIHRvCisgICMgYCRvYmplY3Q6IGRlcGVuZGVudC5oJyBhbmQgb25lIHRvIHNpbXBseSBgZGVwZW5kZW50Lmg6Jy4KKyAgc2VkICJzLF5bXjpdKjosJG9iamVjdCA6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICAjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCisgICMgY29ycmVjdGx5LiAgQnJlYWtpbmcgaXQgaW50byB0d28gc2VkIGludm9jYXRpb25zIGlzIGEgd29ya2Fyb3VuZC4KKyAgc2VkICdzLF5bXjpdKjogXCguKlwpJCxcMSw7cy9eXFwkLy87L14kL2Q7LzokL2QnIDwgIiR0bXBkZXBmaWxlIiB8CisgICAgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKwordHJ1NjQpCisgICAjIFRoZSBUcnU2NCBjb21waWxlciB1c2VzIC1NRCB0byBnZW5lcmF0ZSBkZXBlbmRlbmNpZXMgYXMgYSBzaWRlCisgICAjIGVmZmVjdC4gIGBjYyAtTUQgLW8gZm9vLm8gLi4uJyBwdXRzIHRoZSBkZXBlbmRlbmNpZXMgaW50byBgZm9vLm8uZCcuCisgICAjIEF0IGxlYXN0IG9uIEFscGhhL1JlZGhhdCA2LjEsIENvbXBhcSBDQ0MgVjYuMi01MDQgc2VlbXMgdG8gcHV0CisgICAjIGRlcGVuZGVuY2llcyBpbiBgZm9vLmQnIGluc3RlYWQsIHNvIHdlIGNoZWNrIGZvciB0aGF0IHRvby4KKyAgICMgU3ViZGlyZWN0b3JpZXMgYXJlIHJlc3BlY3RlZC4KKyAgIGRpcj1gZWNobyAiJG9iamVjdCIgfCBzZWQgLWUgJ3N8L1teL10qJHwvfCdgCisgICB0ZXN0ICJ4JGRpciIgPSAieCRvYmplY3QiICYmIGRpcj0KKyAgIGJhc2U9YGVjaG8gIiRvYmplY3QiIHwgc2VkIC1lICdzfF4uKi98fCcgLWUgJ3MvXC5vJC8vJyAtZSAncy9cLmxvJC8vJ2AKKworICAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgICAjIERlcGVuZGVuY2llcyBhcmUgb3V0cHV0IGluIC5sby5kIHdpdGggbGlidG9vbCAxLjQuCisgICAgICAjIFdpdGggbGlidG9vbCAxLjUgdGhleSBhcmUgb3V0cHV0IGJvdGggaW4gJGRpci5saWJzLyRiYXNlLm8uZAorICAgICAgIyBhbmQgaW4gJGRpci5saWJzLyRiYXNlLm8uZCBhbmQgJGRpciRiYXNlLm8uZC4gIFdlIHByb2Nlc3MgdGhlCisgICAgICAjIGxhdHRlciwgYmVjYXVzZSB0aGUgZm9ybWVyIHdpbGwgYmUgY2xlYW5lZCB3aGVuICRkaXIubGlicyBpcworICAgICAgIyBlcmFzZWQuCisgICAgICB0bXBkZXBmaWxlMT0iJGRpci5saWJzLyRiYXNlLmxvLmQiCisgICAgICB0bXBkZXBmaWxlMj0iJGRpciRiYXNlLm8uZCIKKyAgICAgIHRtcGRlcGZpbGUzPSIkZGlyLmxpYnMvJGJhc2UuZCIKKyAgICAgICIkQCIgLVdjLC1NRAorICAgZWxzZQorICAgICAgdG1wZGVwZmlsZTE9IiRkaXIkYmFzZS5vLmQiCisgICAgICB0bXBkZXBmaWxlMj0iJGRpciRiYXNlLmQiCisgICAgICB0bXBkZXBmaWxlMz0iJGRpciRiYXNlLmQiCisgICAgICAiJEAiIC1NRAorICAgZmkKKworICAgc3RhdD0kPworICAgaWYgdGVzdCAkc3RhdCAtZXEgMDsgdGhlbiA6CisgICBlbHNlCisgICAgICBybSAtZiAiJHRtcGRlcGZpbGUxIiAiJHRtcGRlcGZpbGUyIiAiJHRtcGRlcGZpbGUzIgorICAgICAgZXhpdCAkc3RhdAorICAgZmkKKworICAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUxIjsgdGhlbgorICAgICAgdG1wZGVwZmlsZT0iJHRtcGRlcGZpbGUxIgorICAgZWxpZiB0ZXN0IC1mICIkdG1wZGVwZmlsZTIiOyB0aGVuCisgICAgICB0bXBkZXBmaWxlPSIkdG1wZGVwZmlsZTIiCisgICBlbHNlCisgICAgICB0bXBkZXBmaWxlPSIkdG1wZGVwZmlsZTMiCisgICBmaQorICAgaWYgdGVzdCAtZiAiJHRtcGRlcGZpbGUiOyB0aGVuCisgICAgICBzZWQgLWUgInMsXi4qXC5bYS16XSo6LCRvYmplY3Q6LCIgPCAiJHRtcGRlcGZpbGUiID4gIiRkZXBmaWxlIgorICAgICAgIyBUaGF0J3MgYSB0YWIgYW5kIGEgc3BhY2UgaW4gdGhlIFtdLgorICAgICAgc2VkIC1lICdzLF4uKlwuW2Etel0qOlsJIF0qLCwnIC1lICdzLCQsOiwnIDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgICBlbHNlCisgICAgICBlY2hvICIjZHVtbXkiID4gIiRkZXBmaWxlIgorICAgZmkKKyAgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgIDs7CisKKyNub3NpZGVlZmZlY3QpCisgICMgVGhpcyBjb21tZW50IGFib3ZlIGlzIHVzZWQgYnkgYXV0b21ha2UgdG8gdGVsbCBzaWRlLWVmZmVjdAorICAjIGRlcGVuZGVuY3kgdHJhY2tpbmcgbWVjaGFuaXNtcyBmcm9tIHNsb3dlciBvbmVzLgorCitkYXNobXN0ZG91dCkKKyAgIyBJbXBvcnRhbnQgbm90ZTogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIG1vZGUsIGEgY29tcGlsZXIgKm11c3QqCisgICMgYWx3YXlzIHdyaXRlIHRoZSBwcmVwcm9jZXNzZWQgZmlsZSB0byBzdGRvdXQsIHJlZ2FyZGxlc3Mgb2YgLW8uCisgICIkQCIgfHwgZXhpdCAkPworCisgICMgUmVtb3ZlIHRoZSBjYWxsIHRvIExpYnRvb2wuCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KKyAgICAgIHNoaWZ0CisgICAgZG9uZQorICAgIHNoaWZ0CisgIGZpCisKKyAgIyBSZW1vdmUgYC1vICRvYmplY3QnLgorICBJRlM9IiAiCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICRhcmcgaW4KKyAgICAtbykKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICRvYmplY3QpCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAqKQorICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciCisgICAgICBzaGlmdCAjIGZub3JkCisgICAgICBzaGlmdCAjICRhcmcKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisKKyAgdGVzdCAteiAiJGRhc2htZmxhZyIgJiYgZGFzaG1mbGFnPS1NCisgICMgUmVxdWlyZSBhdCBsZWFzdCB0d28gY2hhcmFjdGVycyBiZWZvcmUgc2VhcmNoaW5nIGZvciBgOicKKyAgIyBpbiB0aGUgdGFyZ2V0IG5hbWUuICBUaGlzIGlzIHRvIGNvcGUgd2l0aCBET1Mtc3R5bGUgZmlsZW5hbWVzOgorICAjIGEgZGVwZW5kZW5jeSBzdWNoIGFzIGBjOi9mb28vYmFyJyBjb3VsZCBiZSBzZWVuIGFzIHRhcmdldCBgYycgb3RoZXJ3aXNlLgorICAiJEAiICRkYXNobWZsYWcgfAorICAgIHNlZCAnczpeWyAgXSpbXjogXVteOl1bXjpdKlw6WyAgICBdKjonIiRvYmplY3QiJ1w6IDonID4gIiR0bXBkZXBmaWxlIgorICBybSAtZiAiJGRlcGZpbGUiCisgIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCisgIHRyICcgJyAnCisnIDwgIiR0bXBkZXBmaWxlIiB8IFwKKyMjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIEhQVVggMTAuMjAgc2VkIGNhbid0IHByb2Nlc3MgdGhpcyBpbnZvY2F0aW9uCisjIyBjb3JyZWN0bHkuICBCcmVha2luZyBpdCBpbnRvIHR3byBzZWQgaW52b2NhdGlvbnMgaXMgYSB3b3JrYXJvdW5kLgorICAgIHNlZCAtZSAncy9eXFwkLy8nIC1lICcvXiQvZCcgLWUgJy86JC9kJyB8IHNlZCAtZSAncy8kLyA6LycgPj4gIiRkZXBmaWxlIgorICBybSAtZiAiJHRtcGRlcGZpbGUiCisgIDs7CisKK2Rhc2hYbXN0ZG91dCkKKyAgIyBUaGlzIGNhc2Ugb25seSBleGlzdHMgdG8gc2F0aXNmeSBkZXBlbmQubTQuICBJdCBpcyBuZXZlciBhY3R1YWxseQorICAjIHJ1biwgYXMgdGhpcyBtb2RlIGlzIHNwZWNpYWxseSByZWNvZ25pemVkIGluIHRoZSBwcmVhbWJsZS4KKyAgZXhpdCAxCisgIDs7CisKK21ha2VkZXBlbmQpCisgICIkQCIgfHwgZXhpdCAkPworICAjIFJlbW92ZSBhbnkgTGlidG9vbCBjYWxsCisgIGlmIHRlc3QgIiRsaWJ0b29sIiA9IHllczsgdGhlbgorICAgIHdoaWxlIHRlc3QgJDEgIT0gJy0tbW9kZT1jb21waWxlJzsgZG8KKyAgICAgIHNoaWZ0CisgICAgZG9uZQorICAgIHNoaWZ0CisgIGZpCisgICMgWCBtYWtlZGVwZW5kCisgIHNoaWZ0CisgIGNsZWFyZWQ9bm8KKyAgZm9yIGFyZyBpbiAiJEAiOyBkbworICAgIGNhc2UgJGNsZWFyZWQgaW4KKyAgICBubykKKyAgICAgIHNldCAiIjsgc2hpZnQKKyAgICAgIGNsZWFyZWQ9eWVzIDs7CisgICAgZXNhYworICAgIGNhc2UgIiRhcmciIGluCisgICAgLUQqfC1JKikKKyAgICAgIHNldCBmbm9yZCAiJEAiICIkYXJnIjsgc2hpZnQgOzsKKyAgICAjIFN0cmlwIGFueSBvcHRpb24gdGhhdCBtYWtlZGVwZW5kIG1heSBub3QgdW5kZXJzdGFuZC4gIFJlbW92ZQorICAgICMgdGhlIG9iamVjdCB0b28sIG90aGVyd2lzZSBtYWtlZGVwZW5kIHdpbGwgcGFyc2UgaXQgYXMgYSBzb3VyY2UgZmlsZS4KKyAgICAtKnwkb2JqZWN0KQorICAgICAgOzsKKyAgICAqKQorICAgICAgc2V0IGZub3JkICIkQCIgIiRhcmciOyBzaGlmdCA7OworICAgIGVzYWMKKyAgZG9uZQorICBvYmpfc3VmZml4PSJgZWNobyAkb2JqZWN0IHwgc2VkICdzL14uKlwuLy4vJ2AiCisgIHRvdWNoICIkdG1wZGVwZmlsZSIKKyAgJHtNQUtFREVQRU5ELW1ha2VkZXBlbmR9IC1vIiRvYmpfc3VmZml4IiAtZiIkdG1wZGVwZmlsZSIgIiRAIgorICBybSAtZiAiJGRlcGZpbGUiCisgIGNhdCA8ICIkdG1wZGVwZmlsZSIgPiAiJGRlcGZpbGUiCisgIHNlZCAnMSwyZCcgIiR0bXBkZXBmaWxlIiB8IHRyICcgJyAnCisnIHwgXAorIyMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFBVWCAxMC4yMCBzZWQgY2FuJ3QgcHJvY2VzcyB0aGlzIGludm9jYXRpb24KKyMjIGNvcnJlY3RseS4gIEJyZWFraW5nIGl0IGludG8gdHdvIHNlZCBpbnZvY2F0aW9ucyBpcyBhIHdvcmthcm91bmQuCisgICAgc2VkIC1lICdzL15cXCQvLycgLWUgJy9eJC9kJyAtZSAnLzokL2QnIHwgc2VkIC1lICdzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIgIiR0bXBkZXBmaWxlIi5iYWsKKyAgOzsKKworY3BwKQorICAjIEltcG9ydGFudCBub3RlOiBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgbW9kZSwgYSBjb21waWxlciAqbXVzdCoKKyAgIyBhbHdheXMgd3JpdGUgdGhlIHByZXByb2Nlc3NlZCBmaWxlIHRvIHN0ZG91dC4KKyAgIiRAIiB8fCBleGl0ICQ/CisKKyAgIyBSZW1vdmUgdGhlIGNhbGwgdG8gTGlidG9vbC4KKyAgaWYgdGVzdCAiJGxpYnRvb2wiID0geWVzOyB0aGVuCisgICAgd2hpbGUgdGVzdCAkMSAhPSAnLS1tb2RlPWNvbXBpbGUnOyBkbworICAgICAgc2hpZnQKKyAgICBkb25lCisgICAgc2hpZnQKKyAgZmkKKworICAjIFJlbW92ZSBgLW8gJG9iamVjdCcuCisgIElGUz0iICIKKyAgZm9yIGFyZworICBkbworICAgIGNhc2UgJGFyZyBpbgorICAgIC1vKQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgJG9iamVjdCkKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgICopCisgICAgICBzZXQgZm5vcmQgIiRAIiAiJGFyZyIKKyAgICAgIHNoaWZ0ICMgZm5vcmQKKyAgICAgIHNoaWZ0ICMgJGFyZworICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICAiJEAiIC1FIHwKKyAgICBzZWQgLW4gJy9eIyBbMC05XVswLTldKiAiXChbXiJdKlwpIi4qLyBzOjogXDEgXFw6cCcgfAorICAgIHNlZCAnJCBzOiBcXCQ6OicgPiAiJHRtcGRlcGZpbGUiCisgIHJtIC1mICIkZGVwZmlsZSIKKyAgZWNobyAiJG9iamVjdCA6IFxcIiA+ICIkZGVwZmlsZSIKKyAgY2F0IDwgIiR0bXBkZXBmaWxlIiA+PiAiJGRlcGZpbGUiCisgIHNlZCA8ICIkdG1wZGVwZmlsZSIgJy9eJC9kO3MvXiAvLztzLyBcXCQvLztzLyQvIDovJyA+PiAiJGRlcGZpbGUiCisgIHJtIC1mICIkdG1wZGVwZmlsZSIKKyAgOzsKKworbXN2aXN1YWxjcHApCisgICMgSW1wb3J0YW50IG5vdGU6IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcyBtb2RlLCBhIGNvbXBpbGVyICptdXN0KgorICAjIGFsd2F5cyB3cml0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGUgdG8gc3Rkb3V0LCByZWdhcmRsZXNzIG9mIC1vLAorICAjIGJlY2F1c2Ugd2UgbXVzdCB1c2UgLW8gd2hlbiBydW5uaW5nIGxpYnRvb2wuCisgICIkQCIgfHwgZXhpdCAkPworICBJRlM9IiAiCisgIGZvciBhcmcKKyAgZG8KKyAgICBjYXNlICIkYXJnIiBpbgorICAgICItR20ifCIvR20ifCItR2kifCIvR2kifCItWkkifCIvWkkiKQorCXNldCBmbm9yZCAiJEAiCisJc2hpZnQKKwlzaGlmdAorCTs7CisgICAgKikKKwlzZXQgZm5vcmQgIiRAIiAiJGFyZyIKKwlzaGlmdAorCXNoaWZ0CisJOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgIiRAIiAtRSB8CisgIHNlZCAtbiAnL14jbGluZSBbMC05XVswLTldKiAiXChbXiJdKlwpIi8gczo6ZWNobyAiYGN5Z3BhdGggLXUgXFwiXDFcXCJgIjpwJyB8IHNvcnQgfCB1bmlxID4gIiR0bXBkZXBmaWxlIgorICBybSAtZiAiJGRlcGZpbGUiCisgIGVjaG8gIiRvYmplY3QgOiBcXCIgPiAiJGRlcGZpbGUiCisgIC4gIiR0bXBkZXBmaWxlIiB8IHNlZCAncyUgJVxcICVnJyB8IHNlZCAtbiAnL15cKC4qXCkkLyBzOjoJXDEgXFw6cCcgPj4gIiRkZXBmaWxlIgorICBlY2hvICIJIiA+PiAiJGRlcGZpbGUiCisgIC4gIiR0bXBkZXBmaWxlIiB8IHNlZCAncyUgJVxcICVnJyB8IHNlZCAtbiAnL15cKC4qXCkkLyBzOjpcMVw6OnAnID4+ICIkZGVwZmlsZSIKKyAgcm0gLWYgIiR0bXBkZXBmaWxlIgorICA7OworCitub25lKQorICBleGVjICIkQCIKKyAgOzsKKworKikKKyAgZWNobyAiVW5rbm93biBkZXBtb2RlICRkZXBtb2RlIiAxPiYyCisgIGV4aXQgMQorICA7OworZXNhYworCitleGl0IDAKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6IHNoZWxsLXNjcmlwdAorIyBzaC1pbmRlbnRhdGlvbjogMgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJzY3JpcHR2ZXJzaW9uPSIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkLiUwMkgiCisjIHRpbWUtc3RhbXAtZW5kOiAiJCIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvZG9jcy9NYWtlZmlsZS5hbSBiL2RvY3MvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI5OWUyZAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw2NSBAQAoraW5mb19URVhJTkZPUyA9IGdydWIudGV4aSBtdWx0aWJvb3QudGV4aQorZ3J1Yl9URVhJTkZPUyA9IGludGVybmFscy50ZXhpCitFWEFNUExFUyA9IGJvb3QuUyBrZXJuZWwuYyBtdWx0aWJvb3QuaAorbXVsdGlib290X1RFWElORk9TID0gYm9vdC5TLnRleGkga2VybmVsLmMudGV4aSBtdWx0aWJvb3QuaC50ZXhpCittYW5fTUFOUyA9IGdydWIuOCBtYmNoay4xIGdydWItaW5zdGFsbC44IGdydWItbWQ1LWNyeXB0LjggZ3J1Yi10ZXJtaW5mby44CitIRUxQMk1BTiA9IGhlbHAybWFuCitTUkMyVEVYSSA9IHNyYzJ0ZXhpCitub2luc3RfU0NSSVBUUyA9ICQoSEVMUDJNQU4pICQoU1JDMlRFWEkpCitFWFRSQV9QUk9HUkFNUyA9IGtlcm5lbAorCisjIFRoZSBleGFtcGxlIGtlcm5lbCBpcyBidWlsdCBpZiB5b3Ugc3BlY2lmeSAtLWVuYWJsZS1leGFtcGxlLWtlcm5lbC4KK2lmIEJVSUxEX0VYQU1QTEVfS0VSTkVMCitub2luc3RfUFJPR1JBTVMgPSBrZXJuZWwKK2tlcm5lbF9TT1VSQ0VTID0gJChFWEFNUExFUykKK2tlcm5lbF9DRkxBR1MgPSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIC1PIC1nIC1XYWxsIFwKKwktaW1hY3JvcyAkKHRvcF9idWlsZGRpcikvY29uZmlnLmgKK2tlcm5lbF9MREZMQUdTID0gLW5vc3RkbGliIC1XbCwtTiAtV2wsLVR0ZXh0IC1XbCwxMDAwMDAKKworYm9vdC5vOiBtdWx0aWJvb3QuaAorZW5kaWYKKworRVhUUkFfRElTVCA9IG1lbnUubHN0ICQobWFuX01BTlMpICQobm9pbnN0X1NDUklQVFMpIFwKKwkkKEVYQU1QTEVTKSAkKG11bHRpYm9vdF9URVhJTkZPUykKK0NMRUFORklMRVMgPSAkKG5vaW5zdF9QUk9HUkFNUykKKworIyBDYW5jZWwgdGhlIHJ1bGUgJS50ZXhpIC0+ICUuIFRoaXMgcnVsZSBtYXkgY29uZnVzZSBtYWtlIHRvIGRldGVybWluZQorIyB0aGUgZGVwZW5kZWNpZXMuCisudGV4aToKKworJS5jLnRleGk6ICUuYyAkKHNyY2RpcikvJChTUkMyVEVYSSkKKwkkKFNIRUxMKSAkKHNyY2RpcikvJChTUkMyVEVYSSkgJChzcmNkaXIpICQ8ICRACisKKyUuaC50ZXhpOiAlLmggJChzcmNkaXIpLyQoU1JDMlRFWEkpCisJJChTSEVMTCkgJChzcmNkaXIpLyQoU1JDMlRFWEkpICQoc3JjZGlyKSAkPCAkQAorCislLlMudGV4aTogJS5TICQoc3JjZGlyKS8kKFNSQzJURVhJKQorCSQoU0hFTEwpICQoc3JjZGlyKS8kKFNSQzJURVhJKSAkKHNyY2RpcikgJDwgJEAKKworaWYgTUFJTlRBSU5FUl9NT0RFCiskKHNyY2RpcikvZ3J1Yi44OiAuLi9ncnViL2dydWIgJChzcmNkaXIpLyQoSEVMUDJNQU4pCisJJChQRVJMKSAkKHNyY2RpcikvJChIRUxQMk1BTikgLS1uYW1lPSJ0aGUgZ3J1YiBzaGVsbCIgXAorCQktLXNlY3Rpb249OCAtLW91dHB1dD0kQCAkPAorCiskKHNyY2RpcikvZ3J1Yi1pbnN0YWxsLjg6IC4uL3V0aWwvZ3J1Yi1pbnN0YWxsICQoc3JjZGlyKS8kKEhFTFAyTUFOKQorCWNobW9kIDc1NSAkPAorCSQoUEVSTCkgJChzcmNkaXIpLyQoSEVMUDJNQU4pIC0tbmFtZT0iaW5zdGFsbCBHUlVCIG9uIHlvdXIgZHJpdmUiIFwKKwkJLS1zZWN0aW9uPTggLS1vdXRwdXQ9JEAgJDwKKworJChzcmNkaXIpL21iY2hrLjE6IC4uL3V0aWwvbWJjaGsgJChzcmNkaXIpLyQoSEVMUDJNQU4pCisJJChQRVJMKSAkKHNyY2RpcikvJChIRUxQMk1BTikgXAorCQktLW5hbWU9ImNoZWNrIHRoZSBmb3JtYXQgb2YgYSBNdWx0aWJvb3Qga2VybmVsIiBcCisJCS0tc2VjdGlvbj0xIC0tb3V0cHV0PSRAICQ8CisKKyQoc3JjZGlyKS9ncnViLW1kNS1jcnlwdC44OiAuLi91dGlsL2dydWItbWQ1LWNyeXB0ICQoc3JjZGlyKS8kKEhFTFAyTUFOKQorCWNobW9kIDc1NSAkPAorCSQoUEVSTCkgJChzcmNkaXIpLyQoSEVMUDJNQU4pIFwKKwkJLS1uYW1lPSJFbmNyeXB0IGEgcGFzc3dvcmQgaW4gTUQ1IGZvcm1hdCIgXAorCQktLXNlY3Rpb249OCAtLW91dHB1dD0kQCAkPAorCiskKHNyY2RpcikvZ3J1Yi10ZXJtaW5mby44OiAuLi91dGlsL2dydWItdGVybWluZm8gJChzcmNkaXIpLyQoSEVMUDJNQU4pCisJY2htb2QgNzU1ICQ8CisJJChQRVJMKSAkKHNyY2RpcikvJChIRUxQMk1BTikgXAorCQktLW5hbWU9IkdlbmVyYXRlIGEgdGVybWluZm8gY29tbWFuZCBmcm9tIGEgdGVybWluZm8gbmFtZSIgXAorCQktLXNlY3Rpb249OCAtLW91dHB1dD0kQCAkPAorZW5kaWYKZGlmZiAtLWdpdCBhL2RvY3MvTWFrZWZpbGUuaW4gYi9kb2NzL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMmRlNGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNzcwIEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjkuNCBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKKworU09VUkNFUyA9ICQoa2VybmVsX1NPVVJDRVMpCisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitWUEFUSCA9IEBzcmNkaXJACitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAordG9wX2J1aWxkZGlyID0gLi4KK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK0lOU1RBTEwgPSBASU5TVEFMTEAKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK0VYVFJBX1BST0dSQU1TID0ga2VybmVsJChFWEVFWFQpCitAQlVJTERfRVhBTVBMRV9LRVJORUxfVFJVRUBub2luc3RfUFJPR1JBTVMgPSBrZXJuZWwkKEVYRUVYVCkKK3N1YmRpciA9IGRvY3MKK0RJU1RfQ09NTU9OID0gJChncnViX1RFWElORk9TKSAkKG11bHRpYm9vdF9URVhJTkZPUykgXAorCSQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4gXAorCSQoc3JjZGlyKS9zdGFtcC12dGkgJChzcmNkaXIpL3ZlcnNpb24udGV4aSBtZGF0ZS1zaCBcCisJdGV4aW5mby50ZXgKK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjaW5jbHVkZS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycworQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK1BST0dSQU1TID0gJChub2luc3RfUFJPR1JBTVMpCithbV9fa2VybmVsX1NPVVJDRVNfRElTVCA9IGJvb3QuUyBrZXJuZWwuYyBtdWx0aWJvb3QuaAorYW1fX29iamVjdHNfMSA9IGJvb3QuJChPQkpFWFQpIGtlcm5lbC1rZXJuZWwuJChPQkpFWFQpCitAQlVJTERfRVhBTVBMRV9LRVJORUxfVFJVRUBhbV9rZXJuZWxfT0JKRUNUUyA9ICQoYW1fX29iamVjdHNfMSkKK2tlcm5lbF9PQkpFQ1RTID0gJChhbV9rZXJuZWxfT0JKRUNUUykKK2tlcm5lbF9MREFERCA9ICQoTERBREQpCitTQ1JJUFRTID0gJChub2luc3RfU0NSSVBUUykKK0RFRkFVTFRfSU5DTFVERVMgPSAtSS4gLUkkKHNyY2RpcikgLUkkKHRvcF9idWlsZGRpcikKK2RlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKK2FtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCitDQ0FTQ09NUElMRSA9ICQoQ0NBUykgJChBTV9DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKQorQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCisJJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorQ0NMRCA9ICQoQ0MpCitMSU5LID0gJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoQU1fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorU09VUkNFUyA9ICQoa2VybmVsX1NPVVJDRVMpCitESVNUX1NPVVJDRVMgPSAkKGFtX19rZXJuZWxfU09VUkNFU19ESVNUKQorSU5GT19ERVBTID0gJChzcmNkaXIpL2dydWIuaW5mbyAkKHNyY2RpcikvbXVsdGlib290LmluZm8KK2FtX19URVhJTkZPX1RFWF9ESVIgPSAkKHNyY2RpcikKK0RWSVMgPSBncnViLmR2aSBtdWx0aWJvb3QuZHZpCitQREZTID0gZ3J1Yi5wZGYgbXVsdGlib290LnBkZgorUFNTID0gZ3J1Yi5wcyBtdWx0aWJvb3QucHMKK0hUTUxTID0gZ3J1Yi5odG1sIG11bHRpYm9vdC5odG1sCitURVhJTkZPUyA9IGdydWIudGV4aSBtdWx0aWJvb3QudGV4aQorVEVYSTJEVkkgPSB0ZXhpMmR2aQorVEVYSTJQREYgPSAkKFRFWEkyRFZJKSAtLXBkZiAtLWJhdGNoCitNQUtFSU5GT0hUTUwgPSAkKE1BS0VJTkZPKSAtLWh0bWwKK0FNX01BS0VJTkZPSFRNTEZMQUdTID0gJChBTV9NQUtFSU5GT0ZMQUdTKQorRFZJUFMgPSBkdmlwcworYW1fX2luc3RhbGxkaXJzID0gIiQoREVTVERJUikkKGluZm9kaXIpIiAiJChERVNURElSKSQobWFuMWRpcikiIFwKKwkiJChERVNURElSKSQobWFuOGRpcikiCittYW4xZGlyID0gJChtYW5kaXIpL21hbjEKK21hbjhkaXIgPSAkKG1hbmRpcikvbWFuOAorTlJPRkYgPSBucm9mZgorTUFOUyA9ICQobWFuX01BTlMpCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQU1ERVBfRkFMU0UgPSBAQU1ERVBfRkFMU0VACitBTURFUF9UUlVFID0gQEFNREVQX1RSVUVACitBTVRBUiA9IEBBTVRBUkAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBV0sgPSBAQVdLQAorQlVJTERfRVhBTVBMRV9LRVJORUxfRkFMU0UgPSBAQlVJTERfRVhBTVBMRV9LRVJORUxfRkFMU0VACitCVUlMRF9FWEFNUExFX0tFUk5FTF9UUlVFID0gQEJVSUxEX0VYQU1QTEVfS0VSTkVMX1RSVUVACitDQyA9IEBDQ0AKK0NDQVMgPSBAQ0NBU0AKK0NDQVNGTEFHUyA9IEBDQ0FTRkxBR1NACitDQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NZR1BBVEhfVyA9IEBDWUdQQVRIX1dACitERUZTID0gQERFRlNACitERVBESVIgPSBAREVQRElSQAorRElTS0xFU1NfU1VQUE9SVF9GQUxTRSA9IEBESVNLTEVTU19TVVBQT1JUX0ZBTFNFQAorRElTS0xFU1NfU1VQUE9SVF9UUlVFID0gQERJU0tMRVNTX1NVUFBPUlRfVFJVRUAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0ZTWVNfQ0ZMQUdTID0gQEZTWVNfQ0ZMQUdTQAorR1JVQl9DRkxBR1MgPSBAR1JVQl9DRkxBR1NACitHUlVCX0xJQlMgPSBAR1JVQl9MSUJTQAorSEVSQ1VMRVNfU1VQUE9SVF9GQUxTRSA9IEBIRVJDVUxFU19TVVBQT1JUX0ZBTFNFQAorSEVSQ1VMRVNfU1VQUE9SVF9UUlVFID0gQEhFUkNVTEVTX1NVUFBPUlRfVFJVRUAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BSU5UID0gQE1BSU5UQAorTUFJTlRBSU5FUl9NT0RFX0ZBTFNFID0gQE1BSU5UQUlORVJfTU9ERV9GQUxTRUAKK01BSU5UQUlORVJfTU9ERV9UUlVFID0gQE1BSU5UQUlORVJfTU9ERV9UUlVFQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitORVRCT09UX0RSSVZFUlMgPSBATkVUQk9PVF9EUklWRVJTQAorTkVUQk9PVF9TVVBQT1JUX0ZBTFNFID0gQE5FVEJPT1RfU1VQUE9SVF9GQUxTRUAKK05FVEJPT1RfU1VQUE9SVF9UUlVFID0gQE5FVEJPT1RfU1VQUE9SVF9UUlVFQAorTkVUX0NGTEFHUyA9IEBORVRfQ0ZMQUdTQAorTkVUX0VYVFJBRkxBR1MgPSBATkVUX0VYVFJBRkxBR1NACitPQkpDT1BZID0gQE9CSkNPUFlACitPQkpFWFQgPSBAT0JKRVhUQAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEVSTCA9IEBQRVJMQAorUkFOTElCID0gQFJBTkxJQkAKK1NFUklBTF9TUEVFRF9TSU1VTEFUSU9OX0ZBTFNFID0gQFNFUklBTF9TUEVFRF9TSU1VTEFUSU9OX0ZBTFNFQAorU0VSSUFMX1NQRUVEX1NJTVVMQVRJT05fVFJVRSA9IEBTRVJJQUxfU1BFRURfU0lNVUxBVElPTl9UUlVFQAorU0VSSUFMX1NVUFBPUlRfRkFMU0UgPSBAU0VSSUFMX1NVUFBPUlRfRkFMU0VACitTRVJJQUxfU1VQUE9SVF9UUlVFID0gQFNFUklBTF9TVVBQT1JUX1RSVUVACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU1RBR0UxX0NGTEFHUyA9IEBTVEFHRTFfQ0ZMQUdTQAorU1RBR0UyX0NGTEFHUyA9IEBTVEFHRTJfQ0ZMQUdTQAorU1RSSVAgPSBAU1RSSVBACitWRVJTSU9OID0gQFZFUlNJT05ACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X09CSkNPUFkgPSBAYWNfY3RfT0JKQ09QWUAKK2FjX2N0X1JBTkxJQiA9IEBhY19jdF9SQU5MSUJACithY19jdF9TVFJJUCA9IEBhY19jdF9TVFJJUEAKK2FtX19mYXN0ZGVwQ0NfRkFMU0UgPSBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAKK2FtX19mYXN0ZGVwQ0NfVFJVRSA9IEBhbV9fZmFzdGRlcENDX1RSVUVACithbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKK2FtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAorYW1fX3RhciA9IEBhbV9fdGFyQAorYW1fX3VudGFyID0gQGFtX191bnRhckAKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK2luZm9fVEVYSU5GT1MgPSBncnViLnRleGkgbXVsdGlib290LnRleGkKK2dydWJfVEVYSU5GT1MgPSBpbnRlcm5hbHMudGV4aQorRVhBTVBMRVMgPSBib290LlMga2VybmVsLmMgbXVsdGlib290LmgKK211bHRpYm9vdF9URVhJTkZPUyA9IGJvb3QuUy50ZXhpIGtlcm5lbC5jLnRleGkgbXVsdGlib290LmgudGV4aQorbWFuX01BTlMgPSBncnViLjggbWJjaGsuMSBncnViLWluc3RhbGwuOCBncnViLW1kNS1jcnlwdC44IGdydWItdGVybWluZm8uOAorSEVMUDJNQU4gPSBoZWxwMm1hbgorU1JDMlRFWEkgPSBzcmMydGV4aQorbm9pbnN0X1NDUklQVFMgPSAkKEhFTFAyTUFOKSAkKFNSQzJURVhJKQorQEJVSUxEX0VYQU1QTEVfS0VSTkVMX1RSVUVAa2VybmVsX1NPVVJDRVMgPSAkKEVYQU1QTEVTKQorQEJVSUxEX0VYQU1QTEVfS0VSTkVMX1RSVUVAa2VybmVsX0NGTEFHUyA9IC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgLU8gLWcgLVdhbGwgXAorQEJVSUxEX0VYQU1QTEVfS0VSTkVMX1RSVUVACS1pbWFjcm9zICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorCitAQlVJTERfRVhBTVBMRV9LRVJORUxfVFJVRUBrZXJuZWxfTERGTEFHUyA9IC1ub3N0ZGxpYiAtV2wsLU4gLVdsLC1UdGV4dCAtV2wsMTAwMDAwCitFWFRSQV9ESVNUID0gbWVudS5sc3QgJChtYW5fTUFOUykgJChub2luc3RfU0NSSVBUUykgXAorCSQoRVhBTVBMRVMpICQobXVsdGlib290X1RFWElORk9TKQorCitDTEVBTkZJTEVTID0gJChub2luc3RfUFJPR1JBTVMpCithbGw6IGFsbC1hbQorCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5TIC5jIC5kdmkgLmh0bWwgLmluZm8gLm8gLm9iaiAucGRmIC5wcyAudGV4aQorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoIFwKKwkJJiYgZXhpdCAwOyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSAgZG9jcy9NYWtlZmlsZSc7IFwKKwljZCAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZ251ICBkb2NzL01ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKK2NsZWFuLW5vaW5zdFBST0dSQU1TOgorCS10ZXN0IC16ICIkKG5vaW5zdF9QUk9HUkFNUykiIHx8IHJtIC1mICQobm9pbnN0X1BST0dSQU1TKQora2VybmVsJChFWEVFWFQpOiAkKGtlcm5lbF9PQkpFQ1RTKSAkKGtlcm5lbF9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBrZXJuZWwkKEVYRUVYVCkKKwkkKExJTkspICQoa2VybmVsX0xERkxBR1MpICQoa2VybmVsX09CSkVDVFMpICQoa2VybmVsX0xEQUREKSAkKExJQlMpCisKK21vc3RseWNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICouJChPQkpFWFQpCisKK2Rpc3RjbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLnRhYi5jCisKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9rZXJuZWwta2VybmVsLlBvQGFtX19xdW90ZUAKKworLlMubzoKKwkkKENDQVNDT01QSUxFKSAtYyAkPAorCisuUy5vYmo6CisJJChDQ0FTQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAorCisuYy5vOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgIiQoREVQRElSKS8kKi5UcG8iIC1jIC1vICRAICQ8OyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvJCouVHBvIiAiJChERVBESVIpLyQqLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpLyQqLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jICQ8CisKKy5jLm9iajoKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICIkKERFUERJUikvJCouVHBvIiAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvJCouVHBvIiAiJChERVBESVIpLyQqLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpLyQqLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKKwora2VybmVsLWtlcm5lbC5vOiBrZXJuZWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoa2VybmVsX0NGTEFHUykgJChDRkxBR1MpIC1NVCBrZXJuZWwta2VybmVsLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9rZXJuZWwta2VybmVsLlRwbyIgLWMgLW8ga2VybmVsLWtlcm5lbC5vIGB0ZXN0IC1mICdrZXJuZWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydga2VybmVsLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9rZXJuZWwta2VybmVsLlRwbyIgIiQoREVQRElSKS9rZXJuZWwta2VybmVsLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2tlcm5lbC1rZXJuZWwuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0na2VybmVsLmMnIG9iamVjdD0na2VybmVsLWtlcm5lbC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChrZXJuZWxfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8ga2VybmVsLWtlcm5lbC5vIGB0ZXN0IC1mICdrZXJuZWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydga2VybmVsLmMKKwora2VybmVsLWtlcm5lbC5vYmo6IGtlcm5lbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChrZXJuZWxfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGtlcm5lbC1rZXJuZWwub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikva2VybmVsLWtlcm5lbC5UcG8iIC1jIC1vIGtlcm5lbC1rZXJuZWwub2JqIGBpZiB0ZXN0IC1mICdrZXJuZWwuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdrZXJuZWwuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikva2VybmVsLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9rZXJuZWwta2VybmVsLlRwbyIgIiQoREVQRElSKS9rZXJuZWwta2VybmVsLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2tlcm5lbC1rZXJuZWwuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0na2VybmVsLmMnIG9iamVjdD0na2VybmVsLWtlcm5lbC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGtlcm5lbF9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBrZXJuZWwta2VybmVsLm9iaiBgaWYgdGVzdCAtZiAna2VybmVsLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAna2VybmVsLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2tlcm5lbC5jJzsgZmlgCisKKy50ZXhpLmluZm86CisJcmVzdG9yZT06ICYmIGJhY2t1cGRpcj0iJChhbV9fbGVhZGluZ19kb3QpYW0kJCQkIiAmJiBcCisJYW1fX2N3ZD1gcHdkYCAmJiBjZCAkKHNyY2RpcikgJiYgXAorCXJtIC1yZiAkJGJhY2t1cGRpciAmJiBta2RpciAkJGJhY2t1cGRpciAmJiBcCisJZm9yIGYgaW4gJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XSAkKEA6LmluZm89KS5pWzAtOV0gJChAOi5pbmZvPSkuaVswLTldWzAtOV07IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmOyB0aGVuIG12ICQkZiAkJGJhY2t1cGRpcjsgcmVzdG9yZT1tdjsgZWxzZSA6OyBmaTsgXAorCWRvbmU7IFwKKwljZCAiJCRhbV9fY3dkIjsgXAorCWlmICQoTUFLRUlORk8pICQoQU1fTUFLRUlORk9GTEFHUykgJChNQUtFSU5GT0ZMQUdTKSAtSSAkKHNyY2RpcikgXAorCSAtbyAkQCAkPDsgXAorCXRoZW4gXAorCSAgcmM9MDsgXAorCSAgY2QgJChzcmNkaXIpOyBcCisJZWxzZSBcCisJICByYz0kJD87IFwKKwkgIGNkICQoc3JjZGlyKSAmJiBcCisJICAkJHJlc3RvcmUgJCRiYWNrdXBkaXIvKiBgZWNobyAiLi8kQCIgfCBzZWQgJ3N8W14vXSokJHx8J2A7IFwKKwlmaTsgXAorCXJtIC1yZiAkJGJhY2t1cGRpcjsgZXhpdCAkJHJjCisKKy50ZXhpLmR2aToKKwlURVhJTlBVVFM9IiQoYW1fX1RFWElORk9fVEVYX0RJUikkKFBBVEhfU0VQQVJBVE9SKSQkVEVYSU5QVVRTIiBcCisJTUFLRUlORk89JyQoTUFLRUlORk8pICQoQU1fTUFLRUlORk9GTEFHUykgJChNQUtFSU5GT0ZMQUdTKSAtSSAkKHNyY2RpciknIFwKKwkkKFRFWEkyRFZJKSAkPAorCisudGV4aS5wZGY6CisJVEVYSU5QVVRTPSIkKGFtX19URVhJTkZPX1RFWF9ESVIpJChQQVRIX1NFUEFSQVRPUikkJFRFWElOUFVUUyIgXAorCU1BS0VJTkZPPSckKE1BS0VJTkZPKSAkKEFNX01BS0VJTkZPRkxBR1MpICQoTUFLRUlORk9GTEFHUykgLUkgJChzcmNkaXIpJyBcCisJJChURVhJMlBERikgJDwKKworLnRleGkuaHRtbDoKKwlybSAtcmYgJChAOi5odG1sPS5odHApCisJaWYgJChNQUtFSU5GT0hUTUwpICQoQU1fTUFLRUlORk9IVE1MRkxBR1MpICQoTUFLRUlORk9GTEFHUykgLUkgJChzcmNkaXIpIFwKKwkgLW8gJChAOi5odG1sPS5odHApICQ8OyBcCisJdGhlbiBcCisJICBybSAtcmYgJEA7IFwKKwkgIGlmIHRlc3QgISAtZCAkKEA6Lmh0bWw9Lmh0cCkgJiYgdGVzdCAtZCAkKEA6Lmh0bWw9KTsgdGhlbiBcCisJICAgIG12ICQoQDouaHRtbD0pICRAOyBlbHNlIG12ICQoQDouaHRtbD0uaHRwKSAkQDsgZmk7IFwKKwllbHNlIFwKKwkgIGlmIHRlc3QgISAtZCAkKEA6Lmh0bWw9Lmh0cCkgJiYgdGVzdCAtZCAkKEA6Lmh0bWw9KTsgdGhlbiBcCisJICAgIHJtIC1yZiAkKEA6Lmh0bWw9KTsgZWxzZSBybSAtUmYgJChAOi5odG1sPS5odHApICRAOyBmaTsgXAorCSAgZXhpdCAxOyBcCisJZmkKKyQoc3JjZGlyKS9ncnViLmluZm86IGdydWIudGV4aSAkKHNyY2RpcikvdmVyc2lvbi50ZXhpICQoZ3J1Yl9URVhJTkZPUykKK2dydWIuZHZpOiBncnViLnRleGkgJChzcmNkaXIpL3ZlcnNpb24udGV4aSAkKGdydWJfVEVYSU5GT1MpCitncnViLnBkZjogZ3J1Yi50ZXhpICQoc3JjZGlyKS92ZXJzaW9uLnRleGkgJChncnViX1RFWElORk9TKQorZ3J1Yi5odG1sOiBncnViLnRleGkgJChzcmNkaXIpL3ZlcnNpb24udGV4aSAkKGdydWJfVEVYSU5GT1MpCiskKHNyY2RpcikvdmVyc2lvbi50ZXhpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9zdGFtcC12dGkKKyQoc3JjZGlyKS9zdGFtcC12dGk6IGdydWIudGV4aSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZQorCUAoZGlyPS47IHRlc3QgLWYgLi9ncnViLnRleGkgfHwgZGlyPSQoc3JjZGlyKTsgXAorCXNldCBgJChTSEVMTCkgJChzcmNkaXIpL21kYXRlLXNoICQkZGlyL2dydWIudGV4aWA7IFwKKwllY2hvICJAc2V0IFVQREFURUQgJCQxICQkMiAkJDMiOyBcCisJZWNobyAiQHNldCBVUERBVEVELU1PTlRIICQkMiAkJDMiOyBcCisJZWNobyAiQHNldCBFRElUSU9OICQoVkVSU0lPTikiOyBcCisJZWNobyAiQHNldCBWRVJTSU9OICQoVkVSU0lPTikiKSA+IHZ0aS50bXAKKwlAY21wIC1zIHZ0aS50bXAgJChzcmNkaXIpL3ZlcnNpb24udGV4aSBcCisJICB8fCAoZWNobyAiVXBkYXRpbmcgJChzcmNkaXIpL3ZlcnNpb24udGV4aSI7IFwKKwkgICAgICBjcCB2dGkudG1wICQoc3JjZGlyKS92ZXJzaW9uLnRleGkpCisJLUBybSAtZiB2dGkudG1wCisJQGNwICQoc3JjZGlyKS92ZXJzaW9uLnRleGkgJEAKKworbW9zdGx5Y2xlYW4tdnRpOgorCS1ybSAtZiB2dGkudG1wCisKK21haW50YWluZXItY2xlYW4tdnRpOgorQE1BSU5UQUlORVJfTU9ERV9UUlVFQAktcm0gLWYgJChzcmNkaXIpL3N0YW1wLXZ0aSAkKHNyY2RpcikvdmVyc2lvbi50ZXhpCiskKHNyY2RpcikvbXVsdGlib290LmluZm86IG11bHRpYm9vdC50ZXhpICQobXVsdGlib290X1RFWElORk9TKQorbXVsdGlib290LmR2aTogbXVsdGlib290LnRleGkgJChtdWx0aWJvb3RfVEVYSU5GT1MpCittdWx0aWJvb3QucGRmOiBtdWx0aWJvb3QudGV4aSAkKG11bHRpYm9vdF9URVhJTkZPUykKK211bHRpYm9vdC5odG1sOiBtdWx0aWJvb3QudGV4aSAkKG11bHRpYm9vdF9URVhJTkZPUykKKy5kdmkucHM6CisJJChEVklQUykgLW8gJEAgJDwKKwordW5pbnN0YWxsLWluZm8tYW06CisJJChQUkVfVU5JTlNUQUxMKQorCUBpZiAoaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiAmJiBcCisJICAgICBpbnN0YWxsLWluZm8gLS12ZXJzaW9uIDI+JjEgfCBzZWQgMXEgfCBncmVwIC1pIC12IGRlYmlhbikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKwkgIGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKKwkgIGZvciBmaWxlIGluICQkbGlzdDsgZG8gXAorCSAgICByZWxmaWxlPWBlY2hvICIkJGZpbGUiIHwgc2VkICdzfF4uKi98fCdgOyBcCisJICAgIGVjaG8gIiBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0nJChERVNURElSKSQoaW5mb2RpciknIC0tcmVtb3ZlICckKERFU1RESVIpJChpbmZvZGlyKS8kJHJlbGZpbGUnIjsgXAorCSAgICBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0iJChERVNURElSKSQoaW5mb2RpcikiIC0tcmVtb3ZlICIkKERFU1RESVIpJChpbmZvZGlyKS8kJHJlbGZpbGUiOyBcCisJICBkb25lOyBcCisJZWxzZSA6OyBmaQorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKKwlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKKwkgIHJlbGZpbGU9YGVjaG8gIiQkZmlsZSIgfCBzZWQgJ3N8Xi4qL3x8J2A7IFwKKwkgIHJlbGZpbGVfaT1gZWNobyAiJCRyZWxmaWxlIiB8IHNlZCAnc3xcLmluZm8kJHx8O3N8JCR8Lml8J2A7IFwKKwkgIChpZiBjZCAiJChERVNURElSKSQoaW5mb2RpcikiOyB0aGVuIFwKKwkgICAgIGVjaG8gIiBybSAtZiAkJHJlbGZpbGUgJCRyZWxmaWxlLVswLTldICQkcmVsZmlsZS1bMC05XVswLTldICQkcmVsZmlsZV9pWzAtOV0gJCRyZWxmaWxlX2lbMC05XVswLTldKSI7IFwKKwkgICAgIHJtIC1mICQkcmVsZmlsZSAkJHJlbGZpbGUtWzAtOV0gJCRyZWxmaWxlLVswLTldWzAtOV0gJCRyZWxmaWxlX2lbMC05XSAkJHJlbGZpbGVfaVswLTldWzAtOV07IFwKKwkgICBlbHNlIDo7IGZpKTsgXAorCWRvbmUKKworZGlzdC1pbmZvOiAkKElORk9fREVQUykKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsgXAorCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKKwlmb3IgYmFzZSBpbiAkJGxpc3Q7IGRvIFwKKwkgIGNhc2UgJCRiYXNlIGluIFwKKwkgICAgJChzcmNkaXIpLyopIGJhc2U9YGVjaG8gIiQkYmFzZSIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKKwkgIGVzYWM7IFwKKwkgIGlmIHRlc3QgLWYgJCRiYXNlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGZvciBmaWxlIGluICQkZC8kJGJhc2UqOyBkbyBcCisJICAgIHJlbGZpbGU9YGV4cHIgIiQkZmlsZSIgOiAiJCRkL1woLipcKSJgOyBcCisJICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJHJlbGZpbGUgfHwgXAorCSAgICAgIGNwIC1wICQkZmlsZSAkKGRpc3RkaXIpLyQkcmVsZmlsZTsgXAorCSAgZG9uZTsgXAorCWRvbmUKKworbW9zdGx5Y2xlYW4tYW1pbmZvOgorCS1ybSAtcmYgZ3J1Yi5hdXggZ3J1Yi5jcCBncnViLmNwcyBncnViLmZuIGdydWIua3kgZ3J1Yi5sb2cgZ3J1Yi5wZyBncnViLnRtcCBcCisJICBncnViLnRvYyBncnViLnRwIGdydWIudnIgZ3J1Yi5kdmkgZ3J1Yi5wZGYgZ3J1Yi5wcyBncnViLmh0bWwgXAorCSAgbXVsdGlib290LmF1eCBtdWx0aWJvb3QuY3AgbXVsdGlib290LmNwcyBtdWx0aWJvb3QuZm4gXAorCSAgbXVsdGlib290Lmt5IG11bHRpYm9vdC5sb2cgbXVsdGlib290LnBnIG11bHRpYm9vdC50bXAgXAorCSAgbXVsdGlib290LnRvYyBtdWx0aWJvb3QudHAgbXVsdGlib290LnZyIG11bHRpYm9vdC5kdmkgXAorCSAgbXVsdGlib290LnBkZiBtdWx0aWJvb3QucHMgbXVsdGlib290Lmh0bWwKKworbWFpbnRhaW5lci1jbGVhbi1hbWluZm86CisJQGxpc3Q9JyQoSU5GT19ERVBTKSc7IGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgaV9pPWBlY2hvICIkJGkiIHwgc2VkICdzfFwuaW5mbyQkfHw7c3wkJHwuaXwnYDsgXAorCSAgZWNobyAiIHJtIC1mICQkaSAkJGktWzAtOV0gJCRpLVswLTldWzAtOV0gJCRpX2lbMC05XSAkJGlfaVswLTldWzAtOV0iOyBcCisJICBybSAtZiAkJGkgJCRpLVswLTldICQkaS1bMC05XVswLTldICQkaV9pWzAtOV0gJCRpX2lbMC05XVswLTldOyBcCisJZG9uZQoraW5zdGFsbC1tYW4xOiAkKG1hbjFfTUFOUykgJChtYW5fTUFOUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKG1hbjFkaXIpIiB8fCAkKG1rZGlyX3ApICIkKERFU1RESVIpJChtYW4xZGlyKSIKKwlAbGlzdD0nJChtYW4xX01BTlMpICQoZGlzdF9tYW4xX01BTlMpICQobm9kaXN0X21hbjFfTUFOUyknOyBcCisJbDI9JyQobWFuX01BTlMpICQoZGlzdF9tYW5fTUFOUykgJChub2Rpc3RfbWFuX01BTlMpJzsgXAorCWZvciBpIGluICQkbDI7IGRvIFwKKwkgIGNhc2UgIiQkaSIgaW4gXAorCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAkKHNyY2RpcikvJCRpOyB0aGVuIGZpbGU9JChzcmNkaXIpLyQkaTsgXAorCSAgZWxzZSBmaWxlPSQkaTsgZmk7IFwKKwkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAorCSAgY2FzZSAiJCRleHQiIGluIFwKKwkgICAgMSopIDs7IFwKKwkgICAgKikgZXh0PScxJyA7OyBcCisJICBlc2FjOyBcCisJICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKKwkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkIC1lICdzL14uKlwvLy8nYDsgXAorCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgJyQodHJhbnNmb3JtKSdgLiQkZXh0OyBcCisJICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICckJGZpbGUnICckKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3QnIjsgXAorCSAgJChJTlNUQUxMX0RBVEEpICIkJGZpbGUiICIkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3QiOyBcCisJZG9uZQordW5pbnN0YWxsLW1hbjE6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChtYW4xX01BTlMpICQoZGlzdF9tYW4xX01BTlMpICQobm9kaXN0X21hbjFfTUFOUyknOyBcCisJbDI9JyQobWFuX01BTlMpICQoZGlzdF9tYW5fTUFOUykgJChub2Rpc3RfbWFuX01BTlMpJzsgXAorCWZvciBpIGluICQkbDI7IGRvIFwKKwkgIGNhc2UgIiQkaSIgaW4gXAorCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgZXh0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9eLipcXC4vLydgOyBcCisJICBjYXNlICIkJGV4dCIgaW4gXAorCSAgICAxKikgOzsgXAorCSAgICAqKSBleHQ9JzEnIDs7IFwKKwkgIGVzYWM7IFwKKwkgIGluc3Q9YGVjaG8gJCRpIHwgc2VkIC1lICdzL1xcLlswLTlhLXpdKiQkLy8nYDsgXAorCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgLWUgJ3MvXi4qXC8vLydgOyBcCisJICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2AuJCRleHQ7IFwKKwkgIGVjaG8gIiBybSAtZiAnJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0JyI7IFwKKwkgIHJtIC1mICIkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3QiOyBcCisJZG9uZQoraW5zdGFsbC1tYW44OiAkKG1hbjhfTUFOUykgJChtYW5fTUFOUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKG1hbjhkaXIpIiB8fCAkKG1rZGlyX3ApICIkKERFU1RESVIpJChtYW44ZGlyKSIKKwlAbGlzdD0nJChtYW44X01BTlMpICQoZGlzdF9tYW44X01BTlMpICQobm9kaXN0X21hbjhfTUFOUyknOyBcCisJbDI9JyQobWFuX01BTlMpICQoZGlzdF9tYW5fTUFOUykgJChub2Rpc3RfbWFuX01BTlMpJzsgXAorCWZvciBpIGluICQkbDI7IGRvIFwKKwkgIGNhc2UgIiQkaSIgaW4gXAorCSAgICAqLjgqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAtZiAkKHNyY2RpcikvJCRpOyB0aGVuIGZpbGU9JChzcmNkaXIpLyQkaTsgXAorCSAgZWxzZSBmaWxlPSQkaTsgZmk7IFwKKwkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAorCSAgY2FzZSAiJCRleHQiIGluIFwKKwkgICAgOCopIDs7IFwKKwkgICAgKikgZXh0PSc4JyA7OyBcCisJICBlc2FjOyBcCisJICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKKwkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkIC1lICdzL14uKlwvLy8nYDsgXAorCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgJyQodHJhbnNmb3JtKSdgLiQkZXh0OyBcCisJICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICckJGZpbGUnICckKERFU1RESVIpJChtYW44ZGlyKS8kJGluc3QnIjsgXAorCSAgJChJTlNUQUxMX0RBVEEpICIkJGZpbGUiICIkKERFU1RESVIpJChtYW44ZGlyKS8kJGluc3QiOyBcCisJZG9uZQordW5pbnN0YWxsLW1hbjg6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChtYW44X01BTlMpICQoZGlzdF9tYW44X01BTlMpICQobm9kaXN0X21hbjhfTUFOUyknOyBcCisJbDI9JyQobWFuX01BTlMpICQoZGlzdF9tYW5fTUFOUykgJChub2Rpc3RfbWFuX01BTlMpJzsgXAorCWZvciBpIGluICQkbDI7IGRvIFwKKwkgIGNhc2UgIiQkaSIgaW4gXAorCSAgICAqLjgqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgZXh0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9eLipcXC4vLydgOyBcCisJICBjYXNlICIkJGV4dCIgaW4gXAorCSAgICA4KikgOzsgXAorCSAgICAqKSBleHQ9JzgnIDs7IFwKKwkgIGVzYWM7IFwKKwkgIGluc3Q9YGVjaG8gJCRpIHwgc2VkIC1lICdzL1xcLlswLTlhLXpdKiQkLy8nYDsgXAorCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgLWUgJ3MvXi4qXC8vLydgOyBcCisJICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2AuJCRleHQ7IFwKKwkgIGVjaG8gIiBybSAtZiAnJChERVNURElSKSQobWFuOGRpcikvJCRpbnN0JyI7IFwKKwkgIHJtIC1mICIkKERFU1RESVIpJChtYW44ZGlyKS8kJGluc3QiOyBcCisJZG9uZQorCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiBUQUdTCisKK1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgJCR0YWdzICQkdW5pcXVlOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIiBcCisJICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCisJICAgICAkJHRhZ3MgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmIGNkICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAkJGhlcmUKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IGZvciBmaWxlIGluICQkbGlzdDsgZG8gXAorCSAgY2FzZSAkJGZpbGUgaW4gXAorCSAgICAkKHNyY2RpcikvKikgZmlsZT1gZWNobyAiJCRmaWxlIiB8IHNlZCAic3xeJCRzcmNkaXJzdHJpcC98fCJgOzsgXAorCSAgICAkKHRvcF9zcmNkaXIpLyopIGZpbGU9YGVjaG8gIiQkZmlsZSIgfCBzZWQgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98ImA7OyBcCisJICBlc2FjOyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBkaXI9YGVjaG8gIiQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICBpZiB0ZXN0ICIkJGRpciIgIT0gIiQkZmlsZSIgJiYgdGVzdCAiJCRkaXIiICE9ICIuIjsgdGhlbiBcCisJICAgIGRpcj0iLyQkZGlyIjsgXAorCSAgICAkKG1rZGlyX3ApICIkKGRpc3RkaXIpJCRkaXIiOyBcCisJICBlbHNlIFwKKwkgICAgZGlyPScnOyBcCisJICBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLXBSICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKKwkgIHRvcF9kaXN0ZGlyPSIkKHRvcF9kaXN0ZGlyKSIgZGlzdGRpcj0iJChkaXN0ZGlyKSIgXAorCSAgZGlzdC1pbmZvCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUgJChJTkZPX0RFUFMpICQoUFJPR1JBTVMpICQoU0NSSVBUUykgJChNQU5TKQoraW5zdGFsbGRpcnM6CisJZm9yIGRpciBpbiAiJChERVNURElSKSQoaW5mb2RpcikiICIkKERFU1RESVIpJChtYW4xZGlyKSIgIiQoREVTVERJUikkKG1hbjhkaXIpIjsgZG8gXAorCSAgdGVzdCAteiAiJCRkaXIiIHx8ICQobWtkaXJfcCkgIiQkZGlyIjsgXAorCWRvbmUKK2luc3RhbGw6IGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1ub2luc3RQUk9HUkFNUyBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbTogJChEVklTKQorCitodG1sOiBodG1sLWFtCisKK2h0bWwtYW06ICQoSFRNTFMpCisKK2luZm86IGluZm8tYW0KKworaW5mby1hbTogJChJTkZPX0RFUFMpCisKK2luc3RhbGwtZGF0YS1hbTogaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuCisKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1pbmZvLWFtOiAkKElORk9fREVQUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKGluZm9kaXIpIiB8fCAkKG1rZGlyX3ApICIkKERFU1RESVIpJChpbmZvZGlyKSIKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsgXAorCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKKwlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKKwkgIGNhc2UgJCRmaWxlIGluIFwKKwkgICAgJChzcmNkaXIpLyopIGZpbGU9YGVjaG8gIiQkZmlsZSIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKKwkgIGVzYWM7IFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGZpbGVfaT1gZWNobyAiJCRmaWxlIiB8IHNlZCAnc3xcLmluZm8kJHx8O3N8JCR8Lml8J2A7IFwKKwkgIGZvciBpZmlsZSBpbiAkJGQvJCRmaWxlICQkZC8kJGZpbGUtWzAtOV0gJCRkLyQkZmlsZS1bMC05XVswLTldIFwKKyAgICAgICAgICAgICAgICAgICAgICAgJCRkLyQkZmlsZV9pWzAtOV0gJCRkLyQkZmlsZV9pWzAtOV1bMC05XSA7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAkJGlmaWxlOyB0aGVuIFwKKwkgICAgICByZWxmaWxlPWBlY2hvICIkJGlmaWxlIiB8IHNlZCAnc3xeLiovfHwnYDsgXAorCSAgICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJyQkaWZpbGUnICckKERFU1RESVIpJChpbmZvZGlyKS8kJHJlbGZpbGUnIjsgXAorCSAgICAgICQoSU5TVEFMTF9EQVRBKSAiJCRpZmlsZSIgIiQoREVTVERJUikkKGluZm9kaXIpLyQkcmVsZmlsZSI7IFwKKwkgICAgZWxzZSA6IDsgZmk7IFwKKwkgIGRvbmU7IFwKKwlkb25lCisJQCQoUE9TVF9JTlNUQUxMKQorCUBpZiAoaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiAmJiBcCisJICAgICBpbnN0YWxsLWluZm8gLS12ZXJzaW9uIDI+JjEgfCBzZWQgMXEgfCBncmVwIC1pIC12IGRlYmlhbikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKwkgIGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKKwkgIGZvciBmaWxlIGluICQkbGlzdDsgZG8gXAorCSAgICByZWxmaWxlPWBlY2hvICIkJGZpbGUiIHwgc2VkICdzfF4uKi98fCdgOyBcCisJICAgIGVjaG8gIiBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0nJChERVNURElSKSQoaW5mb2RpciknICckKERFU1RESVIpJChpbmZvZGlyKS8kJHJlbGZpbGUnIjtcCisJICAgIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSIkKERFU1RESVIpJChpbmZvZGlyKSIgIiQoREVTVERJUikkKGluZm9kaXIpLyQkcmVsZmlsZSIgfHwgOjtcCisJICBkb25lOyBcCisJZWxzZSA6IDsgZmkKK2luc3RhbGwtbWFuOiBpbnN0YWxsLW1hbjEgaW5zdGFsbC1tYW44CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWFtaW5mbyBcCisJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1haW50YWluZXItY2xlYW4tdnRpCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tYW1pbmZvIG1vc3RseWNsZWFuLWNvbXBpbGUgXAorCW1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tdnRpCisKK3BkZjogcGRmLWFtCisKK3BkZi1hbTogJChQREZTKQorCitwczogcHMtYW0KKworcHMtYW06ICQoUFNTKQorCit1bmluc3RhbGwtYW06IHVuaW5zdGFsbC1pbmZvLWFtIHVuaW5zdGFsbC1tYW4KKwordW5pbnN0YWxsLW1hbjogdW5pbnN0YWxsLW1hbjEgdW5pbnN0YWxsLW1hbjgKKworLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgXAorCWNsZWFuLW5vaW5zdFBST0dSQU1TIGN0YWdzIGRpc3QtaW5mbyBkaXN0Y2xlYW4gXAorCWRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIFwKKwlkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gXAorCWluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBcCisJaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLW1hbjEgXAorCWluc3RhbGwtbWFuOCBpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gXAorCWluc3RhbGxkaXJzIG1haW50YWluZXItY2xlYW4gbWFpbnRhaW5lci1jbGVhbi1hbWluZm8gXAorCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtYWludGFpbmVyLWNsZWFuLXZ0aSBtb3N0bHljbGVhbiBcCisJbW9zdGx5Y2xlYW4tYW1pbmZvIG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCisJbW9zdGx5Y2xlYW4tdnRpIHBkZiBwZGYtYW0gcHMgcHMtYW0gdGFncyB1bmluc3RhbGwgXAorCXVuaW5zdGFsbC1hbSB1bmluc3RhbGwtaW5mby1hbSB1bmluc3RhbGwtbWFuIHVuaW5zdGFsbC1tYW4xIFwKKwl1bmluc3RhbGwtbWFuOAorCisKK0BCVUlMRF9FWEFNUExFX0tFUk5FTF9UUlVFQGJvb3QubzogbXVsdGlib290LmgKKworIyBDYW5jZWwgdGhlIHJ1bGUgJS50ZXhpIC0+ICUuIFRoaXMgcnVsZSBtYXkgY29uZnVzZSBtYWtlIHRvIGRldGVybWluZQorIyB0aGUgZGVwZW5kZWNpZXMuCisudGV4aToKKworJS5jLnRleGk6ICUuYyAkKHNyY2RpcikvJChTUkMyVEVYSSkKKwkkKFNIRUxMKSAkKHNyY2RpcikvJChTUkMyVEVYSSkgJChzcmNkaXIpICQ8ICRACisKKyUuaC50ZXhpOiAlLmggJChzcmNkaXIpLyQoU1JDMlRFWEkpCisJJChTSEVMTCkgJChzcmNkaXIpLyQoU1JDMlRFWEkpICQoc3JjZGlyKSAkPCAkQAorCislLlMudGV4aTogJS5TICQoc3JjZGlyKS8kKFNSQzJURVhJKQorCSQoU0hFTEwpICQoc3JjZGlyKS8kKFNSQzJURVhJKSAkKHNyY2RpcikgJDwgJEAKKworQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9ncnViLjg6IC4uL2dydWIvZ3J1YiAkKHNyY2RpcikvJChIRUxQMk1BTikKK0BNQUlOVEFJTkVSX01PREVfVFJVRUAJJChQRVJMKSAkKHNyY2RpcikvJChIRUxQMk1BTikgLS1uYW1lPSJ0aGUgZ3J1YiBzaGVsbCIgXAorQE1BSU5UQUlORVJfTU9ERV9UUlVFQAkJLS1zZWN0aW9uPTggLS1vdXRwdXQ9JEAgJDwKKworQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9ncnViLWluc3RhbGwuODogLi4vdXRpbC9ncnViLWluc3RhbGwgJChzcmNkaXIpLyQoSEVMUDJNQU4pCitATUFJTlRBSU5FUl9NT0RFX1RSVUVACWNobW9kIDc1NSAkPAorQE1BSU5UQUlORVJfTU9ERV9UUlVFQAkkKFBFUkwpICQoc3JjZGlyKS8kKEhFTFAyTUFOKSAtLW5hbWU9Imluc3RhbGwgR1JVQiBvbiB5b3VyIGRyaXZlIiBcCitATUFJTlRBSU5FUl9NT0RFX1RSVUVACQktLXNlY3Rpb249OCAtLW91dHB1dD0kQCAkPAorCitATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL21iY2hrLjE6IC4uL3V0aWwvbWJjaGsgJChzcmNkaXIpLyQoSEVMUDJNQU4pCitATUFJTlRBSU5FUl9NT0RFX1RSVUVACSQoUEVSTCkgJChzcmNkaXIpLyQoSEVMUDJNQU4pIFwKK0BNQUlOVEFJTkVSX01PREVfVFJVRUAJCS0tbmFtZT0iY2hlY2sgdGhlIGZvcm1hdCBvZiBhIE11bHRpYm9vdCBrZXJuZWwiIFwKK0BNQUlOVEFJTkVSX01PREVfVFJVRUAJCS0tc2VjdGlvbj0xIC0tb3V0cHV0PSRAICQ8CisKK0BNQUlOVEFJTkVSX01PREVfVFJVRUAkKHNyY2RpcikvZ3J1Yi1tZDUtY3J5cHQuODogLi4vdXRpbC9ncnViLW1kNS1jcnlwdCAkKHNyY2RpcikvJChIRUxQMk1BTikKK0BNQUlOVEFJTkVSX01PREVfVFJVRUAJY2htb2QgNzU1ICQ8CitATUFJTlRBSU5FUl9NT0RFX1RSVUVACSQoUEVSTCkgJChzcmNkaXIpLyQoSEVMUDJNQU4pIFwKK0BNQUlOVEFJTkVSX01PREVfVFJVRUAJCS0tbmFtZT0iRW5jcnlwdCBhIHBhc3N3b3JkIGluIE1ENSBmb3JtYXQiIFwKK0BNQUlOVEFJTkVSX01PREVfVFJVRUAJCS0tc2VjdGlvbj04IC0tb3V0cHV0PSRAICQ8CisKK0BNQUlOVEFJTkVSX01PREVfVFJVRUAkKHNyY2RpcikvZ3J1Yi10ZXJtaW5mby44OiAuLi91dGlsL2dydWItdGVybWluZm8gJChzcmNkaXIpLyQoSEVMUDJNQU4pCitATUFJTlRBSU5FUl9NT0RFX1RSVUVACWNobW9kIDc1NSAkPAorQE1BSU5UQUlORVJfTU9ERV9UUlVFQAkkKFBFUkwpICQoc3JjZGlyKS8kKEhFTFAyTUFOKSBcCitATUFJTlRBSU5FUl9NT0RFX1RSVUVACQktLW5hbWU9IkdlbmVyYXRlIGEgdGVybWluZm8gY29tbWFuZCBmcm9tIGEgdGVybWluZm8gbmFtZSIgXAorQE1BSU5UQUlORVJfTU9ERV9UUlVFQAkJLS1zZWN0aW9uPTggLS1vdXRwdXQ9JEAgJDwKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2RvY3MvYm9vdC5TIGIvZG9jcy9ib290LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBlMTY3ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvYm9vdC5TCkBAIC0wLDAgKzEsODAgQEAKKy8qIGJvb3QuUyAtIGJvb3RzdHJhcCB0aGUga2VybmVsICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDEgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIAorICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLworCisjZGVmaW5lIEFTTQkxCisjaW5jbHVkZSA8bXVsdGlib290Lmg+CisJCisJLnRleHQKKworCS5nbG9ibAlzdGFydCwgX3N0YXJ0CitzdGFydDoKK19zdGFydDoKKwlqbXAJbXVsdGlib290X2VudHJ5CisKKwkvKiBBbGlnbiAzMiBiaXRzIGJvdW5kYXJ5LiAgKi8KKwkuYWxpZ24JNAorCQorCS8qIE11bHRpYm9vdCBoZWFkZXIuICAqLworbXVsdGlib290X2hlYWRlcjoKKwkvKiBtYWdpYyAqLworCS5sb25nCU1VTFRJQk9PVF9IRUFERVJfTUFHSUMKKwkvKiBmbGFncyAqLworCS5sb25nCU1VTFRJQk9PVF9IRUFERVJfRkxBR1MKKwkvKiBjaGVja3N1bSAqLworCS5sb25nCS0oTVVMVElCT09UX0hFQURFUl9NQUdJQyArIE1VTFRJQk9PVF9IRUFERVJfRkxBR1MpCisjaWZuZGVmIF9fRUxGX18KKwkvKiBoZWFkZXJfYWRkciAqLworCS5sb25nCW11bHRpYm9vdF9oZWFkZXIKKwkvKiBsb2FkX2FkZHIgKi8KKwkubG9uZwlfc3RhcnQKKwkvKiBsb2FkX2VuZF9hZGRyICovCisJLmxvbmcJX2VkYXRhCisJLyogYnNzX2VuZF9hZGRyICovCisJLmxvbmcJX2VuZAorCS8qIGVudHJ5X2FkZHIgKi8KKwkubG9uZwltdWx0aWJvb3RfZW50cnkKKyNlbmRpZiAvKiAhIF9fRUxGX18gKi8KKworbXVsdGlib290X2VudHJ5OgorCS8qIEluaXRpYWxpemUgdGhlIHN0YWNrIHBvaW50ZXIuICAqLworCW1vdmwJJChzdGFjayArIFNUQUNLX1NJWkUpLCAlZXNwCisKKwkvKiBSZXNldCBFRkxBR1MuICAqLworCXB1c2hsCSQwCisJcG9wZgorCisJLyogUHVzaCB0aGUgcG9pbnRlciB0byB0aGUgTXVsdGlib290IGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gICovCisJcHVzaGwJJWVieAorCS8qIFB1c2ggdGhlIG1hZ2ljIHZhbHVlLiAgKi8KKwlwdXNobAklZWF4CisKKwkvKiBOb3cgZW50ZXIgdGhlIEMgbWFpbiBmdW5jdGlvbi4uLiAgKi8KKwljYWxsCUVYVF9DKGNtYWluKQorCisJLyogSGFsdC4gICovCisJcHVzaGwJJGhhbHRfbWVzc2FnZQorCWNhbGwJRVhUX0MocHJpbnRmKQorCQorbG9vcDoJaGx0CisJam1wCWxvb3AKKworaGFsdF9tZXNzYWdlOgorCS5hc2NpegkiSGFsdGVkLiIKKworCS8qIE91ciBzdGFjayBhcmVhLiAgKi8KKwkuY29tbQlzdGFjaywgU1RBQ0tfU0laRQorCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvYm9vdC5TLnRleGkgYi9kb2NzL2Jvb3QuUy50ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmY2E5ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2Jvb3QuUy50ZXhpCkBAIC0wLDAgKzEsODAgQEAKKy8qIEBye2Jvb3QuUyAtIGJvb3RzdHJhcCB0aGUga2VybmVsfSAqLworLyogQHJ7Q29weXJpZ2h0IChDKSAxOTk5LCAyMDAxICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLn0gKi8KKworI2RlZmluZSBBU00gICAgIDEKKyNpbmNsdWRlIDxtdWx0aWJvb3QuaD4KKyAgICAgICAgCisgICAgICAgIC50ZXh0CisKKyAgICAgICAgLmdsb2JsICBzdGFydCwgX3N0YXJ0CitzdGFydDoKK19zdGFydDoKKyAgICAgICAgam1wICAgICBtdWx0aWJvb3RfZW50cnkKKworICAgICAgICAvKiBAcntBbGlnbiAzMiBiaXRzIGJvdW5kYXJ5Ln0gKi8KKyAgICAgICAgLmFsaWduICA0CisgICAgICAgIAorICAgICAgICAvKiBAcntNdWx0aWJvb3QgaGVhZGVyLn0gKi8KK211bHRpYm9vdF9oZWFkZXI6CisgICAgICAgIC8qIEBye21hZ2ljfSAqLworICAgICAgICAubG9uZyAgIE1VTFRJQk9PVF9IRUFERVJfTUFHSUMKKyAgICAgICAgLyogQHJ7ZmxhZ3N9ICovCisgICAgICAgIC5sb25nICAgTVVMVElCT09UX0hFQURFUl9GTEFHUworICAgICAgICAvKiBAcntjaGVja3N1bX0gKi8KKyAgICAgICAgLmxvbmcgICAtKE1VTFRJQk9PVF9IRUFERVJfTUFHSUMgKyBNVUxUSUJPT1RfSEVBREVSX0ZMQUdTKQorI2lmbmRlZiBfX0VMRl9fCisgICAgICAgIC8qIEBye2hlYWRlcl9hZGRyfSAqLworICAgICAgICAubG9uZyAgIG11bHRpYm9vdF9oZWFkZXIKKyAgICAgICAgLyogQHJ7bG9hZF9hZGRyfSAqLworICAgICAgICAubG9uZyAgIF9zdGFydAorICAgICAgICAvKiBAcntsb2FkX2VuZF9hZGRyfSAqLworICAgICAgICAubG9uZyAgIF9lZGF0YQorICAgICAgICAvKiBAcntic3NfZW5kX2FkZHJ9ICovCisgICAgICAgIC5sb25nICAgX2VuZAorICAgICAgICAvKiBAcntlbnRyeV9hZGRyfSAqLworICAgICAgICAubG9uZyAgIG11bHRpYm9vdF9lbnRyeQorI2VuZGlmIC8qIEByeyEgX19FTEZfX30gKi8KKworbXVsdGlib290X2VudHJ5OgorICAgICAgICAvKiBAcntJbml0aWFsaXplIHRoZSBzdGFjayBwb2ludGVyLn0gKi8KKyAgICAgICAgbW92bCAgICAkKHN0YWNrICsgU1RBQ0tfU0laRSksICVlc3AKKworICAgICAgICAvKiBAcntSZXNldCBFRkxBR1MufSAqLworICAgICAgICBwdXNobCAgICQwCisgICAgICAgIHBvcGYKKworICAgICAgICAvKiBAcntQdXNoIHRoZSBwb2ludGVyIHRvIHRoZSBNdWx0aWJvb3QgaW5mb3JtYXRpb24gc3RydWN0dXJlLn0gKi8KKyAgICAgICAgcHVzaGwgICAlZWJ4CisgICAgICAgIC8qIEBye1B1c2ggdGhlIG1hZ2ljIHZhbHVlLn0gKi8KKyAgICAgICAgcHVzaGwgICAlZWF4CisKKyAgICAgICAgLyogQHJ7Tm93IGVudGVyIHRoZSBDIG1haW4gZnVuY3Rpb24uLi59ICovCisgICAgICAgIGNhbGwgICAgRVhUX0MoY21haW4pCisKKyAgICAgICAgLyogQHJ7SGFsdC59ICovCisgICAgICAgIHB1c2hsICAgJGhhbHRfbWVzc2FnZQorICAgICAgICBjYWxsICAgIEVYVF9DKHByaW50ZikKKyAgICAgICAgCitsb29wOiAgIGhsdAorICAgICAgICBqbXAgICAgIGxvb3AKKworaGFsdF9tZXNzYWdlOgorICAgICAgICAuYXNjaXogICJIYWx0ZWQuIgorCisgICAgICAgIC8qIEBye091ciBzdGFjayBhcmVhLn0gKi8KKyAgICAgICAgLmNvbW0gICBzdGFjaywgU1RBQ0tfU0laRQorICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL2dydWItaW5zdGFsbC44IGIvZG9jcy9ncnViLWluc3RhbGwuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzU4OGEzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9ncnViLWluc3RhbGwuOApAQCAtMCwwICsxLDUyIEBACisuXCIgRE8gTk9UIE1PRElGWSBUSElTIEZJTEUhICBJdCB3YXMgZ2VuZXJhdGVkIGJ5IGhlbHAybWFuIDEuMjMuCisuVEggR1JVQi1JTlNUQUxMICI4IiAiTWF5IDIwMDUiICJncnViLWluc3RhbGwgKEdOVSBHUlVCIDAuOTcpIiBGU0YKKy5TSCBOQU1FCitncnViLWluc3RhbGwgXC0gaW5zdGFsbCBHUlVCIG9uIHlvdXIgZHJpdmUKKy5TSCBTWU5PUFNJUworLkIgZ3J1Yi1pbnN0YWxsCitbXGZJT1BUSU9OXGZSXSBcZklpbnN0YWxsX2RldmljZVxmUgorLlNIIERFU0NSSVBUSU9OCitJbnN0YWxsIEdSVUIgb24geW91ciBkcml2ZS4KKy5UUAorXGZCXC1oXGZSLCBcZkJcLVwtaGVscFxmUgorcHJpbnQgdGhpcyBtZXNzYWdlIGFuZCBleGl0CisuVFAKK1xmQlwtdlxmUiwgXGZCXC1cLXZlcnNpb25cZlIKK3ByaW50IHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisuVFAKK1xmQlwtXC1yb290XC1kaXJlY3RvcnlcZlI9XGZJRElSXGZSCitpbnN0YWxsIEdSVUIgaW1hZ2VzIHVuZGVyIHRoZSBkaXJlY3RvcnkgRElSCitpbnN0ZWFkIG9mIHRoZSByb290IGRpcmVjdG9yeQorLlRQCitcZkJcLVwtZ3J1Ylwtc2hlbGxcZlI9XGZJRklMRVxmUgordXNlIEZJTEUgYXMgdGhlIGdydWIgc2hlbGwKKy5UUAorXGZCXC1cLW5vXC1mbG9wcHlcZlIKK2RvIG5vdCBwcm9iZSBhbnkgZmxvcHB5IGRyaXZlCisuVFAKK1xmQlwtXC1mb3JjZVwtbGJhXGZSCitmb3JjZSBHUlVCIHRvIHVzZSBMQkEgbW9kZSBldmVuIGZvciBhIGJ1Z2d5CitCSU9TCisuVFAKK1xmQlwtXC1yZWNoZWNrXGZSCitwcm9iZSBhIGRldmljZSBtYXAgZXZlbiBpZiBpdCBhbHJlYWR5IGV4aXN0cworLlBQCitJTlNUQUxMX0RFVklDRSBjYW4gYmUgYSBHUlVCIGRldmljZSBuYW1lIG9yIGEgc3lzdGVtIGRldmljZSBmaWxlbmFtZS4KKy5QUAorZ3J1Yi1pbnN0YWxsIGNvcGllcyBHUlVCIGltYWdlcyBpbnRvIHRoZSBESVIvYm9vdCBkaXJlY3Rvcnkgc3BlY2ZpZWQgYnkKK1xmQlwtXC1yb290XC1kaXJlY3RvcnlcZlIsIGFuZCB1c2VzIHRoZSBncnViIHNoZWxsIHRvIGluc3RhbGwgZ3J1YiBpbnRvIHRoZSBib290CitzZWN0b3IuCisuU0ggIlJFUE9SVElORyBCVUdTIgorUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1ncnViQGdudS5vcmc+LgorLlNIICJTRUUgQUxTTyIKK1RoZSBmdWxsIGRvY3VtZW50YXRpb24gZm9yCisuQiBncnViLWluc3RhbGwKK2lzIG1haW50YWluZWQgYXMgYSBUZXhpbmZvIG1hbnVhbC4gIElmIHRoZQorLkIgaW5mbworYW5kCisuQiBncnViLWluc3RhbGwKK3Byb2dyYW1zIGFyZSBwcm9wZXJseSBpbnN0YWxsZWQgYXQgeW91ciBzaXRlLCB0aGUgY29tbWFuZAorLklQCisuQiBpbmZvIGdydWItaW5zdGFsbAorLlBQCitzaG91bGQgZ2l2ZSB5b3UgYWNjZXNzIHRvIHRoZSBjb21wbGV0ZSBtYW51YWwuCmRpZmYgLS1naXQgYS9kb2NzL2dydWItbWQ1LWNyeXB0LjggYi9kb2NzL2dydWItbWQ1LWNyeXB0LjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdkYjUzMQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZ3J1Yi1tZDUtY3J5cHQuOApAQCAtMCwwICsxLDMyIEBACisuXCIgRE8gTk9UIE1PRElGWSBUSElTIEZJTEUhICBJdCB3YXMgZ2VuZXJhdGVkIGJ5IGhlbHAybWFuIDEuMjMuCisuVEggR1JVQi1NRDUtQ1JZUFQgIjgiICJNYXkgMjAwNSIgImdydWItbWQ1LWNyeXB0IChHTlUgR1JVQiApIiBGU0YKKy5TSCBOQU1FCitncnViLW1kNS1jcnlwdCBcLSBFbmNyeXB0IGEgcGFzc3dvcmQgaW4gTUQ1IGZvcm1hdAorLlNIIFNZTk9QU0lTCisuQiBncnViLW1kNS1jcnlwdAorW1xmSU9QVElPTlxmUl0KKy5TSCBERVNDUklQVElPTgorRW5jcnlwdCBhIHBhc3N3b3JkIGluIE1ENSBmb3JtYXQuCisuVFAKK1xmQlwtaFxmUiwgXGZCXC1cLWhlbHBcZlIKK3ByaW50IHRoaXMgbWVzc2FnZSBhbmQgZXhpdAorLlRQCitcZkJcLXZcZlIsIFxmQlwtXC12ZXJzaW9uXGZSCitwcmludCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorLlRQCitcZkJcLVwtZ3J1Ylwtc2hlbGxcZlI9XGZJRklMRVxmUgordXNlIEZJTEUgYXMgdGhlIGdydWIgc2hlbGwKKy5TSCAiUkVQT1JUSU5HIEJVR1MiCitSZXBvcnQgYnVncyB0byA8YnVnLWdydWJAZ251Lm9yZz4uCisuU0ggIlNFRSBBTFNPIgorVGhlIGZ1bGwgZG9jdW1lbnRhdGlvbiBmb3IKKy5CIGdydWItbWQ1LWNyeXB0CitpcyBtYWludGFpbmVkIGFzIGEgVGV4aW5mbyBtYW51YWwuICBJZiB0aGUKKy5CIGluZm8KK2FuZAorLkIgZ3J1Yi1tZDUtY3J5cHQKK3Byb2dyYW1zIGFyZSBwcm9wZXJseSBpbnN0YWxsZWQgYXQgeW91ciBzaXRlLCB0aGUgY29tbWFuZAorLklQCisuQiBpbmZvIGdydWItbWQ1LWNyeXB0CisuUFAKK3Nob3VsZCBnaXZlIHlvdSBhY2Nlc3MgdG8gdGhlIGNvbXBsZXRlIG1hbnVhbC4KZGlmZiAtLWdpdCBhL2RvY3MvZ3J1Yi10ZXJtaW5mby44IGIvZG9jcy9ncnViLXRlcm1pbmZvLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM5ZjE5YwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZ3J1Yi10ZXJtaW5mby44CkBAIC0wLDAgKzEsMjkgQEAKKy5cIiBETyBOT1QgTU9ESUZZIFRISVMgRklMRSEgIEl0IHdhcyBnZW5lcmF0ZWQgYnkgaGVscDJtYW4gMS4yMy4KKy5USCBHUlVCLVRFUk1JTkZPICI4IiAiTWF5IDIwMDUiICJncnViLXRlcm1pbmZvIChHTlUgR1JVQiAwLjk3KSIgRlNGCisuU0ggTkFNRQorZ3J1Yi10ZXJtaW5mbyBcLSBHZW5lcmF0ZSBhIHRlcm1pbmZvIGNvbW1hbmQgZnJvbSBhIHRlcm1pbmZvIG5hbWUKKy5TSCBTWU5PUFNJUworLkIgZ3J1Yi10ZXJtaW5mbworXGZJVEVSTU5BTUVcZlIKKy5TSCBERVNDUklQVElPTgorR2VuZXJhdGUgYSB0ZXJtaW5mbyBjb21tYW5kIGZyb20gYSB0ZXJtaW5mbyBuYW1lLgorLlRQCitcZkJcLWhcZlIsIFxmQlwtXC1oZWxwXGZSCitwcmludCB0aGlzIG1lc3NhZ2UgYW5kIGV4aXQKKy5UUAorXGZCXC12XGZSLCBcZkJcLVwtdmVyc2lvblxmUgorcHJpbnQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKy5TSCAiUkVQT1JUSU5HIEJVR1MiCitSZXBvcnQgYnVncyB0byA8YnVnLWdydWJAZ251Lm9yZz4uCisuU0ggIlNFRSBBTFNPIgorVGhlIGZ1bGwgZG9jdW1lbnRhdGlvbiBmb3IKKy5CIGdydWItdGVybWluZm8KK2lzIG1haW50YWluZWQgYXMgYSBUZXhpbmZvIG1hbnVhbC4gIElmIHRoZQorLkIgaW5mbworYW5kCisuQiBncnViLXRlcm1pbmZvCitwcm9ncmFtcyBhcmUgcHJvcGVybHkgaW5zdGFsbGVkIGF0IHlvdXIgc2l0ZSwgdGhlIGNvbW1hbmQKKy5JUAorLkIgaW5mbyBncnViLXRlcm1pbmZvCisuUFAKK3Nob3VsZCBnaXZlIHlvdSBhY2Nlc3MgdG8gdGhlIGNvbXBsZXRlIG1hbnVhbC4KZGlmZiAtLWdpdCBhL2RvY3MvZ3J1Yi44IGIvZG9jcy9ncnViLjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIxNDlmNwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZ3J1Yi44CkBAIC0wLDAgKzEsNzEgQEAKKy5cIiBETyBOT1QgTU9ESUZZIFRISVMgRklMRSEgIEl0IHdhcyBnZW5lcmF0ZWQgYnkgaGVscDJtYW4gMS4yMy4KKy5USCBHUlVCICI4IiAiTWF5IDIwMDUiICJncnViIChHTlUgR1JVQiAwLjk3KSIgRlNGCisuU0ggTkFNRQorZ3J1YiBcLSB0aGUgZ3J1YiBzaGVsbAorLlNIIFNZTk9QU0lTCisuQiBncnViCitbXGZJT1BUSU9OXGZSXS4uLgorLlNIIERFU0NSSVBUSU9OCitFbnRlciB0aGUgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyIGNvbW1hbmQgc2hlbGwuCisuVFAKK1xmQlwtXC1iYXRjaFxmUgordHVybiBvbiBiYXRjaCBtb2RlIGZvciBub24taW50ZXJhY3RpdmUgdXNlCisuVFAKK1xmQlwtXC1ib290XC1kcml2ZVxmUj1cZklEUklWRVxmUgorc3BlY2lmeSBzdGFnZTIgYm9vdF9kcml2ZSBbZGVmYXVsdD0weDBdCisuVFAKK1xmQlwtXC1jb25maWdcLWZpbGVcZlI9XGZJRklMRVxmUgorc3BlY2lmeSBzdGFnZTIgY29uZmlnX2ZpbGUgW2RlZmF1bHQ9L2Jvb3QvZ3J1Yi9tZW51LmxzdF0KKy5UUAorXGZCXC1cLWRldmljZVwtbWFwXGZSPVxmSUZJTEVcZlIKK3VzZSB0aGUgZGV2aWNlIG1hcCBmaWxlIEZJTEUKKy5UUAorXGZCXC1cLWhlbHBcZlIKK2Rpc3BsYXkgdGhpcyBtZXNzYWdlIGFuZCBleGl0CisuVFAKK1xmQlwtXC1ob2xkXGZSCit3YWl0IHVudGlsIGEgZGVidWdnZXIgd2lsbCBhdHRhY2gKKy5UUAorXGZCXC1cLWluc3RhbGxcLXBhcnRpdGlvblxmUj1cZklQQVJcZlIKK3NwZWNpZnkgc3RhZ2UyIGluc3RhbGxfcGFydGl0aW9uIFtkZWZhdWx0PTB4MjAwMDBdCisuVFAKK1xmQlwtXC1ub1wtY29uZmlnXC1maWxlXGZSCitkbyBub3QgdXNlIHRoZSBjb25maWcgZmlsZQorLlRQCitcZkJcLVwtbm9cLWN1cnNlc1xmUgorZG8gbm90IHVzZSBjdXJzZXMKKy5UUAorXGZCXC1cLW5vXC1mbG9wcHlcZlIKK2RvIG5vdCBwcm9iZSBhbnkgZmxvcHB5IGRyaXZlCisuVFAKK1xmQlwtXC1ub1wtcGFnZXJcZlIKK2RvIG5vdCB1c2UgaW50ZXJuYWwgcGFnZXIKKy5UUAorXGZCXC1cLXByZXNldFwtbWVudVxmUgordXNlIHRoZSBwcmVzZXQgbWVudQorLlRQCitcZkJcLVwtcHJvYmVcLXNlY29uZFwtZmxvcHB5XGZSCitwcm9iZSB0aGUgc2Vjb25kIGZsb3BweSBkcml2ZQorLlRQCitcZkJcLVwtcmVhZFwtb25seVxmUgorZG8gbm90IHdyaXRlIGFueXRoaW5nIHRvIGRldmljZXMKKy5UUAorXGZCXC1cLXZlcmJvc2VcZlIKK3ByaW50IHZlcmJvc2UgbWVzc2FnZXMKKy5UUAorXGZCXC1cLXZlcnNpb25cZlIKK3ByaW50IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKy5TSCAiUkVQT1JUSU5HIEJVR1MiCitSZXBvcnQgYnVncyB0byA8YnVnLWdydWJAZ251Lm9yZz4uCisuU0ggIlNFRSBBTFNPIgorVGhlIGZ1bGwgZG9jdW1lbnRhdGlvbiBmb3IKKy5CIGdydWIKK2lzIG1haW50YWluZWQgYXMgYSBUZXhpbmZvIG1hbnVhbC4gIElmIHRoZQorLkIgaW5mbworYW5kCisuQiBncnViCitwcm9ncmFtcyBhcmUgcHJvcGVybHkgaW5zdGFsbGVkIGF0IHlvdXIgc2l0ZSwgdGhlIGNvbW1hbmQKKy5JUAorLkIgaW5mbyBncnViCisuUFAKK3Nob3VsZCBnaXZlIHlvdSBhY2Nlc3MgdG8gdGhlIGNvbXBsZXRlIG1hbnVhbC4KZGlmZiAtLWdpdCBhL2RvY3MvZ3J1Yi5pbmZvIGIvZG9jcy9ncnViLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ4NzgzYwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZ3J1Yi5pbmZvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvZ3J1Yi50ZXhpIGIvZG9jcy9ncnViLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFkMzMwYQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZ3J1Yi50ZXhpCkBAIC0wLDAgKzEsMzk4NCBAQAorXGlucHV0IHRleGluZm8KK0BjIC0qLXRleGluZm8tKi0KK0BjICUqKnN0YXJ0IG9mIGhlYWRlcgorQHNldGZpbGVuYW1lIGdydWIuaW5mbworQHNldHRpdGxlIEdSVUIgTWFudWFsCitAYyAlKiplbmQgb2YgaGVhZGVyCisKK0BpbmNsdWRlIHZlcnNpb24udGV4aQorCitAYyBVbmlmeSBhbGwgb3VyIGxpdHRsZSBpbmRpY2VzIGZvciBub3cuCitAc3luY29kZWluZGV4IGZuIGNwCitAc3luY29kZWluZGV4IHZyIGNwCitAc3luY29kZWluZGV4IGt5IGNwCitAc3luY29kZWluZGV4IHBnIGNwCitAc3luY29kZWluZGV4IHRwIGNwCisKK0Bmb290bm90ZXN0eWxlIHNlcGFyYXRlCitAcGFyYWdyYXBoaW5kZW50IDMKK0BmaW5hbG91dAorCitAZGlyY2F0ZWdvcnkgS2VybmVsCitAZGlyZW50cnkKKyogR1JVQjogKGdydWIpLiAgICAgICAgICAgICAgICAgVGhlIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorKiBncnViLWluc3RhbGw6IChncnViKUludm9raW5nIGdydWItaW5zdGFsbC4gICAgSW5zdGFsbCBHUlVCIG9uIHlvdXIgZHJpdmUKKyogZ3J1Yi1tZDUtY3J5cHQ6IChncnViKUludm9raW5nIGdydWItbWQ1LWNyeXB0LiAgICAgICAgRW5jcnlwdCBhIHBhc3N3b3JkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIE1ENSBmb3JtYXQKKyogZ3J1Yi10ZXJtaW5mbzogKGdydWIpSW52b2tpbmcgZ3J1Yi10ZXJtaW5mby4gIEdlbmVyYXRlIGEgdGVybWluZm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgZnJvbSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5mbyBuYW1lCisqIGdydWItc2V0LWRlZmF1bHQ6IChncnViKUludm9raW5nIGdydWItc2V0LWRlZmF1bHQuICAgIFNldCBhIGRlZmF1bHQgYm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeQorKiBtYmNoazogKGdydWIpSW52b2tpbmcgbWJjaGsuICBDaGVjayBmb3IgdGhlIGZvcm1hdCBvZiBhIE11bHRpYm9vdCBrZXJuZWwKK0BlbmQgZGlyZW50cnkKKworQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAorCitAaWZpbmZvCitDb3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCit0aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQorYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgorCitAaWdub3JlCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZVggYW5kIHByaW50IHRoZQorcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBhIGNvcHlpbmcgcGVybWlzc2lvbgorbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCisodGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCisKK0BlbmQgaWdub3JlCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKK21hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgYWxzbyB0aGF0Cit0aGUgZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKK3Blcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCitpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KK0BlbmQgaWZpbmZvCisKK0B0aXRsZXBhZ2UKK0BzcCAxMAorQHRpdGxlIHRoZSBHUlVCIG1hbnVhbAorQHN1YnRpdGxlIFRoZSBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIsIHZlcnNpb24gQHZhbHVle1ZFUlNJT059LCBAdmFsdWV7VVBEQVRFRH0uCitAYXV0aG9yIEdvcmRvbiBNYXR6aWdrZWl0CitAYXV0aG9yIFlvc2hpbm9yaSBLLiBPa3VqaQorQGMgVGhlIGZvbGxvd2luZyB0d28gY29tbWFuZHMgc3RhcnQgdGhlIGNvcHlyaWdodCBwYWdlLgorQHBhZ2UKK0B2c2tpcCAwcHQgcGx1cyAxZmlsbGwKK0NvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCittYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlIGVudGlyZQorcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYSBwZXJtaXNzaW9uCitub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKK2ludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLAorZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgc3RhdGVkIGluIGEgdHJhbnNsYXRpb24gYXBwcm92ZWQKK2J5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KK0BlbmQgdGl0bGVwYWdlCisKK0BjIE91dHB1dCB0aGUgdGFibGUgb2YgY29udGVudHMgYXQgdGhlIGJlZ2lubmluZy4KK0Bjb250ZW50cworCitAZmluYWxvdXQKK0BoZWFkaW5ncyBkb3VibGUKKworQGlmbm90dGV4CitAbm9kZSBUb3AKK0B0b3AgR1JVQiBtYW51YWwKKworVGhpcyBpcyB0aGUgZG9jdW1lbnRhdGlvbiBvZiBHTlUgR1JVQiwgdGhlIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlciwKK2EgZmxleGlibGUgYW5kIHBvd2VyZnVsIGJvb3QgbG9hZGVyIHByb2dyYW0gZm9yIEBzY3twY31zLgorCitUaGlzIGVkaXRpb24gZG9jdW1lbnRzIHZlcnNpb24gQHZhbHVle1ZFUlNJT059LgorQGVuZCBpZm5vdHRleAorCitAbWVudQorKiBJbnRyb2R1Y3Rpb246OiAgICAgICAgICAgICAgICBDYXB0dXJpbmcgdGhlIHNwaXJpdCBvZiBHUlVCCisqIE5hbWluZyBjb252ZW50aW9uOjogICAgICAgICAgIE5hbWVzIG9mIHlvdXIgZHJpdmVzIGluIEdSVUIKKyogSW5zdGFsbGF0aW9uOjogICAgICAgICAgICAgICAgSW5zdGFsbGluZyBHUlVCIG9uIHlvdXIgZHJpdmUKKyogQm9vdGluZzo6ICAgICAgICAgICAgICAgICAgICAgSG93IHRvIGJvb3QgZGlmZmVyZW50IG9wZXJhdGluZyBzeXN0ZW1zCisqIENvbmZpZ3VyYXRpb246OiAgICAgICAgICAgICAgIFdyaXRpbmcgeW91ciBvd24gY29uZmlndXJhdGlvbiBmaWxlCisqIE5ldHdvcms6OiAgICAgICAgICAgICAgICAgICAgIERvd25sb2FkaW5nIE9TIGltYWdlcyBmcm9tIGEgbmV0d29yaworKiBTZXJpYWwgdGVybWluYWw6OiAgICAgICAgICAgICBVc2luZyBHUlVCIHZpYSBhIHNlcmlhbCBsaW5lCisqIFByZXNldCBNZW51OjogICAgICAgICAgICAgICAgIEVtYmVkZGluZyBhIGNvbmZpZ3VyYXRpb24gZmlsZSBpbnRvIEdSVUIKKyogU2VjdXJpdHk6OiAgICAgICAgICAgICAgICAgICAgSW1wcm92aW5nIHRoZSBzZWN1cml0eQorKiBJbWFnZXM6OiAgICAgICAgICAgICAgICAgICAgICBHUlVCIGltYWdlIGZpbGVzCisqIEZpbGVzeXN0ZW06OiAgICAgICAgICAgICAgICAgIEZpbGVzeXN0ZW0gc3ludGF4IGFuZCBzZW1hbnRpY3MKKyogSW50ZXJmYWNlOjogICAgICAgICAgICAgICAgICAgVGhlIG1lbnUgYW5kIHRoZSBjb21tYW5kLWxpbmUKKyogQ29tbWFuZHM6OiAgICAgICAgICAgICAgICAgICAgVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGJ1aWx0aW4gY29tbWFuZHMKKyogVHJvdWJsZXNob290aW5nOjogICAgICAgICAgICAgRXJyb3IgbWVzc2FnZXMgcHJvZHVjZWQgYnkgR1JVQgorKiBJbnZva2luZyB0aGUgZ3J1YiBzaGVsbDo6ICAgICBIb3cgdG8gdXNlIHRoZSBncnViIHNoZWxsCisqIEludm9raW5nIGdydWItaW5zdGFsbDo6ICAgICAgIEhvdyB0byB1c2UgdGhlIEdSVUIgaW5zdGFsbGVyCisqIEludm9raW5nIGdydWItbWQ1LWNyeXB0OjogICAgIEhvdyB0byBnZW5lcmF0ZSBhIGNyeXB0aWMgcGFzc3dvcmQKKyogSW52b2tpbmcgZ3J1Yi10ZXJtaW5mbzo6ICAgICAgSG93IHRvIGdlbmVyYXRlIGEgdGVybWluZm8gY29tbWFuZAorKiBJbnZva2luZyBncnViLXNldC1kZWZhdWx0OjogICBIb3cgdG8gc2V0IGEgZGVmYXVsdCBib290IGVudHJ5CisqIEludm9raW5nIG1iY2hrOjogICAgICAgICAgICAgIEhvdyB0byB1c2UgdGhlIE11bHRpYm9vdCBjaGVja2VyCisqIE9idGFpbmluZyBhbmQgQnVpbGRpbmcgR1JVQjo6IEhvdyB0byBvYnRhaW4gYW5kIGJ1aWxkIEdSVUIKKyogUmVwb3J0aW5nIGJ1Z3M6OiAgICAgICAgICAgICAgV2hlcmUgeW91IHNob3VsZCBzZW5kIGEgYnVnIHJlcG9ydAorKiBGdXR1cmU6OiAgICAgICAgICAgICAgICAgICAgICBTb21lIGZ1dHVyZSBwbGFucyBvbiBHUlVCCisqIEludGVybmFsczo6ICAgICAgICAgICAgICAgICAgIEhhY2tpbmcgR1JVQgorKiBJbmRleDo6CitAZW5kIG1lbnUKKworCitAbm9kZSBJbnRyb2R1Y3Rpb24KK0BjaGFwdGVyIEludHJvZHVjdGlvbiB0byBHUlVCCisKK0BtZW51CisqIE92ZXJ2aWV3OjogICAgICAgICAgICAgICAgICAgIFdoYXQgZXhhY3RseSBHUlVCIGlzIGFuZCBob3cgdG8gdXNlIGl0CisqIEhpc3Rvcnk6OiAgICAgICAgICAgICAgICAgICAgIEZyb20gbWFnZ290IHRvIGhvdXNlIGZseQorKiBGZWF0dXJlczo6ICAgICAgICAgICAgICAgICAgICBHUlVCIGZlYXR1cmVzCisqIFJvbGUgb2YgYSBib290IGxvYWRlcjo6ICAgICAgIFRoZSByb2xlIG9mIGEgYm9vdCBsb2FkZXIKK0BlbmQgbWVudQorCisKK0Bub2RlIE92ZXJ2aWV3CitAc2VjdGlvbiBPdmVydmlldworCitCcmllZmx5LCBhIEBkZm57Ym9vdCBsb2FkZXJ9IGlzIHRoZSBmaXJzdCBzb2Z0d2FyZSBwcm9ncmFtIHRoYXQgcnVucyB3aGVuCithIGNvbXB1dGVyIHN0YXJ0cy4gIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBsb2FkaW5nIGFuZCB0cmFuc2ZlcnJpbmcKK2NvbnRyb2wgdG8gYW4gb3BlcmF0aW5nIHN5c3RlbSBAZGZue2tlcm5lbH0gc29mdHdhcmUgKHN1Y2ggYXMgTGludXggb3IKK0dOVSBNYWNoKS4gIFRoZSBrZXJuZWwsIGluIHR1cm4sIGluaXRpYWxpemVzIHRoZSByZXN0IG9mIHRoZSBvcGVyYXRpbmcKK3N5c3RlbSAoZS5nLiBhIEdOVSBzeXN0ZW0pLgorCitHTlUgR1JVQiBpcyBhIHZlcnkgcG93ZXJmdWwgYm9vdCBsb2FkZXIsIHdoaWNoIGNhbiBsb2FkIGEgd2lkZSB2YXJpZXR5CitvZiBmcmVlIG9wZXJhdGluZyBzeXN0ZW1zLCBhcyB3ZWxsIGFzIHByb3ByaWV0YXJ5IG9wZXJhdGluZyBzeXN0ZW1zIHdpdGgKK2NoYWluLWxvYWRpbmdAZm9vdG5vdGV7QGRmbntjaGFpbi1sb2FkfSBpcyB0aGUgbWVjaGFuaXNtIGZvciBsb2FkaW5nCit1bnN1cHBvcnRlZCBvcGVyYXRpbmcgc3lzdGVtcyBieSBsb2FkaW5nIGFub3RoZXIgYm9vdCBsb2FkZXIuIEl0IGlzCit0eXBpY2FsbHkgdXNlZCBmb3IgbG9hZGluZyBET1Mgb3IgV2luZG93cy59LiBHUlVCIGlzIGRlc2lnbmVkIHRvCithZGRyZXNzIHRoZSBjb21wbGV4aXR5IG9mIGJvb3RpbmcgYSBwZXJzb25hbCBjb21wdXRlcjsgYm90aCB0aGUKK3Byb2dyYW0gYW5kIHRoaXMgbWFudWFsIGFyZSB0aWdodGx5IGJvdW5kIHRvIHRoYXQgY29tcHV0ZXIgcGxhdGZvcm0sCithbHRob3VnaCBwb3J0aW5nIHRvIG90aGVyIHBsYXRmb3JtcyBtYXkgYmUgYWRkcmVzc2VkIGluIHRoZSBmdXR1cmUuCisKK09uZSBvZiB0aGUgaW1wb3J0YW50IGZlYXR1cmVzIGluIEdSVUIgaXMgZmxleGliaWxpdHk7IEdSVUIgdW5kZXJzdGFuZHMKK2ZpbGVzeXN0ZW1zIGFuZCBrZXJuZWwgZXhlY3V0YWJsZSBmb3JtYXRzLCBzbyB5b3UgY2FuIGxvYWQgYW4gYXJiaXRyYXJ5CitvcGVyYXRpbmcgc3lzdGVtIHRoZSB3YXkgeW91IGxpa2UsIHdpdGhvdXQgcmVjb3JkaW5nIHRoZSBwaHlzaWNhbAorcG9zaXRpb24gb2YgeW91ciBrZXJuZWwgb24gdGhlIGRpc2suIFRodXMgeW91IGNhbiBsb2FkIHRoZSBrZXJuZWwKK2p1c3QgYnkgc3BlY2lmeWluZyBpdHMgZmlsZSBuYW1lIGFuZCB0aGUgZHJpdmUgYW5kIHBhcnRpdGlvbiB3aGVyZSB0aGUKK2tlcm5lbCByZXNpZGVzLgorCitXaGVuIGJvb3Rpbmcgd2l0aCBHUlVCLCB5b3UgY2FuIHVzZSBlaXRoZXIgYSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlCisoQHB4cmVme0NvbW1hbmQtbGluZSBpbnRlcmZhY2V9KSwgb3IgYSBtZW51IGludGVyZmFjZSAoQHB4cmVme01lbnUKK2ludGVyZmFjZX0pLiBVc2luZyB0aGUgY29tbWFuZC1saW5lIGludGVyZmFjZSwgeW91IHR5cGUgdGhlIGRyaXZlCitzcGVjaWZpY2F0aW9uIGFuZCBmaWxlIG5hbWUgb2YgdGhlIGtlcm5lbCBtYW51YWxseS4gSW4gdGhlIG1lbnUKK2ludGVyZmFjZSwgeW91IGp1c3Qgc2VsZWN0IGFuIE9TIHVzaW5nIHRoZSBhcnJvdyBrZXlzLiBUaGUgbWVudSBpcworYmFzZWQgb24gYSBjb25maWd1cmF0aW9uIGZpbGUgd2hpY2ggeW91IHByZXBhcmUgYmVmb3JlaGFuZAorKEBweHJlZntDb25maWd1cmF0aW9ufSkuIFdoaWxlIGluIHRoZSBtZW51LCB5b3UgY2FuIHN3aXRjaCB0byB0aGUKK2NvbW1hbmQtbGluZSBtb2RlLCBhbmQgdmljZS12ZXJzYS4gWW91IGNhbiBldmVuIGVkaXQgbWVudSBlbnRyaWVzCitiZWZvcmUgdXNpbmcgdGhlbS4KKworSW4gdGhlIGZvbGxvd2luZyBjaGFwdGVycywgeW91IHdpbGwgbGVhcm4gaG93IHRvIHNwZWNpZnkgYSBkcml2ZSwgYQorcGFydGl0aW9uLCBhbmQgYSBmaWxlIG5hbWUgKEBweHJlZntOYW1pbmcgY29udmVudGlvbn0pIHRvIEdSVUIsIGhvdyB0bworaW5zdGFsbCBHUlVCIG9uIHlvdXIgZHJpdmUgKEBweHJlZntJbnN0YWxsYXRpb259KSwgYW5kIGhvdyB0byBib290IHlvdXIKK09TZXMgKEBweHJlZntCb290aW5nfSksIHN0ZXAgYnkgc3RlcC4KKworQmVzaWRlcyB0aGUgR1JVQiBib290IGxvYWRlciBpdHNlbGYsIHRoZXJlIGlzIGEgQGRmbntncnViIHNoZWxsfQorQGNvbW1hbmR7Z3J1Yn0gKEBweHJlZntJbnZva2luZyB0aGUgZ3J1YiBzaGVsbH0pIHdoaWNoIGNhbiBiZSBydW4gd2hlbgoreW91IGFyZSBpbiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0uIEl0IGVtdWxhdGVzIHRoZSBib290IGxvYWRlciBhbmQgY2FuCitiZSB1c2VkIGZvciBpbnN0YWxsaW5nIHRoZSBib290IGxvYWRlci4KKworCitAbm9kZSBIaXN0b3J5CitAc2VjdGlvbiBIaXN0b3J5IG9mIEdSVUIKKworR1JVQiBvcmlnaW5hdGVkIGluIDE5OTUgd2hlbiBFcmljaCBCb2xleW4gd2FzIHRyeWluZyB0byBib290IHRoZSBHTlUKK0h1cmQgd2l0aCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoJ3MgTWFjaCA0IG1pY3Jva2VybmVsIChub3cga25vd24gYXMgR05VCitNYWNoKS4gIEVyaWNoIGFuZCBCcmlhbiBGb3JkIGRlc2lnbmVkIHRoZSBNdWx0aWJvb3QgU3BlY2lmaWNhdGlvbgorKEBweHJlZntUb3AsIE11bHRpYm9vdCBTcGVjaWZpY2F0aW9uLCBNb3RpdmF0aW9uLCBtdWx0aWJvb3QsIFRoZSBNdWx0aWJvb3QKK1NwZWNpZmljYXRpb259KSwgYmVjYXVzZSB0aGV5IHdlcmUgZGV0ZXJtaW5lZCBub3QgdG8gYWRkIHRvIHRoZSBsYXJnZQorbnVtYmVyIG9mIG11dHVhbGx5LWluY29tcGF0aWJsZSBQQyBib290IG1ldGhvZHMuCisKK0VyaWNoIHRoZW4gYmVnYW4gbW9kaWZ5aW5nIHRoZSBGcmVlQlNEIGJvb3QgbG9hZGVyIHNvIHRoYXQgaXQgd291bGQKK3VuZGVyc3RhbmQgTXVsdGlib290LiBIZSBzb29uIHJlYWxpemVkIHRoYXQgaXQgd291bGQgYmUgYSBsb3QgZWFzaWVyCit0byB3cml0ZSBoaXMgb3duIGJvb3QgbG9hZGVyIGZyb20gc2NyYXRjaCB0aGFuIHRvIGtlZXAgd29ya2luZyBvbiB0aGUKK0ZyZWVCU0QgYm9vdCBsb2FkZXIsIGFuZCBzbyBHUlVCIHdhcyBib3JuLgorCitFcmljaCBhZGRlZCBtYW55IGZlYXR1cmVzIHRvIEdSVUIsIGJ1dCBvdGhlciBwcmlvcml0aWVzIHByZXZlbnRlZCBoaW0KK2Zyb20ga2VlcGluZyB1cCB3aXRoIHRoZSBkZW1hbmRzIG9mIGl0cyBxdWlja2x5LWV4cGFuZGluZyB1c2VyIGJhc2UuIEluCisxOTk5LCBHb3Jkb24gTWF0emlna2VpdCBhbmQgWW9zaGlub3JpIEsuIE9rdWppIGFkb3B0ZWQgR1JVQiBhcyBhbgorb2ZmaWNpYWwgR05VIHBhY2thZ2UsIGFuZCBvcGVuZWQgaXRzIGRldmVsb3BtZW50IGJ5IG1ha2luZyB0aGUgbGF0ZXN0Citzb3VyY2VzIGF2YWlsYWJsZSB2aWEgYW5vbnltb3VzIENWUy4gQHhyZWZ7T2J0YWluaW5nIGFuZCBCdWlsZGluZworR1JVQn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisKK0Bub2RlIEZlYXR1cmVzCitAc2VjdGlvbiBHUlVCIGZlYXR1cmVzCisKK1RoZSBwcmltYXJ5IHJlcXVpcmVtZW50IGZvciBHUlVCIGlzIHRoYXQgaXQgYmUgY29tcGxpYW50IHdpdGggdGhlCitAZGZue011bHRpYm9vdCBTcGVjaWZpY2F0aW9ufSwgd2hpY2ggaXMgZGVzY3JpYmVkIGluIEByZWZ7VG9wLCBNdWx0aWJvb3QKK1NwZWNpZmljYXRpb24sIE1vdGl2YXRpb24sIG11bHRpYm9vdCwgVGhlIE11bHRpYm9vdCBTcGVjaWZpY2F0aW9ufS4KKworVGhlIG90aGVyIGdvYWxzLCBsaXN0ZWQgaW4gYXBwcm94aW1hdGUgb3JkZXIgb2YgaW1wb3J0YW5jZSwgYXJlOgorCitAaXRlbWl6ZSBAYnVsbGV0e30KK0BpdGVtCitCYXNpYyBmdW5jdGlvbnMgbXVzdCBiZSBzdHJhaWdodGZvcndhcmQgZm9yIGVuZC11c2Vycy4KKworQGl0ZW0KK1JpY2ggZnVuY3Rpb25hbGl0eSB0byBzdXBwb3J0IGtlcm5lbCBleHBlcnRzIGFuZCBkZXNpZ25lcnMuCisKK0BpdGVtCitCYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvciBib290aW5nIEZyZWVCU0QsIE5ldEJTRCwgT3BlbkJTRCwgYW5kCitMaW51eC4gUHJvcHJpZXRhcnkga2VybmVscyAoc3VjaCBhcyBET1MsIFdpbmRvd3MgTlQsIGFuZCBPUy8yKSBhcmUKK3N1cHBvcnRlZCB2aWEgYSBjaGFpbi1sb2FkaW5nIGZ1bmN0aW9uLgorQGVuZCBpdGVtaXplCisKK0V4Y2VwdCBmb3Igc3BlY2lmaWMgY29tcGF0aWJpbGl0eSBtb2RlcyAoY2hhaW4tbG9hZGluZyBhbmQgdGhlIExpbnV4CitAZGZue3BpZ2d5YmFja30gZm9ybWF0KSwgYWxsIGtlcm5lbHMgd2lsbCBiZSBzdGFydGVkIGluIG11Y2ggdGhlIHNhbWUKK3N0YXRlIGFzIGluIHRoZSBNdWx0aWJvb3QgU3BlY2lmaWNhdGlvbi4gT25seSBrZXJuZWxzIGxvYWRlZCBhdCAxIG1lZ2FieXRlCitvciBhYm92ZSBhcmUgcHJlc2VudGx5IHN1cHBvcnRlZC4gQW55IGF0dGVtcHQgdG8gbG9hZCBiZWxvdyB0aGF0Citib3VuZGFyeSB3aWxsIHNpbXBseSByZXN1bHQgaW4gaW1tZWRpYXRlIGZhaWx1cmUgYW5kIGFuIGVycm9yIG1lc3NhZ2UKK3JlcG9ydGluZyB0aGUgcHJvYmxlbS4KKworSW4gYWRkaXRpb24gdG8gdGhlIHJlcXVpcmVtZW50cyBhYm92ZSwgR1JVQiBoYXMgdGhlIGZvbGxvd2luZyBmZWF0dXJlcworKG5vdGUgdGhhdCB0aGUgTXVsdGlib290IFNwZWNpZmljYXRpb24gZG9lc24ndCByZXF1aXJlIGFsbCB0aGUgZmVhdHVyZXMKK3RoYXQgR1JVQiBzdXBwb3J0cyk6CisKK0B0YWJsZSBAYXNpcworQGl0ZW0gUmVjb2duaXplIG11bHRpcGxlIGV4ZWN1dGFibGUgZm9ybWF0cworU3VwcG9ydCBtYW55IG9mIHRoZSBAZGZue2Eub3V0fSB2YXJpYW50cyBwbHVzIEBkZm57RUxGfS4gU3ltYm9sCit0YWJsZXMgYXJlIGFsc28gbG9hZGVkLgorCitAaXRlbSBTdXBwb3J0IG5vbi1NdWx0aWJvb3Qga2VybmVscworU3VwcG9ydCBtYW55IG9mIHRoZSB2YXJpb3VzIGZyZWUgMzItYml0IGtlcm5lbHMgdGhhdCBsYWNrIE11bHRpYm9vdAorY29tcGxpYW5jZSAocHJpbWFyaWx5IEZyZWVCU0QsIE5ldEJTRCwgT3BlbkJTRCwgYW5kCitMaW51eCkuIENoYWluLWxvYWRpbmcgb2Ygb3RoZXIgYm9vdCBsb2FkZXJzIGlzIGFsc28gc3VwcG9ydGVkLgorCitAaXRlbSBMb2FkIG11bHRpcGxlcyBtb2R1bGVzCitGdWxseSBzdXBwb3J0IHRoZSBNdWx0aWJvb3QgZmVhdHVyZSBvZiBsb2FkaW5nIG11bHRpcGxlIG1vZHVsZXMuCisKK0BpdGVtIExvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUKK1N1cHBvcnQgYSBodW1hbi1yZWFkYWJsZSB0ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZSB3aXRoIHByZXNldCBib290Citjb21tYW5kcy4gWW91IGNhbiBhbHNvIGxvYWQgYW5vdGhlciBjb25maWd1cmF0aW9uIGZpbGUgZHluYW1pY2FsbHkgYW5kCitlbWJlZCBhIHByZXNldCBjb25maWd1cmF0aW9uIGZpbGUgaW4gYSBHUlVCIGltYWdlIGZpbGUuIFRoZSBsaXN0IG9mCitjb21tYW5kcyAoQHB4cmVme0NvbW1hbmRzfSkgYXJlIGEgc3VwZXJzZXQgb2YgdGhvc2Ugc3VwcG9ydGVkIG9uIHRoZQorY29tbWFuZC1saW5lLiBBbiBleGFtcGxlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBwcm92aWRlZCBpbgorQHJlZntDb25maWd1cmF0aW9ufS4KKworQGl0ZW0gUHJvdmlkZSBhIG1lbnUgaW50ZXJmYWNlCitBIG1lbnUgaW50ZXJmYWNlIGxpc3RpbmcgcHJlc2V0IGJvb3QgY29tbWFuZHMsIHdpdGggYSBwcm9ncmFtbWFibGUKK3RpbWVvdXQsIGlzIGF2YWlsYWJsZS4gVGhlcmUgaXMgbm8gZml4ZWQgbGltaXQgb24gdGhlIG51bWJlciBvZiBib290CitlbnRyaWVzLCBhbmQgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaGFzIHNwYWNlIGZvciBzZXZlcmFsIGh1bmRyZWQuCisKK0BpdGVtIEhhdmUgYSBmbGV4aWJsZSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlCitBIGZhaXJseSBmbGV4aWJsZSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlLCBhY2Nlc3NpYmxlIGZyb20gdGhlIG1lbnUsCitpcyBhdmFpbGFibGUgdG8gZWRpdCBhbnkgcHJlc2V0IGNvbW1hbmRzLCBvciB3cml0ZSBhIG5ldyBib290IGNvbW1hbmQKK3NldCBmcm9tIHNjcmF0Y2guIElmIG5vIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBwcmVzZW50LCBHUlVCIGRyb3BzIHRvCit0aGUgY29tbWFuZC1saW5lLgorCitUaGUgbGlzdCBvZiBjb21tYW5kcyAoQHB4cmVme0NvbW1hbmRzfSkgYXJlIGEgc3Vic2V0IG9mIHRob3NlIHN1cHBvcnRlZAorZm9yIGNvbmZpZ3VyYXRpb24gZmlsZXMuIEVkaXRpbmcgY29tbWFuZHMgY2xvc2VseSByZXNlbWJsZXMgdGhlIEJhc2gKK2NvbW1hbmQtbGluZSAoQHB4cmVme0NvbW1hbmQgTGluZSBFZGl0aW5nLCBCYXNoLCBDb21tYW5kIExpbmUgRWRpdGluZywKK2ZlYXR1cmVzLCBCYXNoIEZlYXR1cmVzfSksIHdpdGggQGtleXtUQUJ9LWNvbXBsZXRpb24gb2YgY29tbWFuZHMsCitkZXZpY2VzLCBwYXJ0aXRpb25zLCBhbmQgZmlsZXMgaW4gYSBkaXJlY3RvcnkgZGVwZW5kaW5nIG9uIGNvbnRleHQuCisKK0BpdGVtIFN1cHBvcnQgbXVsdGlwbGUgZmlsZXN5c3RlbSB0eXBlcworU3VwcG9ydCBtdWx0aXBsZSBmaWxlc3lzdGVtIHR5cGVzIHRyYW5zcGFyZW50bHksIHBsdXMgYSB1c2VmdWwgZXhwbGljaXQKK2Jsb2NrbGlzdCBub3RhdGlvbi4gVGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgZmlsZXN5c3RlbSB0eXBlcyBhcmUKK0BkZm57QlNEIEZGU30sIEBkZm57RE9TIEZBVDE2IGFuZCBGQVQzMn0sIEBkZm57TWluaXggZnN9LCBAZGZue0xpbnV4CitleHQyZnN9LCBAZGZue1JlaXNlckZTfSwgQGRmbntKRlN9LCBAZGZue1hGU30sIGFuZCBAZGZue1ZTVGEKK2ZzfS4gQHhyZWZ7RmlsZXN5c3RlbX0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitAaXRlbSBTdXBwb3J0IGF1dG9tYXRpYyBkZWNvbXByZXNzaW9uCitDYW4gZGVjb21wcmVzcyBmaWxlcyB3aGljaCB3ZXJlIGNvbXByZXNzZWQgYnkgQGNvbW1hbmR7Z3ppcH0uIFRoaXMKK2Z1bmN0aW9uIGlzIGJvdGggYXV0b21hdGljIGFuZCB0cmFuc3BhcmVudCB0byB0aGUgdXNlciAoaS5lLiBhbGwKK2Z1bmN0aW9ucyBvcGVyYXRlIHVwb24gdGhlIHVuY29tcHJlc3NlZCBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkCitmaWxlcykuIFRoaXMgZ3JlYXRseSByZWR1Y2VzIGEgZmlsZSBzaXplIGFuZCBsb2FkaW5nIHRpbWUsIGEKK3BhcnRpY3VsYXJseSBncmVhdCBiZW5lZml0IGZvciBmbG9wcGllcy5AZm9vdG5vdGV7VGhlcmUgYXJlIGEgZmV3CitwYXRob2xvZ2ljYWwgY2FzZXMgd2hlcmUgbG9hZGluZyBhIHZlcnkgYmFkbHkgb3JnYW5pemVkIEVMRiBrZXJuZWwgbWlnaHQKK3Rha2UgbG9uZ2VyLCBidXQgaW4gcHJhY3RpY2UgdGhpcyBuZXZlciBoYXBwZW4ufQorCitJdCBpcyBjb25jZWl2YWJsZSB0aGF0IHNvbWUga2VybmVsIG1vZHVsZXMgc2hvdWxkIGJlIGxvYWRlZCBpbiBhCitjb21wcmVzc2VkIHN0YXRlLCBzbyBhIGRpZmZlcmVudCBtb2R1bGUtbG9hZGluZyBjb21tYW5kIGNhbiBiZSBzcGVjaWZpZWQKK3RvIGF2b2lkIHVuY29tcHJlc3NpbmcgdGhlIG1vZHVsZXMuCisKK0BpdGVtIEFjY2VzcyBkYXRhIG9uIGFueSBpbnN0YWxsZWQgZGV2aWNlCitTdXBwb3J0IHJlYWRpbmcgZGF0YSBmcm9tIGFueSBvciBhbGwgZmxvcHBpZXMgb3IgaGFyZCBkaXNrKHMpIHJlY29nbml6ZWQKK2J5IHRoZSBCSU9TLCBpbmRlcGVuZGVudCBvZiB0aGUgc2V0dGluZyBvZiB0aGUgcm9vdCBkZXZpY2UuCisKK0BpdGVtIEJlIGluZGVwZW5kZW50IG9mIGRyaXZlIGdlb21ldHJ5IHRyYW5zbGF0aW9ucworVW5saWtlIG1hbnkgb3RoZXIgYm9vdCBsb2FkZXJzLCBHUlVCIG1ha2VzIHRoZSBwYXJ0aWN1bGFyIGRyaXZlCit0cmFuc2xhdGlvbiBpcnJlbGV2YW50LiBBIGRyaXZlIGluc3RhbGxlZCBhbmQgcnVubmluZyB3aXRoIG9uZQordHJhbnNsYXRpb24gbWF5IGJlIGNvbnZlcnRlZCB0byBhbm90aGVyIHRyYW5zbGF0aW9uIHdpdGhvdXQgYW55IGFkdmVyc2UKK2VmZmVjdHMgb3IgY2hhbmdlcyBpbiBHUlVCJ3MgY29uZmlndXJhdGlvbi4KKworQGl0ZW0gRGV0ZWN0IGFsbCBpbnN0YWxsZWQgQHNje3JhbX0KK0dSVUIgY2FuIGdlbmVyYWxseSBmaW5kIGFsbCB0aGUgaW5zdGFsbGVkIEBzY3tyYW19IG9uIGEgUEMtY29tcGF0aWJsZQorbWFjaGluZS4gSXQgdXNlcyBhbiBhZHZhbmNlZCBCSU9TIHF1ZXJ5IHRlY2huaXF1ZSBmb3IgZmluZGluZyBhbGwKK21lbW9yeSByZWdpb25zLiBBcyBkZXNjcmliZWQgb24gdGhlIE11bHRpYm9vdCBTcGVjaWZpY2F0aW9uIChAcHhyZWZ7VG9wLAorTXVsdGlib290IFNwZWNpZmljYXRpb24sIE1vdGl2YXRpb24sIG11bHRpYm9vdCwgVGhlIE11bHRpYm9vdAorU3BlY2lmaWNhdGlvbn0pLCBub3QgYWxsIGtlcm5lbHMgbWFrZSB1c2Ugb2YgdGhpcyBpbmZvcm1hdGlvbiwgYnV0IEdSVUIKK3Byb3ZpZGVzIGl0IGZvciB0aG9zZSB3aG8gZG8uCisKK0BpdGVtIFN1cHBvcnQgTG9naWNhbCBCbG9jayBBZGRyZXNzIG1vZGUKK0luIHRyYWRpdGlvbmFsIGRpc2sgY2FsbHMgKGNhbGxlZCBAZGZue0NIUyBtb2RlfSksIHRoZXJlIGlzIGEgZ2VvbWV0cnkKK3RyYW5zbGF0aW9uIHByb2JsZW0sIHRoYXQgaXMsIHRoZSBCSU9TIGNhbm5vdCBhY2Nlc3Mgb3ZlciAxMDI0CitjeWxpbmRlcnMsIHNvIHRoZSBhY2Nlc3NpYmxlIHNwYWNlIGlzIGxpbWl0ZWQgdG8gYXQgbGVhc3QgNTA4IE1CIGFuZCB0bworYXQgbW9zdCA4R0IuIEdSVUIgY2FuJ3QgdW5pdmVyc2FsbHkgc29sdmUgdGhpcyBwcm9ibGVtLCBhcyB0aGVyZSBpcyBubworc3RhbmRhcmQgaW50ZXJmYWNlIHVzZWQgaW4gYWxsIG1hY2hpbmVzLiBIb3dldmVyLCBzZXZlcmFsIG5ld2VyIG1hY2hpbmVzCitoYXZlIHRoZSBuZXcgaW50ZXJmYWNlLCBMb2dpY2FsIEJsb2NrIEFkZHJlc3MgKEBkZm57TEJBfSkgbW9kZS4gR1JVQgorYXV0b21hdGljYWxseSBkZXRlY3RzIGlmIExCQSBtb2RlIGlzIGF2YWlsYWJsZSBhbmQgdXNlcyBpdCBpZgorYXZhaWxhYmxlLiBJbiBMQkEgbW9kZSwgR1JVQiBjYW4gYWNjZXNzIHRoZSBlbnRpcmUgZGlzay4KKworQGl0ZW0gU3VwcG9ydCBuZXR3b3JrIGJvb3RpbmcKK0dSVUIgaXMgYmFzaWNhbGx5IGEgZGlzay1iYXNlZCBib290IGxvYWRlciBidXQgYWxzbyBoYXMgbmV0d29yaworc3VwcG9ydC4gWW91IGNhbiBsb2FkIE9TIGltYWdlcyBmcm9tIGEgbmV0d29yayBieSB1c2luZyB0aGUgQGRmbntURlRQfQorcHJvdG9jb2wuCisKK0BpdGVtIFN1cHBvcnQgcmVtb3RlIHRlcm1pbmFscworVG8gc3VwcG9ydCBjb21wdXRlcnMgd2l0aCBubyBjb25zb2xlLCBHUlVCIHByb3ZpZGVzIHJlbW90ZSB0ZXJtaW5hbAorc3VwcG9ydCwgc28gdGhhdCB5b3UgY2FuIGNvbnRyb2wgR1JVQiBmcm9tIGEgcmVtb3RlIGhvc3QuIE9ubHkgc2VyaWFsCit0ZXJtaW5hbCBzdXBwb3J0IGlzIGltcGxlbWVudGVkIGF0IHRoZSBtb21lbnQuCitAZW5kIHRhYmxlCisKKworQG5vZGUgUm9sZSBvZiBhIGJvb3QgbG9hZGVyCitAc2VjdGlvbiBUaGUgcm9sZSBvZiBhIGJvb3QgbG9hZGVyCisKK1RoZSBmb2xsb3dpbmcgaXMgYSBxdW90YXRpb24gZnJvbSBHb3Jkb24gTWF0emlna2VpdCwgYSBHUlVCIGZhbmF0aWM6CisKK0BxdW90YXRpb24KK1NvbWUgcGVvcGxlIGxpa2UgdG8gYWNrbm93bGVkZ2UgYm90aCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBhbmQga2VybmVsIHdoZW4KK3RoZXkgdGFsayBhYm91dCB0aGVpciBjb21wdXRlcnMsIHNvIHRoZXkgbWlnaHQgc2F5IHRoZXkgdXNlCitgYEdOVS9MaW51eCcnIG9yIGBgR05VL0h1cmQnJy4gIE90aGVyIHBlb3BsZSBzZWVtIHRvIHRoaW5rIHRoYXQgdGhlCitrZXJuZWwgaXMgdGhlIG1vc3QgaW1wb3J0YW50IHBhcnQgb2YgdGhlIHN5c3RlbSwgc28gdGhleSBsaWtlIHRvIGNhbGwKK3RoZWlyIEdOVSBvcGVyYXRpbmcgc3lzdGVtcyBgYExpbnV4IHN5c3RlbXMuJycKKworSSwgcGVyc29uYWxseSwgYmVsaWV2ZSB0aGF0IHRoaXMgaXMgYSBncmF2ZSBpbmp1c3RpY2UsIGJlY2F1c2UgdGhlCitAZW1waHtib290IGxvYWRlcn0gaXMgdGhlIG1vc3QgaW1wb3J0YW50IHNvZnR3YXJlIG9mIGFsbC4gSSB1c2VkIHRvCityZWZlciB0byB0aGUgYWJvdmUgc3lzdGVtcyBhcyBlaXRoZXIgYGBMSUxPJydAZm9vdG5vdGV7VGhlIExJbnV4IExPYWRlciwKK2EgYm9vdCBsb2FkZXIgdGhhdCBldmVyeWJvZHkgdXNlcywgYnV0IG5vYm9keSBsaWtlcy59IG9yIGBgR1JVQicnCitzeXN0ZW1zLgorCitVbmZvcnR1bmF0ZWx5LCBub2JvZHkgZXZlciB1bmRlcnN0b29kIHdoYXQgSSB3YXMgdGFsa2luZyBhYm91dDsgbm93IEkKK2p1c3QgdXNlIHRoZSB3b3JkIGBgR05VJycgYXMgYSBwc2V1ZG9ueW0gZm9yIEdSVUIuCisKK1NvLCBpZiB5b3UgZXZlciBoZWFyIHBlb3BsZSB0YWxraW5nIGFib3V0IHRoZWlyIGFsbGVnZWQgYGBHTlUnJyBzeXN0ZW1zLAorcmVtZW1iZXIgdGhhdCB0aGV5IGFyZSBhY3R1YWxseSBwYXlpbmcgaG9tYWdlIHRvIHRoZSBiZXN0IGJvb3QgbG9hZGVyCithcm91bmRAZG90c3t9IEdSVUIhCitAZW5kIHF1b3RhdGlvbgorCitXZSwgdGhlIEdSVUIgbWFpbnRhaW5lcnMsIGRvIG5vdCAodXN1YWxseSkgZW5jb3VyYWdlIEdvcmRvbidzIGxldmVsIG9mCitmYW5hdGljaXNtLCBidXQgaXQgaGVscHMgdG8gcmVtZW1iZXIgdGhhdCBib290IGxvYWRlcnMgZGVzZXJ2ZQorcmVjb2duaXRpb24uICBXZSBob3BlIHRoYXQgeW91IGVuam95IHVzaW5nIEdOVSBHUlVCIGFzIG11Y2ggYXMgd2UgZGlkCit3cml0aW5nIGl0LgorCisKK0Bub2RlIE5hbWluZyBjb252ZW50aW9uCitAY2hhcHRlciBOYW1pbmcgY29udmVudGlvbgorCitUaGUgZGV2aWNlIHN5bnRheCB1c2VkIGluIEdSVUIgaXMgYSB3ZWUgYml0IGRpZmZlcmVudCBmcm9tIHdoYXQgeW91IG1heQoraGF2ZSBzZWVuIGJlZm9yZSBpbiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0ocyksIGFuZCB5b3UgbmVlZCB0byBrbm93IGl0IHNvCit0aGF0IHlvdSBjYW4gc3BlY2lmeSBhIGRyaXZlL3BhcnRpdGlvbi4KKworTG9vayBhdCB0aGUgZm9sbG93aW5nIGV4YW1wbGVzIGFuZCBleHBsYW5hdGlvbnM6CisKK0BleGFtcGxlCisoZmQwKQorQGVuZCBleGFtcGxlCisKK0ZpcnN0IG9mIGFsbCwgR1JVQiByZXF1aXJlcyB0aGF0IHRoZSBkZXZpY2UgbmFtZSBiZSBlbmNsb3NlZCB3aXRoCitAc2FtcHsofSBhbmQgQHNhbXB7KX0uIFRoZSBAc2FtcHtmZH0gcGFydCBtZWFucyB0aGF0IGl0IGlzIGEgZmxvcHB5CitkaXNrLiBUaGUgbnVtYmVyIEBzYW1wezB9IGlzIHRoZSBkcml2ZSBudW1iZXIsIHdoaWNoIGlzIGNvdW50ZWQgZnJvbQorQGVtcGh7emVyb30uIFRoaXMgZXhwcmVzc2lvbiBtZWFucyB0aGF0IEdSVUIgd2lsbCB1c2UgdGhlIHdob2xlIGZsb3BweQorZGlzay4KKworQGV4YW1wbGUKKyhoZDAsMSkKK0BlbmQgZXhhbXBsZQorCitIZXJlLCBAc2FtcHtoZH0gbWVhbnMgaXQgaXMgYSBoYXJkIGRpc2sgZHJpdmUuIFRoZSBmaXJzdCBpbnRlZ2VyCitAc2FtcHswfSBpbmRpY2F0ZXMgdGhlIGRyaXZlIG51bWJlciwgdGhhdCBpcywgdGhlIGZpcnN0IGhhcmQgZGlzaywgd2hpbGUKK3RoZSBzZWNvbmQgaW50ZWdlciwgQHNhbXB7MX0sIGluZGljYXRlcyB0aGUgcGFydGl0aW9uIG51bWJlciAob3IgdGhlCitAc2N7cGN9IHNsaWNlIG51bWJlciBpbiB0aGUgQlNEIHRlcm1pbm9sb2d5KS4gT25jZSBhZ2FpbiwgcGxlYXNlIG5vdGUKK3RoYXQgdGhlIHBhcnRpdGlvbiBudW1iZXJzIGFyZSBjb3VudGVkIGZyb20gQGVtcGh7emVyb30sIG5vdCBmcm9tCitvbmUuIFRoaXMgZXhwcmVzc2lvbiBtZWFucyB0aGUgc2Vjb25kIHBhcnRpdGlvbiBvZiB0aGUgZmlyc3QgaGFyZCBkaXNrCitkcml2ZS4gSW4gdGhpcyBjYXNlLCBHUlVCIHVzZXMgb25lIHBhcnRpdGlvbiBvZiB0aGUgZGlzaywgaW5zdGVhZCBvZiB0aGUKK3dob2xlIGRpc2suCisKK0BleGFtcGxlCisoaGQwLDQpCitAZW5kIGV4YW1wbGUKKworVGhpcyBzcGVjaWZpZXMgdGhlIGZpcnN0IEBkZm57ZXh0ZW5kZWQgcGFydGl0aW9ufSBvZiB0aGUgZmlyc3QgaGFyZCBkaXNrCitkcml2ZS4gTm90ZSB0aGF0IHRoZSBwYXJ0aXRpb24gbnVtYmVycyBmb3IgZXh0ZW5kZWQgcGFydGl0aW9ucyBhcmUKK2NvdW50ZWQgZnJvbSBAc2FtcHs0fSwgcmVnYXJkbGVzcyBvZiB0aGUgYWN0dWFsIG51bWJlciBvZiBwcmltYXJ5CitwYXJ0aXRpb25zIG9uIHlvdXIgaGFyZCBkaXNrLgorCitAZXhhbXBsZQorKGhkMSxhKQorQGVuZCBleGFtcGxlCisKK1RoaXMgbWVhbnMgdGhlIEJTRCBAc2FtcHthfSBwYXJ0aXRpb24gb2YgdGhlIHNlY29uZCBoYXJkIGRpc2suIElmIHlvdQorbmVlZCB0byBzcGVjaWZ5IHdoaWNoIEBzY3twY30gc2xpY2UgbnVtYmVyIHNob3VsZCBiZSB1c2VkLCB1c2Ugc29tZXRoaW5nCitsaWtlIHRoaXM6IEBzYW1weyhoZDEsMCxhKX0uIElmIHRoZSBAc2N7cGN9IHNsaWNlIG51bWJlciBpcyBvbWl0dGVkLAorR1JVQiBzZWFyY2hlcyBmb3IgdGhlIGZpcnN0IEBzY3twY30gc2xpY2Ugd2hpY2ggaGFzIGEgQlNEIEBzYW1we2F9CitwYXJ0aXRpb24uCisKK09mIGNvdXJzZSwgdG8gYWN0dWFsbHkgYWNjZXNzIHRoZSBkaXNrcyBvciBwYXJ0aXRpb25zIHdpdGggR1JVQiwgeW91CituZWVkIHRvIHVzZSB0aGUgZGV2aWNlIHNwZWNpZmljYXRpb24gaW4gYSBjb21tYW5kLCBsaWtlIEBzYW1we3Jvb3QKKyhmZDApfSBvciBAc2FtcHt1bmhpZGUgKGhkMCwyKX0uIFRvIGhlbHAgeW91IGZpbmQgb3V0IHdoaWNoIG51bWJlcgorc3BlY2lmaWVzIGEgcGFydGl0aW9uIHlvdSB3YW50LCB0aGUgR1JVQiBjb21tYW5kLWxpbmUKKyhAcHhyZWZ7Q29tbWFuZC1saW5lIGludGVyZmFjZX0pIG9wdGlvbnMgaGF2ZSBhcmd1bWVudAorY29tcGxldGlvbi4gVGhpcyBtZWFucyB0aGF0LCBmb3IgZXhhbXBsZSwgeW91IG9ubHkgbmVlZCB0byB0eXBlCisKK0BleGFtcGxlCityb290ICgKK0BlbmQgZXhhbXBsZQorCitmb2xsb3dlZCBieSBhIEBrZXl7VEFCfSwgYW5kIEdSVUIgd2lsbCBkaXNwbGF5IHRoZSBsaXN0IG9mIGRyaXZlcywKK3BhcnRpdGlvbnMsIG9yIGZpbGUgbmFtZXMuIFNvIGl0IHNob3VsZCBiZSBxdWl0ZSBlYXN5IHRvIGRldGVybWluZSB0aGUKK25hbWUgb2YgeW91ciB0YXJnZXQgcGFydGl0aW9uLCBldmVuIHdpdGggbWluaW1hbCBrbm93bGVkZ2Ugb2YgdGhlCitzeW50YXguCisKK05vdGUgdGhhdCBHUlVCIGRvZXMgQGVtcGh7bm90fSBkaXN0aW5ndWlzaCBJREUgZnJvbSBTQ1NJIC0gaXQgc2ltcGx5Citjb3VudHMgdGhlIGRyaXZlIG51bWJlcnMgZnJvbSB6ZXJvLCByZWdhcmRsZXNzIG9mIHRoZWlyIHR5cGUuIE5vcm1hbGx5LAorYW55IElERSBkcml2ZSBudW1iZXIgaXMgbGVzcyB0aGFuIGFueSBTQ1NJIGRyaXZlIG51bWJlciwgYWx0aG91Z2ggdGhhdAoraXMgbm90IHRydWUgaWYgeW91IGNoYW5nZSB0aGUgYm9vdCBzZXF1ZW5jZSBieSBzd2FwcGluZyBJREUgYW5kIFNDU0kKK2RyaXZlcyBpbiB5b3VyIEJJT1MuCisKK05vdyB0aGUgcXVlc3Rpb24gaXMsIGhvdyB0byBzcGVjaWZ5IGEgZmlsZT8gQWdhaW4sIGNvbnNpZGVyIGFuCitleGFtcGxlOgorCitAZXhhbXBsZQorKGhkMCwwKS92bWxpbnV6CitAZW5kIGV4YW1wbGUKKworVGhpcyBzcGVjaWZpZXMgdGhlIGZpbGUgbmFtZWQgQHNhbXB7dm1saW51en0sIGZvdW5kIG9uIHRoZSBmaXJzdAorcGFydGl0aW9uIG9mIHRoZSBmaXJzdCBoYXJkIGRpc2sgZHJpdmUuIE5vdGUgdGhhdCB0aGUgYXJndW1lbnQKK2NvbXBsZXRpb24gd29ya3Mgd2l0aCBmaWxlIG5hbWVzLCB0b28uCisKK1RoYXQgd2FzIGVhc3ksIGFkbWl0IGl0LiBOb3cgcmVhZCB0aGUgbmV4dCBjaGFwdGVyLCB0byBmaW5kIG91dCBob3cgdG8KK2FjdHVhbGx5IGluc3RhbGwgR1JVQiBvbiB5b3VyIGRyaXZlLgorCisKK0Bub2RlIEluc3RhbGxhdGlvbgorQGNoYXB0ZXIgSW5zdGFsbGF0aW9uCisKK0luIG9yZGVyIHRvIGluc3RhbGwgR1JVQiBhcyB5b3VyIGJvb3QgbG9hZGVyLCB5b3UgbmVlZCB0byBmaXJzdAoraW5zdGFsbCB0aGUgR1JVQiBzeXN0ZW0gYW5kIHV0aWxpdGllcyB1bmRlciB5b3VyIFVOSVgtbGlrZSBvcGVyYXRpbmcKK3N5c3RlbSAoQHB4cmVme09idGFpbmluZyBhbmQgQnVpbGRpbmcgR1JVQn0pLiBZb3UgY2FuIGRvIHRoaXMgZWl0aGVyCitmcm9tIHRoZSBzb3VyY2UgdGFyYmFsbCwgb3IgYXMgYSBwYWNrYWdlIGZvciB5b3VyIE9TLgorCitBZnRlciB5b3UgaGF2ZSBkb25lIHRoYXQsIHlvdSBuZWVkIHRvIGluc3RhbGwgdGhlIGJvb3QgbG9hZGVyIG9uIGEKK2RyaXZlIChmbG9wcHkgb3IgaGFyZCBkaXNrKS4gVGhlcmUgYXJlIHR3byB3YXlzIG9mIGRvaW5nIHRoYXQgLSBlaXRoZXIKK3VzaW5nIHRoZSB1dGlsaXR5IEBjb21tYW5ke2dydWItaW5zdGFsbH0gKEBweHJlZntJbnZva2luZworZ3J1Yi1pbnN0YWxsfSkgb24gYSBVTklYLWxpa2UgT1MsIG9yIGJ5IHJ1bm5pbmcgR1JVQiBpdHNlbGYgZnJvbSBhCitmbG9wcHkuIFRoZXNlIGFyZSBxdWl0ZSBzaW1pbGFyLCBob3dldmVyIHRoZSB1dGlsaXR5IG1pZ2h0IHByb2JlIGEKK3dyb25nIEJJT1MgZHJpdmUsIHNvIHlvdSBzaG91bGQgYmUgY2FyZWZ1bC4KKworQWxzbywgaWYgeW91IGluc3RhbGwgR1JVQiBvbiBhIFVOSVgtbGlrZSBPUywgcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSBhbiBlbWVyZ2VuY3kgYm9vdCBkaXNrIHJlYWR5LCBzbyB0aGF0IHlvdSBjYW4gcmVzY3VlIHlvdXIgY29tcHV0ZXIKK2lmLCBieSBhbnkgY2hhbmNlLCB5b3VyIGhhcmQgZHJpdmUgYmVjb21lcyB1bnVzYWJsZSAodW5ib290YWJsZSkuCisKK0dSVUIgY29tZXMgd2l0aCBib290IGltYWdlcywgd2hpY2ggYXJlIG5vcm1hbGx5IHB1dCBpbiB0aGUgZGlyZWN0b3J5CitAZmlsZXsvdXNyL2xpYi9ncnViL2kzODYtcGN9LiBJZiB5b3UgZG8gbm90IHVzZSBncnViLWluc3RhbGwsIHRoZW4KK3lvdSBuZWVkIHRvIGNvcHkgdGhlIGZpbGVzIEBmaWxle3N0YWdlMX0sIEBmaWxle3N0YWdlMn0sIGFuZAorQGZpbGV7KnN0YWdlMV81fSB0byB0aGUgZGlyZWN0b3J5IEBmaWxley9ib290L2dydWJ9LCBhbmQgcnVuIHRoZQorQGNvbW1hbmR7Z3J1Yi1zZXQtZGVmYXVsdH0gKEBweHJlZntJbnZva2luZyBncnViLXNldC1kZWZhdWx0fSkgaWYgeW91CitpbnRlbmQgdG8gdXNlIEBzYW1we2RlZmF1bHQgc2F2ZWR9IChAcHhyZWZ7ZGVmYXVsdH0pIGluIHlvdXIKK2NvbmZpZ3VyYXRpb24gZmlsZS4gSGVyZWFmdGVyLCB0aGUgZGlyZWN0b3J5IHdoZXJlIEdSVUIgaW1hZ2VzIGFyZQoraW5pdGlhbGx5IHBsYWNlZCAobm9ybWFsbHkgQGZpbGV7L3Vzci9saWIvZ3J1Yi9pMzg2LXBjfSkgd2lsbCBiZQorY2FsbGVkIHRoZSBAZGZue2ltYWdlIGRpcmVjdG9yeX0sIGFuZCB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBib290Citsb2FkZXIgbmVlZHMgdG8gZmluZCB0aGVtICh1c3VhbGx5IEBmaWxley9ib290L2dydWJ9KSB3aWxsIGJlIGNhbGxlZAordGhlIEBkZm57Ym9vdCBkaXJlY3Rvcnl9LgorCitAbWVudQorKiBDcmVhdGluZyBhIEdSVUIgYm9vdCBmbG9wcHk6OgorKiBJbnN0YWxsaW5nIEdSVUIgbmF0aXZlbHk6OgorKiBJbnN0YWxsaW5nIEdSVUIgdXNpbmcgZ3J1Yi1pbnN0YWxsOjoKKyogTWFraW5nIGEgR1JVQiBib290YWJsZSBDRC1ST006OgorQGVuZCBtZW51CisKKworQG5vZGUgQ3JlYXRpbmcgYSBHUlVCIGJvb3QgZmxvcHB5CitAc2VjdGlvbiBDcmVhdGluZyBhIEdSVUIgYm9vdCBmbG9wcHkKKworVG8gY3JlYXRlIGEgR1JVQiBib290IGZsb3BweSwgeW91IG5lZWQgdG8gdGFrZSB0aGUgZmlsZXMgQGZpbGV7c3RhZ2UxfQorYW5kIEBmaWxle3N0YWdlMn0gZnJvbSB0aGUgaW1hZ2UgZGlyZWN0b3J5LCBhbmQgd3JpdGUgdGhlbSB0byB0aGUgZmlyc3QKK2FuZCB0aGUgc2Vjb25kIGJsb2NrIG9mIHRoZSBmbG9wcHkgZGlzaywgcmVzcGVjdGl2ZWx5LgorCitAc3Ryb25ne0NhdXRpb246fSBUaGlzIHByb2NlZHVyZSB3aWxsIGRlc3Ryb3kgYW55IGRhdGEgY3VycmVudGx5IHN0b3JlZAorb24gdGhlIGZsb3BweS4KKworT24gYSBVTklYLWxpa2Ugb3BlcmF0aW5nIHN5c3RlbSwgdGhhdCBpcyBkb25lIHdpdGggdGhlIGZvbGxvd2luZworY29tbWFuZHM6CisKK0BleGFtcGxlCitAZ3JvdXAKKyMgQGtiZHtjZCAvdXNyL2xpYi9ncnViL2kzODYtcGN9CisjIEBrYmR7ZGQgaWY9c3RhZ2UxIG9mPS9kZXYvZmQwIGJzPTUxMiBjb3VudD0xfQorMSswIHJlY29yZHMgaW4KKzErMCByZWNvcmRzIG91dAorIyBAa2Jke2RkIGlmPXN0YWdlMiBvZj0vZGV2L2ZkMCBicz01MTIgc2Vlaz0xfQorMTUzKzEgcmVjb3JkcyBpbgorMTUzKzEgcmVjb3JkcyBvdXQKKyMKK0BlbmQgZ3JvdXAKK0BlbmQgZXhhbXBsZQorCitUaGUgZGV2aWNlIGZpbGUgbmFtZSBtYXkgYmUgZGlmZmVyZW50LiBDb25zdWx0IHRoZSBtYW51YWwgZm9yIHlvdXIgT1MuCisKKworQG5vZGUgSW5zdGFsbGluZyBHUlVCIG5hdGl2ZWx5CitAc2VjdGlvbiBJbnN0YWxsaW5nIEdSVUIgbmF0aXZlbHkKKworQHN0cm9uZ3tDYXV0aW9uOn0gSW5zdGFsbGluZyBHUlVCJ3Mgc3RhZ2UxIGluIHRoaXMgbWFubmVyIHdpbGwgZXJhc2UgdGhlCitub3JtYWwgYm9vdC1zZWN0b3IgdXNlZCBieSBhbiBPUy4KKworR1JVQiBjYW4gY3VycmVudGx5IGJvb3QgR05VIE1hY2gsIExpbnV4LCBGcmVlQlNELCBOZXRCU0QsIGFuZCBPcGVuQlNECitkaXJlY3RseSwgc28gdXNpbmcgaXQgb24gYSBib290IHNlY3RvciAodGhlIGZpcnN0IHNlY3RvciBvZiBhCitwYXJ0aXRpb24pIHNob3VsZCBiZSBva2F5LiBCdXQgZ2VuZXJhbGx5LCBpdCB3b3VsZCBiZSBhIGdvb2QgaWRlYSB0bworYmFjayB1cCB0aGUgZmlyc3Qgc2VjdG9yIG9mIHRoZSBwYXJ0aXRpb24gb24gd2hpY2ggeW91IGFyZSBpbnN0YWxsaW5nCitHUlVCJ3Mgc3RhZ2UxLiBUaGlzIGlzbid0IGFzIGltcG9ydGFudCBpZiB5b3UgYXJlIGluc3RhbGxpbmcgR1JVQiBvbgordGhlIGZpcnN0IHNlY3RvciBvZiBhIGhhcmQgZGlzaywgc2luY2UgaXQncyBlYXN5IHRvIHJlaW5pdGlhbGl6ZSBpdAorKGUuZy4gYnkgcnVubmluZyBAc2FtcHtGRElTSyAvTUJSfSBmcm9tIERPUykuCisKK0lmIHlvdSBkZWNpZGUgdG8gaW5zdGFsbCBHUlVCIGluIHRoZSBuYXRpdmUgZW52aXJvbm1lbnQsIHdoaWNoIGlzCitkZWZpbml0ZWx5IGRlc2lyYWJsZSwgeW91J2xsIG5lZWQgdG8gY3JlYXRlIGEgR1JVQiBib290IGRpc2ssIGFuZAorcmVib290IHlvdXIgY29tcHV0ZXIgd2l0aCBpdC4gT3RoZXJ3aXNlLCBzZWUgQHJlZntJbnN0YWxsaW5nIEdSVUIgdXNpbmcKK2dydWItaW5zdGFsbH0uCisKK09uY2Ugc3RhcnRlZCwgR1JVQiB3aWxsIHNob3cgdGhlIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UKKyhAcHhyZWZ7Q29tbWFuZC1saW5lIGludGVyZmFjZX0pLiBGaXJzdCwgc2V0IHRoZSBHUlVCJ3MgQGRmbntyb290CitkZXZpY2V9QGZvb3Rub3Rle05vdGUgdGhhdCBHUlVCJ3Mgcm9vdCBkZXZpY2UgZG9lc24ndCBuZWNlc3NhcmlseSBtZWFuCit5b3VyIE9TJ3Mgcm9vdCBwYXJ0aXRpb247IGlmIHlvdSBuZWVkIHRvIHNwZWNpZnkgYSByb290IHBhcnRpdGlvbiBmb3IKK3lvdXIgT1MsIGFkZCB0aGUgYXJndW1lbnQgaW50byB0aGUgY29tbWFuZCBAY29tbWFuZHtrZXJuZWx9Ln0gdG8gdGhlCitwYXJ0aXRpb24gY29udGFpbmluZyB0aGUgYm9vdCBkaXJlY3RvcnksIGxpa2UgdGhpczoKKworQGV4YW1wbGUKK2dydWI+IEBrYmR7cm9vdCAoaGQwLDApfQorQGVuZCBleGFtcGxlCisKK0lmIHlvdSBhcmUgbm90IHN1cmUgd2hpY2ggcGFydGl0aW9uIGFjdHVhbGx5IGhvbGRzIHRoaXMgZGlyZWN0b3J5LCB1c2UgdGhlCitjb21tYW5kIEBjb21tYW5ke2ZpbmR9IChAcHhyZWZ7ZmluZH0pLCBsaWtlIHRoaXM6CisKK0BleGFtcGxlCitncnViPiBAa2Jke2ZpbmQgL2Jvb3QvZ3J1Yi9zdGFnZTF9CitAZW5kIGV4YW1wbGUKKworVGhpcyB3aWxsIHNlYXJjaCBmb3IgdGhlIGZpbGUgbmFtZSBAZmlsZXsvYm9vdC9ncnViL3N0YWdlMX0gYW5kIHNob3cgdGhlCitkZXZpY2VzIHdoaWNoIGNvbnRhaW4gdGhlIGZpbGUuCisKK09uY2UgeW91J3ZlIHNldCB0aGUgcm9vdCBkZXZpY2UgY29ycmVjdGx5LCBydW4gdGhlIGNvbW1hbmQKK0Bjb21tYW5ke3NldHVwfSAoQHB4cmVme3NldHVwfSk6CisKK0BleGFtcGxlCitncnViPiBAa2Jke3NldHVwIChoZDApfQorQGVuZCBleGFtcGxlCisKK1RoaXMgY29tbWFuZCB3aWxsIGluc3RhbGwgdGhlIEdSVUIgYm9vdCBsb2FkZXIgb24gdGhlIE1hc3RlciBCb290CitSZWNvcmQgKE1CUikgb2YgdGhlIGZpcnN0IGRyaXZlLiBJZiB5b3Ugd2FudCB0byBwdXQgR1JVQiBpbnRvIHRoZSBib290CitzZWN0b3Igb2YgYSBwYXJ0aXRpb24gaW5zdGVhZCBvZiBwdXR0aW5nIGl0IGluIHRoZSBNQlIsIHNwZWNpZnkgdGhlCitwYXJ0aXRpb24gaW50byB3aGljaCB5b3Ugd2FudCB0byBpbnN0YWxsIEdSVUI6CisKK0BleGFtcGxlCitncnViPiBAa2Jke3NldHVwIChoZDAsMCl9CitAZW5kIGV4YW1wbGUKKworSWYgeW91IGluc3RhbGwgR1JVQiBpbnRvIGEgcGFydGl0aW9uIG9yIGEgZHJpdmUgb3RoZXIgdGhhbiB0aGUgZmlyc3QKK29uZSwgeW91IG11c3QgY2hhaW4tbG9hZCBHUlVCIGZyb20gYW5vdGhlciBib290IGxvYWRlci4gUmVmZXIgdG8gdGhlCittYW51YWwgZm9yIHRoZSBib290IGxvYWRlciB0byBrbm93IGhvdyB0byBjaGFpbi1sb2FkIEdSVUIuCisKK0FmdGVyIHVzaW5nIHRoZSBzZXR1cCBjb21tYW5kLCB5b3Ugd2lsbCBib290IGludG8gR1JVQiB3aXRob3V0IHRoZQorR1JVQiBmbG9wcHkuIFNlZSB0aGUgY2hhcHRlciBAcmVme0Jvb3Rpbmd9IHRvIGZpbmQgb3V0IGhvdyB0byBib290Cit5b3VyIG9wZXJhdGluZyBzeXN0ZW1zIGZyb20gR1JVQi4KKworCitAbm9kZSBJbnN0YWxsaW5nIEdSVUIgdXNpbmcgZ3J1Yi1pbnN0YWxsCitAc2VjdGlvbiBJbnN0YWxsaW5nIEdSVUIgdXNpbmcgZ3J1Yi1pbnN0YWxsCisKK0BzdHJvbmd7Q2F1dGlvbjp9IFRoaXMgcHJvY2VkdXJlIGlzIGRlZmluaXRlbHkgbGVzcyBzYWZlLCBiZWNhdXNlCit0aGVyZSBhcmUgc2V2ZXJhbCB3YXlzIGluIHdoaWNoIHlvdXIgY29tcHV0ZXIgY2FuIGJlY29tZQordW5ib290YWJsZS4gRm9yIGV4YW1wbGUsIG1vc3Qgb3BlcmF0aW5nIHN5c3RlbXMgZG9uJ3QgdGVsbCBHUlVCIGhvdyB0bworbWFwIEJJT1MgZHJpdmVzIHRvIE9TIGRldmljZXMgY29ycmVjdGx5LS0tR1JVQiBtZXJlbHkgQGRmbntndWVzc2VzfQordGhlIG1hcHBpbmcuIFRoaXMgd2lsbCBzdWNjZWVkIGluIG1vc3QgY2FzZXMsIGJ1dCBub3QKK2Fsd2F5cy4gVGhlcmVmb3JlLCBHUlVCIHByb3ZpZGVzIHlvdSB3aXRoIGEgbWFwIGZpbGUgY2FsbGVkIHRoZQorQGRmbntkZXZpY2UgbWFwfSwgd2hpY2ggeW91IG11c3QgZml4IGlmIGl0IGlzIHdyb25nLiBAeHJlZntEZXZpY2UKK21hcH0sIGZvciBtb3JlIGRldGFpbHMuCisKK0lmIHlvdSBzdGlsbCBkbyB3YW50IHRvIGluc3RhbGwgR1JVQiB1bmRlciBhIFVOSVgtbGlrZSBPUyAoc3VjaAorYXMgQHNje2dudX0pLCBpbnZva2UgdGhlIHByb2dyYW0gQGNvbW1hbmR7Z3J1Yi1pbnN0YWxsfSAoQHB4cmVme0ludm9raW5nCitncnViLWluc3RhbGx9KSBhcyB0aGUgc3VwZXJ1c2VyIChAZGZue3Jvb3R9KS4KKworVGhlIHVzYWdlIGlzIGJhc2ljYWxseSB2ZXJ5IHNpbXBsZS4gWW91IG9ubHkgbmVlZCB0byBzcGVjaWZ5IG9uZQorYXJndW1lbnQgdG8gdGhlIHByb2dyYW0sIG5hbWVseSwgd2hlcmUgdG8gaW5zdGFsbCB0aGUgYm9vdCBsb2FkZXIuIFRoZQorYXJndW1lbnQgY2FuIGJlIGVpdGhlciBhIGRldmljZSBmaWxlIChsaWtlIEBzYW1wey9kZXYvaGRhfSkgb3IgYQorcGFydGl0aW9uIHNwZWNpZmllZCBpbiBHUlVCJ3Mgbm90YXRpb24uIEZvciBleGFtcGxlLCB1bmRlciBMaW51eCB0aGUKK2ZvbGxvd2luZyB3aWxsIGluc3RhbGwgR1JVQiBpbnRvIHRoZSBNQlIgb2YgdGhlIGZpcnN0IElERSBkaXNrOgorCitAZXhhbXBsZQorIyBAa2Jke2dydWItaW5zdGFsbCAvZGV2L2hkYX0KK0BlbmQgZXhhbXBsZQorCitMaWtld2lzZSwgdW5kZXIgR05VL0h1cmQsIHRoaXMgaGFzIHRoZSBzYW1lIGVmZmVjdDoKKworQGV4YW1wbGUKKyMgQGtiZHtncnViLWluc3RhbGwgL2Rldi9oZDB9CitAZW5kIGV4YW1wbGUKKworSWYgaXQgaXMgdGhlIGZpcnN0IEJJT1MgZHJpdmUsIHRoaXMgaXMgdGhlIHNhbWUgYXMgd2VsbDoKKworQGV4YW1wbGUKKyMgQGtiZHtncnViLWluc3RhbGwgJyhoZDApJ30KK0BlbmQgZXhhbXBsZQorCitPciB5b3UgY2FuIG9taXQgdGhlIHBhcmVudGhlc2VzOgorCitAZXhhbXBsZQorIyBAa2Jke2dydWItaW5zdGFsbCBoZDB9CitAZW5kIGV4YW1wbGUKKworQnV0IGFsbCB0aGUgYWJvdmUgZXhhbXBsZXMgYXNzdW1lIHRoYXQgR1JVQiBzaG91bGQgdXNlIGltYWdlcyB1bmRlcgordGhlIHJvb3QgZGlyZWN0b3J5LiBJZiB5b3Ugd2FudCBHUlVCIHRvIHVzZSBpbWFnZXMgdW5kZXIgYSBkaXJlY3RvcnkKK290aGVyIHRoYW4gdGhlIHJvb3QgZGlyZWN0b3J5LCB5b3UgbmVlZCB0byBzcGVjaWZ5IHRoZSBvcHRpb24KK0BvcHRpb257LS1yb290LWRpcmVjdG9yeX0uIFRoZSB0eXBpY2FsIHVzYWdlIGlzIHRoYXQgeW91IGNyZWF0ZSBhIEdSVUIKK2Jvb3QgZmxvcHB5IHdpdGggYSBmaWxlc3lzdGVtLiBIZXJlIGlzIGFuIGV4YW1wbGU6CisKK0BleGFtcGxlCitAZ3JvdXAKKyMgQGtiZHtta2UyZnMgL2Rldi9mZDB9CisjIEBrYmR7bW91bnQgLXQgZXh0MiAvZGV2L2ZkMCAvbW50fQorIyBAa2Jke2dydWItaW5zdGFsbCAtLXJvb3QtZGlyZWN0b3J5PS9tbnQgZmQwfQorIyBAa2Jke3Vtb3VudCAvbW50fQorQGVuZCBncm91cAorQGVuZCBleGFtcGxlCisKK0Fub3RoZXIgZXhhbXBsZSBpcyB3aGVuIHlvdSBoYXZlIGEgc2VwYXJhdGUgYm9vdCBwYXJ0aXRpb24KK3doaWNoIGlzIG1vdW50ZWQgYXQgQGZpbGV7L2Jvb3R9LiBTaW5jZSBHUlVCIGlzIGEgYm9vdCBsb2FkZXIsIGl0Citkb2Vzbid0IGtub3cgYW55dGhpbmcgYWJvdXQgbW91bnRwb2ludHMgYXQgYWxsLiBUaHVzLCB5b3UgbmVlZCB0byBydW4KK0Bjb21tYW5ke2dydWItaW5zdGFsbH0gbGlrZSB0aGlzOgorCitAZXhhbXBsZQorIyBAa2Jke2dydWItaW5zdGFsbCAtLXJvb3QtZGlyZWN0b3J5PS9ib290IC9kZXYvaGRhfQorQGVuZCBleGFtcGxlCisKK0J5IHRoZSB3YXksIGFzIG5vdGVkIGFib3ZlLCBpdCBpcyBxdWl0ZSBkaWZmaWN1bHQgdG8gZ3Vlc3MgQklPUyBkcml2ZXMKK2NvcnJlY3RseSB1bmRlciBhIFVOSVgtbGlrZSBPUy4gVGh1cywgQGNvbW1hbmR7Z3J1Yi1pbnN0YWxsfSB3aWxsIHByb21wdAoreW91IHRvIGNoZWNrIGlmIGl0IGNvdWxkIHJlYWxseSBndWVzcyB0aGUgY29ycmVjdCBtYXBwaW5ncywgYWZ0ZXIgdGhlCitpbnN0YWxsYXRpb24uIFRoZSBmb3JtYXQgaXMgZGVmaW5lZCBpbiBAcmVme0RldmljZSBtYXB9LiBQbGVhc2UgYmUKK3F1aXRlIGNhcmVmdWwuIElmIHRoZSBvdXRwdXQgaXMgd3JvbmcsIGl0IGlzIHVubGlrZWx5IHRoYXQgeW91cgorY29tcHV0ZXIgd2lsbCBiZSBhYmxlIHRvIGJvb3Qgd2l0aCBubyBwcm9ibGVtLgorCitOb3RlIHRoYXQgQGNvbW1hbmR7Z3J1Yi1pbnN0YWxsfSBpcyBhY3R1YWxseSBqdXN0IGEgc2hlbGwgc2NyaXB0IGFuZCB0aGUKK3JlYWwgdGFzayBpcyBkb25lIGJ5IHRoZSBncnViIHNoZWxsIEBjb21tYW5ke2dydWJ9IChAcHhyZWZ7SW52b2tpbmcgdGhlCitncnViIHNoZWxsfSkuIFRoZXJlZm9yZSwgeW91IG1heSBydW4gQGNvbW1hbmR7Z3J1Yn0gZGlyZWN0bHkgdG8gaW5zdGFsbAorR1JVQiwgd2l0aG91dCB1c2luZyBAY29tbWFuZHtncnViLWluc3RhbGx9LiBEb24ndCBkbyB0aGF0LCBob3dldmVyLAordW5sZXNzIHlvdSBhcmUgdmVyeSBmYW1pbGlhciB3aXRoIHRoZSBpbnRlcm5hbHMgb2YgR1JVQi4gSW5zdGFsbGluZyBhCitib290IGxvYWRlciBvbiBhIHJ1bm5pbmcgT1MgbWF5IGJlIGV4dHJlbWVseSBkYW5nZXJvdXMuCisKKworQG5vZGUgTWFraW5nIGEgR1JVQiBib290YWJsZSBDRC1ST00KK0BzZWN0aW9uIE1ha2luZyBhIEdSVUIgYm9vdGFibGUgQ0QtUk9NCisKK0dSVUIgc3VwcG9ydHMgdGhlIEBkZm57bm8gZW11bGF0aW9uIG1vZGV9IGluIHRoZSBFbCBUb3JpdG8KK3NwZWNpZmljYXRpb25AZm9vdG5vdGV7RWwgVG9yaXRvIGlzIGEgc3BlY2lmaWNhdGlvbiBmb3IgYm9vdGFibGUgQ0QKK3VzaW5nIEJJT1MgZnVuY3Rpb25zLn0uIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIHVzZSB0aGUgd2hvbGUgQ0QtUk9NCitmcm9tIEdSVUIgYW5kIHlvdSBkb24ndCBoYXZlIHRvIG1ha2UgYSBmbG9wcHkgb3IgaGFyZCBkaXNrIGltYWdlIGZpbGUsCit3aGljaCBjYW4gY2F1c2UgY29tcGF0aWJpbGl0eSBwcm9ibGVtcy4KKworRm9yIGJvb3RpbmcgZnJvbSBhIENELVJPTSwgR1JVQiB1c2VzIGEgc3BlY2lhbCBTdGFnZSAyIGNhbGxlZAorQGZpbGV7c3RhZ2UyX2VsdG9yaXRvfS4gVGhlIG9ubHkgR1JVQiBmaWxlcyB5b3UgbmVlZCB0byBoYXZlIGluIHlvdXIgCitib290YWJsZSBDRC1ST00gYXJlIHRoaXMgQGZpbGV7c3RhZ2UyX2VsdG9yaXRvfSBhbmQgb3B0aW9uYWxseSBhIGNvbmZpZyBmaWxlCitAZmlsZXttZW51LmxzdH0uIFlvdSBkb24ndCBuZWVkIHRvIHVzZSBAZmlsZXtzdGFnZTF9IG9yIEBmaWxle3N0YWdlMn0sCitiZWNhdXNlIEVsIFRvcml0byBpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgc3RhbmRhcmQgYm9vdCBwcm9jZXNzLgorCitIZXJlIGlzIGFuIGV4YW1wbGUgb2YgcHJvY2VkdXJlcyB0byBtYWtlIGEgYm9vdGFibGUgQ0QtUk9NCitpbWFnZS4gRmlyc3QsIG1ha2UgYSB0b3AgZGlyZWN0b3J5IGZvciB0aGUgYm9vdGFibGUgaW1hZ2UsIHNheSwKK0BzYW1we2lzb306CisKK0BleGFtcGxlCiskIEBrYmR7bWtkaXIgaXNvfQorQGVuZCBleGFtcGxlCisKK01ha2UgYSBkaXJlY3RvcnkgZm9yIEdSVUI6CisKK0BleGFtcGxlCiskIEBrYmR7bWtkaXIgLXAgaXNvL2Jvb3QvZ3J1Yn0KK0BlbmQgZXhhbXBsZQorCitDb3B5IHRoZSBmaWxlIEBmaWxle3N0YWdlMl9lbHRvcml0b306CisKK0BleGFtcGxlCiskIEBrYmR7Y3AgL3Vzci9saWIvZ3J1Yi9pMzg2LXBjL3N0YWdlMl9lbHRvcml0byBpc28vYm9vdC9ncnVifQorQGVuZCBleGFtcGxlCisKK0lmIGRlc2lyZWQsIG1ha2UgdGhlIGNvbmZpZyBmaWxlIEBmaWxle21lbnUubHN0fSB1bmRlciBAZmlsZXtpc28vYm9vdC9ncnVifQorKEBweHJlZntDb25maWd1cmF0aW9ufSksIGFuZCBjb3B5IGFueSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgZm9yIHRoZSBkaXNjIHRvIHRoZQorZGlyZWN0b3J5IEBmaWxle2lzby99LgorCitGaW5hbGx5LCBtYWtlIGEgSVNPOTY2MCBpbWFnZSBmaWxlIGxpa2UgdGhpczoKKworQGV4YW1wbGUKKyQgQGtiZHtta2lzb2ZzIC1SIC1iIGJvb3QvZ3J1Yi9zdGFnZTJfZWx0b3JpdG8gLW5vLWVtdWwtYm9vdCBcCisgICAgLWJvb3QtbG9hZC1zaXplIDQgLWJvb3QtaW5mby10YWJsZSAtbyBncnViLmlzbyBpc299CitAZW5kIGV4YW1wbGUKKworVGhpcyBwcm9kdWNlcyBhIGZpbGUgbmFtZWQgQGZpbGV7Z3J1Yi5pc299LCB3aGljaCB0aGVuIGNhbiBiZSBidXJuZWQKK2ludG8gYSBDRCAob3IgYSBEVkQpLiAgQGtiZHtta2lzb2ZzfSBoYXMgYWxyZWFkeSBzZXQgdXAgdGhlIGRpc2MgdG8gYm9vdAorZnJvbSB0aGUgQGtiZHtib290L2dydWIvc3RhZ2UyX2VsdG9yaXRvfSBmaWxlLCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIAorc2V0dXAgR1JVQiBvbiB0aGUgZGlzYy4gIChOb3RlIHRoYXQgdGhlIEBrYmR7LWJvb3QtbG9hZC1zaXplIDR9IGJpdCBpcworcmVxdWlyZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgQklPUyBvbiBtYW55IG9sZGVyIG1hY2hpbmVzLikKKworWW91IGNhbiB1c2UgdGhlIGRldmljZSBAc2FtcHsoY2QpfSB0byBhY2Nlc3MgYSBDRC1ST00gaW4geW91cgorY29uZmlnIGZpbGUuIFRoaXMgaXMgbm90IHJlcXVpcmVkOyBHUlVCIGF1dG9tYXRpY2FsbHkgc2V0cyB0aGUgcm9vdCBkZXZpY2UgCit0byBAc2FtcHsoY2QpfSB3aGVuIGJvb3RlZCBmcm9tIGEgQ0QtUk9NLiBJdCBpcyBvbmx5IG5lY2Vzc2FyeSB0byByZWZlciB0byAKK0BzYW1weyhjZCl9IGlmIHlvdSB3YW50IHRvIGFjY2VzcyBvdGhlciBkcml2ZXMgYXMgd2VsbC4KKworCitAbm9kZSBCb290aW5nCitAY2hhcHRlciBCb290aW5nCisKK0dSVUIgY2FuIGxvYWQgTXVsdGlib290LWNvbXBsaWFudCBrZXJuZWxzIGluIGEgY29uc2lzdGVudCB3YXksCitidXQgZm9yIHNvbWUgZnJlZSBvcGVyYXRpbmcgc3lzdGVtcyB5b3UgbmVlZCB0byB1c2Ugc29tZSBPUy1zcGVjaWZpYworbWFnaWMuCisKK0BtZW51CisqIEdlbmVyYWwgYm9vdCBtZXRob2RzOjogICAgICAgIEhvdyB0byBib290IE9TZXMgd2l0aCBHUlVCIGdlbmVyYWxseQorKiBPUy1zcGVjaWZpYyBub3Rlczo6ICAgICAgICAgICBOb3RlcyBvbiBzb21lIG9wZXJhdGluZyBzeXN0ZW1zCisqIE1ha2luZyB5b3VyIHN5c3RlbSByb2J1c3Q6OiAgIEhvdyB0byBtYWtlIHlvdXIgc3lzdGVtIHJvYnVzdAorQGVuZCBtZW51CisKKworQG5vZGUgR2VuZXJhbCBib290IG1ldGhvZHMKK0BzZWN0aW9uIEhvdyB0byBib290IG9wZXJhdGluZyBzeXN0ZW1zCisKK0dSVUIgaGFzIHR3byBkaXN0aW5jdCBib290IG1ldGhvZHMuIE9uZSBvZiB0aGUgdHdvIGlzIHRvIGxvYWQgYW4KK29wZXJhdGluZyBzeXN0ZW0gZGlyZWN0bHksIGFuZCB0aGUgb3RoZXIgaXMgdG8gY2hhaW4tbG9hZCBhbm90aGVyIGJvb3QKK2xvYWRlciB3aGljaCB0aGVuIHdpbGwgbG9hZCBhbiBvcGVyYXRpbmcgc3lzdGVtIGFjdHVhbGx5LiBHZW5lcmFsbHkKK3NwZWFraW5nLCB0aGUgZm9ybWVyIGlzIG1vcmUgZGVzaXJhYmxlLCBiZWNhdXNlIHlvdSBkb24ndCBuZWVkIHRvCitpbnN0YWxsIG9yIG1haW50YWluIG90aGVyIGJvb3QgbG9hZGVycyBhbmQgR1JVQiBpcyBmbGV4aWJsZSBlbm91Z2ggdG8KK2xvYWQgYW4gb3BlcmF0aW5nIHN5c3RlbSBmcm9tIGFuIGFyYml0cmFyeSBkaXNrL3BhcnRpdGlvbi4gSG93ZXZlciwKK3RoZSBsYXR0ZXIgaXMgc29tZXRpbWVzIHJlcXVpcmVkLCBzaW5jZSBHUlVCIGRvZXNuJ3Qgc3VwcG9ydCBhbGwgdGhlCitleGlzdGluZyBvcGVyYXRpbmcgc3lzdGVtcyBuYXRpdmVseS4KKworQG1lbnUKKyogTG9hZGluZyBhbiBvcGVyYXRpbmcgc3lzdGVtIGRpcmVjdGx5OjoKKyogQ2hhaW4tbG9hZGluZzo6CitAZW5kIG1lbnUKKworCitAbm9kZSBMb2FkaW5nIGFuIG9wZXJhdGluZyBzeXN0ZW0gZGlyZWN0bHkKK0BzdWJzZWN0aW9uIEhvdyB0byBib290IGFuIE9TIGRpcmVjdGx5IHdpdGggR1JVQgorCitNdWx0aWJvb3QgKEBweHJlZntUb3AsIE11bHRpYm9vdCBTcGVjaWZpY2F0aW9uLCBNb3RpdmF0aW9uLCBtdWx0aWJvb3QsCitUaGUgTXVsdGlib290IFNwZWNpZmljYXRpb259KSBpcyB0aGUgbmF0aXZlIGZvcm1hdCBzdXBwb3J0ZWQgYnkgR1JVQi4KK0ZvciB0aGUgc2FrZSBvZiBjb252ZW5pZW5jZSwgdGhlcmUgaXMgYWxzbyBzdXBwb3J0IGZvciBMaW51eCwgRnJlZUJTRCwKK05ldEJTRCBhbmQgT3BlbkJTRC4gSWYgeW91IHdhbnQgdG8gYm9vdCBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcywgeW91Cit3aWxsIGhhdmUgdG8gY2hhaW4tbG9hZCB0aGVtIChAcHhyZWZ7Q2hhaW4tbG9hZGluZ30pLgorCitHZW5lcmFsbHksIEdSVUIgY2FuIGJvb3QgYW55IE11bHRpYm9vdC1jb21wbGlhbnQgT1MgaW4gdGhlIGZvbGxvd2luZworc3RlcHM6CisKK0BlbnVtZXJhdGUKK0BpdGVtCitTZXQgR1JVQidzIHJvb3QgZGV2aWNlIHRvIHRoZSBkcml2ZSB3aGVyZSB0aGUgT1MgaW1hZ2VzIGFyZSBzdG9yZWQgd2l0aAordGhlIGNvbW1hbmQgQGNvbW1hbmR7cm9vdH0gKEBweHJlZntyb290fSkuCisKK0BpdGVtCitMb2FkIHRoZSBrZXJuZWwgaW1hZ2Ugd2l0aCB0aGUgY29tbWFuZCBAY29tbWFuZHtrZXJuZWx9IChAcHhyZWZ7a2VybmVsfSkuCisKK0BpdGVtCitJZiB5b3UgbmVlZCBtb2R1bGVzLCBsb2FkIHRoZW0gd2l0aCB0aGUgY29tbWFuZCBAY29tbWFuZHttb2R1bGV9CisoQHB4cmVme21vZHVsZX0pIG9yIEBjb21tYW5ke21vZHVsZW5vdW56aXB9IChAcHhyZWZ7bW9kdWxlbm91bnppcH0pLgorCitAaXRlbQorUnVuIHRoZSBjb21tYW5kIEBjb21tYW5ke2Jvb3R9IChAcHhyZWZ7Ym9vdH0pLgorQGVuZCBlbnVtZXJhdGUKKworTGludXgsIEZyZWVCU0QsIE5ldEJTRCBhbmQgT3BlbkJTRCBjYW4gYmUgYm9vdGVkIGluIGEgc2ltaWxhcgorbWFubmVyLiBZb3UgbG9hZCBhIGtlcm5lbCBpbWFnZSB3aXRoIHRoZSBjb21tYW5kIEBjb21tYW5ke2tlcm5lbH0gYW5kCit0aGVuIHJ1biB0aGUgY29tbWFuZCBAY29tbWFuZHtib290fS4gSWYgdGhlIGtlcm5lbCByZXF1aXJlcyBzb21lCitwYXJhbWV0ZXJzLCBqdXN0IGFwcGVuZCB0aGUgcGFyYW1ldGVycyB0byBAY29tbWFuZHtrZXJuZWx9LCBhZnRlciB0aGUKK2ZpbGUgbmFtZSBvZiB0aGUga2VybmVsLiBBbHNvLCBwbGVhc2UgcmVmZXIgdG8gQHJlZntPUy1zcGVjaWZpYyBub3Rlc30sCitmb3IgaW5mb3JtYXRpb24gb24geW91ciBPUy1zcGVjaWZpYyBpc3N1ZXMuCisKKworQG5vZGUgQ2hhaW4tbG9hZGluZworQHN1YnNlY3Rpb24gTG9hZCBhbm90aGVyIGJvb3QgbG9hZGVyIHRvIGJvb3QgdW5zdXBwb3J0ZWQgb3BlcmF0aW5nIHN5c3RlbXMKKworSWYgeW91IHdhbnQgdG8gYm9vdCBhbiB1bnN1cHBvcnRlZCBvcGVyYXRpbmcgc3lzdGVtIChlLmcuIFdpbmRvd3MgOTUpLAorY2hhaW4tbG9hZCBhIGJvb3QgbG9hZGVyIGZvciB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gTm9ybWFsbHksIHRoZSBib290Citsb2FkZXIgaXMgZW1iZWRkZWQgaW4gdGhlIEBkZm57Ym9vdCBzZWN0b3J9IG9mIHRoZSBwYXJ0aXRpb24gb24gd2hpY2gKK3RoZSBvcGVyYXRpbmcgc3lzdGVtIGlzIGluc3RhbGxlZC4KKworQGVudW1lcmF0ZQorQGl0ZW0KK1NldCBHUlVCJ3Mgcm9vdCBkZXZpY2UgdG8gdGhlIHBhcnRpdGlvbiBieSB0aGUgY29tbWFuZAorQGNvbW1hbmR7cm9vdG5vdmVyaWZ5fSAoQHB4cmVme3Jvb3Rub3ZlcmlmeX0pOgorCitAZXhhbXBsZQorZ3J1Yj4gQGtiZHtyb290bm92ZXJpZnkgKGhkMCwwKX0KK0BlbmQgZXhhbXBsZQorCitAaXRlbQorU2V0IHRoZSBAZGZue2FjdGl2ZX0gZmxhZyBpbiB0aGUgcGFydGl0aW9uIHVzaW5nIHRoZSBjb21tYW5kCitAY29tbWFuZHttYWtlYWN0aXZlfUBmb290bm90ZXtUaGlzIGlzIG5vdCBuZWNlc3NhcnkgZm9yIG1vc3Qgb2YgdGhlCittb2Rlcm4gb3BlcmF0aW5nIHN5c3RlbXMufSAoQHB4cmVme21ha2VhY3RpdmV9KToKKworQGV4YW1wbGUKK2dydWI+IEBrYmR7bWFrZWFjdGl2ZX0KK0BlbmQgZXhhbXBsZQorCitAaXRlbQorTG9hZCB0aGUgYm9vdCBsb2FkZXIgd2l0aCB0aGUgY29tbWFuZCBAY29tbWFuZHtjaGFpbmxvYWRlcn0KKyhAcHhyZWZ7Y2hhaW5sb2FkZXJ9KToKKworQGV4YW1wbGUKK2dydWI+IEBrYmR7Y2hhaW5sb2FkZXIgKzF9CitAZW5kIGV4YW1wbGUKKworQHNhbXB7KzF9IGluZGljYXRlcyB0aGF0IEdSVUIgc2hvdWxkIHJlYWQgb25lIHNlY3RvciBmcm9tIHRoZSBzdGFydCBvZgordGhlIHBhcnRpdGlvbi4gVGhlIGNvbXBsZXRlIGRlc2NyaXB0aW9uIGFib3V0IHRoaXMgc3ludGF4IGNhbiBiZSBmb3VuZAoraW4gQHJlZntCbG9jayBsaXN0IHN5bnRheH0uCisKK0BpdGVtCitSdW4gdGhlIGNvbW1hbmQgQGNvbW1hbmR7Ym9vdH0gKEBweHJlZntib290fSkuCitAZW5kIGVudW1lcmF0ZQorCitIb3dldmVyLCBET1MgYW5kIFdpbmRvd3MgaGF2ZSBzb21lIGRlZmljaWVuY2llcywgc28geW91IG1pZ2h0IGhhdmUgdG8KK3VzZSBtb3JlIGNvbXBsaWNhdGVkIGluc3RydWN0aW9ucy4gQHhyZWZ7RE9TL1dpbmRvd3N9LCBmb3IgbW9yZQoraW5mb3JtYXRpb24uCisKKworQG5vZGUgT1Mtc3BlY2lmaWMgbm90ZXMKK0BzZWN0aW9uIFNvbWUgY2F2ZWF0cyBvbiBPUy1zcGVjaWZpYyBpc3N1ZXMKKworSGVyZSwgd2UgZGVzY3JpYmUgc29tZSBjYXZlYXRzIG9uIHNldmVyYWwgb3BlcmF0aW5nIHN5c3RlbXMuCisKK0BtZW51CisqIEdOVS9IdXJkOjoKKyogR05VL0xpbnV4OjoKKyogRnJlZUJTRDo6CisqIE5ldEJTRDo6CisqIE9wZW5CU0Q6OgorKiBET1MvV2luZG93czo6CisqIFNDTyBVbml4V2FyZTo6CisqIFFOWDo6CitAZW5kIG1lbnUKKworCitAbm9kZSBHTlUvSHVyZAorQHN1YnNlY3Rpb24gR05VL0h1cmQKKworU2luY2UgR05VL0h1cmQgaXMgTXVsdGlib290LWNvbXBsaWFudCwgaXQgaXMgZWFzeSB0byBib290IGl0OyB0aGVyZSBpcworbm90aGluZyBzcGVjaWFsIGFib3V0IGl0LiBCdXQgZG8gbm90IGZvcmdldCB0aGF0IHlvdSBoYXZlIHRvIHNwZWNpZnkgYQorcm9vdCBwYXJ0aXRpb24gdG8gdGhlIGtlcm5lbC4KKworQGVudW1lcmF0ZQorQGl0ZW0KK1NldCBHUlVCJ3Mgcm9vdCBkZXZpY2UgdG8gdGhlIHNhbWUgZHJpdmUgYXMgR05VL0h1cmQncy4gUHJvYmFibHkgdGhlCitjb21tYW5kIEBjb2Rle2ZpbmQgL2Jvb3QvZ251bWFjaH0gb3Igc2ltaWxhciBjYW4gaGVscCB5b3UKKyhAcHhyZWZ7ZmluZH0pLgorCitAaXRlbQorTG9hZCB0aGUga2VybmVsIGFuZCB0aGUgbW9kdWxlLCBsaWtlIHRoaXM6CisKK0BleGFtcGxlCitAZ3JvdXAKK2dydWI+IEBrYmR7a2VybmVsIC9ib290L2dudW1hY2ggcm9vdD1oZDBzMX0KK2dydWI+IEBrYmR7bW9kdWxlIC9ib290L3NlcnZlcmJvb3R9CitAZW5kIGdyb3VwCitAZW5kIGV4YW1wbGUKKworQGl0ZW0KK1J1biB0aGUgY29tbWFuZCBAY29tbWFuZHtib290fSAoQHB4cmVme2Jvb3R9KS4KK0BlbmQgZW51bWVyYXRlCisKKworQG5vZGUgR05VL0xpbnV4CitAc3Vic2VjdGlvbiBHTlUvTGludXgKKworSXQgaXMgcmVsYXRpdmVseSBlYXN5IHRvIGJvb3QgR05VL0xpbnV4IGZyb20gR1JVQiwgYmVjYXVzZSBpdCBzb21ld2hhdAorcmVzZW1ibGVzIHRvIGJvb3QgYSBNdWx0aWJvb3QtY29tcGxpYW50IE9TLgorCitAZW51bWVyYXRlCitAaXRlbQorU2V0IEdSVUIncyByb290IGRldmljZSB0byB0aGUgc2FtZSBkcml2ZSBhcyBHTlUvTGludXgncy4gUHJvYmFibHkgdGhlCitjb21tYW5kIEBjb2Rle2ZpbmQgL3ZtbGludXp9IG9yIHNpbWlsYXIgY2FuIGhlbHAgeW91IChAcHhyZWZ7ZmluZH0pLgorCitAaXRlbQorTG9hZCB0aGUga2VybmVsOgorCitAZXhhbXBsZQorZ3J1Yj4gQGtiZHtrZXJuZWwgL3ZtbGludXogcm9vdD0vZGV2L2hkYTF9CitAZW5kIGV4YW1wbGUKKworSWYgeW91IG5lZWQgdG8gc3BlY2lmeSBzb21lIGtlcm5lbCBwYXJhbWV0ZXJzLCBqdXN0IGFwcGVuZCB0aGVtIHRvIHRoZQorY29tbWFuZC4gRm9yIGV4YW1wbGUsIHRvIHNldCBAb3B0aW9ue3ZnYX0gdG8gQHNhbXB7ZXh0fSwgZG8gdGhpczoKKworQGV4YW1wbGUKK2dydWI+IEBrYmR7a2VybmVsIC92bWxpbnV6IHJvb3Q9L2Rldi9oZGExIHZnYT1leHR9CitAZW5kIGV4YW1wbGUKKworU2VlIHRoZSBkb2N1bWVudGF0aW9uIGluIHRoZSBMaW51eCBzb3VyY2UgdHJlZSBmb3IgY29tcGxldGUKK2luZm9ybWF0aW9uIG9uIHRoZSBhdmFpbGFibGUgb3B0aW9ucy4KKworQGl0ZW0KK0lmIHlvdSB1c2UgYW4gaW5pdHJkLCBleGVjdXRlIHRoZSBjb21tYW5kIEBjb21tYW5ke2luaXRyZH0KKyhAcHhyZWZ7aW5pdHJkfSkgYWZ0ZXIgQGNvbW1hbmR7a2VybmVsfToKKworQGV4YW1wbGUKK2dydWI+IEBrYmR7aW5pdHJkIC9pbml0cmR9CitAZW5kIGV4YW1wbGUKKworQGl0ZW0KK0ZpbmFsbHksIHJ1biB0aGUgY29tbWFuZCBAY29tbWFuZHtib290fSAoQHB4cmVme2Jvb3R9KS4KK0BlbmQgZW51bWVyYXRlCisKK0BzdHJvbmd7Q2F1dGlvbjp9IElmIHlvdSB1c2UgYW4gaW5pdHJkIGFuZCBzcGVjaWZ5IHRoZSBAc2FtcHttZW09fQorb3B0aW9uIHRvIHRoZSBrZXJuZWwgdG8gbGV0IGl0IHVzZSBsZXNzIHRoYW4gYWN0dWFsIG1lbW9yeSBzaXplLCB5b3UKK3dpbGwgYWxzbyBoYXZlIHRvIHNwZWNpZnkgdGhlIHNhbWUgbWVtb3J5IHNpemUgdG8gR1JVQi4gVG8gbGV0IEdSVUIga25vdwordGhlIHNpemUsIHJ1biB0aGUgY29tbWFuZCBAY29tbWFuZHt1cHBlcm1lbX0gQGVtcGh7YmVmb3JlfSBsb2FkaW5nIHRoZQora2VybmVsLiBAeHJlZnt1cHBlcm1lbX0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisKK0Bub2RlIEZyZWVCU0QKK0BzdWJzZWN0aW9uIEZyZWVCU0QKKworR1JVQiBjYW4gbG9hZCB0aGUga2VybmVsIGRpcmVjdGx5LCBlaXRoZXIgaW4gRUxGIG9yIGEub3V0IGZvcm1hdC4gQnV0Cit0aGlzIGlzIG5vdCByZWNvbW1lbmRlZCwgc2luY2UgRnJlZUJTRCdzIGJvb3RzdHJhcCBpbnRlcmZhY2Ugc29tZXRpbWVzCitjaGFuZ2VzIGhlYXZpbHksIHNvIEdSVUIgY2FuJ3QgZ3VhcmFudGVlIHRvIHBhc3Mga2VybmVsIHBhcmFtZXRlcnMKK2NvcnJlY3RseS4KKworVGh1cywgd2UnZCByZWNvbW1lbmQgbG9hZGluZyB0aGUgdmVyeSBmbGV4aWJsZSBsb2FkZXIKK0BmaWxley9ib290L2xvYWRlcn0gaW5zdGVhZC4gU2VlIHRoaXMgZXhhbXBsZToKKworQGV4YW1wbGUKK0Bncm91cAorZ3J1Yj4gQGtiZHtyb290IChoZDAsYSl9CitncnViPiBAa2Jke2tlcm5lbCAvYm9vdC9sb2FkZXJ9CitncnViPiBAa2Jke2Jvb3R9CitAZW5kIGdyb3VwCitAZW5kIGV4YW1wbGUKKworCitAbm9kZSBOZXRCU0QKK0BzdWJzZWN0aW9uIE5ldEJTRAorCitHUlVCIGNhbiBsb2FkIE5ldEJTRCBhLm91dCBhbmQgRUxGIGRpcmVjdGx5LCBmb2xsb3cgdGhlc2Ugc3RlcHM6CisKK0BlbnVtZXJhdGUKK0BpdGVtCitTZXQgR1JVQidzIHJvb3QgZGV2aWNlIHdpdGggQGNvbW1hbmR7cm9vdH0gKEBweHJlZntyb290fSkuCisKK0BpdGVtCitMb2FkIHRoZSBrZXJuZWwgd2l0aCBAY29tbWFuZHtrZXJuZWx9IChAcHhyZWZ7a2VybmVsfSkuIFlvdSBzaG91bGQKK2FwcGVuZCB0aGUgdWdseSBvcHRpb24gQG9wdGlvbnstLXR5cGU9bmV0YnNkfSwgaWYgeW91IHdhbnQgdG8gbG9hZCBhbgorRUxGIGtlcm5lbCwgbGlrZSB0aGlzOgorCitAZXhhbXBsZQorZ3J1Yj4gQGtiZHtrZXJuZWwgLS10eXBlPW5ldGJzZCAvbmV0YnNkLWVsZn0KK0BlbmQgZXhhbXBsZQorCitAaXRlbQorUnVuIEBjb21tYW5ke2Jvb3R9IChAcHhyZWZ7Ym9vdH0pLgorQGVuZCBlbnVtZXJhdGUKKworRm9yIG5vdywgaG93ZXZlciwgR1JVQiBkb2Vzbid0IGFsbG93IHlvdSB0byBwYXNzIGtlcm5lbCBwYXJhbWV0ZXJzLCBzbworaXQgbWF5IGJlIGJldHRlciB0byBjaGFpbi1sb2FkIGl0IGluc3RlYWQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UKK3NlZSBAcmVme0NoYWluLWxvYWRpbmd9LgorCisKK0Bub2RlIE9wZW5CU0QKK0BzdWJzZWN0aW9uIE9wZW5CU0QKKworVGhlIGJvb3RpbmcgaW5zdHJ1Y3Rpb24gaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBmb3IgTmV0QlNECisoQHB4cmVme05ldEJTRH0pLgorCisKK0Bub2RlIERPUy9XaW5kb3dzCitAc3Vic2VjdGlvbiBET1MvV2luZG93cworCitHUlVCIGNhbm5vdCBib290IERPUyBvciBXaW5kb3dzIGRpcmVjdGx5LCBzbyB5b3UgbXVzdCBjaGFpbi1sb2FkIHRoZW0KKyhAcHhyZWZ7Q2hhaW4tbG9hZGluZ30pLiBIb3dldmVyLCB0aGVpciBib290IGxvYWRlcnMgaGF2ZSBzb21lIGNyaXRpY2FsCitkZWZpY2llbmNpZXMsIHNvIGl0IG1heSBub3Qgd29yayB0byBqdXN0IGNoYWluLWxvYWQgdGhlbS4gVG8gb3ZlcmNvbWUKK3RoZSBwcm9ibGVtcywgR1JVQiBwcm92aWRlcyB5b3Ugd2l0aCB0d28gaGVscGVyIGZ1bmN0aW9ucy4KKworSWYgeW91IGhhdmUgaW5zdGFsbGVkIERPUyAob3IgV2luZG93cykgb24gYSBub24tZmlyc3QgaGFyZCBkaXNrLCB5b3UKK2hhdmUgdG8gdXNlIHRoZSBkaXNrIHN3YXBwaW5nIHRlY2huaXF1ZSwgYmVjYXVzZSB0aGF0IE9TIGNhbm5vdCBib290Citmcm9tIGFueSBkaXNrcyBidXQgdGhlIGZpcnN0IG9uZS4gVGhlIHdvcmthcm91bmQgdXNlZCBpbiBHUlVCIGlzIHRoZQorY29tbWFuZCBAY29tbWFuZHttYXB9IChAcHhyZWZ7bWFwfSksIGxpa2UgdGhpczoKKworQGV4YW1wbGUKK0Bncm91cAorZ3J1Yj4gQGtiZHttYXAgKGhkMCkgKGhkMSl9CitncnViPiBAa2Jke21hcCAoaGQxKSAoaGQwKX0KK0BlbmQgZ3JvdXAKK0BlbmQgZXhhbXBsZQorCitUaGlzIHBlcmZvcm1zIGEgQGRmbnt2aXJ0dWFsfSBzd2FwIGJldHdlZW4geW91ciBmaXJzdCBhbmQgc2Vjb25kIGhhcmQKK2RyaXZlLgorCitAc3Ryb25ne0NhdXRpb246fSBUaGlzIGlzIGVmZmVjdGl2ZSBvbmx5IGlmIERPUyAob3IgV2luZG93cykgdXNlcyBCSU9TCit0byBhY2Nlc3MgdGhlIHN3YXBwZWQgZGlza3MuIElmIHRoYXQgT1MgdXNlcyBhIHNwZWNpYWwgZHJpdmVyIGZvciB0aGUKK2Rpc2tzLCB0aGlzIHByb2JhYmx5IHdvbid0IHdvcmsuCisKK0Fub3RoZXIgcHJvYmxlbSBhcmlzZXMgaWYgeW91IGluc3RhbGxlZCBtb3JlIHRoYW4gb25lIHNldCBvZiBET1MvV2luZG93cworb250byBvbmUgZGlzaywgYmVjYXVzZSB0aGV5IGNvdWxkIGJlIGNvbmZ1c2VkIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lCitwcmltYXJ5IHBhcnRpdGlvbnMgZm9yIERPUy9XaW5kb3dzLiBDZXJ0YWlubHkgeW91IHNob3VsZCBhdm9pZCBkb2luZwordGhpcywgYnV0IHRoZXJlIGlzIGEgc29sdXRpb24gaWYgeW91IGRvIHdhbnQgdG8gZG8gc28uIFVzZSB0aGUgcGFydGl0aW9uCitoaWRpbmcvdW5oaWRpbmcgdGVjaG5pcXVlLgorCitJZiBHUlVCIEBkZm57aGlkZX1zIGEgRE9TIChvciBXaW5kb3dzKSBwYXJ0aXRpb24gKEBweHJlZntoaWRlfSksIERPUyAob3IKK1dpbmRvd3MpIHdpbGwgaWdub3JlIHRoZSBwYXJ0aXRpb24uIElmIEdSVUIgQGRmbnt1bmhpZGV9cyBhIERPUyAob3IKK1dpbmRvd3MpIHBhcnRpdGlvbiAoQHB4cmVme3VuaGlkZX0pLCBET1MgKG9yIFdpbmRvd3MpIHdpbGwgZGV0ZWN0IHRoZQorcGFydGl0aW9uLiBUaHVzLCBpZiB5b3UgaGF2ZSBpbnN0YWxsZWQgRE9TIChvciBXaW5kb3dzKSBvbiB0aGUgZmlyc3QKK2FuZCB0aGUgc2Vjb25kIHBhcnRpdGlvbiBvZiB0aGUgZmlyc3QgaGFyZCBkaXNrLCBhbmQgeW91IHdhbnQgdG8gYm9vdAordGhlIGNvcHkgb24gdGhlIGZpcnN0IHBhcnRpdGlvbiwgZG8gdGhlIGZvbGxvd2luZzoKKworQGV4YW1wbGUKK0Bncm91cAorZ3J1Yj4gQGtiZHt1bmhpZGUgKGhkMCwwKX0KK2dydWI+IEBrYmR7aGlkZSAoaGQwLDEpfQorZ3J1Yj4gQGtiZHtyb290bm92ZXJpZnkgKGhkMCwwKX0KK2dydWI+IEBrYmR7Y2hhaW5sb2FkZXIgKzF9CitncnViPiBAa2Jke21ha2VhY3RpdmV9CitncnViPiBAa2Jke2Jvb3R9CitAZW5kIGdyb3VwCitAZW5kIGV4YW1wbGUKKworCitAbm9kZSBTQ08gVW5peFdhcmUKK0BzdWJzZWN0aW9uIFNDTyBVbml4V2FyZQorCitJdCBpcyBrbm93biB0aGF0IHRoZSBzaWduYXR1cmUgaW4gdGhlIGJvb3QgbG9hZGVyIGZvciBTQ08gVW5peFdhcmUgaXMKK3dyb25nLCBzbyB5b3Ugd2lsbCBoYXZlIHRvIHNwZWNpZnkgdGhlIG9wdGlvbiBAb3B0aW9uey0tZm9yY2V9IHRvCitAY29tbWFuZHtjaGFpbmxvYWRlcn0gKEBweHJlZntjaGFpbmxvYWRlcn0pLCBsaWtlIHRoaXM6CisKK0BleGFtcGxlCitAZ3JvdXAKK2dydWI+IEBrYmR7cm9vdG5vdmVyaWZ5IChoZDEsMCl9CitncnViPiBAa2Jke2NoYWlubG9hZGVyIC0tZm9yY2UgKzF9CitncnViPiBAa2Jke21ha2VhY3RpdmV9CitncnViPiBAa2Jke2Jvb3R9CitAZW5kIGdyb3VwCitAZW5kIGV4YW1wbGUKKworCitAbm9kZSBRTlgKK0BzdWJzZWN0aW9uIFFOWAorCitRTlggc2VlbXMgdG8gdXNlIGEgYmlnZ2VyIGJvb3QgbG9hZGVyLCBzbyB5b3UgbmVlZCB0byBib290IGl0IHVwLCBsaWtlCit0aGlzOgorCitAZXhhbXBsZQorQGdyb3VwCitncnViPiBAa2Jke3Jvb3Rub3ZlcmlmeSAoaGQxLDEpfQorZ3J1Yj4gQGtiZHtjaGFpbmxvYWRlciArNH0KK2dydWI+IEBrYmR7Ym9vdH0KK0BlbmQgZ3JvdXAKK0BlbmQgZXhhbXBsZQorCisKK0Bub2RlIE1ha2luZyB5b3VyIHN5c3RlbSByb2J1c3QKK0BzZWN0aW9uIEhvdyB0byBtYWtlIHlvdXIgc3lzdGVtIHJvYnVzdAorCitXaGVuIHlvdSB0ZXN0IGEgbmV3IGtlcm5lbCBvciBhIG5ldyBPUywgaXQgaXMgaW1wb3J0YW50IHRvIG1ha2Ugc3VyZQordGhhdCB5b3VyIGNvbXB1dGVyIGNhbiBib290IGV2ZW4gaWYgdGhlIG5ldyBzeXN0ZW0gaXMgdW5ib290YWJsZS4gVGhpcworaXMgY3J1Y2lhbCBlc3BlY2lhbGx5IGlmIHlvdSBtYWludGFpbiBzZXJ2ZXJzIG9yIHJlbW90ZSBzeXN0ZW1zLiBUbworYWNjb21wbGlzaCB0aGlzIGdvYWwsIHlvdSBuZWVkIHRvIHNldCB1cCB0d28gdGhpbmdzOgorCitAZW51bWVyYXRlCitAaXRlbQorWW91IG11c3QgbWFpbnRhaW4gYSBzeXN0ZW0gd2hpY2ggaXMgYWx3YXlzIGJvb3RhYmxlLiBGb3IgaW5zdGFuY2UsIGlmCit5b3UgdGVzdCBhIG5ldyBrZXJuZWwsIHlvdSBuZWVkIHRvIGtlZXAgYSB3b3JraW5nIGtlcm5lbCBpbiBhCitkaWZmZXJlbnQgcGxhY2UuIEFuZCwgaXQgd291bGQgc29tZXRpbWVzIGJlIHZlcnkgbmljZSB0byBldmVuIGhhdmUgYQorY29tcGxldGUgY29weSBvZiBhIHdvcmtpbmcgc3lzdGVtIGluIGEgZGlmZmVyZW50IHBhcnRpdGlvbiBvciBkaXNrLgorCitAaXRlbQorWW91IG11c3QgZGlyZWN0IEdSVUIgdG8gYm9vdCBhIHdvcmtpbmcgc3lzdGVtIHdoZW4gdGhlIG5ldyBzeXN0ZW0KK2ZhaWxzLiBUaGlzIGlzIHBvc3NpYmxlIHdpdGggdGhlIEBkZm57ZmFsbGJhY2t9IHN5c3RlbSBpbiBHUlVCLgorQGVuZCBlbnVtZXJhdGUKKworVGhlIGZvcm1lciByZXF1aXJlbWVudCBpcyB2ZXJ5IHNwZWNpZmljIHRvIGVhY2ggT1MsIHNvIHRoaXMKK2RvY3VtZW50YXRpb24gZG9lcyBub3QgY292ZXIgdGhhdCB0b3BpYy4gSXQgaXMgYmV0dGVyIHRvIGNvbnN1bHQgc29tZQorYmFja3VwIHRvb2xzLgorCitTbyBsZXQncyBzZWUgdGhlIEdSVUIgcGFydC4gVGhlcmUgYXJlIHR3byBwb3NzaWJpbGl0aWVzOiBvbmUgb2YgdGhlbQoraXMgcXVpdGUgc2ltcGxlIGJ1dCBub3QgdmVyeSByb2J1c3QsIGFuZCB0aGUgb3RoZXIgaXMgYSBiaXQgY29tcGxleCB0bworc2V0IHVwIGJ1dCBwcm9iYWJseSB0aGUgYmVzdCBzb2x1dGlvbiB0byBtYWtlIHN1cmUgdGhhdCB5b3VyIHN5c3RlbQorY2FuIHN0YXJ0IGFzIGxvbmcgYXMgR1JVQiBpdHNlbGYgaXMgYm9vdGFibGUuCisKK0BtZW51CisqIEJvb3Rpbmcgb25jZS1vbmx5OjoKKyogQm9vdGluZyBmYWxsYmFjayBzeXN0ZW1zOjoKK0BlbmQgbWVudQorCisKK0Bub2RlIEJvb3Rpbmcgb25jZS1vbmx5CitAc3Vic2VjdGlvbiBCb290aW5nIG9uY2Utb25seQorCitZb3UgY2FuIHRlYWNoIEdSVUIgdG8gYm9vdCBhbiBlbnRyeSBvbmx5IGF0IG5leHQgYm9vdCB0aW1lLiBTdXBwb3NlCit0aGF0IHlvdXIgaGF2ZSBhbiBvbGQga2VybmVsIEBmaWxle29sZF9rZXJuZWx9IGFuZCBhIG5ldyBrZXJuZWwKK0BmaWxle25ld19rZXJuZWx9LiBZb3Uga25vdyB0aGF0IEBmaWxle29sZF9rZXJuZWx9IGNhbiBib290Cit5b3VyIHN5c3RlbSBjb3JyZWN0bHksIGFuZCB5b3Ugd2FudCB0byB0ZXN0IEBmaWxle25ld19rZXJuZWx9LgorCitUbyBlbnN1cmUgdGhhdCB5b3VyIHN5c3RlbSB3aWxsIGdvIGJhY2sgdG8gdGhlIG9sZCBrZXJuZWwgZXZlbiBpZiB0aGUKK25ldyBrZXJuZWwgZmFpbHMgKGUuZy4gaXQgcGFuaWNzKSwgeW91IGNhbiBzcGVjaWZ5IHRoYXQgR1JVQiBzaG91bGQKK3RyeSB0aGUgbmV3IGtlcm5lbCBvbmx5IG9uY2UgYW5kIGJvb3QgdGhlIG9sZCBrZXJuZWwgYWZ0ZXIgdGhhdC4KKworRmlyc3QsIG1vZGlmeSB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZS4gSGVyZSBpcyBhbiBleGFtcGxlOgorCitAZXhhbXBsZQorQGdyb3VwCitkZWZhdWx0IHNhdmVkICAgICAgICAjIFRoaXMgaXMgaW1wb3J0YW50ISEhCit0aW1lb3V0IDEwCisKK3RpdGxlIHRoZSBvbGQga2VybmVsCityb290IChoZDAsMCkKK2tlcm5lbCAvb2xkX2tlcm5lbAorc2F2ZWRlZmF1bHQKKwordGl0bGUgdGhlIG5ldyBrZXJuZWwKK3Jvb3QgKGhkMCwwKQora2VybmVsIC9uZXdfa2VybmVsCitzYXZlZGVmYXVsdCAwICAgICAgICAgIyBUaGlzIGlzIGltcG9ydGFudCEhIQorQGVuZCBncm91cAorQGVuZCBleGFtcGxlCisKK05vdGUgdGhhdCB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSB1c2VzIEBzYW1we2RlZmF1bHQgc2F2ZWR9CisoQHB4cmVme2RlZmF1bHR9KSBhdCB0aGUgaGVhZCBhbmQgQHNhbXB7c2F2ZWRlZmF1bHQgMH0KKyhAcHhyZWZ7c2F2ZWRlZmF1bHR9KSBpbiB0aGUgZW50cnkgZm9yIHRoZSBuZXcga2VybmVsLiBUaGlzIG1lYW5zCit0aGF0IEdSVUIgYm9vdHMgYSBzYXZlZCBlbnRyeSBieSBkZWZhdWx0LCBhbmQgYm9vdGluZyB0aGUgZW50cnkgZm9yIHRoZQorbmV3IGtlcm5lbCBzYXZlcyBAc2FtcHswfSBhcyB0aGUgc2F2ZWQgZW50cnkuCisKK1dpdGggdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsIGFmdGVyIGFsbCwgR1JVQiBhbHdheXMgdHJpZXMgdG8gYm9vdCB0aGUKK29sZCBrZXJuZWwgYWZ0ZXIgaXQgYm9vdGVkIHRoZSBuZXcgb25lLCBiZWNhdXNlIEBzYW1wezB9IGlzIHRoZSBlbnRyeQorb2YgQGNvZGV7dGhlIG9sZCBrZXJuZWx9LgorCitUaGUgbmV4dCBzdGVwIGlzIHRvIHRlbGwgR1JVQiB0byBib290IHRoZSBuZXcga2VybmVsIGF0IG5leHQgYm9vdAordGltZS4gRm9yIHRoaXMsIGV4ZWN1dGUgQGNvbW1hbmR7Z3J1Yi1zZXQtZGVmYXVsdH0gKEBweHJlZntJbnZva2luZworZ3J1Yi1zZXQtZGVmYXVsdH0pOgorCitAZXhhbXBsZQorIyBAa2Jke2dydWItc2V0LWRlZmF1bHQgMX0KK0BlbmQgZXhhbXBsZQorCitUaGlzIGNvbW1hbmQgc2V0cyB0aGUgc2F2ZWQgZW50cnkgdG8gQHNhbXB7MX0sIHRoYXQgaXMsIHRvIHRoZSBuZXcKK2tlcm5lbC4KKworVGhpcyBtZXRob2QgaXMgdXNlZnVsLCBidXQgc3RpbGwgbm90IHZlcnkgcm9idXN0LCBiZWNhdXNlIEdSVUIgc3RvcHMKK2Jvb3RpbmcsIGlmIHRoZXJlIGlzIGFueSBlcnJvciBpbiB0aGUgYm9vdCBlbnRyeSwgc3VjaCB0aGF0IHRoZSBuZXcKK2tlcm5lbCBoYXMgYW4gaW52YWxpZCBleGVjdXRhYmxlIGZvcm1hdC4gVGh1cywgaXQgaXQgZXZlbiBiZXR0ZXIgdG8KK3VzZSB0aGUgQGRmbntmYWxsYmFja30gbWVjaGFuaXNtIG9mIEdSVUIuIExvb2sgYXQgbmV4dCBzdWJzZWN0aW9uIGZvcgordGhpcyBmZWF0dXJlLgorCisKK0Bub2RlIEJvb3RpbmcgZmFsbGJhY2sgc3lzdGVtcworQHN1YnNlY3Rpb24gQm9vdGluZyBmYWxsYmFjayBzeXN0ZW1zCisKK0dSVUIgc3VwcG9ydHMgYSBmYWxsYmFjayBtZWNoYW5pc20gb2YgYm9vdGluZyBvbmUgb3IgbW9yZSBvdGhlcgorZW50cmllcyBpZiBhIGRlZmF1bHQgYm9vdCBlbnRyeSBmYWlscy4gWW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlCitmYWxsYmFjayBlbnRyaWVzIGlmIHlvdSB3aXNoLgorCitTdXBwb3NlIHRoYXQgeW91IGhhdmUgdGhyZWUgc3lzdGVtcywgQHNhbXB7QX0sIEBzYW1we0J9IGFuZAorQHNhbXB7Q30uIEBzYW1we0F9IGlzIGEgc3lzdGVtIHdoaWNoIHlvdSB3YW50IHRvIGJvb3QgYnkKK2RlZmF1bHQuIEBzYW1we0J9IGlzIGEgYmFja3VwIHN5c3RlbSB3aGljaCBpcyBzdXBwb3NlZCB0byBib290CitzYWZlbHkuIEBzYW1we0N9IGlzIGFub3RoZXIgYmFja3VwIHN5c3RlbSB3aGljaCBpcyB1c2VkIGluIGNhc2Ugd2hlcmUKK0BzYW1we0J9IGlzIGJyb2tlbi4KKworVGhlbiB5b3UgbWF5IHdhbnQgR1JVQiB0byBib290IHRoZSBmaXJzdCBzeXN0ZW0gd2hpY2ggaXMgYm9vdGFibGUKK2Ftb25nIEBzYW1we0F9LCBAc2FtcHtCfSBhbmQgQHNhbXB7Q30uIEEgY29uZmlndXJhdGlvbiBmaWxlIGNhbiBiZQord3JpdHRlbiBpbiB0aGlzIHdheToKKworQGV4YW1wbGUKK0Bncm91cAorZGVmYXVsdCBzYXZlZCAgICAgICAgIyBUaGlzIGlzIGltcG9ydGFudCEhIQordGltZW91dCAxMAorZmFsbGJhY2sgMSAyICAgICAgICAgIyBUaGlzIGlzIGltcG9ydGFudCEhIQorCit0aXRsZSBBCityb290IChoZDAsMCkKK2tlcm5lbCAva2VybmVsCitzYXZlZGVmYXVsdCBmYWxsYmFjayAjIFRoaXMgaXMgaW1wb3J0YW50ISEhCisKK3RpdGxlIEIKK3Jvb3QgKGhkMSwwKQora2VybmVsIC9rZXJuZWwKK3NhdmVkZWZhdWx0IGZhbGxiYWNrICMgVGhpcyBpcyBpbXBvcnRhbnQhISEKKwordGl0bGUgQworcm9vdCAoaGQyLDApCitrZXJuZWwgL2tlcm5lbAorc2F2ZWRlZmF1bHQKK0BlbmQgZ3JvdXAKK0BlbmQgZXhhbXBsZQorCitOb3RlIHRoYXQgQHNhbXB7ZGVmYXVsdCBzYXZlZH0gKEBweHJlZntkZWZhdWx0fSksIEBzYW1we2ZhbGxiYWNrIDEgMn0KK2FuZCBAc2FtcHtzYXZlZGVmYXVsdCBmYWxsYmFja30gYXJlIHVzZWQuIEdSVUIgd2lsbCBib290IGEgc2F2ZWQgZW50cnkKK2J5IGRlZmF1bHQgYW5kIHNhdmUgYSBmYWxsYmFjayBlbnRyeSBhcyBuZXh0IGJvb3QgZW50cnkgd2l0aCB0aGlzCitjb25maWd1cmF0aW9uLgorCitXaGVuIEdSVUIgdHJpZXMgdG8gYm9vdCBAc2FtcHtBfSwgR1JVQiBzYXZlcyBAc2FtcHsxfSBhcyBuZXh0IGJvb3QKK2VudHJ5LCBiZWNhdXNlIHRoZSBjb21tYW5kIEBjb21tYW5ke2ZhbGxiYWNrfSBzcGVjaWZpZXMgdGhhdCBAc2FtcHsxfQoraXMgdGhlIGZpcnN0IGZhbGxiYWNrIGVudHJ5LiBUaGUgZW50cnkgQHNhbXB7MX0gaXMgQHNhbXB7Qn0sIHNvIEdSVUIKK3dpbGwgdHJ5IHRvIGJvb3QgQHNhbXB7Qn0gYXQgbmV4dCBib290IHRpbWUuCisKK0xpa2V3aXNlLCB3aGVuIEdSVUIgdHJpZXMgdG8gYm9vdCBAc2FtcHtCfSwgR1JVQiBzYXZlcyBAc2FtcHsyfSBhcworbmV4dCBib290IGVudHJ5LCBiZWNhdXNlIEBjb21tYW5ke2ZhbGxiYWNrfSBzcGVjaWZpZXMgQHNhbXB7Mn0gYXMgbmV4dAorZmFsbGJhY2sgZW50cnkuIFRoaXMgbWFrZXMgc3VyZSB0aGF0IEdSVUIgd2lsbCBib290IEBzYW1we0N9IGFmdGVyCitib290aW5nIEBzYW1we0J9LgorCitJdCBpcyBub3Rld29ydGh5IHRoYXQgR1JVQiB1c2VzIGZhbGxiYWNrIGVudHJpZXMgYm90aCB3aGVuIEdSVUIKK2l0c2VsZiBmYWlscyBpbiBib290aW5nIGFuIGVudHJ5IGFuZCB3aGVuIEBzYW1we0F9IG9yIEBzYW1we0J9IGZhaWxzCitpbiBzdGFydGluZyB1cCB5b3VyIHN5c3RlbS4gU28gdGhpcyBzb2x1dGlvbiBlbnN1cmVzIHRoYXQgeW91ciBzeXN0ZW0KK2lzIHN0YXJ0ZWQgZXZlbiBpZiBHUlVCIGNhbm5vdCBmaW5kIHlvdXIga2VybmVsIG9yIGlmIHlvdXIga2VybmVsCitwYW5pY3MuCisKK0hvd2V2ZXIsIHlvdSBuZWVkIHRvIHJ1biBAY29tbWFuZHtncnViLXNldC1kZWZhdWx0fSAoQHB4cmVme0ludm9raW5nCitncnViLXNldC1kZWZhdWx0fSkgd2hlbiBAc2FtcHtBfSBzdGFydHMgY29ycmVjdGx5IG9yIHlvdSBmaXggQHNhbXB7QX0KK2FmdGVyIGl0IGNyYXNoZXMsIHNpbmNlIEdSVUIgYWx3YXlzIHNldHMgbmV4dCBib290IGVudHJ5IHRvIGEgZmFsbGJhY2sKK2VudHJ5LiBZb3Ugc2hvdWxkIHJ1biB0aGlzIGNvbW1hbmQgaW4gYSBzdGFydHVwIHNjcmlwdCBzdWNoIGFzCitAZmlsZXtyYy5sb2NhbH0gdG8gYm9vdCBAc2FtcHtBfSBieSBkZWZhdWx0OgorCitAZXhhbXBsZQorIyBAa2Jke2dydWItc2V0LWRlZmF1bHQgMH0KK0BlbmQgZXhhbXBsZQorCit3aGVyZSBAc2FtcHswfSBpcyB0aGUgbnVtYmVyIG9mIHRoZSBib290IGVudHJ5IGZvciB0aGUgc3lzdGVtCitAc2FtcHtBfS4KKworSWYgeW91IHdhbnQgdG8gc2VlIHdoYXQgaXMgY3VycmVudCBkZWZhdWx0IGVudHJ5LCB5b3UgY2FuIGxvb2sgYXQgdGhlCitmaWxlIEBmaWxley9ib290L2dydWIvZGVmYXVsdH0gKG9yIEBmaWxley9ncnViL2RlZmF1bHR9IGluCitzb21lIHN5c3RlbXMpLiBCZWNhdXNlIHRoaXMgZmlsZSBpcyBwbGFpbi10ZXh0LCB5b3UgY2FuIGp1c3QKK0Bjb21tYW5ke2NhdH0gdGhpcyBmaWxlLiBCdXQgaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgQHN0cm9uZ3tub3QgdG8KK21vZGlmeSB0aGlzIGZpbGUgZGlyZWN0bHl9LCBiZWNhdXNlIEdSVUIgbWF5IGZhaWwgaW4gc2F2aW5nIGEgZGVmYXVsdAorZW50cnkgaW4gdGhpcyBmaWxlLCBpZiB5b3UgY2hhbmdlIHRoaXMgZmlsZSBpbiBhbiB1bmludGVuZGVkCittYW5uZXIuIFRoZXJlZm9yZSwgeW91IHNob3VsZCB1c2UgQGNvbW1hbmR7Z3J1Yi1zZXQtZGVmYXVsdH0gd2hlbiB5b3UKK25lZWQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGVudHJ5LgorCisKK0Bub2RlIENvbmZpZ3VyYXRpb24KK0BjaGFwdGVyIENvbmZpZ3VyYXRpb24KKworWW91J3ZlIHByb2JhYmx5IG5vdGljZWQgdGhhdCB5b3UgbmVlZCB0byB0eXBlIHNldmVyYWwgY29tbWFuZHMgdG8gYm9vdCB5b3VyCitPUy4gVGhlcmUncyBhIHNvbHV0aW9uIHRvIHRoYXQgLSBHUlVCIHByb3ZpZGVzIGEgbWVudSBpbnRlcmZhY2UKKyhAcHhyZWZ7TWVudSBpbnRlcmZhY2V9KSBmcm9tIHdoaWNoIHlvdSBjYW4gc2VsZWN0IGFuIGl0ZW0gKHVzaW5nIGFycm93CitrZXlzKSB0aGF0IHdpbGwgZG8gZXZlcnl0aGluZyB0byBib290IGFuIE9TLgorCitUbyBlbmFibGUgdGhlIG1lbnUsIHlvdSBuZWVkIGEgY29uZmlndXJhdGlvbiBmaWxlLAorQGZpbGV7bWVudS5sc3R9IHVuZGVyIHRoZSBib290IGRpcmVjdG9yeS4gV2UnbGwgYW5hbHl6ZSBhbiBleGFtcGxlCitmaWxlLgorCitUaGUgZmlsZSBmaXJzdCBjb250YWlucyBzb21lIGdlbmVyYWwgc2V0dGluZ3MsIHRoZSBtZW51IGludGVyZmFjZQorcmVsYXRlZCBvcHRpb25zLiBZb3UgY2FuIHB1dCB0aGVzZSBjb21tYW5kcyAoQHB4cmVme01lbnUtc3BlY2lmaWMKK2NvbW1hbmRzfSkgYmVmb3JlIGFueSBvZiB0aGUgaXRlbXMgKHN0YXJ0aW5nIHdpdGggQGNvbW1hbmR7dGl0bGV9CisoQHB4cmVme3RpdGxlfSkpLgorCitAZXhhbXBsZQorQGdyb3VwCisjCisjIFNhbXBsZSBib290IG1lbnUgY29uZmlndXJhdGlvbiBmaWxlCisjCitAZW5kIGdyb3VwCitAZW5kIGV4YW1wbGUKKworQXMgeW91IG1heSBoYXZlIGd1ZXNzZWQsIHRoZXNlIGxpbmVzIGFyZSBjb21tZW50cy4gTGluZXMgc3RhcnRpbmcgd2l0aCBhCitoYXNoIGNoYXJhY3RlciAoQHNhbXB7I30pLCBhbmQgYmxhbmsgbGluZXMsIGFyZSBpZ25vcmVkIGJ5IEdSVUIuCisKK0BleGFtcGxlCitAZ3JvdXAKKyMgQnkgZGVmYXVsdCwgYm9vdCB0aGUgZmlyc3QgZW50cnkuCitkZWZhdWx0IDAKK0BlbmQgZ3JvdXAKK0BlbmQgZXhhbXBsZQorCitUaGUgZmlyc3QgZW50cnkgKGhlcmUsIGNvdW50aW5nIHN0YXJ0cyB3aXRoIG51bWJlciB6ZXJvLCBub3Qgb25lISkgd2lsbAorYmUgdGhlIGRlZmF1bHQgY2hvaWNlLgorCitAZXhhbXBsZQorQGdyb3VwCisjIEJvb3QgYXV0b21hdGljYWxseSBhZnRlciAzMCBzZWNzLgordGltZW91dCAzMAorQGVuZCBncm91cAorQGVuZCBleGFtcGxlCisKK0FzIHRoZSBjb21tZW50IHNheXMsIEdSVUIgd2lsbCBib290IGF1dG9tYXRpY2FsbHkgaW4gMzAgc2Vjb25kcywgdW5sZXNzCitpbnRlcnJ1cHRlZCB3aXRoIGEga2V5cHJlc3MuCisKK0BleGFtcGxlCitAZ3JvdXAKKyMgRmFsbGJhY2sgdG8gdGhlIHNlY29uZCBlbnRyeS4KK2ZhbGxiYWNrIDEKK0BlbmQgZ3JvdXAKK0BlbmQgZXhhbXBsZQorCitJZiwgZm9yIGFueSByZWFzb24sIHRoZSBkZWZhdWx0IGVudHJ5IGRvZXNuJ3Qgd29yaywgZmFsbCBiYWNrIHRvIHRoZQorc2Vjb25kIG9uZSAodGhpcyBpcyByYXJlbHkgdXNlZCwgZm9yIG9idmlvdXMgcmVhc29ucykuCisKK05vdGUgdGhhdCB0aGUgY29tcGxldGUgZGVzY3JpcHRpb25zIG9mIHRoZXNlIGNvbW1hbmRzLCB3aGljaCBhcmUgbWVudQoraW50ZXJmYWNlIHNwZWNpZmljLCBjYW4gYmUgZm91bmQgaW4gQHJlZntNZW51LXNwZWNpZmljCitjb21tYW5kc30uIE90aGVyIGRlc2NyaXB0aW9ucyBjYW4gYmUgZm91bmQgaW4gQHJlZntDb21tYW5kc30uCisKK05vdywgb24gdG8gdGhlIGFjdHVhbCBPUyBkZWZpbml0aW9ucy4gWW91IHdpbGwgc2VlIHRoYXQgZWFjaCBlbnRyeQorYmVnaW5zIHdpdGggYSBzcGVjaWFsIGNvbW1hbmQsIEBjb21tYW5ke3RpdGxlfSAoQHB4cmVme3RpdGxlfSksIGFuZCB0aGUKK2FjdGlvbiBpcyBkZXNjcmliZWQgYWZ0ZXIgaXQuIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBjb21tYW5kCitAY29tbWFuZHtib290fSAoQHB4cmVme2Jvb3R9KSBhdCB0aGUgIGVuZCBvZiBlYWNoIGl0ZW0uIFRoYXQgaXMgYmVjYXVzZQorR1JVQiBhdXRvbWF0aWNhbGx5IGV4ZWN1dGVzIEBjb21tYW5ke2Jvb3R9IGlmIGl0IGxvYWRzIG90aGVyIGNvbW1hbmRzCitzdWNjZXNzZnVsbHkuCisKK1RoZSBhcmd1bWVudCBmb3IgdGhlIGNvbW1hbmQgQGNvbW1hbmR7dGl0bGV9IGlzIHVzZWQgdG8gZGlzcGxheSBhIHNob3J0Cit0aXRsZS9kZXNjcmlwdGlvbiBvZiB0aGUgZW50cnkgaW4gdGhlIG1lbnUuIFNpbmNlIEBjb21tYW5ke3RpdGxlfQorZGlzcGxheXMgdGhlIGFyZ3VtZW50IGFzIGlzLCB5b3UgY2FuIHdyaXRlIGJhc2ljYWxseSBhbnl0aGluZyB0aGVyZS4KKworQGV4YW1wbGUKK0Bncm91cAorIyBGb3IgYm9vdGluZyBHTlUvSHVyZAordGl0bGUgIEdOVS9IdXJkCityb290ICAgKGhkMCwwKQora2VybmVsIC9ib290L2dudW1hY2guZ3ogcm9vdD1oZDBzMQorbW9kdWxlIC9ib290L3NlcnZlcmJvb3QuZ3oKK0BlbmQgZ3JvdXAKK0BlbmQgZXhhbXBsZQorCitUaGlzIGJvb3RzIEdOVS9IdXJkIGZyb20gdGhlIGZpcnN0IGhhcmQgZGlzay4KKworQGV4YW1wbGUKK0Bncm91cAorIyBGb3IgYm9vdGluZyBHTlUvTGludXgKK3RpdGxlICBHTlUvTGludXgKK2tlcm5lbCAoaGQxLDApL3ZtbGludXogcm9vdD0vZGV2L2hkYjEKK0BlbmQgZ3JvdXAKK0BlbmQgZXhhbXBsZQorCitUaGlzIGJvb3RzIEdOVS9MaW51eCwgYnV0IGZyb20gdGhlIHNlY29uZCBoYXJkIGRpc2suCisKK0BleGFtcGxlCitAZ3JvdXAKKyMgRm9yIGJvb3RpbmcgTWFjaCAoZ2V0dGluZyBrZXJuZWwgZnJvbSBmbG9wcHkpCit0aXRsZSAgVXRhaCBNYWNoNCBtdWx0aWJvb3QKK3Jvb3QgICAoaGQwLDIpCitwYXVzZSAgSW5zZXJ0IHRoZSBkaXNrZXR0ZSBub3deRyEhCitrZXJuZWwgKGZkMCkvYm9vdC9rZXJuZWwgcm9vdD1oZDBzMworbW9kdWxlIChmZDApL2Jvb3QvYm9vdHN0cmFwCitAZW5kIGdyb3VwCitAZW5kIGV4YW1wbGUKKworVGhpcyBib290cyBNYWNoIHdpdGggYSBrZXJuZWwgb24gYSBmbG9wcHksIGJ1dCB0aGUgcm9vdCBmaWxlc3lzdGVtIGF0CitoZDBzMy4gSXQgYWxzbyBjb250YWlucyBhIEBjb21tYW5ke3BhdXNlfSBsaW5lIChAcHhyZWZ7cGF1c2V9KSwgd2hpY2gKK3dpbGwgY2F1c2UgR1JVQiB0byBkaXNwbGF5IGEgcHJvbXB0IGFuZCBkZWxheSwgYmVmb3JlIGFjdHVhbGx5IGV4ZWN1dGluZwordGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmRzIGFuZCBib290aW5nLgorCitAZXhhbXBsZQorQGdyb3VwCisjIEZvciBib290aW5nIEZyZWVCU0QKK3RpdGxlICBGcmVlQlNECityb290ICAgKGhkMCwyLGEpCitrZXJuZWwgL2Jvb3QvbG9hZGVyCitAZW5kIGdyb3VwCitAZW5kIGV4YW1wbGUKKworVGhpcyBpdGVtIHdpbGwgYm9vdCBGcmVlQlNEIGtlcm5lbCBsb2FkZWQgZnJvbSB0aGUgQHNhbXB7YX0gcGFydGl0aW9uIG9mCit0aGUgdGhpcmQgQHNje3BjfSBzbGljZSBvZiB0aGUgZmlyc3QgaGFyZCBkaXNrLgorCitAZXhhbXBsZQorQGdyb3VwCisjIEZvciBib290aW5nIE9TLzIKK3RpdGxlIE9TLzIKK3Jvb3QgIChoZDAsMSkKK21ha2VhY3RpdmUKKyMgY2hhaW5sb2FkIE9TLzIgYm9vdGxvYWRlciBmcm9tIHRoZSBmaXJzdCBzZWN0b3IKK2NoYWlubG9hZGVyICsxCisjIFRoaXMgaXMgc2ltaWxhciB0byAiY2hhaW5sb2FkIiwgYnV0IGxvYWRzIGEgc3BlY2lmaWMgZmlsZQorI2NoYWlubG9hZGVyIC9ib290L2NoYWluLm9zMgorQGVuZCBncm91cAorQGVuZCBleGFtcGxlCisKK1RoaXMgd2lsbCBib290IE9TLzIsIHVzaW5nIGEgY2hhaW4tbG9hZGVyIChAcHhyZWZ7Q2hhaW4tbG9hZGluZ30pLgorCitAZXhhbXBsZQorQGdyb3VwCisjIEZvciBib290aW5nIFdpbmRvd3MgTlQgb3IgV2luZG93czk1Cit0aXRsZSBXaW5kb3dzIE5UIC8gV2luZG93cyA5NSBib290IG1lbnUKK3Jvb3QgICAgICAgIChoZDAsMCkKK21ha2VhY3RpdmUKK2NoYWlubG9hZGVyICsxCisjIEZvciBsb2FkaW5nIERPUyBpZiBXaW5kb3dzIE5UIGlzIGluc3RhbGxlZAorIyBjaGFpbmxvYWQgL2Jvb3RzZWN0LmRvcworQGVuZCBncm91cAorQGVuZCBleGFtcGxlCisKK1RoZSBzYW1lIGFzIHRoZSBhYm92ZSwgYnV0IGZvciBXaW5kb3dzLgorCitAZXhhbXBsZQorQGdyb3VwCisjIEZvciBpbnN0YWxsaW5nIEdSVUIgaW50byB0aGUgaGFyZCBkaXNrCit0aXRsZSBJbnN0YWxsIEdSVUIgaW50byB0aGUgaGFyZCBkaXNrCityb290ICAgIChoZDAsMCkKK3NldHVwICAgKGhkMCkKK0BlbmQgZ3JvdXAKK0BlbmQgZXhhbXBsZQorCitUaGlzIHdpbGwganVzdCAocmUpaW5zdGFsbCBHUlVCIG9udG8gdGhlIGhhcmQgZGlzay4KKworQGV4YW1wbGUKKyMgQ2hhbmdlIHRoZSBjb2xvcnMuCit0aXRsZSBDaGFuZ2UgdGhlIGNvbG9ycworY29sb3IgbGlnaHQtZ3JlZW4vYnJvd24gYmxpbmstcmVkL2JsdWUKK0BlbmQgZXhhbXBsZQorCitJbiB0aGUgbGFzdCBlbnRyeSwgdGhlIGNvbW1hbmQgQGNvbW1hbmR7Y29sb3J9IGlzIHVzZWQgKEBweHJlZntjb2xvcn0pLAordG8gY2hhbmdlIHRoZSBtZW51IGNvbG9ycyAodHJ5IGl0ISkuIFRoaXMgY29tbWFuZCBpcyBzb21ld2hhdCBzcGVjaWFsLAorYmVjYXVzZSBpdCBjYW4gYmUgdXNlZCBib3RoIGluIHRoZSBjb21tYW5kLWxpbmUgYW5kIGluIHRoZSBtZW51LiBHUlVCCitoYXMgc2V2ZXJhbCBzdWNoIGNvbW1hbmRzLCBzZWUgQHJlZntHZW5lcmFsIGNvbW1hbmRzfS4KKworV2UgaG9wZSB0aGF0IHlvdSBub3cgdW5kZXJzdGFuZCBob3cgdG8gdXNlIHRoZSBiYXNpYyBmZWF0dXJlcyBvZgorR1JVQi4gVG8gbGVhcm4gbW9yZSBhYm91dCBHUlVCLCBzZWUgdGhlIGZvbGxvd2luZyBjaGFwdGVycy4KKworCitAbm9kZSBOZXR3b3JrCitAY2hhcHRlciBEb3dubG9hZGluZyBPUyBpbWFnZXMgZnJvbSBhIG5ldHdvcmsKKworQWx0aG91Z2ggR1JVQiBpcyBhIGRpc2stYmFzZWQgYm9vdCBsb2FkZXIsIGl0IGRvZXMgcHJvdmlkZSBuZXR3b3JrCitzdXBwb3J0LiBUbyB1c2UgdGhlIG5ldHdvcmsgc3VwcG9ydCwgeW91IG5lZWQgdG8gZW5hYmxlIGF0IGxlYXN0IG9uZQorbmV0d29yayBkcml2ZXIgaW4gdGhlIEdSVUIgYnVpbGQgcHJvY2Vzcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlCitzZWUgQGZpbGV7bmV0Ym9vdC9SRUFETUUubmV0Ym9vdH0gaW4gdGhlIHNvdXJjZSBkaXN0cmlidXRpb24uCisKK0BtZW51CisqIEdlbmVyYWwgdXNhZ2Ugb2YgbmV0d29yayBzdXBwb3J0OjoKKyogRGlza2xlc3M6OgorQGVuZCBtZW51CisKKworQG5vZGUgR2VuZXJhbCB1c2FnZSBvZiBuZXR3b3JrIHN1cHBvcnQKK0BzZWN0aW9uIEhvdyB0byBzZXQgdXAgeW91ciBuZXR3b3JrCisKK0dSVUIgcmVxdWlyZXMgYSBmaWxlIHNlcnZlciBhbmQgb3B0aW9uYWxseSBhIHNlcnZlciB0aGF0IHdpbGwgYXNzaWduIGFuCitJUCBhZGRyZXNzIHRvIHRoZSBtYWNoaW5lIG9uIHdoaWNoIEdSVUIgaXMgcnVubmluZy4gRm9yIHRoZSBmb3JtZXIsIG9ubHkKK1RGVFAgaXMgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnQuIFRoZSBsYXR0ZXIgaXMgZWl0aGVyIEJPT1RQLCBESENQIG9yIGEKK1JBUlAgc2VydmVyQGZvb3Rub3Rle1JBUlAgaXMgbm90IGFkdmlzZWQsIHNpbmNlIGl0IGNhbm5vdCBzZXJ2ZSBtdWNoCitpbmZvcm1hdGlvbn0uIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gcnVuIGJvdGggdGhlIHNlcnZlcnMgb24gb25lCitjb21wdXRlci4gSG93IHRvIGNvbmZpZ3VyZSB0aGVzZSBzZXJ2ZXJzIGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcworZG9jdW1lbnQsIHNvIHBsZWFzZSByZWZlciB0byB0aGUgbWFudWFscyBzcGVjaWZpYyB0byB0aG9zZQorcHJvdG9jb2xzL3NlcnZlcnMuCisKK0lmIHlvdSBkZWNpZGVkIHRvIHVzZSBhIHNlcnZlciB0byBhc3NpZ24gYW4gSVAgYWRkcmVzcywgc2V0IHVwIHRoZQorc2VydmVyIGFuZCBydW4gQGNvbW1hbmR7Ym9vdHB9IChAcHhyZWZ7Ym9vdHB9KSwgQGNvbW1hbmR7ZGhjcH0KKyhAcHhyZWZ7ZGhjcH0pIG9yIEBjb21tYW5ke3JhcnB9IChAcHhyZWZ7cmFycH0pIGZvciBCT09UUCwgREhDUCBvciBSQVJQLAorcmVzcGVjdGl2ZWx5LiBFYWNoIGNvbW1hbmQgd2lsbCBzaG93IGFuIGFzc2lnbmVkIElQIGFkZHJlc3MsIGEgbmV0bWFzaywKK2FuIElQIGFkZHJlc3MgZm9yIHlvdXIgVEZUUCBzZXJ2ZXIgYW5kIGEgZ2F0ZXdheS4gSWYgYW55IG9mIHRoZQorYWRkcmVzc2VzIGlzIHdyb25nIG9yIGl0IGNhdXNlcyBhbiBlcnJvciwgcHJvYmFibHkgdGhlIGNvbmZpZ3VyYXRpb24gb2YKK3lvdXIgc2VydmVycyBpc24ndCBzZXQgdXAgcHJvcGVybHkuCisKK090aGVyd2lzZSwgcnVuIEBjb21tYW5ke2lmY29uZmlnfSwgbGlrZSB0aGlzOgorCitAZXhhbXBsZQorZ3J1Yj4gQGtiZHtpZmNvbmZpZyAtLWFkZHJlc3M9MTkyLjE2OC4xMTAuMjMgLS1zZXJ2ZXI9MTkyLjE2OC4xMTAuMTR9CitAZW5kIGV4YW1wbGUKKworWW91IGNhbiBhbHNvIHVzZSBAY29tbWFuZHtpZmNvbmZpZ30gaW4gY29uanVjdGlvbiB3aXRoIEBjb21tYW5ke2Jvb3RwfSwKK0Bjb21tYW5ke2RoY3B9IG9yIEBjb21tYW5ke3JhcnB9IChlLmcuIHRvIHJlYXNzaWduIHRoZSBzZXJ2ZXIgYWRkcmVzcworbWFudWFsbHkpLiBAeHJlZntpZmNvbmZpZ30sIGZvciBtb3JlIGRldGFpbHMuCisKK0ZpbmFsbHksIGRvd25sb2FkIHlvdXIgT1MgaW1hZ2VzIGZyb20geW91ciBuZXR3b3JrLiBUaGUgbmV0d29yayBjYW4gYmUKK2FjY2Vzc2VkIHVzaW5nIHRoZSBuZXR3b3JrIGRyaXZlIEBzYW1weyhuZCl9LiBFdmVyeXRoaW5nIGVsc2UgaXMgdmVyeQorc2ltaWxhciB0byB0aGUgbm9ybWFsIGluc3RydWN0aW9ucyAoQHB4cmVme0Jvb3Rpbmd9KS4KKworSGVyZSBpcyBhbiBleGFtcGxlOgorCitAZXhhbXBsZQorQGdyb3VwCitncnViPiBAa2Jke2Jvb3RwfQorUHJvYmluZy4uLiBbTkUqMDAwXQorTkUyMDAwIGJhc2UgLi4uCitBZGRyZXNzOiAxOTIuMTY4LjExMC4yMyAgICBOZXRtYXNrOiAyNTUuMjU1LjI1NS4wCitTZXJ2ZXI6IDE5Mi4xNjguMTEwLjE0ICAgICBHYXRld2F5OiAxOTIuMTY4LjExMC4xCisKK2dydWI+IEBrYmR7cm9vdCAobmQpfQorZ3J1Yj4gQGtiZHtrZXJuZWwgL3RmdHByb290L2dudW1hY2guZ3ogcm9vdD1zZDBzMX0KK2dydWI+IEBrYmR7bW9kdWxlIC90ZnRwcm9vdC9zZXJ2ZXJib290Lmd6fQorZ3J1Yj4gQGtiZHtib290fQorQGVuZCBncm91cAorQGVuZCBleGFtcGxlCisKKworQG5vZGUgRGlza2xlc3MKK0BzZWN0aW9uIEJvb3RpbmcgZnJvbSBhIG5ldHdvcmsKKworSXQgaXMgc29tZXRpbWVzIHZlcnkgdXNlZnVsIHRvIGJvb3QgZnJvbSBhIG5ldHdvcmssIGVzcGVjaWFsbHkgd2hlbiB5b3UKK3VzZSBhIG1hY2hpbmUgd2hpY2ggaGFzIG5vIGxvY2FsIGRpc2suIEluIHRoaXMgY2FzZSwgeW91IG5lZWQgdG8gb2J0YWluCithIGtpbmQgb2YgTmV0IEJvb3QgQHNje3JvbX0sIHN1Y2ggYXMgYSBQWEUgQHNje3JvbX0gb3IgYSBmcmVlIHNvZnR3YXJlCitwYWNrYWdlIGxpa2UgRXRoZXJib290LiBTdWNoIGEgQm9vdCBAc2N7cm9tfSBmaXJzdCBib290cyB0aGUgbWFjaGluZSwKK3NldHMgdXAgdGhlIG5ldHdvcmsgY2FyZCBpbnN0YWxsZWQgaW50byB0aGUgbWFjaGluZSwgYW5kIGRvd25sb2FkcyBhCitzZWNvbmQgc3RhZ2UgYm9vdCBpbWFnZSBmcm9tIHRoZSBuZXR3b3JrLiBUaGVuLCB0aGUgc2Vjb25kIGltYWdlIHdpbGwKK3RyeSB0byBib290IGFuIG9wZXJhdGluZyBzeXN0ZW0gYWN0dWFsbHkgZnJvbSB0aGUgbmV0d29yay4KKworR1JVQiBwcm92aWRlcyB0d28gc2Vjb25kIHN0YWdlIGltYWdlcywgQGZpbGV7bmJncnVifSBhbmQKK0BmaWxle3B4ZWdydWJ9IChAcHhyZWZ7SW1hZ2VzfSkuIFRoZXNlIGltYWdlcyBhcmUgdGhlIHNhbWUgYXMgdGhlCitub3JtYWwgU3RhZ2UgMiwgZXhjZXB0IHRoYXQgdGhleSBzZXQgdXAgYSBuZXR3b3JrIGF1dG9tYXRpY2FsbHksIGFuZCB0cnkKK3RvIGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgZnJvbSB0aGUgbmV0d29yaywgaWYgc3BlY2lmaWVkLiBUaGUgdXNhZ2UKK2lzIHZlcnkgc2ltcGxlOiBJZiB0aGUgbWFjaGluZSBoYXMgYSBQWEUgQHNje3JvbX0sIHVzZQorQGZpbGV7cHhlZ3J1Yn0uIElmIHRoZSBtYWNoaW5lIGhhcyBhbiBOQkkgbG9hZGVyIHN1Y2ggYXMgRXRoZXJib290LCB1c2UKK0BmaWxle25iZ3J1Yn0uIFRoZXJlIGlzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVtIGV4Y2VwdCB0aGVpcgorZm9ybWF0cy4gU2luY2UgdGhlIHdheSB0byBsb2FkIGEgc2Vjb25kIHN0YWdlIGltYWdlIHlvdSB3YW50IHRvIHVzZQorc2hvdWxkIGJlIGRlc2NyaWJlZCBpbiB0aGUgbWFudWFsIG9uIHlvdXIgTmV0IEJvb3QgQHNje3JvbX0sIHBsZWFzZQorcmVmZXIgdG8gdGhlIG1hbnVhbCwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK0hvd2V2ZXIsIHRoZXJlIGlzIG9uZSB0aGluZyBzcGVjaWZpYyB0byBHUlVCLiBOYW1lbHksIGhvdyB0byBzcGVjaWZ5IGEKK2NvbmZpZ3VyYXRpb24gZmlsZSBpbiBhIEJPT1RQL0RIQ1Agc2VydmVyLiBGb3Igbm93LCBHUlVCIHVzZXMgdGhlIHRhZworQHNhbXB7MTUwfSwgdG8gZ2V0IHRoZSBuYW1lIG9mIGEgY29uZmlndXJhdGlvbiBmaWxlLiBUaGUgZm9sbG93aW5nIGlzIGFuCitleGFtcGxlIHdpdGggYSBCT09UUCBjb25maWd1cmF0aW9uOgorCitAZXhhbXBsZQorQGdyb3VwCisuYWxsaG9zdDpoZD0vdG1wOmJmPW51bGw6XAorICAgICAgICA6ZHM9MTQ1LjcxLjM1LjEgMTQ1LjcxLjMyLjE6XAorICAgICAgICA6c209MjU1LjI1NS4yNTQuMDpcCisgICAgICAgIDpndz0xNDUuNzEuMzUuMTpcCisgICAgICAgIDpzYT0xNDUuNzEuMzUuNToKKworZm9vOmh0PTE6aGE9NjM2NTVkMDMzNGE3OmlwPTE0NS43MS4zNS4xMjc6XAorICAgICAgICA6YmY9L25iZ3J1YjpcCisgICAgICAgIDp0Yz0uYWxsaG9zdDpcCisgICAgICAgIDpUMTUwPSIobmQpL3RmdHBib290L21lbnUubHN0LmZvbyI6CitAZW5kIGdyb3VwCitAZW5kIGV4YW1wbGUKKworTm90ZSB0aGF0IHlvdSBzaG91bGQgc3BlY2lmeSB0aGUgZHJpdmUgbmFtZSBAY29kZXsobmQpfSBpbiB0aGUgbmFtZSBvZgordGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4gVGhpcyBpcyBiZWNhdXNlIHlvdSBtaWdodCBjaGFuZ2UgdGhlIHJvb3QgZHJpdmUKK2JlZm9yZSBkb3dubG9hZGluZyB0aGUgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBURlRQIHNlcnZlciB3aGVuIHRoZQorcHJlc2V0IG1lbnUgZmVhdHVyZSBpcyB1c2VkIChAcHhyZWZ7UHJlc2V0IE1lbnV9KS4KKworU2VlIHRoZSBtYW51YWwgb2YgeW91ciBCT09UUC9ESENQIHNlcnZlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gVGhlCitleGFjdCBzeW50YXggc2hvdWxkIGRpZmZlciBhIGxpdHRsZSBmcm9tIHRoZSBleGFtcGxlLgorCisKK0Bub2RlIFNlcmlhbCB0ZXJtaW5hbAorQGNoYXB0ZXIgVXNpbmcgR1JVQiB2aWEgYSBzZXJpYWwgbGluZQorCitUaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIGhvdyB0byB1c2UgdGhlIHNlcmlhbCB0ZXJtaW5hbCBzdXBwb3J0IGluIEdSVUIuCisKK0lmIHlvdSBoYXZlIG1hbnkgY29tcHV0ZXJzIG9yIGNvbXB1dGVycyB3aXRoIG5vIGRpc3BsYXkva2V5Ym9hcmQsIGl0Citjb3VsZCBiZSB2ZXJ5IHVzZWZ1bCB0byBjb250cm9sIHRoZSBjb21wdXRlcnMgdGhyb3VnaCBzZXJpYWwKK2NvbW11bmljYXRpb25zLiBUbyBjb25uZWN0IG9uZSBjb21wdXRlciB3aXRoIGFub3RoZXIgdmlhIGEgc2VyaWFsIGxpbmUsCit5b3UgbmVlZCB0byBwcmVwYXJlIGEgbnVsbC1tb2RlbSAoY3Jvc3MpIHNlcmlhbCBjYWJsZSwgYW5kIHlvdSBtYXkgbmVlZAordG8gaGF2ZSBtdWx0aXBvcnQgc2VyaWFsIGJvYXJkcywgaWYgeW91ciBjb21wdXRlciBkb2Vzbid0IGhhdmUgZXh0cmEKK3NlcmlhbCBwb3J0cy4gSW4gYWRkaXRpb24sIGEgdGVybWluYWwgZW11bGF0b3IgaXMgYWxzbyByZXF1aXJlZCwgc3VjaCBhcworbWluaWNvbS4gUmVmZXIgdG8gYSBtYW51YWwgb2YgeW91ciBvcGVyYXRpbmcgc3lzdGVtLCBmb3IgbW9yZQoraW5mb3JtYXRpb24uCisKK0FzIGZvciBHUlVCLCB0aGUgaW5zdHJ1Y3Rpb24gdG8gc2V0IHVwIGEgc2VyaWFsIHRlcm1pbmFsIGlzIHF1aXRlCitzaW1wbGUuIEZpcnN0IG9mIGFsbCwgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmVuJ3Qgc3BlY2lmaWVkIHRoZSBvcHRpb24KK0BvcHRpb257LS1kaXNhYmxlLXNlcmlhbH0gdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2hlbiB5b3UgYnVpbHQgeW91cgorR1JVQiBpbWFnZXMuIElmIHlvdSBnZXQgdGhlbSBpbiBiaW5hcnkgZm9ybSwgcHJvYmFibHkgdGhleSBoYXZlIHNlcmlhbAordGVybWluYWwgc3VwcG9ydCBhbHJlYWR5LgorCitUaGVuLCBpbml0aWFsaXplIHlvdXIgc2VyaWFsIHRlcm1pbmFsIGFmdGVyIEdSVUIgc3RhcnRzIHVwLiBIZXJlIGlzIGFuCitleGFtcGxlOgorCitAZXhhbXBsZQorQGdyb3VwCitncnViPiBAa2Jke3NlcmlhbCAtLXVuaXQ9MCAtLXNwZWVkPTk2MDB9CitncnViPiBAa2Jke3Rlcm1pbmFsIHNlcmlhbH0KK0BlbmQgZ3JvdXAKK0BlbmQgZXhhbXBsZQorCitUaGUgY29tbWFuZCBAY29tbWFuZHtzZXJpYWx9IGluaXRpYWxpemVzIHRoZSBzZXJpYWwgdW5pdCAwIHdpdGggdGhlCitzcGVlZCA5NjAwYnBzLiBUaGUgc2VyaWFsIHVuaXQgMCBpcyB1c3VhbGx5IGNhbGxlZCBAc2FtcHtDT00xfSwgc28sIGlmCit5b3Ugd2FudCB0byB1c2UgQ09NMiwgeW91IG11c3Qgc3BlY2lmeSBAc2FtcHstLXVuaXQ9MX0gaW5zdGVhZC4gVGhpcworY29tbWFuZCBhY2NlcHRzIG1hbnkgb3RoZXIgb3B0aW9ucywgc28gcGxlYXNlIHJlZmVyIHRvIEByZWZ7c2VyaWFsfSwKK2ZvciBtb3JlIGRldGFpbHMuCisKK1RoZSBjb21tYW5kIEBjb21tYW5ke3Rlcm1pbmFsfSAoQHB4cmVme3Rlcm1pbmFsfSkgY2hvb3NlcyB3aGljaCB0eXBlIG9mCit0ZXJtaW5hbCB5b3Ugd2FudCB0byB1c2UuIEluIHRoZSBjYXNlIGFib3ZlLCB0aGUgdGVybWluYWwgd2lsbCBiZSBhCitzZXJpYWwgdGVybWluYWwsIGJ1dCB5b3UgY2FuIGFsc28gcGFzcyBAY29kZXtjb25zb2xlfSB0byB0aGUgY29tbWFuZCwKK2FzIEBzYW1we3Rlcm1pbmFsIHNlcmlhbCBjb25zb2xlfS4gSW4gdGhpcyBjYXNlLCBhIHRlcm1pbmFsIGluIHdoaWNoCit5b3UgcHJlc3MgYW55IGtleSB3aWxsIGJlIHNlbGVjdGVkIGFzIGEgR1JVQiB0ZXJtaW5hbC4KKworSG93ZXZlciwgbm90ZSB0aGF0IEdSVUIgYXNzdW1lcyB0aGF0IHlvdXIgdGVybWluYWwgZW11bGF0b3IgaXMKK2NvbXBhdGlibGUgd2l0aCBWVDEwMCBieSBkZWZhdWx0LiBUaGlzIGlzIHRydWUgZm9yIG1vc3QgdGVybWluYWwKK2VtdWxhdG9ycyBub3dhZGF5cywgYnV0IHlvdSBzaG91bGQgcGFzcyB0aGUgb3B0aW9uIEBvcHRpb257LS1kdW1ifSB0bwordGhlIGNvbW1hbmQgaWYgeW91ciB0ZXJtaW5hbCBlbXVsYXRvciBpcyBub3QgVlQxMDAtY29tcGF0aWJsZSBvcgoraW1wbGVtZW50cyBmZXcgVlQxMDAgZXNjYXBlIHNlcXVlbmNlcy4gSWYgeW91IHNwZWNpZnkgdGhpcyBvcHRpb24gdGhlbgorR1JVQiBwcm92aWRlcyB5b3Ugd2l0aCBhbiBhbHRlcm5hdGl2ZSBtZW51IGludGVyZmFjZSwgYmVjYXVzZSB0aGUgbm9ybWFsCittZW51IHJlcXVpcmVzIHNldmVyYWwgZmFuY3kgZmVhdHVyZXMgb2YgeW91ciB0ZXJtaW5hbC4KKworCitAbm9kZSBQcmVzZXQgTWVudQorQGNoYXB0ZXIgRW1iZWRkaW5nIGEgY29uZmlndXJhdGlvbiBmaWxlIGludG8gR1JVQgorCitHUlVCIHN1cHBvcnRzIGEgQGRmbntwcmVzZXQgbWVudX0gd2hpY2ggaXMgdG8gYmUgYWx3YXlzIGxvYWRlZCBiZWZvcmUKK3N0YXJ0aW5nLiBUaGUgcHJlc2V0IG1lbnUgZmVhdHVyZSBpcyB1c2VmdWwsIGZvciBleGFtcGxlLCB3aGVuIHlvdXIKK2NvbXB1dGVyIGhhcyBubyBjb25zb2xlIGJ1dCBhIHNlcmlhbCBjYWJsZS4gSW4gdGhpcyBjYXNlLCBpdCBpcworY3JpdGljYWwgdG8gc2V0IHVwIHRoZSBzZXJpYWwgdGVybWluYWwgYXMgc29vbiBhcyBwb3NzaWJsZSwgc2luY2UgeW91CitjYW5ub3Qgc2VlIGFueSBtZXNzYWdlIHVudGlsIHRoZSBzZXJpYWwgdGVybWluYWwgYmVnaW5zIHRvIHdvcmsuIFNvIGl0CitpcyBnb29kIHRvIHJ1biB0aGUgY29tbWFuZHMgQGNvbW1hbmR7c2VyaWFsfSAoQHB4cmVme3NlcmlhbH0pIGFuZAorQGNvbW1hbmR7dGVybWluYWx9IChAcHhyZWZ7dGVybWluYWx9KSBiZWZvcmUgYW55dGhpbmcgZWxzZSBhdCB0aGUKK3N0YXJ0LXVwIHRpbWUuCisKK0hvdyB0aGUgcHJlc2V0IG1lbnUgd29ya3MgaXMgc2xpZ2h0bHkgY29tcGxpY2F0ZWQ6CisKK0BlbnVtZXJhdGUKK0BpdGVtCitHUlVCIGNoZWNrcyBpZiB0aGUgcHJlc2V0IG1lbnUgZmVhdHVyZSBpcyB1c2VkLCBhbmQgbG9hZHMgdGhlIHByZXNldAorbWVudSwgaWYgYXZhaWxhYmxlLiBUaGlzIGluY2x1ZGVzIHJ1bm5pbmcgY29tbWFuZHMgYW5kIHJlYWRpbmcgYm9vdAorZW50cmllcywgbGlrZSBhbiBvcmRpbmFyeSBjb25maWd1cmF0aW9uIGZpbGUuCisKK0BpdGVtCitHUlVCIGNoZWNrcyBpZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIGF2YWlsYWJsZS4gTm90ZSB0aGF0IHRoaXMgY2hlY2sKK2lzIHBlcmZvcm1lZCBAc3Ryb25ne3JlZ2FyZGxlc3Mgb2YgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgcHJlc2V0CittZW51fS4gVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBsb2FkZWQgZXZlbiBpZiB0aGUgcHJlc2V0IG1lbnUgd2FzCitsb2FkZWQuCisKK0BpdGVtCitJZiB0aGUgcHJlc2V0IG1lbnUgaW5jbHVkZXMgYW55IGJvb3QgZW50cmllcywgdGhleSBhcmUgY2xlYXJlZCB3aGVuCit0aGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIGxvYWRlZC4gSXQgZG9lc24ndCBtYXR0ZXIgd2hldGhlciB0aGUKK2NvbmZpZ3VyYXRpb24gZmlsZSBoYXMgYW55IGVudHJpZXMgb3Igbm8gZW50cnkuIFRoZSBib290IGVudHJpZXMgaW4gdGhlCitwcmVzZXQgbWVudSBhcmUgdXNlZCBvbmx5IHdoZW4gR1JVQiBmYWlscyBpbiBsb2FkaW5nIHRoZSBjb25maWd1cmF0aW9uCitmaWxlLgorQGVuZCBlbnVtZXJhdGUKKworVG8gZW5hYmxlIHRoZSBwcmVzZXQgbWVudSBmZWF0dXJlLCB5b3UgbXVzdCByZWJ1aWxkIEdSVUIgc3BlY2lmeWluZyBhCitmaWxlIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0IHdpdGggdGhlIG9wdGlvbgorQG9wdGlvbnstLWVuYWJsZS1wcmVzZXQtbWVudX0uIFRoZSBmaWxlIGhhcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMKK25vcm1hbCBjb25maWd1cmF0aW9uIGZpbGVzIChAcHhyZWZ7Q29uZmlndXJhdGlvbn0pLgorCitBbm90aGVyIHBvaW50IHlvdSBzaG91bGQgdGFrZSBjYXJlIGlzIHRoYXQgdGhlIGRpc2tsZXNzIHN1cHBvcnQKKyhAcHhyZWZ7RGlza2xlc3N9KSBkaXZlcnRzIHRoZSBwcmVzZXQgbWVudS4gRGlza2xlc3MgaW1hZ2VzIGVtYmVkIGEKK3ByZXNldCBtZW51IHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQgQGNvbW1hbmR7Ym9vdHB9IChAcHhyZWZ7Ym9vdHB9KQorYXV0b21hdGljYWxseSwgdW5sZXNzIHlvdSBzcGVjaWZ5IHlvdXIgb3duIHByZXNldCBtZW51IHRvIHRoZSBjb25maWd1cmUKK3NjcmlwdC4gVGhpcyBtZWFucyB0aGF0IHlvdSBtdXN0IHB1dCBjb21tYW5kcyB0byBpbml0aWFsaXplIGEgbmV0d29yayBpbgordGhlIHByZXNldCBtZW51IHlvdXJzZWxmLCBiZWNhdXNlIGRpc2tsZXNzIGltYWdlcyBkb24ndCBzZXQgaXQgdXAKK2ltcGxpY2l0bHksIHdoZW4geW91IHVzZSB0aGUgcHJlc2V0IG1lbnUgZXhwbGljaXRseS4KKworVGhlcmVmb3JlLCBhIHR5cGljYWwgcHJlc2V0IG1lbnUgdXNlZCB3aXRoIGRpc2tsZXNzIHN1cHBvcnQgd291bGQgYmUKK2xpa2UgdGhpczoKKworQGV4YW1wbGUKK0Bncm91cAorIyBTZXQgdXAgdGhlIHNlcmlhbCB0ZXJtaW5hbCwgZmlyc3Qgb2YgYWxsLgorc2VyaWFsIC0tdW5pdD0wIC0tc3BlZWQ9MTkyMDAKK3Rlcm1pbmFsIC0tdGltZW91dD0wIHNlcmlhbAorCisjIEluaXRpYWxpemUgdGhlIG5ldHdvcmsuCitkaGNwCitAZW5kIGdyb3VwCitAZW5kIGV4YW1wbGUKKworCitAbm9kZSBTZWN1cml0eQorQGNoYXB0ZXIgUHJvdGVjdGluZyB5b3VyIGNvbXB1dGVyIGZyb20gY3JhY2tpbmcKKworWW91IG1heSBiZSBpbnRlcmVzdGVkIGluIGhvdyB0byBwcmV2ZW50IG9yZGluYXJ5IHVzZXJzIGZyb20gZG9pbmcKK3doYXRldmVyIHRoZXkgbGlrZSwgaWYgeW91IHNoYXJlIHlvdXIgY29tcHV0ZXIgd2l0aCBvdGhlciBwZW9wbGUuIFNvCit0aGlzIGNoYXB0ZXIgZGVzY3JpYmVzIGhvdyB0byBpbXByb3ZlIHRoZSBzZWN1cml0eSBvZiBHUlVCLgorCitPbmUgdGhpbmcgd2hpY2ggY291bGQgYmUgYSBzZWN1cml0eSBob2xlIGlzIHRoYXQgdGhlIHVzZXIgY2FuIGRvIHRvbworbWFueSB0aGluZ3Mgd2l0aCBHUlVCLCBiZWNhdXNlIEdSVUIgYWxsb3dzIG9uZSB0byBtb2RpZnkgaXRzIGNvbmZpZ3VyYXRpb24KK2FuZCBydW4gYXJiaXRyYXJ5IGNvbW1hbmRzIGF0IHJ1bi10aW1lLiBGb3IgZXhhbXBsZSwgdGhlIHVzZXIgY2FuIGV2ZW4KK3JlYWQgQGZpbGV7L2V0Yy9wYXNzd2R9IGluIHRoZSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlIGJ5IHRoZSBjb21tYW5kCitAY29tbWFuZHtjYXR9IChAcHhyZWZ7Y2F0fSkuIFNvIGl0IGlzIG5lY2Vzc2FyeSB0byBkaXNhYmxlIGFsbCB0aGUKK2ludGVyYWN0aXZlIG9wZXJhdGlvbnMuCisKK1RodXMsIEdSVUIgcHJvdmlkZXMgYSBAZGZue3Bhc3N3b3JkfSBmZWF0dXJlLCBzbyB0aGF0IG9ubHkgYWRtaW5pc3RyYXRvcnMKK2NhbiBzdGFydCB0aGUgaW50ZXJhY3RpdmUgb3BlcmF0aW9ucyAoaS5lLiBlZGl0aW5nIG1lbnUgZW50cmllcyBhbmQKK2VudGVyaW5nIHRoZSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlKS4gVG8gdXNlIHRoaXMgZmVhdHVyZSwgeW91IG5lZWQgdG8KK3J1biB0aGUgY29tbWFuZCBAY29tbWFuZHtwYXNzd29yZH0gaW4geW91ciBjb25maWd1cmF0aW9uIGZpbGUKKyhAcHhyZWZ7cGFzc3dvcmR9KSwgbGlrZSB0aGlzOgorCitAZXhhbXBsZQorcGFzc3dvcmQgLS1tZDUgUEFTU1dPUkQKK0BlbmQgZXhhbXBsZQorCitJZiB0aGlzIGlzIHNwZWNpZmllZCwgR1JVQiBkaXNhbGxvd3MgYW55IGludGVyYWN0aXZlIGNvbnRyb2wsIHVudGlsIHlvdQorcHJlc3MgdGhlIGtleSBAa2V5e3B9IGFuZCBlbnRlciBhIGNvcnJlY3QgcGFzc3dvcmQuICBUaGUgb3B0aW9uCitAb3B0aW9uey0tbWQ1fSB0ZWxscyBHUlVCIHRoYXQgQHNhbXB7UEFTU1dPUkR9IGlzIGluIE1ENSBmb3JtYXQuICBJZiBpdAoraXMgb21pdHRlZCwgR1JVQiBhc3N1bWVzIHRoZSBAc2FtcHtQQVNTV09SRH0gaXMgaW4gY2xlYXIgdGV4dC4KKworWW91IGNhbiBlbmNyeXB0IHlvdXIgcGFzc3dvcmQgd2l0aCB0aGUgY29tbWFuZCBAY29tbWFuZHttZDVjcnlwdH0KKyhAcHhyZWZ7bWQ1Y3J5cHR9KS4gRm9yIGV4YW1wbGUsIHJ1biB0aGUgZ3J1YiBzaGVsbCAoQHB4cmVme0ludm9raW5nIHRoZQorZ3J1YiBzaGVsbH0pLCBhbmQgZW50ZXIgeW91ciBwYXNzd29yZDoKKworQGV4YW1wbGUKK0Bncm91cAorZ3J1Yj4gbWQ1Y3J5cHQKK1Bhc3N3b3JkOiAqKioqKioqKioqCitFbmNyeXB0ZWQ6ICQxJFUkSks3eEZlZ2R4V0g2VnVwcENVU0liLgorQGVuZCBncm91cAorQGVuZCBleGFtcGxlCisKK1RoZW4sIGN1dCBhbmQgcGFzdGUgdGhlIGVuY3J5cHRlZCBwYXNzd29yZCB0byB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZS4KKworQWxzbywgeW91IGNhbiBzcGVjaWZ5IGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRvIEBjb21tYW5ke3Bhc3N3b3JkfS4gU2VlCit0aGlzIGV4YW1wbGU6CisKK0BleGFtcGxlCitwYXNzd29yZCBQQVNTV09SRCAvYm9vdC9ncnViL21lbnUtYWRtaW4ubHN0CitAZW5kIGV4YW1wbGUKKworSW4gdGhpcyBjYXNlLCBHUlVCIHdpbGwgbG9hZCBAZmlsZXsvYm9vdC9ncnViL21lbnUtYWRtaW4ubHN0fSBhcyBhCitjb25maWd1cmF0aW9uIGZpbGUgd2hlbiB5b3UgZW50ZXIgdGhlIHZhbGlkIHBhc3N3b3JkLgorCitBbm90aGVyIHRoaW5nIHdoaWNoIG1heSBiZSBkYW5nZXJvdXMgaXMgdGhhdCBhbnkgdXNlciBjYW4gY2hvb3NlIGFueQorbWVudSBlbnRyeS4gVXN1YWxseSwgdGhpcyB3b3VsZG4ndCBiZSBwcm9ibGVtYXRpYywgYnV0IHlvdSBtaWdodCB3YW50IHRvCitwZXJtaXQgb25seSBhZG1pbmlzdHJhdG9ycyB0byBydW4gc29tZSBvZiB5b3VyIG1lbnUgZW50cmllcywgc3VjaCBhcyBhbgorZW50cnkgZm9yIGJvb3RpbmcgYW4gaW5zZWN1cmUgT1MgbGlrZSBET1MuCisKK0dSVUIgcHJvdmlkZXMgdGhlIGNvbW1hbmQgQGNvbW1hbmR7bG9ja30gKEBweHJlZntsb2NrfSkuIFRoaXMgY29tbWFuZAorYWx3YXlzIGZhaWxzIHVudGlsIHlvdSBlbnRlciB0aGUgdmFsaWQgcGFzc3dvcmQsIHNvIHlvdSBjYW4gdXNlIGl0LCBsaWtlCit0aGlzOgorCitAZXhhbXBsZQorQGdyb3VwCit0aXRsZSBCb290IERPUworbG9jaworcm9vdG5vdmVyaWZ5IChoZDAsMSkKK21ha2VhY3RpdmUKK2NoYWlubG9hZCArMQorQGVuZCBncm91cAorQGVuZCBleGFtcGxlCisKK1lvdSBzaG91bGQgaW5zZXJ0IEBjb21tYW5ke2xvY2t9IHJpZ2h0IGFmdGVyIEBjb21tYW5ke3RpdGxlfSwgYmVjYXVzZQorYW55IHVzZXIgY2FuIGV4ZWN1dGUgY29tbWFuZHMgaW4gYW4gZW50cnkgdW50aWwgR1JVQiBlbmNvdW50ZXJzCitAY29tbWFuZHtsb2NrfS4KKworWW91IGNhbiBhbHNvIHVzZSB0aGUgY29tbWFuZCBAY29tbWFuZHtwYXNzd29yZH0gaW5zdGVhZCBvZgorQGNvbW1hbmR7bG9ja30uIEluIHRoaXMgY2FzZSB0aGUgYm9vdCBwcm9jZXNzIHdpbGwgYXNrIGZvciB0aGUgcGFzc3dvcmQKK2FuZCBzdG9wIGlmIGl0IHdhcyBlbnRlcmVkIGluY29ycmVjdGx5LiAgU2luY2UgdGhlIEBjb21tYW5ke3Bhc3N3b3JkfQordGFrZXMgaXRzIG93biBAdmFye1BBU1NXT1JEfSBhcmd1bWVudCB0aGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudAorZGlmZmVyZW50IHBhc3N3b3JkcyBmb3IgZGlmZmVyZW50IGVudHJpZXMuCisKKworQG5vZGUgSW1hZ2VzCitAY2hhcHRlciBHUlVCIGltYWdlIGZpbGVzCisKK0dSVUIgY29uc2lzdHMgb2Ygc2V2ZXJhbCBpbWFnZXM6IHR3byBlc3NlbnRpYWwgc3RhZ2VzLCBvcHRpb25hbCBzdGFnZXMKK2NhbGxlZCBAZGZue1N0YWdlIDEuNX0sIG9uZSBpbWFnZSBmb3IgYm9vdGFibGUgQ0QtUk9NLCBhbmQgdHdvIG5ldHdvcmsKK2Jvb3QgaW1hZ2VzLiBIZXJlIGlzIGEgc2hvcnQgb3ZlcnZpZXcgb2YgdGhlbS4gQHhyZWZ7SW50ZXJuYWxzfSwgZm9yCittb3JlIGRldGFpbHMuCisKK0B0YWJsZSBAZmlsZQorQGl0ZW0gc3RhZ2UxCitUaGlzIGlzIGFuIGVzc2VudGlhbCBpbWFnZSB1c2VkIGZvciBib290aW5nIHVwIEdSVUIuIFVzdWFsbHksIHRoaXMgaXMKK2VtYmVkZGVkIGluIGFuIE1CUiBvciB0aGUgYm9vdCBzZWN0b3Igb2YgYSBwYXJ0aXRpb24uIEJlY2F1c2UgYSBQQyBib290CitzZWN0b3IgaXMgNTEyIGJ5dGVzLCB0aGUgc2l6ZSBvZiB0aGlzIGltYWdlIGlzIGV4YWN0bHkgNTEyIGJ5dGVzLgorCitBbGwgQGZpbGV7c3RhZ2UxfSBtdXN0IGRvIGlzIHRvIGxvYWQgU3RhZ2UgMiBvciBTdGFnZSAxLjUgZnJvbSBhIGxvY2FsCitkaXNrLiBCZWNhdXNlIG9mIHRoZSBzaXplIHJlc3RyaWN0aW9uLCBAZmlsZXtzdGFnZTF9IGVuY29kZXMgdGhlCitsb2NhdGlvbiBvZiBTdGFnZSAyIChvciBTdGFnZSAxLjUpIGluIGEgYmxvY2sgbGlzdCBmb3JtYXQsIHNvIGl0IG5ldmVyCit1bmRlcnN0YW5kIGFueSBmaWxlc3lzdGVtIHN0cnVjdHVyZS4KKworQGl0ZW0gc3RhZ2UyCitUaGlzIGlzIHRoZSBjb3JlIGltYWdlIG9mIEdSVUIuIEl0IGRvZXMgZXZlcnl0aGluZyBidXQgYm9vdGluZyB1cAoraXRzZWxmLiBVc3VhbGx5LCB0aGlzIGlzIHB1dCBpbiBhIGZpbGVzeXN0ZW0sIGJ1dCB0aGF0IGlzIG5vdCByZXF1aXJlZC4KKworQGl0ZW0gZTJmc19zdGFnZTFfNQorQGl0ZW14IGZhdF9zdGFnZTFfNQorQGl0ZW14IGZmc19zdGFnZTFfNQorQGl0ZW14IGpmc19zdGFnZTFfNQorQGl0ZW14IG1pbml4X3N0YWdlMV81CitAaXRlbXggcmVpc2VyZnNfc3RhZ2UxXzUKK0BpdGVteCB2c3RhZnNfc3RhZ2UxXzUKK0BpdGVteCB4ZnNfc3RhZ2UxXzUKKworVGhlc2UgYXJlIGNhbGxlZCBAZGZue1N0YWdlIDEuNX0sIGJlY2F1c2UgdGhleSBzZXJ2ZSBhcyBhIGJyaWRnZQorYmV0d2VlbiBAZmlsZXtzdGFnZTF9IGFuZCBAZmlsZXtzdGFnZTJ9LCB0aGF0IGlzIHRvIHNheSwgU3RhZ2UgMS41IGlzCitsb2FkZWQgYnkgU3RhZ2UgMSBhbmQgU3RhZ2UgMS41IGxvYWRzIFN0YWdlIDIuIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4KK0BmaWxle3N0YWdlMX0gYW5kIEBmaWxleypfc3RhZ2UxXzV9IGlzIHRoYXQgdGhlIGZvcm1lciBkb2Vzbid0Cit1bmRlcnN0YW5kIGFueSBmaWxlc3lzdGVtIHdoaWxlIHRoZSBsYXR0ZXIgdW5kZXJzdGFuZHMgb25lIGZpbGVzeXN0ZW0KKyhlLmcuIEBmaWxle2UyZnNfc3RhZ2UxXzV9IHVuZGVyc3RhbmRzIGV4dDJmcykuIFNvIHlvdSBjYW4gbW92ZSB0aGUKK1N0YWdlIDIgaW1hZ2UgdG8gYW5vdGhlciBsb2NhdGlvbiBzYWZlbHksIGV2ZW4gYWZ0ZXIgR1JVQiBoYXMgYmVlbgoraW5zdGFsbGVkLgorCitXaGlsZSBTdGFnZSAyIGNhbm5vdCBnZW5lcmFsbHkgYmUgZW1iZWRkZWQgaW4gYSBmaXhlZCBhcmVhIGFzIHRoZSBzaXplCitpcyBzbyBsYXJnZSwgU3RhZ2UgMS41IGNhbiBiZSBpbnN0YWxsZWQgaW50byB0aGUgYXJlYSByaWdodCBhZnRlciBhbiBNQlIsCitvciB0aGUgYm9vdCBsb2FkZXIgYXJlYSBvZiBhIFJlaXNlckZTIG9yIGEgRkZTLgorCitAaXRlbSBzdGFnZTJfZWx0b3JpdG8KK1RoaXMgaXMgYSBib290IGltYWdlIGZvciBDRC1ST01zIHVzaW5nIHRoZSBAZGZue25vIGVtdWxhdGlvbiBtb2RlfSBpbgorRWwgVG9yaXRvIHNwZWNpZmljYXRpb24uIFRoaXMgaXMgaWRlbnRpY2FsIHRvIFN0YWdlIDIsIGV4Y2VwdCB0aGF0Cit0aGlzIGJvb3RzIHVwIHdpdGhvdXQgU3RhZ2UgMSBhbmQgc2V0cyB1cCBhIHNwZWNpYWwgZHJpdmUgQHNhbXB7KGNkKX0uCisKK0BpdGVtIG5iZ3J1YgorVGhpcyBpcyBhIG5ldHdvcmsgYm9vdCBpbWFnZSBmb3IgdGhlIE5ldHdvcmsgSW1hZ2UgUHJvcG9zYWwgdXNlZCBieSBzb21lCituZXR3b3JrIGJvb3QgbG9hZGVycywgc3VjaCBhcyBFdGhlcmJvb3QuIFRoaXMgaXMgbW9zdGx5IHRoZSBzYW1lIGFzCitTdGFnZSAyLCBidXQgaXQgYWxzbyBzZXRzIHVwIGEgbmV0d29yayBhbmQgbG9hZHMgYSBjb25maWd1cmF0aW9uIGZpbGUKK2Zyb20gdGhlIG5ldHdvcmsuCisKK0BpdGVtIHB4ZWdydWIKK1RoaXMgaXMgYW5vdGhlciBuZXR3b3JrIGJvb3QgaW1hZ2UgZm9yIHRoZSBQcmVib290IEV4ZWN1dGlvbiBFbnZpcm9ubWVudAordXNlZCBieSBzZXZlcmFsIE5ldGJvb3QgUk9Ncy4gVGhpcyBpcyBpZGVudGljYWwgdG8gQGZpbGV7bmJncnVifSwgZXhjZXB0Citmb3IgdGhlIGZvcm1hdC4KK0BlbmQgdGFibGUKKworCitAbm9kZSBGaWxlc3lzdGVtCitAY2hhcHRlciBGaWxlc3lzdGVtIHN5bnRheCBhbmQgc2VtYW50aWNzCisKK0dSVUIgdXNlcyBhIHNwZWNpYWwgc3ludGF4IGZvciBzcGVjaWZ5aW5nIGRpc2sgZHJpdmVzIHdoaWNoIGNhbiBiZQorYWNjZXNzZWQgYnkgQklPUy4gQmVjYXVzZSBvZiBCSU9TIGxpbWl0YXRpb25zLCBHUlVCIGNhbm5vdCBkaXN0aW5ndWlzaAorYmV0d2VlbiBJREUsIEVTREksIFNDU0ksIG9yIG90aGVycy4gWW91IG11c3Qga25vdyB5b3Vyc2VsZiB3aGljaCBCSU9TCitkZXZpY2UgaXMgZXF1aXZhbGVudCB0byB3aGljaCBPUyBkZXZpY2UuIE5vcm1hbGx5LCB0aGF0IHdpbGwgYmUgY2xlYXIgaWYKK3lvdSBzZWUgdGhlIGZpbGVzIGluIGEgZGV2aWNlIG9yIHVzZSB0aGUgY29tbWFuZCBAY29tbWFuZHtmaW5kfQorKEBweHJlZntmaW5kfSkuCisKK0BtZW51CisqIERldmljZSBzeW50YXg6OiAgICAgICAgICAgICAgIEhvdyB0byBzcGVjaWZ5IGRldmljZXMKKyogRmlsZSBuYW1lIHN5bnRheDo6ICAgICAgICAgICAgSG93IHRvIHNwZWNpZnkgZmlsZXMKKyogQmxvY2sgbGlzdCBzeW50YXg6OiAgICAgICAgICAgSG93IHRvIHNwZWNpZnkgYmxvY2sgbGlzdHMKK0BlbmQgbWVudQorCisKK0Bub2RlIERldmljZSBzeW50YXgKK0BzZWN0aW9uIEhvdyB0byBzcGVjaWZ5IGRldmljZXMKKworVGhlIGRldmljZSBzeW50YXggaXMgbGlrZSB0aGlzOgorCitAZXhhbXBsZQorQGNvZGV7KEB2YXJ7ZGV2aWNlfVssQHZhcntwYXJ0LW51bX1dWyxAdmFye2JzZC1zdWJwYXJ0LWxldHRlcn1dKX0KK0BlbmQgZXhhbXBsZQorCitAc2FtcHtbXX0gbWVhbnMgdGhlIHBhcmFtZXRlciBpcyBvcHRpb25hbC4gQHZhcntkZXZpY2V9IHNob3VsZCBiZQorZWl0aGVyIEBzYW1we2ZkfSBvciBAc2FtcHtoZH0gZm9sbG93ZWQgYnkgYSBkaWdpdCwgbGlrZSBAc2FtcHtmZDB9LgorQnV0IHlvdSBjYW4gYWxzbyBzZXQgQHZhcntkZXZpY2V9IHRvIGEgaGV4YWRlY2ltYWwgb3IgYSBkZWNpbWFsIG51bWJlcgord2hpY2ggaXMgYSBCSU9TIGRyaXZlIG51bWJlciwgc28gdGhlIGZvbGxvd2luZyBhcmUgZXF1aXZhbGVudDoKKworQGV4YW1wbGUKKyhoZDApCisoMHg4MCkKKygxMjgpCitAZW5kIGV4YW1wbGUKKworQHZhcntwYXJ0LW51bX0gcmVwcmVzZW50cyB0aGUgcGFydGl0aW9uIG51bWJlciBvZiBAdmFye2RldmljZX0sIHN0YXJ0aW5nCitmcm9tIHplcm8gZm9yIHByaW1hcnkgcGFydGl0aW9ucyBhbmQgZnJvbSBmb3VyIGZvciBleHRlbmRlZCBwYXJ0aXRpb25zLAorYW5kIEB2YXJ7YnNkLXN1YnBhcnQtbGV0dGVyfSByZXByZXNlbnRzIHRoZSBCU0QgZGlza2xhYmVsIHN1YnBhcnRpdGlvbiwKK3N1Y2ggYXMgQHNhbXB7YX0gb3IgQHNhbXB7ZX0uCisKK0Egc2hvcnRjdXQgZm9yIHNwZWNpZnlpbmcgQlNEIHN1YnBhcnRpdGlvbnMgaXMKK0Bjb2RleyhAdmFye2RldmljZX0sQHZhcntic2Qtc3VicGFydC1sZXR0ZXJ9KX0sIGluIHRoaXMgY2FzZSwgR1JVQgorc2VhcmNoZXMgZm9yIHRoZSBmaXJzdCBQQyBwYXJ0aXRpb24gY29udGFpbmluZyBhIEJTRCBkaXNrbGFiZWwsIHRoZW4KK2ZpbmRzIHRoZSBzdWJwYXJ0aXRpb24gQHZhcntic2Qtc3VicGFydC1sZXR0ZXJ9LiBIZXJlIGlzIGFuIGV4YW1wbGU6CisKK0BleGFtcGxlCisoaGQwLGEpCitAZW5kIGV4YW1wbGUKKworVGhlIHN5bnRheCBAc2FtcHsoaGQwKX0gcmVwcmVzZW50cyB1c2luZyB0aGUgZW50aXJlIGRpc2sgKG9yIHRoZQorTUJSIHdoZW4gaW5zdGFsbGluZyBHUlVCKSwgd2hpbGUgdGhlIHN5bnRheCBAc2FtcHsoaGQwLDApfQorcmVwcmVzZW50cyB1c2luZyB0aGUgZmlyc3QgcGFydGl0aW9uIG9mIHRoZSBkaXNrIChvciB0aGUgYm9vdCBzZWN0b3IKK29mIHRoZSBwYXJ0aXRpb24gd2hlbiBpbnN0YWxsaW5nIEdSVUIpLgorCitJZiB5b3UgZW5hYmxlZCB0aGUgbmV0d29yayBzdXBwb3J0LCB0aGUgc3BlY2lhbCBkcml2ZSwgQHNhbXB7KG5kKX0sIGlzCithbHNvIGF2YWlsYWJsZS4gQmVmb3JlIHVzaW5nIHRoZSBuZXR3b3JrIGRyaXZlLCB5b3UgbXVzdCBpbml0aWFsaXplIHRoZQorbmV0d29yay4gQHhyZWZ7TmV0d29ya30sIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitJZiB5b3UgYm9vdCBHUlVCIGZyb20gYSBDRC1ST00sIEBzYW1weyhjZCl9IGlzIGF2YWlsYWJsZS4gQHhyZWZ7TWFraW5nCithIEdSVUIgYm9vdGFibGUgQ0QtUk9NfSwgZm9yIGRldGFpbHMuCisKKworQG5vZGUgRmlsZSBuYW1lIHN5bnRheAorQHNlY3Rpb24gSG93IHRvIHNwZWNpZnkgZmlsZXMKKworVGhlcmUgYXJlIHR3byB3YXlzIHRvIHNwZWNpZnkgZmlsZXMsIGJ5IEBkZm57YWJzb2x1dGUgZmlsZSBuYW1lfSBhbmQgYnkKK0BkZm57YmxvY2sgbGlzdH0uCisKK0FuIGFic29sdXRlIGZpbGUgbmFtZSByZXNlbWJsZXMgYSBVbml4IGFic29sdXRlIGZpbGUgbmFtZSwgdXNpbmcKK0BzYW1wey99IGZvciB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvciAobm90IEBzYW1we1x9IGFzIGluIERPUykuIE9uZQorZXhhbXBsZSBpcyBAc2FtcHsoaGQwLDApL2Jvb3QvZ3J1Yi9tZW51LmxzdH0uIFRoaXMgbWVhbnMgdGhlIGZpbGUKK0BmaWxley9ib290L2dydWIvbWVudS5sc3R9IGluIHRoZSBmaXJzdCBwYXJ0aXRpb24gb2YgdGhlIGZpcnN0IGhhcmQKK2Rpc2suIElmIHlvdSBvbWl0IHRoZSBkZXZpY2UgbmFtZSBpbiBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUsIEdSVUIgdXNlcworR1JVQidzIEBkZm57cm9vdCBkZXZpY2V9IGltcGxpY2l0bHkuIFNvIGlmIHlvdSBzZXQgdGhlIHJvb3QgZGV2aWNlIHRvLAorc2F5LCBAc2FtcHsoaGQxLDApfSBieSB0aGUgY29tbWFuZCBAY29tbWFuZHtyb290fSAoQHB4cmVme3Jvb3R9KSwgdGhlbgorQGNvZGV7L2Jvb3Qva2VybmVsfSBpcyB0aGUgc2FtZSBhcyBAY29kZXsoaGQxLDApL2Jvb3Qva2VybmVsfS4KKworCitAbm9kZSBCbG9jayBsaXN0IHN5bnRheAorQHNlY3Rpb24gSG93IHRvIHNwZWNpZnkgYmxvY2sgbGlzdHMKKworQSBibG9jayBsaXN0IGlzIHVzZWQgZm9yIHNwZWNpZnlpbmcgYSBmaWxlIHRoYXQgZG9lc24ndCBhcHBlYXIgaW4gdGhlCitmaWxlc3lzdGVtLCBsaWtlIGEgY2hhaW5sb2FkZXIuIFRoZSBzeW50YXggaXMKK0Bjb2Rle1tAdmFye29mZnNldH1dK0B2YXJ7bGVuZ3RofVssW0B2YXJ7b2Zmc2V0fV0rQHZhcntsZW5ndGh9XUBkb3Rze319LgorSGVyZSBpcyBhbiBleGFtcGxlOgorCitAZXhhbXBsZQorQGNvZGV7MCsxMDAsMjAwKzEsMzAwKzMwMH0KK0BlbmQgZXhhbXBsZQorCitUaGlzIHJlcHJlc2VudHMgdGhhdCBHUlVCIHNob3VsZCByZWFkIGJsb2NrcyAwIHRocm91Z2ggOTksIGJsb2NrIDIwMCwKK2FuZCBibG9ja3MgMzAwIHRocm91Z2ggNTk5LiBJZiB5b3Ugb21pdCBhbiBvZmZzZXQsIHRoZW4gR1JVQiBhc3N1bWVzCit0aGUgb2Zmc2V0IGlzIHplcm8uCisKK0xpa2UgdGhlIGZpbGUgbmFtZSBzeW50YXggKEBweHJlZntGaWxlIG5hbWUgc3ludGF4fSksIGlmIGEgYmxvY2tsaXN0Citkb2VzIG5vdCBjb250YWluIGEgZGV2aWNlIG5hbWUsIHRoZW4gR1JVQiB1c2VzIEdSVUIncyBAZGZue3Jvb3QKK2RldmljZX0uIFNvIEBjb2RleyhoZDAsMSkrMX0gaXMgdGhlIHNhbWUgYXMgQGNvZGV7KzF9IHdoZW4gdGhlIHJvb3QKK2RldmljZSBpcyBAc2FtcHsoaGQwLDEpfS4KKworCitAbm9kZSBJbnRlcmZhY2UKK0BjaGFwdGVyIEdSVUIncyB1c2VyIGludGVyZmFjZQorCitHUlVCIGhhcyBib3RoIGEgc2ltcGxlIG1lbnUgaW50ZXJmYWNlIGZvciBjaG9vc2luZyBwcmVzZXQgZW50cmllcyBmcm9tIGEKK2NvbmZpZ3VyYXRpb24gZmlsZSwgYW5kIGEgaGlnaGx5IGZsZXhpYmxlIGNvbW1hbmQtbGluZSBmb3IgcGVyZm9ybWluZworYW55IGRlc2lyZWQgY29tYmluYXRpb24gb2YgYm9vdCBjb21tYW5kcy4KKworR1JVQiBsb29rcyBmb3IgaXRzIGNvbmZpZ3VyYXRpb24gZmlsZSBhcyBzb29uIGFzIGl0IGlzIGxvYWRlZC4gSWYgb25lCitpcyBmb3VuZCwgdGhlbiB0aGUgZnVsbCBtZW51IGludGVyZmFjZSBpcyBhY3RpdmF0ZWQgdXNpbmcgd2hhdGV2ZXIKK2VudHJpZXMgd2VyZSBmb3VuZCBpbiB0aGUgZmlsZS4gSWYgeW91IGNob29zZSB0aGUgQGRmbntjb21tYW5kLWxpbmV9IG1lbnUKK29wdGlvbiwgb3IgaWYgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB3YXMgbm90IGZvdW5kLCB0aGVuIEdSVUIgZHJvcHMgdG8KK3RoZSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlLgorCitAbWVudQorKiBDb21tYW5kLWxpbmUgaW50ZXJmYWNlOjogICAgICBUaGUgZmxleGlibGUgY29tbWFuZC1saW5lIGludGVyZmFjZQorKiBNZW51IGludGVyZmFjZTo6ICAgICAgICAgICAgICBUaGUgc2ltcGxlIG1lbnUgaW50ZXJmYWNlCisqIE1lbnUgZW50cnkgZWRpdG9yOjogICAgICAgICAgIEVkaXRpbmcgYSBtZW51IGVudHJ5CisqIEhpZGRlbiBtZW51IGludGVyZmFjZTo6ICAgICAgIFRoZSBoaWRkZW4gbWVudSBpbnRlcmZhY2UKK0BlbmQgbWVudQorCisKK0Bub2RlIENvbW1hbmQtbGluZSBpbnRlcmZhY2UKK0BzZWN0aW9uIFRoZSBmbGV4aWJsZSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlCisKK1RoZSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlIHByb3ZpZGVzIGEgcHJvbXB0IGFuZCBhZnRlciBpdCBhbiBlZGl0YWJsZQordGV4dCBhcmVhIG11Y2ggbGlrZSBhIGNvbW1hbmQtbGluZSBpbiBVbml4IG9yIERPUy4gRWFjaCBjb21tYW5kIGlzCitpbW1lZGlhdGVseSBleGVjdXRlZCBhZnRlciBpdCBpcyBlbnRlcmVkQGZvb3Rub3Rle0hvd2V2ZXIsIHRoaXMKK2JlaGF2aW9yIHdpbGwgYmUgY2hhbmdlZCBpbiB0aGUgZnV0dXJlIHZlcnNpb24sIGluIGEgdXNlci1pbnZpc2libGUKK3dheS59LiBUaGUgY29tbWFuZHMgKEBweHJlZntDb21tYW5kLWxpbmUgYW5kIG1lbnUgZW50cnkgY29tbWFuZHN9KSBhcmUgYQorc3Vic2V0IG9mIHRob3NlIGF2YWlsYWJsZSBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLCB1c2VkIHdpdGggZXhhY3RseQordGhlIHNhbWUgc3ludGF4LgorCitDdXJzb3IgbW92ZW1lbnQgYW5kIGVkaXRpbmcgb2YgdGhlIHRleHQgb24gdGhlIGxpbmUgY2FuIGJlIGRvbmUgdmlhIGEKK3N1YnNldCBvZiB0aGUgZnVuY3Rpb25zIGF2YWlsYWJsZSBpbiB0aGUgQmFzaCBzaGVsbDoKKworQHRhYmxlIEBrZXkKK0BpdGVtIEMtZgorQGl0ZW14IFBDIHJpZ2h0IGtleQorTW92ZSBmb3J3YXJkIG9uZSBjaGFyYWN0ZXIuCisKK0BpdGVtIEMtYgorQGl0ZW14IFBDIGxlZnQga2V5CitNb3ZlIGJhY2sgb25lIGNoYXJhY3Rlci4KKworQGl0ZW0gQy1hCitAaXRlbXggSE9NRQorTW92ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuCisKK0BpdGVtIEMtZQorQGl0ZW14IEVORAorTW92ZSB0aGUgdGhlIGVuZCBvZiB0aGUgbGluZS4KKworQGl0ZW0gQy1kCitAaXRlbXggREVMCitEZWxldGUgdGhlIGNoYXJhY3RlciB1bmRlcm5lYXRoIHRoZSBjdXJzb3IuCisKK0BpdGVtIEMtaAorQGl0ZW14IEJTCitEZWxldGUgdGhlIGNoYXJhY3RlciB0byB0aGUgbGVmdCBvZiB0aGUgY3Vyc29yLgorCitAaXRlbSBDLWsKK0tpbGwgdGhlIHRleHQgZnJvbSB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4KKworQGl0ZW0gQy11CitLaWxsIGJhY2t3YXJkIGZyb20gdGhlIGN1cnNvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLgorCitAaXRlbSBDLXkKK1lhbmsgdGhlIGtpbGxlZCB0ZXh0IGJhY2sgaW50byB0aGUgYnVmZmVyIGF0IHRoZSBjdXJzb3IuCisKK0BpdGVtIEMtcAorQGl0ZW14IFBDIHVwIGtleQorTW92ZSB1cCB0aHJvdWdoIHRoZSBoaXN0b3J5IGxpc3QuCisKK0BpdGVtIEMtbgorQGl0ZW14IFBDIGRvd24ga2V5CitNb3ZlIGRvd24gdGhyb3VnaCB0aGUgaGlzdG9yeSBsaXN0LgorQGVuZCB0YWJsZQorCitXaGVuIHR5cGluZyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5LCBpZiB0aGUgY3Vyc29yIGlzIHdpdGhpbiBvciBiZWZvcmUKK3RoZSBmaXJzdCB3b3JkIGluIHRoZSBjb21tYW5kLWxpbmUsIHByZXNzaW5nIHRoZSBAa2V5e1RBQn0ga2V5IChvcgorQGtleXtDLWl9KSB3aWxsIGRpc3BsYXkgYSBsaXN0aW5nIG9mIHRoZSBhdmFpbGFibGUgY29tbWFuZHMsIGFuZCBpZiB0aGUKK2N1cnNvciBpcyBhZnRlciB0aGUgZmlyc3Qgd29yZCwgdGhlIEBrYmR7QGtleXtUQUJ9fSB3aWxsIHByb3ZpZGUgYQorY29tcGxldGlvbiBsaXN0aW5nIG9mIGRpc2tzLCBwYXJ0aXRpb25zLCBhbmQgZmlsZSBuYW1lcyBkZXBlbmRpbmcgb24gdGhlCitjb250ZXh0LiBOb3RlIHRoYXQgdG8gb2J0YWluIGEgbGlzdCBvZiBkcml2ZXMsIG9uZSBtdXN0IG9wZW4gYQorcGFyZW50aGVzaXMsIGFzIEBjb21tYW5ke3Jvb3QgKH0uCisKK05vdGUgdGhhdCB5b3UgY2Fubm90IHVzZSB0aGUgY29tcGxldGlvbiBmdW5jdGlvbmFsaXR5IGluIHRoZSBURlRQCitmaWxlc3lzdGVtLiBUaGlzIGlzIGJlY2F1c2UgVEZUUCBkb2Vzbid0IHN1cHBvcnQgZmlsZSBuYW1lIGxpc3RpbmcgZm9yCit0aGUgc2VjdXJpdHkuCisKKworQG5vZGUgTWVudSBpbnRlcmZhY2UKK0BzZWN0aW9uIFRoZSBzaW1wbGUgbWVudSBpbnRlcmZhY2UKKworVGhlIG1lbnUgaW50ZXJmYWNlIGlzIHF1aXRlIGVhc3kgdG8gdXNlLiBJdHMgY29tbWFuZHMgYXJlIGJvdGgKK3JlYXNvbmFibHkgaW50dWl0aXZlIGFuZCBkZXNjcmliZWQgb24gc2NyZWVuLgorCitCYXNpY2FsbHksIHRoZSBtZW51IGludGVyZmFjZSBwcm92aWRlcyBhIGxpc3Qgb2YgQGRmbntib290IGVudHJpZXN9IHRvCit0aGUgdXNlciB0byBjaG9vc2UgZnJvbS4gVXNlIHRoZSBhcnJvdyBrZXlzIHRvIHNlbGVjdCB0aGUgZW50cnkgb2YKK2Nob2ljZSwgdGhlbiBwcmVzcyBAa2V5e1JFVH0gdG8gcnVuIGl0LiAgQW4gb3B0aW9uYWwgdGltZW91dCBpcworYXZhaWxhYmxlIHRvIGJvb3QgdGhlIGRlZmF1bHQgZW50cnkgKHRoZSBmaXJzdCBvbmUgaWYgbm90IHNldCksIHdoaWNoIGlzCithYm9ydGVkIGJ5IHByZXNzaW5nIGFueSBrZXkuCisKK0NvbW1hbmRzIGFyZSBhdmFpbGFibGUgdG8gZW50ZXIgYSBiYXJlIGNvbW1hbmQtbGluZSBieSBwcmVzc2luZyBAa2V5e2N9Cisod2hpY2ggb3BlcmF0ZXMgZXhhY3RseSBsaWtlIHRoZSBub24tY29uZmlnLWZpbGUgdmVyc2lvbiBvZiBHUlVCLCBidXQKK2FsbG93cyBvbmUgdG8gcmV0dXJuIHRvIHRoZSBtZW51IGlmIGRlc2lyZWQgYnkgcHJlc3NpbmcgQGtleXtFU0N9KSBvciB0bworZWRpdCBhbnkgb2YgdGhlIEBkZm57Ym9vdCBlbnRyaWVzfSBieSBwcmVzc2luZyBAa2V5e2V9LgorCitJZiB5b3UgcHJvdGVjdCB0aGUgbWVudSBpbnRlcmZhY2Ugd2l0aCBhIHBhc3N3b3JkIChAcHhyZWZ7U2VjdXJpdHl9KSwKK2FsbCB5b3UgY2FuIGRvIGlzIGNob29zZSBhbiBlbnRyeSBieSBwcmVzc2luZyBAa2V5e1JFVH0sIG9yIHByZXNzCitAa2V5e3B9IHRvIGVudGVyIHRoZSBwYXNzd29yZC4KKworCitAbm9kZSBNZW51IGVudHJ5IGVkaXRvcgorQHNlY3Rpb24gRWRpdGluZyBhIG1lbnUgZW50cnkKKworVGhlIG1lbnUgZW50cnkgZWRpdG9yIGxvb2tzIG11Y2ggbGlrZSB0aGUgbWFpbiBtZW51IGludGVyZmFjZSwgYnV0IHRoZQorbGluZXMgaW4gdGhlIG1lbnUgYXJlIGluZGl2aWR1YWwgY29tbWFuZHMgaW4gdGhlIHNlbGVjdGVkIGVudHJ5IGluc3RlYWQKK29mIGVudHJ5IG5hbWVzLgorCitJZiBhbiBAa2V5e0VTQ30gaXMgcHJlc3NlZCBpbiB0aGUgZWRpdG9yLCBpdCBhYm9ydHMgYWxsIHRoZSBjaGFuZ2VzIG1hZGUKK3RvIHRoZSBjb25maWd1cmF0aW9uIGVudHJ5IGFuZCByZXR1cm5zIHRvIHRoZSBtYWluIG1lbnUgaW50ZXJmYWNlLgorCitXaGVuIGEgcGFydGljdWxhciBsaW5lIGlzIHNlbGVjdGVkLCB0aGUgZWRpdG9yIHBsYWNlcyB0aGUgdXNlciBpbiBhCitzcGVjaWFsIHZlcnNpb24gb2YgdGhlIEdSVUIgY29tbWFuZC1saW5lIHRvIGVkaXQgdGhhdCBsaW5lLiAgV2hlbiB0aGUKK3VzZXIgaGl0cyBAa2V5e1JFVH0sIEdSVUIgcmVwbGFjZXMgdGhlIGxpbmUgaW4gcXVlc3Rpb24gaW4gdGhlIGJvb3QKK2VudHJ5IHdpdGggdGhlIGNoYW5nZXMgKHVubGVzcyBpdCB3YXMgYWJvcnRlZCB2aWEgQGtleXtFU0N9LAoraW4gd2hpY2ggY2FzZSB0aGUgY2hhbmdlcyBhcmUgdGhyb3duIGF3YXkpLgorCitJZiB5b3Ugd2FudCB0byBhZGQgYSBuZXcgbGluZSB0byB0aGUgbWVudSBlbnRyeSwgcHJlc3MgQGtleXtvfSBpZiBhZGRpbmcKK2EgbGluZSBhZnRlciB0aGUgY3VycmVudCBsaW5lIG9yIHByZXNzIEBrZXl7T30gaWYgYmVmb3JlIHRoZSBjdXJyZW50CitsaW5lLgorCitUbyBkZWxldGUgYSBsaW5lLCBoaXQgdGhlIGtleSBAa2V5e2R9LiBBbHRob3VnaCBHUlVCIHVuZm9ydHVuYXRlbHkKK2RvZXMgbm90IHN1cHBvcnQgQGRmbnt1bmRvfSwgeW91IGNhbiBkbyBhbG1vc3QgdGhlIHNhbWUgdGhpbmcgYnkganVzdAorcmV0dXJuaW5nIHRvIHRoZSBtYWluIG1lbnUuCisKKworQG5vZGUgSGlkZGVuIG1lbnUgaW50ZXJmYWNlCitAc2VjdGlvbiBUaGUgaGlkZGVuIG1lbnUgaW50ZXJmYWNlCisKK1doZW4geW91ciB0ZXJtaW5hbCBpcyBkdW1iIG9yIHlvdSByZXF1ZXN0IEdSVUIgdG8gaGlkZSB0aGUgbWVudQoraW50ZXJmYWNlIGV4cGxpY2l0bHkgd2l0aCB0aGUgY29tbWFuZCBAY29tbWFuZHtoaWRkZW5tZW51fQorKEBweHJlZntoaWRkZW5tZW51fSksIEdSVUIgZG9lc24ndCBzaG93IHRoZSBtZW51IGludGVyZmFjZSAoQHB4cmVme01lbnUKK2ludGVyZmFjZX0pIGFuZCBhdXRvbWF0aWNhbGx5IGJvb3RzIHRoZSBkZWZhdWx0IGVudHJ5LCB1bmxlc3MKK2ludGVycnVwdGVkIGJ5IHByZXNzaW5nIEBrZXl7RVNDfS4KKworV2hlbiB5b3UgaW50ZXJydXB0IHRoZSB0aW1lb3V0IGFuZCB5b3VyIHRlcm1pbmFsIGlzIGR1bWIsIEdSVUIgZmFsbHMKK2JhY2sgdG8gdGhlIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UgKEBweHJlZntDb21tYW5kLWxpbmUgaW50ZXJmYWNlfSkuCisKKworQG5vZGUgQ29tbWFuZHMKK0BjaGFwdGVyIFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBjb21tYW5kcworCitJbiB0aGlzIGNoYXB0ZXIsIHdlIGxpc3QgYWxsIGNvbW1hbmRzIHRoYXQgYXJlIGF2YWlsYWJsZSBpbiBHUlVCLgorCitDb21tYW5kcyBiZWxvbmcgdG8gZGlmZmVyZW50IGdyb3Vwcy4gQSBmZXcgY2FuIG9ubHkgYmUgdXNlZCBpbgordGhlIGdsb2JhbCBzZWN0aW9uIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKG9yIGBgbWVudScnKTsgbW9zdAorb2YgdGhlbSBjYW4gYmUgZW50ZXJlZCBvbiB0aGUgY29tbWFuZC1saW5lIGFuZCBjYW4gYmUgdXNlZCBlaXRoZXIKK2FueXdoZXJlIGluIHRoZSBtZW51IG9yIHNwZWNpZmljYWxseSBpbiB0aGUgbWVudSBlbnRyaWVzLgorCitAbWVudQorKiBNZW51LXNwZWNpZmljIGNvbW1hbmRzOjoKKyogR2VuZXJhbCBjb21tYW5kczo6CisqIENvbW1hbmQtbGluZSBhbmQgbWVudSBlbnRyeSBjb21tYW5kczo6CitAZW5kIG1lbnUKKworCitAbm9kZSBNZW51LXNwZWNpZmljIGNvbW1hbmRzCitAc2VjdGlvbiBUaGUgbGlzdCBvZiBjb21tYW5kcyBmb3IgdGhlIG1lbnUgb25seQorCitUaGUgc2VtYW50aWNzIHVzZWQgaW4gcGFyc2luZyB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGFyZSB0aGUgZm9sbG93aW5nOgorCitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbQorVGhlIG1lbnUtc3BlY2lmaWMgY29tbWFuZHMgaGF2ZSB0byBiZSB1c2VkIGJlZm9yZSBhbnkgb3RoZXJzLgorCitAaXRlbQorVGhlIGZpbGVzIEBlbXBoe211c3R9IGJlIGluIHBsYWluLXRleHQgZm9ybWF0LgorCitAaXRlbQorQHNhbXB7I30gYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgaW4gYSBjb25maWd1cmF0aW9uIGZpbGUgbWVhbnMgaXQgaXMKK29ubHkgYSBjb21tZW50LgorCitAaXRlbQorT3B0aW9ucyBhcmUgc2VwYXJhdGVkIGJ5IHNwYWNlcy4KKworQGl0ZW0KK0FsbCBudW1iZXJzIGNhbiBiZSBlaXRoZXIgZGVjaW1hbCBvciBoZXhhZGVjaW1hbC4gQSBoZXhhZGVjaW1hbCBudW1iZXIKK211c3QgYmUgcHJlY2VkZWQgYnkgQHNhbXB7MHh9LCBhbmQgaXMgY2FzZS1pbnNlbnNpdGl2ZS4KKworQGl0ZW0KK0V4dHJhIG9wdGlvbnMgb3IgdGV4dCBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIGFyZSBpZ25vcmVkIHVubGVzcyBvdGhlcndpc2UKK3NwZWNpZmllZC4KKworQGl0ZW0KK1VucmVjb2duaXplZCBjb21tYW5kcyBhcmUgYWRkZWQgdG8gdGhlIGN1cnJlbnQgZW50cnksIGV4Y2VwdCBiZWZvcmUgZW50cmllcworc3RhcnQsIHdoZXJlIHRoZXkgYXJlIGlnbm9yZWQuCitAZW5kIGl0ZW1pemUKKworVGhlc2UgY29tbWFuZHMgY2FuIG9ubHkgYmUgdXNlZCBpbiB0aGUgbWVudToKKworQG1lbnUKKyogZGVmYXVsdDo6ICAgICAgICAgICAgICAgICAgICAgU2V0IHRoZSBkZWZhdWx0IGVudHJ5CisqIGZhbGxiYWNrOjogICAgICAgICAgICAgICAgICAgIFNldCB0aGUgZmFsbGJhY2sgZW50cnkKKyogaGlkZGVubWVudTo6ICAgICAgICAgICAgICAgICAgSGlkZSB0aGUgbWVudSBpbnRlcmZhY2UKKyogdGltZW91dDo6ICAgICAgICAgICAgICAgICAgICAgU2V0IHRoZSB0aW1lb3V0CisqIHRpdGxlOjogICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0IGEgbWVudSBlbnRyeQorQGVuZCBtZW51CisKKworQG5vZGUgZGVmYXVsdAorQHN1YnNlY3Rpb24gZGVmYXVsdAorCitAZGVmZm4gQ29tbWFuZCBkZWZhdWx0IG51bQorU2V0IHRoZSBkZWZhdWx0IGVudHJ5IHRvIHRoZSBlbnRyeSBudW1iZXIgQHZhcntudW19LiBOdW1iZXJpbmcgc3RhcnRzCitmcm9tIDAsIGFuZCB0aGUgZW50cnkgbnVtYmVyIDAgaXMgdGhlIGRlZmF1bHQgaWYgdGhlIGNvbW1hbmQgaXMgbm90Cit1c2VkLgorCitZb3UgY2FuIHNwZWNpZnkgQHNhbXB7c2F2ZWR9IGluc3RlYWQgb2YgYSBudW1iZXIuIEluIHRoaXMgY2FzZSwgdGhlCitkZWZhdWx0IGVudHJ5IGlzIHRoZSBlbnRyeSBzYXZlZCB3aXRoIHRoZSBjb21tYW5kCitAY29tbWFuZHtzYXZlZGVmYXVsdH0uIEB4cmVme3NhdmVkZWZhdWx0fSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCitAZW5kIGRlZmZuCisKKworQG5vZGUgZmFsbGJhY2sKK0BzdWJzZWN0aW9uIGZhbGxiYWNrCisKK0BkZWZmbiBDb21tYW5kIGZhbGxiYWNrIG51bS4uLgorR28gaW50byB1bmF0dGVuZGVkIGJvb3QgbW9kZTogaWYgdGhlIGRlZmF1bHQgYm9vdCBlbnRyeSBoYXMgYW55IGVycm9ycywKK2luc3RlYWQgb2Ygd2FpdGluZyBmb3IgdGhlIHVzZXIgdG8gZG8gc29tZXRoaW5nLCBpbW1lZGlhdGVseSBzdGFydAorb3ZlciB1c2luZyB0aGUgQHZhcntudW19IGVudHJ5IChzYW1lIG51bWJlcmluZyBhcyB0aGUgQGNvZGV7ZGVmYXVsdH0KK2NvbW1hbmQgKEBweHJlZntkZWZhdWx0fSkpLiBUaGlzIG9idmlvdXNseSB3b24ndCBoZWxwIGlmIHRoZSBtYWNoaW5lIHdhcworcmVib290ZWQgYnkgYSBrZXJuZWwgdGhhdCBHUlVCIGxvYWRlZC4gWW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlCitmYWxsYmFjayBlbnRyeSBudW1iZXJzLgorQGVuZCBkZWZmbgorCisKK0Bub2RlIGhpZGRlbm1lbnUKK0BzdWJzZWN0aW9uIGhpZGRlbm1lbnUKKworQGRlZmZuIENvbW1hbmQgaGlkZGVubWVudQorRG9uJ3QgZGlzcGxheSB0aGUgbWVudS4gSWYgdGhlIGNvbW1hbmQgaXMgdXNlZCwgbm8gbWVudSB3aWxsIGJlCitkaXNwbGF5ZWQgb24gdGhlIGNvbnRyb2wgdGVybWluYWwsIGFuZCB0aGUgZGVmYXVsdCBlbnRyeSB3aWxsIGJlCitib290ZWQgYWZ0ZXIgdGhlIHRpbWVvdXQgZXhwaXJlZC4gVGhlIHVzZXIgY2FuIHN0aWxsIHJlcXVlc3QgdGhlCittZW51IHRvIGJlIGRpc3BsYXllZCBieSBwcmVzc2luZyBAa2V5e0VTQ30gYmVmb3JlIHRoZSB0aW1lb3V0CitleHBpcmVzLiBTZWUgYWxzbyBAcmVme0hpZGRlbiBtZW51IGludGVyZmFjZX0uCitAZW5kIGRlZmZuCisKKworQG5vZGUgdGltZW91dAorQHN1YnNlY3Rpb24gdGltZW91dAorCitAZGVmZm4gQ29tbWFuZCB0aW1lb3V0IHNlYworU2V0IGEgdGltZW91dCwgaW4gQHZhcntzZWN9IHNlY29uZHMsIGJlZm9yZSBhdXRvbWF0aWNhbGx5IGJvb3RpbmcgdGhlCitkZWZhdWx0IGVudHJ5IChub3JtYWxseSB0aGUgZmlyc3QgZW50cnkgZGVmaW5lZCkuCitAZW5kIGRlZmZuCisKKworQG5vZGUgdGl0bGUKK0BzdWJzZWN0aW9uIHRpdGxlCisKK0BkZWZmbiBDb21tYW5kIHRpdGxlIG5hbWUgQGRvdHN7fQorU3RhcnQgYSBuZXcgYm9vdCBlbnRyeSwgYW5kIHNldCBpdHMgbmFtZSB0byB0aGUgY29udGVudHMgb2YgdGhlIHJlc3Qgb2YKK3RoZSBsaW5lLCBzdGFydGluZyB3aXRoIHRoZSBmaXJzdCBub24tc3BhY2UgY2hhcmFjdGVyLgorQGVuZCBkZWZmbgorCisKK0Bub2RlIEdlbmVyYWwgY29tbWFuZHMKK0BzZWN0aW9uIFRoZSBsaXN0IG9mIGdlbmVyYWwgY29tbWFuZHMKKworQ29tbWFuZHMgdXNhYmxlIGFueXdoZXJlIGluIHRoZSBtZW51IGFuZCBpbiB0aGUgY29tbWFuZC1saW5lLgorCitAbWVudQorKiBib290cDo6ICAgICAgICAgICAgICAgICAgICAgICBJbml0aWFsaXplIGEgbmV0d29yayBkZXZpY2UgdmlhIEJPT1RQCisqIGNvbG9yOjogICAgICAgICAgICAgICAgICAgICAgIENvbG9yIHRoZSBtZW51IGludGVyZmFjZQorKiBkZXZpY2U6OiAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZ5IGEgZmlsZSBhcyBhIGRyaXZlCisqIGRoY3A6OiAgICAgICAgICAgICAgICAgICAgICAgIEluaXRpYWxpemUgYSBuZXR3b3JrIGRldmljZSB2aWEgREhDUAorKiBoaWRlOjogICAgICAgICAgICAgICAgICAgICAgICBIaWRlIGEgcGFydGl0aW9uCisqIGlmY29uZmlnOjogICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyZSBhIG5ldHdvcmsgZGV2aWNlIG1hbnVhbGx5CisqIHBhZ2VyOjogICAgICAgICAgICAgICAgICAgICAgIENoYW5nZSB0aGUgc3RhdGUgb2YgdGhlIGludGVybmFsIHBhZ2VyCisqIHBhcnRuZXc6OiAgICAgICAgICAgICAgICAgICAgIE1ha2UgYSBwcmltYXJ5IHBhcnRpdGlvbgorKiBwYXJ0dHlwZTo6ICAgICAgICAgICAgICAgICAgICBDaGFuZ2UgdGhlIHR5cGUgb2YgYSBwYXJ0aXRpb24KKyogcGFzc3dvcmQ6OiAgICAgICAgICAgICAgICAgICAgU2V0IGEgcGFzc3dvcmQgZm9yIHRoZSBtZW51IGludGVyZmFjZQorKiByYXJwOjogICAgICAgICAgICAgICAgICAgICAgICBJbml0aWFsaXplIGEgbmV0d29yayBkZXZpY2UgdmlhIFJBUlAKKyogc2VyaWFsOjogICAgICAgICAgICAgICAgICAgICAgU2V0IHVwIGEgc2VyaWFsIGRldmljZQorKiBzZXRrZXk6OiAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmUgdGhlIGtleSBtYXAKKyogdGVybWluYWw6OiAgICAgICAgICAgICAgICAgICAgQ2hvb3NlIGEgdGVybWluYWwKKyogdGVybWluZm86OiAgICAgICAgICAgICAgICAgICAgRGVmaW5lIGVzY2FwZSBzZXF1ZW5jZXMgZm9yIGEgdGVybWluYWwKKyogdGZ0cHNlcnZlcjo6ICAgICAgICAgICAgICAgICAgU3BlY2lmeSBhIFRGVFAgc2VydmVyCisqIHVuaGlkZTo6ICAgICAgICAgICAgICAgICAgICAgIFVuaGlkZSBhIHBhcnRpdGlvbgorQGVuZCBtZW51CisKKworQG5vZGUgYm9vdHAKK0BzdWJzZWN0aW9uIGJvb3RwCisKK0BkZWZmbiBDb21tYW5kIGJvb3RwIFtAb3B0aW9uey0td2l0aC1jb25maWdmaWxlfV0KK0luaXRpYWxpemUgYSBuZXR3b3JrIGRldmljZSB2aWEgdGhlIEBkZm57Qk9PVFB9IHByb3RvY29sLiBUaGlzIGNvbW1hbmQKK2lzIG9ubHkgYXZhaWxhYmxlIGlmIEdSVUIgaXMgY29tcGlsZWQgd2l0aCBuZXRib290IHN1cHBvcnQuIFNlZSBhbHNvCitAcmVme05ldHdvcmt9LgorCitJZiB5b3Ugc3BlY2lmeSBAb3B0aW9uey0td2l0aC1jb25maWdmaWxlfSB0byB0aGlzIGNvbW1hbmQsIEdSVUIgd2lsbAorZmV0Y2ggYW5kIGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgc3BlY2lmaWVkIGJ5IHlvdXIgQk9PVFAgc2VydmVyCit3aXRoIHRoZSB2ZW5kb3IgdGFnIEBzYW1wezE1MH0uCitAZW5kIGRlZmZuCisKKworQG5vZGUgY29sb3IKK0BzdWJzZWN0aW9uIGNvbG9yCisKK0BkZWZmbiBDb21tYW5kIGNvbG9yIG5vcm1hbCBbaGlnaGxpZ2h0XQorQ2hhbmdlIHRoZSBtZW51IGNvbG9ycy4gVGhlIGNvbG9yIEB2YXJ7bm9ybWFsfSBpcyB1c2VkIGZvciBtb3N0CitsaW5lcyBpbiB0aGUgbWVudSAoQHB4cmVme01lbnUgaW50ZXJmYWNlfSksIGFuZCB0aGUgY29sb3IKK0B2YXJ7aGlnaGxpZ2h0fSBpcyB1c2VkIHRvIGhpZ2hsaWdodCB0aGUgbGluZSB3aGVyZSB0aGUgY3Vyc29yCitwb2ludHMuIElmIHlvdSBvbWl0IEB2YXJ7aGlnaGxpZ2h0fSwgdGhlbiB0aGUgaW52ZXJ0ZWQgY29sb3Igb2YKK0B2YXJ7bm9ybWFsfSBpcyB1c2VkIGZvciB0aGUgaGlnaGxpZ2h0ZWQgbGluZS4gVGhlIGZvcm1hdCBvZiBhIGNvbG9yIGlzCitAY29kZXtAdmFye2ZvcmVncm91bmR9L0B2YXJ7YmFja2dyb3VuZH19LiBAdmFye2ZvcmVncm91bmR9IGFuZAorQHZhcntiYWNrZ3JvdW5kfSBhcmUgc3ltYm9saWMgY29sb3IgbmFtZXMuIEEgc3ltYm9saWMgY29sb3IgbmFtZSBtdXN0IGJlCitvbmUgb2YgdGhlc2U6CisKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitibGFjaworCitAaXRlbQorYmx1ZQorCitAaXRlbQorZ3JlZW4KKworQGl0ZW0KK2N5YW4KKworQGl0ZW0KK3JlZAorCitAaXRlbQorbWFnZW50YQorCitAaXRlbQorYnJvd24KKworQGl0ZW0KK2xpZ2h0LWdyYXkKKworQHN0cm9uZ3tUaGVzZSBiZWxvdyBjYW4gYmUgc3BlY2lmaWVkIG9ubHkgZm9yIHRoZSBmb3JlZ3JvdW5kLn0KKworQGl0ZW0KK2RhcmstZ3JheQorCitAaXRlbQorbGlnaHQtYmx1ZQorCitAaXRlbQorbGlnaHQtZ3JlZW4KKworQGl0ZW0KK2xpZ2h0LWN5YW4KKworQGl0ZW0KK2xpZ2h0LXJlZAorCitAaXRlbQorbGlnaHQtbWFnZW50YQorCitAaXRlbQoreWVsbG93CisKK0BpdGVtCit3aGl0ZQorQGVuZCBpdGVtaXplCisKK0J1dCBvbmx5IHRoZSBmaXJzdCBlaWdodCBuYW1lcyBjYW4gYmUgdXNlZCBmb3IgQHZhcntiYWNrZ3JvdW5kfS4gWW91IGNhbgorcHJlZml4IEBjb2Rle2JsaW5rLX0gdG8gQHZhcntmb3JlZ3JvdW5kfSBpZiB5b3Ugd2FudCBhIGJsaW5raW5nCitmb3JlZ3JvdW5kIGNvbG9yLgorCitUaGlzIGNvbW1hbmQgY2FuIGJlIHVzZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgb24gdGhlIGNvbW1hbmQKK2xpbmUsIHNvIHlvdSBtYXkgd3JpdGUgc29tZXRoaW5nIGxpa2UgdGhpcyBpbiB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZToKKworQGV4YW1wbGUKK0Bncm91cAorIyBTZXQgZGVmYXVsdCBjb2xvcnMuCitjb2xvciBsaWdodC1ncmF5L2JsdWUgYmxhY2svbGlnaHQtZ3JheQorCisjIENoYW5nZSB0aGUgY29sb3JzLgordGl0bGUgT1MtQlMgbGlrZQorY29sb3IgbWFnZW50YS9ibHVlIGJsYWNrL21hZ2VudGEKK0BlbmQgZ3JvdXAKK0BlbmQgZXhhbXBsZQorQGVuZCBkZWZmbgorCisKK0Bub2RlIGRldmljZQorQHN1YnNlY3Rpb24gZGV2aWNlCisKK0BkZWZmbiBDb21tYW5kIGRldmljZSBkcml2ZSBmaWxlCitJbiB0aGUgZ3J1YiBzaGVsbCwgc3BlY2lmeSB0aGUgZmlsZSBAdmFye2ZpbGV9IGFzIHRoZSBhY3R1YWwgZHJpdmUgZm9yIGEKK0BzY3tiaW9zfSBkcml2ZSBAdmFye2RyaXZlfS4gWW91IGNhbiB1c2UgdGhpcyBjb21tYW5kIHRvIGNyZWF0ZSBhIGRpc2sKK2ltYWdlLCBhbmQvb3IgdG8gZml4IHRoZSBkcml2ZXMgZ3Vlc3NlZCBieSBHUlVCIHdoZW4gR1JVQiBmYWlscyB0bworZGV0ZXJtaW5lIHRoZW0gY29ycmVjdGx5LCBsaWtlIHRoaXM6CisKK0BleGFtcGxlCitAZ3JvdXAKK2dydWI+IEBrYmR7ZGV2aWNlIChmZDApIC9mbG9wcHktaW1hZ2V9CitncnViPiBAa2Jke2RldmljZSAoaGQwKSAvZGV2L3NkMH0KK0BlbmQgZ3JvdXAKK0BlbmQgZXhhbXBsZQorCitUaGlzIGNvbW1hbmQgY2FuIGJlIHVzZWQgb25seSBpbiB0aGUgZ3J1YiBzaGVsbCAoQHB4cmVme0ludm9raW5nIHRoZQorZ3J1YiBzaGVsbH0pLgorQGVuZCBkZWZmbgorCisKK0Bub2RlIGRoY3AKK0BzdWJzZWN0aW9uIGRoY3AKKworQGRlZmZuIENvbW1hbmQgZGhjcCBbLS13aXRoLWNvbmZpZ2ZpbGVdCitJbml0aWFsaXplIGEgbmV0d29yayBkZXZpY2UgdmlhIHRoZSBAZGZue0RIQ1B9IHByb3RvY29sLiBDdXJyZW50bHksCit0aGlzIGNvbW1hbmQgaXMganVzdCBhbiBhbGlhcyBmb3IgQGNvbW1hbmR7Ym9vdHB9LCBzaW5jZSB0aGUgdHdvCitwcm90b2NvbHMgYXJlIHZlcnkgc2ltaWxhci4gVGhpcyBjb21tYW5kIGlzIG9ubHkgYXZhaWxhYmxlIGlmIEdSVUIgaXMKK2NvbXBpbGVkIHdpdGggbmV0Ym9vdCBzdXBwb3J0LiBTZWUgYWxzbyBAcmVme05ldHdvcmt9LgorCitJZiB5b3Ugc3BlY2lmeSBAb3B0aW9uey0td2l0aC1jb25maWdmaWxlfSB0byB0aGlzIGNvbW1hbmQsIEdSVUIgd2lsbAorZmV0Y2ggYW5kIGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgc3BlY2lmaWVkIGJ5IHlvdXIgREhDUCBzZXJ2ZXIKK3dpdGggdGhlIHZlbmRvciB0YWcgQHNhbXB7MTUwfS4KK0BlbmQgZGVmZm4KKworCitAbm9kZSBoaWRlCitAc3Vic2VjdGlvbiBoaWRlCisKK0BkZWZmbiBDb21tYW5kIGhpZGUgcGFydGl0aW9uCitIaWRlIHRoZSBwYXJ0aXRpb24gQHZhcntwYXJ0aXRpb259IGJ5IHNldHRpbmcgdGhlIEBkZm57aGlkZGVufSBiaXQgaW4KK2l0cyBwYXJ0aXRpb24gdHlwZSBjb2RlLiBUaGlzIGlzIHVzZWZ1bCBvbmx5IHdoZW4gYm9vdGluZyBET1Mgb3IgV2luZG93cworYW5kIG11bHRpcGxlIHByaW1hcnkgRkFUIHBhcnRpdGlvbnMgZXhpc3QgaW4gb25lIGRpc2suIFNlZSBhbHNvCitAcmVme0RPUy9XaW5kb3dzfS4KK0BlbmQgZGVmZm4KKworCitAbm9kZSBpZmNvbmZpZworQHN1YnNlY3Rpb24gaWZjb25maWcKKworQGRlZmZuIENvbW1hbmQgaWZjb25maWcgW0BvcHRpb257LS1zZXJ2ZXI9c2VydmVyfV0gW0BvcHRpb257LS1nYXRld2F5PWdhdGV3YXl9XSBbQG9wdGlvbnstLW1hc2s9bWFza31dIFtAb3B0aW9uey0tYWRkcmVzcz1hZGRyZXNzfV0KK0NvbmZpZ3VyZSB0aGUgSVAgYWRkcmVzcywgdGhlIG5ldG1hc2ssIHRoZSBnYXRld2F5LCBhbmQgdGhlIHNlcnZlcgorYWRkcmVzcyBvZiBhIG5ldHdvcmsgZGV2aWNlIG1hbnVhbGx5LiBUaGUgdmFsdWVzIG11c3QgYmUgaW4gZG90dGVkCitkZWNpbWFsIGZvcm1hdCwgbGlrZSBAc2FtcHsxOTIuMTY4LjExLjE3OH0uIFRoZSBvcmRlciBvZiB0aGUgb3B0aW9ucyBpcworbm90IGltcG9ydGFudC4gVGhpcyBjb21tYW5kIHNob3dzIGN1cnJlbnQgbmV0d29yayBjb25maWd1cmF0aW9uLCBpZiBubworb3B0aW9uIGlzIHNwZWNpZmllZC4gU2VlIGFsc28gQHJlZntOZXR3b3JrfS4KK0BlbmQgZGVmZm4KKworCitAbm9kZSBwYWdlcgorQHN1YnNlY3Rpb24gcGFnZXIKKworQGRlZmZuIENvbW1hbmQgcGFnZXIgW2ZsYWddCitUb2dnbGUgb3Igc2V0IHRoZSBzdGF0ZSBvZiB0aGUgaW50ZXJuYWwgcGFnZXIuIElmIEB2YXJ7ZmxhZ30gaXMKK0BzYW1we29ufSwgdGhlIGludGVybmFsIHBhZ2VyIGlzIGVuYWJsZWQuIElmIEB2YXJ7ZmxhZ30gaXMgQHNhbXB7b2ZmfSwKK2l0IGlzIGRpc2FibGVkLiBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIHN0YXRlIGlzIHRvZ2dsZWQuCitAZW5kIGRlZmZuCisKKworQG5vZGUgcGFydG5ldworQHN1YnNlY3Rpb24gcGFydG5ldworCitAZGVmZm4gQ29tbWFuZCBwYXJ0bmV3IHBhcnQgdHlwZSBmcm9tIGxlbgorQ3JlYXRlIGEgbmV3IHByaW1hcnkgcGFydGl0aW9uLiBAdmFye3BhcnR9IGlzIGEgcGFydGl0aW9uIHNwZWNpZmljYXRpb24KK2luIEdSVUIgc3ludGF4IChAcHhyZWZ7TmFtaW5nIGNvbnZlbnRpb259KTsgQHZhcnt0eXBlfSBpcyB0aGUgcGFydGl0aW9uCit0eXBlIGFuZCBtdXN0IGJlIGEgbnVtYmVyIGluIHRoZSByYW5nZSBAY29kZXswLTB4ZmZ9OyBAdmFye2Zyb219IGlzCit0aGUgc3RhcnRpbmcgYWRkcmVzcyBhbmQgQHZhcntsZW59IGlzIHRoZSBsZW5ndGgsIGJvdGggaW4gc2VjdG9yIHVuaXRzLgorQGVuZCBkZWZmbgorCisKK0Bub2RlIHBhcnR0eXBlCitAc3Vic2VjdGlvbiBwYXJ0dHlwZQorCitAZGVmZm4gQ29tbWFuZCBwYXJ0dHlwZSBwYXJ0IHR5cGUKK0NoYW5nZSB0aGUgdHlwZSBvZiBhbiBleGlzdGluZyBwYXJ0aXRpb24uICBAdmFye3BhcnR9IGlzIGEgcGFydGl0aW9uCitzcGVjaWZpY2F0aW9uIGluIEdSVUIgc3ludGF4IChAcHhyZWZ7TmFtaW5nIGNvbnZlbnRpb259KTsgQHZhcnt0eXBlfQoraXMgdGhlIG5ldyBwYXJ0aXRpb24gdHlwZSBhbmQgbXVzdCBiZSBhIG51bWJlciBpbiB0aGUgcmFuZ2UgMC0weGZmLgorQGVuZCBkZWZmbgorCisKK0Bub2RlIHBhc3N3b3JkCitAc3Vic2VjdGlvbiBwYXNzd29yZAorCitAZGVmZm4gQ29tbWFuZCBwYXNzd29yZCBbQG9wdGlvbnstLW1kNX1dIHBhc3N3ZCBbbmV3LWNvbmZpZy1maWxlXQorSWYgdXNlZCBpbiB0aGUgZmlyc3Qgc2VjdGlvbiBvZiBhIG1lbnUgZmlsZSwgZGlzYWJsZSBhbGwgaW50ZXJhY3RpdmUKK2VkaXRpbmcgY29udHJvbCAobWVudSBlbnRyeSBlZGl0b3IgYW5kIGNvbW1hbmQtbGluZSkgYW5kIGVudHJpZXMKK3Byb3RlY3RlZCBieSB0aGUgY29tbWFuZCBAY29tbWFuZHtsb2NrfS4gSWYgdGhlIHBhc3N3b3JkIEB2YXJ7cGFzc3dkfSBpcworZW50ZXJlZCwgaXQgbG9hZHMgdGhlIEB2YXJ7bmV3LWNvbmZpZy1maWxlfSBhcyBhIG5ldyBjb25maWcgZmlsZSBhbmQKK3Jlc3RhcnRzIHRoZSBHUlVCIFN0YWdlIDIsIGlmIEB2YXJ7bmV3LWNvbmZpZy1maWxlfSBpcworc3BlY2lmaWVkLiBPdGhlcndpc2UsIEdSVUIgd2lsbCBqdXN0IHVubG9jayB0aGUgcHJpdmlsZWdlZCBpbnN0cnVjdGlvbnMuCitZb3UgY2FuIGFsc28gdXNlIHRoaXMgY29tbWFuZCBpbiB0aGUgc2NyaXB0IHNlY3Rpb24sIGluIHdoaWNoIGNhc2UgaXQKK3dpbGwgYXNrIGZvciB0aGUgcGFzc3dvcmQsIGJlZm9yZSBjb250aW51aW5nLiAgVGhlIG9wdGlvbgorQG9wdGlvbnstLW1kNX0gdGVsbHMgR1JVQiB0aGF0IEB2YXJ7cGFzc3dkfSBpcyBlbmNyeXB0ZWQgd2l0aAorQGNvbW1hbmR7bWQ1Y3J5cHR9IChAcHhyZWZ7bWQ1Y3J5cHR9KS4KK0BlbmQgZGVmZm4KKworCitAbm9kZSByYXJwCitAc3Vic2VjdGlvbiByYXJwCisKK0BkZWZmbiBDb21tYW5kIHJhcnAKK0luaXRpYWxpemUgYSBuZXR3b3JrIGRldmljZSB2aWEgdGhlIEBkZm57UkFSUH0gcHJvdG9jb2wuICBUaGlzIGNvbW1hbmQKK2lzIG9ubHkgYXZhaWxhYmxlIGlmIEdSVUIgaXMgY29tcGlsZWQgd2l0aCBuZXRib290IHN1cHBvcnQuIFNlZSBhbHNvCitAcmVme05ldHdvcmt9LgorQGVuZCBkZWZmbgorCisKK0Bub2RlIHNlcmlhbAorQHN1YnNlY3Rpb24gc2VyaWFsCisKK0BkZWZmbiBDb21tYW5kIHNlcmlhbCBbQG9wdGlvbnstLXVuaXQ9dW5pdH1dIFtAb3B0aW9uey0tcG9ydD1wb3J0fV0gW0BvcHRpb257LS1zcGVlZD1zcGVlZH1dIFtAb3B0aW9uey0td29yZD13b3JkfV0gW0BvcHRpb257LS1wYXJpdHk9cGFyaXR5fV0gW0BvcHRpb257LS1zdG9wPXN0b3B9XSBbQG9wdGlvbnstLWRldmljZT1kZXZ9XQorSW5pdGlhbGl6ZSBhIHNlcmlhbCBkZXZpY2UuIEB2YXJ7dW5pdH0gaXMgYSBudW1iZXIgaW4gdGhlIHJhbmdlIDAtMworc3BlY2lmeWluZyB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2U7IGRlZmF1bHQgaXMgMCwgd2hpY2ggY29ycmVzcG9uZHMgdG8KK3RoZSBwb3J0IG9mdGVuIGNhbGxlZCBDT00xLiBAdmFye3BvcnR9IGlzIHRoZSBJL08gcG9ydCB3aGVyZSB0aGUgVUFSVAoraXMgdG8gYmUgZm91bmQ7IGlmIHNwZWNpZmllZCBpdCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgQHZhcnt1bml0fS4KK0B2YXJ7c3BlZWR9IGlzIHRoZSB0cmFuc21pc3Npb24gc3BlZWQ7IGRlZmF1bHQgaXMgOTYwMC4gQHZhcnt3b3JkfSBhbmQKK0B2YXJ7c3RvcH0gYXJlIHRoZSBudW1iZXIgb2YgZGF0YSBiaXRzIGFuZCBzdG9wIGJpdHMuIERhdGEgYml0cyBtdXN0CitiZSBpbiB0aGUgcmFuZ2UgNS04IGFuZCBzdG9wIGJpdHMgbXVzdCBiZSAxIG9yIDIuIERlZmF1bHQgaXMgOCBkYXRhCitiaXRzIGFuZCBvbmUgc3RvcCBiaXQuIEB2YXJ7cGFyaXR5fSBpcyBvbmUgb2YgQHNhbXB7bm99LCBAc2FtcHtvZGR9LAorQHNhbXB7ZXZlbn0gYW5kIGRlZmF1bHRzIHRvIEBzYW1we25vfS4gVGhlIG9wdGlvbiBAb3B0aW9uey0tZGV2aWNlfQorY2FuIG9ubHkgYmUgdXNlZCBpbiB0aGUgZ3J1YiBzaGVsbCBhbmQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAKK3R0eSBkZXZpY2UgdG8gYmUgdXNlZCBpbiB0aGUgaG9zdCBvcGVyYXRpbmcgc3lzdGVtIChAcHhyZWZ7SW52b2tpbmcgdGhlCitncnViIHNoZWxsfSkuCisKK1RoZSBzZXJpYWwgcG9ydCBpcyBub3QgdXNlZCBhcyBhIGNvbW11bmljYXRpb24gY2hhbm5lbCB1bmxlc3MgdGhlCitAY29tbWFuZHt0ZXJtaW5hbH0gY29tbWFuZCBpcyB1c2VkIChAcHhyZWZ7dGVybWluYWx9KS4KKworVGhpcyBjb21tYW5kIGlzIG9ubHkgYXZhaWxhYmxlIGlmIEdSVUIgaXMgY29tcGlsZWQgd2l0aCBzZXJpYWwKK3N1cHBvcnQuIFNlZSBhbHNvIEByZWZ7U2VyaWFsIHRlcm1pbmFsfS4KK0BlbmQgZGVmZm4KKworCitAbm9kZSBzZXRrZXkKK0BzdWJzZWN0aW9uIHNldGtleQorCitAZGVmZm4gQ29tbWFuZCBzZXRrZXkgW3RvX2tleSBmcm9tX2tleV0KK0NoYW5nZSB0aGUga2V5Ym9hcmQgbWFwLiBUaGUga2V5IEB2YXJ7ZnJvbV9rZXl9IGlzIG1hcHBlZCB0byB0aGUga2V5CitAdmFye3RvX2tleX0uIElmIG5vIGFyZ3VtZW50IGlzIHNwZWNpZmllZCwgcmVzZXQga2V5IG1hcHBpbmdzLiBOb3RlIHRoYXQgCit0aGlzIGNvbW1hbmQgQGVtcGh7ZG9lcyBub3R9IGV4Y2hhbmdlIHRoZSBrZXlzLiBJZiB5b3Ugd2FudCB0byBleGNoYW5nZSAKK3RoZSBrZXlzLCBydW4gdGhpcyBjb21tYW5kIGFnYWluIHdpdGggdGhlIGFyZ3VtZW50cyBleGNoYW5nZWQsIGxpa2UgdGhpczoKKworQGV4YW1wbGUKK2dydWI+IEBrYmR7c2V0a2V5IGNhcHNsb2NrIGNvbnRyb2x9CitncnViPiBAa2Jke3NldGtleSBjb250cm9sIGNhcHNsb2NrfQorQGVuZCBleGFtcGxlCisKK0Ega2V5IG11c3QgYmUgYW4gYWxwaGFiZXQgbGV0dGVyLCBhIGRpZ2l0LCBvciBvbmUgb2YgdGhlc2Ugc3ltYm9sczoKK0BzYW1we2VzY2FwZX0sIEBzYW1we2V4Y2xhbX0sIEBzYW1we2F0fSwgQHNhbXB7bnVtYmVyc2lnbn0sCitAc2FtcHtkb2xsYXJ9LCBAc2FtcHtwZXJjZW50fSwgQHNhbXB7Y2FyZXR9LCBAc2FtcHthbXBlcnNhbmR9LAorQHNhbXB7YXN0ZXJpc2t9LCBAc2FtcHtwYXJlbmxlZnR9LCBAc2FtcHtwYXJlbnJpZ2h0fSwgQHNhbXB7bWludXN9LAorQHNhbXB7dW5kZXJzY29yZX0sIEBzYW1we2VxdWFsfSwgQHNhbXB7cGx1c30sIEBzYW1we2JhY2tzcGFjZX0sCitAc2FtcHt0YWJ9LCBAc2FtcHticmFja2V0bGVmdH0sIEBzYW1we2JyYWNlbGVmdH0sIEBzYW1we2JyYWNrZXRyaWdodH0sCitAc2FtcHticmFjZXJpZ2h0fSwgQHNhbXB7ZW50ZXJ9LCBAc2FtcHtjb250cm9sfSwgQHNhbXB7c2VtaWNvbG9ufSwKK0BzYW1we2NvbG9ufSwgQHNhbXB7cXVvdGV9LCBAc2FtcHtkb3VibGVxdW90ZX0sIEBzYW1we2JhY2txdW90ZX0sCitAc2FtcHt0aWxkZX0sIEBzYW1we3NoaWZ0fSwgQHNhbXB7YmFja3NsYXNofSwgQHNhbXB7YmFyfSwgQHNhbXB7Y29tbWF9LAorQHNhbXB7bGVzc30sIEBzYW1we3BlcmlvZH0sIEBzYW1we2dyZWF0ZXJ9LCBAc2FtcHtzbGFzaH0sCitAc2FtcHtxdWVzdGlvbn0sIEBzYW1we2FsdH0sIEBzYW1we3NwYWNlfSwgQHNhbXB7Y2Fwc2xvY2t9LCBAc2FtcHtGWH0KKyhAc2FtcHtYfSBpcyBhIGRpZ2l0KSwgYW5kIEBzYW1we2RlbGV0ZX0uIFRoaXMgdGFibGUgZGVzY3JpYmVzIHRvIHdoaWNoCitjaGFyYWN0ZXIgZWFjaCBvZiB0aGUgc3ltYm9scyBjb3JyZXNwb25kczoKKworQHRhYmxlIEBzYW1wCitAaXRlbSBleGNsYW0KK0BzYW1weyF9CisKK0BpdGVtIGF0CitAc2FtcHtAQH0KKworQGl0ZW0gbnVtYmVyc2lnbgorQHNhbXB7I30KKworQGl0ZW0gZG9sbGFyCitAc2FtcHskfQorCitAaXRlbSBwZXJjZW50CitAc2FtcHslfQorCitAaXRlbSBjYXJldAorQHNhbXB7Xn0KKworQGl0ZW0gYW1wZXJzYW5kCitAc2FtcHsmfQorCitAaXRlbSBhc3RlcmlzaworQHNhbXB7Kn0KKworQGl0ZW0gcGFyZW5sZWZ0CitAc2FtcHsofQorCitAaXRlbSBwYXJlbnJpZ2h0CitAc2FtcHspfQorCitAaXRlbSBtaW51cworQHNhbXB7LX0KKworQGl0ZW0gdW5kZXJzY29yZQorQHNhbXB7X30KKworQGl0ZW0gZXF1YWwKK0BzYW1wez19CisKK0BpdGVtIHBsdXMKK0BzYW1weyt9CisKK0BpdGVtIGJyYWNrZXRsZWZ0CitAc2FtcHtbfQorCitAaXRlbSBicmFjZWxlZnQKK0BzYW1we0B7fQorCitAaXRlbSBicmFja2V0cmlnaHQKK0BzYW1we119CisKK0BpdGVtIGJyYWNlcmlnaHQKK0BzYW1we0B9fQorCitAaXRlbSBzZW1pY29sb24KK0BzYW1wezt9CisKK0BpdGVtIGNvbG9uCitAc2FtcHs6fQorCitAaXRlbSBxdW90ZQorQHNhbXB7J30KKworQGl0ZW0gZG91YmxlcXVvdGUKK0BzYW1weyJ9CisKK0BpdGVtIGJhY2txdW90ZQorQHNhbXB7YH0KKworQGl0ZW0gdGlsZGUKK0BzYW1we359CisKK0BpdGVtIGJhY2tzbGFzaAorQHNhbXB7XH0KKworQGl0ZW0gYmFyCitAc2FtcHt8fQorCitAaXRlbSBjb21tYQorQHNhbXB7LH0KKworQGl0ZW0gbGVzcworQHNhbXB7PH0KKworQGl0ZW0gcGVyaW9kCitAc2FtcHsufQorCitAaXRlbSBncmVhdGVyCitAc2FtcHs+fQorCitAaXRlbSBzbGFzaAorQHNhbXB7L30KKworQGl0ZW0gcXVlc3Rpb24KK0BzYW1wez99CisKK0BpdGVtIHNwYWNlCitAc2FtcHsgfQorQGVuZCB0YWJsZQorQGVuZCBkZWZmbgorCisKK0Bub2RlIHRlcm1pbmFsCitAc3Vic2VjdGlvbiB0ZXJtaW5hbAorCitAZGVmZm4gQ29tbWFuZCB0ZXJtaW5hbCBbQG9wdGlvbnstLWR1bWJ9XSBbQG9wdGlvbnstLW5vLWVjaG99XSBbQG9wdGlvbnstLW5vLWVkaXR9XSBbQG9wdGlvbnstLXRpbWVvdXQ9c2Vjc31dIFtAb3B0aW9uey0tbGluZXM9bGluZXN9XSBbQG9wdGlvbnstLXNpbGVudH1dIFtAb3B0aW9ue2NvbnNvbGV9XSBbQG9wdGlvbntzZXJpYWx9XSBbQG9wdGlvbntoZXJjdWxlc31dCitTZWxlY3QgYSB0ZXJtaW5hbCBmb3IgdXNlciBpbnRlcmFjdGlvbi4gVGhlIHRlcm1pbmFsIGlzIGFzc3VtZWQgdG8gYmUKK1ZUMTAwLWNvbXBhdGlibGUgdW5sZXNzIEBvcHRpb257LS1kdW1ifSBpcyBzcGVjaWZpZWQuIElmIGJvdGgKK0BvcHRpb257Y29uc29sZX0gYW5kIEBvcHRpb257c2VyaWFsfSBhcmUgc3BlY2lmaWVkLCB0aGVuIEdSVUIgd2lsbCB1c2UKK3RoZSBvbmUgd2hlcmUgYSBrZXkgaXMgZW50ZXJlZCBmaXJzdCBvciB0aGUgZmlyc3Qgd2hlbiB0aGUgdGltZW91dAorZXhwaXJlcy4gSWYgbmVpdGhlciBhcmUgc3BlY2lmaWVkLCB0aGUgY3VycmVudCBzZXR0aW5nIGlzCityZXBvcnRlZC4gVGhpcyBjb21tYW5kIGlzIG9ubHkgYXZhaWxhYmxlIGlmIEdSVUIgaXMgY29tcGlsZWQgd2l0aCBzZXJpYWwKK3N1cHBvcnQuIFNlZSBhbHNvIEByZWZ7U2VyaWFsIHRlcm1pbmFsfS4KKworVGhpcyBtYXkgbm90IG1ha2Ugc2Vuc2UgZm9yIG1vc3QgdXNlcnMsIGJ1dCBHUlVCIHN1cHBvcnRzIEhlcmN1bGVzCitjb25zb2xlIGFzIHdlbGwuIEhlcmN1bGVzIGNvbnNvbGUgaXMgdXNhYmxlIGxpa2UgdGhlIG9yZGluYXJ5IGNvbnNvbGUsCithbmQgdGhlIHVzYWdlIGlzIHF1aXRlIHNpbWlsYXIgdG8gdGhhdCBmb3Igc2VyaWFsIHRlcm1pbmFsczogc3BlY2lmeQorQG9wdGlvbntoZXJjdWxlc30gYXMgdGhlIGFyZ3VtZW50LgorCitUaGUgb3B0aW9uIEBvcHRpb257LS1saW5lc30gZGVmaW5lcyB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHlvdXIKK3Rlcm1pbmFsLCBhbmQgaXQgaXMgdXNlZCBmb3IgdGhlIGludGVybmFsIHBhZ2VyIGZ1bmN0aW9uLiBJZiB5b3UgZG9uJ3QKK3NwZWNpZnkgdGhpcyBvcHRpb24sIHRoZSBudW1iZXIgaXMgYXNzdW1lZCBhcyAyNC4KKworVGhlIG9wdGlvbiBAb3B0aW9uey0tc2lsZW50fSBzdXBwcmVzc2VzIHRoZSBtZXNzYWdlIHRvIHByb21wdCB5b3UgdG8KK2hpdCBhbnkga2V5LiBUaGlzIG1pZ2h0IGJlIHVzZWZ1bCBpZiB5b3VyIHN5c3RlbSBoYXMgbm8gdGVybWluYWwKK2RldmljZS4KKworVGhlIG9wdGlvbiBAb3B0aW9uey0tbm8tZWNob30gaGFzIEdSVUIgbm90IHRvIGVjaG8gYmFjayBpbnB1dAorY2hhcmFjdGVycy4gVGhpcyBpbXBsaWVzIHRoZSBvcHRpb24gQG9wdGlvbnstLW5vLWVkaXR9LgorCitUaGUgb3B0aW9uIEBvcHRpb257LS1uby1lZGl0fSBkaXNhYmxlcyB0aGUgQkFTSC1saWtlIGVkaXRpbmcgZmVhdHVyZS4KK0BlbmQgZGVmZm4KKworCitAbm9kZSB0ZXJtaW5mbworQHN1YnNlY3Rpb24gdGVybWluZm8KKworQGRlZmZuIENvbW1hbmQgdGVybWluZm8gQG9wdGlvbnstLW5hbWU9bmFtZX0gQG9wdGlvbnstLWN1cnNvci1hZGRyZXNzPXNlcX0gW0BvcHRpb257LS1jbGVhci1zY3JlZW49c2VxfV0gW0BvcHRpb257LS1lbnRlci1zdGFuZG91dC1tb2RlPXNlcX1dIFtAb3B0aW9uey0tZXhpdC1zdGFuZG91dC1tb2RlPXNlcX1dCitEZWZpbmUgdGhlIGNhcGFiaWxpdGllcyBvZiB5b3VyIHRlcm1pbmFsLiBVc2UgdGhpcyBjb21tYW5kIHRvIGRlZmluZQorZXNjYXBlIHNlcXVlbmNlcywgaWYgaXQgaXMgbm90IHZ0MTAwLWNvbXBhdGlibGUuIFlvdSBtYXkgdXNlIEBzYW1we1xlfQorZm9yIEBrZXl7RVNDfSBhbmQgQHNhbXB7Xlh9IGZvciBhIGNvbnRyb2wgY2hhcmFjdGVyLgorCitZb3UgY2FuIHVzZSB0aGUgdXRpbGl0eSBAY29tbWFuZHtncnViLXRlcm1pbmZvfSB0byBnZW5lcmF0ZQorYXBwcm9wcmlhdGUgYXJndW1lbnRzIHRvIHRoaXMgY29tbWFuZC4gQHhyZWZ7SW52b2tpbmcgZ3J1Yi10ZXJtaW5mb30uCisKK0lmIG5vIG9wdGlvbiBpcyBzcGVjaWZpZWQsIHRoZSBjdXJyZW50IHNldHRpbmdzIGFyZSBwcmludGVkLgorQGVuZCBkZWZmbgorCisKK0Bub2RlIHRmdHBzZXJ2ZXIKK0BzdWJzZWN0aW9uIHRmdHBzZXJ2ZXIKKworQGRlZmZuIENvbW1hbmQgdGZ0cHNlcnZlciBpcGFkZHIKK0BzdHJvbmd7Q2F1dGlvbjp9IFRoaXMgY29tbWFuZCBleGlzdHMgb25seSBmb3IgYmFja3dhcmQKK2NvbXBhdGliaWxpdHkuIFVzZSBAY29tbWFuZHtpZmNvbmZpZ30gKEBweHJlZntpZmNvbmZpZ30pIGluc3RlYWQuCisKK092ZXJyaWRlIGEgVEZUUCBzZXJ2ZXIgYWRkcmVzcyByZXR1cm5lZCBieSBhIEJPT1RQL0RIQ1AvUkFSUCBzZXJ2ZXIuIFRoZQorYXJndW1lbnQgQHZhcntpcGFkZHJ9IG11c3QgYmUgaW4gZG90dGVkIGRlY2ltYWwgZm9ybWF0LCBsaWtlCitAc2FtcHsxOTIuMTY4LjAuMTV9LiAgVGhpcyBjb21tYW5kIGlzIG9ubHkgYXZhaWxhYmxlIGlmIEdSVUIgaXMgY29tcGlsZWQKK3dpdGggbmV0Ym9vdCBzdXBwb3J0LiBTZWUgYWxzbyBAcmVme05ldHdvcmt9LgorQGVuZCBkZWZmbgorCisKK0Bub2RlIHVuaGlkZQorQHN1YnNlY3Rpb24gdW5oaWRlCisKK0BkZWZmbiBDb21tYW5kIHVuaGlkZSBwYXJ0aXRpb24KK1VuaGlkZSB0aGUgcGFydGl0aW9uIEB2YXJ7cGFydGl0aW9ufSBieSBjbGVhcmluZyB0aGUgQGRmbntoaWRkZW59IGJpdCBpbgoraXRzIHBhcnRpdGlvbiB0eXBlIGNvZGUuIFRoaXMgaXMgdXNlZnVsIG9ubHkgd2hlbiBib290aW5nIERPUyBvciBXaW5kb3dzCithbmQgbXVsdGlwbGUgcHJpbWFyeSBwYXJ0aXRpb25zIGV4aXN0IG9uIG9uZSBkaXNrLiBTZWUgYWxzbworQHJlZntET1MvV2luZG93c30uCitAZW5kIGRlZmZuCisKKworQG5vZGUgQ29tbWFuZC1saW5lIGFuZCBtZW51IGVudHJ5IGNvbW1hbmRzCitAc2VjdGlvbiBUaGUgbGlzdCBvZiBjb21tYW5kLWxpbmUgYW5kIG1lbnUgZW50cnkgY29tbWFuZHMKKworVGhlc2UgY29tbWFuZHMgYXJlIHVzYWJsZSBpbiB0aGUgY29tbWFuZC1saW5lIGFuZCBpbiBtZW51IGVudHJpZXMuICBJZgoreW91IGZvcmdldCBhIGNvbW1hbmQsIHlvdSBjYW4gcnVuIHRoZSBjb21tYW5kIEBjb21tYW5ke2hlbHB9CisoQHB4cmVme2hlbHB9KS4KKworQG1lbnUKKyogYmxvY2tsaXN0OjogICAgICAgICAgICAgICAgICAgR2V0IHRoZSBibG9jayBsaXN0IG5vdGF0aW9uIG9mIGEgZmlsZQorKiBib290OjogICAgICAgICAgICAgICAgICAgICAgICBTdGFydCB1cCB5b3VyIG9wZXJhdGluZyBzeXN0ZW0KKyogY2F0OjogICAgICAgICAgICAgICAgICAgICAgICAgU2hvdyB0aGUgY29udGVudHMgb2YgYSBmaWxlCisqIGNoYWlubG9hZGVyOjogICAgICAgICAgICAgICAgIENoYWluLWxvYWQgYW5vdGhlciBib290IGxvYWRlcgorKiBjbXA6OiAgICAgICAgICAgICAgICAgICAgICAgICBDb21wYXJlIHR3byBmaWxlcworKiBjb25maWdmaWxlOjogICAgICAgICAgICAgICAgICBMb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlCisqIGRlYnVnOjogICAgICAgICAgICAgICAgICAgICAgIFRvZ2dsZSB0aGUgZGVidWcgZmxhZworKiBkaXNwbGF5YXBtOjogICAgICAgICAgICAgICAgICBEaXNwbGF5IEFQTSBpbmZvcm1hdGlvbgorKiBkaXNwbGF5bWVtOjogICAgICAgICAgICAgICAgICBEaXNwbGF5IG1lbW9yeSBjb25maWd1cmF0aW9uCisqIGVtYmVkOjogICAgICAgICAgICAgICAgICAgICAgIEVtYmVkIFN0YWdlIDEuNQorKiBmaW5kOjogICAgICAgICAgICAgICAgICAgICAgICBGaW5kIGEgZmlsZQorKiBmc3Rlc3Q6OiAgICAgICAgICAgICAgICAgICAgICBUZXN0IGEgZmlsZXN5c3RlbQorKiBnZW9tZXRyeTo6ICAgICAgICAgICAgICAgICAgICBNYW5pcHVsYXRlIHRoZSBnZW9tZXRyeSBvZiBhIGRyaXZlCisqIGhhbHQ6OiAgICAgICAgICAgICAgICAgICAgICAgIFNodXQgZG93biB5b3VyIGNvbXB1dGVyCisqIGhlbHA6OiAgICAgICAgICAgICAgICAgICAgICAgIFNob3cgaGVscCBtZXNzYWdlcworKiBpbXBzcHJvYmU6OiAgICAgICAgICAgICAgICAgICBQcm9iZSBTTVAKKyogaW5pdHJkOjogICAgICAgICAgICAgICAgICAgICAgTG9hZCBhbiBpbml0cmQKKyogaW5zdGFsbDo6ICAgICAgICAgICAgICAgICAgICAgSW5zdGFsbCBHUlVCCisqIGlvcHJvYmU6OiAgICAgICAgICAgICAgICAgICAgIFByb2JlIEkvTyBwb3J0cyB1c2VkIGZvciBhIGRyaXZlCisqIGtlcm5lbDo6ICAgICAgICAgICAgICAgICAgICAgIExvYWQgYSBrZXJuZWwKKyogbG9jazo6ICAgICAgICAgICAgICAgICAgICAgICAgTG9jayBhIG1lbnUgZW50cnkKKyogbWFrZWFjdGl2ZTo6ICAgICAgICAgICAgICAgICAgTWFrZSBhIHBhcnRpdGlvbiBhY3RpdmUKKyogbWFwOjogICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGEgZHJpdmUgdG8gYW5vdGhlcgorKiBtZDVjcnlwdDo6ICAgICAgICAgICAgICAgICAgICBFbmNyeXB0IGEgcGFzc3dvcmQgaW4gTUQ1IGZvcm1hdAorKiBtb2R1bGU6OiAgICAgICAgICAgICAgICAgICAgICBMb2FkIGEgbW9kdWxlCisqIG1vZHVsZW5vdW56aXA6OiAgICAgICAgICAgICAgIExvYWQgYSBtb2R1bGUgd2l0aG91dCBkZWNvbXByZXNzaW9uCisqIHBhdXNlOjogICAgICAgICAgICAgICAgICAgICAgIFdhaXQgZm9yIGEga2V5IHByZXNzCisqIHF1aXQ6OiAgICAgICAgICAgICAgICAgICAgICAgIEV4aXQgZnJvbSB0aGUgZ3J1YiBzaGVsbAorKiByZWJvb3Q6OiAgICAgICAgICAgICAgICAgICAgICBSZWJvb3QgeW91ciBjb21wdXRlcgorKiByZWFkOjogICAgICAgICAgICAgICAgICAgICAgICBSZWFkIGRhdGEgZnJvbSBtZW1vcnkKKyogcm9vdDo6ICAgICAgICAgICAgICAgICAgICAgICAgU2V0IEdSVUIncyByb290IGRldmljZQorKiByb290bm92ZXJpZnk6OiAgICAgICAgICAgICAgICBTZXQgR1JVQidzIHJvb3QgZGV2aWNlIHdpdGhvdXQgbW91bnRpbmcKKyogc2F2ZWRlZmF1bHQ6OiAgICAgICAgICAgICAgICAgU2F2ZSBjdXJyZW50IGVudHJ5IGFzIHRoZSBkZWZhdWx0IGVudHJ5CisqIHNldHVwOjogICAgICAgICAgICAgICAgICAgICAgIFNldCB1cCBHUlVCJ3MgaW5zdGFsbGF0aW9uIGF1dG9tYXRpY2FsbHkKKyogdGVzdGxvYWQ6OiAgICAgICAgICAgICAgICAgICAgTG9hZCBhIGZpbGUgZm9yIHRlc3RpbmcgYSBmaWxlc3lzdGVtCisqIHRlc3R2YmU6OiAgICAgICAgICAgICAgICAgICAgIFRlc3QgVkVTQSBCSU9TIEVYVEVOU0lPTgorKiB1cHBlcm1lbTo6ICAgICAgICAgICAgICAgICAgICBTZXQgdGhlIHVwcGVyIG1lbW9yeSBzaXplCisqIHZiZXByb2JlOjogICAgICAgICAgICAgICAgICAgIFByb2JlIFZFU0EgQklPUyBFWFRFTlNJT04KK0BlbmQgbWVudQorCisKK0Bub2RlIGJsb2NrbGlzdAorQHN1YnNlY3Rpb24gYmxvY2tsaXN0CisKK0BkZWZmbiBDb21tYW5kIGJsb2NrbGlzdCBmaWxlCitQcmludCB0aGUgYmxvY2sgbGlzdCBub3RhdGlvbiBvZiB0aGUgZmlsZSBAdmFye2ZpbGV9LiBAeHJlZntCbG9jayBsaXN0CitzeW50YXh9LgorQGVuZCBkZWZmbgorCisKK0Bub2RlIGJvb3QKK0BzdWJzZWN0aW9uIGJvb3QKKworQGRlZmZuIENvbW1hbmQgYm9vdAorQm9vdCB0aGUgT1Mgb3IgY2hhaW4tbG9hZGVyIHdoaWNoIGhhcyBiZWVuIGxvYWRlZC4gT25seSBuZWNlc3NhcnkgaWYKK3J1bm5pbmcgdGhlIGZ1bGx5IGludGVyYWN0aXZlIGNvbW1hbmQtbGluZSAoaXQgaXMgaW1wbGljaXQgYXQgdGhlIGVuZCBvZgorYSBtZW51IGVudHJ5KS4KK0BlbmQgZGVmZm4KKworCitAbm9kZSBjYXQKK0BzdWJzZWN0aW9uIGNhdAorCitAZGVmZm4gQ29tbWFuZCBjYXQgZmlsZQorRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgQHZhcntmaWxlfS4gVGhpcyBjb21tYW5kIG1heSBiZSB1c2VmdWwKK3RvIHJlbWluZCB5b3Ugb2YgeW91ciBPUydzIHJvb3QgcGFydGl0aW9uOgorCitAZXhhbXBsZQorZ3J1Yj4gQGtiZHtjYXQgL2V0Yy9mc3RhYn0KK0BlbmQgZXhhbXBsZQorQGVuZCBkZWZmbgorCisKK0Bub2RlIGNoYWlubG9hZGVyCitAc3Vic2VjdGlvbiBjaGFpbmxvYWRlcgorCitAZGVmZm4gQ29tbWFuZCBjaGFpbmxvYWRlciBbQG9wdGlvbnstLWZvcmNlfV0gZmlsZQorTG9hZCBAdmFye2ZpbGV9IGFzIGEgY2hhaW4tbG9hZGVyLiBMaWtlIGFueSBvdGhlciBmaWxlIGxvYWRlZCBieSB0aGUKK2ZpbGVzeXN0ZW0gY29kZSwgaXQgY2FuIHVzZSB0aGUgYmxvY2tsaXN0IG5vdGF0aW9uIHRvIGdyYWIgdGhlIGZpcnN0CitzZWN0b3Igb2YgdGhlIGN1cnJlbnQgcGFydGl0aW9uIHdpdGggQHNhbXB7KzF9LiBJZiB5b3Ugc3BlY2lmeSB0aGUKK29wdGlvbiBAb3B0aW9uey0tZm9yY2V9LCB0aGVuIGxvYWQgQHZhcntmaWxlfSBmb3JjaWJseSwgd2hldGhlciBpdCBoYXMgYQorY29ycmVjdCBzaWduYXR1cmUgb3Igbm90LiBUaGlzIGlzIHJlcXVpcmVkIHdoZW4geW91IHdhbnQgdG8gbG9hZCBhCitkZWZlY3RpdmUgYm9vdCBsb2FkZXIsIHN1Y2ggYXMgU0NPIFVuaXhXYXJlIDcuMSAoQHB4cmVme1NDTyBVbml4V2FyZX0pLgorQGVuZCBkZWZmbgorCisKK0Bub2RlIGNtcAorQHN1YnNlY3Rpb24gY21wCisKK0BkZWZmbiBDb21tYW5kIGNtcCBmaWxlMSBmaWxlMgorQ29tcGFyZSB0aGUgZmlsZSBAdmFye2ZpbGUxfSB3aXRoIHRoZSBmaWxlIEB2YXJ7ZmlsZTJ9LiBJZiB0aGV5IGRpZmZlcgoraW4gc2l6ZSwgcHJpbnQgdGhlIHNpemVzIGxpa2UgdGhpczoKKworQGV4YW1wbGUKK0RpZmZlciBpbiBzaXplOiAweDEyMzQgW2Zvb10sIDB4NDMyMSBbYmFyXQorQGVuZCBleGFtcGxlCisKK0lmIHRoZSBzaXplcyBhcmUgZXF1YWwgYnV0IHRoZSBieXRlcyBhdCBhbiBvZmZzZXQgZGlmZmVyLCB0aGVuIHByaW50IHRoZQorYnl0ZXMgbGlrZSB0aGlzOgorCitAZXhhbXBsZQorRGlmZmVyIGF0IHRoZSBvZmZzZXQgNzc3OiAweGJlIFtmb29dLCAweGVmIFtiYXJdCitAZW5kIGV4YW1wbGUKKworSWYgdGhleSBhcmUgY29tcGxldGVseSBpZGVudGljYWwsIG5vdGhpbmcgd2lsbCBiZSBwcmludGVkLgorQGVuZCBkZWZmbgorCisKK0Bub2RlIGNvbmZpZ2ZpbGUKK0BzdWJzZWN0aW9uIGNvbmZpZ2ZpbGUKKworQGRlZmZuIENvbW1hbmQgY29uZmlnZmlsZSBmaWxlCitMb2FkIEB2YXJ7ZmlsZX0gYXMgYSBjb25maWd1cmF0aW9uIGZpbGUuCitAZW5kIGRlZmZuCisKKworQG5vZGUgZGVidWcKK0BzdWJzZWN0aW9uIGRlYnVnCisKK0BkZWZmbiBDb21tYW5kIGRlYnVnCitUb2dnbGUgZGVidWcgbW9kZSAoYnkgZGVmYXVsdCBpdCBpcyBvZmYpLiBXaGVuIGRlYnVnIG1vZGUgaXMgb24sIHNvbWUKK2V4dHJhIG1lc3NhZ2VzIGFyZSBwcmludGVkIHRvIHNob3cgZGlzayBhY3Rpdml0eS4gVGhpcyBnbG9iYWwgZGVidWcgZmxhZworaXMgbWFpbmx5IHVzZWZ1bCBmb3IgR1JVQiBkZXZlbG9wZXJzIHdoZW4gdGVzdGluZyBuZXcgY29kZS4KK0BlbmQgZGVmZm4KKworCitAbm9kZSBkaXNwbGF5YXBtCitAc3Vic2VjdGlvbiBkaXNwbGF5YXBtCisKK0BkZWZmbiBDb21tYW5kIGRpc3BsYXlhcG0KK0Rpc3BsYXkgQVBNIEJJT1MgaW5mb3JtYXRpb24uCitAZW5kIGRlZmZuCisKKworQG5vZGUgZGlzcGxheW1lbQorQHN1YnNlY3Rpb24gZGlzcGxheW1lbQorCitAZGVmZm4gQ29tbWFuZCBkaXNwbGF5bWVtCitEaXNwbGF5IHdoYXQgR1JVQiB0aGlua3MgdGhlIHN5c3RlbSBhZGRyZXNzIHNwYWNlIG1hcCBvZiB0aGUgbWFjaGluZSBpcywKK2luY2x1ZGluZyBhbGwgcmVnaW9ucyBvZiBwaHlzaWNhbCBAc2N7cmFtfSBpbnN0YWxsZWQuIEdSVUIncworQGRmbnt1cHBlci9sb3dlciBtZW1vcnl9IGRpc3BsYXkgdXNlcyB0aGUgc3RhbmRhcmQgQklPUyBpbnRlcmZhY2UgZm9yCit0aGUgYXZhaWxhYmxlIG1lbW9yeSBpbiB0aGUgZmlyc3QgbWVnYWJ5dGUsIG9yIEBkZm57bG93ZXIgbWVtb3J5fSwgYW5kIGEKK3N5bnRoZXNpemVkIG51bWJlciBmcm9tIHZhcmlvdXMgQklPUyBpbnRlcmZhY2VzIG9mIHRoZSBtZW1vcnkgc3RhcnRpbmcKK2F0IDFNQiBhbmQgZ29pbmcgdXAgdG8gdGhlIGZpcnN0IGNoaXBzZXQgaG9sZSBmb3IgQGRmbnt1cHBlciBtZW1vcnl9CisodGhlIHN0YW5kYXJkIFBDIEBkZm57dXBwZXIgbWVtb3J5fSBpbnRlcmZhY2UgaXMgbGltaXRlZCB0byByZXBvcnRpbmcgYQorbWF4aW11bSBvZiA2NE1CKS4KK0BlbmQgZGVmZm4KKworCitAbm9kZSBlbWJlZAorQHN1YnNlY3Rpb24gZW1iZWQKKworQGRlZmZuIENvbW1hbmQgZW1iZWQgc3RhZ2UxXzUgZGV2aWNlCitFbWJlZCB0aGUgU3RhZ2UgMS41IEB2YXJ7c3RhZ2UxXzV9IGluIHRoZSBzZWN0b3JzIGFmdGVyIHRoZSBNQlIgaWYKK0B2YXJ7ZGV2aWNlfSBpcyBhIGRyaXZlLCBvciBpbiB0aGUgQGRmbntib290IGxvYWRlcn0gYXJlYSBpZiBAdmFye2RldmljZX0KK2lzIGEgRkZTIHBhcnRpdGlvbiBvciBhIFJlaXNlckZTIHBhcnRpdGlvbi5AZm9vdG5vdGV7VGhlIGxhdHRlciBmZWF0dXJlCitoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQgeWV0Ln0gUHJpbnQgdGhlIG51bWJlciBvZiBzZWN0b3JzIHdoaWNoCitAdmFye3N0YWdlMV81fSBvY2N1cGllcywgaWYgc3VjY2Vzc2Z1bC4KKworVXN1YWxseSwgeW91IGRvbid0IG5lZWQgdG8gcnVuIHRoaXMgY29tbWFuZCBkaXJlY3RseS4gQHhyZWZ7c2V0dXB9LgorQGVuZCBkZWZmbgorCisKK0Bub2RlIGZpbmQKK0BzdWJzZWN0aW9uIGZpbmQKKworQGRlZmZuIENvbW1hbmQgZmluZCBmaWxlbmFtZQorU2VhcmNoIGZvciB0aGUgZmlsZSBuYW1lIEB2YXJ7ZmlsZW5hbWV9IGluIGFsbCBtb3VudGFibGUgcGFydGl0aW9ucworYW5kIHByaW50IHRoZSBsaXN0IG9mIHRoZSBkZXZpY2VzIHdoaWNoIGNvbnRhaW4gdGhlIGZpbGUuIFRoZSBmaWxlCituYW1lIEB2YXJ7ZmlsZW5hbWV9IHNob3VsZCBiZSBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUgbGlrZQorQGNvZGV7L2Jvb3QvZ3J1Yi9zdGFnZTF9LgorQGVuZCBkZWZmbgorCisKK0Bub2RlIGZzdGVzdAorQHN1YnNlY3Rpb24gZnN0ZXN0CisKK0BkZWZmbiBDb21tYW5kIGZzdGVzdAorVG9nZ2xlIGZpbGVzeXN0ZW0gdGVzdCBtb2RlLgorRmlsZXN5c3RlbSB0ZXN0IG1vZGUsIHdoZW4gdHVybmVkIG9uLCBwcmludHMgb3V0IGRhdGEgY29ycmVzcG9uZGluZyB0bworYWxsIHRoZSBkZXZpY2UgcmVhZHMgYW5kIHdoYXQgdmFsdWVzIGFyZSBiZWluZyBzZW50IHRvIHRoZSBsb3ctbGV2ZWwKK3JvdXRpbmVzLiBUaGUgZm9ybWF0IGlzIEBzYW1wezxAdmFye3BhcnRpdGlvbi1vZmZzZXQtc2VjdG9yfSwKK0B2YXJ7Ynl0ZS1vZmZzZXR9LCBAdmFye2J5dGUtbGVuZ3RofT59IGZvciBoaWdoLWxldmVsIHJlYWRzIGluc2lkZSBhCitwYXJ0aXRpb24sIGFuZCBAc2FtcHtbQHZhcntkaXNrLW9mZnNldC1zZWN0b3J9XX0gZm9yIGxvdy1sZXZlbCBzZWN0b3IKK3JlcXVlc3RzIGZyb20gdGhlIGRpc2suCitGaWxlc3lzdGVtIHRlc3QgbW9kZSBpcyB0dXJuZWQgb2ZmIGJ5IGFueSB1c2Ugb2YgdGhlIEBjb21tYW5ke2luc3RhbGx9CisoQHB4cmVme2luc3RhbGx9KSBvciBAY29tbWFuZHt0ZXN0bG9hZH0gKEBweHJlZnt0ZXN0bG9hZH0pIGNvbW1hbmRzLgorQGVuZCBkZWZmbgorCisKK0Bub2RlIGdlb21ldHJ5CitAc3Vic2VjdGlvbiBnZW9tZXRyeQorCitAZGVmZm4gQ29tbWFuZCBnZW9tZXRyeSBkcml2ZSBbY3lsaW5kZXIgaGVhZCBzZWN0b3IgW3RvdGFsX3NlY3Rvcl1dCitQcmludCB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSBkcml2ZSBAdmFye2RyaXZlfS4gSW4gdGhlIGdydWIgc2hlbGwsIHlvdQorY2FuIHNldCB0aGUgZ2VvbWV0cnkgb2YgdGhlIGRyaXZlIGFyYml0cmFyaWx5LiBUaGUgbnVtYmVyIG9mCitjeWxpbmRlcnMsIHRoZSBudW1iZXIgb2YgaGVhZHMsIHRoZSBudW1iZXIgb2Ygc2VjdG9ycyBhbmQgdGhlIG51bWJlciBvZgordG90YWwgc2VjdG9ycyBhcmUgc2V0IHRvIENZTElOREVSLCBIRUFELCBTRUNUT1IgYW5kIFRPVEFMX1NFQ1RPUiwKK3Jlc3BlY3RpdmVseS4gSWYgeW91IG9taXQgVE9UQUxfU0VDVE9SLCB0aGVuIGl0IHdpbGwgYmUgY2FsY3VsYXRlZAorYmFzZWQgb24gdGhlIEMvSC9TIHZhbHVlcyBhdXRvbWF0aWNhbGx5LgorQGVuZCBkZWZmbgorCisKK0Bub2RlIGhhbHQKK0BzdWJzZWN0aW9uIGhhbHQKKworQGRlZmZuIENvbW1hbmQgaGFsdCBAb3B0aW9uey0tbm8tYXBtfQorVGhlIGNvbW1hbmQgaGFsdHMgdGhlIGNvbXB1dGVyLiBJZiB0aGUgQG9wdGlvbnstLW5vLWFwbX0gb3B0aW9uCitpcyBzcGVjaWZpZWQsIG5vIEFQTSBCSU9TIGNhbGwgaXMgcGVyZm9ybWVkLiBPdGhlcndpc2UsIHRoZSBjb21wdXRlcgoraXMgc2h1dCBkb3duIHVzaW5nIEFQTS4KK0BlbmQgZGVmZm4KKworCitAbm9kZSBoZWxwCitAc3Vic2VjdGlvbiBoZWxwCisKK0BkZWZmbiBDb21tYW5kIGhlbHAgQG9wdGlvbnstLWFsbH0gW3BhdHRlcm4gQGRvdHN7fV0KK0Rpc3BsYXkgaGVscGZ1bCBpbmZvcm1hdGlvbiBhYm91dCBidWlsdGluIGNvbW1hbmRzLiBJZiB5b3UgZG8gbm90CitzcGVjaWZ5IEB2YXJ7cGF0dGVybn0sIHRoaXMgY29tbWFuZCBzaG93cyBzaG9ydCBkZXNjcmlwdGlvbnMgb2YgbW9zdCBvZgorYXZhaWxhYmxlIGNvbW1hbmRzLiBJZiB5b3Ugc3BlY2lmeSB0aGUgb3B0aW9uIEBvcHRpb257LS1hbGx9IHRvIHRoaXMKK2NvbW1hbmQsIHNob3J0IGRlc2NyaXB0aW9ucyBvZiByYXJlbHkgdXNlZCBjb21tYW5kcyAoc3VjaCBhcworQHJlZnt0ZXN0bG9hZH0pIGFyZSBkaXNwbGF5ZWQgYXMgd2VsbC4KKworSWYgeW91IHNwZWNpZnkgYW55IEB2YXJ7cGF0dGVybnN9LCBpdCBkaXNwbGF5cyBsb25nZXIgaW5mb3JtYXRpb24KK2Fib3V0IGVhY2ggb2YgdGhlIGNvbW1hbmRzIHdoaWNoIG1hdGNoIHRob3NlIEB2YXJ7cGF0dGVybnN9LgorQGVuZCBkZWZmbgorCisKK0Bub2RlIGltcHNwcm9iZQorQHN1YnNlY3Rpb24gaW1wc3Byb2JlCisKK0BkZWZmbiBDb21tYW5kIGltcHNwcm9iZQorUHJvYmUgdGhlIEludGVsIE11bHRpcHJvY2Vzc29yIFNwZWNpZmljYXRpb24gMS4xIG9yIDEuNCBjb25maWd1cmF0aW9uCit0YWJsZSBhbmQgYm9vdCB0aGUgdmFyaW91cyBDUFVzIHdoaWNoIGFyZSBmb3VuZCBpbnRvIGEgdGlnaHQgbG9vcC4gVGhpcworY29tbWFuZCBjYW4gYmUgdXNlZCBvbmx5IGluIHRoZSBTdGFnZSAyLCBidXQgbm90IGluIHRoZSBncnViIHNoZWxsLgorQGVuZCBkZWZmbgorCisKK0Bub2RlIGluaXRyZAorQHN1YnNlY3Rpb24gaW5pdHJkCisKK0BkZWZmbiBDb21tYW5kIGluaXRyZCBmaWxlIEBkb3Rze30KK0xvYWQgYW4gaW5pdGlhbCByYW1kaXNrIGZvciBhIExpbnV4IGZvcm1hdCBib290IGltYWdlIGFuZCBzZXQgdGhlCithcHByb3ByaWF0ZSBwYXJhbWV0ZXJzIGluIHRoZSBMaW51eCBzZXR1cCBhcmVhIGluIG1lbW9yeS4gU2VlIGFsc28KK0ByZWZ7R05VL0xpbnV4fS4KK0BlbmQgZGVmZm4KKworCitAbm9kZSBpbnN0YWxsCitAc3Vic2VjdGlvbiBpbnN0YWxsCisKK0BkZWZmbiBDb21tYW5kIGluc3RhbGwgW0BvcHRpb257LS1mb3JjZS1sYmF9XSBbQG9wdGlvbnstLXN0YWdlMj1vc19zdGFnZTJfZmlsZX1dIHN0YWdlMV9maWxlIFtAb3B0aW9ue2R9XSBkZXN0X2RldiBzdGFnZTJfZmlsZSBbYWRkcl0gW0BvcHRpb257cH1dIFtjb25maWdfZmlsZV0gW3JlYWxfY29uZmlnX2ZpbGVdCitUaGlzIGNvbW1hbmQgaXMgZmFpcmx5IGNvbXBsZXgsIGFuZCB5b3Ugc2hvdWxkIG5vdCB1c2UgdGhpcyBjb21tYW5kCit1bmxlc3MgeW91IGFyZSBmYW1pbGlhciB3aXRoIEdSVUIuIFVzZSBAY29tbWFuZHtzZXR1cH0gKEBweHJlZntzZXR1cH0pCitpbnN0ZWFkLgorCitJbiBzaG9ydCwgaXQgd2lsbCBwZXJmb3JtIGEgZnVsbCBpbnN0YWxsIHByZXN1bWluZyB0aGUgU3RhZ2UgMiBvciBTdGFnZQorMS41QGZvb3Rub3Rle1RoZXkncmUgbG9hZGVkIHRoZSBzYW1lIHdheSwgc28gd2Ugd2lsbCByZWZlciB0byB0aGUgU3RhZ2UKKzEuNSBhcyBhIFN0YWdlIDIgZnJvbSBub3cgb24ufSBpcyBpbiBpdHMgZmluYWwgaW5zdGFsbCBsb2NhdGlvbi4KKworSW4gc2xpZ2h0bHkgbW9yZSBkZXRhaWwsIGl0IHdpbGwgbG9hZCBAdmFye3N0YWdlMV9maWxlfSwgdmFsaWRhdGUgdGhhdAoraXQgaXMgYSBHUlVCIFN0YWdlIDEgb2YgdGhlIHJpZ2h0IHZlcnNpb24gbnVtYmVyLCBpbnN0YWxsIGluIGl0IGEKK2Jsb2NrbGlzdCBmb3IgbG9hZGluZyBAdmFye3N0YWdlMl9maWxlfSBhcyBhIFN0YWdlIDIuIElmIHRoZSBvcHRpb24KK0BvcHRpb257ZH0gaXMgcHJlc2VudCwgdGhlIFN0YWdlIDEgd2lsbCBhbHdheXMgbG9vayBmb3IgdGhlIGFjdHVhbAorZGlzayBAdmFye3N0YWdlMl9maWxlfSB3YXMgaW5zdGFsbGVkIG9uLCByYXRoZXIgdGhhbiB1c2luZyB0aGUgYm9vdGluZworZHJpdmUuIFRoZSBTdGFnZSAyIHdpbGwgYmUgbG9hZGVkIGF0IGFkZHJlc3MgQHZhcnthZGRyfSwgd2hpY2ggbXVzdCBiZQorQHNhbXB7MHg4MDAwfSBmb3IgYSB0cnVlIFN0YWdlIDIsIGFuZCBAc2FtcHsweDIwMDB9IGZvciBhIFN0YWdlIDEuNS4gSWYKK0B2YXJ7YWRkcn0gaXMgbm90IHByZXNlbnQsIEdSVUIgd2lsbCBkZXRlcm1pbmUgdGhlIGFkZHJlc3MKK2F1dG9tYXRpY2FsbHkuIEl0IHRoZW4gd3JpdGVzIHRoZSBjb21wbGV0ZWQgU3RhZ2UgMSB0byB0aGUgZmlyc3QgYmxvY2sKK29mIHRoZSBkZXZpY2UgQHZhcntkZXN0X2Rldn0uIElmIHRoZSBvcHRpb25zIEBvcHRpb257cH0gb3IKK0B2YXJ7Y29uZmlnX2ZpbGV9IGFyZSBwcmVzZW50LCB0aGVuIGl0IHJlYWRzIHRoZSBmaXJzdCBibG9jayBvZiBzdGFnZTIsCittb2RpZmllcyBpdCB3aXRoIHRoZSB2YWx1ZXMgb2YgdGhlIHBhcnRpdGlvbiBAdmFye3N0YWdlMl9maWxlfSB3YXMgZm91bmQKK29uIChmb3IgQG9wdGlvbntwfSkgb3IgcGxhY2VzIHRoZSBzdHJpbmcgQHZhcntjb25maWdfZmlsZX0gaW50byB0aGUgYXJlYQordGVsbGluZyB0aGUgc3RhZ2UyIHdoZXJlIHRvIGxvb2sgZm9yIGEgY29uZmlndXJhdGlvbiBmaWxlIGF0IGJvb3QKK3RpbWUuIExpa2V3aXNlLCBpZiBAdmFye3JlYWxfY29uZmlnX2ZpbGV9IGlzIHByZXNlbnQgYW5kCitAdmFye3N0YWdlMl9maWxlfSBpcyBhIFN0YWdlIDEuNSwgdGhlbiB0aGUgU3RhZ2UgMiBAdmFye2NvbmZpZ19maWxlfSBpcworcGF0Y2hlZCB3aXRoIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgbmFtZSBAdmFye3JlYWxfY29uZmlnX2ZpbGV9LiBUaGlzCitjb21tYW5kIHByZXNlcnZlcyB0aGUgRE9TIEJQQiAoYW5kIGZvciBoYXJkIGRpc2tzLCB0aGUgcGFydGl0aW9uIHRhYmxlKQorb2YgdGhlIHNlY3RvciB0aGUgU3RhZ2UgMSBpcyB0byBiZSBpbnN0YWxsZWQgaW50by4KKworQHN0cm9uZ3tDYXV0aW9uOn0gU2V2ZXJhbCBidWdneSBCSU9TZXMgZG9uJ3QgcGFzcyBhIGJvb3RpbmcgZHJpdmUKK3Byb3Blcmx5IHdoZW4gYm9vdGluZyBmcm9tIGEgaGFyZCBkaXNrIGRyaXZlLiBUaGVyZWZvcmUsIHlvdSB3aWxsCit1bmZvcnR1bmF0ZWx5IGhhdmUgdG8gc3BlY2lmeSB0aGUgb3B0aW9uIEBvcHRpb257ZH0sIHdoZXRoZXIgeW91cgorU3RhZ2UyIHJlc2lkZXMgYXQgdGhlIGJvb3RpbmcgZHJpdmUgb3Igbm90LCBpZiB5b3UgaGF2ZSBzdWNoIGEKK0JJT1MuIFdlIGtub3cgdGhlc2UgYXJlIGRlZmVjdGl2ZSBpbiB0aGlzIHdheToKKworQHRhYmxlIEBhc2lzCitAaXRlbQorRnVqaXRzdSBMaWZlQm9vayA0MDAgQklPUyB2ZXJzaW9uIDMxSjAxMDNBCisKK0BpdGVtCitIUCBWZWN0cmEgWFUgNi8yMDAgQklPUyB2ZXJzaW9uIEdHLjA2LjExCitAZW5kIHRhYmxlCisKK0BzdHJvbmd7Q2F1dGlvbjI6fSBBIG51bWJlciBvZiBCSU9TZXMgZG9uJ3QgcmV0dXJuIGEgY29ycmVjdCBMQkEgc3VwcG9ydAorYml0bWFwIGV2ZW4gaWYgdGhleSBkbyBoYXZlIHRoZSBzdXBwb3J0LiBTbyBHUlVCIHByb3ZpZGVzIGEgc29sdXRpb24gdG8KK2lnbm9yZSB0aGUgd3JvbmcgYml0bWFwLCB0aGF0IGlzLCB0aGUgb3B0aW9uIEBvcHRpb257LS1mb3JjZS1sYmF9LiBEb24ndAordXNlIHRoaXMgb3B0aW9uIGlmIHlvdSBrbm93IHRoYXQgeW91ciBCSU9TIGRvZXNuJ3QgaGF2ZSBMQkEgc3VwcG9ydC4KKworQHN0cm9uZ3tDYXV0aW9uMzp9IFlvdSBtdXN0IHNwZWNpZnkgdGhlIG9wdGlvbiBAb3B0aW9uey0tc3RhZ2UyfSBpbiB0aGUKK2dydWIgc2hlbGwsIGlmIHlvdSBjYW5ub3QgdW5tb3VudCB0aGUgZmlsZXN5c3RlbSB3aGVyZSB5b3VyIHN0YWdlMiBmaWxlCityZXNpZGVzLiBUaGUgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBmaWxlIG5hbWUgaW4geW91ciBvcGVyYXRpbmcgc3lzdGVtLgorQGVuZCBkZWZmbgorCisKK0Bub2RlIGlvcHJvYmUKK0BzdWJzZWN0aW9uIGlvcHJvYmUKKworQGRlZmZuIENvbW1hbmQgaW9wcm9iZSBkcml2ZQorUHJvYmUgSS9PIHBvcnRzIHVzZWQgZm9yIHRoZSBkcml2ZSBAdmFye2RyaXZlfS4gVGhpcyBjb21tYW5kIHdpbGwgbGlzdAordGhlIEkvTyBwb3J0cyBvbiB0aGUgc2NyZWVuLiBGb3IgdGVjaG5pY2FsIGluZm9ybWF0aW9uLAorQHhyZWZ7SW50ZXJuYWxzfS4KK0BlbmQgZGVmZm4KKworCitAbm9kZSBrZXJuZWwKK0BzdWJzZWN0aW9uIGtlcm5lbAorCitAZGVmZm4gQ29tbWFuZCBrZXJuZWwgW0BvcHRpb257LS10eXBlPXR5cGV9XSBbQG9wdGlvbnstLW5vLW1lbS1vcHRpb259XSBmaWxlIEBkb3Rze30KK0F0dGVtcHQgdG8gbG9hZCB0aGUgcHJpbWFyeSBib290IGltYWdlIChNdWx0aWJvb3QgYS5vdXQgb3IgQHNje2VsZn0sCitMaW51eCB6SW1hZ2Ugb3IgYnpJbWFnZSwgRnJlZUJTRCBhLm91dCwgTmV0QlNEIGEub3V0LCBldGMuKSBmcm9tCitAdmFye2ZpbGV9LiBUaGUgcmVzdCBvZiB0aGUgbGluZSBpcyBwYXNzZWQgdmVyYmF0aW0gYXMgdGhlIEBkZm57a2VybmVsCitjb21tYW5kLWxpbmV9LiBBbnkgbW9kdWxlcyBtdXN0IGJlIHJlbG9hZGVkIGFmdGVyIHVzaW5nIHRoaXMgY29tbWFuZC4KKworVGhpcyBjb21tYW5kIGFsc28gYWNjZXB0cyB0aGUgb3B0aW9uIEBvcHRpb257LS10eXBlfSBzbyB0aGF0IHlvdSBjYW4KK3NwZWNpZnkgdGhlIGtlcm5lbCB0eXBlIG9mIEB2YXJ7ZmlsZX0gZXhwbGljaXRseS4gVGhlIGFyZ3VtZW50CitAdmFye3R5cGV9IG11c3QgYmUgb25lIG9mIHRoZXNlOiBAc2FtcHtuZXRic2R9LCBAc2FtcHtmcmVlYnNkfSwKK0BzYW1we29wZW5ic2R9LCBAc2FtcHtsaW51eH0sIEBzYW1we2JpZ2xpbnV4fSwgYW5kCitAc2FtcHttdWx0aWJvb3R9LiBIb3dldmVyLCB5b3UgbmVlZCB0byBzcGVjaWZ5IGl0IG9ubHkgaWYgeW91IHdhbnQgdG8KK2xvYWQgYSBOZXRCU0QgQHNje2VsZn0ga2VybmVsLCBiZWNhdXNlIEdSVUIgY2FuIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lCithIGtlcm5lbCB0eXBlIGluIHRoZSBvdGhlciBjYXNlcywgcXVpdGUgc2FmZWx5LgorCitUaGUgb3B0aW9uIEBvcHRpb257LS1uby1tZW0tb3B0aW9ufSBpcyBlZmZlY3RpdmUgb25seSBmb3IgTGludXguIElmIHRoZQorb3B0aW9uIGlzIHNwZWNpZmllZCwgR1JVQiBkb2Vzbid0IHBhc3MgdGhlIG9wdGlvbiBAb3B0aW9ue21lbT19IHRvIHRoZQora2VybmVsLiAgVGhpcyBvcHRpb24gaXMgaW1wbGllZCBmb3IgTGludXgga2VybmVscyAyLjQuMTggYW5kIG5ld2VyLgorQGVuZCBkZWZmbgorCisKK0Bub2RlIGxvY2sKK0BzdWJzZWN0aW9uIGxvY2sKKworQGRlZmZuIENvbW1hbmQgbG9jaworUHJldmVudCBub3JtYWwgdXNlcnMgZnJvbSBleGVjdXRpbmcgYXJiaXRyYXJ5IG1lbnUgZW50cmllcy4gWW91IG11c3QgdXNlCit0aGUgY29tbWFuZCBAY29tbWFuZHtwYXNzd29yZH0gaWYgeW91IHJlYWxseSB3YW50IHRoaXMgY29tbWFuZCB0byBiZQordXNlZnVsIChAcHhyZWZ7cGFzc3dvcmR9KS4KKworVGhpcyBjb21tYW5kIGlzIHVzZWQgaW4gYSBtZW51LCBhcyBzaG93biBpbiB0aGlzIGV4YW1wbGU6CisKK0BleGFtcGxlCitAZ3JvdXAKK3RpdGxlIFRoaXMgZW50cnkgaXMgdG9vIGRhbmdlcm91cyB0byBiZSBleGVjdXRlZCBieSBub3JtYWwgdXNlcnMKK2xvY2sKK3Jvb3QgKGhkMCxhKQora2VybmVsIC9uby1zZWN1cml0eS1vcworQGVuZCBncm91cAorQGVuZCBleGFtcGxlCisKK1NlZSBhbHNvIEByZWZ7U2VjdXJpdHl9LgorQGVuZCBkZWZmbgorCisKK0Bub2RlIG1ha2VhY3RpdmUKK0BzdWJzZWN0aW9uIG1ha2VhY3RpdmUKKworQGRlZmZuIENvbW1hbmQgbWFrZWFjdGl2ZQorU2V0IHRoZSBhY3RpdmUgcGFydGl0aW9uIG9uIHRoZSByb290IGRpc2sgdG8gR1JVQidzIHJvb3QgZGV2aWNlLgorVGhpcyBjb21tYW5kIGlzIGxpbWl0ZWQgdG8gQGVtcGh7cHJpbWFyeX0gUEMgcGFydGl0aW9ucyBvbiBhIGhhcmQgZGlzay4KK0BlbmQgZGVmZm4KKworCitAbm9kZSBtYXAKK0BzdWJzZWN0aW9uIG1hcAorCitAZGVmZm4gQ29tbWFuZCBtYXAgdG9fZHJpdmUgZnJvbV9kcml2ZQorTWFwIHRoZSBkcml2ZSBAdmFye2Zyb21fZHJpdmV9IHRvIHRoZSBkcml2ZSBAdmFye3RvX2RyaXZlfS4gVGhpcyBpcworbmVjZXNzYXJ5IHdoZW4geW91IGNoYWluLWxvYWQgc29tZSBvcGVyYXRpbmcgc3lzdGVtcywgc3VjaCBhcyBET1MsIGlmCitzdWNoIGFuIE9TIHJlc2lkZXMgYXQgYSBub24tZmlyc3QgZHJpdmUuIEhlcmUgaXMgYW4gZXhhbXBsZToKKworQGV4YW1wbGUKK0Bncm91cAorZ3J1Yj4gQGtiZHttYXAgKGhkMCkgKGhkMSl9CitncnViPiBAa2Jke21hcCAoaGQxKSAoaGQwKX0KK0BlbmQgZ3JvdXAKK0BlbmQgZXhhbXBsZQorCitUaGUgZXhhbXBsZSBleGNoYW5nZXMgdGhlIG9yZGVyIGJldHdlZW4gdGhlIGZpcnN0IGhhcmQgZGlzayBhbmQgdGhlCitzZWNvbmQgaGFyZCBkaXNrLiBTZWUgYWxzbyBAcmVme0RPUy9XaW5kb3dzfS4KK0BlbmQgZGVmZm4KKworCitAbm9kZSBtZDVjcnlwdAorQHN1YnNlY3Rpb24gbWQ1Y3J5cHQKKworQGRlZmZuIENvbW1hbmQgbWQ1Y3J5cHQKK1Byb21wdCB0byBlbnRlciBhIHBhc3N3b3JkLCBhbmQgZW5jcnlwdCBpdCBpbiBNRDUgZm9ybWF0LiBUaGUgZW5jcnlwdGVkCitwYXNzd29yZCBjYW4gYmUgdXNlZCB3aXRoIHRoZSBjb21tYW5kIEBjb21tYW5ke3Bhc3N3b3JkfQorKEBweHJlZntwYXNzd29yZH0pLiBTZWUgYWxzbyBAcmVme1NlY3VyaXR5fS4KK0BlbmQgZGVmZm4KKworCitAbm9kZSBtb2R1bGUKK0BzdWJzZWN0aW9uIG1vZHVsZQorCitAZGVmZm4gQ29tbWFuZCBtb2R1bGUgZmlsZSBAZG90c3t9CitMb2FkIGEgYm9vdCBtb2R1bGUgQHZhcntmaWxlfSBmb3IgYSBNdWx0aWJvb3QgZm9ybWF0IGJvb3QgaW1hZ2UgKG5vCitpbnRlcnByZXRhdGlvbiBvZiB0aGUgZmlsZSBjb250ZW50cyBhcmUgbWFkZSwgc28gdGhlIHVzZXIgb2YgdGhpcworY29tbWFuZCBtdXN0IGtub3cgd2hhdCB0aGUga2VybmVsIGluIHF1ZXN0aW9uIGV4cGVjdHMpLiBUaGUgcmVzdCBvZiB0aGUKK2xpbmUgaXMgcGFzc2VkIGFzIHRoZSBAZGZue21vZHVsZSBjb21tYW5kLWxpbmV9LCBsaWtlIHRoZQorQGNvbW1hbmR7a2VybmVsfSBjb21tYW5kLiBZb3UgbXVzdCBsb2FkIGEgTXVsdGlib290IGtlcm5lbCBpbWFnZSBiZWZvcmUKK2xvYWRpbmcgYW55IG1vZHVsZS4gU2VlIGFsc28gQHJlZnttb2R1bGVub3VuemlwfS4KK0BlbmQgZGVmZm4KKworCitAbm9kZSBtb2R1bGVub3VuemlwCitAc3Vic2VjdGlvbiBtb2R1bGVub3VuemlwCisKK0BkZWZmbiBDb21tYW5kIG1vZHVsZW5vdW56aXAgZmlsZSBAZG90c3t9CitUaGUgc2FtZSBhcyBAY29tbWFuZHttb2R1bGV9IChAcHhyZWZ7bW9kdWxlfSksIGV4Y2VwdCB0aGF0IGF1dG9tYXRpYworZGVjb21wcmVzc2lvbiBpcyBkaXNhYmxlZC4KK0BlbmQgZGVmZm4KKworCitAbm9kZSBwYXVzZQorQHN1YnNlY3Rpb24gcGF1c2UKKworQGRlZmZuIENvbW1hbmQgcGF1c2UgbWVzc2FnZSBAZG90c3t9CitQcmludCB0aGUgQHZhcnttZXNzYWdlfSwgdGhlbiB3YWl0IHVudGlsIGEga2V5IGlzIHByZXNzZWQuIE5vdGUgdGhhdAorcGxhY2luZyBAa2V5e15HfSAoQVNDSUkgY29kZSA3KSBpbiB0aGUgbWVzc2FnZSB3aWxsIGNhdXNlIHRoZSBzcGVha2VyIHRvCitlbWl0IHRoZSBzdGFuZGFyZCBiZWVwIHNvdW5kLCB3aGljaCBpcyB1c2VmdWwgd2hlbiBwcm9tcHRpbmcgdGhlIHVzZXIgdG8KK2NoYW5nZSBmbG9wcGllcy4KK0BlbmQgZGVmZm4KKworCitAbm9kZSBxdWl0CitAc3Vic2VjdGlvbiBxdWl0CisKK0BkZWZmbiBDb21tYW5kIHF1aXQKK0V4aXQgZnJvbSB0aGUgZ3J1YiBzaGVsbCBAY29tbWFuZHtncnVifSAoQHB4cmVme0ludm9raW5nIHRoZSBncnViCitzaGVsbH0pLiBUaGlzIGNvbW1hbmQgY2FuIGJlIHVzZWQgb25seSBpbiB0aGUgZ3J1YiBzaGVsbC4KK0BlbmQgZGVmZm4KKworCitAbm9kZSByZWJvb3QKK0BzdWJzZWN0aW9uIHJlYm9vdAorCitAZGVmZm4gQ29tbWFuZCByZWJvb3QKK1JlYm9vdCB0aGUgY29tcHV0ZXIuCitAZW5kIGRlZmZuCisKKworQG5vZGUgcmVhZAorQHN1YnNlY3Rpb24gcmVhZAorCitAZGVmZm4gQ29tbWFuZCByZWFkIGFkZHIKK1JlYWQgYSAzMi1iaXQgdmFsdWUgZnJvbSBtZW1vcnkgYXQgYWRkcmVzcyBAdmFye2FkZHJ9IGFuZCBkaXNwbGF5IGl0IGluCitoZXggZm9ybWF0LgorQGVuZCBkZWZmbgorCisKK0Bub2RlIHJvb3QKK0BzdWJzZWN0aW9uIHJvb3QKKworQGRlZmZuIENvbW1hbmQgcm9vdCBkZXZpY2UgW2hkYmlhc10KK1NldCB0aGUgY3VycmVudCBAZGZue3Jvb3QgZGV2aWNlfSB0byB0aGUgZGV2aWNlIEB2YXJ7ZGV2aWNlfSwgdGhlbgorYXR0ZW1wdCB0byBtb3VudCBpdCB0byBnZXQgdGhlIHBhcnRpdGlvbiBzaXplIChmb3IgcGFzc2luZyB0aGUgcGFydGl0aW9uCitkZXNjcmlwdG9yIGluIEBjb2Rle0VTOkVTSX0sIHVzZWQgYnkgc29tZSBjaGFpbi1sb2FkZWQgYm9vdCBsb2FkZXJzKSwgdGhlCitCU0QgZHJpdmUtdHlwZSAoZm9yIGJvb3RpbmcgQlNEIGtlcm5lbHMgdXNpbmcgdGhlaXIgbmF0aXZlIGJvb3QgZm9ybWF0KSwKK2FuZCBjb3JyZWN0bHkgZGV0ZXJtaW5lIHRoZSBQQyBwYXJ0aXRpb24gd2hlcmUgYSBCU0Qgc3ViLXBhcnRpdGlvbiBpcworbG9jYXRlZC4gVGhlIG9wdGlvbmFsIEB2YXJ7aGRiaWFzfSBwYXJhbWV0ZXIgaXMgYSBudW1iZXIgdG8gdGVsbCBhIEJTRAora2VybmVsIGhvdyBtYW55IEJJT1MgZHJpdmUgbnVtYmVycyBhcmUgb24gY29udHJvbGxlcnMgYmVmb3JlIHRoZSBjdXJyZW50CitvbmUuIEZvciBleGFtcGxlLCBpZiB0aGVyZSBpcyBhbiBJREUgZGlzayBhbmQgYSBTQ1NJIGRpc2ssIGFuZCB5b3VyCitGcmVlQlNEIHJvb3QgcGFydGl0aW9uIGlzIG9uIHRoZSBTQ1NJIGRpc2ssIHRoZW4gdXNlIGEgQHNhbXB7MX0gZm9yCitAdmFye2hkYmlhc30uCisKK1NlZSBhbHNvIEByZWZ7cm9vdG5vdmVyaWZ5fS4KK0BlbmQgZGVmZm4KKworCitAbm9kZSByb290bm92ZXJpZnkKK0BzdWJzZWN0aW9uIHJvb3Rub3ZlcmlmeQorCitAZGVmZm4gQ29tbWFuZCByb290bm92ZXJpZnkgZGV2aWNlIFtoZGJpYXNdCitTaW1pbGFyIHRvIEBjb21tYW5ke3Jvb3R9IChAcHhyZWZ7cm9vdH0pLCBidXQgZG9uJ3QgYXR0ZW1wdCB0byBtb3VudCB0aGUKK3BhcnRpdGlvbi4gVGhpcyBpcyB1c2VmdWwgZm9yIHdoZW4gYW4gT1MgaXMgb3V0c2lkZSBvZiB0aGUgYXJlYSBvZiB0aGUKK2Rpc2sgdGhhdCBHUlVCIGNhbiByZWFkLCBidXQgc2V0dGluZyB0aGUgY29ycmVjdCByb290IGRldmljZSBpcyBzdGlsbAorZGVzaXJlZC4gTm90ZSB0aGF0IHRoZSBpdGVtcyBtZW50aW9uZWQgaW4gQGNvbW1hbmR7cm9vdH0gYWJvdmUgd2hpY2gKK2Rlcml2ZWQgZnJvbSBhdHRlbXB0aW5nIHRoZSBtb3VudCB3aWxsIEBlbXBoe25vdH0gd29yayBjb3JyZWN0bHkuCitAZW5kIGRlZmZuCisKKworQG5vZGUgc2F2ZWRlZmF1bHQKK0BzdWJzZWN0aW9uIHNhdmVkZWZhdWx0CisKK0BkZWZmbiBDb21tYW5kIHNhdmVkZWZhdWx0IG51bQorU2F2ZSB0aGUgY3VycmVudCBtZW51IGVudHJ5IG9yIEB2YXJ7bnVtfSBpZiBzcGVjaWZpZWQgYXMgYSBkZWZhdWx0CitlbnRyeS4gSGVyZSBpcyBhbiBleGFtcGxlOgorCitAZXhhbXBsZQorQGdyb3VwCitkZWZhdWx0IHNhdmVkCit0aW1lb3V0IDEwCisKK3RpdGxlIEdOVS9MaW51eAorcm9vdCAoaGQwLDApCitrZXJuZWwgL2Jvb3Qvdm1saW51eiByb290PS9kZXYvc2RhMSB2Z2E9ZXh0Citpbml0cmQgL2Jvb3QvaW5pdHJkCitzYXZlZGVmYXVsdAorCit0aXRsZSBGcmVlQlNECityb290IChoZDAsYSkKK2tlcm5lbCAvYm9vdC9sb2FkZXIKK3NhdmVkZWZhdWx0CitAZW5kIGdyb3VwCitAZW5kIGV4YW1wbGUKKworV2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24sIEdSVUIgd2lsbCBjaG9vc2UgdGhlIGVudHJ5IGJvb3RlZCBwcmV2aW91c2x5IGFzCit0aGUgZGVmYXVsdCBlbnRyeS4KKworWW91IGNhbiBzcGVjaWZ5IEBzYW1we2ZhbGxiYWNrfSBpbnN0ZWFkIG9mIGEgbnVtYmVyLiBUaGVuLCBuZXh0CitmYWxsYmFjayBlbnRyeSBpcyBzYXZlZC4gTmV4dCBmYWxsYmFjayBlbnRyeSBpcyBjaG9zZW4gZnJvbSBmYWxsYmFjaworZW50cmllcy4gTm9ybWFsbHksIHRoaXMgd2lsbCBiZSB0aGUgZmlyc3QgZW50cnkgaW4gZmFsbGJhY2sgb25lcy4KKworU2VlIGFsc28gQHJlZntkZWZhdWx0fSBhbmQgQHJlZntJbnZva2luZyBncnViLXNldC1kZWZhdWx0fS4KK0BlbmQgZGVmZm4KKworCitAbm9kZSBzZXR1cAorQHN1YnNlY3Rpb24gc2V0dXAKKworQGRlZmZuIENvbW1hbmQgc2V0dXAgW0BvcHRpb257LS1mb3JjZS1sYmF9XSBbQG9wdGlvbnstLXN0YWdlMj1vc19zdGFnZTJfZmlsZX1dIFtAb3B0aW9uey0tcHJlZml4PWRpcn1dIGluc3RhbGxfZGV2aWNlIFtpbWFnZV9kZXZpY2VdCitTZXQgdXAgdGhlIGluc3RhbGxhdGlvbiBvZiBHUlVCIGF1dG9tYXRpY2FsbHkuIFRoaXMgY29tbWFuZCB1c2VzIHRoZQorbW9yZSBmbGV4aWJsZSBjb21tYW5kIEBjb21tYW5ke2luc3RhbGx9IChAcHhyZWZ7aW5zdGFsbH0pIGluIHRoZSBiYWNrZW5kCithbmQgaW5zdGFsbHMgR1JVQiBpbnRvIHRoZSBkZXZpY2UgQHZhcntpbnN0YWxsX2RldmljZX0uIElmCitAdmFye2ltYWdlX2RldmljZX0gaXMgc3BlY2lmaWVkLCB0aGVuIGZpbmQgdGhlIEdSVUIgaW1hZ2VzCisoQHB4cmVme0ltYWdlc30pIGluIHRoZSBkZXZpY2UgQHZhcntpbWFnZV9kZXZpY2V9LCBvdGhlcndpc2UgdXNlIHRoZQorY3VycmVudCBAZGZue3Jvb3QgZGV2aWNlfSwgd2hpY2ggY2FuIGJlIHNldCBieSB0aGUgY29tbWFuZAorQGNvbW1hbmR7cm9vdH0uIElmIEB2YXJ7aW5zdGFsbF9kZXZpY2V9IGlzIGEgaGFyZCBkaXNrLCB0aGVuIGVtYmVkIGEKK1N0YWdlIDEuNSBpbiB0aGUgZGlzayBpZiBwb3NzaWJsZS4KKworVGhlIG9wdGlvbiBAb3B0aW9uey0tcHJlZml4fSBzcGVjaWZpZXMgdGhlIGRpcmVjdG9yeSB1bmRlciB3aGljaCBHUlVCCitpbWFnZXMgYXJlIHB1dC4gSWYgaXQgaXMgbm90IHNwZWNpZmllZCwgR1JVQiBhdXRvbWF0aWNhbGx5IHNlYXJjaGVzIHRoZW0KK2luIEBmaWxley9ib290L2dydWJ9IGFuZCBAZmlsZXsvZ3J1Yn0uCisKK1RoZSBvcHRpb25zIEBvcHRpb257LS1mb3JjZS1sYmF9IGFuZCBAb3B0aW9uey0tc3RhZ2UyfSBhcmUganVzdCBwYXNzZWQKK3RvIEBjb21tYW5ke2luc3RhbGx9IGlmIHNwZWNpZmllZC4gQHhyZWZ7aW5zdGFsbH0sIGZvciBtb3JlCitpbmZvcm1hdGlvbi4KK0BlbmQgZGVmZm4KKworCitAbm9kZSB0ZXN0bG9hZAorQHN1YnNlY3Rpb24gdGVzdGxvYWQKKworQGRlZmZuIENvbW1hbmQgdGVzdGxvYWQgZmlsZQorUmVhZCB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIEB2YXJ7ZmlsZX0gaW4gc2V2ZXJhbCBkaWZmZXJlbnQgd2F5cyBhbmQKK2NvbXBhcmUgdGhlbSwgdG8gdGVzdCB0aGUgZmlsZXN5c3RlbSBjb2RlLiBUaGUgb3V0cHV0IGlzIHNvbWV3aGF0CitjcnlwdGljLCBidXQgaWYgbm8gZXJyb3JzIGFyZSByZXBvcnRlZCBhbmQgdGhlIGZpbmFsIEBzYW1we2k9QHZhcntYfSwKK2ZpbGVwb3M9QHZhcntZfX0gcmVhZGluZyBoYXMgQHZhcntYfSBhbmQgQHZhcntZfSBlcXVhbCwgdGhlbiBpdCBpcworZGVmaW5pdGVseSBjb25zaXN0ZW50LCBhbmQgdmVyeSBsaWtlbHkgd29ya3MgY29ycmVjdGx5IHN1YmplY3QgdG8gYQorY29uc2lzdGVudCBvZmZzZXQgZXJyb3IuIElmIHRoaXMgdGVzdCBzdWNjZWVkcywgdGhlbiBhIGdvb2QgbmV4dCBzdGVwIGlzCit0byB0cnkgbG9hZGluZyBhIGtlcm5lbC4KK0BlbmQgZGVmZm4KKworCitAbm9kZSB0ZXN0dmJlCitAc3Vic2VjdGlvbiB0ZXN0dmJlCisKK0BkZWZmbiBDb21tYW5kIHRlc3R2YmUgbW9kZQorVGVzdCB0aGUgVkVTQSBCSU9TIEVYVEVOU0lPTiBtb2RlIEB2YXJ7bW9kZX0uIFRoaXMgY29tbWFuZCB3aWxsIHN3aXRjaAoreW91ciB2aWRlbyBjYXJkIHRvIHRoZSBncmFwaGljcyBtb2RlLCBhbmQgc2hvdyBhbiBlbmRsZXNzIGFuaW1hdGlvbi4gSGl0Cithbnkga2V5IHRvIHJldHVybi4gU2VlIGFsc28gQHJlZnt2YmVwcm9iZX0uCitAZW5kIGRlZmZuCisKKworQG5vZGUgdXBwZXJtZW0KK0BzdWJzZWN0aW9uIHVwcGVybWVtCisKK0BkZWZmbiBDb21tYW5kIHVwcGVybWVtIGtieXRlcworRm9yY2UgR1JVQiB0byBhc3N1bWUgdGhhdCBvbmx5IEB2YXJ7a2J5dGVzfSBraWxvYnl0ZXMgb2YgdXBwZXIgbWVtb3J5CithcmUgaW5zdGFsbGVkLiBBbnkgc3lzdGVtIGFkZHJlc3MgcmFuZ2UgbWFwcyBhcmUgZGlzY2FyZGVkLgorCitAc3Ryb25ne0NhdXRpb246fSBUaGlzIHNob3VsZCBiZSB1c2VkIHdpdGggZ3JlYXQgY2F1dGlvbiwgYW5kIHNob3VsZAorb25seSBiZSBuZWNlc3Nhcnkgb24gc29tZSBvbGQgbWFjaGluZXMuIEdSVUIncyBCSU9TIHByb2JlIGNhbiBwaWNrIHVwCithbGwgQHNje3JhbX0gb24gYWxsIG5ldyBtYWNoaW5lcyB0aGUgYXV0aG9yIGhhcyBldmVyIGhlYXJkIG9mLiBJdCBjYW4KK2Fsc28gYmUgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIHRvIGxpZSB0byBhbiBPUy4KK0BlbmQgZGVmZm4KKworCitAbm9kZSB2YmVwcm9iZQorQHN1YnNlY3Rpb24gdmJlcHJvYmUKKworQGRlZmZuIENvbW1hbmQgdmJlcHJvYmUgW21vZGVdCitQcm9iZSBWRVNBIEJJT1MgRVhURU5TSU9OIGluZm9ybWF0aW9uLiBJZiB0aGUgbW9kZSBAdmFye21vZGV9IGlzCitzcGVjaWZpZWQsIHNob3cgb25seSB0aGUgaW5mb3JtYXRpb24gYWJvdXQgQHZhcnttb2RlfS4gT3RoZXJ3aXNlLCB0aGlzCitjb21tYW5kIGxpc3RzIHVwIGF2YWlsYWJsZSBWQkUgbW9kZXMgb24gdGhlIHNjcmVlbi4gU2VlIGFsc28KK0ByZWZ7dGVzdHZiZX0uCitAZW5kIGRlZmZuCisKKworQG5vZGUgVHJvdWJsZXNob290aW5nCitAY2hhcHRlciBFcnJvciBtZXNzYWdlcyByZXBvcnRlZCBieSBHUlVCCisKK1RoaXMgY2hhcHRlciBkZXNjcmliZXMgZXJyb3IgbWVzc2FnZXMgcmVwb3J0ZWQgYnkgR1JVQiB3aGVuIHlvdQorZW5jb3VudGVyIHRyb3VibGUuIEB4cmVme0ludm9raW5nIHRoZSBncnViIHNoZWxsfSwgaWYgeW91ciBwcm9ibGVtIGlzCitzcGVjaWZpYyB0byB0aGUgZ3J1YiBzaGVsbC4KKworQG1lbnUKKyogU3RhZ2UxIGVycm9yczo6ICAgICAgICAgICAgICAgRXJyb3JzIHJlcG9ydGVkIGJ5IHRoZSBTdGFnZSAxCisqIFN0YWdlMS41IGVycm9yczo6ICAgICAgICAgICAgIEVycm9ycyByZXBvcnRlZCBieSB0aGUgU3RhZ2UgMS41CisqIFN0YWdlMiBlcnJvcnM6OiAgICAgICAgICAgICAgIEVycm9ycyByZXBvcnRlZCBieSB0aGUgU3RhZ2UgMgorQGVuZCBtZW51CisKKworQG5vZGUgU3RhZ2UxIGVycm9ycworQHNlY3Rpb24gRXJyb3JzIHJlcG9ydGVkIGJ5IHRoZSBTdGFnZSAxCisKK1RoZSBnZW5lcmFsIHdheSB0aGF0IHRoZSBTdGFnZSAxIGhhbmRsZXMgZXJyb3JzIGlzIHRvIHByaW50IGFuIGVycm9yCitzdHJpbmcgYW5kIHRoZW4gaGFsdC4gUHJlc3NpbmcgQGtiZHtAa2V5e0NUUkx9LUBrZXl7QUxUfS1Aa2V5e0RFTH19IHdpbGwKK3JlYm9vdC4KKworVGhlIGZvbGxvd2luZyBpcyBhIGNvbXByZWhlbnNpdmUgbGlzdCBvZiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIFN0YWdlIDE6CisKK0B0YWJsZSBAYXNpcworQGl0ZW0gSGFyZCBEaXNrIEVycm9yCitUaGUgc3RhZ2UyIG9yIHN0YWdlMS41IGlzIGJlaW5nIHJlYWQgZnJvbSBhIGhhcmQgZGlzaywgYW5kIHRoZSBhdHRlbXB0Cit0byBkZXRlcm1pbmUgdGhlIHNpemUgYW5kIGdlb21ldHJ5IG9mIHRoZSBoYXJkIGRpc2sgZmFpbGVkLgorCitAaXRlbSBGbG9wcHkgRXJyb3IKK1RoZSBzdGFnZTIgb3Igc3RhZ2UxLjUgaXMgYmVpbmcgcmVhZCBmcm9tIGEgZmxvcHB5IGRpc2ssIGFuZCB0aGUgYXR0ZW1wdAordG8gZGV0ZXJtaW5lIHRoZSBzaXplIGFuZCBnZW9tZXRyeSBvZiB0aGUgZmxvcHB5IGRpc2sgZmFpbGVkLiBJdCdzIGxpc3RlZAorYXMgYSBzZXBhcmF0ZSBlcnJvciBzaW5jZSB0aGUgcHJvYmUgc2VxdWVuY2UgaXMgZGlmZmVyZW50IHRoYW4gZm9yIGhhcmQKK2Rpc2tzLgorCitAaXRlbSBSZWFkIEVycm9yCitBIGRpc2sgcmVhZCBlcnJvciBoYXBwZW5lZCB3aGlsZSB0cnlpbmcgdG8gcmVhZCB0aGUgc3RhZ2UyIG9yIHN0YWdlMS41LgorCitAaXRlbSBHZW9tIEVycm9yCitUaGUgbG9jYXRpb24gb2YgdGhlIHN0YWdlMiBvciBzdGFnZTEuNSBpcyBub3QgaW4gdGhlIHBvcnRpb24gb2YgdGhlIGRpc2sKK3N1cHBvcnRlZCBkaXJlY3RseSBieSB0aGUgQklPUyByZWFkIGNhbGxzLiAgVGhpcyBjb3VsZCBvY2N1ciBiZWNhdXNlIHRoZQorQklPUyB0cmFuc2xhdGVkIGdlb21ldHJ5IGhhcyBiZWVuIGNoYW5nZWQgYnkgdGhlIHVzZXIgb3IgdGhlIGRpc2sgaXMKK21vdmVkIHRvIGFub3RoZXIgbWFjaGluZSBvciBjb250cm9sbGVyIGFmdGVyIGluc3RhbGxhdGlvbiwgb3IgR1JVQiB3YXMKK25vdCBpbnN0YWxsZWQgdXNpbmcgaXRzZWxmIChpZiBpdCB3YXMsIHRoZSBTdGFnZSAyIHZlcnNpb24gb2YgdGhpcyBlcnJvcgord291bGQgaGF2ZSBiZWVuIHNlZW4gZHVyaW5nIHRoYXQgcHJvY2VzcyBhbmQgaXQgd291bGQgbm90IGhhdmUgY29tcGxldGVkCit0aGUgaW5zdGFsbCkuCitAZW5kIHRhYmxlCisKKworQG5vZGUgU3RhZ2UxLjUgZXJyb3JzCitAc2VjdGlvbiBFcnJvcnMgcmVwb3J0ZWQgYnkgdGhlIFN0YWdlIDEuNQorCitUaGUgZ2VuZXJhbCB3YXkgdGhhdCB0aGUgU3RhZ2UgMS41IGhhbmRsZXMgZXJyb3JzIGlzIHRvIHByaW50IGFuIGVycm9yCitudW1iZXIgaW4gdGhlIGZvcm0gQGNvZGV7RXJyb3IgQHZhcntudW19fSBhbmQgdGhlbiBoYWx0LiBQcmVzc2luZworQGtiZHtAa2V5e0NUUkx9LUBrZXl7QUxUfS1Aa2V5e0RFTH19IHdpbGwgcmVib290LgorCitUaGUgZXJyb3IgbnVtYmVycyBjb3JyZXNwb25kIHRvIHRoZSBlcnJvcnMgcmVwb3J0ZWQgYnkgU3RhZ2UKKzIuIEB4cmVme1N0YWdlMiBlcnJvcnN9LgorCisKK0Bub2RlIFN0YWdlMiBlcnJvcnMKK0BzZWN0aW9uIEVycm9ycyByZXBvcnRlZCBieSB0aGUgU3RhZ2UgMgorCitUaGUgZ2VuZXJhbCB3YXkgdGhhdCB0aGUgU3RhZ2UgMiBoYW5kbGVzIGVycm9ycyBpcyB0byBhYm9ydCB0aGUKK29wZXJhdGlvbiBpbiBxdWVzdGlvbiwgcHJpbnQgYW4gZXJyb3Igc3RyaW5nLCB0aGVuIChpZiBwb3NzaWJsZSkgZWl0aGVyCitjb250aW51ZSBiYXNlZCBvbiB0aGUgZmFjdCB0aGF0IGFuIGVycm9yIG9jY3VycmVkIG9yIHdhaXQgZm9yIHRoZSB1c2VyIHRvCitkZWFsIHdpdGggdGhlIGVycm9yLgorCitUaGUgZm9sbG93aW5nIGlzIGEgY29tcHJlaGVuc2l2ZSBsaXN0IG9mIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgU3RhZ2UgMgorKGVycm9yIG51bWJlcnMgZm9yIHRoZSBTdGFnZSAxLjUgYXJlIGxpc3RlZCBiZWZvcmUgdGhlIGNvbG9uIGluIGVhY2gKK2Rlc2NyaXB0aW9uKToKKworQHRhYmxlIEBhc2lzCitAaXRlbSAxIDogRmlsZW5hbWUgbXVzdCBiZSBlaXRoZXIgYW4gYWJzb2x1dGUgZmlsZW5hbWUgb3IgYmxvY2tsaXN0CitUaGlzIGVycm9yIGlzIHJldHVybmVkIGlmIGEgZmlsZSBuYW1lIGlzIHJlcXVlc3RlZCB3aGljaCBkb2Vzbid0IGZpdCB0aGUKK3N5bnRheC9ydWxlcyBsaXN0ZWQgaW4gdGhlIEByZWZ7RmlsZXN5c3RlbX0uCisKK0BpdGVtIDIgOiBCYWQgZmlsZSBvciBkaXJlY3RvcnkgdHlwZQorVGhpcyBlcnJvciBpcyByZXR1cm5lZCBpZiBhIGZpbGUgcmVxdWVzdGVkIGlzIG5vdCBhIHJlZ3VsYXIgZmlsZSwgYnV0Citzb21ldGhpbmcgbGlrZSBhIHN5bWJvbGljIGxpbmssIGRpcmVjdG9yeSwgb3IgRklGTy4KKworQGl0ZW0gMyA6IEJhZCBvciBjb3JydXB0IGRhdGEgd2hpbGUgZGVjb21wcmVzc2luZyBmaWxlCitUaGlzIGVycm9yIGlzIHJldHVybmVkIGlmIHRoZSBydW4tbGVuZ3RoIGRlY29tcHJlc3Npb24gY29kZSBnZXRzIGFuCitpbnRlcm5hbCBlcnJvci4gVGhpcyBpcyB1c3VhbGx5IGZyb20gYSBjb3JydXB0IGZpbGUuCisKK0BpdGVtIDQgOiBCYWQgb3IgaW5jb21wYXRpYmxlIGhlYWRlciBpbiBjb21wcmVzc2VkIGZpbGUKK1RoaXMgZXJyb3IgaXMgcmV0dXJuZWQgaWYgdGhlIGZpbGUgaGVhZGVyIGZvciBhIHN1cHBvc2VkbHkgY29tcHJlc3NlZAorZmlsZSBpcyBiYWQuCisKK0BpdGVtIDUgOiBQYXJ0aXRpb24gdGFibGUgaW52YWxpZCBvciBjb3JydXB0CitUaGlzIGVycm9yIGlzIHJldHVybmVkIGlmIHRoZSBzYW5pdHkgY2hlY2tzIG9uIHRoZSBpbnRlZ3JpdHkgb2YgdGhlCitwYXJ0aXRpb24gdGFibGUgZmFpbC4gVGhpcyBpcyBhIGJhZCBzaWduLgorCitAaXRlbSA2IDogTWlzbWF0Y2hlZCBvciBjb3JydXB0IHZlcnNpb24gb2Ygc3RhZ2UxL3N0YWdlMgorVGhpcyBlcnJvciBpcyByZXR1cm5lZCBpZiB0aGUgaW5zdGFsbCBjb21tYW5kIHBvaW50cyB0byBpbmNvbXBhdGlibGUKK29yIGNvcnJ1cHQgdmVyc2lvbnMgb2YgdGhlIHN0YWdlMSBvciBzdGFnZTIuIEl0IGNhbid0IGRldGVjdCBjb3JydXB0aW9uCitpbiBnZW5lcmFsLCBidXQgdGhpcyBpcyBhIHNhbml0eSBjaGVjayBvbiB0aGUgdmVyc2lvbiBudW1iZXJzLCB3aGljaAorc2hvdWxkIGJlIGNvcnJlY3QuCisKK0BpdGVtIDcgOiBMb2FkaW5nIGJlbG93IDFNQiBpcyBub3Qgc3VwcG9ydGVkCitUaGlzIGVycm9yIGlzIHJldHVybmVkIGlmIHRoZSBsb3dlc3QgYWRkcmVzcyBpbiBhIGtlcm5lbCBpcyBiZWxvdyB0aGUKKzFNQiBib3VuZGFyeS4gVGhlIExpbnV4IHpJbWFnZSBmb3JtYXQgaXMgYSBzcGVjaWFsIGNhc2UgYW5kIGNhbiBiZQoraGFuZGxlZCBzaW5jZSBpdCBoYXMgYSBmaXhlZCBsb2FkaW5nIGFkZHJlc3MgYW5kIG1heGltdW0gc2l6ZS4KKworQGl0ZW0gOCA6IEtlcm5lbCBtdXN0IGJlIGxvYWRlZCBiZWZvcmUgYm9vdGluZworVGhpcyBlcnJvciBpcyByZXR1cm5lZCBpZiBHUlVCIGlzIHRvbGQgdG8gZXhlY3V0ZSB0aGUgYm9vdCBzZXF1ZW5jZQord2l0aG91dCBoYXZpbmcgYSBrZXJuZWwgdG8gc3RhcnQuCisKK0BpdGVtIDkgOiBVbmtub3duIGJvb3QgZmFpbHVyZQorVGhpcyBlcnJvciBpcyByZXR1cm5lZCBpZiB0aGUgYm9vdCBhdHRlbXB0IGRpZCBub3Qgc3VjY2VlZCBmb3IgcmVhc29ucword2hpY2ggYXJlIHVua25vd24uCisKK0BpdGVtIDEwIDogVW5zdXBwb3J0ZWQgTXVsdGlib290IGZlYXR1cmVzIHJlcXVlc3RlZAorVGhpcyBlcnJvciBpcyByZXR1cm5lZCB3aGVuIHRoZSBNdWx0aWJvb3QgZmVhdHVyZXMgd29yZCBpbiB0aGUgTXVsdGlib290CitoZWFkZXIgcmVxdWlyZXMgYSBmZWF0dXJlIHRoYXQgaXMgbm90IHJlY29nbml6ZWQuIFRoZSBwb2ludCBvZiB0aGlzIGlzCit0aGF0IHRoZSBrZXJuZWwgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZyB3aGljaCBHUlVCIGlzIHByb2JhYmx5Cit1bmFibGUgdG8gcHJvdmlkZS4KKworQGl0ZW0gMTEgOiBVbnJlY29nbml6ZWQgZGV2aWNlIHN0cmluZworVGhpcyBlcnJvciBpcyByZXR1cm5lZCBpZiBhIGRldmljZSBzdHJpbmcgd2FzIGV4cGVjdGVkLCBhbmQgdGhlIHN0cmluZworZW5jb3VudGVyZWQgZGlkbid0IGZpdCB0aGUgc3ludGF4L3J1bGVzIGxpc3RlZCBpbiB0aGUgQHJlZntGaWxlc3lzdGVtfS4KKworQGl0ZW0gMTIgOiBJbnZhbGlkIGRldmljZSByZXF1ZXN0ZWQKK1RoaXMgZXJyb3IgaXMgcmV0dXJuZWQgaWYgYSBkZXZpY2Ugc3RyaW5nIGlzIHJlY29nbml6YWJsZSBidXQgZG9lcyBub3QKK2ZhbGwgdW5kZXIgdGhlIG90aGVyIGRldmljZSBlcnJvcnMuCisKK0BpdGVtIDEzIDogSW52YWxpZCBvciB1bnN1cHBvcnRlZCBleGVjdXRhYmxlIGZvcm1hdAorVGhpcyBlcnJvciBpcyByZXR1cm5lZCBpZiB0aGUga2VybmVsIGltYWdlIGJlaW5nIGxvYWRlZCBpcyBub3QKK3JlY29nbml6ZWQgYXMgTXVsdGlib290IG9yIG9uZSBvZiB0aGUgc3VwcG9ydGVkIG5hdGl2ZSBmb3JtYXRzIChMaW51eAorekltYWdlIG9yIGJ6SW1hZ2UsIEZyZWVCU0QsIG9yIE5ldEJTRCkuCisKK0BpdGVtIDE0IDogRmlsZXN5c3RlbSBjb21wYXRpYmlsaXR5IGVycm9yLCBjYW5ub3QgcmVhZCB3aG9sZSBmaWxlCitTb21lIG9mIHRoZSBmaWxlc3lzdGVtIHJlYWRpbmcgY29kZSBpbiBHUlVCIGhhcyBsaW1pdHMgb24gdGhlIGxlbmd0aCBvZgordGhlIGZpbGVzIGl0IGNhbiByZWFkLiBUaGlzIGVycm9yIGlzIHJldHVybmVkIHdoZW4gdGhlIHVzZXIgcnVucyBpbnRvCitzdWNoIGEgbGltaXQuCisKK0BpdGVtIDE1IDogRmlsZSBub3QgZm91bmQKK1RoaXMgZXJyb3IgaXMgcmV0dXJuZWQgaWYgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgY2Fubm90IGJlIGZvdW5kLCBidXQKK2V2ZXJ5dGhpbmcgZWxzZSAobGlrZSB0aGUgZGlzay9wYXJ0aXRpb24gaW5mbykgaXMgT0suCisKK0BpdGVtIDE2IDogSW5jb25zaXN0ZW50IGZpbGVzeXN0ZW0gc3RydWN0dXJlCitUaGlzIGVycm9yIGlzIHJldHVybmVkIGJ5IHRoZSBmaWxlc3lzdGVtIGNvZGUgdG8gZGVub3RlIGFuIGludGVybmFsCitlcnJvciBjYXVzZWQgYnkgdGhlIHNhbml0eSBjaGVja3Mgb2YgdGhlIGZpbGVzeXN0ZW0gc3RydWN0dXJlIG9uIGRpc2sKK25vdCBtYXRjaGluZyB3aGF0IGl0IGV4cGVjdHMuIFRoaXMgaXMgdXN1YWxseSBjYXVzZWQgYnkgYSBjb3JydXB0CitmaWxlc3lzdGVtIG9yIGJ1Z3MgaW4gdGhlIGNvZGUgaGFuZGxpbmcgaXQgaW4gR1JVQi4KKworQGl0ZW0gMTcgOiBDYW5ub3QgbW91bnQgc2VsZWN0ZWQgcGFydGl0aW9uCitUaGlzIGVycm9yIGlzIHJldHVybmVkIGlmIHRoZSBwYXJ0aXRpb24gcmVxdWVzdGVkIGV4aXN0cywgYnV0IHRoZQorZmlsZXN5c3RlbSB0eXBlIGNhbm5vdCBiZSByZWNvZ25pemVkIGJ5IEdSVUIuCisKK0BpdGVtIDE4IDogU2VsZWN0ZWQgY3lsaW5kZXIgZXhjZWVkcyBtYXhpbXVtIHN1cHBvcnRlZCBieSBCSU9TCitUaGlzIGVycm9yIGlzIHJldHVybmVkIHdoZW4gYSByZWFkIGlzIGF0dGVtcHRlZCBhdCBhIGxpbmVhciBibG9jaworYWRkcmVzcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgQklPUyB0cmFuc2xhdGVkIGFyZWEuIFRoaXMgZ2VuZXJhbGx5CitoYXBwZW5zIGlmIHlvdXIgZGlzayBpcyBsYXJnZXIgdGhhbiB0aGUgQklPUyBjYW4gaGFuZGxlICg1MTJNQiBmb3IKKyhFKUlERSBkaXNrcyBvbiBvbGRlciBtYWNoaW5lcyBvciBsYXJnZXIgdGhhbiA4R0IgaW4gZ2VuZXJhbCkuCisKK0BpdGVtIDE5IDogTGludXgga2VybmVsIG11c3QgYmUgbG9hZGVkIGJlZm9yZSBpbml0cmQKK1RoaXMgZXJyb3IgaXMgcmV0dXJuZWQgaWYgdGhlIGluaXRyZCBjb21tYW5kIGlzIHVzZWQgYmVmb3JlIGxvYWRpbmcgYQorTGludXgga2VybmVsLgorCitAaXRlbSAyMCA6IE11bHRpYm9vdCBrZXJuZWwgbXVzdCBiZSBsb2FkZWQgYmVmb3JlIG1vZHVsZXMKK1RoaXMgZXJyb3IgaXMgcmV0dXJuZWQgaWYgdGhlIG1vZHVsZSBsb2FkIGNvbW1hbmQgaXMgdXNlZCBiZWZvcmUgbG9hZGluZworYSBNdWx0aWJvb3Qga2VybmVsLiBJdCBvbmx5IG1ha2VzIHNlbnNlIGluIHRoaXMgY2FzZSBhbnl3YXksIGFzIEdSVUIgaGFzCitubyBpZGVhIGhvdyB0byBjb21tdW5pY2F0ZSB0aGUgcHJlc2VuY2Ugb2Ygc3VjaCBtb2R1bGVzIHRvIGEKK25vbi1NdWx0aWJvb3QtYXdhcmUga2VybmVsLgorCitAaXRlbSAyMSA6IFNlbGVjdGVkIGRpc2sgZG9lcyBub3QgZXhpc3QKK1RoaXMgZXJyb3IgaXMgcmV0dXJuZWQgaWYgdGhlIGRldmljZSBwYXJ0IG9mIGEgZGV2aWNlLSBvciBmdWxsIGZpbGUgbmFtZQorcmVmZXJzIHRvIGEgZGlzayBvciBCSU9TIGRldmljZSB0aGF0IGlzIG5vdCBwcmVzZW50IG9yIG5vdCByZWNvZ25pemVkIGJ5Cit0aGUgQklPUyBpbiB0aGUgc3lzdGVtLgorCitAaXRlbSAyMiA6IE5vIHN1Y2ggcGFydGl0aW9uCitUaGlzIGVycm9yIGlzIHJldHVybmVkIGlmIGEgcGFydGl0aW9uIGlzIHJlcXVlc3RlZCBpbiB0aGUgZGV2aWNlIHBhcnQgb2YKK2EgZGV2aWNlLSBvciBmdWxsIGZpbGUgbmFtZSB3aGljaCBpc24ndCBvbiB0aGUgc2VsZWN0ZWQgZGlzay4KKworQGl0ZW0gMjMgOiBFcnJvciB3aGlsZSBwYXJzaW5nIG51bWJlcgorVGhpcyBlcnJvciBpcyByZXR1cm5lZCBpZiBHUlVCIHdhcyBleHBlY3RpbmcgdG8gcmVhZCBhIG51bWJlciBhbmQKK2VuY291bnRlcmVkIGJhZCBkYXRhLgorCitAaXRlbSAyNCA6IEF0dGVtcHQgdG8gYWNjZXNzIGJsb2NrIG91dHNpZGUgcGFydGl0aW9uCitUaGlzIGVycm9yIGlzIHJldHVybmVkIGlmIGEgbGluZWFyIGJsb2NrIGFkZHJlc3MgaXMgb3V0c2lkZSBvZiB0aGUgZGlzaworcGFydGl0aW9uLiBUaGlzIGdlbmVyYWxseSBoYXBwZW5zIGJlY2F1c2Ugb2YgYSBjb3JydXB0IGZpbGVzeXN0ZW0gb24gdGhlCitkaXNrIG9yIGEgYnVnIGluIHRoZSBjb2RlIGhhbmRsaW5nIGl0IGluIEdSVUIgKGl0J3MgYSBncmVhdCBkZWJ1Z2dpbmcKK3Rvb2wpLgorCitAaXRlbSAyNSA6IERpc2sgcmVhZCBlcnJvcgorVGhpcyBlcnJvciBpcyByZXR1cm5lZCBpZiB0aGVyZSBpcyBhIGRpc2sgcmVhZCBlcnJvciB3aGVuIHRyeWluZyB0bworcHJvYmUgb3IgcmVhZCBkYXRhIGZyb20gYSBwYXJ0aWN1bGFyIGRpc2suCisKK0BpdGVtIDI2IDogVG9vIG1hbnkgc3ltYm9saWMgbGlua3MKK1RoaXMgZXJyb3IgaXMgcmV0dXJuZWQgaWYgdGhlIGxpbmsgY291bnQgaXMgYmV5b25kIHRoZSBtYXhpbXVtCisoY3VycmVudGx5IDUpLCBwb3NzaWJseSB0aGUgc3ltYm9saWMgbGlua3MgYXJlIGxvb3BlZC4KKworQGl0ZW0gMjcgOiBVbnJlY29nbml6ZWQgY29tbWFuZAorVGhpcyBlcnJvciBpcyByZXR1cm5lZCBpZiBhbiB1bnJlY29nbml6ZWQgY29tbWFuZCBpcyBlbnRlcmVkIG9uIHRoZQorY29tbWFuZC1saW5lIG9yIGluIGEgYm9vdCBzZXF1ZW5jZSBzZWN0aW9uIG9mIGEgY29uZmlndXJhdGlvbiBmaWxlIGFuZAordGhhdCBlbnRyeSBpcyBzZWxlY3RlZC4KKworQGl0ZW0gMjggOiBTZWxlY3RlZCBpdGVtIGNhbm5vdCBmaXQgaW50byBtZW1vcnkKK1RoaXMgZXJyb3IgaXMgcmV0dXJuZWQgaWYgYSBrZXJuZWwsIG1vZHVsZSwgb3IgcmF3IGZpbGUgbG9hZCBjb21tYW5kIGlzCitlaXRoZXIgdHJ5aW5nIHRvIGxvYWQgaXRzIGRhdGEgc3VjaCB0aGF0IGl0IHdvbid0IGZpdCBpbnRvIG1lbW9yeSBvciBpdAoraXMgc2ltcGx5IHRvbyBiaWcuCisKK0BpdGVtIDI5IDogRGlzayB3cml0ZSBlcnJvcgorVGhpcyBlcnJvciBpcyByZXR1cm5lZCBpZiB0aGVyZSBpcyBhIGRpc2sgd3JpdGUgZXJyb3Igd2hlbiB0cnlpbmcgdG8KK3dyaXRlIHRvIGEgcGFydGljdWxhciBkaXNrLiBUaGlzIHdvdWxkIGdlbmVyYWxseSBvbmx5IG9jY3VyIGR1cmluZyBhbgoraW5zdGFsbCBvZiBzZXQgYWN0aXZlIHBhcnRpdGlvbiBjb21tYW5kLgorCitAaXRlbSAzMCA6IEludmFsaWQgYXJndW1lbnQKK1RoaXMgZXJyb3IgaXMgcmV0dXJuZWQgaWYgYW4gYXJndW1lbnQgc3BlY2lmaWVkIHRvIGEgY29tbWFuZCBpcyBpbnZhbGlkLgorCitAaXRlbSAzMSA6IEZpbGUgaXMgbm90IHNlY3RvciBhbGlnbmVkCitUaGlzIGVycm9yIG1heSBvY2N1ciBvbmx5IHdoZW4geW91IGFjY2VzcyBhIFJlaXNlckZTIHBhcnRpdGlvbiBieQorYmxvY2stbGlzdHMgKGUuZy4gdGhlIGNvbW1hbmQgQGNvbW1hbmR7aW5zdGFsbH0pLiBJbiB0aGlzIGNhc2UsIHlvdQorc2hvdWxkIG1vdW50IHRoZSBwYXJ0aXRpb24gd2l0aCB0aGUgQHNhbXB7LW8gbm90YWlsfSBvcHRpb24uCisKK0BpdGVtIDMyIDogTXVzdCBiZSBhdXRoZW50aWNhdGVkCitUaGlzIGVycm9yIGlzIHJldHVybmVkIGlmIHlvdSB0cnkgdG8gcnVuIGEgbG9ja2VkIGVudHJ5LiBZb3Ugc2hvdWxkCitlbnRlciBhIGNvcnJlY3QgcGFzc3dvcmQgYmVmb3JlIHJ1bm5pbmcgc3VjaCBhbiBlbnRyeS4KKworQGl0ZW0gMzMgOiBTZXJpYWwgZGV2aWNlIG5vdCBjb25maWd1cmVkCitUaGlzIGVycm9yIGlzIHJldHVybmVkIGlmIHlvdSB0cnkgdG8gY2hhbmdlIHlvdXIgdGVybWluYWwgdG8gYSBzZXJpYWwKK29uZSBiZWZvcmUgaW5pdGlhbGl6aW5nIGFueSBzZXJpYWwgZGV2aWNlLgorCitAaXRlbSAzNCA6IE5vIHNwYXJlIHNlY3RvcnMgb24gdGhlIGRpc2sKK1RoaXMgZXJyb3IgaXMgcmV0dXJuZWQgaWYgYSBkaXNrIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggc3BhcmUgc3BhY2UuIFRoaXMKK2hhcHBlbnMgd2hlbiB5b3UgdHJ5IHRvIGVtYmVkIFN0YWdlIDEuNSBpbnRvIHRoZSB1bnVzZWQgc2VjdG9ycyBhZnRlcgordGhlIE1CUiwgYnV0IHRoZSBmaXJzdCBwYXJ0aXRpb24gc3RhcnRzIHJpZ2h0IGFmdGVyIHRoZSBNQlIgb3IgdGhleSBhcmUKK3VzZWQgYnkgRVotQklPUy4KK0BlbmQgdGFibGUKKworCitAbm9kZSBJbnZva2luZyB0aGUgZ3J1YiBzaGVsbAorQGNoYXB0ZXIgSW52b2tpbmcgdGhlIGdydWIgc2hlbGwKKworVGhpcyBjaGFwdGVyIGRvY3VtZW50cyB0aGUgZ3J1YiBzaGVsbCBAY29tbWFuZHtncnVifS4gTm90ZSB0aGF0IHRoZSBncnViCitzaGVsbCBpcyBhbiBlbXVsYXRvcjsgaXQgZG9lc24ndCBydW4gdW5kZXIgdGhlIG5hdGl2ZSBlbnZpcm9ubWVudCwgc28gaXQKK3NvbWV0aW1lcyBkb2VzIHNvbWV0aGluZyB3cm9uZy4gVGhlcmVmb3JlLCB5b3Ugc2hvdWxkbid0IHRydXN0IGl0IHRvbworbXVjaC4gSWYgdGhlcmUgaXMgYW55dGhpbmcgd3Jvbmcgd2l0aCBpdCwgZG9uJ3QgaGVzaXRhdGUgdG8gdHJ5IHRoZQorbmF0aXZlIEdSVUIgZW52aXJvbm1lbnQsIGVzcGVjaWFsbHkgd2hlbiBpdCBndWVzc2VzIGEgd3JvbmcgbWFwIGJldHdlZW4KK0JJT1MgZHJpdmVzIGFuZCBPUyBkZXZpY2VzLgorCitAbWVudQorKiBCYXNpYyB1c2FnZTo6ICAgICAgICAgICAgICAgICBIb3cgdG8gdXNlIHRoZSBncnViIHNoZWxsCisqIEluc3RhbGxhdGlvbiB1bmRlciBVTklYOjogICAgIEhvdyB0byBpbnN0YWxsIEdSVUIgdmlhIEBjb21tYW5ke2dydWJ9CisqIERldmljZSBtYXA6OiAgICAgICAgICAgICAgICAgIFRoZSBtYXAgYmV0d2VlbiBCSU9TIGRyaXZlcyBhbmQgT1MgZGV2aWNlcworQGVuZCBtZW51CisKKworQG5vZGUgQmFzaWMgdXNhZ2UKK0BzZWN0aW9uIEludHJvZHVjdGlvbiBpbnRvIHRoZSBncnViIHNoZWxsCisKK1lvdSBjYW4gdXNlIHRoZSBjb21tYW5kIEBjb21tYW5ke2dydWJ9IGZvciBpbnN0YWxsaW5nIEdSVUIgdW5kZXIgeW91cgorb3BlcmF0aW5nIHN5c3RlbXMgYW5kIGZvciBhIHRlc3RiZWQgd2hlbiB5b3UgYWRkIGEgbmV3IGZlYXR1cmUgaW50byBHUlVCCitvciB3aGVuIGZpeGluZyBhIGJ1Zy4gQGNvbW1hbmR7Z3J1Yn0gaXMgYWxtb3N0IHRoZSBzYW1lIGFzIHRoZSBTdGFnZSAyLAorYW5kLCBpbiBmYWN0LCBpdCBzaGFyZXMgdGhlIHNvdXJjZSBjb2RlIHdpdGggdGhlIFN0YWdlIDIgYW5kIHlvdSBjYW4gdXNlCit0aGUgc2FtZSBjb21tYW5kcyAoQHB4cmVme0NvbW1hbmRzfSkgaW4gQGNvbW1hbmR7Z3J1Yn0uIEl0IGlzIGVtdWxhdGVkIGJ5CityZXBsYWNpbmcgQklPUyBjYWxscyB3aXRoIFVOSVggc3lzdGVtIGNhbGxzIGFuZCBsaWJjIGZ1bmN0aW9ucy4KKworVGhlIGNvbW1hbmQgQGNvbW1hbmR7Z3J1Yn0gYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSAtLWhlbHAKK1ByaW50IGEgc3VtbWFyeSBvZiB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMgYW5kIGV4aXQuCisKK0BpdGVtIC0tdmVyc2lvbgorUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIEdSVUIgYW5kIGV4aXQuCisKK0BpdGVtIC0tdmVyYm9zZQorUHJpbnQgc29tZSB2ZXJib3NlIG1lc3NhZ2VzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZS4KKworQGl0ZW0gLS1kZXZpY2UtbWFwPUB2YXJ7ZmlsZX0KK1VzZSB0aGUgZGV2aWNlIG1hcCBmaWxlIEB2YXJ7ZmlsZX0uIFRoZSBmb3JtYXQgaXMgZGVzY3JpYmVkIGluCitAcmVme0RldmljZSBtYXB9LgorCitAaXRlbSAtLW5vLWZsb3BweQorRG8gbm90IHByb2JlIGFueSBmbG9wcHkgZHJpdmUuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgaWYgdGhlIG9wdGlvbgorQG9wdGlvbnstLWRldmljZS1tYXB9IGlzIHNwZWNpZmllZCAoQHB4cmVme0RldmljZSBtYXB9KS4KKworQGl0ZW0gLS1wcm9iZS1zZWNvbmQtZmxvcHB5CitQcm9iZSB0aGUgc2Vjb25kIGZsb3BweSBkcml2ZS4gSWYgdGhpcyBvcHRpb24gaXMgbm90IHNwZWNpZmllZCwgdGhlIGdydWIKK3NoZWxsIGRvZXMgbm90IHByb2JlIGl0LCBhcyB0aGF0IHNvbWV0aW1lcyB0YWtlcyBhIGxvbmcgdGltZS4gSWYgeW91CitzcGVjaWZ5IHRoZSBkZXZpY2UgbWFwIGZpbGUgKEBweHJlZntEZXZpY2UgbWFwfSksIHRoZSBncnViIHNoZWxsIGp1c3QKK2lnbm9yZXMgdGhpcyBvcHRpb24uCisKK0BpdGVtIC0tY29uZmlnLWZpbGU9QHZhcntmaWxlfQorUmVhZCB0aGUgY29uZmlndXJhdGlvbiBmaWxlIEB2YXJ7ZmlsZX0gaW5zdGVhZCBvZgorQGZpbGV7L2Jvb3QvZ3J1Yi9tZW51LmxzdH0uIFRoZSBmb3JtYXQgaXMgdGhlIHNhbWUgYXMgdGhlIG5vcm1hbCBHUlVCCitzeW50YXguIFNlZSBAcmVme0ZpbGVzeXN0ZW19LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworQGl0ZW0gLS1ib290LWRyaXZlPUB2YXJ7ZHJpdmV9CitTZXQgdGhlIHN0YWdlMiBAdmFye2Jvb3RfZHJpdmV9IHRvIEB2YXJ7ZHJpdmV9LiBUaGlzIGFyZ3VtZW50IHNob3VsZCBiZQorYW4gaW50ZWdlciAoZGVjaW1hbCwgb2N0YWwgb3IgaGV4YWRlY2ltYWwpLgorCitAaXRlbSAtLWluc3RhbGwtcGFydGl0aW9uPUB2YXJ7cGFyfQorU2V0IHRoZSBzdGFnZTIgQHZhcntpbnN0YWxsX3BhcnRpdGlvbn0gdG8gQHZhcntwYXJ9LiBUaGlzIGFyZ3VtZW50CitzaG91bGQgYmUgYW4gaW50ZWdlciAoZGVjaW1hbCwgb2N0YWwgb3IgaGV4YWRlY2ltYWwpLgorCitAaXRlbSAtLW5vLWNvbmZpZy1maWxlCitEbyBub3QgdXNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgZXZlbiBpZiBpdCBjYW4gYmUgcmVhZC4KKworQGl0ZW0gLS1uby1jdXJzZXMKK0RvIG5vdCB1c2UgdGhlIHNjcmVlbiBoYW5kbGluZyBpbnRlcmZhY2UgYnkgdGhlIGN1cnNlcyBldmVuIGlmIGl0IGlzCithdmFpbGFibGUuCisKK0BpdGVtIC0tYmF0Y2gKK1RoaXMgb3B0aW9uIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIEBzYW1wey0tbm8tY29uZmlnLWZpbGUgLS1uby1jdXJzZXN9LgorCitAaXRlbSAtLXJlYWQtb25seQorRGlzYWJsZSB3cml0aW5nIHRvIGFueSBkaXNrLgorCitAaXRlbSAtLWhvbGQKK1dhaXQgdW50aWwgYSBkZWJ1Z2dlciB3aWxsIGF0dGFjaC4gVGhpcyBvcHRpb24gaXMgdXNlZnVsIHdoZW4geW91IHdhbnQKK3RvIGRlYnVnIHRoZSBzdGFydHVwIGNvZGUuCitAZW5kIHRhYmxlCisKKworQG5vZGUgSW5zdGFsbGF0aW9uIHVuZGVyIFVOSVgKK0BzZWN0aW9uIEhvdyB0byBpbnN0YWxsIEdSVUIgdmlhIEBjb21tYW5ke2dydWJ9CisKK1RoZSBpbnN0YWxsYXRpb24gcHJvY2VkdXJlIGlzIHRoZSBzYW1lIGFzIHVuZGVyIHRoZSBAZGZue25hdGl2ZX0gU3RhZ2UKKzIuIEB4cmVme0luc3RhbGxhdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLiBUaGUgY29tbWFuZAorQGNvbW1hbmR7Z3J1Yn0tc3BlY2lmaWMgaW5mb3JtYXRpb24gaXMgZGVzY3JpYmVkIGhlcmUuCisKK1doYXQgeW91IHNob3VsZCBiZSBjYXJlZnVsIGFib3V0IGlzIEBkZm57YnVmZmVyIGNhY2hlfS4gQGNvbW1hbmR7Z3J1Yn0KK21ha2VzIHVzZSBvZiByYXcgZGV2aWNlcyBpbnN0ZWFkIG9mIGZpbGVzeXN0ZW1zIHRoYXQgeW91ciBvcGVyYXRpbmcKK3N5c3RlbXMgc2VydmUsIHNvIHRoZXJlIGV4aXN0cyBhIHBvdGVudGlhbCBwcm9ibGVtIHRoYXQgc29tZSBjYWNoZQoraW5jb25zaXN0ZW5jeSBtYXkgY29ycnVwdCB5b3VyIGZpbGVzeXN0ZW1zLiBXaGF0IHdlIHJlY29tbWVuZCBpczoKKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK0lmIHlvdSBjYW4gdW5tb3VudCBkcml2ZXMgdG8gd2hpY2ggR1JVQiBtYXkgd3JpdGUgYW55IGFtb3VudCBvZiBkYXRhLAordW5tb3VudCB0aGVtIGJlZm9yZSBydW5uaW5nIEBjb21tYW5ke2dydWJ9LgorCitAaXRlbQorSWYgYSBkcml2ZSBjYW5ub3QgYmUgdW5tb3VudGVkIGJ1dCBjYW4gYmUgbW91bnRlZCB3aXRoIHRoZSByZWFkLW9ubHkKK2ZsYWcsIG1vdW50IGl0IGluIHJlYWQtb25seSBtb2RlLiBUaGF0IHNob3VsZCBiZSBzZWN1cmUuCisKK0BpdGVtCitJZiBhIGRyaXZlIG11c3QgYmUgbW91bnRlZCB3aXRoIHRoZSByZWFkLXdyaXRlIGZsYWcsIG1ha2Ugc3VyZSB0aGF0IG5vCithY3Rpdml0eSBpcyBiZWluZyBkb25lIG9uIGl0IHdoaWxlIHRoZSBjb21tYW5kIEBjb21tYW5ke2dydWJ9IGlzCitydW5uaW5nLgorCitAaXRlbQorUmVib290IHlvdXIgb3BlcmF0aW5nIHN5c3RlbSBhcyBzb29uIGFzIHBvc3NpYmxlLiBUaGlzIGlzIHByb2JhYmx5IG5vdAorcmVxdWlyZWQgaWYgeW91IGZvbGxvdyB0aGUgcnVsZXMgYWJvdmUsIGJ1dCByZWJvb3QgaXMgdGhlIG1vc3Qgc2VjdXJlCit3YXkuCitAZW5kIGl0ZW1pemUKKworSW4gYWRkaXRpb24sIGVudGVyIHRoZSBjb21tYW5kIEBjb21tYW5ke3F1aXR9IHdoZW4geW91IGZpbmlzaCB0aGUKK2luc3RhbGxhdGlvbi4gVGhhdCBpcyBAZW1waHt2ZXJ5IGltcG9ydGFudH0gYmVjYXVzZSBAY29tbWFuZHtxdWl0fSBtYWtlcwordGhlIGJ1ZmZlciBjYWNoZSBjb25zaXN0ZW50LiBEbyBub3QgcHVzaCBAa2V5e0MtY30uCisKK0lmIHlvdSB3YW50IHRvIGluc3RhbGwgR1JVQiBub24taW50ZXJhY3RpdmVseSwgc3BlY2lmeSBAc2FtcHstLWJhdGNofQorb3B0aW9uIGluIHRoZSBjb21tYW5kLWxpbmUuIFRoaXMgaXMgYSBzaW1wbGUgZXhhbXBsZToKKworQGV4YW1wbGUKK0Bncm91cAorIyEvYmluL3NoCisKKyMgVXNlIC91c3Ivc2Jpbi9ncnViIGlmIHlvdSBhcmUgb24gYW4gb2xkZXIgc3lzdGVtLgorL3NiaW4vZ3J1YiAtLWJhdGNoIDw8RU9UIDE+L2Rldi9udWxsIDI+L2Rldi9udWxsCityb290IChoZDAsMCkKK3NldHVwIChoZDApCitxdWl0CitFT1QKK0BlbmQgZ3JvdXAKK0BlbmQgZXhhbXBsZQorCisKK0Bub2RlIERldmljZSBtYXAKK0BzZWN0aW9uIFRoZSBtYXAgYmV0d2VlbiBCSU9TIGRyaXZlcyBhbmQgT1MgZGV2aWNlcworCitXaGVuIHlvdSBzcGVjaWZ5IHRoZSBvcHRpb24gQG9wdGlvbnstLWRldmljZS1tYXB9IChAcHhyZWZ7QmFzaWMgdXNhZ2V9KSwKK3RoZSBncnViIHNoZWxsIGNyZWF0ZXMgdGhlIEBkZm57ZGV2aWNlIG1hcCBmaWxlfSBhdXRvbWF0aWNhbGx5IHVubGVzcyBpdAorYWxyZWFkeSBleGlzdHMuIFRoZSBmaWxlIG5hbWUgQGZpbGV7L2Jvb3QvZ3J1Yi9kZXZpY2UubWFwfSBpcyBwcmVmZXJyZWQuCisKK0lmIHRoZSBkZXZpY2UgbWFwIGZpbGUgZXhpc3RzLCB0aGUgZ3J1YiBzaGVsbCByZWFkcyBpdCB0byBtYXAgQklPUworZHJpdmVzIHRvIE9TIGRldmljZXMuIFRoaXMgZmlsZSBjb25zaXN0cyBvZiBsaW5lcyBsaWtlIHRoaXM6CisKK0BleGFtcGxlCitAdmFye2RldmljZX0gQHZhcntmaWxlfQorQGVuZCBleGFtcGxlCisKK0B2YXJ7ZGV2aWNlfSBpcyBhIGRyaXZlIHNwZWNpZmllZCBpbiB0aGUgR1JVQiBzeW50YXggKEBweHJlZntEZXZpY2UKK3N5bnRheH0pLCBhbmQgQHZhcntmaWxlfSBpcyBhbiBPUyBmaWxlLCB3aGljaCBpcyBub3JtYWxseSBhIGRldmljZQorZmlsZS4KKworVGhlIHJlYXNvbiB3aHkgdGhlIGdydWIgc2hlbGwgZ2l2ZXMgeW91IHRoZSBkZXZpY2UgbWFwIGZpbGUgaXMgdGhhdCBpdAorY2Fubm90IGd1ZXNzIHRoZSBtYXAgYmV0d2VlbiBCSU9TIGRyaXZlcyBhbmQgT1MgZGV2aWNlcyBjb3JyZWN0bHkgaW4KK3NvbWUgZW52aXJvbm1lbnRzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGV4Y2hhbmdlIHRoZSBib290IHNlcXVlbmNlCitiZXR3ZWVuIElERSBhbmQgU0NTSSBpbiB5b3VyIEJJT1MsIGl0IGdldHMgdGhlIG9yZGVyIHdyb25nLgorCitUaHVzLCBlZGl0IHRoZSBmaWxlIGlmIHRoZSBncnViIHNoZWxsIG1ha2VzIGEgbWlzdGFrZS4gWW91IGNhbiBwdXQgYW55Citjb21tZW50cyBpbiB0aGUgZmlsZSBpZiBuZWVkZWQsIGFzIHRoZSBncnViIHNoZWxsIGFzc3VtZXMgdGhhdCBhIGxpbmUgaXMKK2p1c3QgYSBjb21tZW50IGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgQHNhbXB7I30uCisKKworQG5vZGUgSW52b2tpbmcgZ3J1Yi1pbnN0YWxsCitAY2hhcHRlciBJbnZva2luZyBncnViLWluc3RhbGwKKworVGhlIHByb2dyYW0gQGNvbW1hbmR7Z3J1Yi1pbnN0YWxsfSBpbnN0YWxscyBHUlVCIG9uIHlvdXIgZHJpdmUgdXNpbmcgdGhlCitncnViIHNoZWxsIChAcHhyZWZ7SW52b2tpbmcgdGhlIGdydWIgc2hlbGx9KS4gWW91IG11c3Qgc3BlY2lmeSB0aGUKK2RldmljZSBuYW1lIG9uIHdoaWNoIHlvdSB3YW50IHRvIGluc3RhbGwgR1JVQiwgbGlrZSB0aGlzOgorCitAZXhhbXBsZQorZ3J1Yi1pbnN0YWxsIEB2YXJ7aW5zdGFsbF9kZXZpY2V9CitAZW5kIGV4YW1wbGUKKworVGhlIGRldmljZSBuYW1lIEB2YXJ7aW5zdGFsbF9kZXZpY2V9IGlzIGFuIE9TIGRldmljZSBuYW1lIG9yIGEgR1JVQgorZGV2aWNlIG5hbWUuCisKK0Bjb21tYW5ke2dydWItaW5zdGFsbH0gYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSAtLWhlbHAKK1ByaW50IGEgc3VtbWFyeSBvZiB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMgYW5kIGV4aXQuCisKK0BpdGVtIC0tdmVyc2lvbgorUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIEdSVUIgYW5kIGV4aXQuCisKK0BpdGVtIC0tZm9yY2UtbGJhCitGb3JjZSBHUlVCIHRvIHVzZSBMQkEgbW9kZSBldmVuIGZvciBhIGJ1Z2d5IEJJT1MuIFVzZSB0aGlzIG9wdGlvbiBvbmx5CitpZiB5b3VyIEJJT1MgZG9lc24ndCB3b3JrIHByb3Blcmx5IGluIExCQSBtb2RlIGV2ZW4gdGhvdWdoIGl0IHN1cHBvcnRzCitMQkEgbW9kZS4KKworQGl0ZW0gLS1yb290LWRpcmVjdG9yeT1AdmFye2Rpcn0KK0luc3RhbGwgR1JVQiBpbWFnZXMgdW5kZXIgdGhlIGRpcmVjdG9yeSBAdmFye2Rpcn0gaW5zdGVhZCBvZiB0aGUgcm9vdAorZGlyZWN0b3J5LiBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBpbnN0YWxsIEdSVUIgaW50byBhCitzZXBhcmF0ZSBwYXJ0aXRpb24gb3IgYSByZW1vdmFibGUgZGlzay4gSGVyZSBpcyBhbiBleGFtcGxlIGluIHdoaWNoCit5b3UgaGF2ZSBhIHNlcGFyYXRlIEBkZm57Ym9vdH0gcGFydGl0aW9uIHdoaWNoIGlzIG1vdW50ZWQgb24KK0BmaWxley9ib290fToKKworQGV4YW1wbGUKK0BrYmR7Z3J1Yi1pbnN0YWxsIC0tcm9vdC1kaXJlY3Rvcnk9L2Jvb3QgaGQwfQorQGVuZCBleGFtcGxlCisKK0BpdGVtIC0tZ3J1Yi1zaGVsbD1AdmFye2ZpbGV9CitVc2UgQHZhcntmaWxlfSBhcyB0aGUgZ3J1YiBzaGVsbC4gWW91IGNhbiBhcHBlbmQgYXJiaXRyYXJ5IG9wdGlvbnMgdG8KK0B2YXJ7ZmlsZX0gYWZ0ZXIgdGhlIGZpbGUgbmFtZSwgbGlrZSB0aGlzOgorCitAZXhhbXBsZQorQGtiZHtncnViLWluc3RhbGwgLS1ncnViLXNoZWxsPSJncnViIC0tcmVhZC1vbmx5IiAvZGV2L2ZkMH0KK0BlbmQgZXhhbXBsZQorCitAaXRlbSAtLXJlY2hlY2sKK1JlY2hlY2sgdGhlIGRldmljZSBtYXAsIGV2ZW4gaWYgQGZpbGV7L2Jvb3QvZ3J1Yi9kZXZpY2UubWFwfSBhbHJlYWR5CitleGlzdHMuIFlvdSBzaG91bGQgdXNlIHRoaXMgb3B0aW9uIHdoZW5ldmVyIHlvdSBhZGQvcmVtb3ZlIGEgZGlzaworaW50by9mcm9tIHlvdXIgY29tcHV0ZXIuCitAZW5kIHRhYmxlCisKKworQG5vZGUgSW52b2tpbmcgZ3J1Yi1tZDUtY3J5cHQKK0BjaGFwdGVyIEludm9raW5nIGdydWItbWQ1LWNyeXB0CisKK1RoZSBwcm9ncmFtIEBjb21tYW5ke2dydWItbWQ1LWNyeXB0fSBlbmNyeXB0cyBhIHBhc3N3b3JkIGluIE1ENSBmb3JtYXQuCitUaGlzIGlzIGp1c3QgYSBmcm9udGVuZCBvZiB0aGUgZ3J1YiBzaGVsbCAoQHB4cmVme0ludm9raW5nIHRoZSBncnViCitzaGVsbH0pLiBQYXNzd29yZHMgZW5jcnlwdGVkIGJ5IHRoaXMgcHJvZ3JhbSBjYW4gYmUgdXNlZCB3aXRoIHRoZQorY29tbWFuZCBAY29tbWFuZHtwYXNzd29yZH0gKEBweHJlZntwYXNzd29yZH0pLgorCitAY29tbWFuZHtncnViLW1kNS1jcnlwdH0gYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSAtLWhlbHAKK1ByaW50IGEgc3VtbWFyeSBvZiB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMgYW5kIGV4aXQuCisKK0BpdGVtIC0tdmVyc2lvbgorUHJpbnQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQuCisKK0BpdGVtIC0tZ3J1Yi1zaGVsbD1AdmFye2ZpbGV9CitVc2UgQHZhcntmaWxlfSBhcyB0aGUgZ3J1YiBzaGVsbC4KK0BlbmQgdGFibGUKKworCitAbm9kZSBJbnZva2luZyBncnViLXRlcm1pbmZvCitAY2hhcHRlciBJbnZva2luZyBncnViLXRlcm1pbmZvCisKK1RoZSBwcm9ncmFtIEBjb21tYW5ke2dydWItdGVybWluZm99IGdlbmVyYXRlcyBhIHRlcm1pbmZvIGNvbW1hbmQgZnJvbQorYSB0ZXJtaW5mbyBuYW1lIChAcHhyZWZ7dGVybWluZm99KS4gVGhlIHJlc3VsdCBjYW4gYmUgdXNlZCBpbiB0aGUKK2NvbmZpZ3VyYXRpb24gZmlsZSwgdG8gZGVmaW5lIGVzY2FwZSBzZXF1ZW5jZXMuIEJlY2F1c2UgR1JVQiBhc3N1bWVzCit0aGF0IHlvdXIgdGVybWluYWwgaXMgdnQxMDAtY29tcGF0aWJsZSBieSBkZWZhdWx0LCB0aGlzIHdvdWxkIGJlCit1c2VmdWwgb25seSBpZiB5b3VyIHRlcm1pbmFsIGlzIHVuY29tbW9uIChzdWNoIGFzIHZ0NTIpLgorCitAY29tbWFuZHtncnViLXRlcm1pbmZvfSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIC0taGVscAorUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucyBhbmQgZXhpdC4KKworQGl0ZW0gLS12ZXJzaW9uCitQcmludCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdC4KK0BlbmQgdGFibGUKKworWW91IG11c3Qgc3BlY2lmeSBvbmUgYXJndW1lbnQgdG8gdGhpcyBjb21tYW5kLiBGb3IgZXhhbXBsZToKKworQGV4YW1wbGUKK0BrYmR7Z3J1Yi10ZXJtaW5mbyB2dDUyfQorQGVuZCBleGFtcGxlCisKKworQG5vZGUgSW52b2tpbmcgZ3J1Yi1zZXQtZGVmYXVsdAorQGNoYXB0ZXIgSW52b2tpbmcgZ3J1Yi1zZXQtZGVmYXVsdAorCitUaGUgcHJvZ3JhbSBAY29tbWFuZHtncnViLXNldC1kZWZhdWx0fSBzZXRzIHRoZSBkZWZhdWx0IGJvb3QgZW50cnkgZm9yCitHUlVCLiBUaGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhIGZpbGUgbmFtZWQgQGZpbGV7ZGVmYXVsdH0gdW5kZXIKK3lvdXIgR1JVQiBkaXJlY3RvcnkgKGkuZS4gQGZpbGV7L2Jvb3QvZ3J1Yn0pLCBpZiBpdCBpcyBub3QKK3ByZXNlbnQuIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgZGVmYXVsdCBib290IGVudHJ5IHdoZW4KK0dSVUIgYm9vdHMgdXAgeW91ciBzeXN0ZW0gd2hlbiB5b3UgdXNlIEBzYW1we2RlZmF1bHQgc2F2ZWR9IGluIHlvdXIKK2NvbmZpZ3VyYXRpb24gZmlsZSAoQHB4cmVme2RlZmF1bHR9KSwgYW5kIHRvIHNhdmUgbmV4dCBkZWZhdWx0IGJvb3QKK2VudHJ5IHdoZW4geW91IHVzZSBAc2FtcHtzYXZlZGVmYXVsdH0gaW4gYSBib290IGVudHJ5CisoQHB4cmVme3NhdmVkZWZhdWx0fSkuCisKK0Bjb21tYW5ke2dydWItc2V0LWRlZmF1bHR9IGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gLS1oZWxwCitQcmludCBhIHN1bW1hcnkgb2YgdGhlIGNvbW1hbmQtbGluZSBvcHRpb25zIGFuZCBleGl0LgorCitAaXRlbSAtLXZlcnNpb24KK1ByaW50IHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0LgorCitAaXRlbSAtLXJvb3QtZGlyZWN0b3J5PUB2YXJ7ZGlyfQorVXNlIHRoZSBkaXJlY3RvcnkgQHZhcntkaXJ9IGluc3RlYWQgb2YgdGhlIHJvb3QgZGlyZWN0b3J5CisoaS5lLiBAZmlsZXsvfSkgdG8gZGVmaW5lIHRoZSBsb2NhdGlvbiBvZiB0aGUgZGVmYXVsdCBmaWxlLiBUaGlzCitpcyB1c2VmdWwgd2hlbiB5b3UgbW91bnQgYSBkaXNrIHdoaWNoIGlzIHVzZWQgZm9yIGFub3RoZXIgc3lzdGVtLgorQGVuZCB0YWJsZQorCitZb3UgbXVzdCBzcGVjaWZ5IGEgc2luZ2xlIGFyZ3VtZW50IHRvIEBjb21tYW5ke2dydWItc2V0LWRlZmF1bHR9LiBUaGlzCithcmd1bWVudCBpcyBub3JtYWxseSB0aGUgbnVtYmVyIG9mIGEgZGVmYXVsdCBib290IGVudHJ5LiBGb3IgZXhhbXBsZSwKK2lmIHlvdSBoYXZlIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlOgorCitAZXhhbXBsZQorQGdyb3VwCitkZWZhdWx0IHNhdmVkCit0aW1lb3V0IDEwCisKK3RpdGxlIEdOVS9IdXJkCityb290IChoZDAsMCkKKy4uLgorCit0aXRsZSBHTlUvTGludXgKK3Jvb3QgKGhkMCwxKQorLi4uCitAZW5kIGdyb3VwCitAZW5kIGV4YW1wbGUKKworYW5kIGlmIHlvdSB3YW50IHRvIHNldCB0aGUgbmV4dCBkZWZhdWx0IGJvb3QgZW50cnkgdG8gR05VL0xpbnV4LCB5b3UKK21heSBleGVjdXRlIHRoaXMgY29tbWFuZDoKKworQGV4YW1wbGUKK0BrYmR7Z3J1Yi1zZXQtZGVmYXVsdCAxfQorQGVuZCBleGFtcGxlCisKK0JlY2F1c2UgdGhlIGVudHJ5IGZvciBHTlUvTGludXggaXMgQHNhbXB7MX0uIE5vdGUgdGhhdCBlbnRyaWVzIGFyZQorY291bnRlZCBmcm9tIHplcm8uIFNvLCBpZiB5b3Ugd2FudCB0byBzcGVjaWZ5IEdOVS9IdXJkIGhlcmUsIHRoZW4geW91CitzaG91bGQgc3BlY2lmeSBAc2FtcHswfS4KKworVGhpcyBmZWF0dXJlIGlzIHZlcnkgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHRlc3QgYSBuZXcga2VybmVsIG9yIHRvCittYWtlIHlvdXIgc3lzdGVtIHF1aXRlIHJvYnVzdC4gQHhyZWZ7TWFraW5nIHlvdXIgc3lzdGVtIHJvYnVzdH0sIGZvcgorbW9yZSBoaW50cyBhYm91dCBob3cgdG8gc2V0IHVwIGEgcm9idXN0IHN5c3RlbS4KKworCitAbm9kZSBJbnZva2luZyBtYmNoaworQGNoYXB0ZXIgSW52b2tpbmcgbWJjaGsKKworVGhlIHByb2dyYW0gQGNvbW1hbmR7bWJjaGt9IGNoZWNrcyBmb3IgdGhlIGZvcm1hdCBvZiBhIE11bHRpYm9vdAora2VybmVsLiBXZSByZWNvbW1lbmQgdXNpbmcgdGhpcyBwcm9ncmFtIGJlZm9yZSBib290aW5nIHlvdXIgb3duIGtlcm5lbAorYnkgR1JVQi4KKworQGNvbW1hbmR7bWJjaGt9IGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gLS1oZWxwCitQcmludCBhIHN1bW1hcnkgb2YgdGhlIGNvbW1hbmQtbGluZSBvcHRpb25zIGFuZCBleGl0LgorCitAaXRlbSAtLXZlcnNpb24KK1ByaW50IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBHUlVCIGFuZCBleGl0LgorCitAaXRlbSAtLXF1aWV0CitTdXBwcmVzcyBhbGwgbm9ybWFsIG91dHB1dC4KK0BlbmQgdGFibGUKKworCitAbm9kZSBPYnRhaW5pbmcgYW5kIEJ1aWxkaW5nIEdSVUIKK0BhcHBlbmRpeCBIb3cgdG8gb2J0YWluIGFuZCBidWlsZCBHUlVCCisKK0BxdW90YXRpb24KK0BzdHJvbmd7Q2F1dGlvbjp9IEdSVUIgcmVxdWlyZXMgYmludXRpbHMtMi45LjEuMC4yMyBvciBsYXRlciBiZWNhdXNlIHRoZQorR05VIGFzc2VtYmxlciBoYXMgYmVlbiBjaGFuZ2VkIHNvIHRoYXQgaXQgY2FuIHByb2R1Y2UgcmVhbCAxNmJpdHMKK21hY2hpbmUgY29kZSBiZXR3ZWVuIDIuOS4xIGFuZCAyLjkuMS4wLnguIFNlZQorQHVyZWZ7aHR0cDovL3NvdXJjZXMucmVkaGF0LmNvbS9iaW51dGlscy99LCB0byBvYnRhaW4gaW5mb3JtYXRpb24gb24KK2hvdyB0byBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uLgorQGVuZCBxdW90YXRpb24KKworR1JVQiBpcyBhdmFpbGFibGUgZnJvbSB0aGUgR05VIGFscGhhIGFyY2hpdmUgc2l0ZQorQHVyZWZ7ZnRwOi8vYWxwaGEuZ251Lm9yZy9nbnUvZ3J1Yn0gb3IgYW55IG9mIGl0cyBtaXJyb3JzLiBUaGUgZmlsZQord2lsbCBiZSBuYW1lZCBncnViLXZlcnNpb24udGFyLmd6LiBUaGUgY3VycmVudCB2ZXJzaW9uIGlzCitAdmFsdWV7VkVSU0lPTn0sIHNvIHRoZSBmaWxlIHlvdSBzaG91bGQgZ3JhYiBpczoKKworQHVyZWZ7ZnRwOi8vYWxwaGEuZ251Lm9yZy9nbnUvZ3J1Yi9ncnViLUB2YWx1ZXtWRVJTSU9OfS50YXIuZ3p9CisKK1RvIHVuYnVuZGxlIEdSVUIgdXNlIHRoZSBpbnN0cnVjdGlvbjoKKworQGV4YW1wbGUKK0BrYmR7emNhdCBncnViLUB2YWx1ZXtWRVJTSU9OfS50YXIuZ3ogfCB0YXIgeHZmIC19CitAZW5kIGV4YW1wbGUKKword2hpY2ggd2lsbCBjcmVhdGUgYSBkaXJlY3RvcnkgY2FsbGVkIEBmaWxle2dydWItQHZhbHVle1ZFUlNJT059fSB3aXRoCithbGwgdGhlIHNvdXJjZXMuIFlvdSBjYW4gbG9vayBhdCB0aGUgZmlsZSBAZmlsZXtJTlNUQUxMfSBmb3IgZGV0YWlsZWQKK2luc3RydWN0aW9ucyBvbiBob3cgdG8gYnVpbGQgYW5kIGluc3RhbGwgR1JVQiwgYnV0IHlvdSBzaG91bGQgYmUgYWJsZSB0bworanVzdCBkbzoKKworQGV4YW1wbGUKK0Bncm91cAorQGtiZHtjZCBncnViLUB2YWx1ZXtWRVJTSU9OfX0KK0BrYmR7Li9jb25maWd1cmV9CitAa2Jke21ha2UgaW5zdGFsbH0KK0BlbmQgZ3JvdXAKK0BlbmQgZXhhbXBsZQorCitUaGlzIHdpbGwgaW5zdGFsbCB0aGUgZ3J1YiBzaGVsbCBAZmlsZXtncnVifSAoQHB4cmVme0ludm9raW5nIHRoZSBncnViCitzaGVsbH0pLCB0aGUgTXVsdGlib290IGNoZWNrZXIgQGZpbGV7bWJjaGt9IChAcHhyZWZ7SW52b2tpbmcgbWJjaGt9KSwKK2FuZCB0aGUgR1JVQiBpbWFnZXMuIFRoaXMgd2lsbCBhbHNvIGluc3RhbGwgdGhlIEdSVUIgbWFudWFsLgorCitBbHNvLCB0aGUgbGF0ZXN0IHZlcnNpb24gaXMgYXZhaWxhYmxlIGZyb20gdGhlIENWUy4gU2VlCitAdXJlZntodHRwOi8vc2F2YW5uYWguZ251Lm9yZy9jdnMvP2dyb3VwPWdydWJ9IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisKK0Bub2RlIFJlcG9ydGluZyBidWdzCitAYXBwZW5kaXggUmVwb3J0aW5nIGJ1Z3MKKworVGhlc2UgYXJlIHRoZSBndWlkZWxpbmUgZm9yIGhvdyB0byByZXBvcnQgYnVncy4gVGFrZSBhIGxvb2sgYXQgdGhpcworbGlzdCBiZWxvdyBiZWZvcmUgeW91IHN1Ym1pdCBidWdzOgorCitAZW51bWVyYXRlCitAaXRlbQorQmVmb3JlIGdldHRpbmcgdW5zZXR0bGVkLCByZWFkIHRoaXMgbWFudWFsIHRocm91Z2ggYW5kIHRocm91Z2guIEFsc28sCitzZWUgdGhlIEB1cmVme2h0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9ncnViL2dydWItZmFxLmh0bWwsIEdOVSBHUlVCIEZBUX0uCisKK0BpdGVtCitBbHdheXMgbWVudGlvbiB0aGUgaW5mb3JtYXRpb24gb24geW91ciBHUlVCLiBUaGUgdmVyc2lvbiBudW1iZXIgYW5kIHRoZQorY29uZmlndXJhdGlvbiBhcmUgcXVpdGUgaW1wb3J0YW50LiBJZiB5b3UgYnVpbGQgaXQgeW91cnNlbGYsIHdyaXRlIHRoZQorb3B0aW9ucyBzcGVjaWZpZWQgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSwKK2luY2x1ZGluZyB0aGUgdmVyc2lvbnMgb2YgZ2NjIGFuZCBiaW51dGlscy4KKworQGl0ZW0KK0lmIHlvdSBoYXZlIHRyb3VibGUgd2l0aCB0aGUgaW5zdGFsbGF0aW9uLCBpbmZvcm0gdXMgb2YgaG93IHlvdQoraW5zdGFsbGVkIEdSVUIuIERvbid0IG9taXQgZXJyb3IgbWVzc2FnZXMsIGlmIGFueS4gSnVzdCBAc2FtcHtHUlVCIGhhbmdzCit1cCB3aGVuIGl0IGJvb3RzfSBpcyBub3QgZW5vdWdoLgorCitUaGUgaW5mb3JtYXRpb24gb24geW91ciBoYXJkd2FyZSBpcyBhbHNvIGVzc2VudGlhbC4gVGhlc2UgYXJlIGVzcGVjaWFsbHkKK2ltcG9ydGFudDogdGhlIGdlb21ldHJpZXMgYW5kIHRoZSBwYXJ0aXRpb24gdGFibGVzIG9mIHlvdXIgaGFyZCBkaXNrCitkcml2ZXMgYW5kIHlvdXIgQklPUy4KKworQGl0ZW0KK0lmIEdSVUIgY2Fubm90IGJvb3QgeW91ciBvcGVyYXRpbmcgc3lzdGVtLCB3cml0ZSBkb3duCitAZW1waHtldmVyeXRoaW5nfSB5b3Ugc2VlIG9uIHRoZSBzY3JlZW4uIERvbid0IHBhcmFwaHJhc2UgdGhlbSwgbGlrZQorQHNhbXB7VGhlIGZvbyBPUyBjcmFzaGVzIHdpdGggR1JVQiwgZXZlbiB0aG91Z2ggaXQgY2FuIGJvb3Qgd2l0aCB0aGUKK2JhciBib290IGxvYWRlciBqdXN0IGZpbmV9LiBNZW50aW9uIHRoZSBjb21tYW5kcyB5b3UgZXhlY3V0ZWQsIHRoZQorbWVzc2FnZXMgcHJpbnRlZCBieSB0aGVtLCBhbmQgaW5mb3JtYXRpb24gb24geW91ciBvcGVyYXRpbmcgc3lzdGVtCitpbmNsdWRpbmcgdGhlIHZlcnNpb24gbnVtYmVyLgorCitAaXRlbQorRXhwbGFpbiB3aGF0IHlvdSB3YW50ZWQgdG8gZG8uIEl0IGlzIHZlcnkgdXNlZnVsIHRvIGtub3cgeW91ciBwdXJwb3NlCithbmQgeW91ciB3aXNoLCBhbmQgaG93IEdSVUIgZGlkbid0IHNhdGlzZnkgeW91LgorCitAaXRlbQorSWYgeW91IGNhbiBpbnZlc3RpZ2F0ZSB0aGUgcHJvYmxlbSB5b3Vyc2VsZiwgcGxlYXNlIGRvLiBUaGF0IHdpbGwgZ2l2ZQoreW91IGFuZCB1cyBtdWNoIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHByb2JsZW0uIEF0dGFjaGluZyBhIHBhdGNoIGlzCitldmVuIGJldHRlci4KKworV2hlbiB5b3UgYXR0YWNoIGEgcGF0Y2gsIG1ha2UgdGhlIHBhdGNoIGluIHVuaWZpZWQgZGlmZiBmb3JtYXQsIGFuZAord3JpdGUgQ2hhbmdlTG9nIGVudHJpZXMuIEJ1dCwgZXZlbiB3aGVuIHlvdSBtYWtlIGEgcGF0Y2gsIGRvbid0IGZvcmdldAordG8gZXhwbGFpbiB0aGUgcHJvYmxlbSwgc28gdGhhdCB3ZSBjYW4gdW5kZXJzdGFuZCB3aGF0IHlvdXIgcGF0Y2ggaXMKK2Zvci4KKworQGl0ZW0KK1dyaXRlIGRvd24gYW55dGhpbmcgdGhhdCB5b3UgdGhpbmsgbWlnaHQgYmUgcmVsYXRlZC4gUGxlYXNlIHVuZGVyc3RhbmQKK3RoYXQgd2Ugb2Z0ZW4gbmVlZCB0byByZXByb2R1Y2UgdGhlIHNhbWUgcHJvYmxlbSB5b3UgZW5jb3VudGVycmVkIGluIG91cgorZW52aXJvbm1lbnQuIFNvIHlvdXIgaW5mb3JtYXRpb24gc2hvdWxkIGJlIHN1ZmZpY2llbnQgZm9yIHVzIHRvIGRvIHRoZQorc2FtZSB0aGluZy0tLURvbid0IGZvcmdldCB0aGF0IHdlIGNhbm5vdCBzZWUgeW91ciBjb21wdXRlciBkaXJlY3RseS4gSWYKK3lvdSBhcmUgbm90IHN1cmUgd2hldGhlciB0byBzdGF0ZSBhIGZhY3Qgb3IgbGVhdmUgaXQgb3V0LCBzdGF0ZSBpdCEKK1JlcG9ydGluZyB0b28gbWFueSB0aGluZ3MgaXMgbXVjaCBiZXR0ZXIgdGhhbiBvbWl0dGluZyBzb21ldGhpbmcKK2ltcG9ydGFudC4KK0BlbmQgZW51bWVyYXRlCisKK0lmIHlvdSBmb2xsb3cgdGhlIGd1aWRlbGluZSBhYm92ZSwgc3VibWl0IGEgcmVwb3J0IHRvIHRoZQorQHVyZWZ7aHR0cDovL3NhdmFubmFoLmdudS5vcmcvYnVncy8/Z3JvdXA9Z3J1YiwgQnVnIFRyYWNraW5nIFN5c3RlbX0uCitBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHN1Ym1pdCBhIHJlcG9ydCB2aWEgZWxlY3Ryb25pYyBtYWlsIHRvCitAZW1haWx7YnVnLWdydWJAQGdudS5vcmd9LCBidXQgd2Ugc3Ryb25nbHkgcmVjb21tZW5kIHRoYXQgeW91IHVzZSB0aGUKK0J1ZyBUcmFja2luZyBTeXN0ZW0sIGJlY2F1c2UgZS1tYWlsIGNhbiBiZSBwYXNzZWQgb3ZlciBlYXNpbHkuCisKK09uY2Ugd2UgZ2V0IHlvdXIgcmVwb3J0LCB3ZSB3aWxsIHRyeSB0byBmaXggdGhlIGJ1Z3MuCisKKworQG5vZGUgRnV0dXJlCitAYXBwZW5kaXggV2hlcmUgR1JVQiB3aWxsIGdvCisKK1dlIHN0YXJ0ZWQgdGhlIG5leHQgZ2VuZXJhdGlvbiBvZiBHUlVCLCBHUlVCIDIuIFRoaXMgd2lsbCBpbmNsdWRlCitpbnRlcm5hdGlvbmFsaXphdGlvbiwgZHluYW1pYyBtb2R1bGUgbG9hZGluZywgcmVhbCBtZW1vcnkgbWFuYWdlbWVudCwKK211bHRpcGxlIGFyY2hpdGVjdHVyZSBzdXBwb3J0LCBhIHNjcmlwdGluZyBsYW5ndWFnZSwgYW5kIG1hbnkgb3RoZXIKK25pY2UgZmVhdHVyZS4gSWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIHRoZSBkZXZlbG9wbWVudCBvZiBHUlVCIDIsIHRha2UKK2EgbG9vayBhdCBAdXJlZntodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ3J1Yi9ncnViLmh0bWwsIHRoZQoraG9tZXBhZ2V9LgorCisKK0BjIFNlcGFyYXRlIHRoZSBwcm9ncmFtbWluZyBndWlkZS4KK0BpbmNsdWRlIGludGVybmFscy50ZXhpCisKKworQG5vZGUgSW5kZXgKK0B1bm51bWJlcmVkIEluZGV4CisKK0BjIEN1cnJlbnRseSwgd2UgdXNlIG9ubHkgdGhlIENvbmNlcHQgSW5kZXguCitAcHJpbnRpbmRleCBjcAorCisKK0BieWUKKworU29tZSBub3RlczoKKworICBUaGlzIGlzIHRoZSBzZWNvbmQgYXR0ZW1wdCB0byByZXdyaXRlIHRoZSBtYW51YWwuIFRoZSBzdGF0dXMgaXMKK21vc3RseSBjb21wbGV0ZSwgYnV0IEkgbmVlZCB0byBjaGVjayB0aGUgc3BlbGxpbmcgYnkgaXNwZWxsLCBhbmQgYWRkCittb3JlIGluZGljZXMuIFBlcmhhcHMgSSBhbHNvIGhhdmUgdG8gbGV0IHNvbWUgRW5nbGlzaCBuYXRpdmUgc3BlYWtlcnMKK3Byb29mcmVhZCB0aGlzIG1hbnVhbCB0aHJvdWdoLiBNeSBFbmdsaXNoIGlzIHN5bnRhY3RpY2FsbHkgYWxtb3N0CitwZXJmZWN0LCBidXQgc29tZXRpbWVzIChvZnRlbj8pIGF3ZnVsIGluIHRoZSBudWFuY2UuIEhlaGUsIEkgY2FuJ3QgYmUgYW4KK0VuZ2xpc2ggcG9ldCBmb3Igbm93LgpkaWZmIC0tZ2l0IGEvZG9jcy9oZWxwMm1hbiBiL2RvY3MvaGVscDJtYW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTA2ZmNiOAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaGVscDJtYW4KQEAgLTAsMCArMSw1MTcgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCisjIEdlbmVyYXRlIGEgc2hvcnQgbWFuIHBhZ2UgZnJvbSAtLWhlbHAgYW5kIC0tdmVyc2lvbiBvdXRwdXQuCisjIENvcHlyaWdodCCpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyMgV3JpdHRlbiBieSBCcmVuZGFuIE8nRGVhIDxib2RAY29tcHVzb2wuY29tLmF1PgorIyBBdmFpbGFibGUgZnJvbSBmdHA6Ly9mdHAuZ251Lm9yZy9nbnUvaGVscDJtYW4vCisKK3VzZSA1LjAwNDsKK3VzZSBzdHJpY3Q7Cit1c2UgR2V0b3B0OjpMb25nOwordXNlIFRleHQ6OlRhYnMgcXcoZXhwYW5kKTsKK3VzZSBQT1NJWCBxdyhzdHJmdGltZSBzZXRsb2NhbGUgTENfVElNRSk7CisKK215ICR0aGlzX3Byb2dyYW0gPSAnaGVscDJtYW4nOworbXkgJHRoaXNfdmVyc2lvbiA9ICcxLjIzJzsKK215ICR2ZXJzaW9uX2luZm8gPSA8PEVPVDsKK0dOVSAkdGhpc19wcm9ncmFtICR0aGlzX3ZlcnNpb24KKworQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KK3dhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorCitXcml0dGVuIGJ5IEJyZW5kYW4gTydEZWEgPGJvZFxAY29tcHVzb2wuY29tLmF1PgorRU9UCisKK215ICRoZWxwX2luZm8gPSA8PEVPVDsKK2AkdGhpc19wcm9ncmFtJyBnZW5lcmF0ZXMgYSBtYW4gcGFnZSBvdXQgb2YgYC0taGVscCcgYW5kIGAtLXZlcnNpb24nIG91dHB1dC4KKworVXNhZ2U6ICR0aGlzX3Byb2dyYW0gW09QVElPTl0uLi4gRVhFQ1VUQUJMRQorCisgLW4sIC0tbmFtZT1TVFJJTkcgICAgICAgdXNlIGBTVFJJTkcnIGFzIHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIE5BTUUgcGFyYWdyYXBoCisgLXMsIC0tc2VjdGlvbj1TRUNUSU9OICAgdXNlIGBTRUNUSU9OJyBhcyB0aGUgc2VjdGlvbiBmb3IgdGhlIG1hbiBwYWdlCisgLWksIC0taW5jbHVkZT1GSUxFICAgICAgaW5jbHVkZSBtYXRlcmlhbCBmcm9tIGBGSUxFJworIC1JLCAtLW9wdC1pbmNsdWRlPUZJTEUgIGluY2x1ZGUgbWF0ZXJpYWwgZnJvbSBgRklMRScgaWYgaXQgZXhpc3RzCisgLW8sIC0tb3V0cHV0PUZJTEUgICAgICAgc2VuZCBvdXRwdXQgdG8gYEZJTEUnCisgLU4sIC0tbm8taW5mbyAgICAgICAgICAgc3VwcHJlc3MgcG9pbnRlciB0byBUZXhpbmZvIG1hbnVhbAorICAgICAtLWhlbHAgICAgICAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgICAgIC0tdmVyc2lvbiAgICAgICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorCitFWEVDVVRBQkxFIHNob3VsZCBhY2NlcHQgYC0taGVscCcgYW5kIGAtLXZlcnNpb24nIG9wdGlvbnMuCisKK1JlcG9ydCBidWdzIHRvIDxidWctaGVscDJtYW5cQGdudS5vcmc+LgorRU9UCisKK215ICRzZWN0aW9uID0gMTsKK215ICgkb3B0X25hbWUsIEBvcHRfaW5jbHVkZSwgJG9wdF9vdXRwdXQsICRvcHRfbm9faW5mbyk7CisKKyMgUGFyc2Ugb3B0aW9ucy4KK0dldG9wdDo6TG9uZzo6Y29uZmlnKCdidW5kbGluZycpOworR2V0T3B0aW9ucyAoCisgICAgJ258bmFtZT1zJwkJPT4gXCRvcHRfbmFtZSwKKyAgICAnc3xzZWN0aW9uPXMnCT0+IFwkc2VjdGlvbiwKKyAgICAnaXxpbmNsdWRlPXMnCT0+IHN1YiB7IHB1c2ggQG9wdF9pbmNsdWRlLCBbIHBvcCwgMSBdIH0sCisgICAgJ0l8b3B0LWluY2x1ZGU9cycJPT4gc3ViIHsgcHVzaCBAb3B0X2luY2x1ZGUsIFsgcG9wLCAwIF0gfSwKKyAgICAnb3xvdXRwdXQ9cycJPT4gXCRvcHRfb3V0cHV0LAorICAgICdOfG5vLWluZm8nCQk9PiBcJG9wdF9ub19pbmZvLAorICAgIGhlbHAJCT0+IHN1YiB7IHByaW50ICRoZWxwX2luZm87IGV4aXQgfSwKKyAgICB2ZXJzaW9uCQk9PiBzdWIgeyBwcmludCAkdmVyc2lvbl9pbmZvOyBleGl0IH0sCispIG9yIGRpZSAkaGVscF9pbmZvOworCitkaWUgJGhlbHBfaW5mbyB1bmxlc3MgQEFSR1YgPT0gMTsKKworbXkgJWluY2x1ZGUgPSAoKTsKK215ICVhcHBlbmQgPSAoKTsKK215IEBpbmNsdWRlID0gKCk7ICMgcmV0YWluIG9yZGVyIGdpdmVuIGluIGluY2x1ZGUgZmlsZQorCisjIFByb3ZpZGUgcmVwbGFjZW1lbnQgYHF1b3RlLXJlZ2V4JyBvcGVyYXRvciBmb3IgcHJlLTUuMDA1LgorQkVHSU4geyBldmFsIHEoc3ViIHFyIHsgJycgPX4gJF9bMF07ICRfWzBdIH0pIGlmICRdIDwgNS4wMDUgfQorCisjIFByb2Nlc3MgaW5jbHVkZSBmaWxlIChpZiBnaXZlbikuICBGb3JtYXQgaXM6CisjCisjICAgW3NlY3Rpb24gbmFtZV0KKyMgICB2ZXJiYXRpbSB0ZXh0CisjCisjIG9yCisjCisjICAgL3BhdHRlcm4vCisjICAgdmVyYmF0aW0gdGV4dAorIworCitmb3IgKEBvcHRfaW5jbHVkZSkKK3sKKyAgICBteSAoJGluYywgJHJlcXVpcmVkKSA9IEAkXzsKKworICAgIG5leHQgdW5sZXNzIC1mICRpbmMgb3IgJHJlcXVpcmVkOworICAgIGRpZSAiJHRoaXNfcHJvZ3JhbTogY2FuJ3Qgb3BlbiBgJGluYycgKCQhKVxuIgorCXVubGVzcyBvcGVuIElOQywgJGluYzsKKworICAgIG15ICRrZXk7CisgICAgbXkgJGhhc2ggPSBcJWluY2x1ZGU7CisKKyAgICB3aGlsZSAoPElOQz4pCisgICAgeworCSMgW3NlY3Rpb25dCisJaWYgKC9eXFsoW15dXSspXF0vKQorCXsKKwkgICAgJGtleSA9IHVjICQxOworCSAgICAka2V5ID1+IHMvXlxzKy8vOworCSAgICAka2V5ID1+IHMvXHMrJC8vOworCSAgICAkaGFzaCA9IFwlaW5jbHVkZTsKKwkgICAgcHVzaCBAaW5jbHVkZSwgJGtleSB1bmxlc3MgJGluY2x1ZGV7JGtleX07CisJICAgIG5leHQ7CisJfQorCisJIyAvcGF0dGVybi8KKwlpZiAobSFeLyguKikvKFtpbXNdKikhKQorCXsKKwkgICAgbXkgJHBhdCA9ICQyID8gIig/JDIpJDEiIDogJDE7CisKKwkgICAgIyBDaGVjayBwYXR0ZXJuLgorCSAgICBldmFsIHsgJGtleSA9IHFyKCRwYXQpIH07CisJICAgIGlmICgkQCkKKwkgICAgeworCQkkQCA9fiBzLyBhdCAuKj8gbGluZSBcZC4qLy87CisJCWRpZSAiJGluYzokLjokQCI7CisJICAgIH0KKworCSAgICAkaGFzaCA9IFwlYXBwZW5kOworCSAgICBuZXh0OworCX0KKworCSMgU2lsZW50bHkgaWdub3JlIGFueXRoaW5nIGJlZm9yZSB0aGUgZmlyc3QKKwkjIHNlY3Rpb24tLWFsbG93cyBmb3IgY29tbWVudHMgYW5kIHJldmlzaW9uIGluZm8uCisJbmV4dCB1bmxlc3MgJGtleTsKKworCSRoYXNoLT57JGtleX0gfHw9ICcnOworCSRoYXNoLT57JGtleX0gLj0gJF87CisgICAgfQorCisgICAgY2xvc2UgSU5DOworCisgICAgZGllICIkdGhpc19wcm9ncmFtOiBubyB2YWxpZCBpbmZvcm1hdGlvbiBmb3VuZCBpbiBgJGluYydcbiIKKwl1bmxlc3MgJGtleTsKK30KKworIyBDb21wcmVzcyB0cmFpbGluZyBibGFuayBsaW5lcy4KK2ZvciBteSAkaGFzaCAoXCglaW5jbHVkZSwgJWFwcGVuZCkpCit7CisgICAgZm9yIChrZXlzICUkaGFzaCkgeyAkaGFzaC0+eyRffSA9fiBzL1xuKyQvXG4vIH0KK30KKworIyBUdXJuIG9mZiBsb2NhbGlzYXRpb24gb2YgZXhlY3V0YWJsZSdzIG91cHV0LgorQEVOVntxdyhMQU5HVUFHRSBMQU5HIExDX0FMTCl9ID0gKCdDJykgeCAzOworCisjIFR1cm4gb2ZmIGxvY2FsaXNhdGlvbiBvZiBkYXRlIChmb3Igc3RyZnRpbWUpLgorc2V0bG9jYWxlIExDX1RJTUUsICdDJzsKKworIyBHcmFiIGhlbHAgYW5kIHZlcnNpb24gaW5mbyBmcm9tIGV4ZWN1dGFibGUuCitteSAoJGhlbHBfdGV4dCwgJHZlcnNpb25fdGV4dCkgPSBtYXAgeworICAgIGpvaW4gJycsIG1hcCB7IHMvICskLy87IGV4cGFuZCAkXyB9IGAkQVJHVlswXSAtLSRfIDI+L2Rldi9udWxsYAorCW9yIGRpZSAiJHRoaXNfcHJvZ3JhbTogY2FuJ3QgZ2V0IGAtLSRfJyBpbmZvIGZyb20gJEFSR1ZbMF1cbiIKK30gcXcoaGVscCB2ZXJzaW9uKTsKKworbXkgJGRhdGUgPSBzdHJmdGltZSAiJUIgJVkiLCBsb2NhbHRpbWU7CisobXkgJHByb2dyYW0gPSAkQVJHVlswXSkgPX4gcyEuKi8hITsKK215ICRwYWNrYWdlID0gJHByb2dyYW07CitteSAkdmVyc2lvbjsKKworaWYgKCRvcHRfb3V0cHV0KQoreworICAgIHVubGluayAkb3B0X291dHB1dAorCW9yIGRpZSAiJHRoaXNfcHJvZ3JhbTogY2FuJ3QgdW5saW5rICRvcHRfb3V0cHV0ICgkISlcbiIKKwlpZiAtZSAkb3B0X291dHB1dDsKKworICAgIG9wZW4gU1RET1VULCAiPiRvcHRfb3V0cHV0IgorCW9yIGRpZSAiJHRoaXNfcHJvZ3JhbTogY2FuJ3QgY3JlYXRlICRvcHRfb3V0cHV0ICgkISlcbiI7Cit9CisKKyMgVGhlIGZpcnN0IGxpbmUgb2YgdGhlIC0tdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyBhc3N1bWVkIHRvIGJlIGluIG9uZQorIyBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6CisjCisjICAgPHZlcnNpb24+CisjICAgPHByb2dyYW0+IDx2ZXJzaW9uPgorIyAgIHtHTlUsRnJlZX0gPHByb2dyYW0+IDx2ZXJzaW9uPgorIyAgIDxwcm9ncmFtPiAoe0dOVSxGcmVlfSA8cGFja2FnZT4pIDx2ZXJzaW9uPgorIyAgIDxwcm9ncmFtPiAtIHtHTlUsRnJlZX0gPHBhY2thZ2U+IDx2ZXJzaW9uPgorIworIyBhbmQgc2VwZXJhdGVkIGZyb20gYW55IGNvcHlyaWdodC9hdXRob3IgZGV0YWlscyBieSBhIGJsYW5rIGxpbmUuCisKKygkXywgJHZlcnNpb25fdGV4dCkgPSBzcGxpdCAvXG4rLywgJHZlcnNpb25fdGV4dCwgMjsKKworaWYgKC9eKFxTKykgK1woKCg/OkdOVXxGcmVlKSArW14pXSspXCkgKyguKikvIG9yCisgICAgL14oXFMrKSArLSAqKCg/OkdOVXxGcmVlKSArXFMrKSArKC4qKS8pCit7CisgICAgJHByb2dyYW0gPSAkMTsKKyAgICAkcGFja2FnZSA9ICQyOworICAgICR2ZXJzaW9uID0gJDM7Cit9CitlbHNpZiAoL14oKD86R05VfEZyZWUpICspPyhcUyspICsoLiopLykKK3sKKyAgICAkcHJvZ3JhbSA9ICQyOworICAgICRwYWNrYWdlID0gJDEgPyAiJDEkMiIgOiAkMjsKKyAgICAkdmVyc2lvbiA9ICQzOworfQorZWxzZQoreworICAgICR2ZXJzaW9uID0gJF87Cit9CisKKyRwcm9ncmFtID1+IHMhLiovISE7CisKKyMgTm8gaW5mbyBmb3IgYGluZm8nIGl0c2VsZi4KKyRvcHRfbm9faW5mbyA9IDEgaWYgJHByb2dyYW0gZXEgJ2luZm8nOworCisjIC0tbmFtZSBvdmVycmlkZXMgLS1pbmNsdWRlIGNvbnRlbnRzLgorJGluY2x1ZGV7TkFNRX0gPSAiJHByb2dyYW0gXFwtICRvcHRfbmFtZVxuIiBpZiAkb3B0X25hbWU7CisKKyMgRGVmYXVsdCAodXNlbGVzcykgTkFNRSBwYXJhZ3JhcGguCiskaW5jbHVkZXtOQU1FfSB8fD0gIiRwcm9ncmFtIFxcLSBtYW51YWwgcGFnZSBmb3IgJHByb2dyYW0gJHZlcnNpb25cbiI7CisKKyMgTWFuIHBhZ2VzIHRyYWRpdGlvbmFsbHkgaGF2ZSB0aGUgcGFnZSB0aXRsZSBpbiBjYXBzLgorbXkgJFBST0dSQU0gPSB1YyAkcHJvZ3JhbTsKKworIyBFeHRyYWN0IHVzYWdlIGNsYXVzZShzKSBbaWYgYW55XSBmb3IgU1lOT1BTSVMuCitpZiAoJGhlbHBfdGV4dCA9fiBzL15Vc2FnZTooICsoXFMrKSkoLiopKCg/OlxuKD86IHs2fVwxfCAqb3I6ICtcUykuKikqKS8vbSkKK3sKKyAgICBteSBAc3luID0gJDIgLiAkMzsKKworICAgIGlmICgkXyA9ICQ0KQorICAgIHsKKwlzL15cbi8vOworCWZvciAoc3BsaXQgL1xuLykgeyBzL14gKihvcjogKyk/Ly87IHB1c2ggQHN5biwgJF8gfQorICAgIH0KKworICAgIG15ICRzeW5vcHNpcyA9ICcnOworICAgIGZvciAoQHN5bikKKyAgICB7CisJJHN5bm9wc2lzIC49ICIuYnJcbiIgaWYgJHN5bm9wc2lzOworCXMhXlxTKi8hITsKKwlzL14oXFMrKSAqLy87CisJJHN5bm9wc2lzIC49ICIuQiAkMVxuIjsKKwlzL1xzKyQvLzsKKwlzLygoW11bXXxcLlwuKykrKS9cXGZSJDFcXGZJL2c7CisJcy9eL1xcZkkvIHVubGVzcyBzL15cXGZSLy87CisJJF8gLj0gJ1xmUic7CisJcy8oXFxmSSkoICopLyQyJDEvZzsKKwlzL1xcZklcXGZSLy9nOworCXMvXlxcZlIvLzsKKwlzL1xcZkkkLy87CisJcy9eXC4vXFwmLi87CisKKwkkc3lub3BzaXMgLj0gIiRfXG4iOworICAgIH0KKworICAgICRpbmNsdWRle1NZTk9QU0lTfSB8fD0gJHN5bm9wc2lzOworfQorCisjIFByb2Nlc3MgdGV4dCwgaW5pdGlhbCBzZWN0aW9uIGlzIERFU0NSSVBUSU9OLgorbXkgJHNlY3QgPSAnREVTQ1JJUFRJT04nOworJF8gPSAiJGhlbHBfdGV4dFxuXG4kdmVyc2lvbl90ZXh0IjsKKworIyBOb3JtYWxpc2UgcGFyYWdyYXBoIGJyZWFrcy4KK3MvXlxuKy8vOworcy9cbiokL1xuLzsKK3MvXG5cbisvXG5cbi9nOworCisjIFRlbXBvcmFyaWx5IGV4Y2hhbmdlIGxlYWRpbmcgZG90cywgYXBvc3Ryb3BoZXMgYW5kIGJhY2tzbGFzaGVzIGZvcgorIyB0b2tlbnMuCitzL15cLi9ceDgwL21nOworcy9eJy9ceDgxL21nOworcy9cXC9ceDgyL2c7CisKKyMgU3RhcnQgYSBuZXcgcGFyYWdyYXBoIChpZiByZXF1aXJlZCkgZm9yIHRoZXNlLgorcy8oW15cbl0pXG4oUmVwb3J0ICtidWdzfEVtYWlsICtidWcgK3JlcG9ydHMgK3RvfFdyaXR0ZW4gK2J5KS8kMVxuXG4kMi9nOworCitzdWIgY29udmVydF9vcHRpb247CisKK3doaWxlIChsZW5ndGgpCit7CisgICAgIyBDb252ZXJ0IHNvbWUgc3RhbmRhcmQgcGFyYWdyYXBoIG5hbWVzLgorICAgIGlmIChzL14oT3B0aW9uc3xFeGFtcGxlcyk6ICpcbi8vKQorICAgIHsKKwkkc2VjdCA9IHVjICQxOworCW5leHQ7CisgICAgfQorCisgICAgIyBDb3B5cmlnaHQgc2VjdGlvbgorICAgIGlmICgvXkNvcHlyaWdodCArWyhceGE5XS8pCisgICAgeworCSRzZWN0ID0gJ0NPUFlSSUdIVCc7CisJJGluY2x1ZGV7JHNlY3R9IHx8PSAnJzsKKwkkaW5jbHVkZXskc2VjdH0gLj0gIi5QUFxuIiBpZiAkaW5jbHVkZXskc2VjdH07CisKKwlteSAkY29weTsKKwkoJGNvcHksICRfKSA9IHNwbGl0IC9cblxuLywgJF8sIDI7CisKKwlmb3IgKCRjb3B5KQorCXsKKwkgICAgIyBBZGQgYmFjayBuZXdsaW5lCisJICAgIHMvXG4qJC9cbi87CisKKwkgICAgIyBDb252ZXJ0IGlzbzk5NTktMSBjb3B5cmlnaHQgc3ltYm9sIG9yIChjKSB0byBucm9mZgorCSAgICAjIGNoYXJhY3Rlci4KKwkgICAgcy9eQ29weXJpZ2h0ICsoPzpceGE5fFwoW0NjXVwpKS9Db3B5cmlnaHQgXFwoY28vbWc7CisKKwkgICAgIyBJbnNlcnQgbGluZSBicmVha3MgYmVmb3JlIGFkZGl0aW9uYWwgY29weXJpZ2h0IG1lc3NhZ2VzCisJICAgICMgYW5kIHRoZSBkaXNjbGFpbWVyLgorCSAgICBzLyguKVxuKENvcHlyaWdodCB8VGhpcyAraXMgK2ZyZWUgK3NvZnR3YXJlKS8kMVxuLmJyXG4kMi9nOworCisJICAgICMgSm9pbiBoeXBoZW5hdGVkIGxpbmVzLgorCSAgICBzLyhbQS1aYS16XSktXG4gKi8kMS9nOworCX0KKworCSRpbmNsdWRleyRzZWN0fSAuPSAkY29weTsKKwkkXyB8fD0gJyc7CisJbmV4dDsKKyAgICB9CisKKyAgICAjIENhdGNoIGJ1ZyByZXBvcnQgdGV4dC4KKyAgICBpZiAoL14oUmVwb3J0ICtidWdzfEVtYWlsICtidWcgK3JlcG9ydHMgK3RvKSAvKQorICAgIHsKKwkkc2VjdCA9ICdSRVBPUlRJTkcgQlVHUyc7CisgICAgfQorCisgICAgIyBBdXRob3Igc2VjdGlvbi4KKyAgICBlbHNpZiAoL15Xcml0dGVuICtieS8pCisgICAgeworCSRzZWN0ID0gJ0FVVEhPUic7CisgICAgfQorCisgICAgIyBFeGFtcGxlcywgaW5kaWNhdGVkIGJ5IGFuIGluZGVudGVkIGxlYWRpbmcgJCwgJSBvciA+IGFyZQorICAgICMgcmVuZGVyZWQgaW4gYSBjb25zdGFudCB3aWR0aCBmb250LgorICAgIGlmICgvXiggKykoW1wkXCU+XSApXFMvKQorICAgIHsKKwlteSAkaW5kZW50ID0gJDE7CisJbXkgJHByZWZpeCA9ICQyOworCW15ICRicmVhayA9ICcuSVAnOworCSRpbmNsdWRleyRzZWN0fSB8fD0gJyc7CisJd2hpbGUgKHMvXiRpbmRlbnRcUSRwcmVmaXhcRShcUy4qKVxuKi8vKQorCXsKKwkgICAgJGluY2x1ZGV7JHNlY3R9IC49ICIkYnJlYWtcblxcZihDVyRwcmVmaXgkMVxcZlJcbiI7CisJICAgICRicmVhayA9ICcuYnInOworCX0KKworCW5leHQ7CisgICAgfQorCisgICAgbXkgJG1hdGNoZWQgPSAnJzsKKyAgICAkaW5jbHVkZXskc2VjdH0gfHw9ICcnOworCisgICAgIyBTdWItc2VjdGlvbnMgaGF2ZSBhIHRyYWlsaW5nIGNvbG9uIGFuZCB0aGUgc2Vjb25kIGxpbmUgaW5kZW50ZWQuCisgICAgaWYgKHMvXihcUy4qOikgKlxuIC8gLykKKyAgICB7CisJJG1hdGNoZWQgLj0gJCYgaWYgJWFwcGVuZDsKKwkkaW5jbHVkZXskc2VjdH0gLj0gcXEoLlNTICIkMSJcbik7CisgICAgfQorCisgICAgbXkgJGluZGVudCA9IDA7CisgICAgbXkgJGNvbnRlbnQgPSAnJzsKKworICAgICMgT3B0aW9uIHdpdGggZGVzY3JpcHRpb24uCisgICAgaWYgKHMvXiggezEsMTB9KFsrLV1cUy4qPykpKD86KCAgKyl8XG4oIHsyMCx9KSkoXFMuKilcbi8vKQorICAgIHsKKwkkbWF0Y2hlZCAuPSAkJiBpZiAlYXBwZW5kOworCSRpbmRlbnQgPSBsZW5ndGggKCQ0IHx8ICIkMSQzIik7CisJJGNvbnRlbnQgPSAiLlRQXG5ceDgzJDJcblx4ODMkNVxuIjsKKwl1bmxlc3MgKCQ0KQorCXsKKwkgICAgIyBJbmRlbnQgbWF5IGJlIGRpZmZlcmVudCBvbiBzZWNvbmQgbGluZS4KKwkgICAgJGluZGVudCA9IGxlbmd0aCAkJiBpZiAvXiB7MjAsfS87CisJfQorICAgIH0KKworICAgICMgT3B0aW9uIHdpdGhvdXQgZGVzY3JpcHRpb24uCisgICAgZWxzaWYgKHMvXiB7MSwxMH0oWystXVxTLiopXG4vLykKKyAgICB7CisJJG1hdGNoZWQgLj0gJCYgaWYgJWFwcGVuZDsKKwkkY29udGVudCA9ICIuSFBcblx4ODMkMVxuIjsKKwkkaW5kZW50ID0gODA7ICMgbm90IGNvbnRpbnVlZAorICAgIH0KKworICAgICMgSW5kZW50ZWQgcGFyYWdyYXBoIHdpdGggdGFnLgorICAgIGVsc2lmIChzL14oICsoXFMuKj8pICArKShcUy4qKVxuLy8pCisgICAgeworCSRtYXRjaGVkIC49ICQmIGlmICVhcHBlbmQ7CisJJGluZGVudCA9IGxlbmd0aCAkMTsKKwkkY29udGVudCA9ICIuVFBcblx4ODMkMlxuXHg4MyQzXG4iOworICAgIH0KKworICAgICMgSW5kZW50ZWQgcGFyYWdyYXBoLgorICAgIGVsc2lmIChzL14oICspKFxTLiopXG4vLykKKyAgICB7CisJJG1hdGNoZWQgLj0gJCYgaWYgJWFwcGVuZDsKKwkkaW5kZW50ID0gbGVuZ3RoICQxOworCSRjb250ZW50ID0gIi5JUFxuXHg4MyQyXG4iOworICAgIH0KKworICAgICMgTGVmdCBqdXN0aWZpZWQgcGFyYWdyYXBoLgorICAgIGVsc2UKKyAgICB7CisJcy8oLiopXG4vLzsKKwkkbWF0Y2hlZCAuPSAkJiBpZiAlYXBwZW5kOworCSRjb250ZW50ID0gIi5QUFxuIiBpZiAkaW5jbHVkZXskc2VjdH07CisJJGNvbnRlbnQgLj0gIiQxXG4iOworICAgIH0KKworICAgICMgQXBwZW5kIGNvbnRpbnVhdGlvbnMuCisgICAgd2hpbGUgKHMvXiB7JGluZGVudH0oXFMuKilcbi8vKQorICAgIHsKKwkkbWF0Y2hlZCAuPSAkJiBpZiAlYXBwZW5kOworCSRjb250ZW50IC49ICJceDgzJDFcbiIKKyAgICB9CisKKyAgICAjIE1vdmUgdG8gbmV4dCBwYXJhZ3JhcGguCisgICAgcy9eXG4rLy87CisKKyAgICBmb3IgKCRjb250ZW50KQorICAgIHsKKwkjIExlYWRpbmcgZG90IGFuZCBhcG9zdHJvcGhlIHByb3RlY3Rpb24uCisJcy9ceDgzXC4vXHg4MC9nOworCXMvXHg4MycvXHg4MS9nOworCXMvXHg4My8vZzsKKworCSMgQ29udmVydCBvcHRpb25zLgorCXMvKF58ICkoLVtdW1x3PS1dKykvJDEgLiBjb252ZXJ0X29wdGlvbiAkMi9tZ2U7CisgICAgfQorCisgICAgIyBDaGVjayBpZiBtYXRjaGVkIHBhcmFncmFwaCBjb250YWlucyAvcGF0Ly4KKyAgICBpZiAoJWFwcGVuZCkKKyAgICB7CisJZm9yIG15ICRwYXQgKGtleXMgJWFwcGVuZCkKKwl7CisJICAgIGlmICgkbWF0Y2hlZCA9fiAkcGF0KQorCSAgICB7CisJCSRjb250ZW50IC49ICIuUFBcbiIgdW5sZXNzICRhcHBlbmR7JHBhdH0gPX4gL15cLi87CisJCSRjb250ZW50IC49ICRhcHBlbmR7JHBhdH07CisJICAgIH0KKwl9CisgICAgfQorCisgICAgJGluY2x1ZGV7JHNlY3R9IC49ICRjb250ZW50OworfQorCisjIFJlZmVyIHRvIHRoZSByZWFsIGRvY3VtZW50YXRpb24uCit1bmxlc3MgKCRvcHRfbm9faW5mbykKK3sKKyAgICAkc2VjdCA9ICdTRUUgQUxTTyc7CisgICAgJGluY2x1ZGV7JHNlY3R9IHx8PSAnJzsKKyAgICAkaW5jbHVkZXskc2VjdH0gLj0gIi5QUFxuIiBpZiAkaW5jbHVkZXskc2VjdH07CisgICAgJGluY2x1ZGV7JHNlY3R9IC49IDw8RU9UOworVGhlIGZ1bGwgZG9jdW1lbnRhdGlvbiBmb3IKKy5CICRwcm9ncmFtCitpcyBtYWludGFpbmVkIGFzIGEgVGV4aW5mbyBtYW51YWwuICBJZiB0aGUKKy5CIGluZm8KK2FuZAorLkIgJHByb2dyYW0KK3Byb2dyYW1zIGFyZSBwcm9wZXJseSBpbnN0YWxsZWQgYXQgeW91ciBzaXRlLCB0aGUgY29tbWFuZAorLklQCisuQiBpbmZvICRwcm9ncmFtCisuUFAKK3Nob3VsZCBnaXZlIHlvdSBhY2Nlc3MgdG8gdGhlIGNvbXBsZXRlIG1hbnVhbC4KK0VPVAorfQorCisjIE91dHB1dCBoZWFkZXIuCitwcmludCA8PEVPVDsKKy5cXCIgRE8gTk9UIE1PRElGWSBUSElTIEZJTEUhICBJdCB3YXMgZ2VuZXJhdGVkIGJ5ICR0aGlzX3Byb2dyYW0gJHRoaXNfdmVyc2lvbi4KKy5USCAkUFJPR1JBTSAiJHNlY3Rpb24iICIkZGF0ZSIgIiRwYWNrYWdlICR2ZXJzaW9uIiBGU0YKK0VPVAorCisjIFNlY3Rpb24gb3JkZXJpbmcuCitteSBAcHJlID0gcXcoTkFNRSBTWU5PUFNJUyBERVNDUklQVElPTiBPUFRJT05TIEVYQU1QTEVTKTsKK215IEBwb3N0ID0gKCdBVVRIT1InLCAnUkVQT1JUSU5HIEJVR1MnLCAnQ09QWVJJR0hUJywgJ1NFRSBBTFNPJyk7CitteSAkZmlsdGVyID0gam9pbiAnfCcsIEBwcmUsIEBwb3N0OworCisjIE91dHB1dCBjb250ZW50LgorZm9yIChAcHJlLCAoZ3JlcCAhIC9eKCRmaWx0ZXIpJC9vLCBAaW5jbHVkZSksIEBwb3N0KQoreworICAgIGlmICgkaW5jbHVkZXskX30pCisgICAgeworCW15ICRxdW90ZSA9IC9cVy8gPyAnIicgOiAnJzsKKwlwcmludCAiLlNIICRxdW90ZSRfJHF1b3RlXG4iOworCQorCWZvciAoJGluY2x1ZGV7JF99KQorCXsKKwkgICAgIyBSZXBsYWNlIGxlYWRpbmcgZG90LCBhcG9zdHJvcGhlIGFuZCBiYWNrc2xhc2ggdG9rZW5zLgorCSAgICBzL1x4ODAvXFwmLi9nOworCSAgICBzL1x4ODEvXFwmJy9nOworCSAgICBzL1x4ODIvXFxlL2c7CisJICAgIHByaW50OworCX0KKyAgICB9Cit9CisKK2V4aXQ7CisKKyMgQ29udmVydCBvcHRpb24gZGFzaGVzIHRvIFwtIHRvIHN0b3AgbnJvZmYgZnJvbSBoeXBoZW5hdGluZyAnZW0sIGFuZAorIyBlbWJvbGRlbi4gIE9wdGlvbiBhcmd1bWVudHMgZ2V0IGl0YWxpY2lzZWQuCitzdWIgY29udmVydF9vcHRpb24KK3sKKyAgICBsb2NhbCAkXyA9ICdcZkInIC4gc2hpZnQ7CisKKyAgICBzLy0vXFwtL2c7CisgICAgdW5sZXNzIChzL1xbPSguKilcXSQvXFxmUls9XFxmSSQxXFxmUl0vKQorICAgIHsKKwlzLz0oLikvXFxmUj1cXGZJJDEvOworCXMvICguKS8gXFxmSSQxLzsKKwkkXyAuPSAnXGZSJzsKKyAgICB9CisKKyAgICAkXzsKK30KZGlmZiAtLWdpdCBhL2RvY3MvaW50ZXJuYWxzLnRleGkgYi9kb2NzL2ludGVybmFscy50ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYjY0MDYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2ludGVybmFscy50ZXhpCkBAIC0wLDAgKzEsNDI3IEBACitAbm9kZSBJbnRlcm5hbHMKK0BhcHBlbmRpeCBIYWNraW5nIEdSVUIKKworVGhpcyBjaGFwdGVyIGRvY3VtZW50cyB0aGUgdXNlci1pbnZpc2libGUgYXNwZWN0IG9mIEdSVUIuCisKK0FzIGEgZ2VuZXJhbCBydWxlIG9mIHNvZnR3YXJlIGRldmVsb3BtZW50LCBpdCBpcyBpbXBvc3NpYmxlIHRvIGtlZXAgdGhlCitkZXNjcmlwdGlvbnMgb2YgdGhlIGludGVybmFscyB1cC10by1kYXRlLCBhbmQgaXQgaXMgcXVpdGUgaGFyZCB0bworZG9jdW1lbnQgZXZlcnl0aGluZy4gU28gcmVmZXIgdG8gdGhlIHNvdXJjZSBjb2RlLCB3aGVuZXZlciB5b3UgYXJlIG5vdAorc2F0aXNmaWVkIHdpdGggdGhpcyBkb2N1bWVudGF0aW9uLiAgUGxlYXNlIGFzc3VtZSB0aGF0IHRoaXMgZ2l2ZXMganVzdAoraGludHMgdG8geW91LgorCitAbWVudQorKiBNZW1vcnkgbWFwOjogICAgICAgICAgICAgICAgICBUaGUgbWVtb3J5IG1hcCBvZiB2YXJpb3VzIGNvbXBvbmVudHMKKyogRW1iZWRkZWQgZGF0YTo6ICAgICAgICAgICAgICAgRW1iZWRkZWQgdmFyaWFibGVzIGluIEdSVUIKKyogRmlsZXN5c3RlbSBpbnRlcmZhY2U6OiAgICAgICAgVGhlIGdlbmVyaWMgaW50ZXJmYWNlIGZvciBmaWxlc3lzdGVtcworKiBDb21tYW5kIGludGVyZmFjZTo6ICAgICAgICAgICBUaGUgZ2VuZXJpYyBpbnRlcmZhY2UgZm9yIGJ1aWx0LWlucworKiBCb290c3RyYXAgdHJpY2tzOjogICAgICAgICAgICBUaGUgYm9vdHN0cmFwIG1lY2hhbmlzbSB1c2VkIGluIEdSVUIKKyogSS9PIHBvcnRzIGRldGVjdGlvbjo6ICAgICAgICAgSG93IHRvIHByb2JlIEkvTyBwb3J0cyB1c2VkIGJ5IElOVCAxM0gKKyogTWVtb3J5IGRldGVjdGlvbjo6ICAgICAgICAgICAgSG93IHRvIGRldGVjdCBhbGwgaW5zdGFsbGVkIFJBTQorKiBMb3ctbGV2ZWwgZGlzayBJL086OiAgICAgICAgICBJTlQgMTNIIGRpc2sgSS9PIGludGVycnVwdHMKKyogTUJSOjogICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHN0cnVjdHVyZSBvZiBNYXN0ZXIgQm9vdCBSZWNvcmQKKyogUGFydGl0aW9uIHRhYmxlOjogICAgICAgICAgICAgVGhlIGZvcm1hdCBvZiBwYXJ0aXRpb24gdGFibGVzCisqIFN1Ym1pdHRpbmcgcGF0Y2hlczo6ICAgICAgICAgIFdoZXJlIGFuZCBob3cgeW91IHNob3VsZCBzZW5kIHBhdGNoZXMKK0BlbmQgbWVudQorCisKK0Bub2RlIE1lbW9yeSBtYXAKK0BzZWN0aW9uIFRoZSBtZW1vcnkgbWFwIG9mIHZhcmlvdXMgY29tcG9uZW50cworCitHUlVCIGNvbnNpc3RzIG9mIHR3byBkaXN0aW5jdCBjb21wb25lbnRzLCBjYWxsZWQgQGRmbntzdGFnZXN9LCB3aGljaCBhcmUKK2xvYWRlZCBhdCBkaWZmZXJlbnQgdGltZXMgaW4gdGhlIGJvb3QgcHJvY2Vzcy4gQmVjYXVzZSB0aGV5IHJ1bgorbXV0dWFsLWV4Y2x1c2l2ZWx5LCBzb21ldGltZXMgYSBtZW1vcnkgYXJlYSBvdmVybGFwcyB3aXRoIGFub3RoZXIKK21lbW9yeSBhcmVhLiBBbmQsIGV2ZW4gaW4gb25lIHN0YWdlLCBhIHNpbmdsZSBtZW1vcnkgYXJlYSBjYW4gYmUgdXNlZAorZm9yIHZhcmlvdXMgcHVycG9zZXMsIGJlY2F1c2UgdGhlaXIgdXNhZ2VzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuCisKK0hlcmUgaXMgdGhlIG1lbW9yeSBtYXAgb2YgdGhlIHZhcmlvdXMgY29tcG9uZW50czoKKworQHRhYmxlIEBhc2lzCitAaXRlbSAwIHRvIDRLLTEKK0JJT1MgYW5kIHJlYWwgbW9kZSBpbnRlcnJ1cHRzCisKK0BpdGVtIDB4MDdCRSB0byAweDA3RkYKK1BhcnRpdGlvbiB0YWJsZSBwYXNzZWQgdG8gYW5vdGhlciBib290IGxvYWRlcgorCitAaXRlbSBkb3duIGZyb20gOEstMQorUmVhbCBtb2RlIHN0YWNrCisKK0BpdGVtIDB4MjAwMCB0byA/CitUaGUgb3B0aW9uYWwgU3RhZ2UgMS41IGlzIGxvYWRlZCBoZXJlCisKK0BpdGVtIDB4MjAwMCB0byAweDdGRkYKK0NvbW1hbmQtbGluZSBidWZmZXIgZm9yIE11bHRpYm9vdCBrZXJuZWxzIGFuZCBtb2R1bGVzCisKK0BpdGVtIDB4N0MwMCB0byAweDdERkYKK1N0YWdlIDEgaXMgbG9hZGVkIGhlcmUgYnkgQklPUyBvciBhbm90aGVyIGJvb3QgbG9hZGVyCisKK0BpdGVtIDB4N0YwMCB0byAweDdGNDIKK0xCQSBkcml2ZSBwYXJhbWV0ZXJzCisKK0BpdGVtIDB4ODAwMCB0byA/CitTdGFnZTIgaXMgbG9hZGVkIGhlcmUKKworQGl0ZW0gVGhlIGVuZCBvZiBTdGFnZSAyIHRvIDQxNkstMQorSGVhcCwgaW4gcGFydGljdWxhciB1c2VkIGZvciB0aGUgbWVudQorCitAaXRlbSBkb3duIGZyb20gNDE2Sy0xCitQcm90ZWN0ZWQgbW9kZSBzdGFjaworCitAaXRlbSA0MTZLIHRvIDQ0OEstMQorRmlsZXN5c3RlbSBidWZmZXIKKworQGl0ZW0gNDQ4SyB0byA0NzkuNUstMQorUmF3IGRldmljZSBidWZmZXIKKworQGl0ZW0gNDc5LjVLIHRvIDQ4MEstMQorNTEyLWJ5dGUgc2NyYXRjaCBhcmVhCisKK0BpdGVtIDQ4MEsgdG8gNTEySy0xCitCdWZmZXJzIGZvciB2YXJpb3VzIGZ1bmN0aW9ucywgc3VjaCBhcyBwYXNzd29yZCwgY29tbWFuZC1saW5lLCBjdXQgYW5kCitwYXN0ZSwgYW5kIGNvbXBsZXRpb24uCisKK0BpdGVtIFRoZSBsYXN0IDFLIG9mIGxvd2VyIG1lbW9yeQorRGlzayBzd2FwcGluZyBjb2RlIGFuZCBkYXRhCitAZW5kIHRhYmxlCisKK1NlZSB0aGUgZmlsZSBAZmlsZXtzdGFnZTIvc2hhcmVkLmh9LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworCitAbm9kZSBFbWJlZGRlZCBkYXRhCitAc2VjdGlvbiBFbWJlZGRlZCB2YXJpYWJsZXMgaW4gR1JVQgorCitTdGFnZSAxIGFuZCBTdGFnZSAyIGhhdmUgZW1iZWRkZWQgdmFyaWFibGVzIHdob3NlIGxvY2F0aW9ucyBhcmUKK3dlbGwtZGVmaW5lZCwgc28gdGhhdCB0aGUgaW5zdGFsbGF0aW9uIGNhbiBwYXRjaCB0aGUgYmluYXJ5IGZpbGUKK2RpcmVjdGx5IHdpdGhvdXQgcmVjb21waWxhdGlvbiBvZiB0aGUgc3RhZ2VzLgorCitJbiBTdGFnZSAxLCB0aGVzZSBhcmUgZGVmaW5lZDoKKworQHRhYmxlIEBjb2RlCitAaXRlbSAweDNFCitUaGUgdmVyc2lvbiBudW1iZXIgKG5vdCBHUlVCJ3MsIGJ1dCB0aGUgaW5zdGFsbGF0aW9uIG1lY2hhbmlzbSdzKS4KKworQGl0ZW0gMHg0MAorVGhlIGJvb3QgZHJpdmUuIElmIGl0IGlzIDB4RkYsIHVzZSBhIGRyaXZlIHBhc3NlZCBieSBCSU9TLgorCitAaXRlbSAweDQxCitUaGUgZmxhZyBmb3IgaWYgZm9yY2luZyBMQkEuCisKK0BpdGVtIDB4NDIKK1RoZSBzdGFydGluZyBhZGRyZXNzIG9mIFN0YWdlIDIuCisKK0BpdGVtIDB4NDQKK1RoZSBmaXJzdCBzZWN0b3Igb2YgU3RhZ2UgMi4KKworQGl0ZW0gMHg0OAorVGhlIHN0YXJ0aW5nIHNlZ21lbnQgb2YgU3RhZ2UgMi4KKworQGl0ZW0gMHgxRkUKK1RoZSBzaWduYXR1cmUgKEBjb2RlezB4QUE1NX0pLgorQGVuZCB0YWJsZQorCitTZWUgdGhlIGZpbGUgQGZpbGV7c3RhZ2UxL3N0YWdlMS5TfSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK0luIHRoZSBmaXJzdCBzZWN0b3Igb2YgU3RhZ2UgMS41IGFuZCBTdGFnZSAyLCB0aGUgYmxvY2sgbGlzdHMgYXJlCityZWNvcmRlZCBiZXR3ZWVuIEBjb2Rle2ZpcnN0bGlzdH0gYW5kIEBjb2Rle2xhc3RsaXN0fS4gVGhlIGFkZHJlc3Mgb2YKK0Bjb2Rle2xhc3RsaXN0fSBpcyBkZXRlcm1pbmVkIHdoZW4gYXNzZW1ibGluZyB0aGUgZmlsZQorQGZpbGV7c3RhZ2UyL3N0YXJ0LlN9LgorCitUaGUgdHJpY2sgaGVyZSBpcyB0aGF0IGl0IGlzIGFjdHVhbGx5IHJlYWQgYmFja3dhcmQsIGFuZCB0aGUgZmlyc3QKKzgtYnl0ZSBibG9jayBsaXN0IGlzIG5vdCByZWFkIGhlcmUsIGJ1dCBhZnRlciB0aGUgcG9pbnRlciBpcyBkZWNyZW1lbnRlZAorOCBieXRlcywgdGhlbiBhZnRlciByZWFkaW5nIGl0LCBpdCBkZWNyZW1lbnRzIGFnYWluLCByZWFkcywgYW5kIHNvIG9uLAordW50aWwgaXQgaXMgZmluaXNoZWQuIFRoZSB0ZXJtaW5hdGluZyBjb25kaXRpb24gaXMgd2hlbiB0aGUgbnVtYmVyIG9mCitzZWN0b3JzIHRvIGJlIHJlYWQgaW4gdGhlIG5leHQgYmxvY2sgbGlzdCBpcyB6ZXJvLgorCitUaGUgZm9ybWF0IG9mIGEgYmxvY2sgbGlzdCBjYW4gYmUgc2VlbiBmcm9tIHRoZSBleGFtcGxlIGluIHRoZSBjb2RlIGp1c3QKK2JlZm9yZSB0aGUgQGNvZGV7Zmlyc3RsaXN0fSBsYWJlbC4gTm90ZSB0aGF0IGl0IGlzIGFsd2F5cyBmcm9tIHRoZQorYmVnaW5uaW5nIG9mIHRoZSBkaXNrLCBidXQgQGVtcGh7bm90fSByZWxhdGl2ZSB0byB0aGUgcGFydGl0aW9uIAorYm91bmRhcmllcy4KKworSW4gdGhlIHNlY29uZCBzZWN0b3Igb2YgU3RhZ2UgMS41IGFuZCBTdGFnZSAyLCB0aGVzZSBhcmUgZGVmaW5lZDoKKworQHRhYmxlIEBhc2lzCitAaXRlbSBAY29kZXsweDZ9CitUaGUgdmVyc2lvbiBudW1iZXIgKGxpa2V3aXNlLCB0aGUgaW5zdGFsbGF0aW9uIG1lY2hhbmlzbSdzKS4KKworQGl0ZW0gQGNvZGV7MHg4fQorVGhlIGluc3RhbGxlZCBwYXJ0aXRpb24uCisKK0BpdGVtIEBjb2RlezB4Q30KK1RoZSBzYXZlZCBlbnRyeSBudW1iZXIuCisKK0BpdGVtIEBjb2RlezB4MTB9CitUaGUgaWRlbnRpZmllci4KKworQGl0ZW0gQGNvZGV7MHgxMX0KK1RoZSBmbGFnIGZvciBpZiBmb3JjaW5nIExCQS4KKworQGl0ZW0gQGNvZGV7MHgxMn0KK1RoZSB2ZXJzaW9uIHN0cmluZyAoR1JVQidzKS4KKworQGl0ZW0gQGNvZGV7MHgxMn0gKyBAZGZue3RoZSBsZW5ndGggb2YgdGhlIHZlcnNpb24gc3RyaW5nfQorVGhlIG5hbWUgb2YgYSBjb25maWd1cmF0aW9uIGZpbGUuCitAZW5kIHRhYmxlCisKK1NlZSB0aGUgZmlsZSBAZmlsZXtzdGFnZTIvYXNtLlN9LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworCitAbm9kZSBGaWxlc3lzdGVtIGludGVyZmFjZQorQHNlY3Rpb24gVGhlIGdlbmVyaWMgaW50ZXJmYWNlIGZvciBmaWxlc3lzdGVtcworCitGb3IgYW55IHBhcnRpY3VsYXIgcGFydGl0aW9uLCBpdCBpcyBwcmVzdW1lZCB0aGF0IG9ubHkgb25lIG9mIHRoZQorQGRmbntub3JtYWx9IGZpbGVzeXN0ZW1zIHN1Y2ggYXMgRkFULCBGRlMsIG9yIGV4dDJmcyBjYW4gYmUgdXNlZCwgc28KK3RoZXJlIGlzIGEgc3dpdGNoIHRhYmxlIG1hbmFnZWQgYnkgdGhlIGZ1bmN0aW9ucyBpbgorQGZpbGV7ZGlza19pby5jfS4gVGhlIG5vdGF0aW9uIGlzIHRoYXQgeW91IGNhbiBvbmx5IEBkZm57bW91bnR9IG9uZSBhdCBhCit0aW1lLgorCitUaGUgYmxvY2sgbGlzdCBmaWxlc3lzdGVtIGhhcyBhIHNwZWNpYWwgcGxhY2UgaW4gdGhlIHN5c3RlbS4gSW4gYWRkaXRpb24KK3RvIHRoZSBAZGZue25vcm1hbH0gZmlsZXN5c3RlbSAob3IgZXZlbiB3aXRob3V0IG9uZSBtb3VudGVkKSwgeW91IGNhbgorYWNjZXNzIGRpc2sgYmxvY2tzIGRpcmVjdGx5IChpbiB0aGUgaW5kaWNhdGVkIHBhcnRpdGlvbikgdmlhIHRoZSBibG9jaworbGlzdCBub3RhdGlvbi4gVXNpbmcgdGhlIGJsb2NrIGxpc3QgZmlsZXN5c3RlbSBkb2Vzbid0IGVmZmVjdCBhbnkgb3RoZXIKK2ZpbGVzeXN0ZW0gbW91bnRzLgorCitUaGUgdmFyaWFibGVzIHdoaWNoIGNhbiBiZSByZWFkIGJ5IHRoZSBmaWxlc3lzdGVtIGJhY2tlbmQgYXJlOgorCitAdnRhYmxlIEBjb2RlCitAaXRlbSBjdXJyZW50X2RyaXZlCitUaGUgY3VycmVudCBCSU9TIGRyaXZlIG51bWJlciAobnVtYmVyZWQgZnJvbSAwLCBpZiBhIGZsb3BweSwgYW5kCitudW1iZXJlZCBmcm9tIDB4ODAsIGlmIGEgaGFyZCBkaXNrKS4KKworQGl0ZW0gY3VycmVudF9wYXJ0aXRpb24KK1RoZSBjdXJyZW50IHBhcnRpdGlvbiBudW1iZXIuCisKK0BpdGVtIGN1cnJlbnRfc2xpY2UKK1RoZSBjdXJyZW50IHBhcnRpdGlvbiB0eXBlLgorCitAaXRlbSBzYXZlZF9kcml2ZQorVGhlIEBkZm57ZHJpdmV9IHBhcnQgb2YgdGhlIHJvb3QgZGV2aWNlLgorCitAaXRlbSBzYXZlZF9wYXJ0aXRpb24KK1RoZSBAZGZue3BhcnRpdGlvbn0gcGFydCBvZiB0aGUgcm9vdCBkZXZpY2UuCisKK0BpdGVtIHBhcnRfc3RhcnQKK1RoZSBjdXJyZW50IHBhcnRpdGlvbiBzdGFydGluZyBhZGRyZXNzLCBpbiBzZWN0b3JzLgorCitAaXRlbSBwYXJ0X2xlbmd0aAorVGhlIGN1cnJlbnQgcGFydGl0aW9uIGxlbmd0aCwgaW4gc2VjdG9ycy4KKworQGl0ZW0gcHJpbnRfcG9zc2liaWxpdGllcworVHJ1ZSB3aGVuIHRoZSBAY29kZXtkaXJ9IGZ1bmN0aW9uIHNob3VsZCBwcmludCB0aGUgcG9zc2libGUgY29tcGxldGlvbnMKK29mIGEgZmlsZSwgYW5kIGZhbHNlIHdoZW4gaXQgc2hvdWxkIHRyeSB0byBhY3R1YWxseSBvcGVuIGEgZmlsZSBvZiB0aGF0CituYW1lLgorCitAaXRlbSBGU1lTX0JVRgorRmlsZXN5c3RlbSBidWZmZXIgd2hpY2ggaXMgMzJLIGluIHNpemUsIHRvIHVzZSBpbiBhbnkgd2F5IHdoaWNoIHRoZQorZmlsZXN5c3RlbSBiYWNrZW5kIGRlc2lyZXMuCitAZW5kIHZ0YWJsZQorCitUaGUgdmFyaWFibGVzIHdoaWNoIG5lZWQgdG8gYmUgd3JpdHRlbiBieSBhIGZpbGVzeXN0ZW0gYmFja2VuZCBhcmU6CisKK0B2dGFibGUgQGNvZGUKK0BpdGVtIGZpbGVwb3MKK1RoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBmaWxlLCBpbiBzZWN0b3JzLgorCitAc3Ryb25ne0NhdXRpb246fSB0aGUgdmFsdWUgb2YgQHZhcntmaWxlcG9zfSBjYW4gYmUgY2hhbmdlZCBvdXQgZnJvbQordW5kZXIgdGhlIGZpbGVzeXN0ZW0gY29kZSBpbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbi4gRG9uJ3QgZGVwZW5kIG9uCitpdCBiZWluZyB0aGUgc2FtZSBmb3IgbGF0ZXIgY2FsbHMgaW50byB0aGUgYmFja2VuZCBjb2RlIQorCitAaXRlbSBmaWxlbWF4CitUaGUgbGVuZ3RoIG9mIHRoZSBmaWxlLgorCitAaXRlbSBkaXNrX3JlYWRfZnVuYworVGhlIHZhbHVlIG9mIEB2YXJ7ZGlza19yZWFkX2hvb2t9IEBlbXBoe29ubHl9IGR1cmluZyByZWFkaW5nIG9mIGRhdGEKK2ZvciB0aGUgZmlsZSwgbm90IGFueSBvdGhlciBmcyBkYXRhLCBpbm9kZXMsIEZBVCB0YWJsZXMsIHdoYXRldmVyLCB0aGVuCitzZXQgdG8gQGNvZGV7TlVMTH0gYXQgYWxsIG90aGVyIHRpbWVzIChpdCB3aWxsIGJlIEBjb2Rle05VTEx9IGJ5CitkZWZhdWx0KS4gSWYgdGhpcyBpc24ndCBkb25lIGNvcnJlY3RseSwgdGhlbiB0aGUgQGNvbW1hbmR7dGVzdGxvYWR9IGFuZAorQGNvbW1hbmR7aW5zdGFsbH0gY29tbWFuZHMgd29uJ3Qgd29yayBjb3JyZWN0bHkuCitAZW5kIHZ0YWJsZQorCitUaGUgZnVuY3Rpb25zIGV4cGVjdGVkIHRvIGJlIHVzZWQgYnkgdGhlIGZpbGVzeXN0ZW0gYmFja2VuZCBhcmU6CisKK0BmdGFibGUgQGNvZGUKK0BpdGVtIGRldnJlYWQKK09ubHkgcmVhZCBzZWN0b3JzIGZyb20gd2l0aGluIGEgcGFydGl0aW9uLiBTZWN0b3IgMCBpcyB0aGUgZmlyc3Qgc2VjdG9yCitpbiB0aGUgcGFydGl0aW9uLgorCitAaXRlbSBncnViX3JlYWQKK0lmIHRoZSBiYWNrZW5kIHVzZXMgdGhlIGJsb2NrIGxpc3QgY29kZSwgdGhlbiBAY29kZXtncnViX3JlYWR9IGNhbiBiZQordXNlZCwgYWZ0ZXIgc2V0dGluZyBAdmFye2Jsb2NrX2ZpbGV9IHRvIDEuCisKK0BpdGVtIHByaW50X2FfY29tcGxldGlvbgorSWYgQHZhcntwcmludF9wb3NzaWJpbGl0aWVzfSBpcyB0cnVlLCBjYWxsIEBjb2Rle3ByaW50X2FfY29tcGxldGlvbn0gZm9yCitlYWNoIHBvc3NpYmxlIGZpbGUgbmFtZS4gT3RoZXJ3aXNlLCB0aGUgZmlsZSBuYW1lIGNvbXBsZXRpb24gd29uJ3Qgd29yay4KK0BlbmQgZnRhYmxlCisKK1RoZSBmdW5jdGlvbnMgZXhwZWN0ZWQgdG8gYmUgZGVmaW5lZCBieSB0aGUgZmlsZXN5c3RlbSBiYWNrZW5kIGFyZQorZGVzY3JpYmVkIGF0IGxlYXN0IG1vZGVyYXRlbHkgaW4gdGhlIGZpbGUgQGZpbGV7ZmlsZXN5cy5ofS4gVGhlaXIgdXNhZ2UKK2lzIGZhaXJseSBldmlkZW50IGZyb20gdGhlaXIgdXNlIGluIHRoZSBmdW5jdGlvbnMgaW4gQGZpbGV7ZGlza19pby5jfSwKK2xvb2sgZm9yIHRoZSB1c2Ugb2YgdGhlIEB2YXJ7ZnN5c190YWJsZX0gYXJyYXkuCisKK0BzdHJvbmd7Q2F1dGlvbjp9IFRoZSBzZW1hbnRpY3MgYXJlIHN1Y2ggdGhhdCB0aGVuIEBzYW1we21vdW50fWluZyB0aGUKK2ZpbGVzeXN0ZW0sIHByZXN1bWUgdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIEBjb2Rle0ZTWVNfQlVGfSBpcyBjb3JydXB0ZWQsCithbmQgKHJlLSlsb2FkIGFsbCBpbXBvcnRhbnQgY29udGVudHMuIFdoZW4gb3BlbmluZyBhbmQgcmVhZGluZyBhIGZpbGUsCitwcmVzdW1lIHRoYXQgdGhlIGRhdGEgZnJvbSB0aGUgQHNhbXB7bW91bnR9IGlzIGF2YWlsYWJsZSwgYW5kIGRvZXNuJ3QKK2dldCBjb3JydXB0ZWQgYnkgdGhlIG9wZW4vcmVhZCAoaS5lLiBtdWx0aXBsZSBvcGVucyBhbmQvb3IgcmVhZHMgd2lsbCBiZQorZG9uZSB3aXRoIG9ubHkgb25lIG1vdW50IGlmIGluIHRoZSBzYW1lIGZpbGVzeXN0ZW0pLgorCisKK0Bub2RlIENvbW1hbmQgaW50ZXJmYWNlCitAc2VjdGlvbiBUaGUgZ2VuZXJpYyBpbnRlcmZhY2UgZm9yIGJ1aWx0LWlucworCitHUlVCIGJ1aWx0LWluIGNvbW1hbmRzIGFyZSBkZWZpbmVkIGluIGEgdW5pZm9ybWFsIGludGVyZmFjZSwgd2hldGhlcgordGhleSBhcmUgbWVudS1zcGVjaWZpYyBvciBjYW4gYmUgdXNlZCBhbnl3aGVyZS4gVGhlIGRlZmluaXRpb24gb2YgYQorYnVpbHRpbiBjb21tYW5kIGNvbnNpc3RzIG9mIHR3byBwYXJ0czogdGhlIGNvZGUgaXRzZWxmIGFuZCB0aGUgdGFibGUgb2YKK3RoZSBpbmZvcm1hdGlvbi4KKworVGhlIGNvZGUgbXVzdCBiZSBhIGZ1bmN0aW9uIHdoaWNoIHRha2VzIHR3byBhcmd1bWVudHMsIGEgY29tbWFuZC1saW5lCitzdHJpbmcgYW5kIGZsYWdzLCBhbmQgcmV0dXJucyBhbiBAc2FtcHtpbnR9IHZhbHVlLiBUaGUgQGRmbntmbGFnc30KK2FyZ3VtZW50IHNwZWNpZmllcyBob3cgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdXNpbmcgYSBiaXQgbWFzay4gVGhlCityZXR1cm4gdmFsdWUgbXVzdCBiZSB6ZXJvIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBub24temVyby4gU28gaXQgaXMKK25vcm1hbGx5IGVub3VnaCB0byByZXR1cm4gQHZhcntlcnJudW19LgorCitUaGUgdGFibGUgb2YgdGhlIGluZm9ybWF0aW9uIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBzdHJ1Y3R1cmUKK0Bjb2Rle3N0cnVjdCBidWlsdGlufSwgd2hpY2ggY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQsIGEgcG9pbnRlcgordG8gdGhlIGZ1bmN0aW9uLCBmbGFncywgYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgY29tbWFuZCBhbmQgYSBsb25nCitkZXNjcmlwdGlvbiBvZiB0aGUgY29tbWFuZC4gU2luY2UgdGhlIGRlc2NyaXB0aW9ucyBhcmUgdXNlZCBvbmx5IGZvcgoraGVscCBtZXNzYWdlcyBpbnRlcmFjdGl2ZWx5LCB5b3UgZG9uJ3QgaGF2ZSB0byBkZWZpbmUgdGhlbSwgaWYgdGhlCitjb21tYW5kIG1heSBub3QgYmUgY2FsbGVkIGludGVyYWN0aXZlbHkgKHN1Y2ggYXMgQGNvbW1hbmR7dGl0bGV9KS4KKworVGhlIHRhYmxlIGlzIGZpbmFsbHkgcmVnaXN0ZXJlZCBpbiB0aGUgdGFibGUgQHZhcntidWlsdGluX3RhYmxlfSwgc28KK3RoYXQgQGNvZGV7cnVuX3NjcmlwdH0gYW5kIEBjb2Rle2VudGVyX2NtZGxpbmV9IGNhbiBmaW5kIHRoZQorY29tbWFuZC4gU2VlIHRoZSBmaWxlcyBAZmlsZXtjbWRsaW5lLmN9IGFuZCBAZmlsZXtidWlsdGlucy5jfSwgZm9yIG1vcmUKK2RldGFpbHMuCisKKworQG5vZGUgQm9vdHN0cmFwIHRyaWNrcworQHNlY3Rpb24gVGhlIGJvb3RzdHJhcCBtZWNoYW5pc20gdXNlZCBpbiBHUlVCCisKK1RoZSBkaXNrIHNwYWNlIGNhbiBiZSB1c2VkIGluIGEgYm9vdCBsb2FkZXIgaXMgdmVyeSByZXN0cmljdGVkIGJlY2F1c2UKK2EgTUJSIChAcHhyZWZ7TUJSfSkgaXMgb25seSA1MTIgYnl0ZXMgYnV0IGl0IGFsc28gY29udGFpbnMgYSBwYXJ0aXRpb24KK3RhYmxlIChAcHhyZWZ7UGFydGl0aW9uIHRhYmxlfSkgYW5kIGEgQlBCLiBTbyB0aGUgcXVlc3Rpb24gaXMgaG93IHRvCittYWtlIGEgYm9vdCBsb2FkZXIgY29kZSBlbm91Z2ggc21hbGwgdG8gYmUgZml0IGluIGEgTUJSLgorCitIb3dldmVyLCBHUlVCIGlzIGEgdmVyeSBsYXJnZSBwcm9ncmFtLCBzbyB3ZSBicmVhayBHUlVCIGludG8gMiAob3IgMykKK2Rpc3RpbmN0IGNvbXBvbmVudHMsIEBkZm57U3RhZ2UgMX0gYW5kIEBkZm57U3RhZ2UgMn0gKGFuZCBvcHRpb25hbGx5CitAZGZue1N0YWdlIDEuNX0pLiBAeHJlZntNZW1vcnkgbWFwfSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK1dlIGVtYmVkIFN0YWdlIDEgaW4gYSBNQlIgb3IgaW4gdGhlIGJvb3Qgc2VjdG9yIG9mIGEgcGFydGl0aW9uLCBhbmQKK3BsYWNlIFN0YWdlIDIgaW4gYSBmaWxlc3lzdGVtLiBUaGUgb3B0aW9uYWwgU3RhZ2UgMS41IGNhbiBiZSBpbnN0YWxsZWQKK2luIGEgZmlsZXN5c3RlbSwgaW4gdGhlIEBkZm57Ym9vdCBsb2FkZXJ9IGFyZWEgaW4gYSBGRlMgb3IgYSBSZWlzZXJGUywKK2FuZCBpbiB0aGUgc2VjdG9ycyByaWdodCBhZnRlciBhIE1CUiwgYmVjYXVzZSBTdGFnZSAxLjUgaXMgZW5vdWdoIHNtYWxsCithbmQgdGhlIHNlY3RvcnMgcmlnaHQgYWZ0ZXIgYSBNQlIgaXMgbm9ybWFsbHkgYW4gdW51c2VkIHJlZ2lvbi4gVGhlIHNpemUKK29mIHRoaXMgcmVnaW9uIGlzIHRoZSBudW1iZXIgb2Ygc2VjdG9ycyBwZXIgaGVhZCBtaW51cyAxLgorCitUaHVzLCBhbGwgU3RhZ2UxIG11c3QgZG8gaXMganVzdCBsb2FkIFN0YWdlMiBvciBTdGFnZTEuNS4gQnV0IGV2ZW4gaWYKK1N0YWdlIDEgbmVlZHMgbm90IHRvIHN1cHBvcnQgdGhlIHVzZXIgaW50ZXJmYWNlIG9yIHRoZSBmaWxlc3lzdGVtCitpbnRlcmZhY2UsIGl0IGlzIGltcG9zc2libGUgdG8gbWFrZSBTdGFnZSAxIGxlc3MgdGhhbiA0MDAgYnl0ZXMsIGJlY2F1c2UKK0dSVUIgc2hvdWxkIHN1cHBvcnQgYm90aCB0aGUgQ0hTIG1vZGUgYW5kIHRoZSBMQkEgbW9kZSAoQHB4cmVme0xvdy1sZXZlbAorZGlzayBJL099KS4KKworVGhlIHNvbHV0aW9uIHVzZWQgYnkgR1JVQiBpcyB0aGF0IFN0YWdlIDEgbG9hZHMgb25seSB0aGUgZmlyc3Qgc2VjdG9yIG9mCitTdGFnZSAyIChvciBTdGFnZSAxLjUpIGFuZCBTdGFnZSAyIGl0c2VsZiBsb2FkcyB0aGUgcmVzdC4gVGhlIGZsb3cgb2YKK1N0YWdlIDEgaXM6CisKK0BlbnVtZXJhdGUKK0BpdGVtCitJbml0aWFsaXplIHRoZSBzeXN0ZW0gYnJpZWZseS4KKworQGl0ZW0KK0RldGVjdCB0aGUgZ2VvbWV0cnkgYW5kIHRoZSBhY2Nlc3NpbmcgbW9kZSBvZiB0aGUgQGRmbntsb2FkaW5nIGRyaXZlfS4KKworQGl0ZW0KK0xvYWQgdGhlIGZpcnN0IHNlY3RvciBvZiBTdGFnZSAyLgorCitAaXRlbQorSnVtcCB0byB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgU3RhZ2UgMi4KK0BlbmQgZW51bWVyYXRlCisKK1RoZSBmbG93IG9mIFN0YWdlIDIgKGFuZCBTdGFnZSAxLjUpIGlzOgorCitAZW51bWVyYXRlCitAaXRlbQorTG9hZCB0aGUgcmVzdCBvZiBpdHNlbGYgdG8gdGhlIHJlYWwgc3RhcnRpbmcgYWRkcmVzcywgdGhhdCBpcywgdGhlCitzdGFydGluZyBhZGRyZXNzIHBsdXMgNTEyIGJ5dGVzLiBUaGUgYmxvY2sgbGlzdHMgYXJlIHN0b3JlZCBpbiB0aGUgbGFzdAorcGFydCBvZiB0aGUgZmlyc3Qgc2VjdG9yLgorCitAaXRlbQorTG9uZyBqdW1wIHRvIHRoZSByZWFsIHN0YXJ0aW5nIGFkZHJlc3MuCitAZW5kIGVudW1lcmF0ZQorCitOb3RlIHRoYXQgU3RhZ2UgMiAob3IgU3RhZ2UgMS41KSBkb2VzIG5vdCBwcm9iZSB0aGUgZ2VvbWV0cnkKK29yIHRoZSBhY2Nlc3NpbmcgbW9kZSBvZiB0aGUgQGRmbntsb2FkaW5nIGRyaXZlfSwgc2luY2UgU3RhZ2UgMSBoYXMKK2FscmVhZHkgcHJvYmVkIHRoZW0uCisKKworQG5vZGUgSS9PIHBvcnRzIGRldGVjdGlvbgorQHNlY3Rpb24gSG93IHRvIHByb2JlIEkvTyBwb3J0cyB1c2VkIGJ5IElOVCAxM0gKKworRklYTUU6IEkgd2lsbCB3cml0ZSB0aGlzIGNoYXB0ZXIgYWZ0ZXIgaW1wbGVtZW50aW5nIHRoZSBuZXcgdGVjaG5pcXVlLgorCisKKworQG5vZGUgTWVtb3J5IGRldGVjdGlvbgorQHNlY3Rpb24gSG93IHRvIGRldGVjdCBhbGwgaW5zdGFsbGVkIFJBTQorCitGSVhNRTogSSBkb3VidCBpZiBFcmljaCBkaWRuJ3Qgd3JpdGUgdGhpcyBjaGFwdGVyIG9ubHkgaGltc2VsZiB3aG9sbHksCitzbyBJIHdpbGwgcmV3cml0ZSB0aGlzIGNoYXB0ZXIuCisKKworQG5vZGUgTG93LWxldmVsIGRpc2sgSS9PCitAc2VjdGlvbiBJTlQgMTNIIGRpc2sgSS9PIGludGVycnVwdHMKKworRklYTUU6IEknbSBub3Qgc3VyZSB3aGVyZSBzb21lIHBhcnQgb2YgdGhlIG9yaWdpbmFsIGNoYXB0ZXIgaXMgZGVyaXZlZCwKK3NvIEkgd2lsbCByZXdyaXRlIHRoaXMgY2hhcHRlci4KKworCitAbm9kZSBNQlIKK0BzZWN0aW9uIFRoZSBzdHJ1Y3R1cmUgb2YgTWFzdGVyIEJvb3QgUmVjb3JkCisKK0ZJWE1FOiBMaWtld2lzZS4KKworCitAbm9kZSBQYXJ0aXRpb24gdGFibGUKK0BzZWN0aW9uIFRoZSBmb3JtYXQgb2YgcGFydGl0aW9uIHRhYmxlcworCitGSVhNRTogUHJvYmFibHkgdGhlIG9yaWdpbmFsIGNoYXB0ZXIgaXMgZGVyaXZlZCBmcm9tICJIb3cgSXQgV29ya3MiLCBzbworSSB3aWxsIHJld3JpdGUgdGhpcyBjaGFwdGVyLgorCisKK0Bub2RlIFN1Ym1pdHRpbmcgcGF0Y2hlcworQHNlY3Rpb24gV2hlcmUgYW5kIGhvdyB5b3Ugc2hvdWxkIHNlbmQgcGF0Y2hlcworCitXaGVuIHlvdSB3cml0ZSBwYXRjaGVzIGZvciBHUlVCLCBwbGVhc2Ugc2VuZCB0aGVtIHRvIHRoZSBtYWlsaW5nIGxpc3QKK0BlbWFpbHtidWctZ3J1YkBAZ251Lm9yZ30uIEhlcmUgaXMgdGhlIGxpc3Qgb2YgaXRlbXMgb2Ygd2hpY2ggeW91CitzaG91bGQgdGFrZSBjYXJlOgorCitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbQorUGxlYXNlIG1ha2UgeW91ciBwYXRjaCBhcyBzbWFsbCBhcyBwb3NzaWJsZS4gR2VuZXJhbGx5LCBpdCBpcyBub3QgYSBnb29kCit0aGluZyB0byBtYWtlIG9uZSBiaWcgcGF0Y2ggd2hpY2ggY2hhbmdlcyBtYW55IHRoaW5ncy4gSW5zdGVhZCwKK3NlZ3JlZ2F0ZSBmZWF0dXJlcyBhbmQgcHJvZHVjZSBtYW55IHBhdGNoZXMuCisKK0BpdGVtCitVc2UgYXMgbGF0ZSBjb2RlIGFzIHBvc3NpYmxlLCBmb3IgdGhlIG9yaWdpbmFsIGNvZGUuIFRoZSBDVlMgcmVwb3NpdG9yeQorYWx3YXlzIGhhcyB0aGUgY3VycmVudCB2ZXJzaW9uIChAcHhyZWZ7T2J0YWluaW5nIGFuZCBCdWlsZGluZyBHUlVCfSkuCisKK0BpdGVtCitXcml0ZSBDaGFuZ2VMb2cgZW50cmllcy4gQHhyZWZ7Q2hhbmdlIExvZ3MsICwgQ2hhbmdlIExvZ3MsIHN0YW5kYXJkcywKK0dOVSBDb2RpbmcgU3RhbmRhcmRzfSwgaWYgeW91IGRvbid0IGtub3cgaG93IHRvIHdyaXRlIENoYW5nZUxvZy4KKworQGl0ZW0KK01ha2UgcGF0Y2hlcyBpbiB1bmlmaWVkIGRpZmYgZm9ybWF0LiBAc2FtcHtkaWZmIC11ck59IGlzIGFwcHJvcHJpYXRlIGluCittb3N0IGNhc2VzLgorCitAaXRlbQorRG9uJ3QgbWFrZSBwYXRjaGVzIHJldmVyc2VseS4gUmV2ZXJzZSBwYXRjaGVzIGFyZSBkaWZmaWN1bHQgdG8gcmVhZCBhbmQKK3VzZS4KKworQGl0ZW0KK0JlIGNhcmVmdWwgZW5vdWdoIG9mIHRoZSBsaWNlbnNlIHRlcm0gYW5kIHRoZSBjb3B5cmlnaHQuIEJlY2F1c2UgR1JVQgoraXMgdW5kZXIgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHlvdSBtYXkgbm90IHN0ZWFsIGNvZGUgZnJvbQorc29mdHdhcmUgd2hvc2UgbGljZW5zZSBpcyBpbmNvbXBhdGlibGUgYWdhaW5zdCBHUEwuIEFuZCwgaWYgeW91IGNvcHkKK2NvZGUgd3JpdHRlbiBieSBvdGhlcnMsIHlvdSBtdXN0IG5vdCBpZ25vcmUgdGhlaXIgY29weXJpZ2h0cy4gRmVlbCBmcmVlCit0byBhc2sgR1JVQiBtYWludGFpbmVycywgd2hlbmV2ZXIgeW91IGFyZSBub3Qgc3VyZSB3aGF0IHlvdSBzaG91bGQgZG8uCisKK0BpdGVtCitJZiB5b3VyIHBhdGNoIGlzIHRvbyBsYXJnZSB0byBzZW5kIGluIGUtbWFpbCwgcHV0IGl0IGF0IHNvbWV3aGVyZSB3ZSBjYW4KK3NlZS4gVXN1YWxseSwgeW91IHNob3VsZG4ndCBzZW5kIGUtbWFpbCBvdmVyIDIwSy4KK0BlbmQgaXRlbWl6ZQpkaWZmIC0tZ2l0IGEvZG9jcy9rZXJuZWwuYyBiL2RvY3Mva2VybmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYwZGVmOQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3Mva2VybmVsLmMKQEAgLTAsMCArMSwyODQgQEAKKy8qIGtlcm5lbC5jIC0gdGhlIEMgcGFydCBvZiB0aGUga2VybmVsICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTkgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICAgCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgKi8KKworI2luY2x1ZGUgPG11bHRpYm9vdC5oPgorCisvKiBNYWNyb3MuICAqLworCisvKiBDaGVjayBpZiB0aGUgYml0IEJJVCBpbiBGTEFHUyBpcyBzZXQuICAqLworI2RlZmluZSBDSEVDS19GTEFHKGZsYWdzLGJpdCkJKChmbGFncykgJiAoMSA8PCAoYml0KSkpCisKKy8qIFNvbWUgc2NyZWVuIHN0dWZmLiAgKi8KKy8qIFRoZSBudW1iZXIgb2YgY29sdW1ucy4gICovCisjZGVmaW5lIENPTFVNTlMJCQk4MAorLyogVGhlIG51bWJlciBvZiBsaW5lcy4gICovCisjZGVmaW5lIExJTkVTCQkJMjQKKy8qIFRoZSBhdHRyaWJ1dGUgb2YgYW4gY2hhcmFjdGVyLiAgKi8KKyNkZWZpbmUgQVRUUklCVVRFCQk3CisvKiBUaGUgdmlkZW8gbWVtb3J5IGFkZHJlc3MuICAqLworI2RlZmluZSBWSURFTwkJCTB4QjgwMDAKKworLyogVmFyaWFibGVzLiAgKi8KKy8qIFNhdmUgdGhlIFggcG9zaXRpb24uICAqLworc3RhdGljIGludCB4cG9zOworLyogU2F2ZSB0aGUgWSBwb3NpdGlvbi4gICovCitzdGF0aWMgaW50IHlwb3M7CisvKiBQb2ludCB0byB0aGUgdmlkZW8gbWVtb3J5LiAgKi8KK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICp2aWRlbzsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMuICAqLwordm9pZCBjbWFpbiAodW5zaWduZWQgbG9uZyBtYWdpYywgdW5zaWduZWQgbG9uZyBhZGRyKTsKK3N0YXRpYyB2b2lkIGNscyAodm9pZCk7CitzdGF0aWMgdm9pZCBpdG9hIChjaGFyICpidWYsIGludCBiYXNlLCBpbnQgZCk7CitzdGF0aWMgdm9pZCBwdXRjaGFyIChpbnQgYyk7Cit2b2lkIHByaW50ZiAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworCisvKiBDaGVjayBpZiBNQUdJQyBpcyB2YWxpZCBhbmQgcHJpbnQgdGhlIE11bHRpYm9vdCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKyAgIHBvaW50ZWQgYnkgQUREUi4gICovCit2b2lkCitjbWFpbiAodW5zaWduZWQgbG9uZyBtYWdpYywgdW5zaWduZWQgbG9uZyBhZGRyKQoreworICBtdWx0aWJvb3RfaW5mb190ICptYmk7CisgIAorICAvKiBDbGVhciB0aGUgc2NyZWVuLiAgKi8KKyAgY2xzICgpOworCisgIC8qIEFtIEkgYm9vdGVkIGJ5IGEgTXVsdGlib290LWNvbXBsaWFudCBib290IGxvYWRlcj8gICovCisgIGlmIChtYWdpYyAhPSBNVUxUSUJPT1RfQk9PVExPQURFUl9NQUdJQykKKyAgICB7CisgICAgICBwcmludGYgKCJJbnZhbGlkIG1hZ2ljIG51bWJlcjogMHgleFxuIiwgKHVuc2lnbmVkKSBtYWdpYyk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIFNldCBNQkkgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIE11bHRpYm9vdCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuICAqLworICBtYmkgPSAobXVsdGlib290X2luZm9fdCAqKSBhZGRyOworCisgIC8qIFByaW50IG91dCB0aGUgZmxhZ3MuICAqLworICBwcmludGYgKCJmbGFncyA9IDB4JXhcbiIsICh1bnNpZ25lZCkgbWJpLT5mbGFncyk7CisKKyAgLyogQXJlIG1lbV8qIHZhbGlkPyAgKi8KKyAgaWYgKENIRUNLX0ZMQUcgKG1iaS0+ZmxhZ3MsIDApKQorICAgIHByaW50ZiAoIm1lbV9sb3dlciA9ICV1S0IsIG1lbV91cHBlciA9ICV1S0JcbiIsCisJICAgICh1bnNpZ25lZCkgbWJpLT5tZW1fbG93ZXIsICh1bnNpZ25lZCkgbWJpLT5tZW1fdXBwZXIpOworCisgIC8qIElzIGJvb3RfZGV2aWNlIHZhbGlkPyAgKi8KKyAgaWYgKENIRUNLX0ZMQUcgKG1iaS0+ZmxhZ3MsIDEpKQorICAgIHByaW50ZiAoImJvb3RfZGV2aWNlID0gMHgleFxuIiwgKHVuc2lnbmVkKSBtYmktPmJvb3RfZGV2aWNlKTsKKyAgCisgIC8qIElzIHRoZSBjb21tYW5kIGxpbmUgcGFzc2VkPyAgKi8KKyAgaWYgKENIRUNLX0ZMQUcgKG1iaS0+ZmxhZ3MsIDIpKQorICAgIHByaW50ZiAoImNtZGxpbmUgPSAlc1xuIiwgKGNoYXIgKikgbWJpLT5jbWRsaW5lKTsKKworICAvKiBBcmUgbW9kc18qIHZhbGlkPyAgKi8KKyAgaWYgKENIRUNLX0ZMQUcgKG1iaS0+ZmxhZ3MsIDMpKQorICAgIHsKKyAgICAgIG1vZHVsZV90ICptb2Q7CisgICAgICBpbnQgaTsKKyAgICAgIAorICAgICAgcHJpbnRmICgibW9kc19jb3VudCA9ICVkLCBtb2RzX2FkZHIgPSAweCV4XG4iLAorCSAgICAgIChpbnQpIG1iaS0+bW9kc19jb3VudCwgKGludCkgbWJpLT5tb2RzX2FkZHIpOworICAgICAgZm9yIChpID0gMCwgbW9kID0gKG1vZHVsZV90ICopIG1iaS0+bW9kc19hZGRyOworCSAgIGkgPCBtYmktPm1vZHNfY291bnQ7CisJICAgaSsrLCBtb2QrKykKKwlwcmludGYgKCIgbW9kX3N0YXJ0ID0gMHgleCwgbW9kX2VuZCA9IDB4JXgsIHN0cmluZyA9ICVzXG4iLAorCQkodW5zaWduZWQpIG1vZC0+bW9kX3N0YXJ0LAorCQkodW5zaWduZWQpIG1vZC0+bW9kX2VuZCwKKwkJKGNoYXIgKikgbW9kLT5zdHJpbmcpOworICAgIH0KKworICAvKiBCaXRzIDQgYW5kIDUgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSEgICovCisgIGlmIChDSEVDS19GTEFHIChtYmktPmZsYWdzLCA0KSAmJiBDSEVDS19GTEFHIChtYmktPmZsYWdzLCA1KSkKKyAgICB7CisgICAgICBwcmludGYgKCJCb3RoIGJpdHMgNCBhbmQgNSBhcmUgc2V0LlxuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIElzIHRoZSBzeW1ib2wgdGFibGUgb2YgYS5vdXQgdmFsaWQ/ICAqLworICBpZiAoQ0hFQ0tfRkxBRyAobWJpLT5mbGFncywgNCkpCisgICAgeworICAgICAgYW91dF9zeW1ib2xfdGFibGVfdCAqYW91dF9zeW0gPSAmKG1iaS0+dS5hb3V0X3N5bSk7CisgICAgICAKKyAgICAgIHByaW50ZiAoImFvdXRfc3ltYm9sX3RhYmxlOiB0YWJzaXplID0gMHglMHgsICIKKwkgICAgICAic3Ryc2l6ZSA9IDB4JXgsIGFkZHIgPSAweCV4XG4iLAorCSAgICAgICh1bnNpZ25lZCkgYW91dF9zeW0tPnRhYnNpemUsCisJICAgICAgKHVuc2lnbmVkKSBhb3V0X3N5bS0+c3Ryc2l6ZSwKKwkgICAgICAodW5zaWduZWQpIGFvdXRfc3ltLT5hZGRyKTsKKyAgICB9CisKKyAgLyogSXMgdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlIG9mIEVMRiB2YWxpZD8gICovCisgIGlmIChDSEVDS19GTEFHIChtYmktPmZsYWdzLCA1KSkKKyAgICB7CisgICAgICBlbGZfc2VjdGlvbl9oZWFkZXJfdGFibGVfdCAqZWxmX3NlYyA9ICYobWJpLT51LmVsZl9zZWMpOworCisgICAgICBwcmludGYgKCJlbGZfc2VjOiBudW0gPSAldSwgc2l6ZSA9IDB4JXgsIgorCSAgICAgICIgYWRkciA9IDB4JXgsIHNobmR4ID0gMHgleFxuIiwKKwkgICAgICAodW5zaWduZWQpIGVsZl9zZWMtPm51bSwgKHVuc2lnbmVkKSBlbGZfc2VjLT5zaXplLAorCSAgICAgICh1bnNpZ25lZCkgZWxmX3NlYy0+YWRkciwgKHVuc2lnbmVkKSBlbGZfc2VjLT5zaG5keCk7CisgICAgfQorCisgIC8qIEFyZSBtbWFwXyogdmFsaWQ/ICAqLworICBpZiAoQ0hFQ0tfRkxBRyAobWJpLT5mbGFncywgNikpCisgICAgeworICAgICAgbWVtb3J5X21hcF90ICptbWFwOworICAgICAgCisgICAgICBwcmludGYgKCJtbWFwX2FkZHIgPSAweCV4LCBtbWFwX2xlbmd0aCA9IDB4JXhcbiIsCisJICAgICAgKHVuc2lnbmVkKSBtYmktPm1tYXBfYWRkciwgKHVuc2lnbmVkKSBtYmktPm1tYXBfbGVuZ3RoKTsKKyAgICAgIGZvciAobW1hcCA9IChtZW1vcnlfbWFwX3QgKikgbWJpLT5tbWFwX2FkZHI7CisJICAgKHVuc2lnbmVkIGxvbmcpIG1tYXAgPCBtYmktPm1tYXBfYWRkciArIG1iaS0+bW1hcF9sZW5ndGg7CisJICAgbW1hcCA9IChtZW1vcnlfbWFwX3QgKikgKCh1bnNpZ25lZCBsb25nKSBtbWFwCisJCQkJICAgICsgbW1hcC0+c2l6ZSArIHNpemVvZiAobW1hcC0+c2l6ZSkpKQorCXByaW50ZiAoIiBzaXplID0gMHgleCwgYmFzZV9hZGRyID0gMHgleCV4LCIKKwkJIiBsZW5ndGggPSAweCV4JXgsIHR5cGUgPSAweCV4XG4iLAorCQkodW5zaWduZWQpIG1tYXAtPnNpemUsCisJCSh1bnNpZ25lZCkgbW1hcC0+YmFzZV9hZGRyX2hpZ2gsCisJCSh1bnNpZ25lZCkgbW1hcC0+YmFzZV9hZGRyX2xvdywKKwkJKHVuc2lnbmVkKSBtbWFwLT5sZW5ndGhfaGlnaCwKKwkJKHVuc2lnbmVkKSBtbWFwLT5sZW5ndGhfbG93LAorCQkodW5zaWduZWQpIG1tYXAtPnR5cGUpOworICAgIH0KK30gICAgCisKKy8qIENsZWFyIHRoZSBzY3JlZW4gYW5kIGluaXRpYWxpemUgVklERU8sIFhQT1MgYW5kIFlQT1MuICAqLworc3RhdGljIHZvaWQKK2NscyAodm9pZCkKK3sKKyAgaW50IGk7CisKKyAgdmlkZW8gPSAodW5zaWduZWQgY2hhciAqKSBWSURFTzsKKyAgCisgIGZvciAoaSA9IDA7IGkgPCBDT0xVTU5TICogTElORVMgKiAyOyBpKyspCisgICAgKih2aWRlbyArIGkpID0gMDsKKworICB4cG9zID0gMDsKKyAgeXBvcyA9IDA7Cit9CisKKy8qIENvbnZlcnQgdGhlIGludGVnZXIgRCB0byBhIHN0cmluZyBhbmQgc2F2ZSB0aGUgc3RyaW5nIGluIEJVRi4gSWYKKyAgIEJBU0UgaXMgZXF1YWwgdG8gJ2QnLCBpbnRlcnByZXQgdGhhdCBEIGlzIGRlY2ltYWwsIGFuZCBpZiBCQVNFIGlzCisgICBlcXVhbCB0byAneCcsIGludGVycHJldCB0aGF0IEQgaXMgaGV4YWRlY2ltYWwuICAqLworc3RhdGljIHZvaWQKK2l0b2EgKGNoYXIgKmJ1ZiwgaW50IGJhc2UsIGludCBkKQoreworICBjaGFyICpwID0gYnVmOworICBjaGFyICpwMSwgKnAyOworICB1bnNpZ25lZCBsb25nIHVkID0gZDsKKyAgaW50IGRpdmlzb3IgPSAxMDsKKyAgCisgIC8qIElmICVkIGlzIHNwZWNpZmllZCBhbmQgRCBpcyBtaW51cywgcHV0IGAtJyBpbiB0aGUgaGVhZC4gICovCisgIGlmIChiYXNlID09ICdkJyAmJiBkIDwgMCkKKyAgICB7CisgICAgICAqcCsrID0gJy0nOworICAgICAgYnVmKys7CisgICAgICB1ZCA9IC1kOworICAgIH0KKyAgZWxzZSBpZiAoYmFzZSA9PSAneCcpCisgICAgZGl2aXNvciA9IDE2OworCisgIC8qIERpdmlkZSBVRCBieSBESVZJU09SIHVudGlsIFVEID09IDAuICAqLworICBkbworICAgIHsKKyAgICAgIGludCByZW1haW5kZXIgPSB1ZCAlIGRpdmlzb3I7CisgICAgICAKKyAgICAgICpwKysgPSAocmVtYWluZGVyIDwgMTApID8gcmVtYWluZGVyICsgJzAnIDogcmVtYWluZGVyICsgJ2EnIC0gMTA7CisgICAgfQorICB3aGlsZSAodWQgLz0gZGl2aXNvcik7CisKKyAgLyogVGVybWluYXRlIEJVRi4gICovCisgICpwID0gMDsKKyAgCisgIC8qIFJldmVyc2UgQlVGLiAgKi8KKyAgcDEgPSBidWY7CisgIHAyID0gcCAtIDE7CisgIHdoaWxlIChwMSA8IHAyKQorICAgIHsKKyAgICAgIGNoYXIgdG1wID0gKnAxOworICAgICAgKnAxID0gKnAyOworICAgICAgKnAyID0gdG1wOworICAgICAgcDErKzsKKyAgICAgIHAyLS07CisgICAgfQorfQorCisvKiBQdXQgdGhlIGNoYXJhY3RlciBDIG9uIHRoZSBzY3JlZW4uICAqLworc3RhdGljIHZvaWQKK3B1dGNoYXIgKGludCBjKQoreworICBpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJykKKyAgICB7CisgICAgbmV3bGluZToKKyAgICAgIHhwb3MgPSAwOworICAgICAgeXBvcysrOworICAgICAgaWYgKHlwb3MgPj0gTElORVMpCisJeXBvcyA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorCisgICoodmlkZW8gKyAoeHBvcyArIHlwb3MgKiBDT0xVTU5TKSAqIDIpID0gYyAmIDB4RkY7CisgICoodmlkZW8gKyAoeHBvcyArIHlwb3MgKiBDT0xVTU5TKSAqIDIgKyAxKSA9IEFUVFJJQlVURTsKKworICB4cG9zKys7CisgIGlmICh4cG9zID49IENPTFVNTlMpCisgICAgZ290byBuZXdsaW5lOworfQorCisvKiBGb3JtYXQgYSBzdHJpbmcgYW5kIHByaW50IGl0IG9uIHRoZSBzY3JlZW4sIGp1c3QgbGlrZSB0aGUgbGliYworICAgZnVuY3Rpb24gcHJpbnRmLiAgKi8KK3ZvaWQKK3ByaW50ZiAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgIGNoYXIgKiphcmcgPSAoY2hhciAqKikgJmZvcm1hdDsKKyAgaW50IGM7CisgIGNoYXIgYnVmWzIwXTsKKworICBhcmcrKzsKKyAgCisgIHdoaWxlICgoYyA9ICpmb3JtYXQrKykgIT0gMCkKKyAgICB7CisgICAgICBpZiAoYyAhPSAnJScpCisJcHV0Y2hhciAoYyk7CisgICAgICBlbHNlCisJeworCSAgY2hhciAqcDsKKwkgIAorCSAgYyA9ICpmb3JtYXQrKzsKKwkgIHN3aXRjaCAoYykKKwkgICAgeworCSAgICBjYXNlICdkJzoKKwkgICAgY2FzZSAndSc6CisJICAgIGNhc2UgJ3gnOgorCSAgICAgIGl0b2EgKGJ1ZiwgYywgKigoaW50ICopIGFyZysrKSk7CisJICAgICAgcCA9IGJ1ZjsKKwkgICAgICBnb3RvIHN0cmluZzsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICdzJzoKKwkgICAgICBwID0gKmFyZysrOworCSAgICAgIGlmICghIHApCisJCXAgPSAiKG51bGwpIjsKKworCSAgICBzdHJpbmc6CisJICAgICAgd2hpbGUgKCpwKQorCQlwdXRjaGFyICgqcCsrKTsKKwkgICAgICBicmVhazsKKworCSAgICBkZWZhdWx0OgorCSAgICAgIHB1dGNoYXIgKCooKGludCAqKSBhcmcrKykpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2RvY3Mva2VybmVsLmMudGV4aSBiL2RvY3Mva2VybmVsLmMudGV4aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDYxYmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9rZXJuZWwuYy50ZXhpCkBAIC0wLDAgKzEsMjg0IEBACisvKiBAcntrZXJuZWwuYyAtIHRoZSBDIHBhcnQgb2YgdGhlIGtlcm5lbH0gKi8KKy8qIEBye0NvcHlyaWdodCAoQykgMTk5OSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICAKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EufSAqLworCisjaW5jbHVkZSA8bXVsdGlib290Lmg+CisKKy8qIEBye01hY3Jvcy59ICovCisKKy8qIEBye0NoZWNrIGlmIHRoZSBiaXQgQklUIGluIEZMQUdTIGlzIHNldC59ICovCisjZGVmaW5lIENIRUNLX0ZMQUcoZmxhZ3MsYml0KSAgICgoZmxhZ3MpICYgKDEgPDwgKGJpdCkpKQorCisvKiBAcntTb21lIHNjcmVlbiBzdHVmZi59ICovCisvKiBAcntUaGUgbnVtYmVyIG9mIGNvbHVtbnMufSAqLworI2RlZmluZSBDT0xVTU5TICAgICAgICAgICAgICAgICA4MAorLyogQHJ7VGhlIG51bWJlciBvZiBsaW5lcy59ICovCisjZGVmaW5lIExJTkVTICAgICAgICAgICAgICAgICAgIDI0CisvKiBAcntUaGUgYXR0cmlidXRlIG9mIGFuIGNoYXJhY3Rlci59ICovCisjZGVmaW5lIEFUVFJJQlVURSAgICAgICAgICAgICAgIDcKKy8qIEBye1RoZSB2aWRlbyBtZW1vcnkgYWRkcmVzcy59ICovCisjZGVmaW5lIFZJREVPICAgICAgICAgICAgICAgICAgIDB4QjgwMDAKKworLyogQHJ7VmFyaWFibGVzLn0gKi8KKy8qIEBye1NhdmUgdGhlIFggcG9zaXRpb24ufSAqLworc3RhdGljIGludCB4cG9zOworLyogQHJ7U2F2ZSB0aGUgWSBwb3NpdGlvbi59ICovCitzdGF0aWMgaW50IHlwb3M7CisvKiBAcntQb2ludCB0byB0aGUgdmlkZW8gbWVtb3J5Ln0gKi8KK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICp2aWRlbzsKKworLyogQHJ7Rm9yd2FyZCBkZWNsYXJhdGlvbnMufSAqLwordm9pZCBjbWFpbiAodW5zaWduZWQgbG9uZyBtYWdpYywgdW5zaWduZWQgbG9uZyBhZGRyKTsKK3N0YXRpYyB2b2lkIGNscyAodm9pZCk7CitzdGF0aWMgdm9pZCBpdG9hIChjaGFyICpidWYsIGludCBiYXNlLCBpbnQgZCk7CitzdGF0aWMgdm9pZCBwdXRjaGFyIChpbnQgYyk7Cit2b2lkIHByaW50ZiAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworCisvKiBAcntDaGVjayBpZiBNQUdJQyBpcyB2YWxpZCBhbmQgcHJpbnQgdGhlIE11bHRpYm9vdCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKyAgIHBvaW50ZWQgYnkgQUREUi59ICovCit2b2lkCitjbWFpbiAodW5zaWduZWQgbG9uZyBtYWdpYywgdW5zaWduZWQgbG9uZyBhZGRyKQorQHsKKyAgbXVsdGlib290X2luZm9fdCAqbWJpOworICAKKyAgLyogQHJ7Q2xlYXIgdGhlIHNjcmVlbi59ICovCisgIGNscyAoKTsKKworICAvKiBAcntBbSBJIGJvb3RlZCBieSBhIE11bHRpYm9vdC1jb21wbGlhbnQgYm9vdCBsb2FkZXI/fSAqLworICBpZiAobWFnaWMgIT0gTVVMVElCT09UX0JPT1RMT0FERVJfTUFHSUMpCisgICAgQHsKKyAgICAgIHByaW50ZiAoIkludmFsaWQgbWFnaWMgbnVtYmVyOiAweCV4XG4iLCAodW5zaWduZWQpIG1hZ2ljKTsKKyAgICAgIHJldHVybjsKKyAgICBAfQorCisgIC8qIEBye1NldCBNQkkgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIE11bHRpYm9vdCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUufSAqLworICBtYmkgPSAobXVsdGlib290X2luZm9fdCAqKSBhZGRyOworCisgIC8qIEBye1ByaW50IG91dCB0aGUgZmxhZ3MufSAqLworICBwcmludGYgKCJmbGFncyA9IDB4JXhcbiIsICh1bnNpZ25lZCkgbWJpLT5mbGFncyk7CisKKyAgLyogQHJ7QXJlIG1lbV8qIHZhbGlkP30gKi8KKyAgaWYgKENIRUNLX0ZMQUcgKG1iaS0+ZmxhZ3MsIDApKQorICAgIHByaW50ZiAoIm1lbV9sb3dlciA9ICV1S0IsIG1lbV91cHBlciA9ICV1S0JcbiIsCisgICAgICAgICAgICAodW5zaWduZWQpIG1iaS0+bWVtX2xvd2VyLCAodW5zaWduZWQpIG1iaS0+bWVtX3VwcGVyKTsKKworICAvKiBAcntJcyBib290X2RldmljZSB2YWxpZD99ICovCisgIGlmIChDSEVDS19GTEFHIChtYmktPmZsYWdzLCAxKSkKKyAgICBwcmludGYgKCJib290X2RldmljZSA9IDB4JXhcbiIsICh1bnNpZ25lZCkgbWJpLT5ib290X2RldmljZSk7CisgIAorICAvKiBAcntJcyB0aGUgY29tbWFuZCBsaW5lIHBhc3NlZD99ICovCisgIGlmIChDSEVDS19GTEFHIChtYmktPmZsYWdzLCAyKSkKKyAgICBwcmludGYgKCJjbWRsaW5lID0gJXNcbiIsIChjaGFyICopIG1iaS0+Y21kbGluZSk7CisKKyAgLyogQHJ7QXJlIG1vZHNfKiB2YWxpZD99ICovCisgIGlmIChDSEVDS19GTEFHIChtYmktPmZsYWdzLCAzKSkKKyAgICBAeworICAgICAgbW9kdWxlX3QgKm1vZDsKKyAgICAgIGludCBpOworICAgICAgCisgICAgICBwcmludGYgKCJtb2RzX2NvdW50ID0gJWQsIG1vZHNfYWRkciA9IDB4JXhcbiIsCisgICAgICAgICAgICAgIChpbnQpIG1iaS0+bW9kc19jb3VudCwgKGludCkgbWJpLT5tb2RzX2FkZHIpOworICAgICAgZm9yIChpID0gMCwgbW9kID0gKG1vZHVsZV90ICopIG1iaS0+bW9kc19hZGRyOworICAgICAgICAgICBpIDwgbWJpLT5tb2RzX2NvdW50OworICAgICAgICAgICBpKyssIG1vZCsrKQorICAgICAgICBwcmludGYgKCIgbW9kX3N0YXJ0ID0gMHgleCwgbW9kX2VuZCA9IDB4JXgsIHN0cmluZyA9ICVzXG4iLAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCkgbW9kLT5tb2Rfc3RhcnQsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBtb2QtPm1vZF9lbmQsCisgICAgICAgICAgICAgICAgKGNoYXIgKikgbW9kLT5zdHJpbmcpOworICAgIEB9CisKKyAgLyogQHJ7Qml0cyA0IGFuZCA1IGFyZSBtdXR1YWxseSBleGNsdXNpdmUhfSAqLworICBpZiAoQ0hFQ0tfRkxBRyAobWJpLT5mbGFncywgNCkgJiYgQ0hFQ0tfRkxBRyAobWJpLT5mbGFncywgNSkpCisgICAgQHsKKyAgICAgIHByaW50ZiAoIkJvdGggYml0cyA0IGFuZCA1IGFyZSBzZXQuXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICBAfQorCisgIC8qIEBye0lzIHRoZSBzeW1ib2wgdGFibGUgb2YgYS5vdXQgdmFsaWQ/fSAqLworICBpZiAoQ0hFQ0tfRkxBRyAobWJpLT5mbGFncywgNCkpCisgICAgQHsKKyAgICAgIGFvdXRfc3ltYm9sX3RhYmxlX3QgKmFvdXRfc3ltID0gJihtYmktPnUuYW91dF9zeW0pOworICAgICAgCisgICAgICBwcmludGYgKCJhb3V0X3N5bWJvbF90YWJsZTogdGFic2l6ZSA9IDB4JTB4LCAiCisgICAgICAgICAgICAgICJzdHJzaXplID0gMHgleCwgYWRkciA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICh1bnNpZ25lZCkgYW91dF9zeW0tPnRhYnNpemUsCisgICAgICAgICAgICAgICh1bnNpZ25lZCkgYW91dF9zeW0tPnN0cnNpemUsCisgICAgICAgICAgICAgICh1bnNpZ25lZCkgYW91dF9zeW0tPmFkZHIpOworICAgIEB9CisKKyAgLyogQHJ7SXMgdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlIG9mIEVMRiB2YWxpZD99ICovCisgIGlmIChDSEVDS19GTEFHIChtYmktPmZsYWdzLCA1KSkKKyAgICBAeworICAgICAgZWxmX3NlY3Rpb25faGVhZGVyX3RhYmxlX3QgKmVsZl9zZWMgPSAmKG1iaS0+dS5lbGZfc2VjKTsKKworICAgICAgcHJpbnRmICgiZWxmX3NlYzogbnVtID0gJXUsIHNpemUgPSAweCV4LCIKKyAgICAgICAgICAgICAgIiBhZGRyID0gMHgleCwgc2huZHggPSAweCV4XG4iLAorICAgICAgICAgICAgICAodW5zaWduZWQpIGVsZl9zZWMtPm51bSwgKHVuc2lnbmVkKSBlbGZfc2VjLT5zaXplLAorICAgICAgICAgICAgICAodW5zaWduZWQpIGVsZl9zZWMtPmFkZHIsICh1bnNpZ25lZCkgZWxmX3NlYy0+c2huZHgpOworICAgIEB9CisKKyAgLyogQHJ7QXJlIG1tYXBfKiB2YWxpZD99ICovCisgIGlmIChDSEVDS19GTEFHIChtYmktPmZsYWdzLCA2KSkKKyAgICBAeworICAgICAgbWVtb3J5X21hcF90ICptbWFwOworICAgICAgCisgICAgICBwcmludGYgKCJtbWFwX2FkZHIgPSAweCV4LCBtbWFwX2xlbmd0aCA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICh1bnNpZ25lZCkgbWJpLT5tbWFwX2FkZHIsICh1bnNpZ25lZCkgbWJpLT5tbWFwX2xlbmd0aCk7CisgICAgICBmb3IgKG1tYXAgPSAobWVtb3J5X21hcF90ICopIG1iaS0+bW1hcF9hZGRyOworICAgICAgICAgICAodW5zaWduZWQgbG9uZykgbW1hcCA8IG1iaS0+bW1hcF9hZGRyICsgbWJpLT5tbWFwX2xlbmd0aDsKKyAgICAgICAgICAgbW1hcCA9IChtZW1vcnlfbWFwX3QgKikgKCh1bnNpZ25lZCBsb25nKSBtbWFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1tYXAtPnNpemUgKyBzaXplb2YgKG1tYXAtPnNpemUpKSkKKyAgICAgICAgcHJpbnRmICgiIHNpemUgPSAweCV4LCBiYXNlX2FkZHIgPSAweCV4JXgsIgorICAgICAgICAgICAgICAgICIgbGVuZ3RoID0gMHgleCV4LCB0eXBlID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQpIG1tYXAtPnNpemUsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBtbWFwLT5iYXNlX2FkZHJfaGlnaCwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQpIG1tYXAtPmJhc2VfYWRkcl9sb3csCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBtbWFwLT5sZW5ndGhfaGlnaCwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQpIG1tYXAtPmxlbmd0aF9sb3csCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBtbWFwLT50eXBlKTsKKyAgICBAfQorQH0gICAgCisKKy8qIEBye0NsZWFyIHRoZSBzY3JlZW4gYW5kIGluaXRpYWxpemUgVklERU8sIFhQT1MgYW5kIFlQT1MufSAqLworc3RhdGljIHZvaWQKK2NscyAodm9pZCkKK0B7CisgIGludCBpOworCisgIHZpZGVvID0gKHVuc2lnbmVkIGNoYXIgKikgVklERU87CisgIAorICBmb3IgKGkgPSAwOyBpIDwgQ09MVU1OUyAqIExJTkVTICogMjsgaSsrKQorICAgICoodmlkZW8gKyBpKSA9IDA7CisKKyAgeHBvcyA9IDA7CisgIHlwb3MgPSAwOworQH0KKworLyogQHJ7Q29udmVydCB0aGUgaW50ZWdlciBEIHRvIGEgc3RyaW5nIGFuZCBzYXZlIHRoZSBzdHJpbmcgaW4gQlVGLiBJZgorICAgQkFTRSBpcyBlcXVhbCB0byAnZCcsIGludGVycHJldCB0aGF0IEQgaXMgZGVjaW1hbCwgYW5kIGlmIEJBU0UgaXMKKyAgIGVxdWFsIHRvICd4JywgaW50ZXJwcmV0IHRoYXQgRCBpcyBoZXhhZGVjaW1hbC59ICovCitzdGF0aWMgdm9pZAoraXRvYSAoY2hhciAqYnVmLCBpbnQgYmFzZSwgaW50IGQpCitAeworICBjaGFyICpwID0gYnVmOworICBjaGFyICpwMSwgKnAyOworICB1bnNpZ25lZCBsb25nIHVkID0gZDsKKyAgaW50IGRpdmlzb3IgPSAxMDsKKyAgCisgIC8qIEBye0lmICVkIGlzIHNwZWNpZmllZCBhbmQgRCBpcyBtaW51cywgcHV0IGAtJyBpbiB0aGUgaGVhZC59ICovCisgIGlmIChiYXNlID09ICdkJyAmJiBkIDwgMCkKKyAgICBAeworICAgICAgKnArKyA9ICctJzsKKyAgICAgIGJ1ZisrOworICAgICAgdWQgPSAtZDsKKyAgICBAfQorICBlbHNlIGlmIChiYXNlID09ICd4JykKKyAgICBkaXZpc29yID0gMTY7CisKKyAgLyogQHJ7RGl2aWRlIFVEIGJ5IERJVklTT1IgdW50aWwgVUQgPT0gMC59ICovCisgIGRvCisgICAgQHsKKyAgICAgIGludCByZW1haW5kZXIgPSB1ZCAlIGRpdmlzb3I7CisgICAgICAKKyAgICAgICpwKysgPSAocmVtYWluZGVyIDwgMTApID8gcmVtYWluZGVyICsgJzAnIDogcmVtYWluZGVyICsgJ2EnIC0gMTA7CisgICAgQH0KKyAgd2hpbGUgKHVkIC89IGRpdmlzb3IpOworCisgIC8qIEBye1Rlcm1pbmF0ZSBCVUYufSAqLworICAqcCA9IDA7CisgIAorICAvKiBAcntSZXZlcnNlIEJVRi59ICovCisgIHAxID0gYnVmOworICBwMiA9IHAgLSAxOworICB3aGlsZSAocDEgPCBwMikKKyAgICBAeworICAgICAgY2hhciB0bXAgPSAqcDE7CisgICAgICAqcDEgPSAqcDI7CisgICAgICAqcDIgPSB0bXA7CisgICAgICBwMSsrOworICAgICAgcDItLTsKKyAgICBAfQorQH0KKworLyogQHJ7UHV0IHRoZSBjaGFyYWN0ZXIgQyBvbiB0aGUgc2NyZWVuLn0gKi8KK3N0YXRpYyB2b2lkCitwdXRjaGFyIChpbnQgYykKK0B7CisgIGlmIChjID09ICdcbicgfHwgYyA9PSAnXHInKQorICAgIEB7CisgICAgbmV3bGluZToKKyAgICAgIHhwb3MgPSAwOworICAgICAgeXBvcysrOworICAgICAgaWYgKHlwb3MgPj0gTElORVMpCisgICAgICAgIHlwb3MgPSAwOworICAgICAgcmV0dXJuOworICAgIEB9CisKKyAgKih2aWRlbyArICh4cG9zICsgeXBvcyAqIENPTFVNTlMpICogMikgPSBjICYgMHhGRjsKKyAgKih2aWRlbyArICh4cG9zICsgeXBvcyAqIENPTFVNTlMpICogMiArIDEpID0gQVRUUklCVVRFOworCisgIHhwb3MrKzsKKyAgaWYgKHhwb3MgPj0gQ09MVU1OUykKKyAgICBnb3RvIG5ld2xpbmU7CitAfQorCisvKiBAcntGb3JtYXQgYSBzdHJpbmcgYW5kIHByaW50IGl0IG9uIHRoZSBzY3JlZW4sIGp1c3QgbGlrZSB0aGUgbGliYworICAgZnVuY3Rpb24gcHJpbnRmLn0gKi8KK3ZvaWQKK3ByaW50ZiAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCitAeworICBjaGFyICoqYXJnID0gKGNoYXIgKiopICZmb3JtYXQ7CisgIGludCBjOworICBjaGFyIGJ1ZlsyMF07CisKKyAgYXJnKys7CisgIAorICB3aGlsZSAoKGMgPSAqZm9ybWF0KyspICE9IDApCisgICAgQHsKKyAgICAgIGlmIChjICE9ICclJykKKyAgICAgICAgcHV0Y2hhciAoYyk7CisgICAgICBlbHNlCisgICAgICAgIEB7CisgICAgICAgICAgY2hhciAqcDsKKyAgICAgICAgICAKKyAgICAgICAgICBjID0gKmZvcm1hdCsrOworICAgICAgICAgIHN3aXRjaCAoYykKKyAgICAgICAgICAgIEB7CisgICAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgIGNhc2UgJ3UnOgorICAgICAgICAgICAgY2FzZSAneCc6CisgICAgICAgICAgICAgIGl0b2EgKGJ1ZiwgYywgKigoaW50ICopIGFyZysrKSk7CisgICAgICAgICAgICAgIHAgPSBidWY7CisgICAgICAgICAgICAgIGdvdG8gc3RyaW5nOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICAgIHAgPSAqYXJnKys7CisgICAgICAgICAgICAgIGlmICghIHApCisgICAgICAgICAgICAgICAgcCA9ICIobnVsbCkiOworCisgICAgICAgICAgICBzdHJpbmc6CisgICAgICAgICAgICAgIHdoaWxlICgqcCkKKyAgICAgICAgICAgICAgICBwdXRjaGFyICgqcCsrKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHB1dGNoYXIgKCooKGludCAqKSBhcmcrKykpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIEB9CisgICAgICAgIEB9CisgICAgQH0KK0B9CmRpZmYgLS1naXQgYS9kb2NzL21iY2hrLjEgYi9kb2NzL21iY2hrLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZmM2ZiZAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvbWJjaGsuMQpAQCAtMCwwICsxLDI3IEBACisuXCIgRE8gTk9UIE1PRElGWSBUSElTIEZJTEUhICBJdCB3YXMgZ2VuZXJhdGVkIGJ5IGhlbHAybWFuIDEuMjMuCisuVEggTUJDSEsgIjEiICJNYXkgMjAwNSIgIm1iY2hrIChHTlUgR1JVQiAwLjk3KSIgRlNGCisuU0ggTkFNRQorbWJjaGsgXC0gY2hlY2sgdGhlIGZvcm1hdCBvZiBhIE11bHRpYm9vdCBrZXJuZWwKKy5TSCBTWU5PUFNJUworLkIgbWJjaGsKK1tcZklPUFRJT05cZlJdLi4uIFtcZklGSUxFXGZSXS4uLgorLlNIIERFU0NSSVBUSU9OCitDaGVjayBpZiB0aGUgZm9ybWF0IG9mIEZJTEUgY29tcGxpZXMgd2l0aCB0aGUgTXVsdGlib290IFNwZWNpZmljYXRpb24uCisuUFAKK1xmQlwtcVxmUiwgXGZCXC1cLXF1aWV0XGZSICAgICAgICAgICAgICAgIHN1cHByZXNzIGFsbCBub3JtYWwgb3V0cHV0CitcZkJcLWhcZlIsIFxmQlwtXC1oZWxwXGZSICAgICAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAorXGZCXC12XGZSLCBcZkJcLVwtdmVyc2lvblxmUiAgICAgICAgICAgICAgb3V0cHV0IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQuCisuU0ggIlJFUE9SVElORyBCVUdTIgorUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1ncnViQGdudS5vcmc+LgorLlNIICJTRUUgQUxTTyIKK1RoZSBmdWxsIGRvY3VtZW50YXRpb24gZm9yCisuQiBtYmNoaworaXMgbWFpbnRhaW5lZCBhcyBhIFRleGluZm8gbWFudWFsLiAgSWYgdGhlCisuQiBpbmZvCithbmQKKy5CIG1iY2hrCitwcm9ncmFtcyBhcmUgcHJvcGVybHkgaW5zdGFsbGVkIGF0IHlvdXIgc2l0ZSwgdGhlIGNvbW1hbmQKKy5JUAorLkIgaW5mbyBtYmNoaworLlBQCitzaG91bGQgZ2l2ZSB5b3UgYWNjZXNzIHRvIHRoZSBjb21wbGV0ZSBtYW51YWwuCmRpZmYgLS1naXQgYS9kb2NzL21kYXRlLXNoIGIvZG9jcy9tZGF0ZS1zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ODE3ODJlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9tZGF0ZS1zaApAQCAtMCwwICsxLDE3MCBAQAorIyEvYmluL3NoCisjIEdldCBtb2RpZmljYXRpb24gdGltZSBvZiBhIGZpbGUgb3IgZGlyZWN0b3J5IGFuZCBwcmV0dHktcHJpbnQgaXQuCisKK3NjcmlwdHZlcnNpb249MjAwNC0xMi0wOC4xMgorCisjIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMjAwMywgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgd3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIEp1bmUgMTk5NQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBUaGlzIGZpbGUgaXMgbWFpbnRhaW5lZCBpbiBBdXRvbWFrZSwgcGxlYXNlIHJlcG9ydAorIyBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4gb3Igc2VuZCBwYXRjaGVzIHRvCisjIDxhdXRvbWFrZS1wYXRjaGVzQGdudS5vcmc+LgorCitjYXNlICQxIGluCisgICcnKQorICAgICBlY2hvICIkMDogTm8gZmlsZS4gIFRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCisgICAgIGV4aXQgMTsKKyAgICAgOzsKKyAgLWggfCAtLWgqKQorICAgIGNhdCA8PFxFT0YKK1VzYWdlOiBtZGF0ZS1zaCBbLS1oZWxwXSBbLS12ZXJzaW9uXSBGSUxFCisKK1ByZXR0eS1wcmludCB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YgRklMRS4KKworUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPi4KK0VPRgorICAgIGV4aXQgMAorICAgIDs7CisgIC12IHwgLS12KikKKyAgICBlY2hvICJtZGF0ZS1zaCAkc2NyaXB0dmVyc2lvbiIKKyAgICBleGl0IDAKKyAgICA7OworZXNhYworCisjIFByZXZlbnQgZGF0ZSBnaXZpbmcgcmVzcG9uc2UgaW4gYW5vdGhlciBsYW5ndWFnZS4KK0xBTkc9QworZXhwb3J0IExBTkcKK0xDX0FMTD1DCitleHBvcnQgTENfQUxMCitMQ19USU1FPUMKK2V4cG9ydCBMQ19USU1FCisKK3NhdmVfYXJnMT0iJDEiCisKKyMgRmluZCBvdXQgaG93IHRvIGdldCB0aGUgZXh0ZW5kZWQgbHMgb3V0cHV0IG9mIGEgZmlsZSBvciBkaXJlY3RvcnkuCitpZiBscyAtTCAvZGV2L251bGwgMT4vZGV2L251bGwgMj4mMTsgdGhlbgorICBsc19jb21tYW5kPSdscyAtTCAtbCAtZCcKK2Vsc2UKKyAgbHNfY29tbWFuZD0nbHMgLWwgLWQnCitmaQorCisjIEEgYGxzIC1sJyBsaW5lIGxvb2tzIGFzIGZvbGxvd3Mgb24gT1MvMi4KKyMgIGRyd3hyd3gtLS0gICAgICAgIDAgQXVnIDExICAyMDAxIGZvbworIyBUaGlzIGRpZmZlcnMgZnJvbSBVbml4LCB3aGljaCBhZGRzIG93bmVyc2hpcCBpbmZvcm1hdGlvbi4KKyMgIGRyd3hyd3gtLS0gICAyIHJvb3QgIHJvb3QgICAgICA0MDk2IEF1ZyAxMSAgMjAwMSBmb28KKyMKKyMgVG8gZmluZCB0aGUgZGF0ZSwgd2Ugc3BsaXQgdGhlIGxpbmUgb24gc3BhY2VzIGFuZCBpdGVyYXRlIG9uIHdvcmRzCisjIHVudGlsIHdlIGZpbmQgYSBtb250aC4gIFRoaXMgY2Fubm90IHdvcmsgd2l0aCBmaWxlcyB3aG9zZSBvd25lciBpcyBhCisjIHVzZXIgbmFtZWQgYEphbicsIG9yIGBGZWInLCBldGMuICBIb3dldmVyLCBpdCdzIHVubGlrZWx5IHRoYXQgYC8nCisjIHdpbGwgYmUgb3duZWQgYnkgYSB1c2VyIHdob3NlIG5hbWUgaXMgYSBtb250aC4gIFNvIHdlIGZpcnN0IGxvb2sgYXQKKyMgdGhlIGV4dGVuZGVkIGxzIG91dHB1dCBvZiB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gZGVjaWRlIGhvdyBtYW55CisjIHdvcmRzIHNob3VsZCBiZSBza2lwcGVkIHRvIGdldCB0aGUgZGF0ZS4KKworIyBPbiBIUFVYIC9iaW4vc2gsICJzZXQiIGludGVycHJldHMgIi1ydy1yLS1yLS0iIGFzIG9wdGlvbnMsIHNvIHRoZSAieCIgYmVsb3cuCitzZXQgeGBscyAtbCAtZCAvYAorCisjIEZpbmQgd2hpY2ggYXJndW1lbnQgaXMgdGhlIG1vbnRoLgorbW9udGg9Citjb21tYW5kPQordW50aWwgdGVzdCAkbW9udGgKK2RvCisgIHNoaWZ0CisgICMgQWRkIGFub3RoZXIgc2hpZnQgdG8gdGhlIGNvbW1hbmQuCisgIGNvbW1hbmQ9IiRjb21tYW5kIHNoaWZ0OyIKKyAgY2FzZSAkMSBpbgorICAgIEphbikgbW9udGg9SmFudWFyeTsgbnVtbW9udGg9MTs7CisgICAgRmViKSBtb250aD1GZWJydWFyeTsgbnVtbW9udGg9Mjs7CisgICAgTWFyKSBtb250aD1NYXJjaDsgbnVtbW9udGg9Mzs7CisgICAgQXByKSBtb250aD1BcHJpbDsgbnVtbW9udGg9NDs7CisgICAgTWF5KSBtb250aD1NYXk7IG51bW1vbnRoPTU7OworICAgIEp1bikgbW9udGg9SnVuZTsgbnVtbW9udGg9Njs7CisgICAgSnVsKSBtb250aD1KdWx5OyBudW1tb250aD03OzsKKyAgICBBdWcpIG1vbnRoPUF1Z3VzdDsgbnVtbW9udGg9ODs7CisgICAgU2VwKSBtb250aD1TZXB0ZW1iZXI7IG51bW1vbnRoPTk7OworICAgIE9jdCkgbW9udGg9T2N0b2JlcjsgbnVtbW9udGg9MTA7OworICAgIE5vdikgbW9udGg9Tm92ZW1iZXI7IG51bW1vbnRoPTExOzsKKyAgICBEZWMpIG1vbnRoPURlY2VtYmVyOyBudW1tb250aD0xMjs7CisgIGVzYWMKK2RvbmUKKworIyBHZXQgdGhlIGV4dGVuZGVkIGxzIG91dHB1dCBvZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkuCitzZXQgeGBldmFsICIkbHNfY29tbWFuZCBcIlwkc2F2ZV9hcmcxXCIiYAorCisjIFJlbW92ZSBhbGwgcHJlY2VkaW5nIGFyZ3VtZW50cworZXZhbCAkY29tbWFuZAorCisjIEdldCB0aGUgbW9udGguICBOZXh0IGFyZ3VtZW50IGlzIGRheSwgZm9sbG93ZWQgYnkgdGhlIHllYXIgb3IgdGltZS4KK2Nhc2UgJDEgaW4KKyAgSmFuKSBtb250aD1KYW51YXJ5OyBudW1tb250aD0xOzsKKyAgRmViKSBtb250aD1GZWJydWFyeTsgbnVtbW9udGg9Mjs7CisgIE1hcikgbW9udGg9TWFyY2g7IG51bW1vbnRoPTM7OworICBBcHIpIG1vbnRoPUFwcmlsOyBudW1tb250aD00OzsKKyAgTWF5KSBtb250aD1NYXk7IG51bW1vbnRoPTU7OworICBKdW4pIG1vbnRoPUp1bmU7IG51bW1vbnRoPTY7OworICBKdWwpIG1vbnRoPUp1bHk7IG51bW1vbnRoPTc7OworICBBdWcpIG1vbnRoPUF1Z3VzdDsgbnVtbW9udGg9ODs7CisgIFNlcCkgbW9udGg9U2VwdGVtYmVyOyBudW1tb250aD05OzsKKyAgT2N0KSBtb250aD1PY3RvYmVyOyBudW1tb250aD0xMDs7CisgIE5vdikgbW9udGg9Tm92ZW1iZXI7IG51bW1vbnRoPTExOzsKKyAgRGVjKSBtb250aD1EZWNlbWJlcjsgbnVtbW9udGg9MTI7OworZXNhYworCitkYXk9JDIKKworIyBIZXJlIHdlIGhhdmUgdG8gZGVhbCB3aXRoIHRoZSBwcm9ibGVtIHRoYXQgdGhlIGxzIG91dHB1dCBnaXZlcyBlaXRoZXIKKyMgdGhlIHRpbWUgb2YgZGF5IG9yIHRoZSB5ZWFyLgorY2FzZSAkMyBpbgorICAqOiopIHNldCBgZGF0ZWA7IGV2YWwgeWVhcj1cJCQjCisgICAgICAgY2FzZSAkMiBpbgorCSBKYW4pIG51bW1vbnRodG9kPTE7OworCSBGZWIpIG51bW1vbnRodG9kPTI7OworCSBNYXIpIG51bW1vbnRodG9kPTM7OworCSBBcHIpIG51bW1vbnRodG9kPTQ7OworCSBNYXkpIG51bW1vbnRodG9kPTU7OworCSBKdW4pIG51bW1vbnRodG9kPTY7OworCSBKdWwpIG51bW1vbnRodG9kPTc7OworCSBBdWcpIG51bW1vbnRodG9kPTg7OworCSBTZXApIG51bW1vbnRodG9kPTk7OworCSBPY3QpIG51bW1vbnRodG9kPTEwOzsKKwkgTm92KSBudW1tb250aHRvZD0xMTs7CisJIERlYykgbnVtbW9udGh0b2Q9MTI7OworICAgICAgIGVzYWMKKyAgICAgICAjIEZvciB0aGUgZmlyc3Qgc2l4IG1vbnRoIG9mIHRoZSB5ZWFyIHRoZSB0aW1lIG5vdGF0aW9uIGNhbiBhbHNvCisgICAgICAgIyBiZSB1c2VkIGZvciBmaWxlcyBtb2RpZmllZCBpbiB0aGUgbGFzdCB5ZWFyLgorICAgICAgIGlmIChleHByICRudW1tb250aCBcPiAkbnVtbW9udGh0b2QpID4gL2Rldi9udWxsOworICAgICAgIHRoZW4KKwkgeWVhcj1gZXhwciAkeWVhciAtIDFgCisgICAgICAgZmk7OworICAqKSB5ZWFyPSQzOzsKK2VzYWMKKworIyBUaGUgcmVzdWx0LgorZWNobyAkZGF5ICRtb250aCAkeWVhcgorCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTogc2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOiAyCisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC1lbmQ6ICIkIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9kb2NzL21lbnUubHN0IGIvZG9jcy9tZW51LmxzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTU4YWVlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9tZW51LmxzdApAQCAtMCwwICsxLDgyIEBACisjCisjIFNhbXBsZSBib290IG1lbnUgY29uZmlndXJhdGlvbiBmaWxlCisjCisKKyMgQm9vdCBhdXRvbWF0aWNhbGx5IGFmdGVyIDMwIHNlY3MuCit0aW1lb3V0IDMwCisKKyMgQnkgZGVmYXVsdCwgYm9vdCB0aGUgZmlyc3QgZW50cnkuCitkZWZhdWx0IDAKKworIyBGYWxsYmFjayB0byB0aGUgc2Vjb25kIGVudHJ5LgorZmFsbGJhY2sgMQorCisjIEZvciBib290aW5nIEdOVS9IdXJkCit0aXRsZSAgR05VL0h1cmQKK3Jvb3QgICAoaGQwLDApCitrZXJuZWwgL2Jvb3QvZ251bWFjaC5neiByb290PWhkMHMxCittb2R1bGUgL2Jvb3Qvc2VydmVyYm9vdC5negorCisjIEZvciBib290aW5nIEdOVS9MaW51eAordGl0bGUgIEdOVS9MaW51eAorcm9vdCAoaGQxLDApCitrZXJuZWwgL3ZtbGludXogcm9vdD0vZGV2L2hkYjEKKyNpbml0cmQgL2luaXRyZC5pbWcKKworIyBGb3IgYm9vdGluZyBHTlUva0ZyZWVCU0QKK3RpdGxlICBHTlUva0ZyZWVCU0QKK3Jvb3QgICAoaGQwLDIsYSkKK2tlcm5lbCAvYm9vdC9sb2FkZXIuZ3oKKworIyBGb3IgYm9vdGluZyBHTlUva05ldEJTRAordGl0bGUgIEdOVS9rTmV0QlNECityb290ICAgKGhkMCwyLGEpCitrZXJuZWwgLS10eXBlPW5ldGJzZCAvYm9vdC9rbmV0YnNkLmd6CisKKyMgRm9yIGJvb3RpbmcgTWFjaCAoZ2V0dGluZyBrZXJuZWwgZnJvbSBmbG9wcHkpCit0aXRsZSAgVXRhaCBNYWNoNCBtdWx0aWJvb3QKK3Jvb3QgICAoaGQwLDIpCitwYXVzZSAgSW5zZXJ0IHRoZSBkaXNrZXR0ZSBub3cHISEKK2tlcm5lbCAoZmQwKS9ib290L2tlcm5lbCByb290PWhkMHMzCittb2R1bGUgKGZkMCkvYm9vdC9ib290c3RyYXAKKworIyBGb3IgYm9vdGluZyBGcmVlQlNECit0aXRsZSAgRnJlZUJTRAorcm9vdCAgIChoZDAsMixhKQora2VybmVsIC9ib290L2xvYWRlcgorCisjIEZvciBib290aW5nIE5ldEJTRAordGl0bGUgIE5ldEJTRAorcm9vdCAgIChoZDAsMixhKQora2VybmVsIC0tdHlwZT1uZXRic2QgL25ldGJzZAorCisjIEZvciBib290aW5nIE9wZW5CU0QKK3RpdGxlICBPcGVuQlNECityb290ICAgKGhkMCwyLGEpCitrZXJuZWwgLS10eXBlPW5ldGJzZCAvYnNkCisKKyMgRm9yIGJvb3RpbmcgT1MvMgordGl0bGUgT1MvMgorcm9vdCAgKGhkMCwxKQorbWFrZWFjdGl2ZQorIyBjaGFpbmxvYWQgT1MvMiBib290bG9hZGVyIGZyb20gdGhlIGZpcnN0IHNlY3RvcgorY2hhaW5sb2FkZXIgKzEKKyMgVGhpcyBpcyBzaW1pbGFyIHRvICJjaGFpbmxvYWQiLCBidXQgbG9hZHMgYSBzcGVjaWZpYyBmaWxlCisjY2hhaW5sb2FkZXIgL2Jvb3QvY2hhaW4ub3MyCisKKyMgRm9yIGJvb3RpbmcgV2luZG93cyBOVCBvciBXaW5kb3dzOTUKK3RpdGxlIFdpbmRvd3MgTlQgLyBXaW5kb3dzIDk1IGJvb3QgbWVudQorcm9vdG5vdmVyaWZ5IChoZDAsMCkKK21ha2VhY3RpdmUKK2NoYWlubG9hZGVyICArMQorIyBGb3IgbG9hZGluZyBET1MgaWYgV2luZG93cyBOVCBpcyBpbnN0YWxsZWQKKyMgY2hhaW5sb2FkIC9ib290c2VjdC5kb3MKKworIyBGb3IgaW5zdGFsbGluZyBHUlVCIGludG8gdGhlIGhhcmQgZGlzawordGl0bGUgSW5zdGFsbCBHUlVCIGludG8gdGhlIGhhcmQgZGlzaworcm9vdCAgICAoaGQwLDApCitzZXR1cCAgIChoZDApCisKKyMgQ2hhbmdlIHRoZSBjb2xvcnMuCit0aXRsZSBDaGFuZ2UgdGhlIGNvbG9ycworY29sb3IgbGlnaHQtZ3JlZW4vYnJvd24gYmxpbmstcmVkL2JsdWUKZGlmZiAtLWdpdCBhL2RvY3MvbXVsdGlib290LmggYi9kb2NzL211bHRpYm9vdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNzkyMjUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL211bHRpYm9vdC5oCkBAIC0wLDAgKzEsMTE5IEBACisvKiBtdWx0aWJvb3QuaCAtIHRoZSBoZWFkZXIgZm9yIE11bHRpYm9vdCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAxICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIAorICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgIAorICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgIAorICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCisKKy8qIE1hY3Jvcy4gICovCisKKy8qIFRoZSBtYWdpYyBudW1iZXIgZm9yIHRoZSBNdWx0aWJvb3QgaGVhZGVyLiAgKi8KKyNkZWZpbmUgTVVMVElCT09UX0hFQURFUl9NQUdJQwkJMHgxQkFEQjAwMgorCisvKiBUaGUgZmxhZ3MgZm9yIHRoZSBNdWx0aWJvb3QgaGVhZGVyLiAgKi8KKyNpZmRlZiBfX0VMRl9fCisjIGRlZmluZSBNVUxUSUJPT1RfSEVBREVSX0ZMQUdTCQkweDAwMDAwMDAzCisjZWxzZQorIyBkZWZpbmUgTVVMVElCT09UX0hFQURFUl9GTEFHUwkJMHgwMDAxMDAwMworI2VuZGlmCisKKy8qIFRoZSBtYWdpYyBudW1iZXIgcGFzc2VkIGJ5IGEgTXVsdGlib290LWNvbXBsaWFudCBib290IGxvYWRlci4gICovCisjZGVmaW5lIE1VTFRJQk9PVF9CT09UTE9BREVSX01BR0lDCTB4MkJBREIwMDIKKworLyogVGhlIHNpemUgb2Ygb3VyIHN0YWNrICgxNktCKS4gICovCisjZGVmaW5lIFNUQUNLX1NJWkUJCQkweDQwMDAKKworLyogQyBzeW1ib2wgZm9ybWF0LiBIQVZFX0FTTV9VU0NPUkUgaXMgZGVmaW5lZCBieSBjb25maWd1cmUuICAqLworI2lmZGVmIEhBVkVfQVNNX1VTQ09SRQorIyBkZWZpbmUgRVhUX0Moc3ltKQkJCV8gIyMgc3ltCisjZWxzZQorIyBkZWZpbmUgRVhUX0Moc3ltKQkJCXN5bQorI2VuZGlmCisKKyNpZm5kZWYgQVNNCisvKiBEbyBub3QgaW5jbHVkZSBoZXJlIGluIGJvb3QuUy4gICovCisKKy8qIFR5cGVzLiAgKi8KKworLyogVGhlIE11bHRpYm9vdCBoZWFkZXIuICAqLwordHlwZWRlZiBzdHJ1Y3QgbXVsdGlib290X2hlYWRlcgoreworICB1bnNpZ25lZCBsb25nIG1hZ2ljOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICB1bnNpZ25lZCBsb25nIGNoZWNrc3VtOworICB1bnNpZ25lZCBsb25nIGhlYWRlcl9hZGRyOworICB1bnNpZ25lZCBsb25nIGxvYWRfYWRkcjsKKyAgdW5zaWduZWQgbG9uZyBsb2FkX2VuZF9hZGRyOworICB1bnNpZ25lZCBsb25nIGJzc19lbmRfYWRkcjsKKyAgdW5zaWduZWQgbG9uZyBlbnRyeV9hZGRyOworfSBtdWx0aWJvb3RfaGVhZGVyX3Q7CisKKy8qIFRoZSBzeW1ib2wgdGFibGUgZm9yIGEub3V0LiAgKi8KK3R5cGVkZWYgc3RydWN0IGFvdXRfc3ltYm9sX3RhYmxlCit7CisgIHVuc2lnbmVkIGxvbmcgdGFic2l6ZTsKKyAgdW5zaWduZWQgbG9uZyBzdHJzaXplOworICB1bnNpZ25lZCBsb25nIGFkZHI7CisgIHVuc2lnbmVkIGxvbmcgcmVzZXJ2ZWQ7Cit9IGFvdXRfc3ltYm9sX3RhYmxlX3Q7CisKKy8qIFRoZSBzZWN0aW9uIGhlYWRlciB0YWJsZSBmb3IgRUxGLiAgKi8KK3R5cGVkZWYgc3RydWN0IGVsZl9zZWN0aW9uX2hlYWRlcl90YWJsZQoreworICB1bnNpZ25lZCBsb25nIG51bTsKKyAgdW5zaWduZWQgbG9uZyBzaXplOworICB1bnNpZ25lZCBsb25nIGFkZHI7CisgIHVuc2lnbmVkIGxvbmcgc2huZHg7Cit9IGVsZl9zZWN0aW9uX2hlYWRlcl90YWJsZV90OworCisvKiBUaGUgTXVsdGlib290IGluZm9ybWF0aW9uLiAgKi8KK3R5cGVkZWYgc3RydWN0IG11bHRpYm9vdF9pbmZvCit7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIHVuc2lnbmVkIGxvbmcgbWVtX2xvd2VyOworICB1bnNpZ25lZCBsb25nIG1lbV91cHBlcjsKKyAgdW5zaWduZWQgbG9uZyBib290X2RldmljZTsKKyAgdW5zaWduZWQgbG9uZyBjbWRsaW5lOworICB1bnNpZ25lZCBsb25nIG1vZHNfY291bnQ7CisgIHVuc2lnbmVkIGxvbmcgbW9kc19hZGRyOworICB1bmlvbgorICB7CisgICAgYW91dF9zeW1ib2xfdGFibGVfdCBhb3V0X3N5bTsKKyAgICBlbGZfc2VjdGlvbl9oZWFkZXJfdGFibGVfdCBlbGZfc2VjOworICB9IHU7CisgIHVuc2lnbmVkIGxvbmcgbW1hcF9sZW5ndGg7CisgIHVuc2lnbmVkIGxvbmcgbW1hcF9hZGRyOworfSBtdWx0aWJvb3RfaW5mb190OworCisvKiBUaGUgbW9kdWxlIHN0cnVjdHVyZS4gICovCit0eXBlZGVmIHN0cnVjdCBtb2R1bGUKK3sKKyAgdW5zaWduZWQgbG9uZyBtb2Rfc3RhcnQ7CisgIHVuc2lnbmVkIGxvbmcgbW9kX2VuZDsKKyAgdW5zaWduZWQgbG9uZyBzdHJpbmc7CisgIHVuc2lnbmVkIGxvbmcgcmVzZXJ2ZWQ7Cit9IG1vZHVsZV90OworCisvKiBUaGUgbWVtb3J5IG1hcC4gQmUgY2FyZWZ1bCB0aGF0IHRoZSBvZmZzZXQgMCBpcyBiYXNlX2FkZHJfbG93CisgICBidXQgbm8gc2l6ZS4gICovCit0eXBlZGVmIHN0cnVjdCBtZW1vcnlfbWFwCit7CisgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKKyAgdW5zaWduZWQgbG9uZyBiYXNlX2FkZHJfbG93OworICB1bnNpZ25lZCBsb25nIGJhc2VfYWRkcl9oaWdoOworICB1bnNpZ25lZCBsb25nIGxlbmd0aF9sb3c7CisgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoX2hpZ2g7CisgIHVuc2lnbmVkIGxvbmcgdHlwZTsKK30gbWVtb3J5X21hcF90OworCisjZW5kaWYgLyogISBBU00gKi8KZGlmZiAtLWdpdCBhL2RvY3MvbXVsdGlib290LmgudGV4aSBiL2RvY3MvbXVsdGlib290LmgudGV4aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmE4YzBiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9tdWx0aWJvb3QuaC50ZXhpCkBAIC0wLDAgKzEsMTE5IEBACisvKiBAcnttdWx0aWJvb3QuaCAtIHRoZSBoZWFkZXIgZm9yIE11bHRpYm9vdH0gKi8KKy8qIEBye0NvcHlyaWdodCAoQykgMTk5OSwgMjAwMSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICAKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EufSAqLworCisvKiBAcntNYWNyb3MufSAqLworCisvKiBAcntUaGUgbWFnaWMgbnVtYmVyIGZvciB0aGUgTXVsdGlib290IGhlYWRlci59ICovCisjZGVmaW5lIE1VTFRJQk9PVF9IRUFERVJfTUFHSUMgICAgICAgICAgMHgxQkFEQjAwMgorCisvKiBAcntUaGUgZmxhZ3MgZm9yIHRoZSBNdWx0aWJvb3QgaGVhZGVyLn0gKi8KKyNpZmRlZiBfX0VMRl9fCisjIGRlZmluZSBNVUxUSUJPT1RfSEVBREVSX0ZMQUdTICAgICAgICAgMHgwMDAwMDAwMworI2Vsc2UKKyMgZGVmaW5lIE1VTFRJQk9PVF9IRUFERVJfRkxBR1MgICAgICAgICAweDAwMDEwMDAzCisjZW5kaWYKKworLyogQHJ7VGhlIG1hZ2ljIG51bWJlciBwYXNzZWQgYnkgYSBNdWx0aWJvb3QtY29tcGxpYW50IGJvb3QgbG9hZGVyLn0gKi8KKyNkZWZpbmUgTVVMVElCT09UX0JPT1RMT0FERVJfTUFHSUMgICAgICAweDJCQURCMDAyCisKKy8qIEBye1RoZSBzaXplIG9mIG91ciBzdGFjayAoMTZLQikufSAqLworI2RlZmluZSBTVEFDS19TSVpFICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorCisvKiBAcntDIHN5bWJvbCBmb3JtYXQuIEhBVkVfQVNNX1VTQ09SRSBpcyBkZWZpbmVkIGJ5IGNvbmZpZ3VyZS59ICovCisjaWZkZWYgSEFWRV9BU01fVVNDT1JFCisjIGRlZmluZSBFWFRfQyhzeW0pICAgICAgICAgICAgICAgICAgICAgXyAjIyBzeW0KKyNlbHNlCisjIGRlZmluZSBFWFRfQyhzeW0pICAgICAgICAgICAgICAgICAgICAgc3ltCisjZW5kaWYKKworI2lmbmRlZiBBU00KKy8qIEBye0RvIG5vdCBpbmNsdWRlIGhlcmUgaW4gYm9vdC5TLn0gKi8KKworLyogQHJ7VHlwZXMufSAqLworCisvKiBAcntUaGUgTXVsdGlib290IGhlYWRlci59ICovCit0eXBlZGVmIHN0cnVjdCBtdWx0aWJvb3RfaGVhZGVyCitAeworICB1bnNpZ25lZCBsb25nIG1hZ2ljOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICB1bnNpZ25lZCBsb25nIGNoZWNrc3VtOworICB1bnNpZ25lZCBsb25nIGhlYWRlcl9hZGRyOworICB1bnNpZ25lZCBsb25nIGxvYWRfYWRkcjsKKyAgdW5zaWduZWQgbG9uZyBsb2FkX2VuZF9hZGRyOworICB1bnNpZ25lZCBsb25nIGJzc19lbmRfYWRkcjsKKyAgdW5zaWduZWQgbG9uZyBlbnRyeV9hZGRyOworQH0gbXVsdGlib290X2hlYWRlcl90OworCisvKiBAcntUaGUgc3ltYm9sIHRhYmxlIGZvciBhLm91dC59ICovCit0eXBlZGVmIHN0cnVjdCBhb3V0X3N5bWJvbF90YWJsZQorQHsKKyAgdW5zaWduZWQgbG9uZyB0YWJzaXplOworICB1bnNpZ25lZCBsb25nIHN0cnNpemU7CisgIHVuc2lnbmVkIGxvbmcgYWRkcjsKKyAgdW5zaWduZWQgbG9uZyByZXNlcnZlZDsKK0B9IGFvdXRfc3ltYm9sX3RhYmxlX3Q7CisKKy8qIEBye1RoZSBzZWN0aW9uIGhlYWRlciB0YWJsZSBmb3IgRUxGLn0gKi8KK3R5cGVkZWYgc3RydWN0IGVsZl9zZWN0aW9uX2hlYWRlcl90YWJsZQorQHsKKyAgdW5zaWduZWQgbG9uZyBudW07CisgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKKyAgdW5zaWduZWQgbG9uZyBhZGRyOworICB1bnNpZ25lZCBsb25nIHNobmR4OworQH0gZWxmX3NlY3Rpb25faGVhZGVyX3RhYmxlX3Q7CisKKy8qIEBye1RoZSBNdWx0aWJvb3QgaW5mb3JtYXRpb24ufSAqLwordHlwZWRlZiBzdHJ1Y3QgbXVsdGlib290X2luZm8KK0B7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIHVuc2lnbmVkIGxvbmcgbWVtX2xvd2VyOworICB1bnNpZ25lZCBsb25nIG1lbV91cHBlcjsKKyAgdW5zaWduZWQgbG9uZyBib290X2RldmljZTsKKyAgdW5zaWduZWQgbG9uZyBjbWRsaW5lOworICB1bnNpZ25lZCBsb25nIG1vZHNfY291bnQ7CisgIHVuc2lnbmVkIGxvbmcgbW9kc19hZGRyOworICB1bmlvbgorICBAeworICAgIGFvdXRfc3ltYm9sX3RhYmxlX3QgYW91dF9zeW07CisgICAgZWxmX3NlY3Rpb25faGVhZGVyX3RhYmxlX3QgZWxmX3NlYzsKKyAgQH0gdTsKKyAgdW5zaWduZWQgbG9uZyBtbWFwX2xlbmd0aDsKKyAgdW5zaWduZWQgbG9uZyBtbWFwX2FkZHI7CitAfSBtdWx0aWJvb3RfaW5mb190OworCisvKiBAcntUaGUgbW9kdWxlIHN0cnVjdHVyZS59ICovCit0eXBlZGVmIHN0cnVjdCBtb2R1bGUKK0B7CisgIHVuc2lnbmVkIGxvbmcgbW9kX3N0YXJ0OworICB1bnNpZ25lZCBsb25nIG1vZF9lbmQ7CisgIHVuc2lnbmVkIGxvbmcgc3RyaW5nOworICB1bnNpZ25lZCBsb25nIHJlc2VydmVkOworQH0gbW9kdWxlX3Q7CisKKy8qIEBye1RoZSBtZW1vcnkgbWFwLiBCZSBjYXJlZnVsIHRoYXQgdGhlIG9mZnNldCAwIGlzIGJhc2VfYWRkcl9sb3cKKyAgIGJ1dCBubyBzaXplLn0gKi8KK3R5cGVkZWYgc3RydWN0IG1lbW9yeV9tYXAKK0B7CisgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKKyAgdW5zaWduZWQgbG9uZyBiYXNlX2FkZHJfbG93OworICB1bnNpZ25lZCBsb25nIGJhc2VfYWRkcl9oaWdoOworICB1bnNpZ25lZCBsb25nIGxlbmd0aF9sb3c7CisgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoX2hpZ2g7CisgIHVuc2lnbmVkIGxvbmcgdHlwZTsKK0B9IG1lbW9yeV9tYXBfdDsKKworI2VuZGlmIC8qIEByeyEgQVNNfSAqLwpkaWZmIC0tZ2l0IGEvZG9jcy9tdWx0aWJvb3QuaW5mbyBiL2RvY3MvbXVsdGlib290LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkMWU5ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvbXVsdGlib290LmluZm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9tdWx0aWJvb3QudGV4aSBiL2RvY3MvbXVsdGlib290LnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRlZDA1YwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvbXVsdGlib290LnRleGkKQEAgLTAsMCArMSwxMjM0IEBACitcaW5wdXQgdGV4aW5mbyBAYyAtKi10ZXhpbmZvLSotCitAYyAtKi10ZXhpbmZvLSotCitAYyAlKipzdGFydCBvZiBoZWFkZXIKK0BzZXRmaWxlbmFtZSBtdWx0aWJvb3QuaW5mbworQHNldHRpdGxlIE11bHRpYm9vdCBTcGVjaWZpY2F0aW9uCitAYyAlKiplbmQgb2YgaGVhZGVyCisKK0BjIFVuaWZ5IGFsbCBvdXIgbGl0dGxlIGluZGljZXMgZm9yIG5vdy4KK0BzeW5jb2RlaW5kZXggZm4gY3AKK0BzeW5jb2RlaW5kZXggdnIgY3AKK0BzeW5jb2RlaW5kZXgga3kgY3AKK0BzeW5jb2RlaW5kZXggcGcgY3AKK0BzeW5jb2RlaW5kZXggdHAgY3AKKworQGZvb3Rub3Rlc3R5bGUgc2VwYXJhdGUKK0BwYXJhZ3JhcGhpbmRlbnQgMworQGZpbmFsb3V0CisKKworQGRpcmNhdGVnb3J5IEtlcm5lbAorQGRpcmVudHJ5CisqIE11bHRpYm9vdCBTcGVjaWZpY2F0aW9uOiAobXVsdGlib290KS4JCU11bHRpYm9vdCBTcGVjaWZpY2F0aW9uLgorQGVuZCBkaXJlbnRyeQorCitAaWZpbmZvCitDb3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTUsIDk2IEJyeWFuIEZvcmQgPGJhZm9yZEBAY3MudXRhaC5lZHU+CitDb3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTUsIDk2IEVyaWNoIFN0ZWZhbiBCb2xleW4gPGVyaWNoQEB1cnVrLm9yZz4KK0NvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCit0aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQorYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgorCitAaWdub3JlCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZVggYW5kIHByaW50IHRoZQorcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBhIGNvcHlpbmcgcGVybWlzc2lvbgorbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCisodGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCisKK0BlbmQgaWdub3JlCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKK21hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgYWxzbyB0aGF0Cit0aGUgZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKK3Blcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCitpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KK0BlbmQgaWZpbmZvCisKK0B0aXRsZXBhZ2UKK0BzcCAxMAorQHRpdGxlIFRoZSBNdWx0aWJvb3QgU3BlY2lmaWNhdGlvbgorQGF1dGhvciBZb3NoaW5vcmkgSy4gT2t1amksIEJyeWFuIEZvcmQsIEVyaWNoIFN0ZWZhbiBCb2xleW4sIEt1bmloaXJvIElzaGlndXJvCitAcGFnZQorCitAdnNraXAgMHB0IHBsdXMgMWZpbGxsCitDb3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTUsIDk2IEJyeWFuIEZvcmQgPGJhZm9yZEBAY3MudXRhaC5lZHU+CitDb3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTUsIDk2IEVyaWNoIFN0ZWZhbiBCb2xleW4gPGVyaWNoQEB1cnVrLm9yZz4KK0NvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCit0aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQorYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCittYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIGFsc28gdGhhdAordGhlIGVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCitwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAoraW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCitAZW5kIHRpdGxlcGFnZQorCitAZmluYWxvdXQKK0BoZWFkaW5ncyBkb3VibGUKKworQGlmbm90dGV4CitAbm9kZSBUb3AKK0B0b3AgTXVsdGlib290IFNwZWNpZmljYXRpb24KKworVGhpcyBmaWxlIGRvY3VtZW50cyBNdWx0aWJvb3QgU3BlY2lmaWNhdGlvbiwgdGhlIHByb3Bvc2FsIGZvciB0aGUgYm9vdAorc2VxdWVuY2Ugc3RhbmRhcmQuIFRoaXMgZWRpdGlvbiBkb2N1bWVudHMgdmVyc2lvbiAwLjYuOTMuCitAZW5kIGlmbm90dGV4CisKK0BtZW51CisqIE92ZXJ2aWV3OjogICAgICAgICAgICAgICAgICAgIAorKiBUZXJtaW5vbG9neTo6ICAgICAgICAgICAgICAgICAKKyogU3BlY2lmaWNhdGlvbjo6ICAgICAgICAgICAgICAgCisqIEV4YW1wbGVzOjogICAgICAgICAgICAgICAgICAgIAorKiBIaXN0b3J5OjogICAgICAgICAgICAgICAgICAgICAKKyogSW5kZXg6OiAgICAgICAgICAgICAgICAgICAgICAgCitAZW5kIG1lbnUKKworCitAbm9kZSBPdmVydmlldworQGNoYXB0ZXIgSW50cm9kdWN0aW9uIHRvIE11bHRpYm9vdCBTcGVjaWZpY2F0aW9uCisKK1RoaXMgY2hhcHRlciBkZXNjcmliZXMgc29tZSByb3VnaCBpbmZvcm1hdGlvbiBvbiB0aGUgTXVsdGlib290CitTcGVjaWZpY2F0aW9uLiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgYSBwYXJ0IG9mIHRoZSBzcGVjaWZpY2F0aW9uIGl0c2VsZi4KKworQG1lbnUKKyogTW90aXZhdGlvbjo6ICAgICAgICAgICAgICAgICAgCisqIEFyY2hpdGVjdHVyZTo6ICAgICAgICAgICAgICAgIAorKiBPcGVyYXRpbmcgc3lzdGVtczo6ICAgICAgICAgICAKKyogQm9vdCBzb3VyY2VzOjogICAgICAgICAgICAgICAgCisqIEJvb3QtdGltZSBjb25maWd1cmF0aW9uOjogICAgIAorKiBDb252ZW5pZW5jZSB0byBvcGVyYXRpbmcgc3lzdGVtczo6ICAKKyogQm9vdCBtb2R1bGVzOjogICAgICAgICAgICAgICAgCitAZW5kIG1lbnUKKworCitAbm9kZSBNb3RpdmF0aW9uCitAc2VjdGlvbiBUaGUgYmFja2dyb3VuZCBvZiBNdWx0aWJvb3QgU3BlY2lmaWNhdGlvbgorCitFdmVyeSBvcGVyYXRpbmcgc3lzdGVtIGV2ZXIgY3JlYXRlZCB0ZW5kcyB0byBoYXZlIGl0cyBvd24gYm9vdCBsb2FkZXIuCitJbnN0YWxsaW5nIGEgbmV3IG9wZXJhdGluZyBzeXN0ZW0gb24gYSBtYWNoaW5lIGdlbmVyYWxseSBpbnZvbHZlcworaW5zdGFsbGluZyBhIHdob2xlIG5ldyBzZXQgb2YgYm9vdCBtZWNoYW5pc21zLCBlYWNoIHdpdGggY29tcGxldGVseQorZGlmZmVyZW50IGluc3RhbGwtdGltZSBhbmQgYm9vdC10aW1lIHVzZXIgaW50ZXJmYWNlcy4gR2V0dGluZyBtdWx0aXBsZQorb3BlcmF0aW5nIHN5c3RlbXMgdG8gY29leGlzdCByZWxpYWJseSBvbiBvbmUgbWFjaGluZSB0aHJvdWdoIHR5cGljYWwKK0BkZm57Y2hhaW5pbmd9IG1lY2hhbmlzbXMgY2FuIGJlIGEgbmlnaHRtYXJlLiBUaGVyZSBpcyBsaXR0bGUgb3Igbm8KK2Nob2ljZSBvZiBib290IGxvYWRlcnMgZm9yIGEgcGFydGljdWxhciBvcGVyYXRpbmcgc3lzdGVtIC0tLSBpZiB0aGUgb25lCit0aGF0IGNvbWVzIHdpdGggdGhlIG9wZXJhdGluZyBzeXN0ZW0gZG9lc24ndCBkbyBleGFjdGx5IHdoYXQgeW91IHdhbnQsCitvciBkb2Vzbid0IHdvcmsgb24geW91ciBtYWNoaW5lLCB5b3UncmUgc2NyZXdlZC4KKworV2hpbGUgd2UgbWF5IG5vdCBiZSBhYmxlIHRvIGZpeCB0aGlzIHByb2JsZW0gaW4gZXhpc3RpbmcgY29tbWVyY2lhbAorb3BlcmF0aW5nIHN5c3RlbXMsIGl0IHNob3VsZG4ndCBiZSB0b28gZGlmZmljdWx0IGZvciBhIGZldyBwZW9wbGUgaW4gdGhlCitmcmVlIG9wZXJhdGluZyBzeXN0ZW0gY29tbXVuaXRpZXMgdG8gcHV0IHRoZWlyIGhlYWRzIHRvZ2V0aGVyIGFuZCBzb2x2ZQordGhpcyBwcm9ibGVtIGZvciB0aGUgcG9wdWxhciBmcmVlIG9wZXJhdGluZyBzeXN0ZW1zLiBUaGF0J3Mgd2hhdCB0aGlzCitzcGVjaWZpY2F0aW9uIGFpbXMgZm9yLiBCYXNpY2FsbHksIGl0IHNwZWNpZmllcyBhbiBpbnRlcmZhY2UgYmV0d2VlbiBhCitib290IGxvYWRlciBhbmQgYSBvcGVyYXRpbmcgc3lzdGVtLCBzdWNoIHRoYXQgYW55IGNvbXBseWluZyBib290IGxvYWRlcgorc2hvdWxkIGJlIGFibGUgdG8gbG9hZCBhbnkgY29tcGx5aW5nIG9wZXJhdGluZyBzeXN0ZW0uIFRoaXMKK3NwZWNpZmljYXRpb24gZG9lcyBAZW1waHtub3R9IHNwZWNpZnkgaG93IGJvb3QgbG9hZGVycyBzaG91bGQgd29yayAtLS0KK29ubHkgaG93IHRoZXkgbXVzdCBpbnRlcmZhY2Ugd2l0aCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBiZWluZyBsb2FkZWQuCisKKworQG5vZGUgQXJjaGl0ZWN0dXJlCitAc2VjdGlvbiBUaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZQorCitUaGlzIHNwZWNpZmljYXRpb24gaXMgcHJpbWFyaWx5IHRhcmdldGVkIGF0IEBzY3twY30sIHNpbmNlIHRoZXkgYXJlIHRoZQorbW9zdCBjb21tb24gYW5kIGhhdmUgdGhlIGxhcmdlc3QgdmFyaWV0eSBvZiBvcGVyYXRpbmcgc3lzdGVtcyBhbmQgYm9vdAorbG9hZGVycy4gSG93ZXZlciwgdG8gdGhlIGV4dGVudCB0aGF0IGNlcnRhaW4gb3RoZXIgYXJjaGl0ZWN0dXJlcyBtYXkKK25lZWQgYSBib290IHNwZWNpZmljYXRpb24gYW5kIGRvIG5vdCBoYXZlIG9uZSBhbHJlYWR5LCBhIHZhcmlhdGlvbiBvZgordGhpcyBzcGVjaWZpY2F0aW9uLCBzdHJpcHBlZCBvZiB0aGUgeDg2LXNwZWNpZmljIGRldGFpbHMsIGNvdWxkIGJlCithZG9wdGVkIGZvciB0aGVtIGFzIHdlbGwuCisKKworQG5vZGUgT3BlcmF0aW5nIHN5c3RlbXMKK0BzZWN0aW9uIFRoZSB0YXJnZXQgb3BlcmF0aW5nIHN5c3RlbXMKKworVGhpcyBzcGVjaWZpY2F0aW9uIGlzIHRhcmdldGVkIHRvd2FyZCBmcmVlIDMyLWJpdCBvcGVyYXRpbmcgc3lzdGVtcwordGhhdCBjYW4gYmUgZmFpcmx5IGVhc2lseSBtb2RpZmllZCB0byBzdXBwb3J0IHRoZSBzcGVjaWZpY2F0aW9uIHdpdGhvdXQKK2dvaW5nIHRocm91Z2ggbG90cyBvZiBidXJlYXVjcmF0aWMgcmlnbWFyb2xlLiBUaGUgcGFydGljdWxhciBmcmVlCitvcGVyYXRpbmcgc3lzdGVtcyB0aGF0IHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBiZWluZyBwcmltYXJpbHkgZGVzaWduZWQKK2ZvciBhcmUgTGludXgsIEZyZWVCU0QsIE5ldEJTRCwgTWFjaCwgYW5kIFZTVGEuIEl0IGlzIGhvcGVkIHRoYXQgb3RoZXIKK2VtZXJnaW5nIGZyZWUgb3BlcmF0aW5nIHN5c3RlbXMgd2lsbCBhZG9wdCBpdCBmcm9tIHRoZSBzdGFydCwgYW5kIHRodXMKK2ltbWVkaWF0ZWx5IGJlIGFibGUgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgZXhpc3RpbmcgYm9vdCBsb2FkZXJzLiBJdCB3b3VsZAorYmUgbmljZSBpZiBjb21tZXJjaWFsIG9wZXJhdGluZyBzeXN0ZW0gdmVuZG9ycyBldmVudHVhbGx5IGFkb3B0ZWQgdGhpcworc3BlY2lmaWNhdGlvbiBhcyB3ZWxsLCBidXQgdGhhdCdzIHByb2JhYmx5IGEgcGlwZSBkcmVhbS4KKworCitAbm9kZSBCb290IHNvdXJjZXMKK0BzZWN0aW9uIEJvb3Qgc291cmNlcworCitJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gd3JpdGUgY29tcGxpYW50IGJvb3QgbG9hZGVycyB0aGF0IGxvYWQgdGhlIE9TCitpbWFnZSBmcm9tIGEgdmFyaWV0eSBvZiBzb3VyY2VzLCBpbmNsdWRpbmcgZmxvcHB5IGRpc2ssIGhhcmQgZGlzaywgYW5kCithY3Jvc3MgYSBuZXR3b3JrLgorCitEaXNrLWJhc2VkIGJvb3QgbG9hZGVycyBtYXkgdXNlIGEgdmFyaWV0eSBvZiB0ZWNobmlxdWVzIHRvIGZpbmQgdGhlCityZWxldmFudCBPUyBpbWFnZSBhbmQgYm9vdCBtb2R1bGUgZGF0YSBvbiBkaXNrLCBzdWNoIGFzIGJ5CitpbnRlcnByZXRhdGlvbiBvZiBzcGVjaWZpYyBmaWxlIHN5c3RlbXMgKGUuZy4gdGhlIEJTRC9NYWNoIGJvb3QgbG9hZGVyKSwKK3VzaW5nIHByZWNhbGN1bGF0ZWQgQGRmbntibG9jayBsaXN0c30gKGUuZy4gTElMTyksIGxvYWRpbmcgZnJvbSBhCitzcGVjaWFsIEBkZm57Ym9vdCBwYXJ0aXRpb259IChlLmcuIE9TLzIpLCBvciBldmVuIGxvYWRpbmcgZnJvbSB3aXRoaW4KK2Fub3RoZXIgb3BlcmF0aW5nIHN5c3RlbSAoZS5nLiB0aGUgVlNUYSBib290IGNvZGUsIHdoaWNoIGxvYWRzIGZyb20KK0RPUykuIFNpbWlsYXJseSwgbmV0d29yay1iYXNlZCBib290IGxvYWRlcnMgY291bGQgdXNlIGEgdmFyaWV0eSBvZgorbmV0d29yayBoYXJkd2FyZSBhbmQgcHJvdG9jb2xzLgorCitJdCBpcyBob3BlZCB0aGF0IGJvb3QgbG9hZGVycyB3aWxsIGJlIGNyZWF0ZWQgdGhhdCBzdXBwb3J0IG11bHRpcGxlCitsb2FkaW5nIG1lY2hhbmlzbXMsIGluY3JlYXNpbmcgdGhlaXIgcG9ydGFiaWxpdHksIHJvYnVzdG5lc3MsIGFuZAordXNlci1mcmllbmRsaW5lc3MuCisKKworQG5vZGUgQm9vdC10aW1lIGNvbmZpZ3VyYXRpb24KK0BzZWN0aW9uIENvbmZpZ3VyZSBhbiBvcGVyYXRpbmcgc3lzdGVtIGF0IGJvb3QtdGltZQorCitJdCBpcyBvZnRlbiBuZWNlc3NhcnkgZm9yIG9uZSByZWFzb24gb3IgYW5vdGhlciBmb3IgdGhlIHVzZXIgdG8gYmUgYWJsZQordG8gcHJvdmlkZSBzb21lIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gdG8gYW4gb3BlcmF0aW5nIHN5c3RlbQorZHluYW1pY2FsbHkgYXQgYm9vdCB0aW1lLiBXaGlsZSB0aGlzIHNwZWNpZmljYXRpb24gc2hvdWxkIG5vdCBkaWN0YXRlCitob3cgdGhpcyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIG9idGFpbmVkIGJ5IHRoZSBib290IGxvYWRlciwgaXQKK3Nob3VsZCBwcm92aWRlIGEgc3RhbmRhcmQgbWVhbnMgZm9yIHRoZSBib290IGxvYWRlciB0byBwYXNzIHN1Y2gKK2luZm9ybWF0aW9uIHRvIHRoZSBvcGVyYXRpbmcgc3lzdGVtLgorCisKK0Bub2RlIENvbnZlbmllbmNlIHRvIG9wZXJhdGluZyBzeXN0ZW1zCitAc2VjdGlvbiBIb3cgdG8gbWFrZSBPUyBkZXZlbG9wbWVudCBlYXNpZXIKKworT1MgaW1hZ2VzIHNob3VsZCBiZSBlYXN5IHRvIGdlbmVyYXRlLiBJZGVhbGx5LCBhbiBPUyBpbWFnZSBzaG91bGQgc2ltcGx5CitiZSBhbiBvcmRpbmFyeSAzMi1iaXQgZXhlY3V0YWJsZSBmaWxlIGluIHdoYXRldmVyIGZpbGUgZm9ybWF0IHRoZQorb3BlcmF0aW5nIHN5c3RlbSBub3JtYWxseSB1c2VzLiBJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gQGNvZGV7bm19IG9yCitkaXNhc3NlbWJsZSBPUyBpbWFnZXMganVzdCBsaWtlIG5vcm1hbCBleGVjdXRhYmxlcy4gU3BlY2lhbGl6ZWQgdG9vbHMKK3Nob3VsZCBub3QgYmUgcmVxdWlyZWQgdG8gY3JlYXRlIE9TIGltYWdlcyBpbiBhIEBlbXBoe3NwZWNpYWx9IGZpbGUKK2Zvcm1hdC4gSWYgdGhpcyBtZWFucyBzaGlmdGluZyBzb21lIHdvcmsgZnJvbSB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0bworYSBib290IGxvYWRlciwgdGhhdCBpcyBwcm9iYWJseSBhcHByb3ByaWF0ZSwgYmVjYXVzZSBhbGwgdGhlIG1lbW9yeQorY29uc3VtZWQgYnkgdGhlIGJvb3QgbG9hZGVyIHdpbGwgdHlwaWNhbGx5IGJlIG1hZGUgYXZhaWxhYmxlIGFnYWluIGFmdGVyCit0aGUgYm9vdCBwcm9jZXNzIGlzIGNyZWF0ZWQsIHdoZXJlYXMgZXZlcnkgYml0IG9mIGNvZGUgaW4gdGhlIE9TIGltYWdlCit0eXBpY2FsbHkgaGFzIHRvIHJlbWFpbiBpbiBtZW1vcnkgZm9yZXZlci4gVGhlIG9wZXJhdGluZyBzeXN0ZW0gc2hvdWxkCitub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBnZXR0aW5nIGludG8gMzItYml0IG1vZGUgaW5pdGlhbGx5LCBiZWNhdXNlIG1vZGUKK3N3aXRjaGluZyBjb2RlIGdlbmVyYWxseSBuZWVkcyB0byBiZSBpbiB0aGUgYm9vdCBsb2FkZXIgYW55d2F5IGluIG9yZGVyCit0byBsb2FkIG9wZXJhdGluZyBzeXN0ZW0gZGF0YSBhYm92ZSB0aGUgMU1CIGJvdW5kYXJ5LCBhbmQgZm9yY2luZyB0aGUKK29wZXJhdGluZyBzeXN0ZW0gdG8gZG8gdGhpcyBtYWtlcyBjcmVhdGlvbiBvZiBPUyBpbWFnZXMgbXVjaCBtb3JlCitkaWZmaWN1bHQuCisKK1VuZm9ydHVuYXRlbHksIHRoZXJlIGlzIGEgaG9ycmVuZG91cyB2YXJpZXR5IG9mIGV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCitldmVuIGFtb25nIGZyZWUgVW5peC1saWtlIEBzY3twY30tYmFzZWQgb3BlcmF0aW5nIHN5c3RlbXMgLS0tIGdlbmVyYWxseQorYSBkaWZmZXJlbnQgZm9ybWF0IGZvciBlYWNoIG9wZXJhdGluZyBzeXN0ZW0uIE1vc3Qgb2YgdGhlIHJlbGV2YW50IGZyZWUKK29wZXJhdGluZyBzeXN0ZW1zIHVzZSBzb21lIHZhcmlhbnQgb2YgYS5vdXQgZm9ybWF0LCBidXQgc29tZSBhcmUgbW92aW5nCit0byBAc2N7ZWxmfS4gSXQgaXMgaGlnaGx5IGRlc2lyYWJsZSBmb3IgYm9vdCBsb2FkZXJzIG5vdCB0byBoYXZlIHRvIGJlCithYmxlIHRvIGludGVycHJldCBhbGwgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBleGVjdXRhYmxlIGZpbGUgZm9ybWF0cyBpbgorZXhpc3RlbmNlIGluIG9yZGVyIHRvIGxvYWQgdGhlIE9TIGltYWdlIC0tLSBvdGhlcndpc2UgdGhlIGJvb3QgbG9hZGVyCitlZmZlY3RpdmVseSBiZWNvbWVzIG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWMgYWdhaW4uCisKK1RoaXMgc3BlY2lmaWNhdGlvbiBhZG9wdHMgYSBjb21wcm9taXNlIHNvbHV0aW9uIHRvIHRoaXMKK3Byb2JsZW0uIE11bHRpYm9vdC1jb21wbGlhbnQgT1MgaW1hZ2VzIGFsd2F5cyBjb250YWluIGEgbWFnaWMKK0BkZm57TXVsdGlib290IGhlYWRlcn0gKEBweHJlZntPUyBpbWFnZSBmb3JtYXR9KSwgd2hpY2ggYWxsb3dzIHRoZSBib290Citsb2FkZXIgdG8gbG9hZCB0aGUgaW1hZ2Ugd2l0aG91dCBoYXZpbmcgdG8gdW5kZXJzdGFuZCBudW1lcm91cyBhLm91dAordmFyaWFudHMgb3Igb3RoZXIgZXhlY3V0YWJsZSBmb3JtYXRzLiBUaGlzIG1hZ2ljIGhlYWRlciBkb2VzIG5vdCBuZWVkIHRvCitiZSBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgdGhlIGV4ZWN1dGFibGUgZmlsZSwgc28ga2VybmVsIGltYWdlcyBjYW4KK3N0aWxsIGNvbmZvcm0gdG8gdGhlIGxvY2FsIGEub3V0IGZvcm1hdCB2YXJpYW50IGluIGFkZGl0aW9uIHRvIGJlaW5nCitNdWx0aWJvb3QtY29tcGxpYW50LgorCisKK0Bub2RlIEJvb3QgbW9kdWxlcworQHNlY3Rpb24gQm9vdCBtb2R1bGVzCisKK01hbnkgbW9kZXJuIG9wZXJhdGluZyBzeXN0ZW0ga2VybmVscywgc3VjaCBhcyB0aG9zZSBvZiBWU1RhIGFuZCBNYWNoLCBkbworbm90IGJ5IHRoZW1zZWx2ZXMgY29udGFpbiBlbm91Z2ggbWVjaGFuaXNtIHRvIGdldCB0aGUgc3lzdGVtIGZ1bGx5CitvcGVyYXRpb25hbDogdGhleSByZXF1aXJlIHRoZSBwcmVzZW5jZSBvZiBhZGRpdGlvbmFsIHNvZnR3YXJlIG1vZHVsZXMgYXQKK2Jvb3QgdGltZSBpbiBvcmRlciB0byBhY2Nlc3MgZGV2aWNlcywgbW91bnQgZmlsZSBzeXN0ZW1zLCBldGMuIFdoaWxlCit0aGVzZSBhZGRpdGlvbmFsIG1vZHVsZXMgY291bGQgYmUgZW1iZWRkZWQgaW4gdGhlIG1haW4gT1MgaW1hZ2UgYWxvbmcKK3dpdGggdGhlIGtlcm5lbCBpdHNlbGYsIGFuZCB0aGUgcmVzdWx0aW5nIGltYWdlIGJlIHNwbGl0IGFwYXJ0IG1hbnVhbGx5CitieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSB3aGVuIGl0IHJlY2VpdmVzIGNvbnRyb2wsIGl0IGlzIG9mdGVuIG1vcmUKK2ZsZXhpYmxlLCBtb3JlIHNwYWNlLWVmZmljaWVudCwgYW5kIG1vcmUgY29udmVuaWVudCB0byB0aGUgb3BlcmF0aW5nCitzeXN0ZW0gYW5kIHVzZXIgaWYgdGhlIGJvb3QgbG9hZGVyIGNhbiBsb2FkIHRoZXNlIGFkZGl0aW9uYWwgbW9kdWxlcworaW5kZXBlbmRlbnRseSBpbiB0aGUgZmlyc3QgcGxhY2UuCisKK1RodXMsIHRoaXMgc3BlY2lmaWNhdGlvbiBzaG91bGQgcHJvdmlkZSBhIHN0YW5kYXJkIG1ldGhvZCBmb3IgYSBib290Citsb2FkZXIgdG8gaW5kaWNhdGUgdG8gdGhlIG9wZXJhdGluZyBzeXN0ZW0gd2hhdCBhdXhpbGlhcnkgYm9vdCBtb2R1bGVzCit3ZXJlIGxvYWRlZCwgYW5kIHdoZXJlIHRoZXkgY2FuIGJlIGZvdW5kLiBCb290IGxvYWRlcnMgZG9uJ3QgaGF2ZSB0bworc3VwcG9ydCBtdWx0aXBsZSBib290IG1vZHVsZXMsIGJ1dCB0aGV5IGFyZSBzdHJvbmdseSBlbmNvdXJhZ2VkIHRvLAorYmVjYXVzZSBzb21lIG9wZXJhdGluZyBzeXN0ZW1zIHdpbGwgYmUgdW5hYmxlIHRvIGJvb3Qgd2l0aG91dCB0aGVtLgorCisKK0Bub2RlIFRlcm1pbm9sb2d5CitAY2hhcHRlciBUaGUgZGVmaW5pdGlvbnMgb2YgdGVybXMgdXNlZCB0aHJvdWdoIHRoZSBzcGVjaWZpY2F0aW9uCisKK0B0YWJsZSBAZGZuCitAaXRlbSBtdXN0CitXZSB1c2UgdGhlIHRlcm0gQGRmbnttdXN0fSwgd2hlbiBhbnkgYm9vdCBsb2FkZXIgb3IgT1MgaW1hZ2UgbmVlZHMgdG8KK2ZvbGxvdyBhIHJ1bGUgLS0tIG90aGVyd2lzZSwgdGhlIGJvb3QgbG9hZGVyIG9yIE9TIGltYWdlIGlzIEBlbXBoe25vdH0KK011bHRpYm9vdC1jb21wbGlhbnQuCisKK0BpdGVtIHNob3VsZAorV2UgdXNlIHRoZSB0ZXJtIEBkZm57c2hvdWxkfSwgd2hlbiBhbnkgYm9vdCBsb2FkZXIgb3IgT1MgaW1hZ2UgaXMKK3JlY29tbWVuZGVkIHRvIGZvbGxvdyBhIHJ1bGUsIGJ1dCBpdCBkb2Vzbid0IG5lZWQgdG8gZm9sbG93IHRoZSBydWxlLgorCitAaXRlbSBtYXkKK1dlIHVzZSB0aGUgdGVybSBAZGZue21heX0sIHdoZW4gYW55IGJvb3QgbG9hZGVyIG9yIE9TIGltYWdlIGlzIGFsbG93ZWQKK3RvIGZvbGxvdyBhIHJ1bGUuCisKK0BpdGVtIGJvb3QgbG9hZGVyCitXaGF0ZXZlciBwcm9ncmFtIG9yIHNldCBvZiBwcm9ncmFtcyBsb2FkcyB0aGUgaW1hZ2Ugb2YgdGhlIGZpbmFsCitvcGVyYXRpbmcgc3lzdGVtIHRvIGJlIHJ1biBvbiB0aGUgbWFjaGluZS4gVGhlIGJvb3QgbG9hZGVyIG1heSBpdHNlbGYKK2NvbnNpc3Qgb2Ygc2V2ZXJhbCBzdGFnZXMsIGJ1dCB0aGF0IGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCBub3QKK3JlbGV2YW50IHRvIHRoaXMgc3BlY2lmaWNhdGlvbi4gT25seSB0aGUgQGVtcGh7ZmluYWx9IHN0YWdlIG9mIHRoZSBib290Citsb2FkZXIgLS0tIHRoZSBzdGFnZSB0aGF0IGV2ZW50dWFsbHkgdHJhbnNmZXJzIGNvbnRyb2wgdG8gYW4gb3BlcmF0aW5nCitzeXN0ZW0gLS0tIG11c3QgZm9sbG93IHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gdGhpcyBkb2N1bWVudCBpbiBvcmRlcgordG8gYmUgQGRmbntNdWx0aWJvb3QtY29tcGxpYW50fTsgZWFybGllciBib290IGxvYWRlciBzdGFnZXMgbWF5IGJlCitkZXNpZ25lZCBpbiB3aGF0ZXZlciB3YXkgaXMgbW9zdCBjb252ZW5pZW50LgorCitAaXRlbSBPUyBpbWFnZQorVGhlIGluaXRpYWwgYmluYXJ5IGltYWdlIHRoYXQgYSBib290IGxvYWRlciBsb2FkcyBpbnRvIG1lbW9yeSBhbmQKK3RyYW5zZmVycyBjb250cm9sIHRvIHN0YXJ0IGFuIG9wZXJhdGluZyBzeXN0ZW0uIFRoZSBPUyBpbWFnZSBpcwordHlwaWNhbGx5IGFuIGV4ZWN1dGFibGUgY29udGFpbmluZyB0aGUgb3BlcmF0aW5nIHN5c3RlbSBrZXJuZWwuCisKK0BpdGVtIGJvb3QgbW9kdWxlCitPdGhlciBhdXhpbGlhcnkgZmlsZXMgdGhhdCBhIGJvb3QgbG9hZGVyIGxvYWRzIGludG8gbWVtb3J5IGFsb25nIHdpdGgKK2FuIE9TIGltYWdlLCBidXQgZG9lcyBub3QgaW50ZXJwcmV0IGluIGFueSB3YXkgb3RoZXIgdGhhbiBwYXNzaW5nIHRoZWlyCitsb2NhdGlvbnMgdG8gdGhlIG9wZXJhdGluZyBzeXN0ZW0gd2hlbiBpdCBpcyBpbnZva2VkLgorCitAaXRlbSBNdWx0aWJvb3QtY29tcGxpYW50CitBIGJvb3QgbG9hZGVyIG9yIGFuIE9TIGltYWdlIHdoaWNoIGZvbGxvd3MgdGhlIHJ1bGVzIGRlZmluZWQgYXMKK0BkZm57bXVzdH0gaXMgTXVsdGlib290LWNvbXBsaWFudC4gV2hlbiB0aGlzIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzIGEKK3J1bGUgYXMgQGRmbntzaG91bGR9IG9yIEBkZm57bWF5fSwgYSBNdWx0aWJvb3QtY29tcGxhaW50IGJvb3QgbG9hZGVyL09TCitpbWFnZSBkb2Vzbid0IG5lZWQgdG8gZm9sbG93IHRoZSBydWxlLgorCitAaXRlbSB1OAorVGhlIHR5cGUgb2YgdW5zaWduZWQgOC1iaXQgZGF0YS4KKworQGl0ZW0gdTE2CitUaGUgdHlwZSBvZiB1bnNpZ25lZCAxNi1iaXQgZGF0YS4gQmVjYXVzZSB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcworbGl0dGxlLWVuZGlhbiwgdTE2IGlzIGNvZGVkIGluIGxpdHRsZS1lbmRpYW4uCisKK0BpdGVtIHUzMgorVGhlIHR5cGUgb2YgdW5zaWduZWQgMzItYml0IGRhdGEuIEJlY2F1c2UgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMKK2xpdHRsZS1lbmRpYW4sIHUzMiBpcyBjb2RlZCBpbiBsaXR0bGUtZW5kaWFuLgorCitAaXRlbSB1NjQKK1RoZSB0eXBlIG9mIHVuc2lnbmVkIDY0LWJpdCBkYXRhLiBCZWNhdXNlIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIGlzCitsaXR0bGUtZW5kaWFuLCB1NjQgaXMgY29kZWQgaW4gbGl0dGxlLWVuZGlhbi4KK0BlbmQgdGFibGUKKworCitAbm9kZSBTcGVjaWZpY2F0aW9uCitAY2hhcHRlciBUaGUgZXhhY3QgZGVmaW5pdGlvbnMgb2YgTXVsdGlib290IFNwZWNpZmljYXRpb24KKworVGhlcmUgYXJlIHRocmVlIG1haW4gYXNwZWN0cyBvZiBhIGJvb3QgbG9hZGVyL09TIGltYWdlIGludGVyZmFjZToKKworQGVudW1lcmF0ZQorQGl0ZW0KK1RoZSBmb3JtYXQgb2YgYW4gT1MgaW1hZ2UgYXMgc2VlbiBieSBhIGJvb3QgbG9hZGVyLgorCitAaXRlbQorVGhlIHN0YXRlIG9mIGEgbWFjaGluZSB3aGVuIGEgYm9vdCBsb2FkZXIgc3RhcnRzIGFuIG9wZXJhdGluZworc3lzdGVtLgorCitAaXRlbQorVGhlIGZvcm1hdCBvZiBpbmZvcm1hdGlvbiBwYXNzZWQgYnkgYSBib290IGxvYWRlciB0byBhbiBvcGVyYXRpbmcKK3N5c3RlbS4KK0BlbmQgZW51bWVyYXRlCisKK0BtZW51CisqIE9TIGltYWdlIGZvcm1hdDo6ICAgICAgICAgICAgIAorKiBNYWNoaW5lIHN0YXRlOjogICAgICAgICAgICAgICAKKyogQm9vdCBpbmZvcm1hdGlvbiBmb3JtYXQ6OiAgICAgCitAZW5kIG1lbnUKKworCitAbm9kZSBPUyBpbWFnZSBmb3JtYXQKK0BzZWN0aW9uIE9TIGltYWdlIGZvcm1hdAorCitBbiBPUyBpbWFnZSBtYXkgYmUgYW4gb3JkaW5hcnkgMzItYml0IGV4ZWN1dGFibGUgZmlsZSBpbiB0aGUgc3RhbmRhcmQKK2Zvcm1hdCBmb3IgdGhhdCBwYXJ0aWN1bGFyIG9wZXJhdGluZyBzeXN0ZW0sIGV4Y2VwdCB0aGF0IGl0IG1heSBiZQorbGlua2VkIGF0IGEgbm9uLWRlZmF1bHQgbG9hZCBhZGRyZXNzIHRvIGF2b2lkIGxvYWRpbmcgb24gdG9wIG9mIHRoZQorQHNje3BjfSdzIEkvTyByZWdpb24gb3Igb3RoZXIgcmVzZXJ2ZWQgYXJlYXMsIGFuZCBvZiBjb3Vyc2UgaXQgc2hvdWxkCitub3QgdXNlIHNoYXJlZCBsaWJyYXJpZXMgb3Igb3RoZXIgZmFuY3kgZmVhdHVyZXMuCisKK0FuIE9TIGltYWdlIG11c3QgY29udGFpbiBhbiBhZGRpdGlvbmFsIGhlYWRlciBjYWxsZWQgQGRmbntNdWx0aWJvb3QKK2hlYWRlcn0sIGJlc2lkZXMgdGhlIGhlYWRlcnMgb2YgdGhlIGZvcm1hdCB1c2VkIGJ5IHRoZSBPUyBpbWFnZS4gVGhlCitNdWx0aWJvb3QgaGVhZGVyIG11c3QgYmUgY29udGFpbmVkIGNvbXBsZXRlbHkgd2l0aGluIHRoZSBmaXJzdCA4MTkyCitieXRlcyBvZiB0aGUgT1MgaW1hZ2UsIGFuZCBtdXN0IGJlIGxvbmd3b3JkICgzMi1iaXQpIGFsaWduZWQuIEluCitnZW5lcmFsLCBpdCBzaG91bGQgY29tZSBAZW1waHthcyBlYXJseSBhcyBwb3NzaWJsZX0sIGFuZCBtYXkgYmUKK2VtYmVkZGVkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRleHQgc2VnbWVudCBhZnRlciB0aGUgQGVtcGh7cmVhbH0KK2V4ZWN1dGFibGUgaGVhZGVyLgorCitAbWVudQorKiBIZWFkZXIgbGF5b3V0OjogICAgICAgICAgICAgICBUaGUgbGF5b3V0IG9mIE11bHRpYm9vdCBoZWFkZXIKKyogSGVhZGVyIG1hZ2ljIGZpZWxkczo6ICAgICAgICAgVGhlIG1hZ2ljIGZpZWxkcyBvZiBNdWx0aWJvb3QgaGVhZGVyCisqIEhlYWRlciBhZGRyZXNzIGZpZWxkczo6ICAgICAgIAorKiBIZWFkZXIgZ3JhcGhpY3MgZmllbGRzOjogICAgICAKK0BlbmQgbWVudQorCisKK0Bub2RlIEhlYWRlciBsYXlvdXQKK0BzdWJzZWN0aW9uIFRoZSBsYXlvdXQgb2YgTXVsdGlib290IGhlYWRlcgorCitUaGUgbGF5b3V0IG9mIHRoZSBNdWx0aWJvb3QgaGVhZGVyIG11c3QgYmUgYXMgZm9sbG93czoKKworQG11bHRpdGFibGUgQGNvbHVtbmZyYWN0aW9ucyAuMSAuMSAuMiAuNQorQGl0ZW0gT2Zmc2V0IEB0YWIgVHlwZSAgQHRhYiBGaWVsZCBOYW1lICAgIEB0YWIgTm90ZQorQGl0ZW0gMCAgICAgIEB0YWIgdTMyIEB0YWIgbWFnaWMgICAgICAgICBAdGFiIHJlcXVpcmVkCitAaXRlbSA0ICAgICAgQHRhYiB1MzIgQHRhYiBmbGFncyAgICAgICAgIEB0YWIgcmVxdWlyZWQKK0BpdGVtIDggICAgICBAdGFiIHUzMiBAdGFiIGNoZWNrc3VtICAgICAgQHRhYiByZXF1aXJlZAorQGl0ZW0gMTIgICAgIEB0YWIgdTMyIEB0YWIgaGVhZGVyX2FkZHIgICBAdGFiIGlmIGZsYWdzWzE2XSBpcyBzZXQKK0BpdGVtIDE2ICAgICBAdGFiIHUzMiBAdGFiIGxvYWRfYWRkciAgICAgQHRhYiBpZiBmbGFnc1sxNl0gaXMgc2V0CitAaXRlbSAyMCAgICAgQHRhYiB1MzIgQHRhYiBsb2FkX2VuZF9hZGRyIEB0YWIgaWYgZmxhZ3NbMTZdIGlzIHNldAorQGl0ZW0gMjQgICAgIEB0YWIgdTMyIEB0YWIgYnNzX2VuZF9hZGRyICBAdGFiIGlmIGZsYWdzWzE2XSBpcyBzZXQKK0BpdGVtIDI4ICAgICBAdGFiIHUzMiBAdGFiIGVudHJ5X2FkZHIgICAgQHRhYiBpZiBmbGFnc1sxNl0gaXMgc2V0CitAaXRlbSAzMiAgICAgQHRhYiB1MzIgQHRhYiBtb2RlX3R5cGUgICAgIEB0YWIgaWYgZmxhZ3NbMl0gaXMgc2V0CitAaXRlbSAzNiAgICAgQHRhYiB1MzIgQHRhYiB3aWR0aCAgICAgICAgIEB0YWIgaWYgZmxhZ3NbMl0gaXMgc2V0CitAaXRlbSA0MCAgICAgQHRhYiB1MzIgQHRhYiBoZWlnaHQgICAgICAgIEB0YWIgaWYgZmxhZ3NbMl0gaXMgc2V0CitAaXRlbSA0NCAgICAgQHRhYiB1MzIgQHRhYiBkZXB0aCAgICAgICAgIEB0YWIgaWYgZmxhZ3NbMl0gaXMgc2V0CitAZW5kIG11bHRpdGFibGUKKworVGhlIGZpZWxkcyBAc2FtcHttYWdpY30sIEBzYW1we2ZsYWdzfSBhbmQgQHNhbXB7Y2hlY2tzdW19IGFyZSBkZWZpbmVkIGluCitAcmVme0hlYWRlciBtYWdpYyBmaWVsZHN9LCB0aGUgZmllbGRzIEBzYW1we2hlYWRlcl9hZGRyfSwKK0BzYW1we2xvYWRfYWRkcn0sIEBzYW1we2xvYWRfZW5kX2FkZHJ9LCBAc2FtcHtic3NfZW5kX2FkZHJ9IGFuZAorQHNhbXB7ZW50cnlfYWRkcn0gYXJlIGRlZmluZWQgaW4gQHJlZntIZWFkZXIgYWRkcmVzcyBmaWVsZHN9LCBhbmQgdGhlCitmaWVsZHMgQHNhbXB7bW9kZV90eXBlfSwgQHNhbXB7d2lkdGh9LCBAc2FtcHtoZWlnaHR9IGFuZCBAc2FtcHtkZXB0aH0gYXJlCitkZWZpbmQgaW4gQHJlZntIZWFkZXIgZ3JhcGhpY3MgZmllbGRzfS4KKworCitAbm9kZSBIZWFkZXIgbWFnaWMgZmllbGRzCitAc3Vic2VjdGlvbiBUaGUgbWFnaWMgZmllbGRzIG9mIE11bHRpYm9vdCBoZWFkZXIKKworQHRhYmxlIEBzYW1wCitAaXRlbSBtYWdpYworVGhlIGZpZWxkIEBzYW1we21hZ2ljfSBpcyB0aGUgbWFnaWMgbnVtYmVyIGlkZW50aWZ5aW5nIHRoZSBoZWFkZXIsCit3aGljaCBtdXN0IGJlIHRoZSBoZXhhZGVjaW1hbCB2YWx1ZSBAY29kZXsweDFCQURCMDAyfS4KKworQGl0ZW0gZmxhZ3MKK1RoZSBmaWVsZCBAc2FtcHtmbGFnc30gc3BlY2lmaWVzIGZlYXR1cmVzIHRoYXQgdGhlIE9TIGltYWdlIHJlcXVlc3RzIG9yCityZXF1aXJlcyBvZiBhbiBib290IGxvYWRlci4gQml0cyAwLTE1IGluZGljYXRlIHJlcXVpcmVtZW50czsgaWYgdGhlCitib290IGxvYWRlciBzZWVzIGFueSBvZiB0aGVzZSBiaXRzIHNldCBidXQgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSBmbGFnCitvciBjYW4ndCBmdWxmaWxsIHRoZSByZXF1aXJlbWVudHMgaXQgaW5kaWNhdGVzIGZvciBzb21lIHJlYXNvbiwgaXQgbXVzdAorbm90aWZ5IHRoZSB1c2VyIGFuZCBmYWlsIHRvIGxvYWQgdGhlIE9TIGltYWdlLiBCaXRzIDE2LTMxIGluZGljYXRlCitvcHRpb25hbCBmZWF0dXJlczsgaWYgYW55IGJpdHMgaW4gdGhpcyByYW5nZSBhcmUgc2V0IGJ1dCB0aGUgYm9vdCBsb2FkZXIKK2RvZXNuJ3QgdW5kZXJzdGFuZCB0aGVtLCBpdCBtYXkgc2ltcGx5IGlnbm9yZSB0aGVtIGFuZCBwcm9jZWVkIGFzCit1c3VhbC4gTmF0dXJhbGx5LCBhbGwgYXMteWV0LXVuZGVmaW5lZCBiaXRzIGluIHRoZSBAc2FtcHtmbGFnc30gd29yZAorbXVzdCBiZSBzZXQgdG8gemVybyBpbiBPUyBpbWFnZXMuIFRoaXMgd2F5LCB0aGUgQHNhbXB7ZmxhZ3N9IGZpZWxkcworc2VydmVzIGZvciB2ZXJzaW9uIGNvbnRyb2wgYXMgd2VsbCBhcyBzaW1wbGUgZmVhdHVyZSBzZWxlY3Rpb24uCisKK0lmIGJpdCAwIGluIHRoZSBAc2FtcHtmbGFnc30gd29yZCBpcyBzZXQsIHRoZW4gYWxsIGJvb3QgbW9kdWxlcyBsb2FkZWQKK2Fsb25nIHdpdGggdGhlIG9wZXJhdGluZyBzeXN0ZW0gbXVzdCBiZSBhbGlnbmVkIG9uIHBhZ2UgKDRLQikKK2JvdW5kYXJpZXMuIFNvbWUgb3BlcmF0aW5nIHN5c3RlbXMgZXhwZWN0IHRvIGJlIGFibGUgdG8gbWFwIHRoZSBwYWdlcworY29udGFpbmluZyBib290IG1vZHVsZXMgZGlyZWN0bHkgaW50byBhIHBhZ2VkIGFkZHJlc3Mgc3BhY2UgZHVyaW5nCitzdGFydHVwLCBhbmQgdGh1cyBuZWVkIHRoZSBib290IG1vZHVsZXMgdG8gYmUgcGFnZS1hbGlnbmVkLgorCitJZiBiaXQgMSBpbiB0aGUgQHNhbXB7ZmxhZ3N9IHdvcmQgaXMgc2V0LCB0aGVuIGluZm9ybWF0aW9uIG9uIGF2YWlsYWJsZQorbWVtb3J5IHZpYSBhdCBsZWFzdCB0aGUgQHNhbXB7bWVtXyp9IGZpZWxkcyBvZiB0aGUgTXVsdGlib290IGluZm9ybWF0aW9uCitzdHJ1Y3R1cmUgKEBweHJlZntCb290IGluZm9ybWF0aW9uIGZvcm1hdH0pIG11c3QgYmUgaW5jbHVkZWQuIElmIHRoZQorYm9vdCBsb2FkZXIgaXMgY2FwYWJsZSBvZiBwYXNzaW5nIGEgbWVtb3J5IG1hcCAodGhlIEBzYW1we21tYXBfKn0gZmllbGRzKQorYW5kIG9uZSBleGlzdHMsIHRoZW4gaXQgbWF5IGJlIGluY2x1ZGVkIGFzIHdlbGwuCisKK0lmIGJpdCAyIGluIHRoZSBAc2FtcHtmbGFnc30gd29yZCBpcyBzZXQsIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2aWRlbworbW9kZSB0YWJsZSAoQHB4cmVme0Jvb3QgaW5mb3JtYXRpb24gZm9ybWF0fSkgbXVzdCBiZSBhdmFpbGFibGUgdG8gdGhlCitrZXJuZWwuCisKK0lmIGJpdCAxNiBpbiB0aGUgQHNhbXB7ZmxhZ3N9IHdvcmQgaXMgc2V0LCB0aGVuIHRoZSBmaWVsZHMgYXQgb2Zmc2V0cworOC0yNCBpbiB0aGUgTXVsdGlib290IGhlYWRlciBhcmUgdmFsaWQsIGFuZCB0aGUgYm9vdCBsb2FkZXIgc2hvdWxkIHVzZQordGhlbSBpbnN0ZWFkIG9mIHRoZSBmaWVsZHMgaW4gdGhlIGFjdHVhbCBleGVjdXRhYmxlIGhlYWRlciB0byBjYWxjdWxhdGUKK3doZXJlIHRvIGxvYWQgdGhlIE9TIGltYWdlLiBUaGlzIGluZm9ybWF0aW9uIGRvZXMgbm90IG5lZWQgdG8gYmUKK3Byb3ZpZGVkIGlmIHRoZSBrZXJuZWwgaW1hZ2UgaXMgaW4gQHNje2VsZn0gZm9ybWF0LCBidXQgaXQgQGVtcGh7bXVzdH0KK2JlIHByb3ZpZGVkIGlmIHRoZSBpbWFnZXMgaXMgaW4gYS5vdXQgZm9ybWF0IG9yIGluIHNvbWUgb3RoZXIKK2Zvcm1hdC4gQ29tcGxpYW50IGJvb3QgbG9hZGVycyBtdXN0IGJlIGFibGUgdG8gbG9hZCBpbWFnZXMgdGhhdCBlaXRoZXIKK2FyZSBpbiBAc2N7ZWxmfSBmb3JtYXQgb3IgY29udGFpbiB0aGUgbG9hZCBhZGRyZXNzIGluZm9ybWF0aW9uIGVtYmVkZGVkCitpbiB0aGUgTXVsdGlib290IGhlYWRlcjsgdGhleSBtYXkgYWxzbyBkaXJlY3RseSBzdXBwb3J0IG90aGVyIGV4ZWN1dGFibGUKK2Zvcm1hdHMsIHN1Y2ggYXMgcGFydGljdWxhciBhLm91dCB2YXJpYW50cywgYnV0IGFyZSBub3QgcmVxdWlyZWQgdG8uCisKK0BpdGVtIGNoZWNrc3VtCitUaGUgZmllbGQgQHNhbXB7Y2hlY2tzdW19IGlzIGEgMzItYml0IHVuc2lnbmVkIHZhbHVlIHdoaWNoLCB3aGVuIGFkZGVkCit0byB0aGUgb3RoZXIgbWFnaWMgZmllbGRzIChpLmUuIEBzYW1we21hZ2ljfSBhbmQgQHNhbXB7ZmxhZ3N9KSwgbXVzdAoraGF2ZSBhIDMyLWJpdCB1bnNpZ25lZCBzdW0gb2YgemVyby4KK0BlbmQgdGFibGUKKworCitAbm9kZSBIZWFkZXIgYWRkcmVzcyBmaWVsZHMKK0BzdWJzZWN0aW9uIFRoZSBhZGRyZXNzIGZpZWxkcyBvZiBNdWx0aWJvb3QgaGVhZGVyCisKK0FsbCBvZiB0aGUgYWRkcmVzcyBmaWVsZHMgZW5hYmxlZCBieSBmbGFnIGJpdCAxNiBhcmUgcGh5c2ljYWwgYWRkcmVzc2VzLgorVGhlIG1lYW5pbmcgb2YgZWFjaCBpcyBhcyBmb2xsb3dzOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIGhlYWRlcl9hZGRyCitDb250YWlucyB0aGUgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIE11bHRpYm9vdAoraGVhZGVyIC0tLSB0aGUgcGh5c2ljYWwgbWVtb3J5IGxvY2F0aW9uIGF0IHdoaWNoIHRoZSBtYWdpYyB2YWx1ZSBpcworc3VwcG9zZWQgdG8gYmUgbG9hZGVkLiBUaGlzIGZpZWxkIHNlcnZlcyB0byBAZGZue3N5bmNocm9uaXplfSB0aGUKK21hcHBpbmcgYmV0d2VlbiBPUyBpbWFnZSBvZmZzZXRzIGFuZCBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzc2VzLgorCitAaXRlbSBsb2FkX2FkZHIKK0NvbnRhaW5zIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRleHQgc2VnbWVudC4gVGhlCitvZmZzZXQgaW4gdGhlIE9TIGltYWdlIGZpbGUgYXQgd2hpY2ggdG8gc3RhcnQgbG9hZGluZyBpcyBkZWZpbmVkIGJ5IHRoZQorb2Zmc2V0IGF0IHdoaWNoIHRoZSBoZWFkZXIgd2FzIGZvdW5kLCBtaW51cyAoaGVhZGVyX2FkZHIgLQorbG9hZF9hZGRyKS4gbG9hZF9hZGRyIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGhlYWRlcl9hZGRyLgorCitAaXRlbSBsb2FkX2VuZF9hZGRyCitDb250YWlucyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSBkYXRhCitzZWdtZW50LiAobG9hZF9lbmRfYWRkciAtIGxvYWRfYWRkcikgc3BlY2lmaWVzIGhvdyBtdWNoIGRhdGEgdG8gbG9hZC4KK1RoaXMgaW1wbGllcyB0aGF0IHRoZSB0ZXh0IGFuZCBkYXRhIHNlZ21lbnRzIG11c3QgYmUgY29uc2VjdXRpdmUgaW4gdGhlCitPUyBpbWFnZTsgdGhpcyBpcyB0cnVlIGZvciBleGlzdGluZyBhLm91dCBleGVjdXRhYmxlIGZvcm1hdHMuCitJZiB0aGlzIGZpZWxkIGlzIHplcm8sIHRoZSBib290IGxvYWRlciBhc3N1bWVzIHRoYXQgdGhlIHRleHQgYW5kIGRhdGEKK3NlZ21lbnRzIG9jY3VweSB0aGUgd2hvbGUgT1MgaW1hZ2UgZmlsZS4KKworQGl0ZW0gYnNzX2VuZF9hZGRyCitDb250YWlucyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSBic3Mgc2VnbWVudC4gVGhlIGJvb3QKK2xvYWRlciBpbml0aWFsaXplcyB0aGlzIGFyZWEgdG8gemVybywgYW5kIHJlc2VydmVzIHRoZSBtZW1vcnkgaXQKK29jY3VwaWVzIHRvIGF2b2lkIHBsYWNpbmcgYm9vdCBtb2R1bGVzIGFuZCBvdGhlciBkYXRhIHJlbGV2YW50IHRvIHRoZQorb3BlcmF0aW5nIHN5c3RlbSBpbiB0aGF0IGFyZWEuIElmIHRoaXMgZmllbGQgaXMgemVybywgdGhlIGJvb3QgbG9hZGVyCithc3N1bWVzIHRoYXQgbm8gYnNzIHNlZ21lbnQgaXMgcHJlc2VudC4KKworQGl0ZW0gZW50cnlfYWRkcgorVGhlIHBoeXNpY2FsIGFkZHJlc3MgdG8gd2hpY2ggdGhlIGJvb3QgbG9hZGVyIHNob3VsZCBqdW1wIGluIG9yZGVyIHRvCitzdGFydCBydW5uaW5nIHRoZSBvcGVyYXRpbmcgc3lzdGVtLgorQGVuZCB0YWJsZQorCisKK0Bub2RlIEhlYWRlciBncmFwaGljcyBmaWVsZHMKK0BzdWJzZWN0aW9uIFRoZSBncmFwaGljcyBmaWVsZHMgb2YgTXVsdGlib290IGhlYWRlcgorCitBbGwgb2YgdGhlIGdyYXBoaWNzIGZpZWxkcyBhcmUgZW5hYmxlZCBieSBmbGFnIGJpdCAyLiBUaGV5IHNwZWNpZnkgdGhlCitwcmVmZXJyZWQgZ3JhcGhpY3MgbW9kZS4gTm90ZSB0aGF0IHRoYXQgaXMgb25seSBhIEBlbXBoe3JlY29tbWVuZGVkfQorbW9kZSBieSB0aGUgT1MgaW1hZ2UuIElmIHRoZSBtb2RlIGV4aXN0cywgdGhlIGJvb3QgbG9hZGVyIHNob3VsZCBzZXQKK2l0LCB3aGVuIHRoZSB1c2VyIGRvZXNuJ3Qgc3BlY2lmeSBhIG1vZGUgZXhwbGljaXRseS4gT3RoZXJ3aXNlLCB0aGUKK2Jvb3QgbG9hZGVyIHNob3VsZCBmYWxsIGJhY2sgdG8gYSBzaW1pbGFyIG1vZGUsIGlmIGF2YWlsYWJsZS4KKworVGhlIG1lYW5pbmcgb2YgZWFjaCBpcyBhcyBmb2xsb3dzOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIG1vZGVfdHlwZQorQ29udGFpbnMgQHNhbXB7MH0gZm9yIGxpbmVhciBncmFwaGljcyBtb2RlIG9yIEBzYW1wezF9IGZvcgorRUdBLXN0YW5kYXJkIHRleHQgbW9kZS4gRXZlcnl0aGluZyBlbHNlIGlzIHJlc2VydmVkIGZvciBmdXR1cmUKK2V4cGFuc2lvbi4gTm90ZSB0aGF0IHRoZSBib290IGxvYWRlciBtYXkgc2V0IGEgdGV4dCBtb2RlLCBldmVuIGlmIHRoaXMKK2ZpZWxkIGNvbnRhaW5zIEBzYW1wezB9LgorCitAaXRlbSB3aWR0aAorQ29udGFpbnMgdGhlIG51bWJlciBvZiB0aGUgY29sdW1ucy4gVGhpcyBpcyBzcGVjaWZpZWQgaW4gcGl4ZWxzIGluIGEKK2dyYXBoaWNzIG1vZGUsIGFuZCBpbiBjaGFyYWN0ZXJzIGluIGEgdGV4dCBtb2RlLiBUaGUgdmFsdWUgemVybworaW5kaWNhdGVzIHRoYXQgdGhlIE9TIGltYWdlIGhhcyBubyBwcmVmZXJlbmNlLgorCitAaXRlbSBoZWlnaHQKK0NvbnRhaW5zIHRoZSBudW1iZXIgb2YgdGhlIGxpbmVzLiBUaGlzIGlzIHNwZWNpZmllZCBpbiBwaXhlbHMgaW4gYQorZ3JhcGhpY3MgbW9kZSwgYW5kIGluIGNoYXJhY3RlcnMgaW4gYSB0ZXh0IG1vZGUuIFRoZSB2YWx1ZSB6ZXJvCitpbmRpY2F0ZXMgdGhhdCB0aGUgT1MgaW1hZ2UgaGFzIG5vIHByZWZlcmVuY2UuCisKK0BpdGVtIGRlcHRoCitDb250YWlucyB0aGUgbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsIGluIGEgZ3JhcGhpY3MgbW9kZSwgYW5kIHplcm8gaW4KK2EgdGV4dCBtb2RlLiBUaGUgdmFsdWUgemVybyBpbmRpY2F0ZXMgdGhhdCB0aGUgT1MgaW1hZ2UgaGFzIG5vCitwcmVmZXJlbmNlLgorQGVuZCB0YWJsZQorCisKK0Bub2RlIE1hY2hpbmUgc3RhdGUKK0BzZWN0aW9uIE1hY2hpbmUgc3RhdGUKKworV2hlbiB0aGUgYm9vdCBsb2FkZXIgaW52b2tlcyB0aGUgMzItYml0IG9wZXJhdGluZyBzeXN0ZW0sIHRoZSBtYWNoaW5lCittdXN0IGhhdmUgdGhlIGZvbGxvd2luZyBzdGF0ZToKKworQHRhYmxlIEBzYW1wCitAaXRlbSBFQVgKK011c3QgY29udGFpbiB0aGUgbWFnaWMgdmFsdWUgQHNhbXB7MHgyQkFEQjAwMn07IHRoZSBwcmVzZW5jZSBvZiB0aGlzCit2YWx1ZSBpbmRpY2F0ZXMgdG8gdGhlIG9wZXJhdGluZyBzeXN0ZW0gdGhhdCBpdCB3YXMgbG9hZGVkIGJ5IGEKK011bHRpYm9vdC1jb21wbGlhbnQgYm9vdCBsb2FkZXIgKGUuZy4gYXMgb3Bwb3NlZCB0byBhbm90aGVyIHR5cGUgb2YKK2Jvb3QgbG9hZGVyIHRoYXQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gY2FuIGFsc28gYmUgbG9hZGVkIGZyb20pLgorCitAaXRlbSBFQlgKK011c3QgY29udGFpbiB0aGUgMzItYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIE11bHRpYm9vdAoraW5mb3JtYXRpb24gc3RydWN0dXJlIHByb3ZpZGVkIGJ5IHRoZSBib290IGxvYWRlciAoQHB4cmVme0Jvb3QKK2luZm9ybWF0aW9uIGZvcm1hdH0pLgorCitAaXRlbSBDUworTXVzdCBiZSBhIDMyLWJpdCByZWFkL2V4ZWN1dGUgY29kZSBzZWdtZW50IHdpdGggYW4gb2Zmc2V0IG9mIEBzYW1wezB9CithbmQgYSBsaW1pdCBvZiBAc2FtcHsweEZGRkZGRkZGfS4gVGhlIGV4YWN0IHZhbHVlIGlzIHVuZGVmaW5lZC4KKworQGl0ZW0gRFMKK0BpdGVteCBFUworQGl0ZW14IEZTCitAaXRlbXggR1MKK0BpdGVteCBTUworTXVzdCBiZSBhIDMyLWJpdCByZWFkL3dyaXRlIGRhdGEgc2VnbWVudCB3aXRoIGFuIG9mZnNldCBvZiBAc2FtcHswfQorYW5kIGEgbGltaXQgb2YgQHNhbXB7MHhGRkZGRkZGRn0uIFRoZSBleGFjdCB2YWx1ZXMgYXJlIGFsbCB1bmRlZmluZWQuCisKK0BpdGVtIEEyMCBnYXRlCitNdXN0IGJlIGVuYWJsZWQuCisKK0BpdGVtIENSMAorQml0IDMxIChQRykgbXVzdCBiZSBjbGVhcmVkLiBCaXQgMCAoUEUpIG11c3QgYmUgc2V0LiBPdGhlciBiaXRzIGFyZQorYWxsIHVuZGVmaW5lZC4KKworQGl0ZW0gRUZMQUdTCitCaXQgMTcgKFZNKSBtdXN0IGJlIGNsZWFyZWQuIEJpdCA5IChJRikgbXVzdCBiZSBjbGVhcmVkLiBPdGhlciBiaXRzCithcmUgYWxsIHVuZGVmaW5lZC4KK0BlbmQgdGFibGUKKworQWxsIG90aGVyIHByb2Nlc3NvciByZWdpc3RlcnMgYW5kIGZsYWcgYml0cyBhcmUgdW5kZWZpbmVkLiBUaGlzCitpbmNsdWRlcywgaW4gcGFydGljdWxhcjoKKworQHRhYmxlIEBzYW1wCitAaXRlbSBFU1AKK1RoZSBPUyBpbWFnZSBtdXN0IGNyZWF0ZSBpdHMgb3duIHN0YWNrIGFzIHNvb24gYXMgaXQgbmVlZHMgb25lLgorCitAaXRlbSBHRFRSCitFdmVuIHRob3VnaCB0aGUgc2VnbWVudCByZWdpc3RlcnMgYXJlIHNldCB1cCBhcyBkZXNjcmliZWQgYWJvdmUsIHRoZQorQHNhbXB7R0RUUn0gbWF5IGJlIGludmFsaWQsIHNvIHRoZSBPUyBpbWFnZSBtdXN0IG5vdCBsb2FkIGFueSBzZWdtZW50CityZWdpc3RlcnMgKGV2ZW4ganVzdCByZWxvYWRpbmcgdGhlIHNhbWUgdmFsdWVzISkgdW50aWwgaXQgc2V0cyB1cCBpdHMKK293biBAc2FtcHtHRFR9LgorCitAaXRlbSBJRFRSCitUaGUgT1MgaW1hZ2UgbXVzdCBsZWF2ZSBpbnRlcnJ1cHRzIGRpc2FibGVkIHVudGlsIGl0IHNldHMgdXAgaXRzIG93bgorQGNvZGV7SURUfS4KK0BlbmQgdGFibGUKKworSG93ZXZlciwgb3RoZXIgbWFjaGluZSBzdGF0ZSBzaG91bGQgYmUgbGVmdCBieSB0aGUgYm9vdCBsb2FkZXIgaW4KK0BkZm57bm9ybWFsIHdvcmtpbmcgb3JkZXJ9LCBpLmUuIGFzIGluaXRpYWxpemVkIGJ5IHRoZSBAc2N7Ymlvc30gKG9yCitET1MsIGlmIHRoYXQncyB3aGF0IHRoZSBib290IGxvYWRlciBydW5zIGZyb20pLiBJbiBvdGhlciB3b3JkcywgdGhlCitvcGVyYXRpbmcgc3lzdGVtIHNob3VsZCBiZSBhYmxlIHRvIG1ha2UgQHNje2Jpb3N9IGNhbGxzIGFuZCBzdWNoIGFmdGVyCitiZWluZyBsb2FkZWQsIGFzIGxvbmcgYXMgaXQgZG9lcyBub3Qgb3ZlcndyaXRlIHRoZSBAc2N7Ymlvc30gZGF0YQorc3RydWN0dXJlcyBiZWZvcmUgZG9pbmcgc28uIEFsc28sIHRoZSBib290IGxvYWRlciBtdXN0IGxlYXZlIHRoZQorQHNje3BpY30gcHJvZ3JhbW1lZCB3aXRoIHRoZSBub3JtYWwgQHNje2Jpb3N9L0RPUyB2YWx1ZXMsIGV2ZW4gaWYgaXQKK2NoYW5nZWQgdGhlbSBkdXJpbmcgdGhlIHN3aXRjaCB0byAzMi1iaXQgbW9kZS4KKworCitAbm9kZSBCb290IGluZm9ybWF0aW9uIGZvcm1hdAorQHNlY3Rpb24gQm9vdCBpbmZvcm1hdGlvbiBmb3JtYXQKKworRklYTUU6IFNwbGl0IHRoaXMgY2hhcHRlciBsaWtlIHRoZSBjaGFwdGVyIGBgT1MgaW1hZ2UgZm9ybWF0JycuCisKK1Vwb24gZW50cnkgdG8gdGhlIG9wZXJhdGluZyBzeXN0ZW0sIHRoZSBAY29kZXtFQlh9IHJlZ2lzdGVyIGNvbnRhaW5zIHRoZQorcGh5c2ljYWwgYWRkcmVzcyBvZiBhIEBkZm57TXVsdGlib290IGluZm9ybWF0aW9ufSBkYXRhIHN0cnVjdHVyZSwKK3Rocm91Z2ggd2hpY2ggdGhlIGJvb3QgbG9hZGVyIGNvbW11bmljYXRlcyB2aXRhbCBpbmZvcm1hdGlvbiB0byB0aGUKK29wZXJhdGluZyBzeXN0ZW0uIFRoZSBvcGVyYXRpbmcgc3lzdGVtIGNhbiB1c2Ugb3IgaWdub3JlIGFueSBwYXJ0cyBvZgordGhlIHN0cnVjdHVyZSBhcyBpdCBjaG9vc2VzOyBhbGwgaW5mb3JtYXRpb24gcGFzc2VkIGJ5IHRoZSBib290IGxvYWRlcgoraXMgYWR2aXNvcnkgb25seS4KKworVGhlIE11bHRpYm9vdCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgYW5kIGl0cyByZWxhdGVkIHN1YnN0cnVjdHVyZXMgbWF5IGJlCitwbGFjZWQgYW55d2hlcmUgaW4gbWVtb3J5IGJ5IHRoZSBib290IGxvYWRlciAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZQorbWVtb3J5IHJlc2VydmVkIGZvciB0aGUga2VybmVsIGFuZCBib290IG1vZHVsZXMsIG9mIGNvdXJzZSkuIEl0IGlzIHRoZQorb3BlcmF0aW5nIHN5c3RlbSdzIHJlc3BvbnNpYmlsaXR5IHRvIGF2b2lkIG92ZXJ3cml0aW5nIHRoaXMgbWVtb3J5IHVudGlsCitpdCBpcyBkb25lIHVzaW5nIGl0LgorCitUaGUgZm9ybWF0IG9mIHRoZSBNdWx0aWJvb3QgaW5mb3JtYXRpb24gc3RydWN0dXJlIChhcyBkZWZpbmVkIHNvIGZhcikKK2ZvbGxvd3M6CisKK0BleGFtcGxlCitAZ3JvdXAKKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rCiswICAgICAgIHwgZmxhZ3MgICAgICAgICAgICAgfCAgICAocmVxdWlyZWQpCisgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKworNCAgICAgICB8IG1lbV9sb3dlciAgICAgICAgIHwgICAgKHByZXNlbnQgaWYgZmxhZ3NbMF0gaXMgc2V0KQorOCAgICAgICB8IG1lbV91cHBlciAgICAgICAgIHwgICAgKHByZXNlbnQgaWYgZmxhZ3NbMF0gaXMgc2V0KQorICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLSsKKzEyICAgICAgfCBib290X2RldmljZSAgICAgICB8ICAgIChwcmVzZW50IGlmIGZsYWdzWzFdIGlzIHNldCkKKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rCisxNiAgICAgIHwgY21kbGluZSAgICAgICAgICAgfCAgICAocHJlc2VudCBpZiBmbGFnc1syXSBpcyBzZXQpCisgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKworMjAgICAgICB8IG1vZHNfY291bnQgICAgICAgIHwgICAgKHByZXNlbnQgaWYgZmxhZ3NbM10gaXMgc2V0KQorMjQgICAgICB8IG1vZHNfYWRkciAgICAgICAgIHwgICAgKHByZXNlbnQgaWYgZmxhZ3NbM10gaXMgc2V0KQorICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLSsKKzI4IC0gNDAgfCBzeW1zICAgICAgICAgICAgICB8ICAgIChwcmVzZW50IGlmIGZsYWdzWzRdIG9yCisgICAgICAgIHwgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBmbGFnc1s1XSBpcyBzZXQpCisgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKworNDQgICAgICB8IG1tYXBfbGVuZ3RoICAgICAgIHwgICAgKHByZXNlbnQgaWYgZmxhZ3NbNl0gaXMgc2V0KQorNDggICAgICB8IG1tYXBfYWRkciAgICAgICAgIHwgICAgKHByZXNlbnQgaWYgZmxhZ3NbNl0gaXMgc2V0KQorICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLSsKKzUyICAgICAgfCBkcml2ZXNfbGVuZ3RoICAgICB8ICAgIChwcmVzZW50IGlmIGZsYWdzWzddIGlzIHNldCkKKzU2ICAgICAgfCBkcml2ZXNfYWRkciAgICAgICB8ICAgIChwcmVzZW50IGlmIGZsYWdzWzddIGlzIHNldCkKKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rCis2MCAgICAgIHwgY29uZmlnX3RhYmxlICAgICAgfCAgICAocHJlc2VudCBpZiBmbGFnc1s4XSBpcyBzZXQpCisgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKworNjQgICAgICB8IGJvb3RfbG9hZGVyX25hbWUgIHwgICAgKHByZXNlbnQgaWYgZmxhZ3NbOV0gaXMgc2V0KQorICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLSsKKzY4ICAgICAgfCBhcG1fdGFibGUgICAgICAgICB8ICAgIChwcmVzZW50IGlmIGZsYWdzWzEwXSBpcyBzZXQpCisgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKworNzIgICAgICB8IHZiZV9jb250cm9sX2luZm8gIHwgICAgKHByZXNlbnQgaWYgZmxhZ3NbMTFdIGlzIHNldCkKKzc2ICAgICAgfCB2YmVfbW9kZV9pbmZvICAgICB8Cis4MCAgICAgIHwgdmJlX21vZGUgICAgICAgICAgfAorODIgICAgICB8IHZiZV9pbnRlcmZhY2Vfc2VnIHwKKzg0ICAgICAgfCB2YmVfaW50ZXJmYWNlX29mZiB8Cis4NiAgICAgIHwgdmJlX2ludGVyZmFjZV9sZW4gfAorICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLSsKK0BlbmQgZ3JvdXAKK0BlbmQgZXhhbXBsZQorCitUaGUgZmlyc3QgbG9uZ3dvcmQgaW5kaWNhdGVzIHRoZSBwcmVzZW5jZSBhbmQgdmFsaWRpdHkgb2Ygb3RoZXIgZmllbGRzCitpbiB0aGUgTXVsdGlib290IGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gQWxsIGFzLXlldC11bmRlZmluZWQgYml0cyBtdXN0CitiZSBzZXQgdG8gemVybyBieSB0aGUgYm9vdCBsb2FkZXIuIEFueSBzZXQgYml0cyB0aGF0IHRoZSBvcGVyYXRpbmcKK3N5c3RlbSBkb2VzIG5vdCB1bmRlcnN0YW5kIHNob3VsZCBiZSBpZ25vcmVkLiBUaHVzLCB0aGUgQHNhbXB7ZmxhZ3N9CitmaWVsZCBhbHNvIGZ1bmN0aW9ucyBhcyBhIHZlcnNpb24gaW5kaWNhdG9yLCBhbGxvd2luZyB0aGUgTXVsdGlib290CitpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgdG8gYmUgZXhwYW5kZWQgaW4gdGhlIGZ1dHVyZSB3aXRob3V0IGJyZWFraW5nCithbnl0aGluZy4KKworSWYgYml0IDAgaW4gdGhlIEBzYW1we2ZsYWdzfSB3b3JkIGlzIHNldCwgdGhlbiB0aGUgQHNhbXB7bWVtXyp9IGZpZWxkcworYXJlIHZhbGlkLiBAc2FtcHttZW1fbG93ZXJ9IGFuZCBAc2FtcHttZW1fdXBwZXJ9IGluZGljYXRlIHRoZSBhbW91bnQgb2YKK2xvd2VyIGFuZCB1cHBlciBtZW1vcnksIHJlc3BlY3RpdmVseSwgaW4ga2lsb2J5dGVzLiBMb3dlciBtZW1vcnkgc3RhcnRzCithdCBhZGRyZXNzIDAsIGFuZCB1cHBlciBtZW1vcnkgc3RhcnRzIGF0IGFkZHJlc3MgMSBtZWdhYnl0ZS4gVGhlIG1heGltdW0KK3Bvc3NpYmxlIHZhbHVlIGZvciBsb3dlciBtZW1vcnkgaXMgNjQwIGtpbG9ieXRlcy4gVGhlIHZhbHVlIHJldHVybmVkIGZvcgordXBwZXIgbWVtb3J5IGlzIG1heGltYWxseSB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgdXBwZXIgbWVtb3J5IGhvbGUKK21pbnVzIDEgbWVnYWJ5dGUuIEl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHRoaXMgdmFsdWUuCisKK0lmIGJpdCAxIGluIHRoZSBAc2FtcHtmbGFnc30gd29yZCBpcyBzZXQsIHRoZW4gdGhlIEBzYW1we2Jvb3RfZGV2aWNlfQorZmllbGQgaXMgdmFsaWQsIGFuZCBpbmRpY2F0ZXMgd2hpY2ggQHNje2Jpb3N9IGRpc2sgZGV2aWNlIHRoZSBib290Citsb2FkZXIgbG9hZGVkIHRoZSBPUyBpbWFnZSBmcm9tLiBJZiB0aGUgT1MgaW1hZ2Ugd2FzIG5vdCBsb2FkZWQgZnJvbSBhCitAc2N7Ymlvc30gZGlzaywgdGhlbiB0aGlzIGZpZWxkIG11c3Qgbm90IGJlIHByZXNlbnQgKGJpdCAzIG11c3QgYmUKK2NsZWFyKS4gVGhlIG9wZXJhdGluZyBzeXN0ZW0gbWF5IHVzZSB0aGlzIGZpZWxkIGFzIGEgaGludCBmb3IKK2RldGVybWluaW5nIGl0cyBvd24gQGRmbntyb290fSBkZXZpY2UsIGJ1dCBpcyBub3QgcmVxdWlyZWQgdG8uIFRoZQorQHNhbXB7Ym9vdF9kZXZpY2V9IGZpZWxkIGlzIGxhaWQgb3V0IGluIGZvdXIgb25lLWJ5dGUgc3ViZmllbGRzIGFzCitmb2xsb3dzOgorCitAZXhhbXBsZQorQGdyb3VwCisrLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKK3wgZHJpdmUgfCBwYXJ0MSB8IHBhcnQyIHwgcGFydDMgfAorKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCitAZW5kIGdyb3VwCitAZW5kIGV4YW1wbGUKKworVGhlIGZpcnN0IGJ5dGUgY29udGFpbnMgdGhlIEBzY3tiaW9zfSBkcml2ZSBudW1iZXIgYXMgdW5kZXJzdG9vZCBieSB0aGUKK0BzY3tiaW9zfSBJTlQgMHgxMyBsb3ctbGV2ZWwgZGlzayBpbnRlcmZhY2U6IGUuZy4gMHgwMCBmb3IgdGhlIGZpcnN0CitmbG9wcHkgZGlzayBvciAweDgwIGZvciB0aGUgZmlyc3QgaGFyZCBkaXNrLgorCitUaGUgdGhyZWUgcmVtYWluaW5nIGJ5dGVzIHNwZWNpZnkgdGhlIGJvb3QgcGFydGl0aW9uLiBAc2FtcHtwYXJ0MX0KK3NwZWNpZmllcyB0aGUgQGRmbnt0b3AtbGV2ZWx9IHBhcnRpdGlvbiBudW1iZXIsIEBzYW1we3BhcnQyfSBzcGVjaWZpZXMgYQorQGRmbntzdWItcGFydGl0aW9ufSBpbiB0aGUgdG9wLWxldmVsIHBhcnRpdGlvbiwgZXRjLiBQYXJ0aXRpb24gbnVtYmVycworYWx3YXlzIHN0YXJ0IGZyb20gemVyby4gVW51c2VkIHBhcnRpdGlvbiBieXRlcyBtdXN0IGJlIHNldCB0byAweEZGLiBGb3IKK2V4YW1wbGUsIGlmIHRoZSBkaXNrIGlzIHBhcnRpdGlvbmVkIHVzaW5nIGEgc2ltcGxlIG9uZS1sZXZlbCBET1MKK3BhcnRpdGlvbmluZyBzY2hlbWUsIHRoZW4gQHNhbXB7cGFydDF9IGNvbnRhaW5zIHRoZSBET1MgcGFydGl0aW9uCitudW1iZXIsIGFuZCBAc2FtcHtwYXJ0Mn0gYW5kIEBzYW1we3BhcnQzfSBhcmUgYm90aCAweEZGLiBBcyBhbm90aGVyCitleGFtcGxlLCBpZiBhIGRpc2sgaXMgcGFydGl0aW9uZWQgZmlyc3QgaW50byBET1MgcGFydGl0aW9ucywgYW5kIHRoZW4KK29uZSBvZiB0aG9zZSBET1MgcGFydGl0aW9ucyBpcyBzdWJkaXZpZGVkIGludG8gc2V2ZXJhbCBCU0QgcGFydGl0aW9ucwordXNpbmcgQlNEJ3MgQGRmbntkaXNrbGFiZWx9IHN0cmF0ZWd5LCB0aGVuIEBzYW1we3BhcnQxfSBjb250YWlucyB0aGUgRE9TCitwYXJ0aXRpb24gbnVtYmVyLCBAc2FtcHtwYXJ0Mn0gY29udGFpbnMgdGhlIEJTRCBzdWItcGFydGl0aW9uIHdpdGhpbgordGhhdCBET1MgcGFydGl0aW9uLCBhbmQgQHNhbXB7cGFydDN9IGlzIDB4RkYuCisKK0RPUyBleHRlbmRlZCBwYXJ0aXRpb25zIGFyZSBpbmRpY2F0ZWQgYXMgcGFydGl0aW9uIG51bWJlcnMgc3RhcnRpbmcgZnJvbQorNCBhbmQgaW5jcmVhc2luZywgcmF0aGVyIHRoYW4gYXMgbmVzdGVkIHN1Yi1wYXJ0aXRpb25zLCBldmVuIHRob3VnaCB0aGUKK3VuZGVybHlpbmcgZGlzayBsYXlvdXQgb2YgZXh0ZW5kZWQgcGFydGl0aW9ucyBpcyBoaWVyYXJjaGljYWwgaW4KK25hdHVyZS4gRm9yIGV4YW1wbGUsIGlmIHRoZSBib290IGxvYWRlciBib290cyBmcm9tIHRoZSBzZWNvbmQgZXh0ZW5kZWQKK3BhcnRpdGlvbiBvbiBhIGRpc2sgcGFydGl0aW9uZWQgaW4gY29udmVudGlvbmFsIERPUyBzdHlsZSwgdGhlbgorQHNhbXB7cGFydDF9IHdpbGwgYmUgNSwgYW5kIEBzYW1we3BhcnQyfSBhbmQgQHNhbXB7cGFydDN9IHdpbGwgYm90aCBiZQorMHhGRi4KKworSWYgYml0IDIgb2YgdGhlIEBzYW1we2ZsYWdzfSBsb25nd29yZCBpcyBzZXQsIHRoZSBAc2FtcHtjbWRsaW5lfSBmaWVsZAoraXMgdmFsaWQsIGFuZCBjb250YWlucyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgY29tbWFuZCBsaW5lIHRvCitiZSBwYXNzZWQgdG8gdGhlIGtlcm5lbC4gVGhlIGNvbW1hbmQgbGluZSBpcyBhIG5vcm1hbCBDLXN0eWxlCit6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5nLgorCitJZiBiaXQgMyBvZiB0aGUgQHNhbXB7ZmxhZ3N9IGlzIHNldCwgdGhlbiB0aGUgQHNhbXB7bW9kc30gZmllbGRzCitpbmRpY2F0ZSB0byB0aGUga2VybmVsIHdoYXQgYm9vdCBtb2R1bGVzIHdlcmUgbG9hZGVkIGFsb25nIHdpdGggdGhlCitrZXJuZWwgaW1hZ2UsIGFuZCB3aGVyZSB0aGV5IGNhbiBiZSBmb3VuZC4gQHNhbXB7bW9kc19jb3VudH0gY29udGFpbnMKK3RoZSBudW1iZXIgb2YgbW9kdWxlcyBsb2FkZWQ7IEBzYW1we21vZHNfYWRkcn0gY29udGFpbnMgdGhlIHBoeXNpY2FsCithZGRyZXNzIG9mIHRoZSBmaXJzdCBtb2R1bGUgc3RydWN0dXJlLiBAc2FtcHttb2RzX2NvdW50fSBtYXkgYmUgemVybywKK2luZGljYXRpbmcgbm8gYm9vdCBtb2R1bGVzIHdlcmUgbG9hZGVkLCBldmVuIGlmIGJpdCAxIG9mIEBzYW1we2ZsYWdzfSBpcworc2V0LiBFYWNoIG1vZHVsZSBzdHJ1Y3R1cmUgaXMgZm9ybWF0dGVkIGFzIGZvbGxvd3M6CisKK0BleGFtcGxlCitAZ3JvdXAKKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rCiswICAgICAgIHwgbW9kX3N0YXJ0ICAgICAgICAgfAorNCAgICAgICB8IG1vZF9lbmQgICAgICAgICAgIHwKKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rCis4ICAgICAgIHwgc3RyaW5nICAgICAgICAgICAgfAorICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLSsKKzEyICAgICAgfCByZXNlcnZlZCAoMCkgICAgICB8CisgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKworQGVuZCBncm91cAorQGVuZCBleGFtcGxlCisKK1RoZSBmaXJzdCB0d28gZmllbGRzIGNvbnRhaW4gdGhlIHN0YXJ0IGFuZCBlbmQgYWRkcmVzc2VzIG9mIHRoZSBib290Cittb2R1bGUgaXRzZWxmLiBUaGUgQHNhbXB7c3RyaW5nfSBmaWVsZCBwcm92aWRlcyBhbiBhcmJpdHJhcnkgc3RyaW5nIHRvCitiZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBwYXJ0aWN1bGFyIGJvb3QgbW9kdWxlOyBpdCBpcyBhIHplcm8tdGVybWluYXRlZAorQVNDSUkgc3RyaW5nLCBqdXN0IGxpa2UgdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuIFRoZSBAc2FtcHtzdHJpbmd9IGZpZWxkCittYXkgYmUgMCBpZiB0aGVyZSBpcyBubyBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb2R1bGUuIFR5cGljYWxseSB0aGUKK3N0cmluZyBtaWdodCBiZSBhIGNvbW1hbmQgbGluZSAoZS5nLiBpZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0cmVhdHMgYm9vdAorbW9kdWxlcyBhcyBleGVjdXRhYmxlIHByb2dyYW1zKSwgb3IgYSBwYXRobmFtZSAoZS5nLiBpZiB0aGUgb3BlcmF0aW5nCitzeXN0ZW0gdHJlYXRzIGJvb3QgbW9kdWxlcyBhcyBmaWxlcyBpbiBhIGZpbGUgc3lzdGVtKSwgYnV0IGl0cyBleGFjdCB1c2UKK2lzIHNwZWNpZmljIHRvIHRoZSBvcGVyYXRpbmcgc3lzdGVtLiBUaGUgQHNhbXB7cmVzZXJ2ZWR9IGZpZWxkIG11c3QgYmUKK3NldCB0byAwIGJ5IHRoZSBib290IGxvYWRlciBhbmQgaWdub3JlZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4KKworQHN0cm9uZ3tDYXV0aW9uOn0gQml0cyA0ICYgNSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgorCitJZiBiaXQgNCBpbiB0aGUgQHNhbXB7ZmxhZ3N9IHdvcmQgaXMgc2V0LCB0aGVuIHRoZSBmb2xsb3dpbmcgZmllbGRzIGluCit0aGUgTXVsdGlib290IGluZm9ybWF0aW9uIHN0cnVjdHVyZSBzdGFydGluZyBhdCBieXRlIDI4IGFyZSB2YWxpZDoKKworQGV4YW1wbGUKK0Bncm91cAorICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLSsKKzI4ICAgICAgfCB0YWJzaXplICAgICAgICAgICB8CiszMiAgICAgIHwgc3Ryc2l6ZSAgICAgICAgICAgfAorMzYgICAgICB8IGFkZHIgICAgICAgICAgICAgIHwKKzQwICAgICAgfCByZXNlcnZlZCAoMCkgICAgICB8CisgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKworQGVuZCBncm91cAorQGVuZCBleGFtcGxlCisKK1RoZXNlIGluZGljYXRlIHdoZXJlIHRoZSBzeW1ib2wgdGFibGUgZnJvbSBhbiBhLm91dCBrZXJuZWwgaW1hZ2UgY2FuIGJlCitmb3VuZC4gQHNhbXB7YWRkcn0gaXMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHNpemUgKDQtYnl0ZSB1bnNpZ25lZAorbG9uZykgb2YgYW4gYXJyYXkgb2YgYS5vdXQgZm9ybWF0IEBkZm57bmxpc3R9IHN0cnVjdHVyZXMsIGZvbGxvd2VkCitpbW1lZGlhdGVseSBieSB0aGUgYXJyYXkgaXRzZWxmLCB0aGVuIHRoZSBzaXplICg0LWJ5dGUgdW5zaWduZWQgbG9uZykgb2YKK2Egc2V0IG9mIHplcm8tdGVybWluYXRlZCBAc2N7YXNjaWl9IHN0cmluZ3MgKHBsdXMgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpIGluCit0aGlzIGNhc2UpLCBhbmQgZmluYWxseSB0aGUgc2V0IG9mIHN0cmluZ3MgaXRzZWxmLiBAc2FtcHt0YWJzaXplfSBpcworZXF1YWwgdG8gaXRzIHNpemUgcGFyYW1ldGVyIChmb3VuZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzeW1ib2wKK3NlY3Rpb24pLCBhbmQgQHNhbXB7c3Ryc2l6ZX0gaXMgZXF1YWwgdG8gaXRzIHNpemUgcGFyYW1ldGVyIChmb3VuZCBhdAordGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nIHNlY3Rpb24pIG9mIHRoZSBmb2xsb3dpbmcgc3RyaW5nIHRhYmxlIHRvCit3aGljaCB0aGUgc3ltYm9sIHRhYmxlIHJlZmVycy4gTm90ZSB0aGF0IEBzYW1we3RhYnNpemV9IG1heSBiZSAwLAoraW5kaWNhdGluZyBubyBzeW1ib2xzLCBldmVuIGlmIGJpdCA0IGluIHRoZSBAc2FtcHtmbGFnc30gd29yZCBpcyBzZXQuCisKK0lmIGJpdCA1IGluIHRoZSBAc2FtcHtmbGFnc30gd29yZCBpcyBzZXQsIHRoZW4gdGhlIGZvbGxvd2luZyBmaWVsZHMgaW4KK3RoZSBNdWx0aWJvb3QgaW5mb3JtYXRpb24gc3RydWN0dXJlIHN0YXJ0aW5nIGF0IGJ5dGUgMjggYXJlIHZhbGlkOgorCitAZXhhbXBsZQorQGdyb3VwCisgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKworMjggICAgICB8IG51bSAgICAgICAgICAgICAgIHwKKzMyICAgICAgfCBzaXplICAgICAgICAgICAgICB8CiszNiAgICAgIHwgYWRkciAgICAgICAgICAgICAgfAorNDAgICAgICB8IHNobmR4ICAgICAgICAgICAgIHwKKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rCitAZW5kIGdyb3VwCitAZW5kIGV4YW1wbGUKKworVGhlc2UgaW5kaWNhdGUgd2hlcmUgdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGZyb20gYW4gRUxGIGtlcm5lbCBpcywgdGhlCitzaXplIG9mIGVhY2ggZW50cnksIG51bWJlciBvZiBlbnRyaWVzLCBhbmQgdGhlIHN0cmluZyB0YWJsZSB1c2VkIGFzIHRoZQoraW5kZXggb2YgbmFtZXMuIFRoZXkgY29ycmVzcG9uZCB0byB0aGUgQHNhbXB7c2hkcl8qfSBlbnRyaWVzCisoQHNhbXB7c2hkcl9udW19LCBldGMuKSBpbiB0aGUgRXhlY3V0YWJsZSBhbmQgTGlua2FibGUgRm9ybWF0IChAc2N7ZWxmfSkKK3NwZWNpZmljYXRpb24gaW4gdGhlIHByb2dyYW0gaGVhZGVyLiBBbGwgc2VjdGlvbnMgYXJlIGxvYWRlZCwgYW5kIHRoZQorcGh5c2ljYWwgYWRkcmVzcyBmaWVsZHMgb2YgdGhlIEBzY3tlbGZ9IHNlY3Rpb24gaGVhZGVyIHRoZW4gcmVmZXIgdG8gd2hlcmUKK3RoZSBzZWN0aW9ucyBhcmUgaW4gbWVtb3J5IChyZWZlciB0byB0aGUgaTM4NiBAc2N7ZWxmfSBkb2N1bWVudGF0aW9uIGZvcgorZGV0YWlscyBhcyB0byBob3cgdG8gcmVhZCB0aGUgc2VjdGlvbiBoZWFkZXIocykpLiBOb3RlIHRoYXQKK0BzYW1we3NoZHJfbnVtfSBtYXkgYmUgMCwgaW5kaWNhdGluZyBubyBzeW1ib2xzLCBldmVuIGlmIGJpdCA1IGluIHRoZQorQHNhbXB7ZmxhZ3N9IHdvcmQgaXMgc2V0LgorCitJZiBiaXQgNiBpbiB0aGUgQHNhbXB7ZmxhZ3N9IHdvcmQgaXMgc2V0LCB0aGVuIHRoZSBAc2FtcHttbWFwXyp9IGZpZWxkcworYXJlIHZhbGlkLCBhbmQgaW5kaWNhdGUgdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBvZiBhIGJ1ZmZlciBjb250YWluaW5nIGEKK21lbW9yeSBtYXAgb2YgdGhlIG1hY2hpbmUgcHJvdmlkZWQgYnkgdGhlIEBzY3tiaW9zfS4gQHNhbXB7bW1hcF9hZGRyfSBpcwordGhlIGFkZHJlc3MsIGFuZCBAc2FtcHttbWFwX2xlbmd0aH0gaXMgdGhlIHRvdGFsIHNpemUgb2YgdGhlIGJ1ZmZlci4gVGhlCitidWZmZXIgY29uc2lzdHMgb2Ygb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBzaXplL3N0cnVjdHVyZSBwYWlycworKEBzYW1we3NpemV9IGlzIHJlYWxseSB1c2VkIGZvciBza2lwcGluZyB0byB0aGUgbmV4dCBwYWlyKToKKworQGV4YW1wbGUKK0Bncm91cAorICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy00ICAgICAgfCBzaXplICAgICAgICAgICAgICB8CisgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKworMCAgICAgICB8IGJhc2VfYWRkcl9sb3cgICAgIHwKKzQgICAgICAgfCBiYXNlX2FkZHJfaGlnaCAgICB8Cis4ICAgICAgIHwgbGVuZ3RoX2xvdyAgICAgICAgfAorMTIgICAgICB8IGxlbmd0aF9oaWdoICAgICAgIHwKKzE2ICAgICAgfCB0eXBlICAgICAgICAgICAgICB8CisgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKworQGVuZCBncm91cAorQGVuZCBleGFtcGxlCisKK3doZXJlIEBzYW1we3NpemV9IGlzIHRoZSBzaXplIG9mIHRoZSBhc3NvY2lhdGVkIHN0cnVjdHVyZSBpbiBieXRlcywgd2hpY2gKK2NhbiBiZSBncmVhdGVyIHRoYW4gdGhlIG1pbmltdW0gb2YgMjAgYnl0ZXMuIEBzYW1we2Jhc2VfYWRkcl9sb3d9IGlzIHRoZQorbG93ZXIgMzIgYml0cyBvZiB0aGUgc3RhcnRpbmcgYWRkcmVzcywgYW5kIEBzYW1we2Jhc2VfYWRkcl9oaWdofSBpcyB0aGUKK3VwcGVyIDMyIGJpdHMsIGZvciBhIHRvdGFsIG9mIGEgNjQtYml0IHN0YXJ0aW5nIGFkZHJlc3MuIEBzYW1we2xlbmd0aF9sb3d9CitpcyB0aGUgbG93ZXIgMzIgYml0cyBvZiB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IHJlZ2lvbiBpbiBieXRlcywgYW5kCitAc2FtcHtsZW5ndGhfaGlnaH0gaXMgdGhlIHVwcGVyIDMyIGJpdHMsIGZvciBhIHRvdGFsIG9mIGEgNjQtYml0CitsZW5ndGguIEBzYW1we3R5cGV9IGlzIHRoZSB2YXJpZXR5IG9mIGFkZHJlc3MgcmFuZ2UgcmVwcmVzZW50ZWQsIHdoZXJlIGEKK3ZhbHVlIG9mIDEgaW5kaWNhdGVzIGF2YWlsYWJsZSBAc2N7cmFtfSwgYW5kIGFsbCBvdGhlciB2YWx1ZXMgY3VycmVudGx5CitpbmRpY2F0ZWQgYSByZXNlcnZlZCBhcmVhLgorCitUaGUgbWFwIHByb3ZpZGVkIGlzIGd1YXJhbnRlZWQgdG8gbGlzdCBhbGwgc3RhbmRhcmQgQHNje3JhbX0gdGhhdCBzaG91bGQKK2JlIGF2YWlsYWJsZSBmb3Igbm9ybWFsIHVzZS4KKworSWYgYml0IDcgaW4gdGhlIEBzYW1we2ZsYWdzfSBpcyBzZXQsIHRoZW4gdGhlIEBzYW1we2RyaXZlc18qfSBmaWVsZHMKK2FyZSB2YWxpZCwgYW5kIGluZGljYXRlIHRoZSBhZGRyZXNzIG9mIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBmaXJzdAorZHJpdmUgc3RydWN0dXJlIGFuZCB0aGUgc2l6ZSBvZiBkcml2ZSBzdHJ1Y3R1cmVzLiBAc2FtcHtkcml2ZXNfYWRkcn0KK2lzIHRoZSBhZGRyZXNzLCBhbmQgQHNhbXB7ZHJpdmVzX2xlbmd0aH0gaXMgdGhlIHRvdGFsIHNpemUgb2YgZHJpdmUKK3N0cnVjdHVyZXMuIE5vdGUgdGhhdCBAc2FtcHtkcml2ZXNfbGVuZ3RofSBtYXkgYmUgemVyby4gRWFjaCBkcml2ZQorc3RydWN0dXJlIGlzIGZvcm1hdHRlZCBhcyBmb2xsb3dzOgorCitAZXhhbXBsZQorQGdyb3VwCisgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKworMCAgICAgICB8IHNpemUgICAgICAgICAgICAgIHwKKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rCis0ICAgICAgIHwgZHJpdmVfbnVtYmVyICAgICAgfAorICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLSsKKzUgICAgICAgfCBkcml2ZV9tb2RlICAgICAgICB8CisgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKworNiAgICAgICB8IGRyaXZlX2N5bGluZGVycyAgIHwKKzggICAgICAgfCBkcml2ZV9oZWFkcyAgICAgICB8Cis5ICAgICAgIHwgZHJpdmVfc2VjdG9ycyAgICAgfAorICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLSsKKzEwIC0geHggfCBkcml2ZV9wb3J0cyAgICAgICB8CisgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKworQGVuZCBncm91cAorQGVuZCBleGFtcGxlCisKK1RoZSBAc2FtcHtzaXplfSBmaWVsZCBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUuIFRoZSBzaXplCit2YXJpZXMsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHBvcnRzLiBOb3RlIHRoYXQgdGhlIHNpemUgbWF5IG5vdCBiZQorZXF1YWwgdG8gKDEwICsgMiAqIHRoZSBudW1iZXIgb2YgcG9ydHMpLCBiZWNhdXNlIG9mIGFuIGFsaWdubWVudC4KKworVGhlIEBzYW1we2RyaXZlX251bWJlcn0gZmllbGQgY29udGFpbnMgdGhlIEJJT1MgZHJpdmUgbnVtYmVyLiBUaGUKK0BzYW1we2RyaXZlX21vZGV9IGZpZWxkIHJlcHJlc2VudHMgdGhlIGFjY2VzcyBtb2RlIHVzZWQgYnkgdGhlIGJvb3QKK2xvYWRlci4gQ3VycmVudGx5LCB0aGUgZm9sbG93aW5nIG1vZGVzIGFyZSBkZWZpbmVkOgorCitAdGFibGUgQHNhbXAKK0BpdGVtIDAKK0NIUyBtb2RlICh0cmFkaXRpb25hbCBjeWxpbmRlci9oZWFkL3NlY3RvciBhZGRyZXNzaW5nIG1vZGUpLgorCitAaXRlbSAxCitMQkEgbW9kZSAoTG9naWNhbCBCbG9jayBBZGRyZXNzaW5nIG1vZGUpLgorQGVuZCB0YWJsZQorCitUaGUgdGhyZWUgZmllbGRzLCBAc2FtcHtkcml2ZV9jeWxpbmRlcnN9LCBAc2FtcHtkcml2ZV9oZWFkc30gYW5kCitAc2FtcHtkcml2ZV9zZWN0b3JzfSwgaW5kaWNhdGUgdGhlIGdlb21ldHJ5IG9mIHRoZSBkcml2ZSBkZXRlY3RlZCBieSB0aGUKK0BzY3tiaW9zfS4gQHNhbXB7ZHJpdmVfY3lsaW5kZXJzfSBjb250YWlucyB0aGUgbnVtYmVyIG9mIHRoZQorY3lsaW5kZXJzLiBAc2FtcHtkcml2ZV9oZWFkc30gY29udGFpbnMgdGhlIG51bWJlciBvZiB0aGUKK2hlYWRzLiBAc2FtcHtkcml2ZV9zZWN0b3JzfSBjb250YWlucyB0aGUgbnVtYmVyIG9mIHRoZSBzZWN0b3JzIHBlcgordHJhY2suCisKK1RoZSBAc2FtcHtkcml2ZV9wb3J0c30gZmllbGQgY29udGFpbnMgdGhlIGFycmF5IG9mIHRoZSBJL08gcG9ydHMgdXNlZAorZm9yIHRoZSBkcml2ZSBpbiB0aGUgQHNje2Jpb3N9IGNvZGUuIFRoZSBhcnJheSBjb25zaXN0cyBvZiB6ZXJvIG9yIG1vcmUKK3Vuc2lnbmVkIHR3by1ieXRlcyBpbnRlZ2VycywgYW5kIGlzIHRlcm1pbmF0ZWQgd2l0aCB6ZXJvLiBOb3RlIHRoYXQgdGhlCithcnJheSBtYXkgY29udGFpbiBhbnkgbnVtYmVyIG9mIEkvTyBwb3J0cyB0aGF0IGFyZSBub3QgcmVsYXRlZCB0byB0aGUKK2RyaXZlIGFjdHVhbGx5IChzdWNoIGFzIEBzY3tkbWF9IGNvbnRyb2xsZXIncyBwb3J0cykuCisKK0lmIGJpdCA4IGluIHRoZSBAc2FtcHtmbGFnc30gaXMgc2V0LCB0aGVuIHRoZSBAc2FtcHtjb25maWdfdGFibGV9IGZpZWxkCitpcyB2YWxpZCwgYW5kIGluZGljYXRlcyB0aGUgYWRkcmVzcyBvZiB0aGUgQHNje3JvbX0gY29uZmlndXJhdGlvbiB0YWJsZQorcmV0dXJuZWQgYnkgdGhlIEBkZm57R0VUIENPTkZJR1VSQVRJT059IEBzY3tiaW9zfSBjYWxsLiBJZiB0aGUgQHNje2Jpb3N9CitjYWxsIGZhaWxzLCB0aGVuIHRoZSBzaXplIG9mIHRoZSB0YWJsZSBtdXN0IGJlIEBlbXBoe3plcm99LgorCitJZiBiaXQgOSBpbiB0aGUgQHNhbXB7ZmxhZ3N9IGlzIHNldCwgdGhlIEBzYW1we2Jvb3RfbG9hZGVyX25hbWV9IGZpZWxkCitpcyB2YWxpZCwgYW5kIGNvbnRhaW5zIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBuYW1lIG9mIGEgYm9vdAorbG9hZGVyIGJvb3RpbmcgdGhlIGtlcm5lbC4gVGhlIG5hbWUgaXMgYSBub3JtYWwgQy1zdHlsZSB6ZXJvLXRlcm1pbmF0ZWQKK3N0cmluZy4KKworSWYgYml0IDEwIGluIHRoZSBAc2FtcHtmbGFnc30gaXMgc2V0LCB0aGUgQHNhbXB7YXBtX3RhYmxlfSBmaWVsZCBpcwordmFsaWQsIGFuZCBjb250YWlucyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhbiBAc2N7YXBtfSB0YWJsZSBkZWZpbmVkIGFzCitiZWxvdzoKKworQGV4YW1wbGUKK0Bncm91cAorICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKzAgICAgICAgfCB2ZXJzaW9uICAgICAgICAgICAgICB8CisyICAgICAgIHwgY3NlZyAgICAgICAgICAgICAgICAgfAorNCAgICAgICB8IG9mZnNldCAgICAgICAgICAgICAgIHwKKzggICAgICAgfCBjc2VnXzE2ICAgICAgICAgICAgICB8CisxMCAgICAgIHwgZHNlZyAgICAgICAgICAgICAgICAgfAorMTIgICAgICB8IGZsYWdzICAgICAgICAgICAgICAgIHwKKzE0ICAgICAgfCBjc2VnX2xlbiAgICAgICAgICAgICB8CisxNiAgICAgIHwgY3NlZ18xNl9sZW4gICAgICAgICAgfAorMTggICAgICB8IGRzZWdfbGVuICAgICAgICAgICAgIHwKKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCitAZW5kIGdyb3VwCitAZW5kIGV4YW1wbGUKKworVGhlIGZpZWxkcyBAc2FtcHt2ZXJzaW9ufSwgQHNhbXB7Y3NlZ30sIEBzYW1we29mZnNldH0sIEBzYW1we2NzZWdfMTZ9LAorQHNhbXB7ZHNlZ30sIEBzYW1we2ZsYWdzfSwgQHNhbXB7Y3NlZ19sZW59LCBAc2FtcHtjc2VnXzE2X2xlbn0sCitAc2FtcHtkc2VnX2xlbn0gaW5kaWNhdGUgdGhlIHZlcnNpb24gbnVtYmVyLCB0aGUgcHJvdGVjdGVkIG1vZGUgMzItYml0Citjb2RlIHNlZ21lbnQsIHRoZSBvZmZzZXQgb2YgdGhlIGVudHJ5IHBvaW50LCB0aGUgcHJvdGVjdGVkIG1vZGUgMTYtYml0Citjb2RlIHNlZ21lbnQsIHRoZSBwcm90ZWN0ZWQgbW9kZSAxNi1iaXQgZGF0YSBzZWdtZW50LCB0aGUgZmxhZ3MsIHRoZQorbGVuZ3RoIG9mIHRoZSBwcm90ZWN0ZWQgbW9kZSAzMi1iaXQgY29kZSBzZWdtZW50LCB0aGUgbGVuZ3RoIG9mIHRoZQorcHJvdGVjdGVkIG1vZGUgMTYtYml0IGNvZGUgc2VnbWVudCwgYW5kIHRoZSBsZW5ndGggb2YgdGhlIHByb3RlY3RlZCBtb2RlCisxNi1iaXQgZGF0YSBzZWdtZW50LCByZXNwZWN0aXZlbHkuIE9ubHkgdGhlIGZpZWxkIEBzYW1we29mZnNldH0gaXMgNAorYnl0ZXMsIGFuZCB0aGUgb3RoZXJzIGFyZSAyIGJ5dGVzLiBTZWUKK0B1cmVme2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9od2Rldi9idXNiaW9zL2FtcF8xMi5odG0sIEFkdmFuY2VkIFBvd2VyCitNYW5hZ2VtZW50IChBUE0pIEJJT1MgSW50ZXJmYWNlIFNwZWNpZmljYXRpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworSWYgYml0IDExIGluIHRoZSBAc2FtcHtmbGFnc30gaXMgc2V0LCB0aGUgZ3JhcGhpY3MgdGFibGUgaXMgYXZhaWxhYmxlLgorVGhpcyBtdXN0IG9ubHkgYmUgZG9uZSBpZiB0aGUga2VybmVsIGhhcyBpbmRpY2F0ZWQgaW4gdGhlCitAc2FtcHtNdWx0aWJvb3QgSGVhZGVyfSB0aGF0IGl0IGFjY2VwdHMgYSBncmFwaGljcyBtb2RlLgorCitUaGUgZmllbGRzIEBzYW1we3ZiZV9jb250cm9sX2luZm99IGFuZCBAc2FtcHt2YmVfbW9kZV9pbmZvfSBjb250YWluCit0aGUgcGh5c2ljYWwgYWRkcmVzc2VzIG9mIEBzY3t2YmV9IGNvbnRyb2wgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgdGhlCitAc2N7dmJlfSBGdW5jdGlvbiAwMGggYW5kIEBzY3t2YmV9IG1vZGUgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgdGhlCitAc2N7dmJlfSBGdW5jdGlvbiAwMWgsIHJlc3BlY3RpdmVseS4KKworVGhlIGZpZWxkIEBzYW1we3ZiZV9tb2RlfSBpbmRpY2F0ZXMgY3VycmVudCB2aWRlbyBtb2RlIGluIHRoZSBmb3JtYXQKK3NwZWNpZmllZCBpbiBAc2N7dmJlfSAzLjAuCisKK1RoZSByZXN0IGZpZWxkcyBAc2FtcHt2YmVfaW50ZXJmYWNlX3NlZ30sIEBzYW1we3ZiZV9pbnRlcmZhY2Vfb2ZmfSwgYW5kCitAc2FtcHt2YmVfaW50ZXJmYWNlX2xlbn0gY29udGFpbiB0aGUgdGFibGUgb2YgYSBwcm90ZWN0ZWQgbW9kZSBpbnRlcmZhY2UKK2RlZmluZWQgaW4gQHNje3ZiZX0gMi4wKy4gSWYgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLCB0aG9zZQorZmllbGRzIGNvbnRhaW4gemVyby4gTm90ZSB0aGF0IEBzY3t2YmV9IDMuMCBkZWZpbmVzIGFub3RoZXIgcHJvdGVjdGVkCittb2RlIGludGVyZmFjZSB3aGljaCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgb2xkIG9uZS4gSWYgeW91IHdhbnQgdG8KK3VzZSB0aGUgbmV3IHByb3RlY3RlZCBtb2RlIGludGVyZmFjZSwgeW91IHdpbGwgaGF2ZSB0byBmaW5kIHRoZSB0YWJsZQoreW91cnNlbGYuCisKK1RoZSBmaWVsZHMgZm9yIHRoZSBncmFwaGljcyB0YWJsZSBhcmUgZGVzaWduZWQgZm9yIEBzY3t2YmV9LCBidXQKK011bHRpYm9vdCBib290IGxvYWRlcnMgbWF5IHNpbXVsYXRlIEBzY3t2YmV9IG9uIG5vbi1Ac2N7dmJlfSBtb2RlcywgYXMKK2lmIHRoZXkgd2VyZSBAc2N7dmJlfSBtb2Rlcy4KKworCitAbm9kZSBFeGFtcGxlcworQGNoYXB0ZXIgRXhhbXBsZXMKKworQHN0cm9uZ3tDYXV0aW9uOn0gVGhlIGZvbGxvd2luZyBpdGVtcyBhcmUgbm90IHBhcnQgb2YgdGhlIHNwZWNpZmljYXRpb24KK2RvY3VtZW50LCBidXQgYXJlIGluY2x1ZGVkIGZvciBwcm9zcGVjdGl2ZSBvcGVyYXRpbmcgc3lzdGVtIGFuZCBib290Citsb2FkZXIgd3JpdGVycy4KKworQG1lbnUKKyogTm90ZXMgb24gUEM6OiAgICAgICAgICAgICAgICAgCisqIEJJT1MgZGV2aWNlIG1hcHBpbmcgdGVjaG5pcXVlczo6ICAKKyogRXhhbXBsZSBPUyBjb2RlOjogICAgICAgICAgICAgCisqIEV4YW1wbGUgYm9vdCBsb2FkZXIgY29kZTo6ICAgIAorQGVuZCBtZW51CisKKworQG5vZGUgTm90ZXMgb24gUEMKK0BzZWN0aW9uIE5vdGVzIG9uIFBDCisKK0luIHJlZmVyZW5jZSB0byBiaXQgMCBvZiB0aGUgQHNhbXB7ZmxhZ3N9IHBhcmFtZXRlciBpbiB0aGUgTXVsdGlib290CitpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUsIGlmIHRoZSBib290bG9hZGVyIGluIHF1ZXN0aW9uIHVzZXMgb2xkZXIKK0BzY3tiaW9zfSBpbnRlcmZhY2VzLCBvciB0aGUgbmV3ZXN0IG9uZXMgYXJlIG5vdCBhdmFpbGFibGUgKHNlZQorZGVzY3JpcHRpb24gYWJvdXQgYml0IDYpLCB0aGVuIGEgbWF4aW11bSBvZiBlaXRoZXIgMTUgb3IgNjMgbWVnYWJ5dGVzIG9mCittZW1vcnkgbWF5IGJlIHJlcG9ydGVkLiBJdCBpcyBAZW1waHtoaWdobHl9IHJlY29tbWVuZGVkIHRoYXQgYm9vdAorbG9hZGVycyBwZXJmb3JtIGEgdGhvcm91Z2ggbWVtb3J5IHByb2JlLgorCitJbiByZWZlcmVuY2UgdG8gYml0IDEgb2YgdGhlIEBzYW1we2ZsYWdzfSBwYXJhbWV0ZXIgaW4gdGhlIE11bHRpYm9vdAoraW5mb3JtYXRpb24gc3RydWN0dXJlLCBpdCBpcyByZWNvZ25pemVkIHRoYXQgZGV0ZXJtaW5hdGlvbiBvZiB3aGljaAorQHNje2Jpb3N9IGRyaXZlIG1hcHMgdG8gd2hpY2ggZGV2aWNlIGRyaXZlciBpbiBhbiBvcGVyYXRpbmcgc3lzdGVtIGlzCitub24tdHJpdmlhbCwgYXQgYmVzdC4gTWFueSBrbHVkZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHZhcmlvdXMgb3BlcmF0aW5nCitzeXN0ZW1zIGluc3RlYWQgb2Ygc29sdmluZyB0aGlzIHByb2JsZW0sIG1vc3Qgb2YgdGhlbSBicmVha2luZyB1bmRlcgorbWFueSBjb25kaXRpb25zLiBUbyBlbmNvdXJhZ2UgdGhlIHVzZSBvZiBnZW5lcmFsLXB1cnBvc2Ugc29sdXRpb25zIHRvCit0aGlzIHByb2JsZW0sIHRoZXJlIGFyZSAyIEBzY3tiaW9zfSBkZXZpY2UgbWFwcGluZyB0ZWNobmlxdWVzCisoQHB4cmVme0JJT1MgZGV2aWNlIG1hcHBpbmcgdGVjaG5pcXVlc30pLiAKKworSW4gcmVmZXJlbmNlIHRvIGJpdCA2IG9mIHRoZSBAc2FtcHtmbGFnc30gcGFyYW1ldGVyIGluIHRoZSBNdWx0aWJvb3QKK2luZm9ybWF0aW9uIHN0cnVjdHVyZSwgaXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgZGF0YSBzdHJ1Y3R1cmUKK3VzZWQgdGhlcmUgKHN0YXJ0aW5nIHdpdGggQHNhbXB7QmFzZUFkZHJMb3d9KSBpcyB0aGUgZGF0YSByZXR1cm5lZCBieQordGhlIElOVCAxNWgsIEFYPUU4MjBoIC0tLSBRdWVyeSBTeXN0ZW0gQWRkcmVzcyBNYXAgY2FsbC4gU2VlIEB4cmVme1F1ZXJ5CitTeXN0ZW0gQWRkcmVzcyBNYXAsICwgUXVlcnkgU3lzdGVtIEFkZHJlc3MgTWFwLCBncnViLmluZm8sIFRoZSBHUlVCCitNYW51YWx9LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gVGhlIGludGVyZmFjZSBoZXJlIGlzIG1lYW50IHRvIGFsbG93IGEKK2Jvb3QgbG9hZGVyIHRvIHdvcmsgdW5tb2RpZmllZCB3aXRoIGFueSByZWFzb25hYmxlIGV4dGVuc2lvbnMgb2YgdGhlCitAc2N7Ymlvc30gaW50ZXJmYWNlLCBwYXNzaW5nIGFsb25nIGFueSBleHRyYSBkYXRhIHRvIGJlIGludGVycHJldGVkIGJ5Cit0aGUgb3BlcmF0aW5nIHN5c3RlbSBhcyBkZXNpcmVkLgorCisKK0Bub2RlIEJJT1MgZGV2aWNlIG1hcHBpbmcgdGVjaG5pcXVlcworQHNlY3Rpb24gQklPUyBkZXZpY2UgbWFwcGluZyB0ZWNobmlxdWVzCisKK0JvdGggb2YgdGhlc2UgdGVjaG5pcXVlcyBzaG91bGQgYmUgdXNhYmxlIGZyb20gYW55IFBDIG9wZXJhdGluZyBzeXN0ZW0sCithbmQgbmVpdGhlciByZXF1aXJlIGFueSBzcGVjaWFsIHN1cHBvcnQgaW4gdGhlIGRyaXZlcnMgdGhlbXNlbHZlcy4gVGhpcworc2VjdGlvbiB3aWxsIGJlIGZsdXNoZWQgb3V0IGludG8gZGV0YWlsZWQgZXhwbGFuYXRpb25zLCBwYXJ0aWN1bGFybHkgZm9yCit0aGUgSS9PIHJlc3RyaWN0aW9uIHRlY2huaXF1ZS4KKworVGhlIGdlbmVyYWwgcnVsZSBpcyB0aGF0IHRoZSBkYXRhIGNvbXBhcmlzb24gdGVjaG5pcXVlIGlzIHRoZSBxdWljayBhbmQKK2RpcnR5IHNvbHV0aW9uLiBJdCB3b3JrcyBtb3N0IG9mIHRoZSB0aW1lLCBidXQgZG9lc24ndCBjb3ZlciBhbGwgdGhlCitiYXNlcywgYW5kIGlzIHJlbGF0aXZlbHkgc2ltcGxlLgorCitUaGUgSS9PIHJlc3RyaWN0aW9uIHRlY2huaXF1ZSBpcyBtdWNoIG1vcmUgY29tcGxleCwgYnV0IGl0IGhhcyBwb3RlbnRpYWwKK3RvIHNvbHZlIHRoZSBwcm9ibGVtIHVuZGVyIGFsbCBjb25kaXRpb25zLCBwbHVzIGFsbG93IGFjY2VzcyBvZiB0aGUKK3JlbWFpbmluZyBAc2N7Ymlvc30gZGV2aWNlcyB3aGVuIG5vdCBhbGwgb2YgdGhlbSBoYXZlIG9wZXJhdGluZyBzeXN0ZW0KK2RyaXZlcnMuCisKK0BtZW51CisqIERhdGEgY29tcGFyaXNvbiB0ZWNobmlxdWU6OiAgIAorKiBJL08gcmVzdHJpY3Rpb24gdGVjaG5pcXVlOjogICAKK0BlbmQgbWVudQorCisKK0Bub2RlIERhdGEgY29tcGFyaXNvbiB0ZWNobmlxdWUKK0BzdWJzZWN0aW9uIERhdGEgY29tcGFyaXNvbiB0ZWNobmlxdWUKKworQmVmb3JlIGFjdGl2YXRpbmcgQGVtcGh7YW55fSBvZiB0aGUgZGV2aWNlIGRyaXZlcnMsIGdhdGhlciBlbm91Z2ggZGF0YQorZnJvbSBzaW1pbGFyIHNlY3RvcnMgb24gZWFjaCBvZiB0aGUgZGlza3Mgc3VjaCB0aGF0IGVhY2ggb25lIGNhbiBiZQordW5pcXVlbHkgaWRlbnRpZmllZC4KKworQWZ0ZXIgYWN0aXZhdGluZyB0aGUgZGV2aWNlIGRyaXZlcnMsIGNvbXBhcmUgZGF0YSBmcm9tIHRoZSBkcml2ZXMgdXNpbmcKK3RoZSBvcGVyYXRpbmcgc3lzdGVtIGRyaXZlcnMuIFRoaXMgc2hvdWxkIGhvcGVmdWxseSBiZSBzdWZmaWNpZW50IHRvCitwcm92aWRlIHN1Y2ggYSBtYXBwaW5nLgorCitQcm9ibGVtczoKKworQGVudW1lcmF0ZQorQGl0ZW0KK1RoZSBkYXRhIG9uIHNvbWUgQHNje2Jpb3N9IGRldmljZXMgbWlnaHQgYmUgaWRlbnRpY2FsIChzbyB0aGUgcGFydAorcmVhZGluZyB0aGUgZHJpdmVzIGZyb20gdGhlIEBzY3tiaW9zfSBzaG91bGQgaGF2ZSBzb21lIG1lY2hhbmlzbSB0byBnaXZlCit1cCkuCisKK0BpdGVtCitUaGVyZSBtaWdodCBiZSBleHRyYSBkcml2ZXMgbm90IGFjY2Vzc2libGUgZnJvbSB0aGUgQHNje2Jpb3N9IHdoaWNoIGFyZQoraWRlbnRpY2FsIHRvIHNvbWUgZHJpdmUgdXNlZCBieSB0aGUgQHNje2Jpb3N9IChzbyBpdCBzaG91bGQgYmUgY2FwYWJsZQorb2YgZ2l2aW5nIHVwIHRoZXJlIGFzIHdlbGwpLgorQGVuZCBlbnVtZXJhdGUKKworCitAbm9kZSBJL08gcmVzdHJpY3Rpb24gdGVjaG5pcXVlCitAc3Vic2VjdGlvbiBJL08gcmVzdHJpY3Rpb24gdGVjaG5pcXVlCisKK1RoaXMgZmlyc3Qgc3RlcCBtYXkgYmUgdW5uZWNlc3NhcnksIGJ1dCBmaXJzdCBjcmVhdGUgY29weS1vbi13cml0ZQorbWFwcGluZ3MgZm9yIHRoZSBkZXZpY2UgZHJpdmVycyB3cml0aW5nIGludG8gQHNje3BjfSBAc2N7cmFtfS4gS2VlcCB0aGUKK29yaWdpbmFsIGNvcGllcyBmb3IgdGhlIEBkZm57Y2xlYW4gQHNje2Jpb3N9IHZpcnR1YWwgbWFjaGluZX0gdG8gYmUKK2NyZWF0ZWQgbGF0ZXIuCisKK0ZvciBlYWNoIGRldmljZSBkcml2ZXIgYnJvdWdodCBvbmxpbmUsIGRldGVybWluZSB3aGljaCBAc2N7Ymlvc30gZGV2aWNlcworYmVjb21lIGluYWNjZXNzaWJsZSBieToKKworQGVudW1lcmF0ZQorQGl0ZW0KK0NyZWF0ZSBhIEBkZm57Y2xlYW4gQHNje2Jpb3N9IHZpcnR1YWwgbWFjaGluZX0uCisKK0BpdGVtCitTZXQgdGhlIEkvTyBwZXJtaXNzaW9uIG1hcCBmb3IgdGhlIEkvTyBhcmVhIGNsYWltZWQgYnkgdGhlIGRldmljZSBkcml2ZXIKK3RvIG5vIHBlcm1pc3Npb25zIChuZWl0aGVyIHJlYWQgbm9yIHdyaXRlKS4KKworQGl0ZW0KK0FjY2VzcyBlYWNoIGRldmljZS4KKworQGl0ZW0KK1JlY29yZCB3aGljaCBkZXZpY2VzIHN1Y2NlZWQsIGFuZCB0aG9zZSB3aGljaCB0cnkgdG8gYWNjZXNzIHRoZQorQGRmbntyZXN0cmljdGVkfSBJL08gYXJlYXMgKGhvcGVmdWxseSwgdGhpcyB3aWxsIGJlIGFuIEBkZm57eG9yfQorc2l0dWF0aW9uKS4KK0BlbmQgZW51bWVyYXRlCisKK0ZvciBlYWNoIGRldmljZSBkcml2ZXIsIGdpdmVuIGhvdyBtYW55IG9mIHRoZSBAc2N7Ymlvc30gZGV2aWNlcyB3ZXJlCitzdWJzdW1lZCBieSBpdCAodGhlcmUgc2hvdWxkIGJlIG5vIGdhcHMgaW4gdGhpcyBsaXN0KSwgaXQgc2hvdWxkIGJlIGVhc3kKK3RvIGRldGVybWluZSB3aGljaCBkZXZpY2VzIG9uIHRoZSBjb250cm9sbGVyIHRoZXNlIGFyZS4KKworSW4gZ2VuZXJhbCwgeW91IGhhdmUgYXQgbW9zdCAyIGRpc2tzIGZyb20gZWFjaCBjb250cm9sbGVyIGdpdmVuCitAc2N7Ymlvc30gbnVtYmVycywgYnV0IHRoZXkgcHJldHR5IG11Y2ggYWx3YXlzIGNvdW50IGZyb20gdGhlIGxvd2VzdAorbG9naWNhbGx5IG51bWJlcmVkIGRldmljZXMgb24gdGhlIGNvbnRyb2xsZXIuCisKKworQG5vZGUgRXhhbXBsZSBPUyBjb2RlCitAc2VjdGlvbiBFeGFtcGxlIE9TIGNvZGUKKworSW4gdGhpcyBkaXN0cmlidXRpb24sIHRoZSBleGFtcGxlIE11bHRpYm9vdCBrZXJuZWwgQGZpbGV7a2VybmVsfSBpcworaW5jbHVkZWQuIFRoZSBrZXJuZWwganVzdCBwcmludHMgb3V0IHRoZSBNdWx0aWJvb3QgaW5mb3JtYXRpb24gc3RydWN0dXJlCitvbiB0aGUgc2NyZWVuLCBzbyB5b3UgY2FuIG1ha2UgdXNlIG9mIHRoZSBrZXJuZWwgdG8gdGVzdCBhCitNdWx0aWJvb3QtY29tcGxpYW50IGJvb3QgbG9hZGVyIGFuZCBmb3IgcmVmZXJlbmNlIHRvIGhvdyB0byBpbXBsZW1lbnQgYQorTXVsdGlib290IGtlcm5lbC4gVGhlIHNvdXJjZSBmaWxlcyBjYW4gYmUgZm91bmQgdW5kZXIgdGhlIGRpcmVjdG9yeQorQGZpbGV7ZG9jc30gaW4gdGhlIEdSVUIgZGlzdHJpYnV0aW9uLgorCitUaGUga2VybmVsIEBmaWxle2tlcm5lbH0gY29uc2lzdHMgb2Ygb25seSB0aHJlZSBmaWxlczogQGZpbGV7Ym9vdC5TfSwKK0BmaWxle2tlcm5lbC5jfSBhbmQgQGZpbGV7bXVsdGlib290Lmh9LiBUaGUgYXNzZW1ibHkgc291cmNlCitAZmlsZXtib290LlN9IGlzIHdyaXR0ZW4gaW4gR0FTIChAcHhyZWZ7VG9wLCAsIEdOVSBhc3NlbWJsZXIsIGFzLmluZm8sCitUaGUgR05VIGFzc2VtYmxlcn0pLCBhbmQgY29udGFpbnMgdGhlIE11bHRpYm9vdCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgdG8KK2NvbXBseSB3aXRoIHRoZSBzcGVjaWZpY2F0aW9uLiBXaGVuIGEgTXVsdGlib290LWNvbXBsaWFudCBib290IGxvYWRlcgorbG9hZHMgYW5kIGV4ZWN1dGUgaXQsIGl0IGluaXRpYWxpemUgdGhlIHN0YWNrIHBvaW50ZXIgYW5kIEBjb2Rle0VGTEFHU30sCithbmQgdGhlbiBjYWxsIHRoZSBmdW5jdGlvbiBAY29kZXtjbWFpbn0gZGVmaW5lZCBpbiBAZmlsZXtrZXJuZWwuY30uIElmCitAY29kZXtjbWFpbn0gcmV0dXJucyB0byB0aGUgY2FsbGVlLCB0aGVuIGl0IHNob3dzIGEgbWVzc2FnZSB0byBpbmZvcm0KK3RoZSB1c2VyIG9mIHRoZSBoYWx0IHN0YXRlIGFuZCBzdG9wcyBmb3JldmVyIHVudGlsIHlvdSBwdXNoIHRoZSByZXNldAora2V5LiBUaGUgZmlsZSBAZmlsZXtrZXJuZWwuY30gY29udGFpbnMgdGhlIGZ1bmN0aW9uIEBjb2Rle2NtYWlufSwKK3doaWNoIGNoZWNrcyBpZiB0aGUgbWFnaWMgbnVtYmVyIHBhc3NlZCBieSB0aGUgYm9vdCBsb2FkZXIgaXMgdmFsaWQgYW5kCitzbyBvbiwgYW5kIHNvbWUgZnVuY3Rpb25zIHRvIHByaW50IG1lc3NhZ2VzIG9uIHRoZSBzY3JlZW4uIFRoZSBmaWxlCitAZmlsZXttdWx0aWJvb3QuaH0gZGVmaW5lcyBzb21lIG1hY3Jvcywgc3VjaCBhcyB0aGUgbWFnaWMgbnVtYmVyIGZvciB0aGUKK011bHRpYm9vdCBoZWFkZXIsIHRoZSBNdWx0aWJvb3QgaGVhZGVyIHN0cnVjdHVyZSBhbmQgdGhlIE11bHRpYm9vdAoraW5mb3JtYXRpb24gc3RydWN0dXJlLgorCitAbWVudQorKiBtdWx0aWJvb3QuaDo6ICAgICAgICAgICAgICAgICAKKyogYm9vdC5TOjogICAgICAgICAgICAgICAgICAgICAgCisqIGtlcm5lbC5jOjogICAgICAgICAgICAgICAgICAgIAorKiBPdGhlciBNdWx0aWJvb3Qga2VybmVsczo6ICAgICAKK0BlbmQgbWVudQorCisKK0Bub2RlIG11bHRpYm9vdC5oCitAc3Vic2VjdGlvbiBtdWx0aWJvb3QuaAorCitUaGlzIGlzIHRoZSBzb3VyY2UgY29kZSBpbiB0aGUgZmlsZSBAZmlsZXttdWx0aWJvb3QuaH06CisKK0BleGFtcGxlCitAaW5jbHVkZSBtdWx0aWJvb3QuaC50ZXhpCitAZW5kIGV4YW1wbGUKKworCitAbm9kZSBib290LlMKK0BzdWJzZWN0aW9uIGJvb3QuUworCitJbiB0aGUgZmlsZSBAZmlsZXtib290LlN9OgorCitAZXhhbXBsZQorQGluY2x1ZGUgYm9vdC5TLnRleGkKK0BlbmQgZXhhbXBsZQorCisKK0Bub2RlIGtlcm5lbC5jCitAc3Vic2VjdGlvbiBrZXJuZWwuYworCitBbmQsIGluIHRoZSBmaWxlIEBmaWxle2tlcm5lbC5jfToKKworQGV4YW1wbGUKK0BpbmNsdWRlIGtlcm5lbC5jLnRleGkKK0BlbmQgZXhhbXBsZQorCisKK0Bub2RlIE90aGVyIE11bHRpYm9vdCBrZXJuZWxzCitAc3Vic2VjdGlvbiBPdGhlciBNdWx0aWJvb3Qga2VybmVscworCitPdGhlciB1c2VmdWwgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiBNdWx0aWJvb3Qga2VybmVscywgc3VjaAorYXMgR05VIE1hY2ggYW5kIEZpYXNjbyBAdXJse2h0dHA6Ly9vcy5pbmYudHUtZHJlc2Rlbi5kZS9maWFzY28vfS4gQW5kLAoraXQgaXMgd29ydGggbWVudGlvbmluZyB0aGUgT1NLaXQKK0B1cmx7aHR0cDovL3d3dy5jcy51dGFoLmVkdS9wcm9qZWN0cy9mbHV4L29za2l0L30sIHdoaWNoIHByb3ZpZGVzIGEKK2xpYnJhcnkgc3VwcG9ydGluZyB0aGUgc3BlY2lmaWNhdGlvbi4KKworCitAbm9kZSBFeGFtcGxlIGJvb3QgbG9hZGVyIGNvZGUKK0BzZWN0aW9uIEV4YW1wbGUgYm9vdCBsb2FkZXIgY29kZQorCitUaGUgR05VIEdSVUIgKEBweHJlZntUb3AsICwgR1JVQiwgZ3J1Yi5pbmZvLCBUaGUgR1JVQiBtYW51YWx9KSBwcm9qZWN0CitpcyBhIGZ1bGwgTXVsdGlib290LWNvbXBsaWFudCBib290IGxvYWRlciwgc3VwcG9ydGluZyBhbGwgcmVxdWlyZWQgYW5kCitvcHRpb25hbCBmZWF0dXJlcyBwcmVzZW50IGluIHRoaXMgc3BlY2lmaWNhdGlvbi4gQSBwdWJsaWMgcmVsZWFzZSBoYXMKK25vdCBiZWVuIG1hZGUsIGJ1dCB0aGUgdGVzdCByZWxlYXNlIGlzIGF2YWlsYWJsZSBmcm9tOgorCitAdXJse2Z0cDovL2FscGhhLmdudS5vcmcvZ251L2dydWJ9CisKK1NlZSB0aGUgd2VicGFnZSBAdXJse2h0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9ncnViL2dydWIuaHRtbH0sIGZvcgorbW9yZSBpbmZvcm1hdGlvbi4KKworCitAbm9kZSBIaXN0b3J5CitAY2hhcHRlciBUaGUgY2hhbmdlIGxvZyBvZiB0aGlzIHNwZWNpZmljYXRpb24KKworQHRhYmxlIEBhc2lzCitAaXRlbSAwLjcKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitAZGZue011bHRpYm9vdCBTdGFuZGFyZH0gaXMgcmVuYW1lZCB0byBAZGZue011bHRpYm9vdCBTcGVjaWZpY2F0aW9ufS4KKworQGl0ZW0KK0dyYXBoaWNzIGZpZWxkcyBhcmUgYWRkZWQgdG8gTXVsdGlib290IGhlYWRlci4KKworQGl0ZW0KK0JJT1MgZHJpdmUgaW5mb3JtYXRpb24sIEJJT1MgY29uZmlndXJhdGlvbiB0YWJsZSwgdGhlIG5hbWUgb2YgYSBib290Citsb2FkZXIsIEFQTSBpbmZvcm1hdGlvbiwgYW5kIGdyYXBoaWNzIGluZm9ybWF0aW9uIGFyZSBhZGRlZCB0byBNdWx0aWJvb3QKK2luZm9ybWF0aW9uLgorCitAaXRlbQorUmV3cml0dGVuIGluIFRleGluZm8gZm9ybWF0LgorCitAaXRlbQorUmV3cml0dGVuLCB1c2luZyBtb3JlIHN0cmljdCB3b3Jkcy4KKworQGl0ZW0KK1RoZSBtYWludGFpbmVyIGNoYW5nZXMgdG8gdGhlIEdOVSBHUlVCIG1haW50YWluZXIgdGVhbQorQGVtYWlse2J1Zy1ncnViQEBnbnUub3JnfSwgZnJvbSBCcnlhbiBGb3JkIGFuZCBFcmljaCBTdGVmYW4gQm9sZXluLgorQGVuZCBpdGVtaXplCisKK0BpdGVtIDAuNgorQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK0EgZmV3IHdvcmRpbmcgY2hhbmdlcy4KKworQGl0ZW0KK0hlYWRlciBjaGVja3N1bS4KKworQGl0ZW0KK0NsYXNpZmljYXRpb24gb2YgbWFjaGluZSBzdGF0ZSBwYXNzZWQgdG8gYW4gb3BlcmF0aW5nIHN5c3RlbS4KK0BlbmQgaXRlbWl6ZQorCitAaXRlbSAwLjUKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitOYW1lIGNoYW5nZS4KK0BlbmQgaXRlbWl6ZQorCitAaXRlbSAwLjQKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitNYWpvciBjaGFuZ2VzIHBsdXMgSFRNTGlmaWNhdGlvbi4KK0BlbmQgaXRlbWl6ZQorQGVuZCB0YWJsZQorCisKK0Bub2RlIEluZGV4CitAdW5udW1iZXJlZCBJbmRleAorCitAcHJpbnRpbmRleCBjcAorCitAY29udGVudHMKK0BieWUKZGlmZiAtLWdpdCBhL2RvY3Mvc3JjMnRleGkgYi9kb2NzL3NyYzJ0ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNzg2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3NyYzJ0ZXhpCkBAIC0wLDAgKzEsMTYgQEAKKyMhIC9iaW4vc2gKKyMKKyMgQ29udmVydCBhIHNvdXJjZSBmaWxlIHRvIGEgVGVYaW5mbyBmaWxlLiBTdG9sZW4gZnJvbSBnbGliYy4KKyMKKyMgVXNhZ2U6IHNyYzJ0ZXhpIFNSQ0RJUiBTUkMgVEVYSQorCitkaXI9JDEKK3NyYz1gYmFzZW5hbWUgJDJgCit0ZXhpPWBiYXNlbmFtZSAkM2AKKworc2VkIC1lICdzLFt7fV0sQCYsZycJCQkJCVwKKyAgICAtZSAncywvXCpcKEAuKlwpXCovLFwxLGcnCQkJCVwKKyAgICAtZSAncywvXCogICosLyogQHJ7LGcnIC1lICdzLCAgKlwqLyx9ICovLCcJCVwKKyAgICAtZSAncy9cKEBbYS16XVthLXpdKlwpQHtcKFtefV0qXClAfS9cMXtcMn0vZycJXAorICAgICR7ZGlyfS8ke3NyY30gfCBleHBhbmQgPiAke3RleGl9Lm5ldworbXYgLWYgJHt0ZXhpfS5uZXcgJHtkaXJ9LyR7dGV4aX0KZGlmZiAtLWdpdCBhL2RvY3Mvc3RhbXAtdnRpIGIvZG9jcy9zdGFtcC12dGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk3ZGUyNAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3Mvc3RhbXAtdnRpCkBAIC0wLDAgKzEsNCBAQAorQHNldCBVUERBVEVEIDggTWF5IDIwMDUKK0BzZXQgVVBEQVRFRC1NT05USCBNYXkgMjAwNQorQHNldCBFRElUSU9OIDAuOTcKK0BzZXQgVkVSU0lPTiAwLjk3CmRpZmYgLS1naXQgYS9kb2NzL3RleGluZm8udGV4IGIvZG9jcy90ZXhpbmZvLnRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTM5MTJhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy90ZXhpbmZvLnRleApAQCAtMCwwICsxLDcwODYgQEAKKyUgdGV4aW5mby50ZXggLS0gVGVYIG1hY3JvcyB0byBoYW5kbGUgVGV4aW5mbyBmaWxlcy4KKyUKKyUgTG9hZCBwbGFpbiBpZiBuZWNlc3NhcnksIGkuZS4sIGlmIHJ1bm5pbmcgdW5kZXIgaW5pdGV4LgorXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgZm10bmFtZVxlbmRjc25hbWVccmVsYXhcaW5wdXQgcGxhaW5cZmkKKyUKK1xkZWZcdGV4aW5mb3ZlcnNpb257MjAwNC0xMS0yNS4xNn0KKyUKKyUgQ29weXJpZ2h0IChDKSAxOTg1LCAxOTg2LCAxOTg4LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LAorJSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0IEZyZWUgU29mdHdhcmUKKyUgRm91bmRhdGlvbiwgSW5jLgorJQorJSBUaGlzIHRleGluZm8udGV4IGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCislIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCislIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKKyUgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorJQorJSBUaGlzIHRleGluZm8udGV4IGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCislIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyUgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorJQorJSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorJSBhbG9uZyB3aXRoIHRoaXMgdGV4aW5mby50ZXggZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlCislIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyUgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCislCislIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHdoZW4gdGhpcyBmaWxlIGlzIHJlYWQgYnkgVGVYIHdoZW4gcHJvY2Vzc2luZworJSBhIFRleGluZm8gc291cmNlIGRvY3VtZW50LCB5b3UgbWF5IHVzZSB0aGUgcmVzdWx0IHdpdGhvdXQKKyUgcmVzdHJpY3Rpb24uICAoVGhpcyBoYXMgYmVlbiBvdXIgaW50ZW50IHNpbmNlIFRleGluZm8gd2FzIGludmVudGVkLikKKyUKKyUgUGxlYXNlIHRyeSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGV4aW5mby50ZXggYmVmb3JlIHN1Ym1pdHRpbmcgYnVnCislIHJlcG9ydHM7IHlvdSBjYW4gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBmcm9tOgorJSAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS90ZXhpbmZvLyAodGhlIFRleGluZm8gaG9tZSBwYWdlKSwgb3IKKyUgICBmdHA6Ly90dWcub3JnL3RleC90ZXhpbmZvLnRleAorJSAgICAgKGFuZCBhbGwgQ1RBTiBtaXJyb3JzLCBzZWUgaHR0cDovL3d3dy5jdGFuLm9yZykuCislIFRoZSB0ZXhpbmZvLnRleCBpbiBhbnkgZ2l2ZW4gZGlzdHJpYnV0aW9uIGNvdWxkIHdlbGwgYmUgb3V0CislIG9mIGRhdGUsIHNvIGlmIHRoYXQncyB3aGF0IHlvdSdyZSB1c2luZywgcGxlYXNlIGNoZWNrLgorJQorJSBTZW5kIGJ1ZyByZXBvcnRzIHRvIGJ1Zy10ZXhpbmZvQGdudS5vcmcuICBQbGVhc2UgaW5jbHVkZSBpbmNsdWRpbmcgYQorJSBjb21wbGV0ZSBkb2N1bWVudCBpbiBlYWNoIGJ1ZyByZXBvcnQgd2l0aCB3aGljaCB3ZSBjYW4gcmVwcm9kdWNlIHRoZQorJSBwcm9ibGVtLiAgUGF0Y2hlcyBhcmUsIG9mIGNvdXJzZSwgZ3JlYXRseSBhcHByZWNpYXRlZC4KKyUKKyUgVG8gcHJvY2VzcyBhIFRleGluZm8gbWFudWFsIHdpdGggVGVYLCBpdCdzIG1vc3QgcmVsaWFibGUgdG8gdXNlIHRoZQorJSB0ZXhpMmR2aSBzaGVsbCBzY3JpcHQgdGhhdCBjb21lcyB3aXRoIHRoZSBkaXN0cmlidXRpb24uICBGb3IgYSBzaW1wbGUKKyUgbWFudWFsIGZvby50ZXhpLCBob3dldmVyLCB5b3UgY2FuIGdldCBhd2F5IHdpdGggdGhpczoKKyUgICB0ZXggZm9vLnRleGkKKyUgICB0ZXhpbmRleCBmb28uPz8KKyUgICB0ZXggZm9vLnRleGkKKyUgICB0ZXggZm9vLnRleGkKKyUgICBkdmlwcyBmb28uZHZpIC1vICAjIG9yIHdoYXRldmVyOyB0aGlzIG1ha2VzIGZvby5wcy4KKyUgVGhlIGV4dHJhIFRlWCBydW5zIGdldCB0aGUgY3Jvc3MtcmVmZXJlbmNlIGluZm9ybWF0aW9uIGNvcnJlY3QuCislIFNvbWV0aW1lcyBvbmUgcnVuIGFmdGVyIHRleGluZGV4IHN1ZmZpY2VzLCBhbmQgc29tZXRpbWVzIHlvdSBuZWVkIG1vcmUKKyUgdGhhbiB0d287IHRleGkyZHZpIGRvZXMgaXQgYXMgbWFueSB0aW1lcyBhcyBuZWNlc3NhcnkuCislCislIEl0IGlzIHBvc3NpYmxlIHRvIGFkYXB0IHRleGluZm8udGV4IGZvciBvdGhlciBsYW5ndWFnZXMsIHRvIHNvbWUKKyUgZXh0ZW50LiAgWW91IGNhbiBnZXQgdGhlIGV4aXN0aW5nIGxhbmd1YWdlLXNwZWNpZmljIGZpbGVzIGZyb20gdGhlCislIGZ1bGwgVGV4aW5mbyBkaXN0cmlidXRpb24uCislCislIFRoZSBHTlUgVGV4aW5mbyBob21lIHBhZ2UgaXMgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL3RleGluZm8uCisKKworXG1lc3NhZ2V7TG9hZGluZyB0ZXhpbmZvIFt2ZXJzaW9uIFx0ZXhpbmZvdmVyc2lvbl06fQorCislIElmIGluIGEgLmZtdCBmaWxlLCBwcmludCB0aGUgdmVyc2lvbiBudW1iZXIKKyUgYW5kIHR1cm4gb24gYWN0aXZlIGNoYXJhY3RlcnMgdGhhdCB3ZSBjb3VsZG4ndCBkbyBlYXJsaWVyIGJlY2F1c2UKKyUgdGhleSBtaWdodCBoYXZlIGFwcGVhcmVkIGluIHRoZSBpbnB1dCBmaWxlIG5hbWUuCitcZXZlcnlqb2J7XG1lc3NhZ2V7W1RleGluZm8gdmVyc2lvbiBcdGV4aW5mb3ZlcnNpb25dfSUKKyAgXGNhdGNvZGVgKz1cYWN0aXZlIFxjYXRjb2RlYFxfPVxhY3RpdmV9CisKK1xtZXNzYWdle0Jhc2ljcyx9CitcY2hhcmRlZlxvdGhlcj0xMgorCislIFdlIG5ldmVyIHdhbnQgcGxhaW4ncyBcb3V0ZXIgZGVmaW5pdGlvbiBvZiBcKyBpbiBUZXhpbmZvLgorJSBGb3IgQHRleCwgd2UgY2FuIHVzZSBcdGFiYWxpZ24uCitcbGV0XCsgPSBccmVsYXgKKworJSBTYXZlIHNvbWUgcGxhaW4gdGV4IG1hY3JvcyB3aG9zZSBuYW1lcyB3ZSB3aWxsIHJlZGVmaW5lLgorXGxldFxwdGV4Yj1cYgorXGxldFxwdGV4YnVsbGV0PVxidWxsZXQKK1xsZXRccHRleGM9XGMKK1xsZXRccHRleGNvbW1hPVwsCitcbGV0XHB0ZXhkb3Q9XC4KK1xsZXRccHRleGRvdHM9XGRvdHMKK1xsZXRccHRleGVuZD1cZW5kCitcbGV0XHB0ZXhlcXVpdj1cZXF1aXYKK1xsZXRccHRleGV4Y2xhbT1cIQorXGxldFxwdGV4Zm9vdG5vdGU9XGZvb3Rub3RlCitcbGV0XHB0ZXhndHI9PgorXGxldFxwdGV4aGF0PV4KK1xsZXRccHRleGk9XGkKK1xsZXRccHRleGluZGVudD1caW5kZW50CitcbGV0XHB0ZXhpbnNlcnQ9XGluc2VydAorXGxldFxwdGV4bGJyYWNlPVx7CitcbGV0XHB0ZXhsZXNzPTwKK1xsZXRccHRleG5ld3dyaXRlXG5ld3dyaXRlCitcbGV0XHB0ZXhub2luZGVudD1cbm9pbmRlbnQKK1xsZXRccHRleHBsdXM9KworXGxldFxwdGV4cmJyYWNlPVx9CitcbGV0XHB0ZXhzbGFzaD1cLworXGxldFxwdGV4c3Rhcj1cKgorXGxldFxwdGV4dD1cdAorCislIElmIHRoaXMgY2hhcmFjdGVyIGFwcGVhcnMgaW4gYW4gZXJyb3IgbWVzc2FnZSBvciBoZWxwIHN0cmluZywgaXQKKyUgc3RhcnRzIGEgbmV3IGxpbmUgaW4gdGhlIG91dHB1dC4KK1xuZXdsaW5lY2hhciA9IGBeXkoKKworJSBVc2UgVGVYIDMuMCdzIFxpbnB1dGxpbmVubyB0byBnZXQgdGhlIGxpbmUgbnVtYmVyLCBmb3IgYmV0dGVyIGVycm9yCislIG1lc3NhZ2VzLCBidXQgaWYgd2UncmUgdXNpbmcgYW4gb2xkIHZlcnNpb24gb2YgVGVYLCBkb24ndCBkbyBhbnl0aGluZy4KKyUKK1xpZnhcaW5wdXRsaW5lbm9cdGhpc2lzdW5kZWZpbmVkCisgIFxsZXRcbGluZW51bWJlciA9IFxlbXB0eSAlIFByZS0zLjAuCitcZWxzZQorICBcZGVmXGxpbmVudW1iZXJ7bC5cdGhlXGlucHV0bGluZW5vOlxzcGFjZX0KK1xmaQorCislIFNldCB1cCBmaXhlZCB3b3JkcyBmb3IgRW5nbGlzaCBpZiBub3QgYWxyZWFkeSBzZXQuCitcaWZ4XHB1dHdvcmRBcHBlbmRpeFx1bmRlZmluZWQgIFxnZGVmXHB1dHdvcmRBcHBlbmRpeHtBcHBlbmRpeH1cZmkKK1xpZnhccHV0d29yZENoYXB0ZXJcdW5kZWZpbmVkICAgXGdkZWZccHV0d29yZENoYXB0ZXJ7Q2hhcHRlcn1cZmkKK1xpZnhccHV0d29yZGZpbGVcdW5kZWZpbmVkICAgICAgXGdkZWZccHV0d29yZGZpbGV7ZmlsZX1cZmkKK1xpZnhccHV0d29yZGluXHVuZGVmaW5lZCAgICAgICAgXGdkZWZccHV0d29yZGlue2lufVxmaQorXGlmeFxwdXR3b3JkSW5kZXhJc0VtcHR5XHVuZGVmaW5lZCAgICAgXGdkZWZccHV0d29yZEluZGV4SXNFbXB0eXsoSW5kZXggaXMgZW1wdHkpfVxmaQorXGlmeFxwdXR3b3JkSW5kZXhOb25leGlzdGVudFx1bmRlZmluZWQgXGdkZWZccHV0d29yZEluZGV4Tm9uZXhpc3RlbnR7KEluZGV4IGlzIG5vbmV4aXN0ZW50KX1cZmkKK1xpZnhccHV0d29yZEluZm9cdW5kZWZpbmVkICAgICAgXGdkZWZccHV0d29yZEluZm97SW5mb31cZmkKK1xpZnhccHV0d29yZEluc3RhbmNlVmFyaWFibGVvZlx1bmRlZmluZWQgXGdkZWZccHV0d29yZEluc3RhbmNlVmFyaWFibGVvZntJbnN0YW5jZSBWYXJpYWJsZSBvZn1cZmkKK1xpZnhccHV0d29yZE1ldGhvZG9uXHVuZGVmaW5lZCAgXGdkZWZccHV0d29yZE1ldGhvZG9ue01ldGhvZCBvbn1cZmkKK1xpZnhccHV0d29yZE5vVGl0bGVcdW5kZWZpbmVkICAgXGdkZWZccHV0d29yZE5vVGl0bGV7Tm8gVGl0bGV9XGZpCitcaWZ4XHB1dHdvcmRvZlx1bmRlZmluZWQgICAgICAgIFxnZGVmXHB1dHdvcmRvZntvZn1cZmkKK1xpZnhccHV0d29yZG9uXHVuZGVmaW5lZCAgICAgICAgXGdkZWZccHV0d29yZG9ue29ufVxmaQorXGlmeFxwdXR3b3JkcGFnZVx1bmRlZmluZWQgICAgICBcZ2RlZlxwdXR3b3JkcGFnZXtwYWdlfVxmaQorXGlmeFxwdXR3b3Jkc2VjdGlvblx1bmRlZmluZWQgICBcZ2RlZlxwdXR3b3Jkc2VjdGlvbntzZWN0aW9ufVxmaQorXGlmeFxwdXR3b3JkU2VjdGlvblx1bmRlZmluZWQgICBcZ2RlZlxwdXR3b3JkU2VjdGlvbntTZWN0aW9ufVxmaQorXGlmeFxwdXR3b3Jkc2VlXHVuZGVmaW5lZCAgICAgICBcZ2RlZlxwdXR3b3Jkc2Vle3NlZX1cZmkKK1xpZnhccHV0d29yZFNlZVx1bmRlZmluZWQgICAgICAgXGdkZWZccHV0d29yZFNlZXtTZWV9XGZpCitcaWZ4XHB1dHdvcmRTaG9ydFRPQ1x1bmRlZmluZWQgIFxnZGVmXHB1dHdvcmRTaG9ydFRPQ3tTaG9ydCBDb250ZW50c31cZmkKK1xpZnhccHV0d29yZFRPQ1x1bmRlZmluZWQgICAgICAgXGdkZWZccHV0d29yZFRPQ3tUYWJsZSBvZiBDb250ZW50c31cZmkKKyUKK1xpZnhccHV0d29yZE1KYW5cdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRNSmFue0phbnVhcnl9XGZpCitcaWZ4XHB1dHdvcmRNRmViXHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkTUZlYntGZWJydWFyeX1cZmkKK1xpZnhccHV0d29yZE1NYXJcdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRNTWFye01hcmNofVxmaQorXGlmeFxwdXR3b3JkTUFwclx1bmRlZmluZWQgXGdkZWZccHV0d29yZE1BcHJ7QXByaWx9XGZpCitcaWZ4XHB1dHdvcmRNTWF5XHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkTU1heXtNYXl9XGZpCitcaWZ4XHB1dHdvcmRNSnVuXHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkTUp1bntKdW5lfVxmaQorXGlmeFxwdXR3b3JkTUp1bFx1bmRlZmluZWQgXGdkZWZccHV0d29yZE1KdWx7SnVseX1cZmkKK1xpZnhccHV0d29yZE1BdWdcdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRNQXVne0F1Z3VzdH1cZmkKK1xpZnhccHV0d29yZE1TZXBcdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRNU2Vwe1NlcHRlbWJlcn1cZmkKK1xpZnhccHV0d29yZE1PY3RcdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRNT2N0e09jdG9iZXJ9XGZpCitcaWZ4XHB1dHdvcmRNTm92XHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkTU5vdntOb3ZlbWJlcn1cZmkKK1xpZnhccHV0d29yZE1EZWNcdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRNRGVje0RlY2VtYmVyfVxmaQorJQorXGlmeFxwdXR3b3JkRGVmbWFjXHVuZGVmaW5lZCAgICBcZ2RlZlxwdXR3b3JkRGVmbWFje01hY3JvfVxmaQorXGlmeFxwdXR3b3JkRGVmc3BlY1x1bmRlZmluZWQgICBcZ2RlZlxwdXR3b3JkRGVmc3BlY3tTcGVjaWFsIEZvcm19XGZpCitcaWZ4XHB1dHdvcmREZWZ2YXJcdW5kZWZpbmVkICAgIFxnZGVmXHB1dHdvcmREZWZ2YXJ7VmFyaWFibGV9XGZpCitcaWZ4XHB1dHdvcmREZWZvcHRcdW5kZWZpbmVkICAgIFxnZGVmXHB1dHdvcmREZWZvcHR7VXNlciBPcHRpb259XGZpCitcaWZ4XHB1dHdvcmREZWZmdW5jXHVuZGVmaW5lZCAgIFxnZGVmXHB1dHdvcmREZWZmdW5je0Z1bmN0aW9ufVxmaQorCislIEluIHNvbWUgbWFjcm9zLCB3ZSBjYW5ub3QgdXNlIHRoZSBgXD8gbm90YXRpb24tLS10aGUgbGVmdCBxdW90ZSBpcworJSBpbiBzb21lIGNhc2VzIHRoZSBlc2NhcGUgY2hhci4KK1xjaGFyZGVmXGNvbG9uQ2hhciA9IGBcOgorXGNoYXJkZWZcY29tbWFDaGFyID0gYFwsCitcY2hhcmRlZlxkb3RDaGFyICAgPSBgXC4KK1xjaGFyZGVmXGV4Y2xhbUNoYXI9IGBcIQorXGNoYXJkZWZccXVlc3RDaGFyID0gYFw/CitcY2hhcmRlZlxzZW1pQ2hhciAgPSBgXDsKK1xjaGFyZGVmXHVuZGVyQ2hhciA9IGBcXworCitcY2hhcmRlZlxzcGFjZUNoYXIgPSBgXCAlCitcY2hhcmRlZlxzcGFjZWNhdCA9IDEwCitcZGVmXHNwYWNlaXNzcGFjZXtcY2F0Y29kZVxzcGFjZUNoYXI9XHNwYWNlY2F0fQorCislIElnbm9yZSBhIHRva2VuLgorJQorXGRlZlxnb2JibGUjMXt9CisKKyUgVGhlIGZvbGxvd2luZyBpcyB1c2VkIGluc2lkZSBzZXZlcmFsIFxlZGVmJ3MuCitcZGVmXG1ha2Vjc25hbWUjMXtcZXhwYW5kYWZ0ZXJcbm9leHBhbmRcY3NuYW1lIzFcZW5kY3NuYW1lfQorCislIEh5cGhlbmF0aW9uIGZpeGVzLgorXGh5cGhlbmF0aW9ueworICBGbG9yLWktZGEgR2hvc3Qtc2NyaXB0IEdob3N0LXZpZXcgTWFjLU9TIFBvc3QtU2NyaXB0CisgIGFwLXBlbi1kaXggYml0LW1hcCBiaXQtbWFwcworICBkYXRhLWJhc2UgZGF0YS1iYXNlcyBlc2hlbGwgZmFsbC1pbmcgaGFsZi13YXkgbG9uZy1lc3QgbWFuLXUtc2NyaXB0CisgIG1hbi11LXNjcmlwdHMgbWluaS1idWYtZmVyIG1pbmktYnVmLWZlcnMgb3Zlci12aWV3IHBhci1hLWRpZ20KKyAgcGFyLWEtZGlnbXMgcmF0aC1lciByZWMtdGFuLWd1LWxhciByby1ib3QtaWNzIHNlLXZlcmUtbHkgc2V0LXVwIHNwYS1jZXMKKyAgc3BlbGwtaW5nIHNwZWxsLWluZ3MKKyAgc3RhbmQtYWxvbmUgc3Ryb25nLWVzdCB0aW1lLXN0YW1wIHRpbWUtc3RhbXBzIHdoaWNoLWV2ZXIgd2hpdGUtc3BhY2UKKyAgd2lkZS1zcHJlYWQgd3JhcC1hcm91bmQKK30KKworJSBNYXJnaW4gdG8gYWRkIHRvIHJpZ2h0IG9mIGV2ZW4gcGFnZXMsIHRvIGxlZnQgb2Ygb2RkIHBhZ2VzLgorXG5ld2RpbWVuXGJpbmRpbmdvZmZzZXQKK1xuZXdkaW1lblxub3JtYWxvZmZzZXQKK1xuZXdkaW1lblxwYWdld2lkdGggXG5ld2RpbWVuXHBhZ2VoZWlnaHQKKworJSBGb3IgYSBmaW5hbCBjb3B5LCB0YWtlIG91dCB0aGUgcmVjdGFuZ2xlcworJSB0aGF0IG1hcmsgb3ZlcmZ1bGwgYm94ZXMgKGluIGNhc2UgeW91IGhhdmUgZGVjaWRlZAorJSB0aGF0IHRoZSB0ZXh0IGxvb2tzIG9rIGV2ZW4gdGhvdWdoIGl0IHBhc3NlcyB0aGUgbWFyZ2luKS4KKyUKK1xkZWZcZmluYWxvdXR7XG92ZXJmdWxscnVsZT0wcHR9CisKKyUgQHwgaW5zZXJ0cyBhIGNoYW5nZWJhciB0byB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBsaW5lLiAgSXQgc2hvdWxkCislIHN1cnJvdW5kIGFueSBjaGFuZ2VkIHRleHQuICBUaGlzIGFwcHJvYWNoIGRvZXMgKm5vdCogd29yayBpZiB0aGUKKyUgY2hhbmdlIHNwYW5zIG1vcmUgdGhhbiB0d28gbGluZXMgb2Ygb3V0cHV0LiAgVG8gaGFuZGxlIHRoYXQsIHdlIHdvdWxkCislIGhhdmUgYWRvcHQgYSBtdWNoIG1vcmUgZGlmZmljdWx0IGFwcHJvYWNoIChwdXR0aW5nIG1hcmtzIGludG8gdGhlIG1haW4KKyUgdmVydGljYWwgbGlzdCBmb3IgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGVhY2ggY2hhbmdlKS4KKyUKK1xkZWZcfHslCisgICUgXHZhZGp1c3QgY2FuIG9ubHkgYmUgdXNlZCBpbiBob3Jpem9udGFsIG1vZGUuCisgIFxsZWF2ZXZtb2RlCisgICUKKyAgJSBBcHBlbmQgdGhpcyB2ZXJ0aWNhbCBtb2RlIG1hdGVyaWFsIGFmdGVyIHRoZSBjdXJyZW50IGxpbmUgaW4gdGhlIG91dHB1dC4KKyAgXHZhZGp1c3R7JQorICAgICUgV2Ugd2FudCB0byBpbnNlcnQgYSBydWxlIHdpdGggdGhlIGhlaWdodCBhbmQgZGVwdGggb2YgdGhlIGN1cnJlbnQKKyAgICAlIGxlYWRpbmc7IHRoYXQgaXMgZXhhY3RseSB3aGF0IFxzdHJ1dGJveCBpcyBzdXBwb3NlZCB0byByZWNvcmQuCisgICAgXHZza2lwLVxiYXNlbGluZXNraXAKKyAgICAlCisgICAgJSBcdmFkanVzdC1pdGVtcyBhcmUgaW5zZXJ0ZWQgYXQgdGhlIGxlZnQgZWRnZSBvZiB0aGUgdHlwZS4gIFNvCisgICAgJSB0aGUgXGxsYXAgaGVyZSBtb3ZlcyBvdXQgaW50byB0aGUgbGVmdC1oYW5kIG1hcmdpbi4KKyAgICBcbGxhcHslCisgICAgICAlCisgICAgICAlIEZvciBhIHRoaWNrZXIgb3IgdGhpbm5lciBiYXIsIGNoYW5nZSB0aGUgYDFwdCcuCisgICAgICBcdnJ1bGUgaGVpZ2h0XGJhc2VsaW5lc2tpcCB3aWR0aDFwdAorICAgICAgJQorICAgICAgJSBUaGlzIGlzIHRoZSBzcGFjZSBiZXR3ZWVuIHRoZSBiYXIgYW5kIHRoZSB0ZXh0LgorICAgICAgXGhza2lwIDEycHQKKyAgICB9JQorICB9JQorfQorCislIFNvbWV0aW1lcyBpdCBpcyBjb252ZW5pZW50IHRvIGhhdmUgZXZlcnl0aGluZyBpbiB0aGUgdHJhbnNjcmlwdCBmaWxlCislIGFuZCBub3RoaW5nIG9uIHRoZSB0ZXJtaW5hbC4gIFdlIGRvbid0IGp1c3QgY2FsbCBcdHJhY2luZ2FsbCBoZXJlLAorJSBzaW5jZSB0aGF0IHByb2R1Y2VzIHNvbWUgdXNlbGVzcyBvdXRwdXQgb24gdGhlIHRlcm1pbmFsLiAgV2UgYWxzbyBtYWtlCislIHNvbWUgZWZmb3J0IHRvIG9yZGVyIHRoZSB0cmFjaW5nIGNvbW1hbmRzIHRvIHJlZHVjZSBvdXRwdXQgaW4gdGhlIGxvZworJSBmaWxlOyBjZi4gdHJhY2Uuc3R5IGluIExhVGVYLgorJQorXGRlZlxnbG9nZ2luZ2FsbHtcYmVnaW5ncm91cCBcZ2xvYmFsZGVmcyA9IDEgXGxvZ2dpbmdhbGwgXGVuZGdyb3VwfSUKK1xkZWZcbG9nZ2luZ2FsbHslCisgIFx0cmFjaW5nc3RhdHMyCisgIFx0cmFjaW5ncGFnZXMxCisgIFx0cmFjaW5nbG9zdGNoYXJzMiAgJSAyIGdpdmVzIHVzIG1vcmUgaW4gZXRleAorICBcdHJhY2luZ3BhcmFncmFwaHMxCisgIFx0cmFjaW5nb3V0cHV0MQorICBcdHJhY2luZ21hY3JvczIKKyAgXHRyYWNpbmdyZXN0b3JlczEKKyAgXHNob3dib3hicmVhZHRoXG1heGRpbWVuIFxzaG93Ym94ZGVwdGhcbWF4ZGltZW4KKyAgXGlmeFxlVGVYdmVyc2lvblx1bmRlZmluZWRcZWxzZSAlIGV0ZXggZ2l2ZXMgdXMgbW9yZSBsb2dnaW5nCisgICAgXHRyYWNpbmdzY2FudG9rZW5zMQorICAgIFx0cmFjaW5naWZzMQorICAgIFx0cmFjaW5nZ3JvdXBzMQorICAgIFx0cmFjaW5nbmVzdGluZzIKKyAgICBcdHJhY2luZ2Fzc2lnbnMxCisgIFxmaQorICBcdHJhY2luZ2NvbW1hbmRzMyAgJSAzIGdpdmVzIHVzIG1vcmUgaW4gZXRleAorICBcZXJyb3Jjb250ZXh0bGluZXMxNgorfSUKKworJSBhZGQgY2hlY2sgZm9yIFxsYXN0cGVuYWx0eSB0byBwbGFpbidzIGRlZmluaXRpb25zLiAgSWYgdGhlIGxhc3QgdGhpbmcKKyUgd2UgZGlkIHdhcyBhIFxub2JyZWFrLCB3ZSBkb24ndCB3YW50IHRvIGluc2VydCBtb3JlIHNwYWNlLgorJQorXGRlZlxzbWFsbGJyZWFre1xpZm51bVxsYXN0cGVuYWx0eTwxMDAwMFxwYXJcaWZkaW1cbGFzdHNraXA8XHNtYWxsc2tpcGFtb3VudAorICBccmVtb3ZlbGFzdHNraXBccGVuYWx0eS01MFxzbWFsbHNraXBcZmlcZml9CitcZGVmXG1lZGJyZWFre1xpZm51bVxsYXN0cGVuYWx0eTwxMDAwMFxwYXJcaWZkaW1cbGFzdHNraXA8XG1lZHNraXBhbW91bnQKKyAgXHJlbW92ZWxhc3Rza2lwXHBlbmFsdHktMTAwXG1lZHNraXBcZmlcZml9CitcZGVmXGJpZ2JyZWFre1xpZm51bVxsYXN0cGVuYWx0eTwxMDAwMFxwYXJcaWZkaW1cbGFzdHNraXA8XGJpZ3NraXBhbW91bnQKKyAgXHJlbW92ZWxhc3Rza2lwXHBlbmFsdHktMjAwXGJpZ3NraXBcZmlcZml9CisKKyUgRm9yIEBjcm9wbWFya3MgY29tbWFuZC4KKyUgRG8gQGNyb3BtYXJrcyB0byBnZXQgY3JvcCBtYXJrcy4KKyUKK1xuZXdpZlxpZmNyb3BtYXJrcworXGxldFxjcm9wbWFya3MgPSBcY3JvcG1hcmtzdHJ1ZQorJQorJSBEaW1lbnNpb25zIHRvIGFkZCBjcm9wbWFya3MgYXQgY29ybmVycy4KKyUgQWRkZWQgYnkgUC4gQS4gTWFjS2F5LCAxMiBOb3YuIDE5ODYKKyUKK1xuZXdkaW1lblxvdXRlcmhzaXplIFxuZXdkaW1lblxvdXRlcnZzaXplICUgc2V0IGJ5IHRoZSBwYXBlciBzaXplIHJvdXRpbmVzCitcbmV3ZGltZW5cY29ybmVybG9uZyAgXGNvcm5lcmxvbmc9MXBjCitcbmV3ZGltZW5cY29ybmVydGhpY2sgXGNvcm5lcnRoaWNrPS4zcHQKK1xuZXdkaW1lblx0b3BhbmRib3R0b21tYXJnaW4gXHRvcGFuZGJvdHRvbW1hcmdpbj0uNzVpbgorCislIE1haW4gb3V0cHV0IHJvdXRpbmUuCitcY2hhcmRlZlxQQUdFID0gMjU1Citcb3V0cHV0ID0ge1xvbmVwYWdlb3V0e1xwYWdlY29udGVudHNcUEFHRX19CisKK1xuZXdib3hcaGVhZGxpbmVib3gKK1xuZXdib3hcZm9vdGxpbmVib3gKKworJSBcb25lcGFnZW91dCB0YWtlcyBhIHZib3ggYXMgYW4gYXJndW1lbnQuICBOb3RlIHRoYXQgXHBhZ2Vjb250ZW50cworJSBkb2VzIGluc2VydGlvbnMsIGJ1dCB5b3UgaGF2ZSB0byBjYWxsIGl0IHlvdXJzZWxmLgorXGRlZlxvbmVwYWdlb3V0IzF7JQorICBcaWZjcm9wbWFya3MgXGhvZmZzZXQ9MHB0IFxlbHNlIFxob2Zmc2V0PVxub3JtYWxvZmZzZXQgXGZpCisgICUKKyAgXGlmb2RkXHBhZ2VubyAgXGFkdmFuY2VcaG9mZnNldCBieSBcYmluZGluZ29mZnNldAorICBcZWxzZSBcYWR2YW5jZVxob2Zmc2V0IGJ5IC1cYmluZGluZ29mZnNldFxmaQorICAlCisgICUgRG8gdGhpcyBvdXRzaWRlIG9mIHRoZSBcc2hpcG91dCBzbyBAY29kZSBldGMuIHdpbGwgYmUgZXhwYW5kZWQgaW4KKyAgJSB0aGUgaGVhZGxpbmUgYXMgdGhleSBzaG91bGQgYmUsIG5vdCB0YWtlbiBsaXRlcmFsbHkgKG91dHB1dHRpbmcgJydjb2RlKS4KKyAgXHNldGJveFxoZWFkbGluZWJveCA9IFx2Ym94e1xsZXRcaHNpemU9XHBhZ2V3aWR0aCBcbWFrZWhlYWRsaW5lfSUKKyAgXHNldGJveFxmb290bGluZWJveCA9IFx2Ym94e1xsZXRcaHNpemU9XHBhZ2V3aWR0aCBcbWFrZWZvb3RsaW5lfSUKKyAgJQorICB7JQorICAgICUgSGF2ZSB0byBkbyB0aGlzIHN0dWZmIG91dHNpZGUgdGhlIFxzaGlwb3V0IGJlY2F1c2Ugd2Ugd2FudCBpdCB0bworICAgICUgdGFrZSBlZmZlY3QgaW4gXHdyaXRlJ3MsIHlldCB0aGUgZ3JvdXAgZGVmaW5lZCBieSB0aGUgXHZib3ggZW5kcworICAgICUgYmVmb3JlIHRoZSBcc2hpcG91dCBydW5zLgorICAgICUKKyAgICBcZXNjYXBlY2hhciA9IGBcXCAgICAgJSB1c2UgYmFja3NsYXNoIGluIG91dHB1dCBmaWxlcy4KKyAgICBcaW5kZXhkdW1taWVzICAgICAgICAgJSBkb24ndCBleHBhbmQgY29tbWFuZHMgaW4gdGhlIG91dHB1dC4KKyAgICBcbm9ybWFsdHVybm9mZmFjdGl2ZSAgJSBcIGluIGluZGV4IGVudHJpZXMgbXVzdCBub3Qgc3RheSBcLCBlLmcuLCBpZgorICAgICAgICAgICAgICAgICAgICUgdGhlIHBhZ2UgYnJlYWsgaGFwcGVucyB0byBiZSBpbiB0aGUgbWlkZGxlIG9mIGFuIGV4YW1wbGUuCisgICAgXHNoaXBvdXRcdmJveHslCisgICAgICAlIERvIHRoaXMgZWFybHkgc28gcGRmIHJlZmVyZW5jZXMgZ28gdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFnZS4KKyAgICAgIFxpZnBkZm1ha2VwYWdlZGVzdCBccGRmZGVzdCBuYW1le1x0aGVccGFnZW5vfSB4eXpcZmkKKyAgICAgICUKKyAgICAgIFxpZmNyb3BtYXJrcyBcdmJveCB0byBcb3V0ZXJ2c2l6ZVxiZ3JvdXAKKyAgICAgICAgXGhzaXplID0gXG91dGVyaHNpemUKKyAgICAgICAgXHZza2lwLVx0b3BhbmRib3R0b21tYXJnaW4KKyAgICAgICAgXHZ0b3AgdG8wcHR7JQorICAgICAgICAgIFxsaW5le1xld3RvcFxoZmlsXGV3dG9wfSUKKyAgICAgICAgICBcbm9pbnRlcmxpbmVza2lwCisgICAgICAgICAgXGxpbmV7JQorICAgICAgICAgICAgXHZib3h7XG1vdmVsZWZ0XGNvcm5lcnRoaWNrXG5zdG9wfSUKKyAgICAgICAgICAgIFxoZmlsbAorICAgICAgICAgICAgXHZib3h7XG1vdmVyaWdodFxjb3JuZXJ0aGlja1xuc3RvcH0lCisgICAgICAgICAgfSUKKyAgICAgICAgICBcdnNzfSUKKyAgICAgICAgXHZza2lwXHRvcGFuZGJvdHRvbW1hcmdpbgorICAgICAgICBcbGluZVxiZ3JvdXAKKyAgICAgICAgICBcaGZpbCAlIGNlbnRlciB0aGUgcGFnZSB3aXRoaW4gdGhlIG91dGVyIChwYWdlKSBoc2l6ZS4KKyAgICAgICAgICBcaWZvZGRccGFnZW5vXGhza2lwXGJpbmRpbmdvZmZzZXRcZmkKKyAgICAgICAgICBcdmJveFxiZ3JvdXAKKyAgICAgIFxmaQorICAgICAgJQorICAgICAgXHVudmJveFxoZWFkbGluZWJveAorICAgICAgXHBhZ2Vib2R5eyMxfSUKKyAgICAgIFxpZmRpbVxodFxmb290bGluZWJveCA+IDBwdAorICAgICAgICAlIE9ubHkgbGVhdmUgdGhpcyBzcGFjZSBpZiB0aGUgZm9vdGxpbmUgaXMgbm9uZW1wdHkuCisgICAgICAgICUgKFdlIGxlc3NlbmVkIFx2c2l6ZSBmb3IgaXQgaW4gXG9kZGZvb3Rpbmd4eHguKQorICAgICAgICAlIFRoZSBcYmFzZWxpbmVza2lwPTI0cHQgaW4gcGxhaW4ncyBcbWFrZWZvb3RsaW5lIGhhcyBubyBlZmZlY3QuCisgICAgICAgIFx2c2tpcCAyXGJhc2VsaW5lc2tpcAorICAgICAgICBcdW52Ym94XGZvb3RsaW5lYm94CisgICAgICBcZmkKKyAgICAgICUKKyAgICAgIFxpZmNyb3BtYXJrcworICAgICAgICAgIFxlZ3JvdXAgJSBlbmQgb2YgXHZib3hcYmdyb3VwCisgICAgICAgIFxoZmlsXGVncm91cCAlIGVuZCBvZiAoY2VudGVyaW5nKSBcbGluZVxiZ3JvdXAKKyAgICAgICAgXHZza2lwXHRvcGFuZGJvdHRvbW1hcmdpbiBwbHVzMWZpbGwgbWludXMxZmlsbAorICAgICAgICBcYm94bWF4ZGVwdGggPSBcY29ybmVydGhpY2sKKyAgICAgICAgXHZib3ggdG8wcHR7XHZzcworICAgICAgICAgIFxsaW5leyUKKyAgICAgICAgICAgIFx2Ym94e1xtb3ZlbGVmdFxjb3JuZXJ0aGlja1xuc2JvdH0lCisgICAgICAgICAgICBcaGZpbGwKKyAgICAgICAgICAgIFx2Ym94e1xtb3ZlcmlnaHRcY29ybmVydGhpY2tcbnNib3R9JQorICAgICAgICAgIH0lCisgICAgICAgICAgXG5vaW50ZXJsaW5lc2tpcAorICAgICAgICAgIFxsaW5le1xld2JvdFxoZmlsXGV3Ym90fSUKKyAgICAgICAgfSUKKyAgICAgIFxlZ3JvdXAgJSBcdmJveCBmcm9tIGZpcnN0IGNyb3BtYXJrcyBjbGF1c2UKKyAgICAgIFxmaQorICAgIH0lIGVuZCBvZiBcc2hpcG91dFx2Ym94CisgIH0lIGVuZCBvZiBncm91cCB3aXRoIFxub3JtYWx0dXJub2ZmYWN0aXZlCisgIFxhZHZhbmNlcGFnZW5vCisgIFxpZm51bVxvdXRwdXRwZW5hbHR5Pi0yMDAwMCBcZWxzZVxkb3N1cGVyZWplY3RcZmkKK30KKworXG5ld2luc2VydFxtYXJnaW4gXGRpbWVuXG1hcmdpbj1cbWF4ZGltZW4KKworXGRlZlxwYWdlYm9keSMxe1x2Ym94IHRvXHBhZ2VoZWlnaHR7XGJveG1heGRlcHRoPVxtYXhkZXB0aCAjMX19Cit7XGNhdGNvZGVgXEAgPTExCitcZ2RlZlxwYWdlY29udGVudHMjMXtcaWZ2b2lkXHRvcGluc1xlbHNlXHVudmJveFx0b3BpbnNcZmkKKyUgbWFyZ2luYWwgaGFja3MsIGp1aGFAdmlpc2EudXVjcCAoSnVoYSBUYWthbGEpCitcaWZ2b2lkXG1hcmdpblxlbHNlICUgbWFyZ2luYWwgaW5mbyBpcyBwcmVzZW50CisgIFxybGFwe1xrZXJuXGhzaXplXHZib3ggdG9cekB7XGtlcm4xcHRcYm94XG1hcmdpbiBcdnNzfX1cZmkKK1xkaW1lbkA9XGRwIzEgXHVudmJveCMxCitcaWZ2b2lkXGZvb3RpbnNcZWxzZVx2c2tpcFxza2lwXGZvb3RpbnNcZm9vdG5vdGVydWxlIFx1bnZib3hcZm9vdGluc1xmaQorXGlmckBnZ2VkYm90dG9tIFxrZXJuLVxkaW1lbkAgXHZmaWwgXGZpfQorfQorCislIEhlcmUgYXJlIHRoZSBydWxlcyBmb3IgdGhlIGNyb3BtYXJrcy4gIE5vdGUgdGhhdCB0aGV5IGFyZQorJSBvZmZzZXQgc28gdGhhdCB0aGUgc3BhY2UgYmV0d2VlbiB0aGVtIGlzIHRydWx5IFxvdXRlcmhzaXplIG9yIFxvdXRlcnZzaXplCislIChQLiBBLiBNYWNLYXksIDEyIE5vdmVtYmVyLCAxOTg2KQorJQorXGRlZlxld3RvcHtcdnJ1bGUgaGVpZ2h0XGNvcm5lcnRoaWNrIGRlcHRoMHB0IHdpZHRoXGNvcm5lcmxvbmd9CitcZGVmXG5zdG9we1x2Ym94CisgIHtcaHJ1bGUgaGVpZ2h0XGNvcm5lcnRoaWNrIGRlcHRoXGNvcm5lcmxvbmcgd2lkdGhcY29ybmVydGhpY2t9fQorXGRlZlxld2JvdHtcdnJ1bGUgaGVpZ2h0MHB0IGRlcHRoXGNvcm5lcnRoaWNrIHdpZHRoXGNvcm5lcmxvbmd9CitcZGVmXG5zYm90e1x2Ym94CisgIHtcaHJ1bGUgaGVpZ2h0XGNvcm5lcmxvbmcgZGVwdGhcY29ybmVydGhpY2sgd2lkdGhcY29ybmVydGhpY2t9fQorCislIFBhcnNlIGFuIGFyZ3VtZW50LCB0aGVuIHBhc3MgaXQgdG8gIzEuICBUaGUgYXJndW1lbnQgaXMgdGhlIHJlc3Qgb2YKKyUgdGhlIGlucHV0IGxpbmUgKGV4Y2VwdCB3ZSByZW1vdmUgYSB0cmFpbGluZyBjb21tZW50KS4gICMxIHNob3VsZCBiZSBhCislIG1hY3JvIHdoaWNoIGV4cGVjdHMgYW4gb3JkaW5hcnkgdW5kZWxpbWl0ZWQgVGVYIGFyZ3VtZW50LgorJQorXGRlZlxwYXJzZWFyZ3tccGFyc2Vhcmd1c2luZ3t9fQorXGRlZlxwYXJzZWFyZ3VzaW5nIzEjMnslCisgIFxkZWZcbmV4dHsjMn0lCisgIFxiZWdpbmdyb3VwCisgICAgXG9iZXlsaW5lcworICAgIFxzcGFjZWlzc3BhY2UKKyAgICAjMSUKKyAgICBccGFyc2VhcmdsaW5lXGVtcHR5JSBJbnNlcnQgdGhlIFxlbXB0eSB0b2tlbiwgc2VlIFxmaW5pc2hwYXJzZWFyZyBiZWxvdy4KK30KKwore1xvYmV5bGluZXMgJQorICBcZ2RlZlxwYXJzZWFyZ2xpbmUjMV5eTXslCisgICAgXGVuZGdyb3VwICUgRW5kIG9mIHRoZSBncm91cCBzdGFydGVkIGluIFxwYXJzZWFyZy4KKyAgICBcYXJncmVtb3ZlY29tbWVudCAjMVxjb21tZW50XEFyZ1Rlcm0lCisgIH0lCit9CisKKyUgRmlyc3QgcmVtb3ZlIGFueSBAY29tbWVudCwgdGhlbiBhbnkgQGMgY29tbWVudC4KK1xkZWZcYXJncmVtb3ZlY29tbWVudCMxXGNvbW1lbnQjMlxBcmdUZXJte1xhcmdyZW1vdmVjICMxXGNcQXJnVGVybX0KK1xkZWZcYXJncmVtb3ZlYyMxXGMjMlxBcmdUZXJte1xhcmdjaGVja3NwYWNlcyMxXF5eTVxBcmdUZXJtfQorCislIEVhY2ggb2NjdXJlbmNlIG9mIGBcXl5NJyBvciBgPHNwYWNlPlxeXk0nIGlzIHJlcGxhY2VkIGJ5IGEgc2luZ2xlIHNwYWNlLgorJQorJSBcYXJncmVtb3ZlYyBtaWdodCBsZWF2ZSB1cyB3aXRoIHRyYWlsaW5nIHNwYWNlLCBlLmcuLAorJSAgICBAZW5kIGl0ZW1pemUgIEBjIGZvbworJSBUaGlzIHNwYWNlIHRva2VuIHVuZGVyZ29lcyB0aGUgc2FtZSBwcm9jZWR1cmUgYW5kIGlzIGV2ZW50dWFsbHkgcmVtb3ZlZAorJSBieSBcZmluaXNocGFyc2VhcmcuCislCitcZGVmXGFyZ2NoZWNrc3BhY2VzIzFcXl5Ne1xhcmdjaGVja3NwYWNlc1gjMVxeXk0gXF5eTX0KK1xkZWZcYXJnY2hlY2tzcGFjZXNYIzEgXF5eTXtcYXJnY2hlY2tzcGFjZXNZIzFcXl5NfQorXGRlZlxhcmdjaGVja3NwYWNlc1kjMVxeXk0jMlxeXk0jM1xBcmdUZXJteyUKKyAgXGRlZlx0ZW1weyMzfSUKKyAgXGlmeFx0ZW1wXGVtcHR5CisgICAgJSBXZSBjYW5ub3QgdXNlIFxuZXh0IGhlcmUsIGFzIGl0IGhvbGRzIHRoZSBtYWNybyB0byBydW47CisgICAgJSB0aHVzIHdlIHJldXNlIFx0ZW1wLgorICAgIFxsZXRcdGVtcFxmaW5pc2hwYXJzZWFyZworICBcZWxzZQorICAgIFxsZXRcdGVtcFxhcmdjaGVja3NwYWNlcworICBcZmkKKyAgJSBQdXQgdGhlIHNwYWNlIHRva2VuIGluOgorICBcdGVtcCMxICMzXEFyZ1Rlcm0KK30KKworJSBJZiBhIF9kZWxpbWl0ZWRfIGFyZ3VtZW50IGlzIGVuY2xvc2VkIGluIGJyYWNlcywgdGhleSBnZXQgc3RyaXBwZWQ7IHNvCislIHRvIGdldCBfZXhhY3RseV8gdGhlIHJlc3Qgb2YgdGhlIGxpbmUsIHdlIGhhZCB0byBwcmV2ZW50IHN1Y2ggc2l0dWF0aW9uLgorJSBXZSBwcmVwZW5kZWQgYW4gXGVtcHR5IHRva2VuIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBhbmQgd2UgZXhwYW5kIGl0IG5vdywKKyUganVzdCBiZWZvcmUgcGFzc2luZyB0aGUgY29udHJvbCB0byBcbmV4dC4KKyUgKFNpbWlsYXJpbHksIHdlIGhhdmUgdG8gdGhpbmsgYWJvdXQgIzMgb2YgXGFyZ2NoZWNrc3BhY2VzWSBhYm92ZTogaXQgaXMKKyUgZWl0aGVyIHRoZSBudWxsIHN0cmluZywgb3IgaXQgZW5kcyB3aXRoIFxeXk0tLS10aHVzIHRoZXJlIGlzIG5vIGRhbmdlcgorJSB0aGF0IGEgcGFpciBvZiBicmFjZXMgd291bGQgYmUgc3RyaXBwZWQuCislCislIEJ1dCBmaXJzdCwgd2UgaGF2ZSB0byByZW1vdmUgdGhlIHRyYWlsaW5nIHNwYWNlIHRva2VuLgorJQorXGRlZlxmaW5pc2hwYXJzZWFyZyMxIFxBcmdUZXJte1xleHBhbmRhZnRlclxuZXh0XGV4cGFuZGFmdGVyeyMxfX0KKworJSBccGFyc2VhcmdkZWZcZm9vey4uLn0KKyUJaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvCislIFxkZWZcZm9ve1xwYXJzZWFyZ1xYZm9vfQorJSBcZGVmXFhmb28jMXsuLi59CislCislIEFjdHVhbGx5LCBJIHVzZSBcY3NuYW1lXHN0cmluZ1xmb29cZW5kY3NuYW1lLCBpZS4gXFxmb28sIGFzIGl0IGlzIG15CislIGZhdm91cml0ZSBUZVggdHJpY2suICAtLWthc2FsLCAxNm5vdjAzCisKK1xkZWZccGFyc2VhcmdkZWYjMXslCisgIFxleHBhbmRhZnRlciBcZG9wYXJzZWFyZ2RlZiBcY3NuYW1lXHN0cmluZyMxXGVuZGNzbmFtZSAjMSUKK30KK1xkZWZcZG9wYXJzZWFyZ2RlZiMxIzJ7JQorICBcZGVmIzJ7XHBhcnNlYXJnIzF9JQorICBcZGVmIzEjIzElCit9CisKKyUgU2V2ZXJhbCB1dGlsaXR5IGRlZmluaXRpb25zIHdpdGggYWN0aXZlIHNwYWNlOgoreworICBcb2JleXNwYWNlcworICBcZ2RlZlxvYmV5ZWRzcGFjZXsgfQorCisgICUgTWFrZSBlYWNoIHNwYWNlIGNoYXJhY3RlciBpbiB0aGUgaW5wdXQgcHJvZHVjZSBhIG5vcm1hbCBpbnRlcndvcmQKKyAgJSBzcGFjZSBpbiB0aGUgb3V0cHV0LiAgRG9uJ3QgYWxsb3cgYSBsaW5lIGJyZWFrIGF0IHRoaXMgc3BhY2UsIGFzIHRoaXMKKyAgJSBpcyB1c2VkIG9ubHkgaW4gZW52aXJvbm1lbnRzIGxpa2UgQGV4YW1wbGUsIHdoZXJlIGVhY2ggbGluZSBvZiBpbnB1dAorICAlIHNob3VsZCBwcm9kdWNlIGEgbGluZSBvZiBvdXRwdXQgYW55d2F5LgorICAlCisgIFxnZGVmXHNlcHNwYWNlc3tcb2JleXNwYWNlc1xsZXQgPVx0aWV9CisKKyAgJSBJZiBhbiBpbmRleCBjb21tYW5kIGlzIHVzZWQgaW4gYW4gQGV4YW1wbGUgZW52aXJvbm1lbnQsIGFueSBzcGFjZXMKKyAgJSB0aGVyZWluIHNob3VsZCBiZWNvbWUgcmVndWxhciBzcGFjZXMgaW4gdGhlIHJhdyBpbmRleCBmaWxlLCBub3QgdGhlCisgICUgZXhwYW5zaW9uIG9mIFx0aWUgKFxsZWF2ZXZtb2RlIFxwZW5hbHR5IFxATSBcICkuCisgIFxnZGVmXHVuc2Vwc3BhY2Vze1xsZXQgPVxzcGFjZX0KK30KKworCitcZGVmXGZsdXNoY3J7XGlmeFxwYXJcbGlzcHBhciBcZGVmXG5leHQjIzF7fVxlbHNlIFxsZXRcbmV4dD1ccmVsYXggXGZpIFxuZXh0fQorCislIERlZmluZSB0aGUgZnJhbWV3b3JrIGZvciBlbnZpcm9ubWVudHMgaW4gdGV4aW5mby50ZXguICBJdCdzIHVzZWQgbGlrZSB0aGlzOgorJQorJSAgIFxlbnZkZWZcZm9vey4uLn0KKyUgICBcZGVmXEVmb297Li4ufQorJQorJSBJdCdzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBcZW52ZGVmIHRvIGluc2VydCBcYmVnaW5ncm91cCBiZWZvcmUgdGhlCislIGFjdHVhbCBib2R5OyBAZW5kIGNsb3NlcyB0aGUgZ3JvdXAgYWZ0ZXIgY2FsbGluZyBcRWZvby4gIFxlbnZkZWYgYWxzbworJSBkZWZpbmVzIFx0aGlzZW52LCBzbyB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBpcyBrbm93bjsgQGVuZCBjaGVja3MKKyUgd2hldGhlciB0aGUgZW52aXJvbm1lbnQgbmFtZSBtYXRjaGVzLiAgVGhlIFxjaGVja2VudiBtYWNybyBjYW4gYWxzbyBiZQorJSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgdGhlIG9uZSBleHBlY3RlZC4KKyUKKyUgTm9uLWZhbHNlIGNvbmRpdGlvbmFscyAoQGlmdGV4LCBAaWZzZXQpIGRvbid0IGZpdCBpbnRvIHRoaXMsIHNvIHRoZXkKKyUgYXJlIG5vdCB0cmVhdGVkIGFzIGVudmlyb21lbnRzOyB0aGV5IGRvbid0IG9wZW4gYSBncm91cC4gIChUaGUKKyUgaW1wbGVtZW50YXRpb24gb2YgQGVuZCB0YWtlcyBjYXJlIG5vdCB0byBjYWxsIFxlbmRncm91cCBpbiB0aGlzCislIHNwZWNpYWwgY2FzZS4pCisKKworJSBBdCBydW50aW1lLCBlbnZpcm9ubWVudHMgc3RhcnQgd2l0aCB0aGlzOgorXGRlZlxzdGFydGVudmlyb25tZW50IzF7XGJlZ2luZ3JvdXBcZGVmXHRoaXNlbnZ7IzF9fQorJSBpbml0aWFsaXplCitcbGV0XHRoaXNlbnZcZW1wdHkKKworJSAuLi4gYnV0IHRoZXkgZ2V0IGRlZmluZWQgdmlhIGBgXGVudmRlZlxmb297Li4ufScnOgorXGxvbmdcZGVmXGVudmRlZiMxIzJ7XGRlZiMxe1xzdGFydGVudmlyb25tZW50IzEjMn19CitcZGVmXGVudnBhcnNlYXJnZGVmIzEjMntccGFyc2VhcmdkZWYjMXtcc3RhcnRlbnZpcm9ubWVudCMxIzJ9fQorCislIENoZWNrIHdoZXRoZXIgd2UncmUgaW4gdGhlIHJpZ2h0IGVudmlyb25tZW50OgorXGRlZlxjaGVja2VudiMxeyUKKyAgXGRlZlx0ZW1weyMxfSUKKyAgXGlmeFx0aGlzZW52XHRlbXAKKyAgXGVsc2UKKyAgICBcYmFkZW52ZXJyCisgIFxmaQorfQorCislIEV2aXJvbm1lbnQgbWlzbWF0Y2gsICMxIGV4cGVjdGVkOgorXGRlZlxiYWRlbnZlcnJ7JQorICBcZXJyaGVscCA9IFxFTXNpbXBsZQorICBcZXJybWVzc2FnZXtUaGlzIGNvbW1hbmQgY2FuIGFwcGVhciBvbmx5IFxpbmVudmlyb25tZW50XHRlbXAsCisgICAgbm90IFxpbmVudmlyb25tZW50XHRoaXNlbnZ9JQorfQorXGRlZlxpbmVudmlyb25tZW50IzF7JQorICBcaWZ4IzFcZW1wdHkKKyAgICBvdXQgb2YgYW55IGVudmlyb25tZW50JQorICBcZWxzZQorICAgIGluIGVudmlyb25tZW50IFxleHBhbmRhZnRlclxzdHJpbmcjMSUKKyAgXGZpCit9CisKKyUgQGVuZCBmb28gZXhlY3V0ZXMgdGhlIGRlZmluaXRpb24gb2YgXEVmb28uCislIEJ1dCBmaXJzdCwgaXQgZXhlY3V0ZXMgYSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIFxjaGVja2VudgorJQorXHBhcnNlYXJnZGVmXGVuZHslCisgIFxpZiAxXGNzbmFtZSBpc2NvbmQuIzFcZW5kY3NuYW1lCisgIFxlbHNlCisgICAgJSBUaGUgZ2VuZXJhbCB3b3JkaW5nIG9mIFxiYWRlbnZlcnIgbWF5IG5vdCBiZSBpZGVhbCwgYnV0Li4uIC0ta2FzYWwsIDA2bm92MDMKKyAgICBcZXhwYW5kYWZ0ZXJcY2hlY2tlbnZcY3NuYW1lIzFcZW5kY3NuYW1lCisgICAgXGNzbmFtZSBFIzFcZW5kY3NuYW1lCisgICAgXGVuZGdyb3VwCisgIFxmaQorfQorCitcbmV3aGVscFxFTXNpbXBsZXtQcmVzcyBSRVRVUk4gdG8gY29udGludWUufQorCisKKyUlIFNpbXBsZSBzaW5nbGUtY2hhcmFjdGVyIEAgY29tbWFuZHMKKworJSBAQCBwcmludHMgYW4gQAorJSBLbHVkZ2UgdGhpcyB1bnRpbCB0aGUgZm9udHMgYXJlIHJpZ2h0IChncnIpLgorXGRlZlxAe3tcdHRcY2hhcjY0fX0KKworJSBUaGlzIGlzIHR1cm5lZCBvZmYgYmVjYXVzZSBpdCB3YXMgbmV2ZXIgZG9jdW1lbnRlZAorJSBhbmQgeW91IGNhbiB1c2UgQHd7Li4ufSBhcm91bmQgYSBxdW90ZSB0byBzdXBwcmVzcyBsaWdhdHVyZXMuCislJSBEZWZpbmUgQGAgYW5kIEAnIHRvIGJlIHRoZSBzYW1lIGFzIGAgYW5kICcKKyUlIGJ1dCBzdXBwcmVzc2luZyBsaWdhdHVyZXMuCislXGRlZlxge3tgfX0KKyVcZGVmXCd7eyd9fQorCislIFVzZWQgdG8gZ2VuZXJhdGUgcXVvdGVkIGJyYWNlcy4KK1xkZWZcbXlsYnJhY2Uge3tcdHRcY2hhcjEyM319CitcZGVmXG15cmJyYWNlIHt7XHR0XGNoYXIxMjV9fQorXGxldFx7PVxteWxicmFjZQorXGxldFx9PVxteXJicmFjZQorXGJlZ2luZ3JvdXAKKyAgJSBEZWZpbml0aW9ucyB0byBwcm9kdWNlIFx7IGFuZCBcfSBjb21tYW5kcyBmb3IgaW5kaWNlcywKKyAgJSBhbmQgQHsgYW5kIEB9IGZvciB0aGUgYXV4IGZpbGUuCisgIFxjYXRjb2RlYFx7ID0gXG90aGVyIFxjYXRjb2RlYFx9ID0gXG90aGVyCisgIFxjYXRjb2RlYFxbID0gMSBcY2F0Y29kZWBcXSA9IDIKKyAgXGNhdGNvZGVgXCEgPSAwIFxjYXRjb2RlYFxcID0gXG90aGVyCisgICFnZGVmIWxicmFjZWNtZFtce10lCisgICFnZGVmIXJicmFjZWNtZFtcfV0lCisgICFnZGVmIWxicmFjZWF0Y21kW0B7XSUKKyAgIWdkZWYhcmJyYWNlYXRjbWRbQH1dJQorIWVuZGdyb3VwCisKKyUgQGNvbW1he30gdG8gYXZvaWQgLCBwYXJzaW5nIHByb2JsZW1zLgorXGxldFxjb21tYSA9ICwKKworJSBBY2NlbnRzOiBALCBAZG90YWNjZW50IEByaW5nYWNjZW50IEB1YmFyYWNjZW50IEB1ZG90YWNjZW50CislIE90aGVycyBhcmUgZGVmaW5lZCBieSBwbGFpbiBUZVg6IEBgIEAnIEAiIEBeIEB+IEA9IEB1IEB2IEBILgorXGxldFwsID0gXGMKK1xsZXRcZG90YWNjZW50ID0gXC4KK1xkZWZccmluZ2FjY2VudCMxe3tcYWNjZW50MjMgIzF9fQorXGxldFx0aWVhY2NlbnQgPSBcdAorXGxldFx1YmFyYWNjZW50ID0gXGIKK1xsZXRcdWRvdGFjY2VudCA9IFxkCisKKyUgT3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzOiBAcXVlc3Rpb25kb3duIEBleGNsYW1kb3duIEBvcmRmIEBvcmRtCislIFBsYWluIFRlWCBkZWZpbmVzOiBAQUEgQEFFIEBPIEBPRSBATCAocGx1cyBsb3dlcmNhc2UgdmVyc2lvbnMpIEBzcy4KK1xkZWZccXVlc3Rpb25kb3duez9gfQorXGRlZlxleGNsYW1kb3dueyFgfQorXGRlZlxvcmRme1xsZWF2ZXZtb2RlXHJhaXNlMWV4XGhib3h7XHNlbGVjdGZvbnRzXGxsbHNpemUgXHVuZGVyYmFye2F9fX0KK1xkZWZcb3JkbXtcbGVhdmV2bW9kZVxyYWlzZTFleFxoYm94e1xzZWxlY3Rmb250c1xsbGxzaXplIFx1bmRlcmJhcntvfX19CisKKyUgRG90bGVzcyBpIGFuZCBkb3RsZXNzIGosIHVzZWQgZm9yIGFjY2VudHMuCitcZGVmXGltYWNyb3tpfQorXGRlZlxqbWFjcm97an0KK1xkZWZcZG90bGVzcyMxeyUKKyAgXGRlZlx0ZW1weyMxfSUKKyAgXGlmeFx0ZW1wXGltYWNybyBccHRleGkKKyAgXGVsc2VcaWZ4XHRlbXBcam1hY3JvIFxqCisgIFxlbHNlIFxlcnJtZXNzYWdle0Bkb3RsZXNzIGNhbiBiZSB1c2VkIG9ubHkgd2l0aCBpIG9yIGp9JQorICBcZmlcZmkKK30KKworJSBUaGUgXFRlWHt9IGxvZ28sIGFzIGluIHBsYWluLCBidXQgcmVzZXR0aW5nIHRoZSBzcGFjaW5nIHNvIHRoYXQgYQorJSBwZXJpb2QgZm9sbG93aW5nIGNvdW50cyBhcyBlbmRpbmcgYSBzZW50ZW5jZS4gIChJZGVhIGZvdW5kIGluIGxhdGV4LikKKyUKK1xlZGVmXFRlWHtcVGVYIFxzcGFjZWZhY3Rvcj0xMDAwIH0KKworJSBATGFUZVh7fSBsb2dvLiAgTm90IHF1aXRlIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIGRlZmluaXRpb24gaW4KKyUgbGF0ZXgubHR4LCBzaW5jZSB3ZSB1c2UgYSBkaWZmZXJlbnQgZm9udCBmb3IgdGhlIHJhaXNlZCBBOyBpdCdzIG1vc3QKKyUgY29udmVuaWVudCBmb3IgdXMgdG8gdXNlIGFuIGV4cGxpY2l0bHkgc21hbGxlciBmb250LCByYXRoZXIgdGhhbiB1c2luZworJSB0aGUgXHNjcmlwdHN0eWxlIGZvbnQgKHNpbmNlIHdlIGRvbid0IHJlc2V0IFxzY3JpcHRzdHlsZSBhbmQKKyUgXHNjcmlwdHNjcmlwdHN0eWxlKS4KKyUKK1xkZWZcTGFUZVh7JQorICBMXGtlcm4tLjM2ZW0KKyAge1xzZXRib3gwPVxoYm94e1R9JQorICAgXHZib3ggdG8gXGh0MHtcaGJveHtcc2VsZWN0Zm9udHNcbGxsc2l6ZSBBfVx2c3N9fSUKKyAgXGtlcm4tLjE1ZW0KKyAgXFRlWAorfQorCislIEJlIHN1cmUgd2UncmUgaW4gaG9yaXpvbnRhbCBtb2RlIHdoZW4gZG9pbmcgYSB0aWUsIHNpbmNlIHdlIG1ha2Ugc3BhY2UKKyUgZXF1aXZhbGVudCB0byB0aGlzIGluIEBleGFtcGxlLWxpa2UgZW52aXJvbm1lbnRzLiBPdGhlcndpc2UsIGEgc3BhY2UKKyUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgd2lsbCBzdGFydCB3aXRoIFxwZW5hbHR5IC0tIGFuZAorJSBzaW5jZSBccGVuYWx0eSBpcyB2YWxpZCBpbiB2ZXJ0aWNhbCBtb2RlLCB3ZSdkIGVuZCB1cCBwdXR0aW5nIHRoZQorJSBwZW5hbHR5IG9uIHRoZSB2ZXJ0aWNhbCBsaXN0IGluc3RlYWQgb2YgaW4gdGhlIG5ldyBwYXJhZ3JhcGguCit7XGNhdGNvZGVgQCA9IDExCisgJSBBdm9pZCB1c2luZyBcQE0gZGlyZWN0bHksIGJlY2F1c2UgdGhhdCBjYXVzZXMgdHJvdWJsZQorICUgaWYgdGhlIGRlZmluaXRpb24gaXMgd3JpdHRlbiBpbnRvIGFuIGluZGV4IGZpbGUuCisgXGdsb2JhbFxsZXRcdGllcGVuYWx0eSA9IFxATQorIFxnZGVmXHRpZXtcbGVhdmV2bW9kZVxwZW5hbHR5XHRpZXBlbmFsdHlcIH0KK30KKworJSBAOiBmb3JjZXMgbm9ybWFsIHNpemUgd2hpdGVzcGFjZSBmb2xsb3dpbmcuCitcZGVmXDp7XHNwYWNlZmFjdG9yPTEwMDAgfQorCislIEAqIGZvcmNlcyBhIGxpbmUgYnJlYWsuCitcZGVmXCp7XGhmaWxcYnJlYWtcaGJveHt9XGlnbm9yZXNwYWNlc30KKworJSBALyBhbGxvd3MgYSBsaW5lIGJyZWFrLgorXGxldFwvPVxhbGxvd2JyZWFrCisKKyUgQC4gaXMgYW4gZW5kLW9mLXNlbnRlbmNlIHBlcmlvZC4KK1xkZWZcLnsuXHNwYWNlZmFjdG9yPTMwMDAgfQorCislIEAhIGlzIGFuIGVuZC1vZi1zZW50ZW5jZSBiYW5nLgorXGRlZlwheyFcc3BhY2VmYWN0b3I9MzAwMCB9CisKKyUgQD8gaXMgYW4gZW5kLW9mLXNlbnRlbmNlIHF1ZXJ5LgorXGRlZlw/ez9cc3BhY2VmYWN0b3I9MzAwMCB9CisKKyUgQHcgcHJldmVudHMgYSB3b3JkIGJyZWFrLiAgV2l0aG91dCB0aGUgXGxlYXZldm1vZGUsIEB3IGF0IHRoZQorJSBiZWdpbm5pbmcgb2YgYSBwYXJhZ3JhcGgsIHdoZW4gVGVYIGlzIHN0aWxsIGluIHZlcnRpY2FsIG1vZGUsIHdvdWxkCislIHByb2R1Y2UgYSB3aG9sZSBsaW5lIG9mIG91dHB1dCBpbnN0ZWFkIG9mIHN0YXJ0aW5nIHRoZSBwYXJhZ3JhcGguCitcZGVmXHcjMXtcbGVhdmV2bW9kZVxoYm94eyMxfX0KKworJSBAZ3JvdXAgLi4uIEBlbmQgZ3JvdXAgZm9yY2VzIC4uLiB0byBiZSBhbGwgb24gb25lIHBhZ2UsIGJ5IGVuY2xvc2luZworJSBpdCBpbiBhIFRlWCB2Ym94LiAgV2UgdXNlIFx2dG9wIGluc3RlYWQgb2YgXHZib3ggdG8gY29uc3RydWN0IHRoZSBib3gKKyUgdG8ga2VlcCBpdHMgaGVpZ2h0IHRoYXQgb2YgYSBub3JtYWwgbGluZS4gIEFjY29yZGluZyB0byB0aGUgcnVsZXMgZm9yCislIFx0b3Bza2lwIChwLjExNCBvZiB0aGUgVGVYYm9vayksIHRoZSBnbHVlIGluc2VydGVkIGlzCislIG1heCAoXHRvcHNraXAgLSBcaHQgKGZpcnN0IGl0ZW0pLCAwKS4gIElmIHRoYXQgaGVpZ2h0IGlzIGxhcmdlLAorJSB0aGVyZWZvcmUsIG5vIGdsdWUgaXMgaW5zZXJ0ZWQsIGFuZCB0aGUgc3BhY2UgYmV0d2VlbiB0aGUgaGVhZGxpbmUgYW5kCislIHRoZSB0ZXh0IGlzIHNtYWxsLCB3aGljaCBsb29rcyBiYWQuCislCislIEFub3RoZXIgY29tcGxpY2F0aW9uIGlzIHRoYXQgdGhlIGdyb3VwIG1pZ2h0IGJlIHZlcnkgbGFyZ2UuICBUaGlzIGNhbgorJSBjYXVzZSB0aGUgZ2x1ZSBvbiB0aGUgcHJldmlvdXMgcGFnZSB0byBiZSB1bmR1bHkgc3RyZXRjaGVkLCBiZWNhdXNlIGl0CislIGRvZXMgbm90IGhhdmUgbXVjaCBtYXRlcmlhbC4gIEluIHRoaXMgY2FzZSwgaXQncyBiZXR0ZXIgdG8gYWRkIGFuCislIGV4cGxpY2l0IFx2ZmlsbCBzbyB0aGF0IHRoZSBleHRyYSBzcGFjZSBpcyBhdCB0aGUgYm90dG9tLiAgVGhlCislIHRocmVzaG9sZCBmb3IgZG9pbmcgdGhpcyBpcyBpZiB0aGUgZ3JvdXAgaXMgbW9yZSB0aGFuIFx2ZmlsbGxpbWl0CislIHBlcmNlbnQgb2YgYSBwYWdlIChcdmZpbGxsaW1pdCBjYW4gYmUgY2hhbmdlZCBpbnNpZGUgb2YgQHRleCkuCislCitcbmV3Ym94XGdyb3VwYm94CitcZGVmXHZmaWxsbGltaXR7MC43fQorJQorXGVudmRlZlxncm91cHslCisgIFxpZm51bVxjYXRjb2RlYFxeXk09XGFjdGl2ZSBcZWxzZQorICAgIFxlcnJoZWxwID0gXGdyb3VwaW52YWxpZGhlbHAKKyAgICBcZXJybWVzc2FnZXtAZ3JvdXAgaW52YWxpZCBpbiBjb250ZXh0IHdoZXJlIGZpbGxpbmcgaXMgZW5hYmxlZH0lCisgIFxmaQorICBcc3RhcnRzYXZpbmdpbnNlcnRzCisgICUKKyAgXHNldGJveFxncm91cGJveCA9IFx2dG9wXGJncm91cAorICAgICUgRG8gQGNvbW1lbnQgc2luY2Ugd2UgYXJlIGNhbGxlZCBpbnNpZGUgYW4gZW52aXJvbm1lbnQgc3VjaCBhcworICAgICUgQGV4YW1wbGUsIHdoZXJlIGVhY2ggZW5kLW9mLWxpbmUgaW4gdGhlIGlucHV0IGNhdXNlcyBhbgorICAgICUgZW5kLW9mLWxpbmUgaW4gdGhlIG91dHB1dC4gIFdlIGRvbid0IHdhbnQgdGhlIGVuZC1vZi1saW5lIGFmdGVyCisgICAgJSB0aGUgYEBncm91cCcgdG8gcHV0IGV4dHJhIHNwYWNlIGluIHRoZSBvdXRwdXQuICBTaW5jZSBAZ3JvdXAKKyAgICAlIHNob3VsZCBhcHBlYXIgb24gYSBsaW5lIGJ5IGl0c2VsZiAoYWNjb3JkaW5nIHRvIHRoZSBUZXhpbmZvCisgICAgJSBtYW51YWwpLCB3ZSBkb24ndCB3b3JyeSBhYm91dCBlYXRpbmcgYW55IHVzZXIgdGV4dC4KKyAgICBcY29tbWVudAorfQorJQorJSBUaGUgXHZ0b3AgcHJvZHVjZXMgYSBib3ggd2l0aCBub3JtYWwgaGVpZ2h0IGFuZCBsYXJnZSBkZXB0aDsgdGh1cywgVGVYIHB1dHMKKyUgXGJhc2VsaW5lc2tpcCBnbHVlIGJlZm9yZSBpdCwgYW5kICh3aGVuIHRoZSBuZXh0IGxpbmUgb2YgdGV4dCBpcyBkb25lKQorJSBcbGluZXNraXAgZ2x1ZSBhZnRlciBpdC4gIFRodXMsIHNwYWNlIGJlbG93IGlzIG5vdCBxdWl0ZSBlcXVhbCB0byBzcGFjZQorJSBhYm92ZS4gIEJ1dCBpdCdzIHByZXR0eSBjbG9zZS4KK1xkZWZcRWdyb3VweyUKKyAgICAlIFRvIGdldCBjb3JyZWN0IGludGVybGluZSBzcGFjZSBiZXR3ZWVuIHRoZSBsYXN0IGxpbmUgb2YgdGhlIGdyb3VwCisgICAgJSBhbmQgdGhlIGZpcnN0IGxpbmUgYWZ0ZXJ3YXJkcywgd2UgaGF2ZSB0byBwcm9wYWdhdGUgXHByZXZkZXB0aC4KKyAgICBcZW5kZ3JhZiAlIE5vdCBccGFyLCBhcyBpdCBtYXkgaGF2ZSBiZWVuIHNldCB0byBcbGlzcHBhci4KKyAgICBcZ2xvYmFsXGRpbWVuMSA9IFxwcmV2ZGVwdGgKKyAgXGVncm91cCAgICAgICAgICAgJSBFbmQgdGhlIFx2dG9wLgorICAlIFxkaW1lbjAgaXMgdGhlIHZlcnRpY2FsIHNpemUgb2YgdGhlIGdyb3VwJ3MgYm94LgorICBcZGltZW4wID0gXGh0XGdyb3VwYm94ICBcYWR2YW5jZVxkaW1lbjAgYnkgXGRwXGdyb3VwYm94CisgICUgXGRpbWVuMiBpcyBob3cgbXVjaCBzcGFjZSBpcyBsZWZ0IG9uIHRoZSBwYWdlIChtb3JlIG9yIGxlc3MpLgorICBcZGltZW4yID0gXHBhZ2VoZWlnaHQgICBcYWR2YW5jZVxkaW1lbjIgYnkgLVxwYWdldG90YWwKKyAgJSBpZiB0aGUgZ3JvdXAgZG9lc24ndCBmaXQgb24gdGhlIGN1cnJlbnQgcGFnZSwgYW5kIGl0J3MgYSBiaWcgYmlnCisgICUgZ3JvdXAsIGZvcmNlIGEgcGFnZSBicmVhay4KKyAgXGlmZGltIFxkaW1lbjAgPiBcZGltZW4yCisgICAgXGlmZGltIFxwYWdldG90YWwgPCBcdmZpbGxsaW1pdFxwYWdlaGVpZ2h0CisgICAgICBccGFnZQorICAgIFxmaQorICBcZmkKKyAgXGJveFxncm91cGJveAorICBccHJldmRlcHRoID0gXGRpbWVuMQorICBcY2hlY2tpbnNlcnRzCit9CislCislIFRlWCBwdXRzIGluIGFuIFxlc2NhcGVjaGFyIChpLmUuLCBgQCcpIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGhlbHAKKyUgbWVzc2FnZSwgc28gdGhpcyBlbmRzIHVwIHByaW50aW5nIGBAZ3JvdXAgY2FuIG9ubHkgLi4uJy4KKyUKK1xuZXdoZWxwXGdyb3VwaW52YWxpZGhlbHB7JQorZ3JvdXAgY2FuIG9ubHkgYmUgdXNlZCBpbiBlbnZpcm9ubWVudHMgc3VjaCBhcyBAZXhhbXBsZSxeXkolCit3aGVyZSBlYWNoIGxpbmUgb2YgaW5wdXQgcHJvZHVjZXMgYSBsaW5lIG9mIG91dHB1dC59CisKKyUgQG5lZWQgc3BhY2UtaW4tbWlscworJSBmb3JjZXMgYSBwYWdlIGJyZWFrIGlmIHRoZXJlIGlzIG5vdCBzcGFjZS1pbi1taWxzIHJlbWFpbmluZy4KKworXG5ld2RpbWVuXG1pbCAgXG1pbD0wLjAwMWluCisKKyUgT2xkIGRlZmluaXRpb24tLWRpZG4ndCB3b3JrLgorJVxwYXJzZWFyZ2RlZlxuZWVke1xwYXIgJQorJSUgVGhpcyBtZXRob2QgdHJpZXMgdG8gbWFrZSBUZVggYnJlYWsgdGhlIHBhZ2UgbmF0dXJhbGx5CislJSBpZiB0aGUgZGVwdGggb2YgdGhlIGJveCBkb2VzIG5vdCBmaXQuCisle1xiYXNlbGluZXNraXA9MHB0JQorJVx2dG9wIHRvICMxXG1pbHtcdmZpbH1ca2VybiAtIzFcbWlsXG5vYnJlYWsKKyVccHJldmRlcHRoPS0xMDAwcHQKKyV9fQorCitccGFyc2VhcmdkZWZcbmVlZHslCisgICUgRW5zdXJlIHZlcnRpY2FsIG1vZGUsIHNvIHdlIGRvbid0IG1ha2UgYSBiaWcgYm94IGluIHRoZSBtaWRkbGUgb2YgYQorICAlIHBhcmFncmFwaC4KKyAgXHBhcgorICAlCisgICUgSWYgdGhlIEBuZWVkIHZhbHVlIGlzIGxlc3MgdGhhbiBvbmUgbGluZSBzcGFjZSwgaXQncyB1c2VsZXNzLgorICBcZGltZW4wID0gIzFcbWlsCisgIFxkaW1lbjIgPSBcaHRcc3RydXRib3gKKyAgXGFkdmFuY2VcZGltZW4yIGJ5IFxkcFxzdHJ1dGJveAorICBcaWZkaW1cZGltZW4wID4gXGRpbWVuMgorICAgICUKKyAgICAlIERvIGEgXHN0cnV0IGp1c3QgdG8gbWFrZSB0aGUgaGVpZ2h0IG9mIHRoaXMgYm94IGJlIG5vcm1hbCwgc28gdGhlCisgICAgJSBub3JtYWwgbGVhZGluZyBpcyBpbnNlcnRlZCByZWxhdGl2ZSB0byB0aGUgcHJlY2VkaW5nIGxpbmUuCisgICAgJSBBbmQgYSBwYWdlIGJyZWFrIGhlcmUgaXMgZmluZS4KKyAgICBcdnRvcCB0byAjMVxtaWx7XHN0cnV0XHZmaWx9JQorICAgICUKKyAgICAlIFRlWCBkb2VzIG5vdCBldmVuIGNvbnNpZGVyIHBhZ2UgYnJlYWtzIGlmIGEgcGVuYWx0eSBhZGRlZCB0byB0aGUKKyAgICAlIG1haW4gdmVydGljYWwgbGlzdCBpcyAxMDAwMCBvciBtb3JlLiAgQnV0IGluIG9yZGVyIHRvIHNlZSBpZiB0aGUKKyAgICAlIGVtcHR5IGJveCB3ZSBqdXN0IGFkZGVkIGZpdHMgb24gdGhlIHBhZ2UsIHdlIG11c3QgbWFrZSBpdCBjb25zaWRlcgorICAgICUgcGFnZSBicmVha3MuICBPbiB0aGUgb3RoZXIgaGFuZCwgd2UgZG9uJ3Qgd2FudCB0byBhY3R1YWxseSBicmVhayB0aGUKKyAgICAlIHBhZ2UgYWZ0ZXIgdGhlIGVtcHR5IGJveC4gIFNvIHdlIHVzZSBhIHBlbmFsdHkgb2YgOTk5OS4KKyAgICAlCisgICAgJSBUaGVyZSBpcyBhbiBleHRyZW1lbHkgc21hbGwgY2hhbmNlIHRoYXQgVGVYIHdpbGwgYWN0dWFsbHkgYnJlYWsgdGhlCisgICAgJSBwYWdlIGF0IHRoaXMgXHBlbmFsdHksIGlmIHRoZXJlIGFyZSBubyBvdGhlciBmZWFzaWJsZSBicmVha3BvaW50cyBpbgorICAgICUgc2lnaHQuICAoSWYgdGhlIHVzZXIgaXMgdXNpbmcgbG90cyBvZiBiaWcgQGdyb3VwIGNvbW1hbmRzLCB3aGljaAorICAgICUgYWxtb3N0LWJ1dC1ub3QtcXVpdGUgZmlsbCB1cCBhIHBhZ2UsIFRlWCB3aWxsIGhhdmUgYSBoYXJkIHRpbWUgZG9pbmcKKyAgICAlIGdvb2QgcGFnZSBicmVha2luZywgZm9yIGV4YW1wbGUuKSAgSG93ZXZlciwgSSBjb3VsZCBub3QgY29uc3RydWN0IGFuCisgICAgJSBleGFtcGxlIHdoZXJlIGEgcGFnZSBicm9rZSBhdCB0aGlzIFxwZW5hbHR5OyBpZiBpdCBoYXBwZW5zIGluIGEgcmVhbAorICAgICUgZG9jdW1lbnQsIHRoZW4gd2UgY2FuIHJlY29uc2lkZXIgb3VyIHN0cmF0ZWd5LgorICAgIFxwZW5hbHR5OTk5OQorICAgICUKKyAgICAlIEJhY2sgdXAgYnkgdGhlIHNpemUgb2YgdGhlIGJveCwgd2hldGhlciB3ZSBkaWQgYSBwYWdlIGJyZWFrIG9yIG5vdC4KKyAgICBca2VybiAtIzFcbWlsCisgICAgJQorICAgICUgRG8gbm90IGFsbG93IGEgcGFnZSBicmVhayByaWdodCBhZnRlciB0aGlzIGtlcm4uCisgICAgXG5vYnJlYWsKKyAgXGZpCit9CisKKyUgQGJyICAgZm9yY2VzIHBhcmFncmFwaCBicmVhayAoYW5kIGlzIHVuZG9jdW1lbnRlZCkuCisKK1xsZXRcYnIgPSBccGFyCisKKyUgQHBhZ2UgZm9yY2VzIHRoZSBzdGFydCBvZiBhIG5ldyBwYWdlLgorJQorXGRlZlxwYWdle1xwYXJcdmZpbGxcc3VwZXJlamVjdH0KKworJSBAZXhkZW50IHRleHQuLi4uCislIG91dHB1dHMgdGV4dCBvbiBzZXBhcmF0ZSBsaW5lIGluIHJvbWFuIGZvbnQsIHN0YXJ0aW5nIGF0IHN0YW5kYXJkIHBhZ2UgbWFyZ2luCisKKyUgVGhpcyByZWNvcmRzIHRoZSBhbW91bnQgb2YgaW5kZW50IGluIHRoZSBpbm5lcm1vc3QgZW52aXJvbm1lbnQuCislIFRoYXQncyBob3cgbXVjaCBcZXhkZW50IHNob3VsZCB0YWtlIG91dC4KK1xuZXdza2lwXGV4ZGVudGFtb3VudAorCislIFRoaXMgZGVmbiBpcyB1c2VkIGluc2lkZSBmaWxsIGVudmlyb25tZW50cyBzdWNoIGFzIEBkZWZ1bi4KK1xwYXJzZWFyZ2RlZlxleGRlbnR7XGhmaWxcYnJlYWtcaGJveHtca2VybiAtXGV4ZGVudGFtb3VudHtccm0jMX19XGhmaWxcYnJlYWt9CisKKyUgVGhpcyBkZWZuIGlzIHVzZWQgaW5zaWRlIG5vZmlsbCBlbnZpcm9ubWVudHMgc3VjaCBhcyBAZXhhbXBsZS4KK1xwYXJzZWFyZ2RlZlxub2ZpbGxleGRlbnR7e1xhZHZhbmNlIFxsZWZ0c2tpcCBieSAtXGV4ZGVudGFtb3VudAorICBcbGVmdGxpbmV7XGhza2lwXGxlZnRza2lwe1xybSMxfX19fQorCislIEBpbm1hcmdpbntXSElDSH17VEVYVH0gcHV0cyBURVhUIGluIHRoZSBXSElDSCBtYXJnaW4gbmV4dCB0byB0aGUgY3VycmVudAorJSBwYXJhZ3JhcGguICBGb3IgbW9yZSBnZW5lcmFsIHB1cnBvc2VzLCB1c2UgdGhlIFxtYXJnaW4gaW5zZXJ0aW9uCislIGNsYXNzLiAgV0hJQ0ggaXMgYGwnIG9yIGByJy4KKyUKK1xuZXdza2lwXGlubWFyZ2luc3BhY2luZyBcaW5tYXJnaW5zcGFjaW5nPTFjbQorXGRlZlxzdHJ1dGRlcHRoe1xkcFxzdHJ1dGJveH0KKyUKK1xkZWZcZG9pbm1hcmdpbiMxIzJ7XHN0cnV0XHZhZGp1c3R7JQorICBcbm9icmVhaworICBca2Vybi1cc3RydXRkZXB0aAorICBcdnRvcCB0byBcc3RydXRkZXB0aHslCisgICAgXGJhc2VsaW5lc2tpcD1cc3RydXRkZXB0aAorICAgIFx2c3MKKyAgICAlIGlmIHlvdSBoYXZlIG11bHRpcGxlIGxpbmVzIG9mIHN0dWZmIHRvIHB1dCBoZXJlLCB5b3UnbGwgbmVlZCB0bworICAgICUgbWFrZSB0aGUgdmJveCB5b3Vyc2VsZiBvZiB0aGUgYXBwcm9wcmlhdGUgc2l6ZS4KKyAgICBcaWZ4IzFsJQorICAgICAgXGxsYXB7XGlnbm9yZXNwYWNlcyAjMlxoc2tpcFxpbm1hcmdpbnNwYWNpbmd9JQorICAgIFxlbHNlCisgICAgICBccmxhcHtcaHNraXBcaHNpemUgXGhza2lwXGlubWFyZ2luc3BhY2luZyBcaWdub3Jlc3BhY2VzICMyfSUKKyAgICBcZmkKKyAgICBcbnVsbAorICB9JQorfX0KK1xkZWZcaW5sZWZ0bWFyZ2lue1xkb2lubWFyZ2luIGx9CitcZGVmXGlucmlnaHRtYXJnaW57XGRvaW5tYXJnaW4gcn0KKyUKKyUgQGlubWFyZ2lue1RFWFQgWywgUklHSFQtVEVYVF19CislIChpZiBSSUdIVC1URVhUIGlzIGdpdmVuLCB1c2UgVEVYVCBmb3IgbGVmdCBwYWdlLCBSSUdIVC1URVhUIGZvciByaWdodDsKKyUgZWxzZSB1c2UgVEVYVCBmb3IgYm90aCkuCislCitcZGVmXGlubWFyZ2luIzF7XHBhcnNlaW5tYXJnaW4gIzEsLFxmaW5pc2h9CitcZGVmXHBhcnNlaW5tYXJnaW4jMSwjMiwjM1xmaW5pc2h7JSBub3QgcGVyZmVjdCwgYnV0IGJldHRlciB0aGFuIG5vdGhpbmcuCisgIFxzZXRib3gwID0gXGhib3h7XGlnbm9yZXNwYWNlcyAjMn0lCisgIFxpZmRpbVx3ZDAgPiAwcHQKKyAgICBcZGVmXGxlZnR0ZXh0eyMxfSUgIGhhdmUgYm90aCB0ZXh0cworICAgIFxkZWZccmlnaHR0ZXh0eyMyfSUKKyAgXGVsc2UKKyAgICBcZGVmXGxlZnR0ZXh0eyMxfSUgIGhhdmUgb25seSBvbmUgdGV4dAorICAgIFxkZWZccmlnaHR0ZXh0eyMxfSUKKyAgXGZpCisgICUKKyAgXGlmb2RkXHBhZ2VubworICAgIFxkZWZcdGVtcHtcaW5yaWdodG1hcmdpblxyaWdodHRleHR9JSBvZGQgcGFnZSAtPiBvdXRzaWRlIGlzIHJpZ2h0IG1hcmdpbgorICBcZWxzZQorICAgIFxkZWZcdGVtcHtcaW5sZWZ0bWFyZ2luXGxlZnR0ZXh0fSUKKyAgXGZpCisgIFx0ZW1wCit9CisKKyUgQGluY2x1ZGUgZmlsZSAgICBpbnNlcnQgdGV4dCBvZiB0aGF0IGZpbGUgYXMgaW5wdXQuCislCitcZGVmXGluY2x1ZGV7XHBhcnNlYXJndXNpbmdcZmlsZW5hbWVjYXRjb2Rlc1xpbmNsdWRlenp6fQorXGRlZlxpbmNsdWRlenp6IzF7JQorICBccHVzaHRoaXNmaWxlc3RhY2sKKyAgXGRlZlx0aGlzZmlsZXsjMX0lCisgIHslCisgICAgXG1ha2V2YWx1ZWV4cGFuZGFibGUKKyAgICBcZGVmXHRlbXB7XGlucHV0ICMxIH0lCisgICAgXGV4cGFuZGFmdGVyCisgIH1cdGVtcAorICBccG9wdGhpc2ZpbGVzdGFjaworfQorXGRlZlxmaWxlbmFtZWNhdGNvZGVzeyUKKyAgXGNhdGNvZGVgXFw9XG90aGVyCisgIFxjYXRjb2RlYH49XG90aGVyCisgIFxjYXRjb2RlYF49XG90aGVyCisgIFxjYXRjb2RlYF89XG90aGVyCisgIFxjYXRjb2RlYHw9XG90aGVyCisgIFxjYXRjb2RlYDw9XG90aGVyCisgIFxjYXRjb2RlYD49XG90aGVyCisgIFxjYXRjb2RlYCs9XG90aGVyCisgIFxjYXRjb2RlYC09XG90aGVyCit9CisKK1xkZWZccHVzaHRoaXNmaWxlc3RhY2t7JQorICBcZXhwYW5kYWZ0ZXJccHVzaHRoaXNmaWxlc3RhY2tYXHBvcHRoaXNmaWxlc3RhY2tcU3RhY2tUZXJtCit9CitcZGVmXHB1c2h0aGlzZmlsZXN0YWNrWHslCisgIFxleHBhbmRhZnRlclxwdXNodGhpc2ZpbGVzdGFja1lcdGhpc2ZpbGVcU3RhY2tUZXJtCit9CitcZGVmXHB1c2h0aGlzZmlsZXN0YWNrWSAjMVxTdGFja1Rlcm0gIzJcU3RhY2tUZXJtIHslCisgIFxnZGVmXHBvcHRoaXNmaWxlc3RhY2t7XGdkZWZcdGhpc2ZpbGV7IzF9XGdkZWZccG9wdGhpc2ZpbGVzdGFja3sjMn19JQorfQorCitcZGVmXHBvcHRoaXNmaWxlc3RhY2t7XGVycnRoaXNmaWxlc3RhY2tlbXB0eX0KK1xkZWZcZXJydGhpc2ZpbGVzdGFja2VtcHR5e1xlcnJtZXNzYWdle0ludGVybmFsIGVycm9yOgorICB0aGUgc3RhY2sgb2YgZmlsZW5hbWVzIGlzIGVtcHR5Ln19CisKK1xkZWZcdGhpc2ZpbGV7fQorCislIEBjZW50ZXIgbGluZQorJSBvdXRwdXRzIHRoYXQgbGluZSwgY2VudGVyZWQuCislCitccGFyc2VhcmdkZWZcY2VudGVyeyUKKyAgXGlmaG1vZGUKKyAgICBcbGV0XG5leHRcY2VudGVySAorICBcZWxzZQorICAgIFxsZXRcbmV4dFxjZW50ZXJWCisgIFxmaQorICBcbmV4dHtcaGZpbCBcaWdub3Jlc3BhY2VzIzFcdW5za2lwIFxoZmlsfSUKK30KK1xkZWZcY2VudGVySCMxeyUKKyAgeyUKKyAgICBcaGZpbFxicmVhaworICAgIFxhZHZhbmNlXGhzaXplIGJ5IC1cbGVmdHNraXAKKyAgICBcYWR2YW5jZVxoc2l6ZSBieSAtXHJpZ2h0c2tpcAorICAgIFxsaW5leyMxfSUKKyAgICBcYnJlYWsKKyAgfSUKK30KK1xkZWZcY2VudGVyViMxe1xsaW5le1xrZXJuXGxlZnRza2lwICMxXGtlcm5ccmlnaHRza2lwfX0KKworJSBAc3AgbiAgIG91dHB1dHMgbiBsaW5lcyBvZiB2ZXJ0aWNhbCBzcGFjZQorCitccGFyc2VhcmdkZWZcc3B7XHZza2lwICMxXGJhc2VsaW5lc2tpcH0KKworJSBAY29tbWVudCAuLi5saW5lIHdoaWNoIGlzIGlnbm9yZWQuLi4KKyUgQGMgaXMgdGhlIHNhbWUgYXMgQGNvbW1lbnQKKyUgQGlnbm9yZSAuLi4gQGVuZCBpZ25vcmUgIGlzIGFub3RoZXIgd2F5IHRvIHdyaXRlIGEgY29tbWVudAorCitcZGVmXGNvbW1lbnR7XGJlZ2luZ3JvdXAgXGNhdGNvZGVgXF5eTT1cb3RoZXIlCitcY2F0Y29kZWBcQD1cb3RoZXIgXGNhdGNvZGVgXHs9XG90aGVyIFxjYXRjb2RlYFx9PVxvdGhlciUKK1xjb21tZW50eHh4fQore1xjYXRjb2RlYFxeXk09XG90aGVyIFxnZGVmXGNvbW1lbnR4eHgjMV5eTXtcZW5kZ3JvdXB9fQorCitcbGV0XGM9XGNvbW1lbnQKKworJSBAcGFyYWdyYXBoaW5kZW50IE5DSEFSUworJSBXZSdsbCB1c2UgZW1zIGZvciBOQ0hBUlMsIGNsb3NlIGVub3VnaC4KKyUgTkNIQVJTIGNhbiBhbHNvIGJlIHRoZSB3b3JkIGBhc2lzJyBvciBgbm9uZScuCislIFdlIGNhbm5vdCBmZWFzaWJseSBpbXBsZW1lbnQgQHBhcmFncmFwaGluZGVudCBhc2lzLCB0aG91Z2guCislCitcZGVmXGFzaXN3b3Jke2FzaXN9ICUgbm8gdHJhbnNsYXRpb24sIHRoZXNlIGFyZSBrZXl3b3JkcworXGRlZlxub25ld29yZHtub25lfQorJQorXHBhcnNlYXJnZGVmXHBhcmFncmFwaGluZGVudHslCisgIFxkZWZcdGVtcHsjMX0lCisgIFxpZnhcdGVtcFxhc2lzd29yZAorICBcZWxzZQorICAgIFxpZnhcdGVtcFxub25ld29yZAorICAgICAgXGRlZmF1bHRwYXJpbmRlbnQgPSAwcHQKKyAgICBcZWxzZQorICAgICAgXGRlZmF1bHRwYXJpbmRlbnQgPSAjMWVtCisgICAgXGZpCisgIFxmaQorICBccGFyaW5kZW50ID0gXGRlZmF1bHRwYXJpbmRlbnQKK30KKworJSBAZXhhbXBsZWluZGVudCBOQ0hBUlMKKyUgV2UnbGwgdXNlIGVtcyBmb3IgTkNIQVJTIGxpa2UgQHBhcmFncmFwaGluZGVudC4KKyUgSXQgc2VlbXMgQGV4YW1wbGVpbmRlbnQgYXNpcyBpc24ndCBuZWNlc3NhcnksIGJ1dAorJSBJIHByZXNlcnZlIGl0IHRvIG1ha2UgaXQgc2ltaWxhciB0byBAcGFyYWdyYXBoaW5kZW50LgorXHBhcnNlYXJnZGVmXGV4YW1wbGVpbmRlbnR7JQorICBcZGVmXHRlbXB7IzF9JQorICBcaWZ4XHRlbXBcYXNpc3dvcmQKKyAgXGVsc2UKKyAgICBcaWZ4XHRlbXBcbm9uZXdvcmQKKyAgICAgIFxsaXNwbmFycm93aW5nID0gMHB0CisgICAgXGVsc2UKKyAgICAgIFxsaXNwbmFycm93aW5nID0gIzFlbQorICAgIFxmaQorICBcZmkKK30KKworJSBAZmlyc3RwYXJhZ3JhcGhpbmRlbnQgV09SRAorJSBJZiBXT1JEIGlzIGBub25lJywgdGhlbiBzdXBwcmVzcyBpbmRlbnRhdGlvbiBvZiB0aGUgZmlyc3QgcGFyYWdyYXBoCislIGFmdGVyIGEgc2VjdGlvbiBoZWFkaW5nLiAgSWYgV09SRCBpcyBgaW5zZXJ0JywgdGhlbiBkbyBpbmRlbnQgYXQgc3VjaAorJSBwYXJhZ3JhcGhzLgorJQorJSBUaGUgcGFyYWdyYXBoIGluZGVudGF0aW9uIGlzIHN1cHByZXNzZWQgb3Igbm90IGJ5IGNhbGxpbmcKKyUgXHN1cHByZXNzZmlyc3RwYXJhZ3JhcGhpbmRlbnQsIHdoaWNoIHRoZSBzZWN0aW9uaW5nIGNvbW1hbmRzIGRvLgorJSBXZSBzd2l0Y2ggdGhlIGRlZmluaXRpb24gb2YgdGhpcyBiYWNrIGFuZCBmb3J0aCBhY2NvcmRpbmcgdG8gV09SRC4KKyUgQnkgZGVmYXVsdCwgd2Ugc3VwcHJlc3MgaW5kZW50YXRpb24uCislCitcZGVmXHN1cHByZXNzZmlyc3RwYXJhZ3JhcGhpbmRlbnR7XGRvc3VwcHJlc3NmaXJzdHBhcmFncmFwaGluZGVudH0KK1xkZWZcaW5zZXJ0d29yZHtpbnNlcnR9CislCitccGFyc2VhcmdkZWZcZmlyc3RwYXJhZ3JhcGhpbmRlbnR7JQorICBcZGVmXHRlbXB7IzF9JQorICBcaWZ4XHRlbXBcbm9uZXdvcmQKKyAgICBcbGV0XHN1cHByZXNzZmlyc3RwYXJhZ3JhcGhpbmRlbnQgPSBcZG9zdXBwcmVzc2ZpcnN0cGFyYWdyYXBoaW5kZW50CisgIFxlbHNlXGlmeFx0ZW1wXGluc2VydHdvcmQKKyAgICBcbGV0XHN1cHByZXNzZmlyc3RwYXJhZ3JhcGhpbmRlbnQgPSBccmVsYXgKKyAgXGVsc2UKKyAgICBcZXJyaGVscCA9IFxFTXNpbXBsZQorICAgIFxlcnJtZXNzYWdle1Vua25vd24gQGZpcnN0cGFyYWdyYXBoaW5kZW50IG9wdGlvbiBgXHRlbXAnfSUKKyAgXGZpXGZpCit9CisKKyUgSGVyZSBpcyBob3cgd2UgYWN0dWFsbHkgc3VwcHJlc3MgaW5kZW50YXRpb24uICBSZWRlZmluZSBcZXZlcnlwYXIgdG8KKyUgXGtlcm4gYmFja3dhcmRzIGJ5IFxwYXJpbmRlbnQsIGFuZCB0aGVuIHJlc2V0IGl0c2VsZiB0byBlbXB0eS4KKyUKKyUgV2UgYWxzbyBtYWtlIFxpbmRlbnQgaXRzZWxmIG5vdCBhY3R1YWxseSBkbyBhbnl0aGluZyB1bnRpbCB0aGUgbmV4dAorJSBwYXJhZ3JhcGguCislCitcZ2RlZlxkb3N1cHByZXNzZmlyc3RwYXJhZ3JhcGhpbmRlbnR7JQorICBcZ2RlZlxpbmRlbnR7JQorICAgIFxyZXN0b3JlZmlyc3RwYXJhZ3JhcGhpbmRlbnQKKyAgICBcaW5kZW50CisgIH0lCisgIFxnZGVmXG5vaW5kZW50eyUKKyAgICBccmVzdG9yZWZpcnN0cGFyYWdyYXBoaW5kZW50CisgICAgXG5vaW5kZW50CisgIH0lCisgIFxnbG9iYWxcZXZlcnlwYXIgPSB7JQorICAgIFxrZXJuIC1ccGFyaW5kZW50CisgICAgXHJlc3RvcmVmaXJzdHBhcmFncmFwaGluZGVudAorICB9JQorfQorCitcZ2RlZlxyZXN0b3JlZmlyc3RwYXJhZ3JhcGhpbmRlbnR7JQorICBcZ2xvYmFsIFxsZXQgXGluZGVudCA9IFxwdGV4aW5kZW50CisgIFxnbG9iYWwgXGxldCBcbm9pbmRlbnQgPSBccHRleG5vaW5kZW50CisgIFxnbG9iYWwgXGV2ZXJ5cGFyID0ge30lCit9CisKKworJSBAYXNpcyBqdXN0IHlpZWxkcyBpdHMgYXJndW1lbnQuICBVc2VkIHdpdGggQHRhYmxlLCBmb3IgZXhhbXBsZS4KKyUKK1xkZWZcYXNpcyMxeyMxfQorCislIEBtYXRoIG91dHB1dHMgaXRzIGFyZ3VtZW50IGluIG1hdGggbW9kZS4KKyUKKyUgT25lIGNvbXBsaWNhdGlvbjogXyB1c3VhbGx5IG1lYW5zIHN1YnNjcmlwdHMsIGJ1dCBpdCBjb3VsZCBhbHNvIG1lYW4KKyUgYW4gYWN0dWFsIF8gY2hhcmFjdGVyLCBhcyBpbiBAbWF0aHtAdmFye3NvbWVfdmFyaWFibGV9ICsgMX0uICBTbyBtYWtlCislIF8gYWN0aXZlLCBhbmQgZGlzdGluZ3Vpc2ggYnkgc2VlaW5nIGlmIHRoZSBjdXJyZW50IGZhbWlseSBpcyBcc2xmYW0sCislIHdoaWNoIGlzIHdoYXQgQHZhciB1c2VzLgoreworICBcY2F0Y29kZVx1bmRlckNoYXIgPSBcYWN0aXZlCisgIFxnZGVmXG1hdGh1bmRlcnNjb3JleyUKKyAgICBcY2F0Y29kZVx1bmRlckNoYXI9XGFjdGl2ZQorICAgIFxkZWZfe1xpZm51bVxmYW09XHNsZmFtIFxfXGVsc2Vcc2JcZml9JQorICB9Cit9CislIEFub3RoZXIgY29tcGxpY2F0aW9uOiB3ZSB3YW50IFxcIChhbmQgQFwpIHRvIG91dHB1dCBhIFwgY2hhcmFjdGVyLgorJSBGWUksIHBsYWluLnRleCB1c2VzIFxcIGFzIGEgdGVtcG9yYXJ5IGNvbnRyb2wgc2VxdWVuY2UgKHdoeT8pLCBidXQKKyUgdGhpcyBpcyBub3QgYWR2ZXJ0aXNlZCBhbmQgd2UgZG9uJ3QgY2FyZS4gIFRleGluZm8gZG9lcyBub3QKKyUgb3RoZXJ3aXNlIGRlZmluZSBAXC4KKyUKKyUgVGhlIFxtYXRoY2hhciBpcyBjbGFzcz0wPW9yZGluYXJ5LCBmYW1pbHk9Nz10dGZhbSwgcG9zaXRpb249NUM9XC4KK1xkZWZcbWF0aGJhY2tzbGFzaHtcaWZudW1cZmFtPVx0dGZhbSBcbWF0aGNoYXIiMDc1QyBcZWxzZVxiYWNrc2xhc2ggXGZpfQorJQorXGRlZlxtYXRoeyUKKyAgXHRleAorICBcbWF0aHVuZGVyc2NvcmUKKyAgXGxldFxcID0gXG1hdGhiYWNrc2xhc2gKKyAgXG1hdGhhY3RpdmUKKyAgJFxmaW5pc2htYXRoCit9CitcZGVmXGZpbmlzaG1hdGgjMXsjMSRcZW5kZ3JvdXB9ICAlIENsb3NlIHRoZSBncm91cCBvcGVuZWQgYnkgXHRleC4KKworJSBTb21lIGFjdGl2ZSBjaGFyYWN0ZXJzIChzdWNoIGFzIDwpIGFyZSBzcGFjZWQgZGlmZmVyZW50bHkgaW4gbWF0aC4KKyUgV2UgaGF2ZSB0byByZXNldCB0aGVpciBkZWZpbml0aW9ucyBpbiBjYXNlIHRoZSBAbWF0aCB3YXMgYW4gYXJndW1lbnQKKyUgdG8gYSBjb21tYW5kIHdoaWNoIHNldHMgdGhlIGNhdGNvZGVzIChzdWNoIGFzIEBpdGVtIG9yIEBzZWN0aW9uKS4KKyUKK3sKKyAgXGNhdGNvZGVgXiA9IFxhY3RpdmUKKyAgXGNhdGNvZGVgPCA9IFxhY3RpdmUKKyAgXGNhdGNvZGVgPiA9IFxhY3RpdmUKKyAgXGNhdGNvZGVgKyA9IFxhY3RpdmUKKyAgXGdkZWZcbWF0aGFjdGl2ZXslCisgICAgXGxldF4gPSBccHRleGhhdAorICAgIFxsZXQ8ID0gXHB0ZXhsZXNzCisgICAgXGxldD4gPSBccHRleGd0cgorICAgIFxsZXQrID0gXHB0ZXhwbHVzCisgIH0KK30KKworJSBAYnVsbGV0IGFuZCBAbWludXMgbmVlZCB0aGUgc2FtZSB0cmVhdG1lbnQgYXMgQG1hdGgsIGp1c3QgYWJvdmUuCitcZGVmXGJ1bGxldHskXHB0ZXhidWxsZXQkfQorXGRlZlxtaW51c3skLSR9CisKKyUgQGRvdHN7fSBvdXRwdXRzIGFuIGVsbGlwc2lzIHVzaW5nIHRoZSBjdXJyZW50IGZvbnQuCislIFdlIGRvIC41ZW0gcGVyIHBlcmlvZCBzbyB0aGF0IGl0IGhhcyB0aGUgc2FtZSBzcGFjaW5nIGluIGEgdHlwZXdyaXRlcgorJSBmb250IGFzIHRocmVlIGFjdHVhbCBwZXJpb2QgY2hhcmFjdGVycy4KKyUKK1xkZWZcZG90c3slCisgIFxsZWF2ZXZtb2RlCisgIFxoYm94IHRvIDEuNWVteyUKKyAgICBcaHNraXAgMHB0IHBsdXMgMC4yNWZpbAorICAgIC5caGZpbC5caGZpbC4lCisgICAgXGhza2lwIDBwdCBwbHVzIDAuNWZpbAorICB9JQorfQorCislIEBlbmRkb3Rze30gaXMgYW4gZW5kLW9mLXNlbnRlbmNlIGVsbGlwc2lzLgorJQorXGRlZlxlbmRkb3RzeyUKKyAgXGRvdHMKKyAgXHNwYWNlZmFjdG9yPTMwMDAKK30KKworJSBAY29tbWF7fSBpcyBzbyBjb21tYXMgY2FuIGJlIGluc2VydGVkIGludG8gdGV4dCB3aXRob3V0IG1lc3NpbmcgdXAKKyUgVGV4aW5mbydzIHBhcnNpbmcuCislCitcbGV0XGNvbW1hID0gLAorCislIEByZWZpbGwgaXMgYSBuby1vcC4KK1xsZXRccmVmaWxsPVxyZWxheAorCislIElmIHdvcmtpbmcgb24gYSBsYXJnZSBkb2N1bWVudCBpbiBjaGFwdGVycywgaXQgaXMgY29udmVuaWVudCB0bworJSBiZSBhYmxlIHRvIGRpc2FibGUgaW5kZXhpbmcsIGNyb3NzLXJlZmVyZW5jaW5nLCBhbmQgY29udGVudHMsIGZvciB0ZXN0IHJ1bnMuCislIFRoaXMgaXMgZG9uZSB3aXRoIEBub3ZhbGlkYXRlIChiZWZvcmUgQHNldGZpbGVuYW1lKS4KKyUKK1xuZXdpZlxpZmxpbmtzIFxsaW5rc3RydWUgJSBieSBkZWZhdWx0IHdlIHdhbnQgdGhlIGF1eCBmaWxlcy4KK1xsZXRcbm92YWxpZGF0ZSA9IFxsaW5rc2ZhbHNlCisKKyUgQHNldGZpbGVuYW1lIGlzIGRvbmUgYXQgdGhlIGJlZ2lubmluZyBvZiBldmVyeSB0ZXhpbmZvIGZpbGUuCislIFNvIG9wZW4gaGVyZSB0aGUgZmlsZXMgd2UgbmVlZCB0byBoYXZlIG9wZW4gd2hpbGUgcmVhZGluZyB0aGUgaW5wdXQuCislIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gbWFrZSBhIC5mbXQgZmlsZSBmb3IgdGV4aW5mby4KK1xkZWZcc2V0ZmlsZW5hbWV7JQorICAgXGZpeGJhY2tzbGFzaCAgJSBUdXJuIG9mZiBoYWNrIHRvIHN3YWxsb3cgYFxpbnB1dCB0ZXhpbmZvJy4KKyAgIFxpZmxpbmtzCisgICAgIFx0cnlhdXhmaWxlCisgICAgICUgT3BlbiB0aGUgbmV3IGF1eCBmaWxlLiAgVGVYIHdpbGwgY2xvc2UgaXQgYXV0b21hdGljYWxseSBhdCBleGl0LgorICAgICBcaW1tZWRpYXRlXG9wZW5vdXRcYXV4ZmlsZT1cam9ibmFtZS5hdXgKKyAgIFxmaSAlIFxvcGVuaW5kaWNlcyBuZWVkcyB0byBkbyBzb21lIHdvcmsgaW4gYW55IGNhc2UuCisgICBcb3BlbmluZGljZXMKKyAgIFxsZXRcc2V0ZmlsZW5hbWU9XGNvbW1lbnQgJSBJZ25vcmUgZXh0cmEgQHNldGZpbGVuYW1lIGNtZHMuCisgICAlCisgICAlIElmIHRleGluZm8uY25mIGlzIHByZXNlbnQgb24gdGhlIHN5c3RlbSwgcmVhZCBpdC4KKyAgICUgVXNlZnVsIGZvciBzaXRlLXdpZGUgQGFmb3VycGFwZXIsIGV0Yy4KKyAgIFxvcGVuaW4gMSB0ZXhpbmZvLmNuZgorICAgXGlmZW9mIDEgXGVsc2UgXGlucHV0IHRleGluZm8uY25mIFxmaQorICAgXGNsb3NlaW4gMQorICAgJQorICAgXGNvbW1lbnQgJSBJZ25vcmUgdGhlIGFjdHVhbCBmaWxlbmFtZS4KK30KKworJSBDYWxsZWQgZnJvbSBcc2V0ZmlsZW5hbWUuCislCitcZGVmXG9wZW5pbmRpY2VzeyUKKyAgXG5ld2luZGV4e2NwfSUKKyAgXG5ld2NvZGVpbmRleHtmbn0lCisgIFxuZXdjb2RlaW5kZXh7dnJ9JQorICBcbmV3Y29kZWluZGV4e3RwfSUKKyAgXG5ld2NvZGVpbmRleHtreX0lCisgIFxuZXdjb2RlaW5kZXh7cGd9JQorfQorCislIEBieWUuCitcb3V0ZXJcZGVmXGJ5ZXtccGFnZWFsaWdubWFjcm9cdHJhY2luZ3N0YXRzPTFccHRleGVuZH0KKworCitcbWVzc2FnZXtwZGYsfQorJSBhZG9iZSBgcG9ydGFibGUnIGRvY3VtZW50IGZvcm1hdAorXG5ld2NvdW50XHRlbXBudW0KK1xuZXdjb3VudFxsbmtjb3VudAorXG5ld3Rva3NcZmlsZW5hbWUKK1xuZXdjb3VudFxmaWxlbmFtZWxlbmd0aAorXG5ld2NvdW50XHBnbgorXG5ld3Rva3NcdG9rc0EKK1xuZXd0b2tzXHRva3NCCitcbmV3dG9rc1x0b2tzQworXG5ld3Rva3NcdG9rc0QKK1xuZXdib3hcYm94QQorXG5ld2NvdW50XGNvdW50QQorXG5ld2lmXGlmcGRmCitcbmV3aWZcaWZwZGZtYWtlcGFnZWRlc3QKKworJSB3aGVuIHBkZnRleCBpcyBydW4gaW4gZHZpIG1vZGUsIFxwZGZvdXRwdXQgaXMgZGVmaW5lZCAoc28gXHBkZm91dHB1dD0xCislIGNhbiBiZSBzZXQpLiAgU28gd2UgdGVzdCBmb3IgXHJlbGF4IGFuZCAwIGFzIHdlbGwgYXMgXHVuZGVmaW5lZCwKKyUgYm9ycm93ZWQgZnJvbSBpZnBkZi5zdHkuCitcaWZ4XHBkZm91dHB1dFx1bmRlZmluZWQKK1xlbHNlCisgIFxpZnhccGRmb3V0cHV0XHJlbGF4CisgIFxlbHNlCisgICAgXGlmY2FzZVxwZGZvdXRwdXQKKyAgICBcZWxzZQorICAgICAgXHBkZnRydWUKKyAgICBcZmkKKyAgXGZpCitcZmkKKyUKK1xpZnBkZgorICBcaW5wdXQgcGRmY29sb3IKKyAgXHBkZmNhdGFsb2d7L1BhZ2VNb2RlIC9Vc2VPdXRsaW5lc30lCisgIFxkZWZcZG9wZGZpbWFnZSMxIzIjM3slCisgICAgXGRlZlxpbWFnZXdpZHRoeyMyfSUKKyAgICBcZGVmXGltYWdlaGVpZ2h0eyMzfSUKKyAgICAlIHdpdGhvdXQgXGltbWVkaWF0ZSwgcGRmdGV4IHNlZyBmYXVsdHMgd2hlbiB0aGUgc2FtZSBpbWFnZSBpcworICAgICUgaW5jbHVkZWQgdHdpY2UuICAoVmVyc2lvbiAzLjE0MTU5LXByZS0xLjAtdW5vZmZpY2lhbC0yMDAxMDcwNC4pCisgICAgXGlmbnVtXHBkZnRleHZlcnNpb24gPCAxNAorICAgICAgXGltbWVkaWF0ZVxwZGZpbWFnZQorICAgIFxlbHNlCisgICAgICBcaW1tZWRpYXRlXHBkZnhpbWFnZQorICAgIFxmaQorICAgICAgXGlmeFxlbXB0eVxpbWFnZXdpZHRoXGVsc2Ugd2lkdGggXGltYWdld2lkdGggXGZpCisgICAgICBcaWZ4XGVtcHR5XGltYWdlaGVpZ2h0XGVsc2UgaGVpZ2h0IFxpbWFnZWhlaWdodCBcZmkKKyAgICAgIFxpZm51bVxwZGZ0ZXh2ZXJzaW9uPDEzCisgICAgICAgICAjMS5wZGYlCisgICAgICAgXGVsc2UKKyAgICAgICAgIHsjMS5wZGZ9JQorICAgICAgIFxmaQorICAgIFxpZm51bVxwZGZ0ZXh2ZXJzaW9uIDwgMTQgXGVsc2UKKyAgICAgIFxwZGZyZWZ4aW1hZ2UgXHBkZmxhc3R4aW1hZ2UKKyAgICBcZml9CisgIFxkZWZccGRmbWtkZXN0IzF7eyUKKyAgICAlIFdlIGhhdmUgdG8gc2V0IGR1bW1pZXMgc28gY29tbWFuZHMgc3VjaCBhcyBAY29kZSBpbiBhIHNlY3Rpb24gdGl0bGUKKyAgICAlIGFyZW4ndCBleHBhbmRlZC4KKyAgICBcYXRkdW1taWVzCisgICAgXG5vcm1hbHR1cm5vZmZhY3RpdmUKKyAgICBccGRmZGVzdCBuYW1leyMxfSB4eXolCisgIH19CisgIFxkZWZccGRmbWtwZ24jMXsjMX0KKyAgXGxldFxsaW5rY29sb3IgPSBcQmx1ZSAgJSB3YXMgQ3lhbiwgYnV0IHRoYXQgc2VlbXMgbGlnaHQ/CisgIFxkZWZcZW5kbGlua3tcQmxhY2tccGRmZW5kbGlua30KKyAgJSBBZGRpbmcgb3V0bGluZXMgdG8gUERGOyBtYWNyb3MgZm9yIGNhbGN1bGF0aW5nIHN0cnVjdHVyZSBvZiBvdXRsaW5lcworICAlIGNvbWUgZnJvbSBQZXRyIE9sc2FrCisgIFxkZWZcZXhwbnVtYmVyIzF7XGV4cGFuZGFmdGVyXGlmeFxjc25hbWUjMVxlbmRjc25hbWVccmVsYXggMCUKKyAgICBcZWxzZSBcY3NuYW1lIzFcZW5kY3NuYW1lIFxmaX0KKyAgXGRlZlxhZHZhbmNlbnVtYmVyIzF7XHRlbXBudW09XGV4cG51bWJlcnsjMX1ccmVsYXgKKyAgICBcYWR2YW5jZVx0ZW1wbnVtIGJ5IDEKKyAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUjMVxlbmRjc25hbWV7XHRoZVx0ZW1wbnVtfX0KKyAgJQorICAlICMxIGlzIHRoZSBzZWN0aW9uIHRleHQuICAjMiBpcyB0aGUgcGRmIGV4cHJlc3Npb24gZm9yIHRoZSBudW1iZXIKKyAgJSBvZiBzdWJlbnRyaWVzIChvciBlbXB0eSwgZm9yIHN1YnN1YnNlY3Rpb25zKS4gICMzIGlzIHRoZSBub2RlCisgICUgdGV4dCwgd2hpY2ggbWlnaHQgYmUgZW1wdHkgaWYgdGhpcyB0b2MgZW50cnkgaGFkIG5vCisgICUgY29ycmVzcG9uZGluZyBub2RlLiAgIzQgaXMgdGhlIHBhZ2UgbnVtYmVyLgorICAlCisgIFxkZWZcZG9wZGZvdXRsaW5lIzEjMiMzIzR7JQorICAgICUgR2VuZXJhdGUgYSBsaW5rIHRvIHRoZSBub2RlIHRleHQgaWYgdGhhdCBleGlzdHM7IGVsc2UsIHVzZSB0aGUKKyAgICAlIHBhZ2UgbnVtYmVyLiAgV2UgY291bGQgZ2VuZXJhdGUgYSBkZXN0aW5hdGlvbiBmb3IgdGhlIHNlY3Rpb24KKyAgICAlIHRleHQgaW4gdGhlIGNhc2Ugd2hlcmUgYSBzZWN0aW9uIGhhcyBubyBub2RlLCBidXQgaXQgZG9lc24ndAorICAgICUgc2VlbSB3b3J0aHdoaWxlLCBzaW5jZSBtb3N0IGRvY3VtZW50cyBhcmUgbm9ybWFsbHkgc3RydWN0dXJlZC4KKyAgICBcZGVmXHBkZm91dGxpbmVkZXN0eyMzfSUKKyAgICBcaWZ4XHBkZm91dGxpbmVkZXN0XGVtcHR5IFxkZWZccGRmb3V0bGluZWRlc3R7IzR9XGZpCisgICAgJQorICAgIFxwZGZvdXRsaW5lIGdvdG8gbmFtZXtccGRmbWtwZ257XHBkZm91dGxpbmVkZXN0fX0jMnsjMX0lCisgIH0KKyAgJQorICBcZGVmXHBkZm1ha2VvdXRsaW5lc3slCisgICAgXGJlZ2luZ3JvdXAKKyAgICAgICUgVGhhbmgncyBoYWNrIC8gcHJvcGVyIGJyYWNlcyBpbiBib29rbWFya3MKKyAgICAgIFxlZGVmXG15bGJyYWNle1xpZnRydWUgXHN0cmluZ3tcZWxzZX1cZml9XGxldFx7PVxteWxicmFjZQorICAgICAgXGVkZWZcbXlyYnJhY2V7XGlmZmFsc2V7XGVsc2Vcc3RyaW5nfVxmaX1cbGV0XH09XG15cmJyYWNlCisgICAgICAlCisgICAgICAlIFJlYWQgdG9jIHNpbGVudGx5LCB0byBnZXQgY291bnRzIG9mIHN1YmVudHJpZXMgZm9yIFxwZGZvdXRsaW5lLgorICAgICAgXGRlZlxudW1jaGFwZW50cnkjIzEjIzIjIzMjIzR7JQorCVxkZWZcdGhpc2NoYXBudW17IyMyfSUKKwlcZGVmXHRoaXNzZWNudW17MH0lCisJXGRlZlx0aGlzc3Vic2VjbnVtezB9JQorICAgICAgfSUKKyAgICAgIFxkZWZcbnVtc2VjZW50cnkjIzEjIzIjIzMjIzR7JQorCVxhZHZhbmNlbnVtYmVye2NoYXBcdGhpc2NoYXBudW19JQorCVxkZWZcdGhpc3NlY251bXsjIzJ9JQorCVxkZWZcdGhpc3N1YnNlY251bXswfSUKKyAgICAgIH0lCisgICAgICBcZGVmXG51bXN1YnNlY2VudHJ5IyMxIyMyIyMzIyM0eyUKKwlcYWR2YW5jZW51bWJlcntzZWNcdGhpc3NlY251bX0lCisJXGRlZlx0aGlzc3Vic2VjbnVteyMjMn0lCisgICAgICB9JQorICAgICAgXGRlZlxudW1zdWJzdWJzZWNlbnRyeSMjMSMjMiMjMyMjNHslCisJXGFkdmFuY2VudW1iZXJ7c3Vic2VjXHRoaXNzdWJzZWNudW19JQorICAgICAgfSUKKyAgICAgIFxkZWZcdGhpc2NoYXBudW17MH0lCisgICAgICBcZGVmXHRoaXNzZWNudW17MH0lCisgICAgICBcZGVmXHRoaXNzdWJzZWNudW17MH0lCisgICAgICAlCisgICAgICAlIHVzZSBcZGVmIHJhdGhlciB0aGFuIFxsZXQgaGVyZSBiZWNhdXNlIHdlIHJlZGVmaW5lIFxjaGFwZW50cnkgZXQKKyAgICAgICUgYWwuIGEgc2Vjb25kIHRpbWUsIGJlbG93LgorICAgICAgXGRlZlxhcHBlbnRyeXtcbnVtY2hhcGVudHJ5fSUKKyAgICAgIFxkZWZcYXBwc2VjZW50cnl7XG51bXNlY2VudHJ5fSUKKyAgICAgIFxkZWZcYXBwc3Vic2VjZW50cnl7XG51bXN1YnNlY2VudHJ5fSUKKyAgICAgIFxkZWZcYXBwc3Vic3Vic2VjZW50cnl7XG51bXN1YnN1YnNlY2VudHJ5fSUKKyAgICAgIFxkZWZcdW5uY2hhcGVudHJ5e1xudW1jaGFwZW50cnl9JQorICAgICAgXGRlZlx1bm5zZWNlbnRyeXtcbnVtc2VjZW50cnl9JQorICAgICAgXGRlZlx1bm5zdWJzZWNlbnRyeXtcbnVtc3Vic2VjZW50cnl9JQorICAgICAgXGRlZlx1bm5zdWJzdWJzZWNlbnRyeXtcbnVtc3Vic3Vic2VjZW50cnl9JQorICAgICAgXGlucHV0IFxqb2JuYW1lLnRvYworICAgICAgJQorICAgICAgJSBSZWFkIHRvYyBzZWNvbmQgdGltZSwgdGhpcyB0aW1lIGFjdHVhbGx5IHByb2R1Y2luZyB0aGUgb3V0bGluZXMuCisgICAgICAlIFRoZSBgLScgbWVhbnMgdGFrZSB0aGUgXGV4cG51bWJlciBhcyB0aGUgYWJzb2x1dGUgbnVtYmVyIG9mCisgICAgICAlIHN1YmVudHJpZXMsIHdoaWNoIHdlIGNhbGN1bGF0ZWQgb24gb3VyIGZpcnN0IHJlYWQgb2YgdGhlIC50b2MgYWJvdmUuCisgICAgICAlCisgICAgICAlIFdlIHVzZSB0aGUgbm9kZSBuYW1lcyBhcyB0aGUgZGVzdGluYXRpb25zLgorICAgICAgXGRlZlxudW1jaGFwZW50cnkjIzEjIzIjIzMjIzR7JQorICAgICAgICBcZG9wZGZvdXRsaW5leyMjMX17Y291bnQtXGV4cG51bWJlcntjaGFwIyMyfX17IyMzfXsjIzR9fSUKKyAgICAgIFxkZWZcbnVtc2VjZW50cnkjIzEjIzIjIzMjIzR7JQorICAgICAgICBcZG9wZGZvdXRsaW5leyMjMX17Y291bnQtXGV4cG51bWJlcntzZWMjIzJ9fXsjIzN9eyMjNH19JQorICAgICAgXGRlZlxudW1zdWJzZWNlbnRyeSMjMSMjMiMjMyMjNHslCisgICAgICAgIFxkb3BkZm91dGxpbmV7IyMxfXtjb3VudC1cZXhwbnVtYmVye3N1YnNlYyMjMn19eyMjM317IyM0fX0lCisgICAgICBcZGVmXG51bXN1YnN1YnNlY2VudHJ5IyMxIyMyIyMzIyM0eyUgY291bnQgaXMgYWx3YXlzIHplcm8KKyAgICAgICAgXGRvcGRmb3V0bGluZXsjIzF9e317IyMzfXsjIzR9fSUKKyAgICAgICUKKyAgICAgICUgUERGIG91dGxpbmVzIGFyZSBkaXNwbGF5ZWQgdXNpbmcgc3lzdGVtIGZvbnRzLCBpbnN0ZWFkIG9mCisgICAgICAlIGRvY3VtZW50IGZvbnRzLiAgVGhlcmVmb3JlIHdlIGNhbm5vdCB1c2Ugc3BlY2lhbCBjaGFyYWN0ZXJzLAorICAgICAgJSBzaW5jZSB0aGUgZW5jb2RpbmcgaXMgdW5rbm93bi4gIEZvciBleGFtcGxlLCB0aGUgZW9nb25layBmcm9tCisgICAgICAlIExhdGluIDIgKDB4ZWEpIGdldHMgdHJhbnNsYXRlZCB0byBhIHwgY2hhcmFjdGVyLiAgSW5mbyBmcm9tCisgICAgICAlIFN0YXN6ZWsgV2F3cnlraWV3aWN6LCAxOSBKYW4gMjAwNCAwNDowOToyNCArMDEwMC4KKyAgICAgICUKKyAgICAgICUgeHggdG8gZG8gdGhpcyByaWdodCwgd2UgaGF2ZSB0byB0cmFuc2xhdGUgOC1iaXQgY2hhcmFjdGVycyB0bworICAgICAgJSB0aGVpciAiYmVzdCIgZXF1aXZhbGVudCwgYmFzZWQgb24gdGhlIEBkb2N1bWVudGVuY29kaW5nLiAgUmlnaHQKKyAgICAgICUgbm93LCBJIGd1ZXNzIHdlJ2xsIGp1c3QgbGV0IHRoZSBwZGYgcmVhZGVyIGhhdmUgaXRzIHdheS4KKyAgICAgIFxpbmRleG5vZm9udHMKKyAgICAgIFx0dXJub2ZmYWN0aXZlCisgICAgICBcaW5wdXQgXGpvYm5hbWUudG9jCisgICAgXGVuZGdyb3VwCisgIH0KKyAgJQorICBcZGVmXG1ha2VsaW5rcyAjMSx7JQorICAgIFxkZWZccGFyYW1zeyMxfVxkZWZcRXtFTkR9JQorICAgIFxpZnhccGFyYW1zXEUKKyAgICAgIFxsZXRcbmV4dG1ha2VsaW5rcz1ccmVsYXgKKyAgICBcZWxzZQorICAgICAgXGxldFxuZXh0bWFrZWxpbmtzPVxtYWtlbGlua3MKKyAgICAgIFxpZm51bVxsbmtjb3VudD4wLFxmaQorICAgICAgXHBpY2tudW17IzF9JQorICAgICAgXHN0YXJ0bGluayBhdHRyey9Cb3JkZXIgWzAgMCAwXX0KKyAgICAgICAgZ290byBuYW1le1xwZGZta3BnbntcdGhlXHBnbn19JQorICAgICAgXGxpbmtjb2xvciAjMSUKKyAgICAgIFxhZHZhbmNlXGxua2NvdW50IGJ5IDElCisgICAgICBcZW5kbGluaworICAgIFxmaQorICAgIFxuZXh0bWFrZWxpbmtzCisgIH0KKyAgXGRlZlxwaWNrbnVtIzF7XGV4cGFuZGFmdGVyXHBuIzF9CisgIFxkZWZccG4jMXslCisgICAgXGRlZlxweyMxfSUKKyAgICBcaWZ4XHBcbGJyYWNlCisgICAgICBcbGV0XG5leHRwbj1ccHBuCisgICAgXGVsc2UKKyAgICAgIFxsZXRcbmV4dHBuPVxwcG5uCisgICAgICBcZGVmXGZpcnN0eyMxfQorICAgIFxmaQorICAgIFxuZXh0cG4KKyAgfQorICBcZGVmXHBwbiMxe1xwZ249IzFcZ29iYmxlfQorICBcZGVmXHBwbm57XHBnbj1cZmlyc3R9CisgIFxkZWZccGRmbWtsbmsjMXtcbG5rY291bnQ9MFxtYWtlbGlua3MgIzEsRU5ELH0KKyAgXGRlZlxza2lwc3BhY2VzIzF7XGRlZlxQUHsjMX1cZGVmXER7fH0lCisgICAgXGlmeFxQUFxEXGxldFxuZXh0c3BccmVsYXgKKyAgICBcZWxzZVxsZXRcbmV4dHNwXHNraXBzcGFjZXMKKyAgICAgIFxpZnhccFxzcGFjZVxlbHNlXGFkZHRva2Vuc3tcZmlsZW5hbWV9e1xQUH0lCisgICAgICAgIFxhZHZhbmNlXGZpbGVuYW1lbGVuZ3RoIGJ5IDEKKyAgICAgIFxmaQorICAgIFxmaQorICAgIFxuZXh0c3B9CisgIFxkZWZcZ2V0ZmlsZW5hbWUjMXtcZmlsZW5hbWVsZW5ndGg9MFxleHBhbmRhZnRlclxza2lwc3BhY2VzIzF8XHJlbGF4fQorICBcaWZudW1ccGRmdGV4dmVyc2lvbiA8IDE0CisgICAgXGxldCBcc3RhcnRsaW5rIFxwZGZhbm5vdGxpbmsKKyAgXGVsc2UKKyAgICBcbGV0IFxzdGFydGxpbmsgXHBkZnN0YXJ0bGluaworICBcZmkKKyAgXGRlZlxwZGZ1cmwjMXslCisgICAgXGJlZ2luZ3JvdXAKKyAgICAgIFxub3JtYWx0dXJub2ZmYWN0aXZlXGRlZlxAe0B9JQorICAgICAgXG1ha2V2YWx1ZWV4cGFuZGFibGUKKyAgICAgIFxsZWF2ZXZtb2RlXFJlZAorICAgICAgXHN0YXJ0bGluayBhdHRyey9Cb3JkZXIgWzAgMCAwXX0lCisgICAgICAgIHVzZXJ7L1N1YnR5cGUgL0xpbmsgL0EgPDwgL1MgL1VSSSAvVVJJICgjMSkgPj59JQorICAgIFxlbmRncm91cH0KKyAgXGRlZlxwZGZnZXR0b2tzIzEue1xzZXRib3hcYm94QT1caGJveHtcdG9rc0E9eyMxLn1cdG9rc0I9e31cbWFrZXRva3N9fQorICBcZGVmXGFkZHRva2VucyMxIzJ7XGVkZWZcYWRkdG9rc3tcbm9leHBhbmQjMT17XHRoZSMxIzJ9fVxhZGR0b2tzfQorICBcZGVmXGFkbiMxe1xhZGR0b2tlbnN7XHRva3NDfXsjMX1cZ2xvYmFsXGNvdW50QT0xXGxldFxuZXh0PVxtYWtldG9rc30KKyAgXGRlZlxwb3B0b2tzIzEjMnxFTkRUT0tTfHtcbGV0XGZpcnN0PSMxXHRva3NEPXsjMX1cdG9rc0E9eyMyfX0KKyAgXGRlZlxtYWtldG9rc3slCisgICAgXGV4cGFuZGFmdGVyXHBvcHRva3NcdGhlXHRva3NBfEVORFRPS1N8XHJlbGF4CisgICAgXGlmeFxmaXJzdDBcYWRuMAorICAgIFxlbHNlXGlmeFxmaXJzdDFcYWRuMSBcZWxzZVxpZnhcZmlyc3QyXGFkbjIgXGVsc2VcaWZ4XGZpcnN0M1xhZG4zCisgICAgXGVsc2VcaWZ4XGZpcnN0NFxhZG40IFxlbHNlXGlmeFxmaXJzdDVcYWRuNSBcZWxzZVxpZnhcZmlyc3Q2XGFkbjYKKyAgICBcZWxzZVxpZnhcZmlyc3Q3XGFkbjcgXGVsc2VcaWZ4XGZpcnN0OFxhZG44IFxlbHNlXGlmeFxmaXJzdDlcYWRuOQorICAgIFxlbHNlCisgICAgICBcaWZudW0wPVxjb3VudEFcZWxzZVxtYWtlbGlua1xmaQorICAgICAgXGlmeFxmaXJzdC5cbGV0XG5leHQ9XGRvbmVcZWxzZQorICAgICAgICBcbGV0XG5leHQ9XG1ha2V0b2tzCisgICAgICAgIFxhZGR0b2tlbnN7XHRva3NCfXtcdGhlXHRva3NEfQorICAgICAgICBcaWZ4XGZpcnN0LFxhZGR0b2tlbnN7XHRva3NCfXtcc3BhY2V9XGZpCisgICAgICBcZmkKKyAgICBcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmkKKyAgICBcbmV4dH0KKyAgXGRlZlxtYWtlbGlua3tcYWRkdG9rZW5ze1x0b2tzQn0lCisgICAge1xub2V4cGFuZFxwZGZsaW5re1x0aGVcdG9rc0N9fVx0b2tzQz17fVxnbG9iYWxcY291bnRBPTB9CisgIFxkZWZccGRmbGluayMxeyUKKyAgICBcc3RhcnRsaW5rIGF0dHJ7L0JvcmRlciBbMCAwIDBdfSBnb3RvIG5hbWV7XHBkZm1rcGdueyMxfX0KKyAgICBcbGlua2NvbG9yICMxXGVuZGxpbmt9CisgIFxkZWZcZG9uZXtcZWRlZlxzdHtcZ2xvYmFsXG5vZXhwYW5kXHRva3NBPXtcdGhlXHRva3NCfX1cc3R9CitcZWxzZQorICBcbGV0XHBkZm1rZGVzdCA9IFxnb2JibGUKKyAgXGxldFxwZGZ1cmwgPSBcZ29iYmxlCisgIFxsZXRcZW5kbGluayA9IFxyZWxheAorICBcbGV0XGxpbmtjb2xvciA9IFxyZWxheAorICBcbGV0XHBkZm1ha2VvdXRsaW5lcyA9IFxyZWxheAorXGZpICAlIFxpZnhccGRmb3V0cHV0CisKKworXG1lc3NhZ2V7Zm9udHMsfQorCislIENoYW5nZSB0aGUgY3VycmVudCBmb250IHN0eWxlIHRvICMxLCByZW1lbWJlcmluZyBpdCBpbiBcY3VyZm9udHN0eWxlLgorJSBGb3Igbm93LCB3ZSBkbyBub3QgYWNjdW11bGF0ZSBmb250IHN0eWxlczogQGJ7QGl7Zm9vfX0gcHJpbnRzIGZvbyBpbgorJSBpdGFsaWNzLCBub3QgYm9sZCBpdGFsaWNzLgorJQorXGRlZlxzZXRmb250c3R5bGUjMXslCisgIFxkZWZcY3VyZm9udHN0eWxleyMxfSUgbm90IGFzIGEgY29udHJvbCBzZXF1ZW5jZSwgYmVjYXVzZSB3ZSBhcmUgXGVkZWYnZC4KKyAgXGNzbmFtZSB0ZW4jMVxlbmRjc25hbWUgICUgY2hhbmdlIHRoZSBjdXJyZW50IGZvbnQKK30KKworJSBTZWxlY3QgIzEgZm9udHMgd2l0aCB0aGUgY3VycmVudCBzdHlsZS4KKyUKK1xkZWZcc2VsZWN0Zm9udHMjMXtcY3NuYW1lICMxZm9udHNcZW5kY3NuYW1lIFxjc25hbWVcY3VyZm9udHN0eWxlXGVuZGNzbmFtZX0KKworXGRlZlxybXtcZmFtPTAgXHNldGZvbnRzdHlsZXtybX19CitcZGVmXGl0e1xmYW09XGl0ZmFtIFxzZXRmb250c3R5bGV7aXR9fQorXGRlZlxzbHtcZmFtPVxzbGZhbSBcc2V0Zm9udHN0eWxle3NsfX0KK1xkZWZcYmZ7XGZhbT1cYmZmYW0gXHNldGZvbnRzdHlsZXtiZn19XGRlZlxiZnN0eWxlbmFtZXtiZn0KK1xkZWZcdHR7XGZhbT1cdHRmYW0gXHNldGZvbnRzdHlsZXt0dH19CisKKyUgVGV4aW5mbyBzb3J0IG9mIHN1cHBvcnRzIHRoZSBzYW5zIHNlcmlmIGZvbnQgc3R5bGUsIHdoaWNoIHBsYWluIFRlWCBkb2VzIG5vdC4KKyUgU28gd2Ugc2V0IHVwIGEgXHNmLgorXG5ld2ZhbVxzZmZhbQorXGRlZlxzZntcZmFtPVxzZmZhbSBcc2V0Zm9udHN0eWxle3NmfX0KK1xsZXRcbGkgPSBcc2YgJSBTb21ldGltZXMgd2UgY2FsbCBpdCBcbGksIG5vdCBcc2YuCisKKyUgV2UgZG9uJ3QgbmVlZCBtYXRoIGZvciB0aGlzIGZvbnQgc3R5bGUuCitcZGVmXHR0c2x7XHNldGZvbnRzdHlsZXt0dHNsfX0KKworJSBEZWZhdWx0IGxlYWRpbmcuCitcbmV3ZGltZW5cdGV4dGxlYWRpbmcgIFx0ZXh0bGVhZGluZyA9IDEzLjJwdAorCislIFNldCB0aGUgYmFzZWxpbmVza2lwIHRvICMxLCBhbmQgdGhlIGxpbmVza2lwIGFuZCBzdHJ1dCBzaXplCislIGNvcnJlc3BvbmRpbmdseS4gIFRoZXJlIGlzIG5vIGRlZXAgbWVhbmluZyBiZWhpbmQgdGhlc2UgbWFnaWMgbnVtYmVycworJSB1c2VkIGFzIGZhY3RvcnM7IHRoZXkganVzdCBtYXRjaCAoY2xvc2VseSBlbm91Z2gpIHdoYXQgS251dGggZGVmaW5lZC4KKyUKK1xkZWZcbGluZXNraXBmYWN0b3J7LjA4MzMzfQorXGRlZlxzdHJ1dGhlaWdodHBlcmNlbnR7LjcwODMzfQorXGRlZlxzdHJ1dGRlcHRocGVyY2VudCB7LjI5MTY3fQorJQorXGRlZlxzZXRsZWFkaW5nIzF7JQorICBcbm9ybWFsYmFzZWxpbmVza2lwID0gIzFccmVsYXgKKyAgXG5vcm1hbGxpbmVza2lwID0gXGxpbmVza2lwZmFjdG9yXG5vcm1hbGJhc2VsaW5lc2tpcAorICBcbm9ybWFsYmFzZWxpbmVzCisgIFxzZXRib3hcc3RydXRib3ggPVxoYm94eyUKKyAgICBcdnJ1bGUgd2lkdGgwcHQgaGVpZ2h0XHN0cnV0aGVpZ2h0cGVyY2VudFxiYXNlbGluZXNraXAKKyAgICAgICAgICAgICAgICAgICAgZGVwdGggXHN0cnV0ZGVwdGhwZXJjZW50IFxiYXNlbGluZXNraXAKKyAgfSUKK30KKworJSBTZXQgdGhlIGZvbnQgbWFjcm8gIzEgdG8gdGhlIGZvbnQgbmFtZWQgIzIsIGFkZGluZyBvbiB0aGUKKyUgc3BlY2lmaWVkIGZvbnQgcHJlZml4IChub3JtYWxseSBgY20nKS4KKyUgIzMgaXMgdGhlIGZvbnQncyBkZXNpZ24gc2l6ZSwgIzQgaXMgYSBzY2FsZSBmYWN0b3IKK1xkZWZcc2V0Zm9udCMxIzIjMyM0e1xmb250IzE9XGZvbnRwcmVmaXgjMiMzIHNjYWxlZCAjNH0KKworJSBVc2UgY20gYXMgdGhlIGRlZmF1bHQgZm9udCBwcmVmaXguCislIFRvIHNwZWNpZnkgdGhlIGZvbnQgcHJlZml4LCB5b3UgbXVzdCBkZWZpbmUgXGZvbnRwcmVmaXgKKyUgYmVmb3JlIHlvdSByZWFkIGluIHRleGluZm8udGV4LgorXGlmeFxmb250cHJlZml4XHVuZGVmaW5lZAorXGRlZlxmb250cHJlZml4e2NtfQorXGZpCislIFN1cHBvcnQgZm9udCBmYW1pbGllcyB0aGF0IGRvbid0IHVzZSB0aGUgc2FtZSBuYW1pbmcgc2NoZW1lIGFzIENNLgorXGRlZlxybXNoYXBle3J9CitcZGVmXHJtYnNoYXBle2J4fSAgICAgICAgICAgICAgICV3aGVyZSB0aGUgbm9ybWFsIGZhY2UgaXMgYm9sZAorXGRlZlxiZnNoYXBle2J9CitcZGVmXGJ4c2hhcGV7Ynh9CitcZGVmXHR0c2hhcGV7dHR9CitcZGVmXHR0YnNoYXBle3R0fQorXGRlZlx0dHNsc2hhcGV7c2x0dH0KK1xkZWZcaXRzaGFwZXt0aX0KK1xkZWZcaXRic2hhcGV7Ynh0aX0KK1xkZWZcc2xzaGFwZXtzbH0KK1xkZWZcc2xic2hhcGV7YnhzbH0KK1xkZWZcc2ZzaGFwZXtzc30KK1xkZWZcc2Zic2hhcGV7c3N9CitcZGVmXHNjc2hhcGV7Y3NjfQorXGRlZlxzY2JzaGFwZXtjc2N9CisKKyUgVGV4dCBmb250cyAoMTEuMnB0LCBtYWdzdGVwMSkuCitcZGVmXHRleHRub21pbmFsc2l6ZXsxMXB0fQorXGVkZWZcbWFpbm1hZ3N0ZXB7XG1hZ3N0ZXBoYWxmfQorXHNldGZvbnRcdGV4dHJtXHJtc2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KK1xzZXRmb250XHRleHR0dFx0dHNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Citcc2V0Zm9udFx0ZXh0YmZcYmZzaGFwZXsxMH17XG1haW5tYWdzdGVwfQorXHNldGZvbnRcdGV4dGl0XGl0c2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KK1xzZXRmb250XHRleHRzbFxzbHNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Citcc2V0Zm9udFx0ZXh0c2Zcc2ZzaGFwZXsxMH17XG1haW5tYWdzdGVwfQorXHNldGZvbnRcdGV4dHNjXHNjc2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KK1xzZXRmb250XHRleHR0dHNsXHR0c2xzaGFwZXsxMH17XG1haW5tYWdzdGVwfQorXGZvbnRcdGV4dGk9Y21taTEwIHNjYWxlZCBcbWFpbm1hZ3N0ZXAKK1xmb250XHRleHRzeT1jbXN5MTAgc2NhbGVkIFxtYWlubWFnc3RlcAorCislIEEgZmV3IGZvbnRzIGZvciBAZGVmdW4gbmFtZXMgYW5kIGFyZ3MuCitcc2V0Zm9udFxkZWZiZlxiZnNoYXBlezEwfXtcbWFnc3RlcDF9Citcc2V0Zm9udFxkZWZ0dFx0dHNoYXBlezEwfXtcbWFnc3RlcDF9Citcc2V0Zm9udFxkZWZ0dHNsXHR0c2xzaGFwZXsxMH17XG1hZ3N0ZXAxfQorXGRlZlxkZntcbGV0XHRlbnR0PVxkZWZ0dCBcbGV0XHRlbmJmID0gXGRlZmJmIFxsZXRcdGVudHRzbD1cZGVmdHRzbCBcYmZ9CisKKyUgRm9udHMgZm9yIGluZGljZXMsIGZvb3Rub3Rlcywgc21hbGwgZXhhbXBsZXMgKDlwdCkuCitcZGVmXHNtYWxsbm9taW5hbHNpemV7OXB0fQorXHNldGZvbnRcc21hbGxybVxybXNoYXBlezl9ezEwMDB9Citcc2V0Zm9udFxzbWFsbHR0XHR0c2hhcGV7OX17MTAwMH0KK1xzZXRmb250XHNtYWxsYmZcYmZzaGFwZXsxMH17OTAwfQorXHNldGZvbnRcc21hbGxpdFxpdHNoYXBlezl9ezEwMDB9Citcc2V0Zm9udFxzbWFsbHNsXHNsc2hhcGV7OX17MTAwMH0KK1xzZXRmb250XHNtYWxsc2Zcc2ZzaGFwZXs5fXsxMDAwfQorXHNldGZvbnRcc21hbGxzY1xzY3NoYXBlezEwfXs5MDB9Citcc2V0Zm9udFxzbWFsbHR0c2xcdHRzbHNoYXBlezEwfXs5MDB9CitcZm9udFxzbWFsbGk9Y21taTkKK1xmb250XHNtYWxsc3k9Y21zeTkKKworJSBGb250cyBmb3Igc21hbGwgZXhhbXBsZXMgKDhwdCkuCitcZGVmXHNtYWxsZXJub21pbmFsc2l6ZXs4cHR9Citcc2V0Zm9udFxzbWFsbGVycm1ccm1zaGFwZXs4fXsxMDAwfQorXHNldGZvbnRcc21hbGxlcnR0XHR0c2hhcGV7OH17MTAwMH0KK1xzZXRmb250XHNtYWxsZXJiZlxiZnNoYXBlezEwfXs4MDB9Citcc2V0Zm9udFxzbWFsbGVyaXRcaXRzaGFwZXs4fXsxMDAwfQorXHNldGZvbnRcc21hbGxlcnNsXHNsc2hhcGV7OH17MTAwMH0KK1xzZXRmb250XHNtYWxsZXJzZlxzZnNoYXBlezh9ezEwMDB9Citcc2V0Zm9udFxzbWFsbGVyc2Ncc2NzaGFwZXsxMH17ODAwfQorXHNldGZvbnRcc21hbGxlcnR0c2xcdHRzbHNoYXBlezEwfXs4MDB9CitcZm9udFxzbWFsbGVyaT1jbW1pOAorXGZvbnRcc21hbGxlcnN5PWNtc3k4CisKKyUgRm9udHMgZm9yIHRpdGxlIHBhZ2UgKDIwLjRwdCk6CitcZGVmXHRpdGxlbm9taW5hbHNpemV7MjBwdH0KK1xzZXRmb250XHRpdGxlcm1ccm1ic2hhcGV7MTJ9e1xtYWdzdGVwM30KK1xzZXRmb250XHRpdGxlaXRcaXRic2hhcGV7MTB9e1xtYWdzdGVwNH0KK1xzZXRmb250XHRpdGxlc2xcc2xic2hhcGV7MTB9e1xtYWdzdGVwNH0KK1xzZXRmb250XHRpdGxldHRcdHRic2hhcGV7MTJ9e1xtYWdzdGVwM30KK1xzZXRmb250XHRpdGxldHRzbFx0dHNsc2hhcGV7MTB9e1xtYWdzdGVwNH0KK1xzZXRmb250XHRpdGxlc2Zcc2Zic2hhcGV7MTd9e1xtYWdzdGVwMX0KK1xsZXRcdGl0bGViZj1cdGl0bGVybQorXHNldGZvbnRcdGl0bGVzY1xzY2JzaGFwZXsxMH17XG1hZ3N0ZXA0fQorXGZvbnRcdGl0bGVpPWNtbWkxMiBzY2FsZWQgXG1hZ3N0ZXAzCitcZm9udFx0aXRsZXN5PWNtc3kxMCBzY2FsZWQgXG1hZ3N0ZXA0CitcZGVmXGF1dGhvcnJte1xzZWNybX0KK1xkZWZcYXV0aG9ydHR7XHNlY3R0fQorCislIENoYXB0ZXIgKGFuZCB1bm51bWJlcmVkKSBmb250cyAoMTcuMjhwdCkuCitcZGVmXGNoYXBub21pbmFsc2l6ZXsxN3B0fQorXHNldGZvbnRcY2hhcHJtXHJtYnNoYXBlezEyfXtcbWFnc3RlcDJ9Citcc2V0Zm9udFxjaGFwaXRcaXRic2hhcGV7MTB9e1xtYWdzdGVwM30KK1xzZXRmb250XGNoYXBzbFxzbGJzaGFwZXsxMH17XG1hZ3N0ZXAzfQorXHNldGZvbnRcY2hhcHR0XHR0YnNoYXBlezEyfXtcbWFnc3RlcDJ9Citcc2V0Zm9udFxjaGFwdHRzbFx0dHNsc2hhcGV7MTB9e1xtYWdzdGVwM30KK1xzZXRmb250XGNoYXBzZlxzZmJzaGFwZXsxN317MTAwMH0KK1xsZXRcY2hhcGJmPVxjaGFwcm0KK1xzZXRmb250XGNoYXBzY1xzY2JzaGFwZXsxMH17XG1hZ3N0ZXAzfQorXGZvbnRcY2hhcGk9Y21taTEyIHNjYWxlZCBcbWFnc3RlcDIKK1xmb250XGNoYXBzeT1jbXN5MTAgc2NhbGVkIFxtYWdzdGVwMworCislIFNlY3Rpb24gZm9udHMgKDE0LjRwdCkuCitcZGVmXHNlY25vbWluYWxzaXplezE0cHR9Citcc2V0Zm9udFxzZWNybVxybWJzaGFwZXsxMn17XG1hZ3N0ZXAxfQorXHNldGZvbnRcc2VjaXRcaXRic2hhcGV7MTB9e1xtYWdzdGVwMn0KK1xzZXRmb250XHNlY3NsXHNsYnNoYXBlezEwfXtcbWFnc3RlcDJ9Citcc2V0Zm9udFxzZWN0dFx0dGJzaGFwZXsxMn17XG1hZ3N0ZXAxfQorXHNldGZvbnRcc2VjdHRzbFx0dHNsc2hhcGV7MTB9e1xtYWdzdGVwMn0KK1xzZXRmb250XHNlY3NmXHNmYnNoYXBlezEyfXtcbWFnc3RlcDF9CitcbGV0XHNlY2JmXHNlY3JtCitcc2V0Zm9udFxzZWNzY1xzY2JzaGFwZXsxMH17XG1hZ3N0ZXAyfQorXGZvbnRcc2VjaT1jbW1pMTIgc2NhbGVkIFxtYWdzdGVwMQorXGZvbnRcc2Vjc3k9Y21zeTEwIHNjYWxlZCBcbWFnc3RlcDIKKworJSBTdWJzZWN0aW9uIGZvbnRzICgxMy4xNXB0KS4KK1xkZWZcc3NlY25vbWluYWxzaXplezEzcHR9Citcc2V0Zm9udFxzc2Vjcm1ccm1ic2hhcGV7MTJ9e1xtYWdzdGVwaGFsZn0KK1xzZXRmb250XHNzZWNpdFxpdGJzaGFwZXsxMH17MTMxNX0KK1xzZXRmb250XHNzZWNzbFxzbGJzaGFwZXsxMH17MTMxNX0KK1xzZXRmb250XHNzZWN0dFx0dGJzaGFwZXsxMn17XG1hZ3N0ZXBoYWxmfQorXHNldGZvbnRcc3NlY3R0c2xcdHRzbHNoYXBlezEwfXsxMzE1fQorXHNldGZvbnRcc3NlY3NmXHNmYnNoYXBlezEyfXtcbWFnc3RlcGhhbGZ9CitcbGV0XHNzZWNiZlxzc2Vjcm0KK1xzZXRmb250XHNzZWNzY1xzY2JzaGFwZXsxMH17MTMxNX0KK1xmb250XHNzZWNpPWNtbWkxMiBzY2FsZWQgXG1hZ3N0ZXBoYWxmCitcZm9udFxzc2Vjc3k9Y21zeTEwIHNjYWxlZCAxMzE1CisKKyUgUmVkdWNlZCBmb250cyBmb3IgQGFjcm8gaW4gdGV4dCAoMTBwdCkuCitcZGVmXHJlZHVjZWRub21pbmFsc2l6ZXsxMHB0fQorXHNldGZvbnRccmVkdWNlZHJtXHJtc2hhcGV7MTB9ezEwMDB9Citcc2V0Zm9udFxyZWR1Y2VkdHRcdHRzaGFwZXsxMH17MTAwMH0KK1xzZXRmb250XHJlZHVjZWRiZlxiZnNoYXBlezEwfXsxMDAwfQorXHNldGZvbnRccmVkdWNlZGl0XGl0c2hhcGV7MTB9ezEwMDB9Citcc2V0Zm9udFxyZWR1Y2Vkc2xcc2xzaGFwZXsxMH17MTAwMH0KK1xzZXRmb250XHJlZHVjZWRzZlxzZnNoYXBlezEwfXsxMDAwfQorXHNldGZvbnRccmVkdWNlZHNjXHNjc2hhcGV7MTB9ezEwMDB9Citcc2V0Zm9udFxyZWR1Y2VkdHRzbFx0dHNsc2hhcGV7MTB9ezEwMDB9CitcZm9udFxyZWR1Y2VkaT1jbW1pMTAKK1xmb250XHJlZHVjZWRzeT1jbXN5MTAKKworJSBJbiBvcmRlciBmb3IgdGhlIGZvbnQgY2hhbmdlcyB0byBhZmZlY3QgbW9zdCBtYXRoIHN5bWJvbHMgYW5kIGxldHRlcnMsCislIHdlIGhhdmUgdG8gZGVmaW5lIHRoZSBcdGV4dGZvbnQgb2YgdGhlIHN0YW5kYXJkIGZhbWlsaWVzLiAgU2luY2UKKyUgdGV4aW5mbyBkb2Vzbid0IGFsbG93IGZvciBwcm9kdWNpbmcgc3Vic2NyaXB0cyBhbmQgc3VwZXJzY3JpcHRzIGV4Y2VwdAorJSBpbiB0aGUgbWFpbiB0ZXh0LCB3ZSBkb24ndCBib3RoZXIgdG8gcmVzZXQgXHNjcmlwdGZvbnQgYW5kCislIFxzY3JpcHRzY3JpcHRmb250ICh3aGljaCB3b3VsZCBhbHNvIHJlcXVpcmUgbG9hZGluZyBhIGxvdCBtb3JlIGZvbnRzKS4KKyUKK1xkZWZccmVzZXRtYXRoZm9udHN7JQorICBcdGV4dGZvbnQwPVx0ZW5ybSBcdGV4dGZvbnQxPVx0ZW5pIFx0ZXh0Zm9udDI9XHRlbnN5CisgIFx0ZXh0Zm9udFxpdGZhbT1cdGVuaXQgXHRleHRmb250XHNsZmFtPVx0ZW5zbCBcdGV4dGZvbnRcYmZmYW09XHRlbmJmCisgIFx0ZXh0Zm9udFx0dGZhbT1cdGVudHQgXHRleHRmb250XHNmZmFtPVx0ZW5zZgorfQorCislIFRoZSBmb250LWNoYW5naW5nIGNvbW1hbmRzIHJlZGVmaW5lIHRoZSBtZWFuaW5ncyBvZiBcdGVuU1RZTEUsIGluc3RlYWQKKyUgb2YganVzdCBcU1RZTEUuICBXZSBkbyB0aGlzIGJlY2F1c2UgXFNUWUxFIG5lZWRzIHRvIGFsc28gc2V0IHRoZQorJSBjdXJyZW50IFxmYW0gZm9yIG1hdGggbW9kZS4gIE91ciBcU1RZTEUgKGUuZy4sIFxybSkgY29tbWFuZHMgaGFyZHdpcmUKKyUgXHRlblNUWUxFIHRvIHNldCB0aGUgY3VycmVudCBmb250LgorJQorJSBFYWNoIGZvbnQtY2hhbmdpbmcgY29tbWFuZCBhbHNvIHNldHMgdGhlIG5hbWVzIFxsc2l6ZSAob25lIHNpemUgbG93ZXIpCislIGFuZCBcbGxsc2l6ZSAodGhyZWUgc2l6ZXMgbG93ZXIpLiAgVGhlc2UgcmVsYXRpdmUgY29tbWFuZHMgYXJlIHVzZWQgaW4KKyUgdGhlIExhVGVYIGxvZ28gYW5kIGFjcm9ueW1zLgorJQorJSBUaGlzIGFsbCBuZWVkcyBnZW5lcmFsaXppbmcsIGJhZGx5LgorJQorXGRlZlx0ZXh0Zm9udHN7JQorICBcbGV0XHRlbnJtPVx0ZXh0cm0gXGxldFx0ZW5pdD1cdGV4dGl0IFxsZXRcdGVuc2w9XHRleHRzbAorICBcbGV0XHRlbmJmPVx0ZXh0YmYgXGxldFx0ZW50dD1cdGV4dHR0IFxsZXRcc21hbGxjYXBzPVx0ZXh0c2MKKyAgXGxldFx0ZW5zZj1cdGV4dHNmIFxsZXRcdGVuaT1cdGV4dGkgXGxldFx0ZW5zeT1cdGV4dHN5CisgIFxsZXRcdGVudHRzbD1cdGV4dHR0c2wKKyAgXGRlZlxjdXJmb250c2l6ZXt0ZXh0fSUKKyAgXGRlZlxsc2l6ZXtyZWR1Y2VkfVxkZWZcbGxsc2l6ZXtzbWFsbGVyfSUKKyAgXHJlc2V0bWF0aGZvbnRzIFxzZXRsZWFkaW5ne1x0ZXh0bGVhZGluZ319CitcZGVmXHRpdGxlZm9udHN7JQorICBcbGV0XHRlbnJtPVx0aXRsZXJtIFxsZXRcdGVuaXQ9XHRpdGxlaXQgXGxldFx0ZW5zbD1cdGl0bGVzbAorICBcbGV0XHRlbmJmPVx0aXRsZWJmIFxsZXRcdGVudHQ9XHRpdGxldHQgXGxldFxzbWFsbGNhcHM9XHRpdGxlc2MKKyAgXGxldFx0ZW5zZj1cdGl0bGVzZiBcbGV0XHRlbmk9XHRpdGxlaSBcbGV0XHRlbnN5PVx0aXRsZXN5CisgIFxsZXRcdGVudHRzbD1cdGl0bGV0dHNsCisgIFxkZWZcY3VyZm9udHNpemV7dGl0bGV9JQorICBcZGVmXGxzaXple2NoYXB9XGRlZlxsbGxzaXple3N1YnNlY30lCisgIFxyZXNldG1hdGhmb250cyBcc2V0bGVhZGluZ3syNXB0fX0KK1xkZWZcdGl0bGVmb250IzF7e1x0aXRsZWZvbnRzXHJtICMxfX0KK1xkZWZcY2hhcGZvbnRzeyUKKyAgXGxldFx0ZW5ybT1cY2hhcHJtIFxsZXRcdGVuaXQ9XGNoYXBpdCBcbGV0XHRlbnNsPVxjaGFwc2wKKyAgXGxldFx0ZW5iZj1cY2hhcGJmIFxsZXRcdGVudHQ9XGNoYXB0dCBcbGV0XHNtYWxsY2Fwcz1cY2hhcHNjCisgIFxsZXRcdGVuc2Y9XGNoYXBzZiBcbGV0XHRlbmk9XGNoYXBpIFxsZXRcdGVuc3k9XGNoYXBzeQorICBcbGV0XHRlbnR0c2w9XGNoYXB0dHNsCisgIFxkZWZcY3VyZm9udHNpemV7Y2hhcH0lCisgIFxkZWZcbHNpemV7c2VjfVxkZWZcbGxsc2l6ZXt0ZXh0fSUKKyAgXHJlc2V0bWF0aGZvbnRzIFxzZXRsZWFkaW5nezE5cHR9fQorXGRlZlxzZWNmb250c3slCisgIFxsZXRcdGVucm09XHNlY3JtIFxsZXRcdGVuaXQ9XHNlY2l0IFxsZXRcdGVuc2w9XHNlY3NsCisgIFxsZXRcdGVuYmY9XHNlY2JmIFxsZXRcdGVudHQ9XHNlY3R0IFxsZXRcc21hbGxjYXBzPVxzZWNzYworICBcbGV0XHRlbnNmPVxzZWNzZiBcbGV0XHRlbmk9XHNlY2kgXGxldFx0ZW5zeT1cc2Vjc3kKKyAgXGxldFx0ZW50dHNsPVxzZWN0dHNsCisgIFxkZWZcY3VyZm9udHNpemV7c2VjfSUKKyAgXGRlZlxsc2l6ZXtzdWJzZWN9XGRlZlxsbGxzaXple3JlZHVjZWR9JQorICBccmVzZXRtYXRoZm9udHMgXHNldGxlYWRpbmd7MTZwdH19CitcZGVmXHN1YnNlY2ZvbnRzeyUKKyAgXGxldFx0ZW5ybT1cc3NlY3JtIFxsZXRcdGVuaXQ9XHNzZWNpdCBcbGV0XHRlbnNsPVxzc2Vjc2wKKyAgXGxldFx0ZW5iZj1cc3NlY2JmIFxsZXRcdGVudHQ9XHNzZWN0dCBcbGV0XHNtYWxsY2Fwcz1cc3NlY3NjCisgIFxsZXRcdGVuc2Y9XHNzZWNzZiBcbGV0XHRlbmk9XHNzZWNpIFxsZXRcdGVuc3k9XHNzZWNzeQorICBcbGV0XHRlbnR0c2w9XHNzZWN0dHNsCisgIFxkZWZcY3VyZm9udHNpemV7c3NlY30lCisgIFxkZWZcbHNpemV7dGV4dH1cZGVmXGxsbHNpemV7c21hbGx9JQorICBccmVzZXRtYXRoZm9udHMgXHNldGxlYWRpbmd7MTVwdH19CitcbGV0XHN1YnN1YnNlY2ZvbnRzID0gXHN1YnNlY2ZvbnRzCitcZGVmXHJlZHVjZWRmb250c3slCisgIFxsZXRcdGVucm09XHJlZHVjZWRybSBcbGV0XHRlbml0PVxyZWR1Y2VkaXQgXGxldFx0ZW5zbD1ccmVkdWNlZHNsCisgIFxsZXRcdGVuYmY9XHJlZHVjZWRiZiBcbGV0XHRlbnR0PVxyZWR1Y2VkdHQgXGxldFxyZWR1Y2VkY2Fwcz1ccmVkdWNlZHNjCisgIFxsZXRcdGVuc2Y9XHJlZHVjZWRzZiBcbGV0XHRlbmk9XHJlZHVjZWRpIFxsZXRcdGVuc3k9XHJlZHVjZWRzeQorICBcbGV0XHRlbnR0c2w9XHJlZHVjZWR0dHNsCisgIFxkZWZcY3VyZm9udHNpemV7cmVkdWNlZH0lCisgIFxkZWZcbHNpemV7c21hbGx9XGRlZlxsbGxzaXple3NtYWxsZXJ9JQorICBccmVzZXRtYXRoZm9udHMgXHNldGxlYWRpbmd7MTAuNXB0fX0KK1xkZWZcc21hbGxmb250c3slCisgIFxsZXRcdGVucm09XHNtYWxscm0gXGxldFx0ZW5pdD1cc21hbGxpdCBcbGV0XHRlbnNsPVxzbWFsbHNsCisgIFxsZXRcdGVuYmY9XHNtYWxsYmYgXGxldFx0ZW50dD1cc21hbGx0dCBcbGV0XHNtYWxsY2Fwcz1cc21hbGxzYworICBcbGV0XHRlbnNmPVxzbWFsbHNmIFxsZXRcdGVuaT1cc21hbGxpIFxsZXRcdGVuc3k9XHNtYWxsc3kKKyAgXGxldFx0ZW50dHNsPVxzbWFsbHR0c2wKKyAgXGRlZlxjdXJmb250c2l6ZXtzbWFsbH0lCisgIFxkZWZcbHNpemV7c21hbGxlcn1cZGVmXGxsbHNpemV7c21hbGxlcn0lCisgIFxyZXNldG1hdGhmb250cyBcc2V0bGVhZGluZ3sxMC41cHR9fQorXGRlZlxzbWFsbGVyZm9udHN7JQorICBcbGV0XHRlbnJtPVxzbWFsbGVycm0gXGxldFx0ZW5pdD1cc21hbGxlcml0IFxsZXRcdGVuc2w9XHNtYWxsZXJzbAorICBcbGV0XHRlbmJmPVxzbWFsbGVyYmYgXGxldFx0ZW50dD1cc21hbGxlcnR0IFxsZXRcc21hbGxjYXBzPVxzbWFsbGVyc2MKKyAgXGxldFx0ZW5zZj1cc21hbGxlcnNmIFxsZXRcdGVuaT1cc21hbGxlcmkgXGxldFx0ZW5zeT1cc21hbGxlcnN5CisgIFxsZXRcdGVudHRzbD1cc21hbGxlcnR0c2wKKyAgXGRlZlxjdXJmb250c2l6ZXtzbWFsbGVyfSUKKyAgXGRlZlxsc2l6ZXtzbWFsbGVyfVxkZWZcbGxsc2l6ZXtzbWFsbGVyfSUKKyAgXHJlc2V0bWF0aGZvbnRzIFxzZXRsZWFkaW5nezkuNXB0fX0KKworJSBTZXQgdGhlIGZvbnRzIHRvIHVzZSB3aXRoIHRoZSBAc21hbGwuLi4gZW52aXJvbm1lbnRzLgorXGxldFxzbWFsbGV4YW1wbGVmb250cyA9IFxzbWFsbGZvbnRzCisKKyUgQWJvdXQgXHNtYWxsZXhhbXBsZWZvbnRzLiAgSWYgd2UgdXNlIFxzbWFsbGZvbnRzICg5cHQpLCBAc21hbGxleGFtcGxlCislIGNhbiBmaXQgdGhpcyBtYW55IGNoYXJhY3RlcnM6CislICAgOC41eDExPTg2ICAgc21hbGxib29rPTcyICBhND05MCAgYTU9NjkKKyUgSWYgd2UgdXNlIFxzY3JpcHRmb250cyAoOHB0KSwgdGhlbiB3ZSBjYW4gZml0IHRoaXMgbWFueSBjaGFyYWN0ZXJzOgorJSAgIDguNXgxMT05MCsgIHNtYWxsYm9vaz04MCAgYTQ9OTArICBhNT03NworJSBGb3IgbWUsIHN1YmplY3RpdmVseSwgdGhlIGZldyBleHRyYSBjaGFyYWN0ZXJzIHRoYXQgZml0IGFyZW4ndCB3b3J0aAorJSB0aGUgYWRkaXRpb25hbCBzbWFsbG5lc3Mgb2YgOHB0LiAgU28gSSdtIG1ha2luZyB0aGUgZGVmYXVsdCA5cHQuCislCislIEJ5IHRoZSB3YXksIGZvciBjb21wYXJpc29uLCBoZXJlJ3Mgd2hhdCBmaXRzIHdpdGggQGV4YW1wbGUgKDEwcHQpOgorJSAgIDguNXgxMT03MSAgc21hbGxib29rPTYwICBhND03NSAgYTU9NTgKKyUKKyUgSSB3aXNoIHRoZSBVU0EgdXNlZCBBNCBwYXBlci4KKyUgLS1rYXJsLCAyNGphbjAzLgorCisKKyUgU2V0IHVwIHRoZSBkZWZhdWx0IGZvbnRzLCBzbyB3ZSBjYW4gdXNlIHRoZW0gZm9yIGNyZWF0aW5nIGJveGVzLgorJQorXHRleHRmb250cyBccm0KKworJSBEZWZpbmUgdGhlc2Ugc28gdGhleSBjYW4gYmUgZWFzaWx5IGNoYW5nZWQgZm9yIG90aGVyIGZvbnRzLgorXGRlZlxhbmdsZWxlZnR7JFxsYW5nbGUkfQorXGRlZlxhbmdsZXJpZ2h0eyRccmFuZ2xlJH0KKworJSBDb3VudCBkZXB0aCBpbiBmb250LWNoYW5nZXMsIGZvciBlcnJvciBjaGVja3MKK1xuZXdjb3VudFxmb250ZGVwdGggXGZvbnRkZXB0aD0wCisKKyUgRm9udHMgZm9yIHNob3J0IHRhYmxlIG9mIGNvbnRlbnRzLgorXHNldGZvbnRcc2hvcnRjb250cm1ccm1zaGFwZXsxMn17MTAwMH0KK1xzZXRmb250XHNob3J0Y29udGJmXGJmc2hhcGV7MTB9e1xtYWdzdGVwMX0gICUgbm8gY21iMTIKK1xzZXRmb250XHNob3J0Y29udHNsXHNsc2hhcGV7MTJ9ezEwMDB9Citcc2V0Zm9udFxzaG9ydGNvbnR0dFx0dHNoYXBlezEyfXsxMDAwfQorCislJSBBZGQgc2NyaWJlLWxpa2UgZm9udCBlbnZpcm9ubWVudHMsIHBsdXMgQGwgZm9yIGlubGluZSBsaXNwICh1c3VhbGx5IHNhbnMKKyUlIHNlcmlmKSBhbmQgQGlpIGZvciBUZVggaXRhbGljCisKKyUgXHNtYXJ0aXRhbGlje0FSR30gb3V0cHV0cyBhcmcgaW4gaXRhbGljcywgZm9sbG93ZWQgYnkgYW4gaXRhbGljIGNvcnJlY3Rpb24KKyUgdW5sZXNzIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyIGlzIHN1Y2ggYXMgbm90IHRvIG5lZWQgb25lLgorXGRlZlxzbWFydGl0YWxpY3h7XGlmeFxuZXh0LFxlbHNlXGlmeFxuZXh0LVxlbHNlXGlmeFxuZXh0LlxlbHNlCisgICAgICAgICAgICAgICAgICAgIFxwdGV4c2xhc2hcZmlcZmlcZml9CitcZGVmXHNtYXJ0c2xhbnRlZCMxe3tcaWZ1c2luZ3R0XHR0c2xcc2wgIzF9XGZ1dHVyZWxldFxuZXh0XHNtYXJ0aXRhbGljeH0KK1xkZWZcc21hcnRpdGFsaWMjMXt7XGlmdXNpbmd0dFx0dHNsXGl0ICMxfVxmdXR1cmVsZXRcbmV4dFxzbWFydGl0YWxpY3h9CisKKyUgbGlrZSBcc21hcnRzbGFudGVkIGV4Y2VwdCB1bmNvbmRpdGlvbmFsbHkgdXNlcyBcdHRzbC4KKyUgQHZhciBpcyBzZXQgdG8gdGhpcyBmb3IgZGVmdW4gYXJndW1lbnRzLgorXGRlZlx0dHNsYW50ZWQjMXt7XHR0c2wgIzF9XGZ1dHVyZWxldFxuZXh0XHNtYXJ0aXRhbGljeH0KKworJSBsaWtlIFxzbWFydHNsYW50ZWQgZXhjZXB0IHVuY29uZGl0aW9uYWxseSB1c2UgXHNsLiAgV2UgbmV2ZXIgd2FudAorJSB0dHNsIGZvciBib29rIHRpdGxlcywgZG8gd2U/CitcZGVmXGNpdGUjMXt7XHNsICMxfVxmdXR1cmVsZXRcbmV4dFxzbWFydGl0YWxpY3h9CisKK1xsZXRcaT1cc21hcnRpdGFsaWMKK1xsZXRcc2xhbnRlZD1cc21hcnRzbGFudGVkCitcbGV0XHZhcj1cc21hcnRzbGFudGVkCitcbGV0XGRmbj1cc21hcnRzbGFudGVkCitcbGV0XGVtcGg9XHNtYXJ0aXRhbGljCisKKyUgQGIsIGV4cGxpY2l0IGJvbGQuCitcZGVmXGIjMXt7XGJmICMxfX0KK1xsZXRcc3Ryb25nPVxiCisKKyUgQHNhbnNzZXJpZiwgZXhwbGljaXQgc2Fucy4KK1xkZWZcc2Fuc3NlcmlmIzF7e1xzZiAjMX19CisKKyUgV2UgY2FuJ3QganVzdCB1c2UgXGV4aHlwaGVucGVuYWx0eSwgYmVjYXVzZSB0aGF0IG9ubHkgaGFzIGVmZmVjdCBhdAorJSB0aGUgZW5kIG9mIGEgcGFyYWdyYXBoLiAgUmVzdG9yZSBub3JtYWwgaHlwaGVuYXRpb24gYXQgdGhlIGVuZCBvZiB0aGUKKyUgZ3JvdXAgd2l0aGluIHdoaWNoIFxub2h5cGhlbmF0aW9uIGlzIHByZXN1bWFibHkgY2FsbGVkLgorJQorXGRlZlxub2h5cGhlbmF0aW9ue1xoeXBoZW5jaGFyXGZvbnQgPSAtMSAgXGFmdGVyZ3JvdXBccmVzdG9yZWh5cGhlbmF0aW9ufQorXGRlZlxyZXN0b3JlaHlwaGVuYXRpb257XGh5cGhlbmNoYXJcZm9udCA9IGAtIH0KKworJSBTZXQgc2Zjb2RlIHRvIG5vcm1hbCBmb3IgdGhlIGNoYXJzIHRoYXQgdXN1YWxseSBoYXZlIGFub3RoZXIgdmFsdWUuCislIENhbid0IHVzZSBwbGFpbidzIFxmcmVuY2hzcGFjaW5nIGJlY2F1c2UgaXQgdXNlcyB0aGUgYFx4IG5vdGF0aW9uLCBhbmQKKyUgc29tZXRpbWVzIFx4IGhhcyBhbiBhY3RpdmUgZGVmaW5pdGlvbiB0aGF0IG1lc3NlcyB0aGluZ3MgdXAuCislCitcY2F0Y29kZWBAPTExCisgIFxkZWZcZnJlbmNoc3BhY2luZ3slCisgICAgXHNmY29kZVxkb3RDaGFyICA9XEBtIFxzZmNvZGVccXVlc3RDaGFyPVxAbSBcc2Zjb2RlXGV4Y2xhbUNoYXI9XEBtCisgICAgXHNmY29kZVxjb2xvbkNoYXI9XEBtIFxzZmNvZGVcc2VtaUNoYXIgPVxAbSBcc2Zjb2RlXGNvbW1hQ2hhciA9XEBtCisgIH0KK1xjYXRjb2RlYEA9XG90aGVyCisKK1xkZWZcdCMxeyUKKyAge1x0dCBccmF3YmFja3NsYXNoIFxmcmVuY2hzcGFjaW5nICMxfSUKKyAgXG51bGwKK30KK1xkZWZcc2FtcCMxe2BcdGNsb3NleyMxfSdcbnVsbH0KK1xzZXRmb250XGtleXJtXHJtc2hhcGV7OH17MTAwMH0KK1xmb250XGtleXN5PWNtc3k5CitcZGVmXGtleSMxe3tca2V5cm1cdGV4dGZvbnQyPVxrZXlzeSBcbGVhdmV2bW9kZVxoYm94eyUKKyAgXHJhaXNlMC40cHRcaGJveHtcYW5nbGVsZWZ0fVxrZXJuLS4wOGVtXHZ0b3B7JQorICAgIFx2Ym94e1xocnVsZVxrZXJuLTAuNHB0CisgICAgIFxoYm94e1xyYWlzZTAuNHB0XGhib3h7XHZwaGFudG9te1xhbmdsZWxlZnR9fSMxfX0lCisgICAgXGtlcm4tMC40cHRcaHJ1bGV9JQorICBca2Vybi0uMDZlbVxyYWlzZTAuNHB0XGhib3h7XGFuZ2xlcmlnaHR9fX19CislIFRoZSBvbGQgZGVmaW5pdGlvbiwgd2l0aCBubyBsb3plbmdlOgorJVxkZWZca2V5ICMxe3tcdHRzbCBcbm9oeXBoZW5hdGlvbiBcdXBwZXJjYXNleyMxfX1cbnVsbH0KK1xkZWZcY3RybCAjMXt7XHR0IFxyYXdiYWNrc2xhc2ggXGhhdH0jMX0KKworJSBAZmlsZSwgQG9wdGlvbiBhcmUgdGhlIHNhbWUgYXMgQHNhbXAuCitcbGV0XGZpbGU9XHNhbXAKK1xsZXRcb3B0aW9uPVxzYW1wCisKKyUgQGNvZGUgaXMgYSBtb2RpZmljYXRpb24gb2YgQHQsCislIHdoaWNoIG1ha2VzIHNwYWNlcyB0aGUgc2FtZSBzaXplIGFzIG5vcm1hbCBpbiB0aGUgc3Vycm91bmRpbmcgdGV4dC4KK1xkZWZcdGNsb3NlIzF7JQorICB7JQorICAgICUgQ2hhbmdlIG5vcm1hbCBpbnRlcndvcmQgc3BhY2UgdG8gYmUgc2FtZSBhcyBmb3IgdGhlIGN1cnJlbnQgZm9udC4KKyAgICBcc3BhY2Vza2lwID0gXGZvbnRkaW1lbjJcZm9udAorICAgICUKKyAgICAlIFN3aXRjaCB0byB0eXBld3JpdGVyLgorICAgIFx0dAorICAgICUKKyAgICAlIEJ1dCBgXCAnIHByb2R1Y2VzIHRoZSBsYXJnZSB0eXBld3JpdGVyIGludGVyd29yZCBzcGFjZS4KKyAgICBcZGVmXCB7e1xzcGFjZXNraXAgPSAwcHR7fSB9fSUKKyAgICAlCisgICAgJSBUdXJuIG9mZiBoeXBoZW5hdGlvbi4KKyAgICBcbm9oeXBoZW5hdGlvbgorICAgICUKKyAgICBccmF3YmFja3NsYXNoCisgICAgXGZyZW5jaHNwYWNpbmcKKyAgICAjMSUKKyAgfSUKKyAgXG51bGwKK30KKworJSBXZSAqbXVzdCogdHVybiBvbiBoeXBoZW5hdGlvbiBhdCBgLScgYW5kIGBfJyBpbiBAY29kZS4KKyUgT3RoZXJ3aXNlLCBpdCBpcyB0b28gaGFyZCB0byBhdm9pZCBvdmVyZnVsbCBoYm94ZXMKKyUgaW4gdGhlIEVtYWNzIG1hbnVhbCwgdGhlIExpYnJhcnkgbWFudWFsLCBldGMuCisKKyUgVW5mb3J0dW5hdGVseSwgVGVYIHVzZXMgb25lIHBhcmFtZXRlciAoXGh5cGhlbmNoYXIpIHRvIGNvbnRyb2wKKyUgYm90aCBoeXBoZW5hdGlvbiBhdCAtIGFuZCBoeXBoZW5hdGlvbiB3aXRoaW4gd29yZHMuCislIFdlIG11c3QgdGhlcmVmb3JlIHR1cm4gdGhlbSBib3RoIG9mZiAoXHRjbG9zZSBkb2VzIHRoYXQpCislIGFuZCBhcnJhbmdlIGV4cGxpY2l0bHkgdG8gaHlwaGVuYXRlIGF0IGEgZGFzaC4KKyUgIC0tIHJtcy4KK3sKKyAgXGNhdGNvZGVgXC09XGFjdGl2ZQorICBcY2F0Y29kZWBcXz1cYWN0aXZlCisgICUKKyAgXGdsb2JhbFxkZWZcY29kZXtcYmVnaW5ncm91cAorICAgIFxjYXRjb2RlYFwtPVxhY3RpdmUgXGxldC1cY29kZWRhc2gKKyAgICBcY2F0Y29kZWBcXz1cYWN0aXZlIFxsZXRfXGNvZGV1bmRlcgorICAgIFxjb2RleAorICB9Cit9CisKK1xkZWZccmVhbGRhc2h7LX0KK1xkZWZcY29kZWRhc2h7LVxkaXNjcmV0aW9uYXJ5e317fXt9fQorXGRlZlxjb2RldW5kZXJ7JQorICAlIHRoaXMgaXMgYWxsIHNvIEBtYXRoe0Bjb2Rle3Zhcl9uYW1lfSsxfSBjYW4gd29yay4gIEluIG1hdGggbW9kZSwgXworICAlIGlzICJhY3RpdmUiIChtYXRoY29kZSI4MDAwKSBhbmQgXG5vcm1hbHVuZGVyc2NvcmUgKG9yIFxjaGFyOTUsIGV0Yy4pCisgICUgd2lsbCB0aGVyZWZvcmUgZXhwYW5kIHRoZSBhY3RpdmUgZGVmaW5pdGlvbiBvZiBfLCB3aGljaCBpcyB1cworICAlIChpbnNpZGUgQGNvZGUgdGhhdCBpcyksIHRoZXJlZm9yZSBhbiBlbmRsZXNzIGxvb3AuCisgIFxpZnVzaW5ndHR7XGlmbW1vZGUKKyAgICAgICAgICAgICAgIFxtYXRoY2hhciIwNzVGICUgY2xhc3MgMD1vcmRpbmFyeSwgZmFtaWx5IDc9dHRmYW0sIHBvcyAweDVGPV8uCisgICAgICAgICAgICAgXGVsc2Vcbm9ybWFsdW5kZXJzY29yZSBcZmkKKyAgICAgICAgICAgICBcZGlzY3JldGlvbmFyeXt9e317fX0lCisgICAgICAgICAgICB7XF99JQorfQorXGRlZlxjb2RleCAjMXtcdGNsb3NleyMxfVxlbmRncm91cH0KKworJSBAa2JkIGlzIGxpa2UgQGNvZGUsIGV4Y2VwdCB0aGF0IGlmIHRoZSBhcmd1bWVudCBpcyBqdXN0IG9uZSBAa2V5IGNvbW1hbmQsCislIHRoZW4gQGtiZCBoYXMgbm8gZWZmZWN0LgorCislIEBrYmRpbnB1dHN0eWxlIC0tIGFyZyBpcyBgZGlzdGluY3QnIChAa2JkIHVzZXMgc2xhbnRlZCB0dHkgZm9udCBhbHdheXMpLAorJSAgIGBleGFtcGxlJyAoQGtiZCB1c2VzIHR0c2wgb25seSBpbnNpZGUgb2YgQGV4YW1wbGUgYW5kIGZyaWVuZHMpLAorJSAgIG9yIGBjb2RlJyAoQGtiZCB1c2VzIG5vcm1hbCB0dHkgZm9udCBhbHdheXMpLgorXHBhcnNlYXJnZGVmXGtiZGlucHV0c3R5bGV7JQorICBcZGVmXGFyZ3sjMX0lCisgIFxpZnhcYXJnXHdvcmRkaXN0aW5jdAorICAgIFxnZGVmXGtiZGV4YW1wbGVmb250e1x0dHNsfVxnZGVmXGtiZGZvbnR7XHR0c2x9JQorICBcZWxzZVxpZnhcYXJnXHdvcmRleGFtcGxlCisgICAgXGdkZWZca2JkZXhhbXBsZWZvbnR7XHR0c2x9XGdkZWZca2JkZm9udHtcdHR9JQorICBcZWxzZVxpZnhcYXJnXHdvcmRjb2RlCisgICAgXGdkZWZca2JkZXhhbXBsZWZvbnR7XHR0fVxnZGVmXGtiZGZvbnR7XHR0fSUKKyAgXGVsc2UKKyAgICBcZXJyaGVscCA9IFxFTXNpbXBsZQorICAgIFxlcnJtZXNzYWdle1Vua25vd24gQGtiZGlucHV0c3R5bGUgb3B0aW9uIGBcYXJnJ30lCisgIFxmaVxmaVxmaQorfQorXGRlZlx3b3JkZGlzdGluY3R7ZGlzdGluY3R9CitcZGVmXHdvcmRleGFtcGxle2V4YW1wbGV9CitcZGVmXHdvcmRjb2Rle2NvZGV9CisKKyUgRGVmYXVsdCBpcyBgZGlzdGluY3QuJworXGtiZGlucHV0c3R5bGUgZGlzdGluY3QKKworXGRlZlx4a2V5e1xrZXl9CitcZGVmXGtiZGZvbyMxIzIjM1xwYXJ7XGRlZlxvbmV7IzF9XGRlZlx0aHJlZXsjM31cZGVmXHRocmVleHs/P30lCitcaWZ4XG9uZVx4a2V5XGlmeFx0aHJlZXhcdGhyZWUgXGtleXsjMn0lCitcZWxzZXtcdGNsb3Nle1xrYmRmb250XGxvb2t9fVxmaQorXGVsc2V7XHRjbG9zZXtca2JkZm9udFxsb29rfX1cZml9CisKKyUgRm9yIEBpbmRpY2F0ZXVybCwgQGVudiwgQGNvbW1hbmQgcXVvdGVzIHNlZW0gdW5uZWNlc3NhcnksIHNvIHVzZSBcY29kZS4KK1xsZXRcaW5kaWNhdGV1cmw9XGNvZGUKK1xsZXRcZW52PVxjb2RlCitcbGV0XGNvbW1hbmQ9XGNvZGUKKworJSBAdXJlZiAoYWJicmV2aWF0aW9uIGZvciBgdXJscmVmJykgdGFrZXMgYW4gb3B0aW9uYWwgKGNvbW1hLXNlcGFyYXRlZCkKKyUgc2Vjb25kIGFyZ3VtZW50IHNwZWNpZnlpbmcgdGhlIHRleHQgdG8gZGlzcGxheSBhbmQgYW4gb3B0aW9uYWwgdGhpcmQKKyUgYXJnIGFzIHRleHQgdG8gZGlzcGxheSBpbnN0ZWFkIG9mIChyYXRoZXIgdGhhbiBpbiBhZGRpdGlvbiB0bykgdGhlIHVybAorJSBpdHNlbGYuICBGaXJzdCAobWFuZGF0b3J5KSBhcmcgaXMgdGhlIHVybC4gIFBlcmhhcHMgZXZlbnR1YWxseSBwdXQgaW4KKyUgYSBoeXBlcnRleCBcc3BlY2lhbCBoZXJlLgorJQorXGRlZlx1cmVmIzF7XGRvdXJlZiAjMSwsLFxmaW5pc2h9CitcZGVmXGRvdXJlZiMxLCMyLCMzLCM0XGZpbmlzaHtcYmVnaW5ncm91cAorICBcdW5zZXBzcGFjZXMKKyAgXHBkZnVybHsjMX0lCisgIFxzZXRib3gwID0gXGhib3h7XGlnbm9yZXNwYWNlcyAjM30lCisgIFxpZmRpbVx3ZDAgPiAwcHQKKyAgICBcdW5oYm94MCAlIHRoaXJkIGFyZyBnaXZlbiwgc2hvdyBvbmx5IHRoYXQKKyAgXGVsc2UKKyAgICBcc2V0Ym94MCA9IFxoYm94e1xpZ25vcmVzcGFjZXMgIzJ9JQorICAgIFxpZmRpbVx3ZDAgPiAwcHQKKyAgICAgIFxpZnBkZgorICAgICAgICBcdW5oYm94MCAgICAgICAgICAgICAlIFBERjogMm5kIGFyZyBnaXZlbiwgc2hvdyBvbmx5IGl0CisgICAgICBcZWxzZQorICAgICAgICBcdW5oYm94MFwgKFxjb2RleyMxfSklIERWSTogMm5kIGFyZyBnaXZlbiwgc2hvdyBib3RoIGl0IGFuZCB1cmwKKyAgICAgIFxmaQorICAgIFxlbHNlCisgICAgICBcY29kZXsjMX0lIG9ubHkgdXJsIGdpdmVuLCBzbyBzaG93IGl0CisgICAgXGZpCisgIFxmaQorICBcZW5kbGluaworXGVuZGdyb3VwfQorCislIEB1cmwgc3lub255bSBmb3IgQHVyZWYsIHNpbmNlIHRoYXQncyBob3cgZXZlcnlvbmUgdXNlcyBpdC4KKyUKK1xsZXRcdXJsPVx1cmVmCisKKyUgcm1zIGRvZXMgbm90IGxpa2UgYW5nbGUgYnJhY2tldHMgLS1rYXJsLCAxN21heTk3LgorJSBTbyBub3cgQGVtYWlsIGlzIGp1c3QgbGlrZSBAdXJlZiwgdW5sZXNzIHdlIGFyZSBwZGYuCislCislXGRlZlxlbWFpbCMxe1xhbmdsZWxlZnR7XHR0ICMxfVxhbmdsZXJpZ2h0fQorXGlmcGRmCisgIFxkZWZcZW1haWwjMXtcZG9lbWFpbCMxLCxcZmluaXNofQorICBcZGVmXGRvZW1haWwjMSwjMiwjM1xmaW5pc2h7XGJlZ2luZ3JvdXAKKyAgICBcdW5zZXBzcGFjZXMKKyAgICBccGRmdXJse21haWx0bzojMX0lCisgICAgXHNldGJveDAgPSBcaGJveHtcaWdub3Jlc3BhY2VzICMyfSUKKyAgICBcaWZkaW1cd2QwPjBwdFx1bmhib3gwXGVsc2VcY29kZXsjMX1cZmkKKyAgICBcZW5kbGluaworICBcZW5kZ3JvdXB9CitcZWxzZQorICBcbGV0XGVtYWlsPVx1cmVmCitcZmkKKworJSBDaGVjayBpZiB3ZSBhcmUgY3VycmVudGx5IHVzaW5nIGEgdHlwZXdyaXRlciBmb250LiAgU2luY2UgYWxsIHRoZQorJSBDb21wdXRlciBNb2Rlcm4gdHlwZXdyaXRlciBmb250cyBoYXZlIHplcm8gaW50ZXJ3b3JkIHN0cmV0Y2ggKGFuZAorJSBzaHJpbmspLCBhbmQgaXQgaXMgcmVhc29uYWJsZSB0byBleHBlY3QgYWxsIHR5cGV3cml0ZXIgZm9udHMgdG8gaGF2ZQorJSB0aGlzIHByb3BlcnR5LCB3ZSBjYW4gY2hlY2sgdGhhdCBmb250IHBhcmFtZXRlci4KKyUKK1xkZWZcaWZtb25vc3BhY2V7XGlmZGltXGZvbnRkaW1lbjNcZm9udD0wcHQgfQorCislIFR5cGVzZXQgYSBkaW1lbnNpb24sIGUuZy4sIGBpbicgb3IgYHB0Jy4gIFRoZSBvbmx5IHJlYXNvbiBmb3IgdGhlCislIGFyZ3VtZW50IGlzIHRvIG1ha2UgdGhlIGlucHV0IGxvb2sgcmlnaHQ6IEBkbW57cHR9IGluc3RlYWQgb2YgQGRtbnt9cHQuCislCitcZGVmXGRtbiMxe1x0aGluc3BhY2UgIzF9CisKK1xkZWZca2JkIzF7XGRlZlxsb29reyMxfVxleHBhbmRhZnRlclxrYmRmb29cbG9vaz8/XHBhcn0KKworJSBAbCB3YXMgbmV2ZXIgZG9jdW1lbnRlZCB0byBtZWFuIGBgc3dpdGNoIHRvIHRoZSBMaXNwIGZvbnQnJywKKyUgYW5kIGl0IGlzIG5vdCB1c2VkIGFzIHN1Y2ggaW4gYW55IG1hbnVhbCBJIGNhbiBmaW5kLiAgV2UgbmVlZCBpdCBmb3IKKyUgUG9saXNoIHN1cHByZXNzZWQtbC4gIC0ta2FybCwgMjJzZXA5Ni4KKyVcZGVmXGwjMXt7XGxpICMxfVxudWxsfQorCislIEV4cGxpY2l0IGZvbnQgY2hhbmdlczogQHIsIEBzYywgdW5kb2N1bWVudGVkIEBpaS4KK1xkZWZcciMxe3tccm0gIzF9fSAgICAgICAgICAgICAgJSByb21hbiBmb250CitcZGVmXHNjIzF7e1xzbWFsbGNhcHMjMX19ICAgICAgICUgc21hbGxjYXBzIGZvbnQKK1xkZWZcaWkjMXt7XGl0ICMxfX0gICAgICAgICAgICAgJSBpdGFsaWMgZm9udAorCislIEBhY3JvbnltIGZvciAiRkJJIiwgIk5BVE8iLCBhbmQgdGhlIGxpa2UuCislIFdlIHByaW50IHRoaXMgb25lIHBvaW50IHNpemUgc21hbGxlciwgc2luY2UgaXQncyBpbnRlbmRlZCBmb3IKKyUgYWxsLXVwcGVyY2FzZS4KKyUgCitcZGVmXGFjcm9ueW0jMXtcZG9hY3JvbnltICMxLCxcZmluaXNofQorXGRlZlxkb2Fjcm9ueW0jMSwjMiwjM1xmaW5pc2h7JQorICB7XHNlbGVjdGZvbnRzXGxzaXplICMxfSUKKyAgXGRlZlx0ZW1weyMyfSUKKyAgXGlmeFx0ZW1wXGVtcHR5IFxlbHNlCisgICAgXHNwYWNlICh7XHVuc2Vwc3BhY2VzIFxpZ25vcmVzcGFjZXMgXHRlbXAgXHVuc2tpcH0pJQorICBcZmkKK30KKworJSBAYWJiciBmb3IgIkNvbXB1dC4gSi4iIGFuZCB0aGUgbGlrZS4KKyUgTm8gZm9udCBjaGFuZ2UsIGJ1dCBkb24ndCBkbyBlbmQtb2Ytc2VudGVuY2Ugc3BhY2luZy4KKyUgCitcZGVmXGFiYnIjMXtcZG9hYmJyICMxLCxcZmluaXNofQorXGRlZlxkb2FiYnIjMSwjMiwjM1xmaW5pc2h7JQorICB7XGZyZW5jaHNwYWNpbmcgIzF9JQorICBcZGVmXHRlbXB7IzJ9JQorICBcaWZ4XHRlbXBcZW1wdHkgXGVsc2UKKyAgICBcc3BhY2UgKHtcdW5zZXBzcGFjZXMgXGlnbm9yZXNwYWNlcyBcdGVtcCBcdW5za2lwfSklCisgIFxmaQorfQorCislIEBwb3VuZHN7fSBpcyBhIHN0ZXJsaW5nIHNpZ24sIHdoaWNoIEtudXRoIHB1dCBpbiB0aGUgQ00gaXRhbGljIGZvbnQuCislCitcZGVmXHBvdW5kc3t7XGl0XCR9fQorCislIEBldXJve30gY29tZXMgZnJvbSBhIHNlcGFyYXRlIGZvbnQsIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBzdHlsZS4KKyUgV2UgdXNlIHRoZSBmcmVlIGZleW0qIGZvbnRzIGZyb20gdGhlIGV1cm9zeW0gcGFja2FnZSBieSBIZW5yaWsKKyUgVGhlaWxpbmcsIHdoaWNoIHN1cHBvcnQgcmVndWxhciwgc2xhbnRlZCwgYm9sZCBhbmQgYm9sZCBzbGFudGVkIChhbmQKKyUgIm91dGxpbmVkIiAoYmxhY2tib2FyZCBib2FyZCwgc29ydCBvZikgdmVyc2lvbnMsIHdoaWNoIHdlIGRvbid0IG5lZWQpLgorJSBJdCBpcyBhdmFpbGFibGUgZnJvbSBodHRwOi8vd3d3LmN0YW4ub3JnL3RleC1hcmNoaXZlL2ZvbnRzL2V1cm9zeW0uCislIAorJSBBbHRob3VnaCBvbmx5IHJlZ3VsYXIgaXMgdGhlIHRydWx5IG9mZmljaWFsIEV1cm8gc3ltYm9sLCB3ZSBpZ25vcmUKKyUgdGhhdC4gIFRoZSBFdXJvIGlzIGRlc2lnbmVkIHRvIGJlIHNsaWdodGx5IHRhbGxlciB0aGFuIHRoZSByZWd1bGFyCislIGZvbnQgaGVpZ2h0LgorJSAKKyUgZmV5bXIgLSByZWd1bGFyCislIGZleW1vIC0gc2xhbnRlZAorJSBmZXliciAtIGJvbGQKKyUgZmV5Ym8gLSBib2xkIHNsYW50ZWQKKyUgCislIFRoZXJlIGlzIG5vIGdvb2QgKGZyZWUpIHR5cGV3cml0ZXIgdmVyc2lvbiwgdG8gbXkga25vd2xlZGdlLgorJSBBIGZleW1yMTAgZXVybyBpcyB+Ny4zcHQgd2lkZSwgd2hpbGUgYSBub3JtYWwgY210dDEwIGNoYXIgaXMgfjUuMjVwdCB3aWRlLgorJSBIbW0uCislIAorJSBBbHNvIGRvZXNuJ3Qgd29yayBpbiBtYXRoLiAgRG8gd2UgbmVlZCB0byBkbyBtYXRoIHdpdGggZXVybyBzeW1ib2xzPworJSBIb3BlIG5vdC4KKyUgCislIAorXGRlZlxldXJve3tcZXVyb2ZvbnQgZX19CitcZGVmXGV1cm9mb250eyUKKyAgJSBXZSBzZXQgdGhlIGZvbnQgYXQgZWFjaCBjb21tYW5kLCByYXRoZXIgdGhhbiBwcmVkZWZpbmluZyBpdCBpbgorICAlIFx0ZXh0Zm9udHMgYW5kIHRoZSBvdGhlciBmb250LXN3aXRjaGluZyBjb21tYW5kcywgc28gdGhhdAorICAlIGluc3RhbGxhdGlvbnMgd2hpY2ggbmV2ZXIgbmVlZCB0aGUgc3ltYm9sZCBkb24ndCBoYXZlIHRvIGhhdmUgdGhlCisgICUgZm9udCBpbnN0YWxsZWQuCisgICUgCisgICUgVGhlcmUgaXMgb25seSBvbmUgZGVzaWduZWQgc2l6ZSAobm9taW5hbCAxMHB0KSwgc28gd2UgYWx3YXlzIHNjYWxlCisgICUgdGhhdCB0byB0aGUgY3VycmVudCBub21pbmFsIHNpemUuCisgICUgCisgICUgQnkgdGhlIHdheSwgc2ltcGx5IHVzaW5nICJhdCAxZW0iIHdvcmtzIGZvciBjbXIxMCBhbmQgdGhlIGxpa2UsIGJ1dAorICAlIGRvZXMgbm90IHdvcmsgZm9yIGNtYngxMCBhbmQgb3RoZXIgZXh0ZW5kZWQvc2hydW5rZW4gZm9udHMuCisgICUgCisgIFxkZWZcZXVyb3NpemV7XGNzbmFtZVxjdXJmb250c2l6ZSBub21pbmFsc2l6ZVxlbmRjc25hbWV9JQorICAlCisgIFxpZnhcY3VyZm9udHN0eWxlXGJmc3R5bGVuYW1lIAorICAgICUgYm9sZDoKKyAgICBcZm9udFx0aGlzZXVyb2ZvbnQgPSBcaWZ1c2luZ2l0e2ZleWJvMTB9e2ZleWJyMTB9IGF0IFxldXJvc2l6ZQorICBcZWxzZSAKKyAgICAlIHJlZ3VsYXI6CisgICAgXGZvbnRcdGhpc2V1cm9mb250ID0gXGlmdXNpbmdpdHtmZXltbzEwfXtmZXltcjEwfSBhdCBcZXVyb3NpemUKKyAgXGZpCisgIFx0aGlzZXVyb2ZvbnQKK30KKworJSBAcmVnaXN0ZXJlZHN5bWJvbCAtIFIgaW4gYSBjaXJjbGUuICBUaGUgZm9udCBmb3IgdGhlIFIgc2hvdWxkIHJlYWxseQorJSBiZSBzbWFsbGVyIHlldCwgYnV0IGxsbHNpemUgaXMgdGhlIGJlc3Qgd2UgY2FuIGRvIGZvciBub3cuCislIEFkYXB0ZWQgZnJvbSB0aGUgcGxhaW4udGV4IGRlZmluaXRpb24gb2YgXGNvcHlyaWdodC4KKyUKK1xkZWZccmVnaXN0ZXJlZHN5bWJvbHslCisgICRee3tcb29hbGlnbntcaGZpbFxyYWlzZS4wN2V4XGhib3h7XHNlbGVjdGZvbnRzXGxsbHNpemUgUn0lCisgICAgICAgICAgICAgICBcaGZpbFxjcmNyXE9yYn19JQorICAgIH0kJQorfQorCislIExhdXJlbnQgU2llYmVubWFubiByZXBvcnRzIFxPcmIgdW5kZWZpbmVkIHdpdGg6CislICBUZXh0dXJlcyAxLjcuNyAocHJlbG9hZGVkIGZvcm1hdD1wbGFpbiA5My4xMC4xNCkgICg2OEspICAxNiBBUFIgMjAwNCAwMjozOAorJSBzbyB3ZSdsbCBkZWZpbmUgaXQgaWYgbmVjZXNzYXJ5LgorJSAKK1xpZnhcT3JiXHVuZGVmaW5lZAorXGRlZlxPcmJ7XG1hdGhoZXhib3gyMER9CitcZmkKKworCitcbWVzc2FnZXtwYWdlIGhlYWRpbmdzLH0KKworXG5ld3NraXBcdGl0bGVwYWdldG9wZ2x1ZSBcdGl0bGVwYWdldG9wZ2x1ZSA9IDEuNWluCitcbmV3c2tpcFx0aXRsZXBhZ2Vib3R0b21nbHVlIFx0aXRsZXBhZ2Vib3R0b21nbHVlID0gMnBjCisKKyUgRmlyc3QgdGhlIHRpdGxlIHBhZ2UuICBNdXN0IGRvIEBzZXR0aXRsZSBiZWZvcmUgQHRpdGxlcGFnZS4KK1xuZXdpZlxpZnNlZW5hdXRob3IKK1xuZXdpZlxpZmZpbmlzaGVkdGl0bGVwYWdlCisKKyUgRG8gYW4gaW1wbGljaXQgQGNvbnRlbnRzIG9yIEBzaG9ydGNvbnRlbnRzIGFmdGVyIEBlbmQgdGl0bGVwYWdlIGlmIHRoZQorJSB1c2VyIHNheXMgQHNldGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2Ugb3IgQHNldHNob3J0Y29udGVudHNhZnRlcnRpdGxlcGFnZS4KKyUKK1xuZXdpZlxpZnNldGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2UKKyBcbGV0XHNldGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2UgPSBcc2V0Y29udGVudHNhZnRlcnRpdGxlcGFnZXRydWUKK1xuZXdpZlxpZnNldHNob3J0Y29udGVudHNhZnRlcnRpdGxlcGFnZQorIFxsZXRcc2V0c2hvcnRjb250ZW50c2FmdGVydGl0bGVwYWdlID0gXHNldHNob3J0Y29udGVudHNhZnRlcnRpdGxlcGFnZXRydWUKKworXHBhcnNlYXJnZGVmXHNob3J0dGl0bGVwYWdle1xiZWdpbmdyb3VwXGhib3h7fVx2c2tpcCAxLjVpbiBcY2hhcHJtIFxjZW50ZXJsaW5leyMxfSUKKyAgICAgICAgXGVuZGdyb3VwXHBhZ2VcaGJveHt9XHBhZ2V9CisKK1xlbnZkZWZcdGl0bGVwYWdleyUKKyAgJSBPcGVuIG9uZSBleHRyYSBncm91cCwgYXMgd2Ugd2FudCB0byBjbG9zZSBpdCBpbiB0aGUgbWlkZGxlIG9mIFxFdGl0bGVwYWdlLgorICBcYmVnaW5ncm91cAorICAgIFxwYXJpbmRlbnQ9MHB0IFx0ZXh0Zm9udHMKKyAgICAlIExlYXZlIHNvbWUgc3BhY2UgYXQgdGhlIHZlcnkgdG9wIG9mIHRoZSBwYWdlLgorICAgIFx2Z2x1ZVx0aXRsZXBhZ2V0b3BnbHVlCisgICAgJSBObyBydWxlIGF0IHBhZ2UgYm90dG9tIHVubGVzcyB3ZSBwcmludCBvbmUgYXQgdGhlIHRvcCB3aXRoIEB0aXRsZS4KKyAgICBcZmluaXNoZWR0aXRsZXBhZ2V0cnVlCisgICAgJQorICAgICUgTW9zdCB0aXRsZSBgYHBhZ2VzJycgYXJlIGFjdHVhbGx5IHR3byBwYWdlcyBsb25nLCB3aXRoIHNwYWNlCisgICAgJSBhdCB0aGUgdG9wIG9mIHRoZSBzZWNvbmQuICBXZSBkb24ndCB3YW50IHRoZSByYWdnZWQgbGVmdCBvbiB0aGUgc2Vjb25kLgorICAgIFxsZXRcb2xkcGFnZSA9IFxwYWdlCisgICAgXGRlZlxwYWdleyUKKyAgICAgIFxpZmZpbmlzaGVkdGl0bGVwYWdlXGVsc2UKKwkgXGZpbmlzaHRpdGxlcGFnZQorICAgICAgXGZpCisgICAgICBcbGV0XHBhZ2UgPSBcb2xkcGFnZQorICAgICAgXHBhZ2UKKyAgICAgIFxudWxsCisgICAgfSUKK30KKworXGRlZlxFdGl0bGVwYWdleyUKKyAgICBcaWZmaW5pc2hlZHRpdGxlcGFnZVxlbHNlCisJXGZpbmlzaHRpdGxlcGFnZQorICAgIFxmaQorICAgICUgSXQgaXMgaW1wb3J0YW50IHRvIGRvIHRoZSBwYWdlIGJyZWFrIGJlZm9yZSBlbmRpbmcgdGhlIGdyb3VwLAorICAgICUgYmVjYXVzZSB0aGUgaGVhZGxpbmUgYW5kIGZvb3RsaW5lIGFyZSBvbmx5IGVtcHR5IGluc2lkZSB0aGUgZ3JvdXAuCisgICAgJSBJZiB3ZSB1c2UgdGhlIG5ldyBkZWZpbml0aW9uIG9mIFxwYWdlLCB3ZSBhbHdheXMgZ2V0IGEgYmxhbmsgcGFnZQorICAgICUgYWZ0ZXIgdGhlIHRpdGxlIHBhZ2UsIHdoaWNoIHdlIGNlcnRhaW5seSBkb24ndCB3YW50LgorICAgIFxvbGRwYWdlCisgIFxlbmRncm91cAorICAlCisgICUgTmVlZCB0aGlzIGJlZm9yZSB0aGUgXC4uLmFmdGVydGl0bGVwYWdlIGNoZWNrcyBzbyB0aGF0IGlmIHRoZXkgYXJlCisgICUgaW4gZWZmZWN0IHRoZSB0b2MgcGFnZXMgd2lsbCBjb21lIG91dCB3aXRoIHBhZ2UgbnVtYmVycy4KKyAgXEhFQURJTkdTb24KKyAgJQorICAlIElmIHRoZXkgd2FudCBzaG9ydCwgdGhleSBjZXJ0YWlubHkgd2FudCBsb25nIHRvby4KKyAgXGlmc2V0c2hvcnRjb250ZW50c2FmdGVydGl0bGVwYWdlCisgICAgXHNob3J0Y29udGVudHMKKyAgICBcY29udGVudHMKKyAgICBcZ2xvYmFsXGxldFxzaG9ydGNvbnRlbnRzID0gXHJlbGF4CisgICAgXGdsb2JhbFxsZXRcY29udGVudHMgPSBccmVsYXgKKyAgXGZpCisgICUKKyAgXGlmc2V0Y29udGVudHNhZnRlcnRpdGxlcGFnZQorICAgIFxjb250ZW50cworICAgIFxnbG9iYWxcbGV0XGNvbnRlbnRzID0gXHJlbGF4CisgICAgXGdsb2JhbFxsZXRcc2hvcnRjb250ZW50cyA9IFxyZWxheAorICBcZmkKK30KKworXGRlZlxmaW5pc2h0aXRsZXBhZ2V7JQorICBcdnNraXA0cHQgXGhydWxlIGhlaWdodCAycHQgd2lkdGggXGhzaXplCisgIFx2c2tpcFx0aXRsZXBhZ2Vib3R0b21nbHVlCisgIFxmaW5pc2hlZHRpdGxlcGFnZXRydWUKK30KKworJSUlIE1hY3JvcyB0byBiZSB1c2VkIHdpdGhpbiBAdGl0bGVwYWdlOgorCitcbGV0XHN1YnRpdGxlcm09XHRlbnJtCitcZGVmXHN1YnRpdGxlZm9udHtcc3VidGl0bGVybSBcbm9ybWFsYmFzZWxpbmVza2lwID0gMTNwdCBcbm9ybWFsYmFzZWxpbmVzfQorCitcZGVmXGF1dGhvcmZvbnR7XGF1dGhvcnJtIFxub3JtYWxiYXNlbGluZXNraXAgPSAxNnB0IFxub3JtYWxiYXNlbGluZXMKKwkJXGxldFx0dD1cYXV0aG9ydHR9CisKK1xwYXJzZWFyZ2RlZlx0aXRsZXslCisgIFxjaGVja2Vudlx0aXRsZXBhZ2UKKyAgXGxlZnRsaW5le1x0aXRsZWZvbnRzXHJtICMxfQorICAlIHByaW50IGEgcnVsZSBhdCB0aGUgcGFnZSBib3R0b20gYWxzby4KKyAgXGZpbmlzaGVkdGl0bGVwYWdlZmFsc2UKKyAgXHZza2lwNHB0IFxocnVsZSBoZWlnaHQgNHB0IHdpZHRoIFxoc2l6ZSBcdnNraXA0cHQKK30KKworXHBhcnNlYXJnZGVmXHN1YnRpdGxleyUKKyAgXGNoZWNrZW52XHRpdGxlcGFnZQorICB7XHN1YnRpdGxlZm9udCBccmlnaHRsaW5leyMxfX0lCit9CisKKyUgQGF1dGhvciBzaG91bGQgY29tZSBsYXN0LCBidXQgbWF5IGNvbWUgbWFueSB0aW1lcy4KKyUgSXQgY2FuIGFsc28gYmUgdXNlZCBpbnNpZGUgQHF1b3RhdGlvbi4KKyUKK1xwYXJzZWFyZ2RlZlxhdXRob3J7JQorICBcZGVmXHRlbXB7XHF1b3RhdGlvbn0lCisgIFxpZnhcdGhpc2Vudlx0ZW1wCisgICAgXGRlZlxxdW90YXRpb25hdXRob3J7IzF9JSBwcmludGVkIGluIFxFcXVvdGF0aW9uLgorICBcZWxzZQorICAgIFxjaGVja2Vudlx0aXRsZXBhZ2UKKyAgICBcaWZzZWVuYXV0aG9yXGVsc2UgXHZza2lwIDBwdCBwbHVzIDFmaWxsbCBcc2VlbmF1dGhvcnRydWUgXGZpCisgICAge1xhdXRob3Jmb250IFxsZWZ0bGluZXsjMX19JQorICBcZmkKK30KKworCislJSUgU2V0IHVwIHBhZ2UgaGVhZGluZ3MgYW5kIGZvb3RpbmdzLgorCitcbGV0XHRoaXNwYWdlPVxmb2xpbworCitcbmV3dG9rc1xldmVuaGVhZGxpbmUgICAgJSBoZWFkbGluZSBvbiBldmVuIHBhZ2VzCitcbmV3dG9rc1xvZGRoZWFkbGluZSAgICAgJSBoZWFkbGluZSBvbiBvZGQgcGFnZXMKK1xuZXd0b2tzXGV2ZW5mb290bGluZSAgICAlIGZvb3RsaW5lIG9uIGV2ZW4gcGFnZXMKK1xuZXd0b2tzXG9kZGZvb3RsaW5lICAgICAlIGZvb3RsaW5lIG9uIG9kZCBwYWdlcworCislIE5vdyBtYWtlIFRlWCB1c2UgdGhvc2UgdmFyaWFibGVzCitcaGVhZGxpbmU9e3tcdGV4dGZvbnRzXHJtIFxpZm9kZFxwYWdlbm8gXHRoZVxvZGRoZWFkbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxlbHNlIFx0aGVcZXZlbmhlYWRsaW5lIFxmaX19CitcZm9vdGxpbmU9e3tcdGV4dGZvbnRzXHJtIFxpZm9kZFxwYWdlbm8gXHRoZVxvZGRmb290bGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxlbHNlIFx0aGVcZXZlbmZvb3RsaW5lIFxmaX1cSEVBRElOR1Nob29rfQorXGxldFxIRUFESU5HU2hvb2s9XHJlbGF4CisKKyUgQ29tbWFuZHMgdG8gc2V0IHRob3NlIHZhcmlhYmxlcy4KKyUgRm9yIGV4YW1wbGUsIHRoaXMgaXMgd2hhdCAgQGhlYWRpbmdzIG9uICBkb2VzCislIEBldmVuaGVhZGluZyBAdGhpc3RpdGxlfEB0aGlzcGFnZXxAdGhpc2NoYXB0ZXIKKyUgQG9kZGhlYWRpbmcgQHRoaXNjaGFwdGVyfEB0aGlzcGFnZXxAdGhpc3RpdGxlCislIEBldmVuZm9vdGluZyBAdGhpc2ZpbGV8fAorJSBAb2RkZm9vdGluZyB8fEB0aGlzZmlsZQorCisKK1xkZWZcZXZlbmhlYWRpbmd7XHBhcnNlYXJnXGV2ZW5oZWFkaW5neHh4fQorXGRlZlxldmVuaGVhZGluZ3h4eCAjMXtcZXZlbmhlYWRpbmd5eXkgIzFcfFx8XHxcfFxmaW5pc2h9CitcZGVmXGV2ZW5oZWFkaW5neXl5ICMxXHwjMlx8IzNcfCM0XGZpbmlzaHslCitcZ2xvYmFsXGV2ZW5oZWFkbGluZT17XHJsYXB7XGNlbnRlcmxpbmV7IzJ9fVxsaW5leyMxXGhmaWwjM319fQorCitcZGVmXG9kZGhlYWRpbmd7XHBhcnNlYXJnXG9kZGhlYWRpbmd4eHh9CitcZGVmXG9kZGhlYWRpbmd4eHggIzF7XG9kZGhlYWRpbmd5eXkgIzFcfFx8XHxcfFxmaW5pc2h9CitcZGVmXG9kZGhlYWRpbmd5eXkgIzFcfCMyXHwjM1x8IzRcZmluaXNoeyUKK1xnbG9iYWxcb2RkaGVhZGxpbmU9e1xybGFwe1xjZW50ZXJsaW5leyMyfX1cbGluZXsjMVxoZmlsIzN9fX0KKworXHBhcnNlYXJnZGVmXGV2ZXJ5aGVhZGluZ3tcb2RkaGVhZGluZ3h4eHsjMX1cZXZlbmhlYWRpbmd4eHh7IzF9fSUKKworXGRlZlxldmVuZm9vdGluZ3tccGFyc2VhcmdcZXZlbmZvb3Rpbmd4eHh9CitcZGVmXGV2ZW5mb290aW5neHh4ICMxe1xldmVuZm9vdGluZ3l5eSAjMVx8XHxcfFx8XGZpbmlzaH0KK1xkZWZcZXZlbmZvb3Rpbmd5eXkgIzFcfCMyXHwjM1x8IzRcZmluaXNoeyUKK1xnbG9iYWxcZXZlbmZvb3RsaW5lPXtccmxhcHtcY2VudGVybGluZXsjMn19XGxpbmV7IzFcaGZpbCMzfX19CisKK1xkZWZcb2RkZm9vdGluZ3tccGFyc2Vhcmdcb2RkZm9vdGluZ3h4eH0KK1xkZWZcb2RkZm9vdGluZ3h4eCAjMXtcb2RkZm9vdGluZ3l5eSAjMVx8XHxcfFx8XGZpbmlzaH0KK1xkZWZcb2RkZm9vdGluZ3l5eSAjMVx8IzJcfCMzXHwjNFxmaW5pc2h7JQorICBcZ2xvYmFsXG9kZGZvb3RsaW5lID0ge1xybGFwe1xjZW50ZXJsaW5leyMyfX1cbGluZXsjMVxoZmlsIzN9fSUKKyAgJQorICAlIExlYXZlIHNvbWUgc3BhY2UgZm9yIHRoZSBmb290bGluZS4gIEhvcGVmdWxseSBvayB0byBhc3N1bWUKKyAgJSBAZXZlbmZvb3Rpbmcgd2lsbCBub3QgYmUgdXNlZCBieSBpdHNlbGYuCisgIFxnbG9iYWxcYWR2YW5jZVxwYWdlaGVpZ2h0IGJ5IC1cYmFzZWxpbmVza2lwCisgIFxnbG9iYWxcYWR2YW5jZVx2c2l6ZSBieSAtXGJhc2VsaW5lc2tpcAorfQorCitccGFyc2VhcmdkZWZcZXZlcnlmb290aW5ne1xvZGRmb290aW5neHh4eyMxfVxldmVuZm9vdGluZ3h4eHsjMX19CisKKworJSBAaGVhZGluZ3MgZG91YmxlICAgICAgdHVybnMgaGVhZGluZ3Mgb24gZm9yIGRvdWJsZS1zaWRlZCBwcmludGluZy4KKyUgQGhlYWRpbmdzIHNpbmdsZSAgICAgIHR1cm5zIGhlYWRpbmdzIG9uIGZvciBzaW5nbGUtc2lkZWQgcHJpbnRpbmcuCislIEBoZWFkaW5ncyBvZmYgICAgICAgICB0dXJucyB0aGVtIG9mZi4KKyUgQGhlYWRpbmdzIG9uICAgICAgICAgIHNhbWUgYXMgQGhlYWRpbmdzIGRvdWJsZSwgcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkuCislIEBoZWFkaW5ncyBhZnRlciAgICAgICB0dXJucyBvbiBkb3VibGUtc2lkZWQgaGVhZGluZ3MgYWZ0ZXIgdGhpcyBwYWdlLgorJSBAaGVhZGluZ3MgZG91YmxlYWZ0ZXIgdHVybnMgb24gZG91YmxlLXNpZGVkIGhlYWRpbmdzIGFmdGVyIHRoaXMgcGFnZS4KKyUgQGhlYWRpbmdzIHNpbmdsZWFmdGVyIHR1cm5zIG9uIHNpbmdsZS1zaWRlZCBoZWFkaW5ncyBhZnRlciB0aGlzIHBhZ2UuCislIEJ5IGRlZmF1bHQsIHRoZXkgYXJlIG9mZiBhdCB0aGUgc3RhcnQgb2YgYSBkb2N1bWVudCwKKyUgYW5kIHR1cm5lZCBgb24nIGFmdGVyIEBlbmQgdGl0bGVwYWdlLgorCitcZGVmXGhlYWRpbmdzICMxIHtcY3NuYW1lIEhFQURJTkdTIzFcZW5kY3NuYW1lfQorCitcZGVmXEhFQURJTkdTb2ZmeyUKK1xnbG9iYWxcZXZlbmhlYWRsaW5lPXtcaGZpbH0gXGdsb2JhbFxldmVuZm9vdGxpbmU9e1xoZmlsfQorXGdsb2JhbFxvZGRoZWFkbGluZT17XGhmaWx9IFxnbG9iYWxcb2RkZm9vdGxpbmU9e1xoZmlsfX0KK1xIRUFESU5HU29mZgorJSBXaGVuIHdlIHR1cm4gaGVhZGluZ3Mgb24sIHNldCB0aGUgcGFnZSBudW1iZXIgdG8gMS4KKyUgRm9yIGRvdWJsZS1zaWRlZCBwcmludGluZywgcHV0IGN1cnJlbnQgZmlsZSBuYW1lIGluIGxvd2VyIGxlZnQgY29ybmVyLAorJSBjaGFwdGVyIG5hbWUgb24gaW5zaWRlIHRvcCBvZiByaWdodCBoYW5kIHBhZ2VzLCBkb2N1bWVudAorJSB0aXRsZSBvbiBpbnNpZGUgdG9wIG9mIGxlZnQgaGFuZCBwYWdlcywgYW5kIHBhZ2UgbnVtYmVycyBvbiBvdXRzaWRlIHRvcAorJSBlZGdlIG9mIGFsbCBwYWdlcy4KK1xkZWZcSEVBRElOR1Nkb3VibGV7JQorXGdsb2JhbFxwYWdlbm89MQorXGdsb2JhbFxldmVuZm9vdGxpbmU9e1xoZmlsfQorXGdsb2JhbFxvZGRmb290bGluZT17XGhmaWx9CitcZ2xvYmFsXGV2ZW5oZWFkbGluZT17XGxpbmV7XGZvbGlvXGhmaWxcdGhpc3RpdGxlfX0KK1xnbG9iYWxcb2RkaGVhZGxpbmU9e1xsaW5le1x0aGlzY2hhcHRlclxoZmlsXGZvbGlvfX0KK1xnbG9iYWxcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwb2RkcGFnZQorfQorXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcHBhZ2VyCisKKyUgRm9yIHNpbmdsZS1zaWRlZCBwcmludGluZywgY2hhcHRlciB0aXRsZSBnb2VzIGFjcm9zcyB0b3AgbGVmdCBvZiBwYWdlLAorJSBwYWdlIG51bWJlciBvbiB0b3AgcmlnaHQuCitcZGVmXEhFQURJTkdTc2luZ2xleyUKK1xnbG9iYWxccGFnZW5vPTEKK1xnbG9iYWxcZXZlbmZvb3RsaW5lPXtcaGZpbH0KK1xnbG9iYWxcb2RkZm9vdGxpbmU9e1xoZmlsfQorXGdsb2JhbFxldmVuaGVhZGxpbmU9e1xsaW5le1x0aGlzY2hhcHRlclxoZmlsXGZvbGlvfX0KK1xnbG9iYWxcb2RkaGVhZGxpbmU9e1xsaW5le1x0aGlzY2hhcHRlclxoZmlsXGZvbGlvfX0KK1xnbG9iYWxcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwcGFnZXIKK30KK1xkZWZcSEVBRElOR1NvbntcSEVBRElOR1Nkb3VibGV9CisKK1xkZWZcSEVBRElOR1NhZnRlcntcbGV0XEhFQURJTkdTaG9vaz1cSEVBRElOR1Nkb3VibGV4fQorXGxldFxIRUFESU5HU2RvdWJsZWFmdGVyPVxIRUFESU5HU2FmdGVyCitcZGVmXEhFQURJTkdTZG91YmxleHslCitcZ2xvYmFsXGV2ZW5mb290bGluZT17XGhmaWx9CitcZ2xvYmFsXG9kZGZvb3RsaW5lPXtcaGZpbH0KK1xnbG9iYWxcZXZlbmhlYWRsaW5lPXtcbGluZXtcZm9saW9caGZpbFx0aGlzdGl0bGV9fQorXGdsb2JhbFxvZGRoZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQorXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBvZGRwYWdlCit9CisKK1xkZWZcSEVBRElOR1NzaW5nbGVhZnRlcntcbGV0XEhFQURJTkdTaG9vaz1cSEVBRElOR1NzaW5nbGV4fQorXGRlZlxIRUFESU5HU3NpbmdsZXh7JQorXGdsb2JhbFxldmVuZm9vdGxpbmU9e1xoZmlsfQorXGdsb2JhbFxvZGRmb290bGluZT17XGhmaWx9CitcZ2xvYmFsXGV2ZW5oZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQorXGdsb2JhbFxvZGRoZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQorXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBwYWdlcgorfQorCislIFN1YnJvdXRpbmVzIHVzZWQgaW4gZ2VuZXJhdGluZyBoZWFkaW5ncworJSBUaGlzIHByb2R1Y2VzIERheSBNb250aCBZZWFyIHN0eWxlIG9mIG91dHB1dC4KKyUgT25seSBkZWZpbmUgaWYgbm90IGFscmVhZHkgZGVmaW5lZCwgaW4gY2FzZSBhIHR4aS0/Py50ZXggZmlsZSBoYXMgc2V0CislIHVwIGEgZGlmZmVyZW50IGZvcm1hdCAoZS5nLiwgdHhpLWNzLnRleCBkb2VzIHRoaXMpLgorXGlmeFx0b2RheVx1bmRlZmluZWQKK1xkZWZcdG9kYXl7JQorICBcbnVtYmVyXGRheVxzcGFjZQorICBcaWZjYXNlXG1vbnRoCisgIFxvclxwdXR3b3JkTUphblxvclxwdXR3b3JkTUZlYlxvclxwdXR3b3JkTU1hclxvclxwdXR3b3JkTUFwcgorICBcb3JccHV0d29yZE1NYXlcb3JccHV0d29yZE1KdW5cb3JccHV0d29yZE1KdWxcb3JccHV0d29yZE1BdWcKKyAgXG9yXHB1dHdvcmRNU2VwXG9yXHB1dHdvcmRNT2N0XG9yXHB1dHdvcmRNTm92XG9yXHB1dHdvcmRNRGVjCisgIFxmaQorICBcc3BhY2VcbnVtYmVyXHllYXJ9CitcZmkKKworJSBAc2V0dGl0bGUgbGluZS4uLiAgc3BlY2lmaWVzIHRoZSB0aXRsZSBvZiB0aGUgZG9jdW1lbnQsIGZvciBoZWFkaW5ncy4KKyUgSXQgZ2VuZXJhdGVzIG5vIG91dHB1dCBvZiBpdHMgb3duLgorXGRlZlx0aGlzdGl0bGV7XHB1dHdvcmROb1RpdGxlfQorXGRlZlxzZXR0aXRsZXtccGFyc2Vhcmd7XGdkZWZcdGhpc3RpdGxlfX0KKworCitcbWVzc2FnZXt0YWJsZXMsfQorJSBUYWJsZXMgLS0gQHRhYmxlLCBAZnRhYmxlLCBAdnRhYmxlLCBAaXRlbSh4KS4KKworJSBkZWZhdWx0IGluZGVudGF0aW9uIG9mIHRhYmxlIHRleHQKK1xuZXdkaW1lblx0YWJsZWluZGVudCBcdGFibGVpbmRlbnQ9LjhpbgorJSBkZWZhdWx0IGluZGVudGF0aW9uIG9mIEBpdGVtaXplIGFuZCBAZW51bWVyYXRlIHRleHQKK1xuZXdkaW1lblxpdGVtaW5kZW50ICBcaXRlbWluZGVudD0uM2luCislIG1hcmdpbiBiZXR3ZWVuIGVuZCBvZiB0YWJsZSBpdGVtIGFuZCBzdGFydCBvZiB0YWJsZSB0ZXh0LgorXG5ld2RpbWVuXGl0ZW1tYXJnaW4gIFxpdGVtbWFyZ2luPS4xaW4KKworJSB1c2VkIGludGVybmFsbHkgZm9yIFxpdGVtaW5kZW50IG1pbnVzIFxpdGVtbWFyZ2luCitcbmV3ZGltZW5caXRlbW1heAorCislIE5vdGUgQHRhYmxlLCBAZnRhYmxlLCBhbmQgQHZ0YWJsZSBkZWZpbmUgQGl0ZW0sIEBpdGVteCwgZXRjLiwgd2l0aAorJSB0aGVzZSBkZWZzLgorJSBUaGV5IGFsc28gZGVmaW5lIFxpdGVtaW5kZXgKKyUgdG8gaW5kZXggdGhlIGl0ZW0gbmFtZSBpbiB3aGF0ZXZlciBtYW5uZXIgaXMgZGVzaXJlZCAocGVyaGFwcyBub25lKS4KKworXG5ld2lmXGlmaXRlbXhuZWVkc25lZ2F0aXZldnNraXAKKworXGRlZlxpdGVteHBhcntccGFyXGlmaXRlbXhuZWVkc25lZ2F0aXZldnNraXBcbm9icmVha1x2c2tpcC1ccGFyc2tpcFxub2JyZWFrXGZpfQorCitcZGVmXGludGVybmFsQml0ZW17XHNtYWxsYnJlYWsgXHBhcnNlYXJnXGl0ZW16enp9CitcZGVmXGludGVybmFsQml0ZW14e1xpdGVteHBhciBccGFyc2VhcmdcaXRlbXp6en0KKworXGRlZlxpdGVtenp6ICMxe1xiZWdpbmdyb3VwICUKKyAgXGFkdmFuY2VcaHNpemUgYnkgLVxyaWdodHNraXAKKyAgXGFkdmFuY2VcaHNpemUgYnkgLVx0YWJsZWluZGVudAorICBcc2V0Ym94MD1caGJveHtcaXRlbWluZGljYXRleyMxfX0lCisgIFxpdGVtaW5kZXh7IzF9JQorICBcbm9icmVhayAlIFRoaXMgcHJldmVudHMgYSBicmVhayBiZWZvcmUgQGl0ZW14LgorICAlCisgICUgSWYgdGhlIGl0ZW0gdGV4dCBkb2VzIG5vdCBmaXQgaW4gdGhlIHNwYWNlIHdlIGhhdmUsIHB1dCBpdCBvbiBhIGxpbmUKKyAgJSBieSBpdHNlbGYsIGFuZCBkbyBub3QgYWxsb3cgYSBwYWdlIGJyZWFrIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgdGhhdAorICAlIGxpbmUuICBXZSBkbyBub3Qgc3RhcnQgYSBwYXJhZ3JhcGggaGVyZSBiZWNhdXNlIHRoZW4gaWYgdGhlIG5leHQKKyAgJSBjb21tYW5kIGlzLCBlLmcuLCBAa2luZGV4LCB0aGUgd2hhdHNpdCB3b3VsZCBnZXQgcHV0IGludG8gdGhlCisgICUgaG9yaXpvbnRhbCBsaXN0IG9uIGEgbGluZSBieSBpdHNlbGYsIHJlc3VsdGluZyBpbiBleHRyYSBibGFuayBzcGFjZS4KKyAgXGlmZGltIFx3ZDA+XGl0ZW1tYXgKKyAgICAlCisgICAgJSBNYWtlIHRoaXMgYSBwYXJhZ3JhcGggc28gd2UgZ2V0IHRoZSBccGFyc2tpcCBnbHVlIGFuZCB3cmFwcGluZywKKyAgICAlIGJ1dCBsZWF2ZSBpdCByYWdnZWQtcmlnaHQuCisgICAgXGJlZ2luZ3JvdXAKKyAgICAgIFxhZHZhbmNlXGxlZnRza2lwIGJ5LVx0YWJsZWluZGVudAorICAgICAgXGFkdmFuY2VcaHNpemUgYnlcdGFibGVpbmRlbnQKKyAgICAgIFxhZHZhbmNlXHJpZ2h0c2tpcCBieTBwdCBwbHVzMWZpbAorICAgICAgXGxlYXZldm1vZGVcdW5oYm94MFxwYXIKKyAgICBcZW5kZ3JvdXAKKyAgICAlCisgICAgJSBXZSdyZSBnb2luZyB0byBiZSBzdGFydGluZyBhIHBhcmFncmFwaCwgYnV0IHdlIGRvbid0IHdhbnQgdGhlCisgICAgJSBccGFyc2tpcCBnbHVlIC0tIGxvZ2ljYWxseSBpdCdzIHBhcnQgb2YgdGhlIEBpdGVtIHdlIGp1c3Qgc3RhcnRlZC4KKyAgICBcbm9icmVhayBcdnNraXAtXHBhcnNraXAKKyAgICAlCisgICAgJSBTdG9wIGEgcGFnZSBicmVhayBhdCB0aGUgXHBhcnNraXAgZ2x1ZSBjb21pbmcgdXAuICBIb3dldmVyLCBpZgorICAgICUgd2hhdCBmb2xsb3dzIGlzIGFuIGVudmlyb25tZW50IHN1Y2ggYXMgQGV4YW1wbGUsIHRoZXJlIHdpbGwgYmUgbm8KKyAgICAlIFxwYXJza2lwIGdsdWU7IHRoZW4gdGhlIG5lZ2F0aXZlIHZza2lwIHdlIGp1c3QgaW5zZXJ0ZWQgd291bGQKKyAgICAlIGNhdXNlIHRoZSBleGFtcGxlIGFuZCB0aGUgaXRlbSB0byBjcmFzaCB0b2dldGhlci4gIFNvIHdlIHVzZSB0aGlzCisgICAgJSBiaXphcnJlIHZhbHVlIG9mIDEwMDAxIGFzIGEgc2lnbmFsIHRvIFxhYm92ZWVudmJyZWFrIHRvIGluc2VydAorICAgICUgXHBhcnNraXAgZ2x1ZSBhZnRlciBhbGwuICBTZWN0aW9uIHRpdGxlcyBhcmUgaGFuZGxlZCB0aGlzIHdheSBhbHNvLgorICAgICUgCisgICAgXHBlbmFsdHkgMTAwMDEKKyAgICBcZW5kZ3JvdXAKKyAgICBcaXRlbXhuZWVkc25lZ2F0aXZldnNraXBmYWxzZQorICBcZWxzZQorICAgICUgVGhlIGl0ZW0gdGV4dCBmaXRzIGludG8gdGhlIHNwYWNlLiAgU3RhcnQgYSBwYXJhZ3JhcGgsIHNvIHRoYXQgdGhlCisgICAgJSBmb2xsb3dpbmcgdGV4dCAoaWYgYW55KSB3aWxsIGVuZCB1cCBvbiB0aGUgc2FtZSBsaW5lLgorICAgIFxub2luZGVudAorICAgICUgRG8gdGhpcyB3aXRoIGtlcm5zIGFuZCBcdW5oYm94IHNvIHRoYXQgaWYgdGhlcmUgaXMgYSBmb290bm90ZSBpbgorICAgICUgdGhlIGl0ZW0gdGV4dCwgaXQgY2FuIG1pZ3JhdGUgdG8gdGhlIG1haW4gdmVydGljYWwgbGlzdCBhbmQKKyAgICAlIGV2ZW50dWFsbHkgYmUgcHJpbnRlZC4KKyAgICBcbm9icmVha1xrZXJuLVx0YWJsZWluZGVudAorICAgIFxkaW1lbjAgPSBcaXRlbW1heCAgXGFkdmFuY2VcZGltZW4wIGJ5IFxpdGVtbWFyZ2luIFxhZHZhbmNlXGRpbWVuMCBieSAtXHdkMAorICAgIFx1bmhib3gwCisgICAgXG5vYnJlYWtca2VyblxkaW1lbjAKKyAgICBcZW5kZ3JvdXAKKyAgICBcaXRlbXhuZWVkc25lZ2F0aXZldnNraXB0cnVlCisgIFxmaQorfQorCitcZGVmXGl0ZW17XGVycm1lc3NhZ2V7QGl0ZW0gd2hpbGUgbm90IGluIGEgbGlzdCBlbnZpcm9ubWVudH19CitcZGVmXGl0ZW14e1xlcnJtZXNzYWdle0BpdGVteCB3aGlsZSBub3QgaW4gYSBsaXN0IGVudmlyb25tZW50fX0KKworJSBAdGFibGUsIEBmdGFibGUsIEB2dGFibGUuCitcZW52ZGVmXHRhYmxleyUKKyAgXGxldFxpdGVtaW5kZXhcZ29iYmxlCisgIFx0YWJsZWNoZWNre3RhYmxlfSUKK30KK1xlbnZkZWZcZnRhYmxleyUKKyAgXGRlZlxpdGVtaW5kZXggIyMxe1xkb2luZCB7Zm59e1xjb2RleyMjMX19fSUKKyAgXHRhYmxlY2hlY2t7ZnRhYmxlfSUKK30KK1xlbnZkZWZcdnRhYmxleyUKKyAgXGRlZlxpdGVtaW5kZXggIyMxe1xkb2luZCB7dnJ9e1xjb2RleyMjMX19fSUKKyAgXHRhYmxlY2hlY2t7dnRhYmxlfSUKK30KK1xkZWZcdGFibGVjaGVjayMxeyUKKyAgXGlmbnVtIFx0aGVcY2F0Y29kZWBcXl5NPVxhY3RpdmUKKyAgICBcZW5kZ3JvdXAKKyAgICBcZXJybWVzc2FnZXtUaGlzIGNvbW1hbmQgd29uJ3Qgd29yayBpbiB0aGlzIGNvbnRleHQ7IHBlcmhhcHMgdGhlIHByb2JsZW0gaXMKKyAgICAgIHRoYXQgd2UgYXJlIFxpbmVudmlyb25tZW50XHRoaXNlbnZ9JQorICAgIFxkZWZcbmV4dHtcZG9pZ25vcmV7IzF9fSUKKyAgXGVsc2UKKyAgICBcbGV0XG5leHRcdGFibGV4CisgIFxmaQorICBcbmV4dAorfQorXGRlZlx0YWJsZXgjMXslCisgIFxkZWZcaXRlbWluZGljYXRleyMxfSUKKyAgXHBhcnNlYXJnXHRhYmxleQorfQorXGRlZlx0YWJsZXkjMXslCisgIHslCisgICAgXG1ha2V2YWx1ZWV4cGFuZGFibGUKKyAgICBcZWRlZlx0ZW1we1xub2V4cGFuZFx0YWJsZXogIzFcc3BhY2Vcc3BhY2Vcc3BhY2V9JQorICAgIFxleHBhbmRhZnRlcgorICB9XHRlbXAgXGVuZHRhYmxlegorfQorXGRlZlx0YWJsZXogIzEgIzIgIzMgIzRcZW5kdGFibGV6eyUKKyAgXGFib3ZlZW52YnJlYWsKKyAgXGlmbnVtIDAjMT4wIFxhZHZhbmNlIFxsZWZ0c2tpcCBieSAjMVxtaWwgXGZpCisgIFxpZm51bSAwIzI+MCBcdGFibGVpbmRlbnQ9IzJcbWlsIFxmaQorICBcaWZudW0gMCMzPjAgXGFkdmFuY2UgXHJpZ2h0c2tpcCBieSAjM1xtaWwgXGZpCisgIFxpdGVtbWF4PVx0YWJsZWluZGVudAorICBcYWR2YW5jZSBcaXRlbW1heCBieSAtXGl0ZW1tYXJnaW4KKyAgXGFkdmFuY2UgXGxlZnRza2lwIGJ5IFx0YWJsZWluZGVudAorICBcZXhkZW50YW1vdW50PVx0YWJsZWluZGVudAorICBccGFyaW5kZW50ID0gMHB0CisgIFxwYXJza2lwID0gXHNtYWxsc2tpcGFtb3VudAorICBcaWZkaW0gXHBhcnNraXA9MHB0IFxwYXJza2lwPTJwdCBcZmkKKyAgXGxldFxpdGVtID0gXGludGVybmFsQml0ZW0KKyAgXGxldFxpdGVteCA9IFxpbnRlcm5hbEJpdGVteAorfQorXGRlZlxFdGFibGV7XGVuZGdyYWZcYWZ0ZXJlbnZicmVha30KK1xsZXRcRWZ0YWJsZVxFdGFibGUKK1xsZXRcRXZ0YWJsZVxFdGFibGUKK1xsZXRcRWl0ZW1pemVcRXRhYmxlCitcbGV0XEVlbnVtZXJhdGVcRXRhYmxlCisKKyUgVGhpcyBpcyB0aGUgY291bnRlciB1c2VkIGJ5IEBlbnVtZXJhdGUsIHdoaWNoIGlzIHJlYWxseSBAaXRlbWl6ZQorCitcbmV3Y291bnQgXGl0ZW1ubworCitcZW52ZGVmXGl0ZW1pemV7XHBhcnNlYXJnXGRvaXRlbWl6ZX0KKworXGRlZlxkb2l0ZW1pemUjMXslCisgIFxhYm92ZWVudmJyZWFrCisgIFxpdGVtbWF4PVxpdGVtaW5kZW50CisgIFxhZHZhbmNlXGl0ZW1tYXggYnkgLVxpdGVtbWFyZ2luCisgIFxhZHZhbmNlXGxlZnRza2lwIGJ5IFxpdGVtaW5kZW50CisgIFxleGRlbnRhbW91bnQ9XGl0ZW1pbmRlbnQKKyAgXHBhcmluZGVudD0wcHQKKyAgXHBhcnNraXA9XHNtYWxsc2tpcGFtb3VudAorICBcaWZkaW1ccGFyc2tpcD0wcHQgXHBhcnNraXA9MnB0IFxmaQorICBcZGVmXGl0ZW1jb250ZW50c3sjMX0lCisgICUgQGl0ZW1pemUgd2l0aCBubyBhcmcgaXMgZXF1aXZhbGVudCB0byBAaXRlbWl6ZSBAYnVsbGV0LgorICBcaWZ4XGl0ZW1jb250ZW50c1xlbXB0eVxkZWZcaXRlbWNvbnRlbnRze1xidWxsZXR9XGZpCisgIFxsZXRcaXRlbT1caXRlbWl6ZWl0ZW0KK30KKworJSBEZWZpbml0aW9uIG9mIEBpdGVtIHdoaWxlIGluc2lkZSBAaXRlbWl6ZSBhbmQgQGVudW1lcmF0ZS4KKyUKK1xkZWZcaXRlbWl6ZWl0ZW17JQorICBcYWR2YW5jZVxpdGVtbm8gYnkgMSAgJSBmb3IgZW51bWVyYXRpb25zCisgIHtcbGV0XHBhcj1cZW5kZ3JhZiBcc21hbGxicmVha30lIHJlYXNvbmFibGUgcGxhY2UgdG8gYnJlYWsKKyAgeyUKKyAgICUgSWYgdGhlIGRvY3VtZW50IGhhcyBhbiBAaXRlbWl6ZSBkaXJlY3RseSBhZnRlciBhIHNlY3Rpb24gdGl0bGUsIGEKKyAgICUgXG5vYnJlYWsgd2lsbCBiZSBsYXN0IG9uIHRoZSBsaXN0LCBhbmQgXHNlY3Rpb25oZWFkaW5nIHdpbGwgaGF2ZQorICAgJSBkb25lIGEgXHZza2lwLVxwYXJza2lwLiAgSW4gdGhhdCBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIHplcm8KKyAgICUgcGFyc2tpcCwgb3IgdGhlIGl0ZW0gdGV4dCB3aWxsIGNyYXNoIHdpdGggdGhlIGhlYWRpbmcuICBPbiB0aGUKKyAgICUgb3RoZXIgaGFuZCwgd2hlbiB0aGVyZSBpcyBub3JtYWwgdGV4dCBwcmVjZWRpbmcgdGhlIGl0ZW0gKGFzIHRoZXJlCisgICAlIHVzdWFsbHkgaXMpLCB3ZSBkbyB3YW50IHRvIHplcm8gcGFyc2tpcCwgb3IgdGhlcmUgd291bGQgYmUgdG9vIG11Y2gKKyAgICUgc3BhY2UuICBJbiB0aGF0IGNhc2UsIHdlIHdvbid0IGhhdmUgYSBcbm9icmVhayBiZWZvcmUuICBBdCBsZWFzdAorICAgJSB0aGF0J3MgdGhlIHRoZW9yeS4KKyAgIFxpZm51bVxsYXN0cGVuYWx0eTwxMDAwMCBccGFyc2tpcD0waW4gXGZpCisgICBcbm9pbmRlbnQKKyAgIFxoYm94IHRvIDBwdHtcaHNzIFxpdGVtY29udGVudHMgXGtlcm5caXRlbW1hcmdpbn0lCisgICBcdmFkanVzdHtccGVuYWx0eSAxMjAwfX0lIG5vdCBnb29kIHRvIGJyZWFrIGFmdGVyIGZpcnN0IGxpbmUgb2YgaXRlbS4KKyAgXGZsdXNoY3IKK30KKworJSBcc3BsaXRvZmYgVE9LRU5TXGVuZG1hcmsgZGVmaW5lcyBcZmlyc3QgdG8gYmUgdGhlIGZpcnN0IHRva2VuIGluCislIFRPS0VOUywgYW5kIFxyZXN0IHRvIGJlIHRoZSByZW1haW5kZXIuCislCitcZGVmXHNwbGl0b2ZmIzEjMlxlbmRtYXJre1xkZWZcZmlyc3R7IzF9XGRlZlxyZXN0eyMyfX0lCisKKyUgQWxsb3cgYW4gb3B0aW9uYWwgYXJndW1lbnQgb2YgYW4gdXBwZXJjYXNlIGxldHRlciwgbG93ZXJjYXNlIGxldHRlciwKKyUgb3IgbnVtYmVyLCB0byBzcGVjaWZ5IHRoZSBmaXJzdCBsYWJlbCBpbiB0aGUgZW51bWVyYXRlZCBsaXN0LiAgTm8KKyUgYXJndW1lbnQgaXMgdGhlIHNhbWUgYXMgYDEnLgorJQorXGVudnBhcnNlYXJnZGVmXGVudW1lcmF0ZXtcZW51bWVyYXRleSAjMSAgXGVuZGVudW1lcmF0ZXl9CitcZGVmXGVudW1lcmF0ZXkgIzEgIzJcZW5kZW51bWVyYXRleXslCisgICUgSWYgd2Ugd2VyZSBnaXZlbiBubyBhcmd1bWVudCwgcHJldGVuZCB3ZSB3ZXJlIGdpdmVuIGAxJy4KKyAgXGRlZlx0aGVhcmd7IzF9JQorICBcaWZ4XHRoZWFyZ1xlbXB0eSBcZGVmXHRoZWFyZ3sxfVxmaQorICAlCisgICUgRGV0ZWN0IGlmIHRoZSBhcmd1bWVudCBpcyBhIHNpbmdsZSB0b2tlbi4gIElmIHNvLCBpdCBtaWdodCBiZSBhCisgICUgbGV0dGVyLiAgT3RoZXJ3aXNlLCB0aGUgb25seSB2YWxpZCB0aGluZyBpdCBjYW4gYmUgaXMgYSBudW1iZXIuCisgICUgKFdlIHdpbGwgYWx3YXlzIGhhdmUgb25lIHRva2VuLCBiZWNhdXNlIG9mIHRoZSB0ZXN0IHdlIGp1c3QgbWFkZS4KKyAgJSBUaGlzIGlzIGEgZ29vZCB0aGluZywgc2luY2UgXHNwbGl0b2ZmIGRvZXNuJ3Qgd29yayBnaXZlbiBub3RoaW5nIGF0CisgICUgYWxsIC0tIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdW5kZWxpbWl0ZWQuKQorICBcZXhwYW5kYWZ0ZXJcc3BsaXRvZmZcdGhlYXJnXGVuZG1hcmsKKyAgXGlmeFxyZXN0XGVtcHR5CisgICAgJSBPbmx5IG9uZSB0b2tlbiBpbiB0aGUgYXJndW1lbnQuICBJdCBjb3VsZCBzdGlsbCBiZSBhbnl0aGluZy4KKyAgICAlIEEgYGBsb3dlcmNhc2UgbGV0dGVyJycgaXMgb25lIHdob3NlIFxsY2NvZGUgaXMgbm9uemVyby4KKyAgICAlIEFuIGBgdXBwZXJjYXNlIGxldHRlcicnIGlzIG9uZSB3aG9zZSBcbGNjb2RlIGlzIGJvdGggbm9uemVybywgYW5kCisgICAgJSAgIG5vdCBlcXVhbCB0byBpdHNlbGYuCisgICAgJSBPdGhlcndpc2UsIHdlIGFzc3VtZSBpdCdzIGEgbnVtYmVyLgorICAgICUKKyAgICAlIFdlIG5lZWQgdGhlIFxyZWxheCBhdCB0aGUgZW5kIG9mIHRoZSBcaWZudW0gbGluZXMgdG8gc3RvcCBUZVggZnJvbQorICAgICUgY29udGludWluZyB0byBsb29rIGZvciBhIDxudW1iZXI+LgorICAgICUKKyAgICBcaWZudW1cbGNjb2RlXGV4cGFuZGFmdGVyYFx0aGVhcmc9MFxyZWxheAorICAgICAgXG51bWVyaWNlbnVtZXJhdGUgJSBhIG51bWJlciAod2UgaG9wZSkKKyAgICBcZWxzZQorICAgICAgJSBJdCdzIGEgbGV0dGVyLgorICAgICAgXGlmbnVtXGxjY29kZVxleHBhbmRhZnRlcmBcdGhlYXJnPVxleHBhbmRhZnRlcmBcdGhlYXJnXHJlbGF4CisgICAgICAgIFxsb3dlcmNhc2VlbnVtZXJhdGUgJSBsb3dlcmNhc2UgbGV0dGVyCisgICAgICBcZWxzZQorICAgICAgICBcdXBwZXJjYXNlZW51bWVyYXRlICUgdXBwZXJjYXNlIGxldHRlcgorICAgICAgXGZpCisgICAgXGZpCisgIFxlbHNlCisgICAgJSBNdWx0aXBsZSB0b2tlbnMgaW4gdGhlIGFyZ3VtZW50LiAgV2UgaG9wZSBpdCdzIGEgbnVtYmVyLgorICAgIFxudW1lcmljZW51bWVyYXRlCisgIFxmaQorfQorCislIEFuIEBlbnVtZXJhdGUgd2hvc2UgbGFiZWxzIGFyZSBpbnRlZ2Vycy4gIFRoZSBzdGFydGluZyBpbnRlZ2VyIGlzCislIGdpdmVuIGluIFx0aGVhcmcuCislCitcZGVmXG51bWVyaWNlbnVtZXJhdGV7JQorICBcaXRlbW5vID0gXHRoZWFyZworICBcc3RhcnRlbnVtZXJhdGlvbntcdGhlXGl0ZW1ub30lCit9CisKKyUgVGhlIHN0YXJ0aW5nIChsb3dlcmNhc2UpIGxldHRlciBpcyBpbiBcdGhlYXJnLgorXGRlZlxsb3dlcmNhc2VlbnVtZXJhdGV7JQorICBcaXRlbW5vID0gXGV4cGFuZGFmdGVyYFx0aGVhcmcKKyAgXHN0YXJ0ZW51bWVyYXRpb257JQorICAgICUgQmUgc3VyZSB3ZSdyZSBub3QgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGFscGhhYmV0LgorICAgIFxpZm51bVxpdGVtbm89MAorICAgICAgXGVycm1lc3NhZ2V7Tm8gbW9yZSBsb3dlcmNhc2UgbGV0dGVycyBpbiBAZW51bWVyYXRlOyBnZXQgYSBiaWdnZXIKKyAgICAgICAgICAgICAgICAgIGFscGhhYmV0fSUKKyAgICBcZmkKKyAgICBcY2hhclxsY2NvZGVcaXRlbW5vCisgIH0lCit9CisKKyUgVGhlIHN0YXJ0aW5nICh1cHBlcmNhc2UpIGxldHRlciBpcyBpbiBcdGhlYXJnLgorXGRlZlx1cHBlcmNhc2VlbnVtZXJhdGV7JQorICBcaXRlbW5vID0gXGV4cGFuZGFmdGVyYFx0aGVhcmcKKyAgXHN0YXJ0ZW51bWVyYXRpb257JQorICAgICUgQmUgc3VyZSB3ZSdyZSBub3QgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGFscGhhYmV0LgorICAgIFxpZm51bVxpdGVtbm89MAorICAgICAgXGVycm1lc3NhZ2V7Tm8gbW9yZSB1cHBlcmNhc2UgbGV0dGVycyBpbiBAZW51bWVyYXRlOyBnZXQgYSBiaWdnZXIKKyAgICAgICAgICAgICAgICAgIGFscGhhYmV0fQorICAgIFxmaQorICAgIFxjaGFyXHVjY29kZVxpdGVtbm8KKyAgfSUKK30KKworJSBDYWxsIFxkb2l0ZW1pemUsIGFkZGluZyBhIHBlcmlvZCB0byB0aGUgZmlyc3QgYXJndW1lbnQgYW5kIHN1cHBseWluZyB0aGUKKyUgY29tbW9uIGxhc3QgdHdvIGFyZ3VtZW50cy4gIEFsc28gc3VidHJhY3Qgb25lIGZyb20gdGhlIGluaXRpYWwgdmFsdWUgaW4KKyUgXGl0ZW1ubywgc2luY2UgQGl0ZW0gaW5jcmVtZW50cyBcaXRlbW5vLgorJQorXGRlZlxzdGFydGVudW1lcmF0aW9uIzF7JQorICBcYWR2YW5jZVxpdGVtbm8gYnkgLTEKKyAgXGRvaXRlbWl6ZXsjMS59XGZsdXNoY3IKK30KKworJSBAYWxwaGFlbnVtZXJhdGUgYW5kIEBjYXBzZW51bWVyYXRlIGFyZSBhYmJyZXZpYXRpb25zIGZvciBnaXZpbmcgYW4gYXJnCislIHRvIEBlbnVtZXJhdGUuCislCitcZGVmXGFscGhhZW51bWVyYXRle1xlbnVtZXJhdGV7YX19CitcZGVmXGNhcHNlbnVtZXJhdGV7XGVudW1lcmF0ZXtBfX0KK1xkZWZcRWFscGhhZW51bWVyYXRle1xFZW51bWVyYXRlfQorXGRlZlxFY2Fwc2VudW1lcmF0ZXtcRWVudW1lcmF0ZX0KKworCislIEBtdWx0aXRhYmxlIG1hY3JvcworJSBBbXkgSGVuZHJpY2tzb24sIDgvMTgvOTQsIDMvNi85NgorJQorJSBAbXVsdGl0YWJsZSAuLi4gQGVuZCBtdWx0aXRhYmxlIHdpbGwgbWFrZSBhcyBtYW55IGNvbHVtbnMgYXMgZGVzaXJlZC4KKyUgQ29udGVudHMgb2YgZWFjaCBjb2x1bW4gd2lsbCB3cmFwIGF0IHdpZHRoIGdpdmVuIGluIHByZWFtYmxlLiAgV2lkdGgKKyUgY2FuIGJlIHNwZWNpZmllZCBlaXRoZXIgd2l0aCBzYW1wbGUgdGV4dCBnaXZlbiBpbiBhIHRlbXBsYXRlIGxpbmUsCislIG9yIGluIHBlcmNlbnQgb2YgXGhzaXplLCB0aGUgY3VycmVudCB3aWR0aCBvZiB0ZXh0IG9uIHBhZ2UuCisKKyUgVGFibGUgY2FuIGNvbnRpbnVlIG92ZXIgcGFnZXMgYnV0IHdpbGwgb25seSBicmVhayBiZXR3ZWVuIGxpbmVzLgorCislIFRvIG1ha2UgcHJlYW1ibGU6CislCislIEVpdGhlciBkZWZpbmUgd2lkdGhzIG9mIGNvbHVtbnMgaW4gdGVybXMgb2YgcGVyY2VudCBvZiBcaHNpemU6CislICAgQG11bHRpdGFibGUgQGNvbHVtbmZyYWN0aW9ucyAuMjUgLjMgLjQ1CislICAgQGl0ZW0gLi4uCislCislICAgTnVtYmVycyBmb2xsb3dpbmcgQGNvbHVtbmZyYWN0aW9ucyBhcmUgdGhlIHBlcmNlbnQgb2YgdGhlIHRvdGFsCislICAgY3VycmVudCBoc2l6ZSB0byBiZSB1c2VkIGZvciBlYWNoIGNvbHVtbi4gWW91IG1heSB1c2UgYXMgbWFueQorJSAgIGNvbHVtbnMgYXMgZGVzaXJlZC4KKworCislIE9yIHVzZSBhIHRlbXBsYXRlOgorJSAgIEBtdWx0aXRhYmxlIHtDb2x1bW4gMSB0ZW1wbGF0ZX0ge0NvbHVtbiAyIHRlbXBsYXRlfSB7Q29sdW1uIDMgdGVtcGxhdGV9CislICAgQGl0ZW0gLi4uCislICAgdXNpbmcgdGhlIHdpZGVzdCB0ZXJtIGRlc2lyZWQgaW4gZWFjaCBjb2x1bW4uCisKKyUgRWFjaCBuZXcgdGFibGUgbGluZSBzdGFydHMgd2l0aCBAaXRlbSwgZWFjaCBzdWJzZXF1ZW50IG5ldyBjb2x1bW4KKyUgc3RhcnRzIHdpdGggQHRhYi4gRW1wdHkgY29sdW1ucyBtYXkgYmUgcHJvZHVjZWQgYnkgc3VwcGx5aW5nIEB0YWIncworJSB3aXRoIG5vdGhpbmcgYmV0d2VlbiB0aGVtIGZvciBhcyBtYW55IHRpbWVzIGFzIGVtcHR5IGNvbHVtbnMgYXJlIG5lZWRlZCwKKyUgaWUsIEB0YWJAdGFiQHRhYiB3aWxsIHByb2R1Y2UgdHdvIGVtcHR5IGNvbHVtbnMuCisKKyUgQGl0ZW0sIEB0YWIgZG8gbm90IG5lZWQgdG8gYmUgb24gdGhlaXIgb3duIGxpbmVzLCBidXQgaXQgd2lsbCBub3QgaHVydAorJSBpZiB0aGV5IGFyZS4KKworJSBTYW1wbGUgbXVsdGl0YWJsZToKKworJSAgIEBtdWx0aXRhYmxlIHtDb2x1bW4gMSB0ZW1wbGF0ZX0ge0NvbHVtbiAyIHRlbXBsYXRlfSB7Q29sdW1uIDMgdGVtcGxhdGV9CislICAgQGl0ZW0gZmlyc3QgY29sIHN0dWZmIEB0YWIgc2Vjb25kIGNvbCBzdHVmZiBAdGFiIHRoaXJkIGNvbAorJSAgIEBpdGVtCislICAgZmlyc3QgY29sIHN0dWZmCislICAgQHRhYgorJSAgIHNlY29uZCBjb2wgc3R1ZmYKKyUgICBAdGFiCislICAgdGhpcmQgY29sCislICAgQGl0ZW0gZmlyc3QgY29sIHN0dWZmIEB0YWIgc2Vjb25kIGNvbCBzdHVmZgorJSAgIEB0YWIgTWFueSBwYXJhZ3JhcGhzIG9mIHRleHQgbWF5IGJlIHVzZWQgaW4gYW55IGNvbHVtbi4KKyUKKyUgICAgICAgICBUaGV5IHdpbGwgd3JhcCBhdCB0aGUgd2lkdGggZGV0ZXJtaW5lZCBieSB0aGUgdGVtcGxhdGUuCislICAgQGl0ZW1AdGFiQHRhYiBUaGlzIHdpbGwgYmUgaW4gdGhpcmQgY29sdW1uLgorJSAgIEBlbmQgbXVsdGl0YWJsZQorCislIERlZmF1bHQgZGltZW5zaW9ucyBtYXkgYmUgcmVzZXQgYnkgdXNlci4KKyUgQG11bHRpdGFibGVwYXJza2lwIGlzIHZlcnRpY2FsIHNwYWNlIGJldHdlZW4gcGFyYWdyYXBocyBpbiB0YWJsZS4KKyUgQG11bHRpdGFibGVwYXJpbmRlbnQgaXMgcGFyYWdyYXBoIGluZGVudCBpbiB0YWJsZS4KKyUgQG11bHRpdGFibGVjb2xtYXJnaW4gaXMgaG9yaXpvbnRhbCBzcGFjZSB0byBiZSBsZWZ0IGJldHdlZW4gY29sdW1ucy4KKyUgQG11bHRpdGFibGVsaW5lc3BhY2UgaXMgc3BhY2UgdG8gbGVhdmUgYmV0d2VlbiB0YWJsZSBpdGVtcywgYmFzZWxpbmUKKyUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiYXNlbGluZS4KKyUgICAwcHQgbWVhbnMgaXQgZGVwZW5kcyBvbiBjdXJyZW50IG5vcm1hbCBsaW5lIHNwYWNpbmcuCislCitcbmV3c2tpcFxtdWx0aXRhYmxlcGFyc2tpcAorXG5ld3NraXBcbXVsdGl0YWJsZXBhcmluZGVudAorXG5ld2RpbWVuXG11bHRpdGFibGVjb2xzcGFjZQorXG5ld3NraXBcbXVsdGl0YWJsZWxpbmVzcGFjZQorXG11bHRpdGFibGVwYXJza2lwPTBwdAorXG11bHRpdGFibGVwYXJpbmRlbnQ9NnB0CitcbXVsdGl0YWJsZWNvbHNwYWNlPTEycHQKK1xtdWx0aXRhYmxlbGluZXNwYWNlPTBwdAorCislIE1hY3JvcyB1c2VkIHRvIHNldCB1cCBoYWxpZ24gcHJlYW1ibGU6CislCitcbGV0XGVuZHNldHVwdGFibGVccmVsYXgKK1xkZWZceGVuZHNldHVwdGFibGV7XGVuZHNldHVwdGFibGV9CitcbGV0XGNvbHVtbmZyYWN0aW9uc1xyZWxheAorXGRlZlx4Y29sdW1uZnJhY3Rpb25ze1xjb2x1bW5mcmFjdGlvbnN9CitcbmV3aWZcaWZzZXRwZXJjZW50CisKKyUgIzEgaXMgdGhlIEBjb2x1bW5mcmFjdGlvbiwgdXN1YWxseSBhIGRlY2ltYWwgbnVtYmVyIGxpa2UgLjUsIGJ1dCBtaWdodAorJSBiZSBqdXN0IDEuICBXZSBqdXN0IHVzZSBpdCwgd2hhdGV2ZXIgaXQgaXMuCislCitcZGVmXHBpY2t1cHdob2xlZnJhY3Rpb24jMSB7JQorICBcZ2xvYmFsXGFkdmFuY2VcY29sY291bnQgYnkgMQorICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUgY29sXHRoZVxjb2xjb3VudFxlbmRjc25hbWV7IzFcaHNpemV9JQorICBcc2V0dXB0YWJsZQorfQorCitcbmV3Y291bnRcY29sY291bnQKK1xkZWZcc2V0dXB0YWJsZSMxeyUKKyAgXGRlZlxmaXJzdGFyZ3sjMX0lCisgIFxpZnhcZmlyc3RhcmdceGVuZHNldHVwdGFibGUKKyAgICBcbGV0XGdvID0gXHJlbGF4CisgIFxlbHNlCisgICAgXGlmeFxmaXJzdGFyZ1x4Y29sdW1uZnJhY3Rpb25zCisgICAgICBcZ2xvYmFsXHNldHBlcmNlbnR0cnVlCisgICAgXGVsc2UKKyAgICAgIFxpZnNldHBlcmNlbnQKKyAgICAgICAgIFxsZXRcZ29ccGlja3Vwd2hvbGVmcmFjdGlvbgorICAgICAgXGVsc2UKKyAgICAgICAgIFxnbG9iYWxcYWR2YW5jZVxjb2xjb3VudCBieSAxCisgICAgICAgICBcc2V0Ym94MD1caGJveHsjMVx1bnNraXBcc3BhY2V9JSBBZGQgYSBub3JtYWwgd29yZCBzcGFjZSBhcyBhCisgICAgICAgICAgICAgICAgICAgJSBzZXBhcmF0b3I7IHR5cGljYWxseSB0aGF0IGlzIGFsd2F5cyBpbiB0aGUgaW5wdXQsIGFueXdheS4KKyAgICAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZSBjb2xcdGhlXGNvbGNvdW50XGVuZGNzbmFtZXtcdGhlXHdkMH0lCisgICAgICBcZmkKKyAgICBcZmkKKyAgICBcaWZ4XGdvXHBpY2t1cHdob2xlZnJhY3Rpb24KKyAgICAgICUgUHV0IHRoZSBhcmd1bWVudCBiYWNrIGZvciB0aGUgXHBpY2t1cHdob2xlZnJhY3Rpb24gY2FsbCwgc28KKyAgICAgICUgd2UnbGwgYWx3YXlzIGhhdmUgYSBwZXJpb2QgdGhlcmUgdG8gYmUgcGFyc2VkLgorICAgICAgXGRlZlxnb3tccGlja3Vwd2hvbGVmcmFjdGlvbiMxfSUKKyAgICBcZWxzZQorICAgICAgXGxldFxnbyA9IFxzZXR1cHRhYmxlCisgICAgXGZpJQorICBcZmkKKyAgXGdvCit9CisKKyUgbXVsdGl0YWJsZS1vbmx5IGNvbW1hbmRzLgorJQorJSBAaGVhZGl0ZW0gc3RhcnRzIGEgaGVhZGluZyByb3csIHdoaWNoIHdlIHR5cGVzZXQgaW4gYm9sZC4KKyUgQXNzaWdubWVudHMgaGF2ZSB0byBiZSBnbG9iYWwgc2luY2Ugd2UgYXJlIGluc2lkZSB0aGUgaW1wbGljaXQgZ3JvdXAKKyUgb2YgYW4gYWxpZ25tZW50IGVudHJ5LiAgTm90ZSB0aGF0IFxldmVyeWNyIHJlc2V0cyBcZXZlcnl0YWIuCitcZGVmXGhlYWRpdGVte1xjaGVja2VudlxtdWx0aXRhYmxlIFxjcmNyIFxnbG9iYWxcZXZlcnl0YWI9e1xiZn1cdGhlXGV2ZXJ5dGFifSUKKyUKKyUgQSBcdGFiIHVzZWQgdG8gaW5jbHVkZSBcaHNraXAxc3AuICBCdXQgdGhlbiB0aGUgc3BhY2UgaW4gYSB0ZW1wbGF0ZQorJSBsaW5lIGlzIG5vdCBlbm91Z2guICBUaGF0IGlzIGJhZC4gIFNvIGxldCdzIGdvIGJhY2sgdG8ganVzdCBgJicgdW50aWwKKyUgd2UgZW5jb3VudGVyIHRoZSBwcm9ibGVtIGl0IHdhcyBpbnRlbmRlZCB0byBzb2x2ZSBhZ2Fpbi4KKyUJCQkJCS0ta2FybCwgbmF0aGFuQGFjbS5vcmcsIDIwYXByOTkuCitcZGVmXHRhYntcY2hlY2tlbnZcbXVsdGl0YWJsZSAmXHRoZVxldmVyeXRhYn0lCisKKyUgQG11bHRpdGFibGUgLi4uIEBlbmQgbXVsdGl0YWJsZSBkZWZpbml0aW9uczoKKyUKK1xuZXd0b2tzXGV2ZXJ5dGFiICAlIGluc2VydCBhZnRlciBldmVyeSB0YWIuCislCitcZW52ZGVmXG11bHRpdGFibGV7JQorICBcdnNraXBccGFyc2tpcAorICBcc3RhcnRzYXZpbmdpbnNlcnRzCisgICUKKyAgJSBAaXRlbSB3aXRoaW4gYSBtdWx0aXRhYmxlIHN0YXJ0cyBhIG5vcm1hbCByb3cuCisgICUgV2UgdXNlIFxkZWYgaW5zdGVhZCBvZiBcbGV0IHNvIHRoYXQgaWYgb25lIG9mIHRoZSBtdWx0aXRhYmxlIGVudHJpZXMKKyAgJSBjb250YWlucyBhbiBAaXRlbWl6ZSwgd2UgZG9uJ3QgY2hva2Ugb24gdGhlIFxpdGVtIChzZWVuIGFzIFxjcmNyIGFrYQorICAlIFxlbmR0ZW1wbGF0ZSkgZXhwYW5kaW5nIFxkb2l0ZW1pemUuCisgIFxkZWZcaXRlbXtcY3Jjcn0lCisgICUKKyAgXHRvbGVyYW5jZT05NTAwCisgIFxoYmFkbmVzcz05NTAwCisgIFxzZXRtdWx0aXRhYmxlc3BhY2luZworICBccGFyc2tpcD1cbXVsdGl0YWJsZXBhcnNraXAKKyAgXHBhcmluZGVudD1cbXVsdGl0YWJsZXBhcmluZGVudAorICBcb3ZlcmZ1bGxydWxlPTBwdAorICBcZ2xvYmFsXGNvbGNvdW50PTAKKyAgJQorICBcZXZlcnljciA9IHslCisgICAgXG5vYWxpZ257JQorICAgICAgXGdsb2JhbFxldmVyeXRhYj17fSUKKyAgICAgIFxnbG9iYWxcY29sY291bnQ9MCAlIFJlc2V0IHRoZSBjb2x1bW4gY291bnRlci4KKyAgICAgICUgQ2hlY2sgZm9yIHNhdmVkIGZvb3Rub3RlcywgZXRjLgorICAgICAgXGNoZWNraW5zZXJ0cworICAgICAgJSBLZWVwcyB1bmRlcmZ1bGwgYm94IG1lc3NhZ2VzIG9mZiB3aGVuIHRhYmxlIGJyZWFrcyBvdmVyIHBhZ2VzLgorICAgICAgJVxmaWxicmVhaworCSUgTWF5YmUgc28sIGJ1dCBpdCBhbHNvIGNyZWF0ZXMgcmVhbGx5IHdlaXJkIHBhZ2UgYnJlYWtzIHdoZW4gdGhlCisJJSB0YWJsZSBicmVha3Mgb3ZlciBwYWdlcy4gV291bGRuJ3QgXHZmaWwgYmUgYmV0dGVyPyAgV2FpdCB1bnRpbCB0aGUKKwklIHByb2JsZW0gbWFuaWZlc3RzIGl0c2VsZiwgc28gaXQgY2FuIGJlIGZpeGVkIGZvciByZWFsIC0ta2FybC4KKyAgICB9JQorICB9JQorICAlCisgIFxwYXJzZWFyZ1xkb211bHRpdGFibGUKK30KK1xkZWZcZG9tdWx0aXRhYmxlIzF7JQorICAlIFRvIHBhcnNlIGV2ZXJ5dGhpbmcgYmV0d2VlbiBAbXVsdGl0YWJsZSBhbmQgQGl0ZW06CisgIFxzZXR1cHRhYmxlIzEgXGVuZHNldHVwdGFibGUKKyAgJQorICAlIFRoaXMgcHJlYW1ibGUgc2V0cyB1cCBhIGdlbmVyaWMgY29sdW1uIGRlZmluaXRpb24sIHdoaWNoIHdpbGwKKyAgJSBiZSB1c2VkIGFzIG1hbnkgdGltZXMgYXMgdXNlciBjYWxscyBmb3IgY29sdW1ucy4KKyAgJSBcdnRvcCB3aWxsIHNldCBhIHNpbmdsZSBsaW5lIGFuZCB3aWxsIGFsc28gbGV0IHRleHQgd3JhcCBhbmQKKyAgJSBjb250aW51ZSBmb3IgbWFueSBwYXJhZ3JhcGhzIGlmIGRlc2lyZWQuCisgIFxoYWxpZ25cYmdyb3VwICYlCisgICAgXGdsb2JhbFxhZHZhbmNlXGNvbGNvdW50IGJ5IDEKKyAgICBcbXVsdGlzdHJ1dAorICAgIFx2dG9weyUKKyAgICAgICUgVXNlIHRoZSBjdXJyZW50IFxjb2xjb3VudCB0byBmaW5kIHRoZSBjb3JyZWN0IGNvbHVtbiB3aWR0aDoKKyAgICAgIFxoc2l6ZT1cZXhwYW5kYWZ0ZXJcY3NuYW1lIGNvbFx0aGVcY29sY291bnRcZW5kY3NuYW1lCisgICAgICAlCisgICAgICAlIEluIG9yZGVyIHRvIGtlZXAgZW50cmllcyBmcm9tIGJ1bXBpbmcgaW50byBlYWNoIG90aGVyCisgICAgICAlIHdlIHdpbGwgYWRkIGEgXGxlZnRza2lwIG9mIFxtdWx0aXRhYmxlY29sc3BhY2UgdG8gYWxsIGNvbHVtbnMgYWZ0ZXIKKyAgICAgICUgdGhlIGZpcnN0IG9uZS4KKyAgICAgICUKKyAgICAgICUgSWYgYSB0ZW1wbGF0ZSBoYXMgYmVlbiB1c2VkLCB3ZSB3aWxsIGFkZCBcbXVsdGl0YWJsZWNvbHNwYWNlCisgICAgICAlIHRvIHRoZSB3aWR0aCBvZiBlYWNoIHRlbXBsYXRlIGVudHJ5LgorICAgICAgJQorICAgICAgJSBJZiB0aGUgdXNlciBoYXMgc2V0IHByZWFtYmxlIGluIHRlcm1zIG9mIHBlcmNlbnQgb2YgXGhzaXplIHdlIHdpbGwKKyAgICAgICUgdXNlIHRoYXQgZGltZW5zaW9uIGFzIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1uLCBhbmQgdGhlIFxsZWZ0c2tpcAorICAgICAgJSB3aWxsIGtlZXAgZW50cmllcyBmcm9tIGJ1bXBpbmcgaW50byBlYWNoIG90aGVyLiAgVGFibGUgd2lsbCBzdGFydCBhdAorICAgICAgJSBsZWZ0IG1hcmdpbiBhbmQgZmluYWwgY29sdW1uIHdpbGwganVzdGlmeSBhdCByaWdodCBtYXJnaW4uCisgICAgICAlCisgICAgICAlIE1ha2Ugc3VyZSB3ZSBkb24ndCBpbmhlcml0IFxyaWdodHNraXAgZnJvbSB0aGUgb3V0ZXIgZW52aXJvbm1lbnQuCisgICAgICBccmlnaHRza2lwPTBwdAorICAgICAgXGlmbnVtXGNvbGNvdW50PTEKKwklIFRoZSBmaXJzdCBjb2x1bW4gd2lsbCBiZSBpbmRlbnRlZCB3aXRoIHRoZSBzdXJyb3VuZGluZyB0ZXh0LgorCVxhZHZhbmNlXGhzaXplIGJ5XGxlZnRza2lwCisgICAgICBcZWxzZQorCVxpZnNldHBlcmNlbnQgXGVsc2UKKwkgICUgSWYgdXNlciBoYXMgbm90IHNldCBwcmVhbWJsZSBpbiB0ZXJtcyBvZiBwZXJjZW50IG9mIFxoc2l6ZQorCSAgJSB3ZSB3aWxsIGFkdmFuY2UgXGhzaXplIGJ5IFxtdWx0aXRhYmxlY29sc3BhY2UuCisJICBcYWR2YW5jZVxoc2l6ZSBieSBcbXVsdGl0YWJsZWNvbHNwYWNlCisJXGZpCisgICAgICAgJSBJbiBlaXRoZXIgY2FzZSB3ZSB3aWxsIG1ha2UgXGxlZnRza2lwPVxtdWx0aXRhYmxlY29sc3BhY2U6CisgICAgICBcbGVmdHNraXA9XG11bHRpdGFibGVjb2xzcGFjZQorICAgICAgXGZpCisgICAgICAlIElnbm9yaW5nIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBhdm9pZHMgYW4gb2NjYXNpb25hbCBzcHVyaW91cworICAgICAgJSBibGFuayBsaW5lLCB3aGVuIFRlWCBkZWNpZGVzIHRvIGJyZWFrIHRoZSBsaW5lIGF0IHRoZSBzcGFjZSBiZWZvcmUgdGhlCisgICAgICAlIGJveCBmcm9tIHRoZSBtdWx0aXN0cnV0LCBzbyB0aGUgc3RydXQgZW5kcyB1cCBvbiBhIGxpbmUgYnkgaXRzZWxmLgorICAgICAgJSBGb3IgZXhhbXBsZToKKyAgICAgICUgQG11bHRpdGFibGUgQGNvbHVtbmZyYWN0aW9ucyAuMTEgLjg5CisgICAgICAlIEBpdGVtIEBjb2RleyN9CisgICAgICAlIEB0YWIgTGVnYWwgaG9saWRheSB3aGljaCBpcyB2YWxpZCBpbiBtYWpvciBwYXJ0cyBvZiB0aGUgd2hvbGUgY291bnRyeS4KKyAgICAgICUgSXMgYXV0b21hdGljYWxseSBwcm92aWRlZCB3aXRoIGhpZ2hsaWdodGluZyBzZXF1ZW5jZXMgcmVzcGVjdGl2ZWx5CisgICAgICAlIG1hcmtpbmcgY2hhcmFjdGVycy4KKyAgICAgIFxub2luZGVudFxpZ25vcmVzcGFjZXMjI1x1bnNraXBcbXVsdGlzdHJ1dAorICAgIH1cY3IKK30KK1xkZWZcRW11bHRpdGFibGV7JQorICBcY3JjcgorICBcZWdyb3VwICUgZW5kIHRoZSBcaGFsaWduCisgIFxnbG9iYWxcc2V0cGVyY2VudGZhbHNlCit9CisKK1xkZWZcc2V0bXVsdGl0YWJsZXNwYWNpbmd7JQorICBcZGVmXG11bHRpc3RydXR7XHN0cnV0fSUganVzdCB1c2UgdGhlIHN0YW5kYXJkIGxpbmUgc3BhY2luZworICAlCisgICUgQ29tcHV0ZSBcbXVsdGl0YWJsZWxpbmVzcGFjZSAoaWYgbm90IGRlZmluZWQgYnkgdXNlcikgZm9yIHVzZSBpbgorICAlIFxtdWx0aXRhYmxlcGFyc2tpcCBjYWxjdWxhdGlvbi4gIFdlIHVzZWQgZGVmaW5lIFxtdWx0aXN0cnV0IGJhc2VkIG9uCisgICUgdGhpcywgYnV0IChpcm9uaWNhbGx5KSB0aGF0IGNhdXNlZCB0aGUgc3BhY2luZyB0byBiZSBvZmYuCisgICUgU2VlIGJ1Zy10ZXhpbmZvIHJlcG9ydCBmcm9tIFdlcm5lciBMZW1iZXJnLCAzMSBPY3QgMjAwNCAxMjo1MjoyMCArMDEwMC4KK1xpZmRpbVxtdWx0aXRhYmxlbGluZXNwYWNlPTBwdAorXHNldGJveDA9XHZib3h7WH1cZ2xvYmFsXG11bHRpdGFibGVsaW5lc3BhY2U9XHRoZVxiYXNlbGluZXNraXAKK1xnbG9iYWxcYWR2YW5jZVxtdWx0aXRhYmxlbGluZXNwYWNlIGJ5LVxodDAKK1xmaQorJSUgVGVzdCB0byBzZWUgaWYgcGFyc2tpcCBpcyBsYXJnZXIgdGhhbiBzcGFjZSBiZXR3ZWVuIGxpbmVzIG9mCislJSB0YWJsZS4gSWYgbm90LCBkbyBub3RoaW5nLgorJSUgICAgICAgIElmIHNvLCBzZXQgdG8gc2FtZSBkaW1lbnNpb24gYXMgbXVsdGl0YWJsZWxpbmVzcGFjZS4KK1xpZmRpbVxtdWx0aXRhYmxlcGFyc2tpcD5cbXVsdGl0YWJsZWxpbmVzcGFjZQorXGdsb2JhbFxtdWx0aXRhYmxlcGFyc2tpcD1cbXVsdGl0YWJsZWxpbmVzcGFjZQorXGdsb2JhbFxhZHZhbmNlXG11bHRpdGFibGVwYXJza2lwLTdwdCAlJSB0byBrZWVwIHBhcnNraXAgc29tZXdoYXQgc21hbGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlJSB0aGFuIHNraXAgYmV0d2VlbiBsaW5lcyBpbiB0aGUgdGFibGUuCitcZmklCitcaWZkaW1cbXVsdGl0YWJsZXBhcnNraXA9MHB0CitcZ2xvYmFsXG11bHRpdGFibGVwYXJza2lwPVxtdWx0aXRhYmxlbGluZXNwYWNlCitcZ2xvYmFsXGFkdmFuY2VcbXVsdGl0YWJsZXBhcnNraXAtN3B0ICUlIHRvIGtlZXAgcGFyc2tpcCBzb21ld2hhdCBzbWFsbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUlIHRoYW4gc2tpcCBiZXR3ZWVuIGxpbmVzIGluIHRoZSB0YWJsZS4KK1xmaX0KKworCitcbWVzc2FnZXtjb25kaXRpb25hbHMsfQorCislIEBpZnRleCwgQGlmbm90ZG9jYm9vaywgQGlmbm90aHRtbCwgQGlmbm90aW5mbywgQGlmbm90cGxhaW50ZXh0LAorJSBAaWZub3R4bWwgYWx3YXlzIHN1Y2NlZWQuICBUaGV5IGN1cnJlbnRseSBkbyBub3RoaW5nOyB3ZSBkb24ndAorJSBhdHRlbXB0IHRvIGNoZWNrIHdoZXRoZXIgdGhlIGNvbmRpdGlvbmFscyBhcmUgcHJvcGVybHkgbmVzdGVkLiAgQnV0IHdlCislIGhhdmUgdG8gcmVtZW1iZXIgdGhhdCB0aGV5IGFyZSBjb25kaXRpb25hbHMsIHNvIHRoYXQgQGVuZCBkb2Vzbid0CislIGF0dGVtcHQgdG8gY2xvc2UgYW4gZW52aXJvbm1lbnQgZ3JvdXAuCislCitcZGVmXG1ha2Vjb25kIzF7JQorICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSAjMVxlbmRjc25hbWUgPSBccmVsYXgKKyAgXGV4cGFuZGFmdGVyXGxldFxjc25hbWUgaXNjb25kLiMxXGVuZGNzbmFtZSA9IDEKK30KK1xtYWtlY29uZHtpZnRleH0KK1xtYWtlY29uZHtpZm5vdGRvY2Jvb2t9CitcbWFrZWNvbmR7aWZub3RodG1sfQorXG1ha2Vjb25ke2lmbm90aW5mb30KK1xtYWtlY29uZHtpZm5vdHBsYWludGV4dH0KK1xtYWtlY29uZHtpZm5vdHhtbH0KKworJSBJZ25vcmUgQGlnbm9yZSwgQGlmaHRtbCwgQGlmaW5mbywgYW5kIHRoZSBsaWtlLgorJQorXGRlZlxkaXJlbnRyeXtcZG9pZ25vcmV7ZGlyZW50cnl9fQorXGRlZlxkb2N1bWVudGRlc2NyaXB0aW9ue1xkb2lnbm9yZXtkb2N1bWVudGRlc2NyaXB0aW9ufX0KK1xkZWZcZG9jYm9va3tcZG9pZ25vcmV7ZG9jYm9va319CitcZGVmXGh0bWx7XGRvaWdub3Jle2h0bWx9fQorXGRlZlxpZmRvY2Jvb2t7XGRvaWdub3Jle2lmZG9jYm9va319CitcZGVmXGlmaHRtbHtcZG9pZ25vcmV7aWZodG1sfX0KK1xkZWZcaWZpbmZve1xkb2lnbm9yZXtpZmluZm99fQorXGRlZlxpZm5vdHRleHtcZG9pZ25vcmV7aWZub3R0ZXh9fQorXGRlZlxpZnBsYWludGV4dHtcZG9pZ25vcmV7aWZwbGFpbnRleHR9fQorXGRlZlxpZnhtbHtcZG9pZ25vcmV7aWZ4bWx9fQorXGRlZlxpZ25vcmV7XGRvaWdub3Jle2lnbm9yZX19CitcZGVmXG1lbnV7XGRvaWdub3Jle21lbnV9fQorXGRlZlx4bWx7XGRvaWdub3Jle3htbH19CisKKyUgSWdub3JlIHRleHQgdW50aWwgYSBsaW5lIGBAZW5kICMxJywga2VlcGluZyB0cmFjayBvZiBuZXN0ZWQgY29uZGl0aW9uYWxzLgorJQorJSBBIGNvdW50IHRvIHJlbWVtYmVyIHRoZSBkZXB0aCBvZiBuZXN0aW5nLgorXG5ld2NvdW50XGRvaWdub3JlY291bnQKKworXGRlZlxkb2lnbm9yZSMxe1xiZWdpbmdyb3VwCisgICUgU2NhbiBpbiBgYHZlcmJhdGltJycgbW9kZToKKyAgXGNhdGNvZGVgXEAgPSBcb3RoZXIKKyAgXGNhdGNvZGVgXHsgPSBcb3RoZXIKKyAgXGNhdGNvZGVgXH0gPSBcb3RoZXIKKyAgJQorICAlIE1ha2Ugc3VyZSB0aGF0IHNwYWNlcyB0dXJuIGludG8gdG9rZW5zIHRoYXQgbWF0Y2ggd2hhdCBcZG9pZ25vcmV0ZXh0IHdhbnRzLgorICBcc3BhY2Vpc3NwYWNlCisgICUKKyAgJSBDb3VudCBudW1iZXIgb2YgIzEncyB0aGF0IHdlJ3ZlIHNlZW4uCisgIFxkb2lnbm9yZWNvdW50ID0gMAorICAlCisgICUgU3dhbGxvdyB0ZXh0IHVudGlsIHdlIHJlYWNoIHRoZSBtYXRjaGluZyBgQGVuZCAjMScuCisgIFxkb2RvaWdub3JleyMxfSUKK30KKworeyBcY2F0Y29kZWBfPTExICUgV2Ugd2FudCB0byB1c2UgXF9TVE9QXyB3aGljaCBjYW5ub3QgYXBwZWFyIGluIHRleGluZm8gc291cmNlLgorICBcb2JleWxpbmVzICUKKyAgJQorICBcZ2RlZlxkb2RvaWdub3JlIzF7JQorICAgICUgIzEgY29udGFpbnMgdGhlIGNvbW1hbmQgbmFtZSBhcyBhIHN0cmluZywgZS5nLiwgYGlmaW5mbycuCisgICAgJQorICAgICUgRGVmaW5lIGEgY29tbWFuZCB0byBmaW5kIHRoZSBuZXh0IGBAZW5kICMxJywgd2hpY2ggbXVzdCBiZSBvbiBhIGxpbmUKKyAgICAlIGJ5IGl0c2VsZi4KKyAgICBcbG9uZ1xkZWZcZG9pZ25vcmV0ZXh0IyMxXl5NQGVuZCAjMXtcZG9pZ25vcmV0ZXh0eXl5IyMxXl5NQCMxXF9TVE9QX30lCisgICAgJSBBbmQgdGhpcyBjb21tYW5kIHRvIGZpbmQgYW5vdGhlciAjMSBjb21tYW5kLCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEKKyAgICAlIGxpbmUuICAoT3RoZXJ3aXNlLCB3ZSB3b3VsZCBjb25zaWRlciBhIGxpbmUgYEBjIEBpZnNldCcsIGZvcgorICAgICUgZXhhbXBsZSwgdG8gY291bnQgYXMgYW4gQGlmc2V0IGZvciBuZXN0aW5nLikKKyAgICBcbG9uZ1xkZWZcZG9pZ25vcmV0ZXh0eXl5IyMxXl5NQCMxIyMyXF9TVE9QX3tcZG9pZ25vcmV5eXl7IyMyfVxfU1RPUF99JQorICAgICUKKyAgICAlIEFuZCBub3cgZXhwYW5kIHRoYXQgY29tbWFuZC4KKyAgICBcb2JleWxpbmVzICUKKyAgICBcZG9pZ25vcmV0ZXh0IF5eTSUKKyAgfSUKK30KKworXGRlZlxkb2lnbm9yZXl5eSMxeyUKKyAgXGRlZlx0ZW1weyMxfSUKKyAgXGlmeFx0ZW1wXGVtcHR5CQkJJSBOb3RoaW5nIGZvdW5kLgorICAgIFxsZXRcbmV4dFxkb2lnbm9yZXRleHR6enoKKyAgXGVsc2UJCQkJCSUgRm91bmQgYSBuZXN0ZWQgY29uZGl0aW9uLCAuLi4KKyAgICBcYWR2YW5jZVxkb2lnbm9yZWNvdW50IGJ5IDEKKyAgICBcbGV0XG5leHRcZG9pZ25vcmV0ZXh0eXl5CQklIC4uLiwgbG9vayBmb3IgYW5vdGhlci4KKyAgICAlIElmIHdlJ3JlIGhlcmUsICMxIGVuZHMgd2l0aCBeXk1caWZpbmZvIChmb3IgZXhhbXBsZSkuCisgIFxmaQorICBcbmV4dCAjMSUgdGhlIHRva2VuIFxfU1RPUF8gaXMgcHJlc2VudCBqdXN0IGFmdGVyIHRoaXMgbWFjcm8uCit9CisKKyUgV2UgaGF2ZSB0byBzd2FsbG93IHRoZSByZW1haW5pbmcgIlxfU1RPUF8iLgorJQorXGRlZlxkb2lnbm9yZXRleHR6enojMXslCisgIFxpZm51bVxkb2lnbm9yZWNvdW50ID0gMAklIFdlIGhhdmUganVzdCBmb3VuZCB0aGUgb3V0ZXJtb3N0IEBlbmQuCisgICAgXGxldFxuZXh0XGVuZGRvaWdub3JlCisgIFxlbHNlCQkJCSUgU3RpbGwgaW5zaWRlIGEgbmVzdGVkIGNvbmRpdGlvbi4KKyAgICBcYWR2YW5jZVxkb2lnbm9yZWNvdW50IGJ5IC0xCisgICAgXGxldFxuZXh0XGRvaWdub3JldGV4dCAgICAgICUgTG9vayBmb3IgdGhlIG5leHQgQGVuZC4KKyAgXGZpCisgIFxuZXh0Cit9CisKKyUgRmluaXNoIG9mZiBpZ25vcmVkIHRleHQuCitcZGVmXGVuZGRvaWdub3Jle1xlbmRncm91cFxpZ25vcmVzcGFjZXN9CisKKworJSBAc2V0IFZBUiBzZXRzIHRoZSB2YXJpYWJsZSBWQVIgdG8gYW4gZW1wdHkgdmFsdWUuCislIEBzZXQgVkFSIFJFU1QtT0YtTElORSBzZXRzIFZBUiB0byB0aGUgdmFsdWUgUkVTVC1PRi1MSU5FLgorJQorJSBTaW5jZSB3ZSB3YW50IHRvIHNlcGFyYXRlIFZBUiBmcm9tIFJFU1QtT0YtTElORSAod2hpY2ggbWlnaHQgYmUKKyUgZW1wdHkpLCB3ZSBjYW4ndCBqdXN0IHVzZSBccGFyc2Vhcmc7IHdlIGhhdmUgdG8gaW5zZXJ0IGEgc3BhY2Ugb2Ygb3VyCislIG93biB0byBkZWxpbWl0IHRoZSByZXN0IG9mIHRoZSBsaW5lLCBhbmQgdGhlbiB0YWtlIGl0IG91dCBhZ2FpbiBpZiB3ZQorJSBkaWRuJ3QgbmVlZCBpdC4KKyUgV2UgcmVseSBvbiB0aGUgZmFjdCB0aGF0IFxwYXJzZWFyZyBzZXRzIFxjYXRjb2RlYFwgPTEwLgorJQorXHBhcnNlYXJnZGVmXHNldHtcc2V0eXl5IzEgXGVuZHNldHl5eX0KK1xkZWZcc2V0eXl5IzEgIzJcZW5kc2V0eXl5eyUKKyAgeyUKKyAgICBcbWFrZXZhbHVlZXhwYW5kYWJsZQorICAgIFxkZWZcdGVtcHsjMn0lCisgICAgXGVkZWZcbmV4dHtcZ2RlZlxtYWtlY3NuYW1le1NFVCMxfX0lCisgICAgXGlmeFx0ZW1wXGVtcHR5CisgICAgICBcbmV4dHt9JQorICAgIFxlbHNlCisgICAgICBcc2V0enp6IzJcZW5kc2V0enp6CisgICAgXGZpCisgIH0lCit9CislIFJlbW92ZSB0aGUgdHJhaWxpbmcgc3BhY2UgXHNldHh4eCBpbnNlcnRlZC4KK1xkZWZcc2V0enp6IzEgXGVuZHNldHp6entcbmV4dHsjMX19CisKKyUgQGNsZWFyIFZBUiBjbGVhcnMgKGkuZS4sIHVuc2V0cykgdGhlIHZhcmlhYmxlIFZBUi4KKyUKK1xwYXJzZWFyZ2RlZlxjbGVhcnslCisgIHslCisgICAgXG1ha2V2YWx1ZWV4cGFuZGFibGUKKyAgICBcZ2xvYmFsXGV4cGFuZGFmdGVyXGxldFxjc25hbWUgU0VUIzFcZW5kY3NuYW1lPVxyZWxheAorICB9JQorfQorCislIEB2YWx1ZXtmb299IGdldHMgdGhlIHRleHQgc2F2ZWQgaW4gdmFyaWFibGUgZm9vLgorXGRlZlx2YWx1ZXtcYmVnaW5ncm91cFxtYWtldmFsdWVleHBhbmRhYmxlXHZhbHVleHh4fQorXGRlZlx2YWx1ZXh4eCMxe1xleHBhbmRhYmxldmFsdWV7IzF9XGVuZGdyb3VwfQoreworICBcY2F0Y29kZWBcLSA9IFxhY3RpdmUgXGNhdGNvZGVgXF8gPSBcYWN0aXZlCisgICUKKyAgXGdkZWZcbWFrZXZhbHVlZXhwYW5kYWJsZXslCisgICAgXGxldFx2YWx1ZSA9IFxleHBhbmRhYmxldmFsdWUKKyAgICAlIFdlIGRvbid0IHdhbnQgdGhlc2UgY2hhcmFjdGVycyBhY3RpdmUsIC4uLgorICAgIFxjYXRjb2RlYFwtPVxvdGhlciBcY2F0Y29kZWBcXz1cb3RoZXIKKyAgICAlIC4uLiwgYnV0IHdlIG1pZ2h0IGVuZCB1cCB3aXRoIGFjdGl2ZSBvbmVzIGluIHRoZSBhcmd1bWVudCBpZgorICAgICUgd2UncmUgY2FsbGVkIGZyb20gQGNvZGUsIGFzIEBjb2Rle0B2YWx1ZXtmb28tYmFyX319LCB0aG91Z2guCisgICAgJSBTbyBcbGV0IHRoZW0gdG8gdGhlaXIgbm9ybWFsIGVxdWl2YWxlbnRzLgorICAgIFxsZXQtXHJlYWxkYXNoIFxsZXRfXG5vcm1hbHVuZGVyc2NvcmUKKyAgfQorfQorCislIFdlIGhhdmUgdGhpcyBzdWJyb3V0aW5lIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBhdCBsZWFzdCBzb21lIEB2YWx1ZSdzCislIHByb3Blcmx5IGluIGluZGV4ZXMgKHdlIGNhbGwgXG1ha2V2YWx1ZWV4cGFuZGFibGUgaW4gXGluZGV4ZHVtbWllcykuCislIFRoZSBjb21tYW5kIGhhcyB0byBiZSBmdWxseSBleHBhbmRhYmxlIChpZiB0aGUgdmFyaWFibGUgaXMgc2V0KSwgc2luY2UKKyUgdGhlIHJlc3VsdCB3aW5kcyB1cCBpbiB0aGUgaW5kZXggZmlsZS4gIFRoaXMgbWVhbnMgdGhhdCBpZiB0aGUKKyUgdmFyaWFibGUncyB2YWx1ZSBjb250YWlucyBvdGhlciBUZXhpbmZvIGNvbW1hbmRzLCBpdCdzIGFsbW9zdCBjZXJ0YWluCislIGl0IHdpbGwgZmFpbCAoYWx0aG91Z2ggcGVyaGFwcyB3ZSBjb3VsZCBmaXggdGhhdCB3aXRoIHN1ZmZpY2llbnQgd29yaworJSB0byBkbyBhIG9uZS1sZXZlbCBleHBhbnNpb24gb24gdGhlIHJlc3VsdCwgaW5zdGVhZCBvZiBjb21wbGV0ZSkuCislCitcZGVmXGV4cGFuZGFibGV2YWx1ZSMxeyUKKyAgXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgU0VUIzFcZW5kY3NuYW1lXHJlbGF4CisgICAge1tObyB2YWx1ZSBmb3IgYGAjMScnXX0lCisgICAgXG1lc3NhZ2V7VmFyaWFibGUgYCMxJywgdXNlZCBpbiBAdmFsdWUsIGlzIG5vdCBzZXQufSUKKyAgXGVsc2UKKyAgICBcY3NuYW1lIFNFVCMxXGVuZGNzbmFtZQorICBcZmkKK30KKworJSBAaWZzZXQgVkFSIC4uLiBAZW5kIGlmc2V0IHJlYWRzIHRoZSBgLi4uJyBpZmYgVkFSIGhhcyBiZWVuIGRlZmluZWQKKyUgd2l0aCBAc2V0LgorJQorJSBUbyBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgb2YgYEBlbmQgaWZzZXQsJyBjYWxsIFxtYWtlb25kIGFuZCB0aGUgcmVkZWZpbmUuCislCitcbWFrZWNvbmR7aWZzZXR9CitcZGVmXGlmc2V0e1xwYXJzZWFyZ3tcZG9pZnNldHtcbGV0XG5leHQ9XGlmc2V0ZmFpbH19fQorXGRlZlxkb2lmc2V0IzEjMnslCisgIHslCisgICAgXG1ha2V2YWx1ZWV4cGFuZGFibGUKKyAgICBcbGV0XG5leHQ9XGVtcHR5CisgICAgXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgU0VUIzJcZW5kY3NuYW1lXHJlbGF4CisgICAgICAjMSUgSWYgbm90IHNldCwgcmVkZWZpbmUgXG5leHQuCisgICAgXGZpCisgICAgXGV4cGFuZGFmdGVyCisgIH1cbmV4dAorfQorXGRlZlxpZnNldGZhaWx7XGRvaWdub3Jle2lmc2V0fX0KKworJSBAaWZjbGVhciBWQVIgLi4uIEBlbmQgaWZjbGVhciByZWFkcyB0aGUgYC4uLicgaWZmIFZBUiBoYXMgbmV2ZXIgYmVlbgorJSBkZWZpbmVkIHdpdGggQHNldCwgb3IgaGFzIGJlZW4gdW5kZWZpbmVkIHdpdGggQGNsZWFyLgorJQorJSBUaGUgYFxlbHNlJyBpbnNpZGUgdGhlIGBcZG9pZnNldCcgcGFyYW1ldGVyIGlzIGEgdHJpY2sgdG8gcmV1c2UgdGhlCislIGFib3ZlIGNvZGU6IGlmIHRoZSB2YXJpYWJsZSBpcyBub3Qgc2V0LCBkbyBub3RoaW5nLCBpZiBpdCBpcyBzZXQsCislIHRoZW4gcmVkZWZpbmUgXG5leHQgdG8gXGlmY2xlYXJmYWlsLgorJQorXG1ha2Vjb25ke2lmY2xlYXJ9CitcZGVmXGlmY2xlYXJ7XHBhcnNlYXJne1xkb2lmc2V0e1xlbHNlIFxsZXRcbmV4dD1caWZjbGVhcmZhaWx9fX0KK1xkZWZcaWZjbGVhcmZhaWx7XGRvaWdub3Jle2lmY2xlYXJ9fQorCislIEBkaXJjYXRlZ29yeSBDQVRFR09SWSAgLS0gc3BlY2lmeSBhIGNhdGVnb3J5IG9mIHRoZSBkaXIgZmlsZQorJSB3aGljaCB0aGlzIGZpbGUgc2hvdWxkIGJlbG9uZyB0by4gIElnbm9yZSB0aGlzIGluIFRlWC4KK1xsZXRcZGlyY2F0ZWdvcnk9XGNvbW1lbnQKKworJSBAZGVmaW5pbmZvZW5jbG9zZS4KK1xsZXRcZGVmaW5mb2VuY2xvc2U9XGNvbW1lbnQKKworCitcbWVzc2FnZXtpbmRleGluZyx9CislIEluZGV4IGdlbmVyYXRpb24gZmFjaWxpdGllcworCislIERlZmluZSBcbmV3d3JpdGUgdG8gYmUgaWRlbnRpY2FsIHRvIHBsYWluIHRleCdzIFxuZXd3cml0ZQorJSBleGNlcHQgbm90IFxvdXRlciwgc28gaXQgY2FuIGJlIHVzZWQgd2l0aGluIG1hY3JvcyBhbmQgXGlmJ3MuCitcZWRlZlxuZXd3cml0ZXtcbWFrZWNzbmFtZXtwdGV4bmV3d3JpdGV9fQorCislIFxuZXdpbmRleCB7Zm9vfSBkZWZpbmVzIGFuIGluZGV4IG5hbWVkIGZvby4KKyUgSXQgYXV0b21hdGljYWxseSBkZWZpbmVzIFxmb29pbmRleCBzdWNoIHRoYXQKKyUgXGZvb2luZGV4IC4uLnJlc3Qgb2YgbGluZS4uLiBwdXRzIGFuIGVudHJ5IGluIHRoZSBpbmRleCBmb28uCislIEl0IGFsc28gZGVmaW5lcyBcZm9vaW5kZmlsZSB0byBiZSB0aGUgbnVtYmVyIG9mIHRoZSBvdXRwdXQgY2hhbm5lbCBmb3IKKyUgdGhlIGZpbGUgdGhhdCBhY2N1bXVsYXRlcyB0aGlzIGluZGV4LiAgVGhlIGZpbGUncyBleHRlbnNpb24gaXMgZm9vLgorJSBUaGUgbmFtZSBvZiBhbiBpbmRleCBzaG91bGQgYmUgbm8gbW9yZSB0aGFuIDIgY2hhcmFjdGVycyBsb25nCislIGZvciB0aGUgc2FrZSBvZiB2bXMuCislCitcZGVmXG5ld2luZGV4IzF7JQorICBcaWZsaW5rcworICAgIFxleHBhbmRhZnRlclxuZXd3cml0ZSBcY3NuYW1lIzFpbmRmaWxlXGVuZGNzbmFtZQorICAgIFxvcGVub3V0IFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lIFxqb2JuYW1lLiMxICUgT3BlbiB0aGUgZmlsZQorICBcZmkKKyAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lIzFpbmRleFxlbmRjc25hbWV7JSAgICAgJSBEZWZpbmUgQCMxaW5kZXgKKyAgICBcbm9leHBhbmRcZG9pbmRleHsjMX19Cit9CisKKyUgQGRlZmluZGV4IGZvbyAgPT0gIFxuZXdpbmRleHtmb299CislCitcZGVmXGRlZmluZGV4e1xwYXJzZWFyZ1xuZXdpbmRleH0KKworJSBEZWZpbmUgQGRlZmNvZGVpbmRleCwgbGlrZSBAZGVmaW5kZXggZXhjZXB0IHB1dCBhbGwgZW50cmllcyBpbiBAY29kZS4KKyUKK1xkZWZcZGVmY29kZWluZGV4e1xwYXJzZWFyZ1xuZXdjb2RlaW5kZXh9CislCitcZGVmXG5ld2NvZGVpbmRleCMxeyUKKyAgXGlmbGlua3MKKyAgICBcZXhwYW5kYWZ0ZXJcbmV3d3JpdGUgXGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWUKKyAgICBcb3Blbm91dCBcY3NuYW1lIzFpbmRmaWxlXGVuZGNzbmFtZSBcam9ibmFtZS4jMQorICBcZmkKKyAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lIzFpbmRleFxlbmRjc25hbWV7JQorICAgIFxub2V4cGFuZFxkb2NvZGVpbmRleHsjMX19JQorfQorCisKKyUgQHN5bmluZGV4IGZvbyBiYXIgICAgbWFrZXMgaW5kZXggZm9vIGZlZWQgaW50byBpbmRleCBiYXIuCislIERvIHRoaXMgaW5zdGVhZCBvZiBAZGVmaW5kZXggZm9vIGlmIHlvdSBkb24ndCB3YW50IGl0IGFzIGEgc2VwYXJhdGUgaW5kZXguCislCislIEBzeW5jb2RlaW5kZXggZm9vIGJhciAgIHNpbWlsYXIsIGJ1dCBwdXQgYWxsIGVudHJpZXMgbWFkZSBmb3IgaW5kZXggZm9vCislIGluc2lkZSBAY29kZS4KKyUKK1xkZWZcc3luaW5kZXgjMSAjMiB7XGRvc3luaW5kZXhcZG9pbmRleHsjMX17IzJ9fQorXGRlZlxzeW5jb2RlaW5kZXgjMSAjMiB7XGRvc3luaW5kZXhcZG9jb2RlaW5kZXh7IzF9eyMyfX0KKworJSAjMSBpcyBcZG9pbmRleCBvciBcZG9jb2RlaW5kZXgsICMyIHRoZSBpbmRleCBnZXR0aW5nIHJlZGVmaW5lZCAoZm9vKSwKKyUgIzMgdGhlIHRhcmdldCBpbmRleCAoYmFyKS4KK1xkZWZcZG9zeW5pbmRleCMxIzIjM3slCisgICUgT25seSBkbyBcY2xvc2VvdXQgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGRvbmUgaXQsIGVsc2Ugd2UnbGwgZW5kIHVwCisgICUgY2xvc2luZyB0aGUgdGFyZ2V0IGluZGV4LgorICBcZXhwYW5kYWZ0ZXIgXGlmeFxjc25hbWUgZG9uZXN5bmluZGV4IzJcZW5kY3NuYW1lIFx1bmRlZmluZWQKKyAgICAlIFRoZSBcY2xvc2VvdXQgaGVscHMgcmVkdWNlIHVubmVjZXNzYXJ5IG9wZW4gZmlsZXM7IHRoZSBsaW1pdCBvbiB0aGUKKyAgICAlIEFjb3JuIFJJU0MgT1MgaXMgYSBtZXJlIDE2IGZpbGVzLgorICAgIFxleHBhbmRhZnRlclxjbG9zZW91dFxjc25hbWUjMmluZGZpbGVcZW5kY3NuYW1lCisgICAgXGV4cGFuZGFmdGVyXGxldFxjc25hbWVcZG9uZXN5bmluZGV4IzJcZW5kY3NuYW1lID0gMQorICBcZmkKKyAgJSByZWRlZmluZSBcZm9vaW5kZmlsZToKKyAgXGV4cGFuZGFmdGVyXGxldFxleHBhbmRhZnRlclx0ZW1wXGV4cGFuZGFmdGVyPVxjc25hbWUjM2luZGZpbGVcZW5kY3NuYW1lCisgIFxleHBhbmRhZnRlclxsZXRcY3NuYW1lIzJpbmRmaWxlXGVuZGNzbmFtZT1cdGVtcAorICAlIHJlZGVmaW5lIFxmb29pbmRleDoKKyAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lIzJpbmRleFxlbmRjc25hbWV7XG5vZXhwYW5kIzF7IzN9fSUKK30KKworJSBEZWZpbmUgXGRvaW5kZXgsIHRoZSBkcml2ZXIgZm9yIGFsbCBcZm9vaW5kZXggbWFjcm9zLgorJSBBcmd1bWVudCAjMSBpcyBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxpbmcgXGZvb2luZGV4IG1hY3JvLAorJSAgYW5kIGl0IGlzICJmb28iLCB0aGUgbmFtZSBvZiB0aGUgaW5kZXguCisKKyUgXGRvaW5kZXgganVzdCB1c2VzIFxwYXJzZWFyZzsgaXQgY2FsbHMgXGRvaW5kIGZvciB0aGUgYWN0dWFsIHdvcmsuCislIFRoaXMgaXMgYmVjYXVzZSBcZG9pbmQgaXMgbW9yZSB1c2VmdWwgdG8gY2FsbCBmcm9tIG90aGVyIG1hY3Jvcy4KKworJSBUaGVyZSBpcyBhbHNvIFxkb3N1YmluZCB7aW5kZXh9e3RvcGljfXtzdWJ0b3BpY30KKyUgd2hpY2ggbWFrZXMgYW4gZW50cnkgaW4gYSB0d28tbGV2ZWwgaW5kZXggc3VjaCBhcyB0aGUgb3BlcmF0aW9uIGluZGV4LgorCitcZGVmXGRvaW5kZXgjMXtcZWRlZlxpbmRleG5hbWV7IzF9XHBhcnNlYXJnXHNpbmdsZWluZGV4ZXJ9CitcZGVmXHNpbmdsZWluZGV4ZXIgIzF7XGRvaW5ke1xpbmRleG5hbWV9eyMxfX0KKworJSBsaWtlIHRoZSBwcmV2aW91cyB0d28sIGJ1dCB0aGV5IHB1dCBAY29kZSBhcm91bmQgdGhlIGFyZ3VtZW50LgorXGRlZlxkb2NvZGVpbmRleCMxe1xlZGVmXGluZGV4bmFtZXsjMX1ccGFyc2Vhcmdcc2luZ2xlY29kZWluZGV4ZXJ9CitcZGVmXHNpbmdsZWNvZGVpbmRleGVyICMxe1xkb2luZHtcaW5kZXhuYW1lfXtcY29kZXsjMX19fQorCislIFRha2UgY2FyZSBvZiBUZXhpbmZvIGNvbW1hbmRzIHRoYXQgY2FuIGFwcGVhciBpbiBhbiBpbmRleCBlbnRyeS4KKyUgU2luY2UgdGhlcmUgYXJlIHNvbWUgY29tbWFuZHMgd2Ugd2FudCB0byBleHBhbmQsIGFuZCBvdGhlcnMgd2UgZG9uJ3QsCislIHdlIGhhdmUgdG8gbGFib3Jpb3VzbHkgcHJldmVudCBleHBhbnNpb24gZm9yIHRob3NlIHRoYXQgd2UgZG9uJ3QuCislCitcZGVmXGluZGV4ZHVtbWllc3slCisgIFxkZWZcQHtAfSUgY2hhbmdlIHRvIEBAIHdoZW4gd2Ugc3dpdGNoIHRvIEAgYXMgZXNjYXBlIGNoYXIgaW4gaW5kZXggZmlsZXMuCisgIFxkZWZcIHtccmVhbGJhY2tzbGFzaFxzcGFjZSB9JQorICAlIE5lZWQgdGhlc2UgaW4gY2FzZSBcdGV4IGlzIGluIGVmZmVjdCBhbmQgXHsgaXMgYSBcZGVsaW1pdGVyIGFnYWluLgorICAlIEJ1dCBjYW4ndCB1c2UgXGxicmFjZWNtZCBhbmQgXHJicmFjZWNtZCBiZWNhdXNlIHRleGluZGV4IGFzc3VtZXMKKyAgJSBicmFjZXMgYW5kIGJhY2tzbGFzaGVzIGFyZSB1c2VkIG9ubHkgYXMgZGVsaW1pdGVycy4KKyAgXGxldFx7ID0gXG15bGJyYWNlCisgIFxsZXRcfSA9IFxteXJicmFjZQorICAlCisgICUgXGRlZmluZWR1bW15d29yZCBkZWZpbmVzIFwjMSBhcyBccmVhbGJhY2tzbGFzaCAjMVxzcGFjZSwgdGh1cworICAlIGVmZmVjdGl2ZWx5IHByZXZlbnRpbmcgaXRzIGV4cGFuc2lvbi4gIFRoaXMgaXMgdXNlZCBvbmx5IGZvciBjb250cm9sCisgICUgd29yZHMsIG5vdCBjb250cm9sIGxldHRlcnMsIGJlY2F1c2UgdGhlIFxzcGFjZSB3b3VsZCBiZSBpbmNvcnJlY3QKKyAgJSBmb3IgY29udHJvbCBjaGFyYWN0ZXJzLCBidXQgaXMgbmVlZGVkIHRvIHNlcGFyYXRlIHRoZSBjb250cm9sIHdvcmQKKyAgJSBmcm9tIHdoYXRldmVyIGZvbGxvd3MuCisgICUKKyAgJSBGb3IgY29udHJvbCBsZXR0ZXJzLCB3ZSBoYXZlIFxkZWZpbmVkdW1teWxldHRlciwgd2hpY2ggb21pdHMgdGhlCisgICUgc3BhY2UuCisgICUKKyAgJSBUaGVzZSBjYW4gYmUgdXNlZCBib3RoIGZvciBjb250cm9sIHdvcmRzIHRoYXQgdGFrZSBhbiBhcmd1bWVudCBhbmQKKyAgJSB0aG9zZSB0aGF0IGRvIG5vdC4gIElmIGl0IGlzIGZvbGxvd2VkIGJ5IHthcmd9IGluIHRoZSBpbnB1dCwgdGhlbgorICAlIHRoYXQgd2lsbCBkdXRpZnVsbHkgZ2V0IHdyaXR0ZW4gdG8gdGhlIGluZGV4IChvciB3aGVyZXZlcikuCisgICUKKyAgXGRlZlxkZWZpbmVkdW1teXdvcmQjIzF7JQorICAgIFxleHBhbmRhZnRlclxkZWZcY3NuYW1lICMjMVxlbmRjc25hbWV7XHJlYWxiYWNrc2xhc2ggIyMxXHNwYWNlfSUKKyAgfSUKKyAgXGRlZlxkZWZpbmVkdW1teWxldHRlciMjMXslCisgICAgXGV4cGFuZGFmdGVyXGRlZlxjc25hbWUgIyMxXGVuZGNzbmFtZXtccmVhbGJhY2tzbGFzaCAjIzF9JQorICB9JQorICBcbGV0XGRlZmluZWR1bW15YWNjZW50XGRlZmluZWR1bW15bGV0dGVyCisgICUKKyAgJSBEbyB0aGUgcmVkZWZpbml0aW9ucy4KKyAgXGNvbW1vbmR1bW1pZXMKK30KKworJSBGb3IgdGhlIGF1eCBmaWxlLCBAIGlzIHRoZSBlc2NhcGUgY2hhcmFjdGVyLiAgU28gd2Ugd2FudCB0byByZWRlZmluZQorJSBldmVyeXRoaW5nIHVzaW5nIEAgaW5zdGVhZCBvZiBccmVhbGJhY2tzbGFzaC4gIFdoZW4gZXZlcnl0aGluZyB1c2VzCislIEAsIHRoaXMgd2lsbCBiZSBzaW1wbGVyLgorJQorXGRlZlxhdGR1bW1pZXN7JQorICBcZGVmXEB7QEB9JQorICBcZGVmXCB7QCB9JQorICBcbGV0XHsgPSBcbGJyYWNlYXRjbWQKKyAgXGxldFx9ID0gXHJicmFjZWF0Y21kCisgICUKKyAgJSAoU2VlIGNvbW1lbnRzIGluIFxpbmRleGR1bW1pZXMuKQorICBcZGVmXGRlZmluZWR1bW15d29yZCMjMXslCisgICAgXGV4cGFuZGFmdGVyXGRlZlxjc25hbWUgIyMxXGVuZGNzbmFtZXtAIyMxXHNwYWNlfSUKKyAgfSUKKyAgXGRlZlxkZWZpbmVkdW1teWxldHRlciMjMXslCisgICAgXGV4cGFuZGFmdGVyXGRlZlxjc25hbWUgIyMxXGVuZGNzbmFtZXtAIyMxfSUKKyAgfSUKKyAgXGxldFxkZWZpbmVkdW1teWFjY2VudFxkZWZpbmVkdW1teWxldHRlcgorICAlCisgICUgRG8gdGhlIHJlZGVmaW5pdGlvbnMuCisgIFxjb21tb25kdW1taWVzCit9CisKKyUgQ2FsbGVkIGZyb20gXGluZGV4ZHVtbWllcyBhbmQgXGF0ZHVtbWllcy4gIFxkZWZpbmVkdW1teXdvcmQgYW5kCislIFxkZWZpbmVkdW1teWxldHRlciBtdXN0IGJlIGRlZmluZWQgZmlyc3QuCislCitcZGVmXGNvbW1vbmR1bW1pZXN7JQorICAlCisgIFxub3JtYWx0dXJub2ZmYWN0aXZlCisgICUKKyAgXGNvbW1vbmR1bW1pZXNub2ZvbnRzCisgICUKKyAgXGRlZmluZWR1bW15bGV0dGVye199JQorICAlCisgICUgTm9uLUVuZ2xpc2ggbGV0dGVycy4KKyAgXGRlZmluZWR1bW15d29yZHtBQX0lCisgIFxkZWZpbmVkdW1teXdvcmR7QUV9JQorICBcZGVmaW5lZHVtbXl3b3Jke0x9JQorICBcZGVmaW5lZHVtbXl3b3Jke09FfSUKKyAgXGRlZmluZWR1bW15d29yZHtPfSUKKyAgXGRlZmluZWR1bW15d29yZHthYX0lCisgIFxkZWZpbmVkdW1teXdvcmR7YWV9JQorICBcZGVmaW5lZHVtbXl3b3Jke2x9JQorICBcZGVmaW5lZHVtbXl3b3Jke29lfSUKKyAgXGRlZmluZWR1bW15d29yZHtvfSUKKyAgXGRlZmluZWR1bW15d29yZHtzc30lCisgIFxkZWZpbmVkdW1teXdvcmR7ZXhjbGFtZG93bn0lCisgIFxkZWZpbmVkdW1teXdvcmR7cXVlc3Rpb25kb3dufSUKKyAgXGRlZmluZWR1bW15d29yZHtvcmRmfSUKKyAgXGRlZmluZWR1bW15d29yZHtvcmRtfSUKKyAgJQorICAlIEFsdGhvdWdoIHRoZXNlIGludGVybmFsIGNvbW1hbmRzIHNob3VsZG4ndCBzaG93IHVwLCBzb21ldGltZXMgdGhleSBkby4KKyAgXGRlZmluZWR1bW15d29yZHtiZn0lCisgIFxkZWZpbmVkdW1teXdvcmR7Z3RyfSUKKyAgXGRlZmluZWR1bW15d29yZHtoYXR9JQorICBcZGVmaW5lZHVtbXl3b3Jke2xlc3N9JQorICBcZGVmaW5lZHVtbXl3b3Jke3NmfSUKKyAgXGRlZmluZWR1bW15d29yZHtzbH0lCisgIFxkZWZpbmVkdW1teXdvcmR7dGNsb3NlfSUKKyAgXGRlZmluZWR1bW15d29yZHt0dH0lCisgICUKKyAgXGRlZmluZWR1bW15d29yZHtMYVRlWH0lCisgIFxkZWZpbmVkdW1teXdvcmR7VGVYfSUKKyAgJQorICAlIEFzc29ydGVkIHNwZWNpYWwgY2hhcmFjdGVycy4KKyAgXGRlZmluZWR1bW15d29yZHtidWxsZXR9JQorICBcZGVmaW5lZHVtbXl3b3Jke2NvbW1hfSUKKyAgXGRlZmluZWR1bW15d29yZHtjb3B5cmlnaHR9JQorICBcZGVmaW5lZHVtbXl3b3Jke3JlZ2lzdGVyZWRzeW1ib2x9JQorICBcZGVmaW5lZHVtbXl3b3Jke2RvdHN9JQorICBcZGVmaW5lZHVtbXl3b3Jke2VuZGRvdHN9JQorICBcZGVmaW5lZHVtbXl3b3Jke2VxdWl2fSUKKyAgXGRlZmluZWR1bW15d29yZHtlcnJvcn0lCisgIFxkZWZpbmVkdW1teXdvcmR7ZXVyb30lCisgIFxkZWZpbmVkdW1teXdvcmR7ZXhwYW5zaW9ufSUKKyAgXGRlZmluZWR1bW15d29yZHttaW51c30lCisgIFxkZWZpbmVkdW1teXdvcmR7cG91bmRzfSUKKyAgXGRlZmluZWR1bW15d29yZHtwb2ludH0lCisgIFxkZWZpbmVkdW1teXdvcmR7cHJpbnR9JQorICBcZGVmaW5lZHVtbXl3b3Jke3Jlc3VsdH0lCisgICUKKyAgJSBIYW5kbGUgc29tZSBjYXNlcyBvZiBAdmFsdWUgLS0gd2hlcmUgaXQgZG9lcyBub3QgY29udGFpbiBhbnkKKyAgJSAobm9uLWZ1bGx5LWV4cGFuZGFibGUpIGNvbW1hbmRzLgorICBcbWFrZXZhbHVlZXhwYW5kYWJsZQorICAlCisgICUgTm9ybWFsIHNwYWNlcywgbm90IGFjdGl2ZSBvbmVzLgorICBcdW5zZXBzcGFjZXMKKyAgJQorICAlIE5vIG1hY3JvIGV4cGFuc2lvbi4KKyAgXHR1cm5vZmZtYWNyb3MKK30KKworJSBcY29tbW9uZHVtbWllc25vZm9udHM6IGNvbW1vbiB0byBcY29tbW9uZHVtbWllcyBhbmQgXGluZGV4bm9mb250cy4KKyUKKyUgQmV0dGVyIGhhdmUgdGhpcyB3aXRob3V0IGFjdGl2ZSBjaGFycy4KK3sKKyAgXGNhdGNvZGVgXH49XG90aGVyCisgIFxnZGVmXGNvbW1vbmR1bW1pZXNub2ZvbnRzeyUKKyAgICAlIENvbnRyb2wgbGV0dGVycyBhbmQgYWNjZW50cy4KKyAgICBcZGVmaW5lZHVtbXlsZXR0ZXJ7IX0lCisgICAgXGRlZmluZWR1bW15YWNjZW50eyJ9JQorICAgIFxkZWZpbmVkdW1teWFjY2VudHsnfSUKKyAgICBcZGVmaW5lZHVtbXlsZXR0ZXJ7Kn0lCisgICAgXGRlZmluZWR1bW15YWNjZW50eyx9JQorICAgIFxkZWZpbmVkdW1teWxldHRlcnsufSUKKyAgICBcZGVmaW5lZHVtbXlsZXR0ZXJ7L30lCisgICAgXGRlZmluZWR1bW15bGV0dGVyezp9JQorICAgIFxkZWZpbmVkdW1teWFjY2VudHs9fSUKKyAgICBcZGVmaW5lZHVtbXlsZXR0ZXJ7P30lCisgICAgXGRlZmluZWR1bW15YWNjZW50e159JQorICAgIFxkZWZpbmVkdW1teWFjY2VudHtgfSUKKyAgICBcZGVmaW5lZHVtbXlhY2NlbnR7fn0lCisgICAgXGRlZmluZWR1bW15d29yZHt1fSUKKyAgICBcZGVmaW5lZHVtbXl3b3Jke3Z9JQorICAgIFxkZWZpbmVkdW1teXdvcmR7SH0lCisgICAgXGRlZmluZWR1bW15d29yZHtkb3RhY2NlbnR9JQorICAgIFxkZWZpbmVkdW1teXdvcmR7cmluZ2FjY2VudH0lCisgICAgXGRlZmluZWR1bW15d29yZHt0aWVhY2NlbnR9JQorICAgIFxkZWZpbmVkdW1teXdvcmR7dWJhcmFjY2VudH0lCisgICAgXGRlZmluZWR1bW15d29yZHt1ZG90YWNjZW50fSUKKyAgICBcZGVmaW5lZHVtbXl3b3Jke2RvdGxlc3N9JQorICAgICUKKyAgICAlIFRleGluZm8gZm9udCBjb21tYW5kcy4KKyAgICBcZGVmaW5lZHVtbXl3b3Jke2J9JQorICAgIFxkZWZpbmVkdW1teXdvcmR7aX0lCisgICAgXGRlZmluZWR1bW15d29yZHtyfSUKKyAgICBcZGVmaW5lZHVtbXl3b3Jke3NjfSUKKyAgICBcZGVmaW5lZHVtbXl3b3Jke3R9JQorICAgICUKKyAgICAlIENvbW1hbmRzIHRoYXQgdGFrZSBhcmd1bWVudHMuCisgICAgXGRlZmluZWR1bW15d29yZHthY3JvbnltfSUKKyAgICBcZGVmaW5lZHVtbXl3b3Jke2NpdGV9JQorICAgIFxkZWZpbmVkdW1teXdvcmR7Y29kZX0lCisgICAgXGRlZmluZWR1bW15d29yZHtjb21tYW5kfSUKKyAgICBcZGVmaW5lZHVtbXl3b3Jke2Rmbn0lCisgICAgXGRlZmluZWR1bW15d29yZHtlbXBofSUKKyAgICBcZGVmaW5lZHVtbXl3b3Jke2Vudn0lCisgICAgXGRlZmluZWR1bW15d29yZHtmaWxlfSUKKyAgICBcZGVmaW5lZHVtbXl3b3Jke2tiZH0lCisgICAgXGRlZmluZWR1bW15d29yZHtrZXl9JQorICAgIFxkZWZpbmVkdW1teXdvcmR7bWF0aH0lCisgICAgXGRlZmluZWR1bW15d29yZHtvcHRpb259JQorICAgIFxkZWZpbmVkdW1teXdvcmR7c2FtcH0lCisgICAgXGRlZmluZWR1bW15d29yZHtzdHJvbmd9JQorICAgIFxkZWZpbmVkdW1teXdvcmR7dGllfSUKKyAgICBcZGVmaW5lZHVtbXl3b3Jke3VyZWZ9JQorICAgIFxkZWZpbmVkdW1teXdvcmR7dXJsfSUKKyAgICBcZGVmaW5lZHVtbXl3b3Jke3Zhcn0lCisgICAgXGRlZmluZWR1bW15d29yZHt2ZXJifSUKKyAgICBcZGVmaW5lZHVtbXl3b3Jke3d9JQorICB9Cit9CisKKyUgXGluZGV4bm9mb250cyBpcyB1c2VkIHdoZW4gb3V0cHV0dGluZyB0aGUgc3RyaW5ncyB0byBzb3J0IHRoZSBpbmRleAorJSBieSwgYW5kIHdoZW4gY29uc3RydWN0aW5nIGNvbnRyb2wgc2VxdWVuY2UgbmFtZXMuICBJdCBlbGltaW5hdGVzIGFsbAorJSBjb250cm9sIHNlcXVlbmNlcyBhbmQganVzdCB3cml0ZXMgd2hhdGV2ZXIgdGhlIGJlc3QgQVNDSUkgc29ydCBzdHJpbmcKKyUgd291bGQgYmUgZm9yIGEgZ2l2ZW4gY29tbWFuZCAodXN1YWxseSBpdHMgYXJndW1lbnQpLgorJQorXGRlZlxpbmRleG5vZm9udHN7JQorICAlIEFjY2VudCBjb21tYW5kcyBzaG91bGQgYmVjb21lIEBhc2lzLgorICBcZGVmXGRlZmluZWR1bW15YWNjZW50IyMxeyUKKyAgICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSAjIzFcZW5kY3NuYW1lXGFzaXMKKyAgfSUKKyAgJSBXZSBjYW4ganVzdCBpZ25vcmUgb3RoZXIgY29udHJvbCBsZXR0ZXJzLgorICBcZGVmXGRlZmluZWR1bW15bGV0dGVyIyMxeyUKKyAgICBcZXhwYW5kYWZ0ZXJcZGVmXGNzbmFtZSAjIzFcZW5kY3NuYW1le30lCisgIH0lCisgICUgSG9wZWZ1bGx5LCBhbGwgY29udHJvbCB3b3JkcyBjYW4gYmVjb21lIEBhc2lzLgorICBcbGV0XGRlZmluZWR1bW15d29yZFxkZWZpbmVkdW1teWFjY2VudAorICAlCisgIFxjb21tb25kdW1taWVzbm9mb250cworICAlCisgICUgRG9uJ3Qgbm8tb3AgXHR0LCBzaW5jZSBpdCBpc24ndCBhIHVzZXItbGV2ZWwgY29tbWFuZAorICAlIGFuZCBpcyB1c2VkIGluIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgYWN0aXZlIGNoYXJzIGxpa2UgPCwgPiwgfCwgZXRjLgorICAlIExpa2V3aXNlIHdpdGggdGhlIG90aGVyIHBsYWluIHRleCBmb250IGNvbW1hbmRzLgorICAlXGxldFx0dD1cYXNpcworICAlCisgIFxkZWZcIHsgfSUKKyAgXGRlZlxAe0B9JQorICAlIGhvdyB0byBoYW5kbGUgYnJhY2VzPworICBcZGVmXF97XG5vcm1hbHVuZGVyc2NvcmV9JQorICAlCisgICUgTm9uLUVuZ2xpc2ggbGV0dGVycy4KKyAgXGRlZlxBQXtBQX0lCisgIFxkZWZcQUV7QUV9JQorICBcZGVmXEx7TH0lCisgIFxkZWZcT0V7T0V9JQorICBcZGVmXE97T30lCisgIFxkZWZcYWF7YWF9JQorICBcZGVmXGFle2FlfSUKKyAgXGRlZlxse2x9JQorICBcZGVmXG9le29lfSUKKyAgXGRlZlxve299JQorICBcZGVmXHNze3NzfSUKKyAgXGRlZlxleGNsYW1kb3dueyF9JQorICBcZGVmXHF1ZXN0aW9uZG93bns/fSUKKyAgXGRlZlxvcmRme2F9JQorICBcZGVmXG9yZG17b30lCisgICUKKyAgXGRlZlxMYVRlWHtMYVRlWH0lCisgIFxkZWZcVGVYe1RlWH0lCisgICUKKyAgJSBBc3NvcnRlZCBzcGVjaWFsIGNoYXJhY3RlcnMuCisgICUgKFRoZSBmb2xsb3dpbmcge30gd2lsbCBlbmQgdXAgaW4gdGhlIHNvcnQgc3RyaW5nLCBidXQgdGhhdCdzIG9rLikKKyAgXGRlZlxidWxsZXR7YnVsbGV0fSUKKyAgXGRlZlxjb21tYXssfSUKKyAgXGRlZlxjb3B5cmlnaHR7Y29weXJpZ2h0fSUKKyAgXGRlZlxyZWdpc3RlcmVkc3ltYm9se1J9JQorICBcZGVmXGRvdHN7Li4ufSUKKyAgXGRlZlxlbmRkb3Rzey4uLn0lCisgIFxkZWZcZXF1aXZ7PT19JQorICBcZGVmXGVycm9ye2Vycm9yfSUKKyAgXGRlZlxldXJve2V1cm99JQorICBcZGVmXGV4cGFuc2lvbns9PT59JQorICBcZGVmXG1pbnVzey19JQorICBcZGVmXHBvdW5kc3twb3VuZHN9JQorICBcZGVmXHBvaW50ey59JQorICBcZGVmXHByaW50ey18fSUKKyAgXGRlZlxyZXN1bHR7PT59JQorICAlCisgICUgRG9uJ3Qgd3JpdGUgbWFjcm8gbmFtZXMuCisgIFxlbXB0eXVzZXJtYWNyb3MKK30KKworXGxldFxpbmRleGJhY2tzbGFzaD0wICAlb3ZlcnJpZGRlbiBkdXJpbmcgXHByaW50aW5kZXguCitcbGV0XFNFVG1hcmdpbmluZGV4PVxyZWxheCAlIHB1dCBpbmRleCBlbnRyaWVzIGluIG1hcmdpbiAodW5kb2N1bWVudGVkKT8KKworJSBNb3N0IGluZGV4IGVudHJpZXMgZ28gdGhyb3VnaCBoZXJlLCBidXQgXGRvc3ViaW5kIGlzIHRoZSBnZW5lcmFsIGNhc2UuCislICMxIGlzIHRoZSBpbmRleCBuYW1lLCAjMiBpcyB0aGUgZW50cnkgdGV4dC4KK1xkZWZcZG9pbmQjMSMye1xkb3N1YmluZHsjMX17IzJ9e319CisKKyUgV29ya2hvcnNlIGZvciBhbGwgXGZvb2luZGV4ZXMuCislICMxIGlzIG5hbWUgb2YgaW5kZXgsICMyIGlzIHN0dWZmIHRvIHB1dCB0aGVyZSwgIzMgaXMgc3ViZW50cnkgLS0KKyUgZW1wdHkgaWYgY2FsbGVkIGZyb20gXGRvaW5kLCBhcyB3ZSB1c3VhbGx5IGFyZSAodGhlIG1haW4gZXhjZXB0aW9uCislIGlzIHdpdGggbW9zdCBkZWZ1bnMsIHdoaWNoIGNhbGwgdXMgZGlyZWN0bHkpLgorJQorXGRlZlxkb3N1YmluZCMxIzIjM3slCisgIFxpZmxpbmtzCisgIHslCisgICAgJSBTdG9yZSB0aGUgbWFpbiBpbmRleCBlbnRyeSB0ZXh0IChpbmNsdWRpbmcgdGhlIHRoaXJkIGFyZykuCisgICAgXHRva3MwID0geyMyfSUKKyAgICAlIElmIHRoaXJkIGFyZyBpcyBwcmVzZW50LCBwcmVjZWRlIGl0IHdpdGggYSBzcGFjZS4KKyAgICBcZGVmXHRoaXJkYXJneyMzfSUKKyAgICBcaWZ4XHRoaXJkYXJnXGVtcHR5IFxlbHNlCisgICAgICBcdG9rczAgPSBcZXhwYW5kYWZ0ZXJ7XHRoZVx0b2tzMCBcc3BhY2UgIzN9JQorICAgIFxmaQorICAgICUKKyAgICBcZWRlZlx3cml0ZXRve1xjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lfSUKKyAgICAlCisgICAgXGlmdm1vZGUKKyAgICAgIFxkb3N1YmluZHNhbml0aXplCisgICAgXGVsc2UKKyAgICAgIFxkb3N1YmluZHdyaXRlCisgICAgXGZpCisgIH0lCisgIFxmaQorfQorCislIFdyaXRlIHRoZSBlbnRyeSBpbiBcdG9rczAgdG8gdGhlIGluZGV4IGZpbGU6CislCitcZGVmXGRvc3ViaW5kd3JpdGV7JQorICAlIFB1dCB0aGUgaW5kZXggZW50cnkgaW4gdGhlIG1hcmdpbiBpZiBkZXNpcmVkLgorICBcaWZ4XFNFVG1hcmdpbmluZGV4XHJlbGF4XGVsc2UKKyAgICBcaW5zZXJ0XG1hcmdpbntcaGJveHtcdnJ1bGUgaGVpZ2h0OHB0IGRlcHRoM3B0IHdpZHRoMHB0IFx0aGVcdG9rczB9fSUKKyAgXGZpCisgICUKKyAgJSBSZW1lbWJlciwgd2UgYXJlIHdpdGhpbiBhIGdyb3VwLgorICBcaW5kZXhkdW1taWVzICUgTXVzdCBkbyB0aGlzIGhlcmUsIHNpbmNlIFxiZiwgZXRjIGV4cGFuZCBhdCB0aGlzIHN0YWdlCisgIFxlc2NhcGVjaGFyPWBcXAorICBcZGVmXGJhY2tzbGFzaGN1cmZvbnR7XGluZGV4YmFja3NsYXNofSUgXGluZGV4YmFja3NsYXNoIGlzbid0IGRlZmluZWQgbm93CisgICAgICAlIHNvIGl0IHdpbGwgYmUgb3V0cHV0IGFzIGlzOyBhbmQgaXQgd2lsbCBwcmludCBhcyBiYWNrc2xhc2guCisgICUKKyAgJSBQcm9jZXNzIHRoZSBpbmRleCBlbnRyeSB3aXRoIGFsbCBmb250IGNvbW1hbmRzIHR1cm5lZCBvZmYsIHRvCisgICUgZ2V0IHRoZSBzdHJpbmcgdG8gc29ydCBieS4KKyAge1xpbmRleG5vZm9udHMKKyAgIFxlZGVmXHRlbXB7XHRoZVx0b2tzMH0lIG5lZWQgZnVsbCBleHBhbnNpb24KKyAgIFx4ZGVmXGluZGV4c29ydHRtcHtcdGVtcH0lCisgIH0lCisgICUKKyAgJSBTZXQgdXAgdGhlIGNvbXBsZXRlIGluZGV4IGVudHJ5LCB3aXRoIGJvdGggdGhlIHNvcnQga2V5IGFuZAorICAlIHRoZSBvcmlnaW5hbCB0ZXh0LCBpbmNsdWRpbmcgYW55IGZvbnQgY29tbWFuZHMuICBXZSB3cml0ZQorICAlIHRocmVlIGFyZ3VtZW50cyB0byBcZW50cnkgdG8gdGhlIC4/PyBmaWxlIChmb3VyIGluIHRoZQorICAlIHN1YmVudHJ5IGNhc2UpLCB0ZXhpbmRleCByZWR1Y2VzIHRvIHR3byB3aGVuIHdyaXRpbmcgdGhlIC4/P3MKKyAgJSBzb3J0ZWQgcmVzdWx0LgorICBcZWRlZlx0ZW1weyUKKyAgICBcd3JpdGVcd3JpdGV0b3slCisgICAgICBcc3RyaW5nXGVudHJ5e1xpbmRleHNvcnR0bXB9e1xub2V4cGFuZFxmb2xpb317XHRoZVx0b2tzMH19JQorICB9JQorICBcdGVtcAorfQorCislIFRha2UgY2FyZSBvZiB1bndhbnRlZCBwYWdlIGJyZWFrczoKKyUKKyUgSWYgYSBza2lwIGlzIHRoZSBsYXN0IHRoaW5nIG9uIHRoZSBsaXN0IG5vdywgcHJlc2VydmUgaXQKKyUgYnkgYmFja2luZyB1cCBieSBcbGFzdHNraXAsIGRvaW5nIHRoZSBcd3JpdGUsIHRoZW4gaW5zZXJ0aW5nCislIHRoZSBza2lwIGFnYWluLiAgT3RoZXJ3aXNlLCB0aGUgd2hhdHNpdCBnZW5lcmF0ZWQgYnkgdGhlCislIFx3cml0ZSB3aWxsIG1ha2UgXGxhc3Rza2lwIHplcm8uICBUaGUgcmVzdWx0IGlzIHRoYXQgc2VxdWVuY2VzCislIGxpa2UgdGhpczoKKyUgQGVuZCBkZWZ1bgorJSBAdGluZGV4IHdoYXRldmVyCislIEBkZWZ1biAuLi4KKyUgd2lsbCBoYXZlIGV4dHJhIHNwYWNlIGluc2VydGVkLCBiZWNhdXNlIHRoZSBcbWVkYnJlYWsgaW4gdGhlCislIHN0YXJ0IG9mIHRoZSBAZGVmdW4gd29uJ3Qgc2VlIHRoZSBza2lwIGluc2VydGVkIGJ5IHRoZSBAZW5kIG9mCislIHRoZSBwcmV2aW91cyBkZWZ1bi4KKyUKKyUgQnV0IGRvbid0IGRvIGFueSBvZiB0aGlzIGlmIHdlJ3JlIG5vdCBpbiB2ZXJ0aWNhbCBtb2RlLiAgV2UKKyUgZG9uJ3Qgd2FudCB0byBkbyBhIFx2c2tpcCBhbmQgcHJlbWF0dXJlbHkgZW5kIGEgcGFyYWdyYXBoLgorJQorJSBBdm9pZCBwYWdlIGJyZWFrcyBkdWUgdG8gdGhlc2UgZXh0cmEgc2tpcHMsIHRvby4KKyUKKyUgQnV0IHdhaXQsIHRoZXJlIGlzIGEgY2F0Y2ggdGhlcmU6CislIFdlJ2xsIGhhdmUgdG8gY2hlY2sgd2hldGhlciBcbGFzdHNraXAgaXMgemVybyBza2lwLiAgXGlmZGltIGlzIG5vdAorJSBzdWZmaWNpZW50IGZvciB0aGlzIHB1cnBvc2UsIGFzIGl0IGlnbm9yZXMgc3RyZXRjaCBhbmQgc2hyaW5rIHBhcnRzCislIG9mIHRoZSBza2lwLiAgVGhlIG9ubHkgd2F5IHNlZW1zIHRvIGJlIHRvIGNoZWNrIHRoZSB0ZXh0dWFsCislIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBza2lwLgorJQorJSBUaGUgZm9sbG93aW5nIGlzIGFsbW9zdCBsaWtlIFxkZWZcemVyb3NraXBtYWNyb3swLjBwdH0gZXhjZXB0IHRoYXQKKyUgdGhlIGBgcCcnIGFuZCBgYHQnJyBjaGFyYWN0ZXJzIGhhdmUgY2F0Y29kZSBcb3RoZXIsIG5vdCAxMSAobGV0dGVyKS4KKyUKK1xlZGVmXHplcm9za2lwbWFjcm97XGV4cGFuZGFmdGVyXHRoZVxjc25hbWUgekBza2lwXGVuZGNzbmFtZX0KKyUKKyUgLi4uLCByZWFkeSwgR086CislCitcZGVmXGRvc3ViaW5kc2FuaXRpemV7JQorICAlIFxsYXN0c2tpcCBhbmQgXGxhc3RwZW5hbHR5IGNhbm5vdCBib3RoIGJlIG5vbnplcm8gc2ltdWx0YW5lb3VzbHkuCisgIFxza2lwMCA9IFxsYXN0c2tpcAorICBcZWRlZlxsYXN0c2tpcG1hY3Jve1x0aGVcbGFzdHNraXB9JQorICBcY291bnQyNTUgPSBcbGFzdHBlbmFsdHkKKyAgJQorICAlIElmIFxsYXN0c2tpcCBpcyBub256ZXJvLCB0aGF0IG1lYW5zIHRoZSBsYXN0IGl0ZW0gd2FzIGEKKyAgJSBza2lwLiAgQW5kIHNpbmNlIGEgc2tpcCBpcyBkaXNjYXJkYWJsZSwgdGhhdCBtZWFucyB0aGlzCisgICUgLVxza2lwMCBnbHVlIHdlJ3JlIGluc2VydGluZyBpcyBwcmVjZWRlZCBieSBhCisgICUgbm9uLWRpc2NhcmRhYmxlIGl0ZW0sIHRoZXJlZm9yZSBpdCBpcyBub3QgYSBwb3RlbnRpYWwKKyAgJSBicmVha3BvaW50LCB0aGVyZWZvcmUgbm8gXG5vYnJlYWsgbmVlZGVkLgorICBcaWZ4XGxhc3Rza2lwbWFjcm9cemVyb3NraXBtYWNybworICBcZWxzZQorICAgIFx2c2tpcC1cc2tpcDAKKyAgXGZpCisgICUKKyAgXGRvc3ViaW5kd3JpdGUKKyAgJQorICBcaWZ4XGxhc3Rza2lwbWFjcm9cemVyb3NraXBtYWNybworICAgICUgSWYgXGxhc3Rza2lwIHdhcyB6ZXJvLCBwZXJoYXBzIHRoZSBsYXN0IGl0ZW0gd2FzIGEgcGVuYWx0eSwgYW5kCisgICAgJSBwZXJoYXBzIGl0IHdhcyA+PTEwMDAwLCBlLmcuLCBhIFxub2JyZWFrLiAgSW4gdGhhdCBjYXNlLCB3ZSB3YW50CisgICAgJSB0byByZS1pbnNlcnQgdGhlIHNhbWUgcGVuYWx0eSAodmFsdWVzID4xMDAwMCBhcmUgdXNlZCBmb3IgdmFyaW91cworICAgICUgc2lnbmFscyk7IHNpbmNlIHdlIGp1c3QgaW5zZXJ0ZWQgYSBub24tZGlzY2FyZGFibGUgaXRlbSwgYW55CisgICAgJSBmb2xsb3dpbmcgZ2x1ZSAoc3VjaCBhcyBhIFxwYXJza2lwKSB3b3VsZCBiZSBhIGJyZWFrcG9pbnQuICBGb3IgZXhhbXBsZToKKyAgICAlIAorICAgICUgICBAZGVmZm4gZGVmZm4td2hhdGV2ZXIKKyAgICAlICAgQHZpbmRleCBpbmRleC13aGF0ZXZlcgorICAgICUgICBEZXNjcmlwdGlvbi4KKyAgICAlIHdvdWxkIGFsbG93IGEgYnJlYWsgYmV0d2VlbiB0aGUgaW5kZXgtd2hhdGV2ZXIgd2hhdHNpdAorICAgICUgYW5kIHRoZSAiRGVzY3JpcHRpb24uIiBwYXJhZ3JhcGguCisgICAgXGlmbnVtXGNvdW50MjU1Pjk5OTkgXHBlbmFsdHlcY291bnQyNTUgXGZpCisgIFxlbHNlCisgICAgJSBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgd2UgaGFkIGEgbm9uemVybyBcbGFzdHNraXAsCisgICAgJSB0aGlzIG1ha2UtdXAgZ2x1ZSB3b3VsZCBiZSBwcmVjZWRlZCBieSBhIG5vbi1kaXNjYXJkYWJsZSBpdGVtCisgICAgJSAodGhlIHdoYXRzaXQgZnJvbSB0aGUgXHdyaXRlKSwgc28gd2UgbXVzdCBpbnNlcnQgYSBcbm9icmVhay4KKyAgICBcbm9icmVha1x2c2tpcFxza2lwMAorICBcZmkKK30KKworJSBUaGUgaW5kZXggZW50cnkgd3JpdHRlbiBpbiB0aGUgZmlsZSBhY3R1YWxseSBsb29rcyBsaWtlCislICBcZW50cnkge3NvcnRzdHJpbmd9e3BhZ2V9e3RvcGljfQorJSBvcgorJSAgXGVudHJ5IHtzb3J0c3RyaW5nfXtwYWdlfXt0b3BpY317c3VidG9waWN9CislIFRoZSB0ZXhpbmRleCBwcm9ncmFtIHJlYWRzIGluIHRoZXNlIGZpbGVzIGFuZCB3cml0ZXMgZmlsZXMKKyUgY29udGFpbmluZyB0aGVzZSBraW5kcyBvZiBsaW5lczoKKyUgIFxpbml0aWFsIHtjfQorJSAgICAgYmVmb3JlIHRoZSBmaXJzdCB0b3BpYyB3aG9zZSBpbml0aWFsIGlzIGMKKyUgIFxlbnRyeSB7dG9waWN9e3BhZ2VsaXN0fQorJSAgICAgZm9yIGEgdG9waWMgdGhhdCBpcyB1c2VkIHdpdGhvdXQgc3VidG9waWNzCislICBccHJpbWFyeSB7dG9waWN9CislICAgICBmb3IgdGhlIGJlZ2lubmluZyBvZiBhIHRvcGljIHRoYXQgaXMgdXNlZCB3aXRoIHN1YnRvcGljcworJSAgXHNlY29uZGFyeSB7c3VidG9waWN9e3BhZ2VsaXN0fQorJSAgICAgZm9yIGVhY2ggc3VidG9waWMuCisKKyUgRGVmaW5lIHRoZSB1c2VyLWFjY2Vzc2libGUgaW5kZXhpbmcgY29tbWFuZHMKKyUgQGZpbmRleCwgQHZpbmRleCwgQGtpbmRleCwgQGNpbmRleC4KKworXGRlZlxmaW5kZXgge1xmbmluZGV4fQorXGRlZlxraW5kZXgge1xreWluZGV4fQorXGRlZlxjaW5kZXgge1xjcGluZGV4fQorXGRlZlx2aW5kZXgge1x2cmluZGV4fQorXGRlZlx0aW5kZXgge1x0cGluZGV4fQorXGRlZlxwaW5kZXgge1xwZ2luZGV4fQorCitcZGVmXGNpbmRleHN1YiB7XGJlZ2luZ3JvdXBcb2JleWxpbmVzXGNpbmRleHN1Yn0KK3tcb2JleWxpbmVzICUKK1xnZGVmXGNpbmRleHN1YiAiIzEiICMyXl5Ne1xlbmRncm91cCAlCitcZG9zdWJpbmR7Y3B9eyMyfXsjMX19fQorCislIERlZmluZSB0aGUgbWFjcm9zIHVzZWQgaW4gZm9ybWF0dGluZyBvdXRwdXQgb2YgdGhlIHNvcnRlZCBpbmRleCBtYXRlcmlhbC4KKworJSBAcHJpbnRpbmRleCBjYXVzZXMgYSBwYXJ0aWN1bGFyIGluZGV4ICh0aGUgPz9zIGZpbGUpIHRvIGdldCBwcmludGVkLgorJSBJdCBkb2VzIG5vdCBwcmludCBhbnkgY2hhcHRlciBoZWFkaW5nICh1c3VhbGx5IGFuIEB1bm51bWJlcmVkKS4KKyUKK1xwYXJzZWFyZ2RlZlxwcmludGluZGV4e1xiZWdpbmdyb3VwCisgIFxkb2JyZWFrIFxjaGFwaGVhZGluZ3NraXB7MTAwMDB9JQorICAlCisgIFxzbWFsbGZvbnRzIFxybQorICBcdG9sZXJhbmNlID0gOTUwMAorICBcZXZlcnlwYXIgPSB7fSUgZG9uJ3Qgd2FudCB0aGUgXGtlcm5cLXBhcmluZGVudCBmcm9tIGluZGVudGF0aW9uIHN1cHByZXNzaW9uLgorICAlCisgICUgU2VlIGlmIHRoZSBpbmRleCBmaWxlIGV4aXN0cyBhbmQgaXMgbm9uZW1wdHkuCisgICUgQ2hhbmdlIGNhdGNvZGUgb2YgQCBoZXJlIHNvIHRoYXQgaWYgdGhlIGluZGV4IGZpbGUgY29udGFpbnMKKyAgJSBcaW5pdGlhbCB7QH0KKyAgJSBhcyBpdHMgZmlyc3QgbGluZSwgVGVYIGRvZXNuJ3QgY29tcGxhaW4gYWJvdXQgbWlzbWF0Y2hlZCBicmFjZXMKKyAgJSAoYmVjYXVzZSBpdCB0aGlua3MgQH0gaXMgYSBjb250cm9sIHNlcXVlbmNlKS4KKyAgXGNhdGNvZGVgXEAgPSAxMQorICBcb3BlbmluIDEgXGpvYm5hbWUuIzFzCisgIFxpZmVvZiAxCisgICAgJSBcZW5kZG91YmxlY29sdW1ucyBnZXRzIGNvbmZ1c2VkIGlmIHRoZXJlIGlzIG5vIHRleHQgaW4gdGhlIGluZGV4LAorICAgICUgYW5kIGl0IGxvc2VzIHRoZSBjaGFwdGVyIHRpdGxlIGFuZCB0aGUgYXV4IGZpbGUgZW50cmllcyBmb3IgdGhlCisgICAgJSBpbmRleC4gIFRoZSBlYXNpZXN0IHdheSB0byBwcmV2ZW50IHRoaXMgcHJvYmxlbSBpcyB0byBtYWtlIHN1cmUKKyAgICAlIHRoZXJlIGlzIHNvbWUgdGV4dC4KKyAgICBccHV0d29yZEluZGV4Tm9uZXhpc3RlbnQKKyAgXGVsc2UKKyAgICAlCisgICAgJSBJZiB0aGUgaW5kZXggZmlsZSBleGlzdHMgYnV0IGlzIGVtcHR5LCB0aGVuIFxvcGVuaW4gbGVhdmVzIFxpZmVvZgorICAgICUgZmFsc2UuICBXZSBoYXZlIHRvIG1ha2UgVGVYIHRyeSB0byByZWFkIHNvbWV0aGluZyBmcm9tIHRoZSBmaWxlLCBzbworICAgICUgaXQgY2FuIGRpc2NvdmVyIGlmIHRoZXJlIGlzIGFueXRoaW5nIGluIGl0LgorICAgIFxyZWFkIDEgdG8gXHRlbXAKKyAgICBcaWZlb2YgMQorICAgICAgXHB1dHdvcmRJbmRleElzRW1wdHkKKyAgICBcZWxzZQorICAgICAgJSBJbmRleCBmaWxlcyBhcmUgYWxtb3N0IFRleGluZm8gc291cmNlLCBidXQgd2UgdXNlIFwgYXMgdGhlIGVzY2FwZQorICAgICAgJSBjaGFyYWN0ZXIuICBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gdXNlIEAsIGJ1dCB0aGF0J3MgdG9vIGJpZyBhIGNoYW5nZQorICAgICAgJSB0byBtYWtlIHJpZ2h0IG5vdy4KKyAgICAgIFxkZWZcaW5kZXhiYWNrc2xhc2h7XGJhY2tzbGFzaGN1cmZvbnR9JQorICAgICAgXGNhdGNvZGVgXFwgPSAwCisgICAgICBcZXNjYXBlY2hhciA9IGBcXAorICAgICAgXGJlZ2luZG91YmxlY29sdW1ucworICAgICAgXGlucHV0IFxqb2JuYW1lLiMxcworICAgICAgXGVuZGRvdWJsZWNvbHVtbnMKKyAgICBcZmkKKyAgXGZpCisgIFxjbG9zZWluIDEKK1xlbmRncm91cH0KKworJSBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgYnkgdGhlIHNvcnRlZCBpbmRleCBmaWxlIGl0c2VsZi4KKyUgQ2hhbmdlIHRoZW0gdG8gY29udHJvbCB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgaW5kZXguCisKK1xkZWZcaW5pdGlhbCMxe3slCisgICUgU29tZSBtaW5vciBmb250IGNoYW5nZXMgZm9yIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMuCisgIFxsZXRcdGVudHQ9XHNlY3R0IFxsZXRcdHQ9XHNlY3R0IFxsZXRcc2Y9XHNlY3R0CisgICUKKyAgJSBSZW1vdmUgYW55IGdsdWUgd2UgbWF5IGhhdmUsIHdlJ2xsIGJlIGluc2VydGluZyBvdXIgb3duLgorICBccmVtb3ZlbGFzdHNraXAKKyAgJQorICAlIFdlIGxpa2UgYnJlYWtzIGJlZm9yZSB0aGUgaW5kZXggaW5pdGlhbHMsIHNvIGluc2VydCBhIGJvbnVzLgorICBcbm9icmVhaworICBcdnNraXAgMHB0IHBsdXMgM1xiYXNlbGluZXNraXAKKyAgXHBlbmFsdHkgMAorICBcdnNraXAgMHB0IHBsdXMgLTNcYmFzZWxpbmVza2lwCisgICUKKyAgJSBUeXBlc2V0IHRoZSBpbml0aWFsLiAgTWFraW5nIHRoaXMgYWRkIHVwIHRvIGEgd2hvbGUgbnVtYmVyIG9mCisgICUgYmFzZWxpbmVza2lwcyBpbmNyZWFzZXMgdGhlIGNoYW5jZSBvZiB0aGUgZG90cyBsaW5pbmcgdXAgZnJvbSBjb2x1bW4KKyAgJSB0byBjb2x1bW4uICBJdCBzdGlsbCB3b24ndCBvZnRlbiBiZSBwZXJmZWN0LCBiZWNhdXNlIG9mIHRoZSBzdHJldGNoCisgICUgd2UgbmVlZCBiZWZvcmUgZWFjaCBlbnRyeSwgYnV0IGl0J3MgYmV0dGVyLgorICAlCisgICUgTm8gc2hyaW5rIGJlY2F1c2UgaXQgY29uZnVzZXMgXGJhbGFuY2Vjb2x1bW5zLgorICBcdnNraXAgMS42N1xiYXNlbGluZXNraXAgcGx1cyAuNVxiYXNlbGluZXNraXAKKyAgXGxlZnRsaW5le1xzZWNiZiAjMX0lCisgICUgRG8gb3VyIGJlc3Qgbm90IHRvIGJyZWFrIGFmdGVyIHRoZSBpbml0aWFsLgorICBcbm9icmVhaworICBcdnNraXAgLjMzXGJhc2VsaW5lc2tpcCBwbHVzIC4xXGJhc2VsaW5lc2tpcAorfX0KKworJSBcZW50cnkgdHlwZXNldHMgYSBwYXJhZ3JhcGggY29uc2lzdGluZyBvZiB0aGUgdGV4dCAoIzEpLCBkb3QgbGVhZGVycywgYW5kCislIHRoZW4gcGFnZSBudW1iZXIgKCMyKSBmbHVzaGVkIHRvIHRoZSByaWdodCBtYXJnaW4uICBJdCBpcyB1c2VkIGZvciBpbmRleAorJSBhbmQgdGFibGUgb2YgY29udGVudHMgZW50cmllcy4gIFRoZSBwYXJhZ3JhcGggaXMgaW5kZW50ZWQgYnkgXGxlZnRza2lwLgorJQorJSBBIHN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiB3b3VsZCBzdGFydCBsaWtlIHRoaXM6CislCVxkZWZcZW50cnkjMSMyey4uLgorJSBCdXQgdGhpcyBmcm96ZXMgdGhlIGNhdGNvZGVzIGluIHRoZSBhcmd1bWVudCwgYW5kIGNhbiBjYXVzZSBwcm9ibGVtcyB0bworJSBAY29kZSwgd2hpY2ggc2V0cyAtIGFjdGl2ZS4gIFRoaXMgcHJvYmxlbSB3YXMgZml4ZWQgYnkgYSBrbHVkZ2UtLS0KKyUgYGAtJycgd2FzIGFjdGl2ZSB0aHJvdWdob3V0IHdob2xlIGluZGV4LCBidXQgdGhpcyBpc24ndCByZWFsbHkgcmlnaHQuCislCislIFRoZSByaWdodCBzb2x1dGlvbiBpcyB0byBwcmV2ZW50IFxlbnRyeSBmcm9tIHN3YWxsb3dpbmcgdGhlIHdob2xlIHRleHQuCislICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1rYXNhbCwgMjFub3YwMworXGRlZlxlbnRyeXslCisgIFxiZWdpbmdyb3VwCisgICAgJQorICAgICUgU3RhcnQgYSBuZXcgcGFyYWdyYXBoIGlmIG5lY2Vzc2FyeSwgc28gb3VyIGFzc2lnbm1lbnRzIGJlbG93IGNhbid0CisgICAgJSBhZmZlY3QgcHJldmlvdXMgdGV4dC4KKyAgICBccGFyCisgICAgJQorICAgICUgRG8gbm90IGZpbGwgb3V0IHRoZSBsYXN0IGxpbmUgd2l0aCB3aGl0ZSBzcGFjZS4KKyAgICBccGFyZmlsbHNraXAgPSAwaW4KKyAgICAlCisgICAgJSBObyBleHRyYSBzcGFjZSBhYm92ZSB0aGlzIHBhcmFncmFwaC4KKyAgICBccGFyc2tpcCA9IDBpbgorICAgICUKKyAgICAlIERvIG5vdCBwcmVmZXIgYSBzZXBhcmF0ZSBsaW5lIGVuZGluZyB3aXRoIGEgaHlwaGVuIHRvIGZld2VyIGxpbmVzLgorICAgIFxmaW5hbGh5cGhlbmRlbWVyaXRzID0gMAorICAgICUKKyAgICAlIFxoYW5naW5kZW50IGlzIG9ubHkgcmVsZXZhbnQgd2hlbiB0aGUgZW50cnkgdGV4dCBhbmQgcGFnZSBudW1iZXIKKyAgICAlIGRvbid0IGJvdGggZml0IG9uIG9uZSBsaW5lLiAgSW4gdGhhdCBjYXNlLCBib2Igc3VnZ2VzdHMgc3RhcnRpbmcgdGhlCisgICAgJSBkb3RzIHByZXR0eSBmYXIgb3ZlciBvbiB0aGUgbGluZS4gIFVuZm9ydHVuYXRlbHksIGEgbGFyZ2UKKyAgICAlIGluZGVudGF0aW9uIGxvb2tzIHdyb25nIHdoZW4gdGhlIGVudHJ5IHRleHQgaXRzZWxmIGlzIGJyb2tlbiBhY3Jvc3MKKyAgICAlIGxpbmVzLiAgU28gd2UgdXNlIGEgc21hbGwgaW5kZW50YXRpb24gYW5kIHB1dCB1cCB3aXRoIGxvbmcgbGVhZGVycy4KKyAgICAlCisgICAgJSBcaGFuZ2FmdGVyIGlzIHJlc2V0IHRvIDEgKHdoaWNoIGlzIHRoZSB2YWx1ZSB3ZSB3YW50KSBhdCB0aGUgc3RhcnQKKyAgICAlIG9mIGVhY2ggcGFyYWdyYXBoLCBzbyB3ZSBuZWVkIG5vdCBkbyBhbnl0aGluZyB3aXRoIHRoYXQuCisgICAgXGhhbmdpbmRlbnQgPSAyZW0KKyAgICAlCisgICAgJSBXaGVuIHRoZSBlbnRyeSB0ZXh0IG5lZWRzIHRvIGJlIGJyb2tlbiwganVzdCBmaWxsIG91dCB0aGUgZmlyc3QgbGluZQorICAgICUgd2l0aCBibGFuayBzcGFjZS4KKyAgICBccmlnaHRza2lwID0gMHB0IHBsdXMxZmlsCisgICAgJQorICAgICUgQSBiaXQgb2Ygc3RyZXRjaCBiZWZvcmUgZWFjaCBlbnRyeSBmb3IgdGhlIGJlbmVmaXQgb2YgYmFsYW5jaW5nCisgICAgJSBjb2x1bW5zLgorICAgIFx2c2tpcCAwcHQgcGx1czFwdAorICAgICUKKyAgICAlIFN3YWxsb3cgdGhlIGxlZnQgYnJhY2Ugb2YgdGhlIHRleHQgKGZpcnN0IHBhcmFtZXRlcik6CisgICAgXGFmdGVyYXNzaWdubWVudFxkb2VudHJ5CisgICAgXGxldFx0ZW1wID0KK30KK1xkZWZcZG9lbnRyeXslCisgICAgXGJncm91cCAlIEluc3RlYWQgb2YgdGhlIHN3YWxsb3dlZCBicmFjZS4KKyAgICAgIFxub2luZGVudAorICAgICAgXGFmdGVyZ3JvdXBcZmluaXNoZW50cnkKKyAgICAgICUgQW5kIG5vdyBjb21lcyB0aGUgdGV4dCBvZiB0aGUgZW50cnkuCit9CitcZGVmXGZpbmlzaGVudHJ5IzF7JQorICAgICUgIzEgaXMgdGhlIHBhZ2UgbnVtYmVyLgorICAgICUKKyAgICAlIFRoZSBmb2xsb3dpbmcgaXMga2x1ZGdlZCB0byBub3Qgb3V0cHV0IGEgbGluZSBvZiBkb3RzIGluIHRoZSBpbmRleCBpZgorICAgICUgdGhlcmUgYXJlIG5vIHBhZ2UgbnVtYmVycy4gIFRoZSBuZXh0IHBlcnNvbiB3aG8gYnJlYWtzIHRoaXMgd2lsbCBiZQorICAgICUgY3Vyc2VkIGJ5IGEgVW5peCBkYWVtb24uCisgICAgXGRlZlx0ZW1wYXt7XHJtIH19JQorICAgIFxkZWZcdGVtcGJ7IzF9JQorICAgIFxlZGVmXHRlbXBje1x0ZW1wYX0lCisgICAgXGVkZWZcdGVtcGR7XHRlbXBifSUKKyAgICBcaWZ4XHRlbXBjXHRlbXBkCisgICAgICBcICUKKyAgICBcZWxzZQorICAgICAgJQorICAgICAgJSBJZiB3ZSBtdXN0LCBwdXQgdGhlIHBhZ2UgbnVtYmVyIG9uIGEgbGluZSBvZiBpdHMgb3duLCBhbmQgZmlsbCBvdXQKKyAgICAgICUgdGhpcyBsaW5lIHdpdGggYmxhbmsgc3BhY2UuICAoVGhlIFxoZmlsIGlzIG92ZXJ3aGVsbWVkIHdpdGggdGhlCisgICAgICAlIGZpbGwgbGVhZGVycyBnbHVlIGluIFxpbmRleGRvdGZpbGwgaWYgdGhlIHBhZ2UgbnVtYmVyIGRvZXMgZml0LikKKyAgICAgIFxoZmlsXHBlbmFsdHk1MAorICAgICAgXG51bGxcbm9icmVha1xpbmRleGRvdGZpbGwgJSBIYXZlIGxlYWRlcnMgYmVmb3JlIHRoZSBwYWdlIG51bWJlci4KKyAgICAgICUKKyAgICAgICUgVGhlIGBcICcgaGVyZSBpcyByZW1vdmVkIGJ5IHRoZSBpbXBsaWNpdCBcdW5za2lwIHRoYXQgVGVYIGRvZXMgYXMKKyAgICAgICUgcGFydCBvZiAodGhlIHByaW1pdGl2ZSkgXHBhci4gIFdpdGhvdXQgaXQsIGEgc3B1cmlvdXMgdW5kZXJmdWxsCisgICAgICAlIFxoYm94IGVuc3Vlcy4KKyAgICAgIFxpZnBkZgorCVxwZGZnZXR0b2tzIzEuJQorCVwgXHRoZVx0b2tzQQorICAgICAgXGVsc2UKKwlcICMxJQorICAgICAgXGZpCisgICAgXGZpCisgICAgXHBhcgorICBcZW5kZ3JvdXAKK30KKworJSBMaWtlIFxkb3RmaWxsIGV4Y2VwdCB0YWtlcyBhdCBsZWFzdCAxIGVtLgorXGRlZlxpbmRleGRvdGZpbGx7XGNsZWFkZXJzCisgIFxoYm94eyRcbWF0aHN1cnJvdW5kPTBwdCBcbWtlcm4xLjVtdSAke1xpdCAufSQgXG1rZXJuMS41bXUkfVxoc2tpcCAxZW0gcGx1cyAxZmlsbH0KKworXGRlZlxwcmltYXJ5ICMxe1xsaW5leyMxXGhmaWx9fQorCitcbmV3c2tpcFxzZWNvbmRhcnlpbmRlbnQgXHNlY29uZGFyeWluZGVudD0wLjVjbQorXGRlZlxzZWNvbmRhcnkjMSMye3slCisgIFxwYXJmaWxsc2tpcD0waW4KKyAgXHBhcnNraXA9MGluCisgIFxoYW5naW5kZW50PTFpbgorICBcaGFuZ2FmdGVyPTEKKyAgXG5vaW5kZW50XGhza2lwXHNlY29uZGFyeWluZGVudFxoYm94eyMxfVxpbmRleGRvdGZpbGwKKyAgXGlmcGRmCisgICAgXHBkZmdldHRva3MjMi5cIFx0aGVcdG9rc0EgJSBUaGUgcGFnZSBudW1iZXIgZW5kcyB0aGUgcGFyYWdyYXBoLgorICBcZWxzZQorICAgICMyCisgIFxmaQorICBccGFyCit9fQorCislIERlZmluZSB0d28tY29sdW1uIG1vZGUsIHdoaWNoIHdlIHVzZSB0byB0eXBlc2V0IGluZGV4ZXMuCislIEFkYXB0ZWQgZnJvbSB0aGUgVGVYYm9vaywgcGFnZSA0MTYsIHdoaWNoIGlzIHRvIHNheSwKKyUgdGhlIG1hbm1hYy50ZXggZm9ybWF0IHVzZWQgdG8gcHJpbnQgdGhlIFRlWGJvb2sgaXRzZWxmLgorXGNhdGNvZGVgXEA9MTEKKworXG5ld2JveFxwYXJ0aWFscGFnZQorXG5ld2RpbWVuXGRvdWJsZWNvbHVtbmhzaXplCisKK1xkZWZcYmVnaW5kb3VibGVjb2x1bW5ze1xiZWdpbmdyb3VwICUgZW5kZWQgYnkgXGVuZGRvdWJsZWNvbHVtbnMKKyAgJSBHcmFiIGFueSBzaW5nbGUtY29sdW1uIG1hdGVyaWFsIGFib3ZlIHVzLgorICBcb3V0cHV0ID0geyUKKyAgICAlCisgICAgJSBIZXJlIGlzIGEgcG9zc2liaWxpdHkgbm90IGZvcmVzZWVuIGluIG1hbm1hYzogaWYgd2UgYWNjdW11bGF0ZSBhCisgICAgJSB3aG9sZSBsb3Qgb2YgbWF0ZXJpYWwsIHdlIG1pZ2h0IGVuZCB1cCBjYWxsaW5nIHRoaXMgXG91dHB1dAorICAgICUgcm91dGluZSB0d2ljZSBpbiBhIHJvdyAoc2VlIHRoZSBkb3VibGVjb2wtbG9zZSB0ZXN0LCB3aGljaCBpcworICAgICUgZXNzZW50aWFsbHkgYSBjb3VwbGUgb2YgaW5kZXhlcyB3aXRoIEBzZXRjaGFwdGVybmV3cGFnZSBvZmYpLiAgSW4KKyAgICAlIHRoYXQgY2FzZSB3ZSBqdXN0IHNoaXAgb3V0IHdoYXQgaXMgaW4gXHBhcnRpYWxwYWdlIHdpdGggdGhlIG5vcm1hbAorICAgICUgb3V0cHV0IHJvdXRpbmUuICBHZW5lcmFsbHksIFxwYXJ0aWFscGFnZSB3aWxsIGJlIGVtcHR5IHdoZW4gdGhpcworICAgICUgcnVucyBhbmQgdGhpcyB3aWxsIGJlIGEgbm8tb3AuICBTZWUgdGhlIGluZGV4c3ByZWFkLnRleCB0ZXN0IGNhc2UuCisgICAgXGlmdm9pZFxwYXJ0aWFscGFnZSBcZWxzZQorICAgICAgXG9uZXBhZ2VvdXR7XHBhZ2Vjb250ZW50c1xwYXJ0aWFscGFnZX0lCisgICAgXGZpCisgICAgJQorICAgIFxnbG9iYWxcc2V0Ym94XHBhcnRpYWxwYWdlID0gXHZib3h7JQorICAgICAgJSBVbnZib3ggdGhlIG1haW4gb3V0cHV0IHBhZ2UuCisgICAgICBcdW52Ym94XFBBR0UKKyAgICAgIFxrZXJuLVx0b3Bza2lwIFxrZXJuXGJhc2VsaW5lc2tpcAorICAgIH0lCisgIH0lCisgIFxlamVjdCAlIHJ1biB0aGF0IG91dHB1dCByb3V0aW5lIHRvIHNldCBccGFydGlhbHBhZ2UKKyAgJQorICAlIFVzZSB0aGUgZG91YmxlLWNvbHVtbiBvdXRwdXQgcm91dGluZSBmb3Igc3Vic2VxdWVudCBwYWdlcy4KKyAgXG91dHB1dCA9IHtcZG91YmxlY29sdW1ub3V0fSUKKyAgJQorICAlIENoYW5nZSB0aGUgcGFnZSBzaXplIHBhcmFtZXRlcnMuICBXZSBjb3VsZCBkbyB0aGlzIG9uY2Ugb3V0c2lkZSB0aGlzCisgICUgcm91dGluZSwgaW4gZWFjaCBvZiBAc21hbGxib29rLCBAYWZvdXJwYXBlciwgYW5kIHRoZSBkZWZhdWx0IDguNXgxMQorICAlIGZvcm1hdCwgYnV0IHRoZW4gd2UgcmVwZWF0IHRoZSBzYW1lIGNvbXB1dGF0aW9uLiAgUmVwZWF0aW5nIGEgY291cGxlCisgICUgb2YgYXNzaWdubWVudHMgb25jZSBwZXIgaW5kZXggaXMgY2xlYXJseSBtZWFuaW5nbGVzcyBmb3IgdGhlCisgICUgZXhlY3V0aW9uIHRpbWUsIHNvIHdlIG1heSBhcyB3ZWxsIGRvIGl0IGluIG9uZSBwbGFjZS4KKyAgJQorICAlIEZpcnN0IHdlIGhhbHZlIHRoZSBsaW5lIGxlbmd0aCwgbGVzcyBhIGxpdHRsZSBmb3IgdGhlIGd1dHRlciBiZXR3ZWVuCisgICUgdGhlIGNvbHVtbnMuICBXZSBjb21wdXRlIHRoZSBndXR0ZXIgYmFzZWQgb24gdGhlIGxpbmUgbGVuZ3RoLCBzbyBpdAorICAlIGNoYW5nZXMgYXV0b21hdGljYWxseSB3aXRoIHRoZSBwYXBlciBmb3JtYXQuICBUaGUgbWFnaWMgY29uc3RhbnQKKyAgJSBiZWxvdyBpcyBjaG9zZW4gc28gdGhhdCB0aGUgZ3V0dGVyIGhhcyB0aGUgc2FtZSB2YWx1ZSAod2VsbCwgKy08MXB0KQorICAlIGFzIGl0IGRpZCB3aGVuIHdlIGhhcmQtY29kZWQgaXQuCisgICUKKyAgJSBXZSBwdXQgdGhlIHJlc3VsdCBpbiBhIHNlcGFyYXRlIHJlZ2lzdGVyLCBcZG91YmxlY29sdW1oc2l6ZSwgc28gd2UKKyAgJSBjYW4gcmVzdG9yZSBpdCBpbiBccGFnZXNvZmFyLCBhZnRlciBcaHNpemUgaXRzZWxmIGhhcyAocG90ZW50aWFsbHkpCisgICUgYmVlbiBjbG9iYmVyZWQuCisgICUKKyAgXGRvdWJsZWNvbHVtbmhzaXplID0gXGhzaXplCisgICAgXGFkdmFuY2VcZG91YmxlY29sdW1uaHNpemUgYnkgLS4wNDE1NFxoc2l6ZQorICAgIFxkaXZpZGVcZG91YmxlY29sdW1uaHNpemUgYnkgMgorICBcaHNpemUgPSBcZG91YmxlY29sdW1uaHNpemUKKyAgJQorICAlIERvdWJsZSB0aGUgXHZzaXplIGFzIHdlbGwuICAoV2UgZG9uJ3QgbmVlZCBhIHNlcGFyYXRlIHJlZ2lzdGVyIGhlcmUsCisgICUgc2luY2Ugbm9ib2R5IGNsb2JiZXJzIFx2c2l6ZS4pCisgIFx2c2l6ZSA9IDJcdnNpemUKK30KKworJSBUaGUgZG91YmxlLWNvbHVtbiBvdXRwdXQgcm91dGluZSBmb3IgYWxsIGRvdWJsZS1jb2x1bW4gcGFnZXMgZXhjZXB0CislIHRoZSBsYXN0LgorJQorXGRlZlxkb3VibGVjb2x1bW5vdXR7JQorICBcc3BsaXR0b3Bza2lwPVx0b3Bza2lwIFxzcGxpdG1heGRlcHRoPVxtYXhkZXB0aAorICAlIEdldCB0aGUgYXZhaWxhYmxlIHNwYWNlIGZvciB0aGUgZG91YmxlIGNvbHVtbnMgLS0gdGhlIG5vcm1hbAorICAlICh1bmRvdWJsZWQpIHBhZ2UgaGVpZ2h0IG1pbnVzIGFueSBtYXRlcmlhbCBsZWZ0IG92ZXIgZnJvbSB0aGUKKyAgJSBwcmV2aW91cyBwYWdlLgorICBcZGltZW5AID0gXHZzaXplCisgIFxkaXZpZGVcZGltZW5AIGJ5IDIKKyAgXGFkdmFuY2VcZGltZW5AIGJ5IC1caHRccGFydGlhbHBhZ2UKKyAgJQorICAlIGJveDAgd2lsbCBiZSB0aGUgbGVmdC1oYW5kIGNvbHVtbiwgYm94MiB0aGUgcmlnaHQuCisgIFxzZXRib3gwPVx2c3BsaXQyNTUgdG9cZGltZW5AIFxzZXRib3gyPVx2c3BsaXQyNTUgdG9cZGltZW5ACisgIFxvbmVwYWdlb3V0XHBhZ2Vzb2ZhcgorICBcdW52Ym94MjU1CisgIFxwZW5hbHR5XG91dHB1dHBlbmFsdHkKK30KKyUKKyUgUmUtb3V0cHV0IHRoZSBjb250ZW50cyBvZiB0aGUgb3V0cHV0IHBhZ2UgLS0gYW55IHByZXZpb3VzIG1hdGVyaWFsLAorJSBmb2xsb3dlZCBieSB0aGUgdHdvIGJveGVzIHdlIGp1c3Qgc3BsaXQsIGluIGJveDAgYW5kIGJveDIuCitcZGVmXHBhZ2Vzb2ZhcnslCisgIFx1bnZib3hccGFydGlhbHBhZ2UKKyAgJQorICBcaHNpemUgPSBcZG91YmxlY29sdW1uaHNpemUKKyAgXHdkMD1caHNpemUgXHdkMj1caHNpemUKKyAgXGhib3ggdG9ccGFnZXdpZHRoe1xib3gwXGhmaWxcYm94Mn0lCit9CislCislIEFsbCBkb25lIHdpdGggZG91YmxlIGNvbHVtbnMuCitcZGVmXGVuZGRvdWJsZWNvbHVtbnN7JQorICBcb3V0cHV0ID0geyUKKyAgICAlIFNwbGl0IHRoZSBsYXN0IG9mIHRoZSBkb3VibGUtY29sdW1uIG1hdGVyaWFsLiAgTGVhdmUgaXQgb24gdGhlCisgICAgJSBjdXJyZW50IHBhZ2UsIG5vIGF1dG9tYXRpYyBwYWdlIGJyZWFrLgorICAgIFxiYWxhbmNlY29sdW1ucworICAgICUKKyAgICAlIElmIHdlIGVuZCB1cCBzcGxpdHRpbmcgdG9vIG11Y2ggbWF0ZXJpYWwgZm9yIHRoZSBjdXJyZW50IHBhZ2UsCisgICAgJSB0aG91Z2gsIHRoZXJlIHdpbGwgYmUgYW5vdGhlciBwYWdlIGJyZWFrIHJpZ2h0IGFmdGVyIHRoaXMgXG91dHB1dAorICAgICUgaW52b2NhdGlvbiBlbmRzLiAgSGF2aW5nIGNhbGxlZCBcYmFsYW5jZWNvbHVtbnMgb25jZSwgd2UgZG8gbm90CisgICAgJSB3YW50IHRvIGNhbGwgaXQgYWdhaW4uICBUaGVyZWZvcmUsIHJlc2V0IFxvdXRwdXQgdG8gaXRzIG5vcm1hbAorICAgICUgZGVmaW5pdGlvbiByaWdodCBhd2F5LiAgKFdlIGhvcGUgXGJhbGFuY2Vjb2x1bW5zIHdpbGwgbmV2ZXIgYmUKKyAgICAlIGNhbGxlZCBvbiB0byBiYWxhbmNlIHRvbyBtdWNoIG1hdGVyaWFsLCBidXQgaWYgaXQgaXMsIHRoaXMgbWFrZXMKKyAgICAlIHRoZSBvdXRwdXQgc29tZXdoYXQgbW9yZSBwYWxhdGFibGUuKQorICAgIFxnbG9iYWxcb3V0cHV0ID0ge1xvbmVwYWdlb3V0e1xwYWdlY29udGVudHNcUEFHRX19JQorICB9JQorICBcZWplY3QKKyAgXGVuZGdyb3VwICUgc3RhcnRlZCBpbiBcYmVnaW5kb3VibGVjb2x1bW5zCisgICUKKyAgJSBccGFnZWdvYWwgd2FzIHNldCB0byB0aGUgZG91YmxlZCBcdnNpemUgYWJvdmUsIHNpbmNlIHdlIHJlc3RhcnRlZAorICAlIHRoZSBjdXJyZW50IHBhZ2UuICBXZSdyZSBub3cgYmFjayB0byBub3JtYWwgc2luZ2xlLWNvbHVtbgorICAlIHR5cGVzZXR0aW5nLCBzbyByZXNldCBccGFnZWdvYWwgdG8gdGhlIG5vcm1hbCBcdnNpemUgKGFmdGVyIHRoZQorICAlIFxlbmRncm91cCB3aGVyZSBcdnNpemUgZ290IHJlc3RvcmVkKS4KKyAgXHBhZ2Vnb2FsID0gXHZzaXplCit9CislCislIENhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBkb3VibGUgY29sdW1uIG1hdGVyaWFsLgorXGRlZlxiYWxhbmNlY29sdW1uc3slCisgIFxzZXRib3gwID0gXHZib3h7XHVudmJveDI1NX0lIGxpa2UgXGJveDI1NSBidXQgbW9yZSBlZmZpY2llbnQsIHNlZSBwLjEyMC4KKyAgXGRpbWVuQCA9IFxodDAKKyAgXGFkdmFuY2VcZGltZW5AIGJ5IFx0b3Bza2lwCisgIFxhZHZhbmNlXGRpbWVuQCBieS1cYmFzZWxpbmVza2lwCisgIFxkaXZpZGVcZGltZW5AIGJ5IDIgJSB0YXJnZXQgdG8gc3BsaXQgdG8KKyAgJWRlYnVnXG1lc3NhZ2V7ZmluYWwgMi1jb2x1bW4gbWF0ZXJpYWwgaGVpZ2h0PVx0aGVcaHQwLCB0YXJnZXQ9XHRoZVxkaW1lbkAufSUKKyAgXHNwbGl0dG9wc2tpcCA9IFx0b3Bza2lwCisgICUgTG9vcCB1bnRpbCB3ZSBnZXQgYSBkZWNlbnQgYnJlYWtwb2ludC4KKyAgeyUKKyAgICBcdmJhZG5lc3MgPSAxMDAwMAorICAgIFxsb29wCisgICAgICBcZ2xvYmFsXHNldGJveDMgPSBcY29weTAKKyAgICAgIFxnbG9iYWxcc2V0Ym94MSA9IFx2c3BsaXQzIHRvIFxkaW1lbkAKKyAgICBcaWZkaW1caHQzPlxkaW1lbkAKKyAgICAgIFxnbG9iYWxcYWR2YW5jZVxkaW1lbkAgYnkgMXB0CisgICAgXHJlcGVhdAorICB9JQorICAlZGVidWdcbWVzc2FnZXtzcGxpdCB0byBcdGhlXGRpbWVuQCwgY29sdW1uIGhlaWdodHM6IFx0aGVcaHQxLCBcdGhlXGh0My59JQorICBcc2V0Ym94MD1cdmJveCB0b1xkaW1lbkB7XHVudmJveDF9JQorICBcc2V0Ym94Mj1cdmJveCB0b1xkaW1lbkB7XHVudmJveDN9JQorICAlCisgIFxwYWdlc29mYXIKK30KK1xjYXRjb2RlYFxAID0gXG90aGVyCisKKworXG1lc3NhZ2V7c2VjdGlvbmluZyx9CislIENoYXB0ZXJzLCBzZWN0aW9ucywgZXRjLgorCislIFx1bm51bWJlcmVkbm8gaXMgYW4gb3h5bW9yb24sIG9mIGNvdXJzZS4gIEJ1dCB3ZSBjb3VudCB0aGUgdW5udW1iZXJlZAorJSBzZWN0aW9ucyBzbyB0aGF0IHdlIGNhbiByZWZlciB0byB0aGVtIHVuYW1iaWd1b3VzbHkgaW4gdGhlIHBkZgorJSBvdXRsaW5lcyBieSB0aGVpciAic2VjdGlvbiBudW1iZXIiLiAgV2UgYXZvaWQgY29sbGlzaW9ucyB3aXRoIGNoYXB0ZXIKKyUgbnVtYmVycyBieSBzdGFydGluZyB0aGVtIGF0IDEwMDAwLiAgKElmIGEgZG9jdW1lbnQgZXZlciBoYXMgMTAwMDAKKyUgY2hhcHRlcnMsIHdlJ3JlIGluIHRyb3VibGUgYW55d2F5LCBJJ20gc3VyZS4pCitcbmV3Y291bnRcdW5udW1iZXJlZG5vIFx1bm51bWJlcmVkbm8gPSAxMDAwMAorXG5ld2NvdW50XGNoYXBubworXG5ld2NvdW50XHNlY25vICAgICAgICBcc2Vjbm89MAorXG5ld2NvdW50XHN1YnNlY25vICAgICBcc3Vic2Vjbm89MAorXG5ld2NvdW50XHN1YnN1YnNlY25vICBcc3Vic3Vic2Vjbm89MAorCislIFRoaXMgY291bnRlciBpcyBmdW5ueSBzaW5jZSBpdCBjb3VudHMgdGhyb3VnaCBjaGFyY29kZXMgb2YgbGV0dGVycyBBLCBCLCAuLi4KK1xuZXdjb3VudFxhcHBlbmRpeG5vICBcYXBwZW5kaXhubyA9IGBcQAorJQorJSBcZGVmXGFwcGVuZGl4bGV0dGVye1xjaGFyXHRoZVxhcHBlbmRpeG5vfQorJSBXZSBkbyB0aGUgZm9sbG93aW5nIHVnbHkgY29uZGl0aW9uYWwgaW5zdGVhZCBvZiB0aGUgYWJvdmUgc2ltcGxlCislIGNvbnN0cnVjdCBmb3IgdGhlIHNha2Ugb2YgcGRmdGV4LCB3aGljaCBuZWVkcyB0aGUgYWN0dWFsCislIGxldHRlciBpbiB0aGUgZXhwYW5zaW9uLCBub3QganVzdCB0eXBlc2V0LgorJQorXGRlZlxhcHBlbmRpeGxldHRlcnslCisgIFxpZm51bVxhcHBlbmRpeG5vPWBBIEElCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YEIgQiUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gQyBDJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBEIEQlCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YEUgRSUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gRiBGJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBHIEclCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YEggSCUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gSSBJJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBKIEolCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YEsgSyUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gTCBMJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBNIE0lCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YE4gTiUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gTyBPJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBQIFAlCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YFEgUSUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gUiBSJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBTIFMlCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YFQgVCUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gVSBVJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBWIFYlCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YFcgVyUKKyAgXGVsc2VcaWZudW1cYXBwZW5kaXhubz1gWCBYJQorICBcZWxzZVxpZm51bVxhcHBlbmRpeG5vPWBZIFklCisgIFxlbHNlXGlmbnVtXGFwcGVuZGl4bm89YFogWiUKKyAgJSBUaGUgXHRoZSBpcyBuZWNlc3NhcnksIGRlc3BpdGUgYXBwZWFyYW5jZXMsIGJlY2F1c2UgXGFwcGVuZGl4bGV0dGVyIGlzCisgICUgZXhwYW5kZWQgd2hpbGUgd3JpdGluZyB0aGUgLnRvYyBmaWxlLiAgXGNoYXJcYXBwZW5kaXhubyBpcyBub3QKKyAgJSBleHBhbmRhYmxlLCB0aHVzIGl0IGlzIHdyaXR0ZW4gbGl0ZXJhbGx5LCB0aHVzIGFsbCBhcHBlbmRpeGVzIGNvbWUgb3V0CisgICUgd2l0aCB0aGUgc2FtZSBsZXR0ZXIgKG9yIEApIGluIHRoZSB0b2Mgd2l0aG91dCBpdC4KKyAgXGVsc2VcY2hhclx0aGVcYXBwZW5kaXhubworICBcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmlcZmkKKyAgXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpXGZpfQorCislIEVhY2ggQGNoYXB0ZXIgZGVmaW5lcyB0aGlzIGFzIHRoZSBuYW1lIG9mIHRoZSBjaGFwdGVyLgorJSBwYWdlIGhlYWRpbmdzIGFuZCBmb290aW5ncyBjYW4gdXNlIGl0LiAgQHNlY3Rpb24gZG9lcyBsaWtld2lzZS4KKyUgSG93ZXZlciwgdGhleSBhcmUgbm90IHJlbGlhYmxlLCBiZWNhdXNlIHdlIGRvbid0IHVzZSBtYXJrcy4KK1xkZWZcdGhpc2NoYXB0ZXJ7fQorXGRlZlx0aGlzc2VjdGlvbnt9CisKK1xuZXdjb3VudFxhYnNzZWNsZXZlbCAlIHVzZWQgdG8gY2FsY3VsYXRlIHByb3BlciBoZWFkaW5nIGxldmVsCitcbmV3Y291bnRcc2VjYmFzZVxzZWNiYXNlPTAgJSBAcmFpc2VzZWN0aW9ucy9AbG93ZXJzZWN0aW9ucyBtb2RpZnkgdGhpcyBjb3VudAorCislIEByYWlzZXNlY3Rpb25zOiB0cmVhdCBAc2VjdGlvbiBhcyBjaGFwdGVyLCBAc3Vic2VjdGlvbiBhcyBzZWN0aW9uLCBldGMuCitcZGVmXHJhaXNlc2VjdGlvbnN7XGdsb2JhbFxhZHZhbmNlXHNlY2Jhc2UgYnkgLTF9CitcbGV0XHVwPVxyYWlzZXNlY3Rpb25zICUgb3JpZ2luYWwgQkZveCBuYW1lCisKKyUgQGxvd2Vyc2VjdGlvbnM6IHRyZWF0IEBjaGFwdGVyIGFzIHNlY3Rpb24sIEBzZWN0aW9uIGFzIHN1YnNlY3Rpb24sIGV0Yy4KK1xkZWZcbG93ZXJzZWN0aW9uc3tcZ2xvYmFsXGFkdmFuY2Vcc2VjYmFzZSBieSAxfQorXGxldFxkb3duPVxsb3dlcnNlY3Rpb25zICUgb3JpZ2luYWwgQkZveCBuYW1lCisKKyUgd2Ugb25seSBoYXZlIHN1YnN1Yi4KK1xjaGFyZGVmXG1heHNlY2xldmVsID0gMworJQorJSBBIG51bWJlcmVkIHNlY3Rpb24gd2l0aGluIGFuIHVubnVtYmVyZWQgY2hhbmdlcyB0byB1bm51bWJlcmVkIHRvby4KKyUgVG8gYWNoaXZlIHRoaXMsIHJlbWVtYmVyIHRoZSAiYmlnZ2VzdCIgdW5udW0uIHNlYy4gd2UgYXJlIGN1cnJlbnRseSBpbjoKK1xjaGFyZGVmXHVubWxldmVsID0gXG1heHNlY2xldmVsCislCislIFRyYWNlIHdoZXRoZXIgdGhlIGN1cnJlbnQgY2hhcHRlciBpcyBhbiBhcHBlbmRpeCBvciBub3Q6CislIFxjaGFwaGVhZHR5cGUgaXMgIk4iIG9yICJBIiwgdW5udW1iZXJlZCBjaGFwdGVycyBhcmUgaWdub3JlZC4KK1xkZWZcY2hhcGhlYWR0eXBle059CisKKyUgQ2hvb3NlIGEgaGVhZGluZyBtYWNybworJSAjMSBpcyBoZWFkaW5nIHR5cGUKKyUgIzIgaXMgaGVhZGluZyBsZXZlbAorJSAjMyBpcyB0ZXh0IGZvciBoZWFkaW5nCitcZGVmXGdlbmhlYWQjMSMyIzN7JQorICAlIENvbXB1dGUgdGhlIGFicy4gc2VjLiBsZXZlbDoKKyAgXGFic3NlY2xldmVsPSMyCisgIFxhZHZhbmNlXGFic3NlY2xldmVsIGJ5IFxzZWNiYXNlCisgICUgTWFrZSBzdXJlIFxhYnNzZWNsZXZlbCBkb2Vzbid0IGZhbGwgb3V0c2lkZSB0aGUgcmFuZ2U6CisgIFxpZm51bSBcYWJzc2VjbGV2ZWwgPCAwCisgICAgXGFic3NlY2xldmVsID0gMAorICBcZWxzZQorICAgIFxpZm51bSBcYWJzc2VjbGV2ZWwgPiAzCisgICAgICBcYWJzc2VjbGV2ZWwgPSAzCisgICAgXGZpCisgIFxmaQorICAlIFRoZSBoZWFkaW5nIHR5cGU6CisgIFxkZWZcaGVhZHR5cGV7IzF9JQorICBcaWYgXGhlYWR0eXBlIFUlCisgICAgXGlmbnVtIFxhYnNzZWNsZXZlbCA8IFx1bm1sZXZlbAorICAgICAgXGNoYXJkZWZcdW5tbGV2ZWwgPSBcYWJzc2VjbGV2ZWwKKyAgICBcZmkKKyAgXGVsc2UKKyAgICAlIENoZWNrIGZvciBhcHBlbmRpeCBzZWN0aW9uczoKKyAgICBcaWZudW0gXGFic3NlY2xldmVsID0gMAorICAgICAgXGVkZWZcY2hhcGhlYWR0eXBle1xoZWFkdHlwZX0lCisgICAgXGVsc2UKKyAgICAgIFxpZiBcaGVhZHR5cGUgQVxpZiBcY2hhcGhlYWR0eXBlIE4lCisJXGVycm1lc3NhZ2V7QGFwcGVuZGl4Li4uIHdpdGhpbiBhIG5vbi1hcHBlbmRpeCBjaGFwdGVyfSUKKyAgICAgIFxmaVxmaQorICAgIFxmaQorICAgICUgQ2hlY2sgZm9yIG51bWJlcmVkIHdpdGhpbiB1bm51bWJlcmVkOgorICAgIFxpZm51bSBcYWJzc2VjbGV2ZWwgPiBcdW5tbGV2ZWwKKyAgICAgIFxkZWZcaGVhZHR5cGV7VX0lCisgICAgXGVsc2UKKyAgICAgIFxjaGFyZGVmXHVubWxldmVsID0gMworICAgIFxmaQorICBcZmkKKyAgJSBOb3cgcHJpbnQgdGhlIGhlYWRpbmc6CisgIFxpZiBcaGVhZHR5cGUgVSUKKyAgICBcaWZjYXNlXGFic3NlY2xldmVsCisJXHVubnVtYmVyZWR6enp7IzN9JQorICAgIFxvciBcdW5udW1iZXJlZHNlY3p6ensjM30lCisgICAgXG9yIFx1bm51bWJlcmVkc3Vic2Vjenp6eyMzfSUKKyAgICBcb3IgXHVubnVtYmVyZWRzdWJzdWJzZWN6enp7IzN9JQorICAgIFxmaQorICBcZWxzZQorICAgIFxpZiBcaGVhZHR5cGUgQSUKKyAgICAgIFxpZmNhc2VcYWJzc2VjbGV2ZWwKKwkgIFxhcHBlbmRpeHp6ensjM30lCisgICAgICBcb3IgXGFwcGVuZGl4c2VjdGlvbnp6ensjM30lCisgICAgICBcb3IgXGFwcGVuZGl4c3Vic2Vjenp6eyMzfSUKKyAgICAgIFxvciBcYXBwZW5kaXhzdWJzdWJzZWN6enp7IzN9JQorICAgICAgXGZpCisgICAgXGVsc2UKKyAgICAgIFxpZmNhc2VcYWJzc2VjbGV2ZWwKKwkgIFxjaGFwdGVyenp6eyMzfSUKKyAgICAgIFxvciBcc2Vjenp6eyMzfSUKKyAgICAgIFxvciBcbnVtYmVyZWRzdWJzZWN6enp7IzN9JQorICAgICAgXG9yIFxudW1iZXJlZHN1YnN1YnNlY3p6ensjM30lCisgICAgICBcZmkKKyAgICBcZmkKKyAgXGZpCisgIFxzdXBwcmVzc2ZpcnN0cGFyYWdyYXBoaW5kZW50Cit9CisKKyUgYW4gaW50ZXJmYWNlOgorXGRlZlxudW1oZWFke1xnZW5oZWFkIE59CitcZGVmXGFwcGhlYWR7XGdlbmhlYWQgQX0KK1xkZWZcdW5ubWhlYWR7XGdlbmhlYWQgVX0KKworJSBAY2hhcHRlciwgQGFwcGVuZGl4LCBAdW5udW1iZXJlZC4gIEluY3JlbWVudCB0b3AtbGV2ZWwgY291bnRlciwgcmVzZXQKKyUgYWxsIGxvd2VyLWxldmVsIHNlY3Rpb25pbmcgY291bnRlcnMgdG8gemVyby4KKyUKKyUgQWxzbyBzZXQgXGNoYXBsZXZlbHByZWZpeCwgd2hpY2ggd2UgcHJlcGVuZCB0byBAZmxvYXQgc2VxdWVuY2UgbnVtYmVycworJSAoZS5nLiwgZmlndXJlcyksIHEudi4gIEJ5IGRlZmF1bHQgKGJlZm9yZSBhbnkgY2hhcHRlciksIHRoYXQgaXMgZW1wdHkuCitcbGV0XGNoYXBsZXZlbHByZWZpeCA9IFxlbXB0eQorJQorXG91dGVyXHBhcnNlYXJnZGVmXGNoYXB0ZXJ7XG51bWhlYWQweyMxfX0gJSBub3JtYWxseSBudW1oZWFkMCBjYWxscyBjaGFwdGVyenp6CitcZGVmXGNoYXB0ZXJ6enojMXslCisgICUgc2VjdGlvbiByZXNldHRpbmcgaXMgXGdsb2JhbCBpbiBjYXNlIHRoZSBjaGFwdGVyIGlzIGluIGEgZ3JvdXAsIHN1Y2gKKyAgJSBhcyBhbiBAaW5jbHVkZSBmaWxlLgorICBcZ2xvYmFsXHNlY25vPTAgXGdsb2JhbFxzdWJzZWNubz0wIFxnbG9iYWxcc3Vic3Vic2Vjbm89MAorICAgIFxnbG9iYWxcYWR2YW5jZVxjaGFwbm8gYnkgMQorICAlCisgICUgVXNlZCBmb3IgXGZsb2F0LgorICBcZ2RlZlxjaGFwbGV2ZWxwcmVmaXh7XHRoZVxjaGFwbm8ufSUKKyAgXHJlc2V0YWxsZmxvYXRub3MKKyAgJQorICBcbWVzc2FnZXtccHV0d29yZENoYXB0ZXJcc3BhY2UgXHRoZVxjaGFwbm99JQorICAlCisgICUgV3JpdGUgdGhlIGFjdHVhbCBoZWFkaW5nLgorICBcY2hhcG1hY3JveyMxfXtZbnVtYmVyZWR9e1x0aGVcY2hhcG5vfSUKKyAgJQorICAlIFNvIEBzZWN0aW9uIGFuZCB0aGUgbGlrZSBhcmUgbnVtYmVyZWQgdW5kZXJuZWF0aCB0aGlzIGNoYXB0ZXIuCisgIFxnbG9iYWxcbGV0XHNlY3Rpb24gPSBcbnVtYmVyZWRzZWMKKyAgXGdsb2JhbFxsZXRcc3Vic2VjdGlvbiA9IFxudW1iZXJlZHN1YnNlYworICBcZ2xvYmFsXGxldFxzdWJzdWJzZWN0aW9uID0gXG51bWJlcmVkc3Vic3Vic2VjCit9CisKK1xvdXRlclxwYXJzZWFyZ2RlZlxhcHBlbmRpeHtcYXBwaGVhZDB7IzF9fSAlIG5vcm1hbGx5IGFwcGhlYWQwIGNhbGxzIGFwcGVuZGl4enp6CitcZGVmXGFwcGVuZGl4enp6IzF7JQorICBcZ2xvYmFsXHNlY25vPTAgXGdsb2JhbFxzdWJzZWNubz0wIFxnbG9iYWxcc3Vic3Vic2Vjbm89MAorICAgIFxnbG9iYWxcYWR2YW5jZVxhcHBlbmRpeG5vIGJ5IDEKKyAgXGdkZWZcY2hhcGxldmVscHJlZml4e1xhcHBlbmRpeGxldHRlci59JQorICBccmVzZXRhbGxmbG9hdG5vcworICAlCisgIFxkZWZcYXBwZW5kaXhudW17XHB1dHdvcmRBcHBlbmRpeFxzcGFjZSBcYXBwZW5kaXhsZXR0ZXJ9JQorICBcbWVzc2FnZXtcYXBwZW5kaXhudW19JQorICAlCisgIFxjaGFwbWFjcm97IzF9e1lhcHBlbmRpeH17XGFwcGVuZGl4bGV0dGVyfSUKKyAgJQorICBcZ2xvYmFsXGxldFxzZWN0aW9uID0gXGFwcGVuZGl4c2VjCisgIFxnbG9iYWxcbGV0XHN1YnNlY3Rpb24gPSBcYXBwZW5kaXhzdWJzZWMKKyAgXGdsb2JhbFxsZXRcc3Vic3Vic2VjdGlvbiA9IFxhcHBlbmRpeHN1YnN1YnNlYworfQorCitcb3V0ZXJccGFyc2VhcmdkZWZcdW5udW1iZXJlZHtcdW5ubWhlYWQweyMxfX0gJSBub3JtYWxseSB1bm5taGVhZDAgY2FsbHMgdW5udW1iZXJlZHp6egorXGRlZlx1bm51bWJlcmVkenp6IzF7JQorICBcZ2xvYmFsXHNlY25vPTAgXGdsb2JhbFxzdWJzZWNubz0wIFxnbG9iYWxcc3Vic3Vic2Vjbm89MAorICAgIFxnbG9iYWxcYWR2YW5jZVx1bm51bWJlcmVkbm8gYnkgMQorICAlCisgICUgU2luY2UgYW4gdW5udW1iZXJlZCBoYXMgbm8gbnVtYmVyLCBubyBwcmVmaXggZm9yIGZpZ3VyZXMuCisgIFxnbG9iYWxcbGV0XGNoYXBsZXZlbHByZWZpeCA9IFxlbXB0eQorICBccmVzZXRhbGxmbG9hdG5vcworICAlCisgICUgVGhpcyB1c2VkIHRvIGJlIHNpbXBseSBcbWVzc2FnZXsjMX0sIGJ1dCBUZVggZnVsbHkgZXhwYW5kcyB0aGUKKyAgJSBhcmd1bWVudCB0byBcbWVzc2FnZS4gIFRoZXJlZm9yZSwgaWYgIzEgY29udGFpbmVkIEAtY29tbWFuZHMsIFRlWAorICAlIGV4cGFuZGVkIHRoZW0uICBGb3IgZXhhbXBsZSwgaW4gYEB1bm51bWJlcmVkIFRoZSBAY2l0ZXtCb29rfScsIFRlWAorICAlIGV4cGFuZGVkIEBjaXRlICh3aGljaCB0dXJucyBvdXQgdG8gY2F1c2UgZXJyb3JzIGJlY2F1c2UgXGNpdGUgaXMgbWVhbnQKKyAgJSB0byBiZSBleGVjdXRlZCwgbm90IGV4cGFuZGVkKS4KKyAgJQorICAlIEFueXdheSwgd2UgZG9uJ3Qgd2FudCB0aGUgZnVsbHktZXhwYW5kZWQgZGVmaW5pdGlvbiBvZiBAY2l0ZSB0byBhcHBlYXIKKyAgJSBhcyBhIHJlc3VsdCBvZiB0aGUgXG1lc3NhZ2UsIHdlIGp1c3Qgd2FudCBgQGNpdGUnIGl0c2VsZi4gIFdlIHVzZQorICAlIFx0aGU8dG9rcyByZWdpc3Rlcj4gdG8gYWNoaWV2ZSB0aGlzOiBUZVggZXhwYW5kcyBcdGhlPHRva3M+IG9ubHkgb25jZSwKKyAgJSBzaW1wbHkgeWllbGRpbmcgdGhlIGNvbnRlbnRzIG9mIDx0b2tzIHJlZ2lzdGVyPi4gIChXZSBhbHNvIGRvIHRoaXMgZm9yCisgICUgdGhlIHRvYyBlbnRyaWVzLikKKyAgXHRva3MwID0geyMxfSUKKyAgXG1lc3NhZ2V7KFx0aGVcdG9rczApfSUKKyAgJQorICBcY2hhcG1hY3JveyMxfXtZbm90aGluZ317XHRoZVx1bm51bWJlcmVkbm99JQorICAlCisgIFxnbG9iYWxcbGV0XHNlY3Rpb24gPSBcdW5udW1iZXJlZHNlYworICBcZ2xvYmFsXGxldFxzdWJzZWN0aW9uID0gXHVubnVtYmVyZWRzdWJzZWMKKyAgXGdsb2JhbFxsZXRcc3Vic3Vic2VjdGlvbiA9IFx1bm51bWJlcmVkc3Vic3Vic2VjCit9CisKKyUgQGNlbnRlcmNoYXAgaXMgbGlrZSBAdW5udW1iZXJlZCwgYnV0IHRoZSBoZWFkaW5nIGlzIGNlbnRlcmVkLgorXG91dGVyXHBhcnNlYXJnZGVmXGNlbnRlcmNoYXB7JQorICAlIFdlbGwsIHdlIGNvdWxkIGRvIHRoZSBmb2xsb3dpbmcgaW4gYSBncm91cCwgYnV0IHRoYXQgd291bGQgYnJlYWsKKyAgJSBhbiBhc3N1bXB0aW9uIHRoYXQgXGNoYXBtYWNybyBpcyBjYWxsZWQgYXQgdGhlIG91dGVybW9zdCBsZXZlbC4KKyAgJSBUaHVzIHdlIGFyZSBzYWZlciB0aGlzIHdheToJCS0ta2FzYWwsIDI0ZmViMDQKKyAgXGxldFxjZW50ZXJwYXJhbWV0ZXJzbWF5YmUgPSBcY2VudGVycGFyYW1ldGVycworICBcdW5ubWhlYWQweyMxfSUKKyAgXGxldFxjZW50ZXJwYXJhbWV0ZXJzbWF5YmUgPSBccmVsYXgKK30KKworJSBAdG9wIGlzIGxpa2UgQHVubnVtYmVyZWQuCitcbGV0XHRvcFx1bm51bWJlcmVkCisKKyUgU2VjdGlvbnMuCitcb3V0ZXJccGFyc2VhcmdkZWZcbnVtYmVyZWRzZWN7XG51bWhlYWQxeyMxfX0gJSBub3JtYWxseSBjYWxscyBzZWN6enoKK1xkZWZcc2Vjenp6IzF7JQorICBcZ2xvYmFsXHN1YnNlY25vPTAgXGdsb2JhbFxzdWJzdWJzZWNubz0wICBcZ2xvYmFsXGFkdmFuY2Vcc2Vjbm8gYnkgMQorICBcc2VjdGlvbmhlYWRpbmd7IzF9e3NlY317WW51bWJlcmVkfXtcdGhlXGNoYXBuby5cdGhlXHNlY25vfSUKK30KKworXG91dGVyXHBhcnNlYXJnZGVmXGFwcGVuZGl4c2VjdGlvbntcYXBwaGVhZDF7IzF9fSAlIG5vcm1hbGx5IGNhbGxzIGFwcGVuZGl4c2VjdGlvbnp6egorXGRlZlxhcHBlbmRpeHNlY3Rpb256enojMXslCisgIFxnbG9iYWxcc3Vic2Vjbm89MCBcZ2xvYmFsXHN1YnN1YnNlY25vPTAgIFxnbG9iYWxcYWR2YW5jZVxzZWNubyBieSAxCisgIFxzZWN0aW9uaGVhZGluZ3sjMX17c2VjfXtZYXBwZW5kaXh9e1xhcHBlbmRpeGxldHRlci5cdGhlXHNlY25vfSUKK30KK1xsZXRcYXBwZW5kaXhzZWNcYXBwZW5kaXhzZWN0aW9uCisKK1xvdXRlclxwYXJzZWFyZ2RlZlx1bm51bWJlcmVkc2Vje1x1bm5taGVhZDF7IzF9fSAlIG5vcm1hbGx5IGNhbGxzIHVubnVtYmVyZWRzZWN6enoKK1xkZWZcdW5udW1iZXJlZHNlY3p6eiMxeyUKKyAgXGdsb2JhbFxzdWJzZWNubz0wIFxnbG9iYWxcc3Vic3Vic2Vjbm89MCAgXGdsb2JhbFxhZHZhbmNlXHNlY25vIGJ5IDEKKyAgXHNlY3Rpb25oZWFkaW5neyMxfXtzZWN9e1lub3RoaW5nfXtcdGhlXHVubnVtYmVyZWRuby5cdGhlXHNlY25vfSUKK30KKworJSBTdWJzZWN0aW9ucy4KK1xvdXRlclxwYXJzZWFyZ2RlZlxudW1iZXJlZHN1YnNlY3tcbnVtaGVhZDJ7IzF9fSAlIG5vcm1hbGx5IGNhbGxzIG51bWJlcmVkc3Vic2Vjenp6CitcZGVmXG51bWJlcmVkc3Vic2Vjenp6IzF7JQorICBcZ2xvYmFsXHN1YnN1YnNlY25vPTAgIFxnbG9iYWxcYWR2YW5jZVxzdWJzZWNubyBieSAxCisgIFxzZWN0aW9uaGVhZGluZ3sjMX17c3Vic2VjfXtZbnVtYmVyZWR9e1x0aGVcY2hhcG5vLlx0aGVcc2Vjbm8uXHRoZVxzdWJzZWNub30lCit9CisKK1xvdXRlclxwYXJzZWFyZ2RlZlxhcHBlbmRpeHN1YnNlY3tcYXBwaGVhZDJ7IzF9fSAlIG5vcm1hbGx5IGNhbGxzIGFwcGVuZGl4c3Vic2Vjenp6CitcZGVmXGFwcGVuZGl4c3Vic2Vjenp6IzF7JQorICBcZ2xvYmFsXHN1YnN1YnNlY25vPTAgIFxnbG9iYWxcYWR2YW5jZVxzdWJzZWNubyBieSAxCisgIFxzZWN0aW9uaGVhZGluZ3sjMX17c3Vic2VjfXtZYXBwZW5kaXh9JQorICAgICAgICAgICAgICAgICB7XGFwcGVuZGl4bGV0dGVyLlx0aGVcc2Vjbm8uXHRoZVxzdWJzZWNub30lCit9CisKK1xvdXRlclxwYXJzZWFyZ2RlZlx1bm51bWJlcmVkc3Vic2Vje1x1bm5taGVhZDJ7IzF9fSAlbm9ybWFsbHkgY2FsbHMgdW5udW1iZXJlZHN1YnNlY3p6egorXGRlZlx1bm51bWJlcmVkc3Vic2Vjenp6IzF7JQorICBcZ2xvYmFsXHN1YnN1YnNlY25vPTAgIFxnbG9iYWxcYWR2YW5jZVxzdWJzZWNubyBieSAxCisgIFxzZWN0aW9uaGVhZGluZ3sjMX17c3Vic2VjfXtZbm90aGluZ30lCisgICAgICAgICAgICAgICAgIHtcdGhlXHVubnVtYmVyZWRuby5cdGhlXHNlY25vLlx0aGVcc3Vic2Vjbm99JQorfQorCislIFN1YnN1YnNlY3Rpb25zLgorXG91dGVyXHBhcnNlYXJnZGVmXG51bWJlcmVkc3Vic3Vic2Vje1xudW1oZWFkM3sjMX19ICUgbm9ybWFsbHkgbnVtYmVyZWRzdWJzdWJzZWN6enoKK1xkZWZcbnVtYmVyZWRzdWJzdWJzZWN6enojMXslCisgIFxnbG9iYWxcYWR2YW5jZVxzdWJzdWJzZWNubyBieSAxCisgIFxzZWN0aW9uaGVhZGluZ3sjMX17c3Vic3Vic2VjfXtZbnVtYmVyZWR9JQorICAgICAgICAgICAgICAgICB7XHRoZVxjaGFwbm8uXHRoZVxzZWNuby5cdGhlXHN1YnNlY25vLlx0aGVcc3Vic3Vic2Vjbm99JQorfQorCitcb3V0ZXJccGFyc2VhcmdkZWZcYXBwZW5kaXhzdWJzdWJzZWN7XGFwcGhlYWQzeyMxfX0gJSBub3JtYWxseSBhcHBlbmRpeHN1YnN1YnNlY3p6egorXGRlZlxhcHBlbmRpeHN1YnN1YnNlY3p6eiMxeyUKKyAgXGdsb2JhbFxhZHZhbmNlXHN1YnN1YnNlY25vIGJ5IDEKKyAgXHNlY3Rpb25oZWFkaW5neyMxfXtzdWJzdWJzZWN9e1lhcHBlbmRpeH0lCisgICAgICAgICAgICAgICAgIHtcYXBwZW5kaXhsZXR0ZXIuXHRoZVxzZWNuby5cdGhlXHN1YnNlY25vLlx0aGVcc3Vic3Vic2Vjbm99JQorfQorCitcb3V0ZXJccGFyc2VhcmdkZWZcdW5udW1iZXJlZHN1YnN1YnNlY3tcdW5ubWhlYWQzeyMxfX0gJW5vcm1hbGx5IHVubnVtYmVyZWRzdWJzdWJzZWN6enoKK1xkZWZcdW5udW1iZXJlZHN1YnN1YnNlY3p6eiMxeyUKKyAgXGdsb2JhbFxhZHZhbmNlXHN1YnN1YnNlY25vIGJ5IDEKKyAgXHNlY3Rpb25oZWFkaW5neyMxfXtzdWJzdWJzZWN9e1lub3RoaW5nfSUKKyAgICAgICAgICAgICAgICAge1x0aGVcdW5udW1iZXJlZG5vLlx0aGVcc2Vjbm8uXHRoZVxzdWJzZWNuby5cdGhlXHN1YnN1YnNlY25vfSUKK30KKworJSBUaGVzZSBtYWNyb3MgY29udHJvbCB3aGF0IHRoZSBzZWN0aW9uIGNvbW1hbmRzIGRvLCBhY2NvcmRpbmcKKyUgdG8gd2hhdCBraW5kIG9mIGNoYXB0ZXIgd2UgYXJlIGluIChvcmRpbmFyeSwgYXBwZW5kaXgsIG9yIHVubnVtYmVyZWQpLgorJSBEZWZpbmUgdGhlbSBieSBkZWZhdWx0IGZvciBhIG51bWJlcmVkIGNoYXB0ZXIuCitcbGV0XHNlY3Rpb24gPSBcbnVtYmVyZWRzZWMKK1xsZXRcc3Vic2VjdGlvbiA9IFxudW1iZXJlZHN1YnNlYworXGxldFxzdWJzdWJzZWN0aW9uID0gXG51bWJlcmVkc3Vic3Vic2VjCisKKyUgRGVmaW5lIEBtYWpvcmhlYWRpbmcsIEBoZWFkaW5nIGFuZCBAc3ViaGVhZGluZworCislIE5PVEUgb24gdXNlIG9mIFx2Ym94IGZvciBjaGFwdGVyIGhlYWRpbmdzLCBzZWN0aW9uIGhlYWRpbmdzLCBhbmQgc3VjaDoKKyUgICAgICAgMSkgV2UgdXNlIFx2Ym94IHJhdGhlciB0aGFuIHRoZSBlYXJsaWVyIFxsaW5lIHRvIHBlcm1pdAorJSAgICAgICAgICBvdmVybG9uZyBoZWFkaW5ncyB0byBmb2xkLgorJSAgICAgICAyKSBcaHlwaGVucGVuYWx0eSBpcyBzZXQgdG8gMTAwMDAgYmVjYXVzZSBoeXBoZW5hdGlvbiBpbiBhCislICAgICAgICAgIGhlYWRpbmcgaXMgb2Jub3hpb3VzOyB0aGlzIGZvcmJpZHMgaXQuCislICAgICAgIDMpIExpa2V3aXNlLCBoZWFkaW5ncyBsb29rIGJlc3QgaWYgbm8gXHBhcmluZGVudCBpcyB1c2VkLCBhbmQKKyUgICAgICAgICAgaWYganVzdGlmaWNhdGlvbiBpcyBub3QgYXR0ZW1wdGVkLiAgSGVuY2UgXHJhZ2dlZHJpZ2h0LgorCisKK1xkZWZcbWFqb3JoZWFkaW5neyUKKyAge1xhZHZhbmNlXGNoYXBoZWFkaW5nc2tpcCBieSAxMHB0IFxjaGFwYnJlYWsgfSUKKyAgXHBhcnNlYXJnXGNoYXBoZWFkaW5nenp6Cit9CisKK1xkZWZcY2hhcGhlYWRpbmd7XGNoYXBicmVhayBccGFyc2VhcmdcY2hhcGhlYWRpbmd6enp9CitcZGVmXGNoYXBoZWFkaW5nenp6IzF7JQorICB7XGNoYXBmb250cyBcdmJveHtcaHlwaGVucGVuYWx0eT0xMDAwMFx0b2xlcmFuY2U9NTAwMAorICAgICAgICAgICAgICAgICAgICBccGFyaW5kZW50PTBwdFxyYWdnZWRyaWdodAorICAgICAgICAgICAgICAgICAgICBccm0gIzFcaGZpbGx9fSUKKyAgXGJpZ3NraXAgXHBhclxwZW5hbHR5IDIwMFxyZWxheAorICBcc3VwcHJlc3NmaXJzdHBhcmFncmFwaGluZGVudAorfQorCislIEBoZWFkaW5nLCBAc3ViaGVhZGluZywgQHN1YnN1YmhlYWRpbmcuCitccGFyc2VhcmdkZWZcaGVhZGluZ3tcc2VjdGlvbmhlYWRpbmd7IzF9e3NlY317WW9taXRmcm9tdG9jfXt9CisgIFxzdXBwcmVzc2ZpcnN0cGFyYWdyYXBoaW5kZW50fQorXHBhcnNlYXJnZGVmXHN1YmhlYWRpbmd7XHNlY3Rpb25oZWFkaW5neyMxfXtzdWJzZWN9e1lvbWl0ZnJvbXRvY317fQorICBcc3VwcHJlc3NmaXJzdHBhcmFncmFwaGluZGVudH0KK1xwYXJzZWFyZ2RlZlxzdWJzdWJoZWFkaW5ne1xzZWN0aW9uaGVhZGluZ3sjMX17c3Vic3Vic2VjfXtZb21pdGZyb210b2N9e30KKyAgXHN1cHByZXNzZmlyc3RwYXJhZ3JhcGhpbmRlbnR9CisKKyUgVGhlc2UgbWFjcm9zIGdlbmVyYXRlIGEgY2hhcHRlciwgc2VjdGlvbiwgZXRjLiBoZWFkaW5nIG9ubHkKKyUgKGluY2x1ZGluZyB3aGl0ZXNwYWNlLCBsaW5lYnJlYWtpbmcsIGV0Yy4gYXJvdW5kIGl0KSwKKyUgZ2l2ZW4gYWxsIHRoZSBpbmZvcm1hdGlvbiBpbiBjb252ZW5pZW50LCBwYXJzZWQgZm9ybS4KKworJSUlIEFyZ3MgYXJlIHRoZSBza2lwIGFuZCBwZW5hbHR5ICh1c3VhbGx5IG5lZ2F0aXZlKQorXGRlZlxkb2JyZWFrIzEjMntccGFyXGlmZGltXGxhc3Rza2lwPCMxXHJlbW92ZWxhc3Rza2lwXHBlbmFsdHkjMlx2c2tpcCMxXGZpfQorCislJSUgRGVmaW5lIHBsYWluIGNoYXB0ZXIgc3RhcnRzLCBhbmQgcGFnZSBvbi9vZmYgc3dpdGNoaW5nIGZvciBpdAorJSBQYXJhbWV0ZXIgY29udHJvbGxpbmcgc2tpcCBiZWZvcmUgY2hhcHRlciBoZWFkaW5ncyAoaWYgbmVlZGVkKQorCitcbmV3c2tpcFxjaGFwaGVhZGluZ3NraXAKKworXGRlZlxjaGFwYnJlYWt7XGRvYnJlYWsgXGNoYXBoZWFkaW5nc2tpcCB7LTQwMDB9fQorXGRlZlxjaGFwcGFnZXJ7XHBhclx2ZmlsbFxzdXBlcmVqZWN0fQorXGRlZlxjaGFwb2RkcGFnZXtcY2hhcHBhZ2VyIFxpZm9kZFxwYWdlbm8gXGVsc2UgXGhib3ggdG8gMHB0e30gXGNoYXBwYWdlclxmaX0KKworXGRlZlxzZXRjaGFwdGVybmV3cGFnZSAjMSB7XGNzbmFtZSBDSEFQUEFHIzFcZW5kY3NuYW1lfQorCitcZGVmXENIQVBQQUdvZmZ7JQorXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBwYWdlcgorXGdsb2JhbFxsZXRccGNoYXBzZXBtYWNybz1cY2hhcGJyZWFrCitcZ2xvYmFsXGxldFxwYWdlYWxpZ25tYWNybz1cY2hhcHBhZ2VyfQorCitcZGVmXENIQVBQQUdvbnslCitcZ2xvYmFsXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcHBhZ2VyCitcZ2xvYmFsXGxldFxwY2hhcHNlcG1hY3JvPVxjaGFwcGFnZXIKK1xnbG9iYWxcbGV0XHBhZ2VhbGlnbm1hY3JvPVxjaGFwcGFnZXIKK1xnbG9iYWxcZGVmXEhFQURJTkdTb257XEhFQURJTkdTc2luZ2xlfX0KKworXGRlZlxDSEFQUEFHb2RkeyUKK1xnbG9iYWxcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwb2RkcGFnZQorXGdsb2JhbFxsZXRccGNoYXBzZXBtYWNybz1cY2hhcG9kZHBhZ2UKK1xnbG9iYWxcbGV0XHBhZ2VhbGlnbm1hY3JvPVxjaGFwb2RkcGFnZQorXGdsb2JhbFxkZWZcSEVBRElOR1NvbntcSEVBRElOR1Nkb3VibGV9fQorCitcQ0hBUFBBR29uCisKKyUgQ2hhcHRlciBvcGVuaW5nLgorJQorJSAjMSBpcyB0aGUgdGV4dCwgIzIgaXMgdGhlIHNlY3Rpb24gdHlwZSAoWW51bWJlcmVkLCBZbm90aGluZywKKyUgWWFwcGVuZGl4LCBZb21pdGZyb210b2MpLCAjMyB0aGUgY2hhcHRlciBudW1iZXIuCislCislIFRvIHRlc3QgYWdhaW5zdCBvdXIgYXJndW1lbnQuCitcZGVmXFlub3RoaW5na2V5d29yZHtZbm90aGluZ30KK1xkZWZcWW9taXRmcm9tdG9ja2V5d29yZHtZb21pdGZyb210b2N9CitcZGVmXFlhcHBlbmRpeGtleXdvcmR7WWFwcGVuZGl4fQorJQorXGRlZlxjaGFwbWFjcm8jMSMyIzN7JQorICBccGNoYXBzZXBtYWNybworICB7JQorICAgIFxjaGFwZm9udHMgXHJtCisgICAgJQorICAgICUgSGF2ZSB0byBkZWZpbmUgXHRoaXNzZWN0aW9uIGJlZm9yZSBjYWxsaW5nIFxkb25vZGVyZWYsIGJlY2F1c2UgdGhlCisgICAgJSB4cmVmIGNvZGUgZXZlbnR1YWxseSB1c2VzIGl0LiAgT24gdGhlIG90aGVyIGhhbmQsIGl0IGhhcyB0byBiZSBjYWxsZWQKKyAgICAlIGFmdGVyIFxwY2hhcHNlcG1hY3JvLCBvciB0aGUgaGVhZGxpbmUgd2lsbCBjaGFuZ2UgdG9vIHNvb24uCisgICAgXGdkZWZcdGhpc3NlY3Rpb257IzF9JQorICAgIFxnZGVmXHRoaXNjaGFwdGVybmFtZXsjMX0lCisgICAgJQorICAgICUgT25seSBpbnNlcnQgdGhlIHNlcGFyYXRpbmcgc3BhY2UgaWYgd2UgaGF2ZSBhIGNoYXB0ZXIvYXBwZW5kaXgKKyAgICAlIG51bWJlciwgYW5kIGRvbid0IHByaW50IHRoZSB1bm51bWJlcmVkIGBgbnVtYmVyJycuCisgICAgXGRlZlx0ZW1wdHlwZXsjMn0lCisgICAgXGlmeFx0ZW1wdHlwZVxZbm90aGluZ2tleXdvcmQKKyAgICAgIFxzZXRib3gwID0gXGhib3h7fSUKKyAgICAgIFxkZWZcdG9jdHlwZXt1bm5jaGFwfSUKKyAgICAgIFxkZWZcdGhpc2NoYXB0ZXJ7IzF9JQorICAgIFxlbHNlXGlmeFx0ZW1wdHlwZVxZb21pdGZyb210b2NrZXl3b3JkCisgICAgICBcc2V0Ym94MCA9IFxoYm94e30lIGNvbnRlbnRzIGxpa2UgdW5udW1iZXJlZCwgYnV0IG5vIHRvYyBlbnRyeQorICAgICAgXGRlZlx0b2N0eXBle29taXR9JQorICAgICAgXHhkZWZcdGhpc2NoYXB0ZXJ7fSUKKyAgICBcZWxzZVxpZnhcdGVtcHR5cGVcWWFwcGVuZGl4a2V5d29yZAorICAgICAgXHNldGJveDAgPSBcaGJveHtccHV0d29yZEFwcGVuZGl4e30gIzNcZW5zcGFjZX0lCisgICAgICBcZGVmXHRvY3R5cGV7YXBwfSUKKyAgICAgICUgV2UgZG9uJ3Qgc3Vic3RpdHV0ZSB0aGUgYWN0dWFsIGNoYXB0ZXIgbmFtZSBpbnRvIFx0aGlzY2hhcHRlcgorICAgICAgJSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgaXRzIG1hY3JvcyBldmFsdWF0ZWQgbm93LiAgQW5kIHdlIGRvbid0CisgICAgICAlIHVzZSBcdGhpc3NlY3Rpb24gYmVjYXVzZSB0aGF0IGNoYW5nZXMgd2l0aCBlYWNoIHNlY3Rpb24uCisgICAgICAlCisgICAgICBceGRlZlx0aGlzY2hhcHRlcntccHV0d29yZEFwcGVuZGl4e30gXGFwcGVuZGl4bGV0dGVyOgorICAgICAgICAgICAgICAgICAgICAgICAgXG5vZXhwYW5kXHRoaXNjaGFwdGVybmFtZX0lCisgICAgXGVsc2UKKyAgICAgIFxzZXRib3gwID0gXGhib3h7IzNcZW5zcGFjZX0lCisgICAgICBcZGVmXHRvY3R5cGV7bnVtY2hhcH0lCisgICAgICBceGRlZlx0aGlzY2hhcHRlcntccHV0d29yZENoYXB0ZXJ7fSBcdGhlXGNoYXBubzoKKyAgICAgICAgICAgICAgICAgICAgICAgIFxub2V4cGFuZFx0aGlzY2hhcHRlcm5hbWV9JQorICAgIFxmaVxmaVxmaQorICAgICUKKyAgICAlIFdyaXRlIHRoZSB0b2MgZW50cnkgZm9yIHRoaXMgY2hhcHRlci4gIE11c3QgY29tZSBiZWZvcmUgdGhlCisgICAgJSBcZG9ub2RlcmVmLCBiZWNhdXNlIHdlIGluY2x1ZGUgdGhlIGN1cnJlbnQgbm9kZSBuYW1lIGluIHRoZSB0b2MKKyAgICAlIGVudHJ5LCBhbmQgXGRvbm9kZXJlZiByZXNldHMgaXQgdG8gZW1wdHkuCisgICAgXHdyaXRldG9jZW50cnl7XHRvY3R5cGV9eyMxfXsjM30lCisgICAgJQorICAgICUgRm9yIHBkZnRleCwgd2UgaGF2ZSB0byB3cml0ZSBvdXQgdGhlIG5vZGUgZGVmaW5pdGlvbiAoYWthLCBtYWtlCisgICAgJSB0aGUgcGRmZGVzdCkgYWZ0ZXIgYW55IHBhZ2UgYnJlYWssIGJ1dCBiZWZvcmUgdGhlIGFjdHVhbCB0ZXh0IGhhcworICAgICUgYmVlbiB0eXBlc2V0LiAgSWYgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgcGRmIG91dGxpbmUgaXMgYWZ0ZXIgdGhlCisgICAgJSB0ZXh0LCB0aGVuIGp1bXBpbmcgZnJvbSB0aGUgb3V0bGluZSBtYXkgd2luZCB1cCB3aXRoIHRoZSB0ZXh0IG5vdAorICAgICUgYmVpbmcgdmlzaWJsZSwgZm9yIGluc3RhbmNlIHVuZGVyIGhpZ2ggbWFnbmlmaWNhdGlvbi4KKyAgICBcZG9ub2RlcmVmeyMyfSUKKyAgICAlCisgICAgJSBUeXBlc2V0IHRoZSBhY3R1YWwgaGVhZGluZy4KKyAgICBcdmJveHtcaHlwaGVucGVuYWx0eT0xMDAwMCBcdG9sZXJhbmNlPTUwMDAgXHBhcmluZGVudD0wcHQgXHJhZ2dlZHJpZ2h0CisgICAgICAgICAgXGhhbmdpbmRlbnQ9XHdkMCBcY2VudGVycGFyYW1ldGVyc21heWJlCisgICAgICAgICAgXHVuaGJveDAgIzFccGFyfSUKKyAgfSUKKyAgXG5vYnJlYWtcYmlnc2tpcCAlIG5vIHBhZ2UgYnJlYWsgYWZ0ZXIgYSBjaGFwdGVyIHRpdGxlCisgIFxub2JyZWFrCit9CisKKyUgQGNlbnRlcmNoYXAgLS0gY2VudGVyZWQgYW5kIHVubnVtYmVyZWQuCitcbGV0XGNlbnRlcnBhcmFtZXRlcnNtYXliZSA9IFxyZWxheAorXGRlZlxjZW50ZXJwYXJhbWV0ZXJzeyUKKyAgXGFkdmFuY2VccmlnaHRza2lwIGJ5IDNccmlnaHRza2lwCisgIFxsZWZ0c2tpcCA9IFxyaWdodHNraXAKKyAgXHBhcmZpbGxza2lwID0gMHB0Cit9CisKKworJSBJIGRvbid0IHRoaW5rIHRoaXMgY2hhcHRlciBzdHlsZSBpcyBzdXBwb3J0ZWQgYW55IG1vcmUsIHNvIEknbSBub3QKKyUgdXBkYXRpbmcgaXQgd2l0aCB0aGUgbmV3IG5vZGVyZWYgc3R1ZmYuICBXZSdsbCBzZWUuICAtLWthcmwsIDExYXVnMDMuCislCitcZGVmXHNldGNoYXB0ZXJzdHlsZSAjMSB7XGNzbmFtZSBDSEFQRiMxXGVuZGNzbmFtZX0KKyUKK1xkZWZcdW5uY2hmb3BlbiAjMXslCitcY2hhcG9kZHBhZ2Uge1xjaGFwZm9udHMgXHZib3h7XGh5cGhlbnBlbmFsdHk9MTAwMDBcdG9sZXJhbmNlPTUwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgXHBhcmluZGVudD0wcHRccmFnZ2VkcmlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgXHJtICMxXGhmaWxsfX1cYmlnc2tpcCBccGFyXG5vYnJlYWsKK30KK1xkZWZcY2hmb3BlbiAjMSMye1xjaGFwb2RkcGFnZSB7XGNoYXBmb250cworXHZib3ggdG8gM2lue1x2ZmlsIFxoYm94IHRvXGhzaXple1xoZmlsICMyfSBcaGJveCB0b1xoc2l6ZXtcaGZpbCAjMX0gXHZmaWx9fSUKK1xwYXJccGVuYWx0eSA1MDAwICUKK30KK1xkZWZcY2VudGVyY2hmb3BlbiAjMXslCitcY2hhcG9kZHBhZ2Uge1xjaGFwZm9udHMgXHZib3h7XGh5cGhlbnBlbmFsdHk9MTAwMDBcdG9sZXJhbmNlPTUwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgXHBhcmluZGVudD0wcHQKKyAgICAgICAgICAgICAgICAgICAgICAgXGhmaWxsIHtccm0gIzF9XGhmaWxsfX1cYmlnc2tpcCBccGFyXG5vYnJlYWsKK30KK1xkZWZcQ0hBUEZvcGVueyUKKyAgXGdsb2JhbFxsZXRcY2hhcG1hY3JvPVxjaGZvcGVuCisgIFxnbG9iYWxcbGV0XGNlbnRlcmNoYXBtYWNybz1cY2VudGVyY2hmb3Blbn0KKworCislIFNlY3Rpb24gdGl0bGVzLiAgVGhlc2UgbWFjcm9zIGNvbWJpbmUgdGhlIHNlY3Rpb24gbnVtYmVyIHBhcnRzIGFuZAorJSBjYWxsIHRoZSBnZW5lcmljIFxzZWN0aW9uaGVhZGluZyB0byBkbyB0aGUgcHJpbnRpbmcuCislCitcbmV3c2tpcFxzZWNoZWFkaW5nc2tpcAorXGRlZlxzZWNoZWFkaW5nYnJlYWt7XGRvYnJlYWsgXHNlY2hlYWRpbmdza2lwey0xMDAwfX0KKworJSBTdWJzZWN0aW9uIHRpdGxlcy4KK1xuZXdza2lwXHN1YnNlY2hlYWRpbmdza2lwCitcZGVmXHN1YnNlY2hlYWRpbmdicmVha3tcZG9icmVhayBcc3Vic2VjaGVhZGluZ3NraXB7LTUwMH19CisKKyUgU3Vic3Vic2VjdGlvbiB0aXRsZXMuCitcZGVmXHN1YnN1YnNlY2hlYWRpbmdza2lwe1xzdWJzZWNoZWFkaW5nc2tpcH0KK1xkZWZcc3Vic3Vic2VjaGVhZGluZ2JyZWFre1xzdWJzZWNoZWFkaW5nYnJlYWt9CisKKworJSBQcmludCBhbnkgc2l6ZSwgYW55IHR5cGUsIHNlY3Rpb24gdGl0bGUuCislCislICMxIGlzIHRoZSB0ZXh0LCAjMiBpcyB0aGUgc2VjdGlvbiBsZXZlbCAoc2VjL3N1YnNlYy9zdWJzdWJzZWMpLCAjMyBpcworJSB0aGUgc2VjdGlvbiB0eXBlIGZvciB4cmVmcyAoWW51bWJlcmVkLCBZbm90aGluZywgWWFwcGVuZGl4KSwgIzQgaXMgdGhlCislIHNlY3Rpb24gbnVtYmVyLgorJQorXGRlZlxzZWN0aW9uaGVhZGluZyMxIzIjMyM0eyUKKyAgeyUKKyAgICAlIFN3aXRjaCB0byB0aGUgcmlnaHQgc2V0IG9mIGZvbnRzLgorICAgIFxjc25hbWUgIzJmb250c1xlbmRjc25hbWUgXHJtCisgICAgJQorICAgICUgSW5zZXJ0IHNwYWNlIGFib3ZlIHRoZSBoZWFkaW5nLgorICAgIFxjc25hbWUgIzJoZWFkaW5nYnJlYWtcZW5kY3NuYW1lCisgICAgJQorICAgICUgT25seSBpbnNlcnQgdGhlIHNwYWNlIGFmdGVyIHRoZSBudW1iZXIgaWYgd2UgaGF2ZSBhIHNlY3Rpb24gbnVtYmVyLgorICAgIFxkZWZcc2VjdGlvbmxldmVseyMyfSUKKyAgICBcZGVmXHRlbXB0eXBleyMzfSUKKyAgICAlCisgICAgXGlmeFx0ZW1wdHlwZVxZbm90aGluZ2tleXdvcmQKKyAgICAgIFxzZXRib3gwID0gXGhib3h7fSUKKyAgICAgIFxkZWZcdG9jdHlwZXt1bm59JQorICAgICAgXGdkZWZcdGhpc3NlY3Rpb257IzF9JQorICAgIFxlbHNlXGlmeFx0ZW1wdHlwZVxZb21pdGZyb210b2NrZXl3b3JkCisgICAgICAlIGZvciBAaGVhZGluZ3MgLS0gbm8gc2VjdGlvbiBudW1iZXIsIGRvbid0IGluY2x1ZGUgaW4gdG9jLAorICAgICAgJSBhbmQgZG9uJ3QgcmVkZWZpbmUgXHRoaXNzZWN0aW9uLgorICAgICAgXHNldGJveDAgPSBcaGJveHt9JQorICAgICAgXGRlZlx0b2N0eXBle29taXR9JQorICAgICAgXGxldFxzZWN0aW9ubGV2ZWw9XGVtcHR5CisgICAgXGVsc2VcaWZ4XHRlbXB0eXBlXFlhcHBlbmRpeGtleXdvcmQKKyAgICAgIFxzZXRib3gwID0gXGhib3h7IzRcZW5zcGFjZX0lCisgICAgICBcZGVmXHRvY3R5cGV7YXBwfSUKKyAgICAgIFxnZGVmXHRoaXNzZWN0aW9ueyMxfSUKKyAgICBcZWxzZQorICAgICAgXHNldGJveDAgPSBcaGJveHsjNFxlbnNwYWNlfSUKKyAgICAgIFxkZWZcdG9jdHlwZXtudW19JQorICAgICAgXGdkZWZcdGhpc3NlY3Rpb257IzF9JQorICAgIFxmaVxmaVxmaQorICAgICUKKyAgICAlIFdyaXRlIHRoZSB0b2MgZW50cnkgKGJlZm9yZSBcZG9ub2RlcmVmKS4gIFNlZSBjb21tZW50cyBpbiBcY2hmcGxhaW4uCisgICAgXHdyaXRldG9jZW50cnl7XHRvY3R5cGVcc2VjdGlvbmxldmVsfXsjMX17IzR9JQorICAgICUKKyAgICAlIFdyaXRlIHRoZSBub2RlIHJlZmVyZW5jZSAoPSBwZGYgZGVzdGluYXRpb24gZm9yIHBkZnRleCkuCisgICAgJSBBZ2Fpbiwgc2VlIGNvbW1lbnRzIGluIFxjaGZwbGFpbi4KKyAgICBcZG9ub2RlcmVmeyMzfSUKKyAgICAlCisgICAgJSBPdXRwdXQgdGhlIGFjdHVhbCBzZWN0aW9uIGhlYWRpbmcuCisgICAgXHZib3h7XGh5cGhlbnBlbmFsdHk9MTAwMDAgXHRvbGVyYW5jZT01MDAwIFxwYXJpbmRlbnQ9MHB0IFxyYWdnZWRyaWdodAorICAgICAgICAgIFxoYW5naW5kZW50PVx3ZDAgICUgemVybyBpZiBubyBzZWN0aW9uIG51bWJlcgorICAgICAgICAgIFx1bmhib3gwICMxfSUKKyAgfSUKKyAgJSBBZGQgZXh0cmEgc3BhY2UgYWZ0ZXIgdGhlIGhlYWRpbmcgLS0gaGFsZiBvZiB3aGF0ZXZlciBjYW1lIGFib3ZlIGl0LgorICAlIERvbid0IGFsbG93IHN0cmV0Y2gsIHRob3VnaC4KKyAgXGtlcm4gLjUgXGNzbmFtZSAjMmhlYWRpbmdza2lwXGVuZGNzbmFtZQorICAlCisgICUgRG8gbm90IGxldCB0aGUga2VybiBiZSBhIHBvdGVudGlhbCBicmVha3BvaW50LCBhcyBpdCB3b3VsZCBiZSBpZiBpdAorICAlIHdhcyBmb2xsb3dlZCBieSBnbHVlLgorICBcbm9icmVhaworICAlCisgICUgV2UnbGwgYWxtb3N0IGNlcnRhaW5seSBzdGFydCBhIHBhcmFncmFwaCBuZXh0LCBzbyBkb24ndCBsZXQgdGhhdAorICAlIGdsdWUgYWNjdW11bGF0ZS4gIChOb3QgYSBicmVha3BvaW50IGJlY2F1c2UgaXQncyBwcmVjZWRlZCBieSBhCisgICUgZGlzY2FyZGFibGUgaXRlbS4pCisgIFx2c2tpcC1ccGFyc2tpcAorICAlIAorICAlIFRoaXMgaXMgcHVyZWx5IHNvIHRoZSBsYXN0IGl0ZW0gb24gdGhlIGxpc3QgaXMgYSBrbm93biBccGVuYWx0eSA+CisgICUgMTAwMDAuICBUaGlzIGlzIHNvIFxzdGFydGRlZnVuIGNhbiBhdm9pZCBhbGxvd2luZyBicmVha3BvaW50cyBhZnRlcgorICAlIHNlY3Rpb24gaGVhZGluZ3MuICBPdGhlcndpc2UsIGl0IHdvdWxkIGluc2VydCBhIHZhbGlkIGJyZWFrcG9pbnQgYmV0d2VlbjoKKyAgJSAKKyAgJSAgIEBzZWN0aW9uIHNlYy13aGF0ZXZlcgorICAlICAgQGRlZmZuIGRlZi13aGF0ZXZlcgorICBccGVuYWx0eSAxMDAwMQorfQorCisKK1xtZXNzYWdle3RvYyx9CislIFRhYmxlIG9mIGNvbnRlbnRzLgorXG5ld3dyaXRlXHRvY2ZpbGUKKworJSBXcml0ZSBhbiBlbnRyeSB0byB0aGUgdG9jIGZpbGUsIG9wZW5pbmcgaXQgaWYgbmVjZXNzYXJ5LgorJSBDYWxsZWQgZnJvbSBAY2hhcHRlciwgZXRjLgorJQorJSBFeGFtcGxlIHVzYWdlOiBcd3JpdGV0b2NlbnRyeXtzZWN9e1NlY3Rpb24gTmFtZX17XHRoZVxjaGFwbm8uXHRoZVxzZWNub30KKyUgV2UgYXBwZW5kIHRoZSBjdXJyZW50IG5vZGUgbmFtZSAoaWYgYW55KSBhbmQgcGFnZSBudW1iZXIgYXMgYWRkaXRpb25hbAorJSBhcmd1bWVudHMgZm9yIHRoZSBce2NoYXAsc2VjLC4uLn1lbnRyeSBtYWNyb3Mgd2hpY2ggd2lsbCBldmVudHVhbGx5CislIHJlYWQgdGhpcy4gIFRoZSBub2RlIG5hbWUgaXMgdXNlZCBpbiB0aGUgcGRmIG91dGxpbmVzIGFzIHRoZQorJSBkZXN0aW5hdGlvbiB0byBqdW1wIHRvLgorJQorJSBXZSBvcGVuIHRoZSAudG9jIGZpbGUgZm9yIHdyaXRpbmcgaGVyZSBpbnN0ZWFkIG9mIGF0IEBzZXRmaWxlbmFtZSAob3IKKyUgYW55IG90aGVyIGZpeGVkIHRpbWUpIHNvIHRoYXQgQGNvbnRlbnRzIGNhbiBiZSBhbnl3aGVyZSBpbiB0aGUgZG9jdW1lbnQuCislIEJ1dCBpZiAjMSBpcyBgb21pdCcsIHRoZW4gd2UgZG9uJ3QgZG8gYW55dGhpbmcuICBUaGlzIGlzIHVzZWQgZm9yIHRoZQorJSB0YWJsZSBvZiBjb250ZW50cyBjaGFwdGVyIG9wZW5pbmdzIHRoZW1zZWx2ZXMuCislCitcbmV3aWZcaWZ0b2NmaWxlb3BlbmVkCitcZGVmXG9taXRrZXl3b3Jke29taXR9JQorJQorXGRlZlx3cml0ZXRvY2VudHJ5IzEjMiMzeyUKKyAgXGVkZWZcd3JpdGV0b2N0eXBleyMxfSUKKyAgXGlmeFx3cml0ZXRvY3R5cGVcb21pdGtleXdvcmQgXGVsc2UKKyAgICBcaWZ0b2NmaWxlb3BlbmVkXGVsc2UKKyAgICAgIFxpbW1lZGlhdGVcb3Blbm91dFx0b2NmaWxlID0gXGpvYm5hbWUudG9jCisgICAgICBcZ2xvYmFsXHRvY2ZpbGVvcGVuZWR0cnVlCisgICAgXGZpCisgICAgJQorICAgIFxpZmxpbmtzCisgICAgICBcdG9rczAgPSB7IzJ9JQorICAgICAgXHRva3MyID0gXGV4cGFuZGFmdGVye1xsYXN0bm9kZX0lCisgICAgICBcZWRlZlx0ZW1we1x3cml0ZVx0b2NmaWxle1xyZWFsYmFja3NsYXNoICMxZW50cnl7XHRoZVx0b2tzMH17IzN9JQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcdGhlXHRva3MyfXtcbm9leHBhbmRcZm9saW99fX0lCisgICAgICBcdGVtcAorICAgIFxmaQorICBcZmkKKyAgJQorICAlIFRlbGwgXHNoaXBvdXQgdG8gY3JlYXRlIGEgcGRmIGRlc3RpbmF0aW9uIG9uIGVhY2ggcGFnZSwgaWYgd2UncmUKKyAgJSB3cml0aW5nIHBkZi4gIFRoZXNlIGFyZSB1c2VkIGluIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIFdlIGNhbid0CisgICUganVzdCB3cml0ZSBvbmUgb24gZXZlcnkgcGFnZSBiZWNhdXNlIHRoZSB0aXRsZSBwYWdlcyBhcmUgbnVtYmVyZWQKKyAgJSAxIGFuZCAyICh0aGUgcGFnZSBudW1iZXJzIGFyZW4ndCBwcmludGVkKSwgYW5kIHNvIGFyZSB0aGUgZmlyc3QKKyAgJSB0d28gcGFnZXMgb2YgdGhlIGRvY3VtZW50LiAgVGh1cywgd2UnZCBoYXZlIHR3byBkZXN0aW5hdGlvbnMgbmFtZWQKKyAgJSBgMScsIGFuZCB0d28gbmFtZWQgYDInLgorICBcaWZwZGYgXGdsb2JhbFxwZGZtYWtlcGFnZWRlc3R0cnVlIFxmaQorfQorCitcbmV3c2tpcFxjb250ZW50c3JpZ2h0bWFyZ2luIFxjb250ZW50c3JpZ2h0bWFyZ2luPTFpbgorXG5ld2NvdW50XHNhdmVwYWdlbm8KK1xuZXdjb3VudFxsYXN0bmVnYXRpdmVwYWdlbm8gXGxhc3RuZWdhdGl2ZXBhZ2VubyA9IC0xCisKKyUgUHJlcGFyZSB0byByZWFkIHdoYXQgd2UndmUgd3JpdHRlbiB0byBcdG9jZmlsZS4KKyUKK1xkZWZcc3RhcnRjb250ZW50cyMxeyUKKyAgJSBJZiBAc2V0Y2hhcHRlcm5ld3BhZ2Ugb24sIGFuZCBAaGVhZGluZ3MgZG91YmxlLCB0aGUgY29udGVudHMgc2hvdWxkCisgICUgc3RhcnQgb24gYW4gb2RkIHBhZ2UsIHVubGlrZSBjaGFwdGVycy4gIFRodXMsIHdlIG1haW50YWluCisgICUgXGNvbnRlbnRzYWxpZ25tYWNybyBpbiBwYXJhbGxlbCB3aXRoIFxwYWdlYWxpZ25tYWNyby4KKyAgJSBGcm9tOiBUb3Jiam9ybiBHcmFubHVuZCA8dGVnZUBtYXRlbWF0aWsuc3Uuc2U+CisgIFxjb250ZW50c2FsaWdubWFjcm8KKyAgXGltbWVkaWF0ZVxjbG9zZW91dFx0b2NmaWxlCisgICUKKyAgJSBEb24ndCBuZWVkIHRvIHB1dCBgQ29udGVudHMnIG9yIGBTaG9ydCBDb250ZW50cycgaW4gdGhlIGhlYWRsaW5lLgorICAlIEl0IGlzIGFidW5kYW50bHkgY2xlYXIgd2hhdCB0aGV5IGFyZS4KKyAgXGRlZlx0aGlzY2hhcHRlcnt9JQorICBcY2hhcG1hY3JveyMxfXtZb21pdGZyb210b2N9e30lCisgICUKKyAgXHNhdmVwYWdlbm8gPSBccGFnZW5vCisgIFxiZWdpbmdyb3VwICAgICAgICAgICAgICAgICAgJSBTZXQgdXAgdG8gaGFuZGxlIGNvbnRlbnRzIGZpbGVzIHByb3Blcmx5LgorICAgIFxjYXRjb2RlYFxcPTAgIFxjYXRjb2RlYFx7PTEgIFxjYXRjb2RlYFx9PTIgIFxjYXRjb2RlYFxAPTExCisgICAgJSBXZSBjYW4ndCBkbyB0aGlzLCBiZWNhdXNlIHRoZW4gYW4gYWN0dWFsIF4gaW4gYSBzZWN0aW9uCisgICAgJSB0aXRsZSBmYWlscywgZS5nLiwgQGNoYXB0ZXIgXiAtLSBleHBvbmVudGlhdGlvbi4gIC0ta2FybCwgOWp1bDk3LgorICAgICVcY2F0Y29kZWBcXj03ICUgdG8gc2VlIF5eZTQgYXMgXCJhIGV0Yy4ganVoYUBwaXVoYS55ZGkudnR0LmZpCisgICAgXHJhZ2dlZGJvdHRvbSAgICAgICAgICAgICAlIFdvcnJ5IG1vcmUgYWJvdXQgYnJlYWtwb2ludHMgdGhhbiB0aGUgYm90dG9tLgorICAgIFxhZHZhbmNlXGhzaXplIGJ5IC1cY29udGVudHNyaWdodG1hcmdpbiAlIERvbid0IHVzZSB0aGUgZnVsbCBsaW5lIGxlbmd0aC4KKyAgICAlCisgICAgJSBSb21hbiBudW1lcmFscyBmb3IgcGFnZSBudW1iZXJzLgorICAgIFxpZm51bSBccGFnZW5vPjAgXGdsb2JhbFxwYWdlbm8gPSBcbGFzdG5lZ2F0aXZlcGFnZW5vIFxmaQorfQorCisKKyUgTm9ybWFsIChsb25nKSB0b2MuCitcZGVmXGNvbnRlbnRzeyUKKyAgXHN0YXJ0Y29udGVudHN7XHB1dHdvcmRUT0N9JQorICAgIFxvcGVuaW4gMSBcam9ibmFtZS50b2MKKyAgICBcaWZlb2YgMSBcZWxzZQorICAgICAgXGlucHV0IFxqb2JuYW1lLnRvYworICAgIFxmaQorICAgIFx2ZmlsbCBcZWplY3QKKyAgICBcY29udGVudHNhbGlnbm1hY3JvICUgaW4gY2FzZSBAc2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkIGlzIGluIGVmZmVjdAorICAgIFxpZmVvZiAxIFxlbHNlCisgICAgICBccGRmbWFrZW91dGxpbmVzCisgICAgXGZpCisgICAgXGNsb3NlaW4gMQorICBcZW5kZ3JvdXAKKyAgXGxhc3RuZWdhdGl2ZXBhZ2VubyA9IFxwYWdlbm8KKyAgXGdsb2JhbFxwYWdlbm8gPSBcc2F2ZXBhZ2VubworfQorCislIEFuZCBqdXN0IHRoZSBjaGFwdGVycy4KK1xkZWZcc3VtbWFyeWNvbnRlbnRzeyUKKyAgXHN0YXJ0Y29udGVudHN7XHB1dHdvcmRTaG9ydFRPQ30lCisgICAgJQorICAgIFxsZXRcbnVtY2hhcGVudHJ5ID0gXHNob3J0Y2hhcGVudHJ5CisgICAgXGxldFxhcHBlbnRyeSA9IFxzaG9ydGNoYXBlbnRyeQorICAgIFxsZXRcdW5uY2hhcGVudHJ5ID0gXHNob3J0dW5uY2hhcGVudHJ5CisgICAgJSBXZSB3YW50IGEgdHJ1ZSByb21hbiBoZXJlIGZvciB0aGUgcGFnZSBudW1iZXJzLgorICAgIFxzZWNmb250cworICAgIFxsZXRccm09XHNob3J0Y29udHJtIFxsZXRcYmY9XHNob3J0Y29udGJmCisgICAgXGxldFxzbD1cc2hvcnRjb250c2wgXGxldFx0dD1cc2hvcnRjb250dHQKKyAgICBccm0KKyAgICBcaHlwaGVucGVuYWx0eSA9IDEwMDAwCisgICAgXGFkdmFuY2VcYmFzZWxpbmVza2lwIGJ5IDFwdCAlIE9wZW4gaXQgdXAgYSBsaXR0bGUuCisgICAgXGRlZlxudW1zZWNlbnRyeSMjMSMjMiMjMyMjNHt9CisgICAgXGxldFxhcHBzZWNlbnRyeSA9IFxudW1zZWNlbnRyeQorICAgIFxsZXRcdW5uc2VjZW50cnkgPSBcbnVtc2VjZW50cnkKKyAgICBcbGV0XG51bXN1YnNlY2VudHJ5ID0gXG51bXNlY2VudHJ5CisgICAgXGxldFxhcHBzdWJzZWNlbnRyeSA9IFxudW1zZWNlbnRyeQorICAgIFxsZXRcdW5uc3Vic2VjZW50cnkgPSBcbnVtc2VjZW50cnkKKyAgICBcbGV0XG51bXN1YnN1YnNlY2VudHJ5ID0gXG51bXNlY2VudHJ5CisgICAgXGxldFxhcHBzdWJzdWJzZWNlbnRyeSA9IFxudW1zZWNlbnRyeQorICAgIFxsZXRcdW5uc3Vic3Vic2VjZW50cnkgPSBcbnVtc2VjZW50cnkKKyAgICBcb3BlbmluIDEgXGpvYm5hbWUudG9jCisgICAgXGlmZW9mIDEgXGVsc2UKKyAgICAgIFxpbnB1dCBcam9ibmFtZS50b2MKKyAgICBcZmkKKyAgICBcY2xvc2VpbiAxCisgICAgXHZmaWxsIFxlamVjdAorICAgIFxjb250ZW50c2FsaWdubWFjcm8gJSBpbiBjYXNlIEBzZXRjaGFwdGVybmV3cGFnZSBvZGQgaXMgaW4gZWZmZWN0CisgIFxlbmRncm91cAorICBcbGFzdG5lZ2F0aXZlcGFnZW5vID0gXHBhZ2VubworICBcZ2xvYmFsXHBhZ2VubyA9IFxzYXZlcGFnZW5vCit9CitcbGV0XHNob3J0Y29udGVudHMgPSBcc3VtbWFyeWNvbnRlbnRzCisKKyUgVHlwZXNldCB0aGUgbGFiZWwgZm9yIGEgY2hhcHRlciBvciBhcHBlbmRpeCBmb3IgdGhlIHNob3J0IGNvbnRlbnRzLgorJSBUaGUgYXJnIGlzLCBlLmcuLCBgQScgZm9yIGFuIGFwcGVuZGl4LCBvciBgMycgZm9yIGEgY2hhcHRlci4KKyUKK1xkZWZcc2hvcnRjaGFwbGFiZWwjMXslCisgICUgVGhpcyBzcGFjZSBzaG91bGQgYmUgZW5vdWdoLCBzaW5jZSBhIHNpbmdsZSBudW1iZXIgaXMgLjVlbSwgYW5kIHRoZQorICAlIHdpZGVzdCBsZXR0ZXIgKE0pIGlzIDFlbSwgYXQgbGVhc3QgaW4gdGhlIENvbXB1dGVyIE1vZGVybiBmb250cy4KKyAgJSBCdXQgdXNlIFxoc3MganVzdCBpbiBjYXNlLgorICAlIChUaGlzIHNwYWNlIGRvZXNuJ3QgaW5jbHVkZSB0aGUgZXh0cmEgc3BhY2UgdGhhdCBnZXRzIGFkZGVkIGFmdGVyCisgICUgdGhlIGxhYmVsOyB0aGF0IGdldHMgcHV0IGluIGJ5IFxzaG9ydGNoYXBlbnRyeSBhYm92ZS4pCisgICUKKyAgJSBXZSdkIGxpa2UgdG8gcmlnaHQtanVzdGlmeSBjaGFwdGVyIG51bWJlcnMsIGJ1dCB0aGF0IGxvb2tzIHN0cmFuZ2UKKyAgJSB3aXRoIGFwcGVuZGl4IGxldHRlcnMuICBBbmQgcmlnaHQtanVzdGlmeWluZyBudW1iZXJzIGFuZAorICAlIGxlZnQtanVzdGlmeWluZyBsZXR0ZXJzIGxvb2tzIHN0cmFuZ2Ugd2hlbiB0aGVyZSBpcyBsZXNzIHRoYW4gMTAKKyAgJSBjaGFwdGVycy4gIEhhdmUgdG8gcmVhZCB0aGUgd2hvbGUgdG9jIG9uY2UgdG8ga25vdyBob3cgbWFueSBjaGFwdGVycworICAlIHRoZXJlIGFyZSBiZWZvcmUgZGVjaWRpbmcgLi4uCisgIFxoYm94IHRvIDFlbXsjMVxoc3N9JQorfQorCislIFRoZXNlIG1hY3JvcyBnZW5lcmF0ZSBpbmRpdmlkdWFsIGVudHJpZXMgaW4gdGhlIHRhYmxlIG9mIGNvbnRlbnRzLgorJSBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGNoYXB0ZXIgb3Igc2VjdGlvbiBuYW1lLgorJSBUaGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgcGFnZSBudW1iZXIuCislIFRoZSBhcmd1bWVudHMgaW4gYmV0d2VlbiBhcmUgdGhlIGNoYXB0ZXIgbnVtYmVyLCBzZWN0aW9uIG51bWJlciwgLi4uCisKKyUgQ2hhcHRlcnMsIGluIHRoZSBtYWluIGNvbnRlbnRzLgorXGRlZlxudW1jaGFwZW50cnkjMSMyIzMjNHtcZG9jaGFwZW50cnl7IzJcbGFiZWxzcGFjZSMxfXsjNH19CislCislIENoYXB0ZXJzLCBpbiB0aGUgc2hvcnQgdG9jLgorJSBTZWUgY29tbWVudHMgaW4gXGRvY2hhcGVudHJ5IHJlIHZib3ggYW5kIHJlbGF0ZWQgc2V0dGluZ3MuCitcZGVmXHNob3J0Y2hhcGVudHJ5IzEjMiMzIzR7JQorICBcdG9jZW50cnl7XHNob3J0Y2hhcGxhYmVseyMyfVxsYWJlbHNwYWNlICMxfXtcZG9zaG9ydHBhZ2Vub1xiZ3JvdXAjNFxlZ3JvdXB9JQorfQorCislIEFwcGVuZGljZXMsIGluIHRoZSBtYWluIGNvbnRlbnRzLgorJSBOZWVkIHRoZSB3b3JkIEFwcGVuZGl4LCBhbmQgYSBmaXhlZC1zaXplIGJveC4KKyUKK1xkZWZcYXBwZW5kaXhib3gjMXslCisgICUgV2UgdXNlIE0gc2luY2UgaXQncyBwcm9iYWJseSB0aGUgd2lkZXN0IGxldHRlci4KKyAgXHNldGJveDAgPSBcaGJveHtccHV0d29yZEFwcGVuZGl4e30gTX0lCisgIFxoYm94IHRvIFx3ZDB7XHB1dHdvcmRBcHBlbmRpeHt9ICMxXGhzc319CislCitcZGVmXGFwcGVudHJ5IzEjMiMzIzR7XGRvY2hhcGVudHJ5e1xhcHBlbmRpeGJveHsjMn1cbGFiZWxzcGFjZSMxfXsjNH19CisKKyUgVW5udW1iZXJlZCBjaGFwdGVycy4KK1xkZWZcdW5uY2hhcGVudHJ5IzEjMiMzIzR7XGRvY2hhcGVudHJ5eyMxfXsjNH19CitcZGVmXHNob3J0dW5uY2hhcGVudHJ5IzEjMiMzIzR7XHRvY2VudHJ5eyMxfXtcZG9zaG9ydHBhZ2Vub1xiZ3JvdXAjNFxlZ3JvdXB9fQorCislIFNlY3Rpb25zLgorXGRlZlxudW1zZWNlbnRyeSMxIzIjMyM0e1xkb3NlY2VudHJ5eyMyXGxhYmVsc3BhY2UjMX17IzR9fQorXGxldFxhcHBzZWNlbnRyeT1cbnVtc2VjZW50cnkKK1xkZWZcdW5uc2VjZW50cnkjMSMyIzMjNHtcZG9zZWNlbnRyeXsjMX17IzR9fQorCislIFN1YnNlY3Rpb25zLgorXGRlZlxudW1zdWJzZWNlbnRyeSMxIzIjMyM0e1xkb3N1YnNlY2VudHJ5eyMyXGxhYmVsc3BhY2UjMX17IzR9fQorXGxldFxhcHBzdWJzZWNlbnRyeT1cbnVtc3Vic2VjZW50cnkKK1xkZWZcdW5uc3Vic2VjZW50cnkjMSMyIzMjNHtcZG9zdWJzZWNlbnRyeXsjMX17IzR9fQorCislIEFuZCBzdWJzdWJzZWN0aW9ucy4KK1xkZWZcbnVtc3Vic3Vic2VjZW50cnkjMSMyIzMjNHtcZG9zdWJzdWJzZWNlbnRyeXsjMlxsYWJlbHNwYWNlIzF9eyM0fX0KK1xsZXRcYXBwc3Vic3Vic2VjZW50cnk9XG51bXN1YnN1YnNlY2VudHJ5CitcZGVmXHVubnN1YnN1YnNlY2VudHJ5IzEjMiMzIzR7XGRvc3Vic3Vic2VjZW50cnl7IzF9eyM0fX0KKworJSBUaGlzIHBhcmFtZXRlciBjb250cm9scyB0aGUgaW5kZW50YXRpb24gb2YgdGhlIHZhcmlvdXMgbGV2ZWxzLgorJSBTYW1lIGFzIFxkZWZhdWx0cGFyaW5kZW50LgorXG5ld2RpbWVuXHRvY2luZGVudCBcdG9jaW5kZW50ID0gMTVwdAorCislIE5vdyBmb3IgdGhlIGFjdHVhbCB0eXBlc2V0dGluZy4gSW4gYWxsIHRoZXNlLCAjMSBpcyB0aGUgdGV4dCBhbmQgIzIgaXMgdGhlCislIHBhZ2UgbnVtYmVyLgorJQorJSBJZiB0aGUgdG9jIGhhcyB0byBiZSBicm9rZW4gb3ZlciBwYWdlcywgd2Ugd2FudCBpdCB0byBiZSBhdCBjaGFwdGVycworJSBpZiBhdCBhbGwgcG9zc2libGU7IGhlbmNlIHRoZSBccGVuYWx0eS4KK1xkZWZcZG9jaGFwZW50cnkjMSMyeyUKKyAgIFxwZW5hbHR5LTMwMCBcdnNraXAxXGJhc2VsaW5lc2tpcCBwbHVzLjMzXGJhc2VsaW5lc2tpcCBtaW51cy4yNVxiYXNlbGluZXNraXAKKyAgIFxiZWdpbmdyb3VwCisgICAgIFxjaGFwZW50cnlmb250cworICAgICBcdG9jZW50cnl7IzF9e1xkb3BhZ2Vub1xiZ3JvdXAjMlxlZ3JvdXB9JQorICAgXGVuZGdyb3VwCisgICBcbm9icmVha1x2c2tpcCAuMjVcYmFzZWxpbmVza2lwIHBsdXMuMVxiYXNlbGluZXNraXAKK30KKworXGRlZlxkb3NlY2VudHJ5IzEjMntcYmVnaW5ncm91cAorICBcc2VjZW50cnlmb250cyBcbGVmdHNraXA9XHRvY2luZGVudAorICBcdG9jZW50cnl7IzF9e1xkb3BhZ2Vub1xiZ3JvdXAjMlxlZ3JvdXB9JQorXGVuZGdyb3VwfQorCitcZGVmXGRvc3Vic2VjZW50cnkjMSMye1xiZWdpbmdyb3VwCisgIFxzdWJzZWNlbnRyeWZvbnRzIFxsZWZ0c2tpcD0yXHRvY2luZGVudAorICBcdG9jZW50cnl7IzF9e1xkb3BhZ2Vub1xiZ3JvdXAjMlxlZ3JvdXB9JQorXGVuZGdyb3VwfQorCitcZGVmXGRvc3Vic3Vic2VjZW50cnkjMSMye1xiZWdpbmdyb3VwCisgIFxzdWJzdWJzZWNlbnRyeWZvbnRzIFxsZWZ0c2tpcD0zXHRvY2luZGVudAorICBcdG9jZW50cnl7IzF9e1xkb3BhZ2Vub1xiZ3JvdXAjMlxlZ3JvdXB9JQorXGVuZGdyb3VwfQorCislIFdlIHVzZSB0aGUgc2FtZSBcZW50cnkgbWFjcm8gYXMgZm9yIHRoZSBpbmRleCBlbnRyaWVzLgorXGxldFx0b2NlbnRyeSA9IFxlbnRyeQorCislIFNwYWNlIGJldHdlZW4gY2hhcHRlciAob3Igd2hhdGV2ZXIpIG51bWJlciBhbmQgdGhlIHRpdGxlLgorXGRlZlxsYWJlbHNwYWNle1xoc2tpcDFlbSBccmVsYXh9CisKK1xkZWZcZG9wYWdlbm8jMXt7XHJtICMxfX0KK1xkZWZcZG9zaG9ydHBhZ2VubyMxe3tccm0gIzF9fQorCitcZGVmXGNoYXBlbnRyeWZvbnRze1xzZWNmb250cyBccm19CitcZGVmXHNlY2VudHJ5Zm9udHN7XHRleHRmb250c30KK1xkZWZcc3Vic2VjZW50cnlmb250c3tcdGV4dGZvbnRzfQorXGRlZlxzdWJzdWJzZWNlbnRyeWZvbnRze1x0ZXh0Zm9udHN9CisKKworXG1lc3NhZ2V7ZW52aXJvbm1lbnRzLH0KKyUgQGZvbyAuLi4gQGVuZCBmb28uCisKKyUgQHBvaW50e30sIEByZXN1bHR7fSwgQGV4cGFuc2lvbnt9LCBAcHJpbnR7fSwgQGVxdWl2e30uCislCislIFNpbmNlIHRoZXNlIGNoYXJhY3RlcnMgYXJlIHVzZWQgaW4gZXhhbXBsZXMsIGl0IHNob3VsZCBiZSBhbiBldmVuIG51bWJlciBvZgorJSBcdHQgd2lkdGhzLiBFYWNoIFx0dCBjaGFyYWN0ZXIgaXMgMWVuLCBzbyB0d28gbWFrZXMgaXQgMWVtLgorJQorXGRlZlxwb2ludHskXHN0YXIkfQorXGRlZlxyZXN1bHR7XGxlYXZldm1vZGVccmFpc2UuMTVleFxoYm94IHRvIDFlbXtcaGZpbCRcUmlnaHRhcnJvdyRcaGZpbH19CitcZGVmXGV4cGFuc2lvbntcbGVhdmV2bW9kZVxyYWlzZS4xZXhcaGJveCB0byAxZW17XGhmaWwkXG1hcHN0byRcaGZpbH19CitcZGVmXHByaW50e1xsZWF2ZXZtb2RlXGxvd2VyLjFleFxoYm94IHRvIDFlbXtcaGZpbCRcZGFzaHYkXGhmaWx9fQorXGRlZlxlcXVpdntcbGVhdmV2bW9kZVxsb3dlci4xZXhcaGJveCB0byAxZW17XGhmaWwkXHB0ZXhlcXVpdiRcaGZpbH19CisKKyUgVGhlIEBlcnJvcnt9IGNvbW1hbmQuCislIEFkYXB0ZWQgZnJvbSB0aGUgVGVYYm9vaydzIFxib3hpdC4KKyUKK1xuZXdib3hcZXJyb3Jib3gKKyUKK3tcdGVudHQgXGdsb2JhbFxkaW1lbjAgPSAzZW19JSBXaWR0aCBvZiB0aGUgYm94LgorXGRpbWVuMiA9IC41NXB0ICUgVGhpY2tuZXNzIG9mIHJ1bGVzCislIFRoZSB0ZXh0LiAoYHInIGlzIG9wZW4gb24gdGhlIHJpZ2h0LCBgZScgc29tZXdoYXQgbGVzcyBzbyBvbiB0aGUgbGVmdC4pCitcc2V0Ym94MCA9IFxoYm94e1xrZXJuLS43NXB0IFx0ZW5zZiBlcnJvclxrZXJuLTEuNXB0fQorJQorXHNldGJveFxlcnJvcmJveD1caGJveCB0byBcZGltZW4we1xoZmlsCisgICBcaHNpemUgPSBcZGltZW4wIFxhZHZhbmNlXGhzaXplIGJ5IC01LjhwdCAlIFNwYWNlIHRvIGxlZnQrcmlnaHQuCisgICBcYWR2YW5jZVxoc2l6ZSBieSAtMlxkaW1lbjIgJSBSdWxlcy4KKyAgIFx2Ym94eyUKKyAgICAgIFxocnVsZSBoZWlnaHRcZGltZW4yCisgICAgICBcaGJveHtcdnJ1bGUgd2lkdGhcZGltZW4yIFxrZXJuM3B0ICAgICAgICAgICUgU3BhY2UgdG8gbGVmdCBvZiB0ZXh0LgorICAgICAgICAgXHZ0b3B7XGtlcm4yLjRwdCBcYm94MCBca2VybjIuNHB0fSUgU3BhY2UgYWJvdmUvYmVsb3cuCisgICAgICAgICBca2VybjNwdFx2cnVsZSB3aWR0aFxkaW1lbjJ9JSBTcGFjZSB0byByaWdodC4KKyAgICAgIFxocnVsZSBoZWlnaHRcZGltZW4yfQorICAgIFxoZmlsfQorJQorXGRlZlxlcnJvcntcbGVhdmV2bW9kZVxsb3dlci43ZXhcY29weVxlcnJvcmJveH0KKworJSBAdGV4IC4uLiBAZW5kIHRleCAgICBlc2NhcGVzIGludG8gcmF3IFRleCB0ZW1wb3JhcmlseS4KKyUgT25lIGV4Y2VwdGlvbjogQCBpcyBzdGlsbCBhbiBlc2NhcGUgY2hhcmFjdGVyLCBzbyB0aGF0IEBlbmQgdGV4IHdvcmtzLgorJSBCdXQgXEAgb3IgQEAgd2lsbCBnZXQgYSBwbGFpbiB0ZXggQCBjaGFyYWN0ZXIuCisKK1xlbnZkZWZcdGV4eyUKKyAgXGNhdGNvZGUgYFxcPTAgXGNhdGNvZGUgYFx7PTEgXGNhdGNvZGUgYFx9PTIKKyAgXGNhdGNvZGUgYFwkPTMgXGNhdGNvZGUgYFwmPTQgXGNhdGNvZGUgYFwjPTYKKyAgXGNhdGNvZGUgYFxePTcgXGNhdGNvZGUgYFxfPTggXGNhdGNvZGUgYFx+PVxhY3RpdmUgXGxldH49XHRpZQorICBcY2F0Y29kZSBgXCU9MTQKKyAgXGNhdGNvZGUgYFwrPVxvdGhlcgorICBcY2F0Y29kZSBgXCI9XG90aGVyCisgIFxjYXRjb2RlIGBcfD1cb3RoZXIKKyAgXGNhdGNvZGUgYFw8PVxvdGhlcgorICBcY2F0Y29kZSBgXD49XG90aGVyCisgIFxlc2NhcGVjaGFyPWBcXAorICAlCisgIFxsZXRcYj1ccHRleGIKKyAgXGxldFxidWxsZXQ9XHB0ZXhidWxsZXQKKyAgXGxldFxjPVxwdGV4YworICBcbGV0XCw9XHB0ZXhjb21tYQorICBcbGV0XC49XHB0ZXhkb3QKKyAgXGxldFxkb3RzPVxwdGV4ZG90cworICBcbGV0XGVxdWl2PVxwdGV4ZXF1aXYKKyAgXGxldFwhPVxwdGV4ZXhjbGFtCisgIFxsZXRcaT1ccHRleGkKKyAgXGxldFxpbmRlbnQ9XHB0ZXhpbmRlbnQKKyAgXGxldFxub2luZGVudD1ccHRleG5vaW5kZW50CisgIFxsZXRcez1ccHRleGxicmFjZQorICBcbGV0XCs9XHRhYmFsaWduCisgIFxsZXRcfT1ccHRleHJicmFjZQorICBcbGV0XC89XHB0ZXhzbGFzaAorICBcbGV0XCo9XHB0ZXhzdGFyCisgIFxsZXRcdD1ccHRleHQKKyAgJQorICBcZGVmXGVuZGxkb3Rze1xtYXRoaW5uZXJ7XGxkb3RzXGxkb3RzXGxkb3RzXGxkb3RzfX0lCisgIFxkZWZcZW5kZG90c3tccmVsYXhcaWZtbW9kZVxlbmRsZG90c1xlbHNlJFxtYXRoc3Vycm91bmQ9MHB0IFxlbmRsZG90c1wsJFxmaX0lCisgIFxkZWZcQHtAfSUKK30KKyUgVGhlcmUgaXMgbm8gbmVlZCB0byBkZWZpbmUgXEV0ZXguCisKKyUgRGVmaW5lIEBsaXNwIC4uLiBAZW5kIGxpc3AuCislIEBsaXNwIGVudmlyb25tZW50IGZvcm1zIGEgZ3JvdXAgc28gaXQgY2FuIHJlYmluZCB0aGluZ3MsCislIGluY2x1ZGluZyB0aGUgZGVmaW5pdGlvbiBvZiBAZW5kIGxpc3AgKHdoaWNoIG5vcm1hbGx5IGlzIGVycm9uZW91cykuCisKKyUgQW1vdW50IHRvIG5hcnJvdyB0aGUgbWFyZ2lucyBieSBmb3IgQGxpc3AuCitcbmV3c2tpcFxsaXNwbmFycm93aW5nIFxsaXNwbmFycm93aW5nPTAuNGluCisKKyUgVGhpcyBpcyB0aGUgZGVmaW5pdGlvbiB0aGF0IF5eTSBnZXRzIGluc2lkZSBAbGlzcCwgQGV4YW1wbGUsIGFuZCBvdGhlcgorJSBzdWNoIGVudmlyb25tZW50cy4gIFxudWxsIGlzIGJldHRlciB0aGFuIGEgc3BhY2UsIHNpbmNlIGl0IGRvZXNuJ3QKKyUgaGF2ZSBhbnkgd2lkdGguCitcZGVmXGxpc3BwYXJ7XG51bGxcZW5kZ3JhZn0KKworJSBUaGlzIHNwYWNlIGlzIGFsd2F5cyBwcmVzZW50IGFib3ZlIGFuZCBiZWxvdyBlbnZpcm9ubWVudHMuCitcbmV3c2tpcFxlbnZza2lwYW1vdW50IFxlbnZza2lwYW1vdW50ID0gMHB0CisKKyUgTWFrZSBzcGFjaW5nIGFuZCBiZWxvdyBlbnZpcm9ubWVudCBzeW1tZXRyaWNhbC4gIFdlIHVzZSBccGFyc2tpcCBoZXJlCislIHRvIGhlbHAgaW4gZG9pbmcgdGhhdCwgc2luY2UgaW4gQGV4YW1wbGUtbGlrZSBlbnZpcm9ubWVudHMgXHBhcnNraXAKKyUgaXMgcmVzZXQgdG8gemVybzsgdGh1cyB0aGUgXGFmdGVyZW52YnJlYWsgaW5zZXJ0cyBubyBzcGFjZSAtLSBidXQgdGhlCislIHN0YXJ0IG9mIHRoZSBuZXh0IHBhcmFncmFwaCB3aWxsIGluc2VydCBccGFyc2tpcC4KKyUKK1xkZWZcYWJvdmVlbnZicmVha3t7JQorICAlID0xMDAwMCBpbnN0ZWFkIG9mIDwxMDAwMCBiZWNhdXNlIG9mIGEgc3BlY2lhbCBjYXNlIGluIFxpdGVtenp6IGFuZAorICAlIFxzZWN0aW9uaGVhZGluZywgcS52LgorICBcaWZudW0gXGxhc3RwZW5hbHR5PTEwMDAwIFxlbHNlCisgICAgXGFkdmFuY2VcZW52c2tpcGFtb3VudCBieSBccGFyc2tpcAorICAgIFxlbmRncmFmCisgICAgXGlmZGltXGxhc3Rza2lwPFxlbnZza2lwYW1vdW50CisgICAgICBccmVtb3ZlbGFzdHNraXAKKyAgICAgICUgaXQncyBub3QgYSBnb29kIHBsYWNlIHRvIGJyZWFrIGlmIHRoZSBsYXN0IHBlbmFsdHkgd2FzIFxub2JyZWFrCisgICAgICAlIG9yIGJldHRlciAuLi4KKyAgICAgIFxpZm51bVxsYXN0cGVuYWx0eTwxMDAwMCBccGVuYWx0eS01MCBcZmkKKyAgICAgIFx2c2tpcFxlbnZza2lwYW1vdW50CisgICAgXGZpCisgIFxmaQorfX0KKworXGxldFxhZnRlcmVudmJyZWFrID0gXGFib3ZlZW52YnJlYWsKKworJSBcbm9uYXJyb3dpbmcgaXMgYSBmbGFnLiAgSWYgInNldCIsIEBsaXNwIGV0YyBkb24ndCBuYXJyb3cgbWFyZ2lucy4KK1xsZXRcbm9uYXJyb3dpbmc9XHJlbGF4CisKKyUgQGNhcnRvdWNoZSAuLi4gQGVuZCBjYXJ0b3VjaGU6IGRyYXcgcmVjdGFuZ2xlIHcvcm91bmRlZCBjb3JuZXJzIGFyb3VuZAorJSBlbnZpcm9ubWVudCBjb250ZW50cy4KK1xmb250XGNpcmNsZT1sY2lyY2xlMTAKK1xuZXdkaW1lblxjaXJjdGhpY2sKK1xuZXdkaW1lblxjYXJ0b3V0ZXJcbmV3ZGltZW5cY2FydGlubmVyCitcbmV3c2tpcFxub3JtYnNraXBcbmV3c2tpcFxub3JtcHNraXBcbmV3c2tpcFxub3JtbHNraXAKK1xjaXJjdGhpY2s9XGZvbnRkaW1lbjhcY2lyY2xlCislCitcZGVmXGN0bHt7XGNpcmNsZVxjaGFyJzAxM1xoc2tpcCAtNnB0fX0lIDZwdCBmcm9tIHBsIGZpbGU6IDEvMmNoYXJ3aWR0aAorXGRlZlxjdHJ7e1xoc2tpcCA2cHRcY2lyY2xlXGNoYXInMDEwfX0KK1xkZWZcY2Jse3tcY2lyY2xlXGNoYXInMDEyXGhza2lwIC02cHR9fQorXGRlZlxjYnJ7e1xoc2tpcCA2cHRcY2lyY2xlXGNoYXInMDExfX0KK1xkZWZcY2FydHRvcHtcaGJveCB0byBcY2FydG91dGVye1xoc2tpcFxsc2tpcAorICAgICAgICBcY3RsXGxlYWRlcnNcaHJ1bGUgaGVpZ2h0XGNpcmN0aGlja1xoZmlsXGN0cgorICAgICAgICBcaHNraXBccnNraXB9fQorXGRlZlxjYXJ0Ym90e1xoYm94IHRvIFxjYXJ0b3V0ZXJ7XGhza2lwXGxza2lwCisgICAgICAgIFxjYmxcbGVhZGVyc1xocnVsZSBoZWlnaHRcY2lyY3RoaWNrXGhmaWxcY2JyCisgICAgICAgIFxoc2tpcFxyc2tpcH19CislCitcbmV3c2tpcFxsc2tpcFxuZXdza2lwXHJza2lwCisKK1xlbnZkZWZcY2FydG91Y2hleyUKKyAgXGlmaG1vZGVccGFyXGZpICAlIGNhbid0IGJlIGluIHRoZSBtaWRzdCBvZiBhIHBhcmFncmFwaC4KKyAgXHN0YXJ0c2F2aW5naW5zZXJ0cworICBcbHNraXA9XGxlZnRza2lwIFxyc2tpcD1ccmlnaHRza2lwCisgIFxsZWZ0c2tpcD0wcHRccmlnaHRza2lwPTBwdCAlIHdlIHdhbnQgdGhlc2UgKm91dHNpZGUqLgorICBcY2FydGlubmVyPVxoc2l6ZSBcYWR2YW5jZVxjYXJ0aW5uZXIgYnktXGxza2lwCisgIFxhZHZhbmNlXGNhcnRpbm5lciBieS1ccnNraXAKKyAgXGNhcnRvdXRlcj1caHNpemUKKyAgXGFkdmFuY2VcY2FydG91dGVyIGJ5IDE4LjRwdAklIGFsbG93IGZvciAzcHQga2VybnMgb24gZWl0aGVyCisJCQkJJSBzaWRlLCBhbmQgZm9yIDZwdCB3YXN0ZSBmcm9tCisJCQkJJSBlYWNoIGNvcm5lciBjaGFyLCBhbmQgcnVsZSB0aGlja25lc3MKKyAgXG5vcm1ic2tpcD1cYmFzZWxpbmVza2lwIFxub3JtcHNraXA9XHBhcnNraXAgXG5vcm1sc2tpcD1cbGluZXNraXAKKyAgJSBGbGFnIHRvIHRlbGwgQGxpc3AsIGV0Yy4sIG5vdCB0byBuYXJyb3cgbWFyZ2luLgorICBcbGV0XG5vbmFycm93aW5nPVxjb21tZW50CisgIFx2Ym94XGJncm91cAorICAgICAgXGJhc2VsaW5lc2tpcD0wcHRccGFyc2tpcD0wcHRcbGluZXNraXA9MHB0CisgICAgICBcY2FydHRvcAorICAgICAgXGhib3hcYmdyb3VwCisJICBcaHNraXBcbHNraXAKKwkgIFx2cnVsZVxrZXJuM3B0CisJICBcdmJveFxiZ3JvdXAKKwkgICAgICBca2VybjNwdAorCSAgICAgIFxoc2l6ZT1cY2FydGlubmVyCisJICAgICAgXGJhc2VsaW5lc2tpcD1cbm9ybWJza2lwCisJICAgICAgXGxpbmVza2lwPVxub3JtbHNraXAKKwkgICAgICBccGFyc2tpcD1cbm9ybXBza2lwCisJICAgICAgXHZza2lwIC1ccGFyc2tpcAorCSAgICAgIFxjb21tZW50ICUgRm9yIGV4cGxhbmF0aW9uLCBzZWUgdGhlIGVuZCBvZiBcZGVmXGdyb3VwLgorfQorXGRlZlxFY2FydG91Y2hleyUKKyAgICAgICAgICAgICAgXGlmaG1vZGVccGFyXGZpCisJICAgICAgXGtlcm4zcHQKKwkgIFxlZ3JvdXAKKwkgIFxrZXJuM3B0XHZydWxlCisJICBcaHNraXBccnNraXAKKyAgICAgIFxlZ3JvdXAKKyAgICAgIFxjYXJ0Ym90CisgIFxlZ3JvdXAKKyAgXGNoZWNraW5zZXJ0cworfQorCisKKyUgVGhpcyBtYWNybyBpcyBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhbGwgdGhlIEBleGFtcGxlIHZhcmlhbnRzLAorJSBpbnNpZGUgYSBncm91cC4KK1xkZWZcbm9uZmlsbHN0YXJ0eyUKKyAgXGFib3ZlZW52YnJlYWsKKyAgXGhmdXp6ID0gMTJwdCAlIERvbid0IGJlIGZ1c3N5CisgIFxzZXBzcGFjZXMgJSBNYWtlIHNwYWNlcyBiZSB3b3JkLXNlcGFyYXRvcnMgcmF0aGVyIHRoYW4gc3BhY2UgdG9rZW5zLgorICBcbGV0XHBhciA9IFxsaXNwcGFyICUgZG9uJ3QgaWdub3JlIGJsYW5rIGxpbmVzCisgIFxvYmV5bGluZXMgJSBlYWNoIGxpbmUgb2YgaW5wdXQgaXMgYSBsaW5lIG9mIG91dHB1dAorICBccGFyc2tpcCA9IDBwdAorICBccGFyaW5kZW50ID0gMHB0CisgIFxlbWVyZ2VuY3lzdHJldGNoID0gMHB0ICUgZG9uJ3QgdHJ5IHRvIGF2b2lkIG92ZXJmdWxsIGJveGVzCisgICUgQGNhcnRvdWNoZSBkZWZpbmVzIFxub25hcnJvd2luZyB0byBpbmhpYml0IG5hcnJvd2luZworICAlIGF0IG5leHQgbGV2ZWwgZG93bi4KKyAgXGlmeFxub25hcnJvd2luZ1xyZWxheAorICAgIFxhZHZhbmNlIFxsZWZ0c2tpcCBieSBcbGlzcG5hcnJvd2luZworICAgIFxleGRlbnRhbW91bnQ9XGxpc3BuYXJyb3dpbmcKKyAgXGZpCisgIFxsZXRcZXhkZW50PVxub2ZpbGxleGRlbnQKK30KKworJSBJZiB5b3Ugd2FudCBhbGwgZXhhbXBsZXMgZXRjLiBzbWFsbDogQHNldCBkaXNwZW52c2l6ZSBzbWFsbC4KKyUgSWYgeW91IHdhbnQgZXZlbiBzbWFsbCBleGFtcGxlcyB0aGUgZnVsbCBzaXplOiBAc2V0IGRpc3BlbnZzaXplIG5vc21hbGwuCislIFRoaXMgYWZmZWN0cyB0aGUgZm9sbG93aW5nIGRpc3BsYXllZCBlbnZpcm9ubWVudHM6CislICAgIEBleGFtcGxlLCBAZGlzcGxheSwgQGZvcm1hdCwgQGxpc3AKKyUKK1xkZWZcc21hbGx3b3Jke3NtYWxsfQorXGRlZlxub3NtYWxsd29yZHtub3NtYWxsfQorXGxldFxTRVRkaXNwZW52c2l6ZVxyZWxheAorXGRlZlxzZXRub3JtYWxkaXNwZW52eyUKKyAgXGlmeFxTRVRkaXNwZW52c2l6ZVxzbWFsbHdvcmQKKyAgICBcc21hbGxleGFtcGxlZm9udHMgXHJtCisgIFxmaQorfQorXGRlZlxzZXRzbWFsbGRpc3BlbnZ7JQorICBcaWZ4XFNFVGRpc3BlbnZzaXplXG5vc21hbGx3b3JkCisgIFxlbHNlCisgICAgXHNtYWxsZXhhbXBsZWZvbnRzIFxybQorICBcZmkKK30KKworJSBXZSBvZnRlbiBkZWZpbmUgdHdvIGVudmlyb25tZW50cywgQGZvbyBhbmQgQHNtYWxsZm9vLgorJSBMZXQncyBkbyBpdCBieSBvbmUgY29tbWFuZDoKK1xkZWZcbWFrZWRpc3BlbnYgIzEjMnsKKyAgXGV4cGFuZGFmdGVyXGVudmRlZlxjc25hbWUjMVxlbmRjc25hbWUge1xzZXRub3JtYWxkaXNwZW52ICMyfQorICBcZXhwYW5kYWZ0ZXJcZW52ZGVmXGNzbmFtZSBzbWFsbCMxXGVuZGNzbmFtZSB7XHNldHNtYWxsZGlzcGVudiAjMn0KKyAgXGV4cGFuZGFmdGVyXGxldFxjc25hbWUgRSMxXGVuZGNzbmFtZSBcYWZ0ZXJlbnZicmVhaworICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSBFc21hbGwjMVxlbmRjc25hbWUgXGFmdGVyZW52YnJlYWsKK30KKworJSBEZWZpbmUgdHdvIHN5bm9ueW1zOgorXGRlZlxtYWtldHdvZGlzcGVudnMgIzEjMiMzeworICBcbWFrZWRpc3BlbnZ7IzF9eyMzfQorICBcbWFrZWRpc3BlbnZ7IzJ9eyMzfQorfQorCislIEBsaXNwOiBpbmRlbnRlZCwgbmFycm93ZWQsIHR5cGV3cml0ZXIgZm9udDsgQGV4YW1wbGU6IHNhbWUgYXMgQGxpc3AuCislCislIEBzbWFsbGV4YW1wbGUgYW5kIEBzbWFsbGxpc3A6IHVzZSBzbWFsbGVyIGZvbnRzLgorJSBPcmlnaW5hbGx5IGNvbnRyaWJ1dGVkIGJ5IFBhdmVsQHhlcm94LgorJQorXG1ha2V0d29kaXNwZW52cyB7bGlzcH17ZXhhbXBsZX17JQorICBcbm9uZmlsbHN0YXJ0CisgIFx0dAorICBcbGV0XGtiZGZvbnQgPSBca2JkZXhhbXBsZWZvbnQgJSBBbGxvdyBAa2JkIHRvIGRvIHNvbWV0aGluZyBzcGVjaWFsLgorICBcZ29iYmxlICAgICAgICUgZWF0IHJldHVybgorfQorCislIEBkaXNwbGF5L0BzbWFsbGRpc3BsYXk6IHNhbWUgYXMgQGxpc3AgZXhjZXB0IGtlZXAgY3VycmVudCBmb250LgorJQorXG1ha2VkaXNwZW52IHtkaXNwbGF5fXslCisgIFxub25maWxsc3RhcnQKKyAgXGdvYmJsZQorfQorCislIEBmb3JtYXQvQHNtYWxsZm9ybWF0OiBzYW1lIGFzIEBkaXNwbGF5IGV4Y2VwdCBkb24ndCBuYXJyb3cgbWFyZ2lucy4KKyUKK1xtYWtlZGlzcGVudntmb3JtYXR9eyUKKyAgXGxldFxub25hcnJvd2luZyA9IHQlCisgIFxub25maWxsc3RhcnQKKyAgXGdvYmJsZQorfQorCislIEBmbHVzaGxlZnQ6IHNhbWUgYXMgQGZvcm1hdCwgYnV0IGRvZXNuJ3Qgb2JleSBcU0VUZGlzcGVudnNpemUuCitcZW52ZGVmXGZsdXNobGVmdHslCisgIFxsZXRcbm9uYXJyb3dpbmcgPSB0JQorICBcbm9uZmlsbHN0YXJ0CisgIFxnb2JibGUKK30KK1xsZXRcRWZsdXNobGVmdCA9IFxhZnRlcmVudmJyZWFrCisKKyUgQGZsdXNocmlnaHQuCislCitcZW52ZGVmXGZsdXNocmlnaHR7JQorICBcbGV0XG5vbmFycm93aW5nID0gdCUKKyAgXG5vbmZpbGxzdGFydAorICBcYWR2YW5jZVxsZWZ0c2tpcCBieSAwcHQgcGx1cyAxZmlsbAorICBcZ29iYmxlCit9CitcbGV0XEVmbHVzaHJpZ2h0ID0gXGFmdGVyZW52YnJlYWsKKworCislIEBxdW90YXRpb24gZG9lcyBub3JtYWwgbGluZWJyZWFraW5nIChoZW5jZSB3ZSBjYW4ndCB1c2UgXG5vbmZpbGxzdGFydCkKKyUgYW5kIG5hcnJvd3MgdGhlIG1hcmdpbnMuICBXZSBrZWVwIFxwYXJza2lwIG5vbnplcm8gaW4gZ2VuZXJhbCwgc2luY2UKKyUgd2UncmUgZG9pbmcgbm9ybWFsIGZpbGxpbmcuICBTbywgd2hlbiB1c2luZyBcYWJvdmVlbnZicmVhayBhbmQKKyUgXGFmdGVyZW52YnJlYWssIHRlbXBvcmFyaWx5IG1ha2UgXHBhcnNraXAgMC4KKyUKK1xlbnZkZWZccXVvdGF0aW9ueyUKKyAge1xwYXJza2lwPTBwdCBcYWJvdmVlbnZicmVha30lIGJlY2F1c2UgXGFib3ZlZW52YnJlYWsgaW5zZXJ0cyBccGFyc2tpcAorICBccGFyaW5kZW50PTBwdAorICAlCisgICUgQGNhcnRvdWNoZSBkZWZpbmVzIFxub25hcnJvd2luZyB0byBpbmhpYml0IG5hcnJvd2luZyBhdCBuZXh0IGxldmVsIGRvd24uCisgIFxpZnhcbm9uYXJyb3dpbmdccmVsYXgKKyAgICBcYWR2YW5jZVxsZWZ0c2tpcCBieSBcbGlzcG5hcnJvd2luZworICAgIFxhZHZhbmNlXHJpZ2h0c2tpcCBieSBcbGlzcG5hcnJvd2luZworICAgIFxleGRlbnRhbW91bnQgPSBcbGlzcG5hcnJvd2luZworICAgIFxsZXRcbm9uYXJyb3dpbmcgPSBccmVsYXgKKyAgXGZpCisgIFxwYXJzZWFyZ1xxdW90YXRpb25sYWJlbAorfQorCislIFdlIGhhdmUgcmV0YWluZWQgYSBub256ZXJvIHBhcnNraXAgZm9yIHRoZSBlbnZpcm9ubWVudCwgc2luY2Ugd2UncmUKKyUgZG9pbmcgbm9ybWFsIGZpbGxpbmcuCislCitcZGVmXEVxdW90YXRpb257JQorICBccGFyCisgIFxpZnhccXVvdGF0aW9uYXV0aG9yXHVuZGVmaW5lZFxlbHNlCisgICAgJSBpbmRlbnQgYSBiaXQuCisgICAgXGxlZnRsaW5le1xrZXJuIDJcbGVmdHNraXAgXHNsIC0tLVxxdW90YXRpb25hdXRob3J9JQorICBcZmkKKyAge1xwYXJza2lwPTBwdCBcYWZ0ZXJlbnZicmVha30lCit9CisKKyUgSWYgd2UncmUgZ2l2ZW4gYW4gYXJndW1lbnQsIHR5cGVzZXQgaXQgaW4gYm9sZCB3aXRoIGEgY29sb24gYWZ0ZXIuCitcZGVmXHF1b3RhdGlvbmxhYmVsIzF7JQorICBcZGVmXHRlbXB7IzF9JQorICBcaWZ4XHRlbXBcZW1wdHkgXGVsc2UKKyAgICB7XGJmICMxOiB9JQorICBcZmkKK30KKworCislIExhVGVYLWxpa2UgQHZlcmJhdGltLi4uQGVuZCB2ZXJiYXRpbSBhbmQgQHZlcmJ7PGNoYXI+Li4uPGNoYXI+fQorJSBJZiB3ZSB3YW50IHRvIGFsbG93IGFueSA8Y2hhcj4gYXMgZGVsaW1pdGVyLAorJSB3ZSBuZWVkIHRoZSBjdXJseSBicmFjZXMgc28gdGhhdCBtYWtlaW5mbyBzZWVzIHRoZSBAdmVyYiBjb21tYW5kLCBlZzoKKyUgYEB2ZXJieC4uLngnIHdvdWxkIGxvb2sgbGlrZSB0aGUgJ0B2ZXJieCcgY29tbWFuZC4gIC0tamFubmVrZUBnbnUub3JnCislCislIFtLbnV0aF06IERvbmFsZCBFcnZpbiBLbnV0aCwgMTk5Ni4gIFRoZSBUZVhib29rLgorJQorJSBbS251dGhdIHAuMzQ0OyBvbmx5IHdlIG5lZWQgdG8gZG8gdGhlIG90aGVyIGNoYXJhY3RlcnMgVGV4aW5mbyBzZXRzCislIGFjdGl2ZSB0b28uICBPdGhlcndpc2UsIHRoZXkgZ2V0IGxvc3QgYXMgdGhlIGZpcnN0IGNoYXJhY3RlciBvbiBhCislIHZlcmJhdGltIGxpbmUuCitcZGVmXGRvc3BlY2lhbHN7JQorICBcZG9cIFxkb1xcXGRvXHtcZG9cfVxkb1wkXGRvXCYlCisgIFxkb1wjXGRvXF5cZG9cXl5LXGRvXF9cZG9cXl5BXGRvXCVcZG9cfiUKKyAgXGRvXDxcZG9cPlxkb1x8XGRvXEBcZG8rXGRvXCIlCit9CislCislIFtLbnV0aF0gcC4gMzgwCitcZGVmXHVuY2F0Y29kZXNwZWNpYWxzeyUKKyAgXGRlZlxkbyMjMXtcY2F0Y29kZWAjIzE9XG90aGVyfVxkb3NwZWNpYWxzfQorJQorJSBbS251dGhdIHBwLiAzODAsMzgxLDM5MQorJSBEaXNhYmxlIFNwYW5pc2ggbGlnYXR1cmVzID9gIGFuZCAhYCBvZiBcdHQgZm9udAorXGJlZ2luZ3JvdXAKKyAgXGNhdGNvZGVgXGA9XGFjdGl2ZVxnZGVmYHtccmVsYXhcbHF9CitcZW5kZ3JvdXAKKyUKKyUgU2V0dXAgZm9yIHRoZSBAdmVyYiBjb21tYW5kLgorJQorJSBFaWdodCBzcGFjZXMgZm9yIGEgdGFiCitcYmVnaW5ncm91cAorICBcY2F0Y29kZWBcXl5JPVxhY3RpdmUKKyAgXGdkZWZcdGFiZWlnaHRzcGFjZXN7XGNhdGNvZGVgXF5eST1cYWN0aXZlXGRlZl5eSXtcIFwgXCBcIFwgXCBcIFwgfX0KK1xlbmRncm91cAorJQorXGRlZlxzZXR1cHZlcmJ7JQorICBcdHQgICUgZWFzaWVzdCAoYW5kIGNvbnZlbnRpb25hbGx5IHVzZWQpIGZvbnQgZm9yIHZlcmJhdGltCisgIFxkZWZccGFye1xsZWF2ZXZtb2RlXGVuZGdyYWZ9JQorICBcY2F0Y29kZWBcYD1cYWN0aXZlCisgIFx0YWJlaWdodHNwYWNlcworICAlIFJlc3BlY3QgbGluZSBicmVha3MsCisgICUgcHJpbnQgc3BlY2lhbCBzeW1ib2xzIGFzIHRoZW1zZWx2ZXMsIGFuZAorICAlIG1ha2UgZWFjaCBzcGFjZSBjb3VudAorICAlIG11c3QgZG8gaW4gdGhpcyBvcmRlcjoKKyAgXG9iZXlsaW5lcyBcdW5jYXRjb2Rlc3BlY2lhbHMgXHNlcHNwYWNlcworfQorCislIFNldHVwIGZvciB0aGUgQHZlcmJhdGltIGVudmlyb25tZW50CislCislIFJlYWwgdGFiIGV4cGFuc2lvbgorXG5ld2RpbWVuXHRhYncgXHNldGJveDA9XGhib3h7XHR0XHNwYWNlfSBcdGFidz04XHdkMCAlIHRhYiBhbW91bnQKKyUKK1xkZWZcc3RhcnR0YWJib3h7XHNldGJveDA9XGhib3hcYmdyb3VwfQorXGJlZ2luZ3JvdXAKKyAgXGNhdGNvZGVgXF5eST1cYWN0aXZlCisgIFxnZGVmXHRhYmV4cGFuZHslCisgICAgXGNhdGNvZGVgXF5eST1cYWN0aXZlCisgICAgXGRlZl5eSXtcbGVhdmV2bW9kZVxlZ3JvdXAKKyAgICAgIFxkaW1lbjA9XHdkMCAlIHRoZSB3aWR0aCBzbyBmYXIsIG9yIHNpbmNlIHRoZSBwcmV2aW91cyB0YWIKKyAgICAgIFxkaXZpZGVcZGltZW4wIGJ5XHRhYncKKyAgICAgIFxtdWx0aXBseVxkaW1lbjAgYnlcdGFidyAlIGNvbXB1dGUgcHJldmlvdXMgbXVsdGlwbGUgb2YgXHRhYncKKyAgICAgIFxhZHZhbmNlXGRpbWVuMCBieVx0YWJ3ICAlIGFkdmFuY2UgdG8gbmV4dCBtdWx0aXBsZSBvZiBcdGFidworICAgICAgXHdkMD1cZGltZW4wIFxib3gwIFxzdGFydHRhYmJveAorICAgIH0lCisgIH0KK1xlbmRncm91cAorXGRlZlxzZXR1cHZlcmJhdGlteyUKKyAgXG5vbmZpbGxzdGFydAorICBcYWR2YW5jZVxsZWZ0c2tpcCBieSAtXGRlZmJvZHlpbmRlbnQKKyAgJSBFYXNpZXN0IChhbmQgY29udmVudGlvbmFsbHkgdXNlZCkgZm9udCBmb3IgdmVyYmF0aW0KKyAgXHR0CisgIFxkZWZccGFye1xsZWF2ZXZtb2RlXGVncm91cFxib3gwXGVuZGdyYWZ9JQorICBcY2F0Y29kZWBcYD1cYWN0aXZlCisgIFx0YWJleHBhbmQKKyAgJSBSZXNwZWN0IGxpbmUgYnJlYWtzLAorICAlIHByaW50IHNwZWNpYWwgc3ltYm9scyBhcyB0aGVtc2VsdmVzLCBhbmQKKyAgJSBtYWtlIGVhY2ggc3BhY2UgY291bnQKKyAgJSBtdXN0IGRvIGluIHRoaXMgb3JkZXI6CisgIFxvYmV5bGluZXMgXHVuY2F0Y29kZXNwZWNpYWxzIFxzZXBzcGFjZXMKKyAgXGV2ZXJ5cGFye1xzdGFydHRhYmJveH0lCit9CisKKyUgRG8gdGhlIEB2ZXJiIG1hZ2ljOiB2ZXJiYXRpbSB0ZXh0IGlzIHF1b3RlZCBieSB1bmlxdWUKKyUgZGVsaW1pdGVyIGNoYXJhY3RlcnMuICBCZWZvcmUgZmlyc3QgZGVsaW1pdGVyIGV4cGVjdCBhCislIHJpZ2h0IGJyYWNlLCBhZnRlciBsYXN0IGRlbGltaXRlciBleHBlY3QgY2xvc2luZyBicmFjZToKKyUKKyUgICAgXGRlZlxkb3ZlcmIneyc8Y2hhcj4jMTxjaGFyPid9J3sjMX0KKyUKKyUgW0tudXRoXSBwLiAzODI7IG9ubHkgZWF0IG91dGVyIHt9CitcYmVnaW5ncm91cAorICBcY2F0Y29kZWBbPTFcY2F0Y29kZWBdPTJcY2F0Y29kZWBcez1cb3RoZXJcY2F0Y29kZWBcfT1cb3RoZXIKKyAgXGdkZWZcZG92ZXJieyMxW1xkZWZcbmV4dCMjMSMxfVsjIzFcZW5kZ3JvdXBdXG5leHRdCitcZW5kZ3JvdXAKKyUKK1xkZWZcdmVyYntcYmVnaW5ncm91cFxzZXR1cHZlcmJcZG92ZXJifQorJQorJQorJSBEbyB0aGUgQHZlcmJhdGltIG1hZ2ljOiBkZWZpbmUgdGhlIG1hY3JvIFxkb3ZlcmJhdGltIHNvIHRoYXQKKyUgdGhlIChmaXJzdCkgYXJndW1lbnQgZW5kcyB3aGVuICdAZW5kIHZlcmJhdGltJyBpcyByZWFjaGVkLCBpZToKKyUKKyUgICAgIFxkZWZcZG92ZXJiYXRpbSMxQGVuZCB2ZXJiYXRpbXsjMX0KKyUKKyUgRm9yIFRleGluZm8gaXQncyBhIGxvdCBlYXNpZXIgdGhhbiBmb3IgTGFUZVgsCislIGJlY2F1c2UgdGV4aW5mbydzIFx2ZXJiYXRpbSBkb2Vzbid0IHN0b3AgYXQgJ1xlbmR7dmVyYmF0aW19JzoKKyUgd2UgbmVlZCBub3QgcmVkZWZpbmUgJ1wnLCAneycgYW5kICd9Jy4KKyUKKyUgSW5zcGlyZWQgYnkgTGFUZVgncyB2ZXJiYXRpbSBjb21tYW5kIHNldCBbbGF0ZXgubHR4XQorJQorXGJlZ2luZ3JvdXAKKyAgXGNhdGNvZGVgXCA9XGFjdGl2ZQorICBcb2JleWxpbmVzICUKKyAgJSBpZ25vcmUgZXZlcnl0aGluZyB1cCB0byB0aGUgZmlyc3QgXl5NLCB0aGF0J3MgdGhlIG5ld2xpbmUgYXQgdGhlIGVuZAorICAlIG9mIHRoZSBAdmVyYmF0aW0gaW5wdXQgbGluZSBpdHNlbGYuICBPdGhlcndpc2Ugd2UgZ2V0IGFuIGV4dHJhIGJsYW5rCisgICUgbGluZSBpbiB0aGUgb3V0cHV0LgorICBceGRlZlxkb3ZlcmJhdGltIzFeXk0jMkBlbmQgdmVyYmF0aW17IzJcbm9leHBhbmRcZW5kXGdvYmJsZSB2ZXJiYXRpbX0lCisgICUgV2UgcmVhbGx5IHdhbnQgey4uLlxlbmQgdmVyYmF0aW19IGluIHRoZSBib2R5IG9mIHRoZSBtYWNybywgYnV0CisgICUgd2l0aG91dCB0aGUgYWN0aXZlIHNwYWNlOyB0aHVzIHdlIGhhdmUgdG8gdXNlIFx4ZGVmIGFuZCBcZ29iYmxlLgorXGVuZGdyb3VwCislCitcZW52ZGVmXHZlcmJhdGlteyUKKyAgICBcc2V0dXB2ZXJiYXRpbVxkb3ZlcmJhdGltCit9CitcbGV0XEV2ZXJiYXRpbSA9IFxhZnRlcmVudmJyZWFrCisKKworJSBAdmVyYmF0aW1pbmNsdWRlIEZJTEUgLSBpbnNlcnQgdGV4dCBvZiBmaWxlIGluIHZlcmJhdGltIGVudmlyb25tZW50LgorJQorXGRlZlx2ZXJiYXRpbWluY2x1ZGV7XHBhcnNlYXJndXNpbmdcZmlsZW5hbWVjYXRjb2Rlc1xkb3ZlcmJhdGltaW5jbHVkZX0KKyUKK1xkZWZcZG92ZXJiYXRpbWluY2x1ZGUjMXslCisgIHslCisgICAgXG1ha2V2YWx1ZWV4cGFuZGFibGUKKyAgICBcc2V0dXB2ZXJiYXRpbQorICAgIFxpbnB1dCAjMQorICAgIFxhZnRlcmVudmJyZWFrCisgIH0lCit9CisKKyUgQGNvcHlpbmcgLi4uIEBlbmQgY29weWluZy4KKyUgU2F2ZSB0aGUgdGV4dCBhd2F5IGZvciBAaW5zZXJ0Y29weWluZyBsYXRlci4KKyUKKyUgV2Ugc2F2ZSB0aGUgdW5pbnRlcnByZXRlZCB0b2tlbnMsIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEgYm94LgorJSBTYXZpbmcgdGhlIHRleHQgaW4gYSBib3ggd291bGQgYmUgbXVjaCBlYXNpZXIsIGJ1dCB0aGVuIGFsbCB0aGUKKyUgdHlwZXNldHRpbmcgY29tbWFuZHMgKEBzbWFsbGJvb2ssIGZvbnQgY2hhbmdlcywgZXRjLikgaGF2ZSB0byBiZSBkb25lCislIGJlZm9yZWhhbmQgLS0gYW5kIGEpIHdlIHdhbnQgQGNvcHlpbmcgdG8gYmUgZG9uZSBmaXJzdCBpbiB0aGUgc291cmNlCislIGZpbGU7IGIpIGxldHRpbmcgdXNlcnMgZGVmaW5lIHRoZSBmcm9udG1hdHRlciBpbiBhcyBmbGV4aWJsZSBvcmRlciBhcworJSBwb3NzaWJsZSBpcyB2ZXJ5IGRlc2lyYWJsZS4KKyUKK1xkZWZcY29weWluZ3tcY2hlY2tlbnZ7fVxiZWdpbmdyb3VwXHNjYW5hcmdjdHh0XGRvY29weWluZ30KK1xkZWZcZG9jb3B5aW5nIzFAZW5kIGNvcHlpbmd7XGVuZGdyb3VwXGRlZlxjb3B5aW5ndGV4dHsjMX19CislCitcZGVmXGluc2VydGNvcHlpbmd7JQorICBcYmVnaW5ncm91cAorICAgIFxwYXJpbmRlbnQgPSAwcHQgICUgcGFyYWdyYXBoIGluZGVudGF0aW9uIGxvb2tzIHdyb25nIG9uIHRpdGxlIHBhZ2UKKyAgICBcc2NhbmV4cFxjb3B5aW5ndGV4dAorICBcZW5kZ3JvdXAKK30KKworXG1lc3NhZ2V7ZGVmdW5zLH0KKyUgQGRlZnVuIGV0Yy4KKworXG5ld3NraXBcZGVmYm9keWluZGVudCBcZGVmYm9keWluZGVudD0uNGluCitcbmV3c2tpcFxkZWZhcmdzaW5kZW50IFxkZWZhcmdzaW5kZW50PTUwcHQKK1xuZXdza2lwXGRlZmxhc3RhcmdtYXJnaW4gXGRlZmxhc3RhcmdtYXJnaW49MThwdAorCislIFN0YXJ0IHRoZSBwcm9jZXNzaW5nIG9mIEBkZWZmbjoKK1xkZWZcc3RhcnRkZWZ1bnslCisgIFxpZm51bVxsYXN0cGVuYWx0eTwxMDAwMAorICAgIFxtZWRicmVhaworICBcZWxzZQorICAgICUgSWYgdGhlcmUgYXJlIHR3byBAZGVmIGNvbW1hbmRzIGluIGEgcm93LCB3ZSdsbCBoYXZlIGEgXG5vYnJlYWssCisgICAgJSB3aGljaCBpcyB0aGVyZSB0byBrZWVwIHRoZSBmdW5jdGlvbiBkZXNjcmlwdGlvbiB0b2dldGhlciB3aXRoIGl0cworICAgICUgaGVhZGVyLiAgQnV0IGlmIHRoZXJlJ3Mgbm90aGluZyBidXQgaGVhZGVycywgd2UgbmVlZCB0byBhbGxvdyBhCisgICAgJSBicmVhayBzb21ld2hlcmUuICBDaGVjayBzcGVjaWZpY2FsbHkgZm9yIHBlbmFsdHkgMTAwMDIsIGluc2VydGVkCisgICAgJSBieSBcZGVmYXJnc2NvbW1vbmVuZGluZywgaW5zdGVhZCBvZiAxMDAwMCwgc2luY2UgdGhlIHNlY3Rpb25pbmcKKyAgICAlIGNvbW1hbmRzIGFsc28gaW5zZXJ0IGEgbm9icmVhayBwZW5hbHR5LCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBhbGxvdworICAgICUgYSBicmVhayBiZXR3ZWVuIGEgc2VjdGlvbiBoZWFkaW5nIGFuZCBhIGRlZnVuLgorICAgICUgCisgICAgXGlmbnVtXGxhc3RwZW5hbHR5PTEwMDAyIFxwZW5hbHR5MjAwMCBcZmkKKyAgICAlCisgICAgJSBTaW1pbGFybHksIGFmdGVyIGEgc2VjdGlvbiBoZWFkaW5nLCBkbyBub3QgYWxsb3cgYSBicmVhay4KKyAgICAlIEJ1dCBkbyBpbnNlcnQgdGhlIGdsdWUuCisgICAgXG1lZHNraXAgICUgcHJlY2VkZWQgYnkgZGlzY2FyZGFibGUgcGVuYWx0eSwgc28gbm90IGEgYnJlYWtwb2ludAorICBcZmkKKyAgJQorICBccGFyaW5kZW50PTBpbgorICBcYWR2YW5jZVxsZWZ0c2tpcCBieSBcZGVmYm9keWluZGVudAorICBcZXhkZW50YW1vdW50PVxkZWZib2R5aW5kZW50Cit9CisKK1xkZWZcZG9kZWZ1bngjMXslCisgICUgRmlyc3QsIGNoZWNrIHdoZXRoZXIgd2UgYXJlIGluIHRoZSByaWdodCBlbnZpcm9ubWVudDoKKyAgXGNoZWNrZW52IzElCisgICUKKyAgJSBBcyBhYm92ZSwgYWxsb3cgbGluZSBicmVhayBpZiB3ZSBoYXZlIG11bHRpcGxlIHggaGVhZGVycyBpbiBhIHJvdy4KKyAgJSBJdCdzIG5vdCBhIGdyZWF0IHBsYWNlLCB0aG91Z2guCisgIFxpZm51bVxsYXN0cGVuYWx0eT0xMDAwMiBccGVuYWx0eTMwMDAgXGZpCisgICUKKyAgJSBBbmQgbm93LCBpdCdzIHRpbWUgdG8gcmV1c2UgdGhlIGJvZHkgb2YgdGhlIG9yaWdpbmFsIGRlZnVuOgorICBcZXhwYW5kYWZ0ZXJcZ29iYmxlZGVmdW4jMSUKK30KK1xkZWZcZ29iYmxlZGVmdW4jMVxzdGFydGRlZnVue30KKworJSBccHJpbnRkZWZ1bmxpbmUgXGRlZmZuaGVhZGVye3RleHR9CislCitcZGVmXHByaW50ZGVmdW5saW5lIzEjMnslCisgIFxiZWdpbmdyb3VwCisgICAgJSBjYWxsIFxkZWZmbmhlYWRlcjoKKyAgICAjMSMyIFxlbmRoZWFkZXIKKyAgICAlIGNvbW1vbiBlbmRpbmc6CisgICAgXGludGVybGluZXBlbmFsdHkgPSAxMDAwMAorICAgIFxhZHZhbmNlXHJpZ2h0c2tpcCBieSAwcHQgcGx1cyAxZmlsCisgICAgXGVuZGdyYWYKKyAgICBcbm9icmVha1x2c2tpcCAtXHBhcnNraXAKKyAgICBccGVuYWx0eSAxMDAwMiAgJSBzaWduYWwgdG8gXHN0YXJ0ZGVmdW4gYW5kIFxkb2RlZnVueAorICAgICUgU29tZSBvZiB0aGUgQGRlZnVuLXR5cGUgdGFncyBkbyBub3QgZW5hYmxlIG1hZ2ljIHBhcmVudGhlc2VzLAorICAgICUgcmVuZGVyaW5nIHRoZSBmb2xsb3dpbmcgY2hlY2sgcmVkdW5kYW50LiAgQnV0IHdlIGRvbid0IG9wdGltaXplLgorICAgIFxjaGVja3BhcmVuY291bnRzCisgIFxlbmRncm91cAorfQorCitcZGVmXEVkZWZ1bntcZW5kZ3JhZlxtZWRicmVha30KKworJSBcbWFrZWRlZnVue2RlZmZufSBjcmVhdGVzIFxkZWZmbiwgXGRlZmZueCBhbmQgXEVkZWZmbjsKKyUgdGhlIG9ubHkgdGhpbmcgcmVtYWlubmlnIGlzIHRvIGRlZmluZSBcZGVmZm5oZWFkZXIuCislCitcZGVmXG1ha2VkZWZ1biMxeyUKKyAgXGV4cGFuZGFmdGVyXGxldFxjc25hbWUgRSMxXGVuZGNzbmFtZSA9IFxFZGVmdW4KKyAgXGVkZWZcdGVtcHtcbm9leHBhbmRcZG9tYWtlZGVmdW4KKyAgICBcbWFrZWNzbmFtZXsjMX1cbWFrZWNzbmFtZXsjMXh9XG1ha2Vjc25hbWV7IzFoZWFkZXJ9fSUKKyAgXHRlbXAKK30KKworJSBcZG9tYWtlZGVmdW4gXGRlZmZuIFxkZWZmbnggXGRlZmZuaGVhZGVyCislCislIERlZmluZSBcZGVmZm4gYW5kIFxkZWZmbngsIHdpdGhvdXQgcGFyYW1ldGVycy4KKyUgXGRlZmZuaGVhZGVyIGhhcyB0byBiZSBkZWZpbmVkIGV4cGxpY2l0bHkuCislCitcZGVmXGRvbWFrZWRlZnVuIzEjMiMzeyUKKyAgXGVudmRlZiMxeyUKKyAgICBcc3RhcnRkZWZ1bgorICAgIFxwYXJzZWFyZ3VzaW5nXGFjdGl2ZXBhcmVuc3tccHJpbnRkZWZ1bmxpbmUjM30lCisgIH0lCisgIFxkZWYjMntcZG9kZWZ1bngjMX0lCisgIFxkZWYjMyUKK30KKworJSUlIFVudHlwZWQgZnVuY3Rpb25zOgorCislIEBkZWZmbiBjYXRlZ29yeSBuYW1lIGFyZ3MKK1xtYWtlZGVmdW57ZGVmZm59e1xkZWZmbmdlbmVyYWx7fX0KKworJSBAZGVmZm4gY2F0ZWdvcnkgY2xhc3MgbmFtZSBhcmdzCitcbWFrZWRlZnVue2RlZm9wfSMxIHtcZGVmb3BvbnsjMVwgXHB1dHdvcmRvbn19CisKKyUgXGRlZm9wb24ge2NhdGVnb3J5IG9ufWNsYXNzIG5hbWUgYXJncworXGRlZlxkZWZvcG9uIzEjMiB7XGRlZmZuZ2VuZXJhbHtccHV0d29yZG9uXCBcY29kZXsjMn19eyMxXCBcY29kZXsjMn19IH0KKworJSBcZGVmZm5nZW5lcmFsIHtzdWJpbmR9Y2F0ZWdvcnkgbmFtZSBhcmdzCislCitcZGVmXGRlZmZuZ2VuZXJhbCMxIzIgIzMgIzRcZW5kaGVhZGVyeyUKKyAgJSBSZW1lbWJlciB0aGF0IFxkb3N1YmluZHtmbn17Zm9vfXt9IGlzIGVxdWl2YWxlbnQgdG8gXGRvaW5ke2ZufXtmb299LgorICBcZG9zdWJpbmR7Zm59e1xjb2RleyMzfX17IzF9JQorICBcZGVmbmFtZXsjMn17fXsjM31cbWFnaWNhbXBcZGVmdW5hcmdzeyM0XHVuc2tpcH0lCit9CisKKyUlJSBUeXBlZCBmdW5jdGlvbnM6CisKKyUgQGRlZnR5cGVmbiBjYXRlZ29yeSB0eXBlIG5hbWUgYXJncworXG1ha2VkZWZ1bntkZWZ0eXBlZm59e1xkZWZ0eXBlZm5nZW5lcmFse319CisKKyUgQGRlZnR5cGVvcCBjYXRlZ29yeSBjbGFzcyB0eXBlIG5hbWUgYXJncworXG1ha2VkZWZ1bntkZWZ0eXBlb3B9IzEge1xkZWZ0eXBlb3BvbnsjMVwgXHB1dHdvcmRvbn19CisKKyUgXGRlZnR5cGVvcG9uIHtjYXRlZ29yeSBvbn1jbGFzcyB0eXBlIG5hbWUgYXJncworXGRlZlxkZWZ0eXBlb3BvbiMxIzIge1xkZWZ0eXBlZm5nZW5lcmFse1xwdXR3b3Jkb25cIFxjb2RleyMyfX17IzFcIFxjb2RleyMyfX0gfQorCislIFxkZWZ0eXBlZm5nZW5lcmFsIHtzdWJpbmR9Y2F0ZWdvcnkgdHlwZSBuYW1lIGFyZ3MKKyUKK1xkZWZcZGVmdHlwZWZuZ2VuZXJhbCMxIzIgIzMgIzQgIzVcZW5kaGVhZGVyeyUKKyAgXGRvc3ViaW5ke2ZufXtcY29kZXsjNH19eyMxfSUKKyAgXGRlZm5hbWV7IzJ9eyMzfXsjNH1cZGVmdW5hcmdzeyM1XHVuc2tpcH0lCit9CisKKyUlJSBUeXBlZCB2YXJpYWJsZXM6CisKKyUgQGRlZnR5cGV2ciBjYXRlZ29yeSB0eXBlIHZhciBhcmdzCitcbWFrZWRlZnVue2RlZnR5cGV2cn17XGRlZnR5cGVjdmdlbmVyYWx7fX0KKworJSBAZGVmdHlwZWN2IGNhdGVnb3J5IGNsYXNzIHR5cGUgdmFyIGFyZ3MKK1xtYWtlZGVmdW57ZGVmdHlwZWN2fSMxIHtcZGVmdHlwZWN2b2Z7IzFcIFxwdXR3b3Jkb2Z9fQorCislIFxkZWZ0eXBlY3ZvZiB7Y2F0ZWdvcnkgb2Z9Y2xhc3MgdHlwZSB2YXIgYXJncworXGRlZlxkZWZ0eXBlY3ZvZiMxIzIge1xkZWZ0eXBlY3ZnZW5lcmFse1xwdXR3b3Jkb2ZcIFxjb2RleyMyfX17IzFcIFxjb2RleyMyfX0gfQorCislIFxkZWZ0eXBlY3ZnZW5lcmFsIHtzdWJpbmR9Y2F0ZWdvcnkgdHlwZSB2YXIgYXJncworJQorXGRlZlxkZWZ0eXBlY3ZnZW5lcmFsIzEjMiAjMyAjNCAjNVxlbmRoZWFkZXJ7JQorICBcZG9zdWJpbmR7dnJ9e1xjb2RleyM0fX17IzF9JQorICBcZGVmbmFtZXsjMn17IzN9eyM0fVxkZWZ1bmFyZ3N7IzVcdW5za2lwfSUKK30KKworJSUlIFVudHlwZWQgdmFyaWFibGVzOgorCislIEBkZWZ2ciBjYXRlZ29yeSB2YXIgYXJncworXG1ha2VkZWZ1bntkZWZ2cn0jMSB7XGRlZnR5cGV2cmhlYWRlcnsjMX0ge30gfQorCislIEBkZWZjdiBjYXRlZ29yeSBjbGFzcyB2YXIgYXJncworXG1ha2VkZWZ1bntkZWZjdn0jMSB7XGRlZmN2b2Z7IzFcIFxwdXR3b3Jkb2Z9fQorCislIFxkZWZjdm9mIHtjYXRlZ29yeSBvZn1jbGFzcyB2YXIgYXJncworXGRlZlxkZWZjdm9mIzEjMiB7XGRlZnR5cGVjdm9meyMxfSMyIHt9IH0KKworJSUlIFR5cGU6CislIEBkZWZ0cCBjYXRlZ29yeSBuYW1lIGFyZ3MKK1xtYWtlZGVmdW57ZGVmdHB9IzEgIzIgIzNcZW5kaGVhZGVyeyUKKyAgXGRvaW5ke3RwfXtcY29kZXsjMn19JQorICBcZGVmbmFtZXsjMX17fXsjMn1cZGVmdW5hcmdzeyMzXHVuc2tpcH0lCit9CisKKyUgUmVtYWluaW5nIEBkZWZ1bi1saWtlIHNob3J0Y3V0czoKK1xtYWtlZGVmdW57ZGVmdW59e1xkZWZmbmhlYWRlcntccHV0d29yZERlZmZ1bmN9IH0KK1xtYWtlZGVmdW57ZGVmbWFjfXtcZGVmZm5oZWFkZXJ7XHB1dHdvcmREZWZtYWN9IH0KK1xtYWtlZGVmdW57ZGVmc3BlY317XGRlZmZuaGVhZGVye1xwdXR3b3JkRGVmc3BlY30gfQorXG1ha2VkZWZ1bntkZWZ0eXBlZnVufXtcZGVmdHlwZWZuaGVhZGVye1xwdXR3b3JkRGVmZnVuY30gfQorXG1ha2VkZWZ1bntkZWZ2YXJ9e1xkZWZ2cmhlYWRlcntccHV0d29yZERlZnZhcn0gfQorXG1ha2VkZWZ1bntkZWZvcHR9e1xkZWZ2cmhlYWRlcntccHV0d29yZERlZm9wdH0gfQorXG1ha2VkZWZ1bntkZWZ0eXBldmFyfXtcZGVmdHlwZXZyaGVhZGVye1xwdXR3b3JkRGVmdmFyfSB9CitcbWFrZWRlZnVue2RlZm1ldGhvZH17XGRlZm9wb25ccHV0d29yZE1ldGhvZG9ufQorXG1ha2VkZWZ1bntkZWZ0eXBlbWV0aG9kfXtcZGVmdHlwZW9wb25ccHV0d29yZE1ldGhvZG9ufQorXG1ha2VkZWZ1bntkZWZpdmFyfXtcZGVmY3ZvZlxwdXR3b3JkSW5zdGFuY2VWYXJpYWJsZW9mfQorXG1ha2VkZWZ1bntkZWZ0eXBlaXZhcn17XGRlZnR5cGVjdm9mXHB1dHdvcmRJbnN0YW5jZVZhcmlhYmxlb2Z9CisKKyUgXGRlZm5hbWUsIHdoaWNoIGZvcm1hdHMgdGhlIG5hbWUgb2YgdGhlIEBkZWYgKG5vdCB0aGUgYXJncykuCislICMxIGlzIHRoZSBjYXRlZ29yeSwgc3VjaCBhcyAiRnVuY3Rpb24iLgorJSAjMiBpcyB0aGUgcmV0dXJuIHR5cGUsIGlmIGFueS4KKyUgIzMgaXMgdGhlIGZ1bmN0aW9uIG5hbWUuCislCislIFdlIGFyZSBmb2xsb3dlZCBieSAoYnV0IG5vdCBwYXNzZWQpIHRoZSBhcmd1bWVudHMsIGlmIGFueS4KKyUKK1xkZWZcZGVmbmFtZSMxIzIjM3slCisgICUgR2V0IHRoZSB2YWx1ZXMgb2YgXGxlZnRza2lwIGFuZCBccmlnaHRza2lwIGFzIHRoZXkgd2VyZSBvdXRzaWRlIHRoZSBAZGVmLi4uCisgIFxhZHZhbmNlXGxlZnRza2lwIGJ5IC1cZGVmYm9keWluZGVudAorICAlCisgICUgSG93IHdlJ2xsIGZvcm1hdCB0aGUgdHlwZSBuYW1lLiAgUHV0dGluZyBpdCBpbiBicmFja2V0cyBoZWxwcworICAlIGRpc3Rpbmd1aXNoIGl0IGZyb20gdGhlIGJvZHkgdGV4dCB0aGF0IG1heSBlbmQgdXAgb24gdGhlIG5leHQgbGluZQorICAlIGp1c3QgYmVsb3cgaXQuCisgIFxkZWZcdGVtcHsjMX0lCisgIFxzZXRib3gwPVxoYm94e1xrZXJuXGRlZmxhc3RhcmdtYXJnaW4gXGlmeFx0ZW1wXGVtcHR5XGVsc2UgW1xybVx0ZW1wXVxmaX0KKyAgJQorICAlIEZpZ3VyZSBvdXQgbGluZSBzaXplcyBmb3IgdGhlIHBhcmFncmFwaCBzaGFwZS4KKyAgJSBUaGUgZmlyc3QgbGluZSBuZWVkcyBzcGFjZSBmb3IgXGJveDA7IGJ1dCBpZiBccmlnaHRza2lwIGlzIG5vbnplcm8sCisgICUgd2UgbmVlZCBvbmx5IHNwYWNlIGZvciB0aGUgcGFydCBvZiBcYm94MCB3aGljaCBleGNlZWRzIGl0OgorICBcZGltZW4wPVxoc2l6ZSAgXGFkdmFuY2VcZGltZW4wIGJ5IC1cd2QwICBcYWR2YW5jZVxkaW1lbjAgYnkgXHJpZ2h0c2tpcAorICAlIFRoZSBjb250aW51YXRpb25zOgorICBcZGltZW4yPVxoc2l6ZSAgXGFkdmFuY2VcZGltZW4yIGJ5IC1cZGVmYXJnc2luZGVudAorICAlIChwbGFpbi50ZXggc2F5cyB0aGF0IFxkaW1lbjEgc2hvdWxkIGJlIHVzZWQgb25seSBhcyBnbG9iYWwuKQorICBccGFyc2hhcGUgMiAwaW4gXGRpbWVuMCBcZGVmYXJnc2luZGVudCBcZGltZW4yCisgICUKKyAgJSBQdXQgdGhlIHR5cGUgbmFtZSB0byB0aGUgcmlnaHQgbWFyZ2luLgorICBcbm9pbmRlbnQKKyAgXGhib3ggdG8gMHB0eyUKKyAgICBcaGZpbFxib3gwIFxrZXJuLVxoc2l6ZQorICAgICUgXGhzaXplIGhhcyB0byBiZSBzaG9ydGVuZWQgdGhpcyB3YXk6CisgICAgXGtlcm5cbGVmdHNraXAKKyAgICAlIEludGVudGlvbmFsbHkgZG8gbm90IHJlc3BlY3QgXHJpZ2h0c2tpcCwgc2luY2Ugd2UgbmVlZCB0aGUgc3BhY2UuCisgIH0lCisgICUKKyAgJSBBbGxvdyBhbGwgbGluZXMgdG8gYmUgdW5kZXJmdWxsIHdpdGhvdXQgY29tcGxhaW50OgorICBcdG9sZXJhbmNlPTEwMDAwIFxoYmFkbmVzcz0xMDAwMAorICBcZXhkZW50YW1vdW50PVxkZWZib2R5aW5kZW50CisgIHslCisgICAgJSBkZWZ1biBmb250cy4gV2UgdXNlIHR5cGV3cml0ZXIgYnkgZGVmYXVsdCAodXNlZCB0byBiZSBib2xkKSBiZWNhdXNlOgorICAgICUgLiB3ZSdyZSBwcmludGluZyBpZGVudGlmaWVycywgdGhleSBzaG91bGQgYmUgaW4gdHQgaW4gcHJpbmNpcGxlLgorICAgICUgLiBpbiBsYW5ndWFnZXMgd2l0aCBtYW55IGFjY2VudHMsIHN1Y2ggYXMgQ3plY2ggb3IgRnJlbmNoLCBpdCdzCisgICAgJSAgIGNvbW1vbiB0byBsZWF2ZSBhY2NlbnRzIG9mZiBpZGVudGlmaWVycy4gIFRoZSByZXN1bHQgbG9va3Mgb2sgaW4KKyAgICAlICAgdHQsIGJ1dCBleGNlZWRpbmdseSBzdHJhbmdlIGluIHJtLgorICAgICUgLiB3ZSBkb24ndCB3YW50IC0tIGFuZCAtLS0gdG8gYmUgdHJlYXRlZCBhcyBsaWdhdHVyZXMuCisgICAgJSAuIHRoaXMgc3RpbGwgZG9lcyBub3QgZml4IHRoZSA/YCBhbmQgIWAgbGlnYXR1cmVzLCBidXQgc28gZmFyIG5vCisgICAgJSAgIG9uZSBoYXMgbWFkZSBpZGVudGlmaWVycyB1c2luZyB0aGVtIDopLgorICAgIFxkZiBcdHQKKyAgICBcZGVmXHRlbXB7IzJ9JSByZXR1cm4gdmFsdWUgdHlwZQorICAgIFxpZnhcdGVtcFxlbXB0eVxlbHNlIFx0Y2xvc2V7XHRlbXB9IFxmaQorICAgICMzJSBvdXRwdXQgZnVuY3Rpb24gbmFtZQorICB9JQorICB7XHJtXGVuc2tpcH0lIGhza2lwIDAuNSBlbSBvZiBcdGVucm0KKyAgJQorICBcYm9sZGJyYXgKKyAgJSBhcmd1bWVudHMgd2lsbCBiZSBvdXRwdXQgbmV4dCwgaWYgYW55LgorfQorCislIFByaW50IGFyZ3VtZW50cyBpbiBzbGFudGVkIHJvbWFuIChub3QgdHRzbCksIGluY29uc2lzdGVudGx5IHdpdGggdXNpbmcKKyUgdHQgZm9yIHRoZSBuYW1lLiAgVGhpcyBpcyBiZWNhdXNlIGxpdGVyYWwgdGV4dCBpcyBzb21ldGltZXMgbmVlZGVkIGluCislIHRoZSBhcmd1bWVudCBsaXN0IChncm9mZiBtYW51YWwpLCBhbmQgdHRzbCBhbmQgdHQgYXJlIG5vdCB2ZXJ5CislIGRpc3Rpbmd1aXNoYWJsZS4gIFByZXZlbnQgaHlwaGVuYXRpb24gYXQgYC0nIGNoYXJzLgorJQorXGRlZlxkZWZ1bmFyZ3MjMXslCisgICUgdXNlIHNsIGJ5IGRlZmF1bHQgKG5vdCB0dHNsKSwKKyAgJSB0dCBmb3IgdGhlIG5hbWVzLgorICBcZGYgXHNsIFxoeXBoZW5jaGFyXGZvbnQ9MAorICAlCisgICUgT24gdGhlIG90aGVyIGhhbmQsIGlmIGFuIGFyZ3VtZW50IGhhcyB0d28gZGFzaGVzIChmb3IgaW5zdGFuY2UpLCB3ZQorICAlIHdhbnQgYSB3YXkgdG8gZ2V0IHR0c2wuICBMZXQncyB0cnkgQHZhciBmb3IgdGhhdC4KKyAgXGxldFx2YXI9XHR0c2xhbnRlZAorICAjMSUKKyAgXHNsXGh5cGhlbmNoYXJcZm9udD00NQorfQorCislIFdlIHdhbnQgKCkmW10gdG8gcHJpbnQgc3BlY2lhbGx5IG9uIHRoZSBkZWZ1biBsaW5lLgorJQorXGRlZlxhY3RpdmVwYXJlbnN7JQorICBcY2F0Y29kZWBcKD1cYWN0aXZlIFxjYXRjb2RlYFwpPVxhY3RpdmUKKyAgXGNhdGNvZGVgXFs9XGFjdGl2ZSBcY2F0Y29kZWBcXT1cYWN0aXZlCisgIFxjYXRjb2RlYFwmPVxhY3RpdmUKK30KKworJSBNYWtlIGNvbnRyb2wgc2VxdWVuY2VzIHdoaWNoIGFjdCBsaWtlIG5vcm1hbCBwYXJlbnRoZXNpcyBjaGFycy4KK1xsZXRcbHBhcmVuID0gKCBcbGV0XHJwYXJlbiA9ICkKKworJSBCZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgYSBkZWZpbml0aW9uIGZvciBgKCcsIGV0Yy4gIEZvciBleGFtcGxlLAorJSBpZiB0aGUgZm4gbmFtZSBoYXMgcGFyZW5zIGluIGl0LCBcYm9sZGJyYXggd2lsbCBub3QgYmUgaW4gZWZmZWN0IHlldCwKKyUgc28gVGVYIHdvdWxkIG90aGVyd2lzZSBjb21wbGFpbiBhYm91dCB1bmRlZmluZWQgY29udHJvbCBzZXF1ZW5jZS4KK3sKKyAgXGFjdGl2ZXBhcmVucworICBcZ2xvYmFsXGxldCg9XGxwYXJlbiBcZ2xvYmFsXGxldCk9XHJwYXJlbgorICBcZ2xvYmFsXGxldFs9XGxicmFjayBcZ2xvYmFsXGxldF09XHJicmFjaworICBcZ2xvYmFsXGxldCYgPSBcJgorCisgIFxnZGVmXGJvbGRicmF4e1xsZXQoPVxvcG5yXGxldCk9XGNsbnJcbGV0Wz1cbGJyYlxsZXRdPVxyYnJifQorICBcZ2RlZlxtYWdpY2FtcHtcbGV0Jj1cYW1wcm19Cit9CisKK1xuZXdjb3VudFxwYXJlbmNvdW50CisKKyUgSWYgd2UgZW5jb3VudGVyICZmb28sIHRoZW4gdHVybiBvbiAoKS1oYWNraW5nIGFmdGVyd2FyZHMKK1xuZXdpZlxpZmFtcHNlZW4KK1xkZWZcYW1wcm0jMSB7XGFtcHNlZW50cnVle1xiZlwmIzEgfX0KKworXGRlZlxwYXJlbmZvbnR7JQorICBcaWZhbXBzZWVuCisgICAgJSBBdCB0aGUgZmlyc3QgbGV2ZWwsIHByaW50IHBhcmVucyBpbiByb21hbiwKKyAgICAlIG90aGVyd2lzZSB1c2UgdGhlIGRlZmF1bHQgZm9udC4KKyAgICBcaWZudW0gXHBhcmVuY291bnQ9MSBccm0gXGZpCisgIFxlbHNlCisgICAgJSBUaGUgXHNmIHBhcmVucyAoaW4gXGJvbGRicmF4KSBhY3R1YWxseSBhcmUgYSBsaXR0bGUgYm9sZGVyIHRoYW4KKyAgICAlIHRoZSBjb250YWluZWQgdGV4dC4gIFRoaXMgaXMgZXNwZWNpYWxseSBuZWVkZWQgZm9yIFsgYW5kIF0gLgorICAgIFxzZgorICBcZmkKK30KK1xkZWZcaW5maXJzdGxldmVsIzF7JQorICBcaWZhbXBzZWVuCisgICAgXGlmbnVtXHBhcmVuY291bnQ9MQorICAgICAgIzElCisgICAgXGZpCisgIFxmaQorfQorXGRlZlxiZmFmdGVyd29yZCMxIHsjMSBcYmZ9CisKK1xkZWZcb3BucnslCisgIFxnbG9iYWxcYWR2YW5jZVxwYXJlbmNvdW50IGJ5IDEKKyAge1xwYXJlbmZvbnQofSUKKyAgXGluZmlyc3RsZXZlbCBcYmZhZnRlcndvcmQKK30KK1xkZWZcY2xucnslCisgIHtccGFyZW5mb250KX0lCisgIFxpbmZpcnN0bGV2ZWwgXHNsCisgIFxnbG9iYWxcYWR2YW5jZVxwYXJlbmNvdW50IGJ5IC0xCit9CisKK1xuZXdjb3VudFxicmFja2NvdW50CitcZGVmXGxicmJ7JQorICBcZ2xvYmFsXGFkdmFuY2VcYnJhY2tjb3VudCBieSAxCisgIHtcYmZbfSUKK30KK1xkZWZccmJyYnslCisgIHtcYmZdfSUKKyAgXGdsb2JhbFxhZHZhbmNlXGJyYWNrY291bnQgYnkgLTEKK30KKworXGRlZlxjaGVja3BhcmVuY291bnRzeyUKKyAgXGlmbnVtXHBhcmVuY291bnQ9MCBcZWxzZSBcYmFkcGFyZW5jb3VudCBcZmkKKyAgXGlmbnVtXGJyYWNrY291bnQ9MCBcZWxzZSBcYmFkYnJhY2tjb3VudCBcZmkKK30KK1xkZWZcYmFkcGFyZW5jb3VudHslCisgIFxlcnJtZXNzYWdle1VuYmFsYW5jZWQgcGFyZW50aGVzZXMgaW4gQGRlZn0lCisgIFxnbG9iYWxccGFyZW5jb3VudD0wCit9CitcZGVmXGJhZGJyYWNrY291bnR7JQorICBcZXJybWVzc2FnZXtVbmJhbGFuY2VkIHNxdWFyZSBicmFjZXMgaW4gQGRlZn0lCisgIFxnbG9iYWxcYnJhY2tjb3VudD0wCit9CisKKworXG1lc3NhZ2V7bWFjcm9zLH0KKyUgQG1hY3JvLgorCislIFRvIGRvIHRoaXMgcmlnaHQgd2UgbmVlZCBhIGZlYXR1cmUgb2YgZS1UZVgsIFxzY2FudG9rZW5zLAorJSB3aGljaCB3ZSBhcnJhbmdlIHRvIGVtdWxhdGUgd2l0aCBhIHRlbXBvcmFyeSBmaWxlIGluIG9yZGluYXJ5IFRlWC4KK1xpZnhcZVRlWHZlcnNpb25cdW5kZWZpbmVkCisgIFxuZXd3cml0ZVxtYWNzY3JpYmJsZQorICBcZGVmXHNjYW50b2tlbnMjMXslCisgICAgXHRva3MwPXsjMX0lCisgICAgXGltbWVkaWF0ZVxvcGVub3V0XG1hY3NjcmliYmxlPVxqb2JuYW1lLnRtcAorICAgIFxpbW1lZGlhdGVcd3JpdGVcbWFjc2NyaWJibGV7XHRoZVx0b2tzMH0lCisgICAgXGltbWVkaWF0ZVxjbG9zZW91dFxtYWNzY3JpYmJsZQorICAgIFxpbnB1dCBcam9ibmFtZS50bXAKKyAgfQorXGZpCisKK1xkZWZcc2Nhbm1hY3JvIzF7JQorICBcYmVnaW5ncm91cAorICAgIFxuZXdsaW5lY2hhcmBcXl5NCisgICAgXGxldFx4ZWF0c3BhY2VzXGVhdHNwYWNlcworICAgICUgVW5kbyBjYXRjb2RlIGNoYW5nZXMgb2YgXHN0YXJ0Y29udGVudHMgYW5kIFxkb3ByaW50aW5kZXgKKyAgICAlIFdoZW4gY2FsbGVkIGZyb20gQGluc2VydGNvcHlpbmcgb3IgKHNob3J0KWNhcHRpb24sIHdlIG5lZWQgYWN0aXZlCisgICAgJSBiYWNrc2xhc2ggdG8gZ2V0IGl0IHByaW50ZWQgY29ycmVjdGx5LiAgUHJldmlvdXNseSwgd2UgaGFkCisgICAgJSBcY2F0Y29kZWBcXD1cb3RoZXIgaW5zdGVhZC4gIFdlJ2xsIHNlZSB3aGV0aGVyIGEgcHJvYmxlbSBhcHBlYXJzCisgICAgJSB3aXRoIG1hY3JvIGV4cGFuc2lvbi4JCQkJLS1rYXNhbCwgMTlhdWcwNAorICAgIFxjYXRjb2RlYFxAPTAgXGNhdGNvZGVgXFw9XGFjdGl2ZSBcZXNjYXBlY2hhcj1gXEAKKyAgICAlIC4uLiBhbmQgXGV4YW1wbGUKKyAgICBcc3BhY2Vpc3NwYWNlCisgICAgJQorICAgICUgQXBwZW5kIFxlbmRpbnB1dCB0byBtYWtlIHN1cmUgdGhhdCBUZVggZG9lcyBub3Qgc2VlIHRoZSBlbmRpbmcgbmV3bGluZS4KKyAgICAlCisgICAgJSBJJ3ZlIHZlcmlmaWVkIHRoYXQgaXQgaXMgbmVjZXNzYXJ5IGJvdGggZm9yIGUtVGVYIGFuZCBmb3Igb3JkaW5hcnkgVGVYCisgICAgJQkJCQkJCQktLWthc2FsLCAyOW5vdjAzCisgICAgXHNjYW50b2tlbnN7IzFcZW5kaW5wdXR9JQorICBcZW5kZ3JvdXAKK30KKworXGRlZlxzY2FuZXhwIzF7JQorICBcZWRlZlx0ZW1we1xub2V4cGFuZFxzY2FubWFjcm97IzF9fSUKKyAgXHRlbXAKK30KKworXG5ld2NvdW50XHBhcmFtbm8gICAlIENvdW50IG9mIHBhcmFtZXRlcnMKK1xuZXd0b2tzXG1hY25hbWUgICAgJSBNYWNybyBuYW1lCitcbmV3aWZcaWZyZWN1cnNpdmUgICUgSXMgaXQgcmVjdXJzaXZlPworXGRlZlxtYWNyb2xpc3R7fSAgICAlIExpc3Qgb2YgYWxsIGRlZmluZWQgbWFjcm9zIGluIHRoZSBmb3JtCisgICAgICAgICAgICAgICAgICAgICUgXGRvXG1hY3JvMVxkb1xtYWNybzIuLi4KKworJSBVdGlsaXR5IHJvdXRpbmVzLgorJSBUaGlzIGRvZXMgXGxldCAjMSA9ICMyLCB3aXRoIFxjc25hbWVzOyB0aGF0IGlzLAorJSAgIFxsZXQgXGNzbmFtZSMxXGVuZGNzbmFtZSA9IFxjc25hbWUjMlxlbmRjc25hbWUKKyUgKGV4Y2VwdCBvZiBjb3Vyc2Ugd2UgaGF2ZSB0byBwbGF5IGV4cGFuc2lvbiBnYW1lcykuCislIAorXGRlZlxjc2xldCMxIzJ7JQorICBcZXhwYW5kYWZ0ZXJcbGV0CisgIFxjc25hbWUjMVxleHBhbmRhZnRlclxlbmRjc25hbWUKKyAgXGNzbmFtZSMyXGVuZGNzbmFtZQorfQorCislIFRyaW0gbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzIG9mZiBhIHN0cmluZy4KKyUgQ29uY2VwdHMgZnJvbSBhcm8tYmVuZCBwcm9ibGVtIDE1IChzZWUgQ1RBTikuCit7XGNhdGNvZGVgXEA9MTEKK1xnZGVmXGVhdHNwYWNlcyAjMXtcZXhwYW5kYWZ0ZXJcdHJpbUBcZXhwYW5kYWZ0ZXJ7IzEgfX0KK1xnZGVmXHRyaW1AICMxe1x0cmltQEAgQCMxIEAgIzEgQCBAQH0KK1xnZGVmXHRyaW1AQCAjMUAgIzJAICMzQEB7XHRyaW1AQEBcZW1wdHkgIzIgQH0KK1xkZWZcdW5icmFjZSMxeyMxfQorXHVuYnJhY2V7XGdkZWZcdHJpbUBAQCAjMSB9ICMyQHsjMX0KK30KKworJSBUcmltIGEgc2luZ2xlIHRyYWlsaW5nIF5eTSBvZmYgYSBzdHJpbmcuCit7XGNhdGNvZGVgXF5eTT1cb3RoZXIgXGNhdGNvZGVgXFE9MyUKK1xnZGVmXGVhdGNyICMxe1xlYXRjcmEgIzFRXl5NUX0lCitcZ2RlZlxlYXRjcmEjMV5eTVF7XGVhdGNyYiMxUX0lCitcZ2RlZlxlYXRjcmIjMVEjMlF7IzF9JQorfQorCislIE1hY3JvIGJvZGllcyBhcmUgYWJzb3JiZWQgYXMgYW4gYXJndW1lbnQgaW4gYSBjb250ZXh0IHdoZXJlCislIGFsbCBjaGFyYWN0ZXJzIGFyZSBjYXRjb2RlIDEwLCAxMSBvciAxMiwgZXhjZXB0IFwgd2hpY2ggaXMgYWN0aXZlCislIChhcyBpbiBub3JtYWwgdGV4aW5mbykuIEl0IGlzIG5lY2Vzc2FyeSB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YgXC4KKworJSBJdCdzIG5lY2Vzc2FyeSB0byBoYXZlIGhhcmQgQ1JzIHdoZW4gdGhlIG1hY3JvIGlzIGV4ZWN1dGVkLiBUaGlzIGlzCislIGRvbmUgYnkgIG1ha2luZyBeXk0gKFxlbmRsaW5lY2hhcikgY2F0Y29kZSAxMiB3aGVuIHJlYWRpbmcgdGhlIG1hY3JvCislIGJvZHksIGFuZCB0aGVuIG1ha2luZyBpdCB0aGUgXG5ld2xpbmVjaGFyIGluIFxzY2FubWFjcm8uCisKK1xkZWZcc2NhbmN0eHR7JQorICBcY2F0Y29kZWBcIj1cb3RoZXIKKyAgXGNhdGNvZGVgXCs9XG90aGVyCisgIFxjYXRjb2RlYFw8PVxvdGhlcgorICBcY2F0Y29kZWBcPj1cb3RoZXIKKyAgXGNhdGNvZGVgXEA9XG90aGVyCisgIFxjYXRjb2RlYFxePVxvdGhlcgorICBcY2F0Y29kZWBcXz1cb3RoZXIKKyAgXGNhdGNvZGVgXHw9XG90aGVyCisgIFxjYXRjb2RlYFx+PVxvdGhlcgorfQorCitcZGVmXHNjYW5hcmdjdHh0eyUKKyAgXHNjYW5jdHh0CisgIFxjYXRjb2RlYFxcPVxvdGhlcgorICBcY2F0Y29kZWBcXl5NPVxvdGhlcgorfQorCitcZGVmXG1hY3JvYm9keWN0eHR7JQorICBcc2NhbmN0eHQKKyAgXGNhdGNvZGVgXHs9XG90aGVyCisgIFxjYXRjb2RlYFx9PVxvdGhlcgorICBcY2F0Y29kZWBcXl5NPVxvdGhlcgorICBcdXNlbWJvZHliYWNrc2xhc2gKK30KKworXGRlZlxtYWNyb2FyZ2N0eHR7JQorICBcc2NhbmN0eHQKKyAgXGNhdGNvZGVgXFw9XG90aGVyCit9CisKKyUgXG1ib2R5YmFja3NsYXNoIGlzIHRoZSBkZWZpbml0aW9uIG9mIFwgaW4gQG1hY3JvIGJvZGllcy4KKyUgSXQgbWFwcyBcZm9vXCA9PiBcY3NuYW1lIG1hY2FyZy5mb29cZW5kY3NuYW1lID0+ICNOCislIHdoZXJlIE4gaXMgdGhlIG1hY3JvIHBhcmFtZXRlciBudW1iZXIuCislIFdlIGRlZmluZSBcY3NuYW1lIG1hY2FyZy5cZW5kY3NuYW1lIHRvIGJlIFxyZWFsYmFja3NsYXNoLCBzbworJSBcXCBpbiBtYWNybyByZXBsYWNlbWVudCB0ZXh0IGdldHMgeW91IGEgYmFja3NsYXNoLgorCit7XGNhdGNvZGVgQD0wIEBjYXRjb2RlYEBcPUBhY3RpdmUKKyBAZ2RlZkB1c2VtYm9keWJhY2tzbGFzaHtAbGV0XD1AbWJvZHliYWNrc2xhc2h9CisgQGdkZWZAbWJvZHliYWNrc2xhc2gjMVx7QGNzbmFtZSBtYWNhcmcuIzFAZW5kY3NuYW1lfQorfQorXGV4cGFuZGFmdGVyXGRlZlxjc25hbWUgbWFjYXJnLlxlbmRjc25hbWV7XHJlYWxiYWNrc2xhc2h9CisKK1xkZWZcbWFjcm97XHJlY3Vyc2l2ZWZhbHNlXHBhcnNlYXJnXG1hY3JveHh4fQorXGRlZlxybWFjcm97XHJlY3Vyc2l2ZXRydWVccGFyc2VhcmdcbWFjcm94eHh9CisKK1xkZWZcbWFjcm94eHgjMXslCisgIFxnZXRhcmdzeyMxfSUgICAgICAgICAgIG5vdyBcbWFjbmFtZSBpcyB0aGUgbWFjbmFtZSBhbmQgXGFyZ2wgdGhlIGFyZ2xpc3QKKyAgXGlmeFxhcmdsXGVtcHR5ICAgICAgICUgbm8gYXJndW1lbnRzCisgICAgIFxwYXJhbW5vPTAlCisgIFxlbHNlCisgICAgIFxleHBhbmRhZnRlclxwYXJzZW1hcmdkZWYgXGFyZ2w7JQorICBcZmkKKyAgXGlmMVxjc25hbWUgaXNtYWNyby5cdGhlXG1hY25hbWVcZW5kY3NuYW1lCisgICAgIFxtZXNzYWdle1dhcm5pbmc6IHJlZGVmaW5pbmcgXHRoZVxtYWNuYW1lfSUKKyAgXGVsc2UKKyAgICAgXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgXHRoZVxtYWNuYW1lXGVuZGNzbmFtZSBccmVsYXgKKyAgICAgXGVsc2UgXGVycm1lc3NhZ2V7TWFjcm8gbmFtZSBcdGhlXG1hY25hbWVcc3BhY2UgYWxyZWFkeSBkZWZpbmVkfVxmaQorICAgICBcZ2xvYmFsXGNzbGV0e21hY3NhdmUuXHRoZVxtYWNuYW1lfXtcdGhlXG1hY25hbWV9JQorICAgICBcZ2xvYmFsXGV4cGFuZGFmdGVyXGxldFxjc25hbWUgaXNtYWNyby5cdGhlXG1hY25hbWVcZW5kY3NuYW1lPTElCisgICAgICUgQWRkIHRoZSBtYWNyb25hbWUgdG8gXG1hY3JvbGlzdAorICAgICBcdG9rczAgPSBcZXhwYW5kYWZ0ZXJ7XG1hY3JvbGlzdFxkb30lCisgICAgIFx4ZGVmXG1hY3JvbGlzdHtcdGhlXHRva3MwCisgICAgICAgXGV4cGFuZGFmdGVyXG5vZXhwYW5kXGNzbmFtZVx0aGVcbWFjbmFtZVxlbmRjc25hbWV9JQorICBcZmkKKyAgXGJlZ2luZ3JvdXAgXG1hY3JvYm9keWN0eHQKKyAgXGlmcmVjdXJzaXZlIFxleHBhbmRhZnRlclxwYXJzZXJtYWNib2R5CisgIFxlbHNlIFxleHBhbmRhZnRlclxwYXJzZW1hY2JvZHkKKyAgXGZpfQorCitccGFyc2VhcmdkZWZcdW5tYWNyb3slCisgIFxpZjFcY3NuYW1lIGlzbWFjcm8uIzFcZW5kY3NuYW1lCisgICAgXGdsb2JhbFxjc2xldHsjMX17bWFjc2F2ZS4jMX0lCisgICAgXGdsb2JhbFxleHBhbmRhZnRlclxsZXQgXGNzbmFtZSBpc21hY3JvLiMxXGVuZGNzbmFtZT0wJQorICAgICUgUmVtb3ZlIHRoZSBtYWNybyBuYW1lIGZyb20gXG1hY3JvbGlzdDoKKyAgICBcYmVnaW5ncm91cAorICAgICAgXGV4cGFuZGFmdGVyXGxldFxjc25hbWUjMVxlbmRjc25hbWUgXHJlbGF4CisgICAgICBcbGV0XGRvXHVubWFjcm9kbworICAgICAgXHhkZWZcbWFjcm9saXN0e1xtYWNyb2xpc3R9JQorICAgIFxlbmRncm91cAorICBcZWxzZQorICAgIFxlcnJtZXNzYWdle01hY3JvICMxIG5vdCBkZWZpbmVkfSUKKyAgXGZpCit9CisKKyUgQ2FsbGVkIGJ5IFxkbyBmcm9tIFxkb3VubWFjcm8gb24gZWFjaCBtYWNyby4gIFRoZSBpZGVhIGlzIHRvIG9taXQgYW55CislIG1hY3JvIGRlZmluaXRpb25zIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gXHJlbGF4LgorJQorXGRlZlx1bm1hY3JvZG8jMXslCisgIFxpZngjMVxyZWxheAorICAgICUgcmVtb3ZlIHRoaXMKKyAgXGVsc2UKKyAgICBcbm9leHBhbmRcZG8gXG5vZXhwYW5kICMxJQorICBcZmkKK30KKworJSBUaGlzIG1ha2VzIHVzZSBvZiB0aGUgb2JzY3VyZSBmZWF0dXJlIHRoYXQgaWYgdGhlIGxhc3QgdG9rZW4gb2YgYQorJSA8cGFyYW1ldGVyIGxpc3Q+IGlzICMsIHRoZW4gdGhlIHByZWNlZGluZyBhcmd1bWVudCBpcyBkZWxpbWl0ZWQgYnkKKyUgYW4gb3BlbmluZyBicmFjZSwgYW5kIHRoYXQgb3BlbmluZyBicmFjZSBpcyBub3QgY29uc3VtZWQuCitcZGVmXGdldGFyZ3MjMXtcZ2V0YXJnc3h4eCMxe319CitcZGVmXGdldGFyZ3N4eHgjMSN7XGdldG1hY25hbWUgIzEgXHJlbGF4XGdldG1hY2FyZ3N9CitcZGVmXGdldG1hY25hbWUgIzEgIzJccmVsYXh7XG1hY25hbWU9eyMxfX0KK1xkZWZcZ2V0bWFjYXJncyMxe1xkZWZcYXJnbHsjMX19CisKKyUgUGFyc2UgdGhlIG9wdGlvbmFsIHtwYXJhbXN9IGxpc3QuICBTZXQgdXAgXHBhcmFtbm8gYW5kIFxwYXJhbWxpc3QKKyUgc28gXGRlZm1hY3JvIGtub3dzIHdoYXQgdG8gZG8uICBEZWZpbmUgXG1hY2FyZy5ibGFoIGZvciBlYWNoIGJsYWgKKyUgaW4gdGhlIHBhcmFtcyBsaXN0LCB0byBiZSAjI04gd2hlcmUgTiBpcyB0aGUgcG9zaXRpb24gaW4gdGhhdCBsaXN0LgorJSBUaGF0IGdldHMgdXNlZCBieSBcbWJvZHliYWNrc2xhc2ggKGFib3ZlKS4KKworJSBXZSBuZWVkIHRvIGdldCBgbWFjcm8gcGFyYW1ldGVyIGNoYXIgIycgaW50byBzZXZlcmFsIGRlZmluaXRpb25zLgorJSBUaGUgdGVjaG5pcXVlIHVzZWQgaXMgc3RvbGVuIGZyb20gTGFUZVg6ICBsZXQgXGhhc2ggYmUgc29tZXRoaW5nCislIHVuZXhwYW5kYWJsZSwgaW5zZXJ0IHRoYXQgd2hlcmV2ZXIgeW91IG5lZWQgYSAjLCBhbmQgdGhlbiByZWRlZmluZQorJSBpdCB0byAjIGp1c3QgYmVmb3JlIHVzaW5nIHRoZSB0b2tlbiBsaXN0IHByb2R1Y2VkLgorJQorJSBUaGUgc2FtZSB0ZWNobmlxdWUgaXMgdXNlZCB0byBwcm90ZWN0IFxlYXRzcGFjZXMgdGlsbCBqdXN0IGJlZm9yZQorJSB0aGUgbWFjcm8gaXMgdXNlZC4KKworXGRlZlxwYXJzZW1hcmdkZWYjMTt7XHBhcmFtbm89MFxkZWZccGFyYW1saXN0e30lCisgICAgICAgIFxsZXRcaGFzaFxyZWxheFxsZXRceGVhdHNwYWNlc1xyZWxheFxwYXJzZW1hcmdkZWZ4eHgjMSw7LH0KK1xkZWZccGFyc2VtYXJnZGVmeHh4IzEseyUKKyAgXGlmIzE7XGxldFxuZXh0PVxyZWxheAorICBcZWxzZSBcbGV0XG5leHQ9XHBhcnNlbWFyZ2RlZnh4eAorICAgIFxhZHZhbmNlXHBhcmFtbm8gYnkgMSUKKyAgICBcZXhwYW5kYWZ0ZXJcZWRlZlxjc25hbWUgbWFjYXJnLlxlYXRzcGFjZXN7IzF9XGVuZGNzbmFtZQorICAgICAgICB7XHhlYXRzcGFjZXN7XGhhc2hcdGhlXHBhcmFtbm99fSUKKyAgICBcZWRlZlxwYXJhbWxpc3R7XHBhcmFtbGlzdFxoYXNoXHRoZVxwYXJhbW5vLH0lCisgIFxmaVxuZXh0fQorCislIFRoZXNlIHR3byBjb21tYW5kcyByZWFkIHJlY3Vyc2l2ZSBhbmQgbm9ucmVjdXJzaXZlIG1hY3JvIGJvZGllcy4KKyUgKFRoZXkncmUgZGlmZmVyZW50IHNpbmNlIHJlYyBhbmQgbm9ucmVjIG1hY3JvcyBlbmQgZGlmZmVyZW50bHkuKQorCitcbG9uZ1xkZWZccGFyc2VtYWNib2R5IzFAZW5kIG1hY3JvJQore1x4ZGVmXHRlbXB7XGVhdGNyeyMxfX1cZW5kZ3JvdXBcZGVmbWFjcm99JQorXGxvbmdcZGVmXHBhcnNlcm1hY2JvZHkjMUBlbmQgcm1hY3JvJQore1x4ZGVmXHRlbXB7XGVhdGNyeyMxfX1cZW5kZ3JvdXBcZGVmbWFjcm99JQorCislIFRoaXMgZGVmaW5lcyB0aGUgbWFjcm8gaXRzZWxmLiBUaGVyZSBhcmUgc2l4IGNhc2VzOiByZWN1cnNpdmUgYW5kCislIG5vbnJlY3Vyc2l2ZSBtYWNyb3Mgb2YgemVybywgb25lLCBhbmQgbWFueSBhcmd1bWVudHMuCislIE11Y2ggbWFnaWMgd2l0aCBcZXhwYW5kYWZ0ZXIgaGVyZS4KKyUgXHhkZWYgaXMgdXNlZCBzbyB0aGF0IG1hY3JvIGRlZmluaXRpb25zIHdpbGwgc3Vydml2ZSB0aGUgZmlsZQorJSB0aGV5J3JlIGRlZmluZWQgaW47IEBpbmNsdWRlIHJlYWRzIHRoZSBmaWxlIGluc2lkZSBhIGdyb3VwLgorXGRlZlxkZWZtYWNyb3slCisgIFxsZXRcaGFzaD0jIyUgY29udmVydCBwbGFjZWhvbGRlcnMgdG8gbWFjcm8gcGFyYW1ldGVyIGNoYXJzCisgIFxpZnJlY3Vyc2l2ZQorICAgIFxpZmNhc2VccGFyYW1ubworICAgICUgMAorICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lXGVuZGNzbmFtZXslCisgICAgICAgIFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9fSUKKyAgICBcb3IgJSAxCisgICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWVcZW5kY3NuYW1leyUKKyAgICAgICAgIFxiZ3JvdXBcbm9leHBhbmRcbWFjcm9hcmdjdHh0CisgICAgICAgICBcbm9leHBhbmRcYnJhY2VvcmxpbmUKKyAgICAgICAgIFxleHBhbmRhZnRlclxub2V4cGFuZFxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZX0lCisgICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZSMjMXslCisgICAgICAgICBcZWdyb3VwXG5vZXhwYW5kXHNjYW5tYWNyb3tcdGVtcH19JQorICAgIFxlbHNlICUgbWFueQorICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lXGVuZGNzbmFtZXslCisgICAgICAgICBcYmdyb3VwXG5vZXhwYW5kXG1hY3JvYXJnY3R4dAorICAgICAgICAgXG5vZXhwYW5kXGNzbmFtZVx0aGVcbWFjbmFtZSB4eFxlbmRjc25hbWV9JQorICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lIHh4XGVuZGNzbmFtZSMjMXslCisgICAgICAgICAgXGV4cGFuZGFmdGVyXG5vZXhwYW5kXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lICMjMSx9JQorICAgICAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyCisgICAgICBcZXhwYW5kYWZ0ZXJceGRlZgorICAgICAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyCisgICAgICAgIFxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZQorICAgICAgICAgIFxwYXJhbWxpc3R7XGVncm91cFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9fSUKKyAgICBcZmkKKyAgXGVsc2UKKyAgICBcaWZjYXNlXHBhcmFtbm8KKyAgICAlIDAKKyAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZVxlbmRjc25hbWV7JQorICAgICAgICBcbm9leHBhbmRcbm9yZWN1cnNle1x0aGVcbWFjbmFtZX0lCisgICAgICAgIFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9XGVncm91cH0lCisgICAgXG9yICUgMQorICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lXGVuZGNzbmFtZXslCisgICAgICAgICBcYmdyb3VwXG5vZXhwYW5kXG1hY3JvYXJnY3R4dAorICAgICAgICAgXG5vZXhwYW5kXGJyYWNlb3JsaW5lCisgICAgICAgICBcZXhwYW5kYWZ0ZXJcbm9leHBhbmRcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWV9JQorICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWUjIzF7JQorICAgICAgICBcZWdyb3VwCisgICAgICAgIFxub2V4cGFuZFxub3JlY3Vyc2V7XHRoZVxtYWNuYW1lfSUKKyAgICAgICAgXG5vZXhwYW5kXHNjYW5tYWNyb3tcdGVtcH1cZWdyb3VwfSUKKyAgICBcZWxzZSAlIG1hbnkKKyAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZVxlbmRjc25hbWV7JQorICAgICAgICAgXGJncm91cFxub2V4cGFuZFxtYWNyb2FyZ2N0eHQKKyAgICAgICAgIFxleHBhbmRhZnRlclxub2V4cGFuZFxjc25hbWVcdGhlXG1hY25hbWUgeHhcZW5kY3NuYW1lfSUKKyAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZSB4eFxlbmRjc25hbWUjIzF7JQorICAgICAgICAgIFxleHBhbmRhZnRlclxub2V4cGFuZFxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZSAjIzEsfSUKKyAgICAgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlcgorICAgICAgXGV4cGFuZGFmdGVyXHhkZWYKKyAgICAgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlcgorICAgICAgXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lCisgICAgICBccGFyYW1saXN0eyUKKyAgICAgICAgICBcZWdyb3VwCisgICAgICAgICAgXG5vZXhwYW5kXG5vcmVjdXJzZXtcdGhlXG1hY25hbWV9JQorICAgICAgICAgIFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9XGVncm91cH0lCisgICAgXGZpCisgIFxmaX0KKworXGRlZlxub3JlY3Vyc2UjMXtcYmdyb3VwXGNzbGV0eyMxfXttYWNzYXZlLiMxfX0KKworJSBcYnJhY2VvcmxpbmUgZGVjaWRlcyB3aGV0aGVyIHRoZSBuZXh0IG5vbndoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIGEKKyUgey4gIElmIHNvIGl0IHJlYWRzIHVwIHRvIHRoZSBjbG9zaW5nIH0sIGlmIG5vdCwgaXQgcmVhZHMgdGhlIHdob2xlCislIGxpbmUuICBXaGF0ZXZlciB3YXMgcmVhZCBpcyB0aGVuIGZlZCB0byB0aGUgbmV4dCBjb250cm9sIHNlcXVlbmNlCislIGFzIGFuIGFyZ3VtZW50IChieSBccGFyc2VicmFjZSBvciBccGFyc2VhcmcpCitcZGVmXGJyYWNlb3JsaW5lIzF7XGxldFxuZXh0PSMxXGZ1dHVyZWxldFxuY2hhclxicmFjZW9ybGluZXh4eH0KK1xkZWZcYnJhY2VvcmxpbmV4eHh7JQorICBcaWZ4XG5jaGFyXGJncm91cFxlbHNlCisgICAgXGV4cGFuZGFmdGVyXHBhcnNlYXJnCisgIFxmaSBcbmV4dH0KKworJSBXZSB3YW50IHRvIGRpc2FibGUgYWxsIG1hY3JvcyBkdXJpbmcgXHNoaXBvdXQgc28gdGhhdCB0aGV5IGFyZSBub3QKKyUgZXhwYW5kZWQgYnkgXHdyaXRlLgorXGRlZlx0dXJub2ZmbWFjcm9ze1xiZWdpbmdyb3VwIFxkZWZcZG8jIzF7XGxldFxub2V4cGFuZCMjMT1ccmVsYXh9JQorICBcZWRlZlxuZXh0e1xtYWNyb2xpc3R9XGV4cGFuZGFmdGVyXGVuZGdyb3VwXG5leHR9CisKKyUgRm9yIFxpbmRleG5vZm9udHMsIHdlIG5lZWQgdG8gZ2V0IHJpZCBvZiBhbGwgbWFjcm9zLCBsZWF2aW5nIG9ubHkgdGhlCislIGFyZ3VtZW50cyAoaWYgcHJlc2VudCkuICBPZiBjb3Vyc2UgdGhpcyBpcyBub3QgbmVhcmx5IGNvcnJlY3QsIGJ1dCBpdAorJSBpcyB0aGUgYmVzdCB3ZSBjYW4gZG8gZm9yIG5vdy4gIG1ha2VpbmZvIGRvZXMgbm90IGV4cGFuZCBtYWNyb3MgaW4gdGhlCislIGFyZ3VtZW50IHRvIEBkZWZmbiwgd2hpY2ggZW5kcyB1cCB3cml0aW5nIGFuIGluZGV4IGVudHJ5LCBhbmQgdGV4aW5kZXgKKyUgaXNuJ3QgcHJlcGFyZWQgZm9yIGFuIGluZGV4IHNvcnQgZW50cnkgdGhhdCBzdGFydHMgd2l0aCBcLgorJSAKKyUgU2luY2UgbWFjcm8gaW52b2NhdGlvbnMgYXJlIGZvbGxvd2VkIGJ5IGJyYWNlcywgd2UgY2FuIGp1c3QgcmVkZWZpbmUgdGhlbQorJSB0byB0YWtlIGEgc2luZ2xlIFRlWCBhcmd1bWVudC4gIFRoZSBjYXNlIG9mIGEgbWFjcm8gaW52b2NhdGlvbiB0aGF0CislIGdvZXMgdG8gZW5kLW9mLWxpbmUgaXMgbm90IGhhbmRsZWQuCislIAorXGRlZlxlbXB0eXVzZXJtYWNyb3N7XGJlZ2luZ3JvdXAKKyAgXGRlZlxkbyMjMXtcbGV0XG5vZXhwYW5kIyMxPVxub2V4cGFuZFxhc2lzfSUKKyAgXGVkZWZcbmV4dHtcbWFjcm9saXN0fVxleHBhbmRhZnRlclxlbmRncm91cFxuZXh0fQorCisKKyUgQGFsaWFzLgorJSBXZSBuZWVkIHNvbWUgdHJpY2tlcnkgdG8gcmVtb3ZlIHRoZSBvcHRpb25hbCBzcGFjZXMgYXJvdW5kIHRoZSBlcXVhbAorJSBzaWduLiAgSnVzdCBtYWtlIHRoZW0gYWN0aXZlIGFuZCB0aGVuIGV4cGFuZCB0aGVtIGFsbCB0byBub3RoaW5nLgorXGRlZlxhbGlhc3tccGFyc2Vhcmd1c2luZ1xvYmV5c3BhY2VzXGFsaWFzeHh4fQorXGRlZlxhbGlhc3h4eCAjMXtcYWxpYXN5eXkjMVxyZWxheH0KK1xkZWZcYWxpYXN5eXkgIzE9IzJccmVsYXh7JQorICB7JQorICAgIFxleHBhbmRhZnRlclxsZXRcb2JleWVkc3BhY2U9XGVtcHR5CisgICAgXHhkZWZcbmV4dHtcZ2xvYmFsXGxldFxtYWtlY3NuYW1leyMxfT1cbWFrZWNzbmFtZXsjMn19JQorICB9JQorICBcbmV4dAorfQorCisKK1xtZXNzYWdle2Nyb3NzIHJlZmVyZW5jZXMsfQorCitcbmV3d3JpdGVcYXV4ZmlsZQorCitcbmV3aWZcaWZoYXZleHJlZnMgICAgJSBUcnVlIGlmIHhyZWYgdmFsdWVzIGFyZSBrbm93bi4KK1xuZXdpZlxpZndhcm5lZHhyZWZzICAlIFRydWUgaWYgd2Ugd2FybmVkIG9uY2UgdGhhdCB0aGV5IGFyZW4ndCBrbm93bi4KKworJSBAaW5mb3JlZiBpcyByZWxhdGl2ZWx5IHNpbXBsZS4KK1xkZWZcaW5mb3JlZiAjMXtcaW5mb3JlZnp6eiAjMSwsLCwqKn0KK1xkZWZcaW5mb3JlZnp6eiAjMSwjMiwjMywjNCoqe1xwdXR3b3JkU2Vle30gXHB1dHdvcmRJbmZve30gXHB1dHdvcmRmaWxle30gXGZpbGV7XGlnbm9yZXNwYWNlcyAjM3t9fSwKKyAgbm9kZSBcc2FtcHtcaWdub3Jlc3BhY2VzIzF7fX19CisKKyUgQG5vZGUncyBvbmx5IGpvYiBpbiBUZVggaXMgdG8gZGVmaW5lIFxsYXN0bm9kZSwgd2hpY2ggaXMgdXNlZCBpbgorJSBjcm9zcy1yZWZlcmVuY2VzLiAgVGhlIEBub2RlIGxpbmUgbWlnaHQgb3IgbWlnaHQgbm90IGhhdmUgY29tbWFzLCBhbmQKKyUgbWlnaHQgb3IgbWlnaHQgbm90IGhhdmUgc3BhY2VzIGJlZm9yZSB0aGUgZmlyc3QgY29tbWEsIGxpa2U6CislIEBub2RlIGZvbyAsIGJhciAsIC4uLgorJSBXZSBkb24ndCB3YW50IHN1Y2ggdHJhaWxpbmcgc3BhY2VzIGluIHRoZSBub2RlIG5hbWUuCislCitccGFyc2VhcmdkZWZcbm9kZXtcY2hlY2tlbnZ7fVxkb25vZGUgIzEgLFxmaW5pc2hub2RlcGFyc2V9CislCislIGFsc28gcmVtb3ZlIGEgdHJhaWxpbmcgY29tbWEsIGluIGNhc2Ugb2Ygc29tZXRoaW5nIGxpa2UgdGhpczoKKyUgQG5vZGUgSGVscC1Dcm9zcywgICwgICwgQ3Jvc3MtcmVmcworXGRlZlxkb25vZGUjMSAsIzJcZmluaXNobm9kZXBhcnNle1xkb2Rvbm9kZSAjMSxcZmluaXNobm9kZXBhcnNlfQorXGRlZlxkb2Rvbm9kZSMxLCMyXGZpbmlzaG5vZGVwYXJzZXtcZ2RlZlxsYXN0bm9kZXsjMX19CisKK1xsZXRcbndub2RlPVxub2RlCitcbGV0XGxhc3Rub2RlPVxlbXB0eQorCislIFdyaXRlIGEgY3Jvc3MtcmVmZXJlbmNlIGRlZmluaXRpb24gZm9yIHRoZSBjdXJyZW50IG5vZGUuICAjMSBpcyB0aGUKKyUgdHlwZSAoWW51bWJlcmVkLCBZYXBwZW5kaXgsIFlub3RoaW5nKS4KKyUKK1xkZWZcZG9ub2RlcmVmIzF7JQorICBcaWZ4XGxhc3Rub2RlXGVtcHR5XGVsc2UKKyAgICBcc2V0cmVme1xsYXN0bm9kZX17IzF9JQorICAgIFxnbG9iYWxcbGV0XGxhc3Rub2RlPVxlbXB0eQorICBcZmkKK30KKworJSBAYW5jaG9ye05BTUV9IC0tIGRlZmluZSB4cmVmIHRhcmdldCBhdCBhcmJpdHJhcnkgcG9pbnQuCislCitcbmV3Y291bnRcc2F2ZXNmcmVnaXN0ZXIKKyUKK1xkZWZcc2F2ZXNme1xyZWxheCBcaWZobW9kZSBcc2F2ZXNmcmVnaXN0ZXI9XHNwYWNlZmFjdG9yIFxmaX0KK1xkZWZccmVzdG9yZXNme1xyZWxheCBcaWZobW9kZSBcc3BhY2VmYWN0b3I9XHNhdmVzZnJlZ2lzdGVyIFxmaX0KK1xkZWZcYW5jaG9yIzF7XHNhdmVzZiBcc2V0cmVmeyMxfXtZbm90aGluZ31ccmVzdG9yZXNmIFxpZ25vcmVzcGFjZXN9CisKKyUgXHNldHJlZntOQU1FfXtTTlR9IGRlZmluZXMgYSBjcm9zcy1yZWZlcmVuY2UgcG9pbnQgTkFNRSAoYSBub2RlIG9yIGFuCislIGFuY2hvciksIHdoaWNoIGNvbnNpc3RzIG9mIHRocmVlIHBhcnRzOgorJSAxKSBOQU1FLXRpdGxlIC0gdGhlIGN1cnJlbnQgc2VjdGlvbmluZyBuYW1lIHRha2VuIGZyb20gXHRoaXNzZWN0aW9uLAorJSAgICAgICAgICAgICAgICAgb3IgdGhlIGFuY2hvciBuYW1lLgorJSAyKSBOQU1FLXNudCAgIC0gc2VjdGlvbiBudW1iZXIgYW5kIHR5cGUsIHBhc3NlZCBhcyB0aGUgU05UIGFyZywgb3IKKyUgICAgICAgICAgICAgICAgIGVtcHR5IGZvciBhbmNob3JzLgorJSAzKSBOQU1FLXBnICAgIC0gdGhlIHBhZ2UgbnVtYmVyLgorJQorJSBUaGlzIGlzIGNhbGxlZCBmcm9tIFxkb25vZGVyZWYsIFxhbmNob3IsIGFuZCBcZG9mbG9hdC4gIEluIHRoZSBjYXNlIG9mCislIGZsb2F0cywgdGhlcmUgaXMgYW4gYWRkaXRpb25hbCBwYXJ0LCB3aGljaCBpcyBub3Qgd3JpdHRlbiBoZXJlOgorJSA0KSBOQU1FLWxvZiAgIC0gdGhlIHRleHQgYXMgaXQgc2hvdWxkIGFwcGVhciBpbiBhIEBsaXN0b2ZmbG9hdHMuCislCitcZGVmXHNldHJlZiMxIzJ7JQorICBccGRmbWtkZXN0eyMxfSUKKyAgXGlmbGlua3MKKyAgICB7JQorICAgICAgXGF0ZHVtbWllcyAgJSBwcmVzZXJ2ZSBjb21tYW5kcywgYnV0IGRvbid0IGV4cGFuZCB0aGVtCisgICAgICBcdHVybm9mZmFjdGl2ZQorICAgICAgXG90aGVyYmFja3NsYXNoCisgICAgICBcZWRlZlx3cml0ZXhyZGVmIyMxIyMyeyUKKwlcd3JpdGVcYXV4ZmlsZXtAeHJkZWZ7IzEtJSAjMSBvZiBcc2V0cmVmLCBleHBhbmRlZCBieSB0aGUgXGVkZWYKKwkgICMjMX17IyMyfX0lIHRoZXNlIGFyZSBwYXJhbWV0ZXJzIG9mIFx3cml0ZXhyZGVmCisgICAgICB9JQorICAgICAgXHRva3MwID0gXGV4cGFuZGFmdGVye1x0aGlzc2VjdGlvbn0lCisgICAgICBcaW1tZWRpYXRlIFx3cml0ZXhyZGVme3RpdGxlfXtcdGhlXHRva3MwIH0lCisgICAgICBcaW1tZWRpYXRlIFx3cml0ZXhyZGVme3NudH17XGNzbmFtZSAjMlxlbmRjc25hbWV9JSBcWW51bWJlcmVkIGV0Yy4KKyAgICAgIFx3cml0ZXhyZGVme3BnfXtcZm9saW99JSB3aWxsIGJlIHdyaXR0ZW4gbGF0ZXIsIGR1cmluZyBcc2hpcG91dAorICAgIH0lCisgIFxmaQorfQorCislIEB4cmVmLCBAcHhyZWYsIGFuZCBAcmVmIGdlbmVyYXRlIGNyb3NzLXJlZmVyZW5jZXMuICBGb3IgXHhyZWZYLCAjMSBpcworJSB0aGUgbm9kZSBuYW1lLCAjMiB0aGUgbmFtZSBvZiB0aGUgSW5mbyBjcm9zcy1yZWZlcmVuY2UsICMzIHRoZSBwcmludGVkCislIG5vZGUgbmFtZSwgIzQgdGhlIG5hbWUgb2YgdGhlIEluZm8gZmlsZSwgIzUgdGhlIG5hbWUgb2YgdGhlIHByaW50ZWQKKyUgbWFudWFsLiAgQWxsIGJ1dCB0aGUgbm9kZSBuYW1lIGNhbiBiZSBvbWl0dGVkLgorJQorXGRlZlxweHJlZiMxe1xwdXR3b3Jkc2Vle30gXHhyZWZYWyMxLCwsLCwsLF19CitcZGVmXHhyZWYjMXtccHV0d29yZFNlZXt9IFx4cmVmWFsjMSwsLCwsLCxdfQorXGRlZlxyZWYjMXtceHJlZlhbIzEsLCwsLCwsXX0KK1xkZWZceHJlZlhbIzEsIzIsIzMsIzQsIzUsIzZde1xiZWdpbmdyb3VwCisgIFx1bnNlcHNwYWNlcworICBcZGVmXHByaW50ZWRtYW51YWx7XGlnbm9yZXNwYWNlcyAjNX0lCisgIFxkZWZccHJpbnRlZHJlZm5hbWV7XGlnbm9yZXNwYWNlcyAjM30lCisgIFxzZXRib3gxPVxoYm94e1xwcmludGVkbWFudWFsXHVuc2tpcH0lCisgIFxzZXRib3gwPVxoYm94e1xwcmludGVkcmVmbmFtZVx1bnNraXB9JQorICBcaWZkaW0gXHdkMCA9IDBwdAorICAgICUgTm8gcHJpbnRlZCBub2RlIG5hbWUgd2FzIGV4cGxpY2l0bHkgZ2l2ZW4uCisgICAgXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgU0VUeHJlZi1hdXRvbWF0aWMtc2VjdGlvbi10aXRsZVxlbmRjc25hbWVccmVsYXgKKyAgICAgICUgVXNlIHRoZSBub2RlIG5hbWUgaW5zaWRlIHRoZSBzcXVhcmUgYnJhY2tldHMuCisgICAgICBcZGVmXHByaW50ZWRyZWZuYW1le1xpZ25vcmVzcGFjZXMgIzF9JQorICAgIFxlbHNlCisgICAgICAlIFVzZSB0aGUgYWN0dWFsIGNoYXB0ZXIvc2VjdGlvbiB0aXRsZSBhcHBlYXIgaW5zaWRlCisgICAgICAlIHRoZSBzcXVhcmUgYnJhY2tldHMuICBVc2UgdGhlIHJlYWwgc2VjdGlvbiB0aXRsZSBpZiB3ZSBoYXZlIGl0LgorICAgICAgXGlmZGltIFx3ZDEgPiAwcHQKKyAgICAgICAgJSBJdCBpcyBpbiBhbm90aGVyIG1hbnVhbCwgc28gd2UgZG9uJ3QgaGF2ZSBpdC4KKyAgICAgICAgXGRlZlxwcmludGVkcmVmbmFtZXtcaWdub3Jlc3BhY2VzICMxfSUKKyAgICAgIFxlbHNlCisgICAgICAgIFxpZmhhdmV4cmVmcworICAgICAgICAgICUgV2Uga25vdyB0aGUgcmVhbCB0aXRsZSBpZiB3ZSBoYXZlIHRoZSB4cmVmIHZhbHVlcy4KKyAgICAgICAgICBcZGVmXHByaW50ZWRyZWZuYW1le1xyZWZ4eyMxLXRpdGxlfXt9fSUKKyAgICAgICAgXGVsc2UKKyAgICAgICAgICAlIE90aGVyd2lzZSBqdXN0IGNvcHkgdGhlIEluZm8gbm9kZSBuYW1lLgorICAgICAgICAgIFxkZWZccHJpbnRlZHJlZm5hbWV7XGlnbm9yZXNwYWNlcyAjMX0lCisgICAgICAgIFxmaSUKKyAgICAgIFxmaQorICAgIFxmaQorICBcZmkKKyAgJQorICAlIE1ha2UgbGluayBpbiBwZGYgb3V0cHV0LgorICBcaWZwZGYKKyAgICBcbGVhdmV2bW9kZQorICAgIFxnZXRmaWxlbmFtZXsjNH0lCisgICAge1x0dXJub2ZmYWN0aXZlIFxvdGhlcmJhY2tzbGFzaAorICAgICBcaWZudW1cZmlsZW5hbWVsZW5ndGg+MAorICAgICAgIFxzdGFydGxpbmsgYXR0cnsvQm9yZGVyIFswIDAgMF19JQorICAgICAgICAgZ290byBmaWxle1x0aGVcZmlsZW5hbWUucGRmfSBuYW1leyMxfSUKKyAgICAgXGVsc2UKKyAgICAgICBcc3RhcnRsaW5rIGF0dHJ7L0JvcmRlciBbMCAwIDBdfSUKKyAgICAgICAgIGdvdG8gbmFtZXtccGRmbWtwZ257IzF9fSUKKyAgICAgXGZpCisgICAgfSUKKyAgICBcbGlua2NvbG9yCisgIFxmaQorICAlCisgICUgRmxvYXQgcmVmZXJlbmNlcyBhcmUgcHJpbnRlZCBjb21wbGV0ZWx5IGRpZmZlcmVudGx5OiAiRmlndXJlIDEuMiIKKyAgJSBpbnN0ZWFkIG9mICJbc29tZW5vZGVdLCBwLjMiLiAgV2UgZGlzdGluZ3Vpc2ggdGhlbSBieSB0aGUKKyAgJSBMQUJFTC10aXRsZSBiZWluZyBzZXQgdG8gYSBtYWdpYyBzdHJpbmcuCisgIHslCisgICAgJSBIYXZlIHRvIG90aGVyaWZ5IGV2ZXJ5dGhpbmcgc3BlY2lhbCB0byBhbGxvdyB0aGUgXGNzbmFtZSB0bworICAgICUgaW5jbHVkZSBhbiBfIGluIHRoZSB4cmVmIG5hbWUsIGV0Yy4KKyAgICBcaW5kZXhub2ZvbnRzCisgICAgXHR1cm5vZmZhY3RpdmUKKyAgICBcb3RoZXJiYWNrc2xhc2gKKyAgICBcZXhwYW5kYWZ0ZXJcZ2xvYmFsXGV4cGFuZGFmdGVyXGxldFxleHBhbmRhZnRlclxYdGhpc3JlZnRpdGxlCisgICAgICBcY3NuYW1lIFhSIzEtdGl0bGVcZW5kY3NuYW1lCisgIH0lCisgIFxpZmZsb2F0XFh0aGlzcmVmdGl0bGUKKyAgICAlIElmIHRoZSB1c2VyIHNwZWNpZmllZCB0aGUgcHJpbnQgbmFtZSAodGhpcmQgYXJnKSB0byB0aGUgcmVmLAorICAgICUgcHJpbnQgaXQgaW5zdGVhZCBvZiBvdXIgdXN1YWwgIkZpZ3VyZSAxLjIiLgorICAgIFxpZmRpbVx3ZDAgPSAwcHQKKyAgICAgIFxyZWZ4eyMxLXNudH0lCisgICAgXGVsc2UKKyAgICAgIFxwcmludGVkcmVmbmFtZQorICAgIFxmaQorICAgICUKKyAgICAlIGlmIHRoZSB1c2VyIGFsc28gZ2F2ZSB0aGUgcHJpbnRlZCBtYW51YWwgbmFtZSAoZmlmdGggYXJnKSwgYXBwZW5kCisgICAgJSAiaW4gTUFOVUFMTkFNRSIuCisgICAgXGlmZGltIFx3ZDEgPiAwcHQKKyAgICAgIFxzcGFjZSBccHV0d29yZGlue30gXGNpdGV7XHByaW50ZWRtYW51YWx9JQorICAgIFxmaQorICBcZWxzZQorICAgICUgbm9kZS9hbmNob3IgKG5vbi1mbG9hdCkgcmVmZXJlbmNlcy4KKyAgICAlCisgICAgJSBJZiB3ZSB1c2UgXHVuaGJveDAgYW5kIFx1bmhib3gxIHRvIHByaW50IHRoZSBub2RlIG5hbWVzLCBUZVggZG9lcyBub3QKKyAgICAlIGluc2VydCBlbXB0eSBkaXNjcmV0aW9uYXJpZXMgYWZ0ZXIgaHlwaGVucywgd2hpY2ggbWVhbnMgdGhhdCBpdCB3aWxsCisgICAgJSBub3QgZmluZCBhIGxpbmUgYnJlYWsgYXQgYSBoeXBoZW4gaW4gYSBub2RlIG5hbWVzLiAgU2luY2Ugc29tZSBtYW51YWxzCisgICAgJSBhcmUgYmVzdCB3cml0dGVuIHdpdGggZmFpcmx5IGxvbmcgbm9kZSBuYW1lcywgY29udGFpbmluZyBoeXBoZW5zLCB0aGlzCisgICAgJSBpcyBhIGxvc3MuICBUaGVyZWZvcmUsIHdlIGdpdmUgdGhlIHRleHQgb2YgdGhlIG5vZGUgbmFtZSBhZ2Fpbiwgc28gaXQKKyAgICAlIGlzIGFzIGlmIFRlWCBpcyBzZWVpbmcgaXQgZm9yIHRoZSBmaXJzdCB0aW1lLgorICAgIFxpZmRpbSBcd2QxID4gMHB0CisgICAgICBccHV0d29yZHNlY3Rpb257fSBgYFxwcmludGVkcmVmbmFtZScnIFxwdXR3b3JkaW57fSBcY2l0ZXtccHJpbnRlZG1hbnVhbH0lCisgICAgXGVsc2UKKyAgICAgICUgXyAoZm9yIGV4YW1wbGUpIGhhcyB0byBiZSB0aGUgY2hhcmFjdGVyIF8gZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGUKKyAgICAgICUgY29udHJvbCBzZXF1ZW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBub2RlLCBidXQgaXQgaGFzIHRvIGV4cGFuZAorICAgICAgJSBpbnRvIHRoZSB1c3VhbCBcbGVhdmV2bW9kZS4uLlx2cnVsZSBzdHVmZiBmb3IgcHVycG9zZXMgb2YKKyAgICAgICUgcHJpbnRpbmcuIFNvIHdlIFx0dXJub2ZmYWN0aXZlIGZvciB0aGUgXHJlZngtc250LCBiYWNrIG9uIGZvciB0aGUKKyAgICAgICUgcHJpbnRpbmcsIGJhY2sgb2ZmIGZvciB0aGUgXHJlZngtcGcuCisgICAgICB7XHR1cm5vZmZhY3RpdmUgXG90aGVyYmFja3NsYXNoCisgICAgICAgJSBPbmx5IG91dHB1dCBhIGZvbGxvd2luZyBzcGFjZSBpZiB0aGUgLXNudCByZWYgaXMgbm9uZW1wdHk7IGZvcgorICAgICAgICUgQHVubnVtYmVyZWQgYW5kIEBhbmNob3IsIGl0IHdvbid0IGJlLgorICAgICAgIFxzZXRib3gyID0gXGhib3h7XGlnbm9yZXNwYWNlcyBccmVmeHsjMS1zbnR9e319JQorICAgICAgIFxpZmRpbSBcd2QyID4gMHB0IFxyZWZ4eyMxLXNudH1cc3BhY2VcZmkKKyAgICAgIH0lCisgICAgICAlIG91dHB1dCB0aGUgYFtteW5vZGVdJyB2aWEgYSBtYWNybyBzbyBpdCBjYW4gYmUgb3ZlcnJpZGRlbi4KKyAgICAgIFx4cmVmcHJpbnRub2RlbmFtZVxwcmludGVkcmVmbmFtZQorICAgICAgJQorICAgICAgJSBCdXQgd2UgYWx3YXlzIHdhbnQgYSBjb21tYSBhbmQgYSBzcGFjZToKKyAgICAgICxcc3BhY2UKKyAgICAgICUKKyAgICAgICUgb3V0cHV0IHRoZSBgcGFnZSAzJy4KKyAgICAgIFx0dXJub2ZmYWN0aXZlIFxvdGhlcmJhY2tzbGFzaCBccHV0d29yZHBhZ2VcdGllXHJlZnh7IzEtcGd9e30lCisgICAgXGZpCisgIFxmaQorICBcZW5kbGluaworXGVuZGdyb3VwfQorCislIFRoaXMgbWFjcm8gaXMgY2FsbGVkIGZyb20gXHhyZWZYIGZvciB0aGUgYFtub2RlbmFtZV0nIHBhcnQgb2YgeHJlZgorJSBvdXRwdXQuICBJdCdzIGEgc2VwYXJhdGUgbWFjcm8gb25seSBzbyBpdCBjYW4gYmUgY2hhbmdlZCBtb3JlIGVhc2lseSwKKyUgc2luY2Ugc3F1YXJlIGJyYWNrZXRzIGRvbid0IHdvcmsgd2VsbCBpbiBzb21lIGRvY3VtZW50cy4gIFBhcnRpY3VsYXJseQorJSBvbmUgdGhhdCBCb2IgaXMgd29ya2luZyBvbiA6KS4KKyUKK1xkZWZceHJlZnByaW50bm9kZW5hbWUjMXtbIzFdfQorCislIFRoaW5ncyByZWZlcnJlZCB0byBieSBcc2V0cmVmLgorJQorXGRlZlxZbm90aGluZ3t9CitcZGVmXFlvbWl0ZnJvbXRvY3t9CitcZGVmXFludW1iZXJlZHslCisgIFxpZm51bVxzZWNubz0wCisgICAgXHB1dHdvcmRDaGFwdGVyQHRpZSBcdGhlXGNoYXBubworICBcZWxzZSBcaWZudW1cc3Vic2Vjbm89MAorICAgIFxwdXR3b3JkU2VjdGlvbkB0aWUgXHRoZVxjaGFwbm8uXHRoZVxzZWNubworICBcZWxzZSBcaWZudW1cc3Vic3Vic2Vjbm89MAorICAgIFxwdXR3b3JkU2VjdGlvbkB0aWUgXHRoZVxjaGFwbm8uXHRoZVxzZWNuby5cdGhlXHN1YnNlY25vCisgIFxlbHNlCisgICAgXHB1dHdvcmRTZWN0aW9uQHRpZSBcdGhlXGNoYXBuby5cdGhlXHNlY25vLlx0aGVcc3Vic2Vjbm8uXHRoZVxzdWJzdWJzZWNubworICBcZmlcZmlcZmkKK30KK1xkZWZcWWFwcGVuZGl4eyUKKyAgXGlmbnVtXHNlY25vPTAKKyAgICAgXHB1dHdvcmRBcHBlbmRpeEB0aWUgQGNoYXJcdGhlXGFwcGVuZGl4bm97fSUKKyAgXGVsc2UgXGlmbnVtXHN1YnNlY25vPTAKKyAgICAgXHB1dHdvcmRTZWN0aW9uQHRpZSBAY2hhclx0aGVcYXBwZW5kaXhuby5cdGhlXHNlY25vCisgIFxlbHNlIFxpZm51bVxzdWJzdWJzZWNubz0wCisgICAgXHB1dHdvcmRTZWN0aW9uQHRpZSBAY2hhclx0aGVcYXBwZW5kaXhuby5cdGhlXHNlY25vLlx0aGVcc3Vic2Vjbm8KKyAgXGVsc2UKKyAgICBccHV0d29yZFNlY3Rpb25AdGllCisgICAgICBAY2hhclx0aGVcYXBwZW5kaXhuby5cdGhlXHNlY25vLlx0aGVcc3Vic2Vjbm8uXHRoZVxzdWJzdWJzZWNubworICBcZmlcZmlcZmkKK30KKworJSBEZWZpbmUgXHJlZnh7TkFNRX17U1VGRklYfSB0byByZWZlcmVuY2UgYSBjcm9zcy1yZWZlcmVuY2Ugc3RyaW5nIG5hbWVkIE5BTUUuCislIElmIGl0cyB2YWx1ZSBpcyBub25lbXB0eSwgU1VGRklYIGlzIG91dHB1dCBhZnRlcndhcmQuCislCitcZGVmXHJlZngjMSMyeyUKKyAgeyUKKyAgICBcaW5kZXhub2ZvbnRzCisgICAgXG90aGVyYmFja3NsYXNoCisgICAgXGV4cGFuZGFmdGVyXGdsb2JhbFxleHBhbmRhZnRlclxsZXRcZXhwYW5kYWZ0ZXJcdGhpc3JlZlgKKyAgICAgIFxjc25hbWUgWFIjMVxlbmRjc25hbWUKKyAgfSUKKyAgXGlmeFx0aGlzcmVmWFxyZWxheAorICAgICUgSWYgbm90IGRlZmluZWQsIHNheSBzb21ldGhpbmcgYXQgbGVhc3QuCisgICAgXGFuZ2xlbGVmdCB1blwtZGVcLWZpbmVkXGFuZ2xlcmlnaHQKKyAgICBcaWZsaW5rcworICAgICAgXGlmaGF2ZXhyZWZzCisgICAgICAgIFxtZXNzYWdle1xsaW5lbnVtYmVyIFVuZGVmaW5lZCBjcm9zcyByZWZlcmVuY2UgYCMxJy59JQorICAgICAgXGVsc2UKKyAgICAgICAgXGlmd2FybmVkeHJlZnNcZWxzZQorICAgICAgICAgIFxnbG9iYWxcd2FybmVkeHJlZnN0cnVlCisgICAgICAgICAgXG1lc3NhZ2V7Q3Jvc3MgcmVmZXJlbmNlIHZhbHVlcyB1bmtub3duOyB5b3UgbXVzdCBydW4gVGVYIGFnYWluLn0lCisgICAgICAgIFxmaQorICAgICAgXGZpCisgICAgXGZpCisgIFxlbHNlCisgICAgJSBJdCdzIGRlZmluZWQsIHNvIGp1c3QgdXNlIGl0LgorICAgIFx0aGlzcmVmWAorICBcZmkKKyAgIzIlIE91dHB1dCB0aGUgc3VmZml4IGluIGFueSBjYXNlLgorfQorCislIFRoaXMgaXMgdGhlIG1hY3JvIGludm9rZWQgYnkgZW50cmllcyBpbiB0aGUgYXV4IGZpbGUuICBVc3VhbGx5IGl0J3MKKyUganVzdCBhIFxkZWYgKHdlIHByZXBlbmQgWFIgdG8gdGhlIGNvbnRyb2wgc2VxdWVuY2UgbmFtZSB0byBhdm9pZAorJSBjb2xsaXNpb25zKS4gIEJ1dCBpZiB0aGlzIGlzIGEgZmxvYXQgdHlwZSwgd2UgaGF2ZSBtb3JlIHdvcmsgdG8gZG8uCislCitcZGVmXHhyZGVmIzEjMnslCisgIFxleHBhbmRhZnRlclxnZGVmXGNzbmFtZSBYUiMxXGVuZGNzbmFtZXsjMn0lIHJlbWVtYmVyIHRoaXMgeHJlZiB2YWx1ZS4KKyAgJQorICAlIFdhcyB0aGF0IHhyZWYgY29udHJvbCBzZXF1ZW5jZSB0aGF0IHdlIGp1c3QgZGVmaW5lZCBmb3IgYSBmbG9hdD8KKyAgXGV4cGFuZGFmdGVyXGlmZmxvYXRcY3NuYW1lIFhSIzFcZW5kY3NuYW1lCisgICAgJSBpdCB3YXMgYSBmbG9hdCwgYW5kIHdlIGhhdmUgdGhlIChzYWZlKSBmbG9hdCB0eXBlIGluIFxpZmZsb2F0dHlwZS4KKyAgICBcZXhwYW5kYWZ0ZXJcbGV0XGV4cGFuZGFmdGVyXGZsb2F0bGlzdAorICAgICAgXGNzbmFtZSBmbG9hdGxpc3RcaWZmbG9hdHR5cGVcZW5kY3NuYW1lCisgICAgJQorICAgICUgSXMgdGhpcyB0aGUgZmlyc3QgdGltZSB3ZSd2ZSBzZWVuIHRoaXMgZmxvYXQgdHlwZT8KKyAgICBcZXhwYW5kYWZ0ZXJcaWZ4XGZsb2F0bGlzdFxyZWxheAorICAgICAgXHRva3MwID0ge1xkb30lIHllcywgc28ganVzdCBcZG8KKyAgICBcZWxzZQorICAgICAgJSBoYWQgaXQgYmVmb3JlLCBzbyBwcmVzZXJ2ZSBwcmV2aW91cyBlbGVtZW50cyBpbiBsaXN0LgorICAgICAgXHRva3MwID0gXGV4cGFuZGFmdGVye1xmbG9hdGxpc3RcZG99JQorICAgIFxmaQorICAgICUKKyAgICAlIFJlbWVtYmVyIHRoaXMgeHJlZiBpbiB0aGUgY29udHJvbCBzZXF1ZW5jZSBcZmxvYXRsaXN0RkxPQVRUWVBFLAorICAgICUgZm9yIGxhdGVyIHVzZSBpbiBcbGlzdG9mZmxvYXRzLgorICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZSBmbG9hdGxpc3RcaWZmbG9hdHR5cGVcZW5kY3NuYW1le1x0aGVcdG9rczB7IzF9fSUKKyAgXGZpCit9CisKKyUgUmVhZCB0aGUgbGFzdCBleGlzdGluZyBhdXggZmlsZSwgaWYgYW55LiAgTm8gZXJyb3IgaWYgbm9uZSBleGlzdHMuCislCitcZGVmXHRyeWF1eGZpbGV7JQorICBcb3BlbmluIDEgXGpvYm5hbWUuYXV4CisgIFxpZmVvZiAxIFxlbHNlCisgICAgXHJlYWRhdXhmaWxlCisgICAgXGdsb2JhbFxoYXZleHJlZnN0cnVlCisgIFxmaQorICBcY2xvc2VpbiAxCit9CisKK1xkZWZccmVhZGF1eGZpbGV7XGJlZ2luZ3JvdXAKKyAgXGNhdGNvZGVgXF5eQD1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eQT1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eQj1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eQz1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eRD1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eRT1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eRj1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eRz1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eSD1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eSz1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eTD1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eTj1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eUD1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eUT1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eUj1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eUz1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eVD1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eVT1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eVj1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eVz1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eWD1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eWj1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eWz1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eXD1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eXT1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eXj1cb3RoZXIKKyAgXGNhdGNvZGVgXF5eXz1cb3RoZXIKKyAgJSBJdCB3YXMgc3VnZ2VzdGVkIHRvIHNldCB0aGUgY2F0Y29kZSBvZiBeIHRvIDcsIHdoaWNoIHdvdWxkIGFsbG93IF5eZTQgZXRjLgorICAlIGluIHhyZWYgdGFncywgaS5lLiwgbm9kZSBuYW1lcy4gIEJ1dCBzaW5jZSBeXmU0IG5vdGF0aW9uIGlzbid0CisgICUgc3VwcG9ydGVkIGluIHRoZSBtYWluIHRleHQsIGl0IGRvZXNuJ3Qgc2VlbSBkZXNpcmFibGUuICBGdXJ0aGVybW9yZSwKKyAgJSB0aGF0IGlzIG5vdCBlbm91Z2g6IGZvciBub2RlIG5hbWVzIHRoYXQgYWN0dWFsbHkgY29udGFpbiBhIF4KKyAgJSBjaGFyYWN0ZXIsIHdlIHdvdWxkIGVuZCB1cCB3cml0aW5nIGEgbGluZSBsaWtlIHRoaXM6ICd4cmRlZiB7J2hhdAorICAlIGItdGl0bGV9eydoYXQgYn0gYW5kIFx4cmRlZiBkb2VzIGEgXGNzbmFtZS4uLlxlbmRjc25hbWUgb24gdGhlIGZpcnN0CisgICUgYXJndW1lbnQsIGFuZCBcaGF0IGlzIG5vdCBhbiBleHBhbmRhYmxlIGNvbnRyb2wgc2VxdWVuY2UuICBJdCBjb3VsZAorICAlIGFsbCBiZSB3b3JrZWQgb3V0LCBidXQgd2h5PyAgRWl0aGVyIHdlIHN1cHBvcnQgXl4gb3Igd2UgZG9uJ3QuCisgICUKKyAgJSBUaGUgb3RoZXIgY2hhbmdlIG5lY2Vzc2FyeSBmb3IgdGhpcyB3YXMgdG8gZGVmaW5lIFxhdXhoYXQ6CisgICUgXGRlZlxhdXhoYXR7XGRlZl57J2hhdCB9fSUgZXh0cmEgc3BhY2Ugc28gb2sgaWYgZm9sbG93ZWQgYnkgbGV0dGVyCisgICUgYW5kIHRoZW4gdG8gY2FsbCBcYXV4aGF0IGluIFxzZXRxLgorICAlCisgIFxjYXRjb2RlYFxePVxvdGhlcgorICAlCisgICUgU3BlY2lhbCBjaGFyYWN0ZXJzLiAgU2hvdWxkIGJlIHR1cm5lZCBvZmYgYW55d2F5LCBidXQuLi4KKyAgXGNhdGNvZGVgXH49XG90aGVyCisgIFxjYXRjb2RlYFxbPVxvdGhlcgorICBcY2F0Y29kZWBcXT1cb3RoZXIKKyAgXGNhdGNvZGVgXCI9XG90aGVyCisgIFxjYXRjb2RlYFxfPVxvdGhlcgorICBcY2F0Y29kZWBcfD1cb3RoZXIKKyAgXGNhdGNvZGVgXDw9XG90aGVyCisgIFxjYXRjb2RlYFw+PVxvdGhlcgorICBcY2F0Y29kZWBcJD1cb3RoZXIKKyAgXGNhdGNvZGVgXCM9XG90aGVyCisgIFxjYXRjb2RlYFwmPVxvdGhlcgorICBcY2F0Y29kZWBcJT1cb3RoZXIKKyAgXGNhdGNvZGVgKz1cb3RoZXIgJSBhdm9pZCBcKyBmb3IgcGFyYW5vaWEgZXZlbiB0aG91Z2ggd2UndmUgdHVybmVkIGl0IG9mZgorICAlCisgICUgVGhpcyBpcyB0byBzdXBwb3J0IFwgaW4gbm9kZSBuYW1lcyBhbmQgdGl0bGVzLCBzaW5jZSB0aGUgXAorICAlIGNoYXJhY3RlcnMgZW5kIHVwIGluIGEgXGNzbmFtZS4gIEl0J3MgZWFzaWVyIHRoYW4KKyAgJSBsZWF2aW5nIGl0IGFjdGl2ZSBhbmQgbWFraW5nIGl0cyBhY3RpdmUgZGVmaW5pdGlvbiBhbiBhY3R1YWwgXAorICAlIGNoYXJhY3Rlci4gIFdoYXQgSSBkb24ndCB1bmRlcnN0YW5kIGlzIHdoeSBpdCB3b3JrcyBpbiB0aGUgKnZhbHVlKgorICAlIG9mIHRoZSB4cmRlZi4gIFNlZW1zIGxpa2UgaXQgc2hvdWxkIGJlIGEgY2F0Y29kZTEyIFwsIGFuZCB0aGF0CisgICUgc2hvdWxkIG5vdCB0eXBlc2V0IHByb3Blcmx5LiAgQnV0IGl0IHdvcmtzLCBzbyBJJ20gbW92aW5nIG9uIGZvcgorICAlIG5vdy4gIC0ta2FybCwgMTVqYW4wNC4KKyAgXGNhdGNvZGVgXFw9XG90aGVyCisgICUKKyAgJSBNYWtlIHRoZSBjaGFyYWN0ZXJzIDEyOC0yNTUgYmUgcHJpbnRpbmcgY2hhcmFjdGVycy4KKyAgeyUKKyAgICBcY291bnQgMT0xMjgKKyAgICBcZGVmXGxvb3B7JQorICAgICAgXGNhdGNvZGVcY291bnQgMT1cb3RoZXIKKyAgICAgIFxhZHZhbmNlXGNvdW50IDEgYnkgMQorICAgICAgXGlmbnVtIFxjb3VudCAxPDI1NiBcbG9vcCBcZmkKKyAgICB9JQorICB9JQorICAlCisgICUgQCBpcyBvdXIgZXNjYXBlIGNoYXJhY3RlciBpbiAuYXV4IGZpbGVzLCBhbmQgd2UgbmVlZCBicmFjZXMuCisgIFxjYXRjb2RlYFx7PTEKKyAgXGNhdGNvZGVgXH09MgorICBcY2F0Y29kZWBcQD0wCisgICUKKyAgXGlucHV0IFxqb2JuYW1lLmF1eAorXGVuZGdyb3VwfQorCisKK1xtZXNzYWdle2luc2VydGlvbnMsfQorJSBpbmNsdWRpbmcgZm9vdG5vdGVzLgorCitcbmV3Y291bnQgXGZvb3Rub3Rlbm8KKworJSBUaGUgdHJhaWxpbmcgc3BhY2UgaW4gdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uIGZvciBzdXBlcmVqZWN0IGlzCislIHZpdGFsIGZvciBwcm9wZXIgZmlsbGluZzsgcGFnZXMgY29tZSBvdXQgdW5hbGlnbmVkIHdoZW4geW91IGRvIGEKKyUgcGFnZWFsaWdubWFjcm8gY2FsbCBpZiB0aGF0IHNwYWNlIGJlZm9yZSB0aGUgY2xvc2luZyBicmFjZSBpcworJSByZW1vdmVkLiAoR2VuZXJhbGx5LCBudW1lcmljIGNvbnN0YW50cyBzaG91bGQgYWx3YXlzIGJlIGZvbGxvd2VkIGJ5IGEKKyUgc3BhY2UgdG8gcHJldmVudCBzdHJhbmdlIGV4cGFuc2lvbiBlcnJvcnMuKQorXGRlZlxzdXBlcmVqZWN0e1xwYXJccGVuYWx0eSAtMjAwMDBcZm9vdG5vdGVubyA9MCB9CisKKyUgQGZvb3Rub3Rlc3R5bGUgaXMgbWVhbmluZ2Z1bCBmb3IgaW5mbyBvdXRwdXQgb25seS4KK1xsZXRcZm9vdG5vdGVzdHlsZT1cY29tbWVudAorCit7XGNhdGNvZGUgYFxAPTExCislCislIEF1dG8tbnVtYmVyIGZvb3Rub3Rlcy4gIE90aGVyd2lzZSBsaWtlIHBsYWluLgorXGdkZWZcZm9vdG5vdGV7JQorICBcbGV0XGluZGVudD1ccHRleGluZGVudAorICBcbGV0XG5vaW5kZW50PVxwdGV4bm9pbmRlbnQKKyAgXGdsb2JhbFxhZHZhbmNlXGZvb3Rub3Rlbm8gYnkgXEBuZQorICBcZWRlZlx0aGlzZm9vdG5veyRee1x0aGVcZm9vdG5vdGVub30kfSUKKyAgJQorICAlIEluIGNhc2UgdGhlIGZvb3Rub3RlIGNvbWVzIGF0IHRoZSBlbmQgb2YgYSBzZW50ZW5jZSwgcHJlc2VydmUgdGhlCisgICUgZXh0cmEgc3BhY2luZyBhZnRlciB3ZSBkbyB0aGUgZm9vdG5vdGUgbnVtYmVyLgorICBcbGV0XEBzZlxlbXB0eQorICBcaWZobW9kZVxlZGVmXEBzZntcc3BhY2VmYWN0b3JcdGhlXHNwYWNlZmFjdG9yfVxwdGV4c2xhc2hcZmkKKyAgJQorICAlIFJlbW92ZSBpbmFkdmVydGVudCBibGFuayBzcGFjZSBiZWZvcmUgdHlwZXNldHRpbmcgdGhlIGZvb3Rub3RlIG51bWJlci4KKyAgXHVuc2tpcAorICBcdGhpc2Zvb3Rub1xAc2YKKyAgXGRvZm9vdG5vdGUKK30lCisKKyUgRG9uJ3QgYm90aGVyIHdpdGggdGhlIHRyaWNrZXJ5IGluIHBsYWluLnRleCB0byBub3QgcmVxdWlyZSB0aGUKKyUgZm9vdG5vdGUgdGV4dCBhcyBhIHBhcmFtZXRlci4gIE91ciBmb290bm90ZXMgZG9uJ3QgbmVlZCB0byBiZSBzbyBnZW5lcmFsLgorJQorJSBPaCB5ZXMsIHRoZXkgZG87IG90aGVyd2lzZSwgQGlmc2V0IChhbmQgYW55dGhpbmcgZWxzZSB0aGF0IHVzZXMKKyUgXHBhcnNlYXJnbGluZSkgZmFpbHMgaW5zaWRlIGZvb3Rub3RlcyBiZWNhdXNlIHRoZSB0b2tlbnMgYXJlIGZpeGVkIHdoZW4KKyUgdGhlIGZvb3Rub3RlIGlzIHJlYWQuICAtLWthcmwsIDE2bm92OTYuCislCitcZ2RlZlxkb2Zvb3Rub3RleyUKKyAgXGluc2VydFxmb290aW5zXGJncm91cAorICAlIFdlIHdhbnQgdG8gdHlwZXNldCB0aGlzIHRleHQgYXMgYSBub3JtYWwgcGFyYWdyYXBoLCBldmVuIGlmIHRoZQorICAlIGZvb3Rub3RlIHJlZmVyZW5jZSBvY2N1cnMgaW4gKGZvciBleGFtcGxlKSBhIGRpc3BsYXkgZW52aXJvbm1lbnQuCisgICUgU28gcmVzZXQgc29tZSBwYXJhbWV0ZXJzLgorICBcaHNpemU9XHBhZ2V3aWR0aAorICBcaW50ZXJsaW5lcGVuYWx0eVxpbnRlcmZvb3Rub3RlbGluZXBlbmFsdHkKKyAgXHNwbGl0dG9wc2tpcFxodFxzdHJ1dGJveCAlIHRvcCBiYXNlbGluZSBmb3IgYnJva2VuIGZvb3Rub3RlcworICBcc3BsaXRtYXhkZXB0aFxkcFxzdHJ1dGJveAorICBcZmxvYXRpbmdwZW5hbHR5XEBNTQorICBcbGVmdHNraXBcekBza2lwCisgIFxyaWdodHNraXBcekBza2lwCisgIFxzcGFjZXNraXBcekBza2lwCisgIFx4c3BhY2Vza2lwXHpAc2tpcAorICBccGFyaW5kZW50XGRlZmF1bHRwYXJpbmRlbnQKKyAgJQorICBcc21hbGxmb250cyBccm0KKyAgJQorICAlIEJlY2F1c2Ugd2UgdXNlIGhhbmdpbmcgaW5kZW50YXRpb24gaW4gZm9vdG5vdGVzLCBhIEBub2luZGVudCBhcHBlYXJzCisgICUgdG8gZXhkZW50IHRoaXMgdGV4dCwgc28gbWFrZSBpdCBiZSBhIG5vLW9wLiAgbWFrZWluZm8gZG9lcyBub3QgdXNlCisgICUgaGFuZ2luZyBpbmRlbnRhdGlvbiBzbyBAbm9pbmRlbnQgY2FuIHN0aWxsIGJlIG5lZWRlZCB3aXRoaW4gZm9vdG5vdGUKKyAgJSB0ZXh0IGFmdGVyIGFuIEBleGFtcGxlIG9yIHRoZSBsaWtlIChub3QgdGhhdCB0aGlzIGlzIGdvb2Qgc3R5bGUpLgorICBcbGV0XG5vaW5kZW50ID0gXHJlbGF4CisgICUKKyAgJSBIYW5nIHRoZSBmb290bm90ZSB0ZXh0IG9mZiB0aGUgbnVtYmVyLiAgVXNlIFxldmVyeXBhciBpbiBjYXNlIHRoZQorICAlIGZvb3Rub3RlIGV4dGVuZHMgZm9yIG1vcmUgdGhhbiBvbmUgcGFyYWdyYXBoLgorICBcZXZlcnlwYXIgPSB7XGhhbmd9JQorICBcdGV4dGluZGVudHtcdGhpc2Zvb3Rub30lCisgICUKKyAgJSBEb24ndCBjcmFzaCBpbnRvIHRoZSBsaW5lIGFib3ZlIHRoZSBmb290bm90ZSB0ZXh0LiAgU2luY2UgdGhpcworICAlIGV4cGFuZHMgaW50byBhIGJveCwgaXQgbXVzdCBjb21lIHdpdGhpbiB0aGUgcGFyYWdyYXBoLCBsZXN0IGl0CisgICUgcHJvdmlkZSBhIHBsYWNlIHdoZXJlIFRlWCBjYW4gc3BsaXQgdGhlIGZvb3Rub3RlLgorICBcZm9vdHN0cnV0CisgIFxmdXR1cmVsZXRcbmV4dFxmb0B0Cit9Cit9JWVuZCBcY2F0Y29kZSBgXEA9MTEKKworJSBJbiBjYXNlIGEgQGZvb3Rub3RlIGFwcGVhcnMgaW4gYSB2Ym94LCBzYXZlIHRoZSBmb290bm90ZSB0ZXh0IGFuZCBjcmVhdGUKKyUgdGhlIHJlYWwgXGluc2VydCBqdXN0IGFmdGVyIHRoZSB2Ym94IGZpbmlzaGVkLiAgT3RoZXJ3aXNlLCB0aGUgaW5zZXJ0aW9uCislIHdvdWxkIGJlIGxvc3QuCislIFNpbWlsYXJpbHksIGlmIGEgQGZvb3Rub3RlIGFwcGVhcnMgaW5zaWRlIGFuIGFsaWdubWVudCwgc2F2ZSB0aGUgZm9vdG5vdGUKKyUgdGV4dCB0byBhIGJveCBhbmQgbWFrZSB0aGUgXGluc2VydCB3aGVuIGEgcm93IG9mIHRoZSB0YWJsZSBpcyBmaW5pc2hlZC4KKyUgQW5kIHRoZSBzYW1lIGNhbiBiZSBkb25lIGZvciBvdGhlciBpbnNlcnQgY2xhc3Nlcy4gIC0ta2FzYWwsIDE2bm92MDMuCisKKyUgUmVwbGFjZSB0aGUgXGluc2VydCBwcmltaXRpdmUgYnkgYSBjaGVhdGluZyBtYWNyby4KKyUgRGVlcGVyIGluc2lkZSwganVzdCBtYWtlIHN1cmUgdGhhdCB0aGUgc2F2ZWQgaW5zZXJ0aW9ucyBhcmUgbm90IHNwaWxsZWQKKyUgb3V0IHByZW1hdHVyZWx5LgorJQorXGRlZlxzdGFydHNhdmluZ2luc2VydHN7JQorICBcaWZ4IFxpbnNlcnRccHRleGluc2VydAorICAgIFxsZXRcaW5zZXJ0XHNhdmVpbnNlcnQKKyAgXGVsc2UKKyAgICBcbGV0XGNoZWNraW5zZXJ0c1xyZWxheAorICBcZmkKK30KKworJSBUaGlzIFxpbnNlcnQgcmVwbGFjZW1lbnQgd29ya3MgZm9yIGJvdGggXGluc2VydFxmb290aW5ze2Zvb30gYW5kCislIFxpbnNlcnRcZm9vdGluc1xiZ3JvdXAgZm9vXGVncm91cCwgYnV0IGl0IGRvZXNuJ3Qgd29yayBmb3IgXGluc2VydDI3e2Zvb30uCislCitcZGVmXHNhdmVpbnNlcnQjMXslCisgIFxlZGVmXG5leHR7XG5vZXhwYW5kXHNhdmV0b2JveCBcbWFrZVNBVkVuYW1lIzF9JQorICBcYWZ0ZXJhc3NpZ25tZW50XG5leHQKKyAgJSBzd2FsbG93IHRoZSBsZWZ0IGJyYWNlCisgIFxsZXRcdGVtcCA9Cit9CitcZGVmXG1ha2VTQVZFbmFtZSMxe1xtYWtlY3NuYW1le1NBVkVcZXhwYW5kYWZ0ZXJcZ29iYmxlXHN0cmluZyMxfX0KK1xkZWZcc2F2ZXRvYm94IzF7XGdsb2JhbFxzZXRib3gjMSA9IFx2Ym94XGJncm91cCBcdW52Ym94IzF9CisKK1xkZWZcY2hlY2tzYXZlaW5zIzF7XGlmdm9pZCMxXGVsc2UgXHBsYWNlc2F2ZWlucyMxXGZpfQorCitcZGVmXHBsYWNlc2F2ZWlucyMxeyUKKyAgXHB0ZXhpbnNlcnQgXGNzbmFtZVxleHBhbmRhZnRlclxnb2JibGVzYXZlXHN0cmluZyMxXGVuZGNzbmFtZQorICAgIHtcYm94IzF9JQorfQorCislIGVhdCBAU0FWRSAtLSBiZXdhcmUsIGFsbCBvZiB0aGVtIGhhdmUgY2F0Y29kZSBcb3RoZXI6Cit7CisgIFxkZWZcZG9zcGVjaWFsc3tcZG8gU1xkbyBBXGRvIFZcZG8gRX0gXHVuY2F0Y29kZXNwZWNpYWxzICAlICA7LSkKKyAgXGdkZWZcZ29iYmxlc2F2ZSBAU0FWRXt9Cit9CisKKyUgaW5pdGlhbGl6YXRpb246CitcZGVmXG5ld3NhdmVpbnMgIzF7JQorICBcZWRlZlxuZXh0e1xub2V4cGFuZFxuZXdzYXZlaW5zWCBcbWFrZVNBVkVuYW1lIzF9JQorICBcbmV4dAorfQorXGRlZlxuZXdzYXZlaW5zWCAjMXslCisgIFxjc25hbWUgbmV3Ym94XGVuZGNzbmFtZSAjMSUKKyAgXGV4cGFuZGFmdGVyXGRlZlxleHBhbmRhZnRlclxjaGVja2luc2VydHNcZXhwYW5kYWZ0ZXJ7XGNoZWNraW5zZXJ0cworICAgIFxjaGVja3NhdmVpbnMgIzF9JQorfQorCislIGluaXRpYWxpemU6CitcbGV0XGNoZWNraW5zZXJ0c1xlbXB0eQorXG5ld3NhdmVpbnNcZm9vdGlucworXG5ld3NhdmVpbnNcbWFyZ2luCisKKworJSBAaW1hZ2UuICBXZSB1c2UgdGhlIG1hY3JvcyBmcm9tIGVwc2YudGV4IHRvIHN1cHBvcnQgdGhpcy4KKyUgSWYgZXBzZi50ZXggaXMgbm90IGluc3RhbGxlZCBhbmQgQGltYWdlIGlzIHVzZWQsIHdlIGNvbXBsYWluLgorJQorJSBDaGVjayBmb3IgYW5kIHJlYWQgZXBzZi50ZXggdXAgZnJvbnQuICBJZiB3ZSByZWFkIGl0IG9ubHkgYXQgQGltYWdlCislIHRpbWUsIHdlIG1pZ2h0IGJlIGluc2lkZSBhIGdyb3VwLCBhbmQgdGhlbiBpdHMgZGVmaW5pdGlvbnMgd291bGQgZ2V0CislIHVuZG9uZSBhbmQgdGhlIG5leHQgaW1hZ2Ugd291bGQgZmFpbC4KK1xvcGVuaW4gMSA9IGVwc2YudGV4CitcaWZlb2YgMSBcZWxzZQorICAlIERvIG5vdCBib3RoZXIgc2hvd2luZyBiYW5uZXIgd2l0aCBlcHNmLnRleCB2Mi43ayAoYXZhaWxhYmxlIGluCisgICUgZG9jL2Vwc2YudGV4IGFuZCBvbiBjdGFuKS4KKyAgXGRlZlxlcHNmYW5ub3VuY2V7XHRva3MwID0gfSUKKyAgXGlucHV0IGVwc2YudGV4CitcZmkKK1xjbG9zZWluIDEKKyUKKyUgV2Ugd2lsbCBvbmx5IGNvbXBsYWluIG9uY2UgYWJvdXQgbGFjayBvZiBlcHNmLnRleC4KK1xuZXdpZlxpZndhcm5lZG5vZXBzZgorXG5ld2hlbHBcbm9lcHNmaGVscHtlcHNmLnRleCBtdXN0IGJlIGluc3RhbGxlZCBmb3IgaW1hZ2VzIHRvCisgIHdvcmsuICBJdCBpcyBhbHNvIGluY2x1ZGVkIGluIHRoZSBUZXhpbmZvIGRpc3RyaWJ1dGlvbiwgb3IgeW91IGNhbiBnZXQKKyAgaXQgZnJvbSBmdHA6Ly90dWcub3JnL3RleC9lcHNmLnRleC59CislCitcZGVmXGltYWdlIzF7JQorICBcaWZ4XGVwc2Zib3hcdW5kZWZpbmVkCisgICAgXGlmd2FybmVkbm9lcHNmIFxlbHNlCisgICAgICBcZXJyaGVscCA9IFxub2Vwc2ZoZWxwCisgICAgICBcZXJybWVzc2FnZXtlcHNmLnRleCBub3QgZm91bmQsIGltYWdlcyB3aWxsIGJlIGlnbm9yZWR9JQorICAgICAgXGdsb2JhbFx3YXJuZWRub2Vwc2Z0cnVlCisgICAgXGZpCisgIFxlbHNlCisgICAgXGltYWdleHh4ICMxLCwsLCxcZmluaXNoCisgIFxmaQorfQorJQorJSBBcmd1bWVudHMgdG8gQGltYWdlOgorJSAjMSBpcyAobWFuZGF0b3J5KSBpbWFnZSBmaWxlbmFtZTsgd2UgdGFjayBvbiAuZXBzIGV4dGVuc2lvbi4KKyUgIzIgaXMgKG9wdGlvbmFsKSB3aWR0aCwgIzMgaXMgKG9wdGlvbmFsKSBoZWlnaHQuCislICM0IGlzIChpZ25vcmVkIG9wdGlvbmFsKSBodG1sIGFsdCB0ZXh0LgorJSAjNSBpcyAoaWdub3JlZCBvcHRpb25hbCkgZXh0ZW5zaW9uLgorJSAjNiBpcyBqdXN0IHRoZSB1c3VhbCBleHRyYSBpZ25vcmVkIGFyZyBmb3IgcGFyc2luZyB0aGlzIHN0dWZmLgorXG5ld2lmXGlmaW1hZ2V2bW9kZQorXGRlZlxpbWFnZXh4eCMxLCMyLCMzLCM0LCM1LCM2XGZpbmlzaHtcYmVnaW5ncm91cAorICBcY2F0Y29kZWBcXl5NID0gNSAgICAgJSBpbiBjYXNlIHdlJ3JlIGluc2lkZSBhbiBleGFtcGxlCisgIFxub3JtYWx0dXJub2ZmYWN0aXZlICAlIGFsbG93IF8gZXQgYWwuIGluIG5hbWVzCisgICUgSWYgdGhlIGltYWdlIGlzIGJ5IGl0c2VsZiwgY2VudGVyIGl0LgorICBcaWZ2bW9kZQorICAgIFxpbWFnZXZtb2RldHJ1ZQorICAgIFxub2JyZWFrXGJpZ3NraXAKKyAgICAlIFVzdWFsbHkgd2UnbGwgaGF2ZSB0ZXh0IGFmdGVyIHRoZSBpbWFnZSB3aGljaCB3aWxsIGluc2VydAorICAgICUgXHBhcnNraXAgZ2x1ZSwgc28gaW5zZXJ0IGl0IGhlcmUgdG9vIHRvIGVxdWFsaXplIHRoZSBzcGFjZQorICAgICUgYWJvdmUgYW5kIGJlbG93LgorICAgIFxub2JyZWFrXHZza2lwXHBhcnNraXAKKyAgICBcbm9icmVhaworICAgIFxsaW5lXGJncm91cFxoc3MKKyAgXGZpCisgICUKKyAgJSBPdXRwdXQgdGhlIGltYWdlLgorICBcaWZwZGYKKyAgICBcZG9wZGZpbWFnZXsjMX17IzJ9eyMzfSUKKyAgXGVsc2UKKyAgICAlIFxlcHNmYm94IGl0c2VsZiByZXNldHMgXGVwc2Y/c2l6ZSBhdCBlYWNoIGZpZ3VyZS4KKyAgICBcc2V0Ym94MCA9IFxoYm94e1xpZ25vcmVzcGFjZXMgIzJ9XGlmZGltXHdkMCA+IDBwdCBcZXBzZnhzaXplPSMyXHJlbGF4IFxmaQorICAgIFxzZXRib3gwID0gXGhib3h7XGlnbm9yZXNwYWNlcyAjM31caWZkaW1cd2QwID4gMHB0IFxlcHNmeXNpemU9IzNccmVsYXggXGZpCisgICAgXGVwc2Zib3h7IzEuZXBzfSUKKyAgXGZpCisgICUKKyAgXGlmaW1hZ2V2bW9kZSBcaHNzIFxlZ3JvdXAgXGJpZ2JyZWFrIFxmaSAgJSBzcGFjZSBhZnRlciB0aGUgaW1hZ2UKK1xlbmRncm91cH0KKworCislIEBmbG9hdCBGTE9BVFRZUEUsTEFCRUwsTE9DIC4uLiBAZW5kIGZsb2F0IGZvciBkaXNwbGF5ZWQgZmlndXJlcywgdGFibGVzLAorJSBldGMuICBXZSBkb24ndCBhY3R1YWxseSBpbXBsZW1lbnQgZmxvYXRpbmcgeWV0LCB3ZSBhbHdheXMgaW5jbHVkZSB0aGUKKyUgZmxvYXQgImhlcmUiLiAgQnV0IGl0IHNlZW1lZCB0aGUgYmVzdCBuYW1lIGZvciB0aGUgZnV0dXJlLgorJQorXGVudnBhcnNlYXJnZGVmXGZsb2F0e1xlYXRjb21tYXNwYWNlXGVhdGNvbW1hc3BhY2VcZG9mbG9hdCMxLCAsICxcZmluaXNofQorCislIFRoZXJlIG1heSBiZSBhIHNwYWNlIGJlZm9yZSBzZWNvbmQgYW5kL29yIHRoaXJkIHBhcmFtZXRlcjsgZGVsZXRlIGl0LgorXGRlZlxlYXRjb21tYXNwYWNlIzEsIHsjMSx9CisKKyUgIzEgaXMgdGhlIG9wdGlvbmFsIEZMT0FUVFlQRSwgdGhlIHRleHQgbGFiZWwgZm9yIHRoaXMgZmxvYXQsIHR5cGljYWxseQorJSAiRmlndXJlIiwgIlRhYmxlIiwgIkV4YW1wbGUiLCBldGMuICBDYW4ndCBjb250YWluIGNvbW1hcy4gIElmIG9taXR0ZWQsCislIHRoaXMgZmxvYXQgd2lsbCBub3QgYmUgbnVtYmVyZWQgYW5kIGNhbm5vdCBiZSByZWZlcnJlZCB0by4KKyUKKyUgIzIgaXMgdGhlIG9wdGlvbmFsIHhyZWYgbGFiZWwuICBBbHNvIG11c3QgYmUgcHJlc2VudCBmb3IgdGhlIGZsb2F0IHRvCislIGJlIHJlZmVyYWJsZS4KKyUKKyUgIzMgaXMgdGhlIG9wdGlvbmFsIHBvc2l0aW9uaW5nIGFyZ3VtZW50OyBmb3Igbm93LCBpdCBpcyBpZ25vcmVkLiAgSXQKKyUgd2lsbCBzb21laG93IHNwZWNpZnkgdGhlIHBvc2l0aW9ucyBhbGxvd2VkIHRvIGZsb2F0IHRvIChoZXJlLCB0b3AsIGJvdHRvbSkuCislCislIFdlIGtlZXAgYSBzZXBhcmF0ZSBjb3VudGVyIGZvciBlYWNoIEZMT0FUVFlQRSwgd2hpY2ggd2UgcmVzZXQgYXQgZWFjaAorJSBjaGFwdGVyLWxldmVsIGNvbW1hbmQuCitcbGV0XHJlc2V0YWxsZmxvYXRub3M9XGVtcHR5CislCitcZGVmXGRvZmxvYXQjMSwjMiwjMywjNFxmaW5pc2h7JQorICBcbGV0XHRoaXNjYXB0aW9uPVxlbXB0eQorICBcbGV0XHRoaXNzaG9ydGNhcHRpb249XGVtcHR5CisgICUKKyAgJSBkb24ndCBsb3NlIGZvb3Rub3RlcyBpbnNpZGUgQGZsb2F0LgorICAlCisgICUgQkVXQVJFOiB3aGVuIHRoZSBmbG9hdHMgc3RhcnQgZmxvYXQsIHdlIGhhdmUgdG8gaXNzdWUgd2FybmluZyB3aGVuZXZlciBhbgorICAlIGluc2VydCBhcHBlYXJzIGluc2lkZSBhIGZsb2F0IHdoaWNoIGNvdWxkIHBvc3NpYmx5IGZsb2F0LiAtLWthc2FsLCAyNm1heTA0CisgICUKKyAgXHN0YXJ0c2F2aW5naW5zZXJ0cworICAlCisgICUgV2UgY2FuJ3QgYmUgdXNlZCBpbnNpZGUgYSBwYXJhZ3JhcGguCisgIFxwYXIKKyAgJQorICBcdnRvcFxiZ3JvdXAKKyAgICBcZGVmXGZsb2F0dHlwZXsjMX0lCisgICAgXGRlZlxmbG9hdGxhYmVseyMyfSUKKyAgICBcZGVmXGZsb2F0bG9jeyMzfSUgd2UgZG8gbm90aGluZyB3aXRoIHRoaXMgeWV0LgorICAgICUKKyAgICBcaWZ4XGZsb2F0dHlwZVxlbXB0eQorICAgICAgXGxldFxzYWZlZmxvYXR0eXBlPVxlbXB0eQorICAgIFxlbHNlCisgICAgICB7JQorICAgICAgICAlIHRoZSBmbG9hdHR5cGUgbWlnaHQgaGF2ZSBhY2NlbnRzIG9yIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycywKKyAgICAgICAgJSBidXQgd2UgbmVlZCB0byB1c2UgaXQgaW4gYSBjb250cm9sIHNlcXVlbmNlIG5hbWUuCisgICAgICAgIFxpbmRleG5vZm9udHMKKyAgICAgICAgXHR1cm5vZmZhY3RpdmUKKyAgICAgICAgXHhkZWZcc2FmZWZsb2F0dHlwZXtcZmxvYXR0eXBlfSUKKyAgICAgIH0lCisgICAgXGZpCisgICAgJQorICAgICUgSWYgbGFiZWwgaXMgZ2l2ZW4gYnV0IG5vIHR5cGUsIHdlIGhhbmRsZSB0aGF0IGFzIHRoZSBlbXB0eSB0eXBlLgorICAgIFxpZnhcZmxvYXRsYWJlbFxlbXB0eSBcZWxzZQorICAgICAgJSBXZSB3YW50IGVhY2ggRkxPQVRUWVBFIHRvIGJlIG51bWJlcmVkIHNlcGFyYXRlbHkgKEZpZ3VyZSAxLAorICAgICAgJSBUYWJsZSAxLCBGaWd1cmUgMiwgLi4uKS4gIChBbmQgaWYgbm8gbGFiZWwsIG5vIG51bWJlci4pCisgICAgICAlCisgICAgICBcZXhwYW5kYWZ0ZXJcZ2V0ZmxvYXRub1xjc25hbWVcc2FmZWZsb2F0dHlwZSBmbG9hdG5vXGVuZGNzbmFtZQorICAgICAgXGdsb2JhbFxhZHZhbmNlXGZsb2F0bm8gYnkgMQorICAgICAgJQorICAgICAgeyUKKyAgICAgICAgJSBUaGlzIG1hZ2ljIHZhbHVlIGZvciBcdGhpc3NlY3Rpb24gaXMgb3V0cHV0IGJ5IFxzZXRyZWYgYXMgdGhlCisgICAgICAgICUgWFJFRkxBQkVMLXRpdGxlIHZhbHVlLiAgXHhyZWZYIHVzZXMgaXQgdG8gZGlzdGluZ3Vpc2ggZmxvYXQKKyAgICAgICAgJSBsYWJlbHMgKHdoaWNoIGhhdmUgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBvdXRwdXQgZm9ybWF0KSBmcm9tCisgICAgICAgICUgbm9kZSBhbmQgYW5jaG9yIGxhYmVscy4gIEFuZCBceHJkZWYgdXNlcyBpdCB0byBjb25zdHJ1Y3QgdGhlCisgICAgICAgICUgbGlzdHMgb2YgZmxvYXRzLgorICAgICAgICAlCisgICAgICAgIFxlZGVmXHRoaXNzZWN0aW9ue1xmbG9hdG1hZ2ljPVxzYWZlZmxvYXR0eXBlfSUKKyAgICAgICAgXHNldHJlZntcZmxvYXRsYWJlbH17WWZsb2F0fSUKKyAgICAgIH0lCisgICAgXGZpCisgICAgJQorICAgICUgc3RhcnQgd2l0aCBccGFyc2tpcCBnbHVlLCBJIGd1ZXNzLgorICAgIFx2c2tpcFxwYXJza2lwCisgICAgJQorICAgICUgRG9uJ3Qgc3VwcHJlc3MgaW5kZW50YXRpb24gaWYgYSBmbG9hdCBoYXBwZW5zIHRvIHN0YXJ0IGEgc2VjdGlvbi4KKyAgICBccmVzdG9yZWZpcnN0cGFyYWdyYXBoaW5kZW50Cit9CisKKyUgd2UgaGF2ZSB0aGVzZSBwb3NzaWJpbGl0aWVzOgorJSBAZmxvYXQgRm9vLGxibCAmIEBjYXB0aW9ue0NhcH06IEZvbyAxLjE6IENhcAorJSBAZmxvYXQgRm9vLGxibCAmIG5vIGNhcHRpb246ICAgIEZvbyAxLjEKKyUgQGZsb2F0IEZvbyAmIEBjYXB0aW9ue0NhcH06ICAgICBGb286IENhcAorJSBAZmxvYXQgRm9vICYgbm8gY2FwdGlvbjogICAgICAgIEZvbworJSBAZmxvYXQgLGxibCAmIENhcHRpb257Q2FwfTogICAgIDEuMTogQ2FwCislIEBmbG9hdCAsbGJsICYgbm8gY2FwdGlvbjogICAgICAgMS4xCislIEBmbG9hdCAmIEBjYXB0aW9ue0NhcH06ICAgICAgICAgQ2FwCislIEBmbG9hdCAmIG5vIGNhcHRpb246CislCitcZGVmXEVmbG9hdHslCisgICAgXGxldFxmbG9hdGlkZW50ID0gXGVtcHR5CisgICAgJQorICAgICUgSW4gYWxsIGNhc2VzLCBpZiB3ZSBoYXZlIGEgZmxvYXQgdHlwZSwgaXQgY29tZXMgZmlyc3QuCisgICAgXGlmeFxmbG9hdHR5cGVcZW1wdHkgXGVsc2UgXGRlZlxmbG9hdGlkZW50e1xmbG9hdHR5cGV9XGZpCisgICAgJQorICAgICUgSWYgd2UgaGF2ZSBhbiB4cmVmIGxhYmVsLCB0aGUgbnVtYmVyIGNvbWVzIG5leHQuCisgICAgXGlmeFxmbG9hdGxhYmVsXGVtcHR5IFxlbHNlCisgICAgICBcaWZ4XGZsb2F0dHlwZVxlbXB0eSBcZWxzZSAlIGlmIGFsc28gaGFkIGZsb2F0IHR5cGUsIG5lZWQgdGllIGZpcnN0LgorICAgICAgICBcYXBwZW5kdG9tYWNyb1xmbG9hdGlkZW50e1x0aWV9JQorICAgICAgXGZpCisgICAgICAlIHRoZSBudW1iZXIuCisgICAgICBcYXBwZW5kdG9tYWNyb1xmbG9hdGlkZW50e1xjaGFwbGV2ZWxwcmVmaXhcdGhlXGZsb2F0bm99JQorICAgIFxmaQorICAgICUKKyAgICAlIFN0YXJ0IHRoZSBwcmludGVkIGNhcHRpb24gd2l0aCB3aGF0IHdlJ3ZlIGNvbnN0cnVjdGVkIGluCisgICAgJSBcZmxvYXRpZGVudCwgYnV0IGtlZXAgaXQgc2VwYXJhdGU7IHdlIG5lZWQgXGZsb2F0aWRlbnQgYWdhaW4uCisgICAgXGxldFxjYXB0aW9ubGluZSA9IFxmbG9hdGlkZW50CisgICAgJQorICAgIFxpZnhcdGhpc2NhcHRpb25cZW1wdHkgXGVsc2UKKyAgICAgIFxpZnhcZmxvYXRpZGVudFxlbXB0eSBcZWxzZQorCVxhcHBlbmR0b21hY3JvXGNhcHRpb25saW5lezogfSUgaGFkIGlkZW50LCBzbyBuZWVkIGEgY29sb24gYmV0d2VlbgorICAgICAgXGZpCisgICAgICAlCisgICAgICAlIGNhcHRpb24gdGV4dC4KKyAgICAgIFxhcHBlbmR0b21hY3JvXGNhcHRpb25saW5le1xzY2FuZXhwXHRoaXNjYXB0aW9ufSUKKyAgICBcZmkKKyAgICAlCisgICAgJSBJZiB3ZSBoYXZlIGFueXRoaW5nIHRvIHByaW50LCBwcmludCBpdCwgd2l0aCBzcGFjZSBiZWZvcmUuCisgICAgJSBFdmVudHVhbGx5IHRoaXMgbmVlZHMgdG8gYmVjb21lIGFuIFxpbnNlcnQuCisgICAgXGlmeFxjYXB0aW9ubGluZVxlbXB0eSBcZWxzZQorICAgICAgXHZza2lwLjVccGFyc2tpcAorICAgICAgXGNhcHRpb25saW5lCisgICAgICAlCisgICAgICAlIFNwYWNlIGJlbG93IGNhcHRpb24uCisgICAgICBcdnNraXBccGFyc2tpcAorICAgIFxmaQorICAgICUKKyAgICAlIElmIGhhdmUgYW4geHJlZiBsYWJlbCwgd3JpdGUgdGhlIGxpc3Qgb2YgZmxvYXRzIGluZm8uICBEbyB0aGlzCisgICAgJSBhZnRlciB0aGUgY2FwdGlvbiwgdG8gYXZvaWQgY2hhbmNlIG9mIGl0IGJlaW5nIGEgYnJlYWtwb2ludC4KKyAgICBcaWZ4XGZsb2F0bGFiZWxcZW1wdHkgXGVsc2UKKyAgICAgICUgV3JpdGUgdGhlIHRleHQgdGhhdCBnb2VzIGluIHRoZSBsb2YgdG8gdGhlIGF1eCBmaWxlIGFzCisgICAgICAlIFxmbG9hdGxhYmVsLWxvZi4gIEJlc2lkZXMgXGZsb2F0aWRlbnQsIHdlIGluY2x1ZGUgdGhlIHNob3J0CisgICAgICAlIGNhcHRpb24gaWYgc3BlY2lmaWVkLCBlbHNlIHRoZSBmdWxsIGNhcHRpb24gaWYgc3BlY2lmaWVkLCBlbHNlIG5vdGhpbmcuCisgICAgICB7JQorICAgICAgICBcYXRkdW1taWVzIFx0dXJub2ZmYWN0aXZlIFxvdGhlcmJhY2tzbGFzaAorICAgICAgICAlIHNpbmNlIHdlIHJlYWQgdGhlIGNhcHRpb24gdGV4dCBpbiB0aGUgbWFjcm8gd29ybGQsIHdoZXJlIF5eTQorICAgICAgICAlIGlzIHR1cm5lZCBpbnRvIGEgbm9ybWFsIGNoYXJhY3Rlciwgd2UgaGF2ZSB0byBzY2FuIGl0IGJhY2ssIHNvCisgICAgICAgICUgd2UgZG9uJ3Qgd3JpdGUgdGhlIGxpdGVyYWwgdGhyZWUgY2hhcmFjdGVycyAiXl5NIiBpbnRvIHRoZSBhdXggZmlsZS4KKwlcc2NhbmV4cHslCisJICBceGRlZlxub2V4cGFuZFxndGVtcHslCisJICAgIFxpZnhcdGhpc3Nob3J0Y2FwdGlvblxlbXB0eQorCSAgICAgIFx0aGlzY2FwdGlvbgorCSAgICBcZWxzZQorCSAgICAgIFx0aGlzc2hvcnRjYXB0aW9uCisJICAgIFxmaQorCSAgfSUKKwl9JQorICAgICAgICBcaW1tZWRpYXRlXHdyaXRlXGF1eGZpbGV7QHhyZGVme1xmbG9hdGxhYmVsLWxvZn17XGZsb2F0aWRlbnQKKwkgIFxpZnhcZ3RlbXBcZW1wdHkgXGVsc2UgOiBcZ3RlbXAgXGZpfX0lCisgICAgICB9JQorICAgIFxmaQorICBcZWdyb3VwICAlIGVuZCBvZiBcdnRvcAorICAlCisgICUgcGxhY2UgdGhlIGNhcHR1cmVkIGluc2VydHMKKyAgJQorICAlIEJFV0FSRTogd2hlbiB0aGUgZmxvYXRzIHN0YXJ0IGZsb2F0LCB3ZSBoYXZlIHRvIGlzc3VlIHdhcm5pbmcgd2hlbmV2ZXIgYW4KKyAgJSBpbnNlcnQgYXBwZWFycyBpbnNpZGUgYSBmbG9hdCB3aGljaCBjb3VsZCBwb3NzaWJseSBmbG9hdC4gLS1rYXNhbCwgMjZtYXkwNAorICAlCisgIFxjaGVja2luc2VydHMKK30KKworJSBBcHBlbmQgdGhlIHRva2VucyAjMiB0byB0aGUgZGVmaW5pdGlvbiBvZiBtYWNybyAjMSwgbm90IGV4cGFuZGluZyBlaXRoZXIuCislCitcZGVmXGFwcGVuZHRvbWFjcm8jMSMyeyUKKyAgXGV4cGFuZGFmdGVyXGRlZlxleHBhbmRhZnRlciMxXGV4cGFuZGFmdGVyeyMxIzJ9JQorfQorCislIEBjYXB0aW9uLCBAc2hvcnRjYXB0aW9uCislCitcZGVmXGNhcHRpb257XGRvY2FwdGlvblx0aGlzY2FwdGlvbn0KK1xkZWZcc2hvcnRjYXB0aW9ue1xkb2NhcHRpb25cdGhpc3Nob3J0Y2FwdGlvbn0KK1xkZWZcZG9jYXB0aW9ue1xjaGVja2VudlxmbG9hdCBcYmdyb3VwXHNjYW5hcmdjdHh0XGRlZmNhcHRpb259CitcZGVmXGRlZmNhcHRpb24jMSMye1xlZ3JvdXAgXGRlZiMxeyMyfX0KKworJSBUaGUgcGFyYW1ldGVyIGlzIHRoZSBjb250cm9sIHNlcXVlbmNlIGlkZW50aWZ5aW5nIHRoZSBjb3VudGVyIHdlIGFyZQorJSBnb2luZyB0byB1c2UuICBDcmVhdGUgaXQgaWYgaXQgZG9lc24ndCBleGlzdCBhbmQgYXNzaWduIGl0IHRvIFxmbG9hdG5vLgorXGRlZlxnZXRmbG9hdG5vIzF7JQorICBcaWZ4IzFccmVsYXgKKyAgICAgICUgSGF2ZW4ndCBzZWVuIHRoaXMgZmlndXJlIHR5cGUgYmVmb3JlLgorICAgICAgXGNzbmFtZSBuZXdjb3VudFxlbmRjc25hbWUgIzElCisgICAgICAlCisgICAgICAlIFJlbWVtYmVyIHRvIHJlc2V0IHRoaXMgZmxvYXRubyBhdCB0aGUgbmV4dCBjaGFwLgorICAgICAgXGV4cGFuZGFmdGVyXGdkZWZcZXhwYW5kYWZ0ZXJccmVzZXRhbGxmbG9hdG5vcworICAgICAgICBcZXhwYW5kYWZ0ZXJ7XHJlc2V0YWxsZmxvYXRub3MgIzE9MCB9JQorICBcZmkKKyAgXGxldFxmbG9hdG5vIzElCit9CisKKyUgXHNldHJlZiBjYWxscyB0aGlzIHRvIGdldCB0aGUgWFJFRkxBQkVMLXNudCB2YWx1ZS4gIFdlIHdhbnQgYW4gQHhyZWYKKyUgdG8gdGhlIEZMT0FUTEFCRUwgdG8gZXhwYW5kIHRvICJGaWd1cmUgMy4xIi4gIFdlIGNhbGwgXHNldHJlZiB3aGVuIHdlCislIGZpcnN0IHJlYWQgdGhlIEBmbG9hdCBjb21tYW5kLgorJQorXGRlZlxZZmxvYXR7XGZsb2F0dHlwZUB0aWUgXGNoYXBsZXZlbHByZWZpeFx0aGVcZmxvYXRub30lCisKKyUgTWFnaWMgc3RyaW5nIHVzZWQgZm9yIHRoZSBYUkVGTEFCRUwtdGl0bGUgdmFsdWUsIHNvIFx4cmVmWCBjYW4KKyUgZGlzdGluZ3Vpc2ggZmxvYXRzIGZyb20gb3RoZXIgeHJlZiB0eXBlcy4KK1xkZWZcZmxvYXRtYWdpY3shIWZsb2F0ISF9CisKKyUgIzEgaXMgdGhlIGNvbnRyb2wgc2VxdWVuY2Ugd2UgYXJlIHBhc3NlZDsgd2UgZXhwYW5kIGludG8gYSBjb25kaXRpb25hbAorJSB3aGljaCBpcyB0cnVlIGlmICMxIHJlcHJlc2VudHMgYSBmbG9hdCByZWYuICBUaGF0IGlzLCB0aGUgbWFnaWMKKyUgXHRoaXNzZWN0aW9uIHZhbHVlIHdoaWNoIHdlIFxzZXRyZWYgYWJvdmUuCislCitcZGVmXGlmZmxvYXQjMXtcZXhwYW5kYWZ0ZXJcZG9pZmZsb2F0IzE9PVxmaW5pc2h9CislCislICMxIGlzIChtYXliZSkgdGhlIFxmbG9hdG1hZ2ljIHN0cmluZy4gIElmIHNvLCAjMiB3aWxsIGJlIHRoZQorJSAoc2FmZSkgZmxvYXQgdHlwZSBmb3IgdGhpcyBmbG9hdC4gIFdlIHNldCBcaWZmbG9hdHR5cGUgdG8gIzIuCislCitcZGVmXGRvaWZmbG9hdCMxPSMyPSMzXGZpbmlzaHslCisgIFxkZWZcdGVtcHsjMX0lCisgIFxkZWZcaWZmbG9hdHR5cGV7IzJ9JQorICBcaWZ4XHRlbXBcZmxvYXRtYWdpYworfQorCislIEBsaXN0b2ZmbG9hdHMgRkxPQVRUWVBFIC0gcHJpbnQgYSBsaXN0IG9mIGZsb2F0cyBsaWtlIGEgdGFibGUgb2YgY29udGVudHMuCislCitccGFyc2VhcmdkZWZcbGlzdG9mZmxvYXRzeyUKKyAgXGRlZlxmbG9hdHR5cGV7IzF9JSBmbG9hdHR5cGUKKyAgeyUKKyAgICAlIHRoZSBmbG9hdHR5cGUgbWlnaHQgaGF2ZSBhY2NlbnRzIG9yIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycywKKyAgICAlIGJ1dCB3ZSBuZWVkIHRvIHVzZSBpdCBpbiBhIGNvbnRyb2wgc2VxdWVuY2UgbmFtZS4KKyAgICBcaW5kZXhub2ZvbnRzCisgICAgXHR1cm5vZmZhY3RpdmUKKyAgICBceGRlZlxzYWZlZmxvYXR0eXBle1xmbG9hdHR5cGV9JQorICB9JQorICAlCisgICUgXHhyZGVmIHNhdmVzIHRoZSBmbG9hdHMgYXMgYSBcZG8tbGlzdCBpbiBcZmxvYXRsaXN0U0FGRUZMT0FUVFlQRS4KKyAgXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgZmxvYXRsaXN0XHNhZmVmbG9hdHR5cGVcZW5kY3NuYW1lIFxyZWxheAorICAgIFxpZmhhdmV4cmVmcworICAgICAgJSBpZiB0aGUgdXNlciBzYWlkIEBsaXN0b2ZmbG9hdHMgZm9vIGJ1dCBuZXZlciBAZmxvYXQgZm9vLgorICAgICAgXG1lc3NhZ2V7XGxpbmVudW1iZXIgTm8gYFxzYWZlZmxvYXR0eXBlJyBmbG9hdHMgdG8gbGlzdC59JQorICAgIFxmaQorICBcZWxzZQorICAgIFxiZWdpbmdyb3VwCisgICAgICBcbGVmdHNraXA9XHRvY2luZGVudCAgJSBpbmRlbnQgdGhlc2UgZW50cmllcyBsaWtlIGEgdG9jCisgICAgICBcbGV0XGRvPVxsaXN0b2ZmbG9hdHNkbworICAgICAgXGNzbmFtZSBmbG9hdGxpc3Rcc2FmZWZsb2F0dHlwZVxlbmRjc25hbWUKKyAgICBcZW5kZ3JvdXAKKyAgXGZpCit9CisKKyUgVGhpcyBpcyBjYWxsZWQgb24gZWFjaCBlbnRyeSBpbiBhIGxpc3Qgb2YgZmxvYXRzLiAgV2UncmUgcGFzc2VkIHRoZQorJSB4cmVmIGxhYmVsLCBpbiB0aGUgZm9ybSBMQUJFTC10aXRsZSwgd2hpY2ggaXMgaG93IHdlIHNhdmUgaXQgaW4gdGhlCislIGF1eCBmaWxlLiAgV2Ugc3RyaXAgb2ZmIHRoZSAtdGl0bGUgYW5kIGxvb2sgdXAgXFhSTEFCRUwtbG9mLCB3aGljaAorJSBoYXMgdGhlIHRleHQgd2UncmUgc3VwcG9zZWQgdG8gdHlwZXNldCBoZXJlLgorJQorJSBGaWd1cmVzIHdpdGhvdXQgeHJlZiBsYWJlbHMgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3QgKHNpbmNlCislIHRoZXkgd29uJ3QgYXBwZWFyIGluIHRoZSBhdXggZmlsZSkuCislCitcZGVmXGxpc3RvZmZsb2F0c2RvIzF7XGxpc3RvZmZsb2F0c2RvZW50cnkjMVxmaW5pc2h9CitcZGVmXGxpc3RvZmZsb2F0c2RvZW50cnkjMS10aXRsZVxmaW5pc2h7eyUKKyAgJSBDYW4ndCBmdWxseSBleHBhbmQgWFIjMS1sb2YgYmVjYXVzZSBpdCBjYW4gY29udGFpbiBhbnl0aGluZy4gIEp1c3QKKyAgJSBwYXNzIHRoZSBjb250cm9sIHNlcXVlbmNlLiAgT24gdGhlIG90aGVyIGhhbmQsIFhSIzEtcGcgaXMganVzdCB0aGUKKyAgJSBwYWdlIG51bWJlciwgYW5kIHdlIHdhbnQgdG8gZnVsbHkgZXhwYW5kIHRoYXQgc28gd2UgY2FuIGdldCBhIGxpbmsKKyAgJSBpbiBwZGYgb3V0cHV0LgorICBcdG9rc0EgPSBcZXhwYW5kYWZ0ZXJ7XGNzbmFtZSBYUiMxLWxvZlxlbmRjc25hbWV9JQorICAlCisgICUgdXNlIHRoZSBzYW1lIFxlbnRyeSBtYWNybyB3ZSB1c2UgdG8gZ2VuZXJhdGUgdGhlIFRPQyBhbmQgaW5kZXguCisgIFxlZGVmXHdyaXRlZW50cnl7XG5vZXhwYW5kXGVudHJ5e1x0aGVcdG9rc0F9e1xjc25hbWUgWFIjMS1wZ1xlbmRjc25hbWV9fSUKKyAgXHdyaXRlZW50cnkKK319CisKK1xtZXNzYWdle2xvY2FsaXphdGlvbix9CislIGFuZCBpMThuLgorCislIEBkb2N1bWVudGxhbmd1YWdlIGlzIHVzdWFsbHkgZ2l2ZW4gdmVyeSBlYXJseSwganVzdCBhZnRlcgorJSBAc2V0ZmlsZW5hbWUuICBJZiBkb25lIHRvbyBsYXRlLCBpdCBtYXkgbm90IG92ZXJyaWRlIGV2ZXJ5dGhpbmcKKyUgcHJvcGVybHkuICBTaW5nbGUgYXJndW1lbnQgaXMgdGhlIGxhbmd1YWdlIGFiYnJldmlhdGlvbi4KKyUgSXQgd291bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCBzZXQgdXAgYSBoeXBoZW5hdGlvbiBmaWxlIGhlcmUuCislCitccGFyc2VhcmdkZWZcZG9jdW1lbnRsYW5ndWFnZXslCisgIFx0ZXggJSByZWFkIHR4aS0/Py50ZXggZmlsZSBpbiBwbGFpbiBUZVguCisgICAgJSBSZWFkIHRoZSBmaWxlIGlmIGl0IGV4aXN0cy4KKyAgICBcb3BlbmluIDEgdHhpLSMxLnRleAorICAgIFxpZmVvZiAxCisgICAgICBcZXJyaGVscCA9IFxub2xhbmdoZWxwCisgICAgICBcZXJybWVzc2FnZXtDYW5ub3QgcmVhZCBsYW5ndWFnZSBmaWxlIHR4aS0jMS50ZXh9JQorICAgIFxlbHNlCisgICAgICBcaW5wdXQgdHhpLSMxLnRleAorICAgIFxmaQorICAgIFxjbG9zZWluIDEKKyAgXGVuZGdyb3VwCit9CitcbmV3aGVscFxub2xhbmdoZWxwe1RoZSBnaXZlbiBsYW5ndWFnZSBkZWZpbml0aW9uIGZpbGUgY2Fubm90IGJlIGZvdW5kIG9yCitpcyBlbXB0eS4gIE1heWJlIHlvdSBuZWVkIHRvIGluc3RhbGwgaXQ/ICBJbiB0aGUgY3VycmVudCBkaXJlY3RvcnkKK3Nob3VsZCB3b3JrIGlmIG5vd2hlcmUgZWxzZSBkb2VzLn0KKworCislIEBkb2N1bWVudGVuY29kaW5nIHNob3VsZCBjaGFuZ2Ugc29tZXRoaW5nIGluIFRlWCBldmVudHVhbGx5LCBtb3N0CislIGxpa2VseSwgYnV0IGZvciBub3cganVzdCByZWNvZ25pemUgaXQuCitcbGV0XGRvY3VtZW50ZW5jb2RpbmcgPSBcY29tbWVudAorCisKKyUgUGFnZSBzaXplIHBhcmFtZXRlcnMuCislCitcbmV3ZGltZW5cZGVmYXVsdHBhcmluZGVudCBcZGVmYXVsdHBhcmluZGVudCA9IDE1cHQKKworXGNoYXBoZWFkaW5nc2tpcCA9IDE1cHQgcGx1cyA0cHQgbWludXMgMnB0Citcc2VjaGVhZGluZ3NraXAgPSAxMnB0IHBsdXMgM3B0IG1pbnVzIDJwdAorXHN1YnNlY2hlYWRpbmdza2lwID0gOXB0IHBsdXMgMnB0IG1pbnVzIDJwdAorCislIFByZXZlbnQgdW5kZXJmdWxsIHZib3ggZXJyb3IgbWVzc2FnZXMuCitcdmJhZG5lc3MgPSAxMDAwMAorCislIERvbid0IGJlIHNvIGZpbmlja3kgYWJvdXQgdW5kZXJmdWxsIGhib3hlcywgZWl0aGVyLgorXGhiYWRuZXNzID0gMjAwMAorCislIEZvbGxvd2luZyBHZW9yZ2UgQnVzaCwganVzdCBnZXQgcmlkIG9mIHdpZG93cyBhbmQgb3JwaGFucy4KK1x3aWRvd3BlbmFsdHk9MTAwMDAKK1xjbHVicGVuYWx0eT0xMDAwMAorCislIFVzZSBUZVggMy4wJ3MgXGVtZXJnZW5jeXN0cmV0Y2ggdG8gaGVscCBsaW5lIGJyZWFraW5nLCBidXQgaWYgd2UncmUKKyUgdXNpbmcgYW4gb2xkIHZlcnNpb24gb2YgVGVYLCBkb24ndCBkbyBhbnl0aGluZy4gIFdlIHdhbnQgdGhlIGFtb3VudCBvZgorJSBzdHJldGNoIGFkZGVkIHRvIGRlcGVuZCBvbiB0aGUgbGluZSBsZW5ndGgsIGhlbmNlIHRoZSBkZXBlbmRlbmNlIG9uCislIFxoc2l6ZS4gIFdlIGNhbGwgdGhpcyB3aGVuZXZlciB0aGUgcGFwZXIgc2l6ZSBpcyBzZXQuCislCitcZGVmXHNldGVtZXJnZW5jeXN0cmV0Y2h7JQorICBcaWZ4XGVtZXJnZW5jeXN0cmV0Y2hcdGhpc2lzdW5kZWZpbmVkCisgICAgJSBBbGxvdyB1cyB0byBhc3NpZ24gdG8gXGVtZXJnZW5jeXN0cmV0Y2ggYW55d2F5LgorICAgIFxkZWZcZW1lcmdlbmN5c3RyZXRjaHtcZGltZW4wfSUKKyAgXGVsc2UKKyAgICBcZW1lcmdlbmN5c3RyZXRjaCA9IC4xNVxoc2l6ZQorICBcZmkKK30KKworJSBQYXJhbWV0ZXJzIGluIG9yZGVyOiAxKSB0ZXh0aGVpZ2h0OyAyKSB0ZXh0d2lkdGg7IDMpIHZvZmZzZXQ7CislIDQpIGhvZmZzZXQ7IDUpIGJpbmRpbmcgb2Zmc2V0OyA2KSB0b3Bza2lwOyA3KSBwaHlzaWNhbCBwYWdlIGhlaWdodDsgOCkKKyUgcGh5c2ljYWwgcGFnZSB3aWR0aC4KKyUKKyUgV2UgYWxzbyBjYWxsIFxzZXRsZWFkaW5ne1x0ZXh0bGVhZGluZ30sIHNvIHRoZSBjYWxsZXIgc2hvdWxkIGRlZmluZQorJSBcdGV4dGxlYWRpbmcuICBUaGUgY2FsbGVyIHNob3VsZCBhbHNvIHNldCBccGFyc2tpcC4KKyUKK1xkZWZcaW50ZXJuYWxwYWdlc2l6ZXMjMSMyIzMjNCM1IzYjNyM4eyUKKyAgXHZvZmZzZXQgPSAjM1xyZWxheAorICBcdG9wc2tpcCA9ICM2XHJlbGF4CisgIFxzcGxpdHRvcHNraXAgPSBcdG9wc2tpcAorICAlCisgIFx2c2l6ZSA9ICMxXHJlbGF4CisgIFxhZHZhbmNlXHZzaXplIGJ5IFx0b3Bza2lwCisgIFxvdXRlcnZzaXplID0gXHZzaXplCisgIFxhZHZhbmNlXG91dGVydnNpemUgYnkgMlx0b3BhbmRib3R0b21tYXJnaW4KKyAgXHBhZ2VoZWlnaHQgPSBcdnNpemUKKyAgJQorICBcaHNpemUgPSAjMlxyZWxheAorICBcb3V0ZXJoc2l6ZSA9IFxoc2l6ZQorICBcYWR2YW5jZVxvdXRlcmhzaXplIGJ5IDAuNWluCisgIFxwYWdld2lkdGggPSBcaHNpemUKKyAgJQorICBcbm9ybWFsb2Zmc2V0ID0gIzRccmVsYXgKKyAgXGJpbmRpbmdvZmZzZXQgPSAjNVxyZWxheAorICAlCisgIFxpZnBkZgorICAgIFxwZGZwYWdlaGVpZ2h0ICM3XHJlbGF4CisgICAgXHBkZnBhZ2V3aWR0aCAjOFxyZWxheAorICBcZmkKKyAgJQorICBcc2V0bGVhZGluZ3tcdGV4dGxlYWRpbmd9CisgICUKKyAgXHBhcmluZGVudCA9IFxkZWZhdWx0cGFyaW5kZW50CisgIFxzZXRlbWVyZ2VuY3lzdHJldGNoCit9CisKKyUgQGxldHRlcnBhcGVyICh0aGUgZGVmYXVsdCkuCitcZGVmXGxldHRlcnBhcGVye3tcZ2xvYmFsZGVmcyA9IDEKKyAgXHBhcnNraXAgPSAzcHQgcGx1cyAycHQgbWludXMgMXB0CisgIFx0ZXh0bGVhZGluZyA9IDEzLjJwdAorICAlCisgICUgSWYgcGFnZSBpcyBub3RoaW5nIGJ1dCB0ZXh0LCBtYWtlIGl0IGNvbWUgb3V0IGV2ZW4uCisgIFxpbnRlcm5hbHBhZ2VzaXplc3s0NlxiYXNlbGluZXNraXB9ezZpbn0lCisgICAgICAgICAgICAgICAgICAgIHtcdm9mZnNldH17LjI1aW59JQorICAgICAgICAgICAgICAgICAgICB7XGJpbmRpbmdvZmZzZXR9ezM2cHR9JQorICAgICAgICAgICAgICAgICAgICB7MTFpbn17OC41aW59JQorfX0KKworJSBVc2UgQHNtYWxsYm9vayB0byByZXNldCBwYXJhbWV0ZXJzIGZvciA3eDkuNSAob3Igc28pIGZvcm1hdC4KK1xkZWZcc21hbGxib29re3tcZ2xvYmFsZGVmcyA9IDEKKyAgXHBhcnNraXAgPSAycHQgcGx1cyAxcHQKKyAgXHRleHRsZWFkaW5nID0gMTJwdAorICAlCisgIFxpbnRlcm5hbHBhZ2VzaXplc3s3LjVpbn17NWlufSUKKyAgICAgICAgICAgICAgICAgICAge1x2b2Zmc2V0fXsuMjVpbn0lCisgICAgICAgICAgICAgICAgICAgIHtcYmluZGluZ29mZnNldH17MTZwdH0lCisgICAgICAgICAgICAgICAgICAgIHs5LjI1aW59ezdpbn0lCisgICUKKyAgXGxpc3BuYXJyb3dpbmcgPSAwLjNpbgorICBcdG9sZXJhbmNlID0gNzAwCisgIFxoZnV6eiA9IDFwdAorICBcY29udGVudHNyaWdodG1hcmdpbiA9IDBwdAorICBcZGVmYm9keWluZGVudCA9IC41Y20KK319CisKKyUgVXNlIEBhZm91cnBhcGVyIHRvIHByaW50IG9uIEV1cm9wZWFuIEE0IHBhcGVyLgorXGRlZlxhZm91cnBhcGVye3tcZ2xvYmFsZGVmcyA9IDEKKyAgXHBhcnNraXAgPSAzcHQgcGx1cyAycHQgbWludXMgMXB0CisgIFx0ZXh0bGVhZGluZyA9IDEzLjJwdAorICAlCisgICUgRG91YmxlLXNpZGUgcHJpbnRpbmcgdmlhIHBvc3RzY3JpcHQgb24gTGFzZXJqZXQgNDA1MAorICAlIHByaW50cyBkb3VibGUtc2lkZWQgbmljZWx5IHdoZW4gXGJpbmRpbmdvZmZzZXQ9MTBtbSBhbmQgXGhvZmZzZXQ9LTZtbS4KKyAgJSBUbyBjaGFuZ2UgdGhlIHNldHRpbmdzIGZvciBhIGRpZmZlcmVudCBwcmludGVyIG9yIHNpdHVhdGlvbiwgYWRqdXN0CisgICUgXG5vcm1hbG9mZnNldCB1bnRpbCB0aGUgZnJvbnQtc2lkZSBhbmQgYmFjay1zaWRlIHRleHRzIGFsaWduLiAgVGhlbgorICAlIGRvIHRoZSBzYW1lIGZvciBcYmluZGluZ29mZnNldC4gIFlvdSBjYW4gc2V0IHRoZXNlIGZvciB0ZXN0aW5nIGluCisgICUgeW91ciB0ZXhpbmZvIHNvdXJjZSBmaWxlIGxpa2UgdGhpczoKKyAgJSBAdGV4CisgICUgXGdsb2JhbFxub3JtYWxvZmZzZXQgPSAtNm1tCisgICUgXGdsb2JhbFxiaW5kaW5nb2Zmc2V0ID0gMTBtbQorICAlIEBlbmQgdGV4CisgIFxpbnRlcm5hbHBhZ2VzaXplc3s1MVxiYXNlbGluZXNraXB9ezE2MG1tfQorICAgICAgICAgICAgICAgICAgICB7XHZvZmZzZXR9e1xob2Zmc2V0fSUKKyAgICAgICAgICAgICAgICAgICAge1xiaW5kaW5nb2Zmc2V0fXs0NHB0fSUKKyAgICAgICAgICAgICAgICAgICAgezI5N21tfXsyMTBtbX0lCisgICUKKyAgXHRvbGVyYW5jZSA9IDcwMAorICBcaGZ1enogPSAxcHQKKyAgXGNvbnRlbnRzcmlnaHRtYXJnaW4gPSAwcHQKKyAgXGRlZmJvZHlpbmRlbnQgPSA1bW0KK319CisKKyUgVXNlIEBhZml2ZXBhcGVyIHRvIHByaW50IG9uIEV1cm9wZWFuIEE1IHBhcGVyLgorJSBGcm9tIHJvbWlsZG9AdXJhbm8uaWNlYi51Zm9wLmJyLCAyIEp1bHkgMjAwMC4KKyUgSGUgYWxzbyByZWNvbW1lbmRzIG1ha2luZyBAZXhhbXBsZSBhbmQgQGxpc3AgYmUgc21hbGwuCitcZGVmXGFmaXZlcGFwZXJ7e1xnbG9iYWxkZWZzID0gMQorICBccGFyc2tpcCA9IDJwdCBwbHVzIDFwdCBtaW51cyAwLjFwdAorICBcdGV4dGxlYWRpbmcgPSAxMi41cHQKKyAgJQorICBcaW50ZXJuYWxwYWdlc2l6ZXN7MTYwbW19ezEyMG1tfSUKKyAgICAgICAgICAgICAgICAgICAge1x2b2Zmc2V0fXtcaG9mZnNldH0lCisgICAgICAgICAgICAgICAgICAgIHtcYmluZGluZ29mZnNldH17OHB0fSUKKyAgICAgICAgICAgICAgICAgICAgezIxMG1tfXsxNDhtbX0lCisgICUKKyAgXGxpc3BuYXJyb3dpbmcgPSAwLjJpbgorICBcdG9sZXJhbmNlID0gODAwCisgIFxoZnV6eiA9IDEuMnB0CisgIFxjb250ZW50c3JpZ2h0bWFyZ2luID0gMHB0CisgIFxkZWZib2R5aW5kZW50ID0gMm1tCisgIFx0YWJsZWluZGVudCA9IDEybW0KK319CisKKyUgQSBzcGVjaWZpYyB0ZXh0IGxheW91dCwgMjR4MTVjbSBvdmVyYWxsLCBpbnRlbmRlZCBmb3IgQTQgcGFwZXIuCitcZGVmXGFmb3VybGF0ZXh7e1xnbG9iYWxkZWZzID0gMQorICBcYWZvdXJwYXBlcgorICBcaW50ZXJuYWxwYWdlc2l6ZXN7MjM3bW19ezE1MG1tfSUKKyAgICAgICAgICAgICAgICAgICAge1x2b2Zmc2V0fXs0LjZtbX0lCisgICAgICAgICAgICAgICAgICAgIHtcYmluZGluZ29mZnNldH17N21tfSUKKyAgICAgICAgICAgICAgICAgICAgezI5N21tfXsyMTBtbX0lCisgICUKKyAgJSBNdXN0IGV4cGxpY2l0bHkgcmVzZXQgdG8gMCBiZWNhdXNlIHdlIGNhbGwgXGFmb3VycGFwZXIuCisgIFxnbG9iYWxkZWZzID0gMAorfX0KKworJSBVc2UgQGFmb3Vyd2lkZSB0byBwcmludCBvbiBBNCBwYXBlciBpbiBsYW5kc2NhcGUgZm9ybWF0LgorXGRlZlxhZm91cndpZGV7e1xnbG9iYWxkZWZzID0gMQorICBcYWZvdXJwYXBlcgorICBcaW50ZXJuYWxwYWdlc2l6ZXN7MjQxbW19ezE2NW1tfSUKKyAgICAgICAgICAgICAgICAgICAge1x2b2Zmc2V0fXstMi45NW1tfSUKKyAgICAgICAgICAgICAgICAgICAge1xiaW5kaW5nb2Zmc2V0fXs3bW19JQorICAgICAgICAgICAgICAgICAgICB7Mjk3bW19ezIxMG1tfSUKKyAgXGdsb2JhbGRlZnMgPSAwCit9fQorCislIEBwYWdlc2l6ZXMgVEVYVEhFSUdIVFssVEVYVFdJRFRIXQorJSBQZXJoYXBzIHdlIHNob3VsZCBhbGxvdyBzZXR0aW5nIHRoZSBtYXJnaW5zLCBcdG9wc2tpcCwgXHBhcnNraXAsCislIGFuZC9vciBsZWFkaW5nLCBhbHNvLiBPciBwZXJoYXBzIHdlIHNob3VsZCBjb21wdXRlIHRoZW0gc29tZWhvdy4KKyUKK1xwYXJzZWFyZ2RlZlxwYWdlc2l6ZXN7XHBhZ2VzaXplc3l5eSAjMSwsXGZpbmlzaH0KK1xkZWZccGFnZXNpemVzeXl5IzEsIzIsIzNcZmluaXNoe3slCisgIFxzZXRib3gwID0gXGhib3h7XGlnbm9yZXNwYWNlcyAjMn1caWZkaW1cd2QwID4gMHB0IFxoc2l6ZT0jMlxyZWxheCBcZmkKKyAgXGdsb2JhbGRlZnMgPSAxCisgICUKKyAgXHBhcnNraXAgPSAzcHQgcGx1cyAycHQgbWludXMgMXB0CisgIFxzZXRsZWFkaW5ne1x0ZXh0bGVhZGluZ30lCisgICUKKyAgXGRpbWVuMCA9ICMxCisgIFxhZHZhbmNlXGRpbWVuMCBieSBcdm9mZnNldAorICAlCisgIFxkaW1lbjIgPSBcaHNpemUKKyAgXGFkdmFuY2VcZGltZW4yIGJ5IFxub3JtYWxvZmZzZXQKKyAgJQorICBcaW50ZXJuYWxwYWdlc2l6ZXN7IzF9e1xoc2l6ZX0lCisgICAgICAgICAgICAgICAgICAgIHtcdm9mZnNldH17XG5vcm1hbG9mZnNldH0lCisgICAgICAgICAgICAgICAgICAgIHtcYmluZGluZ29mZnNldH17NDRwdH0lCisgICAgICAgICAgICAgICAgICAgIHtcZGltZW4wfXtcZGltZW4yfSUKK319CisKKyUgU2V0IGRlZmF1bHQgdG8gbGV0dGVyLgorJQorXGxldHRlcnBhcGVyCisKKworXG1lc3NhZ2V7YW5kIHR1cm5pbmcgb24gdGV4aW5mbyBpbnB1dCBmb3JtYXQufQorCislIERlZmluZSBtYWNyb3MgdG8gb3V0cHV0IHZhcmlvdXMgY2hhcmFjdGVycyB3aXRoIGNhdGNvZGUgZm9yIG5vcm1hbCB0ZXh0LgorXGNhdGNvZGVgXCI9XG90aGVyCitcY2F0Y29kZWBcfj1cb3RoZXIKK1xjYXRjb2RlYFxePVxvdGhlcgorXGNhdGNvZGVgXF89XG90aGVyCitcY2F0Y29kZWBcfD1cb3RoZXIKK1xjYXRjb2RlYFw8PVxvdGhlcgorXGNhdGNvZGVgXD49XG90aGVyCitcY2F0Y29kZWBcKz1cb3RoZXIKK1xjYXRjb2RlYFwkPVxvdGhlcgorXGRlZlxub3JtYWxkb3VibGVxdW90ZXsifQorXGRlZlxub3JtYWx0aWxkZXt+fQorXGRlZlxub3JtYWxjYXJldHtefQorXGRlZlxub3JtYWx1bmRlcnNjb3Jle199CitcZGVmXG5vcm1hbHZlcnRpY2FsYmFye3x9CitcZGVmXG5vcm1hbGxlc3N7PH0KK1xkZWZcbm9ybWFsZ3JlYXRlcns+fQorXGRlZlxub3JtYWxwbHVzeyt9CitcZGVmXG5vcm1hbGRvbGxhcnskfSUkIGZvbnQtbG9jayBmaXgKKworJSBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gbWFrZSBhIGNoYXJhY3RlciBwcmludCBvbmUgd2F5IGluIFx0dAorJSAod2hlcmUgaXQgY2FuIHByb2JhYmx5IGJlIG91dHB1dCBhcy1pcyksIGFuZCBhbm90aGVyIHdheSBpbiBvdGhlciBmb250cywKKyUgd2hlcmUgc29tZXRoaW5nIGhhaXJpZXIgcHJvYmFibHkgbmVlZHMgdG8gYmUgZG9uZS4KKyUKKyUgIzEgaXMgd2hhdCB0byBwcmludCBpZiB3ZSBhcmUgaW5kZWVkIHVzaW5nIFx0dDsgIzIgaXMgd2hhdCB0byBwcmludAorJSBvdGhlcndpc2UuICBTaW5jZSBhbGwgdGhlIENvbXB1dGVyIE1vZGVybiB0eXBld3JpdGVyIGZvbnRzIGhhdmUgemVybworJSBpbnRlcndvcmQgc3RyZXRjaCAoYW5kIHNocmluayksIGFuZCBpdCBpcyByZWFzb25hYmxlIHRvIGV4cGVjdCBhbGwKKyUgdHlwZXdyaXRlciBmb250cyB0byBoYXZlIHRoaXMsIHdlIGNhbiBjaGVjayB0aGF0IGZvbnQgcGFyYW1ldGVyLgorJQorXGRlZlxpZnVzaW5ndHQjMSMye1xpZmRpbSBcZm9udGRpbWVuM1xmb250PTBwdCAjMVxlbHNlICMyXGZpfQorCislIFNhbWUgYXMgYWJvdmUsIGJ1dCBjaGVjayBmb3IgaXRhbGljIGZvbnQuICBBY3R1YWxseSB0aGlzIGFsc28gY2F0Y2hlcworJSBub24taXRhbGljIHNsYW50ZWQgZm9udHMgc2luY2UgaXQgaXMgaW1wb3NzaWJsZSB0byBkaXN0aW5ndWlzaCB0aGVtIGZyb20KKyUgaXRhbGljIGZvbnRzLiAgQnV0IHNpbmNlIHRoaXMgaXMgb25seSB1c2VkIGJ5ICQgYW5kIGl0IHVzZXMgXHNsIGFueXdheQorJSB0aGlzIGlzIG5vdCBhIHByb2JsZW0uCitcZGVmXGlmdXNpbmdpdCMxIzJ7XGlmZGltIFxmb250ZGltZW4xXGZvbnQ+MHB0ICMxXGVsc2UgIzJcZml9CisKKyUgVHVybiBvZmYgYWxsIHNwZWNpYWwgY2hhcmFjdGVycyBleGNlcHQgQAorJSAoYW5kIHRob3NlIHdoaWNoIHRoZSB1c2VyIGNhbiB1c2UgYXMgaWYgdGhleSB3ZXJlIG9yZGluYXJ5KS4KKyUgTW9zdCBvZiB0aGVzZSB3ZSBzaW1wbHkgcHJpbnQgZnJvbSB0aGUgXHR0IGZvbnQsIGJ1dCBmb3Igc29tZSwgd2UgY2FuCislIHVzZSBtYXRoIG9yIG90aGVyIHZhcmlhbnRzIHRoYXQgbG9vayBiZXR0ZXIgaW4gbm9ybWFsIHRleHQuCisKK1xjYXRjb2RlYFwiPVxhY3RpdmUKK1xkZWZcYWN0aXZlZG91YmxlcXVvdGV7e1x0dFxjaGFyMzR9fQorXGxldCI9XGFjdGl2ZWRvdWJsZXF1b3RlCitcY2F0Y29kZWBcfj1cYWN0aXZlCitcZGVmfnt7XHR0XGNoYXIxMjZ9fQorXGNoYXJkZWZcaGF0PWBcXgorXGNhdGNvZGVgXF49XGFjdGl2ZQorXGRlZl57e1x0dCBcaGF0fX0KKworXGNhdGNvZGVgXF89XGFjdGl2ZQorXGRlZl97XGlmdXNpbmd0dFxub3JtYWx1bmRlcnNjb3JlXF99CislIFN1YnJvdXRpbmUgZm9yIHRoZSBwcmV2aW91cyBtYWNyby4KK1xkZWZcX3tcbGVhdmV2bW9kZSBca2Vybi4wN2VtIFx2Ym94e1xocnVsZSB3aWR0aC4zZW0gaGVpZ2h0LjFleH1ca2VybiAuMDdlbSB9CisKK1xjYXRjb2RlYFx8PVxhY3RpdmUKK1xkZWZ8e3tcdHRcY2hhcjEyNH19CitcY2hhcmRlZiBcbGVzcz1gXDwKK1xjYXRjb2RlYFw8PVxhY3RpdmUKK1xkZWY8e3tcdHQgXGxlc3N9fQorXGNoYXJkZWYgXGd0cj1gXD4KK1xjYXRjb2RlYFw+PVxhY3RpdmUKK1xkZWY+e3tcdHQgXGd0cn19CitcY2F0Y29kZWBcKz1cYWN0aXZlCitcZGVmK3t7XHR0IFxjaGFyIDQzfX0KK1xjYXRjb2RlYFwkPVxhY3RpdmUKK1xkZWYke1xpZnVzaW5naXR7e1xzbFwkfX1cbm9ybWFsZG9sbGFyfSUkIGZvbnQtbG9jayBmaXgKKworJSBJZiBhIC5mbXQgZmlsZSBpcyBiZWluZyB1c2VkLCBjaGFyYWN0ZXJzIHRoYXQgbWlnaHQgYXBwZWFyIGluIGEgZmlsZQorJSBuYW1lIGNhbm5vdCBiZSBhY3RpdmUgdW50aWwgd2UgaGF2ZSBwYXJzZWQgdGhlIGNvbW1hbmQgbGluZS4KKyUgU28gdHVybiB0aGVtIG9mZiBhZ2FpbiwgYW5kIGhhdmUgXGV2ZXJ5am9iIChvciBAc2V0ZmlsZW5hbWUpIHR1cm4gdGhlbSBvbi4KKyUgXG90aGVyaWZ5YWN0aXZlIGlzIGNhbGxlZCBuZWFyIHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorXGRlZlxvdGhlcmlmeWFjdGl2ZXtcY2F0Y29kZWArPVxvdGhlciBcY2F0Y29kZWBcXz1cb3RoZXJ9CisKK1xjYXRjb2RlYFxAPTAKKworJSBcYmFja3NsYXNoY3VyZm9udCBvdXRwdXRzIG9uZSBiYWNrc2xhc2ggY2hhcmFjdGVyIGluIGN1cnJlbnQgZm9udCwKKyUgYXMgaW4gXGNoYXJgXFwuCitcZ2xvYmFsXGNoYXJkZWZcYmFja3NsYXNoY3VyZm9udD1gXFwKK1xnbG9iYWxcbGV0XHJhd2JhY2tzbGFzaHh4PVxiYWNrc2xhc2hjdXJmb250ICAlIGxldCBleGlzdGluZyAuPz9zIGZpbGVzIHdvcmsKKworJSBccmF3YmFja3NsYXNoIGRlZmluZXMgYW4gYWN0aXZlIFwgdG8gZG8gXGJhY2tzbGFzaGN1cmZvbnQuCislIFxvdGhlcmJhY2tzbGFzaCBkZWZpbmVzIGFuIGFjdGl2ZSBcIHRvIGJlIGEgbGl0ZXJhbCBgXCcgY2hhcmFjdGVyIHdpdGgKKyUgY2F0Y29kZSBvdGhlci4KK3tcY2F0Y29kZWBcXD1cYWN0aXZlCisgQGdkZWZAcmF3YmFja3NsYXNoe0BsZXRcPUBiYWNrc2xhc2hjdXJmb250fQorIEBnZGVmQG90aGVyYmFja3NsYXNoe0BsZXRcPUByZWFsYmFja3NsYXNofQorfQorCislIFxyZWFsYmFja3NsYXNoIGlzIGFuIGFjdHVhbCBjaGFyYWN0ZXIgYFwnIHdpdGggY2F0Y29kZSBvdGhlci4KK3tcY2F0Y29kZWBcXD1cb3RoZXIgQGdkZWZAcmVhbGJhY2tzbGFzaHtcfX0KKworJSBcbm9ybWFsYmFja3NsYXNoIG91dHB1dHMgb25lIGJhY2tzbGFzaCBpbiBmaXhlZCB3aWR0aCBmb250LgorXGRlZlxub3JtYWxiYWNrc2xhc2h7e1x0dFxiYWNrc2xhc2hjdXJmb250fX0KKworXGNhdGNvZGVgXFw9XGFjdGl2ZQorCislIFVzZWQgc29tZXRpbWVzIHRvIHR1cm4gb2ZmIChlZmZlY3RpdmVseSkgdGhlIGFjdGl2ZSBjaGFyYWN0ZXJzCislIGV2ZW4gYWZ0ZXIgcGFyc2luZyB0aGVtLgorQGRlZkB0dXJub2ZmYWN0aXZleyUKKyAgQGxldCI9QG5vcm1hbGRvdWJsZXF1b3RlCisgIEBsZXRcPUByZWFsYmFja3NsYXNoCisgIEBsZXR+PUBub3JtYWx0aWxkZQorICBAbGV0Xj1Abm9ybWFsY2FyZXQKKyAgQGxldF89QG5vcm1hbHVuZGVyc2NvcmUKKyAgQGxldHw9QG5vcm1hbHZlcnRpY2FsYmFyCisgIEBsZXQ8PUBub3JtYWxsZXNzCisgIEBsZXQ+PUBub3JtYWxncmVhdGVyCisgIEBsZXQrPUBub3JtYWxwbHVzCisgIEBsZXQkPUBub3JtYWxkb2xsYXIgJSQgZm9udC1sb2NrIGZpeAorICBAdW5zZXBzcGFjZXMKK30KKworJSBTYW1lIGFzIEB0dXJub2ZmYWN0aXZlIGV4Y2VwdCBvdXRwdXRzIFwgYXMge1x0dFxjaGFyYFxcfSBpbnN0ZWFkIG9mCislIHRoZSBsaXRlcmFsIGNoYXJhY3RlciBgXCcuICAoVGh1cywgXCBpcyBub3QgZXhwYW5kYWJsZSB3aGVuIHRoaXMgaXMgaW4KKyUgZWZmZWN0LikKKyUKK0BkZWZAbm9ybWFsdHVybm9mZmFjdGl2ZXtAdHVybm9mZmFjdGl2ZSBAbGV0XD1Abm9ybWFsYmFja3NsYXNofQorCislIE1ha2UgXyBhbmQgKyBcb3RoZXIgY2hhcmFjdGVycywgdGVtcG9yYXJpbHkuCislIFRoaXMgaXMgY2FuY2VsZWQgYnkgQGZpeGJhY2tzbGFzaC4KK0BvdGhlcmlmeWFjdGl2ZQorCislIElmIGEgLmZtdCBmaWxlIGlzIGJlaW5nIHVzZWQsIHdlIGRvbid0IHdhbnQgdGhlIGBcaW5wdXQgdGV4aW5mbycgdG8gc2hvdyB1cC4KKyUgVGhhdCBpcyB3aGF0IFxlYXRpbnB1dCBpcyBmb3I7IGFmdGVyIHRoYXQsIHRoZSBgXCcgc2hvdWxkIHJldmVydCB0byBwcmludGluZworJSBhIGJhY2tzbGFzaC4KKyUKK0BnZGVmQGVhdGlucHV0IGlucHV0IHRleGluZm97QGZpeGJhY2tzbGFzaH0KK0BnbG9iYWxAbGV0XCA9IEBlYXRpbnB1dAorCislIE9uIHRoZSBvdGhlciBoYW5kLCBwZXJoYXBzIHRoZSBmaWxlIGRpZCBub3QgaGF2ZSBhIGBcaW5wdXQgdGV4aW5mbycuIFRoZW4KKyUgdGhlIGZpcnN0IGBceyBpbiB0aGUgZmlsZSB3b3VsZCBjYXVzZSBhbiBlcnJvci4gVGhpcyBtYWNybyB0cmllcyB0byBmaXgKKyUgdGhhdCwgYXNzdW1pbmcgaXQgaXMgY2FsbGVkIGJlZm9yZSB0aGUgZmlyc3QgYFwnIGNvdWxkIHBsYXVzaWJseSBvY2N1ci4KKyUgQWxzbyBiYWNrIHR1cm4gb24gYWN0aXZlIGNoYXJhY3RlcnMgdGhhdCBtaWdodCBhcHBlYXIgaW4gdGhlIGlucHV0CislIGZpbGUgbmFtZSwgaW4gY2FzZSBub3QgdXNpbmcgYSBwcmUtZHVtcGVkIGZvcm1hdC4KKyUKK0BnZGVmQGZpeGJhY2tzbGFzaHslCisgIEBpZnhcQGVhdGlucHV0IEBsZXRcID0gQG5vcm1hbGJhY2tzbGFzaCBAZmkKKyAgQGNhdGNvZGVgKz1AYWN0aXZlCisgIEBjYXRjb2RlYEBfPUBhY3RpdmUKK30KKworJSBTYXkgQGZvbywgbm90IFxmb28sIGluIGVycm9yIG1lc3NhZ2VzLgorQGVzY2FwZWNoYXIgPSBgQEAKKworJSBUaGVzZSBsb29rIG9rIGluIGFsbCBmb250cywgc28ganVzdCBtYWtlIHRoZW0gbm90IHNwZWNpYWwuCitAY2F0Y29kZWBAJiA9IEBvdGhlcgorQGNhdGNvZGVgQCMgPSBAb3RoZXIKK0BjYXRjb2RlYEAlID0gQG90aGVyCisKKworQGMgTG9jYWwgdmFyaWFibGVzOgorQGMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorQGMgcGFnZS1kZWxpbWl0ZXI6ICJeXFxcXG1lc3NhZ2UiCitAYyB0aW1lLXN0YW1wLXN0YXJ0OiAiZGVmXFxcXHRleGluZm92ZXJzaW9ueyIKK0BjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgorQGMgdGltZS1zdGFtcC1lbmQ6ICJ9IgorQGMgRW5kOgorCitAYyB2aW06c3c9MjoKKworQGlnbm9yZQorICAgYXJjaC10YWc6IGUxYjM2ZTMyLWM5NmUtNDEzNS1hNDFhLTBiMmVmYTJlYTExNQorQGVuZCBpZ25vcmUKZGlmZiAtLWdpdCBhL2RvY3MvdmVyc2lvbi50ZXhpIGIvZG9jcy92ZXJzaW9uLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk3ZGUyNAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvdmVyc2lvbi50ZXhpCkBAIC0wLDAgKzEsNCBAQAorQHNldCBVUERBVEVEIDggTWF5IDIwMDUKK0BzZXQgVVBEQVRFRC1NT05USCBNYXkgMjAwNQorQHNldCBFRElUSU9OIDAuOTcKK0BzZXQgVkVSU0lPTiAwLjk3CmRpZmYgLS1naXQgYS9ncnViL01ha2VmaWxlLmFtIGIvZ3J1Yi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWIyZWFhCi0tLSAvZGV2L251bGwKKysrIGIvZ3J1Yi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE5IEBACitzYmluX1BST0dSQU1TID0gZ3J1YgorCitpZiBTRVJJQUxfU1BFRURfU0lNVUxBVElPTgorU0VSSUFMX0ZMQUdTID0gLURTVVBQT1JUX1NFUklBTD0xIC1EU0lNVUxBVEVfU0xPV05FU1NfT0ZfU0VSSUFMPTEKK2Vsc2UKK1NFUklBTF9GTEFHUyA9IC1EU1VQUE9SVF9TRVJJQUw9MSAKK2VuZGlmCisKK0FNX0NQUEZMQUdTID0gLURHUlVCX1VUSUw9MSAtREZTWVNfRVhUMkZTPTEgLURGU1lTX0ZBVD0xIC1ERlNZU19GRlM9MSBcCisJLURGU1lTX0lTTzk2NjA9MSAtREZTWVNfSkZTPTEgLURGU1lTX01JTklYPTEgLURGU1lTX1JFSVNFUkZTPTEgXAorCS1ERlNZU19VRlMyPTEgLURGU1lTX1ZTVEFGUz0xIC1ERlNZU19YRlM9MSBcCisJLURVU0VfTUQ1X1BBU1NXT1JEUz0xIC1EU1VQUE9SVF9IRVJDVUxFUz0xIFwKKwkkKFNFUklBTF9GTEFHUykgLUkkKHRvcF9zcmNkaXIpL3N0YWdlMiBcCisJLUkkKHRvcF9zcmNkaXIpL3N0YWdlMSAtSSQodG9wX3NyY2RpcikvbGliCisKK0FNX0NGTEFHUyA9ICQoR1JVQl9DRkxBR1MpCisKK2dydWJfU09VUkNFUyA9IG1haW4uYyBhc21zdHViLmMKK2dydWJfTERBREQgPSAuLi9zdGFnZTIvbGliZ3J1Yi5hICAuLi9saWIvbGliY29tbW9uLmEgJChHUlVCX0xJQlMpCmRpZmYgLS1naXQgYS9ncnViL01ha2VmaWxlLmluIGIvZ3J1Yi9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzZjMzhmCi0tLSAvZGV2L251bGwKKysrIGIvZ3J1Yi9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDQ0NSBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS45LjQgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCitTT1VSQ0VTID0gJChncnViX1NPVVJDRVMpCisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitWUEFUSCA9IEBzcmNkaXJACitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAordG9wX2J1aWxkZGlyID0gLi4KK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK0lOU1RBTEwgPSBASU5TVEFMTEAKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK3NiaW5fUFJPR1JBTVMgPSBncnViJChFWEVFWFQpCitzdWJkaXIgPSBncnViCitESVNUX0NPTU1PTiA9ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4KK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjaW5jbHVkZS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycworQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK2FtX19pbnN0YWxsZGlycyA9ICIkKERFU1RESVIpJChzYmluZGlyKSIKK3NiaW5QUk9HUkFNU19JTlNUQUxMID0gJChJTlNUQUxMX1BST0dSQU0pCitQUk9HUkFNUyA9ICQoc2Jpbl9QUk9HUkFNUykKK2FtX2dydWJfT0JKRUNUUyA9IG1haW4uJChPQkpFWFQpIGFzbXN0dWIuJChPQkpFWFQpCitncnViX09CSkVDVFMgPSAkKGFtX2dydWJfT0JKRUNUUykKK2FtX19ERVBFTkRFTkNJRVNfMSA9CitncnViX0RFUEVOREVOQ0lFUyA9IC4uL3N0YWdlMi9saWJncnViLmEgLi4vbGliL2xpYmNvbW1vbi5hIFwKKwkkKGFtX19ERVBFTkRFTkNJRVNfMSkKK0RFRkFVTFRfSU5DTFVERVMgPSAtSS4gLUkkKHNyY2RpcikgLUkkKHRvcF9idWlsZGRpcikKK2RlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKK2FtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCitDT01QSUxFID0gJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpIFwKKwkkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitDQ0xEID0gJChDQykKK0xJTksgPSAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACitTT1VSQ0VTID0gJChncnViX1NPVVJDRVMpCitESVNUX1NPVVJDRVMgPSAkKGdydWJfU09VUkNFUykKK0VUQUdTID0gZXRhZ3MKK0NUQUdTID0gY3RhZ3MKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBTURFUF9GQUxTRSA9IEBBTURFUF9GQUxTRUAKK0FNREVQX1RSVUUgPSBAQU1ERVBfVFJVRUAKK0FNVEFSID0gQEFNVEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitCVUlMRF9FWEFNUExFX0tFUk5FTF9GQUxTRSA9IEBCVUlMRF9FWEFNUExFX0tFUk5FTF9GQUxTRUAKK0JVSUxEX0VYQU1QTEVfS0VSTkVMX1RSVUUgPSBAQlVJTERfRVhBTVBMRV9LRVJORUxfVFJVRUAKK0NDID0gQENDQAorQ0NBUyA9IEBDQ0FTQAorQ0NBU0ZMQUdTID0gQENDQVNGTEFHU0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitESVNLTEVTU19TVVBQT1JUX0ZBTFNFID0gQERJU0tMRVNTX1NVUFBPUlRfRkFMU0VACitESVNLTEVTU19TVVBQT1JUX1RSVUUgPSBARElTS0xFU1NfU1VQUE9SVF9UUlVFQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRlNZU19DRkxBR1MgPSBARlNZU19DRkxBR1NACitHUlVCX0NGTEFHUyA9IEBHUlVCX0NGTEFHU0AKK0dSVUJfTElCUyA9IEBHUlVCX0xJQlNACitIRVJDVUxFU19TVVBQT1JUX0ZBTFNFID0gQEhFUkNVTEVTX1NVUFBPUlRfRkFMU0VACitIRVJDVUxFU19TVVBQT1JUX1RSVUUgPSBASEVSQ1VMRVNfU1VQUE9SVF9UUlVFQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMREZMQUdTID0gQExERkxBR1NACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUlOVEFJTkVSX01PREVfRkFMU0UgPSBATUFJTlRBSU5FUl9NT0RFX0ZBTFNFQAorTUFJTlRBSU5FUl9NT0RFX1RSVUUgPSBATUFJTlRBSU5FUl9NT0RFX1RSVUVACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK05FVEJPT1RfRFJJVkVSUyA9IEBORVRCT09UX0RSSVZFUlNACitORVRCT09UX1NVUFBPUlRfRkFMU0UgPSBATkVUQk9PVF9TVVBQT1JUX0ZBTFNFQAorTkVUQk9PVF9TVVBQT1JUX1RSVUUgPSBATkVUQk9PVF9TVVBQT1JUX1RSVUVACitORVRfQ0ZMQUdTID0gQE5FVF9DRkxBR1NACitORVRfRVhUUkFGTEFHUyA9IEBORVRfRVhUUkFGTEFHU0AKK09CSkNPUFkgPSBAT0JKQ09QWUAKK09CSkVYVCA9IEBPQkpFWFRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAorUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACitQRVJMID0gQFBFUkxACitSQU5MSUIgPSBAUkFOTElCQAorU0VSSUFMX1NQRUVEX1NJTVVMQVRJT05fRkFMU0UgPSBAU0VSSUFMX1NQRUVEX1NJTVVMQVRJT05fRkFMU0VACitTRVJJQUxfU1BFRURfU0lNVUxBVElPTl9UUlVFID0gQFNFUklBTF9TUEVFRF9TSU1VTEFUSU9OX1RSVUVACitTRVJJQUxfU1VQUE9SVF9GQUxTRSA9IEBTRVJJQUxfU1VQUE9SVF9GQUxTRUAKK1NFUklBTF9TVVBQT1JUX1RSVUUgPSBAU0VSSUFMX1NVUFBPUlRfVFJVRUAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTVEFHRTFfQ0ZMQUdTID0gQFNUQUdFMV9DRkxBR1NACitTVEFHRTJfQ0ZMQUdTID0gQFNUQUdFMl9DRkxBR1NACitTVFJJUCA9IEBTVFJJUEAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfT0JKQ09QWSA9IEBhY19jdF9PQkpDT1BZQAorYWNfY3RfUkFOTElCID0gQGFjX2N0X1JBTkxJQkAKK2FjX2N0X1NUUklQID0gQGFjX2N0X1NUUklQQAorYW1fX2Zhc3RkZXBDQ19GQUxTRSA9IEBhbV9fZmFzdGRlcENDX0ZBTFNFQAorYW1fX2Zhc3RkZXBDQ19UUlVFID0gQGFtX19mYXN0ZGVwQ0NfVFJVRUAKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorZGF0YWRpciA9IEBkYXRhZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwcmVmaXggPSBAcHJlZml4QAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAorQFNFUklBTF9TUEVFRF9TSU1VTEFUSU9OX0ZBTFNFQFNFUklBTF9GTEFHUyA9IC1EU1VQUE9SVF9TRVJJQUw9MSAKK0BTRVJJQUxfU1BFRURfU0lNVUxBVElPTl9UUlVFQFNFUklBTF9GTEFHUyA9IC1EU1VQUE9SVF9TRVJJQUw9MSAtRFNJTVVMQVRFX1NMT1dORVNTX09GX1NFUklBTD0xCitBTV9DUFBGTEFHUyA9IC1ER1JVQl9VVElMPTEgLURGU1lTX0VYVDJGUz0xIC1ERlNZU19GQVQ9MSAtREZTWVNfRkZTPTEgXAorCS1ERlNZU19JU085NjYwPTEgLURGU1lTX0pGUz0xIC1ERlNZU19NSU5JWD0xIC1ERlNZU19SRUlTRVJGUz0xIFwKKwktREZTWVNfVUZTMj0xIC1ERlNZU19WU1RBRlM9MSAtREZTWVNfWEZTPTEgXAorCS1EVVNFX01ENV9QQVNTV09SRFM9MSAtRFNVUFBPUlRfSEVSQ1VMRVM9MSBcCisJJChTRVJJQUxfRkxBR1MpIC1JJCh0b3Bfc3JjZGlyKS9zdGFnZTIgXAorCS1JJCh0b3Bfc3JjZGlyKS9zdGFnZTEgLUkkKHRvcF9zcmNkaXIpL2xpYgorCitBTV9DRkxBR1MgPSAkKEdSVUJfQ0ZMQUdTKQorZ3J1Yl9TT1VSQ0VTID0gbWFpbi5jIGFzbXN0dWIuYworZ3J1Yl9MREFERCA9IC4uL3N0YWdlMi9saWJncnViLmEgIC4uL2xpYi9saWJjb21tb24uYSAkKEdSVUJfTElCUykKK2FsbDogYWxsLWFtCisKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLmMgLm8gLm9iagorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoIFwKKwkJJiYgZXhpdCAwOyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSAgZ3J1Yi9NYWtlZmlsZSc7IFwKKwljZCAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZ251ICBncnViL01ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCitpbnN0YWxsLXNiaW5QUk9HUkFNUzogJChzYmluX1BST0dSQU1TKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQoc2JpbmRpcikiIHx8ICQobWtkaXJfcCkgIiQoREVTVERJUikkKHNiaW5kaXIpIgorCUBsaXN0PSckKHNiaW5fUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBwMT1gZWNobyAkJHB8c2VkICdzLyQoRVhFRVhUKSQkLy8nYDsgXAorCSAgaWYgdGVzdCAtZiAkJHAgXAorCSAgOyB0aGVuIFwKKwkgICAgZj1gZWNobyAiJCRwMSIgfCBzZWQgJ3MsXi4qLywsOyQodHJhbnNmb3JtKTtzLyQkLyQoRVhFRVhUKS8nYDsgXAorCSAgIGVjaG8gIiAkKElOU1RBTExfUFJPR1JBTV9FTlYpICQoc2JpblBST0dSQU1TX0lOU1RBTEwpICckJHAnICckKERFU1RESVIpJChzYmluZGlyKS8kJGYnIjsgXAorCSAgICQoSU5TVEFMTF9QUk9HUkFNX0VOVikgJChzYmluUFJPR1JBTVNfSU5TVEFMTCkgIiQkcCIgIiQoREVTVERJUikkKHNiaW5kaXIpLyQkZiIgfHwgZXhpdCAxOyBcCisJICBlbHNlIDo7IGZpOyBcCisJZG9uZQorCit1bmluc3RhbGwtc2JpblBST0dSQU1TOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQoc2Jpbl9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGY9YGVjaG8gIiQkcCIgfCBzZWQgJ3MsXi4qLywsO3MvJChFWEVFWFQpJCQvLzskKHRyYW5zZm9ybSk7cy8kJC8kKEVYRUVYVCkvJ2A7IFwKKwkgIGVjaG8gIiBybSAtZiAnJChERVNURElSKSQoc2JpbmRpcikvJCRmJyI7IFwKKwkgIHJtIC1mICIkKERFU1RESVIpJChzYmluZGlyKS8kJGYiOyBcCisJZG9uZQorCitjbGVhbi1zYmluUFJPR1JBTVM6CisJLXRlc3QgLXogIiQoc2Jpbl9QUk9HUkFNUykiIHx8IHJtIC1mICQoc2Jpbl9QUk9HUkFNUykKK2dydWIkKEVYRUVYVCk6ICQoZ3J1Yl9PQkpFQ1RTKSAkKGdydWJfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgZ3J1YiQoRVhFRVhUKQorCSQoTElOSykgJChncnViX0xERkxBR1MpICQoZ3J1Yl9PQkpFQ1RTKSAkKGdydWJfTERBREQpICQoTElCUykKKworbW9zdGx5Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi4kKE9CSkVYVCkKKworZGlzdGNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICoudGFiLmMKKworQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2FzbXN0dWIuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21haW4uUG9AYW1fX3F1b3RlQAorCisuYy5vOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgIiQoREVQRElSKS8kKi5UcG8iIC1jIC1vICRAICQ8OyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvJCouVHBvIiAiJChERVBESVIpLyQqLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpLyQqLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jICQ8CisKKy5jLm9iajoKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICIkKERFUERJUikvJCouVHBvIiAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvJCouVHBvIiAiJChERVBESVIpLyQqLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpLyQqLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKK3VuaW5zdGFsbC1pbmZvLWFtOgorCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiBUQUdTCisKK1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgJCR0YWdzICQkdW5pcXVlOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIiBcCisJICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCisJICAgICAkJHRhZ3MgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmIGNkICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAkJGhlcmUKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IGZvciBmaWxlIGluICQkbGlzdDsgZG8gXAorCSAgY2FzZSAkJGZpbGUgaW4gXAorCSAgICAkKHNyY2RpcikvKikgZmlsZT1gZWNobyAiJCRmaWxlIiB8IHNlZCAic3xeJCRzcmNkaXJzdHJpcC98fCJgOzsgXAorCSAgICAkKHRvcF9zcmNkaXIpLyopIGZpbGU9YGVjaG8gIiQkZmlsZSIgfCBzZWQgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98ImA7OyBcCisJICBlc2FjOyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBkaXI9YGVjaG8gIiQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICBpZiB0ZXN0ICIkJGRpciIgIT0gIiQkZmlsZSIgJiYgdGVzdCAiJCRkaXIiICE9ICIuIjsgdGhlbiBcCisJICAgIGRpcj0iLyQkZGlyIjsgXAorCSAgICAkKG1rZGlyX3ApICIkKGRpc3RkaXIpJCRkaXIiOyBcCisJICBlbHNlIFwKKwkgICAgZGlyPScnOyBcCisJICBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLXBSICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpCitpbnN0YWxsZGlyczoKKwlmb3IgZGlyIGluICIkKERFU1RESVIpJChzYmluZGlyKSI7IGRvIFwKKwkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKG1rZGlyX3ApICIkJGRpciI7IFwKKwlkb25lCitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorY2xlYW46IGNsZWFuLWFtCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLXNiaW5QUk9HUkFNUyBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLXNiaW5QUk9HUkFNUworCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCisJLXJtIC1yZiAuLyQoREVQRElSKQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYworCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtaW5mby1hbSB1bmluc3RhbGwtc2JpblBST0dSQU1TCisKKy5QSE9OWTogQ1RBR1MgR1RBR1MgYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIFwKKwljbGVhbi1zYmluUFJPR1JBTVMgY3RhZ3MgZGlzdGNsZWFuIGRpc3RjbGVhbi1jb21waWxlIFwKKwlkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tdGFncyBkaXN0ZGlyIGR2aSBkdmktYW0gaHRtbCBcCisJaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtZGF0YSBcCisJaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1pbmZvIFwKKwlpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gaW5zdGFsbC1zYmluUFJPR1JBTVMgaW5zdGFsbC1zdHJpcCBcCisJaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBtYWludGFpbmVyLWNsZWFuIFwKKwltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tY29tcGlsZSBcCisJbW9zdGx5Y2xlYW4tZ2VuZXJpYyBwZGYgcGRmLWFtIHBzIHBzLWFtIHRhZ3MgdW5pbnN0YWxsIFwKKwl1bmluc3RhbGwtYW0gdW5pbnN0YWxsLWluZm8tYW0gdW5pbnN0YWxsLXNiaW5QUk9HUkFNUworCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9ncnViL2FzbXN0dWIuYyBiL2dydWIvYXNtc3R1Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOTViNGIKLS0tIC9kZXYvbnVsbAorKysgYi9ncnViL2FzbXN0dWIuYwpAQCAtMCwwICsxLDEyNzUgQEAKKy8qIGFzbXN0dWIuYyAtIGEgdmVyc2lvbiBvZiBzaGFyZWRfc3JjL2FzbS5TIHRoYXQgd29ya3MgdW5kZXIgVW5peCAqLworLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSwyMDAyLDIwMDQgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyogVHJ5IHRvIHVzZSBnbGliYydzIHRyYW5zcGFyYW50IExGUyBzdXBwb3J0LiAqLworI2RlZmluZSBfTEFSR0VGSUxFX1NPVVJDRQkxCisvKiBsc2VlayBiZWNvbWVzIHN5bm9ueW1vdXMgd2l0aCBsc2VlazY0LiAgKi8KKyNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVFMJNjQKKworLyogU2ltdWxhdG9yIGVudHJ5IHBvaW50LiAqLworaW50IGdydWJfc3RhZ2UyICh2b2lkKTsKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpZmRlZiBfX2xpbnV4X18KKyMgaW5jbHVkZSA8c3lzL2lvY3RsLmg+CQkvKiBpb2N0bCAqLworIyBpZiAhZGVmaW5lZChfX0dMSUJDX18pIHx8IFwKKwkoKF9fR0xJQkNfXyA8IDIpIHx8ICgoX19HTElCQ19fID09IDIpICYmIChfX0dMSUJDX01JTk9SX18gPCAxKSkpCisvKiBNYXliZSBsaWJjIGRvZXNuJ3QgaGF2ZSBsYXJnZSBmaWxlIHN1cHBvcnQuICAqLworIyAgaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CS8qIF9sbHNlZWsgKi8KKyMgZW5kaWYgLyogKEdMSUJDIDwgMikgfHwgKChfX0dMSUJDX18gPT0gMikgJiYgKF9fR0xJQkNfTUlOT1IgPCAxKSkgKi8KKyMgaWZuZGVmIEJMS0ZMU0JVRgorIyAgZGVmaW5lIEJMS0ZMU0JVRglfSU8gKDB4MTIsOTcpCS8qIGZsdXNoIGJ1ZmZlciBjYWNoZSAqLworIyBlbmRpZiAvKiAhIEJMS0ZMU0JVRiAqLworI2VuZGlmIC8qIF9fbGludXhfXyAqLworCisvKiBXZSB3YW50IHRvIHByZXZlbnQgYW55IGNpcmN1bGFyYXJhcml0eSBpbiBvdXIgc3R1YnMsIGFzIHdlbGwgYXMKKyAgIGxpYmMgbmFtZSBjbGFzaGVzLiAqLworI2RlZmluZSBXSVRIT1VUX0xJQkNfU1RVQlMgMQorI2luY2x1ZGUgPHNoYXJlZC5oPgorI2luY2x1ZGUgPGRldmljZS5oPgorI2luY2x1ZGUgPHNlcmlhbC5oPgorI2luY2x1ZGUgPHRlcm0uaD4KKworLyogU2ltdWxhdGVkIG1lbW9yeSBzaXplcy4gKi8KKyNkZWZpbmUgRVhURU5ERURfTUVNU0laRSAoMyAqIDEwMjQgKiAxMDI0KQkvKiAzTUIgKi8KKyNkZWZpbmUgQ09OVkVOVElPTkFMX01FTVNJWkUgKDY0MCAqIDEwMjQpCS8qIDY0MGtCICovCisKK3Vuc2lnbmVkIGxvbmcgaW5zdGFsbF9wYXJ0aXRpb24gPSAweDIwMDAwOwordW5zaWduZWQgbG9uZyBib290X2RyaXZlID0gMDsKK2ludCBzYXZlZF9lbnRyeW5vID0gMDsKK2NoYXIgdmVyc2lvbl9zdHJpbmdbXSA9IFZFUlNJT047CitjaGFyIGNvbmZpZ19maWxlWzEyOF0gPSAiL2Jvb3QvZ3J1Yi9tZW51LmxzdCI7IC8qIEZJWE1FOiBhcmJpdHJhcnkgKi8KK3Vuc2lnbmVkIGxvbmcgbGludXhfdGV4dF9sZW4gPSAwOworY2hhciAqbGludXhfZGF0YV90bXBfYWRkciA9IDA7CitjaGFyICpsaW51eF9kYXRhX3JlYWxfYWRkciA9IDA7Cit1bnNpZ25lZCBzaG9ydCBpb19tYXBbSU9fTUFQX1NJWkVdOworc3RydWN0IGFwbV9pbmZvIGFwbV9iaW9zX2luZm87CisKKy8qIEVtdWxhdGlvbiByZXF1aXJlbWVudHMuICovCitjaGFyICpncnViX3NjcmF0Y2hfbWVtID0gMDsKKworc3RydWN0IGdlb21ldHJ5ICpkaXNrcyA9IDA7CisKKy8qIFRoZSBtYXAgYmV0d2VlbiBCSU9TIGRyaXZlcyBhbmQgVU5JWCBkZXZpY2UgZmlsZSBuYW1lcy4gICovCitjaGFyICoqZGV2aWNlX21hcCA9IDA7CisKKy8qIFRoZSBqdW1wIGJ1ZmZlciBmb3IgZXhpdGluZyBjb3JyZWN0bHkuICAqLworc3RhdGljIGptcF9idWYgZW52X2Zvcl9leGl0OworCisvKiBUaGUgY3VycmVudCBjb2xvciBmb3IgY29uc29sZS4gICovCitpbnQgY29uc29sZV9jdXJyZW50X2NvbG9yID0gQV9OT1JNQUw7CisKKy8qIFRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIGEgc2VyaWFsIGRldmljZS4gICovCitzdGF0aWMgaW50IHNlcmlhbF9mZCA9IC0xOworCisvKiBUaGUgZmlsZSBuYW1lIG9mIGEgc2VyaWFsIGRldmljZS4gICovCitzdGF0aWMgY2hhciAqc2VyaWFsX2RldmljZSA9IDA7CisKKyNpZmRlZiBTSU1VTEFURV9TTE9XTkVTU19PRl9TRVJJQUwKKy8qIFRoZSBzcGVlZCBvZiBhIHNlcmlhbCBkZXZpY2UuICAqLworc3RhdGljIHVuc2lnbmVkIGludCBzZXJpYWxfc3BlZWQ7CisjZW5kaWYgLyogU0lNVUxBVEVfU0xPV05FU1NfT0ZfU0VSSUFMICovCisKKy8qIFRoZSBtYWluIGVudHJ5IHBvaW50IGludG8gdGhpcyBtZXNzLiAqLworaW50CitncnViX3N0YWdlMiAodm9pZCkKK3sKKyAgLyogVGhlc2UgbmVlZCB0byBiZSBzdGF0aWMsIGJlY2F1c2UgdGhleSBzdXJ2aXZlIG91ciBzdGFjayB0cmFuc2l0aW9ucy4gKi8KKyAgc3RhdGljIGludCBzdGF0dXMgPSAwOworICBzdGF0aWMgY2hhciAqcmVhbHN0YWNrOworICBjaGFyICpzY3JhdGNoLCAqc2ltc3RhY2s7CisgIGludCBpOworCisgIGF1dG8gdm9pZCBkb2l0ICh2b2lkKTsKKyAgCisgIC8qIFdlIG5lZWQgYSBuZXN0ZWQgZnVuY3Rpb24gc28gdGhhdCB3ZSBnZXQgYSBjbGVhbiBzdGFjayBmcmFtZSwKKyAgICAgcmVnYXJkbGVzcyBvZiBob3cgdGhlIGNvZGUgaXMgb3B0aW1pemVkLiAqLworICB2b2lkIGRvaXQgKHZvaWQpCisgICAgeworICAgICAgLyogTWFrZSBzdXJlIG91ciBzdGFjayBsaXZlcyBpbiB0aGUgc2ltdWxhdGVkIG1lbW9yeSBhcmVhLiAqLworICAgICAgYXNtIHZvbGF0aWxlICgibW92bCAlJWVzcCwgJTBcblx0bW92bCAlMSwgJSVlc3BcbiIKKwkJICAgIDogIj0mciIgKHJlYWxzdGFjaykgOiAiciIgKHNpbXN0YWNrKSk7CisgICAgICAKKyAgICAgIC8qIERvIGEgc2V0am1wIGhlcmUgZm9yIHRoZSBzdG9wIGNvbW1hbmQuICAqLworICAgICAgaWYgKCEgc2V0am1wIChlbnZfZm9yX2V4aXQpKQorCXsKKwkgIC8qIEFjdHVhbGx5IGVudGVyIHRoZSBnZW5lcmljIHN0YWdlMiBjb2RlLiAgKi8KKwkgIHN0YXR1cyA9IDA7CisJICBpbml0X2Jpb3NfaW5mbyAoKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogSWYgRVJSTlVNIGlzIG5vbi16ZXJvLCB0aGVuIHNldCBTVEFUVVMgdG8gbm9uLXplcm8uICAqLworCSAgaWYgKGVycm51bSkKKwkgICAgc3RhdHVzID0gMTsKKwl9CisgICAgICAKKyAgICAgIC8qIFJlcGxhY2Ugb3VyIHN0YWNrIGJlZm9yZSB3ZSB1c2UgYW55IGxvY2FsIHZhcmlhYmxlcy4gKi8KKyAgICAgIGFzbSB2b2xhdGlsZSAoIm1vdmwgJTAsICUlZXNwXG4iIDogOiAiciIgKHJlYWxzdGFjaykpOworICAgIH0KKworICBhc3NlcnQgKGdydWJfc2NyYXRjaF9tZW0gPT0gMCk7CisgIHNjcmF0Y2ggPSBtYWxsb2MgKDB4MTAwMDAwICsgRVhURU5ERURfTUVNU0laRSArIDE1KTsKKyAgYXNzZXJ0IChzY3JhdGNoKTsKKyAgZ3J1Yl9zY3JhdGNoX21lbSA9IChjaGFyICopICgoKChpbnQpIHNjcmF0Y2gpID4+IDQpIDw8IDQpOworCisgIC8qIEZJWE1FOiBzaW11bGF0ZSB0aGUgbWVtb3J5IGhvbGVzIHVzaW5nIG1wcm90LCBpZiBhdmFpbGFibGUuICovCisKKyAgYXNzZXJ0IChkaXNrcyA9PSAwKTsKKyAgZGlza3MgPSBtYWxsb2MgKE5VTV9ESVNLUyAqIHNpemVvZiAoKmRpc2tzKSk7CisgIGFzc2VydCAoZGlza3MpOworICAvKiBJbml0aWFsaXplIERJU0tTLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5VTV9ESVNLUzsgaSsrKQorICAgIGRpc2tzW2ldLmZsYWdzID0gLTE7CisKKyAgaWYgKCEgaW5pdF9kZXZpY2VfbWFwICgmZGV2aWNlX21hcCwgZGV2aWNlX21hcF9maWxlLCBmbG9wcHlfZGlza3MpKQorICAgIHJldHVybiAxOworICAKKyAgLyogQ2hlY2sgc29tZSBpbnZhcmlhbnRzLiAqLworICBhc3NlcnQgKChTQ1JBVENIU0VHIDw8IDQpID09IFNDUkFUQ0hBRERSKTsKKyAgYXNzZXJ0ICgoQlVGRkVSU0VHIDw8IDQpID09IEJVRkZFUkFERFIpOworICBhc3NlcnQgKEJVRkZFUkFERFIgKyBCVUZGRVJMRU4gPT0gU0NSQVRDSEFERFIpOworICBhc3NlcnQgKEZTWVNfQlVGICUgMTYgPT0gMCk7CisgIGFzc2VydCAoRlNZU19CVUYgKyBGU1lTX0JVRkxFTiA9PSBCVUZGRVJBRERSKTsKKworI2lmZGVmIEhBVkVfTElCQ1VSU0VTCisgIC8qIEdldCBpbnRvIGNoYXItYXQtYS10aW1lIG1vZGUuICovCisgIGlmICh1c2VfY3Vyc2VzKQorICAgIHsKKyAgICAgIGluaXRzY3IgKCk7CisgICAgICBjYnJlYWsgKCk7CisgICAgICBub2VjaG8gKCk7CisgICAgICBub25sICgpOworICAgICAgc2Nyb2xsb2sgKHN0ZHNjciwgVFJVRSk7CisgICAgICBrZXlwYWQgKHN0ZHNjciwgVFJVRSk7CisgICAgICB3dGltZW91dCAoc3Rkc2NyLCAxMDApOworICAgICAgc2lnbmFsIChTSUdXSU5DSCwgU0lHX0lHTik7CisgICAgfQorI2VuZGlmCisKKyAgLyogTWFrZSBzdXJlIHRoYXQgYWN0dWFsIHdyaXRpbmcgaXMgZG9uZS4gICovCisgIHN5bmMgKCk7CisKKyAgLyogU2V0IG91ciBzdGFjaywgYW5kIGdvIGZvciBpdC4gKi8KKyAgc2ltc3RhY2sgPSAoY2hhciAqKSBQUk9UU1RBQ0tJTklUOworICBkb2l0ICgpOworCisgIC8qIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzIG5lY2Vzc2FyeSByZWFsbHkuICAqLworICBzeW5jICgpOworCisjaWZkZWYgSEFWRV9MSUJDVVJTRVMKKyAgaWYgKHVzZV9jdXJzZXMpCisgICAgZW5kd2luICgpOworI2VuZGlmCisKKyAgLyogQ2xvc2Ugb2ZmIHRoZSBmaWxlIGRlc2NyaXB0b3JzIHdlIHVzZWQuICovCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fRElTS1M7IGkgKyspCisgICAgaWYgKGRpc2tzW2ldLmZsYWdzICE9IC0xKQorICAgICAgeworI2lmZGVmIF9fbGludXhfXworCS8qIEluIExpbnV4LCBpbnZhbGlkYXRlIHRoZSBidWZmZXIgY2FjaGUuIEluIG90aGVyIE9TZXMsIHJlYm9vdAorCSAgIGlzIG9uZSBvZiB0aGUgc29sdXRpb25zLi4uICAqLworCWlvY3RsIChkaXNrc1tpXS5mbGFncywgQkxLRkxTQlVGLCAwKTsKKyNlbHNlCisjIHdhcm5pbmcgIkluIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSwgdGhlIGJ1ZmZlciBjYWNoZSB3aWxsIG5vdCBiZSBmbHVzaGVkLiIKKyNlbmRpZgorCWNsb3NlIChkaXNrc1tpXS5mbGFncyk7CisgICAgICB9CisKKyAgaWYgKHNlcmlhbF9mZCA+PSAwKQorICAgIGNsb3NlIChzZXJpYWxfZmQpOworICAKKyAgLyogUmVsZWFzZSBtZW1vcnkuICovCisgIHJlc3RvcmVfZGV2aWNlX21hcCAoZGV2aWNlX21hcCk7CisgIGRldmljZV9tYXAgPSAwOworICBmcmVlIChkaXNrcyk7CisgIGRpc2tzID0gMDsKKyAgZnJlZSAoc2NyYXRjaCk7CisgIGdydWJfc2NyYXRjaF9tZW0gPSAwOworCisgIGlmIChzZXJpYWxfZGV2aWNlKQorICAgIGZyZWUgKHNlcmlhbF9kZXZpY2UpOworICBzZXJpYWxfZGV2aWNlID0gMDsKKyAgCisgIC8qIEFoaC4uLiBhdCBsYXN0IHdlJ3JlIHJlYWR5IHRvIHJldHVybiB0byBjYWxsZXIuICovCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIEFzc2lnbiBEUklWRSB0byBhIGRldmljZSBuYW1lIERFVklDRS4gICovCit2b2lkCithc3NpZ25fZGV2aWNlX25hbWUgKGludCBkcml2ZSwgY29uc3QgY2hhciAqZGV2aWNlKQoreworICAvKiBJZiBEUklWRSBpcyBhbHJlYWR5IGFzc2lnbmVkLCBmcmVlIGl0LiAgKi8KKyAgaWYgKGRldmljZV9tYXBbZHJpdmVdKQorICAgIGZyZWUgKGRldmljZV9tYXBbZHJpdmVdKTsKKworICAvKiBJZiB0aGUgb2xkIG9uZSBpcyBhbHJlYWR5IG9wZW5lZCwgY2xvc2UgaXQuICAqLworICBpZiAoZGlza3NbZHJpdmVdLmZsYWdzICE9IC0xKQorICAgIHsKKyAgICAgIGNsb3NlIChkaXNrc1tkcml2ZV0uZmxhZ3MpOworICAgICAgZGlza3NbZHJpdmVdLmZsYWdzID0gLTE7CisgICAgfQorCisgIC8qIEFzc2lnbiBEUklWRSB0byBERVZJQ0UuICAqLworICBpZiAoISBkZXZpY2UpCisgICAgZGV2aWNlX21hcFtkcml2ZV0gPSAwOworICBlbHNlCisgICAgZGV2aWNlX21hcFtkcml2ZV0gPSBzdHJkdXAgKGRldmljZSk7Cit9CisKK3ZvaWQKK3N0b3AgKHZvaWQpCit7CisjaWZkZWYgSEFWRV9MSUJDVVJTRVMKKyAgaWYgKHVzZV9jdXJzZXMpCisgICAgZW5kd2luICgpOworI2VuZGlmCisKKyAgLyogSnVtcCB0byBkb2l0LiAgKi8KKyAgbG9uZ2ptcCAoZW52X2Zvcl9leGl0LCAxKTsKK30KKwordm9pZAorZ3J1Yl9yZWJvb3QgKHZvaWQpCit7CisgIHN0b3AgKCk7Cit9CisKK3ZvaWQKK2dydWJfaGFsdCAoaW50IG5vX2FwbSkKK3sKKyAgc3RvcCAoKTsKK30KKworLyogY2FsbHMgZm9yIGRpcmVjdCBib290LWxvYWRlciBjaGFpbmluZyAqLwordm9pZAorY2hhaW5fc3RhZ2UxICh1bnNpZ25lZCBsb25nIHNlZ21lbnQsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCSAgICAgIHVuc2lnbmVkIGxvbmcgcGFydF90YWJsZV9hZGRyKQoreworICBzdG9wICgpOworfQorCisKK3ZvaWQKK2NoYWluX3N0YWdlMiAodW5zaWduZWQgbG9uZyBzZWdtZW50LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IHNlY29uZF9zZWN0b3IpCit7CisgIHN0b3AgKCk7Cit9CisKKworLyogZG8gc29tZSBmdW5reSBzdHVmZiwgdGhlbiBib290IGxpbnV4ICovCit2b2lkCitsaW51eF9ib290ICh2b2lkKQoreworICBzdG9wICgpOworfQorCisKKy8qIEZvciBiekltYWdlIGtlcm5lbHMuICovCit2b2lkCitiaWdfbGludXhfYm9vdCAodm9pZCkKK3sKKyAgc3RvcCAoKTsKK30KKworCisvKiBib290aW5nIGEgbXVsdGlib290IGV4ZWN1dGFibGUgKi8KK3ZvaWQKK211bHRpX2Jvb3QgKGludCBzdGFydCwgaW50IG1iX2luZm8pCit7CisgIHN0b3AgKCk7Cit9CisKKy8qIHNldHMgaXQgdG8gbGluZWFyIG9yIHdpcmVkIEEyMCBvcGVyYXRpb24gKi8KK3ZvaWQKK2dhdGVBMjAgKGludCBsaW5lYXIpCit7CisgIC8qIE5vdGhpbmcgdG8gZG8gaW4gdGhlIHNpbXVsYXRvci4gKi8KK30KKworLyogU2V0IHVwIHRoZSBpbnQxNSBoYW5kbGVyLiAgKi8KK3ZvaWQKK3NldF9pbnQxNV9oYW5kbGVyICh2b2lkKQoreworICAvKiBOb3RoaW5nIHRvIGRvIGluIHRoZSBzaW11bGF0b3IuICAqLworfQorCisvKiBSZXN0b3JlIHRoZSBvcmlnaW5hbCBpbnQxNSBoYW5kbGVyLiAgKi8KK3ZvaWQKK3Vuc2V0X2ludDE1X2hhbmRsZXIgKHZvaWQpCit7CisgIC8qIE5vdGhpbmcgdG8gZG8gaW4gdGhlIHNpbXVsYXRvci4gICovCit9CisKKy8qIFRoZSBrZXkgbWFwLiAgKi8KK3Vuc2lnbmVkIHNob3J0IGJpb3Nfa2V5X21hcFtLRVlfTUFQX1NJWkUgKyAxXTsKK3Vuc2lnbmVkIHNob3J0IGFzY2lpX2tleV9tYXBbS0VZX01BUF9TSVpFICsgMV07CisKKy8qIENvcHkgTUFQIHRvIHRoZSBkcml2ZSBtYXAgYW5kIHNldCB1cCB0aGUgaW50MTMgaGFuZGxlci4gICovCit2b2lkCitzZXRfaW50MTNfaGFuZGxlciAodW5zaWduZWQgc2hvcnQgKm1hcCkKK3sKKyAgLyogTm90aGluZyB0byBkbyBpbiB0aGUgc2ltdWxhdG9yLiAgKi8KK30KKworaW50CitnZXRfY29kZV9lbmQgKHZvaWQpCit7CisgIC8qIEp1c3QgcmV0dXJuIGEgbGl0dGxlIGFyZWEgZm9yIHNpbXVsYXRpb24uICovCisgIHJldHVybiBCT09UU0VDX0xPQ0FUSU9OICsgKDYwICogMTAyNCk7Cit9CisKKworLyogbWVtb3J5IHByb2JlIHJvdXRpbmVzICovCitpbnQKK2dldF9tZW1zaXplIChpbnQgdHlwZSkKK3sKKyAgaWYgKCEgdHlwZSkKKyAgICByZXR1cm4gQ09OVkVOVElPTkFMX01FTVNJWkUgPj4gMTA7CisgIGVsc2UKKyAgICByZXR1cm4gRVhURU5ERURfTUVNU0laRSA+PiAxMDsKK30KKworCisvKiBnZXRfZWlzYW1lbXNpemUoKSA6ICByZXR1cm4gcGFja2VkIEVJU0EgbWVtb3J5IG1hcCwgbG93ZXIgMTYgYml0cyBpcworICoJCW1lbW9yeSBiZXR3ZWVuIDFNIGFuZCAxNk0gaW4gMUsgcGFydHMsIHVwcGVyIDE2IGJpdHMgaXMKKyAqCQltZW1vcnkgYWJvdmUgMTZNIGluIDY0SyBwYXJ0cy4gIElmIGVycm9yLCByZXR1cm4gLTEuCisgKi8KK2ludAorZ2V0X2Vpc2FtZW1zaXplICh2b2lkKQoreworICByZXR1cm4gKEVYVEVOREVEX01FTVNJWkUgPj4gMTApOworfQorCisKKyNkZWZpbmUgTU1BUl9ERVNDX1RZUEVfQVZBSUxBQkxFIDEgLyogYXZhaWxhYmxlIHRvIE9TICovCisjZGVmaW5lIE1NQVJfREVTQ19UWVBFX1JFU0VSVkVEIDIgLyogbm90IGF2YWlsYWJsZSAqLworI2RlZmluZSBNTUFSX0RFU0NfVFlQRV9BQ1BJX1JFQ0xBSU0gMyAvKiB1c2FibGUgYnkgT1MgYWZ0ZXIgcmVhZGluZyBBQ1BJICovCisjZGVmaW5lIE1NQVJfREVTQ19UWVBFX0FDUElfTlZTIDQgLyogcmVxdWlyZWQgdG8gc2F2ZSBiZXR3ZWVuIE5WUyBzZXNzaW9ucyAqLworCisjZGVmaW5lIE1NQVJfREVTQ19MRU5HVEgJMjAKKworLyogRmV0Y2ggdGhlIG5leHQgZW50cnkgaW4gdGhlIG1lbW9yeSBtYXAgYW5kIHJldHVybiB0aGUgY29udGludWF0aW9uCisgICB2YWx1ZS4gIERFU0MgaXMgYSBwb2ludGVyIHRvIHRoZSBkZXNjcmlwdG9yIGJ1ZmZlciwgYW5kIENPTlQgaXMgdGhlCisgICBwcmV2aW91cyBjb250aW51YXRpb24gdmFsdWUgKDAgdG8gZ2V0IHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUKKyAgIG1hcCkuICAqLworaW50CitnZXRfbW1hcF9lbnRyeSAoc3RydWN0IG1tYXJfZGVzYyAqZGVzYywgaW50IGNvbnQpCit7CisgIC8qIFJlY29yZCB0aGUgbWVtb3J5IG1hcCBzdGF0aWNhbGx5LiAgKi8KKyAgc3RhdGljIHN0cnVjdCBtbWFyX2Rlc2MgZGVzY190YWJsZVtdID0KKyAgeworICAgIC8qIFRoZSBjb252ZW50aW9uYWwgbWVtb3J5LiAgKi8KKyAgICB7CisgICAgICBNTUFSX0RFU0NfTEVOR1RILAorICAgICAgMCwKKyAgICAgIENPTlZFTlRJT05BTF9NRU1TSVpFLAorICAgICAgTU1BUl9ERVNDX1RZUEVfQVZBSUxBQkxFCisgICAgfSwKKyAgICAvKiBCSU9TIFJBTSBhbmQgUk9NIChzdWNoIGFzIHZpZGVvIG1lbW9yeSkuICAqLworICAgIHsKKyAgICAgIE1NQVJfREVTQ19MRU5HVEgsCisgICAgICBDT05WRU5USU9OQUxfTUVNU0laRSwKKyAgICAgIDB4MTAwMDAwIC0gQ09OVkVOVElPTkFMX01FTVNJWkUsCisgICAgICBNTUFSX0RFU0NfVFlQRV9SRVNFUlZFRAorICAgIH0sCisgICAgLyogVGhlIGV4dGVuZGVkIG1lbW9yeS4gICovCisgICAgeworICAgICAgTU1BUl9ERVNDX0xFTkdUSCwKKyAgICAgIDB4MTAwMDAwLAorICAgICAgRVhURU5ERURfTUVNU0laRSwKKyAgICAgIE1NQVJfREVTQ19UWVBFX0FWQUlMQUJMRQorICAgIH0KKyAgfTsKKyAgCisgIGludCBudW0gPSBzaXplb2YgKGRlc2NfdGFibGUpIC8gc2l6ZW9mICgqZGVzY190YWJsZSk7CisKKyAgaWYgKGNvbnQgPCAwIHx8IGNvbnQgPj0gbnVtKQorICAgIHsKKyAgICAgIC8qIFNob3VsZCBub3QgaGFwcGVuLiAgKi8KKyAgICAgIGRlc2MtPmRlc2NfbGVuID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBDb3B5IHRoZSBlbnRyeS4gICovCisgICAgICAqZGVzYyA9IGRlc2NfdGFibGVbY29udCsrXTsKKworICAgICAgLyogSWYgdGhlIG5leHQgZW50cnkgZXhpc3RzLCByZXR1cm4gdGhlIGluZGV4LiAgKi8KKyAgICAgIGlmIChjb250IDwgbnVtKQorCXJldHVybiBjb250OworICAgIH0KKyAgCisgIHJldHVybiAwOworfQorCisvKiBUcmFjayB0aGUgaW50MTMgaGFuZGxlci4gICovCit2b2lkCit0cmFja19pbnQxMyAoaW50IGRyaXZlKQoreworICAvKiBOb3RoaW5nIHRvIGRvIGluIHRoZSBzaW11bGF0b3IuICAqLworfQorCisvKiBHZXQgdGhlIFJPTSBjb25maWd1cmF0aW9uIHRhYmxlLiAgKi8KK3Vuc2lnbmVkIGxvbmcKK2dldF9yb21fY29uZmlnX3RhYmxlICh2b2lkKQoreworICByZXR1cm4gMDsKK30KKworLyogR2V0IEFQTSBCSU9TIGluZm9ybWF0aW9uLiAgKi8KK3ZvaWQKK2dldF9hcG1faW5mbyAodm9pZCkKK3sKKyAgLyogTm90aGluZyB0byBkbyBpbiB0aGUgc2ltdWxhdG9yLiAgKi8KK30KKworLyogR2V0IFZCRSBjb250cm9sbGVyIGluZm9ybWF0aW9uLiAgKi8KK2ludAorZ2V0X3ZiZV9jb250cm9sbGVyX2luZm8gKHN0cnVjdCB2YmVfY29udHJvbGxlciAqY29udHJvbGxlcikKK3sKKyAgLyogQWx3YXlzIGZhaWxzLiAgKi8KKyAgcmV0dXJuIDA7Cit9CisKKy8qIEdldCBWQkUgbW9kZSBpbmZvcm1hdGlvbi4gICovCitpbnQKK2dldF92YmVfbW9kZV9pbmZvIChpbnQgbW9kZV9udW1iZXIsIHN0cnVjdCB2YmVfbW9kZSAqbW9kZSkKK3sKKyAgLyogQWx3YXlzIGZhaWxzLiAgKi8KKyAgcmV0dXJuIDA7Cit9CisKKy8qIFNldCBWQkUgbW9kZS4gICovCitpbnQKK3NldF92YmVfbW9kZSAoaW50IG1vZGVfbnVtYmVyKQoreworICAvKiBBbHdheXMgZmFpbHMuICAqLworICByZXR1cm4gMDsKK30KKworLyogbG93LWxldmVsIHRpbWluZyBpbmZvICovCitpbnQKK2dldHJ0c2VjcyAodm9pZCkKK3sKKyAgLyogRklYTUU6IGV4YWN0IHZhbHVlIGlzIG5vdCBpbXBvcnRhbnQsIHNvIGp1c3QgcmV0dXJuIHRpbWVfdCBmb3Igbm93LiAqLworICByZXR1cm4gdGltZSAoMCk7Cit9CisKK2ludAorY3VycnRpY2tzICh2b2lkKQoreworICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgbG9uZyBjc2VjczsKKyAgaW50IHRpY2tzX3Blcl9jc2VjLCB0aWNrc19wZXJfdXNlYzsKKworICAvKiBOb3RlOiAxOC4yIHRpY2tzL3NlYy4gICovCisKKyAgLyogR2V0IGN1cnJlbnQgdGltZS4gICovCisgIGdldHRpbWVvZmRheSAoJnR2LCAwKTsKKworICAvKiBDb21wdXRlIGNlbnRpc2Vjb25kcy4gICovCisgIGNzZWNzID0gdHYudHZfc2VjIC8gMTA7CisKKyAgLyogVGlja3MgcGVyIGNlbnRpc2Vjb25kLiAgKi8KKyAgdGlja3NfcGVyX2NzZWMgPSBjc2VjcyAqIDE4MjsKKworICAvKiBUaWNrcyBwZXIgbWljcm9zZWNvbmQuICAqLworICB0aWNrc19wZXJfdXNlYyA9ICgoKHR2LnR2X3NlYyAtIGNzZWNzICogMTApICogMTAwMDAwMCArIHR2LnR2X3VzZWMpCisJCSAgICAqIDE4MiAvIDEwMDAwMDAwKTsKKworICAvKiBTdW0gdGhlbS4gICovCisgIHJldHVybiB0aWNrc19wZXJfY3NlYyArIHRpY2tzX3Blcl91c2VjOworfQorCisvKiBkaXNwbGF5cyBhbiBBU0NJSSBjaGFyYWN0ZXIuICBJQk0gZGlzcGxheXMgd2lsbCB0cmFuc2xhdGUgc29tZQorICAgY2hhcmFjdGVycyB0byBzcGVjaWFsIGdyYXBoaWNhbCBvbmVzICovCit2b2lkCitjb25zb2xlX3B1dGNoYXIgKGludCBjKQoreworICAvKiBDdXJzZXMgZG9lc24ndCBoYXZlIFZHQSBmb250cy4gICovCisgIHN3aXRjaCAoYykKKyAgICB7CisgICAgY2FzZSBESVNQX1VMOgorICAgICAgYyA9IEFDU19VTENPUk5FUjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRElTUF9VUjoKKyAgICAgIGMgPSBBQ1NfVVJDT1JORVI7CisgICAgICBicmVhazsKKyAgICBjYXNlIERJU1BfTEw6CisgICAgICBjID0gQUNTX0xMQ09STkVSOworICAgICAgYnJlYWs7CisgICAgY2FzZSBESVNQX0xSOgorICAgICAgYyA9IEFDU19MUkNPUk5FUjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRElTUF9IT1JJWjoKKyAgICAgIGMgPSBBQ1NfSExJTkU7CisgICAgICBicmVhazsKKyAgICBjYXNlIERJU1BfVkVSVDoKKyAgICAgIGMgPSBBQ1NfVkxJTkU7CisgICAgICBicmVhazsKKyAgICBjYXNlIERJU1BfTEVGVDoKKyAgICAgIGMgPSBBQ1NfTEFSUk9XOworICAgICAgYnJlYWs7CisgICAgY2FzZSBESVNQX1JJR0hUOgorICAgICAgYyA9IEFDU19SQVJST1c7CisgICAgICBicmVhazsKKyAgICBjYXNlIERJU1BfVVA6CisgICAgICBjID0gQUNTX1VBUlJPVzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRElTUF9ET1dOOgorICAgICAgYyA9IEFDU19EQVJST1c7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorCisjaWZkZWYgSEFWRV9MSUJDVVJTRVMKKyAgaWYgKHVzZV9jdXJzZXMpCisgICAgeworICAgICAgLyogSW4gbmN1cnNlcywgYSBuZXdsaW5lIGlzIHRyZWF0ZWQgYmFkbHksIHNvIHdlIGVtdWxhdGUgaXQgaW4gb3VyCisJIG93biB3YXkuICAqLworICAgICAgaWYgKGMgPT0gJ1xuJykKKwl7CisJICBpbnQgeCwgeTsKKworCSAgZ2V0eXggKHN0ZHNjciwgeSwgeCk7CisJICBpZiAoeSArIDEgPT0gTElORVMpCisJICAgIHNjcm9sbCAoc3Rkc2NyKTsKKwkgIGVsc2UKKwkgICAgbW92ZSAoeSArIDEsIHgpOworCX0KKyAgICAgIGVsc2UgaWYgKGlzcHJpbnQgKGMpKQorCXsKKwkgIGludCB4LCB5OworCisJICBnZXR5eCAoc3Rkc2NyLCB5LCB4KTsKKwkgIGlmICh4ICsgMSA9PSBDT0xTKQorCSAgICB7CisJICAgICAgY29uc29sZV9wdXRjaGFyICgnXHInKTsKKwkgICAgICBjb25zb2xlX3B1dGNoYXIgKCdcbicpOworCSAgICB9CisJICBhZGRjaCAoYyB8IGNvbnNvbGVfY3VycmVudF9jb2xvcik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGFkZGNoIChjKTsKKwl9CisgICAgICAKKyNpZmRlZiBSRUZSRVNIX0lNTUVESUFURUxZCisgICAgICByZWZyZXNoICgpOworI2VuZGlmCisgICAgfQorICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICAvKiBDUiBpcyBub3QgdXNlZCBpbiBVbml4LiAgKi8KKyAgICAgIGlmIChjICE9ICdccicpCisJcHV0Y2hhciAoYyk7CisgICAgfQorfQorCisvKiBUaGUgc3RvcmUgZm9yIHVuZ2V0Y2ggc2ltdWxhdGlvbi4gVGhpcyBpcyBuZWNlc3NhcnksIGJlY2F1c2UKKyAgIG5jdXJzZXMtMS45LjlnIGlzIHN0aWxsIHVzZWQgaW4gdGhlIHdvcmxkIGFuZCBpdHMgdW5nZXRjaCBpcworICAgY29tcGxldGVseSBicm9rZW4uICAqLworI2lmZGVmIEhBVkVfTElCQ1VSU0VTCitzdGF0aWMgaW50IHNhdmVfY2hhciA9IEVSUjsKKyNlbmRpZgorCitzdGF0aWMgaW50Citjb25zb2xlX3RyYW5zbGF0ZV9rZXkgKGludCBjKQoreworICBzd2l0Y2ggKGMpCisgICAgeworICAgIGNhc2UgS0VZX0xFRlQ6CisgICAgICByZXR1cm4gMjsKKyAgICBjYXNlIEtFWV9SSUdIVDoKKyAgICAgIHJldHVybiA2OworICAgIGNhc2UgS0VZX1VQOgorICAgICAgcmV0dXJuIDE2OworICAgIGNhc2UgS0VZX0RPV046CisgICAgICByZXR1cm4gMTQ7CisgICAgY2FzZSBLRVlfREM6CisgICAgICByZXR1cm4gNDsKKyAgICBjYXNlIEtFWV9CQUNLU1BBQ0U6CisgICAgICByZXR1cm4gODsKKyAgICBjYXNlIEtFWV9IT01FOgorICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBLRVlfRU5EOgorICAgICAgcmV0dXJuIDU7CisgICAgY2FzZSBLRVlfUFBBR0U6CisgICAgICByZXR1cm4gNzsKKyAgICBjYXNlIEtFWV9OUEFHRToKKyAgICAgIHJldHVybiAzOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIGM7Cit9CisKKy8qIGxpa2UgJ2dldGtleScsIGJ1dCBkb2Vzbid0IHdhaXQsIHJldHVybnMgLTEgaWYgbm90aGluZyBhdmFpbGFibGUgKi8KK2ludAorY29uc29sZV9jaGVja2tleSAodm9pZCkKK3sKKyNpZmRlZiBIQVZFX0xJQkNVUlNFUworICBpZiAodXNlX2N1cnNlcykKKyAgICB7CisgICAgICBpbnQgYzsKKworICAgICAgLyogQ2hlY2sgZm9yIFNBVkVfQ0hBUi4gVGhpcyBzaG91bGQgbm90IGJlIHRydWUsIGJlY2F1c2UgdGhpcworCSBtZWFucyBjaGVja2tleSBpcyBjYWxsZWQgdHdpY2UgY29udGludW91c2x5LiAgKi8KKyAgICAgIGlmIChzYXZlX2NoYXIgIT0gRVJSKQorCXJldHVybiBzYXZlX2NoYXI7CisKKyAgICAgIGMgPSBnZXRjaCAoKTsKKyAgICAgIC8qIElmIEMgaXMgbm90IEVSUiwgdGhlbiBwdXQgaXQgYmFjayBpbiB0aGUgaW5wdXQgcXVldWUuICAqLworICAgICAgaWYgKGMgIT0gRVJSKQorCXNhdmVfY2hhciA9IGM7CisgICAgICByZXR1cm4gY29uc29sZV90cmFuc2xhdGVfa2V5IChjKTsKKyAgICB9CisjZW5kaWYKKworICAvKiBKdXN0IHByZXRlbmQgdGhleSBoaXQgdGhlIHNwYWNlIGJhciwgdGhlbiByZWFkIHRoZSByZWFsIGtleSB3aGVuCisgICAgIHRoZXkgY2FsbCBnZXRrZXkuICovCisgIHJldHVybiAnICc7Cit9CisKKy8qIHJldHVybnMgcGFja2VkIEJJT1MvQVNDSUkgY29kZSAqLworaW50Citjb25zb2xlX2dldGtleSAodm9pZCkKK3sKKyAgaW50IGM7CisKKyNpZmRlZiBIQVZFX0xJQkNVUlNFUworICBpZiAodXNlX2N1cnNlcykKKyAgICB7CisgICAgICAvKiBJZiBjaGVja2tleSBoYXMgYWxyZWFkeSBnb3QgYSBjaGFyYWN0ZXIsIHRoZW4gcmV0dXJuIGl0LiAgKi8KKyAgICAgIGlmIChzYXZlX2NoYXIgIT0gRVJSKQorCXsKKwkgIGMgPSBzYXZlX2NoYXI7CisJICBzYXZlX2NoYXIgPSBFUlI7CisJICByZXR1cm4gY29uc29sZV90cmFuc2xhdGVfa2V5IChjKTsKKwl9CisKKyAgICAgIHd0aW1lb3V0IChzdGRzY3IsIC0xKTsKKyAgICAgIGMgPSBnZXRjaCAoKTsKKyAgICAgIHd0aW1lb3V0IChzdGRzY3IsIDEwMCk7CisgICAgfQorICBlbHNlCisjZW5kaWYKKyAgICBjID0gZ2V0Y2hhciAoKTsKKworICAvKiBRdWl0IGlmIHdlIGdldCBFT0YuICovCisgIGlmIChjID09IC0xKQorICAgIHN0b3AgKCk7CisgIAorICByZXR1cm4gY29uc29sZV90cmFuc2xhdGVfa2V5IChjKTsKK30KKworLyogcmV0dXJucyBwYWNrZWQgdmFsdWVzLCBMU0IrMSBpcyB4LCBMU0IgaXMgeSAqLworaW50Citjb25zb2xlX2dldHh5ICh2b2lkKQoreworICBpbnQgeSwgeDsKKyNpZmRlZiBIQVZFX0xJQkNVUlNFUworICBpZiAodXNlX2N1cnNlcykKKyAgICBnZXR5eCAoc3Rkc2NyLCB5LCB4KTsKKyAgZWxzZQorI2VuZGlmCisgIHkgPSB4ID0gMDsKKyAgcmV0dXJuICh4IDw8IDgpIHwgKHkgJiAweGZmKTsKK30KKwordm9pZAorY29uc29sZV9nb3RveHkgKGludCB4LCBpbnQgeSkKK3sKKyNpZmRlZiBIQVZFX0xJQkNVUlNFUworICBpZiAodXNlX2N1cnNlcykKKyAgICBtb3ZlICh5LCB4KTsKKyNlbmRpZgorfQorCisvKiBsb3ctbGV2ZWwgY2hhcmFjdGVyIEkvTyAqLwordm9pZAorY29uc29sZV9jbHMgKHZvaWQpCit7CisjaWZkZWYgSEFWRV9MSUJDVVJTRVMKKyAgaWYgKHVzZV9jdXJzZXMpCisgICAgY2xlYXIgKCk7CisjZW5kaWYKK30KKwordm9pZAorY29uc29sZV9zZXRjb2xvcnN0YXRlIChjb2xvcl9zdGF0ZSBzdGF0ZSkKK3sKKyAgY29uc29sZV9jdXJyZW50X2NvbG9yID0gCisgICAgKHN0YXRlID09IENPTE9SX1NUQVRFX0hJR0hMSUdIVCkgPyBBX1JFVkVSU0UgOiBBX05PUk1BTDsKK30KKwordm9pZAorY29uc29sZV9zZXRjb2xvciAoaW50IG5vcm1hbF9jb2xvciwgaW50IGhpZ2hsaWdodF9jb2xvcikKK3sKKyAgLyogTm90aGluZyB0byBkby4gICovCit9CisKK2ludAorY29uc29sZV9zZXRjdXJzb3IgKGludCBvbikKK3sKKyAgcmV0dXJuIDE7Cit9CisKKy8qIExvdy1sZXZlbCBkaXNrIEkvTy4gIE91ciBzdHViYmVkIHZlcnNpb24ganVzdCByZXR1cm5zIGEgZmlsZQorICAgZGVzY3JpcHRvciwgbm90IHRoZSBhY3R1YWwgZ2VvbWV0cnkuICovCitpbnQKK2dldF9kaXNraW5mbyAoaW50IGRyaXZlLCBzdHJ1Y3QgZ2VvbWV0cnkgKmdlb21ldHJ5KQoreworICAvKiBGSVhNRTogdGhpcyBmdW5jdGlvbiBpcyB0cnVseSBob3JyaWQuICBXZSB0cnkgb3BlbmluZyB0aGUgZGV2aWNlLAorICAgICB0aGVuIHNldmVyZWx5IGFidXNlIHRoZSBHRU9NRVRSWS0+ZmxhZ3MgZmllbGQgdG8gcGFzcyBhIGZpbGUKKyAgICAgZGVzY3JpcHRvciB0byBiaW9zZGlzay4gIFRoYW5rIEdvZCBub2JvZHkncyBsb29raW5nIGF0IHRoaXMgY29tbWVudCwKKyAgICAgb3IgbXkgcmVwdXRhdGlvbiB3b3VsZCBiZSBydWluZWQuIC0tR29yZCAqLworCisgIC8qIFNlZSBpZiB3ZSBoYXZlIGEgY2FjaGVkIGRldmljZS4gKi8KKyAgaWYgKGRpc2tzW2RyaXZlXS5mbGFncyA9PSAtMSkKKyAgICB7CisgICAgICAvKiBUaGUgdW5wYXJ0aXRpb25lZCBkZXZpY2UgbmFtZTogL2Rldi9YZFggKi8KKyAgICAgIGNoYXIgKmRldm5hbWUgPSBkZXZpY2VfbWFwW2RyaXZlXTsKKyAgICAgIGNoYXIgYnVmWzUxMl07CisKKyAgICAgIGlmICghIGRldm5hbWUpCisJcmV0dXJuIC0xOworCisgICAgICBpZiAodmVyYm9zZSkKKwlncnViX3ByaW50ZiAoIkF0dGVtcHQgdG8gb3BlbiBkcml2ZSAweCV4ICglcylcbiIsCisJCSAgICAgZHJpdmUsIGRldm5hbWUpOworCisgICAgICAvKiBPcGVuIHJlYWQvd3JpdGUsIG9yIHJlYWQtb25seSBpZiB0aGF0IGZhaWxlZC4gKi8KKyAgICAgIGlmICghIHJlYWRfb25seSkKKwlkaXNrc1tkcml2ZV0uZmxhZ3MgPSBvcGVuIChkZXZuYW1lLCBPX1JEV1IpOworCisgICAgICBpZiAoZGlza3NbZHJpdmVdLmZsYWdzID09IC0xKQorCXsKKwkgIGlmIChyZWFkX29ubHkgfHwgZXJybm8gPT0gRUFDQ0VTIHx8IGVycm5vID09IEVST0ZTIHx8IGVycm5vID09IEVQRVJNKQorCSAgICB7CisJICAgICAgZGlza3NbZHJpdmVdLmZsYWdzID0gb3BlbiAoZGV2bmFtZSwgT19SRE9OTFkpOworCSAgICAgIGlmIChkaXNrc1tkcml2ZV0uZmxhZ3MgPT0gLTEpCisJCXsKKwkJICBhc3NpZ25fZGV2aWNlX25hbWUgKGRyaXZlLCAwKTsKKwkJICByZXR1cm4gLTE7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgYXNzaWduX2RldmljZV9uYW1lIChkcml2ZSwgMCk7CisJICAgICAgcmV0dXJuIC0xOworCSAgICB9CisJfQorCisgICAgICAvKiBBdHRlbXB0IHRvIHJlYWQgdGhlIGZpcnN0IHNlY3Rvci4gICovCisgICAgICBpZiAocmVhZCAoZGlza3NbZHJpdmVdLmZsYWdzLCBidWYsIDUxMikgIT0gNTEyKQorCXsKKwkgIGNsb3NlIChkaXNrc1tkcml2ZV0uZmxhZ3MpOworCSAgZGlza3NbZHJpdmVdLmZsYWdzID0gLTE7CisJICBhc3NpZ25fZGV2aWNlX25hbWUgKGRyaXZlLCAwKTsKKwkgIHJldHVybiAtMTsKKwl9CisKKyAgICAgIGlmIChkaXNrc1tkcml2ZV0uZmxhZ3MgIT0gLTEpCisJZ2V0X2RyaXZlX2dlb21ldHJ5ICgmZGlza3NbZHJpdmVdLCBkZXZpY2VfbWFwLCBkcml2ZSk7CisgICAgfQorCisgIGlmIChkaXNrc1tkcml2ZV0uZmxhZ3MgPT0gLTEpCisgICAgcmV0dXJuIC0xOworCisjaWZkZWYgX19saW51eF9fCisgIC8qIEluIExpbnV4LCBpbnZhbGlkYXRlIHRoZSBidWZmZXIgY2FjaGUsIHNvIHRoYXQgbGVmdCBvdmVycworICAgICBmcm9tIG90aGVyIHByb2dyYW0gaW4gdGhlIGNhY2hlIGFyZSBmbHVzaGVkIGFuZCBzZWVuIGJ5IHVzICovCisgIGlvY3RsIChkaXNrc1tkcml2ZV0uZmxhZ3MsIEJMS0ZMU0JVRiwgMCk7CisjZW5kaWYKKworICAqZ2VvbWV0cnkgPSBkaXNrc1tkcml2ZV07CisgIHJldHVybiAwOworfQorCisvKiBSZWFkIExFTiBieXRlcyBmcm9tIEZEIGluIEJVRi4gUmV0dXJuIGxlc3MgdGhhbiBvciBlcXVhbCB0byB6ZXJvIGlmIGFuCisgICBlcnJvciBvY2N1cnMsIG90aGVyd2lzZSByZXR1cm4gTEVOLiAgKi8KK3N0YXRpYyBpbnQKK25yZWFkIChpbnQgZmQsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKyAgaW50IHNpemUgPSBsZW47CisKKyAgd2hpbGUgKGxlbikKKyAgICB7CisgICAgICBpbnQgcmV0ID0gcmVhZCAoZmQsIGJ1ZiwgbGVuKTsKKworICAgICAgaWYgKHJldCA8PSAwKQorCXsKKwkgIGlmIChlcnJubyA9PSBFSU5UUikKKwkgICAgY29udGludWU7CisJICBlbHNlCisJICAgIHJldHVybiByZXQ7CisJfQorCisgICAgICBsZW4gLT0gcmV0OworICAgICAgYnVmICs9IHJldDsKKyAgICB9CisKKyAgcmV0dXJuIHNpemU7Cit9CisKKy8qIFdyaXRlIExFTiBieXRlcyBmcm9tIEJVRiB0byBGRC4gUmV0dXJuIGxlc3MgdGhhbiBvciBlcXVhbCB0byB6ZXJvIGlmIGFuCisgICBlcnJvciBvY2N1cnMsIG90aGVyd2lzZSByZXR1cm4gTEVOLiAgKi8KK3N0YXRpYyBpbnQKK253cml0ZSAoaW50IGZkLCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisgIGludCBzaXplID0gbGVuOworCisgIHdoaWxlIChsZW4pCisgICAgeworICAgICAgaW50IHJldCA9IHdyaXRlIChmZCwgYnVmLCBsZW4pOworCisgICAgICBpZiAocmV0IDw9IDApCisJeworCSAgaWYgKGVycm5vID09IEVJTlRSKQorCSAgICBjb250aW51ZTsKKwkgIGVsc2UKKwkgICAgcmV0dXJuIHJldDsKKwl9CisKKyAgICAgIGxlbiAtPSByZXQ7CisgICAgICBidWYgKz0gcmV0OworICAgIH0KKworICByZXR1cm4gc2l6ZTsKK30KKworLyogRHVtcCBCVUYgaW4gdGhlIGZvcm1hdCBvZiBoZXhhZGVjaW1hbCBudW1iZXJzLiAgKi8KK3N0YXRpYyB2b2lkCitoZXhfZHVtcCAodm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKyAgLyogRklYTUU6IEhvdyB0byBkZXRlcm1pbmUgd2hpY2ggbGVuZ3RoIGlzIHJlYWRhYmxlPyAgKi8KKyNkZWZpbmUgTUFYX0NPTFVNTgk3MAorCisgIC8qIHVzZSB1bnNpZ25lZCBjaGFyIGZvciBudW1lcmljYWwgY29tcHV0YXRpb25zICovCisgIHVuc2lnbmVkIGNoYXIgKnB0ciA9IGJ1ZjsKKyAgLyogY291bnQgdGhlIHdpZHRoIG9mIHRoZSBsaW5lICovCisgIGludCBjb2x1bW4gPSAwOworICAvKiBob3cgbWFueSBieXRlcyB3cml0dGVuICovCisgIGludCBjb3VudCA9IDA7CisKKyAgd2hpbGUgKHNpemUgPiAwKQorICAgIHsKKyAgICAgIC8qIGhpZ2ggNCBiaXRzICovCisgICAgICBpbnQgaGkgPSAqcHRyID4+IDQ7CisgICAgICAvKiBsb3cgNCBiaXRzICovCisgICAgICBpbnQgbG93ID0gKnB0ciAmIDB4ZjsKKworICAgICAgLyogZ3J1Yl9wcmludGYgZG9lcyBub3QgaGFuZGxlIHByZWZpeCBudW1iZXIsIHN1Y2ggYXMgJTJ4LCBzbworCSBmb3JtYXQgdGhlIG51bWJlciBieSBoYW5kLi4uICAqLworICAgICAgZ3J1Yl9wcmludGYgKCIleCV4IiwgaGksIGxvdyk7CisgICAgICBjb2x1bW4gKz0gMjsKKyAgICAgIGNvdW50Kys7CisgICAgICBwdHIrKzsKKyAgICAgIHNpemUtLTsKKworICAgICAgLyogSW5zZXJ0IHNwYWNlIG9yIG5ld2xpbmUgd2l0aCB0aGUgaW50ZXJ2YWwgNCBieXRlcy4gICovCisgICAgICBpZiAoc2l6ZSAhPSAwICYmIChjb3VudCAlIDQpID09IDApCisJeworCSAgaWYgKGNvbHVtbiA8IE1BWF9DT0xVTU4pCisJICAgIHsKKwkgICAgICBncnViX3ByaW50ZiAoIiAiKTsKKwkgICAgICBjb2x1bW4rKzsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZ3J1Yl9wcmludGYgKCJcbiIpOworCSAgICAgIGNvbHVtbiA9IDA7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIEFkZCBhIG5ld2xpbmUgYXQgdGhlIGVuZCBmb3IgcmVhZGFiaWxpdHkuICAqLworICBncnViX3ByaW50ZiAoIlxuIik7Cit9CisKK2ludAorYmlvc2Rpc2sgKGludCBzdWJmdW5jLCBpbnQgZHJpdmUsIHN0cnVjdCBnZW9tZXRyeSAqZ2VvbWV0cnksCisJICBpbnQgc2VjdG9yLCBpbnQgbnNlYywgaW50IHNlZ21lbnQpCit7CisgIGNoYXIgKmJ1ZjsKKyAgaW50IGZkID0gZ2VvbWV0cnktPmZsYWdzOworCisgIC8qIEdldCB0aGUgZmlsZSBwb2ludGVyIGZyb20gdGhlIGdlb21ldHJ5LCBhbmQgbWFrZSBzdXJlIGl0IG1hdGNoZXMuICovCisgIGlmIChmZCA9PSAtMSB8fCBmZCAhPSBkaXNrc1tkcml2ZV0uZmxhZ3MpCisgICAgcmV0dXJuIEJJT1NESVNLX0VSUk9SX0dFT01FVFJZOworCisgIC8qIFNlZWsgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4gKi8KKyNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgKCFkZWZpbmVkKF9fR0xJQkNfXykgfHwgXAorCSgoX19HTElCQ19fIDwgMikgfHwgKChfX0dMSUJDX18gPT0gMikgJiYgKF9fR0xJQkNfTUlOT1JfXyA8IDEpKSkpCisgIC8qIE1heWJlIGxpYmMgZG9lc24ndCBoYXZlIGxhcmdlIGZpbGUgc3VwcG9ydC4gICovCisgIHsKKyAgICBsb2ZmX3Qgb2Zmc2V0LCByZXN1bHQ7CisgICAgc3RhdGljIGludCBfbGxzZWVrICh1aW50IGZpbGVkZXMsIHVsb25nIGhpLCB1bG9uZyBsbywKKwkJCWxvZmZfdCAqcmVzLCB1aW50IHdoKTsKKyAgICBfc3lzY2FsbDUgKGludCwgX2xsc2VlaywgdWludCwgZmlsZWRlcywgdWxvbmcsIGhpLCB1bG9uZywgbG8sCisJICAgICAgIGxvZmZfdCAqLCByZXMsIHVpbnQsIHdoKTsKKworICAgIG9mZnNldCA9IChsb2ZmX3QpIHNlY3RvciAqIChsb2ZmX3QpIFNFQ1RPUl9TSVpFOworICAgIGlmIChfbGxzZWVrIChmZCwgb2Zmc2V0ID4+IDMyLCBvZmZzZXQgJiAweGZmZmZmZmZmLCAmcmVzdWx0LCBTRUVLX1NFVCkpCisgICAgICByZXR1cm4gLTE7CisgIH0KKyNlbHNlCisgIHsKKyAgICBvZmZfdCBvZmZzZXQgPSAob2ZmX3QpIHNlY3RvciAqIChvZmZfdCkgU0VDVE9SX1NJWkU7CisKKyAgICBpZiAobHNlZWsgKGZkLCBvZmZzZXQsIFNFRUtfU0VUKSAhPSBvZmZzZXQpCisgICAgICByZXR1cm4gLTE7CisgIH0KKyNlbmRpZgorCisgIGJ1ZiA9IChjaGFyICopIChzZWdtZW50IDw8IDQpOworCisgIHN3aXRjaCAoc3ViZnVuYykKKyAgICB7CisgICAgY2FzZSBCSU9TRElTS19SRUFEOgorI2lmZGVmIF9fbGludXhfXworICAgICAgaWYgKHNlY3RvciA9PSAwICYmIG5zZWMgPiAxKQorCXsKKwkgIC8qIFdvcmsgYXJvdW5kIGEgYnVnIGluIGxpbnV4J3MgZXogcmVtYXBwaW5nLiAgTGludXggcmVtYXBzIGFsbAorCSAgICAgc2VjdG9ycyB0aGF0IGFyZSByZWFkIHRvZ2V0aGVyIHdpdGggdGhlIE1CUiBpbiBvbmUgcmVhZC4gIEl0CisJICAgICBzaG91bGQgb25seSByZW1hcCB0aGUgTUJSLCBzbyB3ZSBzcGxpdCB0aGUgcmVhZCBpbiB0d28gCisJICAgICBwYXJ0cy4gLWpvY2hlbiAgKi8KKwkgIGlmIChucmVhZCAoZmQsIGJ1ZiwgU0VDVE9SX1NJWkUpICE9IFNFQ1RPUl9TSVpFKQorCSAgICByZXR1cm4gLTE7CisJICBidWYgKz0gU0VDVE9SX1NJWkU7CisJICBuc2VjLS07CisJfQorI2VuZGlmCisgICAgICBpZiAobnJlYWQgKGZkLCBidWYsIG5zZWMgKiBTRUNUT1JfU0laRSkgIT0gbnNlYyAqIFNFQ1RPUl9TSVpFKQorCXJldHVybiAtMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCSU9TRElTS19XUklURToKKyAgICAgIGlmICh2ZXJib3NlKQorCXsKKwkgIGdydWJfcHJpbnRmICgiV3JpdGUgJWQgc2VjdG9ycyBzdGFydGluZyBmcm9tICVkIHNlY3RvciIKKwkJICAgICAgICIgdG8gZHJpdmUgMHgleCAoJXMpXG4iLAorCQkgICAgICAgbnNlYywgc2VjdG9yLCBkcml2ZSwgZGV2aWNlX21hcFtkcml2ZV0pOworCSAgaGV4X2R1bXAgKGJ1ZiwgbnNlYyAqIFNFQ1RPUl9TSVpFKTsKKwl9CisgICAgICBpZiAoISByZWFkX29ubHkpCisJaWYgKG53cml0ZSAoZmQsIGJ1ZiwgbnNlYyAqIFNFQ1RPUl9TSVpFKSAhPSBuc2VjICogU0VDVE9SX1NJWkUpCisJICByZXR1cm4gLTE7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBncnViX3ByaW50ZiAoInVua25vd24gc3ViZnVuYyAlZFxuIiwgc3ViZnVuYyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKwordm9pZAorc3RvcF9mbG9wcHkgKHZvaWQpCit7CisgIC8qIE5PVFVTRUQgKi8KK30KKworLyogRmV0Y2ggYSBrZXkgZnJvbSBhIHNlcmlhbCBkZXZpY2UuICAqLworaW50CitzZXJpYWxfaHdfZmV0Y2ggKHZvaWQpCit7CisgIGZkX3NldCBmZHM7CisgIHN0cnVjdCB0aW1ldmFsIHRvOworICBjaGFyIGM7CisKKyAgLyogV2FpdCBvbmx5IGZvciB0aGUgc2VyaWFsIGRldmljZS4gICovCisgIEZEX1pFUk8gKCZmZHMpOworICBGRF9TRVQgKHNlcmlhbF9mZCwgJmZkcyk7CisKKyAgdG8udHZfc2VjID0gMDsKKyAgdG8udHZfdXNlYyA9IDA7CisgIAorICBpZiAoc2VsZWN0IChzZXJpYWxfZmQgKyAxLCAmZmRzLCAwLCAwLCAmdG8pID4gMCkKKyAgICB7CisgICAgICBpZiAobnJlYWQgKHNlcmlhbF9mZCwgJmMsIDEpICE9IDEpCisJc3RvcCAoKTsKKworICAgICAgcmV0dXJuIGM7CisgICAgfQorICAKKyAgcmV0dXJuIC0xOworfQorCisvKiBQdXQgYSBjaGFyYWN0ZXIgdG8gYSBzZXJpYWwgZGV2aWNlLiAgKi8KK3ZvaWQKK3NlcmlhbF9od19wdXQgKGludCBjKQoreworICBjaGFyIGNoID0gKGNoYXIpIGM7CisgIAorICBpZiAobndyaXRlIChzZXJpYWxfZmQsICZjaCwgMSkgIT0gMSkKKyAgICBzdG9wICgpOworfQorCit2b2lkCitzZXJpYWxfaHdfZGVsYXkgKHZvaWQpCit7CisjaWZkZWYgU0lNVUxBVEVfU0xPV05FU1NfT0ZfU0VSSUFMCisgIHN0cnVjdCB0aW1ldmFsIG90diwgdHY7CisKKyAgZ2V0dGltZW9mZGF5ICgmb3R2LCAwKTsKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBsb25nIGRlbHRhOworICAgICAgCisgICAgICBnZXR0aW1lb2ZkYXkgKCZ0diwgMCk7CisgICAgICBkZWx0YSA9IHR2LnR2X3VzZWMgLSBvdHYudHZfdXNlYzsKKyAgICAgIGlmIChkZWx0YSA8IDApCisJZGVsdGEgKz0gMTAwMDAwMDsKKyAgICAgIAorICAgICAgaWYgKGRlbHRhID49IDEwMDAwMDAgLyAoc2VyaWFsX3NwZWVkID4+IDMpKQorCWJyZWFrOworICAgIH0KKyNlbmRpZiAvKiBTSU1VTEFURV9TTE9XTkVTU19PRl9TRVJJQUwgKi8KK30KKworc3RhdGljIHNwZWVkX3QKK2dldF90ZXJtaW9zX3NwZWVkIChpbnQgc3BlZWQpCit7CisgIHN3aXRjaCAoc3BlZWQpCisgICAgeworICAgIGNhc2UgMjQwMDogcmV0dXJuIEIyNDAwOworICAgIGNhc2UgNDgwMDogcmV0dXJuIEI0ODAwOworICAgIGNhc2UgOTYwMDogcmV0dXJuIEI5NjAwOworICAgIGNhc2UgMTkyMDA6IHJldHVybiBCMTkyMDA7CisgICAgY2FzZSAzODQwMDogcmV0dXJuIEIzODQwMDsKKyNpZmRlZiBCNTc2MDAKKyAgICBjYXNlIDU3NjAwOiByZXR1cm4gQjU3NjAwOworI2VuZGlmCisjaWZkZWYgQjExNTIwMCAgICAgIAorICAgIGNhc2UgMTE1MjAwOiByZXR1cm4gQjExNTIwMDsKKyNlbmRpZgorICAgIH0KKworICByZXR1cm4gQjA7Cit9CisKKy8qIEdldCB0aGUgcG9ydCBudW1iZXIgb2YgdGhlIHVuaXQgVU5JVC4gSW4gdGhlIGdydWIgc2hlbGwsIHRoaXMgZG9lc24ndAorICAgbWFrZSBzZW5zZS4gICovCit1bnNpZ25lZCBzaG9ydAorc2VyaWFsX2h3X2dldF9wb3J0IChpbnQgdW5pdCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKKy8qIEluaXRpYWxpemUgYSBzZXJpYWwgZGV2aWNlLiBJbiB0aGUgZ3J1YiBzaGVsbCwgUE9SVCBpcyB1bnVzZWQuICAqLworaW50CitzZXJpYWxfaHdfaW5pdCAodW5zaWduZWQgc2hvcnQgcG9ydCwgdW5zaWduZWQgaW50IHNwZWVkLAorCQlpbnQgd29yZF9sZW4sIGludCBwYXJpdHksIGludCBzdG9wX2JpdF9sZW4pCit7CisgIHN0cnVjdCB0ZXJtaW9zIHRlcm1pb3M7CisgIHNwZWVkX3QgdGVybWlvc19zcGVlZDsKKyAgaW50IGk7CisgIAorICAvKiBDaGVjayBpZiB0aGUgZmlsZSBuYW1lIGlzIHNwZWNpZmllZC4gICovCisgIGlmICghIHNlcmlhbF9kZXZpY2UpCisgICAgcmV0dXJuIDA7CisKKyAgLyogSWYgYSBzZXJpYWwgZGV2aWNlIGlzIGFscmVhZHkgb3BlbmVkLCBjbG9zZSBpdCBmaXJzdC4gICovCisgIGlmIChzZXJpYWxfZmQgPj0gMCkKKyAgICBjbG9zZSAoc2VyaWFsX2ZkKTsKKyAgCisgIC8qIE9wZW4gdGhlIGRldmljZSBmaWxlLiAgKi8KKyAgc2VyaWFsX2ZkID0gb3BlbiAoc2VyaWFsX2RldmljZSwKKwkJICAgIE9fUkRXUiB8IE9fTk9DVFRZCisjaWYgZGVmaW5lZChPX1NZTkMpCisJCSAgICAvKiBPX1NZTkMgaXMgdXNlZCBpbiBMaW51eCAoYW5kIHNvbWUgb3RoZXJzPykuICAqLworCQkgICAgfCBPX1NZTkMKKyNlbGlmIGRlZmluZWQoT19GU1lOQykKKwkJICAgIC8qIE9fRlNZTkMgaXMgdXNlZCBpbiBGcmVlQlNELiAgKi8KKwkJICAgIHwgT19GU1lOQworI2VuZGlmCisJCSAgICApOworICBpZiAoc2VyaWFsX2ZkIDwgMCkKKyAgICByZXR1cm4gMDsKKworICAvKiBHZXQgdGhlIHRlcm1pb3MgcGFyYW1ldGVycy4gICovCisgIGlmICh0Y2dldGF0dHIgKHNlcmlhbF9mZCwgJnRlcm1pb3MpKQorICAgIGdvdG8gZmFpbDsKKworICAvKiBSYXcgbW9kZS4gICovCisgIGNmbWFrZXJhdyAoJnRlcm1pb3MpOworCisgIC8qIFNldCB0aGUgc3BlZWQuICAqLworICB0ZXJtaW9zX3NwZWVkID0gZ2V0X3Rlcm1pb3Nfc3BlZWQgKHNwZWVkKTsKKyAgaWYgKHRlcm1pb3Nfc3BlZWQgPT0gQjApCisgICAgZ290byBmYWlsOworICAKKyAgY2ZzZXRpc3BlZWQgKCZ0ZXJtaW9zLCB0ZXJtaW9zX3NwZWVkKTsKKyAgY2ZzZXRvc3BlZWQgKCZ0ZXJtaW9zLCB0ZXJtaW9zX3NwZWVkKTsKKworICAvKiBTZXQgdGhlIHdvcmQgbGVuZ3RoLiAgKi8KKyAgdGVybWlvcy5jX2NmbGFnICY9IH5DU0laRTsKKyAgc3dpdGNoICh3b3JkX2xlbikKKyAgICB7CisgICAgY2FzZSBVQVJUXzVCSVRTX1dPUkQ6CisgICAgICB0ZXJtaW9zLmNfY2ZsYWcgfD0gQ1M1OworICAgICAgYnJlYWs7CisgICAgY2FzZSBVQVJUXzZCSVRTX1dPUkQ6CisgICAgICB0ZXJtaW9zLmNfY2ZsYWcgfD0gQ1M2OworICAgICAgYnJlYWs7CisgICAgY2FzZSBVQVJUXzdCSVRTX1dPUkQ6CisgICAgICB0ZXJtaW9zLmNfY2ZsYWcgfD0gQ1M3OworICAgICAgYnJlYWs7CisgICAgY2FzZSBVQVJUXzhCSVRTX1dPUkQ6CisgICAgICB0ZXJtaW9zLmNfY2ZsYWcgfD0gQ1M4OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgLyogU2V0IHRoZSBwYXJpdHkuICAqLworICBzd2l0Y2ggKHBhcml0eSkKKyAgICB7CisgICAgY2FzZSBVQVJUX05PX1BBUklUWToKKyAgICAgIHRlcm1pb3MuY19jZmxhZyAmPSB+UEFSRU5COworICAgICAgYnJlYWs7CisgICAgY2FzZSBVQVJUX09ERF9QQVJJVFk6CisgICAgICB0ZXJtaW9zLmNfY2ZsYWcgfD0gUEFSRU5COworICAgICAgdGVybWlvcy5jX2NmbGFnIHw9IFBBUk9ERDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVUFSVF9FVkVOX1BBUklUWToKKyAgICAgIHRlcm1pb3MuY19jZmxhZyB8PSBQQVJFTkI7CisgICAgICB0ZXJtaW9zLmNfY2ZsYWcgJj0gflBBUk9ERDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgIC8qIFNldCB0aGUgbGVuZ3RoIG9mIHN0b3AgYml0LiAgKi8KKyAgc3dpdGNoIChzdG9wX2JpdF9sZW4pCisgICAgeworICAgIGNhc2UgVUFSVF8xX1NUT1BfQklUOgorICAgICAgdGVybWlvcy5jX2NmbGFnICY9IH5DU1RPUEI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVBUlRfMl9TVE9QX0JJVFM6CisgICAgICB0ZXJtaW9zLmNfY2ZsYWcgfD0gQ1NUT1BCOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgLyogU2V0IHRoZSBwYXJhbWV0ZXJzLiAgKi8KKyAgaWYgKHRjc2V0YXR0ciAoc2VyaWFsX2ZkLCBUQ1NBTk9XLCAmdGVybWlvcykpCisgICAgZ290byBmYWlsOworCisjaWZkZWYgU0lNVUxBVEVfU0xPV05FU1NfT0ZfU0VSSUFMCisgIHNlcmlhbF9zcGVlZCA9IHNwZWVkOworI2VuZGlmIC8qIFNJTVVBVEVfU0xPV05FU1NfT0ZfU0VSSUFMICovCisKKyAgLyogR2V0IHJpZCBvZiB0aGUgZmxhZyBURVJNX05FRURfSU5JVCBmcm9tIHRoZSBzZXJpYWwgdGVybWluYWwuICAqLworICBmb3IgKGkgPSAwOyB0ZXJtX3RhYmxlW2ldLm5hbWU7IGkrKykKKyAgICB7CisgICAgICBpZiAoc3RyY21wICh0ZXJtX3RhYmxlW2ldLm5hbWUsICJzZXJpYWwiKSA9PSAwKQorCXsKKwkgIHRlcm1fdGFibGVbaV0uZmxhZ3MgJj0gfihURVJNX05FRURfSU5JVCk7CisJICBicmVhazsKKwl9CisgICAgfQorICAKKyAgcmV0dXJuIDE7CisKKyBmYWlsOgorICBjbG9zZSAoc2VyaWFsX2ZkKTsKKyAgc2VyaWFsX2ZkID0gLTE7CisgIHJldHVybiAwOworfQorCisvKiBTZXQgdGhlIGZpbGUgbmFtZSBvZiBhIHNlcmlhbCBkZXZpY2UgKG9yIGEgcHR5IGRldmljZSkuIFRoaXMgaXMgYQorICAgZnVuY3Rpb24gc3BlY2lmaWMgdG8gdGhlIGdydWIgc2hlbGwuICAqLwordm9pZAorc2VyaWFsX3NldF9kZXZpY2UgKGNvbnN0IGNoYXIgKmRldmljZSkKK3sKKyAgaWYgKHNlcmlhbF9kZXZpY2UpCisgICAgZnJlZSAoc2VyaWFsX2RldmljZSk7CisgIAorICBzZXJpYWxfZGV2aWNlID0gc3RyZHVwIChkZXZpY2UpOworfQorCisvKiBUaGVyZSBpcyBubyBkaWZmZXJlbmNlIGJldHdlZW4gY29uc29sZSBhbmQgaGVyY3VsZXMgaW4gdGhlIGdydWIgc2hlbGwuICAqLwordm9pZAoraGVyY3VsZXNfcHV0Y2hhciAoaW50IGMpCit7CisgIGNvbnNvbGVfcHV0Y2hhciAoYyk7Cit9CisKK2ludAoraGVyY3VsZXNfZ2V0eHkgKHZvaWQpCit7CisgIHJldHVybiBjb25zb2xlX2dldHh5ICgpOworfQorCit2b2lkCitoZXJjdWxlc19nb3RveHkgKGludCB4LCBpbnQgeSkKK3sKKyAgY29uc29sZV9nb3RveHkgKHgsIHkpOworfQorCit2b2lkCitoZXJjdWxlc19jbHMgKHZvaWQpCit7CisgIGNvbnNvbGVfY2xzICgpOworfQorCit2b2lkCitoZXJjdWxlc19zZXRjb2xvcnN0YXRlIChjb2xvcl9zdGF0ZSBzdGF0ZSkKK3sKKyAgY29uc29sZV9zZXRjb2xvcnN0YXRlIChzdGF0ZSk7Cit9CisKK3ZvaWQKK2hlcmN1bGVzX3NldGNvbG9yIChpbnQgbm9ybWFsX2NvbG9yLCBpbnQgaGlnaGxpZ2h0X2NvbG9yKQoreworICBjb25zb2xlX3NldGNvbG9yIChub3JtYWxfY29sb3IsIGhpZ2hsaWdodF9jb2xvcik7Cit9CisKK2ludAoraGVyY3VsZXNfc2V0Y3Vyc29yIChpbnQgb24pCit7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZ3J1Yi9tYWluLmMgYi9ncnViL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmU4NDdlCi0tLSAvZGV2L251bGwKKysrIGIvZ3J1Yi9tYWluLmMKQEAgLTAsMCArMSwyNjUgQEAKKy8qIG1haW4uYyAtIGV4cGVyaW1lbnRhbCBHUlVCIHN0YWdlMiB0aGF0IHJ1bnMgdW5kZXIgVW5peCAqLworLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSwyMDAyICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qIFNpbXVsYXRvciBlbnRyeSBwb2ludC4gKi8KK2ludCBncnViX3N0YWdlMiAodm9pZCk7CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorCisjZGVmaW5lIFdJVEhPVVRfTElCQ19TVFVCUyAxCisjaW5jbHVkZSA8c2hhcmVkLmg+CisjaW5jbHVkZSA8dGVybS5oPgorCitjaGFyICpwcm9ncmFtX25hbWUgPSAwOworaW50IHVzZV9jb25maWdfZmlsZSA9IDE7CitpbnQgdXNlX3ByZXNldF9tZW51ID0gMDsKKyNpZmRlZiBIQVZFX0xJQkNVUlNFUworaW50IHVzZV9jdXJzZXMgPSAxOworI2Vsc2UKK2ludCB1c2VfY3Vyc2VzID0gMDsKKyNlbmRpZgoraW50IHZlcmJvc2UgPSAwOworaW50IHJlYWRfb25seSA9IDA7CitpbnQgZmxvcHB5X2Rpc2tzID0gMTsKK2NoYXIgKmRldmljZV9tYXBfZmlsZSA9IDA7CitzdGF0aWMgaW50IGRlZmF1bHRfYm9vdF9kcml2ZTsKK3N0YXRpYyBpbnQgZGVmYXVsdF9pbnN0YWxsX3BhcnRpdGlvbjsKK3N0YXRpYyBjaGFyICpkZWZhdWx0X2NvbmZpZ19maWxlOworCisjZGVmaW5lIE9QVF9IRUxQCQktMgorI2RlZmluZSBPUFRfVkVSU0lPTgkJLTMKKyNkZWZpbmUgT1BUX0hPTEQJCS00CisjZGVmaW5lIE9QVF9DT05GSUdfRklMRQkJLTUKKyNkZWZpbmUgT1BUX0lOU1RBTExfUEFSVElUSU9OCS02CisjZGVmaW5lIE9QVF9CT09UX0RSSVZFCQktNworI2RlZmluZSBPUFRfTk9fQ09ORklHX0ZJTEUJLTgKKyNkZWZpbmUgT1BUX05PX0NVUlNFUwkJLTkKKyNkZWZpbmUgT1BUX0JBVENICQktMTAKKyNkZWZpbmUgT1BUX1ZFUkJPU0UJCS0xMQorI2RlZmluZSBPUFRfUkVBRF9PTkxZCQktMTIKKyNkZWZpbmUgT1BUX1BST0JFX1NFQ09ORF9GTE9QUFkJLTEzCisjZGVmaW5lIE9QVF9OT19GTE9QUFkJCS0xNAorI2RlZmluZSBPUFRfREVWSUNFX01BUAkJLTE1CisjZGVmaW5lIE9QVF9QUkVTRVRfTUVOVQkJLTE2CisjZGVmaW5lIE9QVF9OT19QQUdFUgkJLTE3CisjZGVmaW5lIE9QVFNUUklORyAiIgorCitzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0KK3sKKyAgeyJiYXRjaCIsIG5vX2FyZ3VtZW50LCAwLCBPUFRfQkFUQ0h9LAorICB7ImJvb3QtZHJpdmUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUX0JPT1RfRFJJVkV9LAorICB7ImNvbmZpZy1maWxlIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVF9DT05GSUdfRklMRX0sCisgIHsiZGV2aWNlLW1hcCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRfREVWSUNFX01BUH0sCisgIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCBPUFRfSEVMUH0sCisgIHsiaG9sZCIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCBPUFRfSE9MRH0sCisgIHsiaW5zdGFsbC1wYXJ0aXRpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUX0lOU1RBTExfUEFSVElUSU9OfSwKKyAgeyJuby1jb25maWctZmlsZSIsIG5vX2FyZ3VtZW50LCAwLCBPUFRfTk9fQ09ORklHX0ZJTEV9LAorICB7Im5vLWN1cnNlcyIsIG5vX2FyZ3VtZW50LCAwLCBPUFRfTk9fQ1VSU0VTfSwKKyAgeyJuby1mbG9wcHkiLCBub19hcmd1bWVudCwgMCwgT1BUX05PX0ZMT1BQWX0sCisgIHsibm8tcGFnZXIiLCBub19hcmd1bWVudCwgMCwgT1BUX05PX1BBR0VSfSwKKyAgeyJwcmVzZXQtbWVudSIsIG5vX2FyZ3VtZW50LCAwLCBPUFRfUFJFU0VUX01FTlV9LAorICB7InByb2JlLXNlY29uZC1mbG9wcHkiLCBub19hcmd1bWVudCwgMCwgT1BUX1BST0JFX1NFQ09ORF9GTE9QUFl9LAorICB7InJlYWQtb25seSIsIG5vX2FyZ3VtZW50LCAwLCBPUFRfUkVBRF9PTkxZfSwKKyAgeyJ2ZXJib3NlIiwgbm9fYXJndW1lbnQsIDAsIE9QVF9WRVJCT1NFfSwKKyAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsIE9QVF9WRVJTSU9OfSwKKyAgezB9LAorfTsKKworCitzdGF0aWMgdm9pZAordXNhZ2UgKGludCBzdGF0dXMpCit7CisgIGlmIChzdGF0dXMpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiVHJ5IGBgZ3J1YiAtLWhlbHAnJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiIpOworICBlbHNlCisgICAgcHJpbnRmICgiXAorVXNhZ2U6IGdydWIgW09QVElPTl0uLi5cblwKK1xuXAorRW50ZXIgdGhlIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlciBjb21tYW5kIHNoZWxsLlxuXAorXG5cCisgICAgLS1iYXRjaCAgICAgICAgICAgICAgICAgIHR1cm4gb24gYmF0Y2ggbW9kZSBmb3Igbm9uLWludGVyYWN0aXZlIHVzZVxuXAorICAgIC0tYm9vdC1kcml2ZT1EUklWRSAgICAgICBzcGVjaWZ5IHN0YWdlMiBib290X2RyaXZlIFtkZWZhdWx0PTB4JXhdXG5cCisgICAgLS1jb25maWctZmlsZT1GSUxFICAgICAgIHNwZWNpZnkgc3RhZ2UyIGNvbmZpZ19maWxlIFtkZWZhdWx0PSVzXVxuXAorICAgIC0tZGV2aWNlLW1hcD1GSUxFICAgICAgICB1c2UgdGhlIGRldmljZSBtYXAgZmlsZSBGSUxFXG5cCisgICAgLS1oZWxwICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBtZXNzYWdlIGFuZCBleGl0XG5cCisgICAgLS1ob2xkICAgICAgICAgICAgICAgICAgIHdhaXQgdW50aWwgYSBkZWJ1Z2dlciB3aWxsIGF0dGFjaFxuXAorICAgIC0taW5zdGFsbC1wYXJ0aXRpb249UEFSICBzcGVjaWZ5IHN0YWdlMiBpbnN0YWxsX3BhcnRpdGlvbiBbZGVmYXVsdD0weCV4XVxuXAorICAgIC0tbm8tY29uZmlnLWZpbGUgICAgICAgICBkbyBub3QgdXNlIHRoZSBjb25maWcgZmlsZVxuXAorICAgIC0tbm8tY3Vyc2VzICAgICAgICAgICAgICBkbyBub3QgdXNlIGN1cnNlc1xuXAorICAgIC0tbm8tZmxvcHB5ICAgICAgICAgICAgICBkbyBub3QgcHJvYmUgYW55IGZsb3BweSBkcml2ZVxuXAorICAgIC0tbm8tcGFnZXIgICAgICAgICAgICAgICBkbyBub3QgdXNlIGludGVybmFsIHBhZ2VyXG5cCisgICAgLS1wcmVzZXQtbWVudSAgICAgICAgICAgIHVzZSB0aGUgcHJlc2V0IG1lbnVcblwKKyAgICAtLXByb2JlLXNlY29uZC1mbG9wcHkgICAgcHJvYmUgdGhlIHNlY29uZCBmbG9wcHkgZHJpdmVcblwKKyAgICAtLXJlYWQtb25seSAgICAgICAgICAgICAgZG8gbm90IHdyaXRlIGFueXRoaW5nIHRvIGRldmljZXNcblwKKyAgICAtLXZlcmJvc2UgICAgICAgICAgICAgICAgcHJpbnQgdmVyYm9zZSBtZXNzYWdlc1xuXAorICAgIC0tdmVyc2lvbiAgICAgICAgICAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0XG5cCitcblwKK1JlcG9ydCBidWdzIHRvIDxidWctZ3J1YkBnbnUub3JnPi5cblwKKyIsCisJICAgIGRlZmF1bHRfYm9vdF9kcml2ZSwgZGVmYXVsdF9jb25maWdfZmlsZSwKKwkgICAgZGVmYXVsdF9pbnN0YWxsX3BhcnRpdGlvbik7CisKKyAgZXhpdCAoc3RhdHVzKTsKK30KKworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IGM7CisgIGludCBob2xkID0gMDsKKworICAvKiBGaXJzdCBvZiBhbGwsIGNhbGwgc3luYyBzbyB0aGF0IGFsbCBpbi1jb3JlIGRhdGEgaXMgc2NoZWR1bGVkIHRvIGJlCisgICAgIGFjdHVhbGx5IHdyaXR0ZW4gdG8gZGlza3MuIFRoaXMgaXMgdmVyeSBpbXBvcnRhbnQgYmVjYXVzZSBHUlVCIGRvZXMKKyAgICAgbm90IHVzZSBvcmRpbmFyeSBzdGRpbyBpbnRlcmZhY2UgYnV0IHJhdyBkZXZpY2VzLiAgKi8KKyAgc3luYyAoKTsKKyAgCisgIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07CisgIGRlZmF1bHRfYm9vdF9kcml2ZSA9IGJvb3RfZHJpdmU7CisgIGRlZmF1bHRfaW5zdGFsbF9wYXJ0aXRpb24gPSBpbnN0YWxsX3BhcnRpdGlvbjsKKyAgaWYgKGNvbmZpZ19maWxlKQorICAgIGRlZmF1bHRfY29uZmlnX2ZpbGUgPSBjb25maWdfZmlsZTsKKyAgZWxzZQorICAgIGRlZmF1bHRfY29uZmlnX2ZpbGUgPSAiTk9ORSI7CisgIAorICAvKiBQYXJzZSBjb21tYW5kLWxpbmUgb3B0aW9ucy4gKi8KKyAgZG8KKyAgICB7CisgICAgICBjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsIE9QVFNUUklORywgbG9uZ29wdHMsIDApOworICAgICAgc3dpdGNoIChjKQorCXsKKwljYXNlIEVPRjoKKwkgIC8qIEZhbGwgdGhyb3VnaCB0aGUgYm90dG9tIG9mIHRoZSBsb29wLiAqLworCSAgYnJlYWs7CisKKwljYXNlIE9QVF9IRUxQOgorCSAgdXNhZ2UgKDApOworCSAgYnJlYWs7CisKKwljYXNlIE9QVF9WRVJTSU9OOgorCSAgcHJpbnRmICgiZ3J1YiAoR05VIEdSVUIgIiBWRVJTSU9OICIpXG4iKTsKKwkgIGV4aXQgKDApOworCSAgYnJlYWs7CisKKwljYXNlIE9QVF9IT0xEOgorCSAgaWYgKCEgb3B0YXJnKQorCSAgICBob2xkID0gLTE7CisJICBlbHNlCisJICAgIGhvbGQgPSBhdG9pIChvcHRhcmcpOworCSAgYnJlYWs7CisKKwljYXNlIE9QVF9DT05GSUdfRklMRToKKwkgIHN0cm5jcHkgKGNvbmZpZ19maWxlLCBvcHRhcmcsIDEyNyk7IC8qIEZJWE1FOiBhcmJpdHJhcnkgKi8KKwkgIGNvbmZpZ19maWxlWzEyN10gPSAnXDAnOworCSAgYnJlYWs7CisKKwljYXNlIE9QVF9JTlNUQUxMX1BBUlRJVElPTjoKKwkgIGluc3RhbGxfcGFydGl0aW9uID0gc3RydG91bCAob3B0YXJnLCAwLCAwKTsKKwkgIGlmIChpbnN0YWxsX3BhcnRpdGlvbiA9PSBVTE9OR19NQVgpCisJICAgIHsKKwkgICAgICBwZXJyb3IgKCJzdHJ0b3VsIik7CisJICAgICAgZXhpdCAoMSk7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBPUFRfQk9PVF9EUklWRToKKwkgIGJvb3RfZHJpdmUgPSBzdHJ0b3VsIChvcHRhcmcsIDAsIDApOworCSAgaWYgKGJvb3RfZHJpdmUgPT0gVUxPTkdfTUFYKQorCSAgICB7CisJICAgICAgcGVycm9yICgic3RydG91bCIpOworCSAgICAgIGV4aXQgKDEpOworCSAgICB9CisJICBicmVhazsKKworCWNhc2UgT1BUX05PX0NPTkZJR19GSUxFOgorCSAgdXNlX2NvbmZpZ19maWxlID0gMDsKKwkgIGJyZWFrOworCisJY2FzZSBPUFRfTk9fQ1VSU0VTOgorCSAgdXNlX2N1cnNlcyA9IDA7CisJICBicmVhazsKKworCWNhc2UgT1BUX05PX1BBR0VSOgorCSAgdXNlX3BhZ2VyID0gMDsKKwkgIGJyZWFrOworCisJY2FzZSBPUFRfQkFUQ0g6CisJICAvKiBUaGlzIGlzIHRoZSBzYW1lIGFzICItLW5vLWNvbmZpZy1maWxlIC0tbm8tY3Vyc2VzIC0tbm8tcGFnZXIiLiAgKi8KKwkgIHVzZV9jb25maWdfZmlsZSA9IDA7CisJICB1c2VfY3Vyc2VzID0gMDsKKwkgIHVzZV9wYWdlciA9IDA7CisJICBicmVhazsKKworCWNhc2UgT1BUX1JFQURfT05MWToKKwkgIHJlYWRfb25seSA9IDE7CisJICBicmVhazsKKworCWNhc2UgT1BUX1ZFUkJPU0U6CisJICB2ZXJib3NlID0gMTsKKwkgIGJyZWFrOworCisJY2FzZSBPUFRfTk9fRkxPUFBZOgorCSAgZmxvcHB5X2Rpc2tzID0gMDsKKwkgIGJyZWFrOworCisJY2FzZSBPUFRfUFJPQkVfU0VDT05EX0ZMT1BQWToKKwkgIGZsb3BweV9kaXNrcyA9IDI7CisJICBicmVhazsKKworCWNhc2UgT1BUX0RFVklDRV9NQVA6CisJICBkZXZpY2VfbWFwX2ZpbGUgPSBzdHJkdXAgKG9wdGFyZyk7CisJICBicmVhazsKKworCWNhc2UgT1BUX1BSRVNFVF9NRU5VOgorCSAgdXNlX3ByZXNldF9tZW51ID0gMTsKKwkgIGJyZWFrOworCSAgCisJZGVmYXVsdDoKKwkgIHVzYWdlICgxKTsKKwl9CisgICAgfQorICB3aGlsZSAoYyAhPSBFT0YpOworCisgIC8qIFdhaXQgdW50aWwgdGhlIEhPTEQgdmFyaWFibGUgaXMgY2xlYXJlZCBieSBhbiBhdHRhY2hlZCBkZWJ1Z2dlci4gKi8KKyAgaWYgKGhvbGQgJiYgdmVyYm9zZSkKKyAgICBwcmludGYgKCJSdW4gXCJnZGIgJXMgJWRcIiwgYW5kIHNldCBIT0xEIHRvIHplcm8uXG4iLAorCSAgICBwcm9ncmFtX25hbWUsIChpbnQpIGdldHBpZCAoKSk7CisgIHdoaWxlIChob2xkKQorICAgIHsKKyAgICAgIGlmIChob2xkID4gMCkKKwlob2xkLS07CisgICAgICAKKyAgICAgIHNsZWVwICgxKTsKKyAgICB9CisKKyAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBjdXJzZXMgKCFIQVZFX0xJQkNVUlNFUyBvciAtLW5vLWN1cnNlcyBvcgorICAgICAtLWJhdGNoKSBwdXQgdGVybWluYWwgdG8gZHVtYiBmb3IgYmV0dGVyIGhhbmRsaW5nIG9mIGxpbmUgaS9vICovCisgIGlmICghIHVzZV9jdXJzZXMpCisgICAgY3VycmVudF90ZXJtLT5mbGFncyA9IFRFUk1fTk9fRURJVCB8IFRFUk1fRFVNQjsKKworICAvKiBUcmFuc2ZlciBjb250cm9sIHRvIHRoZSBzdGFnZTIgc2ltdWxhdG9yLiAqLworICBleGl0IChncnViX3N0YWdlMiAoKSk7Cit9CmRpZmYgLS1naXQgYS9pbnN0YWxsLXNoIGIvaW5zdGFsbC1zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZWJlNDZkCi0tLSAvZGV2L251bGwKKysrIGIvaW5zdGFsbC1zaApAQCAtMCwwICsxLDMyMyBAQAorIyEvYmluL3NoCisjIGluc3RhbGwgLSBpbnN0YWxsIGEgcHJvZ3JhbSwgc2NyaXB0LCBvciBkYXRhZmlsZQorCitzY3JpcHR2ZXJzaW9uPTIwMDQtMTItMTcuMDkKKworIyBUaGlzIG9yaWdpbmF0ZXMgZnJvbSBYMTFSNSAobWl0L3V0aWwvc2NyaXB0cy9pbnN0YWxsLnNoKSwgd2hpY2ggd2FzCisjIGxhdGVyIHJlbGVhc2VkIGluIFgxMVI2ICh4Yy9jb25maWcvdXRpbC9pbnN0YWxsLnNoKSB3aXRoIHRoZQorIyBmb2xsb3dpbmcgY29weXJpZ2h0IGFuZCBsaWNlbnNlLgorIworIyBDb3B5cmlnaHQgKEMpIDE5OTQgWCBDb25zb3J0aXVtCisjCisjIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyMgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvCisjIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlCisjIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorIyBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworIyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIworIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorIyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyMKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyMgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyMgWCBDT05TT1JUSVVNIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorIyBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUMtCisjIFRJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisjCisjIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIHRoZSBYIENvbnNvcnRpdW0gc2hhbGwgbm90CisjIGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsLQorIyBpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSB0aGUgWCBDb25zb3ItCisjIHRpdW0uCisjCisjCisjIEZTRiBjaGFuZ2VzIHRvIHRoaXMgZmlsZSBhcmUgaW4gdGhlIHB1YmxpYyBkb21haW4uCisjCisjIENhbGxpbmcgdGhpcyBzY3JpcHQgaW5zdGFsbC1zaCBpcyBwcmVmZXJyZWQgb3ZlciBpbnN0YWxsLnNoLCB0byBwcmV2ZW50CisjIGBtYWtlJyBpbXBsaWNpdCBydWxlcyBmcm9tIGNyZWF0aW5nIGEgZmlsZSBjYWxsZWQgaW5zdGFsbCBmcm9tIGl0CisjIHdoZW4gdGhlcmUgaXMgbm8gTWFrZWZpbGUuCisjCisjIFRoaXMgc2NyaXB0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgQlNEIGluc3RhbGwgc2NyaXB0LCBidXQgd2FzIHdyaXR0ZW4KKyMgZnJvbSBzY3JhdGNoLiAgSXQgY2FuIG9ubHkgaW5zdGFsbCBvbmUgZmlsZSBhdCBhIHRpbWUsIGEgcmVzdHJpY3Rpb24KKyMgc2hhcmVkIHdpdGggbWFueSBPUydzIGluc3RhbGwgcHJvZ3JhbXMuCisKKyMgc2V0IERPSVRQUk9HIHRvIGVjaG8gdG8gdGVzdCB0aGlzIHNjcmlwdAorCisjIERvbid0IHVzZSA6LSBzaW5jZSA0LjNCU0QgYW5kIGVhcmxpZXIgc2hlbGxzIGRvbid0IGxpa2UgaXQuCitkb2l0PSIke0RPSVRQUk9HLX0iCisKKyMgcHV0IGluIGFic29sdXRlIHBhdGhzIGlmIHlvdSBkb24ndCBoYXZlIHRoZW0gaW4geW91ciBwYXRoOyBvciB1c2UgZW52LiB2YXJzLgorCittdnByb2c9IiR7TVZQUk9HLW12fSIKK2NwcHJvZz0iJHtDUFBST0ctY3B9IgorY2htb2Rwcm9nPSIke0NITU9EUFJPRy1jaG1vZH0iCitjaG93bnByb2c9IiR7Q0hPV05QUk9HLWNob3dufSIKK2NoZ3JwcHJvZz0iJHtDSEdSUFBST0ctY2hncnB9Igorc3RyaXBwcm9nPSIke1NUUklQUFJPRy1zdHJpcH0iCitybXByb2c9IiR7Uk1QUk9HLXJtfSIKK21rZGlycHJvZz0iJHtNS0RJUlBST0ctbWtkaXJ9IgorCitjaG1vZGNtZD0iJGNobW9kcHJvZyAwNzU1IgorY2hvd25jbWQ9CitjaGdycGNtZD0KK3N0cmlwY21kPQorcm1jbWQ9IiRybXByb2cgLWYiCittdmNtZD0iJG12cHJvZyIKK3NyYz0KK2RzdD0KK2Rpcl9hcmc9Citkc3Rhcmc9Citub190YXJnZXRfZGlyZWN0b3J5PQorCit1c2FnZT0iVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFstVF0gU1JDRklMRSBEU1RGSUxFCisgICBvcjogJDAgW09QVElPTl0uLi4gU1JDRklMRVMuLi4gRElSRUNUT1JZCisgICBvcjogJDAgW09QVElPTl0uLi4gLXQgRElSRUNUT1JZIFNSQ0ZJTEVTLi4uCisgICBvcjogJDAgW09QVElPTl0uLi4gLWQgRElSRUNUT1JJRVMuLi4KKworSW4gdGhlIDFzdCBmb3JtLCBjb3B5IFNSQ0ZJTEUgdG8gRFNURklMRS4KK0luIHRoZSAybmQgYW5kIDNyZCwgY29weSBhbGwgU1JDRklMRVMgdG8gRElSRUNUT1JZLgorSW4gdGhlIDR0aCwgY3JlYXRlIERJUkVDVE9SSUVTLgorCitPcHRpb25zOgorLWMgICAgICAgICAoaWdub3JlZCkKKy1kICAgICAgICAgY3JlYXRlIGRpcmVjdG9yaWVzIGluc3RlYWQgb2YgaW5zdGFsbGluZyBmaWxlcy4KKy1nIEdST1VQICAgJGNoZ3JwcHJvZyBpbnN0YWxsZWQgZmlsZXMgdG8gR1JPVVAuCistbSBNT0RFICAgICRjaG1vZHByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIE1PREUuCistbyBVU0VSICAgICRjaG93bnByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIFVTRVIuCistcyAgICAgICAgICRzdHJpcHByb2cgaW5zdGFsbGVkIGZpbGVzLgorLXQgRElSRUNUT1JZICBpbnN0YWxsIGludG8gRElSRUNUT1JZLgorLVQgICAgICAgICByZXBvcnQgYW4gZXJyb3IgaWYgRFNURklMRSBpcyBhIGRpcmVjdG9yeS4KKy0taGVscCAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQuCistLXZlcnNpb24gIGRpc3BsYXkgdmVyc2lvbiBpbmZvIGFuZCBleGl0LgorCitFbnZpcm9ubWVudCB2YXJpYWJsZXMgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgY29tbWFuZHM6CisgIENIR1JQUFJPRyBDSE1PRFBST0cgQ0hPV05QUk9HIENQUFJPRyBNS0RJUlBST0cgTVZQUk9HIFJNUFJPRyBTVFJJUFBST0cKKyIKKword2hpbGUgdGVzdCAtbiAiJDEiOyBkbworICBjYXNlICQxIGluCisgICAgLWMpIHNoaWZ0CisgICAgICAgIGNvbnRpbnVlOzsKKworICAgIC1kKSBkaXJfYXJnPXRydWUKKyAgICAgICAgc2hpZnQKKyAgICAgICAgY29udGludWU7OworCisgICAgLWcpIGNoZ3JwY21kPSIkY2hncnBwcm9nICQyIgorICAgICAgICBzaGlmdAorICAgICAgICBzaGlmdAorICAgICAgICBjb250aW51ZTs7CisKKyAgICAtLWhlbHApIGVjaG8gIiR1c2FnZSI7IGV4aXQgMDs7CisKKyAgICAtbSkgY2htb2RjbWQ9IiRjaG1vZHByb2cgJDIiCisgICAgICAgIHNoaWZ0CisgICAgICAgIHNoaWZ0CisgICAgICAgIGNvbnRpbnVlOzsKKworICAgIC1vKSBjaG93bmNtZD0iJGNob3ducHJvZyAkMiIKKyAgICAgICAgc2hpZnQKKyAgICAgICAgc2hpZnQKKyAgICAgICAgY29udGludWU7OworCisgICAgLXMpIHN0cmlwY21kPSRzdHJpcHByb2cKKyAgICAgICAgc2hpZnQKKyAgICAgICAgY29udGludWU7OworCisgICAgLXQpIGRzdGFyZz0kMgorCXNoaWZ0CisJc2hpZnQKKwljb250aW51ZTs7CisKKyAgICAtVCkgbm9fdGFyZ2V0X2RpcmVjdG9yeT10cnVlCisJc2hpZnQKKwljb250aW51ZTs7CisKKyAgICAtLXZlcnNpb24pIGVjaG8gIiQwICRzY3JpcHR2ZXJzaW9uIjsgZXhpdCAwOzsKKworICAgICopICAjIFdoZW4gLWQgaXMgdXNlZCwgYWxsIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIGRpcmVjdG9yaWVzIHRvIGNyZWF0ZS4KKwkjIFdoZW4gLXQgaXMgdXNlZCwgdGhlIGRlc3RpbmF0aW9uIGlzIGFscmVhZHkgc3BlY2lmaWVkLgorCXRlc3QgLW4gIiRkaXJfYXJnJGRzdGFyZyIgJiYgYnJlYWsKKyAgICAgICAgIyBPdGhlcndpc2UsIHRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZSBkZXN0aW5hdGlvbi4gIFJlbW92ZSBpdCBmcm9tICRALgorCWZvciBhcmcKKwlkbworICAgICAgICAgIGlmIHRlc3QgLW4gIiRkc3RhcmciOyB0aGVuCisJICAgICMgJEAgaXMgbm90IGVtcHR5OiBpdCBjb250YWlucyBhdCBsZWFzdCAkYXJnLgorCSAgICBzZXQgZm5vcmQgIiRAIiAiJGRzdGFyZyIKKwkgICAgc2hpZnQgIyBmbm9yZAorCSAgZmkKKwkgIHNoaWZ0ICMgYXJnCisJICBkc3Rhcmc9JGFyZworCWRvbmUKKwlicmVhazs7CisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAteiAiJDEiOyB0aGVuCisgIGlmIHRlc3QgLXogIiRkaXJfYXJnIjsgdGhlbgorICAgIGVjaG8gIiQwOiBubyBpbnB1dCBmaWxlIHNwZWNpZmllZC4iID4mMgorICAgIGV4aXQgMQorICBmaQorICAjIEl0J3MgT0sgdG8gY2FsbCBgaW5zdGFsbC1zaCAtZCcgd2l0aG91dCBhcmd1bWVudC4KKyAgIyBUaGlzIGNhbiBoYXBwZW4gd2hlbiBjcmVhdGluZyBjb25kaXRpb25hbCBkaXJlY3Rvcmllcy4KKyAgZXhpdCAwCitmaQorCitmb3Igc3JjCitkbworICAjIFByb3RlY3QgbmFtZXMgc3RhcnRpbmcgd2l0aCBgLScuCisgIGNhc2UgJHNyYyBpbgorICAgIC0qKSBzcmM9Li8kc3JjIDs7CisgIGVzYWMKKworICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KKyAgICBkc3Q9JHNyYworICAgIHNyYz0KKworICAgIGlmIHRlc3QgLWQgIiRkc3QiOyB0aGVuCisgICAgICBta2RpcmNtZD06CisgICAgICBjaG1vZGNtZD0KKyAgICBlbHNlCisgICAgICBta2RpcmNtZD0kbWtkaXJwcm9nCisgICAgZmkKKyAgZWxzZQorICAgICMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRjcHByb2cgJHNyYyAkZHN0dG1wIiBjb21tYW5kCisgICAgIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZAorICAgICMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgorICAgIGlmIHRlc3QgISAtZiAiJHNyYyIgJiYgdGVzdCAhIC1kICIkc3JjIjsgdGhlbgorICAgICAgZWNobyAiJDA6ICRzcmMgZG9lcyBub3QgZXhpc3QuIiA+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC16ICIkZHN0YXJnIjsgdGhlbgorICAgICAgZWNobyAiJDA6IG5vIGRlc3RpbmF0aW9uIHNwZWNpZmllZC4iID4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIGRzdD0kZHN0YXJnCisgICAgIyBQcm90ZWN0IG5hbWVzIHN0YXJ0aW5nIHdpdGggYC0nLgorICAgIGNhc2UgJGRzdCBpbgorICAgICAgLSopIGRzdD0uLyRkc3QgOzsKKyAgICBlc2FjCisKKyAgICAjIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyB3b24ndCB3b3JrCisgICAgIyBpZiBkb3VibGUgc2xhc2hlcyBhcmVuJ3QgaWdub3JlZC4KKyAgICBpZiB0ZXN0IC1kICIkZHN0IjsgdGhlbgorICAgICAgaWYgdGVzdCAtbiAiJG5vX3RhcmdldF9kaXJlY3RvcnkiOyB0aGVuCisJZWNobyAiJDA6ICRkc3Rhcmc6IElzIGEgZGlyZWN0b3J5IiA+JjIKKwlleGl0IDEKKyAgICAgIGZpCisgICAgICBkc3Q9JGRzdC9gYmFzZW5hbWUgIiRzcmMiYAorICAgIGZpCisgIGZpCisKKyAgIyBUaGlzIHNlZCBjb21tYW5kIGVtdWxhdGVzIHRoZSBkaXJuYW1lIGNvbW1hbmQuCisgIGRzdGRpcj1gZWNobyAiJGRzdCIgfCBzZWQgLWUgJ3MsLyokLCw7cyxbXi9dKiQsLDtzLC8qJCwsO3MsXiQsLiwnYAorCisgICMgTWFrZSBzdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHMuCisKKyAgIyBTa2lwIGxvdHMgb2Ygc3RhdCBjYWxscyBpbiB0aGUgdXN1YWwgY2FzZS4KKyAgaWYgdGVzdCAhIC1kICIkZHN0ZGlyIjsgdGhlbgorICAgIGRlZmF1bHRJRlM9JworCSAnCisgICAgSUZTPSIke0lGUy0kZGVmYXVsdElGU30iCisKKyAgICBvSUZTPSRJRlMKKyAgICAjIFNvbWUgc2gncyBjYW4ndCBoYW5kbGUgSUZTPS8gZm9yIHNvbWUgcmVhc29uLgorICAgIElGUz0nJScKKyAgICBzZXQgeCBgZWNobyAiJGRzdGRpciIgfCBzZWQgLWUgJ3NAL0AlQGcnIC1lICdzQF4lQC9AJ2AKKyAgICBzaGlmdAorICAgIElGUz0kb0lGUworCisgICAgcGF0aGNvbXA9CisKKyAgICB3aGlsZSB0ZXN0ICQjIC1uZSAwIDsgZG8KKyAgICAgIHBhdGhjb21wPSRwYXRoY29tcCQxCisgICAgICBzaGlmdAorICAgICAgaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCisgICAgICAgICRta2RpcnByb2cgIiRwYXRoY29tcCIKKwkjIG1rZGlyIGNhbiBmYWlsIHdpdGggYSBgRmlsZSBleGlzdCcgZXJyb3IgaW4gY2FzZSBzZXZlcmFsCisJIyBpbnN0YWxsLXNoIGFyZSBjcmVhdGluZyB0aGUgZGlyZWN0b3J5IGNvbmN1cnJlbnRseS4gIFRoaXMKKwkjIGlzIE9LLgorCXRlc3QgLWQgIiRwYXRoY29tcCIgfHwgZXhpdAorICAgICAgZmkKKyAgICAgIHBhdGhjb21wPSRwYXRoY29tcC8KKyAgICBkb25lCisgIGZpCisKKyAgaWYgdGVzdCAtbiAiJGRpcl9hcmciOyB0aGVuCisgICAgJGRvaXQgJG1rZGlyY21kICIkZHN0IiBcCisgICAgICAmJiB7IHRlc3QgLXogIiRjaG93bmNtZCIgfHwgJGRvaXQgJGNob3duY21kICIkZHN0IjsgfSBcCisgICAgICAmJiB7IHRlc3QgLXogIiRjaGdycGNtZCIgfHwgJGRvaXQgJGNoZ3JwY21kICIkZHN0IjsgfSBcCisgICAgICAmJiB7IHRlc3QgLXogIiRzdHJpcGNtZCIgfHwgJGRvaXQgJHN0cmlwY21kICIkZHN0IjsgfSBcCisgICAgICAmJiB7IHRlc3QgLXogIiRjaG1vZGNtZCIgfHwgJGRvaXQgJGNobW9kY21kICIkZHN0IjsgfQorCisgIGVsc2UKKyAgICBkc3RmaWxlPWBiYXNlbmFtZSAiJGRzdCJgCisKKyAgICAjIE1ha2UgYSBjb3VwbGUgb2YgdGVtcCBmaWxlIG5hbWVzIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgorICAgIGRzdHRtcD0kZHN0ZGlyL19pbnN0LiQkXworICAgIHJtdG1wPSRkc3RkaXIvX3JtLiQkXworCisgICAgIyBUcmFwIHRvIGNsZWFuIHVwIHRob3NlIHRlbXAgZmlsZXMgYXQgZXhpdC4KKyAgICB0cmFwICdyZXQ9JD87IHJtIC1mICIkZHN0dG1wIiAiJHJtdG1wIiAmJiBleGl0ICRyZXQnIDAKKyAgICB0cmFwICcoZXhpdCAkPyk7IGV4aXQnIDEgMiAxMyAxNQorCisgICAgIyBDb3B5IHRoZSBmaWxlIG5hbWUgdG8gdGhlIHRlbXAgbmFtZS4KKyAgICAkZG9pdCAkY3Bwcm9nICIkc3JjIiAiJGRzdHRtcCIgJiYKKworICAgICMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cy4KKyAgICAjCisgICAgIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bworICAgICMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQorICAgICMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkY3Bwcm9nICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KKyAgICAjCisgICAgeyB0ZXN0IC16ICIkY2hvd25jbWQiIHx8ICRkb2l0ICRjaG93bmNtZCAiJGRzdHRtcCI7IH0gXAorICAgICAgJiYgeyB0ZXN0IC16ICIkY2hncnBjbWQiIHx8ICRkb2l0ICRjaGdycGNtZCAiJGRzdHRtcCI7IH0gXAorICAgICAgJiYgeyB0ZXN0IC16ICIkc3RyaXBjbWQiIHx8ICRkb2l0ICRzdHJpcGNtZCAiJGRzdHRtcCI7IH0gXAorICAgICAgJiYgeyB0ZXN0IC16ICIkY2htb2RjbWQiIHx8ICRkb2l0ICRjaG1vZGNtZCAiJGRzdHRtcCI7IH0gJiYKKworICAgICMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKyAgICB7ICRkb2l0ICRtdmNtZCAtZiAiJGRzdHRtcCIgIiRkc3RkaXIvJGRzdGZpbGUiIDI+L2Rldi9udWxsIFwKKyAgICAgIHx8IHsKKwkgICAjIFRoZSByZW5hbWUgZmFpbGVkLCBwZXJoYXBzIGJlY2F1c2UgbXYgY2FuJ3QgcmVuYW1lIHNvbWV0aGluZyBlbHNlCisJICAgIyB0byBpdHNlbGYsIG9yIHBlcmhhcHMgYmVjYXVzZSBtdiBpcyBzbyBhbmNpZW50IHRoYXQgaXQgZG9lcyBub3QKKwkgICAjIHN1cHBvcnQgLWYuCisKKwkgICAjIE5vdyByZW1vdmUgb3IgbW92ZSBhc2lkZSBhbnkgb2xkIGZpbGUgYXQgZGVzdGluYXRpb24gbG9jYXRpb24uCisJICAgIyBXZSB0cnkgdGhpcyB0d28gd2F5cyBzaW5jZSBybSBjYW4ndCB1bmxpbmsgaXRzZWxmIG9uIHNvbWUKKwkgICAjIHN5c3RlbXMgYW5kIHRoZSBkZXN0aW5hdGlvbiBmaWxlIG1pZ2h0IGJlIGJ1c3kgZm9yIG90aGVyCisJICAgIyByZWFzb25zLiAgSW4gdGhpcyBjYXNlLCB0aGUgZmluYWwgY2xlYW51cCBtaWdodCBmYWlsIGJ1dCB0aGUgbmV3CisJICAgIyBmaWxlIHNob3VsZCBzdGlsbCBpbnN0YWxsIHN1Y2Nlc3NmdWxseS4KKwkgICB7CisJICAgICBpZiB0ZXN0IC1mICIkZHN0ZGlyLyRkc3RmaWxlIjsgdGhlbgorCSAgICAgICAkZG9pdCAkcm1jbWQgLWYgIiRkc3RkaXIvJGRzdGZpbGUiIDI+L2Rldi9udWxsIFwKKwkgICAgICAgfHwgJGRvaXQgJG12Y21kIC1mICIkZHN0ZGlyLyRkc3RmaWxlIiAiJHJtdG1wIiAyPi9kZXYvbnVsbCBcCisJICAgICAgIHx8IHsKKwkJIGVjaG8gIiQwOiBjYW5ub3QgdW5saW5rIG9yIHJlbmFtZSAkZHN0ZGlyLyRkc3RmaWxlIiA+JjIKKwkJIChleGl0IDEpOyBleGl0IDEKKwkgICAgICAgfQorCSAgICAgZWxzZQorCSAgICAgICA6CisJICAgICBmaQorCSAgIH0gJiYKKworCSAgICMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKwkgICAkZG9pdCAkbXZjbWQgIiRkc3R0bXAiICIkZHN0ZGlyLyRkc3RmaWxlIgorCSB9CisgICAgfQorICBmaSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KK2RvbmUKKworIyBUaGUgZmluYWwgbGl0dGxlIHRyaWNrIHRvICJjb3JyZWN0bHkiIHBhc3MgdGhlIGV4aXQgc3RhdHVzIHRvIHRoZSBleGl0IHRyYXAuCit7CisgIChleGl0IDApOyBleGl0IDAKK30KKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC1lbmQ6ICIkIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9saWIvTWFrZWZpbGUuYW0gYi9saWIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ1YTAzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDYgQEAKK25vaW5zdF9MSUJSQVJJRVMgPSBsaWJjb21tb24uYQorCitBTV9DRkxBR1MgPSAkKEdSVUJfQ0ZMQUdTKSAtSSQodG9wX3NyY2Rpcikvc3RhZ2UyIFwKKwktSSQodG9wX3NyY2Rpcikvc3RhZ2UxCisKK2xpYmNvbW1vbl9hX1NPVVJDRVMgPSBnZXRvcHQuYyBnZXRvcHQxLmMgZ2V0b3B0LmggZGV2aWNlLmMgZGV2aWNlLmgKZGlmZiAtLWdpdCBhL2xpYi9NYWtlZmlsZS5pbiBiL2xpYi9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGFlMjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNDE2IEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjkuNCBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKK1NPVVJDRVMgPSAkKGxpYmNvbW1vbl9hX1NPVVJDRVMpCisKK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitWUEFUSCA9IEBzcmNkaXJACitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAordG9wX2J1aWxkZGlyID0gLi4KK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK0lOU1RBTEwgPSBASU5TVEFMTEAKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK3N1YmRpciA9IGxpYgorRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2luY2x1ZGUubTQgXAorCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK21raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitMSUJSQVJJRVMgPSAkKG5vaW5zdF9MSUJSQVJJRVMpCitBUiA9IGFyCitBUkZMQUdTID0gY3J1CitsaWJjb21tb25fYV9BUiA9ICQoQVIpICQoQVJGTEFHUykKK2xpYmNvbW1vbl9hX0xJQkFERCA9CithbV9saWJjb21tb25fYV9PQkpFQ1RTID0gZ2V0b3B0LiQoT0JKRVhUKSBnZXRvcHQxLiQoT0JKRVhUKSBcCisJZGV2aWNlLiQoT0JKRVhUKQorbGliY29tbW9uX2FfT0JKRUNUUyA9ICQoYW1fbGliY29tbW9uX2FfT0JKRUNUUykKK0RFRkFVTFRfSU5DTFVERVMgPSAtSS4gLUkkKHNyY2RpcikgLUkkKHRvcF9idWlsZGRpcikKK2RlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKK2FtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCitDT01QSUxFID0gJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpIFwKKwkkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitDQ0xEID0gJChDQykKK0xJTksgPSAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACitTT1VSQ0VTID0gJChsaWJjb21tb25fYV9TT1VSQ0VTKQorRElTVF9TT1VSQ0VTID0gJChsaWJjb21tb25fYV9TT1VSQ0VTKQorRVRBR1MgPSBldGFncworQ1RBR1MgPSBjdGFncworRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FNREVQX0ZBTFNFID0gQEFNREVQX0ZBTFNFQAorQU1ERVBfVFJVRSA9IEBBTURFUF9UUlVFQAorQU1UQVIgPSBAQU1UQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0JVSUxEX0VYQU1QTEVfS0VSTkVMX0ZBTFNFID0gQEJVSUxEX0VYQU1QTEVfS0VSTkVMX0ZBTFNFQAorQlVJTERfRVhBTVBMRV9LRVJORUxfVFJVRSA9IEBCVUlMRF9FWEFNUExFX0tFUk5FTF9UUlVFQAorQ0MgPSBAQ0NACitDQ0FTID0gQENDQVNACitDQ0FTRkxBR1MgPSBAQ0NBU0ZMQUdTQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0RJU0tMRVNTX1NVUFBPUlRfRkFMU0UgPSBARElTS0xFU1NfU1VQUE9SVF9GQUxTRUAKK0RJU0tMRVNTX1NVUFBPUlRfVFJVRSA9IEBESVNLTEVTU19TVVBQT1JUX1RSVUVACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitGU1lTX0NGTEFHUyA9IEBGU1lTX0NGTEFHU0AKK0dSVUJfQ0ZMQUdTID0gQEdSVUJfQ0ZMQUdTQAorR1JVQl9MSUJTID0gQEdSVUJfTElCU0AKK0hFUkNVTEVTX1NVUFBPUlRfRkFMU0UgPSBASEVSQ1VMRVNfU1VQUE9SVF9GQUxTRUAKK0hFUkNVTEVTX1NVUFBPUlRfVFJVRSA9IEBIRVJDVUxFU19TVVBQT1JUX1RSVUVACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0xERkxBR1MgPSBATERGTEFHU0AKK0xJQk9CSlMgPSBATElCT0JKU0AKK0xJQlMgPSBATElCU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BSU5UQUlORVJfTU9ERV9GQUxTRSA9IEBNQUlOVEFJTkVSX01PREVfRkFMU0VACitNQUlOVEFJTkVSX01PREVfVFJVRSA9IEBNQUlOVEFJTkVSX01PREVfVFJVRUAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTkVUQk9PVF9EUklWRVJTID0gQE5FVEJPT1RfRFJJVkVSU0AKK05FVEJPT1RfU1VQUE9SVF9GQUxTRSA9IEBORVRCT09UX1NVUFBPUlRfRkFMU0VACitORVRCT09UX1NVUFBPUlRfVFJVRSA9IEBORVRCT09UX1NVUFBPUlRfVFJVRUAKK05FVF9DRkxBR1MgPSBATkVUX0NGTEFHU0AKK05FVF9FWFRSQUZMQUdTID0gQE5FVF9FWFRSQUZMQUdTQAorT0JKQ09QWSA9IEBPQkpDT1BZQAorT0JKRVhUID0gQE9CSkVYVEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BFUkwgPSBAUEVSTEAKK1JBTkxJQiA9IEBSQU5MSUJACitTRVJJQUxfU1BFRURfU0lNVUxBVElPTl9GQUxTRSA9IEBTRVJJQUxfU1BFRURfU0lNVUxBVElPTl9GQUxTRUAKK1NFUklBTF9TUEVFRF9TSU1VTEFUSU9OX1RSVUUgPSBAU0VSSUFMX1NQRUVEX1NJTVVMQVRJT05fVFJVRUAKK1NFUklBTF9TVVBQT1JUX0ZBTFNFID0gQFNFUklBTF9TVVBQT1JUX0ZBTFNFQAorU0VSSUFMX1NVUFBPUlRfVFJVRSA9IEBTRVJJQUxfU1VQUE9SVF9UUlVFQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUQUdFMV9DRkxBR1MgPSBAU1RBR0UxX0NGTEFHU0AKK1NUQUdFMl9DRkxBR1MgPSBAU1RBR0UyX0NGTEFHU0AKK1NUUklQID0gQFNUUklQQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9PQkpDT1BZID0gQGFjX2N0X09CSkNPUFlACithY19jdF9SQU5MSUIgPSBAYWNfY3RfUkFOTElCQAorYWNfY3RfU1RSSVAgPSBAYWNfY3RfU1RSSVBACithbV9fZmFzdGRlcENDX0ZBTFNFID0gQGFtX19mYXN0ZGVwQ0NfRkFMU0VACithbV9fZmFzdGRlcENDX1RSVUUgPSBAYW1fX2Zhc3RkZXBDQ19UUlVFQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitkYXRhZGlyID0gQGRhdGFkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK29sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitzYmluZGlyID0gQHNiaW5kaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACitub2luc3RfTElCUkFSSUVTID0gbGliY29tbW9uLmEKK0FNX0NGTEFHUyA9ICQoR1JVQl9DRkxBR1MpIC1JJCh0b3Bfc3JjZGlyKS9zdGFnZTIgXAorCS1JJCh0b3Bfc3JjZGlyKS9zdGFnZTEKKworbGliY29tbW9uX2FfU09VUkNFUyA9IGdldG9wdC5jIGdldG9wdDEuYyBnZXRvcHQuaCBkZXZpY2UuYyBkZXZpY2UuaAorYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuYyAubyAub2JqCiskKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggXAorCQkmJiBleGl0IDA7IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251ICBsaWIvTWFrZWZpbGUnOyBcCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWdudSAgbGliL01ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKK2NsZWFuLW5vaW5zdExJQlJBUklFUzoKKwktdGVzdCAteiAiJChub2luc3RfTElCUkFSSUVTKSIgfHwgcm0gLWYgJChub2luc3RfTElCUkFSSUVTKQorbGliY29tbW9uLmE6ICQobGliY29tbW9uX2FfT0JKRUNUUykgJChsaWJjb21tb25fYV9ERVBFTkRFTkNJRVMpIAorCS1ybSAtZiBsaWJjb21tb24uYQorCSQobGliY29tbW9uX2FfQVIpIGxpYmNvbW1vbi5hICQobGliY29tbW9uX2FfT0JKRUNUUykgJChsaWJjb21tb25fYV9MSUJBREQpCisJJChSQU5MSUIpIGxpYmNvbW1vbi5hCisKK21vc3RseWNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICouJChPQkpFWFQpCisKK2Rpc3RjbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLnRhYi5jCisKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kZXZpY2UuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2dldG9wdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZ2V0b3B0MS5Qb0BhbV9fcXVvdGVACisKKy5jLm86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAiJChERVBESVIpLyQqLlRwbyIgLWMgLW8gJEAgJDw7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS8kKi5UcG8iICIkKERFUERJUikvJCouUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvJCouVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgJDwKKworLmMub2JqOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgIiQoREVQRElSKS8kKi5UcG8iIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2A7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS8kKi5UcG8iICIkKERFUERJUikvJCouUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvJCouVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAordW5pbnN0YWxsLWluZm8tYW06CisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUKK3RhZ3M6IFRBR1MKKworVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwl0YWdzPTsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAkJHRhZ3MgJCR1bmlxdWU7IFwKKwlmaQorY3RhZ3M6IENUQUdTCitDVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwl0YWdzPTsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdGFncyAkJHVuaXF1ZQorCitHVEFHUzoKKwloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAorCSAgJiYgY2QgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICQkaGVyZQorCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncworCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAnc3wufC58ZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCisJICBjYXNlICQkZmlsZSBpbiBcCisJICAgICQoc3JjZGlyKS8qKSBmaWxlPWBlY2hvICIkJGZpbGUiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCisJICAgICQodG9wX3NyY2RpcikvKikgZmlsZT1gZWNobyAiJCRmaWxlIiB8IHNlZCAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3wiYDs7IFwKKwkgIGVzYWM7IFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGRpcj1gZWNobyAiJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgIGlmIHRlc3QgIiQkZGlyIiAhPSAiJCRmaWxlIiAmJiB0ZXN0ICIkJGRpciIgIT0gIi4iOyB0aGVuIFwKKwkgICAgZGlyPSIvJCRkaXIiOyBcCisJICAgICQobWtkaXJfcCkgIiQoZGlzdGRpcikkJGRpciI7IFwKKwkgIGVsc2UgXAorCSAgICBkaXI9Jyc7IFwKKwkgIGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtcFIgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1wUiAkJGQvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUgJChMSUJSQVJJRVMpCitpbnN0YWxsZGlyczoKK2luc3RhbGw6IGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbm9pbnN0TElCUkFSSUVTIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisJLXJtIC1yZiAuLyQoREVQRElSKQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCisJZGlzdGNsZWFuLXRhZ3MKKworZHZpOiBkdmktYW0KKworZHZpLWFtOgorCitodG1sOiBodG1sLWFtCisKK2luZm86IGluZm8tYW0KKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOgorCitpbnN0YWxsLWV4ZWMtYW06CisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtbWFuOgorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljCisKK3BkZjogcGRmLWFtCisKK3BkZi1hbToKKworcHM6IHBzLWFtCisKK3BzLWFtOgorCit1bmluc3RhbGwtYW06IHVuaW5zdGFsbC1pbmZvLWFtCisKKy5QSE9OWTogQ1RBR1MgR1RBR1MgYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIFwKKwljbGVhbi1ub2luc3RMSUJSQVJJRVMgY3RhZ3MgZGlzdGNsZWFuIGRpc3RjbGVhbi1jb21waWxlIFwKKwlkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tdGFncyBkaXN0ZGlyIGR2aSBkdmktYW0gaHRtbCBcCisJaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtZGF0YSBcCisJaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1pbmZvIFwKKwlpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgXAorCWluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBtYWludGFpbmVyLWNsZWFuIFwKKwltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tY29tcGlsZSBcCisJbW9zdGx5Y2xlYW4tZ2VuZXJpYyBwZGYgcGRmLWFtIHBzIHBzLWFtIHRhZ3MgdW5pbnN0YWxsIFwKKwl1bmluc3RhbGwtYW0gdW5pbnN0YWxsLWluZm8tYW0KKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbGliL2RldmljZS5jIGIvbGliL2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNjYzYjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGV2aWNlLmMKQEAgLTAsMCArMSw5MTUgQEAKKy8qIGRldmljZS5jIC0gU29tZSBoZWxwZXIgZnVuY3Rpb25zIGZvciBPUyBkZXZpY2VzIGFuZCBCSU9TIGRyaXZlcyAqLworLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSwyMDAyLDIwMDMsMjAwNCwyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qIFRyeSB0byB1c2UgZ2xpYmMncyB0cmFuc3BhcmFudCBMRlMgc3VwcG9ydC4gKi8KKyNkZWZpbmUgX0xBUkdFRklMRV9TT1VSQ0UgICAgICAgMQorLyogbHNlZWsgYmVjb21lcyBzeW5vbnltb3VzIHdpdGggbHNlZWs2NC4gICovCisjZGVmaW5lIF9GSUxFX09GRlNFVF9CSVRTICAgICAgIDY0CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpZmRlZiBfX2xpbnV4X18KKyMgaWYgIWRlZmluZWQoX19HTElCQ19fKSB8fCBcCisgICAgICAgICgoX19HTElCQ19fIDwgMikgfHwgKChfX0dMSUJDX18gPT0gMikgJiYgKF9fR0xJQkNfTUlOT1JfXyA8IDEpKSkKKy8qIE1heWJlIGxpYmMgZG9lc24ndCBoYXZlIGxhcmdlIGZpbGUgc3VwcG9ydC4gICovCisjICBpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4gICAgIC8qIF9sbHNlZWsgKi8KKyMgZW5kaWYgLyogKEdMSUJDIDwgMikgfHwgKChfX0dMSUJDX18gPT0gMikgJiYgKF9fR0xJQkNfTUlOT1IgPCAxKSkgKi8KKyMgaW5jbHVkZSA8c3lzL2lvY3RsLmg+CQkvKiBpb2N0bCAqLworIyBpZm5kZWYgSERJT19HRVRHRU8KKyMgIGRlZmluZSBIRElPX0dFVEdFTwkweDAzMDEJLyogZ2V0IGRldmljZSBnZW9tZXRyeSAqLworLyogSWYgSERJT19HRVRHRU8gaXMgbm90IGRlZmluZWQsIGl0IGlzIHVubGlrZWx5IHRoYXQgaGRfZ2VvbWV0cnkgaXMKKyAgIGRlZmluZWQuICAqLworc3RydWN0IGhkX2dlb21ldHJ5Cit7CisgIHVuc2lnbmVkIGNoYXIgaGVhZHM7CisgIHVuc2lnbmVkIGNoYXIgc2VjdG9yczsKKyAgdW5zaWduZWQgc2hvcnQgY3lsaW5kZXJzOworICB1bnNpZ25lZCBsb25nIHN0YXJ0OworfTsKKyMgZW5kaWYgLyogISBIRElPX0dFVEdFTyAqLworIyBpZm5kZWYgRkxPUFBZX01BSk9SCisjICBkZWZpbmUgRkxPUFBZX01BSk9SCTIJLyogdGhlIG1ham9yIG51bWJlciBmb3IgZmxvcHB5ICovCisjIGVuZGlmIC8qICEgRkxPUFBZX01BSk9SICovCisjIGlmbmRlZiBNQUpPUgorIyAgZGVmaW5lIE1BSk9SKGRldikJXAorICAoeyBcCisgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2RldiA9IChkZXYpOyBcCisgICAgICh1bnNpZ25lZCkgKChfX2RldiA+PiA4KSAmIDB4ZmZmKSBcCisgICAgICAgICAgICAgICAgIHwgKCh1bnNpZ25lZCBpbnQpIChfX2RldiA+PiAzMikgJiB+MHhmZmYpOyBcCisgIH0pCisjIGVuZGlmIC8qICEgTUFKT1IgKi8KKyMgaWZuZGVmIENEUk9NX0dFVF9DQVBBQklMSVRZCisjICBkZWZpbmUgQ0RST01fR0VUX0NBUEFCSUxJVFkJMHg1MzMxCS8qIGdldCBjYXBhYmlsaXRpZXMgKi8KKyMgZW5kaWYgLyogISBDRFJPTV9HRVRfQ0FQQUJJTElUWSAqLworIyBpZm5kZWYgQkxLR0VUU0laRQorIyAgZGVmaW5lIEJMS0dFVFNJWkUJX0lPKDB4MTIsOTYpCS8qIHJldHVybiBkZXZpY2Ugc2l6ZSAqLworIyBlbmRpZiAvKiAhIEJMS0dFVFNJWkUgKi8KKyNlbmRpZiAvKiBfX2xpbnV4X18gKi8KKworLyogVXNlIF9fRnJlZUJTRF9rZXJuZWxfXyBpbnN0ZWFkIG9mIF9fRnJlZUJTRF9fIGZvciBjb21wYXRpYmlsaXR5IHdpdGgKKyAgIGtGcmVlQlNELWJhc2VkIG5vbi1GcmVlQlNEIHN5c3RlbXMgKGUuZy4gR05VL2tGcmVlQlNEKSAqLworI2lmIGRlZmluZWQoX19GcmVlQlNEX18pICYmICEgZGVmaW5lZChfX0ZyZWVCU0Rfa2VybmVsX18pCisjIGRlZmluZSBfX0ZyZWVCU0Rfa2VybmVsX18KKyNlbmRpZgorI2lmZGVmIF9fRnJlZUJTRF9rZXJuZWxfXworICAvKiBPYnRhaW4gdmVyc2lvbiBvZiBrRnJlZUJTRCBoZWFkZXJzICovCisjIGluY2x1ZGUgPG9zcmVsZGF0ZS5oPgorIyBpZm5kZWYgX19GcmVlQlNEX2tlcm5lbF92ZXJzaW9uCisjICBkZWZpbmUgX19GcmVlQlNEX2tlcm5lbF92ZXJzaW9uIF9fRnJlZUJTRF92ZXJzaW9uCisjIGVuZGlmCisKKyAgLyogUnVudGltZSBkZXRlY3Rpb24gb2Yga2VybmVsICovCisjIGluY2x1ZGUgPHN5cy91dHNuYW1lLmg+CitpbnQKK2dldF9rZnJlZWJzZF92ZXJzaW9uICgpCit7CisgIHN0cnVjdCB1dHNuYW1lIHV0czsKKyAgaW50IG1ham9yOyBpbnQgbWlub3IsIHZbMl07CisKKyAgdW5hbWUgKCZ1dHMpOworICBzc2NhbmYgKHV0cy5yZWxlYXNlLCAiJWQuJWQiLCAmbWFqb3IsICZtaW5vcik7CisKKyAgaWYgKG1ham9yID49IDkpCisgICAgbWFqb3IgPSA5OworICBpZiAobWFqb3IgPj0gNSkKKyAgICB7CisgICAgICB2WzBdID0gbWlub3IvMTA7IHZbMV0gPSBtaW5vciUxMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB2WzBdID0gbWlub3IlMTA7IHZbMV0gPSBtaW5vci8xMDsKKyAgICB9CisgIHJldHVybiBtYWpvcioxMDAwMDArdlswXSoxMDAwMCt2WzFdKjEwMDA7Cit9CisjZW5kaWYgLyogX19GcmVlQlNEX2tlcm5lbF9fICovCisKKyNpZiBkZWZpbmVkKF9fRnJlZUJTRF9rZXJuZWxfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKSB8fCBkZWZpbmVkKF9fT3BlbkJTRF9fKQorIyBpbmNsdWRlIDxzeXMvaW9jdGwuaD4JCS8qIGlvY3RsICovCisjIGluY2x1ZGUgPHN5cy9kaXNrbGFiZWwuaD4KKyMgaW5jbHVkZSA8c3lzL2NkaW8uaD4JCS8qIENESU9DQ0xSREVCVUcgKi8KKyMgaWYgZGVmaW5lZChfX0ZyZWVCU0Rfa2VybmVsX18pCisjICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgIGlmIF9fRnJlZUJTRF9rZXJuZWxfdmVyc2lvbiA+PSA1MDAwNDAKKyMgICBpbmNsdWRlIDxzeXMvZGlzay5oPgorIyAgZW5kaWYKKyMgZW5kaWYgLyogX19GcmVlQlNEX2tlcm5lbF9fICovCisjZW5kaWYgLyogX19GcmVlQlNEX2tlcm5lbF9fIHx8IF9fTmV0QlNEX18gfHwgX19PcGVuQlNEX18gKi8KKworI2lmZGVmIEhBVkVfT1BFTkRJU0sKKyMgaW5jbHVkZSA8dXRpbC5oPgorI2VuZGlmIC8qIEhBVkVfT1BFTkRJU0sgKi8KKworI2RlZmluZSBXSVRIT1VUX0xJQkNfU1RVQlMJMQorI2luY2x1ZGUgPHNoYXJlZC5oPgorI2luY2x1ZGUgPGRldmljZS5oPgorCisvKiBHZXQgdGhlIGdlb21ldHJ5IG9mIGEgZHJpdmUgRFJJVkUuICAqLwordm9pZAorZ2V0X2RyaXZlX2dlb21ldHJ5IChzdHJ1Y3QgZ2VvbWV0cnkgKmdlb20sIGNoYXIgKiptYXAsIGludCBkcml2ZSkKK3sKKyAgaW50IGZkOworCisgIGlmIChnZW9tLT5mbGFncyA9PSAtMSkKKyAgICB7CisgICAgICBmZCA9IG9wZW4gKG1hcFtkcml2ZV0sIE9fUkRPTkxZKTsKKyAgICAgIGFzc2VydCAoZmQgPj0gMCk7CisgICAgfQorICBlbHNlCisgICAgZmQgPSBnZW9tLT5mbGFnczsKKworICAvKiBYWFggVGhpcyBpcyB0aGUgZGVmYXVsdCBzaXplLiAgKi8KKyAgZ2VvbS0+c2VjdG9yX3NpemUgPSBTRUNUT1JfU0laRTsKKyAgCisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisgIC8qIExpbnV4ICovCisgIHsKKyAgICBzdHJ1Y3QgaGRfZ2VvbWV0cnkgaGRnOworICAgIHVuc2lnbmVkIGxvbmcgbnI7CisgICAgCisgICAgaWYgKGlvY3RsIChmZCwgSERJT19HRVRHRU8sICZoZGcpKQorICAgICAgZ290byBmYWlsOworCisgICAgaWYgKGlvY3RsIChmZCwgQkxLR0VUU0laRSwgJm5yKSkKKyAgICAgIGdvdG8gZmFpbDsKKyAgICAKKyAgICAvKiBHb3QgdGhlIGdlb21ldHJ5LCBzbyBzYXZlIGl0LiAqLworICAgIGdlb20tPmN5bGluZGVycyA9IGhkZy5jeWxpbmRlcnM7CisgICAgZ2VvbS0+aGVhZHMgPSBoZGcuaGVhZHM7CisgICAgZ2VvbS0+c2VjdG9ycyA9IGhkZy5zZWN0b3JzOworICAgIGdlb20tPnRvdGFsX3NlY3RvcnMgPSBucjsKKyAgICAKKyAgICBnb3RvIHN1Y2Nlc3M7CisgIH0KKworI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0Rfa2VybmVsX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX09wZW5CU0RfXykKKyMgaWYgZGVmaW5lZChfX0ZyZWVCU0Rfa2VybmVsX18pICYmIF9fRnJlZUJTRF9rZXJuZWxfdmVyc2lvbiA+PSA1MDAwNDAKKyAgLyoga0ZyZWVCU0QgdmVyc2lvbiA1IG9yIGxhdGVyICovCisgIGlmIChnZXRfa2ZyZWVic2RfdmVyc2lvbiAoKSA+PSA1MDAwNDApCisgIHsKKyAgICB1bnNpZ25lZCBpbnQgc2VjdG9yX3NpemU7CisgICAgb2ZmX3QgbWVkaWFfc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgdG1wOworICAgIAorICAgIGlmKGlvY3RsIChmZCwgRElPQ0dTRUNUT1JTSVpFLCAmc2VjdG9yX3NpemUpICE9IDApCisgICAgICBzZWN0b3Jfc2l6ZSA9IDUxMjsKKyAgICAKKyAgICBpZiAoaW9jdGwgKGZkLCBESU9DR01FRElBU0laRSwgJm1lZGlhX3NpemUpICE9IDApCisgICAgICBnb3RvIGZhaWw7CisKKyAgICBnZW9tLT50b3RhbF9zZWN0b3JzID0gbWVkaWFfc2l6ZSAvIHNlY3Rvcl9zaXplOworICAgIAorICAgIGlmIChpb2N0bCAoZmQsIERJT0NHRldTRUNUT1JTLCAmdG1wKSA9PSAwKQorICAgICAgZ2VvbS0+c2VjdG9ycyA9IHRtcDsKKyAgICBlbHNlCisgICAgICBnZW9tLT5zZWN0b3JzID0gNjM7CisgICAgaWYgKGlvY3RsIChmZCwgRElPQ0dGV0hFQURTLCAmdG1wKSA9PSAwKQorICAgICAgZ2VvbS0+aGVhZHMgPSB0bXA7CisgICAgZWxzZSBpZiAoZ2VvbS0+dG90YWxfc2VjdG9ycyA8PSA2MyAqIDEgKiAxMDI0KQorICAgICAgZ2VvbS0+aGVhZHMgPSAxOworICAgIGVsc2UgaWYgKGdlb20tPnRvdGFsX3NlY3RvcnMgPD0gNjMgKiAxNiAqIDEwMjQpCisgICAgICBnZW9tLT5oZWFkcyA9IDE2OworICAgIGVsc2UKKyAgICAgIGdlb20tPmhlYWRzID0gMjU1OworCisgICAgZ2VvbS0+Y3lsaW5kZXJzID0gKGdlb20tPnRvdGFsX3NlY3RvcnMKKwkJCSAgIC8gZ2VvbS0+aGVhZHMKKwkJCSAgIC8gZ2VvbS0+c2VjdG9ycyk7CisgICAgCisgICAgZ290byBzdWNjZXNzOworICB9CisgIGVsc2UKKyNlbmRpZiAvKiBkZWZpbmVkKF9fRnJlZUJTRF9rZXJuZWxfXykgJiYgX19GcmVlQlNEX2tlcm5lbF92ZXJzaW9uID49IDUwMDA0MCAqLworCisgIC8qIGtGcmVlQlNEIDwgNSwgTmV0QlNEIG9yIE9wZW5CU0QgKi8KKyAgeworICAgIHN0cnVjdCBkaXNrbGFiZWwgaGRnOworICAgIGlmIChpb2N0bCAoZmQsIERJT0NHRElORk8sICZoZGcpKQorICAgICAgZ290byBmYWlsOworICAgIAorICAgIGdlb20tPmN5bGluZGVycyA9IGhkZy5kX25jeWxpbmRlcnM7CisgICAgZ2VvbS0+aGVhZHMgPSBoZGcuZF9udHJhY2tzOworICAgIGdlb20tPnNlY3RvcnMgPSBoZGcuZF9uc2VjdG9yczsKKyAgICBnZW9tLT50b3RhbF9zZWN0b3JzID0gaGRnLmRfc2VjcGVydW5pdDsKKworICAgIGdvdG8gc3VjY2VzczsKKyAgfQorICAKKyNlbHNlCisgIC8qIE5vdGFibHksIGRlZmluZWQoX19HTlVfXykgKi8KKyMgd2FybmluZyAiQXV0b21hdGljIGRldGVjdGlvbiBvZiBnZW9tZXRyaWVzIHdpbGwgYmUgcGVyZm9ybWVkIG9ubHkgXAorcGFydGlhbGx5LiBUaGlzIGlzIG5vdCBmYXRhbC4iCisjZW5kaWYKKworIGZhaWw6CisgIHsKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKworICAgIC8qIEZJWE1FOiBJdCB3b3VsZCBiZSBuaWNlIHRvIHNvbWVob3cgY29tcHV0ZSBmYWtlIEMvSC9TIHNldHRpbmdzLAorICAgICAgIGdpdmVuIGEgcHJvcGVyIHN0X2Jsb2NrcyBzaXplLiAqLworICAgIGlmIChkcml2ZSAmIDB4ODApCisgICAgICB7CisJZ2VvbS0+Y3lsaW5kZXJzID0gREVGQVVMVF9IRF9DWUxJTkRFUlM7CisJZ2VvbS0+aGVhZHMgPSBERUZBVUxUX0hEX0hFQURTOworCWdlb20tPnNlY3RvcnMgPSBERUZBVUxUX0hEX1NFQ1RPUlM7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCWdlb20tPmN5bGluZGVycyA9IERFRkFVTFRfRkRfQ1lMSU5ERVJTOworCWdlb20tPmhlYWRzID0gREVGQVVMVF9GRF9IRUFEUzsKKwlnZW9tLT5zZWN0b3JzID0gREVGQVVMVF9GRF9TRUNUT1JTOworICAgICAgfQorCisgICAgLyogU2V0IHRoZSB0b3RhbCBzZWN0b3JzIHByb3Blcmx5LCBpZiB3ZSBjYW4uICovCisgICAgaWYgKCEgZnN0YXQgKGZkLCAmc3QpICYmIHN0LnN0X3NpemUpCisgICAgICBnZW9tLT50b3RhbF9zZWN0b3JzID0gc3Quc3Rfc2l6ZSA+PiBTRUNUT1JfQklUUzsKKyAgICBlbHNlCisgICAgICBnZW9tLT50b3RhbF9zZWN0b3JzID0gZ2VvbS0+Y3lsaW5kZXJzICogZ2VvbS0+aGVhZHMgKiBnZW9tLT5zZWN0b3JzOworICB9CisKKyBzdWNjZXNzOgorICBpZiAoZ2VvbS0+ZmxhZ3MgPT0gLTEpCisgICAgY2xvc2UgKGZkKTsKK30KKworI2lmZGVmIF9fbGludXhfXworLyogQ2hlY2sgaWYgd2UgaGF2ZSBkZXZmcyBzdXBwb3J0LiAgKi8KK3N0YXRpYyBpbnQKK2hhdmVfZGV2ZnMgKHZvaWQpCit7CisgIHN0YXRpYyBpbnQgZGV2X2RldmZzZF9leGlzdHMgPSAtMTsKKyAgCisgIGlmIChkZXZfZGV2ZnNkX2V4aXN0cyA8IDApCisgICAgeworICAgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgICAKKyAgICAgIGRldl9kZXZmc2RfZXhpc3RzID0gc3RhdCAoIi9kZXYvLmRldmZzZCIsICZzdCkgPT0gMDsKKyAgICB9CisgIAorICByZXR1cm4gZGV2X2RldmZzZF9leGlzdHM7Cit9CisjZW5kaWYgLyogX19saW51eF9fICovCisKKy8qIFRoZXNlIHRocmVlIGZ1bmN0aW9ucyBhcmUgcXVpdGUgZGlmZmVyZW50IGFtb25nIE9TZXMuICAqLworc3RhdGljIHZvaWQKK2dldF9mbG9wcHlfZGlza19uYW1lIChjaGFyICpuYW1lLCBpbnQgdW5pdCkKK3sKKyNpZiBkZWZpbmVkKF9fbGludXhfXykKKyAgLyogR05VL0xpbnV4ICovCisgIGlmIChoYXZlX2RldmZzICgpKQorICAgIHNwcmludGYgKG5hbWUsICIvZGV2L2Zsb3BweS8lZCIsIHVuaXQpOworICBlbHNlCisgICAgc3ByaW50ZiAobmFtZSwgIi9kZXYvZmQlZCIsIHVuaXQpOworI2VsaWYgZGVmaW5lZChfX0dOVV9fKQorICAvKiBHTlUvSHVyZCAqLworICBzcHJpbnRmIChuYW1lLCAiL2Rldi9mZCVkIiwgdW5pdCk7CisjZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9rZXJuZWxfXykKKyAgLyoga0ZyZWVCU0QgKi8KKyAgaWYgKGdldF9rZnJlZWJzZF92ZXJzaW9uICgpID49IDQwMDAwMCkKKyAgICBzcHJpbnRmIChuYW1lLCAiL2Rldi9mZCVkIiwgdW5pdCk7CisgIGVsc2UKKyAgICBzcHJpbnRmIChuYW1lLCAiL2Rldi9yZmQlZCIsIHVuaXQpOworI2VsaWYgZGVmaW5lZChfX05ldEJTRF9fKQorICAvKiBOZXRCU0QgKi8KKyAgLyogb3BlbmRpc2soKSBkb2Vzbid0IHdvcmsgZm9yIGZsb3BwaWVzLiAgKi8KKyAgc3ByaW50ZiAobmFtZSwgIi9kZXYvcmZkJWRhIiwgdW5pdCk7CisjZWxpZiBkZWZpbmVkKF9fT3BlbkJTRF9fKQorICAvKiBPcGVuQlNEICovCisgIHNwcmludGYgKG5hbWUsICIvZGV2L3JmZCVkYyIsIHVuaXQpOworI2VsaWYgZGVmaW5lZChfX1FOWE5UT19fKQorICAvKiBRTlggUlRQICovCisgIHNwcmludGYgKG5hbWUsICIvZGV2L2ZkJWQiLCB1bml0KTsKKyNlbHNlCisjIHdhcm5pbmcgIkJJT1MgZmxvcHB5IGRyaXZlcyBjYW5ub3QgYmUgZ3Vlc3NlZCBpbiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0uIgorICAvKiBTZXQgTkFNRSB0byBhIGJvZ3VzIHN0cmluZy4gICovCisgICpuYW1lID0gMDsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorZ2V0X2lkZV9kaXNrX25hbWUgKGNoYXIgKm5hbWUsIGludCB1bml0KQoreworI2lmIGRlZmluZWQoX19saW51eF9fKQorICAvKiBHTlUvTGludXggKi8KKyAgc3ByaW50ZiAobmFtZSwgIi9kZXYvaGQlYyIsIHVuaXQgKyAnYScpOworI2VsaWYgZGVmaW5lZChfX0dOVV9fKQorICAvKiBHTlUvSHVyZCAqLworICBzcHJpbnRmIChuYW1lLCAiL2Rldi9oZCVkIiwgdW5pdCk7CisjZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9rZXJuZWxfXykKKyAgLyoga0ZyZWVCU0QgKi8KKyAgaWYgKGdldF9rZnJlZWJzZF92ZXJzaW9uICgpID49IDQwMDAwMCkKKyAgICBzcHJpbnRmIChuYW1lLCAiL2Rldi9hZCVkIiwgdW5pdCk7CisgIGVsc2UKKyAgICBzcHJpbnRmIChuYW1lLCAiL2Rldi9yd2QlZCIsIHVuaXQpOworI2VsaWYgZGVmaW5lZChfX05ldEJTRF9fKSAmJiBkZWZpbmVkKEhBVkVfT1BFTkRJU0spCisgIC8qIE5ldEJTRCAqLworICBjaGFyIHNob3J0bmFtZVsxNl07CisgIGludCBmZDsKKyAgCisgIHNwcmludGYgKHNob3J0bmFtZSwgIndkJWQiLCB1bml0KTsKKyAgZmQgPSBvcGVuZGlzayAoc2hvcnRuYW1lLCBPX1JET05MWSwgbmFtZSwKKwkJIDE2LAkvKiBsZW5ndGggb2YgTkFNRSAqLworCQkgMAkvKiBjaGFyIGRldmljZSAqLworCQkgKTsKKyAgY2xvc2UgKGZkKTsKKyNlbGlmIGRlZmluZWQoX19PcGVuQlNEX18pCisgIC8qIE9wZW5CU0QgKi8KKyAgc3ByaW50ZiAobmFtZSwgIi9kZXYvcndkJWRjIiwgdW5pdCk7CisjZWxpZiBkZWZpbmVkKF9fUU5YTlRPX18pCisgIC8qIFFOWCBSVFAgKi8KKyAgLyogQWN0dWFsbHksIFFOWCBSVFAgZG9lc24ndCBkaXN0aW5ndWlzaCBJREUgZnJvbSBTQ1NJLCBzbyB0aGlzIGNvdWxkCisgICAgIGNvbnRhaW4gU0NTSSBkaXNrcy4gICovCisgIHNwcmludGYgKG5hbWUsICIvZGV2L2hkJWQiLCB1bml0KTsKKyNlbHNlCisjIHdhcm5pbmcgIkJJT1MgSURFIGRyaXZlcyBjYW5ub3QgYmUgZ3Vlc3NlZCBpbiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0uIgorICAvKiBTZXQgTkFNRSB0byBhIGJvZ3VzIHN0cmluZy4gICovCisgICpuYW1lID0gMDsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorZ2V0X3Njc2lfZGlza19uYW1lIChjaGFyICpuYW1lLCBpbnQgdW5pdCkKK3sKKyNpZiBkZWZpbmVkKF9fbGludXhfXykKKyAgLyogR05VL0xpbnV4ICovCisgIHNwcmludGYgKG5hbWUsICIvZGV2L3NkJWMiLCB1bml0ICsgJ2EnKTsKKyNlbGlmIGRlZmluZWQoX19HTlVfXykKKyAgLyogR05VL0h1cmQgKi8KKyAgc3ByaW50ZiAobmFtZSwgIi9kZXYvc2QlZCIsIHVuaXQpOworI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0Rfa2VybmVsX18pCisgIC8qIGtGcmVlQlNEICovCisgIGlmIChnZXRfa2ZyZWVic2RfdmVyc2lvbiAoKSA+PSA0MDAwMDApCisgICAgc3ByaW50ZiAobmFtZSwgIi9kZXYvZGElZCIsIHVuaXQpOworICBlbHNlCisgICAgc3ByaW50ZiAobmFtZSwgIi9kZXYvcmRhJWQiLCB1bml0KTsKKyNlbGlmIGRlZmluZWQoX19OZXRCU0RfXykgJiYgZGVmaW5lZChIQVZFX09QRU5ESVNLKQorICAvKiBOZXRCU0QgKi8KKyAgY2hhciBzaG9ydG5hbWVbMTZdOworICBpbnQgZmQ7CisgIAorICBzcHJpbnRmIChzaG9ydG5hbWUsICJzZCVkIiwgdW5pdCk7CisgIGZkID0gb3BlbmRpc2sgKHNob3J0bmFtZSwgT19SRE9OTFksIG5hbWUsCisJCSAxNiwJLyogbGVuZ3RoIG9mIE5BTUUgKi8KKwkJIDAJLyogY2hhciBkZXZpY2UgKi8KKwkJICk7CisgIGNsb3NlIChmZCk7CisjZWxpZiBkZWZpbmVkKF9fT3BlbkJTRF9fKQorICAvKiBPcGVuQlNEICovCisgIHNwcmludGYgKG5hbWUsICIvZGV2L3JzZCVkYyIsIHVuaXQpOworI2VsaWYgZGVmaW5lZChfX1FOWE5UT19fKQorICAvKiBRTlggUlRQICovCisgIC8qIFFOWCBSVFAgZG9lc24ndCBkaXN0aW5ndWlzaCBTQ1NJIGZyb20gSURFLCBzbyBpdCBpcyBiZXR0ZXIgdG8KKyAgICAgZGlzYWJsZSB0aGUgZGV0ZWN0aW9uIG9mIFNDU0kgZGlza3MgaGVyZS4gICovCisgICpuYW1lID0gMDsKKyNlbHNlCisjIHdhcm5pbmcgIkJJT1MgU0NTSSBkcml2ZXMgY2Fubm90IGJlIGd1ZXNzZWQgaW4geW91ciBvcGVyYXRpbmcgc3lzdGVtLiIKKyAgLyogU2V0IE5BTUUgdG8gYSBib2d1cyBzdHJpbmcuICAqLworICAqbmFtZSA9IDA7CisjZW5kaWYKK30KKworI2lmZGVmIF9fbGludXhfXworc3RhdGljIHZvaWQKK2dldF9kYWM5NjBfZGlza19uYW1lIChjaGFyICpuYW1lLCBpbnQgY29udHJvbGxlciwgaW50IGRyaXZlKQoreworICBzcHJpbnRmIChuYW1lLCAiL2Rldi9yZC9jJWRkJWQiLCBjb250cm9sbGVyLCBkcml2ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitnZXRfYXRhcmFpZF9kaXNrX25hbWUgKGNoYXIgKm5hbWUsIGludCB1bml0KQoreworICBzcHJpbnRmIChuYW1lLCAiL2Rldi9hdGFyYWlkL2QlYyIsIHVuaXQgKyAnMCcpOworfQorI2VuZGlmCisKKy8qIENoZWNrIGlmIERFVklDRSBjYW4gYmUgcmVhZC4gSWYgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm4gemVybywKKyAgIG90aGVyd2lzZSByZXR1cm4gbm9uLXplcm8uICAqLworaW50CitjaGVja19kZXZpY2UgKGNvbnN0IGNoYXIgKmRldmljZSkKK3sKKyAgY2hhciBidWZbNTEyXTsKKyAgRklMRSAqZnA7CisKKyAgLyogSWYgREVWSUNFIGlzIGVtcHR5LCBqdXN0IHJldHVybiAxLiAgKi8KKyAgaWYgKCpkZXZpY2UgPT0gMCkKKyAgICByZXR1cm4gMTsKKyAgCisgIGZwID0gZm9wZW4gKGRldmljZSwgInIiKTsKKyAgaWYgKCEgZnApCisgICAgeworICAgICAgc3dpdGNoIChlcnJubykKKwl7CisjaWZkZWYgRU5PTUVESVVNCisJY2FzZSBFTk9NRURJVU06CisjIGlmIDAKKwkgIC8qIEF0IHRoZSBtb21lbnQsIHRoaXMgZmluZHMgb25seSBDRFJPTXMsIHdoaWNoIGNhbid0IGJlCisJICAgICByZWFkIGFueXdheSwgc28gbGVhdmUgaXQgb3V0LiBDb2RlIHNob3VsZCBiZQorCSAgICAgcmVhY3RpdmF0ZWQgaWYgYHJlbW92YWJsZSBkaXNrcycgYW5kIENEUk9NcyBhcmUKKwkgICAgIHN1cHBvcnRlZC4gICovCisJICAvKiBBY2NlcHQgaXQsIGl0IG1heSBiZSBpbnNlcnRlZC4gICovCisJICByZXR1cm4gMTsKKyMgZW5kaWYKKwkgIGJyZWFrOworI2VuZGlmIC8qIEVOT01FRElVTSAqLworCWRlZmF1bHQ6CisJICAvKiBCcmVhayBjYXNlIGFuZCBsZWF2ZS4gICovCisJICBicmVhazsKKwl9CisgICAgICAvKiBFcnJvciBvcGVuaW5nIHRoZSBkZXZpY2UuICAqLworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAKKyAgLyogTWFrZSBzdXJlIENELVJPTXMgZG9uJ3QgZ2V0IGFzc2lnbmVkIGEgQklPUyBkaXNrIG51bWJlciAKKyAgICAgYmVmb3JlIFNDU0kgZGlza3MhICAqLworI2lmZGVmIF9fbGludXhfXworIyBpZmRlZiBDRFJPTV9HRVRfQ0FQQUJJTElUWQorICBpZiAoaW9jdGwgKGZpbGVubyAoZnApLCBDRFJPTV9HRVRfQ0FQQUJJTElUWSwgMCkgPj0gMCkKKyAgICByZXR1cm4gMDsKKyMgZWxzZSAvKiAhIENEUk9NX0dFVF9DQVBBQklMSVRZICovCisgIC8qIENoZWNrIGlmIERFVklDRSBpcyBhIENELVJPTSBkcml2ZSBieSB0aGUgSERJT19HRVRHRU8gaW9jdGwuICAqLworICB7CisgICAgc3RydWN0IGhkX2dlb21ldHJ5IGhkZzsKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKworICAgIGlmIChmc3RhdCAoZmlsZW5vIChmcCksICZzdCkpCisgICAgICByZXR1cm4gMDsKKworICAgIC8qIElmIGl0IGlzIGEgYmxvY2sgZGV2aWNlIGFuZCBpc24ndCBhIGZsb3BweSwgY2hlY2sgaWYgSERJT19HRVRHRU8KKyAgICAgICBzdWNjZWVkcy4gICovCisgICAgaWYgKFNfSVNCTEsgKHN0LnN0X21vZGUpCisJJiYgTUFKT1IgKHN0LnN0X3JkZXYpICE9IEZMT1BQWV9NQUpPUgorCSYmIGlvY3RsIChmaWxlbm8gKGZwKSwgSERJT19HRVRHRU8sICZoZGcpKQorICAgICAgcmV0dXJuIDA7CisgIH0KKyMgZW5kaWYgLyogISBDRFJPTV9HRVRfQ0FQQUJJTElUWSAqLworI2VuZGlmIC8qIF9fbGludXhfXyAqLworCisjaWYgZGVmaW5lZChfX0ZyZWVCU0Rfa2VybmVsX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX09wZW5CU0RfXykKKyMgaWZkZWYgQ0RJT0NDTFJERUJVRworICBpZiAoaW9jdGwgKGZpbGVubyAoZnApLCBDRElPQ0NMUkRFQlVHLCAwKSA+PSAwKQorICAgIHJldHVybiAwOworIyBlbmRpZiAvKiBDRElPQ0NMUkRFQlVHICovCisjZW5kaWYgLyogX19GcmVlQlNEX2tlcm5lbF9fIHx8IF9fTmV0QlNEX18gfHwgX19PcGVuQlNEX18gKi8KKyAgCisgIC8qIEF0dGVtcHQgdG8gcmVhZCB0aGUgZmlyc3Qgc2VjdG9yLiAgKi8KKyAgaWYgKGZyZWFkIChidWYsIDEsIDUxMiwgZnApICE9IDUxMikKKyAgICB7CisgICAgICBmY2xvc2UgKGZwKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgCisgIGZjbG9zZSAoZnApOworICByZXR1cm4gMTsKK30KKworLyogUmVhZCBtYXBwaW5nIGluZm9ybWF0aW9uIGZyb20gRlAsIGFuZCB3cml0ZSBpdCB0byBNQVAuICAqLworc3RhdGljIGludAorcmVhZF9kZXZpY2VfbWFwIChGSUxFICpmcCwgY2hhciAqKm1hcCwgY29uc3QgY2hhciAqbWFwX2ZpbGUpCit7CisgIGF1dG8gdm9pZCBzaG93X2Vycm9yIChpbnQgbm8sIGNvbnN0IGNoYXIgKm1zZyk7CisgIGF1dG8gdm9pZCBzaG93X3dhcm5pbmcgKGludCBubywgY29uc3QgY2hhciAqbXNnLCAuLi4pOworICAKKyAgYXV0byB2b2lkIHNob3dfZXJyb3IgKGludCBubywgY29uc3QgY2hhciAqbXNnKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVkOiBlcnJvcjogJXNcbiIsIG1hcF9maWxlLCBubywgbXNnKTsKKyAgICB9CisgIAorICBhdXRvIHZvaWQgc2hvd193YXJuaW5nIChpbnQgbm8sIGNvbnN0IGNoYXIgKm1zZywgLi4uKQorICAgIHsKKyAgICAgIHZhX2xpc3QgYXA7CisgICAgICAKKyAgICAgIHZhX3N0YXJ0IChhcCwgbXNnKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVkOiB3YXJuaW5nOiAiLCBtYXBfZmlsZSwgbm8pOworICAgICAgdmZwcmludGYgKHN0ZGVyciwgbXNnLCBhcCk7CisgICAgICB2YV9lbmQgKGFwKTsKKyAgICB9CisgIAorICAvKiBJZiB0aGVyZSBpcyB0aGUgZGV2aWNlIG1hcCBmaWxlLCB1c2UgdGhlIGRhdGEgaW4gaXQgaW5zdGVhZCBvZgorICAgICBwcm9iaW5nIGRldmljZXMuICAqLworICBjaGFyIGJ1ZlsxMDI0XTsJCS8qIFhYWCAqLworICBpbnQgbGluZV9udW1iZXIgPSAwOworICAKKyAgd2hpbGUgKGZnZXRzIChidWYsIHNpemVvZiAoYnVmKSwgZnApKQorICAgIHsKKyAgICAgIGNoYXIgKnB0ciwgKmVwdHI7CisgICAgICBpbnQgZHJpdmU7CisgICAgICBpbnQgaXNfZmxvcHB5ID0gMDsKKyAgICAgIAorICAgICAgLyogSW5jcmVhc2UgdGhlIG51bWJlciBvZiBsaW5lcy4gICovCisgICAgICBsaW5lX251bWJlcisrOworICAgICAgCisgICAgICAvKiBJZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzICcjJywgc2tpcCBpdC4gICovCisgICAgICBpZiAoYnVmWzBdID09ICcjJykKKwljb250aW51ZTsKKyAgICAgIAorICAgICAgcHRyID0gYnVmOworICAgICAgLyogU2tpcCBsZWFkaW5nIHNwYWNlcy4gICovCisgICAgICB3aGlsZSAoKnB0ciAmJiBpc3NwYWNlICgqcHRyKSkKKwlwdHIrKzsKKworICAgICAgLyogU2tpcCBlbXB0eSBsaW5lcy4gICovCisgICAgICBpZiAoISAqcHRyKQorCWNvbnRpbnVlOworICAgICAgCisgICAgICBpZiAoKnB0ciAhPSAnKCcpCisJeworCSAgc2hvd19lcnJvciAobGluZV9udW1iZXIsICJObyBvcGVuIHBhcmVudGhlc2lzIGZvdW5kIik7CisJICByZXR1cm4gMDsKKwl9CisgICAgICAKKyAgICAgIHB0cisrOworICAgICAgaWYgKCgqcHRyICE9ICdmJyAmJiAqcHRyICE9ICdoJykgfHwgKihwdHIgKyAxKSAhPSAnZCcpCisJeworCSAgc2hvd19lcnJvciAobGluZV9udW1iZXIsICJCYWQgZHJpdmUgbmFtZSIpOworCSAgcmV0dXJuIDA7CisJfQorICAgICAgCisgICAgICBpZiAoKnB0ciA9PSAnZicpCisJaXNfZmxvcHB5ID0gMTsKKyAgICAgIAorICAgICAgcHRyICs9IDI7CisgICAgICBkcml2ZSA9IHN0cnRvdWwgKHB0ciwgJnB0ciwgMTApOworICAgICAgaWYgKGRyaXZlIDwgMCkKKwl7CisJICBzaG93X2Vycm9yIChsaW5lX251bWJlciwgIkJhZCBkZXZpY2UgbnVtYmVyIik7CisJICByZXR1cm4gMDsKKwl9CisgICAgICBlbHNlIGlmIChkcml2ZSA+IDEyNykKKwl7CisJICBzaG93X3dhcm5pbmcgKGxpbmVfbnVtYmVyLAorCQkJIklnbm9yaW5nICVjZCVkIGR1ZSB0byBhIEJJT1MgbGltaXRhdGlvbiIsCisJCQlpc19mbG9wcHkgPyAnZicgOiAnaCcsIGRyaXZlKTsKKwkgIGNvbnRpbnVlOworCX0KKyAgICAgIAorICAgICAgaWYgKCEgaXNfZmxvcHB5KQorCWRyaXZlICs9IDB4ODA7CisgICAgICAKKyAgICAgIGlmICgqcHRyICE9ICcpJykKKwl7CisJICBzaG93X2Vycm9yIChsaW5lX251bWJlciwgIk5vIGNsb3NlIHBhcmVudGhlc2lzIGZvdW5kIik7CisJICByZXR1cm4gMDsKKwl9CisgICAgICAKKyAgICAgIHB0cisrOworICAgICAgLyogU2tpcCBzcGFjZXMuICAqLworICAgICAgd2hpbGUgKCpwdHIgJiYgaXNzcGFjZSAoKnB0cikpCisJcHRyKys7CisgICAgICAKKyAgICAgIGlmICghICpwdHIpCisJeworCSAgc2hvd19lcnJvciAobGluZV9udW1iZXIsICJObyBmaWxlbmFtZSBmb3VuZCIpOworCSAgcmV0dXJuIDA7CisJfQorICAgICAgCisgICAgICAvKiBUZXJtaW5hdGUgdGhlIGZpbGVuYW1lLiAgKi8KKyAgICAgIGVwdHIgPSBwdHI7CisgICAgICB3aGlsZSAoKmVwdHIgJiYgISBpc3NwYWNlICgqZXB0cikpCisJZXB0cisrOworICAgICAgKmVwdHIgPSAwOworCisgICAgICAvKiBNdWx0aXBsZSBlbnRyaWVzIGZvciBhIGdpdmVuIGRyaXZlIGlzIG5vdCBhbGxvd2VkLiAgKi8KKyAgICAgIGlmIChtYXBbZHJpdmVdKQorCXsKKwkgIHNob3dfZXJyb3IgKGxpbmVfbnVtYmVyLCAiRHVwbGljYXRlZCBlbnRyeSBmb3VuZCIpOworCSAgcmV0dXJuIDA7CisJfQorICAgICAgCisgICAgICBtYXBbZHJpdmVdID0gc3RyZHVwIChwdHIpOworICAgICAgYXNzZXJ0IChtYXBbZHJpdmVdKTsKKyAgICB9CisgIAorICByZXR1cm4gMTsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgZGV2aWNlIG1hcCBNQVAuICpNQVAgd2lsbCBiZSBhbGxvY2F0ZWQgZnJvbSB0aGUgaGVhcAorICAgc3BhY2UuIElmIE1BUF9GSUxFIGlzIG5vdCBOVUxMLCB0aGVuIHJlYWQgbWFwcGluZ3MgZnJvbSB0aGUgZmlsZQorICAgTUFQX0ZJTEUgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UsIHdyaXRlIGd1ZXNzZWQgbWFwcGluZ3MgdG8gdGhlIGZpbGUuCisgICBGTE9QUFlfRElTS1MgaXMgdGhlIG51bWJlciBvZiBmbG9wcHkgZGlzayBkcml2ZXMgd2hpY2ggd2lsbCBiZSBwcm9iZWQuCisgICBJZiBpdCBpcyB6ZXJvLCBkb24ndCBwcm9iZSBhbnkgZmxvcHB5IGF0IGFsbC4gSWYgaXQgaXMgb25lLCBwcm9iZSBvbmUKKyAgIGZsb3BweS4gSWYgaXQgaXMgdHdvLCBwcm9iZSB0d28gZmxvcHBpZXMuIEFuZCBzbyBvbi4gICovCitpbnQKK2luaXRfZGV2aWNlX21hcCAoY2hhciAqKiptYXAsIGNvbnN0IGNoYXIgKm1hcF9maWxlLCBpbnQgZmxvcHB5X2Rpc2tzKQoreworICBpbnQgaTsKKyAgaW50IG51bV9oZCA9IDA7CisgIEZJTEUgKmZwID0gMDsKKworICBhc3NlcnQgKG1hcCk7CisgIGFzc2VydCAoKm1hcCA9PSAwKTsKKyAgKm1hcCA9IG1hbGxvYyAoTlVNX0RJU0tTICogc2l6ZW9mIChjaGFyICopKTsKKyAgYXNzZXJ0ICgqbWFwKTsKKyAgCisgIC8qIFByb2JlIGRldmljZXMgZm9yIGNyZWF0aW5nIHRoZSBkZXZpY2UgbWFwLiAgKi8KKyAgCisgIC8qIEluaXRpYWxpemUgREVWSUNFX01BUC4gICovCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fRElTS1M7IGkrKykKKyAgICAoKm1hcClbaV0gPSAwOworICAKKyAgaWYgKG1hcF9maWxlKQorICAgIHsKKyAgICAgIC8qIE9wZW4gdGhlIGRldmljZSBtYXAgZmlsZS4gICovCisgICAgICBmcCA9IGZvcGVuIChtYXBfZmlsZSwgInIiKTsKKyAgICAgIGlmIChmcCkKKwl7CisJICBpbnQgcmV0OworCisJICByZXQgPSByZWFkX2RldmljZV9tYXAgKGZwLCAqbWFwLCBtYXBfZmlsZSk7CisJICBmY2xvc2UgKGZwKTsKKwkgIHJldHVybiByZXQ7CisJfQorICAgIH0KKyAgCisgIC8qIFByaW50IHNvbWV0aGluZyBzbyB0aGF0IHRoZSB1c2VyIGRvZXMgbm90IHRoaW5rIEdSVUIgaGFzIGJlZW4KKyAgICAgY3Jhc2hlZC4gICovCisgIGZwcmludGYgKHN0ZGVyciwKKwkgICAiUHJvYmluZyBkZXZpY2VzIHRvIGd1ZXNzIEJJT1MgZHJpdmVzLiAiCisJICAgIlRoaXMgbWF5IHRha2UgYSBsb25nIHRpbWUuXG4iKTsKKyAgCisgIGlmIChtYXBfZmlsZSkKKyAgICAvKiBUcnkgdG8gb3BlbiB0aGUgZGV2aWNlIG1hcCBmaWxlIHRvIHdyaXRlIHRoZSBwcm9iZWQgZGF0YS4gICovCisgICAgZnAgPSBmb3BlbiAobWFwX2ZpbGUsICJ3Iik7CisgIAorICAvKiBGbG9wcGllcy4gICovCisgIGZvciAoaSA9IDA7IGkgPCBmbG9wcHlfZGlza3M7IGkrKykKKyAgICB7CisgICAgICBjaGFyIG5hbWVbMTZdOworICAgICAgCisgICAgICBnZXRfZmxvcHB5X2Rpc2tfbmFtZSAobmFtZSwgaSk7CisgICAgICAvKiBJbiBmbG9wcGllcywgd3JpdGUgdGhlIG1hcCwgd2hldGhlciBjaGVja19kZXZpY2Ugc3VjY2VlZHMKKwkgb3Igbm90LCBiZWNhdXNlIHRoZSB1c2VyIGp1c3QgZG9lcyBub3QgaW5zZXJ0IGZsb3BwaWVzLiAgKi8KKyAgICAgIGlmIChmcCkKKwlmcHJpbnRmIChmcCwgIihmZCVkKVx0JXNcbiIsIGksIG5hbWUpOworICAgICAgCisgICAgICBpZiAoY2hlY2tfZGV2aWNlIChuYW1lKSkKKwl7CisJICAoKm1hcClbaV0gPSBzdHJkdXAgKG5hbWUpOworCSAgYXNzZXJ0ICgoKm1hcClbaV0pOworCX0KKyAgICB9CisgIAorI2lmZGVmIF9fbGludXhfXworICBpZiAoaGF2ZV9kZXZmcyAoKSkKKyAgICB7CisgICAgICB3aGlsZSAoMSkKKwl7CisJICBjaGFyIGRpc2NuWzMyXTsKKwkgIGNoYXIgbmFtZVtQQVRIX01BWF07CisJICBzdHJ1Y3Qgc3RhdCBzdDsKKworCSAgLyogTGludXggY3JlYXRlcyBzeW1saW5rcyAiL2Rldi9kaXNjcy9kaXNjTiIgZm9yIGNvbnZlbmllbmNlLgorCSAgICAgVGhlIHdheSB0byBudW1iZXIgZGlza3MgaXMgdGhlIHNhbWUgYXMgR1JVQidzLiAgKi8KKwkgIHNwcmludGYgKGRpc2NuLCAiL2Rldi9kaXNjcy9kaXNjJWQiLCBudW1faGQpOworCSAgaWYgKHN0YXQgKGRpc2NuLCAmc3QpIDwgMCkKKwkgICAgYnJlYWs7CisJICAKKwkgIGlmIChyZWFscGF0aCAoZGlzY24sIG5hbWUpKQorCSAgICB7CisJICAgICAgc3RyY2F0IChuYW1lLCAiL2Rpc2MiKTsKKwkgICAgICAoKm1hcClbbnVtX2hkICsgMHg4MF0gPSBzdHJkdXAgKG5hbWUpOworCSAgICAgIGFzc2VydCAoKCptYXApW251bV9oZCArIDB4ODBdKTsKKwkgICAgICAKKwkgICAgICAvKiBJZiB0aGUgZGV2aWNlIG1hcCBmaWxlIGlzIG9wZW5lZCwgd3JpdGUgdGhlIG1hcC4gICovCisJICAgICAgaWYgKGZwKQorCQlmcHJpbnRmIChmcCwgIihoZCVkKVx0JXNcbiIsIG51bV9oZCwgbmFtZSk7CisJICAgIH0KKwkgIAorCSAgbnVtX2hkKys7CisJfQorICAgICAgCisgICAgICAvKiBPSywgY2xvc2UgdGhlIGRldmljZSBtYXAgZmlsZSBpZiBvcGVuZWQuICAqLworICAgICAgaWYgKGZwKQorCWZjbG9zZSAoZnApOworICAgICAgCisgICAgICByZXR1cm4gMTsKKyAgICB9CisjZW5kaWYgLyogX19saW51eF9fICovCisgICAgCisgIC8qIElERSBkaXNrcy4gICovCisgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgeworICAgICAgY2hhciBuYW1lWzE2XTsKKyAgICAgIAorICAgICAgZ2V0X2lkZV9kaXNrX25hbWUgKG5hbWUsIGkpOworICAgICAgaWYgKGNoZWNrX2RldmljZSAobmFtZSkpCisJeworCSAgKCptYXApW251bV9oZCArIDB4ODBdID0gc3RyZHVwIChuYW1lKTsKKwkgIGFzc2VydCAoKCptYXApW251bV9oZCArIDB4ODBdKTsKKwkgIAorCSAgLyogSWYgdGhlIGRldmljZSBtYXAgZmlsZSBpcyBvcGVuZWQsIHdyaXRlIHRoZSBtYXAuICAqLworCSAgaWYgKGZwKQorCSAgICBmcHJpbnRmIChmcCwgIihoZCVkKVx0JXNcbiIsIG51bV9oZCwgbmFtZSk7CisJICAKKwkgIG51bV9oZCsrOworCX0KKyAgICB9CisgIAorI2lmZGVmIF9fbGludXhfXworICAvKiBBVEFSQUlEIGRpc2tzLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICB7CisgICAgICBjaGFyIG5hbWVbMjBdOworCisgICAgICBnZXRfYXRhcmFpZF9kaXNrX25hbWUgKG5hbWUsIGkpOworICAgICAgaWYgKGNoZWNrX2RldmljZSAobmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICAoKm1hcClbbnVtX2hkICsgMHg4MF0gPSBzdHJkdXAgKG5hbWUpOworICAgICAgICAgIGFzc2VydCAoKCptYXApW251bV9oZCArIDB4ODBdKTsKKworICAgICAgICAgIC8qIElmIHRoZSBkZXZpY2UgbWFwIGZpbGUgaXMgb3BlbmVkLCB3cml0ZSB0aGUgbWFwLiAgKi8KKyAgICAgICAgICBpZiAoZnApCisgICAgICAgICAgICBmcHJpbnRmIChmcCwgIihoZCVkKVx0JXNcbiIsIG51bV9oZCwgbmFtZSk7CisKKyAgICAgICAgICBudW1faGQrKzsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBfX2xpbnV4X18gKi8KKworICAvKiBUaGUgcmVzdCBpcyBTQ1NJIGRpc2tzLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgY2hhciBuYW1lWzE2XTsKKyAgICAgIAorICAgICAgZ2V0X3Njc2lfZGlza19uYW1lIChuYW1lLCBpKTsKKyAgICAgIGlmIChjaGVja19kZXZpY2UgKG5hbWUpKQorCXsKKwkgICgqbWFwKVtudW1faGQgKyAweDgwXSA9IHN0cmR1cCAobmFtZSk7CisJICBhc3NlcnQgKCgqbWFwKVtudW1faGQgKyAweDgwXSk7CisJICAKKwkgIC8qIElmIHRoZSBkZXZpY2UgbWFwIGZpbGUgaXMgb3BlbmVkLCB3cml0ZSB0aGUgbWFwLiAgKi8KKwkgIGlmIChmcCkKKwkgICAgZnByaW50ZiAoZnAsICIoaGQlZClcdCVzXG4iLCBudW1faGQsIG5hbWUpOworCSAgCisJICBudW1faGQrKzsKKwl9CisgICAgfQorICAKKyNpZmRlZiBfX2xpbnV4X18KKyAgLyogVGhpcyBpcyBmb3IgREFDOTYwIC0gd2UgaGF2ZQorICAgICAvZGV2L3JkL2M8Y29udHJvbGxlcj5kPGxvZ2ljYWwgZHJpdmU+cDxwYXJ0aXRpb24+LgorICAgICAKKyAgICAgREFDOTYwIGRyaXZlciBjdXJyZW50bHkgc3VwcG9ydHMgdXAgdG8gOCBjb250cm9sbGVycywgMzIgbG9naWNhbAorICAgICBkcml2ZXMsIGFuZCA3IHBhcnRpdGlvbnMuICAqLworICB7CisgICAgaW50IGNvbnRyb2xsZXIsIGRyaXZlOworICAgIAorICAgIGZvciAoY29udHJvbGxlciA9IDA7IGNvbnRyb2xsZXIgPCA4OyBjb250cm9sbGVyKyspCisgICAgICB7CisJZm9yIChkcml2ZSA9IDA7IGRyaXZlIDwgMTU7IGRyaXZlKyspCisJICB7CisJICAgIGNoYXIgbmFtZVsyNF07CisJICAgIAorCSAgICBnZXRfZGFjOTYwX2Rpc2tfbmFtZSAobmFtZSwgY29udHJvbGxlciwgZHJpdmUpOworCSAgICBpZiAoY2hlY2tfZGV2aWNlIChuYW1lKSkKKwkgICAgICB7CisJCSgqbWFwKVtudW1faGQgKyAweDgwXSA9IHN0cmR1cCAobmFtZSk7CisJCWFzc2VydCAoKCptYXApW251bV9oZCArIDB4ODBdKTsKKwkJCisJCS8qIElmIHRoZSBkZXZpY2UgbWFwIGZpbGUgaXMgb3BlbmVkLCB3cml0ZSB0aGUgbWFwLiAgKi8KKwkJaWYgKGZwKQorCQkgIGZwcmludGYgKGZwLCAiKGhkJWQpXHQlc1xuIiwgbnVtX2hkLCBuYW1lKTsKKwkJCisJCW51bV9oZCsrOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKyAgfQorI2VuZGlmIC8qIF9fbGludXhfXyAqLworICAKKyAgLyogT0ssIGNsb3NlIHRoZSBkZXZpY2UgbWFwIGZpbGUgaWYgb3BlbmVkLiAgKi8KKyAgaWYgKGZwKQorICAgIGZjbG9zZSAoZnApOworCisgIHJldHVybiAxOworfQorCisvKiBSZXN0b3JlIHRoZSBtZW1vcnkgY29uc3VtZWQgZm9yIE1BUC4gICovCit2b2lkCityZXN0b3JlX2RldmljZV9tYXAgKGNoYXIgKiptYXApCit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fRElTS1M7IGkrKykKKyAgICBpZiAobWFwW2ldKQorICAgICAgZnJlZSAobWFwW2ldKTsKKworICBmcmVlIChtYXApOworfQorCisjaWZkZWYgX19saW51eF9fCisvKiBMaW51eC1vbmx5IGZ1bmN0aW9ucywgYmVjYXVzZSBMaW51eCBoYXMgYSBidWcgdGhhdCB0aGUgZGlzayBjYWNoZSBmb3IKKyAgIGEgd2hvbGUgZGlzayBpcyBub3QgY29uc2lzdGVudCB3aXRoIHRoZSBvbmUgZm9yIGEgcGFydGl0aW9uIG9mIHRoZQorICAgZGlzay4gICovCitpbnQKK2lzX2Rpc2tfZGV2aWNlIChjaGFyICoqbWFwLCBpbnQgZHJpdmUpCit7CisgIHN0cnVjdCBzdGF0IHN0OworICAKKyAgYXNzZXJ0IChtYXBbZHJpdmVdICE9IDApOworICBhc3NlcnQgKHN0YXQgKG1hcFtkcml2ZV0sICZzdCkgPT0gMCk7CisgIC8qIEZvciBub3csIGRpc2sgZGV2aWNlcyB1bmRlciBMaW51eCBhcmUgYWxsIGJsb2NrIGRldmljZXMuICAqLworICByZXR1cm4gU19JU0JMSyAoc3Quc3RfbW9kZSk7Cit9CisKK2ludAord3JpdGVfdG9fcGFydGl0aW9uIChjaGFyICoqbWFwLCBpbnQgZHJpdmUsIGludCBwYXJ0aXRpb24sCisJCSAgICBpbnQgc2VjdG9yLCBpbnQgc2l6ZSwgY29uc3QgY2hhciAqYnVmKQoreworICBjaGFyIGRldltQQVRIX01BWF07CS8qIFhYWCAqLworICBpbnQgZmQ7CisgIAorICBpZiAoKHBhcnRpdGlvbiAmIDB4MDBGRjAwKSAhPSAweDAwRkYwMCkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgcGFydGl0aW9uIGlzIGEgQlNEIHBhcnRpdGlvbiwgaXQgaXMgZGlmZmljdWx0IHRvCisJIG9idGFpbiB0aGUgcmVwcmVzZW50YXRpb24gaW4gTGludXguIFNvIGRvbid0IHN1cHBvcnQgdGhhdC4gICovCisgICAgICBlcnJudW0gPSBFUlJfREVWX1ZBTFVFUzsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgCisgIGFzc2VydCAobWFwW2RyaXZlXSAhPSAwKTsKKyAgCisgIHN0cmNweSAoZGV2LCBtYXBbZHJpdmVdKTsKKyAgaWYgKGhhdmVfZGV2ZnMgKCkpCisgICAgeworICAgICAgaWYgKHN0cmNtcCAoZGV2ICsgc3RybGVuKGRldikgLSA1LCAiL2Rpc2MiKSA9PSAwKQorCXN0cmNweSAoZGV2ICsgc3RybGVuKGRldikgLSA1LCAiL3BhcnQiKTsKKyAgICB9CisgIHNwcmludGYgKGRldiArIHN0cmxlbihkZXYpLCAiJWQiLCAoKHBhcnRpdGlvbiA+PiAxNikgJiAweEZGKSArIDEpOworICAKKyAgLyogT3BlbiB0aGUgcGFydGl0aW9uLiAgKi8KKyAgZmQgPSBvcGVuIChkZXYsIE9fUkRXUik7CisgIGlmIChmZCA8IDApCisgICAgeworICAgICAgZXJybnVtID0gRVJSX05PX1BBUlQ7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIAorI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiAoIWRlZmluZWQoX19HTElCQ19fKSB8fCBcCisgICAgICAgICgoX19HTElCQ19fIDwgMikgfHwgKChfX0dMSUJDX18gPT0gMikgJiYgKF9fR0xJQkNfTUlOT1JfXyA8IDEpKSkpCisgIC8qIE1heWJlIGxpYmMgZG9lc24ndCBoYXZlIGxhcmdlIGZpbGUgc3VwcG9ydC4gICovCisgIHsKKyAgICBsb2ZmX3Qgb2Zmc2V0LCByZXN1bHQ7CisgICAgc3RhdGljIGludCBfbGxzZWVrICh1aW50IGZpbGVkZXMsIHVsb25nIGhpLCB1bG9uZyBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZmZfdCAqcmVzLCB1aW50IHdoKTsKKyAgICBfc3lzY2FsbDUgKGludCwgX2xsc2VlaywgdWludCwgZmlsZWRlcywgdWxvbmcsIGhpLCB1bG9uZywgbG8sCisgICAgICAgICAgICAgICBsb2ZmX3QgKiwgcmVzLCB1aW50LCB3aCk7CisKKyAgICBvZmZzZXQgPSAobG9mZl90KSBzZWN0b3IgKiAobG9mZl90KSBTRUNUT1JfU0laRTsKKyAgICBpZiAoX2xsc2VlayAoZmQsIG9mZnNldCA+PiAzMiwgb2Zmc2V0ICYgMHhmZmZmZmZmZiwgJnJlc3VsdCwgU0VFS19TRVQpKQorICAgICAgeworCWVycm51bSA9IEVSUl9ERVZfVkFMVUVTOworCXJldHVybiAwOworICAgICAgfQorICB9CisjZWxzZQorICB7CisgICAgb2ZmX3Qgb2Zmc2V0ID0gKG9mZl90KSBzZWN0b3IgKiAob2ZmX3QpIFNFQ1RPUl9TSVpFOworCisgICAgaWYgKGxzZWVrIChmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gb2Zmc2V0KQorICAgICAgeworCWVycm51bSA9IEVSUl9ERVZfVkFMVUVTOworCXJldHVybiAwOworICAgICAgfQorICB9CisjZW5kaWYKKyAgCisgIGlmICh3cml0ZSAoZmQsIGJ1Ziwgc2l6ZSAqIFNFQ1RPUl9TSVpFKSAhPSAoc2l6ZSAqIFNFQ1RPUl9TSVpFKSkKKyAgICB7CisgICAgICBjbG9zZSAoZmQpOworICAgICAgZXJybnVtID0gRVJSX1dSSVRFOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAKKyAgc3luYyAoKTsJLyogUGFyYW5vaWEuICAqLworICBjbG9zZSAoZmQpOworICAKKyAgcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogX19saW51eF9fICovCmRpZmYgLS1naXQgYS9saWIvZGV2aWNlLmggYi9saWIvZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJmZmNlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZXZpY2UuaApAQCAtMCwwICsxLDQ4IEBACisvKiBkZXZpY2UuaCAtIERlZmluZSBtYWNyb3MgYW5kIGRlY2xhcmUgcHJvdG90eXBlcyBmb3IgZGV2aWNlLmMgKi8KKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMTk5OSwyMDAwLDIwMDQgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBERVZJQ0VfTUFQX0hFQURFUgorI2RlZmluZSBERVZJQ0VfTUFQX0hFQURFUgkxCisKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBCSU9TIGRpc2tzLiAgKi8KKyNkZWZpbmUgTlVNX0RJU0tTCTI1NgorCisvKiBTaW11bGF0ZWQgZGlzayBzaXplcy4gKi8KKyNkZWZpbmUgREVGQVVMVF9GRF9DWUxJTkRFUlMJODAKKyNkZWZpbmUgREVGQVVMVF9GRF9IRUFEUwkyCisjZGVmaW5lIERFRkFVTFRfRkRfU0VDVE9SUwkxOAorI2RlZmluZSBERUZBVUxUX0hEX0NZTElOREVSUwk2MjAKKyNkZWZpbmUgREVGQVVMVF9IRF9IRUFEUwkxMjgKKyNkZWZpbmUgREVGQVVMVF9IRF9TRUNUT1JTCTYzCisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMuICAqLworZXh0ZXJuIHZvaWQgZ2V0X2RyaXZlX2dlb21ldHJ5IChzdHJ1Y3QgZ2VvbWV0cnkgKmdlb20sIGNoYXIgKiptYXAsIGludCBkcml2ZSk7CitleHRlcm4gaW50IGNoZWNrX2RldmljZSAoY29uc3QgY2hhciAqZGV2aWNlKTsKK2V4dGVybiBpbnQgaW5pdF9kZXZpY2VfbWFwIChjaGFyICoqKm1hcCwgY29uc3QgY2hhciAqbWFwX2ZpbGUsCisJCQkgICAgaW50IG5vX2Zsb3BwaWVzKTsKK2V4dGVybiB2b2lkIHJlc3RvcmVfZGV2aWNlX21hcCAoY2hhciAqKm1hcCk7CisKKyNpZmRlZiBfX2xpbnV4X18KK2V4dGVybiBpbnQgaXNfZGlza19kZXZpY2UgKGNoYXIgKiptYXAsIGludCBkcml2ZSk7CitleHRlcm4gaW50IHdyaXRlX3RvX3BhcnRpdGlvbiAoY2hhciAqKm1hcCwgaW50IGRyaXZlLCBpbnQgcGFydGl0aW9uLAorCQkJICAgICAgIGludCBvZmZzZXQsIGludCBzaXplLCBjb25zdCBjaGFyICpidWYpOworI2VuZGlmIC8qIF9fbGludXhfXyAqLworCQkJICAgICAgIAorI2VuZGlmIC8qIERFVklDRV9NQVBfSEVBREVSICovCmRpZmYgLS1naXQgYS9saWIvZ2V0b3B0LmMgYi9saWIvZ2V0b3B0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5MDVmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nZXRvcHQuYwpAQCAtMCwwICsxLDEwNTMgQEAKKy8qIEdldG9wdCBmb3IgR05VLgorICAgTk9URTogZ2V0b3B0IGlzIG5vdyBwYXJ0IG9mIHRoZSBDIGxpYnJhcnksIHNvIGlmIHlvdSBkb24ndCBrbm93IHdoYXQKKyAgICJLZWVwIHRoaXMgZmlsZSBuYW1lLXNwYWNlIGNsZWFuIiBtZWFucywgdGFsayB0byBkcmVwcGVyQGdudS5vcmcKKyAgIGJlZm9yZSBjaGFuZ2luZyBpdCEKKworICAgQ29weXJpZ2h0IChDKSAxOTg3LCA4OCwgODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgKKyAgIAlGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgTk9URTogVGhlIGNhbm9uaWNhbCBzb3VyY2Ugb2YgdGhpcyBmaWxlIGlzIG1haW50YWluZWQgd2l0aCB0aGUgR05VIEMgTGlicmFyeS4KKyAgIEJ1Z3MgY2FuIGJlIHJlcG9ydGVkIHRvIGJ1Zy1nbGliY0BnbnUub3JnLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKwwKKy8qIFRoaXMgdGVsbHMgQWxwaGEgT1NGLzEgbm90IHRvIGRlZmluZSBhIGdldG9wdCBwcm90b3R5cGUgaW4gPHN0ZGlvLmg+LgorICAgRGl0dG8gZm9yIEFJWCAzLjIgYW5kIDxzdGRsaWIuaD4uICAqLworI2lmbmRlZiBfTk9fUFJPVE8KKyMgZGVmaW5lIF9OT19QUk9UTworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCBfX1NURENfXyB8fCAhX19TVERDX18KKy8qIFRoaXMgaXMgYSBzZXBhcmF0ZSBjb25kaXRpb25hbCBzaW5jZSBzb21lIHN0ZGMgc3lzdGVtcworICAgcmVqZWN0IGBkZWZpbmVkIChjb25zdCknLiAgKi8KKyMgaWZuZGVmIGNvbnN0CisjICBkZWZpbmUgY29uc3QKKyMgZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyogQ29tbWVudCBvdXQgYWxsIHRoaXMgY29kZSBpZiB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIExpYnJhcnksIGFuZCBhcmUgbm90CisgICBhY3R1YWxseSBjb21waWxpbmcgdGhlIGxpYnJhcnkgaXRzZWxmLiAgVGhpcyBjb2RlIGlzIHBhcnQgb2YgdGhlIEdOVSBDCisgICBMaWJyYXJ5LCBidXQgYWxzbyBpbmNsdWRlZCBpbiBtYW55IG90aGVyIEdOVSBkaXN0cmlidXRpb25zLiAgQ29tcGlsaW5nCisgICBhbmQgbGlua2luZyBpbiB0aGlzIGNvZGUgaXMgYSB3YXN0ZSB3aGVuIHVzaW5nIHRoZSBHTlUgQyBsaWJyYXJ5CisgICAoZXNwZWNpYWxseSBpZiBpdCBpcyBhIHNoYXJlZCBsaWJyYXJ5KS4gIFJhdGhlciB0aGFuIGhhdmluZyBldmVyeSBHTlUKKyAgIHByb2dyYW0gdW5kZXJzdGFuZCBgY29uZmlndXJlIC0td2l0aC1nbnUtbGliYycgYW5kIG9taXQgdGhlIG9iamVjdCBmaWxlcywKKyAgIGl0IGlzIHNpbXBsZXIgdG8ganVzdCBkbyB0aGlzIGluIHRoZSBzb3VyY2UgZm9yIGVhY2ggc3VjaCBmaWxlLiAgKi8KKworI2RlZmluZSBHRVRPUFRfSU5URVJGQUNFX1ZFUlNJT04gMgorI2lmICFkZWZpbmVkIF9MSUJDICYmIGRlZmluZWQgX19HTElCQ19fICYmIF9fR0xJQkNfXyA+PSAyCisjIGluY2x1ZGUgPGdudS12ZXJzaW9ucy5oPgorIyBpZiBfR05VX0dFVE9QVF9JTlRFUkZBQ0VfVkVSU0lPTiA9PSBHRVRPUFRfSU5URVJGQUNFX1ZFUlNJT04KKyMgIGRlZmluZSBFTElERV9DT0RFCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBFTElERV9DT0RFCisKKworLyogVGhpcyBuZWVkcyB0byBjb21lIGFmdGVyIHNvbWUgbGlicmFyeSAjaW5jbHVkZQorICAgdG8gZ2V0IF9fR05VX0xJQlJBUllfXyBkZWZpbmVkLiAgKi8KKyNpZmRlZglfX0dOVV9MSUJSQVJZX18KKy8qIERvbid0IGluY2x1ZGUgc3RkbGliLmggZm9yIG5vbi1HTlUgQyBsaWJyYXJpZXMgYmVjYXVzZSBzb21lIG9mIHRoZW0KKyAgIGNvbnRhaW4gY29uZmxpY3RpbmcgcHJvdG90eXBlcyBmb3IgZ2V0b3B0LiAgKi8KKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCS8qIEdOVSBDIGxpYnJhcnkuICAqLworCisjaWZkZWYgVk1TCisjIGluY2x1ZGUgPHVuaXhsaWIuaD4KKyMgaWYgSEFWRV9TVFJJTkdfSCAtIDAKKyMgIGluY2x1ZGUgPHN0cmluZy5oPgorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgXworLyogVGhpcyBpcyBmb3Igb3RoZXIgR05VIGRpc3RyaWJ1dGlvbnMgd2l0aCBpbnRlcm5hdGlvbmFsaXplZCBtZXNzYWdlcy4KKyAgIFdoZW4gY29tcGlsaW5nIGxpYmMsIHRoZSBfIG1hY3JvIGlzIHByZWRlZmluZWQuICAqLworIyBpZmRlZiBIQVZFX0xJQklOVExfSAorIyAgaW5jbHVkZSA8bGliaW50bC5oPgorIyAgZGVmaW5lIF8obXNnaWQpCWdldHRleHQgKG1zZ2lkKQorIyBlbHNlCisjICBkZWZpbmUgXyhtc2dpZCkJKG1zZ2lkKQorIyBlbmRpZgorI2VuZGlmCisKKy8qIFRoaXMgdmVyc2lvbiBvZiBgZ2V0b3B0JyBhcHBlYXJzIHRvIHRoZSBjYWxsZXIgbGlrZSBzdGFuZGFyZCBVbml4IGBnZXRvcHQnCisgICBidXQgaXQgYmVoYXZlcyBkaWZmZXJlbnRseSBmb3IgdGhlIHVzZXIsIHNpbmNlIGl0IGFsbG93cyB0aGUgdXNlcgorICAgdG8gaW50ZXJzcGVyc2UgdGhlIG9wdGlvbnMgd2l0aCB0aGUgb3RoZXIgYXJndW1lbnRzLgorCisgICBBcyBgZ2V0b3B0JyB3b3JrcywgaXQgcGVybXV0ZXMgdGhlIGVsZW1lbnRzIG9mIEFSR1Ygc28gdGhhdCwKKyAgIHdoZW4gaXQgaXMgZG9uZSwgYWxsIHRoZSBvcHRpb25zIHByZWNlZGUgZXZlcnl0aGluZyBlbHNlLiAgVGh1cworICAgYWxsIGFwcGxpY2F0aW9uIHByb2dyYW1zIGFyZSBleHRlbmRlZCB0byBoYW5kbGUgZmxleGlibGUgYXJndW1lbnQgb3JkZXIuCisKKyAgIFNldHRpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFBPU0lYTFlfQ09SUkVDVCBkaXNhYmxlcyBwZXJtdXRhdGlvbi4KKyAgIFRoZW4gdGhlIGJlaGF2aW9yIGlzIGNvbXBsZXRlbHkgc3RhbmRhcmQuCisKKyAgIEdOVSBhcHBsaWNhdGlvbiBwcm9ncmFtcyBjYW4gdXNlIGEgdGhpcmQgYWx0ZXJuYXRpdmUgbW9kZSBpbiB3aGljaAorICAgdGhleSBjYW4gZGlzdGluZ3Vpc2ggdGhlIHJlbGF0aXZlIG9yZGVyIG9mIG9wdGlvbnMgYW5kIG90aGVyIGFyZ3VtZW50cy4gICovCisKKyNpbmNsdWRlICJnZXRvcHQuaCIKKworLyogRm9yIGNvbW11bmljYXRpb24gZnJvbSBgZ2V0b3B0JyB0byB0aGUgY2FsbGVyLgorICAgV2hlbiBgZ2V0b3B0JyBmaW5kcyBhbiBvcHRpb24gdGhhdCB0YWtlcyBhbiBhcmd1bWVudCwKKyAgIHRoZSBhcmd1bWVudCB2YWx1ZSBpcyByZXR1cm5lZCBoZXJlLgorICAgQWxzbywgd2hlbiBgb3JkZXJpbmcnIGlzIFJFVFVSTl9JTl9PUkRFUiwKKyAgIGVhY2ggbm9uLW9wdGlvbiBBUkdWLWVsZW1lbnQgaXMgcmV0dXJuZWQgaGVyZS4gICovCisKK2NoYXIgKm9wdGFyZyA9IE5VTEw7CisKKy8qIEluZGV4IGluIEFSR1Ygb2YgdGhlIG5leHQgZWxlbWVudCB0byBiZSBzY2FubmVkLgorICAgVGhpcyBpcyB1c2VkIGZvciBjb21tdW5pY2F0aW9uIHRvIGFuZCBmcm9tIHRoZSBjYWxsZXIKKyAgIGFuZCBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHN1Y2Nlc3NpdmUgY2FsbHMgdG8gYGdldG9wdCcuCisKKyAgIE9uIGVudHJ5IHRvIGBnZXRvcHQnLCB6ZXJvIG1lYW5zIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGw7IGluaXRpYWxpemUuCisKKyAgIFdoZW4gYGdldG9wdCcgcmV0dXJucyAtMSwgdGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9mIHRoZQorICAgbm9uLW9wdGlvbiBlbGVtZW50cyB0aGF0IHRoZSBjYWxsZXIgc2hvdWxkIGl0c2VsZiBzY2FuLgorCisgICBPdGhlcndpc2UsIGBvcHRpbmQnIGNvbW11bmljYXRlcyBmcm9tIG9uZSBjYWxsIHRvIHRoZSBuZXh0CisgICBob3cgbXVjaCBvZiBBUkdWIGhhcyBiZWVuIHNjYW5uZWQgc28gZmFyLiAgKi8KKworLyogMTAwMy4yIHNheXMgdGhpcyBtdXN0IGJlIDEgYmVmb3JlIGFueSBjYWxsLiAgKi8KK2ludCBvcHRpbmQgPSAxOworCisvKiBGb3JtZXJseSwgaW5pdGlhbGl6YXRpb24gb2YgZ2V0b3B0IGRlcGVuZGVkIG9uIG9wdGluZD09MCwgd2hpY2gKKyAgIGNhdXNlcyBwcm9ibGVtcyB3aXRoIHJlLWNhbGxpbmcgZ2V0b3B0IGFzIHByb2dyYW1zIGdlbmVyYWxseSBkb24ndAorICAga25vdyB0aGF0LiAqLworCitpbnQgX19nZXRvcHRfaW5pdGlhbGl6ZWQgPSAwOworCisvKiBUaGUgbmV4dCBjaGFyIHRvIGJlIHNjYW5uZWQgaW4gdGhlIG9wdGlvbi1lbGVtZW50CisgICBpbiB3aGljaCB0aGUgbGFzdCBvcHRpb24gY2hhcmFjdGVyIHdlIHJldHVybmVkIHdhcyBmb3VuZC4KKyAgIFRoaXMgYWxsb3dzIHVzIHRvIHBpY2sgdXAgdGhlIHNjYW4gd2hlcmUgd2UgbGVmdCBvZmYuCisKKyAgIElmIHRoaXMgaXMgemVybywgb3IgYSBudWxsIHN0cmluZywgaXQgbWVhbnMgcmVzdW1lIHRoZSBzY2FuCisgICBieSBhZHZhbmNpbmcgdG8gdGhlIG5leHQgQVJHVi1lbGVtZW50LiAgKi8KKworc3RhdGljIGNoYXIgKm5leHRjaGFyOworCisvKiBDYWxsZXJzIHN0b3JlIHplcm8gaGVyZSB0byBpbmhpYml0IHRoZSBlcnJvciBtZXNzYWdlCisgICBmb3IgdW5yZWNvZ25pemVkIG9wdGlvbnMuICAqLworCitpbnQgb3B0ZXJyID0gMTsKKworLyogU2V0IHRvIGFuIG9wdGlvbiBjaGFyYWN0ZXIgd2hpY2ggd2FzIHVucmVjb2duaXplZC4KKyAgIFRoaXMgbXVzdCBiZSBpbml0aWFsaXplZCBvbiBzb21lIHN5c3RlbXMgdG8gYXZvaWQgbGlua2luZyBpbiB0aGUKKyAgIHN5c3RlbSdzIG93biBnZXRvcHQgaW1wbGVtZW50YXRpb24uICAqLworCitpbnQgb3B0b3B0ID0gJz8nOworCisvKiBEZXNjcmliZSBob3cgdG8gZGVhbCB3aXRoIG9wdGlvbnMgdGhhdCBmb2xsb3cgbm9uLW9wdGlvbiBBUkdWLWVsZW1lbnRzLgorCisgICBJZiB0aGUgY2FsbGVyIGRpZCBub3Qgc3BlY2lmeSBhbnl0aGluZywKKyAgIHRoZSBkZWZhdWx0IGlzIFJFUVVJUkVfT1JERVIgaWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCisgICBQT1NJWExZX0NPUlJFQ1QgaXMgZGVmaW5lZCwgUEVSTVVURSBvdGhlcndpc2UuCisKKyAgIFJFUVVJUkVfT1JERVIgbWVhbnMgZG9uJ3QgcmVjb2duaXplIHRoZW0gYXMgb3B0aW9uczsKKyAgIHN0b3Agb3B0aW9uIHByb2Nlc3Npbmcgd2hlbiB0aGUgZmlyc3Qgbm9uLW9wdGlvbiBpcyBzZWVuLgorICAgVGhpcyBpcyB3aGF0IFVuaXggZG9lcy4KKyAgIFRoaXMgbW9kZSBvZiBvcGVyYXRpb24gaXMgc2VsZWN0ZWQgYnkgZWl0aGVyIHNldHRpbmcgdGhlIGVudmlyb25tZW50CisgICB2YXJpYWJsZSBQT1NJWExZX0NPUlJFQ1QsIG9yIHVzaW5nIGArJyBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyCisgICBvZiB0aGUgbGlzdCBvZiBvcHRpb24gY2hhcmFjdGVycy4KKworICAgUEVSTVVURSBpcyB0aGUgZGVmYXVsdC4gIFdlIHBlcm11dGUgdGhlIGNvbnRlbnRzIG9mIEFSR1YgYXMgd2Ugc2NhbiwKKyAgIHNvIHRoYXQgZXZlbnR1YWxseSBhbGwgdGhlIG5vbi1vcHRpb25zIGFyZSBhdCB0aGUgZW5kLiAgVGhpcyBhbGxvd3Mgb3B0aW9ucworICAgdG8gYmUgZ2l2ZW4gaW4gYW55IG9yZGVyLCBldmVuIHdpdGggcHJvZ3JhbXMgdGhhdCB3ZXJlIG5vdCB3cml0dGVuIHRvCisgICBleHBlY3QgdGhpcy4KKworICAgUkVUVVJOX0lOX09SREVSIGlzIGFuIG9wdGlvbiBhdmFpbGFibGUgdG8gcHJvZ3JhbXMgdGhhdCB3ZXJlIHdyaXR0ZW4KKyAgIHRvIGV4cGVjdCBvcHRpb25zIGFuZCBvdGhlciBBUkdWLWVsZW1lbnRzIGluIGFueSBvcmRlciBhbmQgdGhhdCBjYXJlIGFib3V0CisgICB0aGUgb3JkZXJpbmcgb2YgdGhlIHR3by4gIFdlIGRlc2NyaWJlIGVhY2ggbm9uLW9wdGlvbiBBUkdWLWVsZW1lbnQKKyAgIGFzIGlmIGl0IHdlcmUgdGhlIGFyZ3VtZW50IG9mIGFuIG9wdGlvbiB3aXRoIGNoYXJhY3RlciBjb2RlIDEuCisgICBVc2luZyBgLScgYXMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgbGlzdCBvZiBvcHRpb24gY2hhcmFjdGVycworICAgc2VsZWN0cyB0aGlzIG1vZGUgb2Ygb3BlcmF0aW9uLgorCisgICBUaGUgc3BlY2lhbCBhcmd1bWVudCBgLS0nIGZvcmNlcyBhbiBlbmQgb2Ygb3B0aW9uLXNjYW5uaW5nIHJlZ2FyZGxlc3MKKyAgIG9mIHRoZSB2YWx1ZSBvZiBgb3JkZXJpbmcnLiAgSW4gdGhlIGNhc2Ugb2YgUkVUVVJOX0lOX09SREVSLCBvbmx5CisgICBgLS0nIGNhbiBjYXVzZSBgZ2V0b3B0JyB0byByZXR1cm4gLTEgd2l0aCBgb3B0aW5kJyAhPSBBUkdDLiAgKi8KKworc3RhdGljIGVudW0KK3sKKyAgUkVRVUlSRV9PUkRFUiwgUEVSTVVURSwgUkVUVVJOX0lOX09SREVSCit9IG9yZGVyaW5nOworCisvKiBWYWx1ZSBvZiBQT1NJWExZX0NPUlJFQ1QgZW52aXJvbm1lbnQgdmFyaWFibGUuICAqLworc3RhdGljIGNoYXIgKnBvc2l4bHlfY29ycmVjdDsKKwwKKyNpZmRlZglfX0dOVV9MSUJSQVJZX18KKy8qIFdlIHdhbnQgdG8gYXZvaWQgaW5jbHVzaW9uIG9mIHN0cmluZy5oIHdpdGggbm9uLUdOVSBsaWJyYXJpZXMKKyAgIGJlY2F1c2UgdGhlcmUgYXJlIG1hbnkgd2F5cyBpdCBjYW4gY2F1c2UgdHJvdWJsZS4KKyAgIE9uIHNvbWUgc3lzdGVtcywgaXQgY29udGFpbnMgc3BlY2lhbCBtYWdpYyBtYWNyb3MgdGhhdCBkb24ndCB3b3JrCisgICBpbiBHQ0MuICAqLworIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgZGVmaW5lIG15X2luZGV4CXN0cmNocgorI2Vsc2UKKworIyBpZiBIQVZFX1NUUklOR19ICisjICBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgZWxzZQorIyAgaW5jbHVkZSA8c3RyaW5ncy5oPgorIyBlbmRpZgorCisvKiBBdm9pZCBkZXBlbmRpbmcgb24gbGlicmFyeSBmdW5jdGlvbnMgb3IgZmlsZXMKKyAgIHdob3NlIG5hbWVzIGFyZSBpbmNvbnNpc3RlbnQuICAqLworCisjaWZuZGVmIGdldGVudgorZXh0ZXJuIGNoYXIgKmdldGVudiAoKTsKKyNlbmRpZgorCitzdGF0aWMgY2hhciAqCitteV9pbmRleCAoc3RyLCBjaHIpCisgICAgIGNvbnN0IGNoYXIgKnN0cjsKKyAgICAgaW50IGNocjsKK3sKKyAgd2hpbGUgKCpzdHIpCisgICAgeworICAgICAgaWYgKCpzdHIgPT0gY2hyKQorCXJldHVybiAoY2hhciAqKSBzdHI7CisgICAgICBzdHIrKzsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBJZiB1c2luZyBHQ0MsIHdlIGNhbiBzYWZlbHkgZGVjbGFyZSBzdHJsZW4gdGhpcyB3YXkuCisgICBJZiBub3QgdXNpbmcgR0NDLCBpdCBpcyBvayBub3QgdG8gZGVjbGFyZSBpdC4gICovCisjaWZkZWYgX19HTlVDX18KKy8qIE5vdGUgdGhhdCBNb3Rvcm9sYSBEZWx0YSA2OGsgUjNWNyBjb21lcyB3aXRoIEdDQyBidXQgbm90IHN0ZGRlZi5oLgorICAgVGhhdCB3YXMgcmVsZXZhbnQgdG8gY29kZSB0aGF0IHdhcyBoZXJlIGJlZm9yZS4gICovCisjIGlmICghZGVmaW5lZCBfX1NURENfXyB8fCAhX19TVERDX18pICYmICFkZWZpbmVkIHN0cmxlbgorLyogZ2NjIHdpdGggLXRyYWRpdGlvbmFsIGRlY2xhcmVzIHRoZSBidWlsdC1pbiBzdHJsZW4gdG8gcmV0dXJuIGludCwKKyAgIGFuZCBoYXMgZG9uZSBzbyBhdCBsZWFzdCBzaW5jZSB2ZXJzaW9uIDIuNC41LiAtLSBybXMuICAqLworZXh0ZXJuIGludCBzdHJsZW4gKGNvbnN0IGNoYXIgKik7CisjIGVuZGlmIC8qIG5vdCBfX1NURENfXyAqLworI2VuZGlmIC8qIF9fR05VQ19fICovCisKKyNlbmRpZiAvKiBub3QgX19HTlVfTElCUkFSWV9fICovCisMCisvKiBIYW5kbGUgcGVybXV0YXRpb24gb2YgYXJndW1lbnRzLiAgKi8KKworLyogRGVzY3JpYmUgdGhlIHBhcnQgb2YgQVJHViB0aGF0IGNvbnRhaW5zIG5vbi1vcHRpb25zIHRoYXQgaGF2ZQorICAgYmVlbiBza2lwcGVkLiAgYGZpcnN0X25vbm9wdCcgaXMgdGhlIGluZGV4IGluIEFSR1Ygb2YgdGhlIGZpcnN0IG9mIHRoZW07CisgICBgbGFzdF9ub25vcHQnIGlzIHRoZSBpbmRleCBhZnRlciB0aGUgbGFzdCBvZiB0aGVtLiAgKi8KKworc3RhdGljIGludCBmaXJzdF9ub25vcHQ7CitzdGF0aWMgaW50IGxhc3Rfbm9ub3B0OworCisjaWZkZWYgX0xJQkMKKy8qIEJhc2ggMi4wIGdpdmVzIHVzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIGNvbnRhaW5pbmcgZmxhZ3MKKyAgIGluZGljYXRpbmcgQVJHViBlbGVtZW50cyB0aGF0IHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCBhcmd1bWVudHMuICAqLworCisvKiBEZWZpbmVkIGluIGdldG9wdF9pbml0LmMgICovCitleHRlcm4gY2hhciAqX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzOworCitzdGF0aWMgaW50IG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuOworc3RhdGljIGludCBub25vcHRpb25fZmxhZ3NfbGVuOworCitzdGF0aWMgaW50IG9yaWdpbmFsX2FyZ2M7CitzdGF0aWMgY2hhciAqY29uc3QgKm9yaWdpbmFsX2FyZ3Y7CisKKy8qIE1ha2Ugc3VyZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYmFzaCAyLjAgcHV0cyBpbiB0aGUgZW52aXJvbm1lbnQKKyAgIGlzIHZhbGlkIGZvciB0aGUgZ2V0b3B0IGNhbGwgd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGUgQVJHViBwYXNzZWQKKyAgIHRvIGdldG9wdCBpcyB0aGF0IG9uZSBwYXNzZWQgdG8gdGhlIHByb2Nlc3MuICAqLworc3RhdGljIHZvaWQKK19fYXR0cmlidXRlX18gKCh1bnVzZWQpKQorc3RvcmVfYXJnc19hbmRfZW52IChpbnQgYXJnYywgY2hhciAqY29uc3QgKmFyZ3YpCit7CisgIC8qIFhYWCBUaGlzIGlzIG5vIGdvb2Qgc29sdXRpb24uICBXZSBzaG91bGQgcmF0aGVyIGNvcHkgdGhlIGFyZ3Mgc28KKyAgICAgdGhhdCB3ZSBjYW4gY29tcGFyZSB0aGVtIGxhdGVyLiAgQnV0IHdlIG11c3Qgbm90IHVzZSBtYWxsb2MoMykuICAqLworICBvcmlnaW5hbF9hcmdjID0gYXJnYzsKKyAgb3JpZ2luYWxfYXJndiA9IGFyZ3Y7Cit9CisjIGlmZGVmIHRleHRfc2V0X2VsZW1lbnQKK3RleHRfc2V0X2VsZW1lbnQgKF9fbGliY19zdWJpbml0LCBzdG9yZV9hcmdzX2FuZF9lbnYpOworIyBlbmRpZiAvKiB0ZXh0X3NldF9lbGVtZW50ICovCisKKyMgZGVmaW5lIFNXQVBfRkxBR1MoY2gxLCBjaDIpIFwKKyAgaWYgKG5vbm9wdGlvbl9mbGFnc19sZW4gPiAwKQkJCQkJCSAgICAgIFwKKyAgICB7CQkJCQkJCQkJICAgICAgXAorICAgICAgY2hhciBfX3RtcCA9IF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFnc1tjaDFdOwkJCSAgICAgIFwKKyAgICAgIF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFnc1tjaDFdID0gX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzW2NoMl07CSAgICAgIFwKKyAgICAgIF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFnc1tjaDJdID0gX190bXA7CQkJCSAgICAgIFwKKyAgICB9CisjZWxzZQkvKiAhX0xJQkMgKi8KKyMgZGVmaW5lIFNXQVBfRkxBR1MoY2gxLCBjaDIpCisjZW5kaWYJLyogX0xJQkMgKi8KKworLyogRXhjaGFuZ2UgdHdvIGFkamFjZW50IHN1YnNlcXVlbmNlcyBvZiBBUkdWLgorICAgT25lIHN1YnNlcXVlbmNlIGlzIGVsZW1lbnRzIFtmaXJzdF9ub25vcHQsbGFzdF9ub25vcHQpCisgICB3aGljaCBjb250YWlucyBhbGwgdGhlIG5vbi1vcHRpb25zIHRoYXQgaGF2ZSBiZWVuIHNraXBwZWQgc28gZmFyLgorICAgVGhlIG90aGVyIGlzIGVsZW1lbnRzIFtsYXN0X25vbm9wdCxvcHRpbmQpLCB3aGljaCBjb250YWlucyBhbGwKKyAgIHRoZSBvcHRpb25zIHByb2Nlc3NlZCBzaW5jZSB0aG9zZSBub24tb3B0aW9ucyB3ZXJlIHNraXBwZWQuCisKKyAgIGBmaXJzdF9ub25vcHQnIGFuZCBgbGFzdF9ub25vcHQnIGFyZSByZWxvY2F0ZWQgc28gdGhhdCB0aGV5IGRlc2NyaWJlCisgICB0aGUgbmV3IGluZGljZXMgb2YgdGhlIG5vbi1vcHRpb25zIGluIEFSR1YgYWZ0ZXIgdGhleSBhcmUgbW92ZWQuICAqLworCisjaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXworc3RhdGljIHZvaWQgZXhjaGFuZ2UgKGNoYXIgKiopOworI2VuZGlmCisKK3N0YXRpYyB2b2lkCitleGNoYW5nZSAoYXJndikKKyAgICAgY2hhciAqKmFyZ3Y7Cit7CisgIGludCBib3R0b20gPSBmaXJzdF9ub25vcHQ7CisgIGludCBtaWRkbGUgPSBsYXN0X25vbm9wdDsKKyAgaW50IHRvcCA9IG9wdGluZDsKKyAgY2hhciAqdGVtOworCisgIC8qIEV4Y2hhbmdlIHRoZSBzaG9ydGVyIHNlZ21lbnQgd2l0aCB0aGUgZmFyIGVuZCBvZiB0aGUgbG9uZ2VyIHNlZ21lbnQuCisgICAgIFRoYXQgcHV0cyB0aGUgc2hvcnRlciBzZWdtZW50IGludG8gdGhlIHJpZ2h0IHBsYWNlLgorICAgICBJdCBsZWF2ZXMgdGhlIGxvbmdlciBzZWdtZW50IGluIHRoZSByaWdodCBwbGFjZSBvdmVyYWxsLAorICAgICBidXQgaXQgY29uc2lzdHMgb2YgdHdvIHBhcnRzIHRoYXQgbmVlZCB0byBiZSBzd2FwcGVkIG5leHQuICAqLworCisjaWZkZWYgX0xJQkMKKyAgLyogRmlyc3QgbWFrZSBzdXJlIHRoZSBoYW5kbGluZyBvZiB0aGUgYF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFncycKKyAgICAgc3RyaW5nIGNhbiB3b3JrIG5vcm1hbGx5LiAgT3VyIHRvcCBhcmd1bWVudCBtdXN0IGJlIGluIHRoZSByYW5nZQorICAgICBvZiB0aGUgc3RyaW5nLiAgKi8KKyAgaWYgKG5vbm9wdGlvbl9mbGFnc19sZW4gPiAwICYmIHRvcCA+PSBub25vcHRpb25fZmxhZ3NfbWF4X2xlbikKKyAgICB7CisgICAgICAvKiBXZSBtdXN0IGV4dGVuZCB0aGUgYXJyYXkuICBUaGUgdXNlciBwbGF5cyBnYW1lcyB3aXRoIHVzIGFuZAorCSBwcmVzZW50cyBuZXcgYXJndW1lbnRzLiAgKi8KKyAgICAgIGNoYXIgKm5ld19zdHIgPSBtYWxsb2MgKHRvcCArIDEpOworICAgICAgaWYgKG5ld19zdHIgPT0gTlVMTCkKKwlub25vcHRpb25fZmxhZ3NfbGVuID0gbm9ub3B0aW9uX2ZsYWdzX21heF9sZW4gPSAwOworICAgICAgZWxzZQorCXsKKwkgIG1lbXNldCAoX19tZW1wY3B5IChuZXdfc3RyLCBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3MsCisJCQkgICAgIG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuKSwKKwkJICAnXDAnLCB0b3AgKyAxIC0gbm9ub3B0aW9uX2ZsYWdzX21heF9sZW4pOworCSAgbm9ub3B0aW9uX2ZsYWdzX21heF9sZW4gPSB0b3AgKyAxOworCSAgX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzID0gbmV3X3N0cjsKKwl9CisgICAgfQorI2VuZGlmCisKKyAgd2hpbGUgKHRvcCA+IG1pZGRsZSAmJiBtaWRkbGUgPiBib3R0b20pCisgICAgeworICAgICAgaWYgKHRvcCAtIG1pZGRsZSA+IG1pZGRsZSAtIGJvdHRvbSkKKwl7CisJICAvKiBCb3R0b20gc2VnbWVudCBpcyB0aGUgc2hvcnQgb25lLiAgKi8KKwkgIGludCBsZW4gPSBtaWRkbGUgLSBib3R0b207CisJICByZWdpc3RlciBpbnQgaTsKKworCSAgLyogU3dhcCBpdCB3aXRoIHRoZSB0b3AgcGFydCBvZiB0aGUgdG9wIHNlZ21lbnQuICAqLworCSAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCSAgICB7CisJICAgICAgdGVtID0gYXJndltib3R0b20gKyBpXTsKKwkgICAgICBhcmd2W2JvdHRvbSArIGldID0gYXJndlt0b3AgLSAobWlkZGxlIC0gYm90dG9tKSArIGldOworCSAgICAgIGFyZ3ZbdG9wIC0gKG1pZGRsZSAtIGJvdHRvbSkgKyBpXSA9IHRlbTsKKwkgICAgICBTV0FQX0ZMQUdTIChib3R0b20gKyBpLCB0b3AgLSAobWlkZGxlIC0gYm90dG9tKSArIGkpOworCSAgICB9CisJICAvKiBFeGNsdWRlIHRoZSBtb3ZlZCBib3R0b20gc2VnbWVudCBmcm9tIGZ1cnRoZXIgc3dhcHBpbmcuICAqLworCSAgdG9wIC09IGxlbjsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogVG9wIHNlZ21lbnQgaXMgdGhlIHNob3J0IG9uZS4gICovCisJICBpbnQgbGVuID0gdG9wIC0gbWlkZGxlOworCSAgcmVnaXN0ZXIgaW50IGk7CisKKwkgIC8qIFN3YXAgaXQgd2l0aCB0aGUgYm90dG9tIHBhcnQgb2YgdGhlIGJvdHRvbSBzZWdtZW50LiAgKi8KKwkgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkgICAgeworCSAgICAgIHRlbSA9IGFyZ3ZbYm90dG9tICsgaV07CisJICAgICAgYXJndltib3R0b20gKyBpXSA9IGFyZ3ZbbWlkZGxlICsgaV07CisJICAgICAgYXJndlttaWRkbGUgKyBpXSA9IHRlbTsKKwkgICAgICBTV0FQX0ZMQUdTIChib3R0b20gKyBpLCBtaWRkbGUgKyBpKTsKKwkgICAgfQorCSAgLyogRXhjbHVkZSB0aGUgbW92ZWQgdG9wIHNlZ21lbnQgZnJvbSBmdXJ0aGVyIHN3YXBwaW5nLiAgKi8KKwkgIGJvdHRvbSArPSBsZW47CisJfQorICAgIH0KKworICAvKiBVcGRhdGUgcmVjb3JkcyBmb3IgdGhlIHNsb3RzIHRoZSBub24tb3B0aW9ucyBub3cgb2NjdXB5LiAgKi8KKworICBmaXJzdF9ub25vcHQgKz0gKG9wdGluZCAtIGxhc3Rfbm9ub3B0KTsKKyAgbGFzdF9ub25vcHQgPSBvcHRpbmQ7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIGludGVybmFsIGRhdGEgd2hlbiB0aGUgZmlyc3QgY2FsbCBpcyBtYWRlLiAgKi8KKworI2lmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KK3N0YXRpYyBjb25zdCBjaGFyICpfZ2V0b3B0X2luaXRpYWxpemUgKGludCwgY2hhciAqY29uc3QgKiwgY29uc3QgY2hhciAqKTsKKyNlbmRpZgorc3RhdGljIGNvbnN0IGNoYXIgKgorX2dldG9wdF9pbml0aWFsaXplIChhcmdjLCBhcmd2LCBvcHRzdHJpbmcpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICpjb25zdCAqYXJndjsKKyAgICAgY29uc3QgY2hhciAqb3B0c3RyaW5nOworeworICAvKiBTdGFydCBwcm9jZXNzaW5nIG9wdGlvbnMgd2l0aCBBUkdWLWVsZW1lbnQgMSAoc2luY2UgQVJHVi1lbGVtZW50IDAKKyAgICAgaXMgdGhlIHByb2dyYW0gbmFtZSk7IHRoZSBzZXF1ZW5jZSBvZiBwcmV2aW91c2x5IHNraXBwZWQKKyAgICAgbm9uLW9wdGlvbiBBUkdWLWVsZW1lbnRzIGlzIGVtcHR5LiAgKi8KKworICBmaXJzdF9ub25vcHQgPSBsYXN0X25vbm9wdCA9IG9wdGluZDsKKworICBuZXh0Y2hhciA9IE5VTEw7CisKKyAgcG9zaXhseV9jb3JyZWN0ID0gZ2V0ZW52ICgiUE9TSVhMWV9DT1JSRUNUIik7CisKKyAgLyogRGV0ZXJtaW5lIGhvdyB0byBoYW5kbGUgdGhlIG9yZGVyaW5nIG9mIG9wdGlvbnMgYW5kIG5vbm9wdGlvbnMuICAqLworCisgIGlmIChvcHRzdHJpbmdbMF0gPT0gJy0nKQorICAgIHsKKyAgICAgIG9yZGVyaW5nID0gUkVUVVJOX0lOX09SREVSOworICAgICAgKytvcHRzdHJpbmc7CisgICAgfQorICBlbHNlIGlmIChvcHRzdHJpbmdbMF0gPT0gJysnKQorICAgIHsKKyAgICAgIG9yZGVyaW5nID0gUkVRVUlSRV9PUkRFUjsKKyAgICAgICsrb3B0c3RyaW5nOworICAgIH0KKyAgZWxzZSBpZiAocG9zaXhseV9jb3JyZWN0ICE9IE5VTEwpCisgICAgb3JkZXJpbmcgPSBSRVFVSVJFX09SREVSOworICBlbHNlCisgICAgb3JkZXJpbmcgPSBQRVJNVVRFOworCisjaWZkZWYgX0xJQkMKKyAgaWYgKHBvc2l4bHlfY29ycmVjdCA9PSBOVUxMCisgICAgICAmJiBhcmdjID09IG9yaWdpbmFsX2FyZ2MgJiYgYXJndiA9PSBvcmlnaW5hbF9hcmd2KQorICAgIHsKKyAgICAgIGlmIChub25vcHRpb25fZmxhZ3NfbWF4X2xlbiA9PSAwKQorCXsKKwkgIGlmIChfX2dldG9wdF9ub25vcHRpb25fZmxhZ3MgPT0gTlVMTAorCSAgICAgIHx8IF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFnc1swXSA9PSAnXDAnKQorCSAgICBub25vcHRpb25fZmxhZ3NfbWF4X2xlbiA9IC0xOworCSAgZWxzZQorCSAgICB7CisJICAgICAgY29uc3QgY2hhciAqb3JpZ19zdHIgPSBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3M7CisJICAgICAgaW50IGxlbiA9IG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuID0gc3RybGVuIChvcmlnX3N0cik7CisJICAgICAgaWYgKG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuIDwgYXJnYykKKwkJbm9ub3B0aW9uX2ZsYWdzX21heF9sZW4gPSBhcmdjOworCSAgICAgIF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFncyA9CisJCShjaGFyICopIG1hbGxvYyAobm9ub3B0aW9uX2ZsYWdzX21heF9sZW4pOworCSAgICAgIGlmIChfX2dldG9wdF9ub25vcHRpb25fZmxhZ3MgPT0gTlVMTCkKKwkJbm9ub3B0aW9uX2ZsYWdzX21heF9sZW4gPSAtMTsKKwkgICAgICBlbHNlCisJCW1lbXNldCAoX19tZW1wY3B5IChfX2dldG9wdF9ub25vcHRpb25fZmxhZ3MsIG9yaWdfc3RyLCBsZW4pLAorCQkJJ1wwJywgbm9ub3B0aW9uX2ZsYWdzX21heF9sZW4gLSBsZW4pOworCSAgICB9CisJfQorICAgICAgbm9ub3B0aW9uX2ZsYWdzX2xlbiA9IG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuOworICAgIH0KKyAgZWxzZQorICAgIG5vbm9wdGlvbl9mbGFnc19sZW4gPSAwOworI2VuZGlmCisKKyAgcmV0dXJuIG9wdHN0cmluZzsKK30KKwwKKy8qIFNjYW4gZWxlbWVudHMgb2YgQVJHViAod2hvc2UgbGVuZ3RoIGlzIEFSR0MpIGZvciBvcHRpb24gY2hhcmFjdGVycworICAgZ2l2ZW4gaW4gT1BUU1RSSU5HLgorCisgICBJZiBhbiBlbGVtZW50IG9mIEFSR1Ygc3RhcnRzIHdpdGggJy0nLCBhbmQgaXMgbm90IGV4YWN0bHkgIi0iIG9yICItLSIsCisgICB0aGVuIGl0IGlzIGFuIG9wdGlvbiBlbGVtZW50LiAgVGhlIGNoYXJhY3RlcnMgb2YgdGhpcyBlbGVtZW50CisgICAoYXNpZGUgZnJvbSB0aGUgaW5pdGlhbCAnLScpIGFyZSBvcHRpb24gY2hhcmFjdGVycy4gIElmIGBnZXRvcHQnCisgICBpcyBjYWxsZWQgcmVwZWF0ZWRseSwgaXQgcmV0dXJucyBzdWNjZXNzaXZlbHkgZWFjaCBvZiB0aGUgb3B0aW9uIGNoYXJhY3RlcnMKKyAgIGZyb20gZWFjaCBvZiB0aGUgb3B0aW9uIGVsZW1lbnRzLgorCisgICBJZiBgZ2V0b3B0JyBmaW5kcyBhbm90aGVyIG9wdGlvbiBjaGFyYWN0ZXIsIGl0IHJldHVybnMgdGhhdCBjaGFyYWN0ZXIsCisgICB1cGRhdGluZyBgb3B0aW5kJyBhbmQgYG5leHRjaGFyJyBzbyB0aGF0IHRoZSBuZXh0IGNhbGwgdG8gYGdldG9wdCcgY2FuCisgICByZXN1bWUgdGhlIHNjYW4gd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbiBjaGFyYWN0ZXIgb3IgQVJHVi1lbGVtZW50LgorCisgICBJZiB0aGVyZSBhcmUgbm8gbW9yZSBvcHRpb24gY2hhcmFjdGVycywgYGdldG9wdCcgcmV0dXJucyAtMS4KKyAgIFRoZW4gYG9wdGluZCcgaXMgdGhlIGluZGV4IGluIEFSR1Ygb2YgdGhlIGZpcnN0IEFSR1YtZWxlbWVudAorICAgdGhhdCBpcyBub3QgYW4gb3B0aW9uLiAgKFRoZSBBUkdWLWVsZW1lbnRzIGhhdmUgYmVlbiBwZXJtdXRlZAorICAgc28gdGhhdCB0aG9zZSB0aGF0IGFyZSBub3Qgb3B0aW9ucyBub3cgY29tZSBsYXN0LikKKworICAgT1BUU1RSSU5HIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGxlZ2l0aW1hdGUgb3B0aW9uIGNoYXJhY3RlcnMuCisgICBJZiBhbiBvcHRpb24gY2hhcmFjdGVyIGlzIHNlZW4gdGhhdCBpcyBub3QgbGlzdGVkIGluIE9QVFNUUklORywKKyAgIHJldHVybiAnPycgYWZ0ZXIgcHJpbnRpbmcgYW4gZXJyb3IgbWVzc2FnZS4gIElmIHlvdSBzZXQgYG9wdGVycicgdG8KKyAgIHplcm8sIHRoZSBlcnJvciBtZXNzYWdlIGlzIHN1cHByZXNzZWQgYnV0IHdlIHN0aWxsIHJldHVybiAnPycuCisKKyAgIElmIGEgY2hhciBpbiBPUFRTVFJJTkcgaXMgZm9sbG93ZWQgYnkgYSBjb2xvbiwgdGhhdCBtZWFucyBpdCB3YW50cyBhbiBhcmcsCisgICBzbyB0aGUgZm9sbG93aW5nIHRleHQgaW4gdGhlIHNhbWUgQVJHVi1lbGVtZW50LCBvciB0aGUgdGV4dCBvZiB0aGUgZm9sbG93aW5nCisgICBBUkdWLWVsZW1lbnQsIGlzIHJldHVybmVkIGluIGBvcHRhcmcnLiAgVHdvIGNvbG9ucyBtZWFuIGFuIG9wdGlvbiB0aGF0CisgICB3YW50cyBhbiBvcHRpb25hbCBhcmc7IGlmIHRoZXJlIGlzIHRleHQgaW4gdGhlIGN1cnJlbnQgQVJHVi1lbGVtZW50LAorICAgaXQgaXMgcmV0dXJuZWQgaW4gYG9wdGFyZycsIG90aGVyd2lzZSBgb3B0YXJnJyBpcyBzZXQgdG8gemVyby4KKworICAgSWYgT1BUU1RSSU5HIHN0YXJ0cyB3aXRoIGAtJyBvciBgKycsIGl0IHJlcXVlc3RzIGRpZmZlcmVudCBtZXRob2RzIG9mCisgICBoYW5kbGluZyB0aGUgbm9uLW9wdGlvbiBBUkdWLWVsZW1lbnRzLgorICAgU2VlIHRoZSBjb21tZW50cyBhYm91dCBSRVRVUk5fSU5fT1JERVIgYW5kIFJFUVVJUkVfT1JERVIsIGFib3ZlLgorCisgICBMb25nLW5hbWVkIG9wdGlvbnMgYmVnaW4gd2l0aCBgLS0nIGluc3RlYWQgb2YgYC0nLgorICAgVGhlaXIgbmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkIGFzIGxvbmcgYXMgdGhlIGFiYnJldmlhdGlvbiBpcyB1bmlxdWUKKyAgIG9yIGlzIGFuIGV4YWN0IG1hdGNoIGZvciBzb21lIGRlZmluZWQgb3B0aW9uLiAgSWYgdGhleSBoYXZlIGFuCisgICBhcmd1bWVudCwgaXQgZm9sbG93cyB0aGUgb3B0aW9uIG5hbWUgaW4gdGhlIHNhbWUgQVJHVi1lbGVtZW50LCBzZXBhcmF0ZWQKKyAgIGZyb20gdGhlIG9wdGlvbiBuYW1lIGJ5IGEgYD0nLCBvciBlbHNlIHRoZSBpbiBuZXh0IEFSR1YtZWxlbWVudC4KKyAgIFdoZW4gYGdldG9wdCcgZmluZHMgYSBsb25nLW5hbWVkIG9wdGlvbiwgaXQgcmV0dXJucyAwIGlmIHRoYXQgb3B0aW9uJ3MKKyAgIGBmbGFnJyBmaWVsZCBpcyBub256ZXJvLCB0aGUgdmFsdWUgb2YgdGhlIG9wdGlvbidzIGB2YWwnIGZpZWxkCisgICBpZiB0aGUgYGZsYWcnIGZpZWxkIGlzIHplcm8uCisKKyAgIFRoZSBlbGVtZW50cyBvZiBBUkdWIGFyZW4ndCByZWFsbHkgY29uc3QsIGJlY2F1c2Ugd2UgcGVybXV0ZSB0aGVtLgorICAgQnV0IHdlIHByZXRlbmQgdGhleSdyZSBjb25zdCBpbiB0aGUgcHJvdG90eXBlIHRvIGJlIGNvbXBhdGlibGUKKyAgIHdpdGggb3RoZXIgc3lzdGVtcy4KKworICAgTE9OR09QVFMgaXMgYSB2ZWN0b3Igb2YgYHN0cnVjdCBvcHRpb24nIHRlcm1pbmF0ZWQgYnkgYW4KKyAgIGVsZW1lbnQgY29udGFpbmluZyBhIG5hbWUgd2hpY2ggaXMgemVyby4KKworICAgTE9OR0lORCByZXR1cm5zIHRoZSBpbmRleCBpbiBMT05HT1BUIG9mIHRoZSBsb25nLW5hbWVkIG9wdGlvbiBmb3VuZC4KKyAgIEl0IGlzIG9ubHkgdmFsaWQgd2hlbiBhIGxvbmctbmFtZWQgb3B0aW9uIGhhcyBiZWVuIGZvdW5kIGJ5IHRoZSBtb3N0CisgICByZWNlbnQgY2FsbC4KKworICAgSWYgTE9OR19PTkxZIGlzIG5vbnplcm8sICctJyBhcyB3ZWxsIGFzICctLScgY2FuIGludHJvZHVjZQorICAgbG9uZy1uYW1lZCBvcHRpb25zLiAgKi8KKworaW50CitfZ2V0b3B0X2ludGVybmFsIChhcmdjLCBhcmd2LCBvcHRzdHJpbmcsIGxvbmdvcHRzLCBsb25naW5kLCBsb25nX29ubHkpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICpjb25zdCAqYXJndjsKKyAgICAgY29uc3QgY2hhciAqb3B0c3RyaW5nOworICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nb3B0czsKKyAgICAgaW50ICpsb25naW5kOworICAgICBpbnQgbG9uZ19vbmx5OworeworICBvcHRhcmcgPSBOVUxMOworCisgIGlmIChvcHRpbmQgPT0gMCB8fCAhX19nZXRvcHRfaW5pdGlhbGl6ZWQpCisgICAgeworICAgICAgaWYgKG9wdGluZCA9PSAwKQorCW9wdGluZCA9IDE7CS8qIERvbid0IHNjYW4gQVJHVlswXSwgdGhlIHByb2dyYW0gbmFtZS4gICovCisgICAgICBvcHRzdHJpbmcgPSBfZ2V0b3B0X2luaXRpYWxpemUgKGFyZ2MsIGFyZ3YsIG9wdHN0cmluZyk7CisgICAgICBfX2dldG9wdF9pbml0aWFsaXplZCA9IDE7CisgICAgfQorCisgIC8qIFRlc3Qgd2hldGhlciBBUkdWW29wdGluZF0gcG9pbnRzIHRvIGEgbm9uLW9wdGlvbiBhcmd1bWVudC4KKyAgICAgRWl0aGVyIGl0IGRvZXMgbm90IGhhdmUgb3B0aW9uIHN5bnRheCwgb3IgdGhlcmUgaXMgYW4gZW52aXJvbm1lbnQgZmxhZworICAgICBmcm9tIHRoZSBzaGVsbCBpbmRpY2F0aW5nIGl0IGlzIG5vdCBhbiBvcHRpb24uICBUaGUgbGF0ZXIgaW5mb3JtYXRpb24KKyAgICAgaXMgb25seSB1c2VkIHdoZW4gdGhlIHVzZWQgaW4gdGhlIEdOVSBsaWJjLiAgKi8KKyNpZmRlZiBfTElCQworIyBkZWZpbmUgTk9OT1BUSU9OX1AgKGFyZ3Zbb3B0aW5kXVswXSAhPSAnLScgfHwgYXJndltvcHRpbmRdWzFdID09ICdcMCcJICAgICAgXAorCQkgICAgICB8fCAob3B0aW5kIDwgbm9ub3B0aW9uX2ZsYWdzX2xlbgkJCSAgICAgIFwKKwkJCSAgJiYgX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzW29wdGluZF0gPT0gJzEnKSkKKyNlbHNlCisjIGRlZmluZSBOT05PUFRJT05fUCAoYXJndltvcHRpbmRdWzBdICE9ICctJyB8fCBhcmd2W29wdGluZF1bMV0gPT0gJ1wwJykKKyNlbmRpZgorCisgIGlmIChuZXh0Y2hhciA9PSBOVUxMIHx8ICpuZXh0Y2hhciA9PSAnXDAnKQorICAgIHsKKyAgICAgIC8qIEFkdmFuY2UgdG8gdGhlIG5leHQgQVJHVi1lbGVtZW50LiAgKi8KKworICAgICAgLyogR2l2ZSBGSVJTVF9OT05PUFQgJiBMQVNUX05PTk9QVCByYXRpb25hbCB2YWx1ZXMgaWYgT1BUSU5EIGhhcyBiZWVuCisJIG1vdmVkIGJhY2sgYnkgdGhlIHVzZXIgKHdobyBtYXkgYWxzbyBoYXZlIGNoYW5nZWQgdGhlIGFyZ3VtZW50cykuICAqLworICAgICAgaWYgKGxhc3Rfbm9ub3B0ID4gb3B0aW5kKQorCWxhc3Rfbm9ub3B0ID0gb3B0aW5kOworICAgICAgaWYgKGZpcnN0X25vbm9wdCA+IG9wdGluZCkKKwlmaXJzdF9ub25vcHQgPSBvcHRpbmQ7CisKKyAgICAgIGlmIChvcmRlcmluZyA9PSBQRVJNVVRFKQorCXsKKwkgIC8qIElmIHdlIGhhdmUganVzdCBwcm9jZXNzZWQgc29tZSBvcHRpb25zIGZvbGxvd2luZyBzb21lIG5vbi1vcHRpb25zLAorCSAgICAgZXhjaGFuZ2UgdGhlbSBzbyB0aGF0IHRoZSBvcHRpb25zIGNvbWUgZmlyc3QuICAqLworCisJICBpZiAoZmlyc3Rfbm9ub3B0ICE9IGxhc3Rfbm9ub3B0ICYmIGxhc3Rfbm9ub3B0ICE9IG9wdGluZCkKKwkgICAgZXhjaGFuZ2UgKChjaGFyICoqKSBhcmd2KTsKKwkgIGVsc2UgaWYgKGxhc3Rfbm9ub3B0ICE9IG9wdGluZCkKKwkgICAgZmlyc3Rfbm9ub3B0ID0gb3B0aW5kOworCisJICAvKiBTa2lwIGFueSBhZGRpdGlvbmFsIG5vbi1vcHRpb25zCisJICAgICBhbmQgZXh0ZW5kIHRoZSByYW5nZSBvZiBub24tb3B0aW9ucyBwcmV2aW91c2x5IHNraXBwZWQuICAqLworCisJICB3aGlsZSAob3B0aW5kIDwgYXJnYyAmJiBOT05PUFRJT05fUCkKKwkgICAgb3B0aW5kKys7CisJICBsYXN0X25vbm9wdCA9IG9wdGluZDsKKwl9CisKKyAgICAgIC8qIFRoZSBzcGVjaWFsIEFSR1YtZWxlbWVudCBgLS0nIG1lYW5zIHByZW1hdHVyZSBlbmQgb2Ygb3B0aW9ucy4KKwkgU2tpcCBpdCBsaWtlIGEgbnVsbCBvcHRpb24sCisJIHRoZW4gZXhjaGFuZ2Ugd2l0aCBwcmV2aW91cyBub24tb3B0aW9ucyBhcyBpZiBpdCB3ZXJlIGFuIG9wdGlvbiwKKwkgdGhlbiBza2lwIGV2ZXJ5dGhpbmcgZWxzZSBsaWtlIGEgbm9uLW9wdGlvbi4gICovCisKKyAgICAgIGlmIChvcHRpbmQgIT0gYXJnYyAmJiAhc3RyY21wIChhcmd2W29wdGluZF0sICItLSIpKQorCXsKKwkgIG9wdGluZCsrOworCisJICBpZiAoZmlyc3Rfbm9ub3B0ICE9IGxhc3Rfbm9ub3B0ICYmIGxhc3Rfbm9ub3B0ICE9IG9wdGluZCkKKwkgICAgZXhjaGFuZ2UgKChjaGFyICoqKSBhcmd2KTsKKwkgIGVsc2UgaWYgKGZpcnN0X25vbm9wdCA9PSBsYXN0X25vbm9wdCkKKwkgICAgZmlyc3Rfbm9ub3B0ID0gb3B0aW5kOworCSAgbGFzdF9ub25vcHQgPSBhcmdjOworCisJICBvcHRpbmQgPSBhcmdjOworCX0KKworICAgICAgLyogSWYgd2UgaGF2ZSBkb25lIGFsbCB0aGUgQVJHVi1lbGVtZW50cywgc3RvcCB0aGUgc2NhbgorCSBhbmQgYmFjayBvdmVyIGFueSBub24tb3B0aW9ucyB0aGF0IHdlIHNraXBwZWQgYW5kIHBlcm11dGVkLiAgKi8KKworICAgICAgaWYgKG9wdGluZCA9PSBhcmdjKQorCXsKKwkgIC8qIFNldCB0aGUgbmV4dC1hcmctaW5kZXggdG8gcG9pbnQgYXQgdGhlIG5vbi1vcHRpb25zCisJICAgICB0aGF0IHdlIHByZXZpb3VzbHkgc2tpcHBlZCwgc28gdGhlIGNhbGxlciB3aWxsIGRpZ2VzdCB0aGVtLiAgKi8KKwkgIGlmIChmaXJzdF9ub25vcHQgIT0gbGFzdF9ub25vcHQpCisJICAgIG9wdGluZCA9IGZpcnN0X25vbm9wdDsKKwkgIHJldHVybiAtMTsKKwl9CisKKyAgICAgIC8qIElmIHdlIGhhdmUgY29tZSB0byBhIG5vbi1vcHRpb24gYW5kIGRpZCBub3QgcGVybXV0ZSBpdCwKKwkgZWl0aGVyIHN0b3AgdGhlIHNjYW4gb3IgZGVzY3JpYmUgaXQgdG8gdGhlIGNhbGxlciBhbmQgcGFzcyBpdCBieS4gICovCisKKyAgICAgIGlmIChOT05PUFRJT05fUCkKKwl7CisJICBpZiAob3JkZXJpbmcgPT0gUkVRVUlSRV9PUkRFUikKKwkgICAgcmV0dXJuIC0xOworCSAgb3B0YXJnID0gYXJndltvcHRpbmQrK107CisJICByZXR1cm4gMTsKKwl9CisKKyAgICAgIC8qIFdlIGhhdmUgZm91bmQgYW5vdGhlciBvcHRpb24tQVJHVi1lbGVtZW50LgorCSBTa2lwIHRoZSBpbml0aWFsIHB1bmN0dWF0aW9uLiAgKi8KKworICAgICAgbmV4dGNoYXIgPSAoYXJndltvcHRpbmRdICsgMQorCQkgICsgKGxvbmdvcHRzICE9IE5VTEwgJiYgYXJndltvcHRpbmRdWzFdID09ICctJykpOworICAgIH0KKworICAvKiBEZWNvZGUgdGhlIGN1cnJlbnQgb3B0aW9uLUFSR1YtZWxlbWVudC4gICovCisKKyAgLyogQ2hlY2sgd2hldGhlciB0aGUgQVJHVi1lbGVtZW50IGlzIGEgbG9uZyBvcHRpb24uCisKKyAgICAgSWYgbG9uZ19vbmx5IGFuZCB0aGUgQVJHVi1lbGVtZW50IGhhcyB0aGUgZm9ybSAiLWYiLCB3aGVyZSBmIGlzCisgICAgIGEgdmFsaWQgc2hvcnQgb3B0aW9uLCBkb24ndCBjb25zaWRlciBpdCBhbiBhYmJyZXZpYXRlZCBmb3JtIG9mCisgICAgIGEgbG9uZyBvcHRpb24gdGhhdCBzdGFydHMgd2l0aCBmLiAgT3RoZXJ3aXNlIHRoZXJlIHdvdWxkIGJlIG5vCisgICAgIHdheSB0byBnaXZlIHRoZSAtZiBzaG9ydCBvcHRpb24uCisKKyAgICAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZXJlJ3MgYSBsb25nIG9wdGlvbiAiZnViYXIiIGFuZAorICAgICB0aGUgQVJHVi1lbGVtZW50IGlzICItZnUiLCBkbyBjb25zaWRlciB0aGF0IGFuIGFiYnJldmlhdGlvbiBvZgorICAgICB0aGUgbG9uZyBvcHRpb24sIGp1c3QgbGlrZSAiLS1mdSIsIGFuZCBub3QgIi1mIiB3aXRoIGFyZyAidSIuCisKKyAgICAgVGhpcyBkaXN0aW5jdGlvbiBzZWVtcyB0byBiZSB0aGUgbW9zdCB1c2VmdWwgYXBwcm9hY2guICAqLworCisgIGlmIChsb25nb3B0cyAhPSBOVUxMCisgICAgICAmJiAoYXJndltvcHRpbmRdWzFdID09ICctJworCSAgfHwgKGxvbmdfb25seSAmJiAoYXJndltvcHRpbmRdWzJdIHx8ICFteV9pbmRleCAob3B0c3RyaW5nLCBhcmd2W29wdGluZF1bMV0pKSkpKQorICAgIHsKKyAgICAgIGNoYXIgKm5hbWVlbmQ7CisgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpwOworICAgICAgY29uc3Qgc3RydWN0IG9wdGlvbiAqcGZvdW5kID0gTlVMTDsKKyAgICAgIGludCBleGFjdCA9IDA7CisgICAgICBpbnQgYW1iaWcgPSAwOworICAgICAgaW50IGluZGZvdW5kID0gLTE7CisgICAgICBpbnQgb3B0aW9uX2luZGV4OworCisgICAgICBmb3IgKG5hbWVlbmQgPSBuZXh0Y2hhcjsgKm5hbWVlbmQgJiYgKm5hbWVlbmQgIT0gJz0nOyBuYW1lZW5kKyspCisJLyogRG8gbm90aGluZy4gICovIDsKKworICAgICAgLyogVGVzdCBhbGwgbG9uZyBvcHRpb25zIGZvciBlaXRoZXIgZXhhY3QgbWF0Y2gKKwkgb3IgYWJicmV2aWF0ZWQgbWF0Y2hlcy4gICovCisgICAgICBmb3IgKHAgPSBsb25nb3B0cywgb3B0aW9uX2luZGV4ID0gMDsgcC0+bmFtZTsgcCsrLCBvcHRpb25faW5kZXgrKykKKwlpZiAoIXN0cm5jbXAgKHAtPm5hbWUsIG5leHRjaGFyLCBuYW1lZW5kIC0gbmV4dGNoYXIpKQorCSAgeworCSAgICBpZiAoKHVuc2lnbmVkIGludCkgKG5hbWVlbmQgLSBuZXh0Y2hhcikKKwkJPT0gKHVuc2lnbmVkIGludCkgc3RybGVuIChwLT5uYW1lKSkKKwkgICAgICB7CisJCS8qIEV4YWN0IG1hdGNoIGZvdW5kLiAgKi8KKwkJcGZvdW5kID0gcDsKKwkJaW5kZm91bmQgPSBvcHRpb25faW5kZXg7CisJCWV4YWN0ID0gMTsKKwkJYnJlYWs7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChwZm91bmQgPT0gTlVMTCkKKwkgICAgICB7CisJCS8qIEZpcnN0IG5vbmV4YWN0IG1hdGNoIGZvdW5kLiAgKi8KKwkJcGZvdW5kID0gcDsKKwkJaW5kZm91bmQgPSBvcHRpb25faW5kZXg7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgLyogU2Vjb25kIG9yIGxhdGVyIG5vbmV4YWN0IG1hdGNoIGZvdW5kLiAgKi8KKwkgICAgICBhbWJpZyA9IDE7CisJICB9CisKKyAgICAgIGlmIChhbWJpZyAmJiAhZXhhY3QpCisJeworCSAgaWYgKG9wdGVycikKKwkgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogb3B0aW9uIGAlcycgaXMgYW1iaWd1b3VzXG4iKSwKKwkJICAgICBhcmd2WzBdLCBhcmd2W29wdGluZF0pOworCSAgbmV4dGNoYXIgKz0gc3RybGVuIChuZXh0Y2hhcik7CisJICBvcHRpbmQrKzsKKwkgIG9wdG9wdCA9IDA7CisJICByZXR1cm4gJz8nOworCX0KKworICAgICAgaWYgKHBmb3VuZCAhPSBOVUxMKQorCXsKKwkgIG9wdGlvbl9pbmRleCA9IGluZGZvdW5kOworCSAgb3B0aW5kKys7CisJICBpZiAoKm5hbWVlbmQpCisJICAgIHsKKwkgICAgICAvKiBEb24ndCB0ZXN0IGhhc19hcmcgd2l0aCA+LCBiZWNhdXNlIHNvbWUgQyBjb21waWxlcnMgZG9uJ3QKKwkJIGFsbG93IGl0IHRvIGJlIHVzZWQgb24gZW51bXMuICAqLworCSAgICAgIGlmIChwZm91bmQtPmhhc19hcmcpCisJCW9wdGFyZyA9IG5hbWVlbmQgKyAxOworCSAgICAgIGVsc2UKKwkJeworCQkgIGlmIChvcHRlcnIpCisJCSAgICB7CisJCSAgICAgIGlmIChhcmd2W29wdGluZCAtIDFdWzFdID09ICctJykKKwkJCS8qIC0tb3B0aW9uICovCisJCQlmcHJpbnRmIChzdGRlcnIsCisJCQkJIF8oIiVzOiBvcHRpb24gYC0tJXMnIGRvZXNuJ3QgYWxsb3cgYW4gYXJndW1lbnRcbiIpLAorCQkJCSBhcmd2WzBdLCBwZm91bmQtPm5hbWUpOworCQkgICAgICBlbHNlCisJCQkvKiArb3B0aW9uIG9yIC1vcHRpb24gKi8KKwkJCWZwcmludGYgKHN0ZGVyciwKKwkJCQkgXygiJXM6IG9wdGlvbiBgJWMlcycgZG9lc24ndCBhbGxvdyBhbiBhcmd1bWVudFxuIiksCisJCQkJIGFyZ3ZbMF0sIGFyZ3Zbb3B0aW5kIC0gMV1bMF0sIHBmb3VuZC0+bmFtZSk7CisJCSAgICB9CisJCSAgbmV4dGNoYXIgKz0gc3RybGVuIChuZXh0Y2hhcik7CisKKwkJICBvcHRvcHQgPSBwZm91bmQtPnZhbDsKKwkJICByZXR1cm4gJz8nOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKHBmb3VuZC0+aGFzX2FyZyA9PSAxKQorCSAgICB7CisJICAgICAgaWYgKG9wdGluZCA8IGFyZ2MpCisJCW9wdGFyZyA9IGFyZ3Zbb3B0aW5kKytdOworCSAgICAgIGVsc2UKKwkJeworCQkgIGlmIChvcHRlcnIpCisJCSAgICBmcHJpbnRmIChzdGRlcnIsCisJCQkgICBfKCIlczogb3B0aW9uIGAlcycgcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpLAorCQkJICAgYXJndlswXSwgYXJndltvcHRpbmQgLSAxXSk7CisJCSAgbmV4dGNoYXIgKz0gc3RybGVuIChuZXh0Y2hhcik7CisJCSAgb3B0b3B0ID0gcGZvdW5kLT52YWw7CisJCSAgcmV0dXJuIG9wdHN0cmluZ1swXSA9PSAnOicgPyAnOicgOiAnPyc7CisJCX0KKwkgICAgfQorCSAgbmV4dGNoYXIgKz0gc3RybGVuIChuZXh0Y2hhcik7CisJICBpZiAobG9uZ2luZCAhPSBOVUxMKQorCSAgICAqbG9uZ2luZCA9IG9wdGlvbl9pbmRleDsKKwkgIGlmIChwZm91bmQtPmZsYWcpCisJICAgIHsKKwkgICAgICAqKHBmb3VuZC0+ZmxhZykgPSBwZm91bmQtPnZhbDsKKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCSAgcmV0dXJuIHBmb3VuZC0+dmFsOworCX0KKworICAgICAgLyogQ2FuJ3QgZmluZCBpdCBhcyBhIGxvbmcgb3B0aW9uLiAgSWYgdGhpcyBpcyBub3QgZ2V0b3B0X2xvbmdfb25seSwKKwkgb3IgdGhlIG9wdGlvbiBzdGFydHMgd2l0aCAnLS0nIG9yIGlzIG5vdCBhIHZhbGlkIHNob3J0CisJIG9wdGlvbiwgdGhlbiBpdCdzIGFuIGVycm9yLgorCSBPdGhlcndpc2UgaW50ZXJwcmV0IGl0IGFzIGEgc2hvcnQgb3B0aW9uLiAgKi8KKyAgICAgIGlmICghbG9uZ19vbmx5IHx8IGFyZ3Zbb3B0aW5kXVsxXSA9PSAnLScKKwkgIHx8IG15X2luZGV4IChvcHRzdHJpbmcsICpuZXh0Y2hhcikgPT0gTlVMTCkKKwl7CisJICBpZiAob3B0ZXJyKQorCSAgICB7CisJICAgICAgaWYgKGFyZ3Zbb3B0aW5kXVsxXSA9PSAnLScpCisJCS8qIC0tb3B0aW9uICovCisJCWZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVucmVjb2duaXplZCBvcHRpb24gYC0tJXMnXG4iKSwKKwkJCSBhcmd2WzBdLCBuZXh0Y2hhcik7CisJICAgICAgZWxzZQorCQkvKiArb3B0aW9uIG9yIC1vcHRpb24gKi8KKwkJZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdW5yZWNvZ25pemVkIG9wdGlvbiBgJWMlcydcbiIpLAorCQkJIGFyZ3ZbMF0sIGFyZ3Zbb3B0aW5kXVswXSwgbmV4dGNoYXIpOworCSAgICB9CisJICBuZXh0Y2hhciA9IChjaGFyICopICIiOworCSAgb3B0aW5kKys7CisJICBvcHRvcHQgPSAwOworCSAgcmV0dXJuICc/JzsKKwl9CisgICAgfQorCisgIC8qIExvb2sgYXQgYW5kIGhhbmRsZSB0aGUgbmV4dCBzaG9ydCBvcHRpb24tY2hhcmFjdGVyLiAgKi8KKworICB7CisgICAgY2hhciBjID0gKm5leHRjaGFyKys7CisgICAgY2hhciAqdGVtcCA9IG15X2luZGV4IChvcHRzdHJpbmcsIGMpOworCisgICAgLyogSW5jcmVtZW50IGBvcHRpbmQnIHdoZW4gd2Ugc3RhcnQgdG8gcHJvY2VzcyBpdHMgbGFzdCBjaGFyYWN0ZXIuICAqLworICAgIGlmICgqbmV4dGNoYXIgPT0gJ1wwJykKKyAgICAgICsrb3B0aW5kOworCisgICAgaWYgKHRlbXAgPT0gTlVMTCB8fCBjID09ICc6JykKKyAgICAgIHsKKwlpZiAob3B0ZXJyKQorCSAgeworCSAgICBpZiAocG9zaXhseV9jb3JyZWN0KQorCSAgICAgIC8qIDEwMDMuMiBzcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiB0aGlzIG1lc3NhZ2UuICAqLworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGlsbGVnYWwgb3B0aW9uIC0tICVjXG4iKSwKKwkJICAgICAgIGFyZ3ZbMF0sIGMpOworCSAgICBlbHNlCisJICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogaW52YWxpZCBvcHRpb24gLS0gJWNcbiIpLAorCQkgICAgICAgYXJndlswXSwgYyk7CisJICB9CisJb3B0b3B0ID0gYzsKKwlyZXR1cm4gJz8nOworICAgICAgfQorICAgIC8qIENvbnZlbmllbmNlLiBUcmVhdCBQT1NJWCAtVyBmb28gc2FtZSBhcyBsb25nIG9wdGlvbiAtLWZvbyAqLworICAgIGlmICh0ZW1wWzBdID09ICdXJyAmJiB0ZW1wWzFdID09ICc7JykKKyAgICAgIHsKKwljaGFyICpuYW1lZW5kOworCWNvbnN0IHN0cnVjdCBvcHRpb24gKnA7CisJY29uc3Qgc3RydWN0IG9wdGlvbiAqcGZvdW5kID0gTlVMTDsKKwlpbnQgZXhhY3QgPSAwOworCWludCBhbWJpZyA9IDA7CisJaW50IGluZGZvdW5kID0gMDsKKwlpbnQgb3B0aW9uX2luZGV4OworCisJLyogVGhpcyBpcyBhbiBvcHRpb24gdGhhdCByZXF1aXJlcyBhbiBhcmd1bWVudC4gICovCisJaWYgKCpuZXh0Y2hhciAhPSAnXDAnKQorCSAgeworCSAgICBvcHRhcmcgPSBuZXh0Y2hhcjsKKwkgICAgLyogSWYgd2UgZW5kIHRoaXMgQVJHVi1lbGVtZW50IGJ5IHRha2luZyB0aGUgcmVzdCBhcyBhbiBhcmcsCisJICAgICAgIHdlIG11c3QgYWR2YW5jZSB0byB0aGUgbmV4dCBlbGVtZW50IG5vdy4gICovCisJICAgIG9wdGluZCsrOworCSAgfQorCWVsc2UgaWYgKG9wdGluZCA9PSBhcmdjKQorCSAgeworCSAgICBpZiAob3B0ZXJyKQorCSAgICAgIHsKKwkJLyogMTAwMy4yIHNwZWNpZmllcyB0aGUgZm9ybWF0IG9mIHRoaXMgbWVzc2FnZS4gICovCisJCWZwcmludGYgKHN0ZGVyciwgXygiJXM6IG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCAtLSAlY1xuIiksCisJCQkgYXJndlswXSwgYyk7CisJICAgICAgfQorCSAgICBvcHRvcHQgPSBjOworCSAgICBpZiAob3B0c3RyaW5nWzBdID09ICc6JykKKwkgICAgICBjID0gJzonOworCSAgICBlbHNlCisJICAgICAgYyA9ICc/JzsKKwkgICAgcmV0dXJuIGM7CisJICB9CisJZWxzZQorCSAgLyogV2UgYWxyZWFkeSBpbmNyZW1lbnRlZCBgb3B0aW5kJyBvbmNlOworCSAgICAgaW5jcmVtZW50IGl0IGFnYWluIHdoZW4gdGFraW5nIG5leHQgQVJHVi1lbHQgYXMgYXJndW1lbnQuICAqLworCSAgb3B0YXJnID0gYXJndltvcHRpbmQrK107CisKKwkvKiBvcHRhcmcgaXMgbm93IHRoZSBhcmd1bWVudCwgc2VlIGlmIGl0J3MgaW4gdGhlCisJICAgdGFibGUgb2YgbG9uZ29wdHMuICAqLworCisJZm9yIChuZXh0Y2hhciA9IG5hbWVlbmQgPSBvcHRhcmc7ICpuYW1lZW5kICYmICpuYW1lZW5kICE9ICc9JzsgbmFtZWVuZCsrKQorCSAgLyogRG8gbm90aGluZy4gICovIDsKKworCS8qIFRlc3QgYWxsIGxvbmcgb3B0aW9ucyBmb3IgZWl0aGVyIGV4YWN0IG1hdGNoCisJICAgb3IgYWJicmV2aWF0ZWQgbWF0Y2hlcy4gICovCisJZm9yIChwID0gbG9uZ29wdHMsIG9wdGlvbl9pbmRleCA9IDA7IHAtPm5hbWU7IHArKywgb3B0aW9uX2luZGV4KyspCisJICBpZiAoIXN0cm5jbXAgKHAtPm5hbWUsIG5leHRjaGFyLCBuYW1lZW5kIC0gbmV4dGNoYXIpKQorCSAgICB7CisJICAgICAgaWYgKCh1bnNpZ25lZCBpbnQpIChuYW1lZW5kIC0gbmV4dGNoYXIpID09IHN0cmxlbiAocC0+bmFtZSkpCisJCXsKKwkJICAvKiBFeGFjdCBtYXRjaCBmb3VuZC4gICovCisJCSAgcGZvdW5kID0gcDsKKwkJICBpbmRmb3VuZCA9IG9wdGlvbl9pbmRleDsKKwkJICBleGFjdCA9IDE7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgICBlbHNlIGlmIChwZm91bmQgPT0gTlVMTCkKKwkJeworCQkgIC8qIEZpcnN0IG5vbmV4YWN0IG1hdGNoIGZvdW5kLiAgKi8KKwkJICBwZm91bmQgPSBwOworCQkgIGluZGZvdW5kID0gb3B0aW9uX2luZGV4OworCQl9CisJICAgICAgZWxzZQorCQkvKiBTZWNvbmQgb3IgbGF0ZXIgbm9uZXhhY3QgbWF0Y2ggZm91bmQuICAqLworCQlhbWJpZyA9IDE7CisJICAgIH0KKwlpZiAoYW1iaWcgJiYgIWV4YWN0KQorCSAgeworCSAgICBpZiAob3B0ZXJyKQorCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG9wdGlvbiBgLVcgJXMnIGlzIGFtYmlndW91c1xuIiksCisJCSAgICAgICBhcmd2WzBdLCBhcmd2W29wdGluZF0pOworCSAgICBuZXh0Y2hhciArPSBzdHJsZW4gKG5leHRjaGFyKTsKKwkgICAgb3B0aW5kKys7CisJICAgIHJldHVybiAnPyc7CisJICB9CisJaWYgKHBmb3VuZCAhPSBOVUxMKQorCSAgeworCSAgICBvcHRpb25faW5kZXggPSBpbmRmb3VuZDsKKwkgICAgaWYgKCpuYW1lZW5kKQorCSAgICAgIHsKKwkJLyogRG9uJ3QgdGVzdCBoYXNfYXJnIHdpdGggPiwgYmVjYXVzZSBzb21lIEMgY29tcGlsZXJzIGRvbid0CisJCSAgIGFsbG93IGl0IHRvIGJlIHVzZWQgb24gZW51bXMuICAqLworCQlpZiAocGZvdW5kLT5oYXNfYXJnKQorCQkgIG9wdGFyZyA9IG5hbWVlbmQgKyAxOworCQllbHNlCisJCSAgeworCQkgICAgaWYgKG9wdGVycikKKwkJICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJcCislczogb3B0aW9uIGAtVyAlcycgZG9lc24ndCBhbGxvdyBhbiBhcmd1bWVudFxuIiksCisJCQkgICAgICAgYXJndlswXSwgcGZvdW5kLT5uYW1lKTsKKworCQkgICAgbmV4dGNoYXIgKz0gc3RybGVuIChuZXh0Y2hhcik7CisJCSAgICByZXR1cm4gJz8nOworCQkgIH0KKwkgICAgICB9CisJICAgIGVsc2UgaWYgKHBmb3VuZC0+aGFzX2FyZyA9PSAxKQorCSAgICAgIHsKKwkJaWYgKG9wdGluZCA8IGFyZ2MpCisJCSAgb3B0YXJnID0gYXJndltvcHRpbmQrK107CisJCWVsc2UKKwkJICB7CisJCSAgICBpZiAob3B0ZXJyKQorCQkgICAgICBmcHJpbnRmIChzdGRlcnIsCisJCQkgICAgICAgXygiJXM6IG9wdGlvbiBgJXMnIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKSwKKwkJCSAgICAgICBhcmd2WzBdLCBhcmd2W29wdGluZCAtIDFdKTsKKwkJICAgIG5leHRjaGFyICs9IHN0cmxlbiAobmV4dGNoYXIpOworCQkgICAgcmV0dXJuIG9wdHN0cmluZ1swXSA9PSAnOicgPyAnOicgOiAnPyc7CisJCSAgfQorCSAgICAgIH0KKwkgICAgbmV4dGNoYXIgKz0gc3RybGVuIChuZXh0Y2hhcik7CisJICAgIGlmIChsb25naW5kICE9IE5VTEwpCisJICAgICAgKmxvbmdpbmQgPSBvcHRpb25faW5kZXg7CisJICAgIGlmIChwZm91bmQtPmZsYWcpCisJICAgICAgeworCQkqKHBmb3VuZC0+ZmxhZykgPSBwZm91bmQtPnZhbDsKKwkJcmV0dXJuIDA7CisJICAgICAgfQorCSAgICByZXR1cm4gcGZvdW5kLT52YWw7CisJICB9CisJICBuZXh0Y2hhciA9IE5VTEw7CisJICByZXR1cm4gJ1cnOwkvKiBMZXQgdGhlIGFwcGxpY2F0aW9uIGhhbmRsZSBpdC4gICAqLworICAgICAgfQorICAgIGlmICh0ZW1wWzFdID09ICc6JykKKyAgICAgIHsKKwlpZiAodGVtcFsyXSA9PSAnOicpCisJICB7CisJICAgIC8qIFRoaXMgaXMgYW4gb3B0aW9uIHRoYXQgYWNjZXB0cyBhbiBhcmd1bWVudCBvcHRpb25hbGx5LiAgKi8KKwkgICAgaWYgKCpuZXh0Y2hhciAhPSAnXDAnKQorCSAgICAgIHsKKwkJb3B0YXJnID0gbmV4dGNoYXI7CisJCW9wdGluZCsrOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIG9wdGFyZyA9IE5VTEw7CisJICAgIG5leHRjaGFyID0gTlVMTDsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIC8qIFRoaXMgaXMgYW4gb3B0aW9uIHRoYXQgcmVxdWlyZXMgYW4gYXJndW1lbnQuICAqLworCSAgICBpZiAoKm5leHRjaGFyICE9ICdcMCcpCisJICAgICAgeworCQlvcHRhcmcgPSBuZXh0Y2hhcjsKKwkJLyogSWYgd2UgZW5kIHRoaXMgQVJHVi1lbGVtZW50IGJ5IHRha2luZyB0aGUgcmVzdCBhcyBhbiBhcmcsCisJCSAgIHdlIG11c3QgYWR2YW5jZSB0byB0aGUgbmV4dCBlbGVtZW50IG5vdy4gICovCisJCW9wdGluZCsrOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAob3B0aW5kID09IGFyZ2MpCisJICAgICAgeworCQlpZiAob3B0ZXJyKQorCQkgIHsKKwkJICAgIC8qIDEwMDMuMiBzcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiB0aGlzIG1lc3NhZ2UuICAqLworCQkgICAgZnByaW50ZiAoc3RkZXJyLAorCQkJICAgXygiJXM6IG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCAtLSAlY1xuIiksCisJCQkgICBhcmd2WzBdLCBjKTsKKwkJICB9CisJCW9wdG9wdCA9IGM7CisJCWlmIChvcHRzdHJpbmdbMF0gPT0gJzonKQorCQkgIGMgPSAnOic7CisJCWVsc2UKKwkJICBjID0gJz8nOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIC8qIFdlIGFscmVhZHkgaW5jcmVtZW50ZWQgYG9wdGluZCcgb25jZTsKKwkJIGluY3JlbWVudCBpdCBhZ2FpbiB3aGVuIHRha2luZyBuZXh0IEFSR1YtZWx0IGFzIGFyZ3VtZW50LiAgKi8KKwkgICAgICBvcHRhcmcgPSBhcmd2W29wdGluZCsrXTsKKwkgICAgbmV4dGNoYXIgPSBOVUxMOworCSAgfQorICAgICAgfQorICAgIHJldHVybiBjOworICB9Cit9CisKK2ludAorZ2V0b3B0IChhcmdjLCBhcmd2LCBvcHRzdHJpbmcpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICpjb25zdCAqYXJndjsKKyAgICAgY29uc3QgY2hhciAqb3B0c3RyaW5nOworeworICByZXR1cm4gX2dldG9wdF9pbnRlcm5hbCAoYXJnYywgYXJndiwgb3B0c3RyaW5nLAorCQkJICAgKGNvbnN0IHN0cnVjdCBvcHRpb24gKikgMCwKKwkJCSAgIChpbnQgKikgMCwKKwkJCSAgIDApOworfQorCisjZW5kaWYJLyogTm90IEVMSURFX0NPREUuICAqLworDAorI2lmZGVmIFRFU1QKKworLyogQ29tcGlsZSB3aXRoIC1EVEVTVCB0byBtYWtlIGFuIGV4ZWN1dGFibGUgZm9yIHVzZSBpbiB0ZXN0aW5nCisgICB0aGUgYWJvdmUgZGVmaW5pdGlvbiBvZiBgZ2V0b3B0Jy4gICovCisKK2ludAorbWFpbiAoYXJnYywgYXJndikKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKiphcmd2OworeworICBpbnQgYzsKKyAgaW50IGRpZ2l0X29wdGluZCA9IDA7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaW50IHRoaXNfb3B0aW9uX29wdGluZCA9IG9wdGluZCA/IG9wdGluZCA6IDE7CisKKyAgICAgIGMgPSBnZXRvcHQgKGFyZ2MsIGFyZ3YsICJhYmM6ZDowMTIzNDU2Nzg5Iik7CisgICAgICBpZiAoYyA9PSAtMSkKKwlicmVhazsKKworICAgICAgc3dpdGNoIChjKQorCXsKKwljYXNlICcwJzoKKwljYXNlICcxJzoKKwljYXNlICcyJzoKKwljYXNlICczJzoKKwljYXNlICc0JzoKKwljYXNlICc1JzoKKwljYXNlICc2JzoKKwljYXNlICc3JzoKKwljYXNlICc4JzoKKwljYXNlICc5JzoKKwkgIGlmIChkaWdpdF9vcHRpbmQgIT0gMCAmJiBkaWdpdF9vcHRpbmQgIT0gdGhpc19vcHRpb25fb3B0aW5kKQorCSAgICBwcmludGYgKCJkaWdpdHMgb2NjdXIgaW4gdHdvIGRpZmZlcmVudCBhcmd2LWVsZW1lbnRzLlxuIik7CisJICBkaWdpdF9vcHRpbmQgPSB0aGlzX29wdGlvbl9vcHRpbmQ7CisJICBwcmludGYgKCJvcHRpb24gJWNcbiIsIGMpOworCSAgYnJlYWs7CisKKwljYXNlICdhJzoKKwkgIHByaW50ZiAoIm9wdGlvbiBhXG4iKTsKKwkgIGJyZWFrOworCisJY2FzZSAnYic6CisJICBwcmludGYgKCJvcHRpb24gYlxuIik7CisJICBicmVhazsKKworCWNhc2UgJ2MnOgorCSAgcHJpbnRmICgib3B0aW9uIGMgd2l0aCB2YWx1ZSBgJXMnXG4iLCBvcHRhcmcpOworCSAgYnJlYWs7CisKKwljYXNlICc/JzoKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIHByaW50ZiAoIj8/IGdldG9wdCByZXR1cm5lZCBjaGFyYWN0ZXIgY29kZSAwJW8gPz9cbiIsIGMpOworCX0KKyAgICB9CisKKyAgaWYgKG9wdGluZCA8IGFyZ2MpCisgICAgeworICAgICAgcHJpbnRmICgibm9uLW9wdGlvbiBBUkdWLWVsZW1lbnRzOiAiKTsKKyAgICAgIHdoaWxlIChvcHRpbmQgPCBhcmdjKQorCXByaW50ZiAoIiVzICIsIGFyZ3Zbb3B0aW5kKytdKTsKKyAgICAgIHByaW50ZiAoIlxuIik7CisgICAgfQorCisgIGV4aXQgKDApOworfQorCisjZW5kaWYgLyogVEVTVCAqLwpkaWZmIC0tZ2l0IGEvbGliL2dldG9wdC5oIGIvbGliL2dldG9wdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMzA3MTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2V0b3B0LmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qIERlY2xhcmF0aW9ucyBmb3IgZ2V0b3B0LgorICAgQ29weXJpZ2h0IChDKSAxOTg5LDkwLDkxLDkyLDkzLDk0LDk2LDk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBOT1RFOiBUaGUgY2Fub25pY2FsIHNvdXJjZSBvZiB0aGlzIGZpbGUgaXMgbWFpbnRhaW5lZCB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5LgorICAgQnVncyBjYW4gYmUgcmVwb3J0ZWQgdG8gYnVnLWdsaWJjQGdudS5vcmcuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAgIGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZuZGVmIF9HRVRPUFRfSAorI2RlZmluZSBfR0VUT1BUX0ggMQorCisjaWZkZWYJX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEZvciBjb21tdW5pY2F0aW9uIGZyb20gYGdldG9wdCcgdG8gdGhlIGNhbGxlci4KKyAgIFdoZW4gYGdldG9wdCcgZmluZHMgYW4gb3B0aW9uIHRoYXQgdGFrZXMgYW4gYXJndW1lbnQsCisgICB0aGUgYXJndW1lbnQgdmFsdWUgaXMgcmV0dXJuZWQgaGVyZS4KKyAgIEFsc28sIHdoZW4gYG9yZGVyaW5nJyBpcyBSRVRVUk5fSU5fT1JERVIsCisgICBlYWNoIG5vbi1vcHRpb24gQVJHVi1lbGVtZW50IGlzIHJldHVybmVkIGhlcmUuICAqLworCitleHRlcm4gY2hhciAqb3B0YXJnOworCisvKiBJbmRleCBpbiBBUkdWIG9mIHRoZSBuZXh0IGVsZW1lbnQgdG8gYmUgc2Nhbm5lZC4KKyAgIFRoaXMgaXMgdXNlZCBmb3IgY29tbXVuaWNhdGlvbiB0byBhbmQgZnJvbSB0aGUgY2FsbGVyCisgICBhbmQgZm9yIGNvbW11bmljYXRpb24gYmV0d2VlbiBzdWNjZXNzaXZlIGNhbGxzIHRvIGBnZXRvcHQnLgorCisgICBPbiBlbnRyeSB0byBgZ2V0b3B0JywgemVybyBtZWFucyB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsOyBpbml0aWFsaXplLgorCisgICBXaGVuIGBnZXRvcHQnIHJldHVybnMgLTEsIHRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvZiB0aGUKKyAgIG5vbi1vcHRpb24gZWxlbWVudHMgdGhhdCB0aGUgY2FsbGVyIHNob3VsZCBpdHNlbGYgc2Nhbi4KKworICAgT3RoZXJ3aXNlLCBgb3B0aW5kJyBjb21tdW5pY2F0ZXMgZnJvbSBvbmUgY2FsbCB0byB0aGUgbmV4dAorICAgaG93IG11Y2ggb2YgQVJHViBoYXMgYmVlbiBzY2FubmVkIHNvIGZhci4gICovCisKK2V4dGVybiBpbnQgb3B0aW5kOworCisvKiBDYWxsZXJzIHN0b3JlIHplcm8gaGVyZSB0byBpbmhpYml0IHRoZSBlcnJvciBtZXNzYWdlIGBnZXRvcHQnIHByaW50cworICAgZm9yIHVucmVjb2duaXplZCBvcHRpb25zLiAgKi8KKworZXh0ZXJuIGludCBvcHRlcnI7CisKKy8qIFNldCB0byBhbiBvcHRpb24gY2hhcmFjdGVyIHdoaWNoIHdhcyB1bnJlY29nbml6ZWQuICAqLworCitleHRlcm4gaW50IG9wdG9wdDsKKworLyogRGVzY3JpYmUgdGhlIGxvbmctbmFtZWQgb3B0aW9ucyByZXF1ZXN0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgVGhlIExPTkdfT1BUSU9OUyBhcmd1bWVudCB0byBnZXRvcHRfbG9uZyBvciBnZXRvcHRfbG9uZ19vbmx5IGlzIGEgdmVjdG9yCisgICBvZiBgc3RydWN0IG9wdGlvbicgdGVybWluYXRlZCBieSBhbiBlbGVtZW50IGNvbnRhaW5pbmcgYSBuYW1lIHdoaWNoIGlzCisgICB6ZXJvLgorCisgICBUaGUgZmllbGQgYGhhc19hcmcnIGlzOgorICAgbm9fYXJndW1lbnQJCShvciAwKSBpZiB0aGUgb3B0aW9uIGRvZXMgbm90IHRha2UgYW4gYXJndW1lbnQsCisgICByZXF1aXJlZF9hcmd1bWVudAkob3IgMSkgaWYgdGhlIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCwKKyAgIG9wdGlvbmFsX2FyZ3VtZW50IAkob3IgMikgaWYgdGhlIG9wdGlvbiB0YWtlcyBhbiBvcHRpb25hbCBhcmd1bWVudC4KKworICAgSWYgdGhlIGZpZWxkIGBmbGFnJyBpcyBub3QgTlVMTCwgaXQgcG9pbnRzIHRvIGEgdmFyaWFibGUgdGhhdCBpcyBzZXQKKyAgIHRvIHRoZSB2YWx1ZSBnaXZlbiBpbiB0aGUgZmllbGQgYHZhbCcgd2hlbiB0aGUgb3B0aW9uIGlzIGZvdW5kLCBidXQKKyAgIGxlZnQgdW5jaGFuZ2VkIGlmIHRoZSBvcHRpb24gaXMgbm90IGZvdW5kLgorCisgICBUbyBoYXZlIGEgbG9uZy1uYW1lZCBvcHRpb24gZG8gc29tZXRoaW5nIG90aGVyIHRoYW4gc2V0IGFuIGBpbnQnIHRvCisgICBhIGNvbXBpbGVkLWluIGNvbnN0YW50LCBzdWNoIGFzIHNldCBhIHZhbHVlIGZyb20gYG9wdGFyZycsIHNldCB0aGUKKyAgIG9wdGlvbidzIGBmbGFnJyBmaWVsZCB0byB6ZXJvIGFuZCBpdHMgYHZhbCcgZmllbGQgdG8gYSBub256ZXJvCisgICB2YWx1ZSAodGhlIGVxdWl2YWxlbnQgc2luZ2xlLWxldHRlciBvcHRpb24gY2hhcmFjdGVyLCBpZiB0aGVyZSBpcworICAgb25lKS4gIEZvciBsb25nIG9wdGlvbnMgdGhhdCBoYXZlIGEgemVybyBgZmxhZycgZmllbGQsIGBnZXRvcHQnCisgICByZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgYHZhbCcgZmllbGQuICAqLworCitzdHJ1Y3Qgb3B0aW9uCit7CisjaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCisgIGNvbnN0IGNoYXIgKm5hbWU7CisjZWxzZQorICBjaGFyICpuYW1lOworI2VuZGlmCisgIC8qIGhhc19hcmcgY2FuJ3QgYmUgYW4gZW51bSBiZWNhdXNlIHNvbWUgY29tcGlsZXJzIGNvbXBsYWluIGFib3V0CisgICAgIHR5cGUgbWlzbWF0Y2hlcyBpbiBhbGwgdGhlIGNvZGUgdGhhdCBhc3N1bWVzIGl0IGlzIGFuIGludC4gICovCisgIGludCBoYXNfYXJnOworICBpbnQgKmZsYWc7CisgIGludCB2YWw7Cit9OworCisvKiBOYW1lcyBmb3IgdGhlIHZhbHVlcyBvZiB0aGUgYGhhc19hcmcnIGZpZWxkIG9mIGBzdHJ1Y3Qgb3B0aW9uJy4gICovCisKKyNkZWZpbmUJbm9fYXJndW1lbnQJCTAKKyNkZWZpbmUgcmVxdWlyZWRfYXJndW1lbnQJMQorI2RlZmluZSBvcHRpb25hbF9hcmd1bWVudAkyCisKKyNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KKyNpZmRlZiBfX0dOVV9MSUJSQVJZX18KKy8qIE1hbnkgb3RoZXIgbGlicmFyaWVzIGhhdmUgY29uZmxpY3RpbmcgcHJvdG90eXBlcyBmb3IgZ2V0b3B0LCB3aXRoCisgICBkaWZmZXJlbmNlcyBpbiB0aGUgY29uc3RzLCBpbiBzdGRsaWIuaC4gIFRvIGF2b2lkIGNvbXBpbGF0aW9uCisgICBlcnJvcnMsIG9ubHkgcHJvdG90eXBlIGdldG9wdCBmb3IgdGhlIEdOVSBDIGxpYnJhcnkuICAqLworZXh0ZXJuIGludCBnZXRvcHQgKGludCBhcmdjLCBjaGFyICpjb25zdCAqYXJndiwgY29uc3QgY2hhciAqc2hvcnRvcHRzKTsKKyNlbHNlIC8qIG5vdCBfX0dOVV9MSUJSQVJZX18gKi8KK2V4dGVybiBpbnQgZ2V0b3B0ICgpOworI2VuZGlmIC8qIF9fR05VX0xJQlJBUllfXyAqLworZXh0ZXJuIGludCBnZXRvcHRfbG9uZyAoaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2LCBjb25zdCBjaGFyICpzaG9ydG9wdHMsCisJCSAgICAgICAgY29uc3Qgc3RydWN0IG9wdGlvbiAqbG9uZ29wdHMsIGludCAqbG9uZ2luZCk7CitleHRlcm4gaW50IGdldG9wdF9sb25nX29ubHkgKGludCBhcmdjLCBjaGFyICpjb25zdCAqYXJndiwKKwkJCSAgICAgY29uc3QgY2hhciAqc2hvcnRvcHRzLAorCQkgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG9wdGlvbiAqbG9uZ29wdHMsIGludCAqbG9uZ2luZCk7CisKKy8qIEludGVybmFsIG9ubHkuICBVc2VycyBzaG91bGQgbm90IGNhbGwgdGhpcyBkaXJlY3RseS4gICovCitleHRlcm4gaW50IF9nZXRvcHRfaW50ZXJuYWwgKGludCBhcmdjLCBjaGFyICpjb25zdCAqYXJndiwKKwkJCSAgICAgY29uc3QgY2hhciAqc2hvcnRvcHRzLAorCQkgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG9wdGlvbiAqbG9uZ29wdHMsIGludCAqbG9uZ2luZCwKKwkJCSAgICAgaW50IGxvbmdfb25seSk7CisjZWxzZSAvKiBub3QgX19TVERDX18gKi8KK2V4dGVybiBpbnQgZ2V0b3B0ICgpOworZXh0ZXJuIGludCBnZXRvcHRfbG9uZyAoKTsKK2V4dGVybiBpbnQgZ2V0b3B0X2xvbmdfb25seSAoKTsKKworZXh0ZXJuIGludCBfZ2V0b3B0X2ludGVybmFsICgpOworI2VuZGlmIC8qIF9fU1REQ19fICovCisKKyNpZmRlZglfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBnZXRvcHQuaCAqLwpkaWZmIC0tZ2l0IGEvbGliL2dldG9wdDEuYyBiL2xpYi9nZXRvcHQxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyNTczNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nZXRvcHQxLmMKQEAgLTAsMCArMSwxOTAgQEAKKy8qIGdldG9wdF9sb25nIGFuZCBnZXRvcHRfbG9uZ19vbmx5IGVudHJ5IHBvaW50cyBmb3IgR05VIGdldG9wdC4KKyAgIENvcHlyaWdodCAoQykgMTk4Nyw4OCw4OSw5MCw5MSw5Miw5Myw5NCw5Niw5Nyw5OAorICAgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgTk9URTogVGhlIGNhbm9uaWNhbCBzb3VyY2Ugb2YgdGhpcyBmaWxlIGlzIG1haW50YWluZWQgd2l0aCB0aGUgR05VIEMgTGlicmFyeS4KKyAgIEJ1Z3MgY2FuIGJlIHJlcG9ydGVkIHRvIGJ1Zy1nbGliY0BnbnUub3JnLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgICBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKwwKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImdldG9wdC5oIgorCisjaWYgIWRlZmluZWQgX19TVERDX18gfHwgIV9fU1REQ19fCisvKiBUaGlzIGlzIGEgc2VwYXJhdGUgY29uZGl0aW9uYWwgc2luY2Ugc29tZSBzdGRjIHN5c3RlbXMKKyAgIHJlamVjdCBgZGVmaW5lZCAoY29uc3QpJy4gICovCisjaWZuZGVmIGNvbnN0CisjZGVmaW5lIGNvbnN0CisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyogQ29tbWVudCBvdXQgYWxsIHRoaXMgY29kZSBpZiB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIExpYnJhcnksIGFuZCBhcmUgbm90CisgICBhY3R1YWxseSBjb21waWxpbmcgdGhlIGxpYnJhcnkgaXRzZWxmLiAgVGhpcyBjb2RlIGlzIHBhcnQgb2YgdGhlIEdOVSBDCisgICBMaWJyYXJ5LCBidXQgYWxzbyBpbmNsdWRlZCBpbiBtYW55IG90aGVyIEdOVSBkaXN0cmlidXRpb25zLiAgQ29tcGlsaW5nCisgICBhbmQgbGlua2luZyBpbiB0aGlzIGNvZGUgaXMgYSB3YXN0ZSB3aGVuIHVzaW5nIHRoZSBHTlUgQyBsaWJyYXJ5CisgICAoZXNwZWNpYWxseSBpZiBpdCBpcyBhIHNoYXJlZCBsaWJyYXJ5KS4gIFJhdGhlciB0aGFuIGhhdmluZyBldmVyeSBHTlUKKyAgIHByb2dyYW0gdW5kZXJzdGFuZCBgY29uZmlndXJlIC0td2l0aC1nbnUtbGliYycgYW5kIG9taXQgdGhlIG9iamVjdCBmaWxlcywKKyAgIGl0IGlzIHNpbXBsZXIgdG8ganVzdCBkbyB0aGlzIGluIHRoZSBzb3VyY2UgZm9yIGVhY2ggc3VjaCBmaWxlLiAgKi8KKworI2RlZmluZSBHRVRPUFRfSU5URVJGQUNFX1ZFUlNJT04gMgorI2lmICFkZWZpbmVkIF9MSUJDICYmIGRlZmluZWQgX19HTElCQ19fICYmIF9fR0xJQkNfXyA+PSAyCisjaW5jbHVkZSA8Z251LXZlcnNpb25zLmg+CisjaWYgX0dOVV9HRVRPUFRfSU5URVJGQUNFX1ZFUlNJT04gPT0gR0VUT1BUX0lOVEVSRkFDRV9WRVJTSU9OCisjZGVmaW5lIEVMSURFX0NPREUKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRUxJREVfQ09ERQorCisKKy8qIFRoaXMgbmVlZHMgdG8gY29tZSBhZnRlciBzb21lIGxpYnJhcnkgI2luY2x1ZGUKKyAgIHRvIGdldCBfX0dOVV9MSUJSQVJZX18gZGVmaW5lZC4gICovCisjaWZkZWYgX19HTlVfTElCUkFSWV9fCisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2lmbmRlZglOVUxMCisjZGVmaW5lIE5VTEwgMAorI2VuZGlmCisKK2ludAorZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsIG9wdGlvbnMsIGxvbmdfb3B0aW9ucywgb3B0X2luZGV4KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqY29uc3QgKmFyZ3Y7CisgICAgIGNvbnN0IGNoYXIgKm9wdGlvbnM7CisgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKmxvbmdfb3B0aW9uczsKKyAgICAgaW50ICpvcHRfaW5kZXg7Cit7CisgIHJldHVybiBfZ2V0b3B0X2ludGVybmFsIChhcmdjLCBhcmd2LCBvcHRpb25zLCBsb25nX29wdGlvbnMsIG9wdF9pbmRleCwgMCk7Cit9CisKKy8qIExpa2UgZ2V0b3B0X2xvbmcsIGJ1dCAnLScgYXMgd2VsbCBhcyAnLS0nIGNhbiBpbmRpY2F0ZSBhIGxvbmcgb3B0aW9uLgorICAgSWYgYW4gb3B0aW9uIHRoYXQgc3RhcnRzIHdpdGggJy0nIChub3QgJy0tJykgZG9lc24ndCBtYXRjaCBhIGxvbmcgb3B0aW9uLAorICAgYnV0IGRvZXMgbWF0Y2ggYSBzaG9ydCBvcHRpb24sIGl0IGlzIHBhcnNlZCBhcyBhIHNob3J0IG9wdGlvbgorICAgaW5zdGVhZC4gICovCisKK2ludAorZ2V0b3B0X2xvbmdfb25seSAoYXJnYywgYXJndiwgb3B0aW9ucywgbG9uZ19vcHRpb25zLCBvcHRfaW5kZXgpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICpjb25zdCAqYXJndjsKKyAgICAgY29uc3QgY2hhciAqb3B0aW9uczsKKyAgICAgY29uc3Qgc3RydWN0IG9wdGlvbiAqbG9uZ19vcHRpb25zOworICAgICBpbnQgKm9wdF9pbmRleDsKK3sKKyAgcmV0dXJuIF9nZXRvcHRfaW50ZXJuYWwgKGFyZ2MsIGFyZ3YsIG9wdGlvbnMsIGxvbmdfb3B0aW9ucywgb3B0X2luZGV4LCAxKTsKK30KKworCisjZW5kaWYJLyogTm90IEVMSURFX0NPREUuICAqLworDAorI2lmZGVmIFRFU1QKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludAorbWFpbiAoYXJnYywgYXJndikKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKiphcmd2OworeworICBpbnQgYzsKKyAgaW50IGRpZ2l0X29wdGluZCA9IDA7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaW50IHRoaXNfb3B0aW9uX29wdGluZCA9IG9wdGluZCA/IG9wdGluZCA6IDE7CisgICAgICBpbnQgb3B0aW9uX2luZGV4ID0gMDsKKyAgICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KKyAgICAgIHsKKwl7ImFkZCIsIDEsIDAsIDB9LAorCXsiYXBwZW5kIiwgMCwgMCwgMH0sCisJeyJkZWxldGUiLCAxLCAwLCAwfSwKKwl7InZlcmJvc2UiLCAwLCAwLCAwfSwKKwl7ImNyZWF0ZSIsIDAsIDAsIDB9LAorCXsiZmlsZSIsIDEsIDAsIDB9LAorCXswLCAwLCAwLCAwfQorICAgICAgfTsKKworICAgICAgYyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiYWJjOmQ6MDEyMzQ1Njc4OSIsCisJCSAgICAgICBsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpOworICAgICAgaWYgKGMgPT0gLTEpCisJYnJlYWs7CisKKyAgICAgIHN3aXRjaCAoYykKKwl7CisJY2FzZSAwOgorCSAgcHJpbnRmICgib3B0aW9uICVzIiwgbG9uZ19vcHRpb25zW29wdGlvbl9pbmRleF0ubmFtZSk7CisJICBpZiAob3B0YXJnKQorCSAgICBwcmludGYgKCIgd2l0aCBhcmcgJXMiLCBvcHRhcmcpOworCSAgcHJpbnRmICgiXG4iKTsKKwkgIGJyZWFrOworCisJY2FzZSAnMCc6CisJY2FzZSAnMSc6CisJY2FzZSAnMic6CisJY2FzZSAnMyc6CisJY2FzZSAnNCc6CisJY2FzZSAnNSc6CisJY2FzZSAnNic6CisJY2FzZSAnNyc6CisJY2FzZSAnOCc6CisJY2FzZSAnOSc6CisJICBpZiAoZGlnaXRfb3B0aW5kICE9IDAgJiYgZGlnaXRfb3B0aW5kICE9IHRoaXNfb3B0aW9uX29wdGluZCkKKwkgICAgcHJpbnRmICgiZGlnaXRzIG9jY3VyIGluIHR3byBkaWZmZXJlbnQgYXJndi1lbGVtZW50cy5cbiIpOworCSAgZGlnaXRfb3B0aW5kID0gdGhpc19vcHRpb25fb3B0aW5kOworCSAgcHJpbnRmICgib3B0aW9uICVjXG4iLCBjKTsKKwkgIGJyZWFrOworCisJY2FzZSAnYSc6CisJICBwcmludGYgKCJvcHRpb24gYVxuIik7CisJICBicmVhazsKKworCWNhc2UgJ2InOgorCSAgcHJpbnRmICgib3B0aW9uIGJcbiIpOworCSAgYnJlYWs7CisKKwljYXNlICdjJzoKKwkgIHByaW50ZiAoIm9wdGlvbiBjIHdpdGggdmFsdWUgYCVzJ1xuIiwgb3B0YXJnKTsKKwkgIGJyZWFrOworCisJY2FzZSAnZCc6CisJICBwcmludGYgKCJvcHRpb24gZCB3aXRoIHZhbHVlIGAlcydcbiIsIG9wdGFyZyk7CisJICBicmVhazsKKworCWNhc2UgJz8nOgorCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgcHJpbnRmICgiPz8gZ2V0b3B0IHJldHVybmVkIGNoYXJhY3RlciBjb2RlIDAlbyA/P1xuIiwgYyk7CisJfQorICAgIH0KKworICBpZiAob3B0aW5kIDwgYXJnYykKKyAgICB7CisgICAgICBwcmludGYgKCJub24tb3B0aW9uIEFSR1YtZWxlbWVudHM6ICIpOworICAgICAgd2hpbGUgKG9wdGluZCA8IGFyZ2MpCisJcHJpbnRmICgiJXMgIiwgYXJndltvcHRpbmQrK10pOworICAgICAgcHJpbnRmICgiXG4iKTsKKyAgICB9CisKKyAgZXhpdCAoMCk7Cit9CisKKyNlbmRpZiAvKiBURVNUICovCmRpZmYgLS1naXQgYS9taXNzaW5nIGIvbWlzc2luZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NGI1ZjkwCi0tLSAvZGV2L251bGwKKysrIGIvbWlzc2luZwpAQCAtMCwwICsxLDM1MyBAQAorIyEgL2Jpbi9zaAorIyBDb21tb24gc3R1YiBmb3IgYSBmZXcgbWlzc2luZyBHTlUgcHJvZ3JhbXMgd2hpbGUgaW5zdGFsbGluZy4KKworc2NyaXB0dmVyc2lvbj0yMDA0LTA5LTA3LjA4CisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk5LCAyMDAwLCAyMDAyLCAyMDAzLCAyMDA0CisjICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIE9yaWdpbmFsbHkgYnkgRnJhbixjb2lzIFBpbmFyZCA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+LCAxOTk2LgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyMgMDIxMTEtMTMwNywgVVNBLgorCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworaWYgdGVzdCAkIyAtZXEgMDsgdGhlbgorICBlY2hvIDE+JjIgIlRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24iCisgIGV4aXQgMQorZmkKKworcnVuPToKKworIyBJbiB0aGUgY2FzZXMgd2hlcmUgdGhpcyBtYXR0ZXJzLCBgbWlzc2luZycgaXMgYmVpbmcgcnVuIGluIHRoZQorIyBzcmNkaXIgYWxyZWFkeS4KK2lmIHRlc3QgLWYgY29uZmlndXJlLmFjOyB0aGVuCisgIGNvbmZpZ3VyZV9hYz1jb25maWd1cmUuYWMKK2Vsc2UKKyAgY29uZmlndXJlX2FjPWNvbmZpZ3VyZS5pbgorZmkKKworbXNnPSJtaXNzaW5nIG9uIHlvdXIgc3lzdGVtIgorCitjYXNlICIkMSIgaW4KKy0tcnVuKQorICAjIFRyeSB0byBydW4gcmVxdWVzdGVkIHByb2dyYW0sIGFuZCBqdXN0IGV4aXQgaWYgaXQgc3VjY2VlZHMuCisgIHJ1bj0KKyAgc2hpZnQKKyAgIiRAIiAmJiBleGl0IDAKKyAgIyBFeGl0IGNvZGUgNjMgbWVhbnMgdmVyc2lvbiBtaXNtYXRjaC4gIFRoaXMgb2Z0ZW4gaGFwcGVucworICAjIHdoZW4gdGhlIHVzZXIgdHJ5IHRvIHVzZSBhbiBhbmNpZW50IHZlcnNpb24gb2YgYSB0b29sIG9uCisgICMgYSBmaWxlIHRoYXQgcmVxdWlyZXMgYSBtaW5pbXVtIHZlcnNpb24uICBJbiB0aGlzIGNhc2Ugd2UKKyAgIyB3ZSBzaG91bGQgcHJvY2VlZCBoYXMgaWYgdGhlIHByb2dyYW0gaGFkIGJlZW4gYWJzZW50LCBvcgorICAjIGlmIC0tcnVuIGhhZG4ndCBiZWVuIHBhc3NlZC4KKyAgaWYgdGVzdCAkPyA9IDYzOyB0aGVuCisgICAgcnVuPToKKyAgICBtc2c9InByb2JhYmx5IHRvbyBvbGQiCisgIGZpCisgIDs7CisKKyAgLWh8LS1ofC0taGV8LS1oZWx8LS1oZWxwKQorICAgIGVjaG8gIlwKKyQwIFtPUFRJT05dLi4uIFBST0dSQU0gW0FSR1VNRU5UXS4uLgorCitIYW5kbGUgXGBQUk9HUkFNIFtBUkdVTUVOVF0uLi4nIGZvciB3aGVuIFBST0dSQU0gaXMgbWlzc2luZywgb3IgcmV0dXJuIGFuCitlcnJvciBzdGF0dXMgaWYgdGhlcmUgaXMgbm8ga25vd24gaGFuZGxpbmcgZm9yIFBST0dSQU0uCisKK09wdGlvbnM6CisgIC1oLCAtLWhlbHAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAorICAtdiwgLS12ZXJzaW9uICAgb3V0cHV0IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKyAgLS1ydW4gICAgICAgICAgIHRyeSB0byBydW4gdGhlIGdpdmVuIGNvbW1hbmQsIGFuZCBlbXVsYXRlIGl0IGlmIGl0IGZhaWxzCisKK1N1cHBvcnRlZCBQUk9HUkFNIHZhbHVlczoKKyAgYWNsb2NhbCAgICAgIHRvdWNoIGZpbGUgXGBhY2xvY2FsLm00JworICBhdXRvY29uZiAgICAgdG91Y2ggZmlsZSBcYGNvbmZpZ3VyZScKKyAgYXV0b2hlYWRlciAgIHRvdWNoIGZpbGUgXGBjb25maWcuaC5pbicKKyAgYXV0b21ha2UgICAgIHRvdWNoIGFsbCBcYE1ha2VmaWxlLmluJyBmaWxlcworICBiaXNvbiAgICAgICAgY3JlYXRlIFxgeS50YWIuW2NoXScsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5bY2hdCisgIGZsZXggICAgICAgICBjcmVhdGUgXGBsZXgueXkuYycsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5jCisgIGhlbHAybWFuICAgICB0b3VjaCB0aGUgb3V0cHV0IGZpbGUKKyAgbGV4ICAgICAgICAgIGNyZWF0ZSBcYGxleC55eS5jJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLmMKKyAgbWFrZWluZm8gICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZQorICB0YXIgICAgICAgICAgdHJ5IHRhciwgZ251dGFyLCBndGFyLCB0aGVuIHRhciB3aXRob3V0IG5vbi1wb3J0YWJsZSBmbGFncworICB5YWNjICAgICAgICAgY3JlYXRlIFxgeS50YWIuW2NoXScsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5bY2hdCisKK1NlbmQgYnVnIHJlcG9ydHMgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPi4iCisgICAgZXhpdCAwCisgICAgOzsKKworICAtdnwtLXZ8LS12ZXwtLXZlcnwtLXZlcnN8LS12ZXJzaXwtLXZlcnNpb3wtLXZlcnNpb24pCisgICAgZWNobyAibWlzc2luZyAkc2NyaXB0dmVyc2lvbiAoR05VIEF1dG9tYWtlKSIKKyAgICBleGl0IDAKKyAgICA7OworCisgIC0qKQorICAgIGVjaG8gMT4mMiAiJDA6IFVua25vd24gXGAkMScgb3B0aW9uIgorICAgIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKKyAgICBleGl0IDEKKyAgICA7OworCitlc2FjCisKKyMgTm93IGV4aXQgaWYgd2UgaGF2ZSBpdCwgYnV0IGl0IGZhaWxlZC4gIEFsc28gZXhpdCBub3cgaWYgd2UKKyMgZG9uJ3QgaGF2ZSBpdCBhbmQgLS12ZXJzaW9uIHdhcyBwYXNzZWQgKG1vc3QgbGlrZWx5IHRvIGRldGVjdAorIyB0aGUgcHJvZ3JhbSkuCitjYXNlICIkMSIgaW4KKyAgbGV4fHlhY2MpCisgICAgIyBOb3QgR05VIHByb2dyYW1zLCB0aGV5IGRvbid0IGhhdmUgLS12ZXJzaW9uLgorICAgIDs7CisKKyAgdGFyKQorICAgIGlmIHRlc3QgLW4gIiRydW4iOyB0aGVuCisgICAgICAgZWNobyAxPiYyICJFUlJPUjogXGB0YXInIHJlcXVpcmVzIC0tcnVuIgorICAgICAgIGV4aXQgMQorICAgIGVsaWYgdGVzdCAieCQyIiA9ICJ4LS12ZXJzaW9uIiB8fCB0ZXN0ICJ4JDIiID0gIngtLWhlbHAiOyB0aGVuCisgICAgICAgZXhpdCAxCisgICAgZmkKKyAgICA7OworCisgICopCisgICAgaWYgdGVzdCAteiAiJHJ1biIgJiYgKCQxIC0tdmVyc2lvbikgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgICMgV2UgaGF2ZSBpdCwgYnV0IGl0IGZhaWxlZC4KKyAgICAgICBleGl0IDEKKyAgICBlbGlmIHRlc3QgIngkMiIgPSAieC0tdmVyc2lvbiIgfHwgdGVzdCAieCQyIiA9ICJ4LS1oZWxwIjsgdGhlbgorICAgICAgICMgQ291bGQgbm90IHJ1biAtLXZlcnNpb24gb3IgLS1oZWxwLiAgVGhpcyBpcyBwcm9iYWJseSBzb21lb25lCisgICAgICAgIyBydW5uaW5nIGAkVE9PTCAtLXZlcnNpb24nIG9yIGAkVE9PTCAtLWhlbHAnIHRvIGNoZWNrIHdoZXRoZXIKKyAgICAgICAjICRUT09MIGV4aXN0cyBhbmQgbm90IGtub3dpbmcgJFRPT0wgdXNlcyBtaXNzaW5nLgorICAgICAgIGV4aXQgMQorICAgIGZpCisgICAgOzsKK2VzYWMKKworIyBJZiBpdCBkb2VzIG5vdCBleGlzdCwgb3IgZmFpbHMgdG8gcnVuIChwb3NzaWJseSBhbiBvdXRkYXRlZCB2ZXJzaW9uKSwKKyMgdHJ5IHRvIGVtdWxhdGUgaXQuCitjYXNlICIkMSIgaW4KKyAgYWNsb2NhbCopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjaW5jbHVkZS5tNCcgb3IgXGAke2NvbmZpZ3VyZV9hY30nLiAgWW91IG1pZ2h0IHdhbnQKKyAgICAgICAgIHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20KKyAgICAgICAgIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICB0b3VjaCBhY2xvY2FsLm00CisgICAgOzsKKworICBhdXRvY29uZikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlCisgICAgICAgICBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20gYW55IEdOVQorICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKKyAgICB0b3VjaCBjb25maWd1cmUKKyAgICA7OworCisgIGF1dG9oZWFkZXIpCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjY29uZmlnLmgnIG9yIFxgJHtjb25maWd1cmVfYWN9Jy4gIFlvdSBtaWdodCB3YW50CisgICAgICAgICB0byBpbnN0YWxsIHRoZSBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtCisgICAgICAgICBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICBmaWxlcz1gc2VkIC1uICdzL15bIF0qQVtDTV1fQ09ORklHX0hFQURFUihcKFteKV0qXCkpLiovXDEvcCcgJHtjb25maWd1cmVfYWN9YAorICAgIHRlc3QgLXogIiRmaWxlcyIgJiYgZmlsZXM9ImNvbmZpZy5oIgorICAgIHRvdWNoX2ZpbGVzPQorICAgIGZvciBmIGluICRmaWxlczsgZG8KKyAgICAgIGNhc2UgIiRmIiBpbgorICAgICAgKjoqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICJgZWNobyAiJGYiIHwKKwkJCQkgICAgICAgc2VkIC1lICdzL15bXjpdKjovLycgLWUgJ3MvOi4qLy8nYDs7CisgICAgICAqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICRmLmluIjs7CisgICAgICBlc2FjCisgICAgZG9uZQorICAgIHRvdWNoICR0b3VjaF9maWxlcworICAgIDs7CisKKyAgYXV0b21ha2UqKQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisgICAgICAgICB5b3UgbW9kaWZpZWQgXGBNYWtlZmlsZS5hbScsIFxgYWNpbmNsdWRlLm00JyBvciBcYCR7Y29uZmlndXJlX2FjfScuCisgICAgICAgICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZSBcYEF1dG9tYWtlJyBhbmQgXGBQZXJsJyBwYWNrYWdlcy4KKyAgICAgICAgIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICBmaW5kIC4gLXR5cGUgZiAtbmFtZSBNYWtlZmlsZS5hbSAtcHJpbnQgfAorCSAgIHNlZCAncy9cLmFtJC8uaW4vJyB8CisJICAgd2hpbGUgcmVhZCBmOyBkbyB0b3VjaCAiJGYiOyBkb25lCisgICAgOzsKKworICBhdXRvbTR0ZSkKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzIG5lZWRlZCwgYnV0IGlzICRtc2cuCisgICAgICAgICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQorICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uCisgICAgICAgICBZb3UgY2FuIGdldCBcYCQxJyBhcyBwYXJ0IG9mIFxgQXV0b2NvbmYnIGZyb20gYW55IEdOVQorICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKKworICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi0tb3V0cHV0WyA9XSpcKFteIF0qXCkuKi9cMS9wJ2AKKyAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICdzLy4qLW9bIF0qXChbXiBdKlwpLiovXDEvcCdgCisgICAgaWYgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCisJdG91Y2ggJGZpbGUKKyAgICBlbHNlCisJdGVzdCAteiAiJGZpbGUiIHx8IGV4ZWMgPiRmaWxlCisJZWNobyAiIyEgL2Jpbi9zaCIKKwllY2hvICIjIENyZWF0ZWQgYnkgR05VIEF1dG9tYWtlIG1pc3NpbmcgYXMgYSByZXBsYWNlbWVudCBvZiIKKwllY2hvICIjICAkICRAIgorCWVjaG8gImV4aXQgMCIKKwljaG1vZCAreCAkZmlsZQorCWV4aXQgMQorICAgIGZpCisgICAgOzsKKworICBiaXNvbnx5YWNjKQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisgICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC55JyBmaWxlLiAgWW91IG1heSBuZWVkIHRoZSBcYEJpc29uJyBwYWNrYWdlCisgICAgICAgICBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlIGVmZmVjdC4gIFlvdSBjYW4gZ2V0CisgICAgICAgICBcYEJpc29uJyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICBybSAtZiB5LnRhYi5jIHkudGFiLmgKKyAgICBpZiBbICQjIC1uZSAxIF07IHRoZW4KKyAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCisJY2FzZSAiJExBU1RBUkciIGluCisJKi55KQorCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MveSQvYy8nYAorCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgorCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuYworCSAgICBmaQorCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MveSQvaC8nYAorCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgorCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuaAorCSAgICBmaQorCSAgOzsKKwllc2FjCisgICAgZmkKKyAgICBpZiBbICEgLWYgeS50YWIuaCBdOyB0aGVuCisJZWNobyA+eS50YWIuaAorICAgIGZpCisgICAgaWYgWyAhIC1mIHkudGFiLmMgXTsgdGhlbgorCWVjaG8gJ21haW4oKSB7IHJldHVybiAwOyB9JyA+eS50YWIuYworICAgIGZpCisgICAgOzsKKworICBsZXh8ZmxleCkKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAubCcgZmlsZS4gIFlvdSBtYXkgbmVlZCB0aGUgXGBGbGV4JyBwYWNrYWdlCisgICAgICAgICBpbiBvcmRlciBmb3IgdGhvc2UgbW9kaWZpY2F0aW9ucyB0byB0YWtlIGVmZmVjdC4gIFlvdSBjYW4gZ2V0CisgICAgICAgICBcYEZsZXgnIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIHJtIC1mIGxleC55eS5jCisgICAgaWYgWyAkIyAtbmUgMSBdOyB0aGVuCisgICAgICAgIGV2YWwgTEFTVEFSRz0iXCR7JCN9IgorCWNhc2UgIiRMQVNUQVJHIiBpbgorCSoubCkKKwkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL2wkL2MvJ2AKKwkgICAgaWYgWyAtZiAiJFNSQ0ZJTEUiIF07IHRoZW4KKwkgICAgICAgICBjcCAiJFNSQ0ZJTEUiIGxleC55eS5jCisJICAgIGZpCisJICA7OworCWVzYWMKKyAgICBmaQorICAgIGlmIFsgISAtZiBsZXgueXkuYyBdOyB0aGVuCisJZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID5sZXgueXkuYworICAgIGZpCisgICAgOzsKKworICBoZWxwMm1hbikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorCSB5b3UgbW9kaWZpZWQgYSBkZXBlbmRlbmN5IG9mIGEgbWFudWFsIHBhZ2UuICBZb3UgbWF5IG5lZWQgdGhlCisJIFxgSGVscDJtYW4nIHBhY2thZ2UgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZQorCSBlZmZlY3QuICBZb3UgY2FuIGdldCBcYEhlbHAybWFuJyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKworICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi1vIFwoW14gXSpcKS4qL1wxL3AnYAorICAgIGlmIHRlc3QgLXogIiRmaWxlIjsgdGhlbgorCWZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi0tb3V0cHV0PVwoW14gXSpcKS4qL1wxL3AnYAorICAgIGZpCisgICAgaWYgWyAtZiAiJGZpbGUiIF07IHRoZW4KKwl0b3VjaCAkZmlsZQorICAgIGVsc2UKKwl0ZXN0IC16ICIkZmlsZSIgfHwgZXhlYyA+JGZpbGUKKwllY2hvICIuYWIgaGVscDJtYW4gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhpcyBwYWdlIgorCWV4aXQgMQorICAgIGZpCisgICAgOzsKKworICBtYWtlaW5mbykKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIGEgXGAudGV4aScgb3IgXGAudGV4aW5mbycgZmlsZSwgb3IgYW55IG90aGVyIGZpbGUKKyAgICAgICAgIGluZGlyZWN0bHkgYWZmZWN0aW5nIHRoZSBhc3BlY3Qgb2YgdGhlIG1hbnVhbC4gIFRoZSBzcHVyaW91cworICAgICAgICAgY2FsbCBtaWdodCBhbHNvIGJlIHRoZSBjb25zZXF1ZW5jZSBvZiB1c2luZyBhIGJ1Z2d5IFxgbWFrZScgKEFJWCwKKyAgICAgICAgIERVLCBJUklYKS4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgVGV4aW5mbycgcGFja2FnZSBvcgorICAgICAgICAgdGhlIFxgR05VIG1ha2UnIHBhY2thZ2UuICBHcmFiIGVpdGhlciBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gJ3MvLiotbyBcKFteIF0qXCkuKi9cMS9wJ2AKKyAgICBpZiB0ZXN0IC16ICIkZmlsZSI7IHRoZW4KKyAgICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAncy8uKiBcKFteIF0qXCkgKiQvXDEvJ2AKKyAgICAgIGZpbGU9YHNlZCAtbiAnL15Ac2V0ZmlsZW5hbWUvIHsgcy8uKiBcKFteIF0qXCkgKiQvXDEvOyBwOyBxOyB9JyAkZmlsZWAKKyAgICBmaQorICAgIHRvdWNoICRmaWxlCisgICAgOzsKKworICB0YXIpCisgICAgc2hpZnQKKworICAgICMgV2UgaGF2ZSBhbHJlYWR5IHRyaWVkIHRhciBpbiB0aGUgZ2VuZXJpYyBwYXJ0LgorICAgICMgTG9vayBmb3IgZ251dGFyL2d0YXIgYmVmb3JlIGludm9jYXRpb24gdG8gYXZvaWQgdWdseSBlcnJvcgorICAgICMgbWVzc2FnZXMuCisgICAgaWYgKGdudXRhciAtLXZlcnNpb24gPiAvZGV2L251bGwgMj4mMSk7IHRoZW4KKyAgICAgICBnbnV0YXIgIiRAIiAmJiBleGl0IDAKKyAgICBmaQorICAgIGlmIChndGFyIC0tdmVyc2lvbiA+IC9kZXYvbnVsbCAyPiYxKTsgdGhlbgorICAgICAgIGd0YXIgIiRAIiAmJiBleGl0IDAKKyAgICBmaQorICAgIGZpcnN0YXJnPSIkMSIKKyAgICBpZiBzaGlmdDsgdGhlbgorCWNhc2UgIiRmaXJzdGFyZyIgaW4KKwkqbyopCisJICAgIGZpcnN0YXJnPWBlY2hvICIkZmlyc3RhcmciIHwgc2VkIHMvby8vYAorCSAgICB0YXIgIiRmaXJzdGFyZyIgIiRAIiAmJiBleGl0IDAKKwkgICAgOzsKKwllc2FjCisJY2FzZSAiJGZpcnN0YXJnIiBpbgorCSpoKikKKwkgICAgZmlyc3Rhcmc9YGVjaG8gIiRmaXJzdGFyZyIgfCBzZWQgcy9oLy9gCisJICAgIHRhciAiJGZpcnN0YXJnIiAiJEAiICYmIGV4aXQgMAorCSAgICA7OworCWVzYWMKKyAgICBmaQorCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBJIGNhbid0IHNlZW0gdG8gYmUgYWJsZSB0byBydW4gXGB0YXInIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4KKyAgICAgICAgIFlvdSBtYXkgd2FudCB0byBpbnN0YWxsIEdOVSB0YXIgb3IgRnJlZSBwYXh1dGlscywgb3IgY2hlY2sgdGhlCisgICAgICAgICBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiIKKyAgICBleGl0IDEKKyAgICA7OworCisgICopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyBuZWVkZWQsIGFuZCBpcyAkbXNnLgorICAgICAgICAgWW91IG1pZ2h0IGhhdmUgbW9kaWZpZWQgc29tZSBmaWxlcyB3aXRob3V0IGhhdmluZyB0aGUKKyAgICAgICAgIHByb3BlciB0b29scyBmb3IgZnVydGhlciBoYW5kbGluZyB0aGVtLiAgQ2hlY2sgdGhlIFxgUkVBRE1FJyBmaWxlLAorICAgICAgICAgaXQgb2Z0ZW4gdGVsbHMgeW91IGFib3V0IHRoZSBuZWVkZWQgcHJlcmVxdWlzaXRlcyBmb3IgaW5zdGFsbGluZworICAgICAgICAgdGhpcyBwYWNrYWdlLiAgWW91IG1heSBhbHNvIHBlZWsgYXQgYW55IEdOVSBhcmNoaXZlIHNpdGUsIGluIGNhc2UKKyAgICAgICAgIHNvbWUgb3RoZXIgcGFja2FnZSB3b3VsZCBjb250YWluIHRoaXMgbWlzc2luZyBcYCQxJyBwcm9ncmFtLiIKKyAgICBleGl0IDEKKyAgICA7OworZXNhYworCitleGl0IDAKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC1lbmQ6ICIkIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9ta2luc3RhbGxkaXJzIGIvbWtpbnN0YWxsZGlycwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZmJlNWUxCi0tLSAvZGV2L251bGwKKysrIGIvbWtpbnN0YWxsZGlycwpAQCAtMCwwICsxLDE1MCBAQAorIyEgL2Jpbi9zaAorIyBta2luc3RhbGxkaXJzIC0tLSBtYWtlIGRpcmVjdG9yeSBoaWVyYXJjaHkKKworc2NyaXB0dmVyc2lvbj0yMDA0LTAyLTE1LjIwCisKKyMgT3JpZ2luYWwgYXV0aG9yOiBOb2FoIEZyaWVkbWFuIDxmcmllZG1hbkBwcmVwLmFpLm1pdC5lZHU+CisjIENyZWF0ZWQ6IDE5OTMtMDUtMTYKKyMgUHVibGljIGRvbWFpbi4KKyMKKyMgVGhpcyBmaWxlIGlzIG1haW50YWluZWQgaW4gQXV0b21ha2UsIHBsZWFzZSByZXBvcnQKKyMgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+IG9yIHNlbmQgcGF0Y2hlcyB0bworIyA8YXV0b21ha2UtcGF0Y2hlc0BnbnUub3JnPi4KKworZXJyc3RhdHVzPTAKK2Rpcm1vZGU9IiIKKwordXNhZ2U9IlwKK1VzYWdlOiBta2luc3RhbGxkaXJzIFstaF0gWy0taGVscF0gWy0tdmVyc2lvbl0gWy1tIE1PREVdIERJUiAuLi4KKworQ3JlYXRlIGVhY2ggZGlyZWN0b3J5IERJUiAod2l0aCBtb2RlIE1PREUsIGlmIHNwZWNpZmllZCksIGluY2x1ZGluZyBhbGwKK2xlYWRpbmcgZmlsZSBuYW1lIGNvbXBvbmVudHMuCisKK1JlcG9ydCBidWdzIHRvIDxidWctYXV0b21ha2VAZ251Lm9yZz4uIgorCisjIHByb2Nlc3MgY29tbWFuZCBsaW5lIGFyZ3VtZW50cword2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtaCB8IC0taGVscCB8IC0taCopICAgICAgICAgIyAtaCBmb3IgaGVscAorICAgICAgZWNobyAiJHVzYWdlIgorICAgICAgZXhpdCAwCisgICAgICA7OworICAgIC1tKSAgICAgICAgICAgICAgICAgICAgICAgICAjIC1tIFBFUk0gYXJnCisgICAgICBzaGlmdAorICAgICAgdGVzdCAkIyAtZXEgMCAmJiB7IGVjaG8gIiR1c2FnZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgICBkaXJtb2RlPSQxCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAtLXZlcnNpb24pCisgICAgICBlY2hvICIkMCAkc2NyaXB0dmVyc2lvbiIKKyAgICAgIGV4aXQgMAorICAgICAgOzsKKyAgICAtLSkgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgICBzaGlmdAorICAgICAgYnJlYWsKKyAgICAgIDs7CisgICAgLSopICAgICAgICAgICAgICAgICAgICAgICAgICMgdW5rbm93biBvcHRpb24KKyAgICAgIGVjaG8gIiR1c2FnZSIgMT4mMgorICAgICAgZXhpdCAxCisgICAgICA7OworICAgICopICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZpcnN0IG5vbi1vcHQgYXJnCisgICAgICBicmVhaworICAgICAgOzsKKyAgZXNhYworZG9uZQorCitmb3IgZmlsZQorZG8KKyAgaWYgdGVzdCAtZCAiJGZpbGUiOyB0aGVuCisgICAgc2hpZnQKKyAgZWxzZQorICAgIGJyZWFrCisgIGZpCitkb25lCisKK2Nhc2UgJCMgaW4KKyAgMCkgZXhpdCAwIDs7Citlc2FjCisKKyMgU29sYXJpcyA4J3MgbWtkaXIgLXAgaXNuJ3QgdGhyZWFkLXNhZmUuICBJZiB5b3UgbWtkaXIgLXAgYS9iIGFuZAorIyBta2RpciAtcCBhL2MgYXQgdGhlIHNhbWUgdGltZSwgYm90aCB3aWxsIGRldGVjdCB0aGF0IGEgaXMgbWlzc2luZywKKyMgb25lIHdpbGwgY3JlYXRlIGEsIHRoZW4gdGhlIG90aGVyIHdpbGwgdHJ5IHRvIGNyZWF0ZSBhIGFuZCBkaWUgd2l0aAorIyBhICJGaWxlIGV4aXN0cyIgZXJyb3IuICBUaGlzIGlzIGEgcHJvYmxlbSB3aGVuIGNhbGxpbmcgbWtpbnN0YWxsZGlycworIyBmcm9tIGEgcGFyYWxsZWwgbWFrZS4gIFdlIHVzZSAtLXZlcnNpb24gaW4gdGhlIHByb2JlIHRvIHJlc3RyaWN0CisjIG91cnNlbHZlcyB0byBHTlUgbWtkaXIsIHdoaWNoIGlzIHRocmVhZC1zYWZlLgorY2FzZSAkZGlybW9kZSBpbgorICAnJykKKyAgICBpZiBta2RpciAtcCAtLXZlcnNpb24gLiA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAhIC1kIC4vLS12ZXJzaW9uOyB0aGVuCisgICAgICBlY2hvICJta2RpciAtcCAtLSAkKiIKKyAgICAgIGV4ZWMgbWtkaXIgLXAgLS0gIiRAIgorICAgIGVsc2UKKyAgICAgICMgT24gTmV4dFN0ZXAgYW5kIE9wZW5TdGVwLCB0aGUgYG1rZGlyJyBjb21tYW5kIGRvZXMgbm90CisgICAgICAjIHJlY29nbml6ZSBhbnkgb3B0aW9uLiAgSXQgd2lsbCBpbnRlcnByZXQgYWxsIG9wdGlvbnMgYXMKKyAgICAgICMgZGlyZWN0b3JpZXMgdG8gY3JlYXRlLCBhbmQgdGhlbiBhYm9ydCBiZWNhdXNlIGAuJyBhbHJlYWR5CisgICAgICAjIGV4aXN0cy4KKyAgICAgIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCisgICAgICB0ZXN0IC1kIC4vLS12ZXJzaW9uICYmIHJtZGlyIC4vLS12ZXJzaW9uCisgICAgZmkKKyAgICA7OworICAqKQorICAgIGlmIG1rZGlyIC1tICIkZGlybW9kZSIgLXAgLS12ZXJzaW9uIC4gPi9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgdGVzdCAhIC1kIC4vLS12ZXJzaW9uOyB0aGVuCisgICAgICBlY2hvICJta2RpciAtbSAkZGlybW9kZSAtcCAtLSAkKiIKKyAgICAgIGV4ZWMgbWtkaXIgLW0gIiRkaXJtb2RlIiAtcCAtLSAiJEAiCisgICAgZWxzZQorICAgICAgIyBDbGVhbiB1cCBhZnRlciBOZXh0U3RlcCBhbmQgT3BlblN0ZXAgbWtkaXIuCisgICAgICBmb3IgZCBpbiAuLy1tIC4vLXAgLi8tLXZlcnNpb24gIi4vJGRpcm1vZGUiOworICAgICAgZG8KKyAgICAgICAgdGVzdCAtZCAkZCAmJiBybWRpciAkZAorICAgICAgZG9uZQorICAgIGZpCisgICAgOzsKK2VzYWMKKworZm9yIGZpbGUKK2RvCisgIHNldCBmbm9yZCBgZWNobyAiOiRmaWxlIiB8IHNlZCAtbmUgJ3MvXjpcLy8jLztzL146Ly87cy9cLy8gL2c7cy9eIy9cLy87cCdgCisgIHNoaWZ0CisKKyAgcGF0aGNvbXA9CisgIGZvciBkCisgIGRvCisgICAgcGF0aGNvbXA9IiRwYXRoY29tcCRkIgorICAgIGNhc2UgJHBhdGhjb21wIGluCisgICAgICAtKikgcGF0aGNvbXA9Li8kcGF0aGNvbXAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0ICEgLWQgIiRwYXRoY29tcCI7IHRoZW4KKyAgICAgIGVjaG8gIm1rZGlyICRwYXRoY29tcCIKKworICAgICAgbWtkaXIgIiRwYXRoY29tcCIgfHwgbGFzdGVycj0kPworCisgICAgICBpZiB0ZXN0ICEgLWQgIiRwYXRoY29tcCI7IHRoZW4KKwllcnJzdGF0dXM9JGxhc3RlcnIKKyAgICAgIGVsc2UKKwlpZiB0ZXN0ICEgLXogIiRkaXJtb2RlIjsgdGhlbgorCSAgZWNobyAiY2htb2QgJGRpcm1vZGUgJHBhdGhjb21wIgorCSAgbGFzdGVycj0iIgorCSAgY2htb2QgIiRkaXJtb2RlIiAiJHBhdGhjb21wIiB8fCBsYXN0ZXJyPSQ/CisKKwkgIGlmIHRlc3QgISAteiAiJGxhc3RlcnIiOyB0aGVuCisJICAgIGVycnN0YXR1cz0kbGFzdGVycgorCSAgZmkKKwlmaQorICAgICAgZmkKKyAgICBmaQorCisgICAgcGF0aGNvbXA9IiRwYXRoY29tcC8iCisgIGRvbmUKK2RvbmUKKworZXhpdCAkZXJyc3RhdHVzCisKKyMgTG9jYWwgVmFyaWFibGVzOgorIyBtb2RlOiBzaGVsbC1zY3JpcHQKKyMgc2gtaW5kZW50YXRpb246IDIKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgorIyB0aW1lLXN0YW1wLWVuZDogIiQiCisjIEVuZDoKZGlmZiAtLWdpdCBhL25ldGJvb3QvM2M1MDkuYyBiL25ldGJvb3QvM2M1MDkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODgyYjlhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC8zYzUwOS5jCkBAIC0wLDAgKzEsNjIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0VUSEVSQk9PVCAtICBCT09UUC9URlRQIEJvb3RzdHJhcCBQcm9ncmFtCisKK0F1dGhvcjogTWFydGluIFJlbnRlcnMuCisgIERhdGU6IE1hciAyMiAxOTk1CisKKyBUaGlzIGNvZGUgaXMgYmFzZWQgaGVhdmlseSBvbiBEYXZpZCBHcmVlbm1hbidzIGlmX2VkLmMgZHJpdmVyIGFuZAorICBBbmRyZXMgVmVnYSBHYXJjaWEncyBpZl9lcC5jIGRyaXZlci4KKworIENvcHlyaWdodCAoQykgMTk5My0xOTk0LCBEYXZpZCBHcmVlbm1hbiwgTWFydGluIFJlbnRlcnMuCisgQ29weXJpZ2h0IChDKSAxOTkzLTE5OTUsIEFuZHJlcyBWZWdhIEdhcmNpYS4KKyBDb3B5cmlnaHQgKEMpIDE5OTUsIFNlcmdlIEJhYmtpbi4KKyAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCwgbW9kaWZpZWQsIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBzb2xkLCBpbgorICBib3RoIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm0gcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IGFuZCB0aGVzZQorICB0ZXJtcyBhcmUgcmV0YWluZWQuIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgYXJlIHRoZSBhdXRob3JzIHJlc3BvbnNpYmxlIGZvcgorICB0aGUgcHJvcGVyIGZ1bmN0aW9uaW5nIG9mIHRoaXMgc29mdHdhcmUsIG5vciBkbyB0aGUgYXV0aG9ycyBhc3N1bWUgYW55CisgIHJlc3BvbnNpYmlsaXR5IGZvciBkYW1hZ2VzIGluY3VycmVkIHdpdGggaXRzIHVzZS4KKworM2M1MDkgc3VwcG9ydCBhZGRlZCBieSBTZXJnZSBCYWJraW4gKGJhYmtpbkBocS5pY2IuY2hlbC5zdSkKKworJElkOiAzYzUwOS5jLHYgMS40IDIwMDIvMDEvMDIgMjE6NTY6NDAgb2t1amkgRXhwICQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAjZGVmaW5lIEVERUJVRyAqLworCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisjaW5jbHVkZSAibmljLmgiCisjaW5jbHVkZSAiY2FyZHMuaCIKKyNpbmNsdWRlICJ0aW1lci5oIgorI2luY2x1ZGUgIjNjNTA5LmgiCisKKyNkZWZpbmUJdWRlbGF5KG4pCXdhaXRvbl90aW1lcjIoKChuKSpUSUNLU19QRVJfTVMpLzEwMDApCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAlldGhfbmljX2Jhc2U7CitzdGF0aWMgZW51bSB7IG5vbmUsIGJuYywgdXRwIH0gY29ubmVjdG9yID0gbm9uZTsJLyogZm9yIDNDNTA5ICovCisKKyNpZmRlZglJTkNMVURFXzNDNTI5CisvKgorICogVGhpcyB0YWJsZSBhbmQgc2V2ZXJhbCBvdGhlciBwaWVjZXMgb2YgdGhlIE1DQSBzdXBwb3J0CisgKiBjb2RlIHdlcmUgc2hhbWVsZXNzbHkgYm9ycm93ZWQgZnJvbSB0aGUgTGludXgga2VybmVsIHNvdXJjZS4KKyAqCisgKiBNQ0Egc3VwcG9ydCBhZGRlZCBieSBBZGFtIEZyaXR6bGVyIChtaWRAYXVrLmN4KQorICoKKyAqLworc3RydWN0IGVsM19tY2FfYWRhcHRlcnNfc3RydWN0IHsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgICAgaW50IGlkOworfTsKK3N0YXRpYyBzdHJ1Y3QgZWwzX21jYV9hZGFwdGVyc19zdHJ1Y3QgZWwzX21jYV9hZGFwdGVyc1tdID0geworICAgICAgICB7ICIzQ29tIDNjNTI5IEV0aGVyTGluayBJSUkgKDEwYmFzZTIpIiwgMHg2MjdjIH0sCisgICAgICAgIHsgIjNDb20gM2M1MjkgRXRoZXJMaW5rIElJSSAoMTBiYXNlVCkiLCAweDYyN2QgfSwKKyAgICAgICAgeyAiM0NvbSAzYzUyOSBFdGhlckxpbmsgSUlJICh0ZXN0IG1vZGUpIiwgMHg2MmRiIH0sCisgICAgICAgIHsgIjNDb20gM2M1MjkgRXRoZXJMaW5rIElJSSAoVFAgb3IgY29heCkiLCAweDYyZjYgfSwKKyAgICAgICAgeyAiM0NvbSAzYzUyOSBFdGhlckxpbmsgSUlJIChUUCkiLCAweDYyZjcgfSwKKyAgICAgICAgeyBOVUxMLCAwIH0sCit9OworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIX1JFU0VUIC0gUmVzZXQgYWRhcHRlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgdDUwOV9yZXNldChzdHJ1Y3QgbmljICpuaWMpCit7CisJaW50IGk7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJCVJlc2V0IDNDb20gNTA5IGNhcmQKKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJLyogc3RvcCBjYXJkICovCisJb3V0dyhSWF9ESVNBQkxFLCBCQVNFICsgRVBfQ09NTUFORCk7CisJb3V0dyhSWF9ESVNDQVJEX1RPUF9QQUNLLCBCQVNFICsgRVBfQ09NTUFORCk7CisJd2hpbGUgKGludyhCQVNFICsgRVBfU1RBVFVTKSAmIFNfQ09NTUFORF9JTl9QUk9HUkVTUykKKwkJOworCW91dHcoVFhfRElTQUJMRSwgQkFTRSArIEVQX0NPTU1BTkQpOworCW91dHcoU1RPUF9UUkFOU0NFSVZFUiwgQkFTRSArIEVQX0NPTU1BTkQpOworCXVkZWxheSgxMDAwKTsKKwlvdXR3KFJYX1JFU0VULCBCQVNFICsgRVBfQ09NTUFORCk7CisJb3V0dyhUWF9SRVNFVCwgQkFTRSArIEVQX0NPTU1BTkQpOworCW91dHcoQ19JTlRSX0xBVENILCBCQVNFICsgRVBfQ09NTUFORCk7CisJb3V0dyhTRVRfUkRfMF9NQVNLLCBCQVNFICsgRVBfQ09NTUFORCk7CisJb3V0dyhTRVRfSU5UUl9NQVNLLCBCQVNFICsgRVBfQ09NTUFORCk7CisJb3V0dyhTRVRfUlhfRklMVEVSLCBCQVNFICsgRVBfQ09NTUFORCk7CisKKwkvKgorCSogaW5pdGlhbGl6ZSBjYXJkCisJKi8KKwl3aGlsZSAoaW53KEJBU0UgKyBFUF9TVEFUVVMpICYgU19DT01NQU5EX0lOX1BST0dSRVNTKQorCQk7CisKKwlHT19XSU5ET1coMCk7CisKKwkvKiBEaXNhYmxlIHRoZSBjYXJkICovCisJb3V0dygwLCBCQVNFICsgRVBfVzBfQ09ORklHX0NUUkwpOworCisJLyogQ29uZmlndXJlIElSUSB0byBub25lICovCisJb3V0dyhTRVRfSVJRKDApLCBCQVNFICsgRVBfVzBfUkVTT1VSQ0VfQ0ZHKTsKKworCS8qIEVuYWJsZSB0aGUgY2FyZCAqLworCW91dHcoRU5BQkxFX0RSUV9JUlEsIEJBU0UgKyBFUF9XMF9DT05GSUdfQ1RSTCk7CisKKwlHT19XSU5ET1coMik7CisKKwkvKiBSZWxvYWQgdGhlIGV0aGVyX2FkZHIuICovCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCisJCW91dGIobmljLT5ub2RlX2FkZHJbaV0sIEJBU0UgKyBFUF9XMl9BRERSXzAgKyBpKTsKKworCW91dHcoUlhfUkVTRVQsIEJBU0UgKyBFUF9DT01NQU5EKTsKKwlvdXR3KFRYX1JFU0VULCBCQVNFICsgRVBfQ09NTUFORCk7CisKKwkvKiBXaW5kb3cgMSBpcyBvcGVyYXRpbmcgd2luZG93ICovCisJR09fV0lORE9XKDEpOworCWZvciAoaSA9IDA7IGkgPCAzMTsgaSsrKQorCQlpbmIoQkFTRSArIEVQX1cxX1RYX1NUQVRVUyk7CisKKwkvKiBnZXQgcmlkIG9mIHN0cmF5IGludHIncyAqLworCW91dHcoQUNLX0lOVFIgfCAweGZmLCBCQVNFICsgRVBfQ09NTUFORCk7CisKKwlvdXR3KFNFVF9SRF8wX01BU0sgfCBTXzVfSU5UUywgQkFTRSArIEVQX0NPTU1BTkQpOworCisJb3V0dyhTRVRfSU5UUl9NQVNLLCBCQVNFICsgRVBfQ09NTUFORCk7CisKKwlvdXR3KFNFVF9SWF9GSUxURVIgfCBGSUxfSU5ESVZJRFVBTCB8IEZJTF9CUkRDU1QsIEJBU0UgKyBFUF9DT01NQU5EKTsKKworCS8qIGNvbmZpZ3VyZSBCTkMgKi8KKwlpZiAoY29ubmVjdG9yID09IGJuYykgeworCQlvdXR3KFNUQVJUX1RSQU5TQ0VJVkVSLCBCQVNFICsgRVBfQ09NTUFORCk7CisJCXVkZWxheSgxMDAwKTsKKwl9CisJLyogY29uZmlndXJlIFVUUCAqLworCWVsc2UgaWYgKGNvbm5lY3RvciA9PSB1dHApIHsKKwkJR09fV0lORE9XKDQpOworCQlvdXR3KEVOQUJMRV9VVFAsIEJBU0UgKyBFUF9XNF9NRURJQV9UWVBFKTsKKwkJc2xlZXAoMik7CS8qIEdpdmUgdGltZSBmb3IgbWVkaWEgdG8gbmVnb3RpYXRlICovCisJCUdPX1dJTkRPVygxKTsKKwl9CisKKwkvKiBzdGFydCB0cmFuc2NlaXZlciBhbmQgcmVjZWl2ZXIgKi8KKwlvdXR3KFJYX0VOQUJMRSwgQkFTRSArIEVQX0NPTU1BTkQpOworCW91dHcoVFhfRU5BQkxFLCBCQVNFICsgRVBfQ09NTUFORCk7CisKKwkvKiBzZXQgZWFybHkgdGhyZXNob2xkIGZvciBtaW5pbWFsIHBhY2tldCBsZW5ndGggKi8KKwlvdXR3KFNFVF9SWF9FQVJMWV9USFJFU0ggfCBFVEhfWkxFTiwgQkFTRSArIEVQX0NPTU1BTkQpOworCW91dHcoU0VUX1RYX1NUQVJUX1RIUkVTSCB8IDE2LCBCQVNFICsgRVBfQ09NTUFORCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIX1RSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGNoYXIgcGFkbWFwW10gPSB7CisJMCwgMywgMiwgMX07CisKK3N0YXRpYyB2b2lkIHQ1MDlfdHJhbnNtaXQoCitzdHJ1Y3QgbmljICpuaWMsCitjb25zdCBjaGFyICpkLAkJCS8qIERlc3RpbmF0aW9uICovCit1bnNpZ25lZCBpbnQgdCwJCQkvKiBUeXBlICovCit1bnNpZ25lZCBpbnQgcywJCQkvKiBzaXplICovCitjb25zdCBjaGFyICpwKQkJCS8qIFBhY2tldCAqLworeworCXJlZ2lzdGVyIHVuc2lnbmVkIGludCBsZW47CisJaW50IHBhZDsKKwlpbnQgc3RhdHVzOworCisjaWZkZWYJRURFQlVHCisJcHJpbnRmKCJ7bD0lZCx0PSVoWH0iLHMrRVRIX0hMRU4sdCk7CisjZW5kaWYKKworCS8qIHN3YXAgYnl0ZXMgb2YgdHlwZSAqLworCXQ9IGh0b25zKHQpOworCisJbGVuPXMrRVRIX0hMRU47IC8qIGFjdHVhbCBsZW5ndGggb2YgcGFja2V0ICovCisJcGFkID0gcGFkbWFwW2xlbiAmIDNdOworCisJLyoKKwkqIFRoZSAzYzUwOSBhdXRvbWF0aWNhbGx5IHBhZHMgc2hvcnQgcGFja2V0cyB0byBtaW5pbXVtIGV0aGVybmV0IGxlbmd0aCwKKwkqIGJ1dCB3ZSBkcm9wIHBhY2tldHMgdGhhdCBhcmUgdG9vIGxhcmdlLiBQZXJoYXBzIHdlIHNob3VsZCB0cnVuY2F0ZQorCSogdGhlbSBpbnN0ZWFkPworCSovCisJaWYgKGxlbiArIHBhZCA+IEVUSF9GUkFNRV9MRU4pIHsKKwkJcmV0dXJuOworCX0KKworCS8qIGRyb3AgYWNrbm93bGVkZ2VtZW50cyAqLworCXdoaWxlICgoc3RhdHVzPWluYihCQVNFICsgRVBfVzFfVFhfU1RBVFVTKSkgJiBUWFNfQ09NUExFVEUgKSB7CisJCWlmIChzdGF0dXMgJiAoVFhTX1VOREVSUlVOfFRYU19NQVhfQ09MTElTSU9OfFRYU19TVEFUVVNfT1ZFUkZMT1cpKSB7CisJCQlvdXR3KFRYX1JFU0VULCBCQVNFICsgRVBfQ09NTUFORCk7CisJCQlvdXR3KFRYX0VOQUJMRSwgQkFTRSArIEVQX0NPTU1BTkQpOworCQl9CisJCW91dGIoMHgwLCBCQVNFICsgRVBfVzFfVFhfU1RBVFVTKTsKKwl9CisKKwl3aGlsZSAoaW53KEJBU0UgKyBFUF9XMV9GUkVFX1RYKSA8ICh1bnNpZ25lZCBzaG9ydClsZW4gKyBwYWQgKyA0KQorCQk7IC8qIG5vIHJvb20gaW4gRklGTyAqLworCisJb3V0dyhsZW4sIEJBU0UgKyBFUF9XMV9UWF9QSU9fV1JfMSk7CisJb3V0dygweDAsIEJBU0UgKyBFUF9XMV9UWF9QSU9fV1JfMSk7CS8qIFNlY29uZCBkd29yZCBtZWFuaW5nbGVzcyAqLworCisJLyogd3JpdGUgcGFja2V0ICovCisJb3V0c3coQkFTRSArIEVQX1cxX1RYX1BJT19XUl8xLCBkLCBFVEhfQUxFTi8yKTsKKwlvdXRzdyhCQVNFICsgRVBfVzFfVFhfUElPX1dSXzEsIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTi8yKTsKKwlvdXR3KHQsIEJBU0UgKyBFUF9XMV9UWF9QSU9fV1JfMSk7CisJb3V0c3coQkFTRSArIEVQX1cxX1RYX1BJT19XUl8xLCBwLCBzIC8gMik7CisJaWYgKHMgJiAxKQorCQlvdXRiKCoocCtzIC0gMSksIEJBU0UgKyBFUF9XMV9UWF9QSU9fV1JfMSk7CisKKwl3aGlsZSAocGFkLS0pCisJCW91dGIoMCwgQkFTRSArIEVQX1cxX1RYX1BJT19XUl8xKTsJLyogUGFkZGluZyAqLworCisJLyogd2FpdCBmb3IgVHggY29tcGxldGUgKi8KKwl3aGlsZSgoaW53KEJBU0UgKyBFUF9TVEFUVVMpICYgU19DT01NQU5EX0lOX1BST0dSRVNTKSAhPSAwKQorCQk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIX1BPTEwgLSBXYWl0IGZvciBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHQ1MDlfcG9sbChzdHJ1Y3QgbmljICpuaWMpCit7CisJLyogY29tbW9uIHZhcmlhYmxlcyAqLworCXVuc2lnbmVkIHNob3J0IHR5cGUgPSAwOwkvKiB1c2VkIGJ5IEVERUJVRyAqLworCS8qIHZhcmlhYmxlcyBmb3IgM0M1MDkgKi8KKwlzaG9ydCBzdGF0dXMsIGNzdDsKKwlyZWdpc3RlciBzaG9ydCByeF9maWZvOworCisJY3N0PWludyhCQVNFICsgRVBfU1RBVFVTKTsKKworI2lmZGVmCUVERUJVRworCWlmKGNzdCAmIDB4MUZGRikKKwkJcHJpbnRmKCItJWhYLSIsY3N0KTsKKyNlbmRpZgorCisJaWYoIChjc3QgJiBTX1JYX0NPTVBMRVRFKT09MCApIHsKKwkJLyogYWNrbm93bGVkZ2UgIGV2ZXJ5dGhpbmcgKi8KKwkJb3V0dyhBQ0tfSU5UUnwgKGNzdCAmIFNfNV9JTlRTKSwgQkFTRSArIEVQX0NPTU1BTkQpOworCQlvdXR3KENfSU5UUl9MQVRDSCwgQkFTRSArIEVQX0NPTU1BTkQpOworCisJCXJldHVybiAwOworCX0KKworCXN0YXR1cyA9IGludyhCQVNFICsgRVBfVzFfUlhfU1RBVFVTKTsKKyNpZmRlZglFREVCVUcKKwlwcmludGYoIiolaFgqIixzdGF0dXMpOworI2VuZGlmCisKKwlpZiAoc3RhdHVzICYgRVJSX1JYKSB7CisJCW91dHcoUlhfRElTQ0FSRF9UT1BfUEFDSywgQkFTRSArIEVQX0NPTU1BTkQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyeF9maWZvID0gc3RhdHVzICYgUlhfQllURVNfTUFTSzsKKwlpZiAocnhfZmlmbz09MCkKKwkJcmV0dXJuIDA7CisKKwkJLyogcmVhZCBwYWNrZXQgKi8KKyNpZmRlZglFREVCVUcKKwlwcmludGYoIltsPSVkIixyeF9maWZvKTsKKyNlbmRpZgorCWluc3coQkFTRSArIEVQX1cxX1JYX1BJT19SRF8xLCBuaWMtPnBhY2tldCwgcnhfZmlmbyAvIDIpOworCWlmKHJ4X2ZpZm8gJiAxKQorCQluaWMtPnBhY2tldFtyeF9maWZvLTFdPWluYihCQVNFICsgRVBfVzFfUlhfUElPX1JEXzEpOworCW5pYy0+cGFja2V0bGVuPXJ4X2ZpZm87CisKKwl3aGlsZSgxKSB7CisJCXN0YXR1cyA9IGludyhCQVNFICsgRVBfVzFfUlhfU1RBVFVTKTsKKyNpZmRlZglFREVCVUcKKwkJcHJpbnRmKCIqJWhYKiIsc3RhdHVzKTsKKyNlbmRpZgorCQlyeF9maWZvID0gc3RhdHVzICYgUlhfQllURVNfTUFTSzsKKwkJaWYocnhfZmlmbz4wKSB7CisJCQlpbnN3KEJBU0UgKyBFUF9XMV9SWF9QSU9fUkRfMSwgbmljLT5wYWNrZXQrbmljLT5wYWNrZXRsZW4sIHJ4X2ZpZm8gLyAyKTsKKwkJCWlmKHJ4X2ZpZm8gJiAxKQorCQkJCW5pYy0+cGFja2V0W25pYy0+cGFja2V0bGVuK3J4X2ZpZm8tMV09aW5iKEJBU0UgKyBFUF9XMV9SWF9QSU9fUkRfMSk7CisJCQluaWMtPnBhY2tldGxlbis9cnhfZmlmbzsKKyNpZmRlZglFREVCVUcKKwkJCXByaW50ZigiKyVkIixyeF9maWZvKTsKKyNlbmRpZgorCQl9CisJCWlmKCggc3RhdHVzICYgUlhfSU5DT01QTEVURSApPT0wKSB7CisjaWZkZWYJRURFQlVHCisJCQlwcmludGYoIj0lZCIsbmljLT5wYWNrZXRsZW4pOworI2VuZGlmCisJCQlicmVhazsKKwkJfQorCQl1ZGVsYXkoMTAwMCk7CS8qIGlmIGluY29tcGxldGUgd2FpdCAxIG1zICovCisJfQorCS8qIGFja25vd2xlZGdlIHJlY2VwdGlvbiBvZiBwYWNrZXQgKi8KKwlvdXR3KFJYX0RJU0NBUkRfVE9QX1BBQ0ssIEJBU0UgKyBFUF9DT01NQU5EKTsKKwl3aGlsZSAoaW53KEJBU0UgKyBFUF9TVEFUVVMpICYgU19DT01NQU5EX0lOX1BST0dSRVNTKQorCQk7CisjaWZkZWYJRURFQlVHCisJdHlwZSA9IChuaWMtPnBhY2tldFsxMl08PDgpIHwgbmljLT5wYWNrZXRbMTNdOworCWlmKG5pYy0+cGFja2V0WzBdK25pYy0+cGFja2V0WzFdK25pYy0+cGFja2V0WzJdK25pYy0+cGFja2V0WzNdK25pYy0+cGFja2V0WzRdKworCSAgICBuaWMtPnBhY2tldFs1XSA9PSAweEZGKkVUSF9BTEVOKQorCQlwcmludGYoIix0PSVoWCxiXSIsdHlwZSk7CisJZWxzZQorCQlwcmludGYoIix0PSVoWF0iLHR5cGUpOworI2VuZGlmCisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkzQ29tIDUwOSAtIHNwZWNpZmljIHJvdXRpbmVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAorZWVwcm9tX3JkeSh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaXNfZWVwcm9tX2J1c3koSVNfQkFTRSkgJiYgaSA8IE1BWF9FRVBST01CVVNZOyBpKyspOworCWlmIChpID49IE1BWF9FRVBST01CVVNZKSB7CisJCS8qIHByaW50ZigiM2M1MDk6IGVlcHJvbSBmYWlsZWQgdG8gY29tZSByZWFkeS5cbiIpOyAqLworCQlwcmludGYoIjNjNTA5OiBlZXByb20gYnVzeS5cbiIpOyAvKiBtZW1vcnkgaW4gRVBST00gaXMgdGlnaHQgKi8KKwkJcmV0dXJuICgwKTsKKwl9CisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIGdldF9lOiBnZXRzIGEgMTYgYml0cyB3b3JkIGZyb20gdGhlIEVFUFJPTS4gd2UgbXVzdCBoYXZlIHNldCB0aGUgd2luZG93CisgKiBiZWZvcmUKKyAqLworc3RhdGljIGludAorZ2V0X2UoaW50IG9mZnNldCkKK3sKKwlpZiAoIWVlcHJvbV9yZHkoKSkKKwkJcmV0dXJuICgweGZmZmYpOworCW91dHcoRUVQUk9NX0NNRF9SRCB8IG9mZnNldCwgSVNfQkFTRSArIEVQX1cwX0VFUFJPTV9DT01NQU5EKTsKKwlpZiAoIWVlcHJvbV9yZHkoKSkKKwkJcmV0dXJuICgweGZmZmYpOworCXJldHVybiAoaW53KElTX0JBU0UgKyBFUF9XMF9FRVBST01fREFUQSkpOworfQorCitzdGF0aWMgaW50CitzZW5kX0lEX3NlcXVlbmNlKGludCBwb3J0KQoreworCWludCBjeCwgYWw7CisKKwlmb3IgKGFsID0gMHhmZiwgY3ggPSAwOyBjeCA8IDI1NTsgY3grKykgeworCQlvdXRiKGFsLCBwb3J0KTsKKwkJYWwgPDw9IDE7CisJCWlmIChhbCAmIDB4MTAwKQorCQkJYWwgXj0gMHhjZjsKKwl9CisJcmV0dXJuICgxKTsKK30KKworCisvKgorICogV2UgZ2V0IGVlcHJvbSBkYXRhIGZyb20gdGhlIGlkX3BvcnQgZ2l2ZW4gYW4gb2Zmc2V0IGludG8gdGhlIGVlcHJvbS4KKyAqIEJhc2ljYWxseTsgYWZ0ZXIgdGhlIElEX3NlcXVlbmNlIGlzIHNlbnQgdG8gYWxsIG9mIHRoZSBjYXJkczsgdGhleSBlbnRlcgorICogdGhlIElEX0NNRCBzdGF0ZSB3aGVyZSB0aGV5IHdpbGwgYWNjZXB0IGNvbW1hbmQgcmVxdWVzdHMuIDB4ODAtMHhiZiBsb2FkcworICogdGhlIGVlcHJvbSBkYXRhLiAgV2UgdGhlbiByZWFkIHRoZSBwb3J0IDE2IHRpbWVzIGFuZCB3aXRoIGV2ZXJ5IHJlYWQ7IHRoZQorICogY2FyZHMgY2hlY2sgZm9yIGNvbnRlbnRpb24gKGllOiBpZiBvbmUgY2FyZCB3cml0ZXMgYSAwIGJpdCBhbmQgYW5vdGhlcgorICogd3JpdGVzIGEgMSBiaXQgdGhlbiB0aGUgaG9zdCBzZWVzIGEgMC4gQXQgdGhlIGVuZCBvZiB0aGUgY3ljbGU7IGVhY2ggY2FyZAorICogY29tcGFyZXMgdGhlIGRhdGEgb24gdGhlIGJ1czsgaWYgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIHRoZW4gdGhhdCBjYXJkIGdvZXMKKyAqIGludG8gSURfV0FJVCBzdGF0ZSBhZ2FpbikuIEluIHRoZSBtZWFudGltZTsgb25lIGJpdCBvZiBkYXRhIGlzIHJldHVybmVkIGluCisgKiB0aGUgQVggcmVnaXN0ZXIgd2hpY2ggaXMgY29udmVuaWVudGx5IHJldHVybmVkIHRvIHVzIGJ5IGluYigpLiAgSGVuY2U7IHdlCisgKiByZWFkIDE2IHRpbWVzIGdldHRpbmcgb25lIGJpdCBvZiBkYXRhIHdpdGggZWFjaCByZWFkLgorICovCitzdGF0aWMgaW50CitnZXRfZWVwcm9tX2RhdGEoaW50IGlkX3BvcnQsIGludCBvZmZzZXQpCit7CisJaW50IGksIGRhdGEgPSAwOworCW91dGIoMHg4MCArIG9mZnNldCwgaWRfcG9ydCk7CisJLyogRG8gd2UgcmVhbGx5IG5lZWQgdGhpcyB3YWl0PyBXb24ndCBiZSBub3RpY2VhYmxlIGFueXdheSAqLworCXVkZWxheSgxMDAwMCk7CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCWRhdGEgPSAoZGF0YSA8PCAxKSB8IChpbncoaWRfcG9ydCkgJiAxKTsKKwlyZXR1cm4gKGRhdGEpOworfQorCitzdGF0aWMgdm9pZCB0NTA5X2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQoreworCW91dGIoMHhjMCwgRVBfSURfUE9SVCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIX1BST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmCUlOQ0xVREVfM0M1MjkKK3N0cnVjdCBuaWMgKnQ1MjlfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVfYWRkcnMpCisjZWxzZQorc3RydWN0IG5pYyAqdDUwOV9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZV9hZGRycykKKyNlbmRpZgoreworCS8qIGNvbW1vbiB2YXJpYWJsZXMgKi8KKwlpbnQgaTsKKwlpbnQgZmFpbGNvdW50OworCisjaWZkZWYJSU5DTFVERV8zQzUyOQorCXN0cnVjdCBlbDNfbWNhX2FkYXB0ZXJzX3N0cnVjdCAqbWNhZm91bmQgPSBOVUxMOworCWludCBtY2FfcG9zNCA9IDAsIG1jYV9wb3M1ID0gMCwgbWNhX2lycSA9IDA7CisjZW5kaWYKKworCXQ1MDlfZGlzYWJsZShuaWMpOwkJLyogaW4gY2FzZSBib2FyZCB3YXMgYWN0aXZlICovCisJCQkJCS8qIG5vdGUgdGhhdCBuaWMgaXMgbm90IHVzZWQgKi8KKwlmb3IgKGZhaWxjb3VudCA9IDA7IGZhaWxjb3VudCA8IDQwMDA7IGZhaWxjb3VudCsrKSB7CisJCWludCBkYXRhLCBqLCBpb19iYXNlLCBpZF9wb3J0OworCQl1bnNpZ25lZCBzaG9ydCBrOworCQlpbnQgZXBfY3VycmVudF90YWc7CisJCXNob3J0ICpwOworI2lmZGVmCUlOQ0xVREVfM0M1MjkKKwkJaW50IGN1cmJvYXJkOworI2VuZGlmCisKKwkJaWRfcG9ydCA9IEVQX0lEX1BPUlQ7CisJCWVwX2N1cnJlbnRfdGFnID0gRVBfTEFTVF9UQUcgKyAxOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkJU2VhcmNoIGZvciAzQ29tIDUwOSBjYXJkCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYJSU5DTFVERV8zQzUyOQorCQkvKgorCQkgKiBYWFg6IFdlIHNob3VsZCByZWFsbHkgY2hlY2sgdG8gbWFrZSBzdXJlIHdlIGhhdmUgYW4gTUNBCisJCSAqIGJ1cyBjb250cm9sbGVyIGJlZm9yZSBnb2luZyBhaGVhZCB3aXRoIHRoaXMuLi4KKwkJICoKKwkJICogRm9yIG5vdywgd2UgYXZvaWQgYW55IGhhc3NsZSBieSBtYWtpbmcgaXQgYSBjb21waWxlCisJCSAqIHRpbWUgb3B0aW9uLgorCQkgKgorCQkgKi8KKwkJcHJpbnRmKCJcbldhcm5pbmc6IEFzc3VtaW5nIHByZXNlbmNlIG9mIE1DQSBidXNcbiIpOworCisgICAgICAgICAgICAgICAgLyogTWFrZSBzdXJlIG1vdGhlcmJvYXJkIHNldHVwIGlzIG9mZiAqLworICAgICAgICAgICAgICAgIG91dGJfcCgweGZmLCBNQ0FfTU9USEVSQk9BUkRfU0VUVVBfUkVHKTsKKworCQkvKiBDeWNsZSB0aHJvdWdoIHNsb3RzICovCisJCWZvcihjdXJib2FyZD0wOyBjdXJib2FyZDxNQ0FfTUFYX1NMT1RfTlI7IGN1cmJvYXJkKyspIHsKKwkJCWludCBib2FyZGlkOworCQkJaW50IGN1cmNhcmQ7CisKKwkJCW91dGJfcCgweDh8KGN1cmJvYXJkJjB4ZiksIE1DQV9BREFQVEVSX1NFVFVQX1JFRyk7CisKKwkJCWJvYXJkaWQgPSBpbmJfcChNQ0FfUE9TX1JFRygwKSk7CisJCQlib2FyZGlkICs9IGluYl9wKE1DQV9QT1NfUkVHKDEpKSA8PCA4OworCisJCQljdXJjYXJkID0gMDsKKwkJCXdoaWxlIChlbDNfbWNhX2FkYXB0ZXJzW2N1cmNhcmRdLm5hbWUpIHsKKwkJCQlpZiAoZWwzX21jYV9hZGFwdGVyc1tjdXJjYXJkXS5pZCA9PSBib2FyZGlkKSB7CisJCQkJCW1jYWZvdW5kID0gJmVsM19tY2FfYWRhcHRlcnNbY3VyY2FyZF07CisKKwkJCQkJbWNhX3BvczQgPSBpbmJfcChNQ0FfUE9TX1JFRyg0KSk7CisJCQkJCW1jYV9wb3M1ID0gaW5iX3AoTUNBX1BPU19SRUcoNSkpOworCisJCQkJCWdvdG8gZG9uZXdpdGhkZXRlY3Q7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJY3VyY2FyZCsrOworCQkJfQorCisJCX0KKwlkb25ld2l0aGRldGVjdDoKKwkJLyogS2lsbCBhbGwgc2V0dXAgbW9kZXMgKi8KKwkJb3V0Yl9wKDAsIE1DQV9BREFQVEVSX1NFVFVQX1JFRyk7CisKKwkJaWYgKG1jYWZvdW5kKSB7CisJCQlldGhfbmljX2Jhc2UgPSAoKHNob3J0KSgobWNhX3BvczQmMHhmYyl8MHgwMikpIDw8IDg7CisJCQltY2FfaXJxID0gbWNhX3BvczUgJiAweDBmOworCQkJZXBfY3VycmVudF90YWctLTsKKwkJfQorCQllbHNlCisJCQlwcmludGYoIk1DQSBDYXJkIG5vdCBmb3VuZFxuIik7CisjZW5kaWYKKwkvKiBMb29rIGZvciB0aGUgRUlTQSBib2FyZHMsIGxlYXZlIHRoZW0gYWN0aXZhdGVkICovCisJLyogc2VhcmNoIGZvciB0aGUgZmlyc3QgY2FyZCwgaWdub3JlIGFsbCBvdGhlcnMgKi8KKwlmb3IoaiA9IDE7IGogPCAxNjsgaisrKSB7CisJCWlvX2Jhc2UgPSAoaiAqIEVQX0VJU0FfU1RBUlQpIHwgRVBfRUlTQV9XMDsKKwkJaWYgKGludyhpb19iYXNlICsgRVBfVzBfTUZHX0lEKSAhPSBNRkdfSUQpCisJCQljb250aW51ZTsKKworCQkvKiB3ZSBtdXN0IGhhdmUgZm91bmQgMHgxZiBpZiB0aGUgYm9hcmQgaXMgRUlTQSBjb25maWd1cmF0ZWQgKi8KKwkJaWYgKChpbncoaW9fYmFzZSArIEVQX1cwX0FERFJFU1NfQ0ZHKSAmIDB4MWYpICE9IDB4MWYpCisJCQljb250aW51ZTsKKworCQkvKiBSZXNldCBhbmQgRW5hYmxlIHRoZSBjYXJkICovCisJCW91dGIoVzBfUDRfQ01EX1JFU0VUX0FEQVBURVIsIGlvX2Jhc2UgKyBFUF9XMF9DT05GSUdfQ1RSTCk7CisJCXVkZWxheSgxMDAwKTsgLyogTXVzdCB3YWl0IDgwMCC1cywgYmUgY29uc2VydmF0aXZlICovCisJCW91dGIoVzBfUDRfQ01EX0VOQUJMRV9BREFQVEVSLCBpb19iYXNlICsgRVBfVzBfQ09ORklHX0NUUkwpOworCisJCS8qCisJCSAqIE9uY2UgYWN0aXZhdGVkLCBhbGwgdGhlIHJlZ2lzdGVycyBhcmUgbWFwcGVkIGluIHRoZSByYW5nZQorCQkgKiB4MDAwIC0geDAwRiwgd2hlcmUgeCBpcyB0aGUgc2xvdCBudW1iZXIuCisJCSAqLworCQlldGhfbmljX2Jhc2UgPSBqICogRVBfRUlTQV9TVEFSVDsKKwkJYnJlYWs7CisJfQorCWVwX2N1cnJlbnRfdGFnLS07CisKKwkvKiBMb29rIGZvciB0aGUgSVNBIGJvYXJkcy4gSW5pdCBhbmQgbGVhdmUgdGhlbSBhY3RpdmVkICovCisJLyogc2VhcmNoIGZvciB0aGUgZmlyc3QgY2FyZCwgaWdub3JlIGFsbCBvdGhlcnMgKi8KKwlvdXRiKDB4YzAsIGlkX3BvcnQpOwkvKiBHbG9iYWwgcmVzZXQgKi8KKwl1ZGVsYXkoMTAwMCk7CQkvKiB3YWl0IDEgbXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgRVBfTUFYX0JPQVJEUzsgaSsrKSB7CisJCW91dGIoMCwgaWRfcG9ydCk7CisJCW91dGIoMCwgaWRfcG9ydCk7CisJCXNlbmRfSURfc2VxdWVuY2UoaWRfcG9ydCk7CisKKwkJZGF0YSA9IGdldF9lZXByb21fZGF0YShpZF9wb3J0LCBFRVBST01fTUZHX0lEKTsKKwkJaWYgKGRhdGEgIT0gTUZHX0lEKQorCQkJYnJlYWs7CisKKwkJLyogcmVzb2x2ZSBjb250ZW50aW9uIHVzaW5nIHRoZSBFdGhlcm5ldCBhZGRyZXNzICovCisJCWZvciAoaiA9IDA7IGogPCAzOyBqKyspCisJCQlkYXRhID0gZ2V0X2VlcHJvbV9kYXRhKGlkX3BvcnQsIGopOworCisJCWV0aF9uaWNfYmFzZSA9CisJCSAgICAoZ2V0X2VlcHJvbV9kYXRhKGlkX3BvcnQsIEVFUFJPTV9BRERSX0NGRykgJiAweDFmKSAqIDB4MTAgKyAweDIwMDsKKwkJb3V0YihlcF9jdXJyZW50X3RhZywgaWRfcG9ydCk7CS8qIHRhZ3MgYm9hcmQgKi8KKwkJb3V0YihBQ1RJVkFURV9BREFQVEVSX1RPX0NPTkZJRywgaWRfcG9ydCk7CisJCWVwX2N1cnJlbnRfdGFnLS07CisJCWJyZWFrOworCX0KKworCWlmIChpID49IEVQX01BWF9CT0FSRFMpCisJCWdvdG8gbm8zYzUwOTsKKworCS8qCisJKiBUaGUgaW9iYXNlIHdhcyBmb3VuZCBhbmQgTUZHX0lEIHdhcyAweDZkNTAuIFBST0RfSUQgc2hvdWxkIGJlCisJKiAweDlbMC1mXTUwCisJKi8KKwlHT19XSU5ET1coMCk7CisJayA9IGdldF9lKEVFUFJPTV9QUk9EX0lEKTsKKyNpZmRlZglJTkNMVURFXzNDNTI5CisJLyoKKwkgKiBPbiBNQ0EsIHRoZSBQUk9EX0lEIG1hdGNoZXMgdGhlIE1DQSBjYXJkIElEIChQT1MwK1BPUzEpCisJICovCisJaWYgKG1jYWZvdW5kKSB7CisJCWlmIChtY2Fmb3VuZC0+aWQgIT0gaykgeworCQkJcHJpbnRmKCJNQ0E6IFBST0RfSUQgaW4gRUVQUk9NIGRvZXMgbm90IG1hdGNoIE1DQSBjYXJkIElEISAoJWhYICE9ICVoWClcbiIsIGssIG1jYWZvdW5kLT5pZCk7CisJCQlnb3RvIG5vM2M1MDk7CisJCX0KKwl9IGVsc2UgeyAvKiBmb3IgSVNBL0VJU0EgKi8KKwkJaWYgKChrICYgMHhmMGZmKSAhPSAoUFJPRF9JRCAmIDB4ZjBmZikpCisJCQlnb3RvIG5vM2M1MDk7CisJfQorI2Vsc2UKKwlpZiAoKGsgJiAweGYwZmYpICE9IChQUk9EX0lEICYgMHhmMGZmKSkKKwkJZ290byBubzNjNTA5OworI2VuZGlmCisKKyNpZmRlZglJTkNMVURFXzNDNTI5CisJaWYgKG1jYWZvdW5kKSB7CisJCXByaW50ZigiJXMgYm9hcmQgZm91bmQgb24gTUNBIGF0ICUjaHggSVJRICVkIC0iLAorCQkgICAgICAgbWNhZm91bmQtPm5hbWUsIGV0aF9uaWNfYmFzZSwgbWNhX2lycSk7CisJfSBlbHNlIHsKKyNlbmRpZgorCQlpZihldGhfbmljX2Jhc2UgPj0gRVBfRUlTQV9TVEFSVCkKKwkJCXByaW50ZigiM0M1eDkgYm9hcmQgb24gRUlTQSBhdCAlI2h4IC0gIixldGhfbmljX2Jhc2UpOworCQllbHNlCisJCQlwcmludGYoIjNDNXg5IGJvYXJkIG9uIElTQSBhdCAlI2h4IC0gIixldGhfbmljX2Jhc2UpOworI2lmZGVmCUlOQ0xVREVfM0M1MjkKKwl9CisjZW5kaWYKKworCS8qIHRlc3QgZm9yIHByZXNlbmNlIG9mIGNvbm5lY3RvcnMgKi8KKwlpID0gaW53KElTX0JBU0UgKyBFUF9XMF9DT05GSUdfQ1RSTCk7CisJaiA9IChpbncoSVNfQkFTRSArIEVQX1cwX0FERFJFU1NfQ0ZHKSA+PiAxNCkgJiAweDM7CisKKwlzd2l0Y2goaikgeworCQljYXNlIDA6CisJCQlpZiAoaSAmIElTX1VUUCkgeworCQkJCXByaW50ZigiMTBiYXNlVFxuIik7CisJCQkJY29ubmVjdG9yID0gdXRwOworCQkJCX0KKwkJCWVsc2UgeworCQkJCXByaW50ZigiMTBiYXNlVCBub3QgcHJlc2VudFxuIik7CisJCQkJZ290byBubzNjNTA5OworCQkJCX0KKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlpZiAoaSAmIElTX0FVSSkKKwkJCQlwcmludGYoIjEwYmFzZTVcbiIpOworCQkJZWxzZSB7CisJCQkJcHJpbnRmKCIxMGJhc2U1IG5vdCBwcmVzZW50XG4iKTsKKwkJCQlnb3RvIG5vM2M1MDk7CisJCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWlmIChpICYgSVNfQk5DKSB7CisJCQkJcHJpbnRmKCIxMGJhc2UyXG4iKTsKKwkJCQljb25uZWN0b3IgPSBibmM7CisJCQkJfQorCQkJZWxzZSB7CisJCQkJcHJpbnRmKCIxMGJhc2UyIG5vdCBwcmVzZW50XG4iKTsKKwkJCQlnb3RvIG5vM2M1MDk7CisJCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGYoInVua25vd24gY29ubmVjdG9yXG4iKTsKKwkJCWdvdG8gbm8zYzUwOTsKKwkJfQorCS8qCisJKiBSZWFkIHRoZSBzdGF0aW9uIGFkZHJlc3MgZnJvbSB0aGUgZWVwcm9tCisJKi8KKwlwID0gKHVuc2lnbmVkIHNob3J0ICopIG5pYy0+bm9kZV9hZGRyOworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTiAvIDI7IGkrKykgeworCQlHT19XSU5ET1coMCk7CisJCXBbaV0gPSBodG9ucyhnZXRfZShpKSk7CisJCUdPX1dJTkRPVygyKTsKKwkJb3V0dyhudG9ocyhwW2ldKSwgQkFTRSArIEVQX1cyX0FERFJfMCArIChpICogMikpOworCX0KKwlwcmludGYoIkV0aGVybmV0IGFkZHJlc3M6ICUhXG4iLCBuaWMtPm5vZGVfYWRkcik7CisJdDUwOV9yZXNldChuaWMpOworCW5pYy0+cmVzZXQgPSB0NTA5X3Jlc2V0OworCW5pYy0+cG9sbCA9IHQ1MDlfcG9sbDsKKwluaWMtPnRyYW5zbWl0ID0gdDUwOV90cmFuc21pdDsKKwluaWMtPmRpc2FibGUgPSB0NTA5X2Rpc2FibGU7CisJcmV0dXJuIG5pYzsKK25vM2M1MDk6CisJcHJpbnRmKCIocHJvYmUgZmFpbCkiKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvbmV0Ym9vdC8zYzUwOS5oIGIvbmV0Ym9vdC8zYzUwOS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMTQ5MzIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290LzNjNTA5LmgKQEAgLTAsMCArMSwzOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMgSGVyYiBQZXllcmwgKGhwZXllcmxAbm92YXRlbC5jYSkgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gMi4gVGhlIG5hbWUKKyAqIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91Z2ggc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PCisgKiBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAqIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIGlmX2VwcmVnLmgsdiAxLjQgMTk5NC8xMS8xMyAxMDoxMjozNyBnaWJicyBFeHAgTW9kaWZpZWQgYnk6CisgKgorIE9jdG9iZXIgMiwgMTk5NAorCisgTW9kaWZpZWQgYnk6IEFuZHJlcyBWZWdhIEdhcmNpYQorCisgSU5SSUEgLSBTb3BoaWEgQW50aXBvbGlzLCBGcmFuY2UKKyBlLW1haWw6IGF2ZWdhQHNvcGhpYS5pbnJpYS5mcgorIGZpbmdlcjogYXZlZ2FAcGF4LmlucmlhLmZyCisKKyAqLworCisvKgorICogRXRoZXJuZXQgc29mdHdhcmUgc3RhdHVzIHBlciBpbnRlcmZhY2UuCisgKi8KKy8qCisgKiBTb21lIGdsb2JhbCBjb25zdGFudHMKKyAqLworCisjZGVmaW5lIFRYX0lOSVRfUkFURQkJMTYKKyNkZWZpbmUgVFhfSU5JVF9NQVhfUkFURQk2NAorI2RlZmluZSBSWF9JTklUX0xBVEVOQ1kJCTY0CisjZGVmaW5lIFJYX0lOSVRfRUFSTFlfVEhSRVNICTY0CisjZGVmaW5lIE1JTl9SWF9FQVJMWV9USFJFU0hGCTE2CS8qIG5vdCBsZXNzIHRoYW4gZXRoZXJfaGVhZGVyICovCisjZGVmaW5lIE1JTl9SWF9FQVJMWV9USFJFU0hMCTQKKworI2RlZmluZSBFRVBST01TSVpFCTB4NDAKKyNkZWZpbmUgTUFYX0VFUFJPTUJVU1kJMTAwMAorI2RlZmluZSBFUF9MQVNUX1RBRwkweGQ3CisjZGVmaW5lIEVQX01BWF9CT0FSRFMJMTYKKyNkZWZpbmUgRVBfSURfUE9SVAkweDEwMAorCisvKgorICogc29tZSBtYWNyb3MgdG8gYWNjZXMgbG9uZyBuYW1lZCBmaWVsZHMKKyAqLworI2RlZmluZSBJU19CQVNFIChldGhfbmljX2Jhc2UpCisjZGVmaW5lIEJBU0UJKGV0aF9uaWNfYmFzZSkKKworLyoKKyAqIENvbW1hbmRzIHRvIHJlYWQvd3JpdGUgRUVQUk9NIHRyb3VnaCBFRVBST00gY29tbWFuZCByZWdpc3RlciAoV2luZG93IDAsCisgKiBPZmZzZXQgMHhhKQorICovCisjZGVmaW5lIEVFUFJPTV9DTURfUkQJMHgwMDgwCS8qIFJlYWQ6ICBBZGRyZXNzIHJlcXVpcmVkICg1IGJpdHMpICovCisjZGVmaW5lIEVFUFJPTV9DTURfV1IJMHgwMDQwCS8qIFdyaXRlOiBBZGRyZXNzIHJlcXVpcmVkICg1IGJpdHMpICovCisjZGVmaW5lIEVFUFJPTV9DTURfRVJBU0UgMHgwMGMwCS8qIEVyYXNlOiBBZGRyZXNzIHJlcXVpcmVkICg1IGJpdHMpICovCisjZGVmaW5lIEVFUFJPTV9DTURfRVdFTgkweDAwMzAJLyogRXJhc2UvV3JpdGUgRW5hYmxlOiBObyBkYXRhIHJlcXVpcmVkICovCisKKyNkZWZpbmUgRUVQUk9NX0JVU1kJCSgxPDwxNSkKKyNkZWZpbmUgRUVQUk9NX1RTVF9NT0RFCQkoMTw8MTQpCisKKy8qCisgKiBTb21lIHNob3J0IGZ1bmN0aW9ucywgd29ydGggdG8gbGV0IHRoZW0gYmUgYSBtYWNybworICovCisjZGVmaW5lIGlzX2VlcHJvbV9idXN5KGIpIChpbncoKGIpK0VQX1cwX0VFUFJPTV9DT01NQU5EKSZFRVBST01fQlVTWSkKKyNkZWZpbmUgR09fV0lORE9XKHgpCW91dHcoV0lORE9XX1NFTEVDVHwoeCksIEJBU0UrRVBfQ09NTUFORCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhlc2UgZGVmaW5lIHRoZSBFRVBST00gZGF0YSBzdHJ1Y3R1cmUuICBUaGV5IGFyZSB1c2VkIGluIHRoZSBwcm9iZQorICogZnVuY3Rpb24gdG8gdmVyaWZ5IHRoZSBleGlzdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgYWZ0ZXIgaGF2aW5nIHNlbnQKKyAqIHRoZSBJRF9TZXF1ZW5jZS4KKyAqCisgKiBUaGVyZSBhcmUgb3RoZXJzIGJ1dCBvbmx5IHRoZSBvbmVzIHdlIHVzZSBhcmUgZGVmaW5lZCBoZXJlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBFRVBST01fTk9ERV9BRERSXzAJMHgwCS8qIFdvcmQgKi8KKyNkZWZpbmUgRUVQUk9NX05PREVfQUREUl8xCTB4MQkvKiBXb3JkICovCisjZGVmaW5lIEVFUFJPTV9OT0RFX0FERFJfMgkweDIJLyogV29yZCAqLworI2RlZmluZSBFRVBST01fUFJPRF9JRAkJMHgzCS8qIDB4OVswLWZdNTAgKi8KKyNkZWZpbmUgRUVQUk9NX01GR19JRAkJMHg3CS8qIDB4NmQ1MCAqLworI2RlZmluZSBFRVBST01fQUREUl9DRkcJCTB4OAkvKiBCYXNlIGFkZHIgKi8KKyNkZWZpbmUgRUVQUk9NX1JFU09VUkNFX0NGRwkweDkJLyogSVJRLiBCaXRzIDEyLTE1ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoZXNlIGFyZSB0aGUgcmVnaXN0ZXJzIGZvciB0aGUgM0NvbSAzYzUwOSBhbmQgdGhlaXIgYml0IHBhdHRlcm5zIHdoZW4KKyAqIGFwcGxpY2FibGUuICBUaGV5IGhhdmUgYmVlbiB0YWtlbiBvdXQgdGhlIHRoZSAiRXRoZXJMaW5rIElJSSBQYXJhbGxlbAorICogVGFza2luZyBFSVNBIGFuZCBJU0EgVGVjaG5pY2FsIFJlZmVyZW5jZSIgIkJldGEgRHJhZnQgMTAvMzAvOTIiIG1hbnVhbAorICogZnJvbSAzY29tLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBFUF9DT01NQU5ECQkweDBlCS8qIFdyaXRlLiBCQVNFKzB4MGUgaXMgYWx3YXlzIGEKKwkJCQkJICogY29tbWFuZCByZWcuICovCisjZGVmaW5lIEVQX1NUQVRVUwkJMHgwZQkvKiBSZWFkLiBCQVNFKzB4MGUgaXMgYWx3YXlzIHN0YXR1cworCQkJCQkgKiByZWcuICovCisjZGVmaW5lIEVQX1dJTkRPVwkJMHgwZgkvKiBSZWFkLiBCQVNFKzB4MGYgaXMgYWx3YXlzIHdpbmRvdworCQkJCQkgKiByZWcuICovCisvKgorICogV2luZG93IDAgcmVnaXN0ZXJzLiBTZXR1cC4KKyAqLworLyogV3JpdGUgKi8KKyNkZWZpbmUgRVBfVzBfRUVQUk9NX0RBVEEJMHgwYworI2RlZmluZSBFUF9XMF9FRVBST01fQ09NTUFORAkweDBhCisjZGVmaW5lIEVQX1cwX1JFU09VUkNFX0NGRwkweDA4CisjZGVmaW5lIEVQX1cwX0FERFJFU1NfQ0ZHCTB4MDYKKyNkZWZpbmUgRVBfVzBfQ09ORklHX0NUUkwJMHgwNAorLyogUmVhZCAqLworI2RlZmluZSBFUF9XMF9QUk9EVUNUX0lECTB4MDIKKyNkZWZpbmUgRVBfVzBfTUZHX0lECQkweDAwCisKKy8qCisgKiBXaW5kb3cgMSByZWdpc3RlcnMuIE9wZXJhdGluZyBTZXQuCisgKi8KKy8qIFdyaXRlICovCisjZGVmaW5lIEVQX1cxX1RYX1BJT19XUl8yCTB4MDIKKyNkZWZpbmUgRVBfVzFfVFhfUElPX1dSXzEJMHgwMAorLyogUmVhZCAqLworI2RlZmluZSBFUF9XMV9GUkVFX1RYCQkweDBjCisjZGVmaW5lIEVQX1cxX1RYX1NUQVRVUwkJMHgwYgkvKiBieXRlICovCisjZGVmaW5lIEVQX1cxX1RJTUVSCQkweDBhCS8qIGJ5dGUgKi8KKyNkZWZpbmUgRVBfVzFfUlhfU1RBVFVTCQkweDA4CisjZGVmaW5lIEVQX1cxX1JYX1BJT19SRF8yCTB4MDIKKyNkZWZpbmUgRVBfVzFfUlhfUElPX1JEXzEJMHgwMAorCisvKgorICogV2luZG93IDIgcmVnaXN0ZXJzLiBTdGF0aW9uIEFkZHJlc3MgU2V0dXAvUmVhZAorICovCisvKiBSZWFkL1dyaXRlICovCisjZGVmaW5lIEVQX1cyX0FERFJfNQkJMHgwNQorI2RlZmluZSBFUF9XMl9BRERSXzQJCTB4MDQKKyNkZWZpbmUgRVBfVzJfQUREUl8zCQkweDAzCisjZGVmaW5lIEVQX1cyX0FERFJfMgkJMHgwMgorI2RlZmluZSBFUF9XMl9BRERSXzEJCTB4MDEKKyNkZWZpbmUgRVBfVzJfQUREUl8wCQkweDAwCisKKy8qCisgKiBXaW5kb3cgMyByZWdpc3RlcnMuICBGSUZPIE1hbmFnZW1lbnQuCisgKi8KKy8qIFJlYWQgKi8KKyNkZWZpbmUgRVBfVzNfRlJFRV9UWAkJMHgwYworI2RlZmluZSBFUF9XM19GUkVFX1JYCQkweDBhCisKKy8qCisgKiBXaW5kb3cgNCByZWdpc3RlcnMuIERpYWdub3N0aWNzLgorICovCisvKiBSZWFkL1dyaXRlICovCisjZGVmaW5lIEVQX1c0X01FRElBX1RZUEUJMHgwYQorI2RlZmluZSBFUF9XNF9DVFJMUl9TVEFUVVMJMHgwOAorI2RlZmluZSBFUF9XNF9ORVRfRElBRwkJMHgwNgorI2RlZmluZSBFUF9XNF9GSUZPX0RJQUcJCTB4MDQKKyNkZWZpbmUgRVBfVzRfSE9TVF9ESUFHCQkweDAyCisjZGVmaW5lIEVQX1c0X1RYX0RJQUcJCTB4MDAKKworLyoKKyAqIFdpbmRvdyA1IFJlZ2lzdGVycy4gIFJlc3VsdHMgYW5kIEludGVybmFsIHN0YXR1cy4KKyAqLworLyogUmVhZCAqLworI2RlZmluZSBFUF9XNV9SRUFEXzBfTUFTSwkweDBjCisjZGVmaW5lIEVQX1c1X0lOVFJfTUFTSwkJMHgwYQorI2RlZmluZSBFUF9XNV9SWF9GSUxURVIJCTB4MDgKKyNkZWZpbmUgRVBfVzVfUlhfRUFSTFlfVEhSRVNICTB4MDYKKyNkZWZpbmUgRVBfVzVfVFhfQVZBSUxfVEhSRVNICTB4MDIKKyNkZWZpbmUgRVBfVzVfVFhfU1RBUlRfVEhSRVNICTB4MDAKKworLyoKKyAqIFdpbmRvdyA2IHJlZ2lzdGVycy4gU3RhdGlzdGljcy4KKyAqLworLyogUmVhZC9Xcml0ZSAqLworI2RlZmluZSBUWF9UT1RBTF9PSwkJMHgwYworI2RlZmluZSBSWF9UT1RBTF9PSwkJMHgwYQorI2RlZmluZSBUWF9ERUZFUlJBTFMJCTB4MDgKKyNkZWZpbmUgUlhfRlJBTUVTX09LCQkweDA3CisjZGVmaW5lIFRYX0ZSQU1FU19PSwkJMHgwNgorI2RlZmluZSBSWF9PVkVSUlVOUwkJMHgwNQorI2RlZmluZSBUWF9DT0xMSVNJT05TCQkweDA0CisjZGVmaW5lIFRYX0FGVEVSXzFfQ09MTElTSU9OCTB4MDMKKyNkZWZpbmUgVFhfQUZURVJfWF9DT0xMSVNJT05TCTB4MDIKKyNkZWZpbmUgVFhfTk9fU1FFCQkweDAxCisjZGVmaW5lIFRYX0NEX0xPU1QJCTB4MDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSZWdpc3RlciBkZWZpbml0aW9ucy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvbW1hbmQgcmVnaXN0ZXIuIEFsbCB3aW5kb3dzLgorICoKKyAqIDE2IGJpdCByZWdpc3Rlci4KKyAqICAgICAxNS0xMTogIDUtYml0IGNvZGUgZm9yIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQuCisgKiAgICAgMTAtMDogICAxMS1iaXQgYXJnIGlmIGFueS4gRm9yIGNvbW1hbmRzIHdpdGggbm8gYXJnczsKKyAqCSAgICAgIHRoaXMgY2FuIGJlIHNldCB0byBhbnl0aGluZy4KKyAqLworI2RlZmluZSBHTE9CQUxfUkVTRVQJCSh1bnNpZ25lZCBzaG9ydCkgMHgwMDAwCS8qIFdhaXQgYXQgbGVhc3QgMW1zCisJCQkJCQkJICogYWZ0ZXIgaXNzdWluZyAqLworI2RlZmluZSBXSU5ET1dfU0VMRUNUCQkodW5zaWduZWQgc2hvcnQpICgweDE8PDExKQorI2RlZmluZSBTVEFSVF9UUkFOU0NFSVZFUgkodW5zaWduZWQgc2hvcnQpICgweDI8PDExKQkvKiBSZWFkIEFERFJfQ0ZHIHJlZyB0bworCQkJCQkJCSAqIGRldGVybWluZSB3aGV0aGVyCisJCQkJCQkJICogdGhpcyBpcyBuZWVkZWQuIElmCisJCQkJCQkJICogc287IHdhaXQgODAwIHVTZWMKKwkJCQkJCQkgKiBiZWZvcmUgdXNpbmcgdHJhbnMtCisJCQkJCQkJICogY2VpdmVyLiAqLworI2RlZmluZSBSWF9ESVNBQkxFCQkodW5zaWduZWQgc2hvcnQpICgweDM8PDExKQkvKiBzdGF0ZSBkaXNhYmxlZCBvbgorCQkJCQkJCSAqIHBvd2VyLXVwICovCisjZGVmaW5lIFJYX0VOQUJMRQkJKHVuc2lnbmVkIHNob3J0KSAoMHg0PDwxMSkKKyNkZWZpbmUgUlhfUkVTRVQJCSh1bnNpZ25lZCBzaG9ydCkgKDB4NTw8MTEpCisjZGVmaW5lIFJYX0RJU0NBUkRfVE9QX1BBQ0sJKHVuc2lnbmVkIHNob3J0KSAoMHg4PDwxMSkKKyNkZWZpbmUgVFhfRU5BQkxFCQkodW5zaWduZWQgc2hvcnQpICgweDk8PDExKQorI2RlZmluZSBUWF9ESVNBQkxFCQkodW5zaWduZWQgc2hvcnQpICgweGE8PDExKQorI2RlZmluZSBUWF9SRVNFVAkJKHVuc2lnbmVkIHNob3J0KSAoMHhiPDwxMSkKKyNkZWZpbmUgUkVRX0lOVFIJCSh1bnNpZ25lZCBzaG9ydCkgKDB4Yzw8MTEpCisjZGVmaW5lIFNFVF9JTlRSX01BU0sJCSh1bnNpZ25lZCBzaG9ydCkgKDB4ZTw8MTEpCisjZGVmaW5lIFNFVF9SRF8wX01BU0sJCSh1bnNpZ25lZCBzaG9ydCkgKDB4Zjw8MTEpCisjZGVmaW5lIFNFVF9SWF9GSUxURVIJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MTA8PDExKQorI2RlZmluZSBGSUxfSU5ESVZJRFVBTAkodW5zaWduZWQgc2hvcnQpICgweDEpCisjZGVmaW5lIEZJTF9HUk9VUAkJKHVuc2lnbmVkIHNob3J0KSAoMHgyKQorI2RlZmluZSBGSUxfQlJEQ1NUCSh1bnNpZ25lZCBzaG9ydCkgKDB4NCkKKyNkZWZpbmUgRklMX0FMTAkJKHVuc2lnbmVkIHNob3J0KSAoMHg4KQorI2RlZmluZSBTRVRfUlhfRUFSTFlfVEhSRVNICSh1bnNpZ25lZCBzaG9ydCkgKDB4MTE8PDExKQorI2RlZmluZSBTRVRfVFhfQVZBSUxfVEhSRVNICSh1bnNpZ25lZCBzaG9ydCkgKDB4MTI8PDExKQorI2RlZmluZSBTRVRfVFhfU1RBUlRfVEhSRVNICSh1bnNpZ25lZCBzaG9ydCkgKDB4MTM8PDExKQorI2RlZmluZSBTVEFUU19FTkFCTEUJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MTU8PDExKQorI2RlZmluZSBTVEFUU19ESVNBQkxFCQkodW5zaWduZWQgc2hvcnQpICgweDE2PDwxMSkKKyNkZWZpbmUgU1RPUF9UUkFOU0NFSVZFUgkodW5zaWduZWQgc2hvcnQpICgweDE3PDwxMSkKKy8qCisgKiBUaGUgZm9sbG93aW5nIENfKiBhY2tub3dsZWRnZSB0aGUgdmFyaW91cyBpbnRlcnJ1cHRzLiBTb21lIG9mIHRoZW0gZG9uJ3QKKyAqIGRvIGFueXRoaW5nLiAgU2VlIHRoZSBtYW51YWwuCisgKi8KKyNkZWZpbmUgQUNLX0lOVFIJCSh1bnNpZ25lZCBzaG9ydCkgKDB4NjgwMCkKKyNkZWZpbmUgQ19JTlRSX0xBVENICSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4MSkKKyNkZWZpbmUgQ19DQVJEX0ZBSUxVUkUJKHVuc2lnbmVkIHNob3J0KSAoQUNLX0lOVFJ8MHgyKQorI2RlZmluZSBDX1RYX0NPTVBMRVRFCSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4NCkKKyNkZWZpbmUgQ19UWF9BVkFJTAkodW5zaWduZWQgc2hvcnQpIChBQ0tfSU5UUnwweDgpCisjZGVmaW5lIENfUlhfQ09NUExFVEUJKHVuc2lnbmVkIHNob3J0KSAoQUNLX0lOVFJ8MHgxMCkKKyNkZWZpbmUgQ19SWF9FQVJMWQkodW5zaWduZWQgc2hvcnQpIChBQ0tfSU5UUnwweDIwKQorI2RlZmluZSBDX0lOVF9SUUQJCSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4NDApCisjZGVmaW5lIENfVVBEX1NUQVRTCSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4ODApCisKKy8qCisgKiBTdGF0dXMgcmVnaXN0ZXIuIEFsbCB3aW5kb3dzLgorICoKKyAqICAgICAxNS0xMzogIFdpbmRvdyBudW1iZXIoMC03KS4KKyAqICAgICAxMjogICAgIENvbW1hbmRfaW5fcHJvZ3Jlc3MuCisgKiAgICAgMTE6ICAgICByZXNlcnZlZC4KKyAqICAgICAxMDogICAgIHJlc2VydmVkLgorICogICAgIDk6ICAgICAgcmVzZXJ2ZWQuCisgKiAgICAgODogICAgICByZXNlcnZlZC4KKyAqICAgICA3OiAgICAgIFVwZGF0ZSBTdGF0aXN0aWNzLgorICogICAgIDY6ICAgICAgSW50ZXJydXB0IFJlcXVlc3RlZC4KKyAqICAgICA1OiAgICAgIFJYIEVhcmx5LgorICogICAgIDQ6ICAgICAgUlggQ29tcGxldGUuCisgKiAgICAgMzogICAgICBUWCBBdmFpbGFibGUuCisgKiAgICAgMjogICAgICBUWCBDb21wbGV0ZS4KKyAqICAgICAxOiAgICAgIEFkYXB0ZXIgRmFpbHVyZS4KKyAqICAgICAwOiAgICAgIEludGVycnVwdCBMYXRjaC4KKyAqLworI2RlZmluZSBTX0lOVFJfTEFUQ0gJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MSkKKyNkZWZpbmUgU19DQVJEX0ZBSUxVUkUJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MikKKyNkZWZpbmUgU19UWF9DT01QTEVURQkJKHVuc2lnbmVkIHNob3J0KSAoMHg0KQorI2RlZmluZSBTX1RYX0FWQUlMCQkodW5zaWduZWQgc2hvcnQpICgweDgpCisjZGVmaW5lIFNfUlhfQ09NUExFVEUJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MTApCisjZGVmaW5lIFNfUlhfRUFSTFkJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MjApCisjZGVmaW5lIFNfSU5UX1JRRAkJKHVuc2lnbmVkIHNob3J0KSAoMHg0MCkKKyNkZWZpbmUgU19VUERfU1RBVFMJCSh1bnNpZ25lZCBzaG9ydCkgKDB4ODApCisjZGVmaW5lIFNfNV9JTlRTCQkoU19DQVJEX0ZBSUxVUkV8U19UWF9DT01QTEVURXxcCisJCQkJIFNfVFhfQVZBSUx8U19SWF9DT01QTEVURXxTX1JYX0VBUkxZKQorI2RlZmluZSBTX0NPTU1BTkRfSU5fUFJPR1JFU1MJKHVuc2lnbmVkIHNob3J0KSAoMHgxMDAwKQorCisvKgorICogRklGTyBSZWdpc3RlcnMuCisgKiBSWCBTdGF0dXMuIFdpbmRvdyAxL1BvcnQgMDgKKyAqCisgKiAgICAgMTU6ICAgICBJbmNvbXBsZXRlIG9yIEZJRk8gZW1wdHkuCisgKiAgICAgMTQ6ICAgICAxOiBFcnJvciBpbiBSWCBQYWNrZXQgICAwOiBJbmNvbXBsZXRlIG9yIG5vIGVycm9yLgorICogICAgIDEzLTExOiAgVHlwZSBvZiBlcnJvci4KKyAqCSAgICAgIDEwMDAgPSBPdmVycnVuLgorICoJICAgICAgMTAxMSA9IFJ1biBQYWNrZXQgRXJyb3IuCisgKgkgICAgICAxMTAwID0gQWxpZ25tZW50IEVycm9yLgorICoJICAgICAgMTEwMSA9IENSQyBFcnJvci4KKyAqCSAgICAgIDEwMDEgPSBPdmVyc2l6ZSBQYWNrZXQgRXJyb3IgKD4xNTE0IGJ5dGVzKQorICoJICAgICAgMDAxMCA9IERyaWJibGUgQml0cy4KKyAqCSAgICAgIChhbGwgb3RoZXIgZXJyb3IgY29kZXMsIG5vIGVycm9ycy4pCisgKgorICogICAgIDEwLTA6ICAgUlggQnl0ZXMgKDAtMTUxNCkKKyAqLworI2RlZmluZSBFUlJfUlhfSU5DT01QTEVURQkodW5zaWduZWQgc2hvcnQpICgweDE8PDE1KQorI2RlZmluZSBFUlJfUlgJCQkodW5zaWduZWQgc2hvcnQpICgweDE8PDE0KQorI2RlZmluZSBFUlJfUlhfT1ZFUlJVTgkJKHVuc2lnbmVkIHNob3J0KSAoMHg4PDwxMSkKKyNkZWZpbmUgRVJSX1JYX1JVTl9QS1QJCSh1bnNpZ25lZCBzaG9ydCkgKDB4Yjw8MTEpCisjZGVmaW5lIEVSUl9SWF9BTElHTgkJKHVuc2lnbmVkIHNob3J0KSAoMHhjPDwxMSkKKyNkZWZpbmUgRVJSX1JYX0NSQwkJKHVuc2lnbmVkIHNob3J0KSAoMHhkPDwxMSkKKyNkZWZpbmUgRVJSX1JYX09WRVJTSVpFCQkodW5zaWduZWQgc2hvcnQpICgweDk8PDExKQorI2RlZmluZSBFUlJfUlhfRFJJQkJMRQkJKHVuc2lnbmVkIHNob3J0KSAoMHgyPDwxMSkKKworLyoKKyAqIEZJRk8gUmVnaXN0ZXJzLgorICogVFggU3RhdHVzLiBXaW5kb3cgMS9Qb3J0IDBCCisgKgorICogICBSZXBvcnRzIHRoZSB0cmFuc21pdCBzdGF0dXMgb2YgYSBjb21wbGV0ZWQgdHJhbnNtaXNzaW9uLiBXcml0aW5nIHRoaXMKKyAqICAgcmVnaXN0ZXIgcG9wcyB0aGUgdHJhbnNtaXQgY29tcGxldGlvbiBzdGFjay4KKyAqCisgKiAgIFdpbmRvdyAxL1BvcnQgMHgwYi4KKyAqCisgKiAgICAgNzogICAgICBDb21wbGV0ZQorICogICAgIDY6ICAgICAgSW50ZXJydXB0IG9uIHN1Y2Nlc3NmdWwgdHJhbnNtaXNzaW9uIHJlcXVlc3RlZC4KKyAqICAgICA1OiAgICAgIEphYmJlciBFcnJvciAoVFAgT25seSwgVFggUmVzZXQgcmVxdWlyZWQuICkKKyAqICAgICA0OiAgICAgIFVuZGVycnVuIChUWCBSZXNldCByZXF1aXJlZC4gKQorICogICAgIDM6ICAgICAgTWF4aW11bSBDb2xsaXNpb25zLgorICogICAgIDI6ICAgICAgVFggU3RhdHVzIE92ZXJmbG93LgorICogICAgIDEtMDogICAgVW5kZWZpbmVkLgorICoKKyAqLworI2RlZmluZSBUWFNfQ09NUExFVEUJCTB4ODAKKyNkZWZpbmUgVFhTX1NVQ0NFU19JTlRSX1JFUQkJMHg0MAorI2RlZmluZSBUWFNfSkFCQkVSCQkweDIwCisjZGVmaW5lIFRYU19VTkRFUlJVTgkJMHgxMAorI2RlZmluZSBUWFNfTUFYX0NPTExJU0lPTgkweDgKKyNkZWZpbmUgVFhTX1NUQVRVU19PVkVSRkxPVwkweDQKKworLyoKKyAqIENvbmZpZ3VyYXRpb24gY29udHJvbCByZWdpc3Rlci4KKyAqIFdpbmRvdyAwL1BvcnQgMDQKKyAqLworLyogUmVhZCAqLworI2RlZmluZSBJU19BVUkJCQkJKDE8PDEzKQorI2RlZmluZSBJU19CTkMJCQkJKDE8PDEyKQorI2RlZmluZSBJU19VVFAJCQkJKDE8PDkpCisvKiBXcml0ZSAqLworI2RlZmluZSBFTkFCTEVfRFJRX0lSUQkJCTB4MDAwMQorI2RlZmluZSBXMF9QNF9DTURfUkVTRVRfQURBUFRFUgkJMHg0CisjZGVmaW5lIFcwX1A0X0NNRF9FTkFCTEVfQURBUFRFUgkweDEKKy8qCisgKiBNZWRpYSB0eXBlIGFuZCBzdGF0dXMuCisgKiBXaW5kb3cgNC9Qb3J0IDBBCisgKi8KKyNkZWZpbmUgRU5BQkxFX1VUUAkJCTB4YzAKKyNkZWZpbmUgRElTQUJMRV9VVFAJCQkweDAKKworLyoKKyAqIFJlc291cmNlIGNvbnRyb2wgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIFNFVF9JUlEoaSkJKCAoKGkpPDwxMikgfCAweEYwMCkgLyogc2V0IElSUSBpICovCisKKy8qCisgKiBSZWNlaXZlIHN0YXR1cyByZWdpc3RlcgorICovCisKKyNkZWZpbmUgUlhfQllURVNfTUFTSwkJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MDdmZikKKyNkZWZpbmUgUlhfRVJST1IJMHg0MDAwCisjZGVmaW5lIFJYX0lOQ09NUExFVEUJMHg4MDAwCisKKworLyoKKyAqIE1pc2MgZGVmaW5lcyBmb3IgdmFyaW91cyB0aGluZ3MuCisgKi8KKyNkZWZpbmUgQUNUSVZBVEVfQURBUFRFUl9UT19DT05GSUcJMHhmZiAvKiB0byB0aGUgaWRfcG9ydCAqLworI2RlZmluZSBNRkdfSUQJCQkJMHg2ZDUwIC8qIGluIEVFUFJPTSBhbmQgVzAgQUREUl9DT05GSUcgKi8KKyNkZWZpbmUgUFJPRF9JRAkJCQkweDkxNTAKKworI2RlZmluZSBBVUkJCQkJMHgxCisjZGVmaW5lIEJOQwkJCQkweDIKKyNkZWZpbmUgVVRQCQkJCTB4NAorCisjZGVmaW5lIFJYX0JZVEVTX01BU0sJCQkodW5zaWduZWQgc2hvcnQpICgweDA3ZmYpCisKKyAvKiBFSVNBIHN1cHBvcnQgKi8KKyNkZWZpbmUgRVBfRUlTQV9TVEFSVAkJCTB4MTAwMAorI2RlZmluZSBFUF9FSVNBX1cwCQkJMHgwYzgwCisKKyNpZmRlZglJTkNMVURFXzNDNTI5CisgLyogTUNBIHN1cHBvcnQgKi8KKyNkZWZpbmUgTUNBX01PVEhFUkJPQVJEX1NFVFVQX1JFRwkweDk0CisjZGVmaW5lIE1DQV9BREFQVEVSX1NFVFVQX1JFRwkJMHg5NgorI2RlZmluZSBNQ0FfTUFYX1NMT1RfTlIJCQk4CisjZGVmaW5lIE1DQV9QT1NfUkVHKG4pCQkJKDB4MTAwKyhuKSkKKyNlbmRpZgorCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL25ldGJvb3QvM2M1OTUuYyBiL25ldGJvb3QvM2M1OTUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTA0ZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC8zYzU5NS5jCkBAIC0wLDAgKzEsNTAzIEBACisvKgorKiAzYzU5NS5jIC0tIDNDT00gM0M1OTUgRmFzdCBFdGhlcmxpbmsgSUlJIFBDSSBkcml2ZXIgZm9yIGV0aGVyYm9vdAorKgorKiBDb3B5cmlnaHQgKEMpIDIwMDAgU2h1c3VrZSBOaXNpeWFtYSA8c2h1QGF0aGVuYS5xZS5lbmcuaG9rdWRhaS5hYy5qcD4KKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogTWFyLiAxNCwgMjAwMAorKgorKiAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCwgbW9kaWZpZWQsIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBzb2xkLCBpbgorKiAgYm90aCBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBhbmQgdGhlc2UKKyogIHRlcm1zIGFyZSByZXRhaW5lZC4gVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBhcmUgdGhlIGF1dGhvcnMgcmVzcG9uc2libGUgZm9yCisqICB0aGUgcHJvcGVyIGZ1bmN0aW9uaW5nIG9mIHRoaXMgc29mdHdhcmUsIG5vciBkbyB0aGUgYXV0aG9ycyBhc3N1bWUgYW55CisqICByZXNwb25zaWJpbGl0eSBmb3IgZGFtYWdlcyBpbmN1cnJlZCB3aXRoIGl0cyB1c2UuCisqCisqIFRoaXMgY29kZSBpcyBiYXNlZCBvbiBNYXJ0aW4gUmVudGVycycgZXRoZXJib290LTQuNC4zIDNjNTA5LmMgYW5kIAorKiBIZXJiIFBleWVybCdzIEZyZWVCU0QgMy40LVJFTEVBU0UgaWZfdnguYyBkcml2ZXIuCisqCisqICBDb3B5cmlnaHQgKEMpIDE5OTMtMTk5NCwgRGF2aWQgR3JlZW5tYW4sIE1hcnRpbiBSZW50ZXJzLgorKiAgQ29weXJpZ2h0IChDKSAxOTkzLTE5OTUsIEFuZHJlcyBWZWdhIEdhcmNpYS4KKyogIENvcHlyaWdodCAoQykgMTk5NSwgU2VyZ2UgQmFia2luLgorKgorKiAgQ29weXJpZ2h0IChjKSAxOTk0IEhlcmIgUGV5ZXJsIDxocGV5ZXJsQG5vdmF0ZWwuY2E+CisqCisqLworCisvKiAjZGVmaW5lIEVERUJVRyAqLworCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisjaW5jbHVkZSAibmljLmgiCisjaW5jbHVkZSAicGNpLmgiCisjaW5jbHVkZSAiM2M1OTUuaCIKKyNpbmNsdWRlICJ0aW1lci5oIgorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQJZXRoX25pY19iYXNlLCBldGhfYXNpY19iYXNlOworc3RhdGljIHVuc2lnbmVkIHNob3J0CXZ4X2Nvbm5lY3RvciwgdnhfY29ubmVjdG9yczsKKworc3RhdGljIHN0cnVjdCBjb25uZWN0b3JfZW50cnkgeworICBpbnQgYml0OworICBjaGFyICpuYW1lOworfSBjb25uX3RhYltWWF9DT05ORUNUT1JTXSA9IHsKKyNkZWZpbmUgQ09OTkVDVE9SX1VUUCAgIDAKKyAgeyAweDA4LCAidXRwIn0sCisjZGVmaW5lIENPTk5FQ1RPUl9BVUkgICAxCisgIHsgMHgyMCwgImF1aSJ9LAorLyogZHVtbXkgKi8KKyAgeyAwLCAiPz8/In0sCisjZGVmaW5lIENPTk5FQ1RPUl9CTkMgICAzCisgIHsgMHgxMCwgImJuYyJ9LAorI2RlZmluZSBDT05ORUNUT1JfVFggICAgNAorICB7IDB4MDIsICJ0eCJ9LAorI2RlZmluZSBDT05ORUNUT1JfRlggICAgNQorICB7IDB4MDQsICJmeCJ9LAorI2RlZmluZSBDT05ORUNUT1JfTUlJICAgNgorICB7IDB4NDAsICJtaWkifSwKKyAgeyAwLCAiPz8/In0KK307CisKK3N0YXRpYyB2b2lkIHZ4Z2V0bGluayh2b2lkKTsKK3N0YXRpYyB2b2lkIHZ4c2V0bGluayh2b2lkKTsKKworI2RlZmluZQl1ZGVsYXkobikJd2FpdG9uX3RpbWVyMigoKG4pKlRJQ0tTX1BFUl9NUykvMTAwMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitFVEhfUkVTRVQgLSBSZXNldCBhZGFwdGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB0NTk1X3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKK3sKKwlpbnQgaSwgajsKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkJUmVzZXQgM0NvbSA1OTUgY2FyZAorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkvKiBzdG9wIGNhcmQgKi8KKwlvdXR3KFJYX0RJU0FCTEUsIEJBU0UgKyBWWF9DT01NQU5EKTsKKwlvdXR3KFJYX0RJU0NBUkRfVE9QX1BBQ0ssIEJBU0UgKyBWWF9DT01NQU5EKTsKKwlWWF9CVVNZX1dBSVQ7CisJb3V0dyhUWF9ESVNBQkxFLCBCQVNFICsgVlhfQ09NTUFORCk7CisJb3V0dyhTVE9QX1RSQU5TQ0VJVkVSLCBCQVNFICsgVlhfQ09NTUFORCk7CisJdWRlbGF5KDgwMDApOworCW91dHcoUlhfUkVTRVQsIEJBU0UgKyBWWF9DT01NQU5EKTsKKwlWWF9CVVNZX1dBSVQ7CisJb3V0dyhUWF9SRVNFVCwgQkFTRSArIFZYX0NPTU1BTkQpOworCVZYX0JVU1lfV0FJVDsKKwlvdXR3KENfSU5UUl9MQVRDSCwgQkFTRSArIFZYX0NPTU1BTkQpOworCW91dHcoU0VUX1JEXzBfTUFTSywgQkFTRSArIFZYX0NPTU1BTkQpOworCW91dHcoU0VUX0lOVFJfTUFTSywgQkFTRSArIFZYX0NPTU1BTkQpOworCW91dHcoU0VUX1JYX0ZJTFRFUiwgQkFTRSArIFZYX0NPTU1BTkQpOworCisJLyoKKwkqIGluaXRpYWxpemUgY2FyZAorCSovCisJVlhfQlVTWV9XQUlUOworCisJR09fV0lORE9XKDApOworCisJLyogRGlzYWJsZSB0aGUgY2FyZCAqLworLyoJb3V0dygwLCBCQVNFICsgVlhfVzBfQ09ORklHX0NUUkwpOyAqLworCisJLyogQ29uZmlndXJlIElSUSB0byBub25lICovCisvKglvdXR3KFNFVF9JUlEoMCksIEJBU0UgKyBWWF9XMF9SRVNPVVJDRV9DRkcpOyAqLworCisJLyogRW5hYmxlIHRoZSBjYXJkICovCisvKglvdXR3KEVOQUJMRV9EUlFfSVJRLCBCQVNFICsgVlhfVzBfQ09ORklHX0NUUkwpOyAqLworCisJR09fV0lORE9XKDIpOworCisJLyogUmVsb2FkIHRoZSBldGhlcl9hZGRyLiAqLworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQorCQlvdXRiKG5pYy0+bm9kZV9hZGRyW2ldLCBCQVNFICsgVlhfVzJfQUREUl8wICsgaSk7CisKKwlvdXR3KFJYX1JFU0VULCBCQVNFICsgVlhfQ09NTUFORCk7CisJVlhfQlVTWV9XQUlUOworCW91dHcoVFhfUkVTRVQsIEJBU0UgKyBWWF9DT01NQU5EKTsKKwlWWF9CVVNZX1dBSVQ7CisKKwkvKiBXaW5kb3cgMSBpcyBvcGVyYXRpbmcgd2luZG93ICovCisJR09fV0lORE9XKDEpOworCWZvciAoaSA9IDA7IGkgPCAzMTsgaSsrKQorCQlpbmIoQkFTRSArIFZYX1cxX1RYX1NUQVRVUyk7CisKKwlvdXR3KFNFVF9SRF8wX01BU0sgfCBTX0NBUkRfRkFJTFVSRSB8IFNfUlhfQ09NUExFVEUgfAorCQlTX1RYX0NPTVBMRVRFIHwgU19UWF9BVkFJTCwgQkFTRSArIFZYX0NPTU1BTkQpOworCW91dHcoU0VUX0lOVFJfTUFTSyB8IFNfQ0FSRF9GQUlMVVJFIHwgU19SWF9DT01QTEVURSB8CisJCVNfVFhfQ09NUExFVEUgfCBTX1RYX0FWQUlMLCBCQVNFICsgVlhfQ09NTUFORCk7CisKKy8qCisgKiBBdHRlbXB0IHRvIGdldCByaWQgb2YgYW55IHN0cmF5IGludGVycnVwdHMgdGhhdCBvY2N1cmVkIGR1cmluZworICogY29uZmlndXJhdGlvbi4gIE9uIHRoZSBpMzg2IHRoaXMgaXNuJ3QgcG9zc2libGUgYmVjYXVzZSBvbmUgbWF5CisgKiBhbHJlYWR5IGJlIHF1ZXVlZC4gIEhvd2V2ZXIsIGEgc2luZ2xlIHN0cmF5IGludGVycnVwdCBpcworICogdW5pbXBvcnRhbnQuCisgKi8KKworCW91dHcoQUNLX0lOVFIgfCAweGZmLCBCQVNFICsgVlhfQ09NTUFORCk7CisKKwlvdXR3KFNFVF9SWF9GSUxURVIgfCBGSUxfSU5ESVZJRFVBTCB8CisJICAgIEZJTF9CUkRDU1QsIEJBU0UgKyBWWF9DT01NQU5EKTsKKworCXZ4c2V0bGluaygpOworLyp7CisJaW50IGksajsKKwlpID0gQ09OTkVDVE9SX1RYOworCUdPX1dJTkRPVygzKTsKKwlqID0gaW5sKEJBU0UgKyBWWF9XM19JTlRFUk5BTF9DRkcpICYgfklOVEVSTkFMX0NPTk5FQ1RPUl9NQVNLOworCW91dGwoQkFTRSArIFZYX1czX0lOVEVSTkFMX0NGRywgaiB8IChpIDw8SU5URVJOQUxfQ09OTkVDVE9SX0JJVFMpKTsKKyAgICAgICAgR09fV0lORE9XKDQpOworICAgICAgICBvdXR3KExJTktCRUFUX0VOQUJMRSwgQkFTRSArIFZYX1c0X01FRElBX1RZUEUpOworICAgICAgICBHT19XSU5ET1coMSk7Cit9Ki8KKworCS8qIHN0YXJ0IHRyYW5jaWV2ZXIgYW5kIHJlY2VpdmVyICovCisJb3V0dyhSWF9FTkFCTEUsIEJBU0UgKyBWWF9DT01NQU5EKTsKKwlvdXR3KFRYX0VOQUJMRSwgQkFTRSArIFZYX0NPTU1BTkQpOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIX1RSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGNoYXIgcGFkbWFwW10gPSB7CisJMCwgMywgMiwgMX07CisKK3N0YXRpYyB2b2lkIHQ1OTVfdHJhbnNtaXQoCitzdHJ1Y3QgbmljICpuaWMsCitjb25zdCBjaGFyICpkLAkJCS8qIERlc3RpbmF0aW9uICovCit1bnNpZ25lZCBpbnQgdCwJCQkvKiBUeXBlICovCit1bnNpZ25lZCBpbnQgcywJCQkvKiBzaXplICovCitjb25zdCBjaGFyICpwKQkJCS8qIFBhY2tldCAqLworeworCXJlZ2lzdGVyIGludCBsZW47CisJaW50IHBhZDsKKwlpbnQgc3RhdHVzOworCisjaWZkZWYgRURFQlVHCisJcHJpbnRmKCJ7bD0lZCx0PSVoWH0iLHMrRVRIX0hMRU4sdCk7CisjZW5kaWYKKworCS8qIHN3YXAgYnl0ZXMgb2YgdHlwZSAqLworCXQ9IGh0b25zKHQpOworCisJbGVuPXMrRVRIX0hMRU47IC8qIGFjdHVhbCBsZW5ndGggb2YgcGFja2V0ICovCisJcGFkID0gcGFkbWFwW2xlbiAmIDNdOworCisJLyoKKwkqIFRoZSAzYzU5NSBhdXRvbWF0aWNhbGx5IHBhZHMgc2hvcnQgcGFja2V0cyB0byBtaW5pbXVtIGV0aGVybmV0IGxlbmd0aCwKKwkqIGJ1dCB3ZSBkcm9wIHBhY2tldHMgdGhhdCBhcmUgdG9vIGxhcmdlLiBQZXJoYXBzIHdlIHNob3VsZCB0cnVuY2F0ZQorCSogdGhlbSBpbnN0ZWFkPworCSovCisJaWYgKGxlbiArIHBhZCA+IEVUSF9GUkFNRV9MRU4pIHsKKwkJcmV0dXJuOworCX0KKworCS8qIGRyb3AgYWNrbm93bGVkZ2VtZW50cyAqLworCXdoaWxlKCggc3RhdHVzPWluYihCQVNFICsgVlhfVzFfVFhfU1RBVFVTKSApJiBUWFNfQ09NUExFVEUgKSB7CisJCWlmKHN0YXR1cyAmIChUWFNfVU5ERVJSVU58VFhTX01BWF9DT0xMSVNJT058VFhTX1NUQVRVU19PVkVSRkxPVykpIHsKKwkJCW91dHcoVFhfUkVTRVQsIEJBU0UgKyBWWF9DT01NQU5EKTsKKwkJCW91dHcoVFhfRU5BQkxFLCBCQVNFICsgVlhfQ09NTUFORCk7CisJCX0KKworCQlvdXRiKDB4MCwgQkFTRSArIFZYX1cxX1RYX1NUQVRVUyk7CisJfQorCisJd2hpbGUgKGludyhCQVNFICsgVlhfVzFfRlJFRV9UWCkgPCBsZW4gKyBwYWQgKyA0KSB7CisJCS8qIG5vIHJvb20gaW4gRklGTyAqLworCX0KKworCW91dHcobGVuLCBCQVNFICsgVlhfVzFfVFhfUElPX1dSXzEpOworCW91dHcoMHgwLCBCQVNFICsgVlhfVzFfVFhfUElPX1dSXzEpOwkvKiBTZWNvbmQgZHdvcmQgbWVhbmluZ2xlc3MgKi8KKworCS8qIHdyaXRlIHBhY2tldCAqLworCW91dHN3KEJBU0UgKyBWWF9XMV9UWF9QSU9fV1JfMSwgZCwgRVRIX0FMRU4vMik7CisJb3V0c3coQkFTRSArIFZYX1cxX1RYX1BJT19XUl8xLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4vMik7CisJb3V0dyh0LCBCQVNFICsgVlhfVzFfVFhfUElPX1dSXzEpOworCW91dHN3KEJBU0UgKyBWWF9XMV9UWF9QSU9fV1JfMSwgcCwgcyAvIDIpOworCWlmIChzICYgMSkKKwkJb3V0YigqKHArcyAtIDEpLCBCQVNFICsgVlhfVzFfVFhfUElPX1dSXzEpOworCisJd2hpbGUgKHBhZC0tKQorCQlvdXRiKDAsIEJBU0UgKyBWWF9XMV9UWF9QSU9fV1JfMSk7CS8qIFBhZGRpbmcgKi8KKworICAgICAgICAvKiB3YWl0IGZvciBUeCBjb21wbGV0ZSAqLworICAgICAgICB3aGlsZSgoaW53KEJBU0UgKyBWWF9TVEFUVVMpICYgU19DT01NQU5EX0lOX1BST0dSRVNTKSAhPSAwKQorICAgICAgICAgICAgICAgIDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitFVEhfUE9MTCAtIFdhaXQgZm9yIGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgdDU5NV9wb2xsKHN0cnVjdCBuaWMgKm5pYykKK3sKKwkvKiBjb21tb24gdmFyaWFibGVzICovCisJdW5zaWduZWQgc2hvcnQgdHlwZSA9IDA7CS8qIHVzZWQgYnkgRURFQlVHICovCisJLyogdmFyaWFibGVzIGZvciAzQzU5NSAqLworCXNob3J0IHN0YXR1cywgY3N0OworCXJlZ2lzdGVyIHNob3J0IHJ4X2ZpZm87CisKKwljc3Q9aW53KEJBU0UgKyBWWF9TVEFUVVMpOworCisjaWZkZWYgRURFQlVHCisJaWYoY3N0ICYgMHgxRkZGKQorCQlwcmludGYoIi0laFgtIixjc3QpOworI2VuZGlmCisKKwlpZiggKGNzdCAmIFNfUlhfQ09NUExFVEUpPT0wICkgeworCQkvKiBhY2tub3dsZWRnZSAgZXZlcnl0aGluZyAqLworCQlvdXR3KEFDS19JTlRSIHwgY3N0LCBCQVNFICsgVlhfQ09NTUFORCk7CisJCW91dHcoQ19JTlRSX0xBVENILCBCQVNFICsgVlhfQ09NTUFORCk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJc3RhdHVzID0gaW53KEJBU0UgKyBWWF9XMV9SWF9TVEFUVVMpOworI2lmZGVmIEVERUJVRworCXByaW50ZigiKiVoWCoiLHN0YXR1cyk7CisjZW5kaWYKKworCWlmIChzdGF0dXMgJiBFUlJfUlgpIHsKKwkJb3V0dyhSWF9ESVNDQVJEX1RPUF9QQUNLLCBCQVNFICsgVlhfQ09NTUFORCk7CisJCXJldHVybiAwOworCX0KKworCXJ4X2ZpZm8gPSBzdGF0dXMgJiBSWF9CWVRFU19NQVNLOworCWlmIChyeF9maWZvPT0wKQorCQlyZXR1cm4gMDsKKworCQkvKiByZWFkIHBhY2tldCAqLworI2lmZGVmIEVERUJVRworCXByaW50ZigiW2w9JWQiLHJ4X2ZpZm8pOworI2VuZGlmCisJaW5zdyhCQVNFICsgVlhfVzFfUlhfUElPX1JEXzEsIG5pYy0+cGFja2V0LCByeF9maWZvIC8gMik7CisJaWYocnhfZmlmbyAmIDEpCisJCW5pYy0+cGFja2V0W3J4X2ZpZm8tMV09aW5iKEJBU0UgKyBWWF9XMV9SWF9QSU9fUkRfMSk7CisJbmljLT5wYWNrZXRsZW49cnhfZmlmbzsKKworCXdoaWxlKDEpIHsKKwkJc3RhdHVzID0gaW53KEJBU0UgKyBWWF9XMV9SWF9TVEFUVVMpOworI2lmZGVmIEVERUJVRworCQlwcmludGYoIiolaFgqIixzdGF0dXMpOworI2VuZGlmCisJCXJ4X2ZpZm8gPSBzdGF0dXMgJiBSWF9CWVRFU19NQVNLOworCisJCWlmKHJ4X2ZpZm8+MCkgeworCQkJaW5zdyhCQVNFICsgVlhfVzFfUlhfUElPX1JEXzEsIG5pYy0+cGFja2V0K25pYy0+cGFja2V0bGVuLCByeF9maWZvIC8gMik7CisJCQlpZihyeF9maWZvICYgMSkKKwkJCQluaWMtPnBhY2tldFtuaWMtPnBhY2tldGxlbityeF9maWZvLTFdPWluYihCQVNFICsgVlhfVzFfUlhfUElPX1JEXzEpOworCQkJbmljLT5wYWNrZXRsZW4rPXJ4X2ZpZm87CisjaWZkZWYgRURFQlVHCisJCQlwcmludGYoIislZCIscnhfZmlmbyk7CisjZW5kaWYKKwkJfQorCQlpZigoIHN0YXR1cyAmIFJYX0lOQ09NUExFVEUgKT09MCkgeworI2lmZGVmIEVERUJVRworCQkJcHJpbnRmKCI9JWQiLG5pYy0+cGFja2V0bGVuKTsKKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KDEwMDApOworCX0KKworCS8qIGFja25vd2xlZGdlIHJlY2VwdGlvbiBvZiBwYWNrZXQgKi8KKwlvdXR3KFJYX0RJU0NBUkRfVE9QX1BBQ0ssIEJBU0UgKyBWWF9DT01NQU5EKTsKKwl3aGlsZSAoaW53KEJBU0UgKyBWWF9TVEFUVVMpICYgU19DT01NQU5EX0lOX1BST0dSRVNTKTsKKyNpZmRlZiBFREVCVUcKKwl0eXBlID0gKG5pYy0+cGFja2V0WzEyXTw8OCkgfCBuaWMtPnBhY2tldFsxM107CisJaWYobmljLT5wYWNrZXRbMF0rbmljLT5wYWNrZXRbMV0rbmljLT5wYWNrZXRbMl0rbmljLT5wYWNrZXRbM10rbmljLT5wYWNrZXRbNF0rCisJICAgIG5pYy0+cGFja2V0WzVdID09IDB4RkYqRVRIX0FMRU4pCisJCXByaW50ZigiLHQ9JWhYLGJdIix0eXBlKTsKKwllbHNlCisJCXByaW50ZigiLHQ9JWhYXSIsdHlwZSk7CisjZW5kaWYKKwlyZXR1cm4gMTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCTNDb20gNTk1IC0gc3BlY2lmaWMgcm91dGluZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50CitlZXByb21fcmR5KCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGlzX2VlcHJvbV9idXN5KEJBU0UpICYmIGkgPCBNQVhfRUVQUk9NQlVTWTsgaSsrKQorCQl1ZGVsYXkoMTAwMCk7CisJaWYgKGkgPj0gTUFYX0VFUFJPTUJVU1kpIHsKKwkgICAgICAgIC8qIHByaW50ZigiM2M1OTU6IGVlcHJvbSBmYWlsZWQgdG8gY29tZSByZWFkeS5cbiIpOyAqLworCQlwcmludGYoIjNjNTk1OiBlZXByb20gaXMgYnVzeS5cbiIpOyAvKiBtZW1vcnkgaW4gRVBST00gaXMgdGlnaHQgKi8KKwkJcmV0dXJuICgwKTsKKwl9CisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIGdldF9lOiBnZXRzIGEgMTYgYml0cyB3b3JkIGZyb20gdGhlIEVFUFJPTS4gd2UgbXVzdCBoYXZlIHNldCB0aGUgd2luZG93CisgKiBiZWZvcmUKKyAqLworc3RhdGljIGludAorZ2V0X2Uob2Zmc2V0KQoraW50IG9mZnNldDsKK3sKKwlpZiAoIWVlcHJvbV9yZHkoKSkKKwkJcmV0dXJuICgweGZmZmYpOworCW91dHcoRUVQUk9NX0NNRF9SRCB8IG9mZnNldCwgQkFTRSArIFZYX1cwX0VFUFJPTV9DT01NQU5EKTsKKwlpZiAoIWVlcHJvbV9yZHkoKSkKKwkJcmV0dXJuICgweGZmZmYpOworCXJldHVybiAoaW53KEJBU0UgKyBWWF9XMF9FRVBST01fREFUQSkpOworfQorCitzdGF0aWMgdm9pZCAgICAgICAgICAgIAordnhnZXRsaW5rKHZvaWQpCit7CisgICAgaW50IG4sIGs7CisKKyAgICBHT19XSU5ET1coMyk7CisgICAgdnhfY29ubmVjdG9ycyA9IGludyhCQVNFICsgVlhfVzNfUkVTRVRfT1BUKSAmIDB4N2Y7CisgICAgZm9yIChuID0gMCwgayA9IDA7IGsgPCBWWF9DT05ORUNUT1JTOyBrKyspIHsKKyAgICAgIGlmICh2eF9jb25uZWN0b3JzICYgY29ubl90YWJba10uYml0KSB7CisgICAgICAgIGlmIChuID4gMCkgeworICAgICAgICAgIHByaW50ZigiLyIpOworCX0KKyAgICAgICAgcHJpbnRmKGNvbm5fdGFiW2tdLm5hbWUpOworICAgICAgICBuKys7CisgICAgICB9CisgICAgfQorICAgIGlmICh2eF9jb25uZWN0b3JzID09IDApIHsKKyAgICAgICAgcHJpbnRmKCJubyBjb25uZWN0b3JzISIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEdPX1dJTkRPVygzKTsKKyAgICB2eF9jb25uZWN0b3IgPSAoaW5sKEJBU0UgKyBWWF9XM19JTlRFUk5BTF9DRkcpIAorICAgICAgICAgICAgICAgICAgICAgICAgJiBJTlRFUk5BTF9DT05ORUNUT1JfTUFTSykgCisgICAgICAgICAgICAgICAgICAgICAgICA+PiBJTlRFUk5BTF9DT05ORUNUT1JfQklUUzsKKyAgICBpZiAodnhfY29ubmVjdG9yICYgMHgxMCkgeworICAgICAgICB2eF9jb25uZWN0b3IgJj0gMHgwZjsKKyAgICAgICAgcHJpbnRmKCJbKiVzKl0iLCBjb25uX3RhYlt2eF9jb25uZWN0b3JdLm5hbWUpOworICAgICAgICBwcmludGYoIjogZGlzYWJsZSAnYXV0byBzZWxlY3QnIHdpdGggRE9TIHV0aWwhIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJbKiVzKl0iLCBjb25uX3RhYlt2eF9jb25uZWN0b3JdLm5hbWUpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgICAgICAgICAgICAKK3Z4c2V0bGluayh2b2lkKQoreyAgICAgICAKKyAgICBpbnQgaSwgaiwgazsKKyAgICBjaGFyICpyZWFzb24sICp3YXJuaW5nOworICAgIHN0YXRpYyBzaG9ydCBwcmV2X2ZsYWdzOworICAgIHN0YXRpYyBjaGFyIHByZXZfY29ubiA9IC0xOworCisgICAgaWYgKHByZXZfY29ubiA9PSAtMSkgeworICAgICAgICBwcmV2X2Nvbm4gPSB2eF9jb25uZWN0b3I7CisgICAgfQorCisgICAgaSA9IHZ4X2Nvbm5lY3RvcjsgICAgICAgLyogZGVmYXVsdCBpbiBFRVBST00gKi8KKyAgICByZWFzb24gPSAiZGVmYXVsdCI7CisgICAgd2FybmluZyA9IDA7CisKKyAgICBpZiAoKHZ4X2Nvbm5lY3RvcnMgJiBjb25uX3RhYlt2eF9jb25uZWN0b3JdLmJpdCkgPT0gMCkgeworICAgICAgICB3YXJuaW5nID0gInN0cmFuZ2UgY29ubmVjdG9yIHR5cGUgaW4gRUVQUk9NLiI7CisgICAgICAgIHJlYXNvbiA9ICJmb3JjZWQiOworICAgICAgICBpID0gQ09OTkVDVE9SX1VUUDsKKyAgICB9CisKKyAgICAgICAgaWYgKHdhcm5pbmcgIT0gMCkgeworICAgICAgICAgICAgcHJpbnRmKCJ3YXJuaW5nOiAlc1xuIiwgd2FybmluZyk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJzZWxlY3RlZCAlcy4gKCVzKVxuIiwgY29ubl90YWJbaV0ubmFtZSwgcmVhc29uKTsKKworICAgIC8qIFNldCB0aGUgc2VsZWN0ZWQgY29ubmVjdG9yLiAqLworICAgIEdPX1dJTkRPVygzKTsKKyAgICBqID0gaW5sKEJBU0UgKyBWWF9XM19JTlRFUk5BTF9DRkcpICYgfklOVEVSTkFMX0NPTk5FQ1RPUl9NQVNLOworICAgIG91dGwoaiB8IChpIDw8SU5URVJOQUxfQ09OTkVDVE9SX0JJVFMpLCBCQVNFICsgVlhfVzNfSU5URVJOQUxfQ0ZHKTsKKworICAgIC8qIEZpcnN0LCBkaXNhYmxlIGFsbC4gKi8KKyAgICBvdXR3KFNUT1BfVFJBTlNDRUlWRVIsIEJBU0UgKyBWWF9DT01NQU5EKTsKKyAgICB1ZGVsYXkoODAwMCk7CisgICAgR09fV0lORE9XKDQpOworICAgIG91dHcoMCwgQkFTRSArIFZYX1c0X01FRElBX1RZUEUpOworCisgICAgLyogU2Vjb25kLCBlbmFibGUgdGhlIHNlbGVjdGVkIG9uZS4gKi8KKyAgICBzd2l0Y2goaSkgeworICAgICAgY2FzZSBDT05ORUNUT1JfVVRQOgorICAgICAgICBHT19XSU5ET1coNCk7CisgICAgICAgIG91dHcoRU5BQkxFX1VUUCwgQkFTRSArIFZYX1c0X01FRElBX1RZUEUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ09OTkVDVE9SX0JOQzoKKyAgICAgICAgb3V0dyhTVEFSVF9UUkFOU0NFSVZFUixCQVNFICsgVlhfQ09NTUFORCk7CisgICAgICAgIHVkZWxheSg4MDAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENPTk5FQ1RPUl9UWDoKKyAgICAgIGNhc2UgQ09OTkVDVE9SX0ZYOgorICAgICAgICBHT19XSU5ET1coNCk7CisgICAgICAgIG91dHcoTElOS0JFQVRfRU5BQkxFLCBCQVNFICsgVlhfVzRfTUVESUFfVFlQRSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogIC8qIEFVSSBhbmQgTUlJIGZhbGwgaGVyZSAqLworICAgICAgICBicmVhazsKKyAgICB9CisgICAgR09fV0lORE9XKDEpOyAKK30KKworc3RhdGljIHZvaWQgdDU5NV9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYykKK3sKKyAgICBvdXR3KFNUT1BfVFJBTlNDRUlWRVIsIEJBU0UgKyBWWF9DT01NQU5EKTsKKyAgICB1ZGVsYXkoODAwMCk7CisgICAgR09fV0lORE9XKDQpOworICAgIG91dHcoMCwgQkFTRSArIFZYX1c0X01FRElBX1RZUEUpOworICAgIEdPX1dJTkRPVygxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitFVEhfUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgbmljICp0NTk1X3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlYWRkcnMsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCit7CisJaW50IGk7CisJdW5zaWduZWQgc2hvcnQgKnA7CisKKwlpZiAocHJvYmVhZGRycyA9PSAwIHx8IHByb2JlYWRkcnNbMF0gPT0gMCkKKwkJcmV0dXJuIDA7CisvKglldGhfbmljX2Jhc2UgPSBwcm9iZWFkZHJzWzBdICYgfjM7ICovCisJZXRoX25pY19iYXNlID0gcGNpLT5pb2FkZHI7CisKKwlHT19XSU5ET1coMCk7CisJb3V0dyhHTE9CQUxfUkVTRVQsIEJBU0UgKyBWWF9DT01NQU5EKTsKKwlWWF9CVVNZX1dBSVQ7CisKKwl2eGdldGxpbmsoKTsKKworLyoKKwlwcmludGYoIlxuRUVQUk9NOiIpOworCWZvciAoaSA9IDA7IGkgPCAoRUVQUk9NU0laRS8yKTsgaSsrKSB7CisJICBwcmludGYoIiVoWDoiLCBnZXRfZShpKSk7CisJfQorCXByaW50ZigiXG4iKTsKKyovCisJLyoKKwkqIFJlYWQgdGhlIHN0YXRpb24gYWRkcmVzcyBmcm9tIHRoZSBlZXByb20KKwkqLworCXAgPSAodW5zaWduZWQgc2hvcnQgKikgbmljLT5ub2RlX2FkZHI7CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlHT19XSU5ET1coMCk7CisJCXBbaV0gPSBodG9ucyhnZXRfZShFRVBST01fT0VNX0FERFJfMCArIGkpKTsKKwkJR09fV0lORE9XKDIpOworCQlvdXR3KG50b2hzKHBbaV0pLCBCQVNFICsgVlhfVzJfQUREUl8wICsgKGkgKiAyKSk7CisJfQorCisJcHJpbnRmKCJFdGhlcm5ldCBhZGRyZXNzOiAlIVxuIiwgbmljLT5ub2RlX2FkZHIpOworCisJdDU5NV9yZXNldChuaWMpOworCW5pYy0+cmVzZXQgPSB0NTk1X3Jlc2V0OworCW5pYy0+cG9sbCA9IHQ1OTVfcG9sbDsKKwluaWMtPnRyYW5zbWl0ID0gdDU5NV90cmFuc21pdDsKKwluaWMtPmRpc2FibGUgPSB0NTk1X2Rpc2FibGU7CisJcmV0dXJuIG5pYzsKKworfQorCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KKwpkaWZmIC0tZ2l0IGEvbmV0Ym9vdC8zYzU5NS5oIGIvbmV0Ym9vdC8zYzU5NS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZDhkOWIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290LzNjNTk1LmgKQEAgLTAsMCArMSw0MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMgSGVyYiBQZXllcmwgKGhwZXllcmxAbm92YXRlbC5jYSkgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gMi4gVGhlIG5hbWUKKyAqIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8KKyAqIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorICogVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorIE9jdG9iZXIgMiwgMTk5NAorCisgTW9kaWZpZWQgYnk6IEFuZHJlcyBWZWdhIEdhcmNpYQorCisgSU5SSUEgLSBTb3BoaWEgQW50aXBvbGlzLCBGcmFuY2UKKyBlLW1haWw6IGF2ZWdhQHNvcGhpYS5pbnJpYS5mcgorIGZpbmdlcjogYXZlZ2FAcGF4LmlucmlhLmZyCisKKyAqLworCisvKgorICogQ3JlYXRlZCBmcm9tIGlmX2VwcmVnLmggYnkgRnJlZCBHcmF5IChmZ3JheUByaWNlLmVkdSkgdG8gc3VwcG9ydCB0aGUKKyAqIDNjNTkwIGZhbWlseS4KKyAqLworCisvKgorICogTW9kaWZpZWQgYnkgU2h1c3VrZSBOaXNpeWFtYSA8c2h1QGF0aGVuYS5xZS5lbmcuaG9rdWRhaS5hYy5qcD4KKyAqIGZvciBldGhlcmJvb3QKKyAqIE1hci4gMTQsIDIwMDAKKyovCisKKy8qCisgKiBFdGhlcm5ldCBzb2Z0d2FyZSBzdGF0dXMgcGVyIGludGVyZmFjZS4KKyAqLworCisvKgorICogU29tZSBnbG9iYWwgY29uc3RhbnRzCisgKi8KKworI2RlZmluZSBUWF9JTklUX1JBVEUgICAgICAgICAxNgorI2RlZmluZSBUWF9JTklUX01BWF9SQVRFICAgICA2NAorI2RlZmluZSBSWF9JTklUX0xBVEVOQ1kgICAgICA2NAorI2RlZmluZSBSWF9JTklUX0VBUkxZX1RIUkVTSCA2NAorI2RlZmluZSBNSU5fUlhfRUFSTFlfVEhSRVNIRiAgIDE2IC8qIG5vdCBsZXNzIHRoYW4gZXRoZXJfaGVhZGVyICovCisjZGVmaW5lIE1JTl9SWF9FQVJMWV9USFJFU0hMICAgNAorCisjZGVmaW5lIEVFUFJPTVNJWkUgICAgICAweDQwCisjZGVmaW5lIE1BWF9FRVBST01CVVNZICAxMDAwCisjZGVmaW5lIFZYX0xBU1RfVEFHICAgICAweGQ3CisjZGVmaW5lIFZYX01BWF9CT0FSRFMgICAxNgorI2RlZmluZSBWWF9JRF9QT1JUICAgICAgMHgxMDAKKworLyoKKyAqIHNvbWUgbWFjcm9zIHRvIGFjY2VzIGxvbmcgbmFtZWQgZmllbGRzCisgKi8KKyNkZWZpbmUgQkFTRSAJKGV0aF9uaWNfYmFzZSkKKworLyoKKyAqIENvbW1hbmRzIHRvIHJlYWQvd3JpdGUgRUVQUk9NIHRyb3VnaCBFRVBST00gY29tbWFuZCByZWdpc3RlciAoV2luZG93IDAsCisgKiBPZmZzZXQgMHhhKQorICovCisjZGVmaW5lIEVFUFJPTV9DTURfUkQgICAgMHgwMDgwCS8qIFJlYWQ6ICBBZGRyZXNzIHJlcXVpcmVkICg1IGJpdHMpICovCisjZGVmaW5lIEVFUFJPTV9DTURfV1IgICAgMHgwMDQwCS8qIFdyaXRlOiBBZGRyZXNzIHJlcXVpcmVkICg1IGJpdHMpICovCisjZGVmaW5lIEVFUFJPTV9DTURfRVJBU0UgMHgwMGMwCS8qIEVyYXNlOiBBZGRyZXNzIHJlcXVpcmVkICg1IGJpdHMpICovCisjZGVmaW5lIEVFUFJPTV9DTURfRVdFTiAgMHgwMDMwCS8qIEVyYXNlL1dyaXRlIEVuYWJsZTogTm8gZGF0YSByZXF1aXJlZCAqLworCisjZGVmaW5lIEVFUFJPTV9CVVNZCQkoMTw8MTUpCisKKy8qCisgKiBTb21lIHNob3J0IGZ1bmN0aW9ucywgd29ydGggdG8gbGV0IHRoZW0gYmUgYSBtYWNybworICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJCQkJCQkgICoKKyAqIFRoZXNlIGRlZmluZSB0aGUgRUVQUk9NIGRhdGEgc3RydWN0dXJlLiAgVGhleSBhcmUgdXNlZCBpbiB0aGUgcHJvYmUKKyAqIGZ1bmN0aW9uIHRvIHZlcmlmeSB0aGUgZXhpc3RlbmNlIG9mIHRoZSBhZGFwdGVyIGFmdGVyIGhhdmluZyBzZW50CisgKiB0aGUgSURfU2VxdWVuY2UuCisgKgorICogVGhlcmUgYXJlIG90aGVycyBidXQgb25seSB0aGUgb25lcyB3ZSB1c2UgYXJlIGRlZmluZWQgaGVyZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRUVQUk9NX05PREVfQUREUl8wCTB4MAkvKiBXb3JkICovCisjZGVmaW5lIEVFUFJPTV9OT0RFX0FERFJfMQkweDEJLyogV29yZCAqLworI2RlZmluZSBFRVBST01fTk9ERV9BRERSXzIJMHgyCS8qIFdvcmQgKi8KKyNkZWZpbmUgRUVQUk9NX1BST0RfSUQJCTB4MwkvKiAweDlbMC1mXTUwICovCisjZGVmaW5lIEVFUFJPTV9NRkdfSUQJCTB4NwkvKiAweDZkNTAgKi8KKyNkZWZpbmUgRUVQUk9NX0FERFJfQ0ZHCQkweDgJLyogQmFzZSBhZGRyICovCisjZGVmaW5lIEVFUFJPTV9SRVNPVVJDRV9DRkcJMHg5CS8qIElSUS4gQml0cyAxMi0xNSAqLworI2RlZmluZSBFRVBST01fT0VNX0FERFJfMAkweGEJLyogV29yZCAqLworI2RlZmluZSBFRVBST01fT0VNX0FERFJfMQkweGIJLyogV29yZCAqLworI2RlZmluZSBFRVBST01fT0VNX0FERFJfMgkweGMJLyogV29yZCAqLworI2RlZmluZSBFRVBST01fU09GVF9JTkZPXzIJMHhmICAgICAvKiBTb2Z0d2FyZSBpbmZvcm1hdGlvbiAyICovCisKKyNkZWZpbmUgTk9fUlhfT1ZOX0FOT01BTFkgICAgICAgKDE8PDUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJCQkJCQkJICAqCisgKiBUaGVzZSBhcmUgdGhlIHJlZ2lzdGVycyBmb3IgdGhlIDNDb20gM2M1MDkgYW5kIHRoZWlyIGJpdCBwYXR0ZXJucyB3aGVuICoKKyAqIGFwcGxpY2FibGUuICBUaGV5IGhhdmUgYmVlbiB0YWtlbiBvdXQgdGhlIHRoZSAiRXRoZXJMaW5rIElJSSBQYXJhbGxlbCAgKgorICogVGFza2luZyBFSVNBIGFuZCBJU0EgVGVjaG5pY2FsIFJlZmVyZW5jZSIgIkJldGEgRHJhZnQgMTAvMzAvOTIiIG1hbnVhbCAqCisgKiBmcm9tIDNjb20uCQkJCQkJCQkgICoKKyAqCQkJCQkJCQkJCSAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFZYX0NPTU1BTkQJCTB4MGUJLyogV3JpdGUuIEJBU0UrMHgwZSBpcyBhbHdheXMgYQorCQkJCQkgKiBjb21tYW5kIHJlZy4gKi8KKyNkZWZpbmUgVlhfU1RBVFVTCQkweDBlCS8qIFJlYWQuIEJBU0UrMHgwZSBpcyBhbHdheXMgc3RhdHVzCisJCQkJCSAqIHJlZy4gKi8KKyNkZWZpbmUgVlhfV0lORE9XCQkweDBmCS8qIFJlYWQuIEJBU0UrMHgwZiBpcyBhbHdheXMgd2luZG93CisJCQkJCSAqIHJlZy4gKi8KKy8qCisgKiBXaW5kb3cgMCByZWdpc3RlcnMuIFNldHVwLgorICovCisvKiBXcml0ZSAqLworI2RlZmluZSBWWF9XMF9FRVBST01fREFUQQkweDBjCisjZGVmaW5lIFZYX1cwX0VFUFJPTV9DT01NQU5ECTB4MGEKKyNkZWZpbmUgVlhfVzBfUkVTT1VSQ0VfQ0ZHCTB4MDgKKyNkZWZpbmUgVlhfVzBfQUREUkVTU19DRkcJMHgwNiAKKyNkZWZpbmUgVlhfVzBfQ09ORklHX0NUUkwJMHgwNAorICAgICAgICAvKiBSZWFkICovCisjZGVmaW5lIFZYX1cwX1BST0RVQ1RfSUQJMHgwMgorI2RlZmluZSBWWF9XMF9NRkdfSUQJCTB4MDAKKworCisvKgorICogV2luZG93IDEgcmVnaXN0ZXJzLiBPcGVyYXRpbmcgU2V0LgorICovCisvKiBXcml0ZSAqLworI2RlZmluZSBWWF9XMV9UWF9QSU9fV1JfMgkweDAyCisjZGVmaW5lIFZYX1cxX1RYX1BJT19XUl8xCTB4MDAKKy8qIFJlYWQgKi8KKyNkZWZpbmUgVlhfVzFfRlJFRV9UWAkJMHgwYworI2RlZmluZSBWWF9XMV9UWF9TVEFUVVMJCTB4MGIJLyogYnl0ZSAqLworI2RlZmluZSBWWF9XMV9USU1FUgkJMHgwYQkvKiBieXRlICovCisjZGVmaW5lIFZYX1cxX1JYX1NUQVRVUwkJMHgwOAorI2RlZmluZSBWWF9XMV9SWF9QSU9fUkRfMgkweDAyCisjZGVmaW5lIFZYX1cxX1JYX1BJT19SRF8xCTB4MDAKKworLyoKKyAqIFdpbmRvdyAyIHJlZ2lzdGVycy4gU3RhdGlvbiBBZGRyZXNzIFNldHVwL1JlYWQKKyAqLworLyogUmVhZC9Xcml0ZSAqLworI2RlZmluZSBWWF9XMl9BRERSXzUJCTB4MDUKKyNkZWZpbmUgVlhfVzJfQUREUl80CQkweDA0CisjZGVmaW5lIFZYX1cyX0FERFJfMwkJMHgwMworI2RlZmluZSBWWF9XMl9BRERSXzIJCTB4MDIKKyNkZWZpbmUgVlhfVzJfQUREUl8xCQkweDAxCisjZGVmaW5lIFZYX1cyX0FERFJfMAkJMHgwMAorCisvKgorICogV2luZG93IDMgcmVnaXN0ZXJzLiBGSUZPIE1hbmFnZW1lbnQuCisgKi8KKy8qIFJlYWQgKi8KKyNkZWZpbmUgVlhfVzNfSU5URVJOQUxfQ0ZHCTB4MDAKKyNkZWZpbmUgVlhfVzNfUkVTRVRfT1BUCQkweDA4CisjZGVmaW5lIFZYX1czX0ZSRUVfVFgJCTB4MGMKKyNkZWZpbmUgVlhfVzNfRlJFRV9SWAkJMHgwYQorCisvKgorICogV2luZG93IDQgcmVnaXN0ZXJzLiBEaWFnbm9zdGljcy4KKyAqLworLyogUmVhZC9Xcml0ZSAqLworI2RlZmluZSBWWF9XNF9NRURJQV9UWVBFCTB4MGEKKyNkZWZpbmUgVlhfVzRfQ1RSTFJfU1RBVFVTCTB4MDgKKyNkZWZpbmUgVlhfVzRfTkVUX0RJQUcJCTB4MDYKKyNkZWZpbmUgVlhfVzRfRklGT19ESUFHCQkweDA0CisjZGVmaW5lIFZYX1c0X0hPU1RfRElBRwkJMHgwMgorI2RlZmluZSBWWF9XNF9UWF9ESUFHCQkweDAwCisKKy8qCisgKiBXaW5kb3cgNSBSZWdpc3RlcnMuICBSZXN1bHRzIGFuZCBJbnRlcm5hbCBzdGF0dXMuCisgKi8KKy8qIFJlYWQgKi8KKyNkZWZpbmUgVlhfVzVfUkVBRF8wX01BU0sJMHgwYworI2RlZmluZSBWWF9XNV9JTlRSX01BU0sJCTB4MGEKKyNkZWZpbmUgVlhfVzVfUlhfRklMVEVSCQkweDA4CisjZGVmaW5lIFZYX1c1X1JYX0VBUkxZX1RIUkVTSAkweDA2CisjZGVmaW5lIFZYX1c1X1RYX0FWQUlMX1RIUkVTSAkweDAyCisjZGVmaW5lIFZYX1c1X1RYX1NUQVJUX1RIUkVTSAkweDAwCisKKy8qCisgKiBXaW5kb3cgNiByZWdpc3RlcnMuIFN0YXRpc3RpY3MuCisgKi8KKy8qIFJlYWQvV3JpdGUgKi8KKyNkZWZpbmUgVFhfVE9UQUxfT0sJCTB4MGMKKyNkZWZpbmUgUlhfVE9UQUxfT0sJCTB4MGEKKyNkZWZpbmUgVFhfREVGRVJSQUxTCQkweDA4CisjZGVmaW5lIFJYX0ZSQU1FU19PSwkJMHgwNworI2RlZmluZSBUWF9GUkFNRVNfT0sJCTB4MDYKKyNkZWZpbmUgUlhfT1ZFUlJVTlMJCTB4MDUKKyNkZWZpbmUgVFhfQ09MTElTSU9OUwkJMHgwNAorI2RlZmluZSBUWF9BRlRFUl8xX0NPTExJU0lPTgkweDAzCisjZGVmaW5lIFRYX0FGVEVSX1hfQ09MTElTSU9OUwkweDAyCisjZGVmaW5lIFRYX05PX1NRRQkJMHgwMQorI2RlZmluZSBUWF9DRF9MT1NUCQkweDAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb21tYW5kIHJlZ2lzdGVyLiBBbGwgd2luZG93cy4KKyAqCisgKiAxNiBiaXQgcmVnaXN0ZXIuCisgKiAgICAgMTUtMTE6ICA1LWJpdCBjb2RlIGZvciBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkLgorICogICAgIDEwLTA6ICAgMTEtYml0IGFyZyBpZiBhbnkuIEZvciBjb21tYW5kcyB3aXRoIG5vIGFyZ3M7CisgKgkgICAgICB0aGlzIGNhbiBiZSBzZXQgdG8gYW55dGhpbmcuCisgKi8KKyNkZWZpbmUgR0xPQkFMX1JFU0VUCQkodW5zaWduZWQgc2hvcnQpIDB4MDAwMAkvKiBXYWl0IGF0IGxlYXN0IDFtcworCQkJCQkJCSAqIGFmdGVyIGlzc3VpbmcgKi8KKyNkZWZpbmUgV0lORE9XX1NFTEVDVAkJKHVuc2lnbmVkIHNob3J0KSAoMHgxPDwxMSkKKyNkZWZpbmUgU1RBUlRfVFJBTlNDRUlWRVIJKHVuc2lnbmVkIHNob3J0KSAoMHgyPDwxMSkJLyogUmVhZCBBRERSX0NGRyByZWcgdG8KKwkJCQkJCQkgKiBkZXRlcm1pbmUgd2hldGhlcgorCQkJCQkJCSAqIHRoaXMgaXMgbmVlZGVkLiBJZgorCQkJCQkJCSAqIHNvOyB3YWl0IDgwMCB1U2VjCisJCQkJCQkJICogYmVmb3JlIHVzaW5nIHRyYW5zLQorCQkJCQkJCSAqIGNlaXZlci4gKi8KKyNkZWZpbmUgUlhfRElTQUJMRQkJKHVuc2lnbmVkIHNob3J0KSAoMHgzPDwxMSkJLyogc3RhdGUgZGlzYWJsZWQgb24KKwkJCQkJCQkgKiBwb3dlci11cCAqLworI2RlZmluZSBSWF9FTkFCTEUJCSh1bnNpZ25lZCBzaG9ydCkgKDB4NDw8MTEpCisjZGVmaW5lIFJYX1JFU0VUCQkodW5zaWduZWQgc2hvcnQpICgweDU8PDExKQorI2RlZmluZSBSWF9ESVNDQVJEX1RPUF9QQUNLCSh1bnNpZ25lZCBzaG9ydCkgKDB4ODw8MTEpCisjZGVmaW5lIFRYX0VOQUJMRQkJKHVuc2lnbmVkIHNob3J0KSAoMHg5PDwxMSkKKyNkZWZpbmUgVFhfRElTQUJMRQkJKHVuc2lnbmVkIHNob3J0KSAoMHhhPDwxMSkKKyNkZWZpbmUgVFhfUkVTRVQJCSh1bnNpZ25lZCBzaG9ydCkgKDB4Yjw8MTEpCisjZGVmaW5lIFJFUV9JTlRSCQkodW5zaWduZWQgc2hvcnQpICgweGM8PDExKQorLyoKKyAqIFRoZSBmb2xsb3dpbmcgQ18qIGFja25vd2xlZGdlIHRoZSB2YXJpb3VzIGludGVycnVwdHMuIFNvbWUgb2YgdGhlbSBkb24ndAorICogZG8gYW55dGhpbmcuICBTZWUgdGhlIG1hbnVhbC4KKyAqLworI2RlZmluZSBBQ0tfSU5UUgkJKHVuc2lnbmVkIHNob3J0KSAoMHg2ODAwKQorIwlkZWZpbmUgQ19JTlRSX0xBVENICSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4MSkKKyMJZGVmaW5lIENfQ0FSRF9GQUlMVVJFCSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4MikKKyMJZGVmaW5lIENfVFhfQ09NUExFVEUJKHVuc2lnbmVkIHNob3J0KSAoQUNLX0lOVFJ8MHg0KQorIwlkZWZpbmUgQ19UWF9BVkFJTAkodW5zaWduZWQgc2hvcnQpIChBQ0tfSU5UUnwweDgpCisjCWRlZmluZSBDX1JYX0NPTVBMRVRFCSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4MTApCisjCWRlZmluZSBDX1JYX0VBUkxZCSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4MjApCisjCWRlZmluZSBDX0lOVF9SUUQJCSh1bnNpZ25lZCBzaG9ydCkgKEFDS19JTlRSfDB4NDApCisjCWRlZmluZSBDX1VQRF9TVEFUUwkodW5zaWduZWQgc2hvcnQpIChBQ0tfSU5UUnwweDgwKQorI2RlZmluZSBTRVRfSU5UUl9NQVNLCQkodW5zaWduZWQgc2hvcnQpICgweGU8PDExKQorI2RlZmluZSBTRVRfUkRfMF9NQVNLCQkodW5zaWduZWQgc2hvcnQpICgweGY8PDExKQorI2RlZmluZSBTRVRfUlhfRklMVEVSCQkodW5zaWduZWQgc2hvcnQpICgweDEwPDwxMSkKKyMJZGVmaW5lIEZJTF9JTkRJVklEVUFMCSh1bnNpZ25lZCBzaG9ydCkgKDB4MSkKKyMJZGVmaW5lIEZJTF9NVUxUSUNBU1QgICAgICh1bnNpZ25lZCBzaG9ydCkgKDB4MDIpCisjCWRlZmluZSBGSUxfQlJEQ1NUICAgICAgICAodW5zaWduZWQgc2hvcnQpICgweDA0KQorIwlkZWZpbmUgRklMX1BST01JU0MgICAgICAgKHVuc2lnbmVkIHNob3J0KSAoMHgwOCkKKyNkZWZpbmUgU0VUX1JYX0VBUkxZX1RIUkVTSAkodW5zaWduZWQgc2hvcnQpICgweDExPDwxMSkKKyNkZWZpbmUgU0VUX1RYX0FWQUlMX1RIUkVTSAkodW5zaWduZWQgc2hvcnQpICgweDEyPDwxMSkKKyNkZWZpbmUgU0VUX1RYX1NUQVJUX1RIUkVTSAkodW5zaWduZWQgc2hvcnQpICgweDEzPDwxMSkKKyNkZWZpbmUgU1RBVFNfRU5BQkxFCQkodW5zaWduZWQgc2hvcnQpICgweDE1PDwxMSkKKyNkZWZpbmUgU1RBVFNfRElTQUJMRQkJKHVuc2lnbmVkIHNob3J0KSAoMHgxNjw8MTEpCisjZGVmaW5lIFNUT1BfVFJBTlNDRUlWRVIJKHVuc2lnbmVkIHNob3J0KSAoMHgxNzw8MTEpCisKKy8qCisgKiBTdGF0dXMgcmVnaXN0ZXIuIEFsbCB3aW5kb3dzLgorICoKKyAqICAgICAxNS0xMzogIFdpbmRvdyBudW1iZXIoMC03KS4KKyAqICAgICAxMjogICAgIENvbW1hbmRfaW5fcHJvZ3Jlc3MuCisgKiAgICAgMTE6ICAgICByZXNlcnZlZC4KKyAqICAgICAxMDogICAgIHJlc2VydmVkLgorICogICAgIDk6ICAgICAgcmVzZXJ2ZWQuCisgKiAgICAgODogICAgICByZXNlcnZlZC4KKyAqICAgICA3OiAgICAgIFVwZGF0ZSBTdGF0aXN0aWNzLgorICogICAgIDY6ICAgICAgSW50ZXJydXB0IFJlcXVlc3RlZC4KKyAqICAgICA1OiAgICAgIFJYIEVhcmx5LgorICogICAgIDQ6ICAgICAgUlggQ29tcGxldGUuCisgKiAgICAgMzogICAgICBUWCBBdmFpbGFibGUuCisgKiAgICAgMjogICAgICBUWCBDb21wbGV0ZS4KKyAqICAgICAxOiAgICAgIEFkYXB0ZXIgRmFpbHVyZS4KKyAqICAgICAwOiAgICAgIEludGVycnVwdCBMYXRjaC4KKyAqLworI2RlZmluZSBTX0lOVFJfTEFUQ0gJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MSkKKyNkZWZpbmUgU19DQVJEX0ZBSUxVUkUJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MikKKyNkZWZpbmUgU19UWF9DT01QTEVURQkJKHVuc2lnbmVkIHNob3J0KSAoMHg0KQorI2RlZmluZSBTX1RYX0FWQUlMCQkodW5zaWduZWQgc2hvcnQpICgweDgpCisjZGVmaW5lIFNfUlhfQ09NUExFVEUJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MTApCisjZGVmaW5lIFNfUlhfRUFSTFkJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MjApCisjZGVmaW5lIFNfSU5UX1JRRAkJKHVuc2lnbmVkIHNob3J0KSAoMHg0MCkKKyNkZWZpbmUgU19VUERfU1RBVFMJCSh1bnNpZ25lZCBzaG9ydCkgKDB4ODApCisjZGVmaW5lIFNfQ09NTUFORF9JTl9QUk9HUkVTUwkodW5zaWduZWQgc2hvcnQpICgweDEwMDApCisKKyNkZWZpbmUgVlhfQlVTWV9XQUlUIHdoaWxlIChpbncoQkFTRSArIFZYX1NUQVRVUykgJiBTX0NPTU1BTkRfSU5fUFJPR1JFU1MpCisKKy8qIEFkZHJlc3MgQ29uZmlnLiBSZWdpc3Rlci4gICAgCisgKiBXaW5kb3cgMC9Qb3J0IDA2CisgKi8KKworI2RlZmluZSBBQ0ZfQ09OTkVDVE9SX0JJVFMJMTQgIAorI2RlZmluZSBBQ0ZfQ09OTkVDVE9SX1VUUAkwCisjZGVmaW5lIEFDRl9DT05ORUNUT1JfQVVJCTEKKyNkZWZpbmUgQUNGX0NPTk5FQ1RPUl9CTkMJMworICAgCisjZGVmaW5lIElOVEVSTkFMX0NPTk5FQ1RPUl9CSVRTIDIwCisjZGVmaW5lIElOVEVSTkFMX0NPTk5FQ1RPUl9NQVNLIDB4MDE3MDAwMDAKKworLyoKKyAqIEZJRk8gUmVnaXN0ZXJzLiBSWCBTdGF0dXMuCisgKgorICogICAgIDE1OiAgICAgSW5jb21wbGV0ZSBvciBGSUZPIGVtcHR5LgorICogICAgIDE0OiAgICAgMTogRXJyb3IgaW4gUlggUGFja2V0ICAgMDogSW5jb21wbGV0ZSBvciBubyBlcnJvci4KKyAqICAgICAxMy0xMTogIFR5cGUgb2YgZXJyb3IuCisgKgkgICAgICAxMDAwID0gT3ZlcnJ1bi4KKyAqCSAgICAgIDEwMTEgPSBSdW4gUGFja2V0IEVycm9yLgorICoJICAgICAgMTEwMCA9IEFsaWdubWVudCBFcnJvci4KKyAqCSAgICAgIDExMDEgPSBDUkMgRXJyb3IuCisgKgkgICAgICAxMDAxID0gT3ZlcnNpemUgUGFja2V0IEVycm9yICg+MTUxNCBieXRlcykKKyAqCSAgICAgIDAwMTAgPSBEcmliYmxlIEJpdHMuCisgKgkgICAgICAoYWxsIG90aGVyIGVycm9yIGNvZGVzLCBubyBlcnJvcnMuKQorICoKKyAqICAgICAxMC0wOiAgIFJYIEJ5dGVzICgwLTE1MTQpCisgKi8KKyNkZWZpbmUgRVJSX0lOQ09NUExFVEUgICh1bnNpZ25lZCBzaG9ydCkgKDB4ODAwMCkKKyNkZWZpbmUgRVJSX1JYICAgICAgICAgICh1bnNpZ25lZCBzaG9ydCkgKDB4NDAwMCkKKyNkZWZpbmUgRVJSX01BU0sgICAgICAgICh1bnNpZ25lZCBzaG9ydCkgKDB4NzgwMCkKKyNkZWZpbmUgRVJSX09WRVJSVU4gICAgICh1bnNpZ25lZCBzaG9ydCkgKDB4NDAwMCkKKyNkZWZpbmUgRVJSX1JVTlQgICAgICAgICh1bnNpZ25lZCBzaG9ydCkgKDB4NTgwMCkKKyNkZWZpbmUgRVJSX0FMSUdOTUVOVCAgICh1bnNpZ25lZCBzaG9ydCkgKDB4NjAwMCkKKyNkZWZpbmUgRVJSX0NSQyAgICAgICAgICh1bnNpZ25lZCBzaG9ydCkgKDB4NjgwMCkKKyNkZWZpbmUgRVJSX09WRVJTSVpFICAgICh1bnNpZ25lZCBzaG9ydCkgKDB4NDgwMCkKKyNkZWZpbmUgRVJSX0RSSUJCTEUgICAgICh1bnNpZ25lZCBzaG9ydCkgKDB4MTAwMCkKKworLyoKKyAqIFRYIFN0YXR1cy4gCisgKgorICogICBSZXBvcnRzIHRoZSB0cmFuc21pdCBzdGF0dXMgb2YgYSBjb21wbGV0ZWQgdHJhbnNtaXNzaW9uLiBXcml0aW5nIHRoaXMKKyAqICAgcmVnaXN0ZXIgcG9wcyB0aGUgdHJhbnNtaXQgY29tcGxldGlvbiBzdGFjay4KKyAqCisgKiAgIFdpbmRvdyAxL1BvcnQgMHgwYi4KKyAqCisgKiAgICAgNzogICAgICBDb21wbGV0ZQorICogICAgIDY6ICAgICAgSW50ZXJydXB0IG9uIHN1Y2Nlc3NmdWwgdHJhbnNtaXNzaW9uIHJlcXVlc3RlZC4KKyAqICAgICA1OiAgICAgIEphYmJlciBFcnJvciAoVFAgT25seSwgVFggUmVzZXQgcmVxdWlyZWQuICkKKyAqICAgICA0OiAgICAgIFVuZGVycnVuIChUWCBSZXNldCByZXF1aXJlZC4gKQorICogICAgIDM6ICAgICAgTWF4aW11bSBDb2xsaXNpb25zLgorICogICAgIDI6ICAgICAgVFggU3RhdHVzIE92ZXJmbG93LgorICogICAgIDEtMDogICAgVW5kZWZpbmVkLgorICoKKyAqLworI2RlZmluZSBUWFNfQ09NUExFVEUJCTB4ODAKKyNkZWZpbmUgVFhTX0lOVFJfUkVRCQkweDQwCisjZGVmaW5lIFRYU19KQUJCRVIJCTB4MjAKKyNkZWZpbmUgVFhTX1VOREVSUlVOCQkweDEwCisjZGVmaW5lIFRYU19NQVhfQ09MTElTSU9OCTB4OAorI2RlZmluZSBUWFNfU1RBVFVTX09WRVJGTE9XCTB4NAorCisjZGVmaW5lIFJTX0FVSQkJCSgxPDw1KQorI2RlZmluZSBSU19CTkMJCQkoMTw8NCkKKyNkZWZpbmUgUlNfVVRQCQkJKDE8PDMpCisjZGVmaW5lCVJTX1Q0CQkJKDE8PDApCisjZGVmaW5lCVJTX1RYCQkJKDE8PDEpCisjZGVmaW5lCVJTX0ZYCQkJKDE8PDIpCisjZGVmaW5lCVJTX01JSQkJCSgxPDw2KQorCisKKy8qCisgKiBGSUZPIFN0YXR1cyAoV2luZG93IDQpCisgKgorICogICBTdXBwb3J0cyBGSUZPIGRpYWdub3N0aWNzCisgKgorICogICBXaW5kb3cgNC9Qb3J0IDB4MDQuMQorICoKKyAqICAgICAxNToJMT1SWCByZWNlaXZpbmcgKFJPKS4gU2V0IHdoZW4gYSBwYWNrZXQgaXMgYmVpbmcgcmVjZWl2ZWQKKyAqCQlpbnRvIHRoZSBSWCBGSUZPLgorICogICAgIDE0OglSZXNlcnZlZAorICogICAgIDEzOgkxPVJYIHVuZGVycnVuIChSTykuIEdlbmVyYXRlcyBBZGFwdGVyIEZhaWx1cmUgaW50ZXJydXB0LgorICoJCVJlcXVpcmVzIFJYIFJlc2V0IG9yIEdsb2JhbCBSZXNldCBjb21tYW5kIHRvIHJlY292ZXIuCisgKgkJSXQgaXMgZ2VuZXJhdGVkIHdoZW4geW91IHJlYWQgcGFzdCB0aGUgZW5kIG9mIGEgcGFja2V0IC0KKyAqCQlyZWFkaW5nIHBhc3Qgd2hhdCBoYXMgYmVlbiByZWNlaXZlZCBzbyBmYXIgd2lsbCBnaXZlIGJhZAorICoJCWRhdGEuCisgKiAgICAgMTI6CTE9Ulggc3RhdHVzIG92ZXJydW4gKFJPKS4gU2V0IHdoZW4gdGhlcmUgYXJlIGFscmVhZHkgOAorICoJCXBhY2tldHMgaW4gdGhlIFJYIEZJRk8uIFdoaWxlIHRoaXMgYml0IGlzIHNldCwgbm8gYWRkaXRpb25hbAorICoJCXBhY2tldHMgYXJlIHJlY2VpdmVkLiBSZXF1aXJlcyBubyBhY3Rpb24gb24gdGhlIHBhcnQgb2YKKyAqCQl0aGUgaG9zdC4gVGhlIGNvbmRpdGlvbiBpcyBjbGVhcmVkIG9uY2UgYSBwYWNrZXQgaGFzIGJlZW4KKyAqCQlyZWFkIG91dCBvZiB0aGUgUlggRklGTy4KKyAqICAgICAxMToJMT1SWCBvdmVycnVuIChSTykuIFNldCB3aGVuIHRoZSBSWCBGSUZPIGlzIGZ1bGwgKHRoZXJlCisgKgkJbWF5IG5vdCBiZSBhbiBvdmVycnVuIHBhY2tldCB5ZXQpLiBXaGlsZSB0aGlzIGJpdCBpcyBzZXQsCisgKgkJbm8gYWRkaXRpb25hbCBwYWNrZXRzIHdpbGwgYmUgcmVjZWl2ZWQgKHNvbWUgYWRkaXRpb25hbAorICoJCWJ5dGVzIGNhbiBzdGlsbCBiZSBwZW5kaW5nIGJldHdlZW4gdGhlIHdpcmUgYW5kIHRoZSBSWAorICoJCUZJRk8pLiBSZXF1aXJlcyBubyBhY3Rpb24gb24gdGhlIHBhcnQgb2YgdGhlIGhvc3QuIFRoZQorICoJCWNvbmRpdGlvbiBpcyBjbGVhcmVkIG9uY2UgYSBmZXcgYnl0ZXMgaGF2ZSBiZWVuIHJlYWQgb3V0CisgKgkJZnJvbSB0aGUgUlggRklGTy4KKyAqICAgICAxMDoJMT1UWCBvdmVycnVuIChSTykuIEdlbmVyYXRlcyBhZGFwdGVyIGZhaWx1cmUgaW50ZXJydXB0LgorICoJCVJlcXVpcmVzIFRYIFJlc2V0IG9yIEdsb2JhbCBSZXNldCBjb21tYW5kIHRvIHJlY292ZXIuCisgKgkJRGlzYWJsZXMgVHJhbnNtaXR0ZXIuCisgKiAgICAgOS04OglVbmFzc2lnbmVkLgorICogICAgIDctMDoJQnVpbHQgaW4gc2VsZiB0ZXN0IGJpdHMgZm9yIHRoZSBSWCBhbmQgVFggRklGTydzLgorICovCisjZGVmaW5lIEZJRk9TX1JYX1JFQ0VJVklORwkodW5zaWduZWQgc2hvcnQpIDB4ODAwMAorI2RlZmluZSBGSUZPU19SWF9VTkRFUlJVTgkodW5zaWduZWQgc2hvcnQpIDB4MjAwMAorI2RlZmluZSBGSUZPU19SWF9TVEFUVVNfT1ZFUlJVTgkodW5zaWduZWQgc2hvcnQpIDB4MTAwMAorI2RlZmluZSBGSUZPU19SWF9PVkVSUlVOCSh1bnNpZ25lZCBzaG9ydCkgMHgwODAwCisjZGVmaW5lIEZJRk9TX1RYX09WRVJSVU4JKHVuc2lnbmVkIHNob3J0KSAweDA0MDAKKworLyoKKyAqIE1pc2MgZGVmaW5lcyBmb3IgdmFyaW91cyB0aGluZ3MuCisgKi8KKyNkZWZpbmUgVEFHX0FEQVBURVIgICAgICAgICAgICAgICAgICAgICAweGQwCisjZGVmaW5lIEFDVElWQVRFX0FEQVBURVJfVE9fQ09ORklHICAgICAgMHhmZgorI2RlZmluZSBFTkFCTEVfRFJRX0lSUSAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBNRkdfSUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTA2ZCAgLyogYFRDTScgKi8KKyNkZWZpbmUgUFJPRF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAweDUwOTAKKyNkZWZpbmUgR09fV0lORE9XKHgpCQlvdXR3KFdJTkRPV19TRUxFQ1R8KHgpLEJBU0UrVlhfQ09NTUFORCkKKyNkZWZpbmUgSkFCQkVSX0dVQVJEX0VOQUJMRQkweDQwCisjZGVmaW5lIExJTktCRUFUX0VOQUJMRQkJMHg4MAorI2RlZmluZQlFTkFCTEVfVVRQCQkoSkFCQkVSX0dVQVJEX0VOQUJMRSB8IExJTktCRUFUX0VOQUJMRSkKKyNkZWZpbmUgRElTQUJMRV9VVFAJCTB4MAorI2RlZmluZSBSWF9CWVRFU19NQVNLCQkodW5zaWduZWQgc2hvcnQpICgweDA3ZmYpCisjZGVmaW5lIFJYX0VSUk9SICAgICAgICAweDQwMDAKKyNkZWZpbmUgUlhfSU5DT01QTEVURSAgIDB4ODAwMAorI2RlZmluZSBUWF9JTkRJQ0FURQkJMTw8MTUKKyNkZWZpbmUgaXNfZWVwcm9tX2J1c3koYikJKGludygoYikrVlhfVzBfRUVQUk9NX0NPTU1BTkQpJkVFUFJPTV9CVVNZKQorCisjZGVmaW5lCVZYX0lPU0laRQkweDIwCisKKyNkZWZpbmUgVlhfQ09OTkVDVE9SUyA4CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvbmV0Ym9vdC8zYzkweC5jIGIvbmV0Ym9vdC8zYzkweC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzOTk2ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290LzNjOTB4LmMKQEAgLTAsMCArMSw5MjkgQEAKKy8qCisgKiAzYzkweC5jIC0tIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSAzYzkweCBkcml2ZXIgZm9yIGV0aGVyYm9vdC4gIFdyaXR0ZW4KKyAqIGJ5IEdyZWcgQmVlbGV5LCBHcmVnLkJlZWxleUBMaWdodFN5cy5vcmcuICBNb2RpZmllZCBieSBTdGV2ZSBTbWl0aCwKKyAqIFN0ZXZlLlNtaXRoQEp1bm8uQ29tCisgKgorICogVGhpcyBwcm9ncmFtIENvcHlyaWdodCAoQykgMTk5OSBMaWdodFN5cyBUZWNobm9sb2d5IFNlcnZpY2VzLCBJbmMuCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDE5OTkgU3RldmUgU21pdGgKKyAqCisgKiBUaGlzIHByb2dyYW0gbWF5IGJlIHJlLWRpc3RyaWJ1dGVkIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybSwgbW9kaWZpZWQsCisgKiBzb2xkLCBvciBjb3BpZWQgZm9yIGFueSBwdXJwb3NlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbWVzc2FnZQorICogYW5kIHRoaXMgdGV4dCBhcmUgaW5jbHVkZWQgd2l0aCBhbGwgc291cmNlIGNvcGllcyBvciBkZXJpdmF0aXZlIHdvcmtzLCBhbmQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBtZXNzYWdlIGFuZCB0aGlzIHRleHQgYXJlIGluY2x1ZGVkIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBvZiBhbnkgYmluYXJ5LW9ubHkgZGlzdHJpYnV0aW9ucy4gIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFksIHdpdGhvdXQgZXZlbiB0aGUgd2FycmFudHkgb2YgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIG9yIE1FUkNIQU5UQUJJTElUWS4gIFBsZWFzZSByZWFkIHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICIzYzkweC50eHQiIGJlZm9yZSBjb21waWxpbmcgYW5kIHVzaW5nIHRoaXMgZHJpdmVyLgorICoKKyAqIC0tLS0tLS0tCisgKgorICogUHJvZ3JhbSB3cml0dGVuIHdpdGggdGhlIGFzc2lzdGFuY2Ugb2YgdGhlIDNjb20gZG9jdW1lbnRhdGlvbiBmb3IKKyAqIHRoZSAzYzkwNUItVFggY2FyZCwgYXMgd2VsbCBhcyB3aXRoIHNvbWUgYXNzaXN0YW5jZSBmcm9tIHRoZSAzYzU5eAorICogZHJpdmVyIERvbmFsZCBCZWNrZXIgd3JvdGUgZm9yIHRoZSBMaW51eCBrZXJuZWwsIGFuZCB3aXRoIHNvbWUgYXNzaXN0YW5jZQorICogZnJvbSB0aGUgcmVtYWluZGVyIG9mIHRoZSBFdGhlcmJvb3QgZGlzdHJpYnV0aW9uLgorICoKKyAqIFJFVklTSU9OIEhJU1RPUlk6CisgKgorICogdjAuMTAJMS0yNi0xOTk4CUdSQglJbml0aWFsIGltcGxlbWVudGF0aW9uLgorICogdjAuOTAJMS0yNy0xOTk4CUdSQglTeXN0ZW0gd29ya3MuCisgKiB2MS4wMHByZTEJMi0xMS0xOTk4CUdSQglHb3QgcHJvbSBib290IGlzc3VlIGZpeGVkLgorICogdjIuMAkJOS0yNC0xOTk5CVNDUwlNb2RpZmllZCBmb3IgM2M5MDUgKGZyb20gM2M5MDViIGNvZGUpCisgKgkJCQkJUmUtd3JvdGUgcG9sbCBhbmQgdHJhbnNtaXQgZm9yCisgKgkJCQkJYmV0dGVyIGVycm9yIHJlY292ZXJ5IGFuZCBoZWF2eQorICoJCQkJCW5ldHdvcmsgdHJhZmZpYyBvcGVyYXRpb24KKyAqCisgKi8KKworI2luY2x1ZGUgImV0aGVyYm9vdC5oIgorI2luY2x1ZGUgIm5pYy5oIgorI2luY2x1ZGUgInBjaS5oIgorI2luY2x1ZGUgImNhcmRzLmgiCisjaW5jbHVkZSAidGltZXIuaCIKKworI2RlZmluZQlYQ1ZSX01BR0lDCSgweDVBMDApCisvKiogYW55IHNpbmdsZSB0cmFuc21pc3Npb24gZmFpbHMgYWZ0ZXIgMTYgY29sbGlzaW9ucyBvciBvdGhlciBlcnJvcnMKKyAqKiB0aGlzIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmV0cnkgdGhlIHRyYW5zbWlzc2lvbiAtLSB0aGlzIHNob3VsZAorICoqIGJlIHBsZW50eQorICoqLworI2RlZmluZQlYTUlUX1JFVFJJRVMJMjUwCisKKyN1bmRlZgl2aXJ0X3RvX2J1cworI2RlZmluZQl2aXJ0X3RvX2J1cyh4KQkoKHVuc2lnbmVkIGxvbmcpeCkKKworLyoqKiBSZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgdGhlIDNjOTA1ICoqKi8KK2VudW0gUmVnaXN0ZXJzCisgICAgeworICAgIHJlZ1Bvd2VyTWdtdEN0cmxfdyA9IDB4N2MsICAgICAgICAvKiogOTA1QiBSZXZpc2lvbiBPbmx5ICAgICAgICAgICAgICAgICAqKi8KKyAgICByZWdVcE1heEJ1cnN0X3cgPSAweDdhLCAgICAgICAgICAgLyoqIDkwNUIgUmV2aXNpb24gT25seSAgICAgICAgICAgICAgICAgKiovCisgICAgcmVnRG5NYXhCdXJzdF93ID0gMHg3OCwgICAgICAgICAgIC8qKiA5MDVCIFJldmlzaW9uIE9ubHkgICAgICAgICAgICAgICAgICoqLworICAgIHJlZ0RlYnVnQ29udHJvbF93ID0gMHg3NCwgICAgICAgICAvKiogOTA1QiBSZXZpc2lvbiBPbmx5ICAgICAgICAgICAgICAgICAqKi8KKyAgICByZWdEZWJ1Z0RhdGFfbCA9IDB4NzAsICAgICAgICAgICAgLyoqIDkwNUIgUmV2aXNpb24gT25seSAgICAgICAgICAgICAgICAgKiovCisgICAgcmVnUmVhbFRpbWVDbnRfbCA9IDB4NDAsICAgICAgICAgIC8qKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworICAgIHJlZ1VwQnVyc3RUaHJlc2hfYiA9IDB4M2UsICAgICAgICAvKiogOTA1QiBSZXZpc2lvbiBPbmx5ICAgICAgICAgICAgICAgICAqKi8KKyAgICByZWdVcFBvbGxfYiA9IDB4M2QsICAgICAgICAgICAgICAgLyoqIDkwNUIgUmV2aXNpb24gT25seSAgICAgICAgICAgICAgICAgKiovCisgICAgcmVnVXBQcmlvcml0eVRocmVzaF9iID0gMHgzYywgICAgIC8qKiA5MDVCIFJldmlzaW9uIE9ubHkgICAgICAgICAgICAgICAgICoqLworICAgIHJlZ1VwTGlzdFB0cl9sID0gMHgzOCwgICAgICAgICAgICAvKiogVW5pdmVyc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKyAgICByZWdDb3VudGRvd25fdyA9IDB4MzYsICAgICAgICAgICAgLyoqIFVuaXZlcnNhbCAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisgICAgcmVnRnJlZVRpbWVyX3cgPSAweDM0LCAgICAgICAgICAgIC8qKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworICAgIHJlZ1VwUGt0U3RhdHVzX2wgPSAweDMwLCAgICAgICAgICAvKiogVW5pdmVyc2FsIHdpdGggRXhjZXB0aW9uLCBwZyAxMzAgICAqKi8KKyAgICByZWdUeEZyZWVUaHJlc2hfYiA9IDB4MmYsICAgICAgICAgLyoqIDkwWCBSZXZpc2lvbiBPbmx5ICAgICAgICAgICAgICAgICAgKiovCisgICAgcmVnRG5Qb2xsX2IgPSAweDJkLCAgICAgICAgICAgICAgIC8qKiA5MDVCIFJldmlzaW9uIE9ubHkgICAgICAgICAgICAgICAgICoqLworICAgIHJlZ0RuUHJpb3JpdHlUaHJlc2hfYiA9IDB4MmMsICAgICAvKiogOTA1QiBSZXZpc2lvbiBPbmx5ICAgICAgICAgICAgICAgICAqKi8KKyAgICByZWdEbkJ1cnN0VGhyZXNoX2IgPSAweDJhLCAgICAgICAgLyoqIDkwNUIgUmV2aXNpb24gT25seSAgICAgICAgICAgICAgICAgKiovCisgICAgcmVnRG5MaXN0UHRyX2wgPSAweDI0LCAgICAgICAgICAgIC8qKiBVbml2ZXJzYWwgd2l0aCBFeGNlcHRpb24sIHBnIDEwNyAgICoqLworICAgIHJlZ0RtYUN0cmxfbCA9IDB4MjAsICAgICAgICAgICAgICAvKiogVW5pdmVyc2FsIHdpdGggRXhjZXB0aW9uLCBwZyAxMDYgICAqKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisgICAgcmVnSW50U3RhdHVzQXV0b193ID0gMHgxZSwgICAgICAgIC8qKiA5MDVCIFJldmlzaW9uIE9ubHkgICAgICAgICAgICAgICAgICoqLworICAgIHJlZ1R4U3RhdHVzX2IgPSAweDFiLCAgICAgICAgICAgICAvKiogVW5pdmVyc2FsIHdpdGggRXhjZXB0aW9uLCBwZyAxMTMgICAqKi8KKyAgICByZWdUaW1lcl9iID0gMHgxYSwgICAgICAgICAgICAgICAgLyoqIFVuaXZlcnNhbCAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisgICAgcmVnVHhQa3RJZF9iID0gMHgxOCwgICAgICAgICAgICAgIC8qKiA5MDVCIFJldmlzaW9uIE9ubHkgICAgICAgICAgICAgICAgICoqLworICAgIHJlZ0NvbW1hbmRJbnRTdGF0dXNfdyA9IDB4MGUsICAgICAvKiogVW5pdmVyc2FsIChDb21tYW5kIFZhcmlhdGlvbnMpICAgICAqKi8KKyAgICB9OworCisvKiogZm9sbG93aW5nIGFyZSB3aW5kb3dlZCByZWdpc3RlcnMgKiovCitlbnVtIFJlZ2lzdGVyczcKKyAgICB7CisgICAgcmVnUG93ZXJNZ210RXZlbnRfN193ID0gMHgwYywgICAgIC8qKiA5MDVCIFJldmlzaW9uIE9ubHkgICAgICAgICAgICAgICAgICoqLworICAgIHJlZ1ZsYW5FdGhlclR5cGVfN193ID0gMHgwNCwgICAgICAvKiogOTA1QiBSZXZpc2lvbiBPbmx5ICAgICAgICAgICAgICAgICAqKi8KKyAgICByZWdWbGFuTWFza183X3cgPSAweDAwLCAgICAgICAgICAgLyoqIDkwNUIgUmV2aXNpb24gT25seSAgICAgICAgICAgICAgICAgKiovCisgICAgfTsKKworZW51bSBSZWdpc3RlcnM2CisgICAgeworICAgIHJlZ0J5dGVzWG1pdHRlZE9rXzZfdyA9IDB4MGMsICAgICAvKiogVW5pdmVyc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKyAgICByZWdCeXRlc1JjdmRPa182X3cgPSAweDBhLCAgICAgICAgLyoqIFVuaXZlcnNhbCAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisgICAgcmVnVXBwZXJGcmFtZXNPa182X2IgPSAweDA5LCAgICAgIC8qKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworICAgIHJlZ0ZyYW1lc0RlZmVycmVkXzZfYiA9IDB4MDgsICAgICAvKiogVW5pdmVyc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKyAgICByZWdGcmFtZXNSZWNkT2tfNl9iID0gMHgwNywgICAgICAgLyoqIFVuaXZlcnNhbCB3aXRoIEV4Y2VwdGlvbnMsIHBnIDE0MiAgKiovCisgICAgcmVnRnJhbWVzWG1pdHRlZE9rXzZfYiA9IDB4MDYsICAgIC8qKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworICAgIHJlZ1J4T3ZlcnJ1bnNfNl9iID0gMHgwNSwgICAgICAgICAvKiogVW5pdmVyc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKyAgICByZWdMYXRlQ29sbGlzaW9uc182X2IgPSAweDA0LCAgICAgLyoqIFVuaXZlcnNhbCAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisgICAgcmVnU2luZ2xlQ29sbGlzaW9uc182X2IgPSAweDAzLCAgIC8qKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworICAgIHJlZ011bHRpcGxlQ29sbGlzaW9uc182X2IgPSAweDAyLCAvKiogVW5pdmVyc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKyAgICByZWdTcWVFcnJvcnNfNl9iID0gMHgwMSwgICAgICAgICAgLyoqIFVuaXZlcnNhbCAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisgICAgcmVnQ2Fycmllckxvc3RfNl9iID0gMHgwMCwgICAgICAgIC8qKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworICAgIH07CisKK2VudW0gUmVnaXN0ZXJzNQorICAgIHsKKyAgICByZWdJbmRpY2F0aW9uRW5hYmxlXzVfdyA9IDB4MGMsICAgLyoqIFVuaXZlcnNhbCAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisgICAgcmVnSW50ZXJydXB0RW5hYmxlXzVfdyA9IDB4MGEsICAgIC8qKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworICAgIHJlZ1R4UmVjbGFpbVRocmVzaF81X2IgPSAweDA5LCAgICAvKiogOTA1QiBSZXZpc2lvbiBPbmx5ICAgICAgICAgICAgICAgICAqKi8KKyAgICByZWdSeEZpbHRlcl81X2IgPSAweDA4LCAgICAgICAgICAgLyoqIFVuaXZlcnNhbCAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisgICAgcmVnUnhFYXJseVRocmVzaF81X3cgPSAweDA2LCAgICAgIC8qKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworICAgIHJlZ1R4U3RhcnRUaHJlc2hfNV93ID0gMHgwMCwgICAgICAvKiogVW5pdmVyc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKyAgICB9OworCitlbnVtIFJlZ2lzdGVyczQKKyAgICB7CisgICAgcmVnVXBwZXJCeXRlc09rXzRfYiA9IDB4MGQsICAgICAgIC8qKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworICAgIHJlZ0JhZFNTRF80X2IgPSAweDBjLCAgICAgICAgICAgICAvKiogVW5pdmVyc2FsICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKyAgICByZWdNZWRpYVN0YXR1c180X3cgPSAweDBhLCAgICAgICAgLyoqIFVuaXZlcnNhbCB3aXRoIEV4Y2VwdGlvbnMsIHBnIDIwMSAgKiovCisgICAgcmVnUGh5c2ljYWxNZ210XzRfdyA9IDB4MDgsICAgICAgIC8qKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworICAgIHJlZ05ldHdvcmtEaWFnbm9zdGljXzRfdyA9IDB4MDYsICAvKiogVW5pdmVyc2FsIHdpdGggRXhjZXB0aW9ucywgcGcgMjAzICAqKi8KKyAgICByZWdGaWZvRGlhZ25vc3RpY180X3cgPSAweDA0LCAgICAgLyoqIFVuaXZlcnNhbCB3aXRoIEV4Y2VwdGlvbnMsIHBnIDE5NiAgKiovCisgICAgcmVnVmNvRGlhZ25vc3RpY180X3cgPSAweDAyLCAgICAgIC8qKiBVbmRvY3VtZW50ZWQ/ICAgICAgICAgICAgICAgICAgICAgICoqLworICAgIH07CisKK2VudW0gUmVnaXN0ZXJzMworICAgIHsKKyAgICByZWdUeEZyZWVfM193ID0gMHgwYywgICAgICAgICAgICAgLyoqIFVuaXZlcnNhbCAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisgICAgcmVnUnhGcmVlXzNfdyA9IDB4MGEsICAgICAgICAgICAgIC8qKiBVbml2ZXJzYWwgd2l0aCBFeGNlcHRpb25zLCBwZyAxMjUgICoqLworICAgIHJlZ1Jlc2V0TWVkaWFPcHRpb25zXzNfdyA9IDB4MDgsICAvKiogTWVkaWEgT3B0aW9ucyBvbiBCIFJldmlzaW9uLCAgICAgICAqKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIFJlc2V0IE9wdGlvbnMgb24gTm9uLUIgUmV2aXNpb24gICAgKiovCisgICAgcmVnTWFjQ29udHJvbF8zX3cgPSAweDA2LCAgICAgICAgIC8qKiBVbml2ZXJzYWwgd2l0aCBFeGNlcHRpb25zLCBwZyAxOTkgICoqLworICAgIHJlZ01heFBrdFNpemVfM193ID0gMHgwNCwgICAgICAgICAvKiogOTA1QiBSZXZpc2lvbiBPbmx5ICAgICAgICAgICAgICAgICAqKi8KKyAgICByZWdJbnRlcm5hbENvbmZpZ18zX2wgPSAweDAwLCAgICAgLyoqIFVuaXZlcnNhbCwgZGlmZmVyZW50IGJpdCAgICAgICAgICAgKiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBkZWZpbml0aW9ucywgcGcgNTkgICAgICAgICAgICAgICAgICoqLworICAgIH07CisKK2VudW0gUmVnaXN0ZXJzMgorICAgIHsKKyAgICByZWdSZXNldE9wdGlvbnNfMl93ID0gMHgwYywgICAgICAgLyoqIDkwNUIgUmV2aXNpb24gT25seSAgICAgICAgICAgICAgICAgKiovCisgICAgcmVnU3RhdGlvbk1hc2tfMl8zdyA9IDB4MDYsICAgICAgIC8qKiBVbml2ZXJzYWwgd2l0aCBFeGNlcHRpb25zLCBwZyAxMjcgICoqLworICAgIHJlZ1N0YXRpb25BZGRyZXNzXzJfM3cgPSAweDAwLCAgICAvKiogVW5pdmVyc2FsIHdpdGggRXhjZXB0aW9ucywgcGcgMTI3ICAqKi8KKyAgICB9OworCitlbnVtIFJlZ2lzdGVyczEKKyAgICB7CisgICAgcmVnUnhTdGF0dXNfMV93ID0gMHgwYSwgICAgICAgICAgIC8qKiA5MFggUmV2aXNpb24gT25seSwgUGcgMTI2ICAgICAgICAgICoqLworICAgIH07CisKK2VudW0gUmVnaXN0ZXJzMAorICAgIHsKKyAgICByZWdFZXByb21EYXRhXzBfdyA9IDB4MGMsICAgICAgICAgLyoqIFVuaXZlcnNhbCAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisgICAgcmVnRWVwcm9tQ29tbWFuZF8wX3cgPSAweDBhLCAgICAgIC8qKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworICAgIHJlZ0Jpb3NSb21EYXRhXzBfYiA9IDB4MDgsICAgICAgICAvKiogOTA1QiBSZXZpc2lvbiBPbmx5ICAgICAgICAgICAgICAgICAqKi8KKyAgICByZWdCaW9zUm9tQWRkcl8wX2wgPSAweDA0LCAgICAgICAgLyoqIDkwNUIgUmV2aXNpb24gT25seSAgICAgICAgICAgICAgICAgKiovCisgICAgfTsKKworCisvKioqIFRoZSBuYW1lcyBmb3IgdGhlIGVpZ2h0IHJlZ2lzdGVyIHdpbmRvd3MgKioqLworZW51bSBXaW5kb3dzCisgICAgeworICAgIHdpblBvd2VyVmxhbjcgPSAweDA3LAorICAgIHdpblN0YXRpc3RpY3M2ID0gMHgwNiwKKyAgICB3aW5UeFJ4Q29udHJvbDUgPSAweDA1LAorICAgIHdpbkRpYWdub3N0aWNzNCA9IDB4MDQsCisgICAgd2luVHhSeE9wdGlvbnMzID0gMHgwMywKKyAgICB3aW5BZGRyZXNzaW5nMiA9IDB4MDIsCisgICAgd2luVW51c2VkMSA9IDB4MDEsCisgICAgd2luRWVwcm9tQmlvczAgPSAweDAwLAorICAgIH07CisKKworLyoqKiBDb21tYW5kIGRlZmluaXRpb25zIGZvciB0aGUgM2M5MFggKioqLworZW51bSBDb21tYW5kcworICAgIHsKKyAgICBjbWRHbG9iYWxSZXNldCA9IDB4MDAsICAgICAgICAgICAgIC8qKiBVbml2ZXJzYWwgd2l0aCBFeGNlcHRpb25zLCBwZyAxNTEgKiovCisgICAgY21kU2VsZWN0UmVnaXN0ZXJXaW5kb3cgPSAweDAxLCAgICAvKiogVW5pdmVyc2FsICAgICAgICAgICAgICAgICAgICAgICAgICoqLworICAgIGNtZEVuYWJsZURjQ29udmVydGVyID0gMHgwMiwgICAgICAgLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKyAgICBjbWRSeERpc2FibGUgPSAweDAzLCAgICAgICAgICAgICAgIC8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisgICAgY21kUnhFbmFibGUgPSAweDA0LCAgICAgICAgICAgICAgICAvKiogVW5pdmVyc2FsICAgICAgICAgICAgICAgICAgICAgICAgICoqLworICAgIGNtZFJ4UmVzZXQgPSAweDA1LCAgICAgICAgICAgICAgICAgLyoqIFVuaXZlcnNhbCAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKyAgICBjbWRTdGFsbEN0bCA9IDB4MDYsICAgICAgICAgICAgICAgIC8qKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisgICAgY21kVHhFbmFibGUgPSAweDA5LCAgICAgICAgICAgICAgICAvKiogVW5pdmVyc2FsICAgICAgICAgICAgICAgICAgICAgICAgICoqLworICAgIGNtZFR4RGlzYWJsZSA9IDB4MEEsICAgICAgICAgICAgICAgLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKyAgICBjbWRUeFJlc2V0ID0gMHgwQiwgICAgICAgICAgICAgICAgIC8qKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisgICAgY21kUmVxdWVzdEludGVycnVwdCA9IDB4MEMsICAgICAgICAvKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworICAgIGNtZEFja25vd2xlZGdlSW50ZXJydXB0ID0gMHgwRCwgICAgLyoqIFVuaXZlcnNhbCAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKyAgICBjbWRTZXRJbnRlcnJ1cHRFbmFibGUgPSAweDBFLCAgICAgIC8qKiBVbml2ZXJzYWwgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisgICAgY21kU2V0SW5kaWNhdGlvbkVuYWJsZSA9IDB4MEYsICAgICAvKiogVW5pdmVyc2FsICAgICAgICAgICAgICAgICAgICAgICAgICoqLworICAgIGNtZFNldFJ4RmlsdGVyID0gMHgxMCwgICAgICAgICAgICAgLyoqIFVuaXZlcnNhbCAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKyAgICBjbWRTZXRSeEVhcmx5VGhyZXNoID0gMHgxMSwgICAgICAgIC8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisgICAgY21kU2V0VHhTdGFydFRocmVzaCA9IDB4MTMsICAgICAgICAvKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworICAgIGNtZFN0YXRpc3RpY3NFbmFibGUgPSAweDE1LCAgICAgICAgLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKyAgICBjbWRTdGF0aXN0aWNzRGlzYWJsZSA9IDB4MTYsICAgICAgIC8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisgICAgY21kRGlzYWJsZURjQ29udmVydGVyID0gMHgxNywgICAgICAvKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworICAgIGNtZFNldFR4UmVjbGFpbVRocmVzaCA9IDB4MTgsICAgICAgLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKyAgICBjbWRTZXRIYXNoRmlsdGVyQml0ID0gMHgxOSwgICAgICAgIC8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisgICAgfTsKKworCisvKioqIFZhbHVlcyBmb3IgaW50IHN0YXR1cyByZWdpc3RlciBiaXRtYXNrICoqLworI2RlZmluZQlJTlRfSU5URVJSVVBUTEFUQ0gJKDE8PDApCisjZGVmaW5lIElOVF9IT1NURVJST1IJCSgxPDwxKQorI2RlZmluZSBJTlRfVFhDT01QTEVURQkJKDE8PDIpCisjZGVmaW5lIElOVF9SWENPTVBMRVRFCQkoMTw8NCkKKyNkZWZpbmUgSU5UX1JYRUFSTFkJCSgxPDw1KQorI2RlZmluZSBJTlRfSU5UUkVRVUVTVEVECSgxPDw2KQorI2RlZmluZSBJTlRfVVBEQVRFU1RBVFMJCSgxPDw3KQorI2RlZmluZSBJTlRfTElOS0VWRU5UCQkoMTw8OCkKKyNkZWZpbmUgSU5UX0ROQ09NUExFVEUJCSgxPDw5KQorI2RlZmluZSBJTlRfVVBDT01QTEVURQkJKDE8PDEwKQorI2RlZmluZSBJTlRfQ01ESU5QUk9HUkVTUwkoMTw8MTIpCisjZGVmaW5lIElOVF9XSU5ET1dOVU1CRVIJKDc8PDEzKQorCisKKy8qKiogVFggZGVzY3JpcHRvciAqKiovCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICB1bnNpZ25lZCBpbnQJRG5OZXh0UHRyOworICAgIHVuc2lnbmVkIGludAlGcmFtZVN0YXJ0SGVhZGVyOworICAgIHVuc2lnbmVkIGludAlIZHJBZGRyOworICAgIHVuc2lnbmVkIGludAlIZHJMZW5ndGg7CisgICAgdW5zaWduZWQgaW50CURhdGFBZGRyOworICAgIHVuc2lnbmVkIGludAlEYXRhTGVuZ3RoOworICAgIH0KKyAgICBUWEQ7CisKKy8qKiogUlggZGVzY3JpcHRvciAqKiovCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICB1bnNpZ25lZCBpbnQJVXBOZXh0UHRyOworICAgIHVuc2lnbmVkIGludAlVcFBrdFN0YXR1czsKKyAgICB1bnNpZ25lZCBpbnQJRGF0YUFkZHI7CisgICAgdW5zaWduZWQgaW50CURhdGFMZW5ndGg7CisgICAgfQorICAgIFJYRDsKKworLyoqKiBHbG9iYWwgdmFyaWFibGVzICoqKi8KK3N0YXRpYyBzdHJ1Y3QKKyAgICB7CisgICAgdW5zaWduZWQgY2hhcglpc0JyZXY7CisgICAgdW5zaWduZWQgY2hhcglDdXJyZW50V2luZG93OworICAgIHVuc2lnbmVkIGludAlJT0FkZHI7CisgICAgdW5zaWduZWQgY2hhcglIV0FkZHJbRVRIX0FMRU5dOworICAgIFRYRAkJCVRyYW5zbWl0RFBEOworICAgIFJYRAkJCVJlY2VpdmVVUEQ7CisgICAgfQorICAgIElORl8zQzkwWDsKKworCisvKioqIGEzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQ6IHNlbmRzIGEgY29tbWFuZCB0byB0aGUgM2M5MHggY2FyZAorICoqKi8KK3N0YXRpYyBpbnQKK2EzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQoaW50IGlvYWRkciwgaW50IGNtZCwgaW50IHBhcmFtKQorICAgIHsKKyAgICB1bnNpZ25lZCBpbnQgdmFsOworCisJLyoqIEJ1aWxkIHRoZSBjbWQuICoqLworCXZhbCA9IGNtZDsKKwl2YWwgPDw9IDExOworCXZhbCB8PSBwYXJhbTsKKworCS8qKiBTZW5kIHRoZSBjbWQgdG8gdGhlIGNtZCByZWdpc3RlciAqKi8KKwlvdXR3KHZhbCwgaW9hZGRyICsgcmVnQ29tbWFuZEludFN0YXR1c193KTsKKworCS8qKiBXYWl0IGZvciB0aGUgY21kIHRvIGNvbXBsZXRlLCBpZiBuZWNlc3NhcnkgKiovCisJd2hpbGUgKGludyhpb2FkZHIgKyByZWdDb21tYW5kSW50U3RhdHVzX3cpICYgSU5UX0NNRElOUFJPR1JFU1MpOworCisgICAgcmV0dXJuIDA7CisgICAgfQorCisKKy8qKiogYTNjOTB4X2ludGVybmFsX1NldFdpbmRvdzogc2VsZWN0cyBhIHJlZ2lzdGVyIHdpbmRvdyBzZXQuCisgKioqLworc3RhdGljIGludAorYTNjOTB4X2ludGVybmFsX1NldFdpbmRvdyhpbnQgaW9hZGRyLCBpbnQgd2luZG93KQorICAgIHsKKworCS8qKiBXaW5kb3cgYWxyZWFkeSBhcyBzZXQ/ICoqLworCWlmIChJTkZfM0M5MFguQ3VycmVudFdpbmRvdyA9PSB3aW5kb3cpIHJldHVybiAwOworCisJLyoqIElzc3VlIHRoZSB3aW5kb3cgY29tbWFuZC4gKiovCisJYTNjOTB4X2ludGVybmFsX0lzc3VlQ29tbWFuZChpb2FkZHIsIGNtZFNlbGVjdFJlZ2lzdGVyV2luZG93LCB3aW5kb3cpOworCUlORl8zQzkwWC5DdXJyZW50V2luZG93ID0gd2luZG93OworCisgICAgcmV0dXJuIDA7CisgICAgfQorCisKKy8qKiogYTNjOTB4X2ludGVybmFsX1JlYWRFZXByb20gLSByZWFkIGRhdGEgZnJvbSB0aGUgc2VyaWFsIGVlcHJvbS4KKyAqKiovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK2EzYzkweF9pbnRlcm5hbF9SZWFkRWVwcm9tKGludCBpb2FkZHIsIGludCBhZGRyZXNzKQorICAgIHsKKyAgICB1bnNpZ25lZCBzaG9ydCB2YWw7CisKKwkvKiogU2VsZWN0IGNvcnJlY3Qgd2luZG93ICoqLworICAgICAgICBhM2M5MHhfaW50ZXJuYWxfU2V0V2luZG93KElORl8zQzkwWC5JT0FkZHIsIHdpbkVlcHJvbUJpb3MwKTsKKworCS8qKiBNYWtlIHN1cmUgdGhlIGVlcHJvbSBpc24ndCBidXN5ICoqLworCXdoaWxlKCgxPDwxNSkgJiBpbncoaW9hZGRyICsgcmVnRWVwcm9tQ29tbWFuZF8wX3cpKTsKKworCS8qKiBSZWFkIHRoZSB2YWx1ZS4gKiovCisJb3V0dyhhZGRyZXNzICsgKCgweDAyKTw8NiksIGlvYWRkciArIHJlZ0VlcHJvbUNvbW1hbmRfMF93KTsKKwl3aGlsZSgoMTw8MTUpICYgaW53KGlvYWRkciArIHJlZ0VlcHJvbUNvbW1hbmRfMF93KSk7CisJdmFsID0gaW53KGlvYWRkciArIHJlZ0VlcHJvbURhdGFfMF93KTsKKworICAgIHJldHVybiB2YWw7CisgICAgfQorCisKKy8qKiogYTNjOTB4X2ludGVybmFsX1dyaXRlRWVwcm9tV29yZCAtIHdyaXRlIGEgcGh5c2ljYWwgd29yZCBvZgorICoqKiBkYXRhIHRvIHRoZSBvbmJvYXJkIHNlcmlhbCBlZXByb20gKG5vdCB0aGUgQklPUyBwcm9tLCBidXQgdGhlCisgKioqIG52cmFtIGluIHRoZSBjYXJkIHRoYXQgc3RvcmVzLCBhbW9uZyBvdGhlciB0aGluZ3MsIHRoZSBNQUMKKyAqKiogYWRkcmVzcykuCisgKioqLworc3RhdGljIGludAorYTNjOTB4X2ludGVybmFsX1dyaXRlRWVwcm9tV29yZChpbnQgaW9hZGRyLCBpbnQgYWRkcmVzcywgdW5zaWduZWQgc2hvcnQgdmFsdWUpCisgICAgeworCS8qKiBTZWxlY3QgcmVnaXN0ZXIgd2luZG93ICoqLworICAgICAgICBhM2M5MHhfaW50ZXJuYWxfU2V0V2luZG93KGlvYWRkciwgd2luRWVwcm9tQmlvczApOworCisJLyoqIFZlcmlmeSBFZXByb20gbm90IGJ1c3kgKiovCisJd2hpbGUoKDE8PDE1KSAmIGludyhpb2FkZHIgKyByZWdFZXByb21Db21tYW5kXzBfdykpOworCisJLyoqIElzc3VlIFdyaXRlRW5hYmxlLCBhbmQgd2FpdCBmb3IgY29tcGxldGlvbi4gKiovCisJb3V0dygweDMwLCBpb2FkZHIgKyByZWdFZXByb21Db21tYW5kXzBfdyk7CisJd2hpbGUoKDE8PDE1KSAmIGludyhpb2FkZHIgKyByZWdFZXByb21Db21tYW5kXzBfdykpOworCisJLyoqIElzc3VlIEVyYXNlUmVnaXN0ZXIsIGFuZCB3YWl0IGZvciBjb21wbGV0aW9uLiAqKi8KKwlvdXR3KGFkZHJlc3MgKyAoKDB4MDMpPDw2KSwgaW9hZGRyICsgcmVnRWVwcm9tQ29tbWFuZF8wX3cpOworCXdoaWxlKCgxPDwxNSkgJiBpbncoaW9hZGRyICsgcmVnRWVwcm9tQ29tbWFuZF8wX3cpKTsKKworCS8qKiBTZW5kIHRoZSBuZXcgZGF0YSB0byB0aGUgZWVwcm9tLCBhbmQgd2FpdCBmb3IgY29tcGxldGlvbi4gKiovCisJb3V0dyh2YWx1ZSwgaW9hZGRyICsgcmVnRWVwcm9tRGF0YV8wX3cpOworCW91dHcoMHgzMCwgaW9hZGRyICsgcmVnRWVwcm9tQ29tbWFuZF8wX3cpOworCXdoaWxlKCgxPDwxNSkgJiBpbncoaW9hZGRyICsgcmVnRWVwcm9tQ29tbWFuZF8wX3cpKTsKKworCS8qKiBCdXJuIHRoZSBuZXcgZGF0YSBpbnRvIHRoZSBlZXByb20sIGFuZCB3YWl0IGZvciBjb21wbGV0aW9uLiAqKi8KKwlvdXR3KGFkZHJlc3MgKyAoKDB4MDEpPDw2KSwgaW9hZGRyICsgcmVnRWVwcm9tQ29tbWFuZF8wX3cpOworCXdoaWxlKCgxPDwxNSkgJiBpbncoaW9hZGRyICsgcmVnRWVwcm9tQ29tbWFuZF8wX3cpKTsKKworICAgIHJldHVybiAwOworICAgIH0KKworCisvKioqIGEzYzkweF9pbnRlcm5hbF9Xcml0ZUVlcHJvbSAtIHdyaXRlIGRhdGEgdG8gdGhlIHNlcmlhbCBlZXByb20sCisgKioqIGFuZCByZS1jb21wdXRlIHRoZSBlZXByb20gY2hlY2tzdW0uCisgKioqLworc3RhdGljIGludAorYTNjOTB4X2ludGVybmFsX1dyaXRlRWVwcm9tKGludCBpb2FkZHIsIGludCBhZGRyZXNzLCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKKyAgICB7CisgICAgaW50IGNrc3VtID0gMCx2OworICAgIGludCBpOworICAgIGludCBtYXhBZGRyZXNzLCBja3N1bUFkZHJlc3M7CisKKwlpZiAoSU5GXzNDOTBYLmlzQnJldikKKwkgICAgeworCSAgICBtYXhBZGRyZXNzPTB4MWY7CisJICAgIGNrc3VtQWRkcmVzcz0weDIwOworCSAgICB9CisJZWxzZQorCSAgICB7CisJICAgIG1heEFkZHJlc3M9MHgxNjsKKwkgICAgY2tzdW1BZGRyZXNzPTB4MTc7CisJICAgIH0KKworCS8qKiBXcml0ZSB0aGUgdmFsdWUuICoqLworCWlmIChhM2M5MHhfaW50ZXJuYWxfV3JpdGVFZXByb21Xb3JkKGlvYWRkciwgYWRkcmVzcywgdmFsdWUpID09IC0xKQorCSAgICByZXR1cm4gLTE7CisKKwkvKiogUmVjb21wdXRlIHRoZSBjaGVja3N1bS4gKiovCisJZm9yKGk9MDtpPD1tYXhBZGRyZXNzO2krKykKKwkgICAgeworCSAgICB2ID0gYTNjOTB4X2ludGVybmFsX1JlYWRFZXByb20oaW9hZGRyLCBpKTsKKwkgICAgY2tzdW0gXj0gKHYgJiAweEZGKTsKKwkgICAgY2tzdW0gXj0gKCh2Pj44KSAmIDB4RkYpOworCSAgICB9CisJLyoqIFdyaXRlIHRoZSBjaGVja3N1bSB0byB0aGUgbG9jYXRpb24gaW4gdGhlIGVlcHJvbSAqKi8KKwlpZiAoYTNjOTB4X2ludGVybmFsX1dyaXRlRWVwcm9tV29yZChpb2FkZHIsIGNrc3VtQWRkcmVzcywgY2tzdW0pID09IC0xKQorCSAgICByZXR1cm4gLTE7CisKKyAgICByZXR1cm4gMDsKKyAgICB9CisKKworCisvKioqIGEzYzkweF9yZXNldDogZXhwb3J0ZWQgZnVuY3Rpb24gdGhhdCByZXNldHMgdGhlIGNhcmQgdG8gaXRzIGRlZmF1bHQKKyAqKiogc3RhdGUuICBUaGlzIGlzIHNvIHRoZSBMaW51eCBkcml2ZXIgY2FuIHJlLXNldCB0aGUgY2FyZCB1cCB0aGUgd2F5CisgKioqIGl0IHdhbnRzIHRvLiAgSWYgQ0ZHXzNDOTBYX1BSRVNFUlZFX1hDVlIgaXMgZGVmaW5lZCwgdGhlbiB0aGUgcmVzZXQgd2lsbAorICoqKiBub3QgYWx0ZXIgdGhlIHNlbGVjdGVkIHRyYW5zY2VpdmVyIHRoYXQgd2UgdXNlZCB0byBkb3dubG9hZCB0aGUgYm9vdAorICoqKiBpbWFnZS4KKyAqKiovCitzdGF0aWMgdm9pZAorYTNjOTB4X3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKKyAgICB7CisgICAgaW50IGNmZzsKKworI2lmZGVmCUNGR18zQzkwWF9QUkVTRVJWRV9YQ1ZSCisgICAgLyoqIFJlYWQgdGhlIGN1cnJlbnQgSW50ZXJuYWxDb25maWcgdmFsdWUuICoqLworICAgIGEzYzkweF9pbnRlcm5hbF9TZXRXaW5kb3coSU5GXzNDOTBYLklPQWRkciwgd2luVHhSeE9wdGlvbnMzKTsKKyAgICBjZmcgPSBpbmwoSU5GXzNDOTBYLklPQWRkciArIHJlZ0ludGVybmFsQ29uZmlnXzNfbCk7CisjZW5kaWYKKworICAgIC8qKiBTZW5kIHRoZSByZXNldCBjb21tYW5kIHRvIHRoZSBjYXJkICoqLworICAgIHByaW50ZigiSXNzdWluZyBSRVNFVDpcbiIpOworICAgIGEzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQoSU5GXzNDOTBYLklPQWRkciwgY21kR2xvYmFsUmVzZXQsIDApOworCisgICAgLyoqIHdhaXQgZm9yIHJlc2V0IGNvbW1hbmQgdG8gY29tcGxldGUgKiovCisgICAgd2hpbGUgKGludyhJTkZfM0M5MFguSU9BZGRyICsgcmVnQ29tbWFuZEludFN0YXR1c193KSAmIElOVF9DTURJTlBST0dSRVNTKTsKKworICAgIC8qKiBnbG9iYWwgcmVzZXQgY29tbWFuZCByZXNldHMgc3RhdGlvbiBtYXNrLCBub24tQiByZXZpc2lvbiBjYXJkcworICAgICAqKiByZXF1aXJlIGV4cGxpY2l0IHJlc2V0IG9mIHZhbHVlcworICAgICAqKi8KKyAgICBhM2M5MHhfaW50ZXJuYWxfU2V0V2luZG93KElORl8zQzkwWC5JT0FkZHIsIHdpbkFkZHJlc3NpbmcyKTsKKyAgICBvdXR3KDAsIElORl8zQzkwWC5JT0FkZHIgKyByZWdTdGF0aW9uTWFza18yXzN3KzApOworICAgIG91dHcoMCwgSU5GXzNDOTBYLklPQWRkciArIHJlZ1N0YXRpb25NYXNrXzJfM3crMik7CisgICAgb3V0dygwLCBJTkZfM0M5MFguSU9BZGRyICsgcmVnU3RhdGlvbk1hc2tfMl8zdys0KTsKKworI2lmZGVmCUNGR18zQzkwWF9QUkVTRVJWRV9YQ1ZSCisgICAgLyoqIFJlLXNldCB0aGUgb3JpZ2luYWwgSW50ZXJuYWxDb25maWcgdmFsdWUgZnJvbSBiZWZvcmUgcmVzZXQgKiovCisgICAgYTNjOTB4X2ludGVybmFsX1NldFdpbmRvdyhJTkZfM0M5MFguSU9BZGRyLCB3aW5UeFJ4T3B0aW9uczMpOworICAgIG91dGwoY2ZnLCBJTkZfM0M5MFguSU9BZGRyICsgcmVnSW50ZXJuYWxDb25maWdfM19sKTsKKworICAgIC8qKiBlbmFibGUgREMgY29udmVydGVyIGZvciAxMC1CYXNlLVQgKiovCisgICAgaWYgKChjZmcmMHgwMzAwKSA9PSAweDAzMDApCisJeworCWEzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQoSU5GXzNDOTBYLklPQWRkciwgY21kRW5hYmxlRGNDb252ZXJ0ZXIsIDApOworCX0KKyNlbmRpZgorCisgICAgLyoqIElzc3VlIHRyYW5zbWl0IHJlc2V0LCB3YWl0IGZvciBjb21tYW5kIGNvbXBsZXRpb24gKiovCisgICAgYTNjOTB4X2ludGVybmFsX0lzc3VlQ29tbWFuZChJTkZfM0M5MFguSU9BZGRyLCBjbWRUeFJlc2V0LCAwKTsKKyAgICB3aGlsZSAoaW53KElORl8zQzkwWC5JT0FkZHIgKyByZWdDb21tYW5kSW50U3RhdHVzX3cpICYgSU5UX0NNRElOUFJPR1JFU1MpCisJOworICAgIGlmICghIElORl8zQzkwWC5pc0JyZXYpCisJb3V0YigweDAxLCBJTkZfM0M5MFguSU9BZGRyICsgcmVnVHhGcmVlVGhyZXNoX2IpOworICAgIGEzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQoSU5GXzNDOTBYLklPQWRkciwgY21kVHhFbmFibGUsIDApOworCisgICAgLyoqCisgICAgICoqIHJlc2V0IG9mIHRoZSByZWNlaXZlciBvbiBCLXJldmlzaW9uIGNhcmRzIHJlLW5lZ290aWF0ZXMgdGhlIGxpbmsKKyAgICAgKiogdGFrZXMgc2V2ZXJhbCBzZWNvbmRzIChhIGNvbXB1dGVyIGV0ZXJuaXR5KQorICAgICAqKi8KKyAgICBpZiAoSU5GXzNDOTBYLmlzQnJldikKKwlhM2M5MHhfaW50ZXJuYWxfSXNzdWVDb21tYW5kKElORl8zQzkwWC5JT0FkZHIsIGNtZFJ4UmVzZXQsIDB4MDQpOworICAgIGVsc2UKKwlhM2M5MHhfaW50ZXJuYWxfSXNzdWVDb21tYW5kKElORl8zQzkwWC5JT0FkZHIsIGNtZFJ4UmVzZXQsIDB4MDApOworICAgIHdoaWxlIChpbncoSU5GXzNDOTBYLklPQWRkciArIHJlZ0NvbW1hbmRJbnRTdGF0dXNfdykgJiBJTlRfQ01ESU5QUk9HUkVTUyk7CisJOworICAgIGEzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQoSU5GXzNDOTBYLklPQWRkciwgY21kUnhFbmFibGUsIDApOworCisgICAgYTNjOTB4X2ludGVybmFsX0lzc3VlQ29tbWFuZChJTkZfM0M5MFguSU9BZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kU2V0SW50ZXJydXB0RW5hYmxlLCAwKTsKKyAgICAvKiogZW5hYmxlIHJ4Q29tcGxldGUgYW5kIHR4Q29tcGxldGUgKiovCisgICAgYTNjOTB4X2ludGVybmFsX0lzc3VlQ29tbWFuZChJTkZfM0M5MFguSU9BZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kU2V0SW5kaWNhdGlvbkVuYWJsZSwgMHgwMDE0KTsKKyAgICAvKiogYWNrbm93bGVkZ2UgYW55IHBlbmRpbmcgc3RhdHVzIGZsYWdzICoqLworICAgIGEzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQoSU5GXzNDOTBYLklPQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZEFja25vd2xlZGdlSW50ZXJydXB0LCAweDY2MSk7CisKKyAgICByZXR1cm47CisgICAgfQorCisKKworLyoqKiBhM2M5MHhfdHJhbnNtaXQ6IGV4cG9ydGVkIGZ1bmN0aW9uIHRoYXQgdHJhbnNtaXRzIGEgcGFja2V0LiAgRG9lcyBub3QKKyAqKiogcmV0dXJuIGFueSBwYXJ0aWN1bGFyIHN0YXR1cy4gIFBhcmFtZXRlcnMgYXJlOgorICoqKiBkWzZdIC0gZGVzdGluYXRpb24gYWRkcmVzcywgZXRoZXJuZXQ7CisgKioqIHQgLSBwcm90b2NvbCB0eXBlIChBUlAsIElQLCBldGMpOworICoqKiBzIC0gc2l6ZSBvZiB0aGUgbm9uLWhlYWRlciBwYXJ0IG9mIHRoZSBwYWNrZXQgdGhhdCBuZWVkcyB0cmFuc21pdHRlZDsKKyAqKiogcCAtIHRoZSBwb2ludGVyIHRvIHRoZSBwYWNrZXQgZGF0YSBpdHNlbGYuCisgKioqLworc3RhdGljIHZvaWQKK2EzYzkweF90cmFuc21pdChzdHJ1Y3QgbmljICpuaWMsIGNvbnN0IGNoYXIgKmQsIHVuc2lnbmVkIGludCB0LAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzLCBjb25zdCBjaGFyICpwKQorICAgIHsKKworICAgIHN0cnVjdCBldGhfaGRyCisJeworCXVuc2lnbmVkIGNoYXIgZHN0X2FkZHJbRVRIX0FMRU5dOworCXVuc2lnbmVkIGNoYXIgc3JjX2FkZHJbRVRIX0FMRU5dOworCXVuc2lnbmVkIHNob3J0IHR5cGU7CisJfSBoZHI7CisKKyAgICB1bnNpZ25lZCBjaGFyIHN0YXR1czsKKyAgICB1bnNpZ25lZCBpLCByZXRyaWVzOworCisgICAgZm9yIChyZXRyaWVzPTA7IHJldHJpZXMgPCBYTUlUX1JFVFJJRVMgOyByZXRyaWVzKyspCisJeworCS8qKiBTdGFsbCB0aGUgZG93bmxvYWQgZW5naW5lICoqLworCWEzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQoSU5GXzNDOTBYLklPQWRkciwgY21kU3RhbGxDdGwsIDIpOworCisJLyoqIE1ha2Ugc3VyZSB0aGUgY2FyZCBpcyBub3Qgd2FpdGluZyBvbiB1cyAqKi8KKwlpbncoSU5GXzNDOTBYLklPQWRkciArIHJlZ0NvbW1hbmRJbnRTdGF0dXNfdyk7CisJaW53KElORl8zQzkwWC5JT0FkZHIgKyByZWdDb21tYW5kSW50U3RhdHVzX3cpOworCisJd2hpbGUgKGludyhJTkZfM0M5MFguSU9BZGRyK3JlZ0NvbW1hbmRJbnRTdGF0dXNfdykgJgorCSAgICAgICBJTlRfQ01ESU5QUk9HUkVTUykKKwkgICAgOworCisJLyoqIFNldCB0aGUgZXRoZXJuZXQgcGFja2V0IHR5cGUgKiovCisJaGRyLnR5cGUgPSBodG9ucyh0KTsKKworCS8qKiBDb3B5IHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzICoqLworCW1lbWNweShoZHIuZHN0X2FkZHIsIGQsIEVUSF9BTEVOKTsKKworCS8qKiBDb3B5IG91ciBNQUMgYWRkcmVzcyAqKi8KKwltZW1jcHkoaGRyLnNyY19hZGRyLCBJTkZfM0M5MFguSFdBZGRyLCBFVEhfQUxFTik7CisKKwkvKiogU2V0dXAgdGhlIERQRCAoZG93bmxvYWQgZGVzY3JpcHRvcikgKiovCisJSU5GXzNDOTBYLlRyYW5zbWl0RFBELkRuTmV4dFB0ciA9IDA7CisJLyoqIHNldCBub3RpZmljYXRpb24gZm9yIHRyYW5zbWlzc2lvbiBjb21wbGV0aW9uIChiaXQgMTUpICoqLworCUlORl8zQzkwWC5UcmFuc21pdERQRC5GcmFtZVN0YXJ0SGVhZGVyID0gKHMgKyBzaXplb2YoaGRyKSkgfCAweDgwMDA7CisJSU5GXzNDOTBYLlRyYW5zbWl0RFBELkhkckFkZHIgPSB2aXJ0X3RvX2J1cygmaGRyKTsKKwlJTkZfM0M5MFguVHJhbnNtaXREUEQuSGRyTGVuZ3RoID0gc2l6ZW9mKGhkcik7CisJSU5GXzNDOTBYLlRyYW5zbWl0RFBELkRhdGFBZGRyID0gdmlydF90b19idXMocCk7CisJSU5GXzNDOTBYLlRyYW5zbWl0RFBELkRhdGFMZW5ndGggPSBzICsgKDE8PDMxKTsKKworCS8qKiBTZW5kIHRoZSBwYWNrZXQgKiovCisJb3V0bCh2aXJ0X3RvX2J1cygmKElORl8zQzkwWC5UcmFuc21pdERQRCkpLAorCSAgICAgSU5GXzNDOTBYLklPQWRkciArIHJlZ0RuTGlzdFB0cl9sKTsKKworCS8qKiBFbmQgU3RhbGwgYW5kIFdhaXQgZm9yIHVwbG9hZCB0byBjb21wbGV0ZS4gKiovCisJYTNjOTB4X2ludGVybmFsX0lzc3VlQ29tbWFuZChJTkZfM0M5MFguSU9BZGRyLCBjbWRTdGFsbEN0bCwgMyk7CisJd2hpbGUoaW5sKElORl8zQzkwWC5JT0FkZHIgKyByZWdEbkxpc3RQdHJfbCkgIT0gMCkKKwkgICAgOworCisJLyoqIFdhaXQgZm9yIE5JQyBUcmFuc21pdCB0byBDb21wbGV0ZSAqKi8KKwlsb2FkX3RpbWVyMigxMCpUSUNLU19QRVJfTVMpOwkvKiBHaXZlIGl0IDEwIG1zICovCisJd2hpbGUgKCEoaW53KElORl8zQzkwWC5JT0FkZHIgKyByZWdDb21tYW5kSW50U3RhdHVzX3cpJjB4MDAwNCkgJiYKKwkJdGltZXIyX3J1bm5pbmcoKSkKKwkJOworCisJaWYgKCEoaW53KElORl8zQzkwWC5JT0FkZHIgKyByZWdDb21tYW5kSW50U3RhdHVzX3cpJjB4MDAwNCkpCisJICAgIHsKKwkgICAgcHJpbnRmKCIzQzkwWDogVHggVGltZW91dFxuIik7CisJICAgIGNvbnRpbnVlOworCSAgICB9CisKKwlzdGF0dXMgPSBpbmIoSU5GXzNDOTBYLklPQWRkciArIHJlZ1R4U3RhdHVzX2IpOworCisJLyoqIGFja25vd2xlZGdlIHRyYW5zbWl0IGludGVycnVwdCBieSB3cml0aW5nIHN0YXR1cyAqKi8KKwlvdXRiKDB4MDAsIElORl8zQzkwWC5JT0FkZHIgKyByZWdUeFN0YXR1c19iKTsKKworCS8qKiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gKHNhbnMgImludGVycnVwdCBSZXF1ZXN0ZWQiIGJpdCkgKiovCisJaWYgKChzdGF0dXMgJiAweGJmKSA9PSAweDgwKQorCSAgICByZXR1cm47CisKKwkgICBwcmludGYoIjNDOTBYOiBTdGF0dXMgKCVoaFgpXG4iLCBzdGF0dXMpOworCS8qKiBjaGVjayBlcnJvciBjb2RlcyAqKi8KKwlpZiAoc3RhdHVzICYgMHgwMikKKwkgICAgeworCSAgICBwcmludGYoIjNDOTBYOiBUeCBSZWNsYWltIEVycm9yICglaGhYKVxuIiwgc3RhdHVzKTsKKwkgICAgYTNjOTB4X3Jlc2V0KE5VTEwpOworCSAgICB9CisJZWxzZSBpZiAoc3RhdHVzICYgMHgwNCkKKwkgICAgeworCSAgICBwcmludGYoIjNDOTBYOiBUeCBTdGF0dXMgT3ZlcmZsb3cgKCVoaFgpXG4iLCBzdGF0dXMpOworCSAgICBmb3IgKGk9MDsgaTwzMjsgaSsrKQorCQlvdXRiKDB4MDAsIElORl8zQzkwWC5JT0FkZHIgKyByZWdUeFN0YXR1c19iKTsKKwkgICAgLyoqIG11c3QgcmUtZW5hYmxlIGFmdGVyIG1heCBjb2xsaXNpb25zIGJlZm9yZSByZS1pc3N1aW5nIHR4ICoqLworCSAgICBhM2M5MHhfaW50ZXJuYWxfSXNzdWVDb21tYW5kKElORl8zQzkwWC5JT0FkZHIsIGNtZFR4RW5hYmxlLCAwKTsKKwkgICAgfQorCWVsc2UgaWYgKHN0YXR1cyAmIDB4MDgpCisJICAgIHsKKwkgICAgcHJpbnRmKCIzQzkwWDogVHggTWF4IENvbGxpc2lvbnMgKCVoaFgpXG4iLCBzdGF0dXMpOworCSAgICAvKiogbXVzdCByZS1lbmFibGUgYWZ0ZXIgbWF4IGNvbGxpc2lvbnMgYmVmb3JlIHJlLWlzc3VpbmcgdHggKiovCisJICAgIGEzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQoSU5GXzNDOTBYLklPQWRkciwgY21kVHhFbmFibGUsIDApOworCSAgICB9CisJZWxzZSBpZiAoc3RhdHVzICYgMHgxMCkKKwkgICAgeworCSAgICBwcmludGYoIjNDOTBYOiBUeCBVbmRlcnJ1biAoJWhoWClcbiIsIHN0YXR1cyk7CisJICAgIGEzYzkweF9yZXNldChOVUxMKTsKKwkgICAgfQorCWVsc2UgaWYgKHN0YXR1cyAmIDB4MjApCisJICAgIHsKKwkgICAgcHJpbnRmKCIzQzkwWDogVHggSmFiYmVyICglaGhYKVxuIiwgc3RhdHVzKTsKKwkgICAgYTNjOTB4X3Jlc2V0KE5VTEwpOworCSAgICB9CisJZWxzZSBpZiAoKHN0YXR1cyAmIDB4ODApICE9IDB4ODApCisJICAgIHsKKwkgICAgcHJpbnRmKCIzQzkwWDogSW50ZXJuYWwgRXJyb3IgLSBJbmNvbXBsZXRlIFRyYW5zbWlzc2lvbiAoJWhoWClcbiIsCisJICAgICAgICAgICBzdGF0dXMpOworCSAgICBhM2M5MHhfcmVzZXQoTlVMTCk7CisJICAgIH0KKwl9CisKKyAgICAvKiogZmFpbGVkIGFmdGVyIFJFVFJZIGF0dGVtcHRzICoqLworICAgIHByaW50ZigiRmFpbGVkIHRvIHNlbmQgYWZ0ZXIgJWQgcmV0cmllc1xuIiwgcmV0cmllcyk7CisgICAgcmV0dXJuOworCisgICAgfQorCisKKworLyoqKiBhM2M5MHhfcG9sbDogZXhwb3J0ZWQgcm91dGluZSB0aGF0IHdhaXRzIGZvciBhIGNlcnRhaW4gbGVuZ3RoIG9mIHRpbWUKKyAqKiogZm9yIGEgcGFja2V0LCBhbmQgaWYgaXQgc2VlcyBub25lLCByZXR1cm5zIDAuICBUaGlzIHJvdXRpbmUgc2hvdWxkCisgKioqIGNvcHkgdGhlIHBhY2tldCB0byBuaWMtPnBhY2tldCBpZiBpdCBnZXRzIGEgcGFja2V0IGFuZCBzZXQgdGhlIHNpemUKKyAqKiogaW4gbmljLT5wYWNrZXRsZW4uICBSZXR1cm4gMSBpZiBhIHBhY2tldCB3YXMgZm91bmQuCisgKioqLworc3RhdGljIGludAorYTNjOTB4X3BvbGwoc3RydWN0IG5pYyAqbmljKQorICAgIHsKKyAgICBpbnQgaSwgZXJyY29kZTsKKworICAgIGlmICghKGludyhJTkZfM0M5MFguSU9BZGRyICsgcmVnQ29tbWFuZEludFN0YXR1c193KSYweDAwMTApKQorCXsKKwlyZXR1cm4gMDsKKwl9CisKKyAgICAvKiogd2UgZG9uJ3QgbmVlZCB0byBhY2tub3dsZWRnZSByeENvbXBsZXRlIC0tIHRoZSB1cGxvYWQgZW5naW5lCisgICAgICoqIGRvZXMgaXQgZm9yIHVzLgorICAgICAqKi8KKworICAgIC8qKiBCdWlsZCB0aGUgdXAtbG9hZCBkZXNjcmlwdG9yICoqLworICAgIElORl8zQzkwWC5SZWNlaXZlVVBELlVwTmV4dFB0ciA9IDA7CisgICAgSU5GXzNDOTBYLlJlY2VpdmVVUEQuVXBQa3RTdGF0dXMgPSAwOworICAgIElORl8zQzkwWC5SZWNlaXZlVVBELkRhdGFBZGRyID0gdmlydF90b19idXMobmljLT5wYWNrZXQpOworICAgIElORl8zQzkwWC5SZWNlaXZlVVBELkRhdGFMZW5ndGggPSAxNTM2ICsgKDE8PDMxKTsKKworICAgIC8qKiBTdWJtaXQgdGhlIHVwbG9hZCBkZXNjcmlwdG9yIHRvIHRoZSBOSUMgKiovCisgICAgb3V0bCh2aXJ0X3RvX2J1cygmKElORl8zQzkwWC5SZWNlaXZlVVBEKSksCisgICAgICAgICBJTkZfM0M5MFguSU9BZGRyICsgcmVnVXBMaXN0UHRyX2wpOworCisgICAgLyoqIFdhaXQgZm9yIHVwbG9hZCBjb21wbGV0aW9uICh1cENvbXBsZXRlKDE1KSBvciB1cEVycm9yICgxNCkpICoqLworICAgIGZvcihpPTA7aTw0MDAwMDtpKyspOworICAgIHdoaWxlKChJTkZfM0M5MFguUmVjZWl2ZVVQRC5VcFBrdFN0YXR1cyAmICgoMTw8MTQpIHwgKDE8PDE1KSkpID09IDApCisJZm9yKGk9MDtpPDQwMDAwO2krKyk7CisKKyAgICAvKiogQ2hlY2sgZm9yIEVycm9yIChlbHNlIHdlIGhhdmUgZ29vZCBwYWNrZXQpICoqLworICAgIGlmIChJTkZfM0M5MFguUmVjZWl2ZVVQRC5VcFBrdFN0YXR1cyAmICgxPDwxNCkpCisJeworCWVycmNvZGUgPSBJTkZfM0M5MFguUmVjZWl2ZVVQRC5VcFBrdFN0YXR1czsKKwlpZiAoZXJyY29kZSAmICgxPDwxNikpCisJICAgIHByaW50ZigiM0M5MFg6IFJ4IE92ZXJydW4gKCVoWClcbiIsZXJyY29kZT4+MTYpOworCWVsc2UgaWYgKGVycmNvZGUgJiAoMTw8MTcpKQorCSAgICBwcmludGYoIjNDOTBYOiBSdW50IEZyYW1lICglaFgpXG4iLGVycmNvZGU+PjE2KTsKKwllbHNlIGlmIChlcnJjb2RlICYgKDE8PDE4KSkKKwkgICAgcHJpbnRmKCIzQzkwWDogQWxpZ25tZW50IEVycm9yICglaFgpXG4iLGVycmNvZGU+PjE2KTsKKwllbHNlIGlmIChlcnJjb2RlICYgKDE8PDE5KSkKKwkgICAgcHJpbnRmKCIzQzkwWDogQ1JDIEVycm9yICglaFgpXG4iLGVycmNvZGU+PjE2KTsKKwllbHNlIGlmIChlcnJjb2RlICYgKDE8PDIwKSkKKwkgICAgcHJpbnRmKCIzQzkwWDogT3ZlcnNpemVkIEZyYW1lICglaFgpXG4iLGVycmNvZGU+PjE2KTsKKwllbHNlCisJICAgIHByaW50ZigiM0M5MFg6IFBhY2tldCBlcnJvciAoJWhYKVxuIixlcnJjb2RlPj4xNik7CisJcmV0dXJuIDA7CisJfQorCisgICAgLyoqIE9rLCBnb3QgcGFja2V0LiAgU2V0IGxlbmd0aCBpbiBuaWMtPnBhY2tldGxlbi4gKiovCisgICAgbmljLT5wYWNrZXRsZW4gPSAoSU5GXzNDOTBYLlJlY2VpdmVVUEQuVXBQa3RTdGF0dXMgJiAweDFGRkYpOworCisgICAgcmV0dXJuIDE7CisgICAgfQorCisKKworLyoqKiBhM2M5MHhfZGlzYWJsZTogZXhwb3J0ZWQgcm91dGluZSB0byBkaXNhYmxlIHRoZSBjYXJkLiAgV2hhdCdzIHRoaXMgZm9yPworICoqKiB0aGUgZWVwcm8xMDAuYyBkcml2ZXIgZGlkbid0IGhhdmUgb25lLCBzbyBJIGp1c3QgbGVmdCB0aGlzIG9uZSBlbXB0eSB0b28uCisgKioqIElkZWFzIGFueW9uZT8KKyAqKiogTXVzdCB0dXJuIG9mZiByZWNlaXZlciBhdCBsZWFzdCBzbyBzdHJheSBwYWNrZXRzIHdpbGwgbm90IGNvcnJ1cHQgbWVtb3J5CisgKioqIFtLZW5dCisgKioqLworc3RhdGljIHZvaWQKK2EzYzkweF9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYykKKyAgICB7CisJLyogRGlzYWJsZSB0aGUgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyLiAqLworCW91dHcoY21kUnhEaXNhYmxlLCBJTkZfM0M5MFguSU9BZGRyICsgcmVnQ29tbWFuZEludFN0YXR1c193KTsKKwlvdXR3KGNtZFR4RGlzYWJsZSwgSU5GXzNDOTBYLklPQWRkciArIHJlZ0NvbW1hbmRJbnRTdGF0dXNfdyk7CisgICAgfQorCisKKworLyoqKiBhM2M5MHhfcHJvYmU6IGV4cG9ydGVkIHJvdXRpbmUgdG8gcHJvYmUgZm9yIHRoZSAzYzkwNSBjYXJkIGFuZCBwZXJmb3JtCisgKioqIGluaXRpYWxpemF0aW9uLiAgSWYgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCwgdGhlIHBjaSBmdW5jdGlvbnMgZGlkIGZpbmQgdGhlCisgKioqIGNhcmQuICBXZSBqdXN0IGhhdmUgdG8gaW5pdCBpdCBoZXJlLgorICoqKi8KK3N0cnVjdCBuaWMqCithM2M5MHhfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVhZGRycywgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSkKKyAgICB7CisgICAgaW50IGksIGM7CisgICAgdW5zaWduZWQgc2hvcnQgZWVwcm9tWzB4MjFdOworICAgIHVuc2lnbmVkIGludCBjZmc7CisgICAgdW5zaWduZWQgaW50IG1vcHQ7CisgICAgdW5zaWduZWQgc2hvcnQgbGlua3R5cGU7CisKKyAgICBpZiAocHJvYmVhZGRycyA9PSAwIHx8IHByb2JlYWRkcnNbMF0gPT0gMCkKKyAgICAgICAgICByZXR1cm4gMDsKKworICAgIGFkanVzdF9wY2lfZGV2aWNlKHBjaSk7CisKKyAgICBJTkZfM0M5MFguSU9BZGRyID0gcHJvYmVhZGRyc1swXSAmIH4zOworICAgIElORl8zQzkwWC5DdXJyZW50V2luZG93ID0gMjU1OworICAgIHN3aXRjaCAoYTNjOTB4X2ludGVybmFsX1JlYWRFZXByb20oSU5GXzNDOTBYLklPQWRkciwgMHgwMykpCisJeworCWNhc2UgMHg5MDAwOiAvKiogMTAgQmFzZSBUUE8gICAgICAgICAgICAgKiovCisJY2FzZSAweDkwMDE6IC8qKiAxMC8xMDAgVDQgICAgICAgICAgICAgICAqKi8KKwljYXNlIDB4OTA1MDogLyoqIDEwLzEwMCBUUE8gICAgICAgICAgICAgICoqLworCWNhc2UgMHg5MDUxOiAvKiogMTAgQmFzZSBDb21ibyAgICAgICAgICAgKiovCisJCUlORl8zQzkwWC5pc0JyZXYgPSAwOworCQlicmVhazsKKworCWNhc2UgMHg5MDA0OiAvKiogMTAgQmFzZSBUUE8gICAgICAgICAgICAgKiovCisJY2FzZSAweDkwMDU6IC8qKiAxMCBCYXNlIENvbWJvICAgICAgICAgICAqKi8KKwljYXNlIDB4OTAwNjogLyoqIDEwIEJhc2UgVFBPIGFuZCBCYXNlMiAgICoqLworCWNhc2UgMHg5MDBBOiAvKiogMTAgQmFzZSBGTCAgICAgICAgICAgICAgKiovCisJY2FzZSAweDkwNTU6IC8qKiAxMC8xMDAgVFBPICAgICAgICAgICAgICAqKi8KKwljYXNlIDB4OTA1NjogLyoqIDEwLzEwMCBUNCAgICAgICAgICAgICAgICoqLworCWNhc2UgMHg5MDVBOiAvKiogMTAgQmFzZSBGWCAgICAgICAgICAgICAgKiovCisJZGVmYXVsdDoKKwkJSU5GXzNDOTBYLmlzQnJldiA9IDE7CisJCWJyZWFrOworCX0KKworICAgIC8qKiBMb2FkIHRoZSBFRVBST00gY29udGVudHMgKiovCisgICAgaWYgKElORl8zQzkwWC5pc0JyZXYpCisJeworCWZvcihpPTA7aTw9MHgyMDtpKyspCisJICAgIHsKKwkgICAgZWVwcm9tW2ldID0gYTNjOTB4X2ludGVybmFsX1JlYWRFZXByb20oSU5GXzNDOTBYLklPQWRkciwgaSk7CisJICAgIH0KKworI2lmZGVmCUNGR18zQzkwWF9CT09UUk9NX0ZJWAorCS8qKiBTZXQgeGN2clNlbGVjdCBpbiBJbnRlcm5hbENvbmZpZyBpbiBlZXByb20uICoqLworCS8qIG9ubHkgbmVjZXNzYXJ5IGZvciAzYzkwNWIgcmV2aXNpb24gY2FyZHMgd2l0aCBib290IFBST00gYnVnISEhICovCisJYTNjOTB4X2ludGVybmFsX1dyaXRlRWVwcm9tKElORl8zQzkwWC5JT0FkZHIsIDB4MTMsIDB4MDE2MCk7CisjZW5kaWYKKworI2lmZGVmCUNGR18zQzkwWF9YQ1ZSCisJaWYgKENGR18zQzkwWF9YQ1ZSID09IDI1NSkKKwkgICAgeworCSAgICAvKiogQ2xlYXIgdGhlIExhbldvcmtzIHJlZ2lzdGVyICoqLworCSAgICBhM2M5MHhfaW50ZXJuYWxfV3JpdGVFZXByb20oSU5GXzNDOTBYLklPQWRkciwgMHgxNiwgMCk7CisJICAgIH0KKwllbHNlCisJICAgIHsKKwkgICAgLyoqIFNldCB0aGUgc2VsZWN0ZWQgcGVybWFuZW50LXhjdnJTZWxlY3QgaW4gdGhlCisJICAgICAqKiBMYW5Xb3JrcyByZWdpc3RlcgorCSAgICAgKiovCisJICAgIGEzYzkweF9pbnRlcm5hbF9Xcml0ZUVlcHJvbShJTkZfM0M5MFguSU9BZGRyLCAweDE2LAorCSAgICAgICAgICAgICAgICAgICAgWENWUl9NQUdJQyArICgoQ0ZHXzNDOTBYX1hDVlIpICYgMHgwMDBGKSk7CisJICAgIH0KKyNlbmRpZgorCX0KKyAgICBlbHNlCisJeworCWZvcihpPTA7aTw9MHgxNztpKyspCisJICAgIHsKKwkgICAgZWVwcm9tW2ldID0gYTNjOTB4X2ludGVybmFsX1JlYWRFZXByb20oSU5GXzNDOTBYLklPQWRkciwgaSk7CisJICAgIH0KKwl9CisKKyAgICAvKiogUHJpbnQgaWRlbnRpZmljYXRpb24gbWVzc2FnZSAqKi8KKyAgICBwcmludGYoIlxuXG4zQzkwWCBEcml2ZXIgMi4wMCAiCisgICAgICAgICAgICJDb3B5cmlnaHQgMTk5OSBMaWdodFN5cyBUZWNobm9sb2d5IFNlcnZpY2VzLCBJbmMuXG4iCisgICAgICAgICAgICJQb3J0aW9ucyBDb3B5cmlnaHQgMTk5OSBTdGV2ZSBTbWl0aFxuIik7CisgICAgcHJpbnRmKCJQcm92aWRlZCB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuXG4iKTsKKyAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCisgICAgLyoqIFJldHJpZXZlIHRoZSBIYXJkd2FyZSBhZGRyZXNzIGFuZCBwcmludCBpdCBvbiB0aGUgc2NyZWVuLiAqKi8KKyAgICBJTkZfM0M5MFguSFdBZGRyWzBdID0gZWVwcm9tWzBdPj44OworICAgIElORl8zQzkwWC5IV0FkZHJbMV0gPSBlZXByb21bMF0mMHhGRjsKKyAgICBJTkZfM0M5MFguSFdBZGRyWzJdID0gZWVwcm9tWzFdPj44OworICAgIElORl8zQzkwWC5IV0FkZHJbM10gPSBlZXByb21bMV0mMHhGRjsKKyAgICBJTkZfM0M5MFguSFdBZGRyWzRdID0gZWVwcm9tWzJdPj44OworICAgIElORl8zQzkwWC5IV0FkZHJbNV0gPSBlZXByb21bMl0mMHhGRjsKKyAgICBwcmludGYoIk1BQyBBZGRyZXNzID0gJSFcbiIsIElORl8zQzkwWC5IV0FkZHIpOworCisgICAgLyoqIFByb2dyYW0gdGhlIE1BQyBhZGRyZXNzIGludG8gdGhlIHN0YXRpb24gYWRkcmVzcyByZWdpc3RlcnMgKiovCisgICAgYTNjOTB4X2ludGVybmFsX1NldFdpbmRvdyhJTkZfM0M5MFguSU9BZGRyLCB3aW5BZGRyZXNzaW5nMik7CisgICAgb3V0dyhodG9ucyhlZXByb21bMF0pLCBJTkZfM0M5MFguSU9BZGRyICsgcmVnU3RhdGlvbkFkZHJlc3NfMl8zdyk7CisgICAgb3V0dyhodG9ucyhlZXByb21bMV0pLCBJTkZfM0M5MFguSU9BZGRyICsgcmVnU3RhdGlvbkFkZHJlc3NfMl8zdysyKTsKKyAgICBvdXR3KGh0b25zKGVlcHJvbVsyXSksIElORl8zQzkwWC5JT0FkZHIgKyByZWdTdGF0aW9uQWRkcmVzc18yXzN3KzQpOworICAgIG91dHcoMCwgSU5GXzNDOTBYLklPQWRkciArIHJlZ1N0YXRpb25NYXNrXzJfM3crMCk7CisgICAgb3V0dygwLCBJTkZfM0M5MFguSU9BZGRyICsgcmVnU3RhdGlvbk1hc2tfMl8zdysyKTsKKyAgICBvdXR3KDAsIElORl8zQzkwWC5JT0FkZHIgKyByZWdTdGF0aW9uTWFza18yXzN3KzQpOworCisgICAgLyoqIEZpbGwgaW4gb3VyIGVudHJ5IGluIHRoZSBldGhlcmJvb3QgYXJwIHRhYmxlICoqLworICAgIGZvcihpPTA7aTxFVEhfQUxFTjtpKyspCisJbmljLT5ub2RlX2FkZHJbaV0gPSAoZWVwcm9tW2kvMl0gPj4gKDgqKChpJjEpXjEpKSkgJiAweGZmOworCisgICAgLyoqIFJlYWQgdGhlIG1lZGlhIG9wdGlvbnMgcmVnaXN0ZXIsIHByaW50IGEgbWVzc2FnZSBhbmQgc2V0IGRlZmF1bHQKKyAgICAgKiogeGN2ci4KKyAgICAgKioKKyAgICAgKiogVXNlcyBNZWRpYSBPcHRpb24gY29tbWFuZCBvbiBCIHJldmlzaW9uLCBSZXNldCBPcHRpb24gb24gbm9uLUIKKyAgICAgKiogcmV2aXNpb24gY2FyZHMgLS0gc2FtZSByZWdpc3RlciBhZGRyZXNzCisgICAgICoqLworICAgIGEzYzkweF9pbnRlcm5hbF9TZXRXaW5kb3coSU5GXzNDOTBYLklPQWRkciwgd2luVHhSeE9wdGlvbnMzKTsKKyAgICBtb3B0ID0gaW53KElORl8zQzkwWC5JT0FkZHIgKyByZWdSZXNldE1lZGlhT3B0aW9uc18zX3cpOworCisgICAgLyoqIG1hc2sgb3V0IFZDTyBiaXQgdGhhdCBpcyBkZWZpbmVkIGFzIDEwYmFzZUZMIGJpdCBvbiBCLXJldiBjYXJkcyAqKi8KKyAgICBpZiAoISBJTkZfM0M5MFguaXNCcmV2KQorCXsKKwltb3B0ICY9IDB4N0Y7CisJfQorCisgICAgcHJpbnRmKCJDb25uZWN0b3JzIHByZXNlbnQ6ICIpOworICAgIGMgPSAwOworICAgIGxpbmt0eXBlID0gMHgwMDA4OworICAgIGlmIChtb3B0ICYgMHgwMSkKKwl7CisJcHJpbnRmKCIlczEwMEJhc2UtVDQiLChjKyspPyIsICI6IiIpOworCWxpbmt0eXBlID0gMHgwMDA2OworCX0KKyAgICBpZiAobW9wdCAmIDB4MDQpCisJeworCXByaW50ZigiJXMxMDBCYXNlLUZYIiwoYysrKT8iLCAiOiIiKTsKKwlsaW5rdHlwZSA9IDB4MDAwNTsKKwl9CisgICAgaWYgKG1vcHQgJiAweDEwKQorCXsKKwlwcmludGYoIiVzMTBCYXNlLTIiLChjKyspPyIsICI6IiIpOworCWxpbmt0eXBlID0gMHgwMDAzOworCX0KKyAgICBpZiAobW9wdCAmIDB4MjApCisJeworCXByaW50ZigiJXNBVUkiLChjKyspPyIsICI6IiIpOworCWxpbmt0eXBlID0gMHgwMDAxOworCX0KKyAgICBpZiAobW9wdCAmIDB4NDApCisJeworCXByaW50ZigiJXNNSUkiLChjKyspPyIsICI6IiIpOworCWxpbmt0eXBlID0gMHgwMDA2OworCX0KKyAgICBpZiAoKG1vcHQgJiAweEEpID09IDB4QSkKKwl7CisJcHJpbnRmKCIlczEwQmFzZS1UIC8gMTAwQmFzZS1UWCIsKGMrKyk/IiwgIjoiIik7CisJbGlua3R5cGUgPSAweDAwMDg7CisJfQorICAgIGVsc2UgaWYgKChtb3B0ICYgMHhBKSA9PSAweDIpCisJeworCXByaW50ZigiJXMxMDBCYXNlLVRYIiwoYysrKT8iLCAiOiIiKTsKKwlsaW5rdHlwZSA9IDB4MDAwODsKKwl9CisgICAgZWxzZSBpZiAoKG1vcHQgJiAweEEpID09IDB4OCkKKwl7CisJcHJpbnRmKCIlczEwQmFzZS1UIiwoYysrKT8iLCAiOiIiKTsKKwlsaW5rdHlwZSA9IDB4MDAwODsKKwl9CisgICAgcHJpbnRmKCIuXG4iKTsKKworICAgIC8qKiBEZXRlcm1pbmUgdHJhbnNjZWl2ZXIgdHlwZSB0byB1c2UsIGRlcGVuZGluZyBvbiB2YWx1ZSBzdG9yZWQgaW4KKyAgICAgKiogZWVwcm9tIDB4MTYKKyAgICAgKiovCisgICAgaWYgKElORl8zQzkwWC5pc0JyZXYpCisJeworCWlmICgoZWVwcm9tWzB4MTZdICYgMHhGRjAwKSA9PSBYQ1ZSX01BR0lDKQorCSAgICB7CisJICAgIC8qKiBVc2VyLWRlZmluZWQgKiovCisJICAgIGxpbmt0eXBlID0gZWVwcm9tWzB4MTZdICYgMHgwMDBGOworCSAgICB9CisJfQorICAgIGVsc2UKKwl7CisjaWZkZWYJQ0ZHXzNDOTBYX1hDVlIKKwkgICAgaWYgKENGR18zQzkwWF9YQ1ZSICE9IDI1NSkKKwkJbGlua3R5cGUgPSBDRkdfM0M5MFhfWENWUjsKKyNlbmRpZgkvKiBDRkdfM0M5MFhfWENWUiAqLworCisJICAgIC8qKiBJIGRvbid0IGtub3cgd2hhdCBNSUkgTUFDIG9ubHkgbW9kZSBpcyEhISAqKi8KKwkgICAgaWYgKGxpbmt0eXBlID09IDB4MDAwOSkKKwkJeworCQlpZiAoSU5GXzNDOTBYLmlzQnJldikKKwkJCXByaW50ZigiV0FSTklORzogTUlJIEV4dGVybmFsIE1BQyBNb2RlIG9ubHkgc3VwcG9ydGVkIG9uIEItcmV2aXNpb24gIgorCQkJICAgICAgICJjYXJkcyEhISFcbkZhbGxpbmcgQmFjayB0byBNSUkgTW9kZVxuIik7CisJCWxpbmt0eXBlID0gMHgwMDA2OworCQl9CisJfQorCisgICAgLyoqIGVuYWJsZSBEQyBjb252ZXJ0ZXIgZm9yIDEwLUJhc2UtVCAqKi8KKyAgICBpZiAobGlua3R5cGUgPT0gMHgwMDAzKQorCXsKKwlhM2M5MHhfaW50ZXJuYWxfSXNzdWVDb21tYW5kKElORl8zQzkwWC5JT0FkZHIsIGNtZEVuYWJsZURjQ29udmVydGVyLCAwKTsKKwl9CisKKyAgICAvKiogU2V0IHRoZSBsaW5rIHRvIHRoZSB0eXBlIHdlIGp1c3QgZGV0ZXJtaW5lZC4gKiovCisgICAgYTNjOTB4X2ludGVybmFsX1NldFdpbmRvdyhJTkZfM0M5MFguSU9BZGRyLCB3aW5UeFJ4T3B0aW9uczMpOworICAgIGNmZyA9IGlubChJTkZfM0M5MFguSU9BZGRyICsgcmVnSW50ZXJuYWxDb25maWdfM19sKTsKKyAgICBjZmcgJj0gfigweEY8PDIwKTsKKyAgICBjZmcgfD0gKGxpbmt0eXBlPDwyMCk7CisgICAgb3V0bChjZmcsIElORl8zQzkwWC5JT0FkZHIgKyByZWdJbnRlcm5hbENvbmZpZ18zX2wpOworCisgICAgLyoqIE5vdyB0aGF0IHdlIHNldCB0aGUgeGN2ciB0eXBlLCByZXNldCB0aGUgVHggYW5kIFJ4LCByZS1lbmFibGUuICoqLworICAgIGEzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQoSU5GXzNDOTBYLklPQWRkciwgY21kVHhSZXNldCwgMHgwMCk7CisgICAgd2hpbGUgKGludyhJTkZfM0M5MFguSU9BZGRyICsgcmVnQ29tbWFuZEludFN0YXR1c193KSAmIElOVF9DTURJTlBST0dSRVNTKQorCTsKKworICAgIGlmICghSU5GXzNDOTBYLmlzQnJldikKKwlvdXRiKDB4MDEsIElORl8zQzkwWC5JT0FkZHIgKyByZWdUeEZyZWVUaHJlc2hfYik7CisKKyAgICBhM2M5MHhfaW50ZXJuYWxfSXNzdWVDb21tYW5kKElORl8zQzkwWC5JT0FkZHIsIGNtZFR4RW5hYmxlLCAwKTsKKworICAgIC8qKgorICAgICAqKiByZXNldCBvZiB0aGUgcmVjZWl2ZXIgb24gQi1yZXZpc2lvbiBjYXJkcyByZS1uZWdvdGlhdGVzIHRoZSBsaW5rCisgICAgICoqIHRha2VzIHNldmVyYWwgc2Vjb25kcyAoYSBjb21wdXRlciBldGVybml0eSkKKyAgICAgKiovCisgICAgaWYgKElORl8zQzkwWC5pc0JyZXYpCisJYTNjOTB4X2ludGVybmFsX0lzc3VlQ29tbWFuZChJTkZfM0M5MFguSU9BZGRyLCBjbWRSeFJlc2V0LCAweDA0KTsKKyAgICBlbHNlCisJYTNjOTB4X2ludGVybmFsX0lzc3VlQ29tbWFuZChJTkZfM0M5MFguSU9BZGRyLCBjbWRSeFJlc2V0LCAweDAwKTsKKyAgICB3aGlsZSAoaW53KElORl8zQzkwWC5JT0FkZHIgKyByZWdDb21tYW5kSW50U3RhdHVzX3cpICYgSU5UX0NNRElOUFJPR1JFU1MpCisJOworCisgICAgLyoqIFNldCB0aGUgUlggZmlsdGVyID0gcmVjZWl2ZSBvbmx5IGluZGl2aWR1YWwgcGt0cyAmIGJjYXN0LiAqKi8KKyAgICBhM2M5MHhfaW50ZXJuYWxfSXNzdWVDb21tYW5kKElORl8zQzkwWC5JT0FkZHIsIGNtZFNldFJ4RmlsdGVyLCAweDAxICsgMHgwNCk7CisgICAgYTNjOTB4X2ludGVybmFsX0lzc3VlQ29tbWFuZChJTkZfM0M5MFguSU9BZGRyLCBjbWRSeEVuYWJsZSwgMCk7CisKKworICAgIC8qKgorICAgICAqKiBzZXQgSW5kaWNhdGlvbiBhbmQgSW50ZXJydXB0IGZsYWdzICwgYWNrbm93bGVkZ2UgYW55IElSUSdzCisgICAgICoqLworICAgIGEzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQoSU5GXzNDOTBYLklPQWRkciwgY21kU2V0SW50ZXJydXB0RW5hYmxlLCAwKTsKKyAgICBhM2M5MHhfaW50ZXJuYWxfSXNzdWVDb21tYW5kKElORl8zQzkwWC5JT0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRTZXRJbmRpY2F0aW9uRW5hYmxlLCAweDAwMTQpOworICAgIGEzYzkweF9pbnRlcm5hbF9Jc3N1ZUNvbW1hbmQoSU5GXzNDOTBYLklPQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZEFja25vd2xlZGdlSW50ZXJydXB0LCAweDY2MSk7CisKKyAgICAvKiogU2V0IG91ciBleHBvcnRlZCBmdW5jdGlvbnMgKiovCisgICAgbmljLT5yZXNldCAgICA9IGEzYzkweF9yZXNldDsKKyAgICBuaWMtPnBvbGwgICAgID0gYTNjOTB4X3BvbGw7CisgICAgbmljLT50cmFuc21pdCA9IGEzYzkweF90cmFuc21pdDsKKyAgICBuaWMtPmRpc2FibGUgID0gYTNjOTB4X2Rpc2FibGU7CisKKyAgICByZXR1cm4gbmljOworICAgIH0KKworCmRpZmYgLS1naXQgYS9uZXRib290LzNjOTB4LnR4dCBiL25ldGJvb3QvM2M5MHgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNjc0NmMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290LzNjOTB4LnR4dApAQCAtMCwwICsxLDMwNyBAQAorCisJSW5zdHJ1Y3Rpb25zIGZvciB1c2Ugb2YgdGhlIDNDOTBYIGRyaXZlciBmb3IgRXRoZXJCb290CisKKwkJT3JpZ2luYWwgM0M5MDVCIHN1cHBvcnQgYnk6CisJCQlHcmVnIEJlZWxleSAoR3JlZy5CZWVsZXlATGlnaHRTeXMub3JnKSwKKwkJCUxpZ2h0U3lzIFRlY2hub2xvZ3kgU2VydmljZXMsIEluYy4KKwkJCUZlYnJ1YXJ5IDExLCAxOTk5CisKKwkJVXBkYXRlcyBmb3IgM0M5MFggZmFtaWx5IGJ5OgorCQkJU3RldmUgU21pdGggKHN0ZXZlLnNtaXRoQGp1bm8uY29tKQorCQkJT2N0b2JlciAxLCAxOTk5CisKKwkJTWlub3IgZG9jdW1lbnRhdGlvbiB1cGRhdGVzIGJ5CisJCQlHcmVnIEJlZWxleSAoR3JlZy5CZWVsZXlATGlnaHRTeXMub3JnKQorCQkJTWFyY2ggMjksIDIwMDAKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJICAgT1ZFUlZJRVcKKworICAgIFRoZSAzYzkwWCBzZXJpZXMgZXRoZXJuZXQgY2FyZHMgYXJlIGEgZ3JvdXAgb2YgaGlnaC1wZXJmb3JtYW5jZSBidXNtYXN0ZXIKKyAgICBETUEgY2FyZHMgZnJvbSAzQ29tLiAgVGhpcyBwYXJ0aWN1bGFyIGRyaXZlciBzdXBwb3J0cyBib3RoIHRoZSAzYzkweCBhbmQKKyAgICB0aGUgM2M5MHhCIHJldmlzaW9uIGNhcmRzLiAgM0M5MHhDIGZhbWlseSBzdXBwb3J0IGhhcyBiZWVuIHRlc3RlZCB0byBzb21lCisgICAgZGVncmVlIGJ1dCBub3QgZXh0ZW5zaXZlbHkuCisKKyAgICBIZXJlJ3MgdGhlIGxpY2Vuc2luZyBpbmZvcm1hdGlvbjoKKworICAgIFRoaXMgcHJvZ3JhbSBDb3B5cmlnaHQgKEMpIDE5OTkgTGlnaHRTeXMgVGVjaG5vbG9neSBTZXJ2aWNlcywgSW5jLgorICAgIFBvcnRpb25zIENvcHlyaWdodCAoQykgMTk5OSBTdGV2ZSBTbWl0aC4KKworICAgIFRoaXMgcHJvZ3JhbSBtYXkgYmUgcmUtZGlzdHJpYnV0ZWQgaW4gc291cmNlIG9yIGJpbmFyeSBmb3JtLCBtb2RpZmllZCwKKyAgICBzb2xkLCBvciBjb3BpZWQgZm9yIGFueSBwdXJwb3NlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbWVzc2FnZQorICAgIGFuZCB0aGlzIHRleHQgYXJlIGluY2x1ZGVkIHdpdGggYWxsIHNvdXJjZSBjb3BpZXMgb3IgZGVyaXZhdGl2ZSB3b3JrcywgYW5kCisgICAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG1lc3NhZ2UgYW5kIHRoaXMgdGV4dCBhcmUgaW5jbHVkZWQgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBvZiBhbnkgYmluYXJ5LW9ubHkgZGlzdHJpYnV0aW9ucy4gIFRoaXMgcHJvZ3JhbSBpcworICAgIGRpc3RyaWJ1dGVkIFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB3aXRob3V0IGV2ZW4gdGhlIHdhcnJhbnR5IG9mIEZJVE5FU1MgRk9SCisgICAgQSBQQVJUSUNVTEFSIFBVUlBPU0Ugb3IgTUVSQ0hBTlRBQklMSVRZLiAgUGxlYXNlIHJlYWQgdGhlIGFzc29jaWF0ZWQKKyAgICBkb2N1bWVudGF0aW9uICIzYzkweC50eHQiIGJlZm9yZSBjb21waWxpbmcgYW5kIHVzaW5nIHRoaXMgZHJpdmVyLgorCisKK0lJICBGTEFTSCBQUk9NUworCisgICAgVGhlIDNjOTB4QiBjYXJkcywgYWNjb3JkaW5nIHRvIHRoZSAzQ29tIGRvY3VtZW50YXRpb24sIG9ubHkgYWNjZXB0IHRoZQorICAgIGZvbGxvd2luZyBmbGFzaCBtZW1vcnkgY2hpcHM6CisKKwlBdG1lbCBBVDI5QzUxMiAoNjQga2lsb2J5dGUpCisJQXRtZWwgQVQyOUMwMTAgKDEyOCBraWxvYnl0ZSkKKworICAgIFRoZSAzYzkweCBjYXJkcywgYWNjb3JkaW5nIHRvIHRoZSAzQ29tIGRvY3VtZW50YXRpb24sIGFjY2VwdCB0aGUKKyAgICBmb2xsb3dpbmcgZmxhc2ggbWVtb3J5IGNoaXBzIGNhcGFjaXRpZXM6CisKKwk2NCAga2IgKDgga0IpCisJMTI4IGtiICgxNiBrQikKKwkyNTYga2IgKDMyIGtCKSBhbmQKKwk1MTIga2IgKDY0IGtCKQorCisgICAgQXRtZWwgQVQyOUM1MTIgKDY0IGtpbG9ieXRlKSBjaGlwcyBhcmUgc3BlY2lmaWNhbGx5IGxpc3RlZCBmb3IgYm90aAorICAgIGFkYXB0ZXJzLCBidXQgZmxhc2hpbmcgb24gdGhlIDNjOTA1YiBjYXJkcyB3b3VsZCBvbmx5IGJlIHN1cHBvcnRlZAorICAgIHRocm91Z2ggdGhlIEF0bWVsIHBhcnRzLiAgQW55IGRldmljZSwgb2YgdGhlIHN1cHBvcnRlZCBzaXplLCBzaG91bGQKKyAgICBiZSBzdXBwb3J0ZWQgd2hlbiBwcm9ncmFtbWVkIGJ5IGEgZGVkaWNhdGVkIFBST00gcHJvZ3JhbW1lciAoZS5nLgorICAgIG5vdCB0aGUgY2FyZCkuCisKKyAgICBUbyB1c2UgdGhpcyBkcml2ZXIgaW4gc3VjaCBhIFBST00sIHZpc2l0IEF0bWVsJ3Mgd2ViIHNpdGUgYW5kIGRvd25sb2FkCisgICAgdGhlaXIgLlBERiBmaWxlIGNvbnRhaW5pbmcgYSBsaXN0IG9mIHRoZWlyIGRpc3RyaWJ1dG9ycy4gIENvbnRhY3QgdGhlCisgICAgZGlzdHJpYnV0b3JzIGZvciBwcmljaW5nIGluZm9ybWF0aW9uLiAgVGhlIHByaWNlcyBhcmUgcXVpdGUgcmVhc29uYWJsZQorICAgIChhYm91dCAkMyBVUyBlYWNoIGZvciB0aGUgNjQga0IgcGFydCksIGFuZCBhcmUgY29tcGFyYWJsZSB0byB3aGF0IG9uZSB3b3VsZAorICAgIGV4cGVjdCBmb3Igc2ltaWxhcmx5IHNpemVkIHN0YW5kYXJkIEVQUk9Ncy4gIEFuZCwgdGhlIGZsYXNoIGNoaXBzIGFyZSBtdWNoCisgICAgZWFzaWVyIHRvIHdvcmsgd2l0aCwgYXMgdGhleSBkb24ndCBuZWVkIHRvIGJlIFVWLWVyYXNlZCB0byBiZSByZXByb2dyYW1tZWQuCisgICAgVGhlIDNDOTA1QiBjYXJkIGFjdHVhbGx5IHByb3ZpZGVzIGEgbWV0aG9kIHRvIHByb2dyYW0gdGhlIGZsYXNoIG1lbW9yeQorICAgIHdoaWxlIGl0IGlzIHJlc2lkZW50IG9uIGJvYXJkIHRoZSBjYXJkIGl0c2VsZjsgaWYgc29tZW9uZSB3b3VsZCBsaWtlIHRvCisgICAgd3JpdGUgYSBzbWFsbCBET1MgcHJvZ3JhbSB0byBkbyB0aGUgcHJvZ3JhbW1pbmcsIEkgY2FuIHByb3ZpZGUgdGhlCisgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlZ2lzdGVycyBhbmQgc28gZm9ydGguCisKKyAgICBBIHV0aWxpdHkgcHJvZ3JhbSwgM2M5MHh1dGlsLCBpcyBwcm92aWRlZCB3aXRoIEV0aGVyYm9vdCBpbiB0aGUgJ2NvbnRyaWInCisgICAgZGlyZWN0b3J5IHRoYXQgYWxsb3dzIGZvciB0aGUgb24tYm9hcmQgZmxhc2hpbmcgb2YgdGhlIFJPTSB3aGlsZSBMaW51eAorICAgIGlzIHJ1bm5pbmcuICBUaGUgcHJvZ3JhbSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdXNlZCB1bmRlciBMaW51eCwgYnV0IEkKKyAgICBoYXZlIGhlYXJkIHByb2JsZW0gcmVwb3J0cyBvZiBpdHMgdXNlIHVuZGVyIEZyZWVCU0QuICBBbnlvbmUgd2lsbGluZyB0bworICAgIG1ha2UgaXQgd29yayB1bmRlciBGcmVlQlNEIGlzIG1vcmUgdGhhbiB3ZWxjb21lIHRvIGRvIHNvIQorCisgICAgWW91IGFsc28gaGF2ZSB0aGUgb3B0aW9uIG9mIHVzaW5nIEVQUk9NIGNoaXBzIC0gdGhlIDNDOTA1Qi1UWC1OTSBoYXMgYmVlbgorICAgIHN1Y2Nlc3NmdWxseSB0ZXN0ZWQgd2l0aCAyN0MyNTYgKDMya0IpIGFuZCAyN0M1MTIgKDY0a0IpIGNoaXBzIHdpdGggYQorICAgIHNwZWNpZmllZCBhY2Nlc3MgdGltZSBvZiAxMDBucyBhbmQgZmFzdGVyLgorCisKK0lJSSBHRU5FUkFMIFVTRQorCisgICAgTm9ybWFsbHksIHRoZSBiYXNpYyBwcm9jZWR1cmUgZm9yIHVzaW5nIHRoaXMgZHJpdmVyIGlzIGFzIGZvbGxvd3M6CisKKwkxLiAgUnVuIHRoZSAzYzkweGNmZyBwcm9ncmFtIG9uIHRoZSBkcml2ZXIgZGlza2V0dGUgdG8gZW5hYmxlIHRoZQorCWJvb3QgUFJPTSBhbmQgc2V0IGl0IHRvIDY0ayBvciAxMjhrLCBhcyBhcHByb3ByaWF0ZS4KKwkyLiAgQnVpbGQgdGhlIGFwcHJvcHJpYXRlIDNjOTB4LmZkMCBvciAzYzkweC5mZDAgZmxvcHB5IGltYWdlIHdpdGgKKwlwb3NzaWJseSB0aGUgdmFsdWUgQ0ZHXzNDOTBYX1hDVlIgZGVmaW5lZCB0byB0aGUgdHJhbnNjZWl2ZXIgdHlwZSB0aGF0CisJeW91IHdhbnQgdG8gdXNlIChpLmUuLCAxMC8xMDAgcmo0NSwgQVVJLCBjb2F4LCBNSUkpLgorCTMuICBSdW4gdGhlIGZsb3BweSBpbWFnZSBvbiB0aGUgUEMgdG8gYmUgbmV0d29yayBib290ZWQsIHRvIGdldAorCWl0IGNvbmZpZ3VyZWQsIGFuZCB0byB2ZXJpZnkgdGhhdCBpdCB3aWxsIGJvb3QgcHJvcGVybHkuCisJNC4gIEJ1aWxkIHRoZSAzYzkweC5yb20gb3IgM2M5MHgubHpyb20gUFJPTSBpbWFnZSBhbmQgcHJvZ3JhbQorCWl0IGludG8gdGhlIGZsYXNoIG9yIEVQUk9NIG1lbW9yeSBjaGlwLgorCTUuICBQdXQgdGhlIFBST00gaW4gdGhlIGV0aGVybmV0IGNhcmQsIGJvb3QgYW5kIGVuYWJsZSAnYm9vdCBmcm9tCisJbmV0d29yayBmaXJzdCcgaW4gdGhlIHN5c3RlbSBCSU9TLCBzYXZlIGFuZCByZWJvb3QuCisKKyAgICBIZXJlIGFyZSBzb21lIGlzc3VlcyB0byBiZSBhd2FyZSBvZjoKKworCTEuICBJZiB5b3UgZXhwZXJpZW5jZSBjcmFzaGVzIG9yIGRpZmZlcmVudCBiZWhhdmlvdXIgd2hlbiB1c2luZyB0aGUKKwlib290IFBST00sIGFkZCB0aGUgc2V0dGluZyBDRkdfM0M5MFhfQk9PVFJPTV9GSVggYW5kIGdvIHRocm91Z2ggdGhlCisJc3RlcHMgMi01IGFib3ZlLiAgVGhpcyB3b3JrcyBhcm91bmQgYSBidWcgaW4gc29tZSAzYzkwNUIgY2FyZHMgKHNlZQorCWJlbG93KSwgYnV0IGhhcyBzb21lIHNpZGUtZWZmZWN0cyB3aGljaCBtYXkgbm90IGJlIGRlc2lyYWJsZS4KKyAgICAgICAgUGxlYXNlIG5vdGUgdGhhdCB5b3UgaGF2ZSB0byBib290IG9mZiBhIGZsb3BweSAobm90IFBST00hKSBvbmNlIGZvcgorICAgICAgICB0aGlzIGZpeCB0byB0YWtlIGVmZmVjdC4KKwkyLiAgVGhlIHBvc3NpYmxlIG5lZWQgdG8gbWFudWFsbHkgc2V0IHRoZSBDRkdfM0M5MFhfWENWUiB2YWx1ZSB0bworCWNvbmZpZ3VyZSB0aGUgdHJhbnNjZWl2ZXIgdHlwZS4gIFZhbHVlcyBhcmUgbGlzdGVkIGJlbG93LgorCTMuICBUaGUgcG9zc2libGUgbmVlZCB0byBkZWZpbmUgQ0ZHXzNDOTBYX1BSRVNFUlZFX1hDVlIgZm9yIHVzZSBpbgorCW9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgZG9uJ3QgaW50ZWxsaWdlbnRseSBkZXRlcm1pbmUgdGhlCisJdHJhbnNjZWl2ZXIgdHlwZS4KKworICAgIFNvbWUgdGhpbmdzIHRoYXQgYXJlIG9uIHRoZSAnVG8tRG8nIGxpc3QsIHBlcmhhcHMgZm9yIG1lLCBidXQgcGVyaGFwcworICAgIGZvciBhbnkgb3RoZXIgdm9sdW50ZWVycyBvdXQgdGhlcmU6CisKKwkxLiAgRXh0ZW5kIHRoZSBkcml2ZXIgdG8gZnVsbHkgaW1wbGVtZW50IHRoZSBhdXRvLXNlbGVjdAorCWFsZ29yaXRobSBpZiB0aGUgY2FyZCBoYXMgbXVsdGlwbGUgbWVkaWEgcG9ydHMuCisJMi4gIEZpeCBhbnkgYnVncyBpbiB0aGUgY29kZSA8Z3Jpbj4uLi4uCisJMy4gIEV4dGVuZCB0aGUgZHJpdmVyIHRvIHN1cHBvcnQgdGhlIDNjOTA1YyByZXZpc2lvbiBjYXJkcworCSJvZmZpY2lhbGx5Ii4gIFJpZ2h0IG5vdywgdGhlIHN1cHBvcnQgaGFzIGJlZW4gcHJpbWFyaWx5IGVtcGlyaWNhbAorCWFuZCBub3QgYmFzZWQgb24gM2M5MDVDIGRvY3VtZW50YXRpb24uCisKKyAgICBOb3cgZm9yIHRoZSBkZXRhaWxzLi4uLgorCisgICAgVGhpcyBkcml2ZXIgaGFzIGJlZW4gdGVzdGVkIG9uIHJvdWdobHkgMzAwIHN5c3RlbXMuICBUaGUgbWFpbiB0d28KKyAgICBjb25maWd1cmF0aW9uIGlzc3VlcyB0byBjb250ZW5kIHdpdGggYXJlOgorCisJMS4gIEVuc3VyZSB0aGF0IFBDSSBCdXNtYXN0ZXJpbmcgaXMgZW5hYmxlZCBmb3IgdGhlIGFkYXB0ZXIgKGNvbmZpZ3VyZWQKKwlpbiB0aGUgQ01PUyBzZXR1cCkKKwkyLiAgU29tZSBzeXN0ZW1zIGRvbid0IHdvcmsgcHJvcGVybHkgd2l0aCB0aGUgYWRhcHRlciB3aGVuIHBsdWcgYW5kCisJcGxheSBPUyBpcyBlbmFibGVkOyBJIGFsd2F5cyBzZXQgaXQgdG8gIk5vIiBvciAiRGlzYWJsZWQiIC0tIHRoaXMgbWFrZXMKKwlpdCBlYXNpZXIgYW5kIHJlYWxseSBkb2Vzbid0IGFkdmVyc2VseSBhZmZlY3QgYW55dGhpbmcuCisKKyAgICBSb3VnaGx5IDk1JSBvZiB0aGUgc3lzdGVtcyB3b3JrZWQgd2hlbiBjb25maWd1cmVkIHByb3Blcmx5LiAgQSBmZXcKKyAgICBoYXZlIGlzc3VlcyB3aXRoIGJvb3RpbmcgbG9jYWxseSBvbmNlIHRoZSBib290IFBST00gaGFzIGJlZW4gaW5zdGFsbGVkCisgICAgKHRoaXMgbnVtYmVyIGhhcyBiZWVuIGxlc3MgdGhhbiAyJSkuICBPdGhlciBjb25maWd1cmF0aW9uIGlzc3VlcyB0aGF0CisgICAgdG8gY2hlY2s6CisKKwkxLiAgTmV3ZXIgQklPUydzIGFjdHVhbGx5IHdvcmsgY29ycmVjdGx5IHdpdGggdGhlIG5ldHdvcmsgYm9vdCBvcmRlci4KKwlTZXQgdGhlIG5ldHdvcmsgYWRhcHRlciBmaXJzdC4gIE1vc3Qgb2xkZXIgQklPUydzIGF1dG9tYXRpY2FsbHkgZ28gdG8KKwl0aGUgbmV0d29yayBib290IFBST00gZmlyc3QuCisJMi4gIEZvciBzeXN0ZW1zIHdoZXJlIHRoZSBhZGFwdGVyIHdhcyBhbHJlYWR5IGluc3RhbGxlZCBhbmQgaXMganVzdAorCWhhdmluZyB0aGUgUFJPTSBpbnN0YWxsZWQsIHRyeSBzZXR0aW5nIHRoZSAicmVzZXQgY29uZmlndXJhdGlvbiBkYXRhIgorCXRvIHllcyBpbiB0aGUgQ01PUyBzZXR1cCBpZiB0aGUgQklPUyBpc24ndCBzZWVuIGF0IGZpcnN0LiAgSWYgeW91ciBCSU9TCisJZG9lc24ndCBoYXZlIHRoaXMgb3B0aW9uLCByZW1vdmUgdGhlIGNhcmQsIHN0YXJ0IHRoZSBzeXN0ZW0sIHNodXQgZG93biwKKwlpbnN0YWxsIHRoZSBjYXJkIGFuZCByZXN0YXJ0IChvciBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgUENJIHNsb3QpLgorCTMuICBNYWtlIHN1cmUgdGhlIENNT1Mgc2VjdXJpdHkgc2V0dGluZ3MgYXJlbid0IHByZXZlbnRpbmcgYSBib290LgorCisgICAgVGhlIDNjOTA1QiBjYXJkcyBoYXZlIGEgc2lnbmlmaWNhbnQgJ2J1ZycgdGhhdCByZWxhdGVzIHRvIHRoZSBmbGFzaCBwcm9tOgorICAgIHVubGVzcyB0aGUgY2FyZCBpcyBzZXQgaW50ZXJuYWxseSB0byB0aGUgTUlJIHRyYW5zY2VpdmVyLCBpdCB3aWxsIG9ubHkKKyAgICByZWFkIHRoZSBmaXJzdCA4ayBvZiB0aGUgUFJPTSBpbWFnZS4gIERvbid0IGFzayB3aHkgLS0gaXQgc2VlbXMgcmVhbGx5CisgICAgb2JzY3VyZSwgYnV0IGl0IGhhcyB0byBkbyB3aXRoIHRoZSB3YXkgdGhleSBtdXgnZCB0aGUgYWRkcmVzcyBsaW5lcworICAgIGZyb20gdGhlIFBDSSBidXMgdG8gdGhlIFJPTS4gIFVuZm9ydHVuYXRlbHksIG1vc3Qgb2YgdXMgYXJlIG5vdCB1c2luZworICAgIE1JSSB0cmFuc2NlaXZlcnMsIGFuZCBldmVuIHRoZSAubHpyb20gaW1hZ2UgZW5kcyB1cCBiZWluZyBqdXN0IGEgbGl0dGxlCisgICAgYml0IGxhcmdlciB0aGFuIDhrLiAgTm90ZSB0aGF0IHRoZSB3b3JrYXJvdW5kIGZvciB0aGlzIGlzIGRpc2FibGVkIGJ5CisgICAgZGVmYXVsdCwgYmVjYXVzZSB0aGUgV2luZG93cyBOVCA0LjAgZHJpdmVyIGRvZXMgbm90IGxpa2UgaXQgKG5vIHBhY2tldHMKKyAgICBhcmUgdHJhbnNtaXR0ZWQpLgorCisgICAgU28sIHRoZSBzb2x1dGlvbiB0aGF0IEkndmUgdXNlZCBpcyB0byBpbnRlcm5hbGx5IHNldCB0aGUgY2FyZCdzIG52cmFtCisgICAgY29uZmlndXJhdGlvbiB0byB1c2UgTUlJIHdoZW4gaXQgYm9vdHMuICBUaGUgM2M5MDViIGRyaXZlciBkb2VzIHRoaXMKKyAgICBhdXRvbWF0aWNhbGx5LiAgVGhpcyB3YXksIHRoZSAxNmsgcHJvbSBpbWFnZSBjYW4gYmUgbG9hZGVkIGludG8gbWVtb3J5LAorICAgIGFuZCB0aGVuIHRoZSAzYzkwNWIgZHJpdmVyIGNhbiBzZXQgdGhlIHRlbXBvcmFyeSBjb25maWd1cmF0aW9uIG9mIHRoZQorICAgIGNhcmQgdG8gYW4gYXBwcm9wcmlhdGUgdmFsdWUsIGVpdGhlciBjb25maWd1cmFibGUgYnkgdGhlIHVzZXIgb3IgY2hvc2VuCisgICAgYnkgdGhlIGRyaXZlci4KKworICAgIFRvIGVuYWJsZSB0aGUgM2M5MDVCIGJ1Z2ZpeCwgd2hpY2ggaXMgbmVjZXNzYXJ5IGZvciB0aGVzZSBjYXJkcyB3aGVuIAorICAgIGJvb3RpbmcgZnJvbSB0aGUgRmxhc2ggUk9NLCBkZWZpbmUgLURDRkdfM0M5MFhfQk9PVFJPTV9GSVggd2hlbiBidWlsZGluZywKKyAgICBjcmVhdGUgYSBmbG9wcHkgaW1hZ2UgYW5kIGJvb3QgaXQgb25jZS4KKyAgICBUaGVyZWFmdGVyLCB0aGUgY2FyZCBzaG91bGQgYWNjZXB0IHRoZSBsYXJnZXIgcHJvbSBpbWFnZS4KKworICAgIFRoZSBkcml2ZXIgc2hvdWxkIGNob29zZSBhbiBhcHByb3ByaWF0ZSB0cmFuc2NlaXZlciBvbiB0aGUgY2FyZC4gIEhvd2V2ZXIsCisgICAgaWYgaXQgZG9lc24ndCBvbiB5b3VyIGNhcmQgb3IgaWYgeW91IG5lZWQgdG8sIGZvciBpbnN0YW5jZSwgc2V0IHlvdXIKKyAgICBjYXJkIHRvIDEwbWJwcyB3aGVuIGNvbm5lY3RlZCB0byBhbiB1bm1hbmFnZWQgMTAvMTAwIGh1YiwgeW91IGNhbiBzcGVjaWZ5CisgICAgd2hpY2ggdHJhbnNjZWl2ZXIgeW91IHdhbnQgdG8gdXNlLiAgVG8gZG8gdGhpcywgYnVpbGQgdGhlIDNjOTA1Yi5mZDAKKyAgICBpbWFnZSB3aXRoIC1EQ0ZHXzNDOTBYX1hDVlI9eCwgd2hlcmUgJ3gnIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nCisgICAgdmFsdWVzOgorCisJMAkxMEJhc2UtVAorCTEJMTBtYnBzIEFVSQorCTMJMTBCYXNlLTIgKHRoaW5uZXQvY29heCkKKwk0CTEwMEJhc2UtVFgKKwk1CTEwMEJhc2UtRlgKKwk2CU1JSQorCTgJQXV0by1uZWdvdGlhdGlvbiAxMEJhc2UtVCAvIDEwMEJhc2UtVFggKHVzdWFsbHkgdGhlIGRlZmF1bHQpCisJOQlNSUkgRXh0ZXJuYWwgTUFDIE1vZGUKKwkyNTUJQWxsb3cgZHJpdmVyIHRvIGNob29zZSBhbiAnYXBwcm9wcmlhdGUnIG1lZGlhIHBvcnQuCisKKyAgICBUaGVuIHByb2NlZWQgZnJvbSBzdGVwIDIgaW4gdGhlIGFib3ZlICdnZW5lcmFsIHVzZScgaW5zdHJ1Y3Rpb25zLiAgVGhlCisgICAgLnJvbSBpbWFnZSBjYW4gYmUgYnVpbHQgd2l0aCBDRkdfM0M5MFhfWENWUiBzZXQgdG8gYSB2YWx1ZSwgYnV0IHlvdQorICAgIG5vcm1hbGx5IGRvbid0IHdhbnQgdG8gZG8gdGhpcywgc2luY2UgaXQgaXMgZWFzaWVyIHRvIGNoYW5nZSB0aGUKKyAgICB0cmFuc2NlaXZlciB0eXBlIGJ5IHJlYnVpbGRpbmcgYSBuZXcgZmxvcHB5LCBjaGFuZ2luZyB0aGUgQklPUyB0byBmbG9wcHkKKyAgICBib290LCBib290aW5nLCBhbmQgdGhlbiBjaGFuZ2luZyB0aGUgQklPUyBiYWNrIHRvIG5ldHdvcmsgYm9vdC4gIElmCisgICAgQ0ZHXzNDOTBYX1hDVlIgaXMgbm90IHNldCBpbiBhIHBhcnRpY3VsYXIgYnVpbGQsIGl0IGp1c3QgdXNlcyB0aGUKKyAgICBjdXJyZW50IGNvbmZpZ3VyYXRpb24gKGVpdGhlciBpdHMgJ2Jlc3QgZ3Vlc3MnIG9yIHdoYXRldmVyIHRoZSBzdG9yZWQKKyAgICBDRkdfM0M5MFhfWENWUiB2YWx1ZSB3YXMgZnJvbSB0aGUgbGFzdCB0aW1lIGl0IHdhcyBzZXQpLgorCisgICAgW1sgTm90ZSBmb3IgdGhlIG1vcmUgdGVjaG5pY2FsbHkgaW5jbGluZWQ6ICBUaGUgQ0ZHXzNDOTBYX1hDVlIgdmFsdWUgaXMKKyAgICBwcm9ncmFtbWVkIGludG8gYSByZWdpc3RlciBpbiB0aGUgY2FyZCdzIE5WUkFNIHRoYXQgd2FzIHJlc2VydmVkIGZvcgorICAgIExhbldvcmtzIFBST00gaW1hZ2VzIHRvIHVzZS4gIFdoZW4gdGhlIGRyaXZlciBib290cywgdGhlIGNhcmQgY29tZXMKKyAgICB1cCBpbiBNSUkgbW9kZSwgYW5kIHRoZSBkcml2ZXIgY2hlY2tzIHRoZSBMYW5Xb3JrcyByZWdpc3RlciB0byBmaW5kCisgICAgb3V0IGlmIHRoZSB1c2VyIHNwZWNpZmllZCBhIHRyYW5zY2VpdmVyIHR5cGUuICBJZiBpdCBmaW5kcyB0aGF0CisgICAgaW5mb3JtYXRpb24sIGl0IHVzZXMgdGhhdCwgb3RoZXJ3aXNlIGl0IHBpY2tzIGEgdHJhbnNjZWl2ZXIgdGhhdCB0aGUKKyAgICBjYXJkIGhhcyBiYXNlZCBvbiB0aGUgM2M5MDViJ3MgTWVkaWFPcHRpb25zIHJlZ2lzdGVyLiAgVGhpcyBkcml2ZXIgaXNuJ3QKKyAgICBxdWl0ZSBzbWFydCBlbm91Z2ggdG8gYWx3YXlzIGRldGVybWluZSB3aGljaCBtZWRpYSBwb3J0IGlzIGFjdHVhbGx5CisgICAgX2Nvbm5lY3RlZF87IG1heWJlIHNvbWVvbmUgZWxzZSB3b3VsZCBsaWtlIHRvIHRha2Ugb24gdGhhdCB0YXNrIChpdAorICAgIGFjdHVhbGx5IGludm9sdmVzIHNlbmRpbmcgYSBzZWxmLWRpcmVjdGVkIHBhY2tldCBhbmQgc2VlaW5nIGlmIGl0CisgICAgY29tZXMgYmFjay4gIElGIGl0IGRvZXMsIHRoYXQgcG9ydCBpcyBjb25uZWN0ZWQpLiBdXQorCisgICAgQW5vdGhlciBpc3N1ZSB0byBrZWVwIGluIG1pbmQgaXMgdGhhdCBpdCBpcyBwb3NzaWJsZSB0aGF0IHNvbWUgT1MnZXMKKyAgICBtaWdodCBub3QgYmUgaGFwcHkgd2l0aCB0aGUgd2F5IEkndmUgaGFuZGxlZCB0aGUgUFJPTS1pbWFnZSBoYWNrIHdpdGgKKyAgICBzZXR0aW5nIE1JSSBtb2RlIG9uIGJvb3R1cC4gIExpbnV4IDIuMC4zNSBkb2VzIG5vdCBoYXZlIHRoaXMgcHJvYmxlbS4KKyAgICBCZWhhdmlvciBvZiBvdGhlciBzeXN0ZW1zIG1heSB2YXJ5LiAgVGhlIDNjb20gZG9jdW1lbnRhdGlvbiBzcGVjaWZpY2FsbHkKKyAgICBzYXlzIHRoYXQsIGF0IGxlYXN0IHdpdGggdGhlIGNhcmQgdGhhdCBJIGhhdmUsIHRoZSBkZXZpY2UgZHJpdmVyIGluIHRoZQorICAgIE9TIHNob3VsZCBhdXRvLXNlbGVjdCB0aGUgbWVkaWEgcG9ydCwgc28gb3RoZXIgZHJpdmVycyBzaG91bGQgd29yayBmaW5lCisgICAgd2l0aCB0aGlzICdoYWNrJy4gIEhvd2V2ZXIsIGlmIHlvdXJzIGRvZXNuJ3Qgc2VlbSB0bywgeW91IGNhbiB0cnkgZGVmaW5pbmcKKyAgICBDRkdfM0M5MFhfUFJFU0VSVkVfWENWUiB3aGVuIGJ1aWxkaW5nIHRvIGNhdXNlIEV0aGVyYm9vdCB0byBrZWVwIHRoZQorICAgIHdvcmtpbmcgc2V0dGluZyAodGhhdCBhbGxvd2VkIHRoZSBib290cC90ZnRwIHByb2Nlc3MpIGFjcm9zcyB0aGUgZXRoX3Jlc2V0CisgICAgb3BlcmF0aW9uLgorCisKK0lWICBGT1IgREVWRUxPUEVSUy4uLi4KKworICAgIElmIHlvdSB3b3VsZCBsaWtlIHRvIGZpeC9leHRlbmQvZXRjLiB0aGlzIGRyaXZlciwgZmVlbCBmcmVlIHRvIGRvIHNvOyBqdXN0CisgICAgYmUgc3VyZSB5b3UgY2FuIHRlc3QgdGhlIG1vZGlmaWVkIHZlcnNpb24gb24gdGhlIDNjOTA1Qi1UWCBjYXJkcyB0aGF0IHRoZQorICAgIGRyaXZlciB3YXMgb3JpZ2luYWxseSBkZXNpZ25lZCBmb3IuICBUaGlzIHNlY3Rpb24gb2YgdGhpcyBkb2N1bWVudCBnaXZlcworICAgIHNvbWUgaW5mb3JtYXRpb24gdGhhdCBtaWdodCBiZSByZWxldmFudCB0byBhIHByb2dyYW1tZXIuCisKKyAgICBBLiAgTWFpbiBFbnRyeSBQb2ludAorCisJYTNjOTB4X3Byb2JlIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGlzIGRyaXZlci4gIEl0IGlzIHJlZmVycmVkCisJdG8gaW4gYW4gYXJyYXkgaW4gJ2NvbmZpZy5jJy4KKworICAgIEIuICBPdGhlciBJbXBvcnRhbnQgRnVuY3Rpb25zCisKKwlUaGUgZnVuY3Rpb25zIGEzYzkweF90cmFuc21pdCwgYTNjOTB4X3BvbGwsIGEzYzkweF9yZXNldCwgYW5kCisJYTNjOTB4X2Rpc2FibGUgYXJlIHN0YXRpYyBmdW5jdGlvbnMgdGhhdCBFdGhlckJvb3QgZmluZHMgb3V0IGFib3V0CisJYXMgYSAgcmVzdWx0IG9mIGEzYzkweF9wcm9iZSBzZXR0aW5nIGVudHJpZXMgaW4gdGhlIG5pYyBzdHJ1Y3R1cmUKKwlmb3IgdGhlbS4gIFRoZSBFdGhlckJvb3QgZnJhbWV3b3JrIGRvZXMgbm90IHVzZSBpbnRlcnJ1cHRzLiAgSXQgaXMKKwlwb2xsZWQuICBBbGwgdHJhbnNtaXQgYW5kIHJlY2VpdmUgb3BlcmF0aW9ucyBhcmUgaW5pdGlhdGVkIGJ5IHRoZQorCWV0aGVyYm9vdCBmcmFtZXdvcmssIG5vdCBieSBhbiBpbnRlcnJ1cHQgb3IgYnkgdGhlIGRyaXZlci4KKworICAgIEMuICBJbnRlcm5hbCBGdW5jdGlvbnMKKworCVRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBpbnRlcm5hbCB0byB0aGUgZHJpdmVyOgorCisJYTNjOTB4X2ludGVybmFsX0lzc3VlQ29tbWFuZCAtIHNlbmRzIGEgY29tbWFuZCB0byB0aGUgM2M5MDViIGNhcmQuCisJYTNjOTB4X2ludGVybmFsX1NldFdpbmRvdyAtIHNoaWZ0cyBiZXR3ZWVuIG9uZSBvZiBlaWdodCByZWdpc3RlcgorCXdpbmRvd3Mgb25ib2FyZCB0aGUgM2M5MHguICBUaGUgYm90dG9tIDE2IGJ5dGVzIG9mIHRoZSBjYXJkJ3MKKwlJL08gc3BhY2UgYXJlIG11bHRpcGxleGVkIGFtb25nIDEyOCBieXRlcywgb25seSAxNiBvZiB3aGljaCBhcmUKKwl2aXNpYmxlIGF0IGFueSBvbmUgdGltZS4gIFRoaXMgU2V0V2luZG93IGZ1bmN0aW9uIHNlbGVjdHMgb25lIG9mCisJdGhlIGVpZ2h0IHNldHMuCisJYTNjOTB4X2ludGVybmFsX1JlYWRFZXByb20gLSByZWFkcyBhIHdvcmQgKDE2IGJpdHMpIGZyb20gdGhlCisJY2FyZCdzIG9uYm9hcmQgbnZyYW0uICBUaGlzIGlzIE5PVCB0aGUgQklPUyBib290IHJvbS4gIFRoaXMgaXMKKwl3aGVyZSB0aGUgY2FyZCBzdG9yZXMgc3VjaCB0aGluZ3MgYXMgaXRzIGhhcmR3YXJlIGFkZHJlc3MuCisJYTNjOTB4X2ludGVybmFsX1dyaXRlRWVwcm9tIC0gd3JpdGVzIGEgd29yZCAoMTYgYml0cykgdG8gdGhlCisJY2FyZCdzIG52cmFtLCBhbmQgcmVjb21wdXRlcyB0aGUgZWVwcm9tIGNoZWNrc3VtLgorCWEzYzkweF9pbnRlcm5hbF9Xcml0ZUVlcHJvbVdvcmQgLSB3cml0ZXMgYSB3b3JkICgxNiBiaXRzKSB0byB0aGUKKwljYXJkJ3MgbnZyYW0uICBVc2VkIGJ5IHRoZSBhYm92ZSByb3V0aW5lLgorCWEzYzkweF9pbnRlcm5hbF9Xcml0ZUVlcHJvbVdvcmQgLSB3cml0ZXMgYSB3b3JkICgxNiBiaXRzKSB0byB0aGUKKwljYXJkJ3MgbnZyYW0uICBVc2VkIGJ5IHRoZSBhYm92ZSByb3V0aW5lLgorCisgICAgRC4gIEdsb2JhbHMKKworCUFsbCBnbG9iYWwgdmFyaWFibGVzIGFyZSBpbnNpZGUgYSBnbG9iYWwgc3RydWN0dXJlIG5hbWVkIElORl8zQzkwWC4KKwlTbywgd2hlcmV2ZXIgeW91IHNlZSB0aGF0IHN0cnVjdHVyZSByZWZlcmVuY2VkLCB5b3Uga25vdyB0aGUgdmFyaWFibGUKKwlpcyBhIGdsb2JhbC4gIEp1c3Qga2VlcHMgdGhpbmdzIGEgbGl0dGxlIG5lYXRlci4KKworICAgIEUuICBFbnVtZXJhdGlvbnMKKworCVRoZXJlIGFyZSBxdWl0ZSBhIGZldyBlbnVtZXJhdGVkIHR5cGUgZGVmaW5pdGlvbnMgZm9yIHJlZ2lzdGVycyBhbmQKKwlzbyBmb3J0aCwgbWFueSBmb3IgcmVnaXN0ZXJzIHRoYXQgSSBkaWRuJ3QgZXZlbiB0b3VjaCBpbiB0aGUgZHJpdmVyLgorCVJlZ2lzdGVyIHR5cGVzIHN0YXJ0IHdpdGggJ3JlZycsIHdpbmRvdyBudW1iZXJzIChmb3IgU2V0V2luZG93KQorCXN0YXJ0IHdpdGggJ3dpbicsIGFuZCBjb21tYW5kcyAoZm9yIElzc3VlQ29tbWFuZCkgc3RhcnQgd2l0aCAnY21kJy4KKwlSZWdpc3RlciBvZmZzZXRzIGFsc28gaW5jbHVkZSBhbiBpbmRpY2F0aW9uIGluIHRoZSBuYW1lIGFzIHRvIHRoZQorCXNpemUgb2YgdGhlIHJlZ2lzdGVyIChfYiA9IGJ5dGUsIF93ID0gd29yZCwgX2wgPSBsb25nKSwgYW5kIHdoaWNoCisJd2luZG93IHRoZSByZWdpc3RlciBpcyBpbiwgaWYgaXQgaXMgd2luZG93ZWQgKDAtNykuCisKKyAgICBGLiAgV2h5IHRoZSAnYTNjOTB4JyBuYW1lPworCisJSSBoYWQgdG8gY29tZSB1cCB3aXRoIGEgbGV0dGVyIGF0IHRoZSBiZWdpbm5pbmcgb2YgYWxsIG9mIHRoZQorCWlkZW50aWZpZXJzLCBzaW5jZSAzY29tIHNvIGNvbnZlbmllbnRseSBoYWQgdGhlaXIgbmFtZSBzdGFydCB3aXRoIGEKKwludW1iZXIuICBBbm90aGVyIGRyaXZlciB1c2VkICd0JyAoZm9yICd0aHJlZSc/KTsgSSBjaG9zZSAnYScgZm9yCisJbm8gcmVhc29uIGF0IGFsbC4KKworQWRkZW5kdW0gYnkgSm9yZ2UgTC4gZGVMeXJhIDxkZWx5cmFAbGF0dC5pZi51c3AuYnI+LCAyMk5vdjIwMDAgcmUKK3dvcmtpbmcgYXJvdW5kIHRoZSAzQzkwNSBoYXJkd2FyZSBidWcgbWVudGlvbmVkIGFib3ZlOgorCitVc2UgdGhpcyBmbG9wcHkgdG8gZml4IGFueSAzQ09NIG1vZGVsIDNDOTA1QiBQQ0kgMTAvMTAwIEV0aGVybmV0IGNhcmRzCit0aGF0IGZhaWwgdG8gbG9hZCBhbmQgcnVuIHRoZSBib290IHByb2dyYW0gdGhlIGZpcnN0IHRpbWUgYXJvdW5kLiBJZgordGhleSBoYXZlIGEgIkx1Y2VudCIgcmF0aGVyIHRoYW4gYSAiQnJvYWRjb20iIGNoaXBzZXQgdGhlc2UgY2FyZHMgaGF2ZQorYSBjb25maWd1cmF0aW9uIGJ1ZyB0aGF0IGNhdXNlcyBhIGhhbmcgd2hlbiB0cnlpbmcgdG8gbG9hZCB0aGUgYm9vdAorcHJvZ3JhbSBmcm9tIHRoZSBQUk9NLCBpZiB5b3UgdHJ5IHRvIHVzZSB0aGVtIHJpZ2h0IG91dCBvZiB0aGUgYm94LgorCitUaGUgYm9vdCBwcm9ncmFtIGluIHRoaXMgZmxvcHB5IGlzIHRoZSBmaWxlIG5hbWVkIDNjOTA1Yi10cG8xMDAucm9tCitmcm9tIEV0aGVyYm9vdCB2ZXJzaW9uIDQuNi4xMCwgY29tcGlsZWQgd2l0aCB0aGUgYnVnZml4IHBhcmFtZXRlcgorCisJCQlDRkdfM0M5MFhfQk9PVFJPTV9GSVgKKworWW91IGhhdmUgdG8gdGFrZSB0aGUgY2hpcCBvZmYgdGhlIGNhcmQgYW5kIGJvb3QgdGhlIHN5c3RlbSBvbmNlIHVzaW5nCit0aGlzIGZsb3BweS4gT25jZSBsb2FkZWQgZnJvbSB0aGUgZmxvcHB5LCB0aGUgYm9vdCBwcm9ncmFtIHdpbGwgYWNjZXNzCit0aGUgY2FyZCBhbmQgY2hhbmdlIHNvbWUgc2V0dGluZyBpbiBpdCwgY29ycmVjdGluZyB0aGUgcHJvYmxlbS4gQWZ0ZXIKK3RoYXQgeW91IG1heSB1c2UgZWl0aGVyIHRoaXMgYm9vdCBwcm9ncmFtIG9yIHRoZSBub3JtYWwgb25lLCBjb21waWxlZAord2l0aG91dCB0aGlzIGJ1Z2ZpeCBwYXJhbWV0ZXIsIHRvIGJvb3QgdGhlIG1hY2hpbmUgZnJvbSB0aGUgUFJPTSBjaGlwLgorCitbQW55IHJlY2VudCBFdGhlcmJvb3QgdmVyc2lvbiBzaG91bGQgZG8sIG5vdCBqdXN0IDQuNi4xMCAtIEVkLl0KZGlmZiAtLWdpdCBhL25ldGJvb3QvTWFrZWZpbGUuYW0gYi9uZXRib290L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NTViYjQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjE5IEBACisjIEZvciA8c2hhcmVkLmg+IGFuZCA8c3RhZ2UxLmg+LgorSU5DTFVERVMgPSAtSSQodG9wX3NyY2Rpcikvc3RhZ2UyIC1JJCh0b3Bfc3JjZGlyKS9zdGFnZTEKKworIyBEb24ndCBidWlsZCB0aGUgbmV0Ym9vdCBzdXBwb3J0IGJ5IGRlZmF1bHQuCitpZiBORVRCT09UX1NVUFBPUlQKK0xJQkRSSVZFUlMgPSBsaWJkcml2ZXJzLmEKK2Vsc2UKK0xJQkRSSVZFUlMgPQorZW5kaWYKKworbm9pbnN0X0xJQlJBUklFUyA9ICQoTElCRFJJVkVSUykKKworbGliZHJpdmVyc19hX1NPVVJDRVMgPSBjYXJkcy5oIGNvbmZpZy5jIGV0aGVyYm9vdC5oIFwKKwlmc3lzX3RmdHAuYyBsaW51eC1hc20taW8uaCBsaW51eC1hc20tc3RyaW5nLmggXAorCW1haW4uYyBtaXNjLmMgbmljLmggb3NkZXAuaCBwY2kuYyBwY2kuaCB0aW1lci5jIHRpbWVyLmgKK0VYVFJBX2xpYmRyaXZlcnNfYV9TT1VSQ0VTID0gM2M1MDkuYyAzYzUwOS5oIDNjNTk1LmMgM2M1OTUuaCAzYzkweC5jIFwKKwljczg5eDAuYyBjczg5eDAuaCBkYXZpY29tLmMgZGVwY2EuYyBlZXByby5jIGVlcHJvMTAwLmMgXAorCWVwaWMxMDAuYyBlcGljMTAwLmggZmEzMTEuYyBpODI1ODYuYyBsYW5jZS5jIG5hdHNlbWkuYyBcCisJbmk1MDEwLmMgbnM4MzkwLmMgbnM4MzkwLmggb3R1bGlwLmMgb3R1bGlwLmggcnRsODEzOS5jIFwKKwlzaXM5MDAuYyBzaXM5MDAuaCBza19nMTYuYyBza19nMTYuaCBzbWM5MDAwLmMgc21jOTAwMC5oIFwKKwl0aWFyYS5jIHRsYW4uYyB0dWxpcC5jIHZpYS1yaGluZS5jIHc4OWM4NDAuYworbGliZHJpdmVyc19hX0NGTEFHUyA9ICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisJLURGU1lTX1RGVFA9MSAkKE5FVF9DRkxBR1MpICQoTkVUX0VYVFJBRkxBR1MpCisjIEZpbGxlZCBieSBjb25maWd1cmUuCitsaWJkcml2ZXJzX2FfTElCQUREID0gQE5FVEJPT1RfRFJJVkVSU0AKK2xpYmRyaXZlcnNfYV9ERVBFTkRFTkNJRVMgPSAkKGxpYmRyaXZlcnNfYV9MSUJBREQpCisKK0VYVFJBX0RJU1QgPSBSRUFETUUubmV0Ym9vdCAzYzkweC50eHQgY3M4OXgwLnR4dCBzaXM5MDAudHh0IHR1bGlwLnR4dAorCisjIFRoZXNlIGJlbG93IGFyZSBzZXZlcmFsIHNwZWNpYWwgcnVsZXMgZm9yIHRoZSBkZXZpY2UgZHJpdmVycy4KKyMgV2UgY2Fubm90IHVzZSBhIHNpbXBsZSBydWxlIGZvciB0aGVtLi4uCisKKyMgV2hhdCBvYmplY3RzIGFyZSBkZXJpdmVkIGZyb20gYSBkcml2ZXI/CiszYzUwOV9kcml2ZXJzID0gM2M1MDkubyAzYzUyOS5vCiszYzU5NV9kcml2ZXJzID0gM2M1OTUubworM2M5MHhfZHJpdmVycyA9IDNjOTB4Lm8KK2NzODl4MF9kcml2ZXJzID0gY3M4OXgwLm8KK2Rhdmljb21fZHJpdmVycyA9IGRhdmljb20ubworZGVwY2FfZHJpdmVycyA9IGRlcGNhLm8KK2VlcHJvX2RyaXZlcnMgPSBlZXByby5vCitlZXBybzEwMF9kcml2ZXJzID0gZWVwcm8xMDAubworZXBpYzEwMF9kcml2ZXJzID0gZXBpYzEwMC5vCisjZmEzMTFfZHJpdmVycyA9IGZhMzExLm8KK2k4MjU4Nl9kcml2ZXJzID0gM2M1MDcubyBleG9zMjA1Lm8gbmk1MjEwLm8KK2xhbmNlX2RyaXZlcnMgPSBsYW5jZS5vIG5lMjEwMC5vIG5pNjUxMC5vCituYXRzZW1pX2RyaXZlcnMgPSBuYXRzZW1pLm8KK25pNTAxMF9kcml2ZXJzID0gbmk1MDEwLm8KK25zODM5MF9kcml2ZXJzID0gM2M1MDMubyBuZS5vIG5zODM5MC5vIHdkLm8KK290dWxpcF9kcml2ZXJzID0gb3R1bGlwLm8KK3J0bDgxMzlfZHJpdmVycyA9IHJ0bDgxMzkubworc2lzOTAwX2RyaXZlcnMgPSBzaXM5MDAubworc2tfZzE2X2RyaXZlcnMgPSBza19nMTYubworc21jOTAwMF9kcml2ZXJzID0gc21jOTAwMC5vCit0aWFyYV9kcml2ZXJzID0gdGlhcmEubworI3RsYW5fZHJpdmVycyA9IHRsYW4ubwordHVsaXBfZHJpdmVycyA9IHR1bGlwLm8KK3ZpYV9yaGluZV9kcml2ZXJzID0gdmlhX3JoaW5lLm8KK3c4OWM4NDBfZHJpdmVycyA9IHc4OWM4NDAubworCisjIElzIGl0IHJlYWxseSBuZWNlc3NhcnkgdG8gc3BlY2lmeSBkZXBlbmRlY2llcyBleHBsaWNpdGx5PworJCgzYzUwOV9kcml2ZXJzKTogM2M1MDkuYyAzYzUwOS5oCiskKDNjNTA5X2RyaXZlcnMpOiAlLm86IDNjNTA5LmMKKwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCiskKDNjNTk1X2RyaXZlcnMpOiAzYzU5NS5jIDNjNTk1LmgKKyQoM2M1OTVfZHJpdmVycyk6ICUubzogM2M1OTUuYworCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyQoM2M5MHhfZHJpdmVycyk6IDNjOTB4LmMKKyQoM2M5MHhfZHJpdmVycyk6ICUubzogM2M5MHguYworCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyQoY3M4OXgwX2RyaXZlcnMpOiBjczg5eDAuYyBjczg5eDAuaAorJChjczg5eDBfZHJpdmVycyk6ICUubzogY3M4OXgwLmMKKwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCiskKGRhdmljb21fZHJpdmVycyk6IGRhdmljb20uYworJChkYXZpY29tX2RyaXZlcnMpOiAlLm86IGRhdmljb20uYworCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyQoZGVwY2FfZHJpdmVycyk6IGRlcGNhLmMKKyQoZGVwY2FfZHJpdmVycyk6ICUubzogZGVwY2EuYworCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyQoZWVwcm9fZHJpdmVycyk6IGVlcHJvLmMKKyQoZWVwcm9fZHJpdmVycyk6ICUubzogZWVwcm8uYworCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyQoZWVwcm8xMDBfZHJpdmVycyk6IGVlcHJvMTAwLmMKKyQoZWVwcm8xMDBfZHJpdmVycyk6ICUubzogZWVwcm8xMDAuYworCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyQoZXBpYzEwMF9kcml2ZXJzKTogZXBpYzEwMC5jIGVwaWMxMDAuaAorJChlcGljMTAwX2RyaXZlcnMpOiAlLm86IGVwaWMxMDAuYworCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyMkKGZhMzExX2RyaXZlcnMpOiBmYTMxMS5jCisjJChmYTMxMV9kcml2ZXJzKTogJS5vOiBmYTMxMS5jCisjCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKyMJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCiskKGk4MjU4Nl9kcml2ZXJzKTogaTgyNTg2LmMKKyQoaTgyNTg2X2RyaXZlcnMpOiAlLm86IGk4MjU4Ni5jCisJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKworJChsYW5jZV9kcml2ZXJzKTogbGFuY2UuYworJChsYW5jZV9kcml2ZXJzKTogJS5vOiBsYW5jZS5jCisJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKworJChuYXRzZW1pX2RyaXZlcnMpOiBuYXRzZW1pLmMKKyQobmF0c2VtaV9kcml2ZXJzKTogJS5vOiBuYXRzZW1pLmMKKwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCiskKG5pNTAxMF9kcml2ZXJzKTogbmk1MDEwLmMKKyQobmk1MDEwX2RyaXZlcnMpOiAlLm86IG5pNTAxMC5jCisJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKworJChuczgzOTBfZHJpdmVycyk6IG5zODM5MC5jIG5zODM5MC5oCiskKG5zODM5MF9kcml2ZXJzKTogJS5vOiBuczgzOTAuYworCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyQob3R1bGlwX2RyaXZlcnMpOiBvdHVsaXAuYyBvdHVsaXAuaAorJChvdHVsaXBfZHJpdmVycyk6ICUubzogb3R1bGlwLmMKKwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCiskKHJ0bDgxMzlfZHJpdmVycyk6IHJ0bDgxMzkuYworJChydGw4MTM5X2RyaXZlcnMpOiAlLm86IHJ0bDgxMzkuYworCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyQoc2lzOTAwX2RyaXZlcnMpOiBzaXM5MDAuYworJChzaXM5MDBfZHJpdmVycyk6ICUubzogc2lzOTAwLmMgc2lzOTAwLmgKKwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCiskKHNrX2cxNl9kcml2ZXJzKTogc2tfZzE2LmMgc2tfZzE2LmgKKyQoc2tfZzE2X2RyaXZlcnMpOiAlLm86IHNrX2cxNi5jCisJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKworJChzbWM5MDAwX2RyaXZlcnMpOiBzbWM5MDAwLmMgc21jOTAwMC5oCiskKHNtYzkwMDBfZHJpdmVycyk6ICUubzogc21jOTAwMC5jCisJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKworJCh0aWFyYV9kcml2ZXJzKTogdGlhcmEuYworJCh0aWFyYV9kcml2ZXJzKTogJS5vOiB0aWFyYS5jCisJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKworIyQodGxhbl9kcml2ZXJzKTogdGxhbi5jCisjJCh0bGFuX2RyaXZlcnMpOiAlLm86IHRsYW4uYworIwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisjCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKworJCh0dWxpcF9kcml2ZXJzKTogdHVsaXAuYworJCh0dWxpcF9kcml2ZXJzKTogJS5vOiB0dWxpcC5jCisJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKworJCh2aWFfcmhpbmVfZHJpdmVycyk6IHZpYS1yaGluZS5jCiskKHZpYV9yaGluZV9kcml2ZXJzKTogJS5vOiB2aWEtcmhpbmUuYworCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyQodzg5Yzg0MF9kcml2ZXJzKTogdzg5Yzg0MC5jCiskKHc4OWM4NDBfZHJpdmVycyk6ICUubzogdzg5Yzg0MC5jCisJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKworIyBQZXItb2JqZWN0IGZsYWdzLgorM2M1MDlfb19DRkxBR1MgPSAtRElOQ0xVREVfM0M1MDk9MQorM2M1Mjlfb19DRkxBR1MgPSAtRElOQ0xVREVfM0M1Mjk9MQorM2M1OTVfb19DRkxBR1MgPSAtRElOQ0xVREVfM0M1OTU9MQorM2M5MHhfb19DRkxBR1MgPSAtRElOQ0xVREVfM0M5MFg9MQorY3M4OXgwX29fQ0ZMQUdTID0gLURJTkNMVURFX0NTODlYMD0xCitkYXZpY29tX29fQ0ZMQUdTID0gLURJTkNMVURFX0RBVklDT009MQorZGVwY2Ffb19DRkxBR1MgPSAtRElOQ0xVREVfREVQQ0E9MQorZWVwcm9fb19DRkxBR1MgPSAtRElOQ0xVREVfRUVQUk89MQorZWVwcm8xMDBfb19DRkxBR1MgPSAtRElOQ0xVREVfRUVQUk8xMDA9MQorZXBpYzEwMF9vX0NGTEFHUyA9IC1ESU5DTFVERV9FUElDMTAwPTEKKyNmYTMxMV9vX0NGTEFHUyA9IC1ESU5DTFVERV9GQTMxMT0xCiszYzUwN19vX0NGTEFHUyA9IC1ESU5DTFVERV8zQzUwNz0xCitleG9zMjA1X29fQ0ZMQUdTID0gLURJTkNMVURFX0VYT1MyMDU9MQorbmk1MjEwX29fQ0ZMQUdTID0gLURJTkNMVURFX05JNTIxMD0xCitsYW5jZV9vX0NGTEFHUyA9IC1ESU5DTFVERV9MQU5DRT0xCituZTIxMDBfb19DRkxBR1MgPSAtRElOQ0xVREVfTkUyMTAwPTEKK25pNjUxMF9vX0NGTEFHUyA9IC1ESU5DTFVERV9OSTY1MTA9MQorbmF0c2VtaV9vX0NGTEFHUyA9IC1ESU5DTFVERV9OQVRTRU1JPTEKK25pNTAxMF9vX0NGTEFHUyA9IC1ESU5DTFVERV9OSTUwMTA9MQorM2M1MDNfb19DRkxBR1MgPSAtRElOQ0xVREVfM0M1MDM9MQorbmVfb19DRkxBR1MgPSAtRElOQ0xVREVfTkU9MQorbnM4MzkwX29fQ0ZMQUdTID0gLURJTkNMVURFX05TODM5MD0xCit3ZF9vX0NGTEFHUyA9IC1ESU5DTFVERV9XRD0xCitvdHVsaXBfb19DRkxBR1MgPSAtRElOQ0xVREVfT1RVTElQPTEKK3J0bDgxMzlfb19DRkxBR1MgPSAtRElOQ0xVREVfUlRMODEzOT0xCitzaXM5MDBfb19DRkxBR1MgPSAtRElOQ0xVREVfU0lTOTAwPTEKK3NrX2cxNl9vX0NGTEFHUyA9IC1ESU5DTFVERV9TS19HMTY9MQorc21jOTAwMF9vX0NGTEFHUyA9IC1ESU5DTFVERV9TTUM5MDAwPTEKK3RpYXJhX29fQ0ZMQUdTID0gLURJTkNMVURFX1RJQVJBPTEKKyN0bGFuX29fQ0ZMQUdTID0gLURJTkNMVURFX1RMQU49MQordHVsaXBfb19DRkxBR1MgPSAtRElOQ0xVREVfVFVMSVA9MQordmlhX3JoaW5lX29fQ0ZMQUdTID0gLURJTkNMVURFX1ZJQV9SSElORT0xCit3ODljODQwX29fQ0ZMQUdTID0gLURJTkNMVURFX1c4OUM4NDA9MQpkaWZmIC0tZ2l0IGEvbmV0Ym9vdC9NYWtlZmlsZS5pbiBiL25ldGJvb3QvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVhYzI5OQotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwxMDkxIEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjkuNCBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKK1NPVVJDRVMgPSAkKGxpYmRyaXZlcnNfYV9TT1VSQ0VTKSAkKEVYVFJBX2xpYmRyaXZlcnNfYV9TT1VSQ0VTKQorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3RvcF9idWlsZGRpciA9IC4uCithbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCitJTlNUQUxMID0gQElOU1RBTExACitpbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAoraW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYworaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACitzdWJkaXIgPSBuZXRib290CitESVNUX0NPTU1PTiA9ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4KK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjaW5jbHVkZS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycworQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0xJQlJBUklFUyA9ICQobm9pbnN0X0xJQlJBUklFUykKK0FSID0gYXIKK0FSRkxBR1MgPSBjcnUKK2xpYmRyaXZlcnNfYV9BUiA9ICQoQVIpICQoQVJGTEFHUykKK2FtX2xpYmRyaXZlcnNfYV9PQkpFQ1RTID0gbGliZHJpdmVyc19hLWNvbmZpZy4kKE9CSkVYVCkgXAorCWxpYmRyaXZlcnNfYS1mc3lzX3RmdHAuJChPQkpFWFQpIGxpYmRyaXZlcnNfYS1tYWluLiQoT0JKRVhUKSBcCisJbGliZHJpdmVyc19hLW1pc2MuJChPQkpFWFQpIGxpYmRyaXZlcnNfYS1wY2kuJChPQkpFWFQpIFwKKwlsaWJkcml2ZXJzX2EtdGltZXIuJChPQkpFWFQpCitsaWJkcml2ZXJzX2FfT0JKRUNUUyA9ICQoYW1fbGliZHJpdmVyc19hX09CSkVDVFMpCitERUZBVUxUX0lOQ0xVREVTID0gLUkuIC1JJChzcmNkaXIpIC1JJCh0b3BfYnVpbGRkaXIpCitkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCithbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcworQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCisJJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorQ0NMRCA9ICQoQ0MpCitMSU5LID0gJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoQU1fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorU09VUkNFUyA9ICQobGliZHJpdmVyc19hX1NPVVJDRVMpICQoRVhUUkFfbGliZHJpdmVyc19hX1NPVVJDRVMpCitESVNUX1NPVVJDRVMgPSAkKGxpYmRyaXZlcnNfYV9TT1VSQ0VTKSAkKEVYVFJBX2xpYmRyaXZlcnNfYV9TT1VSQ0VTKQorRVRBR1MgPSBldGFncworQ1RBR1MgPSBjdGFncworRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FNREVQX0ZBTFNFID0gQEFNREVQX0ZBTFNFQAorQU1ERVBfVFJVRSA9IEBBTURFUF9UUlVFQAorQU1UQVIgPSBAQU1UQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0JVSUxEX0VYQU1QTEVfS0VSTkVMX0ZBTFNFID0gQEJVSUxEX0VYQU1QTEVfS0VSTkVMX0ZBTFNFQAorQlVJTERfRVhBTVBMRV9LRVJORUxfVFJVRSA9IEBCVUlMRF9FWEFNUExFX0tFUk5FTF9UUlVFQAorQ0MgPSBAQ0NACitDQ0FTID0gQENDQVNACitDQ0FTRkxBR1MgPSBAQ0NBU0ZMQUdTQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NGTEFHUyA9IEBDRkxBR1NACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0RJU0tMRVNTX1NVUFBPUlRfRkFMU0UgPSBARElTS0xFU1NfU1VQUE9SVF9GQUxTRUAKK0RJU0tMRVNTX1NVUFBPUlRfVFJVRSA9IEBESVNLTEVTU19TVVBQT1JUX1RSVUVACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitGU1lTX0NGTEFHUyA9IEBGU1lTX0NGTEFHU0AKK0dSVUJfQ0ZMQUdTID0gQEdSVUJfQ0ZMQUdTQAorR1JVQl9MSUJTID0gQEdSVUJfTElCU0AKK0hFUkNVTEVTX1NVUFBPUlRfRkFMU0UgPSBASEVSQ1VMRVNfU1VQUE9SVF9GQUxTRUAKK0hFUkNVTEVTX1NVUFBPUlRfVFJVRSA9IEBIRVJDVUxFU19TVVBQT1JUX1RSVUVACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0xERkxBR1MgPSBATERGTEFHU0AKK0xJQk9CSlMgPSBATElCT0JKU0AKK0xJQlMgPSBATElCU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BSU5UQUlORVJfTU9ERV9GQUxTRSA9IEBNQUlOVEFJTkVSX01PREVfRkFMU0VACitNQUlOVEFJTkVSX01PREVfVFJVRSA9IEBNQUlOVEFJTkVSX01PREVfVFJVRUAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTkVUQk9PVF9EUklWRVJTID0gQE5FVEJPT1RfRFJJVkVSU0AKK05FVEJPT1RfU1VQUE9SVF9GQUxTRSA9IEBORVRCT09UX1NVUFBPUlRfRkFMU0VACitORVRCT09UX1NVUFBPUlRfVFJVRSA9IEBORVRCT09UX1NVUFBPUlRfVFJVRUAKK05FVF9DRkxBR1MgPSBATkVUX0NGTEFHU0AKK05FVF9FWFRSQUZMQUdTID0gQE5FVF9FWFRSQUZMQUdTQAorT0JKQ09QWSA9IEBPQkpDT1BZQAorT0JKRVhUID0gQE9CSkVYVEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BFUkwgPSBAUEVSTEAKK1JBTkxJQiA9IEBSQU5MSUJACitTRVJJQUxfU1BFRURfU0lNVUxBVElPTl9GQUxTRSA9IEBTRVJJQUxfU1BFRURfU0lNVUxBVElPTl9GQUxTRUAKK1NFUklBTF9TUEVFRF9TSU1VTEFUSU9OX1RSVUUgPSBAU0VSSUFMX1NQRUVEX1NJTVVMQVRJT05fVFJVRUAKK1NFUklBTF9TVVBQT1JUX0ZBTFNFID0gQFNFUklBTF9TVVBQT1JUX0ZBTFNFQAorU0VSSUFMX1NVUFBPUlRfVFJVRSA9IEBTRVJJQUxfU1VQUE9SVF9UUlVFQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUQUdFMV9DRkxBR1MgPSBAU1RBR0UxX0NGTEFHU0AKK1NUQUdFMl9DRkxBR1MgPSBAU1RBR0UyX0NGTEFHU0AKK1NUUklQID0gQFNUUklQQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9PQkpDT1BZID0gQGFjX2N0X09CSkNPUFlACithY19jdF9SQU5MSUIgPSBAYWNfY3RfUkFOTElCQAorYWNfY3RfU1RSSVAgPSBAYWNfY3RfU1RSSVBACithbV9fZmFzdGRlcENDX0ZBTFNFID0gQGFtX19mYXN0ZGVwQ0NfRkFMU0VACithbV9fZmFzdGRlcENDX1RSVUUgPSBAYW1fX2Zhc3RkZXBDQ19UUlVFQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitkYXRhZGlyID0gQGRhdGFkaXJACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK29sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitzYmluZGlyID0gQHNiaW5kaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACisKKyMgRm9yIDxzaGFyZWQuaD4gYW5kIDxzdGFnZTEuaD4uCitJTkNMVURFUyA9IC1JJCh0b3Bfc3JjZGlyKS9zdGFnZTIgLUkkKHRvcF9zcmNkaXIpL3N0YWdlMQorQE5FVEJPT1RfU1VQUE9SVF9GQUxTRUBMSUJEUklWRVJTID0gCisKKyMgRG9uJ3QgYnVpbGQgdGhlIG5ldGJvb3Qgc3VwcG9ydCBieSBkZWZhdWx0LgorQE5FVEJPT1RfU1VQUE9SVF9UUlVFQExJQkRSSVZFUlMgPSBsaWJkcml2ZXJzLmEKK25vaW5zdF9MSUJSQVJJRVMgPSAkKExJQkRSSVZFUlMpCitsaWJkcml2ZXJzX2FfU09VUkNFUyA9IGNhcmRzLmggY29uZmlnLmMgZXRoZXJib290LmggXAorCWZzeXNfdGZ0cC5jIGxpbnV4LWFzbS1pby5oIGxpbnV4LWFzbS1zdHJpbmcuaCBcCisJbWFpbi5jIG1pc2MuYyBuaWMuaCBvc2RlcC5oIHBjaS5jIHBjaS5oIHRpbWVyLmMgdGltZXIuaAorCitFWFRSQV9saWJkcml2ZXJzX2FfU09VUkNFUyA9IDNjNTA5LmMgM2M1MDkuaCAzYzU5NS5jIDNjNTk1LmggM2M5MHguYyBcCisJY3M4OXgwLmMgY3M4OXgwLmggZGF2aWNvbS5jIGRlcGNhLmMgZWVwcm8uYyBlZXBybzEwMC5jIFwKKwllcGljMTAwLmMgZXBpYzEwMC5oIGZhMzExLmMgaTgyNTg2LmMgbGFuY2UuYyBuYXRzZW1pLmMgXAorCW5pNTAxMC5jIG5zODM5MC5jIG5zODM5MC5oIG90dWxpcC5jIG90dWxpcC5oIHJ0bDgxMzkuYyBcCisJc2lzOTAwLmMgc2lzOTAwLmggc2tfZzE2LmMgc2tfZzE2Lmggc21jOTAwMC5jIHNtYzkwMDAuaCBcCisJdGlhcmEuYyB0bGFuLmMgdHVsaXAuYyB2aWEtcmhpbmUuYyB3ODljODQwLmMKKworbGliZHJpdmVyc19hX0NGTEFHUyA9ICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisJLURGU1lTX1RGVFA9MSAkKE5FVF9DRkxBR1MpICQoTkVUX0VYVFJBRkxBR1MpCisKKyMgRmlsbGVkIGJ5IGNvbmZpZ3VyZS4KK2xpYmRyaXZlcnNfYV9MSUJBREQgPSBATkVUQk9PVF9EUklWRVJTQAorbGliZHJpdmVyc19hX0RFUEVOREVOQ0lFUyA9ICQobGliZHJpdmVyc19hX0xJQkFERCkKK0VYVFJBX0RJU1QgPSBSRUFETUUubmV0Ym9vdCAzYzkweC50eHQgY3M4OXgwLnR4dCBzaXM5MDAudHh0IHR1bGlwLnR4dAorCisjIFRoZXNlIGJlbG93IGFyZSBzZXZlcmFsIHNwZWNpYWwgcnVsZXMgZm9yIHRoZSBkZXZpY2UgZHJpdmVycy4KKyMgV2UgY2Fubm90IHVzZSBhIHNpbXBsZSBydWxlIGZvciB0aGVtLi4uCisKKyMgV2hhdCBvYmplY3RzIGFyZSBkZXJpdmVkIGZyb20gYSBkcml2ZXI/CiszYzUwOV9kcml2ZXJzID0gM2M1MDkubyAzYzUyOS5vCiszYzU5NV9kcml2ZXJzID0gM2M1OTUubworM2M5MHhfZHJpdmVycyA9IDNjOTB4Lm8KK2NzODl4MF9kcml2ZXJzID0gY3M4OXgwLm8KK2Rhdmljb21fZHJpdmVycyA9IGRhdmljb20ubworZGVwY2FfZHJpdmVycyA9IGRlcGNhLm8KK2VlcHJvX2RyaXZlcnMgPSBlZXByby5vCitlZXBybzEwMF9kcml2ZXJzID0gZWVwcm8xMDAubworZXBpYzEwMF9kcml2ZXJzID0gZXBpYzEwMC5vCisjZmEzMTFfZHJpdmVycyA9IGZhMzExLm8KK2k4MjU4Nl9kcml2ZXJzID0gM2M1MDcubyBleG9zMjA1Lm8gbmk1MjEwLm8KK2xhbmNlX2RyaXZlcnMgPSBsYW5jZS5vIG5lMjEwMC5vIG5pNjUxMC5vCituYXRzZW1pX2RyaXZlcnMgPSBuYXRzZW1pLm8KK25pNTAxMF9kcml2ZXJzID0gbmk1MDEwLm8KK25zODM5MF9kcml2ZXJzID0gM2M1MDMubyBuZS5vIG5zODM5MC5vIHdkLm8KK290dWxpcF9kcml2ZXJzID0gb3R1bGlwLm8KK3J0bDgxMzlfZHJpdmVycyA9IHJ0bDgxMzkubworc2lzOTAwX2RyaXZlcnMgPSBzaXM5MDAubworc2tfZzE2X2RyaXZlcnMgPSBza19nMTYubworc21jOTAwMF9kcml2ZXJzID0gc21jOTAwMC5vCit0aWFyYV9kcml2ZXJzID0gdGlhcmEubworI3RsYW5fZHJpdmVycyA9IHRsYW4ubwordHVsaXBfZHJpdmVycyA9IHR1bGlwLm8KK3ZpYV9yaGluZV9kcml2ZXJzID0gdmlhX3JoaW5lLm8KK3c4OWM4NDBfZHJpdmVycyA9IHc4OWM4NDAubworCisjIFBlci1vYmplY3QgZmxhZ3MuCiszYzUwOV9vX0NGTEFHUyA9IC1ESU5DTFVERV8zQzUwOT0xCiszYzUyOV9vX0NGTEFHUyA9IC1ESU5DTFVERV8zQzUyOT0xCiszYzU5NV9vX0NGTEFHUyA9IC1ESU5DTFVERV8zQzU5NT0xCiszYzkweF9vX0NGTEFHUyA9IC1ESU5DTFVERV8zQzkwWD0xCitjczg5eDBfb19DRkxBR1MgPSAtRElOQ0xVREVfQ1M4OVgwPTEKK2Rhdmljb21fb19DRkxBR1MgPSAtRElOQ0xVREVfREFWSUNPTT0xCitkZXBjYV9vX0NGTEFHUyA9IC1ESU5DTFVERV9ERVBDQT0xCitlZXByb19vX0NGTEFHUyA9IC1ESU5DTFVERV9FRVBSTz0xCitlZXBybzEwMF9vX0NGTEFHUyA9IC1ESU5DTFVERV9FRVBSTzEwMD0xCitlcGljMTAwX29fQ0ZMQUdTID0gLURJTkNMVURFX0VQSUMxMDA9MQorI2ZhMzExX29fQ0ZMQUdTID0gLURJTkNMVURFX0ZBMzExPTEKKzNjNTA3X29fQ0ZMQUdTID0gLURJTkNMVURFXzNDNTA3PTEKK2V4b3MyMDVfb19DRkxBR1MgPSAtRElOQ0xVREVfRVhPUzIwNT0xCituaTUyMTBfb19DRkxBR1MgPSAtRElOQ0xVREVfTkk1MjEwPTEKK2xhbmNlX29fQ0ZMQUdTID0gLURJTkNMVURFX0xBTkNFPTEKK25lMjEwMF9vX0NGTEFHUyA9IC1ESU5DTFVERV9ORTIxMDA9MQorbmk2NTEwX29fQ0ZMQUdTID0gLURJTkNMVURFX05JNjUxMD0xCituYXRzZW1pX29fQ0ZMQUdTID0gLURJTkNMVURFX05BVFNFTUk9MQorbmk1MDEwX29fQ0ZMQUdTID0gLURJTkNMVURFX05JNTAxMD0xCiszYzUwM19vX0NGTEFHUyA9IC1ESU5DTFVERV8zQzUwMz0xCituZV9vX0NGTEFHUyA9IC1ESU5DTFVERV9ORT0xCituczgzOTBfb19DRkxBR1MgPSAtRElOQ0xVREVfTlM4MzkwPTEKK3dkX29fQ0ZMQUdTID0gLURJTkNMVURFX1dEPTEKK290dWxpcF9vX0NGTEFHUyA9IC1ESU5DTFVERV9PVFVMSVA9MQorcnRsODEzOV9vX0NGTEFHUyA9IC1ESU5DTFVERV9SVEw4MTM5PTEKK3NpczkwMF9vX0NGTEFHUyA9IC1ESU5DTFVERV9TSVM5MDA9MQorc2tfZzE2X29fQ0ZMQUdTID0gLURJTkNMVURFX1NLX0cxNj0xCitzbWM5MDAwX29fQ0ZMQUdTID0gLURJTkNMVURFX1NNQzkwMDA9MQordGlhcmFfb19DRkxBR1MgPSAtRElOQ0xVREVfVElBUkE9MQorI3RsYW5fb19DRkxBR1MgPSAtRElOQ0xVREVfVExBTj0xCit0dWxpcF9vX0NGTEFHUyA9IC1ESU5DTFVERV9UVUxJUD0xCit2aWFfcmhpbmVfb19DRkxBR1MgPSAtRElOQ0xVREVfVklBX1JISU5FPTEKK3c4OWM4NDBfb19DRkxBR1MgPSAtRElOQ0xVREVfVzg5Qzg0MD0xCithbGw6IGFsbC1hbQorCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5jIC5vIC5vYmoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCBcCisJCSYmIGV4aXQgMDsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgIG5ldGJvb3QvTWFrZWZpbGUnOyBcCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWdudSAgbmV0Ym9vdC9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCitjbGVhbi1ub2luc3RMSUJSQVJJRVM6CisJLXRlc3QgLXogIiQobm9pbnN0X0xJQlJBUklFUykiIHx8IHJtIC1mICQobm9pbnN0X0xJQlJBUklFUykKK2xpYmRyaXZlcnMuYTogJChsaWJkcml2ZXJzX2FfT0JKRUNUUykgJChsaWJkcml2ZXJzX2FfREVQRU5ERU5DSUVTKSAKKwktcm0gLWYgbGliZHJpdmVycy5hCisJJChsaWJkcml2ZXJzX2FfQVIpIGxpYmRyaXZlcnMuYSAkKGxpYmRyaXZlcnNfYV9PQkpFQ1RTKSAkKGxpYmRyaXZlcnNfYV9MSUJBREQpCisJJChSQU5MSUIpIGxpYmRyaXZlcnMuYQorCittb3N0bHljbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLiQoT0JKRVhUKQorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLTNjNTA5LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M1OTUuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzkweC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLWNvbmZpZy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLWNzODl4MC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLWRhdmljb20uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1kZXBjYS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLWVlcHJvLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8xMDAuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1lcGljMTAwLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtZmEzMTEuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1mc3lzX3RmdHAuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1pODI1ODYuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1sYW5jZS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLW1haW4uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1taXNjLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtbmF0c2VtaS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLW5pNTAxMC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLW5zODM5MC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLW90dWxpcC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLXBjaS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLXJ0bDgxMzkuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1zaXM5MDAuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1za19nMTYuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS1zbWM5MDAwLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJkcml2ZXJzX2EtdGlhcmEuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS10aW1lci5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLXRsYW4uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmRyaXZlcnNfYS10dWxpcC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLXZpYS1yaGluZS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZHJpdmVyc19hLXc4OWM4NDAuUG9AYW1fX3F1b3RlQAorCisuYy5vOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgIiQoREVQRElSKS8kKi5UcG8iIC1jIC1vICRAICQ8OyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvJCouVHBvIiAiJChERVBESVIpLyQqLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpLyQqLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jICQ8CisKKy5jLm9iajoKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICIkKERFUERJUikvJCouVHBvIiAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvJCouVHBvIiAiJChERVBESVIpLyQqLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpLyQqLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKKworbGliZHJpdmVyc19hLWNvbmZpZy5vOiBjb25maWcuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtY29uZmlnLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtY29uZmlnLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLWNvbmZpZy5vIGB0ZXN0IC1mICdjb25maWcuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29uZmlnLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtY29uZmlnLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtY29uZmlnLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1jb25maWcuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29uZmlnLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWNvbmZpZy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWNvbmZpZy5vIGB0ZXN0IC1mICdjb25maWcuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29uZmlnLmMKKworbGliZHJpdmVyc19hLWNvbmZpZy5vYmo6IGNvbmZpZy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1jb25maWcub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLWNvbmZpZy5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1jb25maWcub2JqIGBpZiB0ZXN0IC1mICdjb25maWcuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb25maWcuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29uZmlnLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtY29uZmlnLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtY29uZmlnLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1jb25maWcuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29uZmlnLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWNvbmZpZy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtY29uZmlnLm9iaiBgaWYgdGVzdCAtZiAnY29uZmlnLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29uZmlnLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbmZpZy5jJzsgZmlgCisKK2xpYmRyaXZlcnNfYS1mc3lzX3RmdHAubzogZnN5c190ZnRwLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1mc3lzX3RmdHAubyBgdGVzdCAtZiAnZnN5c190ZnRwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfdGZ0cC5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZnN5c190ZnRwLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfdGZ0cC5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1mc3lzX3RmdHAubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1mc3lzX3RmdHAubyBgdGVzdCAtZiAnZnN5c190ZnRwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfdGZ0cC5jCisKK2xpYmRyaXZlcnNfYS1mc3lzX3RmdHAub2JqOiBmc3lzX3RmdHAuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtZnN5c190ZnRwLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1mc3lzX3RmdHAuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtZnN5c190ZnRwLm9iaiBgaWYgdGVzdCAtZiAnZnN5c190ZnRwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c190ZnRwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfdGZ0cC5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZnN5c190ZnRwLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfdGZ0cC5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1mc3lzX3RmdHAub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWZzeXNfdGZ0cC5vYmogYGlmIHRlc3QgLWYgJ2ZzeXNfdGZ0cC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfdGZ0cC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX3RmdHAuYyc7IGZpYAorCitsaWJkcml2ZXJzX2EtbWFpbi5vOiBtYWluLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLW1haW4ubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1tYWluLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLW1haW4ubyBgdGVzdCAtZiAnbWFpbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BtYWluLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbWFpbi5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLW1haW4uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW1haW4uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nbWFpbi5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1tYWluLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtbWFpbi5vIGB0ZXN0IC1mICdtYWluLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG1haW4uYworCitsaWJkcml2ZXJzX2EtbWFpbi5vYmo6IG1haW4uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtbWFpbi5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbWFpbi5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1tYWluLm9iaiBgaWYgdGVzdCAtZiAnbWFpbi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ21haW4uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbWFpbi5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW1haW4uVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1tYWluLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1tYWluLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J21haW4uYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtbWFpbi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtbWFpbi5vYmogYGlmIHRlc3QgLWYgJ21haW4uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdtYWluLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL21haW4uYyc7IGZpYAorCitsaWJkcml2ZXJzX2EtbWlzYy5vOiBtaXNjLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLW1pc2MubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1taXNjLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLW1pc2MubyBgdGVzdCAtZiAnbWlzYy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BtaXNjLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbWlzYy5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLW1pc2MuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW1pc2MuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nbWlzYy5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1taXNjLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtbWlzYy5vIGB0ZXN0IC1mICdtaXNjLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG1pc2MuYworCitsaWJkcml2ZXJzX2EtbWlzYy5vYmo6IG1pc2MuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtbWlzYy5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbWlzYy5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1taXNjLm9iaiBgaWYgdGVzdCAtZiAnbWlzYy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ21pc2MuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbWlzYy5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW1pc2MuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1taXNjLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1taXNjLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J21pc2MuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtbWlzYy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtbWlzYy5vYmogYGlmIHRlc3QgLWYgJ21pc2MuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdtaXNjLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL21pc2MuYyc7IGZpYAorCitsaWJkcml2ZXJzX2EtcGNpLm86IHBjaS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1wY2kubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY2kuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtcGNpLm8gYHRlc3QgLWYgJ3BjaS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwY2kuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY2kuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY2kuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXBjaS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwY2kuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtcGNpLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtcGNpLm8gYHRlc3QgLWYgJ3BjaS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BwY2kuYworCitsaWJkcml2ZXJzX2EtcGNpLm9iajogcGNpLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXBjaS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcGNpLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXBjaS5vYmogYGlmIHRlc3QgLWYgJ3BjaS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3BjaS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9wY2kuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY2kuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1wY2kuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXBjaS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdwY2kuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtcGNpLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1wY2kub2JqIGBpZiB0ZXN0IC1mICdwY2kuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdwY2kuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvcGNpLmMnOyBmaWAKKworbGliZHJpdmVyc19hLXRpbWVyLm86IHRpbWVyLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXRpbWVyLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGltZXIuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtdGltZXIubyBgdGVzdCAtZiAndGltZXIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdGltZXIuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10aW1lci5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLXRpbWVyLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10aW1lci5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0aW1lci5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS10aW1lci5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXRpbWVyLm8gYHRlc3QgLWYgJ3RpbWVyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHRpbWVyLmMKKworbGliZHJpdmVyc19hLXRpbWVyLm9iajogdGltZXIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtdGltZXIub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXRpbWVyLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXRpbWVyLm9iaiBgaWYgdGVzdCAtZiAndGltZXIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd0aW1lci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90aW1lci5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXRpbWVyLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGltZXIuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXRpbWVyLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3RpbWVyLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXRpbWVyLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS10aW1lci5vYmogYGlmIHRlc3QgLWYgJ3RpbWVyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndGltZXIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdGltZXIuYyc7IGZpYAorCitsaWJkcml2ZXJzX2EtM2M1MDkubzogM2M1MDkuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtM2M1MDkubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzUwOS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS0zYzUwOS5vIGB0ZXN0IC1mICczYzUwOS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2AzYzUwOS5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLTNjNTA5LlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M1MDkuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLTNjNTA5LlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JzNjNTA5LmMnIG9iamVjdD0nbGliZHJpdmVyc19hLTNjNTA5Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtM2M1MDkubyBgdGVzdCAtZiAnM2M1MDkuYycgfHwgZWNobyAnJChzcmNkaXIpLydgM2M1MDkuYworCitsaWJkcml2ZXJzX2EtM2M1MDkub2JqOiAzYzUwOS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS0zYzUwOS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M1MDkuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtM2M1MDkub2JqIGBpZiB0ZXN0IC1mICczYzUwOS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJzNjNTA5LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpLzNjNTA5LmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M1MDkuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzUwOS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M1MDkuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nM2M1MDkuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtM2M1MDkub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLTNjNTA5Lm9iaiBgaWYgdGVzdCAtZiAnM2M1MDkuYyc7IHRoZW4gJChDWUdQQVRIX1cpICczYzUwOS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS8zYzUwOS5jJzsgZmlgCisKK2xpYmRyaXZlcnNfYS0zYzU5NS5vOiAzYzU5NS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS0zYzU5NS5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLTNjNTk1LlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLTNjNTk1Lm8gYHRlc3QgLWYgJzNjNTk1LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYDNjNTk1LmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M1OTUuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzU5NS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M1OTUuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nM2M1OTUuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtM2M1OTUubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS0zYzU5NS5vIGB0ZXN0IC1mICczYzU5NS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2AzYzU5NS5jCisKK2xpYmRyaXZlcnNfYS0zYzU5NS5vYmo6IDNjNTk1LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLTNjNTk1Lm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzU5NS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS0zYzU5NS5vYmogYGlmIHRlc3QgLWYgJzNjNTk1LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnM2M1OTUuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvM2M1OTUuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzU5NS5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLTNjNTk1LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzU5NS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSczYzU5NS5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS0zYzU5NS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtM2M1OTUub2JqIGBpZiB0ZXN0IC1mICczYzU5NS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJzNjNTk1LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpLzNjNTk1LmMnOyBmaWAKKworbGliZHJpdmVyc19hLTNjOTB4Lm86IDNjOTB4LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLTNjOTB4Lm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M5MHguVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtM2M5MHgubyBgdGVzdCAtZiAnM2M5MHguYycgfHwgZWNobyAnJChzcmNkaXIpLydgM2M5MHguYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzkweC5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLTNjOTB4LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS0zYzkweC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSczYzkweC5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS0zYzkweC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLTNjOTB4Lm8gYHRlc3QgLWYgJzNjOTB4LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYDNjOTB4LmMKKworbGliZHJpdmVyc19hLTNjOTB4Lm9iajogM2M5MHguYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtM2M5MHgub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLTNjOTB4LlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLTNjOTB4Lm9iaiBgaWYgdGVzdCAtZiAnM2M5MHguYyc7IHRoZW4gJChDWUdQQVRIX1cpICczYzkweC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS8zYzkweC5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLTNjOTB4LlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtM2M5MHguUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLTNjOTB4LlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JzNjOTB4LmMnIG9iamVjdD0nbGliZHJpdmVyc19hLTNjOTB4Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS0zYzkweC5vYmogYGlmIHRlc3QgLWYgJzNjOTB4LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnM2M5MHguYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvM2M5MHguYyc7IGZpYAorCitsaWJkcml2ZXJzX2EtY3M4OXgwLm86IGNzODl4MC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1jczg5eDAubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1jczg5eDAuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtY3M4OXgwLm8gYHRlc3QgLWYgJ2NzODl4MC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjczg5eDAuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1jczg5eDAuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1jczg5eDAuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWNzODl4MC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjczg5eDAuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtY3M4OXgwLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtY3M4OXgwLm8gYHRlc3QgLWYgJ2NzODl4MC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjczg5eDAuYworCitsaWJkcml2ZXJzX2EtY3M4OXgwLm9iajogY3M4OXgwLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLWNzODl4MC5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtY3M4OXgwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLWNzODl4MC5vYmogYGlmIHRlc3QgLWYgJ2NzODl4MC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NzODl4MC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jczg5eDAuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1jczg5eDAuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1jczg5eDAuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWNzODl4MC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjczg5eDAuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtY3M4OXgwLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1jczg5eDAub2JqIGBpZiB0ZXN0IC1mICdjczg5eDAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjczg5eDAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY3M4OXgwLmMnOyBmaWAKKworbGliZHJpdmVyc19hLWRhdmljb20ubzogZGF2aWNvbS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1kYXZpY29tLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZGF2aWNvbS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1kYXZpY29tLm8gYHRlc3QgLWYgJ2Rhdmljb20uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGF2aWNvbS5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWRhdmljb20uVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1kYXZpY29tLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1kYXZpY29tLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Rhdmljb20uYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtZGF2aWNvbS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWRhdmljb20ubyBgdGVzdCAtZiAnZGF2aWNvbS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkYXZpY29tLmMKKworbGliZHJpdmVyc19hLWRhdmljb20ub2JqOiBkYXZpY29tLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLWRhdmljb20ub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLWRhdmljb20uVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtZGF2aWNvbS5vYmogYGlmIHRlc3QgLWYgJ2Rhdmljb20uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkYXZpY29tLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Rhdmljb20uYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1kYXZpY29tLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZGF2aWNvbS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZGF2aWNvbS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkYXZpY29tLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWRhdmljb20ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWRhdmljb20ub2JqIGBpZiB0ZXN0IC1mICdkYXZpY29tLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGF2aWNvbS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kYXZpY29tLmMnOyBmaWAKKworbGliZHJpdmVyc19hLWRlcGNhLm86IGRlcGNhLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLWRlcGNhLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZGVwY2EuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtZGVwY2EubyBgdGVzdCAtZiAnZGVwY2EuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGVwY2EuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1kZXBjYS5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLWRlcGNhLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1kZXBjYS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkZXBjYS5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1kZXBjYS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWRlcGNhLm8gYHRlc3QgLWYgJ2RlcGNhLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRlcGNhLmMKKworbGliZHJpdmVyc19hLWRlcGNhLm9iajogZGVwY2EuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtZGVwY2Eub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLWRlcGNhLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLWRlcGNhLm9iaiBgaWYgdGVzdCAtZiAnZGVwY2EuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkZXBjYS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kZXBjYS5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWRlcGNhLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZGVwY2EuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWRlcGNhLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2RlcGNhLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWRlcGNhLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1kZXBjYS5vYmogYGlmIHRlc3QgLWYgJ2RlcGNhLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGVwY2EuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZGVwY2EuYyc7IGZpYAorCitsaWJkcml2ZXJzX2EtZWVwcm8ubzogZWVwcm8uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtZWVwcm8ubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lZXByby5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1lZXByby5vIGB0ZXN0IC1mICdlZXByby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BlZXByby5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWVlcHJvLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWVlcHJvLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2VlcHJvLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWVlcHJvLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtZWVwcm8ubyBgdGVzdCAtZiAnZWVwcm8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZWVwcm8uYworCitsaWJkcml2ZXJzX2EtZWVwcm8ub2JqOiBlZXByby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1lZXByby5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8uVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtZWVwcm8ub2JqIGBpZiB0ZXN0IC1mICdlZXByby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2VlcHJvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2VlcHJvLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8uVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lZXByby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZWVwcm8uYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtZWVwcm8ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWVlcHJvLm9iaiBgaWYgdGVzdCAtZiAnZWVwcm8uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdlZXByby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9lZXByby5jJzsgZmlgCisKK2xpYmRyaXZlcnNfYS1lZXBybzEwMC5vOiBlZXBybzEwMC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1lZXBybzEwMC5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLWVlcHJvMTAwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLWVlcHJvMTAwLm8gYHRlc3QgLWYgJ2VlcHJvMTAwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGVlcHJvMTAwLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8xMDAuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lZXBybzEwMC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZWVwcm8xMDAuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZWVwcm8xMDAuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtZWVwcm8xMDAubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1lZXBybzEwMC5vIGB0ZXN0IC1mICdlZXBybzEwMC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BlZXBybzEwMC5jCisKK2xpYmRyaXZlcnNfYS1lZXBybzEwMC5vYmo6IGVlcHJvMTAwLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLWVlcHJvMTAwLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lZXBybzEwMC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1lZXBybzEwMC5vYmogYGlmIHRlc3QgLWYgJ2VlcHJvMTAwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZWVwcm8xMDAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZWVwcm8xMDAuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lZXBybzEwMC5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLWVlcHJvMTAwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lZXBybzEwMC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdlZXBybzEwMC5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1lZXBybzEwMC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtZWVwcm8xMDAub2JqIGBpZiB0ZXN0IC1mICdlZXBybzEwMC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2VlcHJvMTAwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2VlcHJvMTAwLmMnOyBmaWAKKworbGliZHJpdmVyc19hLWVwaWMxMDAubzogZXBpYzEwMC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1lcGljMTAwLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZXBpYzEwMC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1lcGljMTAwLm8gYHRlc3QgLWYgJ2VwaWMxMDAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZXBpYzEwMC5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWVwaWMxMDAuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lcGljMTAwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lcGljMTAwLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2VwaWMxMDAuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtZXBpYzEwMC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWVwaWMxMDAubyBgdGVzdCAtZiAnZXBpYzEwMC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BlcGljMTAwLmMKKworbGliZHJpdmVyc19hLWVwaWMxMDAub2JqOiBlcGljMTAwLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLWVwaWMxMDAub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLWVwaWMxMDAuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtZXBpYzEwMC5vYmogYGlmIHRlc3QgLWYgJ2VwaWMxMDAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdlcGljMTAwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2VwaWMxMDAuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1lcGljMTAwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZXBpYzEwMC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZXBpYzEwMC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdlcGljMTAwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWVwaWMxMDAub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWVwaWMxMDAub2JqIGBpZiB0ZXN0IC1mICdlcGljMTAwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZXBpYzEwMC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9lcGljMTAwLmMnOyBmaWAKKworbGliZHJpdmVyc19hLWZhMzExLm86IGZhMzExLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLWZhMzExLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZmEzMTEuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtZmEzMTEubyBgdGVzdCAtZiAnZmEzMTEuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZmEzMTEuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1mYTMxMS5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLWZhMzExLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1mYTMxMS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmYTMxMS5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1mYTMxMS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWZhMzExLm8gYHRlc3QgLWYgJ2ZhMzExLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZhMzExLmMKKworbGliZHJpdmVyc19hLWZhMzExLm9iajogZmEzMTEuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtZmEzMTEub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLWZhMzExLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLWZhMzExLm9iaiBgaWYgdGVzdCAtZiAnZmEzMTEuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmYTMxMS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mYTMxMS5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWZhMzExLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtZmEzMTEuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWZhMzExLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZhMzExLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWZhMzExLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1mYTMxMS5vYmogYGlmIHRlc3QgLWYgJ2ZhMzExLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZmEzMTEuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZmEzMTEuYyc7IGZpYAorCitsaWJkcml2ZXJzX2EtaTgyNTg2Lm86IGk4MjU4Ni5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1pODI1ODYubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1pODI1ODYuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtaTgyNTg2Lm8gYHRlc3QgLWYgJ2k4MjU4Ni5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BpODI1ODYuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1pODI1ODYuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1pODI1ODYuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWk4MjU4Ni5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdpODI1ODYuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtaTgyNTg2Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtaTgyNTg2Lm8gYHRlc3QgLWYgJ2k4MjU4Ni5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BpODI1ODYuYworCitsaWJkcml2ZXJzX2EtaTgyNTg2Lm9iajogaTgyNTg2LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLWk4MjU4Ni5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtaTgyNTg2LlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLWk4MjU4Ni5vYmogYGlmIHRlc3QgLWYgJ2k4MjU4Ni5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2k4MjU4Ni5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9pODI1ODYuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1pODI1ODYuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1pODI1ODYuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWk4MjU4Ni5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdpODI1ODYuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtaTgyNTg2Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1pODI1ODYub2JqIGBpZiB0ZXN0IC1mICdpODI1ODYuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdpODI1ODYuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvaTgyNTg2LmMnOyBmaWAKKworbGliZHJpdmVyc19hLWxhbmNlLm86IGxhbmNlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLWxhbmNlLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbGFuY2UuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtbGFuY2UubyBgdGVzdCAtZiAnbGFuY2UuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbGFuY2UuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1sYW5jZS5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLWxhbmNlLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1sYW5jZS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdsYW5jZS5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1sYW5jZS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLWxhbmNlLm8gYHRlc3QgLWYgJ2xhbmNlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGxhbmNlLmMKKworbGliZHJpdmVyc19hLWxhbmNlLm9iajogbGFuY2UuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtbGFuY2Uub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLWxhbmNlLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLWxhbmNlLm9iaiBgaWYgdGVzdCAtZiAnbGFuY2UuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdsYW5jZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9sYW5jZS5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWxhbmNlLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbGFuY2UuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLWxhbmNlLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2xhbmNlLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLWxhbmNlLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1sYW5jZS5vYmogYGlmIHRlc3QgLWYgJ2xhbmNlLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbGFuY2UuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbGFuY2UuYyc7IGZpYAorCitsaWJkcml2ZXJzX2EtbmF0c2VtaS5vOiBuYXRzZW1pLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLW5hdHNlbWkubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uYXRzZW1pLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLW5hdHNlbWkubyBgdGVzdCAtZiAnbmF0c2VtaS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BuYXRzZW1pLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbmF0c2VtaS5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLW5hdHNlbWkuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW5hdHNlbWkuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nbmF0c2VtaS5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1uYXRzZW1pLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtbmF0c2VtaS5vIGB0ZXN0IC1mICduYXRzZW1pLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG5hdHNlbWkuYworCitsaWJkcml2ZXJzX2EtbmF0c2VtaS5vYmo6IG5hdHNlbWkuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtbmF0c2VtaS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbmF0c2VtaS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1uYXRzZW1pLm9iaiBgaWYgdGVzdCAtZiAnbmF0c2VtaS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ25hdHNlbWkuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbmF0c2VtaS5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW5hdHNlbWkuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uYXRzZW1pLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uYXRzZW1pLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J25hdHNlbWkuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtbmF0c2VtaS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtbmF0c2VtaS5vYmogYGlmIHRlc3QgLWYgJ25hdHNlbWkuYyc7IHRoZW4gJChDWUdQQVRIX1cpICduYXRzZW1pLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL25hdHNlbWkuYyc7IGZpYAorCitsaWJkcml2ZXJzX2Etbmk1MDEwLm86IG5pNTAxMC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1uaTUwMTAubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uaTUwMTAuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2Etbmk1MDEwLm8gYHRlc3QgLWYgJ25pNTAxMC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BuaTUwMTAuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uaTUwMTAuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uaTUwMTAuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW5pNTAxMC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSduaTUwMTAuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2Etbmk1MDEwLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2Etbmk1MDEwLm8gYHRlc3QgLWYgJ25pNTAxMC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BuaTUwMTAuYworCitsaWJkcml2ZXJzX2Etbmk1MDEwLm9iajogbmk1MDEwLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLW5pNTAxMC5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etbmk1MDEwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLW5pNTAxMC5vYmogYGlmIHRlc3QgLWYgJ25pNTAxMC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ25pNTAxMC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9uaTUwMTAuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uaTUwMTAuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uaTUwMTAuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW5pNTAxMC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSduaTUwMTAuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2Etbmk1MDEwLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1uaTUwMTAub2JqIGBpZiB0ZXN0IC1mICduaTUwMTAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICduaTUwMTAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvbmk1MDEwLmMnOyBmaWAKKworbGliZHJpdmVyc19hLW5zODM5MC5vOiBuczgzOTAuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtbnM4MzkwLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzkwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLW5zODM5MC5vIGB0ZXN0IC1mICduczgzOTAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbnM4MzkwLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzkwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzkwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uczgzOTAuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nbnM4MzkwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLW5zODM5MC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLW5zODM5MC5vIGB0ZXN0IC1mICduczgzOTAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbnM4MzkwLmMKKworbGliZHJpdmVyc19hLW5zODM5MC5vYmo6IG5zODM5MC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1uczgzOTAub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLW5zODM5MC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1uczgzOTAub2JqIGBpZiB0ZXN0IC1mICduczgzOTAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICduczgzOTAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbnM4MzkwLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzkwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtbnM4MzkwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1uczgzOTAuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nbnM4MzkwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLW5zODM5MC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtbnM4MzkwLm9iaiBgaWYgdGVzdCAtZiAnbnM4MzkwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbnM4MzkwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL25zODM5MC5jJzsgZmlgCisKK2xpYmRyaXZlcnNfYS1vdHVsaXAubzogb3R1bGlwLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLW90dWxpcC5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLW90dWxpcC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1vdHVsaXAubyBgdGVzdCAtZiAnb3R1bGlwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG90dWxpcC5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW90dWxpcC5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLW90dWxpcC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etb3R1bGlwLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J290dWxpcC5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1vdHVsaXAubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1vdHVsaXAubyBgdGVzdCAtZiAnb3R1bGlwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG90dWxpcC5jCisKK2xpYmRyaXZlcnNfYS1vdHVsaXAub2JqOiBvdHVsaXAuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2Etb3R1bGlwLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1vdHVsaXAuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2Etb3R1bGlwLm9iaiBgaWYgdGVzdCAtZiAnb3R1bGlwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnb3R1bGlwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL290dWxpcC5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLW90dWxpcC5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLW90dWxpcC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etb3R1bGlwLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J290dWxpcC5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1vdHVsaXAub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLW90dWxpcC5vYmogYGlmIHRlc3QgLWYgJ290dWxpcC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ290dWxpcC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9vdHVsaXAuYyc7IGZpYAorCitsaWJkcml2ZXJzX2EtcnRsODEzOS5vOiBydGw4MTM5LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXJ0bDgxMzkubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1ydGw4MTM5LlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXJ0bDgxMzkubyBgdGVzdCAtZiAncnRsODEzOS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BydGw4MTM5LmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcnRsODEzOS5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLXJ0bDgxMzkuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXJ0bDgxMzkuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncnRsODEzOS5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1ydGw4MTM5Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtcnRsODEzOS5vIGB0ZXN0IC1mICdydGw4MTM5LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHJ0bDgxMzkuYworCitsaWJkcml2ZXJzX2EtcnRsODEzOS5vYmo6IHJ0bDgxMzkuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtcnRsODEzOS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtcnRsODEzOS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1ydGw4MTM5Lm9iaiBgaWYgdGVzdCAtZiAncnRsODEzOS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3J0bDgxMzkuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvcnRsODEzOS5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXJ0bDgxMzkuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1ydGw4MTM5LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1ydGw4MTM5LlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3J0bDgxMzkuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtcnRsODEzOS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtcnRsODEzOS5vYmogYGlmIHRlc3QgLWYgJ3J0bDgxMzkuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdydGw4MTM5LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3J0bDgxMzkuYyc7IGZpYAorCitsaWJkcml2ZXJzX2Etc2lzOTAwLm86IHNpczkwMC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1zaXM5MDAubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1zaXM5MDAuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2Etc2lzOTAwLm8gYHRlc3QgLWYgJ3NpczkwMC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzaXM5MDAuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1zaXM5MDAuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1zaXM5MDAuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXNpczkwMC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzaXM5MDAuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2Etc2lzOTAwLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2Etc2lzOTAwLm8gYHRlc3QgLWYgJ3NpczkwMC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzaXM5MDAuYworCitsaWJkcml2ZXJzX2Etc2lzOTAwLm9iajogc2lzOTAwLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXNpczkwMC5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc2lzOTAwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXNpczkwMC5vYmogYGlmIHRlc3QgLWYgJ3NpczkwMC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NpczkwMC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zaXM5MDAuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1zaXM5MDAuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1zaXM5MDAuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXNpczkwMC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzaXM5MDAuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2Etc2lzOTAwLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1zaXM5MDAub2JqIGBpZiB0ZXN0IC1mICdzaXM5MDAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzaXM5MDAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc2lzOTAwLmMnOyBmaWAKKworbGliZHJpdmVyc19hLXNrX2cxNi5vOiBza19nMTYuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2Etc2tfZzE2Lm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc2tfZzE2LlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXNrX2cxNi5vIGB0ZXN0IC1mICdza19nMTYuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc2tfZzE2LmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc2tfZzE2LlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc2tfZzE2LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1za19nMTYuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc2tfZzE2LmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXNrX2cxNi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXNrX2cxNi5vIGB0ZXN0IC1mICdza19nMTYuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc2tfZzE2LmMKKworbGliZHJpdmVyc19hLXNrX2cxNi5vYmo6IHNrX2cxNi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1za19nMTYub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXNrX2cxNi5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS1za19nMTYub2JqIGBpZiB0ZXN0IC1mICdza19nMTYuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdza19nMTYuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc2tfZzE2LmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc2tfZzE2LlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc2tfZzE2LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1za19nMTYuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc2tfZzE2LmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXNrX2cxNi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2Etc2tfZzE2Lm9iaiBgaWYgdGVzdCAtZiAnc2tfZzE2LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc2tfZzE2LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NrX2cxNi5jJzsgZmlgCisKK2xpYmRyaXZlcnNfYS1zbWM5MDAwLm86IHNtYzkwMDAuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2Etc21jOTAwMC5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXNtYzkwMDAuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2Etc21jOTAwMC5vIGB0ZXN0IC1mICdzbWM5MDAwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNtYzkwMDAuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1zbWM5MDAwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc21jOTAwMC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc21jOTAwMC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzbWM5MDAwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXNtYzkwMDAubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1zbWM5MDAwLm8gYHRlc3QgLWYgJ3NtYzkwMDAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc21jOTAwMC5jCisKK2xpYmRyaXZlcnNfYS1zbWM5MDAwLm9iajogc21jOTAwMC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS1zbWM5MDAwLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS1zbWM5MDAwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXNtYzkwMDAub2JqIGBpZiB0ZXN0IC1mICdzbWM5MDAwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc21jOTAwMC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zbWM5MDAwLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etc21jOTAwMC5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLXNtYzkwMDAuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXNtYzkwMDAuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc21jOTAwMC5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS1zbWM5MDAwLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS1zbWM5MDAwLm9iaiBgaWYgdGVzdCAtZiAnc21jOTAwMC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NtYzkwMDAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc21jOTAwMC5jJzsgZmlgCisKK2xpYmRyaXZlcnNfYS10aWFyYS5vOiB0aWFyYS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS10aWFyYS5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXRpYXJhLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXRpYXJhLm8gYHRlc3QgLWYgJ3RpYXJhLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHRpYXJhLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGlhcmEuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10aWFyYS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGlhcmEuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndGlhcmEuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtdGlhcmEubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS10aWFyYS5vIGB0ZXN0IC1mICd0aWFyYS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0aWFyYS5jCisKK2xpYmRyaXZlcnNfYS10aWFyYS5vYmo6IHRpYXJhLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXRpYXJhLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10aWFyYS5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS10aWFyYS5vYmogYGlmIHRlc3QgLWYgJ3RpYXJhLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndGlhcmEuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdGlhcmEuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10aWFyYS5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLXRpYXJhLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10aWFyYS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0aWFyYS5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS10aWFyYS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtdGlhcmEub2JqIGBpZiB0ZXN0IC1mICd0aWFyYS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3RpYXJhLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3RpYXJhLmMnOyBmaWAKKworbGliZHJpdmVyc19hLXRsYW4ubzogdGxhbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS10bGFuLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGxhbi5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS10bGFuLm8gYHRlc3QgLWYgJ3RsYW4uYycgfHwgZWNobyAnJChzcmNkaXIpLydgdGxhbi5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXRsYW4uVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10bGFuLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10bGFuLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3RsYW4uYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtdGxhbi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXRsYW4ubyBgdGVzdCAtZiAndGxhbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0bGFuLmMKKworbGliZHJpdmVyc19hLXRsYW4ub2JqOiB0bGFuLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXRsYW4ub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXRsYW4uVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtdGxhbi5vYmogYGlmIHRlc3QgLWYgJ3RsYW4uYyc7IHRoZW4gJChDWUdQQVRIX1cpICd0bGFuLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3RsYW4uYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10bGFuLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGxhbi5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdGxhbi5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0bGFuLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXRsYW4ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXRsYW4ub2JqIGBpZiB0ZXN0IC1mICd0bGFuLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndGxhbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90bGFuLmMnOyBmaWAKKworbGliZHJpdmVyc19hLXR1bGlwLm86IHR1bGlwLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXR1bGlwLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdHVsaXAuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtdHVsaXAubyBgdGVzdCAtZiAndHVsaXAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdHVsaXAuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10dWxpcC5UcG8iICIkKERFUERJUikvbGliZHJpdmVyc19hLXR1bGlwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS10dWxpcC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0dWxpcC5jJyBvYmplY3Q9J2xpYmRyaXZlcnNfYS10dWxpcC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXR1bGlwLm8gYHRlc3QgLWYgJ3R1bGlwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHR1bGlwLmMKKworbGliZHJpdmVyc19hLXR1bGlwLm9iajogdHVsaXAuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJkcml2ZXJzX2EtdHVsaXAub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXR1bGlwLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXR1bGlwLm9iaiBgaWYgdGVzdCAtZiAndHVsaXAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd0dWxpcC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90dWxpcC5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXR1bGlwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdHVsaXAuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXR1bGlwLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3R1bGlwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXR1bGlwLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS10dWxpcC5vYmogYGlmIHRlc3QgLWYgJ3R1bGlwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndHVsaXAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdHVsaXAuYyc7IGZpYAorCitsaWJkcml2ZXJzX2EtdmlhLXJoaW5lLm86IHZpYS1yaGluZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS12aWEtcmhpbmUubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS12aWEtcmhpbmUuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2EtdmlhLXJoaW5lLm8gYHRlc3QgLWYgJ3ZpYS1yaGluZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B2aWEtcmhpbmUuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS12aWEtcmhpbmUuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS12aWEtcmhpbmUuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXZpYS1yaGluZS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd2aWEtcmhpbmUuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtdmlhLXJoaW5lLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJkcml2ZXJzX2EtdmlhLXJoaW5lLm8gYHRlc3QgLWYgJ3ZpYS1yaGluZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B2aWEtcmhpbmUuYworCitsaWJkcml2ZXJzX2EtdmlhLXJoaW5lLm9iajogdmlhLXJoaW5lLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXZpYS1yaGluZS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2EtdmlhLXJoaW5lLlRwbyIgLWMgLW8gbGliZHJpdmVyc19hLXZpYS1yaGluZS5vYmogYGlmIHRlc3QgLWYgJ3ZpYS1yaGluZS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3ZpYS1yaGluZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS92aWEtcmhpbmUuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS12aWEtcmhpbmUuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS12aWEtcmhpbmUuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXZpYS1yaGluZS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd2aWEtcmhpbmUuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2EtdmlhLXJoaW5lLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZHJpdmVyc19hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmRyaXZlcnNfYS12aWEtcmhpbmUub2JqIGBpZiB0ZXN0IC1mICd2aWEtcmhpbmUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd2aWEtcmhpbmUuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdmlhLXJoaW5lLmMnOyBmaWAKKworbGliZHJpdmVyc19hLXc4OWM4NDAubzogdzg5Yzg0MC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmRyaXZlcnNfYS13ODljODQwLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etdzg5Yzg0MC5UcG8iIC1jIC1vIGxpYmRyaXZlcnNfYS13ODljODQwLm8gYHRlc3QgLWYgJ3c4OWM4NDAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdzg5Yzg0MC5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZHJpdmVyc19hLXc4OWM4NDAuVHBvIiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS13ODljODQwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS13ODljODQwLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3c4OWM4NDAuYycgb2JqZWN0PSdsaWJkcml2ZXJzX2Etdzg5Yzg0MC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXc4OWM4NDAubyBgdGVzdCAtZiAndzg5Yzg0MC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B3ODljODQwLmMKKworbGliZHJpdmVyc19hLXc4OWM4NDAub2JqOiB3ODljODQwLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmRyaXZlcnNfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZHJpdmVyc19hLXc4OWM4NDAub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZHJpdmVyc19hLXc4OWM4NDAuVHBvIiAtYyAtbyBsaWJkcml2ZXJzX2Etdzg5Yzg0MC5vYmogYGlmIHRlc3QgLWYgJ3c4OWM4NDAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd3ODljODQwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3c4OWM4NDAuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmRyaXZlcnNfYS13ODljODQwLlRwbyIgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etdzg5Yzg0MC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJkcml2ZXJzX2Etdzg5Yzg0MC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd3ODljODQwLmMnIG9iamVjdD0nbGliZHJpdmVyc19hLXc4OWM4NDAub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJkcml2ZXJzX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZHJpdmVyc19hLXc4OWM4NDAub2JqIGBpZiB0ZXN0IC1mICd3ODljODQwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndzg5Yzg0MC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS93ODljODQwLmMnOyBmaWAKK3VuaW5zdGFsbC1pbmZvLWFtOgorCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiBUQUdTCisKK1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgJCR0YWdzICQkdW5pcXVlOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIiBcCisJICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCisJICAgICAkJHRhZ3MgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmIGNkICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAkJGhlcmUKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IGZvciBmaWxlIGluICQkbGlzdDsgZG8gXAorCSAgY2FzZSAkJGZpbGUgaW4gXAorCSAgICAkKHNyY2RpcikvKikgZmlsZT1gZWNobyAiJCRmaWxlIiB8IHNlZCAic3xeJCRzcmNkaXJzdHJpcC98fCJgOzsgXAorCSAgICAkKHRvcF9zcmNkaXIpLyopIGZpbGU9YGVjaG8gIiQkZmlsZSIgfCBzZWQgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98ImA7OyBcCisJICBlc2FjOyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBkaXI9YGVjaG8gIiQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICBpZiB0ZXN0ICIkJGRpciIgIT0gIiQkZmlsZSIgJiYgdGVzdCAiJCRkaXIiICE9ICIuIjsgdGhlbiBcCisJICAgIGRpcj0iLyQkZGlyIjsgXAorCSAgICAkKG1rZGlyX3ApICIkKGRpc3RkaXIpJCRkaXIiOyBcCisJICBlbHNlIFwKKwkgICAgZGlyPScnOyBcCisJICBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLXBSICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoTElCUkFSSUVTKQoraW5zdGFsbGRpcnM6CitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorY2xlYW46IGNsZWFuLWFtCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLW5vaW5zdExJQlJBUklFUyBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCisJLXJtIC1yZiAuLyQoREVQRElSKQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYworCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtaW5mby1hbQorCisuUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBcCisJY2xlYW4tbm9pbnN0TElCUkFSSUVTIGN0YWdzIGRpc3RjbGVhbiBkaXN0Y2xlYW4tY29tcGlsZSBcCisJZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgXAorCWh0bWwtYW0gaW5mbyBpbmZvLWFtIGluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgXAorCWluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaW5mbyBcCisJaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIGluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIFwKKwlpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgbWFpbnRhaW5lci1jbGVhbiBcCisJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWNvbXBpbGUgXAorCW1vc3RseWNsZWFuLWdlbmVyaWMgcGRmIHBkZi1hbSBwcyBwcy1hbSB0YWdzIHVuaW5zdGFsbCBcCisJdW5pbnN0YWxsLWFtIHVuaW5zdGFsbC1pbmZvLWFtCisKKworIyBJcyBpdCByZWFsbHkgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgZGVwZW5kZWNpZXMgZXhwbGljaXRseT8KKyQoM2M1MDlfZHJpdmVycyk6IDNjNTA5LmMgM2M1MDkuaAorJCgzYzUwOV9kcml2ZXJzKTogJS5vOiAzYzUwOS5jCisJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKworJCgzYzU5NV9kcml2ZXJzKTogM2M1OTUuYyAzYzU5NS5oCiskKDNjNTk1X2RyaXZlcnMpOiAlLm86IDNjNTk1LmMKKwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCiskKDNjOTB4X2RyaXZlcnMpOiAzYzkweC5jCiskKDNjOTB4X2RyaXZlcnMpOiAlLm86IDNjOTB4LmMKKwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCiskKGNzODl4MF9kcml2ZXJzKTogY3M4OXgwLmMgY3M4OXgwLmgKKyQoY3M4OXgwX2RyaXZlcnMpOiAlLm86IGNzODl4MC5jCisJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKworJChkYXZpY29tX2RyaXZlcnMpOiBkYXZpY29tLmMKKyQoZGF2aWNvbV9kcml2ZXJzKTogJS5vOiBkYXZpY29tLmMKKwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCiskKGRlcGNhX2RyaXZlcnMpOiBkZXBjYS5jCiskKGRlcGNhX2RyaXZlcnMpOiAlLm86IGRlcGNhLmMKKwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCiskKGVlcHJvX2RyaXZlcnMpOiBlZXByby5jCiskKGVlcHJvX2RyaXZlcnMpOiAlLm86IGVlcHJvLmMKKwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCiskKGVlcHJvMTAwX2RyaXZlcnMpOiBlZXBybzEwMC5jCiskKGVlcHJvMTAwX2RyaXZlcnMpOiAlLm86IGVlcHJvMTAwLmMKKwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCiskKGVwaWMxMDBfZHJpdmVycyk6IGVwaWMxMDAuYyBlcGljMTAwLmgKKyQoZXBpYzEwMF9kcml2ZXJzKTogJS5vOiBlcGljMTAwLmMKKwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCisjJChmYTMxMV9kcml2ZXJzKTogZmEzMTEuYworIyQoZmEzMTFfZHJpdmVycyk6ICUubzogZmEzMTEuYworIwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisjCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKworJChpODI1ODZfZHJpdmVycyk6IGk4MjU4Ni5jCiskKGk4MjU4Nl9kcml2ZXJzKTogJS5vOiBpODI1ODYuYworCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyQobGFuY2VfZHJpdmVycyk6IGxhbmNlLmMKKyQobGFuY2VfZHJpdmVycyk6ICUubzogbGFuY2UuYworCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyQobmF0c2VtaV9kcml2ZXJzKTogbmF0c2VtaS5jCiskKG5hdHNlbWlfZHJpdmVycyk6ICUubzogbmF0c2VtaS5jCisJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKworJChuaTUwMTBfZHJpdmVycyk6IG5pNTAxMC5jCiskKG5pNTAxMF9kcml2ZXJzKTogJS5vOiBuaTUwMTAuYworCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyQobnM4MzkwX2RyaXZlcnMpOiBuczgzOTAuYyBuczgzOTAuaAorJChuczgzOTBfZHJpdmVycyk6ICUubzogbnM4MzkwLmMKKwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCiskKG90dWxpcF9kcml2ZXJzKTogb3R1bGlwLmMgb3R1bGlwLmgKKyQob3R1bGlwX2RyaXZlcnMpOiAlLm86IG90dWxpcC5jCisJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKworJChydGw4MTM5X2RyaXZlcnMpOiBydGw4MTM5LmMKKyQocnRsODEzOV9kcml2ZXJzKTogJS5vOiBydGw4MTM5LmMKKwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCiskKHNpczkwMF9kcml2ZXJzKTogc2lzOTAwLmMKKyQoc2lzOTAwX2RyaXZlcnMpOiAlLm86IHNpczkwMC5jIHNpczkwMC5oCisJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorCSAgJChORVRfRVhUUkFGTEFHUykgJCgkKGJhc2VuYW1lICRAKV9vX0NGTEFHUykgLW8gJEAgLWMgJDwKKworJChza19nMTZfZHJpdmVycyk6IHNrX2cxNi5jIHNrX2cxNi5oCiskKHNrX2cxNl9kcml2ZXJzKTogJS5vOiBza19nMTYuYworCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyQoc21jOTAwMF9kcml2ZXJzKTogc21jOTAwMC5jIHNtYzkwMDAuaAorJChzbWM5MDAwX2RyaXZlcnMpOiAlLm86IHNtYzkwMDAuYworCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyQodGlhcmFfZHJpdmVycyk6IHRpYXJhLmMKKyQodGlhcmFfZHJpdmVycyk6ICUubzogdGlhcmEuYworCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyMkKHRsYW5fZHJpdmVycyk6IHRsYW4uYworIyQodGxhbl9kcml2ZXJzKTogJS5vOiB0bGFuLmMKKyMJJChDT01QSUxFKSAkKFNUQUdFMl9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMgXAorIwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyQodHVsaXBfZHJpdmVycyk6IHR1bGlwLmMKKyQodHVsaXBfZHJpdmVycyk6ICUubzogdHVsaXAuYworCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisKKyQodmlhX3JoaW5lX2RyaXZlcnMpOiB2aWEtcmhpbmUuYworJCh2aWFfcmhpbmVfZHJpdmVycyk6ICUubzogdmlhLXJoaW5lLmMKKwkkKENPTVBJTEUpICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisJICAkKE5FVF9FWFRSQUZMQUdTKSAkKCQoYmFzZW5hbWUgJEApX29fQ0ZMQUdTKSAtbyAkQCAtYyAkPAorCiskKHc4OWM4NDBfZHJpdmVycyk6IHc4OWM4NDAuYworJCh3ODljODQwX2RyaXZlcnMpOiAlLm86IHc4OWM4NDAuYworCSQoQ09NUElMRSkgJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKwkgICQoTkVUX0VYVFJBRkxBR1MpICQoJChiYXNlbmFtZSAkQClfb19DRkxBR1MpIC1vICRAIC1jICQ8CisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9uZXRib290L1JFQURNRS5uZXRib290IGIvbmV0Ym9vdC9SRUFETUUubmV0Ym9vdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWRmYWYwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9SRUFETUUubmV0Ym9vdApAQCAtMCwwICsxLDE2OCBAQAorWW91IGNhbiB1c2UgdGhlIG5ldGJvb3Qgc3VwcG9ydCB0byBkb3dubG9hZCBPUyBpbWFnZXMgZnJvbSBhIG5ldHdvcmsuCitOZWFybHkgYWxsIHRoZSBkZXZpY2UgZHJpdmVycyBhcmUgY29taW5nIGZyb20gdGhlIG5ldHdvcmstYmFzZWQgYm9vdAorbG9hZGVyLCBFdGhlcmJvb3QuIFBsZWFzZSB2aXNpdCBpdHMgd2ViIHBhZ2UuIFRoZXkgaGF2ZSByaWNoCitkb2N1bWVudGF0aW9ucyBzbyB5b3Ugd2lsbCBiZSBhYmxlIHRvIGdldCB1c2VmdWwgaW5mb3JtYXRpb24gZnJvbSB0aGVyZS4KK1RoZSBVUkwgaXMgPGh0dHA6Ly9ldGhlcmJvb3Quc291cmNlZm9yZ2UubmV0Lz4uCisKK1RoZXNlIGJlbG93IGFyZSBjb21tb24gb3B0aW9ucyBmb3IgY29uZmlndXJlLiBQZXJoYXBzIHlvdSBtYXkgbm90IG5lZWQKK3RvIHNwZWNpZnkgdGhlbS4KKworLS1kaXNhYmxlLXBhY2tldC1yZXRyYW5zbWlzc2lvbgorICBUdXJucyBvZmYgcGFja2V0IHJldHJhbnNtaXNzaW9uLiBVc2UgaXQgb24gYW4gZW1wdHkgbmV0d29yaywgd2hlcmUKKyAgbm8gcGFja2V0IGNvbGxpc2lvbiBjYW4gaGFwcGVuLgorCistLWVuYWJsZS1wY2ktZGlyZWN0CisgIERlZmluZSB0aGlzIGZvciBQQ0kgQklPU2VzIHRoYXQgZG8gbm90IGltcGxlbWVudCBCSU9TMzIgb3Igbm90CisgIGNvcnJlY3RseS4KKworLS1lbmFibGUtZGlza2xlc3MKKyAgRW5hYmxlIHRoZSBkaXNrbGVzcyBzdXBwb3J0LiBJZiBzcGVjaWZpZWQsIHlvdSB3aWxsIGdldCB0d28gb3B0aW9uYWwKKyAgaW1hZ2VzLCBjYWxsZWQgIm5iZ3J1YiIgYW5kICJweGVncnViIi4gVGhlIGZvcm1lciBpcyB0aGUgYGBOZXQgQm9vdAorICBJbWFnZSBQcm9wb3NhbCcnIGZvcm1hdCwgd2hpY2ggaXMgdXNlZCBieSBFdGhlcmJvb3QgYW5kIE5ldGJvb3QsIHdoaWxlCisgIHRoZSBsYXR0ZXIgaXMgdGhlIGBgUHJlYm9vdCBFeGVjdXRpb24gRW52aXJvbm1lbnQiIGZvcm1hdCwgd2hpY2ggaXMKKyAgdXNlZCBieSBhIFBYRSBST00uIFlvdSBtYXkgYnV5IGEgUFhFIFJPTSBmcm9tIHNvbWUgY29tcGFuaWVzLgorCitIZXJlIGlzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV2aWNlIGRyaXZlcnMuIFRoZXkgYXJlIGFsbCBkaXNhYmxlZAorYnkgZGVmYXVsdCwgc28geW91IG11c3Qgc3BlY2lmeSBjb25maWd1cmUgb3B0aW9ucyB0byBlbmFibGUgZHJpdmVycyB5b3UKK3dhbnQgdG8gdXNlLiBTb21lIGRyaXZlcnMgaGF2ZSBleHRyYSBwZXItZHJpdmVyIG9wdGlvbnMsIHNvIHRoZSBleHRyYQorb3B0aW9ucyBhcmUgYWxzbyBkZXNjcmliZWQgYmVsb3cuCisKK0NhdXRpb246IFlvdSBzaG91bGQgZW5hYmxlIHRoZW0gYXMgeW91IG5lZWQuIERvbid0IGVuYWJsZSBhbnkKK3VubmVjZXNzYXJ5IGRyaXZlciwgYmVjYXVzZSBHUlVCIG1pZ2h0IGNyYXNoIGlmIHlvdSBpbmNsdWRlIHRvbyBtYW55Citkcml2ZXJzIGF0IHRoZSBzYW1lIHRpbWUuCisKKzNDb201MDksIElTQS9FSVNBCisgIC0tZW5hYmxlLTNjNTA5CisKKzNDb201MjkgPT0gTUNBIDNjNTA5CisgIC0tZW5hYmxlLTNjNTI5CisKKzNDb201OXggYW5kIDNDb205MDAKKyAgLS1lbmFibGUtM2M1OTUKKworM0NvbTkweAorICAtLWVuYWJsZS0zYzkweAorCitDcnlzdGFsIFNlbWljb25kdWN0b3IgQ1M4OXgwCisgIC0tZW5hYmxlLWNzODl4MAorICAtLWVuYWJsZS1jcy1zY2FuPUxJU1QKKyAgICBQcm9iZSBmb3IgQ1M4OXgwIGJhc2UgYWRkcmVzcyB1c2luZyBMSVNUIG9mIGNvbW1hIHNlcGFyYXRlZCBoZXgKKyAgICBhZGRyZXNzZXM7IGluY3JlYXNpbmcgdGhlIGFkZHJlc3MgYnkgb25lICgweDMwMCAtPiAweDMwMSkgd2lsbCBmb3JjZQorICAgIGEgbW9yZSBhZ2dyZXNzaXZlIHByb2JpbmcgYWxnb3JpdGhtLiBUaGlzIG1pZ2h0IGJlIG5lY2Nlc3NhcnkgYWZ0ZXIKKyAgICBhIHNvZnQtcmVzZXQgb2YgdGhlIE5JQy4KKworRGF2aWNvbSBETTkxMDIgYW5kIDkwMDkKKyAgLS1lbmFibGUtZGF2aWNvbQorCitEaWdpdGFsIERFMTAwIGFuZCBERTIwMAorICAtLWVuYWJsZS1kZXBjYQorCitJbnRlbCBFdGhlcmV4cHJlc3MgUHJvLzEwIChJU0EgY2FyZCkKKyAgLS1lbmFibGUtZWVwcm8KKworSW50ZWwgRXRoZXJleHByZXNzIFByby8xMDAKKyAgLS1lbmFibGUtZWVwcm8xMDAKKworU01DIDgzYzE3MCBFUElDLzEwMAorICAtLWVuYWJsZS1lcGljMTAwCisKKzNDb201MDcKKyAgLS1lbmFibGUtM2M1MDcKKworRVhPUzIwNQorICAtLWVuYWJsZS1leG9zMjA1CisKK1JhY2FsLUludGVybGFuIE5JNTIxMAorICAtLWVuYWJsZS1uaTUyMTAKKworTGFuY2UgUENJIFBDTmV0LzMyCitBTUQgSG9tZVBOQQorICAtLWVuYWJsZS1sYW5jZQorCitOb3ZlbGwgTkUyMTAwIGFuZCBORTE1MDAKKyAgLS1lbmFibGUtbmUyMTAwCisKK1JhY2FsLUludGVybGFuIE5JNjUxMAorICAtLWVuYWJsZS1uaTY1MTAKKworTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBEUDgzODF4IChOZXRnZWFyIEZBMzExIGFuZCBGQTMxMikKKyAgLS1lbmFibGUtbmF0c2VtaQorCitSYWNhbC1JbnRlcmxhbiBOSTUwMTAKKyAgLS1lbmFibGUtbmk1MDEwCisKKzNDb201MDMsIGFrYSBFdGhlcmxpbmsgSUksIGFsc28gLzE2IG1vZGVsCisgIC0tZW5hYmxlLTNjNTAzCisgIC0tZW5hYmxlLTNjNTAzLXNobWVtCisgICAgVXNlIDNjNTAzIHNoYXJlZCBtZW1vcnkgbW9kZS4KKyAgLS1lbmFibGUtM2M1MDMtYXVpCisgICAgVXNlIEFVSSBieSBkZWZhdWx0IG9uIDNjNTAzIGNhcmRzLgorCitORTEwMDAvMjAwMCBhbmQgY2xvbmVzIChJU0EpCisgIC0tZW5hYmxlLW5lCisgIC0tZW5hYmxlLW5lLXNjYW49TElTVCAoMHgyODAsMHgzMDAsMHgzMjAsMHgzNDApCisgICAgUHJvYmUgZm9yIE5FIGJhc2UgYWRkcmVzcyB1c2luZyBMSVNUIG9mIGNvbW1hIHNlcGFyYXRlZCBoZXgKKyAgICBhZGRyZXNzZXMuCisKK05FMjAwMCBQQ0kgY2xvbmUgKFJUTDgwMjkpCitXaW5ib25kIDg2Qzk0MAorQ29tcGV4IFJMMjAwMAorS1RJIEVUMzJQMgorTmV0VmluIDUwMDBTQworSG9sdGVrIDgwMjMyCisgIC0tZW5hYmxlLW5zODM5MAorICAtLWVuYWJsZS1jb21wZXgtcmwyMDAwLWZpeAorICAgIElmIHlvdSBoYXZlIGEgQ29tcGV4IFJMMjAwMCBQQ0kgMzItYml0ICgxMUY2OjE0MDEpLCBhbmQgdGhlIHByb2JlCisgICAgaGFuZ3MgaW4gIlByb2JpbmcuLi5bTkUqMDAwL1BDSV0iLCB0cnkgZW5hYmxpbmcgdGhpcyBmaXguLi4gaXQKKyAgICB3b3JrZWQgZm9yIG1lIDopLgorCitXRDgwMDMvODAxMywgU01DODIxNi84NDE2CisgIC0tZW5hYmxlLXdkCisgIC0tZW5hYmxlLXdkLWRlZmF1bHQtbWVtPU1FTSAoMHhDQzAwMCkKKyAgICBEZWZhdWx0IG1lbW9yeSBsb2NhdGlvbiBmb3IgV0QvU01DIGNhcmRzLgorCitPbGQgYmFzZSBkcml2ZXIgZm9yIFR1bGlwIGNsb25lcworICAtLWVuYWJsZS1vdHVsaXAKKworUmVhbHRlayA4MTM5CitTTUMgMTIxMQorRC1MaW5rIERGRTUzMFRYKyBhbmQgREZFNTM4VFgKKyAgLS1lbmFibGUtcnRsODEzOQorCitTSVMgOTAwIGFuZCBTSVMgNzAxNgorICAtLWVuYWJsZS1zaXM5MDAKKworU2NobmVpZGVyIGFuZCBLb2NoIEcxNgorICAtLWVuYWJsZS1zay1nMTYKKworU01DOTAwMAorICAtLWVuYWJsZS1zbWM5MDAwCisgIC0tZW5hYmxlLXNtYzkwMDAtc2Nhbj1MSVNUCisgICAgTGlzdCBvZiBJL08gYWRkcmVzc2VzIHRvIHByb2JlLgorCitUaWFyYSwgRnVqaXRzdSBMYW5jYXJkCisgIC0tZW5hYmxlLXRpYXJhCisKK0xpbmtzeXMgTE5FMTAwVFggYW5kIG90aGVyIE5JQ3MgdXNpbmcgdGhpcyBUdWxpcCBjbG9uZSBjaGlwCitOZXRnZWFyIEZBMzEwVFggYW5kIG90aGVyIE5JQ3MgdXNpbmcgdGhpcyBUdWxpcCBjbG9uZSBjaGlwCitUdWxpcCBjbG9uZXMgYmFzZWQgb24gdGhlIEFETXRlayBDZW50YXVyLVAKK1R1bGlwIGNsb25lcyBiYXNlZCBvbiB0aGUgTWFjcm9uaXggOTg3eDUKK1R1bGlwLUZhc3QKK1R1bGlwKworVHVsaXAgMjExNDIKK0FTSVggQVg4ODE0MAorSW50ZWwgVHVsaXAKK0NvbXBleCBSTDEwMC1UWAorICAtLWVuYWJsZS10dWxpcAorCitSaGluZS1JLCBlLmcuIEQtTGluayBERkUtNTMwVFgKK1JoaW5lLUlJCisgIC0tZW5hYmxlLXZpYS1yaGluZQorCitXaW5ib25kIFc4OWM4NDAKK0NvbXBleCBSTDEwMC1BVFgKKyAgLS1lbmFibGUtdzg5Yzg0MAorCisKK1RoZSBkZXNjcmlwdGlvbiBhYm91dCBob3cgdG8gdXNlIHRoZSBzdXBwb3J0IGNhbiBiZSBmb3VuZCBpbiB0aGUgR1JVQgorbWFudWFsLiBSdW4gImluZm8gZ3J1YiIgaW4gdGhlIHNoZWxsIHByb21wdC4KZGlmZiAtLWdpdCBhL25ldGJvb3QvY2FyZHMuaCBiL25ldGJvb3QvY2FyZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjM3MDUwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9jYXJkcy5oCkBAIC0wLDAgKzEsMTgzIEBACisjaWZuZGVmCUNBUkRTX0gKKyNkZWZpbmUgQ0FSRFNfSAorCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSAibmljLmgiCisKKy8qIE9LLCB0aGlzIGlzIGhvdyB0aGUgUENJIHN1cHBvcnQgaGFjayB3b3JrczogIGlmIHBjaS5oIGlzIGluY2x1ZGVkIGJlZm9yZQorICogdGhpcyBmaWxlIGlzIGluY2x1ZGVkLCBhc3N1bWUgdGhhdCB0aGUgZHJpdmVyIHN1cHBvcnRzIFBDSS4gIFRoaXMgbWVhbnMgdGhhdAorICogdGhpcyBmaWxlIGlzIHVzdWFsbHkgaW5jbHVkZWQgbGFzdC4gICovCisKKyNpZmRlZglQQ0lfSAorI2RlZmluZSBQQ0lfQVJHKHgpICx4CisjZWxzZQorI2RlZmluZSBQQ0lfQVJHKHgpCisjZW5kaWYKKworI2lmZGVmCUlOQ0xVREVfV0QKK2V4dGVybiBzdHJ1Y3QgbmljCSp3ZF9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKKwlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKKyNlbmRpZgorCisjaWZkZWYJSU5DTFVERV8zQzUwMworZXh0ZXJuIHN0cnVjdCBuaWMJKnQ1MDNfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCisJUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7CisjZW5kaWYKKworI2lmZGVmCUlOQ0xVREVfVklBX1JISU5FCitleHRlcm4gc3RydWN0IG5pYwkqcmhpbmVfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCisJUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7CisjZW5kaWYKKworI2lmZGVmCUlOQ0xVREVfTkUKK2V4dGVybiBzdHJ1Y3QgbmljCSpuZV9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKKwlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKKyNlbmRpZgorCisjaWZkZWYJSU5DTFVERV9OUzgzOTAKK2V4dGVybiBzdHJ1Y3QgbmljCSpuZXBjaV9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKKwlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKKyNlbmRpZgorCisjaWZkZWYJSU5DTFVERV8zQzUwOQorZXh0ZXJuIHN0cnVjdCBuaWMJKnQ1MDlfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCisJUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7CisjZW5kaWYKKworI2lmZGVmCUlOQ0xVREVfM0M1MjkKK2V4dGVybiBzdHJ1Y3QgbmljCSp0NTI5X3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgorCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOworI2VuZGlmCisKKyNpZmRlZglJTkNMVURFXzNDNTk1CitleHRlcm4gc3RydWN0IG5pYwkqdDU5NV9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKKwlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKKyNlbmRpZgorCisjaWZkZWYJSU5DTFVERV8zQzkwWAorZXh0ZXJuIHN0cnVjdCBuaWMJKmEzYzkweF9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKKwlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKKyNlbmRpZgorCisjaWZkZWYJSU5DTFVERV9FRVBSTworZXh0ZXJuIHN0cnVjdCBuaWMJKmVlcHJvX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgorCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOworI2VuZGlmCisKKyNpZmRlZglJTkNMVURFX0VFUFJPMTAwCitleHRlcm4gc3RydWN0IG5pYwkqZWVwcm8xMDBfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCisJUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7CisjZW5kaWYKKworI2lmZGVmCUlOQ0xVREVfRVBJQzEwMAorZXh0ZXJuIHN0cnVjdCBuaWMJKmVwaWMxMDBfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCisJUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7CisjZW5kaWYKKworI2lmZGVmCUlOQ0xVREVfT1RVTElQCitleHRlcm4gc3RydWN0IG5pYwkqb3R1bGlwX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgorCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOworI2VuZGlmCisKKyNpZmRlZglJTkNMVURFX1RVTElQCitleHRlcm4gc3RydWN0IG5pYwkqdHVsaXBfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCisJUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7CisjZW5kaWYKKworI2lmZGVmCUlOQ0xVREVfREFWSUNPTQorZXh0ZXJuIHN0cnVjdCBuaWMJKmRhdmljb21fcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCisJUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7CisjZW5kaWYKKworI2lmZGVmCUlOQ0xVREVfQ1M4OVgwCitleHRlcm4gc3RydWN0IG5pYwkqY3M4OXgwX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgorCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOworI2VuZGlmCisKKyNpZmRlZglJTkNMVURFX0xBTkNFCitleHRlcm4gc3RydWN0IG5pYwkqbGFuY2VwY2lfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCisJUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7CisjZW5kaWYKKworI2lmZGVmCUlOQ0xVREVfTkUyMTAwCitleHRlcm4gc3RydWN0IG5pYwkqbmUyMTAwX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgorCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOworI2VuZGlmCisKKyNpZmRlZglJTkNMVURFX05JNjUxMAorZXh0ZXJuIHN0cnVjdCBuaWMJKm5pNjUxMF9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKKwlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKKyNlbmRpZgorCisjaWZkZWYJSU5DTFVERV9TS19HMTYKK2V4dGVybiBzdHJ1Y3QgbmljCSpTS19wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKKwlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKKyNlbmRpZgorCisjaWZkZWYJSU5DTFVERV8zQzUwNworZXh0ZXJuIHN0cnVjdCBuaWMJKnQ1MDdfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCisJUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7CisjZW5kaWYKKworI2lmZGVmCUlOQ0xVREVfTkk1MDEwCitleHRlcm4gc3RydWN0IG5pYwkqbmk1MDEwX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgorCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOworI2VuZGlmCisKKyNpZmRlZglJTkNMVURFX05JNTIxMAorZXh0ZXJuIHN0cnVjdCBuaWMJKm5pNTIxMF9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKKwlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKKyNlbmRpZgorCisjaWZkZWYJSU5DTFVERV9FWE9TMjA1CitleHRlcm4gc3RydWN0IG5pYwkqZXhvczIwNV9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKKwlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKKyNlbmRpZgorCisjaWZkZWYJSU5DTFVERV9TTUM5MDAwCitleHRlcm4gc3RydWN0IG5pYwkqc21jOTAwMF9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKKwlQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKKyNlbmRpZgorCisjaWZkZWYJSU5DTFVERV9USUFSQQorZXh0ZXJuIHN0cnVjdCBuaWMJKnRpYXJhX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgorCVBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOworI2VuZGlmCisKKyNpZmRlZglJTkNMVURFX0RFUENBCitleHRlcm4gc3RydWN0IG5pYwkqZGVwY2FfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCisJUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7CisjZW5kaWYKKworI2lmZGVmCUlOQ0xVREVfUlRMODEzOQorZXh0ZXJuIHN0cnVjdCBuaWMJKnJ0bDgxMzlfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCisJUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7CisjZW5kaWYKKworI2lmZGVmCUlOQ0xVREVfVzg5Qzg0MAorZXh0ZXJuIHN0cnVjdCBuaWMJKnc4OWM4NDBfcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCisJUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7CisjZW5kaWYKKworI2lmZGVmCUlOQ0xVREVfU0lTOTAwCitleHRlcm4gc3RydWN0IG5pYwkqc2lzOTAwX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgorICAgICAgICBQQ0lfQVJHKHN0cnVjdCBwY2lfZGV2aWNlICopKTsKKyNlbmRpZgorCisjaWZkZWYJSU5DTFVERV9OQVRTRU1JCitleHRlcm4gc3RydWN0IG5pYwkqbmF0c2VtaV9wcm9iZShzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICoKKyAgICAgICAgUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7CisjZW5kaWYKKworI2lmZGVmCUlOQ0xVREVfVExBTgorZXh0ZXJuIHN0cnVjdCBuaWMJKnRsYW5fcHJvYmUoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqCisgICAgICAgIFBDSV9BUkcoc3RydWN0IHBjaV9kZXZpY2UgKikpOworI2VuZGlmCisKKyNlbmRpZgkvKiBDQVJEU19IICovCmRpZmYgLS1naXQgYS9uZXRib290L2NvbmZpZy5jIGIvbmV0Ym9vdC9jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTQ5YTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9jb25maWcuYwpAQCAtMCwwICsxLDU5OCBAQAorLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLDIwMDIgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyogQmFzZWQgb24gInNyYy9jb25maWcuYyIgaW4gZXRoZXJib290LTUuMC41LiAgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2RlZmluZSBHUlVCCTEKKyNpbmNsdWRlIDxldGhlcmJvb3QuaD4KKyNpbmNsdWRlIDxuaWMuaD4KKworI3VuZGVmCUlOQ0xVREVfUENJCisjaWYJZGVmaW5lZChJTkNMVURFX05TODM5MCkgfHwgZGVmaW5lZChJTkNMVURFX0VFUFJPMTAwKSB8fCBkZWZpbmVkKElOQ0xVREVfTEFOQ0UpIHx8IGRlZmluZWQoSU5DTFVERV9FUElDMTAwKSB8fCBkZWZpbmVkKElOQ0xVREVfVFVMSVApIHx8IGRlZmluZWQoSU5DTFVERV9PVFVMSVApIHx8IGRlZmluZWQoSU5DTFVERV8zQzkwWCkgfHwgIGRlZmluZWQoSU5DTFVERV8zQzU5NSkgfHwgZGVmaW5lZChJTkNMVURFX1JUTDgxMzkpIHx8IGRlZmluZWQoSU5DTFVERV9WSUFfUkhJTkUpIHx8IGRlZmluZWQoSU5DTFVERV9XODlDODQwKSB8fCBkZWZpbmVkKElOQ0xVREVfREFWSUNPTSkgfHwgZGVmaW5lZChJTkNMVURFX1NJUzkwMCkgfHwgZGVmaW5lZChJTkNMVURFX05BVFNFTUkpIHx8IGRlZmluZWQoSU5DTFVERV9UTEFOKQorCS8qIHx8IG90aGVycyBsYXRlciAqLworIyBkZWZpbmUgSU5DTFVERV9QQ0kKKyMgaW5jbHVkZSA8cGNpLmg+CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcGNpX2lvYWRkcnNbMTZdOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2UgcGNpX25pY19saXN0W10gPQoreworI2lmZGVmCUlOQ0xVREVfTlM4MzkwCisgIHsgUENJX1ZFTkRPUl9JRF9SRUFMVEVLLAlQQ0lfREVWSUNFX0lEX1JFQUxURUtfODAyOSwKKyAgICAiUmVhbHRlayA4MDI5IiwgMCwgMCwgMCwgMH0sCisgIHsgUENJX1ZFTkRPUl9JRF9XSU5CT05EMiwJUENJX0RFVklDRV9JRF9XSU5CT05EMl84OUM5NDAsCisgICAgIldpbmJvbmQgTkUyMDAwLVBDSSIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfQ09NUEVYLAlQQ0lfREVWSUNFX0lEX0NPTVBFWF9STDIwMDAsCisgICAgIkNvbXBleCBSZWFkeUxpbmsgMjAwMCIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfS1RJLAkJUENJX0RFVklDRV9JRF9LVElfRVQzMlAyLAorICAgICJLVEkgRVQzMlAyIiwgMCwgMCwgMCwgMH0sCisgIHsgUENJX1ZFTkRPUl9JRF9ORVRWSU4sCVBDSV9ERVZJQ0VfSURfTkVUVklOX05WNTAwMFNDLAorICAgICJOZXRWaW4gTlY1MDAwU0MiLCAwLCAwLCAwLCAwfSwKKyAgeyBQQ0lfVkVORE9SX0lEX0hPTFRFSywJUENJX0RFVklDRV9JRF9IT0xURUtfSFQ4MDIzMiwKKyAgICAiSG9sdGVrIEhUODAyMzIiLCAwLCAwLCAwLCAwfSwKKyNlbmRpZgorI2lmZGVmCUlOQ0xVREVfM0M5MFgKKyAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQlQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDBUUE8sCisgICAgIjNDb205MDAtVFBPIiwgMCwgMCwgMCwgMH0sCisgIHsgUENJX1ZFTkRPUl9JRF8zQ09NLAkJUENJX0RFVklDRV9JRF8zQ09NXzNDOTAwQ09NQk8sCisgICAgIjNDb205MDAtQ29tYm8iLCAwLCAwLCAwLCAwfSwKKyAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQlQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDVUWCwKKyAgICAiM0NvbTkwNS1UWCIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCVBDSV9ERVZJQ0VfSURfM0NPTV8zQzkwNVQ0LAorICAgICIzQ29tOTA1LVQ0IiwgMCwgMCwgMCwgMH0sCisgIHsgUENJX1ZFTkRPUl9JRF8zQ09NLAkJMHg5MDA0LAorICAgICIzQ29tOTAwQi1UUE8iLCAwLCAwLCAwLCAwfSwKKyAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQkweDkwMDUsCisgICAgIjNDb205MDBCLUNvbWJvIiwgMCwgMCwgMCwgMH0sCisgIHsgUENJX1ZFTkRPUl9JRF8zQ09NLAkJMHg5MDA2LAorICAgICIzQ29tOTAwQi0yL1QiLCAwLCAwLCAwLCAwfSwKKyAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQkweDkwMEEsCisgICAgIjNDb205MDBCLUZMIiwgMCwgMCwgMCwgMH0sCisgIHsgUENJX1ZFTkRPUl9JRF8zQ09NLAkJUENJX0RFVklDRV9JRF8zQ09NXzNDOTA1Ql9UWCwKKyAgICAiM0NvbTkwNUItVFgiLCAwLCAwLCAwLCAwfSwKKyAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQkweDkwNTYsCisgICAgIjNDb205MDVCLVQ0IiwgMCwgMCwgMCwgMH0sCisgIHsgUENJX1ZFTkRPUl9JRF8zQ09NLAkJMHg5MDVBLAorICAgICIzQ29tOTA1Qi1GTCIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCVBDSV9ERVZJQ0VfSURfM0NPTV8zQzkwNUNfVFhNLAorICAgICIzQ29tOTA1Qy1UWE0iLCAwLCAwLCAwLCAwfSwKKyAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQkweDk4MDAsCisgICAgIjNDb205ODAtQ3ljbG9uZSIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCTB4OTgwNSwKKyAgICAiM0NvbTk4MDUiLCAwLCAwLCAwLCAwfSwKKyAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQkweDc2NDYsCisgICAgIjNDU09ITzEwMC1UWCIsIDAsIDAsIDAsIDB9LAorI2VuZGlmCisjaWZkZWYJSU5DTFVERV8zQzU5NQorICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCVBDSV9ERVZJQ0VfSURfM0NPTV8zQzU5MCwKKyAgICAiM0NvbTU5MCIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCVBDSV9ERVZJQ0VfSURfM0NPTV8zQzU5NSwKKyAgICAiM0NvbTU5NSIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCVBDSV9ERVZJQ0VfSURfM0NPTV8zQzU5NV8xLAorICAgICIzQ29tNTk1IiwgMCwgMCwgMCwgMH0sCisgIHsgUENJX1ZFTkRPUl9JRF8zQ09NLAkJUENJX0RFVklDRV9JRF8zQ09NXzNDNTk1XzIsCisgICAgIjNDb201OTUiLCAwLCAwLCAwLCAwfSwKKyAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQlQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDBUUE8sCisgICAgIjNDb205MDAtVFBPIiwgMCwgMCwgMCwgMH0sCisgIHsgUENJX1ZFTkRPUl9JRF8zQ09NLAkJUENJX0RFVklDRV9JRF8zQ09NXzNDOTAwQ09NQk8sCisgICAgIjNDb205MDAtQ29tYm8iLCAwLCAwLCAwLCAwfSwKKyAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQkweDkwMDQsCisgICAgIjNDb205MDBCLVRQTyIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCTB4OTAwNSwKKyAgICAiM0NvbTkwMEItQ29tYm8iLCAwLCAwLCAwLCAwfSwKKyAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQkweDkwMDYsCisgICAgIjNDb205MDBCLTIvVCIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCTB4OTAwQSwKKyAgICAiM0NvbTkwMEItRkwiLCAwLCAwLCAwLCAwfSwKKyAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQkweDk4MDAsCisgICAgIjNDb205ODAtQ3ljbG9uZSIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfM0NPTSwJCTB4OTgwNSwKKyAgICAiM0NvbTk4MDUiLCAwLCAwLCAwLCAwfSwKKyAgeyBQQ0lfVkVORE9SX0lEXzNDT00sCQkweDc2NDYsCisgICAgIjNDU09ITzEwMC1UWCIsIDAsIDAsIDAsIDB9LAorI2VuZGlmCisjaWZkZWYJSU5DTFVERV9FRVBSTzEwMAorICB7IFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfODI1NTcsCisgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMCIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfODI1NTlFUiwKKyAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwIDgyNTU5RVIiLCAwLCAwLCAwLCAwfSwKKyAgeyBQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lEMTAyOSwKKyAgICAiSW50ZWwgRXRoZXJFeHByZXNzUHJvMTAwIElEMTAyOSIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUQxMDMwLAorICAgICJJbnRlbCBDb3Jwb3JhdGlvbiA4MjU1OSBJbkJ1c2luZXNzIDEwLzEwMCIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfODI1NjIsCisgICAgIkludGVsIEV0aGVyRXhwcmVzc1BybzEwMCA4MjU2MkVNIiwgMCwgMCwgMCwgMH0sCisjZW5kaWYKKyNpZmRlZglJTkNMVURFX0VQSUMxMDAKKyAgeyBQQ0lfVkVORE9SX0lEX1NNQywJCVBDSV9ERVZJQ0VfSURfU01DX0VQSUMxMDAsCisgICAgIlNNQyBFdGhlclBvd2VySUkiLCAwLCAwLCAwLCAwfSwKKyNlbmRpZgorI2lmZGVmCUlOQ0xVREVfTEFOQ0UKKyAgeyBQQ0lfVkVORE9SX0lEX0FNRCwJCVBDSV9ERVZJQ0VfSURfQU1EX0xBTkNFLAorICAgICJBTUQgTGFuY2UvUENJIiwgMCwgMCwgMCwgMH0sCisgIHsgUENJX1ZFTkRPUl9JRF9BTURfSE9NRVBOQSwJUENJX0RFVklDRV9JRF9BTURfSE9NRVBOQSwKKyAgICAiQU1EIExhbmNlL0hvbWVQTkEiLCAwLCAwLCAwLCAwfSwKKyNlbmRpZgorI2lmZGVmCUlOQ0xVREVfUlRMODEzOQorICB7IFBDSV9WRU5ET1JfSURfUkVBTFRFSywJUENJX0RFVklDRV9JRF9SRUFMVEVLXzgxMzksCisgICAgIlJlYWx0ZWsgODEzOSIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfRExJTkssCVBDSV9ERVZJQ0VfSURfREZFNTMwVFhQLAorICAgICJERkU1MzBUWCsvREZFNTM4VFgiLCAwLCAwLCAwLCAwfSwKKyAgeyBQQ0lfVkVORE9SX0lEX1NNQ18xMjExLAlQQ0lfREVWSUNFX0lEX1NNQ18xMjExLAorICAgICJTTUMgRVoxMC8xMDAiLCAwLCAwLCAwLCAwfSwKKyNlbmRpZgorI2lmZGVmCUlOQ0xVREVfT1RVTElQCisgIHsgUENJX1ZFTkRPUl9JRF9ERUMsCQlQQ0lfREVWSUNFX0lEX0RFQ19UVUxJUCwKKyAgICAiRGlnaXRhbCBUdWxpcCIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfREVDLAkJUENJX0RFVklDRV9JRF9ERUNfVFVMSVBfRkFTVCwKKyAgICAiRGlnaXRhbCBUdWxpcCBGYXN0IiwgMCwgMCwgMCwgMH0sCisgIHsgUENJX1ZFTkRPUl9JRF9ERUMsCQlQQ0lfREVWSUNFX0lEX0RFQ19UVUxJUF9QTFVTLAorICAgICJEaWdpdGFsIFR1bGlwKyIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfREVDLAkJUENJX0RFVklDRV9JRF9ERUNfMjExNDIsCisgICAgIkRpZ2l0YWwgVHVsaXAgMjExNDIiLCAwLCAwLCAwLCAwfSwKKyNlbmRpZgorI2lmZGVmCUlOQ0xVREVfVFVMSVAKKyAgeyBQQ0lfVkVORE9SX0lEX0RFQywJCVBDSV9ERVZJQ0VfSURfREVDX1RVTElQLAorICAgICJEaWdpdGFsIFR1bGlwIiwgMCwgMCwgMCwgMH0sCisgIHsgUENJX1ZFTkRPUl9JRF9ERUMsCQlQQ0lfREVWSUNFX0lEX0RFQ19UVUxJUF9GQVNULAorICAgICJEaWdpdGFsIFR1bGlwIEZhc3QiLCAwLCAwLCAwLCAwfSwKKyAgeyBQQ0lfVkVORE9SX0lEX0RFQywJCVBDSV9ERVZJQ0VfSURfREVDX1RVTElQX1BMVVMsCisgICAgIkRpZ2l0YWwgVHVsaXArIiwgMCwgMCwgMCwgMH0sCisgIHsgUENJX1ZFTkRPUl9JRF9ERUMsCQlQQ0lfREVWSUNFX0lEX0RFQ18yMTE0MiwKKyAgICAiRGlnaXRhbCBUdWxpcCAyMTE0MiIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfTUFDUk9OSVgsCVBDSV9ERVZJQ0VfSURfTVg5ODd4NSwKKyAgICAiTWFjcm9uaXggTVg5ODd4NSIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfTElOS1NZUywJUENJX0RFVklDRV9JRF9MQzgyQzExNSwKKyAgICAiTGlua1N5cyBMTkUxMDBUWCIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfTElOS1NZUywJUENJX0RFVklDRV9JRF9ERUNfVFVMSVAsCisgICAgIk5ldGdlYXIgRkEzMTBUWCIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfREFWSUNPTSwJUENJX0RFVklDRV9JRF9ETTkxMDIsCisgICAgIkRhdmljb20gOTEwMiIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfREFWSUNPTSwJUENJX0RFVklDRV9JRF9ETTkwMDksCisgICAgIkRhdmljb20gOTAwOSIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfQURNVEVLLAlQQ0lfREVWSUNFX0lEX0FETVRFS18wOTg1LAorICAgICJBRE10ZWsgQ2VudGF1ci1QIiwgMCwgMCwgMCwgMH0sCisgIHsgUENJX1ZFTkRPUl9JRF9BRE1URUssCTB4MDk4MSwKKyAgICAiQURNdGVrIEFOOTgxIENvbWV0IiwgMCwgMCwgMCwgMH0sCisgIHsgMHgxMjVCLAkJCTB4MTQwMCwKKyAgICAiQVNJWCBBWDg4MTQwIiwgMCwgMCwgMCwgMCB9LAorICB7IDB4MTFGNiwJCQkweDk4ODEsCisgICAgIkNvbXBleCBSTDEwMC1UWCIsIDAsIDAsIDAsIDAgfSwKKyNlbmRpZgorI2lmZGVmCUlOQ0xVREVfREFWSUNPTQorICB7IFBDSV9WRU5ET1JfSURfREFWSUNPTSwJUENJX0RFVklDRV9JRF9ETTkxMDIsCisgICAgIkRhdmljb20gOTEwMiIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfREFWSUNPTSwJUENJX0RFVklDRV9JRF9ETTkwMDksCisgICAgIkRhdmljb20gOTAwOSIsIDAsIDAsIDAsIDB9LAorI2VuZGlmCisjaWZkZWYJSU5DTFVERV9WSUFfUkhJTkUKKyAgeyBQQ0lfVkVORE9SX0lEX1ZJQVRFQywJUENJX0RFVklDRV9JRF9WSUFfVlQ2MTAyLAorICAgICJWSUEgNjEwMiIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfVklBVEVDLAlQQ0lfREVWSUNFX0lEX1ZJQV9SSElORV9JLAorICAgICJWSUEgMzA0MyIsIDAsIDAsIDAsIDB9LAorICB7IFBDSV9WRU5ET1JfSURfVklBVEVDLAlQQ0lfREVWSUNFX0lEX1ZJQV84NkMxMDBBLAorICAgICJWSUEgODZDMTAwQSIsIDAsIDAsIDAsIDB9LAorI2VuZGlmCisjaWZkZWYJSU5DTFVERV9XODlDODQwCisgIHsgUENJX1ZFTkRPUl9JRF9XSU5CT05EMiwJUENJX0RFVklDRV9JRF9XSU5CT05EMl84OUM4NDAsCisgICAgIldpbmJvbmQgVzg5Qzg0MEYiLCAwLCAwLCAwLCAwfSwKKyAgeyBQQ0lfVkVORE9SX0lEX0NPTVBFWCwJUENJX0RFVklDRV9JRF9DT01QRVhfUkwxMDBBVFgsCisgICAgIkNvbXBleCBSTDEwMEFUWCIsIDAsIDAsIDAsIDB9LAorI2VuZGlmCisjaWZkZWYgSU5DTFVERV9TSVM5MDAKKyAgeyBQQ0lfVkVORE9SX0lEX1NJUywgICAgIAlQQ0lfREVWSUNFX0lEX1NJUzkwMCwKKyAgICAiU0lTOTAwIiwgMCwgMCwgMCwgMH0sCisgIHsgUENJX1ZFTkRPUl9JRF9TSVMsICAgICAJUENJX0RFVklDRV9JRF9TSVM3MDE2LAorICAgICJTSVM3MDE2IiwgMCwgMCwgMCwgMH0sCisjZW5kaWYKKyAgCisjaWZkZWYgSU5DTFVERV9OQVRTRU1JCisgIHsgUENJX1ZFTkRPUl9JRF9OUywJICAgICAJUENJX0RFVklDRV9JRF9EUDgzODE1LAorICAgICJEUDgzODE1IiwgMCwgMCwgMCwgMH0sCisjZW5kaWYKKyAgCisjaWZkZWYgSU5DTFVERV9UTEFOCisgIHsgUENJX1ZFTkRPUl9JRF9PTElDT00sCVBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjMyNiwKKyAgICAiT0MyMzI2IiwgMCwgMCwgMCwgMH0sCisjZW5kaWYKKworICAvKiBvdGhlciBQQ0kgTklDcyBnbyBoZXJlICovCisgIHswLCAwLCBOVUxMLCAwLCAwLCAwLCAwfQorfTsKKyNlbmRpZgkvKiBJTkNMVURFXypQQ0kgKi8KKworI2luY2x1ZGUgPGNhcmRzLmg+CisKKyNpZmRlZiBJTkNMVURFX1BDSQorc3RydWN0IHBjaV9kaXNwYXRjaF90YWJsZQoreworICB1bnNpZ25lZCBzaG9ydCB2ZW5kb3I7CisgIHVuc2lnbmVkIHNob3J0IGRldl9pZDsKKyAgc3RydWN0IG5pYyAqKCpldGhfcHJvYmUpIChzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICosCisJCQkgICAgc3RydWN0IHBjaV9kZXZpY2UgKik7Cit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kaXNwYXRjaF90YWJsZSBQQ0lfTklDW10gPQoreworIyBpZmRlZiBJTkNMVURFX05TODM5MAorICB7IFBDSV9WRU5ET1JfSURfUkVBTFRFSywgIFBDSV9ERVZJQ0VfSURfUkVBTFRFS184MDI5LCAgICBuZXBjaV9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfV0lOQk9ORDIsIFBDSV9ERVZJQ0VfSURfV0lOQk9ORDJfODlDOTQwLCBuZXBjaV9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfQ09NUEVYLCAgIFBDSV9ERVZJQ0VfSURfQ09NUEVYX1JMMjAwMCwgICBuZXBjaV9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfS1RJLCAgICAgIFBDSV9ERVZJQ0VfSURfS1RJX0VUMzJQMiwgICAgICBuZXBjaV9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfTkVUVklOLCAgIFBDSV9ERVZJQ0VfSURfTkVUVklOX05WNTAwMFNDLCBuZXBjaV9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfSE9MVEVLLCAgIFBDSV9ERVZJQ0VfSURfSE9MVEVLX0hUODAyMzIsICBuZXBjaV9wcm9iZSB9LAorIyBlbmRpZiAvKiBJTkNMVURFX05TODM5MCAqLworIyBpZmRlZiBJTkNMVURFXzNDOTBYCisgIHsgUENJX1ZFTkRPUl9JRF8zQ09NLAkgICAgUENJX0RFVklDRV9JRF8zQ09NXzNDOTAwVFBPLCAgIGEzYzkweF9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzkwMENPTUJPLCBhM2M5MHhfcHJvYmUgfSwKKyAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICBQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDVUWCwgICAgYTNjOTB4X3Byb2JlIH0sCisgIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgUENJX0RFVklDRV9JRF8zQ09NXzNDOTA1VDQsICAgIGEzYzkweF9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIDB4OTAwNCwgICAgICAgICAgICAgICAgICAgICAgICBhM2M5MHhfcHJvYmUgfSwKKyAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICAweDkwMDUsICAgICAgICAgICAgICAgICAgICAgICAgYTNjOTB4X3Byb2JlIH0sCisgIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgMHg5MDA2LCAgICAgICAgICAgICAgICAgICAgICAgIGEzYzkweF9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIDB4OTAwQSwgICAgICAgICAgICAgICAgICAgICAgICBhM2M5MHhfcHJvYmUgfSwKKyAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICBQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDVCX1RYLCAgYTNjOTB4X3Byb2JlIH0sCisgIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgMHg5MDU2LCAgICAgICAgICAgICAgICAgICAgICAgIGEzYzkweF9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIDB4OTA1QSwgICAgICAgICAgICAgICAgICAgICAgICBhM2M5MHhfcHJvYmUgfSwKKyAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICBQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDVDX1RYTSwgYTNjOTB4X3Byb2JlIH0sCisgIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgMHg5ODAwLCAgICAgICAgICAgICAgICAgICAgICAgIGEzYzkweF9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIDB4OTgwNSwgICAgICAgICAgICAgICAgICAgICAgICBhM2M5MHhfcHJvYmUgfSwKKyAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICAweDc2NDYsICAgICAgICAgICAgICAgICAgICAgICAgYTNjOTB4X3Byb2JlIH0sCisjIGVuZGlmIC8qIElOQ0xVREVfM0M5MFggKi8KKyMgaWZkZWYJSU5DTFVERV8zQzU5NQorICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzU5MCwgICAgICB0NTk1X3Byb2JlIH0sCisgIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgUENJX0RFVklDRV9JRF8zQ09NXzNDNTk1LCAgICAgIHQ1OTVfcHJvYmUgfSwKKyAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICBQQ0lfREVWSUNFX0lEXzNDT01fM0M1OTVfMSwgICAgdDU5NV9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzU5NV8yLCAgICB0NTk1X3Byb2JlIH0sCisgIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgUENJX0RFVklDRV9JRF8zQ09NXzNDOTAwVFBPLCAgIHQ1OTVfcHJvYmUgfSwKKyAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICBQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDBDT01CTywgdDU5NV9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIDB4OTAwNCwgICAgICAgICAgICAgICAgICAgICAgICB0NTk1X3Byb2JlIH0sCisgIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgMHg5MDA1LCAgICAgICAgICAgICAgICAgICAgICAgIHQ1OTVfcHJvYmUgfSwKKyAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICAweDkwMDYsICAgICAgICAgICAgICAgICAgICAgICAgdDU5NV9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIDB4OTAwQSwgICAgICAgICAgICAgICAgICAgICAgICB0NTk1X3Byb2JlIH0sCisgIHsgUENJX1ZFTkRPUl9JRF8zQ09NLCAgICAgMHg5ODAwLCAgICAgICAgICAgICAgICAgICAgICAgIHQ1OTVfcHJvYmUgfSwKKyAgeyBQQ0lfVkVORE9SX0lEXzNDT00sICAgICAweDk4MDUsICAgICAgICAgICAgICAgICAgICAgICAgdDU5NV9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfM0NPTSwgICAgIDB4NzY0NiwgICAgICAgICAgICAgICAgICAgICAgICB0NTk1X3Byb2JlIH0sCisjIGVuZGlmIC8qIElOQ0xVREVfM0M1OTUgKi8KKyMgaWZkZWYJSU5DTFVERV9FRVBSTzEwMAorICB7IFBDSV9WRU5ET1JfSURfSU5URUwsICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODI1NTcsICAgICBlZXBybzEwMF9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfSU5URUwsICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODI1NTlFUiwgICBlZXBybzEwMF9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfSU5URUwsICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfSUQxMDI5LCAgICBlZXBybzEwMF9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfSU5URUwsICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfSUQxMDMwLCAgICBlZXBybzEwMF9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfSU5URUwsICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODI1NjIsICAgICBlZXBybzEwMF9wcm9iZSB9LAorIyBlbmRpZiAvKiBJTkNMVURFX0VFUFJPMTAwICovCisjIGlmZGVmCUlOQ0xVREVfRVBJQzEwMAorICB7IFBDSV9WRU5ET1JfSURfU01DLCAgICAgIFBDSV9ERVZJQ0VfSURfU01DX0VQSUMxMDAsICAgICBlcGljMTAwX3Byb2JlIH0sCisjIGVuZGlmIC8qIElOQ0xVREVfRVBJQzEwMCAqLworIyBpZmRlZglJTkNMVURFX0xBTkNFCisgIHsgUENJX1ZFTkRPUl9JRF9BTUQsICAgICAgUENJX0RFVklDRV9JRF9BTURfTEFOQ0UsICAgICAgIGxhbmNlcGNpX3Byb2JlIH0sCisgIHsgUENJX1ZFTkRPUl9JRF9BTURfSE9NRVBOQSwgUENJX0RFVklDRV9JRF9BTURfSE9NRVBOQSwgIGxhbmNlcGNpX3Byb2JlIH0sCisjIGVuZGlmIC8qIElOQ0xVREVfTEFOQ0UgKi8KKyMgaWZkZWYJSU5DTFVERV9SVEw4MTM5CisgIHsgUENJX1ZFTkRPUl9JRF9SRUFMVEVLLCAgUENJX0RFVklDRV9JRF9SRUFMVEVLXzgxMzksICAgIHJ0bDgxMzlfcHJvYmUgfSwKKyAgeyBQQ0lfVkVORE9SX0lEX0RMSU5LLCAgICBQQ0lfREVWSUNFX0lEX0RGRTUzMFRYUCwgICAgICAgcnRsODEzOV9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfU01DXzEyMTEsIFBDSV9ERVZJQ0VfSURfU01DXzEyMTEsICAgICAgICBydGw4MTM5X3Byb2JlIH0sCisjIGVuZGlmIC8qIElOQ0xVREVfUlRMODEzOSAqLworIyBpZmRlZglJTkNMVURFX09UVUxJUAorICB7IFBDSV9WRU5ET1JfSURfREVDLCAgICAgIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQLCAgICAgICBvdHVsaXBfcHJvYmUgfSwKKyAgeyBQQ0lfVkVORE9SX0lEX0RFQywgICAgICBQQ0lfREVWSUNFX0lEX0RFQ19UVUxJUF9GQVNULCAgb3R1bGlwX3Byb2JlIH0sCisgIHsgUENJX1ZFTkRPUl9JRF9ERUMsICAgICAgUENJX0RFVklDRV9JRF9ERUNfVFVMSVBfUExVUywgIG90dWxpcF9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfREVDLCAgICAgIFBDSV9ERVZJQ0VfSURfREVDXzIxMTQyLCAgICAgICBvdHVsaXBfcHJvYmUgfSwKKyMgZW5kaWYgLyogSU5DTFVERV9PVFVMSVAgKi8KKyMgaWZkZWYJSU5DTFVERV9UVUxJUAorICB7IFBDSV9WRU5ET1JfSURfREVDLCAgICAgIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQLCAgICAgICB0dWxpcF9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfREVDLCAgICAgIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQX0ZBU1QsICB0dWxpcF9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfREVDLCAgICAgIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQX1BMVVMsICB0dWxpcF9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfREVDLCAgICAgIFBDSV9ERVZJQ0VfSURfREVDXzIxMTQyLCAgICAgICB0dWxpcF9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfTUFDUk9OSVgsIFBDSV9ERVZJQ0VfSURfTVg5ODd4NSwgICAgICAgICB0dWxpcF9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfTElOS1NZUywgIFBDSV9ERVZJQ0VfSURfTEM4MkMxMTUsICAgICAgICB0dWxpcF9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfTElOS1NZUywgIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQLCAgICAgICB0dWxpcF9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfREFWSUNPTSwgIFBDSV9ERVZJQ0VfSURfRE05MTAyLCAgICAgICAgICB0dWxpcF9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfREFWSUNPTSwgIFBDSV9ERVZJQ0VfSURfRE05MDA5LCAgICAgICAgICB0dWxpcF9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfQURNVEVLLCAgIFBDSV9ERVZJQ0VfSURfQURNVEVLXzA5ODUsICAgICB0dWxpcF9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfQURNVEVLLCAgIDB4MDk4MSwgICAgICAgICAgICAgICAgICAgICAgICB0dWxpcF9wcm9iZSB9LAorICB7IDB4MTI1QiwgICAgICAgICAgICAgICAgIDB4MTQwMCwgICAgICAgICAgICAgICAgICAgICAgICB0dWxpcF9wcm9iZSB9LAorICB7IDB4MTFGNiwgICAgICAgICAgICAgICAgIDB4OTg4MSwgICAgICAgICAgICAgICAgICAgICAgICB0dWxpcF9wcm9iZSB9LAorIyBlbmRpZiAvKiBJTkNMVURFX1RVTElQICovCisjIGlmZGVmIElOQ0xVREVfREFWSUNPTQorICB7IFBDSV9WRU5ET1JfSURfREFWSUNPTSwgICBQQ0lfREVWSUNFX0lEX0RNOTEwMiwgICAgICAgICAgIGRhdmljb21fcHJvYmUgfSwKKyAgeyBQQ0lfVkVORE9SX0lEX0RBVklDT00sICAgUENJX0RFVklDRV9JRF9ETTkwMDksICAgICAgICAgICBkYXZpY29tX3Byb2JlIH0sCisjIGVuZGlmIC8qIElOQ0xVREVfREFWSUNPTSAqLworIyBpZmRlZglJTkNMVURFX1ZJQV9SSElORQorICB7IFBDSV9WRU5ET1JfSURfVklBVEVDLCAgIFBDSV9ERVZJQ0VfSURfVklBX1ZUNjEwMiwgICAgICByaGluZV9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfVklBVEVDLCAgIFBDSV9ERVZJQ0VfSURfVklBX1JISU5FX0ksICAgICByaGluZV9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfVklBVEVDLCAgIFBDSV9ERVZJQ0VfSURfVklBXzg2QzEwMEEsICAgICByaGluZV9wcm9iZSB9LAorIyBlbmRpZiAvKiBJTkNMVURFX1ZJQV9SSElORSAqLworIyBpZmRlZiBJTkNMVURFX1c4OUM4NDAKKyAgeyBQQ0lfVkVORE9SX0lEX1dJTkJPTkQyLCBQQ0lfREVWSUNFX0lEX1dJTkJPTkQyXzg5Qzg0MCwgdzg5Yzg0MF9wcm9iZSB9LAorICB7IFBDSV9WRU5ET1JfSURfQ09NUEVYLCAgIFBDSV9ERVZJQ0VfSURfQ09NUEVYX1JMMTAwQVRYLCB3ODljODQwX3Byb2JlIH0sCisjIGVuZGlmIC8qIElOQ0xVREVfVzg5Qzg0MCAqLworIyBpZmRlZiBJTkNMVURFX1NJUzkwMAorICB7IFBDSV9WRU5ET1JfSURfU0lTLCAgICAgIFBDSV9ERVZJQ0VfSURfU0lTOTAwLCAgICAgICAgICBzaXM5MDBfcHJvYmUgfSwKKyAgeyBQQ0lfVkVORE9SX0lEX1NJUywgICAgICBQQ0lfREVWSUNFX0lEX1NJUzcwMTYsICAgICAgICAgc2lzOTAwX3Byb2JlIH0sCisjIGVuZGlmIC8qIElOQ0xVREVfU0lTOTAwICovCisjIGlmZGVmIElOQ0xVREVfTkFUU0VNSQorICB7IFBDSV9WRU5ET1JfSURfTlMsICAgICAgIFBDSV9ERVZJQ0VfSURfRFA4MzgxNSwgICAgICAgICBuYXRzZW1pX3Byb2JlIH0sCisjIGVuZGlmIC8qIElOQ0xVREVfTkFUU0VNSSAqLworIyBpZmRlZiBJTkNMVURFX1RMQU4KKyAgeyBQQ0lfVkVORE9SX0lEX09MSUNPTSwgICBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIzMjYsICAgdGxhbl9wcm9iZSB9LAorIyBlbmRpZiAvKiBJTkNMVURFX1RMQU4gKi8KKyAgeyAwLCAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCB9Cit9OworI2VuZGlmIC8qIEdSVUIgJiYgSU5DTFVERV9QQ0kgKi8KKworc3RydWN0IGRpc3BhdGNoX3RhYmxlCit7CisgIGNvbnN0IGNoYXIJKm5pY19uYW1lOworI2lmZGVmCUlOQ0xVREVfUENJCisgIHN0cnVjdCBuaWMJKigqZXRoX3Byb2JlKSAoc3RydWN0IG5pYyAqLCB1bnNpZ25lZCBzaG9ydCAqLAorCQkJICAgICAgIHN0cnVjdCBwY2lfZGV2aWNlICopOworI2Vsc2UKKyAgc3RydWN0IG5pYwkqKCpldGhfcHJvYmUpIChzdHJ1Y3QgbmljICosIHVuc2lnbmVkIHNob3J0ICopOworI2VuZGlmCS8qIElOQ0xVREVfUENJICovCisgIHVuc2lnbmVkIHNob3J0CSpwcm9iZV9pb2FkZHJzOwkJLyogZm9yIHByb2JlIG92ZXJyaWRlcyAqLworfTsKKworLyoKKyAqCU5JQyBwcm9iaW5nIGlzIGluIG9yZGVyIG9mIGFwcGVhcmFuY2UgaW4gdGhpcyB0YWJsZS4KKyAqCUlmIGZvciBzb21lIHJlYXNvbiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIG9yZGVyLAorICoJanVzdCByZWFycmFuZ2UgdGhlIGVudHJpZXMgKGJyYWNrZXRlZCBieSB0aGUgI2lmZGVmLyNlbmRpZikKKyAqLworc3RhdGljIHN0cnVjdCBkaXNwYXRjaF90YWJsZQlOSUNbXSA9Cit7CisjaWZkZWYJSU5DTFVERV9SVEw4MTM5CisgIHsgIlJUTDgxMzkiLCBydGw4MTM5X3Byb2JlLCBwY2lfaW9hZGRycyB9LAorI2VuZGlmCisjaWZkZWYgSU5DTFVERV9TSVM5MDAKKyAgeyAiU0lTOTAwIiwgc2lzOTAwX3Byb2JlLCBwY2lfaW9hZGRycyB9LAkKKyNlbmRpZgorI2lmZGVmIElOQ0xVREVfTkFUU0VNSQorICB7ICJOQVRTRU1JIiwgbmF0c2VtaV9wcm9iZSwgcGNpX2lvYWRkcnMgfSwJCisjZW5kaWYKKyNpZmRlZglJTkNMVURFX1dECisgIHsgIldEIiwgd2RfcHJvYmUsIDAgfSwKKyNlbmRpZgorI2lmZGVmCUlOQ0xVREVfM0M1MDMKKyAgeyAiM0M1MDMiLCB0NTAzX3Byb2JlLCAwIH0sCisjZW5kaWYKKyNpZmRlZglJTkNMVURFX05FCisgIHsgIk5FKjAwMCIsIG5lX3Byb2JlLCAwIH0sCisjZW5kaWYKKyNpZmRlZglJTkNMVURFXzNDNTA5CisgIHsgIjNDNXg5IiwgdDUwOV9wcm9iZSwgMCB9LAorI2VuZGlmCisjaWZkZWYJSU5DTFVERV8zQzUyOQorICB7ICIzQzV4OSIsIHQ1MjlfcHJvYmUsIDAgfSwKKyNlbmRpZgorI2lmZGVmCUlOQ0xVREVfM0M1OTUKKyAgeyAiM0M1OTUiLCB0NTk1X3Byb2JlLCBwY2lfaW9hZGRycyB9LAorI2VuZGlmCisjaWZkZWYJSU5DTFVERV8zQzkwWAorICB7ICIzQzkwWCIsIGEzYzkweF9wcm9iZSwgcGNpX2lvYWRkcnMgfSwKKyNlbmRpZgorI2lmZGVmCUlOQ0xVREVfRUVQUk8KKyAgeyAiRUVQUk8iLCBlZXByb19wcm9iZSwgMCB9LAorI2VuZGlmCisjaWZkZWYJSU5DTFVERV9FRVBSTzEwMAorICB7ICJFRVBSTzEwMCIsIGVlcHJvMTAwX3Byb2JlLCBwY2lfaW9hZGRycyB9LAorI2VuZGlmCisjaWZkZWYJSU5DTFVERV9FUElDMTAwCisgIHsgIkVQSUMxMDAiLCBlcGljMTAwX3Byb2JlLCBwY2lfaW9hZGRycyB9LAorI2VuZGlmCisjaWZkZWYJSU5DTFVERV9PVFVMSVAKKyAgeyAiT1R1bGlwIiwgb3R1bGlwX3Byb2JlLCBwY2lfaW9hZGRycyB9LAorI2VuZGlmCisjaWZkZWYJSU5DTFVERV9UVUxJUAorICB7ICJUdWxpcCIsIHR1bGlwX3Byb2JlLCBwY2lfaW9hZGRycyB9LAorI2VuZGlmCisjaWZkZWYJSU5DTFVERV9EQVZJQ09NCisgIHsgIkRBVklDT00iLCBkYXZpY29tX3Byb2JlLCBwY2lfaW9hZGRycyB9LAorI2VuZGlmCisjaWZkZWYJSU5DTFVERV9DUzg5WDAKKyAgeyAiQ1M4OXgwIiwgY3M4OXgwX3Byb2JlLCAwIH0sCisjZW5kaWYKKyNpZmRlZglJTkNMVURFX05FMjEwMAorICB7ICJORTIxMDAiLCBuZTIxMDBfcHJvYmUsIDAgfSwKKyNlbmRpZgorI2lmZGVmCUlOQ0xVREVfTkk2NTEwCisgIHsgIk5JNjUxMCIsIG5pNjUxMF9wcm9iZSwgMCB9LAorI2VuZGlmCisjaWZkZWYJSU5DTFVERV9TS19HMTYKKyAgeyAiU0tfRzE2IiwgU0tfcHJvYmUsIDAgfSwKKyNlbmRpZgorI2lmZGVmCUlOQ0xVREVfM0M1MDcKKyAgeyAiM0M1MDciLCB0NTA3X3Byb2JlLCAwIH0sCisjZW5kaWYKKyNpZmRlZglJTkNMVURFX05JNTAxMAorICB7ICJOSTUwMTAiLCBuaTUwMTBfcHJvYmUsIDAgfSwKKyNlbmRpZgorI2lmZGVmCUlOQ0xVREVfTkk1MjEwCisgIHsgIk5JNTIxMCIsIG5pNTIxMF9wcm9iZSwgMCB9LAorI2VuZGlmCisjaWZkZWYJSU5DTFVERV9FWE9TMjA1CisgIHsgIkVYT1MyMDUiLCBleG9zMjA1X3Byb2JlLCAwIH0sCisjZW5kaWYKKyNpZmRlZglJTkNMVURFX1NNQzkwMDAKKyAgeyAiU01DOTAwMCIsIHNtYzkwMDBfcHJvYmUsIDAgfSwKKyNlbmRpZgorI2lmZGVmCUlOQ0xVREVfVElBUkEKKyAgeyAiVElBUkEiLCB0aWFyYV9wcm9iZSwgMCB9LAorI2VuZGlmCisjaWZkZWYJSU5DTFVERV9ERVBDQQorICB7ICJERVBDQSIsIGRlcGNhX3Byb2JlLCAwIH0sCisjZW5kaWYKKyNpZmRlZglJTkNMVURFX05TODM5MAorICB7ICJORTIwMDAvUENJIiwgbmVwY2lfcHJvYmUsIHBjaV9pb2FkZHJzIH0sCisjZW5kaWYKKyNpZmRlZglJTkNMVURFX0xBTkNFCisgIHsgIkxBTkNFL1BDSSIsIGxhbmNlcGNpX3Byb2JlLCBwY2lfaW9hZGRycyB9LAorI2VuZGlmCisjaWZkZWYJSU5DTFVERV9WSUFfUkhJTkUKKyAgeyAiVklBIDg2QzEwMCIsIHJoaW5lX3Byb2JlLCBwY2lfaW9hZGRycyB9LAorI2VuZGlmCisjaWZkZWYJSU5DTFVERV9XODlDODQwCisgIHsgIlc4OUM4NDBGIiwgdzg5Yzg0MF9wcm9iZSwgcGNpX2lvYWRkcnMgfSwKKyNlbmRpZgorI2lmZGVmCUlOQ0xVREVfVExBTgorICB7ICJPbGljb20gMjMyNiIsIHRsYW5fcHJvYmUsIHBjaV9pb2FkZHJzIH0sCisjZW5kaWYKKyAgLyogdGhpcyBlbnRyeSBtdXN0IGFsd2F5cyBiZSBsYXN0IHRvIG1hcmsgdGhlIGVuZCBvZiBsaXN0ICovCisgIHsgMCwgMCwgMCB9Cit9OworCisjZGVmaW5lCU5JQ19UQUJMRV9TSVpFCShzaXplb2YgKE5JQykgLyBzaXplb2YgKE5JQ1swXSkpCisKK3N0YXRpYyBpbnQKK2V0aF9kdW1teSAoc3RydWN0IG5pYyAqZHVtbXkpCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgY2hhcglwYWNrZXRbRVRIX0ZSQU1FX0xFTl07CisKK3N0cnVjdCBuaWMJbmljID0KK3sKKyAgKHZvaWQgKCopIChzdHJ1Y3QgbmljICopKSBldGhfZHVtbXksCS8qIHJlc2V0ICovCisgIGV0aF9kdW1teSwJCQkJLyogcG9sbCAqLworICAodm9pZCAoKikgKHN0cnVjdCBuaWMgKiwgY29uc3QgY2hhciAqLAorCSAgICAgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsCisJICAgICBjb25zdCBjaGFyICopKSBldGhfZHVtbXksCS8qIHRyYW5zbWl0ICovCisgICh2b2lkICgqKSAoc3RydWN0IG5pYyAqKSkgZXRoX2R1bW15LAkvKiBkaXNhYmxlICovCisjaWZkZWYJVDUwM19BVUkKKyAgMSwJCQkJCS8qIGF1aSAqLworI2Vsc2UKKyAgMCwJCQkJCS8qIG5vIGF1aSAqLworI2VuZGlmCisgICZyb20sCQkJCQkvKiByb21faW5mbyAqLworICBhcnB0YWJsZVtBUlBfQ0xJRU5UXS5ub2RlLAkJLyogbm9kZV9hZGRyICovCisgIHBhY2tldCwJCQkJLyogcGFja2V0ICovCisgIDAsCQkJCS8qIHBhY2tldGxlbiAqLworICAwLAkJCQkvKiBwcml2X2RhdGEgKi8KK307CisKK3ZvaWQKK2V0aF9yZXNldCAodm9pZCkKK3sKKyAgKCpuaWMucmVzZXQpICgmbmljKTsKK30KKworaW50CitldGhfcHJvYmUgKHZvaWQpCit7CisgIHN0cnVjdCBwY2lfZGV2aWNlCSpwOworICBjb25zdCBzdHJ1Y3QgZGlzcGF0Y2hfdGFibGUJKnQ7CisgIHN0YXRpYyBpbnQgcHJvYmVkID0gMDsKKworICAvKiBJZiBhbHJlYWR5IHByb2JlZCwgZG9uJ3QgdHJ5IHRvIHByb2JlIGl0IGFueSBsb25nZXIuICAqLworICBpZiAocHJvYmVkKQorICAgIHJldHVybiAxOworICAKKyAgLyogQ2xlYXIgdGhlIHJlYWR5IGZsYWcuICAqLworICBuZXR3b3JrX3JlYWR5ID0gMDsKKyAgLyogQ2xlYXIgdGhlIEFSUCB0YWJsZS4gICovCisgIGdydWJfbWVtc2V0ICgoY2hhciAqKSBhcnB0YWJsZSwgMCwKKwkgICAgICAgTUFYX0FSUCAqIHNpemVvZiAoc3RydWN0IGFycHRhYmxlX3QpKTsKKyAgCisgIHAgPSAwOworICAKKyNpZmRlZglJTkNMVURFX1BDSQorICAvKiBJbiBHUlVCLCB0aGUgUk9NIGluZm8gaXMgaW5pdGlhbGl6ZWQgaGVyZS4gICovCisgIHJvbSA9ICooKHN0cnVjdCByb21faW5mbyAqKSBST01fSU5GT19MT0NBVElPTik7CisgIAorICBldGhfcGNpX2luaXQocGNpX25pY19saXN0KTsKKyAgcGNpX2lvYWRkcnNbMF0gPSAwOworICBwY2lfaW9hZGRyc1sxXSA9IDA7CisgIC8qIGF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhIGxpc3Qgb2YgcG9zc2libGUgUENJIGNhbmRpZGF0ZXMKKyAgICAgd2UganVzdCBwaWNrIHRoZSBmaXJzdCBvbmUgd2l0aCBhIG5vbi16ZXJvIGlvYWRkciAqLworICBmb3IgKHAgPSBwY2lfbmljX2xpc3Q7IHAtPnZlbmRvciAhPSAwOyArK3ApCisgICAgeworICAgICAgaWYgKHAtPmlvYWRkciAhPSAwKQorCXsKKwkgIHBjaV9pb2FkZHJzWzBdID0gcC0+aW9hZGRyOworCSAgYnJlYWs7CisJfQorICAgIH0KKyNlbmRpZgorICAKKyAgZXRoZXJib290X3ByaW50ZigiUHJvYmluZy4uLiIpOworCQorI2lmZGVmIElOQ0xVREVfUENJCisgIGlmIChwLT52ZW5kb3IpCisgICAgeworICAgICAgc3RydWN0IHBjaV9kaXNwYXRjaF90YWJsZSAqcHQ7CisgICAgICAKKyAgICAgIGZvciAocHQgPSBQQ0lfTklDOyBwdC0+ZXRoX3Byb2JlICE9IDA7IHB0KyspCisJaWYgKHAtPnZlbmRvciA9PSBwdC0+dmVuZG9yICYmIHAtPmRldl9pZCA9PSBwdC0+ZGV2X2lkKQorCSAgeworCSAgICBldGhlcmJvb3RfcHJpbnRmICgiWyVzXSIsIHAtPm5hbWUpOworCSAgICBpZiAoKHB0LT5ldGhfcHJvYmUpICgmbmljLCBwY2lfaW9hZGRycywgcCkpCisJICAgICAgeworCQlwcm9iZWQgPSAxOworCQlyZXR1cm4gMTsKKwkgICAgICB9CisJICB9CisgICAgfQorI2VuZGlmIC8qIElOQ0xVREVfUENJICovCisJCisgIGZvciAodCA9IE5JQzsgdC0+bmljX25hbWUgIT0gMDsgKyt0KQorICAgIHsKKyAgICAgIGV0aGVyYm9vdF9wcmludGYoIlslc10iLCB0LT5uaWNfbmFtZSk7CisjaWZkZWYJSU5DTFVERV9QQ0kKKyAgICAgIGlmICgoKnQtPmV0aF9wcm9iZSkgKCZuaWMsIHQtPnByb2JlX2lvYWRkcnMsIHApKQorCXsKKwkgIHByb2JlZCA9IDE7CisJICByZXR1cm4gMTsKKwl9CisjZWxzZQorICAgICAgaWYgKCgqdC0+ZXRoX3Byb2JlKSAoJm5pYywgdC0+cHJvYmVfaW9hZGRycykpCisJeworCSAgcHJvYmVkID0gMTsKKwkgIHJldHVybiAxOworCX0KKyNlbmRpZgkvKiBJTkNMVURFX1BDSSAqLworICAgIH0KKyAgCisgIHJldHVybiAwOworfQorCitpbnQKK2V0aF9wb2xsICh2b2lkKQoreworICByZXR1cm4gKCgqbmljLnBvbGwpICgmbmljKSk7Cit9CisKK3ZvaWQKK2V0aF90cmFuc21pdCAoY29uc3QgY2hhciAqZCwgdW5zaWduZWQgaW50IHQsIHVuc2lnbmVkIGludCBzLCBjb25zdCB2b2lkICpwKQoreworICAoKm5pYy50cmFuc21pdCkgKCZuaWMsIGQsIHQsIHMsIHApOworICBpZiAodCA9PSBJUCkKKyAgICB0d2lkZGxlICgpOworfQorCit2b2lkCitldGhfZGlzYWJsZSAodm9pZCkKK3sKKyAgKCpuaWMuZGlzYWJsZSkgKCZuaWMpOworfQpkaWZmIC0tZ2l0IGEvbmV0Ym9vdC9jczg5eDAuYyBiL25ldGJvb3QvY3M4OXgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY5NjQ4MQotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvY3M4OXgwLmMKQEAgLTAsMCArMSw2NTkgQEAKKy8qIGNzODl4MC5jOiBBIENyeXN0YWwgU2VtaWNvbmR1Y3RvciBDUzg5WzAyXTAgZHJpdmVyIGZvciBldGhlcmJvb3QuICovCisvKgorICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gZGlzdHJpYnV0ZSB0aGUgZW5jbG9zZWQgY3M4OXgwLltjaF0gZHJpdmVyCisgIG9ubHkgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgRXRoZXJib290IHBhY2thZ2UuICBUaGUgY29kZSBpcworICBvcmRpbmFyaWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHUEwuCisgIAorICBSdXNzIE5lbHNvbiwgSmFudWFyeSAyMDAwCisKKyAgQ2hhbmdlTG9nOgorCisgIFRodSBEZWMgNiAyMjo0MDowMCAxOTk2ICBNYXJrdXMgR3V0c2Noa2UgIDxndXRzY2hrQG1hdGgudW5pLW11ZW5zdGVyLmRlPgorCisgICogZGlzYWJsZWQgYWxsICJhZHZhbmNlZCIgZmVhdHVyZXM7IHRoaXMgc2hvdWxkIG1ha2UgdGhlIGNvZGUgbW9yZSByZWxpYWJsZQorCisgICogcmVvcmdhbml6ZWQgdGhlIHJlc2V0IGZ1bmN0aW9uCisKKyAgKiBhbHdheXMgcmVzZXQgdGhlIGFkZHJlc3MgcG9ydCwgc28gdGhhdCBhdXRvcHJvYmluZyB3aWxsIGNvbnRpbnVlIHdvcmtpbmcKKworICAqIHNvbWUgY29zbWV0aWMgY2hhbmdlcworCisgICogMi41CisKKyAgVGh1IERlYyA1IDIxOjAwOjAwIDE5OTYgIE1hcmt1cyBHdXRzY2hrZSAgPGd1dHNjaGtAbWF0aC51bmktbXVlbnN0ZXIuZGU+CisKKyAgKiB0ZXN0ZWQgdGhlIGNvZGUgYWdhaW5zdCBhIENTODkwMCBjYXJkCisKKyAgKiBsb3RzIG9mIG1pbm9yIGJ1ZyBmaXhlcyBhbmQgYWRqdXN0bWVudHMKKworICAqIHRoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2UsIHRoYXQgYWN0dWFsbHkgd29ya3MhIGl0IHN0aWxsIHJlcXVpcmVzIHNvbWUKKyAgICBjaGFuZ2VzIGluIG9yZGVyIHRvIGJlIG1vcmUgdG9sZXJhbnQgdG8gZGlmZmVyZW50IGVudmlyb25tZW50cworCisgICogNAorCisgIEZyaSBOb3YgMjIgMjM6MDA6MDAgMTk5NiAgTWFya3VzIEd1dHNjaGtlICA8Z3V0c2Noa0BtYXRoLnVuaS1tdWVuc3Rlci5kZT4KKworICAqIHJlYWQgdGhlIG1hbnVhbHMgZm9yIHRoZSBDUzg5eDAgY2hpcHNldHMgYW5kIHRvb2sgbm90ZSBvZiBhbGwgdGhlCisgICAgY2hhbmdlcyB0aGF0IHdpbGwgYmUgbmVjY2Vzc2FyeSBpbiBvcmRlciB0byBhZGFwdCBSdXNzZWwgTmVsc29uJ3MgY29kZQorICAgIHRvIHRoZSByZXF1aXJlbWVudHMgb2YgYSBCT09ULVByb20KKworICAqIDYKKworICBUaHUgTm92IDE5IDIyOjAwOjAwIDE5OTYgIE1hcmt1cyBHdXRzY2hrZSAgPGd1dHNjaGtAbWF0aC51bmktbXVlbnN0ZXIuZGU+CisKKyAgKiBTeW5jaGVkIHdpdGggUnVzc2VsIE5lbHNvbidzIGN1cnJlbnQgY29kZSAodjEuMDApCisKKyAgKiAyCisKKyAgVGh1IE5vdiAxMiAxODowMDowMCAxOTk2ICBNYXJrdXMgR3V0c2Noa2UgIDxndXRzY2hrQG1hdGgudW5pLW11ZW5zdGVyLmRlPgorCisgICogQ2xlYW5lZCB1cCBzb21lIG9mIHRoZSBjb2RlIGFuZCB0cmllZCB0byBvcHRpbWl6ZSB0aGUgY29kZSBzaXplLgorCisgICogMS41CisKKyAgU3VuIE5vdiAxMCAxNjozMDowMCAxOTk2ICBNYXJrdXMgR3V0c2Noa2UgIDxndXRzY2hrQG1hdGgudW5pLW11ZW5zdGVyLmRlPgorCisgICogRmlyc3QgZXhwZXJpbWVudGFsIHJlbGVhc2UuIFRoaXMgY29kZSBjb21waWxlcyBmaW5lLCBidXQgSQorICBoYXZlIG5vIHdheSBvZiB0ZXN0aW5nIHdoZXRoZXIgaXQgYWN0dWFsbHkgd29ya3MuCisKKyAgKiBJIGRpZCBub3QgKHlldCkgYm90aGVyIHRvIG1ha2UgdGhlIGNvZGUgMTZiaXQgYXdhcmUsIHNvIGZvcgorICB0aGUgdGltZSBiZWluZywgaXQgd2lsbCBvbmx5IHdvcmsgZm9yIEV0aGVyYm9vdC8zMi4KKworICAqIDEyCisKKyAgKi8KKworI2luY2x1ZGUgImV0aGVyYm9vdC5oIgorI2luY2x1ZGUgIm5pYy5oIgorI2luY2x1ZGUgImNhcmRzLmgiCisjaW5jbHVkZSAiY3M4OXgwLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAlldGhfbmljX2Jhc2U7CitzdGF0aWMgdW5zaWduZWQgbG9uZyAgICBldGhfbWVtX3N0YXJ0Oworc3RhdGljIHVuc2lnbmVkIHNob3J0ICAgZXRoX2lycTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCAgIGV0aF9jc190eXBlOwkvKiBvbmUgb2Y6IENTODkwMCwgQ1M4OTIwLCBDUzg5MjBNICAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0ICAgZXRoX2F1dG9fbmVnX2NuZjsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCAgIGV0aF9hZGFwdGVyX2NuZjsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAlldGhfbGluZWN0bDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlDUzg5eDAgLSBzcGVjaWZpYyByb3V0aW5lcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbmxpbmUgaW50IHJlYWRyZWcoaW50IHBvcnRubykKK3sKKwlvdXR3KHBvcnRubywgZXRoX25pY19iYXNlICsgQUREX1BPUlQpOworCXJldHVybiBpbncoZXRoX25pY19iYXNlICsgREFUQV9QT1JUKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlcmVnKGludCBwb3J0bm8sIGludCB2YWx1ZSkKK3sKKwlvdXR3KHBvcnRubywgZXRoX25pY19iYXNlICsgQUREX1BPUlQpOworCW91dHcodmFsdWUsIGV0aF9uaWNfYmFzZSArIERBVEFfUE9SVCk7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRUVQUk9NIGFjY2VzcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgd2FpdF9lZXByb21fcmVhZHkodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRtbyA9IGN1cnJ0aWNrcygpICsgNCpUSUNLU19QRVJfU0VDOworCisJLyogY2hlY2sgdG8gc2VlIGlmIHRoZSBFRVBST00gaXMgcmVhZHksIGEgdGltZW91dCBpcyB1c2VkIC0KKwkgICBqdXN0IGluIGNhc2UgRUVQUk9NIGlzIHJlYWR5IHdoZW4gU0lfQlVTWSBpbiB0aGUKKwkgICBQUF9TZWxmU1QgaXMgY2xlYXIgKi8KKwl3aGlsZShyZWFkcmVnKFBQX1NlbGZTVCkgJiBTSV9CVVNZKSB7CisJCWlmIChjdXJydGlja3MoKSA+PSB0bW8pCisJCQlyZXR1cm4gLTE7IH0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfZWVwcm9tX2RhdGEoaW50IG9mZiwgaW50IGxlbiwgdW5zaWduZWQgc2hvcnQgKmJ1ZmZlcikKK3sKKwlpbnQgaTsKKworI2lmZGVmCUVERUJVRworCXByaW50ZigiXG5jczogRUVQUk9NIGRhdGEgZnJvbSAlaFggZm9yICVoWDoiLG9mZixsZW4pOworI2VuZGlmCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmICh3YWl0X2VlcHJvbV9yZWFkeSgpIDwgMCkKKwkJCXJldHVybiAtMTsKKwkJLyogTm93IHNlbmQgdGhlIEVFUFJPTSByZWFkIGNvbW1hbmQgYW5kIEVFUFJPTSBsb2NhdGlvbgorCQkgICB0byByZWFkICovCisJCXdyaXRlcmVnKFBQX0VFQ01ELCAob2ZmICsgaSkgfCBFRVBST01fUkVBRF9DTUQpOworCQlpZiAod2FpdF9lZXByb21fcmVhZHkoKSA8IDApCisJCQlyZXR1cm4gLTE7CisJCWJ1ZmZlcltpXSA9IHJlYWRyZWcoUFBfRUVEYXRhKTsKKyNpZmRlZglFREVCVUcKKwkJaWYgKCEoaSUxMCkpCisJCQlwcmludGYoIlxuY3M6ICIpOworCQlwcmludGYoIiVoWCAiLCBidWZmZXJbaV0pOworI2VuZGlmCisJfQorI2lmZGVmCUVERUJVRworCXB1dGNoYXIoJ1xuJyk7CisjZW5kaWYKKworCXJldHVybigwKTsKK30KKworc3RhdGljIGludCBnZXRfZWVwcm9tX2Noa3N1bShpbnQgb2ZmLCBpbnQgbGVuLCB1bnNpZ25lZCBzaG9ydCAqYnVmZmVyKQoreworCWludCAgaSwgY2tzdW07CisKKwlja3N1bSA9IDA7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlja3N1bSArPSBidWZmZXJbaV07CisJY2tzdW0gJj0gMHhmZmZmOworCWlmIChja3N1bSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLTE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitBY3RpdmF0ZSBhbGwgb2YgdGhlIGF2YWlsYWJsZSBtZWRpYSBhbmQgcHJvYmUgZm9yIG5ldHdvcmsKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBjbHJsaW5lKHZvaWQpCit7CisJaW50IGk7CisKKwlwdXRjaGFyKCdccicpOworCWZvciAoaSA9IDc5OyBpLS07ICkgcHV0Y2hhcignICcpOworCXByaW50ZigiXHJjczogIik7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBjb250cm9sX2RjX2RjKGludCBvbl9ub3Rfb2ZmKQoreworCXVuc2lnbmVkIGludCBzZWxmY29udHJvbDsKKwl1bnNpZ25lZCBsb25nIHRtbyA9IGN1cnJ0aWNrcygpICsgVElDS1NfUEVSX1NFQzsKKworCS8qIGNvbnRyb2wgdGhlIERDIHRvIERDIGNvbnZlcnRvciBpbiB0aGUgU2VsZkNvbnRyb2wgcmVnaXN0ZXIuICAqLworCXNlbGZjb250cm9sID0gSENCMV9FTkJMOyAvKiBFbmFibGUgdGhlIEhDQjEgYml0IGFzIGFuIG91dHB1dCAqLworCWlmICgoKGV0aF9hZGFwdGVyX2NuZiAmIEFfQ05GX0RDX0RDX1BPTEFSSVRZKSAhPSAwKSBeIG9uX25vdF9vZmYpCisJCXNlbGZjb250cm9sIHw9IEhDQjE7CisJZWxzZQorCQlzZWxmY29udHJvbCAmPSB+SENCMTsKKwl3cml0ZXJlZyhQUF9TZWxmQ1RMLCBzZWxmY29udHJvbCk7CisKKwkvKiBXYWl0IGZvciB0aGUgREMvREMgY29udmVydGVyIHRvIHBvd2VyIHVwIC0gMTAwMG1zICovCisJd2hpbGUgKGN1cnJ0aWNrcygpIDwgdG1vKTsKKworCXJldHVybjsKK30KKworc3RhdGljIGludCBkZXRlY3RfdHAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRtbzsKKworCS8qIFR1cm4gb24gdGhlIGNoaXAgYXV0byBkZXRlY3Rpb24gb2YgMTBCVC8gQVVJICovCisKKwljbHJsaW5lKCk7IHByaW50ZigiYXR0ZW1wdGluZyAlczoiLCJUUCIpOworCisgICAgICAgIC8qIElmIGNvbm5lY3RlZCB0byBhbm90aGVyIGZ1bGwgZHVwbGV4IGNhcGFibGUgMTAtQmFzZS1UIGNhcmQKKwkgICB0aGUgbGluayBwdWxzZXMgc2VlbSB0byBiZSBsb3N0IHdoZW4gdGhlIGF1dG8gZGV0ZWN0IGJpdCBpbgorCSAgIHRoZSBMaW5lQ1RMIGlzIHNldC4gIFRvIG92ZXJjb21lIHRoaXMgdGhlIGF1dG8gZGV0ZWN0IGJpdAorCSAgIHdpbGwgYmUgY2xlYXJlZCB3aGlsc3QgdGVzdGluZyB0aGUgMTAtQmFzZS1UIGludGVyZmFjZS4KKwkgICBUaGlzIHdvdWxkIG5vdCBiZSBuZWNlc3NhcnkgZm9yIHRoZSBzcGFycm93IGNoaXAgYnV0IGlzCisJICAgc2ltcGxlciB0byBkbyBpdCBhbnl3YXkuICovCisJd3JpdGVyZWcoUFBfTGluZUNUTCwgZXRoX2xpbmVjdGwgJn4gQVVJX09OTFkpOworCWNvbnRyb2xfZGNfZGMoMCk7CisKKyAgICAgICAgLyogRGVsYXkgZm9yIHRoZSBoYXJkd2FyZSB0byB3b3JrIG91dCBpZiB0aGUgVFAgY2FibGUgaXMKKwkgICBwcmVzZW50IC0gMTUwbXMgKi8KKwlmb3IgKHRtbyA9IGN1cnJ0aWNrcygpICsgNDsgY3VycnRpY2tzKCkgPCB0bW87ICk7CisKKwlpZiAoKHJlYWRyZWcoUFBfTGluZVNUKSAmIExJTktfT0spID09IDApCisJCXJldHVybiAwOworCisJaWYgKGV0aF9jc190eXBlICE9IENTODkwMCkgeworCisJCXdyaXRlcmVnKFBQX0F1dG9OZWdDVEwsIGV0aF9hdXRvX25lZ19jbmYgJiBBVVRPX05FR19NQVNLKTsKKworCQlpZiAoKGV0aF9hdXRvX25lZ19jbmYgJiBBVVRPX05FR19CSVRTKSA9PSBBVVRPX05FR19FTkFCTEUpIHsKKwkJCXByaW50ZigiIG5lZ290aWF0aW5nIGR1cGxleC4uLiAiKTsKKwkJCXdoaWxlIChyZWFkcmVnKFBQX0F1dG9OZWdTVCkgJiBBVVRPX05FR19CVVNZKSB7CisJCQkJaWYgKGN1cnJ0aWNrcygpIC0gdG1vID4gNDAqVElDS1NfUEVSX1NFQykgeworCQkJCQlwcmludGYoInRpbWUgb3V0ICIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHJlYWRyZWcoUFBfQXV0b05lZ1NUKSAmIEZEWF9BQ1RJVkUpCisJCQlwcmludGYoInVzaW5nIGZ1bGwgZHVwbGV4Iik7CisJCWVsc2UKKwkJCXByaW50ZigidXNpbmcgaGFsZiBkdXBsZXgiKTsKKwl9CisKKwlyZXR1cm4gQV9DTkZfTUVESUFfMTBCX1Q7Cit9CisKKy8qIHNlbmQgYSB0ZXN0IHBhY2tldCAtIHJldHVybiB0cnVlIGlmIGNhcnJpZXIgYml0cyBhcmUgb2sgKi8KK3N0YXRpYyBpbnQgc2VuZF90ZXN0X3BrdChzdHJ1Y3QgbmljICpuaWMpCit7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgdGVzdHBhY2tldFtdID0geyAwLDAsMCwwLDAsMCwgMCwwLDAsMCwwLDAsCisJCQkJICAgICAwLCA0NiwgLypBIDQ2IGluIG5ldHdvcmsgb3JkZXIgICAgICAgKi8KKwkJCQkgICAgIDAsIDAsICAvKkRTQVA9MCAmIFNTQVA9MCBmaWVsZHMgICAgICAqLworCQkJCSAgICAgMHhmMywwIC8qQ29udHJvbCAoVGVzdCBSZXErUCBiaXQgc2V0KSovIH07CisJdW5zaWduZWQgbG9uZyB0bW87CisKKwl3cml0ZXJlZyhQUF9MaW5lQ1RMLCByZWFkcmVnKFBQX0xpbmVDVEwpIHwgU0VSSUFMX1RYX09OKTsKKworCW1lbWNweSh0ZXN0cGFja2V0LCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweSh0ZXN0cGFja2V0K0VUSF9BTEVOLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOworCisJb3V0dyhUWF9BRlRFUl9BTEwsIGV0aF9uaWNfYmFzZSArIFRYX0NNRF9QT1JUKTsKKwlvdXR3KEVUSF9aTEVOLCBldGhfbmljX2Jhc2UgKyBUWF9MRU5fUE9SVCk7CisKKwkvKiBUZXN0IHRvIHNlZSBpZiB0aGUgY2hpcCBoYXMgYWxsb2NhdGVkIG1lbW9yeSBmb3IgdGhlIHBhY2tldCAqLworCWZvciAodG1vID0gY3VycnRpY2tzKCkgKyAyOworCSAgICAgKHJlYWRyZWcoUFBfQnVzU1QpICYgUkVBRFlfRk9SX1RYX05PVykgPT0gMDsgKQorCQlpZiAoY3VycnRpY2tzKCkgPj0gdG1vKQorCQkJcmV0dXJuKDApOworCisJLyogV3JpdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBwYWNrZXQgKi8KKwlvdXRzdyhldGhfbmljX2Jhc2UgKyBUWF9GUkFNRV9QT1JULCB0ZXN0cGFja2V0LAorCSAgICAgIChFVEhfWkxFTisxKT4+MSk7CisKKwlwcmludGYoIiBzZW5kaW5nIHRlc3QgcGFja2V0ICIpOworCS8qIHdhaXQgYSBjb3VwbGUgb2YgdGltZXIgdGlja3MgZm9yIHBhY2tldCB0byBiZSByZWNlaXZlZCAqLworCWZvciAodG1vID0gY3VycnRpY2tzKCkgKyAyOyBjdXJydGlja3MoKSA8IHRtbzsgKTsKKworCWlmICgocmVhZHJlZyhQUF9UeEV2ZW50KSAmIFRYX1NFTkRfT0tfQklUUykgPT0gVFhfT0spIHsKKwkJCXByaW50Zigic3VjY2VlZGVkIik7CisJCQlyZXR1cm4gMTsKKwl9CisJcHJpbnRmKCJmYWlsZWQiKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGRldGVjdF9hdWkoc3RydWN0IG5pYyAqbmljKQoreworCWNscmxpbmUoKTsgcHJpbnRmKCJhdHRlbXB0aW5nICVzOiIsIkFVSSIpOworCWNvbnRyb2xfZGNfZGMoMCk7CisKKwl3cml0ZXJlZyhQUF9MaW5lQ1RMLCAoZXRoX2xpbmVjdGwgJiB+QVVUT19BVUlfMTBCQVNFVCkgfCBBVUlfT05MWSk7CisKKwlpZiAoc2VuZF90ZXN0X3BrdChuaWMpKSB7CisJCXJldHVybiBBX0NORl9NRURJQV9BVUk7IH0KKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRldGVjdF9ibmMoc3RydWN0IG5pYyAqbmljKQoreworCWNscmxpbmUoKTsgcHJpbnRmKCJhdHRlbXB0aW5nICVzOiIsIkJOQyIpOworCWNvbnRyb2xfZGNfZGMoMSk7CisKKwl3cml0ZXJlZyhQUF9MaW5lQ1RMLCAoZXRoX2xpbmVjdGwgJiB+QVVUT19BVUlfMTBCQVNFVCkgfCBBVUlfT05MWSk7CisKKwlpZiAoc2VuZF90ZXN0X3BrdChuaWMpKSB7CisJCXJldHVybiBBX0NORl9NRURJQV8xMEJfMjsgfQorCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIX1JFU0VUIC0gUmVzZXQgYWRhcHRlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBjczg5eDBfcmVzZXQoc3RydWN0IG5pYyAqbmljKQoreworCWludCAgaTsKKwl1bnNpZ25lZCBsb25nIHJlc2V0X3RtbzsKKworCXdyaXRlcmVnKFBQX1NlbGZDVEwsIHJlYWRyZWcoUFBfU2VsZkNUTCkgfCBQT1dFUl9PTl9SRVNFVCk7CisKKwkvKiB3YWl0IGZvciB0d28gdGlja3M7IHRoYXQgaXMgMio1NW1zICovCisJZm9yIChyZXNldF90bW8gPSBjdXJydGlja3MoKSArIDI7IGN1cnJ0aWNrcygpIDwgcmVzZXRfdG1vOyApOworCisJaWYgKGV0aF9jc190eXBlICE9IENTODkwMCkgeworCQkvKiBIYXJkd2FyZSBwcm9ibGVtIHJlcXVpcmVzIFBOUCByZWdpc3RlcnMgdG8gYmUgcmVjb25maWd1cmVkCisJCSAgIGFmdGVyIGEgcmVzZXQgKi8KKwkJaWYgKGV0aF9pcnEgIT0gMHhGRkZGKSB7CisJCQlvdXR3KFBQX0NTODkyMF9JU0FJTlQsIGV0aF9uaWNfYmFzZSArIEFERF9QT1JUKTsKKwkJCW91dGIoZXRoX2lycSwgZXRoX25pY19iYXNlICsgREFUQV9QT1JUKTsKKwkJCW91dGIoMCwgZXRoX25pY19iYXNlICsgREFUQV9QT1JUICsgMSk7IH0KKworCQlpZiAoZXRoX21lbV9zdGFydCkgeworCQkJb3V0dyhQUF9DUzg5MjBfSVNBTWVtQiwgZXRoX25pY19iYXNlICsgQUREX1BPUlQpOworCQkJb3V0YigoZXRoX21lbV9zdGFydCA+PiA4KSAmIDB4ZmYsIGV0aF9uaWNfYmFzZSArIERBVEFfUE9SVCk7CisJCQlvdXRiKChldGhfbWVtX3N0YXJ0ID4+IDI0KSAmIDB4ZmYsIGV0aF9uaWNfYmFzZSArIERBVEFfUE9SVCArIDEpOyB9IH0KKworCS8qIFdhaXQgdW50aWwgdGhlIGNoaXAgaXMgcmVzZXQgKi8KKwlmb3IgKHJlc2V0X3RtbyA9IGN1cnJ0aWNrcygpICsgMjsKKwkgICAgIChyZWFkcmVnKFBQX1NlbGZTVCkgJiBJTklUX0RPTkUpID09IDAgJiYKKwkJICAgICBjdXJydGlja3MoKSA8IHJlc2V0X3RtbzsgKTsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyBhbmQgbWVtb3J5IGFjY2Vzc2VzICovCisJd3JpdGVyZWcoUFBfQnVzQ1RMLCAwKTsKKworCS8qIHNldCB0aGUgZXRoZXJuZXQgYWRkcmVzcyAqLworCWZvciAoaT0wOyBpIDwgRVRIX0FMRU4vMjsgaSsrKQorCQl3cml0ZXJlZyhQUF9JQStpKjIsCisJCQkgbmljLT5ub2RlX2FkZHJbaSoyXSB8CisJCQkgKG5pYy0+bm9kZV9hZGRyW2kqMisxXSA8PCA4KSk7CisKKwkvKiByZWNlaXZlIG9ubHkgZXJyb3IgZnJlZSBwYWNrZXRzIGFkZHJlc3NlZCB0byB0aGlzIGNhcmQgKi8KKwl3cml0ZXJlZyhQUF9SeENUTCwgREVGX1JYX0FDQ0VQVCk7CisKKwkvKiBkbyBub3QgZ2VuZXJhdGUgYW55IGludGVycnVwdHMgb24gcmVjZWl2ZSBvcGVyYXRpb25zICovCisJd3JpdGVyZWcoUFBfUnhDRkcsIDApOworCisJLyogZG8gbm90IGdlbmVyYXRlIGFueSBpbnRlcnJ1cHRzIG9uIHRyYW5zbWl0IG9wZXJhdGlvbnMgKi8KKwl3cml0ZXJlZyhQUF9UeENGRywgMCk7CisKKwkvKiBkbyBub3QgZ2VuZXJhdGUgYW55IGludGVycnVwdHMgb24gYnVmZmVyIG9wZXJhdGlvbnMgKi8KKwl3cml0ZXJlZyhQUF9CdWZDRkcsIDApOworCisJLyogcmVzZXQgYWRkcmVzcyBwb3J0LCBzbyB0aGF0IGF1dG9wcm9iaW5nIHdpbGwga2VlcCB3b3JraW5nICovCisJb3V0dyhQUF9DaGlwSUQsIGV0aF9uaWNfYmFzZSArIEFERF9QT1JUKTsKKworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitFVEhfVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGNzODl4MF90cmFuc21pdCgKKwlzdHJ1Y3QgbmljICpuaWMsCisJY29uc3QgY2hhciAqZCwJCQkvKiBEZXN0aW5hdGlvbiAqLworCXVuc2lnbmVkIGludCB0LAkJCS8qIFR5cGUgKi8KKwl1bnNpZ25lZCBpbnQgcywJCQkvKiBzaXplICovCisJY29uc3QgY2hhciAqcCkJCQkvKiBQYWNrZXQgKi8KK3sKKwl1bnNpZ25lZCBsb25nIHRtbzsKKwlpbnQgICAgICAgICAgIHNyOworCisJLyogZG9lcyB0aGlzIHNpemUgaGF2ZSB0byBiZSByb3VuZGVkPz8/IHBsZWFzZSwKKwkgICBzb21lYm9keSBoYXZlIGEgbG9vayBpbiB0aGUgc3BlY3MgKi8KKwlpZiAoKHNyID0gKChzICsgRVRIX0hMRU4gKyAxKSZ+MSkpIDwgRVRIX1pMRU4pCisJCXNyID0gRVRIX1pMRU47CisKK3JldHJ5OgorCS8qIGluaXRpYXRlIGEgdHJhbnNtaXQgc2VxdWVuY2UgKi8KKwlvdXR3KFRYX0FGVEVSX0FMTCwgZXRoX25pY19iYXNlICsgVFhfQ01EX1BPUlQpOworCW91dHcoc3IsIGV0aF9uaWNfYmFzZSArIFRYX0xFTl9QT1JUKTsKKworCS8qIFRlc3QgdG8gc2VlIGlmIHRoZSBjaGlwIGhhcyBhbGxvY2F0ZWQgbWVtb3J5IGZvciB0aGUgcGFja2V0ICovCisJaWYgKChyZWFkcmVnKFBQX0J1c1NUKSAmIFJFQURZX0ZPUl9UWF9OT1cpID09IDApIHsKKwkJLyogT29wcy4uLiB0aGlzIHNob3VsZCBub3QgaGFwcGVuISAqLworCQlwcmludGYoImNzOiB1bmFibGUgdG8gc2VuZCBwYWNrZXQ7IHJldHJ5aW5nLi4uXG4iKTsKKwkJZm9yICh0bW8gPSBjdXJydGlja3MoKSArIDUqVElDS1NfUEVSX1NFQzsgY3VycnRpY2tzKCkgPCB0bW87ICk7CisJCWNzODl4MF9yZXNldChuaWMpOworCQlnb3RvIHJldHJ5OyB9CisKKwkvKiBXcml0ZSB0aGUgY29udGVudHMgb2YgdGhlIHBhY2tldCAqLworCW91dHN3KGV0aF9uaWNfYmFzZSArIFRYX0ZSQU1FX1BPUlQsIGQsIEVUSF9BTEVOLzIpOworCW91dHN3KGV0aF9uaWNfYmFzZSArIFRYX0ZSQU1FX1BPUlQsIG5pYy0+bm9kZV9hZGRyLAorCSAgICAgIEVUSF9BTEVOLzIpOworCW91dHcoKCh0ID4+IDgpJjB4RkYpfCh0IDw8IDgpLCBldGhfbmljX2Jhc2UgKyBUWF9GUkFNRV9QT1JUKTsKKwlvdXRzdyhldGhfbmljX2Jhc2UgKyBUWF9GUkFNRV9QT1JULCBwLCAocysxKS8yKTsKKwlmb3IgKHNyID0gc3IvMiAtIChzKzEpLzIgLSBFVEhfQUxFTiAtIDE7IHNyLS0gPiAwOworCSAgICAgb3V0dygwLCBldGhfbmljX2Jhc2UgKyBUWF9GUkFNRV9QT1JUKSk7CisKKwkvKiB3YWl0IGZvciB0cmFuc2ZlciB0byBzdWNjZWVkICovCisJZm9yICh0bW8gPSBjdXJydGlja3MoKSs1KlRJQ0tTX1BFUl9TRUM7CisJICAgICAocyA9IHJlYWRyZWcoUFBfVHhFdmVudCkmfjB4MUYpID09IDAgJiYgY3VycnRpY2tzKCkgPCB0bW87KQorCQkvKiBub3RoaW5nICovIDsKKwlpZiAoKHMgJiBUWF9TRU5EX09LX0JJVFMpICE9IFRYX09LKSB7CisJCXByaW50ZigiXG50cmFuc21pc3Npb24gZXJyb3IgJSNoWFxuIiwgcyk7CisJfQorCisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0VUSF9QT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGNzODl4MF9wb2xsKHN0cnVjdCBuaWMgKm5pYykKK3sKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gcmVhZHJlZyhQUF9SeEV2ZW50KTsKKworCWlmICgoc3RhdHVzICYgUlhfT0spID09IDApCisJCXJldHVybigwKTsKKworCXN0YXR1cyA9IGludyhldGhfbmljX2Jhc2UgKyBSWF9GUkFNRV9QT1JUKTsKKwluaWMtPnBhY2tldGxlbiA9IGludyhldGhfbmljX2Jhc2UgKyBSWF9GUkFNRV9QT1JUKTsKKwlpbnN3KGV0aF9uaWNfYmFzZSArIFJYX0ZSQU1FX1BPUlQsIG5pYy0+cGFja2V0LCBuaWMtPnBhY2tldGxlbiA+PiAxKTsKKwlpZiAobmljLT5wYWNrZXRsZW4gJiAxKQorCQluaWMtPnBhY2tldFtuaWMtPnBhY2tldGxlbi0xXSA9IGludyhldGhfbmljX2Jhc2UgKyBSWF9GUkFNRV9QT1JUKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgY3M4OXgwX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQoreworCWNzODl4MF9yZXNldChuaWMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0VUSF9QUk9CRSAtIExvb2sgZm9yIGFuIGFkYXB0ZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IG5pYyAqY3M4OXgwX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlX2FkZHJzKQoreworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbmV0Y2FyZF9wb3J0bGlzdFtdID0geworI2lmZGVmCUNTX1NDQU4KKwkJQ1NfU0NBTiwKKyNlbHNlCS8qIHVzZSAiY29uc2VydmF0aXZlIiBkZWZhdWx0IHZhbHVlcyBmb3IgYXV0b3Byb2JpbmcgKi8KKwkJMHgzMDAsMHgzMjAsMHgzNDAsMHgyMDAsMHgyMjAsMHgyNDAsCisJCTB4MjYwLDB4MjgwLDB4MmEwLDB4MmMwLDB4MmUwLAorCS8qIGlmIHRoYXQgZGlkIG5vdCB3b3JrLCB0aGVuIGJlIG1vcmUgYWdncmVzc2l2ZSAqLworCQkweDMwMSwweDMyMSwweDM0MSwweDIwMSwweDIyMSwweDI0MSwKKwkJMHgyNjEsMHgyODEsMHgyYTEsMHgyYzEsMHgyZTEsCisjZW5kaWYKKwkJMH07CisKKwlpbnQgICAgICBpLCByZXN1bHQgPSAtMTsKKwl1bnNpZ25lZCByZXZfdHlwZSA9IDAsIGlvYWRkciwgaW9pZHgsIGlzYV9jbmYsIGNzX3JldmlzaW9uOworCXVuc2lnbmVkIHNob3J0IGVlcHJvbV9idWZmW0NIS1NVTV9MRU5dOworCisKKwlmb3IgKGlvaWR4ID0gMDsgKGlvYWRkcj1uZXRjYXJkX3BvcnRsaXN0W2lvaWR4KytdKSAhPSAwOyApIHsKKwkJLyogaWYgdGhleSBnaXZlIHVzIGFuIG9kZCBJL08gYWRkcmVzcywgdGhlbiBkbyBPTkUgd3JpdGUgdG8KKwkJICAgdGhlIGFkZHJlc3MgcG9ydCwgdG8gZ2V0IGl0IGJhY2sgdG8gYWRkcmVzcyB6ZXJvLCB3aGVyZSB3ZQorCQkgICBleHBlY3QgdG8gZmluZCB0aGUgRUlTQSBzaWduYXR1cmUgd29yZC4gKi8KKwkJaWYgKGlvYWRkciAmIDEpIHsKKwkJCWlvYWRkciAmPSB+MTsKKwkJCWlmICgoaW53KGlvYWRkciArIEFERF9QT1JUKSAmIEFERF9NQVNLKSAhPSBBRERfU0lHKQorCQkJCWNvbnRpbnVlOworCQkJb3V0dyhQUF9DaGlwSUQsIGlvYWRkciArIEFERF9QT1JUKTsKKwkJfQorCisJCWlmIChpbncoaW9hZGRyICsgREFUQV9QT1JUKSAhPSBDSElQX0VJU0FfSURfU0lHKQorCQkJY29udGludWU7CisJCWV0aF9uaWNfYmFzZSA9IGlvYWRkcjsKKworCQkvKiBnZXQgdGhlIGNoaXAgdHlwZSAqLworCQlyZXZfdHlwZSA9IHJlYWRyZWcoUFJPRFVDVF9JRF9BREQpOworCQlldGhfY3NfdHlwZSA9IHJldl90eXBlICZ+IFJFVklTT05fQklUUzsKKwkJY3NfcmV2aXNpb24gPSAoKHJldl90eXBlICYgUkVWSVNPTl9CSVRTKSA+PiA4KSArICdBJzsKKworCQlwcmludGYoIlxuY3M6IGNzODklYzAlcyByZXYgJWMsIGJhc2UgJSNoWCIsCisJCSAgICAgICBldGhfY3NfdHlwZT09Q1M4OTAwPycwJzonMicsCisJCSAgICAgICBldGhfY3NfdHlwZT09Q1M4OTIwTT8iTSI6IiIsCisJCSAgICAgICBjc19yZXZpc2lvbiwKKwkJICAgICAgIGV0aF9uaWNfYmFzZSk7CisKKwkJLyogRmlyc3QgY2hlY2sgdG8gc2VlIGlmIGFuIEVFUFJPTSBpcyBhdHRhY2hlZCovCisJCWlmICgocmVhZHJlZyhQUF9TZWxmU1QpICYgRUVQUk9NX1BSRVNFTlQpID09IDApIHsKKwkJCXByaW50ZigiXG5jczogbm8gRUVQUk9NLi4uXG4iKTsKKwkJCW91dHcoUFBfQ2hpcElELCBldGhfbmljX2Jhc2UgKyBBRERfUE9SVCk7CisJCQljb250aW51ZTsgfQorCQllbHNlIGlmIChnZXRfZWVwcm9tX2RhdGEoU1RBUlRfRUVQUk9NX0RBVEEsQ0hLU1VNX0xFTiwKKwkJCQkJIGVlcHJvbV9idWZmKSA8IDApIHsKKwkJCXByaW50ZigiXG5jczogRUVQUk9NIHJlYWQgZmFpbGVkLi4uXG4iKTsKKwkJCW91dHcoUFBfQ2hpcElELCBldGhfbmljX2Jhc2UgKyBBRERfUE9SVCk7CisJCQljb250aW51ZTsgfQorCQllbHNlIGlmIChnZXRfZWVwcm9tX2Noa3N1bShTVEFSVF9FRVBST01fREFUQSxDSEtTVU1fTEVOLAorCQkJCQkgICBlZXByb21fYnVmZikgPCAwKSB7CisJCQlwcmludGYoIlxuY3M6IEVFUFJPTSBjaGVja3N1bSBiYWQuLi5cbiIpOworCQkJb3V0dyhQUF9DaGlwSUQsIGV0aF9uaWNfYmFzZSArIEFERF9QT1JUKTsKKwkJCWNvbnRpbnVlOyB9CisKKwkJLyogZ2V0IHRyYW5zbWlzc2lvbiBjb250cm9sIHdvcmQgYnV0IGtlZXAgdGhlCisJCSAgIGF1dG9uZWdvdGlhdGlvbiBiaXRzICovCisJCWV0aF9hdXRvX25lZ19jbmYgPSBlZXByb21fYnVmZltBVVRPX05FR19DTkZfT0ZGU0VULzJdOworCQkvKiBTdG9yZSBhZGFwdGVyIGNvbmZpZ3VyYXRpb24gKi8KKwkJZXRoX2FkYXB0ZXJfY25mID0gZWVwcm9tX2J1ZmZbQURBUFRFUl9DTkZfT0ZGU0VULzJdOworCQkvKiBTdG9yZSBJU0EgY29uZmlndXJhdGlvbiAqLworCQlpc2FfY25mID0gZWVwcm9tX2J1ZmZbSVNBX0NORl9PRkZTRVQvMl07CisKKwkJLyogc3RvcmUgdGhlIGluaXRpYWwgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLworCQlldGhfbWVtX3N0YXJ0ID0gZWVwcm9tX2J1ZmZbUEFDS0VUX1BBR0VfT0ZGU0VULzJdIDw8IDg7CisKKwkJcHJpbnRmKCIlcyVzJXMsIGFkZHIgIiwKKwkJICAgICAgIChldGhfYWRhcHRlcl9jbmYgJiBBX0NORl8xMEJfVCk/IiwgUkotNDUiOiIiLAorCQkgICAgICAgKGV0aF9hZGFwdGVyX2NuZiAmIEFfQ05GX0FVSSk/IiwgQVVJIjoiIiwKKwkJICAgICAgIChldGhfYWRhcHRlcl9jbmYgJiBBX0NORl8xMEJfMik/IiwgQk5DIjoiIik7CisKKwkJLyogSWYgdGhpcyBpcyBhIENTODkwMCB0aGVuIG5vIHBucCBzb2Z0ICovCisJCWlmIChldGhfY3NfdHlwZSAhPSBDUzg5MDAgJiYKKwkJICAgIC8qIENoZWNrIGlmIHRoZSBJU0EgSVJRIGhhcyBiZWVuIHNldCAgKi8KKwkJICAgIChpID0gcmVhZHJlZyhQUF9DUzg5MjBfSVNBSU5UKSAmIDB4ZmYsCisJCSAgICAgKGkgIT0gMCAmJiBpIDwgQ1M4OTIwX05PX0lOVFMpKSkKKwkJCWV0aF9pcnEgPSBpOworCQllbHNlIHsKKwkJCWkgPSBpc2FfY25mICYgSU5UX05PX01BU0s7CisJCQlpZiAoZXRoX2NzX3R5cGUgPT0gQ1M4OTAwKSB7CisJCQkJLyogdGhlIHRhYmxlIHRoYXQgZm9sbG93cyBpcyBkZXBlbmRlbnQKKwkJCQkgICB1cG9uIGhvdyB5b3Ugd2lyZWQgdXAgeW91ciBjczg5MDAKKwkJCQkgICBpbiB5b3VyIHN5c3RlbS4gIFRoZSB0YWJsZSBpcyB0aGUKKwkJCQkgICBzYW1lIGFzIHRoZSBjczg5MDAgZW5naW5lZXJpbmcgZGVtbworCQkJCSAgIGJvYXJkLiAgaXJxX21hcCBhbHNvIGRlcGVuZHMgb24gdGhlCisJCQkJICAgY29udGVudHMgb2YgdGhlIHRhYmxlLiAgQWxzbyBzZWUKKwkJCQkgICB3cml0ZV9pcnEsIHdoaWNoIGlzIHRoZSByZXZlcnNlCisJCQkJICAgbWFwcGluZyBvZiB0aGUgdGFibGUgYmVsb3cuICovCisJCQkJaWYgKGkgPCA0KSBpID0gIlwwMTJcMDEzXDAxNFwwMDUiW2ldOworCQkJCWVsc2UgcHJpbnRmKCJcbmNzOiBCVUc6IGlzYV9jb25maWcgaXMgJWRcbiIsIGkpOyB9CisJCQlldGhfaXJxID0gaTsgfQorCisJCS8qIFJldHJpZXZlIGFuZCBwcmludCB0aGUgZXRoZXJuZXQgYWRkcmVzcy4gKi8KKwkJZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykgeworCQkJbmljLT5ub2RlX2FkZHJbaV0gPSAoKHVuc2lnbmVkIGNoYXIgKillZXByb21fYnVmZilbaV07CisJCX0KKwkJcHJpbnRmKCIlIVxuIiwgbmljLT5ub2RlX2FkZHIpOworCisJCS8qIFNldCB0aGUgTGluZUNUTCBxdWludHVwbGV0IGJhc2VkIG9uIGFkYXB0ZXIKKwkJICAgY29uZmlndXJhdGlvbiByZWFkIGZyb20gRUVQUk9NICovCisJCWlmICgoZXRoX2FkYXB0ZXJfY25mICYgQV9DTkZfRVhUTkRfMTBCXzIpICYmCisJCSAgICAoZXRoX2FkYXB0ZXJfY25mICYgQV9DTkZfTE9XX1JYX1NRVUVMQ0gpKQorCQkJZXRoX2xpbmVjdGwgPSBMT1dfUlhfU1FVRUxDSDsKKwkJZWxzZQorCQkJZXRoX2xpbmVjdGwgPSAwOworCisJCS8qIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXkgaGF2ZSB0aGUgInJpZ2h0IgorCQkgICBoYXJkd2FyZSBhdmFpbGFibGUgKi8KKwkJc3dpdGNoKGV0aF9hZGFwdGVyX2NuZiAmIEFfQ05GX01FRElBX1RZUEUpIHsKKwkJY2FzZSBBX0NORl9NRURJQV8xMEJfVDogcmVzdWx0ID0gZXRoX2FkYXB0ZXJfY25mICYgQV9DTkZfMTBCX1Q7CisJCQlicmVhazsKKwkJY2FzZSBBX0NORl9NRURJQV9BVUk6ICAgcmVzdWx0ID0gZXRoX2FkYXB0ZXJfY25mICYgQV9DTkZfQVVJOworCQkJYnJlYWs7CisJCWNhc2UgQV9DTkZfTUVESUFfMTBCXzI6IHJlc3VsdCA9IGV0aF9hZGFwdGVyX2NuZiAmIEFfQ05GXzEwQl8yOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IHJlc3VsdCA9IGV0aF9hZGFwdGVyX2NuZiAmIChBX0NORl8xMEJfVCB8IEFfQ05GX0FVSSB8CisJCQkJCQkgICAgIEFfQ05GXzEwQl8yKTsKKwkJfQorCQlpZiAoIXJlc3VsdCkgeworCQkJcHJpbnRmKCJjczogRUVQUk9NIGlzIGNvbmZpZ3VyZWQgZm9yIHVuYXZhaWxhYmxlIG1lZGlhXG4iKTsKKwkJZXJyb3I6CisJCQl3cml0ZXJlZyhQUF9MaW5lQ1RMLCByZWFkcmVnKFBQX0xpbmVDVEwpICYKKwkJCQkgfihTRVJJQUxfVFhfT04gfCBTRVJJQUxfUlhfT04pKTsKKwkJCW91dHcoUFBfQ2hpcElELCBldGhfbmljX2Jhc2UgKyBBRERfUE9SVCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIEluaXRpYWxpemUgdGhlIGNhcmQgZm9yIHByb2Jpbmcgb2YgdGhlIGF0dGFjaGVkIG1lZGlhICovCisJCWNzODl4MF9yZXNldChuaWMpOworCisJCS8qIHNldCB0aGUgaGFyZHdhcmUgdG8gdGhlIGNvbmZpZ3VyZWQgY2hvaWNlICovCisJCXN3aXRjaChldGhfYWRhcHRlcl9jbmYgJiBBX0NORl9NRURJQV9UWVBFKSB7CisJCWNhc2UgQV9DTkZfTUVESUFfMTBCX1Q6CisJCQlyZXN1bHQgPSBkZXRlY3RfdHAoKTsKKwkJCWlmICghcmVzdWx0KSB7CisJCQkJY2xybGluZSgpOworCQkJCXByaW50ZigiMTBCYXNlLVQgKFJKLTQ1JXMiLAorCQkJCSAgICAgICAiKSBoYXMgbm8gY2FibGVcbiIpOyB9CisJCQkvKiBjaGVjayAiaWdub3JlIG1pc3NpbmcgbWVkaWEiIGJpdCAqLworCQkJaWYgKGV0aF9hdXRvX25lZ19jbmYgJiBJTU1fQklUKQorCQkJCS8qIFllcyEgSSBkb24ndCBjYXJlIGlmIEkgc2VlIGEgbGluayBwdWxzZSAqLworCQkJCXJlc3VsdCA9IEFfQ05GX01FRElBXzEwQl9UOworCQkJYnJlYWs7CisJCWNhc2UgQV9DTkZfTUVESUFfQVVJOgorCQkJcmVzdWx0ID0gZGV0ZWN0X2F1aShuaWMpOworCQkJaWYgKCFyZXN1bHQpIHsKKwkJCQljbHJsaW5lKCk7CisJCQkJcHJpbnRmKCIxMEJhc2UtNSAoQVVJJXMiLAorCQkJCSAgICAgICAiKSBoYXMgbm8gY2FibGVcbiIpOyB9CisJCQkvKiBjaGVjayAiaWdub3JlIG1pc3NpbmcgbWVkaWEiIGJpdCAqLworCQkJaWYgKGV0aF9hdXRvX25lZ19jbmYgJiBJTU1fQklUKQorCQkJCS8qIFllcyEgSSBkb24ndCBjYXJlIGlmIEkgc2VlIGEgY2FycnJpZXIgKi8KKwkJCQlyZXN1bHQgPSBBX0NORl9NRURJQV9BVUk7CisJCQlicmVhazsKKwkJY2FzZSBBX0NORl9NRURJQV8xMEJfMjoKKwkJCXJlc3VsdCA9IGRldGVjdF9ibmMobmljKTsKKwkJCWlmICghcmVzdWx0KSB7CisJCQkJY2xybGluZSgpOworCQkJCXByaW50ZigiMTBCYXNlLTIgKEJOQyVzIiwKKwkJCQkgICAgICAgIikgaGFzIG5vIGNhYmxlXG4iKTsgfQorCQkJLyogY2hlY2sgImlnbm9yZSBtaXNzaW5nIG1lZGlhIiBiaXQgKi8KKwkJCWlmIChldGhfYXV0b19uZWdfY25mICYgSU1NX0JJVCkKKwkJCQkvKiBZZXMhIEkgZG9uJ3QgY2FyZSBpZiBJIGNhbiB4bWl0IGEgcGFja2V0ICovCisJCQkJcmVzdWx0ID0gQV9DTkZfTUVESUFfMTBCXzI7CisJCQlicmVhazsKKwkJY2FzZSBBX0NORl9NRURJQV9BVVRPOgorCQkJd3JpdGVyZWcoUFBfTGluZUNUTCwgZXRoX2xpbmVjdGwgfCBBVVRPX0FVSV8xMEJBU0VUKTsKKwkJCWlmIChldGhfYWRhcHRlcl9jbmYgJiBBX0NORl8xMEJfVCkKKwkJCQlpZiAoKHJlc3VsdCA9IGRldGVjdF90cCgpKSAhPSAwKQorCQkJCQlicmVhazsKKwkJCWlmIChldGhfYWRhcHRlcl9jbmYgJiBBX0NORl9BVUkpCisJCQkJaWYgKChyZXN1bHQgPSBkZXRlY3RfYXVpKG5pYykpICE9IDApCisJCQkJCWJyZWFrOworCQkJaWYgKGV0aF9hZGFwdGVyX2NuZiAmIEFfQ05GXzEwQl8yKQorCQkJCWlmICgocmVzdWx0ID0gZGV0ZWN0X2JuYyhuaWMpKSAhPSAwKQorCQkJCQlicmVhazsKKwkJCWNscmxpbmUoKTsgcHJpbnRmKCJubyBtZWRpYSBkZXRlY3RlZFxuIik7CisJCQlnb3RvIGVycm9yOworCQl9CisJCWNscmxpbmUoKTsKKwkJc3dpdGNoKHJlc3VsdCkgeworCQljYXNlIDA6ICAgICAgICAgICAgICAgICBwcmludGYoIm5vIG5ldHdvcmsgY2FibGUgYXR0YWNoZWQgdG8gY29uZmlndXJlZCBtZWRpYVxuIik7CisJCQlnb3RvIGVycm9yOworCQljYXNlIEFfQ05GX01FRElBXzEwQl9UOiBwcmludGYoInVzaW5nIDEwQmFzZS1UIChSSi00NSlcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgQV9DTkZfTUVESUFfQVVJOiAgIHByaW50ZigidXNpbmcgMTBCYXNlLTUgKEFVSSlcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgQV9DTkZfTUVESUFfMTBCXzI6IHByaW50ZigidXNpbmcgMTBCYXNlLTIgKEJOQylcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBUdXJuIG9uIGJvdGggcmVjZWl2ZSBhbmQgdHJhbnNtaXQgb3BlcmF0aW9ucyAqLworCQl3cml0ZXJlZyhQUF9MaW5lQ1RMLCByZWFkcmVnKFBQX0xpbmVDVEwpIHwgU0VSSUFMX1JYX09OIHwKKwkJCSBTRVJJQUxfVFhfT04pOworCisJCWJyZWFrOworCX0KKworCWlmIChpb2FkZHIgPT0gMCkKKwkJcmV0dXJuICgwKTsKKwluaWMtPnJlc2V0ID0gY3M4OXgwX3Jlc2V0OworCW5pYy0+cG9sbCA9IGNzODl4MF9wb2xsOworCW5pYy0+dHJhbnNtaXQgPSBjczg5eDBfdHJhbnNtaXQ7CisJbmljLT5kaXNhYmxlID0gY3M4OXgwX2Rpc2FibGU7CisJcmV0dXJuIChuaWMpOworfQorCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KKwpkaWZmIC0tZ2l0IGEvbmV0Ym9vdC9jczg5eDAuaCBiL25ldGJvb3QvY3M4OXgwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE4MDZmNAotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvY3M4OXgwLmgKQEAgLTAsMCArMSw0NjEgQEAKKy8qICBDb3B5cmlnaHQsIDE5ODgtMTk5MiwgUnVzc2VsbCBOZWxzb24sIENyeW53ciBTb2Z0d2FyZQorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCisKKyNkZWZpbmUgUFBfQ2hpcElEIDB4MDAwMAkvKiBvZmZzZXQgICAwaCAtPiBDb3JwIC1JRCAgICAgICAgICAgICAgKi8KKwkJCQkvKiBvZmZzZXQgICAyaCAtPiBNb2RlbC9Qcm9kdWN0IE51bWJlciAgKi8KKwkJCQkvKiBvZmZzZXQgICAzaCAtPiBDaGlwIFJldmlzaW9uIE51bWJlciAgKi8KKworI2RlZmluZSBQUF9JU0FJT0IgMHgwMDIwCS8qICBJTyBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUFBfQ1M4OTAwX0lTQUlOVCAweDAwMjIJLyogIElTQSBpbnRlcnJ1cHQgc2VsZWN0ICovCisjZGVmaW5lIFBQX0NTODkyMF9JU0FJTlQgMHgwMzcwCS8qICBJU0EgaW50ZXJydXB0IHNlbGVjdCAqLworI2RlZmluZSBQUF9DUzg5MDBfSVNBRE1BIDB4MDAyNAkvKiAgSVNBIFJlYyBETUEgY2hhbm5lbCAqLworI2RlZmluZSBQUF9DUzg5MjBfSVNBRE1BIDB4MDM3NAkvKiAgSVNBIFJlYyBETUEgY2hhbm5lbCAqLworI2RlZmluZSBQUF9JU0FTT0YgMHgwMDI2CS8qICBJU0EgRE1BIG9mZnNldCAqLworI2RlZmluZSBQUF9EbWFGcmFtZUNudCAweDAwMjgJLyogIElTQSBETUEgRnJhbWUgY291bnQgKi8KKyNkZWZpbmUgUFBfRG1hQnl0ZUNudCAweDAwMkEJLyogIElTQSBETUEgQnl0ZSBjb3VudCAqLworI2RlZmluZSBQUF9DUzg5MDBfSVNBTWVtQiAweDAwMkMJLyogIE1lbW9yeSBiYXNlICovCisjZGVmaW5lIFBQX0NTODkyMF9JU0FNZW1CIDB4MDM0OCAvKiAgKi8KKworI2RlZmluZSBQUF9JU0FCb290QmFzZSAweDAwMzAJLyogIEJvb3QgUHJvbSBiYXNlICAqLworI2RlZmluZSBQUF9JU0FCb290TWFzayAweDAwMzQJLyogIEJvb3QgUHJvbSBNYXNrICovCisKKy8qIEVFUFJPTSBkYXRhIGFuZCBjb21tYW5kIHJlZ2lzdGVycyAqLworI2RlZmluZSBQUF9FRUNNRCAweDAwNDAJCS8qICBOVlIgSW50ZXJmYWNlIENvbW1hbmQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFBfRUVEYXRhIDB4MDA0MgkvKiAgTlZSIEludGVyZmFjZSBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lIFBQX0RlYnVnUmVnIDB4MDA0NAkvKiAgRGVidWcgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBQUF9SeENGRyAweDAxMDIJCS8qICBSeCBCdXMgY29uZmlnICovCisjZGVmaW5lIFBQX1J4Q1RMIDB4MDEwNAkJLyogIFJlY2VpdmUgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBQUF9UeENGRyAweDAxMDYJCS8qICBUcmFuc21pdCBDb25maWcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFBfVHhDTUQgMHgwMTA4CQkvKiAgVHJhbnNtaXQgQ29tbWFuZCBSZWdpc3RlciAqLworI2RlZmluZSBQUF9CdWZDRkcgMHgwMTBBCS8qICBCdXMgY29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBQUF9MaW5lQ1RMIDB4MDExMgkvKiAgTGluZSBDb25maWcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFBfU2VsZkNUTCAweDAxMTQJLyogIFNlbGYgQ29tbWFuZCBSZWdpc3RlciAqLworI2RlZmluZSBQUF9CdXNDVEwgMHgwMTE2CS8qICBJU0EgYnVzIGNvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFBfVGVzdENUTCAweDAxMTgJLyogIFRlc3QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFBfQXV0b05lZ0NUTCAweDAxMUMJLyogIEF1dG8gTmVnb3RpYXRpb24gQ3RybCAqLworCisjZGVmaW5lIFBQX0lTUSAweDAxMjAJCS8qICBJbnRlcnJ1cHQgU3RhdHVzICovCisjZGVmaW5lIFBQX1J4RXZlbnQgMHgwMTI0CS8qICBSeCBFdmVudCBSZWdpc3RlciAqLworI2RlZmluZSBQUF9UeEV2ZW50IDB4MDEyOAkvKiAgVHggRXZlbnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFBfQnVmRXZlbnQgMHgwMTJDCS8qICBCdXMgRXZlbnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFBfUnhNaXNzIDB4MDEzMAkvKiAgUmVjZWl2ZSBNaXNzIENvdW50ICovCisjZGVmaW5lIFBQX1R4Q29sIDB4MDEzMgkJLyogIFRyYW5zbWl0IENvbGxpc2lvbiBDb3VudCAqLworI2RlZmluZSBQUF9MaW5lU1QgMHgwMTM0CS8qICBMaW5lIFN0YXRlIFJlZ2lzdGVyICovCisjZGVmaW5lIFBQX1NlbGZTVCAweDAxMzYJLyogIFNlbGYgU3RhdGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFBfQnVzU1QgMHgwMTM4CQkvKiAgQnVzIFN0YXR1cyAqLworI2RlZmluZSBQUF9URFIgMHgwMTNDCQkvKiAgVGltZSBEb21haW4gUmVmbGVjdG9tZXRyeSAqLworI2RlZmluZSBQUF9BdXRvTmVnU1QgMHgwMTNFCS8qICBBdXRvIE5lZyBTdGF0dXMgKi8KKyNkZWZpbmUgUFBfVHhDb21tYW5kIDB4MDE0NAkvKiAgVHggQ29tbWFuZCAqLworI2RlZmluZSBQUF9UeExlbmd0aCAweDAxNDYJLyogIFR4IExlbmd0aCAqLworI2RlZmluZSBQUF9MQUYgMHgwMTUwCQkvKiAgSGFzaCBUYWJsZSAqLworI2RlZmluZSBQUF9JQSAweDAxNTgJCS8qICBQaHlzaWNhbCBBZGRyZXNzIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgUFBfUnhTdGF0dXMgMHgwNDAwCS8qICBSZWNlaXZlIHN0YXJ0IG9mIGZyYW1lICovCisjZGVmaW5lIFBQX1J4TGVuZ3RoIDB4MDQwMgkvKiAgUmVjZWl2ZSBMZW5ndGggb2YgZnJhbWUgKi8KKyNkZWZpbmUgUFBfUnhGcmFtZSAweDA0MDQJLyogIFJlY2VpdmUgZnJhbWUgcG9pbnRlciAqLworI2RlZmluZSBQUF9UeEZyYW1lIDB4MEEwMAkvKiAgVHJhbnNtaXQgZnJhbWUgcG9pbnRlciAqLworCisvKiAgUHJpbWFyeSBJL08gQmFzZSBBZGRyZXNzLiBJZiBubyBJL08gYmFzZSBpcyBzdXBwbGllZCBieSB0aGUgdXNlciwgdGhlbiB0aGlzICovCisvKiAgY2FuIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgSS9PIGJhc2UgdG8gYWNjZXNzIHRoZSBQYWNrZXRQYWdlIEFyZWEuICovCisjZGVmaW5lIERFRkFVTFRJT0JBU0UgMHgwMzAwCisjZGVmaW5lIEZJUlNUX0lPIDB4MDIwQwkJLyogIEZpcnN0IEkvTyBwb3J0IHRvIGNoZWNrICovCisjZGVmaW5lIExBU1RfSU8gMHgwMzdDCQkvKiAgTGFzdCBJL08gcG9ydCB0byBjaGVjayAoKzEwaCkgKi8KKyNkZWZpbmUgQUREX01BU0sgMHgzMDAwCQkvKiAgTWFzayBpdCB1c2Ugb2YgdGhlIEFERF9QT1JUIHJlZ2lzdGVyICovCisjZGVmaW5lIEFERF9TSUcgMHgzMDAwCQkvKiAgRXhwZWN0ZWQgSUQgc2lnbmF0dXJlICovCisKKyNkZWZpbmUgQ0hJUF9FSVNBX0lEX1NJRyAweDYzMEUgICAvKiAgUHJvZHVjdCBJRCBDb2RlIGZvciBDcnlzdGFsIENoaXAgKENTODkwMCBzcGVjIDQuMykgKi8KKworI2lmZGVmCUlCTUVJUEtUCisjZGVmaW5lIEVJU0FfSURfU0lHIDB4NEQyNAkvKiAgSUJNICovCisjZGVmaW5lIFBBUlRfTk9fU0lHIDB4MTAxMAkvKiAgSUJNICovCisjZGVmaW5lIE1PTkdPT1NFX0JJVCAweDAwMDAJLyogIElCTSAqLworI2Vsc2UKKyNkZWZpbmUgRUlTQV9JRF9TSUcgMHg2MzBFCS8qICBQblAgVmVuZG9yIElEIChzYW1lIGFzIGNoaXAgaWQgZm9yIENyeXN0YWwgYm9hcmQpICovCisjZGVmaW5lIFBBUlRfTk9fU0lHIDB4NDAwMAkvKiAgSUQgY29kZSBDUzg5MjAgYm9hcmQgKFBuUCBWZW5kb3IgUHJvZHVjdCBjb2RlKSAqLworI2RlZmluZSBNT05HT09TRV9CSVQgMHgyMDAwCS8qICBQQVJUX05PX1NJRyArIE1PTkdPT1NFX0JVVCA9PiBJRCBvZiBtb25nb29zZSAqLworI2VuZGlmCisKKyNkZWZpbmUgUFJPRFVDVF9JRF9BREQgMHgwMDAyICAgLyogIEFkZHJlc3Mgb2YgcHJvZHVjdCBJRCAqLworCisvKiAgTWFzayB0byBmaW5kIG91dCB0aGUgdHlwZXMgb2YgIHJlZ2lzdGVycyAqLworI2RlZmluZSBSRUdfVFlQRV9NQVNLIDB4MDAxRgorCisvKiAgRWVwcm9tIENvbW1hbmRzICovCisjZGVmaW5lIEVSU0VfV1JfRU5CTCAweDAwRjAKKyNkZWZpbmUgRVJTRV9XUl9ESVNBQkxFIDB4MDAwMAorCisvKiAgRGVmaW5lcyBDb250cm9sL0NvbmZpZyByZWdpc3RlciBxdWludHVwbGV0IG51bWJlcnMgKi8KKyNkZWZpbmUgUlhfQlVGX0NGRyAweDAwMDMKKyNkZWZpbmUgUlhfQ09OVFJPTCAweDAwMDUKKyNkZWZpbmUgVFhfQ0ZHIDB4MDAwNworI2RlZmluZSBUWF9DT01NQU5EIDB4MDAwOQorI2RlZmluZSBCVUZfQ0ZHIDB4MDAwQgorI2RlZmluZSBMSU5FX0NPTlRST0wgMHgwMDEzCisjZGVmaW5lIFNFTEZfQ09OVFJPTCAweDAwMTUKKyNkZWZpbmUgQlVTX0NPTlRST0wgMHgwMDE3CisjZGVmaW5lIFRFU1RfQ09OVFJPTCAweDAwMTkKKworLyogIERlZmluZXMgU3RhdHVzL0NvdW50IHJlZ2lzdGVycyBxdWludHVwbGV0IG51bWJlcnMgKi8KKyNkZWZpbmUgUlhfRVZFTlQgMHgwMDA0CisjZGVmaW5lIFRYX0VWRU5UIDB4MDAwOAorI2RlZmluZSBCVUZfRVZFTlQgMHgwMDBDCisjZGVmaW5lIFJYX01JU1NfQ09VTlQgMHgwMDEwCisjZGVmaW5lIFRYX0NPTF9DT1VOVCAweDAwMTIKKyNkZWZpbmUgTElORV9TVEFUVVMgMHgwMDE0CisjZGVmaW5lIFNFTEZfU1RBVFVTIDB4MDAxNgorI2RlZmluZSBCVVNfU1RBVFVTIDB4MDAxOAorI2RlZmluZSBURFIgMHgwMDFDCisKKy8qIFBQX1J4Q0ZHIC0gUmVjZWl2ZSAgQ29uZmlndXJhdGlvbiBhbmQgSW50ZXJydXB0IE1hc2sgYml0IGRlZmluaXRpb24gLSAgUmVhZC93cml0ZSAqLworI2RlZmluZSBTS0lQXzEgMHgwMDQwCisjZGVmaW5lIFJYX1NUUkVBTV9FTkJMIDB4MDA4MAorI2RlZmluZSBSWF9PS19FTkJMIDB4MDEwMAorI2RlZmluZSBSWF9ETUFfT05MWSAweDAyMDAKKyNkZWZpbmUgQVVUT19SWF9ETUEgMHgwNDAwCisjZGVmaW5lIEJVRkZFUl9DUkMgMHgwODAwCisjZGVmaW5lIFJYX0NSQ19FUlJPUl9FTkJMIDB4MTAwMAorI2RlZmluZSBSWF9SVU5UX0VOQkwgMHgyMDAwCisjZGVmaW5lIFJYX0VYVFJBX0RBVEFfRU5CTCAweDQwMDAKKworLyogUFBfUnhDVEwgLSBSZWNlaXZlIENvbnRyb2wgYml0IGRlZmluaXRpb24gLSBSZWFkL3dyaXRlICovCisjZGVmaW5lIFJYX0lBX0hBU0hfQUNDRVBUIDB4MDA0MAorI2RlZmluZSBSWF9QUk9NX0FDQ0VQVCAweDAwODAKKyNkZWZpbmUgUlhfT0tfQUNDRVBUIDB4MDEwMAorI2RlZmluZSBSWF9NVUxUQ0FTVF9BQ0NFUFQgMHgwMjAwCisjZGVmaW5lIFJYX0lBX0FDQ0VQVCAweDA0MDAKKyNkZWZpbmUgUlhfQlJPQURDQVNUX0FDQ0VQVCAweDA4MDAKKyNkZWZpbmUgUlhfQkFEX0NSQ19BQ0NFUFQgMHgxMDAwCisjZGVmaW5lIFJYX1JVTlRfQUNDRVBUIDB4MjAwMAorI2RlZmluZSBSWF9FWFRSQV9EQVRBX0FDQ0VQVCAweDQwMDAKKyNkZWZpbmUgUlhfQUxMX0FDQ0VQVCAoUlhfUFJPTV9BQ0NFUFR8UlhfQkFEX0NSQ19BQ0NFUFR8UlhfUlVOVF9BQ0NFUFR8UlhfRVhUUkFfREFUQV9BQ0NFUFQpCisvKiAgRGVmYXVsdCByZWNlaXZlIG1vZGUgLSBpbmRpdmlkdWFsbHkgYWRkcmVzc2VkLCBicm9hZGNhc3QsIGFuZCBlcnJvciBmcmVlICovCisjZGVmaW5lIERFRl9SWF9BQ0NFUFQgKFJYX0lBX0FDQ0VQVCB8IFJYX0JST0FEQ0FTVF9BQ0NFUFQgfCBSWF9PS19BQ0NFUFQpCisKKy8qIFBQX1R4Q0ZHIC0gVHJhbnNtaXQgQ29uZmlndXJhdGlvbiBJbnRlcnJ1cHQgTWFzayBiaXQgZGVmaW5pdGlvbiAtIFJlYWQvd3JpdGUgKi8KKyNkZWZpbmUgVFhfTE9TVF9DUlNfRU5CTCAweDAwNDAKKyNkZWZpbmUgVFhfU1FFX0VSUk9SX0VOQkwgMHgwMDgwCisjZGVmaW5lIFRYX09LX0VOQkwgMHgwMTAwCisjZGVmaW5lIFRYX0xBVEVfQ09MX0VOQkwgMHgwMjAwCisjZGVmaW5lIFRYX0pCUl9FTkJMIDB4MDQwMAorI2RlZmluZSBUWF9BTllfQ09MX0VOQkwgMHgwODAwCisjZGVmaW5lIFRYXzE2X0NPTF9FTkJMIDB4ODAwMAorCisvKiBQUF9UeENNRCAtIFRyYW5zbWl0IENvbW1hbmQgYml0IGRlZmluaXRpb24gLSBSZWFkLW9ubHkgKi8KKyNkZWZpbmUgVFhfU1RBUlRfNF9CWVRFUyAweDAwMDAKKyNkZWZpbmUgVFhfU1RBUlRfNjRfQllURVMgMHgwMDQwCisjZGVmaW5lIFRYX1NUQVJUXzEyOF9CWVRFUyAweDAwODAKKyNkZWZpbmUgVFhfU1RBUlRfQUxMX0JZVEVTIDB4MDBDMAorI2RlZmluZSBUWF9GT1JDRSAweDAxMDAKKyNkZWZpbmUgVFhfT05FX0NPTCAweDAyMDAKKyNkZWZpbmUgVFhfVFdPX1BBUlRfREVGRl9ESVNBQkxFIDB4MDQwMAorI2RlZmluZSBUWF9OT19DUkMgMHgxMDAwCisjZGVmaW5lIFRYX1JVTlQgMHgyMDAwCisKKy8qIFBQX0J1ZkNGRyAtIEJ1ZmZlciBDb25maWd1cmF0aW9uIEludGVycnVwdCBNYXNrIGJpdCBkZWZpbml0aW9uIC0gUmVhZC93cml0ZSAqLworI2RlZmluZSBHRU5FUkFURV9TV19JTlRFUlJVUFQgMHgwMDQwCisjZGVmaW5lIFJYX0RNQV9FTkJMIDB4MDA4MAorI2RlZmluZSBSRUFEWV9GT1JfVFhfRU5CTCAweDAxMDAKKyNkZWZpbmUgVFhfVU5ERVJSVU5fRU5CTCAweDAyMDAKKyNkZWZpbmUgUlhfTUlTU19FTkJMIDB4MDQwMAorI2RlZmluZSBSWF8xMjhfQllURV9FTkJMIDB4MDgwMAorI2RlZmluZSBUWF9DT0xfQ09VTlRfT1ZSRkxPV19FTkJMIDB4MTAwMAorI2RlZmluZSBSWF9NSVNTX0NPVU5UX09WUkZMT1dfRU5CTCAweDIwMDAKKyNkZWZpbmUgUlhfREVTVF9NQVRDSF9FTkJMIDB4ODAwMAorCisvKiBQUF9MaW5lQ1RMIC0gTGluZSBDb250cm9sIGJpdCBkZWZpbml0aW9uIC0gUmVhZC93cml0ZSAqLworI2RlZmluZSBTRVJJQUxfUlhfT04gMHgwMDQwCisjZGVmaW5lIFNFUklBTF9UWF9PTiAweDAwODAKKyNkZWZpbmUgQVVJX09OTFkgMHgwMTAwCisjZGVmaW5lIEFVVE9fQVVJXzEwQkFTRVQgMHgwMjAwCisjZGVmaW5lIE1PRElGSUVEX0JBQ0tPRkYgMHgwODAwCisjZGVmaW5lIE5PX0FVVE9fUE9MQVJJVFkgMHgxMDAwCisjZGVmaW5lIFRXT19QQVJUX0RFRkRJUyAweDIwMDAKKyNkZWZpbmUgTE9XX1JYX1NRVUVMQ0ggMHg0MDAwCisKKy8qIFBQX1NlbGZDVEwgLSBTb2Z0d2FyZSBTZWxmIENvbnRyb2wgYml0IGRlZmluaXRpb24gLSBSZWFkL3dyaXRlICovCisjZGVmaW5lIFBPV0VSX09OX1JFU0VUIDB4MDA0MAorI2RlZmluZSBTV19TVE9QIDB4MDEwMAorI2RlZmluZSBTTEVFUF9PTiAweDAyMDAKKyNkZWZpbmUgQVVUT19XQUtFVVAgMHgwNDAwCisjZGVmaW5lIEhDQjBfRU5CTCAweDEwMDAKKyNkZWZpbmUgSENCMV9FTkJMIDB4MjAwMAorI2RlZmluZSBIQ0IwIDB4NDAwMAorI2RlZmluZSBIQ0IxIDB4ODAwMAorCisvKiBQUF9CdXNDVEwgLSBJU0EgQnVzIENvbnRyb2wgYml0IGRlZmluaXRpb24gLSBSZWFkL3dyaXRlICovCisjZGVmaW5lIFJFU0VUX1JYX0RNQSAweDAwNDAKKyNkZWZpbmUgTUVNT1JZX09OIDB4MDQwMAorI2RlZmluZSBETUFfQlVSU1RfTU9ERSAweDA4MDAKKyNkZWZpbmUgSU9fQ0hBTk5FTF9SRUFEWV9PTiAweDEwMDAKKyNkZWZpbmUgUlhfRE1BX1NJWkVfNjRLIDB4MjAwMAorI2RlZmluZSBFTkFCTEVfSVJRIDB4ODAwMAorCisvKiBQUF9UZXN0Q1RMIC0gVGVzdCBDb250cm9sIGJpdCBkZWZpbml0aW9uIC0gUmVhZC93cml0ZSAqLworI2RlZmluZSBMSU5LX09GRiAweDAwODAKKyNkZWZpbmUgRU5ERUNfTE9PUEJBQ0sgMHgwMjAwCisjZGVmaW5lIEFVSV9MT09QQkFDSyAweDA0MDAKKyNkZWZpbmUgQkFDS09GRl9PRkYgMHgwODAwCisjZGVmaW5lIEZBU1RfVEVTVCAweDgwMDAKKworLyogUFBfUnhFdmVudCAtIFJlY2VpdmUgRXZlbnQgQml0IGRlZmluaXRpb24gLSBSZWFkLW9ubHkgKi8KKyNkZWZpbmUgUlhfSUFfSEFTSEVEIDB4MDA0MAorI2RlZmluZSBSWF9EUklCQkxFIDB4MDA4MAorI2RlZmluZSBSWF9PSyAweDAxMDAKKyNkZWZpbmUgUlhfSEFTSEVEIDB4MDIwMAorI2RlZmluZSBSWF9JQSAweDA0MDAKKyNkZWZpbmUgUlhfQlJPQURDQVNUIDB4MDgwMAorI2RlZmluZSBSWF9DUkNfRVJST1IgMHgxMDAwCisjZGVmaW5lIFJYX1JVTlQgMHgyMDAwCisjZGVmaW5lIFJYX0VYVFJBX0RBVEEgMHg0MDAwCisKKyNkZWZpbmUgSEFTSF9JTkRFWF9NQVNLIDB4MEZDMDAKKworLyogUFBfVHhFdmVudCAtIFRyYW5zbWl0IEV2ZW50IEJpdCBkZWZpbml0aW9uIC0gUmVhZC1vbmx5ICovCisjZGVmaW5lIFRYX0xPU1RfQ1JTIDB4MDA0MAorI2RlZmluZSBUWF9TUUVfRVJST1IgMHgwMDgwCisjZGVmaW5lIFRYX09LIDB4MDEwMAorI2RlZmluZSBUWF9MQVRFX0NPTCAweDAyMDAKKyNkZWZpbmUgVFhfSkJSIDB4MDQwMAorI2RlZmluZSBUWF8xNl9DT0wgMHg4MDAwCisjZGVmaW5lIFRYX1NFTkRfT0tfQklUUyAoVFhfT0t8VFhfTE9TVF9DUlMpCisjZGVmaW5lIFRYX0NPTF9DT1VOVF9NQVNLIDB4NzgwMAorCisvKiBQUF9CdWZFdmVudCAtIEJ1ZmZlciBFdmVudCBCaXQgZGVmaW5pdGlvbiAtIFJlYWQtb25seSAqLworI2RlZmluZSBTV19JTlRFUlJVUFQgMHgwMDQwCisjZGVmaW5lIFJYX0RNQSAweDAwODAKKyNkZWZpbmUgUkVBRFlfRk9SX1RYIDB4MDEwMAorI2RlZmluZSBUWF9VTkRFUlJVTiAweDAyMDAKKyNkZWZpbmUgUlhfTUlTUyAweDA0MDAKKyNkZWZpbmUgUlhfMTI4X0JZVEUgMHgwODAwCisjZGVmaW5lIFRYX0NPTF9PVlJGTFcgMHgxMDAwCisjZGVmaW5lIFJYX01JU1NfT1ZSRkxXIDB4MjAwMAorI2RlZmluZSBSWF9ERVNUX01BVENIIDB4ODAwMAorCisvKiBQUF9MaW5lU1QgLSBFdGhlcm5ldCBMaW5lIFN0YXR1cyBiaXQgZGVmaW5pdGlvbiAtIFJlYWQtb25seSAqLworI2RlZmluZSBMSU5LX09LIDB4MDA4MAorI2RlZmluZSBBVUlfT04gMHgwMTAwCisjZGVmaW5lIFRFTkJBU0VUX09OIDB4MDIwMAorI2RlZmluZSBQT0xBUklUWV9PSyAweDEwMDAKKyNkZWZpbmUgQ1JTX09LIDB4NDAwMAorCisvKiBQUF9TZWxmU1QgLSBDaGlwIFNvZnR3YXJlIFN0YXR1cyBiaXQgZGVmaW5pdGlvbiAqLworI2RlZmluZSBBQ1RJVkVfMzNWIDB4MDA0MAorI2RlZmluZSBJTklUX0RPTkUgMHgwMDgwCisjZGVmaW5lIFNJX0JVU1kgMHgwMTAwCisjZGVmaW5lIEVFUFJPTV9QUkVTRU5UIDB4MDIwMAorI2RlZmluZSBFRVBST01fT0sgMHgwNDAwCisjZGVmaW5lIEVMX1BSRVNFTlQgMHgwODAwCisjZGVmaW5lIEVFX1NJWkVfNjQgMHgxMDAwCisKKy8qIFBQX0J1c1NUIC0gSVNBIEJ1cyBTdGF0dXMgYml0IGRlZmluaXRpb24gKi8KKyNkZWZpbmUgVFhfQklEX0VSUk9SIDB4MDA4MAorI2RlZmluZSBSRUFEWV9GT1JfVFhfTk9XIDB4MDEwMAorCisvKiBQUF9BdXRvTmVnQ1RMIC0gQXV0byBOZWdvdGlhdGlvbiBDb250cm9sIGJpdCBkZWZpbml0aW9uICovCisjZGVmaW5lIFJFX05FR19OT1cgMHgwMDQwCisjZGVmaW5lIEFMTE9XX0ZEWCAweDAwODAKKyNkZWZpbmUgQVVUT19ORUdfRU5BQkxFIDB4MDEwMAorI2RlZmluZSBOTFBfRU5BQkxFIDB4MDIwMAorI2RlZmluZSBGT1JDRV9GRFggMHg4MDAwCisjZGVmaW5lIEFVVE9fTkVHX0JJVFMgKEZPUkNFX0ZEWHxOTFBfRU5BQkxFfEFVVE9fTkVHX0VOQUJMRSkKKyNkZWZpbmUgQVVUT19ORUdfTUFTSyAoRk9SQ0VfRkRYfE5MUF9FTkFCTEV8QVVUT19ORUdfRU5BQkxFfEFMTE9XX0ZEWHxSRV9ORUdfTk9XKQorCisvKiBQUF9BdXRvTmVnU1QgLSBBdXRvIE5lZ290aWF0aW9uIFN0YXR1cyBiaXQgZGVmaW5pdGlvbiAqLworI2RlZmluZSBBVVRPX05FR19CVVNZIDB4MDA4MAorI2RlZmluZSBGTFBfTElOSyAweDAxMDAKKyNkZWZpbmUgRkxQX0xJTktfR09PRCAweDA4MDAKKyNkZWZpbmUgTElOS19GQVVMVCAweDEwMDAKKyNkZWZpbmUgSERYX0FDVElWRSAweDQwMDAKKyNkZWZpbmUgRkRYX0FDVElWRSAweDgwMDAKKworLyogIFRoZSBmb2xsb3dpbmcgYmxvY2sgZGVmaW5lcyB0aGUgSVNRIGV2ZW50IHR5cGVzICovCisjZGVmaW5lIElTUV9SRUNFSVZFUl9FVkVOVCAweDA0CisjZGVmaW5lIElTUV9UUkFOU01JVFRFUl9FVkVOVCAweDA4CisjZGVmaW5lIElTUV9CVUZGRVJfRVZFTlQgMHgwYworI2RlZmluZSBJU1FfUlhfTUlTU19FVkVOVCAweDEwCisjZGVmaW5lIElTUV9UWF9DT0xfRVZFTlQgMHgxMgorCisjZGVmaW5lIElTUV9FVkVOVF9NQVNLIDB4MDAzRiAgIC8qICBJU1EgbWFzayB0byBmaW5kIG91dCB0eXBlIG9mIGV2ZW50ICovCisjZGVmaW5lIElTUV9ISVNUIDE2CQkvKiAgc21hbGwgaGlzdG9yeSBidWZmZXIgKi8KKyNkZWZpbmUgQVVUT0lOQ1JFTUVOVCAweDgwMDAJLyogIEJpdCBtYXNrIHRvIHNldCBiaXQtMTUgZm9yIGF1dG9pbmNyZW1lbnQgKi8KKworI2RlZmluZSBUWFJYQlVGU0laRSAweDA2MDAKKyNkZWZpbmUgUlhETUFCVUZTSVpFIDB4ODAwMAorI2RlZmluZSBSWERNQVNJWkUgMHg0MDAwCisjZGVmaW5lIFRYUlhfTEVOR1RIX01BU0sgMHgwN0ZGCisKKy8qICByeCBvcHRpb25zIGJpdHMgKi8KKyNkZWZpbmUgUkNWX1dJVEhfUlhPTgkxICAgICAgIC8qICBTZXQgU2VyUnggT04gKi8KKyNkZWZpbmUgUkNWX0NPVU5UUwkyICAgICAgIC8qICBVc2UgRnJhbWVjbnQxICovCisjZGVmaW5lIFJDVl9QT05HCTQgICAgICAgLyogIFBvbmcgcmVzcG9uZGVudCAqLworI2RlZmluZSBSQ1ZfRE9ORwk4ICAgICAgIC8qICBEb25nIG9wZXJhdGlvbiAqLworI2RlZmluZSBSQ1ZfUE9MTElORwkweDEwCS8qICBQb2xsIFJ4RXZlbnQgKi8KKyNkZWZpbmUgUkNWX0lTUQkJMHgyMAkvKiAgVXNlIElTUSwgaW50ICovCisjZGVmaW5lIFJDVl9BVVRPX0RNQQkweDEwMAkvKiAgU2V0IEF1dG9SeERNQUUgKi8KKyNkZWZpbmUgUkNWX0RNQQkJMHgyMDAJLyogIFNldCBSeERNQSBvbmx5ICovCisjZGVmaW5lIFJDVl9ETUFfQUxMCTB4NDAwCS8qICBDb3B5IGFsbCBETUEnZWQgKi8KKyNkZWZpbmUgUkNWX0ZJWEVEX0RBVEEJMHg4MDAJLyogIEV2ZXJ5IGZyYW1lIHNhbWUgKi8KKyNkZWZpbmUgUkNWX0lPCQkweDEwMDAJLyogIFVzZSBJU0EgSU8gb25seSAqLworI2RlZmluZSBSQ1ZfTUVNT1JZCTB4MjAwMAkvKiAgVXNlIElTQSBNZW1vcnkgKi8KKworI2RlZmluZSBSQU1fU0laRQkweDEwMDAgICAgICAgLyogIFRoZSBjYXJkIGhhcyA0ayBieXRlcyBvciBSQU0gKi8KKyNkZWZpbmUgUEtUX1NUQVJUIFBQX1R4RnJhbWUgIC8qICBTdGFydCBvZiBwYWNrZXQgUkFNICovCisKKyNkZWZpbmUgUlhfRlJBTUVfUE9SVAkweDAwMDAKKyNkZWZpbmUgVFhfRlJBTUVfUE9SVCBSWF9GUkFNRV9QT1JUCisjZGVmaW5lIFRYX0NNRF9QT1JUCTB4MDAwNAorI2RlZmluZSBUWF9OT1cJCTB4MDAwMCAgICAgICAvKiAgVHggcGFja2V0IGFmdGVyICAgNSBieXRlcyBjb3BpZWQgKi8KKyNkZWZpbmUgVFhfQUZURVJfMzgxCTB4MDAyMCAgICAgICAvKiAgVHggcGFja2V0IGFmdGVyIDM4MSBieXRlcyBjb3BpZWQgKi8KKyNkZWZpbmUgVFhfQUZURVJfQUxMCTB4MDA2MCAgICAgICAvKiAgVHggcGFja2V0IGFmdGVyIGFsbCBieXRlcyBjb3BpZWQgKi8KKyNkZWZpbmUgVFhfTEVOX1BPUlQJMHgwMDA2CisjZGVmaW5lIElTUV9QT1JUCTB4MDAwOAorI2RlZmluZSBBRERfUE9SVAkweDAwMEEKKyNkZWZpbmUgREFUQV9QT1JUCTB4MDAwQworCisjZGVmaW5lIEVFUFJPTV9XUklURV9FTgkJMHgwMEYwCisjZGVmaW5lIEVFUFJPTV9XUklURV9ESVMJMHgwMDAwCisjZGVmaW5lIEVFUFJPTV9XUklURV9DTUQJMHgwMTAwCisjZGVmaW5lIEVFUFJPTV9SRUFEX0NNRAkJMHgwMjAwCisKKy8qICBSZWNlaXZlIEhlYWRlciAqLworLyogIERlc2NyaXB0aW9uIG9mIGhlYWRlciBvZiBlYWNoIHBhY2tldCBpbiByZWNlaXZlIGFyZWEgb2YgbWVtb3J5ICovCisjZGVmaW5lIFJCVUZfRVZFTlRfTE9XCTAgICAvKiAgTG93IGJ5dGUgb2YgUnhFdmVudCAtIHN0YXR1cyBvZiByZWNlaXZlZCBmcmFtZSAqLworI2RlZmluZSBSQlVGX0VWRU5UX0hJR0gJMSAgIC8qICBIaWdoIGJ5dGUgb2YgUnhFdmVudCAtIHN0YXR1cyBvZiByZWNlaXZlZCBmcmFtZSAqLworI2RlZmluZSBSQlVGX0xFTl9MT1cJMiAgIC8qICBMZW5ndGggb2YgcmVjZWl2ZWQgZGF0YSAtIGxvdyBieXRlICovCisjZGVmaW5lIFJCVUZfTEVOX0hJCTMgICAvKiAgTGVuZ3RoIG9mIHJlY2VpdmVkIGRhdGEgLSBoaWdoIGJ5dGUgKi8KKyNkZWZpbmUgUkJVRl9IRUFEX0xFTgk0ICAgLyogIExlbmd0aCBvZiB0aGlzIGhlYWRlciAqLworCisjZGVmaW5lIENISVBfUkVBRCAweDEgICAvKiAgVXNlZCB0byBtYXJrIHN0YXRlIG9mIHRoZSByZXBpbnMgY29kZSAoY2hpcCBvciBkbWEpICovCisjZGVmaW5lIERNQV9SRUFEIDB4MiAgIC8qICBVc2VkIHRvIG1hcmsgc3RhdGUgb2YgdGhlIHJlcGlucyBjb2RlIChjaGlwIG9yIGRtYSkgKi8KKworLyogIGZvciBiaW9zIHNjYW4gKi8KKy8qICAqLworI2lmZGVmCUNTREVCVUcKKy8qICB1c2UgdGhlc2UgdmFsdWVzIGZvciBkZWJ1Z2dpbmcgYmlvcyBzY2FuICovCisjZGVmaW5lIEJJT1NfU1RBUlRfU0VHIDB4MDAwMDAKKyNkZWZpbmUgQklPU19PRkZTRVRfSU5DIDB4MDAxMAorI2Vsc2UKKyNkZWZpbmUgQklPU19TVEFSVF9TRUcgMHgwYzAwMAorI2RlZmluZSBCSU9TX09GRlNFVF9JTkMgMHgwMjAwCisjZW5kaWYKKworI2RlZmluZSBCSU9TX0xBU1RfT0ZGU0VUIDB4MGZjMDAKKworLyogIEJ5dGUgb2Zmc2V0cyBpbnRvIHRoZSBFRVBST00gY29uZmlndXJhdGlvbiBidWZmZXIgKi8KKyNkZWZpbmUgSVNBX0NORl9PRkZTRVQgMHg2CisjZGVmaW5lIFRYX0NUTF9PRkZTRVQgKElTQV9DTkZfT0ZGU0VUICsgOCkJCQkvKiAgODkwMCBlZXByb20gKi8KKyNkZWZpbmUgQVVUT19ORUdfQ05GX09GRlNFVCAoSVNBX0NORl9PRkZTRVQgKyA4KQkJLyogIDg5MjAgZWVwcm9tICovCisKKyAgLyogIHRoZSBhc3N1bXB0aW9uIGhlcmUgaXMgdGhhdCB0aGUgYml0cyBpbiB0aGUgZWVwcm9tIGFyZSBnZW5lcmFsbHkgICovCisgIC8qICBpbiB0aGUgc2FtZSBwb3NpdGlvbiBhcyB0aG9zZSBpbiB0aGUgYXV0b25lZ2N0bCByZWdpc3Rlci4gKi8KKyAgLyogIE9mIGNvdXJzZSB0aGUgSU1NIGJpdCBpcyBub3QgaW4gdGhhdCByZWdpc3RlciBzbyBpdCBtdXN0IGJlICAqLworICAvKiAgbWFza2VkIG91dCAqLworI2RlZmluZSBFRV9GT1JDRV9GRFggIDB4ODAwMAorI2RlZmluZSBFRV9OTFBfRU5BQkxFIDB4MDIwMAorI2RlZmluZSBFRV9BVVRPX05FR19FTkFCTEUgMHgwMTAwCisjZGVmaW5lIEVFX0FMTE9XX0ZEWCAweDAwODAKKyNkZWZpbmUgRUVfQVVUT19ORUdfQ05GX01BU0sgKEVFX0ZPUkNFX0ZEWHxFRV9OTFBfRU5BQkxFfEVFX0FVVE9fTkVHX0VOQUJMRXxFRV9BTExPV19GRFgpCisKKyNkZWZpbmUgSU1NX0JJVCAweDAwNDAJCS8qICBpZ25vcmUgbWlzc2luZyBtZWRpYSAqLworCisjZGVmaW5lIEFEQVBURVJfQ05GX09GRlNFVCAoQVVUT19ORUdfQ05GX09GRlNFVCArIDIpCisjZGVmaW5lIEFfQ05GXzEwQl9UIDB4MDAwMQorI2RlZmluZSBBX0NORl9BVUkgMHgwMDAyCisjZGVmaW5lIEFfQ05GXzEwQl8yIDB4MDAwNAorI2RlZmluZSBBX0NORl9NRURJQV9UWVBFIDB4MDA2MAorI2RlZmluZSBBX0NORl9NRURJQV9BVVRPIDB4MDAwMAorI2RlZmluZSBBX0NORl9NRURJQV8xMEJfVCAweDAwMjAKKyNkZWZpbmUgQV9DTkZfTUVESUFfQVVJIDB4MDA0MAorI2RlZmluZSBBX0NORl9NRURJQV8xMEJfMiAweDAwNjAKKyNkZWZpbmUgQV9DTkZfRENfRENfUE9MQVJJVFkgMHgwMDgwCisjZGVmaW5lIEFfQ05GX05PX0FVVE9fUE9MQVJJVFkgMHgyMDAwCisjZGVmaW5lIEFfQ05GX0xPV19SWF9TUVVFTENIIDB4NDAwMAorI2RlZmluZSBBX0NORl9FWFRORF8xMEJfMiAweDgwMDAKKworI2RlZmluZSBQQUNLRVRfUEFHRV9PRkZTRVQgMHg4CisKKy8qICBCaXQgZGVmaW5pdGlvbnMgZm9yIHRoZSBJU0EgY29uZmlndXJhdGlvbiB3b3JkIGZyb20gdGhlIEVFUFJPTSAqLworI2RlZmluZSBJTlRfTk9fTUFTSyAweDAwMEYKKyNkZWZpbmUgRE1BX05PX01BU0sgMHgwMDcwCisjZGVmaW5lIElTQV9ETUFfU0laRSAweDAyMDAKKyNkZWZpbmUgSVNBX0FVVE9fUnhETUEgMHgwNDAwCisjZGVmaW5lIElTQV9SeERNQSAweDA4MDAKKyNkZWZpbmUgRE1BX0JVUlNUIDB4MTAwMAorI2RlZmluZSBTVFJFQU1fVFJBTlNGRVIgMHgyMDAwCisjZGVmaW5lIEFOWV9JU0FfRE1BIChJU0FfQVVUT19SeERNQSB8IElTQV9SeERNQSkKKworLyogIERNQSBjb250cm9sbGVyIHJlZ2lzdGVycyAqLworI2RlZmluZSBETUFfQkFTRSAweDAwICAgICAvKiAgRE1BIGNvbnRyb2xsZXIgYmFzZSAqLworI2RlZmluZSBETUFfQkFTRV8yIDB4MEMwICAgIC8qICBETUEgY29udHJvbGxlciBiYXNlICovCisKKyNkZWZpbmUgRE1BX1NUQVQgMHgwRDAgICAgLyogIERNQSBjb250cm9sbGVyIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBETUFfTUFTSyAweDBENCAgICAvKiAgRE1BIGNvbnRyb2xsZXIgbWFzayByZWdpc3RlciAqLworI2RlZmluZSBETUFfTU9ERSAweDBENiAgICAvKiAgRE1BIGNvbnRyb2xsZXIgbW9kZSByZWdpc3RlciAqLworI2RlZmluZSBETUFfUkVTRVRGRiAweDBEOCAgICAvKiAgRE1BIGNvbnRyb2xsZXIgZmlyc3QvbGFzdCBmbGlwIGZsb3AgKi8KKworLyogIERNQSBkYXRhICovCisjZGVmaW5lIERNQV9ESVNBQkxFIDB4MDQgICAgIC8qICBEaXNhYmxlIGNoYW5uZWwgbiAqLworI2RlZmluZSBETUFfRU5BQkxFIDB4MDAgICAgIC8qICBFbmFibGUgY2hhbm5lbCBuICovCisvKiAgRGVtYW5kIHRyYW5zZmVycywgaW5jci4gYWRkcmVzcywgYXV0byBpbml0LCB3cml0ZXMsIGNoLiBuICovCisjZGVmaW5lIERNQV9SWF9NT0RFIDB4MTQKKy8qICBEZW1hbmQgdHJhbnNmZXJzLCBpbmNyLiBhZGRyZXNzLCBhdXRvIGluaXQsIHJlYWRzLCBjaC4gbiAqLworI2RlZmluZSBETUFfVFhfTU9ERSAweDE4CisKKyNkZWZpbmUgRE1BX1NJWkUgKDE2KjEwMjQpIC8qICBTaXplIG9mIGRtYSBidWZmZXIgLSAxNmsgKi8KKworI2RlZmluZSBDUzg5MDAgMHgwMDAwCisjZGVmaW5lIENTODkyMCAweDQwMDAKKyNkZWZpbmUgQ1M4OTIwTSAweDYwMDAKKyNkZWZpbmUgUkVWSVNPTl9CSVRTIDB4MUYwMAorI2RlZmluZSBFRVZFUl9OVU1CRVIgMHgxMgorI2RlZmluZSBDSEtTVU1fTEVOIDB4MTQKKyNkZWZpbmUgQ0hLU1VNX1ZBTCAweDAwMDAKKyNkZWZpbmUgU1RBUlRfRUVQUk9NX0RBVEEgMHgwMDFjIC8qICBPZmZzZXQgaW50byBlZXByb20gZm9yIHN0YXJ0IG9mIGRhdGEgKi8KKyNkZWZpbmUgSVJRX01BUF9FRVBST01fREFUQSAweDAwNDYgLyogIE9mZnNldCBpbnRvIGVlcHJvbSBmb3IgdGhlIElSUSBtYXAgKi8KKyNkZWZpbmUgSVJRX01BUF9MRU4gMHgwMDA0IC8qICBObyBvZiBieXRlcyB0byByZWFkIGZvciB0aGUgSVJRIG1hcCAqLworI2RlZmluZSBQTlBfSVJRX0ZSTVQgMHgwMDIyIC8qICBQTlAgc21hbGwgaXRlbSBJUlEgZm9ybWF0ICovCisjZGVmaW5lIENTODkwMF9JUlFfTUFQIDB4MWMyMCAvKiAgVGhpcyBJUlEgbWFwIGlzIGZpeGVkICovCisKKyNkZWZpbmUgQ1M4OTIwX05PX0lOVFMgMHgwRiAgIC8qICBNYXggQ1M4OTIwIGludGVycnVwdCBzZWxlY3QgIyAqLworCisjZGVmaW5lIFBOUF9BRERfUE9SVCAweDAyNzkKKyNkZWZpbmUgUE5QX1dSSVRFX1BPUlQgMHgwQTc5CisKKyNkZWZpbmUgR0VUX1BOUF9JU0FfU1RSVUNUIDB4NDAKKyNkZWZpbmUgUE5QX0lTQV9TVFJVQ1RfTEVOIDB4MDYKKyNkZWZpbmUgUE5QX0NTTl9DTlRfT0ZGIDB4MDEKKyNkZWZpbmUgUE5QX1JEX1BPUlRfT0ZGIDB4MDIKKyNkZWZpbmUgUE5QX0ZVTkNUSU9OX09LIDB4MDAKKyNkZWZpbmUgUE5QX1dBS0UgMHgwMworI2RlZmluZSBQTlBfUlNSQ19EQVRBIDB4MDQKKyNkZWZpbmUgUE5QX1JTUkNfUkVBRFkgMHgwMQorI2RlZmluZSBQTlBfU1RBVFVTIDB4MDUKKyNkZWZpbmUgUE5QX0FDVElWQVRFIDB4MzAKKyNkZWZpbmUgUE5QX0NORl9JT19IIDB4NjAKKyNkZWZpbmUgUE5QX0NORl9JT19MIDB4NjEKKyNkZWZpbmUgUE5QX0NORl9JTlQgMHg3MAorI2RlZmluZSBQTlBfQ05GX0RNQSAweDc0CisjZGVmaW5lIFBOUF9DTkZfTUVNIDB4NDgKKworI2RlZmluZSBCSVQwIDEKKyNkZWZpbmUgQklUMTUgMHg4MDAwCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLworCmRpZmYgLS1naXQgYS9uZXRib290L2NzODl4MC50eHQgYi9uZXRib290L2NzODl4MC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkyNzY0MQotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvY3M4OXgwLnR4dApAQCAtMCwwICsxLDI2IEBACitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gZGlzdHJpYnV0ZSB0aGUgZW5jbG9zZWQgY3M4OXgwLltjaF0gZHJpdmVyCitvbmx5IGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIEV0aGVyYm9vdCBwYWNrYWdlLiAgVGhlIGNvZGUgaXMKK29yZGluYXJpbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdQTC4KKworUnVzcyBOZWxzb24sIEphbnVhcnkgMjAwMAorCitDUkVESVRTCisKK0kgd2FudCB0byB0aGFuaworCisgIE1pa2UgQ3J1c2UgPG1jcnVzZUBjdGktbHRkLmNvbT4KKyAgICAgZm9yIHByb3ZpZGluZyBhbiBldmFsdWF0aW9uIE5JQyBhbmQgZm9yIHNwb25zb3JpbmcgdGhlCisgICAgIGRldmVsb3BtZW50IG9mIHRoaXMgZHJpdmVyLgorCisgIFJhbmRhbGwgU2VhcnMgPHNlYXJzQGNyeXN0YWwuY2lycnVzLmNvbT4KKyAgRGV2YSBCb2RhcyA8Ym9kYXNAY3J5c3RhbC5jaXJydXMuY29tPgorICBBbmRyZWFzIEtyYWVtZXIgPGFrcmFlbWVyQGNyeXN0YWwuY2lycnVzLmNvbT4KKyAgV29sZmdhbmcgS3JhdXNlIDwxMDAzMDMuMjY3M0Bjb21wdXNlcnZlLmNvbT4KKyAgICAgZm9yIGV4Y2VsbGVudCB0ZWNobmljYWwgc3VwcG9ydCBhbmQgZm9yIHByb3ZpZGluZyB0aGUgcmVxdWlyZWQKKyAgICAgcHJvZ3JhbW1pbmcgaW5mb3JtYXRpb24uIEkgYXBwcmVjaWF0ZSBDcnlzdGFsIFNlbWljb25kdWN0b3IncworICAgICBjb21taXRtZW50IHRvd2FyZHMgZnJlZSBzb2Z0d2FyZS4KKworICBSdXNzZWxsIE5lbHNvbiA8bmVsc29uQGNyeW53ci5jb20+CisgICAgIGZvciB3cml0aW5nIHRoZSBMaW51eCBkZXZpY2UgZHJpdmVyIGZvciB0aGUgQ1M4OXgwCisgICAgIGNoaXBzZXQuIFJ1c3NlbCdzIGNvZGUgaXMgdmVyeSB3ZWxsIGRlc2lnbmVkIGFuZCBzaW1wbGlmaWVkIG15CisgICAgIGpvYiBhIGxvdC4KZGlmZiAtLWdpdCBhL25ldGJvb3QvZGF2aWNvbS5jIGIvbmV0Ym9vdC9kYXZpY29tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE5ODY1NgotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvZGF2aWNvbS5jCkBAIC0wLDAgKzEsNjkyIEBACisvKiAgCisgICAgREFWSUNPTSBETTkwMDkvRE05MTAyL0RNOTEwMkEgRXRoZXJib290IERyaXZlcglWMS4wMAorCisgICAgVGhpcyBkcml2ZXIgd2FzIHBvcnRlZCBmcm9tIE1hcnR5IENvbm5lcidzIFR1bGlwIEV0aGVyYm9vdCBkcml2ZXIuIAorICAgIFRoYW5rcyBNYXJ0eSBDb25ub3IgKG1kY0B0aGluZ3Vpbi5vcmcpIAorICAgIFlvdSBjYW4gZ2V0IFR1bGlwIGRyaXZlciBzb3VyY2UgZmlsZSBmcm9tIHRoaXMgVVJMOgorCisgICAgImh0dHA6Ly9ldGhlcmJvb3Quc291cmNlZm9yZ2UuLm5ldC8jRGlzdHJpYnV0aW9uIgorICAgIAorICAgIFRoaXMgZGF2aWNvbSBldGhlcmJvb3QgZHJpdmVyIHN1cHBvcnRzIERNOTAwOS9ETTkxMDIvRE05MTAyQS8KKyAgICBETTkxMDJBK0RNOTgwMS9ETTkxMDJBK0RNOTgwMiBOSUNzLgorCisgICAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICAgIG9mIHRoZSBHTlUgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUmV2aXNpb24gSGlzdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgIDE5IE9DVCAyMDAwICBTdGVuICAgICAxLjAwCisJCQlEaWZmZXJlbnQgaGFsZiBhbmQgZnVsbCBkdXBsZXggbW9kZQorCQkJRG8gdGhlIGRpZmZlcmVudCBwcm9ncmFtbWluZyBmb3IgRE05ODAxL0RNOTgwMgorCisgIDEyIE9DVCAyMDAwICBTdGVuICAgICAwLjkwCisJCQlUaGlzIGRyaXZlciB3YXMgcG9ydGVkIGZyb20gdHVsaXAgZHJpdmVyIGFuZCBpdCAKKwkJCWhhcyB0aGUgZm9sbG93aW5nIGRpZmZlcmVuY2UuCisJCQlDaGFuZ2VkIHN5bWJvbCB0dWxpcC9UVUxJUCB0byBkYXZpY29tL0RBVklDT00KKwkJCURlbGV0ZWQgc29tZSBjb2RlIHRoYXQgZGlkIG5vdCB1c2UgaW4gdGhpcyBkcml2ZXIuCisJCQlVc2VkIGNoYWluLXN0cmN0dXJlIHRvIHJlcGxhY2UgcmluZyBzdHJ1Y3R1cmUKKwkJCWZvciBib3RoIFRYL1JYIGRlc2NyaXB0b3IuCisJCQlBbGxvY2F0ZWQgdHdvIHR4IGRlc2NyaXB0b3IuCisJCQlBY2NvcmRpbmcgY3VycmVudCBtZWRpYSBtb2RlIHRvIHNldCBvcGVyYXRpbmcgCisJCQlyZWdpc3RlcihDUjYpCisqLworCisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJldGhlcmJvb3QuaCIKKyNpbmNsdWRlICJuaWMuaCIKKyNpbmNsdWRlICJwY2kuaCIKKyNpbmNsdWRlICJjYXJkcy5oIgorCisjdW5kZWYgREFWSUNPTV9ERUJVRworI3VuZGVmIERBVklDT01fREVCVUdfV0hFUkUKKworI2RlZmluZSBUWF9USU1FX09VVCAgICAgICAyKlRJQ0tTX1BFUl9TRUMKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICB1ODsKK3R5cGVkZWYgICBzaWduZWQgY2hhciAgczg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHUxNjsKK3R5cGVkZWYgICBzaWduZWQgc2hvcnQgczE2OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICB1MzI7Cit0eXBlZGVmICAgc2lnbmVkIGludCAgIHMzMjsKKworLyogUmVnaXN0ZXIgb2Zmc2V0cyBmb3IgZGF2aWNvbSBkZXZpY2UgKi8KK2VudW0gZGF2aWNvbV9vZmZzZXRzIHsKKyAgIENTUjA9MCwgICAgIENTUjE9MHgwOCwgIENTUjI9MHgxMCwgIENTUjM9MHgxOCwgIENTUjQ9MHgyMCwgIENTUjU9MHgyOCwKKyAgIENTUjY9MHgzMCwgIENTUjc9MHgzOCwgIENTUjg9MHg0MCwgIENTUjk9MHg0OCwgQ1NSMTA9MHg1MCwgQ1NSMTE9MHg1OCwKKyAgQ1NSMTI9MHg2MCwgQ1NSMTM9MHg2OCwgQ1NSMTQ9MHg3MCwgQ1NSMTU9MHg3OCwgQ1NSMTY9MHg4MCwgQ1NSMjA9MHhBMAorfTsKKworLyogRUVQUk9NIEFkZHJlc3Mgd2lkdGggZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgRUVQUk9NX0FERFJMRU4gNgorI2RlZmluZSBFRVBST01fU0laRSAgICAzMiAgICAgICAgICAgICAgLyogMSA8PCBFRVBST01fQUREUkxFTiAqLworLyogVXNlZCB0byBiZSAxMjgsIGJ1dCB3ZSBvbmx5IG5lZWQgdG8gcmVhZCBlbm91Z2ggdG8gZ2V0IHRoZSBNQUMKKyAgIGFkZHJlc3MgYXQgYnl0ZXMgMjAuLjI1ICovCisKKy8qIERhdGEgUmVhZCBmcm9tIHRoZSBFRVBST00gKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGVlX2RhdGFbRUVQUk9NX1NJWkVdOworCisvKiBUaGUgRUVQUk9NIGNvbW1hbmRzIGluY2x1ZGUgdGhlIGFsd2F5LXNldCBsZWFkaW5nIGJpdC4gKi8KKyNkZWZpbmUgRUVfV1JJVEVfQ01EICAgICg1IDw8IGFkZHJfbGVuKQorI2RlZmluZSBFRV9SRUFEX0NNRCAgICAgKDYgPDwgYWRkcl9sZW4pCisjZGVmaW5lIEVFX0VSQVNFX0NNRCAgICAoNyA8PCBhZGRyX2xlbikKKworLyogRUVQUk9NX0N0cmwgYml0cy4gKi8KKyNkZWZpbmUgRUVfU0hJRlRfQ0xLICAgIDB4MDIgICAgLyogRUVQUk9NIHNoaWZ0IGNsb2NrLiAqLworI2RlZmluZSBFRV9DUyAgICAgICAgICAgMHgwMSAgICAvKiBFRVBST00gY2hpcCBzZWxlY3QuICovCisjZGVmaW5lIEVFX0RBVEFfV1JJVEUgICAweDA0ICAgIC8qIEVFUFJPTSBjaGlwIGRhdGEgaW4uICovCisjZGVmaW5lIEVFX1dSSVRFXzAgICAgICAweDAxCisjZGVmaW5lIEVFX1dSSVRFXzEgICAgICAweDA1CisjZGVmaW5lIEVFX0RBVEFfUkVBRCAgICAweDA4ICAgIC8qIEVFUFJPTSBjaGlwIGRhdGEgb3V0LiAqLworI2RlZmluZSBFRV9FTkIgICAgICAgICAgKDB4NDgwMCB8IEVFX0NTKQorCisvKiBTdGVuIDEwLzExIGZvciBwaHl4Y2VyICovCisjZGVmaW5lIFBIWV9EQVRBXzAJMHgwCisjZGVmaW5lIFBIWV9EQVRBXzEJMHgyMDAwMAorI2RlZmluZSBNRENMS0gJCTB4MTAwMDAKKworLyogRGVsYXkgYmV0d2VlbiBFRVBST00gY2xvY2sgdHJhbnNpdGlvbnMuICBFdmVuIGF0IDMzTWh6IGN1cnJlbnQgUENJCisgICBpbXBsZW1lbnRhdGlvbnMgZG9uJ3Qgb3ZlcnJ1biB0aGUgRUVQUk9NIGNsb2NrLiAgV2UgYWRkIGEgYnVzCisgICB0dXJuLWFyb3VuZCB0byBpbnN1cmUgdGhhdCB0aGlzIHJlbWFpbnMgdHJ1ZS4gICovCisjZGVmaW5lIGVlcHJvbV9kZWxheSgpICBpbmwoZWVfYWRkcikKKworLyogaGVscGZ1bCBtYWNybyBpZiBvbiBhIGJpZ19lbmRpYW4gbWFjaGluZSBmb3IgY2hhbmdpbmcgYnl0ZSBvcmRlci4KKyAgIG5vdCBzdHJpY3RseSBuZWVkZWQgb24gSW50ZWwgKi8KKyNkZWZpbmUgbGUxNl90b19jcHUodmFsKSAodmFsKQorCisvKiB0cmFuc21pdCBhbmQgcmVjZWl2ZSBkZXNjcmlwdG9yIGZvcm1hdCAqLworc3RydWN0IHR4ZGVzYyB7CisgIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgICBzdGF0dXM7ICAgICAgICAgLyogb3duZXIsIHN0YXR1cyAqLworICB1bnNpZ25lZCBsb25nICAgYnVmMXN6OjExLCAgICAgIC8qIHNpemUgb2YgYnVmZmVyIDEgKi8KKyAgICBidWYyc3o6MTEsICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIGJ1ZmZlciAyICovCisgICAgY29udHJvbDoxMDsgICAgICAgICAgICAgICAgICAgLyogY29udHJvbCBiaXRzICovCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZjFhZGRyOyAgLyogYnVmZmVyIDEgYWRkcmVzcyAqLworICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYyYWRkcjsgIC8qIGJ1ZmZlciAyIGFkZHJlc3MgKi8KK307CisKK3N0cnVjdCByeGRlc2MgeworICB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICAgc3RhdHVzOyAgICAgICAgIC8qIG93bmVyLCBzdGF0dXMgKi8KKyAgdW5zaWduZWQgbG9uZyAgIGJ1ZjFzejoxMSwgICAgICAvKiBzaXplIG9mIGJ1ZmZlciAxICovCisgICAgYnVmMnN6OjExLCAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiBidWZmZXIgMiAqLworICAgIGNvbnRyb2w6MTA7ICAgICAgICAgICAgICAgICAgIC8qIGNvbnRyb2wgYml0cyAqLworICB1bnNpZ25lZCBjaGFyICAgKmJ1ZjFhZGRyOyAgICAgIC8qIGJ1ZmZlciAxIGFkZHJlc3MgKi8KKyAgdW5zaWduZWQgY2hhciAgICpidWYyYWRkcjsgICAgICAvKiBidWZmZXIgMiBhZGRyZXNzICovCit9OworCisvKiBTaXplIG9mIHRyYW5zbWl0IGFuZCByZWNlaXZlIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgQlVGTEVOIDE1MzYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEdsb2JhbCBTdG9yYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBQQ0kgQnVzIHBhcmFtZXRlcnMgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB2ZW5kb3IsIGRldl9pZDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlvYWRkcjsKKworLyogTm90ZTogdHJhbnNtaXQgYW5kIHJlY2VpdmUgYnVmZmVycyBtdXN0IGJlIGxvbmd3b3JkIGFsaWduZWQgYW5kCisgICBsb25nd29yZCBkaXZpc2FibGUgKi8KKworLyogdHJhbnNtaXQgZGVzY3JpcHRvciBhbmQgYnVmZmVyICovCisjZGVmaW5lIE5UWEQgMgorc3RhdGljIHN0cnVjdCB0eGRlc2MgdHhkW05UWERdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDQpKSk7CisjaWZkZWYJVVNFX0xPV01FTV9CVUZGRVIKKyNkZWZpbmUgdHhiICgoY2hhciAqKTB4MTAwMDAgLSBCVUZMRU4pCisjZWxzZQorc3RhdGljIHVuc2lnbmVkIGNoYXIgdHhiW0JVRkxFTl0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNCkpKTsKKyNlbmRpZgorCisvKiByZWNlaXZlIGRlc2NyaXB0b3IocykgYW5kIGJ1ZmZlcihzKSAqLworI2RlZmluZSBOUlhEIDQKK3N0YXRpYyBzdHJ1Y3QgcnhkZXNjIHJ4ZFtOUlhEXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg0KSkpOworI2lmZGVmCVVTRV9MT1dNRU1fQlVGRkVSCisjZGVmaW5lIHJ4YiAoKGNoYXIgKikweDEwMDAwIC0gTlJYRCAqIEJVRkxFTiAtIEJVRkxFTikKKyNlbHNlCitzdGF0aWMgdW5zaWduZWQgY2hhciByeGJbTlJYRCAqIEJVRkxFTl0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNCkpKTsKKyNlbmRpZgorc3RhdGljIGludCByeGRfdGFpbDsKK3N0YXRpYyBpbnQgVHhQdHI7CisKKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHdoZXJlYW1pKGNvbnN0IGNoYXIgKnN0cik7CitzdGF0aWMgaW50IHJlYWRfZWVwcm9tKHVuc2lnbmVkIGxvbmcgaW9hZGRyLCBpbnQgbG9jYXRpb24sIGludCBhZGRyX2xlbik7CitzdHJ1Y3QgbmljICpkYXZpY29tX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKmlvX2FkZHJzLAorCQkJc3RydWN0IHBjaV9kZXZpY2UgKnBjaSk7CitzdGF0aWMgdm9pZCBkYXZpY29tX2luaXRfY2hhaW4oc3RydWN0IG5pYyAqbmljKTsJLyogU3RlbiAxMC85ICovCitzdGF0aWMgdm9pZCBkYXZpY29tX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYyk7CitzdGF0aWMgdm9pZCBkYXZpY29tX3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYywgY29uc3QgY2hhciAqZCwgdW5zaWduZWQgaW50IHQsCisJCQkgICB1bnNpZ25lZCBpbnQgcywgY29uc3QgY2hhciAqcCk7CitzdGF0aWMgaW50IGRhdmljb21fcG9sbChzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIHZvaWQgZGF2aWNvbV9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYyk7CitzdGF0aWMgdm9pZCB3aGVyZWFtaSAoY29uc3QgY2hhciAqc3RyKTsKKyNpZmRlZglEQVZJQ09NX0RFQlVHCitzdGF0aWMgdm9pZCBkYXZpY29tX21vcmUodm9pZCk7CisjZW5kaWYgLyogREFWSUNPTV9ERUJVRyAqLworc3RhdGljIHZvaWQgZGF2aWNvbV93YWl0KHVuc2lnbmVkIGludCBudGlja3MpOworc3RhdGljIGludCBwaHlfcmVhZChpbnQpOworc3RhdGljIHZvaWQgcGh5X3dyaXRlKGludCwgdTE2KTsKK3N0YXRpYyB2b2lkIHBoeV93cml0ZV8xYml0KHUzMiwgdTMyKTsKK3N0YXRpYyBpbnQgcGh5X3JlYWRfMWJpdCh1MzIpOworc3RhdGljIHZvaWQgZGF2aWNvbV9tZWRpYV9jaGsoc3RydWN0IG5pYyAqKTsKKworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFV0aWxpdHkgUm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW5saW5lIHZvaWQgd2hlcmVhbWkgKGNvbnN0IGNoYXIgKnN0cikKK3sKKyNpZmRlZglEQVZJQ09NX0RFQlVHX1dIRVJFCisgIHByaW50ZigiJXNcbiIsIHN0cik7CisgIC8qIHNsZWVwKDIpOyAqLworI2VuZGlmCit9CisKKyNpZmRlZglEQVZJQ09NX0RFQlVHCitzdGF0aWMgdm9pZCBkYXZpY29tX21vcmUoKQoreworICBwcmludGYoIlxuXG4tLSBtb3JlIC0tIik7CisgIHdoaWxlICghaXNrZXkoKSkKKyAgICAvKiB3YWl0ICovOworICBnZXRjaGFyKCk7CisgIHByaW50ZigiXG5cbiIpOworfQorI2VuZGlmIC8qIERBVklDT01fREVCVUcgKi8KKworc3RhdGljIHZvaWQgZGF2aWNvbV93YWl0KHVuc2lnbmVkIGludCBudGlja3MpCit7CisgIHVuc2lnbmVkIGludCB0byA9IGN1cnJ0aWNrcygpICsgbnRpY2tzOworICB3aGlsZSAoY3VycnRpY2tzKCkgPCB0bykKKyAgICAvKiB3YWl0ICovIDsKK30KKworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZvciBEQVZJQ09NIHBoeXhjZXIgcmVnaXN0ZXIgYnkgTUlJIGludGVyZmFjZQkJICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgIFJlYWQgYSB3b3JkIGRhdGEgZnJvbSBwaHkgcmVnaXN0ZXIKKyovCitzdGF0aWMgaW50IHBoeV9yZWFkKGludCBsb2NhdGlvbikKK3sKKyBpbnQgaSwgcGh5X2FkZHI9MTsKKyB1MTYgcGh5X2RhdGE7CisgdTMyIGlvX2Rjcjk7CisKKyB3aGVyZWFtaSgicGh5X3JlYWRcbiIpOworCisgaW9fZGNyOSA9IGlvYWRkciArIENTUjk7CisKKyAvKiBTZW5kIDMzIHN5bmNocm9uaXphdGlvbiBjbG9jayB0byBQaHkgY29udHJvbGxlciAqLworIGZvciAoaT0wOyBpPDM0OyBpKyspCisgICAgIHBoeV93cml0ZV8xYml0KGlvX2RjcjksIFBIWV9EQVRBXzEpOworCisgLyogU2VuZCBzdGFydCBjb21tYW5kKDAxKSB0byBQaHkgKi8KKyBwaHlfd3JpdGVfMWJpdChpb19kY3I5LCBQSFlfREFUQV8wKTsKKyBwaHlfd3JpdGVfMWJpdChpb19kY3I5LCBQSFlfREFUQV8xKTsKKworIC8qIFNlbmQgcmVhZCBjb21tYW5kKDEwKSB0byBQaHkgKi8KKyBwaHlfd3JpdGVfMWJpdChpb19kY3I5LCBQSFlfREFUQV8xKTsKKyBwaHlfd3JpdGVfMWJpdChpb19kY3I5LCBQSFlfREFUQV8wKTsKKworIC8qIFNlbmQgUGh5IGFkZHJlcyAqLworIGZvciAoaT0weDEwOyBpPjA7IGk9aT4+MSkKKyAgICAgcGh5X3dyaXRlXzFiaXQoaW9fZGNyOSwgcGh5X2FkZHImaSA/IFBIWV9EQVRBXzE6IFBIWV9EQVRBXzApOworICAgCisgLyogU2VuZCByZWdpc3RlciBhZGRyZXMgKi8KKyBmb3IgKGk9MHgxMDsgaT4wOyBpPWk+PjEpCisgICAgIHBoeV93cml0ZV8xYml0KGlvX2RjcjksIGxvY2F0aW9uJmkgPyBQSFlfREFUQV8xOiBQSFlfREFUQV8wKTsKKworIC8qIFNraXAgdHJhbnNpdGlvbiBzdGF0ZSAqLworIHBoeV9yZWFkXzFiaXQoaW9fZGNyOSk7CisKKyAvKiByZWFkIDE2Yml0IGRhdGEgKi8KKyBmb3IgKHBoeV9kYXRhPTAsIGk9MDsgaTwxNjsgaSsrKSB7CisgICBwaHlfZGF0YTw8PTE7CisgICBwaHlfZGF0YXw9cGh5X3JlYWRfMWJpdChpb19kY3I5KTsKKyB9CisKKyByZXR1cm4gcGh5X2RhdGE7Cit9CisKKy8qCisgIFdyaXRlIGEgd29yZCB0byBQaHkgcmVnaXN0ZXIKKyovCitzdGF0aWMgdm9pZCBwaHlfd3JpdGUoaW50IGxvY2F0aW9uLCB1MTYgcGh5X2RhdGEpCit7CisgdTE2IGksIHBoeV9hZGRyPTE7CisgdTMyIGlvX2Rjcjk7IAorCisgd2hlcmVhbWkoInBoeV93cml0ZVxuIik7CisKKyBpb19kY3I5ID0gaW9hZGRyICsgQ1NSOTsKKworIC8qIFNlbmQgMzMgc3luY2hyb25pemF0aW9uIGNsb2NrIHRvIFBoeSBjb250cm9sbGVyICovCisgZm9yIChpPTA7IGk8MzQ7IGkrKykKKyAgIHBoeV93cml0ZV8xYml0KGlvX2RjcjksIFBIWV9EQVRBXzEpOworCisgLyogU2VuZCBzdGFydCBjb21tYW5kKDAxKSB0byBQaHkgKi8KKyBwaHlfd3JpdGVfMWJpdChpb19kY3I5LCBQSFlfREFUQV8wKTsKKyBwaHlfd3JpdGVfMWJpdChpb19kY3I5LCBQSFlfREFUQV8xKTsKKworIC8qIFNlbmQgd3JpdGUgY29tbWFuZCgwMSkgdG8gUGh5ICovCisgcGh5X3dyaXRlXzFiaXQoaW9fZGNyOSwgUEhZX0RBVEFfMCk7CisgcGh5X3dyaXRlXzFiaXQoaW9fZGNyOSwgUEhZX0RBVEFfMSk7CisKKyAvKiBTZW5kIFBoeSBhZGRyZXMgKi8KKyBmb3IgKGk9MHgxMDsgaT4wOyBpPWk+PjEpCisgICBwaHlfd3JpdGVfMWJpdChpb19kY3I5LCBwaHlfYWRkciZpID8gUEhZX0RBVEFfMTogUEhZX0RBVEFfMCk7CisKKyAvKiBTZW5kIHJlZ2lzdGVyIGFkZHJlcyAqLworIGZvciAoaT0weDEwOyBpPjA7IGk9aT4+MSkKKyAgIHBoeV93cml0ZV8xYml0KGlvX2RjcjksIGxvY2F0aW9uJmkgPyBQSFlfREFUQV8xOiBQSFlfREFUQV8wKTsKKworIC8qIHdyaXR0ZW4gdHJhc25pdGlvbiAqLworIHBoeV93cml0ZV8xYml0KGlvX2RjcjksIFBIWV9EQVRBXzEpOworIHBoeV93cml0ZV8xYml0KGlvX2RjcjksIFBIWV9EQVRBXzApOworCisgLyogV3JpdGUgYSB3b3JkIGRhdGEgdG8gUEhZIGNvbnRyb2xsZXIgKi8KKyBmb3IgKGk9MHg4MDAwOyBpPjA7IGk+Pj0xKQorICAgcGh5X3dyaXRlXzFiaXQoaW9fZGNyOSwgcGh5X2RhdGEmaSA/IFBIWV9EQVRBXzE6IFBIWV9EQVRBXzApOworfQorCisvKgorICBXcml0ZSBvbmUgYml0IGRhdGEgdG8gUGh5IENvbnRyb2xsZXIKKyovCitzdGF0aWMgdm9pZCBwaHlfd3JpdGVfMWJpdCh1MzIgZWVfYWRkciwgdTMyIHBoeV9kYXRhKQoreworIHdoZXJlYW1pKCJwaHlfd3JpdGVfMWJpdFxuIik7Cisgb3V0bChwaHlfZGF0YSwgZWVfYWRkcik7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTUlJIENsb2NrIExvdyAqLworIGVlcHJvbV9kZWxheSgpOworIG91dGwocGh5X2RhdGF8TURDTEtILCBlZV9hZGRyKTsgICAgICAgICAgICAgICAgIC8qIE1JSSBDbG9jayBIaWdoICovCisgZWVwcm9tX2RlbGF5KCk7Cisgb3V0bChwaHlfZGF0YSwgZWVfYWRkcik7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTUlJIENsb2NrIExvdyAqLworIGVlcHJvbV9kZWxheSgpOworfQorCisvKgorICBSZWFkIG9uZSBiaXQgcGh5IGRhdGEgZnJvbSBQSFkgY29udHJvbGxlcgorKi8KK3N0YXRpYyBpbnQgcGh5X3JlYWRfMWJpdCh1MzIgZWVfYWRkcikKK3sKKyBpbnQgcGh5X2RhdGE7CisKKyB3aGVyZWFtaSgicGh5X3JlYWRfMWJpdFxuIik7CisKKyBvdXRsKDB4NTAwMDAsIGVlX2FkZHIpOworIGVlcHJvbV9kZWxheSgpOworCisgcGh5X2RhdGE9KGlubChlZV9hZGRyKT4+MTkpICYgMHgxOworCisgb3V0bCgweDQwMDAwLCBlZV9hZGRyKTsKKyBlZXByb21fZGVsYXkoKTsKKworIHJldHVybiBwaHlfZGF0YTsKK30KKworLyoKKyAgRE05ODAxL0RNOTgwMiBwcmVzZW50IGNoZWNrIGFuZCBwcm9ncmFtIAorKi8KK3N0YXRpYyB2b2lkIEhQTkFfcHJvY2Vzcyh2b2lkKQoreworCisgaWYgKCAocGh5X3JlYWQoMykgJiAweGZmZjApID09IDB4YjkwMCApIHsKKyAgIGlmICggcGh5X3JlYWQoMzEpID09IDB4NDQwNCApIHsKKyAgICAgLyogRE05ODAxIHByZXNlbnQgKi8KKyAgICAgaWYgKHBoeV9yZWFkKDMpID09IDB4YjkwMSkKKyAgICAgICBwaHlfd3JpdGUoMTYsIDB4NSk7CS8qIERNOTgwMSBFNCAqLworICAgICBlbHNlCisgICAgICAgcGh5X3dyaXRlKDE2LCAweDEwMDUpOyAvKiBETTk4MDEgRTMgYW5kIG90aGVycyAqLworICAgICBwaHlfd3JpdGUoMjUsICgocGh5X3JlYWQoMjQpICsgMykgJiAweGZmKSB8IDB4ZjAwMCk7CisgICB9IGVsc2UgeworICAgICAvKiBETTk4MDIgcHJlc2VudCAqLworICAgICBwaHlfd3JpdGUoMTYsIDB4NSk7CisgICAgIHBoeV93cml0ZSgyNSwgKHBoeV9yZWFkKDI1KSAmIDB4ZmYwMCkgKyAyKTsKKyAgIH0KKyB9Cit9CisKKy8qCisgIFNlbnNlIG1lZGlhIG1vZGUgYW5kIHNldCBDUjYKKyovCitzdGF0aWMgdm9pZCBkYXZpY29tX21lZGlhX2NoayhzdHJ1Y3QgbmljICogbmljKQoreworICB1bnNpZ25lZCBsb25nIHRvLCBjc3I2OworCisgIGNzcjYgPSAweDAwMjAwMDAwOwkvKiBTRiAqLworICBvdXRsKGNzcjYsIGlvYWRkciArIENTUjYpOworCisgIGlmICh2ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9EQVZJQ09NICYmIGRldl9pZCA9PSBQQ0lfREVWSUNFX0lEX0RNOTAwOSkgeworICAgIC8qIFNldCB0byAxMEJhc2VUIG1vZGUgZm9yIERNOTAwOSAqLworICAgIHBoeV93cml0ZSgwLCAwKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBGb3IgRE05MTAyL0RNOTEwMkEgKi8KKyAgICB0byA9IGN1cnJ0aWNrcygpICsgMiAqIFRJQ0tTX1BFUl9TRUM7CisgICAgd2hpbGUgKCAoKHBoeV9yZWFkKDEpICYgMHgyNCkhPTB4MjQpICYmIChjdXJydGlja3MoKSA8IHRvKSkKKyAgICAgIC8qIHdhaXQgKi8gOworCisgICAgaWYgKCAocGh5X3JlYWQoMSkgJiAweDI0KSA9PSAweDI0ICkgeworICAgICAgaWYgKHBoeV9yZWFkKDE3KSAmIDB4YTAwMCkgIAorICAgICAgICBjc3I2IHw9IDB4MDAwMDAyMDA7CS8qIEZ1bGwgRHVwbGV4IG1vZGUgKi8KKyAgICB9IGVsc2UKKyAgICAgIGNzcjYgfD0gMHgwMDA0MDAwMDsgLyogU2VsZWN0IERNOTgwMS9ETTk4MDIgd2hlbiBFdGhlcm5ldCBsaW5rIGZhaWxlZCAqLworICB9CisKKyAgLyogc2V0IHRoZSBjaGlwJ3Mgb3BlcmF0aW5nIG1vZGUgKi8KKyAgb3V0bChjc3I2LCBpb2FkZHIgKyBDU1I2KTsKKworICAvKiBETTk4MDEvRE05ODAyIHByZXNlbnQgY2hlY2sgJiBwcm9ncmFtICovCisgIGlmIChjc3I2ICYgMHg0MDAwMCkKKyAgICBIUE5BX3Byb2Nlc3MoKTsKK30KKworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEVFUFJPTSBSZWFkaW5nIENvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRUVQUk9NIHJvdXRpbmVzIGFkYXB0ZWQgZnJvbSB0aGUgTGludXggVHVsaXAgQ29kZSAqLworLyogUmVhZGluZyBhIHNlcmlhbCBFRVBST00gaXMgYSAiYml0IiBncnVuZ3ksIGJ1dCB3ZSB3b3JrIG91ciB3YXkKKyAgIHRocm91Z2g6LT4uCisqLworc3RhdGljIGludCByZWFkX2VlcHJvbSh1bnNpZ25lZCBsb25nIGlvYWRkciwgaW50IGxvY2F0aW9uLCBpbnQgYWRkcl9sZW4pCit7CisgIGludCBpOworICB1bnNpZ25lZCBzaG9ydCByZXR2YWwgPSAwOworICBsb25nIGVlX2FkZHIgPSBpb2FkZHIgKyBDU1I5OworICBpbnQgcmVhZF9jbWQgPSBsb2NhdGlvbiB8IEVFX1JFQURfQ01EOworCisgIHdoZXJlYW1pKCJyZWFkX2VlcHJvbVxuIik7CisKKyAgb3V0bChFRV9FTkIgJiB+RUVfQ1MsIGVlX2FkZHIpOworICBvdXRsKEVFX0VOQiwgZWVfYWRkcik7CisKKyAgLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KKyAgZm9yIChpID0gNCArIGFkZHJfbGVuOyBpID49IDA7IGktLSkgeworICAgIHNob3J0IGRhdGF2YWwgPSAocmVhZF9jbWQgJiAoMSA8PCBpKSkgPyBFRV9EQVRBX1dSSVRFIDogMDsKKyAgICBvdXRsKEVFX0VOQiB8IGRhdGF2YWwsIGVlX2FkZHIpOworICAgIGVlcHJvbV9kZWxheSgpOworICAgIG91dGwoRUVfRU5CIHwgZGF0YXZhbCB8IEVFX1NISUZUX0NMSywgZWVfYWRkcik7CisgICAgZWVwcm9tX2RlbGF5KCk7CisgIH0KKyAgb3V0bChFRV9FTkIsIGVlX2FkZHIpOworCisgIGZvciAoaSA9IDE2OyBpID4gMDsgaS0tKSB7CisgICAgb3V0bChFRV9FTkIgfCBFRV9TSElGVF9DTEssIGVlX2FkZHIpOworICAgIGVlcHJvbV9kZWxheSgpOworICAgIHJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKGlubChlZV9hZGRyKSAmIEVFX0RBVEFfUkVBRCkgPyAxIDogMCk7CisgICAgb3V0bChFRV9FTkIsIGVlX2FkZHIpOworICAgIGVlcHJvbV9kZWxheSgpOworICB9CisKKyAgLyogVGVybWluYXRlIHRoZSBFRVBST00gYWNjZXNzLiAqLworICBvdXRsKEVFX0VOQiAmIH5FRV9DUywgZWVfYWRkcik7CisgIHJldHVybiByZXR2YWw7Cit9CisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZGF2aWNvbV9pbml0X2NoYWluIC0gc2V0dXAgdGhlIHR4IGFuZCByeCBkZXNjcmlwdG9ycyAgICAgICAgICAgICAgICAqLworLyogU3RlbiAxMC85CQkJCQkJCSAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBkYXZpY29tX2luaXRfY2hhaW4oc3RydWN0IG5pYyAqbmljKQoreworICBpbnQgaTsKKworICAvKiBzZXR1cCB0aGUgdHJhbnNtaXQgZGVzY3JpcHRvciAqLworICAvKiBTdGVuOiBTZXQgMiBUWCBkZXNjcmlwdG9yIGJ1dCB1c2Ugb25lIFRYIGJ1ZmZlciBiZWNhdXNlCisJICAgaXQgdHJhbnNtaXQgYSBwYWNrZXQgYW5kIHdhaXQgY29tcGxldGUgZXZlcnkgdGltZS4gKi8KKyAgZm9yIChpPTA7IGk8TlRYRDsgaSsrKSB7CisgICAgdHhkW2ldLmJ1ZjFhZGRyID0gJnR4YlswXTsJCS8qIFVzZWQgc2FtZSBUWCBidWZmZXIgKi8KKyAgICB0eGRbaV0uYnVmMmFkZHIgPSAodW5zaWduZWQgY2hhciAqKSZ0eGRbaSsxXTsgLyogIFBvaW50IHRvIE5leHQgVFggZGVzYyAqLworICAgIHR4ZFtpXS5idWYxc3ogICA9IDA7CisgICAgdHhkW2ldLmJ1ZjJzeiAgID0gMDsKKyAgICB0eGRbaV0uY29udHJvbCAgPSAweDE4NDsgICAgICAgICAgIC8qIEJlZ2luL0VuZC9DaGFpbiAqLworICAgIHR4ZFtpXS5zdGF0dXMgICA9IDB4MDAwMDAwMDA7ICAgICAgLyogZ2l2ZSBvd25lcnNoaXAgdG8gSG9zdCAqLworICB9CisKKyAgLyogY29uc3RydWN0IHBlcmZlY3QgZmlsdGVyIGZyYW1lIHdpdGggbWFjIGFkZHJlc3MgYXMgZmlyc3QgbWF0Y2gKKyAgICAgYW5kIGJyb2FkY2FzdCBhZGRyZXNzIGZvciBhbGwgb3RoZXJzICovCisgIGZvciAoaT0wOyBpPDE5MjsgaSsrKSB0eGJbaV0gPSAweEZGOworICB0eGJbMF0gPSBuaWMtPm5vZGVfYWRkclswXTsKKyAgdHhiWzFdID0gbmljLT5ub2RlX2FkZHJbMV07CisgIHR4Yls0XSA9IG5pYy0+bm9kZV9hZGRyWzJdOworICB0eGJbNV0gPSBuaWMtPm5vZGVfYWRkclszXTsKKyAgdHhiWzhdID0gbmljLT5ub2RlX2FkZHJbNF07CisgIHR4Yls5XSA9IG5pYy0+bm9kZV9hZGRyWzVdOworCisgIC8qIHNldHVwIHJlY2VpdmUgZGVzY3JpcHRvciAqLworICBmb3IgKGk9MDsgaTxOUlhEOyBpKyspIHsKKyAgICByeGRbaV0uYnVmMWFkZHIgPSAmcnhiW2kgKiBCVUZMRU5dOworICAgIHJ4ZFtpXS5idWYyYWRkciA9ICh1bnNpZ25lZCBjaGFyICopJnJ4ZFtpKzFdOyAvKiBQb2ludCB0byBOZXh0IFJYIGRlc2MgKi8KKyAgICByeGRbaV0uYnVmMXN6ICAgPSBCVUZMRU47CisgICAgcnhkW2ldLmJ1ZjJzeiAgID0gMDsgICAgICAgIC8qIG5vdCB1c2VkICovCisgICAgcnhkW2ldLmNvbnRyb2wgID0gMHg0OwkJLyogQ2hhaW4gU3RydWN0dXJlICovCisgICAgcnhkW2ldLnN0YXR1cyAgID0gMHg4MDAwMDAwMDsgICAvKiBnaXZlIG93bmVyc2hpcCB0byBkZXZpY2UgKi8KKyAgfQorCisgIC8qIENoYWluIHRoZSBsYXN0IGRlc2NyaXB0b3IgdG8gZmlyc3QgKi8KKyAgdHhkW05UWEQgLSAxXS5idWYyYWRkciA9ICh1bnNpZ25lZCBjaGFyICopJnR4ZFswXTsKKyAgcnhkW05SWEQgLSAxXS5idWYyYWRkciA9ICh1bnNpZ25lZCBjaGFyICopJnJ4ZFswXTsKKyAgVHhQdHIgPSAwOworICByeGRfdGFpbCA9IDA7Cit9CisKKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBkYXZpY29tX3Jlc2V0IC0gUmVzZXQgYWRhcHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBkYXZpY29tX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKK3sKKyAgdW5zaWduZWQgbG9uZyB0bzsKKyAgdTMyIGFkZHJfbG93LCBhZGRyX2hpZ2g7CisKKyAgd2hlcmVhbWkoImRhdmljb21fcmVzZXRcbiIpOworCisgIC8qIFN0b3AgVHggYW5kIFJYICovCisgIG91dGwoaW5sKGlvYWRkciArIENTUjYpICYgfjB4MDAwMDIwMDIsIGlvYWRkciArIENTUjYpOworCisgIC8qIFJlc2V0IHRoZSBjaGlwLCBob2xkaW5nIGJpdCAwIHNldCBhdCBsZWFzdCA1MCBQQ0kgY3ljbGVzLiAqLworICBvdXRsKDB4MDAwMDAwMDEsIGlvYWRkciArIENTUjApOworCisgIGRhdmljb21fd2FpdChUSUNLU19QRVJfU0VDKTsKKworICAvKiBUWC9SWCBkZXNjcmlwdG9yIGJ1cnN0ICovCisgIG91dGwoMHgwQzAwMDAwLCBpb2FkZHIgKyBDU1IwKTsJLyogU3RlbiAxMC85ICovCisKKyAgLyogc2V0IHVwIHRyYW5zbWl0IGFuZCByZWNlaXZlIGRlc2NyaXB0b3JzICovCisgIGRhdmljb21faW5pdF9jaGFpbihuaWMpOwkvKiBTdGVuIDEwLzkgKi8KKworICAvKiBQb2ludCB0byByZWNlaXZlIGRlc2NyaXB0b3IgKi8KKyAgb3V0bCgodW5zaWduZWQgbG9uZykmcnhkWzBdLCBpb2FkZHIgKyBDU1IzKTsKKyAgb3V0bCgodW5zaWduZWQgbG9uZykmdHhkWzBdLCBpb2FkZHIgKyBDU1I0KTsJLyogU3RlbiAxMC85ICovCisKKyAgLyogQWNjb3JkaW5nIHBoeXhjZXIgbWVkaWEgbW9kZSB0byBzZXQgQ1I2LAorICAgICBETTkxMDIvQSBwaHl4Y2VyIGNhbiBhdXRvLWRldGVjdCBtZWRpYSBtb2RlICovCisgIGRhdmljb21fbWVkaWFfY2hrKG5pYyk7CisKKyAgLyogUHJlcGFyZSBTZXR1cCBGcmFtZSBTdGVuIDEwLzkgKi8KKyAgdHhkW1R4UHRyXS5idWYxc3ogPSAxOTI7CisgIHR4ZFtUeFB0cl0uY29udHJvbCA9IDB4MDI0OwkJLyogU0YvQ0UgKi8KKyAgdHhkW1R4UHRyXS5zdGF0dXMgPSAweDgwMDAwMDAwOwkvKiBHaXZlIG93bmVyc2hpcCB0byBkZXZpY2UgKi8KKworICAvKiBTdGFydCBUeCAqLworICBvdXRsKGlubChpb2FkZHIgKyBDU1I2KSB8IDB4MDAwMDIwMDAsIGlvYWRkciArIENTUjYpOworICAvKiBpbW1lZGlhdGUgdHJhbnNtaXQgZGVtYW5kICovCisgIG91dGwoMCwgaW9hZGRyICsgQ1NSMSk7CisKKyAgdG8gPSBjdXJydGlja3MoKSArIFRYX1RJTUVfT1VUOworICB3aGlsZSAoKHR4ZFtUeFB0cl0uc3RhdHVzICYgMHg4MDAwMDAwMCkgJiYgKGN1cnJ0aWNrcygpIDwgdG8pKSAvKiBTdGVuIDEwLzkgKi8KKyAgICAvKiB3YWl0ICovIDsKKworICBpZiAoY3VycnRpY2tzKCkgPj0gdG8pIHsKKyAgICBwcmludGYgKCJUWCBTZXR1cCBUaW1lb3V0IVxuIik7CisgIH0KKyAgLyogUG9pbnQgdG8gbmV4dCBUWCBkZXNjcmlwdG9yICovCisgVHhQdHIgPSAoKytUeFB0ciA+PSBOVFhEKSA/IDA6VHhQdHI7CS8qIFN0ZW4gMTAvOSAqLworCisjaWZkZWYgREFWSUNPTV9ERUJVRworICBwcmludGYoInR4ZC5zdGF0dXMgPSAlWFxuIiwgdHhkLnN0YXR1cyk7CisgIHByaW50ZigidGlja3MgPSAlZFxuIiwgY3VycnRpY2tzKCkgLSAodG8gLSBUWF9USU1FX09VVCkpOworICBkYXZpY29tX21vcmUoKTsKKyNlbmRpZgorCisgIC8qIGVuYWJsZSBSWCAqLworICBvdXRsKGlubChpb2FkZHIgKyBDU1I2KSB8IDB4MDAwMDAwMDIsIGlvYWRkciArIENTUjYpOworICAvKiBpbW1lZGlhdGUgcG9sbCBkZW1hbmQgKi8KKyAgb3V0bCgwLCBpb2FkZHIgKyBDU1IyKTsKK30KKworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGV0aF90cmFuc21pdCAtIFRyYW5zbWl0IGEgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZGF2aWNvbV90cmFuc21pdChzdHJ1Y3QgbmljICpuaWMsIGNvbnN0IGNoYXIgKmQsIHVuc2lnbmVkIGludCB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHMsIGNvbnN0IGNoYXIgKnApCit7CisgIHVuc2lnbmVkIGxvbmcgdG87CisKKyAgd2hlcmVhbWkoImRhdmljb21fdHJhbnNtaXRcbiIpOworCisgIC8qIFN0b3AgVHggKi8KKyAgLyogb3V0bChpbmwoaW9hZGRyICsgQ1NSNikgJiB+MHgwMDAwMjAwMCwgaW9hZGRyICsgQ1NSNik7ICovCisKKyAgLyogc2V0dXAgZXRoZXJuZXQgaGVhZGVyICovCisgIG1lbWNweSgmdHhiWzBdLCBkLCBFVEhfQUxFTik7CS8qIERBIDZieXRlICovCisgIG1lbWNweSgmdHhiW0VUSF9BTEVOXSwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsgLyogU0EgNmJ5dGUqLworICB0eGJbRVRIX0FMRU4qMl0gPSAodCA+PiA4KSAmIDB4RkY7IC8qIEZyYW1lIHR5cGU6IDJieXRlICovCisgIHR4YltFVEhfQUxFTioyKzFdID0gdCAmIDB4RkY7CisgIG1lbWNweSgmdHhiW0VUSF9ITEVOXSwgcCwgcyk7IC8qIEZyYW1lIGRhdGEgKi8KKworICAvKiBzZXR1cCB0aGUgdHJhbnNtaXQgZGVzY3JpcHRvciAqLworICB0eGRbVHhQdHJdLmJ1ZjFzeiAgID0gRVRIX0hMRU4rczsKKyAgdHhkW1R4UHRyXS5jb250cm9sICA9IDB4MDAwMDAxODQ7ICAgICAgLyogTFMrRlMrQ0UgKi8KKyAgdHhkW1R4UHRyXS5zdGF0dXMgICA9IDB4ODAwMDAwMDA7ICAgICAgLyogZ2l2ZSBvd25lcnNoaXAgdG8gZGV2aWNlICovCisKKyAgLyogaW1tZWRpYXRlIHRyYW5zbWl0IGRlbWFuZCAqLworICBvdXRsKDAsIGlvYWRkciArIENTUjEpOworCisgIHRvID0gY3VycnRpY2tzKCkgKyBUWF9USU1FX09VVDsKKyAgd2hpbGUgKCh0eGRbVHhQdHJdLnN0YXR1cyAmIDB4ODAwMDAwMDApICYmIChjdXJydGlja3MoKSA8IHRvKSkKKyAgICAvKiB3YWl0ICovIDsKKworICBpZiAoY3VycnRpY2tzKCkgPj0gdG8pIHsKKyAgICBwcmludGYgKCJUWCBUaW1lb3V0IVxuIik7CisgIH0KKyAKKyAgLyogUG9pbnQgdG8gbmV4dCBUWCBkZXNjcmlwdG9yICovCisgIFR4UHRyID0gKCsrVHhQdHIgPj0gTlRYRCkgPyAwOlR4UHRyOwkvKiBTdGVuIDEwLzkgKi8KKworfQorDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGV0aF9wb2xsIC0gV2FpdCBmb3IgYSBmcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBkYXZpY29tX3BvbGwoc3RydWN0IG5pYyAqbmljKQoreworICB3aGVyZWFtaSgiZGF2aWNvbV9wb2xsXG4iKTsKKworICBpZiAocnhkW3J4ZF90YWlsXS5zdGF0dXMgJiAweDgwMDAwMDAwKQorICAgIHJldHVybiAwOworCisgIHdoZXJlYW1pKCJkYXZpY29tX3BvbGwgZ290IG9uZVxuIik7CisKKyAgbmljLT5wYWNrZXRsZW4gPSAocnhkW3J4ZF90YWlsXS5zdGF0dXMgJiAweDNGRkYwMDAwKSA+PiAxNjsKKworICBpZiggcnhkW3J4ZF90YWlsXS5zdGF0dXMgJiAweDAwMDA4MDAwKXsKKyAgICAgIHJ4ZFtyeGRfdGFpbF0uc3RhdHVzID0gMHg4MDAwMDAwMDsKKyAgICAgIHJ4ZF90YWlsKys7CisgICAgICBpZiAocnhkX3RhaWwgPT0gTlJYRCkgcnhkX3RhaWwgPSAwOworICAgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBjb3B5IHBhY2tldCB0byB3b3JraW5nIGJ1ZmZlciAqLworICAvKiBYWFggLSB0aGlzIGNvcHkgY291bGQgYmUgYXZvaWRlZCB3aXRoIGEgbGl0dGxlIG1vcmUgd29yaworICAgICBidXQgZm9yIG5vdyB3ZSBhcmUgY29udGVudCB3aXRoIGl0IGJlY2F1c2UgdGhlIG9wdGltaXNlZAorICAgICBtZW1jcHkgaXMgcXVpdGUgZmFzdCAqLworCisgIG1lbWNweShuaWMtPnBhY2tldCwgcnhiICsgcnhkX3RhaWwgKiBCVUZMRU4sIG5pYy0+cGFja2V0bGVuKTsKKworICAvKiByZXR1cm4gdGhlIGRlc2NyaXB0b3IgYW5kIGJ1ZmZlciB0byByZWNlaXZlIHJpbmcgKi8KKyAgcnhkW3J4ZF90YWlsXS5zdGF0dXMgPSAweDgwMDAwMDAwOworICByeGRfdGFpbCsrOworICBpZiAocnhkX3RhaWwgPT0gTlJYRCkgcnhkX3RhaWwgPSAwOworCisgIHJldHVybiAxOworfQorDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGV0aF9kaXNhYmxlIC0gRGlzYWJsZSB0aGUgaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZGF2aWNvbV9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYykKK3sKKyAgd2hlcmVhbWkoImRhdmljb21fZGlzYWJsZVxuIik7CisKKyAgLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisgIG91dGwoMHgwMDAwMDAwMCwgaW9hZGRyICsgQ1NSNyk7CisKKyAgLyogU3RvcCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBwcm9jZXNzZXMuICovCisgIG91dGwoaW5sKGlvYWRkciArIENTUjYpICYgfjB4MDAwMDIwMDIsIGlvYWRkciArIENTUjYpOworCisgIC8qIENsZWFyIHRoZSBtaXNzZWQtcGFja2V0IGNvdW50ZXIuICovCisgICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nKWlubChpb2FkZHIgKyBDU1I4KTsKK30KKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBldGhfcHJvYmUgLSBMb29rIGZvciBhbiBhZGFwdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBuaWMgKmRhdmljb21fcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqaW9fYWRkcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCit7CisgIHVuc2lnbmVkIGludCBpOworICB1MzIgbDEsIGwyOworCisgIHdoZXJlYW1pKCJkYXZpY29tX3Byb2JlXG4iKTsKKworICBpZiAoaW9fYWRkcnMgPT0gMCB8fCAqaW9fYWRkcnMgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICB2ZW5kb3IgID0gcGNpLT52ZW5kb3I7CisgIGRldl9pZCAgPSBwY2ktPmRldl9pZDsKKyAgaW9hZGRyICA9ICppb19hZGRyczsKKworICAvKiB3YWtldXAgY2hpcCAqLworICBwY2liaW9zX3dyaXRlX2NvbmZpZ19kd29yZChwY2ktPmJ1cywgcGNpLT5kZXZmbiwgMHg0MCwgMHgwMDAwMDAwMCk7CisKKyAgLyogU3RvcCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBwcm9jZXNzZXMuICovCisgIG91dGwoaW5sKGlvYWRkciArIENTUjYpICYgfjB4MDAwMDIwMDIsIGlvYWRkciArIENTUjYpOworCisgIC8qIENsZWFyIHRoZSBtaXNzZWQtcGFja2V0IGNvdW50ZXIuICovCisgICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nKWlubChpb2FkZHIgKyBDU1I4KTsKKworICAvKiBHZXQgTUFDIEFkZHJlc3MgKi8KKyAgLyogcmVhZCBFRVBST00gZGF0YSAqLworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGVlX2RhdGEpLzI7IGkrKykKKyAgICAoKHVuc2lnbmVkIHNob3J0ICopZWVfZGF0YSlbaV0gPQorICAgICAgICBsZTE2X3RvX2NwdShyZWFkX2VlcHJvbShpb2FkZHIsIGksIEVFUFJPTV9BRERSTEVOKSk7CisKKyAgLyogZXh0cmFjdCBNQUMgYWRkcmVzcyBmcm9tIEVFUFJPTSBidWZmZXIgKi8KKyAgZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykKKyAgICBuaWMtPm5vZGVfYWRkcltpXSA9IGVlX2RhdGFbMjAraV07CisKKyAgcHJpbnRmKCJEYXZpY29tICUhIGF0IGlvYWRkciAlI2hYXG4iLCBuaWMtPm5vZGVfYWRkciwgaW9hZGRyKTsKKworICAvKiBpbml0aWFsaXplIGRldmljZSAqLworICBkYXZpY29tX3Jlc2V0KG5pYyk7CisKKyAgbmljLT5yZXNldCAgICA9IGRhdmljb21fcmVzZXQ7CisgIG5pYy0+cG9sbCAgICAgPSBkYXZpY29tX3BvbGw7CisgIG5pYy0+dHJhbnNtaXQgPSBkYXZpY29tX3RyYW5zbWl0OworICBuaWMtPmRpc2FibGUgID0gZGF2aWNvbV9kaXNhYmxlOworCisgIHJldHVybiBuaWM7Cit9CmRpZmYgLS1naXQgYS9uZXRib290L2RlcGNhLmMgYi9uZXRib290L2RlcGNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIwNTIwYgotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvZGVwY2EuYwpAQCAtMCwwICsxLDc1MiBAQAorLyogRXRoZXJib290OiBkZXBjYS5oIG1lcmdlZCwgY29tbWVudHMgZnJvbSBMaW51eCBkcml2ZXIgcmV0YWluZWQgKi8KKy8qICBkZXBjYS5jOiBBIERJR0lUQUwgREVQQ0EgICYgRXRoZXJXT1JLUyBldGhlcm5ldCBkcml2ZXIgZm9yIGxpbnV4LgorCisgICAgV3JpdHRlbiAxOTk0LCAxOTk1IGJ5IERhdmlkIEMuIERhdmllcy4KKworCisgICAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IDE5OTQgRGF2aWQgQy4gRGF2aWVzCisJCSAgICAgICAgICAgICAgICAgICBhbmQgCisJCQkgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50CisJIChhcyByZXByZXNlbnRlZCBieSB0aGUgRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeSkuICAKKworICAgICAgICAgICAgICAgQ29weXJpZ2h0IDE5OTUgIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLgorCisKKyAgICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisgICAgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKyAgICBUaGlzIGRyaXZlciBpcyB3cml0dGVuIGZvciB0aGUgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24gc2VyaWVzCisgICAgb2YgREVQQ0EgYW5kIEV0aGVyV09SS1MgZXRoZXJuZXQgY2FyZHM6CisKKyAgICAgICAgREVQQ0EgICAgICAgKHRoZSBvcmlnaW5hbCkKKyAgICAJREUxMDAKKyAgICAJREUxMDEKKwlERTIwMCBUdXJibworCURFMjAxIFR1cmJvCisJREUyMDIgVHVyYm8gKFRQIEJOQykKKwlERTIxMAorCURFNDIyICAgICAgIChFSVNBKQorCisgICAgVGhlICBkcml2ZXIgaGFzIGJlZW4gdGVzdGVkIG9uIERFMTAwLCBERTIwMCBhbmQgREUyMDIgY2FyZHMgIGluICBhCisgICAgcmVsYXRpdmVseSBidXN5IG5ldHdvcmsuIFRoZSBERTQyMiBoYXMgYmVlbiB0ZXN0ZWQgYSBsaXR0bGUuCisKKyAgICBUaGlzICBkcml2ZXIgd2lsbCBOT1Qgd29yayAgIGZvciB0aGUgREUyMDMsICBERTIwNCAgYW5kIERFMjA1IHNlcmllcyAgb2YKKyAgICBjYXJkcywgIHNpbmNlIHRoZXkgaGF2ZSAgYSAgbmV3IGN1c3RvbSBBU0lDIGluICAgcGxhY2Ugb2YgdGhlIEFNRCAgTEFOQ0UKKyAgICBjaGlwLiAgU2VlIHRoZSAnZXdyazMuYycgICBkcml2ZXIgaW4gdGhlICBMaW51eCAgc291cmNlIHRyZWUgZm9yIHJ1bm5pbmcKKyAgICB0aG9zZSBjYXJkcy4KKworICAgIEkgaGF2ZSBiZW5jaG1hcmtlZCB0aGUgZHJpdmVyIHdpdGggYSAgREUxMDAgYXQgNTk1a0IvcyB0byAoNTQya0IvcyBmcm9tKQorICAgIGEgREVDc3RhdGlvbiA1MDAwLzIwMC4KKworICAgIFRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXQgZGF2aWVzQG1hbmlhYy51bHRyYW5ldC5jb20KKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFRoZSAgZHJpdmVyIHdhcyBvcmlnaW5hbGx5IGJhc2VkICBvbiAgIHRoZSAnbGFuY2UuYycgZHJpdmVyIGZyb20gIERvbmFsZAorICAgIEJlY2tlciAgIHdoaWNoICBpcyBpbmNsdWRlZCB3aXRoICB0aGUgIHN0YW5kYXJkICBkcml2ZXIgZGlzdHJpYnV0aW9uIGZvcgorICAgIGxpbnV4LiAgVjAuNCAgaXMgIGEgY29tcGxldGUgIHJlLXdyaXRlICB3aXRoIG9ubHkgIHRoZSBrZXJuZWwgIGludGVyZmFjZQorICAgIHJlbWFpbmluZyBmcm9tIHRoZSBvcmlnaW5hbCBjb2RlLgorCisgICAgMSkgTGFuY2UuYyBjb2RlIGluIC9saW51eC9kcml2ZXJzL25ldC8KKyAgICAyKSAiRXRoZXJuZXQvSUVFRSA4MDIuMyBGYW1pbHkuIDE5OTIgV29ybGQgTmV0d29yayBEYXRhIEJvb2svSGFuZGJvb2siLAorICAgICAgIEFNRCwgMTk5MiBbKDgwMCkgMjIyLTkzMjNdLgorICAgIDMpICJBbTc5QzkwIENNT1MgTG9jYWwgQXJlYSBOZXR3b3JrIENvbnRyb2xsZXIgZm9yIEV0aGVybmV0IChDLUxBTkNFKSIsCisgICAgICAgQU1ELCBQdWIuICMxNzg4MSwgTWF5IDE5OTMuCisgICAgNCkgIkFtNzlDOTYwIFBDbmV0LUlTQSh0bSksIFNpbmdsZS1DaGlwIEV0aGVybmV0IENvbnRyb2xsZXIgZm9yIElTQSIsCisgICAgICAgQU1ELCBQdWIuICMxNjkwNywgTWF5IDE5OTIKKyAgICA1KSAiREVDIEV0aGVyV09SS1MgTEMgRXRoZXJuZXQgQ29udHJvbGxlciBPd25lcnMgTWFudWFsIiwKKyAgICAgICBEaWdpdGFsIEVxdWlwbWVudCBjb3Jwb3JhdGlvbiwgMTk5MCwgUHViLiAjRUstREUxMDAtT00uMDAzCisgICAgNikgIkRFQyBFdGhlcldPUktTIFR1cmJvIEV0aGVybmV0IENvbnRyb2xsZXIgT3duZXJzIE1hbnVhbCIsCisgICAgICAgRGlnaXRhbCBFcXVpcG1lbnQgY29ycG9yYXRpb24sIDE5OTAsIFB1Yi4gI0VLLURFMjAwLU9NLjAwMworICAgIDcpICJERVBDQSBIYXJkd2FyZSBSZWZlcmVuY2UgTWFudWFsIiwgUHViLiAjRUstREVQQ0EtUFIKKyAgICAgICBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgMTk4OQorICAgIDgpICJERUMgRXRoZXJXT1JLUyBUdXJib18oVFAgQk5DKSBFdGhlcm5ldCBDb250cm9sbGVyIE93bmVycyBNYW51YWwiLAorICAgICAgIERpZ2l0YWwgRXF1aXBtZW50IGNvcnBvcmF0aW9uLCAxOTkxLCBQdWIuICNFSy1ERTIwMi1PTS4wMDEKKyAgICAKKworICAgIFBldGVyIEJhdWVyJ3MgZGVwY2EuYyAoVjAuNSkgd2FzIHJlZmVycmVkIHRvIHdoZW4gZGVidWdnaW5nIFYwLjEgb2YgdGhpcworICAgIGRyaXZlci4KKworICAgIFRoZSBvcmlnaW5hbCBERVBDQSAgY2FyZCByZXF1aXJlcyB0aGF0IHRoZSAgZXRoZXJuZXQgUk9NIGFkZHJlc3MgY291bnRlcgorICAgIGJlIGVuYWJsZWQgdG8gY291bnQgYW5kIGhhcyBhbiA4IGJpdCBOSUNTUi4gIFRoZSBST00gY291bnRlciBlbmFibGluZyBpcworICAgIG9ubHkgIGRvbmUgd2hlbiBhICAweDA4IGlzIHJlYWQgYXMgdGhlICBmaXJzdCBhZGRyZXNzIG9jdGV0ICh0byBtaW5pbWlzZQorICAgIHRoZSBjaGFuY2VzICBvZiB3cml0aW5nIG92ZXIgc29tZSAgb3RoZXIgaGFyZHdhcmUncyAgSS9PIHJlZ2lzdGVyKS4gIFRoZQorICAgIE5JQ1NSIGFjY2Vzc2VzICAgaGF2ZSBiZWVuIGNoYW5nZWQgIHRvICBieXRlIGFjY2Vzc2VzICBmb3IgYWxsIHRoZSBjYXJkcworICAgIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciwgc2luY2UgdGhlcmUgaXMgb25seSBvbmUgIHVzZWZ1bCBiaXQgaW4gdGhlIE1TQgorICAgIChyZW1vdGUgYm9vdCB0aW1lb3V0KSBhbmQgaXQgIGlzIG5vdCB1c2VkLiAgQWxzbywgdGhlcmUgIGlzIGEgbWF4aW11bSBvZgorICAgIG9ubHkgNDhrQiBuZXR3b3JrICBSQU0gZm9yIHRoaXMgIGNhcmQuICBNeSB0aGFua3MgIHRvIFRvcmJqb3JuIExpbmRoIGZvcgorICAgIGhlbHAgZGVidWdnaW5nIGFsbCB0aGlzIChhbmQgaG9sZGluZyBteSBmZWV0IHRvICB0aGUgZmlyZSB1bnRpbCBJIGdvdCBpdAorICAgIHJpZ2h0KS4KKworICAgIFRoZSBERTIwMCAgc2VyaWVzICBib2FyZHMgaGF2ZSAgb24tYm9hcmQgNjRrQiAgUkFNIGZvciAgdXNlICBhcyBhIHNoYXJlZAorICAgIG1lbW9yeSBuZXR3b3JrICBidWZmZXIuIE9ubHkgdGhlIERFMTAwICBjYXJkcyBtYWtlIHVzZSAgb2YgYSAgMmtCIGJ1ZmZlcgorICAgIG1vZGUgd2hpY2ggaGFzIG5vdCAgYmVlbiBpbXBsZW1lbnRlZCBpbiAgdGhpcyBkcml2ZXIgKG9ubHkgdGhlIDMya0IgIGFuZAorICAgIDY0a0IgbW9kZXMgYXJlIHN1cHBvcnRlZCBbMTZrQi80OGtCIGZvciB0aGUgb3JpZ2luYWwgREVQQ0FdKS4KKworICAgIEF0IHRoZSBtb3N0IG9ubHkgMiBERVBDQSBjYXJkcyBjYW4gIGJlIHN1cHBvcnRlZCBvbiAgdGhlIElTQSBidXMgYmVjYXVzZQorICAgIHRoZXJlIGlzIG9ubHkgcHJvdmlzaW9uICBmb3IgdHdvIEkvTyBiYXNlIGFkZHJlc3NlcyAgb24gZWFjaCBjYXJkICgweDMwMAorICAgIGFuZCAweDIwMCkuIFRoZSBJL08gYWRkcmVzcyBpcyBkZXRlY3RlZCBieSBzZWFyY2hpbmcgZm9yIGEgYnl0ZSBzZXF1ZW5jZQorICAgIGluIHRoZSBFdGhlcm5ldCBzdGF0aW9uIGFkZHJlc3MgUFJPTSBhdCB0aGUgZXhwZWN0ZWQgSS9PIGFkZHJlc3MgZm9yIHRoZQorICAgIEV0aGVybmV0ICBQUk9NLiAgIFRoZSBzaGFyZWQgbWVtb3J5ICBiYXNlICAgYWRkcmVzcyAgaXMgJ2F1dG9wcm9iZWQnICBieQorICAgIGxvb2tpbmcgIGZvciB0aGUgc2VsZiAgdGVzdCBQUk9NICBhbmQgZGV0ZWN0aW5nIHRoZSAgY2FyZCBuYW1lLiAgIFdoZW4gYQorICAgIHNlY29uZCAgREVQQ0EgaXMgIGRldGVjdGVkLCAgaW5mb3JtYXRpb24gIGlzICAgcGxhY2VkIGluIHRoZSAgIGJhc2VfYWRkcgorICAgIHZhcmlhYmxlIG9mIHRoZSAgbmV4dCBkZXZpY2Ugc3RydWN0dXJlICh3aGljaCAgaXMgY3JlYXRlZCBpZiBuZWNlc3NhcnkpLAorICAgIHRodXMgIGVuYWJsaW5nIGV0aGlmX3Byb2JlICBpbml0aWFsaXphdGlvbiAgZm9yIHRoZSBkZXZpY2UuICBNb3JlIHRoYW4gMgorICAgIEVJU0EgY2FyZHMgY2FuICBiZSAgc3VwcG9ydGVkLCBidXQgIGNhcmUgd2lsbCAgYmUgIG5lZWRlZCBhc3NpZ25pbmcgIHRoZQorICAgIHNoYXJlZCBtZW1vcnkgdG8gZW5zdXJlIHRoYXQgZWFjaCBzbG90IGhhcyB0aGUgIGNvcnJlY3QgSVJRLCBJL08gYWRkcmVzcworICAgIGFuZCBzaGFyZWQgbWVtb3J5IGFkZHJlc3MgYXNzaWduZWQuCisKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE5PVEU6IElmIHlvdSBhcmUgdXNpbmcgdHdvICBJU0EgREVQQ0FzLCBpdCBpcyAgaW1wb3J0YW50IHRoYXQgeW91IGFzc2lnbgorICAgIHRoZSBiYXNlIG1lbW9yeSBhZGRyZXNzZXMgY29ycmVjdGx5LiAgIFRoZSAgZHJpdmVyIGF1dG9wcm9iZXMgSS9PICAweDMwMAorICAgIHRoZW4gMHgyMDAuICBUaGUgIGJhc2UgbWVtb3J5IGFkZHJlc3MgZm9yICB0aGUgZmlyc3QgZGV2aWNlIG11c3QgYmUgbGVzcworICAgIHRoYW4gdGhhdCBvZiB0aGUgc2Vjb25kIHNvIHRoYXQgdGhlIGF1dG8gcHJvYmUgd2lsbCBjb3JyZWN0bHkgYXNzaWduIHRoZQorICAgIEkvTyBhbmQgbWVtb3J5IGFkZHJlc3NlcyBvbiB0aGUgc2FtZSBjYXJkLiAgSSBjYW4ndCB0aGluayBvZiBhIHdheSB0byBkbworICAgIHRoaXMgdW5hbWJpZ3VvdXNseSBhdCB0aGUgbW9tZW50LCBzaW5jZSB0aGVyZSBpcyBub3RoaW5nIG9uIHRoZSBjYXJkcyB0bworICAgIHRpZSBJL08gYW5kIG1lbW9yeSBpbmZvcm1hdGlvbiB0b2dldGhlci4KKworICAgIEkgYW0gdW5hYmxlICB0byAgdGVzdCAgMiBjYXJkcyAgIHRvZ2V0aGVyIGZvciBub3csICAgIHNvIHRoaXMgIGNvZGUgICBpcworICAgIHVuY2hlY2tlZC4gQWxsIHJlcG9ydHMsIGdvb2Qgb3IgYmFkLCBhcmUgd2VsY29tZS4KKworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgVGhlIGJvYXJkIElSUSAgIHNldHRpbmcgbXVzdCBiZSAgYXQgYW4gIHVudXNlZCBJUlEgd2hpY2ggIGlzIGF1dG8tcHJvYmVkCisgICAgdXNpbmcgRG9uYWxkIEJlY2tlcidzIGF1dG9wcm9iZSByb3V0aW5lcy4gREVQQ0EgYW5kIERFMTAwIGJvYXJkIElSUXMgYXJlCisgICAgezIsMyw0LDUsN30sIHdoZXJlYXMgdGhlICBERTIwMCBpcyBhdCB7NSw5LDEwLDExLDE1fS4gIE5vdGUgdGhhdCBJUlEyIGlzCisgICAgcmVhbGx5IElSUTkgaW4gbWFjaGluZXMgd2l0aCAxNiBJUlEgbGluZXMuCisKKyAgICBObyAxNk1CIG1lbW9yeSAgbGltaXRhdGlvbiBzaG91bGQgZXhpc3Qgd2l0aCB0aGlzICBkcml2ZXIgYXMgRE1BIGlzICBub3QKKyAgICB1c2VkIGFuZCB0aGUgY29tbW9uIG1lbW9yeSBhcmVhIGlzIGluIGxvdyBtZW1vcnkgb24gdGhlIG5ldHdvcmsgY2FyZCAobXkKKyAgICBjdXJyZW50IHN5c3RlbSBoYXMgMjBNQiBhbmQgSSd2ZSBub3QgaGFkIHByb2JsZW1zIHlldCkuCisKKyAgICBUaGUgYWJpbGl0eSB0byBsb2FkIHRoaXMgZHJpdmVyIGFzIGEgbG9hZGFibGUgbW9kdWxlIGhhcyBiZWVuIGFkZGVkLiBUbworICAgIHV0aWxpc2UgdGhpcyBhYmlsaXR5LCB5b3UgaGF2ZSB0byBkbyA8OCB0aGluZ3M6CisKKyAgICAwKSBoYXZlIGEgY29weSBvZiB0aGUgbG9hZGFibGUgbW9kdWxlcyBjb2RlIGluc3RhbGxlZCBvbiB5b3VyIHN5c3RlbS4KKyAgICAxKSBjb3B5IGRlcGNhLmMgZnJvbSB0aGUgIC9saW51eC9kcml2ZXJzL25ldCBkaXJlY3RvcnkgdG8geW91ciBmYXZvdXJpdGUKKyAgICB0ZW1wb3JhcnkgZGlyZWN0b3J5LgorICAgIDIpIGlmIHlvdSB3aXNoLCBlZGl0IHRoZSAgc291cmNlIGNvZGUgbmVhciAgbGluZSAxNTMwIHRvIHJlZmxlY3QgdGhlIEkvTworICAgIGFkZHJlc3MgYW5kIElSUSB5b3UncmUgdXNpbmcgKHNlZSBhbHNvIDUpLgorICAgIDMpIGNvbXBpbGUgIGRlcGNhLmMsIGJ1dCBpbmNsdWRlIC1ETU9EVUxFIGluICB0aGUgY29tbWFuZCBsaW5lIHRvIGVuc3VyZQorICAgIHRoYXQgdGhlIGNvcnJlY3QgYml0cyBhcmUgY29tcGlsZWQgKHNlZSBlbmQgb2Ygc291cmNlIGNvZGUpLgorICAgIDQpIGlmIHlvdSBhcmUgd2FudGluZyB0byBhZGQgYSBuZXcgIGNhcmQsIGdvdG8gNS4gT3RoZXJ3aXNlLCByZWNvbXBpbGUgYQorICAgIGtlcm5lbCB3aXRoIHRoZSBkZXBjYSBjb25maWd1cmF0aW9uIHR1cm5lZCBvZmYgYW5kIHJlYm9vdC4KKyAgICA1KSBpbnNtb2QgZGVwY2EubyBbaXJxPTddIFtpbz0weDIwMF0gW21lbT0weGQwMDAwXSBbYWRhcHRlcl9uYW1lPURFMTAwXQorICAgICAgIFtBbGFuIENveDogQ2hhbmdlZCB0aGUgY29kZSB0byBhbGxvdyBjb21tYW5kIGxpbmUgaXJxL2lvIGFzc2lnbm1lbnRzXQorICAgICAgIFtEYXZlIERhdmllczogQ2hhbmdlZCB0aGUgY29kZSB0byBhbGxvdyBjb21tYW5kIGxpbmUgbWVtL25hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25tZW50c10KKyAgICA2KSBydW4gdGhlIG5ldCBzdGFydHVwIGJpdHMgZm9yIHlvdXIgZXRoPz8gaW50ZXJmYWNlIG1hbnVhbGx5IAorICAgICh1c3VhbGx5IC9ldGMvcmMuaW5ldFsxMl0gYXQgYm9vdCB0aW1lKS4gCisgICAgNykgZW5qb3khCisKKyAgICBOb3RlIHRoYXQgYXV0b3Byb2JpbmcgaXMgbm90IGFsbG93ZWQgaW4gbG9hZGFibGUgbW9kdWxlcyAtIHRoZSBzeXN0ZW0gaXMKKyAgICBhbHJlYWR5IHVwIGFuZCBydW5uaW5nIGFuZCB5b3UncmUgbWVzc2luZyB3aXRoIGludGVycnVwdHMuCisKKyAgICBUbyB1bmxvYWQgYSBtb2R1bGUsIHR1cm4gb2ZmIHRoZSBhc3NvY2lhdGVkIGludGVyZmFjZSAKKyAgICAnaWZjb25maWcgZXRoPz8gZG93bicgdGhlbiAncm1tb2QgZGVwY2EnLgorCisgICAgVG8gYXNzaWduIGEgYmFzZSBtZW1vcnkgYWRkcmVzcyBmb3IgdGhlIHNoYXJlZCBtZW1vcnkgIHdoZW4gcnVubmluZyBhcyBhCisgICAgbG9hZGFibGUgbW9kdWxlLCBzZWUgNSBhYm92ZS4gIFRvIGluY2x1ZGUgdGhlIGFkYXB0ZXIgIG5hbWUgKGlmIHlvdSBoYXZlCisgICAgbm8gUFJPTSAgYnV0IGtub3cgdGhlIGNhcmQgbmFtZSkgIGFsc28gc2VlIDUgIGFib3ZlLiBOb3RlIHRoYXQgdGhpcyBsYXN0CisgICAgb3B0aW9uICB3aWxsIG5vdCB3b3JrICB3aXRoIGtlcm5lbCAgYnVpbHQtaW4gIGRlcGNhJ3MuIAorCisgICAgVGhlIHNoYXJlZCBtZW1vcnkgYXNzaWdubWVudCBmb3IgYSBsb2FkYWJsZSBtb2R1bGUgIG1ha2VzIHNlbnNlIHRvIGF2b2lkCisgICAgdGhlICdtZW1vcnkgYXV0b3Byb2JlJyBwaWNraW5nIHRoZSB3cm9uZyBzaGFyZWQgbWVtb3J5ICAoZm9yIHRoZSBjYXNlIG9mCisgICAgMiBkZXBjYSdzIGluIGEgUEMpLgorCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgU3VwcG9ydCBmb3IgTUNBIEV0aGVyV09SS1MgY2FyZHMgYWRkZWQgMTEtMy05OC4KKyAgICBWZXJpZmllZCB0byB3b3JrIHdpdGggdXAgdG8gMiBERTIxMiBjYXJkcyBpbiBhIHN5c3RlbSAoYWx0aG91Z2ggbm90CisgICAgICBmdWxseSBzdHJlc3MtdGVzdGVkKS4gIAorCisgICAgQ3VycmVudGx5IGtub3duIGJ1Z3MvbGltaXRhdGlvbnM6CisKKyAgICBOb3RlOiAgd2l0aCB0aGUgTUNBIHN0dWZmIGFzIGEgbW9kdWxlLCBpdCB0cnVzdHMgdGhlIE1DQSBjb25maWd1cmF0aW9uLAorICAgICAgICAgICBub3QgdGhlIGNvbW1hbmQgbGluZSBmb3IgSVJRIGFuZCBtZW1vcnkgYWRkcmVzcy4gIFlvdSBjYW4KKyAgICAgICAgICAgc3BlY2lmeSB0aGVtIGlmIHlvdSB3YW50LCBidXQgaXQgd2lsbCB0aHJvdyB5b3VyIHZhbHVlcyBvdXQuCisgICAgICAgICAgIFlvdSBzdGlsbCBoYXZlIHRvIHBhc3MgdGhlIElPIGFkZHJlc3MgaXQgd2FzIGNvbmZpZ3VyZWQgYXMKKyAgICAgICAgICAgdGhvdWdoLgorCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgVE8gRE86CisgICAgLS0tLS0tCisKKworICAgIFJldmlzaW9uIEhpc3RvcnkKKyAgICAtLS0tLS0tLS0tLS0tLS0tCisKKyAgICBWZXJzaW9uICAgRGF0ZSAgICAgICAgRGVzY3JpcHRpb24KKyAgCisgICAgICAwLjEgICAgIDI1LWphbi05NCAgIEluaXRpYWwgd3JpdGluZy4KKyAgICAgIDAuMiAgICAgMjctamFuLTk0ICAgQWRkZWQgTEFOQ0UgVFggaGFyZHdhcmUgYnVmZmVyIGNoYWluaW5nLgorICAgICAgMC4zICAgICAgMS1mZWItOTQgICBBZGRlZCBtdWx0aXBsZSBERVBDQSBzdXBwb3J0LgorICAgICAgMC4zMSAgICAgNC1mZWItOTQgICBBZGRlZCBERTIwMiByZWNvZ25pdGlvbi4KKyAgICAgIDAuMzIgICAgMTktZmViLTk0ICAgVGlkeSB1cC4gSW1wcm92ZSBtdWx0aS1ERVBDQSBzdXBwb3J0LgorICAgICAgMC4zMyAgICAyNS1mZWItOTQgICBGaXggREVQQ0EgZXRoZXJuZXQgUk9NIGNvdW50ZXIgZW5hYmxlLgorICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgamFiYmVyIHBhY2tldCBmaXggZnJvbSBtdXJmQHBlcmZ0ZWNoLmNvbQorCQkJICBhbmQgYmVja2VyQHN1cGVyLm9yZworICAgICAgMC4zNCAgICAgNy1tYXItOTQgICBGaXggREVQQ0EgbWF4IG5ldHdvcmsgbWVtb3J5IFJBTSAmIE5JQ1NSIGFjY2Vzcy4KKyAgICAgIDAuMzUgICAgIDgtbWFyLTk0ICAgQWRkZWQgREUyMDEgcmVjb2duaXRpb24uIFRpZGllZCB1cC4KKyAgICAgIDAuMzUxICAgMzAtYXByLTk0ICAgQWRkZWQgRUlTQSBzdXBwb3J0LiBBZGRlZCBERTQyMiByZWNvZ25pdGlvbi4KKyAgICAgIDAuMzYgICAgMTYtbWF5LTk0ICAgREU0MjIgZml4IHJlbGVhc2VkLgorICAgICAgMC4zNyAgICAyMi1qdWwtOTQgICBBZGRlZCBNT0RVTEUgc3VwcG9ydAorICAgICAgMC4zOCAgICAxNS1hdWctOTQgICBBZGRlZCBEQlIgUk9NIHN3aXRjaCBpbiBkZXBjYV9jbG9zZSgpLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGkgREVQQ0EgYnVnIGZpeC4KKyAgICAgIDAuMzhheHAgMTUtc2VwLTk0ICAgU3BlY2lhbCB2ZXJzaW9uIGZvciBBbHBoYSBBWFAgTGludXggVjEuMC4KKyAgICAgIDAuMzgxICAgMTItZGVjLTk0ICAgQWRkZWQgREUxMDEgcmVjb2duaXRpb24sIGZpeCBtdWx0aWNhc3QgYnVnLgorICAgICAgMC4zODIgICAgOS1mZWItOTUgICBGaXggcmVjb2duaXRpb24gYnVnIHJlcG9ydGVkIGJ5IDxia21Ac3Rhci5ybC5hYy51az4uCisgICAgICAwLjM4MyAgIDIyLWZlYi05NSAgIEZpeCBmb3IgY29uZmxpY3Qgd2l0aCBWRVNBIFNDU0kgcmVwb3J0ZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9tYWluQGFsZi5kZWMuY29tPgorICAgICAgMC4zODQgICAxNy1tYXItOTUgICBGaXggYSByaW5nIGZ1bGwgYnVnIHJlcG9ydGVkIGJ5IDxia21Ac3Rhci5ybC5hYy51az4KKyAgICAgIDAuMzg1ICAgIDMtYXByLTk1ICAgRml4IGEgcmVjb2duaXRpb24gYnVnIHJlcG9ydGVkIGJ5IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJ5YW4ubmllbWlAbGFzdGZyb250aWVyLmNvbT4KKyAgICAgIDAuMzg2ICAgMjEtYXByLTk1ICAgRml4IHRoZSBsYXN0IGZpeC4uLnNvcnJ5LCBtdXN0IGJlIGdhbGxvcGluZyBzZW5pbGl0eQorICAgICAgMC40MCAgICAyNS1NYXktOTUgICBSZXdyaXRlIGZvciBwb3J0YWJpbGl0eSAmIHVwZGF0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBIHN1cHBvcnQgZnJvbSA8amVzdGFicm9AYW10LnRheTEuZGVjLmNvbT4KKyAgICAgIDAuNDEgICAgMjYtSnVuLTk1ICAgQWRkZWQgdmVyaWZ5X2FyZWEoKSBjYWxscyBpbiBkZXBjYV9pb2N0bCgpIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbiBieSA8aGVpa29AY29sb3NzdXMuZXNjYXBlLmRlPgorICAgICAgMC40MiAgICAyNy1EZWMtOTUgICBBZGQgJ21lbScgc2hhcmVkIG1lbW9yeSBhc3NpZ25tZW50IGZvciBsb2FkYWJsZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkICdhZGFwdGVyX25hbWUnIGZvciBsb2FkYWJsZSBtb2R1bGVzIHdoZW4gbm8gUFJPTS4KKwkJCSAgQm90aCBhYm92ZSBmcm9tIGEgc3VnZ2VzdGlvbiBieSAKKwkJCSAgPHBjaGVuQHdvb2RydWZmczEyMS5yZXNpZGVuY2UuZ2F0ZWNoLmVkdT4uCisJCQkgIEFkZCBuZXcgbXVsdGljYXN0aW5nIGNvZGUuCisgICAgICAwLjQyMSAgIDIyLUFwci05NgkgIEZpeCBhbGxvY19kZXZpY2UoKSBidWcgPGphcmlAbWFya2t1czIuZmltci5maT4KKyAgICAgIDAuNDIyICAgMjktQXByLTk2CSAgRml4IGRlcGNhX2h3X2luaXQoKSBidWcgPGphcmlAbWFya2t1czIuZmltci5maT4KKyAgICAgIDAuNDIzICAgIDctSnVuLTk2ICAgRml4IG1vZHVsZSBsb2FkIGJ1ZyA8a21nQGJhcmNvLmJlPgorICAgICAgMC40MyAgICAxNi1BdWctOTYgICBVcGRhdGUgYWxsb2NfZGV2aWNlKCkgdG8gY29uZm9ybSB0byBkZTR4NS5jCisgICAgICAwLjQ0ICAgICAxLVNlcC05NyAgIEZpeCAqX3Byb2JlKCkgdG8gdGVzdCBjaGVja19yZWdpb24oKSBmaXJzdCAtIGJ1ZworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWQgYnkgPG1tb2dpbHZpQGVsYmVydC51Y2NzLmVkdT4KKyAgICAgIDAuNDUgICAgIDMtTm92LTk4ICAgQWRkZWQgc3VwcG9ydCBmb3IgTUNBIEV0aGVyV09SS1MgKERFMjEwL0RFMjEyKSBjYXJkcworICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPHR5bW1AY29tcHV0ZXIub3JnPiAKKyAgICAgIDAuNDUxICAgIDUtTm92LTk4ICAgRml4ZWQgbWNhIHN0dWZmIGN1eiBJJ20gYSBkdW1teS4gPHR5bW1AY29tcHV0ZXIub3JnPgorICAgICAgMC41ICAgICAxNC1Ob3YtOTggICBSZS1zcGluIGZvciAyLjEueCBrZXJuZWxzLgorICAgICAgMC41MSAgICAyNy1KdW4tOTkgICBDb3JyZWN0IHJlY2VpdmVkIHBhY2tldCBsZW5ndGggZm9yIENSQyBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnQgYnkgPHdvcm1AZGtpay5kaz4KKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKyNpbmNsdWRlICJldGhlcmJvb3QuaCIKKyNpbmNsdWRlICJuaWMuaCIKKyNpbmNsdWRlICJjYXJkcy5oIgorCisvKgorKiogSS9PIGFkZHJlc3Nlcy4gTm90ZSB0aGF0IHRoZSAyayBidWZmZXIgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4KKyoqIHRoaXMgZHJpdmVyLgorKi8KKyNkZWZpbmUgREVQQ0FfTklDU1IgaW9hZGRyKzB4MDAgICAvKiBOZXR3b3JrIGludGVyZmFjZSBDU1IgKi8KKyNkZWZpbmUgREVQQ0FfUkJJICAgaW9hZGRyKzB4MDIgICAvKiBSQU0gYnVmZmVyIGluZGV4ICgyayBidWZmZXIgbW9kZSkgKi8KKyNkZWZpbmUgREVQQ0FfREFUQSAgaW9hZGRyKzB4MDQgICAvKiBMQU5DRSByZWdpc3RlcnMnIGRhdGEgcG9ydCAqLworI2RlZmluZSBERVBDQV9BRERSICBpb2FkZHIrMHgwNiAgIC8qIExBTkNFIHJlZ2lzdGVycycgYWRkcmVzcyBwb3J0ICovCisjZGVmaW5lIERFUENBX0hCQVNFIGlvYWRkcisweDA4ICAgLyogRUlTQSBoaWdoIG1lbW9yeSBiYXNlIGFkZHJlc3MgcmVnLiAqLworI2RlZmluZSBERVBDQV9QUk9NICBpb2FkZHIrMHgwYyAgIC8qIEV0aGVybmV0IGFkZHJlc3MgUk9NIGRhdGEgcG9ydCAqLworI2RlZmluZSBERVBDQV9DTkZHICBpb2FkZHIrMHgwYyAgIC8qIEVJU0EgQ29uZmlndXJhdGlvbiBwb3J0ICovCisjZGVmaW5lIERFUENBX1JCU0EgIGlvYWRkcisweDBlICAgLyogUkFNIGJ1ZmZlciBzdGFydGluZyBhZGRyZXNzICgyayBidWZmLikgKi8KKworLyoKKyoqIFRoZXNlIGFyZSBMQU5DRSByZWdpc3RlcnMgYWRkcmVzc2FibGUgdGhyb3VnaCBERVBDQV9BRERSIAorKi8KKyNkZWZpbmUgQ1NSMCAgICAgICAwCisjZGVmaW5lIENTUjEgICAgICAgMQorI2RlZmluZSBDU1IyICAgICAgIDIKKyNkZWZpbmUgQ1NSMyAgICAgICAzCisKKy8qIAorKiogTkVUV09SSyBJTlRFUkZBQ0UgQ1NSIChOSV9DU1IpIGJpdCBkZWZpbml0aW9ucyAKKyovCisgCisjZGVmaW5lIFRPICAgICAgIAkweDAxMDAJLyogVGltZSBPdXQgZm9yIHJlbW90ZSBib290ICovCisjZGVmaW5lIFNIRSAgICAgIAkweDAwODAgIC8qIFNIYWRvdyBtZW1vcnkgRW5hYmxlICovCisjZGVmaW5lIEJTICAgICAgIAkweDAwNDAgIC8qIEJhbmsgU2VsZWN0ICovCisjZGVmaW5lIEJVRiAgICAgIAkweDAwMjAJLyogQlVGZmVyIHNpemUgKDEtPjMyaywgMC0+NjRrKSAqLworI2RlZmluZSBSQkUgICAgICAJMHgwMDEwCS8qIFJlbW90ZSBCb290IEVuYWJsZSAoMS0+bmV0IGJvb3QpICovCisjZGVmaW5lIEFBQyAgICAgIAkweDAwMDggIC8qIEFkZHJlc3MgUk9NIEFkZHJlc3MgQ291bnRlciAoMS0+ZW5hYmxlKSAqLworI2RlZmluZSBfMTI4S0IgICAgICAJMHgwMDA4ICAvKiAxMjhrQiBOZXR3b3JrIFJBTSAoMS0+ZW5hYmxlKSAqLworI2RlZmluZSBJTSAgICAgICAJMHgwMDA0CS8qIEludGVycnVwdCBNYXNrICgxLT5tYXNrKSAqLworI2RlZmluZSBJRU4gICAgICAJMHgwMDAyCS8qIEludGVycnVwdCB0cmlzdGF0ZSBFTmFibGUgKDEtPmVuYWJsZSkgKi8KKyNkZWZpbmUgTEVEICAgICAgCTB4MDAwMQkvKiBMRUQgY29udHJvbCAqLworCisvKiAKKyoqIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlciAwIChDU1IwKSBiaXQgZGVmaW5pdGlvbnMgCisqLworCisjZGVmaW5lIEVSUiAgICAgCTB4ODAwMCAJLyogRXJyb3Igc3VtbWFyeSAqLworI2RlZmluZSBCQUJMICAgIAkweDQwMDAgCS8qIEJhYmJsZSB0cmFuc21pdHRlciB0aW1lb3V0IGVycm9yICAqLworI2RlZmluZSBDRVJSICAgIAkweDIwMDAgCS8qIENvbGxpc2lvbiBFcnJvciAqLworI2RlZmluZSBNSVNTICAgIAkweDEwMDAgCS8qIE1pc3NlZCBwYWNrZXQgKi8KKyNkZWZpbmUgTUVSUiAgICAJMHgwODAwIAkvKiBNZW1vcnkgRXJyb3IgKi8KKyNkZWZpbmUgUklOVCAgICAJMHgwNDAwIAkvKiBSZWNlaXZlciBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgVElOVCAgICAJMHgwMjAwIAkvKiBUcmFuc21pdCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSURPTiAgICAJMHgwMTAwIAkvKiBJbml0aWFsaXphdGlvbiBEb25lICovCisjZGVmaW5lIElOVFIgICAgCTB4MDA4MCAJLyogSW50ZXJydXB0IEZsYWcgKi8KKyNkZWZpbmUgSU5FQSAgICAJMHgwMDQwIAkvKiBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIFJYT04gICAgCTB4MDAyMCAJLyogUmVjZWl2ZXIgb24gKi8KKyNkZWZpbmUgVFhPTiAgICAJMHgwMDEwIAkvKiBUcmFuc21pdHRlciBvbiAqLworI2RlZmluZSBURE1EICAgIAkweDAwMDggCS8qIFRyYW5zbWl0IERlbWFuZCAqLworI2RlZmluZSBTVE9QICAgIAkweDAwMDQgCS8qIFN0b3AgKi8KKyNkZWZpbmUgU1RSVCAgICAJMHgwMDAyIAkvKiBTdGFydCAqLworI2RlZmluZSBJTklUICAgIAkweDAwMDEgCS8qIEluaXRpYWxpemUgKi8KKyNkZWZpbmUgSU5UTSAgICAgICAgICAgIDB4ZmYwMCAgLyogSW50ZXJydXB0IE1hc2sgKi8KKyNkZWZpbmUgSU5URSAgICAgICAgICAgIDB4ZmZmMCAgLyogSW50ZXJydXB0IEVuYWJsZSAqLworCisvKgorKiogQ09OVFJPTCBBTkQgU1RBVFVTIFJFR0lTVEVSIDMgKENTUjMpCisqLworCisjZGVmaW5lIEJTV1AgICAgCTB4MDAwNAkvKiBCeXRlIFNXYVAgKi8KKyNkZWZpbmUgQUNPTiAgICAJMHgwMDAyCS8qIEFMRSBjb250cm9sICovCisjZGVmaW5lIEJDT04gICAgCTB4MDAwMQkvKiBCeXRlIENPTnRyb2wgKi8KKworLyoKKyoqIEluaXRpYWxpemF0aW9uIEJsb2NrIE1vZGUgUmVnaXN0ZXIgCisqLworCisjZGVmaW5lIFBST00gICAgICAgCTB4ODAwMCAJLyogUHJvbWlzY3VvdXMgTW9kZSAqLworI2RlZmluZSBFTUJBICAgICAgIAkweDAwODAJLyogRW5hYmxlIE1vZGlmaWVkIEJhY2stb2ZmIEFsZ29yaXRobSAqLworI2RlZmluZSBJTlRMICAgICAgIAkweDAwNDAgCS8qIEludGVybmFsIExvb3BiYWNrICovCisjZGVmaW5lIERSVFkgICAgICAgCTB4MDAyMCAJLyogRGlzYWJsZSBSZXRyeSAqLworI2RlZmluZSBDT0xMICAgICAgIAkweDAwMTAgCS8qIEZvcmNlIENvbGxpc2lvbiAqLworI2RlZmluZSBEVENSICAgICAgIAkweDAwMDggCS8qIERpc2FibGUgVHJhbnNtaXQgQ1JDICovCisjZGVmaW5lIExPT1AgICAgICAgCTB4MDAwNCAJLyogTG9vcGJhY2sgKi8KKyNkZWZpbmUgRFRYICAgICAgICAJMHgwMDAyIAkvKiBEaXNhYmxlIHRoZSBUcmFuc21pdHRlciAqLworI2RlZmluZSBEUlggICAgICAgIAkweDAwMDEgCS8qIERpc2FibGUgdGhlIFJlY2VpdmVyICovCisKKy8qCisqKiBSZWNlaXZlIE1lc3NhZ2UgRGVzY3JpcHRvciAxIChSTUQxKSBiaXQgZGVmaW5pdGlvbnMuIAorKi8KKworI2RlZmluZSBSX09XTiAgICAgICAweDgwMDAwMDAwIAkvKiBPd25lciBiaXQgMCA9IGhvc3QsIDEgPSBsYW5jZSAqLworI2RlZmluZSBSX0VSUiAgICAgCTB4NDAwMCAJLyogRXJyb3IgU3VtbWFyeSAqLworI2RlZmluZSBSX0ZSQU0gICAgCTB4MjAwMCAJLyogRnJhbWluZyBFcnJvciAqLworI2RlZmluZSBSX09GTE8gICAgCTB4MTAwMCAJLyogT3ZlcmZsb3cgRXJyb3IgKi8KKyNkZWZpbmUgUl9DUkMgICAgIAkweDA4MDAgCS8qIENSQyBFcnJvciAqLworI2RlZmluZSBSX0JVRkYgICAgCTB4MDQwMCAJLyogQnVmZmVyIEVycm9yICovCisjZGVmaW5lIFJfU1RQICAgICAJMHgwMjAwIAkvKiBTdGFydCBvZiBQYWNrZXQgKi8KKyNkZWZpbmUgUl9FTlAgICAgIAkweDAxMDAgCS8qIEVuZCBvZiBQYWNrZXQgKi8KKworLyoKKyoqIFRyYW5zbWl0IE1lc3NhZ2UgRGVzY3JpcHRvciAxIChUTUQxKSBiaXQgZGVmaW5pdGlvbnMuIAorKi8KKworI2RlZmluZSBUX09XTiAgICAgICAweDgwMDAwMDAwIAkvKiBPd25lciBiaXQgMCA9IGhvc3QsIDEgPSBsYW5jZSAqLworI2RlZmluZSBUX0VSUiAgICAgCTB4NDAwMCAJLyogRXJyb3IgU3VtbWFyeSAqLworI2RlZmluZSBUX0FERF9GQ1MgCTB4MjAwMCAJLyogTW9yZSB0aGUgMSByZXRyeSBuZWVkZWQgdG8gWG1pdCAqLworI2RlZmluZSBUX01PUkUgICAgCTB4MTAwMAkvKiA+MSByZXRyeSB0byB0cmFuc21pdCBwYWNrZXQgKi8KKyNkZWZpbmUgVF9PTkUgICAgIAkweDA4MDAgCS8qIDEgdHJ5IG5lZWRlZCB0byB0cmFuc21pdCB0aGUgcGFja2V0ICovCisjZGVmaW5lIFRfREVGICAgICAJMHgwNDAwIAkvKiBEZWZlcnJlZCAqLworI2RlZmluZSBUX1NUUCAgICAgICAweDAyMDAwMDAwIAkvKiBTdGFydCBvZiBQYWNrZXQgKi8KKyNkZWZpbmUgVF9FTlAgICAgICAgMHgwMTAwMDAwMAkvKiBFbmQgb2YgUGFja2V0ICovCisjZGVmaW5lIFRfRkxBR1MgICAgIDB4ZmYwMDAwMDAgIC8qIFRYIEZsYWdzIEZpZWxkICovCisKKy8qCisqKiBUcmFuc21pdCBNZXNzYWdlIERlc2NyaXB0b3IgMyAoVE1EMykgYml0IGRlZmluaXRpb25zLgorKi8KKworI2RlZmluZSBUTUQzX0JVRkYgICAgMHg4MDAwCS8qIEJVRkZlciBlcnJvciAqLworI2RlZmluZSBUTUQzX1VGTE8gICAgMHg0MDAwCS8qIFVuZGVyRkxPdyBlcnJvciAqLworI2RlZmluZSBUTUQzX1JFUyAgICAgMHgyMDAwCS8qIFJFU2VydmVkICovCisjZGVmaW5lIFRNRDNfTENPTCAgICAweDEwMDAJLyogTGF0ZSBDT0xsaXNpb24gKi8KKyNkZWZpbmUgVE1EM19MQ0FSICAgIDB4MDgwMAkvKiBMb3NzIG9mIENBUnJpZXIgKi8KKyNkZWZpbmUgVE1EM19SVFJZICAgIDB4MDQwMAkvKiBSZVRSWSBlcnJvciAqLworCisvKgorKiogRXRoZXJuZXQgUFJPTSBkZWZpbmVzCisqLworI2RlZmluZSBQUk9CRV9MRU5HVEggICAgMzIKKworLyoKKyoqIFNldCB0aGUgbnVtYmVyIG9mIFR4IGFuZCBSeCBidWZmZXJzLiBFbnN1cmUgdGhhdCB0aGUgbWVtb3J5IHJlcXVlc3RlZAorKiogaGVyZSBpcyA8PSB0byB0aGUgYW1vdW50IG9mIHNoYXJlZCBtZW1vcnkgc2V0IHVwIGJ5IHRoZSBib2FyZCBzd2l0Y2hlcy4KKyoqIFRoZSBudW1iZXIgb2YgZGVzY3JpcHRvcnMgTVVTVCBCRSBBIFBPV0VSIE9GIDIuCisqKgorKiogdG90YWxfbWVtb3J5ID0gTlVNX1JYX0RFU0MqKDgrUlhfQlVGRl9TWikgKyBOVU1fVFhfREVTQyooOCtUWF9CVUZGX1NaKQorKi8KKyNkZWZpbmUgTlVNX1JYX0RFU0MgICAgIDIgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgUlggZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgTlVNX1RYX0RFU0MgICAgIDIgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgVFggZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgUlhfQlVGRl9TWgkxNTM2ICAgICAgICAgICAgLyogQnVmZmVyIHNpemUgZm9yIGVhY2ggUnggYnVmZmVyICovCisjZGVmaW5lIFRYX0JVRkZfU1oJMTUzNiAgICAgICAgICAgIC8qIEJ1ZmZlciBzaXplIGZvciBlYWNoIFR4IGJ1ZmZlciAqLworCisvKgorKiogSVNBIEJ1cyBkZWZpbmVzCisqLworI2RlZmluZSBERVBDQV9JT19QT1JUUwl7MHgzMDAsIDB4MjAwLCAwfQorCisjaWZuZGVmCURFUENBX01PREVMCisjZGVmaW5lCURFUENBX01PREVMCURFUENBCisjZW5kaWYKKworc3RhdGljIGVudW0geworCURFUENBLCBERTEwMCwgREUxMDEsIERFMjAwLCBERTIwMSwgREUyMDIsIERFMjEwLCBERTIxMiwgREU0MjIsIHVua25vd24KK30gYWRhcHRlciA9IERFUENBX01PREVMOworCisvKgorKiogTmFtZSA8LT4gQWRhcHRlciBtYXBwaW5nCisqLworCitzdGF0aWMgY2hhciAqYWRhcHRlcl9uYW1lW10gPSB7CisJIkRFUENBIiwKKwkiREUxMDAiLCJERTEwMSIsCisJIkRFMjAwIiwiREUyMDEiLCJERTIwMiIsCisJIkRFMjEwIiwiREUyMTIiLAorCSJERTQyMiIsCisJIiIKK307CisKKyNpZm5kZWYJREVQQ0FfUkFNX0JBU0UKKyNkZWZpbmUgREVQQ0FfUkFNX0JBU0UJMHhkMDAwMAorI2VuZGlmCisKKy8qCisqKiBNZW1vcnkgQWxpZ25tZW50LiBFYWNoIGRlc2NyaXB0b3IgaXMgNCBsb25nd29yZHMgbG9uZy4gVG8gZm9yY2UgYQorKiogcGFydGljdWxhciBhbGlnbm1lbnQgb24gdGhlIFRYIGRlc2NyaXB0b3IsIGFkanVzdCBERVNDX1NLSVBfTEVOIGFuZAorKiogREVTQ19BTElHTi4gQUxJR04gYWxpZ25zIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBwcml2YXRlIG1lbW9yeSBhcmVhCisqKiBhbmQgaGVuY2UgdGhlIFJYIGRlc2NyaXB0b3IgcmluZydzIGZpcnN0IGVudHJ5LiAKKyovCisjZGVmaW5lIEFMSUdONCAgICAgICgodTMyKTQgLSAxKSAgICAgICAvKiAxIGxvbmd3b3JkIGFsaWduICovCisjZGVmaW5lIEFMSUdOOCAgICAgICgodTMyKTggLSAxKSAgICAgICAvKiAyIGxvbmd3b3JkIChxdWFkd29yZCkgYWxpZ24gKi8KKyNkZWZpbmUgQUxJR04gICAgICAgICBBTElHTjggICAgICAgICAgICAgIC8qIEtlZXAgdGhlIExBTkNFIGhhcHB5Li4uICovCisKK3R5cGVkZWYJbG9uZwkJczMyOwordHlwZWRlZgl1bnNpZ25lZCBsb25nCXUzMjsKK3R5cGVkZWYJc2hvcnQJCXMxNjsKK3R5cGVkZWYJdW5zaWduZWQgc2hvcnQJdTE2OwordHlwZWRlZgljaGFyCQlzODsKK3R5cGVkZWYJdW5zaWduZWQgY2hhcgl1ODsKKworLyoKKyoqIFRoZSBERVBDQSBSeCBhbmQgVHggcmluZyBkZXNjcmlwdG9ycy4gCisqLworc3RydWN0IGRlcGNhX3J4X2Rlc2MgeworICAgIHZvbGF0aWxlIHMzMiBiYXNlOworICAgIHMxNiBidWZfbGVuZ3RoOwkJLyogVGhpcyBsZW5ndGggaXMgbmVnYXRpdmUgMidzIGNvbXBsZW1lbnQhICovCisgICAgczE2IG1zZ19sZW5ndGg7CQkvKiBUaGlzIGxlbmd0aCBpcyAibm9ybWFsIi4gKi8KK307CisKK3N0cnVjdCBkZXBjYV90eF9kZXNjIHsKKyAgICB2b2xhdGlsZSBzMzIgYmFzZTsKKyAgICBzMTYgbGVuZ3RoOwkJICAgICAgICAvKiBUaGlzIGxlbmd0aCBpcyBuZWdhdGl2ZSAyJ3MgY29tcGxlbWVudCEgKi8KKyAgICBzMTYgbWlzYzsgICAgICAgICAgICAgICAgICAgLyogRXJyb3JzIGFuZCBURFIgaW5mbyAqLworfTsKKworI2RlZmluZSBMQV9NQVNLIDB4MDAwMGZmZmYgICAgICAvKiBMQU5DRSBhZGRyZXNzIG1hc2sgZm9yIG1hcHBpbmcgbmV0d29yayBSQU0KKwkJCQkgICB0byBMQU5DRSBtZW1vcnkgYWRkcmVzcyBzcGFjZSAqLworCisvKgorKiogVGhlIExhbmNlIGluaXRpYWxpemF0aW9uIGJsb2NrLCBkZXNjcmliZWQgaW4gZGF0YWJvb2ssIGluIGNvbW1vbiBtZW1vcnkuCisqLworc3RydWN0IGRlcGNhX2luaXQgeworICAgIHUxNiBtb2RlOwkgICAgICAgICAgICAgICAgLyogTW9kZSByZWdpc3RlciAqLworICAgIHU4ICBwaHlzX2FkZHJbRVRIX0FMRU5dOwkvKiBQaHlzaWNhbCBldGhlcm5ldCBhZGRyZXNzICovCisgICAgdTggIG1jYXN0X3RhYmxlWzhdOwkgICAgICAgIC8qIE11bHRpY2FzdCBIYXNoIFRhYmxlLiAqLworICAgIHUzMiByeF9yaW5nOyAgICAgCSAgICAgICAgLyogUnggcmluZyBiYXNlIHBvaW50ZXIgJiByaW5nIGxlbmd0aCAqLworICAgIHUzMiB0eF9yaW5nOwkgICAgICAgIC8qIFR4IHJpbmcgYmFzZSBwb2ludGVyICYgcmluZyBsZW5ndGggKi8KK307CisKK3N0cnVjdCBkZXBjYV9wcml2YXRlIHsKKwlzdHJ1Y3QgZGVwY2FfcnhfZGVzYwkqcnhfcmluZzsKKwlzdHJ1Y3QgZGVwY2FfdHhfZGVzYwkqdHhfcmluZzsKKwlzdHJ1Y3QgZGVwY2FfaW5pdAlpbml0X2Jsb2NrOwkvKiBTaGFkb3cgaW5pdCBibG9jayAqLworCWNoYXIJCQkqcnhfbWVtY3B5W05VTV9SWF9ERVNDXTsKKwljaGFyCQkJKnR4X21lbWNweVtOVU1fVFhfREVTQ107CisJdTMyCQkJYnVzX29mZnNldDsJLyogSVNBIGJ1cyBhZGRyZXNzIG9mZnNldCAqLworCXUzMgkJCXNoX21lbTsJCS8qIGFkZHJlc3Mgb2Ygc2hhcmVkIG1lbSAqLworCXUzMgkJCWRtYV9idWZmczsJLyogUnggJiBUeCBidWZmZXIgc3RhcnQgKi8KKwlpbnQJCQlyeF9jdXIsIHR4X2N1cjsJLyogTmV4dCBmcmVlIHJpbmcgZW50cnkgKi8KKwlpbnQJCQl0eFJpbmdNYXNrLCByeFJpbmdNYXNrOworCXMzMgkJCXJ4X3JsZW4sIHR4X3JsZW47CisJLyogbG9nMihbcnRdeFJpbmdNYXNrKzEpIGZvciB0aGUgZGVzY3JpcHRvcnMgKi8KK307CisKK3N0YXRpYyBBZGRyZXNzCQltZW1fc3RhcnQgPSBERVBDQV9SQU1fQkFTRTsKK3N0YXRpYyBBZGRyZXNzCQltZW1fbGVuLCBvZmZzZXQ7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQJaW9hZGRyID0gMDsKK3N0YXRpYyBzdHJ1Y3QgZGVwY2FfcHJpdmF0ZQlscDsKKworLyoKKyoqIE1pc2NlbGxhbmVvdXMgZGVmaW5lcy4uLgorKi8KKyNkZWZpbmUgU1RPUF9ERVBDQSBcCisgICAgb3V0dyhDU1IwLCBERVBDQV9BRERSKTtcCisgICAgb3V0dyhTVE9QLCBERVBDQV9EQVRBKQorCisvKiBJbml0aWFsaXplIHRoZSBsYW5jZSBSeCBhbmQgVHggZGVzY3JpcHRvciByaW5ncy4gKi8KK3N0YXRpYyB2b2lkIGRlcGNhX2luaXRfcmluZyhzdHJ1Y3QgbmljICpuaWMpCit7CisJaW50CWk7CisJdTMyCXA7CisKKwlscC5yeF9jdXIgPSBscC50eF9jdXIgPSAwOworCS8qIEluaXRpYWxpemUgdGhlIGJhc2UgYWRkcmVzc2VzIGFuZCBsZW5ndGggb2YgZWFjaCBidWZmZXIgaW4gdGhlIHJpbmcgKi8KKwlmb3IgKGkgPSAwOyBpIDw9IGxwLnJ4UmluZ01hc2s7IGkrKykgeworCQl3cml0ZWwoKHAgPSBscC5kbWFfYnVmZnMgKyBpICogUlhfQlVGRl9TWikgfCBSX09XTiwgJmxwLnJ4X3JpbmdbaV0uYmFzZSk7CisJCXdyaXRldygtUlhfQlVGRl9TWiwgJmxwLnJ4X3JpbmdbaV0uYnVmX2xlbmd0aCk7CisJCWxwLnJ4X21lbWNweVtpXSA9IChjaGFyICopIChwICsgbHAuYnVzX29mZnNldCk7CisJfQorCWZvciAoaSA9IDA7IGkgPD0gbHAudHhSaW5nTWFzazsgaSsrKSB7CisJCXdyaXRlbCgocCA9IGxwLmRtYV9idWZmcyArIChpICsgbHAudHhSaW5nTWFzayArIDEpICogVFhfQlVGRl9TWikgJiAweDAwZmZmZmZmLCAmbHAudHhfcmluZ1tpXS5iYXNlKTsKKwkJbHAudHhfbWVtY3B5W2ldID0gKGNoYXIgKikgKHAgKyBscC5idXNfb2Zmc2V0KTsKKwl9CisKKwkvKiBTZXQgdXAgdGhlIGluaXRpYWxpemF0aW9uIGJsb2NrICovCisJbHAuaW5pdF9ibG9jay5yeF9yaW5nID0gKCh1MzIpICgodTMyKSBscC5yeF9yaW5nKSAmIExBX01BU0spIHwgbHAucnhfcmxlbjsKKwlscC5pbml0X2Jsb2NrLnR4X3JpbmcgPSAoKHUzMikgKCh1MzIpIGxwLnR4X3JpbmcpICYgTEFfTUFTSykgfCBscC50eF9ybGVuOworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQorCQlscC5pbml0X2Jsb2NrLnBoeXNfYWRkcltpXSA9IG5pYy0+bm9kZV9hZGRyW2ldOworCWxwLmluaXRfYmxvY2subW9kZSA9IDB4MDAwMDsJLyogRW5hYmxlIHRoZSBUeCBhbmQgUnggKi8KKwltZW1zZXQobHAuaW5pdF9ibG9jay5tY2FzdF90YWJsZSwgMCwgc2l6ZW9mKGxwLmluaXRfYmxvY2subWNhc3RfdGFibGUpKTsKK30KKworc3RhdGljIHZvaWQgTG9hZENTUnModm9pZCkKK3sKKwlvdXR3KENTUjEsIERFUENBX0FERFIpOwkvKiBpbml0aWFsaXNhdGlvbiBibG9jayBhZGRyZXNzIExTVyAqLworCW91dHcoKHUxNikgKGxwLnNoX21lbSAmIExBX01BU0spLCBERVBDQV9EQVRBKTsKKwlvdXR3KENTUjIsIERFUENBX0FERFIpOwkvKiBpbml0aWFsaXNhdGlvbiBibG9jayBhZGRyZXNzIE1TVyAqLworCW91dHcoKHUxNikgKChscC5zaF9tZW0gJiBMQV9NQVNLKSA+PiAxNiksIERFUENBX0RBVEEpOworCW91dHcoQ1NSMywgREVQQ0FfQUREUik7CS8qIEFMRSBjb250cm9sICovCisJb3V0dyhBQ09OLCBERVBDQV9EQVRBKTsKKwlvdXR3KENTUjAsIERFUENBX0FERFIpOwkvKiBQb2ludCBiYWNrIHRvIENTUjAgKi8KK30KKworc3RhdGljIGludCBJbml0UmVzdGFydERlcGNhKHZvaWQpCit7CisJaW50CQlpOworCisJLyogQ29weSB0aGUgc2hhZG93IGluaXRfYmxvY2sgdG8gc2hhcmVkIG1lbW9yeSAqLworCW1lbWNweV90b2lvKChjaGFyICopbHAuc2hfbWVtLCAmbHAuaW5pdF9ibG9jaywgc2l6ZW9mKHN0cnVjdCBkZXBjYV9pbml0KSk7CisJb3V0dyhDU1IwLCBERVBDQV9BRERSKTsJCS8qIHBvaW50IGJhY2sgdG8gQ1NSMCAqLworCW91dHcoSU5JVCwgREVQQ0FfREFUQSk7CQkvKiBpbml0aWFsaXNlIERFUENBICovCisKKwlmb3IgKGkgPSAwOyBpIDwgMTAwICYmICEoaW53KERFUENBX0RBVEEpICYgSURPTik7IGkrKykKKwkJOworCWlmIChpIDwgMTAwKSB7CisJCS8qIGNsZWFyIElET04gYnkgd3JpdGluZyBhIDEsIGFuZCBzdGFydCBMQU5DRSAqLworCQlvdXR3KElET04gfCBTVFJULCBERVBDQV9EQVRBKTsKKwl9IGVsc2UgeworCQlwcmludGYoIkRFUENBIG5vdCBpbml0aWFsaXNlZFxuIik7CisJCXJldHVybiAoMSk7CisJfQorCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVTRVQgLSBSZXNldCBhZGFwdGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBkZXBjYV9yZXNldChzdHJ1Y3QgbmljICpuaWMpCit7CisJczE2CW5pY3NyOworCWludAlpLCBqOworCisJU1RPUF9ERVBDQTsKKwluaWNzciA9IGluYihERVBDQV9OSUNTUik7CisJbmljc3IgPSAoKG5pY3NyICYgflNIRSAmIH5SQkUgJiB+SUVOKSB8IElNKTsKKwlvdXRiKG5pY3NyLCBERVBDQV9OSUNTUik7CisJaWYgKGludyhERVBDQV9EQVRBKSAhPSBTVE9QKQorCXsKKwkJcHJpbnRmKCJkZXBjYTogQ2Fubm90IHN0b3AgTklDXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEluaXRpYWxpc2F0aW9uIGJsb2NrICovCisJbHAuc2hfbWVtID0gbWVtX3N0YXJ0OworCW1lbV9zdGFydCArPSBzaXplb2Yoc3RydWN0IGRlcGNhX2luaXQpOworCS8qIFR4ICYgUnggZGVzY3JpcHRvcnMgKGFsaWduZWQgdG8gYSBxdWFkd29yZCBib3VuZGFyeSkgKi8KKwltZW1fc3RhcnQgPSAobWVtX3N0YXJ0ICsgQUxJR04pICYgfkFMSUdOOworCWxwLnJ4X3JpbmcgPSAoc3RydWN0IGRlcGNhX3J4X2Rlc2MgKikgbWVtX3N0YXJ0OworCW1lbV9zdGFydCArPSAoc2l6ZW9mKHN0cnVjdCBkZXBjYV9yeF9kZXNjKSAqIE5VTV9SWF9ERVNDKTsKKwlscC50eF9yaW5nID0gKHN0cnVjdCBkZXBjYV90eF9kZXNjICopIG1lbV9zdGFydDsKKwltZW1fc3RhcnQgKz0gKHNpemVvZihzdHJ1Y3QgZGVwY2FfdHhfZGVzYykgKiBOVU1fVFhfREVTQyk7CisKKwlscC5idXNfb2Zmc2V0ID0gbWVtX3N0YXJ0ICYgMHgwMGZmMDAwMDsKKwkvKiBMQU5DRSByZS1tYXBwZWQgc3RhcnQgYWRkcmVzcyAqLworCWxwLmRtYV9idWZmcyA9IG1lbV9zdGFydCAmIExBX01BU0s7CisKKwkvKiBGaW5pc2ggaW5pdGlhbGlzaW5nIHRoZSByaW5nIGluZm9ybWF0aW9uLiAqLworCWxwLnJ4UmluZ01hc2sgPSBOVU1fUlhfREVTQyAtIDE7CisJbHAudHhSaW5nTWFzayA9IE5VTV9UWF9ERVNDIC0gMTsKKworCS8qIENhbGN1bGF0ZSBUeC9SeCBSTEVOIHNpemUgZm9yIHRoZSBkZXNjcmlwdG9ycy4gKi8KKwlmb3IgKGkgPSAwLCBqID0gbHAucnhSaW5nTWFzazsgaiA+IDA7IGkrKykgeworCQlqID4+PSAxOworCX0KKwlscC5yeF9ybGVuID0gKHMzMikgKGkgPDwgMjkpOworCWZvciAoaSA9IDAsIGogPSBscC50eFJpbmdNYXNrOyBqID4gMDsgaSsrKSB7CisJCWogPj49IDE7CisJfQorCWxwLnR4X3JsZW4gPSAoczMyKSAoaSA8PCAyOSk7CisKKwkvKiBMb2FkIHRoZSBpbml0aWFsaXNhdGlvbiBibG9jayAqLworCWRlcGNhX2luaXRfcmluZyhuaWMpOworCUxvYWRDU1JzKCk7CisJSW5pdFJlc3RhcnREZXBjYSgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BPTEwgLSBXYWl0IGZvciBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGRlcGNhX3BvbGwoc3RydWN0IG5pYyAqbmljKQoreworCWludAkJZW50cnk7CisJdTMyCQlzdGF0dXM7CisKKwllbnRyeSA9IGxwLnJ4X2N1cjsKKwlpZiAoKHN0YXR1cyA9IHJlYWRsKCZscC5yeF9yaW5nW2VudHJ5XS5iYXNlKSAmIFJfT1dOKSkKKwkJcmV0dXJuICgwKTsKKwltZW1jcHkobmljLT5wYWNrZXQsIGxwLnJ4X21lbWNweVtlbnRyeV0sIG5pYy0+cGFja2V0bGVuID0gbHAucnhfcmluZ1tlbnRyeV0ubXNnX2xlbmd0aCk7CisJbHAucnhfcmluZ1tlbnRyeV0uYmFzZSB8PSBSX09XTjsKKwlscC5yeF9jdXIgPSAoKytscC5yeF9jdXIpICYgbHAucnhSaW5nTWFzazsKKwlyZXR1cm4gKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1RSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZGVwY2FfdHJhbnNtaXQoCisJc3RydWN0IG5pYyAqbmljLAorCWNvbnN0IGNoYXIgKmQsCQkJLyogRGVzdGluYXRpb24gKi8KKwl1bnNpZ25lZCBpbnQgdCwJCQkvKiBUeXBlICovCisJdW5zaWduZWQgaW50IHMsCQkJLyogc2l6ZSAqLworCWNvbnN0IGNoYXIgKnApCQkJLyogUGFja2V0ICovCit7CisJaW50CQllbnRyeSwgbGVuOworCWNoYXIJCSptZW07CisKKwkvKiBzZW5kIHRoZSBwYWNrZXQgdG8gZGVzdGluYXRpb24gKi8KKwkvKgorCSoqIENhdXRpb246IHRoZSByaWdodCBvcmRlciBpcyBpbXBvcnRhbnQgaGVyZS4uLiBkb250CisJKiogc2V0dXAgdGhlIG93bmVyc2hpcCByaWdodHMgdW50aWwgYWxsIHRoZSBvdGhlcgorCSoqIGluZm9ybWF0aW9uIGlzIGluIHBsYWNlCisJKi8KKwltZW0gPSBscC50eF9tZW1jcHlbZW50cnkgPSBscC50eF9jdXJdOworCW1lbWNweV90b2lvKG1lbSwgZCwgRVRIX0FMRU4pOworCW1lbWNweV90b2lvKG1lbSArIEVUSF9BTEVOLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOworCW1lbVtFVEhfQUxFTiAqIDJdID0gdCA+PiA4OworCW1lbVtFVEhfQUxFTiAqIDIgKyAxXSA9IHQ7CisJbWVtY3B5X3RvaW8obWVtICsgRVRIX0hMRU4sIHAsIHMpOworCXMgKz0gRVRIX0hMRU47CisJbGVuID0gKHMgPCBFVEhfWkxFTiA/IEVUSF9aTEVOIDogcyk7CisJLyogY2xlYW4gb3V0IGZsYWdzICovCisJd3JpdGVsKHJlYWRsKCZscC50eF9yaW5nW2VudHJ5XS5iYXNlKSAmIH5UX0ZMQUdTLCAmbHAudHhfcmluZ1tlbnRyeV0uYmFzZSk7CisJLyogY2xlYXJzIG90aGVyIGVycm9yIGZsYWdzICovCisJd3JpdGV3KDB4MDAwMCwgJmxwLnR4X3JpbmdbZW50cnldLm1pc2MpOworCS8qIHBhY2tldCBsZW5ndGggaW4gYnVmZmVyICovCisJd3JpdGV3KC1sZW4sICZscC50eF9yaW5nW2VudHJ5XS5sZW5ndGgpOworCS8qIHN0YXJ0IGFuZCBlbmQgb2YgcGFja2V0LCBvd25lcnNoaXAgKi8KKwl3cml0ZWwocmVhZGwoJmxwLnR4X3JpbmdbZW50cnldLmJhc2UpIHwgKFRfU1RQfFRfRU5QfFRfT1dOKSwgJmxwLnR4X3JpbmdbZW50cnldLmJhc2UpOworCS8qIHVwZGF0ZSBjdXJyZW50IHBvaW50ZXJzICovCisJbHAudHhfY3VyID0gKCsrbHAudHhfY3VyKSAmIGxwLnR4UmluZ01hc2s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRElTQUJMRSAtIFR1cm4gb2ZmIGV0aGVybmV0IGludGVyZmFjZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZGVwY2FfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpCit7CisJU1RPUF9ERVBDQTsKK30KKworLyoKKyoqIExvb2sgZm9yIGEgc3BlY2lhbCBzZXF1ZW5jZSBpbiB0aGUgRXRoZXJuZXQgc3RhdGlvbiBhZGRyZXNzIFBST00gdGhhdAorKiogaXMgY29tbW9uIGFjcm9zcyBhbGwgREVQQ0EgcHJvZHVjdHMuIE5vdGUgdGhhdCB0aGUgb3JpZ2luYWwgREVQQ0EgbmVlZHMKKyoqIGl0cyBST00gYWRkcmVzcyBjb3VudGVyIHRvIGJlIGluaXRpYWxpemVkIGFuZCBlbmFibGVkLiBPbmx5IGVuYWJsZQorKiogaWYgdGhlIGZpcnN0IGFkZHJlc3Mgb2N0ZXQgaXMgYSAweDA4IC0gdGhpcyBtaW5pbWlzZXMgdGhlIGNoYW5jZXMgb2YKKyoqIG1lc3NpbmcgYXJvdW5kIHdpdGggc29tZSBvdGhlciBoYXJkd2FyZSwgYnV0IGl0IGFzc3VtZXMgdGhhdCB0aGlzIERFUENBCisqKiBjYXJkIGluaXRpYWxpemVkIGl0c2VsZiBjb3JyZWN0bHkuCisqKgorKiogU2VhcmNoIHRoZSBFdGhlcm5ldCBhZGRyZXNzIFJPTSBmb3IgdGhlIHNpZ25hdHVyZS4gU2luY2UgdGhlIFJPTSBhZGRyZXNzCisqKiBjb3VudGVyIGNhbiBzdGFydCBhdCBhbiBhcmJpdHJhcnkgcG9pbnQsIHRoZSBzZWFyY2ggbXVzdCBpbmNsdWRlIHRoZSBlbnRpcmUKKyoqIHByb2JlIHNlcXVlbmNlIGxlbmd0aCBwbHVzIHRoZSAobGVuZ3RoX29mX3RoZV9zaWduYXR1cmUgLSAxKS4KKyoqIFN0b3AgdGhlIHNlYXJjaCBJTU1FRElBVEVMWSBhZnRlciB0aGUgc2lnbmF0dXJlIGlzIGZvdW5kIHNvIHRoYXQgdGhlCisqKiBQUk9NIGFkZHJlc3MgY291bnRlciBpcyBjb3JyZWN0bHkgcG9zaXRpb25lZCBhdCB0aGUgc3RhcnQgb2YgdGhlCisqKiBldGhlcm5ldCBhZGRyZXNzIGZvciBsYXRlciByZWFkIG91dC4KKyovCitzdGF0aWMgaW50IGRlcGNhX3Byb2JlMShzdHJ1Y3QgbmljICpuaWMpCit7CisJdTgJZGF0YSwgbmljc3I7CisJLyogVGhpcyBpcyBvbmx5IGNvcnJlY3QgZm9yIGxpdHRsZSBlbmRpYW4gbWFjaGluZXMsIGJ1dCB0aGVuCisJICAgRXRoZXJib290IGRvZXNuJ3Qgd29yayBvbiBhbnl0aGluZyBidXQgYSBQQyAqLworCXU4CXNpZ1tdID0geyAweEZGLCAweDAwLCAweDU1LCAweEFBLCAweEZGLCAweDAwLCAweDU1LCAweEFBIH07CisJaW50CWksIGo7CisJbG9uZwlzdW0sIGNoa3N1bTsKKworCWRhdGEgPSBpbmIoREVQQ0FfUFJPTSk7CQkvKiBjbGVhciBjb3VudGVyIG9uIERFUENBICovCisJZGF0YSA9IGluYihERVBDQV9QUk9NKTsJCS8qIHJlYWQgZGF0YSAqLworCWlmIChkYXRhID09IDB4OCkgeworCQluaWNzciA9IGluYihERVBDQV9OSUNTUik7CisJCW5pY3NyIHw9IEFBQzsKKwkJb3V0YihuaWNzciwgREVQQ0FfTklDU1IpOworCX0KKwlmb3IgKGkgPSAwLCBqID0gMDsgaiA8IChpbnQpc2l6ZW9mKHNpZykgJiYgaSA8IFBST0JFX0xFTkdUSCsoKGludClzaXplb2Yoc2lnKSktMTsgKytpKSB7CisJCWRhdGEgPSBpbmIoREVQQ0FfUFJPTSk7CisJCWlmIChkYXRhID09IHNpZ1tqXSkJCS8qIHRyYWNrIHNpZ25hdHVyZSAqLworCQkJKytqOworCQllbHNlCisJCQlqID0gKGRhdGEgPT0gc2lnWzBdKSA/IDEgOiAwOworCX0KKwlpZiAoaiAhPSBzaXplb2Yoc2lnKSkKKwkJcmV0dXJuICgwKTsKKwkvKiBwdXQgdGhlIGNhcmQgaW4gaXRzIGluaXRpYWwgc3RhdGUgKi8KKwlTVE9QX0RFUENBOworCW5pY3NyID0gKChpbmIoREVQQ0FfTklDU1IpICYgflNIRSAmIH5SQkUgJiB+SUVOKSB8IElNKTsKKwlvdXRiKG5pY3NyLCBERVBDQV9OSUNTUik7CisJaWYgKGludyhERVBDQV9EQVRBKSAhPSBTVE9QKQorCQlyZXR1cm4gKDApOworCW1lbWNweSgoY2hhciAqKW1lbV9zdGFydCwgc2lnLCBzaXplb2Yoc2lnKSk7CisJaWYgKG1lbWNtcCgoY2hhciAqKW1lbV9zdGFydCwgc2lnLCBzaXplb2Yoc2lnKSkgIT0gMCkKKwkJcmV0dXJuICgwKTsKKwlmb3IgKGkgPSAwLCBqID0gMCwgc3VtID0gMDsgaiA8IDM7IGorKykgeworCQlzdW0gPDw9IDE7CisJCWlmIChzdW0gPiAweEZGRkYpCisJCQlzdW0gLT0gMHhGRkZGOworCQlzdW0gKz0gKHU4KShuaWMtPm5vZGVfYWRkcltpKytdID0gaW5iKERFUENBX1BST00pKTsKKwkJc3VtICs9ICh1MTYpKChuaWMtPm5vZGVfYWRkcltpKytdID0gaW5iKERFUENBX1BST00pKSA8PCA4KTsKKwkJaWYgKHN1bSA+IDB4RkZGRikKKwkJCXN1bSAtPSAweEZGRkY7CisJfQorCWlmIChzdW0gPT0gMHhGRkZGKQorCQlzdW0gPSAwOworCWNoa3N1bSA9ICh1OClpbmIoREVQQ0FfUFJPTSk7CisJY2hrc3VtIHw9ICh1MTYpKGluYihERVBDQV9QUk9NKSA8PCA4KTsKKwltZW1fbGVuID0gKGFkYXB0ZXIgPT0gREVQQ0EpID8gKDQ4IDw8IDEwKSA6ICg2NCA8PCAxMCk7CisJb2Zmc2V0ID0gMDsKKwlpZiAobmljc3IgJiBCVUYpIHsKKwkJb2Zmc2V0ID0gMHg4MDAwOworCQluaWNzciAmPSB+QlM7CisJCW1lbV9sZW4gLT0gKDMyIDw8IDEwKTsKKwl9CisJaWYgKGFkYXB0ZXIgIT0gREVQQ0EpCS8qIGVuYWJsZSBzaGFkb3cgUkFNICovCisJCW91dGIobmljc3IgfD0gU0hFLCBERVBDQV9OSUNTUik7CisJcHJpbnRmKCIlcyBiYXNlICUjaFgsIG1lbW9yeSBbJSNoWC0lI2hYXSwgYWRkciAlISIsCisJCWFkYXB0ZXJfbmFtZVthZGFwdGVyXSwgaW9hZGRyLCBtZW1fc3RhcnQsIG1lbV9zdGFydCArIG1lbV9sZW4sCisJCW5pYy0+bm9kZV9hZGRyKTsKKwlpZiAoc3VtICE9IGNoa3N1bSkKKwkJcHJpbnRmKCIgKGJhZCBjaGVja3N1bSkiKTsKKwlwdXRjaGFyKCdcbicpOworCXJldHVybiAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyLCB0aGlzIHJvdXRpbmUncyB2aXNpYmxlIHRvIHRoZSBvdXRzaWRlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgbmljICpkZXBjYV9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZV9hZGRycykKK3sKKwlzdGF0aWMgdW5zaWduZWQgc2hvcnQJYmFzZVtdID0gREVQQ0FfSU9fUE9SVFM7CisJaW50CQkJaTsKKworCWlmIChwcm9iZV9hZGRycyA9PSAwIHx8IHByb2JlX2FkZHJzWzBdID09IDApCisJCXByb2JlX2FkZHJzID0gYmFzZTsJLyogVXNlIGRlZmF1bHRzICovCisJZm9yIChpID0gMDsgKGlvYWRkciA9IGJhc2VbaV0pICE9IDA7ICsraSkgeworCQlpZiAoZGVwY2FfcHJvYmUxKG5pYykpCisJCQlicmVhazsKKwl9CisJaWYgKGlvYWRkciA9PSAwKQorCQlyZXR1cm4gKDApOworCWRlcGNhX3Jlc2V0KG5pYyk7CisJLyogcG9pbnQgdG8gTklDIHNwZWNpZmljIHJvdXRpbmVzICovCisJbmljLT5yZXNldCA9IGRlcGNhX3Jlc2V0OworCW5pYy0+cG9sbCA9IGRlcGNhX3BvbGw7CisJbmljLT50cmFuc21pdCA9IGRlcGNhX3RyYW5zbWl0OworCW5pYy0+ZGlzYWJsZSA9IGRlcGNhX2Rpc2FibGU7CisJcmV0dXJuIChuaWMpOworfQpkaWZmIC0tZ2l0IGEvbmV0Ym9vdC9lZXByby5jIGIvbmV0Ym9vdC9lZXByby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlM2YwN2IKLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L2VlcHJvLmMKQEAgLTAsMCArMSw1ODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRXRoZXJib290IC0gIEJPT1RQL1RGVFAgQm9vdHN0cmFwIFByb2dyYW0KK0ludGVsIEVFUFJPLzEwIE5JQyBkcml2ZXIgZm9yIEV0aGVyYm9vdAorQWRhcHRlZCBmcm9tIExpbnV4IGVlcHJvLmMgZnJvbSBrZXJuZWwgMi4yLjE3CisKK1RoaXMgYm9hcmQgYWNjZXB0cyBhIDMyIHBpbiBFRVBST00gKDI5QzI1NiksIGhvd2V2ZXIgYSB0ZXN0IHdpdGggYQorMjdDMDEwIHNob3dzIHRoYXQgdGhpcyBFUFJPTSBhbHNvIHdvcmtzIGluIHRoZSBzb2NrZXQsIGJ1dCBpdCdzIG5vdCBjbGVhcgoraG93IHJlcGVhdGFibHkuIFRoZSB0d28gdG9wIGFkZHJlc3MgcGlucyBhcHBlYXIgdG8gYmUgaGVsZCBsb3csIHRodXMKK3RoZSBib3R0b20gMzJrQiBvZiB0aGUgMjdDMDEwIGlzIHZpc2libGUgaW4gdGhlIENQVSdzIGFkZHJlc3Mgc3BhY2UuCitUbyBiZSBzdXJlIHlvdSBjb3VsZCBwdXQgNCBjb3BpZXMgb2YgdGhlIGNvZGUgaW4gdGhlIDI3QzAxMCwgdGhlbgoraXQgZG9lc24ndCBtYXR0ZXIgd2hldGhlciB0aGUgZXh0cmEgbGluZXMgYXJlIGhlbGQgbG93IG9yIGhpZ2gsIGp1c3QKK2hvcGVmdWxseSBub3QgZmxvYXRpbmcgYXMgQ01PUyBjaGlwcyBkb24ndCBsaWtlIGZsb2F0aW5nIGlucHV0cy4KKworQmUgY2FyZWZ1bCB3aXRoIHNlYXRpbmcgdGhlIEVQUk9NIGFzIHRoZSBzb2NrZXQgb24gbXkgYm9hcmQgYWN0dWFsbHkKK2hhcyAzNCBwaW5zLCB0aGUgdG9wIHJvdyBvZiAyIGFyZSBub3QgdXNlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworLyogdG8gZ2V0IHNvbWUgZ2xvYmFsIHJvdXRpbmVzIGxpa2UgcHJpbnRmICovCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisvKiB0byBnZXQgdGhlIGludGVyZmFjZSB0byB0aGUgYm9keSBvZiB0aGUgcHJvZ3JhbSAqLworI2luY2x1ZGUgIm5pYy5oIgorLyogdG8gZ2V0IG91ciBvd24gcHJvdG90eXBlICovCisjaW5jbHVkZSAiY2FyZHMuaCIKKy8qIHdlIHVzZSB0aW1lcjIgZm9yIG1pY3Jvc2Vjb25kIHdhaXRzICovCisjaW5jbHVkZSAidGltZXIuaCIKKworI3VuZGVmCURFQlVHCQkvKiBvbmx5IGFmdGVyIGluY2x1ZGUgZmlsZXMgKi8KKworLyogRGlmZmVyZW50IDgyNTk1IGNoaXBzICovCisjZGVmaW5lIExBTjU5NQkJMAorI2RlZmluZSBMQU41OTVUWAkxCisjZGVmaW5lIExBTjU5NUZYCTIKKyNkZWZpbmUgTEFONTk1RlhfMTBJU0EJMworCisjZGVmaW5lCVNMT1dfRE9XTglpbmIoMHg4MCk7CisKKy8qIFRoZSBzdGF0aW9uIChldGhlcm5ldCkgYWRkcmVzcyBwcmVmaXgsIHVzZWQgZm9yIElEaW5nIHRoZSBib2FyZC4gKi8KKyNkZWZpbmUgU0FfQUREUjAgMHgwMAkvKiBFdGhlcmV4cHJlc3MgUHJvLzEwICovCisjZGVmaW5lIFNBX0FERFIxIDB4YWEKKyNkZWZpbmUgU0FfQUREUjIgMHgwMAorCisjZGVmaW5lIEdldEJpdCh4LHkpICgoeCAmICgxPDx5KSk+PnkpCisKKy8qIEVFUFJPTSBXb3JkIDA6ICovCisjZGVmaW5lIGVlX1BuUCAgICAgICAwICAvKiBQbHVnICduIFBsYXkgZW5hYmxlIGJpdCAqLworI2RlZmluZSBlZV9Xb3JkMSAgICAgMSAgLyogV29yZCAxPyAqLworI2RlZmluZSBlZV9CdXNXaWR0aCAgMiAgLyogOC8xNiBiaXQgKi8KKyNkZWZpbmUgZWVfRmxhc2hBZGRyIDMgIC8qIEZsYXNoIEFkZHJlc3MgKi8KKyNkZWZpbmUgZWVfRmxhc2hNYXNrIDB4NyAgIC8qIE1hc2sgKi8KKyNkZWZpbmUgZWVfQXV0b0lPICAgIDYgIC8qICovCisjZGVmaW5lIGVlX3Jlc2VydmVkMCA3ICAvKiA9MCEgKi8KKyNkZWZpbmUgZWVfRmxhc2ggICAgIDggIC8qIEZsYXNoIHRoZXJlPyAqLworI2RlZmluZSBlZV9BdXRvTmVnICAgOSAgLyogQXV0byBOZWdvdGlhdGlvbiBlbmFibGVkPyAqLworI2RlZmluZSBlZV9JTzAgICAgICAgMTAgLyogSU8gQWRkcmVzcyBMU0IgKi8KKyNkZWZpbmUgZWVfSU8wTWFzayAgIDB4IC8qLi4uKi8KKyNkZWZpbmUgZWVfSU8xICAgICAgIDE1IC8qIElPIE1TQiAqLworCisvKiBFRVBST00gV29yZCAxOiAqLworI2RlZmluZSBlZV9JbnRTZWwgICAgMCAgIC8qIEludGVycnVwdCAqLworI2RlZmluZSBlZV9JbnRNYXNrICAgMHg3CisjZGVmaW5lIGVlX0xJICAgICAgICAzICAgLyogTGluayBJbnRlZ3JpdHkgMD0gZW5hYmxlZCAqLworI2RlZmluZSBlZV9QQyAgICAgICAgNCAgIC8qIFBvbGFyaXR5IENvcnJlY3Rpb24gMD0gZW5hYmxlZCAqLworI2RlZmluZSBlZV9UUEVfQVVJICAgNSAgIC8qIFBvcnRTZWxlY3Rpb24gMT1UUEUgKi8KKyNkZWZpbmUgZWVfSmFiYmVyICAgIDYgICAvKiBKYWJiZXIgcHJldmVudGlvbiAwPSBlbmFibGVkICovCisjZGVmaW5lIGVlX0F1dG9Qb3J0ICA3ICAgLyogQXV0byBQb3J0IFNlbGVjdGlvbiAxPSBEaXNhYmxlZCAqLworI2RlZmluZSBlZV9TTU9VVCAgICAgOCAgIC8qIFNNb3V0IFBpbiBDb250cm9sIDA9IElucHV0ICovCisjZGVmaW5lIGVlX1BST00gICAgICA5ICAgLyogRmxhc2ggRVBST00gLyBQUk9NIDA9Rmxhc2ggKi8KKyNkZWZpbmUgZWVfcmVzZXJ2ZWQxIDEwICAvKiAuLiAxMiA9MCEgKi8KKyNkZWZpbmUgZWVfQWx0UmVhZHkgIDEzICAvKiBBbHRlcm5hdGUgUmVhZHksIDA9bm9ybWFsICovCisjZGVmaW5lIGVlX3Jlc2VydmVkMiAxNCAgLyogPTAhICovCisjZGVmaW5lIGVlX0R1cGxleCAgICAxNQorCisvKiBXb3JkMiwzLDQ6ICovCisjZGVmaW5lIGVlX0lBNSAgICAgICAwIC8qYml0IHN0YXJ0IGZvciBpbmRpdmlkdWFsIEFkZHIgQnl0ZSA1ICovCisjZGVmaW5lIGVlX0lBNCAgICAgICA4IC8qYml0IHN0YXJ0IGZvciBpbmRpdmlkdWFsIEFkZHIgQnl0ZSA1ICovCisjZGVmaW5lIGVlX0lBMyAgICAgICAwIC8qYml0IHN0YXJ0IGZvciBpbmRpdmlkdWFsIEFkZHIgQnl0ZSA1ICovCisjZGVmaW5lIGVlX0lBMiAgICAgICA4IC8qYml0IHN0YXJ0IGZvciBpbmRpdmlkdWFsIEFkZHIgQnl0ZSA1ICovCisjZGVmaW5lIGVlX0lBMSAgICAgICAwIC8qYml0IHN0YXJ0IGZvciBpbmRpdmlkdWFsIEFkZHIgQnl0ZSA1ICovCisjZGVmaW5lIGVlX0lBMCAgICAgICA4IC8qYml0IHN0YXJ0IGZvciBpbmRpdmlkdWFsIEFkZHIgQnl0ZSA1ICovCisKKy8qIFdvcmQgNTogKi8KKyNkZWZpbmUgZWVfQk5DX1RQRSAgIDAgLyogMD1UUEUgKi8KKyNkZWZpbmUgZWVfQm9vdFR5cGUgIDEgLyogMDA9Tm9uZSwgMDE9SVBYLCAxMD1PREksIDExPU5ESVMgKi8KKyNkZWZpbmUgZWVfQm9vdFR5cGVNYXNrIDB4MyAKKyNkZWZpbmUgZWVfTnVtQ29ubiAgIDMgIC8qIE51bWJlciBvZiBDb25uZWN0aW9ucyAwPSBPbmUgb3IgVHdvICovCisjZGVmaW5lIGVlX0ZsYXNoU29jayA0ICAvKiBQcmVzZW5jZSBvZiBGbGFzaCBTb2NrZXQgMD0gUHJlc2VudCAqLworI2RlZmluZSBlZV9Qb3J0VFBFICAgNQorI2RlZmluZSBlZV9Qb3J0Qk5DICAgNgorI2RlZmluZSBlZV9Qb3J0QVVJICAgNworI2RlZmluZSBlZV9Qb3dlck1ndCAgMTAgLyogMD0gZGlzYWJsZWQgKi8KKyNkZWZpbmUgZWVfQ1AgICAgICAgIDEzIC8qIENvbmN1cnJlbnQgUHJvY2Vzc2luZyAqLworI2RlZmluZSBlZV9DUE1hc2sgICAgMHg3CisKKy8qIFdvcmQgNjogKi8KKyNkZWZpbmUgZWVfU3RlcHBpbmcgIDAgLyogU3RlcHBpbmcgaW5mbyAqLworI2RlZmluZSBlZV9TdGVwTWFzayAgMHgwRgorI2RlZmluZSBlZV9Cb2FyZElEICAgNCAvKiBNYW51Y2F0dXJlciBCb2FyZCBJRCwgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgZWVfQm9hcmRNYXNrIDB4MEZGRgorCisvKiBXb3JkIDc6ICovCisjZGVmaW5lIGVlX0lOVF9UT19JUlEgMCAvKiBpbnQgdG8gSVJRIE1hcHBpbmcgID0gMHgxRUI4IGZvciBQcm8vMTArICovCisjZGVmaW5lIGVlX0ZYX0lOVDJJUlEgMHgxRUI4IC8qIHRoZSBfb25seV8gbWFwcGluZyBhbGxvd2VkIGZvciBGWCBjaGlwcyAqLworCisvKi4uKi8KKyNkZWZpbmUgZWVfU0laRSAweDQwIC8qIHRvdGFsIEVFcHJvbSBTaXplICovCisjZGVmaW5lIGVlX0NoZWNrc3VtIDB4QkFCQSAvKiBpbml0aWFsIGFuZCBmaW5hbCB2YWx1ZSBmb3IgYWRkaW5nIGNoZWNrc3VtICovCisKKworLyogQ2FyZCBpZGVudGlmaWNhdGlvbiB2aWEgRUVwcm9tOiAgICovCisjZGVmaW5lIGVlX2FkZHJfdmVuZG9yIDB4MTAgIC8qIFdvcmQgb2Zmc2V0IGZvciBFSVNBIFZlbmRvciBJRCAqLworI2RlZmluZSBlZV9hZGRyX2lkIDB4MTEgICAgICAvKiBXb3JkIG9mZnNldCBmb3IgQ2FyZCBJRCAqLworI2RlZmluZSBlZV9hZGRyX1NOIDB4MTIgICAgICAvKiBTZXJpYWwgTnVtYmVyICovCisjZGVmaW5lIGVlX2FkZHJfQ1JDXzggMHgxNCAgIC8qIENSQyBvdmVyIGxhc3QgdGhlZSBCeXRlcyAqLworCisKKyNkZWZpbmUgZWVfdmVuZG9yX2ludGVsMCAweDI1ICAvKiBWZW5kb3IgSUQgSW50ZWwgKi8KKyNkZWZpbmUgZWVfdmVuZG9yX2ludGVsMSAweEQ0CisjZGVmaW5lIGVlX2lkX2VlcHJvMTBwMCAweDEwICAgLyogSUQgZm9yIGVlcHJvLzEwKyAqLworI2RlZmluZSBlZV9pZF9lZXBybzEwcDEgMHgzMQorCisvKiBub3cgdGhpcyBzZWN0aW9uIGNvdWxkIGJlIHVzZWQgYnkgYm90aCBib2FyZHM6IHRoZSBvbGRpZXMgYW5kIHRoZSBlZTEwOgorICogZWUxMCB1c2VzIHR4IGJ1ZmZlciBiZWZvcmUgb2YgcnggYnVmZmVyIGFuZCB0aGUgb2xkaWVzIHRoZSBpbnZlcnNlLgorICogKGFyaXMpCisgKi8KKyNkZWZpbmUJUkFNX1NJWkUJMHg4MDAwCisKKyNkZWZpbmUJUkNWX0hFQURFUgk4CisjZGVmaW5lIFJDVl9ERUZBVUxUX1JBTQkweDYwMDAKKyNkZWZpbmUgUkNWX1JBTSAJcmN2X3JhbQorCitzdGF0aWMgdW5zaWduZWQgcmN2X3JhbSA9IFJDVl9ERUZBVUxUX1JBTTsKKworI2RlZmluZSBYTVRfSEVBREVSCTgKKyNkZWZpbmUgWE1UX1JBTQkJKFJBTV9TSVpFIC0gUkNWX1JBTSkKKworI2RlZmluZSBYTVRfU1RBUlQJKChyY3Zfc3RhcnQgKyBSQ1ZfUkFNKSAlIFJBTV9TSVpFKQorCisjZGVmaW5lIFJDVl9MT1dFUl9MSU1JVAkocmN2X3N0YXJ0ID4+IDgpCisjZGVmaW5lIFJDVl9VUFBFUl9MSU1JVAkoKChyY3Zfc3RhcnQgKyBSQ1ZfUkFNKSAtIDIpID4+IDgpCisjZGVmaW5lIFhNVF9MT1dFUl9MSU1JVAkoWE1UX1NUQVJUID4+IDgpCisjZGVmaW5lIFhNVF9VUFBFUl9MSU1JVAkoKChYTVRfU1RBUlQgKyBYTVRfUkFNKSAtIDIpID4+IDgpCisKKyNkZWZpbmUgUkNWX1NUQVJUX1BSTwkweDAwCisjZGVmaW5lIFJDVl9TVEFSVF8xMAlYTVRfUkFNCisJCQkJCS8qIGJ5IGRlZmF1bHQgdGhlIG9sZCBkcml2ZXIgKi8KK3N0YXRpYyB1bnNpZ25lZCByY3Zfc3RhcnQgPSBSQ1ZfU1RBUlRfUFJPOworCisjZGVmaW5lCVJDVl9ET05FCTB4MDAwOAorI2RlZmluZQlSWF9PSwkJMHgyMDAwCisjZGVmaW5lCVJYX0VSUk9SCTB4MGQ4MQorCisjZGVmaW5lCVRYX0RPTkVfQklUCTB4MDA4MAorI2RlZmluZQlDSEFJTl9CSVQJMHg4MDAwCisjZGVmaW5lCVhNVF9TVEFUVVMJMHgwMgorI2RlZmluZQlYTVRfQ0hBSU4JMHgwNAorI2RlZmluZQlYTVRfQ09VTlQJMHgwNgorCisjZGVmaW5lCUJBTkswX1NFTEVDVAkweDAwCQkKKyNkZWZpbmUJQkFOSzFfU0VMRUNUCTB4NDAJCQorI2RlZmluZQlCQU5LMl9TRUxFQ1QJMHg4MAkJCisKKy8qIEJhbmsgMCByZWdpc3RlcnMgKi8KKyNkZWZpbmUJQ09NTUFORF9SRUcJMHgwMAkvKiBSZWdpc3RlciAwICovCisjZGVmaW5lCU1DX1NFVFVQCTB4MDMKKyNkZWZpbmUJWE1UX0NNRAkJMHgwNAorI2RlZmluZQlESUFHTk9TRV9DTUQJMHgwNworI2RlZmluZQlSQ1ZfRU5BQkxFX0NNRAkweDA4CisjZGVmaW5lCVJDVl9ESVNBQkxFX0NNRAkweDBhCisjZGVmaW5lCVNUT1BfUkNWX0NNRAkweDBiCisjZGVmaW5lCVJFU0VUX0NNRAkweDBlCisjZGVmaW5lCVBPV0VSX0RPV05fQ01ECTB4MTgKKyNkZWZpbmUJUkVTVU1FX1hNVF9DTUQJMHgxYworI2RlZmluZQlTRUxfUkVTRVRfQ01ECTB4MWUKKyNkZWZpbmUJU1RBVFVTX1JFRwkweDAxCS8qIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJUlhfSU5UCQkweDAyCisjZGVmaW5lCVRYX0lOVAkJMHgwNAorI2RlZmluZQlFWEVDX1NUQVRVUwkweDMwCisjZGVmaW5lCUlEX1JFRwkJMHgwMgkvKiBSZWdpc3RlciAyCSovCisjZGVmaW5lCVJfUk9CSU5fQklUUwkweGMwCS8qIHJvdW5kIHJvYmluIGNvdW50ZXIgKi8KKyNkZWZpbmUJSURfUkVHX01BU0sJMHgyYworI2RlZmluZQlJRF9SRUdfU0lHCTB4MjQKKyNkZWZpbmUJQVVUT19FTkFCTEUJMHgxMAorI2RlZmluZQlJTlRfTUFTS19SRUcJMHgwMwkvKiBSZWdpc3RlciAzCSovCisjZGVmaW5lCVJYX1NUT1BfTUFTSwkweDAxCisjZGVmaW5lCVJYX01BU0sJCTB4MDIKKyNkZWZpbmUJVFhfTUFTSwkJMHgwNAorI2RlZmluZQlFWEVDX01BU0sJMHgwOAorI2RlZmluZQlBTExfTUFTSwkweDBmCisjZGVmaW5lCUlPXzMyX0JJVAkweDEwCisjZGVmaW5lCVJDVl9CQVIJCTB4MDQJLyogVGhlIGZvbGxvd2luZyBhcmUgd29yZCAoMTYtYml0KSByZWdpc3RlcnMgKi8KKyNkZWZpbmUJUkNWX1NUT1AJMHgwNgorCisjZGVmaW5lCVhNVF9CQVJfUFJPCTB4MGEKKyNkZWZpbmUJWE1UX0JBUl8xMAkweDBiCitzdGF0aWMgdW5zaWduZWQgeG10X2JhciA9IFhNVF9CQVJfUFJPOworCisjZGVmaW5lCUhPU1RfQUREUkVTU19SRUcJMHgwYworI2RlZmluZQlJT19QT1JUCQkweDBlCisjZGVmaW5lCUlPX1BPUlRfMzJfQklUCTB4MGMKKworLyogQmFuayAxIHJlZ2lzdGVycyAqLworI2RlZmluZQlSRUcxCTB4MDEKKyNkZWZpbmUJV09SRF9XSURUSAkweDAyCisjZGVmaW5lCUlOVF9FTkFCTEUJMHg4MAorI2RlZmluZSBJTlRfTk9fUkVHCTB4MDIKKyNkZWZpbmUJUkNWX0xPV0VSX0xJTUlUX1JFRwkweDA4CisjZGVmaW5lCVJDVl9VUFBFUl9MSU1JVF9SRUcJMHgwOQorCisjZGVmaW5lCVhNVF9MT1dFUl9MSU1JVF9SRUdfUFJPCTB4MGEKKyNkZWZpbmUJWE1UX1VQUEVSX0xJTUlUX1JFR19QUk8JMHgwYgorI2RlZmluZQlYTVRfTE9XRVJfTElNSVRfUkVHXzEwCTB4MGIKKyNkZWZpbmUJWE1UX1VQUEVSX0xJTUlUX1JFR18xMAkweDBhCitzdGF0aWMgdW5zaWduZWQgeG10X2xvd2VyX2xpbWl0X3JlZyA9IFhNVF9MT1dFUl9MSU1JVF9SRUdfUFJPOworc3RhdGljIHVuc2lnbmVkIHhtdF91cHBlcl9saW1pdF9yZWcgPSBYTVRfVVBQRVJfTElNSVRfUkVHX1BSTzsKKworLyogQmFuayAyIHJlZ2lzdGVycyAqLworI2RlZmluZQlYTVRfQ2hhaW5fSW50CTB4MjAJLyogSW50ZXJydXB0IGF0IHRoZSBlbmQgb2YgdGhlIHRyYW5zbWl0IGNoYWluICovCisjZGVmaW5lCVhNVF9DaGFpbl9FcnJTdG9wCTB4NDAgLyogSW50ZXJydXB0IGF0IHRoZSBlbmQgb2YgdGhlIGNoYWluIGV2ZW4gaWYgdGhlcmUgYXJlIGVycm9ycyAqLworI2RlZmluZQlSQ1ZfRGlzY2FyZF9CYWRGcmFtZQkweDgwIC8qIFRocm93IGJhZCBmcmFtZXMgYXdheSwgYW5kIGNvbnRpbnVlIHRvIHJlY2VpdmUgb3RoZXJzICovCisjZGVmaW5lCVJFRzIJCTB4MDIKKyNkZWZpbmUJUFJNU0NfTW9kZQkweDAxCisjZGVmaW5lCU11bHRpX0lBCTB4MjAKKyNkZWZpbmUJUkVHMwkJMHgwMworI2RlZmluZQlUUEVfQklUCQkweDA0CisjZGVmaW5lCUJOQ19CSVQJCTB4MjAKKyNkZWZpbmUJUkVHMTMJCTB4MGQKKyNkZWZpbmUJRkRYCQkweDAwCisjZGVmaW5lCUFfTl9FTkFCTEUJMHgwMgorCQorI2RlZmluZQlJX0FERF9SRUcwCTB4MDQKKyNkZWZpbmUJSV9BRERfUkVHMQkweDA1CisjZGVmaW5lCUlfQUREX1JFRzIJMHgwNgorI2RlZmluZQlJX0FERF9SRUczCTB4MDcKKyNkZWZpbmUJSV9BRERfUkVHNAkweDA4CisjZGVmaW5lCUlfQUREX1JFRzUJMHgwOQorCisjZGVmaW5lIEVFUFJPTV9SRUdfUFJPCTB4MGEKKyNkZWZpbmUgRUVQUk9NX1JFR18xMAkweDBiCitzdGF0aWMgdW5zaWduZWQgZWVwcm9tX3JlZyA9IEVFUFJPTV9SRUdfUFJPOworCisjZGVmaW5lIEVFU0sgMHgwMQorI2RlZmluZSBFRUNTIDB4MDIKKyNkZWZpbmUgRUVESSAweDA0CisjZGVmaW5lIEVFRE8gMHgwOAorCisvKiBUaGUgaG9ycmlibGUgcm91dGluZSB0byByZWFkIGEgd29yZCBmcm9tIHRoZSBzZXJpYWwgRUVQUk9NLiAqLworLyogSU1QT1JUQU5UIC0gdGhlIDgyNTk1IHdpbGwgYmUgc2V0IHRvIEJhbmsgMCBhZnRlciB0aGUgZWVwcm9tIGlzIHJlYWQgKi8KKworLyogVGhlIGRlbGF5IGJldHdlZW4gRUVQUk9NIGNsb2NrIHRyYW5zaXRpb25zLiAqLworI2RlZmluZSBlZXByb21fZGVsYXkoKSB7IHVkZWxheSg0MCk7IH0KKyNkZWZpbmUgRUVfUkVBRF9DTUQgKDYgPDwgNikKKworLyogZG8gYSBmdWxsIHJlc2V0ICovCisjZGVmaW5lIGVlcHJvX2Z1bGxfcmVzZXQoaW9hZGRyKQlvdXRiKFJFU0VUX0NNRCwgaW9hZGRyKTsgdWRlbGF5KDQwKTsKKworLyogZG8gYSBuaWNlIHJlc2V0ICovCisjZGVmaW5lIGVlcHJvX3NlbF9yZXNldChpb2FkZHIpIAl7IFwKKwkJCQkJb3V0YihTRUxfUkVTRVRfQ01ELCBpb2FkZHIpOyBcCisJCQkJCVNMT1dfRE9XTjsgXAorCQkJCQlTTE9XX0RPV047IFwKKwkJCQkJfQorCisvKiBjbGVhciBhbGwgaW50ZXJydXB0cyAqLworI2RlZmluZQllZXByb19jbGVhcl9pbnQoaW9hZGRyKQlvdXRiKEFMTF9NQVNLLCBpb2FkZHIgKyBTVEFUVVNfUkVHKQorCisvKiBlbmFibGUgcnggKi8KKyNkZWZpbmUJZWVwcm9fZW5fcngoaW9hZGRyKQlvdXRiKFJDVl9FTkFCTEVfQ01ELCBpb2FkZHIpCisKKy8qIGRpc2FibGUgcnggKi8KKyNkZWZpbmUJZWVwcm9fZGlzX3J4KGlvYWRkcikJb3V0YihSQ1ZfRElTQUJMRV9DTUQsIGlvYWRkcikKKworLyogc3dpdGNoIGJhbmsgKi8KKyNkZWZpbmUgZWVwcm9fc3cyYmFuazAoaW9hZGRyKSBvdXRiKEJBTkswX1NFTEVDVCwgaW9hZGRyKQorI2RlZmluZSBlZXByb19zdzJiYW5rMShpb2FkZHIpIG91dGIoQkFOSzFfU0VMRUNULCBpb2FkZHIpCisjZGVmaW5lIGVlcHJvX3N3MmJhbmsyKGlvYWRkcikgb3V0YihCQU5LMl9TRUxFQ1QsIGlvYWRkcikKKworc3RhdGljIHVuc2lnbmVkIGludAlyeF9zdGFydCwgdHhfc3RhcnQ7CitzdGF0aWMgaW50CQl0eF9sYXN0Oworc3RhdGljIHVuc2lnbmVkCQl0eF9lbmQ7CitzdGF0aWMgaW50CQllZXBybyA9IDA7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQJaW9hZGRyID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQJbWVtX3N0YXJ0LCBtZW1fZW5kID0gUkNWX0RFRkFVTFRfUkFNIC8gMTAyNDsKKworI2RlZmluZQl1ZGVsYXkobikJd2FpdG9uX3RpbWVyMigoKG4pKlRJQ0tTX1BFUl9NUykvMTAwMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRVNFVCAtIFJlc2V0IGFkYXB0ZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGVlcHJvX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKK3sKKwlpbnQJCXRlbXBfcmVnLCBpOworCisJLyogcHV0IHRoZSBjYXJkIGluIGl0cyBpbml0aWFsIHN0YXRlICovCisJZWVwcm9fc3cyYmFuazIoaW9hZGRyKTsJLyogYmUgY2FyZWZ1bCwgYmFuazIgbm93ICovCisJdGVtcF9yZWcgPSBpbmIoaW9hZGRyICsgZWVwcm9tX3JlZyk7CisjaWZkZWYJREVCVUcKKwlwcmludGYoIlN0ZXBwaW5nICVkXG4iLCB0ZW1wX3JlZyA+PiA1KTsKKyNlbmRpZgorCWlmICh0ZW1wX3JlZyAmIDB4MTApCS8qIGNoZWNrIHRoZSBUdXJuT2ZmIEVuYWJsZSBiaXQgKi8KKwkJb3V0Yih0ZW1wX3JlZyAmIDB4RUYsIGlvYWRkciArIGVlcHJvbV9yZWcpOworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQkvKiBmaWxsIHRoZSBNQUMgYWRkcmVzcyAqLworCQlvdXRiKG5pYy0+bm9kZV9hZGRyW2ldLCBpb2FkZHIgKyBJX0FERF9SRUcwICsgaSk7CisJdGVtcF9yZWcgPSBpbmIoaW9hZGRyICsgUkVHMSk7CisJLyogc2V0dXAgVHJhbnNtaXQgQ2hhaW5pbmcgYW5kIGRpc2NhcmQgYmFkIFJDViBmcmFtZXMgKi8KKwlvdXRiKHRlbXBfcmVnIHwgWE1UX0NoYWluX0ludCB8IFhNVF9DaGFpbl9FcnJTdG9wCisJCXwgUkNWX0Rpc2NhcmRfQmFkRnJhbWUsIGlvYWRkciArIFJFRzEpOworCXRlbXBfcmVnID0gaW5iKGlvYWRkciArIFJFRzIpOwkJLyogbWF0Y2ggYnJvYWRjYXN0ICovCisJb3V0Yih0ZW1wX3JlZyB8IDB4MTQsIGlvYWRkciArIFJFRzIpOworCXRlbXBfcmVnID0gaW5iKGlvYWRkciArIFJFRzMpOworCW91dGIodGVtcF9yZWcgJiAweDNGLCBpb2FkZHIgKyBSRUczKTsJLyogY2xlYXIgdGVzdCBtb2RlICovCisJLyogc2V0IHRoZSByZWNlaXZpbmcgbW9kZSAqLworCWVlcHJvX3N3MmJhbmsxKGlvYWRkcik7CS8qIGJlIGNhcmVmdWwsIGJhbmsxIG5vdyAqLworCS8qIGluaXRpYWxpc2UgdGhlIFJDViBhbmQgWE1UIHVwcGVyIGFuZCBsb3dlciBsaW1pdHMgKi8KKwlvdXRiKFJDVl9MT1dFUl9MSU1JVCwgaW9hZGRyICsgUkNWX0xPV0VSX0xJTUlUX1JFRyk7CisJb3V0YihSQ1ZfVVBQRVJfTElNSVQsIGlvYWRkciArIFJDVl9VUFBFUl9MSU1JVF9SRUcpOworCW91dGIoWE1UX0xPV0VSX0xJTUlULCBpb2FkZHIgKyB4bXRfbG93ZXJfbGltaXRfcmVnKTsKKwlvdXRiKFhNVF9VUFBFUl9MSU1JVCwgaW9hZGRyICsgeG10X3VwcGVyX2xpbWl0X3JlZyk7CisJZWVwcm9fc3cyYmFuazAoaW9hZGRyKTsJLyogU3dpdGNoIGJhY2sgdG8gYmFuayAwICovCisJZWVwcm9fY2xlYXJfaW50KGlvYWRkcik7CisJLyogSW5pdGlhbGlzZSBSQ1YgKi8KKwlvdXR3KHJ4X3N0YXJ0ID0gKFJDVl9MT1dFUl9MSU1JVCA8PCA4KSwgaW9hZGRyICsgUkNWX0JBUik7CisJb3V0dygoKFJDVl9VUFBFUl9MSU1JVCA8PCA4KSB8IDB4RkUpLCBpb2FkZHIgKyBSQ1ZfU1RPUCk7CisJLyogSW50aWFsaXNlIFhNVCAqLworCW91dHcoKFhNVF9MT1dFUl9MSU1JVCA8PCA4KSwgaW9hZGRyICsgeG10X2Jhcik7CisJZWVwcm9fc2VsX3Jlc2V0KGlvYWRkcik7CisJdHhfc3RhcnQgPSB0eF9lbmQgPSAoWE1UX0xPV0VSX0xJTUlUIDw8IDgpOworCXR4X2xhc3QgPSAwOworCWVlcHJvX2VuX3J4KGlvYWRkcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUE9MTCAtIFdhaXQgZm9yIGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZWVwcm9fcG9sbChzdHJ1Y3QgbmljICpuaWMpCit7CisJaW50CQlpOworCXVuc2lnbmVkIGludAlyY3ZfY2FyID0gcnhfc3RhcnQ7CisJdW5zaWduZWQgaW50CXJjdl9ldmVudCwgcmN2X3N0YXR1cywgcmN2X25leHRfZnJhbWUsIHJjdl9zaXplOworCisJLyogcmV0dXJuIHRydWUgaWYgdGhlcmUncyBhbiBldGhlcm5ldCBwYWNrZXQgcmVhZHkgdG8gcmVhZCAqLworCS8qIG5pYy0+cGFja2V0IHNob3VsZCBjb250YWluIGRhdGEgb24gcmV0dXJuICovCisJLyogbmljLT5wYWNrZXRsZW4gc2hvdWxkIGNvbnRhaW4gbGVuZ3RoIG9mIGRhdGEgKi8KKyNpZgkwCisJaWYgKChpbmIoaW9hZGRyICsgU1RBVFVTX1JFRykgJiAweDQwKSA9PSAwKQorCQlyZXR1cm4gKDApOworCW91dGIoMHg0MCwgaW9hZGRyICsgU1RBVFVTX1JFRyk7CisjZW5kaWYKKwlvdXR3KHJjdl9jYXIsIGlvYWRkciArIEhPU1RfQUREUkVTU19SRUcpOworCXJjdl9ldmVudCA9IGludyhpb2FkZHIgKyBJT19QT1JUKTsKKwlpZiAocmN2X2V2ZW50ICE9IFJDVl9ET05FKQorCQlyZXR1cm4gKDApOworCXJjdl9zdGF0dXMgPSBpbncoaW9hZGRyICsgSU9fUE9SVCk7CisJcmN2X25leHRfZnJhbWUgPSBpbncoaW9hZGRyICsgSU9fUE9SVCk7CisJcmN2X3NpemUgPSBpbncoaW9hZGRyICsgSU9fUE9SVCk7CisjaWYJMAorCXByaW50ZigiJWhYICVoWCAlZCAlaGhYXG4iLCByY3Zfc3RhdHVzLCByY3ZfbmV4dF9mcmFtZSwgcmN2X3NpemUsCisJCWluYihpb2FkZHIgKyBTVEFUVVNfUkVHKSk7CisjZW5kaWYKKwlpZiAoKHJjdl9zdGF0dXMgJiAoUlhfT0t8UlhfRVJST1IpKSAhPSBSWF9PSykgeworCQlwcmludGYoIlJlY2VpdmUgZXJyb3IgJWhYXG4iLCByY3Zfc3RhdHVzKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJcmN2X3NpemUgJj0gMHgzRkZGOworCWluc3coaW9hZGRyICsgSU9fUE9SVCwgbmljLT5wYWNrZXQsICgocmN2X3NpemUgKyAzKSA+PiAxKSk7CisjaWYJMAorCWZvciAoaSA9IDA7IGkgPCA0ODsgaSsrKSB7CisJCXByaW50ZigiJWhoWCIsIG5pYy0+cGFja2V0W2ldKTsKKwkJcHV0Y2hhcihpICUgMTYgPT0gMTUgPyAnXG4nIDogJyAnKTsKKwl9CisjZW5kaWYKKwluaWMtPnBhY2tldGxlbiA9IHJjdl9zaXplOworCXJjdl9jYXIgPSByeF9zdGFydCArIFJDVl9IRUFERVIgKyByY3Zfc2l6ZTsKKwlyeF9zdGFydCA9IHJjdl9uZXh0X2ZyYW1lOworCWlmIChyY3ZfY2FyID09IDApCisJCXJjdl9jYXIgPSAoKFJDVl9VUFBFUl9MSU1JVCA8PCA4KSB8IDB4ZmYpOworCW91dHcocmN2X2NhciAtIDEsIGlvYWRkciArIFJDVl9TVE9QKTsKKwlyZXR1cm4gKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1RSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZWVwcm9fdHJhbnNtaXQoCisJc3RydWN0IG5pYyAqbmljLAorCWNvbnN0IGNoYXIgKmQsCQkJLyogRGVzdGluYXRpb24gKi8KKwl1bnNpZ25lZCBpbnQgdCwJCQkvKiBUeXBlICovCisJdW5zaWduZWQgaW50IHMsCQkJLyogc2l6ZSAqLworCWNvbnN0IGNoYXIgKnApCQkJLyogUGFja2V0ICovCit7CisJdW5zaWduZWQgaW50CXN0YXR1cywgdHhfYXZhaWxhYmxlLCBsYXN0LCBlbmQsIGxlbmd0aDsKKwl1bnNpZ25lZCBzaG9ydAl0eXBlOworCWludAkJYm9ndXNjb3VudCA9IDIwOworCisJbGVuZ3RoID0gcyArIEVUSF9ITEVOOworCWlmICh0eF9lbmQgPiB0eF9zdGFydCkKKwkJdHhfYXZhaWxhYmxlID0gWE1UX1JBTSAtICh0eF9lbmQgLSB0eF9zdGFydCk7CisJZWxzZSBpZiAodHhfZW5kIDwgdHhfc3RhcnQpCisJCXR4X2F2YWlsYWJsZSA9IHR4X3N0YXJ0IC0gdHhfZW5kOworCWVsc2UKKwkJdHhfYXZhaWxhYmxlID0gWE1UX1JBTTsKKwlsYXN0ID0gdHhfZW5kOworCWVuZCA9IGxhc3QgKyAoKChsZW5ndGggKyAzKSA+PiAxKSA8PCAxKSArIFhNVF9IRUFERVI7CisJaWYgKGVuZCA+PSAoWE1UX1VQUEVSX0xJTUlUIDw8IDgpKSB7CisJCWxhc3QgPSAoWE1UX0xPV0VSX0xJTUlUIDw8IDgpOworCQllbmQgPSBsYXN0ICsgKCgobGVuZ3RoICsgMykgPj4gMSkgPDwgMSkgKyBYTVRfSEVBREVSOworCX0KKwlvdXR3KGxhc3QsIGlvYWRkciArIEhPU1RfQUREUkVTU19SRUcpOworCW91dHcoWE1UX0NNRCwgaW9hZGRyICsgSU9fUE9SVCk7CisJb3V0dygwLCBpb2FkZHIgKyBJT19QT1JUKTsKKwlvdXR3KGVuZCwgaW9hZGRyICsgSU9fUE9SVCk7CisJb3V0dyhsZW5ndGgsIGlvYWRkciArIElPX1BPUlQpOworCW91dHN3KGlvYWRkciArIElPX1BPUlQsIGQsIEVUSF9BTEVOIC8gMik7CisJb3V0c3coaW9hZGRyICsgSU9fUE9SVCwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOIC8gMik7CisJdHlwZSA9IGh0b25zKHQpOworCW91dHN3KGlvYWRkciArIElPX1BPUlQsICZ0eXBlLCBzaXplb2YodHlwZSkgLyAyKTsKKwlvdXRzdyhpb2FkZHIgKyBJT19QT1JULCBwLCAocyArIDMpID4+IDEpOworCS8qIEEgZHVtbXkgcmVhZCB0byBmbHVzaCB0aGUgRFJBTSB3cml0ZSBwaXBlbGluZSAqLworCXN0YXR1cyA9IGludyhpb2FkZHIgKyBJT19QT1JUKTsKKwlvdXR3KGxhc3QsIGlvYWRkciArIHhtdF9iYXIpOworCW91dGIoWE1UX0NNRCwgaW9hZGRyKTsKKwl0eF9zdGFydCA9IGxhc3Q7CisJdHhfbGFzdCA9IGxhc3Q7CisJdHhfZW5kID0gZW5kOworI2lmCTAKKwlwcmludGYoIiVkICVkXG4iLCB0eF9zdGFydCwgdHhfZW5kKTsKKyNlbmRpZgorCXdoaWxlIChib2d1c2NvdW50ID4gMCkgeworCQlpZiAoKChzdGF0dXMgPSBpbncoaW9hZGRyICsgSU9fUE9SVCkpICYgVFhfRE9ORV9CSVQpID09IDApIHsKKwkJCXVkZWxheSg0MCk7CisJCQlib2d1c2NvdW50LS07CisJCQljb250aW51ZTsKKwkJfQorI2lmCURFQlVHCisJCWlmICgoc3RhdHVzICYgMHgyMDAwKSA9PSAwKQorCQkJcHJpbnRmKCJUcmFuc21pdCBzdGF0dXMgJWhYXG4iLCBzdGF0dXMpOworI2VuZGlmCisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RJU0FCTEUgLSBUdXJuIG9mZiBldGhlcm5ldCBpbnRlcmZhY2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGVlcHJvX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQoreworCWVlcHJvX3N3MmJhbmswKGlvYWRkcik7CS8qIFN3aXRjaCB0byBiYW5rIDAgKi8KKwkvKiBGbHVzaCB0aGUgVHggYW5kIGRpc2FibGUgUnggKi8KKwlvdXRiKFNUT1BfUkNWX0NNRCwgaW9hZGRyKTsKKwl0eF9zdGFydCA9IHR4X2VuZCA9IChYTVRfTE9XRVJfTElNSVQgPDwgOCk7CisJdHhfbGFzdCA9IDA7CisJLyogUmVzZXQgdGhlIDgyNTk1ICovCisJZWVwcm9fZnVsbF9yZXNldChpb2FkZHIpOworfQorCitzdGF0aWMgaW50IHJlYWRfZWVwcm9tKGludCBsb2NhdGlvbikKK3sKKwlpbnQJCWk7CisJdW5zaWduZWQgc2hvcnQJcmV0dmFsID0gMDsKKwlpbnQJCWVlX2FkZHIgPSBpb2FkZHIgKyBlZXByb21fcmVnOworCWludAkJcmVhZF9jbWQgPSBsb2NhdGlvbiB8IEVFX1JFQURfQ01EOworCWludAkJY3RybF92YWwgPSBFRUNTOworCisJaWYgKGVlcHJvID09IExBTjU5NUZYXzEwSVNBKSB7CisJCWVlcHJvX3N3MmJhbmsxKGlvYWRkcik7CisJCW91dGIoMHgwMCwgaW9hZGRyICsgU1RBVFVTX1JFRyk7CisJfQorCWVlcHJvX3N3MmJhbmsyKGlvYWRkcik7CisJb3V0YihjdHJsX3ZhbCwgZWVfYWRkcik7CisJLyogc2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dCAqLworCWZvciAoaSA9IDg7IGkgPj0gMDsgaS0tKSB7CisJCXNob3J0IG91dHZhbCA9IChyZWFkX2NtZCAmICgxIDw8IGkpKSA/IGN0cmxfdmFsIHwgRUVESSA6IGN0cmxfdmFsOworCQlvdXRiKG91dHZhbCwgZWVfYWRkcik7CisJCW91dGIob3V0dmFsIHwgRUVTSywgZWVfYWRkcik7CS8qIEVFUFJPTSBjbG9jayB0aWNrICovCisJCWVlcHJvbV9kZWxheSgpOworCQlvdXRiKG91dHZhbCwgZWVfYWRkcik7CQkvKiBmaW5pc2ggRUVQUk9NIGNsb2NrIHRpY2sgKi8KKwkJZWVwcm9tX2RlbGF5KCk7CisJfQorCW91dGIoY3RybF92YWwsIGVlX2FkZHIpOworCWZvciAoaSA9IDE2OyBpID4gMDsgaS0tKSB7CisJCW91dGIoY3RybF92YWwgfCBFRVNLLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KCk7CisJCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKGluYihlZV9hZGRyKSAmIEVFRE8pID8gMSA6IDApOworCQlvdXRiKGN0cmxfdmFsLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KCk7CisJfQorCS8qIHRlcm1pbmF0ZSB0aGUgRUVQUk9NIGFjY2VzcyAqLworCWN0cmxfdmFsICY9IH5FRUNTOworCW91dGIoY3RybF92YWwgfCBFRVNLLCBlZV9hZGRyKTsKKwllZXByb21fZGVsYXkoKTsKKwlvdXRiKGN0cmxfdmFsLCBlZV9hZGRyKTsKKwllZXByb21fZGVsYXkoKTsKKwllZXByb19zdzJiYW5rMChpb2FkZHIpOworCXJldHVybiAocmV0dmFsKTsKK30KKworc3RhdGljIGludCBlZXByb19wcm9iZTEoc3RydWN0IG5pYyAqbmljKQoreworCWludAkJaSwgaWQsIGNvdW50ZXIsIGxfZWVwcm8gPSAwOworCXVuaW9uIHsKKwkJdW5zaWduZWQgY2hhcgljYWRkcltFVEhfQUxFTl07CisJCXVuc2lnbmVkIHNob3J0CXNhZGRyW0VUSF9BTEVOLzJdOworCX0gc3RhdGlvbl9hZGRyOworCWNoYXIJCSpuYW1lOworCisJaWQgPSBpbmIoaW9hZGRyICsgSURfUkVHKTsKKwlpZiAoKGlkICYgSURfUkVHX01BU0spICE9IElEX1JFR19TSUcpCisJCXJldHVybiAoMCk7CisJY291bnRlciA9IGlkICYgUl9ST0JJTl9CSVRTOworCWlmICgoKGlkID0gaW5iKGlvYWRkciArIElEX1JFRykpICYgUl9ST0JJTl9CSVRTKSAhPSAoY291bnRlciArIDB4NDApKQorCQlyZXR1cm4gKDApOworCS8qIHllcyB0aGUgODI1OTUgaGFzIGJlZW4gZm91bmQgKi8KKwlzdGF0aW9uX2FkZHIuc2FkZHJbMl0gPSByZWFkX2VlcHJvbSgyKTsKKwlpZiAoc3RhdGlvbl9hZGRyLnNhZGRyWzJdID09IDB4MDAwMCB8fCBzdGF0aW9uX2FkZHIuc2FkZHJbMl0gPT0gMHhGRkZGKSB7CisJCWxfZWVwcm8gPSAzOworCQllZXBybyA9IExBTjU5NUZYXzEwSVNBOworCQllZXByb21fcmVnPSBFRVBST01fUkVHXzEwOworCQlyY3Zfc3RhcnQgPSBSQ1ZfU1RBUlRfMTA7CisJCXhtdF9sb3dlcl9saW1pdF9yZWcgPSBYTVRfTE9XRVJfTElNSVRfUkVHXzEwOworCQl4bXRfdXBwZXJfbGltaXRfcmVnID0gWE1UX1VQUEVSX0xJTUlUX1JFR18xMDsKKwkJc3RhdGlvbl9hZGRyLnNhZGRyWzJdID0gcmVhZF9lZXByb20oMik7CisJfQorCXN0YXRpb25fYWRkci5zYWRkclsxXSA9IHJlYWRfZWVwcm9tKDMpOworCXN0YXRpb25fYWRkci5zYWRkclswXSA9IHJlYWRfZWVwcm9tKDQpOworCWlmIChsX2VlcHJvKQorCQluYW1lID0gIkludGVsIEV0aGVyRXhwcmVzcyAxMCBJU0EiOworCWVsc2UgaWYgKHJlYWRfZWVwcm9tKDcpID09IGVlX0ZYX0lOVDJJUlEpIHsKKwkJbmFtZSA9ICJJbnRlbCBFdGhlckV4cHJlc3MgUHJvLzEwKyBJU0EiOworCQlsX2VlcHJvID0gMjsKKwl9IGVsc2UgaWYgKHN0YXRpb25fYWRkci5zYWRkclswXSA9PSBTQV9BRERSMSkgeworCQluYW1lID0gIkludGVsIEV0aGVyRXhwcmVzcyBQcm8vMTAgSVNBIjsKKwkJbF9lZXBybyA9IDE7CisJfSBlbHNlIHsKKwkJbF9lZXBybyA9IDA7CisJCW5hbWUgPSAiSW50ZWwgODI1OTUtYmFzZWQgTEFOIGNhcmQiOworCX0KKwlzdGF0aW9uX2FkZHIuc2FkZHJbMF0gPSBzd2FwMTYoc3RhdGlvbl9hZGRyLnNhZGRyWzBdKTsKKwlzdGF0aW9uX2FkZHIuc2FkZHJbMV0gPSBzd2FwMTYoc3RhdGlvbl9hZGRyLnNhZGRyWzFdKTsKKwlzdGF0aW9uX2FkZHIuc2FkZHJbMl0gPSBzd2FwMTYoc3RhdGlvbl9hZGRyLnNhZGRyWzJdKTsKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykgeworCQluaWMtPm5vZGVfYWRkcltpXSA9IHN0YXRpb25fYWRkci5jYWRkcltpXTsKKwl9CisJcHJpbnRmKCJcbiVzIGlvYWRkciAlI2hYLCBhZGRyICUhIiwgbmFtZSwgaW9hZGRyLCBuaWMtPm5vZGVfYWRkcik7CisJbWVtX3N0YXJ0ID0gUkNWX0xPV0VSX0xJTUlUIDw8IDg7CisJaWYgKChtZW1fZW5kICYgMHgzRikgPCAzIHx8IChtZW1fZW5kICYgMHgzRikgPiAyOSkKKwkJbWVtX2VuZCA9IFJDVl9VUFBFUl9MSU1JVCA8PCA4OworCWVsc2UgeworCQltZW1fZW5kID0gbWVtX2VuZCAqIDEwMjQgKyAoUkNWX0xPV0VSX0xJTUlUIDw8IDgpOworCQlyY3ZfcmFtID0gbWVtX2VuZCAtIChSQ1ZfTE9XRVJfTElNSVQgPDwgOCk7CisJfQorCXByaW50ZigiLCBSeCBtZW0gJWRLLCBpZiAlc1xuIiwgKG1lbV9lbmQgLSBtZW1fc3RhcnQpID4+IDEwLAorCQlHZXRCaXQocmVhZF9lZXByb20oNSksIGVlX0JOQ19UUEUpID8gIkJOQyIgOiAiVFAiKTsKKwlyZXR1cm4gKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlciwgdGhpcyByb3V0aW5lJ3MgdmlzaWJsZSB0byB0aGUgb3V0c2lkZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IG5pYyAqZWVwcm9fcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVfYWRkcnMpCit7CisJdW5zaWduZWQgc2hvcnQJCSpwOworCS8qIHNhbWUgcHJvYmUgbGlzdCBhcyB0aGUgTGludXggZHJpdmVyICovCisJc3RhdGljIHVuc2lnbmVkIHNob3J0CWlvYWRkcnNbXSA9IHsKKwkJMHgzMDAsIDB4MjEwLCAweDI0MCwgMHgyODAsIDB4MkMwLCAweDIwMCwgMHgzMjAsIDB4MzQwLCAweDM2MCwgMH07CisKKwlpZiAocHJvYmVfYWRkcnMgPT0gMCB8fCBwcm9iZV9hZGRyc1swXSA9PSAwKQorCQlwcm9iZV9hZGRycyA9IGlvYWRkcnM7CisJZm9yIChwID0gcHJvYmVfYWRkcnM7IChpb2FkZHIgPSAqcCkgIT0gMDsgcCsrKSB7CisJCWlmIChlZXByb19wcm9iZTEobmljKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoKnAgPT0gMCkKKwkJcmV0dXJuICgwKTsKKwllZXByb19yZXNldChuaWMpOworCS8qIHBvaW50IHRvIE5JQyBzcGVjaWZpYyByb3V0aW5lcyAqLworCW5pYy0+cmVzZXQgPSBlZXByb19yZXNldDsKKwluaWMtPnBvbGwgPSBlZXByb19wb2xsOworCW5pYy0+dHJhbnNtaXQgPSBlZXByb190cmFuc21pdDsKKwluaWMtPmRpc2FibGUgPSBlZXByb19kaXNhYmxlOworCXJldHVybiAobmljKTsKK30KZGlmZiAtLWdpdCBhL25ldGJvb3QvZWVwcm8xMDAuYyBiL25ldGJvb3QvZWVwcm8xMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjUxMGE3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9lZXBybzEwMC5jCkBAIC0wLDAgKzEsNjU0IEBACisvKgorICogZWVwcm8xMDAuYyAtLSBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgZWVwcm8xMDAgZHJpdmVyIGZvciBldGhlcmJvb3QuCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgQVcgQ29tcHV0ZXIgU3lzdGVtcy4KKyAqIHdyaXR0ZW4gYnkgUi5FLldvbGZmIC0tIFIuRS5Xb2xmZkBCaXRXaXphcmQubmwKKyAqCisgKgorICogQVcgQ29tcHV0ZXIgU3lzdGVtcyBpcyBjb250cmlidXRpbmcgdG8gdGhlIGZyZWUgc29mdHdhcmUgY29tbXVuaXR5CisgKiBieSBwYXlpbmcgZm9yIHRoaXMgZHJpdmVyIGFuZCB0aGVuIHB1dHRpbmcgdGhlIHJlc3VsdCB1bmRlciBHUEwuCisgKgorICogSWYgeW91IG5lZWQgYSBMaW51eCBkZXZpY2UgZHJpdmVyLCBwbGVhc2UgY29udGFjdCBCaXRXaXphcmQgZm9yIGEKKyAqIHF1b3RlLgorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKgorICogICAgICAgICAgICAgIGRhdGUgICAgICAgdmVyc2lvbiAgYnkgICB3aGF0CisgKiAgV3JpdHRlbjogICAgTWF5IDI5IDE5OTcgIFYwLjEwICBSRVcgIEluaXRpYWwgcmV2aXNpb24uCisgKiBjaGFuZ2VzOiAgICAgTWF5IDMxIDE5OTcgIFYwLjkwICBSRVcgIFdvcmtzIQorICogICAgICAgICAgICAgIEp1biAxICAxOTk3ICBWMC45MSAgUkVXICBDbGVhbnVwCisgKiAgICAgICAgICAgICAgSnVuIDIgIDE5OTcgIFYwLjkyICBSRVcgIEFkZCBzb21lIGNvZGUgZG9jdW1lbnRhdGlvbgorICogICAgICAgICAgICAgIEp1bCAyNSAxOTk3ICBWMS4wMCAgUkVXICBUZXN0ZWQgYnkgQVcgdG8gd29yayBpbiBhIFBST00KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xlYW51cCBmb3IgcHVibGljYXRpb24KKyAqCisgKiBUaGlzIGlzIHRoZSBldGhlcmJvb3QgaW50ZWwgZXRoZXJleHByZXNzIFByby8xMDBCIGRyaXZlci4KKyAqCisgKiBJdCB3YXMgd3JpdHRlbiBmcm9tIHNjcmF0Y2gsIHdpdGggRG9uYWxkIEJlY2tlcnMgZWVwcm8xMDAuYyBrZXJuZWwKKyAqIGRyaXZlciBhcyBhIGd1aWRlbGluZS4gTW9zdGx5IHRoZSA4MjU1NyByZWxhdGVkIGRlZmluaXRpb25zIGFuZCB0aGUKKyAqIGxvd2VyIGxldmVsIHJvdXRpbmVzIGhhdmUgYmVlbiBjdXQtYW5kLXBhc3RlZCBpbnRvIHRoaXMgc291cmNlLgorICoKKyAqIFRoZSBkcml2ZXIgd2FzIGZpbmlzaGVkIGJlZm9yZSBJbnRlbCBnb3QgdGhlIE5EQSBvdXQgb2YgdGhlIGNsb3NldC4KKyAqIEkgc3RpbGwgZG9uJ3QgaGF2ZSB0aGUgZG9jcy4KKyAqICovCisKKy8qIFBoaWxvc29waHkgb2YgdGhpcyBkcml2ZXIuCisgKgorICogUHJvYmluZzoKKyAqCisgKiBVc2luZyB0aGUgcGNpLmMgZnVuY3Rpb25zIG9mIHRoZSBFdGhlcmJvb3QgY29kZSwgdGhlIDgyNTU3IGNoaXAgaXMgZGV0ZWN0ZWQuCisgKiBJdCBpcyB2ZXJpZmllZCB0aGF0IHRoZSBCSU9TIGluaXRpYWxpemVkIGV2ZXJ5dGhpbmcgcHJvcGVybHkgYW5kIGlmCisgKiBzb21ldGhpbmcgaXMgbWlzc2luZyBpdCBpcyBkb25lIG5vdy4KKyAqCisgKgorICogSW5pdGlhbGl6YXRpb246CisgKgorICoKKyAqIFRoZSBjaGlwIGlzIHRoZW4gaW5pdGlhbGl6ZWQgdG8gImtub3ciIGl0cyBldGhlcm5ldCBhZGRyZXNzLCBhbmQgdG8KKyAqIHN0YXJ0IHJlY2lldmluZyBwYWNrZXRzLiBUaGUgTGludXggZHJpdmVyIGhhcyBhIHdob2xlIHRyYW5zbWl0IGFuZAorICogcmVjaWV2ZSByaW5nIG9mIGJ1ZmZlcnMuIFRoaXMgaXMgbmVhdCBpZiB5b3UgbmVlZCBoaWdoIHBlcmZvcm1hbmNlOgorICogeW91IGNhbiB3cml0ZSB0aGUgYnVmZmVycyBhc3luY2hyb25vdXNseSB0byB0aGUgY2hpcCByZWFkaW5nIHRoZQorICogYnVmZmVycyBhbmQgdHJhbnNtaXR0aW5nIHRoZW0gb3ZlciB0aGUgbmV0d29yay4gIFBlcmZvcm1hbmNlIGlzIE5PVAorICogYW4gaXNzdWUgaGVyZS4gV2UgY2FuIGJvb3QgYSA0MDBrIGtlcm5lbCBpbiBhYm91dCB0d28KKyAqIHNlY29uZHMuIChUaGVvcnk6IDAuNCBzZWNvbmRzKS4gQm9vdGluZyBhIHN5c3RlbSBpcyBnb2luZyB0byB0YWtlCisgKiBhYm91dCBoYWxmIGEgbWludXRlIGFueXdheSwgc28gZ2V0dGluZyAxMCB0aW1lcyBjbG9zZXIgdG8gdGhlCisgKiB0aGVvcmV0aWNhbCBsaW1pdCBpcyBnb2luZyB0byBtYWtlIGEgZGlmZmVyZW5jZSBvZiBhIGZldyBwZXJjZW50LgorICoKKyAqCisgKiBUcmFuc21pdHRpbmcgYW5kIHJlY2lldmluZy4KKyAqCisgKiBXZSBoYXZlIG9ubHkgb25lIHRyYW5zbWl0IGRlc2NyaXB0b3IuIEl0IGhhcyB0d28gYnVmZmVyIGRlc2NyaXB0b3JzOgorICogb25lIGZvciB0aGUgaGVhZGVyLCBhbmQgdGhlIG90aGVyIGZvciB0aGUgZGF0YS4KKyAqIFdlIGhhdmUgb25seSBvbmUgcmVjZWl2ZSBidWZmZXIuIFRoZSBjaGlwIGlzIHRvbGQgdG8gcmVjaWV2ZSBwYWNrZXRzLAorICogYW5kIHN1c3BlbmQgaXRzZWxmIG9uY2UgaXQgZ290IG9uZS4gVGhlIHJlY2lldmUgKHBvbGwpIHJvdXRpbmUgc2ltcGx5CisgKiBsb29rcyBhdCB0aGUgcmVjaWV2ZSBidWZmZXIgdG8gc2VlIGlmIHRoZXJlIGlzIGFscmVhZHkgYSBwYWNrZXQgdGhlcmUuCisgKiBpZiB0aGVyZSBpcywgdGhlIGJ1ZmZlciBpcyBjb3BpZWQsIGFuZCB0aGUgcmVjaWV2ZXIgaXMgcmVzdGFydGVkLgorICoKKyAqIENhdmVhdHM6CisgKgorICogVGhlIGV0aGVyYm9vdCBmcmFtZXdvcmsgbW92ZXMgdGhlIGNvZGUgdG8gdGhlIDMyayBzZWdtZW50IGZyb20KKyAqIDB4OTgwMDAgdG8gMHhhMDAwMC4gVGhlcmUgaXMganVzdCBhIGxpdHRsZSByb29tIGJldHdlZW4gdGhlIGVuZCBvZgorICogdGhpcyBkcml2ZXIgYW5kIHRoZSAweGEwMDAwIGFkZHJlc3MuIElmIHlvdSBjb21waWxlIGluIHRvbyBtYW55CisgKiBmZWF0dXJlcywgdGhpcyB3aWxsIG92ZXJmbG93LgorICogVGhlIG51bWJlciB1bmRlciAiaGV4IiBpbiB0aGUgb3V0cHV0IG9mIHNpemUgdGhhdCBzY3JvbGxzIGJ5IHdoaWxlCisgKiBjb21waWxpbmcgc2hvdWxkIGJlIGxlc3MgdGhhbiA4MDAwLiBNYXliZSBldmVuIHRoZSBzdGFjayBpcyB1cCB0aGVyZSwKKyAqIHNvIHRoYXQgeW91IG5lZWQgZXZlbiBtb3JlIGhlYWRyb29tLgorICovCisKKy8qIFRoZSBldGhlcmJvb3QgYXV0aG9ycyBzZWVtIHRvIGRpc2xpa2UgdGhlIGFyZ3VtZW50IG9yZGVyaW5nIGluCisgKiBvdXRiIG1hY3JvcyB0aGF0IExpbnV4IHVzZXMuIEkgZGlza2xpa2UgdGhlIGNvbmZ1c2lvbiB0aGF0IHRoaXMKKyAqIGhhcyBjYXVzZWQgZXZlbiBtb3JlLi4uLiBUaGlzIGZpbGUgdXNlcyB0aGUgTGludXggYXJndW1lbnQgb3JkZXJpbmcuICAqLworLyogU29ycnkgbm90IHVzLiBJdCdzIGluaGVydGVkIGNvZGUgZnJvbSBGcmVlQlNELiBbVGhlIGF1dGhvcnNdICovCisKKyNpbmNsdWRlICJldGhlcmJvb3QuaCIKKyNpbmNsdWRlICJuaWMuaCIKKyNpbmNsdWRlICJwY2kuaCIKKyNpbmNsdWRlICJjYXJkcy5oIgorI2luY2x1ZGUgInRpbWVyLmgiCisKKyN1bmRlZgl2aXJ0X3RvX2J1cworI2RlZmluZQl2aXJ0X3RvX2J1cyh4KQkoKHVuc2lnbmVkIGxvbmcpeCkKKworc3RhdGljIGludCBpb2FkZHI7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgdTg7Cit0eXBlZGVmICAgc2lnbmVkIGNoYXIgIHM4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1MTY7Cit0eXBlZGVmICAgc2lnbmVkIHNob3J0IHMxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgdTMyOwordHlwZWRlZiAgIHNpZ25lZCBpbnQgICBzMzI7CisKK2VudW0gc3BlZWRvX29mZnNldHMgeworICBTQ0JTdGF0dXMgPSAwLCBTQ0JDbWQgPSAyLCAgICAgIC8qIFJ4L0NvbW1hbmQgVW5pdCBjb21tYW5kIGFuZCBzdGF0dXMuICovCisgIFNDQlBvaW50ZXIgPSA0LCAgICAgICAgICAgICAgICAgLyogR2VuZXJhbCBwdXJwb3NlIHBvaW50ZXIuICovCisgIFNDQlBvcnQgPSA4LCAgICAgICAgICAgICAgICAgICAgLyogTWlzYy4gY29tbWFuZHMgYW5kIG9wZXJhbmRzLiAgKi8KKyAgU0NCZmxhc2ggPSAxMiwgU0NCZWVwcm9tID0gMTQsICAvKiBFRVBST00gYW5kIGZsYXNoIG1lbW9yeSBjb250cm9sLiAqLworICBTQ0JDdHJsTURJID0gMTYsICAgICAgICAgICAgICAgIC8qIE1ESSBpbnRlcmZhY2UgY29udHJvbC4gKi8KKyAgU0NCRWFybHlSeCA9IDIwLCAgICAgICAgICAgICAgICAvKiBFYXJseSByZWNlaXZlIGJ5dGUgY291bnQuICovCit9OworCitzdGF0aWMgaW50IGRvX2VlcHJvbV9jbWQoaW50IGNtZCwgaW50IGNtZF9sZW4pOwordm9pZCBoZCh2b2lkICp3aGVyZSwgaW50IG4pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgSTgyNTU3IHJlbGF0ZWQgZGVmaW5lcyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFNlcmlhbCBFRVBST00gc2VjdGlvbi4KKyAgIEEgImJpdCIgZ3J1bmd5LCBidXQgd2Ugd29yayBvdXIgd2F5IHRocm91Z2ggYml0LWJ5LWJpdCA6LT4uICovCisvKiAgRUVQUk9NX0N0cmwgYml0cy4gKi8KKyNkZWZpbmUgRUVfU0hJRlRfQ0xLICAgIDB4MDEgICAgLyogRUVQUk9NIHNoaWZ0IGNsb2NrLiAqLworI2RlZmluZSBFRV9DUyAgICAgICAgICAgMHgwMiAgICAvKiBFRVBST00gY2hpcCBzZWxlY3QuICovCisjZGVmaW5lIEVFX0RBVEFfV1JJVEUgICAweDA0ICAgIC8qIEVFUFJPTSBjaGlwIGRhdGEgaW4uICovCisjZGVmaW5lIEVFX0RBVEFfUkVBRCAgICAweDA4ICAgIC8qIEVFUFJPTSBjaGlwIGRhdGEgb3V0LiAqLworI2RlZmluZSBFRV9XUklURV8wICAgICAgMHg0ODAyCisjZGVmaW5lIEVFX1dSSVRFXzEgICAgICAweDQ4MDYKKyNkZWZpbmUgRUVfRU5CICAgICAgICAgICgweDQ4MDAgfCBFRV9DUykKKworI2RlZmluZSB1ZGVsYXkobikgICAgICAgd2FpdG9uX3RpbWVyMigoKG4pKlRJQ0tTX1BFUl9NUykvMTAwMCkKKworLyogVGhlIEVFUFJPTSBjb21tYW5kcyBpbmNsdWRlIHRoZSBhbHdheS1zZXQgbGVhZGluZyBiaXQuICovCisjZGVmaW5lIEVFX1JFQURfQ01EICAgICA2CisKKy8qIFRoZSBTQ0IgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGNvbnRyb2xzIGZvciB0aGUgVHggYW5kIFJ4IHVuaXRzOiAqLworI2RlZmluZSAgQ1VfU1RBUlQgICAgICAgMHgwMDEwCisjZGVmaW5lICBDVV9SRVNVTUUgICAgICAweDAwMjAKKyNkZWZpbmUgIENVX1NUQVRTQUREUiAgIDB4MDA0MAorI2RlZmluZSAgQ1VfU0hPV1NUQVRTICAgMHgwMDUwICAvKiBEdW1wIHN0YXRpc3RpY3MgY291bnRlcnMuICovCisjZGVmaW5lICBDVV9DTURfQkFTRSAgICAweDAwNjAgIC8qIEJhc2UgYWRkcmVzcyB0byBhZGQgdG8gYWRkIENVIGNvbW1hbmRzLiAqLworI2RlZmluZSAgQ1VfRFVNUFNUQVRTICAgMHgwMDcwICAvKiBEdW1wIHRoZW4gcmVzZXQgc3RhdHMgY291bnRlcnMuICovCisKKyNkZWZpbmUgIFJYX1NUQVJUICAgICAgIDB4MDAwMQorI2RlZmluZSAgUlhfUkVTVU1FICAgICAgMHgwMDAyCisjZGVmaW5lICBSWF9BQk9SVCAgICAgICAweDAwMDQKKyNkZWZpbmUgIFJYX0FERFJfTE9BRCAgIDB4MDAwNgorI2RlZmluZSAgUlhfUkVTVU1FTlIgICAgMHgwMDA3CisjZGVmaW5lIElOVF9NQVNLICAgICAgICAweDAxMDAKKyNkZWZpbmUgRFJWUl9JTlQgICAgICAgIDB4MDIwMCAgICAgICAgICAvKiBEcml2ZXIgZ2VuZXJhdGVkIGludGVycnVwdC4gKi8KKworZW51bSBwaHlfY2hpcHMgeyBOb25TdWNoUGh5PTAsIEk4MjU1M0FCLCBJODI1NTNDLCBJODI1MDMsIERQODM4NDAsIFM4MEMyNDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFM4MEMyNCwgUGh5VW5kZWZpbmVkLCBEUDgzODQwQT0xMCwgfTsKKworLyogQ29tbWFuZHMgdGhhdCBjYW4gYmUgcHV0IGluIGEgY29tbWFuZCBsaXN0IGVudHJ5LiAqLworZW51bSBjb21tYW5kcyB7CisgIENtZE5PcCA9IDAsCisgIENtZElBU2V0dXAgPSAxLAorICBDbWRDb25maWd1cmUgPSAyLAorICBDbWRNdWx0aWNhc3RMaXN0ID0gMywKKyAgQ21kVHggPSA0LAorICBDbWRURFIgPSA1LAorICBDbWREdW1wID0gNiwKKyAgQ21kRGlhZ25vc2UgPSA3LAorCisgIC8qIEFuZCBzb21lIGV4dHJhIGZsYWdzOiAqLworICBDbWRTdXNwZW5kID0gMHg0MDAwLCAgICAgIC8qIFN1c3BlbmQgYWZ0ZXIgY29tcGxldGlvbi4gKi8KKyAgQ21kSW50ciA9IDB4MjAwMCwgICAgICAgICAvKiBJbnRlcnJ1cHQgYWZ0ZXIgY29tcGxldGlvbi4gKi8KKyAgQ21kVHhGbGV4ID0gMHgwMDA4LCAgICAgICAvKiBVc2UgIkZsZXhpYmxlIG1vZGUiIGZvciBDbWRUeCBjb21tYW5kLiAqLworfTsKKworLyogSG93IHRvIHdhaXQgZm9yIHRoZSBjb21tYW5kIHVuaXQgdG8gYWNjZXB0IGEgY29tbWFuZC4KKyAgIFR5cGljYWxseSB0aGlzIHRha2VzIDAgdGlja3MuICovCitzdGF0aWMgaW5saW5lIHZvaWQgd2FpdF9mb3JfY21kX2RvbmUoaW50IGNtZF9pb2FkZHIpCit7CisgIHNob3J0IHdhaXQgPSAxMDA7CisgIGRvICAgOworICB3aGlsZShpbmIoY21kX2lvYWRkcikgJiYgLS13YWl0ID49IDApOworfQorCisvKiBFbGVtZW50cyBvZiB0aGUgZHVtcF9zdGF0aXN0aWNzIGJsb2NrLiBUaGlzIGJsb2NrIG11c3QgYmUgbHdvcmQgYWxpZ25lZC4gKi8KK3N0YXRpYyBzdHJ1Y3Qgc3BlZWRvX3N0YXRzIHsKKyAgICAgICAgdTMyIHR4X2dvb2RfZnJhbWVzOworICAgICAgICB1MzIgdHhfY29sbDE2X2VycnM7CisgICAgICAgIHUzMiB0eF9sYXRlX2NvbGxzOworICAgICAgICB1MzIgdHhfdW5kZXJydW5zOworICAgICAgICB1MzIgdHhfbG9zdF9jYXJyaWVyOworICAgICAgICB1MzIgdHhfZGVmZXJyZWQ7CisgICAgICAgIHUzMiB0eF9vbmVfY29sbHM7CisgICAgICAgIHUzMiB0eF9tdWx0aV9jb2xsczsKKyAgICAgICAgdTMyIHR4X3RvdGFsX2NvbGxzOworICAgICAgICB1MzIgcnhfZ29vZF9mcmFtZXM7CisgICAgICAgIHUzMiByeF9jcmNfZXJyczsKKyAgICAgICAgdTMyIHJ4X2FsaWduX2VycnM7CisgICAgICAgIHUzMiByeF9yZXNvdXJjZV9lcnJzOworICAgICAgICB1MzIgcnhfb3ZlcnJ1bl9lcnJzOworICAgICAgICB1MzIgcnhfY29sbHNfZXJyczsKKyAgICAgICAgdTMyIHJ4X3J1bnRfZXJyczsKKyAgICAgICAgdTMyIGRvbmVfbWFya2VyOworfSBsc3RhdHM7CisKKy8qIEEgc3BlZWRvMyBUWCBidWZmZXIgZGVzY3JpcHRvciB3aXRoIHR3byBidWZmZXJzLi4uICovCitzdGF0aWMgc3RydWN0IFR4RkQgeworICB2b2xhdGlsZSBzMTYgc3RhdHVzOworICBzMTYgY29tbWFuZDsKKyAgdTMyIGxpbms7ICAgICAgICAgIC8qIHZvaWQgKiAqLworICB1MzIgdHhfZGVzY19hZGRyOyAgLyogKGFsbW9zdCkgQWx3YXlzIHBvaW50cyB0byB0aGUgdHhfYnVmX2FkZHIgZWxlbWVudC4gKi8KKyAgczMyIGNvdW50OyAgICAgICAgIC8qICMgb2YgVEJEICg9MiksIFR4IHN0YXJ0IHRocmVzaC4sIGV0Yy4gKi8KKyAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgY29uc3RpdHV0ZXMgdHdvICJUQkQiIGVudHJpZXM6IGhkciBhbmQgZGF0YSAqLworICB1MzIgdHhfYnVmX2FkZHIwOyAgLyogdm9pZCAqLCBoZWFkZXIgb2YgZnJhbWUgdG8gYmUgdHJhbnNtaXR0ZWQuICAqLworICBzMzIgdHhfYnVmX3NpemUwOyAgLyogTGVuZ3RoIG9mIFR4IGhkci4gKi8KKyAgdTMyIHR4X2J1Zl9hZGRyMTsgIC8qIHZvaWQgKiwgZGF0YSB0byBiZSB0cmFuc21pdHRlZC4gICovCisgIHMzMiB0eF9idWZfc2l6ZTE7ICAvKiBMZW5ndGggb2YgVHggZGF0YS4gKi8KK30gdHhmZDsKKworc3RydWN0IFJ4RkQgeyAgICAgICAgICAgICAgIC8qIFJlY2VpdmUgZnJhbWUgZGVzY3JpcHRvci4gKi8KKyAgdm9sYXRpbGUgczE2IHN0YXR1czsKKyAgczE2IGNvbW1hbmQ7CisgIHUzMiBsaW5rOyAgICAgICAgICAgICAgICAgLyogc3RydWN0IFJ4RkQgKiAqLworICB1MzIgcnhfYnVmX2FkZHI7ICAgICAgICAgIC8qIHZvaWQgKiAqLworICB1MTYgY291bnQ7CisgIHUxNiBzaXplOworICBjaGFyIHBhY2tldFsxNTE4XTsKK307CisKKyNpZmRlZglVU0VfTE9XTUVNX0JVRkZFUgorI2RlZmluZSByeGZkICgoc3RydWN0IFJ4RkQgKikoMHgxMDAwMCAtIHNpemVvZihzdHJ1Y3QgUnhGRCkpKQorI2RlZmluZSBBQ0NFU1MoeCkgeC0+CisjZWxzZQorc3RhdGljIHN0cnVjdCBSeEZEIHJ4ZmQ7CisjZGVmaW5lIEFDQ0VTUyh4KSB4LgorI2VuZGlmCisKK3N0YXRpYyBpbnQgY29uZ2VuYiA9IDA7ICAgICAgICAgLyogRW5hYmxlIGNvbmdlc3Rpb24gY29udHJvbCBpbiB0aGUgRFA4Mzg0MC4gKi8KK3N0YXRpYyBpbnQgdHhmaWZvID0gODsgICAgICAgICAgLyogVHggRklGTyB0aHJlc2hvbGQgaW4gNCBieXRlIHVuaXRzLCAwLTE1ICovCitzdGF0aWMgaW50IHJ4ZmlmbyA9IDg7ICAgICAgICAgIC8qIFJ4IEZJRk8gdGhyZXNob2xkLCBkZWZhdWx0IDMyIGJ5dGVzLiAqLworc3RhdGljIGludCB0eGRtYWNvdW50ID0gMDsgICAgICAvKiBUeCBETUEgYnVyc3QgbGVuZ3RoLCAwLTEyNywgZGVmYXVsdCAwLiAqLworc3RhdGljIGludCByeGRtYWNvdW50ID0gMDsgICAgICAvKiBSeCBETUEgbGVuZ3RoLCAwIG1lYW5zIG5vIHByZWVtcHRpb24uICovCisKKy8qIEkgZG9uJ3QgdW5kZXJzdGFuZCBhIGJ5dGUgaW4gdGhpcyBzdHJ1Y3R1cmUuIEl0IHdhcyBjb3BpZWQgZnJvbSB0aGUKKyAqIExpbnV4IGtlcm5lbCBpbml0aWFsaXphdGlvbiBmb3IgdGhlIGVlcHJvMTAwLiAtLSBSRVcgKi8KK3N0YXRpYyBzdHJ1Y3QgQ29uZkNtZCB7CisgIHMxNiBzdGF0dXM7CisgIHMxNiBjb21tYW5kOworICB1MzIgbGluazsKKyAgdW5zaWduZWQgY2hhciBkYXRhWzIyXTsKK30gY29uZmNtZCA9IHsKKyAgMCwgQ21kQ29uZmlndXJlLAorICAodTMyKSAmIHR4ZmQsCisgIHsyMiwgMHgwOCwgMCwgMCwgIDAsIDB4ODAsIDB4MzIsIDB4MDMsICAxLCAvKiAxPVVzZSBNSUkgIDA9VXNlIEFVSSAqLworICAgMCwgMHgyRSwgMCwgIDB4NjAsIDAsCisgICAweGYyLCAweDQ4LCAgIDAsIDB4NDAsIDB4ZjIsIDB4ODAsICAgICAgICAvKiAweDQwPUZvcmNlIGZ1bGwtZHVwbGV4ICovCisgICAweDNmLCAweDA1LCB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxseSB1c2VkIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFN1cHBvcnQgZnVuY3Rpb246IG1kaW9fd3JpdGUKKyAqCisgKiBUaGlzIHByb2JhYmx5IHdyaXRlcyB0byB0aGUgInBoeXNpY2FsIG1lZGlhIGludGVyZmFjZSBjaGlwIi4KKyAqIC0tIFJFVworICovCisKK3N0YXRpYyBpbnQgbWRpb193cml0ZShpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKK3sKKyAgaW50IHZhbCwgYm9ndXNjbnQgPSA2NCo0OyAgICAgICAgIC8qIDw2NCB1c2VjLiB0byBjb21wbGV0ZSwgdHlwIDI3IHRpY2tzICovCisKKyAgb3V0bCgweDA0MDAwMDAwIHwgKGxvY2F0aW9uPDwxNikgfCAocGh5X2lkPDwyMSkgfCB2YWx1ZSwKKyAgICAgICBpb2FkZHIgKyBTQ0JDdHJsTURJKTsKKyAgZG8geworICAgIHVkZWxheSgxNik7CisKKyAgICB2YWwgPSBpbmwoaW9hZGRyICsgU0NCQ3RybE1ESSk7CisgICAgaWYgKC0tYm9ndXNjbnQgPCAwKSB7CisgICAgICBwcmludGYoIiBtZGlvX3dyaXRlKCkgdGltZWQgb3V0IHdpdGggdmFsID0gJVguXG4iLCB2YWwpOworICAgIH0KKyAgfSB3aGlsZSAoISAodmFsICYgMHgxMDAwMDAwMCkpOworICByZXR1cm4gdmFsICYgMHhmZmZmOworfQorCisvKiBTdXBwb3J0IGZ1bmN0aW9uOiBtZGlvX3JlYWQKKyAqCisgKiBUaGlzIHByb2JhYmx5IHJlYWRzIGEgcmVnaXN0ZXIgaW4gdGhlICJwaHlzaWNhbCBtZWRpYSBpbnRlcmZhY2UgY2hpcCIuCisgKiAtLSBSRVcKKyAqLworc3RhdGljIGludCBtZGlvX3JlYWQoaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQoreworICBpbnQgdmFsLCBib2d1c2NudCA9IDY0KjQ7ICAgICAgICAgICAgICAgLyogPDY0IHVzZWMuIHRvIGNvbXBsZXRlLCB0eXAgMjcgdGlja3MgKi8KKyAgb3V0bCgweDA4MDAwMDAwIHwgKGxvY2F0aW9uPDwxNikgfCAocGh5X2lkPDwyMSksIGlvYWRkciArIFNDQkN0cmxNREkpOworICBkbyB7CisgICAgdWRlbGF5KDE2KTsKKworICAgIHZhbCA9IGlubChpb2FkZHIgKyBTQ0JDdHJsTURJKTsKKyAgICBpZiAoLS1ib2d1c2NudCA8IDApIHsKKyAgICAgIHByaW50ZiggIiBtZGlvX3JlYWQoKSB0aW1lZCBvdXQgd2l0aCB2YWwgPSAlWC5cbiIsIHZhbCk7CisgICAgfQorICB9IHdoaWxlICghICh2YWwgJiAweDEwMDAwMDAwKSk7CisgIHJldHVybiB2YWwgJiAweGZmZmY7Cit9CisKKy8qIFRoZSBmaXhlcyBmb3IgdGhlIGNvZGUgd2VyZSBraW5kbHkgcHJvdmlkZWQgYnkgRHJhZ2FuIFN0YW5jZXZpYworICAgPHZpc2l0b3JAdmFsaW51eC5jb20+IHRvIHN0cmljdGx5IGZvbGxvdyBJbnRlbCBzcGVjaWZpY2F0aW9ucyBvZiBFRVBST00KKyAgIGFjY2VzcyB0aW1pbmcuCisgICBUaGUgcHVibGljbHkgYXZhaWxhYmxlIHNoZWV0IDY0NDg2MzAyIChzZWMuIDMuMSkgc3BlY2lmaWVzIDF1cyBhY2Nlc3MKKyAgIGludGVydmFsIGZvciBzZXJpYWwgRUVQUk9NLiAgSG93ZXZlciwgaXQgbG9va3MgbGlrZSB0aGF0IHRoZXJlIGlzIGFuCisgICBhZGRpdGlvbmFsIHJlcXVpcmVtZW50IGRpY3RhdGluZyBsYXJnZXIgdWRlbGF5J3MgaW4gdGhlIGNvZGUgYmVsb3cuCisgICAyMDAwLzA1LzI0ICBTQVcgKi8KK3N0YXRpYyBpbnQgZG9fZWVwcm9tX2NtZChpbnQgY21kLCBpbnQgY21kX2xlbikKK3sKKwl1bnNpZ25lZCByZXR2YWwgPSAwOworCWxvbmcgZWVfYWRkciA9IGlvYWRkciArIFNDQmVlcHJvbTsKKworCW91dHcoRUVfRU5CLCBlZV9hZGRyKTsgdWRlbGF5KDIpOworCW91dHcoRUVfRU5CIHwgRUVfU0hJRlRfQ0xLLCBlZV9hZGRyKTsgdWRlbGF5KDIpOworCisJLyogU2hpZnQgdGhlIGNvbW1hbmQgYml0cyBvdXQuICovCisJZG8geworCQlzaG9ydCBkYXRhdmFsID0gKGNtZCAmICgxIDw8IGNtZF9sZW4pKSA/IEVFX1dSSVRFXzEgOiBFRV9XUklURV8wOworCQlvdXR3KGRhdGF2YWwsIGVlX2FkZHIpOyB1ZGVsYXkoMik7CisJCW91dHcoZGF0YXZhbCB8IEVFX1NISUZUX0NMSywgZWVfYWRkcik7IHVkZWxheSgyKTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW53KGVlX2FkZHIpICYgRUVfREFUQV9SRUFEKSA/IDEgOiAwKTsKKwl9IHdoaWxlICgtLWNtZF9sZW4gPj0gMCk7CisJb3V0dyhFRV9FTkIsIGVlX2FkZHIpOyB1ZGVsYXkoMik7CisKKwkvKiBUZXJtaW5hdGUgdGhlIEVFUFJPTSBhY2Nlc3MuICovCisJb3V0dyhFRV9FTkIgJiB+RUVfQ1MsIGVlX2FkZHIpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3aGVyZWFtaSAoY29uc3QgY2hhciAqc3RyKQoreworI2lmCTAKKyAgcHJpbnRmICgiJXNcbiIsIHN0cik7CisgIHNsZWVwICgyKTsKKyNlbmRpZgorfQorCisvKiBmdW5jdGlvbjogZWVwcm8xMDBfcmVzZXQKKyAqIHJlc2V0cyB0aGUgY2FyZC4gVGhpcyBpcyB1c2VkIHRvIGFsbG93IEV0aGVyYm9vdCB0byBwcm9iZSB0aGUgY2FyZCBhZ2FpbgorICogZnJvbSBhICJ2aXJnaW5hbCIgc3RhdGUuLi4uCisgKiBBcmd1bWVudHM6IG5vbmUKKyAqCisgKiByZXR1cm5zOiAgIHZvaWQuCisgKi8KKworc3RhdGljIHZvaWQgZWVwcm8xMDBfcmVzZXQoc3RydWN0IG5pYyAqbmljKQoreworICBvdXRsKDAsIGlvYWRkciArIFNDQlBvcnQpOworfQorCisvKiBmdW5jdGlvbjogZWVwcm8xMDBfdHJhbnNtaXQKKyAqIFRoaXMgdHJhbnNtaXRzIGEgcGFja2V0LgorICoKKyAqIEFyZ3VtZW50czogY2hhciBkWzZdOiAgICAgICAgICBkZXN0aW5hdGlvbiBldGhlcm5ldCBhZGRyZXNzLgorICogICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCB0OiAgIGV0aGVybmV0IHByb3RvY29sIHR5cGUuCisgKiAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHM6ICAgc2l6ZSBvZiB0aGUgZGF0YS1wYXJ0IG9mIHRoZSBwYWNrZXQuCisgKiAgICAgICAgICAgIGNoYXIgKnA6ICAgICAgICAgICAgdGhlIGRhdGEgZm9yIHRoZSBwYWNrZXQuCisgKiByZXR1cm5zOiAgIHZvaWQuCisgKi8KKworc3RhdGljIHZvaWQgZWVwcm8xMDBfdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkLCB1bnNpZ25lZCBpbnQgdCwgdW5zaWduZWQgaW50IHMsIGNvbnN0IGNoYXIgKnApCit7CisgIHN0cnVjdCBldGhfaGRyIHsKKyAgICB1bnNpZ25lZCBjaGFyIGRzdF9hZGRyW0VUSF9BTEVOXTsKKyAgICB1bnNpZ25lZCBjaGFyIHNyY19hZGRyW0VUSF9BTEVOXTsKKyAgICB1bnNpZ25lZCBzaG9ydCB0eXBlOworICB9IGhkcjsKKyAgdW5zaWduZWQgc2hvcnQgc3RhdHVzOworICBpbnQgdG87CisgIGludCBzMSwgczI7CisKKyAgc3RhdHVzID0gaW53KGlvYWRkciArIFNDQlN0YXR1cyk7CisgIC8qIEFja25vd2xlZGdlIGFsbCBvZiB0aGUgY3VycmVudCBpbnRlcnJ1cHQgc291cmNlcyBBU0FQLiAqLworICBvdXR3KHN0YXR1cyAmIDB4ZmMwMCwgaW9hZGRyICsgU0NCU3RhdHVzKTsKKworI2lmZGVmCURFQlVHCisgIHByaW50ZiAoInRyYW5zbWl0dGluZyB0eXBlICVoWCBwYWNrZXQgKCVkIGJ5dGVzKS4gc3RhdHVzID0gJWhYLCBjbWQ9JWhYXG4iLAorCSAgdCwgcywgc3RhdHVzLCBpbncgKGlvYWRkciArIFNDQkNtZCkpOworI2VuZGlmCisKKyAgbWVtY3B5ICgmaGRyLmRzdF9hZGRyLCBkLCBFVEhfQUxFTik7CisgIG1lbWNweSAoJmhkci5zcmNfYWRkciwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsKKworICBoZHIudHlwZSA9IGh0b25zICh0KTsKKworICB0eGZkLnN0YXR1cyA9IDA7CisgIHR4ZmQuY29tbWFuZCA9IENtZFN1c3BlbmQgfCBDbWRUeCB8IENtZFR4RmxleDsKKyAgdHhmZC5saW5rICAgPSB2aXJ0X3RvX2J1cyAoJnR4ZmQpOworICB0eGZkLmNvdW50ICAgPSAweDAyMjA4MDAwOworICB0eGZkLnR4X2Rlc2NfYWRkciA9ICh1MzIpJnR4ZmQudHhfYnVmX2FkZHIwOworCisgIHR4ZmQudHhfYnVmX2FkZHIwID0gdmlydF90b19idXMgKCZoZHIpOworICB0eGZkLnR4X2J1Zl9zaXplMCA9IHNpemVvZiAoaGRyKTsKKworICB0eGZkLnR4X2J1Zl9hZGRyMSA9IHZpcnRfdG9fYnVzIChwKTsKKyAgdHhmZC50eF9idWZfc2l6ZTEgPSBzOworCisjaWZkZWYJREVCVUcKKyAgcHJpbnRmICgidHhmZDogXG4iKTsKKyAgaGQgKCZ0eGZkLCBzaXplb2YgKHR4ZmQpKTsKKyNlbmRpZgorCisgIG91dGwodmlydF90b19idXMoJnR4ZmQpLCBpb2FkZHIgKyBTQ0JQb2ludGVyKTsKKyAgb3V0dyhJTlRfTUFTSyB8IENVX1NUQVJULCBpb2FkZHIgKyBTQ0JDbWQpOworICB3YWl0X2Zvcl9jbWRfZG9uZShpb2FkZHIgKyBTQ0JDbWQpOworCisgIHMxID0gaW53IChpb2FkZHIgKyBTQ0JTdGF0dXMpOworICBsb2FkX3RpbWVyMigxMCpUSUNLU19QRVJfTVMpOwkJLyogdGltZW91dCAxMCBtcyBmb3IgdHJhbnNtaXQgKi8KKyAgd2hpbGUgKCF0eGZkLnN0YXR1cyAmJiB0aW1lcjJfcnVubmluZygpKQorICAgIC8qIFdhaXQgKi87CisgIHMyID0gaW53IChpb2FkZHIgKyBTQ0JTdGF0dXMpOworCisjaWZkZWYJREVCVUcKKyAgcHJpbnRmICgiczEgPSAlaFgsIHMyID0gJWhYLlxuIiwgczEsIHMyKTsKKyNlbmRpZgorfQorCisvKiBmdW5jdGlvbjogZWVwcm8xMDBfcG9sbCAvIGV0aF9wb2xsCisgKiBUaGlzIHJlY2lldmVzIGEgcGFja2V0IGZyb20gdGhlIG5ldHdvcmsuCisgKgorICogQXJndW1lbnRzOiBub25lCisgKgorICogcmV0dXJuczogICAxIGlmIGEgcGFja2V0IHdhcyByZWNpZXZlZC4KKyAqICAgICAgICAgICAgMCBpZiBubyBwYWNldCB3YXMgcmVjaWV2ZWQuCisgKiBzaWRlIGVmZmVjdHM6CisgKiAgICAgICAgICAgIHJldHVybnMgdGhlIHBhY2tldCBpbiB0aGUgYXJyYXkgbmljLT5wYWNrZXQuCisgKiAgICAgICAgICAgIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IGluIG5pYy0+cGFja2V0bGVuLgorICovCisKK3N0YXRpYyBpbnQgZWVwcm8xMDBfcG9sbChzdHJ1Y3QgbmljICpuaWMpCit7CisgIGlmICghQUNDRVNTKHJ4ZmQpc3RhdHVzKQorICAgIHJldHVybiAwOworCisgIC8qIE9rLiBXZSBnb3QgYSBwYWNrZXQuIE5vdyByZXN0YXJ0IHRoZSByZWNpZXZlci4uLi4gKi8KKyAgQUNDRVNTKHJ4ZmQpc3RhdHVzID0gMDsKKyAgQUNDRVNTKHJ4ZmQpY29tbWFuZCA9IDB4YzAwMDsKKyAgb3V0bCh2aXJ0X3RvX2J1cygmKEFDQ0VTUyhyeGZkKXN0YXR1cykpLCBpb2FkZHIgKyBTQ0JQb2ludGVyKTsKKyAgb3V0dyhJTlRfTUFTSyB8IFJYX1NUQVJULCBpb2FkZHIgKyBTQ0JDbWQpOworICB3YWl0X2Zvcl9jbWRfZG9uZShpb2FkZHIgKyBTQ0JDbWQpOworCisjaWZkZWYJREVCVUcKKyAgcHJpbnRmICgiR290IGEgcGFja2V0OiBMZW4gPSAlZC5cbiIsIEFDQ0VTUyhyeGZkKWNvdW50ICYgMHgzZmZmKTsKKyNlbmRpZgorICBuaWMtPnBhY2tldGxlbiA9ICBBQ0NFU1MocnhmZCljb3VudCAmIDB4M2ZmZjsKKyAgbWVtY3B5IChuaWMtPnBhY2tldCwgQUNDRVNTKHJ4ZmQpcGFja2V0LCBuaWMtPnBhY2tldGxlbik7CisjaWZkZWYJREVCVUcKKyAgaGQgKG5pYy0+cGFja2V0LCAweDMwKTsKKyNlbmRpZgorICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZWVwcm8xMDBfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpCit7CisgICAgLyogU2VlIGlmIHRoaXMgUGFydGlhbFJlc2V0IHNvbHZlcyB0aGUgcHJvYmxlbSB3aXRoIGludGVyZmVyaW5nIHdpdGgKKyAgICAgICBrZXJuZWwgb3BlcmF0aW9uIGFmdGVyIEV0aGVyYm9vdCBoYW5kcyBvdmVyLiAtIEtlbiAyMDAwMTEwMiAqLworICAgIG91dGwoMiwgaW9hZGRyICsgU0NCUG9ydCk7Cit9CisKKy8qIGV4cG9ydGVkIGZ1bmN0aW9uOiBlZXBybzEwMF9wcm9iZSAvIGV0aF9wcm9iZQorICogaW5pdGlhbGl6ZXMgYSBjYXJkCisgKgorICogc2lkZSBlZmZlY3RzOgorICogICAgICAgICAgICBsZWF2ZXMgdGhlIGlvYWRkcmVzcyBvZiB0aGUgODI1NTcgY2hpcCBpbiB0aGUgdmFyaWFibGUgaW9hZGRyLgorICogICAgICAgICAgICBsZWF2ZXMgdGhlIDgyNTU3IGluaXRpYWxpemVkLCBhbmQgcmVhZHkgdG8gcmVjaWV2ZSBwYWNrZXRzLgorICovCisKK3N0cnVjdCBuaWMgKmVlcHJvMTAwX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlYWRkcnMsIHN0cnVjdCBwY2lfZGV2aWNlICpwKQoreworCXVuc2lnbmVkIHNob3J0IHN1bSA9IDA7CisJaW50IGk7CisJaW50IHJlYWRfY21kLCBlZV9zaXplOworCXVuc2lnbmVkIHNob3J0IHZhbHVlOworCWludCBvcHRpb25zOworCWludCBwcm9taXNjOworCisJLyogd2UgY2FjaGUgb25seSB0aGUgZmlyc3QgZmV3IHdvcmRzIG9mIHRoZSBFRVBST00gZGF0YQorCSAgIGJlIGNhcmVmdWwgbm90IHRvIGFjY2VzcyBiZXlvbmQgdGhpcyBhcnJheSAqLworCXVuc2lnbmVkIHNob3J0IGVlcHJvbVsxNl07CisKKwlpZiAocHJvYmVhZGRycyA9PSAwIHx8IHByb2JlYWRkcnNbMF0gPT0gMCkKKwkJcmV0dXJuIDA7CisJaW9hZGRyID0gcHJvYmVhZGRyc1swXSAmIH4zOyAvKiBNYXNrIHRoZSBiaXQgdGhhdCBzYXlzICJ0aGlzIGlzIGFuIGlvIGFkZHIiICovCisKKwlhZGp1c3RfcGNpX2RldmljZShwKTsKKworCWlmICgoZG9fZWVwcm9tX2NtZChFRV9SRUFEX0NNRCA8PCAyNCwgMjcpICYgMHhmZmUwMDAwKQorCQk9PSAweGZmZTAwMDApIHsKKwkJZWVfc2l6ZSA9IDB4MTAwOworCQlyZWFkX2NtZCA9IEVFX1JFQURfQ01EIDw8IDI0OworCX0gZWxzZSB7CisJCWVlX3NpemUgPSAweDQwOworCQlyZWFkX2NtZCA9IEVFX1JFQURfQ01EIDw8IDIyOworCX0KKworCWZvciAoaSA9IDAsIHN1bSA9IDA7IGkgPCBlZV9zaXplOyBpKyspIHsKKwkJdW5zaWduZWQgc2hvcnQgdmFsdWUgPSBkb19lZXByb21fY21kKHJlYWRfY21kIHwgKGkgPDwgMTYpLCAyNyk7CisJCWlmIChpIDwgKGludCkoc2l6ZW9mKGVlcHJvbSkvc2l6ZW9mKGVlcHJvbVswXSkpKQorCQkJZWVwcm9tW2ldID0gdmFsdWU7CisJCXN1bSArPSB2YWx1ZTsKKwl9CisKKyAgZm9yIChpPTA7aTxFVEhfQUxFTjtpKyspIHsKKwluaWMtPm5vZGVfYWRkcltpXSA9ICAoZWVwcm9tW2kvMl0gPj4gKDgqKGkmMSkpKSAmIDB4ZmY7CisgIH0KKyAgcHJpbnRmICgiRXRoZXJuZXQgYWRkcjogJSFcbiIsIG5pYy0+bm9kZV9hZGRyKTsKKworICBpZiAoc3VtICE9IDB4QkFCQSkKKwlwcmludGYoImVlcHJvMTAwOiBJbnZhbGlkIEVFUFJPTSBjaGVja3N1bSAlI2hYLCAiCisJICAgICAgICJjaGVjayBzZXR0aW5ncyBiZWZvcmUgYWN0aXZhdGluZyB0aGlzIGRldmljZSFcbiIsIHN1bSk7CisgIG91dGwoMCwgaW9hZGRyICsgU0NCUG9ydCk7CisgIHVkZWxheSAoMTAwMDApOworCisgIHdoZXJlYW1pICgiR290IGVlcHJvbS4iKTsKKworICBvdXRsKHZpcnRfdG9fYnVzKCZsc3RhdHMpLCBpb2FkZHIgKyBTQ0JQb2ludGVyKTsKKyAgb3V0dyhJTlRfTUFTSyB8IENVX1NUQVRTQUREUiwgaW9hZGRyICsgU0NCQ21kKTsKKyAgd2FpdF9mb3JfY21kX2RvbmUoaW9hZGRyICsgU0NCQ21kKTsKKworICB3aGVyZWFtaSAoInNldCBzdGF0cyBhZGRyLiIpOworICAvKiBJTklUIFJYIHN0dWZmLiAqLworCisgIC8qIEJhc2UgPSAwICovCisgIG91dGwoMCwgaW9hZGRyICsgU0NCUG9pbnRlcik7CisgIG91dHcoSU5UX01BU0sgfCBSWF9BRERSX0xPQUQsIGlvYWRkciArIFNDQkNtZCk7CisgIHdhaXRfZm9yX2NtZF9kb25lKGlvYWRkciArIFNDQkNtZCk7CisKKyAgd2hlcmVhbWkgKCJzZXQgcnggYmFzZSBhZGRyLiIpOworCisgIEFDQ0VTUyhyeGZkKXN0YXR1cyAgPSAweDAwMDE7CisgIEFDQ0VTUyhyeGZkKWNvbW1hbmQgPSAweDAwMDA7CisgIEFDQ0VTUyhyeGZkKWxpbmsgICAgPSB2aXJ0X3RvX2J1cygmKEFDQ0VTUyhyeGZkKXN0YXR1cykpOworICBBQ0NFU1MocnhmZClyeF9idWZfYWRkciA9IChpbnQpICZuaWMtPnBhY2tldDsKKyAgQUNDRVNTKHJ4ZmQpY291bnQgICA9IDA7CisgIEFDQ0VTUyhyeGZkKXNpemUgICAgPSAxNTI4OworCisgIG91dGwodmlydF90b19idXMoJihBQ0NFU1MocnhmZClzdGF0dXMpKSwgaW9hZGRyICsgU0NCUG9pbnRlcik7CisgIG91dHcoSU5UX01BU0sgfCBSWF9TVEFSVCwgaW9hZGRyICsgU0NCQ21kKTsKKyAgd2FpdF9mb3JfY21kX2RvbmUoaW9hZGRyICsgU0NCQ21kKTsKKworICB3aGVyZWFtaSAoInN0YXJ0ZWQgUlggcHJvY2Vzcy4iKTsKKworICAvKiBTdGFydCB0aGUgcmVjaWV2ZXIuLi4uICovCisgIEFDQ0VTUyhyeGZkKXN0YXR1cyA9IDA7CisgIEFDQ0VTUyhyeGZkKWNvbW1hbmQgPSAweGMwMDA7CisgIG91dGwodmlydF90b19idXMoJihBQ0NFU1MocnhmZClzdGF0dXMpKSwgaW9hZGRyICsgU0NCUG9pbnRlcik7CisgIG91dHcoSU5UX01BU0sgfCBSWF9TVEFSVCwgaW9hZGRyICsgU0NCQ21kKTsKKworICAvKiBJTklUIFRYIHN0dWZmLiAqLworCisgIC8qIEJhc2UgPSAwICovCisgIG91dGwoMCwgaW9hZGRyICsgU0NCUG9pbnRlcik7CisgIG91dHcoSU5UX01BU0sgfCBDVV9DTURfQkFTRSwgaW9hZGRyICsgU0NCQ21kKTsKKyAgd2FpdF9mb3JfY21kX2RvbmUoaW9hZGRyICsgU0NCQ21kKTsKKworICB3aGVyZWFtaSAoInNldCBUWCBiYXNlIGFkZHIuIik7CisKKyAgdHhmZC5jb21tYW5kICAgICAgPSAoQ21kSUFTZXR1cCk7CisgIHR4ZmQuc3RhdHVzICAgICAgID0gMHgwMDAwOworICB0eGZkLmxpbmsgICAgICAgICA9IHZpcnRfdG9fYnVzICgmY29uZmNtZCk7CisKKyAgeworCWNoYXIgKnQgPSAoY2hhciAqKSZ0eGZkLnR4X2Rlc2NfYWRkcjsKKworCWZvciAoaT0wO2k8RVRIX0FMRU47aSsrKQorCQl0W2ldID0gbmljLT5ub2RlX2FkZHJbaV07CisgIH0KKworI2lmZGVmCURFQlVHCisgIHByaW50ZiAoIlNldHVwX2VhZGRyOlxuIik7CisgIGhkICgmdHhmZCwgMHgyMCk7CisjZW5kaWYKKyAgLyogICAgICBvcHRpb25zID0gMHg0MDsgKi8gLyogMTBtYnBzIGhhbGYgZHVwbGV4Li4uICovCisgIG9wdGlvbnMgPSAweDAwOyAgICAgICAgICAgIC8qIEF1dG9zZW5zZSAqLworCisgIHByb21pc2MgPSAwOworCisgIGlmICggICAoKGVlcHJvbVs2XT4+OCkgJiAweDNmKSA9PSBEUDgzODQwCisJICB8fCAoKGVlcHJvbVs2XT4+OCkgJiAweDNmKSA9PSBEUDgzODQwQSkgeworCWludCBtZGlfcmVnMjMgPSBtZGlvX3JlYWQoZWVwcm9tWzZdICYgMHgxZiwgMjMpIHwgMHgwNDIyOworCWlmIChjb25nZW5iKQorCSAgbWRpX3JlZzIzIHw9IDB4MDEwMDsKKwlwcmludGYoIiAgRFA4Mzg0MCBzcGVjaWZpYyBzZXR1cCwgc2V0dGluZyByZWdpc3RlciAyMyB0byAlaFguXG4iLAorCSAgICAgICBtZGlfcmVnMjMpOworCW1kaW9fd3JpdGUoZWVwcm9tWzZdICYgMHgxZiwgMjMsIG1kaV9yZWcyMyk7CisgIH0KKyAgd2hlcmVhbWkgKCJEb25lIERQODM0MCBzcGVjaWFsIHNldHVwLiIpOworICBpZiAob3B0aW9ucyAhPSAwKSB7CisJbWRpb193cml0ZShlZXByb21bNl0gJiAweDFmLCAwLAorCQkgICAoKG9wdGlvbnMgJiAweDIwKSA/IDB4MjAwMCA6IDApIHwgICAgLyogMTAwbWJwcz8gKi8KKwkJICAgKChvcHRpb25zICYgMHgxMCkgPyAweDAxMDAgOiAwKSk7IC8qIEZ1bGwgZHVwbGV4PyAqLworCXdoZXJlYW1pICgic2V0IG1kaW9fcmVnaXN0ZXIuIik7CisgIH0KKworICBjb25mY21kLmNvbW1hbmQgID0gQ21kU3VzcGVuZCB8IENtZENvbmZpZ3VyZTsKKyAgY29uZmNtZC5zdGF0dXMgICA9IDB4MDAwMDsKKyAgY29uZmNtZC5saW5rICAgICA9IHZpcnRfdG9fYnVzICgmdHhmZCk7CisgIGNvbmZjbWQuZGF0YVsxXSAgPSAodHhmaWZvIDw8IDQpIHwgcnhmaWZvOworICBjb25mY21kLmRhdGFbNF0gID0gcnhkbWFjb3VudDsKKyAgY29uZmNtZC5kYXRhWzVdICA9IHR4ZG1hY291bnQgKyAweDgwOworICBjb25mY21kLmRhdGFbMTVdID0gcHJvbWlzYyA/IDB4NDk6IDB4NDg7CisgIGNvbmZjbWQuZGF0YVsxOV0gPSAob3B0aW9ucyAmIDB4MTApID8gMHhDMCA6IDB4ODA7CisgIGNvbmZjbWQuZGF0YVsyMV0gPSBwcm9taXNjID8gMHgwRDogMHgwNTsKKworICBvdXRsKHZpcnRfdG9fYnVzKCZ0eGZkKSwgaW9hZGRyICsgU0NCUG9pbnRlcik7CisgIG91dHcoSU5UX01BU0sgfCBDVV9TVEFSVCwgaW9hZGRyICsgU0NCQ21kKTsKKyAgd2FpdF9mb3JfY21kX2RvbmUoaW9hZGRyICsgU0NCQ21kKTsKKworICB3aGVyZWFtaSAoInN0YXJ0ZWQgVFggdGhpbmd5IChjb25maWcsIGlhc2V0dXApLiIpOworCisgIGxvYWRfdGltZXIyKDEwKlRJQ0tTX1BFUl9NUyk7CisgIHdoaWxlICghdHhmZC5zdGF0dXMgJiYgdGltZXIyX3J1bm5pbmcoKSkKKwkvKiBXYWl0ICovOworCisgIG5pYy0+cmVzZXQgPSBlZXBybzEwMF9yZXNldDsKKyAgbmljLT5wb2xsID0gZWVwcm8xMDBfcG9sbDsKKyAgbmljLT50cmFuc21pdCA9IGVlcHJvMTAwX3RyYW5zbWl0OworICBuaWMtPmRpc2FibGUgPSBlZXBybzEwMF9kaXNhYmxlOworICByZXR1cm4gbmljOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYJREVCVUcKKworLyogSGV4ZHVtcCBhIG51bWJlciBvZiBieXRlcyBmcm9tIG1lbW9yeS4uLiAqLwordm9pZCBoZCAodm9pZCAqd2hlcmUsIGludCBuKQoreworICBpbnQgaTsKKworICB3aGlsZSAobiA+IDApIHsKKyAgICBwcmludGYgKCIlWCAiLCB3aGVyZSk7CisgICAgZm9yIChpPTA7aSA8ICggKG4+MTYpPzE2Om4pO2krKykKKyAgICAgIHByaW50ZiAoIiAlaGhYIiwgKChjaGFyICopd2hlcmUpW2ldKTsKKyAgICBwcmludGYgKCJcbiIpOworICAgIG4gLT0gMTY7CisgICAgd2hlcmUgKz0gMTY7CisgIH0KK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9uZXRib290L2VwaWMxMDAuYyBiL25ldGJvb3QvZXBpYzEwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YzNmZDIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L2VwaWMxMDAuYwpAQCAtMCwwICsxLDQ4MSBAQAorLyogZXBpYzEwMC5jOiBBIFNNQyA4M2MxNzAgRVBJQy8xMDAgZmFzdCBldGhlcm5ldCBkcml2ZXIgZm9yIEV0aGVyYm9vdCAqLworCisjZGVmaW5lIExJTlVYX09VVF9NQUNST1MKKworI2luY2x1ZGUgImV0aGVyYm9vdC5oIgorI2luY2x1ZGUgIm5pYy5oIgorI2luY2x1ZGUgImNhcmRzLmgiCisjaW5jbHVkZSAidGltZXIuaCIKKyNpbmNsdWRlICJlcGljMTAwLmgiCisKKyN1bmRlZgl2aXJ0X3RvX2J1cworI2RlZmluZQl2aXJ0X3RvX2J1cyh4KQkoKHVuc2lnbmVkIGxvbmcpeCkKKworI2RlZmluZSBUWF9SSU5HX1NJWkUJMgkvKiB1c2UgYXQgbGVhc3QgMiBidWZmZXJzIGZvciBUWCAqLworI2RlZmluZSBSWF9SSU5HX1NJWkUJMgorCisjZGVmaW5lIFBLVF9CVUZfU1oJMTUzNgkvKiBTaXplIG9mIGVhY2ggdGVtcG9yYXJ5IFR4L1J4IGJ1ZmZlci4qLworCisvKgorI2RlZmluZSBERUJVR19SWAorI2RlZmluZSBERUJVR19UWAorI2RlZmluZSBERUJVR19FRVBST00KKyovCisKKyNkZWZpbmUgRVBJQ19ERUJVRyAwCS8qIGRlYnVnIGxldmVsICovCisKKy8qIFRoZSBFUElDMTAwIFJ4IGFuZCBUeCBidWZmZXIgZGVzY3JpcHRvcnMuICovCitzdHJ1Y3QgZXBpY19yeF9kZXNjIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisgICAgdW5zaWduZWQgc2hvcnQgcnhsZW5ndGg7CisgICAgdW5zaWduZWQgbG9uZyAgYnVmYWRkcjsKKyAgICB1bnNpZ25lZCBzaG9ydCBidWZsZW5ndGg7CisgICAgdW5zaWduZWQgc2hvcnQgY29udHJvbDsKKyAgICB1bnNpZ25lZCBsb25nICBuZXh0OworfTsKKworLyogZGVzY3JpcHRpb24gb2YgdGhlIHR4IGRlc2NyaXB0b3JzIGNvbnRyb2wgYml0cyBjb21tb25seSB1c2VkICovCisjZGVmaW5lIFREX1NUREZMQUdTCVREX0xBU1RERVNDCisKK3N0cnVjdCBlcGljX3R4X2Rlc2MgeworICAgIHVuc2lnbmVkIHNob3J0IHN0YXR1czsKKyAgICB1bnNpZ25lZCBzaG9ydCB0eGxlbmd0aDsKKyAgICB1bnNpZ25lZCBsb25nICBidWZhZGRyOworICAgIHVuc2lnbmVkIHNob3J0IGJ1Zmxlbmd0aDsKKyAgICB1bnNpZ25lZCBzaG9ydCBjb250cm9sOworICAgIHVuc2lnbmVkIGxvbmcgIG5leHQ7Cit9OworCisjZGVmaW5lIGRlbGF5KG5hbm9zZWMpICAgZG8geyBpbnQgX2kgPSAzOyB3aGlsZSAoLS1faSA+IDApIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IF9fU0xPV19ET1dOX0lPOyB9fSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQJZXBpYzEwMF9vcGVuKHZvaWQpOworc3RhdGljIHZvaWQJZXBpYzEwMF9pbml0X3Jpbmcodm9pZCk7CitzdGF0aWMgdm9pZAllcGljMTAwX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyBpbnQJZXBpYzEwMF9wb2xsKHN0cnVjdCBuaWMgKm5pYyk7CitzdGF0aWMgdm9pZAllcGljMTAwX3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYywgY29uc3QgY2hhciAqZGVzdGFkZHIsCisJCQkJIHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgbGVuLCBjb25zdCBjaGFyICpkYXRhKTsKK3N0YXRpYyBpbnQJcmVhZF9lZXByb20oaW50IGxvY2F0aW9uKTsKK3N0YXRpYyBpbnQJbWlpX3JlYWQoaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKKworc3RhdGljIGludAlpb2FkZHI7CisKK3N0YXRpYyBpbnQJY29tbWFuZDsKK3N0YXRpYyBpbnQJaW50c3RhdDsKK3N0YXRpYyBpbnQJaW50bWFzazsKK3N0YXRpYyBpbnQJZ2VuY3RsIDsKK3N0YXRpYyBpbnQJZWVjdGwgIDsKK3N0YXRpYyBpbnQJdGVzdCAgIDsKK3N0YXRpYyBpbnQJbW1jdGwgIDsKK3N0YXRpYyBpbnQJbW1kYXRhIDsKK3N0YXRpYyBpbnQJbGFuMCAgIDsKK3N0YXRpYyBpbnQJcnhjb24gIDsKK3N0YXRpYyBpbnQJdHhjb24gIDsKK3N0YXRpYyBpbnQJcHJjZGFyIDsKK3N0YXRpYyBpbnQJcHRjZGFyIDsKK3N0YXRpYyBpbnQJZXRodGhyIDsKKworc3RhdGljIHVuc2lnbmVkIGludAljdXJfcngsIGN1cl90eDsJCS8qIFRoZSBuZXh0IGZyZWUgcmluZyBlbnRyeSAqLworI2lmZGVmCURFQlVHX0VFUFJPTQorc3RhdGljIHVuc2lnbmVkIHNob3J0CWVlcHJvbVs2NF07CisjZW5kaWYKK3N0YXRpYyBzaWduZWQgY2hhcglwaHlzWzRdOwkJLyogTUlJIGRldmljZSBhZGRyZXNzZXMuICovCitzdGF0aWMgc3RydWN0IGVwaWNfcnhfZGVzYwlyeF9yaW5nW1JYX1JJTkdfU0laRV07CitzdGF0aWMgc3RydWN0IGVwaWNfdHhfZGVzYwl0eF9yaW5nW1RYX1JJTkdfU0laRV07CisjaWZkZWYJVVNFX0xPV01FTV9CVUZGRVIKKyNkZWZpbmUgcnhfcGFja2V0ICgoY2hhciAqKTB4MTAwMDAgLSBQS1RfQlVGX1NaICogUlhfUklOR19TSVpFKQorI2RlZmluZSB0eF9wYWNrZXQgKChjaGFyICopMHgxMDAwMCAtIFBLVF9CVUZfU1ogKiBSWF9SSU5HX1NJWkUgLSBQS1RfQlVGX1NaICogVFhfUklOR19TSVpFKQorI2Vsc2UKK3N0YXRpYyBjaGFyCQlyeF9wYWNrZXRbUEtUX0JVRl9TWiAqIFJYX1JJTkdfU0laRV07CitzdGF0aWMgY2hhcgkJdHhfcGFja2V0W1BLVF9CVUZfU1ogKiBUWF9SSU5HX1NJWkVdOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbGx5IHZpc2libGUgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIHN0YXRpYyB2b2lkCitlcGljMTAwX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKK3sKKyAgICAvKiBTb2Z0IHJlc2V0IHRoZSBjaGlwLiAqLworICAgIG91dGwoR0NfU09GVF9SRVNFVCwgZ2VuY3RsKTsKK30KKworICAgIHN0cnVjdCBuaWMqCitlcGljMTAwX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlYWRkcnMpCit7CisgICAgdW5zaWduZWQgc2hvcnQgc3VtID0gMDsKKyAgICB1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBzaG9ydCogYXA7CisgICAgdW5zaWduZWQgaW50IHBoeSwgcGh5X2lkeDsKKworICAgIGlmIChwcm9iZWFkZHJzID09IDAgfHwgcHJvYmVhZGRyc1swXSA9PSAwKQorCXJldHVybiAwOworCisgICAgLyogSWRlYWxseSB3ZSB3b3VsZCBkZXRlY3QgYWxsIG5ldHdvcmsgY2FyZHMgaW4gc2xvdCBvcmRlci4gIFRoYXQgd291bGQKKyAgICAgICBiZSBiZXN0IGRvbmUgYSBjZW50cmFsIFBDSSBwcm9iZSBkaXNwYXRjaCwgd2hpY2ggd291bGRuJ3Qgd29yaworICAgICAgIHdlbGwgd2l0aCB0aGUgY3VycmVudCBzdHJ1Y3R1cmUuICBTbyBpbnN0ZWFkIHdlIGRldGVjdCBqdXN0IHRoZQorICAgICAgIEVwaWMgY2FyZHMgaW4gc2xvdCBvcmRlci4gKi8KKworICAgIGlvYWRkciA9IHByb2JlYWRkcnNbMF0gJiB+MzsgLyogTWFzayB0aGUgYml0IHRoYXQgc2F5cyAidGhpcyBpcyBhbiBpbyBhZGRyIiAqLworCisgICAgLyogY29tcHV0ZSBhbGwgdXNlZCBzdGF0aWMgZXBpYzEwMCByZWdpc3RlcnMgYWRkcmVzcyAqLworICAgIGNvbW1hbmQgPSBpb2FkZHIgKyBDT01NQU5EOwkJLyogQ29udHJvbCBSZWdpc3RlciAqLworICAgIGludHN0YXQgPSBpb2FkZHIgKyBJTlRTVEFUOwkJLyogSW50ZXJydXB0IFN0YXR1cyAqLworICAgIGludG1hc2sgPSBpb2FkZHIgKyBJTlRNQVNLOwkJLyogSW50ZXJydXB0IE1hc2sgKi8KKyAgICBnZW5jdGwgID0gaW9hZGRyICsgR0VOQ1RMOwkJLyogR2VuZXJhbCBDb250cm9sICovCisgICAgZWVjdGwgICA9IGlvYWRkciArIEVFQ1RMOwkJLyogRUVQUk9NIENvbnRyb2wgICovCisgICAgdGVzdCAgICA9IGlvYWRkciArIFRFU1Q7CQkvKiBUZXN0IHJlZ2lzdGVyIChjbG9ja3MpICovCisgICAgbW1jdGwgICA9IGlvYWRkciArIE1NQ1RMOwkJLyogTUlJIE1hbmFnZW1lbnQgSW50ZXJmYWNlIENvbnRyb2wgKi8KKyAgICBtbWRhdGEgID0gaW9hZGRyICsgTU1EQVRBOwkJLyogTUlJIE1hbmFnZW1lbnQgSW50ZXJmYWNlIERhdGEgKi8KKyAgICBsYW4wICAgID0gaW9hZGRyICsgTEFOMDsJCS8qIE1BQyBhZGRyZXNzLiAoMHg0MC0weDQ4KSAqLworICAgIHJ4Y29uICAgPSBpb2FkZHIgKyBSWENPTjsJCS8qIFJlY2VpdmUgQ29udHJvbCAqLworICAgIHR4Y29uICAgPSBpb2FkZHIgKyBUWENPTjsJCS8qIFRyYW5zbWl0IENvbnRyb2wgKi8KKyAgICBwcmNkYXIgID0gaW9hZGRyICsgUFJDREFSOwkJLyogUENJIFJlY2VpdmUgQ3VycmVudCBEZXNjciBBZGRyZXNzICovCisgICAgcHRjZGFyICA9IGlvYWRkciArIFBUQ0RBUjsJCS8qIFBDSSBUcmFuc21pdCBDdXJyZW50IERlc2NyIEFkZHJlc3MgKi8KKyAgICBldGh0aHIgID0gaW9hZGRyICsgRVRIVEhSOwkJLyogRWFybHkgVHJhbnNtaXQgVGhyZXNob2xkICovCisKKyAgICAvKiBSZXNldCB0aGUgY2hpcCAmIGJyaW5nIGl0IG91dCBvZiBsb3ctcG93ZXIgbW9kZS4gKi8KKyAgICBvdXRsKEdDX1NPRlRfUkVTRVQsIGdlbmN0bCk7CisKKyAgICAvKiBEaXNhYmxlIEFMTCBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworICAgIG91dGwoSU5UUl9ESVNBQkxFLCBpbnRtYXNrKTsKKworICAgIC8qCisgICAgICogc2V0IHRoZSBpbnRlcm5hbCBjbG9ja3M6CisgICAgICogQXBwbGljYXRpb24gTm90ZSA3LjE1IHNheXM6CisgICAgICogICAgSW4gb3JkZXIgdG8gc2V0IHRoZSBDTE9DSyBURVNUIGJpdCBpbiB0aGUgVEVTVCByZWdpc3RlciwKKyAgICAgKgkgIHBlcmZvcm0gdGhlIGZvbGxvd2luZzoKKyAgICAgKgorICAgICAqICAgICAgICBXcml0ZSAweDAwMDggdG8gdGhlIHRlc3QgcmVnaXN0ZXIgYXQgbGVhc3Qgc2l4dGVlbgorICAgICAqICAgICAgICBjb25zZWN1dGl2ZSB0aW1lcy4KKyAgICAgKgorICAgICAqIFRoZSBDTE9DSyBURVNUIGJpdCBpcyBXcml0ZS1Pbmx5LiBXcml0aW5nIGl0IHNldmVyYWwgdGltZXMKKyAgICAgKiBjb25zZWN1dGl2ZWx5IGluc3VyZXMgYSBzdWNjZXNzZnVsIHdyaXRlIHRvIHRoZSBiaXQuLi4KKyAgICAgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJb3V0bCgweDAwMDAwMDA4LCB0ZXN0KTsKKyAgICB9CisKKyNpZmRlZglERUJVR19FRVBST00KKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworCXZhbHVlID0gcmVhZF9lZXByb20oaSk7CisJZWVwcm9tW2ldID0gdmFsdWU7CisJc3VtICs9IHZhbHVlOworICAgIH0KKworI2lmCShFUElDX0RFQlVHID4gMSkKKyAgICBwcmludGYoIkVFUFJPTSBjb250ZW50c1xuIik7CisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKwlwcmludGYoIiAlaGhYJXMiLCBlZXByb21baV0sIGkgJSAxNiA9PSAxNSA/ICJcbiIgOiAiIik7CisgICAgfQorI2VuZGlmCisjZW5kaWYKKworICAgIC8qIFRoaXMgY291bGQgYWxzbyBiZSByZWFkIGZyb20gdGhlIEVFUFJPTS4gKi8KKyAgICBhcCA9ICh1bnNpZ25lZCBzaG9ydCopbmljLT5ub2RlX2FkZHI7CisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkqYXArKyA9IGludyhsYW4wICsgaSo0KTsKKworICAgIHByaW50ZigiIEkvTyAlI2hYICUhICIsIGlvYWRkciwgbmljLT5ub2RlX2FkZHIpOworCisgICAgLyogRmluZCB0aGUgY29ubmVjdGVkIE1JSSB4Y3Zycy4gKi8KKyAgICBmb3IgKHBoeSA9IDAsIHBoeV9pZHggPSAwOyBwaHkgPCAzMiAmJiBwaHlfaWR4IDwgc2l6ZW9mKHBoeXMpOyBwaHkrKykgeworCWludCBtaWlfc3RhdHVzID0gbWlpX3JlYWQocGh5LCAwKTsKKworCWlmIChtaWlfc3RhdHVzICE9IDB4ZmZmZiAgJiYgbWlpX3N0YXR1cyAhPSAweDAwMDApIHsKKwkgICAgcGh5c1twaHlfaWR4KytdID0gcGh5OworI2lmCShFUElDX0RFQlVHID4gMSkKKwkgICAgcHJpbnRmKCJNSUkgdHJhbnNjZWl2ZXIgZm91bmQgYXQgYWRkcmVzcyAlZC5cbiIsIHBoeSk7CisjZW5kaWYKKwl9CisgICAgfQorICAgIGlmIChwaHlfaWR4ID09IDApIHsKKyNpZgkoRVBJQ19ERUJVRyA+IDEpCisJcHJpbnRmKCIqKipXQVJOSU5HKioqOiBObyBNSUkgdHJhbnNjZWl2ZXIgZm91bmQhXG4iKTsKKyNlbmRpZgorCS8qIFVzZSB0aGUga25vd24gUEhZIGFkZHJlc3Mgb2YgdGhlIEVQSUkuICovCisJcGh5c1swXSA9IDM7CisgICAgfQorCisgICAgZXBpYzEwMF9vcGVuKCk7CisKKyAgICBuaWMtPnJlc2V0ICAgID0gZXBpYzEwMF9yZXNldDsKKyAgICBuaWMtPnBvbGwgICAgID0gZXBpYzEwMF9wb2xsOworICAgIG5pYy0+dHJhbnNtaXQgPSBlcGljMTAwX3RyYW5zbWl0OworICAgIG5pYy0+ZGlzYWJsZSAgPSBlcGljMTAwX2Rpc2FibGU7CisKKyAgICByZXR1cm4gbmljOworfQorCisgICAgc3RhdGljIHZvaWQKK2VwaWMxMDBfb3Blbih2b2lkKQoreworICAgIGludCBtaWlfcmVnNTsKKyAgICBpbnQgZnVsbF9kdXBsZXggPSAwOworICAgIHVuc2lnbmVkIGxvbmcgdG1wOworCisgICAgZXBpYzEwMF9pbml0X3JpbmcoKTsKKworICAgIC8qIFB1bGwgdGhlIGNoaXAgb3V0IG9mIGxvdy1wb3dlciBtb2RlLCBhbmQgc2V0IGZvciBQQ0kgcmVhZCBtdWx0aXBsZS4gKi8KKyAgICBvdXRsKEdDX1JYX0ZJRk9fVEhSXzY0IHwgR0NfTVJDX1JFQURfTVVMVCB8IEdDX09ORV9DT1BZLCBnZW5jdGwpOworCisgICAgb3V0bChUWF9GSUZPX1RIUkVTSCwgZXRodGhyKTsKKworICAgIHRtcCA9IFRDX0VBUkxZX1RYX0VOQUJMRSB8IFRYX1NMT1RfVElNRTsKKworICAgIG1paV9yZWc1ID0gbWlpX3JlYWQocGh5c1swXSwgNSk7CisgICAgaWYgKG1paV9yZWc1ICE9IDB4ZmZmZiAmJiAobWlpX3JlZzUgJiAweDAxMDApKSB7CisJZnVsbF9kdXBsZXggPSAxOworCXByaW50ZigiIGZ1bGwtZHVwbGV4IG1vZGUiKTsKKwl0bXAgfD0gVENfTE1fRlVMTF9EUFg7CisgICAgfSBlbHNlCisJdG1wIHw9IFRDX0xNX05PUk1BTDsKKworICAgIG91dGwodG1wLCB0eGNvbik7CisKKyAgICAvKiBHaXZlIGFkcmVzcyBvZiBSWCBhbmQgVFggcmluZyB0byB0aGUgY2hpcCAqLworICAgIG91dGwodmlydF90b19idXMoJnJ4X3JpbmcpLCBwcmNkYXIpOworICAgIG91dGwodmlydF90b19idXMoJnR4X3JpbmcpLCBwdGNkYXIpOworCisgICAgLyogU3RhcnQgdGhlIGNoaXAncyBSeCBwcm9jZXNzOiByZWNlaXZlIHVuaWNhc3QgYW5kIGJyb2FkY2FzdCAqLworICAgIG91dGwoMHgwNCwgcnhjb24pOworICAgIG91dGwoQ1JfU1RBUlRfUlggfCBDUl9RVUVVRV9SWCwgY29tbWFuZCk7CisKKyAgICBwdXRjaGFyKCdcbicpOworfQorCisvKiBJbml0aWFsaXplIHRoZSBSeCBhbmQgVHggcmluZ3MuICovCisgICAgc3RhdGljIHZvaWQKK2VwaWMxMDBfaW5pdF9yaW5nKHZvaWQpCit7CisgICAgaW50IGk7CisgICAgY2hhciogcDsKKworICAgIGN1cl9yeCA9IGN1cl90eCA9IDA7CisKKyAgICBwID0gJnJ4X3BhY2tldFswXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwlyeF9yaW5nW2ldLnN0YXR1cyAgICA9IFJSSU5HX09XTjsJLyogT3duZWQgYnkgRXBpYyBjaGlwICovCisJcnhfcmluZ1tpXS5idWZsZW5ndGggPSBQS1RfQlVGX1NaOworCXJ4X3JpbmdbaV0uYnVmYWRkciAgID0gdmlydF90b19idXMocCArIChQS1RfQlVGX1NaICogaSkpOworCXJ4X3JpbmdbaV0uY29udHJvbCAgID0gMDsKKwlyeF9yaW5nW2ldLm5leHQgICAgICA9IHZpcnRfdG9fYnVzKCYocnhfcmluZ1tpICsgMV0pICk7CisgICAgfQorICAgIC8qIE1hcmsgdGhlIGxhc3QgZW50cnkgYXMgd3JhcHBpbmcgdGhlIHJpbmcuICovCisgICAgcnhfcmluZ1tpLTFdLm5leHQgPSB2aXJ0X3RvX2J1cygmcnhfcmluZ1swXSk7CisKKyAgICAvKgorICAgICAqVGhlIFR4IGJ1ZmZlciBkZXNjcmlwdG9yIGlzIGZpbGxlZCBpbiBhcyBuZWVkZWQsCisgICAgICogYnV0IHdlIGRvIG5lZWQgdG8gY2xlYXIgdGhlIG93bmVyc2hpcCBiaXQuCisgICAgICovCisgICAgcCA9ICZ0eF9wYWNrZXRbMF07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwl0eF9yaW5nW2ldLnN0YXR1cyAgPSAwOwkJCS8qIE93bmVkIGJ5IENQVSAqLworCXR4X3JpbmdbaV0uYnVmYWRkciA9IHZpcnRfdG9fYnVzKHAgKyAoUEtUX0JVRl9TWiAqIGkpKTsKKwl0eF9yaW5nW2ldLmNvbnRyb2wgPSBURF9TVERGTEFHUzsKKwl0eF9yaW5nW2ldLm5leHQgICAgPSB2aXJ0X3RvX2J1cygmKHR4X3JpbmdbaSArIDFdKSApOworICAgIH0KKyAgICB0eF9yaW5nW2ktMV0ubmV4dCA9IHZpcnRfdG9fYnVzKCZ0eF9yaW5nWzBdKTsKK30KKworLyogZnVuY3Rpb246IGVwaWMxMDBfdHJhbnNtaXQKKyAqIFRoaXMgdHJhbnNtaXRzIGEgcGFja2V0LgorICoKKyAqIEFyZ3VtZW50czogY2hhciBkWzZdOiAgICAgICAgICBkZXN0aW5hdGlvbiBldGhlcm5ldCBhZGRyZXNzLgorICogICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCB0OiAgIGV0aGVybmV0IHByb3RvY29sIHR5cGUuCisgKiAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHM6ICAgc2l6ZSBvZiB0aGUgZGF0YS1wYXJ0IG9mIHRoZSBwYWNrZXQuCisgKiAgICAgICAgICAgIGNoYXIgKnA6ICAgICAgICAgICAgdGhlIGRhdGEgZm9yIHRoZSBwYWNrZXQuCisgKiByZXR1cm5zOiAgIHZvaWQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorZXBpYzEwMF90cmFuc21pdChzdHJ1Y3QgbmljICpuaWMsIGNvbnN0IGNoYXIgKmRlc3RhZGRyLCB1bnNpZ25lZCBpbnQgdHlwZSwKKwkJIHVuc2lnbmVkIGludCBsZW4sIGNvbnN0IGNoYXIgKmRhdGEpCit7CisgICAgdW5zaWduZWQgc2hvcnQgbnN0eXBlOworICAgIGNoYXIqIHR4cDsKKyAgICBpbnQgZW50cnk7CisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIG5leHQgVHggZGVzY3JpcHRvciBlbnRyeS4gKi8KKyAgICBlbnRyeSA9IGN1cl90eCAlIFRYX1JJTkdfU0laRTsKKworICAgIGlmICgodHhfcmluZ1tlbnRyeV0uc3RhdHVzICYgVFJJTkdfT1dOKSA9PSBUUklOR19PV04pIHsKKwlwcmludGYoImV0aF90cmFuc21pdDogVW5hYmxlIHRvIHRyYW5zbWl0LiBzdGF0dXM9JWhYLiBSZXNldHRpbmcuLi5cbiIsCisJICAgICAgIHR4X3JpbmdbZW50cnldLnN0YXR1cyk7CisKKwllcGljMTAwX29wZW4oKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgdHhwID0gKGNoYXIqKXR4X3JpbmdbZW50cnldLmJ1ZmFkZHI7CisKKyAgICBtZW1jcHkodHhwLCBkZXN0YWRkciwgRVRIX0FMRU4pOworICAgIG1lbWNweSh0eHAgKyBFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsKKyAgICBuc3R5cGUgPSBodG9ucyh0eXBlKTsKKyAgICBtZW1jcHkodHhwICsgMTIsIChjaGFyKikmbnN0eXBlLCAyKTsKKyAgICBtZW1jcHkodHhwICsgRVRIX0hMRU4sIGRhdGEsIGxlbik7CisKKyAgICBsZW4gKz0gRVRIX0hMRU47CisKKyAgICAvKgorICAgICAqIENhdXRpb246IHRoZSB3cml0ZSBvcmRlciBpcyBpbXBvcnRhbnQgaGVyZSwKKyAgICAgKiBzZXQgdGhlIGJhc2UgYWRkcmVzcyB3aXRoIHRoZSAib3duZXJzaGlwIgorICAgICAqIGJpdHMgbGFzdC4KKyAgICAgKi8KKyAgICB0eF9yaW5nW2VudHJ5XS50eGxlbmd0aCAgPSAobGVuID49IDYwID8gbGVuIDogNjApOworICAgIHR4X3JpbmdbZW50cnldLmJ1Zmxlbmd0aCA9IGxlbjsKKyAgICB0eF9yaW5nW2VudHJ5XS5zdGF0dXMgICAgPSBUUklOR19PV047CS8qIFBhc3Mgb3duZXJzaGlwIHRvIHRoZSBjaGlwLiAqLworCisgICAgY3VyX3R4Kys7CisKKyAgICAvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSB0cmFuc21pdCBkZW1hbmQuICovCisgICAgb3V0bChDUl9RVUVVRV9UWCwgY29tbWFuZCk7CisKKyAgICBsb2FkX3RpbWVyMigxMCpUSUNLU19QRVJfTVMpOyAgICAgICAgIC8qIHRpbWVvdXQgMTAgbXMgZm9yIHRyYW5zbWl0ICovCisgICAgd2hpbGUgKCh0eF9yaW5nW2VudHJ5XS5zdGF0dXMgJiBUUklOR19PV04pICYmIHRpbWVyMl9ydW5uaW5nKCkpCisJLyogV2FpdCAqLzsKKworICAgIGlmICgodHhfcmluZ1tlbnRyeV0uc3RhdHVzICYgVFJJTkdfT1dOKSAhPSAwKQorCXByaW50ZigiT29wcywgdHJhbnNtaXR0ZXIgdGltZW91dCwgc3RhdHVzPSVoWFxuIiwKKwkgICAgdHhfcmluZ1tlbnRyeV0uc3RhdHVzKTsKK30KKworLyogZnVuY3Rpb246IGVwaWMxMDBfcG9sbCAvIGV0aF9wb2xsCisgKiBUaGlzIHJlY2VpdmVzIGEgcGFja2V0IGZyb20gdGhlIG5ldHdvcmsuCisgKgorICogQXJndW1lbnRzOiBub25lCisgKgorICogcmV0dXJuczogICAxIGlmIGEgcGFja2V0IHdhcyByZWNlaXZlZC4KKyAqICAgICAgICAgICAgMCBpZiBubyBwYWNldCB3YXMgcmVjZWl2ZWQuCisgKiBzaWRlIGVmZmVjdHM6CisgKiAgICAgICAgICAgIHJldHVybnMgdGhlIHBhY2tldCBpbiB0aGUgYXJyYXkgbmljLT5wYWNrZXQuCisgKiAgICAgICAgICAgIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IGluIG5pYy0+cGFja2V0bGVuLgorICovCisKKyAgICBzdGF0aWMgaW50CitlcGljMTAwX3BvbGwoc3RydWN0IG5pYyAqbmljKQoreworICAgIGludCBlbnRyeTsKKyAgICBpbnQgc3RhdHVzOworICAgIGludCByZXRjb2RlOworCisgICAgZW50cnkgPSBjdXJfcnggJSBSWF9SSU5HX1NJWkU7CisKKyAgICBpZiAoKHN0YXR1cyA9IHJ4X3JpbmdbZW50cnldLnN0YXR1cyAmIFJSSU5HX09XTikgPT0gUlJJTkdfT1dOKQorCXJldHVybiAoMCk7CisKKyAgICAvKiBXZSBvd24gdGhlIG5leHQgZW50cnksIGl0J3MgYSBuZXcgcGFja2V0LiBTZW5kIGl0IHVwLiAqLworCisjaWYJKEVQSUNfREVCVUcgPiA0KQorICAgIHByaW50ZigiZXBpY19wb2xsOiBlbnRyeSAlZCBzdGF0dXMgJWhYXG4iLCBlbnRyeSwgc3RhdHVzKTsKKyNlbmRpZgorCisgICAgY3VyX3J4Kys7CisgICAgaWYgKHN0YXR1cyAmIDB4MjAwMCkgeworCXByaW50ZigiZXBpY19wb2xsOiBHaWFudCBwYWNrZXRcbiIpOworCXJldGNvZGUgPSAwOworICAgIH0gZWxzZSBpZiAoc3RhdHVzICYgMHgwMDA2KSB7CisJLyogUnggRnJhbWUgZXJyb3JzIGFyZSBjb3VudGVkIGluIGhhcmR3YXJlLiAqLworCXByaW50ZigiZXBpY19wb2xsOiBGcmFtZSByZWNlaXZlZCB3aXRoIGVycm9yc1xuIik7CisJcmV0Y29kZSA9IDA7CisgICAgfSBlbHNlIHsKKwkvKiBPbWl0IHRoZSBmb3VyIG9jdGV0IENSQyBmcm9tIHRoZSBsZW5ndGguICovCisJbmljLT5wYWNrZXRsZW4gPSByeF9yaW5nW2VudHJ5XS5yeGxlbmd0aCAtIDQ7CisJbWVtY3B5KG5pYy0+cGFja2V0LCAoY2hhciopcnhfcmluZ1tlbnRyeV0uYnVmYWRkciwgbmljLT5wYWNrZXRsZW4pOworCXJldGNvZGUgPSAxOworICAgIH0KKworICAgIC8qIENsZWFyIGFsbCBlcnJvciBzb3VyY2VzLiAqLworICAgIG91dGwoc3RhdHVzICYgSU5UUl9DTEVBUkVSUlMsIGludHN0YXQpOworCisgICAgLyogR2l2ZSB0aGUgZGVzY3JpcHRvciBiYWNrIHRvIHRoZSBjaGlwICovCisgICAgcnhfcmluZ1tlbnRyeV0uc3RhdHVzID0gUlJJTkdfT1dOOworCisgICAgLyogUmVzdGFydCBSZWNlaXZlciAqLworICAgIG91dGwoQ1JfU1RBUlRfUlggfCBDUl9RVUVVRV9SWCwgY29tbWFuZCk7CisKKyAgICByZXR1cm4gcmV0Y29kZTsKK30KKworCisgICAgc3RhdGljIHZvaWQKK2VwaWMxMDBfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpCit7Cit9CisKKworI2lmZGVmCURFQlVHX0VFUFJPTQorLyogU2VyaWFsIEVFUFJPTSBzZWN0aW9uLiAqLworCisvKiAgRUVQUk9NX0N0cmwgYml0cy4gKi8KKyNkZWZpbmUgRUVfU0hJRlRfQ0xLCTB4MDQJLyogRUVQUk9NIHNoaWZ0IGNsb2NrLiAqLworI2RlZmluZSBFRV9DUwkJMHgwMgkvKiBFRVBST00gY2hpcCBzZWxlY3QuICovCisjZGVmaW5lIEVFX0RBVEFfV1JJVEUJMHgwOAkvKiBFRVBST00gY2hpcCBkYXRhIGluLiAqLworI2RlZmluZSBFRV9XUklURV8wCTB4MDEKKyNkZWZpbmUgRUVfV1JJVEVfMQkweDA5CisjZGVmaW5lIEVFX0RBVEFfUkVBRAkweDEwCS8qIEVFUFJPTSBjaGlwIGRhdGEgb3V0LiAqLworI2RlZmluZSBFRV9FTkIJCSgweDAwMDEgfCBFRV9DUykKKworLyogVGhlIEVFUFJPTSBjb21tYW5kcyBpbmNsdWRlIHRoZSBhbHdheS1zZXQgbGVhZGluZyBiaXQuICovCisjZGVmaW5lIEVFX1dSSVRFX0NNRAkoNSA8PCA2KQorI2RlZmluZSBFRV9SRUFEX0NNRAkoNiA8PCA2KQorI2RlZmluZSBFRV9FUkFTRV9DTUQJKDcgPDwgNikKKworI2RlZmluZSBlZXByb21fZGVsYXkobikJZGVsYXkobikKKworICAgIHN0YXRpYyBpbnQKK3JlYWRfZWVwcm9tKGludCBsb2NhdGlvbikKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgcmV0dmFsID0gMDsKKyAgICBpbnQgcmVhZF9jbWQgPSBsb2NhdGlvbiB8IEVFX1JFQURfQ01EOworCisgICAgb3V0bChFRV9FTkIgJiB+RUVfQ1MsIGVlY3RsKTsKKyAgICBvdXRsKEVFX0VOQiwgZWVjdGwpOworCisgICAgLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KKyAgICBmb3IgKGkgPSAxMDsgaSA+PSAwOyBpLS0pIHsKKwlzaG9ydCBkYXRhdmFsID0gKHJlYWRfY21kICYgKDEgPDwgaSkpID8gRUVfREFUQV9XUklURSA6IDA7CisJb3V0bChFRV9FTkIgfCBkYXRhdmFsLCBlZWN0bCk7CisJZWVwcm9tX2RlbGF5KDEwMCk7CisJb3V0bChFRV9FTkIgfCBkYXRhdmFsIHwgRUVfU0hJRlRfQ0xLLCBlZWN0bCk7CisJZWVwcm9tX2RlbGF5KDE1MCk7CisJb3V0bChFRV9FTkIgfCBkYXRhdmFsLCBlZWN0bCk7CS8qIEZpbmlzaCBFRVBST00gYSBjbG9jayB0aWNrLiAqLworCWVlcHJvbV9kZWxheSgyNTApOworICAgIH0KKyAgICBvdXRsKEVFX0VOQiwgZWVjdGwpOworCisgICAgZm9yIChpID0gMTY7IGkgPiAwOyBpLS0pIHsKKwlvdXRsKEVFX0VOQiB8IEVFX1NISUZUX0NMSywgZWVjdGwpOworCWVlcHJvbV9kZWxheSgxMDApOworCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKGlubChlZWN0bCkgJiBFRV9EQVRBX1JFQUQpID8gMSA6IDApOworCW91dGwoRUVfRU5CLCBlZWN0bCk7CisJZWVwcm9tX2RlbGF5KDEwMCk7CisgICAgfQorCisgICAgLyogVGVybWluYXRlIHRoZSBFRVBST00gYWNjZXNzLiAqLworICAgIG91dGwoRUVfRU5CICYgfkVFX0NTLCBlZWN0bCk7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKyNlbmRpZgorCisKKyNkZWZpbmUgTUlJX1JFQURPUAkxCisjZGVmaW5lIE1JSV9XUklURU9QCTIKKworICAgIHN0YXRpYyBpbnQKK21paV9yZWFkKGludCBwaHlfaWQsIGludCBsb2NhdGlvbikKK3sKKyAgICBpbnQgaTsKKworICAgIG91dGwoKHBoeV9pZCA8PCA5KSB8IChsb2NhdGlvbiA8PCA0KSB8IE1JSV9SRUFET1AsIG1tY3RsKTsKKyAgICAvKiBUeXBpY2FsIG9wZXJhdGlvbiB0YWtlcyA8IDUwIHRpY2tzLiAqLworCisgICAgZm9yIChpID0gNDAwMDsgaSA+IDA7IGktLSkKKwlpZiAoKGlubChtbWN0bCkgJiBNSUlfUkVBRE9QKSA9PSAwKQorCSAgICBicmVhazsKKyAgICByZXR1cm4gaW53KG1tZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9uZXRib290L2VwaWMxMDAuaCBiL25ldGJvb3QvZXBpYzEwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYmQxZDkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L2VwaWMxMDAuaApAQCAtMCwwICsxLDE4OCBAQAorI2lmbmRlZglfRVBJQzEwMF9IXworIyBkZWZpbmUgX0VQSUMxMDBfSF8KKworI2lmbmRlZglQQ0lfVkVORE9SX1NNQworIyBkZWZpbmUgUENJX1ZFTkRPUl9TTUMJCTB4MTBCOAorI2VuZGlmCisKKyNpZm5kZWYJUENJX0RFVklDRV9TTUNfRVBJQzEwMAorIyBkZWZpbmUgUENJX0RFVklDRV9TTUNfRVBJQzEwMAkweDAwMDUKKyNlbmRpZgorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTk9ORQkweEZGRkYKKworLyogT2Zmc2V0cyB0byByZWdpc3RlcnMgKHVzaW5nIFNNQyBuYW1lcykuICovCitlbnVtIGVwaWMxMDBfcmVnaXN0ZXJzIHsKKyAgICBDT01NQU5EPSAwLAkJLyogQ29udHJvbCBSZWdpc3RlciAqLworICAgIElOVFNUQVQ9IDQsCQkvKiBJbnRlcnJ1cHQgU3RhdHVzICovCisgICAgSU5UTUFTSz0gOCwJCS8qIEludGVycnVwdCBNYXNrICovCisgICAgR0VOQ1RMID0gMHgwQywJLyogR2VuZXJhbCBDb250cm9sICovCisgICAgTlZDVEwgID0gMHgxMCwJLyogTm9uIFZvbGF0aWxlIENvbnRyb2wgKi8KKyAgICBFRUNUTCAgPSAweDE0LAkvKiBFRVBST00gQ29udHJvbCAgKi8KKyAgICBURVNUICAgPSAweDFDLAkvKiBUZXN0IHJlZ2lzdGVyOiBtYXJrZWQgYXMgcmVzZXJ2ZWQgKHNlZSBpbiBzb3VyY2UgY29kZSkgKi8KKyAgICBDUkNDTlQgPSAweDIwLAkvKiBDUkMgRXJyb3IgQ291bnRlciAqLworICAgIEFMSUNOVCA9IDB4MjQsCS8qIEZyYW1lIEFsaWdubWVudCBFcnJvciBDb3VudGVyICovCisgICAgTVBDTlQgID0gMHgyOCwJLyogTWlzc2VkIFBhY2tldCBDb3VudGVyICovCisgICAgTU1DVEwgID0gMHgzMCwJLyogTUlJIE1hbmFnZW1lbnQgSW50ZXJmYWNlIENvbnRyb2wgKi8KKyAgICBNTURBVEEgPSAweDM0LAkvKiBNSUkgTWFuYWdlbWVudCBJbnRlcmZhY2UgRGF0YSAqLworICAgIE1JSUNGRyA9IDB4MzgsCS8qIE1JSSBDb25maWd1cmF0aW9uICovCisgICAgSVBHICAgID0gMHgzQywJLyogSW50ZXJQYWNrZXQgR2FwICovCisgICAgTEFOMCAgID0gMHg0MCwJLyogTUFDIGFkZHJlc3MuICgweDQwLTB4NDgpICovCisgICAgSURDSEsgID0gMHg0QywJLyogQm9hcmRJRC8gQ2hlY2tzdW0gKi8KKyAgICBNQzAgICAgPSAweDUwLAkvKiBNdWx0aWNhc3QgZmlsdGVyIHRhYmxlLiAoMHg1MC0weDVjKSAqLworICAgIFJYQ09OICA9IDB4NjAsCS8qIFJlY2VpdmUgQ29udHJvbCAqLworICAgIFRYQ09OICA9IDB4NzAsCS8qIFRyYW5zbWl0IENvbnRyb2wgKi8KKyAgICBUWFNUQVQgPSAweDc0LAkvKiBUcmFuc21pdCBTdGF0dXMgKi8KKyAgICBQUkNEQVIgPSAweDg0LAkvKiBQQ0kgUmVjZWl2ZSBDdXJyZW50IERlc2NyaXB0b3IgQWRkcmVzcyAqLworICAgIFBSU1RBVCA9IDB4QTQsCS8qIFBDSSBSZWNlaXZlIERNQSBTdGF0dXMgKi8KKyAgICBQUkNQVEhSPSAweEIwLAkvKiBQQ0kgUmVjZWl2ZSBDb3B5IFRocmVzaG9sZCAqLworICAgIFBUQ0RBUiA9IDB4QzQsCS8qIFBDSSBUcmFuc21pdCBDdXJyZW50IERlc2NyaXB0b3IgQWRkcmVzcyAqLworICAgIEVUSFRIUiA9IDB4REMJLyogRWFybHkgVHJhbnNtaXQgVGhyZXNob2xkICovCit9OworCisvKiBDb21tYW5kIHJlZ2lzdGVyIChDUl8pIGJpdHMgKi8KKyNkZWZpbmUgQ1JfU1RPUF9SWAkJKDB4MDAwMDAwMDEpCisjZGVmaW5lIENSX1NUQVJUX1JYCQkoMHgwMDAwMDAwMikKKyNkZWZpbmUgQ1JfUVVFVUVfVFgJCSgweDAwMDAwMDA0KQorI2RlZmluZSBDUl9RVUVVRV9SWAkJKDB4MDAwMDAwMDgpCisjZGVmaW5lIENSX05FWFRGUkFNRQkJKDB4MDAwMDAwMTApCisjZGVmaW5lIENSX1NUT1BfVFhfRE1BCQkoMHgwMDAwMDAyMCkKKyNkZWZpbmUgQ1JfU1RPUF9SWF9ETUEJCSgweDAwMDAwMDQwKQorI2RlZmluZSBDUl9UWF9VR08JCSgweDAwMDAwMDgwKQorCisvKiBJbnRlcnJ1cHQgcmVnaXN0ZXIgYml0cy4gTkkgbWVhbnMgTm8gSW50ZXJydXB0IGdlbmVyYXRlZCAqLworCisjZGVmaW5lCUlOVFJfUlhfVEhSX1NUQQkJKDB4MDA0MDAwMDApCS8qIHJ4IGNvcHkgdGhyZXNob2xkIHN0YXR1cyBOSSAqLworI2RlZmluZQlJTlRSX1JYX0JVRkZfRU1QVFkJKDB4MDAyMDAwMDApCS8qIHJ4IGJ1ZmZlcnMgZW1wdHkuIE5JICovCisjZGVmaW5lCUlOVFJfVFhfSU5fUFJPRwkJKDB4MDAxMDAwMDApCS8qIHR4IGNvcHkgaW4gcHJvZ2Vzcy4gTkkgKi8KKyNkZWZpbmUJSU5UUl9SWF9JTl9QUk9HCQkoMHgwMDA4MDAwMCkJLyogcnggY29weSBpbiBwcm9ncmVzcy4gTkkgKi8KKyNkZWZpbmUJSU5UUl9UWElETEUJCSgweDAwMDQwMDAwKQkvKiB0eCBpZGxlLiBOSSAqLworI2RlZmluZSBJTlRSX1JYSURMRQkJKDB4MDAwMjAwMDApCS8qIHJ4IGlkbGUuIE5JICovCisjZGVmaW5lIElOVFJfSU5UUl9BQ1RJVkUJKDB4MDAwMTAwMDApCS8qIEludGVycnVwdCBhY3RpdmUuIE5JICovCisjZGVmaW5lIElOVFJfUlhfU1RBVFVTX09LCSgweDAwMDA4MDAwKQkvKiByeCBzdGF0dXMgdmFsaWQuIE5JICovCisjZGVmaW5lIElOVFJfUENJX1RHVF9BQlQJKDB4MDAwMDQwMDApCS8qIFBDSSBUYXJnZXQgYWJvcnQgKi8KKyNkZWZpbmUgSU5UUl9QQ0lfTUFTVEVSX0FCVAkoMHgwMDAwMjAwMCkJLyogUENJIE1hc3RlciBhYm9ydCAqLworI2RlZmluZSBJTlRSX1BDSV9QQVJJVFlfRVJSCSgweDAwMDAxMDAwKQkvKiBQQ0kgYWRyZXNzIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBJTlRSX1BDSV9EQVRBX0VSUgkoMHgwMDAwMDgwMCkJLyogUENJIGRhdGEgcGFyaXR5IGVycm9yICovCisjZGVmaW5lIElOVFJfUlhfVEhSX0NST1NTRUQJKDB4MDAwMDA0MDApCS8qIHJ4IGNvcHkgdGhyZXNob2xkIGNyb3NzZWQgKi8KKyNkZWZpbmUgSU5UUl9DTlRGVUxMCQkoMHgwMDAwMDIwMCkJLyogQ291bnRlciBvdmVyZmxvdyAqLworI2RlZmluZSBJTlRSX1RYVU5ERVJSVU4JCSgweDAwMDAwMTAwKQkvKiB0eCB1bmRlcnJ1bi4gKi8KKyNkZWZpbmUgSU5UUl9UWEVNUFRZCQkoMHgwMDAwMDA4MCkJLyogdHggcXVldWUgZW1wdHkgKi8KKyNkZWZpbmUgSU5UUl9UWF9DSF9DT01QTEVURQkoMHgwMDAwMDA0MCkJLyogdHggY2hhaW4gY29tcGxldGUgKi8KKyNkZWZpbmUgSU5UUl9UWERPTkUJCSgweDAwMDAwMDIwKQkvKiB0eCBjb21wbGV0ZSAodyBvciB3L28gZXJyKSAqLworI2RlZmluZSBJTlRSX1JYRVJST1IJCSgweDAwMDAwMDEwKQkvKiByeCBlcnJvciAoQ1JDKSAqLworI2RlZmluZSBJTlRSX1JYT1ZFUkZMT1cJCSgweDAwMDAwMDA4KQkvKiByeCBidWZmZXIgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgSU5UUl9SWF9RVUVVRV9FTVBUWQkoMHgwMDAwMDAwNCkJLyogcnggcXVldWUgZW1wdHkuICovCisjZGVmaW5lIElOVFJfUlhIRUFERVIJCSgweDAwMDAwMDAyKQkvKiBoZWFkZXIgY29weSBjb21wbGV0ZSAqLworI2RlZmluZSBJTlRSX1JYRE9ORQkJKDB4MDAwMDAwMDEpCS8qIFJlY2VpdmUgY29weSBjb21wbGV0ZSAqLworCisjZGVmaW5lIElOVFJfQ0xFQVJJTlRSCQkoMHgwMDAwN0ZGRikKKyNkZWZpbmUgSU5UUl9WQUxJREJJVFMJCSgweDAwN0ZGRkZGKQorI2RlZmluZSBJTlRSX0RJU0FCTEUJCSgweDAwMDAwMDAwKQorI2RlZmluZSBJTlRSX0NMRUFSRVJSUwkJKDB4MDAwMDdGMTgpCisjZGVmaW5lIElOVFJfQUJOSU5UUgkJKElOVFJfQ05URlVMTCB8IElOVFJfVFhVTkRFUlJVTiB8IElOVFJfUlhPVkVSRkxPVykKKworLyogR2VuZXJhbCBDb250cm9sIChHQ18pIGJpdHMgKi8KKworI2RlZmluZSBHQ19TT0ZUX1JFU0VUCQkoMHgwMDAwMDAwMSkKKyNkZWZpbmUgR0NfSU5UUl9FTkFCTEUJCSgweDAwMDAwMDAyKQorI2RlZmluZSBHQ19TT0ZUX0lOVFIJCSgweDAwMDAwMDA0KQorI2RlZmluZSBHQ19QT1dFUl9ET1dOCQkoMHgwMDAwMDAwOCkKKyNkZWZpbmUgR0NfT05FX0NPUFkJCSgweDAwMDAwMDEwKQorI2RlZmluZSBHQ19CSUdfRU5ESUFOCQkoMHgwMDAwMDAyMCkKKyNkZWZpbmUgR0NfUlhfUFJFRU1QVF9UWAkoMHgwMDAwMDA0MCkKKyNkZWZpbmUgR0NfVFhfUFJFRU1QVF9SWAkoMHgwMDAwMDA4MCkKKworLyoKKyAqIFJlY2VpdmUgRklGTyBUaHJlc2hvbGQgdmFsdWVzCisgKiBDb250cm9sIHRoZSBsZXZlbCBhdCB3aGljaCB0aGUgIFBDSSBidXJzdCBzdGF0ZSBtYWNoaW5lCisgKiBiZWdpbnMgdG8gZW1wdHkgdGhlIHJlY2VpdmUgRklGTy4gUG9zc2libGUgdmFsdWVzOiAwLTMKKyAqCisgKiAwID0+IDMyLCAxID0+IDY0LCAyID0+IDk2IDMgPT4gMTI4IGJ5dGVzLgorICovCisjZGVmaW5lIEdDX1JYX0ZJRk9fVEhSXzMyCSgweDAwMDAwMDAwKQorI2RlZmluZSBHQ19SWF9GSUZPX1RIUl82NAkoMHgwMDAwMDEwMCkKKyNkZWZpbmUgR0NfUlhfRklGT19USFJfOTYJKDB4MDAwMDAyMDApCisjZGVmaW5lIEdDX1JYX0ZJRk9fVEhSXzEyOAkoMHgwMDAwMDMwMCkKKworLyogTWVtb3J5IFJlYWQgQ29udHJvbCAoTVJDXykgdmFsdWVzICovCisjZGVmaW5lIEdDX01SQ19NRU1fUkVBRAkJKDB4MDAwMDAwMDApCisjZGVmaW5lIEdDX01SQ19SRUFEX01VTFQJKDB4MDAwMDA0MDApCisjZGVmaW5lIEdDX01SQ19SRUFEX0xJTkUJKDB4MDAwMDA4MDApCisKKyNkZWZpbmUgR0NfU09GVEJJVDAJCSgweDAwMDAxMDAwKQorI2RlZmluZSBHQ19TT0ZUQklUMQkJKDB4MDAwMDIwMDApCisjZGVmaW5lIEdDX1JFU0VUX1BIWQkJKDB4MDAwMDQwMDApCisKKy8qIERlZmluaXRpb25zIG9mIHRoZSBSZWNlaXZlIENvbnRyb2wgKFJDXykgcmVnaXN0ZXIgYml0cyAqLworCisjZGVmaW5lIFJDX1NBVkVfRVJST1JFRF9QS1QJKDB4MDAwMDAwMDEpCisjZGVmaW5lIFJDX1NBVkVfUlVOVF9GUkFNRVMJKDB4MDAwMDAwMDIpCisjZGVmaW5lIFJDX1JDVl9CUk9BRENBU1QJKDB4MDAwMDAwMDQpCisjZGVmaW5lIFJDX1JDVl9NVUxUSUNBU1QJKDB4MDAwMDAwMDgpCisjZGVmaW5lIFJDX1JDVl9JTlZFUlNFX1BLVAkoMHgwMDAwMDAxMCkKKyNkZWZpbmUgUkNfUFJPTUlTQ1VPVVNfTU9ERQkoMHgwMDAwMDAyMCkKKyNkZWZpbmUgUkNfTU9OSVRPUl9NT0RFCQkoMHgwMDAwMDA0MCkKKyNkZWZpbmUgUkNfRUFSTFlfUkNWX0VOQUJMRQkoMHgwMDAwMDA4MCkKKworLyogZGVzY3JpcHRpb24gb2YgdGhlIHJ4IGRlc2NyaXB0b3JzIGNvbnRyb2wgYml0cyAqLworI2RlZmluZSBSRF9GUkFHTElTVAkJKDB4MDAwMSkJLyogRGVzYyBwb2ludHMgdG8gYSBmcmFnbWVudCBsaXN0ICovCisjZGVmaW5lIFJEX0xMRk9STQkJKDB4MDAwMikJLyogRnJhZyBsaXN0IGZvcm1hdCAqLworI2RlZmluZSBSRF9IRFJfQ1BZCQkoMHgwMDA0KQkvKiBEZXNjIHVzZWQgZm9yIGhlYWRlciBjb3B5ICovCisKKy8qIERlZmluaXRpb24gb2YgdGhlIFRyYW5zbWl0IENPTlRST0wgKFRDKSByZWdpc3RlciBiaXRzICovCisKKyNkZWZpbmUgVENfRUFSTFlfVFhfRU5BQkxFCSgweDAwMDAwMDAxKQorCisvKiBMb29wYmFjayBNb2RlIChMTV8pIFNlbGVjdCB2YWx1ZXNiaXRzICovCisjZGVmaW5lIFRDX0xNX05PUk1BTAkJKDB4MDAwMDAwMDApCisjZGVmaW5lIFRDX0xNX0lOVEVSTkFMCQkoMHgwMDAwMDAwMikKKyNkZWZpbmUgVENfTE1fRVhURVJOQUwJCSgweDAwMDAwMDA0KQorI2RlZmluZSBUQ19MTV9GVUxMX0RQWAkJKDB4MDAwMDAwMDYpCisKKyNkZWZpbmUgVFhfU0xPVF9USU1FCQkoMHgwMDAwMDA3OCkKKworLyogQnl0ZXMgdHJhbnNmZXJyZWQgdG8gY2hpcCBiZWZvcmUgdHJhbnNtaXNzaW9uIHN0YXJ0cy4gKi8KKyNkZWZpbmUgVFhfRklGT19USFJFU0gJCTEyOAkvKiBSb3VuZGVkIGRvd24gdG8gNCBieXRlIHVuaXRzLiAqLworCisvKiBkZXNjcmlwdGlvbiBvZiByeCBkZXNjcmlwdG9ycyBzdGF0dXMgYml0cyAqLworI2RlZmluZSBSUklOR19QS1RfSU5UQUNUCSgweDAwMDEpCisjZGVmaW5lIFJSSU5HX0FMSUdOX0VSUgkJKDB4MDAwMikKKyNkZWZpbmUgUlJJTkdfQ1JDX0VSUgkJKDB4MDAwNCkKKyNkZWZpbmUgUlJJTkdfTUlTU0VEX1BLVAkoMHgwMDA4KQorI2RlZmluZSBSUklOR19NVUxUSUNBU1QJCSgweDAwMTApCisjZGVmaW5lIFJSSU5HX0JST0FEQ0FTVAkJKDB4MDAyMCkKKyNkZWZpbmUgUlJJTkdfUkVDRUlWRVJfRElTQUJMRQkoMHgwMDQwKQorI2RlZmluZSBSUklOR19TVEFUVVNfVkFMSUQJKDB4MTAwMCkKKyNkZWZpbmUgUlJJTkdfRlJBR0xJU1RfRVJSCSgweDIwMDApCisjZGVmaW5lIFJSSU5HX0hEUl9DT1BJRUQJKDB4NDAwMCkKKyNkZWZpbmUgUlJJTkdfT1dOCQkoMHg4MDAwKQorCisvKiBlcnJvciBzdW1tYXJ5ICovCisjZGVmaW5lIFJSSU5HX0VSUk9SCQkoUlJJTkdfQUxJR05fRVJSfFJSSU5HX0NSQ19FUlIpCisKKy8qIGRlc2NyaXB0aW9uIG9mIHR4IGRlc2NyaXB0b3JzIHN0YXR1cyBiaXRzICovCisjZGVmaW5lIFRSSU5HX1BLVF9JTlRBQ1QJKDB4MDAwMSkJLyogcGt0IHRyYW5zbWl0dGVkLiAqLworI2RlZmluZSBUUklOR19QS1RfTk9OREVGRVIJKDB4MDAwMikJLyogcGt0IHhtaXR0ZWQgdy9vIGRlZmVycmluZyAqLworI2RlZmluZSBUUklOR19DT0xMCQkoMHgwMDA0KQkvKiBwa3QgeG1pdHRlZCB3IGNvbGxpc2lvbnMgKi8KKyNkZWZpbmUgVFJJTkdfQ0FSUgkJKDB4MDAwOCkJLyogY2FycmllciBzZW5zZSBsb3N0ICovCisjZGVmaW5lIFRSSU5HX1VOREVSUlVOCQkoMHgwMDEwKQkvKiBETUEgdW5kZXJydW4gKi8KKyNkZWZpbmUgVFJJTkdfSEJfQ09MTAkJKDB4MDAyMCkJLyogQ29sbGlzaW9uIGRldGVjdCBIZWFydGJlYXQgKi8KKyNkZWZpbmUgVFJJTkdfV0lOX0NPTEwJCSgweDAwNDApCS8qIG91dCBvZiB3aW5kb3cgY29sbGlzaW9uICovCisjZGVmaW5lIFRSSU5HX0RFRkVSUkVECQkoMHgwMDgwKQkvKiBEZWZlcnJpbmcgKi8KKyNkZWZpbmUgVFJJTkdfQ09MTF9DT1VOVAkoMHgwRjAwKQkvKiBjb2xsaXNpb24gY291bnRlciAobWFzaykgKi8KKyNkZWZpbmUgVFJJTkdfQ09MTF9FWENFU1MJKDB4MTAwMCkJLyogdHggYWJvcnRlZDogZXhjZXNzaXZlIGNvbGxzICovCisjZGVmaW5lIFRSSU5HX09XTgkJKDB4ODAwMCkJLyogZGVzYyBvd25lcnNoaXAgYml0ICovCisKKy8qIGVycm9yIHN1bW1hcnkgKi8KKyNkZWZpbmUgVFJJTkdfQUJPUlQJKFRSSU5HX0NPTExfRVhDRVNTfFRSSU5HX1dJTl9DT0xMfFRSSU5HX1VOREVSUlVOKQorI2RlZmluZSBUUklOR19FUlJPUgkoVFJJTkdfREVGRVJSRUR8VFJJTkdfV0lOX0NPTEx8VFJJTkdfVU5ERVJSVU58VFJJTkdfQ0FSUi8qfFRSSU5HX0NPTEwqLyApCisKKy8qIGRlc2NyaXB0aW9uIG9mIHRoZSB0eCBkZXNjcmlwdG9ycyBjb250cm9sIGJpdHMgKi8KKyNkZWZpbmUgVERfRlJBR0xJU1QJCSgweDAwMDEpCS8qIERlc2MgcG9pbnRzIHRvIGEgZnJhZ21lbnQgbGlzdCAqLworI2RlZmluZSBURF9MTEZPUk0JCSgweDAwMDIpCS8qIEZyYWcgbGlzdCBmb3JtYXQgKi8KKyNkZWZpbmUgVERfSUFGCQkJKDB4MDAwNCkJLyogR2VuZXJhdGUgSW50ZXJydXB0IGFmdGVyIHR4ICovCisjZGVmaW5lIFREX05PQ1JDCQkoMHgwMDA4KQkvKiBObyBDUkMgZ2VuZXJhdGVkICovCisjZGVmaW5lIFREX0xBU1RERVNDCQkoMHgwMDEwKQkvKiBMYXN0IGRlc2MgZm9yIHRoaXMgZnJhbWUgKi8KKworI2VuZGlmCS8qIF9FUElDMTAwX0hfICovCmRpZmYgLS1naXQgYS9uZXRib290L2V0aGVyYm9vdC5oIGIvbmV0Ym9vdC9ldGhlcmJvb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGNhMTZmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9ldGhlcmJvb3QuaApAQCAtMCwwICsxLDU0NyBAQAorLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEsMjAwMiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKiBSVUxFOiBZb3UgbXVzdCBkZWZpbmUgdGhlIG1hY3JvIGBgR1JVQicnIHdoZW4gaW5jbHVkaW5nIHRoaXMgaGVhZGVyCisgICBmaWxlIGluIEdSVUIgY29kZS4gICovCisKKy8qIEJhc2VkIG9uICJzcmMvZXRoZXJib290LmgiIGluIGV0aGVyYm9vdC01LjAuNS4gICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIRVJCT09UIC0gIEJPT1RQL1RGVFAgQm9vdHN0cmFwIFByb2dyYW0KKworQXV0aG9yOiBNYXJ0aW4gUmVudGVycworICBEYXRlOiBEZWMvOTMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEluY2x1ZGUgR1JVQi1zcGVjaWZpYyBtYWNyb3MgYW5kIHByb3RvdHlwZXMgaGVyZS4gICovCisjaW5jbHVkZSA8c2hhcmVkLmg+CisKKy8qIEZJWE1FOiBGb3Igbm93LCBlbmFibGUgdGhlIERIQ1Agc3VwcG9ydC4gUGVyaGFwcyBJIHNob3VsZCBzZWdyZWdhdGUKKyAgIHRoZSBESENQIHN1cHBvcnQgZnJvbSB0aGUgQk9PVFAgc3VwcG9ydCwgYW5kIHBlcm1pdCBib3RoIHRvCisgICBjby1leGlzdC4gICovCisjdW5kZWYgTk9fREhDUF9TVVBQT1JUCisKKy8qIEluIEdSVUIsIHRoZSByZWxvY2F0ZWQgYWRkcmVzcyBpbiBFdGhlcmJvb3QgZG9lc24ndCBoYXZlIGFueSBzZW5zZS4KKyAgIEp1c3QgZGVmaW5lIGl0IGFzIGEgYm9ndXMgdmFsdWUuICAqLworI2RlZmluZSBSRUxPQwkwCisKKy8qIEZJWE1FOiBTaG91bGQgYmUgYW4gb3B0aW9uLiAgKi8KKyNkZWZpbmUgQkFDS09GRl9MSU1JVAk3CisKKyNpbmNsdWRlIDxvc2RlcC5oPgorCisjZGVmaW5lIENUUkxfQwkJMworCisjaWZuZGVmCU1BWF9URlRQX1JFVFJJRVMKKyMgZGVmaW5lIE1BWF9URlRQX1JFVFJJRVMJMjAKKyNlbmRpZgorCisjaWZuZGVmCU1BWF9CT09UUF9SRVRSSUVTCisjIGRlZmluZSBNQVhfQk9PVFBfUkVUUklFUwkyMAorI2VuZGlmCisKKyNkZWZpbmUgTUFYX0JPT1RQX0VYVExFTgkoRVRIX0ZSQU1FX0xFTiAtIEVUSF9ITEVOIC0gXAorCQkJCSBzaXplb2YgKHN0cnVjdCBib290cF90KSkKKworI2lmbmRlZglNQVhfQVJQX1JFVFJJRVMKKyMgZGVmaW5lIE1BWF9BUlBfUkVUUklFUwkyMAorI2VuZGlmCisKKyNpZm5kZWYJTUFYX1JQQ19SRVRSSUVTCisjIGRlZmluZSBNQVhfUlBDX1JFVFJJRVMJMjAKKyNlbmRpZgorCisjZGVmaW5lCVRJQ0tTX1BFUl9TRUMJCTE4CisKKy8qIEludGVyLXBhY2tldCByZXRyeSBpbiB0aWNrcyAqLworI2RlZmluZSBUSU1FT1VUCQkJKDEwICogVElDS1NfUEVSX1NFQykKKworLyogVGhlc2Ugc2V0dGluZ3MgaGF2ZSBzZW5zZSBvbmx5IGlmIGNvbXBpbGVkIHdpdGggLURDT05HRVNURUQgKi8KKy8qIHRvdGFsIHJldHJhbnNtaXNzaW9uIHRpbWVvdXQgaW4gdGlja3MgKi8KKyNkZWZpbmUgVEZUUF9USU1FT1VUCQkoMzAgKiBUSUNLU19QRVJfU0VDKQorLyogcGFja2V0IHJldHJhbnNtaXNzaW9uIHRpbWVvdXQgaW4gdGlja3MgKi8KKyNkZWZpbmUgVEZUUF9SRVhNVAkJKDMgKiBUSUNLU19QRVJfU0VDKQorCisjaWZuZGVmCU5VTEwKKyMgZGVmaW5lIE5VTEwJCQkoKHZvaWQgKikgMCkKKyNlbmRpZgorCisvKgorICAgSSdtIG1vdmluZyB0b3dhcmRzIHRoZSBkZWZpbmVkIG5hbWVzIGluIGxpbnV4L2lmX2V0aGVyLmggZm9yIGNsYXJpdHkuCisgICBUaGUgY29uZnVzaW9uIGJldHdlZW4gNjAvNjQgYW5kIDE1MTQvMTUxOCBhcm9zZSBiZWNhdXNlIHRoZSBOUzgzOTAKKyAgIGNvdW50cyB0aGUgNCBieXRlIGZyYW1lIGNoZWNrc3VtIGluIHRoZSBpbmNvbWluZyBwYWNrZXQsIGJ1dCBub3QKKyAgIGluIHRoZSBvdXRnb2luZyBwYWNrZXQuIDYwLzE1MTQgYXJlIHRoZSBjb3JyZWN0IG51bWJlcnMgZm9yIG1vc3QKKyAgIGlmIG5vdCBhbGwgb2YgdGhlIG90aGVyIE5JQyBjb250cm9sbGVycy4gSSB3aWxsIGJlIHJldGlyaW5nIHRoZQorICAgNjQvMTUxOCBkZWZpbmVzIGluIHRoZSBsZWFkLXVwIHRvIDUuMC4KKyovCisKKyNkZWZpbmUgRVRIX0FMRU4JCTYJLyogU2l6ZSBvZiBFdGhlcm5ldCBhZGRyZXNzICovCisjZGVmaW5lIEVUSF9ITEVOCQkxNAkvKiBTaXplIG9mIGV0aGVybmV0IGhlYWRlciAqLworI2RlZmluZQlFVEhfWkxFTgkJNjAJLyogTWluaW11bSBwYWNrZXQgKi8KKy8qI2RlZmluZSBFVEhfTUlOX1BBQ0tFVAkJNjQqLworI2RlZmluZQlFVEhfRlJBTUVfTEVOCQkxNTE0CS8qIE1heGltdW0gcGFja2V0ICovCisvKiNkZWZpbmUgRVRIX01BWF9QQUNLRVQJCTE1MTgqLworLyogQmVjYXVzZSBzb21lIERIQ1AvQk9PVFAgc2VydmVycyBkb24ndCB0cmVhdCB0aGUgbWF4aW11bSBsZW5ndGggdGhlIHNhbWUKKyAgIGFzIEV0aGVyYm9vdCwgc3VidHJhY3QgdGhlIHNpemUgb2YgYW4gSVAgaGVhZGVyIGFuZCB0aGF0IG9mIGFuIFVEUAorICAgaGVhZGVyLiAgKi8KKyNkZWZpbmUJRVRIX01BWF9NVFUJCShFVEhfRlJBTUVfTEVOIC0gRVRIX0hMRU4gXAorCQkJCS0gc2l6ZW9mIChzdHJ1Y3QgaXBoZHIpIFwKKwkJCQktIHNpemVvZiAoc3RydWN0IHVkcGhkcikpCisKKyNkZWZpbmUgQVJQX0NMSUVOVAkwCisjZGVmaW5lIEFSUF9TRVJWRVIJMQorI2RlZmluZSBBUlBfR0FURVdBWQkyCisjZGVmaW5lIEFSUF9ST09UU0VSVkVSCTMKKyNkZWZpbmUgQVJQX1NXQVBTRVJWRVIJNAorI2RlZmluZSBNQVhfQVJQCQlBUlBfU1dBUFNFUlZFUisxCisKKyNkZWZpbmUJUkFSUF9SRVFVRVNUCTMKKyNkZWZpbmUJUkFSUF9SRVBMWQk0CisKKyNkZWZpbmUgSVAJCTB4MDgwMAorI2RlZmluZSBBUlAJCTB4MDgwNgorI2RlZmluZQlSQVJQCQkweDgwMzUKKworI2RlZmluZSBCT09UUF9TRVJWRVIJNjcKKyNkZWZpbmUgQk9PVFBfQ0xJRU5UCTY4CisjZGVmaW5lIFRGVFBfUE9SVAk2OQorI2RlZmluZSBTVU5SUENfUE9SVAkxMTEKKworI2RlZmluZSBJUF9VRFAJCTE3CisvKiBTYW1lIGFmdGVyIGdvaW5nIHRocm91Z2ggaHRvbmwgKi8KKyNkZWZpbmUgSVBfQlJPQURDQVNUCTB4RkZGRkZGRkYKKworI2RlZmluZSBBUlBfUkVRVUVTVAkxCisjZGVmaW5lIEFSUF9SRVBMWQkyCisKKyNkZWZpbmUgQk9PVFBfUkVRVUVTVAkxCisjZGVmaW5lIEJPT1RQX1JFUExZCTIKKworI2RlZmluZSBUQUdfTEVOKHApCQkoKigocCkgKyAxKSkKKyNkZWZpbmUgUkZDMTUzM19DT09LSUUJCTk5LCAxMzAsIDgzLCA5OQorI2RlZmluZSBSRkMxNTMzX1BBRAkJMAorI2RlZmluZSBSRkMxNTMzX05FVE1BU0sJCTEKKyNkZWZpbmUgUkZDMTUzM19USU1FT0ZGU0VUCTIKKyNkZWZpbmUgUkZDMTUzM19HQVRFV0FZCQkzCisjZGVmaW5lIFJGQzE1MzNfVElNRVNFUlZFUgk0CisjZGVmaW5lIFJGQzE1MzNfSUVOMTE2TlMJNQorI2RlZmluZSBSRkMxNTMzX0ROUwkJNgorI2RlZmluZSBSRkMxNTMzX0xPR1NFUlZFUgk3CisjZGVmaW5lIFJGQzE1MzNfQ09PS0lFU0VSVkVSCTgKKyNkZWZpbmUgUkZDMTUzM19MUFJTRVJWRVIJOQorI2RlZmluZSBSRkMxNTMzX0lNUFJFU1NTRVJWRVIJMTAKKyNkZWZpbmUgUkZDMTUzM19SRVNPVVJDRVNFUlZFUgkxMQorI2RlZmluZSBSRkMxNTMzX0hPU1ROQU1FCTEyCisjZGVmaW5lIFJGQzE1MzNfQk9PVEZJTEVTSVpFCTEzCisjZGVmaW5lIFJGQzE1MzNfTUVSSVREVU1QRklMRQkxNAorI2RlZmluZSBSRkMxNTMzX0RPTUFJTk5BTUUJMTUKKyNkZWZpbmUgUkZDMTUzM19TV0FQU0VSVkVSCTE2CisjZGVmaW5lIFJGQzE1MzNfUk9PVFBBVEgJMTcKKyNkZWZpbmUgUkZDMTUzM19FWFRFTlNJT05QQVRICTE4CisjZGVmaW5lIFJGQzE1MzNfSVBGT1JXQVJESU5HCTE5CisjZGVmaW5lIFJGQzE1MzNfSVBTT1VSQ0VST1VUSU5HCTIwCisjZGVmaW5lIFJGQzE1MzNfSVBQT0xJQ1lGSUxURVIJMjEKKyNkZWZpbmUgUkZDMTUzM19JUE1BWFJFQVNTRU1CTFkJMjIKKyNkZWZpbmUgUkZDMTUzM19JUFRUTAkJMjMKKyNkZWZpbmUgUkZDMTUzM19JUE1UVQkJMjQKKyNkZWZpbmUgUkZDMTUzM19JUE1UVVBMQVRFQVUJMjUKKyNkZWZpbmUgUkZDMTUzM19JTlRNVFUJCTI2CisjZGVmaW5lIFJGQzE1MzNfSU5UTE9DQUxTVUJORVRTCTI3CisjZGVmaW5lIFJGQzE1MzNfSU5UQlJPQURDQVNUCTI4CisjZGVmaW5lIFJGQzE1MzNfSU5USUNNUERJU0NPVkVSCTI5CisjZGVmaW5lIFJGQzE1MzNfSU5USUNNUFJFU1BPTkQJMzAKKyNkZWZpbmUgUkZDMTUzM19JTlRST1VURURJU0NPVkVSIDMxCisjZGVmaW5lIFJGQzE1MzNfSU5UUk9VVEVTT0xJQ0lUCTMyCisjZGVmaW5lIFJGQzE1MzNfSU5UU1RBVElDUk9VVEVTCTMzCisjZGVmaW5lIFJGQzE1MzNfTExUUkFJTEVSRU5DQVAJMzQKKyNkZWZpbmUgUkZDMTUzM19MTEFSUENBQ0hFVE1PCTM1CisjZGVmaW5lIFJGQzE1MzNfTExFVEhFUk5FVEVOQ0FQCTM2CisjZGVmaW5lIFJGQzE1MzNfVENQVFRMCQkzNworI2RlZmluZSBSRkMxNTMzX1RDUEtFRVBBTElWRVRNTwkzOAorI2RlZmluZSBSRkMxNTMzX1RDUEtFRVBBTElWRUdCCTM5CisjZGVmaW5lIFJGQzE1MzNfTklTRE9NQUlOCTQwCisjZGVmaW5lIFJGQzE1MzNfTklTU0VSVkVSCTQxCisjZGVmaW5lIFJGQzE1MzNfTlRQU0VSVkVSCTQyCisjZGVmaW5lIFJGQzE1MzNfVkVORE9SCQk0MworI2RlZmluZSBSRkMxNTMzX05CTlMJCTQ0CisjZGVmaW5lIFJGQzE1MzNfTkJERAkJNDUKKyNkZWZpbmUgUkZDMTUzM19OQk5UCQk0NgorI2RlZmluZSBSRkMxNTMzX05CU0NPUEUJCTQ3CisjZGVmaW5lIFJGQzE1MzNfWEZTCQk0OAorI2RlZmluZSBSRkMxNTMzX1hETQkJNDkKKyNpZm5kZWYJTk9fREhDUF9TVVBQT1JUCisjZGVmaW5lIFJGQzIxMzJfUkVRX0FERFIJNTAKKyNkZWZpbmUgUkZDMjEzMl9NU0dfVFlQRQk1MworI2RlZmluZSBSRkMyMTMyX1NSVl9JRAkJNTQKKyNkZWZpbmUgUkZDMjEzMl9QQVJBTV9MSVNUCTU1CisjZGVmaW5lIFJGQzIxMzJfTUFYX1NJWkUJNTcKKyNkZWZpbmUgUkZDMjEzMl9WRU5ET1JfQ0xBU1NfSUQJNjAKKworI2RlZmluZSBESENQRElTQ09WRVIJCTEKKyNkZWZpbmUgREhDUE9GRkVSCQkyCisjZGVmaW5lIERIQ1BSRVFVRVNUCQkzCisjZGVmaW5lIERIQ1BBQ0sJCQk1CisjZW5kaWYJLyogTk9fREhDUF9TVVBQT1JUICovCisKKyNkZWZpbmUgUkZDMTUzM19WRU5ET1JfTUFKT1IJMAorI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9NSU5PUgkwCisKKyNkZWZpbmUgUkZDMTUzM19WRU5ET1JfTUFHSUMJMTI4CisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX0FERFBBUk0JMTI5CisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX01OVU9QVFMJMTYwCisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX1NFTEVDVElPTiAxNzYKKyNkZWZpbmUgUkZDMTUzM19WRU5ET1JfTU9URAkxODQKKyNkZWZpbmUgUkZDMTUzM19WRU5ET1JfTlVNT0ZNT1REIDgKKyNkZWZpbmUgUkZDMTUzM19WRU5ET1JfSU1HCTE5MgorI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9OVU1PRklNRwkxNgorCisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX0NPTkZJR0ZJTEUJMTUwCisKKyNkZWZpbmUgUkZDMTUzM19FTkQJCTI1NQorCisjZGVmaW5lIEJPT1RQX1ZFTkRPUl9MRU4JNjQKKyNpZm5kZWYJTk9fREhDUF9TVVBQT1JUCisjZGVmaW5lIERIQ1BfT1BUX0xFTgkJMzEyCisjZW5kaWYJLyogTk9fREhDUF9TVVBQT1JUICovCisKKyNkZWZpbmUJVEZUUF9ERUZBVUxUU0laRV9QQUNLRVQJNTEyCisjZGVmaW5lCVRGVFBfTUFYX1BBQ0tFVAkJMTQzMiAvKiA1MTIgKi8KKworI2RlZmluZSBURlRQX1JSUQkxCisjZGVmaW5lIFRGVFBfV1JRCTIKKyNkZWZpbmUgVEZUUF9EQVRBCTMKKyNkZWZpbmUgVEZUUF9BQ0sJNAorI2RlZmluZSBURlRQX0VSUk9SCTUKKyNkZWZpbmUgVEZUUF9PQUNLCTYKKworI2RlZmluZSBURlRQX0NPREVfRU9GCTEKKyNkZWZpbmUgVEZUUF9DT0RFX01PUkUJMgorI2RlZmluZSBURlRQX0NPREVfRVJST1IJMworI2RlZmluZSBURlRQX0NPREVfQk9PVAk0CisjZGVmaW5lIFRGVFBfQ09ERV9DRkcJNQorCisjZGVmaW5lIEFXQUlUX0FSUAkwCisjZGVmaW5lIEFXQUlUX0JPT1RQCTEKKyNkZWZpbmUgQVdBSVRfVEZUUAkyCisjZGVmaW5lIEFXQUlUX1JBUlAJMworI2RlZmluZSBBV0FJVF9SUEMJNAorI2RlZmluZSBBV0FJVF9RRFJBSU4JNQkvKiBkcmFpbiBxdWV1ZSwgcHJvY2VzcyBBUlAgcmVxdWVzdHMgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdW5zaWduZWQgbG9uZwlzX2FkZHI7Cit9Citpbl9hZGRyOworCitzdHJ1Y3QgYXJwdGFibGVfdAoreworICBpbl9hZGRyIGlwYWRkcjsKKyAgdW5zaWduZWQgY2hhciBub2RlWzZdOworfTsKKworLyoKKyAqIEEgcGl0eSBzaXBhZGRyIGFuZCB0aXBhZGRyIGFyZSBub3QgbG9uZ3dvcmQgYWxpZ25lZCBvciB3ZSBjb3VsZCB1c2UKKyAqIGluX2FkZHIuIE5vLCBJIGRvbid0IHdhbnQgdG8gdXNlICNwcmFnbWEgcGFja2VkLgorICovCitzdHJ1Y3QgYXJwcmVxdWVzdAoreworICB1bnNpZ25lZCBzaG9ydCBod3R5cGU7CisgIHVuc2lnbmVkIHNob3J0IHByb3RvY29sOworICBjaGFyIGh3bGVuOworICBjaGFyIHByb3RvbGVuOworICB1bnNpZ25lZCBzaG9ydCBvcGNvZGU7CisgIGNoYXIgc2h3YWRkcls2XTsKKyAgY2hhciBzaXBhZGRyWzRdOworICBjaGFyIHRod2FkZHJbNl07CisgIGNoYXIgdGlwYWRkcls0XTsKK307CisKK3N0cnVjdCBpcGhkcgoreworICBjaGFyIHZlcmhkcmxlbjsKKyAgY2hhciBzZXJ2aWNlOworICB1bnNpZ25lZCBzaG9ydCBsZW47CisgIHVuc2lnbmVkIHNob3J0IGlkZW50OworICB1bnNpZ25lZCBzaG9ydCBmcmFnczsKKyAgY2hhciB0dGw7CisgIGNoYXIgcHJvdG9jb2w7CisgIHVuc2lnbmVkIHNob3J0IGNoa3N1bTsKKyAgaW5fYWRkciBzcmM7CisgIGluX2FkZHIgZGVzdDsKK307CisKK3N0cnVjdCB1ZHBoZHIKK3sKKyAgdW5zaWduZWQgc2hvcnQgc3JjOworICB1bnNpZ25lZCBzaG9ydCBkZXN0OworICB1bnNpZ25lZCBzaG9ydCBsZW47CisgIHVuc2lnbmVkIHNob3J0IGNoa3N1bTsKK307CisKKy8qIEZvcm1hdCBvZiBhIGJvb3RwIHBhY2tldC4gICovCitzdHJ1Y3QgYm9vdHBfdAoreworICBjaGFyIGJwX29wOworICBjaGFyIGJwX2h0eXBlOworICBjaGFyIGJwX2hsZW47CisgIGNoYXIgYnBfaG9wczsKKyAgdW5zaWduZWQgbG9uZyBicF94aWQ7CisgIHVuc2lnbmVkIHNob3J0IGJwX3NlY3M7CisgIHVuc2lnbmVkIHNob3J0IHVudXNlZDsKKyAgaW5fYWRkciBicF9jaWFkZHI7CisgIGluX2FkZHIgYnBfeWlhZGRyOworICBpbl9hZGRyIGJwX3NpYWRkcjsKKyAgaW5fYWRkciBicF9naWFkZHI7CisgIGNoYXIgYnBfaHdhZGRyWzE2XTsKKyAgY2hhciBicF9zbmFtZVs2NF07CisgIGNoYXIgYnBfZmlsZVsxMjhdOworI2lmZGVmCU5PX0RIQ1BfU1VQUE9SVAorICBjaGFyIGJwX3ZlbmRbQk9PVFBfVkVORE9SX0xFTl07CisjZWxzZQorICBjaGFyIGJwX3ZlbmRbREhDUF9PUFRfTEVOXTsKKyNlbmRpZgkvKiBOT19ESENQX1NVUFBPUlQgKi8KK307CisKKy8qIEZvcm1hdCBvZiBhIGJvb3RwIElQIHBhY2tldC4gICovCitzdHJ1Y3QgYm9vdHBpcF90Cit7CisgIHN0cnVjdCBpcGhkciBpcDsKKyAgc3RydWN0IHVkcGhkciB1ZHA7CisgIHN0cnVjdCBib290cF90IGJwOworfTsKKworLyogRm9ybWF0IG9mIGJvb3RwIHBhY2tldCB3aXRoIGV4dGVuc2lvbnMuICAqLworc3RydWN0IGJvb3RwZF90Cit7CisgIHN0cnVjdCBib290cF90IGJvb3RwX3JlcGx5OworICB1bnNpZ25lZCBjaGFyICBib290cF9leHRlbnNpb25bTUFYX0JPT1RQX0VYVExFTl07Cit9OworCitzdHJ1Y3QgdGZ0cF90Cit7CisgIHN0cnVjdCBpcGhkciBpcDsKKyAgc3RydWN0IHVkcGhkciB1ZHA7CisgIHVuc2lnbmVkIHNob3J0IG9wY29kZTsKKyAgdW5pb24KKyAgeworICAgIGNoYXIgcnJxW1RGVFBfREVGQVVMVFNJWkVfUEFDS0VUXTsKKyAgICAKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICB1bnNpZ25lZCBzaG9ydCBibG9jazsKKyAgICAgIGNoYXIgZG93bmxvYWRbVEZUUF9NQVhfUEFDS0VUXTsKKyAgICB9CisgICAgZGF0YTsKKyAgICAKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICB1bnNpZ25lZCBzaG9ydCBibG9jazsKKyAgICB9CisgICAgYWNrOworICAgIAorICAgIHN0cnVjdAorICAgIHsKKyAgICAgIHVuc2lnbmVkIHNob3J0IGVycmNvZGU7CisgICAgICBjaGFyIGVycm1zZ1tURlRQX0RFRkFVTFRTSVpFX1BBQ0tFVF07CisgICAgfQorICAgIGVycjsKKyAgICAKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICBjaGFyIGRhdGFbVEZUUF9ERUZBVUxUU0laRV9QQUNLRVQrMl07CisgICAgfQorICAgIG9hY2s7CisgIH0KKyAgdTsKK307CisKKy8qIERlZmluZSBhIHNtYWxsZXIgdGZ0cCBwYWNrZXQgc29sZWx5IGZvciBtYWtpbmcgcmVxdWVzdHMgdG8gY29uc2VydmUgc3RhY2sKKyAgIDUxMiBieXRlcyBzaG91bGQgYmUgZW5vdWdoLiAgKi8KK3N0cnVjdCB0ZnRwcmVxX3QKK3sKKyAgc3RydWN0IGlwaGRyIGlwOworICBzdHJ1Y3QgdWRwaGRyIHVkcDsKKyAgdW5zaWduZWQgc2hvcnQgb3Bjb2RlOworICB1bmlvbgorICB7CisgICAgY2hhciBycnFbNTEyXTsKKyAgICAKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICB1bnNpZ25lZCBzaG9ydCBibG9jazsKKyAgICB9CisgICAgYWNrOworICAgIAorICAgIHN0cnVjdAorICAgIHsKKyAgICAgIHVuc2lnbmVkIHNob3J0IGVycmNvZGU7CisgICAgICBjaGFyIGVycm1zZ1s1MTItMl07CisgICAgfQorICAgIGVycjsKKyAgfQorICB1OworfTsKKworI2RlZmluZSBURlRQX01JTl9QQUNLRVQJKHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpICsgNCkKKworc3RydWN0IHJwY190Cit7CisgIHN0cnVjdCBpcGhkciBpcDsKKyAgc3RydWN0IHVkcGhkciB1ZHA7CisgIHVuaW9uCisgIHsKKyAgICBjaGFyIGRhdGFbMzAwXTsJCS8qIGxvbmdlc3QgUlBDIGNhbGwgbXVzdCBmaXQhISEhICovCisgICAgCisgICAgc3RydWN0CisgICAgeworICAgICAgbG9uZyBpZDsKKyAgICAgIGxvbmcgdHlwZTsKKyAgICAgIGxvbmcgcnBjdmVyczsKKyAgICAgIGxvbmcgcHJvZzsKKyAgICAgIGxvbmcgdmVyczsKKyAgICAgIGxvbmcgcHJvYzsKKyAgICAgIGxvbmcgZGF0YVsxXTsKKyAgICB9CisgICAgY2FsbDsKKyAgICAKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICBsb25nIGlkOworICAgICAgbG9uZyB0eXBlOworICAgICAgbG9uZyByc3RhdHVzOworICAgICAgbG9uZyB2ZXJpZmllcjsKKyAgICAgIGxvbmcgdjI7CisgICAgICBsb25nIGFzdGF0dXM7CisgICAgICBsb25nIGRhdGFbMV07CisgICAgfQorICAgIHJlcGx5OworICB9CisgIHU7Cit9OworCisjZGVmaW5lIFBST0dfUE9SVE1BUAkxMDAwMDAKKyNkZWZpbmUgUFJPR19ORlMJMTAwMDAzCisjZGVmaW5lIFBST0dfTU9VTlQJMTAwMDA1CisKKyNkZWZpbmUgTVNHX0NBTEwJMAorI2RlZmluZSBNU0dfUkVQTFkJMQorCisjZGVmaW5lIFBPUlRNQVBfR0VUUE9SVAkzCisKKyNkZWZpbmUgTU9VTlRfQURERU5UUlkJMQorI2RlZmluZSBNT1VOVF9VTU9VTlRBTEwJNAorCisjZGVmaW5lIE5GU19MT09LVVAJNAorI2RlZmluZSBORlNfUkVBRAk2CisKKyNkZWZpbmUgTkZTX0ZIU0laRQkzMgorCisjZGVmaW5lIE5GU0VSUl9QRVJNCTEKKyNkZWZpbmUgTkZTRVJSX05PRU5UCTIKKyNkZWZpbmUgTkZTRVJSX0FDQ0VTCTEzCisKKy8qIEJsb2NrIHNpemUgdXNlZCBmb3IgTkZTIHJlYWQgYWNjZXNzZXMuICBBIFJQQyByZXBseSBwYWNrZXQgKGluY2x1ZGluZyAgYWxsCisgKiBoZWFkZXJzKSBtdXN0IGZpdCB3aXRoaW4gYSBzaW5nbGUgRXRoZXJuZXQgZnJhbWUgdG8gYXZvaWQgZnJhZ21lbnRhdGlvbi4KKyAqIENob3NlbiB0byBiZSBhIHBvd2VyIG9mIHR3bywgYXMgbW9zdCBORlMgc2VydmVycyBhcmUgb3B0aW1pemVkIGZvciB0aGlzLiAgKi8KKyNkZWZpbmUgTkZTX1JFQURfU0laRQkxMDI0CisKKyNkZWZpbmUJRkxPUFBZX0JPT1RfTE9DQVRJT04JMHg3YzAwCisvKiBNdXN0IG1hdGNoIG9mZnNldHMgaW4gbG9hZGVyLlMgKi8KKyNkZWZpbmUgUk9NX1NFR01FTlQJCTB4MWZhCisjZGVmaW5lIFJPTV9MRU5HVEgJCTB4MWZjCisKKyNkZWZpbmUJUk9NX0lORk9fTE9DQVRJT04JKEZMT1BQWV9CT09UX0xPQ0FUSU9OICsgUk9NX1NFR01FTlQpCisvKiBhdCBlbmQgb2YgZmxvcHB5IGJvb3QgYmxvY2sgKi8KKworc3RydWN0IHJvbV9pbmZvCit7CisgIHVuc2lnbmVkIHNob3J0CXJvbV9zZWdtZW50OworICB1bnNpZ25lZCBzaG9ydAlyb21fbGVuZ3RoOworfTsKKworc3RhdGljIGlubGluZSBpbnQKK3JvbV9hZGRyZXNzX29rIChzdHJ1Y3Qgcm9tX2luZm8gKnJvbSwgaW50IGFzc2lnbmVkX3JvbV9zZWdtZW50KQoreworICByZXR1cm4gKGFzc2lnbmVkX3JvbV9zZWdtZW50IDwgMHhDMDAwCisJICB8fCBhc3NpZ25lZF9yb21fc2VnbWVudCA9PSByb20tPnJvbV9zZWdtZW50KTsKK30KKworLyogRGVmaW5lIGEgdHlwZSBmb3IgcGFzc2luZyBpbmZvIHRvIGEgbG9hZGVkIHByb2dyYW0uICAqLworc3RydWN0IGViaW5mbworeworICB1bnNpZ25lZCBjaGFyCW1ham9yLCBtaW5vcjsJLyogVmVyc2lvbiAqLworICB1bnNpZ25lZCBzaG9ydAlmbGFnczsJCS8qIEJpdCBmbGFncyAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRXh0ZXJuYWwgcHJvdG90eXBlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogbWFpbi5jICovCitleHRlcm4gdm9pZCBwcmludF9uZXR3b3JrX2NvbmZpZ3VyYXRpb24gKHZvaWQpOworZXh0ZXJuIGludCBpZmNvbmZpZyAoY2hhciAqaXAsIGNoYXIgKnNtLCBjaGFyICpndywgY2hhciAqc3ZyKTsKK2V4dGVybiBpbnQgdWRwX3RyYW5zbWl0ICh1bnNpZ25lZCBsb25nIGRlc3RpcCwgdW5zaWduZWQgaW50IHNyY3NvY2ssCisJCQkgdW5zaWduZWQgaW50IGRlc3Rzb2NrLCBpbnQgbGVuLCBjb25zdCB2b2lkICpidWYpOworZXh0ZXJuIGludCBhd2FpdF9yZXBseSAoaW50IHR5cGUsIGludCBpdmFsLCB2b2lkICpwdHIsIGludCB0aW1lb3V0KTsKK2V4dGVybiBpbnQgZGVjb2RlX3JmYzE1MzMgKHVuc2lnbmVkIGNoYXIgKiwgaW50LCBpbnQsIGludCk7CitleHRlcm4gbG9uZyByZmMyMTMxX3NsZWVwX2ludGVydmFsIChpbnQgYmFzZSwgaW50IGV4cCk7CitleHRlcm4gdm9pZCBjbGVhbnVwICh2b2lkKTsKK2V4dGVybiBpbnQgcmFycCAodm9pZCk7CitleHRlcm4gaW50IGJvb3RwICh2b2lkKTsKK2V4dGVybiB2b2lkIGNsZWFudXBfbmV0ICh2b2lkKTsKKworLyogY29uZmlnLmMgKi8KK2V4dGVybiB2b2lkIHByaW50X2NvbmZpZyAodm9pZCk7CitleHRlcm4gdm9pZCBldGhfcmVzZXQgKHZvaWQpOworZXh0ZXJuIGludCBldGhfcHJvYmUgKHZvaWQpOworZXh0ZXJuIGludCBldGhfcG9sbCAodm9pZCk7CitleHRlcm4gdm9pZCBldGhfdHJhbnNtaXQgKGNvbnN0IGNoYXIgKmQsIHVuc2lnbmVkIGludCB0LAorCQkJICB1bnNpZ25lZCBpbnQgcywgY29uc3Qgdm9pZCAqcCk7CitleHRlcm4gdm9pZCBldGhfZGlzYWJsZSAodm9pZCk7CisKKy8qIG1pc2MuYyAqLworZXh0ZXJuIHZvaWQgdHdpZGRsZSAodm9pZCk7CitleHRlcm4gdm9pZCBzbGVlcCAoaW50IHNlY3MpOworZXh0ZXJuIGludCBnZXRkZWMgKGNoYXIgKipzKTsKK2V4dGVybiB2b2lkIGV0aGVyYm9vdF9wcmludGYgKGNvbnN0IGNoYXIgKiwgLi4uKTsKK2V4dGVybiBpbnQgZXRoZXJib290X3NwcmludGYgKGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOworZXh0ZXJuIGludCBpbmV0X2F0b24gKGNoYXIgKnAsIGluX2FkZHIgKmkpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitFeHRlcm5hbCB2YXJpYWJsZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIG1haW4uYyAqLworZXh0ZXJuIGludCBpcF9hYm9ydDsKK2V4dGVybiBpbnQgbmV0d29ya19yZWFkeTsKK2V4dGVybiBzdHJ1Y3Qgcm9tX2luZm8gcm9tOworZXh0ZXJuIHN0cnVjdCBhcnB0YWJsZV90IGFycHRhYmxlW01BWF9BUlBdOworZXh0ZXJuIHN0cnVjdCBib290cGRfdCBib290cF9kYXRhOworI2RlZmluZQlCT09UUF9EQVRBX0FERFIJKCZib290cF9kYXRhKQorZXh0ZXJuIHVuc2lnbmVkIGNoYXIgKmVuZF9vZl9yZmMxNTMzOworCisvKiBjb25maWcuYyAqLworZXh0ZXJuIHN0cnVjdCBuaWMgbmljOworCisvKiBMb2NhbCBoYWNrIC0gZGVmaW5lIHNvbWUgbWFjcm9zIHRvIHVzZSBldGhlcmJvb3Qgc291cmNlIGZpbGVzICJhcyBpcyIuICAqLworI2lmbmRlZiBHUlVCCisjIHVuZGVmIHByaW50ZgorIyBkZWZpbmUgcHJpbnRmCWV0aGVyYm9vdF9wcmludGYKKyMgdW5kZWYgc3ByaW50ZgorIyBkZWZpbmUgc3ByaW50ZiBldGhlcmJvb3Rfc3ByaW50ZgorI2VuZGlmIC8qIEdSVUIgKi8KZGlmZiAtLWdpdCBhL25ldGJvb3QvZmEzMTEuYyBiL25ldGJvb3QvZmEzMTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjkyYTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9mYTMxMS5jCkBAIC0wLDAgKzEsNDIxIEBACisvKgorICAgICAgICBEcml2ZXIgZm9yIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIERQODM4MTAgRXRoZXJuZXQgY29udHJvbGxlci4KKyAgICAgICAgCisgICAgICAgIFBvcnRpb25zIENvcHlyaWdodCAoQykgMjAwMSBJbnByaW1pcyBUZWNobm9sb2dpZXMsIEluYy4KKyAgICAgICAgaHR0cDovL3d3dy5pbnByaW1pcy5jb20vCisgICAgICAgIAorICAgICAgICBUaGlzIGRyaXZlciBpcyBiYXNlZCAoaGVhdmlseSkgb24gdGhlIExpbnV4IGRyaXZlciBmb3IgdGhpcyBjaGlwIAorICAgICAgICB3aGljaCBpcyBjb3B5cmlnaHQgMTk5OS0yMDAxIGJ5IERvbmFsZCBCZWNrZXIuCisKKyAgICAgICAgVGhpcyBzb2Z0d2FyZSBoYXMgbm8gd2FycmFudGllcyBleHByZXNzZWQgb3IgaW1wbGllZCBmb3IgYW55CisgICAgICAgIHB1cnBvc2UuCisKKyAgICAgICAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorICAgICAgICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICAgICAgICBEcml2ZXJzIGJhc2VkIG9uIG9yIGRlcml2ZWQgZnJvbSB0aGlzIGNvZGUgZmFsbCB1bmRlciB0aGUgR1BMIGFuZCBtdXN0CisgICAgICAgIHJldGFpbiB0aGUgYXV0aG9yc2hpcCwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIG5vdGljZS4gIFRoaXMgZmlsZSBpcyBub3QKKyAgICAgICAgYSBjb21wbGV0ZSBwcm9ncmFtIGFuZCBtYXkgb25seSBiZSB1c2VkIHdoZW4gdGhlIGVudGlyZSBvcGVyYXRpbmcKKyAgICAgICAgc3lzdGVtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuICBMaWNlbnNlIGZvciB1bmRlciBvdGhlciB0ZXJtcyBtYXkgYmUKKyAgICAgICAgYXZhaWxhYmxlLiAgQ29udGFjdCB0aGUgb3JpZ2luYWwgYXV0aG9yIGZvciBkZXRhaWxzLgorCisgICAgICAgIFRoZSBvcmlnaW5hbCBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgYXQKKyAgICAgICAgU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisgICAgICAgIDQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisgICAgICAgIEFubmFwb2xpcyBNRCAyMTQwMworKi8KKworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIHU4OwordHlwZWRlZiAgIHNpZ25lZCBjaGFyICBzODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdTE2OwordHlwZWRlZiAgIHNpZ25lZCBzaG9ydCBzMTY7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgIHUzMjsKK3R5cGVkZWYgICBzaWduZWQgaW50ICAgczMyOworCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisjaW5jbHVkZSAibmljLmgiCisjaW5jbHVkZSAicGNpLmgiCisKKyN1bmRlZgl2aXJ0X3RvX2J1cworI2RlZmluZQl2aXJ0X3RvX2J1cyh4KSAgICAgICAgICAoKHVuc2lnbmVkIGxvbmcpeCkKKyNkZWZpbmUgY3B1X3RvX2xlMzIodmFsKSAgICAgICAgKHZhbCkKKyNkZWZpbmUgbGUzMl90b19jcHUodmFsKSAgICAgICAgKHZhbCkKKyNkZWZpbmUgdmlydF90b19sZTMyZGVzYyhhZGRyKSAgY3B1X3RvX2xlMzIodmlydF90b19idXMoYWRkcikpCisjZGVmaW5lIGxlMzJkZXNjX3RvX3ZpcnQoYWRkcikgIGJ1c190b192aXJ0KGxlMzJfdG9fY3B1KGFkZHIpKQorCisjZGVmaW5lIFRYX1JJTkdfU0laRSAxCisjZGVmaW5lIFJYX1JJTkdfU0laRSA0CisjZGVmaW5lIFRJTUVfT1VUICAgICAxMDAwMDAwCisjZGVmaW5lIFBLVF9CVUZfU1ogICAxNTM2CisKKy8qIE9mZnNldHMgdG8gdGhlIGRldmljZSByZWdpc3RlcnMuICovCitlbnVtIHJlZ2lzdGVyX29mZnNldHMgeworICAgIENoaXBDbWQ9MHgwMCwgQ2hpcENvbmZpZz0weDA0LCBFRUN0cmw9MHgwOCwgUENJQnVzQ2ZnPTB4MEMsCisgICAgSW50clN0YXR1cz0weDEwLCBJbnRyTWFzaz0weDE0LCBJbnRyRW5hYmxlPTB4MTgsCisgICAgVHhSaW5nUHRyPTB4MjAsIFR4Q29uZmlnPTB4MjQsCisgICAgUnhSaW5nUHRyPTB4MzAsIFJ4Q29uZmlnPTB4MzQsCisgICAgV09MQ21kPTB4NDAsIFBhdXNlQ21kPTB4NDQsIFJ4RmlsdGVyQWRkcj0weDQ4LCBSeEZpbHRlckRhdGE9MHg0QywKKyAgICBCb290Um9tQWRkcj0weDUwLCBCb290Um9tRGF0YT0weDU0LCBTdGF0c0N0cmw9MHg1QywgU3RhdHNEYXRhPTB4NjAsCisgICAgUnhQa3RFcnJzPTB4NjAsIFJ4TWlzc2VkPTB4NjgsIFJ4Q1JDRXJycz0weDY0LAorfTsKKworLyogQml0IGluIENoaXBDbWQuICovCitlbnVtIENoaXBDbWRCaXRzIHsKKyAgICBDaGlwUmVzZXQ9MHgxMDAsIFJ4UmVzZXQ9MHgyMCwgVHhSZXNldD0weDEwLCBSeE9mZj0weDA4LCBSeE9uPTB4MDQsCisgICAgVHhPZmY9MHgwMiwgVHhPbj0weDAxLAorfTsKKworLyogQml0cyBpbiB0aGUgaW50ZXJydXB0IHN0YXR1cy9tYXNrIHJlZ2lzdGVycy4gKi8KK2VudW0gaW50cl9zdGF0dXNfYml0cyB7CisgICAgSW50clJ4RG9uZT0weDAwMDEsIEludHJSeEludHI9MHgwMDAyLCBJbnRyUnhFcnI9MHgwMDA0LCBJbnRyUnhFYXJseT0weDAwMDgsCisgICAgSW50clJ4SWRsZT0weDAwMTAsIEludHJSeE92ZXJydW49MHgwMDIwLAorICAgIEludHJUeERvbmU9MHgwMDQwLCBJbnRyVHhJbnRyPTB4MDA4MCwgSW50clR4RXJyPTB4MDEwMCwKKyAgICBJbnRyVHhJZGxlPTB4MDIwMCwgSW50clR4VW5kZXJydW49MHgwNDAwLAorICAgIFN0YXRzTWF4PTB4MDgwMCwgTGlua0NoYW5nZT0weDQwMDAsCVdPTFBrdD0weDIwMDAsCisgICAgUnhSZXNldERvbmU9MHgxMDAwMDAwLCBUeFJlc2V0RG9uZT0weDIwMDAwMDAsCisgICAgSW50clBDSUVycj0weDAwZjAwMDAwLCBJbnRyTm9ybWFsU3VtbWFyeT0weDAyNTEsIEludHJBYm5vcm1hbFN1bW1hcnk9MHhFRDIwLAorfTsKKworLyogQml0cyBpbiB0aGUgUnhNb2RlIHJlZ2lzdGVyLiAqLworZW51bSByeF9tb2RlX2JpdHMgeworICAgIEFjY2VwdEVycj0weDIwLCBBY2NlcHRSdW50PTB4MTAsIEFjY2VwdEJyb2FkY2FzdD0weEMwMDAwMDAwLAorICAgIEFjY2VwdE11bHRpY2FzdD0weDAwMjAwMDAwLCBBY2NlcHRBbGxNdWx0aWNhc3Q9MHgyMDAwMDAwMCwKKyAgICBBY2NlcHRBbGxQaHlzPTB4MTAwMDAwMDAsIEFjY2VwdE15UGh5cz0weDA4MDAwMDAwLAorfTsKKworLyogQml0cyBpbiBuZXR3b3JrX2Rlc2Muc3RhdHVzICovCitlbnVtIGRlc2Nfc3RhdHVzX2JpdHMgeworICAgIERlc2NPd249MHg4MDAwMDAwMCwgRGVzY01vcmU9MHg0MDAwMDAwMCwgRGVzY0ludHI9MHgyMDAwMDAwMCwKKyAgICBEZXNjTm9DUkM9MHgxMDAwMDAwMCwKKyAgICBEZXNjUGt0T0s9MHgwODAwMDAwMCwgUnhUb29Mb25nPTB4MDA0MDAwMDAsCit9OworCisvKiBUaGUgUnggYW5kIFR4IGJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KK3N0cnVjdCBuZXRkZXZfZGVzYyB7CisgICAgdTMyIG5leHRfZGVzYzsKKyAgICBzMzIgY21kX3N0YXR1czsKKyAgICB1MzIgYWRkcjsKK307CisKK3N0YXRpYyBzdHJ1Y3QgRkEzMTFfREVWIHsKKyAgICB1bnNpZ25lZCBpbnQgICAgaW9hZGRyOworICAgIHVuc2lnbmVkIHNob3J0ICB2ZW5kb3I7CisgICAgdW5zaWduZWQgc2hvcnQgIGRldmljZTsKKyAgICB1bnNpZ25lZCBpbnQgICAgY3VyX3J4OworICAgIHVuc2lnbmVkIGludCAgICBjdXJfdHg7CisgICAgdW5zaWduZWQgaW50ICAgIHJ4X2J1Zl9zejsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgbmV0ZGV2X2Rlc2MgKnJ4X2hlYWRfZGVzYzsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgbmV0ZGV2X2Rlc2MgcnhfcmluZ1tSWF9SSU5HX1NJWkVdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg0KSkpOworICAgIHZvbGF0aWxlIHN0cnVjdCBuZXRkZXZfZGVzYyB0eF9yaW5nW1RYX1JJTkdfU0laRV0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDQpKSk7Cit9IGZhMzExX2RldjsKKworc3RhdGljIGludCAgZWVwcm9tX3JlYWQobG9uZyBpb2FkZHIsIGludCBsb2NhdGlvbik7CitzdGF0aWMgdm9pZCBpbml0X3Jpbmcoc3RydWN0IEZBMzExX0RFViAqZGV2KTsKK3N0YXRpYyB2b2lkIGZhMzExX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYyk7CitzdGF0aWMgaW50ICBmYTMxMV9wb2xsKHN0cnVjdCBuaWMgKm5pYyk7CitzdGF0aWMgdm9pZCBmYTMxMV90cmFuc21pdChzdHJ1Y3QgbmljICpuaWMsIGNvbnN0IGNoYXIgKmQsIHVuc2lnbmVkIGludCB0LCB1bnNpZ25lZCBpbnQgcywgY29uc3QgY2hhciAqcCk7CitzdGF0aWMgdm9pZCBmYTMxMV9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYyk7CisKK3N0YXRpYyBjaGFyIHJ4X3BhY2tldFtQS1RfQlVGX1NaICogUlhfUklOR19TSVpFXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNCkpKTsKK3N0YXRpYyBjaGFyIHR4X3BhY2tldFtQS1RfQlVGX1NaICogVFhfUklOR19TSVpFXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNCkpKTsKKworc3RydWN0IG5pYyAqIGZhMzExX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKmlvX2FkZHJzLCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQoreworaW50ICAgICAgICAgICAgcHJldl9lZWRhdGE7CitpbnQgICAgICAgICAgICBpOworaW50ICAgICAgICAgICAgZHVwbGV4OworaW50ICAgICAgICAgICAgdHhfY29uZmlnOworaW50ICAgICAgICAgICAgcnhfY29uZmlnOwordW5zaWduZWQgY2hhciAgbWFjYWRkcls2XTsKK3Vuc2lnbmVkIGNoYXIgIG1hY3Rlc3Q7Cit1bnNpZ25lZCBjaGFyICBwY2lfYnVzID0gMDsKK3N0cnVjdCBGQTMxMV9ERVYqIGRldiA9ICZmYTMxMV9kZXY7CisJCisgICAgaWYgKGlvX2FkZHJzID09IDAgfHwgKmlvX2FkZHJzID09IDApCisgICAgICAgIHJldHVybiAoMCk7CisgICAgbWVtc2V0KGRldiwgMCwgc2l6ZW9mKCpkZXYpKTsKKyAgICBkZXYtPnZlbmRvciA9IHBjaS0+dmVuZG9yOworICAgIGRldi0+ZGV2aWNlID0gcGNpLT5kZXZfaWQ7CisgICAgZGV2LT5pb2FkZHIgPSBwY2ktPm1lbWJhc2U7CisKKyAgICAvKiBXb3JrIGFyb3VuZCB0aGUgZHJvcHBlZCBzZXJpYWwgYml0LiAqLworICAgIHByZXZfZWVkYXRhID0gZWVwcm9tX3JlYWQoZGV2LT5pb2FkZHIsIDYpOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgaW50IGVlZGF0YSA9IGVlcHJvbV9yZWFkKGRldi0+aW9hZGRyLCBpICsgNyk7CisgICAgICAgIG1hY2FkZHJbaSoyXSA9IChlZWRhdGEgPDwgMSkgKyAocHJldl9lZWRhdGEgPj4gMTUpOworICAgICAgICBtYWNhZGRyW2kqMisxXSA9IGVlZGF0YSA+PiA3OworICAgICAgICBwcmV2X2VlZGF0YSA9IGVlZGF0YTsKKyAgICB9CisgICAgbWFjdGVzdCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgbWFjdGVzdCB8PSBtYWNhZGRyW2ldOworICAgIGlmIChtYWN0ZXN0ID09IDApCisgICAgICAgIHJldHVybiAoMCk7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgbmljLT5ub2RlX2FkZHJbaV0gPSBtYWNhZGRyW2ldOworICAgIHByaW50ZigiJSEgIiwgbmljLT5ub2RlX2FkZHIpOworCisgICAgYWRqdXN0X3BjaV9kZXZpY2UocGNpKTsKKworICAgIGZhMzExX3Jlc2V0KG5pYyk7CisKKyAgICBuaWMtPnJlc2V0ID0gZmEzMTFfcmVzZXQ7CisgICAgbmljLT5kaXNhYmxlID0gZmEzMTFfZGlzYWJsZTsKKyAgICBuaWMtPnBvbGwgPSBmYTMxMV9wb2xsOworICAgIG5pYy0+dHJhbnNtaXQgPSBmYTMxMV90cmFuc21pdDsKKworICAgIGluaXRfcmluZyhkZXYpOworCisgICAgd3JpdGVsKHZpcnRfdG9fYnVzKGRldi0+cnhfcmluZyksIGRldi0+aW9hZGRyICsgUnhSaW5nUHRyKTsKKyAgICB3cml0ZWwodmlydF90b19idXMoZGV2LT50eF9yaW5nKSwgZGV2LT5pb2FkZHIgKyBUeFJpbmdQdHIpOworCisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkgKz0gMikKKyAgICB7CisgICAgICAgIHdyaXRlbChpLCBkZXYtPmlvYWRkciArIFJ4RmlsdGVyQWRkcik7CisgICAgICAgIHdyaXRldyhtYWNhZGRyW2ldICsgKG1hY2FkZHJbaSsxXSA8PCA4KSwKKyAgICAgICAgICAgICAgIGRldi0+aW9hZGRyICsgUnhGaWx0ZXJEYXRhKTsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIG90aGVyIHJlZ2lzdGVycy4gKi8KKyAgICAvKiBDb25maWd1cmUgZm9yIHN0YW5kYXJkLCBpbi1zcGVjIEV0aGVybmV0LiAqLworICAgIGlmIChyZWFkbChkZXYtPmlvYWRkciArIENoaXBDb25maWcpICYgMHgyMDAwMDAwMCkKKyAgICB7ICAgIC8qIEZ1bGwgZHVwbGV4ICovCisgICAgICAgIHR4X2NvbmZpZyA9IDB4RDA4MDEwMDI7CisgICAgICAgIHJ4X2NvbmZpZyA9IDB4MTAwMDAwMjA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHR4X2NvbmZpZyA9IDB4MTA4MDEwMDI7CisgICAgICAgIHJ4X2NvbmZpZyA9IDB4MDAyMDsKKyAgICB9CisgICAgd3JpdGVsKHR4X2NvbmZpZywgZGV2LT5pb2FkZHIgKyBUeENvbmZpZyk7CisgICAgd3JpdGVsKHJ4X2NvbmZpZywgZGV2LT5pb2FkZHIgKyBSeENvbmZpZyk7CisKKyAgICBkdXBsZXggPSByZWFkbChkZXYtPmlvYWRkciArIENoaXBDb25maWcpICYgMHgyMDAwMDAwMCA/IDEgOiAwOworICAgIGlmIChkdXBsZXgpIHsKKyAgICAgICAgcnhfY29uZmlnIHw9IDB4MTAwMDAwMDA7CisgICAgICAgIHR4X2NvbmZpZyB8PSAweEMwMDAwMDAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJ4X2NvbmZpZyAmPSB+MHgxMDAwMDAwMDsKKyAgICAgICAgdHhfY29uZmlnICY9IH4weEMwMDAwMDAwOworICAgIH0KKyAgICB3cml0ZXcodHhfY29uZmlnLCBkZXYtPmlvYWRkciArIFR4Q29uZmlnKTsKKyAgICB3cml0ZXcocnhfY29uZmlnLCBkZXYtPmlvYWRkciArIFJ4Q29uZmlnKTsKKworICAgIHdyaXRlbChBY2NlcHRCcm9hZGNhc3QgfCBBY2NlcHRBbGxNdWx0aWNhc3QgfCBBY2NlcHRNeVBoeXMsIAorICAgICAgICAgICBkZXYtPmlvYWRkciArIFJ4RmlsdGVyQWRkcik7CisKKyAgICB3cml0ZWwoUnhPbiB8IFR4T24sIGRldi0+aW9hZGRyICsgQ2hpcENtZCk7CisgICAgd3JpdGVsKDQsIGRldi0+aW9hZGRyICsgU3RhdHNDdHJsKTsgICAgICAgICAgICAgIC8qIENsZWFyIFN0YXRzICovCisgICAgcmV0dXJuIG5pYzsJCisKK30KKworc3RhdGljIHZvaWQgZmEzMTFfcmVzZXQoc3RydWN0IG5pYyAqbmljKQorewordTMyIGNoaXBfY29uZmlnOworc3RydWN0IEZBMzExX0RFViogZGV2ID0gJmZhMzExX2RldjsKKworICAgIC8qIFJlc2V0IHRoZSBjaGlwIHRvIGVyYXNlIHByZXZpb3VzIG1pc2NvbmZpZ3VyYXRpb24uICovCisgICAgb3V0bChDaGlwUmVzZXQsIGRldi0+aW9hZGRyICsgQ2hpcENtZCk7CisKKyAgICBpZiAoKHJlYWRsKGRldi0+aW9hZGRyICsgQ2hpcENvbmZpZykgJiAweGUwMDApICE9IDB4ZTAwMCkKKyAgICB7CisgICAgICAgIGNoaXBfY29uZmlnID0gcmVhZGwoZGV2LT5pb2FkZHIgKyBDaGlwQ29uZmlnKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZmEzMTFfcG9sbChzdHJ1Y3QgbmljICpuaWMpCit7CitzMzIgZGVzY19zdGF0dXM7CitpbnQgdG87CitpbnQgZW50cnk7CitpbnQgcmV0Y29kZTsKK3N0cnVjdCBGQTMxMV9ERVYqIGRldiA9ICZmYTMxMV9kZXY7CisKKyAgICByZXRjb2RlID0gMDsKKyAgICBlbnRyeSA9IGRldi0+Y3VyX3J4OworICAgIHRvID0gVElNRV9PVVQ7CisgICAgd2hpbGUgKHRvICE9IDApCisgICAgeworICAgICAgICBkZXNjX3N0YXR1cyA9IGRldi0+cnhfcmluZ1tlbnRyeV0uY21kX3N0YXR1czsKKyAgICAgICAgaWYgKChkZXNjX3N0YXR1cyAmIERlc2NPd24pICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgLS10bzsKKyAgICB9CisgICAgaWYgKHRvICE9IDApCisgICAgeworICAgICAgICByZWFkbChkZXYtPmlvYWRkciArIEludHJTdGF0dXMpOyAgICAgICAgIC8qIGNsZWFyIGludGVycnJ1cHQgYml0cyAqLworICAgICAgICAvKiBkcml2ZXIgb3ducyB0aGUgbmV4dCBlbnRyeSBpdCdzIGEgbmV3IHBhY2tldC4gU2VuZCBpdCB1cC4gKi8KKyAgICAgICAgaWYgKChkZXNjX3N0YXR1cyAmIChEZXNjTW9yZXxEZXNjUGt0T0t8UnhUb29Mb25nKSkgPT0gRGVzY1BrdE9LKQorICAgICAgICB7CisgICAgICAgICAgICBuaWMtPnBhY2tldGxlbiA9IChkZXNjX3N0YXR1cyAmIDB4MGZmZikgLSA0OyAgICAvKiBPbWl0IENSQyBzaXplLiAqLworICAgICAgICAgICAgbWVtY3B5KG5pYy0+cGFja2V0LCAoY2hhciopKGRldi0+cnhfcmluZ1tlbnRyeV0uYWRkciksIG5pYy0+cGFja2V0bGVuKTsKKyAgICAgICAgICAgIHJldGNvZGUgPSAxOworICAgICAgICB9CisgICAgICAgIC8qIEdpdmUgdGhlIGRlc2NyaXB0b3IgYmFjayB0byB0aGUgY2hpcCAqLworICAgICAgICBkZXYtPnJ4X3JpbmdbZW50cnldLmNtZF9zdGF0dXMgPSBjcHVfdG9fbGUzMihkZXYtPnJ4X2J1Zl9zeik7CisgICAgICAgIGRldi0+Y3VyX3J4Kys7CisgICAgICAgIGlmIChkZXYtPmN1cl9yeCA+PSBSWF9SSU5HX1NJWkUpCisgICAgICAgICAgICBkZXYtPmN1cl9yeCA9IDA7CisgICAgICAgIGRldi0+cnhfaGVhZF9kZXNjID0gJmRldi0+cnhfcmluZ1tkZXYtPmN1cl9yeF07CisgICAgfQorICAgIC8qIFJlc3RhcnQgUnggZW5naW5lIGlmIHN0b3BwZWQuICovCisgICAgd3JpdGVsKFJ4T24sIGRldi0+aW9hZGRyICsgQ2hpcENtZCk7CisgICAgcmV0dXJuIHJldGNvZGU7Cit9CisKK3N0YXRpYyB2b2lkIGZhMzExX3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYywgY29uc3QgY2hhciAqZGVzdGFkZHIsIHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgbGVuLCBjb25zdCBjaGFyICpkYXRhKQorewordW5zaWduZWQgc2hvcnQgbnN0eXBlOworczMyICAgICAgICAgICAgZGVzY19zdGF0dXM7CitpbnQgICAgICAgICAgICB0bzsKK2ludCAgICAgICAgICAgIGVudHJ5OworY2hhciogICAgICAgICAgdHhwOwordW5zaWduZWQgY2hhciogczsKK3N0cnVjdCBGQTMxMV9ERVYqIGRldiA9ICZmYTMxMV9kZXY7CisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIG5leHQgVHggZGVzY3JpcHRvciBlbnRyeS4gKi8KKyAgICBlbnRyeSA9IGRldi0+Y3VyX3R4OworICAgIHR4cCA9IChjaGFyKikoZGV2LT50eF9yaW5nW2VudHJ5XS5hZGRyKTsKKworICAgIG1lbWNweSh0eHAsIGRlc3RhZGRyLCBFVEhfQUxFTik7CisgICAgbWVtY3B5KHR4cCArIEVUSF9BTEVOLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOworICAgIG5zdHlwZSA9IGh0b25zKHR5cGUpOworICAgIG1lbWNweSh0eHAgKyAxMiwgKGNoYXIqKSZuc3R5cGUsIDIpOworICAgIG1lbWNweSh0eHAgKyBFVEhfSExFTiwgZGF0YSwgbGVuKTsKKyAgICBsZW4gKz0gRVRIX0hMRU47CisgICAgLyogcGFkIGZyYW1lICovCisgICAgaWYgKGxlbiA8ICBFVEhfWkxFTikKKyAgICB7CisgICAgICAgIHMgPSAodW5zaWduZWQgY2hhciopKHR4cCtsZW4pOworICAgICAgICB3aGlsZSAocyA8ICh1bnNpZ25lZCBjaGFyKikodHhwK0VUSF9aTEVOKSkKKyAgICAgICAgICAgICpzKysgPSAwOworICAgICAgICBsZW4gPSBFVEhfWkxFTjsKKyAgICB9CisgICAgZGV2LT50eF9yaW5nW2VudHJ5XS5jbWRfc3RhdHVzID0gY3B1X3RvX2xlMzIoRGVzY093biB8IGxlbik7CisgICAgZGV2LT5jdXJfdHgrKzsKKyAgICBpZiAoZGV2LT5jdXJfdHggPj0gVFhfUklOR19TSVpFKQorICAgICAgICBkZXYtPmN1cl90eCA9IDA7CisKKyAgICAvKiBXYWtlIHRoZSBwb3RlbnRpYWxseS1pZGxlIHRyYW5zbWl0IGNoYW5uZWwuICovCisgICAgd3JpdGVsKFR4T24sIGRldi0+aW9hZGRyICsgQ2hpcENtZCk7CisKKyAgICAvKiB3YWl0IGZvciB0cmFubWlzc2lvbiB0byBjb21wbGV0ZSAqLworICAgIHRvID0gVElNRV9PVVQ7CisgICAgd2hpbGUgKHRvICE9IDApCisgICAgeworICAgICAgICBkZXNjX3N0YXR1cyA9IGRldi0+dHhfcmluZ1tlbnRyeV0uY21kX3N0YXR1czsKKyAgICAgICAgaWYgKChkZXNjX3N0YXR1cyAmIERlc2NPd24pID09IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgLS10bzsKKyAgICB9CisKKyAgICByZWFkbChkZXYtPmlvYWRkciArIEludHJTdGF0dXMpOyAgICAgICAgIC8qIGNsZWFyIGludGVycnJ1cHQgYml0cyAqLworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgZmEzMTFfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpCit7CitzdHJ1Y3QgRkEzMTFfREVWKiBkZXYgPSAmZmEzMTFfZGV2OworCisgICAgLyogU3RvcCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBwcm9jZXNzZXMuICovCisgICAgd3JpdGVsKFJ4T2ZmIHwgVHhPZmYsIGRldi0+aW9hZGRyICsgQ2hpcENtZCk7Cit9CisKKworLyogUmVhZCB0aGUgRUVQUk9NIGFuZCBNSUkgTWFuYWdlbWVudCBEYXRhIEkvTyAoTURJTykgaW50ZXJmYWNlcy4KKyAgIFRoZSBFRVBST00gY29kZSBpcyBmb3IgdGhlIGNvbW1vbiA5M2MwNi80NiBFRVBST01zIHdpdGggNiBiaXQgYWRkcmVzc2VzLiAqLworCisvKiBEZWxheSBiZXR3ZWVuIEVFUFJPTSBjbG9jayB0cmFuc2l0aW9ucy4KKyAgIE5vIGV4dHJhIGRlbGF5IGlzIG5lZWRlZCB3aXRoIDMzTWh6IFBDSSwgYnV0IGZ1dHVyZSA2Nk1oeiBhY2Nlc3MgbWF5IG5lZWQKKyAgIGEgZGVsYXkuICBOb3RlIHRoYXQgcHJlLTIuMC4zNCBrZXJuZWxzIGhhZCBhIGNhY2hlLWFsaWdubWVudCBidWcgdGhhdAorICAgbWFkZSB1ZGVsYXkoKSB1bnJlbGlhYmxlLgorICAgVGhlIG9sZCBtZXRob2Qgb2YgdXNpbmcgYW4gSVNBIGFjY2VzcyBhcyBhIGRlbGF5LCBfX1NMT1dfRE9XTl9JT19fLCBpcworICAgZGVwcmljYXRlZC4KKyovCisjZGVmaW5lIGVlcHJvbV9kZWxheShlZV9hZGRyKQlpbmwoZWVfYWRkcikKKworZW51bSBFRVBST01fQ3RybF9CaXRzIHsKKwlFRV9TaGlmdENsaz0weDA0LCBFRV9EYXRhSW49MHgwMSwgRUVfQ2hpcFNlbGVjdD0weDA4LCBFRV9EYXRhT3V0PTB4MDIsCit9OworI2RlZmluZSBFRV9Xcml0ZTAgKEVFX0NoaXBTZWxlY3QpCisjZGVmaW5lIEVFX1dyaXRlMSAoRUVfQ2hpcFNlbGVjdCB8IEVFX0RhdGFJbikKKworLyogVGhlIEVFUFJPTSBjb21tYW5kcyBpbmNsdWRlIHRoZSBhbHdheS1zZXQgbGVhZGluZyBiaXQuICovCitlbnVtIEVFUFJPTV9DbWRzIHsKKwlFRV9Xcml0ZUNtZD0oNSA8PCA2KSwgRUVfUmVhZENtZD0oNiA8PCA2KSwgRUVfRXJhc2VDbWQ9KDcgPDwgNiksCit9OworCisKK3N0YXRpYyBpbnQgZWVwcm9tX3JlYWQobG9uZyBhZGRyLCBpbnQgbG9jYXRpb24pCit7CisJaW50IGk7CisJaW50IHJldHZhbCA9IDA7CisJaW50IGVlX2FkZHIgPSBhZGRyICsgRUVDdHJsOworCWludCByZWFkX2NtZCA9IGxvY2F0aW9uIHwgRUVfUmVhZENtZDsKKwl3cml0ZWwoRUVfV3JpdGUwLCBlZV9hZGRyKTsKKworCS8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gMTA7IGkgPj0gMDsgaS0tKSB7CisJCXNob3J0IGRhdGF2YWwgPSAocmVhZF9jbWQgJiAoMSA8PCBpKSkgPyBFRV9Xcml0ZTEgOiBFRV9Xcml0ZTA7CisJCXdyaXRlbChkYXRhdmFsLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KGVlX2FkZHIpOworCQl3cml0ZWwoZGF0YXZhbCB8IEVFX1NoaWZ0Q2xrLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KGVlX2FkZHIpOworCX0KKwl3cml0ZWwoRUVfQ2hpcFNlbGVjdCwgZWVfYWRkcik7CisJZWVwcm9tX2RlbGF5KGVlX2FkZHIpOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJd3JpdGVsKEVFX0NoaXBTZWxlY3QgfCBFRV9TaGlmdENsaywgZWVfYWRkcik7CisJCWVlcHJvbV9kZWxheShlZV9hZGRyKTsKKwkJcmV0dmFsIHw9IChyZWFkbChlZV9hZGRyKSAmIEVFX0RhdGFPdXQpID8gMSA8PCBpIDogMDsKKwkJd3JpdGVsKEVFX0NoaXBTZWxlY3QsIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkoZWVfYWRkcik7CisJfQorCisJLyogVGVybWluYXRlIHRoZSBFRVBST00gYWNjZXNzLiAqLworCXdyaXRlbChFRV9Xcml0ZTAsIGVlX2FkZHIpOworCXdyaXRlbCgwLCBlZV9hZGRyKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBJbml0aWFsaXplIHRoZSBSeCBhbmQgVHggcmluZ3MsIGFsb25nIHdpdGggdmFyaW91cyAnZGV2JyBiaXRzLiAqLworc3RhdGljIHZvaWQgaW5pdF9yaW5nKHN0cnVjdCBGQTMxMV9ERVYgKmRldikKK3sKKwlpbnQgaTsKKworCWRldi0+Y3VyX3J4ID0gMDsKKyAgICBkZXYtPmN1cl90eCA9IDA7CisKKwlkZXYtPnJ4X2J1Zl9zeiA9IFBLVF9CVUZfU1o7CisJZGV2LT5yeF9oZWFkX2Rlc2MgPSAmZGV2LT5yeF9yaW5nWzBdOworCisJLyogSW5pdGlhbGl6ZSBhbGwgUnggZGVzY3JpcHRvcnMuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCWRldi0+cnhfcmluZ1tpXS5uZXh0X2Rlc2MgPSB2aXJ0X3RvX2xlMzJkZXNjKCZkZXYtPnJ4X3JpbmdbaSsxXSk7CisJCWRldi0+cnhfcmluZ1tpXS5jbWRfc3RhdHVzID0gRGVzY093bjsKKwl9CisJLyogTWFyayB0aGUgbGFzdCBlbnRyeSBhcyB3cmFwcGluZyB0aGUgcmluZy4gKi8KKwlkZXYtPnJ4X3JpbmdbaS0xXS5uZXh0X2Rlc2MgPSB2aXJ0X3RvX2xlMzJkZXNjKCZkZXYtPnJ4X3JpbmdbMF0pOworCisJLyogRmlsbCBpbiB0aGUgUnggYnVmZmVycy4gIEhhbmRsZSBhbGxvY2F0aW9uIGZhaWx1cmUgZ3JhY2VmdWxseS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJZGV2LT5yeF9yaW5nW2ldLmFkZHIgPSAodTMyKSgmcnhfcGFja2V0W1BLVF9CVUZfU1ogKiBpXSk7CisJICAgIGRldi0+cnhfcmluZ1tpXS5jbWRfc3RhdHVzID0gY3B1X3RvX2xlMzIoZGV2LT5yeF9idWZfc3opOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlkZXYtPnR4X3JpbmdbaV0ubmV4dF9kZXNjID0gdmlydF90b19sZTMyZGVzYygmZGV2LT50eF9yaW5nW2krMV0pOworCQlkZXYtPnR4X3JpbmdbaV0uY21kX3N0YXR1cyA9IDA7CisJfQorCWRldi0+dHhfcmluZ1tpLTFdLm5leHRfZGVzYyA9IHZpcnRfdG9fbGUzMmRlc2MoJmRldi0+dHhfcmluZ1swXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspCisJCWRldi0+dHhfcmluZ1tpXS5hZGRyID0gKHUzMikoJnR4X3BhY2tldFtQS1RfQlVGX1NaICogaV0pOworCXJldHVybjsKK30KKwpkaWZmIC0tZ2l0IGEvbmV0Ym9vdC9mc3lzX3RmdHAuYyBiL25ldGJvb3QvZnN5c190ZnRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAyMzNlOAotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvZnN5c190ZnRwLmMKQEAgLTAsMCArMSw0OTcgQEAKKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMjAwMCwyMDAxLDIwMDIsMjAwNCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKiBCYXNlZCBvbiAic3JjL21haW4uYyIgaW4gZXRoZXJib290LTQuNS44LiAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIRVJCT09UIC0gIEJPT1RQL1RGVFAgQm9vdHN0cmFwIFByb2dyYW0KKworQXV0aG9yOiBNYXJ0aW4gUmVudGVycworICBEYXRlOiBEZWMvOTMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICNkZWZpbmUgVEZUUF9ERUJVRwkxICovCisKKyNpbmNsdWRlIDxmaWxlc3lzLmg+CisKKyNkZWZpbmUgR1JVQgkxCisjaW5jbHVkZSA8ZXRoZXJib290Lmg+CisjaW5jbHVkZSA8bmljLmg+CisKK3N0YXRpYyBpbnQgcmV0cnk7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaXBvcnQgPSAyMDAwOworc3RhdGljIHVuc2lnbmVkIHNob3J0IG9wb3J0Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJsb2NrLCBwcmV2YmxvY2s7CitzdGF0aWMgaW50IGJjb3VudGVyOworc3RhdGljIHN0cnVjdCB0ZnRwX3QgdHAsIHNhdmVkX3RwOworc3RhdGljIGludCBwYWNrZXRzaXplOworc3RhdGljIGludCBidWZfZW9mLCBidWZfcmVhZDsKK3N0YXRpYyBpbnQgc2F2ZWRfZmlsZXBvczsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBsZW4sIHNhdmVkX2xlbjsKK3N0YXRpYyBjaGFyICpidWY7CisKKy8qIEZpbGwgdGhlIGJ1ZmZlciBieSByZWNlaXZpbmcgdGhlIGRhdGEgdmlhIHRoZSBURlRQIHByb3RvY29sLiAgKi8KK3N0YXRpYyBpbnQKK2J1Zl9maWxsIChpbnQgYWJvcnQpCit7CisjaWZkZWYgVEZUUF9ERUJVRworICBncnViX3ByaW50ZiAoImJ1Zl9maWxsICglZClcbiIsIGFib3J0KTsKKyNlbmRpZgorICAKKyAgd2hpbGUgKCEgYnVmX2VvZiAmJiAoYnVmX3JlYWQgKyBwYWNrZXRzaXplIDw9IEZTWVNfQlVGTEVOKSkKKyAgICB7CisgICAgICBzdHJ1Y3QgdGZ0cF90ICp0cjsKKyAgICAgIGxvbmcgdGltZW91dDsKKworI2lmZGVmIENPTkdFU1RFRAorICAgICAgdGltZW91dCA9IHJmYzIxMzFfc2xlZXBfaW50ZXJ2YWwgKGJsb2NrID8gVEZUUF9SRVhNVCA6IFRJTUVPVVQsIHJldHJ5KTsKKyNlbHNlCisgICAgICB0aW1lb3V0ID0gcmZjMjEzMV9zbGVlcF9pbnRlcnZhbCAoVElNRU9VVCwgcmV0cnkpOworI2VuZGlmCisgIAorICAgICAgaWYgKCEgYXdhaXRfcmVwbHkgKEFXQUlUX1RGVFAsIGlwb3J0LCBOVUxMLCB0aW1lb3V0KSkKKwl7CisJICBpZiAoaXBfYWJvcnQpCisJICAgIHJldHVybiAwOworCisJICBpZiAoISBibG9jayAmJiByZXRyeSsrIDwgTUFYX1RGVFBfUkVUUklFUykKKwkgICAgeworCSAgICAgIC8qIE1heWJlIGluaXRpYWwgcmVxdWVzdCB3YXMgbG9zdC4gICovCisjaWZkZWYgVEZUUF9ERUJVRworCSAgICAgIGdydWJfcHJpbnRmICgiTWF5YmUgaW5pdGlhbCByZXF1ZXN0IHdhcyBsb3N0LlxuIik7CisjZW5kaWYKKwkgICAgICBpZiAoISB1ZHBfdHJhbnNtaXQgKGFycHRhYmxlW0FSUF9TRVJWRVJdLmlwYWRkci5zX2FkZHIsCisJCQkJICArK2lwb3J0LCBURlRQX1BPUlQsIGxlbiwgJnRwKSkKKwkJcmV0dXJuIDA7CisJICAgICAgCisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgIAorI2lmZGVmIENPTkdFU1RFRAorCSAgaWYgKGJsb2NrICYmICgocmV0cnkgKz0gVEZUUF9SRVhNVCkgPCBURlRQX1RJTUVPVVQpKQorCSAgICB7CisJICAgICAgLyogV2UgcmVzZW5kIG91ciBsYXN0IGFjay4gICovCisjIGlmZGVmIFRGVFBfREVCVUcKKwkgICAgICBncnViX3ByaW50ZiAoIjxSRVhNVD5cbiIpOworIyBlbmRpZgorCSAgICAgIHVkcF90cmFuc21pdCAoYXJwdGFibGVbQVJQX1NFUlZFUl0uaXBhZGRyLnNfYWRkciwKKwkJCSAgICBpcG9ydCwgb3BvcnQsCisJCQkgICAgVEZUUF9NSU5fUEFDS0VULCAmdHApOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisjZW5kaWYKKwkgIC8qIFRpbWVvdXQuICAqLworCSAgcmV0dXJuIDA7CisJfQorCisgICAgICB0ciA9IChzdHJ1Y3QgdGZ0cF90ICopICZuaWMucGFja2V0W0VUSF9ITEVOXTsKKyAgICAgIGlmICh0ci0+b3Bjb2RlID09IG50b2hzIChURlRQX0VSUk9SKSkKKwl7CisJICBncnViX3ByaW50ZiAoIlRGVFAgZXJyb3IgJWQgKCVzKVxuIiwKKwkJICAgICAgIG50b2hzICh0ci0+dS5lcnIuZXJyY29kZSksCisJCSAgICAgICB0ci0+dS5lcnIuZXJybXNnKTsKKwkgIHJldHVybiAwOworCX0KKyAgICAgIAorICAgICAgaWYgKHRyLT5vcGNvZGUgPT0gbnRvaHMgKFRGVFBfT0FDSykpCisJeworCSAgY2hhciAqcCA9IHRyLT51Lm9hY2suZGF0YSwgKmU7CisKKyNpZmRlZiBURlRQX0RFQlVHCisJICBncnViX3ByaW50ZiAoIk9BQ0sgIik7CisjZW5kaWYKKwkgIC8qIFNob3VsZG4ndCBoYXBwZW4uICAqLworCSAgaWYgKHByZXZibG9jaykKKwkgICAgeworCSAgICAgIC8qIElnbm9yZSBpdC4gICovCisJICAgICAgZ3J1Yl9wcmludGYgKCIlczolZDogd2FybmluZzogUFJFVkJMT0NLICE9IDAgKDB4JXgpXG4iLAorCQkJICAgX19GSUxFX18sIF9fTElORV9fLCBwcmV2YmxvY2spOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICAKKwkgIGxlbiA9IG50b2hzICh0ci0+dWRwLmxlbikgLSBzaXplb2YgKHN0cnVjdCB1ZHBoZHIpIC0gMjsKKwkgIGlmIChsZW4gPiBURlRQX01BWF9QQUNLRVQpCisJICAgIGdvdG8gbm9hazsKKwkgIAorCSAgZSA9IHAgKyBsZW47CisJICB3aGlsZSAoKnAgIT0gJ1wwMDAnICYmIHAgPCBlKQorCSAgICB7CisJICAgICAgaWYgKCEgZ3J1Yl9zdHJjbXAgKCJibGtzaXplIiwgcCkpCisJCXsKKwkJICBwICs9IDg7CisJCSAgaWYgKChwYWNrZXRzaXplID0gZ2V0ZGVjICgmcCkpIDwgVEZUUF9ERUZBVUxUU0laRV9QQUNLRVQpCisJCSAgICBnb3RvIG5vYWs7CisjaWZkZWYgVEZUUF9ERUJVRworCQkgIGdydWJfcHJpbnRmICgiYmxrc2l6ZSA9ICVkXG4iLCBwYWNrZXRzaXplKTsKKyNlbmRpZgorCQl9CisJICAgICAgZWxzZSBpZiAoISBncnViX3N0cmNtcCAoInRzaXplIiwgcCkpCisJCXsKKwkJICBwICs9IDY7CisJCSAgaWYgKChmaWxlbWF4ID0gZ2V0ZGVjICgmcCkpIDwgMCkKKwkJICAgIHsKKwkJICAgICAgZmlsZW1heCA9IC0xOworCQkgICAgICBnb3RvIG5vYWs7CisJCSAgICB9CisjaWZkZWYgVEZUUF9ERUJVRworCQkgIGdydWJfcHJpbnRmICgidHNpemUgPSAlZFxuIiwgZmlsZW1heCk7CisjZW5kaWYKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQlub2FrOgorI2lmZGVmIFRGVFBfREVCVUcKKwkJICBncnViX3ByaW50ZiAoIk5PQUtcbiIpOworI2VuZGlmCisJCSAgdHAub3Bjb2RlID0gaHRvbnMgKFRGVFBfRVJST1IpOworCQkgIHRwLnUuZXJyLmVycmNvZGUgPSA4OworCQkgIGxlbiA9IChncnViX3NwcmludGYgKChjaGFyICopIHRwLnUuZXJyLmVycm1zZywKKwkJCQkgICAgICAgIlJGQzE3ODIgZXJyb3IiKQorCQkJICsgc2l6ZW9mICh0cC5pcCkgKyBzaXplb2YgKHRwLnVkcCkKKwkJCSArIHNpemVvZiAodHAub3Bjb2RlKSArIHNpemVvZiAodHAudS5lcnIuZXJyY29kZSkKKwkJCSArIDEpOworCQkgIHVkcF90cmFuc21pdCAoYXJwdGFibGVbQVJQX1NFUlZFUl0uaXBhZGRyLnNfYWRkciwKKwkJCQlpcG9ydCwgbnRvaHMgKHRyLT51ZHAuc3JjKSwKKwkJCQlsZW4sICZ0cCk7CisJCSAgcmV0dXJuIDA7CisJCX0KKwkgICAgICAKKwkgICAgICB3aGlsZSAocCA8IGUgJiYgKnApCisJCXArKzsKKwkgICAgICAKKwkgICAgICBpZiAocCA8IGUpCisJCXArKzsKKwkgICAgfQorCSAgCisJICBpZiAocCA+IGUpCisJICAgIGdvdG8gbm9hazsKKwkgIAorCSAgLyogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHBhY2tldCBkb2VzIG5vdCBnZXQgcHJvY2Vzc2VkIGFzCisJICAgICBkYXRhISAgKi8KKwkgIGJsb2NrID0gdHAudS5hY2suYmxvY2sgPSAwOworCX0KKyAgICAgIGVsc2UgaWYgKHRyLT5vcGNvZGUgPT0gbnRvaHMgKFRGVFBfREFUQSkpCisJeworI2lmZGVmIFRGVFBfREVCVUcKKwkgIGdydWJfcHJpbnRmICgiREFUQSAiKTsKKyNlbmRpZgorCSAgbGVuID0gbnRvaHMgKHRyLT51ZHAubGVuKSAtIHNpemVvZiAoc3RydWN0IHVkcGhkcikgLSA0OworCSAgCisJICAvKiBTaG91bGRuJ3QgaGFwcGVuLiAgKi8KKwkgIGlmIChsZW4gPiBwYWNrZXRzaXplKQorCSAgICB7CisJICAgICAgLyogSWdub3JlIGl0LiAgKi8KKwkgICAgICBncnViX3ByaW50ZiAoIiVzOiVkOiB3YXJuaW5nOiBMRU4gPiBQQUNLRVRTSVpFICgweCV4ID4gMHgleClcbiIsCisJCQkgICBfX0ZJTEVfXywgX19MSU5FX18sIGxlbiwgcGFja2V0c2l6ZSk7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgIAorCSAgYmxvY2sgPSBudG9ocyAodHAudS5hY2suYmxvY2sgPSB0ci0+dS5kYXRhLmJsb2NrKTsKKwl9CisgICAgICBlbHNlCisJLyogTmVpdGhlciBURlRQX09BQ0sgbm9yIFRGVFBfREFUQS4gICovCisJYnJlYWs7CisKKyAgICAgIGlmICgoYmxvY2sgfHwgYmNvdW50ZXIpICYmIChibG9jayAhPSBwcmV2YmxvY2sgKyAodW5zaWduZWQgc2hvcnQpIDEpKQorCS8qIEJsb2NrIG9yZGVyIHNob3VsZCBiZSBjb250aW51b3VzICovCisJdHAudS5hY2suYmxvY2sgPSBodG9ucyAoYmxvY2sgPSBwcmV2YmxvY2spOworICAgICAgCisgICAgICAvKiBTaG91bGQgYmUgY29udGludW91cy4gICovCisgICAgICB0cC5vcGNvZGUgPSBhYm9ydCA/IGh0b25zIChURlRQX0VSUk9SKSA6IGh0b25zIChURlRQX0FDSyk7CisgICAgICBvcG9ydCA9IG50b2hzICh0ci0+dWRwLnNyYyk7CisKKyNpZmRlZiBURlRQX0RFQlVHCisgICAgICBncnViX3ByaW50ZiAoIkFDS1xuIik7CisjZW5kaWYKKyAgICAgIC8qIEFjay4gICovCisgICAgICB1ZHBfdHJhbnNtaXQgKGFycHRhYmxlW0FSUF9TRVJWRVJdLmlwYWRkci5zX2FkZHIsIGlwb3J0LAorCQkgICAgb3BvcnQsIFRGVFBfTUlOX1BBQ0tFVCwgJnRwKTsKKyAgICAgIAorICAgICAgaWYgKGFib3J0KQorCXsKKwkgIGJ1Zl9lb2YgPSAxOworCSAgYnJlYWs7CisJfQorCisgICAgICAvKiBSZXRyYW5zbWlzc2lvbiBvciBPQUNLLiAgKi8KKyAgICAgIGlmICgodW5zaWduZWQgc2hvcnQpIChibG9jayAtIHByZXZibG9jaykgIT0gMSkKKwkvKiBEb24ndCBwcm9jZXNzLiAgKi8KKwljb250aW51ZTsKKyAgICAgIAorICAgICAgcHJldmJsb2NrID0gYmxvY2s7CisgICAgICAvKiBJcyBpdCB0aGUgcmlnaHQgcGxhY2UgdG8gemVybyB0aGUgdGltZXI/ICAqLworICAgICAgcmV0cnkgPSAwOworCisgICAgICAvKiBJbiBHUlVCLCB0aGlzIHZhcmlhYmxlIGRvZXNuJ3QgcGxheSBhbnkgaW1wb3J0YW50IHJvbGUgYXQgYWxsLAorCSBidXQgdXNlIGl0IGZvciBjb25zaXN0ZW5jeSB3aXRoIEV0aGVyYm9vdC4gICovCisgICAgICBiY291bnRlcisrOworICAgICAgCisgICAgICAvKiBDb3B5IHRoZSBkb3dubG9hZGVkIGRhdGEgdG8gdGhlIGJ1ZmZlci4gICovCisgICAgICBncnViX21lbW1vdmUgKGJ1ZiArIGJ1Zl9yZWFkLCB0ci0+dS5kYXRhLmRvd25sb2FkLCBsZW4pOworICAgICAgYnVmX3JlYWQgKz0gbGVuOworCisgICAgICAvKiBFbmQgb2YgZGF0YS4gICovCisgICAgICBpZiAobGVuIDwgcGFja2V0c2l6ZSkJCQorCWJ1Zl9lb2YgPSAxOworICAgIH0KKyAgCisgIHJldHVybiAxOworfQorCisvKiBTZW5kIHRoZSBSUlEgd2hvc2UgbGVuZ3RoIGlzIExFTi4gICovCitzdGF0aWMgaW50CitzZW5kX3JycSAodm9pZCkKK3sKKyAgLyogSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcy4gICovCisgIHJldHJ5ID0gMDsKKyAgYmxvY2sgPSAwOworICBwcmV2YmxvY2sgPSAwOworICBwYWNrZXRzaXplID0gVEZUUF9ERUZBVUxUU0laRV9QQUNLRVQ7CisgIGJjb3VudGVyID0gMDsKKworICBidWYgPSAoY2hhciAqKSBGU1lTX0JVRjsKKyAgYnVmX2VvZiA9IDA7CisgIGJ1Zl9yZWFkID0gMDsKKyAgc2F2ZWRfZmlsZXBvcyA9IDA7CisKKyAgLyogQ2xlYXIgb3V0IHRoZSBSeCBxdWV1ZSBmaXJzdC4gIEl0IGNvbnRhaW5zIG5vdGhpbmcgb2YgaW50ZXJlc3QsCisgICAqIGV4Y2VwdCBwb3NzaWJseSBBUlAgcmVxdWVzdHMgZnJvbSB0aGUgREhDUC9URlRQIHNlcnZlci4gIFdlIHVzZQorICAgKiBwb2xsaW5nIHRocm91Z2hvdXQgRXRoZXJib290LCBzbyBzb21lIHRpbWUgbWF5IGhhdmUgcGFzc2VkIHNpbmNlIHdlCisgICAqIGxhc3QgcG9sbGVkIHRoZSByZWNlaXZlIHF1ZXVlLCB3aGljaCBtYXkgbm93IGJlIGZpbGxlZCB3aXRoCisgICAqIGJyb2FkY2FzdCBwYWNrZXRzLiAgVGhpcyB3aWxsIGNhdXNlIHRoZSByZXBseSB0byB0aGUgcGFja2V0cyB3ZSBhcmUKKyAgICogYWJvdXQgdG8gc2VuZCB0byBiZSBsb3N0IGltbWVkaWF0ZWx5LiAgTm90IHZlcnkgY2xldmVyLiAgKi8KKyAgYXdhaXRfcmVwbHkgKEFXQUlUX1FEUkFJTiwgMCwgTlVMTCwgMCk7CisgIAorI2lmZGVmIFRGVFBfREVCVUcKKyAgZ3J1Yl9wcmludGYgKCJzZW5kX3JycSAoKVxuIik7CisgIHsKKyAgICBpbnQgaTsKKyAgICBjaGFyICpwOworCisgICAgZm9yIChpID0gMCwgcCA9IChjaGFyICopICZ0cDsgaSA8IGxlbjsgaSsrKQorICAgICAgaWYgKHBbaV0gPj0gJyAnICYmIHBbaV0gPD0gJ34nKQorCWdydWJfcHV0Y2hhciAocFtpXSk7CisgICAgICBlbHNlCisJZ3J1Yl9wcmludGYgKCJcXCV4IiwgKHVuc2lnbmVkKSBwW2ldKTsKKworICAgIGdydWJfcHV0Y2hhciAoJ1xuJyk7CisgIH0KKyNlbmRpZgorICAvKiBTZW5kIHRoZSBwYWNrZXQuICAqLworICByZXR1cm4gdWRwX3RyYW5zbWl0IChhcnB0YWJsZVtBUlBfU0VSVkVSXS5pcGFkZHIuc19hZGRyLCArK2lwb3J0LAorCQkgICAgICAgVEZUUF9QT1JULCBsZW4sICZ0cCk7Cit9CisKKy8qIE1vdW50IHRoZSBuZXR3b3JrIGRyaXZlLiBJZiB0aGUgZHJpdmUgaXMgcmVhZHksIHJldHVybiBvbmUsIG90aGVyd2lzZQorICAgcmV0dXJuIHplcm8uICAqLworaW50Cit0ZnRwX21vdW50ICh2b2lkKQoreworICAvKiBDaGVjayBpZiB0aGUgY3VycmVudCBkcml2ZSBpcyB0aGUgbmV0d29yayBkcml2ZS4gICovCisgIGlmIChjdXJyZW50X2RyaXZlICE9IE5FVFdPUktfRFJJVkUpCisgICAgcmV0dXJuIDA7CisKKyAgLyogSWYgdGhlIGRyaXZlIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQsIGFib3J0LiAgKi8KKyAgaWYgKCEgbmV0d29ya19yZWFkeSkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gMTsKK30KKworLyogUmVhZCB1cCB0byBTSVpFIGJ5dGVzLCByZXR1cm5lZCBpbiBBRERSLiAgKi8KK2ludAordGZ0cF9yZWFkIChjaGFyICphZGRyLCBpbnQgc2l6ZSkKK3sKKyAgLyogSG93IG1hbnkgYnl0ZXMgaXMgcmVhZD8gICovCisgIGludCByZXQgPSAwOworCisjaWZkZWYgVEZUUF9ERUJVRworICBncnViX3ByaW50ZiAoInRmdHBfcmVhZCAoMHgleCwgJWQpXG4iLCAoaW50KSBhZGRyLCBzaXplKTsKKyNlbmRpZgorICAKKyAgaWYgKGZpbGVwb3MgPCBzYXZlZF9maWxlcG9zKQorICAgIHsKKyAgICAgIC8qIFVnZ2guLiBGSUxFUE9TIGhhcyBiZWVuIG1vdmVkIGJhY2t3YXJkcy4gU28gcmVvcGVuIHRoZSBmaWxlLiAgKi8KKyAgICAgIGJ1Zl9yZWFkID0gMDsKKyAgICAgIGJ1Zl9maWxsICgxKTsKKyAgICAgIGdydWJfbWVtbW92ZSAoKGNoYXIgKikgJnRwLCAoY2hhciAqKSAmc2F2ZWRfdHAsIHNhdmVkX2xlbik7CisgICAgICBsZW4gPSBzYXZlZF9sZW47CisjaWZkZWYgVEZUUF9ERUJVRworICAgICAgeworCWludCBpOworCWdydWJfcHJpbnRmICgib3Bjb2RlID0gMHgleCwgcnJxID0gIiwgKHVuc2lnbmVkIGxvbmcpIHRwLm9wY29kZSk7CisJZm9yIChpID0gMDsgaSA8IFRGVFBfREVGQVVMVFNJWkVfUEFDS0VUOyBpKyspCisJICB7CisJICAgIGlmICh0cC51LnJycVtpXSA+PSAnICcgJiYgdHAudS5ycnFbaV0gPD0gJ34nKQorCSAgICAgIGdydWJfcHV0Y2hhciAodHAudS5ycnFbaV0pOworCSAgICBlbHNlCisJICAgICAgZ3J1Yl9wdXRjaGFyICgnKicpOworCSAgfQorCWdydWJfcHV0Y2hhciAoJ1xuJyk7CisgICAgICB9CisjZW5kaWYKKyAgICAgIAorICAgICAgaWYgKCEgc2VuZF9ycnEgKCkpCisJeworCSAgZXJybnVtID0gRVJSX1dSSVRFOworCSAgcmV0dXJuIDA7CisJfQorICAgIH0KKyAgCisgIHdoaWxlIChzaXplID4gMCkKKyAgICB7CisgICAgICBpbnQgYW10ID0gYnVmX3JlYWQgKyBzYXZlZF9maWxlcG9zIC0gZmlsZXBvczsKKworICAgICAgLyogSWYgdGhlIGxlbmd0aCB0aGF0IGNhbiBiZSBjb3BpZWQgZnJvbSB0aGUgYnVmZmVyIGlzIG92ZXIgdGhlCisJIHJlcXVlc3RlZCBzaXplLCBjdXQgaXQgZG93bi4gICovCisgICAgICBpZiAoYW10ID4gc2l6ZSkKKwlhbXQgPSBzaXplOworCisgICAgICBpZiAoYW10ID4gMCkKKwl7CisJICAvKiBDb3B5IHRoZSBidWZmZXIgdG8gdGhlIHN1cHBsaWVkIG1lbW9yeSBzcGFjZS4gICovCisJICBncnViX21lbW1vdmUgKGFkZHIsIGJ1ZiArIGZpbGVwb3MgLSBzYXZlZF9maWxlcG9zLCBhbXQpOworCSAgc2l6ZSAtPSBhbXQ7CisJICBhZGRyICs9IGFtdDsKKwkgIGZpbGVwb3MgKz0gYW10OworCSAgcmV0ICs9IGFtdDsKKworCSAgLyogSWYgdGhlIHNpemUgb2YgdGhlIGVtcHR5IHNwYWNlIGJlY29tZXMgc21hbGwsIG1vdmUgdGhlIHVudXNlZAorCSAgICAgZGF0YSBmb3J3YXJkcy4gICovCisJICBpZiAoZmlsZXBvcyAtIHNhdmVkX2ZpbGVwb3MgPiBGU1lTX0JVRkxFTiAvIDIpCisJICAgIHsKKwkgICAgICBncnViX21lbW1vdmUgKGJ1ZiwgYnVmICsgRlNZU19CVUZMRU4gLyAyLCBGU1lTX0JVRkxFTiAvIDIpOworCSAgICAgIGJ1Zl9yZWFkIC09IEZTWVNfQlVGTEVOIC8gMjsKKwkgICAgICBzYXZlZF9maWxlcG9zICs9IEZTWVNfQlVGTEVOIC8gMjsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBTa2lwIHRoZSB3aG9sZSBidWZmZXIuICAqLworCSAgc2F2ZWRfZmlsZXBvcyArPSBidWZfcmVhZDsKKwkgIGJ1Zl9yZWFkID0gMDsKKwl9CisKKyAgICAgIC8qIFJlYWQgdGhlIGRhdGEuICAqLworICAgICAgaWYgKHNpemUgPiAwICYmICEgYnVmX2ZpbGwgKDApKQorCXsKKwkgIGVycm51bSA9IEVSUl9SRUFEOworCSAgcmV0dXJuIDA7CisJfQorCisgICAgICAvKiBTYW5pdHkgY2hlY2suICAqLworICAgICAgaWYgKHNpemUgPiAwICYmIGJ1Zl9yZWFkID09IDApCisJeworCSAgZXJybnVtID0gRVJSX1JFQUQ7CisJICByZXR1cm4gMDsKKwl9CisgICAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKy8qIENoZWNrIGlmIHRoZSBmaWxlIERJUk5BTUUgcmVhbGx5IGV4aXN0cy4gR2V0IHRoZSBzaXplIGFuZCBzYXZlIGl0IGluCisgICBGSUxFTUFYLiAgKi8KK2ludAordGZ0cF9kaXIgKGNoYXIgKmRpcm5hbWUpCit7CisgIGludCBjaDsKKworI2lmZGVmIFRGVFBfREVCVUcKKyAgZ3J1Yl9wcmludGYgKCJ0ZnRwX2RpciAoJXMpXG4iLCBkaXJuYW1lKTsKKyNlbmRpZgorICAKKyAgLyogSW4gVEZUUCwgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgd2hhdCBmaWxlcyBleGlzdC4gICovCisgIGlmIChwcmludF9wb3NzaWJpbGl0aWVzKQorICAgIHJldHVybiAxOworCisgIC8qIERvbid0IGtub3cgdGhlIHNpemUgeWV0LiAgKi8KKyAgZmlsZW1heCA9IC0xOworICAKKyByZW9wZW46CisgIC8qIENvbnN0cnVjdCB0aGUgVEZUUCByZXF1ZXN0IHBhY2tldC4gICovCisgIHRwLm9wY29kZSA9IGh0b25zIChURlRQX1JSUSk7CisgIC8qIFRlcm1pbmF0ZSB0aGUgZmlsZW5hbWUuICAqLworICBjaCA9IG51bF90ZXJtaW5hdGUgKGRpcm5hbWUpOworICAvKiBNYWtlIHRoZSByZXF1ZXN0IHN0cmluZyAob2N0ZXQsIGJsa3NpemUgYW5kIHRzaXplKS4gICovCisgIGxlbiA9IChncnViX3NwcmludGYgKChjaGFyICopIHRwLnUucnJxLAorCQkgICAgICAgIiVzJWNvY3RldCVjYmxrc2l6ZSVjJWQlY3RzaXplJWMwIiwKKwkJICAgICAgIGRpcm5hbWUsIDAsIDAsIDAsIFRGVFBfTUFYX1BBQ0tFVCwgMCwgMCkKKwkgKyBzaXplb2YgKHRwLmlwKSArIHNpemVvZiAodHAudWRwKSArIHNpemVvZiAodHAub3Bjb2RlKSArIDEpOworICAvKiBSZXN0b3JlIHRoZSBvcmlnaW5hbCBESVJOQU1FLiAgKi8KKyAgZGlybmFtZVtncnViX3N0cmxlbiAoZGlybmFtZSldID0gY2g7CisgIC8qIFNhdmUgdGhlIFRGVFAgcGFja2V0IHNvIHRoYXQgd2UgY2FuIHJlb3BlbiB0aGUgZmlsZSBsYXRlci4gICovCisgIGdydWJfbWVtbW92ZSAoKGNoYXIgKikgJnNhdmVkX3RwLCAoY2hhciAqKSAmdHAsIGxlbik7CisgIHNhdmVkX2xlbiA9IGxlbjsKKyAgaWYgKCEgc2VuZF9ycnEgKCkpCisgICAgeworICAgICAgZXJybnVtID0gRVJSX1dSSVRFOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAKKyAgLyogUmVhZCB0aGUgZGF0YS4gICovCisgIGlmICghIGJ1Zl9maWxsICgwKSkKKyAgICB7CisgICAgICBlcnJudW0gPSBFUlJfRklMRV9OT1RfRk9VTkQ7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKGZpbGVtYXggPT0gLTEpCisgICAgeworICAgICAgLyogVGhlIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgdGhlICJ0c2l6ZSIgb3B0aW9uLCBzbyB3ZSBtdXN0IHJlYWQKKwkgdGhlIGZpbGUgdHdpY2UuLi4gICovCisKKyAgICAgIC8qIFplcm8gdGhlIHNpemUgb2YgdGhlIGZpbGUuICAqLworICAgICAgZmlsZW1heCA9IDA7CisgICAgICBkbworCXsKKwkgIC8qIEFkZCB0aGUgbGVuZ3RoIG9mIHRoZSBkb3dubG9hZGVkIGRhdGEuICAqLworCSAgZmlsZW1heCArPSBidWZfcmVhZDsKKwkgIC8qIFJlc2V0IHRoZSBvZmZzZXQuIEp1c3QgZGlzY2FyZCB0aGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlci4gICovCisJICBidWZfcmVhZCA9IDA7CisJICAvKiBSZWFkIHRoZSBkYXRhLiAgKi8KKwkgIGlmICghIGJ1Zl9maWxsICgwKSkKKwkgICAgeworCSAgICAgIGVycm51bSA9IEVSUl9SRUFEOworCSAgICAgIHJldHVybiAwOworCSAgICB9CisJfQorICAgICAgd2hpbGUgKCEgYnVmX2VvZik7CisKKyAgICAgIC8qIE1heWJlIGEgZmV3IGFtb3VudHMgb2YgZGF0YSByZW1haW5zLiAgKi8KKyAgICAgIGZpbGVtYXggKz0gYnVmX3JlYWQ7CisgICAgICAKKyAgICAgIC8qIFJldHJ5IHRoZSBvcGVuIGluc3RydWN0aW9uLiAgKi8KKyAgICAgIGdvdG8gcmVvcGVuOworICAgIH0KKworICByZXR1cm4gMTsKK30KKworLyogQ2xvc2UgdGhlIGZpbGUuICAqLwordm9pZAordGZ0cF9jbG9zZSAodm9pZCkKK3sKKyNpZmRlZiBURlRQX0RFQlVHCisgIGdydWJfcHJpbnRmICgidGZ0cF9jbG9zZSAoKVxuIik7CisjZW5kaWYKKyAgCisgIGJ1Zl9yZWFkID0gMDsKKyAgYnVmX2ZpbGwgKDEpOworfQpkaWZmIC0tZ2l0IGEvbmV0Ym9vdC9pODI1ODYuYyBiL25ldGJvb3QvaTgyNTg2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1NDBjMgotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvaTgyNTg2LmMKQEAgLTAsMCArMSw4MjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRXRoZXJib290IC0gIEJPT1RQL1RGVFAgQm9vdHN0cmFwIFByb2dyYW0KK2k4MjU4NiBOSUMgZHJpdmVyIGZvciBFdGhlcmJvb3QKK0tlbiBZYXAsIEphbnVhcnkgMTk5OAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisjaW5jbHVkZSAibmljLmgiCisjaW5jbHVkZSAiY2FyZHMuaCIKKyNpbmNsdWRlICJ0aW1lci5oIgorCisjZGVmaW5lCXVkZWxheShuKQl3YWl0b25fdGltZXIyKCgobikqVElDS1NfUEVSX01TKS8xMDAwKQorCisvKiBTb3VyY2VzIG9mIGluZm9ybWF0aW9uOgorCisgICBEb25hbGQgQmVja2VyJ3MgZXhjZWxsZW50IDNjNTA3IGRyaXZlciBpbiBMaW51eAorICAgSW50ZWwgODI1OTYgZGF0YSBzaGVldCAoeWVzLCA4MjU5NjsgaXQgaGFzIGEgNTg2IGNvbXBhdGliaWxpdHkgbW9kZSkKKyovCisKKy8qIENvZGUgYmVsb3cgbW9zdGx5IHN0b2xlbiB3aG9sZXNhbGUgZnJvbSAzYzUwNy5jIGRyaXZlciBpbiBMaW51eCAqLworCisvKgorCQlEZXRhaWxzIG9mIHRoZSBpODI1ODYuCisKKyAgIFlvdSdsbCByZWFsbHkgbmVlZCB0aGUgZGF0YWJvb2sgdG8gdW5kZXJzdGFuZCB0aGUgZGV0YWlscyBvZiB0aGlzIHBhcnQsCisgICBidXQgdGhlIG91dGxpbmUgaXMgdGhhdCB0aGUgaTgyNTg2IGhhcyB0d28gc2VwYXJhdGUgcHJvY2Vzc2luZyB1bml0cy4KKyAgIEJvdGggYXJlIHN0YXJ0ZWQgZnJvbSBhIGxpc3Qgb2YgdGhyZWUgY29uZmlndXJhdGlvbiB0YWJsZXMsIG9mIHdoaWNoIG9ubHkKKyAgIHRoZSBsYXN0LCB0aGUgU3lzdGVtIENvbnRyb2wgQmxvY2sgKFNDQiksIGlzIHVzZWQgYWZ0ZXIgcmVzZXQtdGltZS4gIFRoZSBTQ0IKKyAgIGhhcyB0aGUgZm9sbG93aW5nIGZpZWxkczoKKwkJU3RhdHVzIHdvcmQKKwkJQ29tbWFuZCB3b3JkCisJCVR4L0NvbW1hbmQgYmxvY2sgYWRkci4KKwkJUnggYmxvY2sgYWRkci4KKyAgIFRoZSBjb21tYW5kIHdvcmQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGNvbnRyb2xzIGZvciB0aGUgVHggYW5kIFJ4IHVuaXRzOgorICAqLworCisjZGVmaW5lCUNVQ19TVEFSVAkweDAxMDAKKyNkZWZpbmUJQ1VDX1JFU1VNRQkweDAyMDAKKyNkZWZpbmUJQ1VDX1NVU1BFTkQJMHgwMzAwCisjZGVmaW5lCVJYX1NUQVJUCTB4MDAxMAorI2RlZmluZQlSWF9SRVNVTUUJMHgwMDIwCisjZGVmaW5lCVJYX1NVU1BFTkQJMHgwMDMwCisKKy8qIFRoZSBSeCB1bml0IHVzZXMgYSBsaXN0IG9mIGZyYW1lIGRlc2NyaXB0b3JzIGFuZCBhIGxpc3Qgb2YgZGF0YSBidWZmZXIKKyAgIGRlc2NyaXB0b3JzLiAgV2UgdXNlIGZ1bGwtc2l6ZWQgKDE1MTggYnl0ZSkgZGF0YSBidWZmZXJzLCBzbyB0aGVyZSBpcworICAgYSBvbmUtdG8tb25lIHBhaXJpbmcgb2YgZnJhbWUgZGVzY3JpcHRvcnMgdG8gYnVmZmVyIGRlc2NyaXB0b3JzLgorCisgICBUaGUgVHggKCJjb21tYW5kIikgdW5pdCBleGVjdXRlcyBhIGxpc3Qgb2YgY29tbWFuZHMgdGhhdCBsb29rIGxpa2U6CisJU3RhdHVzIHdvcmQJV3JpdHRlbiBieSB0aGUgODI1ODYgd2hlbiB0aGUgY29tbWFuZCBpcyBkb25lLgorCUNvbW1hbmQgd29yZAlDb21tYW5kIGluIGxvd2VyIDMgYml0cywgcG9zdC1jb21tYW5kIGFjdGlvbiBpbiB1cHBlciAzCisJTGluayB3b3JkCVRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IGNvbW1hbmQuCisJUGFyYW1ldGVycwkoYXMgbmVlZGVkKS4KKworCVNvbWUgZGVmaW5pdGlvbnMgcmVsYXRlZCB0byB0aGUgQ29tbWFuZCBXb3JkIGFyZToKKyAqLworI2RlZmluZSBDTURfRU9MCQkweDgwMDAJCS8qIFRoZSBsYXN0IGNvbW1hbmQgb2YgdGhlIGxpc3QsIHN0b3AuICovCisjZGVmaW5lIENNRF9TVVNQCTB4NDAwMAkJLyogU3VzcGVuZCBhZnRlciBkb2luZyBjbWQuICovCisjZGVmaW5lIENNRF9JTlRSCTB4MjAwMAkJLyogSW50ZXJydXB0IGFmdGVyIGRvaW5nIGNtZC4gKi8KKworZW51bSBjb21tYW5kcyB7CisJQ21kTk9wID0gMCwgQ21kU0FTZXR1cCA9IDEsIENtZENvbmZpZ3VyZSA9IDIsIENtZE11bHRpY2FzdExpc3QgPSAzLAorCUNtZFR4ID0gNCwgQ21kVERSID0gNSwgQ21kRHVtcCA9IDYsIENtZERpYWdub3NlID0gN307CisKKy8qCisJCURldGFpbHMgb2YgdGhlIEV0aGVyTGluazE2IEltcGxlbWVudGF0aW9uCisKKyAgVGhlIDNjNTA3IGFuZCBOSTUyMTAgYXJlIGdlbmVyaWMgc2hhcmVkLW1lbW9yeSBpODI1ODYgaW1wbGVtZW50YXRpb25zLgorICAzYzUwNzogVGhlIGhvc3QgY2FuIG1hcCAxNkssIDMySywgNDhLLCBvciA2NEsgb2YgdGhlIDY0SyBtZW1vcnkgaW50bworICAweDBbQ0RdWzA4XTAwMDAsIG9yIGFsbCA2NEsgaW50byAweEZbMDI0NjhdMDAwMC4KKyAgTkk1MjEwOiBUaGUgaG9zdCBjYW4gbWFwIDhrIG9yIDE2ayBhdCAweFtDREVdWzA0OENdMDAwIGJ1dCB3ZQorICBhc3N1bWUgOGsgYmVjYXVzZSB0byBoYXZlIDE2ayB5b3UgY2Fubm90IHB1dCBhIFJPTSBvbiB0aGUgTklDLgorICAqLworCisvKiBPZmZzZXRzIGZyb20gdGhlIGJhc2UgSS9PIGFkZHJlc3MuICovCisKKyNpZmRlZglJTkNMVURFXzNDNTA3CisKKyNkZWZpbmUJU0FfREFUQQkJMAkvKiBTdGF0aW9uIGFkZHJlc3MgZGF0YSwgb3IgM0NvbSBzaWduYXR1cmUuICovCisjZGVmaW5lIE1JU0NfQ1RSTAk2CS8qIFN3aXRjaCB0aGUgU0FfREFUQSBiYW5rcywgYW5kIGJ1cyBjb25maWcgYml0cy4gKi8KKyNkZWZpbmUgUkVTRVRfSVJRCTEwCS8qIFJlc2V0IHRoZSBsYXRjaGVkIElSUSBsaW5lLiAqLworI2RlZmluZSBJODI1ODZfQVRUTgkxMQkvKiBGcm9iIHRoZSA4MjU4NiBDaGFubmVsIEF0dGVudGlvbiBsaW5lLiAqLworI2RlZmluZSBST01fQ09ORklHCTEzCisjZGVmaW5lIE1FTV9DT05GSUcJMTQKKyNkZWZpbmUgSVJRX0NPTkZJRwkxNQorI2RlZmluZSBFTDE2X0lPX0VYVEVOVAkxNgorCisvKiBUaGUgSUQgcG9ydCBpcyB1c2VkIGF0IGJvb3QtdGltZSB0byBsb2NhdGUgdGhlIGV0aGVyY2FyZC4gKi8KKyNkZWZpbmUgSURfUE9SVAkJMHgxMDAKKworI2VuZGlmCisKKyNpZmRlZglJTkNMVURFX05JNTIxMAorCisjZGVmaW5lCU5JNTJfUkVTRVQJMCAgLyogd3JpdGluZyB0byB0aGlzIGFkZHJlc3MsIHJlc2V0cyB0aGUgaTgyNTg2ICovCisjZGVmaW5lCUk4MjU4Nl9BVFROCTEgIC8qIGNoYW5uZWwgYXR0ZW50aW9uLCBraWNrIHRoZSA1ODYgKi8KKworI2VuZGlmCisKKyNpZmRlZglJTkNMVURFX0VYT1MyMDUKKworI2RlZmluZQlFWE9TMjA1X1JFU0VUCTAgIC8qIHdyaXRpbmcgdG8gdGhpcyBhZGRyZXNzLCByZXNldHMgdGhlIGk4MjU4NiAqLworI2RlZmluZQlJODI1ODZfQVRUTgkxICAvKiBjaGFubmVsIGF0dGVudGlvbiwga2ljayB0aGUgNTg2ICovCisKKyNlbmRpZgorCisvKiBPZmZzZXRzIHRvIHJlZ2lzdGVycyBpbiB0aGUgbWFpbGJveCAoU0NCKS4gKi8KKyNkZWZpbmUgaVNDQl9TVEFUVVMJMHg4CisjZGVmaW5lIGlTQ0JfQ01ECTB4QQorI2RlZmluZSBpU0NCX0NCTAkweEMJLyogQ29tbWFuZCBCTG9jayBvZmZzZXQuICovCisjZGVmaW5lIGlTQ0JfUkZBCTB4RQkvKiBSeCBGcmFtZSBBcmVhIG9mZnNldC4gKi8KKworLyogIFNpbmNlIHRoZSAzYzUwNyBtYXBzIHRoZSBzaGFyZWQgbWVtb3J5IHdpbmRvdyBzbyB0aGF0IHRoZSBsYXN0IGJ5dGUgaXMKK2F0IDgyNTg2IGFkZHJlc3MgRkZGRiwgdGhlIGZpcnN0IGJ5dGUgaXMgYXQgODI1ODYgYWRkcmVzcyAwLCAxNkssIDMySywgb3IKKzQ4SyBjb3JyZXNwb25kaW5nIHRvIHdpbmRvdyBzaXplcyBvZiA2NEssIDQ4SywgMzJLIGFuZCAxNksgcmVzcGVjdGl2ZWx5LgorV2UgY2FuIGFjY291bnQgZm9yIHRoaXMgYmUgc2V0dGluZyB0aGUgJ1NCQyBCYXNlJyBlbnRyeSBpbiB0aGUgSVNDUCB0YWJsZQorYmVsb3cgZm9yIGFsbCB0aGUgMTYgYml0IG9mZnNldCBhZGRyZXNzZXMsIGFuZCBhbHNvIGFkZGluZyB0aGUgJ1NDQiBCYXNlJwordmFsdWUgdG8gYWxsIDI0IGJpdCBwaHlzaWNhbCBhZGRyZXNzZXMgKGluIHRoZSBTQ1AgdGFibGUgYW5kIHRoZSBUWCBhbmQgUlgKK0J1ZmZlciBEZXNjcmlwdG9ycykuCisJCQkJLU1hcmsKKyovCisKKy8qCisgIFdoYXQgZm9sbG93cyBpbiAnaW5pdF93b3Jkc1tdJyBpcyB0aGUgInByb2dyYW0iIHRoYXQgaXMgZG93bmxvYWRlZCB0byB0aGUKKyAgODI1ODYgbWVtb3J5LiAgSXQncyBtb3N0bHkgdGFibGVzIGFuZCBjb21tYW5kIGJsb2NrcywgYW5kIHN0YXJ0cyBhdCB0aGUKKyAgcmVzZXQgYWRkcmVzcyAweGZmZmZmNi4gIFRoaXMgaXMgZGVzaWduZWQgdG8gYmUgc2ltaWxhciB0byB0aGUgRXRoZXJFeHByZXNzLAorICB0aHVzIHRoZSB1bnVzdWFsIGxvY2F0aW9uIG9mIHRoZSBTQ0IgYXQgMHgwMDA4LgorCisgIEV2ZW4gd2l0aCB0aGUgYWRkaXRpb25hbCAiZG9uJ3QgY2FyZSIgdmFsdWVzLCBkb2luZyBpdCB0aGlzIHdheSB0YWtlcyBsZXNzCisgIHByb2dyYW0gc3BhY2UgdGhhbiBpbml0aWFsaXppbmcgdGhlIGluZGl2aWR1YWwgdGFibGVzLCBhbmQgSSBmZWVsIGl0J3MgbXVjaAorICBjbGVhbmVyLgorCisgIFRoZSBkYXRhYm9vayBpcyBwYXJ0aWN1bGFybHkgdXNlbGVzcyBmb3IgdGhlIGZpcnN0IHR3byBzdHJ1Y3R1cmVzLCBJIGhhZAorICB0byB1c2UgdGhlIENyeW53ciBkcml2ZXIgYXMgYW4gZXhhbXBsZS4KKworICBUaGUgbWVtb3J5IHNldHVwIGlzIGFzIGZvbGxvd3M6CisqLworCisjZGVmaW5lIENPTkZJR19DTUQJMHgxOAorI2RlZmluZSBTRVRfU0FfQ01ECTB4MjQKKyNkZWZpbmUgU0FfT0ZGU0VUCTB4MkEKKyNkZWZpbmUgSURMRUxPT1AJMHgzMAorI2RlZmluZSBURFJfQ01ECQkweDM4CisjZGVmaW5lIFREUl9USU1FCTB4M0MKKyNkZWZpbmUgRFVNUF9DTUQJMHg0MAorI2RlZmluZSBESUFHX0NNRAkweDQ4CisjZGVmaW5lIFNFVF9NQ19DTUQJMHg0RQorI2RlZmluZSBEVU1QX0RBVEEJMHg1NgkvKiBBIDE3MCBieXRlIGJ1ZmZlciBmb3IgZHVtcCBhbmQgU2V0LU1DIGludG8uICovCisKKyNkZWZpbmUgVFhfQlVGX1NUQVJUCTB4MDEwMAorI2RlZmluZSBUWF9CVUZfU0laRQkoMTUxOCsxNCsyMCsxNikgLyogcGFja2V0K2hlYWRlcitUQkQgKi8KKworI2RlZmluZSBSWF9CVUZfU1RBUlQJMHgxMDAwCisjZGVmaW5lIFJYX0JVRl9TSVpFCSgxNTE4KzE0KzE4KQkvKiBwYWNrZXQraGVhZGVyK1JCRCAqLworI2RlZmluZSBSWF9CVUZfRU5ECShtZW1fZW5kIC0gbWVtX3N0YXJ0IC0gMjApCisKKy8qCisgIFRoYXQncyBpdDogb25seSA4NiBieXRlcyB0byBzZXQgdXAgdGhlIGJlYXN0LCBpbmNsdWRpbmcgZXZlcnkgZXh0cmEKKyAgY29tbWFuZCBhdmFpbGFibGUuICBUaGUgMTcwIGJ5dGUgYnVmZmVyIGF0IERVTVBfREFUQSBpcyBzaGFyZWQgYmV0d2VlbiB0aGUKKyAgRHVtcCBjb21tYW5kIChjYWxsZWQgb25seSBieSB0aGUgZGlhZ25vc3RpYyBwcm9ncmFtKSBhbmQgdGhlIFNldE11bHRpY2FzdExpc3QKKyAgY29tbWFuZC4KKworICBUbyBjb21wbGV0ZSB0aGUgbWVtb3J5IHNldHVwIHlvdSBvbmx5IGhhdmUgdG8gd3JpdGUgdGhlIHN0YXRpb24gYWRkcmVzcyBhdAorICBTQV9PRkZTRVQgYW5kIGNyZWF0ZSB0aGUgVHggJiBSeCBidWZmZXIgbGlzdHMuCisKKyAgVGhlIFR4IGNvbW1hbmQgY2hhaW4gYW5kIGJ1ZmZlciBsaXN0IGlzIHNldHVwIGFzIGZvbGxvd3M6CisgIEEgVHggY29tbWFuZCB0YWJsZSwgd2l0aCB0aGUgZGF0YSBidWZmZXIgcG9pbnRpbmcgdG8uLi4KKyAgQSBUeCBkYXRhIGJ1ZmZlciBkZXNjcmlwdG9yLiAgVGhlIHBhY2tldCBpcyBpbiBhIHNpbmdsZSBidWZmZXIsIHJhdGhlciB0aGFuCisJY2hhaW5pbmcgdG9nZXRoZXIgc2V2ZXJhbCBzbWFsbGVyIGJ1ZmZlcnMuCisgIEEgTm9PcCBjb21tYW5kLCB3aGljaCBpbml0aWFsbHkgcG9pbnRzIHRvIGl0c2VsZiwKKyAgQW5kIHRoZSBwYWNrZXQgZGF0YS4KKworICBBIHRyYW5zbWl0IGlzIGRvbmUgYnkgZmlsbGluZyBpbiB0aGUgVHggY29tbWFuZCB0YWJsZSBhbmQgZGF0YSBidWZmZXIsCisgIHJlLXdyaXRpbmcgdGhlIE5vT3AgY29tbWFuZCwgYW5kIGZpbmFsbHkgY2hhbmdpbmcgdGhlIG9mZnNldCBvZiB0aGUgbGFzdAorICBjb21tYW5kIHRvIHBvaW50IHRvIHRoZSBjdXJyZW50IFR4IGNvbW1hbmQuICBXaGVuIHRoZSBUeCBjb21tYW5kIGlzIGZpbmlzaGVkLAorICBpdCBqdW1wcyB0byB0aGUgTm9PcCwgd2hlbiBpdCBsb29wcyB1bnRpbCB0aGUgbmV4dCBUeCBjb21tYW5kIGNoYW5nZXMgdGhlCisgICJsaW5rIG9mZnNldCIgaW4gdGhlIE5vT3AuICBUaGlzIHdheSB0aGUgODI1ODYgbmV2ZXIgaGFzIHRvIGdvIHRocm91Z2ggdGhlCisgIHNsb3cgcmVzdGFydCBzZXF1ZW5jZS4KKworICBUaGUgUnggYnVmZmVyIGxpc3QgaXMgc2V0IHVwIGluIHRoZSBvYnZpb3VzIHJpbmcgc3RydWN0dXJlLiAgV2UgaGF2ZSBlbm91Z2gKKyAgbWVtb3J5IChhbmQgbG93IGVub3VnaCBpbnRlcnJ1cHQgbGF0ZW5jeSkgdGhhdCB3ZSBjYW4gYXZvaWQgdGhlIGNvbXBsaWNhdGVkCisgIFJ4IGJ1ZmZlciBsaW5rZWQgbGlzdHMgYnkgYWx3YXkgYXNzb2NpYXRpbmcgYSBmdWxsLXNpemUgUnggZGF0YSBidWZmZXIgd2l0aAorICBlYWNoIFJ4IGRhdGEgZnJhbWUuCisKKyAgSSBjdXJyZW50bHkgdXNlIG9uZSB0cmFuc21pdCBidWZmZXIgc3RhcnRpbmcgYXQgVFhfQlVGX1NUQVJUICgweDAxMDApLCBhbmQKKyAgdXNlIHRoZSByZXN0IG9mIG1lbW9yeSwgZnJvbSBSWF9CVUZfU1RBUlQgdG8gUlhfQlVGX0VORCwgZm9yIFJ4IGJ1ZmZlcnMuCisKKyAgKi8KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGluaXRfd29yZHNbXSA9IHsKKwkvKglTeXN0ZW0gQ29uZmlndXJhdGlvbiBQb2ludGVyIChTQ1ApLiAqLworI2lmCWRlZmluZWQoSU5DTFVERV8zQzUwNykKKwkweDAwMDAsCQkJCQkvKiBTZXQgYnVzIHNpemUgdG8gMTYgYml0cy4gKi8KKyNlbHNlCisJMHgwMDAxLAkJCQkJLyogU2V0IGJ1cyBzaXplIHRvIDggYml0cyAqLworI2VuZGlmCisJMCwwLAkJCQkJLyogcGFkIHdvcmRzLiAqLworCTB4MDAwMCwweDAwMDAsCQkJCS8qIElTQ1AgcGh5cyBhZGRyLCBzZXQgaW4gaW5pdF84MjU4Nl9tZW0oKS4gKi8KKworCS8qCUludGVybWVkaWF0ZSBTeXN0ZW0gQ29uZmlndXJhdGlvbiBQb2ludGVyIChJU0NQKS4gKi8KKwkweDAwMDEsCQkJCQkvKiBTdGF0dXMgd29yZCB0aGF0J3MgY2xlYXJlZCB3aGVuIGluaXQgaXMgZG9uZS4gKi8KKwkweDAwMDgsMCwwLAkJCQkvKiBTQ0Igb2Zmc2V0LCAoc2tpcCwgc2tpcCkgKi8KKworCS8qIFN5c3RlbSBDb250cm9sIEJsb2NrIChTQ0IpLiAqLworCTAsMHhmMDAwfFJYX1NUQVJUfENVQ19TVEFSVCwJCS8qIFNDQiBzdGF0dXMgYW5kIGNtZC4gKi8KKwlDT05GSUdfQ01ELAkJCQkvKiBDb21tYW5kIGxpc3QgcG9pbnRlciwgcG9pbnRzIHRvIENvbmZpZ3VyZS4gKi8KKwlSWF9CVUZfU1RBUlQsCQkJCS8qIFJ4IGJsb2NrIGxpc3QuICovCisJMCwwLDAsMCwJCQkJLyogRXJyb3IgY291bnQ6IENSQywgYWxpZ24sIGJ1ZmZlciwgb3ZlcnJ1bi4gKi8KKworCS8qIDB4MDAxODogQ29uZmlndXJlIGNvbW1hbmQuICBDaGFuZ2UgdG8gcHV0IE1BQyBkYXRhIHdpdGggcGFja2V0LiAqLworCTAsIENtZENvbmZpZ3VyZSwJCQkvKiBTdGF0dXMsIGNvbW1hbmQuICovCisJU0VUX1NBX0NNRCwJCQkJLyogTmV4dCBjb21tYW5kIGlzIFNldCBTdGF0aW9uIEFkZHIuICovCisJMHgwODA0LAkJCQkJLyogIjQiIGJ5dGVzIG9mIGNvbmZpZyBkYXRhLCA4IGJ5dGUgRklGTy4gKi8KKwkweDJlNDAsCQkJCQkvKiBNYWdpYyB2YWx1ZXMsIGluY2x1ZGluZyBNQUMgZGF0YSBsb2NhdGlvbi4gKi8KKwkwLAkJCQkJLyogVW51c2VkIHBhZCB3b3JkLiAqLworCisJLyogMHgwMDI0OiBTZXR1cCBzdGF0aW9uIGFkZHJlc3MgY29tbWFuZC4gKi8KKwkwLCBDbWRTQVNldHVwLAorCVNFVF9NQ19DTUQsCQkJCS8qIE5leHQgY29tbWFuZC4gKi8KKwkweGFhMDAsMHhiMDAwLDB4MGJhZCwJLyogU3RhdGlvbiBhZGRyZXNzICh0byBiZSBmaWxsZWQgaW4pICovCisKKwkvKiAweDAwMzA6IE5PUCwgbG9vcGluZyBiYWNrIHRvIGl0c2VsZi4gIFBvaW50IHRvIGZpcnN0IFR4IGJ1ZmZlciB0byBUeC4gKi8KKwkwLCBDbWROT3AsIElETEVMT09QLCAwIC8qIHBhZCAqLywKKworCS8qIDB4MDAzODogQSB1bnVzZWQgVGltZS1Eb21haW4gUmVmbGVjdG9tZXRlciBjb21tYW5kLiAqLworCTAsIENtZFREUiwgSURMRUxPT1AsIDAsCisKKwkvKiAweDAwNDA6IEFuIHVudXNlZCBEdW1wIFN0YXRlIGNvbW1hbmQuICovCisJMCwgQ21kRHVtcCwgSURMRUxPT1AsIERVTVBfREFUQSwKKworCS8qIDB4MDA0ODogQW4gdW51c2VkIERpYWdub3NlIGNvbW1hbmQuICovCisJMCwgQ21kRGlhZ25vc2UsIElETEVMT09QLAorCisJLyogMHgwMDRFOiBBbiBlbXB0eSBzZXQtbXVsdGljYXN0LWxpc3QgY29tbWFuZC4gKi8KKwkwLCBDbWRNdWx0aWNhc3RMaXN0LCBJRExFTE9PUCwgMCwKK307CisKKy8qIE5JQyBzcGVjaWZpYyBzdGF0aWMgdmFyaWFibGVzIGdvIGhlcmUgKi8KKworc3RhdGljIHVuc2lnbmVkIHNob3J0CQlpb2FkZHIsIGlycSwgc2NiX2Jhc2U7CitzdGF0aWMgQWRkcmVzcwkJCW1lbV9zdGFydCwgbWVtX2VuZDsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAkJcnhfaGVhZCwgcnhfdGFpbDsKKworI2RlZmluZQlyZWFkX21lbShtLHMpCWZtZW1jcHkoKGNoYXIgKilzLCBtLCBzaXplb2YocykpCisKK3N0YXRpYyB2b2lkIHNldHVwX3J4X2J1ZmZlcnMoc3RydWN0IG5pYyAqbmljKQoreworCUFkZHJlc3MJCQl3cml0ZV9wdHI7CisJdW5zaWduZWQgc2hvcnQJCWN1cl9yeF9idWY7CisJc3RhdGljIHVuc2lnbmVkIHNob3J0CXJ4X2NtZFsxNl0gPSB7CisJCTB4MDAwMCwJCQkvKiBSeCBzdGF0dXMgKi8KKwkJMHgwMDAwLAkJCS8qIFJ4IGNvbW1hbmQsIG9ubHkgYW5kIGxhc3QgKi8KKwkJUlhfQlVGX1NUQVJULAkJLyogTGluayAod2lsbCBiZSBhZGp1c3RlZCkgKi8KKwkJUlhfQlVGX1NUQVJUICsgMjIsCS8qIEJ1ZmZlciBvZmZzZXQgKHdpbGwgYmUgYWRqdXN0ZWQpICovCisJCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCS8qIFBhZCBmb3IgZGVzdCBhZGRyICovCisJCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCS8qIFBhZCBmb3Igc291cmNlIGFkZHIgKi8KKwkJMHgwMDAwLAkJCS8qIFBhZCBmb3IgcHJvdG9jb2wgKi8KKwkJMHgwMDAwLAkJCS8qIEJ1ZmZlcjogQWN0dWFsIGNvdW50ICovCisJCS0xLAkJCS8qIEJ1ZmZlcjogTmV4dCAobm9uZSkgKi8KKwkJUlhfQlVGX1NUQVJUICsgMHgyMCwJLyogQnVmZmVyOiBBZGRyZXNzIGxvdyAoKyBzY2JfYmFzZSkgKHdpbGwgYmUgYWRqdXN0ZWQpICovCisJCTB4MDAwMCwJCQkvKiBCdWZmZXI6IEFkZHJlc3MgaGlnaCAqLworCQkweDgwMDAgfCAoUlhfQlVGX1NJWkUgLSAweDIwKQorCX07CisKKwljdXJfcnhfYnVmID0gcnhfaGVhZCA9IFJYX0JVRl9TVEFSVDsKKwlkbyB7CQkvKiBXaGlsZSB0aGVyZSBpcyByb29tIGZvciBvbmUgbW9yZSBidWZmZXIgKi8KKwkJd3JpdGVfcHRyID0gbWVtX3N0YXJ0ICsgY3VyX3J4X2J1ZjsKKwkJLyogYWRqdXN0IHNvbWUgY29udGVudHMgKi8KKwkJcnhfY21kWzFdID0gMHgwMDAwOworCQlyeF9jbWRbMl0gPSBjdXJfcnhfYnVmICsgUlhfQlVGX1NJWkU7CisJCXJ4X2NtZFszXSA9IGN1cl9yeF9idWYgKyAyMjsKKwkJcnhfY21kWzEzXSA9IGN1cl9yeF9idWYgKyAweDIwICsgc2NiX2Jhc2U7CisJCW1lbWNweSgoY2hhciAqKXdyaXRlX3B0ciwgKGNoYXIgKilyeF9jbWQsIHNpemVvZihyeF9jbWQpKTsKKwkJcnhfdGFpbCA9IGN1cl9yeF9idWY7CisJCWN1cl9yeF9idWYgKz0gUlhfQlVGX1NJWkU7CisJfSB3aGlsZSAoY3VyX3J4X2J1ZiA8PSBSWF9CVUZfRU5EIC0gUlhfQlVGX1NJWkUpOworCS8qIFRlcm1pbmF0ZSB0aGUgbGlzdCBieSBzZXR0aW5nIHRoZSBFT0wgYml0IGFuZCB3cmFwIHRoZXIgcG9pbnRlcgorCSAgIHRvIG1ha2UgdGhlIGxpc3QgYSByaW5nLiAqLworCXdyaXRlX3B0ciA9IG1lbV9zdGFydCArIHJ4X3RhaWw7CisJcnhfY21kWzFdID0gMHhDMDAwOworCXJ4X2NtZFsyXSA9IHJ4X2hlYWQ7CisJbWVtY3B5KChjaGFyICopd3JpdGVfcHRyLCAoY2hhciAqKXJ4X2NtZCwgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSAqIDMpOworfQorCitzdGF0aWMgdm9pZCBhY2tfc3RhdHVzKHZvaWQpCit7CisJdW5zaWduZWQgc2hvcnQJY21kLCBzdGF0dXM7CisJdW5zaWduZWQgc2hvcnQJKnNobWVtID0gKHNob3J0ICopbWVtX3N0YXJ0OworCisJY21kID0gKHN0YXR1cyA9IHNobWVtW2lTQ0JfU1RBVFVTPj4xXSkgJiAweGYwMDA7CisJaWYgKHN0YXR1cyAmIDB4MTAwKQkJLyogQ1Ugc3VzcGVuZGVkPyAqLworCQljbWQgfD0gQ1VDX1JFU1VNRTsKKwlpZiAoKHN0YXR1cyAmIDB4MjAwKSA9PSAwKQkvKiBDVSBub3QgYWN0aXZlPyAqLworCQljbWQgfD0gQ1VDX1NUQVJUOworCWlmIChzdGF0dXMgJiAweDAxMCkJCS8qIFJVIHN1c3BlbmRlZD8gKi8KKwkJY21kIHw9IFJYX1JFU1VNRTsKKwllbHNlIGlmICgoc3RhdHVzICYgMHgwNDApID09IDApCS8qIFJVIG5vdCBhY3RpdmU/ICovCisJCWNtZCB8PSBSWF9TVEFSVDsKKwlpZiAoY21kID09IDApCQkJLyogTm90aGluZyB0byBkbyAqLworCQlyZXR1cm47CisJc2htZW1baVNDQl9DTUQ+PjFdID0gY21kOworI2lmCWRlZmluZWQoREVCVUcpCisJcHJpbnRmKCJTdGF0dXMgJWhYIENvbW1hbmQgJWhYXG4iLCBzdGF0dXMsIGNtZCk7CisjZW5kaWYKKwlvdXRiKDAsIGlvYWRkciArIEk4MjU4Nl9BVFROKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRVNFVCAtIFJlc2V0IGFkYXB0ZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgaTgyNTg2X3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKK3sKKwl1bnNpZ25lZCBsb25nCXRpbWU7CisJdW5zaWduZWQgc2hvcnQJKnNobWVtID0gKHNob3J0ICopbWVtX3N0YXJ0OworCisJLyogcHV0IHRoZSBjYXJkIGluIGl0cyBpbml0aWFsIHN0YXRlICovCisKKyNpZmRlZglJTkNMVURFXzNDNTA3CisJLyogRW5hYmxlIGxvb3BiYWNrIHRvIHByb3RlY3QgdGhlIHdpcmUgd2hpbGUgc3RhcnRpbmcgdXAsCisJICAgYW5kIGhvbGQgdGhlIDU4NiBpbiByZXNldCBkdXJpbmcgdGhlIG1lbW9yeSBpbml0aWFsaXNhdGlvbi4gKi8KKwlvdXRiKDB4MjAsIGlvYWRkciArIE1JU0NfQ1RSTCk7CisjZW5kaWYKKworCS8qIEZpeCB0aGUgSVNDUCBhZGRyZXNzIGFuZCBiYXNlLiAqLworCWluaXRfd29yZHNbM10gPSBzY2JfYmFzZTsKKwlpbml0X3dvcmRzWzddID0gc2NiX2Jhc2U7CisKKwkvKiBXcml0ZSB0aGUgd29yZHMgYXQgMHhmZmY2LiAqLworCS8qIFdyaXRlIHRoZSB3b3JkcyBhdCAweDAwMDAuICovCisJLyogRmlsbCBpbiB0aGUgc3RhdGlvbiBhZGRyZXNzLiAqLworCW1lbWNweSgoY2hhciAqKShtZW1fZW5kIC0gMTApLCAoY2hhciAqKWluaXRfd29yZHMsIDEwKTsKKwltZW1jcHkoKGNoYXIgKiltZW1fc3RhcnQsIChjaGFyICopJmluaXRfd29yZHNbNV0sIHNpemVvZihpbml0X3dvcmRzKSAtIDEwKTsKKwltZW1jcHkoKGNoYXIgKiltZW1fc3RhcnQgKyBTQV9PRkZTRVQsIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7CisJc2V0dXBfcnhfYnVmZmVycyhuaWMpOworCisjaWZkZWYJSU5DTFVERV8zQzUwNworCS8qIFN0YXJ0IHRoZSA1ODYgYnkgcmVsZWFzaW5nIHRoZSByZXNldCBsaW5lLCBidXQgbGVhdmUgbG9vcGJhY2suICovCisJb3V0YigweEEwLCBpb2FkZHIgKyBNSVNDX0NUUkwpOworI2VuZGlmCisKKwkvKiBUaGlzIHdhcyB0aW1lIGNvbnN1bWluZyB0byB0cmFjayBkb3duOyB5b3UgbmVlZCB0byBnaXZlIHR3byBjaGFubmVsCisJICAgYXR0ZW50aW9uIHNpZ25hbHMgdG8gcmVsaWFibHkgc3RhcnQgdXAgdGhlIGk4MjU4Ni4gKi8KKwlvdXRiKDAsIGlvYWRkciArIEk4MjU4Nl9BVFROKTsKKwl0aW1lID0gY3VycnRpY2tzKCkgKyBUSUNLU19QRVJfU0VDOwkvKiBhbGxvdyAxIHNlY29uZCB0byBpbml0ICovCisJd2hpbGUgKAorCQkJc2htZW1baVNDQl9TVEFUVVM+PjFdID09IDApCisJeworCQlpZiAoY3VycnRpY2tzKCkgPiB0aW1lKQorCQl7CisJCQlwcmludGYoImk4MjU4NiBpbml0aWFsaXNhdGlvbiB0aW1lZCBvdXQgd2l0aCBzdGF0dXMgJWhYLCBjbWQgJWhYXG4iLAorCQkJCQlzaG1lbVtpU0NCX1NUQVRVUz4+MV0sIHNobWVtW2lTQ0JfQ01EPj4xXSk7CisJCQlicmVhazsKKwkJfQorCX0KKwkvKiBJc3N1ZSBjaGFubmVsLWF0dG4gLS0gdGhlIDgyNTg2IHdvbid0IHN0YXJ0LiAqLworCW91dGIoMCwgaW9hZGRyICsgSTgyNTg2X0FUVE4pOworCisjaWZkZWYJSU5DTFVERV8zQzUwNworCS8qIERpc2FibGUgbG9vcGJhY2suICovCisJb3V0YigweDgwLCBpb2FkZHIgKyBNSVNDX0NUUkwpOworI2VuZGlmCisjaWYJZGVmaW5lZChERUJVRykKKwlwcmludGYoImk4MjU4NiBzdGF0dXMgJWhYLCBjbWQgJWhYXG4iLAorCQkJc2htZW1baVNDQl9TVEFUVVM+PjFdLCBzaG1lbVtpU0NCX0NNRD4+MV0pOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBQT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgaTgyNTg2X3BvbGwoc3RydWN0IG5pYyAqbmljKQoreworCWludAkJc3RhdHVzOworCXVuc2lnbmVkIHNob3J0CXJmZF9jbWQsIG5leHRfcnhfZnJhbWUsIGRhdGFfYnVmZmVyX2FkZHIsCisJZnJhbWVfc3RhdHVzLCBwa3RfbGVuOworCXVuc2lnbmVkIHNob3J0CSpzaG1lbSA9IChzaG9ydCAqKW1lbV9zdGFydCArIHJ4X2hlYWQ7CisKKwkvKiByZXR1cm4gdHJ1ZSBpZiB0aGVyZSdzIGFuIGV0aGVybmV0IHBhY2tldCByZWFkeSB0byByZWFkICovCisJaWYgKAorCQkJKChmcmFtZV9zdGF0dXMgPSBzaG1lbVswXSkgJiAweDgwMDApID09IDApCisJCXJldHVybiAoMCk7CQkvKiBub3BlICovCisJcmZkX2NtZCA9IHNobWVtWzFdOworCW5leHRfcnhfZnJhbWUgPSBzaG1lbVsyXTsKKwlkYXRhX2J1ZmZlcl9hZGRyID0gc2htZW1bM107CisJcGt0X2xlbiA9IHNobWVtWzExXTsKKwlzdGF0dXMgPSAwOworCWlmIChyZmRfY21kICE9IDAgfHwgZGF0YV9idWZmZXJfYWRkciAhPSByeF9oZWFkICsgMjIKKwkJCXx8IChwa3RfbGVuICYgMHhDMDAwKSAhPSAweEMwMDApCisJCXByaW50ZigiXG5SeCBmcmFtZSBjb3JydXB0LCBkaXNjYXJkZWQiKTsKKwllbHNlIGlmICgoZnJhbWVfc3RhdHVzICYgMHgyMDAwKSA9PSAwKQorCQlwcmludGYoIlxuUnggZnJhbWUgaGFkIGVycm9yIik7CisJZWxzZQorCXsKKwkJLyogV2UgaGF2ZSBhIGZyYW1lLCBjb3B5IGl0IHRvIG91ciBidWZmZXIgKi8KKwkJcGt0X2xlbiAmPSAweDNGRkY7CisJCW1lbWNweShuaWMtPnBhY2tldCwgKGNoYXIgKiltZW1fc3RhcnQgKyByeF9oZWFkICsgMHgyMCwgcGt0X2xlbik7CisJCS8qIE9ubHkgcGFja2V0cyBub3QgZnJvbSBvdXJzZWxmICovCisJCWlmIChtZW1jbXAobmljLT5wYWNrZXQgKyBFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKSAhPSAwKQorCQl7CisJCQluaWMtPnBhY2tldGxlbiA9IHBrdF9sZW47CisJCQlzdGF0dXMgPSAxOworCQl9CisJfQorCS8qIENsZWFyIHRoZSBzdGF0dXMgd29yZCBhbmQgc2V0IEVPTCBvbiBSeCBmcmFtZSAqLworCXNobWVtWzBdID0gMDsKKwlzaG1lbVsxXSA9IDB4QzAwMDsKKwkqKHNob3J0ICopKG1lbV9zdGFydCArIHJ4X3RhaWwgKyAyKSA9IDA7CisJcnhfdGFpbCA9IHJ4X2hlYWQ7CisJcnhfaGVhZCA9IG5leHRfcnhfZnJhbWU7CisJYWNrX3N0YXR1cygpOworCXJldHVybiAoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIFRSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGk4MjU4Nl90cmFuc21pdCgKKwkJc3RydWN0IG5pYyAqbmljLAorCQljb25zdCBjaGFyICpkLAkJCS8qIERlc3RpbmF0aW9uICovCisJCXVuc2lnbmVkIGludCB0LAkJCS8qIFR5cGUgKi8KKwkJdW5zaWduZWQgaW50IHMsCQkJLyogc2l6ZSAqLworCQljb25zdCBjaGFyICpwKQkJCS8qIFBhY2tldCAqLworeworCUFkZHJlc3MJCQlicHRyOworCXVuc2lnbmVkIHNob3J0CQl0eXBlLCB6OworCXN0YXRpYyB1bnNpZ25lZCBzaG9ydAl0eF9jbWRbMTFdID0geworCQkweDAsCQkJLyogVHggc3RhdHVzICovCisJCUNtZFR4LAkJCS8qIFR4IGNvbW1hbmQgKi8KKwkJVFhfQlVGX1NUQVJUKzE2LAkvKiBOZXh0IGNvbW1hbmQgaXMgYSBOb09wICovCisJCVRYX0JVRl9TVEFSVCs4LAkJLyogRGF0YSBCdWZmZXIgb2Zmc2V0ICovCisJCTB4ODAwMCwJCQkvKiB8IHdpdGggc2l6ZSAqLworCQkweGZmZmYsCQkJLyogTm8gbmV4dCBkYXRhIGJ1ZmZlciAqLworCQlUWF9CVUZfU1RBUlQrMjIsCS8qICsgc2NiX2Jhc2UgKi8KKwkJMHgwLAkJCS8qIEJ1ZmZlciBhZGRyZXNzIGhpZ2ggYml0cyAoYWx3YXlzIHplcm8pICovCisJCTB4MCwJCQkvKiBOb3Agc3RhdHVzICovCisJCUNtZE5PcCwJCQkvKiBOb3AgY29tbWFuZCAqLworCQlUWF9CVUZfU1RBUlQrMTYJCS8qIE5leHQgaXMgbXlzZWxmICovCisJfTsKKwl1bnNpZ25lZCBzaG9ydAkqc2htZW0gPSAoc2hvcnQgKiltZW1fc3RhcnQgKyBUWF9CVUZfU1RBUlQ7CisKKwkvKiBzZW5kIHRoZSBwYWNrZXQgdG8gZGVzdGluYXRpb24gKi8KKwkvKiBhZGp1c3Qgc29tZSBjb250ZW50cyAqLworCXR5cGUgPSBodG9ucyh0KTsKKwlpZiAocyA8IEVUSF9aTEVOKQorCQlzID0gRVRIX1pMRU47CisJdHhfY21kWzRdID0gKHMgKyBFVEhfSExFTikgfCAweDgwMDA7CisJdHhfY21kWzZdID0gVFhfQlVGX1NUQVJUICsgMjIgKyBzY2JfYmFzZTsKKwlicHRyID0gbWVtX3N0YXJ0ICsgVFhfQlVGX1NUQVJUOworCW1lbWNweSgoY2hhciAqKWJwdHIsIChjaGFyICopdHhfY21kLCBzaXplb2YodHhfY21kKSk7CisJYnB0ciArPSBzaXplb2YodHhfY21kKTsKKwltZW1jcHkoKGNoYXIgKilicHRyLCBkLCBFVEhfQUxFTik7CisJYnB0ciArPSBFVEhfQUxFTjsKKwltZW1jcHkoKGNoYXIgKilicHRyLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOworCWJwdHIgKz0gRVRIX0FMRU47CisJbWVtY3B5KChjaGFyICopYnB0ciwgKGNoYXIgKikmdHlwZSwgc2l6ZW9mKHR5cGUpKTsKKwlicHRyICs9IHNpemVvZih0eXBlKTsKKwltZW1jcHkoKGNoYXIgKilicHRyLCBwLCBzKTsKKwkvKiBDaGFuZ2UgdGhlIG9mZnNldCBpbiB0aGUgSURMRUxPT1AgKi8KKwkqKHVuc2lnbmVkIHNob3J0ICopKG1lbV9zdGFydCArIElETEVMT09QICsgNCkgPSBUWF9CVUZfU1RBUlQ7CisJLyogV2FpdCBmb3IgdHJhbnNtaXQgY29tcGxldGlvbiAqLworCXdoaWxlICgKKwkJCShzaG1lbVswXSAmIDB4MjAwMCkgPT0gMCkKKwkJOworCS8qIENoYW5nZSB0aGUgb2Zmc2V0IGluIHRoZSBJRExFTE9PUCBiYWNrIGFuZAorCSAgIGNoYW5nZSB0aGUgZmluYWwgbG9vcCB0byBwb2ludCBoZXJlICovCisJKih1bnNpZ25lZCBzaG9ydCAqKShtZW1fc3RhcnQgKyBJRExFTE9PUCArIDQpID0gSURMRUxPT1A7CisJKih1bnNpZ25lZCBzaG9ydCAqKShtZW1fc3RhcnQgKyBUWF9CVUZfU1RBUlQgKyAyMCkgPSBJRExFTE9PUDsKKwlhY2tfc3RhdHVzKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBESVNBQkxFIC0gVHVybiBvZmYgZXRoZXJuZXQgaW50ZXJmYWNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgaTgyNTg2X2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQoreworCXVuc2lnbmVkIHNob3J0CSpzaG1lbSA9IChzaG9ydCAqKW1lbV9zdGFydDsKKworI2lmCTAKKwkvKiBGbHVzaCB0aGUgVHggYW5kIGRpc2FibGUgUnguICovCisJc2htZW1baVNDQl9DTUQ+PjFdID0gUlhfU1VTUEVORCB8IENVQ19TVVNQRU5EOworCW91dGIoMCwgaW9hZGRyICsgSTgyNTg2X0FUVE4pOworI2lmZGVmCUlOQ0xVREVfTkk1MjEwCisJb3V0YigwLCBpb2FkZHIgKyBOSTUyX1JFU0VUKTsKKyNlbmRpZgorI2VuZGlmCS8qIDAgKi8KK30KKworI2lmZGVmCUlOQ0xVREVfM0M1MDcKKworc3RhdGljIGludCB0NTA3X3Byb2JlMShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0IGlvYWRkcikKK3sKKwlpbnQJCQlpOworCUFkZHJlc3MJCQlzaXplOworCWNoYXIJCQltZW1fY29uZmlnOworCWNoYXIJCQlpZl9wb3J0OworCisJaWYgKGluYihpb2FkZHIpICE9ICcqJyB8fCBpbmIoaW9hZGRyKzEpICE9ICczJworCQl8fCBpbmIoaW9hZGRyKzIpICE9ICdDJyB8fCBpbmIoaW9hZGRyKzMpICE9ICdPJykKKwkJcmV0dXJuICgwKTsKKwlpcnEgPSBpbmIoaW9hZGRyICsgSVJRX0NPTkZJRykgJiAweDBmOworCW1lbV9jb25maWcgPSBpbmIoaW9hZGRyICsgTUVNX0NPTkZJRyk7CisJaWYgKG1lbV9jb25maWcgJiAweDIwKQorCXsKKwkJc2l6ZSA9IDY1NTM2TDsKKwkJbWVtX3N0YXJ0ID0gMHhmMDAwMDBMICsgKG1lbV9jb25maWcgJiAweDA4ID8gMHgwODAwMDBMCisJCQk6ICgoKEFkZHJlc3MpbWVtX2NvbmZpZyAmIDB4MykgPDwgMTcpKTsKKwl9CisJZWxzZQorCXsKKwkJc2l6ZSA9ICgoKChBZGRyZXNzKW1lbV9jb25maWcgJiAweDMpICsgMSkgPDwgMTQpOworCQltZW1fc3RhcnQgPSAweDBjMDAwMEwgKyAoKChBZGRyZXNzKW1lbV9jb25maWcgJiAweDE4KSA8PCAxMik7CisJfQorCW1lbV9lbmQgPSBtZW1fc3RhcnQgKyBzaXplOworCXNjYl9iYXNlID0gNjU1MzZMIC0gc2l6ZTsKKwlpZl9wb3J0ID0gaW5iKGlvYWRkciArIFJPTV9DT05GSUcpICYgMHg4MDsKKwkvKiBHZXQgc3RhdGlvbiBhZGRyZXNzICovCisJb3V0YigweDAxLCBpb2FkZHIgKyBNSVNDX0NUUkwpOworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgKytpKQorCXsKKwkJbmljLT5ub2RlX2FkZHJbaV0gPSBpbmIoaW9hZGRyK2kpOworCX0KKwlwcmludGYoIlxuM2M1MDcgaW9hZGRyICUjaFgsIElSUSAlZCwgbWVtIFslI1gtJSNYXSwgJXN0ZXJuYWwgeGN2ciwgYWRkciAlIVxuIiwKKwkJaW9hZGRyLCBpcnEsIG1lbV9zdGFydCwgbWVtX2VuZCwgaWZfcG9ydCA/ICJpbiIgOiAiZXgiLCBuaWMtPm5vZGVfYWRkcik7CisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQUk9CRSAtIExvb2sgZm9yIGFuIGFkYXB0ZXIsIHRoaXMgcm91dGluZSdzIHZpc2libGUgdG8gdGhlIG91dHNpZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IG5pYyAqdDUwN19wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZV9hZGRycykKK3sKKwlzdGF0aWMgdW5zaWduZWQgY2hhcglpbml0X0lEX2RvbmUgPSAwOworCXVuc2lnbmVkIHNob3J0CQlscnNfc3RhdGUgPSAweGZmOworCXN0YXRpYyB1bnNpZ25lZCBzaG9ydAlpb19hZGRyc1tdID0geyAweDMwMCwgMHgzMjAsIDB4MzQwLCAweDI4MCwgMCB9OworCXVuc2lnbmVkIHNob3J0CQkqcDsKKwlpbnQJCQlpOworCisJaWYgKGluaXRfSURfZG9uZSA9PSAwKQorCXsKKwkJLyogU2VuZCB0aGUgSUQgc2VxdWVuY2UgdG8gdGhlIElEX1BPUlQgdG8gZW5hYmxlIHRoZSBib2FyZCAqLworCQlvdXRiKDB4MDAsIElEX1BPUlQpOworCQlmb3IgKGkgPSAwOyBpIDwgMjU1OyArK2kpCisJCXsKKwkJCW91dGIobHJzX3N0YXRlLCBJRF9QT1JUKTsKKwkJCWxyc19zdGF0ZSA8PD0gMTsKKwkJCWlmIChscnNfc3RhdGUgJiAweDEwMCkKKwkJCQlscnNfc3RhdGUgXj0gMHhlNzsKKwkJfQorCQlvdXRiKDB4MDAsIElEX1BPUlQpOworCQlpbml0X0lEX2RvbmUgPSAxOworCX0KKwkvKiBpZiBwcm9iZV9hZGRycyBpcyAwLCB0aGVuIHJvdXRpbmUgY2FuIHVzZSBhIGhhcmR3aXJlZCBkZWZhdWx0ICovCisJaWYgKHByb2JlX2FkZHJzID09IDApCisJCXByb2JlX2FkZHJzID0gaW9fYWRkcnM7CisJZm9yIChwID0gcHJvYmVfYWRkcnM7IChpb2FkZHIgPSAqcCkgIT0gMDsgKytwKQorCQlpZiAodDUwN19wcm9iZTEobmljLCBpb2FkZHIpKQorCQkJYnJlYWs7CisJaWYgKGlvYWRkciAhPSAwKQorCXsKKwkJLyogcG9pbnQgdG8gTklDIHNwZWNpZmljIHJvdXRpbmVzICovCisJCWk4MjU4Nl9yZXNldChuaWMpOworCQluaWMtPnJlc2V0ID0gaTgyNTg2X3Jlc2V0OworCQluaWMtPnBvbGwgPSBpODI1ODZfcG9sbDsKKwkJbmljLT50cmFuc21pdCA9IGk4MjU4Nl90cmFuc21pdDsKKwkJbmljLT5kaXNhYmxlID0gaTgyNTg2X2Rpc2FibGU7CisJCXJldHVybiBuaWM7CisJfQorCS8qIGVsc2UgKi8KKwl7CisJCXJldHVybiAwOworCX0KK30KKworI2VuZGlmCisKKyNpZmRlZglJTkNMVURFX05JNTIxMAorCitzdGF0aWMgaW50IG5pNTIxMF9wcm9iZTIodm9pZCkKK3sKKwl1bnNpZ25lZCBzaG9ydAkJaTsKKwl1bnNpZ25lZCBzaG9ydAkJc2htZW1bMTBdOworCisJLyogRml4IHRoZSBJU0NQIGFkZHJlc3MgYW5kIGJhc2UuICovCisJaW5pdF93b3Jkc1szXSA9IHNjYl9iYXNlOworCWluaXRfd29yZHNbN10gPSBzY2JfYmFzZTsKKworCS8qIFdyaXRlIHRoZSB3b3JkcyBhdCAweGZmZjYuICovCisJLyogV3JpdGUgdGhlIHdvcmRzIGF0IDB4MDAwMC4gKi8KKwltZW1jcHkoKGNoYXIgKikobWVtX2VuZCAtIDEwKSwgKGNoYXIgKilpbml0X3dvcmRzLCAxMCk7CisJbWVtY3B5KChjaGFyICopbWVtX3N0YXJ0LCAoY2hhciAqKSZpbml0X3dvcmRzWzVdLCBzaXplb2YoaW5pdF93b3JkcykgLSAxMCk7CisJaWYgKCoodW5zaWduZWQgc2hvcnQgKiltZW1fc3RhcnQgIT0gMSkKKwkJcmV0dXJuICgwKTsKKwlvdXRiKDAsIGlvYWRkciArIE5JNTJfUkVTRVQpOworCW91dGIoMCwgaW9hZGRyICsgSTgyNTg2X0FUVE4pOworCXVkZWxheSgzMik7CisJaSA9IDUwOworCXdoaWxlICgKKwkJc2htZW1baVNDQl9TVEFUVVM+PjFdID09IDApCisJeworCQlpZiAoLS1pID09IDApCisJCXsKKwkJCXByaW50ZigiaTgyNTg2IGluaXRpYWxpc2F0aW9uIHRpbWVkIG91dCB3aXRoIHN0YXR1cyAlaFgsIGNtZCAlaFhcbiIsCisJCQkJc2htZW1baVNDQl9TVEFUVVM+PjFdLCBzaG1lbVtpU0NCX0NNRD4+MV0pOworCQkJYnJlYWs7CisJCX0KKwl9CisJLyogSXNzdWUgY2hhbm5lbC1hdHRuIC0tIHRoZSA4MjU4NiB3b24ndCBzdGFydC4gKi8KKwlvdXRiKDAsIGlvYWRkciArIEk4MjU4Nl9BVFROKTsKKwlpZiAoKih1bnNpZ25lZCBzaG9ydCAqKW1lbV9zdGFydCAhPSAwKQorCQlyZXR1cm4gKDApOworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQgbmk1MjEwX3Byb2JlMShzdHJ1Y3QgbmljICpuaWMpCit7CisJaW50CQkJaTsKKwlzdGF0aWMgQWRkcmVzcwkJbWVtX2FkZHJzW10gPSB7CisJCTB4YzAwMDAsIDB4YzQwMDAsIDB4YzgwMDAsIDB4Y2MwMDAsCisJCTB4ZDAwMDAsIDB4ZDQwMDAsIDB4ZDgwMDAsIDB4ZGMwMDAsCisJCTB4ZTAwMDAsIDB4ZTQwMDAsIDB4ZTgwMDAsIDB4ZWMwMDAsCisJCTAgfTsKKwlBZGRyZXNzCQkJKnA7CisKKwlpZiAoaW5iKGlvYWRkciArIDYpICE9IDB4MCB8fCBpbmIoaW9hZGRyICsgNykgIT0gMHg1NSkKKwkJcmV0dXJuICgwKTsKKwlzY2JfYmFzZSA9IC04MTkyOwkJLyogYXNzdW1lIDhrIG1lbW9yeSAqLworCWZvciAocCA9IG1lbV9hZGRyczsgKG1lbV9zdGFydCA9ICpwKSAhPSAwOyArK3ApCisJCWlmIChtZW1fZW5kID0gbWVtX3N0YXJ0ICsgODE5Miwgbmk1MjEwX3Byb2JlMigpKQorCQkJYnJlYWs7CisJaWYgKG1lbV9zdGFydCA9PSAwKQorCQlyZXR1cm4gKDApOworCS8qIEdldCBzdGF0aW9uIGFkZHJlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47ICsraSkKKwl7CisJCW5pYy0+bm9kZV9hZGRyW2ldID0gaW5iKGlvYWRkcitpKTsKKwl9CisJcHJpbnRmKCJcbk5JNTIxMCBpb2FkZHIgJSNoWCwgbWVtIFslI1gtJSNYXSwgYWRkciAlIVxuIiwKKwkJaW9hZGRyLCBtZW1fc3RhcnQsIG1lbV9lbmQsIG5pYy0+bm9kZV9hZGRyKTsKKwlyZXR1cm4gKDEpOworfQorCitzdHJ1Y3QgbmljICpuaTUyMTBfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVfYWRkcnMpCit7CisJLyogbWlzc2luZyBlbnRyaWVzIGFyZSBhZGRyZXNzZXMgdXN1YWxseSBhbHJlYWR5IHVzZWQgKi8KKwlzdGF0aWMgdW5zaWduZWQgc2hvcnQJaW9fYWRkcnNbXSA9IHsKKwkJMHgyMDAsIDB4MjA4LCAweDIxMCwgMHgyMTgsIDB4MjIwLCAweDIyOCwgMHgyMzAsIDB4MjM4LAorCQkweDI0MCwgMHgyNDgsIDB4MjUwLCAweDI1OCwgMHgyNjAsIDB4MjY4LCAweDI3MCwgLypQYXIqLworCQkweDI4MCwgMHgyODgsIDB4MjkwLCAweDI5OCwgMHgyQTAsIDB4MkE4LCAweDJCMCwgMHgyQjgsCisJCTB4MkMwLCAweDJDOCwgMHgyRDAsIDB4MkQ4LCAweDJFMCwgMHgyRTgsIDB4MkYwLCAvKlNlciovCisJCTB4MzAwLCAweDMwOCwgMHgzMTAsIDB4MzE4LCAweDMyMCwgMHgzMjgsIDB4MzMwLCAweDMzOCwKKwkJMHgzNDAsIDB4MzQ4LCAweDM1MCwgMHgzNTgsIDB4MzYwLCAweDM2OCwgMHgzNzAsIC8qUGFyKi8KKwkJMHgzODAsIDB4Mzg4LCAweDM5MCwgMHgzOTgsIDB4M0EwLCAweDNBOCwgLypWaWQsUGFyKi8KKwkJMHgzQzAsIDB4M0M4LCAweDNEMCwgMHgzRDgsIDB4M0UwLCAweDNFOCwgLypTZXIqLworCQkweDAKKwl9OworCXVuc2lnbmVkIHNob3J0CQkqcDsKKwlpbnQJCQlpOworCisJLyogaWYgcHJvYmVfYWRkcnMgaXMgMCwgdGhlbiByb3V0aW5lIGNhbiB1c2UgYSBoYXJkd2lyZWQgZGVmYXVsdCAqLworCWlmIChwcm9iZV9hZGRycyA9PSAwKQorCQlwcm9iZV9hZGRycyA9IGlvX2FkZHJzOworCWZvciAocCA9IHByb2JlX2FkZHJzOyAoaW9hZGRyID0gKnApICE9IDA7ICsrcCkKKwkJaWYgKG5pNTIxMF9wcm9iZTEobmljKSkKKwkJCWJyZWFrOworCWlmIChpb2FkZHIgIT0gMCkKKwl7CisJCS8qIHBvaW50IHRvIE5JQyBzcGVjaWZpYyByb3V0aW5lcyAqLworCQlpODI1ODZfcmVzZXQobmljKTsKKwkJbmljLT5yZXNldCA9IGk4MjU4Nl9yZXNldDsKKwkJbmljLT5wb2xsID0gaTgyNTg2X3BvbGw7CisJCW5pYy0+dHJhbnNtaXQgPSBpODI1ODZfdHJhbnNtaXQ7CisJCW5pYy0+ZGlzYWJsZSA9IGk4MjU4Nl9kaXNhYmxlOworCQlyZXR1cm4gbmljOworCX0KKwkvKiBlbHNlICovCisJeworCQlyZXR1cm4gMDsKKwl9Cit9CisjZW5kaWYKKworI2lmZGVmCUlOQ0xVREVfRVhPUzIwNQorCisvKgorICogQ29kZSB0byBkb3dubG9hZCB0byBJMTg2IGluIEVYT1MyMDUKKyAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBleG9zX2kxODZfaW5pdFtdID0KK3sKKzB4MDgsMHgwMCwweDE0LDB4MDAsMHgwMCwweDAwLDB4YWEsMHhmYSwweDMzLDB4YzAsMHhiYSwweGZlLDB4ZmYsMHhlZiwweGI4LDB4ZjgsCisweGZmLDB4ZTcsMHhhMCwweGI4LDB4N2MsMHgwMCwweGU3LDB4YTQsMHhiOCwweGJjLDB4ODAsMHhlNywweGE4LDB4OGMsMHhjOCwweDhlLAorMHhkOCwweGJiLDB4MmYsMHgwZSwweGM2LDB4MDcsMHhhNSwweDMzLDB4YzksMHhlYiwweDAwLDB4ZWIsMHgwMCwweGViLDB4MDAsMHhlMiwKKzB4ZjgsMHhiZSwweDJjLDB4MGUsMHhiYSwweDAyLDB4MDUsMHgzMywweGRiLDB4YjksMHgwMywweDAwLDB4ZWMsMHgyNCwweDBmLDB4OGEsCisweGUwLDB4MDIsMHhkOCwweDQyLDB4NDIsMHhlYywweDAyLDB4ZDgsMHhkMCwweGUwLDB4ZDAsMHhlMCwweGQwLDB4ZTAsMHhkMCwweGUwLAorMHgwYSwweGM0LDB4ODgsMHgwNCwweDQyLDB4NDIsMHg0NiwweGUyLDB4ZTMsMHg4YSwweGUzLDB4ZDAsMHhlYywweGQwLDB4ZWMsMHhkMCwKKzB4ZWMsMHhkMCwweGVjLDB4ODAsMHhlMywweDBmLDB4MDIsMHhlMywweDgwLDB4ZjQsMHgwNSwweGVjLDB4M2EsMHhlMCwweDc0LDB4MDUsCisweGM2LDB4MDQsMHg1YSwweGViLDB4ZmUsMHhjNiwweDA0LDB4NTUsMHgzMywweGMwLDB4OGUsMHhkOCwweGJlLDB4MzgsMHgwMCwweGM3LAorMHgwNCwweGNlLDB4MGUsMHg0NiwweDQ2LDB4YzcsMHgwNCwweDAwLDB4ZmYsMHhmYiwweGJhLDB4M2MsMHgwMCwweGI4LDB4MDMsMHgwMCwKKzB4ZWYsMHgzMywweGRiLDB4MzMsMHhjOSwweGJkLDB4MDQsMHgwZiwweDkwLDB4OTAsMHg5MCwweDkwLDB4ZTIsMHhmYSwweDQzLDB4MmUsCisweDg5LDB4NWUsMHgwMCwweGViLDB4ZjMsMHg1MiwweGJhLDB4MDAsMHgwNiwweGVmLDB4NTAsMHg1MywweDU1LDB4YmQsMHhmOCwweDBlLAorMHgyZSwweDhiLDB4NWUsMHgwMCwweDQzLDB4MmUsMHg4OSwweDVlLDB4MDAsMHhiYSwweDIyLDB4MDAsMHhiOCwweDAwLDB4ODAsMHhlZiwKKzB4NWQsMHg1YiwweDU4LDB4NWEsMHhjZiwweDQ5LDB4NGUsMHg1NCwweDUyLDB4MjAsMHg2MywweDZlLDB4NzQsMHgyZCwweDNlLDB4MDAsCisweDAwLDB4NGMsMHg0ZiwweDRmLDB4NTAsMHgyMCwweDYzLDB4NmUsMHg3NCwweDJkLDB4M2UsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZWEsMHgzMCwweDBlLDB4MDAsMHhmZiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMDAKK307CisKKy8qIFRoZXNlIG9mZnNldHMgYXJlIGZyb20gdGhlIGVuZCBvZiB0aGUgaTE4NiBkb3dubG9hZCBjb2RlICovCisKKyNkZWZpbmUJT0ZGU0VUX1NFTUEJCTB4MUQxCisjZGVmaW5lCU9GRlNFVF9BRERSCQkweDFENworCitzdGF0aWMgaW50IGV4b3MyMDVfcHJvYmUyKHZvaWQpCit7CisJdW5zaWduZWQgc2hvcnQJCWk7CisJdW5zaWduZWQgc2hvcnQJCXNobWVtWzEwXTsKKworCS8qIEZpeCB0aGUgSVNDUCBhZGRyZXNzIGFuZCBiYXNlLiAqLworCWluaXRfd29yZHNbM10gPSBzY2JfYmFzZTsKKwlpbml0X3dvcmRzWzddID0gc2NiX2Jhc2U7CisKKwkvKiBXcml0ZSB0aGUgd29yZHMgYXQgMHhmZmY2LiAqLworCS8qIFdyaXRlIHRoZSB3b3JkcyBhdCAweDAwMDAuICovCisJbWVtY3B5KChjaGFyICopKG1lbV9lbmQgLSAxMCksIChjaGFyICopaW5pdF93b3JkcywgMTApOworCW1lbWNweSgoY2hhciAqKW1lbV9zdGFydCwgKGNoYXIgKikmaW5pdF93b3Jkc1s1XSwgc2l6ZW9mKGluaXRfd29yZHMpIC0gMTApOworCWlmICgqKHVuc2lnbmVkIHNob3J0ICopbWVtX3N0YXJ0ICE9IDEpCisJCXJldHVybiAoMCk7CisJb3V0YigwLCBpb2FkZHIgKyBFWE9TMjA1X1JFU0VUKTsKKwlvdXRiKDAsIGlvYWRkciArIEk4MjU4Nl9BVFROKTsKKwlpID0gNTA7CisJd2hpbGUgKAorCQlzaG1lbVtpU0NCX1NUQVRVUz4+MV0gPT0gMCkKKwl7CisJCWlmICgtLWkgPT0gMCkKKwkJeworCQkJcHJpbnRmKCJpODI1ODYgaW5pdGlhbGlzYXRpb24gdGltZWQgb3V0IHdpdGggc3RhdHVzICVoWCwgY21kICVoWFxuIiwKKwkJCQlzaG1lbVtpU0NCX1NUQVRVUz4+MV0sIHNobWVtW2lTQ0JfQ01EPj4xXSk7CisJCQlicmVhazsKKwkJfQorCX0KKwkvKiBJc3N1ZSBjaGFubmVsLWF0dG4gLS0gdGhlIDgyNTg2IHdvbid0IHN0YXJ0LiAqLworCW91dGIoMCwgaW9hZGRyICsgSTgyNTg2X0FUVE4pOworCWlmICgqKHVuc2lnbmVkIHNob3J0ICopbWVtX3N0YXJ0ICE9IDApCisJCXJldHVybiAoMCk7CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIGludCBleG9zMjA1X3Byb2JlMShzdHJ1Y3QgbmljICpuaWMpCit7CisJaW50CQkJaTsKKwkvKiBJZiB5b3Uga25vdyB0aGUgb3RoZXIgYWRkcmVzc2VzIHBsZWFzZSBsZXQgbWUga25vdyAqLworCXN0YXRpYyBBZGRyZXNzCQltZW1fYWRkcnNbXSA9IHsKKwkJMHhjYzAwMCwgMCB9OworCUFkZHJlc3MJCQkqcDsKKworCXNjYl9iYXNlID0gLTE2Mzg0OwkJLyogYXNzdW1lIDhrIG1lbW9yeSAqLworCWZvciAocCA9IG1lbV9hZGRyczsgKG1lbV9zdGFydCA9ICpwKSAhPSAwOyArK3ApCisJCWlmIChtZW1fZW5kID0gbWVtX3N0YXJ0ICsgMTYzODQsIGV4b3MyMDVfcHJvYmUyKCkpCisJCQlicmVhazsKKwlpZiAobWVtX3N0YXJ0ID09IDApCisJCXJldHVybiAoMCk7CisJLyogR2V0IHN0YXRpb24gYWRkcmVzcyAqLworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgKytpKQorCXsKKwkJbmljLT5ub2RlX2FkZHJbaV0gPSBpbmIoaW9hZGRyK2kpOworCX0KKwlwcmludGYoIlxuRVhPUzIwNSBpb2FkZHIgJSNoWCwgbWVtIFslI1gtJSNYXSwgYWRkciAlIVxuIiwKKwkJaW9hZGRyLCBtZW1fc3RhcnQsIG1lbV9lbmQsIG5pYy0+bm9kZV9hZGRyKTsKKwlyZXR1cm4gKDEpOworfQorCitzdHJ1Y3QgbmljICpleG9zMjA1X3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlX2FkZHJzKQoreworCS8qIElmIHlvdSBrbm93IHRoZSBvdGhlciBhZGRyZXNzZXMsIHBsZWFzZSBsZXQgbWUga25vdyAqLworCXN0YXRpYyB1bnNpZ25lZCBzaG9ydAlpb19hZGRyc1tdID0geworCQkweDMxMCwgMHgwCisJfTsKKwl1bnNpZ25lZCBzaG9ydAkJKnA7CisJaW50CQkJaTsKKworCS8qIGlmIHByb2JlX2FkZHJzIGlzIDAsIHRoZW4gcm91dGluZSBjYW4gdXNlIGEgaGFyZHdpcmVkIGRlZmF1bHQgKi8KKwlpZiAocHJvYmVfYWRkcnMgPT0gMCkKKwkJcHJvYmVfYWRkcnMgPSBpb19hZGRyczsKKwlmb3IgKHAgPSBwcm9iZV9hZGRyczsgKGlvYWRkciA9ICpwKSAhPSAwOyArK3ApCisJCWlmIChleG9zMjA1X3Byb2JlMShuaWMpKQorCQkJYnJlYWs7CisJaWYgKGlvYWRkciAhPSAwKQorCXsKKwkJLyogcG9pbnQgdG8gTklDIHNwZWNpZmljIHJvdXRpbmVzICovCisJCWk4MjU4Nl9yZXNldChuaWMpOworCQluaWMtPnJlc2V0ID0gaTgyNTg2X3Jlc2V0OworCQluaWMtPnBvbGwgPSBpODI1ODZfcG9sbDsKKwkJbmljLT50cmFuc21pdCA9IGk4MjU4Nl90cmFuc21pdDsKKwkJbmljLT5kaXNhYmxlID0gaTgyNTg2X2Rpc2FibGU7CisJCXJldHVybiBuaWM7CisJfQorCS8qIGVsc2UgKi8KKwl7CisJCXJldHVybiAwOworCX0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXRib290L2xhbmNlLmMgYi9uZXRib290L2xhbmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiMTExOQotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvbGFuY2UuYwpAQCAtMCwwICsxLDU2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitFdGhlcmJvb3QgLSAgQk9PVFAvVEZUUCBCb290c3RyYXAgUHJvZ3JhbQorTEFOQ0UgTklDIGRyaXZlciBmb3IgRXRoZXJib290CitMYXJnZSBwb3J0aW9ucyBib3Jyb3dlZCBmcm9tIHRoZSBMaW51eCBMQU5DRSBkcml2ZXIgYnkgRG9uYWxkIEJlY2tlcgorS2VuIFlhcCwgSnVseSAxOTk3CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKy8qIHRvIGdldCBzb21lIGdsb2JhbCByb3V0aW5lcyBsaWtlIHByaW50ZiAqLworI2luY2x1ZGUgImV0aGVyYm9vdC5oIgorLyogdG8gZ2V0IHRoZSBpbnRlcmZhY2UgdG8gdGhlIGJvZHkgb2YgdGhlIHByb2dyYW0gKi8KKyNpbmNsdWRlICJuaWMuaCIKKyNpZmRlZglJTkNMVURFX0xBTkNFCisjaW5jbHVkZSAicGNpLmgiCisjZW5kaWYKKyNpbmNsdWRlICJjYXJkcy5oIgorCisvKiBPZmZzZXRzIGZyb20gYmFzZSBJL08gYWRkcmVzcyAqLworI2lmCWRlZmluZWQoSU5DTFVERV9ORTIxMDApIHx8IGRlZmluZWQoSU5DTFVERV9MQU5DRSkKKyNkZWZpbmUJTEFOQ0VfRVRIX0FERFIJMHgwCisjZGVmaW5lCUxBTkNFX0RBVEEJMHgxMAorI2RlZmluZQlMQU5DRV9BRERSCTB4MTIKKyNkZWZpbmUJTEFOQ0VfUkVTRVQJMHgxNAorI2RlZmluZQlMQU5DRV9CVVNfSUYJMHgxNgorI2RlZmluZQlMQU5DRV9UT1RBTF9TSVpFCTB4MTgKKyNlbmRpZgorI2lmZGVmCUlOQ0xVREVfTkk2NTEwCisjZGVmaW5lCUxBTkNFX0VUSF9BRERSCTB4OAorI2RlZmluZQlMQU5DRV9EQVRBCTB4MAorI2RlZmluZQlMQU5DRV9BRERSCTB4MgorI2RlZmluZQlMQU5DRV9SRVNFVAkweDQKKyNkZWZpbmUJTEFOQ0VfQlVTX0lGCTB4NgorI2RlZmluZQlMQU5DRV9UT1RBTF9TSVpFCTB4MTAKKyNlbmRpZgorCisvKiBsYW5jZV9wb2xsKCkgbm93IGNhbiB1c2UgbXVsdGlwbGUgUnggYnVmZmVycyB0byBwcmV2ZW50IHBhY2tldCBsb3NzLiBTZXQKKyAqIFNldCBMQU5DRV9MT0dfUlhfQlVGRkVSUyB0byAwLi43IGZvciAxLCAyLCA0LCA4LCAxNiwgMzIsIDY0IG9yIDEyOCBSeAorICogYnVmZmVycy4gVXN1YWxseSA0ICg9MTYgUnggYnVmZmVycykgaXMgYSBnb29kIHZhbHVlLiAoQW5kcmVhcyBOZXVoYXVzKQorICogRGVjcmVhc2VkIHRvIDIgKD00IFJ4IGJ1ZmZlcnMpIChLZW4gWWFwLCAyMDAxMDMwNSkgKi8KKworI2RlZmluZSBMQU5DRV9MT0dfUlhfQlVGRkVSUwkyCQkvKiBVc2UgMl4yPTQgUnggYnVmZmVycyAqLworCisjZGVmaW5lIFJYX1JJTkdfU0laRQkJKDEgPDwgKExBTkNFX0xPR19SWF9CVUZGRVJTKSkKKyNkZWZpbmUgUlhfUklOR19NT0RfTUFTSwkoUlhfUklOR19TSVpFIC0gMSkKKyNkZWZpbmUgUlhfUklOR19MRU5fQklUUwkoKExBTkNFX0xPR19SWF9CVUZGRVJTKSA8PCAyOSkKKworc3RydWN0IGxhbmNlX2luaXRfYmxvY2sKK3sKKwl1bnNpZ25lZCBzaG9ydAltb2RlOworCXVuc2lnbmVkIGNoYXIJcGh5c19hZGRyW0VUSF9BTEVOXTsKKwl1bnNpZ25lZCBsb25nCWZpbHRlclsyXTsKKwlBZGRyZXNzCQlyeF9yaW5nOworCUFkZHJlc3MJCXR4X3Jpbmc7Cit9OworCitzdHJ1Y3QgbGFuY2VfcnhfaGVhZAoreworCXVuaW9uIHsKKwkJQWRkcmVzcwkJYmFzZTsKKwkJdW5zaWduZWQgY2hhcglhZGRyWzRdOworCX0gdTsKKwlzaG9ydAkJYnVmX2xlbmd0aDsJLyogMnMgY29tcGxlbWVudCAqLworCXNob3J0CQltc2dfbGVuZ3RoOworfTsKKworc3RydWN0IGxhbmNlX3R4X2hlYWQKK3sKKwl1bmlvbiB7CisJCUFkZHJlc3MJCWJhc2U7CisJCXVuc2lnbmVkIGNoYXIJYWRkcls0XTsKKwl9IHU7CisJc2hvcnQJCWJ1Zl9sZW5ndGg7CS8qIDJzIGNvbXBsZW1lbnQgKi8KKwlzaG9ydAkJbWlzYzsKK307CisKK3N0cnVjdCBsYW5jZV9pbnRlcmZhY2UKK3sKKwlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jawlpbml0X2Jsb2NrOworCXN0cnVjdCBsYW5jZV9yeF9oZWFkCXJ4X3JpbmdbUlhfUklOR19TSVpFXTsKKwlzdHJ1Y3QgbGFuY2VfdHhfaGVhZAl0eF9yaW5nOworCXVuc2lnbmVkIGNoYXIJCXJidWZbUlhfUklOR19TSVpFXVtFVEhfRlJBTUVfTEVOKzRdOworCXVuc2lnbmVkIGNoYXIJCXRidWZbRVRIX0ZSQU1FX0xFTl07CisJLyoKKwkgKiBEbyBub3QgYWx0ZXIgdGhlIG9yZGVyIG9mIHRoZSBzdHJ1Y3QgbWVtYmVycyBhYm92ZTsKKwkgKiB0aGUgaGFyZHdhcmUgZGVwZW5kcyBvbiB0aGUgY29ycmVjdCBhbGlnbm1lbnQuCisJICovCisJaW50CQkJcnhfaWR4OworfTsKKworI2RlZmluZQlMQU5DRV9NVVNUX1BBRAkJMHgwMDAwMDAwMQorI2RlZmluZQlMQU5DRV9FTkFCTEVfQVVUT1NFTEVDVAkweDAwMDAwMDAyCisjZGVmaW5lCUxBTkNFX1NFTEVDVF9QSE9ORUxJTkUJMHgwMDAwMDAwNAorI2RlZmluZQlMQU5DRV9NVVNUX1VOUkVTRVQJMHgwMDAwMDAwOAorCisvKiBBIG1hcHBpbmcgZnJvbSB0aGUgY2hpcCBJRCBudW1iZXIgdG8gdGhlIHBhcnQgbnVtYmVyIGFuZCBmZWF0dXJlcy4KKyAgIFRoZXNlIGFyZSBmcm9tIHRoZSBkYXRhc2hlZXRzIC0tIGluIHJlYWwgbGlmZSB0aGUgJzk3MCB2ZXJzaW9uCisgICByZXBvcnRlZGx5IGhhcyB0aGUgc2FtZSBJRCBhcyB0aGUgJzk2NS4gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGFuY2VfY2hpcF90eXBlCit7CisJaW50CWlkX251bWJlcjsKKwljb25zdCBjaGFyCSpuYW1lOworCWludAlmbGFnczsKK30gY2hpcF90YWJsZVtdID0geworCXsweDAwMDAsICJMQU5DRSA3OTkwIiwJCQkvKiBBbmNpZW50IGxhbmNlIGNoaXAuICAqLworCQlMQU5DRV9NVVNUX1BBRCArIExBTkNFX01VU1RfVU5SRVNFVH0sCisJezB4MDAwMywgIlBDbmV0L0lTQSA3OUM5NjAiLAkJLyogNzlDOTYwIFBDbmV0L0lTQS4gICovCisJCUxBTkNFX0VOQUJMRV9BVVRPU0VMRUNUfSwKKwl7MHgyMjYwLCAiUENuZXQvSVNBKyA3OUM5NjEiLAkJLyogNzlDOTYxIFBDbmV0L0lTQSssIFBsdWctbi1QbGF5LiAgKi8KKwkJTEFOQ0VfRU5BQkxFX0FVVE9TRUxFQ1R9LAorCXsweDI0MjAsICJQQ25ldC9QQ0kgNzlDOTcwIiwJCS8qIDc5Qzk3MCBvciA3OUM5NzQgUENuZXQtU0NTSSwgUENJLiAqLworCQlMQU5DRV9FTkFCTEVfQVVUT1NFTEVDVH0sCisJLyogQnVnOiB0aGUgUENuZXQvUENJIGFjdHVhbGx5IHVzZXMgdGhlIFBDbmV0L1ZMQiBJRCBudW1iZXIsIHNvIGp1c3QgY2FsbAorCQlpdCB0aGUgUENuZXQzMi4gKi8KKwl7MHgyNDMwLCAiUENuZXQzMiIsCQkJLyogNzlDOTY1IFBDbmV0IGZvciBWTCBidXMuICovCisJCUxBTkNFX0VOQUJMRV9BVVRPU0VMRUNUfSwKKyAgICAgICAgezB4MjYyMSwgIlBDbmV0L1BDSS1JSSA3OUM5NzBBIiwgICAgICAgIC8qIDc5Qzk3MEEgUENJbmV0UENJIElJLiAqLworICAgICAgICAgICAgICAgIExBTkNFX0VOQUJMRV9BVVRPU0VMRUNUfSwKKwl7MHgyNjI1LCAiUENuZXQtRkFTVCBJSUkgNzlDOTczIiwJLyogNzlDOTczIFBDSW5ldC1GQVNUIElJSS4gKi8KKwkJTEFOQ0VfRU5BQkxFX0FVVE9TRUxFQ1R9LAorICAgICAgICB7MHgyNjI2LCAiUENuZXQvSG9tZVBOQSA3OUM5NzgiLCAgICAgICAgCisgICAgICAgICAgICAgICAgTEFOQ0VfRU5BQkxFX0FVVE9TRUxFQ1R8TEFOQ0VfU0VMRUNUX1BIT05FTElORX0sCisJezB4MCwgIlBDbmV0ICh1bmtub3duKSIsCisJCUxBTkNFX0VOQUJMRV9BVVRPU0VMRUNUfSwKK307CisKKy8qIERlZmluZSBhIG1hY3JvIGZvciBjb252ZXJ0aW5nIHByb2dyYW0gYWRkcmVzc2VzIHRvIHJlYWwgYWRkcmVzc2VzICovCisjdW5kZWYJdmlydF90b19idXMKKyNkZWZpbmUJdmlydF90b19idXMoeCkJCSgodW5zaWduZWQgbG9uZyl4KQorCitzdGF0aWMgaW50CQkJY2hpcF92ZXJzaW9uOworc3RhdGljIGludAkJCWxhbmNlX3ZlcnNpb247CitzdGF0aWMgdW5zaWduZWQgc2hvcnQJCWlvYWRkcjsKKyNpZm5kZWYJSU5DTFVERV9MQU5DRQorc3RhdGljIGludAkJCWRtYTsKKyNlbmRpZgorc3RhdGljIHN0cnVjdCBsYW5jZV9pbnRlcmZhY2UJKmxwOworCisvKiBhZGRpdGlvbmFsIDggYnl0ZXMgZm9yIDgtYnl0ZSBhbGlnbm1lbnQgc3BhY2UgKi8KKyNpZmRlZglVU0VfTE9XTUVNX0JVRkZFUgorI2RlZmluZSBsYW5jZSAoKGNoYXIgKikweDEwMDAwIC0gKHNpemVvZihzdHJ1Y3QgbGFuY2VfaW50ZXJmYWNlKSs4KSkKKyNlbHNlCitzdGF0aWMgY2hhcgkJCWxhbmNlW3NpemVvZihzdHJ1Y3QgbGFuY2VfaW50ZXJmYWNlKSs4XTsKKyNlbmRpZgorCisjaWZuZGVmCUlOQ0xVREVfTEFOQ0UKKy8qIERNQSBkZWZpbmVzIGFuZCBoZWxwZXIgcm91dGluZXMgKi8KKworLyogRE1BIGNvbnRyb2xsZXIgcmVnaXN0ZXJzICovCisjZGVmaW5lIERNQTFfQ01EX1JFRwkJMHgwOAkvKiBjb21tYW5kIHJlZ2lzdGVyICh3KSAqLworI2RlZmluZSBETUExX1NUQVRfUkVHCQkweDA4CS8qIHN0YXR1cyByZWdpc3RlciAocikgKi8KKyNkZWZpbmUgRE1BMV9SRVFfUkVHICAgICAgICAgICAgMHgwOSAgICAvKiByZXF1ZXN0IHJlZ2lzdGVyICh3KSAqLworI2RlZmluZSBETUExX01BU0tfUkVHCQkweDBBCS8qIHNpbmdsZS1jaGFubmVsIG1hc2sgKHcpICovCisjZGVmaW5lIERNQTFfTU9ERV9SRUcJCTB4MEIJLyogbW9kZSByZWdpc3RlciAodykgKi8KKyNkZWZpbmUgRE1BMV9DTEVBUl9GRl9SRUcJMHgwQwkvKiBjbGVhciBwb2ludGVyIGZsaXAtZmxvcCAodykgKi8KKyNkZWZpbmUgRE1BMV9URU1QX1JFRyAgICAgICAgICAgMHgwRCAgICAvKiBUZW1wb3JhcnkgUmVnaXN0ZXIgKHIpICovCisjZGVmaW5lIERNQTFfUkVTRVRfUkVHCQkweDBECS8qIE1hc3RlciBDbGVhciAodykgKi8KKyNkZWZpbmUgRE1BMV9DTFJfTUFTS19SRUcgICAgICAgMHgwRSAgICAvKiBDbGVhciBNYXNrICovCisjZGVmaW5lIERNQTFfTUFTS19BTExfUkVHICAgICAgIDB4MEYgICAgLyogYWxsLWNoYW5uZWxzIG1hc2sgKHcpICovCisKKyNkZWZpbmUgRE1BMl9DTURfUkVHCQkweEQwCS8qIGNvbW1hbmQgcmVnaXN0ZXIgKHcpICovCisjZGVmaW5lIERNQTJfU1RBVF9SRUcJCTB4RDAJLyogc3RhdHVzIHJlZ2lzdGVyIChyKSAqLworI2RlZmluZSBETUEyX1JFUV9SRUcgICAgICAgICAgICAweEQyICAgIC8qIHJlcXVlc3QgcmVnaXN0ZXIgKHcpICovCisjZGVmaW5lIERNQTJfTUFTS19SRUcJCTB4RDQJLyogc2luZ2xlLWNoYW5uZWwgbWFzayAodykgKi8KKyNkZWZpbmUgRE1BMl9NT0RFX1JFRwkJMHhENgkvKiBtb2RlIHJlZ2lzdGVyICh3KSAqLworI2RlZmluZSBETUEyX0NMRUFSX0ZGX1JFRwkweEQ4CS8qIGNsZWFyIHBvaW50ZXIgZmxpcC1mbG9wICh3KSAqLworI2RlZmluZSBETUEyX1RFTVBfUkVHICAgICAgICAgICAweERBICAgIC8qIFRlbXBvcmFyeSBSZWdpc3RlciAocikgKi8KKyNkZWZpbmUgRE1BMl9SRVNFVF9SRUcJCTB4REEJLyogTWFzdGVyIENsZWFyICh3KSAqLworI2RlZmluZSBETUEyX0NMUl9NQVNLX1JFRyAgICAgICAweERDICAgIC8qIENsZWFyIE1hc2sgKi8KKyNkZWZpbmUgRE1BMl9NQVNLX0FMTF9SRUcgICAgICAgMHhERSAgICAvKiBhbGwtY2hhbm5lbHMgbWFzayAodykgKi8KKworCisjZGVmaW5lIERNQV9NT0RFX1JFQUQJMHg0NAkvKiBJL08gdG8gbWVtb3J5LCBubyBhdXRvaW5pdCwgaW5jcmVtZW50LCBzaW5nbGUgbW9kZSAqLworI2RlZmluZSBETUFfTU9ERV9XUklURQkweDQ4CS8qIG1lbW9yeSB0byBJL08sIG5vIGF1dG9pbml0LCBpbmNyZW1lbnQsIHNpbmdsZSBtb2RlICovCisjZGVmaW5lIERNQV9NT0RFX0NBU0NBREUgMHhDMCAgIC8qIHBhc3MgdGhydSBEUkVRLT5IUlEsIERBQ0s8LUhMREEgb25seSAqLworCisvKiBlbmFibGUvZGlzYWJsZSBhIHNwZWNpZmljIERNQSBjaGFubmVsICovCitzdGF0aWMgdm9pZCBlbmFibGVfZG1hKHVuc2lnbmVkIGludCBkbWFucikKK3sKKwlpZiAoZG1hbnIgPD0gMykKKwkJb3V0Yl9wKGRtYW5yLCBETUExX01BU0tfUkVHKTsKKwllbHNlCisJCW91dGJfcChkbWFuciAmIDMsIERNQTJfTUFTS19SRUcpOworfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlX2RtYSh1bnNpZ25lZCBpbnQgZG1hbnIpCit7CisJaWYgKGRtYW5yIDw9IDMpCisJCW91dGJfcChkbWFuciB8IDQsIERNQTFfTUFTS19SRUcpOworCWVsc2UKKwkJb3V0Yl9wKChkbWFuciAmIDMpIHwgNCwgRE1BMl9NQVNLX1JFRyk7Cit9CisKKy8qIHNldCBtb2RlIChhYm92ZSkgZm9yIGEgc3BlY2lmaWMgRE1BIGNoYW5uZWwgKi8KK3N0YXRpYyB2b2lkIHNldF9kbWFfbW9kZSh1bnNpZ25lZCBpbnQgZG1hbnIsIGNoYXIgbW9kZSkKK3sKKwlpZiAoZG1hbnIgPD0gMykKKwkJb3V0Yl9wKG1vZGUgfCBkbWFuciwgRE1BMV9NT0RFX1JFRyk7CisJZWxzZQorCQlvdXRiX3AobW9kZSB8IChkbWFuciYzKSwgRE1BMl9NT0RFX1JFRyk7Cit9CisjZW5kaWYJLyogIUlOQ0xVREVfTEFOQ0UgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRVNFVCAtIFJlc2V0IGFkYXB0ZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGxhbmNlX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKK3sKKwlpbnQJCWk7CisJQWRkcmVzcwkJbDsKKworCS8qIFJlc2V0IHRoZSBMQU5DRSAqLworCSh2b2lkKWludyhpb2FkZHIrTEFOQ0VfUkVTRVQpOworCS8qIFVuLVJlc2V0IHRoZSBMQU5DRSwgbmVlZGVkIG9ubHkgZm9yIHRoZSBORTIxMDAgKi8KKwlpZiAoY2hpcF90YWJsZVtsYW5jZV92ZXJzaW9uXS5mbGFncyAmIExBTkNFX01VU1RfVU5SRVNFVCkKKwkJb3V0dygwLCBpb2FkZHIrTEFOQ0VfUkVTRVQpOworCWlmIChjaGlwX3RhYmxlW2xhbmNlX3ZlcnNpb25dLmZsYWdzICYgTEFOQ0VfRU5BQkxFX0FVVE9TRUxFQ1QpCisJeworCQkvKiBUaGlzIGlzIDc5Qzk2MCBzcGVjaWZpYzsgVHVybiBvbiBhdXRvLXNlbGVjdCBvZiBtZWRpYQorCQkgICAoQVVJLCBCTkMpLiAqLworCQlvdXR3KDB4MiwgaW9hZGRyK0xBTkNFX0FERFIpOworCQkvKiBEb24ndCB0b3VjaCAxMGJhc2UyIHBvd2VyIGJpdC4gKi8KKwkJb3V0dyhpbncoaW9hZGRyK0xBTkNFX0JVU19JRikgfCAweDIsIGlvYWRkcitMQU5DRV9CVVNfSUYpOworCX0KKwkvKiBIb21lUE5BIGNhcmRzIG5lZWQgdG8gZXhwbGljaXRseSBwaWNrIHRoZSBwaG9uZWxpbmUgaW50ZXJmYWNlLgorCSAqIFNvbWUgb2YgdGhlc2UgY2FyZHMgaGF2ZSBldGhlcm5ldCBpbnRlcmZhY2VzIGFzIHdlbGwsIHRoaXMKKwkgKiBjb2RlIG1pZ2h0IHJlcXVpcmUgc29tZSBtb2RpZmljYXRpb24gZm9yIHRob3NlLgorICAJICovCisgICAgICAgIGlmIChjaGlwX3RhYmxlW2xhbmNlX3ZlcnNpb25dLmZsYWdzICYgTEFOQ0VfU0VMRUNUX1BIT05FTElORSkgeworICAgICAgICAgICAgICAgIHNob3J0IG1lZGlhLCBjaGVjayA7CisgICAgICAgICAgICAgICAgLyogdGhpcyBpcyBzcGVjaWZpYyB0byBIb21lUE5BIGNhcmRzLi4uICovCisgICAgICAgICAgICAgICAgb3V0dyg0OSwgaW9hZGRyKzB4MTIpIDsKKyAgICAgICAgICAgICAgICBtZWRpYSA9IGludyhpb2FkZHIrMHgxNikgOworI2lmZGVmIERFQlVHCisgICAgICAgICAgICAgICAgcHJpbnRmKCJtZWRpYSB3YXMgJWRcbiIsIG1lZGlhKSA7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBtZWRpYSAmPSB+MyA7CisgICAgICAgICAgICAgICAgbWVkaWEgfD0gMSA7CisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgICAgICBwcmludGYoIm1lZGlhIGNoYW5nZWQgdG8gJWRcbiIsIG1lZGlhKSA7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBtZWRpYSAmPSB+MyA7CisgICAgICAgICAgICAgICAgbWVkaWEgfD0gMSA7CisgICAgICAgICAgICAgICAgb3V0dyg0OSwgaW9hZGRyKzB4MTIpIDsKKyAgICAgICAgICAgICAgICBvdXR3KG1lZGlhLCBpb2FkZHIrMHgxNikgOworICAgICAgICAgICAgICAgIG91dHcoNDksIGlvYWRkcisweDEyKSA7CisgICAgICAgICAgICAgICAgY2hlY2sgPSBpbncoaW9hZGRyKzB4MTYpIDsKKyNpZmRlZiBERUJVRworICAgICAgICAgICAgICAgIHByaW50ZigiY2hlY2sgJXMsIG1lZGlhIHdhcyBzZXQgcHJvcGVybHlcbiIsIAorCQkJY2hlY2sgPT0gIG1lZGlhID8gInBhc3NlZCIgOiAiRkFJTEVEIiApIDsgCisjZW5kaWYKKwl9CisgCisJLyogUmUtaW5pdGlhbGlzZSB0aGUgTEFOQ0UsIGFuZCBzdGFydCBpdCB3aGVuIGRvbmUuICovCisJLyogU2V0IHN0YXRpb24gYWRkcmVzcyAqLworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgKytpKQorCQlscC0+aW5pdF9ibG9jay5waHlzX2FkZHJbaV0gPSBuaWMtPm5vZGVfYWRkcltpXTsKKwkvKiBQcmVzZXQgdGhlIHJlY2VpdmUgcmluZyBoZWFkZXJzICovCisJZm9yIChpPTA7IGk8UlhfUklOR19TSVpFOyBpKyspIHsKKwkJbHAtPnJ4X3JpbmdbaV0uYnVmX2xlbmd0aCA9IC1FVEhfRlJBTUVfTEVOLTQ7CisJCS8qIE9XTiAqLworCQlscC0+cnhfcmluZ1tpXS51LmJhc2UgPSB2aXJ0X3RvX2J1cyhscC0+cmJ1ZltpXSkgJiAweGZmZmZmZjsKKwkJLyogd2Ugc2V0IHRoZSB0b3AgYnl0ZSBhcyB0aGUgdmVyeSBsYXN0IHRoaW5nICovCisJCWxwLT5yeF9yaW5nW2ldLnUuYWRkclszXSA9IDB4ODA7CisJfQorCWxwLT5yeF9pZHggPSAwOworCWxwLT5pbml0X2Jsb2NrLm1vZGUgPSAweDA7CS8qIGVuYWJsZSBSeCBhbmQgVHggKi8KKwlsID0gKEFkZHJlc3MpdmlydF90b19idXMoJmxwLT5pbml0X2Jsb2NrKTsKKwlvdXR3KDB4MSwgaW9hZGRyK0xBTkNFX0FERFIpOworCSh2b2lkKWludyhpb2FkZHIrTEFOQ0VfQUREUik7CisJb3V0dygoc2hvcnQpbCwgaW9hZGRyK0xBTkNFX0RBVEEpOworCW91dHcoMHgyLCBpb2FkZHIrTEFOQ0VfQUREUik7CisJKHZvaWQpaW53KGlvYWRkcitMQU5DRV9BRERSKTsKKwlvdXR3KChzaG9ydCkobCA+PiAxNiksIGlvYWRkcitMQU5DRV9EQVRBKTsKKwlvdXR3KDB4NCwgaW9hZGRyK0xBTkNFX0FERFIpOworCSh2b2lkKWludyhpb2FkZHIrTEFOQ0VfQUREUik7CisJb3V0dygweDkxNSwgaW9hZGRyK0xBTkNFX0RBVEEpOworCW91dHcoMHgwLCBpb2FkZHIrTEFOQ0VfQUREUik7CisJKHZvaWQpaW53KGlvYWRkcitMQU5DRV9BRERSKTsKKwlvdXR3KDB4NCwgaW9hZGRyK0xBTkNFX0RBVEEpOwkJLyogc3RvcCAqLworCW91dHcoMHgxLCBpb2FkZHIrTEFOQ0VfREFUQSk7CQkvKiBpbml0ICovCisJZm9yIChpID0gMTAwMDA7IGkgPiAwOyAtLWkpCisJCWlmIChpbncoaW9hZGRyK0xBTkNFX0RBVEEpICYgMHgxMDApCisJCQlicmVhazsKKyNpZmRlZglERUJVRworCWlmIChpIDw9IDApCisJCXByaW50ZigiSW5pdCB0aW1lZCBvdXRcbiIpOworI2VuZGlmCisJLyogQXBwYXJlbnRseSBjbGVhcmluZyB0aGUgSW5pdERvbmUgYml0IGhlcmUgdHJpZ2dlcnMgYSBidWcKKwkgICBpbiB0aGUgJzk3NC4gKE1hcmsgU3RvY2t0b24pICovCisJb3V0dygweDIsIGlvYWRkcitMQU5DRV9EQVRBKTsJCS8qIHN0YXJ0ICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUE9MTCAtIFdhaXQgZm9yIGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgbGFuY2VfcG9sbChzdHJ1Y3QgbmljICpuaWMpCit7CisJaW50CQlzdGF0dXM7CisKKwlzdGF0dXMgPSBscC0+cnhfcmluZ1tscC0+cnhfaWR4XS51LmJhc2UgPj4gMjQ7CisJaWYgKHN0YXR1cyAmIDB4ODApCisJCXJldHVybiAoMCk7CisjaWZkZWYJREVCVUcKKwlwcmludGYoIkxBTkNFIHBhY2tldCByZWNlaXZlZCByeF9yaW5nLnUuYmFzZSAlWCBtY250ICVoWCBjc3IwICVoWFxuIiwKKwkJbHAtPnJ4X3JpbmdbbHAtPnJ4X2lkeF0udS5iYXNlLCBscC0+cnhfcmluZ1tscC0+cnhfaWR4XS5tc2dfbGVuZ3RoLAorCQlpbncoaW9hZGRyK0xBTkNFX0RBVEEpKTsKKyNlbmRpZgorCWlmIChzdGF0dXMgPT0gMHgzKQorCQltZW1jcHkobmljLT5wYWNrZXQsIGxwLT5yYnVmW2xwLT5yeF9pZHhdLCBuaWMtPnBhY2tldGxlbiA9IGxwLT5yeF9yaW5nW2xwLT5yeF9pZHhdLm1zZ19sZW5ndGgpOworCS8qIEFuZHJldyBCb3lkIG9mIFFOWCByZXBvcnRzIHRoYXQgc29tZSByZXZzIG9mIHRoZSA3OUM3NjUKKwkgICBjbGVhciB0aGUgYnVmZmVyIGxlbmd0aCAqLworCWxwLT5yeF9yaW5nW2xwLT5yeF9pZHhdLmJ1Zl9sZW5ndGggPSAtRVRIX0ZSQU1FX0xFTi00OworCWxwLT5yeF9yaW5nW2xwLT5yeF9pZHhdLnUuYWRkclszXSB8PSAweDgwOwkvKiBwcmltZSBmb3IgbmV4dCByZWNlaXZlICovCisKKwkvKiBJJ20gbm90IHN1cmUgaWYgdGhlIGZvbGxvd2luZyBpcyBzdGlsbCBvayB3aXRoIG11bHRpcGxlIFJ4IGJ1ZmZlcnMsIGJ1dCBpdCB3b3JrcyAqLworCW91dHcoMHgwLCBpb2FkZHIrTEFOQ0VfQUREUik7CisJKHZvaWQpaW53KGlvYWRkcitMQU5DRV9BRERSKTsKKwlvdXR3KDB4NTAwLCBpb2FkZHIrTEFOQ0VfREFUQSk7CQkvKiBjbGVhciByZWNlaXZlICsgSW5pdERvbmUgKi8KKworCS8qIFN3aXRjaCB0byB0aGUgbmV4dCBSeCByaW5nIGJ1ZmZlciAqLworCWxwLT5yeF9pZHggPSAobHAtPnJ4X2lkeCArIDEpICYgUlhfUklOR19NT0RfTUFTSzsKKworCXJldHVybiAoc3RhdHVzID09IDB4Myk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBsYW5jZV90cmFuc21pdCgKKwlzdHJ1Y3QgbmljICpuaWMsCisJY29uc3QgY2hhciAqZCwJCQkvKiBEZXN0aW5hdGlvbiAqLworCXVuc2lnbmVkIGludCB0LAkJCS8qIFR5cGUgKi8KKwl1bnNpZ25lZCBpbnQgcywJCQkvKiBzaXplICovCisJY29uc3QgY2hhciAqcCkJCQkvKiBQYWNrZXQgKi8KK3sKKwl1bnNpZ25lZCBsb25nCQl0aW1lOworCisJLyogY29weSB0aGUgcGFja2V0IHRvIHJpbmcgYnVmZmVyICovCisJbWVtY3B5KGxwLT50YnVmLCBkLCBFVEhfQUxFTik7CS8qIGRzdCAqLworCW1lbWNweSgmbHAtPnRidWZbRVRIX0FMRU5dLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOyAvKiBzcmMgKi8KKwlscC0+dGJ1ZltFVEhfQUxFTitFVEhfQUxFTl0gPSB0ID4+IDg7CS8qIHR5cGUgKi8KKwlscC0+dGJ1ZltFVEhfQUxFTitFVEhfQUxFTisxXSA9IHQ7CS8qIHR5cGUgKi8KKwltZW1jcHkoJmxwLT50YnVmW0VUSF9ITEVOXSwgcCwgcyk7CisJcyArPSBFVEhfSExFTjsKKwlpZiAoY2hpcF90YWJsZVtjaGlwX3ZlcnNpb25dLmZsYWdzICYgTEFOQ0VfTVVTVF9QQUQpCisJCXdoaWxlIChzIDwgRVRIX1pMRU4pCS8qIHBhZCB0byBtaW4gbGVuZ3RoICovCisJCQlscC0+dGJ1ZltzKytdID0gMDsKKwlscC0+dHhfcmluZy5idWZfbGVuZ3RoID0gLXM7CisJbHAtPnR4X3JpbmcubWlzYyA9IDB4MDsKKwkvKiBPV04sIFNUUCwgRU5QICovCisJbHAtPnR4X3JpbmcudS5iYXNlID0gdmlydF90b19idXMobHAtPnRidWYpICYgMHhmZmZmZmY7CisJLyogd2Ugc2V0IHRoZSB0b3AgYnl0ZSBhcyB0aGUgdmVyeSBsYXN0IHRoaW5nICovCisJbHAtPnR4X3JpbmcudS5hZGRyWzNdID0gMHg4MzsKKwkvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSBzZW5kIHBvbGwgKi8KKwlvdXR3KDB4MCwgaW9hZGRyK0xBTkNFX0FERFIpOworCSh2b2lkKWludyhpb2FkZHIrTEFOQ0VfQUREUik7CS8qIGFzIGluIHRoZSBkYXRhc2hlZXRzLi4uICovCisJLyogS2xhdXMgRXNwZW5sYXViOiB0aGUgdmFsdWUgYmVsb3cgd2FzIDB4NDgsIGJ1dCB0aGF0IGVuYWJsZWQgdGhlCisJICogaW50ZXJydXB0IGxpbmUsIGNhdXNpbmcgYSBoYW5nIGlmIGZvciBzb21lIHJlYXNvbmUgdGhlIGludGVycnVwdAorCSAqIGNvbnRyb2xsZXIgaGFkIHRoZSBMQU5DRSBpbnRlcnJ1cHQgZW5hYmxlZC4gIEkgaGF2ZSBubyBpZGVhIHdoeQorCSAqIG5vYm9keSByYW4gaW50byB0aGlzIGJlZm9yZS4uLiAgKi8KKwlvdXR3KDB4MDgsIGlvYWRkcitMQU5DRV9EQVRBKTsKKwkvKiB3YWl0IGZvciB0cmFuc21pdCBjb21wbGV0ZSAqLworCXRpbWUgPSBjdXJydGlja3MoKSArIFRJQ0tTX1BFUl9TRUM7CQkvKiB3YWl0IG9uZSBzZWNvbmQgKi8KKwl3aGlsZSAoY3VycnRpY2tzKCkgPCB0aW1lICYmIChscC0+dHhfcmluZy51LmJhc2UgJiAweDgwMDAwMDAwKSAhPSAwKQorCQk7CisJaWYgKChscC0+dHhfcmluZy51LmJhc2UgJiAweDgwMDAwMDAwKSAhPSAwKQorCQlwcmludGYoIkxBTkNFIHRpbWVkIG91dCBvbiB0cmFuc21pdFxuIik7CisJKHZvaWQpaW53KGlvYWRkcitMQU5DRV9BRERSKTsKKwlvdXR3KDB4MjAwLCBpb2FkZHIrTEFOQ0VfREFUQSk7CQkvKiBjbGVhciB0cmFuc21pdCArIEluaXREb25lICovCisjaWZkZWYJREVCVUcKKwlwcmludGYoInR4X3JpbmcudS5iYXNlICVYIHR4X3JpbmcuYnVmX2xlbmd0aCAlaFggdHhfcmluZy5taXNjICVoWCBjc3IwICVoWFxuIiwKKwkJbHAtPnR4X3JpbmcudS5iYXNlLCBscC0+dHhfcmluZy5idWZfbGVuZ3RoLCBscC0+dHhfcmluZy5taXNjLAorCQlpbncoaW9hZGRyK0xBTkNFX0RBVEEpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBsYW5jZV9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYykKK3sKKwkodm9pZClpbncoaW9hZGRyK0xBTkNFX1JFU0VUKTsKKwlpZiAoY2hpcF90YWJsZVtsYW5jZV92ZXJzaW9uXS5mbGFncyAmIExBTkNFX01VU1RfVU5SRVNFVCkKKwkJb3V0dygwLCBpb2FkZHIrTEFOQ0VfUkVTRVQpOworCisJb3V0dygwLCBpb2FkZHIrTEFOQ0VfQUREUik7CisJb3V0dygweDAwMDQsIGlvYWRkcitMQU5DRV9EQVRBKTsJLyogc3RvcCB0aGUgTEFOQ0UgKi8KKworI2lmbmRlZglJTkNMVURFX0xBTkNFCisJZGlzYWJsZV9kbWEoZG1hKTsKKyNlbmRpZgorfQorCisjaWZkZWYJSU5DTFVERV9MQU5DRQorc3RhdGljIGludCBsYW5jZV9wcm9iZTEoc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQorI2Vsc2UKK3N0YXRpYyBpbnQgbGFuY2VfcHJvYmUxKHN0cnVjdCBuaWMgKm5pYykKKyNlbmRpZgoreworCWludAkJCXJlc2V0X3ZhbCA7CisJdW5zaWduZWQgaW50CQlpOworCUFkZHJlc3MJCQlsOworCXNob3J0CQkJZG1hX2NoYW5uZWxzOworI2lmbmRlZglJTkNMVURFX0xBTkNFCisJc3RhdGljIGNvbnN0IGNoYXIJZG1hc1tdID0geyA1LCA2LCA3LCAzIH07CisjZW5kaWYKKworCXJlc2V0X3ZhbCA9IGludyhpb2FkZHIrTEFOQ0VfUkVTRVQpOworCW91dHcocmVzZXRfdmFsLCBpb2FkZHIrTEFOQ0VfUkVTRVQpOworI2lmCTEgIC8qIEtsYXVzIEVzcGVubGF1YiAtLSB3YXMgI2lmZGVmCUlOQ0xVREVfTkUyMTAwKi8KKwlvdXR3KDB4MCwgaW9hZGRyK0xBTkNFX0FERFIpOwkvKiBTd2l0Y2ggdG8gd2luZG93IDAgKi8KKwlpZiAoaW53KGlvYWRkcitMQU5DRV9EQVRBKSAhPSAweDQpCisJCXJldHVybiAoLTEpOworI2VuZGlmCisJb3V0dyg4OCwgaW9hZGRyK0xBTkNFX0FERFIpOwkvKiBHZXQgdGhlIHZlcnNpb24gb2YgdGhlIGNoaXAgKi8KKwlpZiAoaW53KGlvYWRkcitMQU5DRV9BRERSKSAhPSA4OCkKKwkJbGFuY2VfdmVyc2lvbiA9IDA7CisJZWxzZQorCXsKKwkJY2hpcF92ZXJzaW9uID0gaW53KGlvYWRkcitMQU5DRV9EQVRBKTsKKwkJb3V0dyg4OSwgaW9hZGRyK0xBTkNFX0FERFIpOworCQljaGlwX3ZlcnNpb24gfD0gaW53KGlvYWRkcitMQU5DRV9EQVRBKSA8PCAxNjsKKwkJaWYgKChjaGlwX3ZlcnNpb24gJiAweGZmZikgIT0gMHgzKQorCQkJcmV0dXJuICgtMSk7CisJCWNoaXBfdmVyc2lvbiA9IChjaGlwX3ZlcnNpb24gPj4gMTIpICYgMHhmZmZmOworCQlmb3IgKGxhbmNlX3ZlcnNpb24gPSAxOyBjaGlwX3RhYmxlW2xhbmNlX3ZlcnNpb25dLmlkX251bWJlciAhPSAwOyArK2xhbmNlX3ZlcnNpb24pCisJCQlpZiAoY2hpcF90YWJsZVtsYW5jZV92ZXJzaW9uXS5pZF9udW1iZXIgPT0gY2hpcF92ZXJzaW9uKQorCQkJCWJyZWFrOworCX0KKwkvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmUgaXMgOC1ieXRlIGFsaWduZWQgKi8KKwlsID0gKChBZGRyZXNzKWxhbmNlICsgNykgJiB+NzsKKwlscCA9IChzdHJ1Y3QgbGFuY2VfaW50ZXJmYWNlICopbDsKKwlscC0+aW5pdF9ibG9jay5tb2RlID0gMHgzOwkvKiBkaXNhYmxlIFJ4IGFuZCBUeCAqLworCWxwLT5pbml0X2Jsb2NrLmZpbHRlclswXSA9IGxwLT5pbml0X2Jsb2NrLmZpbHRlclsxXSA9IDB4MDsKKwkvKiB1c2luZyBtdWx0aXBsZSBSeCBidWZmZXIgYW5kIGEgc2luZ2xlIFR4IGJ1ZmZlciAqLworCWxwLT5pbml0X2Jsb2NrLnJ4X3JpbmcgPSAodmlydF90b19idXMoJmxwLT5yeF9yaW5nKSAmIDB4ZmZmZmZmKSB8IFJYX1JJTkdfTEVOX0JJVFM7CisJbHAtPmluaXRfYmxvY2sudHhfcmluZyA9IHZpcnRfdG9fYnVzKCZscC0+dHhfcmluZykgJiAweGZmZmZmZjsKKwlsID0gdmlydF90b19idXMoJmxwLT5pbml0X2Jsb2NrKTsKKwlvdXR3KDB4MSwgaW9hZGRyK0xBTkNFX0FERFIpOworCSh2b2lkKWludyhpb2FkZHIrTEFOQ0VfQUREUik7CisJb3V0dygodW5zaWduZWQgc2hvcnQpbCwgaW9hZGRyK0xBTkNFX0RBVEEpOworCW91dHcoMHgyLCBpb2FkZHIrTEFOQ0VfQUREUik7CisJKHZvaWQpaW53KGlvYWRkcitMQU5DRV9BRERSKTsKKwlvdXR3KCh1bnNpZ25lZCBzaG9ydCkobCA+PiAxNiksIGlvYWRkcitMQU5DRV9EQVRBKTsKKwlvdXR3KDB4NCwgaW9hZGRyK0xBTkNFX0FERFIpOworCSh2b2lkKWludyhpb2FkZHIrTEFOQ0VfQUREUik7CisJb3V0dygweDkxNSwgaW9hZGRyK0xBTkNFX0RBVEEpOworCW91dHcoMHgwLCBpb2FkZHIrTEFOQ0VfQUREUik7CisJKHZvaWQpaW53KGlvYWRkcitMQU5DRV9BRERSKTsKKwkvKiBHZXQgc3RhdGlvbiBhZGRyZXNzICovCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyArK2kpIHsKKwkJbmljLT5ub2RlX2FkZHJbaV0gPSBpbmIoaW9hZGRyK0xBTkNFX0VUSF9BRERSK2kpOworCX0KKyNpZm5kZWYJSU5DTFVERV9MQU5DRQorCS8qIG5vdyBwcm9iZSBmb3IgRE1BIGNoYW5uZWwgKi8KKwlkbWFfY2hhbm5lbHMgPSAoKGluYihETUExX1NUQVRfUkVHKSA+PiA0KSAmIDB4ZikgfAorCQkoaW5iKERNQTJfU1RBVF9SRUcpICYgMHhmMCk7CisJLyogbmVlZCB0byBmaXggd2hlbiBQQ0kgcHJvdmlkZXMgRE1BIGluZm8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihkbWFzKS9zaXplb2YoZG1hc1swXSkpOyArK2kpCisJeworCQlpbnQJCWo7CisKKwkJZG1hID0gZG1hc1tpXTsKKwkJLyogRG9uJ3QgZW5hYmxlIGEgcGVybWFuZW50bHkgYnVzeSBETUEgY2hhbm5lbCwKKwkJICAgb3IgdGhlIG1hY2hpbmUgd2lsbCBoYW5nICovCisJCWlmIChkbWFfY2hhbm5lbHMgJiAoMSA8PCBkbWEpKQorCQkJY29udGludWU7CisJCW91dHcoMHg3ZjA0LCBpb2FkZHIrTEFOQ0VfREFUQSk7CS8qIGNsZWFyIG1lbW9yeSBlcnJvciBiaXRzICovCisJCXNldF9kbWFfbW9kZShkbWEsIERNQV9NT0RFX0NBU0NBREUpOworCQllbmFibGVfZG1hKGRtYSk7CisJCW91dHcoMHgxLCBpb2FkZHIrTEFOQ0VfREFUQSk7CQkvKiBpbml0ICovCisJCWZvciAoaiA9IDEwMDsgaiA+IDA7IC0taikKKwkJCWlmIChpbncoaW9hZGRyK0xBTkNFX0RBVEEpICYgMHg5MDApCisJCQkJYnJlYWs7CisJCWlmIChpbncoaW9hZGRyK0xBTkNFX0RBVEEpICYgMHgxMDApCisJCQlicmVhazsKKwkJZWxzZQorCQkJZGlzYWJsZV9kbWEoZG1hKTsKKwl9CisJaWYgKGkgPj0gKHNpemVvZihkbWFzKS9zaXplb2YoZG1hc1swXSkpKQorCQlkbWEgPSAwOworCXByaW50ZigiXG4lcyBiYXNlICUjWCwgRE1BICVkLCBhZGRyICUhXG4iLAorCQljaGlwX3RhYmxlW2xhbmNlX3ZlcnNpb25dLm5hbWUsIGlvYWRkciwgZG1hLCBuaWMtPm5vZGVfYWRkcik7CisjZWxzZQorCXByaW50ZigiICVzIGJhc2UgJSNoWCwgYWRkciAlIVxuIiwgY2hpcF90YWJsZVtsYW5jZV92ZXJzaW9uXS5uYW1lLCBpb2FkZHIsIG5pYy0+bm9kZV9hZGRyKTsKKyNlbmRpZgorCWlmIChjaGlwX3RhYmxlW2NoaXBfdmVyc2lvbl0uZmxhZ3MgJiBMQU5DRV9FTkFCTEVfQVVUT1NFTEVDVCkgeworCQkvKiBUdXJuIG9uIGF1dG8tc2VsZWN0IG9mIG1lZGlhICgxMGJhc2VUIG9yIEJOQykgc28gdGhhdCB0aGUKKwkJICogdXNlciB3YXRjaCB0aGUgTEVEcy4gKi8KKwkJb3V0dygweDAwMDIsIGlvYWRkcitMQU5DRV9BRERSKTsKKwkJLyogRG9uJ3QgdG91Y2ggMTBiYXNlMiBwb3dlciBiaXQuICovCisJCW91dHcoaW53KGlvYWRkcitMQU5DRV9CVVNfSUYpIHwgMHgwMDAyLCBpb2FkZHIrTEFOQ0VfQlVTX0lGKTsKKwl9CisJcmV0dXJuIChsYW5jZV92ZXJzaW9uKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQUk9CRSAtIExvb2sgZm9yIGFuIGFkYXB0ZXIsIHRoaXMgcm91dGluZSdzIHZpc2libGUgdG8gdGhlIG91dHNpZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmCUlOQ0xVREVfTEFOQ0UKK3N0cnVjdCBuaWMgKmxhbmNlcGNpX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlX2FkZHJzLCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQorI2VuZGlmCisjaWZkZWYJSU5DTFVERV9ORTIxMDAKK3N0cnVjdCBuaWMgKm5lMjEwMF9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZV9hZGRycykKKyNlbmRpZgorI2lmZGVmCUlOQ0xVREVfTkk2NTEwCitzdHJ1Y3QgbmljICpuaTY1MTBfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVfYWRkcnMpCisjZW5kaWYKK3sKKwl1bnNpZ25lZCBzaG9ydAkJKnA7CisjaWZuZGVmCUlOQ0xVREVfTEFOQ0UKKwlzdGF0aWMgdW5zaWduZWQgc2hvcnQJaW9fYWRkcnNbXSA9IHsgMHgzMDAsIDB4MzIwLCAweDM0MCwgMHgzNjAsIDAgfTsKKyNlbmRpZgorCisJLyogaWYgcHJvYmVfYWRkcnMgaXMgMCwgdGhlbiByb3V0aW5lIGNhbiB1c2UgYSBoYXJkd2lyZWQgZGVmYXVsdCAqLworCWlmIChwcm9iZV9hZGRycyA9PSAwKSB7CisjaWZkZWYJSU5DTFVERV9MQU5DRQorCQlyZXR1cm4gMDsKKyNlbHNlCisJCXByb2JlX2FkZHJzID0gaW9fYWRkcnM7CisjZW5kaWYKKwl9CisJZm9yIChwID0gcHJvYmVfYWRkcnM7IChpb2FkZHIgPSAqcCkgIT0gMDsgKytwKQorCXsKKwkJY2hhcglvZmZzZXQxNSwgb2Zmc2V0MTQgPSBpbmIoaW9hZGRyICsgMTQpOworCQl1bnNpZ25lZCBzaG9ydAlwY2lfY21kOworCisjaWZkZWYJSU5DTFVERV9ORTIxMDAKKwkJaWYgKChvZmZzZXQxNCA9PSAweDUyIHx8IG9mZnNldDE0ID09IDB4NTcpICYmCisJCSAoKG9mZnNldDE1ID0gaW5iKGlvYWRkciArIDE1KSkgPT0gMHg1NyB8fCBvZmZzZXQxNSA9PSAweDQ0KSkKKwkJCWlmIChsYW5jZV9wcm9iZTEobmljKSA+PSAwKQorCQkJCWJyZWFrOworI2VuZGlmCisjaWZkZWYJSU5DTFVERV9OSTY1MTAKKwkJaWYgKChvZmZzZXQxNCA9PSAweDAwIHx8IG9mZnNldDE0ID09IDB4NTIpICYmCisJCSAoKG9mZnNldDE1ID0gaW5iKGlvYWRkciArIDE1KSkgPT0gMHg1NSB8fCBvZmZzZXQxNSA9PSAweDQ0KSkKKwkJCWlmIChsYW5jZV9wcm9iZTEobmljKSA+PSAwKQorCQkJCWJyZWFrOworI2VuZGlmCisjaWZkZWYJSU5DTFVERV9MQU5DRQorCQlhZGp1c3RfcGNpX2RldmljZShwY2kpOworCQlpZiAobGFuY2VfcHJvYmUxKG5pYywgcGNpKSA+PSAwKQorCQkJYnJlYWs7CisjZW5kaWYKKwl9CisJLyogaWYgYm9hcmQgZm91bmQgKi8KKwlpZiAoaW9hZGRyICE9IDApCisJeworCQkvKiBwb2ludCB0byBOSUMgc3BlY2lmaWMgcm91dGluZXMgKi8KKwkJbGFuY2VfcmVzZXQobmljKTsKKwkJbmljLT5yZXNldCA9IGxhbmNlX3Jlc2V0OworCQluaWMtPnBvbGwgPSBsYW5jZV9wb2xsOworCQluaWMtPnRyYW5zbWl0ID0gbGFuY2VfdHJhbnNtaXQ7CisJCW5pYy0+ZGlzYWJsZSA9IGxhbmNlX2Rpc2FibGU7CisJCXJldHVybiBuaWM7CisJfQorCisJLyogbm8gYm9hcmQgZm91bmQgKi8KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25ldGJvb3QvbGludXgtYXNtLWlvLmggYi9uZXRib290L2xpbnV4LWFzbS1pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZTkxZmIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L2xpbnV4LWFzbS1pby5oCkBAIC0wLDAgKzEsMTg3IEBACisjaWZuZGVmCV9BU01fSU9fSAorI2RlZmluZSBfQVNNX0lPX0gKKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZm9yIHRoZSB4ODYgSU8gaW5zdHJ1Y3Rpb25zCisgKiBpbmIvaW53L2lubC9vdXRiL291dHcvb3V0bCBhbmQgdGhlICJzdHJpbmcgdmVyc2lvbnMiIG9mIHRoZSBzYW1lCisgKiAoaW5zYi9pbnN3L2luc2wvb3V0c2Ivb3V0c3cvb3V0c2wpLiBZb3UgY2FuIGFsc28gdXNlICJwYXVzaW5nIgorICogdmVyc2lvbnMgb2YgdGhlIHNpbmdsZS1JTyBpbnN0cnVjdGlvbnMgKGluYl9wL2lud19wLy4uKS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbm90IG1lYW50IHRvIGJlIG9iZnVzY2F0aW5nOiBpdCdzIGp1c3QgY29tcGxpY2F0ZWQKKyAqIHRvIChhKSBoYW5kbGUgaXQgYWxsIGluIGEgd2F5IHRoYXQgbWFrZXMgZ2NjIGFibGUgdG8gb3B0aW1pemUgaXQKKyAqIGFzIHdlbGwgYXMgcG9zc2libGUgYW5kIChiKSB0cnlpbmcgdG8gYXZvaWQgd3JpdGluZyB0aGUgc2FtZSB0aGluZworICogb3ZlciBhbmQgb3ZlciBhZ2FpbiB3aXRoIHNsaWdodCB2YXJpYXRpb25zIGFuZCBwb3NzaWJseSBtYWtpbmcgYQorICogbWlzdGFrZSBzb21ld2hlcmUuCisgKi8KKworLyoKKyAqIFRoYW5rcyB0byBKYW1lcyB2YW4gQXJ0c2RhbGVuIGZvciBhIGJldHRlciB0aW1pbmctZml4IHRoYW4KKyAqIHRoZSB0d28gc2hvcnQganVtcHM6IHVzaW5nIG91dGIncyB0byBhIG5vbmV4aXN0ZW50IHBvcnQgc2VlbXMKKyAqIHRvIGd1YXJhbnRlZSBiZXR0ZXIgdGltaW5ncyBldmVuIG9uIGZhc3QgbWFjaGluZXMuCisgKgorICogT24gdGhlIG90aGVyIGhhbmQsIEknZCBsaWtlIHRvIGJlIHN1cmUgb2YgYSBub24tZXhpc3RlbnQgcG9ydDoKKyAqIEkgZmVlbCBhIGJpdCB1bnNhZmUgYWJvdXQgdXNpbmcgMHg4MCAoc2hvdWxkIGJlIHNhZmUsIHRob3VnaCkKKyAqCisgKgkJTGludXMKKyAqLworCisjaWZkZWYJU0xPV19JT19CWV9KVU1QSU5HCisjZGVmaW5lIF9fU0xPV19ET1dOX0lPIF9fYXNtX18gX192b2xhdGlsZV9fKCJqbXAgMWZcbjE6XHRqbXAgMWZcbjE6IikKKyNlbHNlCisjZGVmaW5lIF9fU0xPV19ET1dOX0lPIF9fYXNtX18gX192b2xhdGlsZV9fKCJvdXRiICVhbCwkMHg4MCIpCisjZW5kaWYKKworI2lmZGVmCVJFQUxMWV9TTE9XX0lPCisjZGVmaW5lIFNMT1dfRE9XTl9JTyB7IF9fU0xPV19ET1dOX0lPOyBfX1NMT1dfRE9XTl9JTzsgX19TTE9XX0RPV05fSU87IF9fU0xPV19ET1dOX0lPOyB9CisjZWxzZQorI2RlZmluZSBTTE9XX0RPV05fSU8gX19TTE9XX0RPV05fSU8KKyNlbmRpZgorCisvKgorICogcmVhZFgvd3JpdGVYKCkgYXJlIHVzZWQgdG8gYWNjZXNzIG1lbW9yeSBtYXBwZWQgZGV2aWNlcy4gT24gc29tZQorICogYXJjaGl0ZWN0dXJlcyB0aGUgbWVtb3J5IG1hcHBlZCBJTyBzdHVmZiBuZWVkcyB0byBiZSBhY2Nlc3NlZAorICogZGlmZmVyZW50bHkuIE9uIHRoZSB4ODYgYXJjaGl0ZWN0dXJlLCB3ZSBqdXN0IHJlYWQvd3JpdGUgdGhlCisgKiBtZW1vcnkgbG9jYXRpb24gZGlyZWN0bHkuCisgKi8KKyNkZWZpbmUgcmVhZGIoYWRkcikgKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoYWRkcikpCisjZGVmaW5lIHJlYWR3KGFkZHIpICgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopIChhZGRyKSkKKyNkZWZpbmUgcmVhZGwoYWRkcikgKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIChhZGRyKSkKKworI2RlZmluZSB3cml0ZWIoYixhZGRyKSAoKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoYWRkcikpID0gKGIpKQorI2RlZmluZSB3cml0ZXcoYixhZGRyKSAoKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikgKGFkZHIpKSA9IChiKSkKKyNkZWZpbmUgd3JpdGVsKGIsYWRkcikgKCgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAoYWRkcikpID0gKGIpKQorCisjZGVmaW5lIG1lbXNldF9pbyhhLGIsYykJbWVtc2V0KCh2b2lkICopKGEpLChiKSwoYykpCisjZGVmaW5lIG1lbWNweV9mcm9taW8oYSxiLGMpCW1lbWNweSgoYSksKHZvaWQgKikoYiksKGMpKQorI2RlZmluZSBtZW1jcHlfdG9pbyhhLGIsYykJbWVtY3B5KCh2b2lkICopKGEpLChiKSwoYykpCisKKy8qCisgKiBBZ2FpbiwgaTM4NiBkb2VzIG5vdCByZXF1aXJlIG1lbSBJTyBzcGVjaWZpYyBmdW5jdGlvbi4KKyAqLworCisjZGVmaW5lIGV0aF9pb19jb3B5X2FuZF9zdW0oYSxiLGMsZCkJZXRoX2NvcHlfYW5kX3N1bSgoYSksKHZvaWQgKikoYiksKGMpLChkKSkKKworLyoKKyAqIFRhbGsgYWJvdXQgbWlzdXNpbmcgbWFjcm9zLi4KKyAqLworCisjZGVmaW5lIF9fT1VUMShzLHgpIFwKK2V4dGVybiB2b2lkIF9fb3V0IyNzKHVuc2lnbmVkIHggdmFsdWUsIHVuc2lnbmVkIHNob3J0IHBvcnQpOyBcCitleHRlcm4gaW5saW5lIHZvaWQgX19vdXQjI3ModW5zaWduZWQgeCB2YWx1ZSwgdW5zaWduZWQgc2hvcnQgcG9ydCkgeworCisjZGVmaW5lIF9fT1VUMihzLHMxLHMyKSBcCitfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm91dCIgI3MgIiAlIiBzMSAiMCwlIiBzMiAiMSIKKworI2RlZmluZSBfX09VVChzLHMxLHgpIFwKK19fT1VUMShzLHgpIF9fT1VUMihzLHMxLCJ3IikgOiA6ICJhIiAodmFsdWUpLCAiZCIgKHBvcnQpKTsgfSBcCitfX09VVDEocyMjYyx4KSBfX09VVDIocyxzMSwiIikgOiA6ICJhIiAodmFsdWUpLCAiaWQiIChwb3J0KSk7IH0gXAorX19PVVQxKHMjI19wLHgpIF9fT1VUMihzLHMxLCJ3IikgOiA6ICJhIiAodmFsdWUpLCAiZCIgKHBvcnQpKTsgU0xPV19ET1dOX0lPOyB9IFwKK19fT1VUMShzIyNjX3AseCkgX19PVVQyKHMsczEsIiIpIDogOiAiYSIgKHZhbHVlKSwgImlkIiAocG9ydCkpOyBTTE9XX0RPV05fSU87IH0KKworI2RlZmluZSBfX0lOMShzLHgpIFwKK2V4dGVybiB1bnNpZ25lZCB4IF9faW4jI3ModW5zaWduZWQgc2hvcnQgcG9ydCk7IFwKK2V4dGVybiBpbmxpbmUgdW5zaWduZWQgeCBfX2luIyNzKHVuc2lnbmVkIHNob3J0IHBvcnQpIHsgdW5zaWduZWQgeCBfdjsKKworI2RlZmluZSBfX0lOMihzLHMxLHMyKSBcCitfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImluIiAjcyAiICUiIHMyICIxLCUiIHMxICIwIgorCisjZGVmaW5lIF9fSU4ocyxzMSx4LGkuLi4pIFwKK19fSU4xKHMseCkgX19JTjIocyxzMSwidyIpIDogIj1hIiAoX3YpIDogImQiIChwb3J0KSAsIyNpICk7IHJldHVybiBfdjsgfSBcCitfX0lOMShzIyNjLHgpIF9fSU4yKHMsczEsIiIpIDogIj1hIiAoX3YpIDogImlkIiAocG9ydCkgLCMjaSApOyByZXR1cm4gX3Y7IH0gXAorX19JTjEocyMjX3AseCkgX19JTjIocyxzMSwidyIpIDogIj1hIiAoX3YpIDogImQiIChwb3J0KSAsIyNpICk7IFNMT1dfRE9XTl9JTzsgcmV0dXJuIF92OyB9IFwKK19fSU4xKHMjI2NfcCx4KSBfX0lOMihzLHMxLCIiKSA6ICI9YSIgKF92KSA6ICJpZCIgKHBvcnQpICwjI2kgKTsgU0xPV19ET1dOX0lPOyByZXR1cm4gX3Y7IH0KKworI2RlZmluZSBfX0lOUyhzKSBcCitleHRlcm4gdm9pZCBpbnMjI3ModW5zaWduZWQgc2hvcnQgcG9ydCwgdm9pZCAqIGFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOyBcCitleHRlcm4gaW5saW5lIHZvaWQgaW5zIyNzKHVuc2lnbmVkIHNob3J0IHBvcnQsIHZvaWQgKiBhZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KSBcCit7IF9fYXNtX18gX192b2xhdGlsZV9fICgiY2xkIDsgcmVwIDsgaW5zIiAjcyBcCis6ICI9RCIgKGFkZHIpLCAiPWMiIChjb3VudCkgOiAiZCIgKHBvcnQpLCIwIiAoYWRkciksIjEiIChjb3VudCkpOyB9CisKKyNkZWZpbmUgX19PVVRTKHMpIFwKK2V4dGVybiB2b2lkIG91dHMjI3ModW5zaWduZWQgc2hvcnQgcG9ydCwgY29uc3Qgdm9pZCAqIGFkZHIsIHVuc2lnbmVkIGxvbmcgIGNvdW50KTsgXAorZXh0ZXJuIGlubGluZSB2b2lkIG91dHMjI3ModW5zaWduZWQgc2hvcnQgcG9ydCwgY29uc3Qgdm9pZCAqIGFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpIFwKK3sgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbGQgOyByZXAgOyBvdXRzIiAjcyBcCis6ICI9UyIgKGFkZHIpLCAiPWMiIChjb3VudCkgOiAiZCIgKHBvcnQpLCIwIiAoYWRkciksIjEiIChjb3VudCkpOyB9CisKK19fSU4oYiwiIiwgY2hhcikKK19fSU4odywiIixzaG9ydCkKK19fSU4obCwiIiwgbG9uZykKKworX19PVVQoYiwiYiIsY2hhcikKK19fT1VUKHcsInciLHNob3J0KQorX19PVVQobCwsaW50KQorCitfX0lOUyhiKQorX19JTlModykKK19fSU5TKGwpCisKK19fT1VUUyhiKQorX19PVVRTKHcpCitfX09VVFMobCkKKworLyoKKyAqIE5vdGUgdGhhdCBkdWUgdG8gdGhlIHdheSBfX2J1aWx0aW5fY29uc3RhbnRfcCgpIHdvcmtzLCB5b3UKKyAqICAtIGNhbid0IHVzZSBpdCBpbnNpZGUgYSBpbmxpbmUgZnVuY3Rpb24gKGl0IHdpbGwgbmV2ZXIgYmUgdHJ1ZSkKKyAqICAtIHlvdSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNpZGUgZWZmZWN0cyB3aXRoaW4gdGhlIF9fYnVpbHRpbi4uCisgKi8KKyNkZWZpbmUgb3V0Yih2YWwscG9ydCkgXAorKChfX2J1aWx0aW5fY29uc3RhbnRfcCgocG9ydCkpICYmIChwb3J0KSA8IDI1NikgPyBcCisJX19vdXRiYygodmFsKSwocG9ydCkpIDogXAorCV9fb3V0YigodmFsKSwocG9ydCkpKQorCisjZGVmaW5lIGluYihwb3J0KSBcCisoKF9fYnVpbHRpbl9jb25zdGFudF9wKChwb3J0KSkgJiYgKHBvcnQpIDwgMjU2KSA/IFwKKwlfX2luYmMocG9ydCkgOiBcCisJX19pbmIocG9ydCkpCisKKyNkZWZpbmUgb3V0Yl9wKHZhbCxwb3J0KSBcCisoKF9fYnVpbHRpbl9jb25zdGFudF9wKChwb3J0KSkgJiYgKHBvcnQpIDwgMjU2KSA/IFwKKwlfX291dGJjX3AoKHZhbCksKHBvcnQpKSA6IFwKKwlfX291dGJfcCgodmFsKSwocG9ydCkpKQorCisjZGVmaW5lIGluYl9wKHBvcnQpIFwKKygoX19idWlsdGluX2NvbnN0YW50X3AoKHBvcnQpKSAmJiAocG9ydCkgPCAyNTYpID8gXAorCV9faW5iY19wKHBvcnQpIDogXAorCV9faW5iX3AocG9ydCkpCisKKyNkZWZpbmUgb3V0dyh2YWwscG9ydCkgXAorKChfX2J1aWx0aW5fY29uc3RhbnRfcCgocG9ydCkpICYmIChwb3J0KSA8IDI1NikgPyBcCisJX19vdXR3YygodmFsKSwocG9ydCkpIDogXAorCV9fb3V0dygodmFsKSwocG9ydCkpKQorCisjZGVmaW5lIGludyhwb3J0KSBcCisoKF9fYnVpbHRpbl9jb25zdGFudF9wKChwb3J0KSkgJiYgKHBvcnQpIDwgMjU2KSA/IFwKKwlfX2lud2MocG9ydCkgOiBcCisJX19pbncocG9ydCkpCisKKyNkZWZpbmUgb3V0d19wKHZhbCxwb3J0KSBcCisoKF9fYnVpbHRpbl9jb25zdGFudF9wKChwb3J0KSkgJiYgKHBvcnQpIDwgMjU2KSA/IFwKKwlfX291dHdjX3AoKHZhbCksKHBvcnQpKSA6IFwKKwlfX291dHdfcCgodmFsKSwocG9ydCkpKQorCisjZGVmaW5lIGlud19wKHBvcnQpIFwKKygoX19idWlsdGluX2NvbnN0YW50X3AoKHBvcnQpKSAmJiAocG9ydCkgPCAyNTYpID8gXAorCV9faW53Y19wKHBvcnQpIDogXAorCV9faW53X3AocG9ydCkpCisKKyNkZWZpbmUgb3V0bCh2YWwscG9ydCkgXAorKChfX2J1aWx0aW5fY29uc3RhbnRfcCgocG9ydCkpICYmIChwb3J0KSA8IDI1NikgPyBcCisJX19vdXRsYygodmFsKSwocG9ydCkpIDogXAorCV9fb3V0bCgodmFsKSwocG9ydCkpKQorCisjZGVmaW5lIGlubChwb3J0KSBcCisoKF9fYnVpbHRpbl9jb25zdGFudF9wKChwb3J0KSkgJiYgKHBvcnQpIDwgMjU2KSA/IFwKKwlfX2lubGMocG9ydCkgOiBcCisJX19pbmwocG9ydCkpCisKKyNkZWZpbmUgb3V0bF9wKHZhbCxwb3J0KSBcCisoKF9fYnVpbHRpbl9jb25zdGFudF9wKChwb3J0KSkgJiYgKHBvcnQpIDwgMjU2KSA/IFwKKwlfX291dGxjX3AoKHZhbCksKHBvcnQpKSA6IFwKKwlfX291dGxfcCgodmFsKSwocG9ydCkpKQorCisjZGVmaW5lIGlubF9wKHBvcnQpIFwKKygoX19idWlsdGluX2NvbnN0YW50X3AoKHBvcnQpKSAmJiAocG9ydCkgPCAyNTYpID8gXAorCV9faW5sY19wKHBvcnQpIDogXAorCV9faW5sX3AocG9ydCkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0Ym9vdC9saW51eC1hc20tc3RyaW5nLmggYi9uZXRib290L2xpbnV4LWFzbS1zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWJlYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9saW51eC1hc20tc3RyaW5nLmgKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgKiBUYWtlbiBmcm9tIExpbnV4IC91c3IvaW5jbHVkZS9hc20vc3RyaW5nLmgKKyAqIEFsbCBleGNlcHQgbWVtY3B5LCBtZW1tb3ZlLCBtZW1zZXQgYW5kIG1lbWNtcCByZW1vdmVkLgorICovCisKKyNpZm5kZWYJX0kzODZfU1RSSU5HX0hfCisjZGVmaW5lIF9JMzg2X1NUUklOR19IXworCisvKgorICogVGhpcyBzdHJpbmctaW5jbHVkZSBkZWZpbmVzIGFsbCBzdHJpbmcgZnVuY3Rpb25zIGFzIGlubGluZQorICogZnVuY3Rpb25zLiBVc2UgZ2NjLiBJdCBhbHNvIGFzc3VtZXMgZHM9ZXM9ZGF0YSBzcGFjZSwgdGhpcyBzaG91bGQgYmUKKyAqIG5vcm1hbC4gTW9zdCBvZiB0aGUgc3RyaW5nLWZ1bmN0aW9ucyBhcmUgcmF0aGVyIGhlYXZpbHkgaGFuZC1vcHRpbWl6ZWQsCisgKiBzZWUgZXNwZWNpYWxseSBzdHJ0b2ssc3Ryc3RyLHN0cltjXXNwbi4gVGhleSBzaG91bGQgd29yaywgYnV0IGFyZSBub3QKKyAqIHZlcnkgZWFzeSB0byB1bmRlcnN0YW5kLiBFdmVyeXRoaW5nIGlzIGRvbmUgZW50aXJlbHkgd2l0aGluIHRoZSByZWdpc3RlcgorICogc2V0LCBtYWtpbmcgdGhlIGZ1bmN0aW9ucyBmYXN0IGFuZCBjbGVhbi4gU3RyaW5nIGluc3RydWN0aW9ucyBoYXZlIGJlZW4KKyAqIHVzZWQgdGhyb3VnaC1vdXQsIG1ha2luZyBmb3IgInNsaWdodGx5IiB1bmNsZWFyIGNvZGUgOi0pCisgKgorICoJCU5PIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiBMaW51cyBUb3J2YWxkcywKKyAqCQljb25zaWRlciB0aGVzZSB0cml2aWFsIGZ1bmN0aW9ucyB0byBiZSBQRC4KKyAqLworCit0eXBlZGVmIGludAlzaXplX3Q7CisKK2V4dGVybiB2b2lkICpfX21lbWNweSh2b2lkICogdG8sIGNvbnN0IHZvaWQgKiBmcm9tLCBzaXplX3Qgbik7CitleHRlcm4gdm9pZCAqX19jb25zdGFudF9tZW1jcHkodm9pZCAqIHRvLCBjb25zdCB2b2lkICogZnJvbSwgc2l6ZV90IG4pOworZXh0ZXJuIHZvaWQgKm1lbW1vdmUodm9pZCAqIGRlc3QsY29uc3Qgdm9pZCAqIHNyYywgc2l6ZV90IG4pOworZXh0ZXJuIHZvaWQgKl9fbWVtc2V0X2dlbmVyaWModm9pZCAqIHMsIGNoYXIgYyxzaXplX3QgY291bnQpOworZXh0ZXJuIHZvaWQgKl9fY29uc3RhbnRfY19tZW1zZXQodm9pZCAqIHMsIHVuc2lnbmVkIGxvbmcgYywgc2l6ZV90IGNvdW50KTsKK2V4dGVybiB2b2lkICpfX2NvbnN0YW50X2NfYW5kX2NvdW50X21lbXNldCh2b2lkICogcywgdW5zaWduZWQgbG9uZyBwYXR0ZXJuLCBzaXplX3QgY291bnQpOworCisKK2V4dGVybiBpbmxpbmUgdm9pZCAqIF9fbWVtY3B5KHZvaWQgKiB0bywgY29uc3Qgdm9pZCAqIGZyb20sIHNpemVfdCBuKQoreworaW50IGQwLCBkMSwgZDI7CitfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkiY2xkXG5cdCIKKwkicmVwIDsgbW92c2xcblx0IgorCSJ0ZXN0YiAkMiwlYjRcblx0IgorCSJqZSAxZlxuXHQiCisJIm1vdnN3XG4iCisJIjE6XHR0ZXN0YiAkMSwlYjRcblx0IgorCSJqZSAyZlxuXHQiCisJIm1vdnNiXG4iCisJIjI6IgorCTogIj0mYyIgKGQwKSwgIj0mRCIgKGQxKSwgIj0mUyIgKGQyKQorCToiMCIgKG4vNCksICJxIiAobiksIjEiICgobG9uZykgdG8pLCIyIiAoKGxvbmcpIGZyb20pCisJOiAibWVtb3J5Iik7CityZXR1cm4gKHRvKTsKK30KKworLyoKKyAqIFRoaXMgbG9va3MgaG9ycmlibHkgdWdseSwgYnV0IHRoZSBjb21waWxlciBjYW4gb3B0aW1pemUgaXQgdG90YWxseSwKKyAqIGFzIHRoZSBjb3VudCBpcyBjb25zdGFudC4KKyAqLworZXh0ZXJuIGlubGluZSB2b2lkICogX19jb25zdGFudF9tZW1jcHkodm9pZCAqIHRvLCBjb25zdCB2b2lkICogZnJvbSwgc2l6ZV90IG4pCit7CisJc3dpdGNoIChuKSB7CisJCWNhc2UgMDoKKwkJCXJldHVybiB0bzsKKwkJY2FzZSAxOgorCQkJKih1bnNpZ25lZCBjaGFyICopdG8gPSAqKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilmcm9tOworCQkJcmV0dXJuIHRvOworCQljYXNlIDI6CisJCQkqKHVuc2lnbmVkIHNob3J0ICopdG8gPSAqKGNvbnN0IHVuc2lnbmVkIHNob3J0ICopZnJvbTsKKwkJCXJldHVybiB0bzsKKwkJY2FzZSAzOgorCQkJKih1bnNpZ25lZCBzaG9ydCAqKXRvID0gKihjb25zdCB1bnNpZ25lZCBzaG9ydCAqKWZyb207CisJCQkqKDIrKHVuc2lnbmVkIGNoYXIgKil0bykgPSAqKDIrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilmcm9tKTsKKwkJCXJldHVybiB0bzsKKwkJY2FzZSA0OgorCQkJKih1bnNpZ25lZCBsb25nICopdG8gPSAqKGNvbnN0IHVuc2lnbmVkIGxvbmcgKilmcm9tOworCQkJcmV0dXJuIHRvOworCQljYXNlIDY6CS8qIGZvciBFdGhlcm5ldCBhZGRyZXNzZXMgKi8KKwkJCSoodW5zaWduZWQgbG9uZyAqKXRvID0gKihjb25zdCB1bnNpZ25lZCBsb25nICopZnJvbTsKKwkJCSooMisodW5zaWduZWQgc2hvcnQgKil0bykgPSAqKDIrKGNvbnN0IHVuc2lnbmVkIHNob3J0ICopZnJvbSk7CisJCQlyZXR1cm4gdG87CisJCWNhc2UgODoKKwkJCSoodW5zaWduZWQgbG9uZyAqKXRvID0gKihjb25zdCB1bnNpZ25lZCBsb25nICopZnJvbTsKKwkJCSooMSsodW5zaWduZWQgbG9uZyAqKXRvKSA9ICooMSsoY29uc3QgdW5zaWduZWQgbG9uZyAqKWZyb20pOworCQkJcmV0dXJuIHRvOworCQljYXNlIDEyOgorCQkJKih1bnNpZ25lZCBsb25nICopdG8gPSAqKGNvbnN0IHVuc2lnbmVkIGxvbmcgKilmcm9tOworCQkJKigxKyh1bnNpZ25lZCBsb25nICopdG8pID0gKigxKyhjb25zdCB1bnNpZ25lZCBsb25nICopZnJvbSk7CisJCQkqKDIrKHVuc2lnbmVkIGxvbmcgKil0bykgPSAqKDIrKGNvbnN0IHVuc2lnbmVkIGxvbmcgKilmcm9tKTsKKwkJCXJldHVybiB0bzsKKwkJY2FzZSAxNjoKKwkJCSoodW5zaWduZWQgbG9uZyAqKXRvID0gKihjb25zdCB1bnNpZ25lZCBsb25nICopZnJvbTsKKwkJCSooMSsodW5zaWduZWQgbG9uZyAqKXRvKSA9ICooMSsoY29uc3QgdW5zaWduZWQgbG9uZyAqKWZyb20pOworCQkJKigyKyh1bnNpZ25lZCBsb25nICopdG8pID0gKigyKyhjb25zdCB1bnNpZ25lZCBsb25nICopZnJvbSk7CisJCQkqKDMrKHVuc2lnbmVkIGxvbmcgKil0bykgPSAqKDMrKGNvbnN0IHVuc2lnbmVkIGxvbmcgKilmcm9tKTsKKwkJCXJldHVybiB0bzsKKwkJY2FzZSAyMDoKKwkJCSoodW5zaWduZWQgbG9uZyAqKXRvID0gKihjb25zdCB1bnNpZ25lZCBsb25nICopZnJvbTsKKwkJCSooMSsodW5zaWduZWQgbG9uZyAqKXRvKSA9ICooMSsoY29uc3QgdW5zaWduZWQgbG9uZyAqKWZyb20pOworCQkJKigyKyh1bnNpZ25lZCBsb25nICopdG8pID0gKigyKyhjb25zdCB1bnNpZ25lZCBsb25nICopZnJvbSk7CisJCQkqKDMrKHVuc2lnbmVkIGxvbmcgKil0bykgPSAqKDMrKGNvbnN0IHVuc2lnbmVkIGxvbmcgKilmcm9tKTsKKwkJCSooNCsodW5zaWduZWQgbG9uZyAqKXRvKSA9ICooNCsoY29uc3QgdW5zaWduZWQgbG9uZyAqKWZyb20pOworCQkJcmV0dXJuIHRvOworCX0KKyNkZWZpbmUgQ09NTU9OKHgpIFwKK19fYXNtX18gX192b2xhdGlsZV9fKCBcCisJImNsZFxuXHQiIFwKKwkicmVwIDsgbW92c2wiIFwKKwl4IFwKKwk6ICI9JmMiIChkMCksICI9JkQiIChkMSksICI9JlMiIChkMikgXAorCTogIjAiIChuLzQpLCIxIiAoKGxvbmcpIHRvKSwiMiIgKChsb25nKSBmcm9tKSBcCisJOiAibWVtb3J5Iik7Cit7CisJaW50IGQwLCBkMSwgZDI7CisJc3dpdGNoIChuICUgNCkgeworCQljYXNlIDA6IENPTU1PTigiIik7IHJldHVybiB0bzsKKwkJY2FzZSAxOiBDT01NT04oIlxuXHRtb3ZzYiIpOyByZXR1cm4gdG87CisJCWNhc2UgMjogQ09NTU9OKCJcblx0bW92c3ciKTsgcmV0dXJuIHRvOworCQlkZWZhdWx0OiBDT01NT04oIlxuXHRtb3Zzd1xuXHRtb3ZzYiIpOyByZXR1cm4gdG87CisJfQorfQorCisjdW5kZWYgQ09NTU9OCit9CisKKyNkZWZpbmUgX19IQVZFX0FSQ0hfTUVNQ1BZCisjZGVmaW5lIG1lbWNweSh0LCBmLCBuKSBcCisoX19idWlsdGluX2NvbnN0YW50X3AobikgPyBcCisgX19jb25zdGFudF9tZW1jcHkoKHQpLChmKSwobikpIDogXAorIF9fbWVtY3B5KCh0KSwoZiksKG4pKSkKKworI2RlZmluZSBfX0hBVkVfQVJDSF9NRU1NT1ZFCitleHRlcm4gaW5saW5lIHZvaWQgKiBtZW1tb3ZlKHZvaWQgKiBkZXN0LGNvbnN0IHZvaWQgKiBzcmMsIHNpemVfdCBuKQoreworaW50IGQwLCBkMSwgZDI7CitpZiAoZGVzdDxzcmMpCitfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkiY2xkXG5cdCIKKwkicmVwXG5cdCIKKwkibW92c2IiCisJOiAiPSZjIiAoZDApLCAiPSZTIiAoZDEpLCAiPSZEIiAoZDIpCisJOiIwIiAobiksIjEiIChzcmMpLCIyIiAoZGVzdCkKKwk6ICJtZW1vcnkiKTsKK2Vsc2UKK19fYXNtX18gX192b2xhdGlsZV9fKAorCSJzdGRcblx0IgorCSJyZXBcblx0IgorCSJtb3ZzYlxuXHQiCisJImNsZCIKKwk6ICI9JmMiIChkMCksICI9JlMiIChkMSksICI9JkQiIChkMikKKwk6IjAiIChuKSwKKwkgIjEiIChuLTErKGNvbnN0IGNoYXIgKilzcmMpLAorCSAiMiIgKG4tMSsoY2hhciAqKWRlc3QpCisJOiJtZW1vcnkiKTsKK3JldHVybiBkZXN0OworfQorCisjZGVmaW5lIG1lbWNtcCBfX2J1aWx0aW5fbWVtY21wCisKK2V4dGVybiBpbmxpbmUgdm9pZCAqIF9fbWVtc2V0X2dlbmVyaWModm9pZCAqIHMsIGNoYXIgYyxzaXplX3QgY291bnQpCit7CitpbnQgZDAsIGQxOworX19hc21fXyBfX3ZvbGF0aWxlX18oCisJImNsZFxuXHQiCisJInJlcFxuXHQiCisJInN0b3NiIgorCTogIj0mYyIgKGQwKSwgIj0mRCIgKGQxKQorCToiYSIgKGMpLCIxIiAocyksIjAiIChjb3VudCkKKwk6Im1lbW9yeSIpOworcmV0dXJuIHM7Cit9CisKKy8qIHdlIG1pZ2h0IHdhbnQgdG8gd3JpdGUgb3B0aW1pemVkIHZlcnNpb25zIG9mIHRoZXNlIGxhdGVyICovCisjZGVmaW5lIF9fY29uc3RhbnRfY291bnRfbWVtc2V0KHMsYyxjb3VudCkgX19tZW1zZXRfZ2VuZXJpYygocyksKGMpLChjb3VudCkpCisKKy8qCisgKiBtZW1zZXQoeCwwLHkpIGlzIGEgcmVhc29uYWJseSBjb21tb24gdGhpbmcgdG8gZG8sIHNvIHdlIHdhbnQgdG8gZmlsbAorICogdGhpbmdzIDMyIGJpdHMgYXQgYSB0aW1lIGV2ZW4gd2hlbiB3ZSBkb24ndCBrbm93IHRoZSBzaXplIG9mIHRoZQorICogYXJlYSBhdCBjb21waWxlLXRpbWUuLgorICovCitleHRlcm4gaW5saW5lIHZvaWQgKiBfX2NvbnN0YW50X2NfbWVtc2V0KHZvaWQgKiBzLCB1bnNpZ25lZCBsb25nIGMsIHNpemVfdCBjb3VudCkKK3sKK2ludCBkMCwgZDE7CitfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkiY2xkXG5cdCIKKwkicmVwIDsgc3Rvc2xcblx0IgorCSJ0ZXN0YiAkMiwlYjNcblx0IgorCSJqZSAxZlxuXHQiCisJInN0b3N3XG4iCisJIjE6XHR0ZXN0YiAkMSwlYjNcblx0IgorCSJqZSAyZlxuXHQiCisJInN0b3NiXG4iCisJIjI6IgorCTogIj0mYyIgKGQwKSwgIj0mRCIgKGQxKQorCToiYSIgKGMpLCAicSIgKGNvdW50KSwgIjAiIChjb3VudC80KSwgIjEiICgobG9uZykgcykKKwk6Im1lbW9yeSIpOworcmV0dXJuIChzKTsKK30KKworLyoKKyAqIFRoaXMgbG9va3MgaG9ycmlibHkgdWdseSwgYnV0IHRoZSBjb21waWxlciBjYW4gb3B0aW1pemUgaXQgdG90YWxseSwKKyAqIGFzIHdlIGJ5IG5vdyBrbm93IHRoYXQgYm90aCBwYXR0ZXJuIGFuZCBjb3VudCBpcyBjb25zdGFudC4uCisgKi8KK2V4dGVybiBpbmxpbmUgdm9pZCAqIF9fY29uc3RhbnRfY19hbmRfY291bnRfbWVtc2V0KHZvaWQgKiBzLCB1bnNpZ25lZCBsb25nIHBhdHRlcm4sIHNpemVfdCBjb3VudCkKK3sKKwlzd2l0Y2ggKGNvdW50KSB7CisJCWNhc2UgMDoKKwkJCXJldHVybiBzOworCQljYXNlIDE6CisJCQkqKHVuc2lnbmVkIGNoYXIgKilzID0gcGF0dGVybjsKKwkJCXJldHVybiBzOworCQljYXNlIDI6CisJCQkqKHVuc2lnbmVkIHNob3J0ICopcyA9IHBhdHRlcm47CisJCQlyZXR1cm4gczsKKwkJY2FzZSAzOgorCQkJKih1bnNpZ25lZCBzaG9ydCAqKXMgPSBwYXR0ZXJuOworCQkJKigyKyh1bnNpZ25lZCBjaGFyICopcykgPSBwYXR0ZXJuOworCQkJcmV0dXJuIHM7CisJCWNhc2UgNDoKKwkJCSoodW5zaWduZWQgbG9uZyAqKXMgPSBwYXR0ZXJuOworCQkJcmV0dXJuIHM7CisJfQorI2RlZmluZSBDT01NT04oeCkgXAorX19hc21fXyAgX192b2xhdGlsZV9fKCJjbGRcblx0IiBcCisJInJlcCA7IHN0b3NsIiBcCisJeCBcCisJOiAiPSZjIiAoZDApLCAiPSZEIiAoZDEpIFwKKwk6ICJhIiAocGF0dGVybiksIjAiIChjb3VudC80KSwiMSIgKChsb25nKSBzKSBcCisJOiAibWVtb3J5IikKK3sKKwlpbnQgZDAsIGQxOworCXN3aXRjaCAoY291bnQgJSA0KSB7CisJCWNhc2UgMDogQ09NTU9OKCIiKTsgcmV0dXJuIHM7CisJCWNhc2UgMTogQ09NTU9OKCJcblx0c3Rvc2IiKTsgcmV0dXJuIHM7CisJCWNhc2UgMjogQ09NTU9OKCJcblx0c3Rvc3ciKTsgcmV0dXJuIHM7CisJCWRlZmF1bHQ6IENPTU1PTigiXG5cdHN0b3N3XG5cdHN0b3NiIik7IHJldHVybiBzOworCX0KK30KKworI3VuZGVmIENPTU1PTgorfQorCisjZGVmaW5lIF9fY29uc3RhbnRfY194X21lbXNldChzLCBjLCBjb3VudCkgXAorKF9fYnVpbHRpbl9jb25zdGFudF9wKGNvdW50KSA/IFwKKyBfX2NvbnN0YW50X2NfYW5kX2NvdW50X21lbXNldCgocyksKGMpLChjb3VudCkpIDogXAorIF9fY29uc3RhbnRfY19tZW1zZXQoKHMpLChjKSwoY291bnQpKSkKKworI2RlZmluZSBfX21lbXNldChzLCBjLCBjb3VudCkgXAorKF9fYnVpbHRpbl9jb25zdGFudF9wKGNvdW50KSA/IFwKKyBfX2NvbnN0YW50X2NvdW50X21lbXNldCgocyksKGMpLChjb3VudCkpIDogXAorIF9fbWVtc2V0X2dlbmVyaWMoKHMpLChjKSwoY291bnQpKSkKKworI2RlZmluZSBfX0hBVkVfQVJDSF9NRU1TRVQKKyNkZWZpbmUgbWVtc2V0KHMsIGMsIGNvdW50KSBcCisoX19idWlsdGluX2NvbnN0YW50X3AoYykgPyBcCisgX19jb25zdGFudF9jX3hfbWVtc2V0KChzKSwoYyksKGNvdW50KSkgOiBcCisgX19tZW1zZXQoKHMpLChjKSwoY291bnQpKSkKKworI2RlZmluZSBfX0hBVkVfQVJDSF9TVFJOQ01QCitzdGF0aWMgaW5saW5lIGludCBzdHJuY21wKGNvbnN0IGNoYXIgKiBjcyxjb25zdCBjaGFyICogY3Qsc2l6ZV90IGNvdW50KQoreworcmVnaXN0ZXIgaW50IF9fcmVzOworaW50IGQwLCBkMSwgZDI7CitfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkiMTpcdGRlY2wgJTNcblx0IgorCSJqcyAyZlxuXHQiCisJImxvZHNiXG5cdCIKKwkic2Nhc2Jcblx0IgorCSJqbmUgM2Zcblx0IgorCSJ0ZXN0YiAlJWFsLCUlYWxcblx0IgorCSJqbmUgMWJcbiIKKwkiMjpcdHhvcmwgJSVlYXgsJSVlYXhcblx0IgorCSJqbXAgNGZcbiIKKwkiMzpcdHNiYmwgJSVlYXgsJSVlYXhcblx0IgorCSJvcmIgJDEsJSVhbFxuIgorCSI0OiIKKwkJICAgICA6Ij1hIiAoX19yZXMpLCAiPSZTIiAoZDApLCAiPSZEIiAoZDEpLCAiPSZjIiAoZDIpCisJCSAgICAgOiIxIiAoY3MpLCIyIiAoY3QpLCIzIiAoY291bnQpKTsKK3JldHVybiBfX3JlczsKK30KKworI2RlZmluZSBfX0hBVkVfQVJDSF9TVFJMRU4KK3N0YXRpYyBpbmxpbmUgc2l6ZV90IHN0cmxlbihjb25zdCBjaGFyICogcykKK3sKK2ludCBkMDsKK3JlZ2lzdGVyIGludCBfX3JlczsKK19fYXNtX18gX192b2xhdGlsZV9fKAorCSJyZXBuZVxuXHQiCisJInNjYXNiXG5cdCIKKwkibm90bCAlMFxuXHQiCisJImRlY2wgJTAiCisJOiI9YyIgKF9fcmVzKSwgIj0mRCIgKGQwKSA6IjEiIChzKSwiYSIgKDApLCAiMCIgKDB4ZmZmZmZmZmYpKTsKK3JldHVybiBfX3JlczsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXRib290L21haW4uYyBiL25ldGJvb3QvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNzU5YjYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L21haW4uYwpAQCAtMCwwICsxLDExNzEgQEAKKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMjAwMCwyMDAxLDIwMDIgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyogQmFzZWQgb24gInNyYy9tYWluLmMiIGluIGV0aGVyYm9vdC01LjAuNS4gICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIRVJCT09UIC0gIEJPT1RQL1RGVFAgQm9vdHN0cmFwIFByb2dyYW0KKworQXV0aG9yOiBNYXJ0aW4gUmVudGVycworICBEYXRlOiBEZWMvOTMKKyAgCitMaXRlcmF0dXJlIGRlYWxpbmcgd2l0aCB0aGUgbmV0d29yayBwcm90b2NvbHM6CisgICAgICAgQVJQIC0gUkZDODI2CisgICAgICAgUkFSUCAtIFJGQzkwMworICAgICAgIFVEUCAtIFJGQzc2OAorICAgICAgIEJPT1RQIC0gUkZDOTUxLCBSRkMyMTMyICh2ZW5kb3IgZXh0ZW5zaW9ucykKKyAgICAgICBESENQIC0gUkZDMjEzMSwgUkZDMjEzMiAob3B0aW9ucykKKyAgICAgICBURlRQIC0gUkZDMTM1MCwgUkZDMjM0NyAob3B0aW9ucyksIFJGQzIzNDggKGJsb2Nrc2l6ZSksIFJGQzIzNDkgKHRzaXplKQorICAgICAgIFJQQyAtIFJGQzE4MzEsIFJGQzE4MzIgKFhEUiksIFJGQzE4MzMgKHJwY2JpbmQvcG9ydG1hcHBlcikKKyAgICAgICBORlMgLSBSRkMxMDk0LCBSRkMxODEzICh2MywgdXNlZnVsIGZvciBjbGFyaWZpY2F0aW9ucywgbm90IGltcGxlbWVudGVkKQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBHUlVCCTEKKyNpbmNsdWRlIDxldGhlcmJvb3QuaD4KKyNpbmNsdWRlIDxuaWMuaD4KKworLyogI2RlZmluZSBERUJVRwkxICovCisKK3N0cnVjdCBhcnB0YWJsZV90IGFycHRhYmxlW01BWF9BUlBdOworCisvKiBTZXQgaWYgdGhlIHVzZXIgcHVzaGVzIENvbnRyb2wtQy4gICovCitpbnQgaXBfYWJvcnQgPSAwOworLyogU2V0IGlmIGFuIGV0aGVybmV0IGNhcmQgaXMgcHJvYmVkIGFuZCBJUCBhZGRyZXNzZXMgYXJlIHNldC4gICovCitpbnQgbmV0d29ya19yZWFkeSA9IDA7CisKK3N0cnVjdCByb21faW5mbyByb207CisKK3N0YXRpYyBpbnQgdmVuZG9yZXh0X2lzdmFsaWQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBuZXRtYXNrOworc3RhdGljIHN0cnVjdCBib290cGRfdCBib290cF9kYXRhOworc3RhdGljIHVuc2lnbmVkIGxvbmcgeGlkOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmVuZF9vZl9yZmMxNTMzID0gTlVMTDsKKworI2lmbmRlZglOT19ESENQX1NVUFBPUlQKKyNlbmRpZiAvKiBOT19ESENQX1NVUFBPUlQgKi8KKworLyog5EV0aCAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgdmVuZG9yZXh0X21hZ2ljW10gPSB7MHhFNCwgMHg0NSwgMHg3NCwgMHg2OH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBicm9hZGNhc3RbXSA9IHsweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGfTsKKworI2lmZGVmCU5PX0RIQ1BfU1VQUE9SVAorCitzdGF0aWMgdW5zaWduZWQgY2hhciByZmMxNTMzX2Nvb2tpZVs1XSA9IHtSRkMxNTMzX0NPT0tJRSwgUkZDMTUzM19FTkR9OworCisjZWxzZSAvKiAhIE5PX0RIQ1BfU1VQUE9SVCAqLworCitzdGF0aWMgaW50IGRoY3BfcmVwbHk7CitzdGF0aWMgaW5fYWRkciBkaGNwX3NlcnZlciA9IHswTH07CitzdGF0aWMgaW5fYWRkciBkaGNwX2FkZHIgPSB7MEx9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmZjMTUzM19jb29raWVbXSA9IHtSRkMxNTMzX0NPT0tJRX07CitzdGF0aWMgdW5zaWduZWQgY2hhciByZmMxNTMzX2VuZFtdID0ge1JGQzE1MzNfRU5EfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZGhjcGRpc2NvdmVyW10gPQoreworICBSRkMyMTMyX01TR19UWVBFLCAxLCBESENQRElTQ09WRVIsCQorICBSRkMyMTMyX01BWF9TSVpFLDIsCS8qIHJlcXVlc3QgYXMgbXVjaCBhcyB3ZSBjYW4gKi8KKyAgRVRIX01BWF9NVFUgLyAyNTYsIEVUSF9NQVhfTVRVICUgMjU2LAorICBSRkMyMTMyX1BBUkFNX0xJU1QsIDQsIFJGQzE1MzNfTkVUTUFTSywgUkZDMTUzM19HQVRFV0FZLAorICBSRkMxNTMzX0hPU1ROQU1FLCBSRkMxNTMzX0VYVEVOU0lPTlBBVEgKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRoY3ByZXF1ZXN0W10gPQoreworICBSRkMyMTMyX01TR19UWVBFLCAxLCBESENQUkVRVUVTVCwKKyAgUkZDMjEzMl9TUlZfSUQsIDQsIDAsIDAsIDAsIDAsCisgIFJGQzIxMzJfUkVRX0FERFIsIDQsIDAsIDAsIDAsIDAsCisgIFJGQzIxMzJfTUFYX1NJWkUsIDIsCS8qIHJlcXVlc3QgYXMgbXVjaCBhcyB3ZSBjYW4gKi8KKyAgRVRIX01BWF9NVFUgLyAyNTYsIEVUSF9NQVhfTVRVICUgMjU2LAorICAvKiByZXF1ZXN0IHBhcmFtZXRlcnMgKi8KKyAgUkZDMjEzMl9QQVJBTV9MSVNULAorICAvKiA0IHN0YW5kYXJkICsgMiB2ZW5kb3J0YWdzICovCisgIDQgKyAyLAorICAvKiBTdGFuZGFyZCBwYXJhbWV0ZXJzICovCisgIFJGQzE1MzNfTkVUTUFTSywgUkZDMTUzM19HQVRFV0FZLAorICBSRkMxNTMzX0hPU1ROQU1FLCBSRkMxNTMzX0VYVEVOU0lPTlBBVEgsCisgIC8qIEV0aGVyYm9vdCB2ZW5kb3J0YWdzICovCisgIFJGQzE1MzNfVkVORE9SX01BR0lDLAorICBSRkMxNTMzX1ZFTkRPUl9DT05GSUdGSUxFLAorfTsKKworI2VuZGlmIC8qICEgTk9fREhDUF9TVVBQT1JUICovCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpcGNoa3N1bSAodW5zaWduZWQgc2hvcnQgKmlwLCBpbnQgbGVuKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB1ZHBjaGtzdW0gKHN0cnVjdCBpcGhkciAqcGFja2V0KTsKKwordm9pZAorcHJpbnRfbmV0d29ya19jb25maWd1cmF0aW9uICh2b2lkKQoreworICBpZiAoISBldGhfcHJvYmUgKCkpCisgICAgZ3J1Yl9wcmludGYgKCJObyBldGhlcm5ldCBjYXJkIGZvdW5kLlxuIik7CisgIGVsc2UgaWYgKCEgbmV0d29ya19yZWFkeSkKKyAgICBncnViX3ByaW50ZiAoIk5vdCBpbml0aWFsaXplZCB5ZXQuXG4iKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGV0aGVyYm9vdF9wcmludGYgKCJBZGRyZXNzOiAlQFxuIiwgYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyLnNfYWRkcik7CisgICAgICBldGhlcmJvb3RfcHJpbnRmICgiTmV0bWFzazogJUBcbiIsIG5ldG1hc2spOworICAgICAgZXRoZXJib290X3ByaW50ZiAoIlNlcnZlcjogJUBcbiIsIGFycHRhYmxlW0FSUF9TRVJWRVJdLmlwYWRkci5zX2FkZHIpOworICAgICAgZXRoZXJib290X3ByaW50ZiAoIkdhdGV3YXk6ICVAXG4iLCBhcnB0YWJsZVtBUlBfR0FURVdBWV0uaXBhZGRyLnNfYWRkcik7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVGQVVMVF9ORVRNQVNLIC0gUmV0dXJuIGRlZmF1bHQgbmV0bWFzayBmb3IgSVAgYWRkcmVzcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgCitkZWZhdWx0X25ldG1hc2sgKHZvaWQpCit7CisgIGludCBuZXQgPSBudG9obCAoYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyLnNfYWRkcikgPj4gMjQ7CisgIGlmIChuZXQgPD0gMTI3KQorICAgIHJldHVybiAoaHRvbmwgKDB4ZmYwMDAwMDApKTsKKyAgZWxzZSBpZiAobmV0IDwgMTkyKQorICAgIHJldHVybiAoaHRvbmwgKDB4ZmZmZjAwMDApKTsKKyAgZWxzZQorICAgIHJldHVybiAoaHRvbmwgKDB4ZmZmZmZmMDApKTsKK30KKworLyogaWZjb25maWcgLSBjb25maWd1cmUgbmV0d29yayBpbnRlcmZhY2UuICAqLworaW50CitpZmNvbmZpZyAoY2hhciAqaXAsIGNoYXIgKnNtLCBjaGFyICpndywgY2hhciAqc3ZyKQoreworICBpbl9hZGRyIHRtcDsKKyAgCisgIGlmIChzbSkgCisgICAgeworICAgICAgaWYgKCEgaW5ldF9hdG9uIChzbSwgJnRtcCkpCisJcmV0dXJuIDA7CisgICAgICAKKyAgICAgIG5ldG1hc2sgPSB0bXAuc19hZGRyOworICAgIH0KKyAgCisgIGlmIChpcCkgCisgICAgeworICAgICAgaWYgKCEgaW5ldF9hdG9uIChpcCwgJmFycHRhYmxlW0FSUF9DTElFTlRdLmlwYWRkcikpIAorCXJldHVybiAwOworICAgICAgCisgICAgICBpZiAoISBuZXRtYXNrICYmICEgc20pIAorCW5ldG1hc2sgPSBkZWZhdWx0X25ldG1hc2sgKCk7CisgICAgfQorICAKKyAgaWYgKGd3ICYmICEgaW5ldF9hdG9uIChndywgJmFycHRhYmxlW0FSUF9HQVRFV0FZXS5pcGFkZHIpKSAKKyAgICByZXR1cm4gMDsKKworICAvKiBDbGVhciBvdXQgdGhlIEFSUCBlbnRyeS4gICovCisgIGdydWJfbWVtc2V0IChhcnB0YWJsZVtBUlBfR0FURVdBWV0ubm9kZSwgMCwgRVRIX0FMRU4pOworICAKKyAgaWYgKHN2ciAmJiAhIGluZXRfYXRvbiAoc3ZyLCAmYXJwdGFibGVbQVJQX1NFUlZFUl0uaXBhZGRyKSkgCisgICAgcmV0dXJuIDA7CisKKyAgLyogTGlrZXdpc2UuICAqLworICBncnViX21lbXNldCAoYXJwdGFibGVbQVJQX1NFUlZFUl0ubm9kZSwgMCwgRVRIX0FMRU4pOworICAKKyAgaWYgKGlwIHx8IHNtKQorICAgIHsKKyAgICAgIGlmIChJUF9CUk9BRENBU1QgPT0gKG5ldG1hc2sgfCBhcnB0YWJsZVtBUlBfQ0xJRU5UXS5pcGFkZHIuc19hZGRyKQorCSAgfHwgbmV0bWFzayA9PSAobmV0bWFzayB8IGFycHRhYmxlW0FSUF9DTElFTlRdLmlwYWRkci5zX2FkZHIpCisJICB8fCAhIG5ldG1hc2spCisJbmV0d29ya19yZWFkeSA9IDA7CisgICAgICBlbHNlCisJbmV0d29ya19yZWFkeSA9IDE7CisgICAgfQorICAKKyAgcmV0dXJuIDE7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitVRFBfVFJBTlNNSVQgLSBTZW5kIGEgVURQIGRhdGFncmFtCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCAKK3VkcF90cmFuc21pdCAodW5zaWduZWQgbG9uZyBkZXN0aXAsIHVuc2lnbmVkIGludCBzcmNzb2NrLAorCSAgICAgIHVuc2lnbmVkIGludCBkZXN0c29jaywgaW50IGxlbiwgY29uc3Qgdm9pZCAqYnVmKQoreworICBzdHJ1Y3QgaXBoZHIgKmlwOworICBzdHJ1Y3QgdWRwaGRyICp1ZHA7CisgIHN0cnVjdCBhcnByZXF1ZXN0IGFycHJlcTsKKyAgaW50IGFycGVudHJ5LCBpOworICBpbnQgcmV0cnk7CisKKyAgaXAgPSAoc3RydWN0IGlwaGRyICopIGJ1ZjsKKyAgdWRwID0gKHN0cnVjdCB1ZHBoZHIgKikgKCh1bnNpZ25lZCBsb25nKSBidWYgKyBzaXplb2YgKHN0cnVjdCBpcGhkcikpOworICBpcC0+dmVyaGRybGVuID0gMHg0NTsKKyAgaXAtPnNlcnZpY2UgPSAwOworICBpcC0+bGVuID0gaHRvbnMgKGxlbik7CisgIGlwLT5pZGVudCA9IDA7CisgIGlwLT5mcmFncyA9IDA7CisgIGlwLT50dGwgPSA2MDsKKyAgaXAtPnByb3RvY29sID0gSVBfVURQOworICBpcC0+Y2hrc3VtID0gMDsKKyAgaXAtPnNyYy5zX2FkZHIgPSBhcnB0YWJsZVtBUlBfQ0xJRU5UXS5pcGFkZHIuc19hZGRyOworICBpcC0+ZGVzdC5zX2FkZHIgPSBkZXN0aXA7CisgIGlwLT5jaGtzdW0gPSBpcGNoa3N1bSAoKHVuc2lnbmVkIHNob3J0ICopIGJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgaXBoZHIpKTsKKyAgdWRwLT5zcmMgPSBodG9ucyAoc3Jjc29jayk7CisgIHVkcC0+ZGVzdCA9IGh0b25zIChkZXN0c29jayk7CisgIHVkcC0+bGVuID0gaHRvbnMgKGxlbiAtIHNpemVvZiAoc3RydWN0IGlwaGRyKSk7CisgIHVkcC0+Y2hrc3VtID0gMDsKKyAgdWRwLT5jaGtzdW0gPSBodG9ucyAodWRwY2hrc3VtIChpcCkpOworCisgIGlmICh1ZHAtPmNoa3N1bSA9PSAwKQorICAgIHVkcC0+Y2hrc3VtID0gMHhmZmZmOworICAKKyAgaWYgKGRlc3RpcCA9PSBJUF9CUk9BRENBU1QpCisgICAgeworICAgICAgZXRoX3RyYW5zbWl0IChicm9hZGNhc3QsIElQLCBsZW4sIGJ1Zik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCgoZGVzdGlwICYgbmV0bWFzaykKKwkgICAhPSAoYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyLnNfYWRkciAmIG5ldG1hc2spKQorCSAgJiYgYXJwdGFibGVbQVJQX0dBVEVXQVldLmlwYWRkci5zX2FkZHIpCisJZGVzdGlwID0gYXJwdGFibGVbQVJQX0dBVEVXQVldLmlwYWRkci5zX2FkZHI7CisgICAgICAKKyAgICAgIGZvciAoYXJwZW50cnkgPSAwOyBhcnBlbnRyeSA8IE1BWF9BUlA7IGFycGVudHJ5KyspCisJaWYgKGFycHRhYmxlW2FycGVudHJ5XS5pcGFkZHIuc19hZGRyID09IGRlc3RpcCkKKwkgIGJyZWFrOworICAgICAgCisgICAgICBpZiAoYXJwZW50cnkgPT0gTUFYX0FSUCkKKwl7CisJICBldGhlcmJvb3RfcHJpbnRmICgiJUAgaXMgbm90IGluIG15IGFycCB0YWJsZSFcbiIsIGRlc3RpcCk7CisJICByZXR1cm4gMDsKKwl9CisgICAgICAKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQorCWlmIChhcnB0YWJsZVthcnBlbnRyeV0ubm9kZVtpXSkKKwkgIGJyZWFrOworICAgICAgCisgICAgICBpZiAoaSA9PSBFVEhfQUxFTikKKwl7CisJICAvKiBOZWVkIHRvIGRvIGFycCByZXF1ZXN0LiAgKi8KKyNpZmRlZiBERUJVRworCSAgZ3J1Yl9wcmludGYgKCJhcnAgcmVxdWVzdC5cbiIpOworI2VuZGlmCisJICBhcnByZXEuaHd0eXBlID0gaHRvbnMgKDEpOworCSAgYXJwcmVxLnByb3RvY29sID0gaHRvbnMgKElQKTsKKwkgIGFycHJlcS5od2xlbiA9IEVUSF9BTEVOOworCSAgYXJwcmVxLnByb3RvbGVuID0gNDsKKwkgIGFycHJlcS5vcGNvZGUgPSBodG9ucyAoQVJQX1JFUVVFU1QpOworCSAgZ3J1Yl9tZW1tb3ZlIChhcnByZXEuc2h3YWRkciwgYXJwdGFibGVbQVJQX0NMSUVOVF0ubm9kZSwKKwkJCUVUSF9BTEVOKTsKKwkgIGdydWJfbWVtbW92ZSAoYXJwcmVxLnNpcGFkZHIsIChjaGFyICopICZhcnB0YWJsZVtBUlBfQ0xJRU5UXS5pcGFkZHIsCisJCQlzaXplb2YgKGluX2FkZHIpKTsKKwkgIGdydWJfbWVtc2V0IChhcnByZXEudGh3YWRkciwgMCwgRVRIX0FMRU4pOworCSAgZ3J1Yl9tZW1tb3ZlIChhcnByZXEudGlwYWRkciwgKGNoYXIgKikgJmRlc3RpcCwgc2l6ZW9mIChpbl9hZGRyKSk7CisJICAKKwkgIGZvciAocmV0cnkgPSAxOyByZXRyeSA8PSBNQVhfQVJQX1JFVFJJRVM7IHJldHJ5KyspCisJICAgIHsKKwkgICAgICBsb25nIHRpbWVvdXQ7CisJICAgICAgCisJICAgICAgZXRoX3RyYW5zbWl0IChicm9hZGNhc3QsIEFSUCwgc2l6ZW9mIChhcnByZXEpLCAmYXJwcmVxKTsKKwkgICAgICB0aW1lb3V0ID0gcmZjMjEzMV9zbGVlcF9pbnRlcnZhbCAoVElNRU9VVCwgcmV0cnkpOworCSAgICAgIAorCSAgICAgIGlmIChhd2FpdF9yZXBseSAoQVdBSVRfQVJQLCBhcnBlbnRyeSwgYXJwcmVxLnRpcGFkZHIsIHRpbWVvdXQpKQorCQlnb3RvIHhtaXQ7CisKKwkgICAgICBpZiAoaXBfYWJvcnQpCisJCXJldHVybiAwOworCSAgICB9CisJICAKKwkgIHJldHVybiAwOworCX0KKyAgICAgIAorICAgIHhtaXQ6CisgICAgICBldGhfdHJhbnNtaXQgKGFycHRhYmxlW2FycGVudHJ5XS5ub2RlLCBJUCwgbGVuLCBidWYpOworICAgIH0KKyAgCisgIHJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1RGVFAgLSBEb3dubG9hZCBleHRlbmRlZCBCT09UUCBkYXRhLCBvciBrZXJuZWwgaW1hZ2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAordGZ0cCAoY29uc3QgY2hhciAqbmFtZSwgaW50ICgqZm5jKSAodW5zaWduZWQgY2hhciAqLCBpbnQsIGludCwgaW50KSkKK3sKKyAgaW50IHJldHJ5ID0gMDsKKyAgc3RhdGljIHVuc2lnbmVkIHNob3J0IGlwb3J0ID0gMjAwMDsKKyAgdW5zaWduZWQgc2hvcnQgb3BvcnQgPSAwOworICB1bnNpZ25lZCBzaG9ydCBsZW4sIGJsb2NrID0gMCwgcHJldmJsb2NrID0gMDsKKyAgaW50IGJjb3VudGVyID0gMDsKKyAgc3RydWN0IHRmdHBfdCAqdHI7CisgIHN0cnVjdCB0ZnRwcmVxX3QgdHA7CisgIGludCByYzsKKyAgaW50IHBhY2tldHNpemUgPSBURlRQX0RFRkFVTFRTSVpFX1BBQ0tFVDsKKyAgCisgIC8qIENsZWFyIG91dCB0aGUgUnggcXVldWUgZmlyc3QuICBJdCBjb250YWlucyBub3RoaW5nIG9mIGludGVyZXN0LAorICAgKiBleGNlcHQgcG9zc2libHkgQVJQIHJlcXVlc3RzIGZyb20gdGhlIERIQ1AvVEZUUCBzZXJ2ZXIuICBXZSB1c2UKKyAgICogcG9sbGluZyB0aHJvdWdob3V0IEV0aGVyYm9vdCwgc28gc29tZSB0aW1lIG1heSBoYXZlIHBhc3NlZCBzaW5jZSB3ZQorICAgKiBsYXN0IHBvbGxlZCB0aGUgcmVjZWl2ZSBxdWV1ZSwgd2hpY2ggbWF5IG5vdyBiZSBmaWxsZWQgd2l0aAorICAgKiBicm9hZGNhc3QgcGFja2V0cy4gIFRoaXMgd2lsbCBjYXVzZSB0aGUgcmVwbHkgdG8gdGhlIHBhY2tldHMgd2UgYXJlCisgICAqIGFib3V0IHRvIHNlbmQgdG8gYmUgbG9zdCBpbW1lZGlhdGVseS4gIE5vdCB2ZXJ5IGNsZXZlci4gICovCisgIGF3YWl0X3JlcGx5IChBV0FJVF9RRFJBSU4sIDAsIE5VTEwsIDApOworICAKKyAgdHAub3Bjb2RlID0gaHRvbnMgKFRGVFBfUlJRKTsKKyAgbGVuID0gKGdydWJfc3ByaW50ZiAoKGNoYXIgKikgdHAudS5ycnEsICIlcyVjb2N0ZXQlY2Jsa3NpemUlYyVkIiwKKwkJICAgICAgIG5hbWUsIDAsIDAsIDAsIFRGVFBfTUFYX1BBQ0tFVCkKKwkgKyBzaXplb2YgKHRwLmlwKSArIHNpemVvZiAodHAudWRwKSArIHNpemVvZiAodHAub3Bjb2RlKSArIDEpOworICBpZiAoISB1ZHBfdHJhbnNtaXQgKGFycHRhYmxlW0FSUF9TRVJWRVJdLmlwYWRkci5zX2FkZHIsICsraXBvcnQsCisJCSAgICAgIFRGVFBfUE9SVCwgbGVuLCAmdHApKQorICAgIHJldHVybiAwOworICAKKyAgZm9yICg7OykKKyAgICB7CisgICAgICBsb25nIHRpbWVvdXQ7CisgICAgICAKKyNpZmRlZiBDT05HRVNURUQKKyAgICAgIHRpbWVvdXQgPSByZmMyMTMxX3NsZWVwX2ludGVydmFsIChibG9jayA/IFRGVFBfUkVYTVQgOiBUSU1FT1VULCByZXRyeSk7CisjZWxzZQorICAgICAgdGltZW91dCA9IHJmYzIxMzFfc2xlZXBfaW50ZXJ2YWwgKFRJTUVPVVQsIHJldHJ5KTsKKyNlbmRpZgorCisgICAgICBpZiAoISBhd2FpdF9yZXBseSAoQVdBSVRfVEZUUCwgaXBvcnQsIE5VTEwsIHRpbWVvdXQpKQorCXsKKwkgIGlmICghIGJsb2NrICYmIHJldHJ5KysgPCBNQVhfVEZUUF9SRVRSSUVTKQorCSAgICB7CisJICAgICAgLyogTWF5YmUgaW5pdGlhbCByZXF1ZXN0IHdhcyBsb3N0LiAgKi8KKwkgICAgICBpZiAoISB1ZHBfdHJhbnNtaXQgKGFycHRhYmxlW0FSUF9TRVJWRVJdLmlwYWRkci5zX2FkZHIsCisJCQkJICArK2lwb3J0LCBURlRQX1BPUlQsIGxlbiwgJnRwKSkKKwkJcmV0dXJuIDA7CisJICAgICAgCisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgIAorI2lmZGVmIENPTkdFU1RFRAorCSAgaWYgKGJsb2NrICYmICgocmV0cnkgKz0gVEZUUF9SRVhNVCkgPCBURlRQX1RJTUVPVVQpKQorCSAgICB7CisJICAgICAgLyogV2UgcmVzZW5kIG91ciBsYXN0IGFjay4gICovCisjaWZkZWYgTURFQlVHCisJICAgICAgZ3J1Yl9wcmludGYgKCI8UkVYTVQ+XG4iKTsKKyNlbmRpZgorCSAgICAgIHVkcF90cmFuc21pdCAoYXJwdGFibGVbQVJQX1NFUlZFUl0uaXBhZGRyLnNfYWRkciwKKwkJCSAgICBpcG9ydCwgb3BvcnQsCisJCQkgICAgVEZUUF9NSU5fUEFDS0VULCAmdHApOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisjZW5kaWYKKwkgIC8qIFRpbWVvdXQuICAqLworCSAgYnJlYWs7CisJfQorICAgICAgCisgICAgICB0ciA9IChzdHJ1Y3QgdGZ0cF90ICopICZuaWMucGFja2V0W0VUSF9ITEVOXTsKKyAgICAgIGlmICh0ci0+b3Bjb2RlID09IG50b2hzIChURlRQX0VSUk9SKSkKKwl7CisJICBncnViX3ByaW50ZiAoIlRGVFAgZXJyb3IgJWQgKCVzKVxuIiwKKwkJICAgICAgIG50b2hzICh0ci0+dS5lcnIuZXJyY29kZSksCisJCSAgICAgICB0ci0+dS5lcnIuZXJybXNnKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIAorICAgICAgaWYgKHRyLT5vcGNvZGUgPT0gbnRvaHMgKFRGVFBfT0FDSykpCisJeworCSAgY2hhciAqcCA9IHRyLT51Lm9hY2suZGF0YSwgKmU7CisJICAKKwkgIC8qIFNob3VsZG4ndCBoYXBwZW4uICAqLworCSAgaWYgKHByZXZibG9jaykKKwkgICAgLyogSWdub3JlIGl0LiAgKi8KKwkgICAgY29udGludWU7CisJICAKKwkgIGxlbiA9IG50b2hzICh0ci0+dWRwLmxlbikgLSBzaXplb2YgKHN0cnVjdCB1ZHBoZHIpIC0gMjsKKwkgIGlmIChsZW4gPiBURlRQX01BWF9QQUNLRVQpCisJICAgIGdvdG8gbm9hazsKKwkgIAorCSAgZSA9IHAgKyBsZW47CisJICB3aGlsZSAoKnAgIT0gJ1wwMDAnICYmIHAgPCBlKQorCSAgICB7CisJICAgICAgaWYgKCEgZ3J1Yl9zdHJjbXAgKCJibGtzaXplIiwgcCkpCisJCXsKKwkJICBwICs9IDg7CisJCSAgaWYgKChwYWNrZXRzaXplID0gZ2V0ZGVjICgmcCkpIDwgVEZUUF9ERUZBVUxUU0laRV9QQUNLRVQpCisJCSAgICBnb3RvIG5vYWs7CisJCSAgCisJCSAgd2hpbGUgKHAgPCBlICYmICpwKQorCQkgICAgcCsrOworCQkgIAorCQkgIGlmIChwIDwgZSkKKwkJICAgIHArKzsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQlub2FrOgorCQkgIHRwLm9wY29kZSA9IGh0b25zIChURlRQX0VSUk9SKTsKKwkJICB0cC51LmVyci5lcnJjb2RlID0gODsKKwkJICBsZW4gPSAoZ3J1Yl9zcHJpbnRmICgoY2hhciAqKSB0cC51LmVyci5lcnJtc2csCisJCQkJICAgICAgICJSRkMxNzgyIGVycm9yIikKKwkJCSArIHNpemVvZiAodHAuaXApICsgc2l6ZW9mICh0cC51ZHApCisJCQkgKyBzaXplb2YgKHRwLm9wY29kZSkgKyBzaXplb2YgKHRwLnUuZXJyLmVycmNvZGUpCisJCQkgKyAxKTsKKwkJICB1ZHBfdHJhbnNtaXQgKGFycHRhYmxlW0FSUF9TRVJWRVJdLmlwYWRkci5zX2FkZHIsCisJCQkJaXBvcnQsIG50b2hzICh0ci0+dWRwLnNyYyksCisJCQkJbGVuLCAmdHApOworCQkgIHJldHVybiAwOworCQl9CisJICAgIH0KKwkgIAorCSAgaWYgKHAgPiBlKQorCSAgICBnb3RvIG5vYWs7CisJICAKKwkgIC8qIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBwYWNrZXQgZG9lcyBub3QgZ2V0IHByb2Nlc3NlZCBhcyBkYXRhISAgKi8KKwkgIGJsb2NrID0gdHAudS5hY2suYmxvY2sgPSAwOyAKKwl9CisgICAgICBlbHNlIGlmICh0ci0+b3Bjb2RlID09IG50b2hzIChURlRQX0RBVEEpKQorCXsKKwkgIGxlbiA9IG50b2hzICh0ci0+dWRwLmxlbikgLSBzaXplb2YgKHN0cnVjdCB1ZHBoZHIpIC0gNDsKKwkgIC8qIFNob3VsZG4ndCBoYXBwZW4uICAqLworCSAgaWYgKGxlbiA+IHBhY2tldHNpemUpCisJICAgIC8qIElnbm9yZSBpdC4gICovCisJICAgIGNvbnRpbnVlOworCSAgCisJICBibG9jayA9IG50b2hzICh0cC51LmFjay5ibG9jayA9IHRyLT51LmRhdGEuYmxvY2spOworCX0KKyAgICAgIGVsc2UKKwkvKiBOZWl0aGVyIFRGVFBfT0FDSyBub3IgVEZUUF9EQVRBLiAgKi8KKwlicmVhazsKKyAgICAgIAorICAgICAgaWYgKChibG9jayB8fCBiY291bnRlcikgJiYgKGJsb2NrICE9IHByZXZibG9jayArIDEpKQorCS8qIEJsb2NrIG9yZGVyIHNob3VsZCBiZSBjb250aW51b3VzICovCisJdHAudS5hY2suYmxvY2sgPSBodG9ucyAoYmxvY2sgPSBwcmV2YmxvY2spOworICAgICAgCisgICAgICAvKiBTaG91bGQgYmUgY29udGludW91cy4gICovCisgICAgICB0cC5vcGNvZGUgPSBodG9ucyAoVEZUUF9BQ0spOworICAgICAgb3BvcnQgPSBudG9ocyAodHItPnVkcC5zcmMpOworICAgICAgLyogQWNrLiAgKi8KKyAgICAgIHVkcF90cmFuc21pdCAoYXJwdGFibGVbQVJQX1NFUlZFUl0uaXBhZGRyLnNfYWRkciwgaXBvcnQsCisJCSAgICBvcG9ydCwgVEZUUF9NSU5fUEFDS0VULCAmdHApOworICAgICAgCisgICAgICBpZiAoKHVuc2lnbmVkIHNob3J0KSAoYmxvY2sgLSBwcmV2YmxvY2spICE9IDEpCisJLyogUmV0cmFuc21pc3Npb24gb3IgT0FDSywgZG9uJ3QgcHJvY2VzcyB2aWEgY2FsbGJhY2sKKwkgKiBhbmQgZG9uJ3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBwcmV2YmxvY2suICAqLworCWNvbnRpbnVlOworICAgICAgCisgICAgICBwcmV2YmxvY2sgPSBibG9jazsKKyAgICAgIC8qIElzIGl0IHRoZSByaWdodCBwbGFjZSB0byB6ZXJvIHRoZSB0aW1lcj8gICovCisgICAgICByZXRyeSA9IDA7CisgICAgICAKKyAgICAgIGlmICgocmMgPSBmbmMgKHRyLT51LmRhdGEuZG93bmxvYWQsCisJCSAgICAgKytiY291bnRlciwgbGVuLCBsZW4gPCBwYWNrZXRzaXplKSkgPj0gMCkKKwlyZXR1cm4gcmM7CisKKyAgICAgIC8qIEVuZCBvZiBkYXRhLiAgKi8KKyAgICAgIGlmIChsZW4gPCBwYWNrZXRzaXplKSAgICAgICAgICAgCisJcmV0dXJuIDE7CisgICAgfQorICAKKyAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkFSUCAtIEdldCBteSBJUCBhZGRyZXNzIGFuZCBsb2FkIGluZm9ybWF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCAKK3JhcnAgKHZvaWQpCit7CisgIGludCByZXRyeTsKKworICAvKiBhcnAgYW5kIHJhcnAgcmVxdWVzdHMgc2hhcmUgdGhlIHNhbWUgcGFja2V0IHN0cnVjdHVyZS4gICovCisgIHN0cnVjdCBhcnByZXF1ZXN0IHJhcnByZXE7CisKKyAgLyogTWFrZSBzdXJlIHRoYXQgYW4gZXRoZXJuZXQgaXMgcHJvYmVkLiAgKi8KKyAgaWYgKCEgZXRoX3Byb2JlICgpKQorICAgIHJldHVybiAwOworCisgIC8qIENsZWFyIHRoZSByZWFkeSBmbGFnLiAgKi8KKyAgbmV0d29ya19yZWFkeSA9IDA7CisgIAorICBncnViX21lbXNldCAoJnJhcnByZXEsIDAsIHNpemVvZiAocmFycHJlcSkpOworCisgIHJhcnByZXEuaHd0eXBlID0gaHRvbnMgKDEpOworICByYXJwcmVxLnByb3RvY29sID0gaHRvbnMgKElQKTsKKyAgcmFycHJlcS5od2xlbiA9IEVUSF9BTEVOOworICByYXJwcmVxLnByb3RvbGVuID0gNDsKKyAgcmFycHJlcS5vcGNvZGUgPSBodG9ucyAoUkFSUF9SRVFVRVNUKTsKKyAgZ3J1Yl9tZW1tb3ZlICgoY2hhciAqKSAmcmFycHJlcS5zaHdhZGRyLCBhcnB0YWJsZVtBUlBfQ0xJRU5UXS5ub2RlLAorCQlFVEhfQUxFTik7CisgIC8qIHNpcGFkZHIgaXMgYWxyZWFkeSB6ZXJvZWQgb3V0ICovCisgIGdydWJfbWVtbW92ZSAoKGNoYXIgKikgJnJhcnByZXEudGh3YWRkciwgYXJwdGFibGVbQVJQX0NMSUVOVF0ubm9kZSwKKwkJRVRIX0FMRU4pOworICAvKiB0aXBhZGRyIGlzIGFscmVhZHkgemVyb2VkIG91dCAqLworCisgIGZvciAocmV0cnkgPSAwOyByZXRyeSA8IE1BWF9BUlBfUkVUUklFUzsgKytyZXRyeSkKKyAgICB7CisgICAgICBsb25nIHRpbWVvdXQ7CisgICAgICAKKyAgICAgIGV0aF90cmFuc21pdCAoYnJvYWRjYXN0LCBSQVJQLCBzaXplb2YgKHJhcnByZXEpLCAmcmFycHJlcSk7CisKKyAgICAgIHRpbWVvdXQgPSByZmMyMTMxX3NsZWVwX2ludGVydmFsIChUSU1FT1VULCByZXRyeSk7CisgICAgICBpZiAoYXdhaXRfcmVwbHkgKEFXQUlUX1JBUlAsIDAsIHJhcnByZXEuc2h3YWRkciwgdGltZW91dCkpCisJYnJlYWs7CisKKyAgICAgIGlmIChpcF9hYm9ydCkKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKHJldHJ5IDwgTUFYX0FSUF9SRVRSSUVTKQorICAgIHsKKyAgICAgIG5ldHdvcmtfcmVhZHkgPSAxOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0JPT1RQIC0gR2V0IG15IElQIGFkZHJlc3MgYW5kIGxvYWQgaW5mb3JtYXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IAorYm9vdHAgKHZvaWQpCit7CisgIGludCByZXRyeTsKKyNpZm5kZWYJTk9fREhDUF9TVVBQT1JUCisgIGludCByZXFyZXRyeTsKKyNlbmRpZiAvKiAhIE5PX0RIQ1BfU1VQUE9SVCAqLworICBzdHJ1Y3QgYm9vdHBpcF90IGlwOworICB1bnNpZ25lZCBsb25nIHN0YXJ0dGltZTsKKworICAvKiBNYWtlIHN1cmUgdGhhdCBhbiBldGhlcm5ldCBpcyBwcm9iZWQuICAqLworICBpZiAoISBldGhfcHJvYmUgKCkpCisgICAgcmV0dXJuIDA7CisKKyAgLyogQ2xlYXIgdGhlIHJlYWR5IGZsYWcuICAqLworICBuZXR3b3JrX3JlYWR5ID0gMDsKKworI2lmZGVmIERFQlVHCisgIGdydWJfcHJpbnRmICgibmV0d29yayBpcyByZWFkeS5cbiIpOworI2VuZGlmCisgIAorICBncnViX21lbXNldCAoJmlwLCAwLCBzaXplb2YgKHN0cnVjdCBib290cGlwX3QpKTsKKyAgaXAuYnAuYnBfb3AgPSBCT09UUF9SRVFVRVNUOworICBpcC5icC5icF9odHlwZSA9IDE7CisgIGlwLmJwLmJwX2hsZW4gPSBFVEhfQUxFTjsKKyAgc3RhcnR0aW1lID0gY3VycnRpY2tzICgpOworICAvKiBVc2UgbG93ZXIgMzIgYml0cyBvZiBub2RlIGFkZHJlc3MsIG1vcmUgbGlrZWx5IHRvIGJlCisgICAgIGRpc3RpbmN0IHRoYW4gdGhlIHRpbWUgc2luY2UgYm9vdGluZyAqLworICBncnViX21lbW1vdmUgKCZ4aWQsICZhcnB0YWJsZVtBUlBfQ0xJRU5UXS5ub2RlWzJdLCBzaXplb2YoeGlkKSk7CisgIGlwLmJwLmJwX3hpZCA9IHhpZCArPSBodG9ubCAoc3RhcnR0aW1lKTsKKyAgZ3J1Yl9tZW1tb3ZlIChpcC5icC5icF9od2FkZHIsIGFycHRhYmxlW0FSUF9DTElFTlRdLm5vZGUsIEVUSF9BTEVOKTsKKyNpZmRlZiBERUJVRworICBldGhlcmJvb3RfcHJpbnRmICgiYnBfb3AgPSAlZFxuIiwgaXAuYnAuYnBfb3ApOworICBldGhlcmJvb3RfcHJpbnRmICgiYnBfaHR5cGUgPSAlZFxuIiwgaXAuYnAuYnBfaHR5cGUpOworICBldGhlcmJvb3RfcHJpbnRmICgiYnBfaGxlbiA9ICVkXG4iLCBpcC5icC5icF9obGVuKTsKKyAgZXRoZXJib290X3ByaW50ZiAoImJwX3hpZCA9ICVkXG4iLCBpcC5icC5icF94aWQpOworICBldGhlcmJvb3RfcHJpbnRmICgiYnBfaHdhZGRyID0gJSFcbiIsIGlwLmJwLmJwX2h3YWRkcik7CisgIGV0aGVyYm9vdF9wcmludGYgKCJicF9ob3BzID0gJWRcbiIsIChpbnQpIGlwLmJwLmJwX2hvcHMpOworICBldGhlcmJvb3RfcHJpbnRmICgiYnBfc2VjcyA9ICVkXG4iLCAoaW50KSBpcC5icC5icF9od2FkZHIpOworI2VuZGlmCisgIAorI2lmZGVmCU5PX0RIQ1BfU1VQUE9SVAorICAvKiBSZXF1ZXN0IFJGQy1zdHlsZSBvcHRpb25zLiAgKi8KKyAgZ3J1Yl9tZW1tb3ZlIChpcC5icC5icF92ZW5kLCByZmMxNTMzX2Nvb2tpZSwgNSk7CisjZWxzZQorICAvKiBSZXF1ZXN0IFJGQy1zdHlsZSBvcHRpb25zLiAgKi8KKyAgZ3J1Yl9tZW1tb3ZlIChpcC5icC5icF92ZW5kLCByZmMxNTMzX2Nvb2tpZSwgc2l6ZW9mIHJmYzE1MzNfY29va2llKTsKKyAgZ3J1Yl9tZW1tb3ZlIChpcC5icC5icF92ZW5kICsgc2l6ZW9mIHJmYzE1MzNfY29va2llLCBkaGNwZGlzY292ZXIsCisJCXNpemVvZiBkaGNwZGlzY292ZXIpOworICBncnViX21lbW1vdmUgKGlwLmJwLmJwX3ZlbmQgKyBzaXplb2YgcmZjMTUzM19jb29raWUgKyBzaXplb2YgZGhjcGRpc2NvdmVyLAorCQlyZmMxNTMzX2VuZCwgc2l6ZW9mIHJmYzE1MzNfZW5kKTsKKyNlbmRpZiAvKiAhIE5PX0RIQ1BfU1VQUE9SVCAqLworCisgIGZvciAocmV0cnkgPSAwOyByZXRyeSA8IE1BWF9CT09UUF9SRVRSSUVTOykKKyAgICB7CisgICAgICBsb25nIHRpbWVvdXQ7CisKKyNpZmRlZiBERUJVRworICAgICAgZ3J1Yl9wcmludGYgKCJyZXRyeSA9ICVkXG4iLCByZXRyeSk7CisjZW5kaWYKKyAgICAgIAorICAgICAgLyogQ2xlYXIgb3V0IHRoZSBSeCBxdWV1ZSBmaXJzdC4gIEl0IGNvbnRhaW5zIG5vdGhpbmcgb2YKKyAgICAgICAqIGludGVyZXN0LCBleGNlcHQgcG9zc2libHkgQVJQIHJlcXVlc3RzIGZyb20gdGhlIERIQ1AvVEZUUAorICAgICAgICogc2VydmVyLiAgV2UgdXNlIHBvbGxpbmcgdGhyb3VnaG91dCBFdGhlcmJvb3QsIHNvIHNvbWUgdGltZQorICAgICAgICogbWF5IGhhdmUgcGFzc2VkIHNpbmNlIHdlIGxhc3QgcG9sbGVkIHRoZSByZWNlaXZlIHF1ZXVlLAorICAgICAgICogd2hpY2ggbWF5IG5vdyBiZSBmaWxsZWQgd2l0aCBicm9hZGNhc3QgcGFja2V0cy4gIFRoaXMgd2lsbAorICAgICAgICogY2F1c2UgdGhlIHJlcGx5IHRvIHRoZSBwYWNrZXRzIHdlIGFyZSBhYm91dCB0byBzZW5kIHRvIGJlCisgICAgICAgKiBsb3N0IGltbWVkaWF0ZWx5LiAgTm90IHZlcnkgY2xldmVyLiAgKi8KKyAgICAgIGF3YWl0X3JlcGx5IChBV0FJVF9RRFJBSU4sIDAsIE5VTEwsIDApOworCisgICAgICB1ZHBfdHJhbnNtaXQgKElQX0JST0FEQ0FTVCwgQk9PVFBfQ0xJRU5ULCBCT09UUF9TRVJWRVIsCisJCSAgICBzaXplb2YgKHN0cnVjdCBib290cGlwX3QpLCAmaXApOworICAgICAgdGltZW91dCA9IHJmYzIxMzFfc2xlZXBfaW50ZXJ2YWwgKFRJTUVPVVQsIHJldHJ5KyspOworI2lmZGVmIE5PX0RIQ1BfU1VQUE9SVAorICAgICAgaWYgKGF3YWl0X3JlcGx5IChBV0FJVF9CT09UUCwgMCwgTlVMTCwgdGltZW91dCkpCisJeworCSAgbmV0d29ya19yZWFkeSA9IDE7CisJICByZXR1cm4gMTsKKwl9CisjZWxzZSAvKiAhIE5PX0RIQ1BfU1VQUE9SVCAqLworICAgICAgaWYgKGF3YWl0X3JlcGx5IChBV0FJVF9CT09UUCwgMCwgTlVMTCwgdGltZW91dCkpCisJeworCSAgaWYgKGRoY3BfcmVwbHkgIT0gREhDUE9GRkVSKQorCSAgICB7CisJICAgICAgbmV0d29ya19yZWFkeSA9IDE7CisJICAgICAgcmV0dXJuIDE7CisJICAgIH0KKworCSAgZGhjcF9yZXBseSA9IDA7CisjaWZkZWYgREVCVUcKKyAgZXRoZXJib290X3ByaW50ZiAoImJwX29wID0gJWRcbiIsIChpbnQpIGlwLmJwLmJwX29wKTsKKyAgZXRoZXJib290X3ByaW50ZiAoImJwX2h0eXBlID0gJWRcbiIsIChpbnQpIGlwLmJwLmJwX2h0eXBlKTsKKyAgZXRoZXJib290X3ByaW50ZiAoImJwX2hsZW4gPSAlZFxuIiwgKGludCkgaXAuYnAuYnBfaGxlbik7CisgIGV0aGVyYm9vdF9wcmludGYgKCJicF94aWQgPSAlZFxuIiwgKGludCkgaXAuYnAuYnBfeGlkKTsKKyAgZXRoZXJib290X3ByaW50ZiAoImJwX2h3YWRkciA9ICUhXG4iLCBpcC5icC5icF9od2FkZHIpOworICBldGhlcmJvb3RfcHJpbnRmICgiYnBfaG9wcyA9ICVkXG4iLCAoaW50KSBpcC5icC5icF9ob3BzKTsKKyAgZXRoZXJib290X3ByaW50ZiAoImJwX3NlY3MgPSAlZFxuIiwgKGludCkgaXAuYnAuYnBfaHdhZGRyKTsKKyNlbmRpZgorCSAgZ3J1Yl9tZW1tb3ZlIChpcC5icC5icF92ZW5kLCByZmMxNTMzX2Nvb2tpZSwgc2l6ZW9mIHJmYzE1MzNfY29va2llKTsKKwkgIGdydWJfbWVtbW92ZSAoaXAuYnAuYnBfdmVuZCArIHNpemVvZiByZmMxNTMzX2Nvb2tpZSwKKwkJCWRoY3ByZXF1ZXN0LCBzaXplb2YgZGhjcHJlcXVlc3QpOworCSAgZ3J1Yl9tZW1tb3ZlIChpcC5icC5icF92ZW5kICsgc2l6ZW9mIHJmYzE1MzNfY29va2llCisJCQkrIHNpemVvZiBkaGNwcmVxdWVzdCwKKwkJCXJmYzE1MzNfZW5kLCBzaXplb2YgcmZjMTUzM19lbmQpOworCSAgZ3J1Yl9tZW1tb3ZlIChpcC5icC5icF92ZW5kICsgOSwgKGNoYXIgKikgJmRoY3Bfc2VydmVyLAorCQkJc2l6ZW9mIChpbl9hZGRyKSk7CisJICBncnViX21lbW1vdmUgKGlwLmJwLmJwX3ZlbmQgKyAxNSwgKGNoYXIgKikgJmRoY3BfYWRkciwKKwkJCXNpemVvZiAoaW5fYWRkcikpOworI2lmZGVmIERFQlVHCisJICBncnViX3ByaW50ZiAoImVycm51bSA9ICVkXG4iLCBlcnJudW0pOworI2VuZGlmCisJICBmb3IgKHJlcXJldHJ5ID0gMDsgcmVxcmV0cnkgPCBNQVhfQk9PVFBfUkVUUklFUzspCisJICAgIHsKKwkgICAgICBpbnQgcmV0OworI2lmZGVmIERFQlVHCisJICAgICAgZ3J1Yl9wcmludGYgKCJyZXFyZXRyeSA9ICVkXG4iLCByZXFyZXRyeSk7CisjZW5kaWYKKwkgICAgICAKKwkgICAgICByZXQgPSB1ZHBfdHJhbnNtaXQgKElQX0JST0FEQ0FTVCwgQk9PVFBfQ0xJRU5ULCBCT09UUF9TRVJWRVIsCisJCQkJICBzaXplb2YgKHN0cnVjdCBib290cGlwX3QpLCAmaXApOworCSAgICAgIGlmICghIHJldCkKKwkJZ3J1Yl9wcmludGYgKCJ1ZHBfdHJhbnNtaXQgZmFpbGVkLlxuIik7CisJICAgICAgCisJICAgICAgZGhjcF9yZXBseSA9IDA7CisJICAgICAgdGltZW91dCA9IHJmYzIxMzFfc2xlZXBfaW50ZXJ2YWwgKFRJTUVPVVQsIHJlcXJldHJ5KyspOworCSAgICAgIGlmIChhd2FpdF9yZXBseSAoQVdBSVRfQk9PVFAsIDAsIE5VTEwsIHRpbWVvdXQpKQorCQlpZiAoZGhjcF9yZXBseSA9PSBESENQQUNLKQorCQkgIHsKKwkJICAgIG5ldHdvcmtfcmVhZHkgPSAxOworCQkgICAgcmV0dXJuIDE7CisJCSAgfQorCisjaWZkZWYgREVCVUcKKwkgICAgICBncnViX3ByaW50ZiAoImRoY3BfcmVwbHkgPSAlZFxuIiwgZGhjcF9yZXBseSk7CisjZW5kaWYKKwkgICAgICAKKwkgICAgICBpZiAoaXBfYWJvcnQpCisJCXJldHVybiAwOworCSAgICB9CisJfQorI2VuZGlmIC8qICEgTk9fREhDUF9TVVBQT1JUICovCisgICAgICAKKyAgICAgIGlmIChpcF9hYm9ydCkKKwlyZXR1cm4gMDsKKyAgICAgIAorICAgICAgaXAuYnAuYnBfc2VjcyA9IGh0b25zICgoY3VycnRpY2tzICgpIC0gc3RhcnR0aW1lKSAvIFRJQ0tTX1BFUl9TRUMpOworICAgIH0KKworICAvKiBUaW1lb3V0LiAgKi8KKyAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVURQQ0hLU1VNIC0gQ2hlY2tzdW0gVURQIFBhY2tldCAob25lIG9mIHRoZSByYXJlIGNhc2VzIHdoZW4gYXNzZW1ibHkgaXMKKyAgICAgICAgICAgIGFjdHVhbGx5IHNpbXBsZXIuLi4pCisgUkVUVVJOUzogY2hlY2tzdW0sIDAgb24gY2hlY2tzdW0gZXJyb3IuIFRoaXMKKyAgICAgICAgICBhbGxvd3MgZm9yIHVzaW5nIHRoZSBzYW1lIHJvdXRpbmUgZm9yIFJYIGFuZCBUWCBzdW1taW5nOgorICAgICAgICAgIFJYICBpZiAocGFja2V0LT51ZHAuY2hrc3VtICYmIHVkcGNoa3N1bShwYWNrZXQpKQorICAgICAgICAgICAgICAgICAgZXJyb3IoImNoZWNrc3VtIGVycm9yIik7CisgICAgICAgICAgVFggIHBhY2tldC0+dWRwLmNoa3N1bT0wOworICAgICAgICAgICAgICBpZiAoMD09KHBhY2tldC0+dWRwLmNoa3N1bT11ZHBjaGtzdW0ocGFja2V0KSkpCisgICAgICAgICAgICAgICAgICBwYWNrZXQtPnVwZC5jaGtzdW09MHhmZmZmOworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQKK2Rvc3VtICh1bnNpZ25lZCBzaG9ydCAqc3RhcnQsIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIHNob3J0ICpzdW0pCit7CisgIF9fYXNtX18gX192b2xhdGlsZV9fCisgICAgKCJjbGNcbiIKKyAgICAgIjE6XHRsb2Rzd1xuXHQiCisgICAgICJ4Y2hnICUlYWwsJSVhaFxuXHQiCS8qIGNvbnZlcnQgdG8gaG9zdCBieXRlIG9yZGVyICovCisgICAgICJhZGN3ICUlYXgsJTBcblx0IgkJLyogYWRkIGNhcnJ5IG9mIHByZXZpb3VzIGl0ZXJhdGlvbiAqLworICAgICAibG9vcCAxYlxuXHQiCisgICAgICJhZGN3ICQwLCUwIgkJLyogYWRkIGNhcnJ5IG9mIGxhc3QgaXRlcmF0aW9uICovCisgICAgIDogIj1iIiAoKnN1bSksICI9UyIoc3RhcnQpLCAiPWMiKGxlbikKKyAgICAgOiAiMCIoKnN1bSksICIxIihzdGFydCksICIyIihsZW4pCisgICAgIDogImF4IiwgImNjIgorICAgICApOworfQorCisvKiBVRFAgc3VtOgorICogcHJvdG8sIHNyY19pcCwgZHN0X2lwLCB1ZHBfZHBvcnQsIHVkcF9zcG9ydCwgMip1ZHBfbGVuLCBwYXlsb2FkCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAordWRwY2hrc3VtIChzdHJ1Y3QgaXBoZHIgKnBhY2tldCkKK3sKKyAgaW50IGxlbiA9IG50b2hzIChwYWNrZXQtPmxlbik7CisgIHVuc2lnbmVkIHNob3J0IHJ2YWw7CisgIAorICAvKiBhZGQgdWRwbGVuZ3RoICsgcHJvdG9jb2wgbnVtYmVyICovCisgIHJ2YWwgPSAobGVuIC0gc2l6ZW9mIChzdHJ1Y3QgaXBoZHIpKSArIElQX1VEUDsKKyAgCisgIC8qIHBhZCB0byBhbiBldmVuIG51bWJlciBvZiBieXRlcyAqLworICBpZiAobGVuICUgMikgeworICAgICgoY2hhciAqKSBwYWNrZXQpW2xlbisrXSA9IDA7CisgIH0KKyAgCisgIC8qIHN1bSBvdmVyIHNyYy9kc3QgaXBhZGRyICsgdWRwIHBhY2tldCAqLworICBsZW4gLT0gKGNoYXIgKikgJnBhY2tldC0+c3JjIC0gKGNoYXIgKikgcGFja2V0OworICBkb3N1bSAoKHVuc2lnbmVkIHNob3J0ICopICZwYWNrZXQtPnNyYywgbGVuID4+IDEsICZydmFsKTsKKyAgCisgIC8qIHRha2Ugb25lJ3MgY29tcGxlbWVudCAqLworICByZXR1cm4gfnJ2YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQVdBSVRfUkVQTFkgLSBXYWl0IHVudGlsIHdlIGdldCBhIHJlc3BvbnNlIGZvciBvdXIgcmVxdWVzdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgCithd2FpdF9yZXBseSAoaW50IHR5cGUsIGludCBpdmFsLCB2b2lkICpwdHIsIGludCB0aW1lb3V0KQoreworICB1bnNpZ25lZCBsb25nIHRpbWU7CisgIHN0cnVjdCBpcGhkciAqaXA7CisgIHN0cnVjdCB1ZHBoZHIgKnVkcDsKKyAgc3RydWN0IGFycHJlcXVlc3QgKmFycHJlcGx5OworICBzdHJ1Y3QgYm9vdHBfdCAqYm9vdHByZXBseTsKKyAgdW5zaWduZWQgc2hvcnQgcHR5cGU7CisgIHVuc2lnbmVkIGludCBwcm90b2hkcmxlbiA9IChFVEhfSExFTiArIHNpemVvZiAoc3RydWN0IGlwaGRyKQorCQkJICAgICAgKyBzaXplb2YgKHN0cnVjdCB1ZHBoZHIpKTsKKworICAvKiBDbGVhciB0aGUgYWJvcnQgZmxhZy4gICovCisgIGlwX2Fib3J0ID0gMDsKKyAgCisgIHRpbWUgPSB0aW1lb3V0ICsgY3VycnRpY2tzICgpOworICAvKiBUaGUgdGltZW91dCBjaGVjayBpcyBkb25lIGJlbG93LiAgVGhlIHRpbWVvdXQgaXMgb25seSBjaGVja2VkIGlmCisgICAqIHRoZXJlIGlzIG5vIHBhY2tldCBpbiB0aGUgUnggcXVldWUuICBUaGlzIGFzc3VtZXMgdGhhdCBldGhfcG9sbCgpCisgICAqIG5lZWRzIGEgbmVnbGlnaWJsZSBhbW91bnQgb2YgdGltZS4gICovCisgIGZvciAoOzspCisgICAgeworICAgICAgaWYgKGV0aF9wb2xsICgpKQorCXsKKwkgIC8qIFdlIGhhdmUgc29tZXRoaW5nISAgKi8KKwkgIAorCSAgLyogQ2hlY2sgZm9yIEFSUCAtIE5vIElQIGhkci4gICovCisJICBpZiAobmljLnBhY2tldGxlbiA+PSBFVEhfSExFTikKKwkgICAgeworCSAgICAgIHB0eXBlID0gKCgodW5zaWduZWQgc2hvcnQpIG5pYy5wYWNrZXRbMTJdKSA8PCA4CisJCSAgICAgICB8ICgodW5zaWduZWQgc2hvcnQpIG5pYy5wYWNrZXRbMTNdKSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgLyogV2hhdCBlbHNlIGNvdWxkIHdlIGRvIHdpdGggaXQ/ICAqLworCSAgICBjb250aW51ZTsKKwkgIAorCSAgaWYgKG5pYy5wYWNrZXRsZW4gPj0gRVRIX0hMRU4gKyBzaXplb2YgKHN0cnVjdCBhcnByZXF1ZXN0KQorCSAgICAgICYmIHB0eXBlID09IEFSUCkKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIGxvbmcgdG1wOworCisJICAgICAgYXJwcmVwbHkgPSAoc3RydWN0IGFycHJlcXVlc3QgKikgJm5pYy5wYWNrZXRbRVRIX0hMRU5dOworCSAgICAgIAorCSAgICAgIGlmIChhcnByZXBseS0+b3Bjb2RlID09IGh0b25zIChBUlBfUkVQTFkpCisJCSAgJiYgISBncnViX21lbWNtcCAoYXJwcmVwbHktPnNpcGFkZHIsIHB0ciwgc2l6ZW9mIChpbl9hZGRyKSkKKwkJICAmJiB0eXBlID09IEFXQUlUX0FSUCkKKwkJeworCQkgIGdydWJfbWVtbW92ZSAoKGNoYXIgKikgYXJwdGFibGVbaXZhbF0ubm9kZSwKKwkJCQlhcnByZXBseS0+c2h3YWRkciwKKwkJCQlFVEhfQUxFTik7CisJCSAgcmV0dXJuIDE7CisJCX0KKwkgICAgICAKKwkgICAgICBncnViX21lbW1vdmUgKChjaGFyICopICZ0bXAsIGFycHJlcGx5LT50aXBhZGRyLAorCQkJICAgIHNpemVvZiAoaW5fYWRkcikpOworCSAgICAgIAorCSAgICAgIGlmIChhcnByZXBseS0+b3Bjb2RlID09IGh0b25zIChBUlBfUkVRVUVTVCkKKwkJICAmJiB0bXAgPT0gYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyLnNfYWRkcikKKwkJeworCQkgIGFycHJlcGx5LT5vcGNvZGUgPSBodG9ucyAoQVJQX1JFUExZKTsKKwkJICBncnViX21lbW1vdmUgKGFycHJlcGx5LT50aXBhZGRyLCBhcnByZXBseS0+c2lwYWRkciwKKwkJCQlzaXplb2YgKGluX2FkZHIpKTsKKwkJICBncnViX21lbW1vdmUgKGFycHJlcGx5LT50aHdhZGRyLCAoY2hhciAqKSBhcnByZXBseS0+c2h3YWRkciwKKwkJCQlFVEhfQUxFTik7CisJCSAgZ3J1Yl9tZW1tb3ZlIChhcnByZXBseS0+c2lwYWRkciwKKwkJCQkoY2hhciAqKSAmYXJwdGFibGVbQVJQX0NMSUVOVF0uaXBhZGRyLAorCQkJCXNpemVvZiAoaW5fYWRkcikpOworCQkgIGdydWJfbWVtbW92ZSAoYXJwcmVwbHktPnNod2FkZHIsCisJCQkJYXJwdGFibGVbQVJQX0NMSUVOVF0ubm9kZSwKKwkJCQlFVEhfQUxFTik7CisJCSAgZXRoX3RyYW5zbWl0IChhcnByZXBseS0+dGh3YWRkciwgQVJQLAorCQkJCXNpemVvZiAoc3RydWN0IGFycHJlcXVlc3QpLAorCQkJCWFycHJlcGx5KTsKKyNpZmRlZiBNREVCVUcKKwkJICBncnViX21lbW1vdmUgKCZ0bXAsIGFycHJlcGx5LT50aXBhZGRyLCBzaXplb2YgKGluX2FkZHIpKTsKKwkJICBldGhlcmJvb3RfcHJpbnRmICgiU2VudCBBUlAgcmVwbHkgdG86ICVAXG4iLCB0bXApOworI2VuZGlmCS8qIE1ERUJVRyAqLworCQl9CisJICAgICAgCisJICAgICAgY29udGludWU7CisJICAgIH0KKworCSAgaWYgKHR5cGUgPT0gQVdBSVRfUURSQUlOKQorCSAgICBjb250aW51ZTsKKwkgIAorCSAgLyogQ2hlY2sgZm9yIFJBUlAgLSBObyBJUCBoZHIuICAqLworCSAgaWYgKHR5cGUgPT0gQVdBSVRfUkFSUAorCSAgICAgICYmIG5pYy5wYWNrZXRsZW4gPj0gRVRIX0hMRU4gKyBzaXplb2YgKHN0cnVjdCBhcnByZXF1ZXN0KQorCSAgICAgICYmIHB0eXBlID09IFJBUlApCisJICAgIHsKKwkgICAgICBhcnByZXBseSA9IChzdHJ1Y3QgYXJwcmVxdWVzdCAqKSAmbmljLnBhY2tldFtFVEhfSExFTl07CisJICAgICAgCisJICAgICAgaWYgKGFycHJlcGx5LT5vcGNvZGUgPT0gaHRvbnMgKFJBUlBfUkVQTFkpCisJCSAgJiYgISBncnViX21lbWNtcCAoYXJwcmVwbHktPnRod2FkZHIsIHB0ciwgRVRIX0FMRU4pKQorCQl7CisJCSAgZ3J1Yl9tZW1tb3ZlICgoY2hhciAqKSBhcnB0YWJsZVtBUlBfU0VSVkVSXS5ub2RlLAorCQkJCWFycHJlcGx5LT5zaHdhZGRyLCBFVEhfQUxFTik7CisJCSAgZ3J1Yl9tZW1tb3ZlICgoY2hhciAqKSAmYXJwdGFibGVbQVJQX1NFUlZFUl0uaXBhZGRyLAorCQkJCWFycHJlcGx5LT5zaXBhZGRyLCBzaXplb2YgKGluX2FkZHIpKTsKKwkJICBncnViX21lbW1vdmUgKChjaGFyICopICZhcnB0YWJsZVtBUlBfQ0xJRU5UXS5pcGFkZHIsCisJCQkJYXJwcmVwbHktPnRpcGFkZHIsIHNpemVvZiAoaW5fYWRkcikpOworCQkgIHJldHVybiAxOworCQl9CisJICAgICAgCisJICAgICAgY29udGludWU7CisJICAgIH0KKworCSAgLyogQW55dGhpbmcgZWxzZSBoYXMgSVAgaGVhZGVyLiAgKi8KKwkgIGlmIChuaWMucGFja2V0bGVuIDwgcHJvdG9oZHJsZW4gfHwgcHR5cGUgIT0gSVApCisJICAgIGNvbnRpbnVlOworCSAgCisJICBpcCA9IChzdHJ1Y3QgaXBoZHIgKikgJm5pYy5wYWNrZXRbRVRIX0hMRU5dOworCSAgaWYgKGlwLT52ZXJoZHJsZW4gIT0gMHg0NQorCSAgICAgIHx8IGlwY2hrc3VtICgodW5zaWduZWQgc2hvcnQgKikgaXAsIHNpemVvZiAoc3RydWN0IGlwaGRyKSkKKwkgICAgICB8fCBpcC0+cHJvdG9jb2wgIT0gSVBfVURQKQorCSAgICBjb250aW51ZTsKKwkgIAorCSAgLyoKKwkgICAgLSBUaWxsIFN0cmF1bWFubiA8VGlsbC5TdHJhdW1hbm5AVFUtQmVybGluLmRlPgorCSAgICBhZGRlZCB1ZHAgY2hlY2tzdW0gKHNhZmVyIG9uIGEgd2lyZWxlc3MgbGluaykKKwkgICAgYWRkZWQgZnJhZ21lbnRhdGlvbiBjaGVjazogSSBoYWQgYSBjb3JydXB0ZWQgaW1hZ2UKKwkgICAgaW4gbWVtb3J5IGR1ZSB0byBmcmFnbWVudGVkIFRGVFAgcGFja2V0cyAtIHRvb2sgbWUKKwkgICAgMyBkYXlzIHRvIGZpbmQgdGhlIGNhdXNlIGZvciB0aGlzIDotKAorCSAgKi8KKwkgIAorCSAgLyogSWYgTW9yZSBGcmFnbWVudHMgYml0IGFuZCBGcmFnbWVudCBPZmZzZXQgZmllbGQKKwkgICAgIGFyZSBub24temVybyB0aGVuIHBhY2tldCBpcyBmcmFnbWVudGVkICovCisJICBpZiAoaXAtPmZyYWdzICYgaHRvbnMoMHgzRkZGKSkKKwkgICAgeworCSAgICAgIGdydWJfcHJpbnRmICgiQUxFUlQ6IGdvdCBhIGZyYWdtZW50ZWQgcGFja2V0IC0gcmVjb25maWd1cmUgeW91ciBzZXJ2ZXJcbiIpOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICAKKwkgIHVkcCA9IChzdHJ1Y3QgdWRwaGRyICopICZuaWMucGFja2V0WyhFVEhfSExFTgorCQkJCQkgICAgICAgKyBzaXplb2YgKHN0cnVjdCBpcGhkcikpXTsKKwkgIGlmICh1ZHAtPmNoa3N1bSAmJiB1ZHBjaGtzdW0gKGlwKSkKKwkgICAgeworCSAgICAgIGdydWJfcHJpbnRmICgiVURQIGNoZWNrc3VtIGVycm9yXG4iKTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgCisJICAvKiBCT09UUCA/ICAqLworCSAgYm9vdHByZXBseSA9IChzdHJ1Y3QgYm9vdHBfdCAqKQorCSAgICAmbmljLnBhY2tldFsoRVRIX0hMRU4gKyBzaXplb2YgKHN0cnVjdCBpcGhkcikKKwkJCSArIHNpemVvZiAoc3RydWN0IHVkcGhkcikpXTsKKwkgIGlmICh0eXBlID09IEFXQUlUX0JPT1RQCisjaWZkZWYgTk9fREhDUF9TVVBQT1JUCisJICAgICAgJiYgKG5pYy5wYWNrZXRsZW4KKwkJICA+PSAoRVRIX0hMRU4gKyBzaXplb2YgKHN0cnVjdCBib290cF90KSAtIEJPT1RQX1ZFTkRPUl9MRU4pKQorI2Vsc2UKKwkgICAgICAmJiAobmljLnBhY2tldGxlbgorCQkgID49IChFVEhfSExFTiArIHNpemVvZiAoc3RydWN0IGJvb3RwX3QpIC0gREhDUF9PUFRfTEVOKSkKKyNlbmRpZiAvKiAhIE5PX0RIQ1BfU1VQUE9SVCAqLworCSAgICAgICYmIHVkcC0+ZGVzdCA9PSBodG9ucyAoQk9PVFBfQ0xJRU5UKQorCSAgICAgICYmIGJvb3RwcmVwbHktPmJwX29wID09IEJPT1RQX1JFUExZCisJICAgICAgJiYgYm9vdHByZXBseS0+YnBfeGlkID09IHhpZAorCSAgICAgICYmICghIGdydWJfbWVtY21wIChicm9hZGNhc3QsIGJvb3RwcmVwbHktPmJwX2h3YWRkciwgRVRIX0FMRU4pCisJCSAgfHwgISBncnViX21lbWNtcCAoYXJwdGFibGVbQVJQX0NMSUVOVF0ubm9kZSwKKwkJCQkgICAgYm9vdHByZXBseS0+YnBfaHdhZGRyLCBFVEhfQUxFTikpKQorCSAgICB7CisjaWZkZWYgREVCVUcKKwkgICAgICBncnViX3ByaW50ZiAoIkJPT1RQIHBhY2tldCB3YXMgcmVjZWl2ZWQuXG4iKTsKKyNlbmRpZgorCSAgICAgIGFycHRhYmxlW0FSUF9DTElFTlRdLmlwYWRkci5zX2FkZHIKKwkJPSBib290cHJlcGx5LT5icF95aWFkZHIuc19hZGRyOworI2lmbmRlZglOT19ESENQX1NVUFBPUlQKKwkgICAgICBkaGNwX2FkZHIuc19hZGRyID0gYm9vdHByZXBseS0+YnBfeWlhZGRyLnNfYWRkcjsKKyNpZmRlZiBERUJVRworCSAgICAgIGV0aGVyYm9vdF9wcmludGYgKCJkaGNwX2FkZHIgPSAlQFxuIiwgZGhjcF9hZGRyLnNfYWRkcik7CisjZW5kaWYKKyNlbmRpZiAvKiAhIE5PX0RIQ1BfU1VQUE9SVCAqLworCSAgICAgIG5ldG1hc2sgPSBkZWZhdWx0X25ldG1hc2sgKCk7CisJICAgICAgYXJwdGFibGVbQVJQX1NFUlZFUl0uaXBhZGRyLnNfYWRkcgorCQk9IGJvb3RwcmVwbHktPmJwX3NpYWRkci5zX2FkZHI7CisJICAgICAgLyogS2lsbCBhcnAuICAqLworCSAgICAgIGdydWJfbWVtc2V0IChhcnB0YWJsZVtBUlBfU0VSVkVSXS5ub2RlLCAwLCBFVEhfQUxFTik7CisJICAgICAgYXJwdGFibGVbQVJQX0dBVEVXQVldLmlwYWRkci5zX2FkZHIKKwkJPSBib290cHJlcGx5LT5icF9naWFkZHIuc19hZGRyOworCSAgICAgIC8qIEtpbGwgYXJwLiAgKi8KKwkgICAgICBncnViX21lbXNldCAoYXJwdGFibGVbQVJQX0dBVEVXQVldLm5vZGUsIDAsIEVUSF9BTEVOKTsKKworCSAgICAgIGdydWJfbWVtbW92ZSAoKGNoYXIgKikgQk9PVFBfREFUQV9BRERSLCAoY2hhciAqKSBib290cHJlcGx5LAorCQkJICAgIHNpemVvZiAoc3RydWN0IGJvb3RwZF90KSk7CisjaWZkZWYgTk9fREhDUF9TVVBQT1JUCisJICAgICAgZGVjb2RlX3JmYzE1MzMgKEJPT1RQX0RBVEFfQUREUi0+Ym9vdHBfcmVwbHkuYnBfdmVuZCwKKwkJCSAgICAgIDAsIEJPT1RQX1ZFTkRPUl9MRU4gKyBNQVhfQk9PVFBfRVhUTEVOLCAxKTsKKyNlbHNlCisJICAgICAgZGVjb2RlX3JmYzE1MzMgKEJPT1RQX0RBVEFfQUREUi0+Ym9vdHBfcmVwbHkuYnBfdmVuZCwKKwkJCSAgICAgIDAsIERIQ1BfT1BUX0xFTiArIE1BWF9CT09UUF9FWFRMRU4sIDEpOworI2VuZGlmIC8qICEgTk9fREhDUF9TVVBQT1JUICovCisJICAgICAgCisJICAgICAgcmV0dXJuIDE7CisJICAgIH0KKwkgIAorCSAgLyogVEZUUCA/ICovCisJICBpZiAodHlwZSA9PSBBV0FJVF9URlRQICYmIG50b2hzICh1ZHAtPmRlc3QpID09IGl2YWwpCisJICAgIHJldHVybiAxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBDaGVjayBmb3IgYWJvcnQga2V5IG9ubHkgaWYgdGhlIFJ4IHF1ZXVlIGlzIGVtcHR5IC0KKwkgICAqIGFzIGxvbmcgYXMgd2UgaGF2ZSBzb21ldGhpbmcgdG8gcHJvY2VzcywgZG9uJ3QKKwkgICAqIGFzc3VtZSB0aGF0IHNvbWV0aGluZyBmYWlsZWQuICBJdCBpcyB1bmxpa2VseSB0aGF0CisJICAgKiB3ZSBoYXZlIG5vIHByb2Nlc3NpbmcgdGltZSBsZWZ0IGJldHdlZW4gcGFja2V0cy4gICovCisJICBpZiAoY2hlY2trZXkgKCkgIT0gLTEgJiYgQVNDSUlfQ0hBUiAoZ2V0a2V5ICgpKSA9PSBDVFJMX0MpCisJICAgIHsKKwkgICAgICBpcF9hYm9ydCA9IDE7CisJICAgICAgcmV0dXJuIDA7CisJICAgIH0KKwkgIAorCSAgLyogRG8gdGhlIHRpbWVvdXQgYWZ0ZXIgYXQgbGVhc3QgYSBmdWxsIHF1ZXVlIHdhbGsuICAqLworCSAgaWYgKCh0aW1lb3V0ID09IDApIHx8IChjdXJydGlja3MoKSA+IHRpbWUpKQorCSAgICB7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorICAKKyAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVDT0RFX1JGQzE1MzMgLSBEZWNvZGVzIFJGQzE1MzMgaGVhZGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorZGVjb2RlX3JmYzE1MzMgKHVuc2lnbmVkIGNoYXIgKnAsIGludCBibG9jaywgaW50IGxlbiwgaW50IGVvZikKK3sKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgKmV4dGRhdGEgPSBOVUxMLCAqZXh0ZW5kID0gTlVMTDsKKyAgdW5zaWduZWQgY2hhciAqZXh0cGF0aCA9IE5VTEw7CisgIHVuc2lnbmVkIGNoYXIgKmVuZHA7CisgIAorICBpZiAoYmxvY2sgPT0gMCkKKyAgICB7CisgICAgICBlbmRfb2ZfcmZjMTUzMyA9IE5VTEw7CisgICAgICB2ZW5kb3JleHRfaXN2YWxpZCA9IDA7CisgICAgICAKKyAgICAgIGlmIChncnViX21lbWNtcCAocCwgcmZjMTUzM19jb29raWUsIDQpKQorCS8qIG5vIFJGQyAxNTMzIGhlYWRlciBmb3VuZCAqLworCXJldHVybiAwOworICAgICAgCisgICAgICBwICs9IDQ7CisgICAgICBlbmRwID0gcCArIGxlbjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoYmxvY2sgPT0gMSkKKwl7CisJICBpZiAoZ3J1Yl9tZW1jbXAgKHAsIHJmYzE1MzNfY29va2llLCA0KSkKKwkgICAgLyogbm8gUkZDIDE1MzMgaGVhZGVyIGZvdW5kICovCisJICAgIHJldHVybiAwOworCSAgCisJICBwICs9IDQ7CisJICBsZW4gLT0gNDsKKwl9CisgICAgICAKKyAgICAgIGlmIChleHRlbmQgKyBsZW4KKwkgIDw9ICgodW5zaWduZWQgY2hhciAqKQorCSAgICAgICYoQk9PVFBfREFUQV9BRERSLT5ib290cF9leHRlbnNpb25bTUFYX0JPT1RQX0VYVExFTl0pKSkKKwl7CisJICBncnViX21lbW1vdmUgKGV4dGVuZCwgcCwgbGVuKTsKKwkgIGV4dGVuZCArPSBsZW47CisJfQorICAgICAgZWxzZQorCXsKKwkgIGdydWJfcHJpbnRmICgiT3ZlcmZsb3cgaW4gdmVuZG9yIGRhdGEgYnVmZmVyISBBYm9ydGluZy4uLlxuIik7CisJICAqZXh0ZGF0YSA9IFJGQzE1MzNfRU5EOworCSAgcmV0dXJuIDA7CisJfQorICAgICAgCisgICAgICBwID0gZXh0ZGF0YTsKKyAgICAgIGVuZHAgPSBleHRlbmQ7CisgICAgfQorCisgIGlmICghIGVvZikKKyAgICByZXR1cm4gLTE7CisgIAorICB3aGlsZSAocCA8IGVuZHApCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciBjID0gKnA7CisgICAgICAKKyAgICAgIGlmIChjID09IFJGQzE1MzNfUEFEKQorCXsKKwkgIHArKzsKKwkgIGNvbnRpbnVlOworCX0KKyAgICAgIGVsc2UgaWYgKGMgPT0gUkZDMTUzM19FTkQpCisJeworCSAgZW5kX29mX3JmYzE1MzMgPSBlbmRwID0gcDsKKwkgIGNvbnRpbnVlOworCX0KKyAgICAgIGVsc2UgaWYgKGMgPT0gUkZDMTUzM19ORVRNQVNLKQorCXsKKwkgIGdydWJfbWVtbW92ZSAoKGNoYXIgKikgJm5ldG1hc2ssIHAgKyAyLCBzaXplb2YgKGluX2FkZHIpKTsKKwl9CisgICAgICBlbHNlIGlmIChjID09IFJGQzE1MzNfR0FURVdBWSkKKwl7CisJICAvKiBUaGlzIGlzIGEgbGl0dGxlIHNpbXBsaXN0aWMsIGJ1dCBpdCB3aWxsCisJICAgICB1c3VhbGx5IGJlIHN1ZmZpY2llbnQuCisJICAgICBUYWtlIG9ubHkgdGhlIGZpcnN0IGVudHJ5LiAgKi8KKwkgIGlmIChUQUdfTEVOIChwKSA+PSBzaXplb2YgKGluX2FkZHIpKQorCSAgICBncnViX21lbW1vdmUgKChjaGFyICopICZhcnB0YWJsZVtBUlBfR0FURVdBWV0uaXBhZGRyLCBwICsgMiwKKwkJCSAgc2l6ZW9mIChpbl9hZGRyKSk7CisJfQorICAgICAgZWxzZSBpZiAoYyA9PSBSRkMxNTMzX0VYVEVOU0lPTlBBVEgpCisJZXh0cGF0aCA9IHA7CisjaWZuZGVmCU5PX0RIQ1BfU1VQUE9SVAorICAgICAgZWxzZSBpZiAoYyA9PSBSRkMyMTMyX01TR19UWVBFKQorCXsKKwkgIGRoY3BfcmVwbHkgPSAqKHAgKyAyKTsKKwl9CisgICAgICBlbHNlIGlmIChjID09IFJGQzIxMzJfU1JWX0lEKQorCXsKKwkgIGdydWJfbWVtbW92ZSAoKGNoYXIgKikgJmRoY3Bfc2VydmVyLCBwICsgMiwgc2l6ZW9mIChpbl9hZGRyKSk7CisjaWZkZWYgREVCVUcKKwkgIGV0aGVyYm9vdF9wcmludGYgKCJkaGNwX3NlcnZlciA9ICVAXG4iLCBkaGNwX3NlcnZlci5zX2FkZHIpOworI2VuZGlmCisJfQorI2VuZGlmIC8qICEgTk9fREhDUF9TVVBQT1JUICovCisgICAgICBlbHNlIGlmIChjID09IFJGQzE1MzNfVkVORE9SX01BR0lDCisJICAgICAgICYmIFRBR19MRU4ocCkgPj0gNgorCSAgICAgICAmJiAhIGdydWJfbWVtY21wIChwICsgMiwgdmVuZG9yZXh0X21hZ2ljLCA0KQorCSAgICAgICAmJiBwWzZdID09IFJGQzE1MzNfVkVORE9SX01BSk9SKQorCXZlbmRvcmV4dF9pc3ZhbGlkKys7CisgICAgICAvKiBHUlVCIG5vdyBoYW5kbGVzIGl0cyBvd24gdGFnLiBHZXQgdGhlIG5hbWUgb2YgYSBjb25maWd1cmF0aW9uCisJIGZpbGUgZnJvbSB0aGUgbmV0d29yay4gQ29vbC4uLiAgKi8KKyAgICAgIGVsc2UgaWYgKGMgPT0gUkZDMTUzM19WRU5ET1JfQ09ORklHRklMRSkKKwl7CisJICBpbnQgbCA9IFRBR19MRU4gKHApOworCSAgCisJICAvKiBFbGltaW5hdGUgdGhlIHRyYWlsaW5nIE5VTHMgYWNjb3JkaW5nIHRvIFJGQyAyMTMyLiAgKi8KKwkgIHdoaWxlICgqKHAgKyAyICsgbCAtIDEpID09ICdcMDAwJyAmJiBsID4gMCkKKwkgICAgbC0tOworCSAgCisJICAvKiBYWFg6IFNob3VsZCBjaGVjayBpZiBMRU4gaXMgbGVzcyB0aGFuIHRoZSBtYXhpbXVtIGxlbmd0aAorCSAgICAgb2YgQ09ORklHX0ZJTEUuIFRoaXMga2luZCBvZiByb2J1c3RuZXNzIHdpbGwgYmUgYSBnb2FsCisJICAgICBpbiBHUlVCIDEuMC4gICovCisJICBncnViX21lbW1vdmUgKGNvbmZpZ19maWxlLCBwICsgMiwgbCk7CisJICBjb25maWdfZmlsZVtsXSA9IDA7CisJfQorICAgICAgCisgICAgICBwICs9IFRBR19MRU4gKHApICsgMjsKKyAgICB9CisgIAorICBleHRkYXRhID0gZXh0ZW5kID0gZW5kcDsKKyAgCisgIC8qIFBlcmhhcHMgd2UgY2FuIGVsaW1pbmF0ZSB0aGlzIGJlY2F1c2Ugd2UgZG9lc24ndCByZXF1aXJlIHNvCisgICAgIG11Y2ggaW5mb3JtYXRpb24sIGJ1dCBJIGxlYXZlIHRoaXMgYWxvbmUuICAqLworICBpZiAoYmxvY2sgPT0gMCAmJiBleHRwYXRoICE9IE5VTEwpCisgICAgeworICAgICAgY2hhciBmbmFtZVs2NF07CisgICAgICBpbnQgZm5hbWVsZW4gPSBUQUdfTEVOIChleHRwYXRoKTsKKyAgICAgIAorICAgICAgd2hpbGUgKCooZXh0cGF0aCArIDIgKyBmbmFtZWxlbiAtIDEpID09ICdcMDAwJyAmJiBmbmFtZWxlbiA+IDApCisJZm5hbWVsZW4tLTsKKyAgICAgIAorICAgICAgaWYgKGZuYW1lbGVuICsgMSA+IHNpemVvZiAoZm5hbWUpKQorCXsKKwkgIGdydWJfcHJpbnRmICgiVG9vIGxvbmcgZmlsZSBuYW1lIGZvciBFeHRlbnNpb25zIFBhdGhcbiIpOworCSAgcmV0dXJuIDA7CisJfQorICAgICAgZWxzZSBpZiAoISBmbmFtZWxlbikKKwl7CisJICBncnViX3ByaW50ZiAoIkVtcHR5IGZpbGUgbmFtZSBmb3IgRXh0ZW5zaW9ucyBQYXRoXG4iKTsKKwkgIHJldHVybiAwOworCX0KKyAgICAgIAorICAgICAgZ3J1Yl9tZW1tb3ZlIChmbmFtZSwgZXh0cGF0aCArIDIsIGZuYW1lbGVuKTsKKyAgICAgIGZuYW1lW2ZuYW1lbGVuXSA9ICdcMDAwJzsKKyAgICAgIGdydWJfcHJpbnRmICgiTG9hZGluZyBCT09UUC1leHRlbnNpb24gZmlsZTogJXNcbiIsIGZuYW1lKTsKKyAgICAgIHRmdHAgKGZuYW1lLCBkZWNvZGVfcmZjMTUzMyk7CisgICAgfQorICAKKyAgLyogUHJvY2VlZCB3aXRoIG5leHQgYmxvY2suICAqLworICByZXR1cm4gLTE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorSVBDSEtTVU0gLSBDaGVja3N1bSBJUCBIZWFkZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IAoraXBjaGtzdW0gKHVuc2lnbmVkIHNob3J0ICppcCwgaW50IGxlbikKK3sKKyAgdW5zaWduZWQgbG9uZyBzdW0gPSAwOworICBsZW4gPj49IDE7CisgIHdoaWxlIChsZW4tLSkKKyAgICB7CisgICAgICBzdW0gKz0gKihpcCsrKTsKKyAgICAgIGlmIChzdW0gPiAweEZGRkYpCisJc3VtIC09IDB4RkZGRjsKKyAgICB9CisgIHJldHVybiAofnN1bSkgJiAweDAwMDBGRkZGOworfQorCisjZGVmaW5lIFRXT19TRUNPTkRfRElWSVNPUiAoMjE0NzQ4MzY0N2wvVElDS1NfUEVSX1NFQykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRkMyMTMxX1NMRUVQX0lOVEVSVkFMIC0gc2xlZXAgZm9yIGV4cG90ZW50aWFsbHkgbG9uZ2VyIHRpbWVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2xvbmcKK3JmYzIxMzFfc2xlZXBfaW50ZXJ2YWwgKGludCBiYXNlLCBpbnQgZXhwKQoreworICBzdGF0aWMgbG9uZyBzZWVkID0gMDsKKyAgbG9uZyBxOworICB1bnNpZ25lZCBsb25nIHRtbzsKKyAgCisjaWZkZWYgQkFDS09GRl9MSU1JVAorICBpZiAoZXhwID4gQkFDS09GRl9MSU1JVCkKKyAgICBleHAgPSBCQUNLT0ZGX0xJTUlUOworI2VuZGlmCisgIGlmICghc2VlZCkKKyAgICAvKiBJbml0aWFsaXplIGxpbmVhciBjb25ncnVlbnRpYWwgZ2VuZXJhdG9yICovCisgICAgc2VlZCA9IChjdXJydGlja3MgKCkgKyAqKChsb25nICopICZhcnB0YWJsZVtBUlBfQ0xJRU5UXS5ub2RlKQorCSAgICArICgoc2hvcnQgKikgYXJwdGFibGVbQVJQX0NMSUVOVF0ubm9kZSlbMl0pOworICAvKiBzaW1wbGlmaWVkIHZlcnNpb24gb2YgdGhlIExDRyBnaXZlbiBpbiBCcnVjZSBTY2huZWllcidzCisgICAgICJBcHBsaWVkIENyeXB0b2dyYXBoeSIgKi8KKyAgcSA9IHNlZWQgLyA1MzY2ODsKKyAgaWYgKChzZWVkID0gNDAwMTQgKiAoc2VlZCAtIDUzNjY4ICogcSkgLSAxMjIxMSAqcSApIDwgMCkKKyAgICBzZWVkICs9IDIxNDc0ODM1NjNMOworICB0bW8gPSAoYmFzZSA8PCBleHApICsgKFRJQ0tTX1BFUl9TRUMgLSAoc2VlZCAvIFRXT19TRUNPTkRfRElWSVNPUikpOworICByZXR1cm4gdG1vOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NMRUFOVVAgLSBzaHV0IGRvd24gbmV0d29ya2luZworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitjbGVhbnVwX25ldCAodm9pZCkKK3sKKyAgaWYgKG5ldHdvcmtfcmVhZHkpCisgICAgeworICAgICAgLyogU3RvcCByZWNlaXZpbmcgcGFja2V0cy4gICovCisgICAgICBldGhfZGlzYWJsZSAoKTsKKyAgICAgIG5ldHdvcmtfcmVhZHkgPSAwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL25ldGJvb3QvbWlzYy5jIGIvbmV0Ym9vdC9taXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg2MTRmZAotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvbWlzYy5jCkBAIC0wLDAgKzEsMjY2IEBACisvKgorICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSwyMDAyICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qIEJhc2VkIG9uICJzcmMvbWlzYy5jIiBpbiBldGhlcmJvb3QtNS4wLjUuICAqLworCisjZGVmaW5lIEdSVUIJMQorI2luY2x1ZGUgPGV0aGVyYm9vdC5oPgorCit2b2lkCitzbGVlcCAoaW50IHNlY3MpCit7CisgIHVuc2lnbmVkIGxvbmcgdG1vID0gY3VycnRpY2tzICgpICsgc2VjczsKKworICB3aGlsZSAoY3VycnRpY2tzICgpIDwgdG1vKQorICAgIDsKK30KKwordm9pZAordHdpZGRsZSAodm9pZCkKK3sKKyAgc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdHRpY2tzID0gMDsKKyAgc3RhdGljIGludCBjb3VudCA9IDA7CisgIHN0YXRpYyBjb25zdCBjaGFyIHRpZGRsZXNbXT0iLVxcfC8iOworICB1bnNpZ25lZCBsb25nIHRpY2tzOworCisgIGlmIChkZWJ1ZykKKyAgICB7CisgICAgICBpZiAoKHRpY2tzID0gY3VycnRpY2tzICgpKSA9PSBsYXN0dGlja3MpCisJcmV0dXJuOworICAgICAgCisgICAgICBsYXN0dGlja3MgPSB0aWNrczsKKyAgICAgIGdydWJfcHV0Y2hhciAodGlkZGxlc1soY291bnQrKykgJiAzXSk7CisgICAgICBncnViX3B1dGNoYXIgKCdcYicpOworICAgIH0KK30KKworLyogQmVjYXVzZSBFdGhlcmJvb3QgdXNlcyBpdHMgb3duIGZvcm1hdHMgZm9yIHRoZSBwcmludGYgZmFtaWx5LAorICAgZGVmaW5lIHNlcGFyYXRlIGRlZmluaXRpb25zIGZyb20gR1JVQi4gICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BSSU5URiBhbmQgZnJpZW5kcworCisJRm9ybWF0czoKKwkJJVsjXXgJLSA0IGJ5dGVzIGxvbmcgKDggaGV4IGRpZ2l0cywgbG93ZXIgY2FzZSkKKwkJJVsjXVgJLSA0IGJ5dGVzIGxvbmcgKDggaGV4IGRpZ2l0cywgdXBwZXIgY2FzZSkKKwkJJVsjXWh4CS0gMiBieXRlcyBpbnQgKDQgaGV4IGRpZ2l0cywgbG93ZXIgY2FzZSkKKwkJJVsjXWhYCS0gMiBieXRlcyBpbnQgKDQgaGV4IGRpZ2l0cywgdXBwZXIgY2FzZSkKKwkJJVsjXWhoeAktIDEgYnl0ZSBpbnQgKDIgaGV4IGRpZ2l0cywgbG93ZXIgY2FzZSkKKwkJJVsjXWhoWAktIDEgYnl0ZSBpbnQgKDIgaGV4IGRpZ2l0cywgdXBwZXIgY2FzZSkKKwkJCS0gb3B0aW9uYWwgIyBwcmVmaXhlcyAweCBvciAwWAorCQklZAktIGRlY2ltYWwgaW50CisJCSVjCS0gY2hhcgorCQklcwktIHN0cmluZworCQklQAktIEludGVybmV0IGFkZHJlc3MgaW4gZGRkLmRkZC5kZGQuZGRkIG5vdGF0aW9uCisJCSUhCS0gRXRoZXJuZXQgYWRkcmVzcyBpbiB4eDp4eDp4eDp4eDp4eDp4eCBub3RhdGlvbgorCU5vdGU6IHdpZHRoIHNwZWNpZmljYXRpb24gbm90IHN1cHBvcnRlZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitldGhlcmJvb3RfdnNwcmludGYgKGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqZm10LCBjb25zdCBpbnQgKmRwKQoreworICBjaGFyICpwLCAqczsKKyAgCisgIHMgPSBidWY7CisgIGZvciAoIDsgKmZtdCAhPSAnXDAnOyArK2ZtdCkKKyAgICB7CisgICAgICBpZiAoKmZtdCAhPSAnJScpCisJeworCSAgYnVmID8gKnMrKyA9ICpmbXQgOiBncnViX3B1dGNoYXIgKCpmbXQpOworCSAgY29udGludWU7CisJfQorICAgICAgCisgICAgICBpZiAoKisrZm10ID09ICdzJykKKwl7CisJICBmb3IgKHAgPSAoY2hhciAqKSAqZHArKzsgKnAgIT0gJ1wwJzsgcCsrKQorCSAgICBidWYgPyAqcysrID0gKnAgOiBncnViX3B1dGNoYXIgKCpwKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogTGVuZ3RoIG9mIGl0ZW0gaXMgYm91bmRlZCAqLworCSAgY2hhciB0bXBbMjBdLCAqcSA9IHRtcDsKKwkgIGludCBhbHQgPSAwOworCSAgaW50IHNoaWZ0ID0gMjg7CisJICAKKwkgIGlmICgqZm10ID09ICcjJykKKwkgICAgeworCSAgICAgIGFsdCA9IDE7CisJICAgICAgZm10Kys7CisJICAgIH0KKwkgIAorCSAgaWYgKCpmbXQgPT0gJ2gnKQorCSAgICB7CisJICAgICAgc2hpZnQgPSAxMjsKKwkgICAgICBmbXQrKzsKKwkgICAgfQorCSAgCisJICBpZiAoKmZtdCA9PSAnaCcpCisJICAgIHsKKwkgICAgICBzaGlmdCA9IDQ7CisJICAgICAgZm10Kys7CisJICAgIH0KKwkgIAorCSAgLyoKKwkgICAqIEJlZm9yZSBlYWNoIGZvcm1hdCBxIHBvaW50cyB0byB0bXAgYnVmZmVyCisJICAgKiBBZnRlciBlYWNoIGZvcm1hdCBxIHBvaW50cyBwYXN0IGVuZCBvZiBpdGVtCisJICAgKi8KKwkgIGlmICgoKmZtdCB8IDB4MjApID09ICd4JykKKwkgICAgeworCSAgICAgIC8qIFdpdGggeDg2IGdjYywgc2l6ZW9mKGxvbmcpID09IHNpemVvZihpbnQpICovCisJICAgICAgY29uc3QgbG9uZyAqbHAgPSAoY29uc3QgbG9uZyAqKSBkcDsKKwkgICAgICBsb25nIGggPSAqbHArKzsKKwkgICAgICBpbnQgbmNhc2UgPSAoKmZtdCAmIDB4MjApOworCSAgICAgIAorCSAgICAgIGRwID0gKGNvbnN0IGludCAqKSBscDsKKwkgICAgICBpZiAoYWx0KQorCQl7CisJCSAgKnErKyA9ICcwJzsKKwkJICAqcSsrID0gJ1gnIHwgbmNhc2U7CisJCX0KKwkgICAgICBmb3IgKDsgc2hpZnQgPj0gMDsgc2hpZnQgLT0gNCkKKwkJKnErKyA9ICIwMTIzNDU2Nzg5QUJDREVGIlsoaCA+PiBzaGlmdCkgJiAweEZdIHwgbmNhc2U7CisJICAgIH0KKwkgIGVsc2UgaWYgKCpmbXQgPT0gJ2QnKQorCSAgICB7CisJICAgICAgaW50IGkgPSAqZHArKzsKKwkgICAgICBjaGFyICpyOworCSAgICAgIAorCSAgICAgIGlmIChpIDwgMCkKKwkJeworCQkgICpxKysgPSAnLSc7CisJCSAgaSA9IC1pOworCQl9CisJICAgICAgCisJICAgICAgcCA9IHE7CQkvKiBzYXZlIGJlZ2lubmluZyBvZiBkaWdpdHMgKi8KKwkgICAgICBkbworCQl7CisJCSAgKnErKyA9ICcwJyArIChpICUgMTApOworCQkgIGkgLz0gMTA7CisJCX0KKwkgICAgICB3aGlsZSAoaSk7CisJICAgICAgCisJICAgICAgLyogcmV2ZXJzZSBkaWdpdHMsIHN0b3AgaW4gbWlkZGxlICovCisJICAgICAgciA9IHE7CQkvKiBkb24ndCBhbHRlciBxICovCisJICAgICAgd2hpbGUgKC0tciA+IHApCisJCXsKKwkJICBpID0gKnI7CisJCSAgKnIgPSAqcDsKKwkJICAqcCsrID0gaTsKKwkJfQorCSAgICB9CisJICBlbHNlIGlmICgqZm10ID09ICdAJykKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIGNoYXIgKnI7CisJICAgICAgdW5pb24KKwkgICAgICB7CisJCWxvbmcJCWw7CisJCXVuc2lnbmVkIGNoYXIJY1s0XTsKKwkgICAgICB9CisJICAgICAgdTsKKwkgICAgICBjb25zdCBsb25nICpscCA9IChjb25zdCBsb25nICopIGRwOworCSAgICAgIAorCSAgICAgIHUubCA9ICpscCsrOworCSAgICAgIGRwID0gKGNvbnN0IGludCAqKSBscDsKKwkgICAgICAKKwkgICAgICBmb3IgKHIgPSAmdS5jWzBdOyByIDwgJnUuY1s0XTsgKytyKQorCQlxICs9IGV0aGVyYm9vdF9zcHJpbnRmIChxLCAiJWQuIiwgKnIpOworCSAgICAgIAorCSAgICAgIC0tcTsKKwkgICAgfQorCSAgZWxzZSBpZiAoKmZtdCA9PSAnIScpCisJICAgIHsKKwkgICAgICBjaGFyICpyOworCSAgICAgIHAgPSAoY2hhciAqKSAqZHArKzsKKwkgICAgICAKKwkgICAgICBmb3IgKHIgPSBwICsgRVRIX0FMRU47IHAgPCByOyArK3ApCisJCXEgKz0gZXRoZXJib290X3NwcmludGYgKHEsICIlaGhYOiIsICpwKTsKKwkgICAgICAKKwkgICAgICAtLXE7CisJICAgIH0KKwkgIGVsc2UgaWYgKCpmbXQgPT0gJ2MnKQorCSAgICAqcSsrID0gKmRwKys7CisJICBlbHNlCisJICAgICpxKysgPSAqZm10OworCSAgCisJICAvKiBub3cgb3V0cHV0IHRoZSBzYXZlZCBzdHJpbmcgKi8KKwkgIGZvciAocCA9IHRtcDsgcCA8IHE7ICsrcCkKKwkgICAgYnVmID8gKnMrKyA9ICpwIDogZ3J1Yl9wdXRjaGFyICgqcCk7CisJfQorICAgIH0KKyAgCisgIGlmIChidWYpCisgICAgKnMgPSAnXDAnOworICAKKyAgcmV0dXJuIChzIC0gYnVmKTsKK30KKworaW50CitldGhlcmJvb3Rfc3ByaW50ZiAoY2hhciAqYnVmLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgcmV0dXJuIGV0aGVyYm9vdF92c3ByaW50ZiAoYnVmLCBmbXQsICgoY29uc3QgaW50ICopICZmbXQpICsgMSk7Cit9CisKK3ZvaWQKK2V0aGVyYm9vdF9wcmludGYgKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAodm9pZCkgZXRoZXJib290X3ZzcHJpbnRmICgwLCBmbXQsICgoY29uc3QgaW50ICopICZmbXQpICsgMSk7Cit9CisKK2ludAoraW5ldF9hdG9uIChjaGFyICpwLCBpbl9hZGRyICphZGRyKQoreworICB1bnNpZ25lZCBsb25nIGlwID0gMDsKKyAgaW50IHZhbDsKKyAgaW50IGk7CisgIAorICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHsKKyAgICAgIHZhbCA9IGdldGRlYyAoJnApOworICAgICAgCisgICAgICBpZiAodmFsIDwgMCB8fCB2YWwgPiAyNTUpCisJcmV0dXJuIDA7CisgICAgICAKKyAgICAgIGlmIChpICE9IDMgJiYgKnArKyAhPSAnLicpCisJcmV0dXJuIDA7CisgICAgICAKKyAgICAgIGlwID0gKGlwIDw8IDgpIHwgdmFsOworICAgIH0KKworICBhZGRyLT5zX2FkZHIgPSBodG9ubCAoaXApOworCisgIHJldHVybiAxOworfQorCitpbnQKK2dldGRlYyAoY2hhciAqKnB0cikKK3sKKyAgY2hhciAqcCA9ICpwdHI7CisgIGludCByZXQgPSAwOworICAKKyAgaWYgKCpwIDwgJzAnIHx8ICpwID4gJzknKQorICAgIHJldHVybiAtMTsKKyAgCisgIHdoaWxlICgqcCA+PSAnMCcgJiYgKnAgPD0gJzknKQorICAgIHsKKyAgICAgIHJldCA9IHJldCAqIDEwICsgKCpwIC0gJzAnKTsKKyAgICAgIHArKzsKKyAgICB9CisgIAorICAqcHRyID0gcDsKKyAgCisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9uZXRib290L25hdHNlbWkuYyBiL25ldGJvb3QvbmF0c2VtaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZmY0MmQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L25hdHNlbWkuYwpAQCAtMCwwICsxLDczOSBAQAorLyogLSotIE1vZGU6QzsgYy1iYXNpYy1vZmZzZXQ6NDsgLSotICovCisKKy8qIAorICAgbmF0c2VtaS5jOiBBbiBFdGhlcmJvb3QgZHJpdmVyIGZvciB0aGUgTmF0U2VtaSBEUDgzODF4IHNlcmllcy4KKworICAgQ29weXJpZ2h0IChDKSAyMDAxIEVudGl0eSBDeWJlciwgSW5jLgorICAgCisgICBUaGlzIGRldmVsb3BtZW50IG9mIHRoaXMgRXRoZXJib290IGRyaXZlciB3YXMgZnVuZGVkIGJ5IAorICAgCisgICAgICBTaWNvbSBTeXN0ZW1zOiBodHRwOi8vd3d3LnNpY29tcG9zLmNvbS8KKyAgIAorICAgQXV0aG9yOiBNYXJ0eSBDb25ub3IgKG1kY0B0aGluZ3Vpbi5vcmcpCSAgIAorICAgQWRhcHRlZCBmcm9tIGEgTGludXggZHJpdmVyIHdoaWNoIHdhcyB3cml0dGVuIGJ5IERvbmFsZCBCZWNrZXIKKyAgIAorICAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICAgb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSAoR1BMKSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgICAKKyAgIE9yaWdpbmFsIENvcHlyaWdodCBOb3RpY2U6CisgICAKKyAgIFdyaXR0ZW4vY29weXJpZ2h0IDE5OTktMjAwMSBieSBEb25hbGQgQmVja2VyLgorICAgCisgICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisgICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICAgRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcyBjb2RlIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdAorICAgcmV0YWluIHRoZSBhdXRob3JzaGlwLCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2Ugbm90aWNlLiAgVGhpcyBmaWxlIGlzIG5vdAorICAgYSBjb21wbGV0ZSBwcm9ncmFtIGFuZCBtYXkgb25seSBiZSB1c2VkIHdoZW4gdGhlIGVudGlyZSBvcGVyYXRpbmcKKyAgIHN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLiAgTGljZW5zZSBmb3IgdW5kZXIgb3RoZXIgdGVybXMgbWF5IGJlCisgICBhdmFpbGFibGUuICBDb250YWN0IHRoZSBvcmlnaW5hbCBhdXRob3IgZm9yIGRldGFpbHMuCisgICAKKyAgIFRoZSBvcmlnaW5hbCBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgYXQKKyAgIFNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorICAgNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKKyAgIEFubmFwb2xpcyBNRCAyMTQwMworICAgCisgICBTdXBwb3J0IGluZm9ybWF0aW9uIGFuZCB1cGRhdGVzIGF2YWlsYWJsZSBhdAorICAgaHR0cDovL3d3dy5zY3lsZC5jb20vbmV0d29yay9uZXRzZW1pLmh0bWwKKyAgIAorICAgUmVmZXJlbmNlczoKKyAgIAorICAgaHR0cDovL3d3dy5zY3lsZC5jb20vZXhwZXJ0LzEwMG1icHMuaHRtbAorICAgaHR0cDovL3d3dy5zY3lsZC5jb20vZXhwZXJ0L05XYXkuaHRtbAorICAgRGF0YXNoZWV0IGlzIGF2YWlsYWJsZSBmcm9tOgorICAgaHR0cDovL3d3dy5uYXRpb25hbC5jb20vcGYvRFAvRFA4MzgxNS5odG1sCisKKyovCisKKy8qIFJldmlzaW9uIEhpc3RvcnkgKi8KKworLyoKKyAgMjkgTWF5IDIwMDEgIG1kYyAgICAgMS4wCisgICAgIEluaXRpYWwgUmVsZWFzZS4gIFRlc3RlZCB3aXRoIE5ldGdlYXIgRkEzMTEgYW5kIEZBMzEyIGJvYXJkcworKi8MCisvKiBJbmNsdWRlcyAqLworCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisjaW5jbHVkZSAibmljLmgiCisjaW5jbHVkZSAicGNpLmgiCisjaW5jbHVkZSAiY2FyZHMuaCIKKworLyogZGVmaW5lcyAqLworCisjZGVmaW5lIE9XTiAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIERTSVpFICAgICAweDAwMDAwRkZGCisjZGVmaW5lIENSQ19TSVpFICA0CisKKy8qIFRpbWUgaW4gdGlja3MgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcuICovCisjZGVmaW5lIFRYX1RJTUVPVVQgICAgICAgKDQqVElDS1NfUEVSX1NFQykKKworI2RlZmluZSBUWF9CVUZfU0laRSAgICAxNTM2CisjZGVmaW5lIFJYX0JVRl9TSVpFICAgIDE1MzYKKworI2RlZmluZSBOVU1fUlhfREVTQyAgICA0ICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgUnggZGVzY3JpcHRvciByZWdpc3RlcnMuICovCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgdTg7Cit0eXBlZGVmICAgc2lnbmVkIGNoYXIgIHM4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1MTY7Cit0eXBlZGVmICAgc2lnbmVkIHNob3J0IHMxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgdTMyOwordHlwZWRlZiAgIHNpZ25lZCBpbnQgICBzMzI7CisKKy8qIGhlbHBmdWwgbWFjcm9lcyBpZiBvbiBhIGJpZ19lbmRpYW4gbWFjaGluZSBmb3IgY2hhbmdpbmcgYnl0ZSBvcmRlci4KKyAgIG5vdCBzdHJpY3RseSBuZWVkZWQgb24gSW50ZWwgKi8KKyNkZWZpbmUgbGUxNl90b19jcHUodmFsKSAodmFsKQorI2RlZmluZSBjcHVfdG9fbGUzMih2YWwpICh2YWwpCisjZGVmaW5lIGdldF91bmFsaWduZWQocHRyKSAoKihwdHIpKQorI2RlZmluZSBwdXRfdW5hbGlnbmVkKHZhbCwgcHRyKSAoKHZvaWQpKCAqKHB0cikgPSAodmFsKSApKQorI2RlZmluZSBnZXRfdTE2KHB0cikgKCoodTE2ICopKHB0cikpCisjZGVmaW5lIHZpcnRfdG9fYnVzKHgpICgodW5zaWduZWQgbG9uZyl4KQorI2RlZmluZSB2aXJ0X3RvX2xlMzJkZXNjKGFkZHIpICB2aXJ0X3RvX2J1cyhhZGRyKQorCitlbnVtIHBjaXN0dWZmIHsKKyAgICBQQ0lfVVNFU19JTyAgICAgPSAweDAxLAorICAgIFBDSV9VU0VTX01FTSAgICA9IDB4MDIsCisgICAgUENJX1VTRVNfTUFTVEVSID0gMHgwNCwKKyAgICBQQ0lfQUREUjAgICAgICAgPSAweDA4LAorICAgIFBDSV9BRERSMSAgICAgICA9IDB4MTAsCit9OworCisvKiBNTUlPIG9wZXJhdGlvbnMgcmVxdWlyZWQgKi8KKyNkZWZpbmUgUENJX0lPVFlQRSAoUENJX1VTRVNfTUFTVEVSIHwgUENJX1VTRVNfTUVNIHwgUENJX0FERFIxKQorCisvKiBPZmZzZXRzIHRvIHRoZSBkZXZpY2UgcmVnaXN0ZXJzLgorICAgVW5saWtlIHNvZnR3YXJlLW9ubHkgc3lzdGVtcywgZGV2aWNlIGRyaXZlcnMgaW50ZXJhY3Qgd2l0aCBjb21wbGV4IGhhcmR3YXJlLgorICAgSXQncyBub3QgdXNlZnVsIHRvIGRlZmluZSBzeW1ib2xpYyBuYW1lcyBmb3IgZXZlcnkgcmVnaXN0ZXIgYml0IGluIHRoZQorICAgZGV2aWNlLgorKi8KK2VudW0gcmVnaXN0ZXJfb2Zmc2V0cyB7CisgICAgQ2hpcENtZCAgICAgID0gMHgwMCwgCisgICAgQ2hpcENvbmZpZyAgID0gMHgwNCwgCisgICAgRUVDdHJsICAgICAgID0gMHgwOCwgCisgICAgUENJQnVzQ2ZnICAgID0gMHgwQywKKyAgICBJbnRyU3RhdHVzICAgPSAweDEwLCAKKyAgICBJbnRyTWFzayAgICAgPSAweDE0LCAKKyAgICBJbnRyRW5hYmxlICAgPSAweDE4LAorICAgIFR4UmluZ1B0ciAgICA9IDB4MjAsIAorICAgIFR4Q29uZmlnICAgICA9IDB4MjQsCisgICAgUnhSaW5nUHRyICAgID0gMHgzMCwKKyAgICBSeENvbmZpZyAgICAgPSAweDM0LCAKKyAgICBDbGtSdW4gICAgICAgPSAweDNDLAorICAgIFdPTENtZCAgICAgICA9IDB4NDAsIAorICAgIFBhdXNlQ21kICAgICA9IDB4NDQsCisgICAgUnhGaWx0ZXJBZGRyID0gMHg0OCwgCisgICAgUnhGaWx0ZXJEYXRhID0gMHg0QywKKyAgICBCb290Um9tQWRkciAgPSAweDUwLCAKKyAgICBCb290Um9tRGF0YSAgPSAweDU0LCAKKyAgICBTaWxpY29uUmV2ICAgPSAweDU4LCAKKyAgICBTdGF0c0N0cmwgICAgPSAweDVDLAorICAgIFN0YXRzRGF0YSAgICA9IDB4NjAsIAorICAgIFJ4UGt0RXJycyAgICA9IDB4NjAsIAorICAgIFJ4TWlzc2VkICAgICA9IDB4NjgsIAorICAgIFJ4Q1JDRXJycyAgICA9IDB4NjQsCisgICAgUENJUE0gICAgICAgID0gMHg0NCwKKyAgICBQaHlTdGF0dXMgICAgPSAweEMwLCAKKyAgICBNSW50ckN0cmwgICAgPSAweEM0LCAKKyAgICBNSW50clN0YXR1cyAgPSAweEM4LAorCisgICAgLyogVGhlc2UgYXJlIGZyb20gdGhlIHNwZWMsIGFyb3VuZCBwYWdlIDc4Li4uIG9uIGEgc2VwYXJhdGUgdGFibGUuICovCisgICAgUEdTRUwgICAgICAgID0gMHhDQywgCisgICAgUE1EQ1NSICAgICAgID0gMHhFNCwgCisgICAgVFNUREFUICAgICAgID0gMHhGQywgCisgICAgRFNQQ0ZHICAgICAgID0gMHhGNCwgCisgICAgU0RDRkcgICAgICAgID0gMHg4QworfTsKKworLyogQml0IGluIENoaXBDbWQuICovCitlbnVtIENoaXBDbWRCaXRzIHsKKyAgICBDaGlwUmVzZXQgPSAweDEwMCwgCisgICAgUnhSZXNldCAgID0gMHgyMCwgCisgICAgVHhSZXNldCAgID0gMHgxMCwgCisgICAgUnhPZmYgICAgID0gMHgwOCwgCisgICAgUnhPbiAgICAgID0gMHgwNCwKKyAgICBUeE9mZiAgICAgPSAweDAyLCAKKyAgICBUeE9uICAgICAgPSAweDAxCit9OworCisvKiBCaXRzIGluIHRoZSBSeE1vZGUgcmVnaXN0ZXIuICovCitlbnVtIHJ4X21vZGVfYml0cyB7CisgICAgQWNjZXB0RXJyICAgICAgICAgID0gMHgyMCwKKyAgICBBY2NlcHRSdW50ICAgICAgICAgPSAweDEwLAorICAgIEFjY2VwdEJyb2FkY2FzdCAgICA9IDB4QzAwMDAwMDAsCisgICAgQWNjZXB0TXVsdGljYXN0ICAgID0gMHgwMDIwMDAwMCwgCisgICAgQWNjZXB0QWxsTXVsdGljYXN0ID0gMHgyMDAwMDAwMCwKKyAgICBBY2NlcHRBbGxQaHlzICAgICAgPSAweDEwMDAwMDAwLCAKKyAgICBBY2NlcHRNeVBoeXMgICAgICAgPSAweDA4MDAwMDAwCit9OworCit0eXBlZGVmIHN0cnVjdCBfQnVmZmVyRGVzYyB7CisgICAgdTMyICAgICAgICAgICAgICBsaW5rOworICAgIHZvbGF0aWxlIHUzMiAgICAgY21kc3RzOworICAgIHUzMiAgICAgICAgICAgICAgYnVmcHRyOworICAgIHUzMgkJCQkgc29mdHdhcmVfdXNlOworfSBCdWZmZXJEZXNjOworCisvKiBCaXRzIGluIG5ldHdvcmtfZGVzYy5zdGF0dXMgKi8KK2VudW0gZGVzY19zdGF0dXNfYml0cyB7CisgICAgRGVzY093biAgID0gMHg4MDAwMDAwMCwgCisgICAgRGVzY01vcmUgID0gMHg0MDAwMDAwMCwgCisgICAgRGVzY0ludHIgID0gMHgyMDAwMDAwMCwKKyAgICBEZXNjTm9DUkMgPSAweDEwMDAwMDAwLAorICAgIERlc2NQa3RPSyA9IDB4MDgwMDAwMDAsIAorICAgIFJ4VG9vTG9uZyA9IDB4MDA0MDAwMDAKK307CisKKy8qIEdsb2JhbHMgKi8KKworc3RhdGljIGludCBuYXRzZW1pX2RlYnVnID0gMTsJCQkvKiAxIG5vcm1hbCBtZXNzYWdlcywgMCBxdWlldCAuLiA3IHZlcmJvc2UuICovCisKK2NvbnN0IGNoYXIgKm5pY19uYW1lOworCitzdGF0aWMgdTMyIFNhdmVkQ2xrUnVuOworCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB2ZW5kb3IsIGRldl9pZDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlvYWRkcjsKKworc3RhdGljIHVuc2lnbmVkIGludCBjdXJfcng7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWR2ZXJ0aXNpbmc7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnhfY29uZmlnOworc3RhdGljIHVuc2lnbmVkIGludCB0eF9jb25maWc7CisKKy8qIE5vdGU6IHRyYW5zbWl0IGFuZCByZWNlaXZlIGJ1ZmZlcnMgYW5kIGRlc2NyaXB0b3JzIG11c3QgYmUgCisgICBsb25nd29yZCBhbGlnbmVkIAorKi8KKworc3RhdGljIEJ1ZmZlckRlc2MgdHhkICAgICAgICAgICAgICBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg0KSkpOworc3RhdGljIEJ1ZmZlckRlc2MgcnhkW05VTV9SWF9ERVNDXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg0KSkpOworCisjaWZkZWYgVVNFX0xPV01FTV9CVUZGRVIKKyNkZWZpbmUgdHhiICgoY2hhciAqKTB4MTAwMDAgLSBUWF9CVUZfU0laRSkKKyNkZWZpbmUgcnhiICgoY2hhciAqKTB4MTAwMDAgLSBOVU1fUlhfREVTQypSWF9CVUZfU0laRSAtIFRYX0JVRl9TSVpFKQorI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHR4YltUWF9CVUZfU0laRV0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNCkpKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJ4YltOVU1fUlhfREVTQyAqIFJYX0JVRl9TSVpFXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg0KSkpOworI2VuZGlmCisKKy8qIEZ1bmN0aW9uIFByb3RvdHlwZXMgKi8KKworc3RydWN0IG5pYyAqbmF0c2VtaV9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICppb19hZGRycywgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSk7CitzdGF0aWMgaW50IGVlcHJvbV9yZWFkKGxvbmcgYWRkciwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyBpbnQgbWRpb19yZWFkKGludCBwaHlfaWQsIGludCBsb2NhdGlvbik7CitzdGF0aWMgdm9pZCBuYXRzZW1pX2luaXQoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyB2b2lkIG5hdHNlbWlfcmVzZXQoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyB2b2lkIG5hdHNlbWlfaW5pdF9yeGZpbHRlcihzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIHZvaWQgbmF0c2VtaV9pbml0X3R4ZChzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIHZvaWQgbmF0c2VtaV9pbml0X3J4ZChzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIHZvaWQgbmF0c2VtaV9zZXRfcnhfbW9kZShzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIHZvaWQgbmF0c2VtaV9jaGVja19kdXBsZXgoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyB2b2lkIG5hdHNlbWlfdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkLCB1bnNpZ25lZCBpbnQgdCwgdW5zaWduZWQgaW50IHMsIGNvbnN0IGNoYXIgKnApOworc3RhdGljIGludCAgbmF0c2VtaV9wb2xsKHN0cnVjdCBuaWMgKm5pYyk7CitzdGF0aWMgdm9pZCBuYXRzZW1pX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKTsKKworLyogCisgKiBGdW5jdGlvbjogbmF0c2VtaV9wcm9iZQorICoKKyAqIERlc2NyaXB0aW9uOiBSZXRyaWV2ZXMgdGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBjYXJkLCBhbmQgc2V0cyB1cCBzb21lCisgKiBnbG9iYWxzIHJlcXVpcmVkIGJ5IG90aGVyIHJvdXRpbmVzLCAgYW5kIGluaXRpYWxpemVzIHRoZSBOSUMsIG1ha2luZyBpdAorICogcmVhZHkgdG8gc2VuZCBhbmQgcmVjZWl2ZSBwYWNrZXRzLgorICoKKyAqIFNpZGUgZWZmZWN0czoKKyAqICAgICAgICAgICAgbGVhdmVzIHRoZSBpb2FkZHJlc3Mgb2YgdGhlIG5hdHNlbWkgY2hpcCBpbiB0aGUgdmFyaWFibGUgaW9hZGRyLgorICogICAgICAgICAgICBsZWF2ZXMgdGhlIG5hdHNlbWkgaW5pdGlhbGl6ZWQsIGFuZCByZWFkeSB0byByZWNpZXZlIHBhY2tldHMuCisgKgorICogUmV0dXJuczogICBzdHJ1Y3QgbmljICo6ICAgICAgICAgIHBvaW50ZXIgdG8gTklDIGRhdGEgc3RydWN0dXJlCisgKi8KKworc3RydWN0IG5pYyAqCituYXRzZW1pX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKmlvX2FkZHJzLCBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQoreworICAgIGludCBpOworICAgIGludCBwcmV2X2VlZGF0YTsKKyAgICB1MzIgdG1wOworCisgICAgaWYgKGlvX2FkZHJzID09IDAgfHwgKmlvX2FkZHJzID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogaW5pdGlhbGl6ZSBzb21lIGNvbW1vbmx5IHVzZWQgZ2xvYmFscyAqLworCQorICAgIGlvYWRkciAgICAgPSAqaW9fYWRkcnMgJiB+MzsKKyAgICB2ZW5kb3IgICAgID0gcGNpLT52ZW5kb3I7CisgICAgZGV2X2lkICAgICA9IHBjaS0+ZGV2X2lkOworICAgIG5pY19uYW1lICAgPSBwY2ktPm5hbWU7CisgICAgCisgICAgYWRqdXN0X3BjaV9kZXZpY2UocGNpKTsKKworICAgIC8qIG5hdHNlbWkgaGFzIGEgbm9uLXN0YW5kYXJkIFBNIGNvbnRyb2wgcmVnaXN0ZXIKKyAgICAgKiBpbiBQQ0kgY29uZmlnIHNwYWNlLiAgU29tZSBib2FyZHMgYXBwYXJlbnRseSBuZWVkCisgICAgICogdG8gYmUgYnJvdWdodCB0byBEMCBpbiB0aGlzIG1hbm5lci4KKyAgICAgKi8KKyAgICBwY2liaW9zX3JlYWRfY29uZmlnX2R3b3JkKHBjaS0+YnVzLCBwY2ktPmRldmZuLCBQQ0lQTSwgJnRtcCk7CisgICAgaWYgKHRtcCAmICgweDAzfDB4MTAwKSkgeworCS8qIEQwIHN0YXRlLCBkaXNhYmxlIFBNRSBhc3NlcnRpb24gKi8KKwl1MzIgbmV3dG1wID0gdG1wICYgfigweDAzfDB4MTAwKTsKKwlwY2liaW9zX3dyaXRlX2NvbmZpZ19kd29yZChwY2ktPmJ1cywgcGNpLT5kZXZmbiwgUENJUE0sIG5ld3RtcCk7CisgICAgfQorCisgICAgLyogZ2V0IE1BQyBhZGRyZXNzICovCisKKyAgICBwcmV2X2VlZGF0YSA9IGVlcHJvbV9yZWFkKGlvYWRkciwgNik7CisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCWludCBlZWRhdGEgPSBlZXByb21fcmVhZChpb2FkZHIsIGkgKyA3KTsKKwluaWMtPm5vZGVfYWRkcltpKjJdID0gKGVlZGF0YSA8PCAxKSArIChwcmV2X2VlZGF0YSA+PiAxNSk7CisJbmljLT5ub2RlX2FkZHJbaSoyKzFdID0gZWVkYXRhID4+IDc7CisJcHJldl9lZWRhdGEgPSBlZWRhdGE7CisgICAgfQorCisgICAgcHJpbnRmKCJcbm5hdHNlbWlfcHJvYmU6IE1BQyBhZGRyICUhIGF0IGlvYWRkciAlI2hYXG4iLAorICAgICAgICAgICBuaWMtPm5vZGVfYWRkciwgaW9hZGRyKTsKKyAgICBwcmludGYoIm5hdHNlbWlfcHJvYmU6IFZlbmRvcjolI2hYIERldmljZTolI2hYXG4iLCB2ZW5kb3IsIGRldl9pZCk7CisgICAgCisgICAgLyogUmVzZXQgdGhlIGNoaXAgdG8gZXJhc2UgYW55IHByZXZpb3VzIG1pc2NvbmZpZ3VyYXRpb24uICovCisgICAgb3V0bChDaGlwUmVzZXQsIGlvYWRkciArIENoaXBDbWQpOworCisgICAgYWR2ZXJ0aXNpbmcgPSBtZGlvX3JlYWQoMSwgNCk7CisgICAgeworCXUzMiBjaGlwX2NvbmZpZyA9IGlubChpb2FkZHIgKyBDaGlwQ29uZmlnKTsKKwlwcmludGYoIiVzOiBUcmFuc2NlaXZlciBkZWZhdWx0IGF1dG9uZWcuICVzICIKKwkgICAgICAgIjEwJXMgJXMgZHVwbGV4LlxuIiwKKwkgICAgICAgbmljX25hbWUsCisJICAgICAgIGNoaXBfY29uZmlnICYgMHgyMDAwID8gImVuYWJsZWQsIGFkdmVydGlzZSIgOiAiZGlzYWJsZWQsIGZvcmNlIiwKKwkgICAgICAgY2hpcF9jb25maWcgJiAweDQwMDAgPyAiMCIgOiAiIiwKKwkgICAgICAgY2hpcF9jb25maWcgJiAweDgwMDAgPyAiZnVsbCIgOiAiaGFsZiIpOworICAgIH0KKyAgICBwcmludGYoIiVzOiBUcmFuc2NlaXZlciBzdGF0dXMgJWhYIGFkdmVydGlzaW5nICVoWFxuIiwKKwkgICBuaWNfbmFtZSwgKGludClpbmwoaW9hZGRyICsgMHg4NCksIGFkdmVydGlzaW5nKTsKKworICAgIC8qIERpc2FibGUgUE1FOgorICAgICAqIFRoZSBQTUUgYml0IGlzIGluaXRpYWxpemVkIGZyb20gdGhlIEVFUFJPTSBjb250ZW50cy4KKyAgICAgKiBQQ0kgY2FyZHMgcHJvYmFibHkgaGF2ZSBQTUUgZGlzYWJsZWQsIGJ1dCBtb3RoZXJib2FyZAorICAgICAqIGltcGxlbWVudGF0aW9ucyBtYXkgaGF2ZSBQTUUgc2V0IHRvIGVuYWJsZSBXYWtlT25MYW4uIAorICAgICAqIFdpdGggUE1FIHNldCB0aGUgY2hpcCB3aWxsIHNjYW4gaW5jb21pbmcgcGFja2V0cyBidXQKKyAgICAgKiBub3RoaW5nIHdpbGwgYmUgd3JpdHRlbiB0byBtZW1vcnkuICovCisgICAgU2F2ZWRDbGtSdW4gPSBpbmwoaW9hZGRyICsgQ2xrUnVuKTsKKyAgICBvdXRsKFNhdmVkQ2xrUnVuICYgfjB4MTAwLCBpb2FkZHIgKyBDbGtSdW4pOworCisgICAgLyogaW5pdGlhbGl6ZSBkZXZpY2UgKi8KKyAgICBuYXRzZW1pX2luaXQobmljKTsKKworICAgIG5pYy0+cmVzZXQgICAgPSBuYXRzZW1pX2luaXQ7CisgICAgbmljLT5wb2xsICAgICA9IG5hdHNlbWlfcG9sbDsKKyAgICBuaWMtPnRyYW5zbWl0ID0gbmF0c2VtaV90cmFuc21pdDsKKyAgICBuaWMtPmRpc2FibGUgID0gbmF0c2VtaV9kaXNhYmxlOworCisgICAgcmV0dXJuIG5pYzsKK30KKworLyogUmVhZCB0aGUgRUVQUk9NIGFuZCBNSUkgTWFuYWdlbWVudCBEYXRhIEkvTyAoTURJTykgaW50ZXJmYWNlcy4KKyAgIFRoZSBFRVBST00gY29kZSBpcyBmb3IgdGhlIGNvbW1vbiA5M2MwNi80NiBFRVBST01zIHdpdGggNiBiaXQgYWRkcmVzc2VzLiAKKyovCisKKy8qIERlbGF5IGJldHdlZW4gRUVQUk9NIGNsb2NrIHRyYW5zaXRpb25zLgorICAgTm8gZXh0cmEgZGVsYXkgaXMgbmVlZGVkIHdpdGggMzNNaHogUENJLCBidXQgZnV0dXJlIDY2TWh6IGFjY2VzcyBtYXkgbmVlZAorICAgYSBkZWxheS4gKi8KKyNkZWZpbmUgZWVwcm9tX2RlbGF5KGVlX2FkZHIpCWlubChlZV9hZGRyKQorCitlbnVtIEVFUFJPTV9DdHJsX0JpdHMgeworICAgIEVFX1NoaWZ0Q2xrICAgPSAweDA0LCAKKyAgICBFRV9EYXRhSW4gICAgID0gMHgwMSwgCisgICAgRUVfQ2hpcFNlbGVjdCA9IDB4MDgsIAorICAgIEVFX0RhdGFPdXQgICAgPSAweDAyCit9OworCisjZGVmaW5lIEVFX1dyaXRlMCAoRUVfQ2hpcFNlbGVjdCkKKyNkZWZpbmUgRUVfV3JpdGUxIChFRV9DaGlwU2VsZWN0IHwgRUVfRGF0YUluKQorCisvKiBUaGUgRUVQUk9NIGNvbW1hbmRzIGluY2x1ZGUgdGhlIGFsd2F5LXNldCBsZWFkaW5nIGJpdC4gKi8KK2VudW0gRUVQUk9NX0NtZHMgeworICAgIEVFX1dyaXRlQ21kPSg1IDw8IDYpLCBFRV9SZWFkQ21kPSg2IDw8IDYpLCBFRV9FcmFzZUNtZD0oNyA8PCA2KSwKK307CisKK3N0YXRpYyBpbnQgZWVwcm9tX3JlYWQobG9uZyBhZGRyLCBpbnQgbG9jYXRpb24pCit7CisgICAgaW50IGk7CisgICAgaW50IHJldHZhbCA9IDA7CisgICAgaW50IGVlX2FkZHIgPSBhZGRyICsgRUVDdHJsOworICAgIGludCByZWFkX2NtZCA9IGxvY2F0aW9uIHwgRUVfUmVhZENtZDsKKyAgICBvdXRsKEVFX1dyaXRlMCwgZWVfYWRkcik7CisKKyAgICAvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kIGJpdHMgb3V0LiAqLworICAgIGZvciAoaSA9IDEwOyBpID49IDA7IGktLSkgeworCXNob3J0IGRhdGF2YWwgPSAocmVhZF9jbWQgJiAoMSA8PCBpKSkgPyBFRV9Xcml0ZTEgOiBFRV9Xcml0ZTA7CisJb3V0bChkYXRhdmFsLCBlZV9hZGRyKTsKKwllZXByb21fZGVsYXkoZWVfYWRkcik7CisJb3V0bChkYXRhdmFsIHwgRUVfU2hpZnRDbGssIGVlX2FkZHIpOworCWVlcHJvbV9kZWxheShlZV9hZGRyKTsKKyAgICB9CisgICAgb3V0bChFRV9DaGlwU2VsZWN0LCBlZV9hZGRyKTsKKyAgICBlZXByb21fZGVsYXkoZWVfYWRkcik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCW91dGwoRUVfQ2hpcFNlbGVjdCB8IEVFX1NoaWZ0Q2xrLCBlZV9hZGRyKTsKKwllZXByb21fZGVsYXkoZWVfYWRkcik7CisJcmV0dmFsIHw9IChpbmwoZWVfYWRkcikgJiBFRV9EYXRhT3V0KSA/IDEgPDwgaSA6IDA7CisJb3V0bChFRV9DaGlwU2VsZWN0LCBlZV9hZGRyKTsKKwllZXByb21fZGVsYXkoZWVfYWRkcik7CisgICAgfQorCisgICAgLyogVGVybWluYXRlIHRoZSBFRVBST00gYWNjZXNzLiAqLworICAgIG91dGwoRUVfV3JpdGUwLCBlZV9hZGRyKTsKKyAgICBvdXRsKDAsIGVlX2FkZHIpOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyogIE1JSSB0cmFuc2NlaXZlciBjb250cm9sIHNlY3Rpb24uCisJVGhlIDgzODE1IHNlcmllcyBoYXMgYW4gaW50ZXJuYWwgdHJhbnNjZWl2ZXIsIGFuZCB3ZSBwcmVzZW50IHRoZQorCW1hbmFnZW1lbnQgcmVnaXN0ZXJzIGFzIGlmIHRoZXkgd2VyZSBNSUkgY29ubmVjdGVkLiAqLworCitzdGF0aWMgaW50IG1kaW9fcmVhZChpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pCit7CisgICAgaWYgKHBoeV9pZCA9PSAxICYmIGxvY2F0aW9uIDwgMzIpCisJcmV0dXJuIGlubChpb2FkZHIgKyAweDgwICsgKGxvY2F0aW9uPDwyKSkgJiAweGZmZmY7CisgICAgZWxzZQorCXJldHVybiAweGZmZmY7Cit9CisKKy8qIEZ1bmN0aW9uOiBuYXRzZW1pX2luaXQKKyAqCisgKiBEZXNjcmlwdGlvbjogcmVzZXRzIHRoZSBldGhlcm5ldCBjb250cm9sbGVyIGNoaXAgYW5kIGNvbmZpZ3VyZXMKKyAqICAgIHJlZ2lzdGVycyBhbmQgZGF0YSBzdHJ1Y3R1cmVzIHJlcXVpcmVkIGZvciBzZW5kaW5nIGFuZCByZWNlaXZpbmcgcGFja2V0cy4KKyAqICAgIAorICogQXJndW1lbnRzOiBzdHJ1Y3QgbmljICpuaWM6ICAgICAgICAgIE5JQyBkYXRhIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnM6ICAgdm9pZC4KKyAqLworCitzdGF0aWMgdm9pZAorbmF0c2VtaV9pbml0KHN0cnVjdCBuaWMgKm5pYykKK3sKKyAgICBuYXRzZW1pX3Jlc2V0KG5pYyk7CisJCQorICAgIC8qIERpc2FibGUgUE1FOgorICAgICAqIFRoZSBQTUUgYml0IGlzIGluaXRpYWxpemVkIGZyb20gdGhlIEVFUFJPTSBjb250ZW50cy4KKyAgICAgKiBQQ0kgY2FyZHMgcHJvYmFibHkgaGF2ZSBQTUUgZGlzYWJsZWQsIGJ1dCBtb3RoZXJib2FyZAorICAgICAqIGltcGxlbWVudGF0aW9ucyBtYXkgaGF2ZSBQTUUgc2V0IHRvIGVuYWJsZSBXYWtlT25MYW4uIAorICAgICAqIFdpdGggUE1FIHNldCB0aGUgY2hpcCB3aWxsIHNjYW4gaW5jb21pbmcgcGFja2V0cyBidXQKKyAgICAgKiBub3RoaW5nIHdpbGwgYmUgd3JpdHRlbiB0byBtZW1vcnkuICovCisgICAgb3V0bChTYXZlZENsa1J1biAmIH4weDEwMCwgaW9hZGRyICsgQ2xrUnVuKTsKKworICAgIG5hdHNlbWlfaW5pdF9yeGZpbHRlcihuaWMpOworCisgICAgbmF0c2VtaV9pbml0X3R4ZChuaWMpOworICAgIG5hdHNlbWlfaW5pdF9yeGQobmljKTsKKworICAgIC8qIEluaXRpYWxpemUgb3RoZXIgcmVnaXN0ZXJzLiAqLworICAgIC8qIENvbmZpZ3VyZSB0aGUgUENJIGJ1cyBidXJzdHMgYW5kIEZJRk8gdGhyZXNob2xkcy4gKi8KKyAgICAvKiBDb25maWd1cmUgZm9yIHN0YW5kYXJkLCBpbi1zcGVjIEV0aGVybmV0LiAqLworICAgIGlmIChpbmwoaW9hZGRyICsgQ2hpcENvbmZpZykgJiAweDIwMDAwMDAwKSB7CS8qIEZ1bGwgZHVwbGV4ICovCisJdHhfY29uZmlnID0gMHhEMDgwMTAwMjsKKwlyeF9jb25maWcgPSAweDEwMDAwMDIwOworICAgIH0gZWxzZSB7CisJdHhfY29uZmlnID0gMHgxMDgwMTAwMjsKKwlyeF9jb25maWcgPSAweDAwMjA7CisgICAgfQorICAgIG91dGwodHhfY29uZmlnLCBpb2FkZHIgKyBUeENvbmZpZyk7CisgICAgb3V0bChyeF9jb25maWcsIGlvYWRkciArIFJ4Q29uZmlnKTsKKworICAgIG5hdHNlbWlfY2hlY2tfZHVwbGV4KG5pYyk7CisgICAgbmF0c2VtaV9zZXRfcnhfbW9kZShuaWMpOworCisgICAgb3V0bChSeE9uLCBpb2FkZHIgKyBDaGlwQ21kKTsKK30KKworLyogCisgKiBGdW5jdGlvbjogbmF0c2VtaV9yZXNldAorICoKKyAqIERlc2NyaXB0aW9uOiBzb2Z0IHJlc2V0cyB0aGUgY29udHJvbGxlciBjaGlwCisgKgorICogQXJndW1lbnRzOiBzdHJ1Y3QgbmljICpuaWM6ICAgICAgICAgIE5JQyBkYXRhIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnM6ICAgdm9pZC4KKyAqLworc3RhdGljIHZvaWQgCituYXRzZW1pX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKK3sKKyAgICBvdXRsKENoaXBSZXNldCwgaW9hZGRyICsgQ2hpcENtZCk7CisJCisgICAgLyogT24gcGFnZSA3OCBvZiB0aGUgc3BlYywgdGhleSByZWNvbW1lbmQgc29tZSBzZXR0aW5ncyBmb3IgIm9wdGltdW0KKyAgICAgICBwZXJmb3JtYW5jZSIgdG8gYmUgZG9uZSBpbiBzZXF1ZW5jZS4gIFRoZXNlIHNldHRpbmdzIG9wdGltaXplIHNvbWUKKyAgICAgICBvZiB0aGUgMTAwTWJpdCBhdXRvZGV0ZWN0aW9uIGNpcmN1aXRyeS4gIEFsc28sIHdlIG9ubHkgd2FudCB0byBkbworICAgICAgIHRoaXMgZm9yIHJldiBDIG9mIHRoZSBjaGlwLgorICAgICovCisgICAgaWYgKGlubChpb2FkZHIgKyBTaWxpY29uUmV2KSA9PSAweDMwMikgeworCW91dHcoMHgwMDAxLCBpb2FkZHIgKyBQR1NFTCk7CisJb3V0dygweDE4OUMsIGlvYWRkciArIFBNRENTUik7CisJb3V0dygweDAwMDAsIGlvYWRkciArIFRTVERBVCk7CisJb3V0dygweDUwNDAsIGlvYWRkciArIERTUENGRyk7CisJb3V0dygweDAwOEMsIGlvYWRkciArIFNEQ0ZHKTsKKyAgICB9CisgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHVzaW5nIHRoZSBtYXNrLiAqLworICAgIG91dGwoMCwgaW9hZGRyICsgSW50ck1hc2spOworICAgIG91dGwoMCwgaW9hZGRyICsgSW50ckVuYWJsZSk7Cit9CisKKy8qIEZ1bmN0aW9uOiBuYXRzZW1pX2luaXRfcnhmaWx0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjogc2V0cyByZWNlaXZlIGZpbHRlciBhZGRyZXNzIHRvIG91ciBNQUMgYWRkcmVzcworICoKKyAqIEFyZ3VtZW50czogc3RydWN0IG5pYyAqbmljOiAgICAgICAgICBOSUMgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiByZXR1cm5zOiAgIHZvaWQuCisgKi8KKworc3RhdGljIHZvaWQKK25hdHNlbWlfaW5pdF9yeGZpbHRlcihzdHJ1Y3QgbmljICpuaWMpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkgKz0gMikgeworCW91dGwoaSwgaW9hZGRyICsgUnhGaWx0ZXJBZGRyKTsKKwlvdXR3KG5pYy0+bm9kZV9hZGRyW2ldICsgKG5pYy0+bm9kZV9hZGRyW2krMV0gPDwgOCksIGlvYWRkciArIFJ4RmlsdGVyRGF0YSk7CisgICAgfQorfQorCisvKiAKKyAqIEZ1bmN0aW9uOiBuYXRzZW1pX2luaXRfdHhkCisgKgorICogRGVzY3JpcHRpb246IGluaXRpYWxpemVzIHRoZSBUeCBkZXNjcmlwdG9yCisgKgorICogQXJndW1lbnRzOiBzdHJ1Y3QgbmljICpuaWM6ICAgICAgICAgIE5JQyBkYXRhIHN0cnVjdHVyZQorICoKKyAqIHJldHVybnM6ICAgdm9pZC4KKyAqLworCitzdGF0aWMgdm9pZAorbmF0c2VtaV9pbml0X3R4ZChzdHJ1Y3QgbmljICpuaWMpCit7CisgICAgdHhkLmxpbmsgICA9ICh1MzIpIDA7CisgICAgdHhkLmNtZHN0cyA9ICh1MzIpIDA7CisgICAgdHhkLmJ1ZnB0ciA9ICh1MzIpICZ0eGJbMF07CisKKyAgICAvKiBsb2FkIFRyYW5zbWl0IERlc2NyaXB0b3IgUmVnaXN0ZXIgKi8KKyAgICBvdXRsKCh1MzIpICZ0eGQsIGlvYWRkciArIFR4UmluZ1B0cik7IAorICAgIGlmIChuYXRzZW1pX2RlYnVnID4gMSkKKyAgICAgICAgcHJpbnRmKCJuYXRzZW1pX2luaXRfdHhkOiBUWCBkZXNjcmlwdG9yIHJlZ2lzdGVyIGxvYWRlZCB3aXRoOiAlWFxuIiwgCisgICAgICAgICAgICAgICBpbmwoaW9hZGRyICsgVHhSaW5nUHRyKSk7Cit9CisKKy8qIEZ1bmN0aW9uOiBuYXRzZW1pX2luaXRfcnhkCisgKgorICogRGVzY3JpcHRpb246IGluaXRpYWxpemVzIHRoZSBSeCBkZXNjcmlwdG9yIHJpbmcKKyAqICAgIAorICogQXJndW1lbnRzOiBzdHJ1Y3QgbmljICpuaWM6ICAgICAgICAgIE5JQyBkYXRhIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnM6ICAgdm9pZC4KKyAqLworIAorc3RhdGljIHZvaWQgCituYXRzZW1pX2luaXRfcnhkKHN0cnVjdCBuaWMgKm5pYykgCit7IAorICAgIGludCBpOworCisgICAgY3VyX3J4ID0gMDsgCisKKyAgICAvKiBpbml0IFJYIGRlc2NyaXB0b3IgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0RFU0M7IGkrKykgeworICAgICAgICByeGRbaV0ubGluayAgID0gKGkrMSA8IE5VTV9SWF9ERVNDKSA/ICh1MzIpICZyeGRbaSsxXSA6ICh1MzIpICZyeGRbMF07CisgICAgICAgIHJ4ZFtpXS5jbWRzdHMgPSAodTMyKSBSWF9CVUZfU0laRTsKKyAgICAgICAgcnhkW2ldLmJ1ZnB0ciA9ICh1MzIpICZyeGJbaSpSWF9CVUZfU0laRV07CisgICAgICAgIGlmIChuYXRzZW1pX2RlYnVnID4gMSkKKyAgICAgICAgICAgIHByaW50ZigibmF0c2VtaV9pbml0X3J4ZDogcnhkWyVkXT0lWCBsaW5rPSVYIGNtZHN0cz0lWCBidWZwdHI9JVhcbiIsIAorICAgICAgICAgICAgICAgICAgIGksICZyeGRbaV0sIHJ4ZFtpXS5saW5rLCByeGRbaV0uY21kc3RzLCByeGRbaV0uYnVmcHRyKTsKKyAgICB9CisKKyAgICAvKiBsb2FkIFJlY2VpdmUgRGVzY3JpcHRvciBSZWdpc3RlciAqLworICAgIG91dGwoKHUzMikgJnJ4ZFswXSwgaW9hZGRyICsgUnhSaW5nUHRyKTsKKworICAgIGlmIChuYXRzZW1pX2RlYnVnID4gMSkKKyAgICAgICAgcHJpbnRmKCJuYXRzZW1pX2luaXRfcnhkOiBSWCBkZXNjcmlwdG9yIHJlZ2lzdGVyIGxvYWRlZCB3aXRoOiAlWFxuIiwgCisgICAgICAgICAgICAgICBpbmwoaW9hZGRyICsgUnhSaW5nUHRyKSk7Cit9CisKKy8qIEZ1bmN0aW9uOiBuYXRzZW1pX3NldF9yeF9tb2RlCisgKgorICogRGVzY3JpcHRpb246IAorICogICAgc2V0cyB0aGUgcmVjZWl2ZSBtb2RlIHRvIGFjY2VwdCBhbGwgYnJvYWRjYXN0IHBhY2tldHMgYW5kIHBhY2tldHMKKyAqICAgIHdpdGggb3VyIE1BQyBhZGRyZXNzLCBhbmQgcmVqZWN0IGFsbCBtdWx0aWNhc3QgcGFja2V0cy4gICAgICAKKyAqICAgIAorICogQXJndW1lbnRzOiBzdHJ1Y3QgbmljICpuaWM6ICAgICAgICAgIE5JQyBkYXRhIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnM6ICAgdm9pZC4KKyAqLworCitzdGF0aWMgdm9pZCBuYXRzZW1pX3NldF9yeF9tb2RlKHN0cnVjdCBuaWMgKm5pYykKK3sKKyAgICB1MzIgcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE15UGh5czsKKwkKKyAgICBvdXRsKHJ4X21vZGUsIGlvYWRkciArIFJ4RmlsdGVyQWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIG5hdHNlbWlfY2hlY2tfZHVwbGV4KHN0cnVjdCBuaWMgKm5pYykKK3sKKyAgICBpbnQgZHVwbGV4ID0gaW5sKGlvYWRkciArIENoaXBDb25maWcpICYgMHgyMDAwMDAwMCA/IDEgOiAwOworCQorICAgIGlmIChuYXRzZW1pX2RlYnVnKQorCXByaW50ZigiJXM6IFNldHRpbmcgJXMtZHVwbGV4IGJhc2VkIG9uIG5lZ290aWF0ZWQgbGluayIKKwkgICAgICAgIiBjYXBhYmlsaXR5LlxuIiwgbmljX25hbWUsCisJICAgICAgIGR1cGxleCA/ICJmdWxsIiA6ICJoYWxmIik7CisgICAgaWYgKGR1cGxleCkgeworCXJ4X2NvbmZpZyB8PSAweDEwMDAwMDAwOworCXR4X2NvbmZpZyB8PSAweEMwMDAwMDAwOworICAgIH0gZWxzZSB7CisJcnhfY29uZmlnICY9IH4weDEwMDAwMDAwOworCXR4X2NvbmZpZyAmPSB+MHhDMDAwMDAwMDsKKyAgICB9CisgICAgb3V0bCh0eF9jb25maWcsIGlvYWRkciArIFR4Q29uZmlnKTsKKyAgICBvdXRsKHJ4X2NvbmZpZywgaW9hZGRyICsgUnhDb25maWcpOworfQorCisvKiBGdW5jdGlvbjogbmF0c2VtaV90cmFuc21pdAorICoKKyAqIERlc2NyaXB0aW9uOiB0cmFuc21pdHMgYSBwYWNrZXQgYW5kIHdhaXRzIGZvciBjb21wbGV0aW9uIG9yIHRpbWVvdXQuCisgKgorICogQXJndW1lbnRzOiBjaGFyIGRbNl06ICAgICAgICAgIGRlc3RpbmF0aW9uIGV0aGVybmV0IGFkZHJlc3MuCisgKiAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHQ6ICAgZXRoZXJuZXQgcHJvdG9jb2wgdHlwZS4KKyAqICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgczogICBzaXplIG9mIHRoZSBkYXRhLXBhcnQgb2YgdGhlIHBhY2tldC4KKyAqICAgICAgICAgICAgY2hhciAqcDogICAgICAgICAgICB0aGUgZGF0YSBmb3IgdGhlIHBhY2tldC4KKyAqICAgIAorICogUmV0dXJuczogICB2b2lkLgorICovCisKK3N0YXRpYyB2b2lkCituYXRzZW1pX3RyYW5zbWl0KHN0cnVjdCBuaWMgICpuaWMsCisJCSBjb25zdCBjaGFyICAqZCwgICAgIC8qIERlc3RpbmF0aW9uICovCisJCSB1bnNpZ25lZCBpbnQgdCwgICAgIC8qIFR5cGUgKi8KKwkJIHVuc2lnbmVkIGludCBzLCAgICAgLyogc2l6ZSAqLworCQkgY29uc3QgY2hhciAgKnApICAgICAvKiBQYWNrZXQgKi8KK3sKKyAgICB1MzIgc3RhdHVzLCB0bywgbnN0eXBlOworICAgIHUzMiB0eF9zdGF0dXM7CisgICAgCisgICAgLyogU3RvcCB0aGUgdHJhbnNtaXR0ZXIgKi8KKyAgICBvdXRsKFR4T2ZmLCBpb2FkZHIgKyBDaGlwQ21kKTsKKworICAgIC8qIGxvYWQgVHJhbnNtaXQgRGVzY3JpcHRvciBSZWdpc3RlciAqLworICAgIG91dGwoKHUzMikgJnR4ZCwgaW9hZGRyICsgVHhSaW5nUHRyKTsKKyAgICBpZiAobmF0c2VtaV9kZWJ1ZyA+IDEpCisgICAgICAgIHByaW50ZigibmF0c2VtaV90cmFuc21pdDogVFggZGVzY3JpcHRvciByZWdpc3RlciBsb2FkZWQgd2l0aDogJVhcbiIsIAorICAgICAgICAgICAgICAgaW5sKGlvYWRkciArIFR4UmluZ1B0cikpOworCisgICAgbWVtY3B5KHR4YiwgZCwgRVRIX0FMRU4pOworICAgIG1lbWNweSh0eGIgKyBFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsKKyAgICBuc3R5cGUgPSBodG9ucyh0KTsKKyAgICBtZW1jcHkodHhiICsgMiAqIEVUSF9BTEVOLCAoY2hhciopJm5zdHlwZSwgMik7CisgICAgbWVtY3B5KHR4YiArIEVUSF9ITEVOLCBwLCBzKTsKKworICAgIHMgKz0gRVRIX0hMRU47CisgICAgcyAmPSBEU0laRTsKKworICAgIGlmIChuYXRzZW1pX2RlYnVnID4gMSkKKyAgICAgICAgcHJpbnRmKCJuYXRzZW1pX3RyYW5zbWl0OiBzZW5kaW5nICVkIGJ5dGVzIGV0aHR5cGUgJWhYXG4iLCAoaW50KSBzLCB0KTsKKworICAgIC8qIHBhZCB0byBtaW5pbXVtIHBhY2tldCBzaXplICovCisgICAgd2hpbGUgKHMgPCBFVEhfWkxFTikgIAorICAgICAgICB0eGJbcysrXSA9ICdcMCc7CisKKyAgICAvKiBzZXQgdGhlIHRyYW5zbWl0IGJ1ZmZlciBkZXNjcmlwdG9yIGFuZCBlbmFibGUgVHJhbnNtaXQgU3RhdGUgTWFjaGluZSAqLworICAgIHR4ZC5idWZwdHIgPSAodTMyKSAmdHhiWzBdOworICAgIHR4ZC5jbWRzdHMgPSAodTMyKSBPV04gfCBzOworCisgICAgLyogcmVzdGFydCB0aGUgdHJhbnNtaXR0ZXIgKi8KKyAgICBvdXRsKFR4T24sIGlvYWRkciArIENoaXBDbWQpOworCisgICAgaWYgKG5hdHNlbWlfZGVidWcgPiAxKQorICAgICAgICBwcmludGYoIm5hdHNlbWlfdHJhbnNtaXQ6IFF1ZXVlZCBUeCBwYWNrZXQgc2l6ZSAlZC5cbiIsIChpbnQpIHMpOworCisgICAgdG8gPSBjdXJydGlja3MoKSArIFRYX1RJTUVPVVQ7CisKKyAgICB3aGlsZSAoKCgodm9sYXRpbGUgdTMyKSB0eF9zdGF0dXM9dHhkLmNtZHN0cykgJiBPV04pICYmIChjdXJydGlja3MoKSA8IHRvKSkKKyAgICAgICAgLyogd2FpdCAqLyA7CisKKyAgICBpZiAoY3VycnRpY2tzKCkgPj0gdG8pIHsKKyAgICAgICAgcHJpbnRmKCJuYXRzZW1pX3RyYW5zbWl0OiBUWCBUaW1lb3V0ISBUeCBzdGF0dXMgJVguXG4iLCB0eF9zdGF0dXMpOworICAgIH0KKworICAgIGlmICghKHR4X3N0YXR1cyAmIDB4MDgwMDAwMDApKSB7CisJcHJpbnRmKCJuYXRzZW1pX3RyYW5zbWl0OiBUcmFuc21pdCBlcnJvciwgVHggc3RhdHVzICVYLlxuIiwgdHhfc3RhdHVzKTsKKyAgICB9Cit9CisKKy8qIEZ1bmN0aW9uOiBuYXRzZW1pX3BvbGwKKyAqCisgKiBEZXNjcmlwdGlvbjogY2hlY2tzIGZvciBhIHJlY2VpdmVkIHBhY2tldCBhbmQgcmV0dXJucyBpdCBpZiBmb3VuZC4KKyAqCisgKiBBcmd1bWVudHM6IHN0cnVjdCBuaWMgKm5pYzogICAgICAgICAgTklDIGRhdGEgc3RydWN0dXJlCisgKgorICogUmV0dXJuczogICAxIGlmICAgIHBhY2tldCB3YXMgcmVjZWl2ZWQuCisgKiAgICAgICAgICAgIDAgaWYgbm8gcGFja2V0IHdhcyByZWNlaXZlZC4KKyAqCisgKiBTaWRlIGVmZmVjdHM6CisgKiAgICAgICAgICAgIFJldHVybnMgKGNvcGllcykgdGhlIHBhY2tldCB0byB0aGUgYXJyYXkgbmljLT5wYWNrZXQuCisgKiAgICAgICAgICAgIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IGluIG5pYy0+cGFja2V0bGVuLgorICovCisKK3N0YXRpYyBpbnQKK25hdHNlbWlfcG9sbChzdHJ1Y3QgbmljICpuaWMpCit7CisgICAgdTMyIHJ4X3N0YXR1cyA9IHJ4ZFtjdXJfcnhdLmNtZHN0czsKKyAgICBpbnQgcmV0c3RhdCA9IDA7CisKKyAgICBpZiAobmF0c2VtaV9kZWJ1ZyA+IDIpCisgICAgICAgIHByaW50ZigibmF0c2VtaV9wb2xsOiBjdXJfcng6JWQsIHN0YXR1czolWFxuIiwgY3VyX3J4LCByeF9zdGF0dXMpOworCisgICAgaWYgKCEocnhfc3RhdHVzICYgT1dOKSkKKyAgICAgICAgcmV0dXJuIHJldHN0YXQ7CisKKyAgICBpZiAobmF0c2VtaV9kZWJ1ZyA+IDEpCisgICAgICAgIHByaW50ZigibmF0c2VtaV9wb2xsOiBnb3QgYSBwYWNrZXQ6IGN1cl9yeDolZCwgc3RhdHVzOiVYXG4iLAorICAgICAgICAgICAgICAgY3VyX3J4LCByeF9zdGF0dXMpOworCisgICAgbmljLT5wYWNrZXRsZW4gPSAocnhfc3RhdHVzICYgRFNJWkUpIC0gQ1JDX1NJWkU7CisKKyAgICBpZiAoKHJ4X3N0YXR1cyAmIChEZXNjTW9yZXxEZXNjUGt0T0t8UnhUb29Mb25nKSkgIT0gRGVzY1BrdE9LKSB7CisgICAgICAgIC8qIGNvcnJ1cHRlZCBwYWNrZXQgcmVjZWl2ZWQgKi8KKyAgICAgICAgcHJpbnRmKCJuYXRzZW1pX3BvbGw6IENvcnJ1cHRlZCBwYWNrZXQgcmVjZWl2ZWQsIGJ1ZmZlciBzdGF0dXMgPSAlWFxuIiwKKyAgICAgICAgICAgICAgIHJ4X3N0YXR1cyk7CisgICAgICAgIHJldHN0YXQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGdpdmUgcGFja2V0IHRvIGhpZ2hlciBsZXZlbCByb3V0aW5lICovCisgICAgICAgIG1lbWNweShuaWMtPnBhY2tldCwgKHJ4YiArIGN1cl9yeCpSWF9CVUZfU0laRSksIG5pYy0+cGFja2V0bGVuKTsKKyAgICAgICAgcmV0c3RhdCA9IDE7CisgICAgfQorCisgICAgLyogcmV0dXJuIHRoZSBkZXNjcmlwdG9yIGFuZCBidWZmZXIgdG8gcmVjZWl2ZSByaW5nICovCisgICAgcnhkW2N1cl9yeF0uY21kc3RzID0gUlhfQlVGX1NJWkU7CisgICAgcnhkW2N1cl9yeF0uYnVmcHRyID0gKHUzMikgJnJ4YltjdXJfcngqUlhfQlVGX1NJWkVdOworICAgICAgICAKKyAgICBpZiAoKytjdXJfcnggPT0gTlVNX1JYX0RFU0MpCisgICAgICAgIGN1cl9yeCA9IDA7CisKKyAgICAvKiByZS1lbmFibGUgdGhlIHBvdGVudGlhbGx5IGlkbGUgcmVjZWl2ZSBzdGF0ZSBtYWNoaW5lICovCisgICAgb3V0bChSeE9uLCBpb2FkZHIgKyBDaGlwQ21kKTsKKworICAgIHJldHVybiByZXRzdGF0OworfQorCisvKiBGdW5jdGlvbjogbmF0c2VtaV9kaXNhYmxlCisgKgorICogRGVzY3JpcHRpb246IFR1cm5zIG9mZiBpbnRlcnJ1cHRzIGFuZCBzdG9wcyBUeCBhbmQgUnggZW5naW5lcworICogICAgCisgKiBBcmd1bWVudHM6IHN0cnVjdCBuaWMgKm5pYzogICAgICAgICAgTklDIGRhdGEgc3RydWN0dXJlCisgKgorICogUmV0dXJuczogICB2b2lkLgorICovCisKK3N0YXRpYyB2b2lkCituYXRzZW1pX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQoreworICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyB1c2luZyB0aGUgbWFzay4gKi8KKyAgICBvdXRsKDAsIGlvYWRkciArIEludHJNYXNrKTsKKyAgICBvdXRsKDAsIGlvYWRkciArIEludHJFbmFibGUpOworCisgICAgLyogU3RvcCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBwcm9jZXNzZXMuICovCisgICAgb3V0bChSeE9mZiB8IFR4T2ZmLCBpb2FkZHIgKyBDaGlwQ21kKTsKKwkKKyAgICAvKiBSZXN0b3JlIFBNRSBlbmFibGUgYml0ICovCisgICAgb3V0bChTYXZlZENsa1J1biwgaW9hZGRyICsgQ2xrUnVuKTsKK30KZGlmZiAtLWdpdCBhL25ldGJvb3Qvbmk1MDEwLmMgYi9uZXRib290L25pNTAxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMzgyN2EKLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L25pNTAxMC5jCkBAIC0wLDAgKzEsMzcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0V0aGVyYm9vdCAtICBCT09UUC9URlRQIEJvb3RzdHJhcCBQcm9ncmFtCitEcml2ZXIgZm9yIE5JNTAxMC4KK0NvZGUgZnJlZWx5IHRha2VuIGZyb20gSmFuLVBhc2NhbCB2YW4gQmVzdCBhbmQgQW5kcmVhcyBNb2hyJ3MKK0xpbnV4IE5JNTAxMCBkcml2ZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKy8qIHRvIGdldCBzb21lIGdsb2JhbCByb3V0aW5lcyBsaWtlIHByaW50ZiAqLworI2luY2x1ZGUgImV0aGVyYm9vdC5oIgorLyogdG8gZ2V0IHRoZSBpbnRlcmZhY2UgdG8gdGhlIGJvZHkgb2YgdGhlIHByb2dyYW0gKi8KKyNpbmNsdWRlICJuaWMuaCIKKy8qIHRvIGdldCBvdXIgb3duIHByb3RvdHlwZSAqLworI2luY2x1ZGUgImNhcmRzLmgiCisKKy8qIG5pNTAxMC5oIGZpbGUgaW5jbHVkZWQgdmVyYmF0aW0gKi8KKy8qCisgKiBSYWNhbC1JbnRlcmxhbiBuaTUwMTAgRXRoZXJuZXQgZGVmaW5pdGlvbnMKKyAqCisgKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiB0byB0aGUgTGludXggb3BlcmF0aW5nIHN5c3RlbSwgYW5kIGlzIGNvdmVyZWQgYnkgdGhlCisgKiBzYW1lIEdudSBQdWJsaWMgTGljZW5zZSB0aGF0IGNvdmVycyB0aGF0IHdvcmsuCisgKgorICogY29weXJpZ2h0cyAoYykgMTk5NiBieSBKYW4tUGFzY2FsIHZhbiBCZXN0IChqdmJlc3RAd2kubGVpZGVudW5pdi5ubCkKKyAqCisgKiBJIGhhdmUgZG9uZSBhIGxvb2sgaW4gdGhlIGZvbGxvd2luZyBzb3VyY2VzOgorICogICBjcnlud3ItcGFja2V0LWRyaXZlciBieSBSdXNzIE5lbHNvbgorICovCisKKyNkZWZpbmUgTkk1MDEwX0JVRlNJWkUJMjA0OAkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gYSBidWZmZXIgKi8KKworI2RlZmluZSBOSTUwMTBfTUFHSUNWQUwwIDB4MDAgIC8qIG1hZ2ljLXZhbHVlcyBmb3Igbmk1MDEwIGNhcmQgKi8KKyNkZWZpbmUgTkk1MDEwX01BR0lDVkFMMSAweDU1CisjZGVmaW5lIE5JNTAxMF9NQUdJQ1ZBTDIgMHhBQQorCisjZGVmaW5lIFNBX0FERFIwIDB4MDIKKyNkZWZpbmUgU0FfQUREUjEgMHgwNworI2RlZmluZSBTQV9BRERSMiAweDAxCisKKy8qIFRoZSBudW1iZXIgb2YgbG93IEkvTyBwb3J0cyB1c2VkIGJ5IHRoZSBuaTUwMTAgZXRoZXJjYXJkLiAqLworI2RlZmluZSBOSTUwMTBfSU9fRVhURU5UICAgICAgIDMyCisKKyNkZWZpbmUgUFJJTlRLKHgpIGlmIChOSTUwMTBfREVCVUcpIHByaW50ayB4CisjZGVmaW5lIFBSSU5USzIoeCkgaWYgKE5JNTAxMF9ERUJVRz49MikgcHJpbnRrIHgKKyNkZWZpbmUgUFJJTlRLMyh4KSBpZiAoTkk1MDEwX0RFQlVHPj0zKSBwcmludGsgeAorCisvKiBUaGUgdmFyaW91cyBJRSBjb21tYW5kIHJlZ2lzdGVycyAqLworI2RlZmluZSBFRExDX1hTVEFUCShpb2FkZHIgKyAweDAwKQkvKiBFRExDIHRyYW5zbWl0IGNzciAqLworI2RlZmluZSBFRExDX1hDTFIJKGlvYWRkciArIDB4MDApCS8qIEVETEMgdHJhbnNtaXQgIkNsZWFyIElSUSIgKi8KKyNkZWZpbmUgRURMQ19YTUFTSwkoaW9hZGRyICsgMHgwMSkJLyogRURMQyB0cmFuc21pdCAiSVJRIE1hc2tzIiAqLworI2RlZmluZSBFRExDX1JTVEFUCShpb2FkZHIgKyAweDAyKQkvKiBFRExDIHJlY2VpdmUgY3NyICovCisjZGVmaW5lIEVETENfUkNMUgkoaW9hZGRyICsgMHgwMikJLyogRURMQyByZWNlaXZlICJDbGVhciBJUlEiICovCisjZGVmaW5lIEVETENfUk1BU0sJKGlvYWRkciArIDB4MDMpCS8qIEVETEMgcmVjZWl2ZSAiSVJRIE1hc2tzIiAqLworI2RlZmluZSBFRExDX1hNT0RFCShpb2FkZHIgKyAweDA0KQkvKiBFRExDIHRyYW5zbWl0IE1vZGUgKi8KKyNkZWZpbmUgRURMQ19STU9ERQkoaW9hZGRyICsgMHgwNSkJLyogRURMQyByZWNlaXZlIE1vZGUgKi8KKyNkZWZpbmUgRURMQ19SRVNFVAkoaW9hZGRyICsgMHgwNikJLyogRURMQyBSRVNFVCByZWdpc3RlciAqLworI2RlZmluZSBFRExDX1REUjEJKGlvYWRkciArIDB4MDcpCS8qICJUaW1lIERvbWFpbiBSZWZsZWN0b21ldHJ5IiByZWcxICovCisjZGVmaW5lIEVETENfQUREUgkoaW9hZGRyICsgMHgwOCkJLyogRURMQyBzdGF0aW9uIGFkZHJlc3MsIDYgYnl0ZXMgKi8KKwkgCQkJLyogMHgwRSBkb2Vzbid0IGV4aXN0IGZvciByL3cgKi8KKyNkZWZpbmUgRURMQ19URFIyCShpb2FkZHIgKyAweDBmKQkvKiAiVGltZSBEb21haW4gUmVmbGVjdG9tZXRyeSIgcmVnMiAqLworI2RlZmluZSBJRV9HUAkJKGlvYWRkciArIDB4MTApCS8qIEdQIHBvaW50ZXIgKHdvcmQgcmVnaXN0ZXIpICovCisJCQkJLyogMHgxMSBpcyAybmQgYnl0ZSBvZiBHUCBQb2ludGVyICovCisjZGVmaW5lIElFX1JDTlQJCShpb2FkZHIgKyAweDEwKQkvKiBDb3VudCBvZiBieXRlcyBpbiByY3YnZCBwYWNrZXQgKi8KKyAJCQkJLyogMHgxMSBpcyAybmQgYnl0ZSBvZiAiQnl0ZSBDb3VudCIgKi8KKyNkZWZpbmUgSUVfTU1PREUJKGlvYWRkciArIDB4MTIpCS8qIE1lbW9yeSBNb2RlIHJlZ2lzdGVyICovCisjZGVmaW5lIElFX0RNQV9SU1QJKGlvYWRkciArIDB4MTMpCS8qIElFIERNQSBSZXNldC4gIHdyaXRlIG9ubHkgKi8KKyNkZWZpbmUgSUVfSVNUQVQJKGlvYWRkciArIDB4MTMpCS8qIElFIEludGVycnVwdCBTdGF0dXMuICByZWFkIG9ubHkgKi8KKyNkZWZpbmUgSUVfUkJVRgkJKGlvYWRkciArIDB4MTQpCS8qIElFIFJlY2VpdmUgQnVmZmVyIHBvcnQgKi8KKyNkZWZpbmUgSUVfWEJVRgkJKGlvYWRkciArIDB4MTUpCS8qIElFIFRyYW5zbWl0IEJ1ZmZlciBwb3J0ICovCisjZGVmaW5lIElFX1NBUFJPTQkoaW9hZGRyICsgMHgxNikJLyogd2luZG93IG9uIHN0YXRpb24gYWRkciBwcm9tICovCisjZGVmaW5lIElFX1JFU0VUCShpb2FkZHIgKyAweDE3KQkvKiBhbnkgd3JpdGUgY2F1c2VzIEJvYXJkIFJlc2V0ICovCisKKy8qIGJpdHMgaW4gRURMQ19YU1RBVCwgaW50ZXJydXB0IGNsZWFyIG9uIHdyaXRlLCBzdGF0dXMgd2hlbiByZWFkICovCisjZGVmaW5lIFhTX1RQT0sJCTB4ODAJLyogdHJhbnNtaXQgcGFja2V0IHN1Y2Nlc3NmdWwgKi8KKyNkZWZpbmUgWFNfQ1MJCTB4NDAJLyogY2FycmllciBzZW5zZSAqLworI2RlZmluZSBYU19SQ1ZECQkweDIwCS8qIHRyYW5zbWl0dGVkIHBhY2tldCByZWNlaXZlZCAqLworI2RlZmluZSBYU19TSE9SVAkweDEwCS8qIHRyYW5zbWlzc2lvbiBtZWRpYSBpcyBzaG9ydGVkICovCisjZGVmaW5lIFhTX1VGTFcJCTB4MDgJLyogdW5kZXJmbG93LiAgaWZmIGZhaWxlZCBib2FyZCAqLworI2RlZmluZSBYU19DT0xMCQkweDA0CS8qIGNvbGxpc2lvbiBvY2N1cnJlZCAqLworI2RlZmluZSBYU18xNkNPTEwJMHgwMgkvKiAxNnRoIGNvbGxpc2lvbiBvY2N1cnJlZCAqLworI2RlZmluZSBYU19QRVJSCQkweDAxCS8qIHBhcml0eSBlcnJvciAqLworCisjZGVmaW5lIFhTX0NMUl9VRkxXCTB4MDgJLyogY2xlYXIgdW5kZXJmbG93ICovCisjZGVmaW5lIFhTX0NMUl9DT0xMCTB4MDQJLyogY2xlYXIgY29sbGlzaW9uICovCisjZGVmaW5lIFhTX0NMUl8xNkNPTEwJMHgwMgkvKiBjbGVhciAxNnRoIGNvbGxpc2lvbiAqLworI2RlZmluZSBYU19DTFJfUEVSUgkweDAxCS8qIGNsZWFyIHBhcml0eSBlcnJvciAqLworCisvKiBiaXRzIGluIEVETENfWE1BU0ssIG1hc2svZW5hYmxlIHRyYW5zbWl0IGludGVycnVwdHMuICByZWdpc3RlciBpcyByL3cgKi8KKyNkZWZpbmUgWE1fVFBPSwkJMHg4MAkvKiA9MSB0byBlbmFibGUgWG10IFBrdCBPSyBpbnRlcnJ1cHRzICovCisjZGVmaW5lIFhNX1JDVkQJCTB4MjAJLyogPTEgdG8gZW5hYmxlIFhtdCBQa3QgUmN2ZCBpbnRzICovCisjZGVmaW5lIFhNX1VGTFcJCTB4MDgJLyogPTEgdG8gZW5hYmxlIFhtdCBVbmRlcmZsb3cgaW50cyAqLworI2RlZmluZSBYTV9DT0xMCQkweDA0CS8qID0xIHRvIGVuYWJsZSBYbXQgQ29sbGlzaW9uIGludHMgKi8KKyNkZWZpbmUgWE1fQ09MTDE2CTB4MDIJLyogPTEgdG8gZW5hYmxlIFhtdCAxNnRoIENvbGwgaW50cyAqLworI2RlZmluZSBYTV9QRVJSCQkweDAxCS8qID0xIHRvIGVuYWJsZSBYbXQgUGFyaXR5IEVycm9yIGludHMgKi8KKyAJCQkJLyogbm90ZTogYWx3YXlzIGNsZWFyIHRoaXMgYml0ICovCisjZGVmaW5lIFhNX0FMTAkJKFhNX1RQT0sgfCBYTV9SQ1ZEIHwgWE1fVUZMVyB8IFhNX0NPTEwgfCBYTV9DT0xMMTYpCisKKy8qIGJpdHMgaW4gRURMQ19SU1RBVCwgaW50ZXJydXB0IGNsZWFyIG9uIHdyaXRlLCBzdGF0dXMgd2hlbiByZWFkICovCisjZGVmaW5lIFJTX1BLVF9PSwkweDgwCS8qIHJlY2VpdmVkIGdvb2QgcGFja2V0ICovCisjZGVmaW5lIFJTX1JTVF9QS1QJMHgxMAkvKiBSRVNFVCBwYWNrZXQgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgUlNfUlVOVAkJMHgwOAkvKiBSdW50IFBrdCByY3ZkLiAgTGVuIDwgNjQgQnl0ZXMgKi8KKyNkZWZpbmUgUlNfQUxJR04JMHgwNAkvKiBBbGlnbm1lbnQgZXJyb3IuIG5vdCA4IGJpdCBhbGlnbmVkICovCisjZGVmaW5lIFJTX0NSQ19FUlIJMHgwMgkvKiBCYWQgQ1JDIG9uIHJjdmQgcGt0ICovCisjZGVmaW5lIFJTX09GTFcJCTB4MDEJLyogb3ZlcmZsb3cgZm9yIHJjdiBGSUZPICovCisjZGVmaW5lIFJTX1ZBTElEX0JJVFMJKCBSU19QS1RfT0sgfCBSU19SU1RfUEtUIHwgUlNfUlVOVCB8IFJTX0FMSUdOIHwgUlNfQ1JDX0VSUiB8IFJTX09GTFcgKQorIAkJCQkvKiBhbGwgdmFsaWQgUlNUQVQgYml0cyAqLworCisjZGVmaW5lIFJTX0NMUl9QS1RfT0sJMHg4MAkvKiBjbGVhciByY3ZkIHBhY2tldCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgUlNfQ0xSX1JTVF9QS1QJMHgxMAkvKiBjbGVhciBSRVNFVCBwYWNrZXQgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgUlNfQ0xSX1JVTlQJMHgwOAkvKiBjbGVhciBSdW50IFBja3QgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgUlNfQ0xSX0FMSUdOCTB4MDQJLyogY2xlYXIgQWxpZ25tZW50IGVycm9yICovCisjZGVmaW5lIFJTX0NMUl9DUkNfRVJSCTB4MDIJLyogY2xlYXIgQ1JDIGVycm9yICovCisjZGVmaW5lIFJTX0NMUl9PRkxXCTB4MDEJLyogY2xlYXIgcmN2IEZJRk8gT3ZlcmZsb3cgKi8KKworLyogYml0cyBpbiBFRExDX1JNQVNLLCBtYXNrL2VuYWJsZSByZWNlaXZlIGludGVycnVwdHMuICByZWdpc3RlciBpcyByL3cgKi8KKyNkZWZpbmUgUk1fUEtUX09LCTB4ODAJLyogPTEgdG8gZW5hYmxlIHJjdmQgZ29vZCBwYWNrZXQgaW50cyAqLworI2RlZmluZSBSTV9SU1RfUEtUCTB4MTAJLyogPTEgdG8gZW5hYmxlIFJFU0VUIHBhY2tldCBpbnRzICovCisjZGVmaW5lIFJNX1JVTlQJCTB4MDgJLyogPTEgdG8gZW5hYmxlIFJ1bnQgUGt0IHJjdmQgaW50cyAqLworI2RlZmluZSBSTV9BTElHTgkweDA0CS8qID0xIHRvIGVuYWJsZSBBbGlnbm1lbnQgZXJyb3IgaW50cyAqLworI2RlZmluZSBSTV9DUkNfRVJSCTB4MDIJLyogPTEgdG8gZW5hYmxlIEJhZCBDUkMgZXJyb3IgaW50cyAqLworI2RlZmluZSBSTV9PRkxXCQkweDAxCS8qID0xIHRvIGVuYWJsZSBvdmVyZmxvdyBlcnJvciBpbnRzICovCisKKy8qIGJpdHMgaW4gRURMQ19STU9ERSwgc2V0IFJlY2VpdmUgUGFja2V0IG1vZGUuICByZWdpc3RlciBpcyByL3cgKi8KKyNkZWZpbmUgUk1EX1RFU1QJMHg4MAkvKiA9MSBmb3IgQ2hpcCB0ZXN0aW5nLiAgbm9ybWFsbHkgMCAqLworI2RlZmluZSBSTURfQUREX1NJWgkweDEwCS8qID0xIDUtYnl0ZSBhZGRyIG1hdGNoLiAgbm9ybWFsbHkgMCAqLworI2RlZmluZSBSTURfRU5fUlVOVAkweDA4CS8qID0xIGVuYWJsZSBydW50IHJjdi4gIG5vcm1hbGx5IDAgKi8KKyNkZWZpbmUgUk1EX0VOX1JTVAkweDA0CS8qID0xIHRvIHJjdiBSRVNFVCBwa3QuICBub3JtYWxseSAwICovCisKKyNkZWZpbmUgUk1EX1BST01JU0MJMHgwMwkvKiByZWNlaXZlICphbGwqIHBhY2tldHMuICB1bnVzdWFsICovCisjZGVmaW5lIFJNRF9NVUxUSUNBU1QJMHgwMgkvKiByZWNlaXZlIG11bHRpY2FzdHMgdG9vLiAgdW51c3VhbCAqLworI2RlZmluZSBSTURfQlJPQURDQVNUCTB4MDEJLyogcmVjZWl2ZSBicm9hZGNhc3RzICYgbm9ybWFsLiB1c3VhbCAqLworI2RlZmluZSBSTURfTk9fUEFDS0VUUwkweDAwCS8qIGRvbid0IHJlY2VpdmUgYW55IHBhY2tldHMuIHVudXN1YWwgKi8KKworLyogYml0cyBpbiBFRExDX1hNT0RFLCBzZXQgVHJhbnNtaXQgUGFja2V0IG1vZGUuICByZWdpc3RlciBpcyByL3cgKi8KKyNkZWZpbmUgWE1EX0NPTExfQ05UCTB4ZjAJLyogY29sbCdzIHNpbmNlIHN1Y2Nlc3MuICByZWFkLW9ubHkgKi8KKyNkZWZpbmUgWE1EX0lHX1BBUgkweDA4CS8qID0xIHRvIGlnbm9yZSBwYXJpdHkuICBBTFdBWVMgc2V0ICovCisjZGVmaW5lIFhNRF9UX01PREUJMHgwNAkvKiA9MSB0byBwb3dlciB4Y3ZyLiBBTFdBWVMgc2V0IHRoaXMgKi8KKyNkZWZpbmUgWE1EX0xCQwkJMHgwMgkvKiA9MSBmb3IgbG9vcGJhY2suICBub3JtYWxseSBzZXQgKi8KKyNkZWZpbmUgWE1EX0RJU19DCTB4MDEJLyogPTEgZGlzYWJsZXMgY29udGVudGlvbi4gbm9ybWFsbHkgMCAqLworCisvKiBiaXRzIGluIEVETENfUkVTRVQsIHdyaXRlIG9ubHkgKi8KKyNkZWZpbmUgUlNfUkVTRVQJMHg4MAkvKiA9MSB0byBob2xkIEVETEMgaW4gcmVzZXQgc3RhdGUgKi8KKworLyogYml0cyBpbiBJRV9NTU9ERSwgd3JpdGUgb25seSAqLworI2RlZmluZSBNTV9FTl9ETUEJMHg4MAkvKiA9MSBiZWdpbiBETUEgeGZlciwgQ3BsdCBjbHJzIGl0ICovCisjZGVmaW5lIE1NX0VOX1JDVgkweDQwCS8qID0xIGFsbG93cyBQa3QgcmN2LiAgY2xyJ2QgYnkgcmN2ICovCisjZGVmaW5lIE1NX0VOX1hNVAkweDIwCS8qID0xIGJlZ2luIFhtdCBwa3QuICBDcGx0IGNscnMgaXQgKi8KKyNkZWZpbmUgTU1fQlVTX1BBR0UJMHgxOAkvKiA9MDAgQUxXQVlTLiAgVXNlZCB3aGVuIE1VWD0xICovCisjZGVmaW5lIE1NX05FVF9QQUdFCTB4MDYJLyogPTAwIEFMV0FZUy4gIFVzZWQgd2hlbiBNVVg9MCAqLworI2RlZmluZSBNTV9NVVgJCTB4MDEJLyogPTEgbWVhbnMgUmN2IEJ1ZmYgb24gc3lzdGVtIGJ1cyAqLworCQkJCS8qID0wIG1lYW5zIFhtdCBCdWZmIG9uIHN5c3RlbSBidXMgKi8KKworLyogYml0cyBpbiBJRV9JU1RBVCwgcmVhZCBvbmx5ICovCisjZGVmaW5lIElTX1RESUFHCTB4ODAJLyogPTEgaWYgRGlhZ25vc3RpYyBwcm9ibGVtICovCisjZGVmaW5lIElTX0VOX1JDVgkweDIwCS8qID0xIHVudGlsIGZyYW1lIGlzIHJjdidkIGNwbHQgKi8KKyNkZWZpbmUgSVNfRU5fWE1UCTB4MTAJLyogPTEgdW50aWwgZnJhbWUgaXMgeG10J2QgY3BsdCAqLworI2RlZmluZSBJU19FTl9ETUEJMHgwOAkvKiA9MSB1bnRpbCBETUEgaXMgY3BsdCBvciBhYm9ydGVkICovCisjZGVmaW5lIElTX0RNQV9JTlQJMHgwNAkvKiA9MCBpZmYgRE1BIGRvbmUgaW50ZXJydXB0LiAqLworI2RlZmluZSBJU19SX0lOVAkweDAyCS8qID0wIGlmZiB1bm1hc2tlZCBSY3YgaW50ZXJydXB0ICovCisjZGVmaW5lIElTX1hfSU5UCTB4MDEJLyogPTAgaWZmIHVubWFza2VkIFhtdCBpbnRlcnJ1cHQgKi8KKworLyogTklDIHNwZWNpZmljIHN0YXRpYyB2YXJpYWJsZXMgZ28gaGVyZSAqLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQJCWlvYWRkciA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50CQlidWZzaXplX3JjdiA9IDA7CisKKyNpZgkwCitzdGF0aWMgdm9pZCBzaG93X3JlZ2lzdGVycyh2b2lkKQoreworCXByaW50ZigiWFNUQVQgJWhoWCAiLCBpbmIoRURMQ19YU1RBVCkpOworCXByaW50ZigiWE1BU0sgJWhoWCAiLCBpbmIoRURMQ19YTUFTSykpOworCXByaW50ZigiUlNUQVQgJWhoWCAiLCBpbmIoRURMQ19SU1RBVCkpOworCXByaW50ZigiUk1BU0sgJWhoWCAiLCBpbmIoRURMQ19STUFTSykpOworCXByaW50ZigiUk1PREUgJWhoWCAiLCBpbmIoRURMQ19STU9ERSkpOworCXByaW50ZigiWE1PREUgJWhoWCAiLCBpbmIoRURMQ19YTU9ERSkpOworCXByaW50ZigiSVNUQVQgJWhoWFxuIiwgaW5iKElFX0lTVEFUKSk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgcmVzZXRfcmVjZWl2ZXIodm9pZCkKK3sKKwlvdXR3KDAsIElFX0dQKTsJCS8qIFJlY2VpdmUgcGFja2V0IGF0IHN0YXJ0IG9mIGJ1ZmZlciAqLworCW91dGIoUlNfVkFMSURfQklUUywgRURMQ19SQ0xSKTsJLyogQ2xlYXIgYWxsIHBlbmRpbmcgUmN2IGludGVycnVwdHMgKi8KKwlvdXRiKE1NX0VOX1JDViwgSUVfTU1PREUpOyAvKiBFbmFibGUgcmN2ICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVTRVQgLSBSZXNldCBhZGFwdGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBuaTUwMTBfcmVzZXQoc3RydWN0IG5pYyAqbmljKQoreworCWludAkJaTsKKworCS8qIFJlc2V0IHRoZSBoYXJkd2FyZSBoZXJlLiAgRG9uJ3QgZm9yZ2V0IHRvIHNldCB0aGUgc3RhdGlvbiBhZGRyZXNzLiAqLworCW91dGIoUlNfUkVTRVQsIEVETENfUkVTRVQpOwkvKiBIb2xkIHVwIEVETENfUkVTRVQgd2hpbGUgY29uZmlnaW5nIGJvYXJkICovCisJb3V0YigwLCBJRV9SRVNFVCk7CS8qIEhhcmR3YXJlIHJlc2V0IG9mIG5pNTAxMCBib2FyZCAqLworCW91dGIoMCwgRURMQ19YTUFTSyk7CS8qIERpc2FibGUgYWxsIFhtdCBpbnRlcnJ1cHRzICovCisJb3V0YigwLCBFRExDX1JNQVNLKTsJLyogRGlzYWJsZSBhbGwgUmN2IGludGVycnVwdCAqLworCW91dGIoMHhGRiwgRURMQ19YQ0xSKTsJLyogQ2xlYXIgYWxsIHBlbmRpbmcgWG10IGludGVycnVwdHMgKi8KKwlvdXRiKDB4RkYsIEVETENfUkNMUik7CS8qIENsZWFyIGFsbCBwZW5kaW5nIFJjdiBpbnRlcnJ1cHRzICovCisJb3V0YihYTURfTEJDLCBFRExDX1hNT0RFKTsJLyogT25seSBsb29wYmFjayB4bWl0cyAqLworCS8qIFNldCB0aGUgc3RhdGlvbiBhZGRyZXNzICovCisJZm9yKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKKwkJb3V0YihuaWMtPm5vZGVfYWRkcltpXSwgRURMQ19BRERSICsgaSk7CisJb3V0YihYTURfSUdfUEFSIHwgWE1EX1RfTU9ERSB8IFhNRF9MQkMsIEVETENfWE1PREUpOyAKKwkJCQkvKiBOb3JtYWwgcGFja2V0IHhtaXQgbW9kZSAqLworCW91dGIoUk1EX0JST0FEQ0FTVCwgRURMQ19STU9ERSk7CisJCQkJLyogUmVjZWl2ZSBicm9hZGNhc3QgYW5kIG5vcm1hbCBwYWNrZXRzICovCisJcmVzZXRfcmVjZWl2ZXIoKTsKKwlvdXRiKDB4MDAsIEVETENfUkVTRVQpOwkvKiBVbi1yZXNldCB0aGUgbmk1MDEwICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUE9MTCAtIFdhaXQgZm9yIGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgbmk1MDEwX3BvbGwoc3RydWN0IG5pYyAqbmljKQoreworCWludAkJcmN2X3N0YXQ7CisKKwlpZiAoKChyY3Zfc3RhdCA9IGluYihFRExDX1JTVEFUKSkgJiBSU19WQUxJRF9CSVRTKSAhPSBSU19QS1RfT0spIHsKKwkJb3V0YihyY3Zfc3RhdCwgRURMQ19SU1RBVCk7CS8qIENsZWFyIHRoZSBzdGF0dXMgKi8KKwkJcmV0dXJuICgwKTsKKwl9CisgICAgICAgIG91dGIocmN2X3N0YXQsIEVETENfUkNMUik7CS8qIENsZWFyIHRoZSBzdGF0dXMgKi8KKwluaWMtPnBhY2tldGxlbiA9IGludyhJRV9SQ05UKTsKKwkvKiBSZWFkIHBhY2tldCBpbnRvIGJ1ZmZlciAqLworICAgICAgICBvdXRiKE1NX01VWCwgSUVfTU1PREUpOwkvKiBSY3YgYnVmZmVyIHRvIHN5c3RlbSBidXMgKi8KKwlvdXR3KDAsIElFX0dQKTsJCS8qIFNlZWsgdG8gYmVnaW5uaW5nIG9mIHBhY2tldCAqLworCWluc2IoSUVfUkJVRiwgbmljLT5wYWNrZXQsIG5pYy0+cGFja2V0bGVuKTsgCisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitUUkFOU01JVCAtIFRyYW5zbWl0IGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIG5pNTAxMF90cmFuc21pdChzdHJ1Y3QgbmljICpuaWMsCisJY29uc3QgY2hhciAqZCwJLyogRGVzdGluYXRpb24gKi8KKwl1bnNpZ25lZCBpbnQgdCwJLyogVHlwZSAqLworCXVuc2lnbmVkIGludCBzLAkvKiBzaXplICovCisJY29uc3QgY2hhciAqcCkJLyogUGFja2V0ICovCit7CisJdW5zaWduZWQgaW50CWxlbjsKKwlpbnQJCWJ1Zl9vZmZzLCB4bXRfc3RhdDsKKwl1bnNpZ25lZCBsb25nCXRpbWU7CisKKwlsZW4gPSBzICsgRVRIX0hMRU47CisJaWYgKGxlbiA8IEVUSF9aTEVOKQorCQlsZW4gPSBFVEhfWkxFTjsKKwlidWZfb2ZmcyA9IE5JNTAxMF9CVUZTSVpFIC0gbGVuOworCW91dGIoMCwgRURMQ19STUFTSyk7CS8qIE1hc2sgYWxsIHJlY2VpdmUgaW50ZXJydXB0cyAqLworCW91dGIoMCwgSUVfTU1PREUpOwkvKiBQdXQgWG1pdCBidWZmZXIgb24gc3lzdGVtIGJ1cyAqLworCW91dGIoMHhGRiwgRURMQ19SQ0xSKTsJLyogQ2xlYXIgb3V0IHBlbmRpbmcgcmN2IGludGVycnVwdHMgKi8KKwlvdXR3KGJ1Zl9vZmZzLCBJRV9HUCk7CS8qIFBvaW50IEdQIGF0IHN0YXJ0IG9mIHBhY2tldCAqLworCW91dHNiKElFX1hCVUYsIGQsIEVUSF9BTEVOKTsJLyogUHV0IGRzdCBpbiBidWZmZXIgKi8KKwlvdXRzYihJRV9YQlVGLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOy8qIFB1dCBzcmMgaW4gYnVmZmVyICovCisJb3V0Yih0ID4+IDgsIElFX1hCVUYpOworCW91dGIodCwgSUVfWEJVRik7CisJb3V0c2IoSUVfWEJVRiwgcCwgcyk7CS8qIFB1dCBkYXRhIGluIGJ1ZmZlciAqLworCXdoaWxlIChzKysgPCBFVEhfWkxFTiAtIEVUSF9ITEVOKQkvKiBQYWQgdG8gbWluIHNpemUgKi8KKwkJb3V0YigwLCBJRV9YQlVGKTsKKwlvdXR3KGJ1Zl9vZmZzLCBJRV9HUCk7CS8qIFJld3JpdGUgd2hlcmUgcGFja2V0IHN0YXJ0cyAqLworCS8qIHNob3VsZCB3b3JrIHdpdGhvdXQgdGhhdCBvdXRiKCkgKENyeW53ciB1c2VkIGl0KSAqLworCS8qb3V0YihNTV9NVVgsIElFX01NT0RFKTsqLworCS8qIFhtdCBidWZmZXIgdG8gRURMQyBidXMgKi8KKwlvdXRiKE1NX0VOX1hNVCB8IE1NX01VWCwgSUVfTU1PREUpOwkvKiBCZWdpbiB0cmFuc21pc3Npb24gKi8KKwkvKiB3YWl0IGZvciB0cmFuc21pdCBjb21wbGV0ZSAqLworCXdoaWxlICgoKHhtdF9zdGF0ID0gaW5iKElFX0lTVEFUKSkgJiBJU19FTl9YTVQpICE9IDApCisJCTsKKwlyZXNldF9yZWNlaXZlcigpOwkvKiBJbW1lZGlhdGVseSBzd2l0Y2ggdG8gcmVjZWl2ZSAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RJU0FCTEUgLSBUdXJuIG9mZiBldGhlcm5ldCBpbnRlcmZhY2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIG5pNTAxMF9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYykKK3sKKwlvdXRiKDAsIElFX01NT0RFKTsKKwlvdXRiKFJTX1JFU0VULCBFRExDX1JFU0VUKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcmRfcG9ydCh2b2lkKQoreworCWluYihJRV9SQlVGKTsKKwlyZXR1cm4gaW5iKElFX1NBUFJPTSk7Cit9CisKK3N0YXRpYyBpbnQgbmk1MDEwX3Byb2JlMShzdHJ1Y3QgbmljICpuaWMpCit7CisJaW50CQlpLCBib2d1c2NvdW50ID0gNDAsIGRhdGE7CisKKwkvKiBUaGUgdGVzdHMgYXJlIGZyb20gdGhlIExpbnV4IE5JNTAxMCBkcml2ZXIKKwkgICBJIGRvbid0IHVuZGVyc3RhbmQgaXQgYWxsLCBidXQgaWYgaXQgd29ya3MgZm9yIHRoZW0uLi4gICovCisJaWYgKGluYihpb2FkZHIpID09IDB4RkYpCisJCXJldHVybiAoMCk7CisJd2hpbGUgKChyZF9wb3J0KCkgJiByZF9wb3J0KCkgJiByZF9wb3J0KCkKKwkJJiByZF9wb3J0KCkgJiByZF9wb3J0KCkgJiByZF9wb3J0KCkpICE9IDB4RkYpCisJeworCQlpZiAoYm9ndXNjb3VudC0tIDw9IDApCisJCQlyZXR1cm4gKDApOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJaWYgKChkYXRhID0gcmRfcG9ydCgpKSAhPSAweEZGKQorCQkJYnJlYWs7CisJaWYgKGRhdGEgPT0gMHhGRikKKwkJcmV0dXJuICgwKTsKKwlpZiAoZGF0YSA9PSBTQV9BRERSMCAmJiByZF9wb3J0KCkgPT0gU0FfQUREUjEgJiYgcmRfcG9ydCgpID09IFNBX0FERFIyKSB7CisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCQlyZF9wb3J0KCk7CisJCWlmIChyZF9wb3J0KCkgIT0gTkk1MDEwX01BR0lDVkFMMSB8fCByZF9wb3J0KCkgIT0gTkk1MDEwX01BR0lDVkFMMikKKwkJCXJldHVybiAoMCk7CisJfSBlbHNlCisJCXJldHVybiAoMCk7CisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKKwkJb3V0dyhpLCBJRV9HUCk7CisJCW5pYy0+bm9kZV9hZGRyW2ldID0gaW5iKElFX1NBUFJPTSk7CisJfQorCXByaW50ZigiXG5OSTUwMTAgaW9hZGRyICUjaFgsIGFkZHIgJSFcbiIsIGlvYWRkciwgbmljLT5ub2RlX2FkZHIpOworLyogZ2V0IHRoZSBzaXplIG9mIHRoZSBvbmJvYXJkIHJlY2VpdmUgYnVmZmVyCisgKiBoaWdoZXIgYWRkcmVzc2VzIHRoYW4gYnVmc2l6ZSBhcmUgd3JhcHBlZCBpbnRvIHJlYWwgYnVmZmVyCisgKiBpLmUuIGRhdGEgZm9yIG9mZnMuIDB4ODAxIGlzIHdyaXR0ZW4gdG8gMHgxIHdpdGggYSAySyBvbmJvYXJkIGJ1ZmZlcgorICovCisJaWYgKGJ1ZnNpemVfcmN2ID09IDApIHsKKyAgICAgICAgCW91dGIoMSwgSUVfTU1PREUpOyAgICAgIC8qIFB1dCBSY3YgYnVmZmVyIG9uIHN5c3RlbSBidXMgKi8KKyAgICAgICAgCW91dHcoMCwgSUVfR1ApOwkJLyogUG9pbnQgR1AgYXQgc3RhcnQgb2YgcGFja2V0ICovCisgICAgICAgIAlvdXRiKDAsIElFX1JCVUYpOwkvKiBzZXQgYnVmZmVyIGJ5dGUgMCB0byAwICovCisgICAgICAgIAlmb3IgKGkgPSAxOyBpIDwgMHhGRjsgaSsrKSB7CisgICAgICAgICAgICAgICAgCW91dHcoaSA8PCA4LCBJRV9HUCk7IC8qIFBvaW50IEdQIGF0IHBhY2tldCBzaXplIHRvIGJlIHRlc3RlZCAqLworICAgICAgICAgICAgICAgIAlvdXRiKGksIElFX1JCVUYpOworICAgICAgICAgICAgICAgIAlvdXR3KDB4MCwgSUVfR1ApOyAvKiBQb2ludCBHUCBhdCBzdGFydCBvZiBwYWNrZXQgKi8KKyAgICAgICAgICAgICAgICAJZGF0YSA9IGluYihJRV9SQlVGKTsKKyAgICAgICAgICAgICAgICAJaWYgKGRhdGEgPT0gaSkgYnJlYWs7CisgICAgICAgIAl9CisJCWJ1ZnNpemVfcmN2ID0gaSA8PCA4OworICAgICAgICAJb3V0dygwLCBJRV9HUCk7CQkvKiBQb2ludCBHUCBhdCBzdGFydCBvZiBwYWNrZXQgKi8KKyAgICAgICAgCW91dGIoMCwgSUVfUkJVRik7CS8qIHNldCBidWZmZXIgYnl0ZSAwIHRvIDAgYWdhaW4gKi8KKwl9CisJcHJpbnRmKCJCdWZzaXplIHJjdi94bXQ9JWQvJWRcbiIsIGJ1ZnNpemVfcmN2LCBOSTUwMTBfQlVGU0laRSk7CisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQUk9CRSAtIExvb2sgZm9yIGFuIGFkYXB0ZXIsIHRoaXMgcm91dGluZSdzIHZpc2libGUgdG8gdGhlIG91dHNpZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBuaWMgKm5pNTAxMF9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZV9hZGRycykKK3sKKwlzdGF0aWMgdW5zaWduZWQgc2hvcnQJaW9fYWRkcnNbXSA9IHsKKwkJMHgzMDAsIDB4MzIwLCAweDM0MCwgMHgzNjAsIDB4MzgwLCAweDNhMCwgMCB9OworCXVuc2lnbmVkIHNob3J0CQkqcDsKKworCS8qIGlmIHByb2JlX2FkZHJzIGlzIDAsIHRoZW4gdXNlIGxpc3QgYWJvdmUgKi8KKwlpZiAocHJvYmVfYWRkcnMgPT0gMCB8fCAqcHJvYmVfYWRkcnMgPT0gMCkKKwkJcHJvYmVfYWRkcnMgPSBpb19hZGRyczsKKwlmb3IgKHAgPSBwcm9iZV9hZGRyczsgKGlvYWRkciA9ICpwKSAhPSAwOyBwKyspIHsKKwkJaWYgKG5pNTAxMF9wcm9iZTEobmljKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoaW9hZGRyID09IDApCisJCXJldHVybiAoMCk7CisJbmk1MDEwX3Jlc2V0KG5pYyk7CisJLyogcG9pbnQgdG8gTklDIHNwZWNpZmljIHJvdXRpbmVzICovCisJbmljLT5yZXNldCA9IG5pNTAxMF9yZXNldDsKKwluaWMtPnBvbGwgPSBuaTUwMTBfcG9sbDsKKwluaWMtPnRyYW5zbWl0ID0gbmk1MDEwX3RyYW5zbWl0OworCW5pYy0+ZGlzYWJsZSA9IG5pNTAxMF9kaXNhYmxlOworCXJldHVybiAobmljKTsKK30KZGlmZiAtLWdpdCBhL25ldGJvb3QvbmljLmggYi9uZXRib290L25pYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMjM1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L25pYy5oCkBAIC0wLDAgKzEsMzEgQEAKKyAvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmCU5JQ19ICisjZGVmaW5lIE5JQ19ICisKKy8qCisgKglTdHJ1Y3R1cmUgcmV0dXJuZWQgZnJvbSBldGhfcHJvYmUgYW5kIHBhc3NlZCB0byBvdGhlciBkcml2ZXIKKyAqCWZ1bmN0aW9ucy4KKyAqLworCitzdHJ1Y3QgbmljCit7CisJdm9pZAkJKCpyZXNldClQKChzdHJ1Y3QgbmljICopKTsKKwlpbnQJCSgqcG9sbClQKChzdHJ1Y3QgbmljICopKTsKKwl2b2lkCQkoKnRyYW5zbWl0KVAoKHN0cnVjdCBuaWMgKiwgY29uc3QgY2hhciAqZCwKKwkJCQl1bnNpZ25lZCBpbnQgdCwgdW5zaWduZWQgaW50IHMsIGNvbnN0IGNoYXIgKnApKTsKKwl2b2lkCQkoKmRpc2FibGUpUCgoc3RydWN0IG5pYyAqKSk7CisJaW50CQlmbGFnczsJLyogZHJpdmVyIHNwZWNpZmljIGZsYWdzICovCisJc3RydWN0IHJvbV9pbmZvCSpyb21faW5mbzsJLyogLT4gcm9tX2luZm8gZnJvbSBtYWluICovCisJdW5zaWduZWQgY2hhcgkqbm9kZV9hZGRyOworCWNoYXIJCSpwYWNrZXQ7CisJdW5zaWduZWQgaW50CXBhY2tldGxlbjsKKwl2b2lkCQkqcHJpdl9kYXRhOwkvKiBkcml2ZXIgY2FuIGhhbmcgcHJpdmF0ZSBkYXRhIGhlcmUgKi8KK307CisKKyNlbmRpZgkvKiBOSUNfSCAqLwpkaWZmIC0tZ2l0IGEvbmV0Ym9vdC9uczgzOTAuYyBiL25ldGJvb3QvbnM4MzkwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdlYzQ1OQotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvbnM4MzkwLmMKQEAgLTAsMCArMSw4MzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIRVJCT09UIC0gIEJPT1RQL1RGVFAgQm9vdHN0cmFwIFByb2dyYW0KKworQXV0aG9yOiBNYXJ0aW4gUmVudGVycworICBEYXRlOiBNYXkvOTQKKworIFRoaXMgY29kZSBpcyBiYXNlZCBoZWF2aWx5IG9uIERhdmlkIEdyZWVubWFuJ3MgaWZfZWQuYyBkcml2ZXIKKworIENvcHlyaWdodCAoQykgMTk5My0xOTk0LCBEYXZpZCBHcmVlbm1hbiwgTWFydGluIFJlbnRlcnMuCisgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQsIG1vZGlmaWVkLCBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgc29sZCwgaW4KKyAgYm90aCBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBhbmQgdGhlc2UKKyAgdGVybXMgYXJlIHJldGFpbmVkLiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIGFyZSB0aGUgYXV0aG9ycyByZXNwb25zaWJsZSBmb3IKKyAgdGhlIHByb3BlciBmdW5jdGlvbmluZyBvZiB0aGlzIHNvZnR3YXJlLCBub3IgZG8gdGhlIGF1dGhvcnMgYXNzdW1lIGFueQorICByZXNwb25zaWJpbGl0eSBmb3IgZGFtYWdlcyBpbmN1cnJlZCB3aXRoIGl0cyB1c2UuCisKKzNjNTAzIHN1cHBvcnQgYWRkZWQgYnkgQmlsbCBQYXVsICh3cGF1bEBjdHIuY29sdW1iaWEuZWR1KSBvbiAxMS8xNS85NAorU01DODQxNiBzdXBwb3J0IGFkZGVkIGJ5IEJpbGwgUGF1bCAod3BhdWxAY3RyLmNvbHVtYmlhLmVkdSkgb24gMTIvMjUvOTQKKzNjNTAzIFBJTyBzdXBwb3J0IGFkZGVkIGJ5IEppbSBIYWd1ZSAoamltLmhhZ3VlQGFjbS5vcmcpIG9uIDIvMTcvOTgKK1JYIG92ZXJydW4gYnkgS2xhdXMgRXNwZW5sYXViIChlc3BlbmxhdWJAaW5mb3JtYXRpay51bmktdWxtLmRlKSBvbiAzLzEwLzk5CisgIHBhcnRzIHRha2VuIGZyb20gdGhlIExpbnV4IDgzOTAgZHJpdmVyIChieSBEb25hbGQgQmVja2VyIGFuZCBQYXVsIEdvcnRtYWtlcikKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJldGhlcmJvb3QuaCIKKyNpbmNsdWRlICJuaWMuaCIKKyNpbmNsdWRlICJuczgzOTAuaCIKKyNpZmRlZglJTkNMVURFX05TODM5MAorI2luY2x1ZGUgInBjaS5oIgorI2VuZGlmCisjaW5jbHVkZSAiY2FyZHMuaCIKKworc3RhdGljIHVuc2lnbmVkIGNoYXIJZXRoX3ZlbmRvciwgZXRoX2ZsYWdzLCBldGhfbGFhcjsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAlldGhfbmljX2Jhc2UsIGV0aF9hc2ljX2Jhc2U7CitzdGF0aWMgdW5zaWduZWQgY2hhcglldGhfbWVtc2l6ZSwgZXRoX3J4X3N0YXJ0LCBldGhfdHhfc3RhcnQ7CitzdGF0aWMgQWRkcmVzcwkJZXRoX2JtZW0sIGV0aF9ybWVtOworc3RhdGljIHVuc2lnbmVkIGNoYXIJZXRoX2RyYWluX3JlY2VpdmVyOworCisjaWZkZWYJSU5DTFVERV9XRAorc3RhdGljIHN0cnVjdCB3ZF9ib2FyZCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljaGFyIGlkOworCWNoYXIgZmxhZ3M7CisJY2hhciBtZW1zaXplOworfSB3ZF9ib2FyZHNbXSA9IHsKKwl7IldEODAwM1MiLAlUWVBFX1dEODAwM1MsCTAsCQkJTUVNXzgxOTJ9LAorCXsiV0Q4MDAzRSIsCVRZUEVfV0Q4MDAzRSwJMCwJCQlNRU1fODE5Mn0sCisJeyJXRDgwMTNFQlQiLAlUWVBFX1dEODAxM0VCVCwJRkxBR18xNkJJVCwJCU1FTV8xNjM4NH0sCisJeyJXRDgwMDNXIiwJVFlQRV9XRDgwMDNXLAkwLAkJCU1FTV84MTkyfSwKKwl7IldEODAwM0VCIiwJVFlQRV9XRDgwMDNFQiwJMCwJCQlNRU1fODE5Mn0sCisJeyJXRDgwMTNXIiwJVFlQRV9XRDgwMTNXLAlGTEFHXzE2QklULAkJTUVNXzE2Mzg0fSwKKwl7IldEODAwM0VQL1dEODAxM0VQIiwKKwkJCVRZUEVfV0Q4MDEzRVAsCTAsCQkJTUVNXzgxOTJ9LAorCXsiV0Q4MDEzV0MiLAlUWVBFX1dEODAxM1dDLAlGTEFHXzE2QklULAkJTUVNXzE2Mzg0fSwKKwl7IldEODAxM0VQQyIsCVRZUEVfV0Q4MDEzRVBDLAlGTEFHXzE2QklULAkJTUVNXzE2Mzg0fSwKKwl7IlNNQzgyMTZUIiwJVFlQRV9TTUM4MjE2VCwJRkxBR18xNkJJVCB8IEZMQUdfNzkwLAlNRU1fMTYzODR9LAorCXsiU01DODIxNkMiLAlUWVBFX1NNQzgyMTZDLAlGTEFHXzE2QklUIHwgRkxBR183OTAsCU1FTV8xNjM4NH0sCisJeyJTTUM4NDE2VCIsCVRZUEVfU01DODQxNlQsCUZMQUdfMTZCSVQgfCBGTEFHXzc5MCwJTUVNXzgxOTJ9LAorCXsiU01DODQxNkMvQlQiLAlUWVBFX1NNQzg0MTZDLAlGTEFHXzE2QklUIHwgRkxBR183OTAsCU1FTV84MTkyfSwKKwl7IlNNQzgwMTNFQlAiLAlUWVBFX1NNQzgwMTNFQlAsRkxBR18xNkJJVCwJCU1FTV8xNjM4NH0sCisJe05VTEwsCQkwLAkJMCwJCQkwfQorfTsKKyNlbmRpZgorCisjaWZkZWYJSU5DTFVERV8zQzUwMworc3RhdGljIHVuc2lnbmVkIGNoYXIJdDUwM19vdXRwdXQ7CS8qIEFVSSBvciBpbnRlcm5hbCB4Y3ZyIChUaGlubmV0KSAqLworI2VuZGlmCisKKyNpZglkZWZpbmVkKElOQ0xVREVfV0QpCisjZGVmaW5lCWV0aF9wcm9iZQl3ZF9wcm9iZQorI2lmCWRlZmluZWQoSU5DTFVERV8zQzUwMykgfHwgZGVmaW5lZChJTkNMVURFX05FKSB8fCBkZWZpbmVkKElOQ0xVREVfTlM4MzkwKQorRXJyb3IgeW91IG11c3Qgb25seSBkZWZpbmUgb25lIG9mIElOQ0xVREVfV0QsIElOQ0xVREVfM0M1MDMsIElOQ0xVREVfTkUsIElOQ0xVREVfTlM4MzkwCisjZW5kaWYKKyNlbmRpZgorCisjaWYJZGVmaW5lZChJTkNMVURFXzNDNTAzKQorI2RlZmluZQlldGhfcHJvYmUJdDUwM19wcm9iZQorI2lmCWRlZmluZWQoSU5DTFVERV9ORSkgfHwgZGVmaW5lZChJTkNMVURFX05TODM5MCkgfHwgZGVmaW5lZChJTkNMVURFX1dEKQorRXJyb3IgeW91IG11c3Qgb25seSBkZWZpbmUgb25lIG9mIElOQ0xVREVfV0QsIElOQ0xVREVfM0M1MDMsIElOQ0xVREVfTkUsIElOQ0xVREVfTlM4MzkwCisjZW5kaWYKKyNlbmRpZgorCisjaWYJZGVmaW5lZChJTkNMVURFX05FKQorI2RlZmluZQlldGhfcHJvYmUJbmVfcHJvYmUKKyNpZglkZWZpbmVkKElOQ0xVREVfTlM4MzkwKSB8fCBkZWZpbmVkKElOQ0xVREVfM0M1MDMpIHx8IGRlZmluZWQoSU5DTFVERV9XRCkKK0Vycm9yIHlvdSBtdXN0IG9ubHkgZGVmaW5lIG9uZSBvZiBJTkNMVURFX1dELCBJTkNMVURFXzNDNTAzLCBJTkNMVURFX05FLCBJTkNMVURFX05TODM5MAorI2VuZGlmCisjZW5kaWYKKworI2lmCWRlZmluZWQoSU5DTFVERV9OUzgzOTApCisjZGVmaW5lCWV0aF9wcm9iZQluZXBjaV9wcm9iZQorI2lmCWRlZmluZWQoSU5DTFVERV9ORSkgfHwgZGVmaW5lZChJTkNMVURFXzNDNTAzKSB8fCBkZWZpbmVkKElOQ0xVREVfV0QpCitFcnJvciB5b3UgbXVzdCBvbmx5IGRlZmluZSBvbmUgb2YgSU5DTFVERV9XRCwgSU5DTFVERV8zQzUwMywgSU5DTFVERV9ORSwgSU5DTFVERV9OUzgzOTAKKyNlbmRpZgorI2VuZGlmCisKKyNpZglkZWZpbmVkKElOQ0xVREVfM0M1MDMpCisjZGVmaW5lCUFTSUNfUElPCV8zQ09NX1JGTVNCCisjZWxzZQorI2lmCWRlZmluZWQoSU5DTFVERV9ORSkgfHwgZGVmaW5lZChJTkNMVURFX05TODM5MCkKKyNkZWZpbmUJQVNJQ19QSU8JTkVfREFUQQorI2VuZGlmCisjZW5kaWYKKworI2lmCWRlZmluZWQoSU5DTFVERV9ORSkgfHwgZGVmaW5lZChJTkNMVURFX05TODM5MCkgfHwgKGRlZmluZWQoSU5DTFVERV8zQzUwMykgJiYgIWRlZmluZWQoVDUwM19TSE1FTSkpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0VUSF9QSU9fUkVBRCAtIFJlYWQgYSBmcmFtZSB2aWEgUHJvZ3JhbW1lZCBJL08KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZXRoX3Bpb19yZWFkKHVuc2lnbmVkIGludCBzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgdW5zaWduZWQgaW50IGNudCkKK3sKKwlpZiAoZXRoX2ZsYWdzICYgRkxBR18xNkJJVCkgeyArK2NudDsgY250ICY9IH4xOyB9CisJb3V0YihEODM5MF9DT01NQU5EX1JEMiB8CisJCUQ4MzkwX0NPTU1BTkRfU1RBLCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9DT01NQU5EKTsKKwlvdXRiKGNudCwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfUkJDUjApOworCW91dGIoY250Pj44LCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9SQkNSMSk7CisJb3V0YihzcmMsIGV0aF9uaWNfYmFzZSArIEQ4MzkwX1AwX1JTQVIwKTsKKwlvdXRiKHNyYz4+OCwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfUlNBUjEpOworCW91dGIoRDgzOTBfQ09NTUFORF9SRDAgfAorCQlEODM5MF9DT01NQU5EX1NUQSwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfQ09NTUFORCk7CisKKyNpZmRlZglJTkNMVURFXzNDNTAzCisJb3V0YihzcmMgJiAweGZmLCBldGhfYXNpY19iYXNlICsgXzNDT01fREFMU0IpOworCW91dGIoc3JjID4+IDgsIGV0aF9hc2ljX2Jhc2UgKyBfM0NPTV9EQU1TQik7CisJb3V0Yih0NTAzX291dHB1dCB8IF8zQ09NX0NSX1NUQVJULCBldGhfYXNpY19iYXNlICsgXzNDT01fQ1IpOworI2VuZGlmCisKKwlpZiAoZXRoX2ZsYWdzICYgRkxBR18xNkJJVCkKKwkJY250ID4+PSAxOworCisJd2hpbGUoY250LS0pIHsKKyNpZmRlZglJTkNMVURFXzNDNTAzCisJCXdoaWxlKChpbmIoZXRoX2FzaWNfYmFzZSArIF8zQ09NX1NUUkVHKSAmIF8zQ09NX1NUUkVHX0RQUkRZKSA9PSAwKQorCQkJOworI2VuZGlmCisKKwkJaWYgKGV0aF9mbGFncyAmIEZMQUdfMTZCSVQpIHsKKwkJCSooKHVuc2lnbmVkIHNob3J0ICopZHN0KSA9IGludyhldGhfYXNpY19iYXNlICsgQVNJQ19QSU8pOworCQkJZHN0ICs9IDI7CisJCX0KKwkJZWxzZQorCQkJKihkc3QrKykgPSBpbmIoZXRoX2FzaWNfYmFzZSArIEFTSUNfUElPKTsKKwl9CisKKyNpZmRlZglJTkNMVURFXzNDNTAzCisJb3V0Yih0NTAzX291dHB1dCwgZXRoX2FzaWNfYmFzZSArIF8zQ09NX0NSKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0VUSF9QSU9fV1JJVEUgLSBXcml0ZSBhIGZyYW1lIHZpYSBQcm9ncmFtbWVkIEkvTworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBldGhfcGlvX3dyaXRlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgaW50IGRzdCwgdW5zaWduZWQgaW50IGNudCkKK3sKKyNpZmRlZglDT01QRVhfUkwyMDAwX0ZJWAorCXVuc2lnbmVkIGludCB4OworI2VuZGlmCS8qIENPTVBFWF9STDIwMDBfRklYICovCisJaWYgKGV0aF9mbGFncyAmIEZMQUdfMTZCSVQpIHsgKytjbnQ7IGNudCAmPSB+MTsgfQorCW91dGIoRDgzOTBfQ09NTUFORF9SRDIgfAorCQlEODM5MF9DT01NQU5EX1NUQSwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfQ09NTUFORCk7CisJb3V0YihEODM5MF9JU1JfUkRDLCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9JU1IpOworCW91dGIoY250LCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9SQkNSMCk7CisJb3V0YihjbnQ+PjgsIGV0aF9uaWNfYmFzZSArIEQ4MzkwX1AwX1JCQ1IxKTsKKwlvdXRiKGRzdCwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfUlNBUjApOworCW91dGIoZHN0Pj44LCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9SU0FSMSk7CisJb3V0YihEODM5MF9DT01NQU5EX1JEMSB8CisJCUQ4MzkwX0NPTU1BTkRfU1RBLCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9DT01NQU5EKTsKKworI2lmZGVmCUlOQ0xVREVfM0M1MDMKKwlvdXRiKGRzdCAmIDB4ZmYsIGV0aF9hc2ljX2Jhc2UgKyBfM0NPTV9EQUxTQik7CisJb3V0Yihkc3QgPj4gOCwgZXRoX2FzaWNfYmFzZSArIF8zQ09NX0RBTVNCKTsKKworCW91dGIodDUwM19vdXRwdXQgfCBfM0NPTV9DUl9ERElSIHwgXzNDT01fQ1JfU1RBUlQsIGV0aF9hc2ljX2Jhc2UgKyBfM0NPTV9DUik7CisjZW5kaWYKKworCWlmIChldGhfZmxhZ3MgJiBGTEFHXzE2QklUKQorCQljbnQgPj49IDE7CisKKwl3aGlsZShjbnQtLSkKKwl7CisjaWZkZWYJSU5DTFVERV8zQzUwMworCQl3aGlsZSgoaW5iKGV0aF9hc2ljX2Jhc2UgKyBfM0NPTV9TVFJFRykgJiBfM0NPTV9TVFJFR19EUFJEWSkgPT0gMCkKKwkJCTsKKyNlbmRpZgorCisJCWlmIChldGhfZmxhZ3MgJiBGTEFHXzE2QklUKSB7CisJCQlvdXR3KCooKHVuc2lnbmVkIHNob3J0ICopc3JjKSwgZXRoX2FzaWNfYmFzZSArIEFTSUNfUElPKTsKKwkJCXNyYyArPSAyOworCQl9CisJCWVsc2UKKwkJCW91dGIoKihzcmMrKyksIGV0aF9hc2ljX2Jhc2UgKyBBU0lDX1BJTyk7CisJfQorCisjaWZkZWYJSU5DTFVERV8zQzUwMworCW91dGIodDUwM19vdXRwdXQsIGV0aF9hc2ljX2Jhc2UgKyBfM0NPTV9DUik7CisjZWxzZQorI2lmZGVmCUNPTVBFWF9STDIwMDBfRklYCisJZm9yICh4ID0gMDsKKwkJeCA8IENPTVBFWF9STDIwMDBfVFJJRVMgJiYKKwkJKGluYihldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9JU1IpICYgRDgzOTBfSVNSX1JEQykKKwkJIT0gRDgzOTBfSVNSX1JEQzsKKwkJKyt4KTsKKwlpZiAoeCA+PSBDT01QRVhfUkwyMDAwX1RSSUVTKQorCQlwcmludGYoIldhcm5pbmc6IENvbXBleCBSTDIwMDAgYWJvcnRlZCB3YWl0IVxuIik7CisjZW5kaWYJLyogQ09NUEVYX1JMMjAwMF9GSVggKi8KKwl3aGlsZSgoaW5iKGV0aF9uaWNfYmFzZSArIEQ4MzkwX1AwX0lTUikgJiBEODM5MF9JU1JfUkRDKQorCQkhPSBEODM5MF9JU1JfUkRDKTsKKyNlbmRpZgorfQorI2Vsc2UKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIX1BJT19SRUFEIC0gRHVtbXkgcm91dGluZSB3aGVuIE5FMjAwMCBub3QgY29tcGlsZWQgaW4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZXRoX3Bpb19yZWFkKHVuc2lnbmVkIGludCBzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgdW5zaWduZWQgaW50IGNudCkge30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK05TODM5MF9SRVNFVCAtIFJlc2V0IGFkYXB0ZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbnM4MzkwX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKK3sKKwlpbnQgaTsKKworCWV0aF9kcmFpbl9yZWNlaXZlciA9IDA7CisjaWZkZWYJSU5DTFVERV9XRAorCWlmIChldGhfZmxhZ3MgJiBGTEFHXzc5MCkKKwkJb3V0YihEODM5MF9DT01NQU5EX1BTMCB8IEQ4MzkwX0NPTU1BTkRfU1RQLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfQ09NTUFORCk7CisJZWxzZQorI2VuZGlmCisJCW91dGIoRDgzOTBfQ09NTUFORF9QUzAgfCBEODM5MF9DT01NQU5EX1JEMiB8CisJCQlEODM5MF9DT01NQU5EX1NUUCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX0NPTU1BTkQpOworCWlmIChldGhfZmxhZ3MgJiBGTEFHXzE2QklUKQorCQlvdXRiKDB4NDksIGV0aF9uaWNfYmFzZStEODM5MF9QMF9EQ1IpOworCWVsc2UKKwkJb3V0YigweDQ4LCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfRENSKTsKKwlvdXRiKDAsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9SQkNSMCk7CisJb3V0YigwLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfUkJDUjEpOworCW91dGIoMHgyMCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1JDUik7CS8qIG1vbml0b3IgbW9kZSAqLworCW91dGIoMiwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1RDUik7CisJb3V0YihldGhfdHhfc3RhcnQsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9UUFNSKTsKKwlvdXRiKGV0aF9yeF9zdGFydCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1BTVEFSVCk7CisjaWZkZWYJSU5DTFVERV9XRAorCWlmIChldGhfZmxhZ3MgJiBGTEFHXzc5MCkgb3V0YigwLCBldGhfbmljX2Jhc2UgKyAweDA5KTsKKyNlbmRpZgorCW91dGIoZXRoX21lbXNpemUsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9QU1RPUCk7CisJb3V0YihldGhfbWVtc2l6ZSAtIDEsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9CT1VORCk7CisJb3V0YigweEZGLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfSVNSKTsKKwlvdXRiKDAsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9JTVIpOworI2lmZGVmCUlOQ0xVREVfV0QKKwlpZiAoZXRoX2ZsYWdzICYgRkxBR183OTApCisJCW91dGIoRDgzOTBfQ09NTUFORF9QUzEgfAorCQkJRDgzOTBfQ09NTUFORF9TVFAsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9DT01NQU5EKTsKKwllbHNlCisjZW5kaWYKKwkJb3V0YihEODM5MF9DT01NQU5EX1BTMSB8CisJCQlEODM5MF9DT01NQU5EX1JEMiB8IEQ4MzkwX0NPTU1BTkRfU1RQLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfQ09NTUFORCk7CisJZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykKKwkJb3V0YihuaWMtPm5vZGVfYWRkcltpXSwgZXRoX25pY19iYXNlK0Q4MzkwX1AxX1BBUjAraSk7CisJZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykKKwkJb3V0YigweEZGLCBldGhfbmljX2Jhc2UrRDgzOTBfUDFfTUFSMCtpKTsKKwlvdXRiKGV0aF9yeF9zdGFydCwgZXRoX25pY19iYXNlK0Q4MzkwX1AxX0NVUlIpOworI2lmZGVmCUlOQ0xVREVfV0QKKwlpZiAoZXRoX2ZsYWdzICYgRkxBR183OTApCisJCW91dGIoRDgzOTBfQ09NTUFORF9QUzAgfAorCQkJRDgzOTBfQ09NTUFORF9TVEEsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9DT01NQU5EKTsKKwllbHNlCisjZW5kaWYKKwkJb3V0YihEODM5MF9DT01NQU5EX1BTMCB8CisJCQlEODM5MF9DT01NQU5EX1JEMiB8IEQ4MzkwX0NPTU1BTkRfU1RBLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfQ09NTUFORCk7CisJb3V0YigweEZGLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfSVNSKTsKKwlvdXRiKDAsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9UQ1IpOworCW91dGIoNCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1JDUik7CS8qIGFsbG93IGJyb2FkY2FzdCBmcmFtZXMgKi8KKworI2lmZGVmCUlOQ0xVREVfM0M1MDMKKyAgICAgICAgLyoKKyAgICAgICAgICogTm8gd2F5IHRvIHRlbGwgd2hldGhlciBvciBub3Qgd2UncmUgc3VwcG9zZWQgdG8gdXNlCisgICAgICAgICAqIHRoZSAzQ29tJ3MgdHJhbnNjZWl2ZXIgdW5sZXNzIHRoZSB1c2VyIHRlbGxzIHVzLgorICAgICAgICAgKiAnZmxhZ3MnIHNob3VsZCBoYXZlIHNvbWUgY29tcGlsZSB0aW1lIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgICogd2hpY2ggY2FuIGJlIGNoYW5nZWQgZnJvbSB0aGUgY29tbWFuZCBtZW51LgorICAgICAgICAgKi8KKwl0NTAzX291dHB1dCA9IChuaWMtPmZsYWdzKSA/IDAgOiBfM0NPTV9DUl9YU0VMOworCW91dGIodDUwM19vdXRwdXQsIGV0aF9hc2ljX2Jhc2UgKyBfM0NPTV9DUik7CisjZW5kaWYKK30KKworc3RhdGljIGludCBuczgzOTBfcG9sbChzdHJ1Y3QgbmljICpuaWMpOworCisjaWZuZGVmCUlOQ0xVREVfM0M1MDMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIX1JYX09WRVJSVU4gLSBCcmluZyBhZGFwdGVyIGJhY2sgdG8gd29yayBhZnRlciBhbiBSWCBvdmVycnVuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGV0aF9yeF9vdmVycnVuKHN0cnVjdCBuaWMgKm5pYykKK3sKKwlpbnQgc3RhcnRfdGltZTsKKworI2lmZGVmCUlOQ0xVREVfV0QKKwlpZiAoZXRoX2ZsYWdzICYgRkxBR183OTApCisJCW91dGIoRDgzOTBfQ09NTUFORF9QUzAgfCBEODM5MF9DT01NQU5EX1NUUCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX0NPTU1BTkQpOworCWVsc2UKKyNlbmRpZgorCQlvdXRiKEQ4MzkwX0NPTU1BTkRfUFMwIHwgRDgzOTBfQ09NTUFORF9SRDIgfAorCQkJRDgzOTBfQ09NTUFORF9TVFAsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9DT01NQU5EKTsKKworCS8qIHdhaXQgZm9yIGF0IGxlYXN0IDEuNm1zIC0gd2Ugd2FpdCBvbmUgdGltZXIgdGljayAqLworCXN0YXJ0X3RpbWUgPSBjdXJydGlja3MoKTsKKwl3aGlsZSAoY3VycnRpY2tzKCkgLSBzdGFydF90aW1lIDw9IDEpCisJCS8qIE5vdGhpbmcgKi87CisKKwlvdXRiKDAsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9SQkNSMCk7CS8qIHJlc2V0IGJ5dGUgY291bnRlciAqLworCW91dGIoMCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1JCQ1IxKTsKKworCS8qCisJICogTGludXggZHJpdmVyIGNoZWNrcyBmb3IgaW50ZXJydXB0ZWQgVFggaGVyZS4gVGhpcyBpcyBub3QgbmVjZXNzYXJ5LAorCSAqIGJlY2F1c2UgdGhlIHRyYW5zbWl0IHJvdXRpbmUgd2FpdHMgdW50aWwgdGhlIGZyYW1lIGlzIHNlbnQuCisJICovCisKKwkvKiBlbnRlciBsb29wYmFjayBtb2RlIGFuZCByZXN0YXJ0IE5JQyAqLworCW91dGIoMiwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1RDUik7CisjaWZkZWYJSU5DTFVERV9XRAorCWlmIChldGhfZmxhZ3MgJiBGTEFHXzc5MCkKKwkJb3V0YihEODM5MF9DT01NQU5EX1BTMCB8IEQ4MzkwX0NPTU1BTkRfU1RBLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfQ09NTUFORCk7CisJZWxzZQorI2VuZGlmCisJCW91dGIoRDgzOTBfQ09NTUFORF9QUzAgfCBEODM5MF9DT01NQU5EX1JEMiB8CisJCQlEODM5MF9DT01NQU5EX1NUQSwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX0NPTU1BTkQpOworCisJLyogY2xlYXIgdGhlIFJYIHJpbmcsIGFja25vd2xlZGdlIG92ZXJydW4gaW50ZXJydXB0ICovCisJZXRoX2RyYWluX3JlY2VpdmVyID0gMTsKKwl3aGlsZSAobnM4MzkwX3BvbGwobmljKSkKKwkJLyogTm90aGluZyAqLzsKKwlldGhfZHJhaW5fcmVjZWl2ZXIgPSAwOworCW91dGIoRDgzOTBfSVNSX09WVywgZXRoX25pY19iYXNlK0Q4MzkwX1AwX0lTUik7CisKKwkvKiBsZWF2ZSBsb29wYmFjayBtb2RlIC0gbm8gcGFja2V0cyB0byBiZSByZXNlbnQgKHNlZSBMaW51eCBkcml2ZXIpICovCisJb3V0YigwLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfVENSKTsKK30KKyNlbmRpZgkvKiBJTkNMVURFXzNDNTAzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTlM4MzkwX1RSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBuczgzOTBfdHJhbnNtaXQoCisJc3RydWN0IG5pYyAqbmljLAorCWNvbnN0IGNoYXIgKmQsCQkJLyogRGVzdGluYXRpb24gKi8KKwl1bnNpZ25lZCBpbnQgdCwJCQkvKiBUeXBlICovCisJdW5zaWduZWQgaW50IHMsCQkJLyogc2l6ZSAqLworCWNvbnN0IGNoYXIgKnApCQkJLyogUGFja2V0ICovCit7CisjaWZkZWYJSU5DTFVERV8zQzUwMworICAgICAgICBpZiAoIShldGhfZmxhZ3MgJiBGTEFHX1BJTykpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKilldGhfYm1lbSwgZCwgRVRIX0FMRU4pOwkvKiBkc3QgKi8KKyAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKilldGhfYm1lbStFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsgLyogc3JjICovCisgICAgICAgICAgICAgICAgKigoY2hhciAqKWV0aF9ibWVtKzEyKSA9IHQ+Pjg7CQkvKiB0eXBlICovCisgICAgICAgICAgICAgICAgKigoY2hhciAqKWV0aF9ibWVtKzEzKSA9IHQ7CisgICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopZXRoX2JtZW0rRVRIX0hMRU4sIHAsIHMpOworICAgICAgICAgICAgICAgIHMgKz0gRVRIX0hMRU47CisgICAgICAgICAgICAgICAgd2hpbGUgKHMgPCBFVEhfWkxFTikgKigoY2hhciAqKWV0aF9ibWVtKyhzKyspKSA9IDA7CisgICAgICAgIH0KKyNlbmRpZgorCisjaWZkZWYJSU5DTFVERV9XRAorCS8qIE1lbW9yeSBpbnRlcmZhY2UgKi8KKwlpZiAoZXRoX2ZsYWdzICYgRkxBR18xNkJJVCkgeworCQlvdXRiKGV0aF9sYWFyIHwgV0RfTEFBUl9NMTZFTiwgZXRoX2FzaWNfYmFzZSArIFdEX0xBQVIpOworCQlpbmIoMHg4NCk7CisJfQorCWlmIChldGhfZmxhZ3MgJiBGTEFHXzc5MCkgeworCQlvdXRiKFdEX01TUl9NRU5CLCBldGhfYXNpY19iYXNlICsgV0RfTVNSKTsKKwkJaW5iKDB4ODQpOworCX0KKwlpbmIoMHg4NCk7CisJbWVtY3B5KChjaGFyICopZXRoX2JtZW0sIGQsIEVUSF9BTEVOKTsJLyogZHN0ICovCisJbWVtY3B5KChjaGFyICopZXRoX2JtZW0rRVRIX0FMRU4sIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7IC8qIHNyYyAqLworCSooKGNoYXIgKilldGhfYm1lbSsxMikgPSB0Pj44OwkJLyogdHlwZSAqLworCSooKGNoYXIgKilldGhfYm1lbSsxMykgPSB0OworCW1lbWNweSgoY2hhciAqKWV0aF9ibWVtK0VUSF9ITEVOLCBwLCBzKTsKKwlzICs9IEVUSF9ITEVOOworCXdoaWxlIChzIDwgRVRIX1pMRU4pICooKGNoYXIgKilldGhfYm1lbSsocysrKSkgPSAwOworCWlmIChldGhfZmxhZ3MgJiBGTEFHXzc5MCkgeworCQlvdXRiKDAsIGV0aF9hc2ljX2Jhc2UgKyBXRF9NU1IpOworCQlpbmIoMHg4NCk7CisJfQorCWlmIChldGhfZmxhZ3MgJiBGTEFHXzE2QklUKSB7CisJCW91dGIoZXRoX2xhYXIgJiB+V0RfTEFBUl9NMTZFTiwgZXRoX2FzaWNfYmFzZSArIFdEX0xBQVIpOworCQlpbmIoMHg4NCk7CisJfQorI2VuZGlmCisKKyNpZglkZWZpbmVkKElOQ0xVREVfM0M1MDMpCisJaWYgKGV0aF9mbGFncyAmIEZMQUdfUElPKSB7CisjZW5kaWYKKyNpZglkZWZpbmVkKElOQ0xVREVfTkUpIHx8IGRlZmluZWQoSU5DTFVERV9OUzgzOTApIHx8IChkZWZpbmVkKElOQ0xVREVfM0M1MDMpICYmICFkZWZpbmVkKFQ1MDNfU0hNRU0pKQorCQkvKiBQcm9ncmFtbWVkIEkvTyAqLworCQl1bnNpZ25lZCBzaG9ydCB0eXBlOworCQl0eXBlID0gKHQgPj4gOCkgfCAodCA8PCA4KTsKKwkJZXRoX3Bpb193cml0ZShkLCBldGhfdHhfc3RhcnQ8PDgsIEVUSF9BTEVOKTsKKwkJZXRoX3Bpb193cml0ZShuaWMtPm5vZGVfYWRkciwgKGV0aF90eF9zdGFydDw8OCkrRVRIX0FMRU4sIEVUSF9BTEVOKTsKKwkJLyogYmNjIGdlbmVyYXRlcyB3b3JzZSBjb2RlIHdpdGhvdXQgKGNvbnN0K2NvbnN0KSBiZWxvdyAqLworCQlldGhfcGlvX3dyaXRlKCh1bnNpZ25lZCBjaGFyICopJnR5cGUsIChldGhfdHhfc3RhcnQ8PDgpKyhFVEhfQUxFTitFVEhfQUxFTiksIDIpOworCQlldGhfcGlvX3dyaXRlKHAsIChldGhfdHhfc3RhcnQ8PDgpK0VUSF9ITEVOLCBzKTsKKwkJcyArPSBFVEhfSExFTjsKKwkJaWYgKHMgPCBFVEhfWkxFTikgcyA9IEVUSF9aTEVOOworI2VuZGlmCisjaWYJZGVmaW5lZChJTkNMVURFXzNDNTAzKQorCX0KKyNlbmRpZgorCisjaWZkZWYJSU5DTFVERV9XRAorCWlmIChldGhfZmxhZ3MgJiBGTEFHXzc5MCkKKwkJb3V0YihEODM5MF9DT01NQU5EX1BTMCB8CisJCQlEODM5MF9DT01NQU5EX1NUQSwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX0NPTU1BTkQpOworCWVsc2UKKyNlbmRpZgorCQlvdXRiKEQ4MzkwX0NPTU1BTkRfUFMwIHwKKwkJCUQ4MzkwX0NPTU1BTkRfUkQyIHwgRDgzOTBfQ09NTUFORF9TVEEsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9DT01NQU5EKTsKKwlvdXRiKGV0aF90eF9zdGFydCwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1RQU1IpOworCW91dGIocywgZXRoX25pY19iYXNlK0Q4MzkwX1AwX1RCQ1IwKTsKKwlvdXRiKHM+PjgsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9UQkNSMSk7CisjaWZkZWYJSU5DTFVERV9XRAorCWlmIChldGhfZmxhZ3MgJiBGTEFHXzc5MCkKKwkJb3V0YihEODM5MF9DT01NQU5EX1BTMCB8CisJCQlEODM5MF9DT01NQU5EX1RYUCB8IEQ4MzkwX0NPTU1BTkRfU1RBLCBldGhfbmljX2Jhc2UrRDgzOTBfUDBfQ09NTUFORCk7CisJZWxzZQorI2VuZGlmCisJCW91dGIoRDgzOTBfQ09NTUFORF9QUzAgfAorCQkJRDgzOTBfQ09NTUFORF9UWFAgfCBEODM5MF9DT01NQU5EX1JEMiB8CisJCQlEODM5MF9DT01NQU5EX1NUQSwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX0NPTU1BTkQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK05TODM5MF9QT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IG5zODM5MF9wb2xsKHN0cnVjdCBuaWMgKm5pYykKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBjaGFyIHJzdGF0LCBjdXJyLCBuZXh0OworCXVuc2lnbmVkIHNob3J0IGxlbiwgZnJhZzsKKwl1bnNpZ25lZCBzaG9ydCBwa3RvZmY7CisJdW5zaWduZWQgY2hhciAqcDsKKwlzdHJ1Y3QgcmluZ2J1ZmZlciBwa3RoZHI7CisKKyNpZm5kZWYJSU5DTFVERV8zQzUwMworCS8qIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbjogc2VlIGV0aF9yeF9vdmVycnVuKCkgKi8KKwlpZiAoIWV0aF9kcmFpbl9yZWNlaXZlciAmJiAoaW5iKGV0aF9uaWNfYmFzZStEODM5MF9QMF9JU1IpICYgRDgzOTBfSVNSX09WVykpIHsKKwkJZXRoX3J4X292ZXJydW4obmljKTsKKwkJcmV0dXJuKDApOworCX0KKyNlbmRpZgkvKiBJTkNMVURFXzNDNTAzICovCisJcnN0YXQgPSBpbmIoZXRoX25pY19iYXNlK0Q4MzkwX1AwX1JTUik7CisJaWYgKCEocnN0YXQgJiBEODM5MF9SU1RBVF9QUlgpKSByZXR1cm4oMCk7CisJbmV4dCA9IGluYihldGhfbmljX2Jhc2UrRDgzOTBfUDBfQk9VTkQpKzE7CisJaWYgKG5leHQgPj0gZXRoX21lbXNpemUpIG5leHQgPSBldGhfcnhfc3RhcnQ7CisJb3V0YihEODM5MF9DT01NQU5EX1BTMSwgZXRoX25pY19iYXNlK0Q4MzkwX1AwX0NPTU1BTkQpOworCWN1cnIgPSBpbmIoZXRoX25pY19iYXNlK0Q4MzkwX1AxX0NVUlIpOworCW91dGIoRDgzOTBfQ09NTUFORF9QUzAsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9DT01NQU5EKTsKKwlpZiAoY3VyciA+PSBldGhfbWVtc2l6ZSkgY3Vycj1ldGhfcnhfc3RhcnQ7CisJaWYgKGN1cnIgPT0gbmV4dCkgcmV0dXJuKDApOworI2lmZGVmCUlOQ0xVREVfV0QKKwlpZiAoZXRoX2ZsYWdzICYgRkxBR18xNkJJVCkgeworCQlvdXRiKGV0aF9sYWFyIHwgV0RfTEFBUl9NMTZFTiwgZXRoX2FzaWNfYmFzZSArIFdEX0xBQVIpOworCQlpbmIoMHg4NCk7CisJfQorCWlmIChldGhfZmxhZ3MgJiBGTEFHXzc5MCkgeworCQlvdXRiKFdEX01TUl9NRU5CLCBldGhfYXNpY19iYXNlICsgV0RfTVNSKTsKKwkJaW5iKDB4ODQpOworCX0KKwlpbmIoMHg4NCk7CisjZW5kaWYKKwlwa3RvZmYgPSBuZXh0IDw8IDg7CisJaWYgKGV0aF9mbGFncyAmIEZMQUdfUElPKQorCQlldGhfcGlvX3JlYWQocGt0b2ZmLCAoY2hhciAqKSZwa3RoZHIsIDQpOworCWVsc2UKKwkJbWVtY3B5KCZwa3RoZHIsIChjaGFyICopZXRoX3JtZW0gKyBwa3RvZmYsIDQpOworCXBrdG9mZiArPSBzaXplb2YocGt0aGRyKTsKKwkvKiBpbmNvbWluZyBsZW5ndGggaW5jbHVkZXMgRkNTIHNvIG11c3Qgc3ViIDQgKi8KKwlsZW4gPSBwa3RoZHIubGVuIC0gNDsKKwlpZiAoKHBrdGhkci5zdGF0dXMgJiBEODM5MF9SU1RBVF9QUlgpID09IDAgfHwgbGVuIDwgRVRIX1pMRU4KKwkJfHwgbGVuID4gRVRIX0ZSQU1FX0xFTikgeworCQlwcmludGYoIkJvZ3VzIHBhY2tldCwgaWdub3JpbmdcbiIpOworCQlyZXR1cm4gKDApOworCX0KKwllbHNlIHsKKwkJcCA9IG5pYy0+cGFja2V0OworCQluaWMtPnBhY2tldGxlbiA9IGxlbjsJCS8qIGF2YWlsYWJsZSB0byBjYWxsZXIgKi8KKwkJZnJhZyA9IChldGhfbWVtc2l6ZSA8PCA4KSAtIHBrdG9mZjsKKwkJaWYgKGxlbiA+IGZyYWcpIHsJCS8qIFdlIGhhdmUgYSB3cmFwLWFyb3VuZCAqLworCQkJLyogcmVhZCBmaXJzdCBwYXJ0ICovCisJCQlpZiAoZXRoX2ZsYWdzICYgRkxBR19QSU8pCisJCQkJZXRoX3Bpb19yZWFkKHBrdG9mZiwgcCwgZnJhZyk7CisJCQllbHNlCisJCQkJbWVtY3B5KHAsIChjaGFyICopZXRoX3JtZW0gKyBwa3RvZmYsIGZyYWcpOworCQkJcGt0b2ZmID0gZXRoX3J4X3N0YXJ0IDw8IDg7CisJCQlwICs9IGZyYWc7CisJCQlsZW4gLT0gZnJhZzsKKwkJfQorCQkvKiByZWFkIHNlY29uZCBwYXJ0ICovCisJCWlmIChldGhfZmxhZ3MgJiBGTEFHX1BJTykKKwkJCWV0aF9waW9fcmVhZChwa3RvZmYsIHAsIGxlbik7CisJCWVsc2UKKwkJCW1lbWNweShwLCAoY2hhciAqKWV0aF9ybWVtICsgcGt0b2ZmLCBsZW4pOworCQlyZXQgPSAxOworCX0KKyNpZmRlZglJTkNMVURFX1dECisJaWYgKGV0aF9mbGFncyAmIEZMQUdfNzkwKSB7CisJCW91dGIoMCwgZXRoX2FzaWNfYmFzZSArIFdEX01TUik7CisJCWluYigweDg0KTsKKwl9CisJaWYgKGV0aF9mbGFncyAmIEZMQUdfMTZCSVQpIHsKKwkJb3V0YihldGhfbGFhciAmIH5XRF9MQUFSX00xNkVOLCBldGhfYXNpY19iYXNlICsgV0RfTEFBUik7CisJCWluYigweDg0KTsKKwl9CisJaW5iKDB4ODQpOworI2VuZGlmCisJbmV4dCA9IHBrdGhkci5uZXh0OwkJLyogZnJhbWUgbnVtYmVyIG9mIG5leHQgcGFja2V0ICovCisJaWYgKG5leHQgPT0gZXRoX3J4X3N0YXJ0KQorCQluZXh0ID0gZXRoX21lbXNpemU7CisJb3V0YihuZXh0LTEsIGV0aF9uaWNfYmFzZStEODM5MF9QMF9CT1VORCk7CisJcmV0dXJuKHJldCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTlM4MzkwX0RJU0FCTEUgLSBUdXJuIG9mZiBhZGFwdGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIG5zODM5MF9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYykKK3sKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitFVEhfUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZglJTkNMVURFX05TODM5MAorc3RydWN0IG5pYyAqZXRoX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlX2FkZHJzLAorCQkgICAgICBzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQorI2Vsc2UKK3N0cnVjdCBuaWMgKmV0aF9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZV9hZGRycykKKyNlbmRpZgoreworCWludCBpOworCXN0cnVjdCB3ZF9ib2FyZCAqYnJkOworCXVuc2lnbmVkIHNob3J0IGNoa3N1bTsKKwl1bnNpZ25lZCBjaGFyIGM7CisJZXRoX3ZlbmRvciA9IFZFTkRPUl9OT05FOworCWV0aF9kcmFpbl9yZWNlaXZlciA9IDA7CisKKyNpZmRlZglJTkNMVURFX1dECisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCVNlYXJjaCBmb3IgV0QvU01DIGNhcmRzCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCWZvciAoZXRoX2FzaWNfYmFzZSA9IFdEX0xPV19CQVNFOyBldGhfYXNpY19iYXNlIDw9IFdEX0hJR0hfQkFTRTsKKwkJZXRoX2FzaWNfYmFzZSArPSAweDIwKSB7CisJCWNoa3N1bSA9IDA7CisJCWZvciAoaT04OyBpPDE2OyBpKyspCisJCQljaGtzdW0gKz0gaW5iKGV0aF9hc2ljX2Jhc2UraSk7CisJCS8qIEV4dHJhIGNoZWNrcyB0byBhdm9pZCBzb3VuZGNhcmQgKi8KKwkJaWYgKChjaGtzdW0gJiAweEZGKSA9PSAweEZGICYmCisJCQlpbmIoZXRoX2FzaWNfYmFzZSs4KSAhPSAweEZGICYmCisJCQlpbmIoZXRoX2FzaWNfYmFzZSs5KSAhPSAweEZGKQorCQkJYnJlYWs7CisJfQorCWlmIChldGhfYXNpY19iYXNlID4gV0RfSElHSF9CQVNFKQorCQlyZXR1cm4gKDApOworCS8qIFdlJ3ZlIGZvdW5kIGEgYm9hcmQgKi8KKwlldGhfdmVuZG9yID0gVkVORE9SX1dEOworCWV0aF9uaWNfYmFzZSA9IGV0aF9hc2ljX2Jhc2UgKyBXRF9OSUNfQUREUjsKKwljID0gaW5iKGV0aF9hc2ljX2Jhc2UrV0RfQklEKTsJLyogR2V0IGJvYXJkIGlkICovCisJZm9yIChicmQgPSB3ZF9ib2FyZHM7IGJyZC0+bmFtZTsgYnJkKyspCisJCWlmIChicmQtPmlkID09IGMpIGJyZWFrOworCWlmICghYnJkLT5uYW1lKSB7CisJCXByaW50ZigiVW5rbm93biBXRC9TTUMgTklDIHR5cGUgJWhoWFxuIiwgYyk7CisJCXJldHVybiAoMCk7CS8qIFVua25vd24gdHlwZSAqLworCX0KKwlldGhfZmxhZ3MgPSBicmQtPmZsYWdzOworCWV0aF9tZW1zaXplID0gYnJkLT5tZW1zaXplOworCWV0aF90eF9zdGFydCA9IDA7CisJZXRoX3J4X3N0YXJ0ID0gRDgzOTBfVFhCVUZfU0laRTsKKwlpZiAoKGMgPT0gVFlQRV9XRDgwMTNFUCkgJiYKKwkJKGluYihldGhfYXNpY19iYXNlICsgV0RfSUNSKSAmIFdEX0lDUl8xNkJJVCkpIHsKKwkJCWV0aF9mbGFncyA9IEZMQUdfMTZCSVQ7CisJCQlldGhfbWVtc2l6ZSA9IE1FTV8xNjM4NDsKKwl9CisJaWYgKChjICYgV0RfU09GVENPTkZJRykgJiYgKCEoZXRoX2ZsYWdzICYgRkxBR183OTApKSkgeworCQlldGhfYm1lbSA9ICgweDgwMDAwIHwKKwkJICgoaW5iKGV0aF9hc2ljX2Jhc2UgKyBXRF9NU1IpICYgMHgzRikgPDwgMTMpKTsKKwl9IGVsc2UKKwkJZXRoX2JtZW0gPSBXRF9ERUZBVUxUX01FTTsKKwlpZiAoYnJkLT5pZCA9PSBUWVBFX1NNQzgyMTZUIHx8IGJyZC0+aWQgPT0gVFlQRV9TTUM4MjE2QykgeworCQkqKCh1bnNpZ25lZCBpbnQgKikoZXRoX2JtZW0gKyA4MTkyKSkgPSAodW5zaWduZWQgaW50KTA7CisJCWlmICgqKCh1bnNpZ25lZCBpbnQgKikoZXRoX2JtZW0gKyA4MTkyKSkpIHsKKwkJCWJyZCArPSAyOworCQkJZXRoX21lbXNpemUgPSBicmQtPm1lbXNpemU7CisJCX0KKwl9CisJb3V0YigweDgwLCBldGhfYXNpY19iYXNlICsgV0RfTVNSKTsJLyogUmVzZXQgKi8KKwlmb3IgKGk9MDsgaTxFVEhfQUxFTjsgaSsrKSB7CisJCW5pYy0+bm9kZV9hZGRyW2ldID0gaW5iKGkrZXRoX2FzaWNfYmFzZStXRF9MQVIpOworCX0KKwlwcmludGYoIlxuJXMgYmFzZSAlI2h4LCBtZW1vcnkgJSNoeCwgYWRkciAlIVxuIiwKKwkJYnJkLT5uYW1lLCBldGhfYXNpY19iYXNlLCBldGhfYm1lbSwgbmljLT5ub2RlX2FkZHIpOworCWlmIChldGhfZmxhZ3MgJiBGTEFHXzc5MCkgeworCQlvdXRiKFdEX01TUl9NRU5CLCBldGhfYXNpY19iYXNlK1dEX01TUik7CisJCW91dGIoKGluYihldGhfYXNpY19iYXNlKzB4MDQpIHwKKwkJCTB4ODApLCBldGhfYXNpY19iYXNlKzB4MDQpOworCQlvdXRiKCgoKHVuc2lnbmVkKWV0aF9ibWVtID4+IDEzKSAmIDB4MEYpIHwKKwkJCSgoKHVuc2lnbmVkKWV0aF9ibWVtID4+IDExKSAmIDB4NDApIHwKKwkJCShpbmIoZXRoX2FzaWNfYmFzZSsweDBCKSAmIDB4QjApLCBldGhfYXNpY19iYXNlKzB4MEIpOworCQlvdXRiKChpbmIoZXRoX2FzaWNfYmFzZSsweDA0KSAmCisJCQl+MHg4MCksIGV0aF9hc2ljX2Jhc2UrMHgwNCk7CisJfSBlbHNlIHsKKwkJb3V0YigoKCh1bnNpZ25lZClldGhfYm1lbSA+PiAxMykgJiAweDNGKSB8IDB4NDAsIGV0aF9hc2ljX2Jhc2UrV0RfTVNSKTsKKwl9CisJaWYgKGV0aF9mbGFncyAmIEZMQUdfMTZCSVQpIHsKKwkJaWYgKGV0aF9mbGFncyAmIEZMQUdfNzkwKSB7CisJCQlldGhfbGFhciA9IGluYihldGhfYXNpY19iYXNlICsgV0RfTEFBUik7CisJCQlvdXRiKFdEX0xBQVJfTTE2RU4sIGV0aF9hc2ljX2Jhc2UgKyBXRF9MQUFSKTsKKwkJfSBlbHNlIHsKKwkJCW91dGIoKGV0aF9sYWFyID0KKwkJCQlXRF9MQUFSX0wxNkVOIHwgMSksIGV0aF9hc2ljX2Jhc2UgKyBXRF9MQUFSKTsKKy8qCisJVGhlIHByZXZpb3VzIGxpbmUgdXNlZCB0byBiZQorCQkJCVdEX0xBQVJfTTE2RU4gfCBXRF9MQUFSX0wxNkVOIHwgMSkpOworCWpsdWtlQGRlYWtpbi5lZHUuYXUgcmVwb3J0ZWQgdGhhdCByZW1vdmluZyBXRF9MQUFSX00xNkVOIG1hZGUKKwlpdCB3b3JrIGZvciBXRDgwMTNzLiAgVGhpcyBzZWVtcyB0byB3b3JrIGZvciBteSA4MDEzIGJvYXJkcy4gSQorCWRvbid0IGtub3cgd2hhdCBpcyByZWFsbHkgaGFwcGVuaW5nLiAgSSB3aXNoIEkgaGFkIGRhdGEgc2hlZXRzCisJb3IgbW9yZSB0aW1lIHRvIGRlY29kZSB0aGUgTGludXggZHJpdmVyLiAtIEtlbgorKi8KKwkJfQorCQlpbmIoMHg4NCk7CisJfQorI2VuZGlmCisjaWZkZWYJSU5DTFVERV8zQzUwMworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIFNlYXJjaCBmb3IgM0NvbSAzYzUwMyBpZiBubyBXRC9TTUMgY2FyZHMKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCWlmIChldGhfdmVuZG9yID09IFZFTkRPUl9OT05FKSB7CisJCWludAlpZHg7CisJCWludAlpb2Jhc2VfcmVnLCBtZW1iYXNlX3JlZzsKKwkJc3RhdGljIHVuc2lnbmVkIHNob3J0CWJhc2VbXSA9IHsKKwkJCTB4MzAwLCAweDMxMCwgMHgzMzAsIDB4MzUwLAorCQkJMHgyNTAsIDB4MjgwLCAweDJBMCwgMHgyRTAsIDAgfTsKKworCQkvKiBMb29wIHRocm91Z2ggcG9zc2libGUgYWRkcmVzc2VzIGNoZWNraW5nIGVhY2ggb25lICovCisKKwkJZm9yIChpZHggPSAwOyAoZXRoX25pY19iYXNlID0gYmFzZVtpZHhdKSAhPSAwOyArK2lkeCkgeworCisJCQlldGhfYXNpY19iYXNlID0gZXRoX25pY19iYXNlICsgXzNDT01fQVNJQ19PRkZTRVQ7CisvKgorICogTm90ZSB0aGF0IHdlIHVzZSB0aGUgc2FtZSBzZXR0aW5ncyBmb3IgYm90aCA4IGFuZCAxNiBiaXQgY2FyZHM6CisgKiBib3RoIGhhdmUgYW4gOEsgYmFuayBvZiBtZW1vcnkgYXQgcGFnZSAxIHdoaWxlIG9ubHkgdGhlIDE2IGJpdAorICogY2FyZHMgaGF2ZSBhIGJhbmsgYXQgcGFnZSAwLgorICovCisJCQlldGhfbWVtc2l6ZSA9IE1FTV8xNjM4NDsKKwkJCWV0aF90eF9zdGFydCA9IDMyOworCQkJZXRoX3J4X3N0YXJ0ID0gMzIgKyBEODM5MF9UWEJVRl9TSVpFOworCisJCS8qIENoZWNrIG91ciBiYXNlIGFkZHJlc3MuIGlvYmFzZSBhbmQgbWVtYmFzZSBzaG91bGQgKi8KKwkJLyogYm90aCBoYXZlIGEgbWF4aW11bSBvZiAxIGJpdCBzZXQgb3IgYmUgMC4gKi8KKworCQkJaW9iYXNlX3JlZyA9IGluYihldGhfYXNpY19iYXNlICsgXzNDT01fQkNGUik7CisJCQltZW1iYXNlX3JlZyA9IGluYihldGhfYXNpY19iYXNlICsgXzNDT01fUENGUik7CisKKwkJCWlmICgoaW9iYXNlX3JlZyAmIChpb2Jhc2VfcmVnIC0gMSkpIHx8CisJCQkJKG1lbWJhc2VfcmVnICYgKG1lbWJhc2VfcmVnIC0gMSkpKQorCQkJCWNvbnRpbnVlOwkJLyogbm9wZSAqLworCisJCS8qIE5vdyBnZXQgdGhlIHNoYXJlZCBtZW1vcnkgYWRkcmVzcyAqLworCisJCQlldGhfZmxhZ3MgPSAwOworCisJCQlzd2l0Y2ggKG1lbWJhc2VfcmVnKSB7CisJCQkJY2FzZSBfM0NPTV9QQ0ZSX0RDMDAwOgorCQkJCQlldGhfYm1lbSA9IDB4ZGMwMDA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgXzNDT01fUENGUl9EODAwMDoKKwkJCQkJZXRoX2JtZW0gPSAweGQ4MDAwOworCQkJCQlicmVhazsKKwkJCQljYXNlIF8zQ09NX1BDRlJfQ0MwMDA6CisJCQkJCWV0aF9ibWVtID0gMHhjYzAwMDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBfM0NPTV9QQ0ZSX0M4MDAwOgorCQkJCQlldGhfYm1lbSA9IDB4YzgwMDA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgXzNDT01fUENGUl9QSU86CisJCQkJCWV0aF9mbGFncyB8PSBGTEFHX1BJTzsKKwkJCQkJZXRoX2JtZW0gPSAwOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQljb250aW51ZTsJLyogbm9wZSAqLworCQkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGJhc2VbaWR4XSA9PSAwKQkJLyogbm90IGZvdW5kICovCisJCQlyZXR1cm4gKDApOworI2lmbmRlZglUNTAzX1NITUVNCisJCWV0aF9mbGFncyB8PSBGTEFHX1BJTzsJCS8qIGZvcmNlIFBJTyBtb2RlICovCisJCWV0aF9ibWVtID0gMDsKKyNlbmRpZgorCQlldGhfdmVuZG9yID0gVkVORE9SXzNDT007CisKKworICAgICAgICAvKiBOZWVkIHRoaXMgdG8gbWFrZSBuczgzOTBfcG9sbCgpIGhhcHB5LiAqLworCisgICAgICAgICAgICAgICAgZXRoX3JtZW0gPSBldGhfYm1lbSAtIDB4MjAwMDsKKworICAgICAgICAvKiBSZXNldCBOSUMgYW5kIEFTSUMgKi8KKworICAgICAgICAgICAgICAgIG91dGIoXzNDT01fQ1JfUlNUIHwgXzNDT01fQ1JfWFNFTCwgZXRoX2FzaWNfYmFzZSArIF8zQ09NX0NSICk7CisgICAgICAgICAgICAgICAgb3V0YihfM0NPTV9DUl9YU0VMLCBldGhfYXNpY19iYXNlICsgXzNDT01fQ1IgKTsKKworICAgICAgICAvKiBHZXQgb3VyIGV0aGVybmV0IGFkZHJlc3MgKi8KKworICAgICAgICAgICAgICAgIG91dGIoXzNDT01fQ1JfRUFMTyB8IF8zQ09NX0NSX1hTRUwsIGV0aF9hc2ljX2Jhc2UgKyBfM0NPTV9DUik7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcbjNDb20gM2M1MDMgYmFzZSAlI2h4LCAiLCBldGhfbmljX2Jhc2UpOworICAgICAgICAgICAgICAgIGlmIChldGhfZmxhZ3MgJiBGTEFHX1BJTykKKwkJCXByaW50ZigiUElPIG1vZGUiKTsKKyAgICAgICAgICAgICAgICBlbHNlCisJCQlwcmludGYoIm1lbW9yeSAlI2h4IiwgZXRoX2JtZW0pOworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPEVUSF9BTEVOOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5pYy0+bm9kZV9hZGRyW2ldID0gaW5iKGV0aF9uaWNfYmFzZStpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRmKCIsICVzLCBhZGRyICUhXG4iLCBuaWMtPmZsYWdzID8gIkFVSSIgOiAiaW50ZXJuYWwgeGN2ciIsCisJCQluaWMtPm5vZGVfYWRkcik7CisgICAgICAgICAgICAgICAgb3V0YihfM0NPTV9DUl9YU0VMLCBldGhfYXNpY19iYXNlICsgXzNDT01fQ1IpOworICAgICAgICAvKgorICAgICAgICAgKiBJbml0aWFsaXplIEdBIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuIFNldCBiYW5rIGFuZCBlbmFibGUgc2hhcmVkCisgICAgICAgICAqIG1lbS4gV2UgYWx3YXlzIHVzZSBiYW5rIDEuIERpc2FibGUgaW50ZXJydXB0cy4KKyAgICAgICAgICovCisgICAgICAgICAgICAgICAgb3V0YihfM0NPTV9HQUNGUl9SU0VMIHwKKwkJCV8zQ09NX0dBQ0ZSX01CUzAgfCBfM0NPTV9HQUNGUl9UQ00gfCBfM0NPTV9HQUNGUl9OSU0sIGV0aF9hc2ljX2Jhc2UgKyBfM0NPTV9HQUNGUik7CisKKyAgICAgICAgICAgICAgICBvdXRiKDB4ZmYsIGV0aF9hc2ljX2Jhc2UgKyBfM0NPTV9WUFRSMik7CisgICAgICAgICAgICAgICAgb3V0YigweGZmLCBldGhfYXNpY19iYXNlICsgXzNDT01fVlBUUjEpOworICAgICAgICAgICAgICAgIG91dGIoMHgwMCwgZXRoX2FzaWNfYmFzZSArIF8zQ09NX1ZQVFIwKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2xlYXIgbWVtb3J5IGFuZCB2ZXJpZnkgdGhhdCBpdCB3b3JrZWQgKHdlIHVzZSBvbmx5IDhLKQorICAgICAgICAgKi8KKworCQlpZiAoIShldGhfZmxhZ3MgJiBGTEFHX1BJTykpIHsKKwkJCW1lbXNldCgoY2hhciAqKWV0aF9ibWVtLCAwLCAweDIwMDApOworCQkJZm9yKGkgPSAwOyBpIDwgMHgyMDAwOyArK2kpCisJCQkJaWYgKCooKChjaGFyICopZXRoX2JtZW0pK2kpKSB7CisJCQkJCXByaW50ZiAoIkZhaWxlZCB0byBjbGVhciAzYzUwMyBzaGFyZWQgbWVtLlxuIik7CisJCQkJCXJldHVybiAoMCk7CisJCQkJfQorCQl9CisgICAgICAgIC8qCisgICAgICAgICAqIEluaXRpYWxpemUgR0EgcGFnZS9zdGFydC9zdG9wIHJlZ2lzdGVycy4KKyAgICAgICAgICovCisgICAgICAgICAgICAgICAgb3V0YihldGhfdHhfc3RhcnQsIGV0aF9hc2ljX2Jhc2UgKyBfM0NPTV9QU1RSKTsKKyAgICAgICAgICAgICAgICBvdXRiKGV0aF9tZW1zaXplLCBldGhfYXNpY19iYXNlICsgXzNDT01fUFNQUik7CisgICAgICAgIH0KKyNlbmRpZgorI2lmCWRlZmluZWQoSU5DTFVERV9ORSkgfHwgZGVmaW5lZChJTkNMVURFX05TODM5MCkKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJU2VhcmNoIGZvciBORTEwMDAvMjAwMCBpZiBubyBXRC9TTUMgb3IgM2NvbSBjYXJkcworCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlpZiAoZXRoX3ZlbmRvciA9PSBWRU5ET1JfTk9ORSkgeworCQljaGFyIHJvbWRhdGFbMTZdLCB0ZXN0YnVmWzMyXTsKKwkJaW50IGlkeDsKKwkJc3RhdGljIGNoYXIgdGVzdFtdID0gIk5FKjAwMCBtZW1vcnkiOworCQlzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmFzZVtdID0geworI2lmZGVmCU5FX1NDQU4KKwkJCU5FX1NDQU4sCisjZW5kaWYKKwkJCTAgfTsKKwkJLyogaWYgbm8gYWRkcmVzc2VzIHN1cHBsaWVkLCBmYWxsIGJhY2sgb24gZGVmYXVsdHMgKi8KKwkJaWYgKHByb2JlX2FkZHJzID09IDAgfHwgcHJvYmVfYWRkcnNbMF0gPT0gMCkKKwkJCXByb2JlX2FkZHJzID0gYmFzZTsKKwkJZXRoX2JtZW0gPSAwOwkJLyogTm8gc2hhcmVkIG1lbW9yeSAqLworCQlmb3IgKGlkeCA9IDA7IChldGhfbmljX2Jhc2UgPSBwcm9iZV9hZGRyc1tpZHhdKSAhPSAwOyArK2lkeCkgeworCQkJZXRoX2ZsYWdzID0gRkxBR19QSU87CisJCQlldGhfYXNpY19iYXNlID0gZXRoX25pY19iYXNlICsgTkVfQVNJQ19PRkZTRVQ7CisJCQlldGhfbWVtc2l6ZSA9IE1FTV8xNjM4NDsKKwkJCWV0aF90eF9zdGFydCA9IDMyOworCQkJZXRoX3J4X3N0YXJ0ID0gMzIgKyBEODM5MF9UWEJVRl9TSVpFOworCQkJYyA9IGluYihldGhfYXNpY19iYXNlICsgTkVfUkVTRVQpOworCQkJb3V0YihjLCBldGhfYXNpY19iYXNlICsgTkVfUkVTRVQpOworCQkJaW5iKDB4ODQpOworCQkJb3V0YihEODM5MF9DT01NQU5EX1NUUCB8CisJCQkJRDgzOTBfQ09NTUFORF9SRDIsIGV0aF9uaWNfYmFzZSArIEQ4MzkwX1AwX0NPTU1BTkQpOworCQkJb3V0YihEODM5MF9SQ1JfTU9OLCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9SQ1IpOworCQkJb3V0YihEODM5MF9EQ1JfRlQxIHwgRDgzOTBfRENSX0xTLCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9EQ1IpOworCQkJb3V0YihNRU1fODE5MiwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfUFNUQVJUKTsKKwkJCW91dGIoTUVNXzE2Mzg0LCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9QU1RPUCk7CisjaWZkZWYJTlM4MzkwX0ZPUkNFXzE2QklUCisJCQlldGhfZmxhZ3MgfD0gRkxBR18xNkJJVDsJLyogZm9yY2UgMTYtYml0IG1vZGUgKi8KKyNlbmRpZgorCisJCQlldGhfcGlvX3dyaXRlKHRlc3QsIDgxOTIsIHNpemVvZih0ZXN0KSk7CisJCQlldGhfcGlvX3JlYWQoODE5MiwgdGVzdGJ1Ziwgc2l6ZW9mKHRlc3QpKTsKKwkJCWlmICghbWVtY21wKHRlc3QsIHRlc3RidWYsIHNpemVvZih0ZXN0KSkpCisJCQkJYnJlYWs7CisJCQlldGhfZmxhZ3MgfD0gRkxBR18xNkJJVDsKKwkJCWV0aF9tZW1zaXplID0gTUVNXzMyNzY4OworCQkJZXRoX3R4X3N0YXJ0ID0gNjQ7CisJCQlldGhfcnhfc3RhcnQgPSA2NCArIEQ4MzkwX1RYQlVGX1NJWkU7CisJCQlvdXRiKEQ4MzkwX0RDUl9XVFMgfAorCQkJCUQ4MzkwX0RDUl9GVDEgfCBEODM5MF9EQ1JfTFMsIGV0aF9uaWNfYmFzZSArIEQ4MzkwX1AwX0RDUik7CisJCQlvdXRiKE1FTV8xNjM4NCwgZXRoX25pY19iYXNlICsgRDgzOTBfUDBfUFNUQVJUKTsKKwkJCW91dGIoTUVNXzMyNzY4LCBldGhfbmljX2Jhc2UgKyBEODM5MF9QMF9QU1RPUCk7CisJCQlldGhfcGlvX3dyaXRlKHRlc3QsIDE2Mzg0LCBzaXplb2YodGVzdCkpOworCQkJZXRoX3Bpb19yZWFkKDE2Mzg0LCB0ZXN0YnVmLCBzaXplb2YodGVzdCkpOworCQkJaWYgKCFtZW1jbXAodGVzdGJ1ZiwgdGVzdCwgc2l6ZW9mKHRlc3QpKSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoZXRoX25pY19iYXNlID09IDApCisJCQlyZXR1cm4gKDApOworCQlpZiAoZXRoX25pY19iYXNlID4gSVNBX01BWF9BRERSKQkvKiBQQ0kgcHJvYmFibHkgKi8KKwkJCWV0aF9mbGFncyB8PSBGTEFHXzE2QklUOworCQlldGhfdmVuZG9yID0gVkVORE9SX05PVkVMTDsKKwkJZXRoX3Bpb19yZWFkKDAsIHJvbWRhdGEsIHNpemVvZihyb21kYXRhKSk7CisJCWZvciAoaT0wOyBpPEVUSF9BTEVOOyBpKyspIHsKKwkJCW5pYy0+bm9kZV9hZGRyW2ldID0gcm9tZGF0YVtpICsgKChldGhfZmxhZ3MgJiBGTEFHXzE2QklUKSA/IGkgOiAwKV07CisJCX0KKwkJcHJpbnRmKCJcbk5FJWMwMDAgYmFzZSAlI2h4LCBhZGRyICUhXG4iLAorCQkJKGV0aF9mbGFncyAmIEZMQUdfMTZCSVQpID8gJzInIDogJzEnLCBldGhfbmljX2Jhc2UsCisJCQluaWMtPm5vZGVfYWRkcik7CisJfQorI2VuZGlmCisJaWYgKGV0aF92ZW5kb3IgPT0gVkVORE9SX05PTkUpCisJCXJldHVybigwKTsKKyAgICAgICAgaWYgKGV0aF92ZW5kb3IgIT0gVkVORE9SXzNDT00pCisJCWV0aF9ybWVtID0gZXRoX2JtZW07CisJbnM4MzkwX3Jlc2V0KG5pYyk7CisJbmljLT5yZXNldCA9IG5zODM5MF9yZXNldDsKKwluaWMtPnBvbGwgPSBuczgzOTBfcG9sbDsKKwluaWMtPnRyYW5zbWl0ID0gbnM4MzkwX3RyYW5zbWl0OworCW5pYy0+ZGlzYWJsZSA9IG5zODM5MF9kaXNhYmxlOworCXJldHVybihuaWMpOworfQorCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KKwpkaWZmIC0tZ2l0IGEvbmV0Ym9vdC9uczgzOTAuaCBiL25ldGJvb3QvbnM4MzkwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM0ZTk3MgotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvbnM4MzkwLmgKQEAgLTAsMCArMSwyMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIRVJCT09UIC0gIEJPT1RQL1RGVFAgQm9vdHN0cmFwIFByb2dyYW0KKworQXV0aG9yOiBNYXJ0aW4gUmVudGVycworICBEYXRlOiBKdW4vOTQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVkVORE9SX05PTkUJMAorI2RlZmluZSBWRU5ET1JfV0QJMQorI2RlZmluZSBWRU5ET1JfTk9WRUxMCTIKKyNkZWZpbmUgVkVORE9SXzNDT00JMworCisjZGVmaW5lIEZMQUdfUElPCTB4MDEKKyNkZWZpbmUgRkxBR18xNkJJVAkweDAyCisjZGVmaW5lIEZMQUdfNzkwCTB4MDQKKworI2RlZmluZSBNRU1fODE5MgkzMgorI2RlZmluZSBNRU1fMTYzODQJNjQKKyNkZWZpbmUgTUVNXzMyNzY4CTEyOAorCisjZGVmaW5lCUlTQV9NQVhfQUREUgkweDQwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1dlc3Rlcm4gRGlnaXRhbC9TTUMgQm9hcmQgRGVmaW5pdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBXRF9MT1dfQkFTRQkweDIwMAorI2RlZmluZSBXRF9ISUdIX0JBU0UJMHgzZTAKKyNpZm5kZWYJV0RfREVGQVVMVF9NRU0KKyNkZWZpbmUgV0RfREVGQVVMVF9NRU0JMHhEMDAwMAorI2VuZGlmCisjZGVmaW5lIFdEX05JQ19BRERSCTB4MTAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitXZXN0ZXJuIERpZ2l0YWwvU01DIEFTSUMgQWRkcmVzc2VzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgV0RfTVNSCQkweDAwCisjZGVmaW5lIFdEX0lDUgkJMHgwMQorI2RlZmluZSBXRF9JQVIJCTB4MDIKKyNkZWZpbmUgV0RfQklPCQkweDAzCisjZGVmaW5lIFdEX0lSUgkJMHgwNAorI2RlZmluZSBXRF9MQUFSCQkweDA1CisjZGVmaW5lIFdEX0lKUgkJMHgwNgorI2RlZmluZSBXRF9HUDIJCTB4MDcKKyNkZWZpbmUgV0RfTEFSCQkweDA4CisjZGVmaW5lIFdEX0JJRAkJMHgwRQorCisjZGVmaW5lIFdEX0lDUl8xNkJJVAkweDAxCisKKyNkZWZpbmUgV0RfTVNSX01FTkIJMHg0MAorCisjZGVmaW5lIFdEX0xBQVJfTDE2RU4JMHg0MAorI2RlZmluZSBXRF9MQUFSX00xNkVOCTB4ODAKKworI2RlZmluZSBXRF9TT0ZUQ09ORklHCTB4MjAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitXZXN0ZXJuIERpZ2l0YWwvU01DIEJvYXJkIFR5cGVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVFlQRV9XRDgwMDNTCTB4MDIKKyNkZWZpbmUgVFlQRV9XRDgwMDNFCTB4MDMKKyNkZWZpbmUgVFlQRV9XRDgwMTNFQlQJMHgwNQorI2RlZmluZSBUWVBFX1dEODAwM1cJMHgyNAorI2RlZmluZSBUWVBFX1dEODAwM0VCCTB4MjUKKyNkZWZpbmUgVFlQRV9XRDgwMTNXCTB4MjYKKyNkZWZpbmUgVFlQRV9XRDgwMTNFUAkweDI3CisjZGVmaW5lIFRZUEVfV0Q4MDEzV0MJMHgyOAorI2RlZmluZSBUWVBFX1dEODAxM0VQQwkweDI5CisjZGVmaW5lIFRZUEVfU01DODIxNlQJMHgyYQorI2RlZmluZSBUWVBFX1NNQzgyMTZDCTB4MmIKKyNkZWZpbmUgVFlQRV9TTUM4NDE2VAkweDAwCS8qIEJvZ3VzIGVudHJpZXM6IHRoZSA4NDE2IGdlbmVyYXRlcyB0aGUgKi8KKyNkZWZpbmUgVFlQRV9TTUM4NDE2QwkweDAwCS8qIHRoZSBzYW1lIGNvZGVzIGFzIHRoZSA4MjE2LiAqLworI2RlZmluZSBUWVBFX1NNQzgwMTNFQlAJMHgyYworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzNjb20gM2M1MDMgZGVmaW5pdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmCV8zQ09NX0JBU0UKKyNkZWZpbmUgXzNDT01fQkFTRSAweDMwMAorI2VuZGlmCisKKyNkZWZpbmUgXzNDT01fVFhfUEFHRV9PRkZTRVRfOEJJVCAgICAgMHgyMAorI2RlZmluZSBfM0NPTV9UWF9QQUdFX09GRlNFVF8xNkJJVCAgICAweDAKKyNkZWZpbmUgXzNDT01fUlhfUEFHRV9PRkZTRVRfMTZCSVQgICAgMHgyMAorCisjZGVmaW5lIF8zQ09NX0FTSUNfT0ZGU0VUIDB4NDAwCisjZGVmaW5lIF8zQ09NX05JQ19PRkZTRVQgMHgwCisKKyNkZWZpbmUgXzNDT01fUFNUUiAgICAgICAgICAgIDAKKyNkZWZpbmUgXzNDT01fUFNQUiAgICAgICAgICAgIDEKKworI2RlZmluZSBfM0NPTV9CQ0ZSICAgICAgICAgICAgMworI2RlZmluZSBfM0NPTV9CQ0ZSXzJFMCAgICAgICAgMHgwMQorI2RlZmluZSBfM0NPTV9CQ0ZSXzJBMCAgICAgICAgMHgwMgorI2RlZmluZSBfM0NPTV9CQ0ZSXzI4MCAgICAgICAgMHgwNAorI2RlZmluZSBfM0NPTV9CQ0ZSXzI1MCAgICAgICAgMHgwOAorI2RlZmluZSBfM0NPTV9CQ0ZSXzM1MCAgICAgICAgMHgxMAorI2RlZmluZSBfM0NPTV9CQ0ZSXzMzMCAgICAgICAgMHgyMAorI2RlZmluZSBfM0NPTV9CQ0ZSXzMxMCAgICAgICAgMHg0MAorI2RlZmluZSBfM0NPTV9CQ0ZSXzMwMCAgICAgICAgMHg4MAorI2RlZmluZSBfM0NPTV9QQ0ZSICAgICAgICAgICAgNAorI2RlZmluZSBfM0NPTV9QQ0ZSX1BJTyAgICAgICAgMAorI2RlZmluZSBfM0NPTV9QQ0ZSX0M4MDAwICAgICAgMHgxMAorI2RlZmluZSBfM0NPTV9QQ0ZSX0NDMDAwICAgICAgMHgyMAorI2RlZmluZSBfM0NPTV9QQ0ZSX0Q4MDAwICAgICAgMHg0MAorI2RlZmluZSBfM0NPTV9QQ0ZSX0RDMDAwICAgICAgMHg4MAorI2RlZmluZSBfM0NPTV9DUiAgICAgICAgICAgICAgNgorI2RlZmluZSBfM0NPTV9DUl9SU1QgICAgICAgICAgMHgwMSAgICAvKiBSZXNldCBHQSBhbmQgTklDICovCisjZGVmaW5lIF8zQ09NX0NSX1hTRUwgICAgICAgICAweDAyICAgIC8qIFRyYW5zY2VpdmVyIHNlbGVjdC4gQk5DPTEoZGVmKSBBVUk9MCAqLworI2RlZmluZSBfM0NPTV9DUl9FQUxPICAgICAgICAgMHgwNCAgICAvKiB3aW5kb3cgRUEgUFJPTSAwLTE1IHRvIEkvTyBiYXNlICovCisjZGVmaW5lIF8zQ09NX0NSX0VBSEkgICAgICAgICAweDA4ICAgIC8qIHdpbmRvdyBFQSBQUk9NIDE2LTMxIHRvIEkvTyBiYXNlICovCisjZGVmaW5lIF8zQ09NX0NSX1NIQVJFICAgICAgICAweDEwICAgIC8qIHNlbGVjdCBpbnRlcnJ1cHQgc2hhcmluZyBvcHRpb24gKi8KKyNkZWZpbmUgXzNDT01fQ1JfREJTRUwgICAgICAgIDB4MjAgICAgLyogRG91YmxlIGJ1ZmZlciBzZWxlY3QgKi8KKyNkZWZpbmUgXzNDT01fQ1JfRERJUiAgICAgICAgIDB4NDAgICAgLyogRE1BIGRpcmVjdGlvbiBzZWxlY3QgKi8KKyNkZWZpbmUgXzNDT01fQ1JfU1RBUlQgICAgICAgIDB4ODAgICAgLyogU3RhcnQgRE1BIGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgXzNDT01fR0FDRlIgICAgICAgICAgIDUKKyNkZWZpbmUgXzNDT01fR0FDRlJfTUJTMCAgICAgIDB4MDEKKyNkZWZpbmUgXzNDT01fR0FDRlJfTUJTMSAgICAgIDB4MDIKKyNkZWZpbmUgXzNDT01fR0FDRlJfTUJTMiAgICAgIDB4MDQKKyNkZWZpbmUgXzNDT01fR0FDRlJfUlNFTCAgICAgIDB4MDggICAgLyogZW5hYmxlIHNoYXJlZCBtZW1vcnkgKi8KKyNkZWZpbmUgXzNDT01fR0FDRlJfVEVTVCAgICAgIDB4MTAgICAgLyogZm9yIEdBIHRlc3RpbmcgKi8KKyNkZWZpbmUgXzNDT01fR0FDRlJfT1dTICAgICAgIDB4MjAgICAgLyogc2VsZWN0IDBXUyBhY2Nlc3MgdG8gR0EgKi8KKyNkZWZpbmUgXzNDT01fR0FDRlJfVENNICAgICAgIDB4NDAgICAgLyogTWFzayBETUEgaW50ZXJydXB0cyAqLworI2RlZmluZSBfM0NPTV9HQUNGUl9OSU0gICAgICAgMHg4MCAgICAvKiBNYXNrIE5JQyBpbnRlcnJ1cHRzICovCisjZGVmaW5lIF8zQ09NX1NUUkVHICAgICAgICAgICA3CisjZGVmaW5lIF8zQ09NX1NUUkVHX1JFViAgICAgICAweDA3ICAgIC8qIEdBIHJldmlzaW9uICovCisjZGVmaW5lIF8zQ09NX1NUUkVHX0RJUCAgICAgICAweDA4ICAgIC8qIERNQSBpbiBwcm9ncmVzcyAqLworI2RlZmluZSBfM0NPTV9TVFJFR19EVEMgICAgICAgMHgxMCAgICAvKiBETUEgdGVybWluYWwgY291bnQgKi8KKyNkZWZpbmUgXzNDT01fU1RSRUdfT0ZMVyAgICAgIDB4MjAgICAgLyogT3ZlcmZsb3cgKi8KKyNkZWZpbmUgXzNDT01fU1RSRUdfVUZMVyAgICAgIDB4NDAgICAgLyogVW5kZXJmbG93ICovCisjZGVmaW5lIF8zQ09NX1NUUkVHX0RQUkRZICAgICAweDgwICAgIC8qIERhdGEgcG9ydCByZWFkeSAqLworI2RlZmluZSBfM0NPTV9JRENGUiAgICAgICAgICAgOAorI2RlZmluZSBfM0NPTV9JRENGUl9EUlEwICAgICAgMHgwMSAgICAvKiBETUEgcmVxdWVzdCAxIHNlbGVjdCAqLworI2RlZmluZSBfM0NPTV9JRENGUl9EUlExICAgICAgMHgwMiAgICAvKiBETUEgcmVxdWVzdCAyIHNlbGVjdCAqLworI2RlZmluZSBfM0NPTV9JRENGUl9EUlEyICAgICAgMHgwNCAgICAvKiBETUEgcmVxdWVzdCAzIHNlbGVjdCAqLworI2RlZmluZSBfM0NPTV9JRENGUl9VTlVTRUQgICAgMHgwOCAgICAvKiBub3QgdXNlZCAqLworI2RlZmluZSBfM0NPTV9JRENGUl9JUlEyICAgICAgMHgxMCAgICAvKiBJbnRlcnJ1cHQgcmVxdWVzdCAyIHNlbGVjdCAqLworI2RlZmluZSBfM0NPTV9JRENGUl9JUlEzICAgICAgMHgyMCAgICAvKiBJbnRlcnJ1cHQgcmVxdWVzdCAzIHNlbGVjdCAqLworI2RlZmluZSBfM0NPTV9JRENGUl9JUlE0ICAgICAgMHg0MCAgICAvKiBJbnRlcnJ1cHQgcmVxdWVzdCA0IHNlbGVjdCAqLworI2RlZmluZSBfM0NPTV9JRENGUl9JUlE1ICAgICAgMHg4MCAgICAvKiBJbnRlcnJ1cHQgcmVxdWVzdCA1IHNlbGVjdCAqLworI2RlZmluZSBfM0NPTV9JUlEyICAgICAgMgorI2RlZmluZSBfM0NPTV9JUlEzICAgICAgMworI2RlZmluZSBfM0NPTV9JUlE0ICAgICAgNAorI2RlZmluZSBfM0NPTV9JUlE1ICAgICAgNQorI2RlZmluZSBfM0NPTV9EQU1TQiAgICAgICAgICAgOQorI2RlZmluZSBfM0NPTV9EQUxTQiAgICAgICAgICAgMHgwYQorI2RlZmluZSBfM0NPTV9WUFRSMiAgICAgICAgICAgMHgwYgorI2RlZmluZSBfM0NPTV9WUFRSMSAgICAgICAgICAgMHgwYworI2RlZmluZSBfM0NPTV9WUFRSMCAgICAgICAgICAgMHgwZAorI2RlZmluZSBfM0NPTV9SRk1TQiAgICAgICAgICAgMHgwZQorI2RlZmluZSBfM0NPTV9SRkxTQiAgICAgICAgICAgMHgwZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK05FMTAwMC8yMDAwIGRlZmluaXRpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTkVfQVNJQ19PRkZTRVQJMHgxMAorI2RlZmluZSBORV9SRVNFVAkweDBGCQkvKiBVc2VkIHRvIHJlc2V0IGNhcmQgKi8KKyNkZWZpbmUgTkVfREFUQQkJMHgwMAkJLyogVXNlZCB0byByZWFkL3dyaXRlIE5JQyBtZW0gKi8KKworI2RlZmluZSBDT01QRVhfUkwyMDAwX1RSSUVTCTIwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzgzOTAgUmVnaXN0ZXIgRGVmaW5pdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBEODM5MF9QMF9DT01NQU5ECTB4MDAKKyNkZWZpbmUgRDgzOTBfUDBfUFNUQVJUCQkweDAxCisjZGVmaW5lIEQ4MzkwX1AwX1BTVE9QCQkweDAyCisjZGVmaW5lIEQ4MzkwX1AwX0JPVU5ECQkweDAzCisjZGVmaW5lIEQ4MzkwX1AwX1RTUgkJMHgwNAorI2RlZmluZQlEODM5MF9QMF9UUFNSCQkweDA0CisjZGVmaW5lIEQ4MzkwX1AwX1RCQ1IwCQkweDA1CisjZGVmaW5lIEQ4MzkwX1AwX1RCQ1IxCQkweDA2CisjZGVmaW5lIEQ4MzkwX1AwX0lTUgkJMHgwNworI2RlZmluZSBEODM5MF9QMF9SU0FSMAkJMHgwOAorI2RlZmluZSBEODM5MF9QMF9SU0FSMQkJMHgwOQorI2RlZmluZSBEODM5MF9QMF9SQkNSMAkJMHgwQQorI2RlZmluZSBEODM5MF9QMF9SQkNSMQkJMHgwQgorI2RlZmluZSBEODM5MF9QMF9SU1IJCTB4MEMKKyNkZWZpbmUgRDgzOTBfUDBfUkNSCQkweDBDCisjZGVmaW5lIEQ4MzkwX1AwX1RDUgkJMHgwRAorI2RlZmluZSBEODM5MF9QMF9EQ1IJCTB4MEUKKyNkZWZpbmUgRDgzOTBfUDBfSU1SCQkweDBGCisjZGVmaW5lIEQ4MzkwX1AxX0NPTU1BTkQJMHgwMAorI2RlZmluZSBEODM5MF9QMV9QQVIwCQkweDAxCisjZGVmaW5lIEQ4MzkwX1AxX1BBUjEJCTB4MDIKKyNkZWZpbmUgRDgzOTBfUDFfUEFSMgkJMHgwMworI2RlZmluZSBEODM5MF9QMV9QQVIzCQkweDA0CisjZGVmaW5lIEQ4MzkwX1AxX1BBUjQJCTB4MDUKKyNkZWZpbmUgRDgzOTBfUDFfUEFSNQkJMHgwNgorI2RlZmluZSBEODM5MF9QMV9DVVJSCQkweDA3CisjZGVmaW5lIEQ4MzkwX1AxX01BUjAJCTB4MDgKKworI2RlZmluZSBEODM5MF9DT01NQU5EX1BTMAkweDAJCS8qIFBhZ2UgMCBzZWxlY3QgKi8KKyNkZWZpbmUgRDgzOTBfQ09NTUFORF9QUzEJMHg0MAkJLyogUGFnZSAxIHNlbGVjdCAqLworI2RlZmluZSBEODM5MF9DT01NQU5EX1BTMgkweDgwCQkvKiBQYWdlIDIgc2VsZWN0ICovCisjZGVmaW5lCUQ4MzkwX0NPTU1BTkRfUkQyCTB4MjAJCS8qIFJlbW90ZSBETUEgY29udHJvbCAqLworI2RlZmluZSBEODM5MF9DT01NQU5EX1JEMQkweDEwCisjZGVmaW5lIEQ4MzkwX0NPTU1BTkRfUkQwCTB4MDgKKyNkZWZpbmUgRDgzOTBfQ09NTUFORF9UWFAJMHgwNAkJLyogdHJhbnNtaXQgcGFja2V0ICovCisjZGVmaW5lIEQ4MzkwX0NPTU1BTkRfU1RBCTB4MDIJCS8qIHN0YXJ0ICovCisjZGVmaW5lIEQ4MzkwX0NPTU1BTkRfU1RQCTB4MDEJCS8qIHN0b3AgKi8KKworI2RlZmluZSBEODM5MF9SQ1JfTU9OCQkweDIwCQkvKiBtb25pdG9yIG1vZGUgKi8KKworI2RlZmluZSBEODM5MF9EQ1JfRlQxCQkweDQwCisjZGVmaW5lIEQ4MzkwX0RDUl9MUwkJMHgwOAkJLyogTG9vcGJhY2sgc2VsZWN0ICovCisjZGVmaW5lIEQ4MzkwX0RDUl9XVFMJCTB4MDEJCS8qIFdvcmQgdHJhbnNmZXIgc2VsZWN0ICovCisKKyNkZWZpbmUgRDgzOTBfSVNSX1BSWAkJMHgwMQkJLyogc3VjY2Vzc2Z1bCByZWN2ICovCisjZGVmaW5lIEQ4MzkwX0lTUl9QVFgJCTB4MDIJCS8qIHN1Y2Nlc3NmdWwgeG1pdCAqLworI2RlZmluZSBEODM5MF9JU1JfUlhFCQkweDA0CQkvKiByZWNlaXZlIGVycm9yICovCisjZGVmaW5lIEQ4MzkwX0lTUl9UWEUJCTB4MDgJCS8qIHRyYW5zbWl0IGVycm9yICovCisjZGVmaW5lIEQ4MzkwX0lTUl9PVlcJCTB4MTAJCS8qIE92ZXJmbG93ICovCisjZGVmaW5lIEQ4MzkwX0lTUl9DTlQJCTB4MjAJCS8qIENvdW50ZXIgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgRDgzOTBfSVNSX1JEQwkJMHg0MAkJLyogUmVtb3RlIERNQSBjb21wbGV0ZSAqLworI2RlZmluZSBEODM5MF9JU1JfUlNUCQkweDgwCQkvKiByZXNldCAqLworCisjZGVmaW5lIEQ4MzkwX1JTVEFUX1BSWAkJMHgwMQkJLyogc3VjY2Vzc2Z1bCByZWN2ICovCisjZGVmaW5lIEQ4MzkwX1JTVEFUX0NSQwkJMHgwMgkJLyogQ1JDIGVycm9yICovCisjZGVmaW5lIEQ4MzkwX1JTVEFUX0ZBRQkJMHgwNAkJLyogRnJhbWUgYWxpZ25tZW50IGVycm9yICovCisjZGVmaW5lIEQ4MzkwX1JTVEFUX09WRVIJMHgwOAkJLyogRklGTyBvdmVycnVuICovCisKKyNkZWZpbmUgRDgzOTBfVFhCVUZfU0laRQk2CisjZGVmaW5lIEQ4MzkwX1JYQlVGX0VORAkJMzIKKyNkZWZpbmUgRDgzOTBfUEFHRV9TSVpFICAgICAgICAgMjU2CisKK3N0cnVjdCByaW5nYnVmZmVyIHsKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKwl1bnNpZ25lZCBjaGFyIG5leHQ7CisJdW5zaWduZWQgc2hvcnQgbGVuOworfTsKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLworCmRpZmYgLS1naXQgYS9uZXRib290L29zZGVwLmggYi9uZXRib290L29zZGVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcyMThiZgotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3Qvb3NkZXAuaApAQCAtMCwwICsxLDk0IEBACisjaWZuZGVmCV9fT1NERVBfSF9fCisjZGVmaW5lIF9fT1NERVBfSF9fCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNkZWZpbmUJX19MSVRUTEVfRU5ESUFOCQkvKiB4ODYgKi8KKworLyogVGFrZW4gZnJvbSAvdXNyL2luY2x1ZGUvbGludXgvaGZzX3N5c2RlcC5oICovCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisjCWlmICFkZWZpbmVkKF9fY29uc3RhbnRfaHRvbmwpCisjCQlkZWZpbmUgX19jb25zdGFudF9odG9ubCh4KSAoeCkKKyMJZW5kaWYKKyMJaWYgIWRlZmluZWQoX19jb25zdGFudF9odG9ucykKKyMJCWRlZmluZSBfX2NvbnN0YW50X2h0b25zKHgpICh4KQorIwllbmRpZgorI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisjCWlmICFkZWZpbmVkKF9fY29uc3RhbnRfaHRvbmwpCisjCQlkZWZpbmUgX19jb25zdGFudF9odG9ubCh4KSBcCisgICAgICAgICgodW5zaWduZWQgbG9uZyBpbnQpKCgoKHVuc2lnbmVkIGxvbmcgaW50KSh4KSAmIDB4MDAwMDAwZmZVKSA8PCAyNCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVuc2lnbmVkIGxvbmcgaW50KSh4KSAmIDB4MDAwMGZmMDBVKSA8PCAgOCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVuc2lnbmVkIGxvbmcgaW50KSh4KSAmIDB4MDBmZjAwMDBVKSA+PiAgOCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVuc2lnbmVkIGxvbmcgaW50KSh4KSAmIDB4ZmYwMDAwMDBVKSA+PiAyNCkpKQorIwllbmRpZgorIwlpZiAhZGVmaW5lZChfX2NvbnN0YW50X2h0b25zKQorIwkJZGVmaW5lIF9fY29uc3RhbnRfaHRvbnMoeCkgXAorICAgICAgICAoKHVuc2lnbmVkIHNob3J0IGludCkoKCgodW5zaWduZWQgc2hvcnQgaW50KSh4KSAmIDB4MDBmZikgPDwgOCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1bnNpZ25lZCBzaG9ydCBpbnQpKHgpICYgMHhmZjAwKSA+PiA4KSkpCisjCWVuZGlmCisjZWxzZQorIwllcnJvciAiRG9uJ3Qga25vdyBpZiBieXRlcyBhcmUgYmlnLSBvciBsaXR0bGUtZW5kaWFuISIKKyNlbmRpZgorCisjZGVmaW5lIG50b2hsKHgpIFwKKyhfX2J1aWx0aW5fY29uc3RhbnRfcCh4KSA/IFwKKyBfX2NvbnN0YW50X2h0b25sKCh4KSkgOiBcCisgX19zd2FwMzIoeCkpCisjZGVmaW5lIGh0b25sKHgpIFwKKyhfX2J1aWx0aW5fY29uc3RhbnRfcCh4KSA/IFwKKyBfX2NvbnN0YW50X2h0b25sKCh4KSkgOiBcCisgX19zd2FwMzIoeCkpCisjZGVmaW5lIG50b2hzKHgpIFwKKyhfX2J1aWx0aW5fY29uc3RhbnRfcCh4KSA/IFwKKyBfX2NvbnN0YW50X2h0b25zKCh4KSkgOiBcCisgX19zd2FwMTYoeCkpCisjZGVmaW5lIGh0b25zKHgpIFwKKyhfX2J1aWx0aW5fY29uc3RhbnRfcCh4KSA/IFwKKyBfX2NvbnN0YW50X2h0b25zKCh4KSkgOiBcCisgX19zd2FwMTYoeCkpCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBpbnQgX19zd2FwMzIodW5zaWduZWQgbG9uZyBpbnQgeCkKK3sKKwlfX2FzbV9fKCJ4Y2hnYiAlYjAsJWgwXG5cdCIKKwkJInJvcmwgJDE2LCUwXG5cdCIKKwkJInhjaGdiICViMCwlaDAiCisJCTogIj1xIiAoeCkKKwkJOiAiMCIgKHgpKTsKKwlyZXR1cm4geDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpbnQgX19zd2FwMTYodW5zaWduZWQgc2hvcnQgaW50IHgpCit7CisJX19hc21fXygieGNoZ2IgJWIwLCVoMCIKKwkJOiAiPXEiICh4KQorCQk6ICIwIiAoeCkpOworCXJldHVybiB4OworfQorCisvKiBNYWtlIHJvdXRpbmVzIGF2YWlsYWJsZSB0byBhbGwgKi8KKyNkZWZpbmUJc3dhcDMyKHgpCV9fc3dhcDMyKHgpCisjZGVmaW5lCXN3YXAxNih4KQlfX3N3YXAxNih4KQorCisjaW5jbHVkZSAibGludXgtYXNtLWlvLmgiCisKK3R5cGVkZWYJdW5zaWduZWQgbG9uZyBBZGRyZXNzOworCisvKiBBTlNJIHByb3RvdHlwaW5nIG1hY3JvICovCisjaWZkZWYJX19TVERDX18KKyNkZWZpbmUJUCh4KQl4CisjZWxzZQorI2RlZmluZQlQKHgpCSgpCisjZW5kaWYKKworI2VuZGlmCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvbmV0Ym9vdC9vdHVsaXAuYyBiL25ldGJvb3Qvb3R1bGlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyYjE5YgotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3Qvb3R1bGlwLmMKQEAgLTAsMCArMSwzNzQgQEAKKy8qCisgIEV0aGVyYm9vdCBERUMgVHVsaXAgZHJpdmVyCisgIGFkYXB0ZWQgYnkgS2VuIFlhcCBmcm9tCisKKyAgRnJlZUJTRCBuZXRib290IERFQyAyMTE0MyBkcml2ZXIKKworICBBdXRob3I6IERhdmlkIFNoYXJwCisgICAgZGF0ZTogTm92Lzk4CisKKyBLbm93biB0byB3b3JrIG9uIERFQyBERTUwMCB1c2luZyAyMTE0My1QQyBjaGlwc2V0LgorIEV2ZW4gb24gY2FyZHMgd2l0aCB0aGUgc2FtZSBjaGlwc2V0IHRoZXJlIGNhbiBiZQorIGluY29tcGF0YWJsaXR5IHByb2JsZW1zIHdpdGggdGhlIHdheSBtZWRpYSBzZWxlY3Rpb24KKyBhbmQgc3RhdHVzIExFRCBzZXR0aW5ncyBhcmUgZG9uZS4gIFNlZSBjb21tZW50cyBiZWxvdy4KKworIFNvbWUgY29kZSBmcmFnbWVudHMgd2VyZSB0YWtlbiBmcm9tIHZlcmlvdXMgcGxhY2VzLAorIEtlbiBZYXAncyBldGhlcmJvb3QsIEZyZWVCU0QncyBpZl9kZS5jLCBhbmQgdmFyaW91cworIExpbnV4IHJlbGF0ZWQgZmlsZXMuICBERUMncyBtYW51YWxzIGZvciB0aGUgMjExNDMgYW5kCisgU1JPTSBmb3JtYXQgd2VyZSB2ZXJ5IGhlbHBmdWwuICBUaGUgTGludXggZGUgZHJpdmVyCisgZGV2ZWxvcG1lbnQgcGFnZSBoYXMgYSBudW1iZXIgb2YgbGlua3MgdG8gdXNlZnVsCisgcmVsYXRlZCBpbmZvcm1hdGlvbi4gIEhhdmUgYSBsb29rIGF0OgorIGZ0cDovL2Nlc2Rpcy5nc2ZjLm5hc2EuZ292L3B1Yi9saW51eC9kcml2ZXJzL3R1bGlwLWRldmVsLmh0bWwKKworKi8KKworI2luY2x1ZGUgImV0aGVyYm9vdC5oIgorI2luY2x1ZGUgIm5pYy5oIgorI2luY2x1ZGUgInBjaS5oIgorI2luY2x1ZGUgImNhcmRzLmgiCisjaW5jbHVkZSAib3R1bGlwLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB2ZW5kb3IsIGRldl9pZDsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpb2FkZHI7CitzdGF0aWMgdW5zaWduZWQgaW50ICptZW1iYXNlOworc3RhdGljIHVuc2lnbmVkIGNoYXIgc3JvbVsxMDI0XTsKKworI2RlZmluZSBCVUZMRU4gMTUzNiAgICAgLyogbXVzdCBiZSBsb25nd29yZCBkaXZpc2FibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1ZmZlcnMgbXVzdCBiZSBsb25nd29yZCBhbGlnbmVkICovCisKKy8qIHRyYW5zbWl0IGRlc2NyaXB0b3IgYW5kIGJ1ZmZlciAqLworc3RhdGljIHN0cnVjdCB0eGRlc2MgdHhkOworCisvKiByZWNlaXZlIGRlc2NyaXB0b3IocykgYW5kIGJ1ZmZlcihzKSAqLworI2RlZmluZSBOUlhEIDQKK3N0YXRpYyBzdHJ1Y3QgcnhkZXNjIHJ4ZFtOUlhEXTsKK3N0YXRpYyBpbnQgcnhkX3RhaWwgPSAwOworI2lmZGVmCVVTRV9MT1dNRU1fQlVGRkVSCisjZGVmaW5lIHJ4YiAoKGNoYXIgKikweDEwMDAwIC0gTlJYRCAqIEJVRkxFTikKKyNkZWZpbmUgdHhiICgoY2hhciAqKTB4MTAwMDAgLSBOUlhEICogQlVGTEVOIC0gQlVGTEVOKQorI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJ4YltOUlhEICogQlVGTEVOXTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHR4YltCVUZMRU5dOworI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGVoZHJbRVRIX0hMRU5dOyAgICAvKiBidWZmZXIgZm9yIGV0aGVybmV0IGhlYWRlciAqLworCitlbnVtIHR1bGlwX29mZnNldHMgeworICAgICAgICBDU1IwPTAsICAgIENTUjE9MHgwOCwgQ1NSMj0weDEwLCBDU1IzPTB4MTgsIENTUjQ9MHgyMCwgQ1NSNT0weDI4LAorICAgICAgICBDU1I2PTB4MzAsIENTUjc9MHgzOCwgQ1NSOD0weDQwLCBDU1I5PTB4NDgsIENTUjEwPTB4NTAsIENTUjExPTB4NTgsCisgICAgICAgIENTUjEyPTB4NjAsIENTUjEzPTB4NjgsIENTUjE0PTB4NzAsIENTUjE1PTB4NzggfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogMjExNDMgc3BlY2lmaWMgc3R1ZmYgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBYWFggYXNzdW1lIDMzTUh6IFBDSSBidXMsICB0aGlzIGlzIG5vdCB2ZXJ5IGFjY3VyYXRlIGFuZCBzaG91bGQgYmUKKyAgIHVzZWQgb25seSB3aXRoIGdyb3NzIG92ZXIgZXN0aW1hdGlvbnMgb2YgcmVxdWlyZWQgZGVsYXkgdGltZXMgdW5sZXNzCisgICB5b3UgdHVuZSBVQURKVVNUIHRvIHlvdXIgc3BlY2lmaWMgcHJvY2Vzc29yIGFuZCBJL08gc3Vic3lzdGVtICovCisKKyNkZWZpbmUgVUFESlVTVCA4NzAKK3N0YXRpYyB2b2lkIHVkZWxheSh1bnNpZ25lZCBsb25nIHVzZWMpIHsKKyAgdW5zaWduZWQgbG9uZyBpOworICBmb3IgKGk9KCh1c2VjKlVBREpVU1QpLzMzKSsxOyBpPjA7IGktLSkgKHZvaWQpIFRVTElQX0NTUl9SRUFEKGNzcl8wKTsKK30KKworLyogVGhlIGZvbGxvd2luZyBzcm9tIHJlbGF0ZWQgY29kZSB3YXMgdGFrZW4gZnJvbSBGcmVlQlNEJ3MgaWZfZGUuYyAqLworLyogd2l0aCBtaW5vciBhbHRlcmF0aW9ucyB0byBtYWtlIGl0IHdvcmsgaGVyZS4gIHRoZSBMaW51eCBjb2RlIGlzICovCisvKiBiZXR0ZXIgYnV0IHRoaXMgd2FzIGVhc2llciB0byB1c2UgKi8KKworc3RhdGljIHZvaWQgZGVsYXlfMzAwbnModm9pZCkKK3sKKyAgICBpbnQgaWR4OworICAgIGZvciAoaWR4ID0gKDMwMCAvIDMzKSArIDE7IGlkeCA+IDA7IGlkeC0tKQorICAgICAgICAodm9pZCkgVFVMSVBfQ1NSX1JFQUQoY3NyX2J1c21vZGUpOworfQorCisjZGVmaW5lIEVNSVQgZG8geyBUVUxJUF9DU1JfV1JJVEUoY3NyX3Nyb21fbWlpLCBjc3IpOyBkZWxheV8zMDBucygpOyB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBzcm9tX2lkbGUodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBiaXQsIGNzcjsKKworICAgIGNzciAgPSBTUk9NU0VMIDsgRU1JVDsKKyAgICBjc3IgID0gU1JPTVNFTCB8IFNST01SRDsgRU1JVDsKKyAgICBjc3IgXj0gU1JPTUNTOyBFTUlUOworICAgIGNzciBePSBTUk9NQ0xLT047IEVNSVQ7CisgICAgLyoKKyAgICAgKiBXcml0ZSAyNSBjeWNsZXMgb2YgMCB3aGljaCB3aWxsIGZvcmNlIHRoZSBTUk9NIHRvIGJlIGlkbGUuCisgICAgICovCisgICAgZm9yIChiaXQgPSAzICsgU1JPTV9CSVRXSURUSCArIDE2OyBiaXQgPiAwOyBiaXQtLSkgeworICAgICAgICBjc3IgXj0gU1JPTUNMS09GRjsgRU1JVDsgICAgLyogY2xvY2sgbG93OyBkYXRhIG5vdCB2YWxpZCAqLworICAgICAgICBjc3IgXj0gU1JPTUNMS09OOyBFTUlUOyAgICAgLyogY2xvY2sgaGlnaDsgZGF0YSB2YWxpZCAqLworICAgIH0KKyAgICBjc3IgXj0gU1JPTUNMS09GRjsgRU1JVDsKKyAgICBjc3IgXj0gU1JPTUNTOyBFTUlUOworICAgIGNzciAgPSAwOyBFTUlUOworfQorCitzdGF0aWMgdm9pZCBzcm9tX3JlYWQodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBpZHg7CisgICAgY29uc3QgdW5zaWduZWQgYml0d2lkdGggPSBTUk9NX0JJVFdJRFRIOworICAgIGNvbnN0IHVuc2lnbmVkIGNtZG1hc2sgPSAoU1JPTUNNRF9SRCA8PCBiaXR3aWR0aCk7CisgICAgY29uc3QgdW5zaWduZWQgbXNiID0gMSA8PCAoYml0d2lkdGggKyAzIC0gMSk7CisgICAgdW5zaWduZWQgbGFzdGlkeCA9ICgxIDw8IGJpdHdpZHRoKSAtIDE7CisKKyAgICBzcm9tX2lkbGUoKTsKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDw9IGxhc3RpZHg7IGlkeCsrKSB7CisgICAgICAgIHVuc2lnbmVkIGxhc3RiaXQsIGRhdGEsIGJpdHMsIGJpdCwgY3NyOworICAgICAgICBjc3IgID0gU1JPTVNFTCA7ICAgICAgICAgICAgICAgIEVNSVQ7CisgICAgICAgIGNzciAgPSBTUk9NU0VMIHwgU1JPTVJEOyAgICAgICAgRU1JVDsKKyAgICAgICAgY3NyIF49IFNST01DU09OOyAgICAgICAgICAgICAgICBFTUlUOworICAgICAgICBjc3IgXj0gICAgICAgICAgICBTUk9NQ0xLT047ICAgIEVNSVQ7CisKKyAgICAgICAgbGFzdGJpdCA9IDA7CisgICAgICAgIGZvciAoYml0cyA9IGlkeHxjbWRtYXNrLCBiaXQgPSBiaXR3aWR0aCArIDM7IGJpdCA+IDA7IGJpdC0tLCBiaXRzIDw8PSAxKQorIHsKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIHRoaXNiaXQgPSBiaXRzICYgbXNiOworICAgICAgICAgICAgY3NyIF49IFNST01DTEtPRkY7IEVNSVQ7ICAgIC8qIGNsb2NrIGxvdzsgZGF0YSBub3QgdmFsaWQgKi8KKyAgICAgICAgICAgIGlmICh0aGlzYml0ICE9IGxhc3RiaXQpIHsKKyAgICAgICAgICAgICAgICBjc3IgXj0gU1JPTURPVVQ7IEVNSVQ7ICAvKiBjbG9jayBsb3c7IGludmVydCBkYXRhICovCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEVNSVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjc3IgXj0gU1JPTUNMS09OOyBFTUlUOyAgICAgLyogY2xvY2sgaGlnaDsgZGF0YSB2YWxpZCAqLworICAgICAgICAgICAgbGFzdGJpdCA9IHRoaXNiaXQ7CisgICAgICAgIH0KKyAgICAgICAgY3NyIF49IFNST01DTEtPRkY7IEVNSVQ7CisKKyAgICAgICAgZm9yIChkYXRhID0gMCwgYml0cyA9IDA7IGJpdHMgPCAxNjsgYml0cysrKSB7CisgICAgICAgICAgICBkYXRhIDw8PSAxOworICAgICAgICAgICAgY3NyIF49IFNST01DTEtPTjsgRU1JVDsgICAgIC8qIGNsb2NrIGhpZ2g7IGRhdGEgdmFsaWQgKi8KKyAgICAgICAgICAgIGRhdGEgfD0gVFVMSVBfQ1NSX1JFQUQoY3NyX3Nyb21fbWlpKSAmIFNST01ESU4gPyAxIDogMDsKKyAgICAgICAgICAgIGNzciBePSBTUk9NQ0xLT0ZGOyBFTUlUOyAgICAvKiBjbG9jayBsb3c7IGRhdGEgbm90IHZhbGlkICovCisgICAgICAgIH0KKyAgICAgICAgc3JvbVtpZHgqMl0gPSBkYXRhICYgMHhGRjsKKyAgICAgICAgc3JvbVtpZHgqMisxXSA9IGRhdGEgPj4gODsKKyAgICAgICAgY3NyICA9IFNST01TRUwgfCBTUk9NUkQ7IEVNSVQ7CisgICAgICAgIGNzciAgPSAwOyBFTUlUOworICAgIH0KKyAgICBzcm9tX2lkbGUoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitFVEhfUkVTRVQgLSBSZXNldCBhZGFwdGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB0dWxpcF9yZXNldChzdHJ1Y3QgbmljICpuaWMpCit7CisgICAgICAgIGludCB4LGNudD0yOworCisgICAgICAgIG91dGwoMHgwMDAwMDAwMSwgaW9hZGRyICsgQ1NSMCk7CisgICAgICAgIHVkZWxheSgxMDAwKTsKKyAgICAgICAgLyogdHVybiBvZmYgcmVzZXQgYW5kIHNldCBjYWNoZSBhbGlnbj0xNmx3b3JkLCBidXJzdD11bmxpbWl0ICovCisgICAgICAgIG91dGwoMHgwMUEwODAwMCwgaW9hZGRyICsgQ1NSMCk7CisKKwkvKiBmb3Igc29tZSByZWFzb24gdGhlIG1lZGlhIHNlbGVjdGlvbiBkb2VzIG5vdCB0YWtlCisgICAgICAgICAgIHRoZSBmaXJzdCB0aW1lIHNlIGl0IGlzIHJlcGVhdGVkLiAgKi8KKworICAgICAgICB3aGlsZShjbnQtLSkgeworICAgICAgICAvKiBzdG9wIFRYLFJYIHByb2Nlc3NlcyAqLworICAgICAgICBpZiAoY250ID09IDEpCisJCW91dGwoMHgzMjQwNDAwMCwgaW9hZGRyICsgQ1NSNik7CisgICAgICAgIGVsc2UKKwkJb3V0bCgweDMyMDAwMDQwLCBpb2FkZHIgKyBDU1I2KTsKKworICAgICAgICAvKiBYWFggLSBtZWRpYSBzZWxlY3Rpb24gaXMgdmVuZG9yIHNwZWNpZmljIGFuZCBoYXJkIGNvZGVkIHJpZ2h0CisgICAgICAgICAgIGhlcmUuICBUaGlzIHNob3VsZCBiZSBmaXhlZCB0byB1c2UgdGhlIGhpbnRzIGluIHRoZSBTUk9NIGFuZAorICAgICAgICAgICBhbGxvdyBtZWRpYSBzZWxlY3Rpb24gYnkgdGhlIHVzZXIgYXQgcnVudGltZS4gIE1JSSBzdXBwb3J0CisgICAgICAgICAgIHNob3VsZCBhbHNvIGJlIGFkZGVkLiAgU3VwcG9ydCBmb3IgY2hpcHMgb3RoZXIgdGhhbiB0aGUKKyAgICAgICAgICAgMjExNDMgc2hvdWxkIGJlIGFkZGVkIGhlcmUgYXMgd2VsbCAgKi8KKworICAgICAgICAvKiBzdGFydCAgc2V0IHRvIDEwTWJwcyBoYWxmLWR1cGxleCAqLworCisgICAgICAgIC8qIHNldHVwIFNJQSAqLworICAgICAgICBvdXRsKDB4MCwgaW9hZGRyICsgQ1NSMTMpOyAgICAgICAgICAgICAgLyogcmVzZXQgU0lBICovCisgICAgICAgIG91dGwoMHg3ZjNmLCBpb2FkZHIgKyBDU1IxNCk7CisgICAgICAgIG91dGwoMHg4MDAwMDA4LCBpb2FkZHIgKyBDU1IxNSk7CisgICAgICAgIG91dGwoMHgwLCBpb2FkZHIgKyBDU1IxMyk7CisgICAgICAgIG91dGwoMHgxLCBpb2FkZHIgKyBDU1IxMyk7CisgICAgICAgIG91dGwoMHgyNDA0MDAwLCBpb2FkZHIgKyBDU1I2KTsKKworICAgICAgICAvKiBpbml0YWxpemUgR1AgKi8KKyAgICAgICAgb3V0bCgweDhhZjAwMDgsIGlvYWRkciArIENTUjE1KTsKKyAgICAgICAgb3V0bCgweDUwMDA4LCBpb2FkZHIgKyBDU1IxNSk7CisKKyAgICAgICAgLyogZW5kICBzZXQgdG8gMTBNYnBzIGhhbGYtZHVwbGV4ICovCisKKwlpZiAodmVuZG9yID09IFBDSV9WRU5ET1JfSURfTUFDUk9OSVggJiYgZGV2X2lkID09IFBDSV9ERVZJQ0VfSURfTVg5ODd4NSkgeworCQkvKiBkbyBzdHVmZiBmb3IgTVg5ODcxNSAqLworCQlvdXRsKDB4MDFhODAwMDAsIGlvYWRkciArIENTUjYpOworCQlvdXRsKDB4RkZGRkZGRkYsIGlvYWRkciArIENTUjE0KTsKKwkJb3V0bCgweDAwMDAxMDAwLCBpb2FkZHIgKyBDU1IxMik7CisJfQorCisgICAgICAgIG91dGwoMHgwLCBpb2FkZHIgKyBDU1I3KTsgICAgICAgLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisKKyAgICAgICAgLyogY29uc3RydWN0IHNldHVwIHBhY2tldCB3aGljaCBpcyB1c2VkIGJ5IHRoZSAyMTE0MyB0bworICAgICAgICAgICBwcm9ncmFtIGl0cyBDQU0gdG8gcmVjb2duaXplIGludGVyZXN0aW5nIE1BQyBhZGRyZXNzZXMgKi8KKworICAgICAgICBtZW1zZXQoJnR4ZCwgMCwgc2l6ZW9mKHN0cnVjdCB0eGRlc2MpKTsKKyAgICAgICAgdHhkLmJ1ZjFhZGRyID0gJnR4YlswXTsKKyAgICAgICAgdHhkLmJ1ZjJhZGRyID0gJnR4YlswXTsgICAgICAgICAvKiBqdXN0IGluIGNhc2UgKi8KKyAgICAgICAgdHhkLmJ1ZjFzeiAgID0gMTkyOyAgICAgICAgICAgICAvKiBzZXR1cCBwYWNrZXQgbXVzdCBiZSAxOTIgYnl0ZXMgKi8KKyAgICAgICAgdHhkLmJ1ZjJzeiAgID0gMDsKKyAgICAgICAgdHhkLmNvbnRyb2wgID0gMHgwMjA7ICAgICAgICAgICAvKiBzZXR1cCBwYWNrZXQgKi8KKyAgICAgICAgdHhkLnN0YXR1cyAgID0gMHg4MDAwMDAwMDsgICAgICAvKiBnaXZlIG93bmVyc2hpcCB0byAyMTE0MyAqLworCisgICAgICAgIC8qIGNvbnN0cnVjdCBwZXJmZWN0IGZpbHRlciBmcmFtZSAqLworICAgICAgICAvKiB3aXRoIG1hYyBhZGRyZXNzIGFzIGZpcnN0IG1hdGNoICovCisgICAgICAgIC8qIGFuZCBicm9hZGNhc3QgYWRkcmVzcyBmb3IgYWxsIG90aGVycyAqLworCisgICAgICAgIGZvcih4PTA7eDwxOTI7eCsrKSB0eGJbeF0gPSAweGZmOworICAgICAgICB0eGJbMF0gPSBuaWMtPm5vZGVfYWRkclswXTsKKyAgICAgICAgdHhiWzFdID0gbmljLT5ub2RlX2FkZHJbMV07CisgICAgICAgIHR4Yls0XSA9IG5pYy0+bm9kZV9hZGRyWzJdOworICAgICAgICB0eGJbNV0gPSBuaWMtPm5vZGVfYWRkclszXTsKKyAgICAgICAgdHhiWzhdID0gbmljLT5ub2RlX2FkZHJbNF07CisgICAgICAgIHR4Yls5XSA9IG5pYy0+bm9kZV9hZGRyWzVdOworICAgICAgICBvdXRsKCh1bnNpZ25lZCBsb25nKSZ0eGQsIGlvYWRkciArIENTUjQpOyAgICAgICAgLyogc2V0IHhtaXQgYnVmICovCisgICAgICAgIG91dGwoMHgyNDA2MDAwLCBpb2FkZHIgKyBDU1I2KTsgICAgICAgICAvKiBzdGFydCB0cmFuc21pdGVyICovCisKKyAgICAgICAgdWRlbGF5KDUwMDAwKTsgIC8qIHdhaXQgZm9yIHRoZSBzZXR1cCBwYWNrZXQgdG8gYmUgcHJvY2Vzc2VkICovCisKKyAgICAgICAgfQorCisgICAgICAgIC8qIHNldHVwIHJlY2VpdmUgZGVzY3JpcHRvciAqLworICAgICAgICB7CisgICAgICAgICAgaW50IHg7CisgICAgICAgICAgZm9yKHg9MDt4PE5SWEQ7eCsrKSB7CisgICAgICAgICAgICBtZW1zZXQoJnJ4ZFt4XSwgMCwgc2l6ZW9mKHN0cnVjdCByeGRlc2MpKTsKKyAgICAgICAgICAgIHJ4ZFt4XS5idWYxYWRkciA9ICZyeGJbeCAqIEJVRkxFTl07CisgICAgICAgICAgICByeGRbeF0uYnVmMmFkZHIgPSAwOyAgICAgICAgLyogbm90IHVzZWQgKi8KKyAgICAgICAgICAgIHJ4ZFt4XS5idWYxc3ogICA9IEJVRkxFTjsKKyAgICAgICAgICAgIHJ4ZFt4XS5idWYyc3ogICA9IDA7ICAgICAgICAvKiBub3QgdXNlZCAqLworICAgICAgICAgICAgcnhkW3hdLmNvbnRyb2wgID0gMHgwOworICAgICAgICAgICAgcnhkW3hdLnN0YXR1cyAgID0gMHg4MDAwMDAwMDsgICAgICAgLyogZ2l2ZSBvd25lcnNoaXAgaXQgdG8gMjExNDMgKi8KKyAgICAgICAgICB9CisgICAgICAgICAgcnhkW05SWEQgLSAxXS5jb250cm9sICA9IDB4MDA4OyAgICAgICAvKiBTZXQgUmVjZWl2ZSBlbmQgb2YgcmluZyBvbiBsYQorc3QgZGVzY3JpcHRvciAqLworICAgICAgICAgIHJ4ZF90YWlsID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHRlbGwgREMyMTFYWCB3aGVyZSB0byBmaW5kIHJ4IGRlc2NyaXB0b3IgbGlzdCAqLworICAgICAgICBvdXRsKCh1bnNpZ25lZCBsb25nKSZyeGRbMF0sIGlvYWRkciArIENTUjMpOworICAgICAgICAvKiBzdGFydCB0aGUgcmVjZWl2ZXIgKi8KKyAgICAgICAgb3V0bCgweDI0MDYwMDIsIGlvYWRkciArIENTUjYpOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIX1RSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGNvbnN0IGNoYXIgcGFkbWFwW10gPSB7CisgICAgICAgIDAsIDMsIDIsIDF9OworCitzdGF0aWMgdm9pZCB0dWxpcF90cmFuc21pdChzdHJ1Y3QgbmljICpuaWMsIGNvbnN0IGNoYXIgKmQsIHVuc2lnbmVkIGludCB0LCB1bnNpZ25lZCBpbnQgcywgY29uc3QgY2hhciAqcCkKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyB0aW1lOworCisgICAgICAgIC8qIHNldHVwIGV0aGVybmV0IGhlYWRlciAqLworCisJbWVtY3B5KGVoZHIsIGQsIEVUSF9BTEVOKTsKKwltZW1jcHkoJmVoZHJbRVRIX0FMRU5dLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOworICAgICAgICBlaGRyW0VUSF9BTEVOKjJdID0gKHQgPj4gOCkgJiAweGZmOworICAgICAgICBlaGRyW0VUSF9BTEVOKjIrMV0gPSB0ICYgMHhmZjsKKworICAgICAgICAvKiBzZXR1cCB0aGUgdHJhbnNtaXQgZGVzY3JpcHRvciAqLworCisgICAgICAgIG1lbXNldCgmdHhkLCAwLCBzaXplb2Yoc3RydWN0IHR4ZGVzYykpOworCisgICAgICAgIHR4ZC5idWYxYWRkciA9ICZlaGRyWzBdOyAgICAgICAgLyogZXRoZXJuZXQgaGVhZGVyICovCisgICAgICAgIHR4ZC5idWYxc3ogICA9IEVUSF9ITEVOOworCisgICAgICAgIHR4ZC5idWYyYWRkciA9IHA7ICAgICAgICAgICAgICAgLyogcGFja2V0IHRvIHRyYW5zbWl0ICovCisgICAgICAgIHR4ZC5idWYyc3ogICA9IHM7CisKKyAgICAgICAgdHhkLmNvbnRyb2wgID0gMHgxODg7ICAgICAgICAgICAvKiBMUytGUytURVIgKi8KKworICAgICAgICB0eGQuc3RhdHVzICAgPSAweDgwMDAwMDAwOyAgICAgIC8qIGdpdmUgaXQgdG8gMjExNDMgKi8KKworICAgICAgICBvdXRsKGlubChpb2FkZHIgKyBDU1I2KSAmIH4weDAwMDA0MDAwLCBpb2FkZHIgKyBDU1I2KTsKKyAgICAgICAgb3V0bCgodW5zaWduZWQgbG9uZykmdHhkLCBpb2FkZHIgKyBDU1I0KTsKKyAgICAgICAgb3V0bChpbmwoaW9hZGRyICsgQ1NSNikgfCAweDAwMDA0MDAwLCBpb2FkZHIgKyBDU1I2KTsKKworLyogICBXYWl0IGZvciB0cmFuc21pdCB0byBjb21wbGV0ZSBiZWZvcmUgcmV0dXJuaW5nLiAgbm90IHdlbGwgdGVzdGVkLgorCisgICAgICAgIHRpbWUgPSBjdXJydGlja3MoKTsKKyAgICAgICAgd2hpbGUodHhkLnN0YXR1cyAmIDB4ODAwMDAwMDApIHsKKyAgICAgICAgICBpZiAoY3VycnRpY2tzKCkgLSB0aW1lID4gMjApIHsKKyAgICAgICAgICAgIHByaW50ZigidHJhbnNtaXQgdGltZW91dC5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisqLworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRVRIX1BPTEwgLSBXYWl0IGZvciBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHR1bGlwX3BvbGwoc3RydWN0IG5pYyAqbmljKQoreworICAgICAgICBpZiAocnhkW3J4ZF90YWlsXS5zdGF0dXMgJiAweDgwMDAwMDAwKSByZXR1cm4gMDsKKworICAgICAgICBuaWMtPnBhY2tldGxlbiA9IChyeGRbcnhkX3RhaWxdLnN0YXR1cyAmIDB4M0ZGRjAwMDApID4+IDE2OworCisgICAgICAgIC8qIGNvcHkgcGFja2V0IHRvIHdvcmtpbmcgYnVmZmVyICovCisgICAgICAgIC8qIFhYWCAtIHRoaXMgY29weSBjb3VsZCBiZSBhdm9pZGVkIHdpdGggYSBsaXR0bGUgbW9yZSB3b3JrCisgICAgICAgICAgIGJ1dCBmb3Igbm93IHdlIGFyZSBjb250ZW50IHdpdGggaXQgYmVjYXVzZSB0aGUgb3B0aW1pc2VkCisgICAgICAgICAgIG1lbWNweSgsICwgKSBpcyBxdWl0ZSBmYXN0ICovCisKKyAgICAgICAgbWVtY3B5KG5pYy0+cGFja2V0LCByeGIgKyByeGRfdGFpbCAqIEJVRkxFTiwgbmljLT5wYWNrZXRsZW4pOworCisgICAgICAgIC8qIHJldHVybiB0aGUgZGVzY3JpcHRvciBhbmQgYnVmZmVyIHRvIHJlY2lldmUgcmluZyAqLworICAgICAgICByeGRbcnhkX3RhaWxdLnN0YXR1cyA9IDB4ODAwMDAwMDA7CisgICAgICAgIHJ4ZF90YWlsKys7CisgICAgICAgIGlmIChyeGRfdGFpbCA9PSBOUlhEKSByeGRfdGFpbCA9IDA7CisKKyAgICAgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHR1bGlwX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQoreworCS8qIG5vdGhpbmcgZm9yIHRoZSBtb21lbnQgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitFVEhfUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgbmljICpvdHVsaXBfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqaW9fYWRkcnMsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCit7CisgICAgICAgIGludCBpOworCisJaWYgKGlvX2FkZHJzID09IDAgfHwgKmlvX2FkZHJzID09IDApCisJCXJldHVybiAoMCk7CisJdmVuZG9yID0gcGNpLT52ZW5kb3I7CisJZGV2X2lkID0gcGNpLT5kZXZfaWQ7CisJaW9hZGRyID0gKmlvX2FkZHJzOworCW1lbWJhc2UgPSAodW5zaWduZWQgaW50ICopcGNpLT5tZW1iYXNlOworCisgICAgICAgIC8qIHdha2V1cCBjaGlwICovCisgICAgICAgIHBjaWJpb3Nfd3JpdGVfY29uZmlnX2R3b3JkKHBjaS0+YnVzLHBjaS0+ZGV2Zm4sMHg0MCwweDAwMDAwMDAwKTsKKworICAgICAgICAvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IHByb2Nlc3Nlcy4gKi8KKyAgICAgICAgLyogb3V0bChpbmwoaW9hZGRyICsgQ1NSNikgJiB+MHgyMDAyLCBpb2FkZHIgKyBDU1I2KTsgKi8KKyAgICAgICAgLyogQ2xlYXIgdGhlIG1pc3NlZC1wYWNrZXQgY291bnRlci4gKi8KKyAgICAgICAgLyogKHZvbGF0aWxlIGludClpbmwoaW9hZGRyICsgQ1NSOCk7ICovCisKKyAgICAgICAgc3JvbV9yZWFkKCk7CisKKwlmb3IgKGk9MDsgaSA8IEVUSF9BTEVOOyBpKyspCisJCW5pYy0+bm9kZV9hZGRyW2ldID0gc3JvbVsyMCtpXTsKKworICAgICAgICBwcmludGYoIlR1bGlwICUhIGF0IGlvYWRkciAlI2hYXG4iLCBuaWMtPm5vZGVfYWRkciwgaW9hZGRyKTsKKworICAgICAgICB0dWxpcF9yZXNldChuaWMpOworCisJbmljLT5yZXNldCA9IHR1bGlwX3Jlc2V0OworCW5pYy0+cG9sbCA9IHR1bGlwX3BvbGw7CisJbmljLT50cmFuc21pdCA9IHR1bGlwX3RyYW5zbWl0OworCW5pYy0+ZGlzYWJsZSA9IHR1bGlwX2Rpc2FibGU7CisgICAgICAgIHJldHVybiBuaWM7Cit9CmRpZmYgLS1naXQgYS9uZXRib290L290dWxpcC5oIGIvbmV0Ym9vdC9vdHVsaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTFhYTkwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9vdHVsaXAuaApAQCAtMCwwICsxLDc2IEBACisvKiBtb3N0bHkgc3RvbGVuIGZyb20gRnJlZUJTRCBpZl9kZS5jLCBpZl9kZXZhci5oICovCisKKyNkZWZpbmUgVFVMSVBfQ1NSX1JFQUQoY3NyKQkJKG1lbWJhc2VbY3NyKjJdKQorI2RlZmluZSBDU1JfUkVBRChjc3IpCQkJKG1lbWJhc2VbY3NyKjJdKQorI2RlZmluZSBUVUxJUF9DU1JfV1JJVEUoY3NyLCB2YWwpCShtZW1iYXNlW2NzcioyXSA9IHZhbCkKKyNkZWZpbmUgQ1NSX1dSSVRFKGNzciwgdmFsKQkJKG1lbWJhc2VbY3NyKjJdID0gdmFsKQorCisjZGVmaW5lIGNzcl8wCQkJMAorI2RlZmluZSBjc3JfMQkJCTEKKyNkZWZpbmUgY3NyXzIJCQkyCisjZGVmaW5lIGNzcl8zCQkJMworI2RlZmluZSBjc3JfNAkJCTQKKyNkZWZpbmUgY3NyXzUJCQk1CisjZGVmaW5lIGNzcl82CQkJNgorI2RlZmluZSBjc3JfNwkJCTcKKyNkZWZpbmUgY3NyXzgJCQk4CisjZGVmaW5lIGNzcl85CQkJOQorI2RlZmluZSBjc3JfMTAJCQkxMAorI2RlZmluZSBjc3JfMTEJCQkxMQorI2RlZmluZSBjc3JfMTIJCQkxMgorI2RlZmluZSBjc3JfMTMJCQkxMworI2RlZmluZSBjc3JfMTQJCQkxNAorI2RlZmluZSBjc3JfMTUJCQkxNQorCisjZGVmaW5lIGNzcl9idXNtb2RlCQljc3JfMAorI2RlZmluZSBjc3JfdHhwb2xsCQljc3JfMQorI2RlZmluZSBjc3Jfcnhwb2xsCQljc3JfMgorI2RlZmluZSBjc3JfcnhsaXN0CQljc3JfMworI2RlZmluZSBjc3JfdHhsaXN0CQljc3JfNAorI2RlZmluZSBjc3Jfc3RhdHVzCQljc3JfNQorI2RlZmluZSBjc3JfY29tbWFuZAkJY3NyXzYKKyNkZWZpbmUgY3NyX2ludHIJCWNzcl83CisjZGVmaW5lIGNzcl9taXNzZWRfZnJhbWVzCWNzcl84CisjZGVmaW5lIGNzcl9lbmV0cm9tCQljc3JfOQkJLyogMjEwNDAgKi8KKyNkZWZpbmUgY3NyX3Jlc2VydmVkCQljc3JfMTAJCS8qIDIxMDQwICovCisjZGVmaW5lIGNzcl9mdWxsX2R1cGxleAkJY3NyXzExCQkvKiAyMTA0MCAqLworI2RlZmluZSBjc3JfYm9vdHJvbQkJY3NyXzEwCQkvKiAyMTA0MS8yMTE0MEEvPz8gKi8KKyNkZWZpbmUgY3NyX2dwCQkJY3NyXzEyCQkvKiAyMTE0MCogKi8KKyNkZWZpbmUgY3NyX3dhdGNoZG9nCQljc3JfMTUJCS8qIDIxMTQwKiAqLworI2RlZmluZSBjc3JfZ3BfdGltZXIJCWNzcl8xMQkJLyogMjEwNDEvMjExNDAqICovCisjZGVmaW5lIGNzcl9zcm9tX21paQkJY3NyXzkJCS8qIDIxMDQxLzIxMTQwKiAqLworI2RlZmluZSBjc3Jfc2lhX3N0YXR1cwkJY3NyXzEyCQkvKiAyMTA0eCAqLworI2RlZmluZSBjc3Jfc2lhX2Nvbm5lY3Rpdml0eQljc3JfMTMJCS8qIDIxMDR4ICovCisjZGVmaW5lIGNzcl9zaWFfdHhfcngJCWNzcl8xNAkJLyogMjEwNHggKi8KKyNkZWZpbmUgY3NyX3NpYV9nZW5lcmFsCQljc3JfMTUJCS8qIDIxMDR4ICovCisKKyNkZWZpbmUgU1JPTVNFTAkJMHgwODAwCisjZGVmaW5lIFNST01DUwkJMHgwMDAxCisjZGVmaW5lIFNST01DTEtPTgkweDAwMDIKKyNkZWZpbmUgU1JPTUNMS09GRgkweDAwMDIKKyNkZWZpbmUgU1JPTVJECQkweDQwMDAKKyNkZWZpbmUgU1JPTVdSCQkweDIwMDAKKyNkZWZpbmUgU1JPTV9CSVRXSURUSAk2CisjZGVmaW5lIFNST01DTURfUkQJNgorI2RlZmluZSBTUk9NQ1NPTgkweDAwMDEKKyNkZWZpbmUgU1JPTURPVVQJMHgwMDA0CisjZGVmaW5lIFNST01ESU4JCTB4MDAwOAorCisKK3N0cnVjdCB0eGRlc2MgeworCXVuc2lnbmVkIGxvbmcJc3RhdHVzOwkJLyogb3duZXIsIHN0YXR1cyAqLworCXVuc2lnbmVkIGxvbmcJYnVmMXN6OjExLAkvKiBzaXplIG9mIGJ1ZmZlciAxICovCisJCQlidWYyc3o6MTEsCS8qIHNpemUgb2YgYnVmZmVyIDIgKi8KKwkJCWNvbnRyb2w6MTA7CS8qIGNvbnRyb2wgYml0cyAqLworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZjFhZGRyOwkvKiBidWZmZXIgMSBhZGRyZXNzICovCisJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmMmFkZHI7CS8qIGJ1ZmZlciAyIGFkZHJlc3MgKi8KK307CisKK3N0cnVjdCByeGRlc2MgeworCXVuc2lnbmVkIGxvbmcJc3RhdHVzOwkJLyogb3duZXIsIHN0YXR1cyAqLworCXVuc2lnbmVkIGxvbmcJYnVmMXN6OjExLAkvKiBzaXplIG9mIGJ1ZmZlciAxICovCisJCQlidWYyc3o6MTEsCS8qIHNpemUgb2YgYnVmZmVyIDIgKi8KKwkJCWNvbnRyb2w6MTA7CS8qIGNvbnRyb2wgYml0cyAqLworCXVuc2lnbmVkIGNoYXIJKmJ1ZjFhZGRyOwkvKiBidWZmZXIgMSBhZGRyZXNzICovCisJdW5zaWduZWQgY2hhcgkqYnVmMmFkZHI7CS8qIGJ1ZmZlciAyIGFkZHJlc3MgKi8KK307CmRpZmYgLS1naXQgYS9uZXRib290L3BjaS5jIGIvbmV0Ym9vdC9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzFjODU2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9wY2kuYwpAQCAtMCwwICsxLDUwMSBAQAorLyoKKyoqIFN1cHBvcnQgZm9yIE5FMjAwMCBQQ0kgY2xvbmVzIGFkZGVkIERhdmlkIE1vbnJvIEp1bmUgMTk5NworKiogR2VuZXJhbGlzZWQgdG8gb3RoZXIgTklDcyBieSBLZW4gWWFwIEp1bHkgMTk5NworKioKKyoqIE1vc3Qgb2YgdGhpcyBpcyB0YWtlbiBmcm9tOgorKioKKyoqIC91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvcGNpL3BjaS5jCisqKiAvdXNyL3NyYy9saW51eC9pbmNsdWRlL2xpbnV4L3BjaS5oCisqKiAvdXNyL3NyYy9saW51eC9hcmNoL2kzODYvYmlvczMyLmMKKyoqIC91c3Ivc3JjL2xpbnV4L2luY2x1ZGUvbGludXgvYmlvczMyLmgKKyoqIC91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvbmV0L25lLmMKKyovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlICJldGhlcmJvb3QuaCIKKyNpbmNsdWRlICJwY2kuaCIKKworLyojZGVmaW5lCURFQlVHCTEqLworI2RlZmluZSBERUJVRwkwCisKKyNpZmRlZglDT05GSUdfUENJX0RJUkVDVAorI2RlZmluZSAgUENJQklPU19TVUNDRVNTRlVMICAgICAgICAgICAgICAgIDB4MDAKKworLyoKKyAqIEZ1bmN0aW9ucyBmb3IgYWNjZXNzaW5nIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHdpdGggdHlwZSAxIGFjY2Vzc2VzCisgKi8KKworI2RlZmluZSBDT05GSUdfQ01EKGJ1cywgZGV2aWNlX2ZuLCB3aGVyZSkgICAoMHg4MDAwMDAwMCB8IChidXMgPDwgMTYpIHwgKGRldmljZV9mbiA8PCA4KSB8ICh3aGVyZSAmIH4zKSkKKworaW50IHBjaWJpb3NfcmVhZF9jb25maWdfYnl0ZSh1bnNpZ25lZCBpbnQgYnVzLCB1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLAorCQkJICAgICAgIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgY2hhciAqdmFsdWUpCit7CisgICAgb3V0bChDT05GSUdfQ01EKGJ1cyxkZXZpY2VfZm4sd2hlcmUpLCAweENGOCk7CisgICAgKnZhbHVlID0gaW5iKDB4Q0ZDICsgKHdoZXJlJjMpKTsKKyAgICByZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitpbnQgcGNpYmlvc19yZWFkX2NvbmZpZ193b3JkICh1bnNpZ25lZCBpbnQgYnVzLAorICAgIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgc2hvcnQgKnZhbHVlKQoreworICAgIG91dGwoQ09ORklHX0NNRChidXMsZGV2aWNlX2ZuLHdoZXJlKSwgMHhDRjgpOworICAgICp2YWx1ZSA9IGludygweENGQyArICh3aGVyZSYyKSk7CisgICAgcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworaW50IHBjaWJpb3NfcmVhZF9jb25maWdfZHdvcmQgKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sCisJCQkJIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgaW50ICp2YWx1ZSkKK3sKKyAgICBvdXRsKENPTkZJR19DTUQoYnVzLGRldmljZV9mbix3aGVyZSksIDB4Q0Y4KTsKKyAgICAqdmFsdWUgPSBpbmwoMHhDRkMpOworICAgIHJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKK2ludCBwY2liaW9zX3dyaXRlX2NvbmZpZ19ieXRlICh1bnNpZ25lZCBpbnQgYnVzLCB1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLAorCQkJCSB1bnNpZ25lZCBpbnQgd2hlcmUsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisgICAgb3V0bChDT05GSUdfQ01EKGJ1cyxkZXZpY2VfZm4sd2hlcmUpLCAweENGOCk7CisgICAgb3V0Yih2YWx1ZSwgMHhDRkMgKyAod2hlcmUmMykpOworICAgIHJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKK2ludCBwY2liaW9zX3dyaXRlX2NvbmZpZ193b3JkICh1bnNpZ25lZCBpbnQgYnVzLCB1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLAorCQkJCSB1bnNpZ25lZCBpbnQgd2hlcmUsIHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworICAgIG91dGwoQ09ORklHX0NNRChidXMsZGV2aWNlX2ZuLHdoZXJlKSwgMHhDRjgpOworICAgIG91dHcodmFsdWUsIDB4Q0ZDICsgKHdoZXJlJjIpKTsKKyAgICByZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitpbnQgcGNpYmlvc193cml0ZV9jb25maWdfZHdvcmQgKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgaW50IHZhbHVlKQoreworICAgIG91dGwoQ09ORklHX0NNRChidXMsZGV2aWNlX2ZuLHdoZXJlKSwgMHhDRjgpOworICAgIG91dGwodmFsdWUsIDB4Q0ZDKTsKKyAgICByZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCisjdW5kZWYgQ09ORklHX0NNRAorCisjZWxzZQkgLyogQ09ORklHX1BDSV9ESVJFQ1QgIG5vdCBkZWZpbmVkICovCisKK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKwl1bnNpZ25lZCBzaG9ydCBzZWdtZW50OworfSBiaW9zMzJfaW5kaXJlY3QgPSB7IDAsIEtFUk5fQ09ERV9TRUcgfTsKKworc3RhdGljIGxvbmcgcGNpYmlvc19lbnRyeTsKK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKwl1bnNpZ25lZCBzaG9ydCBzZWdtZW50OworfSBwY2lfaW5kaXJlY3QgPSB7IDAsIEtFUk5fQ09ERV9TRUcgfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYmlvczMyX3NlcnZpY2UodW5zaWduZWQgbG9uZyBzZXJ2aWNlKQoreworCXVuc2lnbmVkIGNoYXIgcmV0dXJuX2NvZGU7CS8qICVhbCAqLworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsJCS8qICVlYnggKi8KKwl1bnNpZ25lZCBsb25nIGxlbmd0aDsJCS8qICVlY3ggKi8KKwl1bnNpZ25lZCBsb25nIGVudHJ5OwkJLyogJWVkeCAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKKwlfX2FzbV9fKAorI2lmZGVmIEFCU09MVVRFX1dJVEhPVVRfQVNURVJJU0sKKwkJImxjYWxsICglJWVkaSkiCisjZWxzZQorCQkibGNhbGwgKiglJWVkaSkiCisjZW5kaWYKKwkJOiAiPWEiIChyZXR1cm5fY29kZSksCisJCSAgIj1iIiAoYWRkcmVzcyksCisJCSAgIj1jIiAobGVuZ3RoKSwKKwkJICAiPWQiIChlbnRyeSkKKwkJOiAiMCIgKHNlcnZpY2UpLAorCQkgICIxIiAoMCksCisJCSAgIkQiICgmYmlvczMyX2luZGlyZWN0KSk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisKKwlzd2l0Y2ggKHJldHVybl9jb2RlKSB7CisJCWNhc2UgMDoKKwkJCXJldHVybiBhZGRyZXNzICsgZW50cnk7CisJCWNhc2UgMHg4MDoJLyogTm90IHByZXNlbnQgKi8KKwkJCXByaW50ZigiYmlvczMyX3NlcnZpY2UoJWQpIDogbm90IHByZXNlbnRcbiIsIHNlcnZpY2UpOworCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6IC8qIFNob3VsZG4ndCBoYXBwZW4gKi8KKwkJCXByaW50ZigiYmlvczMyX3NlcnZpY2UoJWQpIDogcmV0dXJuZWQgJSNYLCBtYWlsIGRyZXdAY29sb3JhZG8uZWR1XG4iLAorCQkJCXNlcnZpY2UsIHJldHVybl9jb2RlKTsKKwkJCXJldHVybiAwOworCX0KK30KKworaW50IHBjaWJpb3NfcmVhZF9jb25maWdfYnl0ZSh1bnNpZ25lZCBpbnQgYnVzLAorICAgICAgICB1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLCB1bnNpZ25lZCBpbnQgd2hlcmUsIHVuc2lnbmVkIGNoYXIgKnZhbHVlKQoreworICAgICAgICB1bnNpZ25lZCBsb25nIHJldDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBieCA9IChidXMgPDwgOCkgfCBkZXZpY2VfZm47CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICAgICAgc2F2ZV9mbGFncyhmbGFncyk7CisgICAgICAgIF9fYXNtX18oCisjaWZkZWYgQUJTT0xVVEVfV0lUSE9VVF9BU1RFUklTSworCQkibGNhbGwgKCUlZXNpKVxuXHQiCisjZWxzZQorCQkibGNhbGwgKiglJWVzaSlcblx0IgorI2VuZGlmCisgICAgICAgICAgICAgICAgImpjIDFmXG5cdCIKKyAgICAgICAgICAgICAgICAieG9yICUlYWgsICUlYWhcbiIKKyAgICAgICAgICAgICAgICAiMToiCisgICAgICAgICAgICAgICAgOiAiPWMiICgqdmFsdWUpLAorICAgICAgICAgICAgICAgICAgIj1hIiAocmV0KQorICAgICAgICAgICAgICAgIDogIjEiIChQQ0lCSU9TX1JFQURfQ09ORklHX0JZVEUpLAorICAgICAgICAgICAgICAgICAgImIiIChieCksCisgICAgICAgICAgICAgICAgICAiRCIgKChsb25nKSB3aGVyZSksCisgICAgICAgICAgICAgICAgICAiUyIgKCZwY2lfaW5kaXJlY3QpKTsKKyAgICAgICAgcmVzdG9yZV9mbGFncyhmbGFncyk7CisgICAgICAgIHJldHVybiAoaW50KSAocmV0ICYgMHhmZjAwKSA+PiA4OworfQorCitpbnQgcGNpYmlvc19yZWFkX2NvbmZpZ193b3JkKHVuc2lnbmVkIGludCBidXMsCisgICAgICAgIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgc2hvcnQgKnZhbHVlKQoreworICAgICAgICB1bnNpZ25lZCBsb25nIHJldDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBieCA9IChidXMgPDwgOCkgfCBkZXZpY2VfZm47CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICAgICAgc2F2ZV9mbGFncyhmbGFncyk7CisgICAgICAgIF9fYXNtX18oCisjaWZkZWYgQUJTT0xVVEVfV0lUSE9VVF9BU1RFUklTSworCQkibGNhbGwgKCUlZXNpKVxuXHQiCisjZWxzZQorCQkibGNhbGwgKiglJWVzaSlcblx0IgorI2VuZGlmCisgICAgICAgICAgICAgICAgImpjIDFmXG5cdCIKKyAgICAgICAgICAgICAgICAieG9yICUlYWgsICUlYWhcbiIKKyAgICAgICAgICAgICAgICAiMToiCisgICAgICAgICAgICAgICAgOiAiPWMiICgqdmFsdWUpLAorICAgICAgICAgICAgICAgICAgIj1hIiAocmV0KQorICAgICAgICAgICAgICAgIDogIjEiIChQQ0lCSU9TX1JFQURfQ09ORklHX1dPUkQpLAorICAgICAgICAgICAgICAgICAgImIiIChieCksCisgICAgICAgICAgICAgICAgICAiRCIgKChsb25nKSB3aGVyZSksCisgICAgICAgICAgICAgICAgICAiUyIgKCZwY2lfaW5kaXJlY3QpKTsKKyAgICAgICAgcmVzdG9yZV9mbGFncyhmbGFncyk7CisgICAgICAgIHJldHVybiAoaW50KSAocmV0ICYgMHhmZjAwKSA+PiA4OworfQorCitpbnQgcGNpYmlvc19yZWFkX2NvbmZpZ19kd29yZCh1bnNpZ25lZCBpbnQgYnVzLAorICAgICAgICB1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLCB1bnNpZ25lZCBpbnQgd2hlcmUsIHVuc2lnbmVkIGludCAqdmFsdWUpCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgcmV0OworICAgICAgICB1bnNpZ25lZCBsb25nIGJ4ID0gKGJ1cyA8PCA4KSB8IGRldmljZV9mbjsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgICAgICBzYXZlX2ZsYWdzKGZsYWdzKTsKKyAgICAgICAgX19hc21fXygKKyNpZmRlZiBBQlNPTFVURV9XSVRIT1VUX0FTVEVSSVNLCisJCSJsY2FsbCAoJSVlc2kpXG5cdCIKKyNlbHNlCisJCSJsY2FsbCAqKCUlZXNpKVxuXHQiCisjZW5kaWYKKyAgICAgICAgICAgICAgICAiamMgMWZcblx0IgorICAgICAgICAgICAgICAgICJ4b3IgJSVhaCwgJSVhaFxuIgorICAgICAgICAgICAgICAgICIxOiIKKyAgICAgICAgICAgICAgICA6ICI9YyIgKCp2YWx1ZSksCisgICAgICAgICAgICAgICAgICAiPWEiIChyZXQpCisgICAgICAgICAgICAgICAgOiAiMSIgKFBDSUJJT1NfUkVBRF9DT05GSUdfRFdPUkQpLAorICAgICAgICAgICAgICAgICAgImIiIChieCksCisgICAgICAgICAgICAgICAgICAiRCIgKChsb25nKSB3aGVyZSksCisgICAgICAgICAgICAgICAgICAiUyIgKCZwY2lfaW5kaXJlY3QpKTsKKyAgICAgICAgcmVzdG9yZV9mbGFncyhmbGFncyk7CisgICAgICAgIHJldHVybiAoaW50KSAocmV0ICYgMHhmZjAwKSA+PiA4OworfQorCitpbnQgcGNpYmlvc193cml0ZV9jb25maWdfYnl0ZSAodW5zaWduZWQgaW50IGJ1cywKKwl1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLCB1bnNpZ25lZCBpbnQgd2hlcmUsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyByZXQ7CisJdW5zaWduZWQgbG9uZyBieCA9IChidXMgPDwgOCkgfCBkZXZpY2VfZm47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKKwlfX2FzbV9fKAorI2lmZGVmIEFCU09MVVRFX1dJVEhPVVRfQVNURVJJU0sKKwkJImxjYWxsICglJWVzaSlcblx0IgorI2Vsc2UKKwkJImxjYWxsICooJSVlc2kpXG5cdCIKKyNlbmRpZgorCQkiamMgMWZcblx0IgorCQkieG9yICUlYWgsICUlYWhcbiIKKwkJIjE6IgorCQk6ICI9YSIgKHJldCkKKwkJOiAiMCIgKFBDSUJJT1NfV1JJVEVfQ09ORklHX0JZVEUpLAorCQkgICJjIiAodmFsdWUpLAorCQkgICJiIiAoYngpLAorCQkgICJEIiAoKGxvbmcpIHdoZXJlKSwKKwkJICAiUyIgKCZwY2lfaW5kaXJlY3QpKTsKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwlyZXR1cm4gKGludCkgKHJldCAmIDB4ZmYwMCkgPj4gODsKK30KKworaW50IHBjaWJpb3Nfd3JpdGVfY29uZmlnX3dvcmQgKHVuc2lnbmVkIGludCBidXMsCisJdW5zaWduZWQgaW50IGRldmljZV9mbiwgdW5zaWduZWQgaW50IHdoZXJlLCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJldDsKKwl1bnNpZ25lZCBsb25nIGJ4ID0gKGJ1cyA8PCA4KSB8IGRldmljZV9mbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOworCV9fYXNtX18oCisjaWZkZWYgQUJTT0xVVEVfV0lUSE9VVF9BU1RFUklTSworCQkibGNhbGwgKCUlZXNpKVxuXHQiCisjZWxzZQorCQkibGNhbGwgKiglJWVzaSlcblx0IgorI2VuZGlmCisJCSJqYyAxZlxuXHQiCisJCSJ4b3IgJSVhaCwgJSVhaFxuIgorCQkiMToiCisJCTogIj1hIiAocmV0KQorCQk6ICIwIiAoUENJQklPU19XUklURV9DT05GSUdfV09SRCksCisJCSAgImMiICh2YWx1ZSksCisJCSAgImIiIChieCksCisJCSAgIkQiICgobG9uZykgd2hlcmUpLAorCQkgICJTIiAoJnBjaV9pbmRpcmVjdCkpOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCXJldHVybiAoaW50KSAocmV0ICYgMHhmZjAwKSA+PiA4OworfQorCitpbnQgcGNpYmlvc193cml0ZV9jb25maWdfZHdvcmQgKHVuc2lnbmVkIGludCBidXMsCisJdW5zaWduZWQgaW50IGRldmljZV9mbiwgdW5zaWduZWQgaW50IHdoZXJlLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyByZXQ7CisJdW5zaWduZWQgbG9uZyBieCA9IChidXMgPDwgOCkgfCBkZXZpY2VfZm47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKKwlfX2FzbV9fKAorI2lmZGVmIEFCU09MVVRFX1dJVEhPVVRfQVNURVJJU0sKKwkJImxjYWxsICglJWVzaSlcblx0IgorI2Vsc2UKKwkJImxjYWxsICooJSVlc2kpXG5cdCIKKyNlbmRpZgorCQkiamMgMWZcblx0IgorCQkieG9yICUlYWgsICUlYWhcbiIKKwkJIjE6IgorCQk6ICI9YSIgKHJldCkKKwkJOiAiMCIgKFBDSUJJT1NfV1JJVEVfQ09ORklHX0RXT1JEKSwKKwkJICAiYyIgKHZhbHVlKSwKKwkJICAiYiIgKGJ4KSwKKwkJICAiRCIgKChsb25nKSB3aGVyZSksCisJCSAgIlMiICgmcGNpX2luZGlyZWN0KSk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJcmV0dXJuIChpbnQpIChyZXQgJiAweGZmMDApID4+IDg7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3BjaWJpb3Modm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHNpZ25hdHVyZTsKKwl1bnNpZ25lZCBjaGFyIHByZXNlbnRfc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgbWFqb3JfcmV2aXNpb247CisJdW5zaWduZWQgY2hhciBtaW5vcl9yZXZpc2lvbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBwYWNrOworCisJaWYgKChwY2liaW9zX2VudHJ5ID0gYmlvczMyX3NlcnZpY2UoUENJX1NFUlZJQ0UpKSkgeworCQlwY2lfaW5kaXJlY3QuYWRkcmVzcyA9IHBjaWJpb3NfZW50cnk7CisKKwkJc2F2ZV9mbGFncyhmbGFncyk7CisJCV9fYXNtX18oCisjaWZkZWYgQUJTT0xVVEVfV0lUSE9VVF9BU1RFUklTSworCQkJImxjYWxsICglJWVkaSlcblx0IgorI2Vsc2UKKwkJCSJsY2FsbCAqKCUlZWRpKVxuXHQiCisjZW5kaWYKKwkJCSJqYyAxZlxuXHQiCisJCQkieG9yICUlYWgsICUlYWhcbiIKKwkJCSIxOlx0c2hsICQ4LCAlJWVheFxuXHQiCisJCQkibW92dyAlJWJ4LCAlJWF4IgorCQkJOiAiPWQiIChzaWduYXR1cmUpLAorCQkJICAiPWEiIChwYWNrKQorCQkJOiAiMSIgKFBDSUJJT1NfUENJX0JJT1NfUFJFU0VOVCksCisJCQkgICJEIiAoJnBjaV9pbmRpcmVjdCkKKwkJCTogImJ4IiwgImN4Iik7CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJCXByZXNlbnRfc3RhdHVzID0gKHBhY2sgPj4gMTYpICYgMHhmZjsKKwkJbWFqb3JfcmV2aXNpb24gPSAocGFjayA+PiA4KSAmIDB4ZmY7CisJCW1pbm9yX3JldmlzaW9uID0gcGFjayAmIDB4ZmY7CisJCWlmIChwcmVzZW50X3N0YXR1cyB8fCAoc2lnbmF0dXJlICE9IFBDSV9TSUdOQVRVUkUpKSB7CisJCQlwcmludGYoIkVSUk9SOiBCSU9TMzIgc2F5cyBQQ0kgQklPUywgYnV0IG5vIFBDSSAiCisJCQkJIkJJT1M/Pz8/XG4iKTsKKwkJCXBjaWJpb3NfZW50cnkgPSAwOworCQl9CisjaWYJREVCVUcKKwkJaWYgKHBjaWJpb3NfZW50cnkpIHsKKwkJCXByaW50ZiAoInBjaWJpb3NfaW5pdCA6IFBDSSBCSU9TIHJldmlzaW9uICVoaFguJWhoWCIKKwkJCQkiIGVudHJ5IGF0ICUjWFxuIiwgbWFqb3JfcmV2aXNpb24sCisJCQkJbWlub3JfcmV2aXNpb24sIHBjaWJpb3NfZW50cnkpOworCQl9CisjZW5kaWYKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBjaWJpb3NfaW5pdCh2b2lkKQoreworCXVuaW9uIGJpb3MzMiAqY2hlY2s7CisJdW5zaWduZWQgY2hhciBzdW07CisJaW50IGksIGxlbmd0aDsKKwl1bnNpZ25lZCBsb25nIGJpb3MzMl9lbnRyeSA9IDA7CisKKwkvKgorCSAqIEZvbGxvdyB0aGUgc3RhbmRhcmQgcHJvY2VkdXJlIGZvciBsb2NhdGluZyB0aGUgQklPUzMyIFNlcnZpY2UKKwkgKiBkaXJlY3RvcnkgYnkgc2Nhbm5pbmcgdGhlIHBlcm1pc3NpYmxlIGFkZHJlc3MgcmFuZ2UgZnJvbQorCSAqIDB4ZTAwMDAgdGhyb3VnaCAweGZmZmZmIGZvciBhIHZhbGlkIEJJT1MzMiBzdHJ1Y3R1cmUuCisJICoKKwkgKi8KKworCWZvciAoY2hlY2sgPSAodW5pb24gYmlvczMyICopIDB4ZTAwMDA7IGNoZWNrIDw9ICh1bmlvbiBiaW9zMzIgKikgMHhmZmZmMDsgKytjaGVjaykgeworCQlpZiAoY2hlY2stPmZpZWxkcy5zaWduYXR1cmUgIT0gQklPUzMyX1NJR05BVFVSRSkKKwkJCWNvbnRpbnVlOworCQlsZW5ndGggPSBjaGVjay0+ZmllbGRzLmxlbmd0aCAqIDE2OworCQlpZiAoIWxlbmd0aCkKKwkJCWNvbnRpbnVlOworCQlzdW0gPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoIDsgKytpKQorCQkJc3VtICs9IGNoZWNrLT5jaGFyc1tpXTsKKwkJaWYgKHN1bSAhPSAwKQorCQkJY29udGludWU7CisJCWlmIChjaGVjay0+ZmllbGRzLnJldmlzaW9uICE9IDApIHsKKwkJCXByaW50ZigicGNpYmlvc19pbml0IDogdW5zdXBwb3J0ZWQgcmV2aXNpb24gJWQgYXQgJSNYLCBtYWlsIGRyZXdAY29sb3JhZG8uZWR1XG4iLAorCQkJCWNoZWNrLT5maWVsZHMucmV2aXNpb24sIGNoZWNrKTsKKwkJCWNvbnRpbnVlOworCQl9CisjaWYJREVCVUcKKwkJcHJpbnRmKCJwY2liaW9zX2luaXQgOiBCSU9TMzIgU2VydmljZSBEaXJlY3RvcnkgIgorCQkJInN0cnVjdHVyZSBhdCAlI1hcbiIsIGNoZWNrKTsKKyNlbmRpZgorCQlpZiAoIWJpb3MzMl9lbnRyeSkgeworCQkJaWYgKGNoZWNrLT5maWVsZHMuZW50cnkgPj0gMHgxMDAwMDApIHsKKwkJCQlwcmludGYoInBjaWJpb3NfaW5pdDogZW50cnkgaW4gaGlnaCAiCisJCQkJCSJtZW1vcnksIGdpdmluZyB1cFxuIik7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIHsKKwkJCQliaW9zMzJfZW50cnkgPSBjaGVjay0+ZmllbGRzLmVudHJ5OworI2lmCURFQlVHCisJCQkJcHJpbnRmKCJwY2liaW9zX2luaXQgOiBCSU9TMzIgU2VydmljZSBEaXJlY3RvcnkiCisJCQkJCSIgZW50cnkgYXQgJSNYXG4iLCBiaW9zMzJfZW50cnkpOworI2VuZGlmCisJCQkJYmlvczMyX2luZGlyZWN0LmFkZHJlc3MgPSBiaW9zMzJfZW50cnk7CisJCQl9CisJCX0KKwl9CisJaWYgKGJpb3MzMl9lbnRyeSkKKwkJY2hlY2tfcGNpYmlvcygpOworfQorI2VuZGlmCS8qIENPTkZJR19QQ0lfRElSRUNUIG5vdCBkZWZpbmVkKi8KKworc3RhdGljIHZvaWQgc2Nhbl9idXMoc3RydWN0IHBjaV9kZXZpY2UgKnBjaWRldikKK3sKKwl1bnNpZ25lZCBpbnQgZGV2Zm4sIGwsIGJ1cywgYnVzZXM7CisJdW5zaWduZWQgY2hhciBoZHJfdHlwZSA9IDA7CisJdW5zaWduZWQgc2hvcnQgdmVuZG9yLCBkZXZpY2U7CisJdW5zaWduZWQgaW50IG1lbWJhc2UsIGlvYWRkciwgcm9tYWRkcjsKKwlpbnQgaSwgcmVnOworCXVuc2lnbmVkIGludCBwY2lfaW9hZGRyID0gMDsKKworCS8qIFNjYW4gYWxsIFBDSSBidXNlcywgdW50aWwgd2UgZmluZCBvdXIgY2FyZC4KKwkgKiBXZSBjb3VsZCBiZSBzbWFydCBvbmx5IHNjYW4gdGhlIHJlcXVpcmVkIGJ1c3NlcyBidXQgdGhhdAorCSAqIGlzIGVycm9yIHByb25lLCBhbmQgdHJpY2t5LgorCSAqIEJ5IHNjYW5uaW5nIGFsbCBwb3NzaWJsZSBwY2kgYnVzc2VzIGluIG9yZGVyIHdlIHNob3VsZCBmaW5kCisJICogb3VyIGNhcmQgZXZlbnR1YWxseS4gCisJICovCisJYnVzZXM9MjU2OworCWZvciAoYnVzID0gMDsgYnVzIDwgYnVzZXM7ICsrYnVzKSB7CisJCWZvciAoZGV2Zm4gPSAwOyBkZXZmbiA8IDB4ZmY7ICsrZGV2Zm4pIHsKKwkJCWlmIChQQ0lfRlVOQyAoZGV2Zm4pID09IDApCisJCQkJcGNpYmlvc19yZWFkX2NvbmZpZ19ieXRlKGJ1cywgZGV2Zm4sIFBDSV9IRUFERVJfVFlQRSwgJmhkcl90eXBlKTsKKwkJCWVsc2UgaWYgKCEoaGRyX3R5cGUgJiAweDgwKSkJLyogbm90IGEgbXVsdGktZnVuY3Rpb24gZGV2aWNlICovCisJCQkJY29udGludWU7CisJCQlwY2liaW9zX3JlYWRfY29uZmlnX2R3b3JkKGJ1cywgZGV2Zm4sIFBDSV9WRU5ET1JfSUQsICZsKTsKKwkJCS8qIHNvbWUgYnJva2VuIGJvYXJkcyByZXR1cm4gMCBpZiBhIHNsb3QgaXMgZW1wdHk6ICovCisJCQlpZiAobCA9PSAweGZmZmZmZmZmIHx8IGwgPT0gMHgwMDAwMDAwMCkgeworCQkJCWhkcl90eXBlID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXZlbmRvciA9IGwgJiAweGZmZmY7CisJCQlkZXZpY2UgPSAobCA+PiAxNikgJiAweGZmZmY7CisKKyNpZglERUJVRworCQkJcHJpbnRmKCJidXMgJWhoWCwgZnVuY3Rpb24gJWhoWCwgdmVuZG9yICVoWCwgZGV2aWNlICVoWFxuIiwKKwkJCQlidXMsIGRldmZuLCB2ZW5kb3IsIGRldmljZSk7CisjZW5kaWYKKwkJCWZvciAoaSA9IDA7IHBjaWRldltpXS52ZW5kb3IgIT0gMDsgaSsrKSB7CisJCQkJaWYgKHZlbmRvciAhPSBwY2lkZXZbaV0udmVuZG9yCisJCQkJICAgIHx8IGRldmljZSAhPSBwY2lkZXZbaV0uZGV2X2lkKQorCQkJCQljb250aW51ZTsKKwkJCQlwY2lkZXZbaV0uZGV2Zm4gPSBkZXZmbjsKKwkJCQlwY2lkZXZbaV0uYnVzID0gYnVzOworCQkJCWZvciAocmVnID0gUENJX0JBU0VfQUREUkVTU18wOyByZWcgPD0gUENJX0JBU0VfQUREUkVTU181OyByZWcgKz0gNCkgeworCQkJCQlwY2liaW9zX3JlYWRfY29uZmlnX2R3b3JkKGJ1cywgZGV2Zm4sIHJlZywgJmlvYWRkcik7CisKKwkJCQkJaWYgKChpb2FkZHIgJiBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0spID09IDAgfHwgKGlvYWRkciAmIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8pID09IDApCisJCQkJCQljb250aW51ZTsKKwkJCQkJLyogU3RyaXAgdGhlIEkvTyBhZGRyZXNzIG91dCBvZiB0aGUgcmV0dXJuZWQgdmFsdWUgKi8KKwkJCQkJaW9hZGRyICY9IFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSzsKKwkJCQkJLyogR2V0IHRoZSBtZW1vcnkgYmFzZSBhZGRyZXNzICovCisJCQkJCXBjaWJpb3NfcmVhZF9jb25maWdfZHdvcmQoYnVzLCBkZXZmbiwKKwkJCQkJCVBDSV9CQVNFX0FERFJFU1NfMSwgJm1lbWJhc2UpOworCQkJCQkvKiBHZXQgdGhlIFJPTSBiYXNlIGFkZHJlc3MgKi8KKwkJCQkJcGNpYmlvc19yZWFkX2NvbmZpZ19kd29yZChidXMsIGRldmZuLCBQQ0lfUk9NX0FERFJFU1MsICZyb21hZGRyKTsKKwkJCQkJcm9tYWRkciA+Pj0gMTA7CisJCQkJCXByaW50ZigiRm91bmQgJXMgYXQgJSNoeCwgUk9NIGFkZHJlc3MgJSNoeFxuIiwKKwkJCQkJCXBjaWRldltpXS5uYW1lLCBpb2FkZHIsIHJvbWFkZHIpOworCQkJCQkvKiBUYWtlIHRoZSBmaXJzdCBvbmUgb3IgdGhlIG9uZSB0aGF0IG1hdGNoZXMgaW4gYm9vdCBST00gYWRkcmVzcyAqLworCQkJCQlpZiAocGNpX2lvYWRkciA9PSAwIHx8IHJvbWFkZHIgPT0gKCh1bnNpZ25lZCBsb25nKSByb20ucm9tX3NlZ21lbnQgPDwgNCkpIHsKKwkJCQkJCXBjaWRldltpXS5tZW1iYXNlID0gbWVtYmFzZTsKKwkJCQkJCXBjaWRldltpXS5pb2FkZHIgPSBpb2FkZHI7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKK3ZvaWQgZXRoX3BjaV9pbml0KHN0cnVjdCBwY2lfZGV2aWNlICpwY2lkZXYpCit7CisjaWZuZGVmCUNPTkZJR19QQ0lfRElSRUNUCisJcGNpYmlvc19pbml0KCk7CisJaWYgKCFwY2liaW9zX2VudHJ5KSB7CisJCXByaW50ZigicGNpX2luaXQ6IG5vIEJJT1MzMiBkZXRlY3RlZFxuIik7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwlzY2FuX2J1cyhwY2lkZXYpOworCS8qIHJldHVybiB2YWx1ZXMgYXJlIGluIHBjaWRldiBzdHJ1Y3R1cmVzICovCit9CisKKy8qCisgKglTZXQgZGV2aWNlIHRvIGJlIGEgYnVzbWFzdGVyIGluIGNhc2UgQklPUyBuZWdsZWN0ZWQgdG8gZG8gc28uCisgKglBbHNvIGFkanVzdCBQQ0kgbGF0ZW5jeSB0aW1lciB0byBhIHJlYXNvbmFibGUgdmFsdWUsIDMyLgorICovCit2b2lkIGFkanVzdF9wY2lfZGV2aWNlKHN0cnVjdCBwY2lfZGV2aWNlICpwKQoreworCXVuc2lnbmVkIHNob3J0CW5ld19jb21tYW5kLCBwY2lfY29tbWFuZDsKKwl1bnNpZ25lZCBjaGFyCXBjaV9sYXRlbmN5OworCisJcGNpYmlvc19yZWFkX2NvbmZpZ193b3JkKHAtPmJ1cywgcC0+ZGV2Zm4sIFBDSV9DT01NQU5ELCAmcGNpX2NvbW1hbmQpOworCW5ld19jb21tYW5kID0gcGNpX2NvbW1hbmQgfCBQQ0lfQ09NTUFORF9NQVNURVJ8UENJX0NPTU1BTkRfSU87CisJaWYgKHBjaV9jb21tYW5kICE9IG5ld19jb21tYW5kKSB7CisJCXByaW50ZigiVGhlIFBDSSBCSU9TIGhhcyBub3QgZW5hYmxlZCB0aGlzIGRldmljZSFcblVwZGF0aW5nIFBDSSBjb21tYW5kICVoWC0+JWhYLiBwY2lfYnVzICVoaFggcGNpX2RldmljZV9mbiAlaGhYXG4iLAorCQkJICAgcGNpX2NvbW1hbmQsIG5ld19jb21tYW5kLCBwLT5idXMsIHAtPmRldmZuKTsKKwkJcGNpYmlvc193cml0ZV9jb25maWdfd29yZChwLT5idXMsIHAtPmRldmZuLCBQQ0lfQ09NTUFORCwgbmV3X2NvbW1hbmQpOworCX0KKwlwY2liaW9zX3JlYWRfY29uZmlnX2J5dGUocC0+YnVzLCBwLT5kZXZmbiwgUENJX0xBVEVOQ1lfVElNRVIsICZwY2lfbGF0ZW5jeSk7CisJaWYgKHBjaV9sYXRlbmN5IDwgMzIpIHsKKwkJcHJpbnRmKCJQQ0kgbGF0ZW5jeSB0aW1lciAoQ0ZMVCkgaXMgdW5yZWFzb25hYmx5IGxvdyBhdCAlZC4gU2V0dGluZyB0byAzMiBjbG9ja3MuXG4iLCBwY2lfbGF0ZW5jeSk7CisJCXBjaWJpb3Nfd3JpdGVfY29uZmlnX2J5dGUocC0+YnVzLCBwLT5kZXZmbiwgUENJX0xBVEVOQ1lfVElNRVIsIDMyKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9uZXRib290L3BjaS5oIGIvbmV0Ym9vdC9wY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTlkYzE0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9wY2kuaApAQCAtMCwwICsxLDE5MiBAQAorI2lmbmRlZglQQ0lfSAorI2RlZmluZSBQQ0lfSAorCisvKgorKiogU3VwcG9ydCBmb3IgTkUyMDAwIFBDSSBjbG9uZXMgYWRkZWQgRGF2aWQgTW9ucm8gSnVuZSAxOTk3CisqKiBHZW5lcmFsaXNlZCBmb3Igb3RoZXIgUENJIE5JQ3MgYnkgS2VuIFlhcCBKdWx5IDE5OTcKKyoqCisqKiBNb3N0IG9mIHRoaXMgaXMgdGFrZW4gZnJvbToKKyoqCisqKiAvdXNyL3NyYy9saW51eC9kcml2ZXJzL3BjaS9wY2kuYworKiogL3Vzci9zcmMvbGludXgvaW5jbHVkZS9saW51eC9wY2kuaAorKiogL3Vzci9zcmMvbGludXgvYXJjaC9pMzg2L2Jpb3MzMi5jCisqKiAvdXNyL3NyYy9saW51eC9pbmNsdWRlL2xpbnV4L2Jpb3MzMi5oCisqKiAvdXNyL3NyYy9saW51eC9kcml2ZXJzL25ldC9uZS5jCisqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjZGVmaW5lIFBDSV9DT01NQU5EX0lPCQkJMHgxCS8qIEVuYWJsZSByZXNwb25zZSBpbiBJL08gc3BhY2UgKi8KKyNkZWZpbmUgUENJX0NPTU1BTkRfTUVNCQkJMHgyCS8qIEVuYWJsZSByZXNwb25zZSBpbiBtZW0gc3BhY2UgKi8KKyNkZWZpbmUgUENJX0NPTU1BTkRfTUFTVEVSCQkweDQJLyogRW5hYmxlIGJ1cyBtYXN0ZXJpbmcgKi8KKyNkZWZpbmUgUENJX0xBVEVOQ1lfVElNRVIJCTB4MGQJLyogOCBiaXRzICovCisKKyNkZWZpbmUgUENJQklPU19QQ0lfRlVOQ1RJT05fSUQgICAgICAgICAweGIxWFgKKyNkZWZpbmUgUENJQklPU19QQ0lfQklPU19QUkVTRU5UICAgICAgICAweGIxMDEKKyNkZWZpbmUgUENJQklPU19GSU5EX1BDSV9ERVZJQ0UgICAgICAgICAweGIxMDIKKyNkZWZpbmUgUENJQklPU19GSU5EX1BDSV9DTEFTU19DT0RFICAgICAweGIxMDMKKyNkZWZpbmUgUENJQklPU19HRU5FUkFURV9TUEVDSUFMX0NZQ0xFICAweGIxMDYKKyNkZWZpbmUgUENJQklPU19SRUFEX0NPTkZJR19CWVRFICAgICAgICAweGIxMDgKKyNkZWZpbmUgUENJQklPU19SRUFEX0NPTkZJR19XT1JEICAgICAgICAweGIxMDkKKyNkZWZpbmUgUENJQklPU19SRUFEX0NPTkZJR19EV09SRCAgICAgICAweGIxMGEKKyNkZWZpbmUgUENJQklPU19XUklURV9DT05GSUdfQllURSAgICAgICAweGIxMGIKKyNkZWZpbmUgUENJQklPU19XUklURV9DT05GSUdfV09SRCAgICAgICAweGIxMGMKKyNkZWZpbmUgUENJQklPU19XUklURV9DT05GSUdfRFdPUkQgICAgICAweGIxMGQKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEICAgICAgICAgICAweDAwICAgIC8qIDE2IGJpdHMgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRCAgICAgICAgICAgMHgwMiAgICAvKiAxNiBiaXRzICovCisjZGVmaW5lIFBDSV9DT01NQU5EICAgICAgICAgICAgIDB4MDQgICAgLyogMTYgYml0cyAqLworCisjZGVmaW5lIFBDSV9SRVZJU0lPTiAgICAgICAgICAgIDB4MDggICAgLyogOCBiaXRzICAqLworI2RlZmluZSBQQ0lfQ0xBU1NfQ09ERSAgICAgICAgICAweDBiICAgIC8qIDggYml0cyAqLworI2RlZmluZSBQQ0lfU1VCQ0xBU1NfQ09ERSAgICAgICAweDBhICAgIC8qIDggYml0cyAqLworI2RlZmluZSBQQ0lfSEVBREVSX1RZUEUgICAgICAgICAweDBlICAgIC8qIDggYml0cyAqLworCisjZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfMCAgICAgIDB4MTAgICAgLyogMzIgYml0cyAqLworI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzEgICAgICAweDE0ICAgIC8qIDMyIGJpdHMgKi8KKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU18yICAgICAgMHgxOCAgICAvKiAzMiBiaXRzICovCisjZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfMyAgICAgIDB4MWMgICAgLyogMzIgYml0cyAqLworI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzQgICAgICAweDIwICAgIC8qIDMyIGJpdHMgKi8KKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU181ICAgICAgMHgyNCAgICAvKiAzMiBiaXRzICovCisKKyNpZm5kZWYJUENJX0JBU0VfQUREUkVTU19JT19NQVNLCisjZGVmaW5lCVBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSyAgICAgICAofjB4MDMpCisjZW5kaWYKKyNkZWZpbmUJUENJX0JBU0VfQUREUkVTU19TUEFDRV9JTwkweDAxCisjZGVmaW5lCVBDSV9ST01fQUREUkVTUwkJMHgzMAkvKiAzMiBiaXRzICovCisjZGVmaW5lCVBDSV9ST01fQUREUkVTU19FTkFCTEUJMHgwMQkvKiBXcml0ZSAxIHRvIGVuYWJsZSBST00sCisJCQkJCSAgIGJpdHMgMzEuLjExIGFyZSBhZGRyZXNzLAorCQkJCQkgICAxMC4uMiBhcmUgcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBQQ0lfRlVOQyhkZXZmbikgICAgICAgICAgICgoZGV2Zm4pICYgMHgwNykKKworI2RlZmluZSBCSU9TMzJfU0lHTkFUVVJFICAgICAgICAoKCdfJyA8PCAwKSArICgnMycgPDwgOCkgKyAoJzInIDw8IDE2KSArICgnXycgPDwgMjQpKQorCisvKiBQQ0kgc2lnbmF0dXJlOiAiUENJICIgKi8KKyNkZWZpbmUgUENJX1NJR05BVFVSRSAgICAgICAgICAgKCgnUCcgPDwgMCkgKyAoJ0MnIDw8IDgpICsgKCdJJyA8PCAxNikgKyAoJyAnIDw8IDI0KSkKKworLyogUENJIHNlcnZpY2Ugc2lnbmF0dXJlOiAiJFBDSSIgKi8KKyNkZWZpbmUgUENJX1NFUlZJQ0UgICAgICAgICAgICAgKCgnJCcgPDwgMCkgKyAoJ1AnIDw8IDgpICsgKCdDJyA8PCAxNikgKyAoJ0knIDw8IDI0KSkKKwordW5pb24gYmlvczMyIHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBsb25nIHNpZ25hdHVyZTsJLyogXzMyXyAqLworCQl1bnNpZ25lZCBsb25nIGVudHJ5OwkJLyogMzIgYml0IHBoeXNpY2FsIGFkZHJlc3MgKi8KKwkJdW5zaWduZWQgY2hhciByZXZpc2lvbjsJCS8qIFJldmlzaW9uIGxldmVsLCAwICovCisJCXVuc2lnbmVkIGNoYXIgbGVuZ3RoOwkJLyogTGVuZ3RoIGluIHBhcmFncmFwaHMgc2hvdWxkIGJlIDAxICovCisJCXVuc2lnbmVkIGNoYXIgY2hlY2tzdW07CQkvKiBBbGwgYnl0ZXMgbXVzdCBhZGQgdXAgdG8gemVybyAqLworCQl1bnNpZ25lZCBjaGFyIHJlc2VydmVkWzVdOwkvKiBNdXN0IGJlIHplcm8gKi8KKwl9IGZpZWxkczsKKwljaGFyIGNoYXJzWzE2XTsKK307CisKKyNkZWZpbmUgS0VSTl9DT0RFX1NFRwkweDgJLyogVGhpcyBfTVVTVF8gbWF0Y2ggc3RhcnQuUyAqLworCisvKiBTdHVmZiBmb3IgYXNtICovCisjZGVmaW5lIHNhdmVfZmxhZ3MoeCkgXAorX19hc21fXyBfX3ZvbGF0aWxlX18oInB1c2hmbCA7IHBvcGwgJTAiOiI9ZyIgKHgpOiAvKiBubyBpbnB1dCAqLyA6Im1lbW9yeSIpCisKKyNkZWZpbmUgY2xpKCkgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbGkiOiA6IDoibWVtb3J5IikKKworI2RlZmluZSByZXN0b3JlX2ZsYWdzKHgpIFwKK19fYXNtX18gX192b2xhdGlsZV9fKCJwdXNobCAlMCA7IHBvcGZsIjogLyogbm8gb3V0cHV0ICovIDoiZyIgKHgpOiJtZW1vcnkiKQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQURNVEVLICAgICAgICAgICAgMHgxMzE3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURNVEVLXzA5ODUgICAgICAgMHgwOTg1CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUkVBTFRFSyAgICAgICAgICAgMHgxMGVjCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUkVBTFRFS184MDI5ICAgICAgMHg4MDI5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUkVBTFRFS184MTM5ICAgICAgMHg4MTM5CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfV0lOQk9ORDIgICAgICAgICAgMHgxMDUwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfV0lOQk9ORDJfODlDOTQwICAgMHgwOTQwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfV0lOQk9ORDJfODlDODQwICAgMHgwODQwCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ09NUEVYICAgICAgICAgICAgMHgxMWY2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NUEVYX1JMMjAwMCAgICAgMHgxNDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NUEVYX1JMMTAwQVRYICAgMHgyMDExCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfS1RJICAgICAgICAgICAgICAgMHg4ZTJlCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfS1RJX0VUMzJQMiAgICAgICAgMHgzMDAwCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTkVUVklOICAgICAgICAgICAgMHg0YTE0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVUVklOX05WNTAwMFNDICAgMHg1MDAwCisjZGVmaW5lCVBDSV9WRU5ET1JfSURfSE9MVEVLCQkweDEyYzMKKyNkZWZpbmUJUENJX0RFVklDRV9JRF9IT0xURUtfSFQ4MDIzMgkweDAwNTgKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF8zQ09NCQkweDEwYjcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zQ09NXzNDNTkwCTB4NTkwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNDT01fM0M1OTUJMHg1OTUwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzU5NV8xCTB4NTk1MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNDT01fM0M1OTVfMgkweDU5NTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zQ09NXzNDOTAwVFBPCTB4OTAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDBDT01CTwkweDkwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zQ09NXzNDOTA1VFgJMHg5MDUwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzkwNVQ0CTB4OTA1MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDVCX1RYCTB4OTA1NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNDT01fM0M5MDVDX1RYTQkweDkyMDAKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JTlRFTAkJMHg4MDg2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI1NTcJMHgxMjI5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI1NTlFUgkweDEyMDkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JRDEwMjkJMHgxMDI5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSUQxMDMwCTB4MTAzMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNTYyCTB4MjQ0OQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FNRAkJMHgxMDIyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0xBTkNFCQkweDIwMDAKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BTURfSE9NRVBOQQkweDEwMjIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfSE9NRVBOQQkweDIwMDEKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TTUNfMTIxMSAgICAgICAgICAweDExMTMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TTUNfMTIxMSAgICAgICAgICAweDEyMTEKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9ERUMJCTB4MTAxMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0RFQ19UVUxJUAkJMHgwMDAyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQX0ZBU1QJMHgwMDA5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQX1BMVVMJMHgwMDE0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfREVDXzIxMTQyCQkweDAwMTkKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TTUMJCTB4MTBCOAorI2lmbmRlZglQQ0lfREVWSUNFX0lEX1NNQ19FUElDMTAwCisjIGRlZmluZSBQQ0lfREVWSUNFX0lEX1NNQ19FUElDMTAwCTB4MDAwNQorI2VuZGlmCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTUFDUk9OSVgJCTB4MTBkOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01YOTg3eDUJCTB4MDUzMQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0xJTktTWVMJCTB4MTFBRAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xDODJDMTE1CQkweEMxMTUKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9WSUFURUMJCTB4MTEwNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV9SSElORV9JCTB4MzA0MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV9WVDYxMDIJMHgzMDY1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzg2QzEwMEEJMHg2MTAwCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfREFWSUNPTQkJMHgxMjgyCisjZGVmaW5lCVBDSV9ERVZJQ0VfSURfRE05MDA5CQkweDkwMDkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ETTkxMDIJCTB4OTEwMgorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NJUyAgICAgICAgIAkweDEwMzkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSVM5MDAgICAgIAkweDA5MDAgICAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSVM3MDE2ICAgIAkweDcwMTYgIAorI2RlZmluZQlQQ0lfVkVORE9SX0lEX0RMSU5LCQkweDExODYKKyNkZWZpbmUJUENJX0RFVklDRV9JRF9ERkU1MzBUWFAJCTB4MTMwMAorI2RlZmluZQlQQ0lfVkVORE9SX0lEX05TCQkweDEwMEIKKyNkZWZpbmUJUENJX0RFVklDRV9JRF9EUDgzODE1CQkweDAwMjAKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9PTElDT00JCTB4MTA4ZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzMxMzYJMHgwMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjMxNQkweDAwMTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI1CTB4MDAxMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIxODMJMHgwMDEzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjMyNgkweDAwMTQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PTElDT01fT0M2MTUxCTB4MDAyMQorCitzdHJ1Y3QgcGNpX2RldmljZSB7CisJdW5zaWduZWQgc2hvcnQJdmVuZG9yLCBkZXZfaWQ7CisJY29uc3QgY2hhcgkqbmFtZTsKKwl1bnNpZ25lZCBpbnQJbWVtYmFzZTsKKwl1bnNpZ25lZCBzaG9ydAlpb2FkZHI7CisJdW5zaWduZWQgY2hhcglkZXZmbjsKKwl1bnNpZ25lZCBjaGFyCWJ1czsKK307CisKK2V4dGVybiB2b2lkCWV0aF9wY2lfaW5pdChzdHJ1Y3QgcGNpX2RldmljZSAqKTsKKworZXh0ZXJuIGludCBwY2liaW9zX3JlYWRfY29uZmlnX2J5dGUodW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmljZV9mbiwgdW5zaWduZWQgaW50IHdoZXJlLCB1bnNpZ25lZCBjaGFyICp2YWx1ZSk7CitleHRlcm4gaW50IHBjaWJpb3Nfd3JpdGVfY29uZmlnX2J5dGUgKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgY2hhciB2YWx1ZSk7CitleHRlcm4gaW50IHBjaWJpb3NfcmVhZF9jb25maWdfd29yZCh1bnNpZ25lZCBpbnQgYnVzLCB1bnNpZ25lZCBpbnQgZGV2aWNlX2ZuLCB1bnNpZ25lZCBpbnQgd2hlcmUsIHVuc2lnbmVkIHNob3J0ICp2YWx1ZSk7CitleHRlcm4gaW50IHBjaWJpb3Nfd3JpdGVfY29uZmlnX3dvcmQgKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgc2hvcnQgdmFsdWUpOworZXh0ZXJuIGludCBwY2liaW9zX3JlYWRfY29uZmlnX2R3b3JkKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgaW50ICp2YWx1ZSk7CitleHRlcm4gaW50IHBjaWJpb3Nfd3JpdGVfY29uZmlnX2R3b3JkKHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2VfZm4sIHVuc2lnbmVkIGludCB3aGVyZSwgdW5zaWduZWQgaW50IHZhbHVlKTsKK3ZvaWQgYWRqdXN0X3BjaV9kZXZpY2Uoc3RydWN0IHBjaV9kZXZpY2UgKnApOworI2VuZGlmCS8qIFBDSV9IICovCmRpZmYgLS1naXQgYS9uZXRib290L3J0bDgxMzkuYyBiL25ldGJvb3QvcnRsODEzOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZDZlM2EKLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L3J0bDgxMzkuYwpAQCAtMCwwICsxLDQ1OCBAQAorLyogcnRsODEzOS5jIC0gZXRoZXJib290IGRyaXZlciBmb3IgdGhlIFJlYWx0ZWsgODEzOSBjaGlwc2V0CisKKyAgcG9ydGVkIGZyb20gdGhlIGxpbnV4IGRyaXZlciB3cml0dGVuIGJ5IERvbmFsZCBCZWNrZXIKKyAgYnkgUmFpbmVyIEJhd2lkYW1hbm4gKFJhaW5lci5CYXdpZGFtYW5uQGluZm9ybWF0aWsudW5pLXVsbS5kZSkgMTk5OQorCisgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAgb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKyAgY2hhbmdlcyB0byB0aGUgb3JpZ2luYWwgZHJpdmVyOgorICAtIHJlbW92ZWQgc3VwcG9ydCBmb3IgaW50ZXJydXB0cywgc3dpdGNoaW5nIHRvIHBvbGxpbmcgbW9kZSAoeXVjayEpCisgIC0gcmVtb3ZlZCBzdXBwb3J0IGZvciB0aGUgODEyOSBjaGlwIChleHRlcm5hbCBNSUkpCisKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBSZXZpc2lvbiBIaXN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKworICAwNiBBcHIgMjAwMQlrZW5feWFwQHVzZXJzLnNvdXJjZWZvcmdlLm5ldCAoS2VuIFlhcCkKKyAgICAgRm9sbG93aW5nIGVtYWlsIGZyb20gSHl1bi1Kb29uIENoYSwgYWRkZWQgYSBkaXNhYmxlIHJvdXRpbmUsIG90aGVyd2lzZQorICAgICBOSUMgcmVtYWlucyBsaXZlIGFuZCBjYW4gY3Jhc2ggdGhlIGtlcm5lbCBsYXRlci4KKworICA0IEZlYiAyMDAwCWVzcGVubGF1YkBpbmZvcm1hdGlrLnVuaS11bG0uZGUgKEtsYXVzIEVzcGVubGF1YikKKyAgICAgU2h1ZmZsZWQgdGhpbmdzIGFyb3VuZCwgcmVtb3ZlZCB0aGUgbGVmdG92ZXJzIGZyb20gdGhlIDgxMjkgc3VwcG9ydAorICAgICB0aGF0IHdhcyBpbiB0aGUgTGludXggZHJpdmVyIGFuZCBhZGRlZCBhIGJpdCBtb3JlIDgxMzkgZGVmaW5pdGlvbnMuCisgICAgIE1vdmVkIHRoZSA4SyByZWNlaXZlIGJ1ZmZlciB0byBhIGZpeGVkLCBhdmFpbGFibGUgYWRkcmVzcyBvdXRzaWRlIHRoZQorICAgICAweDk4MDAwLTB4OWZmZmYgcmFuZ2UuICBUaGlzIGlzIGEgYml0IG9mIGEgaGFjaywgYnV0IGN1cnJlbnRseSB0aGUgb25seQorICAgICB3YXkgdG8gbWFrZSByb29tIGZvciB0aGUgRXRoZXJib290IGZlYXR1cmVzIHRoYXQgbmVlZCBzdWJzdGFudGlhbCBhbW91bnRzCisgICAgIG9mIGNvZGUgbGlrZSB0aGUgQU5TSSBjb25zb2xlIHN1cHBvcnQuICBDdXJyZW50bHkgdGhlIGJ1ZmZlciBpcyBqdXN0IGJlbG93CisgICAgIDB4MTAwMDAsIHNvIHRoaXMgZXZlbiBjb25mb3JtcyB0byB0aGUgdGFnZ2VkIGJvb3QgaW1hZ2Ugc3BlY2lmaWNhdGlvbiwKKyAgICAgd2hpY2ggcmVzZXJ2ZXMgdGhlIHJhbmdlcyAweDAwMDAwLTB4MTAwMDAgYW5kIDB4OTgwMDAtMHhBMDAwMC4gIE15CisgICAgIGludGVycHJldGF0aW9uIG9mIHRoaXMgInJlc2VydmVkIiBpcyB0aGF0IEV0aGVyYm9vdCBtYXkgZG8gd2hhdGV2ZXIgaXQKKyAgICAgbGlrZXMsIGFzIGxvbmcgYXMgaXRzIGVudmlyb25tZW50IGlzIGtlcHQgaW50YWN0IChsaWtlIHRoZSBCSU9TCisgICAgIHZhcmlhYmxlcykuICBIb3BlZnVsbHkgZml4ZWQgcnRsX3BvbGwoKSBvbmNlIGFuZCBmb3IgYWxsLiAgVGhlIHN5bXB0b21zCisgICAgIHdlcmUgdGhhdCBpZiBFdGhlcmJvb3Qgd2FzIGxlZnQgYXQgdGhlIGJvb3QgbWVudSBmb3Igc2V2ZXJhbCBtaW51dGVzLCB0aGUKKyAgICAgZmlyc3QgZXRoX3BvbGwgZmFpbGVkLiAgU2VlbXMgbGlrZSBJIGFtIHRoZSBvbmx5IHBlcnNvbiB3aG8gZG9lcyB0aGlzLgorICAgICBGaXJzdCBvZiBhbGwgSSBmaXhlZCB0aGUgZGVidWdnaW5nIGNvZGUgYW5kIHRoZW4gc2V0IG91dCBmb3IgYSBsb25nIGJ1ZworICAgICBodW50aW5nIHNlc3Npb24uICBJdCB0b29rIG1lIGFib3V0IGEgd2VlayBmdWxsIHRpbWUgd29yayAtIHBva2luZyBhcm91bmQKKyAgICAgdmFyaW91cyBwbGFjZXMgaW4gdGhlIGRyaXZlciwgcmVhZGluZyBEb24gQmVja2VyJ3MgYW5kIEplZmYgR2FyemlrJ3MgTGludXgKKyAgICAgZHJpdmVyIGFuZCBldmVuIHRoZSBGcmVlQlNEIGRyaXZlciAod2hhdCBhIHBpZWNlIG9mIGNyYXAhKSAtIGFuZAorICAgICBldmVudHVhbGx5IHNwb3R0ZWQgdGhlIG5hc3R5IHRoaW5nOiB0aGUgdHJhbnNtaXQgcm91dGluZSB3YXMgYWNrbm93bGVkZ2luZworICAgICBlYWNoIGFuZCBldmVyeSBpbnRlcnJ1cHQgcGVuZGluZywgaW5jbHVkaW5nIHRoZSBSeE92ZXJydW4gYW5kIFJ4RklGSU92ZXIKKyAgICAgaW50ZXJydXB0cy4gIFRoaXMgY29uZnVzZWQgdGhlIFJUTDgxMzkgdGhvcm91Z2hseS4gIEl0IGRlc3Ryb3llZCB0aGUKKyAgICAgUnggcmluZyBjb250ZW50cyBieSBkdW1waW5nIHRoZSAySyBGSUZPIGNvbnRlbnRzIHJpZ2h0IHdoZXJlIHdlIHdhbnRlZCB0bworICAgICBnZXQgdGhlIG5leHQgcGFja2V0LiAgT2ggd2VsbCwgd2hhdCBmdW4uCisKKyAgMTggSmFuIDIwMDAgICBtZGNAdGhpbmd1aW4ub3JnIChNYXJ0eSBDb25ub3IpCisgICAgIERyYXN0aWNhbGx5IHNpbXBsaWZpZWQgZXJyb3IgaGFuZGxpbmcuICBCYXNpY2FsbHksIGlmIGFueSBlcnJvcgorICAgICBpbiB0cmFuc21pc3Npb24gb3IgcmVjZXB0aW9uIG9jY3VycywgdGhlIGNhcmQgaXMgcmVzZXQuCisgICAgIEFsc28sIHBvaW50ZWQgYWxsIHRyYW5zbWl0IGRlc2NyaXB0b3JzIHRvIHRoZSBzYW1lIGJ1ZmZlciB0bworICAgICBzYXZlIGJ1ZmZlciBzcGFjZS4gIFRoaXMgc2hvdWxkIGRlY3JlYXNlIGRyaXZlciBzaXplIGFuZCBhdm9pZAorICAgICBjb3JydXB0aW9uIGJlY2F1c2Ugb2YgZXhjZWVkaW5nIDMySyBkdXJpbmcgcnVudGltZS4KKworICAyOCBKdWwgMTk5OSAgIChNYXR0aGlhcyBNZWl4bmVyIC0gbWVpeG5lckByYmcuaW5mb3JtYXRpay50dS1kYXJtc3RhZHQuZGUpCisgICAgIHJ0bF9wb2xsIHdhcyBxdWl0ZSBicm9rZW46IGl0IHVzZWQgdGhlIFJ4T0sgaW50ZXJydXB0IGZsYWcgaW5zdGVhZAorICAgICBvZiB0aGUgUnhCdWZmZXJFbXB0eSBmbGFnIHdoaWNoIG9mdGVuIHJlc3VsdGVkIGluIHZlcnkgYmFkCisgICAgIHRyYW5zbWlzc2lvbiBwZXJmb3JtYWNlIC0gYmVsb3cgMWtCeXRlcy9zLgorCisqLworCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisjaW5jbHVkZSAibmljLmgiCisjaW5jbHVkZSAicGNpLmgiCisjaW5jbHVkZSAiY2FyZHMuaCIKKyNpbmNsdWRlICJ0aW1lci5oIgorCisjZGVmaW5lIFJUTF9USU1FT1VUICgxKlRJQ0tTX1BFUl9TRUMpCisKKy8qIFBDSSBUdW5pbmcgUGFyYW1ldGVycworICAgVGhyZXNob2xkIGlzIGJ5dGVzIHRyYW5zZmVycmVkIHRvIGNoaXAgYmVmb3JlIHRyYW5zbWlzc2lvbiBzdGFydHMuICovCisjZGVmaW5lIFRYX0ZJRk9fVEhSRVNIIDI1NiAgICAgIC8qIEluIGJ5dGVzLCByb3VuZGVkIGRvd24gdG8gMzIgYnl0ZSB1bml0cy4gKi8KKyNkZWZpbmUgUlhfRklGT19USFJFU0ggIDQgICAgICAgLyogUnggYnVmZmVyIGxldmVsIGJlZm9yZSBmaXJzdCBQQ0kgeGZlci4gICovCisjZGVmaW5lIFJYX0RNQV9CVVJTVCAgICA0ICAgICAgIC8qIE1heGltdW0gUENJIGJ1cnN0LCAnNCcgaXMgMjU2IGJ5dGVzICovCisjZGVmaW5lIFRYX0RNQV9CVVJTVCAgICA0ICAgICAgIC8qIENhbGN1bGF0ZSBhcyAxNjw8dmFsLiAqLworI2RlZmluZSBOVU1fVFhfREVTQyAgICAgNCAgICAgICAvKiBOdW1iZXIgb2YgVHggZGVzY3JpcHRvciByZWdpc3RlcnMuICovCisjZGVmaW5lIFRYX0JVRl9TSVpFCUVUSF9GUkFNRV9MRU4JLyogRkNTIGlzIGFkZGVkIGJ5IHRoZSBjaGlwICovCisjZGVmaW5lIFJYX0JVRl9MRU5fSURYIDAJLyogMCwgMSwgMiBpcyBhbGxvd2VkIC0gOCwxNiwzMksgcnggYnVmZmVyICovCisjZGVmaW5lIFJYX0JVRl9MRU4gKDgxOTIgPDwgUlhfQlVGX0xFTl9JRFgpCisKKyN1bmRlZiBERUJVR19UWAorI3VuZGVmIERFQlVHX1JYCisKKy8qIFN5bWJvbGljIG9mZnNldHMgdG8gcmVnaXN0ZXJzLiAqLworZW51bSBSVEw4MTM5X3JlZ2lzdGVycyB7CisJTUFDMD0wLAkJCS8qIEV0aGVybmV0IGhhcmR3YXJlIGFkZHJlc3MuICovCisJTUFSMD04LAkJCS8qIE11bHRpY2FzdCBmaWx0ZXIuICovCisJVHhTdGF0dXMwPTB4MTAsCQkvKiBUcmFuc21pdCBzdGF0dXMgKGZvdXIgMzJiaXQgcmVnaXN0ZXJzKS4gKi8KKwlUeEFkZHIwPTB4MjAsCQkvKiBUeCBkZXNjcmlwdG9ycyAoYWxzbyBmb3VyIDMyYml0KS4gKi8KKwlSeEJ1Zj0weDMwLCBSeEVhcmx5Q250PTB4MzQsIFJ4RWFybHlTdGF0dXM9MHgzNiwKKwlDaGlwQ21kPTB4MzcsIFJ4QnVmUHRyPTB4MzgsIFJ4QnVmQWRkcj0weDNBLAorCUludHJNYXNrPTB4M0MsIEludHJTdGF0dXM9MHgzRSwKKwlUeENvbmZpZz0weDQwLCBSeENvbmZpZz0weDQ0LAorCVRpbWVyPTB4NDgsCQkvKiBnZW5lcmFsLXB1cnBvc2UgY291bnRlci4gKi8KKwlSeE1pc3NlZD0weDRDLAkJLyogMjQgYml0cyB2YWxpZCwgd3JpdGUgY2xlYXJzLiAqLworCUNmZzkzNDY9MHg1MCwgQ29uZmlnMD0weDUxLCBDb25maWcxPTB4NTIsCisJVGltZXJJbnRyUmVnPTB4NTQsCS8qIGludHIgaWYgZ3AgY291bnRlciByZWFjaGVzIHRoaXMgdmFsdWUgKi8KKwlNZWRpYVN0YXR1cz0weDU4LAorCUNvbmZpZzM9MHg1OSwKKwlNdWx0aUludHI9MHg1QywKKwlSZXZpc2lvbklEPTB4NUUsCS8qIHJldmlzaW9uIG9mIHRoZSBSVEw4MTM5IGNoaXAgKi8KKwlUeFN1bW1hcnk9MHg2MCwKKwlNSUlfQk1DUj0weDYyLCBNSUlfQk1TUj0weDY0LCBOV2F5QWR2ZXJ0PTB4NjYsIE5XYXlMUEFSPTB4NjgsCisJTldheUV4cGFuc2lvbj0weDZBLAorCURpc2Nvbm5lY3RDbnQ9MHg2QywgRmFsc2VDYXJyaWVyQ250PTB4NkUsCisJTldheVRlc3RSZWc9MHg3MCwKKwlSeENudD0weDcyLAkJLyogcGFja2V0IHJlY2VpdmVkIGNvdW50ZXIgKi8KKwlDU0NSPTB4NzQsCQkvKiBjaGlwIHN0YXR1cyBhbmQgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworCVBoeVBhcm0xPTB4NzgsVHdpc3RlclBhcm09MHg3YyxQaHlQYXJtMj0weDgwLAkvKiB1bmRvY3VtZW50ZWQgKi8KKwkvKiBmcm9tIDB4ODQgb253YXJkcyBhcmUgYSBudW1iZXIgb2YgcG93ZXIgbWFuYWdlbWVudC93YWtldXAgZnJhbWUKKwkgKiBkZWZpbml0aW9ucyB3ZSB3aWxsIHByb2JhYmx5IG5ldmVyIG5lZWQgdG8ga25vdyBhYm91dC4gICovCit9OworCitlbnVtIENoaXBDbWRCaXRzIHsKKwlDbWRSZXNldD0weDEwLCBDbWRSeEVuYj0weDA4LCBDbWRUeEVuYj0weDA0LCBSeEJ1ZkVtcHR5PTB4MDEsIH07CisKKy8qIEludGVycnVwdCByZWdpc3RlciBiaXRzLCB1c2luZyBteSBvd24gbWVhbmluZ2Z1bCBuYW1lcy4gKi8KK2VudW0gSW50clN0YXR1c0JpdHMgeworCVBDSUVycj0weDgwMDAsIFBDU1RpbWVvdXQ9MHg0MDAwLCBDYWJsZUxlbkNoYW5nZT0gMHgyMDAwLAorCVJ4RklGT092ZXI9MHg0MCwgUnhVbmRlcnJ1bj0weDIwLCBSeE92ZXJmbG93PTB4MTAsCisJVHhFcnI9MHgwOCwgVHhPSz0weDA0LCBSeEVycj0weDAyLCBSeE9LPTB4MDEsCit9OworZW51bSBUeFN0YXR1c0JpdHMgeworCVR4SG9zdE93bnM9MHgyMDAwLCBUeFVuZGVycnVuPTB4NDAwMCwgVHhTdGF0T0s9MHg4MDAwLAorCVR4T3V0T2ZXaW5kb3c9MHgyMDAwMDAwMCwgVHhBYm9ydGVkPTB4NDAwMDAwMDAsCisJVHhDYXJyaWVyTG9zdD0weDgwMDAwMDAwLAorfTsKK2VudW0gUnhTdGF0dXNCaXRzIHsKKwlSeE11bHRpY2FzdD0weDgwMDAsIFJ4UGh5c2ljYWw9MHg0MDAwLCBSeEJyb2FkY2FzdD0weDIwMDAsCisJUnhCYWRTeW1ib2w9MHgwMDIwLCBSeFJ1bnQ9MHgwMDEwLCBSeFRvb0xvbmc9MHgwMDA4LCBSeENSQ0Vycj0weDAwMDQsCisJUnhCYWRBbGlnbj0weDAwMDIsIFJ4U3RhdHVzT0s9MHgwMDAxLAorfTsKKworZW51bSBNZWRpYVN0YXR1c0JpdHMgeworCU1TUlR4Rmxvd0VuYWJsZT0weDgwLCBNU1JSeEZsb3dFbmFibGU9MHg0MCwgTVNSU3BlZWQxMD0weDA4LAorCU1TUkxpbmtGYWlsPTB4MDQsIE1TUlJ4UGF1c2VGbGFnPTB4MDIsIE1TUlR4UGF1c2VGbGFnPTB4MDEsCit9OworCitlbnVtIE1JSUJNQ1JCaXRzIHsKKwlCTUNSUmVzZXQ9MHg4MDAwLCBCTUNSU3BlZWQxMDA9MHgyMDAwLCBCTUNSTldheUVuYWJsZT0weDEwMDAsCisJQk1DUlJlc3RhcnROV2F5PTB4MDIwMCwgQk1DUkR1cGxleD0weDAxMDAsCit9OworCitlbnVtIENTQ1JCaXRzIHsKKwlDU0NSX0xpbmtPS0JpdD0weDA0MDAsIENTQ1JfTGlua0NoYW5nZUJpdD0weDA4MDAsCisJQ1NDUl9MaW5rU3RhdHVzQml0cz0weDBmMDAwLCBDU0NSX0xpbmtEb3duT2ZmQ21kPTB4MDAzYzAsCisJQ1NDUl9MaW5rRG93bkNtZD0weDBmM2MwLAorfTsKKworLyogQml0cyBpbiBSeENvbmZpZy4gKi8KK2VudW0gcnhfbW9kZV9iaXRzIHsKKwlSeENmZ1dyYXA9MHg4MCwKKwlBY2NlcHRFcnI9MHgyMCwgQWNjZXB0UnVudD0weDEwLCBBY2NlcHRCcm9hZGNhc3Q9MHgwOCwKKwlBY2NlcHRNdWx0aWNhc3Q9MHgwNCwgQWNjZXB0TXlQaHlzPTB4MDIsIEFjY2VwdEFsbFBoeXM9MHgwMSwKK307CisKK3N0YXRpYyBpbnQgaW9hZGRyOworc3RhdGljIHVuc2lnbmVkIGludCBjdXJfcngsY3VyX3R4OworCisvKiBUaGUgUlRMODEzOSBjYW4gb25seSB0cmFuc21pdCBmcm9tIGEgY29udGlndW91cywgYWxpZ25lZCBtZW1vcnkgYmxvY2suICAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgdHhfYnVmZmVyW1RYX0JVRl9TSVpFXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQpKSk7CisKKy8qIEkga25vdyB0aGF0IHRoaXMgaXMgYSBNRUdBIEhBQ0ssIGJ1dCB0aGUgdGFnZ2VkIGJvb3QgaW1hZ2Ugc3BlY2lmaWNhdGlvbgorICogc3RhdGVzIHRoYXQgd2UgY2FuIGRvIHdoYXRldmVyIHdlIHdhbnQgYmVsb3cgMHgxMDAwMCAtIHNvIHdlIGRvISAgKi8KKy8qIEJ1dCB3ZSBzdGlsbCBnaXZlIHRoZSB1c2VyIHRoZSBjaG9pY2Ugb2YgdXNpbmcgYW4gaW50ZXJuYWwgYnVmZmVyCisgICBqdXN0IGluIGNhc2UgLSBLZW4gKi8KKyNpZmRlZglVU0VfTE9XTUVNX0JVRkZFUgorI2RlZmluZSByeF9yaW5nICgodW5zaWduZWQgY2hhciAqKSgweDEwMDAwIC0gKFJYX0JVRl9MRU4gKyAxNikpKQorI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJ4X3JpbmdbUlhfQlVGX0xFTisxNl0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg0KSkpOworI2VuZGlmCisKK3N0cnVjdCBuaWMgKnJ0bDgxMzlfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVhZGRycywKKwlzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKTsKK3N0YXRpYyBpbnQgcmVhZF9lZXByb20oaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkIHJ0bF9yZXNldChzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIHZvaWQgcnRsX3RyYW5zbWl0KHN0cnVjdCBuaWMgKm5pYywgY29uc3QgY2hhciAqZGVzdGFkZHIsCisJdW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBsZW4sIGNvbnN0IGNoYXIgKmRhdGEpOworc3RhdGljIGludCBydGxfcG9sbChzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIHZvaWQgcnRsX2Rpc2FibGUoc3RydWN0IG5pYyopOworCisKK3N0cnVjdCBuaWMgKnJ0bDgxMzlfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVhZGRycywKKwlzdHJ1Y3QgcGNpX2RldmljZSAqcGNpKQoreworCWludCBpOworCWludCBzcGVlZDEwLCBmdWxsZHVwbGV4OworCisJLyogVGhlcmUgYXJlIGVub3VnaCAiUlRMODEzOSIgc3RyaW5ncyBvbiB0aGUgY29uc29sZSBhbHJlYWR5LCBzbworCSAqIGJlIGJyaWVmIGFuZCBjb25jZW50cmF0ZSBvbiB0aGUgaW50ZXJlc3RpbmcgcGllY2VzIG9mIGluZm8uLi4gKi8KKwlwcmludGYoIiAtICIpOworCisJLyogTWFzayB0aGUgYml0IHRoYXQgc2F5cyAidGhpcyBpcyBhbiBpbyBhZGRyIiAqLworCWlvYWRkciA9IHByb2JlYWRkcnNbMF0gJiB+MzsKKworCWFkanVzdF9wY2lfZGV2aWNlKHBjaSk7CisKKwkvKiBCcmluZyB0aGUgY2hpcCBvdXQgb2YgbG93LXBvd2VyIG1vZGUuICovCisJb3V0YigweDAwLCBpb2FkZHIgKyBDb25maWcxKTsKKworCWlmIChyZWFkX2VlcHJvbSgwKSAhPSAweGZmZmYpIHsKKwkJdW5zaWduZWQgc2hvcnQgKmFwID0gKHVuc2lnbmVkIHNob3J0KiluaWMtPm5vZGVfYWRkcjsKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCSphcCsrID0gcmVhZF9lZXByb20oaSArIDcpOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGNoYXIgKmFwID0gKHVuc2lnbmVkIGNoYXIqKW5pYy0+bm9kZV9hZGRyOworCQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKKwkJCSphcCsrID0gaW5iKGlvYWRkciArIE1BQzAgKyBpKTsKKwl9CisKKwlzcGVlZDEwID0gaW5iKGlvYWRkciArIE1lZGlhU3RhdHVzKSAmIE1TUlNwZWVkMTA7CisJZnVsbGR1cGxleCA9IGludyhpb2FkZHIgKyBNSUlfQk1DUikgJiBCTUNSRHVwbGV4OworCXByaW50ZigiaW9hZGRyICUjaFgsIGFkZHIgJSEgJXNNYnBzICVzLWR1cGxleFxuIiwgaW9hZGRyLAorCQluaWMtPm5vZGVfYWRkciwgIHNwZWVkMTAgPyAiMTAiIDogIjEwMCIsCisJCWZ1bGxkdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIpOworCisJcnRsX3Jlc2V0KG5pYyk7CisKKwluaWMtPnJlc2V0ID0gcnRsX3Jlc2V0OworCW5pYy0+cG9sbCA9IHJ0bF9wb2xsOworCW5pYy0+dHJhbnNtaXQgPSBydGxfdHJhbnNtaXQ7CisJbmljLT5kaXNhYmxlID0gcnRsX2Rpc2FibGU7CisKKwlyZXR1cm4gbmljOworfQorCisvKiBTZXJpYWwgRUVQUk9NIHNlY3Rpb24uICovCisKKy8qICBFRVBST01fQ3RybCBiaXRzLiAqLworI2RlZmluZSBFRV9TSElGVF9DTEsgICAgMHgwNCAgICAvKiBFRVBST00gc2hpZnQgY2xvY2suICovCisjZGVmaW5lIEVFX0NTICAgICAgICAgICAweDA4ICAgIC8qIEVFUFJPTSBjaGlwIHNlbGVjdC4gKi8KKyNkZWZpbmUgRUVfREFUQV9XUklURSAgIDB4MDIgICAgLyogRUVQUk9NIGNoaXAgZGF0YSBpbi4gKi8KKyNkZWZpbmUgRUVfV1JJVEVfMCAgICAgIDB4MDAKKyNkZWZpbmUgRUVfV1JJVEVfMSAgICAgIDB4MDIKKyNkZWZpbmUgRUVfREFUQV9SRUFEICAgIDB4MDEgICAgLyogRUVQUk9NIGNoaXAgZGF0YSBvdXQuICovCisjZGVmaW5lIEVFX0VOQiAgICAgICAgICAoMHg4MCB8IEVFX0NTKQorCisvKgorCURlbGF5IGJldHdlZW4gRUVQUk9NIGNsb2NrIHRyYW5zaXRpb25zLgorCU5vIGV4dHJhIGRlbGF5IGlzIG5lZWRlZCB3aXRoIDMzTWh6IFBDSSwgYnV0IDY2TWh6IG1heSBjaGFuZ2UgdGhpcy4KKyovCisKKyNkZWZpbmUgZWVwcm9tX2RlbGF5KCkgIGlubChlZV9hZGRyKQorCisvKiBUaGUgRUVQUk9NIGNvbW1hbmRzIGluY2x1ZGUgdGhlIGFsd2F5LXNldCBsZWFkaW5nIGJpdC4gKi8KKyNkZWZpbmUgRUVfV1JJVEVfQ01EICAgICg1IDw8IDYpCisjZGVmaW5lIEVFX1JFQURfQ01EICAgICAoNiA8PCA2KQorI2RlZmluZSBFRV9FUkFTRV9DTUQgICAgKDcgPDwgNikKKworc3RhdGljIGludCByZWFkX2VlcHJvbShpbnQgbG9jYXRpb24pCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IHJldHZhbCA9IDA7CisJbG9uZyBlZV9hZGRyID0gaW9hZGRyICsgQ2ZnOTM0NjsKKwlpbnQgcmVhZF9jbWQgPSBsb2NhdGlvbiB8IEVFX1JFQURfQ01EOworCisJb3V0YihFRV9FTkIgJiB+RUVfQ1MsIGVlX2FkZHIpOworCW91dGIoRUVfRU5CLCBlZV9hZGRyKTsKKworCS8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gMTA7IGkgPj0gMDsgaS0tKSB7CisJCWludCBkYXRhdmFsID0gKHJlYWRfY21kICYgKDEgPDwgaSkpID8gRUVfREFUQV9XUklURSA6IDA7CisJCW91dGIoRUVfRU5CIHwgZGF0YXZhbCwgZWVfYWRkcik7CisJCWVlcHJvbV9kZWxheSgpOworCQlvdXRiKEVFX0VOQiB8IGRhdGF2YWwgfCBFRV9TSElGVF9DTEssIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkoKTsKKwl9CisJb3V0YihFRV9FTkIsIGVlX2FkZHIpOworCWVlcHJvbV9kZWxheSgpOworCisJZm9yIChpID0gMTY7IGkgPiAwOyBpLS0pIHsKKwkJb3V0YihFRV9FTkIgfCBFRV9TSElGVF9DTEssIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkoKTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW5iKGVlX2FkZHIpICYgRUVfREFUQV9SRUFEKSA/IDEgOiAwKTsKKwkJb3V0YihFRV9FTkIsIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkoKTsKKwl9CisKKwkvKiBUZXJtaW5hdGUgdGhlIEVFUFJPTSBhY2Nlc3MuICovCisJb3V0Yih+RUVfQ1MsIGVlX2FkZHIpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bF9yZXNldChzdHJ1Y3QgbmljKiBuaWMpCit7CisJaW50IGk7CisKKwlvdXRiKENtZFJlc2V0LCBpb2FkZHIgKyBDaGlwQ21kKTsKKworCWN1cl9yeCA9IDA7CisJY3VyX3R4ID0gMDsKKworCS8qIEdpdmUgdGhlIGNoaXAgMTBtcyB0byBmaW5pc2ggdGhlIHJlc2V0LiAqLworCWxvYWRfdGltZXIyKDEwKlRJQ0tTX1BFUl9NUyk7CisJd2hpbGUgKChpbmIoaW9hZGRyICsgQ2hpcENtZCkgJiBDbWRSZXNldCkgIT0gMCAmJiB0aW1lcjJfcnVubmluZygpKQorCQkvKiB3YWl0ICovOworCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCisJCW91dGIobmljLT5ub2RlX2FkZHJbaV0sIGlvYWRkciArIE1BQzAgKyBpKTsKKworCS8qIE11c3QgZW5hYmxlIFR4L1J4IGJlZm9yZSBzZXR0aW5nIHRyYW5zZmVyIHRocmVzaG9sZHMhICovCisJb3V0YihDbWRSeEVuYiB8IENtZFR4RW5iLCBpb2FkZHIgKyBDaGlwQ21kKTsKKwlvdXRsKChSWF9GSUZPX1RIUkVTSDw8MTMpIHwgKFJYX0JVRl9MRU5fSURYPDwxMSkgfCAoUlhfRE1BX0JVUlNUPDw4KSwKKwkJaW9hZGRyICsgUnhDb25maWcpOwkJLyogYWNjZXB0IG5vIGZyYW1lcyB5ZXQhICAqLworCW91dGwoKFRYX0RNQV9CVVJTVDw8OCl8MHgwMzAwMDAwMCwgaW9hZGRyICsgVHhDb25maWcpOworCisJLyogVGhlIExpbnV4IGRyaXZlciBjaGFuZ2VzIENvbmZpZzEgaGVyZSB0byB1c2UgYSBkaWZmZXJlbnQgTEVEIHBhdHRlcm4KKwkgKiBmb3IgaGFsZiBkdXBsZXggb3IgZnVsbC9hdXRvZGV0ZWN0IGR1cGxleCAoZm9yIGZ1bGwvYXV0b2RldGVjdCwgdGhlCisJICogb3V0cHV0cyBhcmUgVFgvUlgsIExpbmsxMC8xMDAsIEZVTEwsIHdoaWxlIGZvciBoYWxmIGR1cGxleCBpdCB1c2VzCisJICogVFgvUlgsIExpbmsxMDAsIExpbmsxMCkuICBUaGlzIGlzIG1lc3N5LCBiZWNhdXNlIGl0IGRvZXNuJ3QgbWF0Y2gKKwkgKiB0aGUgaW5zY3JpcHRpb24gb24gdGhlIG1vdW50aW5nIGJyYWNrZXQuICBJdCBzaG91bGQgbm90IGJlIGNoYW5nZWQKKwkgKiBmcm9tIHRoZSBjb25maWd1cmF0aW9uIEVFUFJPTSBkZWZhdWx0LCBiZWNhdXNlIHRoZSBjYXJkIG1hbnVmYWN0dXJlcgorCSAqIHNob3VsZCBoYXZlIHNldCB0aGF0IHRvIG1hdGNoIHRoZSBjYXJkLiAgKi8KKworI2lmZGVmCURFQlVHX1JYCisJcHJpbnRmKCJyeCByaW5nIGFkZHJlc3MgaXMgJVhcbiIsKHVuc2lnbmVkIGxvbmcpcnhfcmluZyk7CisjZW5kaWYKKwlvdXRsKCh1bnNpZ25lZCBsb25nKXJ4X3JpbmcsIGlvYWRkciArIFJ4QnVmKTsKKworCS8qIFN0YXJ0IHRoZSBjaGlwJ3MgVHggYW5kIFJ4IHByb2Nlc3MuICovCisJb3V0bCgwLCBpb2FkZHIgKyBSeE1pc3NlZCk7CisJLyogc2V0X3J4X21vZGUgKi8KKwlvdXRiKEFjY2VwdEJyb2FkY2FzdHxBY2NlcHRNeVBoeXMsIGlvYWRkciArIFJ4Q29uZmlnKTsKKwkvKiBJZiB3ZSBhZGQgbXVsdGljYXN0IHN1cHBvcnQsIHRoZSBNQVIwIHJlZ2lzdGVyIHdvdWxkIGhhdmUgdG8gYmUKKwkgKiBpbml0aWFsaXplZCB0byAweGZmZmZmZmZmZmZmZmZmZmYgKHR3byAzMiBiaXQgYWNjZXNzZXMpLiAgRXRoZXJib290CisJICogb25seSBuZWVkcyBicm9hZGNhc3QgKGZvciBBUlAvUkFSUC9CT09UUC9ESENQKSBhbmQgdW5pY2FzdC4gICovCisJb3V0YihDbWRSeEVuYiB8IENtZFR4RW5iLCBpb2FkZHIgKyBDaGlwQ21kKTsKKworCS8qIERpc2FibGUgYWxsIGtub3duIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJb3V0dygwLCBpb2FkZHIgKyBJbnRyTWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bF90cmFuc21pdChzdHJ1Y3QgbmljICpuaWMsIGNvbnN0IGNoYXIgKmRlc3RhZGRyLAorCXVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgbGVuLCBjb25zdCBjaGFyICpkYXRhKQoreworCXVuc2lnbmVkIGludCBzdGF0dXMsIHRvLCBuc3R5cGU7CisJdW5zaWduZWQgbG9uZyB0eHN0YXR1czsKKworCW1lbWNweSh0eF9idWZmZXIsIGRlc3RhZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KHR4X2J1ZmZlciArIEVUSF9BTEVOLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOworCW5zdHlwZSA9IGh0b25zKHR5cGUpOworCW1lbWNweSh0eF9idWZmZXIgKyAyICogRVRIX0FMRU4sIChjaGFyKikmbnN0eXBlLCAyKTsKKwltZW1jcHkodHhfYnVmZmVyICsgRVRIX0hMRU4sIGRhdGEsIGxlbik7CisKKwlsZW4gKz0gRVRIX0hMRU47CisjaWZkZWYJREVCVUdfVFgKKwlwcmludGYoInNlbmRpbmcgJWQgYnl0ZXMgZXRodHlwZSAlaFhcbiIsIGxlbiwgdHlwZSk7CisjZW5kaWYKKworCS8qIE5vdGU6IFJUTDgxMzkgZG9lc24ndCBhdXRvLXBhZCwgc2VuZCBtaW5pbXVtIHBheWxvYWQgKGFub3RoZXIgNAorCSAqIGJ5dGVzIGFyZSBzZW50IGF1dG9tYXRpY2FsbHkgZm9yIHRoZSBGQ1MsIHRvdGFsbGluZyB0byA2NCBieXRlcykuICovCisJd2hpbGUgKGxlbiA8IEVUSF9aTEVOKSB7CisJCXR4X2J1ZmZlcltsZW4rK10gPSAnXDAnOworCX0KKworCW91dGwoKHVuc2lnbmVkIGxvbmcpdHhfYnVmZmVyLCBpb2FkZHIgKyBUeEFkZHIwICsgY3VyX3R4KjQpOworCW91dGwoKChUWF9GSUZPX1RIUkVTSDw8MTEpICYgMHgwMDNmMDAwMCkgfCBsZW4sCisJCWlvYWRkciArIFR4U3RhdHVzMCArIGN1cl90eCo0KTsKKworCXRvID0gY3VycnRpY2tzKCkgKyBSVExfVElNRU9VVDsKKworCWRvIHsKKwkJc3RhdHVzID0gaW53KGlvYWRkciArIEludHJTdGF0dXMpOworCQkvKiBPbmx5IGFja25sb3dsZWRnZSBpbnRlcnJ1cHQgc291cmNlcyB3ZSBjYW4gcHJvcGVybHkgaGFuZGxlCisJCSAqIGhlcmUgLSB0aGUgUnhPdmVyZmxvdy9SeEZJRk9PdmVyIE1VU1QgYmUgaGFuZGxlZCBpbiB0aGUKKwkJICogcnRsX3BvbGwoKSBmdW5jdGlvbi4gICovCisJCW91dHcoc3RhdHVzICYgKFR4T0sgfCBUeEVyciB8IFBDSUVyciksIGlvYWRkciArIEludHJTdGF0dXMpOworCQlpZiAoKHN0YXR1cyAmIChUeE9LIHwgVHhFcnIgfCBQQ0lFcnIpKSAhPSAwKSBicmVhazsKKwl9IHdoaWxlIChjdXJydGlja3MoKSA8IHRvKTsKKworCXR4c3RhdHVzID0gaW5sKGlvYWRkcisgVHhTdGF0dXMwICsgY3VyX3R4KjQpOworCisJaWYgKHN0YXR1cyAmIFR4T0spIHsKKwkJY3VyX3R4ID0gKGN1cl90eCArIDEpICUgTlVNX1RYX0RFU0M7CisjaWZkZWYJREVCVUdfVFgKKwkJcHJpbnRmKCJ0eCBkb25lICglZCB0aWNrcyksIHN0YXR1cyAlaFggdHhzdGF0dXMgJVhcbiIsCisJCQl0by1jdXJydGlja3MoKSwgc3RhdHVzLCB0eHN0YXR1cyk7CisjZW5kaWYKKwl9IGVsc2UgeworI2lmZGVmCURFQlVHX1RYCisJCXByaW50ZigidHggdGltZW91dC9lcnJvciAoJWQgdGlja3MpLCBzdGF0dXMgJWhYIHR4c3RhdHVzICVYXG4iLAorCQkJY3VycnRpY2tzKCktdG8sIHN0YXR1cywgdHhzdGF0dXMpOworI2VuZGlmCisJCXJ0bF9yZXNldChuaWMpOworCX0KK30KKworc3RhdGljIGludCBydGxfcG9sbChzdHJ1Y3QgbmljICpuaWMpCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgcmluZ19vZmZzOworCXVuc2lnbmVkIGludCByeF9zaXplLCByeF9zdGF0dXM7CisKKwlpZiAoaW5iKGlvYWRkciArIENoaXBDbWQpICYgUnhCdWZFbXB0eSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlzdGF0dXMgPSBpbncoaW9hZGRyICsgSW50clN0YXR1cyk7CisJLyogU2VlIGJlbG93IGZvciB0aGUgcmVzdCBvZiB0aGUgaW50ZXJydXB0IGFja25vd2xlZGdlcy4gICovCisJb3V0dyhzdGF0dXMgJiB+KFJ4RklGT092ZXIgfCBSeE92ZXJmbG93IHwgUnhPSyksIGlvYWRkciArIEludHJTdGF0dXMpOworCisjaWZkZWYJREVCVUdfUlgKKwlwcmludGYoInJ0bF9wb2xsOiBpbnQgJWhYICIsIHN0YXR1cyk7CisjZW5kaWYKKworCXJpbmdfb2ZmcyA9IGN1cl9yeCAlIFJYX0JVRl9MRU47CisJcnhfc3RhdHVzID0gKih1bnNpZ25lZCBpbnQqKShyeF9yaW5nICsgcmluZ19vZmZzKTsKKwlyeF9zaXplID0gcnhfc3RhdHVzID4+IDE2OworCXJ4X3N0YXR1cyAmPSAweGZmZmY7CisKKwlpZiAoKHJ4X3N0YXR1cyAmIChSeEJhZFN5bWJvbHxSeFJ1bnR8UnhUb29Mb25nfFJ4Q1JDRXJyfFJ4QmFkQWxpZ24pKSB8fAorCSAgICAocnhfc2l6ZSA8IEVUSF9aTEVOKSB8fCAocnhfc2l6ZSA+IEVUSF9GUkFNRV9MRU4gKyA0KSkgeworCQlwcmludGYoInJ4IGVycm9yICVoWFxuIiwgcnhfc3RhdHVzKTsKKwkJcnRsX3Jlc2V0KG5pYyk7CS8qIHRoaXMgY2xlYXJzIGFsbCBpbnRlcnJ1cHRzIHN0aWxsIHBlbmRpbmcgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJLyogUmVjZWl2ZWQgYSBnb29kIHBhY2tldCAqLworCW5pYy0+cGFja2V0bGVuID0gcnhfc2l6ZSAtIDQ7CS8qIG5vIG9uZSBjYXJlcyBhYm91dCB0aGUgRkNTICovCisJaWYgKHJpbmdfb2Zmcys0K3J4X3NpemUtNCA+IFJYX0JVRl9MRU4pIHsKKwkJaW50IHNlbWlfY291bnQgPSBSWF9CVUZfTEVOIC0gcmluZ19vZmZzIC0gNDsKKworCQltZW1jcHkobmljLT5wYWNrZXQsIHJ4X3JpbmcgKyByaW5nX29mZnMgKyA0LCBzZW1pX2NvdW50KTsKKwkJbWVtY3B5KG5pYy0+cGFja2V0K3NlbWlfY291bnQsIHJ4X3JpbmcsIHJ4X3NpemUtNC1zZW1pX2NvdW50KTsKKyNpZmRlZglERUJVR19SWAorCQlwcmludGYoInJ4IHBhY2tldCAlZCslZCBieXRlcyIsIHNlbWlfY291bnQscnhfc2l6ZS00LXNlbWlfY291bnQpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJbWVtY3B5KG5pYy0+cGFja2V0LCByeF9yaW5nICsgcmluZ19vZmZzICsgNCwgbmljLT5wYWNrZXRsZW4pOworI2lmZGVmCURFQlVHX1JYCisJCXByaW50ZigicnggcGFja2V0ICVkIGJ5dGVzIiwgcnhfc2l6ZS00KTsKKyNlbmRpZgorCX0KKyNpZmRlZglERUJVR19SWAorCXByaW50ZigiIGF0ICVYIHR5cGUgJWhoWCVoaFggcnhzdGF0dXMgJWhYXG4iLAorCQkodW5zaWduZWQgbG9uZykocnhfcmluZytyaW5nX29mZnMrNCksCisJCW5pYy0+cGFja2V0WzEyXSwgbmljLT5wYWNrZXRbMTNdLCByeF9zdGF0dXMpOworI2VuZGlmCisJY3VyX3J4ID0gKGN1cl9yeCArIHJ4X3NpemUgKyA0ICsgMykgJiB+MzsKKwlvdXR3KGN1cl9yeCAtIDE2LCBpb2FkZHIgKyBSeEJ1ZlB0cik7CisJLyogU2VlIFJUTDgxMzkgUHJvZ3JhbW1pbmcgR3VpZGUgVjAuMSBmb3IgdGhlIG9mZmljaWFsIGhhbmRsaW5nIG9mCisJICogUnggb3ZlcmZsb3cgc2l0dWF0aW9ucy4gIFRoZSBkb2N1bWVudCBpdHNlbGYgY29udGFpbnMgYmFzaWNhbGx5IG5vCisJICogdXNhYmxlIGluZm9ybWF0aW9uLCBleGNlcHQgZm9yIGEgZmV3IGV4Y2VwdGlvbiBoYW5kbGluZyBydWxlcy4gICovCisJb3V0dyhzdGF0dXMgJiAoUnhGSUZPT3ZlciB8IFJ4T3ZlcmZsb3cgfCBSeE9LKSwgaW9hZGRyICsgSW50clN0YXR1cyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bF9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYykKK3sKKwkvKiByZXNldCB0aGUgY2hpcCAqLworCW91dGIoQ21kUmVzZXQsIGlvYWRkciArIENoaXBDbWQpOworCisJLyogMTAgbXMgdGltZW91dCAqLworCWxvYWRfdGltZXIyKDEwKlRJQ0tTX1BFUl9NUyk7CisJd2hpbGUgKChpbmIoaW9hZGRyICsgQ2hpcENtZCkgJiBDbWRSZXNldCkgIT0gMCAmJiB0aW1lcjJfcnVubmluZygpKQorCQkvKiB3YWl0ICovOworfQpkaWZmIC0tZ2l0IGEvbmV0Ym9vdC9zaXM5MDAuYyBiL25ldGJvb3Qvc2lzOTAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIwOGEyNgotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3Qvc2lzOTAwLmMKQEAgLTAsMCArMSwxMDM0IEBACisvKiAtKi0gTW9kZTpDOyBjLWJhc2ljLW9mZnNldDo0OyAtKi0gKi8KKworLyogCisgICBzaXM5MDAuYzogQW4gU2lTIDkwMC83MDE2IFBDSSBGYXN0IEV0aGVybmV0IGRyaXZlciBmb3IgRXRoZXJib290CisgICBDb3B5cmlnaHQgKEMpIDIwMDEgRW50aXR5IEN5YmVyLCBJbmMuCisKKyAgIFJldmlzaW9uOgkxLjAJTWFyY2ggMSwgMjAwMQorICAgCisgICBBdXRob3I6IE1hcnR5IENvbm5vciAobWRjQHRoaW5ndWluLm9yZykKKworICAgQWRhcHRlZCBmcm9tIGEgTGludXggZHJpdmVyIHdoaWNoIHdhcyB3cml0dGVuIGJ5IERvbmFsZCBCZWNrZXIKKyAgIGFuZCBtb2RpZmllZCBieSBPbGxpZSBMaG8gYW5kIENoaW4tU2hhbiBMaSBvZiBTaVMgQ29ycG9yYXRpb24uCisgICBSZXdyaXR0ZW4gZm9yIEV0aGVyYm9vdCBieSBNYXJ0eSBDb25ub3IuCisgICAKKyAgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAgIG9mIHRoZSBHTlUgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICAgCisgICBSZWZlcmVuY2VzOgorICAgU2lTIDcwMTYgRmFzdCBFdGhlcm5ldCBQQ0kgQnVzIDEwLzEwMCBNYnBzIExBTiBDb250cm9sbGVyIHdpdGggT25Ob3cgU3VwcG9ydCwKKyAgIHByZWxpbWluYXJ5IFJldi4gMS4wIEphbi4gMTQsIDE5OTgKKyAgIFNpUyA5MDAgRmFzdCBFdGhlcm5ldCBQQ0kgQnVzIDEwLzEwMCBNYnBzIExBTiBTaW5nbGUgQ2hpcCB3aXRoIE9uTm93IFN1cHBvcnQsCisgICBwcmVsaW1pbmFyeSBSZXYuIDEuMCBOb3YuIDEwLCAxOTk4CisgICBTaVMgNzAxNCBTaW5nbGUgQ2hpcCAxMDBCQVNFLVRYLzEwQkFTRS1UIFBoeXNpY2FsIExheWVyIFNvbHV0aW9uLAorICAgcHJlbGltaW5hcnkgUmV2LiAxLjAgSmFuLiAxOCwgMTk5OAorICAgaHR0cDovL3d3dy5zaXMuY29tLnR3L3N1cHBvcnQvZGF0YWJvb2suaHRtICovCisKKy8qIFJldmlzaW9uIEhpc3RvcnkgKi8KKworLyoKKyAgMDEgTWFyY2ggMjAwMSAgbWRjICAgICAxLjAKKyAgICAgSW5pdGlhbCBSZWxlYXNlLiAgVGVzdGVkIHdpdGggUENJIGJhc2VkIHNpczkwMCBjYXJkIGFuZCBUaGlua05JQworICAgICBjb21wdXRlci4KKyAgMjAgTWFyY2ggMjAwMSBQLktvZWdlbAorICAgICBhZGRlZCBzdXBwb3J0IGZvciBzaXM2MzBlIGFuZCBQSFkgSUNTMTg5MyBhbmQgUlRMODIwMQorICAgICBUZXN0ZXQgd2l0aCBTSVM3MzBTIGNoaXBzZXQgKyBJQ1MxODkzCisqLworCisMCisvKiBJbmNsdWRlcyAqLworCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisjaW5jbHVkZSAibmljLmgiCisjaW5jbHVkZSAicGNpLmgiCisjaW5jbHVkZSAiY2FyZHMuaCIKKworI2luY2x1ZGUgInNpczkwMC5oIgorCisvKiBHbG9iYWxzICovCisKK3N0YXRpYyBpbnQgc2lzOTAwX2RlYnVnID0gMDsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHZlbmRvciwgZGV2X2lkOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW9hZGRyOworCitzdGF0aWMgdW5zaWduZWQgaW50IGN1cl9waHk7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3VyX3J4OworCitzdGF0aWMgQnVmZmVyRGVzYyB0eGQ7CitzdGF0aWMgQnVmZmVyRGVzYyByeGRbTlVNX1JYX0RFU0NdOworCisjaWZkZWYgVVNFX0xPV01FTV9CVUZGRVIKKyNkZWZpbmUgdHhiICgoY2hhciAqKTB4MTAwMDAgLSBUWF9CVUZfU0laRSkKKyNkZWZpbmUgcnhiICgoY2hhciAqKTB4MTAwMDAgLSBOVU1fUlhfREVTQypSWF9CVUZfU0laRSAtIFRYX0JVRl9TSVpFKQorI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHR4YltUWF9CVUZfU0laRV07CitzdGF0aWMgdW5zaWduZWQgY2hhciByeGJbTlVNX1JYX0RFU0MgKiBSWF9CVUZfU0laRV07CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBtYWNfY2hpcF9pbmZvIHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIHUxNiB2ZW5kb3JfaWQsIGRldmljZV9pZCwgZmxhZ3M7CisgICAgaW50IGlvX3NpemU7Cit9IG1hY19jaGlwX3RhYmxlW10gPSB7CisgICAgeyAiU2lTIDkwMCBQQ0kgRmFzdCBFdGhlcm5ldCIsIFBDSV9WRU5ET1JfSURfU0lTLCBQQ0lfREVWSUNFX0lEX1NJUzkwMCwKKyAgICAgIFBDSV9DT01NQU5EX0lPfFBDSV9DT01NQU5EX01BU1RFUiwgU0lTOTAwX1RPVEFMX1NJWkV9LAorICAgIHsgIlNpUyA3MDE2IFBDSSBGYXN0IEV0aGVybmV0IixQQ0lfVkVORE9SX0lEX1NJUywgUENJX0RFVklDRV9JRF9TSVM3MDE2LAorICAgICAgUENJX0NPTU1BTkRfSU98UENJX0NPTU1BTkRfTUFTVEVSLCBTSVM5MDBfVE9UQUxfU0laRX0sCisgICAgezAsMCwwLDAsMH0gLyogMCB0ZXJtaW5hdGVkIGxpc3QuICovCit9OworCitzdGF0aWMgdm9pZCBzaXM5MDBfcmVhZF9tb2RlKHN0cnVjdCBuaWMgKm5pYywgaW50IHBoeV9hZGRyLCBpbnQgKnNwZWVkLCBpbnQgKmR1cGxleCk7CitzdGF0aWMgdm9pZCBhbWQ3OWM5MDFfcmVhZF9tb2RlKHN0cnVjdCBuaWMgKm5pYywgaW50IHBoeV9hZGRyLCBpbnQgKnNwZWVkLCBpbnQgKmR1cGxleCk7CitzdGF0aWMgdm9pZCBpY3MxODkzX3JlYWRfbW9kZShzdHJ1Y3QgbmljICpuaWMsIGludCBwaHlfYWRkciwgaW50ICpzcGVlZCwgaW50ICpkdXBsZXgpOworc3RhdGljIHZvaWQgcnRsODIwMV9yZWFkX21vZGUoc3RydWN0IG5pYyAqbmljLCBpbnQgcGh5X2FkZHIsIGludCAqc3BlZWQsIGludCAqZHVwbGV4KTsKKworc3RhdGljIHN0cnVjdCBtaWlfY2hpcF9pbmZvIHsKKyAgICBjb25zdCBjaGFyICogbmFtZTsKKyAgICB1MTYgcGh5X2lkMDsKKyAgICB1MTYgcGh5X2lkMTsKKyAgICB2b2lkICgqcmVhZF9tb2RlKSAoc3RydWN0IG5pYyAqbmljLCBpbnQgcGh5X2FkZHIsIGludCAqc3BlZWQsIGludCAqZHVwbGV4KTsKK30gbWlpX2NoaXBfdGFibGVbXSA9IHsKKyAgICB7IlNpUyA5MDAgSW50ZXJuYWwgTUlJIFBIWSIsIDB4MDAxZCwgMHg4MDAwLCBzaXM5MDBfcmVhZF9tb2RlfSwKKyAgICB7IlNpUyA3MDE0IFBoeXNpY2FsIExheWVyIFNvbHV0aW9uIiwgMHgwMDE2LCAweGY4MzAsc2lzOTAwX3JlYWRfbW9kZX0sCisgICAgeyJBTUQgNzlDOTAxIDEwQkFTRS1UIFBIWSIsICAweDAwMDAsIDB4MzViOSwgYW1kNzljOTAxX3JlYWRfbW9kZX0sCisgICAgeyJBTUQgNzlDOTAxIEhvbWVQTkEgUEhZIiwgICAweDAwMDAsIDB4MzVjOCwgYW1kNzljOTAxX3JlYWRfbW9kZX0sCisgICAgeyJJQ1MgMTg5MyBJbnRlZ3JhdGVkIFBIWWNlaXZlciIgICAsIDB4MDAxNSwgMHhmNDQxLGljczE4OTNfcmVhZF9tb2RlfSwKKyAgICB7IlJUTCA4MjAxIDEwLzEwME1icHMgUGh5Y2VpdmVyIiAgICwgMHgwMDAwLCAweDgyMDEscnRsODIwMV9yZWFkX21vZGV9LAorICAgIHswLDAsMCwwfQorfTsKKworc3RhdGljIHN0cnVjdCBtaWlfcGh5IHsKKyAgICBzdHJ1Y3QgbWlpX3BoeSAqIG5leHQ7CisgICAgc3RydWN0IG1paV9jaGlwX2luZm8gKiBjaGlwX2luZm87CisgICAgaW50IHBoeV9hZGRyOworICAgIHUxNiBzdGF0dXM7Cit9IG1paTsKKworDAorLy8gUENJIHRvIElTQSBicmlkZ2UgZm9yIFNJUzY0MEUgYWNjZXNzCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2UgICBwY2lfaXNhX2JyaWRnZV9saXN0W10gPSB7CisJeyAweDEwMzksIDB4MDAwOCwKKwkJIlNJUyA4NUM1MDMvNTUxMyBQQ0kgdG8gSVNBIGJyaWRnZSIsIDAsIDAsIDAsIDB9LAorCXswLCAwLCBOVUxMLCAwLCAwLCAwLCAwfQorfTsKKworLyogRnVuY3Rpb24gUHJvdG90eXBlcyAqLworCitzdHJ1Y3QgbmljICpzaXM5MDBfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqaW9fYWRkcnMsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpOworCitzdGF0aWMgdTE2ICBzaXM5MDBfcmVhZF9lZXByb20oaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkIHNpczkwMF9tZGlvX3Jlc2V0KGxvbmcgbWRpb19hZGRyKTsKK3N0YXRpYyB2b2lkIHNpczkwMF9tZGlvX2lkbGUobG9uZyBtZGlvX2FkZHIpOworc3RhdGljIHUxNiAgc2lzOTAwX21kaW9fcmVhZChpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pOworc3RhdGljIHZvaWQgc2lzOTAwX21kaW9fd3JpdGUoaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsKTsKKworc3RhdGljIHZvaWQgc2lzOTAwX2luaXQoc3RydWN0IG5pYyAqbmljKTsKKworc3RhdGljIHZvaWQgc2lzOTAwX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYyk7CisKK3N0YXRpYyB2b2lkIHNpczkwMF9pbml0X3J4ZmlsdGVyKHN0cnVjdCBuaWMgKm5pYyk7CitzdGF0aWMgdm9pZCBzaXM5MDBfaW5pdF90eGQoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyB2b2lkIHNpczkwMF9pbml0X3J4ZChzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIHZvaWQgc2lzOTAwX3NldF9yeF9tb2RlKHN0cnVjdCBuaWMgKm5pYyk7CitzdGF0aWMgdm9pZCBzaXM5MDBfY2hlY2tfbW9kZShzdHJ1Y3QgbmljICpuaWMpOworCitzdGF0aWMgdm9pZCBzaXM5MDBfdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdCwgdW5zaWduZWQgaW50IHMsIGNvbnN0IGNoYXIgKnApOworc3RhdGljIGludCAgc2lzOTAwX3BvbGwoc3RydWN0IG5pYyAqbmljKTsKKworc3RhdGljIHZvaWQgc2lzOTAwX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKTsKKworLyoqCisgKglzaXM5MDBfZ2V0X21hY19hZGRyOiAtIEdldCBNQUMgYWRkcmVzcyBmb3Igc3RhbmQgYWxvbmUgU2lTOTAwIG1vZGVsCisgKglAcGNpX2RldjogdGhlIHNpczkwMCBwY2kgZGV2aWNlCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gZ2V0IGFkZHJlc3MgZm9yCisgKgorICoJT2xkZXIgU2lTOTAwIGFuZCBmcmllbmRzLCB1c2UgRUVQUk9NIHRvIHN0b3JlIE1BQyBhZGRyZXNzLgorICoJTUFDIGFkZHJlc3MgaXMgcmVhZCBmcm9tIHJlYWRfZWVwcm9tKCkgaW50byBAbmV0X2Rldi0+ZGV2X2FkZHIuCisgKi8KKworc3RhdGljIGludCBzaXM5MDBfZ2V0X21hY19hZGRyKHN0cnVjdCBwY2lfZGV2aWNlICogcGNpX2RldiAsIHN0cnVjdCBuaWMgKm5pYykKK3sKKwl1MTYgc2lnbmF0dXJlOworCWludCBpOworCisJLyogY2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgc2FuZSBFRVBST00gKi8KKwlzaWduYXR1cmUgPSAodTE2KSBzaXM5MDBfcmVhZF9lZXByb20oIEVFUFJPTVNpZ25hdHVyZSk7CisJaWYgKHNpZ25hdHVyZSA9PSAweGZmZmYgfHwgc2lnbmF0dXJlID09IDB4MDAwMCkgeworCQlwcmludGYgKCJzaXM5MDBfcHJvYmU6IEVycm9yIEVFUlBPTSByZWFkICVoWFxuIiwgc2lnbmF0dXJlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZ2V0IE1BQyBhZGRyZXNzIGZyb20gRUVQUk9NICovCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCSgodTE2ICopKG5pYy0+bm9kZV9hZGRyKSlbaV0gPSBzaXM5MDBfcmVhZF9lZXByb20oaStFRVBST01NQUNBZGRyKTsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKglzaXM2MzBlX2dldF9tYWNfYWRkcjogLSBHZXQgTUFDIGFkZHJlc3MgZm9yIFNpUzYzMEUgbW9kZWwKKyAqCUBwY2lfZGV2OiB0aGUgc2lzOTAwIHBjaSBkZXZpY2UKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byBnZXQgYWRkcmVzcyBmb3IKKyAqCisgKglTaVM2MzBFIG1vZGVsLCB1c2UgQVBDIENNT1MgUkFNIHRvIHN0b3JlIE1BQyBhZGRyZXNzLgorICoJQVBDIENNT1MgUkFNIGlzIGFjY2Vzc2VkIHRocm91Z2ggSVNBIGJyaWRnZS4KKyAqCU1BQyBhZGRyZXNzIGlzIHJlYWQgaW50byBAbmV0X2Rldi0+ZGV2X2FkZHIuCisgKi8KKworc3RhdGljIGludCBzaXM2MzBlX2dldF9tYWNfYWRkcihzdHJ1Y3QgcGNpX2RldmljZSAqIHBjaV9kZXYsIHN0cnVjdCBuaWMgKm5pYykKK3sKKwl1OCByZWc7CisJaW50IGk7CisJc3RydWN0IHBjaV9kZXZpY2UJKnA7CisKKwkvLyBmaW5kIFBDSSB0byBJU0EgYnJpZGdlCisJZXRoX3BjaV9pbml0KHBjaV9pc2FfYnJpZGdlX2xpc3QpOworCisgICAgLyogdGhlIGZpcnRzIGVudHJ5IGluIHRoaXMgbGlzdCBzaG91bGQgY29udGFpbiBidXMvZGV2Zm4gKi8KKyAgICBwID0gcGNpX2lzYV9icmlkZ2VfbGlzdDsKKworCXBjaWJpb3NfcmVhZF9jb25maWdfYnl0ZShwLT5idXMscC0+ZGV2Zm4sIDB4NDgsICZyZWcpOworCXBjaWJpb3Nfd3JpdGVfY29uZmlnX2J5dGUocC0+YnVzLHAtPmRldmZuLCAweDQ4LCByZWcgfCAweDQwKTsKKworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQorCXsKKwkJb3V0YigweDA5ICsgaSwgMHg3MCk7CisJCSgodTggKikobmljLT5ub2RlX2FkZHIpKVtpXSA9IGluYigweDcxKTsKKwl9CisJcGNpYmlvc193cml0ZV9jb25maWdfYnl0ZShwLT5idXMscC0+ZGV2Zm4sIDB4NDgsIHJlZyAmIH4weDQwKTsKKworCXJldHVybiAxOworfQorDAorLyogCisgKiBGdW5jdGlvbjogc2lzOTAwX3Byb2JlCisgKgorICogRGVzY3JpcHRpb246IGluaXRpYWxpemVzIGluaXRpYWxpemVzIHRoZSBOSUMsIHJldHJpZXZlcyB0aGUKKyAqICAgIE1BQyBhZGRyZXNzIG9mIHRoZSBjYXJkLCBhbmQgc2V0cyB1cCBzb21lIGdsb2JhbHMgcmVxdWlyZWQgYnkgCisgKiAgICBvdGhlciByb3V0aW5lcy4KKyAqCisgKiBTaWRlIGVmZmVjdHM6CisgKiAgICAgICAgICAgIGxlYXZlcyB0aGUgaW9hZGRyZXNzIG9mIHRoZSBzaXM5MDAgY2hpcCBpbiB0aGUgdmFyaWFibGUgaW9hZGRyLgorICogICAgICAgICAgICBsZWF2ZXMgdGhlIHNpczkwMCBpbml0aWFsaXplZCwgYW5kIHJlYWR5IHRvIHJlY2lldmUgcGFja2V0cy4KKyAqCisgKiBSZXR1cm5zOiAgIHN0cnVjdCBuaWMgKjogICAgICAgICAgcG9pbnRlciB0byBOSUMgZGF0YSBzdHJ1Y3R1cmUKKyAqLworCitzdHJ1Y3QgbmljICpzaXM5MDBfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqaW9fYWRkcnMsIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCit7CisgICAgaW50IGk7CisgICAgaW50IGZvdW5kPTA7CisgICAgaW50IHBoeV9hZGRyOworICAgIHUxNiBzaWduYXR1cmU7CisgICAgdTggcmV2aXNpb247CisgICAgaW50IHJldDsKKworICAgIGlmIChpb19hZGRycyA9PSAwIHx8ICppb19hZGRycyA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlvYWRkciAgPSAqaW9fYWRkcnMgJiB+MzsKKyAgICB2ZW5kb3IgID0gcGNpLT52ZW5kb3I7CisgICAgZGV2X2lkICA9IHBjaS0+ZGV2X2lkOworCisgICAgLyogd2FrZXVwIGNoaXAgKi8KKyAgICBwY2liaW9zX3dyaXRlX2NvbmZpZ19kd29yZChwY2ktPmJ1cywgcGNpLT5kZXZmbiwgMHg0MCwgMHgwMDAwMDAwMCk7CisKKyAgICBhZGp1c3RfcGNpX2RldmljZShwY2kpOworCisgICAgLyogZ2V0IE1BQyBhZGRyZXNzICovCisgICAgcmV0ID0gMDsKKyAgICBwY2liaW9zX3JlYWRfY29uZmlnX2J5dGUocGNpLT5idXMscGNpLT5kZXZmbiwgUENJX1JFVklTSU9OLCAmcmV2aXNpb24pOworICAgIGlmIChyZXZpc2lvbiA9PSBTSVM2MzBFXzkwMF9SRVYgfHwgcmV2aXNpb24gPT0gU0lTNjMwRUExXzkwMF9SRVYpCisgICAgICAgcmV0ID0gc2lzNjMwZV9nZXRfbWFjX2FkZHIocGNpLCBuaWMpOworICAgIGVsc2UgaWYgKHJldmlzaW9uID09IFNJUzYzMFNfOTAwX1JFVikKKyAgICAgICAgcmV0ID0gc2lzNjMwZV9nZXRfbWFjX2FkZHIocGNpLCBuaWMpOworICAgIGVsc2UKKyAgICAgICAgcmV0ID0gc2lzOTAwX2dldF9tYWNfYWRkcihwY2ksIG5pYyk7CisKKyAgICBpZiAocmV0ID09IDApCisgICAgeworICAgICAgICBwcmludGYgKCJzaXM5MDBfcHJvYmU6IEVycm9yIE1BQyBhZGRyZXNzIG5vdCBmb3VuZFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHByaW50ZigiXG5zaXM5MDBfcHJvYmU6IE1BQyBhZGRyICUhIGF0IGlvYWRkciAlI2hYXG4iLAorICAgICAgICAgICBuaWMtPm5vZGVfYWRkciwgaW9hZGRyKTsKKyAgICBwcmludGYoInNpczkwMF9wcm9iZTogVmVuZG9yOiUjaFggRGV2aWNlOiUjaFhcbiIsIHZlbmRvciwgZGV2X2lkKTsKKworICAgIC8qIHByb2JlIGZvciBtaWkgdHJhbnNjZWl2ZXIgKi8KKyAgICAvKiBzZWFyY2ggZm9yIHRvdGFsIG9mIDMyIHBvc3NpYmxlIG1paSBwaHkgYWRkcmVzc2VzICovCisKKyAgICBmb3VuZCA9IDA7CisgICAgZm9yIChwaHlfYWRkciA9IDA7IHBoeV9hZGRyIDwgMzI7IHBoeV9hZGRyKyspIHsKKyAgICAgICAgdTE2IG1paV9zdGF0dXM7CisgICAgICAgIHUxNiBwaHlfaWQwLCBwaHlfaWQxOworICAgICAgICAgICAgICAgIAorICAgICAgICBtaWlfc3RhdHVzID0gc2lzOTAwX21kaW9fcmVhZChwaHlfYWRkciwgTUlJX1NUQVRVUyk7CisgICAgICAgIGlmIChtaWlfc3RhdHVzID09IDB4ZmZmZiB8fCBtaWlfc3RhdHVzID09IDB4MDAwMCkKKyAgICAgICAgICAgIC8qIHRoZSBtaWkgaXMgbm90IGFjY2Vzc2FibGUsIHRyeSBuZXh0IG9uZSAqLworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgCisgICAgICAgIHBoeV9pZDAgPSBzaXM5MDBfbWRpb19yZWFkKHBoeV9hZGRyLCBNSUlfUEhZX0lEMCk7CisgICAgICAgIHBoeV9pZDEgPSBzaXM5MDBfbWRpb19yZWFkKHBoeV9hZGRyLCBNSUlfUEhZX0lEMSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgIC8qIHNlYXJjaCBvdXIgbWlpIHRhYmxlIGZvciB0aGUgY3VycmVudCBtaWkgKi8gCisgICAgICAgIGZvciAoaSA9IDA7IG1paV9jaGlwX3RhYmxlW2ldLnBoeV9pZDE7IGkrKykgeworCisgICAgICAgICAgICBpZiAocGh5X2lkMCA9PSBtaWlfY2hpcF90YWJsZVtpXS5waHlfaWQwKSB7CisKKyAgICAgICAgICAgICAgICBwcmludGYoInNpczkwMF9wcm9iZTogJXMgdHJhbnNjZWl2ZXIgZm91bmQgYXQgYWRkcmVzcyAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIG1paV9jaGlwX3RhYmxlW2ldLm5hbWUsIHBoeV9hZGRyKTsKKworICAgICAgICAgICAgICAgIG1paS5jaGlwX2luZm8gPSAmbWlpX2NoaXBfdGFibGVbaV07CisgICAgICAgICAgICAgICAgbWlpLnBoeV9hZGRyICA9IHBoeV9hZGRyOworICAgICAgICAgICAgICAgIG1paS5zdGF0dXMgICAgPSBzaXM5MDBfbWRpb19yZWFkKHBoeV9hZGRyLCBNSUlfU1RBVFVTKTsKKyAgICAgICAgICAgICAgICBtaWkubmV4dCAgICAgID0gTlVMTDsKKworICAgICAgICAgICAgICAgIGZvdW5kPTE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIAorICAgIGlmIChmb3VuZCA9PSAwKSB7CisgICAgICAgIHByaW50Zigic2lzOTAwX3Byb2JlOiBObyBNSUkgdHJhbnNjZWl2ZXJzIGZvdW5kIVxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIEFyYml0cmFyaWx5IHNlbGVjdCB0aGUgbGFzdCBQSFkgZm91bmQgYXMgY3VycmVudCBQSFkgKi8KKyAgICBjdXJfcGh5ID0gbWlpLnBoeV9hZGRyOworICAgIHByaW50Zigic2lzOTAwX3Byb2JlOiBVc2luZyAlcyBhcyBkZWZhdWx0XG4iLCAgbWlpLmNoaXBfaW5mby0+bmFtZSk7CisKKyAgICAvKiBpbml0aWFsaXplIGRldmljZSAqLworICAgIHNpczkwMF9pbml0KG5pYyk7CisKKyAgICBuaWMtPnJlc2V0ICAgID0gc2lzOTAwX2luaXQ7CisgICAgbmljLT5wb2xsICAgICA9IHNpczkwMF9wb2xsOworICAgIG5pYy0+dHJhbnNtaXQgPSBzaXM5MDBfdHJhbnNtaXQ7CisgICAgbmljLT5kaXNhYmxlICA9IHNpczkwMF9kaXNhYmxlOworCisgICAgcmV0dXJuIG5pYzsKK30KKworDAorLyogCisgKiBFRVBST00gUm91dGluZXM6ICBUaGVzZSBmdW5jdGlvbnMgcmVhZCBhbmQgd3JpdGUgdG8gRUVQUk9NIGZvciAKKyAqICAgIHJldHJpZXZpbmcgdGhlIE1BQyBhZGRyZXNzIGFuZCBvdGhlciBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFib3V0IAorICogICAgdGhlIGNhcmQuCisgKi8KKworLyogRGVsYXkgYmV0d2VlbiBFRVBST00gY2xvY2sgdHJhbnNpdGlvbnMuICovCisjZGVmaW5lIGVlcHJvbV9kZWxheSgpICBpbmwoZWVfYWRkcikKKworDAorLyogRnVuY3Rpb246IHNpczkwMF9yZWFkX2VlcHJvbQorICoKKyAqIERlc2NyaXB0aW9uOiByZWFkcyBhbmQgcmV0dXJucyBhIGdpdmVuIGxvY2F0aW9uIGZyb20gRUVQUk9NCisgKgorICogQXJndW1lbnRzOiBpbnQgbG9jYXRpb246ICAgICAgIHJlcXVlc3RlZCBFRVBST00gbG9jYXRpb24KKyAqCisgKiBSZXR1cm5zOiAgIHUxNjogICAgICAgICAgICAgICAgY29udGVudHMgb2YgcmVxdWVzdGVkIEVFUFJPTSBsb2NhdGlvbgorICoKKyAqLworCisvKiBSZWFkIFNlcmlhbCBFRVBST00gdGhyb3VnaCBFRVBST00gQWNjZXNzIFJlZ2lzdGVyLCBOb3RlIHRoYXQgbG9jYXRpb24gaXMgCisgICBpbiB3b3JkICgxNiBiaXRzKSB1bml0ICovCitzdGF0aWMgdTE2IHNpczkwMF9yZWFkX2VlcHJvbShpbnQgbG9jYXRpb24pCit7CisgICAgaW50IGk7CisgICAgdTE2IHJldHZhbCA9IDA7CisgICAgbG9uZyBlZV9hZGRyID0gaW9hZGRyICsgbWVhcjsKKyAgICB1MzIgcmVhZF9jbWQgPSBsb2NhdGlvbiB8IEVFcmVhZDsKKworICAgIG91dGwoMCwgZWVfYWRkcik7CisgICAgZWVwcm9tX2RlbGF5KCk7CisgICAgb3V0bChFRUNMSywgZWVfYWRkcik7CisgICAgZWVwcm9tX2RlbGF5KCk7CisKKyAgICAvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kICg5KSBiaXRzIG91dC4gKi8KKyAgICBmb3IgKGkgPSA4OyBpID49IDA7IGktLSkgeworICAgICAgICB1MzIgZGF0YXZhbCA9IChyZWFkX2NtZCAmICgxIDw8IGkpKSA/IEVFREkgfCBFRUNTIDogRUVDUzsKKyAgICAgICAgb3V0bChkYXRhdmFsLCBlZV9hZGRyKTsKKyAgICAgICAgZWVwcm9tX2RlbGF5KCk7CisgICAgICAgIG91dGwoZGF0YXZhbCB8IEVFQ0xLLCBlZV9hZGRyKTsKKyAgICAgICAgZWVwcm9tX2RlbGF5KCk7CisgICAgfQorICAgIG91dGIoRUVDUywgZWVfYWRkcik7CisgICAgZWVwcm9tX2RlbGF5KCk7CisKKyAgICAvKiByZWFkIHRoZSAxNi1iaXRzIGRhdGEgaW4gKi8KKyAgICBmb3IgKGkgPSAxNjsgaSA+IDA7IGktLSkgeworICAgICAgICBvdXRsKEVFQ1MsIGVlX2FkZHIpOworICAgICAgICBlZXByb21fZGVsYXkoKTsKKyAgICAgICAgb3V0bChFRUNTIHwgRUVDTEssIGVlX2FkZHIpOworICAgICAgICBlZXByb21fZGVsYXkoKTsKKyAgICAgICAgcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW5sKGVlX2FkZHIpICYgRUVETykgPyAxIDogMCk7CisgICAgICAgIGVlcHJvbV9kZWxheSgpOworICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAvKiBUZXJtaW5hdGUgdGhlIEVFUFJPTSBhY2Nlc3MuICovCisgICAgb3V0bCgwLCBlZV9hZGRyKTsKKyAgICBlZXByb21fZGVsYXkoKTsKKyAgICBvdXRsKEVFQ0xLLCBlZV9hZGRyKTsKKworICAgIHJldHVybiAocmV0dmFsKTsKK30KKworI2RlZmluZSBzaXM5MDBfbWRpb19kZWxheSgpICAgIGlubChtZGlvX2FkZHIpCisKKwwKKy8qIAorICAgUmVhZCBhbmQgd3JpdGUgdGhlIE1JSSBtYW5hZ2VtZW50IHJlZ2lzdGVycyB1c2luZyBzb2Z0d2FyZS1nZW5lcmF0ZWQKKyAgIHNlcmlhbCBNRElPIHByb3RvY29sLiBOb3RlIHRoYXQgdGhlIGNvbW1hbmQgYml0cyBhbmQgZGF0YSBiaXRzIGFyZQorICAgc2VuZCBvdXQgc2VwZXJhdGVseSAKKyovCisKK3N0YXRpYyB2b2lkIHNpczkwMF9tZGlvX2lkbGUobG9uZyBtZGlvX2FkZHIpCit7CisgICAgb3V0bChNRElPIHwgTURESVIsIG1kaW9fYWRkcik7CisgICAgc2lzOTAwX21kaW9fZGVsYXkoKTsKKyAgICBvdXRsKE1ESU8gfCBNRERJUiB8IE1EQywgbWRpb19hZGRyKTsKK30KKworLyogU3luY3Jvbml6ZSB0aGUgTUlJIG1hbmFnZW1lbnQgaW50ZXJmYWNlIGJ5IHNoaWZ0aW5nIDMyIG9uZSBiaXRzIG91dC4gKi8KK3N0YXRpYyB2b2lkIHNpczkwMF9tZGlvX3Jlc2V0KGxvbmcgbWRpb19hZGRyKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMzE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIG91dGwoTURESVIgfCBNRElPLCBtZGlvX2FkZHIpOworICAgICAgICBzaXM5MDBfbWRpb19kZWxheSgpOworICAgICAgICBvdXRsKE1ERElSIHwgTURJTyB8IE1EQywgbWRpb19hZGRyKTsKKyAgICAgICAgc2lzOTAwX21kaW9fZGVsYXkoKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdTE2IHNpczkwMF9tZGlvX3JlYWQoaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQoreworICAgIGxvbmcgbWRpb19hZGRyID0gaW9hZGRyICsgbWVhcjsKKyAgICBpbnQgbWlpX2NtZCA9IE1JSXJlYWR8KHBoeV9pZDw8TUlJcG1kU2hpZnQpfChsb2NhdGlvbjw8TUlJcmVnU2hpZnQpOworICAgIHUxNiByZXR2YWwgPSAwOworICAgIGludCBpOworCisgICAgc2lzOTAwX21kaW9fcmVzZXQobWRpb19hZGRyKTsKKyAgICBzaXM5MDBfbWRpb19pZGxlKG1kaW9fYWRkcik7CisKKyAgICBmb3IgKGkgPSAxNTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgaW50IGRhdGF2YWwgPSAobWlpX2NtZCAmICgxIDw8IGkpKSA/IE1ERElSIHwgTURJTyA6IE1ERElSOworICAgICAgICBvdXRsKGRhdGF2YWwsIG1kaW9fYWRkcik7CisgICAgICAgIHNpczkwMF9tZGlvX2RlbGF5KCk7CisgICAgICAgIG91dGwoZGF0YXZhbCB8IE1EQywgbWRpb19hZGRyKTsKKyAgICAgICAgc2lzOTAwX21kaW9fZGVsYXkoKTsKKyAgICB9CisKKyAgICAvKiBSZWFkIHRoZSAxNiBkYXRhIGJpdHMuICovCisgICAgZm9yIChpID0gMTY7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgb3V0bCgwLCBtZGlvX2FkZHIpOworICAgICAgICBzaXM5MDBfbWRpb19kZWxheSgpOworICAgICAgICByZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChpbmwobWRpb19hZGRyKSAmIE1ESU8pID8gMSA6IDApOworICAgICAgICBvdXRsKE1EQywgbWRpb19hZGRyKTsKKyAgICAgICAgc2lzOTAwX21kaW9fZGVsYXkoKTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgc2lzOTAwX21kaW9fd3JpdGUoaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpCit7CisgICAgbG9uZyBtZGlvX2FkZHIgPSBpb2FkZHIgKyBtZWFyOworICAgIGludCBtaWlfY21kID0gTUlJd3JpdGV8KHBoeV9pZDw8TUlJcG1kU2hpZnQpfChsb2NhdGlvbjw8TUlJcmVnU2hpZnQpOworICAgIGludCBpOworCisgICAgc2lzOTAwX21kaW9fcmVzZXQobWRpb19hZGRyKTsKKyAgICBzaXM5MDBfbWRpb19pZGxlKG1kaW9fYWRkcik7CisKKyAgICAvKiBTaGlmdCB0aGUgY29tbWFuZCBiaXRzIG91dC4gKi8KKyAgICBmb3IgKGkgPSAxNTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgaW50IGRhdGF2YWwgPSAobWlpX2NtZCAmICgxIDw8IGkpKSA/IE1ERElSIHwgTURJTyA6IE1ERElSOworICAgICAgICBvdXRiKGRhdGF2YWwsIG1kaW9fYWRkcik7CisgICAgICAgIHNpczkwMF9tZGlvX2RlbGF5KCk7CisgICAgICAgIG91dGIoZGF0YXZhbCB8IE1EQywgbWRpb19hZGRyKTsKKyAgICAgICAgc2lzOTAwX21kaW9fZGVsYXkoKTsKKyAgICB9CisgICAgc2lzOTAwX21kaW9fZGVsYXkoKTsKKworICAgIC8qIFNoaWZ0IHRoZSB2YWx1ZSBiaXRzIG91dC4gKi8KKyAgICBmb3IgKGkgPSAxNTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgaW50IGRhdGF2YWwgPSAodmFsdWUgJiAoMSA8PCBpKSkgPyBNRERJUiB8IE1ESU8gOiBNRERJUjsKKyAgICAgICAgb3V0bChkYXRhdmFsLCBtZGlvX2FkZHIpOworICAgICAgICBzaXM5MDBfbWRpb19kZWxheSgpOworICAgICAgICBvdXRsKGRhdGF2YWwgfCBNREMsIG1kaW9fYWRkcik7CisgICAgICAgIHNpczkwMF9tZGlvX2RlbGF5KCk7CisgICAgfQorICAgIHNpczkwMF9tZGlvX2RlbGF5KCk7CisgICAgICAgIAorICAgIC8qIENsZWFyIG91dCBleHRyYSBiaXRzLiAqLworICAgIGZvciAoaSA9IDI7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgb3V0YigwLCBtZGlvX2FkZHIpOworICAgICAgICBzaXM5MDBfbWRpb19kZWxheSgpOworICAgICAgICBvdXRiKE1EQywgbWRpb19hZGRyKTsKKyAgICAgICAgc2lzOTAwX21kaW9fZGVsYXkoKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCisMCisvKiBGdW5jdGlvbjogc2lzOTAwX2luaXQKKyAqCisgKiBEZXNjcmlwdGlvbjogcmVzZXRzIHRoZSBldGhlcm5ldCBjb250cm9sbGVyIGNoaXAgYW5kIHZhcmlvdXMKKyAqICAgIGRhdGEgc3RydWN0dXJlcyByZXF1aXJlZCBmb3Igc2VuZGluZyBhbmQgcmVjZWl2aW5nIHBhY2tldHMuCisgKiAgICAKKyAqIEFyZ3VtZW50czogc3RydWN0IG5pYyAqbmljOiAgICAgICAgICBOSUMgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiByZXR1cm5zOiAgIHZvaWQuCisgKi8KKworc3RhdGljIHZvaWQKK3NpczkwMF9pbml0KHN0cnVjdCBuaWMgKm5pYykKK3sKKyAgICAvKiBTb2Z0IHJlc2V0IHRoZSBjaGlwLiAqLworICAgIHNpczkwMF9yZXNldChuaWMpOworCisgICAgc2lzOTAwX2luaXRfcnhmaWx0ZXIobmljKTsKKworICAgIHNpczkwMF9pbml0X3R4ZChuaWMpOworICAgIHNpczkwMF9pbml0X3J4ZChuaWMpOworCisgICAgc2lzOTAwX3NldF9yeF9tb2RlKG5pYyk7CisKKyAgICBzaXM5MDBfY2hlY2tfbW9kZShuaWMpOworCisgICAgb3V0bChSeEVOQSwgaW9hZGRyICsgY3IpOworfQorCisMCisvKiAKKyAqIEZ1bmN0aW9uOiBzaXM5MDBfcmVzZXQKKyAqCisgKiBEZXNjcmlwdGlvbjogZGlzYWJsZXMgaW50ZXJydXB0cyBhbmQgc29mdCByZXNldHMgdGhlIGNvbnRyb2xsZXIgY2hpcAorICoKKyAqIEFyZ3VtZW50czogc3RydWN0IG5pYyAqbmljOiAgICAgICAgICBOSUMgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zOiAgIHZvaWQuCisgKi8KKworc3RhdGljIHZvaWQgCitzaXM5MDBfcmVzZXQoc3RydWN0IG5pYyAqbmljKQoreworICAgIGludCBpID0gMDsKKyAgICB1MzIgc3RhdHVzID0gVHhSQ01QIHwgUnhSQ01QOworCisgICAgb3V0bCgwLCBpb2FkZHIgKyBpZXIpOworICAgIG91dGwoMCwgaW9hZGRyICsgaW1yKTsKKyAgICBvdXRsKDAsIGlvYWRkciArIHJmY3IpOworCisgICAgb3V0bChSeFJFU0VUIHwgVHhSRVNFVCB8IFJFU0VULCBpb2FkZHIgKyBjcik7CisgICAgICAgIAorICAgIC8qIENoZWNrIHRoYXQgdGhlIGNoaXAgaGFzIGZpbmlzaGVkIHRoZSByZXNldC4gKi8KKyAgICB3aGlsZSAoc3RhdHVzICYmIChpKysgPCAxMDAwKSkgeworICAgICAgICBzdGF0dXMgXj0gKGlubChpc3IgKyBpb2FkZHIpICYgc3RhdHVzKTsKKyAgICB9CisgICAgb3V0bChQRVNFTCwgaW9hZGRyICsgY2ZnKTsKK30KKworDAorLyogRnVuY3Rpb246IHNpc19pbml0X3J4ZmlsdGVyCisgKgorICogRGVzY3JpcHRpb246IHNldHMgcmVjZWl2ZSBmaWx0ZXIgYWRkcmVzcyB0byBvdXIgTUFDIGFkZHJlc3MKKyAqCisgKiBBcmd1bWVudHM6IHN0cnVjdCBuaWMgKm5pYzogICAgICAgICAgTklDIGRhdGEgc3RydWN0dXJlCisgKgorICogcmV0dXJuczogICB2b2lkLgorICovCisKK3N0YXRpYyB2b2lkCitzaXM5MDBfaW5pdF9yeGZpbHRlcihzdHJ1Y3QgbmljICpuaWMpCit7CisgICAgdTMyIHJmY3JTYXZlOworICAgIGludCBpOworICAgICAgICAKKyAgICByZmNyU2F2ZSA9IGlubChyZmNyICsgaW9hZGRyKTsKKworICAgIC8qIGRpc2FibGUgcGFja2V0IGZpbHRlcmluZyBiZWZvcmUgc2V0dGluZyBmaWx0ZXIgKi8KKyAgICBvdXRsKHJmY3JTYXZlICYgflJGRU4sIHJmY3IpOworCisgICAgLyogbG9hZCBNQUMgYWRkciB0byBmaWx0ZXIgZGF0YSByZWdpc3RlciAqLworICAgIGZvciAoaSA9IDAgOyBpIDwgMyA7IGkrKykgeworICAgICAgICB1MzIgdzsKKworICAgICAgICB3ID0gKHUzMikgKigodTE2ICopKG5pYy0+bm9kZV9hZGRyKStpKTsKKyAgICAgICAgb3V0bCgoaSA8PCBSRkFERFJfc2hpZnQpLCBpb2FkZHIgKyByZmNyKTsKKyAgICAgICAgb3V0bCh3LCBpb2FkZHIgKyByZmRyKTsKKworICAgICAgICBpZiAoc2lzOTAwX2RlYnVnID4gMCkKKyAgICAgICAgICAgIHByaW50Zigic2lzOTAwX2luaXRfcnhmaWx0ZXI6IFJlY2VpdmUgRmlsdGVyIEFkZHJzc1slZF09JVhcbiIsCisgICAgICAgICAgICAgICAgICAgaSwgaW5sKGlvYWRkciArIHJmZHIpKTsKKyAgICB9CisKKyAgICAvKiBlbmFibGUgcGFja2V0IGZpbGl0ZXJpbmcgKi8KKyAgICBvdXRsKHJmY3JTYXZlIHwgUkZFTiwgcmZjciArIGlvYWRkcik7Cit9CisKKwwKKy8qIAorICogRnVuY3Rpb246IHNpc19pbml0X3R4ZAorICoKKyAqIERlc2NyaXB0aW9uOiBpbml0aWFsaXplcyB0aGUgVHggZGVzY3JpcHRvcgorICoKKyAqIEFyZ3VtZW50czogc3RydWN0IG5pYyAqbmljOiAgICAgICAgICBOSUMgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiByZXR1cm5zOiAgIHZvaWQuCisgKi8KKworc3RhdGljIHZvaWQKK3NpczkwMF9pbml0X3R4ZChzdHJ1Y3QgbmljICpuaWMpCit7CisgICAgdHhkLmxpbmsgICA9ICh1MzIpIDA7CisgICAgdHhkLmNtZHN0cyA9ICh1MzIpIDA7CisgICAgdHhkLmJ1ZnB0ciA9ICh1MzIpICZ0eGJbMF07CisKKyAgICAvKiBsb2FkIFRyYW5zbWl0IERlc2NyaXB0b3IgUmVnaXN0ZXIgKi8KKyAgICBvdXRsKCh1MzIpICZ0eGQsIGlvYWRkciArIHR4ZHApOyAKKyAgICBpZiAoc2lzOTAwX2RlYnVnID4gMCkKKyAgICAgICAgcHJpbnRmKCJzaXM5MDBfaW5pdF90eGQ6IFRYIGRlc2NyaXB0b3IgcmVnaXN0ZXIgbG9hZGVkIHdpdGg6ICVYXG4iLCAKKyAgICAgICAgICAgICAgIGlubChpb2FkZHIgKyB0eGRwKSk7Cit9CisKKwwKKy8qIEZ1bmN0aW9uOiBzaXNfaW5pdF9yeGQKKyAqCisgKiBEZXNjcmlwdGlvbjogaW5pdGlhbGl6ZXMgdGhlIFJ4IGRlc2NyaXB0b3IgcmluZworICogICAgCisgKiBBcmd1bWVudHM6IHN0cnVjdCBuaWMgKm5pYzogICAgICAgICAgTklDIGRhdGEgc3RydWN0dXJlCisgKgorICogUmV0dXJuczogICB2b2lkLgorICovCisKK3N0YXRpYyB2b2lkIAorc2lzOTAwX2luaXRfcnhkKHN0cnVjdCBuaWMgKm5pYykgCit7IAorICAgIGludCBpOworCisgICAgY3VyX3J4ID0gMDsgCisKKyAgICAvKiBpbml0IFJYIGRlc2NyaXB0b3IgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0RFU0M7IGkrKykgeworICAgICAgICByeGRbaV0ubGluayAgID0gKGkrMSA8IE5VTV9SWF9ERVNDKSA/ICh1MzIpICZyeGRbaSsxXSA6ICh1MzIpICZyeGRbMF07CisgICAgICAgIHJ4ZFtpXS5jbWRzdHMgPSAodTMyKSBSWF9CVUZfU0laRTsKKyAgICAgICAgcnhkW2ldLmJ1ZnB0ciA9ICh1MzIpICZyeGJbaSpSWF9CVUZfU0laRV07CisgICAgICAgIGlmIChzaXM5MDBfZGVidWcgPiAwKQorICAgICAgICAgICAgcHJpbnRmKCJzaXM5MDBfaW5pdF9yeGQ6IHJ4ZFslZF09JVggbGluaz0lWCBjbWRzdHM9JVggYnVmcHRyPSVYXG4iLCAKKyAgICAgICAgICAgICAgICAgICBpLCAmcnhkW2ldLCByeGRbaV0ubGluaywgcnhkW2ldLmNtZHN0cywgcnhkW2ldLmJ1ZnB0cik7CisgICAgfQorCisgICAgLyogbG9hZCBSZWNlaXZlIERlc2NyaXB0b3IgUmVnaXN0ZXIgKi8KKyAgICBvdXRsKCh1MzIpICZyeGRbMF0sIGlvYWRkciArIHJ4ZHApOworCisgICAgaWYgKHNpczkwMF9kZWJ1ZyA+IDApCisgICAgICAgIHByaW50Zigic2lzOTAwX2luaXRfcnhkOiBSWCBkZXNjcmlwdG9yIHJlZ2lzdGVyIGxvYWRlZCB3aXRoOiAlWFxuIiwgCisgICAgICAgICAgICAgICBpbmwoaW9hZGRyICsgcnhkcCkpOworCit9CisKKwwKKy8qIEZ1bmN0aW9uOiBzaXNfaW5pdF9yeGQKKyAqCisgKiBEZXNjcmlwdGlvbjogCisgKiAgICBzZXRzIHRoZSByZWNlaXZlIG1vZGUgdG8gYWNjZXB0IGFsbCBicm9hZGNhc3QgcGFja2V0cyBhbmQgcGFja2V0cworICogICAgd2l0aCBvdXIgTUFDIGFkZHJlc3MsIGFuZCByZWplY3QgYWxsIG11bHRpY2FzdCBwYWNrZXRzLiAgICAgIAorICogICAgCisgKiBBcmd1bWVudHM6IHN0cnVjdCBuaWMgKm5pYzogICAgICAgICAgTklDIGRhdGEgc3RydWN0dXJlCisgKgorICogUmV0dXJuczogICB2b2lkLgorICovCisKK3N0YXRpYyB2b2lkIHNpczkwMF9zZXRfcnhfbW9kZShzdHJ1Y3QgbmljICpuaWMpCit7CisgICAgaW50IGk7CisKKyAgICAvKiBDb25maWd1cmUgTXVsdGljYXN0IEhhc2ggVGFibGUgaW4gUmVjZWl2ZSBGaWx0ZXIgCisgICAgICAgdG8gcmVqZWN0IGFsbCBNQ0FTVCBwYWNrZXRzICovCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICAvKiB3aHkgcGx1cyAweDA0PyBUaGF0IG1ha2VzIHRoZSBjb3JyZWN0IHZhbHVlIGZvciBoYXNoIHRhYmxlLiAqLworICAgICAgICBvdXRsKCh1MzIpKDB4MDAwMDAwMDQraSkgPDwgUkZBRERSX3NoaWZ0LCBpb2FkZHIgKyByZmNyKTsKKyAgICAgICAgb3V0bCgodTMyKSgweDApLCBpb2FkZHIgKyByZmRyKTsKKyAgICB9CisgICAgLyogQWNjZXB0IEJyb2FkY2FzdCBwYWNrZXRzLCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgdGhhdCBtYXRjaCAKKyAgICAgICBvdXIgTUFDIGFkZHJlc3MgKi8KKyAgICBvdXRsKFJGRU4gfCBSRkFBQiwgaW9hZGRyICsgcmZjcik7CisKKyAgICByZXR1cm47Cit9CisKKwwKKy8qIEZ1bmN0aW9uOiBzaXM5MDBfY2hlY2tfbW9kZQorICoKKyAqIERlc2NyaXB0aW9uOiBjaGVja3MgdGhlIHN0YXRlIG9mIHRyYW5zbWl0IGFuZCByZWNlaXZlCisgKiAgICBwYXJhbWV0ZXJzIG9uIHRoZSBOSUMsIGFuZCB1cGRhdGVzIE5JQyByZWdpc3RlcnMgdG8gbWF0Y2gKKyAqICAgIAorICogQXJndW1lbnRzOiBzdHJ1Y3QgbmljICpuaWM6ICAgICAgICAgIE5JQyBkYXRhIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnM6ICAgdm9pZC4KKyAqLworCitzdGF0aWMgdm9pZAorc2lzOTAwX2NoZWNrX21vZGUgKHN0cnVjdCBuaWMgKm5pYykKK3sKKyAgICBpbnQgc3BlZWQsIGR1cGxleDsKKyAgICB1MzIgdHhfZmxhZ3MgPSAwLCByeF9mbGFncyA9IDA7CisKKyAgICBtaWkuY2hpcF9pbmZvLT5yZWFkX21vZGUobmljLCBjdXJfcGh5LCAmc3BlZWQsICZkdXBsZXgpOworCisgICAgdHhfZmxhZ3MgPSBUeEFUUCB8IChUWF9ETUFfQlVSU1QgPDwgVHhNWERNQV9zaGlmdCkgfCAoVFhfRklMTF9USFJFU0ggPDwgVHhGSUxMVF9zaGlmdCk7CisgICAgcnhfZmxhZ3MgPSBSWF9ETUFfQlVSU1QgPDwgUnhNWERNQV9zaGlmdDsKKworICAgIGlmIChzcGVlZCA9PSBIV19TUEVFRF9IT01FIHx8IHNwZWVkID09IEhXX1NQRUVEXzEwX01CUFMpIHsKKyAgICAgICAgcnhfZmxhZ3MgfD0gKFJ4RFJOVF8xMCA8PCBSeERSTlRfc2hpZnQpOworICAgICAgICB0eF9mbGFncyB8PSAoVHhEUk5UXzEwIDw8IFR4RFJOVF9zaGlmdCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByeF9mbGFncyB8PSAoUnhEUk5UXzEwMCA8PCBSeERSTlRfc2hpZnQpOworICAgICAgICB0eF9mbGFncyB8PSAoVHhEUk5UXzEwMCA8PCBUeERSTlRfc2hpZnQpOworICAgIH0KKworICAgIGlmIChkdXBsZXggPT0gRkRYX0NBUEFCTEVfRlVMTF9TRUxFQ1RFRCkgeworICAgICAgICB0eF9mbGFncyB8PSAoVHhDU0kgfCBUeEhCSSk7CisgICAgICAgIHJ4X2ZsYWdzIHw9IFJ4QVRYOworICAgIH0KKworICAgIG91dGwgKHR4X2ZsYWdzLCBpb2FkZHIgKyB0eGNmZyk7CisgICAgb3V0bCAocnhfZmxhZ3MsIGlvYWRkciArIHJ4Y2ZnKTsKK30KKworDAorLyogRnVuY3Rpb246IHNpczkwMF9yZWFkX21vZGUKKyAqCisgKiBEZXNjcmlwdGlvbjogcmV0cmlldmVzIGFuZCBkaXNwbGF5cyBzcGVlZCBhbmQgZHVwbGV4CisgKiAgICBwYXJhbWV0ZXJzIGZyb20gdGhlIE5JQworICogICAgCisgKiBBcmd1bWVudHM6IHN0cnVjdCBuaWMgKm5pYzogICAgICAgICAgTklDIGRhdGEgc3RydWN0dXJlCisgKgorICogUmV0dXJuczogICB2b2lkLgorICovCisKK3N0YXRpYyB2b2lkCitzaXM5MDBfcmVhZF9tb2RlKHN0cnVjdCBuaWMgKm5pYywgaW50IHBoeV9hZGRyLCBpbnQgKnNwZWVkLCBpbnQgKmR1cGxleCkKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgdTMyIHN0YXR1czsKKyAgICAgICAgCisgICAgLyogU1RTT1VUIHJlZ2lzdGVyIGlzIExhdGNoZWQgb24gVHJhbnNpdGlvbiwgcmVhZCBvcGVyYXRpb24gdXBkYXRlcyBpdCAqLworICAgIHdoaWxlIChpKysgPCAyKQorICAgICAgICBzdGF0dXMgPSBzaXM5MDBfbWRpb19yZWFkKHBoeV9hZGRyLCBNSUlfU1RTT1VUKTsKKworICAgIGlmIChzdGF0dXMgJiBNSUlfU1RTT1VUX1NQRCkKKyAgICAgICAgKnNwZWVkID0gSFdfU1BFRURfMTAwX01CUFM7CisgICAgZWxzZQorICAgICAgICAqc3BlZWQgPSBIV19TUEVFRF8xMF9NQlBTOworCisgICAgaWYgKHN0YXR1cyAmIE1JSV9TVFNPVVRfRFBMWCkKKyAgICAgICAgKmR1cGxleCA9IEZEWF9DQVBBQkxFX0ZVTExfU0VMRUNURUQ7CisgICAgZWxzZQorICAgICAgICAqZHVwbGV4ID0gRkRYX0NBUEFCTEVfSEFMRl9TRUxFQ1RFRDsKKworICAgIGlmIChzdGF0dXMgJiBNSUlfU1RTT1VUX0xJTktfRkFJTCkKKyAgICAgICAgcHJpbnRmKCJzaXM5MDBfcmVhZF9tb2RlOiBNZWRpYSBMaW5rIE9mZlxuIik7CisgICAgZWxzZQorICAgICAgICBwcmludGYoInNpczkwMF9yZWFkX21vZGU6IE1lZGlhIExpbmsgT24gJXMgJXMtZHVwbGV4IFxuIiwgCisgICAgICAgICAgICAgICAqc3BlZWQgPT0gSFdfU1BFRURfMTAwX01CUFMgPyAKKyAgICAgICAgICAgICAgICIxMDBtYnBzIiA6ICIxMG1icHMiLAorICAgICAgICAgICAgICAgKmR1cGxleCA9PSBGRFhfQ0FQQUJMRV9GVUxMX1NFTEVDVEVEID8KKyAgICAgICAgICAgICAgICJmdWxsIiA6ICJoYWxmIik7Cit9CisKKwwKKy8qIEZ1bmN0aW9uOiBhbWQ3OWM5MDFfcmVhZF9tb2RlCisgKgorICogRGVzY3JpcHRpb246IHJldHJpZXZlcyBhbmQgZGlzcGxheXMgc3BlZWQgYW5kIGR1cGxleAorICogICAgcGFyYW1ldGVycyBmcm9tIHRoZSBOSUMKKyAqICAgIAorICogQXJndW1lbnRzOiBzdHJ1Y3QgbmljICpuaWM6ICAgICAgICAgIE5JQyBkYXRhIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnM6ICAgdm9pZC4KKyAqLworCitzdGF0aWMgdm9pZAorYW1kNzljOTAxX3JlYWRfbW9kZShzdHJ1Y3QgbmljICpuaWMsIGludCBwaHlfYWRkciwgaW50ICpzcGVlZCwgaW50ICpkdXBsZXgpCit7CisgICAgaW50IGk7CisgICAgdTE2IHN0YXR1czsKKyAgICAgICAgCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgc3RhdHVzID0gc2lzOTAwX21kaW9fcmVhZChwaHlfYWRkciwgTUlJX1NUQVRVUyk7CisKKyAgICBpZiAoc3RhdHVzICYgTUlJX1NUQVRfQ0FOX0FVVE8pIHsKKyAgICAgICAgLyogMTBCQVNFLVQgUEhZICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgICAgICBzdGF0dXMgPSBzaXM5MDBfbWRpb19yZWFkKHBoeV9hZGRyLCBNSUlfU1RBVFVTX1NVTU1BUlkpOworICAgICAgICBpZiAoc3RhdHVzICYgTUlJX1NUU1NVTV9TUEQpCisgICAgICAgICAgICAqc3BlZWQgPSBIV19TUEVFRF8xMDBfTUJQUzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKnNwZWVkID0gSFdfU1BFRURfMTBfTUJQUzsKKyAgICAgICAgaWYgKHN0YXR1cyAmIE1JSV9TVFNTVU1fRFBMWCkKKyAgICAgICAgICAgICpkdXBsZXggPSBGRFhfQ0FQQUJMRV9GVUxMX1NFTEVDVEVEOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqZHVwbGV4ID0gRkRYX0NBUEFCTEVfSEFMRl9TRUxFQ1RFRDsKKworICAgICAgICBpZiAoc3RhdHVzICYgTUlJX1NUU1NVTV9MSU5LKQorICAgICAgICAgICAgcHJpbnRmKCJhbWQ3OWM5MDFfcmVhZF9tb2RlOiBNZWRpYSBMaW5rIE9uICVzICVzLWR1cGxleCBcbiIsIAorICAgICAgICAgICAgICAgICAgICpzcGVlZCA9PSBIV19TUEVFRF8xMDBfTUJQUyA/IAorICAgICAgICAgICAgICAgICAgICIxMDBtYnBzIiA6ICIxMG1icHMiLAorICAgICAgICAgICAgICAgICAgICpkdXBsZXggPT0gRkRYX0NBUEFCTEVfRlVMTF9TRUxFQ1RFRCA/CisgICAgICAgICAgICAgICAgICAgImZ1bGwiIDogImhhbGYiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmKCJhbWQ3OWM5MDFfcmVhZF9tb2RlOiBNZWRpYSBMaW5rIE9mZlxuIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBIb21lUE5BICovCisgICAgICAgICpzcGVlZCA9IEhXX1NQRUVEX0hPTUU7CisgICAgICAgICpkdXBsZXggPSBGRFhfQ0FQQUJMRV9IQUxGX1NFTEVDVEVEOworICAgICAgICBpZiAoc3RhdHVzICYgTUlJX1NUQVRfTElOSykKKyAgICAgICAgICAgIHByaW50ZigiYW1kNzljOTAxX3JlYWRfbW9kZTpNZWRpYSBMaW5rIE9uIDFtYnBzIGhhbGYtZHVwbGV4IFxuIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiYW1kNzljOTAxX3JlYWRfbW9kZTogTWVkaWEgTGluayBPZmZcbiIpOworICAgIH0KK30KKworDAorLyoqCisgKglpY3MxODkzX3JlYWRfbW9kZTogLSByZWFkIG1lZGlhIG1vZGUgZm9yIElDUzE4OTMgUEhZCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gcmVhZCBtb2RlIGZvcgorICoJQHBoeV9hZGRyOiBtaWkgcGh5IGFkZHJlc3MKKyAqCUBzcGVlZDogdGhlIHRyYW5zbWl0IHNwZWVkIHRvIGJlIGRldGVybWluZWQKKyAqCUBkdXBsZXg6IHRoZSBkdXBsZXggbW9kZSB0byBiZSBkZXRlcm1pbmVkCisgKgorICoJSUNTMTg5MyBQSFkgdXNlIFF1aWNrIFBvbGwgRGV0YWlsZWQgU3RhdHVzIHJlZ2lzdGVyCisgKgl0byBkZXRlcm1pbmUgdGhlIHNwZWVkIGFuZCBkdXBsZXggbW9kZSBmb3Igc2lzOTAwCisgKi8KKworc3RhdGljIHZvaWQgaWNzMTg5M19yZWFkX21vZGUoc3RydWN0IG5pYyAqbmljLCBpbnQgcGh5X2FkZHIsIGludCAqc3BlZWQsIGludCAqZHVwbGV4KQoreworCWludCBpID0gMDsKKwl1MzIgc3RhdHVzOworCisJLyogTUlJX1FQRFNUUyBpcyBMYXRjaGVkLCByZWFkIHR3aWNlIGluIHN1Y2Nlc3Npb24gd2lsbCByZWZsZWN0IHRoZSBjdXJyZW50IHN0YXRlICovCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJc3RhdHVzID0gc2lzOTAwX21kaW9fcmVhZChwaHlfYWRkciwgTUlJX1FQRFNUUyk7CisKKwlpZiAoc3RhdHVzICYgTUlJX1NUU0lDU19TUEQpCisJCSpzcGVlZCA9IEhXX1NQRUVEXzEwMF9NQlBTOworCWVsc2UKKwkJKnNwZWVkID0gSFdfU1BFRURfMTBfTUJQUzsKKworCWlmIChzdGF0dXMgJiBNSUlfU1RTSUNTX0RQTFgpCisJCSpkdXBsZXggPSBGRFhfQ0FQQUJMRV9GVUxMX1NFTEVDVEVEOworCWVsc2UKKwkJKmR1cGxleCA9IEZEWF9DQVBBQkxFX0hBTEZfU0VMRUNURUQ7CisKKwlpZiAoc3RhdHVzICYgTUlJX1NUU0lDU19MSU5LU1RTKQorCQlwcmludGYoImljczE4OTNfcmVhZF9tb2RlOiBNZWRpYSBMaW5rIE9uICVzICVzLWR1cGxleCBcbiIsCisJCSAgICAgICAqc3BlZWQgPT0gSFdfU1BFRURfMTAwX01CUFMgPworCQkgICAgICAgIjEwMG1icHMiIDogIjEwbWJwcyIsCisJCSAgICAgICAqZHVwbGV4ID09IEZEWF9DQVBBQkxFX0ZVTExfU0VMRUNURUQgPworCQkgICAgICAgImZ1bGwiIDogImhhbGYiKTsKKwllbHNlCisJCXByaW50ZigiaWNzMTg5M19yZWFkX21vZGU6IE1lZGlhIExpbmsgT2ZmXG4iKTsKK30KKworLyoqCisgKglydGw4MjAxX3JlYWRfbW9kZTogLSByZWFkIG1lZGlhIG1vZGUgZm9yIHJ0bDgyMDEgcGh5CisgKglAbmljOiB0aGUgbmV0IGRldmljZSB0byByZWFkIG1vZGUgZm9yCisgKglAcGh5X2FkZHI6IG1paSBwaHkgYWRkcmVzcworICoJQHNwZWVkOiB0aGUgdHJhbnNtaXQgc3BlZWQgdG8gYmUgZGV0ZXJtaW5lZAorICoJQGR1cGxleDogdGhlIGR1cGxleCBtb2RlIHRvIGJlIGRldGVybWluZWQKKyAqCisgKglyZWFkIE1JSV9TVEFUVVMgcmVnaXN0ZXIgZnJvbSBydGw4MjAxIHBoeQorICoJdG8gZGV0ZXJtaW5lIHRoZSBzcGVlZCBhbmQgZHVwbGV4IG1vZGUgZm9yIHNpczkwMAorICovCisKK3N0YXRpYyB2b2lkIHJ0bDgyMDFfcmVhZF9tb2RlKHN0cnVjdCBuaWMgKm5pYywgaW50IHBoeV9hZGRyLCBpbnQgKnNwZWVkLCBpbnQgKmR1cGxleCkKK3sKKwl1MzIgc3RhdHVzOworCisJc3RhdHVzID0gc2lzOTAwX21kaW9fcmVhZChwaHlfYWRkciwgTUlJX1NUQVRVUyk7CisKKwlpZiAoc3RhdHVzICYgTUlJX1NUQVRfQ0FOX1RYX0ZEWCkgeworCQkqc3BlZWQgPSBIV19TUEVFRF8xMDBfTUJQUzsKKwkJKmR1cGxleCA9IEZEWF9DQVBBQkxFX0ZVTExfU0VMRUNURUQ7CisJfQorCWVsc2UgaWYgKHN0YXR1cyAmIE1JSV9TVEFUX0NBTl9UWCkgeworCQkqc3BlZWQgPSBIV19TUEVFRF8xMDBfTUJQUzsKKwkJKmR1cGxleCA9IEZEWF9DQVBBQkxFX0hBTEZfU0VMRUNURUQ7CisJfQorCWVsc2UgaWYgKHN0YXR1cyAmIE1JSV9TVEFUX0NBTl9UX0ZEWCkgeworCQkqc3BlZWQgPSBIV19TUEVFRF8xMF9NQlBTOworCQkqZHVwbGV4ID0gRkRYX0NBUEFCTEVfRlVMTF9TRUxFQ1RFRDsKKwl9CisJZWxzZSBpZiAoc3RhdHVzICYgTUlJX1NUQVRfQ0FOX1QpIHsKKwkJKnNwZWVkID0gSFdfU1BFRURfMTBfTUJQUzsKKwkJKmR1cGxleCA9IEZEWF9DQVBBQkxFX0hBTEZfU0VMRUNURUQ7CisJfQorCisJaWYgKHN0YXR1cyAmIE1JSV9TVEFUX0xJTkspCisJCXByaW50ZigicnRsODIwMV9yZWFkX21vZGU6IE1lZGlhIExpbmsgT24gJXMgJXMtZHVwbGV4IFxuIiwKKwkJICAgICAgICpzcGVlZCA9PSBIV19TUEVFRF8xMDBfTUJQUyA/CisJCSAgICAgICAiMTAwbWJwcyIgOiAiMTBtYnBzIiwKKwkJICAgICAgICpkdXBsZXggPT0gRkRYX0NBUEFCTEVfRlVMTF9TRUxFQ1RFRCA/CisJCSAgICAgICAiZnVsbCIgOiAiaGFsZiIpOworCWVsc2UKKwkJcHJpbnRmKCJydGw5MjAxX3JlYWRfY29uZmlnX21vZGU6IE1lZGlhIExpbmsgT2ZmXG4iKTsKK30KKworLyogRnVuY3Rpb246IHNpczkwMF90cmFuc21pdAorICoKKyAqIERlc2NyaXB0aW9uOiB0cmFuc21pdHMgYSBwYWNrZXQgYW5kIHdhaXRzIGZvciBjb21wbGV0aW9uIG9yIHRpbWVvdXQuCisgKgorICogQXJndW1lbnRzOiBjaGFyIGRbNl06ICAgICAgICAgIGRlc3RpbmF0aW9uIGV0aGVybmV0IGFkZHJlc3MuCisgKiAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHQ6ICAgZXRoZXJuZXQgcHJvdG9jb2wgdHlwZS4KKyAqICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgczogICBzaXplIG9mIHRoZSBkYXRhLXBhcnQgb2YgdGhlIHBhY2tldC4KKyAqICAgICAgICAgICAgY2hhciAqcDogICAgICAgICAgICB0aGUgZGF0YSBmb3IgdGhlIHBhY2tldC4KKyAqICAgIAorICogUmV0dXJuczogICB2b2lkLgorICovCisKK3N0YXRpYyB2b2lkCitzaXM5MDBfdHJhbnNtaXQoc3RydWN0IG5pYyAgKm5pYywKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqZCwgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHQsICAgICAvKiBUeXBlICovCisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHMsICAgICAvKiBzaXplICovCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKnApICAgICAvKiBQYWNrZXQgKi8KK3sKKyAgICB1MzIgc3RhdHVzLCB0bywgbnN0eXBlOworICAgIHUzMiB0eF9zdGF0dXM7CisgICAgCisgICAgLyogU3RvcCB0aGUgdHJhbnNtaXR0ZXIgKi8KKyAgICBvdXRsKFR4RElTLCBpb2FkZHIgKyBjcik7CisKKyAgICAvKiBsb2FkIFRyYW5zbWl0IERlc2NyaXB0b3IgUmVnaXN0ZXIgKi8KKyAgICBvdXRsKCh1MzIpICZ0eGQsIGlvYWRkciArIHR4ZHApOyAKKyAgICBpZiAoc2lzOTAwX2RlYnVnID4gMSkKKyAgICAgICAgcHJpbnRmKCJzaXM5MDBfdHJhbnNtaXQ6IFRYIGRlc2NyaXB0b3IgcmVnaXN0ZXIgbG9hZGVkIHdpdGg6ICVYXG4iLCAKKyAgICAgICAgICAgICAgIGlubChpb2FkZHIgKyB0eGRwKSk7CisKKyAgICBtZW1jcHkodHhiLCBkLCBFVEhfQUxFTik7CisgICAgbWVtY3B5KHR4YiArIEVUSF9BTEVOLCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4pOworICAgIG5zdHlwZSA9IGh0b25zKHQpOworICAgIG1lbWNweSh0eGIgKyAyICogRVRIX0FMRU4sIChjaGFyKikmbnN0eXBlLCAyKTsKKyAgICBtZW1jcHkodHhiICsgRVRIX0hMRU4sIHAsIHMpOworCisgICAgcyArPSBFVEhfSExFTjsKKyAgICBzICY9IERTSVpFOworCisgICAgaWYgKHNpczkwMF9kZWJ1ZyA+IDEpCisgICAgICAgIHByaW50Zigic2lzOTAwX3RyYW5zbWl0OiBzZW5kaW5nICVkIGJ5dGVzIGV0aHR5cGUgJWhYXG4iLCAoaW50KSBzLCB0KTsKKworICAgIC8qIHBhZCB0byBtaW5pbXVtIHBhY2tldCBzaXplICovCisgICAgd2hpbGUgKHMgPCBFVEhfWkxFTikgIAorICAgICAgICB0eGJbcysrXSA9ICdcMCc7CisKKyAgICAvKiBzZXQgdGhlIHRyYW5zbWl0IGJ1ZmZlciBkZXNjcmlwdG9yIGFuZCBlbmFibGUgVHJhbnNtaXQgU3RhdGUgTWFjaGluZSAqLworICAgIHR4ZC5idWZwdHIgPSAodTMyKSAmdHhiWzBdOworICAgIHR4ZC5jbWRzdHMgPSAodTMyKSBPV04gfCBzOworCisgICAgLyogcmVzdGFydCB0aGUgdHJhbnNtaXR0ZXIgKi8KKyAgICBvdXRsKFR4RU5BLCBpb2FkZHIgKyBjcik7CisKKyAgICBpZiAoc2lzOTAwX2RlYnVnID4gMSkKKyAgICAgICAgcHJpbnRmKCJzaXM5MDBfdHJhbnNtaXQ6IFF1ZXVlZCBUeCBwYWNrZXQgc2l6ZSAlZC5cbiIsIChpbnQpIHMpOworCisgICAgdG8gPSBjdXJydGlja3MoKSArIFRYX1RJTUVPVVQ7CisKKyAgICB3aGlsZSAoKCgodm9sYXRpbGUgdTMyKSB0eF9zdGF0dXM9dHhkLmNtZHN0cykgJiBPV04pICYmIChjdXJydGlja3MoKSA8IHRvKSkKKyAgICAgICAgLyogd2FpdCAqLyA7CisKKyAgICBpZiAoY3VycnRpY2tzKCkgPj0gdG8pIHsKKyAgICAgICAgcHJpbnRmKCJzaXM5MDBfdHJhbnNtaXQ6IFRYIFRpbWVvdXQhIFR4IHN0YXR1cyAlWC5cbiIsIHR4X3N0YXR1cyk7CisgICAgfQorICAgIAorICAgIGlmICh0eF9zdGF0dXMgJiAoQUJPUlQgfCBVTkRFUlJVTiB8IE9XQ09MTCkpIHsKKyAgICAgICAgLyogcGFja2V0IHVuc3VjY2Vzc2Z1bGx5IHRyYW5zbWl0ZWQgKi8KKyAgICAgICAgcHJpbnRmKCJzaXM5MDBfdHJhbnNtaXQ6IFRyYW5zbWl0IGVycm9yLCBUeCBzdGF0dXMgJVguXG4iLCB0eF9zdGF0dXMpOworICAgIH0KKyAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgYnkgY2xlYXJpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworICAgIG91dGwoMCwgaW9hZGRyICsgaW1yKTsKK30KKworDAorLyogRnVuY3Rpb246IHNpczkwMF9wb2xsCisgKgorICogRGVzY3JpcHRpb246IGNoZWNrcyBmb3IgYSByZWNlaXZlZCBwYWNrZXQgYW5kIHJldHVybnMgaXQgaWYgZm91bmQuCisgKgorICogQXJndW1lbnRzOiBzdHJ1Y3QgbmljICpuaWM6ICAgICAgICAgIE5JQyBkYXRhIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnM6ICAgMSBpZiBhIHBhY2tldCB3YXMgcmVjaWV2ZWQuCisgKiAgICAgICAgICAgIDAgaWYgbm8gcGFjZXQgd2FzIHJlY2lldmVkLgorICoKKyAqIFNpZGUgZWZmZWN0czoKKyAqICAgICAgICAgICAgUmV0dXJucyAoY29waWVzKSB0aGUgcGFja2V0IHRvIHRoZSBhcnJheSBuaWMtPnBhY2tldC4KKyAqICAgICAgICAgICAgUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgaW4gbmljLT5wYWNrZXRsZW4uCisgKi8KKworc3RhdGljIGludAorc2lzOTAwX3BvbGwoc3RydWN0IG5pYyAqbmljKQoreworICAgIHUzMiByeF9zdGF0dXMgPSByeGRbY3VyX3J4XS5jbWRzdHM7CisgICAgaW50IHJldHN0YXQgPSAwOworCisgICAgaWYgKHNpczkwMF9kZWJ1ZyA+IDIpCisgICAgICAgIHByaW50Zigic2lzOTAwX3BvbGw6IGN1cl9yeDolZCwgc3RhdHVzOiVYXG4iLCBjdXJfcngsIHJ4X3N0YXR1cyk7CisKKyAgICBpZiAoIShyeF9zdGF0dXMgJiBPV04pKQorICAgICAgICByZXR1cm4gcmV0c3RhdDsKKworICAgIGlmIChzaXM5MDBfZGVidWcgPiAxKQorICAgICAgICBwcmludGYoInNpczkwMF9wb2xsOiBnb3QgYSBwYWNrZXQ6IGN1cl9yeDolZCwgc3RhdHVzOiVYXG4iLAorICAgICAgICAgICAgICAgY3VyX3J4LCByeF9zdGF0dXMpOworCisgICAgbmljLT5wYWNrZXRsZW4gPSAocnhfc3RhdHVzICYgRFNJWkUpIC0gQ1JDX1NJWkU7CisKKyAgICBpZiAocnhfc3RhdHVzICYgKEFCT1JUfE9WRVJSVU58VE9PTE9OR3xSVU5UfFJYSVNFUlJ8Q1JDRVJSfEZBRVJSKSkgeworICAgICAgICAvKiBjb3JydXB0ZWQgcGFja2V0IHJlY2VpdmVkICovCisgICAgICAgIHByaW50Zigic2lzOTAwX3BvbGw6IENvcnJ1cHRlZCBwYWNrZXQgcmVjZWl2ZWQsIGJ1ZmZlciBzdGF0dXMgPSAlWFxuIiwKKyAgICAgICAgICAgICAgIHJ4X3N0YXR1cyk7CisgICAgICAgIHJldHN0YXQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGdpdmUgcGFja2V0IHRvIGhpZ2hlciBsZXZlbCByb3V0aW5lICovCisgICAgICAgIG1lbWNweShuaWMtPnBhY2tldCwgKHJ4YiArIGN1cl9yeCpSWF9CVUZfU0laRSksIG5pYy0+cGFja2V0bGVuKTsKKyAgICAgICAgcmV0c3RhdCA9IDE7CisgICAgfQorCisgICAgLyogcmV0dXJuIHRoZSBkZXNjcmlwdG9yIGFuZCBidWZmZXIgdG8gcmVjZWl2ZSByaW5nICovCisgICAgcnhkW2N1cl9yeF0uY21kc3RzID0gUlhfQlVGX1NJWkU7CisgICAgcnhkW2N1cl9yeF0uYnVmcHRyID0gKHUzMikgJnJ4YltjdXJfcngqUlhfQlVGX1NJWkVdOworICAgICAgICAKKyAgICBpZiAoKytjdXJfcnggPT0gTlVNX1JYX0RFU0MpCisgICAgICAgIGN1cl9yeCA9IDA7CisKKyAgICAvKiByZS1lbmFibGUgdGhlIHBvdGVudGlhbGx5IGlkbGUgcmVjZWl2ZSBzdGF0ZSBtYWNoaW5lICovCisgICAgb3V0bChSeEVOQSAsIGlvYWRkciArIGNyKTsKKworICAgIHJldHVybiByZXRzdGF0OworfQorCisMCisvKiBGdW5jdGlvbjogc2lzOTAwX2Rpc2FibGUKKyAqCisgKiBEZXNjcmlwdGlvbjogVHVybnMgb2ZmIGludGVycnVwdHMgYW5kIHN0b3BzIFR4IGFuZCBSeCBlbmdpbmVzCisgKiAgICAKKyAqIEFyZ3VtZW50czogc3RydWN0IG5pYyAqbmljOiAgICAgICAgICBOSUMgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zOiAgIHZvaWQuCisgKi8KKworc3RhdGljIHZvaWQKK3NpczkwMF9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYykKK3sKKyAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgYnkgY2xlYXJpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworICAgIG91dGwoMCwgaW9hZGRyICsgaW1yKTsKKyAgICBvdXRsKDAsIGlvYWRkciArIGllcik7CisgICAgCisgICAgLyogU3RvcCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBTdGF0dXMgTWFjaGluZSAqLworICAgIG91dGwoUnhESVMgfCBUeERJUywgaW9hZGRyICsgY3IpOworfQpkaWZmIC0tZ2l0IGEvbmV0Ym9vdC9zaXM5MDAuaCBiL25ldGJvb3Qvc2lzOTAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRmZWFmYgotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3Qvc2lzOTAwLmgKQEAgLTAsMCArMSwzNjMgQEAKKy8qIC0qLSBNb2RlOkM7IGMtYmFzaWMtb2Zmc2V0OjQ7IC0qLSAqLworCisvKiBEZWZpbml0aW9ucyBmb3IgU2lTIGV0aGVybmV0IGNvbnRyb2xsZXJzIGluY2x1ZGluZyA3MDE0LzcwMTYgYW5kIDkwMCAKKyAqIFJlZmVyZW5jZXM6CisgKiAgIFNpUyA3MDE2IEZhc3QgRXRoZXJuZXQgUENJIEJ1cyAxMC8xMDAgTWJwcyBMQU4gQ29udHJvbGxlciB3aXRoIE9uTm93IFN1cHBvcnQsCisgKiAgICAgIHByZWxpbWluYXJ5IFJldi4gMS4wIEphbi4gMTQsIDE5OTgKKyAqICAgU2lTIDkwMCBGYXN0IEV0aGVybmV0IFBDSSBCdXMgMTAvMTAwIE1icHMgTEFOIFNpbmdsZSBDaGlwIHdpdGggT25Ob3cgU3VwcG9ydCwKKyAqICAgICAgcHJlbGltaW5hcnkgUmV2LiAxLjAgTm92LiAxMCwgMTk5OAorICogICBTaVMgNzAxNCBTaW5nbGUgQ2hpcCAxMDBCQVNFLVRYLzEwQkFTRS1UIFBoeXNpY2FsIExheWVyIFNvbHV0aW9uLAorICogICAgICBwcmVsaW1pbmFyeSBSZXYuIDEuMCBKYW4uIDE4LCAxOTk4CisgKiAgIGh0dHA6Ly93d3cuc2lzLmNvbS50dy9zdXBwb3J0L2RhdGFib29rLmh0bQorICovCisKKy8qIE1BQyBvcGVyYXRpb25sIHJlZ2lzdGVycyBvZiBTaVMgNzAxNiBhbmQgU2lTIDkwMCBldGhlcm5ldCBjb250cm9sbGVyICovCisvKiBUaGUgSS9PIGV4dGVudCwgU2lTIDkwMCBuZWVkcyAyNTYgYnl0ZXMgb2YgaW8gYWRkcmVzcyAqLworI2RlZmluZSBTSVM5MDBfVE9UQUxfU0laRSAweDEwMAorCisvKiBTeW1ib2xpYyBvZmZzZXRzIHRvIHJlZ2lzdGVycy4gKi8KK2VudW0gc2lzOTAwX3JlZ2lzdGVycyB7CisgICAgY3I9MHgwLCAgICAgICAgICAgICAgICAgLyogQ29tbWFuZCBSZWdpc3RlciAqLworICAgIGNmZz0weDQsICAgICAgICAgICAgICAgIC8qIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyAgICBtZWFyPTB4OCwgICAgICAgICAgICAgICAvKiBFRVBST00gQWNjZXNzIFJlZ2lzdGVyICovCisgICAgcHRzY3I9MHhjLCAgICAgICAgICAgICAgLyogUENJIFRlc3QgQ29udHJvbCBSZWdpc3RlciAqLworICAgIGlzcj0weDEwLCAgICAgICAgICAgICAgIC8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyAgICBpbXI9MHgxNCwgICAgICAgICAgICAgICAvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworICAgIGllcj0weDE4LCAgICAgICAgICAgICAgIC8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyAgICBlcGFyPTB4MTgsICAgICAgICAgICAgICAvKiBFbmhhbmNlZCBQSFkgQWNjZXNzIFJlZ2lzdGVyICovCisgICAgdHhkcD0weDIwLCAgICAgICAgICAgICAgLyogVHJhbnNtaXQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisgICAgdHhjZmc9MHgyNCwgICAgICAgICAgICAgLyogVHJhbnNtaXQgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworICAgIHJ4ZHA9MHgzMCwgICAgICAgICAgICAgIC8qIFJlY2VpdmUgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisgICAgcnhjZmc9MHgzNCwgICAgICAgICAgICAgLyogUmVjZWl2ZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisgICAgZmxjdHJsPTB4MzgsICAgICAgICAgICAgLyogRmxvdyBDb250cm9sIFJlZ2lzdGVyICovCisgICAgcnhsZW49MHgzYywgICAgICAgICAgICAgLyogUmVjZWl2ZSBQYWNrZXQgTGVuZ3RoIFJlZ2lzdGVyICovCisgICAgcmZjcj0weDQ4LCAgICAgICAgICAgICAgLyogUmVjZWl2ZSBGaWx0ZXIgQ29udHJvbCBSZWdpc3RlciAqLworICAgIHJmZHI9MHg0QywgICAgICAgICAgICAgIC8qIFJlY2VpdmUgRmlsdGVyIERhdGEgUmVnaXN0ZXIgKi8KKyAgICBwbWN0cmw9MHhCMCwgICAgICAgICAgICAvKiBQb3dlciBNYW5hZ2VtZW50IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgICBwbWVyPTB4QjQgICAgICAgICAgICAgICAvKiBQb3dlciBNYW5hZ2VtZW50IFdha2UtdXAgRXZlbnQgUmVnaXN0ZXIgKi8KK307CisKKy8qIFN5bWJvbGljIG5hbWVzIGZvciBiaXRzIGluIHZhcmlvdXMgcmVnaXN0ZXJzICovCitlbnVtIHNpczkwMF9jb21tYW5kX3JlZ2lzdGVyX2JpdHMgeworICAgIFJFU0VUICAgPSAweDAwMDAwMTAwLCAKKyAgICBTV0kgICAgID0gMHgwMDAwMDA4MCwgCisgICAgUnhSRVNFVCA9IDB4MDAwMDAwMjAsCisgICAgVHhSRVNFVCA9IDB4MDAwMDAwMTAsIAorICAgIFJ4RElTICAgPSAweDAwMDAwMDA4LCAKKyAgICBSeEVOQSAgID0gMHgwMDAwMDAwNCwKKyAgICBUeERJUyAgID0gMHgwMDAwMDAwMiwgCisgICAgVHhFTkEgICA9IDB4MDAwMDAwMDEKK307CisKK2VudW0gc2lzOTAwX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXJfYml0cyB7CisgICAgREVTQ1JGTVQgPSAweDAwMDAwMTAwLCAvKiA3MDE2IHNwZWNpZmljICovCisgICAgUkVRQUxHICAgPSAweDAwMDAwMDgwLCAKKyAgICBTQiAgICAgICA9IDB4MDAwMDAwNDAsIAorICAgIFBPVyAgICAgID0gMHgwMDAwMDAyMCwgCisgICAgRVhEICAgICAgPSAweDAwMDAwMDEwLCAKKyAgICBQRVNFTCAgICA9IDB4MDAwMDAwMDgsIAorICAgIExQTSAgICAgID0gMHgwMDAwMDAwNCwgCisgICAgQkVNICAgICAgPSAweDAwMDAwMDAxCit9OworCitlbnVtIHNpczkwMF9lZXByb21fYWNjZXNzX3JlaWdzdGVyX2JpdHMgeworICAgIE1EQyAgID0gMHgwMDAwMDA0MCwgCisgICAgTURESVIgPSAweDAwMDAwMDIwLCAKKyAgICBNRElPICA9IDB4MDAwMDAwMTAsIC8qIDcwMTYgc3BlY2lmaWMgKi8gCisgICAgRUVDUyAgPSAweDAwMDAwMDA4LCAKKyAgICBFRUNMSyA9IDB4MDAwMDAwMDQsIAorICAgIEVFRE8gID0gMHgwMDAwMDAwMiwKKyAgICBFRURJICA9IDB4MDAwMDAwMDEKK307CisKK2VudW0gc2lzOTAwX2ludGVycnVwdF9yZWdpc3Rlcl9iaXRzIHsKKyAgICBXS0VWVCAgICAgID0gMHgxMDAwMDAwMCwgCisgICAgVHhQQVVTRUVORCA9IDB4MDgwMDAwMDAsCisgICAgVHhQQVVTRSAgICA9IDB4MDQwMDAwMDAsCisgICAgVHhSQ01QICAgICA9IDB4MDIwMDAwMDAsCisgICAgUnhSQ01QICAgICA9IDB4MDEwMDAwMDAsCisgICAgRFBFUlIgICAgICA9IDB4MDA4MDAwMDAsCisgICAgU1NFUlIgICAgICA9IDB4MDA0MDAwMDAsCisgICAgUk1BQlQgICAgICA9IDB4MDAyMDAwMDAsCisgICAgUlRBQlQgICAgICA9IDB4MDAxMDAwMDAsCisgICAgUnhTT1ZSICAgICA9IDB4MDAwMTAwMDAsIAorICAgIEhJQkVSUiAgICAgPSAweDAwMDA4MDAwLCAKKyAgICBTV0lOVCAgICAgID0gMHgwMDAwMTAwMCwKKyAgICBNSUJJTlQgICAgID0gMHgwMDAwMDgwMCwgCisgICAgVHhVUk4gICAgICA9IDB4MDAwMDA0MDAsCisgICAgVHhJRExFICAgICA9IDB4MDAwMDAyMDAsCisgICAgVHhFUlIgICAgICA9IDB4MDAwMDAxMDAsCisgICAgVHhERVNDICAgICA9IDB4MDAwMDAwODAsCisgICAgVHhPSyAgICAgICA9IDB4MDAwMDAwNDAsCisgICAgUnhPUk4gICAgICA9IDB4MDAwMDAwMjAsIAorICAgIFJ4SURMRSAgICAgPSAweDAwMDAwMDEwLAorICAgIFJ4RUFSTFkgICAgPSAweDAwMDAwMDA4LAorICAgIFJ4RVJSICAgICAgPSAweDAwMDAwMDA0LAorICAgIFJ4REVTQyAgICAgPSAweDAwMDAwMDAyLAorICAgIFJ4T0sgICAgICAgPSAweDAwMDAwMDAxCit9OworCitlbnVtIHNpczkwMF9pbnRlcnJ1cHRfZW5hYmxlX3JlaWdzdGVyX2JpdHMgeworICAgIElFID0gMHgwMDAwMDAwMQorfTsKKworLyogbWF4aW11bSBkbWEgYnVyc3QgZnJvIHRyYW5zbWlzc2lvbiBhbmQgcmVjZWl2ZSovCisjZGVmaW5lIE1BWF9ETUFfUkFOR0UgICA3ICAgICAgIC8qIGFjdHVhbGx5IDAgbWVhbnMgTUFYSU1VTSAhISAqLworI2RlZmluZSBUeE1YRE1BX3NoaWZ0ICAgMjAKKyNkZWZpbmUgUnhNWERNQV9zaGlmdCAgIDIwCisjZGVmaW5lIFRYX0RNQV9CVVJTVCAgICAwCisjZGVmaW5lIFJYX0RNQV9CVVJTVCAgICAwCisKKy8qIHRyYW5zbWl0IEZJRk8gdGhyZXNoaG9sZHMgKi8KKyNkZWZpbmUgVFhfRklMTF9USFJFU0ggIDE2ICAgICAgLyogMS80IEZJRk8gc2l6ZSAqLworI2RlZmluZSBUeEZJTExUX3NoaWZ0ICAgOAorI2RlZmluZSBUeERSTlRfc2hpZnQgICAgMAorI2RlZmluZSBUeERSTlRfMTAwICAgICAgNDggICAgICAvKiAzLzQgRklGTyBzaXplICovCisjZGVmaW5lIFR4RFJOVF8xMCAgICAgICAxNiAgICAgIC8qIDEvMiBGSUZPIHNpemUgKi8KKworZW51bSBzaXM5MDBfdHJhbnNtaXRfY29uZmlnX3JlZ2lzdGVyX2JpdHMgeworICAgIFR4Q1NJICAgPSAweDgwMDAwMDAwLAorICAgIFR4SEJJICAgPSAweDQwMDAwMDAwLAorICAgIFR4TUxCICAgPSAweDIwMDAwMDAwLAorICAgIFR4QVRQICAgPSAweDEwMDAwMDAwLAorICAgIFR4SUZHICAgPSAweDBDMDAwMDAwLAorICAgIFR4RklMTFQgPSAweDAwMDAzRjAwLAorICAgIFR4RFJOVCAgPSAweDAwMDAwMDNGCit9OworCisvKiByZWNldmllIEZJRk8gdGhyZXNob2xkcyAqLworI2RlZmluZSBSeERSTlRfc2hpZnQgICAgIDEKKyNkZWZpbmUgUnhEUk5UXzEwMCAgICAgIDE2ICAgICAgLyogMS8yIEZJRk8gc2l6ZSAqLworI2RlZmluZSBSeERSTlRfMTAgICAgICAgMjQgICAgICAvKiAzLzQgRklGTyBzaXplICovCisKK2VudW0gc2lzOTAwX3JldmVpdmVfY29uZmlnX3JlZ2lzdGVyX2JpdHMgeworICAgIFJ4QUVQICA9IDB4ODAwMDAwMDAsIAorICAgIFJ4QVJQICA9IDB4NDAwMDAwMDAsIAorICAgIFJ4QVRYICA9IDB4MTAwMDAwMDAsCisgICAgUnhBSkFCID0gMHgwODAwMDAwMCwgCisgICAgUnhEUk5UID0gMHgwMDAwMDA3RgorfTsKKworI2RlZmluZSBSRkFBX3NoaWZ0ICAgICAgMjgKKyNkZWZpbmUgUkZBRERSX3NoaWZ0ICAgIDE2CisKK2VudW0gc2lzOTAwX3JlY2VpdmVfZmlsdGVyX2NvbnRyb2xfcmVnaXN0ZXJfYml0cyB7CisgICAgUkZFTiAgPSAweDgwMDAwMDAwLCAKKyAgICBSRkFBQiA9IDB4NDAwMDAwMDAsIAorICAgIFJGQUFNID0gMHgyMDAwMDAwMCwKKyAgICBSRkFBUCA9IDB4MTAwMDAwMDAsIAorICAgIFJGUHJvbWlzY3VvdXMgPSAoUkZBQUJ8UkZBQU18UkZBQVApCit9OworCitlbnVtIHNpczkwMF9yZXZlaXZlX2ZpbHRlcl9kYXRhX21hc2sgeworICAgIFJGREFUID0gIDB4MDAwMEZGRkYKK307CisKKy8qIEVFUFJPTSBBZGRyZXNzZXMgKi8KK2VudW0gc2lzOTAwX2VlcHJvbV9hZGRyZXNzIHsKKyAgICBFRVBST01TaWduYXR1cmUgPSAweDAwLCAKKyAgICBFRVBST01WZW5kb3JJRCAgPSAweDAyLCAKKyAgICBFRVBST01EZXZpY2VJRCAgPSAweDAzLAorICAgIEVFUFJPTU1BQ0FkZHIgICA9IDB4MDgsIAorICAgIEVFUFJPTUNoZWNrc3VtICA9IDB4MGIKK307CisKKy8qIFRoZSBFRVBST00gY29tbWFuZHMgaW5jbHVkZSB0aGUgYWx3YXktc2V0IGxlYWRpbmcgYml0LiBSZWZlciB0byBOTTkzQ3h4IGRhdGFzaGVldCAqLworZW51bSBzaXM5MDBfZWVwcm9tX2NvbW1hbmQgeworICAgIEVFcmVhZCAgICAgICAgICA9IDB4MDE4MCwgCisgICAgRUV3cml0ZSAgICAgICAgID0gMHgwMTQwLCAKKyAgICBFRWVyYXNlICAgICAgICAgPSAweDAxQzAsIAorICAgIEVFd3JpdGVFbmFibGUgICA9IDB4MDEzMCwKKyAgICBFRXdyaXRlRGlzYWJsZSAgPSAweDAxMDAsCisgICAgRUVlcmFzZUFsbCAgICAgID0gMHgwMTIwLAorICAgIEVFd3JpdGVBbGwgICAgICA9IDB4MDExMCwgCisgICAgRUVhZGRyTWFzayAgICAgID0gMHgwMTNGLCAKK307CisKKy8qIE1hbmFtZ2VtZW50IERhdGEgSS9PIChtZGlvKSBmcmFtZSAqLworI2RlZmluZSBNSUlyZWFkICAgICAgICAgMHg2MDAwCisjZGVmaW5lIE1JSXdyaXRlICAgICAgICAweDUwMDIKKyNkZWZpbmUgTUlJcG1kU2hpZnQgICAgIDcKKyNkZWZpbmUgTUlJcmVnU2hpZnQgICAgIDIKKyNkZWZpbmUgTUlJY21kTGVuICAgICAgIDE2CisjZGVmaW5lIE1JSWNtZFNoaWZ0ICAgICAxNgorCisvKiBCdWZmZXIgRGVzY3JpcHRvciBTdGF0dXMqLworZW51bSBzaXM5MDBfYnVmZmVyX3N0YXR1cyB7CisgICAgT1dOICAgID0gMHg4MDAwMDAwMCwgCisgICAgTU9SRSAgID0gMHg0MDAwMDAwMCwgCisgICAgSU5UUiAgID0gMHgyMDAwMDAwMCwKKyAgICBTVVBDUkMgPSAweDEwMDAwMDAwLCAKKyAgICBJTkNDUkMgPSAweDEwMDAwMDAwLAorICAgIE9LICAgICA9IDB4MDgwMDAwMDAsIAorICAgIERTSVpFICA9IDB4MDAwMDBGRkYKK307CisKKy8qIFN0YXR1cyBmb3IgVFggQnVmZmVycyAqLworZW51bSBzaXM5MDBfdHhfYnVmZmVyX3N0YXR1cyB7CisgICAgQUJPUlQgICAgICA9IDB4MDQwMDAwMDAsCisgICAgVU5ERVJSVU4gICA9IDB4MDIwMDAwMDAsIAorICAgIE5PQ0FSUklFUiAgPSAweDAxMDAwMDAwLAorICAgIERFRkVSRCAgICAgPSAweDAwODAwMDAwLCAKKyAgICBFWENERUZFUiAgID0gMHgwMDQwMDAwMCwgCisgICAgT1dDT0xMICAgICA9IDB4MDAyMDAwMDAsCisgICAgRVhDQ09MTCAgICA9IDB4MDAxMDAwMDAsIAorICAgIENPTENOVCAgICAgPSAweDAwMEYwMDAwCit9OworCitlbnVtIHNpczkwMF9yeF9idWZlcl9zdGF0dXMgeworICAgIE9WRVJSVU4gICAgPSAweDAyMDAwMDAwLAorICAgIERFU1QgICAgICAgPSAweDAwODAwMDAwLAorICAgIEJDQVNUICAgICAgPSAweDAxODAwMDAwLAorICAgIE1DQVNUICAgICAgPSAweDAxMDAwMDAwLAorICAgIFVOSU1BVENIICAgPSAweDAwODAwMDAwLAorICAgIFRPT0xPTkcgICAgPSAweDAwNDAwMDAwLAorICAgIFJVTlQgICAgICAgPSAweDAwMjAwMDAwLAorICAgIFJYSVNFUlIgICAgPSAweDAwMTAwMDAwLAorICAgIENSQ0VSUiAgICAgPSAweDAwMDgwMDAwLAorICAgIEZBRVJSICAgICAgPSAweDAwMDQwMDAwLAorICAgIExPT1BCSyAgICAgPSAweDAwMDIwMDAwLAorICAgIFJYQ09MICAgICAgPSAweDAwMDEwMDAwCit9OworCisvKiBNSUkgcmVnaXN0ZXIgb2Zmc2V0cyAqLworZW51bSBtaWlfcmVnaXN0ZXJzIHsKKyAgICBNSUlfQ09OVFJPTCA9IDB4MDAwMCwgCisgICAgTUlJX1NUQVRVUyAgPSAweDAwMDEsCisgICAgTUlJX1BIWV9JRDAgPSAweDAwMDIsCisgICAgTUlJX1BIWV9JRDEgPSAweDAwMDMsCisgICAgTUlJX0FOQURWICAgPSAweDAwMDQsCisgICAgTUlJX0FOTFBBUiAgPSAweDAwMDUsCisgICAgTUlJX0FORVhUICAgPSAweDAwMDYKK307CisKKy8qIG1paSByZWdpc3RlcnMgc3BlY2lmaWMgdG8gU2lTIDkwMCAqLworZW51bSBzaXNfbWlpX3JlZ2lzdGVycyB7CisgICAgTUlJX0NPTkZJRzEgPSAweDAwMTAsCisgICAgTUlJX0NPTkZJRzIgPSAweDAwMTEsCisgICAgTUlJX1NUU09VVCAgPSAweDAwMTIsCisgICAgTUlJX01BU0sgICAgPSAweDAwMTMKK307CisKKy8qIG1paSByZWdpc3RlcnMgc3BlY2lmaWMgdG8gQU1EIDc5QzkwMSAqLworZW51bSBhbWRfbWlpX3JlZ2lzdGVycyB7CisgICAgTUlJX1NUQVRVU19TVU1NQVJZID0gMHgwMDE4Cit9OworCisvKiBtaWkgcmVnaXN0ZXJzIHNwZWNpZmljIHRvIElDUyAxODkzICovCitlbnVtIGljc19taWlfcmVnaXN0ZXJzIHsKKwlNSUlfRVhUQ1RSTCAgPSAweDAwMTAsIE1JSV9RUERTVFMgPSAweDAwMTEsIE1JSV8xMEJUT1AgPSAweDAwMTIsCisJTUlJX0VYVENUUkwyID0gMHgwMDEzCit9OworCisKKworLyogTUlJIENvbnRyb2wgcmVnaXN0ZXIgYml0IGRlZmluaXRpb25zLiAqLworZW51bSBtaWlfY29udHJvbF9yZWdpc3Rlcl9iaXRzIHsKKyAgICBNSUlfQ05UTF9GRFggICAgICA9IDB4MDEwMCwKKyAgICBNSUlfQ05UTF9SU1RfQVVUTyA9IDB4MDIwMCwgCisgICAgTUlJX0NOVExfSVNPTEFURSAgPSAweDA0MDAsCisgICAgTUlJX0NOVExfUFdSRFdOICAgPSAweDA4MDAsCisgICAgTUlJX0NOVExfQVVUTyAgICAgPSAweDEwMDAsCisgICAgTUlJX0NOVExfU1BFRUQgICAgPSAweDIwMDAsCisgICAgTUlJX0NOVExfTFBCSyAgICAgPSAweDQwMDAsCisgICAgTUlJX0NOVExfUkVTRVQgICAgPSAweDgwMDAKK307CisKKy8qIE1JSSBTdGF0dXMgcmVnaXN0ZXIgYml0ICAqLworZW51bSBtaWlfc3RhdHVzX3JlZ2lzdGVyX2JpdHMgeworICAgIE1JSV9TVEFUX0VYVCAgICAgICAgPSAweDAwMDEsCisgICAgTUlJX1NUQVRfSkFCICAgICAgICA9IDB4MDAwMiwgCisgICAgTUlJX1NUQVRfTElOSyAgICAgICA9IDB4MDAwNCwKKyAgICBNSUlfU1RBVF9DQU5fQVVUTyAgID0gMHgwMDA4LCAKKyAgICBNSUlfU1RBVF9GQVVMVCAgICAgID0gMHgwMDEwLAorICAgIE1JSV9TVEFUX0FVVE9fRE9ORSAgPSAweDAwMjAsCisgICAgTUlJX1NUQVRfQ0FOX1QgICAgICA9IDB4MDgwMCwgCisgICAgTUlJX1NUQVRfQ0FOX1RfRkRYICA9IDB4MTAwMCwKKyAgICBNSUlfU1RBVF9DQU5fVFggICAgID0gMHgyMDAwLCAKKyAgICBNSUlfU1RBVF9DQU5fVFhfRkRYID0gMHg0MDAwLAorICAgIE1JSV9TVEFUX0NBTl9UNCAgICAgPSAweDgwMDAKK307CisKKyNkZWZpbmUgICAgICAgICBNSUlfSUQxX09VSV9MTyAgICAgICAgICAweEZDMDAgIC8qIGxvdyBiaXRzIG9mIE9VSSBtYXNrICovCisjZGVmaW5lICAgICAgICAgTUlJX0lEMV9NT0RFTCAgICAgICAgICAgMHgwM0YwICAvKiBtb2RlbCBudW1iZXIgKi8KKyNkZWZpbmUgICAgICAgICBNSUlfSUQxX1JFViAgICAgICAgICAgICAweDAwMEYgIC8qIG1vZGVsIG51bWJlciAqLworCisvKiBNSUkgTldBWSBSZWdpc3RlciBCaXRzIC4uLgorICAgdmFsaWQgZm9yIHRoZSBBTkFSIChBdXRvLU5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQpIGFuZAorICAgQU5MUEFSIChBdXRvLU5lZ290aWF0aW9uIExpbmsgUGFydG5lcikgcmVnaXN0ZXJzICovCitlbnVtIG1paV9ud2F5X3JlZ2lzdGVyX2JpdHMgeworICAgIE1JSV9OV0FZX05PREVfU0VMID0gMHgwMDFmLAorICAgIE1JSV9OV0FZX0NTTUFfQ0QgID0gMHgwMDAxLAorICAgIE1JSV9OV0FZX1QgICAgICAgID0gMHgwMDIwLAorICAgIE1JSV9OV0FZX1RfRkRYICAgID0gMHgwMDQwLAorICAgIE1JSV9OV0FZX1RYICAgICAgID0gMHgwMDgwLAorICAgIE1JSV9OV0FZX1RYX0ZEWCAgID0gMHgwMTAwLAorICAgIE1JSV9OV0FZX1Q0ICAgICAgID0gMHgwMjAwLAorICAgIE1JSV9OV0FZX1BBVVNFICAgID0gMHgwNDAwLAorICAgIE1JSV9OV0FZX1JGICAgICAgID0gMHgyMDAwLAorICAgIE1JSV9OV0FZX0FDSyAgICAgID0gMHg0MDAwLAorICAgIE1JSV9OV0FZX05QICAgICAgID0gMHg4MDAwCit9OworCitlbnVtIG1paV9zdHNvdXRfcmVnaXN0ZXJfYml0cyB7CisgICAgTUlJX1NUU09VVF9MSU5LX0ZBSUwgPSAweDQwMDAsCisgICAgTUlJX1NUU09VVF9TUEQgICAgICAgPSAweDAwODAsCisgICAgTUlJX1NUU09VVF9EUExYICAgICAgPSAweDAwNDAKK307CisKK2VudW0gbWlpX3N0c2ljc19yZWdpc3Rlcl9iaXRzIHsKKwlNSUlfU1RTSUNTX1NQRCAgPSAweDgwMDAsIE1JSV9TVFNJQ1NfRFBMWCA9IDB4NDAwMCwKKwlNSUlfU1RTSUNTX0xJTktTVFMgPSAweDAwMDEKK307CisKK2VudW0gbWlpX3N0c3N1bV9yZWdpc3Rlcl9iaXRzIHsKKyAgICBNSUlfU1RTU1VNX0xJTksgPSAweDAwMDgsCisgICAgTUlJX1NUU1NVTV9EUExYID0gMHgwMDA0LAorICAgIE1JSV9TVFNTVU1fQVVUTyA9IDB4MDAwMiwKKyAgICBNSUlfU1RTU1VNX1NQRCAgPSAweDAwMDEKK307CisKK2VudW0gc2lzOTAwX3JldmlzaW9uX2lkIHsKKwlTSVM2MzBBXzkwMF9SRVYgPSAweDgwLAkJU0lTNjMwRV85MDBfUkVWID0gMHg4MSwKKwlTSVM2MzBTXzkwMF9SRVYgPSAweDgyLAkJU0lTNjMwRUExXzkwMF9SRVYgPSAweDgzCit9OworCitlbnVtIHNpczYzMF9yZXZpc2lvbl9pZCB7CisJU0lTNjMwQTAgICAgPSAweDAwLCBTSVM2MzBBMSAgICAgID0gMHgwMSwKKwlTSVM2MzBCMCAgICA9IDB4MTAsIFNJUzYzMEIxICAgICAgPSAweDExCit9OworCisjZGVmaW5lIEZEWF9DQVBBQkxFX0RVUExFWF9VTktOT1dOICAgICAgMAorI2RlZmluZSBGRFhfQ0FQQUJMRV9IQUxGX1NFTEVDVEVEICAgICAgIDEKKyNkZWZpbmUgRkRYX0NBUEFCTEVfRlVMTF9TRUxFQ1RFRCAgICAgICAyCisKKyNkZWZpbmUgSFdfU1BFRURfVU5DT05GSUcgICAgICAgICAgICAgICAwCisjZGVmaW5lIEhXX1NQRUVEX0hPTUUgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBIV19TUEVFRF8xMF9NQlBTICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIEhXX1NQRUVEXzEwMF9NQlBTICAgICAgICAgICAgICAgMTAwCisjZGVmaW5lIEhXX1NQRUVEX0RFRkFVTFQgICAgICAgICAgICAgICAgKEhXX1NQRUVEXzEwMF9NQlBTKQorCisjZGVmaW5lIENSQ19TSVpFICAgICAgICA0CisjZGVmaW5lIE1BQ19IRUFERVJfU0laRSAxNAorCisjZGVmaW5lIFRYX0JVRl9TSVpFICAgICAxNTM2CisjZGVmaW5lIFJYX0JVRl9TSVpFICAgICAxNTM2CisKKyNkZWZpbmUgTlVNX1JYX0RFU0MgICAgIDQgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBSeCBkZXNjcmlwdG9yIHJlZ2lzdGVycy4gKi8KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICB1ODsKK3R5cGVkZWYgICBzaWduZWQgY2hhciAgczg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHUxNjsKK3R5cGVkZWYgICBzaWduZWQgc2hvcnQgczE2OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICB1MzI7Cit0eXBlZGVmICAgc2lnbmVkIGludCAgIHMzMjsKKworLyogVGltZSBpbiB0aWNrcyBiZWZvcmUgY29uY2x1ZGluZyB0aGUgdHJhbnNtaXR0ZXIgaXMgaHVuZy4gKi8KKyNkZWZpbmUgVFhfVElNRU9VVCAgICAgICAoNCpUSUNLU19QRVJfU0VDKQorCit0eXBlZGVmIHN0cnVjdCBfQnVmZmVyRGVzYyB7CisgICAgdTMyICAgICAgICAgICAgICBsaW5rOworICAgIHZvbGF0aWxlIHUzMiAgICAgY21kc3RzOworICAgIHUzMiAgICAgICAgICAgICAgYnVmcHRyOworfSBCdWZmZXJEZXNjOwpkaWZmIC0tZ2l0IGEvbmV0Ym9vdC9zaXM5MDAudHh0IGIvbmV0Ym9vdC9zaXM5MDAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NDE5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L3NpczkwMC50eHQKQEAgLTAsMCArMSw5MSBAQAorSG93IEkgYWRkZWQgdGhlIFNJUzkwMCBjYXJkIHRvIEV0aGVyYm9vdAorCitBdXRob3I6IE1hcnR5IENvbm5vciAobWRjQHRoaW5ndWluLm9yZykKKworRGF0ZTogICAyNSBGZWJyYXJ5IDIwMDEKKworRGVzY3JpcHRpb246CisKK1RoaXMgZmlsZSBpcyBpbnRlbmRlZCB0byBoZWxwIHBlb3BsZSB3aG8gd2FudCB0byB3cml0ZSBhbiBFdGhlcmJvb3QKK2RyaXZlciBvciBwb3J0IGFub3RoZXIgZHJpdmVyIHRvIEV0aGVyYm9vdC4gIEl0IGlzIGEgc3RhcnRpbmcgcG9pbnQuCitQZXJoYXBzIHNvbWVkYXkgSSBtYXkgd3JpdGUgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHdyaXRpbmcgYW4KK0V0aGVyYm9vdCBkcml2ZXIuIFRoaXMgdGV4dCBzaG91bGQgaGVscCBnZXQgcGVvcGxlIHN0YXJ0ZWQsIGFuZAorc3R1ZHlpbmcgc2lzOTAwLltjaF0gc2hvdWxkIGhlbHAgc2hvdyB0aGUgYmFzaWMgc3RydWN0dXJlIGFuZAordGVjaG5pcXVlcyBpbnZvbHZlZCBpbiB3cml0aW5nIGFuZCBFdGhlcmJvb3QgZHJpdmVyLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCiswLiBCYWNrIHVwIGFsbCB0aGUgZmlsZXMgSSBuZWVkIHRvIG1vZGlmeToKKworY2QgZXRoZXJib290LTQuNy4yMC9zcmMKK2NwIE1ha2VmaWxlIE1ha2VmaWxlLm9yaWcKK2NwIGNvbmZpZy5jIGNvbmZpZy5jLm9yaWcKK2NwIHBjaS5oIHBjaS5oLm9yaWcKK2NwIE5JQyBOSUMub3JpZworY3AgY2FyZHMuaCBjYXJkcy5oLm9yaWcKKworMS4gRWRpdCBzcmMvTWFrZWZpbGUgdG8gYWRkIFNJUzkwMEZMQUdTIHRvIGRlZmluZXMKKworU0lTOTAwRkxBR1M9CSAgICAgICAJLURJTkNMVURFX1NJUzkwMAorCisyLiBlZGl0IHNyYy9wY2kuaCB0byBhZGQgUENJIHNpZ25hdHVyZXMgZm9yIGNhcmQKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NJUyAgICAgICAgIAkweDEwMzkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSVM5MDAgICAgIAkweDA5MDAgICAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TSVM3MDE2ICAgIAkweDcwMTYgIAorCiszLiBFZGl0IHNyYy9jb25maWcuYyB0byBhZGQgdGhlIGNhcmQgdG8gdGhlIGNhcmQgcHJvYmUgbGlzdAorCisjaWYgZGVmaW5lZChJTkNMVURFX05TODM5MCkgIHx8IGRlZmluZWQoSU5DTFVERV9FRVBSTzEwMCkgIHx8IAorICAgIGRlZmluZWQoSU5DTFVERV9MQU5DRSkgICB8fCBkZWZpbmVkKElOQ0xVREVfRVBJQzEwMCkgICB8fCAKKyAgICBkZWZpbmVkKElOQ0xVREVfVFVMSVApICAgfHwgZGVmaW5lZChJTkNMVURFX09UVUxJUCkgICAgfHwKKyAgICBkZWZpbmVkKElOQ0xVREVfM0M5MFgpICAgfHwgZGVmaW5lZChJTkNMVURFXzNDNTk1KSAgICAgfHwKKyAgICBkZWZpbmVkKElOQ0xVREVfUlRMODEzOSkgfHwgZGVmaW5lZChJTkNMVURFX1ZJQV9SSElORSkgfHwgCisgICAgZGVmaW5lZChJTkNMVURFX1NJUzkwMCkgIHx8IGRlZmluZWQoSU5DTFVERV9XODlDODQwKQorCisuLi4gYW5kIC4uLgorCisjaWZkZWYgSU5DTFVERV9TSVM5MDAKKyAgICAgICB7IFBDSV9WRU5ET1JfSURfU0lTLCAgICAgCVBDSV9ERVZJQ0VfSURfU0lTOTAwLAorICAgICAgICAgIlNJUzkwMCIsIDAsIDAsIDAsIDB9LAorICAgICAgIHsgUENJX1ZFTkRPUl9JRF9TSVMsICAgICAJUENJX0RFVklDRV9JRF9TSVM3MDE2LAorCSAiU0lTNzAxNiIsIDAsIDAsIDAsIDB9LAorI2VuZGlmCisKKy4uLiBhbmQgLi4uCisKKyNpZmRlZiBJTkNMVURFX1NJUzkwMAorCXsgIlNJUzkwMCIsIHNpczkwMF9wcm9iZSwgcGNpX2lvYWRkcnMgfSwJCisjZW5kaWYKKworNC4gRWRpdCBOSUMgdG8gYWRkIHNpczkwMCBhbmQgc2lzNzAxNiB0byBOSUMgbGlzdAorCisjIFNJUyA5MDAgYW5kIFNJUyA3MDE2CitzaXM5MDAJCXNpczkwMAkJMHgxMDM5LDB4MDkwMAorc2lzNzAxNgkJc2lzOTAwCQkweDEwMzksMHg3MDE2CisKKzUuIEVkaXQgY2FyZHMuaCB0byBhZGQgc2lzOTAwIHByb2JlIHJvdXRpbmUgZGVjbGFyYXRpb24KKworI2lmZGVmCUlOQ0xVREVfU0lTOTAwCitleHRlcm4gc3RydWN0IG5pYwkqc2lzOTAwX3Byb2JlKHN0cnVjdCBuaWMgKiwgdW5zaWduZWQgc2hvcnQgKgorICAgICAgICAgICAgICAgICAgICAgICAgUENJX0FSRyhzdHJ1Y3QgcGNpX2RldmljZSAqKSk7CisjZW5kaWYKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQXQgdGhpcyBwb2ludCwgeW91IGNhbiBiZWdpbiBjcmVhdGluZyB5b3VyIGRyaXZlciBzb3VyY2UgZmlsZS4gIFNlZQordGhlICJXcml0aW5nIGFuZCBFdGhlcmJvb3QgRHJpdmVyIiBzZWN0aW9uIG9mIHRoZSBFdGhlcmJvb3QKK2RvY3VtZW50YXRpb24gZm9yIHNvbWUgaGludHMuICBTZWUgdGhlIHNrZWwuYyBmaWxlIGZvciBhIHN0YXJ0aW5nCitwb2ludC4gIElmIHRoZXJlIGlzIGEgTGludXggZHJpdmVyIGZvciB0aGUgY2FyZCwgeW91IG1heSBiZSBhYmxlIHRvCit1c2UgdGhhdC4gIENvcHkgYW5kIGxlYXJuIGZyb20gZXhpc3RpbmcgRXRoZXJib290IGRyaXZlcnMgKHRoaXMgaXMgR1BMCisvIE9wZW4gU291cmNlIHNvZnR3YXJlISkuCisKK0pvaW4gdGhlIGV0aGVyYm9vdC1kZXZlbG9wZXJzIGFuZCBldGhlcmJvb3QtdXNlcnMgbWFpbGluZyBsaXN0cworKGluZm9ybWF0aW9uIGlzIG9uIGV0aGVyYm9vdC5zb3VyY2Vmb3JnZS5uZXQpIGZvciBpbmZvcm1hdGlvbiBhbmQKK2Fzc2lzdGFuY2UuIFdlIGludml0ZSBtb3JlIGRldmVsb3BlcnMgdG8gaGVscCBpbXByb3ZlIEV0aGVyYm9vdC4KKworVmlzaXQgdGhlIGh0dHA6Ly9ldGhlcmJvb3Quc291cmNlZm9yZ2UubmV0LCBodHRwOi8vdGhpbmd1aW4ub3JnLCAKK2h0dHA6Ly9yb20tby1tYXRpYy5uZXQsIGFuZCBodHRwOi8vbHRzcC5vcmcgc2l0ZXMgZm9yIGluZm9ybWF0aW9uIGFuZAorYXNzaXN0YW5jZS4KKworRW5qb3kuCmRpZmYgLS1naXQgYS9uZXRib290L3NrX2cxNi5jIGIvbmV0Ym9vdC9za19nMTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmU1MTgzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9za19nMTYuYwpAQCAtMCwwICsxLDExNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRXRoZXJib290IC0gIEJPT1RQL1RGVFAgQm9vdHN0cmFwIFByb2dyYW0KK1NjaG5laWRlciAmIEtvY2ggRzE2IE5JQyBkcml2ZXIgZm9yIEV0aGVyYm9vdAoraGVhdmlseSBiYXNlZCBvbiBTSyBHMTYgZHJpdmVyIGZyb20gTGludXggMi4wLjM2CitDaGFuZ2VzIHRvIG1ha2UgaXQgd29yayB3aXRoIEV0aGVyYm9vdCBieSBHZW9yZyBCYXVtIDxHZW9yZy5CYXVtQGdteC5kZT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQgYnkgUEpEIFdlaWNobWFubiAmIFNXUyBCZXJuLCBTd2l0emVybGFuZAorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIE1vZHVsZSAgICAgICAgIDogc2tfZzE2LmMKKyAqCisgKiBWZXJzaW9uICAgICAgICA6ICRSZXZpc2lvbjogMS40ICQKKyAqCisgKiBBdXRob3IgICAgICAgICA6IFBhdHJpY2sgSi5ELiBXZWljaG1hbm4KKyAqCisgKiBEYXRlIENyZWF0ZWQgICA6IDk0LzA1LzI2CisgKiBMYXN0IFVwZGF0ZWQgICA6ICREYXRlOiAyMDAyLzAxLzAyIDIxOjU2OjQwICQKKyAqCisgKiBEZXNjcmlwdGlvbiAgICA6IFNjaG5laWRlciAmIEtvY2ggRzE2IEV0aGVybmV0IERldmljZSBEcml2ZXIgZm9yCisgKiAgICAgICAgICAgICAgICAgIExpbnV4IEtlcm5lbCA+PSAxLjEuMjIKKyAqIFVwZGF0ZSBIaXN0b3J5IDoKKyAqCistKi8KKworLyoKKyAqIFRoZSBTY2huZWlkZXIgJiBLb2NoIChTSykgRzE2IE5ldHdvcmsgZGV2aWNlIGRyaXZlciBpcyBiYXNlZAorICogb24gdGhlICduaTY1MTAnIGRyaXZlciBmcm9tIE1pY2hhZWwgSGlwcCB3aGljaCBjYW4gYmUgZm91bmQgYXQKKyAqIGZ0cDovL3N1bnNpdGUudW5jLmVkdS9wdWIvTGludXgvc3lzdGVtL05ldHdvcmsvZHJpdmVycy9uaWRyaXZlcnMudGFyLmd6CisgKgorICogU291cmNlczogMSkgbmk2NTEwLmMgYnkgTS4gSGlwcAorICogICAgICAgICAgMikgZGVwY2EuYyAgYnkgRC5DLiBEYXZpZXMKKyAqICAgICAgICAgIDMpIHNrZWxldG9uLmMgYnkgRC4gQmVja2VyCisgKiAgICAgICAgICA0KSBBbTc5OTAgTG9jYWwgQXJlYSBOZXR3b3JrIENvbnRyb2xsZXIgZm9yIEV0aGVybmV0IChMQU5DRSksCisgKiAgICAgICAgICAgICBBTUQsIFB1Yi4gIzA1Njk4LCBKdW5lIDE5ODkKKyAqCisgKiBNYW55IFRoYW5rcyBmb3IgaGVscGluZyBtZSB0byBnZXQgdGhpbmdzIHdvcmtpbmcgdG86CisgKgorICogICAgICAgICAgICAgICAgIEEuIENveCAoQS5Db3hAc3dhbnNlYS5hYy51aykKKyAqICAgICAgICAgICAgICAgICBNLiBIaXBwIChtaGlwcEBzdHVkZW50LnVuaS10dWViaW5nZW4uZGUpCisgKiAgICAgICAgICAgICAgICAgUi4gQm9seiAoU2NobmVpZGVyICYgS29jaCwgR2VybWFueSkKKyAqCisgKiBTZWUgUkVBRE1FLnNrX2cxNiBmb3IgZGV0YWlscyBhYm91dCBsaW1pdGF0aW9ucyBhbmQgYnVncyBmb3IgdGhlCisgKiBjdXJyZW50IHZlcnNpb24uCisgKgorICogVG8gRG86CisgKiAgICAgICAgLSBTdXBwb3J0IG9mIFNLX0c4IGFuZCBvdGhlciBTSyBOZXR3b3JrIENhcmRzLgorICogICAgICAgIC0gQXV0b3NldCBtZW1vcnkgbWFwcGVkIFJBTS4gQ2hlY2sgZm9yIGZyZWUgbWVtb3J5IGFuZCB0aGVuCisgKiAgICAgICAgICBjb25maWd1cmUgUkFNIGNvcnJlY3RseS4KKyAqICAgICAgICAtIFNLX2Nsb3NlIHNob3VsZCByZWFsbHkgc2V0IGNhcmQgaW4gdG8gaW5pdGlhbCBzdGF0ZS4KKyAqICAgICAgICAtIFRlc3QgaWYgSVJRIDMgaXMgbm90IHN3aXRjaGVkIG9mZi4gVXNlIGF1dG9pcnEoKSBmdW5jdGlvbmFsaXR5LgorICogICAgICAgICAgKGFzIGluIC9kcml2ZXJzL25ldC9za2VsZXRvbi5jKQorICogICAgICAgIC0gSW1wbGVtZW50IE11bHRpY2FzdCBhZGRyZXNzaW5nLiBBdCBtaW5pbXVtIHNvbWV0aGluZyBsaWtlCisgKiAgICAgICAgICBpbiBkZXBjYS5jLgorICogICAgICAgIC0gUmVkbyB0aGUgc3RhdGlzdGljcyBwYXJ0LgorICogICAgICAgIC0gVHJ5IHRvIGZpbmQgb3V0IGlmIHRoZSBib2FyZCBpcyBpbiA4IEJpdCBvciAxNiBCaXQgc2xvdC4KKyAqICAgICAgICAgIElmIGluIDggQml0IG1vZGUgZG9uJ3QgdXNlIElSUSAxMS4KKyAqICAgICAgICAtIChUcnkgdG8gbWFrZSBpdCBzbGlnaHRseSBmYXN0ZXIuKQorICovCisKKy8qIHRvIGdldCBzb21lIGdsb2JhbCByb3V0aW5lcyBsaWtlIHByaW50ZiAqLworI2luY2x1ZGUgImV0aGVyYm9vdC5oIgorLyogdG8gZ2V0IHRoZSBpbnRlcmZhY2UgdG8gdGhlIGJvZHkgb2YgdGhlIHByb2dyYW0gKi8KKyNpbmNsdWRlICJuaWMuaCIKKworLyogRnJvbSBsaW51eC9pZl9ldGhlci5oOiAqLworI2RlZmluZSBFVEhfWkxFTgk2MAkJLyogTWluLiBvY3RldHMgaW4gZnJhbWUgc2FucyBGQ1MgKi8KKworI2luY2x1ZGUgInNrX2cxNi5oIgorCisvKgorICogU2NobmVpZGVyICYgS29jaCBDYXJkIERlZmluaXRpb25zCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjZGVmaW5lIFNLX05BTUUgICAiU0tfRzE2IgorCisvKgorICogU0tfRzE2IENvbmZpZ3VyYXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyoKKyAqIEFiYnJldmlhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0KKyAqCisgKiBSQU0gLSB1c2VkIGZvciB0aGUgMTZLQiBzaGFyZWQgbWVtb3J5CisgKiBCb290X1JPTSwgUk9NIC0gYXJlIHVzZWQgZm9yIHJlZmVyZW5jaW5nIHRoZSBCb290RVBST00KKyAqCisgKiBTS19BRERSIGlzIGEgc3ltYm9saWMgY29uc3RhbnQgdXNlZCB0byBjb25maWd1cmUKKyAqIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGRyaXZlciBhbmQgdGhlIFNLX0cxNi4KKyAqCisgKiBTS19BRERSIGRlZmluZXMgdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIFJBTSB3aWxsIGJlIG1hcHBlZCBpbnRvIHRoZSByZWFsCisgKiAgICAgICAgIGhvc3QgbWVtb3J5LgorICogICAgICAgICB2YWxpZCBhZGRyZXNzZXMgYXJlIGZyb20gMHhhMDAwMCB0byAweGZjMDAwIGluIDE2S2J5dGUgc3RlcHMuCisgKi8KKworI2RlZmluZSBTS19BRERSICAgICAgICAgMHhjYzAwMAorCisvKgorICogSW4gUE9TMyBhcmUgYml0cyBBMTQtQTE5IG9mIHRoZSBhZGRyZXNzIGJ1cy4gVGhlc2UgYml0cyBjYW4gYmUgc2V0CisgKiB0byBjaG9vc2UgdGhlIFJBTSBhZGRyZXNzLiBUaGF0J3Mgd2h5IHdlIG9ubHkgY2FuIGNob29zZSB0aGUgUkFNIGFkZHJlc3MKKyAqIGluIDE2S0Igc3RlcHMuCisgKi8KKworI2RlZmluZSBQT1NfQUREUiAgICAgICAocm9tX2FkZHI+PjE0KSAgLyogRG8gbm90IGNoYW5nZSB0aGlzIGxpbmUgKi8KKworLyoKKyAqIFNLX0cxNiBJL08gUE9SVCdzICsgSVJRJ3MgKyBCb290X1JPTSBsb2NhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKgorICogQXMgbmVhcmx5IGV2ZXJ5IGNhcmQgaGFzIGFsc28gU0tfRzE2IGEgc3BlY2lmaWVkIEkvTyBQb3J0IHJlZ2lvbiBhbmQKKyAqIG9ubHkgYSBmZXcgcG9zc2libGUgSVJRJ3MuCisgKiBJbiB0aGUgSW5zdGFsbGF0aW9uIEd1aWRlIGZyb20gU2NobmVpZGVyICYgS29jaCBpcyBsaXN0ZWQgYSBwb3NzaWJsZQorICogSW50ZXJydXB0IElSUTIuIElSUTIgaXMgYWx3YXlzIElSUTkgaW4gYm9hcmRzIHdpdGggdHdvIGNhc2NhZGVkIGludGVycnVwdAorICogY29udHJvbGxlcnMuIFNvIHdlIHVzZSBpbiBTS19JUlFTIElSUTkuCisgKi8KKworLyogRG9uJ3QgdG91Y2ggYW55IG9mIHRoZSBmb2xsb3dpbmcgI2RlZmluZXMuICovCisKKyNkZWZpbmUgU0tfSU9fUE9SVFMgICAgIHsgMHgxMDAsIDB4MTgwLCAweDIwOCwgMHgyMjAsIDB4Mjg4LCAweDMyMCwgMHgzMjgsIDB4MzkwLCAwIH0KKworLyoKKyAqIFNLX0cxNiBQT1MgUkVHSVNURVJTCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qCisgKiBTS19HMTYgaGFzIGEgUHJvZ3JhbW1hYmxlIE9wdGlvbiBTZWxlY3QgKFBPUykgUmVnaXN0ZXIuCisgKiBUaGUgUE9TIGlzIGNvbXBvc2VkIG9mIDggc2VwYXJhdGUgcmVnaXN0ZXJzIChQT1MwLTcpIHdoaWNoCisgKiBhcmUgSS9PIG1hcHBlZCBvbiBhbiBhZGRyZXNzIHNldCBieSB0aGUgVzEgc3dpdGNoLgorICoKKyAqLworCisjZGVmaW5lIFNLX1BPU19TSVpFIDggICAgICAgICAgIC8qIDggSS9PIFBvcnRzIGFyZSB1c2VkIGJ5IFNLX0cxNiAqLworCisjZGVmaW5lIFNLX1BPUzAgICAgIGlvYWRkciAgICAgIC8qIENhcmQtSUQgTG93IChSKSAqLworI2RlZmluZSBTS19QT1MxICAgICBpb2FkZHIrMSAgICAvKiBDYXJkLUlEIEhpZ2ggKFIpICovCisjZGVmaW5lIFNLX1BPUzIgICAgIGlvYWRkcisyICAgIC8qIENhcmQtRW5hYmxlLCBCb290LVJPTSBEaXNhYmxlIChSVykgKi8KKyNkZWZpbmUgU0tfUE9TMyAgICAgaW9hZGRyKzMgICAgLyogQmFzZSBhZGRyZXNzIG9mIFJBTSAqLworI2RlZmluZSBTS19QT1M0ICAgICBpb2FkZHIrNCAgICAvKiBJUlEgKi8KKworLyogUE9TNSAtIFBPUzcgYXJlIHVudXNlZCAqLworCisvKgorICogU0tfRzE2IE1BQyBQUkVGSVgKKyAqIC0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyoKKyAqIFNjaGVpZGVyICYgS29jaCBtYW51ZmFjdHVyZXIgY29kZSAoMDA6MDA6YTUpLgorICogVGhpcyBtdXN0IGJlIGNoZWNrZWQsIHRoYXQgd2UgYXJlIHN1cmUgaXQgaXMgYSBTSyBjYXJkLgorICovCisKKyNkZWZpbmUgU0tfTUFDMCAgICAgICAgIDB4MDAKKyNkZWZpbmUgU0tfTUFDMSAgICAgICAgIDB4MDAKKyNkZWZpbmUgU0tfTUFDMiAgICAgICAgIDB4NWEKKworLyoKKyAqIFNLX0cxNiBJRAorICogLS0tLS0tLS0tCisgKi8KKworLyoKKyAqIElmIFBPUzAsUE9TMSBjb250YWluIHRoZSBmb2xsb3dpbmcgSUQsIHRoZW4gd2Uga25vdworICogYXQgd2hpY2ggSS9PIFBvcnQgQWRkcmVzcyB3ZSBhcmUuCisgKi8KKworI2RlZmluZSBTS19JRExPVyAgMHhmZAorI2RlZmluZSBTS19JREhJR0ggMHg2YQorCisKKy8qCisgKiBMQU5DRSBQT1MgQml0IGRlZmluaXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2RlZmluZSBTS19ST01fUkFNX09OICAoUE9TMl9DQVJEKQorI2RlZmluZSBTS19ST01fUkFNX09GRiAoUE9TMl9FUFJPTSkKKyNkZWZpbmUgU0tfUk9NX09OICAgICAgKGluYihTS19QT1MyKSAmIFBPUzJfQ0FSRCkKKyNkZWZpbmUgU0tfUk9NX09GRiAgICAgKGluYihTS19QT1MyKSB8IFBPUzJfRVBST00pCisjZGVmaW5lIFNLX1JBTV9PTiAgICAgIChpbmIoU0tfUE9TMikgfCBQT1MyX0NBUkQpCisjZGVmaW5lIFNLX1JBTV9PRkYgICAgIChpbmIoU0tfUE9TMikgJiBQT1MyX0VQUk9NKQorCisjZGVmaW5lIFBPUzJfQ0FSRCAgMHgwMDAxICAgICAgICAgICAgICAvKiAxID0gU0tfRzE2IG9uICAgICAgMCA9IG9mZiAqLworI2RlZmluZSBQT1MyX0VQUk9NIDB4MDAwMiAgICAgICAgICAgICAgLyogMSA9IEJvb3QgRVBST00gb2ZmIDAgPSBvbiAqLworCisvKgorICogU0tfRzE2IE1lbW9yeSBtYXBwZWQgUmVnaXN0ZXJzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKworI2RlZmluZSBTS19JT1JFRyAgICAgICAgKGJvYXJkLT5pb3JlZykgLyogTEFOQ0UgZGF0YSByZWdpc3RlcnMuICAgICAqLworI2RlZmluZSBTS19QT1JUICAgICAgICAgKGJvYXJkLT5wb3J0KSAgLyogQ29udHJvbCwgU3RhdHVzIHJlZ2lzdGVyICAqLworI2RlZmluZSBTS19JT0NPTSAgICAgICAgKGJvYXJkLT5pb2NvbSkgLyogSS9PIENvbW1hbmQgICAgICAgICAgICAgICAqLworCisvKgorICogU0tfRzE2IFN0YXR1cy9Db250cm9sIFJlZ2lzdGVyIGJpdHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogKEMpIENvbnRyb2xyZWcgKFMpIFN0YXR1c3JlZworICovCisKKy8qCisgKiBSZWdpc3RlciB0cmFuc2ZlcjogMCA9IG5vIHRyYW5zZmVyCisgKiAgICAgICAgICAgICAgICAgICAgMSA9IHRyYW5zZmVycmluZyBkYXRhIGJldHdlZW4gTEFOQ0UgYW5kIEkvTyByZWcKKyAqLworI2RlZmluZSBTS19JT1JVTiAgICAgICAgMHgyMAorCisvKgorICogTEFOQ0UgaW50ZXJydXB0OiAwID0gTEFOQ0UgaW50ZXJydXB0IG9jY3VycmVkCisgKiAgICAgICAgICAgICAgICAgIDEgPSBubyBMQU5DRSBpbnRlcnJ1cHQgb2NjdXJyZWQKKyAqLworI2RlZmluZSBTS19JUlEgICAgICAgICAgMHgxMAorCisjZGVmaW5lIFNLX1JFU0VUICAgICAgICAweDA4ICAgLyogUmVzZXQgU0tfQ0FSRDogMCA9IFJFU0VUIDEgPSBub3JtYWwgKi8KKyNkZWZpbmUgU0tfUlcgICAgICAgICAgIDB4MDIgICAvKiAwID0gd3JpdGUgdG8gMSA9IHJlYWQgZnJvbSAqLworI2RlZmluZSBTS19BRFIgICAgICAgICAgMHgwMSAgIC8qIDAgPSBSRUcgRGF0YVBvcnQgMSA9IFJBUCBSZWcgYWRkciBwb3J0ICovCisKKworI2RlZmluZSBTS19SUkVHICAgICAgICAgU0tfUlcgIC8qIFRyYW5zZmVyZGlyZWN0aW9uIHRvIHJlYWQgZnJvbSBsYW5jZSAqLworI2RlZmluZSBTS19XUkVHICAgICAgICAgMCAgICAgIC8qIFRyYW5zZmVyZGlyZWN0aW9uIHRvIHdyaXRlIHRvIGxhbmNlICovCisjZGVmaW5lIFNLX1JBUCAgICAgICAgICBTS19BRFIgLyogRGVzdGluYXRpb24gUmVnaXN0ZXIgUkFQICovCisjZGVmaW5lIFNLX1JEQVRBICAgICAgICAwICAgICAgLyogRGVzdGluYXRpb24gUmVnaXN0ZXIgUkVHIERhdGFQb3J0ICovCisKKy8qCisgKiBTS19HMTYgSS9PIENvbW1hbmQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qCisgKiBBbnkgYml0Y29tYmluYXRpb24gc2V0cyB0aGUgaW50ZXJuYWwgSS9PIGJpdCAodHJhbnNmZXIgd2lsbCBzdGFydCkKKyAqIHdoZW4gd3JpdHRlbiB0byBJL08gQ29tbWFuZAorICovCisKKyNkZWZpbmUgU0tfRE9JTyAgICAgICAgIDB4ODAgICAvKiBEbyBUcmFuc2ZlciAqLworCisvKgorICogTEFOQ0UgUkFQIChSZWdpc3RlciBBZGRyZXNzIFBvcnQpLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyoKKyAqIFRoZSBMQU5DRSBpbnRlcm5hbCByZWdpc3RlcnMgYXJlIHNlbGVjdGVkIHRocm91Z2ggdGhlIFJBUC4KKyAqIFRoZSBSZWdpc3RlcnMgYXJlOgorICoKKyAqIENTUjAgLSBTdGF0dXMgYW5kIENvbnRyb2wgZmxhZ3MKKyAqIENTUjEgLSBMb3cgb3JkZXIgYml0cyBvZiBpbml0aWFsaXplIGJsb2NrIChiaXRzIDE1OjAwKQorICogQ1NSMiAtIEhpZ2ggb3JkZXIgYml0cyBvZiBpbml0aWFsaXplIGJsb2NrIChiaXRzIDA3OjAwLCAxNTowOCBhcmUgcmVzZXJ2ZWQpCisgKiBDU1IzIC0gQWxsb3dzIHJlZGVmaW5pdGlvbiBvZiB0aGUgQnVzIE1hc3RlciBJbnRlcmZhY2UuCisgKiAgICAgICAgVGhpcyByZWdpc3RlciBtdXN0IGJlIHNldCB0byAweDAwMDIsIHdoaWNoIG1lYW5zIEJTV0FQID0gMCwKKyAqICAgICAgICBBQ09OID0gMSwgQkNPTiA9IDA7CisgKgorICovCisKKyNkZWZpbmUgQ1NSMCAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQ1NSMSAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQ1NSMiAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQ1NSMyAgICAgICAgICAgIDB4MDMKKworLyoKKyAqIEdlbmVyYWwgRGVmaW5pdGlvbnMKKyAqID09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKgorICogU2V0IHRoZSBudW1iZXIgb2YgVHggYW5kIFJ4IGJ1ZmZlcnMsIHVzaW5nIExvZ18yKCMgYnVmZmVycykuCisgKiBXZSBoYXZlIDE2S0IgUkFNIHdoaWNoIGNhbiBiZSBhY2Nlc3NlZCBieSB0aGUgTEFOQ0UuIEluIHRoZQorICogbWVtb3J5IGFyZSBub3Qgb25seSB0aGUgYnVmZmVycyBidXQgYWxzbyB0aGUgcmluZyBkZXNjcmlwdG9ycyBhbmQKKyAqIHRoZSBpbml0aWFsaXplIGJsb2NrLgorICogRG9uJ3QgY2hhbmdlIGFueXRoaW5nIHVubGVzcyB5b3UgcmVhbGx5IGtub3cgd2hhdCB5b3UgZG8uCisgKi8KKworI2RlZmluZSBMQ19MT0dfVFhfQlVGRkVSUyAxICAgICAgICAgICAgICAgLyogKDIgPT0gMl5eMSkgMiBUcmFuc21pdCBidWZmZXJzICovCisjZGVmaW5lIExDX0xPR19SWF9CVUZGRVJTIDIgICAgICAgICAgICAgICAvKiAoOCA9PSAyXl4zKSA4IFJlY2VpdmUgYnVmZmVycyAqLworCisvKiBEZXNjcmlwdG9yIHJpbmcgc2l6ZXMgKi8KKworI2RlZmluZSBUTUROVU0gKDEgPDwgKExDX0xPR19UWF9CVUZGRVJTKSkgLyogMiBUcmFuc21pdCBkZXNjcmlwdG9yIHJpbmdzICovCisjZGVmaW5lIFJNRE5VTSAoMSA8PCAoTENfTE9HX1JYX0JVRkZFUlMpKSAvKiA4IFJlY2VpdmUgQnVmZmVycyAqLworCisvKiBEZWZpbmUgTWFzayBmb3Igc2V0dGluZyBSTUQsIFRNRCBsZW5ndGggaW4gdGhlIExBTkNFIGluaXRfYmxvY2sgKi8KKworI2RlZmluZSBUTUROVU1NQVNLIChMQ19MT0dfVFhfQlVGRkVSUyA8PCAyOSkKKyNkZWZpbmUgUk1ETlVNTUFTSyAoTENfTE9HX1JYX0JVRkZFUlMgPDwgMjkpCisKKy8qCisgKiBEYXRhIEJ1ZmZlciBzaXplIGlzIHNldCB0byBtYXhpbXVtIHBhY2tldCBsZW5ndGguCisgKi8KKworI2RlZmluZSBQS1RfQlVGX1NaICAgICAgICAgICAgICAxNTE4CisKKy8qCisgKiBUaGUgbnVtYmVyIG9mIGxvdyBJL08gcG9ydHMgdXNlZCBieSB0aGUgZXRoZXJjYXJkLgorICovCisKKyNkZWZpbmUgRVRIRVJDQVJEX1RPVEFMX1NJWkUgICAgU0tfUE9TX1NJWkUKKworLyoKKyAqIFBvcnRyZXNlcnZlIGlzIHRoZXJlIHRvIG1hcmsgdGhlIENhcmQgSS9PIFBvcnQgcmVnaW9uIGFzIHVzZWQuCisgKiBDaGVja19yZWdpb24gaXMgdG8gY2hlY2sgaWYgdGhlIHJlZ2lvbiBhdCBpb2FkZHIgd2l0aCB0aGUgc2l6ZSAic2l6ZSIKKyAqIGlzIGZyZWUgb3Igbm90LgorICogU25hcmZfcmVnaW9uIGFsbG9jYXRlcyB0aGUgSS9PIFBvcnQgcmVnaW9uLgorICovCisKKyNpZm5kZWYJSEFWRV9QT1JUUkVTRVJWRQorCisjZGVmaW5lIGNoZWNrX3JlZ2lvbihpb2FkZHIxLCBzaXplKSAgICAgICAgICAgICAgMAorI2RlZmluZSByZXF1ZXN0X3JlZ2lvbihpb2FkZHIxLCBzaXplLG5hbWUpICAgICAgIGRvIDsgd2hpbGUgKDApCisKKyNlbmRpZgorCisvKgorICogU0tfREVCVUcKKyAqCisgKiBIZXJlIHlvdSBjYW4gY2hvb3NlIHdoYXQgbGV2ZWwgb2YgZGVidWdnaW5nIHdhbnRlZC4KKyAqCisgKiBJZiBTS19ERUJVRyBhbmQgU0tfREVCVUcyIGFyZSB1bmRlZmluZWQsIHRoZW4gb25seSB0aGUKKyAqICBuZWNlc3NhcnkgbWVzc2FnZXMgd2lsbCBiZSBwcmludGVkLgorICoKKyAqIElmIFNLX0RFQlVHIGlzIGRlZmluZWQsIHRoZXJlIHdpbGwgYmUgbWFueSBkZWJ1Z2dpbmcgcHJpbnRzCisgKiAgd2hpY2ggY2FuIGhlbHAgdG8gZmluZCBzb21lIG1pc3Rha2VzIGluIGNvbmZpZ3VyYXRpb24gb3IgZXZlbgorICogIGluIHRoZSBkcml2ZXIgY29kZS4KKyAqCisgKiBJZiBTS19ERUJVRzIgaXMgZGVmaW5lZCwgbWFueSBtYW55IG1lc3NhZ2VzIHdpbGwgYmUgcHJpbnRlZAorICogIHdoaWNoIG5vcm1hbGx5IHlvdSBkb24ndCBuZWVkLiBJIHVzZWQgdGhpcyB0byBjaGVjayB0aGUgaW50ZXJydXB0CisgKiAgcm91dGluZS4KKyAqCisgKiAoSWYgeW91IGRlZmluZSBvbmx5IFNLX0RFQlVHMiB0aGVuIG9ubHkgdGhlIG1lc3NhZ2VzIGZvcgorICogIGNoZWNraW5nIGludGVycnVwdHMgd2lsbCBiZSBwcmludGVkISkKKyAqCisgKiBOb3JtYWwgd2F5IG9mIGxpdmUgaXM6CisgKgorICogRm9yIHRoZSB3aG9sZSB0aGluZyBnZXQgZ29pbmcgbGV0IGJvdGggc3ltYm9saWMgY29uc3RhbnRzCisgKiB1bmRlZmluZWQuIElmIHlvdSBmYWNlIGFueSBwcm9ibGVtcyBhbmQgeW91IGtub3cgd2hhdCdzIGdvaW5nCisgKiBvbiAoeW91IGtub3cgc29tZXRoaW5nIGFib3V0IHRoZSBjYXJkIGFuZCB5b3UgY2FuIGludGVycHJldCBzb21lCisgKiBoZXggTEFOQ0UgcmVnaXN0ZXIgb3V0cHV0KSB0aGVuIGRlZmluZSBTS19ERUJVRworICoKKyAqLworCisjdW5kZWYgIFNLX0RFQlVHCS8qIGRlYnVnZ2luZyAqLworI3VuZGVmICBTS19ERUJVRzIJLyogZGVidWdnaW5nIHdpdGggbW9yZSB2ZXJib3NlIHJlcG9ydCAqLworCisjaWZkZWYJU0tfREVCVUcKKyNkZWZpbmUgUFJJTlRGKHgpIHByaW50ZiB4CisjZWxzZQorI2RlZmluZSBQUklOVEYoeCkgLyoqLworI2VuZGlmCisKKyNpZmRlZglTS19ERUJVRzIKKyNkZWZpbmUgUFJJTlRGMih4KSBwcmludGYgeAorI2Vsc2UKKyNkZWZpbmUgUFJJTlRGMih4KSAvKiovCisjZW5kaWYKKworLyoKKyAqIFNLX0cxNiBSQU0KKyAqCisgKiBUaGUgY29tcG9uZW50cyBhcmUgbWVtb3J5IG1hcHBlZCBhbmQgY2FuIGJlIHNldCBpbiBhIHJlZ2lvbiBmcm9tCisgKiAweDAwMDAwIHRocm91Z2ggMHhmYzAwMCBpbiAxNktCIHN0ZXBzLgorICoKKyAqIFRoZSBOZXR3b3JrIGNvbXBvbmVudHMgYXJlOiBkdWFsIHBvcnRlZCBSQU0sIFByb20sIEkvTyBSZWcsIFN0YXR1cy0sCisgKiBDb250cm9scmVnaXN0ZXIgYW5kIEkvTyBDb21tYW5kLgorICoKKyAqIGR1YWwgcG9ydGVkIFJBTTogVGhpcyBpcyB0aGUgb25seSBtZW1vcnkgcmVnaW9uIHdoaWNoIHRoZSBMQU5DRSBjaGlwCisgKiAgICAgIGhhcyBhY2Nlc3MgdG8uIEZyb20gdGhlIExhbmNlIGl0IGlzIGFkZHJlc3NlZCBmcm9tIDB4MDAwMCB0bworICogICAgICAweDNmYmYuIFRoZSBob3N0IGFjY2Vzc2VzIGl0IG5vcm1hbGx5LgorICoKKyAqIFBST006IFRoZSBQUk9NIG9idGFpbnMgdGhlIEVUSEVSTkVULU1BQy1BZGRyZXNzLiBJdCBpcyByZWFsaXNlZCBhcyBhCisgKiAgICAgICA4LUJpdCBQUk9NLCB0aGlzIG1lYW5zIG9ubHkgdGhlIDE2IGV2ZW4gYWRkcmVzc2VzIGFyZSB1c2VkIG9mIHRoZQorICogICAgICAgMzIgQnl0ZSBBZGRyZXNzIHJlZ2lvbi4gQWNjZXNzIHRvIGEgb2RkIGFkZHJlc3MgcmVzdWx0cyBpbiBpbnZhbGlkCisgKiAgICAgICBkYXRhLgorICoKKyAqIExBTkNFIEkvTyBSZWc6IFRoZSBJL08gUmVnIGlzIGJ1aWxkIG9mIDQgc2luZ2xlIFJlZ2lzdGVycywgTG93LUJ5dGUgV3JpdGUsCisgKiAgICAgICBIaS1CeXRlIFdyaXRlLCBMb3ctQnl0ZSBSZWFkLCBIaS1CeXRlIFJlYWQuCisgKiAgICAgICBUcmFuc2ZlciBmcm9tIG9yIHRvIHRoZSBMQU5DRSBpcyBhbHdheXMgaW4gMTZCaXQgc28gTG93IGFuZCBIaWdoCisgKiAgICAgICByZWdpc3RlcnMgYXJlIGFsd2F5cyByZWxldmFudC4KKyAqCisgKiAgICAgICBUaGUgRGF0YSBmcm9tIHRoZSBSZWFkcmVnaXN0ZXIgaXMgbm90IHRoZSBkYXRhIGluIHRoZSBXcml0ZXJlZ2lzdGVyISEKKyAqCisgKiBQb3J0OiBTdGF0dXMtIGFuZCBDb250cm9scmVnaXN0ZXIuCisgKiAgICAgICBUd28gZGlmZmVyZW50IHJlZ2lzdGVycyB3aGljaCBzaGFyZSB0aGUgc2FtZSBhZGRyZXNzLCBTdGF0dXMgaXMKKyAqICAgICAgIHJlYWQtb25seSwgQ29udHJvbCBpcyB3cml0ZS1vbmx5LgorICoKKyAqIEkvTyBDb21tYW5kOgorICogICAgICAgQW55IGJpdGNvbWJpbmF0aW9uIHdyaXR0ZW4gaW4gaGVyZSBzdGFydHMgdGhlIHRyYW5zbWlzc2lvbiBiZXR3ZWVuCisgKiAgICAgICBIb3N0IGFuZCBMQU5DRS4KKyAqLworCit0eXBlZGVmIHN0cnVjdAoreworCXVuc2lnbmVkIGNoYXIgIHJhbVsweDNmYzBdOyAgIC8qIDE2S0IgZHVhbCBwb3J0ZWQgcmFtICovCisJdW5zaWduZWQgY2hhciAgcm9tWzB4MDAyMF07ICAgLyogMzJCeXRlIFBST00gY29udGFpbmluZyA2Qnl0ZSBNQUMgKi8KKwl1bnNpZ25lZCBjaGFyICByZXMxWzB4MDAxMF07ICAvKiByZXNlcnZlZCAqLworCXVuc2lnbmVkIHZvbGF0aWxlIHNob3J0IGlvcmVnOy8qIExBTkNFIEkvTyBSZWdpc3RlciAqLworCXVuc2lnbmVkIHZvbGF0aWxlIGNoYXIgIHBvcnQ7IC8qIFN0YXR1c3JlZ2lzdGVyIGFuZCBDb250cm9scmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBjaGFyICBpb2NvbTsgICAgICAgICAvKiBJL08gQ29tbWFuZCBSZWdpc3RlciAqLworfSBTS19SQU07CisKKy8qIHN0cnVjdCAgKi8KKworLyoKKyAqIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSBmb3IgdGhlIGR1YWwgcG9ydGVkIHJhbS4gV2UKKyAqIGhhdmUgZXhhY3RseSAxNiAzMjAgQnl0ZXMuIEluIGhlcmUgdGhlcmUgbXVzdCBiZToKKyAqCisgKiAgICAgLSBJbml0aWFsaXplIEJsb2NrICAgKHN0YXJ0aW5nIGF0IGEgd29yZCBib3VuZGFyeSkKKyAqICAgICAtIFJlY2VpdmUgYW5kIFRyYW5zbWl0IERlc2NyaXB0b3IgUmluZ3MgKHF1YWR3b3JkIGJvdW5kYXJ5KQorICogICAgIC0gRGF0YSBCdWZmZXJzIChhcmJpdHJhcnkgYm91bmRhcnkpCisgKgorICogVGhpcyBpcyBiZWNhdXNlIExBTkNFIGhhcyBvbiBTS19HMTYgb25seSBhY2Nlc3MgdG8gdGhlIGR1YWwgcG9ydGVkCisgKiBSQU0gYW5kIG5vd2hlcmUgZWxzZS4KKyAqLworCitzdHJ1Y3QgU0tfcmFtCit7CisgICAgc3RydWN0IGluaXRfYmxvY2sgaWI7CisgICAgc3RydWN0IHRtZCB0bWRlW1RNRE5VTV07CisgICAgc3RydWN0IHJtZCBybWRlW1JNRE5VTV07CisgICAgY2hhciB0bWRidWZbVE1ETlVNXVtQS1RfQlVGX1NaXTsKKyAgICBjaGFyIHJtZGJ1ZltSTUROVU1dW1BLVF9CVUZfU1pdOworfTsKKworLyoKKyAqIFN0cnVjdHVyZSB3aGVyZSBhbGwgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGlzIGZvciByaW5nIGJ1ZmZlcgorICogbWFuYWdlbWVudCBhbmQgc3RhdGlzdGljcy4KKyAqLworCitzdHJ1Y3QgcHJpdgoreworICAgIHN0cnVjdCBTS19yYW0gKnJhbTsgIC8qIGR1YWwgcG9ydGVkIHJhbSBzdHJ1Y3R1cmUgKi8KKyAgICBzdHJ1Y3Qgcm1kICpybWRoZWFkOyAvKiBzdGFydCBvZiByZWNlaXZlIHJpbmcgZGVzY3JpcHRvcnMgKi8KKyAgICBzdHJ1Y3QgdG1kICp0bWRoZWFkOyAvKiBzdGFydCBvZiB0cmFuc21pdCByaW5nIGRlc2NyaXB0b3JzICovCisgICAgaW50ICAgICAgICBybWRudW07ICAgLyogYWN0dWFsIHVzZWQgcmluZyBkZXNjcmlwdG9yICovCisgICAgaW50ICAgICAgICB0bWRudW07ICAgLyogYWN0dWFsIHRyYW5zbWl0IGRlc2NyaXB0b3IgZm9yIHRyYW5zbWl0dGluZyBkYXRhICovCisgICAgaW50ICAgICAgICB0bWRsYXN0OyAgLyogbGFzdCBzZW50IGRlc2NyaXB0b3IgdXNlZCBmb3IgZXJyb3IgaGFuZGxpbmcsIGV0YyAqLworICAgIHZvaWQgICAgICAgKnJtZGJ1ZnNbUk1ETlVNXTsgLyogcG9pbnRlciB0byB0aGUgcmVjZWl2ZSBidWZmZXJzICovCisgICAgdm9pZCAgICAgICAqdG1kYnVmc1tUTUROVU1dOyAvKiBwb2ludGVyIHRvIHRoZSB0cmFuc21pdCBidWZmZXJzICovCit9OworCisvKiBnbG9iYWwgdmFyaWFibGUgZGVjbGFyYXRpb24gKi8KKworLyogc3RhdGljIHZhcmlhYmxlcyAqLworCitzdGF0aWMgU0tfUkFNICpib2FyZDsgIC8qIHBvaW50ZXIgdG8gb3VyIG1lbW9yeSBtYXBwZWQgYm9hcmQgY29tcG9uZW50cyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0CWlvYWRkcjsgLyogYmFzZSBpbyBhZGRyZXNzICovCitzdGF0aWMgc3RydWN0IHByaXYJcF9kYXRhOworCisvKiBNYWNyb3MgKi8KKworCisvKiBGdW5jdGlvbiBQcm90b3R5cGVzICovCisKKy8qCisgKiBEZXZpY2UgRHJpdmVyIGZ1bmN0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNlZSBmb3Igc2hvcnQgZXhwbGFuYXRpb24gb2YgZWFjaCBmdW5jdGlvbiBpdHMgZGVmaW5pdGlvbnMgaGVhZGVyLgorICovCisKK3N0YXRpYyBpbnQgICBTS19wcm9iZTEoc3RydWN0IG5pYyAqbmljLCBzaG9ydCBpb2FkZHIxKTsKKworc3RhdGljIHZvaWQgU0tfcmVzZXQoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyBpbnQgU0tfcG9sbChzdHJ1Y3QgbmljICpuaWMpOworc3RhdGljIHZvaWQgU0tfdHJhbnNtaXQoCitzdHJ1Y3QgbmljICpuaWMsCitjb25zdCBjaGFyICpkLAkJCS8qIERlc3RpbmF0aW9uICovCit1bnNpZ25lZCBpbnQgdCwJCQkvKiBUeXBlICovCit1bnNpZ25lZCBpbnQgcywJCQkvKiBzaXplICovCitjb25zdCBjaGFyICpwKTsJCQkvKiBQYWNrZXQgKi8KK3N0YXRpYyB2b2lkIFNLX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKTsKK3N0cnVjdCBuaWMgKlNLX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlX2FkZHJzKTsKKworLyoKKyAqIExBTkNFIEZ1bmN0aW9ucworICogLS0tLS0tLS0tLS0tLS0tCisgKi8KKworc3RhdGljIGludCBTS19sYW5jZV9pbml0KHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgbW9kZSk7CitzdGF0aWMgdm9pZCBTS19yZXNldF9ib2FyZCh2b2lkKTsKK3N0YXRpYyB2b2lkIFNLX3NldF9SQVAoaW50IHJlZ19udW1iZXIpOworc3RhdGljIGludCBTS19yZWFkX3JlZyhpbnQgcmVnX251bWJlcik7CitzdGF0aWMgaW50IFNLX3JyZWFkX3JlZyh2b2lkKTsKK3N0YXRpYyB2b2lkIFNLX3dyaXRlX3JlZyhpbnQgcmVnX251bWJlciwgaW50IHZhbHVlKTsKKworLyoKKyAqIERlYnVnZ2luZyBmdW5jdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitzdGF0aWMgdm9pZCBTS19wcmludF9wb3Moc3RydWN0IG5pYyAqbmljLCBjaGFyICp0ZXh0KTsKK3N0YXRpYyB2b2lkIFNLX3ByaW50X3JhbShzdHJ1Y3QgbmljICpuaWMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVTRVQgLSBSZXNldCBhZGFwdGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBTS19yZXNldChzdHJ1Y3QgbmljICpuaWMpCit7CisJLyogcHV0IHRoZSBjYXJkIGluIGl0cyBpbml0aWFsIHN0YXRlICovCisJU0tfbGFuY2VfaW5pdChuaWMsIE1PREVfTk9STUFMKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBTS19wb2xsKHN0cnVjdCBuaWMgKm5pYykKK3sKKwkvKiByZXR1cm4gdHJ1ZSBpZiB0aGVyZSdzIGFuIGV0aGVybmV0IHBhY2tldCByZWFkeSB0byByZWFkICovCisJc3RydWN0IHByaXYgKnA7ICAgICAgICAgLyogU0tfRzE2IHByaXZhdGUgc3RydWN0dXJlICovCisJc3RydWN0IHJtZCAqcm1kcDsKKwlpbnQgY3NyMCwgcm1kc3RhdCwgcGFja2V0X3RoZXJlOworICAgIFBSSU5URjIoKCIjIyAlczogQXQgYmVnaW5uaW5nIG9mIFNLX3BvbGwoKS4gQ1NSMDogJSNoWFxuIiwKKyAgICAgICAgICAgU0tfTkFNRSwgU0tfcmVhZF9yZWcoQ1NSMCkpKTsKKworCXAgPSBuaWMtPnByaXZfZGF0YTsKKyAgICBjc3IwID0gU0tfcmVhZF9yZWcoQ1NSMCk7ICAgICAgLyogc3RvcmUgcmVnaXN0ZXIgZm9yIGNoZWNraW5nICovCisKKyAgICAvKgorICAgICAqIEFja25vd2xlZGdlIGFsbCBvZiB0aGUgY3VycmVudCBpbnRlcnJ1cHQgc291cmNlcywgZGlzYWJsZQorICAgICAqIEludGVycnVwdHMgKElORUEgPSAwKQorICAgICAqLworCisgICAgU0tfd3JpdGVfcmVnKENTUjAsIGNzcjAgJiBDU1IwX0NMUkFMTCk7CisKKyAgICBpZiAoY3NyMCAmIENTUjBfRVJSKSAvKiBMQU5DRSBFcnJvciAqLworICAgIHsKKwlwcmludGYoIiVzOiBlcnJvcjogJSNoWCIsIFNLX05BTUUsIGNzcjApOworCisgICAgICAgIGlmIChjc3IwICYgQ1NSMF9NSVNTKSAgICAgIC8qIE5vIHBsYWNlIHRvIHN0b3JlIHBhY2tldCA/ICovCisgICAgICAgIHsKKwkJcHJpbnRmKCIsIFBhY2tldCBkcm9wcGVkLiIpOworICAgICAgICB9CisJcHV0Y2hhcignXG4nKTsKKyAgICB9CisKKyAgICBybWRwID0gcC0+cm1kaGVhZCArIHAtPnJtZG51bTsKKyAgICBwYWNrZXRfdGhlcmUgPSAwOworICAgIC8qIEFzIGxvbmcgYXMgd2Ugb3duIHRoZSBuZXh0IGVudHJ5LCBjaGVjayBzdGF0dXMgYW5kIHNlbmQKKyAgICAgKiBpdCB1cCB0byBoaWdoZXIgbGF5ZXIKKyAgICAgKi8KKworICAgIHdoaWxlICghKCAocm1kc3RhdCA9IHJtZHAtPnUucy5zdGF0dXMpICYgUlhfT1dOKSkKKyAgICB7CisJLyoKKyAgICAgICAgICogU3RhcnQgYW5kIGVuZCBvZiBwYWNrZXQgbXVzdCBiZSBzZXQsIGJlY2F1c2Ugd2UgdXNlCisJICogdGhlIGV0aGVybmV0IG1heGltdW0gcGFja2V0IGxlbmd0aCAoMTUxOCkgYXMgYnVmZmVyIHNpemUuCisJICoKKwkgKiBCZWNhdXNlIG91ciBidWZmZXJzIGFyZSBhdCBtYXhpbXVtIE9GTE8gYW5kIEJVRkYgZXJyb3JzIGFyZQorCSAqIG5vdCB0byBiZSBjb25jZXJuZWQgKHNlZSBEYXRhIHNoZWV0KQorCSAqLworCisJaWYgKChybWRzdGF0ICYgKFJYX1NUUCB8IFJYX0VOUCkpICE9IChSWF9TVFAgfCBSWF9FTlApKQorCXsKKwkgICAgLyogU3RhcnQgb2YgYSBmcmFtZSA+IDE1MTggQnl0ZXMgPyAqLworCisJICAgIGlmIChybWRzdGF0ICYgUlhfU1RQKQorCSAgICB7CisJCXByaW50ZigiJXM6IHBhY2tldCB0b28gbG9uZ1xuIiwgU0tfTkFNRSk7CisJICAgIH0KKworCSAgICAvKgorICAgICAgICAgICAgICogQWxsIG90aGVyIHBhY2tldHMgd2lsbCBiZSBpZ25vcmVkIHVudGlsIGEgbmV3IGZyYW1lIHdpdGgKKwkgICAgICogc3RhcnQgKFJYX1NUUCkgc2V0IGZvbGxvd3MuCisJICAgICAqCisJICAgICAqIFdoYXQgd2UgZG8gaXMganVzdCBnaXZlIGRlc2NyaXB0b3IgZnJlZSBmb3IgbmV3IGluY29taW5nCisJICAgICAqIHBhY2tldHMuCisJICAgICAqLworCisJICAgIHJtZHAtPnUucy5zdGF0dXMgPSBSWF9PV047ICAgICAgLyogUmVsaW5xdWlzaCBvd25lcnNoaXAgdG8gTEFOQ0UgKi8KKworCX0KKwllbHNlIGlmIChybWRzdGF0ICYgUlhfRVJSKSAgICAgICAgICAvKiBSZWNlaXZlIEVycm9yID8gKi8KKwl7CisJICAgIHByaW50ZigiJXM6IFJYIGVycm9yOiAlI2hYXG4iLCBTS19OQU1FLCAoaW50KSBybWRzdGF0KTsKKwkgICAgcm1kcC0+dS5zLnN0YXR1cyA9IFJYX09XTjsgICAgICAvKiBSZWxpbnF1aXNoIG93bmVyc2hpcCB0byBMQU5DRSAqLworCX0KKwllbHNlIC8qIFdlIGhhdmUgYSBwYWNrZXQgd2hpY2ggY2FuIGJlIHF1ZXVlZCBmb3IgdGhlIHVwcGVyIGxheWVycyAqLworCXsKKworCSAgICBpbnQgbGVuID0gKHJtZHAtPm1sZW4gJiAweDBmZmYpOyAgLyogZXh0cmFjdCBtZXNzYWdlIGxlbmd0aCBmcm9tIHJlY2VpdmUgYnVmZmVyICovCisKKwkgICAgLyoKKyAgICAgICAgICAgICAqIENvcHkgZGF0YSBvdXQgb2Ygb3VyIHJlY2VpdmUgZGVzY3JpcHRvciBpbnRvIG5pYy0+cGFja2V0LgorCSAgICAgKgorCSAgICAgKiAocm1kcC0+dS5idWZmZXIgJiAweDAwZmZmZmZmKSAtPiBnZXQgYWRkcmVzcyBvZiBidWZmZXIgYW5kCisJICAgICAqIGlnbm9yZSBzdGF0dXMgZmllbGRzKQorCSAgICAgKi8KKworCSAgICBtZW1jcHkobmljLT5wYWNrZXQsICh1bnNpZ25lZCBjaGFyICopIChybWRwLT51LmJ1ZmZlciAmIDB4MDBmZmZmZmYpLCBuaWMtPnBhY2tldGxlbiA9IGxlbik7CisJICAgIHBhY2tldF90aGVyZSA9IDE7CisKKworCSAgICAvKgorICAgICAgICAgICAgICogUGFja2V0IGlzIHF1ZXVlZCBhbmQgbWFya2VkIGZvciBwcm9jZXNzaW5nIHNvIHdlCisJICAgICAqIGZyZWUgb3VyIGRlc2NyaXB0b3IKKwkgICAgICovCisKKwkgICAgcm1kcC0+dS5zLnN0YXR1cyA9IFJYX09XTjsKKworCSAgICBwLT5ybWRudW0rKzsKKwkgICAgcC0+cm1kbnVtICU9IFJNRE5VTTsKKworCSAgICBybWRwID0gcC0+cm1kaGVhZCArIHAtPnJtZG51bTsKKwl9CisgICAgfQorICAgIFNLX3dyaXRlX3JlZyhDU1IwLCBDU1IwX0lORUEpOyAvKiBFbmFibGUgSW50ZXJydXB0cyAqLworCXJldHVybiAocGFja2V0X3RoZXJlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitUUkFOU01JVCAtIFRyYW5zbWl0IGEgZnJhbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFNLX3RyYW5zbWl0KAorc3RydWN0IG5pYyAqbmljLAorY29uc3QgY2hhciAqZCwJCQkvKiBEZXN0aW5hdGlvbiAqLwordW5zaWduZWQgaW50IHQsCQkJLyogVHlwZSAqLwordW5zaWduZWQgaW50IHMsCQkJLyogc2l6ZSAqLworY29uc3QgY2hhciAqcGFjaykJCS8qIFBhY2tldCAqLworeworCS8qIHNlbmQgdGhlIHBhY2tldCB0byBkZXN0aW5hdGlvbiAqLworICAgIHN0cnVjdCBwcml2ICpwOyAgICAgICAgIC8qIFNLX0cxNiBwcml2YXRlIHN0cnVjdHVyZSAqLworICAgIHN0cnVjdCB0bWQgKnRtZHA7CisgICAgc2hvcnQgbGVuOworICAgIGludCBjc3IwLCBpLCB0bWRzdGF0OworCisgICAgUFJJTlRGMigoIiMjICVzOiBBdCBiZWdpbm5pbmcgb2YgU0tfdHJhbnNtaXQoKS4gQ1NSMDogJSNoWFxuIiwKKyAgICAgICAgICAgU0tfTkFNRSwgU0tfcmVhZF9yZWcoQ1NSMCkpKTsKKwlwID0gbmljLT5wcml2X2RhdGE7CisJdG1kcCA9IHAtPnRtZGhlYWQgKyBwLT50bWRudW07IC8qIFdoaWNoIGRlc2NyaXB0b3IgZm9yIHRyYW5zbWl0dGluZyAqLworCisJLyogQ29weSBkYXRhIGludG8gZHVhbCBwb3J0ZWQgcmFtICovCisKKwltZW1jcHkoJnAtPnJhbS0+dG1kYnVmW3AtPnRtZG51bV1bMF0sIGQsIEVUSF9BTEVOKTsJLyogZHN0ICovCisJbWVtY3B5KCZwLT5yYW0tPnRtZGJ1ZltwLT50bWRudW1dW0VUSF9BTEVOXSwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsgLyogc3JjICovCisJcC0+cmFtLT50bWRidWZbcC0+dG1kbnVtXVtFVEhfQUxFTiArIEVUSF9BTEVOXSA9IHQgPj4gODsJLyogdHlwZSAqLworCXAtPnJhbS0+dG1kYnVmW3AtPnRtZG51bV1bRVRIX0FMRU4gKyBFVEhfQUxFTiArIDFdID0gdDsJLyogdHlwZSAqLworCW1lbWNweSgmcC0+cmFtLT50bWRidWZbcC0+dG1kbnVtXVtFVEhfSExFTl0sIHBhY2ssIHMpOworCXMgKz0gRVRIX0hMRU47CisJd2hpbGUgKHMgPCBFVEhfWkxFTikJLyogcGFkIHRvIG1pbiBsZW5ndGggKi8KKwkJcC0+cmFtLT50bWRidWZbcC0+dG1kbnVtXVtzKytdID0gMDsKKwlwLT5yYW0tPnRtZGVbcC0+dG1kbnVtXS5zdGF0dXMyID0gMHgwOworCisJLyogRXZhbHVhdGUgUGFja2V0IGxlbmd0aCAqLworCWxlbiA9IEVUSF9aTEVOIDwgcyA/IHMgOiBFVEhfWkxFTjsKKworCS8qIEZpbGwgaW4gVHJhbnNtaXQgTWVzc2FnZSBEZXNjcmlwdG9yICovCisKKwl0bWRwLT5ibGVuID0gLWxlbjsgICAgICAgICAgICAvKiBzZXQgbGVuZ3RoIHRvIHRyYW5zbWl0ICovCisKKwkvKgorCSAqIFBhY2tldCBzdGFydCBhbmQgZW5kIGlzIGFsd2F5cyBzZXQgYmVjYXVzZSB3ZSB1c2UgdGhlIG1heGltdW0KKwkgKiBwYWNrZXQgbGVuZ3RoIGFzIGJ1ZmZlciBsZW5ndGguCisJICogUmVsaW5xdWlzaCBvd25lcnNoaXAgdG8gTEFOQ0UKKwkgKi8KKworCXRtZHAtPnUucy5zdGF0dXMgPSBUWF9PV04gfCBUWF9TVFAgfCBUWF9FTlA7CisKKwkvKiBTdGFydCBEZW1hbmQgVHJhbnNtaXNzaW9uICovCisJU0tfd3JpdGVfcmVnKENTUjAsIENTUjBfVERNRCB8IENTUjBfSU5FQSk7CisKKyAgICBjc3IwID0gU0tfcmVhZF9yZWcoQ1NSMCk7ICAgICAgLyogc3RvcmUgcmVnaXN0ZXIgZm9yIGNoZWNraW5nICovCisKKyAgICAvKgorICAgICAqIEFja25vd2xlZGdlIGFsbCBvZiB0aGUgY3VycmVudCBpbnRlcnJ1cHQgc291cmNlcywgZGlzYWJsZQorICAgICAqIEludGVycnVwdHMgKElORUEgPSAwKQorICAgICAqLworCisgICAgU0tfd3JpdGVfcmVnKENTUjAsIGNzcjAgJiBDU1IwX0NMUkFMTCk7CisKKyAgICBpZiAoY3NyMCAmIENTUjBfRVJSKSAvKiBMQU5DRSBFcnJvciAqLworICAgIHsKKwlwcmludGYoIiVzOiBlcnJvcjogJSNoWCIsIFNLX05BTUUsIGNzcjApOworCisgICAgICAgIGlmIChjc3IwICYgQ1NSMF9NSVNTKSAgICAgIC8qIE5vIHBsYWNlIHRvIHN0b3JlIHBhY2tldCA/ICovCisgICAgICAgIHsKKwkJcHJpbnRmKCIsIFBhY2tldCBkcm9wcGVkLiIpOworICAgICAgICB9CisJcHV0Y2hhcignXG4nKTsKKyAgICB9CisKKworICAgIC8qIFNldCBuZXh0IGJ1ZmZlciAqLworICAgIHAtPnRtZGxhc3QrKzsKKyAgICBwLT50bWRsYXN0ICY9IFRNRE5VTS0xOworCisgICAgdG1kc3RhdCA9IHRtZHAtPnUucy5zdGF0dXMgJiAweGZmMDA7IC8qIGZpbHRlciBvdXQgc3RhdHVzIGJpdHMgMTU6MDggKi8KKworICAgIC8qCisgICAgICogV2UgY2hlY2sgc3RhdHVzIG9mIHRyYW5zbWl0dGVkIHBhY2tldC4KKyAgICAgKiBzZWUgTEFOQ0UgZGF0YS1zaGVldCBmb3IgZXJyb3IgZXhwbGFuYXRpb24KKyAgICAgKi8KKyAgICBpZiAodG1kc3RhdCAmIFRYX0VSUikgLyogRXJyb3Igb2NjdXJyZWQgKi8KKyAgICB7CisJcHJpbnRmKCIlczogVFggZXJyb3I6ICUjaFggJSNoWFxuIiwgU0tfTkFNRSwgKGludCkgdG1kc3RhdCwKKwkJKGludCkgdG1kcC0+c3RhdHVzMik7CisKKwlpZiAodG1kcC0+c3RhdHVzMiAmIFRYX1REUikgICAgLyogVERSIHByb2JsZW1zPyAqLworCXsKKwkgICAgcHJpbnRmKCIlczogdGRyLXByb2JsZW1zIFxuIiwgU0tfTkFNRSk7CisJfQorCisgICAgICAgIGlmICh0bWRwLT5zdGF0dXMyICYgVFhfVUZMTykgICAvKiBVbmRlcmZsb3cgZXJyb3IgPyAqLworICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSWYgVUZMTyBlcnJvciBvY2N1cnMgaXQgd2lsbCB0dXJuIHRyYW5zbWl0dGVyIG9mLgorICAgICAgICAgICAgICogU28gd2UgbXVzdCByZWluaXQgTEFOQ0UKKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICBTS19sYW5jZV9pbml0KG5pYywgTU9ERV9OT1JNQUwpOworICAgICAgICB9CisKKwl0bWRwLT5zdGF0dXMyID0gMDsgICAgICAgICAgICAgLyogQ2xlYXIgZXJyb3IgZmxhZ3MgKi8KKyAgICB9CisKKyAgICBTS193cml0ZV9yZWcoQ1NSMCwgQ1NSMF9JTkVBKTsgLyogRW5hYmxlIEludGVycnVwdHMgKi8KKworCS8qIFNldCBwb2ludGVyIHRvIG5leHQgdHJhbnNtaXQgYnVmZmVyICovCisJcC0+dG1kbnVtKys7CisJcC0+dG1kbnVtICY9IFRNRE5VTS0xOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRElTQUJMRSAtIFR1cm4gb2ZmIGV0aGVybmV0IGludGVyZmFjZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgU0tfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpCit7CisgICAgUFJJTlRGKCgiIyMgJXM6IEF0IGJlZ2lubmluZyBvZiBTS19kaXNhYmxlKCkuIENTUjA6ICUjaFhcbiIsCisgICAgICAgICAgIFNLX05BTUUsIFNLX3JlYWRfcmVnKENTUjApKSk7CisgICAgUFJJTlRGKCgiJXM6IFNodXR0aW5nICVzIGRvd24gQ1NSMCAlI2hYXG4iLCBTS19OQU1FLCBTS19OQU1FLAorICAgICAgICAgICAoaW50KSBTS19yZWFkX3JlZyhDU1IwKSkpOworCisgICAgU0tfd3JpdGVfcmVnKENTUjAsIENTUjBfU1RPUCk7IC8qIFNUT1AgdGhlIExBTkNFICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyLCB0aGlzIHJvdXRpbmUncyB2aXNpYmxlIHRvIHRoZSBvdXRzaWRlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgbmljICpTS19wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZV9hZGRycykKK3sKKwl1bnNpZ25lZCBzaG9ydAkJKnA7CisJc3RhdGljIHVuc2lnbmVkIHNob3J0CWlvX2FkZHJzW10gPSBTS19JT19QT1JUUzsKKwkvKiBpZiBwcm9iZV9hZGRycyBpcyAwLCB0aGVuIHJvdXRpbmUgY2FuIHVzZSBhIGhhcmR3aXJlZCBkZWZhdWx0ICovCisJcHV0Y2hhcignXG4nKTsKKwluaWMtPnByaXZfZGF0YSA9ICZwX2RhdGE7CisJaWYgKHByb2JlX2FkZHJzID09IDApCisJCXByb2JlX2FkZHJzID0gaW9fYWRkcnM7CisJZm9yIChwID0gcHJvYmVfYWRkcnM7IChpb2FkZHIgPSAqcCkgIT0gMDsgKytwKQorCXsKKwkJbG9uZwkJb2Zmc2V0MSwgb2Zmc2V0MCA9IGluYihpb2FkZHIpOworCQlpZiAoKG9mZnNldDAgPT0gU0tfSURMT1cpICYmCisJCSAoKG9mZnNldDEgPSBpbmIoaW9hZGRyICsgMSkpID09IFNLX0lESElHSCkpCisJCQlpZiAoU0tfcHJvYmUxKG5pYywgaW9hZGRyKSA+PSAwKQorCQkJCWJyZWFrOworCX0KKwkvKiBpZiBib2FyZCBmb3VuZCAqLworCWlmIChpb2FkZHIgIT0gMCkKKwl7CisJCS8qIHBvaW50IHRvIE5JQyBzcGVjaWZpYyByb3V0aW5lcyAqLworCQluaWMtPnJlc2V0ID0gU0tfcmVzZXQ7CisJCW5pYy0+cG9sbCA9IFNLX3BvbGw7CisJCW5pYy0+dHJhbnNtaXQgPSBTS190cmFuc21pdDsKKwkJbmljLT5kaXNhYmxlID0gU0tfZGlzYWJsZTsKKwkJcmV0dXJuIG5pYzsKKwl9CisJLyogZWxzZSAqLworCXsKKwkJcmV0dXJuIDA7CisJfQorfQorCitpbnQgU0tfcHJvYmUxKHN0cnVjdCBuaWMgKm5pYywgc2hvcnQgaW9hZGRyMSkKK3sKKyAgICBpbnQgaSxqOyAgICAgICAgICAgICAgICAvKiBDb3VudGVycyAqLworICAgIGludCBza19hZGRyX2ZsYWcgPSAwOyAgIC8qIFNLIEFERFIgY29ycmVjdD8gMSAtIG5vLCAwIC0geWVzICovCisgICAgdW5zaWduZWQgaW50IHJvbV9hZGRyOyAgLyogdXNlZCB0byBzdG9yZSBSQU0gYWRkcmVzcyB1c2VkIGZvciBQT1NfQUREUiAqLworCisgICAgc3RydWN0IHByaXYgKnA7ICAgICAgICAgLyogU0tfRzE2IHByaXZhdGUgc3RydWN0dXJlICovCisKKyAgICBpZiAoU0tfQUREUiAmIDB4M2ZmZiB8fCBTS19BRERSIDwgMHhhMDAwMCkKKyAgICB7CisgICAgICAgLyoKKyAgICAgICAgKiBOb3cgaGVyZSB3ZSBjb3VsZCB1c2UgYSByb3V0aW5lIHdoaWNoIHNlYXJjaGVzIGZvciBhIGZyZWUKKyAgICAgICAgKiBwbGFjZSBpbiB0aGUgcmFtIGFuZCBzZXQgU0tfQUREUiBpZiBmb3VuZC4gVE9ETy4KKyAgICAgICAgKi8KKyAgICAgICAgICAgIHByaW50ZigiJXM6IFNLX0FERFIgJSNoWCBpcyBub3QgdmFsaWQuIENoZWNrIGNvbmZpZ3VyYXRpb24uXG4iLAorICAgICAgICAgICAgICAgICAgICBTS19OQU1FLCBTS19BRERSKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByb21fYWRkciA9IFNLX0FERFI7CisKKyAgICBvdXRiKFNLX1JPTV9SQU1fT0ZGLCBTS19QT1MyKTsgLyogQm9vdF9ST00gKyBSQU0gb2ZmICovCisgICAgb3V0YihQT1NfQUREUiwgU0tfUE9TMyk7ICAgICAgIC8qIFNldCBSQU0gYWRkcmVzcyAqLworICAgIG91dGIoU0tfUk9NX1JBTV9PTiwgU0tfUE9TMik7ICAvKiBSQU0gb24sIEJPT1RfUk9NIG9uICovCisjaWZkZWYJU0tfREVCVUcKKyAgICBTS19wcmludF9wb3MobmljLCAiUE9TIHJlZ2lzdGVycyBhZnRlciBST00sIFJBTSBjb25maWciKTsKKyNlbmRpZgorCisgICAgYm9hcmQgPSAoU0tfUkFNICopIHJvbV9hZGRyOworCVBSSU5URigoImFkclswXTogJWhYLCBhZHJbMV06ICVoWCwgYWRyWzJdOiAlaFhcbiIsCisJYm9hcmQtPnJvbVswXSwgYm9hcmQtPnJvbVsyXSwgYm9hcmQtPnJvbVs0XSkpOworCisgICAgLyogUmVhZCBpbiBzdGF0aW9uIGFkZHJlc3MgKi8KKyAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IEVUSF9BTEVOOyBpKyssIGorPTIpCisgICAgeworCSoobmljLT5ub2RlX2FkZHIraSkgPSBib2FyZC0+cm9tW2pdOworICAgIH0KKworICAgIC8qIENoZWNrIGZvciBtYW51ZmFjdHVyZXIgY29kZSAqLworI2lmZGVmCVNLX0RFQlVHCisgICAgaWYgKCEoKihuaWMtPm5vZGVfYWRkciswKSA9PSBTS19NQUMwICYmCisJICAqKG5pYy0+bm9kZV9hZGRyKzEpID09IFNLX01BQzEgJiYKKwkgICoobmljLT5ub2RlX2FkZHIrMikgPT0gU0tfTUFDMikgKQorICAgIHsKKyAgICAgICAgUFJJTlRGKCgiIyMgJXM6IFdlIGRpZCBub3QgZmluZCBTS19HMTYgYXQgUkFNIGxvY2F0aW9uLlxuIiwKKyAgICAgICAgICAgICAgICBTS19OQU1FKSk7CisJcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgIC8qIE5PIFNLX0cxNiBmb3VuZCAqLworICAgIH0KKyNlbmRpZgorCisgICAgcCA9IG5pYy0+cHJpdl9kYXRhOworCisgICAgLyogSW5pdGlhbGl6ZSBwcml2YXRlIHN0cnVjdHVyZSAqLworCisgICAgcC0+cmFtID0gKHN0cnVjdCBTS19yYW0gKikgcm9tX2FkZHI7IC8qIFNldCBkdWFsIHBvcnRlZCBSQU0gYWRkciAqLworICAgIHAtPnRtZGhlYWQgPSAmKHAtPnJhbSktPnRtZGVbMF07ICAgICAvKiBTZXQgVE1EIGhlYWQgKi8KKyAgICBwLT5ybWRoZWFkID0gJihwLT5yYW0pLT5ybWRlWzBdOyAgICAgLyogU2V0IFJNRCBoZWFkICovCisKKyAgICBwcmludGYoIlNjaG5laWRlciAmIEtvY2ggRzE2IGF0ICUjaFgsIG1lbSBhdCAlI2hYLCBIVyBhZGRyOiAlIVxuIiwKKwkgICAgKHVuc2lnbmVkIGludCkgaW9hZGRyLCAodW5zaWduZWQgaW50KSBwLT5yYW0sIG5pYy0+bm9kZV9hZGRyKTsKKworICAgIC8qIEluaXRpYWxpemUgYnVmZmVyIHBvaW50ZXJzICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgVE1ETlVNOyBpKyspCisgICAgeworCXAtPnRtZGJ1ZnNbaV0gPSBwLT5yYW0tPnRtZGJ1ZltpXTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgUk1ETlVNOyBpKyspCisgICAgeworCXAtPnJtZGJ1ZnNbaV0gPSBwLT5yYW0tPnJtZGJ1ZltpXTsKKyAgICB9CisgICAgaSA9IDA7CisKKyAgICBpZiAoIShpID0gU0tfbGFuY2VfaW5pdChuaWMsIE1PREVfTk9STUFMKSkpICAvKiBMQU5DRSBpbml0IE9LPyAqLworICAgIHsKKworI2lmZGVmCVNLX0RFQlVHCisgICAgICAgIC8qCisgICAgICAgICAqIFRoaXMgZGVidWcgYmxvY2sgdHJpZXMgdG8gc3RvcCBMQU5DRSwKKyAgICAgICAgICogcmVpbml0IExBTkNFIHdpdGggdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyIGRpc2FibGVkLAorICAgICAgICAgKiB0aGVuIHN0b3AgYWdhaW4gYW5kIHJlaW5pdCB3aXRoIE5PUk1BTF9NT0RFCisgICAgICAgICAqLworCisgICAgICAgIHByaW50ZigiIyMgJXM6IEFmdGVyIGxhbmNlIGluaXQuIENTUjA6ICUjaFhcbiIsCisgICAgICAgICAgICAgICBTS19OQU1FLCBTS19yZWFkX3JlZyhDU1IwKSk7CisgICAgICAgIFNLX3dyaXRlX3JlZyhDU1IwLCBDU1IwX1NUT1ApOworICAgICAgICBwcmludGYoIiMjICVzOiBMQU5DRSBzdG9wcGVkLiBDU1IwOiAlI2hYXG4iLAorICAgICAgICAgICAgICAgU0tfTkFNRSwgU0tfcmVhZF9yZWcoQ1NSMCkpOworICAgICAgICBTS19sYW5jZV9pbml0KG5pYywgTU9ERV9EVFggfCBNT0RFX0RSWCk7CisgICAgICAgIHByaW50ZigiIyMgJXM6IFJlaW5pdCB3aXRoIERUWCArIERSWCBvZmYuIENTUjA6ICUjaFhcbiIsCisgICAgICAgICAgICAgICBTS19OQU1FLCBTS19yZWFkX3JlZyhDU1IwKSk7CisgICAgICAgIFNLX3dyaXRlX3JlZyhDU1IwLCBDU1IwX1NUT1ApOworICAgICAgICBwcmludGYoIiMjICVzOiBMQU5DRSBzdG9wcGVkLiBDU1IwOiAlI2hYXG4iLAorICAgICAgICAgICAgICAgU0tfTkFNRSwgU0tfcmVhZF9yZWcoQ1NSMCkpOworICAgICAgICBTS19sYW5jZV9pbml0KG5pYywgTU9ERV9OT1JNQUwpOworICAgICAgICBwcmludGYoIiMjICVzOiBMQU5DRSBiYWNrIHRvIG5vcm1hbCBtb2RlLiBDU1IwOiAlI2hYXG4iLAorICAgICAgICAgICAgICAgU0tfTkFNRSwgU0tfcmVhZF9yZWcoQ1NSMCkpOworICAgICAgICBTS19wcmludF9wb3MobmljLCAiUE9TIHJlZ3MgYmVmb3JlIHJldHVybmluZyBPSyIpOworCisjZW5kaWYJLyogU0tfREVCVUcgKi8KKworICAgIH0KKyAgICBlbHNlIC8qIExBTkNFIGluaXQgZmFpbGVkICovCisgICAgeworCisJUFJJTlRGKCgiIyMgJXM6IExBTkNFIGluaXQgZmFpbGVkOiBDU1IwOiAlI2hYXG4iLAorICAgICAgICAgICAgICAgU0tfTkFNRSwgU0tfcmVhZF9yZWcoQ1NSMCkpKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisjaWZkZWYJU0tfREVCVUcKKyAgICBTS19wcmludF9wb3MobmljLCAiRW5kIG9mIFNLX3Byb2JlMSIpOworICAgIFNLX3ByaW50X3JhbShuaWMpOworI2VuZGlmCisKKyAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6YXRpb24gZG9uZSAqLworCit9IC8qIEVuZCBvZiBTS19wcm9iZTEoKSAqLworCitzdGF0aWMgaW50IFNLX2xhbmNlX2luaXQoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCBtb2RlKQoreworICAgIGludCBpOworICAgIHN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIG5pYy0+cHJpdl9kYXRhOworICAgIHN0cnVjdCB0bWQgICp0bWRwOworICAgIHN0cnVjdCBybWQgICpybWRwOworCisgICAgUFJJTlRGKCgiIyMgJXM6IEF0IGJlZ2lubmluZyBvZiBMQU5DRSBpbml0LiBDU1IwOiAlI2hYXG4iLAorICAgICAgICAgICBTS19OQU1FLCBTS19yZWFkX3JlZyhDU1IwKSkpOworCisgICAgLyogUmVzZXQgTEFOQ0UgKi8KKyAgICBTS19yZXNldF9ib2FyZCgpOworCisgICAgLyogSW5pdGlhbGl6ZSBUTUQncyB3aXRoIHN0YXJ0IHZhbHVlcyAqLworICAgIHAtPnRtZG51bSA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIEZpcnN0IGRlc2NyaXB0b3IgZm9yIHRyYW5zbWl0dGluZyAqLworICAgIHAtPnRtZGxhc3QgPSAwOyAgICAgICAgICAgICAgICAgIC8qIEZpcnN0IGRlc2NyaXB0b3IgZm9yIHJlYWRpbmcgc3RhdHMgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBUTUROVU07IGkrKykgICAgIC8qIEluaXQgYWxsIFRNRCdzICovCisgICAgeworCXRtZHAgPSBwLT50bWRoZWFkICsgaTsKKworCXRtZHAtPnUuYnVmZmVyID0gKHVuc2lnbmVkIGxvbmcpIHAtPnRtZGJ1ZnNbaV07IC8qIGFzc2lnbiBidWZmZXIgKi8KKworCS8qIE1hcmsgVE1EIGFzIHN0YXJ0IGFuZCBlbmQgb2YgcGFja2V0ICovCisJdG1kcC0+dS5zLnN0YXR1cyA9IFRYX1NUUCB8IFRYX0VOUDsKKyAgICB9CisKKworICAgIC8qIEluaXRpYWxpemUgUk1EJ3Mgd2l0aCBzdGFydCB2YWx1ZXMgKi8KKworICAgIHAtPnJtZG51bSA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIEZpcnN0IFJNRCB3aGljaCB3aWxsIGJlIHVzZWQgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBSTUROVU07IGkrKykgICAgIC8qIEluaXQgYWxsIFJNRCdzICovCisgICAgeworCXJtZHAgPSBwLT5ybWRoZWFkICsgaTsKKworCisJcm1kcC0+dS5idWZmZXIgPSAodW5zaWduZWQgbG9uZykgcC0+cm1kYnVmc1tpXTsgLyogYXNzaWduIGJ1ZmZlciAqLworCisJLyoKKyAgICAgICAgICogTEFOQ0UgbXVzdCBiZSBvd25lciBhdCBiZWdpbm5pbmcgc28gdGhhdCBoZSBjYW4gZmlsbCBpbgorCSAqIHJlY2VpdmluZyBwYWNrZXRzLCBzZXQgc3RhdHVzIGFuZCByZWxlYXNlIFJNRAorCSAqLworCisJcm1kcC0+dS5zLnN0YXR1cyA9IFJYX09XTjsKKworCXJtZHAtPmJsZW4gPSAtUEtUX0JVRl9TWjsgICAgLyogQnVmZmVyIFNpemUgaW4gYSB0d28ncyBjb21wbGVtZW50ICovCisKKwlybWRwLT5tbGVuID0gMDsgICAgICAgICAgICAgIC8qIGluaXQgbWVzc2FnZSBsZW5ndGggKi8KKworICAgIH0KKworICAgIC8qIEZpbGwgTEFOQ0UgSW5pdGlhbGl6ZSBCbG9jayAqLworCisgICAgKHAtPnJhbSktPmliLm1vZGUgPSBtb2RlOyAgICAgICAgLyogU2V0IG9wZXJhdGlvbiBtb2RlICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykgICAvKiBTZXQgcGh5c2ljYWwgYWRkcmVzcyAqLworICAgIHsKKwkocC0+cmFtKS0+aWIucGFkZHJbaV0gPSAqKG5pYy0+bm9kZV9hZGRyK2kpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspICAgICAgICAgIC8qIFNldCBtdWx0aWNhc3QsIGxvZ2ljYWwgYWRkcmVzcyAqLworICAgIHsKKwkocC0+cmFtKS0+aWIubGFkZHJbaV0gPSAwOyAgIC8qIFdlIGRvIG5vdCB1c2UgbG9naWNhbCBhZGRyZXNzaW5nICovCisgICAgfQorCisgICAgLyogU2V0IHJpbmcgZGVzY3JpcHRvciBwb2ludGVycyBhbmQgc2V0IG51bWJlciBvZiBkZXNjcmlwdG9ycyAqLworCisgICAgKHAtPnJhbSktPmliLnJkcnAgPSAoaW50KSAgcC0+cm1kaGVhZCB8IFJNRE5VTU1BU0s7CisgICAgKHAtPnJhbSktPmliLnRkcnAgPSAoaW50KSAgcC0+dG1kaGVhZCB8IFRNRE5VTU1BU0s7CisKKyAgICAvKiBQcmVwYXJlIExBTkNFIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlcnMgKi8KKworICAgIFNLX3dyaXRlX3JlZyhDU1IzLCBDU1IzX0FDT04pOyAgIC8qIEFsZSBDb250cm9sICEhIVRISVMgTVVTVCBCRSBTRVQhISEhICovCisKKyAgICAvKgorICAgICAqIExBTkNFIGFkZHJlc3NlcyB0aGUgUkFNIGZyb20gMHgwMDAwIHRvIDB4M2ZiZiBhbmQgaGFzIG5vIGFjY2VzcyB0bworICAgICAqIFBDIE1lbW9yeSBsb2NhdGlvbnMuCisgICAgICoKKyAgICAgKiBJbiBzdHJ1Y3R1cmUgU0tfcmFtIGlzIGRlZmluZWQgdGhhdCB0aGUgZmlyc3QgdGhpbmcgaW4gcmFtCisgICAgICogaXMgdGhlIGluaXRpYWxpemF0aW9uIGJsb2NrLiBTbyBoaXMgYWRkcmVzcyBpcyBmb3IgTEFOQ0UgYWx3YXlzCisgICAgICogMHgwMDAwCisgICAgICoKKyAgICAgKiBDU1IxIGNvbnRhaW5zIGxvdyBvcmRlciBiaXRzIDE1OjAgb2YgaW5pdGlhbGl6YXRpb24gYmxvY2sgYWRkcmVzcworICAgICAqIENTUjIgaXMgYnVpbHQgb2Y6CisgICAgICogICAgNzowICBIaWdoIG9yZGVyIGJpdHMgMjM6MTYgb2YgaW5pdGlhbGl6YXRpb24gYmxvY2sgYWRkcmVzcworICAgICAqICAgMTU6OCAgcmVzZXJ2ZWQsIG11c3QgYmUgMAorICAgICAqLworCisgICAgLyogU2V0IGluaXRpYWxpemF0aW9uIGJsb2NrIGFkZHJlc3MgKG11c3QgYmUgb24gd29yZCBib3VuZGFyeSkgKi8KKyAgICBTS193cml0ZV9yZWcoQ1NSMSwgMCk7ICAgICAgICAgIC8qIFNldCBsb3cgb3JkZXIgYml0cyAxNTowICovCisgICAgU0tfd3JpdGVfcmVnKENTUjIsIDApOyAgICAgICAgICAvKiBTZXQgaGlnaCBvcmRlciBiaXRzIDIzOjE2ICovCisKKworICAgIFBSSU5URigoIiMjICVzOiBBZnRlciBzZXR0aW5nIENTUjEtMy4gQ1NSMDogJSNoWFxuIiwKKyAgICAgICAgICAgU0tfTkFNRSwgU0tfcmVhZF9yZWcoQ1NSMCkpKTsKKworICAgIC8qIEluaXRpYWxpemUgTEFOQ0UgKi8KKworICAgIC8qCisgICAgICogSU5JVCA9IEluaXRpYWxpemUsIHdoZW4gc2V0LCBjYXVzZXMgdGhlIExBTkNFIHRvIGJlZ2luIHRoZQorICAgICAqIGluaXRpYWxpemF0aW9uIHByb2NlZHVyZSBhbmQgYWNjZXNzIHRoZSBJbml0IEJsb2NrLgorICAgICAqLworCisgICAgU0tfd3JpdGVfcmVnKENTUjAsIENTUjBfSU5JVCk7CisKKyAgICAvKiBXYWl0IHVudGlsIExBTkNFIGZpbmlzaGVkIGluaXRpYWxpemF0aW9uICovCisKKyAgICBTS19zZXRfUkFQKENTUjApOyAgICAgICAgICAgICAgLyogUmVnaXN0ZXIgQWRkcmVzcyBQb2ludGVyIHRvIENTUjAgKi8KKworICAgIGZvciAoaSA9IDA7IChpIDwgMTAwKSAmJiAhKFNLX3JyZWFkX3JlZygpICYgQ1NSMF9JRE9OKTsgaSsrKQorCTsgLyogV2FpdCB1bnRpbCBpbml0IGRvbmUgb3IgZ28gYWhlYWQgaWYgcHJvYmxlbXMgKGk+PTEwMCkgKi8KKworICAgIGlmIChpID49IDEwMCkgLyogU29tZXRoaW5nIGlzIHdyb25nICEgKi8KKyAgICB7CisJcHJpbnRmKCIlczogY2FuJ3QgaW5pdCBhbTc5OTAsIHN0YXR1czogJSNoWCAiCisJICAgICAgICJpbml0X2Jsb2NrOiAlI2hYXG4iLAorCQlTS19OQU1FLCAoaW50KSBTS19yZWFkX3JlZyhDU1IwKSwKKwkJKHVuc2lnbmVkIGludCkgJihwLT5yYW0pLT5pYik7CisKKyNpZmRlZglTS19ERUJVRworCVNLX3ByaW50X3BvcyhuaWMsICJMQU5DRSBJTklUIGZhaWxlZCIpOworI2VuZGlmCisKKwlyZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAvKiBMQU5DRSBpbml0IGZhaWxlZCAqLworICAgIH0KKworICAgIFBSSU5URigoIiMjICVzOiBpbml0IGRvbmUgYWZ0ZXIgJWQgdGlja3NcbiIsIFNLX05BTUUsIGkpKTsKKworICAgIC8qIENsZWFyIEluaXRpYWxpemUgZG9uZSwgZW5hYmxlIEludGVycnVwdHMsIHN0YXJ0IExBTkNFICovCisKKyAgICBTS193cml0ZV9yZWcoQ1NSMCwgQ1NSMF9JRE9OIHwgQ1NSMF9JTkVBIHwgQ1NSMF9TVFJUKTsKKworICAgIFBSSU5URigoIiMjICVzOiBMQU5DRSBzdGFydGVkLiBDU1IwOiAlI2hYXG4iLCBTS19OQU1FLAorICAgICAgICAgICAgU0tfcmVhZF9yZWcoQ1NSMCkpKTsKKworICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBMQU5DRSBpcyB1cCBhbmQgcnVubmluZyAqLworCit9IC8qIEVuZCBvZiBTS19sYW5jZV9pbml0KCkgKi8KKworLyogTEFOQ0UgYWNjZXNzIGZ1bmN0aW9ucworICoKKyAqICEgQ1NSMS0zIGNhbiBvbmx5IGJlIGFjY2Vzc2VkIHdoZW4gaW4gQ1NSMCB0aGUgU1RPUCBiaXQgaXMgc2V0ICEKKyAqLworCitzdGF0aWMgdm9pZCBTS19yZXNldF9ib2FyZCh2b2lkKQoreworICAgIGludCBpOworCisJUFJJTlRGKCgiIyMgJXM6IEF0IGJlZ2lubmluZyBvZiBTS19yZXNldF9ib2FyZC5cbiIsIFNLX05BTUUpKTsKKyAgICBTS19QT1JUID0gMHgwMDsgICAgICAgICAgIC8qIFJlc2V0IGFjdGl2ZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCAxMCA7IGkrKykgLyogRGVsYXkgbWluIDVtcyAqLworCTsKKyAgICBTS19QT1JUID0gU0tfUkVTRVQ7ICAgICAgIC8qIFNldCBiYWNrIHRvIG5vcm1hbCBvcGVyYXRpb24gKi8KKworfSAvKiBFbmQgb2YgU0tfcmVzZXRfYm9hcmQoKSAqLworCitzdGF0aWMgdm9pZCBTS19zZXRfUkFQKGludCByZWdfbnVtYmVyKQoreworICAgIFNLX0lPUkVHID0gcmVnX251bWJlcjsKKyAgICBTS19QT1JUICA9IFNLX1JFU0VUIHwgU0tfUkFQIHwgU0tfV1JFRzsKKyAgICBTS19JT0NPTSA9IFNLX0RPSU87CisKKyAgICB3aGlsZSAoU0tfUE9SVCAmIFNLX0lPUlVOKQorCTsKK30gLyogRW5kIG9mIFNLX3NldF9SQVAoKSAqLworCitzdGF0aWMgaW50IFNLX3JlYWRfcmVnKGludCByZWdfbnVtYmVyKQoreworICAgIFNLX3NldF9SQVAocmVnX251bWJlcik7CisKKyAgICBTS19QT1JUICA9IFNLX1JFU0VUIHwgU0tfUkRBVEEgfCBTS19SUkVHOworICAgIFNLX0lPQ09NID0gU0tfRE9JTzsKKworICAgIHdoaWxlIChTS19QT1JUICYgU0tfSU9SVU4pCisJOworICAgIHJldHVybiAoU0tfSU9SRUcpOworCit9IC8qIEVuZCBvZiBTS19yZWFkX3JlZygpICovCisKK3N0YXRpYyBpbnQgU0tfcnJlYWRfcmVnKHZvaWQpCit7CisgICAgU0tfUE9SVCAgPSBTS19SRVNFVCB8IFNLX1JEQVRBIHwgU0tfUlJFRzsKKworICAgIFNLX0lPQ09NID0gU0tfRE9JTzsKKworICAgIHdoaWxlIChTS19QT1JUICYgU0tfSU9SVU4pCisJOworICAgIHJldHVybiAoU0tfSU9SRUcpOworCit9IC8qIEVuZCBvZiBTS19ycmVhZF9yZWcoKSAqLworCitzdGF0aWMgdm9pZCBTS193cml0ZV9yZWcoaW50IHJlZ19udW1iZXIsIGludCB2YWx1ZSkKK3sKKyAgICBTS19zZXRfUkFQKHJlZ19udW1iZXIpOworCisgICAgU0tfSU9SRUcgPSB2YWx1ZTsKKyAgICBTS19QT1JUICA9IFNLX1JFU0VUIHwgU0tfUkRBVEEgfCBTS19XUkVHOworICAgIFNLX0lPQ09NID0gU0tfRE9JTzsKKworICAgIHdoaWxlIChTS19QT1JUICYgU0tfSU9SVU4pCisJOworfSAvKiBFbmQgb2YgU0tfd3JpdGVfcmVnICovCisKKy8qCisgKiBEZWJ1Z2dpbmcgZnVuY3Rpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmZGVmCVNLX0RFQlVHCitzdGF0aWMgdm9pZCBTS19wcmludF9wb3Moc3RydWN0IG5pYyAqbmljLCBjaGFyICp0ZXh0KQoreworCisgICAgdW5zaWduZWQgY2hhciBwb3MwID0gaW5iKFNLX1BPUzApLAorCQkgIHBvczEgPSBpbmIoU0tfUE9TMSksCisJCSAgcG9zMiA9IGluYihTS19QT1MyKSwKKwkJICBwb3MzID0gaW5iKFNLX1BPUzMpLAorCQkgIHBvczQgPSBpbmIoU0tfUE9TNCk7CisKKworICAgIHByaW50ZigiIyMgJXM6ICVzLlxuIgorICAgICAgICAgICAiIyMgICBwb3MwPSUjaFggcG9zMT0lI2hYIHBvczI9JSNoWCBwb3MzPSUjaFggcG9zND0lI2hYXG4iLAorICAgICAgICAgICBTS19OQU1FLCB0ZXh0LCBwb3MwLCBwb3MxLCBwb3MyLCAocG9zMzw8MTQpLCBwb3M0KTsKKworfSAvKiBFbmQgb2YgU0tfcHJpbnRfcG9zKCkgKi8KKworc3RhdGljIHZvaWQgU0tfcHJpbnRfcmFtKHN0cnVjdCBuaWMgKm5pYykKK3sKKworICAgIGludCBpOworICAgIHN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIG5pYy0+cHJpdl9kYXRhOworCisgICAgcHJpbnRmKCIjIyAlczogUkFNIERldGFpbHMuXG4iCisgICAgICAgICAgICIjIyAgIFJBTSBhdCAlI2hYIHRtZGhlYWQ6ICUjaFggcm1kaGVhZDogJSNoWCBpbml0YmxvY2s6ICUjaFhcbiIsCisgICAgICAgICAgIFNLX05BTUUsCisgICAgICAgICAgICh1bnNpZ25lZCBpbnQpIHAtPnJhbSwKKyAgICAgICAgICAgKHVuc2lnbmVkIGludCkgcC0+dG1kaGVhZCwKKyAgICAgICAgICAgKHVuc2lnbmVkIGludCkgcC0+cm1kaGVhZCwKKyAgICAgICAgICAgKHVuc2lnbmVkIGludCkgJihwLT5yYW0pLT5pYik7CisKKyAgICBwcmludGYoIiMjICAgIik7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBUTUROVU07IGkrKykKKyAgICB7CisgICAgICAgICAgIGlmICghKGkgJSAzKSkgLyogRXZlcnkgdGhpcmQgbGluZSBkbyBhIG5ld2xpbmUgKi8KKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcHJpbnRmKCJcbiMjICAgIik7CisgICAgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJ0bWRidWZzJWQ6ICUjaFggIiwgKGkrMSksIChpbnQpIHAtPnRtZGJ1ZnNbaV0pOworICAgIH0KKyAgICBwcmludGYoIiMjICAgIik7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBSTUROVU07IGkrKykKKyAgICB7CisgICAgICAgICBpZiAoIShpICUgMykpIC8qIEV2ZXJ5IHRoaXJkIGxpbmUgZG8gYSBuZXdsaW5lICovCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHByaW50ZigiXG4jIyAgICIpOworICAgICAgICAgICB9CisgICAgICAgIHByaW50Zigicm1kYnVmcyVkOiAlI2hYICIsIChpKzEpLCAoaW50KSBwLT5ybWRidWZzW2ldKTsKKyAgICB9CisgICAgcHV0Y2hhcignXG4nKTsKKworfSAvKiBFbmQgb2YgU0tfcHJpbnRfcmFtKCkgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0Ym9vdC9za19nMTYuaCBiL25ldGJvb3Qvc2tfZzE2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZjMmMyYQotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3Qvc2tfZzE2LmgKQEAgLTAsMCArMSwxNjggQEAKKy8qLQorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIE1vZHVsZSAgICAgICAgIDogc2tfZzE2LmgKKyAqIFZlcnNpb24gICAgICAgIDogJFJldmlzaW9uOiAxLjMgJAorICoKKyAqIEF1dGhvciAgICAgICAgIDogTS5IaXBwIChtaGlwcEBzdHVkZW50LnVuaS10dWViaW5nZW4uZGUpCisgKiBjaGFuZ2VzIGJ5ICAgICA6IFBhdHJpY2sgSi5ELiBXZWljaG1hbm4KKyAqCisgKiBEYXRlIENyZWF0ZWQgICA6IDk0LzA1LzI1CisgKgorICogRGVzY3JpcHRpb24gICAgOiBJbiBoZXJlIGFyZSBhbGwgbmVjZXNzYXJ5IGRlZmluaXRpb25zIG9mCisgKiAgICAgICAgICAgICAgICAgIHRoZSBhbTc5OTAgKExBTkNFKSBjaGlwIHVzZWQgZm9yIHdyaXRpbmcgYQorICogICAgICAgICAgICAgICAgICBuZXR3b3JrIGRldmljZSBkcml2ZXIgd2hpY2ggdXNlcyB0aGlzIGNoaXAKKyAqCisgKiAkTG9nOiBza19nMTYuaCx2ICQKKyAqIFJldmlzaW9uIDEuMyAgMjAwMC8wNy8yOSAxOToyMjo1NCAgb2t1amkKKyAqIHVwZGF0ZSB0aGUgbmV0d29yayBzdXBwb3J0IHRvIGV0aGVyYm9vdC00LjYuNC4KKyAqCistKi8KKworI2lmbmRlZglTS19HMTZfSAorCisjZGVmaW5lIFNLX0cxNl9ICisKKworLyoKKyAqCUNvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlciAwIChDU1IwKSBiaXQgZGVmaW5pdGlvbnMKKyAqCisgKiAoUj1SZWFkYWJsZSkgKFc9V3JpdGVhYmxlKSAoUz1TZXQgb24gd3JpdGUpIChDLUNsZWFyIG9uIHdyaXRlKQorICoKKyAqLworCisjZGVmaW5lIENTUjBfRVJSCTB4ODAwMAkvKiBFcnJvciBzdW1tYXJ5IChSKSAqLworI2RlZmluZSBDU1IwX0JBQkwJMHg0MDAwCS8qIEJhYmJsZSB0cmFuc21pdHRlciB0aW1lb3V0IGVycm9yIChSQykgKi8KKyNkZWZpbmUgQ1NSMF9DRVJSCTB4MjAwMAkvKiBDb2xsaXNpb24gRXJyb3IgKFJDKSAqLworI2RlZmluZSBDU1IwX01JU1MJMHgxMDAwCS8qIE1pc3NlZCBwYWNrZXQgKFJDKSAqLworI2RlZmluZSBDU1IwX01FUlIJMHgwODAwCS8qIE1lbW9yeSBFcnJvciAgKFJDKSAqLworI2RlZmluZSBDU1IwX1JJTlQJMHgwNDAwCS8qIFJlY2VpdmVyIEludGVycnVwdCAoUkMpICovCisjZGVmaW5lIENTUjBfVElOVCAgICAgICAweDAyMDAJLyogVHJhbnNtaXQgSW50ZXJydXB0IChSQykgKi8KKyNkZWZpbmUgQ1NSMF9JRE9OCTB4MDEwMAkvKiBJbml0aWFsaXphdGlvbiBEb25lIChSQykgKi8KKyNkZWZpbmUgQ1NSMF9JTlRSCTB4MDA4MAkvKiBJbnRlcnJ1cHQgRmxhZyAoUikgKi8KKyNkZWZpbmUgQ1NSMF9JTkVBCTB4MDA0MAkvKiBJbnRlcnJ1cHQgRW5hYmxlIChSVykgKi8KKyNkZWZpbmUgQ1NSMF9SWE9OCTB4MDAyMAkvKiBSZWNlaXZlciBvbiAoUikgKi8KKyNkZWZpbmUgQ1NSMF9UWE9OCTB4MDAxMCAgLyogVHJhbnNtaXR0ZXIgb24gKFIpICovCisjZGVmaW5lIENTUjBfVERNRAkweDAwMDgJLyogVHJhbnNtaXQgRGVtYW5kIChSUykgKi8KKyNkZWZpbmUgQ1NSMF9TVE9QCTB4MDAwNAkvKiBTdG9wIChSUykgKi8KKyNkZWZpbmUgQ1NSMF9TVFJUCTB4MDAwMgkvKiBTdGFydCAoUlMpICovCisjZGVmaW5lIENTUjBfSU5JVAkweDAwMDEJLyogSW5pdGlhbGl6ZSAoUlMpICovCisKKyNkZWZpbmUgQ1NSMF9DTFJBTEwgICAgIDB4N2YwMCAgLyogbWFzayBmb3IgYWxsIGNsZWFyYWJsZSBiaXRzICovCisKKy8qCisgKiAgICBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgMyAoQ1NSMykgYml0IGRlZmluaXRpb25zCisgKgorICovCisKKyNkZWZpbmUgQ1NSM19CU1dBUAkweDAwMDQJLyogQnl0ZSBTd2FwIChSVykgKi8KKyNkZWZpbmUgQ1NSM19BQ09OCTB4MDAwMiAgLyogQUxFIENvbnRyb2wgKFJXKSAqLworI2RlZmluZSBDU1IzX0JDT04JMHgwMDAxCS8qIEJ5dGUgQ29udHJvbCAoUlcpICovCisKKy8qCisgKglJbml0aWFsaXphdGlvbiBCbG9jayBNb2RlIG9wZXJhdGlvbiBCaXQgRGVmaW5pdGlvbnMuCisgKi8KKworI2RlZmluZSBNT0RFX1BST00JMHg4MDAwCS8qIFByb21pc2N1b3VzIE1vZGUgKi8KKyNkZWZpbmUgTU9ERV9JTlRMCTB4MDA0MCAgLyogSW50ZXJuYWwgTG9vcGJhY2sgKi8KKyNkZWZpbmUgTU9ERV9EUlRZCTB4MDAyMCAgLyogRGlzYWJsZSBSZXRyeSAqLworI2RlZmluZSBNT0RFX0NPTEwJMHgwMDEwCS8qIEZvcmNlIENvbGxpc2lvbiAqLworI2RlZmluZSBNT0RFX0RUQ1IJMHgwMDA4CS8qIERpc2FibGUgVHJhbnNtaXQgQ1JDKSAqLworI2RlZmluZSBNT0RFX0xPT1AJMHgwMDA0CS8qIExvb3BiYWNrICovCisjZGVmaW5lIE1PREVfRFRYCTB4MDAwMgkvKiBEaXNhYmxlIHRoZSBUcmFuc21pdHRlciAqLworI2RlZmluZSBNT0RFX0RSWAkweDAwMDEgIC8qIERpc2FibGUgdGhlIFJlY2VpdmVyICovCisKKyNkZWZpbmUgTU9ERV9OT1JNQUwJMHgwMDAwICAvKiBOb3JtYWwgb3BlcmF0aW9uIG1vZGUgKi8KKworLyoKKyAqCVJlY2VpdmUgbWVzc2FnZSBkZXNjcmlwdG9yIHN0YXR1cyBiaXQgZGVmaW5pdGlvbnMuCisgKi8KKworI2RlZmluZSBSWF9PV04JCTB4ODAJLyogT3duZXIgYml0IDAgPSBob3N0LCAxID0gbGFuY2UgKi8KKyNkZWZpbmUgUlhfRVJSCQkweDQwCS8qIEVycm9yIFN1bW1hcnkgKi8KKyNkZWZpbmUgUlhfRlJBTQkJMHgyMAkvKiBGcmFtaW5nIEVycm9yICovCisjZGVmaW5lIFJYX09GTE8JCTB4MTAJLyogT3ZlcmZsb3cgRXJyb3IgKi8KKyNkZWZpbmUgUlhfQ1JDCQkweDA4CS8qIENSQyBFcnJvciAqLworI2RlZmluZSBSWF9CVUZGCQkweDA0CS8qIEJ1ZmZlciBFcnJvciAqLworI2RlZmluZSBSWF9TVFAJCTB4MDIJLyogU3RhcnQgb2YgUGFja2V0ICovCisjZGVmaW5lIFJYX0VOUAkJMHgwMQkvKiBFbmQgb2YgUGFja2V0ICovCisKKworLyoKKyAqCVRyYW5zbWl0IG1lc3NhZ2UgZGVzY3JpcHRvciBzdGF0dXMgYml0IGRlZmluaXRpb25zLgorICovCisKKyNkZWZpbmUgVFhfT1dOCQkweDgwCS8qIE93bmVyIGJpdCAwID0gaG9zdCwgMSA9IGxhbmNlICovCisjZGVmaW5lIFRYX0VSUgkJMHg0MCAgICAvKiBFcnJvciBTdW1tYXJ5ICovCisjZGVmaW5lIFRYX01PUkUJCTB4MTAJLyogTW9yZSB0aGUgMSByZXRyeSBuZWVkZWQgdG8gWG1pdCAqLworI2RlZmluZSBUWF9PTkUJCTB4MDgJLyogT25lIHJldHJ5IG5lZWRlZCB0byBYbWl0ICovCisjZGVmaW5lIFRYX0RFRgkJMHgwNAkvKiBEZWZlcnJlZCAqLworI2RlZmluZSBUWF9TVFAJCTB4MDIJLyogU3RhcnQgb2YgUGFja2V0ICovCisjZGVmaW5lIFRYX0VOUAkJMHgwMQkvKiBFbmQgb2YgUGFja2V0ICovCisKKy8qCisgKiAgICAgIFRyYW5zbWl0IHN0YXR1cyAoMikgKHZhbGlkIGlmIFRYX0VSUiA9PSAxKQorICovCisKKyNkZWZpbmUgVFhfQlVGRgkJMHg4MDAwICAvKiBCdWZmZXJpbmcgZXJyb3IgKG5vIEVOUCkgKi8KKyNkZWZpbmUgVFhfVUZMTwkJMHg0MDAwICAvKiBVbmRlcmZsb3cgKGxhdGUgbWVtb3J5KSAqLworI2RlZmluZSBUWF9MQ09MCQkweDEwMDAgIC8qIExhdGUgY29sbGlzaW9uICovCisjZGVmaW5lIFRYX0xDQVIJCTB4MDQwMCAgLyogTG9zcyBvZiBDYXJyaWVyICovCisjZGVmaW5lIFRYX1JUUlkJCTB4MDIwMCAgLyogRmFpbGVkIGFmdGVyIDE2IHJldHJhbnNtaXNzaW9ucyAgKi8KKyNkZWZpbmUgVFhfVERSICAgICAgICAgIDB4MDAzZiAgLyogVGltZS1kb21haW4tcmVmbGVjdG9tZXRlci12YWx1ZSAqLworCisKKy8qCisgKiBTdHJ1Y3R1cmVzIHVzZWQgZm9yIENvbW11bmljYXRpb24gd2l0aCB0aGUgTEFOQ0UKKyAqLworCisvKiBMQU5DRSBJbml0aWFsaXplIEJsb2NrICovCisKK3N0cnVjdCBpbml0X2Jsb2NrCit7CisgIHVuc2lnbmVkIHNob3J0IG1vZGU7ICAgICAvKiBNb2RlIFJlZ2lzdGVyICovCisgIHVuc2lnbmVkIGNoYXIgIHBhZGRyWzZdOyAvKiBQaHlzaWNhbCBBZGRyZXNzIChNQUMpICovCisgIHVuc2lnbmVkIGNoYXIgIGxhZGRyWzhdOyAvKiBMb2dpY2FsIEZpbHRlciBBZGRyZXNzIChub3QgdXNlZCkgKi8KKyAgdW5zaWduZWQgaW50ICAgcmRycDsgICAgIC8qIFJlY2VpdmUgRGVzY3JpcHRvciBSaW5nIHBvaW50ZXIgKi8KKyAgdW5zaWduZWQgaW50ICAgdGRycDsgICAgIC8qIFRyYW5zbWl0IERlc2NyaXB0b3IgUmluZyBwb2ludGVyICovCit9OworCisKKy8qIFJlY2VpdmUgTWVzc2FnZSBEZXNjcmlwdG9yIEVudHJ5ICovCisKK3N0cnVjdCBybWQKK3sKKyAgdW5pb24gcm1kX3UKKyAgeworICAgIHVuc2lnbmVkIGxvbmcgYnVmZmVyOyAgICAgLyogQWRkcmVzcyBvZiBidWZmZXIgKi8KKyAgICBzdHJ1Y3Qgcm1kX3MKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyIHVudXNlZFszXTsKKyAgICAgIHVuc2lnbmVkIHZvbGF0aWxlIGNoYXIgc3RhdHVzOyAgIC8qIFN0YXR1cyBCaXRzICovCisgICAgfSBzOworICB9IHU7CisgIHZvbGF0aWxlIHNob3J0IGJsZW47ICAgICAgICAvKiBCdWZmZXIgTGVuZ3RoICh0d28ncyBjb21wbGVtZW50KSAqLworICB1bnNpZ25lZCBzaG9ydCBtbGVuOyAgICAgICAgLyogTWVzc2FnZSBCeXRlIENvdW50ICovCit9OworCisKKy8qIFRyYW5zbWl0IE1lc3NhZ2UgRGVzY3JpcHRvciBFbnRyeSAqLworCitzdHJ1Y3QgdG1kCit7CisgIHVuaW9uIHRtZF91CisgIHsKKyAgICB1bnNpZ25lZCBsb25nICBidWZmZXI7ICAgIC8qIEFkZHJlc3Mgb2YgYnVmZmVyICovCisgICAgc3RydWN0IHRtZF9zCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciB1bnVzZWRbM107CisgICAgICB1bnNpZ25lZCB2b2xhdGlsZSBjaGFyIHN0YXR1czsgICAvKiBTdGF0dXMgQml0cyAqLworICAgIH0gczsKKyAgfSB1OworICB1bnNpZ25lZCBzaG9ydCBibGVuOyAgICAgICAgICAgICAvKiBCdWZmZXIgTGVuZ3RoICh0d28ncyBjb21wbGVtZW50KSAqLworICB1bnNpZ25lZCB2b2xhdGlsZSBzaG9ydCBzdGF0dXMyOyAvKiBFcnJvciBTdGF0dXMgQml0cyAqLworfTsKKworI2VuZGlmCS8qIEVuZCBvZiBTS19HMTZfSCAqLwpkaWZmIC0tZ2l0IGEvbmV0Ym9vdC9zbWM5MDAwLmMgYi9uZXRib290L3NtYzkwMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzg0YTEzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC9zbWM5MDAwLmMKQEAgLTAsMCArMSw1MjIgQEAKKyAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogc21jOTAwMC5jCisgKiBUaGlzIGlzIGEgRXRoZXJib290IGRyaXZlciBmb3IgU01DJ3MgOTAwMCBzZXJpZXMgb2YgRXRoZXJuZXQgY2FyZHMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4IERhbmllbCBFbmdzdHL2bSA8ZGFuaWVsLmVuZ3N0cm9tQHJpa3NuZXR0Lm5vPgorICogQmFzZWQgb24gdGhlIExpbnV4IFNNQzkwMDAgZHJpdmVyLCBzbWM5MTk0LmMgYnkgRXJpYyBTdGFobG1hbgorICogQ29weXJpZ2h0IChDKSAxOTk2IGJ5IEVyaWsgU3RhaGxtYW4gPGVyaWNAdnQuZWR1PgorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqICJGZWF0dXJlcyIgb2YgdGhlIFNNQyBjaGlwOgorICogICA0NjA4IGJ5dGUgcGFja2V0IG1lbW9yeS4gKCBmb3IgdGhlIDkxQzkyLzQuICBPdGhlcnMgaGF2ZSBtb3JlICkKKyAqICAgRUVQUk9NIGZvciBjb25maWd1cmF0aW9uCisgKiAgIEFVSS9UUCBzZWxlY3Rpb24KKyAqCisgKiBBdXRob3JzCisgKglFcmlrIFN0YWhsbWFuCQkJCTxlcmlrQHZ0LmVkdT4KKyAqICAgICAgRGFuaWVsIEVuZ3N0cvZtICAgICAgICAgICAgICAgICAgICAgICAgIDxkYW5pZWwuZW5nc3Ryb21Acmlrc25ldHQubm8+CisgKgorICogSGlzdG9yeQorICogOTgtMDktMjUgICAgICAgICAgICAgIERhbmllbCBFbmdzdHL2bSBFdGhlcmJvb3QgZHJpdmVyIGNyYXRlZCBmcm9tIEVyaWMncworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW51eCBkcml2ZXIuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBMSU5VWF9PVVRfTUFDUk9TIDEKKyNkZWZpbmUgU01DOTAwMF9WRVJCT1NFICAxCisjZGVmaW5lIFNNQzkwMDBfREVCVUcgICAgMAorCisjaW5jbHVkZSAiZXRoZXJib290LmgiCisjaW5jbHVkZSAibmljLmgiCisjaW5jbHVkZSAiY2FyZHMuaCIKKyNpbmNsdWRlICJzbWM5MDAwLmgiCisKKyMgZGVmaW5lIF9vdXRiIG91dGIKKyMgZGVmaW5lIF9vdXR3IG91dHcKKworc3RhdGljIGNvbnN0IGNoYXIgICAgICAgc21jOTAwMF92ZXJzaW9uW10gPSAiVmVyc2lvbiAwLjk5IDk4LTA5LTMwIjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQJc21jOTAwMF9iYXNlPTA7CitzdGF0aWMgY29uc3QgY2hhciAgICAgICAqaW50ZXJmYWNlc1sgMiBdID0geyAiVFAiLCAiQVVJIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgICAgICAgKmNoaXBfaWRzWyAxNSBdID0gIHsKKyAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAvKiAzICovICJTTUM5MUM5MC85MUM5MiIsCisgICAvKiA0ICovICJTTUM5MUM5NCIsCisgICAvKiA1ICovICJTTUM5MUM5NSIsCisgICBOVUxMLAorICAgLyogNyAqLyAiU01DOTFDMTAwIiwKKyAgIC8qIDggKi8gIlNNQzkxQzEwMEZEIiwKKyAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICBOVUxMLCBOVUxMLCBOVUxMCit9Oworc3RhdGljIGNvbnN0IGNoYXIgICAgICBzbWM5MWM5Nl9pZFtdID0gIlNNQzkxQzk2IjsKKworLyoKKyAqIEZ1bmN0aW9uOiBzbWNfcmVzZXQoIGludCBpb2FkZHIgKQorICogUHVycG9zZToKKyAqCVRoaXMgc2V0cyB0aGUgU01DOTF4eCBjaGlwIHRvIGl0cyBub3JtYWwgc3RhdGUsIGhvcGVmdWxseSBmcm9tIHdoYXRldmVyCisgKgltZXNzIHRoYXQgYW55IG90aGVyIERPUyBkcml2ZXIgaGFzIHB1dCBpdCBpbi4KKyAqCisgKiBNYXliZSBJIHNob3VsZCByZXNldCBtb3JlIHJlZ2lzdGVycyB0byBkZWZhdWx0cyBpbiBoZXJlPyAgU09GVFJFU0VUICBzaG91bGQKKyAqIGRvIHRoYXQgZm9yIG1lLgorICoKKyAqIE1ldGhvZDoKKyAqCTEuICBzZW5kIGEgU09GVCBSRVNFVAorICoJMi4gIHdhaXQgZm9yIGl0IHRvIGZpbmlzaAorICoJMy4gIHJlc2V0IHRoZSBtZW1vcnkgbWFuYWdlbWVudCB1bml0CisgKiAgICAgIDQuICBjbGVhciBhbGwgaW50ZXJydXB0cworICoKKyovCitzdGF0aWMgdm9pZCBzbWNfcmVzZXQoaW50IGlvYWRkcikKK3sKKyAgIC8qIFRoaXMgcmVzZXRzIHRoZSByZWdpc3RlcnMgbW9zdGx5IHRvIGRlZmF1bHRzLCBidXQgZG9lc24ndAorICAgICogYWZmZWN0IEVFUFJPTS4gIFRoYXQgc2VlbXMgdW5uZWNlc3NhcnkgKi8KKyAgIFNNQ19TRUxFQ1RfQkFOSyhpb2FkZHIsIDApOworICAgX291dHcoIFJDUl9TT0ZUUkVTRVQsIGlvYWRkciArIFJDUiApOworCisgICAvKiB0aGlzIHNob3VsZCBwYXVzZSBlbm91Z2ggZm9yIHRoZSBjaGlwIHRvIGJlIGhhcHB5ICovCisgICBTTUNfREVMQVkoaW9hZGRyKTsKKworICAgLyogU2V0IHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyB0bworICAgICogZGVmYXVsdCB2YWx1ZXMgKi8KKyAgIF9vdXR3KFJDUl9DTEVBUiwgaW9hZGRyICsgUkNSKTsKKyAgIF9vdXR3KFRDUl9DTEVBUiwgaW9hZGRyICsgVENSKTsKKworICAgLyogUmVzZXQgdGhlIE1NVSAqLworICAgU01DX1NFTEVDVF9CQU5LKGlvYWRkciwgMik7CisgICBfb3V0dyggTUNfUkVTRVQsIGlvYWRkciArIE1NVV9DTUQgKTsKKworICAgLyogTm90ZTogIEl0IGRvZXNuJ3Qgc2VlbSB0aGF0IHdhaXRpbmcgZm9yIHRoZSBNTVUgYnVzeSBpcyBuZWVkZWQgaGVyZSwKKyAgICAqIGJ1dCB0aGlzIGlzIGEgcGxhY2Ugd2hlcmUgZnV0dXJlIGNoaXBzZXRzIF9DT1VMRF8gYnJlYWsuICBCZSB3YXJ5CisgICAgKiBvZiBpc3N1aW5nIGFub3RoZXIgTU1VIGNvbW1hbmQgcmlnaHQgYWZ0ZXIgdGhpcyAqLworICAgX291dGIoMCwgaW9hZGRyICsgSU5UX01BU0spOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246IHNtY19wcm9iZSggaW50IGlvYWRkciApCisgKgorICogUHVycG9zZToKKyAqCVRlc3RzIHRvIHNlZSBpZiBhIGdpdmVuIGlvYWRkciBwb2ludHMgdG8gYW4gU01DOXh4eCBjaGlwLgorICoJUmV0dXJucyBhIDAgb24gc3VjY2VzcworICoKKyAqIEFsZ29yaXRobToKKyAqCSgxKSBzZWUgaWYgdGhlIGhpZ2ggYnl0ZSBvZiBCQU5LX1NFTEVDVCBpcyAweDMzCisgKgkoMikgY29tcGFyZSB0aGUgaW9hZGRyIHdpdGggdGhlIGJhc2UgcmVnaXN0ZXIncyBhZGRyZXNzCisgKgkoMykgc2VlIGlmIEkgcmVjb2duaXplIHRoZSBjaGlwIElEIGluIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlcgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50IHNtY19wcm9iZSggaW50IGlvYWRkciApCit7CisgICB3b3JkIGJhbms7CisgICB3b3JkCXJldmlzaW9uX3JlZ2lzdGVyOworICAgd29yZCBiYXNlX2FkZHJlc3NfcmVnaXN0ZXI7CisKKyAgIC8qIEZpcnN0LCBzZWUgaWYgdGhlIGhpZ2ggYnl0ZSBpcyAweDMzICovCisgICBiYW5rID0gaW53KGlvYWRkciArIEJBTktfU0VMRUNUKTsKKyAgIGlmICgoYmFuayAmIDB4RkYwMCkgIT0gMHgzMzAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICB9CisgICAvKiBUaGUgYWJvdmUgTUlHSFQgaW5kaWNhdGUgYSBkZXZpY2UsIGJ1dCBJIG5lZWQgdG8gd3JpdGUgdG8gZnVydGhlcgorICAgICoJdGVzdCB0aGlzLiAgKi8KKyAgIF9vdXR3KDB4MCwgaW9hZGRyICsgQkFOS19TRUxFQ1QpOworICAgYmFuayA9IGludyhpb2FkZHIgKyBCQU5LX1NFTEVDVCk7CisgICBpZiAoKGJhbmsgJiAweEZGMDApICE9IDB4MzMwMCkgeworICAgICAgcmV0dXJuIC0xOworICAgfQorCisgICAvKiB3ZWxsLCB3ZSd2ZSBhbHJlYWR5IHdyaXR0ZW4gb25jZSwgc28gaG9wZWZ1bGx5IGFub3RoZXIgdGltZSB3b24ndAorICAgICogIGh1cnQuICBUaGlzIHRpbWUsIEkgbmVlZCB0byBzd2l0Y2ggdGhlIGJhbmsgcmVnaXN0ZXIgdG8gYmFuayAxLAorICAgICogIHNvIEkgY2FuIGFjY2VzcyB0aGUgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyICovCisgICBTTUNfU0VMRUNUX0JBTksoaW9hZGRyLCAxKTsKKyAgIGJhc2VfYWRkcmVzc19yZWdpc3RlciA9IGludyhpb2FkZHIgKyBCQVNFKTsKKworICAgaWYgKGlvYWRkciAhPSAoYmFzZV9hZGRyZXNzX3JlZ2lzdGVyID4+IDMgJiAweDNFMCkpICB7CisjaWZkZWYJU01DOTAwMF9WRVJCT1NFCisgICAgICBwcmludGYoIlNNQzkwMDA6IElPQUREUiAlaFggZG9lc24ndCBtYXRjaCBjb25maWd1cmF0aW9uICglaFgpLiIKKwkgICAgICJQcm9iYWJseSBub3QgYSBTTUMgY2hpcFxuIiwKKwkgICAgIGlvYWRkciwgYmFzZV9hZGRyZXNzX3JlZ2lzdGVyID4+IDMgJiAweDNFMCk7CisjZW5kaWYKKyAgICAgIC8qIHdlbGwsIHRoZSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgZGlkbid0IG1hdGNoLiAgTXVzdCBub3QgaGF2ZQorICAgICAgICogYmVlbiBhIFNNQyBjaGlwIGFmdGVyIGFsbC4gKi8KKyAgICAgIHJldHVybiAtMTsKKyAgIH0KKworCisgICAvKiBjaGVjayBpZiB0aGUgcmV2aXNpb24gcmVnaXN0ZXIgaXMgc29tZXRoaW5nIHRoYXQgSSByZWNvZ25pemUuCisgICAgKiBUaGVzZSBtaWdodCBuZWVkIHRvIGJlIGFkZGVkIHRvIGxhdGVyLCBhcyBmdXR1cmUgcmV2aXNpb25zCisgICAgKiBjb3VsZCBiZSBhZGRlZC4gICovCisgICBTTUNfU0VMRUNUX0JBTksoaW9hZGRyLCAzKTsKKyAgIHJldmlzaW9uX3JlZ2lzdGVyICA9IGludyhpb2FkZHIgKyBSRVZJU0lPTik7CisgICBpZiAoIWNoaXBfaWRzWyhyZXZpc2lvbl9yZWdpc3RlciA+PiA0KSAmIDB4Rl0pIHsKKyAgICAgIC8qIEkgZG9uJ3QgcmVjb2duaXplIHRoaXMgY2hpcCwgc28uLi4gKi8KKyNpZmRlZglTTUM5MDAwX1ZFUkJPU0UKKyAgICAgIHByaW50ZigiU01DOTAwMDogSU8gJWhYOiBVbnJlY29nbml6ZWQgcmV2aXNpb24gcmVnaXN0ZXI6IgorCSAgICAgIiAlaFgsIENvbnRhY3QgYXV0aG9yLlxuIiwgaW9hZGRyLCByZXZpc2lvbl9yZWdpc3Rlcik7CisjZW5kaWYKKyAgICAgIHJldHVybiAtMTsKKyAgIH0KKworICAgLyogYXQgdGhpcyBwb2ludCBJJ2xsIGFzc3VtZSB0aGF0IHRoZSBjaGlwIGlzIGFuIFNNQzl4eHguCisgICAgKiBJdCBtaWdodCBiZSBwcnVkZW50IHRvIGNoZWNrIGEgbGlzdGluZyBvZiBNQUMgYWRkcmVzc2VzCisgICAgKiBhZ2FpbnN0IHRoZSBoYXJkd2FyZSBhZGRyZXNzLCBvciBkbyBzb21lIG90aGVyIHRlc3RzLiAqLworICAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFVEhfUkVTRVQgLSBSZXNldCBhZGFwdGVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzbWM5MDAwX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKK3sKKyAgIHNtY19yZXNldChzbWM5MDAwX2Jhc2UpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEVUSF9UUkFOU01JVCAtIFRyYW5zbWl0IGEgZnJhbWUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBzbWM5MDAwX3RyYW5zbWl0KAorCXN0cnVjdCBuaWMgKm5pYywKKwljb25zdCBjaGFyICpkLAkJCS8qIERlc3RpbmF0aW9uICovCisJdW5zaWduZWQgaW50IHQsCQkJLyogVHlwZSAqLworCXVuc2lnbmVkIGludCBzLAkJCS8qIHNpemUgKi8KKwljb25zdCBjaGFyICpwKQkJCS8qIFBhY2tldCAqLworeworICAgd29yZCBsZW5ndGg7IC8qIHJlYWwsIGxlbmd0aCBpbmNsLiBoZWFkZXIgKi8KKyAgIHdvcmQgbnVtUGFnZXM7CisgICB1bnNpZ25lZCBsb25nIHRpbWVfb3V0OworICAgYnl0ZQlwYWNrZXRfbm87CisgICB3b3JkIHN0YXR1czsKKyAgIGludCBpOworCisgICAvKiBXZSBkb250IHBhZCBoZXJlIHNpbmNlIHdlIGNhbiBoYXZlIHRoZSBoYXJkd2FyZSBkb2luZyBpdCBmb3IgdXMgKi8KKyAgIGxlbmd0aCA9IChzICsgRVRIX0hMRU4gKyAxKSZ+MTsKKworICAgLyogY29udmVydCB0byBNTVUgcGFnZXMgKi8KKyAgIG51bVBhZ2VzID0gbGVuZ3RoIC8gMjU2OworCisgICBpZiAobnVtUGFnZXMgPiA3ICkgeworI2lmZGVmCVNNQzkwMDBfVkVSQk9TRQorICAgICAgcHJpbnRmKCJTTUM5MDAwOiBGYXIgdG9vIGJpZyBwYWNrZXQgZXJyb3IuIFxuIik7CisjZW5kaWYKKyAgICAgIHJldHVybjsKKyAgIH0KKworICAgLyogZG9udCB0cnkgbW9yZSB0aGFuLCBzYXkgMzAgdGltZXMgKi8KKyAgIGZvciAoaT0wO2k8MzA7aSsrKSB7CisgICAgICAvKiBub3csIHRyeSB0byBhbGxvY2F0ZSB0aGUgbWVtb3J5ICovCisgICAgICBTTUNfU0VMRUNUX0JBTksoc21jOTAwMF9iYXNlLCAyKTsKKyAgICAgIF9vdXR3KE1DX0FMTE9DIHwgbnVtUGFnZXMsIHNtYzkwMDBfYmFzZSArIE1NVV9DTUQpOworCisgICAgICBzdGF0dXMgPSAwOworICAgICAgLyogd2FpdCBmb3IgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHRvIGZpbm5pc2ggKi8KKyAgICAgIGZvciAodGltZV9vdXQgPSBjdXJydGlja3MoKSArIDUqVElDS1NfUEVSX1NFQzsgY3VycnRpY2tzKCkgPCB0aW1lX291dDsgKSB7CisJIHN0YXR1cyA9IGluYihzbWM5MDAwX2Jhc2UgKyBJTlRFUlJVUFQpOworCSBpZiAoIHN0YXR1cyAmIElNX0FMTE9DX0lOVCApIHsKKwkgICAgLyogYWNrbm93bGVkZ2UgdGhlIGludGVycnVwdCAqLworCSAgICBfb3V0YihJTV9BTExPQ19JTlQsIHNtYzkwMDBfYmFzZSArIElOVEVSUlVQVCk7CisJICAgIGJyZWFrOworCSB9CisgICAgICB9CisKKyAgICAgIGlmICgoc3RhdHVzICYgSU1fQUxMT0NfSU5UKSAhPSAwICkgeworCSAvKiBXZSd2ZSBnb3QgdGhlIG1lbW9yeSAqLworCSBicmVhazsKKyAgICAgIH0gZWxzZSB7CisJIHByaW50ZigiU01DOTAwMDogTWVtb3J5IGFsbG9jYXRpb24gdGltZWQgb3V0LCByZXNldHRpbmcgTU1VLlxuIik7CisJIF9vdXR3KE1DX1JFU0VULCBzbWM5MDAwX2Jhc2UgKyBNTVVfQ01EKTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogSWYgSSBnZXQgaGVyZSwgSSBfa25vd18gdGhlcmUgaXMgYSBwYWNrZXQgc2xvdCB3YWl0aW5nIGZvciBtZSAqLworICAgcGFja2V0X25vID0gaW5iKHNtYzkwMDBfYmFzZSArIFBOUl9BUlIgKyAxKTsKKyAgIGlmIChwYWNrZXRfbm8gJiAweDgwKSB7CisgICAgICAvKiBvciBpc24ndCB0aGVyZT8gIEJBRCBDSElQISAqLworICAgICAgcHJpbnRmKCJTTUM5MDAwOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuIFxuIik7CisgICAgICByZXR1cm47CisgICB9CisKKyAgIC8qIHdlIGhhdmUgYSBwYWNrZXQgYWRkcmVzcywgc28gdGVsbCB0aGUgY2FyZCB0byB1c2UgaXQgKi8KKyAgIF9vdXRiKHBhY2tldF9ubywgc21jOTAwMF9iYXNlICsgUE5SX0FSUik7CisKKyAgIC8qIHBvaW50IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhY2tldCAqLworICAgX291dHcoUFRSX0FVVE9JTkMsIHNtYzkwMDBfYmFzZSArIFBPSU5URVIpOworCisjaWYJU01DOTAwMF9ERUJVRyA+IDIKKyAgIHByaW50ZigiVHJ5aW5nIHRvIHhtaXQgcGFja2V0IG9mIGxlbmd0aCAlaFhcbiIsIGxlbmd0aCApOworI2VuZGlmCisKKyAgIC8qIHNlbmQgdGhlIHBhY2tldCBsZW5ndGggKCArNiBmb3Igc3RhdHVzLCBsZW5ndGggYW5kIGN0bCBieXRlICkKKyAgICAqIGFuZCB0aGUgc3RhdHVzIHdvcmQgKCBzZXQgdG8gemVyb3MgKSAqLworICAgX291dHcoMCwgc21jOTAwMF9iYXNlICsgREFUQV8xICk7CisKKyAgIC8qIHNlbmQgdGhlIHBhY2tldCBsZW5ndGggKCArNiBmb3Igc3RhdHVzIHdvcmRzLCBsZW5ndGgsIGFuZCBjdGwpICovCisgICBfb3V0YigobGVuZ3RoKzYpICYgMHhGRiwgIHNtYzkwMDBfYmFzZSArIERBVEFfMSk7CisgICBfb3V0YigobGVuZ3RoKzYpID4+IDggLCAgIHNtYzkwMDBfYmFzZSArIERBVEFfMSk7CisKKyAgIC8qIFdyaXRlIHRoZSBjb250ZW50cyBvZiB0aGUgcGFja2V0ICovCisKKyAgIC8qIFRoZSBldGhlcm5ldCBoZWFkZXIgZmlyc3QuLi4gKi8KKyAgIG91dHN3KHNtYzkwMDBfYmFzZSArIERBVEFfMSwgZCwgRVRIX0FMRU4gPj4gMSk7CisgICBvdXRzdyhzbWM5MDAwX2Jhc2UgKyBEQVRBXzEsIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTiA+PiAxKTsKKyAgIF9vdXR3KGh0b25zKHQpLCBzbWM5MDAwX2Jhc2UgKyBEQVRBXzEpOworCisgICAvKiAuLi4gdGhlIGRhdGEgLi4uICovCisgICBvdXRzdyhzbWM5MDAwX2Jhc2UgKyBEQVRBXzEgLCBwLCBzID4+IDEpOworCisgICAvKiAuLi4gYW5kIHRoZSBsYXN0IGJ5dGUsIGlmIHRoZXJlIGlzIG9uZS4gICAqLworICAgaWYgKChzICYgMSkgPT0gMCkgeworICAgICAgX291dHcoMCwgc21jOTAwMF9iYXNlICsgREFUQV8xKTsKKyAgIH0gZWxzZSB7CisgICAgICBfb3V0YihwW3MtMV0sIHNtYzkwMDBfYmFzZSArIERBVEFfMSk7CisgICAgICBfb3V0YigweDIwLCBzbWM5MDAwX2Jhc2UgKyBEQVRBXzEpOworICAgfQorCisgICAvKiBhbmQgbGV0IHRoZSBjaGlwc2V0IGRlYWwgd2l0aCBpdCAqLworICAgX291dHcoTUNfRU5RVUVVRSAsIHNtYzkwMDBfYmFzZSArIE1NVV9DTUQpOworCisgICBzdGF0dXMgPSAwOyB0aW1lX291dCA9IGN1cnJ0aWNrcygpICsgNSpUSUNLU19QRVJfU0VDOworICAgZG8geworICAgICAgc3RhdHVzID0gaW5iKHNtYzkwMDBfYmFzZSArIElOVEVSUlVQVCk7CisKKyAgICAgIGlmICgoc3RhdHVzICYgSU1fVFhfSU5UICkgIT0gMCkgeworCSB3b3JkIHR4X3N0YXR1czsKKworCSAvKiBhY2sgaW50ZXJydXB0ICovCisJIF9vdXRiKElNX1RYX0lOVCwgc21jOTAwMF9iYXNlICsgSU5URVJSVVBUKTsKKworCSBwYWNrZXRfbm8gPSBpbncoc21jOTAwMF9iYXNlICsgRklGT19QT1JUUyk7CisJIHBhY2tldF9ubyAmPSAweDdGOworCisJIC8qIHNlbGVjdCB0aGlzIGFzIHRoZSBwYWNrZXQgdG8gcmVhZCBmcm9tICovCisJIF9vdXRiKCBwYWNrZXRfbm8sIHNtYzkwMDBfYmFzZSArIFBOUl9BUlIgKTsKKworCSAvKiByZWFkIHRoZSBmaXJzdCB3b3JkIGZyb20gdGhpcyBwYWNrZXQgKi8KKwkgX291dHcoIFBUUl9BVVRPSU5DIHwgUFRSX1JFQUQsIHNtYzkwMDBfYmFzZSArIFBPSU5URVIgKTsKKworCSB0eF9zdGF0dXMgPSBpbncoIHNtYzkwMDBfYmFzZSArIERBVEFfMSApOworCisJIGlmICgwID09ICh0eF9zdGF0dXMgJiBUU19TVUNDRVNTKSkgeworI2lmZGVmCVNNQzkwMDBfVkVSQk9TRQorCSAgICBwcmludGYoIlNNQzkwMDA6IFRYIEZBSUwgU1RBVFVTOiAlaFggXG4iLCB0eF9zdGF0dXMpOworI2VuZGlmCisJICAgIC8qIHJlLWVuYWJsZSB0cmFuc21pdCAqLworCSAgICBTTUNfU0VMRUNUX0JBTksoc21jOTAwMF9iYXNlLCAwKTsKKwkgICAgX291dHcoaW53KHNtYzkwMDBfYmFzZSArIFRDUiApIHwgVENSX0VOQUJMRSwgc21jOTAwMF9iYXNlICsgVENSICk7CisJIH0KKworCSAvKiBraWxsIHRoZSBwYWNrZXQgKi8KKwkgU01DX1NFTEVDVF9CQU5LKHNtYzkwMDBfYmFzZSwgMik7CisJIF9vdXR3KE1DX0ZSRUVQS1QsIHNtYzkwMDBfYmFzZSArIE1NVV9DTUQpOworCisJIHJldHVybjsKKyAgICAgIH0KKyAgIH13aGlsZShjdXJydGlja3MoKSA8IHRpbWVfb3V0KTsKKworICAgcHJpbnRmKCJTTUM5MDAwOiBXYXJpbmcgVFggdGltZWQgb3V0LCByZXNldHRpbmcgYm9hcmRcbiIpOworICAgc21jX3Jlc2V0KHNtYzkwMDBfYmFzZSk7CisgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRVRIX1BPTEwgLSBXYWl0IGZvciBhIGZyYW1lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBzbWM5MDAwX3BvbGwoc3RydWN0IG5pYyAqbmljKQoreworICAgaWYoIXNtYzkwMDBfYmFzZSkKKyAgICAgcmV0dXJuIDA7CisKKyAgIFNNQ19TRUxFQ1RfQkFOSyhzbWM5MDAwX2Jhc2UsIDIpOworICAgaWYgKGludyhzbWM5MDAwX2Jhc2UgKyBGSUZPX1BPUlRTKSAmIEZQX1JYRU1QVFkpCisgICAgIHJldHVybiAwOworCisgICAvKiAgc3RhcnQgcmVhZGluZyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcGFja2V0ICovCisgICBfb3V0dyhQVFJfUkVBRCB8IFBUUl9SQ1YgfCBQVFJfQVVUT0lOQywgc21jOTAwMF9iYXNlICsgUE9JTlRFUik7CisKKyAgIC8qIEZpcnN0IHJlYWQgdGhlIHN0YXR1cyBhbmQgY2hlY2sgdGhhdCB3ZSdyZSBvayAqLworICAgaWYgKCEoaW53KHNtYzkwMDBfYmFzZSArIERBVEFfMSkgJiBSU19FUlJPUlMpKSB7CisgICAgICAvKiBOZXh0OiByZWFkIHRoZSBwYWNrZXQgbGVuZ3RoIGFuZCBtYXNrIG9mZiB0aGUgdG9wIGJpdHMgKi8KKyAgICAgIG5pYy0+cGFja2V0bGVuID0gKGludyhzbWM5MDAwX2Jhc2UgKyBEQVRBXzEpICYgMHgwN2ZmKTsKKworICAgICAgLyogdGhlIHBhY2tldCBsZW5ndGggaW5jbHVkZXMgdGhlIDMgZXh0cmEgd29yZHMgKi8KKyAgICAgIG5pYy0+cGFja2V0bGVuIC09IDY7CisjaWYJU01DOTAwMF9ERUJVRyA+IDIKKyAgICAgIHByaW50ZigiIFJlYWRpbmcgJWQgd29yZHMgKGFuZCAlZCBieXRlKHMpKVxuIiwKKwkgICAgICAgKG5pYy0+cGFja2V0bGVuID4+IDEpLCBuaWMtPnBhY2tldGxlbiAmIDEpOworI2VuZGlmCisgICAgICAvKiByZWFkIHRoZSBwYWNrZXQgKGFuZCB0aGUgbGFzdCAiZXh0cmEiIHdvcmQpICovCisgICAgICBpbnN3KHNtYzkwMDBfYmFzZSArIERBVEFfMSwgbmljLT5wYWNrZXQsIChuaWMtPnBhY2tldGxlbisyKSA+PiAxKTsKKyAgICAgIC8qIGlzIHRoZXJlIGFuIG9kZCBsYXN0IGJ5dGUgPyAqLworICAgICAgaWYgKG5pYy0+cGFja2V0W25pYy0+cGFja2V0bGVuKzFdICYgMHgyMCkKKwkgbmljLT5wYWNrZXRsZW4rKzsKKworICAgICAgLyogIGVycm9yIG9yIGdvb2QsIHRlbGwgdGhlIGNhcmQgdG8gZ2V0IHJpZCBvZiB0aGlzIHBhY2tldCAqLworICAgICAgX291dHcoTUNfUkVMRUFTRSwgc21jOTAwMF9iYXNlICsgTU1VX0NNRCk7CisgICAgICByZXR1cm4gMTsKKyAgIH0KKworICAgcHJpbnRmKCJTTUM5MDAwOiBSWCBlcnJvclxuIik7CisgICAvKiAgZXJyb3Igb3IgZ29vZCwgdGVsbCB0aGUgY2FyZCB0byBnZXQgcmlkIG9mIHRoaXMgcGFja2V0ICovCisgICBfb3V0dyhNQ19SRUxFQVNFLCBzbWM5MDAwX2Jhc2UgKyBNTVVfQ01EKTsKKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbWM5MDAwX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQoreworICAgaWYoIXNtYzkwMDBfYmFzZSkKKyAgICAgcmV0dXJuOworCisgICAvKiBubyBtb3JlIGludGVycnVwdHMgZm9yIG1lICovCisgICBTTUNfU0VMRUNUX0JBTksoc21jOTAwMF9iYXNlLCAyKTsKKyAgIF9vdXRiKCAwLCBzbWM5MDAwX2Jhc2UgKyBJTlRfTUFTSyk7CisKKyAgIC8qIGFuZCB0ZWxsIHRoZSBjYXJkIHRvIHN0YXkgYXdheSBmcm9tIHRoYXQgbmFzdHkgb3V0c2lkZSB3b3JsZCAqLworICAgU01DX1NFTEVDVF9CQU5LKHNtYzkwMDBfYmFzZSwgMCk7CisgICBfb3V0YiggUkNSX0NMRUFSLCBzbWM5MDAwX2Jhc2UgKyBSQ1IgKTsKKyAgIF9vdXRiKCBUQ1JfQ0xFQVIsIHNtYzkwMDBfYmFzZSArIFRDUiApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEVUSF9QUk9CRSAtIExvb2sgZm9yIGFuIGFkYXB0ZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBuaWMgKnNtYzkwMDBfcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVfYWRkcnMpCit7CisgICB1bnNpZ25lZCBzaG9ydCAgIHJldmlzaW9uOworICAgaW50CSAgICAgICAgICAgIG1lbW9yeTsKKyAgIGludCAgICAgICAgICAgICAgbWVkaWE7CisgICBjb25zdCBjaGFyICoJICAgIHZlcnNpb25fc3RyaW5nOworICAgY29uc3QgY2hhciAqCSAgICBpZl9zdHJpbmc7CisgICBpbnQgICAgICAgICAgICAgIGk7CisKKyAgIC8qCisgICAgKiB0aGUgU01DOTAwMCBjYW4gYmUgYXQgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9ydCBhZGRyZXNzZXMuICBUbyBjaGFuZ2UsCisgICAgKiBmb3IgYSBzbGlnaHRseSBkaWZmZXJlbnQgY2FyZCwgeW91IGNhbiBhZGQgaXQgdG8gdGhlIGFycmF5LiAgS2VlcCBpbgorICAgICogbWluZCB0aGF0IHRoZSBhcnJheSBtdXN0IGVuZCBpbiB6ZXJvLgorICAgICovCisgICBzdGF0aWMgdW5zaWduZWQgc2hvcnQgcG9ydGxpc3RbXSA9IHsKKyNpZmRlZglTTUM5MDAwX1NDQU4KKyAgICAgIFNNQzkwMDBfU0NBTiwKKyNlbHNlCisgICAgICAweDIwMCwgMHgyMjAsIDB4MjQwLCAweDI2MCwgMHgyODAsIDB4MkEwLCAweDJDMCwgMHgyRTAsCisgICAgICAweDMwMCwgMHgzMjAsIDB4MzQwLCAweDM2MCwgMHgzODAsIDB4M0EwLCAweDNDMCwgMHgzRTAsCisjZW5kaWYKKyAgICAgIDAgfTsKKworICAgcHJpbnRmKCJcblNNQzkwMDAgJXNcbiIsIHNtYzkwMDBfdmVyc2lvbik7CisjaWZkZWYJU01DOTAwMF9WRVJCT1NFCisgICBwcmludGYoIkNvcHlyaWdodCAoQykgMTk5OCBEYW5pZWwgRW5nc3RyXHg5NG1cbiIpOworICAgcHJpbnRmKCJDb3B5cmlnaHQgKEMpIDE5OTYgRXJpYyBTdGFobG1hblxuIik7CisjZW5kaWYKKyAgIC8qIGlmIG5vIGFkZHJlc3NlcyBzdXBwbGllZCwgZmFsbCBiYWNrIG9uIGRlZmF1bHRzICovCisgICBpZiAocHJvYmVfYWRkcnMgPT0gMCB8fCBwcm9iZV9hZGRyc1swXSA9PSAwKQorICAgICBwcm9iZV9hZGRycyA9IHBvcnRsaXN0OworCisgICAvKiBjaGVjayBldmVyeSBldGhlcm5ldCBhZGRyZXNzICovCisgICBmb3IgKGkgPSAwOyBwcm9iZV9hZGRyc1tpXTsgaSsrKSB7CisgICAgICAvKiBjaGVjayB0aGlzIHNwZWNpZmljIGFkZHJlc3MgKi8KKyAgICAgIGlmIChzbWNfcHJvYmUocHJvYmVfYWRkcnNbaV0pID09IDApCisJc21jOTAwMF9iYXNlID0gcHJvYmVfYWRkcnNbaV07CisgICB9CisKKyAgIC8qIGNvdWxkbid0IGZpbmQgYW55dGhpbmcgKi8KKyAgIGlmKDAgPT0gc21jOTAwMF9iYXNlKQorICAgICBnb3RvIG91dDsKKworICAgLyoKKyAgICAqIEdldCB0aGUgTUFDIGFkZHJlc3MgKCBiYW5rIDEsIHJlZ3MgNCAtIDkgKQorICAgICovCisgICBTTUNfU0VMRUNUX0JBTksoc21jOTAwMF9iYXNlLCAxKTsKKyAgIGZvciAoIGkgPSAwOyBpIDwgNjsgaSArPSAyICkgeworICAgICAgd29yZCBhZGRyZXNzOworCisgICAgICBhZGRyZXNzID0gaW53KHNtYzkwMDBfYmFzZSArIEFERFIwICsgaSk7CisgICAgICBuaWMtPm5vZGVfYWRkcltpKzFdID0gYWRkcmVzcyA+PiA4OworICAgICAgbmljLT5ub2RlX2FkZHJbaV0gPSBhZGRyZXNzICYgMHhGRjsKKyAgIH0KKworCisgICAvKiBnZXQgdGhlIG1lbW9yeSBpbmZvcm1hdGlvbiAqLworICAgU01DX1NFTEVDVF9CQU5LKHNtYzkwMDBfYmFzZSwgMCk7CisgICBtZW1vcnkgPSAoIGludyhzbWM5MDAwX2Jhc2UgKyBNQ1IpID4+IDkgKSAgJiAweDc7ICAvKiBtdWx0aXBsaWVyICovCisgICBtZW1vcnkgKj0gMjU2ICogKGludyhzbWM5MDAwX2Jhc2UgKyBNSVIpICYgMHhGRik7CisKKyAgIC8qCisgICAgKiBOb3csIEkgd2FudCB0byBmaW5kIG91dCBtb3JlIGFib3V0IHRoZSBjaGlwLiAgVGhpcyBpcyBzb3J0IG9mCisgICAgKiByZWR1bmRhbnQsIGJ1dCBpdCdzIGNsZWFuZXIgdG8gaGF2ZSBpdCBpbiBib3RoLCByYXRoZXIgdGhhbiBoYXZpbmcKKyAgICAqIG9uZSBWRVJZIGxvbmcgcHJvYmUgcHJvY2VkdXJlLgorICAgICovCisgICBTTUNfU0VMRUNUX0JBTksoc21jOTAwMF9iYXNlLCAzKTsKKyAgIHJldmlzaW9uICA9IGludyhzbWM5MDAwX2Jhc2UgKyBSRVZJU0lPTik7CisgICB2ZXJzaW9uX3N0cmluZyA9IGNoaXBfaWRzWyhyZXZpc2lvbiA+PiA0KSAmIDB4Rl07CisKKyAgIGlmICgoKHJldmlzaW9uICYgMHhGMCkgPj4gNCA9PSBDSElQXzkxOTYpICYmCisgICAgICAgKChyZXZpc2lvbiAmIDB4MEYpID49IFJFVl85MTk2KSkgeworICAgICAgLyogVGhpcyBpcyBhIDkxYzk2LiAnYzk2IGhhcyB0aGUgc2FtZSBjaGlwIGlkIGFzICdjOTQgKDQpIGJ1dAorICAgICAgICogYSByZXZpc2lvbiBzdGFydGluZyBhdCA2ICovCisgICAgICB2ZXJzaW9uX3N0cmluZyA9IHNtYzkxYzk2X2lkOworICAgfQorCisgICBpZiAoICF2ZXJzaW9uX3N0cmluZyApIHsKKyAgICAgIC8qIEkgc2hvdWxkbid0IGdldCBoZXJlIGJlY2F1c2UgdGhpcyBjYWxsIHdhcyBkb25lIGJlZm9yZS4uLi4gKi8KKyAgICAgIGdvdG8gb3V0OworICAgfQorCisgICAvKiBpcyBpdCB1c2luZyBBVUkgb3IgMTBCYXNlVCA/ICovCisgICBTTUNfU0VMRUNUX0JBTksoc21jOTAwMF9iYXNlLCAxKTsKKyAgIGlmIChpbncoc21jOTAwMF9iYXNlICsgQ09ORklHKSAmIENGR19BVUlfU0VMRUNUKQorICAgICBtZWRpYSA9IDI7CisgICBlbHNlCisgICAgIG1lZGlhID0gMTsKKworICAgaWZfc3RyaW5nID0gaW50ZXJmYWNlc1ttZWRpYSAtIDFdOworCisgICAvKiBub3csIHJlc2V0IHRoZSBjaGlwLCBhbmQgcHV0IGl0IGludG8gYSBrbm93biBzdGF0ZSAqLworICAgc21jX3Jlc2V0KHNtYzkwMDBfYmFzZSk7CisKKyAgIHByaW50ZigiJXMgcmV2OiVkIEkvTyBwb3J0OiVoWCBJbnRlcmZhY2U6JXMgUkFNOiVkIGJ5dGVzIFxuIiwKKwkgIHZlcnNpb25fc3RyaW5nLCByZXZpc2lvbiAmIDB4RiwKKwkgIHNtYzkwMDBfYmFzZSwgaWZfc3RyaW5nLCBtZW1vcnkgKTsKKyAgIC8qCisgICAgKiBQcmludCB0aGUgRXRoZXJuZXQgYWRkcmVzcworICAgICovCisgICBwcmludGYoIkV0aGVybmV0IE1BQyBhZGRyZXNzOiAlIVxuIiwgbmljLT5ub2RlX2FkZHIpOworCisgICBTTUNfU0VMRUNUX0JBTksoc21jOTAwMF9iYXNlLCAwKTsKKworICAgLyogc2VlIHRoZSBoZWFkZXIgZmlsZSBmb3Igb3B0aW9ucyBpbiBUQ1IvUkNSIE5PUk1BTCovCisgICBfb3V0dyhUQ1JfTk9STUFMLCBzbWM5MDAwX2Jhc2UgKyBUQ1IpOworICAgX291dHcoUkNSX05PUk1BTCwgc21jOTAwMF9iYXNlICsgUkNSKTsKKworICAgLyogU2VsZWN0IHdoaWNoIGludGVyZmFjZSB0byB1c2UgKi8KKyAgIFNNQ19TRUxFQ1RfQkFOSyhzbWM5MDAwX2Jhc2UsIDEpOworICAgaWYgKCBtZWRpYSA9PSAxICkgeworICAgICAgX291dHcoIGludyggc21jOTAwMF9iYXNlICsgQ09ORklHICkgJiB+Q0ZHX0FVSV9TRUxFQ1QsCisJICAgc21jOTAwMF9iYXNlICsgQ09ORklHICk7CisgICB9CisgICBlbHNlIGlmICggbWVkaWEgPT0gMiApIHsKKyAgICAgIF9vdXR3KCBpbncoIHNtYzkwMDBfYmFzZSArIENPTkZJRyApIHwgQ0ZHX0FVSV9TRUxFQ1QsCisJICAgc21jOTAwMF9iYXNlICsgQ09ORklHICk7CisgICB9CisKKyAgIG5pYy0+cmVzZXQgPSBzbWM5MDAwX3Jlc2V0OworICAgbmljLT5wb2xsID0gc21jOTAwMF9wb2xsOworICAgbmljLT50cmFuc21pdCA9IHNtYzkwMDBfdHJhbnNtaXQ7CisgICBuaWMtPmRpc2FibGUgPSBzbWM5MDAwX2Rpc2FibGU7CisKKworICAgcmV0dXJuIG5pYzsKKworb3V0OgorI2lmZGVmCVNNQzkwMDBfVkVSQk9TRQorICAgcHJpbnRmKCJObyBTTUM5MDAwIGFkYXB0ZXJzIGZvdW5kXG4iKTsKKyNlbmRpZgorICAgc21jOTAwMF9iYXNlID0gMDsKKworICAgcmV0dXJuICgwKTsKK30KKworCisKZGlmZiAtLWdpdCBhL25ldGJvb3Qvc21jOTAwMC5oIGIvbmV0Ym9vdC9zbWM5MDAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM3ZjkxNgotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3Qvc21jOTAwMC5oCkBAIC0wLDAgKzEsMjA1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogc21jOTAwMC5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4IGJ5IERhbmllbCBFbmdzdHL2bQorICogQ29weXJpZ2h0IChDKSAxOTk2IGJ5IEVyaWsgU3RhaGxtYW4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcmVnaXN0ZXIgaW5mb3JtYXRpb24gYW5kIGFjY2VzcyBtYWNyb3MgZm9yCisgKiB0aGUgU01DOTF4eHggY2hpcHNldC4KKyAqCisgKiBJbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhpcyBmaWxlIHdhcyBvYnRhaW5lZCBmcm9tIHRoZSBTTUM5MUM5NAorICogbWFudWFsIGZyb20gU01DLiAgVG8gZ2V0IGEgY29weSwgaWYgeW91IHJlYWxseSB3YW50IG9uZSwgeW91IGNhbiBmaW5kCisgKiBpbmZvcm1hdGlvbiB1bmRlciB3d3cuc21zYy5jb20gaW4gdGhlIGNvbXBvbmVudHMgZGl2aXNpb24uCisgKiAoIHRoaXMgdGhhbmtzIHRvIGFkdmljZSBmcm9tIERvbmFsZCBCZWNrZXIgKS4KKyAqCisgKiBBdXRob3JzCisgKiAgICAgIERhbmllbCBFbmdzdHL2bSAgICAgICAgICAgICAgICAgICAgICAgICA8ZGFuaWVsLmVuZ3N0cm9tQHJpa3NuZXR0Lm5vPgorICoJRXJpayBTdGFobG1hbgkJCQk8ZXJpa0B2dC5lZHU+CisgKgorICogSGlzdG9yeQorICogOTYtMDEtMDYJCSBFcmlrIFN0YWhsbWFuICAgbW92ZWQgZGVmaW5pdGlvbnMgaGVyZSBmcm9tIG1haW4gLmMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZQorICogOTYtMDEtMTkJCSBFcmlrIFN0YWhsbWFuCSBwb2xpc2hlZCB0aGlzIHVwIHNvbWUsIGFuZCBhZGRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXR0ZXIgZXJyb3IgaGFuZGxpbmcKKyAqIDk4LTA5LTI1ICAgICAgICAgICAgICBEYW5pZWwgRW5nc3Ry9m0gYWRqdXN0ZWQgZm9yIEV0aGVyYm9vdAorICogOTgtMDktMjcgICAgICAgICAgICAgIERhbmllbCBFbmdzdHL2bSBtb3ZlZCBzb21lIHN0YXRpYyBzdHJpbmdzIGJhY2sgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW4gLmMgZmlsZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZglfU01DOTAwMF9IXworIyBkZWZpbmUgX1NNQzkwMDBfSF8KKworLyogSSB3YW50IHNvbWUgc2ltcGxlIHR5cGVzICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJCQlieXRlOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJCXdvcmQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50CQlkd29yZDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBTTUMgcmVnaXN0ZXJzIGlzIHByb2JhYmx5IGluIG9yZGVyIGhlcmUsCisgKiBhbHRob3VnaCBmb3IgZGV0YWlscywgdGhlIFNNQyBkYXRhc2hlZXQgaXMgaW52YWx1YWJsZS4KKyAqCisgKiBCYXNpY2FsbHksIHRoZSBjaGlwIGhhcyA0IGJhbmtzIG9mIHJlZ2lzdGVycyAoIDAgdG8gMyApLCB3aGljaAorICogYXJlIGFjY2Vzc2VkIGJ5IHdyaXRpbmcgYSBudW1iZXIgaW50byB0aGUgQkFOS19TRUxFQ1QgcmVnaXN0ZXIKKyAqICggSSBhbHNvIHVzZSBhIFNNQ19TRUxFQ1RfQkFOSyBtYWNybyBmb3IgdGhpcyApLgorICoKKyAqIFRoZSBiYW5rcyBhcmUgY29uZmlndXJlZCBzbyB0aGF0IGZvciBtb3N0IHB1cnBvc2VzLCBiYW5rIDIgaXMgYWxsCisgKiB0aGF0IGlzIG5lZWRlZCBmb3Igc2ltcGxlIHJ1biB0aW1lIHRhc2tzLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBCYW5rIFNlbGVjdCBSZWdpc3RlcjoKKyAqCisgKgkJeXl5eSB5eXl5IDAwMDAgMDB4eAorICoJCXh4CQk9IGJhbmsgbnVtYmVyCisgKgkJeXl5eSB5eXl5CT0gMHgzMywgZm9yIGlkZW50aWZpY2F0aW9uIHB1cnBvc2VzLgorICovCisjZGVmaW5lCUJBTktfU0VMRUNUCQkxNAorCisvKiBCQU5LIDAgICovCisKKyNkZWZpbmUJVENSCQkwCS8qIHRyYW5zbWl0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVENSX0VOQUJMRQkweDAwMDEJLyogaWYgdGhpcyBpcyAxLCB3ZSBjYW4gdHJhbnNtaXQgKi8KKyNkZWZpbmUgVENSX0ZEVVBMWAkweDA4MDAJLyogcmVjZWl2ZSBwYWNrZXRzIHNlbnQgb3V0ICovCisjZGVmaW5lIFRDUl9TVFBfU1FFVAkweDEwMDAJLyogc3RvcCB0cmFuc21pdHRpbmcgaWYgU2lnbmFsIHF1YWxpdHkgZXJyb3IgKi8KKyNkZWZpbmUJVENSX01PTl9DTlMJMHgwNDAwCS8qIG1vbml0b3JzIHRoZSBjYXJyaWVyIHN0YXR1cyAqLworI2RlZmluZQlUQ1JfUEFEX0VOQUJMRQkweDAwODAJLyogcGFkcyBzaG9ydCBwYWNrZXRzIHRvIDY0IGJ5dGVzICovCisKKyNkZWZpbmUJVENSX0NMRUFSCTAJLyogZG8gTk9USElORyAqLworLyogdGhlIG5vcm1hbCBzZXR0aW5ncyBmb3IgdGhlIFRDUiByZWdpc3RlciA6ICovCisjZGVmaW5lCVRDUl9OT1JNQUwJKFRDUl9FTkFCTEUgfCBUQ1JfUEFEX0VOQUJMRSkKKworCisjZGVmaW5lIEVQSF9TVEFUVVMJMgorI2RlZmluZSBFU19MSU5LX09LCTB4NDAwMAkvKiBpcyB0aGUgbGluayBpbnRlZ3JpdHkgb2sgPyAqLworCisjZGVmaW5lCVJDUgkJNAorI2RlZmluZSBSQ1JfU09GVFJFU0VUCTB4ODAwMAkvKiByZXNldHMgdGhlIGNoaXAgKi8KKyNkZWZpbmUJUkNSX1NUUklQX0NSQwkweDIwMAkvKiBzdHJpcHMgQ1JDICovCisjZGVmaW5lIFJDUl9FTkFCTEUJMHgxMDAJLyogSUZGIHRoaXMgaXMgc2V0LCB3ZSBjYW4gcmVjZWl2ZSBwYWNrZXRzICovCisjZGVmaW5lIFJDUl9BTE1VTAkweDQJLyogcmVjZWl2ZSBhbGwgbXVsdGljYXN0IHBhY2tldHMgKi8KKyNkZWZpbmUJUkNSX1BST01JU0MJMHgyCS8qIGVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisKKy8qIHRoZSBub3JtYWwgc2V0dGluZ3MgZm9yIHRoZSBSQ1IgcmVnaXN0ZXIgOiAqLworI2RlZmluZQlSQ1JfTk9STUFMCShSQ1JfU1RSSVBfQ1JDIHwgUkNSX0VOQUJMRSkKKyNkZWZpbmUgUkNSX0NMRUFSCTB4MAkJLyogc2V0IGl0IHRvIGEgYmFzZSBzdGF0ZSAqLworCisjZGVmaW5lCUNPVU5URVIJCTYKKyNkZWZpbmUJTUlSCQk4CisjZGVmaW5lCU1DUgkJMTAKKy8qIDEyIGlzIHJlc2VydmVkICovCisKKy8qIEJBTksgMSAqLworI2RlZmluZSBDT05GSUcJCQkwCisjZGVmaW5lIENGR19BVUlfU0VMRUNUCQkweDEwMAorI2RlZmluZQlCQVNFCQkJMgorI2RlZmluZQlBRERSMAkJCTQKKyNkZWZpbmUJQUREUjEJCQk2CisjZGVmaW5lCUFERFIyCQkJOAorI2RlZmluZQlHRU5FUkFMCQkJMTAKKyNkZWZpbmUJQ09OVFJPTAkJCTEyCisjZGVmaW5lCUNUTF9QT1dFUkRPV04JCTB4MjAwMAorI2RlZmluZQlDVExfTEVfRU5BQkxFCQkweDgwCisjZGVmaW5lCUNUTF9DUl9FTkFCTEUJCTB4NDAKKyNkZWZpbmUJQ1RMX1RFX0VOQUJMRQkJMHgwMDIwCisjZGVmaW5lIENUTF9BVVRPX1JFTEVBU0UJMHgwODAwCisjZGVmaW5lCUNUTF9FUFJPTV9BQ0NFU1MJMHgwMDAzIC8qIGhpZ2ggaWYgRXByb20gaXMgYmVpbmcgcmVhZCAqLworCisvKiBCQU5LIDIgKi8KKyNkZWZpbmUgTU1VX0NNRAkJMAorI2RlZmluZSBNQ19CVVNZCQkxCS8qIG9ubHkgcmVhZGFibGUgYml0IGluIHRoZSByZWdpc3RlciAqLworI2RlZmluZSBNQ19OT1AJCTAKKyNkZWZpbmUJTUNfQUxMT0MJMHgyMAkvKiBvciB3aXRoIG51bWJlciBvZiAyNTYgYnl0ZSBwYWNrZXRzICovCisjZGVmaW5lCU1DX1JFU0VUCTB4NDAKKyNkZWZpbmUJTUNfUkVNT1ZFCTB4NjAJLyogcmVtb3ZlIHRoZSBjdXJyZW50IHJ4IHBhY2tldCAqLworI2RlZmluZSBNQ19SRUxFQVNFCTB4ODAJLyogcmVtb3ZlIGFuZCByZWxlYXNlIHRoZSBjdXJyZW50IHJ4IHBhY2tldCAqLworI2RlZmluZSBNQ19GUkVFUEtUCTB4QTAJLyogUmVsZWFzZSBwYWNrZXQgaW4gUE5SIHJlZ2lzdGVyICovCisjZGVmaW5lIE1DX0VOUVVFVUUJMHhDMAkvKiBFbnF1ZXVlIHRoZSBwYWNrZXQgZm9yIHRyYW5zbWl0ICovCisKKyNkZWZpbmUJUE5SX0FSUgkJMgorI2RlZmluZSBGSUZPX1BPUlRTCTQKKworI2RlZmluZSBGUF9SWEVNUFRZCTB4ODAwMAorI2RlZmluZSBGUF9UWEVNUFRZCTB4ODAKKworI2RlZmluZQlQT0lOVEVSCQk2CisjZGVmaW5lIFBUUl9SRUFECTB4MjAwMAorI2RlZmluZQlQVFJfUkNWCQkweDgwMDAKKyNkZWZpbmUJUFRSX0FVVE9JTkMJMHg0MDAwCisjZGVmaW5lIFBUUl9BVVRPX0lOQwkweDAwNDAKKworI2RlZmluZQlEQVRBXzEJCTgKKyNkZWZpbmUJREFUQV8yCQkxMAorI2RlZmluZQlJTlRFUlJVUFQJMTIKKworI2RlZmluZSBJTlRfTUFTSwkxMworI2RlZmluZSBJTV9SQ1ZfSU5UCTB4MQorI2RlZmluZQlJTV9UWF9JTlQJMHgyCisjZGVmaW5lCUlNX1RYX0VNUFRZX0lOVAkweDQKKyNkZWZpbmUJSU1fQUxMT0NfSU5UCTB4OAorI2RlZmluZQlJTV9SWF9PVlJOX0lOVAkweDEwCisjZGVmaW5lCUlNX0VQSF9JTlQJMHgyMAorI2RlZmluZQlJTV9FUkNWX0lOVAkweDQwIC8qIG5vdCBvbiBTTUM5MTkyICovCisKKy8qIEJBTksgMyAqLworI2RlZmluZQlNVUxUSUNBU1QxCTAKKyNkZWZpbmUJTVVMVElDQVNUMgkyCisjZGVmaW5lCU1VTFRJQ0FTVDMJNAorI2RlZmluZQlNVUxUSUNBU1Q0CTYKKyNkZWZpbmUJTUdNVAkJOAorI2RlZmluZQlSRVZJU0lPTgkxMCAvKiAoIGhpOiBjaGlwIGlkICAgbG93OiByZXYgIyApICovCisKKworLyogdGhpcyBpcyBOT1Qgb24gU01DOTE5MiAqLworI2RlZmluZQlFUkNWCQkxMgorCisvKiBOb3RlIHRoYXQgOTE5NCBhbmQgOTE5NiBoYXZlIHRoZSBzbWFtZSBjaGlwIGlkLAorICogdGhlIDkxOTYgd2lsbCBoYXZlIHJldmlzaW9ucyBzdGFydGluZyBhdCA2ICovCisjZGVmaW5lIENISVBfOTE5MAkzCisjZGVmaW5lIENISVBfOTE5NAk0CisjZGVmaW5lIENISVBfOTE5NQk1CisjZGVmaW5lIENISVBfOTE5Ngk0CisjZGVmaW5lIENISVBfOTExMDAJNworI2RlZmluZSBDSElQXzkxMTAwRkQJOAorCisjZGVmaW5lIFJFVl85MTk2CTYKKworLyoKKyAqIFRyYW5zbWl0IHN0YXR1cyBiaXRzCisgKi8KKyNkZWZpbmUgVFNfU1VDQ0VTUwkweDAwMDEKKyNkZWZpbmUgVFNfTE9TVENBUgkweDA0MDAKKyNkZWZpbmUgVFNfTEFUQ09MCTB4MDIwMAorI2RlZmluZSBUU18xNkNPTAkweDAwMTAKKworLyoKKyAqIFJlY2VpdmUgc3RhdHVzIGJpdHMKKyAqLworI2RlZmluZSBSU19BTEdORVJSCTB4ODAwMAorI2RlZmluZSBSU19CQURDUkMJMHgyMDAwCisjZGVmaW5lIFJTX09EREZSQU1FCTB4MTAwMAorI2RlZmluZSBSU19UT09MT05HCTB4MDgwMAorI2RlZmluZSBSU19UT09TSE9SVAkweDA0MDAKKyNkZWZpbmUgUlNfTVVMVElDQVNUCTB4MDAwMQorI2RlZmluZSBSU19FUlJPUlMJKFJTX0FMR05FUlIgfCBSU19CQURDUkMgfCBSU19UT09MT05HIHwgUlNfVE9PU0hPUlQpCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgSSBkZWZpbmUgc29tZSBtYWNyb3MgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZG8gc29tZXdoYXQgY29tbW9uCisgKiBvciBzbGlnaHRseSBjb21wbGljYXRlZCwgcmVwZWF0ZWQgdGFza3MuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBzZWxlY3QgYSByZWdpc3RlciBiYW5rLCAwIHRvIDMgICovCisKKyNkZWZpbmUgU01DX1NFTEVDVF9CQU5LKHgsIHkpIHsgX291dHcoIHksIHggKyBCQU5LX1NFTEVDVCApOyB9CisKKy8qIGRlZmluZSBhIHNtYWxsIGRlbGF5IGZvciB0aGUgcmVzZXQgKi8KKyNkZWZpbmUgU01DX0RFTEFZKHgpIHsgaW53KCB4ICsgUkNSICk7XAorCQkJaW53KCB4ICsgUkNSICk7XAorCQkJaW53KCB4ICsgUkNSICk7IH0KKworCisjZW5kaWYJLyogX1NNQ185MDAwX0hfICovCisKZGlmZiAtLWdpdCBhL25ldGJvb3QvdGlhcmEuYyBiL25ldGJvb3QvdGlhcmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmY0ODVkCi0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC90aWFyYS5jCkBAIC0wLDAgKzEsMjU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0V0aGVyYm9vdCAtICBCT09UUC9URlRQIEJvb3RzdHJhcCBQcm9ncmFtCisKK1RJQVJBIChGdWppdHN1IEV0aGVyc3RhcikgTklDIGRyaXZlciBmb3IgRXRoZXJib290CitDb3B5cmlnaHQgKGMpIEtlbiBZYXAgMTk5OAorCitJbmZvcm1hdGlvbiBnbGVhbmVkIGZyb206CisKK1RJQVJBLkFTTSBQYWNrZXQgZHJpdmVyIGJ5IEJyaWFuIEZpc2hlciwgUXVlZW5zIFUsIEtpbmdzdG9uLCBPbnRhcmlvCitGdWppdHN1IE1CODY5NjAgc3BlYyBzaGVldCAoZGlmZmVyZW50IGNoaXAgYnV0IHNhbWUgZmFtaWx5KQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisvKiB0byBnZXQgc29tZSBnbG9iYWwgcm91dGluZXMgbGlrZSBwcmludGYgKi8KKyNpbmNsdWRlICJldGhlcmJvb3QuaCIKKy8qIHRvIGdldCB0aGUgaW50ZXJmYWNlIHRvIHRoZSBib2R5IG9mIHRoZSBwcm9ncmFtICovCisjaW5jbHVkZSAibmljLmgiCisjaW5jbHVkZSAiY2FyZHMuaCIKKworLyoKKwlFdGhlclN0YXIgSS9PIFJlZ2lzdGVyIG9mZnNldHMKKyovCisKKy8qIE9mZnNldHMgb2YgcmVnaXN0ZXJzICovCisjZGVmaW5lCURMQ1JfWE1JVF9TVEFUCTB4MDAKKyNkZWZpbmUJRExDUl9YTUlUX01BU0sJMHgwMQorI2RlZmluZQlETENSX1JFQ1ZfU1RBVAkweDAyCisjZGVmaW5lCURMQ1JfUkVDVl9NQVNLCTB4MDMKKyNkZWZpbmUJRExDUl9YTUlUX01PREUJMHgwNAorI2RlZmluZQlETENSX1JFQ1ZfTU9ERQkweDA1CisjZGVmaW5lCURMQ1JfRU5BQkxFCTB4MDYKKyNkZWZpbmUJRExDUl9URFJfTE9XCTB4MDcKKyNkZWZpbmUJRExDUl9OT0RFX0lECTB4MDgKKyNkZWZpbmUJRExDUl9URFJfSElHSAkweDBGCisjZGVmaW5lCUJNUFJfTUVNX1BPUlQJMHgxMAorI2RlZmluZQlCTVBSX1BLVF9MRU4JMHgxMgorI2RlZmluZQlCTVBSX0RNQV9FTkFCTEUJMHgxNAorI2RlZmluZQlQUk9NX0lECQkweDE4CisKKyNkZWZpbmUJVE1TVAkJMHg4MAorI2RlZmluZQlUTVRfT0sJCTB4ODAKKyNkZWZpbmUJVE1UXzE2Q09MTAkweDAyCisjZGVmaW5lCUJVRl9FTVBUWQkweDQwCisKKyNkZWZpbmUJQ0FSRF9ESVNBQkxFCTB4ODAJLyogd3JpdHRlbiB0byBETENSX0VOQUJMRSB0byBkaXNhYmxlIGNhcmQgKi8KKyNkZWZpbmUJQ0FSRF9FTkFCTEUJMAkvKiB3cml0dGVuIHRvIERMQ1JfRU5BQkxFIHRvIGVuYWJsZSBjYXJkICovCisKKyNkZWZpbmUJQ0xFQVJfU1RBVFVTCTB4MEYJLyogdXNlZCB0byBjbGVhciBzdGF0dXMgaW5mbyAqLworLyoKKwkwMDAwMTExMUIKKwkhISEhISEhIS0tLS0tLS0tCisJISEhISEhISstLS0tLS0tLUNMRUFSIEJVUyBXUklURSBFUlJPUgorCSEhISEhISstLS0tLS0tLS1DTEVBUiAxNiBDT0xMSVNJT04KKwkhISEhISstLS0tLS0tLS0tQ0xFQVIgQ09MTElTSU9OCisJISEhISstLS0tLS0tLS0tLUNMRUFSIFVOREVSRkxPVworCSEhISstLS0tLS0tLS0tLS1OQworCSEhKy0tLS0tLS0tLS0tLS1OQworCSErLS0tLS0tLS0tLS0tLS1OQworCSstLS0tLS0tLS0tLS0tLS1OQworKi8KKworI2RlZmluZQlOT19UWF9JUlFTCTAJLyogd3JpdHRlbiB0byBjbGVhciB0cmFuc21pdCBJUlFzICovCisKKyNkZWZpbmUJQ0xSX1JDVl9TVEFUVVMJMHhDRgkvKiBjbGVhcnMgcmVjZWl2ZSBzdGF0dXMgKi8KKworI2RlZmluZQlFTl9SQ1ZfSVJRUwkweDgwCS8qIGVuYWJsZSByZWNlaXZlIGludGVycnVwdHMgKi8KKy8qCisJMTAwMDAwMDBCCisJISEhISEhISEtLS0tLS0tLQorCSEhISEhISErLS0tLS0tLS1FTkFCTEUgT1ZFUkZMT1cKKwkhISEhISErLS0tLS0tLS0tRU5BQkxFIENSQworCSEhISEhKy0tLS0tLS0tLS1FTkFCTEUgQUxJR04KKwkhISEhKy0tLS0tLS0tLS0tRU5BQkxFIFNIT1JUIFBLVAorCSEhISstLS0tLS0tLS0tLS1ESVNBQkxFIFJFTU9URSBSRVNFVAorCSEhKy0tLS0tLS0tLS0tLS1SRVNFUlZFRAorCSErLS0tLS0tLS0tLS0tLS1SRVNFUlZFRAorCSstLS0tLS0tLS0tLS0tLS1FTkFCTEUgUEtUIFJFQURZCisqLworCisjZGVmaW5lCVhNSVRfTU9ERQkweDAyCisvKgorCTAwMDAwMDEwQgorCSEhISEhISEhLS0tLS0tLS0tRU5BQkxFIENBUlJJRVIgREVURUNUCisJISEhISEhISstLS0tLS0tLS1ESVNBQkxFIExPT1BCQUNLCisqLworCisjZGVmaW5lCVJFQ1ZfTU9ERQkweDAyCisvKgorCTAwMDAwMDEwQgorCSEhISEhISEhLS0tLS0tLS0tQUNDRVBUIEFMTCBQQUNLRVRTCisJISEhISEhISstLS0tLS0tLS1BQ0NFUFQgUEhZU0lDQUwsIE1VTFRJQ0FTVCwgQU5ECisJISEhISEhKy0tLS0tLS0tLS1CUk9BRENBU1QgUEFDS0VUUworCSEhISEhKy0tLS0tLS0tLS0tRElTQUJMRSBSRU1PVEUgUkVTRVQKKwkhISEhKy0tLS0tLS0tLS0tLURJU0FCTEUgU0hPUlQgUEFDS0VUUworCSEhISstLS0tLS0tLS0tLS0tVVNFIDYgQllURSBBRERSRVNTCisJISErLS0tLS0tLS0tLS0tLS1OQworCSErLS0tLS0tLS0tLS0tLS0tTkMKKwkrLS0tLS0tLS0tLS0tLS0tLURJU0FCTEUgQ1JDIFRFU1QgTU9ERQorKi8KKworLyogTklDIHNwZWNpZmljIHN0YXRpYyB2YXJpYWJsZXMgZ28gaGVyZSAqLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQJaW9hZGRyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFU0VUIC0gUmVzZXQgYWRhcHRlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgdGlhcmFfcmVzZXQoc3RydWN0IG5pYyAqbmljKQoreworCWludAkJaTsKKworCW91dGIoQ0FSRF9ESVNBQkxFLCBpb2FkZHIgKyBETENSX0VOQUJMRSk7CisJb3V0YihDTEVBUl9TVEFUVVMsIGlvYWRkciArIERMQ1JfWE1JVF9TVEFUKTsKKwlvdXRiKE5PX1RYX0lSUVMsIGlvYWRkciArIERMQ1JfWE1JVF9NQVNLKTsKKwlvdXRiKENMUl9SQ1ZfU1RBVFVTLCBpb2FkZHIgKyBETENSX1JFQ1ZfU1RBVCk7CisJb3V0YihYTUlUX01PREUsIGlvYWRkciArIERMQ1JfWE1JVF9NT0RFKTsKKwlvdXRiKFJFQ1ZfTU9ERSwgaW9hZGRyICsgRExDUl9SRUNWX01PREUpOworCS8qIFZhY3V1bSByZWN2IGJ1ZmZlciAqLworCXdoaWxlICgoaW5iKGlvYWRkciArIERMQ1JfUkVDVl9NT0RFKSAmIEJVRl9FTVBUWSkgPT0gMCkKKwkJaW5iKGlvYWRkciArIEJNUFJfTUVNX1BPUlQpOworCS8qIFNldCBub2RlIGFkZHJlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47ICsraSkKKwkJb3V0YihuaWMtPm5vZGVfYWRkcltpXSwgaW9hZGRyICsgRExDUl9OT0RFX0lEICsgaSk7CisJb3V0YihDTFJfUkNWX1NUQVRVUywgaW9hZGRyICsgRExDUl9SRUNWX1NUQVQpOworCW91dGIoQ0FSRF9FTkFCTEUsIGlvYWRkciArIERMQ1JfRU5BQkxFKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB0aWFyYV9wb2xsKHN0cnVjdCBuaWMgKm5pYykKK3sKKwl1bnNpZ25lZCBpbnQJCWxlbjsKKworCWlmIChpbmIoaW9hZGRyICsgRExDUl9SRUNWX01PREUpICYgQlVGX0VNUFRZKQorCQlyZXR1cm4gKDApOworCS8qIEFjayBwYWNrZXQgKi8KKwlvdXR3KENMUl9SQ1ZfU1RBVFVTLCBpb2FkZHIgKyBETENSX1JFQ1ZfU1RBVCk7CisJbGVuID0gaW53KGlvYWRkciArIEJNUFJfTUVNX1BPUlQpOwkJLyogdGhyb3cgYXdheSBzdGF0dXMgKi8KKwlsZW4gPSBpbncoaW9hZGRyICsgQk1QUl9NRU1fUE9SVCk7CisJLyogRHJvcCBvdmVybGVuZ3RoIHBhY2tldHMgKi8KKwlpZiAobGVuID4gRVRIX0ZSQU1FX0xFTikKKwkJcmV0dXJuICgwKTsJCS8qIHNob3VsZCB3ZSBkcmFpbiB0aGUgYnVmZmVyPyAqLworCWluc3coaW9hZGRyICsgQk1QUl9NRU1fUE9SVCwgbmljLT5wYWNrZXQsIGxlbiAvIDIpOworCS8qIElmIGl0J3Mgb3VyIG93biwgZHJvcCBpdCAqLworCWlmIChtZW1jbXAobmljLT5wYWNrZXQgKyBFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKSA9PSAwKQorCQlyZXR1cm4gKDApOworCW5pYy0+cGFja2V0bGVuID0gbGVuOworCXJldHVybiAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVFJBTlNNSVQgLSBUcmFuc21pdCBhIGZyYW1lCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB0aWFyYV90cmFuc21pdCgKK3N0cnVjdCBuaWMgKm5pYywKK2NvbnN0IGNoYXIgKmQsCQkJLyogRGVzdGluYXRpb24gKi8KK3Vuc2lnbmVkIGludCB0LAkJCS8qIFR5cGUgKi8KK3Vuc2lnbmVkIGludCBzLAkJCS8qIHNpemUgKi8KK2NvbnN0IGNoYXIgKnApCQkJLyogUGFja2V0ICovCit7CisJdW5zaWduZWQgaW50CWxlbjsKKwl1bnNpZ25lZCBsb25nCXRpbWU7CisKKwlsZW4gPSBzICsgRVRIX0hMRU47CisJaWYgKGxlbiA8IEVUSF9aTEVOKQorCQlsZW4gPSBFVEhfWkxFTjsKKwl0ID0gaHRvbnModCk7CisJb3V0c3coaW9hZGRyICsgQk1QUl9NRU1fUE9SVCwgZCwgRVRIX0FMRU4gLyAyKTsKKwlvdXRzdyhpb2FkZHIgKyBCTVBSX01FTV9QT1JULCBuaWMtPm5vZGVfYWRkciwgRVRIX0FMRU4gLyAyKTsKKwlvdXR3KHQsIGlvYWRkciArIEJNUFJfTUVNX1BPUlQpOworCW91dHN3KGlvYWRkciArIEJNUFJfTUVNX1BPUlQsIHAsIHMgLyAyKTsKKwlpZiAocyAmIDEpCQkJCQkvKiBsYXN0IGJ5dGUgKi8KKwkJb3V0YihwW3MtMV0sIGlvYWRkciArIEJNUFJfTUVNX1BPUlQpOworCXdoaWxlIChzKysgPCBFVEhfWkxFTiAtIEVUSF9ITEVOKQkvKiBwYWQgKi8KKwkJb3V0YigwLCBpb2FkZHIgKyBCTVBSX01FTV9QT1JUKTsKKwlvdXR3KGxlbiB8IChUTVNUIDw8IDgpLCBpb2FkZHIgKyBCTVBSX1BLVF9MRU4pOworCS8qIHdhaXQgZm9yIHRyYW5zbWl0IGNvbXBsZXRlICovCisJdGltZSA9IGN1cnJ0aWNrcygpICsgVElDS1NfUEVSX1NFQzsJCS8qIHdhaXQgb25lIHNlY29uZCAqLworCXdoaWxlIChjdXJydGlja3MoKSA8IHRpbWUgJiYgKGluYihpb2FkZHIpICYgKFRNVF9PS3xUTVRfMTZDT0xMKSkgPT0gMCkKKwkJOworCWlmICgoaW5iKGlvYWRkcikgJiAoVE1UX09LfFRNVF8xNkNPTEwpKSA9PSAwKQorCQlwcmludGYoIlRpYXJhIHRpbWVkIG91dCBvbiB0cmFuc21pdFxuIik7CisJLyogRG8gd2UgbmVlZCB0byBhY2sgdGhlIHRyYW5zbWl0PyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RJU0FCTEUgLSBUdXJuIG9mZiBldGhlcm5ldCBpbnRlcmZhY2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHRpYXJhX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQoreworCS8qIEFwcGFyZW50bHkgb25seSBhIHBvd2VyIGRvd24gY2FuIGRvIHRoaXMgcHJvcGVybHkgKi8KKwlvdXRiKENBUkRfRElTQUJMRSwgaW9hZGRyICsgRExDUl9FTkFCTEUpOworfQorCitzdGF0aWMgaW50IHRpYXJhX3Byb2JlMShzdHJ1Y3QgbmljICpuaWMpCit7CisJLyogSG9wZSBhbGwgdGhlIFRpYXJhIGNhcmRzIGhhdmUgdGhpcyB2ZW5kb3IgcHJlZml4ICovCisJc3RhdGljIGNoYXIJdmVuZG9yX3ByZWZpeFtdID0geyAweDA4LCAweDAwLCAweDFBIH07CisJc3RhdGljIGNoYXIJYWxsX29uZXNbXSA9IHsgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiB9OworCWludAkJaTsKKworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgKytpKQorCQluaWMtPm5vZGVfYWRkcltpXSA9IGluYihpb2FkZHIgKyBQUk9NX0lEICsgaSk7CisJaWYgKG1lbWNtcChuaWMtPm5vZGVfYWRkciwgdmVuZG9yX3ByZWZpeCwgc2l6ZW9mKHZlbmRvcl9wcmVmaXgpKSAhPSAwKQorCQlyZXR1cm4gKDApOworCWlmIChtZW1jbXAobmljLT5ub2RlX2FkZHIsIGFsbF9vbmVzLCBzaXplb2YoYWxsX29uZXMpKSA9PSAwKQorCQlyZXR1cm4gKDApOworCXByaW50ZigiXG5UaWFyYSBpb2FkZHIgJSNoWCwgYWRkciAlIVxuIiwgaW9hZGRyLCBuaWMtPm5vZGVfYWRkcik7CisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQUk9CRSAtIExvb2sgZm9yIGFuIGFkYXB0ZXIsIHRoaXMgcm91dGluZSdzIHZpc2libGUgdG8gdGhlIG91dHNpZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBuaWMgKnRpYXJhX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKnByb2JlX2FkZHJzKQoreworCS8qIG1pc3NpbmcgZW50cmllcyBhcmUgYWRkcmVzc2VzIHVzdWFsbHkgYWxyZWFkeSB1c2VkICovCisJc3RhdGljIHVuc2lnbmVkIHNob3J0CWlvX2FkZHJzW10gPSB7CisJCTB4MTAwLCAweDEyMCwgMHgxNDAsIDB4MTYwLAorCQkweDE4MCwgMHgxQTAsIDB4MUMwLCAweDFFMCwKKwkJMHgyMDAsIDB4MjIwLCAweDI0MCwgLypQYXIqLworCQkweDI4MCwgMHgyQTAsIDB4MkMwLCAvKlNlciovCisJCTB4MzAwLCAweDMyMCwgMHgzNDAsIC8qUGFyKi8KKwkJMHgzODAsIC8qVmlkLFBhciovIDB4M0MwLCAvKlNlciovCisJCTB4MAorCX07CisJdW5zaWduZWQgc2hvcnQJCSpwOworCisJLyogaWYgcHJvYmVfYWRkcnMgaXMgMCwgdGhlbiByb3V0aW5lIGNhbiB1c2UgYSBoYXJkd2lyZWQgZGVmYXVsdCAqLworCWlmIChwcm9iZV9hZGRycyA9PSAwKQorCQlwcm9iZV9hZGRycyA9IGlvX2FkZHJzOworCWZvciAocCA9IHByb2JlX2FkZHJzOyAoaW9hZGRyID0gKnApICE9IDA7ICsrcCkKKwkJaWYgKHRpYXJhX3Byb2JlMShuaWMpKQorCQkJYnJlYWs7CisJLyogaWYgYm9hcmQgZm91bmQgKi8KKwlpZiAoaW9hZGRyICE9IDApCisJeworCQl0aWFyYV9yZXNldChuaWMpOworCQkvKiBwb2ludCB0byBOSUMgc3BlY2lmaWMgcm91dGluZXMgKi8KKwkJbmljLT5yZXNldCA9IHRpYXJhX3Jlc2V0OworCQluaWMtPnBvbGwgPSB0aWFyYV9wb2xsOworCQluaWMtPnRyYW5zbWl0ID0gdGlhcmFfdHJhbnNtaXQ7CisJCW5pYy0+ZGlzYWJsZSA9IHRpYXJhX2Rpc2FibGU7CisJCXJldHVybiBuaWM7CisJfQorCWVsc2UKKwkJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL25ldGJvb3QvdGltZXIuYyBiL25ldGJvb3QvdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDg3ZDYzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC90aW1lci5jCkBAIC0wLDAgKzEsMTI3IEBACisvKiBBIGNvdXBsZSBvZiByb3V0aW5lcyB0byBpbXBsZW1lbnQgYSBsb3ctb3ZlcmhlYWQgdGltZXIgZm9yIGRyaXZlcnMgKi8KKworIC8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlCSJldGhlcmJvb3QuaCIKKyNpbmNsdWRlCSJ0aW1lci5oIgorCit2b2lkIGxvYWRfdGltZXIyKHVuc2lnbmVkIGludCB0aWNrcykKK3sKKwkvKiBTZXQgdXAgdGhlIHRpbWVyIGdhdGUsIHR1cm4gb2ZmIHRoZSBzcGVha2VyICovCisJb3V0YigoaW5iKFBQQ19QT1JUQikgJiB+UFBDQl9TUEtSKSB8IFBQQ0JfVDJHQVRFLCBQUENfUE9SVEIpOworCW91dGIoVElNRVIyX1NFTHxXT1JEX0FDQ0VTU3xNT0RFMHxCSU5BUllfQ09VTlQsIFRJTUVSX01PREVfUE9SVCk7CisJb3V0Yih0aWNrcyAmIDB4RkYsIFRJTUVSMl9QT1JUKTsKKwlvdXRiKHRpY2tzID4+IDgsIFRJTUVSMl9QT1JUKTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1RTQ19DVVJSVElDS1MpCisjZGVmaW5lIHJkdHNjKGxvdyxoaWdoKSBcCisgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJyZHRzYyIgOiAiPWEiIChsb3cpLCAiPWQiIChoaWdoKSkKKworI2RlZmluZSByZHRzY2xsKHZhbCkgXAorICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInJkdHNjIiA6ICI9QSIgKHZhbCkpCisKKworI2RlZmluZSBIWiBUSUNLU19QRVJfU0VDCisjZGVmaW5lIENMT0NLX1RJQ0tfUkFURQkxMTkzMTgwVSAvKiBVbmRlcmx5aW5nIEhaICovCisvKiBMQVRDSCBpcyB1c2VkIGluIHRoZSBpbnRlcnZhbCB0aW1lciBhbmQgZnRhcGUgc2V0dXAuICovCisjZGVmaW5lIExBVENIICAoKENMT0NLX1RJQ0tfUkFURSArIEhaLzIpIC8gSFopCS8qIEZvciBkaXZpZGVyICovCisKKworLyogLS0tLS0tIENhbGlicmF0ZSB0aGUgVFNDIC0tLS0tLS0gCisgKiBSZXR1cm4gMl4zMiAqICgxIC8gKFRTQyBjbG9ja3MgcGVyIHVzZWMpKSBmb3IgZG9fZmFzdF9nZXR0aW1lb2Zmc2V0KCkuCisgKiBUb28gbXVjaCA2NC1iaXQgYXJpdGhtZXRpYyBoZXJlIHRvIGRvIHRoaXMgY2xlYW5seSBpbiBDLCBhbmQgZm9yCisgKiBhY2N1cmFjeSdzIHNha2Ugd2Ugd2FudCB0byBrZWVwIHRoZSBvdmVyaGVhZCBvbiB0aGUgQ1RDIHNwZWFrZXIgKGNoYW5uZWwgMikKKyAqIG91dHB1dCBidXN5IGxvb3AgYXMgbG93IGFzIHBvc3NpYmxlLiBXZSBhdm9pZCByZWFkaW5nIHRoZSBDVEMgcmVnaXN0ZXJzCisgKiBkaXJlY3RseSBiZWNhdXNlIG9mIHRoZSBhd2t3YXJkIDgtYml0IGFjY2VzcyBtZWNoYW5pc20gb2YgdGhlIDgyQzU0CisgKiBkZXZpY2UuCisgKi8KKworI2RlZmluZSBDQUxJQlJBVEVfTEFUQ0gJKDUgKiBMQVRDSCkKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBjYWxpYnJhdGVfdHNjKHZvaWQpCit7CisJLyogU2V0IHRoZSBHYXRlIGhpZ2gsIGRpc2FibGUgc3BlYWtlciAqLworCW91dGIoKGluYigweDYxKSAmIH4weDAyKSB8IDB4MDEsIDB4NjEpOworCisJLyoKKwkgKiBOb3cgbGV0J3MgdGFrZSBjYXJlIG9mIENUQyBjaGFubmVsIDIKKwkgKgorCSAqIFNldCB0aGUgR2F0ZSBoaWdoLCBwcm9ncmFtIENUQyBjaGFubmVsIDIgZm9yIG1vZGUgMCwKKwkgKiAoaW50ZXJydXB0IG9uIHRlcm1pbmFsIGNvdW50IG1vZGUpLCBiaW5hcnkgY291bnQsCisJICogbG9hZCA1ICogTEFUQ0ggY291bnQsIChMU0IgYW5kIE1TQikgdG8gYmVnaW4gY291bnRkb3duLgorCSAqLworCW91dGIoMHhiMCwgMHg0Myk7CQkJLyogYmluYXJ5LCBtb2RlIDAsIExTQi9NU0IsIENoIDIgKi8KKwlvdXRiKENBTElCUkFURV9MQVRDSCAmIDB4ZmYsIDB4NDIpOwkvKiBMU0Igb2YgY291bnQgKi8KKwlvdXRiKENBTElCUkFURV9MQVRDSCA+PiA4LCAweDQyKTsJLyogTVNCIG9mIGNvdW50ICovCisKKwl7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnRsb3csIHN0YXJ0aGlnaDsKKwkJdW5zaWduZWQgbG9uZyBlbmRsb3csIGVuZGhpZ2g7CisJCXVuc2lnbmVkIGxvbmcgY291bnQ7CisKKwkJcmR0c2Moc3RhcnRsb3csc3RhcnRoaWdoKTsKKwkJY291bnQgPSAwOworCQlkbyB7CisJCQljb3VudCsrOworCQl9IHdoaWxlICgoaW5iKDB4NjEpICYgMHgyMCkgPT0gMCk7CisJCXJkdHNjKGVuZGxvdyxlbmRoaWdoKTsKKworCQkvKiBFcnJvcjogRUNUQ05FVkVSU0VUICovCisJCWlmIChjb3VudCA8PSAxKQorCQkJZ290byBiYWRfY3RjOworCisJCS8qIDY0LWJpdCBzdWJ0cmFjdCAtIGdjYyBqdXN0IG1lc3NlcyB1cCB3aXRoIGxvbmcgbG9uZ3MgKi8KKwkJX19hc21fXygic3VibCAlMiwlMFxuXHQiCisJCQkic2JibCAlMywlMSIKKwkJCToiPWEiIChlbmRsb3cpLCAiPWQiIChlbmRoaWdoKQorCQkJOiJnIiAoc3RhcnRsb3cpLCAiZyIgKHN0YXJ0aGlnaCksCisJCQkgIjAiIChlbmRsb3cpLCAiMSIgKGVuZGhpZ2gpKTsKKworCQkvKiBFcnJvcjogRUNQVVRPT0ZBU1QgKi8KKwkJaWYgKGVuZGhpZ2gpCisJCQlnb3RvIGJhZF9jdGM7CisKKwkJZW5kbG93IC89IDU7CisJCXJldHVybiBlbmRsb3c7CisJfQorCisJLyoKKwkgKiBUaGUgQ1RDIHdhc24ndCByZWxpYWJsZTogd2UgZ290IGEgaGl0IG9uIHRoZSB2ZXJ5IGZpcnN0IHJlYWQsCisJICogb3IgdGhlIENQVSB3YXMgc28gZmFzdC9zbG93IHRoYXQgdGhlIHF1b3RpZW50IHdvdWxkbid0IGZpdCBpbgorCSAqIDMyIGJpdHMuLgorCSAqLworYmFkX2N0YzoKKwlwcmludGYoImJhZF9jdGNcbiIpOworCXJldHVybiAwOworfQorCisKK3Vuc2lnbmVkIGxvbmcgY3VycnRpY2tzKHZvaWQpCit7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xvY2tzX3Blcl90aWNrOworCXVuc2lnbmVkIGxvbmcgY2xvY2tzX2hpZ2gsIGNsb2Nrc19sb3c7CisJdW5zaWduZWQgbG9uZyBjdXJydGlja3M7CisJaWYgKCFjbG9ja3NfcGVyX3RpY2spIHsKKwkJY2xvY2tzX3Blcl90aWNrID0gY2FsaWJyYXRlX3RzYygpOworCQlwcmludGYoImNsb2Nrc19wZXJfdGljayA9ICVkXG4iLCBjbG9ja3NfcGVyX3RpY2spOworCX0KKworCS8qIFJlYWQgdGhlIFRpbWUgU3RhbXAgQ291bnRlciAqLworCXJkdHNjKGNsb2Nrc19sb3csIGNsb2Nrc19oaWdoKTsKKworCS8qIGN1cnJ0aWNrcyA9IGNsb2NrcyAvIGNsb2Nrc19wZXJfdGljazsgKi8KKwlfX2FzbV9fKCJkaXZsICUxIgorCQk6Ij1hIiAoY3VycnRpY2tzKQorCQk6InIiIChjbG9ja3NfcGVyX3RpY2spLCAiMCIgKGNsb2Nrc19sb3cpLCAiZCIgKGNsb2Nrc19oaWdoKSk7CisKKworCXJldHVybiBjdXJydGlja3M7Cit9CisKKyNlbmRpZiAvKiBSVENfQ1VSUlRJQ0tTICovCmRpZmYgLS1naXQgYS9uZXRib290L3RpbWVyLmggYi9uZXRib290L3RpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ0OTYyYQotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvdGltZXIuaApAQCAtMCwwICsxLDY0IEBACisvKiBEZWZpbmVzIGZvciByb3V0aW5lcyB0byBpbXBsZW1lbnQgYSBsb3ctb3ZlcmhlYWQgdGltZXIgZm9yIGRyaXZlcnMgKi8KKworIC8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYJVElNRVJfSAorI2RlZmluZSBUSU1FUl9ICisKKy8qIFBvcnRzIGZvciB0aGUgODI1NCB0aW1lciBjaGlwICovCisjZGVmaW5lCVRJTUVSMl9QT1JUCTB4NDIKKyNkZWZpbmUJVElNRVJfTU9ERV9QT1JUCTB4NDMKKworLyogTWVhbmluZyBvZiB0aGUgbW9kZSBiaXRzICovCisjZGVmaW5lCVRJTUVSMF9TRUwJMHgwMAorI2RlZmluZQlUSU1FUjFfU0VMCTB4NDAKKyNkZWZpbmUJVElNRVIyX1NFTAkweDgwCisjZGVmaW5lCVJFQURCQUNLX1NFTAkweEMwCisKKyNkZWZpbmUJTEFUQ0hfQ09VTlQJMHgwMAorI2RlZmluZQlMT0JZVEVfQUNDRVNTCTB4MTAKKyNkZWZpbmUJSElCWVRFX0FDQ0VTUwkweDIwCisjZGVmaW5lCVdPUkRfQUNDRVNTCTB4MzAKKworI2RlZmluZQlNT0RFMAkJMHgwMAorI2RlZmluZQlNT0RFMQkJMHgwMgorI2RlZmluZQlNT0RFMgkJMHgwNAorI2RlZmluZQlNT0RFMwkJMHgwNgorI2RlZmluZQlNT0RFNAkJMHgwOAorI2RlZmluZQlNT0RFNQkJMHgwQQorCisjZGVmaW5lCUJJTkFSWV9DT1VOVAkweDAwCisjZGVmaW5lCUJDRF9DT1VOVAkweDAxCisKKy8qIFRpbWVycyB0aWNrIG92ZXIgYXQgdGhpcyByYXRlICovCisjZGVmaW5lCVRJQ0tTX1BFUl9NUwkxMTkzCisKKy8qIFBhcmFsbGVsIFBlcmlwaGVyYWwgQ29udHJvbGxlciBQb3J0IEIgKi8KKyNkZWZpbmUJUFBDX1BPUlRCCTB4NjEKKworLyogTWVhbmluZyBvZiB0aGUgcG9ydCBiaXRzICovCisjZGVmaW5lCVBQQ0JfVDJPVVQJMHgyMAkvKiBCaXQgNSAqLworI2RlZmluZQlQUENCX1NQS1IJMHgwMgkvKiBCaXQgMSAqLworI2RlZmluZQlQUENCX1QyR0FURQkweDAxCS8qIEJpdCAwICovCisKKy8qIFRpY2tzIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA2NTUzNSAoMCA9PSA2NTUzNikKKyAgIGJlY2F1c2UgaXQgaXMgYSAxNiBiaXQgY291bnRlciAqLworZXh0ZXJuIHZvaWQgbG9hZF90aW1lcjIodW5zaWduZWQgaW50IHRpY2tzKTsKK2V4dGVybiBpbmxpbmUgaW50IHRpbWVyMl9ydW5uaW5nKHZvaWQpCit7CisJcmV0dXJuICgoaW5iKFBQQ19QT1JUQikgJiBQUENCX1QyT1VUKSA9PSAwKTsKK30KKworZXh0ZXJuIGlubGluZSB2b2lkIHdhaXRvbl90aW1lcjIodW5zaWduZWQgaW50IHRpY2tzKQoreworCWxvYWRfdGltZXIyKHRpY2tzKTsKKwl3aGlsZSAoKGluYihQUENfUE9SVEIpICYgUFBDQl9UMk9VVCkgPT0gMCkKKwkJOworfQorCisjZW5kaWYJLyogVElNRVJfSCAqLwpkaWZmIC0tZ2l0IGEvbmV0Ym9vdC90bGFuLmMgYi9uZXRib290L3RsYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2I2OWY3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC90bGFuLmMKQEAgLTAsMCArMSwzNzQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0V0aGVyYm9vdCAtICBCT09UUC9URlRQIEJvb3RzdHJhcCBQcm9ncmFtCitUTEFOIGRyaXZlciBmb3IgRXRoZXJib290CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKy8qIHRvIGdldCBzb21lIGdsb2JhbCByb3V0aW5lcyBsaWtlIHByaW50ZiAqLworI2luY2x1ZGUgImV0aGVyYm9vdC5oIgorLyogdG8gZ2V0IHRoZSBpbnRlcmZhY2UgdG8gdGhlIGJvZHkgb2YgdGhlIHByb2dyYW0gKi8KKyNpbmNsdWRlICJuaWMuaCIKKy8qIHRvIGdldCB0aGUgUENJIHN1cHBvcnQgZnVuY3Rpb25zLCBpZiB0aGlzIGlzIGEgUENJIE5JQyAqLworI2luY2x1ZGUgInBjaS5oIgorLyogdG8gZ2V0IG91ciBvd24gcHJvdG90eXBlICovCisjaW5jbHVkZSAiY2FyZHMuaCIKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFRMYW4gRGVmaW5pdGlvbnMKKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFRMQU5fTUlOX0ZSQU1FX1NJWkUJNjQKKyNkZWZpbmUgVExBTl9NQVhfRlJBTUVfU0laRQkxNjAwCisKKyNkZWZpbmUgVExBTl9OVU1fUlhfTElTVFMJMzIKKyNkZWZpbmUgVExBTl9OVU1fVFhfTElTVFMJNjQKKworI2RlZmluZSBUTEFOX0lHTk9SRQkJMAorI2RlZmluZSBUTEFOX1JFQ09SRAkJMQorCisjZGVmaW5lIFRMQU5fREJHKGx2bCwgZm9ybWF0LCBhcmdzLi4uKQlpZiAoZGVidWcmbHZsKSBwcmludGYoIlRMQU46ICIgZm9ybWF0LCAjI2FyZ3MgKTsKKyNkZWZpbmUgVExBTl9ERUJVR19HTlJMCQkweDAwMDEKKyNkZWZpbmUgVExBTl9ERUJVR19UWAkJMHgwMDAyCisjZGVmaW5lIFRMQU5fREVCVUdfUlgJCTB4MDAwNCAKKyNkZWZpbmUgVExBTl9ERUJVR19MSVNUCQkweDAwMDgKKyNkZWZpbmUgVExBTl9ERUJVR19QUk9CRQkweDAwMTAKKworI2RlZmluZSBNQVhfVExBTl9CT0FSRFMJCTgJIC8qIE1heCBudW1iZXIgb2YgYm9hcmRzIGluc3RhbGxlZCBhdCBhIHRpbWUgKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIERldmljZSBJZGVudGlmaWNhdGlvbiBEZWZpbml0aW9ucworCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJCQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FVEVMTElHRU5UXzEwX1QyCQkJMHhCMDEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVURUxMSUdFTlRfMTBfMTAwX1dTXzUxMDAJMHhCMDMwCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjE4MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIxODMJCQkweDAwMTMKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIzMjUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI1CQkJMHgwMDEyCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjMyNgkJCTB4MDAxNAorI2VuZGlmCisjZGVmaW5lIFRMQU5fQURBUFRFUl9OT05FCQkweDAwMDAwMDAwCisjZGVmaW5lIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZCTB4MDAwMDAwMDEKKyNkZWZpbmUgVExBTl9BREFQVEVSX0JJVF9SQVRFX1BIWQkweDAwMDAwMDAyCisjZGVmaW5lIFRMQU5fQURBUFRFUl9VU0VfSU5URVJOXzEwCTB4MDAwMDAwMDQKKyNkZWZpbmUgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRAkweDAwMDAwMDA4CisjZGVmaW5lIFRMQU5fU1BFRURfREVGQVVMVAkwCisjZGVmaW5lIFRMQU5fU1BFRURfMTAJCTEwCisjZGVmaW5lIFRMQU5fU1BFRURfMTAwCQkxMDAKKyNkZWZpbmUgVExBTl9EVVBMRVhfREVGQVVMVAkwCisjZGVmaW5lIFRMQU5fRFVQTEVYX0hBTEYJMQorI2RlZmluZSBUTEFOX0RVUExFWF9GVUxMCTIKKyNkZWZpbmUgVExBTl9CVUZGRVJTX1BFUl9MSVNUCTEwCisjZGVmaW5lIFRMQU5fTEFTVF9CVUZGRVIJMHg4MDAwMDAwMAorI2RlZmluZSBUTEFOX0NTVEFUX1VOVVNFRAkweDgwMDAKKyNkZWZpbmUgVExBTl9DU1RBVF9GUk1fQ01QCTB4NDAwMAorI2RlZmluZSBUTEFOX0NTVEFUX1JFQURZCTB4MzAwMAorI2RlZmluZSBUTEFOX0NTVEFUX0VPQwkJMHgwODAwCisjZGVmaW5lIFRMQU5fQ1NUQVRfUlhfRVJST1IJMHgwNDAwCisjZGVmaW5lIFRMQU5fQ1NUQVRfUEFTU19DUkMJMHgwMjAwCisjZGVmaW5lIFRMQU5fQ1NUQVRfRFBfUFIJMHgwMTAwCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBQSFkgZGVmaW5pdGlvbnMKKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFRMQU5fUEhZX01BWF9BRERSCTB4MUYKKyNkZWZpbmUgVExBTl9QSFlfTk9ORQkJMHgyMAorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogVExhbiBEcml2ZXIgVGltZXIgRGVmaW5pdGlvbnMKKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFRMQU5fVElNRVJfTElOS19CRUFUCQkxCisjZGVmaW5lIFRMQU5fVElNRVJfQUNUSVZJVFkJCTIKKyNkZWZpbmUgVExBTl9USU1FUl9QSFlfUERPV04JCTMKKyNkZWZpbmUgVExBTl9USU1FUl9QSFlfUFVQCQk0CisjZGVmaW5lIFRMQU5fVElNRVJfUEhZX1JFU0VUCQk1CisjZGVmaW5lIFRMQU5fVElNRVJfUEhZX1NUQVJUX0xJTksJNgorI2RlZmluZSBUTEFOX1RJTUVSX1BIWV9GSU5JU0hfQU4JNworI2RlZmluZSBUTEFOX1RJTUVSX0ZJTklTSF9SRVNFVAkJOAorI2RlZmluZSBUTEFOX1RJTUVSX0FDVF9ERUxBWQkJKEhaLzEwKQorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogVExhbiBEcml2ZXIgRWVwcm9tIERlZmluaXRpb25zCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUTEFOX0VFUFJPTV9BQ0sJCTAKKyNkZWZpbmUgVExBTl9FRVBST01fU1RPUAkxCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBIb3N0IFJlZ2lzdGVyIE9mZnNldHMgYW5kIENvbnRlbnRzCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUTEFOX0hPU1RfQ01ECQkJMHgwMAorI2RlZmluZSAJVExBTl9IQ19HTwkJMHg4MDAwMDAwMAorI2RlZmluZQkJVExBTl9IQ19TVE9QCQkweDQwMDAwMDAwCisjZGVmaW5lCQlUTEFOX0hDX0FDSwkJMHgyMDAwMDAwMAorI2RlZmluZQkJVExBTl9IQ19DU19NQVNLCQkweDFGRTAwMDAwCisjZGVmaW5lCQlUTEFOX0hDX0VPQwkJMHgwMDEwMDAwMAorI2RlZmluZQkJVExBTl9IQ19SVAkJMHgwMDA4MDAwMAorI2RlZmluZQkJVExBTl9IQ19ORVMJCTB4MDAwNDAwMDAKKyNkZWZpbmUJCVRMQU5fSENfQURfUlNUCQkweDAwMDA4MDAwCisjZGVmaW5lCQlUTEFOX0hDX0xEX1RNUgkJMHgwMDAwNDAwMAorI2RlZmluZQkJVExBTl9IQ19MRF9USFIJCTB4MDAwMDIwMDAKKyNkZWZpbmUJCVRMQU5fSENfUkVRX0lOVAkJMHgwMDAwMTAwMAorI2RlZmluZQkJVExBTl9IQ19JTlRfT0ZGCQkweDAwMDAwODAwCisjZGVmaW5lCQlUTEFOX0hDX0lOVF9PTgkJMHgwMDAwMDQwMAorI2RlZmluZQkJVExBTl9IQ19BQ19NQVNLCQkweDAwMDAwMEZGCisjZGVmaW5lIFRMQU5fQ0hfUEFSTQkJCTB4MDQKKyNkZWZpbmUgVExBTl9ESU9fQURSCQkJMHgwOAorI2RlZmluZQkJVExBTl9EQV9BRFJfSU5DCQkweDgwMDAKKyNkZWZpbmUJCVRMQU5fREFfUkFNX0FEUgkJMHg0MDAwCisjZGVmaW5lIFRMQU5fSE9TVF9JTlQJCQkweDBBCisjZGVmaW5lCQlUTEFOX0hJX0lWX01BU0sJCTB4MUZFMAorI2RlZmluZQkJVExBTl9ISV9JVF9NQVNLCQkweDAwMUMKKyNkZWZpbmUgVExBTl9ESU9fREFUQQkJCTB4MEMKKworLyogVGh1bmRlckxBTiBJbnRlcm5hbCBSZWdpc3RlciBESU8gT2Zmc2V0cyAqLworCisjZGVmaW5lIFRMQU5fTkVUX0NNRAkJCTB4MDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NNRF9OUkVTRVQJMHg4MAorI2RlZmluZQkJVExBTl9ORVRfQ01EX05XUkFQCTB4NDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NNRF9DU0YJMHgyMAorI2RlZmluZQkJVExBTl9ORVRfQ01EX0NBRgkweDEwCisjZGVmaW5lCQlUTEFOX05FVF9DTURfTk9CUlgJMHgwOAorI2RlZmluZQkJVExBTl9ORVRfQ01EX0RVUExFWAkweDA0CisjZGVmaW5lCQlUTEFOX05FVF9DTURfVFJGUkFNCTB4MDIKKyNkZWZpbmUJCVRMQU5fTkVUX0NNRF9UWFBBQ0UJMHgwMQorI2RlZmluZSBUTEFOX05FVF9TSU8JCQkweDAxCisjZGVmaW5lIAlUTEFOX05FVF9TSU9fTUlOVEVOCTB4ODAKKyNkZWZpbmUJCVRMQU5fTkVUX1NJT19FQ0xPSwkweDQwCisjZGVmaW5lCQlUTEFOX05FVF9TSU9fRVRYRU4JMHgyMAorI2RlZmluZQkJVExBTl9ORVRfU0lPX0VEQVRBCTB4MTAKKyNkZWZpbmUJCVRMQU5fTkVUX1NJT19OTVJTVAkweDA4CisjZGVmaW5lCQlUTEFOX05FVF9TSU9fTUNMSwkweDA0CisjZGVmaW5lCQlUTEFOX05FVF9TSU9fTVRYRU4JMHgwMgorI2RlZmluZQkJVExBTl9ORVRfU0lPX01EQVRBCTB4MDEKKyNkZWZpbmUgVExBTl9ORVRfU1RTCQkJMHgwMgorI2RlZmluZQkJVExBTl9ORVRfU1RTX01JUlEJMHg4MAorI2RlZmluZQkJVExBTl9ORVRfU1RTX0hCRUFUCTB4NDAKKyNkZWZpbmUJCVRMQU5fTkVUX1NUU19UWFNUT1AJMHgyMAorI2RlZmluZQkJVExBTl9ORVRfU1RTX1JYU1RPUAkweDEwCisjZGVmaW5lCQlUTEFOX05FVF9TVFNfUlNSVkQJMHgwRgorI2RlZmluZSBUTEFOX05FVF9NQVNLCQkJMHgwMworI2RlZmluZQkJVExBTl9ORVRfTUFTS19NQVNLNwkweDgwCisjZGVmaW5lCQlUTEFOX05FVF9NQVNLX01BU0s2CTB4NDAKKyNkZWZpbmUJCVRMQU5fTkVUX01BU0tfTUFTSzUJMHgyMAorI2RlZmluZQkJVExBTl9ORVRfTUFTS19NQVNLNAkweDEwCisjZGVmaW5lCQlUTEFOX05FVF9NQVNLX1JTUlZECTB4MEYKKyNkZWZpbmUgVExBTl9ORVRfQ09ORklHCQkJMHgwNAorI2RlZmluZSAJVExBTl9ORVRfQ0ZHX1JDTEsJMHg4MDAwCisjZGVmaW5lCQlUTEFOX05FVF9DRkdfVENMSwkweDQwMDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NGR19CSVQJMHgyMDAwCisjZGVmaW5lCQlUTEFOX05FVF9DRkdfUlhDUkMJMHgxMDAwCisjZGVmaW5lCQlUTEFOX05FVF9DRkdfUEVGCTB4MDgwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHXzFGUkFHCTB4MDQwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHXzFDSEFOCTB4MDIwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHX01URVNUCTB4MDEwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHX1BIWV9FTgkweDAwODAKKyNkZWZpbmUJCVRMQU5fTkVUX0NGR19NU01BU0sJMHgwMDdGCisjZGVmaW5lIFRMQU5fTUFOX1RFU1QJCQkweDA2CisjZGVmaW5lIFRMQU5fREVGX1ZFTkRPUl9JRAkJMHgwOAorI2RlZmluZSBUTEFOX0RFRl9ERVZJQ0VfSUQJCTB4MEEKKyNkZWZpbmUgVExBTl9ERUZfUkVWSVNJT04JCTB4MEMKKyNkZWZpbmUgVExBTl9ERUZfU1VCQ0xBU1MJCTB4MEQKKyNkZWZpbmUgVExBTl9ERUZfTUlOX0xBVAkJMHgwRQorI2RlZmluZSBUTEFOX0RFRl9NQVhfTEFUCQkweDBGCisjZGVmaW5lIFRMQU5fQVJFR18wCQkJMHgxMAorI2RlZmluZSBUTEFOX0FSRUdfMQkJCTB4MTYKKyNkZWZpbmUgVExBTl9BUkVHXzIJCQkweDFDCisjZGVmaW5lIFRMQU5fQVJFR18zCQkJMHgyMgorI2RlZmluZSBUTEFOX0hBU0hfMQkJCTB4MjgKKyNkZWZpbmUgVExBTl9IQVNIXzIJCQkweDJDCisjZGVmaW5lIFRMQU5fR09PRF9UWF9GUk1TCQkweDMwCisjZGVmaW5lIFRMQU5fVFhfVU5ERVJVTlMJCTB4MzMKKyNkZWZpbmUgVExBTl9HT09EX1JYX0ZSTVMJCTB4MzQKKyNkZWZpbmUgVExBTl9SWF9PVkVSUlVOUwkJMHgzNworI2RlZmluZSBUTEFOX0RFRkVSUkVEX1RYCQkweDM4CisjZGVmaW5lIFRMQU5fQ1JDX0VSUk9SUwkJCTB4M0EKKyNkZWZpbmUgVExBTl9DT0RFX0VSUk9SUwkJMHgzQgorI2RlZmluZSBUTEFOX01VTFRJQ09MX0ZSTVMJCTB4M0MKKyNkZWZpbmUgVExBTl9TSU5HTEVDT0xfRlJNUwkJMHgzRQorI2RlZmluZSBUTEFOX0VYQ0VTU0NPTF9GUk1TCQkweDQwCisjZGVmaW5lIFRMQU5fTEFURV9DT0xTCQkJMHg0MQorI2RlZmluZSBUTEFOX0NBUlJJRVJfTE9TUwkJMHg0MgorI2RlZmluZSBUTEFOX0FDT01NSVQJCQkweDQzCisjZGVmaW5lIFRMQU5fTEVEX1JFRwkJCTB4NDQKKyNkZWZpbmUJCVRMQU5fTEVEX0FDVAkJMHgxMAorI2RlZmluZQkJVExBTl9MRURfTElOSwkJMHgwMQorI2RlZmluZSBUTEFOX0JTSVpFX1JFRwkJCTB4NDUKKyNkZWZpbmUgVExBTl9NQVhfUlgJCQkweDQ2CisjZGVmaW5lIFRMQU5fSU5UX0RJUwkJCTB4NDgKKyNkZWZpbmUJCVRMQU5fSURfVFhfRU9DCQkweDA0CisjZGVmaW5lCQlUTEFOX0lEX1JYX0VPRgkJMHgwMgorI2RlZmluZQkJVExBTl9JRF9SWF9FT0MJCTB4MDEKKworLyogVGh1bmRlckxBTiBJbnRlcnJ1cHQgQ29kZXMgKi8KKworI2RlZmluZSBUTEFOX0lOVF9OVU1CRVJfT0ZfSU5UUwk4CisKKyNkZWZpbmUgVExBTl9JTlRfTk9ORQkJCTB4MDAwMAorI2RlZmluZSBUTEFOX0lOVF9UWF9FT0YJCQkweDAwMDEKKyNkZWZpbmUgVExBTl9JTlRfU1RBVF9PVkVSRkxPVwkJMHgwMDAyCisjZGVmaW5lIFRMQU5fSU5UX1JYX0VPRgkJCTB4MDAwMworI2RlZmluZSBUTEFOX0lOVF9EVU1NWQkJCTB4MDAwNAorI2RlZmluZSBUTEFOX0lOVF9UWF9FT0MJCQkweDAwMDUKKyNkZWZpbmUgVExBTl9JTlRfU1RBVFVTX0NIRUNLCQkweDAwMDYKKyNkZWZpbmUgVExBTl9JTlRfUlhfRU9DCQkJMHgwMDA3CisjZGVmaW5lIFRMQU5fVExQSFlfSUQJCQkweDEwCisjZGVmaW5lIFRMQU5fVExQSFlfQ1RMCQkJMHgxMQorI2RlZmluZSAJVExBTl9UQ19JR0xJTksJCTB4ODAwMAorI2RlZmluZQkJVExBTl9UQ19TV0FQT0wJCTB4NDAwMAorI2RlZmluZQkJVExBTl9UQ19BVUlTRUwJCTB4MjAwMAorI2RlZmluZQkJVExBTl9UQ19TUUVFTgkJMHgxMDAwCisjZGVmaW5lCQlUTEFOX1RDX01URVNUCQkweDA4MDAKKyNkZWZpbmUJCVRMQU5fVENfUkVTRVJWRUQJMHgwN0Y4CisjZGVmaW5lCQlUTEFOX1RDX05GRVcJCTB4MDAwNAorI2RlZmluZQkJVExBTl9UQ19JTlRFTgkJMHgwMDAyCisjZGVmaW5lCQlUTEFOX1RDX1RJTlQJCTB4MDAwMQorI2RlZmluZSBUTEFOX1RMUEhZX1NUUwkJCTB4MTIKKyNkZWZpbmUJCVRMQU5fVFNfTUlOVAkJMHg4MDAwCisjZGVmaW5lCQlUTEFOX1RTX1BIT0sJCTB4NDAwMAorI2RlZmluZQkJVExBTl9UU19QT0xPSwkJMHgyMDAwCisjZGVmaW5lCQlUTEFOX1RTX1RQRU5FUkdZCTB4MTAwMAorI2RlZmluZQkJVExBTl9UU19SRVNFUlZFRAkweDBGRkYKKyNkZWZpbmUgVExBTl9UTFBIWV9QQVIJCQkweDE5CisjZGVmaW5lCQlUTEFOX1BIWV9DSU1fU1RBVAkweDAwMjAKKyNkZWZpbmUJCVRMQU5fUEhZX1NQRUVEXzEwMAkweDAwNDAKKyNkZWZpbmUJCVRMQU5fUEhZX0RVUExFWF9GVUxMCTB4MDA4MAorI2RlZmluZQkJVExBTl9QSFlfQU5fRU5fU1RBVCAgICAgMHgwNDAwCisKKworLyogVGh1bmRlckxBTiBNSUkgUmVnaXN0ZXJzICovCisKKy8qIEdlbmVyaWMgTUlJL1BIWSBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBNSUlfR0VOX0NUTAkJCTB4MDAKKyNkZWZpbmUgCU1JSV9HQ19SRVNFVAkJMHg4MDAwCisjZGVmaW5lCQlNSUlfR0NfTE9PUEJLCQkweDQwMDAKKyNkZWZpbmUJCU1JSV9HQ19TUEVFRFNFTAkJMHgyMDAwCisjZGVmaW5lCQlNSUlfR0NfQVVUT0VOQgkJMHgxMDAwCisjZGVmaW5lCQlNSUlfR0NfUERPV04JCTB4MDgwMAorI2RlZmluZQkJTUlJX0dDX0lTT0xBVEUJCTB4MDQwMAorI2RlZmluZQkJTUlJX0dDX0FVVE9SU1JUCQkweDAyMDAKKyNkZWZpbmUJCU1JSV9HQ19EVVBMRVgJCTB4MDEwMAorI2RlZmluZQkJTUlJX0dDX0NPTFRFU1QJCTB4MDA4MAorI2RlZmluZQkJTUlJX0dDX1JFU0VSVkVECQkweDAwN0YKKyNkZWZpbmUgTUlJX0dFTl9TVFMJCQkweDAxCisjZGVmaW5lCQlNSUlfR1NfMTAwQlQ0CQkweDgwMDAKKyNkZWZpbmUJCU1JSV9HU18xMDBCVFhGRAkJMHg0MDAwCisjZGVmaW5lCQlNSUlfR1NfMTAwQlRYSEQJCTB4MjAwMAorI2RlZmluZQkJTUlJX0dTXzEwQlRGRAkJMHgxMDAwCisjZGVmaW5lCQlNSUlfR1NfMTBCVEhECQkweDA4MDAKKyNkZWZpbmUJCU1JSV9HU19SRVNFUlZFRAkJMHgwN0MwCisjZGVmaW5lCQlNSUlfR1NfQVVUT0NNUExUCTB4MDAyMAorI2RlZmluZQkJTUlJX0dTX1JGTFQJCTB4MDAxMAorI2RlZmluZQkJTUlJX0dTX0FVVE9ORUcJCTB4MDAwOAorI2RlZmluZQkJTUlJX0dTX0xJTksJCTB4MDAwNAorI2RlZmluZQkJTUlJX0dTX0pBQkJFUgkJMHgwMDAyCisjZGVmaW5lCQlNSUlfR1NfRVhUQ0FQCQkweDAwMDEKKyNkZWZpbmUgTUlJX0dFTl9JRF9ISQkJCTB4MDIKKyNkZWZpbmUgTUlJX0dFTl9JRF9MTwkJCTB4MDMKKyNkZWZpbmUgCU1JSV9HSUxfT1VJCQkweEZDMDAKKyNkZWZpbmUgCU1JSV9HSUxfTU9ERUwJCTB4MDNGMAorI2RlZmluZSAJTUlJX0dJTF9SRVZJU0lPTgkweDAwMEYKKyNkZWZpbmUgTUlJX0FOX0FEVgkJCTB4MDQKKyNkZWZpbmUgTUlJX0FOX0xQQQkJCTB4MDUKKyNkZWZpbmUgTUlJX0FOX0VYUAkJCTB4MDYKKworLyogVGh1bmRlckxBTiBTcGVjaWZpYyBNSUkvUEhZIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIAlUTEFOX1RDX0lHTElOSwkJMHg4MDAwCisjZGVmaW5lCQlUTEFOX1RDX1NXQVBPTAkJMHg0MDAwCisjZGVmaW5lCQlUTEFOX1RDX0FVSVNFTAkJMHgyMDAwCisjZGVmaW5lCQlUTEFOX1RDX1NRRUVOCQkweDEwMDAKKyNkZWZpbmUJCVRMQU5fVENfTVRFU1QJCTB4MDgwMAorI2RlZmluZQkJVExBTl9UQ19SRVNFUlZFRAkweDA3RjgKKyNkZWZpbmUJCVRMQU5fVENfTkZFVwkJMHgwMDA0CisjZGVmaW5lCQlUTEFOX1RDX0lOVEVOCQkweDAwMDIKKyNkZWZpbmUJCVRMQU5fVENfVElOVAkJMHgwMDAxCisjZGVmaW5lCQlUTEFOX1RTX01JTlQJCTB4ODAwMAorI2RlZmluZQkJVExBTl9UU19QSE9LCQkweDQwMDAKKyNkZWZpbmUJCVRMQU5fVFNfUE9MT0sJCTB4MjAwMAorI2RlZmluZQkJVExBTl9UU19UUEVORVJHWQkweDEwMDAKKyNkZWZpbmUJCVRMQU5fVFNfUkVTRVJWRUQJMHgwRkZGCisjZGVmaW5lCQlUTEFOX1BIWV9DSU1fU1RBVAkweDAwMjAKKyNkZWZpbmUJCVRMQU5fUEhZX1NQRUVEXzEwMAkweDAwNDAKKyNkZWZpbmUJCVRMQU5fUEhZX0RVUExFWF9GVUxMCTB4MDA4MAorI2RlZmluZQkJVExBTl9QSFlfQU5fRU5fU1RBVCAgICAgMHgwNDAwCisKKy8qIE5hdGlvbmFsIFNlbS4gJiBMZXZlbDEgUEhZIGlkJ3MgKi8KKyNkZWZpbmUgTkFUX1NFTV9JRDEJCQkweDIwMDAKKyNkZWZpbmUgTkFUX1NFTV9JRDIJCQkweDVDMDEKKyNkZWZpbmUgTEVWRUwxX0lEMQkJCTB4NzgxMAorI2RlZmluZSBMRVZFTDFfSUQyCQkJMHgwMDAwCisKKyNkZWZpbmUgVExhbl9DbGVhckJpdCggYml0LCBwb3J0ICkJb3V0Yl9wKGluYl9wKHBvcnQpICYgfmJpdCwgcG9ydCkKKyNkZWZpbmUgVExhbl9HZXRCaXQoIGJpdCwgcG9ydCApCSgoaW50KSAoaW5iX3AocG9ydCkgJiBiaXQpKQorI2RlZmluZSBUTGFuX1NldEJpdCggYml0LCBwb3J0ICkJb3V0Yl9wKGluYl9wKHBvcnQpIHwgYml0LCBwb3J0KQorCit0eXBlZGVmCXVuc2lnbmVkIGludAl1MzI7Cit0eXBlZGVmCXVuc2lnbmVkIHNob3J0CXUxNjsKK3R5cGVkZWYJdW5zaWduZWQgY2hhcgl1ODsKKworLyogUm91dGluZXMgdG8gYWNjZXNzIGludGVybmFsIHJlZ2lzdGVycy4gKi8KKworaW5saW5lIHU4IFRMYW5fRGlvUmVhZDgodTE2IGJhc2VfYWRkciwgdTE2IGludGVybmFsX2FkZHIpCit7CisJb3V0dyhpbnRlcm5hbF9hZGRyLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOworCXJldHVybiAoaW5iKChiYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBKSArIChpbnRlcm5hbF9hZGRyICYgMHgzKSkpOworCQorfSAvKiBUTGFuX0Rpb1JlYWQ4ICovCisKK2lubGluZSB1MTYgVExhbl9EaW9SZWFkMTYodTE2IGJhc2VfYWRkciwgdTE2IGludGVybmFsX2FkZHIpCit7CisJb3V0dyhpbnRlcm5hbF9hZGRyLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOworCXJldHVybiAoaW53KChiYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBKSArIChpbnRlcm5hbF9hZGRyICYgMHgyKSkpOworCit9IC8qIFRMYW5fRGlvUmVhZDE2ICovCisKK2lubGluZSB1MzIgVExhbl9EaW9SZWFkMzIodTE2IGJhc2VfYWRkciwgdTE2IGludGVybmFsX2FkZHIpCit7CisJb3V0dyhpbnRlcm5hbF9hZGRyLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOworCXJldHVybiAoaW5sKGJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEpKTsKKworfSAvKiBUTGFuX0Rpb1JlYWQzMiAqLworCitpbmxpbmUgdm9pZCBUTGFuX0Rpb1dyaXRlOCh1MTYgYmFzZV9hZGRyLCB1MTYgaW50ZXJuYWxfYWRkciwgdTggZGF0YSkKK3sKKwlvdXR3KGludGVybmFsX2FkZHIsIGJhc2VfYWRkciArIFRMQU5fRElPX0FEUik7CisJb3V0YihkYXRhLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgKGludGVybmFsX2FkZHIgJiAweDMpKTsKKworfQorCitpbmxpbmUgdm9pZCBUTGFuX0Rpb1dyaXRlMTYodTE2IGJhc2VfYWRkciwgdTE2IGludGVybmFsX2FkZHIsIHUxNiBkYXRhKQoreworCW91dHcoaW50ZXJuYWxfYWRkciwgYmFzZV9hZGRyICsgVExBTl9ESU9fQURSKTsKKwlvdXR3KGRhdGEsIGJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAoaW50ZXJuYWxfYWRkciAmIDB4MikpOworCit9CisKK2lubGluZSB2b2lkIFRMYW5fRGlvV3JpdGUzMih1MTYgYmFzZV9hZGRyLCB1MTYgaW50ZXJuYWxfYWRkciwgdTMyIGRhdGEpCit7CisJb3V0dyhpbnRlcm5hbF9hZGRyLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOworCW91dGwoZGF0YSwgYmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIChpbnRlcm5hbF9hZGRyICYgMHgyKSk7CisKK30KKworLyogTklDIHNwZWNpZmljIHN0YXRpYyB2YXJpYWJsZXMgZ28gaGVyZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJVGh1bmRlckxBTiBEcml2ZXIgRWVwcm9tIHJvdXRpbmVzCisKKwlUaGUgQ29tcGFxIE5ldGVsbGlnZW50IDEwIGFuZCAxMC8xMDAgY2FyZHMgdXNlIGEgTWljcm9jaGlwIDI0QzAyQQorCUVFUFJPTS4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgYmFzZWQgb24gaW5mb3JtYXRpb24gaW4gTWljcm9jaGlwJ3MKKwlkYXRhIHNoZWV0LiAgSSBkb24ndCBrbm93IGhvdyB3ZWxsIHRoaXMgZnVuY3Rpb25zIHdpbGwgd29yayB3aXRoCisJb3RoZXIgRUVQUk9Ncy4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX0VlU2VuZFN0YXJ0CisJICoKKwkgKglSZXR1cm5zOgorCSAqCQlOb3RoaW5nCisJICoJUGFybXM6CQorCSAqCQlpb19iYXNlCQlUaGUgSU8gcG9ydCBiYXNlIGFkZHJlc3MgZm9yIHRoZQorCSAqCQkJCVRMQU4gZGV2aWNlIHdpdGggdGhlIEVFUFJPTSB0bworCSAqCQkJCXVzZS4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gc2VuZHMgYSBzdGFydCBjeWNsZSB0byBhbiBFRVBST00gYXR0YWNoZWQKKwkgKgl0byBhIFRMQU4gY2hpcC4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgVExhbl9FZVNlbmRTdGFydCggdTE2IGlvX2Jhc2UgKQoreworCXUxNglzaW87CisKKwlvdXR3KCBUTEFOX05FVF9TSU8sIGlvX2Jhc2UgKyBUTEFOX0RJT19BRFIgKTsKKwlzaW8gPSBpb19iYXNlICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKworCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOworCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOworCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRVRYRU4sIHNpbyApOworCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FREFUQSwgc2lvICk7CisJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKKworfSAvKiBUTGFuX0VlU2VuZFN0YXJ0ICovCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9FZVNlbmRCeXRlCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQlJZiB0aGUgY29ycmVjdCBhY2sgd2FzIHJlY2VpdmVkLCAwLCBvdGhlcndpc2UgMQorCSAqCVBhcm1zOglpb19iYXNlCQlUaGUgSU8gcG9ydCBiYXNlIGFkZHJlc3MgZm9yIHRoZQorCSAqCQkJCVRMQU4gZGV2aWNlIHdpdGggdGhlIEVFUFJPTSB0bworCSAqCQkJCXVzZS4KKwkgKgkJZGF0YQkJVGhlIDggYml0cyBvZiBpbmZvcm1hdGlvbiB0bworCSAqCQkJCXNlbmQgdG8gdGhlIEVFUFJPTS4KKwkgKgkJc3RvcAkJSWYgVExBTl9FRVBST01fU1RPUCBpcyBwYXNzZWQsIGEKKwkgKgkJCQlzdG9wIGN5Y2xlIGlzIHNlbnQgYWZ0ZXIgdGhlCisJICoJCQkJYnl0ZSBpcyBzZW50IGFmdGVyIHRoZSBhY2sgaXMKKwkgKgkJCQlyZWFkLgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBzZW5kcyBhIGJ5dGUgb24gdGhlIHNlcmlhbCBFRVBST00gbGluZSwKKwkgKglkcml2aW5nIHRoZSBjbG9jayB0byBzZW5kIGVhY2ggYml0LiBUaGUgZnVuY3Rpb24gdGhlbgorCSAqCXJldmVyc2VzIHRyYW5zbWlzc2lvbiBkaXJlY3Rpb24gYW5kIHJlYWRzIGFuIGFja25vd2xlZGdlCisJICoJYml0LgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IFRMYW5fRWVTZW5kQnl0ZSggdTE2IGlvX2Jhc2UsIHU4IGRhdGEsIGludCBzdG9wICkKK3sKKwlpbnQJZXJyOworCXU4CXBsYWNlOworCXUxNglzaW87CisKKwlvdXR3KCBUTEFOX05FVF9TSU8sIGlvX2Jhc2UgKyBUTEFOX0RJT19BRFIgKTsKKwlzaW8gPSBpb19iYXNlICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKworCS8qIEFzc3VtZSBjbG9jayBpcyBsb3csIHR4IGlzIGVuYWJsZWQ7ICovCisJZm9yICggcGxhY2UgPSAweDgwOyBwbGFjZSAhPSAwOyBwbGFjZSA+Pj0gMSApIHsKKwkJaWYgKCBwbGFjZSAmIGRhdGEgKQorCQkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FREFUQSwgc2lvICk7CisJCWVsc2UKKwkJCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FREFUQSwgc2lvICk7CisJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOworCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOworCX0KKwlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRVRYRU4sIHNpbyApOworCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOworCWVyciA9IFRMYW5fR2V0Qml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOworCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7CisJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FVFhFTiwgc2lvICk7CisKKwlpZiAoICggISBlcnIgKSAmJiBzdG9wICkgeworCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOwkvKiBTVE9QLCByYWlzZSBkYXRhIHdoaWxlIGNsb2NrIGlzIGhpZ2ggKi8KKwkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7CisJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOworCX0KKworCXJldHVybiAoIGVyciApOworCit9IC8qIFRMYW5fRWVTZW5kQnl0ZSAqLworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fRWVSZWNlaXZlQnl0ZQorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQlpb19iYXNlCQlUaGUgSU8gcG9ydCBiYXNlIGFkZHJlc3MgZm9yIHRoZQorCSAqCQkJCVRMQU4gZGV2aWNlIHdpdGggdGhlIEVFUFJPTSB0bworCSAqCQkJCXVzZS4KKwkgKgkJZGF0YQkJQW4gYWRkcmVzcyB0byBhIGNoYXIgdG8gaG9sZCB0aGUKKwkgKgkJCQlkYXRhIHNlbnQgZnJvbSB0aGUgRUVQUk9NLgorCSAqCQlzdG9wCQlJZiBUTEFOX0VFUFJPTV9TVE9QIGlzIHBhc3NlZCwgYQorCSAqCQkJCXN0b3AgY3ljbGUgaXMgc2VudCBhZnRlciB0aGUKKwkgKgkJCQlieXRlIGlzIHJlY2VpdmVkLCBhbmQgbm8gYWNrIGlzCisJICoJCQkJc2VudC4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gcmVjZWl2ZXMgOCBiaXRzIG9mIGRhdGEgZnJvbSB0aGUgRUVQUk9NCisJICoJb3ZlciB0aGUgc2VyaWFsIGxpbmsuICBJdCB0aGVuIHNlbmRzIGFuZCBhY2sgYml0LCBvciBubworCSAqCWFjayBhbmQgYSBzdG9wIGJpdC4gIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXRyaWV2ZQorCSAqCWRhdGEgYWZ0ZXIgdGhlIGFkZHJlc3Mgb2YgYSBieXRlIGluIHRoZSBFRVBST00gaGFzIGJlZW4KKwkgKglzZW50LgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBUTGFuX0VlUmVjZWl2ZUJ5dGUoIHUxNiBpb19iYXNlLCB1OCAqZGF0YSwgaW50IHN0b3AgKQoreworCXU4ICBwbGFjZTsKKwl1MTYgc2lvOworCisJb3V0dyggVExBTl9ORVRfU0lPLCBpb19iYXNlICsgVExBTl9ESU9fQURSICk7CisJc2lvID0gaW9fYmFzZSArIFRMQU5fRElPX0RBVEEgKyBUTEFOX05FVF9TSU87CisJKmRhdGEgPSAwOworCisJLyogQXNzdW1lIGNsb2NrIGlzIGxvdywgdHggaXMgZW5hYmxlZDsgKi8KKwlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRVRYRU4sIHNpbyApOworCWZvciAoIHBsYWNlID0gMHg4MDsgcGxhY2U7IHBsYWNlID4+PSAxICkgeworCQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKKwkJaWYgKCBUTGFuX0dldEJpdCggVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8gKSApCisJCQkqZGF0YSB8PSBwbGFjZTsKKwkJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKKwl9CisKKwlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VUWEVOLCBzaW8gKTsKKwlpZiAoICEgc3RvcCApIHsKKwkJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8gKTsJLyogQWNrID0gMCAqLworCQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKKwkJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKKwl9IGVsc2UgeworCQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8gKTsJCS8qIE5vIGFjayA9IDEgKD8pICovCisJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOworCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOworCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOwkvKiBTVE9QLCByYWlzZSBkYXRhIHdoaWxlIGNsb2NrIGlzIGhpZ2ggKi8KKwkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7CisJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOworCX0KKworfSAvKiBUTGFuX0VlUmVjZWl2ZUJ5dGUgKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX0VlUmVhZEJ5dGUKKwkgKgorCSAqCVJldHVybnM6CisJICoJCU5vIGVycm9yID0gMCwgZWxzZSwgdGhlIHN0YWdlIGF0IHdoaWNoIHRoZSBlcnJvcgorCSAqCQlvY2N1cnJlZC4KKwkgKglQYXJtczoKKwkgKgkJaW9fYmFzZQkJVGhlIElPIHBvcnQgYmFzZSBhZGRyZXNzIGZvciB0aGUKKwkgKgkJCQlUTEFOIGRldmljZSB3aXRoIHRoZSBFRVBST00gdG8KKwkgKgkJCQl1c2UuCisJICoJCWVlX2FkZHIJCVRoZSBhZGRyZXNzIG9mIHRoZSBieXRlIGluIHRoZQorCSAqCQkJCUVFUFJPTSB3aG9zZSBjb250ZW50cyBhcmUgdG8gYmUKKwkgKgkJCQlyZXRyaWV2ZWQuCisJICoJCWRhdGEJCUFuIGFkZHJlc3MgdG8gYSBjaGFyIHRvIGhvbGQgdGhlCisJICoJCQkJZGF0YSBvYnRhaW5lZCBmcm9tIHRoZSBFRVBST00uCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIHJlYWRzIGEgYnl0ZSBvZiBpbmZvcm1hdGlvbiBmcm9tIGFuIGJ5dGUKKwkgKgljZWxsIGluIHRoZSBFRVBST00uCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgVExhbl9FZVJlYWRCeXRlKCB1MTYgaW9fYmFzZSwgdTggZWVfYWRkciwgdTggKmRhdGEgKQoreworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJaW50IHJldD0wOworCisJVExhbl9FZVNlbmRTdGFydCggaW9fYmFzZSApOworCWVyciA9IFRMYW5fRWVTZW5kQnl0ZSggaW9fYmFzZSwgMHhBMCwgVExBTl9FRVBST01fQUNLICk7CisJaWYgKGVycikKKwl7CisJCXJldD0xOworCQlnb3RvIGZhaWw7CisJfQorCWVyciA9IFRMYW5fRWVTZW5kQnl0ZSggaW9fYmFzZSwgZWVfYWRkciwgVExBTl9FRVBST01fQUNLICk7CisJaWYgKGVycikKKwl7CisJCXJldD0yOworCQlnb3RvIGZhaWw7CisJfQorCVRMYW5fRWVTZW5kU3RhcnQoIGlvX2Jhc2UgKTsKKwllcnIgPSBUTGFuX0VlU2VuZEJ5dGUoIGlvX2Jhc2UsIDB4QTEsIFRMQU5fRUVQUk9NX0FDSyApOworCWlmIChlcnIpCisJeworCQlyZXQ9MzsKKwkJZ290byBmYWlsOworCX0KKwlUTGFuX0VlUmVjZWl2ZUJ5dGUoIGlvX2Jhc2UsIGRhdGEsIFRMQU5fRUVQUk9NX1NUT1AgKTsKK2ZhaWw6CisKKwlyZXR1cm4gcmV0OworCit9IC8qIFRMYW5fRWVSZWFkQnl0ZSAqLworCisjaWYJMAorLyogTm90IHlldCBjb252ZXJ0ZWQgZnJvbSBMaW51eCBkcml2ZXIgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlUaHVuZGVyTEFOIERyaXZlciBQSFkgTGF5ZXIgUm91dGluZXMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX1BoeVByaW50CisJICoKKwkgKglSZXR1cm5zOgorCSAqCQlOb3RoaW5nCisJICoJUGFybXM6CisJICoJCWRldglBIHBvaW50ZXIgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUgb2YgdGhlCisJICoJCQlUTEFOIGRldmljZSBoYXZpbmcgdGhlIFBIWXMgdG8gYmUgZGV0YWlsZWQuCisJICoJCQkJCisJICoJVGhpcyBmdW5jdGlvbiBwcmludHMgdGhlIHJlZ2lzdGVycyBhIFBIWSAoYWthIHRyYW5jZWl2ZXIpLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fUGh5UHJpbnQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IGRldi0+cHJpdjsKKwl1MTYgaSwgZGF0YTAsIGRhdGExLCBkYXRhMiwgZGF0YTMsIHBoeTsKKworCXBoeSA9IHByaXYtPnBoeVtwcml2LT5waHlOdW1dOworCisJaWYgKCBwcml2LT5hZGFwdGVyLT5mbGFncyAmIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZICkgeworCQlwcmludGsoICJUTEFOOiAgIERldmljZSAlcywgVW5tYW5hZ2VkIFBIWS5cbiIsIGRldi0+bmFtZSApOworCX0gZWxzZSBpZiAoIHBoeSA8PSBUTEFOX1BIWV9NQVhfQUREUiApIHsKKwkJcHJpbnRrKCAiVExBTjogICBEZXZpY2UgJXMsIFBIWSAweCUwMnguXG4iLCBkZXYtPm5hbWUsIHBoeSApOworCQlwcmludGsoICJUTEFOOiAgICAgIE9mZi4gICswICAgICArMSAgICAgKzIgICAgICszIFxuIiApOworICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgMHgyMDsgaSs9IDQgKSB7CisJCQlwcmludGsoICJUTEFOOiAgICAgIDB4JTAyeCIsIGkgKTsKKwkJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIGksICZkYXRhMCApOworCQkJcHJpbnRrKCAiIDB4JTA0aHgiLCBkYXRhMCApOworCQkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgaSArIDEsICZkYXRhMSApOworCQkJcHJpbnRrKCAiIDB4JTA0aHgiLCBkYXRhMSApOworCQkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgaSArIDIsICZkYXRhMiApOworCQkJcHJpbnRrKCAiIDB4JTA0aHgiLCBkYXRhMiApOworCQkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgaSArIDMsICZkYXRhMyApOworCQkJcHJpbnRrKCAiIDB4JTA0aHhcbiIsIGRhdGEzICk7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGsoICJUTEFOOiAgIERldmljZSAlcywgSW52YWxpZCBQSFkuXG4iLCBkZXYtPm5hbWUgKTsKKwl9CisKK30gLyogVExhbl9QaHlQcmludCAqLworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fUGh5RGV0ZWN0CisJICoKKwkgKglSZXR1cm5zOgorCSAqCQlOb3RoaW5nCisJICoJUGFybXM6CisJICoJCWRldglBIHBvaW50ZXIgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUgb2YgdGhlIGFkYXB0ZXIKKwkgKgkJCWZvciB3aGljaCB0aGUgUEhZIG5lZWRzIGRldGVybWluZWQuCisJICoKKwkgKglTbyBmYXIgSSd2ZSBmb3VuZCB0aGF0IGFkYXB0ZXJzIHdoaWNoIGhhdmUgZXh0ZXJuYWwgUEhZcworCSAqCW1heSBhbHNvIHVzZSB0aGUgaW50ZXJuYWwgUEhZIGZvciBwYXJ0IG9mIHRoZSBmdW5jdGlvbmFsaXR5LgorCSAqCShlZywgQVVJL1RoaW5uZXQpLiAgVGhpcyBmdW5jdGlvbiBmaW5kcyBvdXQgaWYgdGhpcyBUTEFOCisJICoJY2hpcCBoYXMgYW4gaW50ZXJuYWwgUEhZLCBhbmQgdGhlbiBmaW5kcyB0aGUgZmlyc3QgZXh0ZXJuYWwKKwkgKglQSFkgKHN0YXJ0aW5nIGZyb20gYWRkcmVzcyAwKSBpZiBpdCBleGlzdHMpLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fUGh5RGV0ZWN0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlUTGFuUHJpdmF0ZUluZm8gKnByaXYgPSBkZXYtPnByaXY7CisJdTE2CQljb250cm9sOworCXUxNgkJaGk7CisJdTE2CQlsbzsKKwl1MzIJCXBoeTsKKworCWlmICggcHJpdi0+YWRhcHRlci0+ZmxhZ3MgJiBUTEFOX0FEQVBURVJfVU5NQU5BR0VEX1BIWSApIHsKKwkJcHJpdi0+cGh5TnVtID0gMHhGRkZGOworCQlyZXR1cm47CisJfQorCisJVExhbl9NaWlSZWFkUmVnKCBkZXYsIFRMQU5fUEhZX01BWF9BRERSLCBNSUlfR0VOX0lEX0hJLCAmaGkgKTsKKwkKKwlpZiAoIGhpICE9IDB4RkZGRiApIHsKKwkJcHJpdi0+cGh5WzBdID0gVExBTl9QSFlfTUFYX0FERFI7CisJfSBlbHNlIHsKKwkJcHJpdi0+cGh5WzBdID0gVExBTl9QSFlfTk9ORTsKKwl9CisKKwlwcml2LT5waHlbMV0gPSBUTEFOX1BIWV9OT05FOworCWZvciAoIHBoeSA9IDA7IHBoeSA8PSBUTEFOX1BIWV9NQVhfQUREUjsgcGh5KysgKSB7CisJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCAmY29udHJvbCApOworCQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0lEX0hJLCAmaGkgKTsKKwkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9JRF9MTywgJmxvICk7CisJCWlmICggKCBjb250cm9sICE9IDB4RkZGRiApIHx8ICggaGkgIT0gMHhGRkZGICkgfHwgKCBsbyAhPSAweEZGRkYgKSApIHsKKwkJCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICJQSFkgZm91bmQgYXQgJTAyeCAlMDR4ICUwNHggJTA0eFxuIiwgcGh5LCBjb250cm9sLCBoaSwgbG8gKTsKKwkJCWlmICggKCBwcml2LT5waHlbMV0gPT0gVExBTl9QSFlfTk9ORSApICYmICggcGh5ICE9IFRMQU5fUEhZX01BWF9BRERSICkgKSB7CisJCQkJcHJpdi0+cGh5WzFdID0gcGh5OworCQkJfQorCQl9CisJfQorCisJaWYgKCBwcml2LT5waHlbMV0gIT0gVExBTl9QSFlfTk9ORSApIHsKKwkJcHJpdi0+cGh5TnVtID0gMTsKKwl9IGVsc2UgaWYgKCBwcml2LT5waHlbMF0gIT0gVExBTl9QSFlfTk9ORSApIHsKKwkJcHJpdi0+cGh5TnVtID0gMDsKKwl9IGVsc2UgeworCQlwcmludGsoICJUTEFOOiAgQ2Fubm90IGluaXRpYWxpemUgZGV2aWNlLCBubyBQSFkgd2FzIGZvdW5kIVxuIiApOworCX0KKworfSAvKiBUTGFuX1BoeURldGVjdCAqLworCit2b2lkIFRMYW5fUGh5UG93ZXJEb3duKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBkZXYtPnByaXY7CisJdTE2CQl2YWx1ZTsKKworCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICIlczogUG93ZXJpbmcgZG93biBQSFkocykuXG4iLCBkZXYtPm5hbWUgKTsKKwl2YWx1ZSA9IE1JSV9HQ19QRE9XTiB8IE1JSV9HQ19MT09QQksgfCBNSUlfR0NfSVNPTEFURTsKKwlUTGFuX01paVN5bmMoIGRldi0+YmFzZV9hZGRyICk7CisJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwcml2LT5waHlbcHJpdi0+cGh5TnVtXSwgTUlJX0dFTl9DVEwsIHZhbHVlICk7CisJaWYgKCAoIHByaXYtPnBoeU51bSA9PSAwICkgJiYgKCBwcml2LT5waHlbMV0gIT0gVExBTl9QSFlfTk9ORSApICYmICggISAoIHByaXYtPmFkYXB0ZXItPmZsYWdzICYgVExBTl9BREFQVEVSX1VTRV9JTlRFUk5fMTAgKSApICkgeworCQlUTGFuX01paVN5bmMoIGRldi0+YmFzZV9hZGRyICk7CisJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcHJpdi0+cGh5WzFdLCBNSUlfR0VOX0NUTCwgdmFsdWUgKTsKKwl9CisKKwkvKiBXYWl0IGZvciA1MCBtcyBhbmQgcG93ZXJ1cAorCSAqIFRoaXMgaXMgYWJpdHJhcnkuICBJdCBpcyBpbnRlbmRlZCB0byBtYWtlIHN1cmUgdGhlCisJICogdHJhbmNlaXZlciBzZXR0bGVzLgorCSAqLworCVRMYW5fU2V0VGltZXIoIGRldiwgKEhaLzIwKSwgVExBTl9USU1FUl9QSFlfUFVQICk7CisKK30gLyogVExhbl9QaHlQb3dlckRvd24gKi8KKwordm9pZCBUTGFuX1BoeVBvd2VyVXAoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IGRldi0+cHJpdjsKKwl1MTYJCXZhbHVlOworCisJVExBTl9EQkcoIFRMQU5fREVCVUdfR05STCwgIiVzOiBQb3dlcmluZyB1cCBQSFkuXG4iLCBkZXYtPm5hbWUgKTsKKwlUTGFuX01paVN5bmMoIGRldi0+YmFzZV9hZGRyICk7CisJdmFsdWUgPSBNSUlfR0NfTE9PUEJLOworCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcHJpdi0+cGh5W3ByaXYtPnBoeU51bV0sIE1JSV9HRU5fQ1RMLCB2YWx1ZSApOworCVRMYW5fTWlpU3luYyhkZXYtPmJhc2VfYWRkcik7CisJLyogV2FpdCBmb3IgNTAwIG1zIGFuZCByZXNldCB0aGUKKwkgKiB0cmFuY2VpdmVyLiAgVGhlIFRMQU4gZG9jcyBzYXkgYm90aCA1MCBtcyBhbmQKKwkgKiA1MDAgbXMsIHNvIGRvIHRoZSBsb25nZXIsIGp1c3QgaW4gY2FzZS4KKwkgKi8KKwlUTGFuX1NldFRpbWVyKCBkZXYsIChIWi8yMCksIFRMQU5fVElNRVJfUEhZX1JFU0VUICk7CisKK30gLyogVExhbl9QaHlQb3dlclVwICovCisKK3ZvaWQgVExhbl9QaHlSZXNldCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJVExhblByaXZhdGVJbmZvCSpwcml2ID0gZGV2LT5wcml2OworCXUxNgkJcGh5OworCXUxNgkJdmFsdWU7CisKKwlwaHkgPSBwcml2LT5waHlbcHJpdi0+cGh5TnVtXTsKKworCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICIlczogUmVzZXRpbmcgUEhZLlxuIiwgZGV2LT5uYW1lICk7CisJVExhbl9NaWlTeW5jKCBkZXYtPmJhc2VfYWRkciApOworCXZhbHVlID0gTUlJX0dDX0xPT1BCSyB8IE1JSV9HQ19SRVNFVDsKKwlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsIHZhbHVlICk7CisJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsICZ2YWx1ZSApOworCXdoaWxlICggdmFsdWUgJiBNSUlfR0NfUkVTRVQgKSB7CisJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCAmdmFsdWUgKTsKKwl9CisKKwkvKiBXYWl0IGZvciA1MDAgbXMgYW5kIGluaXRpYWxpemUuCisJICogSSBkb24ndCByZW1lbWJlciB3aHkgSSB3YWl0IHRoaXMgbG9uZy4KKwkgKiBJJ3ZlIGNoYW5nZWQgdGhpcyB0byA1MG1zLCBhcyBpdCBzZWVtcyBsb25nIGVub3VnaC4KKwkgKi8KKwlUTGFuX1NldFRpbWVyKCBkZXYsIChIWi8yMCksIFRMQU5fVElNRVJfUEhZX1NUQVJUX0xJTksgKTsKKworfSAvKiBUTGFuX1BoeVJlc2V0ICovCisKK3ZvaWQgVExhbl9QaHlTdGFydExpbmsoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IGRldi0+cHJpdjsKKwl1MTYJCWFiaWxpdHk7CisJdTE2CQljb250cm9sOworCXUxNgkJZGF0YTsKKwl1MTYJCXBoeTsKKwl1MTYJCXN0YXR1czsKKwl1MTYJCXRjdGw7CisKKwlwaHkgPSBwcml2LT5waHlbcHJpdi0+cGh5TnVtXTsKKwlUTEFOX0RCRyggVExBTl9ERUJVR19HTlJMLCAiJXM6IFRyeWluZyB0byBhY3RpdmF0ZSBsaW5rLlxuIiwgZGV2LT5uYW1lICk7CisJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9TVFMsICZzdGF0dXMgKTsKKwlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX1NUUywgJmFiaWxpdHkgKTsKKworCWlmICggKCBzdGF0dXMgJiBNSUlfR1NfQVVUT05FRyApICYmIAorCSAgICAgKCAhIHByaXYtPmF1aSApICkgeworCQlhYmlsaXR5ID0gc3RhdHVzID4+IDExOworCQlpZiAoIHByaXYtPnNwZWVkICA9PSBUTEFOX1NQRUVEXzEwICYmIAorCQkgICAgIHByaXYtPmR1cGxleCA9PSBUTEFOX0RVUExFWF9IQUxGKSB7CisJCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsIDB4MDAwMCk7CisJCX0gZWxzZSBpZiAoIHByaXYtPnNwZWVkID09IFRMQU5fU1BFRURfMTAgJiYKKwkJCSAgICBwcml2LT5kdXBsZXggPT0gVExBTl9EVVBMRVhfRlVMTCkgeworCQkJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBUUlVFOworCQkJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCAweDAxMDApOworCQl9IGVsc2UgaWYgKCBwcml2LT5zcGVlZCA9PSBUTEFOX1NQRUVEXzEwMCAmJgorCQkJICAgIHByaXYtPmR1cGxleCA9PSBUTEFOX0RVUExFWF9IQUxGKSB7CisJCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsIDB4MjAwMCk7CisJCX0gZWxzZSBpZiAoIHByaXYtPnNwZWVkID09IFRMQU5fU1BFRURfMTAwICYmCisJCQkgICAgcHJpdi0+ZHVwbGV4ID09IFRMQU5fRFVQTEVYX0ZVTEwpIHsKKwkJCXByaXYtPnRsYW5GdWxsRHVwbGV4ID0gVFJVRTsKKwkJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0NUTCwgMHgyMTAwKTsKKwkJfSBlbHNlIHsKKwkKKwkJCS8qIFNldCBBdXRvLU5lZyBhZHZlcnRpc2VtZW50ICovCisJCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0FOX0FEViwgKGFiaWxpdHkgPDwgNSkgfCAxKTsKKwkJCS8qIEVuYWJsZWUgQXV0by1OZWcgKi8KKwkJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0NUTCwgMHgxMDAwICk7CisJCQkvKiBSZXN0YXJ0IEF1dG8tTmVnICovCisJCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsIDB4MTIwMCApOworCQkJLyogV2FpdCBmb3IgNCBzZWMgZm9yIGF1dG9uZWdvdGlhdGlvbgorCQkgCSogdG8gY29tcGxldGUuICBUaGUgbWF4IHNwZWMgdGltZSBpcyBsZXNzIHRoYW4gdGhpcworCQkgCSogYnV0IHRoZSBjYXJkIG5lZWQgYWRkaXRpb25hbCB0aW1lIHRvIHN0YXJ0IEFOLgorCQkgCSogLjUgc2VjIHNob3VsZCBiZSBwbGVudHkgZXh0cmEuCisJCSAJKi8KKwkJCXByaW50ayggIlRMQU46ICVzOiBTdGFydGluZyBhdXRvbmVnb3RpYXRpb24uXG4iLCBkZXYtPm5hbWUgKTsKKwkJCVRMYW5fU2V0VGltZXIoIGRldiwgKDIqSFopLCBUTEFOX1RJTUVSX1BIWV9GSU5JU0hfQU4gKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwl9CQorCQorCWlmICggKCBwcml2LT5hdWkgKSAmJiAoIHByaXYtPnBoeU51bSAhPSAwICkgKSB7CisJCXByaXYtPnBoeU51bSA9IDA7CisJCWRhdGEgPSBUTEFOX05FVF9DRkdfMUZSQUcgfCBUTEFOX05FVF9DRkdfMUNIQU4gfCBUTEFOX05FVF9DRkdfUEhZX0VOOworCQlUTGFuX0Rpb1dyaXRlMTYoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9DT05GSUcsIGRhdGEgKTsKKwkJVExhbl9TZXRUaW1lciggZGV2LCAoNDAqSFovMTAwMCksIFRMQU5fVElNRVJfUEhZX1BET1dOICk7CisJCXJldHVybjsKKwl9ICBlbHNlIGlmICggcHJpdi0+cGh5TnVtID09IDAgKSB7CisgICAgICAgIAlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBUTEFOX1RMUEhZX0NUTCwgJnRjdGwgKTsKKwkJaWYgKCBwcml2LT5hdWkgKSB7CisgICAgICAgICAgICAgICAgCXRjdGwgfD0gVExBTl9UQ19BVUlTRUw7CisJCX0gZWxzZSB7IAorICAgICAgICAgICAgICAgIAl0Y3RsICY9IH5UTEFOX1RDX0FVSVNFTDsKKwkJCWNvbnRyb2wgPSAwOworCQkJaWYgKCBwcml2LT5kdXBsZXggPT0gVExBTl9EVVBMRVhfRlVMTCApIHsKKwkJCQljb250cm9sIHw9IE1JSV9HQ19EVVBMRVg7CisJCQkJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBUUlVFOworCQkJfQorCQkJaWYgKCBwcml2LT5zcGVlZCA9PSBUTEFOX1NQRUVEXzEwMCApIHsKKwkJCQljb250cm9sIHw9IE1JSV9HQ19TUEVFRFNFTDsKKwkJCX0KKyAgICAgICAJCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsIGNvbnRyb2wgKTsKKwkJfQorICAgICAgICAJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIFRMQU5fVExQSFlfQ1RMLCB0Y3RsICk7CisJfQorCisJLyogV2FpdCBmb3IgMiBzZWMgdG8gZ2l2ZSB0aGUgdHJhbmNlaXZlciB0aW1lCisJICogdG8gZXN0YWJsaXNoIGxpbmsuCisJICovCisJVExhbl9TZXRUaW1lciggZGV2LCAoNCpIWiksIFRMQU5fVElNRVJfRklOSVNIX1JFU0VUICk7CisKK30gLyogVExhbl9QaHlTdGFydExpbmsgKi8KKwordm9pZCBUTGFuX1BoeUZpbmlzaEF1dG9OZWcoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IGRldi0+cHJpdjsKKwl1MTYJCWFuX2FkdjsKKwl1MTYJCWFuX2xwYTsKKwl1MTYJCWRhdGE7CisJdTE2CQltb2RlOworCXUxNgkJcGh5OworCXUxNgkJc3RhdHVzOworCQorCXBoeSA9IHByaXYtPnBoeVtwcml2LT5waHlOdW1dOworCisJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9TVFMsICZzdGF0dXMgKTsKKwl1ZGVsYXkoIDEwMDAgKTsKKwlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX1NUUywgJnN0YXR1cyApOworCisJaWYgKCAhICggc3RhdHVzICYgTUlJX0dTX0FVVE9DTVBMVCApICkgeworCQkvKiBXYWl0IGZvciA4IHNlYyB0byBnaXZlIHRoZSBwcm9jZXNzCisJCSAqIG1vcmUgdGltZS4gIFBlcmhhcHMgd2Ugc2hvdWxkIGZhaWwgYWZ0ZXIgYSB3aGlsZS4KKwkJICovCisJCSBpZiAoIXByaXYtPm5lZ19iZV92ZXJib3NlKyspIHsKKwkJCSBwcmludGsoS0VSTl9JTkZPICJUTEFOOiAgR2l2aW5nIGF1dG9uZWdvdGlhdGlvbiBtb3JlIHRpbWUuXG4iKTsKKwkJIAkgcHJpbnRrKEtFUk5fSU5GTyAiVExBTjogIFBsZWFzZSBjaGVjayB0aGF0IHlvdXIgYWRhcHRlciBoYXNcbiIpOworCQkgCSBwcmludGsoS0VSTl9JTkZPICJUTEFOOiAgYmVlbiBwcm9wZXJseSBjb25uZWN0ZWQgdG8gYSBIVUIgb3IgU3dpdGNoLlxuIik7CisJCQkgcHJpbnRrKEtFUk5fSU5GTyAiVExBTjogIFRyeWluZyB0byBlc3RhYmxpc2ggbGluayBpbiB0aGUgYmFja2dyb3VuZC4uLlxuIik7CisJCSB9CisJCVRMYW5fU2V0VGltZXIoIGRldiwgKDgqSFopLCBUTEFOX1RJTUVSX1BIWV9GSU5JU0hfQU4gKTsKKwkJcmV0dXJuOworCX0KKworCXByaW50ayggIlRMQU46ICVzOiBBdXRvbmVnb3RpYXRpb24gY29tcGxldGUuXG4iLCBkZXYtPm5hbWUgKTsKKwlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfQU5fQURWLCAmYW5fYWR2ICk7CisJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0FOX0xQQSwgJmFuX2xwYSApOworCW1vZGUgPSBhbl9hZHYgJiBhbl9scGEgJiAweDAzRTA7CisJaWYgKCBtb2RlICYgMHgwMTAwICkgeworCQlwcml2LT50bGFuRnVsbER1cGxleCA9IFRSVUU7CisJfSBlbHNlIGlmICggISAoIG1vZGUgJiAweDAwODAgKSAmJiAoIG1vZGUgJiAweDAwNDAgKSApIHsKKwkJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBUUlVFOworCX0KKworCWlmICggKCAhICggbW9kZSAmIDB4MDE4MCApICkgJiYgKCBwcml2LT5hZGFwdGVyLT5mbGFncyAmIFRMQU5fQURBUFRFUl9VU0VfSU5URVJOXzEwICkgJiYgKCBwcml2LT5waHlOdW0gIT0gMCApICkgeworCQlwcml2LT5waHlOdW0gPSAwOworCQlkYXRhID0gVExBTl9ORVRfQ0ZHXzFGUkFHIHwgVExBTl9ORVRfQ0ZHXzFDSEFOIHwgVExBTl9ORVRfQ0ZHX1BIWV9FTjsKKwkJVExhbl9EaW9Xcml0ZTE2KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfQ09ORklHLCBkYXRhICk7CisJCVRMYW5fU2V0VGltZXIoIGRldiwgKDQwMCpIWi8xMDAwKSwgVExBTl9USU1FUl9QSFlfUERPV04gKTsKKwkJcmV0dXJuOworCX0KKworCWlmICggcHJpdi0+cGh5TnVtID09IDAgKSB7CisJCWlmICggKCBwcml2LT5kdXBsZXggPT0gVExBTl9EVVBMRVhfRlVMTCApIHx8ICggYW5fYWR2ICYgYW5fbHBhICYgMHgwMDQwICkgKSB7CisJCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsIE1JSV9HQ19BVVRPRU5CIHwgTUlJX0dDX0RVUExFWCApOworCQkJcHJpbnRrKCAiVExBTjogIFN0YXJ0aW5nIGludGVybmFsIFBIWSB3aXRoIEZVTEwtRFVQTEVYXG4iICk7CisJCX0gZWxzZSB7CisJCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsIE1JSV9HQ19BVVRPRU5CICk7CisJCQlwcmludGsoICJUTEFOOiAgU3RhcnRpbmcgaW50ZXJuYWwgUEhZIHdpdGggSEFMRi1EVVBMRVhcbiIgKTsKKwkJfQorCX0KKworCS8qIFdhaXQgZm9yIDEwMCBtcy4gIE5vIHJlYXNvbiBpbiBwYXJ0aXRpY3VsYXIuCisJICovCisJVExhbl9TZXRUaW1lciggZGV2LCAoSFovMTApLCBUTEFOX1RJTUVSX0ZJTklTSF9SRVNFVCApOworCQkKK30gLyogVExhbl9QaHlGaW5pc2hBdXRvTmVnICovCisKKyNpZmRlZiBNT05JVE9SCisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAqCisgICAgICAgICogICAgICBUTGFuX3BoeU1vbml0b3IKKyAgICAgICAgKgorICAgICAgICAqICAgICAgUmV0dXJuczogCisgICAgICAgICogICAgICAgICAgICAgIE5vbmUKKyAgICAgICAgKgorICAgICAgICAqICAgICAgUGFyYW1zOgorICAgICAgICAqICAgICAgICAgICAgICBkZXYgICAgICAgICAgICAgVGhlIGRldmljZSBzdHJ1Y3R1cmUgb2YgdGhpcyBkZXZpY2UuCisgICAgICAgICoKKyAgICAgICAgKiAgICAgIAorICAgICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBtb25pdG9ycyBQSFkgY29uZGl0aW9uIGJ5IHJlYWRpbmcgdGhlIHN0YXR1cworICAgICAgICAqICAgICAgcmVnaXN0ZXIgdmlhIHRoZSBNSUkgYnVzLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGdpdmUgaW5mbworICAgICAgICAqICAgICAgYWJvdXQgbGluayBjaGFuZ2VzICh1cC9kb3duKSwgYW5kIHBvc3NpYmxlIHN3aXRjaCB0byBhbHRlcm5hdGUKKyAgICAgICAgKiAgICAgIG1lZGlhLgorICAgICAgICAqCisgICAgICAgICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fUGh5TW9uaXRvciggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJVExhblByaXZhdGVJbmZvICpwcml2ID0gZGV2LT5wcml2OworCXUxNiAgICAgcGh5OworCXUxNiAgICAgcGh5X3N0YXR1czsKKworCXBoeSA9IHByaXYtPnBoeVtwcml2LT5waHlOdW1dOworCisgICAgICAgIC8qIEdldCBQSFkgc3RhdHVzIHJlZ2lzdGVyICovCisgICAgICAgIFRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fU1RTLCAmcGh5X3N0YXR1cyApOworCisgICAgICAgIC8qIENoZWNrIGlmIGxpbmsgaGFzIGJlZW4gbG9zdCAqLworICAgICAgICBpZiAoIShwaHlfc3RhdHVzICYgTUlJX0dTX0xJTkspKSB7IAorIAkgICAgICAgaWYgKHByaXYtPmxpbmspIHsKKwkJICAgICAgcHJpdi0+bGluayA9IDA7CisJICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiVExBTjogJXMgaGFzIGxvc3QgbGlua1xuIiwgZGV2LT5uYW1lKTsKKwkgICAgICAgICAgICAgIGRldi0+ZmxhZ3MgJj0gfklGRl9SVU5OSU5HOworCQkgICAgICBUTGFuX1NldFRpbWVyKCBkZXYsICgyKkhaKSwgVExBTl9USU1FUl9MSU5LX0JFQVQgKTsKKwkJICAgICAgcmV0dXJuOworCQl9CisJfQorCisgICAgICAgIC8qIExpbmsgcmVzdGFibGlzaGVkPyAqLworICAgICAgICBpZiAoKHBoeV9zdGF0dXMgJiBNSUlfR1NfTElOSykgJiYgIXByaXYtPmxpbmspIHsKKyAJCXByaXYtPmxpbmsgPSAxOworICAgICAgICAJcHJpbnRrKEtFUk5fREVCVUcgIlRMQU46ICVzIGhhcyByZWVzdGFibGlzaGVkIGxpbmtcbiIsIGRldi0+bmFtZSk7CisgICAgICAgIAlkZXYtPmZsYWdzIHw9IElGRl9SVU5OSU5HOworICAgICAgICB9CisKKwkvKiBTZXR1cCBhIG5ldyBtb25pdG9yICovCisJVExhbl9TZXRUaW1lciggZGV2LCAoMipIWiksIFRMQU5fVElNRVJfTElOS19CRUFUICk7Cit9CQorCisjZW5kaWYgLyogTU9OSVRPUiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJVGh1bmRlckxBTiBEcml2ZXIgTUlJIFJvdXRpbmVzCisKKwlUaGVzZSByb3V0aW5lcyBhcmUgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGluIENoYXAuIDIgb2YgdGhlCisJIlRodW5kZXJMQU4gUHJvZ3JhbW1lcidzIEd1aWRlIiwgcHAuIDE1LTI0LgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fTWlpUmVhZFJlZworCSAqCisJICoJUmV0dXJuczoKKwkgKgkJMAlpZiBhY2sgcmVjZWl2ZWQgb2sKKwkgKgkJMQlvdGhlcndpc2UuCisJICoKKwkgKglQYXJtczoKKwkgKgkJZGV2CQlUaGUgZGV2aWNlIHN0cnVjdHVyZSBjb250YWluaW5nCisJICoJCQkJVGhlIGlvIGFkZHJlc3MgYW5kIGludGVycnVwdCBjb3VudAorCSAqCQkJCWZvciB0aGlzIGRldmljZS4KKwkgKgkJcGh5CQlUaGUgYWRkcmVzcyBvZiB0aGUgUEhZIHRvIGJlIHF1ZXJpZWQuCisJICoJCXJlZwkJVGhlIHJlZ2lzdGVyIHdob3NlIGNvbnRlbnRzIGFyZSB0byBiZQorCSAqCQkJCXJldHJlaXZlZC4KKwkgKgkJdmFsCQlBIHBvaW50ZXIgdG8gYSB2YXJpYWJsZSB0byBzdG9yZSB0aGUKKwkgKgkJCQlyZXRyaWV2ZWQgdmFsdWUuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIFRMQU4ncyBNSUkgYnVzIHRvIHJldHJlaXZlIHRoZSBjb250ZW50cworCSAqCW9mIGEgZ2l2ZW4gcmVnaXN0ZXIgb24gYSBQSFkuICBJdCBzZW5kcyB0aGUgYXBwcm9wcmlhdGUgaW5mbworCSAqCWFuZCB0aGVuIHJlYWRzIHRoZSAxNi1iaXQgcmVnaXN0ZXIgdmFsdWUgZnJvbSB0aGUgTUlJIGJ1cyB2aWEKKwkgKgl0aGUgVExBTiBTSU8gcmVnaXN0ZXIuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBUTGFuX01paVJlYWRSZWcoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBwaHksIHUxNiByZWcsIHUxNiAqdmFsICkKK3sKKwl1OAluYWNrOworCXUxNglzaW8sIHRtcDsKKyAJdTMyCWk7CisJaW50CWVycjsKKwlpbnQJbWludGVuOworCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKworCWVyciA9IEZBTFNFOworCW91dHcoVExBTl9ORVRfU0lPLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0FEUik7CisJc2lvID0gZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgVExBTl9ORVRfU0lPOworCQorCWlmICghaW5faXJxKCkpCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlUTGFuX01paVN5bmMoZGV2LT5iYXNlX2FkZHIpOworCisJbWludGVuID0gVExhbl9HZXRCaXQoIFRMQU5fTkVUX1NJT19NSU5URU4sIHNpbyApOworCWlmICggbWludGVuICkKKwkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUlOVEVOLCBzaW8pOworCisJVExhbl9NaWlTZW5kRGF0YSggZGV2LT5iYXNlX2FkZHIsIDB4MSwgMiApOwkvKiBTdGFydCAoIDAxYiApICovCisJVExhbl9NaWlTZW5kRGF0YSggZGV2LT5iYXNlX2FkZHIsIDB4MiwgMiApOwkvKiBSZWFkICAoIDEwYiApICovCisJVExhbl9NaWlTZW5kRGF0YSggZGV2LT5iYXNlX2FkZHIsIHBoeSwgNSApOwkvKiBEZXZpY2UgIyAgICAgICovCisJVExhbl9NaWlTZW5kRGF0YSggZGV2LT5iYXNlX2FkZHIsIHJlZywgNSApOwkvKiBSZWdpc3RlciAjICAgICovCisKKwlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19NVFhFTiwgc2lvKTsJCS8qIENoYW5nZSBkaXJlY3Rpb24gKi8KKworCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CQkvKiBDbG9jayBJZGxlIGJpdCAqLworCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CQkvKiBXYWl0IDMwMG5zICovCisKKwluYWNrID0gVExhbl9HZXRCaXQoVExBTl9ORVRfU0lPX01EQVRBLCBzaW8pOwkvKiBDaGVjayBmb3IgQUNLICovCisJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CQkvKiBGaW5pc2ggQUNLICovCisJaWYgKG5hY2spIHsJCQkJCS8qIE5vIEFDSywgc28gZmFrZSBpdCAqLworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsKKwkJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCQl9CisJCXRtcCA9IDB4ZmZmZjsKKwkJZXJyID0gVFJVRTsKKwl9IGVsc2UgewkJCQkJLyogQUNLLCBzbyByZWFkIGRhdGEgKi8KKwkJZm9yICh0bXAgPSAwLCBpID0gMHg4MDAwOyBpOyBpID4+PSAxKSB7CisJCQlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCQkJaWYgKFRMYW5fR2V0Qml0KFRMQU5fTkVUX1NJT19NREFUQSwgc2lvKSkKKwkJCQl0bXAgfD0gaTsKKwkJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCQl9CisJfQorCisJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsJCS8qIElkbGUgY3ljbGUgKi8KKwlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsKKworCWlmICggbWludGVuICkKKwkJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX01JTlRFTiwgc2lvKTsKKworCSp2YWwgPSB0bXA7CisJCisJaWYgKCFpbl9pcnEoKSkKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGVycjsKKworfSAvKiBUTGFuX01paVJlYWRSZWcgKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX01paVNlbmREYXRhCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQlOb3RoaW5nCisJICoJUGFybXM6CisJICoJCWJhc2VfcG9ydAlUaGUgYmFzZSBJTyBwb3J0IG9mIHRoZSBhZGFwdGVyCWluCisJICoJCQkJcXVlc3Rpb24uCisJICoJCWRldgkJVGhlIGFkZHJlc3Mgb2YgdGhlIFBIWSB0byBiZSBxdWVyaWVkLgorCSAqCQlkYXRhCQlUaGUgdmFsdWUgdG8gYmUgcGxhY2VkIG9uIHRoZSBNSUkgYnVzLgorCSAqCQludW1fYml0cwlUaGUgbnVtYmVyIG9mIGJpdHMgaW4gZGF0YSB0aGF0IGFyZSB0bworCSAqCQkJCWJlIHBsYWNlZCBvbiB0aGUgTUlJIGJ1cy4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gc2VuZHMgb24gc2VxdWVuY2Ugb2YgYml0cyBvbiB0aGUgTUlJCisJICoJY29uZmlndXJhdGlvbiBidXMuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgVExhbl9NaWlTZW5kRGF0YSggdTE2IGJhc2VfcG9ydCwgdTMyIGRhdGEsIHVuc2lnbmVkIG51bV9iaXRzICkKK3sKKwl1MTYgc2lvOworCXUzMiBpOworCisJaWYgKCBudW1fYml0cyA9PSAwICkKKwkJcmV0dXJuOworCisJb3V0dyggVExBTl9ORVRfU0lPLCBiYXNlX3BvcnQgKyBUTEFOX0RJT19BRFIgKTsKKwlzaW8gPSBiYXNlX3BvcnQgKyBUTEFOX0RJT19EQVRBICsgVExBTl9ORVRfU0lPOworCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fTVRYRU4sIHNpbyApOworCisJZm9yICggaSA9ICggMHgxIDw8ICggbnVtX2JpdHMgLSAxICkgKTsgaTsgaSA+Pj0gMSApIHsKKwkJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX01DTEssIHNpbyApOworCQkodm9pZCkgVExhbl9HZXRCaXQoIFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8gKTsKKwkJaWYgKCBkYXRhICYgaSApCisJCQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX01EQVRBLCBzaW8gKTsKKwkJZWxzZQorCQkJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX01EQVRBLCBzaW8gKTsKKwkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8gKTsKKwkJKHZvaWQpIFRMYW5fR2V0Qml0KCBUTEFOX05FVF9TSU9fTUNMSywgc2lvICk7CisJfQorCit9IC8qIFRMYW5fTWlpU2VuZERhdGEgKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX01paVN5bmMKKwkgKgorCSAqCVJldHVybnM6CisJICoJCU5vdGhpbmcKKwkgKglQYXJtczoKKwkgKgkJYmFzZV9wb3J0CVRoZSBiYXNlIElPIHBvcnQgb2YgdGhlIGFkYXB0ZXIgaW4KKwkgKgkJCQlxdWVzdGlvbi4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb25zIHN5bmNzIGFsbCBQSFlzIGluIHRlcm1zIG9mIHRoZSBNSUkgY29uZmlndXJhdGlvbgorCSAqCWJ1cy4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBUTGFuX01paVN5bmMoIHUxNiBiYXNlX3BvcnQgKQoreworCWludCBpOworCXUxNiBzaW87CisKKwlvdXR3KCBUTEFOX05FVF9TSU8sIGJhc2VfcG9ydCArIFRMQU5fRElPX0FEUiApOworCXNpbyA9IGJhc2VfcG9ydCArIFRMQU5fRElPX0RBVEEgKyBUTEFOX05FVF9TSU87CisKKwlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fTVRYRU4sIHNpbyApOworCWZvciAoIGkgPSAwOyBpIDwgMzI7IGkrKyApIHsKKwkJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX01DTEssIHNpbyApOworCQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX01DTEssIHNpbyApOworCX0KKworfSAvKiBUTGFuX01paVN5bmMgKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX01paVdyaXRlUmVnCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQlOb3RoaW5nCisJICoJUGFybXM6CisJICoJCWRldgkJVGhlIGRldmljZSBzdHJ1Y3R1cmUgZm9yIHRoZSBkZXZpY2UKKwkgKgkJCQl0byB3cml0ZSB0by4KKwkgKgkJcGh5CQlUaGUgYWRkcmVzcyBvZiB0aGUgUEhZIHRvIGJlIHdyaXR0ZW4gdG8uCisJICoJCXJlZwkJVGhlIHJlZ2lzdGVyIHdob3NlIGNvbnRlbnRzIGFyZSB0byBiZQorCSAqCQkJCXdyaXR0ZW4uCisJICoJCXZhbAkJVGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHJlZ2lzdGVyLgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBUTEFOJ3MgTUlJIGJ1cyB0byB3cml0ZSB0aGUgY29udGVudHMgb2YgYQorCSAqCWdpdmVuIHJlZ2lzdGVyIG9uIGEgUEhZLiAgSXQgc2VuZHMgdGhlIGFwcHJvcHJpYXRlIGluZm8gYW5kIHRoZW4KKwkgKgl3cml0ZXMgdGhlIDE2LWJpdCByZWdpc3RlciB2YWx1ZSBmcm9tIHRoZSBNSUkgY29uZmlndXJhdGlvbiBidXMKKwkgKgl2aWEgdGhlIFRMQU4gU0lPIHJlZ2lzdGVyLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fTWlpV3JpdGVSZWcoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBwaHksIHUxNiByZWcsIHUxNiB2YWwgKQoreworCXUxNglzaW87CisJaW50CW1pbnRlbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlUTGFuUHJpdmF0ZUluZm8gKnByaXYgPSBkZXYtPnByaXY7CisKKwlvdXR3KFRMQU5fTkVUX1NJTywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOworCXNpbyA9IGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKwkKKwlpZiAoIWluX2lycSgpKQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJVExhbl9NaWlTeW5jKCBkZXYtPmJhc2VfYWRkciApOworCisJbWludGVuID0gVExhbl9HZXRCaXQoIFRMQU5fTkVUX1NJT19NSU5URU4sIHNpbyApOworCWlmICggbWludGVuICkKKwkJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX01JTlRFTiwgc2lvICk7CisKKwlUTGFuX01paVNlbmREYXRhKCBkZXYtPmJhc2VfYWRkciwgMHgxLCAyICk7CS8qIFN0YXJ0ICggMDFiICkgKi8KKwlUTGFuX01paVNlbmREYXRhKCBkZXYtPmJhc2VfYWRkciwgMHgxLCAyICk7CS8qIFdyaXRlICggMDFiICkgKi8KKwlUTGFuX01paVNlbmREYXRhKCBkZXYtPmJhc2VfYWRkciwgcGh5LCA1ICk7CS8qIERldmljZSAjICAgICAgKi8KKwlUTGFuX01paVNlbmREYXRhKCBkZXYtPmJhc2VfYWRkciwgcmVnLCA1ICk7CS8qIFJlZ2lzdGVyICMgICAgKi8KKworCVRMYW5fTWlpU2VuZERhdGEoIGRldi0+YmFzZV9hZGRyLCAweDIsIDIgKTsJLyogU2VuZCBBQ0sgKi8KKwlUTGFuX01paVNlbmREYXRhKCBkZXYtPmJhc2VfYWRkciwgdmFsLCAxNiApOwkvKiBTZW5kIERhdGEgKi8KKworCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8gKTsJLyogSWRsZSBjeWNsZSAqLworCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fTUNMSywgc2lvICk7CisKKwlpZiAoIG1pbnRlbiApCisJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fTUlOVEVOLCBzaW8gKTsKKwkKKwlpZiAoIWluX2lycSgpKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKK30gLyogVExhbl9NaWlXcml0ZVJlZyAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVTRVQgLSBSZXNldCBhZGFwdGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBza2VsX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKK3sKKwkvKiBwdXQgdGhlIGNhcmQgaW4gaXRzIGluaXRpYWwgc3RhdGUgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBza2VsX3BvbGwoc3RydWN0IG5pYyAqbmljKQoreworCS8qIHJldHVybiB0cnVlIGlmIHRoZXJlJ3MgYW4gZXRoZXJuZXQgcGFja2V0IHJlYWR5IHRvIHJlYWQgKi8KKwkvKiBuaWMtPnBhY2tldCBzaG91bGQgY29udGFpbiBkYXRhIG9uIHJldHVybiAqLworCS8qIG5pYy0+cGFja2V0bGVuIHNob3VsZCBjb250YWluIGxlbmd0aCBvZiBkYXRhICovCisJcmV0dXJuICgwKTsJLyogaW5pdGlhbGx5IGFzIHRoaXMgaXMgY2FsbGVkIHRvIGZsdXNoIHRoZSBpbnB1dCAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1RSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgc2tlbF90cmFuc21pdCgKKwlzdHJ1Y3QgbmljICpuaWMsCisJY29uc3QgY2hhciAqZCwJCQkvKiBEZXN0aW5hdGlvbiAqLworCXVuc2lnbmVkIGludCB0LAkJCS8qIFR5cGUgKi8KKwl1bnNpZ25lZCBpbnQgcywJCQkvKiBzaXplICovCisJY29uc3QgY2hhciAqcCkJCQkvKiBQYWNrZXQgKi8KK3sKKwkvKiBzZW5kIHRoZSBwYWNrZXQgdG8gZGVzdGluYXRpb24gKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitESVNBQkxFIC0gVHVybiBvZmYgZXRoZXJuZXQgaW50ZXJmYWNlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBza2VsX2Rpc2FibGUoc3RydWN0IG5pYyAqbmljKQoreworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BST0JFIC0gTG9vayBmb3IgYW4gYWRhcHRlciwgdGhpcyByb3V0aW5lJ3MgdmlzaWJsZSB0byB0aGUgb3V0c2lkZQorWW91IHNob3VsZCBvbWl0IHRoZSBsYXN0IGFyZ3VtZW50IHN0cnVjdCBwY2lfZGV2aWNlICogZm9yIGEgbm9uLVBDSSBOSUMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBuaWMgKnRsYW5fcHJvYmUoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVfYWRkcnMsCisJc3RydWN0IHBjaV9kZXZpY2UgKnApCit7CisJLyogaWYgcHJvYmVfYWRkcnMgaXMgMCwgdGhlbiByb3V0aW5lIGNhbiB1c2UgYSBoYXJkd2lyZWQgZGVmYXVsdCAqLworCS8qIGlmIGJvYXJkIGZvdW5kICovCisJeworCQkvKiBwb2ludCB0byBOSUMgc3BlY2lmaWMgcm91dGluZXMgKi8KKwkJbmljLT5yZXNldCA9IHNrZWxfcmVzZXQ7CisJCW5pYy0+cG9sbCA9IHNrZWxfcG9sbDsKKwkJbmljLT50cmFuc21pdCA9IHNrZWxfdHJhbnNtaXQ7CisJCW5pYy0+ZGlzYWJsZSA9IHNrZWxfZGlzYWJsZTsKKwkJcmV0dXJuIG5pYzsKKwl9CisJLyogZWxzZSAqLworCXJldHVybiAwOworfQorCisjaWYJMAorI2lmbmRlZiBUTEFOX0gKKyNkZWZpbmUgVExBTl9ICisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgTGludXggVGh1bmRlckxBTiBEcml2ZXIKKyAqCisgKiAgdGxhbi5oCisgKiAgYnkgSmFtZXMgQmFua3MKKyAqCisgKiAgKEMpIDE5OTctMTk5OCBDYWxkZXJhLCBJbmMuCisgKiAgKEMpIDE5OTktMjAwMSBUb3JiZW4gTWF0aGlhc2VuCisgKiAKKyAqICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiogVGhpcyBmaWxlIGlzIGJlc3Qgdmlld2VkL2VkaXRlZCB3aXRoIHRhYnN0b3A9NCwgY29sdW1zPj0xMzIKKyAqCisgKiAgCisgKiAgRGVjIDEwLCAxOTk5CVRvcmJlbiBNYXRoaWFzZW4gPHRvcmJlbi5tYXRoaWFzZW5AY29tcGFxLmNvbT4KKyAqCQkJTmV3IE1haW50YWluZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworI2RlZmluZSBGQUxTRQkJCTAKKyNkZWZpbmUgVFJVRQkJCTEKKworI2RlZmluZSBUWF9USU1FT1VUCQkoMTAqSFopCSAvKiBXZSBuZWVkIHRpbWUgZm9yIGF1dG8tbmVnICovCisKK3R5cGVkZWYgc3RydWN0IHRsYW5fYWRhcHRlcl9lbnRyeSB7CisJdTE2CXZlbmRvcklkOworCXUxNglkZXZpY2VJZDsKKwljaGFyCSpkZXZpY2VMYWJlbDsKKwl1MzIJZmxhZ3M7CisJdTE2CWFkZHJPZnM7Cit9IFRMYW5BZGFwdGVyRW50cnk7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBFSVNBIERlZmluaXRpb25zCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBFSVNBX0lEICAgICAgMHhjODAgICAvKiBFSVNBIElEIFJlZ2lzdGVycyAqLyAKKyNkZWZpbmUgRUlTQV9JRDAgICAgIDB4YzgwICAgLyogRUlTQSBJRCBSZWdpc3RlciAwICovIAorI2RlZmluZSBFSVNBX0lEMSAgICAgMHhjODEgICAvKiBFSVNBIElEIFJlZ2lzdGVyIDEgKi8gCisjZGVmaW5lIEVJU0FfSUQyICAgICAweGM4MiAgIC8qIEVJU0EgSUQgUmVnaXN0ZXIgMiAqLyAKKyNkZWZpbmUgRUlTQV9JRDMgICAgIDB4YzgzICAgLyogRUlTQSBJRCBSZWdpc3RlciAzICovIAorI2RlZmluZSBFSVNBX0NSICAgICAgMHhjODQgICAvKiBFSVNBIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRUlTQV9SRUcwICAgIDB4Yzg4ICAgLyogRUlTQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgRUlTQV9SRUcxICAgIDB4Yzg5ICAgLyogRUlTQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgRUlTQV9SRUcyICAgIDB4YzhhICAgLyogRUlTQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgRUlTQV9SRUczICAgIDB4YzhmICAgLyogRUlTQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUgRUlTQV9BUFJPTSAgIDB4YzkwICAgLyogRXRoZXJuZXQgQWRkcmVzcyBQUk9NICovCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBSeC9UeCBMaXN0IERlZmluaXRpb25zCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgdGxhbl9idWZmZXJfcmVmX3RhZyB7CisJdTMyCWNvdW50OworCXUzMglhZGRyZXNzOworfSBUTGFuQnVmZmVyUmVmOworCit0eXBlZGVmIHN0cnVjdCB0bGFuX2xpc3RfdGFnIHsKKwl1MzIJCWZvcndhcmQ7CisJdTE2CQljU3RhdDsKKwl1MTYJCWZyYW1lU2l6ZTsKKwlUTGFuQnVmZmVyUmVmCWJ1ZmZlcltUTEFOX0JVRkZFUlNfUEVSX0xJU1RdOworfSBUTGFuTGlzdDsKKwordHlwZWRlZiB1OCBUTGFuQnVmZmVyW1RMQU5fTUFYX0ZSQU1FX1NJWkVdOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogVExBTiBQcml2YXRlIEluZm9ybWF0aW9uIFN0cnVjdHVyZQorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHRsYW5fcHJpdmF0ZV90YWcgeworCXN0cnVjdCBuZXRfZGV2aWNlICAgICAgICpuZXh0RGV2aWNlOworCXZvaWQJCQkqZG1hU3RvcmFnZTsKKwl1OAkJCSpwYWRCdWZmZXI7CisJVExhbkxpc3QgICAgICAgICAgICAgICAgKnJ4TGlzdDsKKwl1OAkJCSpyeEJ1ZmZlcjsKKwl1MzIgICAgICAgICAgICAgICAgICAgICByeEhlYWQ7CisJdTMyICAgICAgICAgICAgICAgICAgICAgcnhUYWlsOworCXUzMgkJCXJ4RW9jQ291bnQ7CisJVExhbkxpc3QgICAgICAgICAgICAgICAgKnR4TGlzdDsKKwl1OAkJCSp0eEJ1ZmZlcjsKKwl1MzIgICAgICAgICAgICAgICAgICAgICB0eEhlYWQ7CisJdTMyICAgICAgICAgICAgICAgICAgICAgdHhJblByb2dyZXNzOworCXUzMiAgICAgICAgICAgICAgICAgICAgIHR4VGFpbDsKKwl1MzIJCQl0eEJ1c3lDb3VudDsKKwl1MzIgICAgICAgICAgICAgICAgICAgICBwaHlPbmxpbmU7CisJdTMyCQkJdGltZXJTZXRBdDsKKwl1MzIJCQl0aW1lclR5cGU7CisJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7CisJc3RydWN0IGJvYXJkCQkqYWRhcHRlcjsKKwl1MzIJCQlhZGFwdGVyUmV2OworCXUzMgkJCWF1aTsKKwl1MzIJCQlkZWJ1ZzsKKwl1MzIJCQlkdXBsZXg7CisJdTMyCQkJcGh5WzJdOworCXUzMgkJCXBoeU51bTsKKwl1MzIJCQlzcGVlZDsKKwl1OAkJCXRsYW5SZXY7CisJdTgJCQl0bGFuRnVsbER1cGxleDsKKwljaGFyICAgICAgICAgICAgICAgICAgICBkZXZOYW1lWzhdOworCXNwaW5sb2NrX3QJCWxvY2s7CisJdTgJCQlsaW5rOworCXU4CQkJaXNfZWlzYTsKKwlzdHJ1Y3QgdHFfc3RydWN0CXRsYW5fdHF1ZXVlOworCXU4CQkJbmVnX2JlX3ZlcmJvc2U7Cit9IFRMYW5Qcml2YXRlSW5mbzsKKworI2RlZmluZSAJVExBTl9IQ19HTwkJMHg4MDAwMDAwMAorI2RlZmluZQkJVExBTl9IQ19TVE9QCQkweDQwMDAwMDAwCisjZGVmaW5lCQlUTEFOX0hDX0FDSwkJMHgyMDAwMDAwMAorI2RlZmluZQkJVExBTl9IQ19DU19NQVNLCQkweDFGRTAwMDAwCisjZGVmaW5lCQlUTEFOX0hDX0VPQwkJMHgwMDEwMDAwMAorI2RlZmluZQkJVExBTl9IQ19SVAkJMHgwMDA4MDAwMAorI2RlZmluZQkJVExBTl9IQ19ORVMJCTB4MDAwNDAwMDAKKyNkZWZpbmUJCVRMQU5fSENfQURfUlNUCQkweDAwMDA4MDAwCisjZGVmaW5lCQlUTEFOX0hDX0xEX1RNUgkJMHgwMDAwNDAwMAorI2RlZmluZQkJVExBTl9IQ19MRF9USFIJCTB4MDAwMDIwMDAKKyNkZWZpbmUJCVRMQU5fSENfUkVRX0lOVAkJMHgwMDAwMTAwMAorI2RlZmluZQkJVExBTl9IQ19JTlRfT0ZGCQkweDAwMDAwODAwCisjZGVmaW5lCQlUTEFOX0hDX0lOVF9PTgkJMHgwMDAwMDQwMAorI2RlZmluZQkJVExBTl9IQ19BQ19NQVNLCQkweDAwMDAwMEZGCisjZGVmaW5lCQlUTEFOX0RBX0FEUl9JTkMJCTB4ODAwMAorI2RlZmluZQkJVExBTl9EQV9SQU1fQURSCQkweDQwMDAKKyNkZWZpbmUJCVRMQU5fSElfSVZfTUFTSwkJMHgxRkUwCisjZGVmaW5lCQlUTEFOX0hJX0lUX01BU0sJCTB4MDAxQworCisjZGVmaW5lCQlUTEFOX05FVF9DTURfTlJFU0VUCTB4ODAKKyNkZWZpbmUJCVRMQU5fTkVUX0NNRF9OV1JBUAkweDQwCisjZGVmaW5lCQlUTEFOX05FVF9DTURfQ1NGCTB4MjAKKyNkZWZpbmUJCVRMQU5fTkVUX0NNRF9DQUYJMHgxMAorI2RlZmluZQkJVExBTl9ORVRfQ01EX05PQlJYCTB4MDgKKyNkZWZpbmUJCVRMQU5fTkVUX0NNRF9EVVBMRVgJMHgwNAorI2RlZmluZQkJVExBTl9ORVRfQ01EX1RSRlJBTQkweDAyCisjZGVmaW5lCQlUTEFOX05FVF9DTURfVFhQQUNFCTB4MDEKKyNkZWZpbmUgCVRMQU5fTkVUX1NJT19NSU5URU4JMHg4MAorI2RlZmluZQkJVExBTl9ORVRfU0lPX0VDTE9LCTB4NDAKKyNkZWZpbmUJCVRMQU5fTkVUX1NJT19FVFhFTgkweDIwCisjZGVmaW5lCQlUTEFOX05FVF9TSU9fRURBVEEJMHgxMAorI2RlZmluZQkJVExBTl9ORVRfU0lPX05NUlNUCTB4MDgKKyNkZWZpbmUJCVRMQU5fTkVUX1NJT19NQ0xLCTB4MDQKKyNkZWZpbmUJCVRMQU5fTkVUX1NJT19NVFhFTgkweDAyCisjZGVmaW5lCQlUTEFOX05FVF9TSU9fTURBVEEJMHgwMQorI2RlZmluZQkJVExBTl9ORVRfU1RTX01JUlEJMHg4MAorI2RlZmluZQkJVExBTl9ORVRfU1RTX0hCRUFUCTB4NDAKKyNkZWZpbmUJCVRMQU5fTkVUX1NUU19UWFNUT1AJMHgyMAorI2RlZmluZQkJVExBTl9ORVRfU1RTX1JYU1RPUAkweDEwCisjZGVmaW5lCQlUTEFOX05FVF9TVFNfUlNSVkQJMHgwRgorI2RlZmluZQkJVExBTl9ORVRfTUFTS19NQVNLNwkweDgwCisjZGVmaW5lCQlUTEFOX05FVF9NQVNLX01BU0s2CTB4NDAKKyNkZWZpbmUJCVRMQU5fTkVUX01BU0tfTUFTSzUJMHgyMAorI2RlZmluZQkJVExBTl9ORVRfTUFTS19NQVNLNAkweDEwCisjZGVmaW5lCQlUTEFOX05FVF9NQVNLX1JTUlZECTB4MEYKKyNkZWZpbmUgCVRMQU5fTkVUX0NGR19SQ0xLCTB4ODAwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHX1RDTEsJMHg0MDAwCisjZGVmaW5lCQlUTEFOX05FVF9DRkdfQklUCTB4MjAwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHX1JYQ1JDCTB4MTAwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHX1BFRgkweDA4MDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NGR18xRlJBRwkweDA0MDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NGR18xQ0hBTgkweDAyMDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NGR19NVEVTVAkweDAxMDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NGR19QSFlfRU4JMHgwMDgwCisjZGVmaW5lCQlUTEFOX05FVF9DRkdfTVNNQVNLCTB4MDA3RgorI2RlZmluZQkJVExBTl9MRURfQUNUCQkweDEwCisjZGVmaW5lCQlUTEFOX0xFRF9MSU5LCQkweDAxCisjZGVmaW5lCQlUTEFOX0lEX1RYX0VPQwkJMHgwNAorI2RlZmluZQkJVExBTl9JRF9SWF9FT0YJCTB4MDIKKyNkZWZpbmUJCVRMQU5fSURfUlhfRU9DCQkweDAxCisKKyNkZWZpbmUgQ0lSQ19JTkMoIGEsIGIgKSBpZiAoICsrYSA+PSBiICkgYSA9IDAKKworI2lmZGVmIElfTElLRV9BX0ZBU1RfSEFTSF9GVU5DVElPTgorLyogZ2l2ZW4gNiBieXRlcywgdmlldyB0aGVtIGFzIDggNi1iaXQgbnVtYmVycyBhbmQgcmV0dXJuIHRoZSBYT1Igb2YgdGhvc2UgKi8KKy8qIHRoZSBjb2RlIGJlbG93IGlzIGFib3V0IHNldmVuIHRpbWVzIGFzIGZhc3QgYXMgdGhlIG9yaWdpbmFsIGNvZGUgKi8KK2lubGluZSB1MzIgVExhbl9IYXNoRnVuYyggdTggKmEgKQoreworICAgICAgICB1OCAgICAgaGFzaDsKKworICAgICAgICBoYXNoID0gKGFbMF1eYVszXSk7ICAgICAgICAgICAgIC8qICYgMDc3ICovCisgICAgICAgIGhhc2ggXj0gKChhWzBdXmFbM10pPj42KTsgICAgICAgLyogJiAwMDMgKi8KKyAgICAgICAgaGFzaCBePSAoKGFbMV1eYVs0XSk8PDIpOyAgICAgICAvKiAmIDA3NCAqLworICAgICAgICBoYXNoIF49ICgoYVsxXV5hWzRdKT4+NCk7ICAgICAgIC8qICYgMDE3ICovCisgICAgICAgIGhhc2ggXj0gKChhWzJdXmFbNV0pPDw0KTsgICAgICAgLyogJiAwNjAgKi8KKyAgICAgICAgaGFzaCBePSAoKGFbMl1eYVs1XSk+PjIpOyAgICAgICAvKiAmIDA3NyAqLworCisgICAgICAgIHJldHVybiAoaGFzaCAmIDA3Nyk7Cit9CisKKyNlbHNlIC8qIG9yaWdpbmFsIGNvZGUgKi8KKworaW5saW5lCXUzMgl4b3IoIHUzMiBhLCB1MzIgYiApCit7CisJcmV0dXJuICggKCBhICYmICEgYiApIHx8ICggISBhICYmIGIgKSApOworfQorI2RlZmluZSBYT1I4KCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoICkJeG9yKCBhLCB4b3IoIGIsIHhvciggYywgeG9yKCBkLCB4b3IoIGUsIHhvciggZiwgeG9yKCBnLCBoICkgKSApICkgKSApICkKKyNkZWZpbmUgREEoIGEsIGJpdCApCQkJCQkoICggKHU4KSBhW2JpdC84XSApICYgKCAodTgpICggMSA8PCBiaXQlOCApICkgKQorCitpbmxpbmUgdTMyIFRMYW5fSGFzaEZ1bmMoIHU4ICphICkKK3sKKwl1MzIJaGFzaDsKKworCWhhc2ggID0gWE9SOCggREEoYSwwKSwgREEoYSwgNiksIERBKGEsMTIpLCBEQShhLDE4KSwgREEoYSwyNCksIERBKGEsMzApLCBEQShhLDM2KSwgREEoYSw0MikgKTsKKwloYXNoIHw9IFhPUjgoIERBKGEsMSksIERBKGEsIDcpLCBEQShhLDEzKSwgREEoYSwxOSksIERBKGEsMjUpLCBEQShhLDMxKSwgREEoYSwzNyksIERBKGEsNDMpICkgPDwgMTsKKwloYXNoIHw9IFhPUjgoIERBKGEsMiksIERBKGEsIDgpLCBEQShhLDE0KSwgREEoYSwyMCksIERBKGEsMjYpLCBEQShhLDMyKSwgREEoYSwzOCksIERBKGEsNDQpICkgPDwgMjsKKwloYXNoIHw9IFhPUjgoIERBKGEsMyksIERBKGEsIDkpLCBEQShhLDE1KSwgREEoYSwyMSksIERBKGEsMjcpLCBEQShhLDMzKSwgREEoYSwzOSksIERBKGEsNDUpICkgPDwgMzsKKwloYXNoIHw9IFhPUjgoIERBKGEsNCksIERBKGEsMTApLCBEQShhLDE2KSwgREEoYSwyMiksIERBKGEsMjgpLCBEQShhLDM0KSwgREEoYSw0MCksIERBKGEsNDYpICkgPDwgNDsKKwloYXNoIHw9IFhPUjgoIERBKGEsNSksIERBKGEsMTEpLCBEQShhLDE3KSwgREEoYSwyMyksIERBKGEsMjkpLCBEQShhLDM1KSwgREEoYSw0MSksIERBKGEsNDcpICkgPDwgNTsKKworCXJldHVybiBoYXNoOworCit9IAorCisjZW5kaWYgLyogSV9MSUtFX0FfRkFTVF9IQVNIX0ZVTkNUSU9OICovCisjZW5kaWYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIExpbnV4IFRodW5kZXJMQU4gRHJpdmVyCisgKgorICogIHRsYW4uYworICogIGJ5IEphbWVzIEJhbmtzCisgKgorICogIChDKSAxOTk3LTE5OTggQ2FsZGVyYSwgSW5jLgorICogIChDKSAxOTk4IEphbWVzIEJhbmtzCisgKiAgKEMpIDE5OTktMjAwMSBUb3JiZW4gTWF0aGlhc2VuCisgKgorICogIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqKiBUaGlzIGZpbGUgaXMgYmVzdCB2aWV3ZWQvZWRpdGVkIHdpdGggY29sdW1ucz49MTMyLgorICoKKyAqKiBVc2VmdWwgKGlmIG5vdCByZXF1aXJlZCkgcmVhZGluZzoKKyAqCisgKgkJVGV4YXMgSW5zdHJ1bWVudHMsIFRodW5kZXJMQU4gUHJvZ3JhbW1lcidzIEd1aWRlLAorICoJCQlUSSBMaXRlcmF0dXJlIE51bWJlciBTUFdVMDEzQQorICoJCQlhdmFpbGFibGUgaW4gUERGIGZvcm1hdCBmcm9tIHd3dy50aS5jb20KKyAqCQlMZXZlbCBPbmUsIExYVDkwMSBhbmQgTFhUOTcwIERhdGEgU2hlZXRzCisgKgkJCWF2YWlsYWJsZSBpbiBQREYgZm9ybWF0IGZyb20gd3d3LmxldmVsMS5jb20KKyAqCQlOYXRpb25hbCBTZW1pY29uZHVjdG9yLCBEUDgzODQwQSBEYXRhIFNoZWV0CisgKgkJCWF2YWlsYWJsZSBpbiBQREYgZm9ybWF0IGZyb20gd3d3Lm5hdGlvbmFsLmNvbQorICoJCU1pY3JvY2hpcCBUZWNobm9sb2d5LCAyNEMwMUEvMDJBLzA0QSBEYXRhIFNoZWV0CisgKgkJCWF2YWlsYWJsZSBpbiBQREYgZm9ybWF0IGZyb20gd3d3Lm1pY3JvY2hpcC5jb20KKyAqCisgKiBDaGFuZ2UgSGlzdG9yeQorICoKKyAqCVRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHNjby5jb20+OglUTGFuX1BjaVByb2JlKCkgbm93IHVzZXMKKyAqCQkJCQkJbmV3IFBDSSBCSU9TIGludGVyZmFjZS4KKyAqCUFsYW4gQ294CTxhbGFuQHJlZGhhdC5jb20+OglGaXhlZCB0aGUgb3V0IG9mIG1lbW9yeQorICoJCQkJCQloYW5kbGluZy4KKyAqICAgICAgCisgKglUb3JiZW4gTWF0aGlhc2VuIDx0b3JiZW4ubWF0aGlhc2VuQGNvbXBhcS5jb20+IE5ldyBNYWludGFpbmVyIQorICoKKyAqCXYxLjEgRGVjIDIwLCAxOTk5ICAgIC0gUmVtb3ZlZCBsaW51eCB2ZXJzaW9uIGNoZWNraW5nCisgKgkJCSAgICAgICBQYXRjaCBmcm9tIFRpZ3JhbiBBaXZhemlhbi4gCisgKgkJCSAgICAgLSB2MS4xIGluY2x1ZGVzIEFsYW4ncyBTTVAgdXBkYXRlcy4KKyAqCQkJICAgICAtIFdlIHN0aWxsIGhhdmUgcHJvYmxlbXMgb24gU01QIHRob3VnaCwKKyAqCQkJICAgICAgIGJ1dCBJJ20gbG9va2luZyBpbnRvIHRoYXQuIAorICoJCQkKKyAqCXYxLjIgSmFuIDAyLCAyMDAwICAgIC0gSG9wZWZ1bGx5IGZpeGVkIHRoZSBTTVAgZGVhZGxvY2suCisgKgkJCSAgICAgLSBSZW1vdmVkIGRlcGVuZGVuY3kgb2YgSFogYmVpbmcgMTAwLgorICoJCQkgICAgIC0gV2Ugbm93IGFsbG93IGhpZ2hlciBwcmlvcml0eSB0aW1lcnMgdG8gCisgKgkJCSAgICAgICBvdmVyd3JpdGUgdGltZXJzIGxpa2UgVExBTl9USU1FUl9BQ1RJVklUWQorICoJCQkgICAgICAgUGF0Y2ggZnJvbSBKb2huIENhZ2xlIDxqb2huLmNhZ2xlQGNvbXBhcS5jb20+LgorICoJCQkgICAgIC0gRml4ZWQgYSBmZXcgY29tcGlsZXIgd2FybmluZ3MuCisgKgorICoJdjEuMyBGZWIgMDQsIDIwMDAgICAgLSBGaXhlZCB0aGUgcmVtYWluaW5nIEhaIGlzc3Vlcy4KKyAqCQkJICAgICAtIFJlbW92ZWQgY2FsbCB0byBwY2lfcHJlc2VudCgpLiAKKyAqCQkJICAgICAtIFJlbW92ZWQgU0FfSU5URVJSVVBUIGZsYWcgZnJvbSBpcnEgaGFuZGxlci4KKyAqCQkJICAgICAtIEFkZGVkIF9faW5pdCBhbmQgX19pbml0ZGF0YSB0byByZWR1Y2UgcmVzaXNkZW50IAorICoJCQkgICAgICAgY29kZSBzaXplLgorICoJCQkgICAgIC0gRHJpdmVyIG5vdyB1c2VzIG1vZHVsZV9pbml0L21vZHVsZV9leGl0LgorICoJCQkgICAgIC0gUmV3cm90ZSBpbml0X21vZHVsZSBhbmQgdGxhbl9wcm9iZSB0bworICoJCQkgICAgICAgc2hhcmUgYSBsb3QgbW9yZSBjb2RlLiBXZSBub3cgdXNlIHRsYW5fcHJvYmUKKyAqCQkJICAgICAgIHdpdGggYnVpbHRpbiBhbmQgbW9kdWxlIGRyaXZlci4KKyAqCQkJICAgICAtIERyaXZlciBwb3J0ZWQgdG8gbmV3IG5ldCBBUEkuIAorICoJCQkgICAgIC0gdGxhbi50eHQgaGFzIGJlZW4gcmV3b3JrZWQgdG8gcmVmbGVjdCBjdXJyZW50IAorICoJCQkgICAgICAgZHJpdmVyIChhbG1vc3QpCisgKgkJCSAgICAgLSBPdGhlciBtaW5vciBzdHVmZgorICoKKyAqCXYxLjQgRmViIDEwLCAyMDAwICAgIC0gVXBkYXRlZCB3aXRoIG1vcmUgY2hhbmdlcyByZXF1aXJlZCBhZnRlciBEYXZlJ3MKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yayBjbGVhbnVwIGluIDIuMy40M3ByZTcgKFRpZ3JhbiAmIG15c2VsZikKKyAqCSAgICAgICAgICAgICAgICAgICAgIC0gTWlub3Igc3R1ZmYuCisgKgorICoJdjEuNSBNYXJjaCAyMiwgMjAwMCAgLSBGaXhlZCBhbm90aGVyIHRpbWVyIGJ1ZyB0aGF0IHdvdWxkIGhhbmcgdGhlIGRyaXZlcgorICoJCQkgICAgICAgaWYgbm8gY2FibGUvbGluayB3ZXJlIHByZXNlbnQuCisgKgkJCSAgICAgLSBDb3NtZXRpYyBjaGFuZ2VzLgorICoJCQkgICAgIC0gVE9ETzogUG9ydCBjb21wbGV0ZWx5IHRvIG5ldyBQQ0kvRE1BIEFQSQorICoJCQkgICAgIAkgICAgIEF1dG8tTmVnIGZhbGxiYWNrLgorICoKKyAqIAl2MS42IEFwcmlsIDA0LCAyMDAwICAtIEZpeGVkIGRyaXZlciBzdXBwb3J0IGZvciBrZXJuZWwtcGFyYW1ldGVycy4gSGF2ZW4ndAorICogCQkJICAgICAgIHRlc3RlZCBpdCB0aG91Z2gsIGFzIHRoZSBrZXJuZWwgc3VwcG9ydCBpcyBjdXJyZW50bHkgCisgKiAJCQkgICAgICAgYnJva2VuICgyLjMuOTlwNHAzKS4KKyAqIAkJCSAgICAgLSBVcGRhdGVkIHRsYW4udHh0IGFjY29yZGluZ2x5LgorICogCQkJICAgICAtIEFkanVzdGVkIG1pbmltdW0vbWF4aW11bSBmcmFtZSBsZW5ndGguCisgKiAJCQkgICAgIC0gVGhlcmUgaXMgbm93IGEgVExBTiB3ZWJzaXRlIHVwIGF0IAorICogCQkJICAgICAgIGh0dHA6Ly90bGFuLmtlcm5lbC5kaworICoKKyAqIAl2MS43IEFwcmlsIDA3LCAyMDAwICAtIFN0YXJ0ZWQgdG8gaW1wbGVtZW50IGN1c3RvbSBpb2N0bHMuIERyaXZlciBub3cKKyAqIAkJCSAgICAgICByZXBvcnRzIFBIWSBpbmZvcm1hdGlvbiB3aGVuIHVzZWQgd2l0aCBEb25hbGQKKyAqIAkJCSAgICAgICBCZWNrZXJzIHVzZXJzcGFjZSBNSUkgZGlhZ25vc3RpY3MgdXRpbGl0eS4KKyAqCisgKiAJdjEuOCBBcHJpbCAyMywgMjAwMCAgLSBGaXhlZCBzdXBwb3J0IGZvciBmb3JjZWQgc3BlZWQvZHVwbGV4IHNldHRpbmdzLgorICogCQkJICAgICAtIEFkZGVkIGxpbmsgaW5mb3JtYXRpb24gdG8gQXV0by1OZWcgYW5kIGZvcmNlZAorICogCQkJICAgICAgIG1vZGVzLiBXaGVuIE5JQyBvcGVyYXRlcyB3aXRoIGF1dG8tbmVnIHRoZSBkcml2ZXIKKyAqIAkJCSAgICAgICB3aWxsIHJlcG9ydCBMaW5rIHNwZWVkICYgZHVwbGV4IG1vZGVzIGFzIHdlbGwgYXMKKyAqIAkJCSAgICAgICBsaW5rIHBhcnRuZXIgYWJpbGl0aWVzLiBXaGVuIGZvcmNlZCBsaW5rIGlzIHVzZWQsCisgKiAJCQkgICAgICAgdGhlIGRyaXZlciB3aWxsIHJlcG9ydCBzdGF0dXMgb2YgdGhlIGVzdGFibGlzaGVkCisgKiAJCQkgICAgICAgbGluay4KKyAqIAkJCSAgICAgICBQbGVhc2UgcmVhZCB0bGFuLnR4dCBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4gCisgKiAJCQkgICAgIC0gUmVtb3ZlZCBjYWxsIHRvIGNoZWNrX3JlZ2lvbigpLCBhbmQgdXNlZCAKKyAqIAkJCSAgICAgICByZXR1cm4gdmFsdWUgb2YgcmVxdWVzdF9yZWdpb24oKSBpbnN0ZWFkLgorICoJCisgKgl2MS44YSBNYXkgMjgsIDIwMDAgICAtIE1pbm9yIHVwZGF0ZXMuCisgKgorICoJdjEuOSBKdWx5IDI1LCAyMDAwICAgLSBGaXhlZCBhIGZldyByZW1haW5pbmcgRnVsbC1EdXBsZXggaXNzdWVzLgorICoJICAgICAgICAgICAgICAgICAgICAgLSBVcGRhdGVkIHdpdGggdGltZXIgZml4ZXMgZnJvbSBBbmRyZXcgTW9ydG9uLgorICoJICAgICAgICAgICAgICAgICAgICAgLSBGaXhlZCBtb2R1bGUgcmFjZSBpbiBUTGFuX09wZW4uCisgKgkgICAgICAgICAgICAgICAgICAgICAtIEFkZGVkIHJvdXRpbmUgdG8gbW9uaXRvciBQSFkgc3RhdHVzLgorICoJICAgICAgICAgICAgICAgICAgICAgLSBBZGRlZCBhY3Rpdml0eSBsZWQgc3VwcG9ydCBmb3IgUHJvbGlhbnQgZGV2aWNlcy4KKyAqCisgKgl2MS4xMCBBdWcgMzAsIDIwMDAgICAtIEFkZGVkIHN1cHBvcnQgZm9yIEVJU0EgYmFzZWQgdGxhbiBjb250cm9sbGVycyAKKyAqCQkJICAgICAgIGxpa2UgdGhlIENvbXBhcSBOZXRGbGV4My9FLiAKKyAqCQkJICAgICAtIFJld3JvdGUgdGxhbl9wcm9iZSB0byBiZXR0ZXIgaGFuZGxlIG11bHRpcGxlCisgKgkJCSAgICAgICBidXMgcHJvYmVzLiBQcm9iaW5nIGFuZCBkZXZpY2Ugc2V0dXAgaXMgbm93CisgKgkJCSAgICAgICBkb25lIHRocm91Z2ggVExhbl9Qcm9iZSBhbmQgVExhbl9pbml0X29uZS4gQWN0dWFsCisgKgkJCSAgICAgICBoYXJkd2FyZSBwcm9iZSBpcyBkb25lIHdpdGgga2VybmVsIEFQSSBhbmQgCisgKgkJCSAgICAgICBUTGFuX0Vpc2FQcm9iZS4KKyAqCQkJICAgICAtIEFkanVzdGVkIGRlYnVnIGluZm9ybWF0aW9uIGZvciBwcm9iaW5nLgorICoJCQkgICAgIC0gRml4ZWQgYnVnIHRoYXQgd291bGQgY2F1c2UgZ2VuZXJhbCBkZWJ1ZyBpbmZvcm1hdGlvbiAKKyAqCQkJICAgICAgIHRvIGJlIHByaW50ZWQgYWZ0ZXIgZHJpdmVyIHJlbW92YWwuIAorICoJCQkgICAgIC0gQWRkZWQgdHJhbnNtaXQgdGltZW91dCBoYW5kbGluZy4KKyAqCQkJICAgICAtIEZpeGVkIE9PTSByZXR1cm4gdmFsdWVzIGluIHRsYW5fcHJvYmUuIAorICoJCQkgICAgIC0gRml4ZWQgcG9zc2libGUgbWVtIGxlYWsgaW4gdGxhbl9leGl0IAorICoJCQkgICAgICAgKG5vdyB0bGFuX3JlbW92ZV9vbmUpLgorICoJCQkgICAgIC0gRml4ZWQgdGltZXIgYnVnIGluIFRMYW5fcGh5TW9uaXRvci4KKyAqCQkJICAgICAtIFRoaXMgZHJpdmVyIHZlcnNpb24gaXMgYWxwaGEgcXVhbGl0eSwgcGxlYXNlCisgKgkJCSAgICAgICBzZW5kIG1lIGFueSBidWcgaXNzdWVzIHlvdSBtYXkgZW5jb3VudGVyLgorICoKKyAqCXYxLjExIEF1ZyAzMSwgMjAwMCAgIC0gRG8gbm90IHRyeSB0byByZWdpc3RlciBpcnEgMCBpZiBubyBpcnEgbGluZSB3YXMgCisgKgkJCSAgICAgICBzZXQgZm9yIEVJU0EgY2FyZHMuCisgKgkJCSAgICAgLSBBZGRlZCBzdXBwb3J0IGZvciBOZXRGbGV4My9FIHdpdGggbmliYmxlLXJhdGUKKyAqCQkJICAgICAgIDEwQmFzZS1UIFBIWS4gVGhpcyBpcyB1bnRlc3RldCBhcyBJIGhhdmVuJ3QgZ290CisgKgkJCSAgICAgICBvbmUgb2YgdGhlc2UgY2FyZHMuCisgKgkJCSAgICAgLSBGaXhlZCB0aW1lciBiZWluZyBhZGRlZCB0d2ljZS4KKyAqCQkJICAgICAtIERpc2FibGVkIFBoeU1vbml0b3JpbmcgYnkgZGVmYXVsdCBhcyB0aGlzIGlzCisgKgkJCSAgICAgICB3b3JrIGluIHByb2dyZXNzLiBEZWZpbmUgTU9OSVRPUiB0byBlbmFibGUgaXQuCisgKgkJCSAgICAgLSBOb3cgd2UgZG9uJ3QgZGlzcGxheSBsaW5rIGluZm8gd2l0aCBQSFlzIHRoYXQKKyAqCQkJICAgICAgIGRvZXNuJ3Qgc3VwcG9ydCBpdCAobGV2ZWwxKS4KKyAqCQkJICAgICAtIEluY3Jlc2VkIHR4X3RpbWVvdXQgYmVhY3VzZSBvZiBhdXRvLW5lZy4KKyAqCQkJICAgICAtIEFkanVzdGVkIHRpbWVycyBmb3IgZm9yY2VkIHNwZWVkcy4KKyAqCisgKgl2MS4xMiBPY3QgMTIsIDIwMDAgICAtIE1pbm9yIGZpeGVzIChtZW1sZWFrLCBpbml0LCBldGMuKQorICoKKyAqIAl2MS4xMyBOb3YgMjgsIDIwMDAgICAtIFN0b3AgZmxvb2RpbmcgY29uc29sZSB3aXRoIGF1dG8tbmVnIGlzc3VlcworICogCQkJICAgICAgIHdoZW4gbGluayBjYW4ndCBiZSBlc3RhYmxpc2hlZC4KKyAqCQkJICAgICAtIEFkZGVkIHRoZSBiYnVmIG9wdGlvbiBhcyBhIGtlcm5lbCBwYXJhbWV0ZXIuCisgKgkJCSAgICAgLSBGaXhlZCBpb2FkZHIgcHJvYmUgYnVnLgorICoJCQkgICAgIC0gRml4ZWQgc3R1cGlkIGRlYWRsb2NrIHdpdGggTUlJIGludGVycnVwdHMuCisgKgkJCSAgICAgLSBBZGRlZCBzdXBwb3J0IGZvciBzcGVlZC9kdXBsZXggc2VsZWN0aW9uIHdpdGggCisgKgkJCSAgICAgICBtdWx0aXBsZSBuaWNzLgorICoJCQkgICAgIC0gQWRkZWQgcGFydGx5IGZpeCBmb3IgVFggQ2hhbm5lbCBsb2NrdXAgd2l0aAorICoJCQkgICAgICAgVExBTiB2MS4wIHNpbGljb24uIFRoaXMgbmVlZHMgdG8gYmUgaW52ZXN0aWdhdGVkCisgKgkJCSAgICAgICBmdXJ0aGVyLgorICoKKyAqIAl2MS4xNCBEZWMgMTYsIDIwMDAgICAtIEFkZGVkIHN1cHBvcnQgZm9yIHNlcnZpY2luZyBtdWx0aXBsZSBmcmFtZXMgcGVyLgorICogCQkJICAgICAgIGludGVycnVwdC4gVGhhbmtzIGdvZXMgdG8KKyAqIAkJCSAgICAgICBBZGFtIEtleXMgPGFkYW1AdGkuY29tPgorICogCQkJICAgICAgIERlbmlzIEJlYXVkb2luIDxkYmVhdWRvaW5AdGkuY29tPgorICogCQkJICAgICAgIGZvciBwcm92aWRpbmcgdGhlIHBhdGNoLgorICogCQkJICAgICAtIEZpeGVkIGF1dG8tbmVnIG91dHB1dCB3aGVuIHVzaW5nIG11bHRpcGxlCisgKiAJCQkgICAgICAgYWRhcHRlcnMuCisgKiAJCQkgICAgIC0gQ29udmVydGVkIHRvIHVzZSBuZXcgdGFza3EgaW50ZXJmYWNlLgorICoKKyAqIAl2MS4xNGEgSmFuIDYsIDIwMDEgICAtIE1pbm9yIGFkanVzdG1lbnRzIChzcGlubG9ja3MsIGV0Yy4pCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJ0bGFuLmgiCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisKK3R5cGVkZWYgdTMyIChUTGFuSW50VmVjdG9yRnVuYykoIHN0cnVjdCBuZXRfZGV2aWNlICosIHUxNiApOworCisvKiBGb3IgcmVtb3ZpbmcgRUlTQSBkZXZpY2VzICovCitzdGF0aWMJc3RydWN0IG5ldF9kZXZpY2UJKlRMYW5fRWlzYV9EZXZpY2VzOworCitzdGF0aWMJaW50CQlUTGFuRGV2aWNlc0luc3RhbGxlZDsKKworLyogU2V0IHNwZWVkLCBkdXBsZXggYW5kIGF1aSBzZXR0aW5ncyAqLworc3RhdGljICBpbnQgYXVpW01BWF9UTEFOX0JPQVJEU107CitzdGF0aWMgIGludCBkdXBsZXhbTUFYX1RMQU5fQk9BUkRTXTsKK3N0YXRpYyAgaW50IHNwZWVkW01BWF9UTEFOX0JPQVJEU107CitzdGF0aWMgIGludCBib2FyZHNfZm91bmQ7CisKK01PRFVMRV9BVVRIT1IoIk1haW50YWluZXI6IFRvcmJlbiBNYXRoaWFzZW4gPHRvcmJlbi5tYXRoaWFzZW5AY29tcGFxLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBUSSBUaHVuZGVyTEFOIGJhc2VkIGV0aGVybmV0IFBDSSBhZGFwdGVycyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitNT0RVTEVfUEFSTShhdWksICIxLSIgX19NT0RVTEVfU1RSSU5HKE1BWF9UTEFOX0JPQVJEUykgImkiKTsKK01PRFVMRV9QQVJNKGR1cGxleCwgIjEtIiBfX01PRFVMRV9TVFJJTkcoTUFYX1RMQU5fQk9BUkRTKSAiaSIpOworTU9EVUxFX1BBUk0oc3BlZWQsICIxLSIgX19NT0RVTEVfU1RSSU5HKE1BWF9UTEFOX0JPQVJEUykgImkiKTsKK01PRFVMRV9QQVJNKGRlYnVnLCAiaSIpOworTU9EVUxFX1BBUk0oYmJ1ZiwgImkiKTsKK01PRFVMRV9QQVJNX0RFU0MoYXVpLCAiVGh1bmRlckxBTiB1c2UgQVVJIHBvcnQocykgKDAtMSkiKTsKK01PRFVMRV9QQVJNX0RFU0MoZHVwbGV4LCAiVGh1bmRlckxBTiBkdXBsZXggc2V0dGluZyhzKSAoMC1kZWZhdWx0LCAxLWhhbGYsIDItZnVsbCkiKTsKK01PRFVMRV9QQVJNX0RFU0Moc3BlZWQsICJUaHVuZGVyTEFOIHBvcnQgc3BlZW4gc2V0dGluZyhzKSAoMCwxMCwxMDApIik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiVGh1bmRlckxBTiBkZWJ1ZyBtYXNrIik7CitNT0RVTEVfUEFSTV9ERVNDKGJidWYsICJUaHVuZGVyTEFOIHVzZSBiaWcgYnVmZmVyICgwLTEpIik7CitFWFBPUlRfTk9fU1lNQk9MUzsKKworLyogRGVmaW5lIHRoaXMgdG8gZW5hYmxlIExpbmsgYmVhdCBtb25pdG9yaW5nICovCisjdW5kZWYgTU9OSVRPUgorCisvKiBUdXJuIG9uIGRlYnVnZ2luZy4gU2VlIGxpbnV4L0RvY3VtZW50YXRpb24vbmV0d29ya2luZy90bGFuLnR4dCBmb3IgZGV0YWlscyAqLworc3RhdGljICBpbnQJCWRlYnVnOworCitzdGF0aWMJaW50CQliYnVmOworc3RhdGljCXU4CQkqVExhblBhZEJ1ZmZlcjsKK3N0YXRpYwljaGFyCQlUTGFuU2lnbmF0dXJlW10gPSAiVExBTiI7CitzdGF0aWMgY29uc3QgY2hhciB0bGFuX2Jhbm5lcltdID0gIlRodW5kZXJMQU4gZHJpdmVyIHYxLjE0YVxuIjsKK3N0YXRpYyBpbnQgdGxhbl9oYXZlX3BjaTsKK3N0YXRpYyBpbnQgdGxhbl9oYXZlX2Vpc2E7CisKK2NvbnN0IGNoYXIgKm1lZGlhW10gPSB7CisJIjEwQmFzZVQtSEQgIiwgIjEwQmFzZVQtRkQgIiwiMTAwYmFzZVR4LUhEICIsIAorCSIxMDBiYXNlVHgtRkQiLCAiMTAwYmFzZVQ0IiwgMAorfTsKKworaW50IG1lZGlhX21hcFtdID0geyAweDAwMjAsIDB4MDA0MCwgMHgwMDgwLCAweDAxMDAsIDB4MDIwMCx9OworCitzdGF0aWMgc3RydWN0IGJvYXJkIHsKKwljb25zdCBjaGFyCSpkZXZpY2VMYWJlbDsKKwl1MzIJICAgCWZsYWdzOworCXUxNgkgICAJYWRkck9mczsKK30gYm9hcmRfaW5mb1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyAiQ29tcGFxIE5ldGVsbGlnZW50IDEwIFQgUENJIFVUUCIsIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQsIDB4ODMgfSwKKwl7ICJDb21wYXEgTmV0ZWxsaWdlbnQgMTAvMTAwIFRYIFBDSSBVVFAiLCBUTEFOX0FEQVBURVJfQUNUSVZJVFlfTEVELCAweDgzIH0sCisJeyAiQ29tcGFxIEludGVncmF0ZWQgTmV0RmxleC0zL1AiLCBUTEFOX0FEQVBURVJfTk9ORSwgMHg4MyB9LAorCXsgIkNvbXBhcSBOZXRGbGV4LTMvUCIsIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZIHwgVExBTl9BREFQVEVSX0JJVF9SQVRFX1BIWSwgMHg4MyB9LAorCXsgIkNvbXBhcSBOZXRGbGV4LTMvUCIsIFRMQU5fQURBUFRFUl9OT05FLCAweDgzIH0sCisJeyAiQ29tcGFxIE5ldGVsbGlnZW50IEludGVncmF0ZWQgMTAvMTAwIFRYIFVUUCIsIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQsIDB4ODMgfSwKKwl7ICJDb21wYXEgTmV0ZWxsaWdlbnQgRHVhbCAxMC8xMDAgVFggUENJIFVUUCIsIFRMQU5fQURBUFRFUl9OT05FLCAweDgzIH0sCisJeyAiQ29tcGFxIE5ldGVsbGlnZW50IDEwLzEwMCBUWCBFbWJlZGRlZCBVVFAiLCBUTEFOX0FEQVBURVJfTk9ORSwgMHg4MyB9LAorCXsgIk9saWNvbSBPQy0yMTgzLzIxODUiLCBUTEFOX0FEQVBURVJfVVNFX0lOVEVSTl8xMCwgMHg4MyB9LAorCXsgIk9saWNvbSBPQy0yMzI1IiwgVExBTl9BREFQVEVSX1VOTUFOQUdFRF9QSFksIDB4RjggfSwKKwl7ICJPbGljb20gT0MtMjMyNiIsIFRMQU5fQURBUFRFUl9VU0VfSU5URVJOXzEwLCAweEY4IH0sCisJeyAiQ29tcGFxIE5ldGVsbGlnZW50IDEwLzEwMCBUWCBVVFAiLCBUTEFOX0FEQVBURVJfQUNUSVZJVFlfTEVELCAweDgzIH0sCisJeyAiQ29tcGFxIE5ldGVsbGlnZW50IDEwIFQvMiBQQ0kgVVRQL0NvYXgiLCBUTEFOX0FEQVBURVJfTk9ORSwgMHg4MyB9LAorCXsgIkNvbXBhcSBOZXRGbGV4LTMvRSIsIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQgfCAJLyogRUlTQSBjYXJkICovCisJICAgICAgICAgICAgICAgICAgICAgICAgVExBTl9BREFQVEVSX1VOTUFOQUdFRF9QSFkgfCBUTEFOX0FEQVBURVJfQklUX1JBVEVfUEhZLCAweDgzIH0sCQorCXsgIkNvbXBhcSBOZXRGbGV4LTMvRSIsIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQsIDB4ODMgfSwgLyogRUlTQSBjYXJkICovCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgdGxhbl9wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9ORVRFTDEwLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfTkVURUwxMDAsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDEgfSwKKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9ORVRGTEVYM0ksCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDIgfSwKKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9USFVOREVSLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAzIH0sCisJeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfTkVURkxFWDNCLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA0IH0sCisJeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfTkVURUwxMDBQSSwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNSB9LAorCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX05FVEVMMTAwRCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNiB9LAorCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX05FVEVMMTAwSSwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNyB9LAorCXsgUENJX1ZFTkRPUl9JRF9PTElDT00sIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjE4MywKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgOCB9LAorCXsgUENJX1ZFTkRPUl9JRF9PTElDT00sIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjMyNSwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgOSB9LAorCXsgUENJX1ZFTkRPUl9JRF9PTElDT00sIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjMyNiwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTAgfSwKKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX05FVEVMTElHRU5UXzEwXzEwMF9XU181MTAwLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxMSB9LAorCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfTkVURUxMSUdFTlRfMTBfVDIsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDEyIH0sCisJeyAwLH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdGxhbl9wY2lfdGJsKTsJCQorCitzdGF0aWMgdm9pZAlUTGFuX0Vpc2FQcm9iZSggdm9pZCApOworc3RhdGljIHZvaWQJVExhbl9FaXNhX0NsZWFudXAoIHZvaWQgKTsKK3N0YXRpYyBpbnQgICAgICBUTGFuX0luaXQoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyBpbnQJVExhbl9PcGVuKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CitzdGF0aWMgaW50CVRMYW5fU3RhcnRUeCggc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgdm9pZAlUTGFuX0hhbmRsZUludGVycnVwdCggaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworc3RhdGljIGludAlUTGFuX0Nsb3NlKCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBzdHJ1Y3QJbmV0X2RldmljZV9zdGF0cyAqVExhbl9HZXRTdGF0cyggc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgdm9pZAlUTGFuX1NldE11bHRpY2FzdExpc3QoIHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludAlUTGFuX2lvY3RsKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBpbnQgICAgICBUTGFuX3Byb2JlMSggc3RydWN0IHBjaV9kZXYgKnBkZXYsIGxvbmcgaW9hZGRyLCBpbnQgaXJxLCBpbnQgcmV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyB2b2lkCVRMYW5fdHhfdGltZW91dCggc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IAl0bGFuX2luaXRfb25lKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CisKK3N0YXRpYyB1MzIJVExhbl9IYW5kbGVJbnZhbGlkKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYgKTsKK3N0YXRpYyB1MzIJVExhbl9IYW5kbGVUeEVPRiggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2ICk7CitzdGF0aWMgdTMyCVRMYW5fSGFuZGxlU3RhdE92ZXJmbG93KCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYgKTsKK3N0YXRpYyB1MzIJVExhbl9IYW5kbGVSeEVPRiggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2ICk7CitzdGF0aWMgdTMyCVRMYW5fSGFuZGxlRHVtbXkoIHN0cnVjdCBuZXRfZGV2aWNlICosIHUxNiApOworc3RhdGljIHUzMglUTGFuX0hhbmRsZVR4RU9DKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYgKTsKK3N0YXRpYyB1MzIJVExhbl9IYW5kbGVTdGF0dXNDaGVjayggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2ICk7CitzdGF0aWMgdTMyCVRMYW5fSGFuZGxlUnhFT0MoIHN0cnVjdCBuZXRfZGV2aWNlICosIHUxNiApOworCitzdGF0aWMgdm9pZAlUTGFuX1RpbWVyKCB1bnNpZ25lZCBsb25nICk7CisKK3N0YXRpYyB2b2lkCVRMYW5fUmVzZXRMaXN0cyggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHZvaWQJVExhbl9GcmVlTGlzdHMoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyB2b2lkCVRMYW5fUHJpbnREaW8oIHUxNiApOworc3RhdGljIHZvaWQJVExhbl9QcmludExpc3QoIFRMYW5MaXN0ICosIGNoYXIgKiwgaW50ICk7CitzdGF0aWMgdm9pZAlUTGFuX1JlYWRBbmRDbGVhclN0YXRzKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQgKTsKK3N0YXRpYyB2b2lkCVRMYW5fUmVzZXRBZGFwdGVyKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgdm9pZAlUTGFuX0ZpbmlzaFJlc2V0KCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgdm9pZAlUTGFuX1NldE1hYyggc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50IGFyZWcsIGNoYXIgKm1hYyApOworCitzdGF0aWMgdm9pZAlUTGFuX1BoeVByaW50KCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgdm9pZAlUTGFuX1BoeURldGVjdCggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHZvaWQJVExhbl9QaHlQb3dlckRvd24oIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyB2b2lkCVRMYW5fUGh5UG93ZXJVcCggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHZvaWQJVExhbl9QaHlSZXNldCggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHZvaWQJVExhbl9QaHlTdGFydExpbmsoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyB2b2lkCVRMYW5fUGh5RmluaXNoQXV0b05lZyggc3RydWN0IG5ldF9kZXZpY2UgKiApOworI2lmZGVmIE1PTklUT1IKK3N0YXRpYyB2b2lkICAgICBUTGFuX1BoeU1vbml0b3IoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKKyNlbmRpZgorCisvKgorc3RhdGljIGludAlUTGFuX1BoeU5vcCggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIGludAlUTGFuX1BoeUludGVybmFsQ2hlY2soIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyBpbnQJVExhbl9QaHlJbnRlcm5hbFNlcnZpY2UoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyBpbnQJVExhbl9QaHlEcDgzODQwYUNoZWNrKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CisqLworCitzdGF0aWMgaW50CVRMYW5fTWlpUmVhZFJlZyggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2LCB1MTYsIHUxNiAqICk7CitzdGF0aWMgdm9pZAlUTGFuX01paVNlbmREYXRhKCB1MTYsIHUzMiwgdW5zaWduZWQgKTsKK3N0YXRpYyB2b2lkCVRMYW5fTWlpU3luYyggdTE2ICk7CitzdGF0aWMgdm9pZAlUTGFuX01paVdyaXRlUmVnKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYsIHUxNiwgdTE2ICk7CisKK3N0YXRpYyB2b2lkCVRMYW5fRWVTZW5kU3RhcnQoIHUxNiApOworc3RhdGljIGludAlUTGFuX0VlU2VuZEJ5dGUoIHUxNiwgdTgsIGludCApOworc3RhdGljIHZvaWQJVExhbl9FZVJlY2VpdmVCeXRlKCB1MTYsIHU4ICosIGludCApOworc3RhdGljIGludAlUTGFuX0VlUmVhZEJ5dGUoIHN0cnVjdCBuZXRfZGV2aWNlICosIHU4LCB1OCAqICk7CisKK3N0YXRpYyBUTGFuSW50VmVjdG9yRnVuYyAqVExhbkludFZlY3RvcltUTEFOX0lOVF9OVU1CRVJfT0ZfSU5UU10gPSB7CisJVExhbl9IYW5kbGVJbnZhbGlkLAorCVRMYW5fSGFuZGxlVHhFT0YsCisJVExhbl9IYW5kbGVTdGF0T3ZlcmZsb3csCisJVExhbl9IYW5kbGVSeEVPRiwKKwlUTGFuX0hhbmRsZUR1bW15LAorCVRMYW5fSGFuZGxlVHhFT0MsCisJVExhbl9IYW5kbGVTdGF0dXNDaGVjaywKKwlUTGFuX0hhbmRsZVJ4RU9DCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQKK1RMYW5fU2V0VGltZXIoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB0aWNrcywgdTMyIHR5cGUgKQoreworCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwkKKwlpZiAoIWluX2lycSgpKQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCWlmICggcHJpdi0+dGltZXIuZnVuY3Rpb24gIT0gTlVMTCAmJgorCQlwcml2LT50aW1lclR5cGUgIT0gVExBTl9USU1FUl9BQ1RJVklUWSApIHsgCisJCWlmICghaW5faXJxKCkpCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJcHJpdi0+dGltZXIuZnVuY3Rpb24gPSAmVExhbl9UaW1lcjsKKwlpZiAoIWluX2lycSgpKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlwcml2LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKwlwcml2LT50aW1lclNldEF0ID0gamlmZmllczsKKwlwcml2LT50aW1lclR5cGUgPSB0eXBlOworCW1vZF90aW1lcigmcHJpdi0+dGltZXIsIGppZmZpZXMgKyB0aWNrcyk7CisJCit9IC8qIFRMYW5fU2V0VGltZXIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCVRodW5kZXJMQU4gRHJpdmVyIFByaW1hcnkgRnVuY3Rpb25zCisKKwlUaGVzZSBmdW5jdGlvbnMgYXJlIG1vcmUgb3IgbGVzcyBjb21tb24gdG8gYWxsIExpbnV4IG5ldHdvcmsgZHJpdmVycy4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKgl0bGFuX3JlbW92ZV9vbmUKKwkgKgorCSAqCVJldHVybnM6CisJICoJCU5vdGhpbmcKKwkgKglQYXJtczoKKwkgKgkJTm9uZQorCSAqCisJICoJR29lcyB0aHJvdWdoIHRoZSBUTGFuRGV2aWNlcyBsaXN0IGFuZCBmcmVlcyB0aGUgZGV2aWNlCisJICoJc3RydWN0cyBhbmQgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBlYWNoIGRldmljZSAobGlzdHMKKwkgKglhbmQgYnVmZmVycykuICBJdCBhbHNvIHVyZXNlcnZlcyB0aGUgSU8gcG9ydCByZWdpb25zCisJICoJYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV2aWNlLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgdGxhbl9yZW1vdmVfb25lKCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKCBwZGV2ICk7CisJVExhblByaXZhdGVJbmZvCSpwcml2ID0gZGV2LT5wcml2OworCQorCXVucmVnaXN0ZXJfbmV0ZGV2KCBkZXYgKTsKKworCWlmICggcHJpdi0+ZG1hU3RvcmFnZSApIHsKKwkJa2ZyZWUoIHByaXYtPmRtYVN0b3JhZ2UgKTsKKwl9CisKKwlyZWxlYXNlX3JlZ2lvbiggZGV2LT5iYXNlX2FkZHIsIDB4MTAgKTsKKwkKKwlrZnJlZSggZGV2ICk7CisJCQorCXBjaV9zZXRfZHJ2ZGF0YSggcGRldiwgTlVMTCApOworfSAKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHRsYW5fZHJpdmVyID0geworCW5hbWU6CQkidGxhbiIsCisJaWRfdGFibGU6CXRsYW5fcGNpX3RibCwKKwlwcm9iZToJCXRsYW5faW5pdF9vbmUsCisJcmVtb3ZlOgkJdGxhbl9yZW1vdmVfb25lLAkKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHRsYW5fcHJvYmUodm9pZCkKK3sKKwlzdGF0aWMgaW50CXBhZF9hbGxvY2F0ZWQ7CisJCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB0bGFuX2Jhbm5lcik7CisJCisJVExhblBhZEJ1ZmZlciA9ICh1OCAqKSBrbWFsbG9jKFRMQU5fTUlOX0ZSQU1FX1NJWkUsIAorCQkJCQlHRlBfS0VSTkVMKTsKKworCWlmIChUTGFuUGFkQnVmZmVyID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJUTEFOOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBwYWQgYnVmZmVyLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChUTGFuUGFkQnVmZmVyLCAwLCBUTEFOX01JTl9GUkFNRV9TSVpFKTsKKwlwYWRfYWxsb2NhdGVkID0gMTsKKworCVRMQU5fREJHKFRMQU5fREVCVUdfUFJPQkUsICJTdGFydGluZyBQQ0kgUHJvYmUuLi4uXG4iKTsKKwkKKwkvKiBVc2UgbmV3IHN0eWxlIFBDSSBwcm9iaW5nLiBOb3cgdGhlIGtlcm5lbCB3aWxsCisJICAgZG8gbW9zdCBvZiB0aGlzIGZvciB1cyAqLworCXBjaV9yZWdpc3Rlcl9kcml2ZXIoJnRsYW5fZHJpdmVyKTsKKworCVRMQU5fREJHKFRMQU5fREVCVUdfUFJPQkUsICJTdGFydGluZyBFSVNBIFByb2JlLi4uLlxuIik7CisJVExhbl9FaXNhUHJvYmUoKTsKKwkJCisJcHJpbnRrKEtFUk5fSU5GTyAiVExBTjogJWQgZGV2aWNlJXMgaW5zdGFsbGVkLCBQQ0k6ICVkICBFSVNBOiAlZFxuIiwgCisJCSBUTGFuRGV2aWNlc0luc3RhbGxlZCwgVExhbkRldmljZXNJbnN0YWxsZWQgPT0gMSA/ICIiIDogInMiLAorCQkgdGxhbl9oYXZlX3BjaSwgdGxhbl9oYXZlX2Vpc2EpOworCisJaWYgKFRMYW5EZXZpY2VzSW5zdGFsbGVkID09IDApIHsKKwkJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ0bGFuX2RyaXZlcik7CisJCWtmcmVlKFRMYW5QYWRCdWZmZXIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisJCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRsYW5faW5pdF9vbmUoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXJldHVybiBUTGFuX3Byb2JlMSggcGRldiwgLTEsIC0xLCAwLCBlbnQpOworfQorCisvKgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCXRsYW5fcHJvYmUxCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQkwIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb24gZXJyb3IKKwkgKglQYXJtczogCisJICoJCW5vbmUKKwkgKgorCSAqCVRoZSBuYW1lIGlzIGxvd2VyIGNhc2UgdG8gZml0IGluIHdpdGggYWxsIHRoZSByZXN0IG9mCisJICoJdGhlIG5ldGNhcmRfcHJvYmUgbmFtZXMuICBUaGlzIGZ1bmN0aW9uIGxvb2tzIGZvciAKKwkgKglhbm90aGVyIFRMYW4gYmFzZWQgYWRhcHRlciwgc2V0dGluZyBpdCB1cCB3aXRoIHRoZQorCSAqCWFsbG9jYXRlZCBkZXZpY2Ugc3RydWN0IGlmIG9uZSBpcyBmb3VuZC4KKwkgKgl0bGFuX3Byb2JlIGhhcyBiZWVuIHBvcnRlZCB0byB0aGUgbmV3IG5ldCBBUEkgYW5kCisJICoJbm93IGFsbG9jYXRlcyBpdHMgb3duIGRldmljZSBzdHJ1Y3R1cmUuIFRoaXMgZnVuY3Rpb24KKwkgKglpcyBhbHNvIHVzZWQgYnkgbW9kdWxlcy4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBfX2RldmluaXQgVExhbl9wcm9iZTEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIAorCQkJCWxvbmcgaW9hZGRyLCBpbnQgaXJxLCBpbnQgcmV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50ICkKK3sKKworCXN0cnVjdCBuZXRfZGV2aWNlICAqZGV2OworCVRMYW5Qcml2YXRlSW5mbyAgICAqcHJpdjsKKwl1OAkJICAgcGNpX3JldjsKKwl1MTYJCSAgIGRldmljZV9pZDsKKwlpbnQJCSAgIHJlZzsKKworCWlmIChwZGV2ICYmIHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlyZXR1cm4gLUVJTzsKKworCWRldiA9IGluaXRfZXRoZXJkZXYoTlVMTCwgc2l6ZW9mKFRMYW5Qcml2YXRlSW5mbykpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIlRMQU46IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRldmljZS5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCQorCXByaXYgPSBkZXYtPnByaXY7CisKKwkvKiBJcyB0aGlzIGEgUENJIGRldmljZT8gKi8KKwlpZiAocGRldikgeworCQl1MzIgCQkgICBwY2lfaW9fYmFzZSA9IDA7CisKKwkJcHJpdi0+YWRhcHRlciA9ICZib2FyZF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdOworCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlICggcGRldiwgUENJX1JFVklTSU9OX0lELCAmcGNpX3Jldik7CisKKwkJZm9yICggcmVnPSAwOyByZWcgPD0gNTsgcmVnICsrICkgeworCQkJaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCByZWcpICYgSU9SRVNPVVJDRV9JTykgeworCQkJCXBjaV9pb19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIHJlZyk7CisJCQkJVExBTl9EQkcoIFRMQU5fREVCVUdfR05STCwgIklPIG1hcHBpbmcgaXMgYXZhaWxhYmxlIGF0ICV4LlxuIiwKKwkJCQkJCXBjaV9pb19iYXNlKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIXBjaV9pb19iYXNlKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlRMQU46IE5vIElPIG1hcHBpbmdzIGF2YWlsYWJsZVxuIik7CisJCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQkJa2ZyZWUoZGV2KTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCQorCQlkZXYtPmJhc2VfYWRkciA9IHBjaV9pb19iYXNlOworCQlkZXYtPmlycSA9IHBkZXYtPmlycTsKKwkJcHJpdi0+YWRhcHRlclJldiA9IHBjaV9yZXY7IAorCQlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwkJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwl9IGVsc2UJeyAgICAgLyogRUlTQSBjYXJkICovCisJCS8qIFRoaXMgaXMgYSBoYWNrLiBXZSBuZWVkIHRvIGtub3cgd2hpY2ggYm9hcmQgc3RydWN0dXJlCisJCSAqIGlzIHN1aXRlZCBmb3IgdGhpcyBhZGFwdGVyICovCisJCWRldmljZV9pZCA9IGludyhpb2FkZHIgKyBFSVNBX0lEMik7CisJCXByaXYtPmlzX2Vpc2EgPSAxOworCQlpZiAoZGV2aWNlX2lkID09IDB4MjBGMSkgeworCQkJcHJpdi0+YWRhcHRlciA9ICZib2FyZF9pbmZvWzEzXTsgCS8qIE5ldEZsZXgtMy9FICovCisJCQlwcml2LT5hZGFwdGVyUmV2ID0gMjM7CQkJLyogVExBTiAyLjMgKi8KKwkJfSBlbHNlIHsKKwkJCXByaXYtPmFkYXB0ZXIgPSAmYm9hcmRfaW5mb1sxNF07CisJCQlwcml2LT5hZGFwdGVyUmV2ID0gMTA7CQkJLyogVExBTiAxLjAgKi8KKwkJfQorCQlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwkJZGV2LT5pcnEgPSBpcnE7CisJfQorCisJLyogS2VybmVsIHBhcmFtZXRlcnMgKi8KKwlpZiAoZGV2LT5tZW1fc3RhcnQpIHsKKwkJcHJpdi0+YXVpICAgID0gZGV2LT5tZW1fc3RhcnQgJiAweDAxOworCQlwcml2LT5kdXBsZXggPSAoKGRldi0+bWVtX3N0YXJ0ICYgMHgwNikgPT0gMHgwNikgPyAwIDogKGRldi0+bWVtX3N0YXJ0ICYgMHgwNikgPj4gMTsKKwkJcHJpdi0+c3BlZWQgID0gKChkZXYtPm1lbV9zdGFydCAmIDB4MTgpID09IDB4MTgpID8gMCA6IChkZXYtPm1lbV9zdGFydCAmIDB4MTgpID4+IDM7CisJCisJCWlmIChwcml2LT5zcGVlZCA9PSAweDEpIHsKKwkJCXByaXYtPnNwZWVkID0gVExBTl9TUEVFRF8xMDsKKwkJfSBlbHNlIGlmIChwcml2LT5zcGVlZCA9PSAweDIpIHsKKwkJCXByaXYtPnNwZWVkID0gVExBTl9TUEVFRF8xMDA7CisJCX0KKwkJZGVidWcgPSBwcml2LT5kZWJ1ZyA9IGRldi0+bWVtX2VuZDsKKwl9IGVsc2UgeworCQlwcml2LT5hdWkgICAgPSBhdWlbYm9hcmRzX2ZvdW5kXTsKKwkJcHJpdi0+c3BlZWQgID0gc3BlZWRbYm9hcmRzX2ZvdW5kXTsKKwkJcHJpdi0+ZHVwbGV4ID0gZHVwbGV4W2JvYXJkc19mb3VuZF07CisJCXByaXYtPmRlYnVnID0gZGVidWc7CisJfQorCQorCS8qIFRoaXMgd2lsbCBiZSB1c2VkIHdoZW4gd2UgZ2V0IGFuIGFkYXB0ZXIgZXJyb3IgZnJvbQorCSAqIHdpdGhpbiBvdXIgaXJxIGhhbmRsZXIgKi8KKwlJTklUX0xJU1RfSEVBRCgmcHJpdi0+dGxhbl90cXVldWUubGlzdCk7CisJcHJpdi0+dGxhbl90cXVldWUuc3luYyA9IDA7CisJcHJpdi0+dGxhbl90cXVldWUucm91dGluZSA9ICh2b2lkICopKHZvaWQqKVRMYW5fdHhfdGltZW91dDsKKwlwcml2LT50bGFuX3RxdWV1ZS5kYXRhID0gZGV2OworCisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOworCQorCWlmIChUTGFuX0luaXQoZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgIlRMQU46IENvdWxkIG5vdCByZWdpc3RlciBkZXZpY2UuXG4iKTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJa2ZyZWUoZGV2KTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfSBlbHNlIHsKKwkKKwlUTGFuRGV2aWNlc0luc3RhbGxlZCsrOworCWJvYXJkc19mb3VuZCsrOworCQorCS8qIHBkZXYgaXMgTlVMTCBpZiB0aGlzIGlzIGFuIEVJU0EgZGV2aWNlICovCisJaWYgKHBkZXYpCisJCXRsYW5faGF2ZV9wY2krKzsKKwllbHNlIHsKKwkJcHJpdi0+bmV4dERldmljZSA9IFRMYW5fRWlzYV9EZXZpY2VzOworCQlUTGFuX0Vpc2FfRGV2aWNlcyA9IGRldjsKKwkJdGxhbl9oYXZlX2Vpc2ErKzsKKwl9CisJCisJcHJpbnRrKEtFUk5fSU5GTyAiVExBTjogJXMgaXJxPSUyZCwgaW89JTA0eCwgJXMsIFJldi4gJWRcbiIsCisJCQlkZXYtPm5hbWUsCisJCQkoaW50KSBkZXYtPmlycSwKKwkJCShpbnQpIGRldi0+YmFzZV9hZGRyLAorCQkJcHJpdi0+YWRhcHRlci0+ZGV2aWNlTGFiZWwsCisJCQlwcml2LT5hZGFwdGVyUmV2KTsKKwlyZXR1cm4gMDsKKwl9CisKK30KKworc3RhdGljIHZvaWQgVExhbl9FaXNhX0NsZWFudXAodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCVRMYW5Qcml2YXRlSW5mbyAqcHJpdjsKKwkKKwl3aGlsZSggdGxhbl9oYXZlX2Vpc2EgKSB7CisJCWRldiA9IFRMYW5fRWlzYV9EZXZpY2VzOworCQlwcml2ID0gZGV2LT5wcml2OworCQlpZiAocHJpdi0+ZG1hU3RvcmFnZSkgeworCQkJa2ZyZWUocHJpdi0+ZG1hU3RvcmFnZSk7CisJCX0KKwkJcmVsZWFzZV9yZWdpb24oIGRldi0+YmFzZV9hZGRyLCAweDEwKTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoIGRldiApOworCQlUTGFuX0Vpc2FfRGV2aWNlcyA9IHByaXYtPm5leHREZXZpY2U7CisJCWtmcmVlKCBkZXYgKTsKKwkJdGxhbl9oYXZlX2Vpc2EtLTsKKwl9Cit9CisJCisJCQorc3RhdGljIHZvaWQgX19leGl0IHRsYW5fZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdGxhbl9kcml2ZXIpOworCisJaWYgKHRsYW5faGF2ZV9laXNhKQorCQlUTGFuX0Vpc2FfQ2xlYW51cCgpOworCisJa2ZyZWUoIFRMYW5QYWRCdWZmZXIgKTsKKworfQorCisvKiBNb2R1bGUgbG9hZGluZy91bmxvYWRpbmcgKi8KK21vZHVsZV9pbml0KHRsYW5fcHJvYmUpOworbW9kdWxlX2V4aXQodGxhbl9leGl0KTsKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIAlUTGFuX0Vpc2FQcm9iZQorCSAqCisJICogIAlSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIDEgb3RoZXJ3aXNlCisJICoKKwkgKiAgCVBhcm1zOgkgTm9uZQorCSAqCisJICoKKwkgKiAgCVRoaXMgZnVuY3Rpb25zIHByb2JlcyBmb3IgRUlTQSBkZXZpY2VzIGFuZCBjYWxscyAKKwkgKiAgCVRMYW5fcHJvYmUxIHdoZW4gb25lIGlzIGZvdW5kLiAKKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCAgX19pbml0IFRMYW5fRWlzYVByb2JlICh2b2lkKSAKK3sKKwlsb25nIAlpb2FkZHI7CisJaW50IAlyYyA9IC1FTk9ERVY7CisJaW50IAlpcnE7CisJdTE2CWRldmljZV9pZDsKKworCWlmICghRUlTQV9idXMpIHsJCisJCVRMQU5fREJHKFRMQU5fREVCVUdfUFJPQkUsICJObyBFSVNBIGJ1cyBwcmVzZW50XG4iKTsKKwkJcmV0dXJuOworCX0KKwkKKwkvKiBMb29wIHRocm91Z2ggYWxsIHNsb3RzIG9mIHRoZSBFSVNBIGJ1cyAqLworCWZvciAoaW9hZGRyID0gMHgxMDAwOyBpb2FkZHIgPCAweDkwMDA7IGlvYWRkciArPSAweDEwMDApIHsKKwkJCisJVExBTl9EQkcoVExBTl9ERUJVR19QUk9CRSwiRUlTQV9JRCAweCU0eDogMHglNHhcbiIsIChpbnQpIGlvYWRkciArIDB4QzgwLCBpbncoaW9hZGRyICsgRUlTQV9JRCkpOwkKKwlUTEFOX0RCRyhUTEFOX0RFQlVHX1BST0JFLCJFSVNBX0lEIDB4JTR4OiAweCU0eFxuIiwgKGludCkgaW9hZGRyICsgMHhDODIsIGludyhpb2FkZHIgKyBFSVNBX0lEMikpOworCisJCVRMQU5fREJHKFRMQU5fREVCVUdfUFJPQkUsICJQcm9iaW5nIGZvciBFSVNBIGFkYXB0ZXIgYXQgSU86IDB4JTR4IDogIiwKKwkJCQkgICAJKGludCkgaW9hZGRyKTsKKwkJaWYgKHJlcXVlc3RfcmVnaW9uKGlvYWRkciwgMHgxMCwgVExhblNpZ25hdHVyZSkgPT0gTlVMTCkgCisJCQlnb3RvIG91dDsKKworCQlpZiAoaW53KGlvYWRkciArIEVJU0FfSUQpICE9IDB4MTEwRSkgewkJCisJCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIDB4MTApOworCQkJZ290byBvdXQ7CisJCX0KKwkJCisJCWRldmljZV9pZCA9IGludyhpb2FkZHIgKyBFSVNBX0lEMik7CisJCWlmIChkZXZpY2VfaWQgIT0gIDB4MjBGMSAmJiBkZXZpY2VfaWQgIT0gMHg0MEYxKSB7IAkJCisJCQlyZWxlYXNlX3JlZ2lvbiAoaW9hZGRyLCAweDEwKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCQorCSAJaWYgKGluYihpb2FkZHIgKyBFSVNBX0NSKSAhPSAweDEpIHsgCS8qIENoZWNrIGlmIGFkYXB0ZXIgaXMgZW5hYmxlZCAqLworCQkJcmVsZWFzZV9yZWdpb24gKGlvYWRkciwgMHgxMCk7CisJCQlnb3RvIG91dDI7CisJCX0KKwkJCisJCWlmIChkZWJ1ZyA9PSAweDEwKQkJCisJCQlwcmludGsoIkZvdW5kIG9uZVxuIik7CisKKwkJLyogR2V0IGlycSBmcm9tIGJvYXJkICovCisJCXN3aXRjaCAoaW5iKGlvYWRkciArIDB4Q0MwKSkgeworCQkJY2FzZSgweDEwKToKKwkJCQlpcnE9NTsKKwkJCQlicmVhazsKKwkJCWNhc2UoMHgyMCk6CisJCQkJaXJxPTk7CisJCQkJYnJlYWs7CisJCQljYXNlKDB4NDApOgorCQkJCWlycT0xMDsKKwkJCQlicmVhazsKKwkJCWNhc2UoMHg4MCk6CisJCQkJaXJxPTExOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlnb3RvIG91dDsKKwkJfSAgICAgICAgICAgICAgIAorCQkKKwkJCisJCS8qIFNldHVwIHRoZSBuZXdseSBmb3VuZCBlaXNhIGFkYXB0ZXIgKi8KKwkJcmMgPSBUTGFuX3Byb2JlMSggTlVMTCwgaW9hZGRyLCBpcnEsCisJCQkJCTEyLCBOVUxMKTsKKwkJY29udGludWU7CisJCQorCQlvdXQ6CisJCQlpZiAoZGVidWcgPT0gMHgxMCkKKwkJCQlwcmludGsoIk5vbmUgZm91bmRcbiIpOworCQkJY29udGludWU7CisKKwkJb3V0MjoJaWYgKGRlYnVnID09IDB4MTApCisJCQkJcHJpbnRrKCJDYXJkIGZvdW5kIGJ1dCBpdCBpcyBub3QgZW5hYmxlZCwgc2tpcHBpbmdcbiIpOworCQkJY29udGludWU7CisJCQorCX0KKworfSAvKiBUTGFuX0Vpc2FQcm9iZSAqLworCisJCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9Jbml0CisJICoKKwkgKglSZXR1cm5zOgorCSAqCQkwIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorCSAqCVBhcm1zOgorCSAqCQlkZXYJVGhlIHN0cnVjdHVyZSBvZiB0aGUgZGV2aWNlIHRvIGJlCisJICoJCQlpbml0J2VkLgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBjb21wbGV0ZXMgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZQorCSAqCWRldmljZSBzdHJ1Y3R1cmUgYW5kIGRyaXZlci4gIEl0IHJlc2VydmVzIHRoZSBJTworCSAqCWFkZHJlc3NlcywgYWxsb2NhdGVzIG1lbW9yeSBmb3IgdGhlIGxpc3RzIGFuZCBib3VuY2UKKwkgKglidWZmZXJzLCByZXRyaWV2ZXMgdGhlIE1BQyBhZGRyZXNzIGZyb20gdGhlIGVlcHJvbQorCSAqCWFuZCBhc3NpZ25lcyB0aGUgZGV2aWNlJ3MgbWV0aG9kcy4KKwkgKgkKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgVExhbl9Jbml0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlpbnQJCWRtYV9zaXplOworCWludCAJCWVycjsKKwlpbnQJCWk7CisJVExhblByaXZhdGVJbmZvCSpwcml2OworCisJcHJpdiA9IGRldi0+cHJpdjsKKwkKKwlpZiAoIXByaXYtPmlzX2Vpc2EpCS8qIEVJU0EgZGV2aWNlcyBoYXZlIGFscmVhZHkgcmVxdWVzdGVkIElPICovCisJCWlmICghcmVxdWVzdF9yZWdpb24oIGRldi0+YmFzZV9hZGRyLCAweDEwLCBUTGFuU2lnbmF0dXJlICkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiVExBTjogJXM6IElPIHBvcnQgcmVnaW9uIDB4JWx4IHNpemUgMHgleCBpbiB1c2UuXG4iLAorCQkJCWRldi0+bmFtZSwKKwkJCQlkZXYtPmJhc2VfYWRkciwKKwkJCQkweDEwICk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQorCWlmICggYmJ1ZiApIHsKKwkJZG1hX3NpemUgPSAoIFRMQU5fTlVNX1JYX0xJU1RTICsgVExBTl9OVU1fVFhfTElTVFMgKQorCSAgICAgICAgICAgKiAoIHNpemVvZihUTGFuTGlzdCkgKyBUTEFOX01BWF9GUkFNRV9TSVpFICk7CisJfSBlbHNlIHsKKwkJZG1hX3NpemUgPSAoIFRMQU5fTlVNX1JYX0xJU1RTICsgVExBTl9OVU1fVFhfTElTVFMgKQorCSAgICAgICAgICAgKiAoIHNpemVvZihUTGFuTGlzdCkgKTsKKwl9CisJcHJpdi0+ZG1hU3RvcmFnZSA9IGttYWxsb2MoZG1hX3NpemUsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwlpZiAoIHByaXYtPmRtYVN0b3JhZ2UgPT0gTlVMTCApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJUTEFOOiAgQ291bGQgbm90IGFsbG9jYXRlIGxpc3RzIGFuZCBidWZmZXJzIGZvciAlcy5cbiIsCisJCQlkZXYtPm5hbWUgKTsKKwkJcmVsZWFzZV9yZWdpb24oIGRldi0+YmFzZV9hZGRyLCAweDEwICk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoIHByaXYtPmRtYVN0b3JhZ2UsIDAsIGRtYV9zaXplICk7CisJcHJpdi0+cnhMaXN0ID0gKFRMYW5MaXN0ICopIAorCQkgICAgICAgKCAoICggKHUzMikgcHJpdi0+ZG1hU3RvcmFnZSApICsgNyApICYgMHhGRkZGRkZGOCApOworCXByaXYtPnR4TGlzdCA9IHByaXYtPnJ4TGlzdCArIFRMQU5fTlVNX1JYX0xJU1RTOworCWlmICggYmJ1ZiApIHsKKwkJcHJpdi0+cnhCdWZmZXIgPSAodTggKikgKCBwcml2LT50eExpc3QgKyBUTEFOX05VTV9UWF9MSVNUUyApOworCQlwcml2LT50eEJ1ZmZlciA9IHByaXYtPnJ4QnVmZmVyCisJCQkJICsgKCBUTEFOX05VTV9SWF9MSVNUUyAqIFRMQU5fTUFYX0ZSQU1FX1NJWkUgKTsKKwl9CisKKwllcnIgPSAwOworCWZvciAoIGkgPSAwOyAgaSA8IDYgOyBpKysgKQorCQllcnIgfD0gVExhbl9FZVJlYWRCeXRlKCBkZXYsCisJCQkJCSh1OCkgcHJpdi0+YWRhcHRlci0+YWRkck9mcyArIGksCisJCQkJCSh1OCAqKSAmZGV2LT5kZXZfYWRkcltpXSApOworCWlmICggZXJyICkgeworCQlwcmludGsoS0VSTl9FUlIgIlRMQU46ICVzOiBFcnJvciByZWFkaW5nIE1BQyBmcm9tIGVlcHJvbTogJWRcbiIsCisJCQlkZXYtPm5hbWUsCisJCQllcnIgKTsKKwl9CisJZGV2LT5hZGRyX2xlbiA9IDY7CisJCisJLyogRGV2aWNlIG1ldGhvZHMgKi8KKwlkZXYtPm9wZW4gPSAmVExhbl9PcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJlRMYW5fU3RhcnRUeDsKKwlkZXYtPnN0b3AgPSAmVExhbl9DbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9ICZUTGFuX0dldFN0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJlRMYW5fU2V0TXVsdGljYXN0TGlzdDsKKwlkZXYtPmRvX2lvY3RsID0gJlRMYW5faW9jdGw7CisJZGV2LT50eF90aW1lb3V0ID0gJlRMYW5fdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKworCXJldHVybiAwOworCit9IC8qIFRMYW5fSW5pdCAqLworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fT3BlbgorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJMCBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKwkgKglQYXJtczoKKwkgKgkJZGV2CVN0cnVjdHVyZSBvZiBkZXZpY2UgdG8gYmUgb3BlbmVkLgorCSAqCisJICoJVGhpcyByb3V0aW5lIHB1dHMgdGhlIGRyaXZlciBhbmQgVExBTiBhZGFwdGVyIGluIGEKKwkgKglzdGF0ZSB3aGVyZSBpdCBpcyByZWFkeSB0byBzZW5kIGFuZCByZWNlaXZlIHBhY2tldHMuCisJICoJSXQgYWxsb2NhdGVzIHRoZSBJUlEsIHJlc2V0cyBhbmQgYnJpbmdzIHRoZSBhZGFwdGVyCisJICoJb3V0IG9mIHJlc2V0LCBhbmQgYWxsb3dzIGludGVycnVwdHMuICBJdCBhbHNvIGRlbGF5cworCSAqCXRoZSBzdGFydHVwIGZvciBhdXRvbmVnb3RpYXRpb24gb3Igc2VuZHMgYSBSeCBHTworCSAqCWNvbW1hbmQgdG8gdGhlIGFkYXB0ZXIsIGFzIGFwcHJvcHJpYXRlLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IFRMYW5fT3Blbiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJVExhblByaXZhdGVJbmZvCSpwcml2ID0gZGV2LT5wcml2OworCWludAkJZXJyOworCQorCXByaXYtPnRsYW5SZXYgPSBUTGFuX0Rpb1JlYWQ4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ERUZfUkVWSVNJT04gKTsKKwllcnIgPSByZXF1ZXN0X2lycSggZGV2LT5pcnEsIFRMYW5fSGFuZGxlSW50ZXJydXB0LCBTQV9TSElSUSwgVExhblNpZ25hdHVyZSwgZGV2ICk7CisJCisJaWYgKCBlcnIgKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVExBTjogIENhbm5vdCBvcGVuICVzIGJlY2F1c2UgSVJRICVkIGlzIGFscmVhZHkgaW4gdXNlLlxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSApOworCQlyZXR1cm4gZXJyOworCX0KKwkKKwlpbml0X3RpbWVyKCZwcml2LT50aW1lcik7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkKKwkvKiBOT1RFOiBJdCBtaWdodCBub3QgYmUgbmVjZXNzYXJ5IHRvIHJlYWQgdGhlIHN0YXRzIGJlZm9yZSBhCisJCQkgcmVzZXQgaWYgeW91IGRvbid0IGNhcmUgd2hhdCB0aGUgdmFsdWVzIGFyZS4KKwkqLworCVRMYW5fUmVzZXRMaXN0cyggZGV2ICk7CisJVExhbl9SZWFkQW5kQ2xlYXJTdGF0cyggZGV2LCBUTEFOX0lHTk9SRSApOworCVRMYW5fUmVzZXRBZGFwdGVyKCBkZXYgKTsKKworCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICIlczogT3BlbmVkLiAgVExBTiBDaGlwIFJldjogJXhcbiIsIGRldi0+bmFtZSwgcHJpdi0+dGxhblJldiApOworCisJcmV0dXJuIDA7CisKK30gLyogVExhbl9PcGVuICovCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX2lvY3RsCisJICoJCisJICoJUmV0dXJuczoKKwkgKgkJMCBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZQorCSAqCVBhcmFtczoKKwkgKgkJZGV2CXN0cnVjdHVyZSBvZiBkZXZpY2UgdG8gcmVjZWl2ZSBpb2N0bC4KKwkgKgkJCisJICoJCXJxCWlmcmVxIHN0cnVjdHVyZSB0byBob2xkIHVzZXJzcGFjZSBkYXRhLgorCSAqCisJICoJCWNtZAlpb2N0bCBjb21tYW5kLgorCSAqCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBUTGFuX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJVExhblByaXZhdGVJbmZvICpwcml2ID0gZGV2LT5wcml2OworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKikmcnEtPmlmcl9kYXRhOworCXUzMiBwaHkgICA9IHByaXYtPnBoeVtwcml2LT5waHlOdW1dOworCQorCWlmICghcHJpdi0+cGh5T25saW5lKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXN3aXRjaChjbWQpIHsKKwljYXNlIFNJT0NHTUlJUEhZOgkJLyogR2V0IGFkZHJlc3Mgb2YgTUlJIFBIWSBpbiB1c2UuICovCisJY2FzZSBTSU9DREVWUFJJVkFURToJCS8qIGZvciBiaW5hcnkgY29tcGF0LCByZW1vdmUgaW4gMi41ICovCisJCQlkYXRhLT5waHlfaWQgPSBwaHk7CisKKwljYXNlIFNJT0NHTUlJUkVHOgkJLyogUmVhZCBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCWNhc2UgU0lPQ0RFVlBSSVZBVEUrMToJCS8qIGZvciBiaW5hcnkgY29tcGF0LCByZW1vdmUgaW4gMi41ICovCisJCQlUTGFuX01paVJlYWRSZWcoZGV2LCBkYXRhLT5waHlfaWQgJiAweDFmLCBkYXRhLT5yZWdfbnVtICYgMHgxZiwgJmRhdGEtPnZhbF9vdXQpOworCQkJcmV0dXJuIDA7CisJCQorCisJY2FzZSBTSU9DU01JSVJFRzoJCS8qIFdyaXRlIE1JSSBQSFkgcmVnaXN0ZXIuICovCisJY2FzZSBTSU9DREVWUFJJVkFURSsyOgkJLyogZm9yIGJpbmFyeSBjb21wYXQsIHJlbW92ZSBpbiAyLjUgKi8KKwkJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJVExhbl9NaWlXcml0ZVJlZyhkZXYsIGRhdGEtPnBoeV9pZCAmIDB4MWYsIGRhdGEtPnJlZ19udW0gJiAweDFmLCBkYXRhLT52YWxfaW4pOworCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfSAvKiB0bGFuX2lvY3RsICovCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogCVRMYW5fdHhfdGltZW91dAorCSAqCisJICogCVJldHVybnM6IG5vdGhpbmcKKwkgKgorCSAqIAlQYXJhbXM6CisJICogCQlkZXYJc3RydWN0dXJlIG9mIGRldmljZSB3aGljaCB0aW1lZCBvdXQgCisJICogCQkJZHVyaW5nIHRyYW5zbWl0LgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBUTGFuX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkKKwlUTEFOX0RCRyggVExBTl9ERUJVR19HTlJMLCAiJXM6IFRyYW5zbWl0IHRpbWVkIG91dC5cbiIsIGRldi0+bmFtZSk7CisJCisJLyogT2sgc28gd2UgdGltZWQgb3V0LCBsZXRzIHNlZSB3aGF0IHdlIGNhbiBkbyBhYm91dCBpdC4uLiovCisJVExhbl9GcmVlTGlzdHMoIGRldiApOworCVRMYW5fUmVzZXRMaXN0cyggZGV2ICk7CQkKKwlUTGFuX1JlYWRBbmRDbGVhclN0YXRzKCBkZXYsIFRMQU5fSUdOT1JFICk7CisJVExhbl9SZXNldEFkYXB0ZXIoIGRldiApOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3dha2VfcXVldWUoIGRldiApOwkKKworfQorCQorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fU3RhcnRUeAorCSAqICAKKwkgKglSZXR1cm5zOgorCSAqCQkwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGZhaWx1cmUuCisJICoJUGFybXM6CisJICoJCXNrYglBIHBvaW50ZXIgdG8gdGhlIHNrX2J1ZmYgY29udGFpbmluZyB0aGUKKwkgKgkJCWZyYW1lIHRvIGJlIHNlbnQuCisJICoJCWRldglUaGUgZGV2aWNlIHRvIHNlbmQgdGhlIGRhdGEgb24uCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIGFkZHMgYSBmcmFtZSB0byB0aGUgVHggbGlzdCB0byBiZSBzZW50CisJICoJQVNBUC4gIEZpcnN0IGl0CXZlcmlmaWVzIHRoYXQgdGhlIGFkYXB0ZXIgaXMgcmVhZHkgYW5kCisJICoJdGhlcmUgaXMgcm9vbSBpbiB0aGUgcXVldWUuICBUaGVuIGl0IHNldHMgdXAgdGhlIG5leHQKKwkgKglhdmFpbGFibGUgbGlzdCwgY29waWVzIHRoZSBmcmFtZSB0byB0aGUJY29ycmVzcG9uZGluZworCSAqCWJ1ZmZlci4gIElmIHRoZSBhZGFwdGVyIFR4IGNoYW5uZWwgaXMgaWRsZSwgaXQgZ2l2ZXMKKwkgKgl0aGUgYWRhcHRlciBhIFR4IEdvIGNvbW1hbmQgb24gdGhlIGxpc3QsIG90aGVyd2lzZSBpdAorCSAqCXNldHMgdGhlIGZvcndhcmQgYWRkcmVzcyBvZiB0aGUgcHJldmlvdXMgbGlzdCB0byBwb2ludAorCSAqCXRvIHRoaXMgb25lLiAgVGhlbiBpdCBmcmVlcyB0aGUgc2tfYnVmZi4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBUTGFuX1N0YXJ0VHgoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IGRldi0+cHJpdjsKKwlUTGFuTGlzdAkqdGFpbF9saXN0OworCXU4CQkqdGFpbF9idWZmZXI7CisJaW50CQlwYWQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCWlmICggISBwcml2LT5waHlPbmxpbmUgKSB7CisJCVRMQU5fREJHKCBUTEFOX0RFQlVHX1RYLCAiVFJBTlNNSVQ6ICAlcyBQSFkgaXMgbm90IHJlYWR5XG4iLCBkZXYtPm5hbWUgKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdGFpbF9saXN0ID0gcHJpdi0+dHhMaXN0ICsgcHJpdi0+dHhUYWlsOworCQorCWlmICggdGFpbF9saXN0LT5jU3RhdCAhPSBUTEFOX0NTVEFUX1VOVVNFRCApIHsKKwkJVExBTl9EQkcoIFRMQU5fREVCVUdfVFgsICJUUkFOU01JVDogICVzIGlzIGJ1c3kgKEhlYWQ9JWQgVGFpbD0lZClcbiIsIGRldi0+bmFtZSwgcHJpdi0+dHhIZWFkLCBwcml2LT50eFRhaWwgKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlwcml2LT50eEJ1c3lDb3VudCsrOworCQlyZXR1cm4gMTsKKwl9CisKKwl0YWlsX2xpc3QtPmZvcndhcmQgPSAwOworCisJaWYgKCBiYnVmICkgeworCQl0YWlsX2J1ZmZlciA9IHByaXYtPnR4QnVmZmVyICsgKCBwcml2LT50eFRhaWwgKiBUTEFOX01BWF9GUkFNRV9TSVpFICk7CisJCW1lbWNweSggdGFpbF9idWZmZXIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4gKTsKKwl9IGVsc2UgeworCQl0YWlsX2xpc3QtPmJ1ZmZlclswXS5hZGRyZXNzID0gdmlydF90b19idXMoIHNrYi0+ZGF0YSApOworCQl0YWlsX2xpc3QtPmJ1ZmZlcls5XS5hZGRyZXNzID0gKHUzMikgc2tiOworCX0KKworCXBhZCA9IFRMQU5fTUlOX0ZSQU1FX1NJWkUgLSBza2ItPmxlbjsKKworCWlmICggcGFkID4gMCApIHsKKwkJdGFpbF9saXN0LT5mcmFtZVNpemUgPSAodTE2KSBza2ItPmxlbiArIHBhZDsKKwkJdGFpbF9saXN0LT5idWZmZXJbMF0uY291bnQgPSAodTMyKSBza2ItPmxlbjsKKwkJdGFpbF9saXN0LT5idWZmZXJbMV0uY291bnQgPSBUTEFOX0xBU1RfQlVGRkVSIHwgKHUzMikgcGFkOworCQl0YWlsX2xpc3QtPmJ1ZmZlclsxXS5hZGRyZXNzID0gdmlydF90b19idXMoIFRMYW5QYWRCdWZmZXIgKTsKKwl9IGVsc2UgeworCQl0YWlsX2xpc3QtPmZyYW1lU2l6ZSA9ICh1MTYpIHNrYi0+bGVuOworCQl0YWlsX2xpc3QtPmJ1ZmZlclswXS5jb3VudCA9IFRMQU5fTEFTVF9CVUZGRVIgfCAodTMyKSBza2ItPmxlbjsKKwkJdGFpbF9saXN0LT5idWZmZXJbMV0uY291bnQgPSAwOworCQl0YWlsX2xpc3QtPmJ1ZmZlclsxXS5hZGRyZXNzID0gMDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXRhaWxfbGlzdC0+Y1N0YXQgPSBUTEFOX0NTVEFUX1JFQURZOworCWlmICggISBwcml2LT50eEluUHJvZ3Jlc3MgKSB7CisJCXByaXYtPnR4SW5Qcm9ncmVzcyA9IDE7CisJCVRMQU5fREJHKCBUTEFOX0RFQlVHX1RYLCAiVFJBTlNNSVQ6ICBTdGFydGluZyBUWCBvbiBidWZmZXIgJWRcbiIsIHByaXYtPnR4VGFpbCApOworCQlvdXRsKCB2aXJ0X3RvX2J1cyggdGFpbF9saXN0ICksIGRldi0+YmFzZV9hZGRyICsgVExBTl9DSF9QQVJNICk7CisJCW91dGwoIFRMQU5fSENfR08sIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCApOworCX0gZWxzZSB7CisJCVRMQU5fREJHKCBUTEFOX0RFQlVHX1RYLCAiVFJBTlNNSVQ6ICBBZGRpbmcgYnVmZmVyICVkIHRvIFRYIGNoYW5uZWxcbiIsIHByaXYtPnR4VGFpbCApOworCQlpZiAoIHByaXYtPnR4VGFpbCA9PSAwICkgeworCQkJKCBwcml2LT50eExpc3QgKyAoIFRMQU5fTlVNX1RYX0xJU1RTIC0gMSApICktPmZvcndhcmQgPSB2aXJ0X3RvX2J1cyggdGFpbF9saXN0ICk7CisJCX0gZWxzZSB7CisJCQkoIHByaXYtPnR4TGlzdCArICggcHJpdi0+dHhUYWlsIC0gMSApICktPmZvcndhcmQgPSB2aXJ0X3RvX2J1cyggdGFpbF9saXN0ICk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJQ0lSQ19JTkMoIHByaXYtPnR4VGFpbCwgVExBTl9OVU1fVFhfTElTVFMgKTsKKworCWlmICggYmJ1ZiApCisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQorCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXJldHVybiAwOworCit9IC8qIFRMYW5fU3RhcnRUeCAqLworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fSGFuZGxlSW50ZXJydXB0CisJICogIAorCSAqCVJldHVybnM6CQorCSAqCQlOb3RoaW5nCisJICoJUGFybXM6CisJICoJCWlycQlUaGUgbGluZSBvbiB3aGljaCB0aGUgaW50ZXJydXB0CisJICoJCQlvY2N1cnJlZC4KKwkgKgkJZGV2X2lkCUEgcG9pbnRlciB0byB0aGUgZGV2aWNlIGFzc2lnbmVkIHRvCisJICoJCQl0aGlzIGlycSBsaW5lLgorCSAqCQlyZWdzCT8/PworCSAqCisJICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGFuIGludGVycnVwdCBnZW5lcmF0ZWQgYnkgaXRzCisJICoJYXNzaWduZWQgVExBTiBhZGFwdGVyLiAgVGhlIGZ1bmN0aW9uIGRlYWN0aXZhdGVzCisJICoJaW50ZXJydXB0cyBvbiBpdHMgYWRhcHRlciwgcmVjb3JkcyB0aGUgdHlwZSBvZgorCSAqCWludGVycnVwdCwgZXhlY3V0ZXMgdGhlIGFwcHJvcHJpYXRlIHN1YmhhbmRsZXIsIGFuZAorCSAqCWFja25vd2RnZXMgdGhlIGludGVycnVwdCB0byB0aGUgYWRhcHRlciAodGh1cworCSAqCXJlLWVuYWJsaW5nIGFkYXB0ZXIgaW50ZXJydXB0cy4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgVExhbl9IYW5kbGVJbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1MzIJCWFjazsKKwlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OworCXUzMgkJaG9zdF9jbWQ7CisJdTE2CQlob3N0X2ludDsKKwlpbnQJCXR5cGU7CisJVExhblByaXZhdGVJbmZvICpwcml2OworCisJZGV2ID0gZGV2X2lkOworCXByaXYgPSBkZXYtPnByaXY7CisKKwlzcGluX2xvY2soJnByaXYtPmxvY2spOworCisJaG9zdF9pbnQgPSBpbncoIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0lOVCApOworCW91dHcoIGhvc3RfaW50LCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9JTlQgKTsKKworCXR5cGUgPSAoIGhvc3RfaW50ICYgVExBTl9ISV9JVF9NQVNLICkgPj4gMjsKKworCWFjayA9IFRMYW5JbnRWZWN0b3JbdHlwZV0oIGRldiwgaG9zdF9pbnQgKTsKKworCWlmICggYWNrICkgeworCQlob3N0X2NtZCA9IFRMQU5fSENfQUNLIHwgYWNrIHwgKCB0eXBlIDw8IDE4ICk7CisJCW91dGwoIGhvc3RfY21kLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQgKTsKKwl9CisKKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisKK30gLyogVExhbl9IYW5kbGVJbnRlcnJ1cHRzICovCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9DbG9zZQorCSAqICAKKwkgKiAJUmV0dXJuczoKKwkgKgkJQW4gZXJyb3IgY29kZS4KKwkgKglQYXJtczoKKwkgKgkJZGV2CVRoZSBkZXZpY2Ugc3RydWN0dXJlIG9mIHRoZSBkZXZpY2UgdG8KKwkgKgkJCWNsb3NlLgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBzaHV0cyBkb3duIHRoZSBhZGFwdGVyLiAgSXQgcmVjb3JkcyBhbnkKKwkgKglzdGF0cywgcHV0cyB0aGUgYWRhcHRlciBpbnRvIHJlc2V0IHN0YXRlLCBkZWFjdGl2YXRlcworCSAqCWl0cyB0aW1lIGFzIG5lZWRlZCwgYW5kCWZyZWVzIHRoZSBpcnEgaXQgaXMgdXNpbmcuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgVExhbl9DbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IGRldi0+cHJpdjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlwcml2LT5uZWdfYmVfdmVyYm9zZSA9IDA7CisKKwlUTGFuX1JlYWRBbmRDbGVhclN0YXRzKCBkZXYsIFRMQU5fUkVDT1JEICk7CisJb3V0bCggVExBTl9IQ19BRF9SU1QsIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCApOworCWlmICggcHJpdi0+dGltZXIuZnVuY3Rpb24gIT0gTlVMTCApIHsKKwkJZGVsX3RpbWVyX3N5bmMoICZwcml2LT50aW1lciApOworCQlwcml2LT50aW1lci5mdW5jdGlvbiA9IE5VTEw7CisJfQorCQorCWZyZWVfaXJxKCBkZXYtPmlycSwgZGV2ICk7CisJVExhbl9GcmVlTGlzdHMoIGRldiApOworCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICJEZXZpY2UgJXMgY2xvc2VkLlxuIiwgZGV2LT5uYW1lICk7CisKKwlyZXR1cm4gMDsKKworfSAvKiBUTGFuX0Nsb3NlICovCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9HZXRTdGF0cworCSAqICAKKwkgKglSZXR1cm5zOgorCSAqCQlBIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHN0YXRpc3RpY3Mgc3RydWN0dXJlLgorCSAqCVBhcm1zOgorCSAqCQlkZXYJVGhlIGRldmljZSBzdHJ1Y3R1cmUgdG8gcmV0dXJuIHRoZQorCSAqCQkJc3RhdHMgZm9yLgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBkZXZpY2VzIHN0YXRpc3RpY3MgYnkgcmVhZGluZworCSAqCXRoZSBUTEFOIGNoaXAncyBvbmJvYXJkIHJlZ2lzdGVycy4gIFRoZW4gaXQgcmV0dXJucyB0aGUKKwkgKglhZGRyZXNzIG9mIHRoZSBzdGF0aXN0aWNzIHN0cnVjdHVyZS4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpUTGFuX0dldFN0YXRzKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBkZXYtPnByaXY7CisJaW50IGk7CisKKwkvKiBTaG91bGQgb25seSByZWFkIHN0YXRzIGlmIG9wZW4gPyAqLworCVRMYW5fUmVhZEFuZENsZWFyU3RhdHMoIGRldiwgVExBTl9SRUNPUkQgKTsKKworCVRMQU5fREJHKCBUTEFOX0RFQlVHX1JYLCAiUkVDRUlWRTogICVzIEVPQyBjb3VudCA9ICVkXG4iLCBkZXYtPm5hbWUsIHByaXYtPnJ4RW9jQ291bnQgKTsKKwlUTEFOX0RCRyggVExBTl9ERUJVR19UWCwgIlRSQU5TTUlUOiAgJXMgQnVzeSBjb3VudCA9ICVkXG4iLCBkZXYtPm5hbWUsIHByaXYtPnR4QnVzeUNvdW50ICk7CisJaWYgKCBkZWJ1ZyAmIFRMQU5fREVCVUdfR05STCApIHsKKwkJVExhbl9QcmludERpbyggZGV2LT5iYXNlX2FkZHIgKTsKKwkJVExhbl9QaHlQcmludCggZGV2ICk7CQkKKwl9CisJaWYgKCBkZWJ1ZyAmIFRMQU5fREVCVUdfTElTVCApIHsKKwkJZm9yICggaSA9IDA7IGkgPCBUTEFOX05VTV9SWF9MSVNUUzsgaSsrICkKKwkJCVRMYW5fUHJpbnRMaXN0KCBwcml2LT5yeExpc3QgKyBpLCAiUlgiLCBpICk7CisJCWZvciAoIGkgPSAwOyBpIDwgVExBTl9OVU1fVFhfTElTVFM7IGkrKyApCisJCQlUTGFuX1ByaW50TGlzdCggcHJpdi0+dHhMaXN0ICsgaSwgIlRYIiwgaSApOworCX0KKwkKKwlyZXR1cm4gKCAmKCAoVExhblByaXZhdGVJbmZvICopIGRldi0+cHJpdiApLT5zdGF0cyApOworCit9IC8qIFRMYW5fR2V0U3RhdHMgKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX1NldE11bHRpY2FzdExpc3QKKwkgKiAgCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQlkZXYJVGhlIGRldmljZSBzdHJ1Y3R1cmUgdG8gc2V0IHRoZQorCSAqCQkJbXVsdGljYXN0IGxpc3QgZm9yLgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBUTEFOIGFkYXB0b3IgdG8gdmFyaW91cyByZWNlaXZlCisJICoJbW9kZXMuICBJZiB0aGUgSUZGX1BST01JU0MgZmxhZyBpcyBzZXQsIHByb21pc2N1b3VzCisJICoJbW9kZSBpcyBhY2l0dmlhdGVkLiAgT3RoZXJ3aXNlLAlwcm9taXNjdW91cyBtb2RlIGlzCisJICoJdHVybmVkIG9mZi4gIElmIHRoZSBJRkZfQUxMTVVMVEkgZmxhZyBpcyBzZXQsIHRoZW4KKwkgKgl0aGUgaGFzaCB0YWJsZSBpcyBzZXQgdG8gcmVjZWl2ZSBhbGwgZ3JvdXAgYWRkcmVzc2VzLgorCSAqCU90aGVyd2lzZSwgdGhlIGZpcnN0IHRocmVlIG11bHRpY2FzdCBhZGRyZXNzZXMgYXJlCisJICoJc3RvcmVkIGluIEFSRUdfMS0zLCBhbmQgdGhlIHJlc3QgYXJlIHNlbGVjdGVkIHZpYSB0aGUKKwkgKgloYXNoIHRhYmxlLCBhcyBuZWNlc3NhcnkuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIFRMYW5fU2V0TXVsdGljYXN0TGlzdCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CQorCXN0cnVjdCBkZXZfbWNfbGlzdAkqZG1pID0gZGV2LT5tY19saXN0OworCXUzMgkJCWhhc2gxID0gMDsKKwl1MzIJCQloYXNoMiA9IDA7CisJaW50CQkJaTsKKwl1MzIJCQlvZmZzZXQ7CisJdTgJCQl0bXA7CisKKwlpZiAoIGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyApIHsKKwkJdG1wID0gVExhbl9EaW9SZWFkOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX0NNRCApOworCQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX0NNRCwgdG1wIHwgVExBTl9ORVRfQ01EX0NBRiApOworCX0gZWxzZSB7CisJCXRtcCA9IFRMYW5fRGlvUmVhZDgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9DTUQgKTsKKwkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9DTUQsIHRtcCAmIH5UTEFOX05FVF9DTURfQ0FGICk7CisJCWlmICggZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSApIHsKKwkJCWZvciAoIGkgPSAwOyBpIDwgMzsgaSsrICkgCisJCQkJVExhbl9TZXRNYWMoIGRldiwgaSArIDEsIE5VTEwgKTsKKwkJCVRMYW5fRGlvV3JpdGUzMiggZGV2LT5iYXNlX2FkZHIsIFRMQU5fSEFTSF8xLCAweEZGRkZGRkZGICk7CisJCQlUTGFuX0Rpb1dyaXRlMzIoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0hBU0hfMiwgMHhGRkZGRkZGRiApOworCQl9IGVsc2UgeworCQkJZm9yICggaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKysgKSB7CisJCQkJaWYgKCBpIDwgMyApIHsKKwkJCQkJVExhbl9TZXRNYWMoIGRldiwgaSArIDEsIChjaGFyICopICZkbWktPmRtaV9hZGRyICk7CisJCQkJfSBlbHNlIHsKKwkJCQkJb2Zmc2V0ID0gVExhbl9IYXNoRnVuYyggKHU4ICopICZkbWktPmRtaV9hZGRyICk7CisJCQkJCWlmICggb2Zmc2V0IDwgMzIgKSAKKwkJCQkJCWhhc2gxIHw9ICggMSA8PCBvZmZzZXQgKTsKKwkJCQkJZWxzZQorCQkJCQkJaGFzaDIgfD0gKCAxIDw8ICggb2Zmc2V0IC0gMzIgKSApOworCQkJCX0KKwkJCQlkbWkgPSBkbWktPm5leHQ7CisJCQl9CisJCQlmb3IgKCA7IGkgPCAzOyBpKysgKSAKKwkJCQlUTGFuX1NldE1hYyggZGV2LCBpICsgMSwgTlVMTCApOworCQkJVExhbl9EaW9Xcml0ZTMyKCBkZXYtPmJhc2VfYWRkciwgVExBTl9IQVNIXzEsIGhhc2gxICk7CisJCQlUTGFuX0Rpb1dyaXRlMzIoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0hBU0hfMiwgaGFzaDIgKTsKKwkJfQorCX0KKworfSAvKiBUTGFuX1NldE11bHRpY2FzdExpc3QgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICBUaHVuZGVyTEFOIERyaXZlciBJbnRlcnJ1cHQgVmVjdG9ycyBhbmQgVGFibGUKKworCVBsZWFzZSBzZWUgQ2hhcC4gNCwgIkludGVycnVwdCBIYW5kbGluZyIgb2YgdGhlICJUaHVuZGVyTEFOCisJUHJvZ3JhbW1lcidzIEd1aWRlIiBmb3IgbW9yZSBpbmZvcm1hdGlvbnMgb24gaGFuZGxpbmcgaW50ZXJydXB0cworCWdlbmVyYXRlZCBieSBUTEFOIGJhc2VkIGFkYXB0ZXJzLiAgCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9IYW5kbGVJbnZhbGlkCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQkwCisJICoJUGFybXM6CisJICoJCWRldgkJRGV2aWNlIGFzc2lnbmVkIHRoZSBJUlEgdGhhdCB3YXMKKwkgKgkJCQlyYWlzZWQuCisJICoJCWhvc3RfaW50CVRoZSBjb250ZW50cyBvZiB0aGUgSE9TVF9JTlQKKwkgKgkJCQlwb3J0LgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGludmFsaWQgaW50ZXJydXB0cy4gIFRoaXMgc2hvdWxkCisJICoJbmV2ZXIgaGFwcGVuIHVubGVzcyBzb21lIG90aGVyIGFkYXB0ZXIgaXMgdHJ5aW5nIHRvIHVzZQorCSAqCXRoZSBJUlEgbGluZSBhc3NpZ25lZCB0byB0aGUgZGV2aWNlLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1MzIgVExhbl9IYW5kbGVJbnZhbGlkKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgaG9zdF9pbnQgKQoreworCS8qIHByaW50ayggIlRMQU46ICBJbnZhbGlkIGludGVycnVwdCBvbiAlcy5cbiIsIGRldi0+bmFtZSApOyAqLworCXJldHVybiAwOworCit9IC8qIFRMYW5fSGFuZGxlSW52YWxpZCAqLworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fSGFuZGxlVHhFT0YKKwkgKgorCSAqCVJldHVybnM6CisJICoJCTEKKwkgKglQYXJtczoKKwkgKgkJZGV2CQlEZXZpY2UgYXNzaWduZWQgdGhlIElSUSB0aGF0IHdhcworCSAqCQkJCXJhaXNlZC4KKwkgKgkJaG9zdF9pbnQJVGhlIGNvbnRlbnRzIG9mIHRoZSBIT1NUX0lOVAorCSAqCQkJCXBvcnQuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgVHggRU9GIGludGVycnVwdHMgd2hpY2ggYXJlIHJhaXNlZAorCSAqCWJ5IHRoZSBhZGFwdGVyIHdoZW4gaXQgaGFzIGNvbXBsZXRlZCBzZW5kaW5nIHRoZQorCSAqCWNvbnRlbnRzIG9mIGEgYnVmZmVyLiAgSWYgZGV0ZW1pbmVzIHdoaWNoIGxpc3QvYnVmZmVyCisJICoJd2FzIGNvbXBsZXRlZCBhbmQgcmVzZXRzIGl0LiAgSWYgdGhlIGJ1ZmZlciB3YXMgdGhlIGxhc3QKKwkgKglpbiB0aGUgY2hhbm5lbCAoRU9DKSwgdGhlbiB0aGUgZnVuY3Rpb24gY2hlY2tzIHRvIHNlZSBpZgorCSAqCWFub3RoZXIgYnVmZmVyIGlzIHJlYWR5IHRvIHNlbmQsIGFuZCBpZiBzbywgc2VuZHMgYSBUeAorCSAqCUdvIGNvbW1hbmQuICBGaW5hbGx5LCB0aGUgZHJpdmVyIGFjdGl2YXRlcy9jb250aW51ZXMgdGhlCisJICoJYWN0aXZpdHkgTEVELgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1MzIgVExhbl9IYW5kbGVUeEVPRiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGhvc3RfaW50ICkKK3sKKwlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBkZXYtPnByaXY7CisJaW50CQllb2MgPSAwOworCVRMYW5MaXN0CSpoZWFkX2xpc3Q7CisJdTMyCQlhY2sgPSAwOworCXUxNgkJdG1wQ1N0YXQ7CisJCisJVExBTl9EQkcoIFRMQU5fREVCVUdfVFgsICJUUkFOU01JVDogIEhhbmRsaW5nIFRYIEVPRiAoSGVhZD0lZCBUYWlsPSVkKVxuIiwgcHJpdi0+dHhIZWFkLCBwcml2LT50eFRhaWwgKTsKKwloZWFkX2xpc3QgPSBwcml2LT50eExpc3QgKyBwcml2LT50eEhlYWQ7CisKKwl3aGlsZSAoKCh0bXBDU3RhdCA9IGhlYWRfbGlzdC0+Y1N0YXQgKSAmIFRMQU5fQ1NUQVRfRlJNX0NNUCkgJiYgKGFjayA8IDI1NSkpIHsKKwkJYWNrKys7CisJCWlmICggISBiYnVmICkgeworCQkJZGV2X2tmcmVlX3NrYl9hbnkoIChzdHJ1Y3Qgc2tfYnVmZiAqKSBoZWFkX2xpc3QtPmJ1ZmZlcls5XS5hZGRyZXNzICk7CisJCQloZWFkX2xpc3QtPmJ1ZmZlcls5XS5hZGRyZXNzID0gMDsKKwkJfQorCQorCQlpZiAoIHRtcENTdGF0ICYgVExBTl9DU1RBVF9FT0MgKQorCQkJZW9jID0gMTsKKwkJCQorCQlwcml2LT5zdGF0cy50eF9ieXRlcyArPSBoZWFkX2xpc3QtPmZyYW1lU2l6ZTsKKworCQloZWFkX2xpc3QtPmNTdGF0ID0gVExBTl9DU1RBVF9VTlVTRUQ7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CQkKKwkJQ0lSQ19JTkMoIHByaXYtPnR4SGVhZCwgVExBTl9OVU1fVFhfTElTVFMgKTsgCisJCWhlYWRfbGlzdCA9IHByaXYtPnR4TGlzdCArIHByaXYtPnR4SGVhZDsKKwl9CisKKwlpZiAoIWFjaykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVExBTjogUmVjZWl2ZWQgaW50ZXJydXB0IGZvciB1bmNvbXBsZXRlZCBUWCBmcmFtZS5cbiIpOworCQorCWlmICggZW9jICkgeworCQlUTEFOX0RCRyggVExBTl9ERUJVR19UWCwgIlRSQU5TTUlUOiAgSGFuZGxpbmcgVFggRU9DIChIZWFkPSVkIFRhaWw9JWQpXG4iLCBwcml2LT50eEhlYWQsIHByaXYtPnR4VGFpbCApOworCQloZWFkX2xpc3QgPSBwcml2LT50eExpc3QgKyBwcml2LT50eEhlYWQ7CisJCWlmICggKCBoZWFkX2xpc3QtPmNTdGF0ICYgVExBTl9DU1RBVF9SRUFEWSApID09IFRMQU5fQ1NUQVRfUkVBRFkgKSB7CisJCQlvdXRsKCB2aXJ0X3RvX2J1cyggaGVhZF9saXN0ICksIGRldi0+YmFzZV9hZGRyICsgVExBTl9DSF9QQVJNICk7CisJCQlhY2sgfD0gVExBTl9IQ19HTzsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPnR4SW5Qcm9ncmVzcyA9IDA7CisJCX0KKwl9CisJCisJaWYgKCBwcml2LT5hZGFwdGVyLT5mbGFncyAmIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQgKSB7CisJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9MRURfUkVHLCBUTEFOX0xFRF9MSU5LIHwgVExBTl9MRURfQUNUICk7CisJCWlmICggcHJpdi0+dGltZXIuZnVuY3Rpb24gPT0gTlVMTCApIHsKKwkJCSBwcml2LT50aW1lci5mdW5jdGlvbiA9ICZUTGFuX1RpbWVyOworCQkJIHByaXYtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OworCQkJIHByaXYtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgVExBTl9USU1FUl9BQ1RfREVMQVk7CisJCQkgcHJpdi0+dGltZXJTZXRBdCA9IGppZmZpZXM7CisJCQkgcHJpdi0+dGltZXJUeXBlID0gVExBTl9USU1FUl9BQ1RJVklUWTsKKwkJCSBhZGRfdGltZXIoJnByaXYtPnRpbWVyKTsKKwkJfSBlbHNlIGlmICggcHJpdi0+dGltZXJUeXBlID09IFRMQU5fVElNRVJfQUNUSVZJVFkgKSB7CisJCQlwcml2LT50aW1lclNldEF0ID0gamlmZmllczsKKwkJfQorCX0KKworCXJldHVybiBhY2s7CisKK30gLyogVExhbl9IYW5kbGVUeEVPRiAqLworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fSGFuZGxlU3RhdE92ZXJmbG93CisJICoKKwkgKglSZXR1cm5zOgorCSAqCQkxCisJICoJUGFybXM6CisJICoJCWRldgkJRGV2aWNlIGFzc2lnbmVkIHRoZSBJUlEgdGhhdCB3YXMKKwkgKgkJCQlyYWlzZWQuCisJICoJCWhvc3RfaW50CVRoZSBjb250ZW50cyBvZiB0aGUgSE9TVF9JTlQKKwkgKgkJCQlwb3J0LgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBTdGF0aXN0aWNzIE92ZXJmbG93IGludGVycnVwdAorCSAqCXdoaWNoIG1lYW5zIHRoYXQgb25lIG9yIG1vcmUgb2YgdGhlIFRMQU4gc3RhdGlzdGljcworCSAqCXJlZ2lzdGVycyBoYXMgcmVhY2hlZCAxLzIgY2FwYWNpdHkgYW5kIG5lZWRzIHRvIGJlIHJlYWQuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3UzMiBUTGFuX0hhbmRsZVN0YXRPdmVyZmxvdyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGhvc3RfaW50ICkKK3sKKwlUTGFuX1JlYWRBbmRDbGVhclN0YXRzKCBkZXYsIFRMQU5fUkVDT1JEICk7CisKKwlyZXR1cm4gMTsKKworfSAvKiBUTGFuX0hhbmRsZVN0YXRPdmVyZmxvdyAqLworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fSGFuZGxlUnhFT0YKKwkgKgorCSAqCVJldHVybnM6CisJICoJCTEKKwkgKglQYXJtczoKKwkgKgkJZGV2CQlEZXZpY2UgYXNzaWduZWQgdGhlIElSUSB0aGF0IHdhcworCSAqCQkJCXJhaXNlZC4KKwkgKgkJaG9zdF9pbnQJVGhlIGNvbnRlbnRzIG9mIHRoZSBIT1NUX0lOVAorCSAqCQkJCXBvcnQuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIFJ4IEVPRiBpbnRlcnJ1cHQgd2hpY2gKKwkgKglpbmRpY2F0ZXMgYSBmcmFtZSBoYXMgYmVlbiByZWNlaXZlZCBieSB0aGUgYWRhcHRlciBmcm9tCisJICoJdGhlIG5ldCBhbmQgdGhlIGZyYW1lIGhhcyBiZWVuIHRyYW5zZmVycmVkIHRvIG1lbW9yeS4KKwkgKglUaGUgZnVuY3Rpb24gZGV0ZXJtaW5lcyB0aGUgYm91bmNlIGJ1ZmZlciB0aGUgZnJhbWUgaGFzCisJICoJYmVlbiBsb2FkZWQgaW50bywgY3JlYXRlcyBhIG5ldyBza19idWZmIGJpZyBlbm91Z2ggdG8KKwkgKglob2xkIHRoZSBmcmFtZSwgYW5kIHNlbmRzIGl0IHRvIHByb3RvY29sIHN0YWNrLiAgSXQKKwkgKgl0aGVuIHJlc2V0cyB0aGUgdXNlZCBidWZmZXIgYW5kIGFwcGVuZHMgaXQgdG8gdGhlIGVuZAorCSAqCW9mIHRoZSBsaXN0LiAgSWYgdGhlIGZyYW1lIHdhcyB0aGUgbGFzdCBpbiB0aGUgUngKKwkgKgljaGFubmVsIChFT0MpLCB0aGUgZnVuY3Rpb24gcmVzdGFydHMgdGhlIHJlY2VpdmUgY2hhbm5lbAorCSAqCWJ5IHNlbmRpbmcgYW4gUnggR28gY29tbWFuZCB0byB0aGUgYWRhcHRlci4gIFRoZW4gaXQKKwkgKglhY3RpdmF0ZXMvY29udGludWVzIHRoZSBhY3Rpdml0eSBMRUQuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3UzMiBUTGFuX0hhbmRsZVJ4RU9GKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgaG9zdF9pbnQgKQoreworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IGRldi0+cHJpdjsKKwl1MzIJCWFjayA9IDA7CisJaW50CQllb2MgPSAwOworCXU4CQkqaGVhZF9idWZmZXI7CisJVExhbkxpc3QJKmhlYWRfbGlzdDsKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOworCVRMYW5MaXN0CSp0YWlsX2xpc3Q7CisJdm9pZAkJKnQ7CisJdTMyCQlmcmFtZVNpemU7CisJdTE2CQl0bXBDU3RhdDsKKworCVRMQU5fREJHKCBUTEFOX0RFQlVHX1JYLCAiUkVDRUlWRTogIEhhbmRsaW5nIFJYIEVPRiAoSGVhZD0lZCBUYWlsPSVkKVxuIiwgcHJpdi0+cnhIZWFkLCBwcml2LT5yeFRhaWwgKTsKKwloZWFkX2xpc3QgPSBwcml2LT5yeExpc3QgKyBwcml2LT5yeEhlYWQ7CisJCisJd2hpbGUgKCgodG1wQ1N0YXQgPSBoZWFkX2xpc3QtPmNTdGF0KSAmIFRMQU5fQ1NUQVRfRlJNX0NNUCkgJiYgKGFjayA8IDI1NSkpIHsKKwkJZnJhbWVTaXplID0gaGVhZF9saXN0LT5mcmFtZVNpemU7CisJCWFjaysrOworCQlpZiAodG1wQ1N0YXQgJiBUTEFOX0NTVEFUX0VPQykKKwkJCWVvYyA9IDE7CisJCQorCQlpZiAoYmJ1ZikgeworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihmcmFtZVNpemUgKyA3KTsKKwkJCWlmIChza2IgPT0gTlVMTCkKKwkJCQlwcmludGsoS0VSTl9JTkZPICJUTEFOOiBDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlY2VpdmVkIGRhdGEuXG4iKTsKKwkJCWVsc2UgeworCQkJCWhlYWRfYnVmZmVyID0gcHJpdi0+cnhCdWZmZXIgKyAocHJpdi0+cnhIZWFkICogVExBTl9NQVhfRlJBTUVfU0laRSk7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwkJCQl0ID0gKHZvaWQgKikgc2tiX3B1dChza2IsIGZyYW1lU2l6ZSk7CisJCQorCQkJCXByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IGhlYWRfbGlzdC0+ZnJhbWVTaXplOworCisJCQkJbWVtY3B5KCB0LCBoZWFkX2J1ZmZlciwgZnJhbWVTaXplICk7CisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKCBza2IsIGRldiApOworCQkJCW5ldGlmX3J4KCBza2IgKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBza19idWZmICpuZXdfc2tiOworCQkKKwkJCS8qCisJCSAJKglJIGNoYW5nZWQgdGhlIGFsZ29yaXRobSBoZXJlLiBXaGF0IHdlIG5vdyBkbworCQkgCSoJaXMgYWxsb2NhdGUgdGhlIG5ldyBmcmFtZS4gSWYgdGhpcyBmYWlscyB3ZQorCQkgCSoJc2ltcGx5IHJlY3ljbGUgdGhlIGZyYW1lLgorCQkgCSovCisJCQorCQkJbmV3X3NrYiA9IGRldl9hbGxvY19za2IoIFRMQU5fTUFYX0ZSQU1FX1NJWkUgKyA3ICk7CisJCQkKKwkJCWlmICggbmV3X3NrYiAhPSBOVUxMICkgeworCQkJCS8qIElmIHRoaXMgZXZlciBoYXBwZW5lZCBpdCB3b3VsZCBiZSBhIHByb2JsZW0gKi8KKwkJCQkvKiBub3QgYW55IG1vcmUgLSBhYyAqLworCQkJCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSBoZWFkX2xpc3QtPmJ1ZmZlcls5XS5hZGRyZXNzOworCQkJCXNrYl90cmltKCBza2IsIGZyYW1lU2l6ZSApOworCisJCQkJcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gZnJhbWVTaXplOworCisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKCBza2IsIGRldiApOworCQkJCW5ldGlmX3J4KCBza2IgKTsKKwkKKwkJCQluZXdfc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoIG5ld19za2IsIDIgKTsKKwkJCQl0ID0gKHZvaWQgKikgc2tiX3B1dCggbmV3X3NrYiwgVExBTl9NQVhfRlJBTUVfU0laRSApOworCQkJCWhlYWRfbGlzdC0+YnVmZmVyWzBdLmFkZHJlc3MgPSB2aXJ0X3RvX2J1cyggdCApOworCQkJCWhlYWRfbGlzdC0+YnVmZmVyWzhdLmFkZHJlc3MgPSAodTMyKSB0OworCQkJCWhlYWRfbGlzdC0+YnVmZmVyWzldLmFkZHJlc3MgPSAodTMyKSBuZXdfc2tiOworCQkJfSBlbHNlIAorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlRMQU46ICBDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlY2VpdmVkIGRhdGEuXG4iICk7CisJCX0KKworCQloZWFkX2xpc3QtPmZvcndhcmQgPSAwOworCQloZWFkX2xpc3QtPmNTdGF0ID0gMDsKKwkJdGFpbF9saXN0ID0gcHJpdi0+cnhMaXN0ICsgcHJpdi0+cnhUYWlsOworCQl0YWlsX2xpc3QtPmZvcndhcmQgPSB2aXJ0X3RvX2J1cyggaGVhZF9saXN0ICk7CisKKwkJQ0lSQ19JTkMoIHByaXYtPnJ4SGVhZCwgVExBTl9OVU1fUlhfTElTVFMgKTsKKwkJQ0lSQ19JTkMoIHByaXYtPnJ4VGFpbCwgVExBTl9OVU1fUlhfTElTVFMgKTsKKwkJaGVhZF9saXN0ID0gcHJpdi0+cnhMaXN0ICsgcHJpdi0+cnhIZWFkOworCX0KKworCWlmICghYWNrKQorCQlwcmludGsoS0VSTl9JTkZPICJUTEFOOiBSZWNlaXZlZCBpbnRlcnJ1cHQgZm9yIHVuY29tcGxldGVkIFJYIGZyYW1lLlxuIik7CisJCisKKwlpZiAoIGVvYyApIHsgCisJCVRMQU5fREJHKCBUTEFOX0RFQlVHX1JYLCAiUkVDRUlWRTogIEhhbmRsaW5nIFJYIEVPQyAoSGVhZD0lZCBUYWlsPSVkKVxuIiwgcHJpdi0+cnhIZWFkLCBwcml2LT5yeFRhaWwgKTsKKwkJaGVhZF9saXN0ID0gcHJpdi0+cnhMaXN0ICsgcHJpdi0+cnhIZWFkOworCQlvdXRsKCB2aXJ0X3RvX2J1cyggaGVhZF9saXN0ICksIGRldi0+YmFzZV9hZGRyICsgVExBTl9DSF9QQVJNICk7CisJCWFjayB8PSBUTEFOX0hDX0dPIHwgVExBTl9IQ19SVDsKKwkJcHJpdi0+cnhFb2NDb3VudCsrOworCX0KKworCWlmICggcHJpdi0+YWRhcHRlci0+ZmxhZ3MgJiBUTEFOX0FEQVBURVJfQUNUSVZJVFlfTEVEICkgeworCQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTEVEX1JFRywgVExBTl9MRURfTElOSyB8IFRMQU5fTEVEX0FDVCApOworCQlpZiAoIHByaXYtPnRpbWVyLmZ1bmN0aW9uID09IE5VTEwgKSAgeworCQkJcHJpdi0+dGltZXIuZnVuY3Rpb24gPSAmVExhbl9UaW1lcjsKKwkJCXByaXYtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OworCQkJcHJpdi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBUTEFOX1RJTUVSX0FDVF9ERUxBWTsKKwkJCXByaXYtPnRpbWVyU2V0QXQgPSBqaWZmaWVzOworCQkJcHJpdi0+dGltZXJUeXBlID0gVExBTl9USU1FUl9BQ1RJVklUWTsKKwkJCWFkZF90aW1lcigmcHJpdi0+dGltZXIpOworCQl9IGVsc2UgaWYgKCBwcml2LT50aW1lclR5cGUgPT0gVExBTl9USU1FUl9BQ1RJVklUWSApIHsKKwkJCXByaXYtPnRpbWVyU2V0QXQgPSBqaWZmaWVzOworCQl9CisJfQorCisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkKKwlyZXR1cm4gYWNrOworCit9IC8qIFRMYW5fSGFuZGxlUnhFT0YgKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX0hhbmRsZUR1bW15CisJICoKKwkgKglSZXR1cm5zOgorCSAqCQkxCisJICoJUGFybXM6CisJICoJCWRldgkJRGV2aWNlIGFzc2lnbmVkIHRoZSBJUlEgdGhhdCB3YXMKKwkgKgkJCQlyYWlzZWQuCisJICoJCWhvc3RfaW50CVRoZSBjb250ZW50cyBvZiB0aGUgSE9TVF9JTlQKKwkgKgkJCQlwb3J0LgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBEdW1teSBpbnRlcnJ1cHQsIHdoaWNoIGlzCisJICoJcmFpc2VkIHdoZW5ldmVyIGEgdGVzdCBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIGJ5IHNldHRpbmcKKwkgKgl0aGUgUmVxX0ludCBiaXQgb2YgSE9TVF9DTUQgdG8gMS4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTMyIFRMYW5fSGFuZGxlRHVtbXkoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBob3N0X2ludCApCit7CisJcHJpbnRrKCAiVExBTjogIFRlc3QgaW50ZXJydXB0IG9uICVzLlxuIiwgZGV2LT5uYW1lICk7CisJcmV0dXJuIDE7CisKK30gLyogVExhbl9IYW5kbGVEdW1teSAqLworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fSGFuZGxlVHhFT0MKKwkgKgorCSAqCVJldHVybnM6CisJICoJCTEKKwkgKglQYXJtczoKKwkgKgkJZGV2CQlEZXZpY2UgYXNzaWduZWQgdGhlIElSUSB0aGF0IHdhcworCSAqCQkJCXJhaXNlZC4KKwkgKgkJaG9zdF9pbnQJVGhlIGNvbnRlbnRzIG9mIHRoZSBIT1NUX0lOVAorCSAqCQkJCXBvcnQuCisJICoKKwkgKglUaGlzIGRyaXZlciBpcyBzdHJ1Y3R1cmVkIHRvIGRldGVybWluZSBFT0Mgb2NjdXJhbmNlcyBieQorCSAqCXJlYWRpbmcgdGhlIENTVEFUIG1lbWJlciBvZiB0aGUgbGlzdCBzdHJ1Y3R1cmUuICBUeCBFT0MKKwkgKglpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCB2aWEgdGhlIERJTyBJTlRESVMgcmVnaXN0ZXIuCisJICoJSG93ZXZlciwgVExBTiBjaGlwcyBiZWZvcmUgcmV2aXNpb24gMy4wIGRpZG4ndCBoYXZlIHRoaXMKKwkgKglmdW5jdGlvbmFsaXR5LCBzbyBwcm9jZXNzIEVPQyBldmVudHMgaWYgdGhpcyBpcyB0aGUKKwkgKgljYXNlLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1MzIgVExhbl9IYW5kbGVUeEVPQyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGhvc3RfaW50ICkKK3sKKwlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBkZXYtPnByaXY7CisJVExhbkxpc3QJCSpoZWFkX2xpc3Q7CisJdTMyCQkJYWNrID0gMTsKKwkKKwlob3N0X2ludCA9IDA7CisJaWYgKCBwcml2LT50bGFuUmV2IDwgMHgzMCApIHsKKwkJVExBTl9EQkcoIFRMQU5fREVCVUdfVFgsICJUUkFOU01JVDogIEhhbmRsaW5nIFRYIEVPQyAoSGVhZD0lZCBUYWlsPSVkKSAtLSBJUlFcbiIsIHByaXYtPnR4SGVhZCwgcHJpdi0+dHhUYWlsICk7CisJCWhlYWRfbGlzdCA9IHByaXYtPnR4TGlzdCArIHByaXYtPnR4SGVhZDsKKwkJaWYgKCAoIGhlYWRfbGlzdC0+Y1N0YXQgJiBUTEFOX0NTVEFUX1JFQURZICkgPT0gVExBTl9DU1RBVF9SRUFEWSApIHsKKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJCW91dGwoIHZpcnRfdG9fYnVzKCBoZWFkX2xpc3QgKSwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0NIX1BBUk0gKTsKKwkJCWFjayB8PSBUTEFOX0hDX0dPOworCQl9IGVsc2UgeworCQkJcHJpdi0+dHhJblByb2dyZXNzID0gMDsKKwkJfQorCX0KKworCXJldHVybiBhY2s7CisKK30gLyogVExhbl9IYW5kbGVUeEVPQyAqLworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fSGFuZGxlU3RhdHVzQ2hlY2sKKwkgKgorCSAqCVJldHVybnM6CisJICoJCTAgaWYgQWRhcHRlciBjaGVjaywgMSBpZiBOZXR3b3JrIFN0YXR1cyBjaGVjay4KKwkgKglQYXJtczoKKwkgKgkJZGV2CQlEZXZpY2UgYXNzaWduZWQgdGhlIElSUSB0aGF0IHdhcworCSAqCQkJCXJhaXNlZC4KKwkgKgkJaG9zdF9pbnQJVGhlIGNvbnRlbnRzIG9mIHRoZSBIT1NUX0lOVAorCSAqCQkJCXBvcnQuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgQWRhcHRlciBDaGVjay9OZXR3b3JrIFN0YXR1cworCSAqCWludGVycnVwdHMgZ2VuZXJhdGVkIGJ5IHRoZSBhZGFwdGVyLiAgSXQgY2hlY2tzIHRoZQorCSAqCXZlY3RvciBpbiB0aGUgSE9TVF9JTlQgcmVnaXN0ZXIgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzCisJICoJYW4gQWRhcHRlciBDaGVjayBpbnRlcnJ1cHQuICBJZiBzbywgaXQgcmVzZXRzIHRoZQorCSAqCWFkYXB0ZXIuICBPdGhlcndpc2UgaXQgY2xlYXJzIHRoZSBzdGF0dXMgcmVnaXN0ZXJzCisJICoJYW5kIHNlcnZpY2VzIHRoZSBQSFkuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3UzMiBUTGFuX0hhbmRsZVN0YXR1c0NoZWNrKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgaG9zdF9pbnQgKQorewkKKwlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBkZXYtPnByaXY7CisJdTMyCQlhY2s7CisJdTMyCQllcnJvcjsKKwl1OAkJbmV0X3N0czsKKwl1MzIJCXBoeTsKKwl1MTYJCXRscGh5X2N0bDsKKwl1MTYJCXRscGh5X3N0czsKKwkKKwlhY2sgPSAxOworCWlmICggaG9zdF9pbnQgJiBUTEFOX0hJX0lWX01BU0sgKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoIGRldiApOworCQllcnJvciA9IGlubCggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0NIX1BBUk0gKTsKKwkJcHJpbnRrKCAiVExBTjogICVzOiBBZGFwdG9yIEVycm9yID0gMHgleFxuIiwgZGV2LT5uYW1lLCBlcnJvciApOworCQlUTGFuX1JlYWRBbmRDbGVhclN0YXRzKCBkZXYsIFRMQU5fUkVDT1JEICk7CisJCW91dGwoIFRMQU5fSENfQURfUlNULCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQgKTsKKwkJCisJCXF1ZXVlX3Rhc2soJnByaXYtPnRsYW5fdHF1ZXVlLCAmdHFfaW1tZWRpYXRlKTsKKwkJbWFya19iaChJTU1FRElBVEVfQkgpOworCQkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQlhY2sgPSAwOworCX0gZWxzZSB7CisJCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICIlczogU3RhdHVzIENoZWNrXG4iLCBkZXYtPm5hbWUgKTsKKwkJcGh5ID0gcHJpdi0+cGh5W3ByaXYtPnBoeU51bV07CisKKwkJbmV0X3N0cyA9IFRMYW5fRGlvUmVhZDgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9TVFMgKTsKKwkJaWYgKCBuZXRfc3RzICkgeworCQkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9TVFMsIG5ldF9zdHMgKTsKKwkJCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICIlczogICAgTmV0X1N0cyA9ICV4XG4iLCBkZXYtPm5hbWUsICh1bnNpZ25lZCkgbmV0X3N0cyApOworCQl9CisJCWlmICggKCBuZXRfc3RzICYgVExBTl9ORVRfU1RTX01JUlEgKSAmJiAgKCBwcml2LT5waHlOdW0gPT0gMCApICkgeworCQkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgVExBTl9UTFBIWV9TVFMsICZ0bHBoeV9zdHMgKTsKKwkJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIFRMQU5fVExQSFlfQ1RMLCAmdGxwaHlfY3RsICk7CisgICAgICAgIAkJaWYgKCAhICggdGxwaHlfc3RzICYgVExBTl9UU19QT0xPSyApICYmICEgKCB0bHBoeV9jdGwgJiBUTEFOX1RDX1NXQVBPTCApICkgeworICAgICAgICAgICAgICAgIAkJdGxwaHlfY3RsIHw9IFRMQU5fVENfU1dBUE9MOworICAgICAgICAgICAgICAgIAkJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIFRMQU5fVExQSFlfQ1RMLCB0bHBoeV9jdGwpOworICAgICAgICAJCX0gZWxzZSBpZiAoICggdGxwaHlfc3RzICYgVExBTl9UU19QT0xPSyApICYmICggdGxwaHlfY3RsICYgVExBTl9UQ19TV0FQT0wgKSApIHsKKyAgICAgICAgICAgICAgICAJCXRscGh5X2N0bCAmPSB+VExBTl9UQ19TV0FQT0w7CisgICAgICAgICAgICAgICAgCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgVExBTl9UTFBIWV9DVEwsIHRscGh5X2N0bCk7CisgICAgICAgIAkJfQorCisJCQlpZiAoZGVidWcpIHsKKwkJCQlUTGFuX1BoeVByaW50KCBkZXYgKTsJCQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGFjazsKKworfSAvKiBUTGFuX0hhbmRsZVN0YXR1c0NoZWNrICovCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9IYW5kbGVSeEVPQworCSAqCisJICoJUmV0dXJuczoKKwkgKgkJMQorCSAqCVBhcm1zOgorCSAqCQlkZXYJCURldmljZSBhc3NpZ25lZCB0aGUgSVJRIHRoYXQgd2FzCisJICoJCQkJcmFpc2VkLgorCSAqCQlob3N0X2ludAlUaGUgY29udGVudHMgb2YgdGhlIEhPU1RfSU5UCisJICoJCQkJcG9ydC4KKwkgKgorCSAqCVRoaXMgZHJpdmVyIGlzIHN0cnVjdHVyZWQgdG8gZGV0ZXJtaW5lIEVPQyBvY2N1cmFuY2VzIGJ5CisJICoJcmVhZGluZyB0aGUgQ1NUQVQgbWVtYmVyIG9mIHRoZSBsaXN0IHN0cnVjdHVyZS4gIFJ4IEVPQworCSAqCWludGVycnVwdHMgYXJlIGRpc2FibGVkIHZpYSB0aGUgRElPIElOVERJUyByZWdpc3Rlci4KKwkgKglIb3dldmVyLCBUTEFOIGNoaXBzIGJlZm9yZSByZXZpc2lvbiAzLjAgZGlkbid0IGhhdmUgdGhpcworCSAqCUNTVEFUIG1lbWJlciBvciBhIElOVERJUyByZWdpc3Rlciwgc28gaWYgdGhpcyBjaGlwIGlzCisJICoJcHJlLTMuMCwgcHJvY2VzcyBFT0MgaW50ZXJydXB0cyBub3JtYWxseS4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTMyIFRMYW5fSGFuZGxlUnhFT0MoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBob3N0X2ludCApCit7CisJVExhblByaXZhdGVJbmZvCSpwcml2ID0gZGV2LT5wcml2OworCVRMYW5MaXN0CSpoZWFkX2xpc3Q7CisJdTMyCQlhY2sgPSAxOworCisJaWYgKCAgcHJpdi0+dGxhblJldiA8IDB4MzAgKSB7CisJCVRMQU5fREJHKCBUTEFOX0RFQlVHX1JYLCAiUkVDRUlWRTogIEhhbmRsaW5nIFJYIEVPQyAoSGVhZD0lZCBUYWlsPSVkKSAtLSBJUlFcbiIsIHByaXYtPnJ4SGVhZCwgcHJpdi0+cnhUYWlsICk7CisJCWhlYWRfbGlzdCA9IHByaXYtPnJ4TGlzdCArIHByaXYtPnJ4SGVhZDsKKwkJb3V0bCggdmlydF90b19idXMoIGhlYWRfbGlzdCApLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fQ0hfUEFSTSApOworCQlhY2sgfD0gVExBTl9IQ19HTyB8IFRMQU5fSENfUlQ7CisJCXByaXYtPnJ4RW9jQ291bnQrKzsKKwl9CisKKwlyZXR1cm4gYWNrOworCit9IC8qIFRMYW5fSGFuZGxlUnhFT0MgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCVRodW5kZXJMQU4gRHJpdmVyIFRpbWVyIEZ1bmN0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9UaW1lcgorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQlkYXRhCUEgdmFsdWUgZ2l2ZW4gdG8gYWRkIHRpbWVyIHdoZW4KKwkgKgkJCWFkZF90aW1lciB3YXMgY2FsbGVkLgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRpbWVkIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZQorCSAqCVRMQU4gZHJpdmVyLiAgVGhlIHR3byBjdXJyZW50IHRpbWVyIHVzZXMgYXJlIGZvcgorCSAqCWRlbGF5aW5nIGZvciBhdXRvbmVnb3Rpb25hdGlvbiBhbmQgZHJpdmluZyB0aGUgQUNUIExFRC4KKwkgKgktCUF1dG9uZWdvdGlhdGlvbiByZXF1aXJlcyBiZWluZyBhbGxvd2VkIGFib3V0CisJICoJCTIgMS8yIHNlY29uZHMgYmVmb3JlIGF0dGVtcHRpbmcgdG8gdHJhbnNtaXQgYQorCSAqCQlwYWNrZXQuICBJdCB3b3VsZCBiZSBhIHZlcnkgYmFkIHRoaW5nIHRvIGhhbmcKKwkgKgkJdGhlIGtlcm5lbCB0aGlzIGxvbmcsIHNvIHRoZSBkcml2ZXIgZG9lc24ndAorCSAqCQlhbGxvdyB0cmFuc21pc3Npb24gJ3RpbCBhZnRlciB0aGlzIHRpbWUsIGZvcgorCSAqCQljZXJ0YWluIFBIWXMuICBJdCB3b3VsZCBiZSBtdWNoIG5pY2VyIGlmIGFsbAorCSAqCQlQSFlzIHdlcmUgaW50ZXJydXB0LWNhcGFibGUgbGlrZSB0aGUgaW50ZXJuYWwKKwkgKgkJUEhZLgorCSAqCS0JVGhlIEFDVCBMRUQsIHdoaWNoIHNob3dzIGFkYXB0ZXIgYWN0aXZpdHksIGlzCisJICoJCWRyaXZlbiBieSB0aGUgZHJpdmVyLCBhbmQgc28gbXVzdCBiZSBsZWZ0IG9uCisJICoJCWZvciBhIHNob3J0IHBlcmlvZCB0byBwb3dlciB1cCB0aGUgTEVEIHNvIGl0CisJICoJCWNhbiBiZSBzZWVuLiAgVGhpcyBkZWxheSBjYW4gYmUgY2hhbmdlZCBieQorCSAqCQljaGFuZ2luZyB0aGUgVExBTl9USU1FUl9BQ1RfREVMQVkgaW4gdGxhbi5oLAorCSAqCQlpZiBkZXNpcmVkLiAgMTAwIG1zICBwcm9kdWNlcyBhIHNsaWdodGx5CisJICoJCXNsdWdnaXNoIHJlc3BvbnNlLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fVGltZXIoIHVuc2lnbmVkIGxvbmcgZGF0YSApCit7CisJc3RydWN0IG5ldF9kZXZpY2UJKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkYXRhOworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IGRldi0+cHJpdjsKKwl1MzIJCWVsYXBzZWQ7CisJdW5zaWduZWQgbG9uZwlmbGFncyA9IDA7CisKKwlwcml2LT50aW1lci5mdW5jdGlvbiA9IE5VTEw7CisKKwlzd2l0Y2ggKCBwcml2LT50aW1lclR5cGUgKSB7CisjaWZkZWYgTU9OSVRPUgkJCisJCWNhc2UgVExBTl9USU1FUl9MSU5LX0JFQVQ6CisJCQlUTGFuX1BoeU1vbml0b3IoIGRldiApOworCQkJYnJlYWs7CisjZW5kaWYKKwkJY2FzZSBUTEFOX1RJTUVSX1BIWV9QRE9XTjoKKwkJCVRMYW5fUGh5UG93ZXJEb3duKCBkZXYgKTsKKwkJCWJyZWFrOworCQljYXNlIFRMQU5fVElNRVJfUEhZX1BVUDoKKwkJCVRMYW5fUGh5UG93ZXJVcCggZGV2ICk7CisJCQlicmVhazsKKwkJY2FzZSBUTEFOX1RJTUVSX1BIWV9SRVNFVDoKKwkJCVRMYW5fUGh5UmVzZXQoIGRldiApOworCQkJYnJlYWs7CisJCWNhc2UgVExBTl9USU1FUl9QSFlfU1RBUlRfTElOSzoKKwkJCVRMYW5fUGh5U3RhcnRMaW5rKCBkZXYgKTsKKwkJCWJyZWFrOworCQljYXNlIFRMQU5fVElNRVJfUEhZX0ZJTklTSF9BTjoKKwkJCVRMYW5fUGh5RmluaXNoQXV0b05lZyggZGV2ICk7CisJCQlicmVhazsKKwkJY2FzZSBUTEFOX1RJTUVSX0ZJTklTSF9SRVNFVDoKKwkJCVRMYW5fRmluaXNoUmVzZXQoIGRldiApOworCQkJYnJlYWs7CisJCWNhc2UgVExBTl9USU1FUl9BQ1RJVklUWToKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCQlpZiAoIHByaXYtPnRpbWVyLmZ1bmN0aW9uID09IE5VTEwgKSB7CisJCQkJZWxhcHNlZCA9IGppZmZpZXMgLSBwcml2LT50aW1lclNldEF0OworCQkJCWlmICggZWxhcHNlZCA+PSBUTEFOX1RJTUVSX0FDVF9ERUxBWSApIHsKKwkJCQkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0xFRF9SRUcsIFRMQU5fTEVEX0xJTksgKTsKKwkJCQl9IGVsc2UgIHsKKwkJCQkJcHJpdi0+dGltZXIuZnVuY3Rpb24gPSAmVExhbl9UaW1lcjsKKwkJCQkJcHJpdi0+dGltZXIuZXhwaXJlcyA9IHByaXYtPnRpbWVyU2V0QXQgKyBUTEFOX1RJTUVSX0FDVF9ERUxBWTsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQkJCQlhZGRfdGltZXIoICZwcml2LT50aW1lciApOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworfSAvKiBUTGFuX1RpbWVyICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlUaHVuZGVyTEFOIERyaXZlciBBZGFwdGVyIFJlbGF0ZWQgUm91dGluZXMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX1Jlc2V0TGlzdHMKKwkgKiAgCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQlkZXYJVGhlIGRldmljZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgbGlzdAorCSAqCQkJc3R1Y3R1cmVzIHRvIGJlIHJlc2V0LgorCSAqCisJICoJVGhpcyByb3V0aW5lIHNldHMgdGhlIHZhcmlhYmxlcyBhc3NvY2lhdGVkIHdpdGggbWFuYWdpbmcKKwkgKgl0aGUgVExBTiBsaXN0cyB0byB0aGVpciBpbml0aWFsIHZhbHVlcy4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBUTGFuX1Jlc2V0TGlzdHMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IGRldi0+cHJpdjsKKwlpbnQJCWk7CisJVExhbkxpc3QJKmxpc3Q7CisJc3RydWN0IHNrX2J1ZmYJKnNrYjsKKwl2b2lkCQkqdCA9IE5VTEw7CisKKwlwcml2LT50eEhlYWQgPSAwOworCXByaXYtPnR4VGFpbCA9IDA7CisJZm9yICggaSA9IDA7IGkgPCBUTEFOX05VTV9UWF9MSVNUUzsgaSsrICkgeworCQlsaXN0ID0gcHJpdi0+dHhMaXN0ICsgaTsKKwkJbGlzdC0+Y1N0YXQgPSBUTEFOX0NTVEFUX1VOVVNFRDsKKwkJaWYgKCBiYnVmICkgeworCQkJbGlzdC0+YnVmZmVyWzBdLmFkZHJlc3MgPSB2aXJ0X3RvX2J1cyggcHJpdi0+dHhCdWZmZXIgKyAoIGkgKiBUTEFOX01BWF9GUkFNRV9TSVpFICkgKTsKKwkJfSBlbHNlIHsKKwkJCWxpc3QtPmJ1ZmZlclswXS5hZGRyZXNzID0gMDsKKwkJfQorCQlsaXN0LT5idWZmZXJbMl0uY291bnQgPSAwOworCQlsaXN0LT5idWZmZXJbMl0uYWRkcmVzcyA9IDA7CisJCWxpc3QtPmJ1ZmZlcls5XS5hZGRyZXNzID0gMDsKKwl9CisKKwlwcml2LT5yeEhlYWQgPSAwOworCXByaXYtPnJ4VGFpbCA9IFRMQU5fTlVNX1JYX0xJU1RTIC0gMTsKKwlmb3IgKCBpID0gMDsgaSA8IFRMQU5fTlVNX1JYX0xJU1RTOyBpKysgKSB7CisJCWxpc3QgPSBwcml2LT5yeExpc3QgKyBpOworCQlsaXN0LT5jU3RhdCA9IFRMQU5fQ1NUQVRfUkVBRFk7CisJCWxpc3QtPmZyYW1lU2l6ZSA9IFRMQU5fTUFYX0ZSQU1FX1NJWkU7CisJCWxpc3QtPmJ1ZmZlclswXS5jb3VudCA9IFRMQU5fTUFYX0ZSQU1FX1NJWkUgfCBUTEFOX0xBU1RfQlVGRkVSOworCQlpZiAoIGJidWYgKSB7CisJCQlsaXN0LT5idWZmZXJbMF0uYWRkcmVzcyA9IHZpcnRfdG9fYnVzKCBwcml2LT5yeEJ1ZmZlciArICggaSAqIFRMQU5fTUFYX0ZSQU1FX1NJWkUgKSApOworCQl9IGVsc2UgeworCQkJc2tiID0gZGV2X2FsbG9jX3NrYiggVExBTl9NQVhfRlJBTUVfU0laRSArIDcgKTsKKwkJCWlmICggc2tiID09IE5VTEwgKSB7CisJCQkJcHJpbnRrKCAiVExBTjogIENvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVjZWl2ZWQgZGF0YS5cbiIgKTsKKwkJCQkvKiBJZiB0aGlzIGV2ZXIgaGFwcGVuZWQgaXQgd291bGQgYmUgYSBwcm9ibGVtICovCisJCQl9IGVsc2UgeworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9yZXNlcnZlKCBza2IsIDIgKTsKKwkJCQl0ID0gKHZvaWQgKikgc2tiX3B1dCggc2tiLCBUTEFOX01BWF9GUkFNRV9TSVpFICk7CisJCQl9CisJCQlsaXN0LT5idWZmZXJbMF0uYWRkcmVzcyA9IHZpcnRfdG9fYnVzKCB0ICk7CisJCQlsaXN0LT5idWZmZXJbOF0uYWRkcmVzcyA9ICh1MzIpIHQ7CisJCQlsaXN0LT5idWZmZXJbOV0uYWRkcmVzcyA9ICh1MzIpIHNrYjsKKwkJfQorCQlsaXN0LT5idWZmZXJbMV0uY291bnQgPSAwOworCQlsaXN0LT5idWZmZXJbMV0uYWRkcmVzcyA9IDA7CisJCWlmICggaSA8IFRMQU5fTlVNX1JYX0xJU1RTIC0gMSApCisJCQlsaXN0LT5mb3J3YXJkID0gdmlydF90b19idXMoIGxpc3QgKyAxICk7CisJCWVsc2UKKwkJCWxpc3QtPmZvcndhcmQgPSAwOworCX0KKworfSAvKiBUTGFuX1Jlc2V0TGlzdHMgKi8KKwordm9pZCBUTGFuX0ZyZWVMaXN0cyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJVExhblByaXZhdGVJbmZvICpwcml2ID0gZGV2LT5wcml2OworCWludAkJaTsKKwlUTGFuTGlzdAkqbGlzdDsKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOworCisJaWYgKCAhIGJidWYgKSB7CisJCWZvciAoIGkgPSAwOyBpIDwgVExBTl9OVU1fVFhfTElTVFM7IGkrKyApIHsKKwkJCWxpc3QgPSBwcml2LT50eExpc3QgKyBpOworCQkJc2tiID0gKHN0cnVjdCBza19idWZmICopIGxpc3QtPmJ1ZmZlcls5XS5hZGRyZXNzOworCQkJaWYgKCBza2IgKSB7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoIHNrYiApOworCQkJCWxpc3QtPmJ1ZmZlcls5XS5hZGRyZXNzID0gMDsKKwkJCX0KKwkJfQorCisJCWZvciAoIGkgPSAwOyBpIDwgVExBTl9OVU1fUlhfTElTVFM7IGkrKyApIHsKKwkJCWxpc3QgPSBwcml2LT5yeExpc3QgKyBpOworCQkJc2tiID0gKHN0cnVjdCBza19idWZmICopIGxpc3QtPmJ1ZmZlcls5XS5hZGRyZXNzOworCQkJaWYgKCBza2IgKSB7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoIHNrYiApOworCQkJCWxpc3QtPmJ1ZmZlcls5XS5hZGRyZXNzID0gMDsKKwkJCX0KKwkJfQorCX0KKworfSAvKiBUTGFuX0ZyZWVMaXN0cyAqLworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fUHJpbnREaW8KKwkgKiAgCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQlpb19iYXNlCQlCYXNlIElPIHBvcnQgb2YgdGhlIGRldmljZSBvZgorCSAqCQkJCXdoaWNoIHRvIHByaW50IERJTyByZWdpc3RlcnMuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIHByaW50cyBvdXQgYWxsIHRoZSBpbnRlcm5hbCAoRElPKQorCSAqCXJlZ2lzdGVycyBvZiBhIFRMQU4gY2hpcC4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBUTGFuX1ByaW50RGlvKCB1MTYgaW9fYmFzZSApCit7CisJdTMyIGRhdGEwLCBkYXRhMTsKKwlpbnQJaTsKKworCXByaW50ayggIlRMQU46ICAgQ29udGVudHMgb2YgaW50ZXJuYWwgcmVnaXN0ZXJzIGZvciBpbyBiYXNlIDB4JTA0aHguXG4iLCBpb19iYXNlICk7CisJcHJpbnRrKCAiVExBTjogICAgICBPZmYuICArMCAgICAgICAgICs0XG4iICk7CisJZm9yICggaSA9IDA7IGkgPCAweDRDOyBpKz0gOCApIHsKKwkJZGF0YTAgPSBUTGFuX0Rpb1JlYWQzMiggaW9fYmFzZSwgaSApOworCQlkYXRhMSA9IFRMYW5fRGlvUmVhZDMyKCBpb19iYXNlLCBpICsgMHg0ICk7CisJCXByaW50ayggIlRMQU46ICAgICAgMHglMDJ4ICAweCUwOHggMHglMDh4XG4iLCBpLCBkYXRhMCwgZGF0YTEgKTsKKwl9CisKK30gLyogVExhbl9QcmludERpbyAqLworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fUHJpbnRMaXN0CisJICogIAorCSAqCVJldHVybnM6CisJICoJCU5vdGhpbmcKKwkgKglQYXJtczoKKwkgKgkJbGlzdAlBIHBvaW50ZXIgdG8gdGhlIFRMYW5MaXN0IHN0cnVjdHVyZSB0bworCSAqCQkJYmUgcHJpbnRlZC4KKwkgKgkJdHlwZQlBIHN0cmluZyB0byBkZXNpZ25hdGUgdHlwZSBvZiBsaXN0LAorCSAqCQkJIlJ4IiBvciAiVHgiLgorCSAqCQludW0JVGhlIGluZGV4IG9mIHRoZSBsaXN0LgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBwcmludHMgb3V0IHRoZSBjb250ZW50cyBvZiB0aGUgbGlzdAorCSAqCXBvaW50ZWQgdG8gYnkgdGhlIGxpc3QgcGFyYW1ldGVyLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fUHJpbnRMaXN0KCBUTGFuTGlzdCAqbGlzdCwgY2hhciAqdHlwZSwgaW50IG51bSkKK3sKKwlpbnQgaTsKKworCXByaW50ayggIlRMQU46ICAgJXMgTGlzdCAlZCBhdCAweCUwOHhcbiIsIHR5cGUsIG51bSwgKHUzMikgbGlzdCApOworCXByaW50ayggIlRMQU46ICAgICAgRm9yd2FyZCAgICA9IDB4JTA4eFxuIiwgIGxpc3QtPmZvcndhcmQgKTsKKwlwcmludGsoICJUTEFOOiAgICAgIENTVEFUICAgICAgPSAweCUwNGh4XG4iLCBsaXN0LT5jU3RhdCApOworCXByaW50ayggIlRMQU46ICAgICAgRnJhbWUgU2l6ZSA9IDB4JTA0aHhcbiIsIGxpc3QtPmZyYW1lU2l6ZSApOworCS8qIGZvciAoIGkgPSAwOyBpIDwgMTA7IGkrKyApIHsgKi8KKwlmb3IgKCBpID0gMDsgaSA8IDI7IGkrKyApIHsKKwkJcHJpbnRrKCAiVExBTjogICAgICBCdWZmZXJbJWRdLmNvdW50LCBhZGRyID0gMHglMDh4LCAweCUwOHhcbiIsIGksIGxpc3QtPmJ1ZmZlcltpXS5jb3VudCwgbGlzdC0+YnVmZmVyW2ldLmFkZHJlc3MgKTsKKwl9CisKK30gLyogVExhbl9QcmludExpc3QgKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX1JlYWRBbmRDbGVhclN0YXRzCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQlOb3RoaW5nCisJICoJUGFybXM6CisJICoJCWRldglQb2ludGVyIHRvIGRldmljZSBzdHJ1Y3R1cmUgb2YgYWRhcHRlcgorCSAqCQkJdG8gd2hpY2ggdG8gcmVhZCBzdGF0cy4KKwkgKgkJcmVjb3JkCUZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRvIGFkZCAKKwkgKgorCSAqCVRoaXMgZnVuY3Rpb25zIHJlYWRzIGFsbCB0aGUgaW50ZXJuYWwgc3RhdHVzIHJlZ2lzdGVycworCSAqCW9mIHRoZSBUTEFOIGNoaXAsIHdoaWNoIGNsZWFycyB0aGVtIGFzIGEgc2lkZSBlZmZlY3QuCisJICoJSXQgdGhlbiBlaXRoZXIgYWRkcyB0aGUgdmFsdWVzIHRvIHRoZSBkZXZpY2UncyBzdGF0dXMKKwkgKglzdHJ1Y3QsIG9yIGRpc2NhcmRzIHRoZW0sIGRlcGVuZGluZyBvbiB3aGV0aGVyIHJlY29yZAorCSAqCWlzIFRMQU5fUkVDT1JEICghPTApICBvciBUTEFOX0lHTk9SRSAoPT0wKS4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBUTGFuX1JlYWRBbmRDbGVhclN0YXRzKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVjb3JkICkKK3sKKwlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBkZXYtPnByaXY7CisJdTMyCQl0eF9nb29kLCB0eF91bmRlcjsKKwl1MzIJCXJ4X2dvb2QsIHJ4X292ZXI7CisJdTMyCQlkZWZfdHgsIGNyYywgY29kZTsKKwl1MzIJCW11bHRpX2NvbCwgc2luZ2xlX2NvbDsKKwl1MzIJCWV4Y2Vzc19jb2wsIGxhdGVfY29sLCBsb3NzOworCisJb3V0dyggVExBTl9HT09EX1RYX0ZSTVMsIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fQURSICk7CisJdHhfZ29vZCAgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSApOworCXR4X2dvb2QgKz0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAxICkgPDwgODsKKwl0eF9nb29kICs9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgMiApIDw8IDE2OworCXR4X3VuZGVyID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAzICk7CisKKwlvdXR3KCBUTEFOX0dPT0RfUlhfRlJNUywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIgKTsKKwlyeF9nb29kICA9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICk7CisJcnhfZ29vZCArPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDEgKSA8PCA4OworCXJ4X2dvb2QgKz0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAyICkgPDwgMTY7CisJcnhfb3ZlciAgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDMgKTsKKwkJCisJb3V0dyggVExBTl9ERUZFUlJFRF9UWCwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIgKTsKKwlkZWZfdHggID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKTsKKwlkZWZfdHggKz0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAxICkgPDwgODsKKwljcmMgICAgID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAyICk7CisJY29kZSAgICA9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgMyApOworCQorCW91dHcoIFRMQU5fTVVMVElDT0xfRlJNUywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIgKTsKKwltdWx0aV9jb2wgICA9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICk7CisJbXVsdGlfY29sICArPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDEgKSA8PCA4OworCXNpbmdsZV9jb2wgID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAyICk7CisJc2luZ2xlX2NvbCArPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDMgKSA8PCA4OworCisJb3V0dyggVExBTl9FWENFU1NDT0xfRlJNUywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIgKTsKKwlleGNlc3NfY29sID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKTsKKwlsYXRlX2NvbCAgID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAxICk7CisJbG9zcyAgICAgICA9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgMiApOworCisJaWYgKCByZWNvcmQgKSB7CisJCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMgKz0gcnhfZ29vZDsKKwkJcHJpdi0+c3RhdHMucnhfZXJyb3JzICArPSByeF9vdmVyICsgY3JjICsgY29kZTsKKwkJcHJpdi0+c3RhdHMudHhfcGFja2V0cyArPSB0eF9nb29kOworCQlwcml2LT5zdGF0cy50eF9lcnJvcnMgICs9IHR4X3VuZGVyICsgbG9zczsKKwkJcHJpdi0+c3RhdHMuY29sbGlzaW9ucyArPSBtdWx0aV9jb2wgKyBzaW5nbGVfY29sICsgZXhjZXNzX2NvbCArIGxhdGVfY29sOworCisJCXByaXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzICAgICs9IHJ4X292ZXI7CisJCXByaXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMgICAgICs9IGNyYzsKKwkJcHJpdi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzICAgKz0gY29kZTsKKworCQlwcml2LT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyArPSB0eF91bmRlcjsKKwkJcHJpdi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMgKz0gbG9zczsKKwl9CisJCQkKK30gLyogVExhbl9SZWFkQW5kQ2xlYXJTdGF0cyAqLworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fUmVzZXQKKwkgKgorCSAqCVJldHVybnM6CisJICoJCTAKKwkgKglQYXJtczoKKwkgKgkJZGV2CVBvaW50ZXIgdG8gZGV2aWNlIHN0cnVjdHVyZSBvZiBhZGFwdGVyCisJICoJCQl0byBiZSByZXNldC4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBhZGFwdGVyIGFuZCBpdCdzIHBoeXNpY2FsCisJICoJZGV2aWNlLiAgU2VlIENoYXAuIDMsIHBwLiA5LTEwIG9mIHRoZSAiVGh1bmRlckxBTgorCSAqCVByb2dyYW1tZXIncyBHdWlkZSIgZm9yIGRldGFpbHMuICBUaGUgcm91dGluZSB0cmllcyB0bworCSAqCWltcGxlbWVudCB3aGF0IGlzIGRldGFpbGVkIHRoZXJlLCB0aG91Z2ggYWRqdXN0bWVudHMKKwkgKgloYXZlIGJlZW4gbWFkZS4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorVExhbl9SZXNldEFkYXB0ZXIoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IGRldi0+cHJpdjsKKwlpbnQJCWk7CisJdTMyCQlhZGRyOworCXUzMgkJZGF0YTsKKwl1OAkJZGF0YTg7CisKKwlwcml2LT50bGFuRnVsbER1cGxleCA9IEZBTFNFOworCXByaXYtPnBoeU9ubGluZT0wOworLyogIDEuCUFzc2VydCByZXNldCBiaXQuICovCisKKwlkYXRhID0gaW5sKGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCk7CisJZGF0YSB8PSBUTEFOX0hDX0FEX1JTVDsKKwlvdXRsKGRhdGEsIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCk7CisJCisJdWRlbGF5KDEwMDApOworCisvKiAgMi4JVHVybiBvZmYgaW50ZXJydXB0cy4gKCBQcm9iYWJseSBpc24ndCBuZWNlc3NhcnkgKSAqLworCisJZGF0YSA9IGlubChkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQpOworCWRhdGEgfD0gVExBTl9IQ19JTlRfT0ZGOworCW91dGwoZGF0YSwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EKTsKKworLyogIDMuCUNsZWFyIEFSRUdzIGFuZCBIQVNIcy4gKi8KKworIAlmb3IgKCBpID0gVExBTl9BUkVHXzA7IGkgPD0gVExBTl9IQVNIXzI7IGkgKz0gNCApIHsKKwkJVExhbl9EaW9Xcml0ZTMyKCBkZXYtPmJhc2VfYWRkciwgKHUxNikgaSwgMCApOworCX0KKworLyogIDQuCVNldHVwIE5ldENvbmZpZyByZWdpc3Rlci4gKi8KKworCWRhdGEgPSBUTEFOX05FVF9DRkdfMUZSQUcgfCBUTEFOX05FVF9DRkdfMUNIQU4gfCBUTEFOX05FVF9DRkdfUEhZX0VOOworCVRMYW5fRGlvV3JpdGUxNiggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX0NPTkZJRywgKHUxNikgZGF0YSApOworCisvKiAgNS4JTG9hZCBMZF9UbXIgYW5kIExkX1RociBpbiBIT1NUX0NNRC4gKi8KKworIAlvdXRsKCBUTEFOX0hDX0xEX1RNUiB8IDB4M2YsIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCApOworIAlvdXRsKCBUTEFOX0hDX0xEX1RIUiB8IDB4OSwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EICk7CisKKy8qICA2LglVbnJlc2V0IHRoZSBNSUkgYnkgc2V0dGluZyBOTVJTVCAoaW4gTmV0U2lvKSB0byAxLiAqLworCisJb3V0dyggVExBTl9ORVRfU0lPLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0FEUiApOworCWFkZHIgPSBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyBUTEFOX05FVF9TSU87CisJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19OTVJTVCwgYWRkciApOworCisvKiAgNy4JU2V0dXAgdGhlIHJlbWFpbmluZyByZWdpc3RlcnMuICovCisKKwlpZiAoIHByaXYtPnRsYW5SZXYgPj0gMHgzMCApIHsKKwkJZGF0YTggPSBUTEFOX0lEX1RYX0VPQyB8IFRMQU5fSURfUlhfRU9DOworCQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fSU5UX0RJUywgZGF0YTggKTsKKwl9CisJVExhbl9QaHlEZXRlY3QoIGRldiApOworCWRhdGEgPSBUTEFOX05FVF9DRkdfMUZSQUcgfCBUTEFOX05FVF9DRkdfMUNIQU47CisJCisJaWYgKCBwcml2LT5hZGFwdGVyLT5mbGFncyAmIFRMQU5fQURBUFRFUl9CSVRfUkFURV9QSFkgKSB7CisJCWRhdGEgfD0gVExBTl9ORVRfQ0ZHX0JJVDsKKwkJaWYgKCBwcml2LT5hdWkgPT0gMSApIHsKKwkJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9BQ09NTUlULCAweDBhICk7CisJCX0gZWxzZSBpZiAoIHByaXYtPmR1cGxleCA9PSBUTEFOX0RVUExFWF9GVUxMICkgeworCQkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0FDT01NSVQsIDB4MDAgKTsKKwkJCXByaXYtPnRsYW5GdWxsRHVwbGV4ID0gVFJVRTsKKwkJfSBlbHNlIHsKKwkJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9BQ09NTUlULCAweDA4ICk7CisJCX0KKwl9CisKKwlpZiAoIHByaXYtPnBoeU51bSA9PSAwICkgeworCQlkYXRhIHw9IFRMQU5fTkVUX0NGR19QSFlfRU47CisJfQorCVRMYW5fRGlvV3JpdGUxNiggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX0NPTkZJRywgKHUxNikgZGF0YSApOworCisJaWYgKCBwcml2LT5hZGFwdGVyLT5mbGFncyAmIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZICkgeworCQlUTGFuX0ZpbmlzaFJlc2V0KCBkZXYgKTsKKwl9IGVsc2UgeworCQlUTGFuX1BoeVBvd2VyRG93biggZGV2ICk7CisJfQorCit9IC8qIFRMYW5fUmVzZXRBZGFwdGVyICovCisKK3ZvaWQKK1RMYW5fRmluaXNoUmVzZXQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IGRldi0+cHJpdjsKKwl1OAkJZGF0YTsKKwl1MzIJCXBoeTsKKwl1OAkJc2lvOworCXUxNgkJc3RhdHVzOworCXUxNgkJcGFydG5lcjsKKwl1MTYJCXRscGh5X2N0bDsKKwl1MTYgCQl0bHBoeV9wYXI7CisJdTE2CQl0bHBoeV9pZDEsIHRscGh5X2lkMjsKKwlpbnQgCQlpOworCisJcGh5ID0gcHJpdi0+cGh5W3ByaXYtPnBoeU51bV07CisKKwlkYXRhID0gVExBTl9ORVRfQ01EX05SRVNFVCB8IFRMQU5fTkVUX0NNRF9OV1JBUDsKKwlpZiAoIHByaXYtPnRsYW5GdWxsRHVwbGV4ICkgeworCQlkYXRhIHw9IFRMQU5fTkVUX0NNRF9EVVBMRVg7CisJfQorCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfQ01ELCBkYXRhICk7CisJZGF0YSA9IFRMQU5fTkVUX01BU0tfTUFTSzQgfCBUTEFOX05FVF9NQVNLX01BU0s1OyAKKwlpZiAoIHByaXYtPnBoeU51bSA9PSAwICkgeworCQlkYXRhIHw9IFRMQU5fTkVUX01BU0tfTUFTSzc7IAorCX0KKwlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX01BU0ssIGRhdGEgKTsKKwlUTGFuX0Rpb1dyaXRlMTYoIGRldi0+YmFzZV9hZGRyLCBUTEFOX01BWF9SWCwgKCgxNTM2KSs3KSZ+NyApOworCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fSURfSEksICZ0bHBoeV9pZDEgKTsKKwlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0lEX0xPLCAmdGxwaHlfaWQyICk7CisJCisJaWYgKCAoIHByaXYtPmFkYXB0ZXItPmZsYWdzICYgVExBTl9BREFQVEVSX1VOTUFOQUdFRF9QSFkgKSB8fCAoIHByaXYtPmF1aSApICkgeworCQlzdGF0dXMgPSBNSUlfR1NfTElOSzsKKwkJcHJpbnRrKCAiVExBTjogICVzOiBMaW5rIGZvcmNlZC5cbiIsIGRldi0+bmFtZSApOworCX0gZWxzZSB7CisJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fU1RTLCAmc3RhdHVzICk7CisJCXVkZWxheSggMTAwMCApOworCQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX1NUUywgJnN0YXR1cyApOworCQlpZiAoIChzdGF0dXMgJiBNSUlfR1NfTElOSykgJiYJIC8qIFdlIG9ubHkgc3VwcG9ydCBsaW5rIGluZm8gb24gTmF0LlNlbS4gUEhZJ3MgKi8gCisJCQkodGxwaHlfaWQxID09IE5BVF9TRU1fSUQxKSAmJgorCQkJKHRscGh5X2lkMiA9PSBOQVRfU0VNX0lEMikgKSB7CisJCQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfQU5fTFBBLCAmcGFydG5lciApOworCQkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgVExBTl9UTFBIWV9QQVIsICZ0bHBoeV9wYXIgKTsKKwkJCQorCQkJcHJpbnRrKCAiVExBTjogJXM6IExpbmsgYWN0aXZlIHdpdGggIiwgZGV2LT5uYW1lICk7CisJCQlpZiAoISh0bHBoeV9wYXIgJiBUTEFOX1BIWV9BTl9FTl9TVEFUKSkgeworCQkJICAgICAgCSBwcmludGsoICJmb3JjZWQgMTAlc01icHMgJXMtRHVwbGV4XG4iLCAKKwkJCQkJCXRscGh5X3BhciAmIFRMQU5fUEhZX1NQRUVEXzEwMCA/ICIiIDogIjAiLAorCQkJCQkJdGxwaHlfcGFyICYgVExBTl9QSFlfRFVQTEVYX0ZVTEwgPyAiRnVsbCIgOiAiSGFsZiIpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoICJBdXRvTmVnb3RpYXRpb24gZW5hYmxlZCwgYXQgMTAlc01icHMgJXMtRHVwbGV4XG4iLAorCQkJCQkJdGxwaHlfcGFyICYgVExBTl9QSFlfU1BFRURfMTAwID8gIiIgOiAiMCIsCisJCQkJCQl0bHBoeV9wYXIgJiBUTEFOX1BIWV9EVVBMRVhfRlVMTCA/ICJGdWxsIiA6ICJIYWxmIik7CisJCQkJcHJpbnRrKCJUTEFOOiBQYXJ0bmVyIGNhcGFiaWxpdHk6ICIpOworCQkJCQlmb3IgKGkgPSA1OyBpIDw9IDEwOyBpKyspCisJCQkJCQlpZiAocGFydG5lciAmICgxPDxpKSkKKwkJCQkJCQlwcmludGsoIiVzIiwgbWVkaWFbaS01XSk7CisJCQkJCQkJcHJpbnRrKCJcbiIpOworCQkJfQorCisJCQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTEVEX1JFRywgVExBTl9MRURfTElOSyApOworI2lmZGVmIE1PTklUT1IJCQkKKwkJCS8qIFdlIGhhdmUgbGluayBiZWF0Li5mb3Igbm93IGFueXdheSAqLworCSAgICAgICAgCXByaXYtPmxpbmsgPSAxOworCSAgICAgICAgCS8qRW5hYmxpbmcgbGluayBiZWF0IG1vbml0b3JpbmcgKi8KKwkJCVRMYW5fU2V0VGltZXIoIGRldiwgKDEwKkhaKSwgVExBTl9USU1FUl9MSU5LX0JFQVQgKTsKKyNlbmRpZiAKKwkJfSBlbHNlIGlmIChzdGF0dXMgJiBNSUlfR1NfTElOSykgIHsKKwkJCXByaW50ayggIlRMQU46ICVzOiBMaW5rIGFjdGl2ZVxuIiwgZGV2LT5uYW1lICk7CisJCQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTEVEX1JFRywgVExBTl9MRURfTElOSyApOworCQl9CisJfQorCisJaWYgKCBwcml2LT5waHlOdW0gPT0gMCApIHsKKyAgICAgICAgCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIFRMQU5fVExQSFlfQ1RMLCAmdGxwaHlfY3RsICk7CisgICAgICAgIAl0bHBoeV9jdGwgfD0gVExBTl9UQ19JTlRFTjsKKyAgICAgICAgCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBUTEFOX1RMUEhZX0NUTCwgdGxwaHlfY3RsICk7CisgICAgICAgIAlzaW8gPSBUTGFuX0Rpb1JlYWQ4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfU0lPICk7CisgICAgICAgIAlzaW8gfD0gVExBTl9ORVRfU0lPX01JTlRFTjsKKyAgICAgICAgCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfU0lPLCBzaW8gKTsKKwl9CisKKwlpZiAoIHN0YXR1cyAmIE1JSV9HU19MSU5LICkgeworCQlUTGFuX1NldE1hYyggZGV2LCAwLCBkZXYtPmRldl9hZGRyICk7CisJCXByaXYtPnBoeU9ubGluZSA9IDE7CisJCW91dGIoICggVExBTl9IQ19JTlRfT04gPj4gOCApLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQgKyAxICk7CisJCWlmICggZGVidWcgPj0gMSAmJiBkZWJ1ZyAhPSBUTEFOX0RFQlVHX1BST0JFICkgeworCQkJb3V0YiggKCBUTEFOX0hDX1JFUV9JTlQgPj4gOCApLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQgKyAxICk7CisJCX0KKwkJb3V0bCggdmlydF90b19idXMoIHByaXYtPnJ4TGlzdCApLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fQ0hfUEFSTSApOworCQlvdXRsKCBUTEFOX0hDX0dPIHwgVExBTl9IQ19SVCwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EICk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCAiVExBTjogJXM6IExpbmsgaW5hY3RpdmUsIHdpbGwgcmV0cnkgaW4gMTAgc2Vjcy4uLlxuIiwgZGV2LT5uYW1lICk7CisJCVRMYW5fU2V0VGltZXIoIGRldiwgKDEwKkhaKSwgVExBTl9USU1FUl9GSU5JU0hfUkVTRVQgKTsKKwkJcmV0dXJuOworCX0KKworfSAvKiBUTGFuX0ZpbmlzaFJlc2V0ICovCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9TZXRNYWMKKwkgKgorCSAqCVJldHVybnM6CisJICoJCU5vdGhpbmcKKwkgKglQYXJtczoKKwkgKgkJZGV2CVBvaW50ZXIgdG8gZGV2aWNlIHN0cnVjdHVyZSBvZiBhZGFwdGVyCisJICoJCQlvbiB3aGljaCB0byBjaGFuZ2UgdGhlIEFSRUcuCisJICoJCWFyZWcJVGhlIEFSRUcgdG8gc2V0IHRoZSBhZGRyZXNzIGluICgwIC0gMykuCisJICoJCW1hYwlBIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY2hhcnMuICBFYWNoCisJICoJCQllbGVtZW50IHN0b3JlcyBvbmUgYnl0ZSBvZiB0aGUgYWRkcmVzcy4KKwkgKgkJCUlFLCBpdCBpc24ndCBpbiBhc2NpaS4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gdHJhbnNmZXJzIGEgTUFDIGFkZHJlc3MgdG8gb25lIG9mIHRoZQorCSAqCVRMQU4gQVJFR3MgKGFkZHJlc3MgcmVnaXN0ZXJzKS4gIFRoZSBUTEFOIGNoaXAgbG9ja3MKKwkgKgl0aGUgcmVnaXN0ZXIgb24gd3JpdGluZyB0byBvZmZzZXQgMCBhbmQgdW5sb2NrcyB0aGUKKwkgKglyZWdpc3RlciBhZnRlciB3cml0aW5nIHRvIG9mZnNldCA1LiAgSWYgTlVMTCBpcyBwYXNzZWQKKwkgKglpbiBtYWMsIHRoZW4gdGhlIEFSRUcgaXMgZmlsbGVkIHdpdGggMCdzLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fU2V0TWFjKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYXJlZywgY2hhciAqbWFjICkKK3sKKwlpbnQgaTsKKwkJCQorCWFyZWcgKj0gNjsKKworCWlmICggbWFjICE9IE5VTEwgKSB7CisJCWZvciAoIGkgPSAwOyBpIDwgNjsgaSsrICkKKwkJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9BUkVHXzAgKyBhcmVnICsgaSwgbWFjW2ldICk7CisJfSBlbHNlIHsKKwkJZm9yICggaSA9IDA7IGkgPCA2OyBpKysgKQorCQkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0FSRUdfMCArIGFyZWcgKyBpLCAwICk7CisJfQorCit9IC8qIFRMYW5fU2V0TWFjICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0Ym9vdC90dWxpcC5jIGIvbmV0Ym9vdC90dWxpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ODRlYTcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L3R1bGlwLmMKQEAgLTAsMCArMSwxOTg5IEBACisvKiAtKi0gTW9kZTpDOyBjLWJhc2ljLW9mZnNldDo0OyAtKi0gKi8KKworLyoKKyAgVHVsaXAgYW5kIGNsb25lIEV0aGVyYm9vdCBEcml2ZXIKKworICBCeSBNYXJ0eSBDb25ub3IgKG1kY0B0aGluZ3Vpbi5vcmcpCisgIENvcHlyaWdodCAoQykgMjAwMSBFbnRpdHkgQ3liZXIsIEluYy4KKworICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgIG9mIHRoZSBHTlUgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisgIEFzIG9mIEFwcmlsIDIwMDEgdGhpcyBkcml2ZXIgc2hvdWxkIHN1cHBvcnQgbW9zdCB0dWxpcCBjYXJkcyB0aGF0IAorICB0aGUgTGludXggdHVsaXAgZHJpdmVyIHN1cHBvcnRzIGJlY2F1c2UgRG9uYWxkIEJlY2tlcidzIExpbnV4IG1lZGlhIAorICBkZXRlY3Rpb24gY29kZSBpcyBub3cgaW5jbHVkZWQuCisKKyAgQmFzZWQgb24gS2VuIFlhcCdzIFR1bGlwIEV0aGVyYm9vdCBEcml2ZXIgYW5kIERvbmFsZCBCZWNrZXIncworICBMaW51eCBUdWxpcCBEcml2ZXIuIFN1cHBvcnRzIE4tV2F5IHNwZWVkIGF1dG8tY29uZmlndXJhdGlvbiBvbgorICBNWDk4NzE1LCBNWDk4NzE1QSBhbmQgTVg5ODcyNS4gU3VwcG9ydCBpbmV4cGVuc2l2ZSBQQ0kgMTAvMTAwIGNhcmRzCisgIGJhc2VkIG9uIHRoZSBNYWNyb25peCBNWDk4N3g1IGNoaXAsIHN1Y2ggYXMgdGhlIFNPSE93YXJlIEZhc3QKKyAgbW9kZWwgU0ZBMTEwQSwgYW5kIHRoZSBMaW5rU1lTIG1vZGVsIExORTEwMFRYLiBUaGUgTmV0R2VhcgorICBtb2RlbCBGQTMxMFgsIGJhc2VkIG9uIHRoZSBMQzgyQzE2OCBjaGlwIGlzIHN1cHBvcnRlZC4KKyAgVGhlIFRSRU5EbmV0IFRFMTAwLVBDSUEgTklDIHdoaWNoIHVzZXMgYSBnZW51aW5lIEludGVsIDIxMTQzLVBECisgIGNoaXBzZXQgaXMgc3VwcG9ydGVkLiBBbHNvLCBEYXZpY29tIERNOTEwMidzLgorCisgIERvY3VtZW50YXRpb24gYW5kIHNvdXJjZSBjb2RlIHVzZWQ6CisgIFNvdXJjZSBmb3IgRXRoZXJib290IGRyaXZlciBhdAorICBodHRwOi8vZXRoZXJib290LnNvdXJjZWZvcmdlLm5ldC8KKyAgTVg5ODcxNUEgRGF0YSBTaGVldCBhbmQgTVg5ODcxNUEgQXBwbGljYXRpb24gTm90ZQorICBvbiBodHRwOi8vd3d3Lm1hY3Jvbml4LmNvbS8gIChQREYgZm9ybWF0IGZpbGVzKQorICBTb3VyY2UgZm9yIExpbnV4IHR1bGlwIGRyaXZlciBhdAorICBodHRwOi8vY2VzZGlzLmdzZmMubmFzYS5nb3YvbGludXgvZHJpdmVycy90dWxpcC5odG1sCisKKyAgQWRhcHRlZCBieSBLZW4gWWFwIGZyb20KKyAgRnJlZUJTRCBuZXRib290IERFQyAyMTE0MyBkcml2ZXIKKyAgQXV0aG9yOiBEYXZpZCBTaGFycAorICBkYXRlOiBOb3YvOTgKKworICBTb21lIGNvZGUgZnJhZ21lbnRzIHdlcmUgdGFrZW4gZnJvbSB2ZXJpb3VzIHBsYWNlcywgS2VuIFlhcCdzCisgIGV0aGVyYm9vdCwgRnJlZUJTRCdzIGlmX2RlLmMsIGFuZCB2YXJpb3VzIExpbnV4IHJlbGF0ZWQgZmlsZXMuCisgIERFQydzIG1hbnVhbHMgZm9yIHRoZSAyMTE0MyBhbmQgU1JPTSBmb3JtYXQgd2VyZSB2ZXJ5IGhlbHBmdWwuCisgIFRoZSBMaW51eCBkZSBkcml2ZXIgZGV2ZWxvcG1lbnQgcGFnZSBoYXMgYSBudW1iZXIgb2YgbGlua3MgdG8KKyAgdXNlZnVsIHJlbGF0ZWQgaW5mb3JtYXRpb24uICBIYXZlIGEgbG9vayBhdDoKKyAgZnRwOi8vY2VzZGlzLmdzZmMubmFzYS5nb3YvcHViL2xpbnV4L2RyaXZlcnMvdHVsaXAtZGV2ZWwuaHRtbAorKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJldmlzaW9uIEhpc3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICAxMSBBcHIgMjAwMSAgbWRjICAgICBbcGF0Y2ggdG8gZXRoZXJib290IDQuNy4yNF0KKyAgICAgTWFqb3IgcmV3cml0ZSB0byBpbmNsdWRlIExpbnV4IHR1bGlwIGRyaXZlciBtZWRpYSBkZXRlY3Rpb24KKyAgICAgY29kZS4gIFRoaXMgZHJpdmVyIHNob3VsZCBzdXBwb3J0IGEgbG90IG1vcmUgY2FyZHMgbm93LgorICAxNiBKdWwgMjAwMCAgbWRjICAgICAwLjc1YjExCisgICAgIEFkZGVkIHN1cHBvcnQgZm9yIEFETXRlayAwOTg1IENlbnRhdXItUCwgYSAiQ29tZXQiIHR1bGlwIGNsb25lCisgICAgIHdoaWNoIGlzIHVzZWQgb24gdGhlIExpbmtTWVMgTE5FMTAwVFggdjQueCBjYXJkcy4gIFdlIGFscmVhZHkKKyAgICAgc3VwcG9ydCBMTkUxMDBUWCB2Mi4wIGNhcmRzLCB3aGljaCB1c2UgYSBkaWZmZXJlbnQgY29udHJvbGxlci4KKyAgMDQgSnVsIDIwMDAgICBqYW0gICAgID8KKyAgICAgQWRkZWQgdGVzdCBvZiBzdGF0dXMgYWZ0ZXIgcmVjZWl2aW5nIGEgcGFja2V0IGZyb20gdGhlIGNhcmQuCisgICAgIEFsc28gdW5jb21tZW50ZWQgdGhlIHR1bGlwX2Rpc2FibGUgcm91dGluZS4gIFN0cmF5IHBhY2tldHMKKyAgICAgc2VlbWVkIHRvIGJlIGNhdXNpbmcgcHJvYmxlbXMuCisgIDI3IEFwciAyMDAwICAgbmpsICAgICA/CisgIDI5IEZlYiAyMDAwICAgbWRjICAgICAwLjc1YjcKKyAgICAgSW5jcmVhc2VkIHJlc2V0IGRlbGF5IHRvIDMgc2Vjb25kcyBiZWNhdXNlIE1hY3Jvbml4IGNhcmRzIHNlZW0gdG8KKyAgICAgbmVlZCBtb3JlIHJlc2V0IHRpbWUgYmVmb3JlIGNhcmQgY29tZXMgYmFjayB0byBhIHVzYWJsZSBzdGF0ZS4KKyAgMjYgRmViIDIwMDAgICBtZGMgICAgIDAuNzViNgorICAgICBBZGRlZCBhIDEgc2Vjb25kIGRlbGF5IGFmdGVyIGluaXRpYWxpemluZyB0aGUgdHJhbnNtaXR0ZXIgYmVjYXVzZQorICAgICBzb21lIGNhcmRzIHNlZW0gdG8gbmVlZCB0aGUgdGltZSBvciB0aGV5IGRyb3AgdGhlIGZpcnN0IHBhY2tldCAKKyAgICAgdHJhbnNtaXR0ZWQuCisgIDIzIEZlYiAyMDAwICAgbWRjICAgICAwLjc1YjUKKyAgICAgcmVtb3ZlZCB1ZGVsYXkgY29kZSBhbmQgdXNlZCBjdXJydGlja3MoKSBmb3IgbW9yZSByZWxpYWJsZSBkZWxheQorICAgICBjb2RlIGluIHJlc2V0IHBhdXNlIGFuZCBzYW5pdHkgdGltZW91dHMuICBBZGRlZCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIGFuZCBUWCBkZWJ1Z2dpbmcgY29kZS4KKyAgMjEgRmViIDIwMDAgICBtZGMgICAgIHBhdGNoIHRvIEV0aGVyYm9vdCA0LjQuMworICAgICBJbmNvcnBvcmF0ZWQgcGF0Y2hlcyBmcm9tIEJvYiBFZHdhcmRzIGFuZCBQYXVsIE1hY2tlcnJhcyBvZiAKKyAgICAgTGludXhjYXJlJ3MgT1pMYWJzIHRvIGRlYWwgd2l0aCBpbmVmZmljaWVuY2llcyBpbiB0dWxpcF90cmFuc21pdAorICAgICBhbmQgdWRlbGF5LiAgV2Ugbm93IHdhaXQgZm9yIHBhY2tldCB0cmFuc21pc3Npb24gdG8gY29tcGxldGUKKyAgICAgKG9yIHNhbml0eSB0aW1lb3V0KS4KKyAgMDQgRmViIDIwMDAgICBSb2JlcnQuRWR3YXJkc0BhbnUuZWR1LmF1IHBhdGNoIHRvIEV0aGVyYm9vdCA0LjQuMgorICAgICBwYXRjaCB0byB0dWxpcC5jIHRoYXQgaW1wbGVtZW50cyB0aGUgYXV0b21hdGljIHNlbGVjdGlvbiBvZiB0aGUgTUlJCisgICAgIGludGVyZmFjZSBvbiBjYXJkcyB1c2luZyB0aGUgSW50ZWwvREVDIDIxMTQzIHJlZmVyZW5jZSBkZXNpZ24sIGluCisgICAgIHBhcnRpY3VsYXIsIHRoZSBUUkVORG5ldCBURTEwMC1QQ0lBIE5JQyB3aGljaCB1c2VzIGEgZ2VudWluZSBJbnRlbAorICAgICAyMTE0My1QRCBjaGlwc2V0LgorICAxMSBKYW4gMjAwMCAgIG1kYyAgICAgMC43NWI0CisgICAgIEFkZGVkIHN1cHBvcnQgZm9yIE5ldEdlYXIgRkEzMTBUWCBjYXJkIGJhc2VkIG9uIHRoZSBMQzgyQzE2OAorICAgICBjaGlwLiAgVGhpcyBzaG91bGQgYWxzbyBzdXBwb3J0IExpdGUtT24gTEM4MkMxNjggYm9hcmRzLgorICAgICBBZGRlZCBzaW1wbGUgTUlJIHN1cHBvcnQuIFJlLWFycmFuZ2VkIGNvZGUgdG8gYmV0dGVyIG1vZHVsYXJpemUKKyAgICAgaW5pdGlhbGl6YXRpb25zLgorICAwNCBEZWMgMTk5OSAgIG1kYyAgICAgMC43NWIzCisgICAgIEFkZGVkIHByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIExORTEwMFRYIFBDSSBjYXJkcy4gIFNob3VsZCB3b3JrIGZvcgorICAgICBQTklDMiBjYXJkcy4gTm8gTUlJIHN1cHBvcnQsIGJ1dCBzaW5nbGUgaW50ZXJmYWNlIChSSjQ1KSB0dWxpcAorICAgICBjYXJkcyBzZWVtIHRvIG5vdCBjYXJlLgorICAwMyBEZWMgMTk5OSAgIG1kYyAgICAgMC43NWIyCisgICAgIFJlbmFtZWQgZnJvbSBteDk4N3g1IHRvIHR1bGlwLCBtZXJnZWQgaW4gb3JpZ2luYWwgdHVsaXAgaW5pdCBjb2RlCisgICAgIGZyb20gdHVsaXAuYyB0byBzdXBwb3J0IG90aGVyIHR1bGlwIGNvbXBhdGlibGUgY2FyZHMuCisgIDAyIERlYyAxOTk5ICAgbWRjICAgICAwLjc1YjEKKyAgICAgUmVsZWFzZWQgQmV0YSBNWDk4N3g1IERyaXZlciBmb3IgY29kZSByZXZpZXcgYW5kIHRlc3RpbmcgdG8gbmV0Ym9vdAorICAgICBhbmQgdGhpbmd1aW4gbWFpbGluZyBsaXN0cy4KKyovCisKKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZWNsYXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImV0aGVyYm9vdC5oIgorI2luY2x1ZGUgIm5pYy5oIgorI2luY2x1ZGUgInBjaS5oIgorI2luY2x1ZGUgImNhcmRzLmgiCisKKy8qIFVzZXIgc2V0dGFibGUgcGFyYW1ldGVycyAqLworCisjdW5kZWYgICBUVUxJUF9ERUJVRworI3VuZGVmICAgVFVMSVBfREVCVUdfV0hFUkUKK3N0YXRpYyBpbnQgdHVsaXBfZGVidWcgPSAyOyAgICAgICAgICAgICAvKiAxIG5vcm1hbCBtZXNzYWdlcywgMCBxdWlldCAuLiA3IHZlcmJvc2UuICovCisKKyNkZWZpbmUgVFhfVElNRV9PVVQgICAgICAgMipUSUNLU19QRVJfU0VDCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgdTg7Cit0eXBlZGVmICAgc2lnbmVkIGNoYXIgIHM4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1MTY7Cit0eXBlZGVmICAgc2lnbmVkIHNob3J0IHMxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgdTMyOwordHlwZWRlZiAgIHNpZ25lZCBpbnQgICBzMzI7CisKKy8qIGhlbHBmdWwgbWFjcm9zIGlmIG9uIGEgYmlnX2VuZGlhbiBtYWNoaW5lIGZvciBjaGFuZ2luZyBieXRlIG9yZGVyLgorICAgbm90IHN0cmljdGx5IG5lZWRlZCBvbiBJbnRlbCAqLworI2RlZmluZSBsZTE2X3RvX2NwdSh2YWwpICh2YWwpCisjZGVmaW5lIGNwdV90b19sZTMyKHZhbCkgKHZhbCkKKyNkZWZpbmUgZ2V0X3VuYWxpZ25lZChwdHIpICgqKHB0cikpCisjZGVmaW5lIHB1dF91bmFsaWduZWQodmFsLCBwdHIpICgodm9pZCkoICoocHRyKSA9ICh2YWwpICkpCisjZGVmaW5lIGdldF91MTYocHRyKSAoKih1MTYgKikocHRyKSkKKyNkZWZpbmUgdmlydF90b19idXMoeCkgKCh1bnNpZ25lZCBsb25nKXgpCisjZGVmaW5lIHZpcnRfdG9fbGUzMmRlc2MoYWRkcikgIHZpcnRfdG9fYnVzKGFkZHIpCisKKyNkZWZpbmUgVFVMSVBfSU9UWVBFICBQQ0lfVVNFU19NQVNURVIgfCBQQ0lfVVNFU19JTyB8IFBDSV9BRERSMAorI2RlZmluZSBUVUxJUF9TSVpFIDB4ODAKKworLyogVGhpcyBpcyBhIG15c3RlcmlvdXMgdmFsdWUgdGhhdCBjYW4gYmUgd3JpdHRlbiB0byBDU1IxMSBpbiB0aGUgMjEwNDAgKG9ubHkpCisgICB0byBzdXBwb3J0IGEgcHJlLU5XYXkgZnVsbC1kdXBsZXggc2lnbmFsaW5nIG1lY2hhbmlzbSB1c2luZyBzaG9ydCBmcmFtZXMuCisgICBObyBvbmUga25vd3Mgd2hhdCBpdCBzaG91bGQgYmUsIGJ1dCBpZiBsZWZ0IGF0IGl0cyBkZWZhdWx0IHZhbHVlIHNvbWUKKyAgIDEwYmFzZTIoISkgcGFja2V0cyB0cmlnZ2VyIGEgZnVsbC1kdXBsZXgtcmVxdWVzdCBpbnRlcnJ1cHQuICovCisjZGVmaW5lIEZVTExfRFVQTEVYX01BR0lDICAgICAgIDB4Njk2OQorCitzdGF0aWMgY29uc3QgaW50IGNzcjAgPSAweDAxQTAwMDAwIHwgMHg4MDAwOworCisvKiAgVGhlIHBvc3NpYmxlIG1lZGlhIHR5cGVzIHRoYXQgY2FuIGJlIHNldCBpbiBvcHRpb25zW10gYXJlOiAqLworI2RlZmluZSBNRURJQV9NQVNLIDMxCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1lZGlhbmFtZVszMl0gPSB7CisgICAgIjEwYmFzZVQiLCAiMTBiYXNlMiIsICJBVUkiLCAiMTAwYmFzZVR4IiwKKyAgICAiMTBiYXNlVC1GRFgiLCAiMTAwYmFzZVR4LUZEWCIsICIxMDBiYXNlVDQiLCAiMTAwYmFzZUZ4IiwKKyAgICAiMTAwYmFzZUZ4LUZEWCIsICJNSUkgMTBiYXNlVCIsICJNSUkgMTBiYXNlVC1GRFgiLCAiTUlJIiwKKyAgICAiMTBiYXNlVChmb3JjZWQpIiwgIk1JSSAxMDBiYXNlVHgiLCAiTUlJIDEwMGJhc2VUeC1GRFgiLCAiTUlJIDEwMGJhc2VUNCIsCisgICAgIk1JSSAxMDBiYXNlRngtSERYIiwgIk1JSSAxMDBiYXNlRngtRkRYIiwgIkhvbWUtUE5BIDFNYnBzIiwgIkludmFsaWQtMTkiLAorfTsKKworLyogVGhpcyBtdWNoIG1hdGNoIHR1bGlwX3RibFtdISAgTm90ZSAyMTE0MiA9PSAyMTE0My4gKi8KK2VudW0gdHVsaXBfY2hpcHMgeworICAgIERDMjEwNDA9MCwgREMyMTA0MT0xLCBEQzIxMTQwPTIsIERDMjExNDI9MywgREMyMTE0Mz0zLAorICAgIExDODJDMTY4LCBNWDk4NzEzLCBNWDk4NzE1LCBNWDk4NzI1LCBBWDg4MTQxLCBBWDg4MTQwLCBQTklDMiwgQ09NRVQsCisgICAgQ09NUEVYOTg4MSwgSTIxMTQ1LCBYSVJDT00KK307CisKK2VudW0gcGNpX2lkX2ZsYWdzX2JpdHMgeworICAgIC8qIFNldCBQQ0kgY29tbWFuZCByZWdpc3RlciBiaXRzIGJlZm9yZSBjYWxsaW5nIHByb2JlMSgpLiAqLworICAgIFBDSV9VU0VTX0lPPTEsIFBDSV9VU0VTX01FTT0yLCBQQ0lfVVNFU19NQVNURVI9NCwKKyAgICAvKiBSZWFkIGFuZCBtYXAgdGhlIHNpbmdsZSBmb2xsb3dpbmcgUENJIEJBUi4gKi8KKyAgICBQQ0lfQUREUjA9MDw8NCwgUENJX0FERFIxPTE8PDQsIFBDSV9BRERSMj0yPDw0LCBQQ0lfQUREUjM9Mzw8NCwKKyAgICBQQ0lfQUREUl82NEJJVFM9MHgxMDAsIFBDSV9OT19BQ1BJX1dBS0U9MHgyMDAsIFBDSV9OT19NSU5fTEFURU5DWT0weDQwMCwKKyAgICBQQ0lfVU5VU0VEX0lSUT0weDgwMCwKK307CisKK3N0cnVjdCBwY2lfaWRfaW5mbyB7CisgICAgY2hhciAqbmFtZTsKKyAgICBzdHJ1Y3QgbWF0Y2hfaW5mbyB7CisgICAgICAgIHUzMiBwY2ksIHBjaV9tYXNrLCBzdWJzeXN0ZW0sIHN1YnN5c3RlbV9tYXNrOworICAgICAgICB1MzIgcmV2aXNpb24sIHJldmlzaW9uX21hc2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9ubHkgOCBiaXRzLiAqLworICAgIH0gaWQ7CisgICAgZW51bSBwY2lfaWRfZmxhZ3NfYml0cyBwY2lfZmxhZ3M7CisgICAgaW50IGlvX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZWVkZWQgZm9yIEkvTyByZWdpb24gY2hlY2sgb3IgaW9yZW1hcCgpLiAqLworICAgIGludCBkcnZfZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRHJpdmVyIHVzZSwgaW50ZW5kZWQgYXMgY2FwYWJpbGl0eSBmbGFncy4gKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2lkX2luZm8gcGNpX2lkX3RibFtdID0geworICAgIHsgIkRpZ2l0YWwgREMyMTA0MCBUdWxpcCIsIHsgMHgwMDAyMTAxMSwgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMCB9LAorICAgICAgVFVMSVBfSU9UWVBFLCAweDgwLCBEQzIxMDQwIH0sCisgICAgeyAiRGlnaXRhbCBEQzIxMDQxIFR1bGlwIiwgeyAweDAwMTQxMDExLCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwIH0sCisgICAgICBUVUxJUF9JT1RZUEUsIDB4ODAsIERDMjEwNDEgfSwKKyAgICB7ICJEaWdpdGFsIERTMjExNDBBIFR1bGlwIiwgeyAweDAwMDkxMDExLCAweGZmZmZmZmZmLCAwLDAsIDB4MjAsMHhmMCB9LAorICAgICAgVFVMSVBfSU9UWVBFLCAweDgwLCBEQzIxMTQwIH0sCisgICAgeyAiRGlnaXRhbCBEUzIxMTQwIFR1bGlwIiwgeyAweDAwMDkxMDExLCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwIH0sCisgICAgICBUVUxJUF9JT1RZUEUsIDB4ODAsIERDMjExNDAgfSwKKyAgICB7ICJEaWdpdGFsIERTMjExNDMgVHVsaXAiLCB7IDB4MDAxOTEwMTEsIDB4ZmZmZmZmZmYsIDAsMCwgNjUsMHhmZiB9LAorICAgICAgVFVMSVBfSU9UWVBFLCBUVUxJUF9TSVpFLCBEQzIxMTQyIH0sCisgICAgeyAiRGlnaXRhbCBEUzIxMTQyIFR1bGlwIiwgeyAweDAwMTkxMDExLCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwIH0sCisgICAgICBUVUxJUF9JT1RZUEUsIFRVTElQX1NJWkUsIERDMjExNDIgfSwKKyAgICB7ICJLaW5nc3RvbiBLTkUxMTB0eCAoUE5JQykiLCB7IDB4MDAwMjExQUQsIDB4ZmZmZmZmZmYsIDB4ZjAwMjI2NDYsIDB4ZmZmZmZmZmYsIDAsIDAgfSwKKyAgICAgIFRVTElQX0lPVFlQRSwgMjU2LCBMQzgyQzE2OCB9LAorICAgIHsgIkxpdGUtT24gODJjMTY4IFBOSUMiLCB7IDB4MDAwMjExQUQsIDB4ZmZmZmZmZmYsIDAsIDAsIDAsIDAgfSwKKyAgICAgIFRVTElQX0lPVFlQRSwgMjU2LCBMQzgyQzE2OCB9LAorICAgIHsgIk1hY3Jvbml4IDk4NzEzIFBNQUMiLCB7IDB4MDUxMjEwZDksIDB4ZmZmZmZmZmYsIDAsIDAsIDAsIDAgfSwKKyAgICAgIFRVTElQX0lPVFlQRSwgMjU2LCBNWDk4NzEzIH0sCisgICAgeyAiTWFjcm9uaXggOTg3MTUgUE1BQyIsIHsgMHgwNTMxMTBkOSwgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMCB9LAorICAgICAgVFVMSVBfSU9UWVBFLCAyNTYsIE1YOTg3MTUgfSwKKyAgICB7ICJNYWNyb25peCA5ODcyNSBQTUFDIiwgeyAweDA1MzExMGQ5LCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwIH0sCisgICAgICBUVUxJUF9JT1RZUEUsIDI1NiwgTVg5ODcyNSB9LAorICAgIHsgIkFTSVggQVg4ODE0MSIsIHsgMHgxNDAwMTI1QiwgMHhmZmZmZmZmZiwgMCwwLCAweDEwLCAweGYwIH0sCisgICAgICBUVUxJUF9JT1RZUEUsIDEyOCwgQVg4ODE0MSB9LAorICAgIHsgIkFTSVggQVg4ODE0MCIsIHsgMHgxNDAwMTI1QiwgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMCB9LAorICAgICAgVFVMSVBfSU9UWVBFLCAxMjgsIEFYODgxNDAgfSwKKyAgICB7ICJMaXRlLU9uIExDODJDMTE1IFBOSUMtSUkiLCB7IDB4YzExNTExQUQsIDB4ZmZmZmZmZmYsIDAsIDAsIDAsIDAgfSwKKyAgICAgIFRVTElQX0lPVFlQRSwgMjU2LCBQTklDMiB9LAorICAgIHsgIkFETXRlayBBTjk4MSBDb21ldCIsIHsgMHgwOTgxMTMxNywgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMCB9LAorICAgICAgVFVMSVBfSU9UWVBFLCAyNTYsIENPTUVUIH0sCisgICAgeyAiQURNdGVrIENlbnRhdXItUCIsIHsgMHgwOTg1MTMxNywgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMCB9LAorICAgICAgVFVMSVBfSU9UWVBFLCAyNTYsIENPTUVUIH0sCisgICAgeyAiQURNdGVrIENlbnRhdXItQyIsIHsgMHgxOTg1MTMxNywgMHhmZmZmZmZmZiwgMCwgMCwgMCwgMCB9LAorICAgICAgVFVMSVBfSU9UWVBFLCAyNTYsIENPTUVUIH0sCisgICAgeyAiQ29tcGV4IFJMMTAwLVRYIiwgeyAweDk4ODExMUY2LCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwIH0sCisgICAgICBUVUxJUF9JT1RZUEUsIDEyOCwgQ09NUEVYOTg4MSB9LAorICAgIHsgIkludGVsIDIxMTQ1IFR1bGlwIiwgeyAweDAwMzk4MDg2LCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwIH0sCisgICAgICBUVUxJUF9JT1RZUEUsIDEyOCwgSTIxMTQ1IH0sCisgICAgeyAiWGlyY29tIFR1bGlwIGNsb25lIiwgeyAweDAwMDMxMTVkLCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwIH0sCisgICAgICBUVUxJUF9JT1RZUEUsIDEyOCwgWElSQ09NIH0sCisgICAgeyAiRGF2aWNvbSBETTkxMDIiLCB7IDB4OTEwMjEyODIsIDB4ZmZmZmZmZmYsIDAsIDAsIDAsIDAgfSwKKyAgICAgIFRVTElQX0lPVFlQRSwgMHg4MCwgREMyMTE0MCB9LAorICAgIHsgIkRhdmljb20gRE05MTAwIiwgeyAweDkxMDAxMjgyLCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwIH0sCisgICAgICBUVUxJUF9JT1RZUEUsIDB4ODAsIERDMjExNDAgfSwKKyAgICB7ICJNYWNyb25peCBteGljLTk4NzE1IChFTjEyMTcpIiwgeyAweDEyMTcxMTEzLCAweGZmZmZmZmZmLCAwLCAwLCAwLCAwIH0sCisgICAgICBUVUxJUF9JT1RZUEUsIDI1NiwgTVg5ODcxNSB9LAorICAgIHsgMCwgeyAwLCAwLCAwLCAwLCAwLCAwIH0sIDAsIDAsIDAgfSwKK307CisKK2VudW0gdGJsX2ZsYWcgeworICAgIEhBU19NSUk9MSwgSEFTX01FRElBX1RBQkxFPTIsIENTUjEyX0lOX1NST009NCwgQUxXQVlTX0NIRUNLX01JST04LAorICAgIEhBU19QV1JEV049MHgxMCwgTUNfSEFTSF9PTkxZPTB4MjAsIC8qIEhhc2gtb25seSBtdWx0aWNhc3QgZmlsdGVyLiAqLworICAgIEhBU19QTklDTldBWT0weDgwLCBIQVNfTldBWT0weDQwLCAgIC8qIFVzZXMgaW50ZXJuYWwgTldheSB4Y3ZyLiAqLworICAgIEhBU19JTlRSX01JVElHQVRJT049MHgxMDAsIElTX0FTSVg9MHgyMDAsIEhBU184MDIzWD0weDQwMCwKK307CisKKy8qIE5vdGU6IHRoaXMgdGFibGUgbXVzdCBtYXRjaCAgZW51bSB0dWxpcF9jaGlwcyAgYWJvdmUuICovCitzdGF0aWMgc3RydWN0IHR1bGlwX2NoaXBfdGFibGUgeworICAgIGNoYXIgKmNoaXBfbmFtZTsKKyAgICBpbnQgZmxhZ3M7Cit9IHR1bGlwX3RibFtdID0geworICAgIHsgIkRpZ2l0YWwgREMyMTA0MCBUdWxpcCIsIDB9LAorICAgIHsgIkRpZ2l0YWwgREMyMTA0MSBUdWxpcCIsIEhBU19NRURJQV9UQUJMRSB8IEhBU19OV0FZIH0sCisgICAgeyAiRGlnaXRhbCBEUzIxMTQwIFR1bGlwIiwgSEFTX01JSSB8IEhBU19NRURJQV9UQUJMRSB8IENTUjEyX0lOX1NST00gfSwKKyAgICB7ICJEaWdpdGFsIERTMjExNDMgVHVsaXAiLCBIQVNfTUlJIHwgSEFTX01FRElBX1RBQkxFIHwgQUxXQVlTX0NIRUNLX01JSSAKKyAgICAgIHwgSEFTX1BXUkRXTiB8IEhBU19OV0FZICAgfCBIQVNfSU5UUl9NSVRJR0FUSU9OIH0sCisgICAgeyAiTGl0ZS1PbiA4MmMxNjggUE5JQyIsIEhBU19NSUkgfCBIQVNfUE5JQ05XQVkgfSwKKyAgICB7ICJNYWNyb25peCA5ODcxMyBQTUFDIiwgSEFTX01JSSB8IEhBU19NRURJQV9UQUJMRSB8IENTUjEyX0lOX1NST00gfSwKKyAgICB7ICJNYWNyb25peCA5ODcxNSBQTUFDIiwgSEFTX01FRElBX1RBQkxFIH0sCisgICAgeyAiTWFjcm9uaXggOTg3MjUgUE1BQyIsIEhBU19NRURJQV9UQUJMRSB9LAorICAgIHsgIkFTSVggQVg4ODE0MCIsIEhBU19NSUkgfCBIQVNfTUVESUFfVEFCTEUgfCBDU1IxMl9JTl9TUk9NIAorICAgICAgfCBNQ19IQVNIX09OTFkgfCBJU19BU0lYIH0sCisgICAgeyAiQVNJWCBBWDg4MTQxIiwgSEFTX01JSSB8IEhBU19NRURJQV9UQUJMRSB8IENTUjEyX0lOX1NST00gfCBNQ19IQVNIX09OTFkgCisgICAgICB8IElTX0FTSVggfSwKKyAgICB7ICJMaXRlLU9uIFBOSUMtSUkiLCBIQVNfTUlJIHwgSEFTX05XQVkgfCBIQVNfODAyM1ggfSwKKyAgICB7ICJBRE10ZWsgQ29tZXQiLCBNQ19IQVNIX09OTFkgfSwKKyAgICB7ICJDb21wZXggOTg4MSBQTUFDIiwgICAgICAgSEFTX01JSSB8IEhBU19NRURJQV9UQUJMRSB8IENTUjEyX0lOX1NST00gfSwKKyAgICB7ICJJbnRlbCBEUzIxMTQ1IFR1bGlwIiwgSEFTX01JSSB8IEhBU19NRURJQV9UQUJMRSB8IEFMV0FZU19DSEVDS19NSUkgCisgICAgICB8IEhBU19QV1JEV04gfCBIQVNfTldBWSB9LAorICAgIHsgIlhpcmNvbSB0dWxpcCB3b3JrLWFsaWtlIiwgSEFTX01JSSB8IEhBU19NRURJQV9UQUJMRSB8IEFMV0FZU19DSEVDS19NSUkgCisgICAgICB8IEhBU19QV1JEV04gfCBIQVNfTldBWSB9LAorICAgIHsgMCwgMCB9LAorfTsKKworLyogQSBmdWxsLWR1cGxleCBtYXAgZm9yIG1lZGlhIHR5cGVzLiAqLworZW51bSBNZWRpYUlzIHsKKyAgICBNZWRpYUlzRkQgPSAxLCBNZWRpYUFsd2F5c0ZEPTIsIE1lZGlhSXNNSUk9NCwgTWVkaWFJc0Z4PTgsCisgICAgTWVkaWFJczEwMD0xNn07CisKK3N0YXRpYyBjb25zdCBjaGFyIG1lZGlhX2NhcFszMl0gPQorezAsMCwwLDE2LCAgMywxOSwxNiwyNCwgIDI3LDQsNyw1LCAwLDIwLDIzLDIwLCAyMCwzMSwwLDAsIH07CitzdGF0aWMgdTggdDIxMDQwX2NzcjEzW10gPSB7MiwweDBDLDgsNCwgIDQsMCwwLDAsIDAsMCwwLDAsIDQsMCwwLDB9OworCisvKiAyMTA0MSB0cmFuc2NlaXZlciByZWdpc3RlciBzZXR0aW5nczogMTAtVCwgMTAtMiwgQVVJLCAxMC1ULCAxMFQtRkQgKi8KK3N0YXRpYyB1MTYgdDIxMDQxX2NzcjEzW10gPSB7IDB4RUYwMSwgMHhFRjA5LCAweEVGMDksIDB4RUYwMSwgMHhFRjA5LCB9Oworc3RhdGljIHUxNiB0MjEwNDFfY3NyMTRbXSA9IHsgMHhGRkZGLCAweEY3RkQsIDB4RjdGRCwgMHg3RjNGLCAweDdGM0QsIH07CitzdGF0aWMgdTE2IHQyMTA0MV9jc3IxNVtdID0geyAweDAwMDgsIDB4MDAwNiwgMHgwMDBFLCAweDAwMDgsIDB4MDAwOCwgfTsKKworc3RhdGljIHUxNiB0MjExNDJfY3NyMTNbXSA9IHsgMHgwMDAxLCAweDAwMDksIDB4MDAwOSwgMHgwMDAwLCAweDAwMDEsIH07CitzdGF0aWMgdTE2IHQyMTE0Ml9jc3IxNFtdID0geyAweEZGRkYsIDB4MDcwNSwgMHgwNzA1LCAweDAwMDAsIDB4N0YzRCwgfTsKK3N0YXRpYyB1MTYgdDIxMTQyX2NzcjE1W10gPSB7IDB4MDAwOCwgMHgwMDA2LCAweDAwMEUsIDB4MDAwOCwgMHgwMDA4LCB9OworCisvKiBPZmZzZXRzIHRvIHRoZSBDb21tYW5kIGFuZCBTdGF0dXMgUmVnaXN0ZXJzLCAiQ1NScyIuICBBbGwgYWNjZXNzZXMKKyAgIG11c3QgYmUgbG9uZ3dvcmQgaW5zdHJ1Y3Rpb25zIGFuZCBxdWFkd29yZCBhbGlnbmVkLiAqLworZW51bSB0dWxpcF9vZmZzZXRzIHsKKyAgICBDU1IwPTAsICAgICBDU1IxPTB4MDgsICBDU1IyPTB4MTAsICBDU1IzPTB4MTgsICBDU1I0PTB4MjAsICBDU1I1PTB4MjgsCisgICAgQ1NSNj0weDMwLCAgQ1NSNz0weDM4LCAgQ1NSOD0weDQwLCAgQ1NSOT0weDQ4LCBDU1IxMD0weDUwLCBDU1IxMT0weDU4LAorICAgIENTUjEyPTB4NjAsIENTUjEzPTB4NjgsIENTUjE0PTB4NzAsIENTUjE1PTB4NzgsIENTUjE2PTB4ODAsIENTUjIwPTB4QTAKK307CisKKy8qIFRoZSBiaXRzIGluIHRoZSBDU1I1IHN0YXR1cyByZWdpc3RlcnMsIG1vc3RseSBpbnRlcnJ1cHQgc291cmNlcy4gKi8KK2VudW0gc3RhdHVzX2JpdHMgeworICAgIFRpbWVySW50PTB4ODAwLCBUUExua0ZhaWw9MHgxMDAwLCBUUExua1Bhc3M9MHgxMCwKKyAgICBOb3JtYWxJbnRyPTB4MTAwMDAsIEFibm9ybWFsSW50cj0weDgwMDAsCisgICAgUnhKYWJiZXI9MHgyMDAsIFJ4RGllZD0weDEwMCwgUnhOb0J1Zj0weDgwLCBSeEludHI9MHg0MCwKKyAgICBUeEZJRk9VbmRlcmZsb3c9MHgyMCwgVHhKYWJiZXI9MHgwOCwgVHhOb0J1Zj0weDA0LCBUeERpZWQ9MHgwMiwgVHhJbnRyPTB4MDEsCit9OworCitlbnVtIGRlc2Nfc3RhdHVzX2JpdHMgeworICAgIERlc2NPd25kZWQ9MHg4MDAwMDAwMCwgUnhEZXNjRmF0YWxFcnI9MHg4MDAwLCBSeFdob2xlUGt0PTB4MDMwMCwKK307CisKK3N0cnVjdCBtZWRpYWxlYWYgeworICAgIHU4IHR5cGU7CisgICAgdTggbWVkaWE7CisgICAgdW5zaWduZWQgY2hhciAqbGVhZmRhdGE7Cit9OworCitzdHJ1Y3QgbWVkaWF0YWJsZSB7CisgICAgdTE2IGRlZmF1bHRtZWRpYTsKKyAgICB1OCBsZWFmY291bnQsIGNzcjEyZGlyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2VuZXJhbCBwdXJwb3NlIHBpbiBkaXJlY3Rpb25zLiAqLworICAgIHVuc2lnbmVkIGhhc19taWk6MSwgaGFzX25vbm1paToxLCBoYXNfcmVzZXQ6NjsKKyAgICB1MzIgY3NyMTVkaXIsIGNzcjE1dmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjExNDMgTldheSBzZXR0aW5nLiAqLworICAgIHN0cnVjdCBtZWRpYWxlYWYgbWxlYWZbMF07Cit9OworCitzdHJ1Y3QgbWVkaWFpbmZvIHsKKyAgICBzdHJ1Y3QgbWVkaWFpbmZvICpuZXh0OworICAgIGludCBpbmZvX3R5cGU7CisgICAgaW50IGluZGV4OworICAgIHVuc2lnbmVkIGNoYXIgKmluZm87Cit9OworCisvKiBFRVBST00gQWRkcmVzcyB3aWR0aCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBFRVBST01fQUREUkxFTiA2CisjZGVmaW5lIEVFUFJPTV9TSVpFICAgIDEyOCAgICAgICAgICAgICAgLyogMiA8PCBFRVBST01fQUREUkxFTiAqLworCisvKiBUaGUgRUVQUk9NIGNvbW1hbmRzIGluY2x1ZGUgdGhlIGFsd2F5LXNldCBsZWFkaW5nIGJpdC4gKi8KKyNkZWZpbmUgRUVfV1JJVEVfQ01EICAgICg1IDw8IGFkZHJfbGVuKQorI2RlZmluZSBFRV9SRUFEX0NNRCAgICAgKDYgPDwgYWRkcl9sZW4pCisjZGVmaW5lIEVFX0VSQVNFX0NNRCAgICAoNyA8PCBhZGRyX2xlbikKKworLyogRUVQUk9NX0N0cmwgYml0cy4gKi8KKyNkZWZpbmUgRUVfU0hJRlRfQ0xLICAgIDB4MDIgICAgLyogRUVQUk9NIHNoaWZ0IGNsb2NrLiAqLworI2RlZmluZSBFRV9DUyAgICAgICAgICAgMHgwMSAgICAvKiBFRVBST00gY2hpcCBzZWxlY3QuICovCisjZGVmaW5lIEVFX0RBVEFfV1JJVEUgICAweDA0ICAgIC8qIEVFUFJPTSBjaGlwIGRhdGEgaW4uICovCisjZGVmaW5lIEVFX1dSSVRFXzAgICAgICAweDAxCisjZGVmaW5lIEVFX1dSSVRFXzEgICAgICAweDA1CisjZGVmaW5lIEVFX0RBVEFfUkVBRCAgICAweDA4ICAgIC8qIEVFUFJPTSBjaGlwIGRhdGEgb3V0LiAqLworI2RlZmluZSBFRV9FTkIgICAgICAgICAgKDB4NDgwMCB8IEVFX0NTKQorCisvKiBEZWxheSBiZXR3ZWVuIEVFUFJPTSBjbG9jayB0cmFuc2l0aW9ucy4gIEV2ZW4gYXQgMzNNaHogY3VycmVudCBQQ0kKKyAgIGltcGxlbWVudGF0aW9ucyBkb24ndCBvdmVycnVuIHRoZSBFRVBST00gY2xvY2suICBXZSBhZGQgYSBidXMKKyAgIHR1cm4tYXJvdW5kIHRvIGluc3VyZSB0aGF0IHRoaXMgcmVtYWlucyB0cnVlLiAgKi8KKyNkZWZpbmUgZWVwcm9tX2RlbGF5KCkgIGlubChlZV9hZGRyKQorCisvKiBTaXplIG9mIHRyYW5zbWl0IGFuZCByZWNlaXZlIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgQlVGTEVOIDE1MzYKKworLyogUmluZy13cmFwIGZsYWcgaW4gbGVuZ3RoIGZpZWxkLCB1c2UgZm9yIGxhc3QgcmluZyBlbnRyeS4KKyAgIDB4MDEwMDAwMDAgbWVhbnMgY2hhaW4gb24gYnVmZmVyMiBhZGRyZXNzLAorICAgMHgwMjAwMDAwMCBtZWFucyB1c2UgdGhlIHJpbmcgc3RhcnQgYWRkcmVzcyBpbiBDU1IyLzMuCisgICBOb3RlOiBTb21lIHdvcmstYWxpa2UgY2hpcHMgZG8gbm90IGZ1bmN0aW9uIGNvcnJlY3RseSBpbiBjaGFpbmVkIG1vZGUuCisgICBUaGUgQVNJWCBjaGlwIHdvcmtzIG9ubHkgaW4gY2hhaW5lZCBtb2RlLgorICAgVGh1cyB3ZSBpbmRpY2F0ZSByaW5nIG1vZGUsIGJ1dCBhbHdheXMgd3JpdGUgdGhlICduZXh0JyBmaWVsZCBmb3IKKyAgIGNoYWluZWQgbW9kZSBhcyB3ZWxsLiAqLworI2RlZmluZSBERVNDX1JJTkdfV1JBUCAweDAyMDAwMDAwCisKKy8qIHRyYW5zbWl0IGFuZCByZWNlaXZlIGRlc2NyaXB0b3IgZm9ybWF0ICovCitzdHJ1Y3QgdHVsaXBfcnhfZGVzYyB7CisgICAgdm9sYXRpbGUgdTMyIHN0YXR1czsKKyAgICB1MzIgbGVuZ3RoOworICAgIHUzMiBidWZmZXIxLCBidWZmZXIyOworfTsKKworc3RydWN0IHR1bGlwX3R4X2Rlc2MgeworICAgIHZvbGF0aWxlIHUzMiBzdGF0dXM7CisgICAgdTMyIGxlbmd0aDsKKyAgICB1MzIgYnVmZmVyMSwgYnVmZmVyMjsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBHbG9iYWwgU3RvcmFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHUzMiBpb2FkZHI7CisKKy8qIE5vdGU6IHRyYW5zbWl0IGFuZCByZWNlaXZlIGJ1ZmZlcnMgbXVzdCBiZSBsb25nd29yZCBhbGlnbmVkIGFuZAorICAgbG9uZ3dvcmQgZGl2aXNhYmxlICovCisKKyNkZWZpbmUgVFhfUklOR19TSVpFCTIKK3N0YXRpYyBzdHJ1Y3QgdHVsaXBfdHhfZGVzYyB0eF9yaW5nW1RYX1JJTkdfU0laRV0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNCkpKTsKKworI2lmZGVmIFVTRV9MT1dNRU1fQlVGRkVSCisjZGVmaW5lIHR4YiAoKGNoYXIgKikweDEwMDAwIC0gQlVGTEVOKQorI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHR4YltCVUZMRU5dIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDQpKSk7CisjZW5kaWYKKworI2RlZmluZSBSWF9SSU5HX1NJWkUJNAorc3RhdGljIHN0cnVjdCB0dWxpcF9yeF9kZXNjIHJ4X3JpbmdbUlhfUklOR19TSVpFXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg0KSkpOworCisjaWZkZWYgVVNFX0xPV01FTV9CVUZGRVIKKyNkZWZpbmUgcnhiICgoY2hhciAqKTB4MTAwMDAgLSBSWF9SSU5HX1NJWkUgKiBCVUZMRU4gLSBCVUZMRU4pCisjZWxzZQorc3RhdGljIHVuc2lnbmVkIGNoYXIgcnhiW1JYX1JJTkdfU0laRSAqIEJVRkxFTl0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNCkpKTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHR1bGlwX3ByaXZhdGUgeworICAgIGludCBjdXJfcng7CisgICAgaW50IGNoaXBfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggaW50byB0dWxpcF90YmxbXSAgKi8KKyAgICBpbnQgcGNpX2lkX2lkeDsgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbnRvIHBjaV9pZF90YmxbXSAqLworICAgIGludCByZXZpc2lvbjsKKyAgICBpbnQgZmxhZ3M7CisgICAgdW5zaWduZWQgc2hvcnQgdmVuZG9yX2lkOyAgICAgICAgICAgLyogUENJIGNhcmQgdmVuZG9yIGNvZGUgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBkZXZfaWQ7ICAgICAgICAgICAgICAvKiBQQ0kgY2FyZCBkZXZpY2UgY29kZSAqLworICAgIHVuc2lnbmVkIGNoYXIgZWhkcltFVEhfSExFTl07ICAgICAgIC8qIGJ1ZmZlciBmb3IgZXRoZXJuZXQgaGVhZGVyICovCisgICAgY29uc3QgY2hhciAqbmljX25hbWU7CisgICAgdW5zaWduZWQgaW50IGNzcjAsIGNzcjY7ICAgICAgICAgICAgLyogQ3VycmVudCBDU1IwLCBDU1I2IHNldHRpbmdzLiAqLworICAgIHVuc2lnbmVkIGludCBpZl9wb3J0OworICAgIHVuc2lnbmVkIGludCBmdWxsX2R1cGxleDsgICAgICAgICAvKiBGdWxsLWR1cGxleCBvcGVyYXRpb24gcmVxdWVzdGVkLiAqLworICAgIHVuc2lnbmVkIGludCBmdWxsX2R1cGxleF9sb2NrOworICAgIHVuc2lnbmVkIGludCBtZWRpYWxvY2s7ICAgICAgICAgICAvKiBEbyBub3Qgc2Vuc2UgbWVkaWEgdHlwZS4gKi8KKyAgICB1bnNpZ25lZCBpbnQgbWVkaWFzZW5zZTsgICAgICAgICAgLyogTWVkaWEgc2Vuc2luZyBpbiBwcm9ncmVzcy4gKi8KKyAgICB1bnNpZ25lZCBpbnQgbndheSwgbndheXNldDsgICAgIC8qIDIxMTQzIGludGVybmFsIE5XYXkuICovCisgICAgdW5zaWduZWQgaW50IGRlZmF1bHRfcG9ydDsKKyAgICB1bnNpZ25lZCBjaGFyIGVlcHJvbVtFRVBST01fU0laRV07ICAvKiBTZXJpYWwgRUVQUk9NIGNvbnRlbnRzLiAqLworICAgIHU4IG1lZGlhX3RhYmxlX3N0b3JhZ2VbKHNpemVvZihzdHJ1Y3QgbWVkaWF0YWJsZSkgKyAzMipzaXplb2Yoc3RydWN0IG1lZGlhbGVhZikpXTsKKyAgICB1MTYgc3ltX2FkdmVydGlzZSwgbWlpX2FkdmVydGlzZTsgICAvKiBOV2F5IHRvLWFkdmVydGlzZS4gKi8KKyAgICBzdHJ1Y3QgbWVkaWF0YWJsZSAqbXRhYmxlOworICAgIHUxNiBscGFyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIxMTQzIExpbmsgcGFydG5lciBhYmlsaXR5LiAqLworICAgIHUxNiBhZHZlcnRpc2luZ1s0XTsgICAgICAgICAgICAgICAgIC8qIE1JSSBhZHZlcnRpc2UsIGZyb20gU1JPTSB0YWJsZS4gKi8KKyAgICBzaWduZWQgY2hhciBwaHlzWzRdLCBtaWlfY250OyAgICAgICAvKiBNSUkgZGV2aWNlIGFkZHJlc3Nlcy4gKi8KKyAgICBpbnQgY3VyX2luZGV4OyAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IG1lZGlhIGluZGV4LiAqLworICAgIGludCBzYXZlZF9pZl9wb3J0OworfSB0cHg7CisKK3N0YXRpYyBzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHA7CisKKy8qIEtub3duIGNhcmRzIHRoYXQgaGF2ZSBvbGQtc3R5bGUgRUVQUk9Ncy4KKyAgIFdyaXRpbmcgdGhpcyB0YWJsZSBpcyBkZXNjcmliZWQgYXQKKyAgIGh0dHA6Ly9jZXNkaXMuZ3NmYy5uYXNhLmdvdi9saW51eC9kcml2ZXJzL3R1bGlwLWRyaXZlcnMvdHVsaXAtbWVkaWEuaHRtbCAqLworc3RhdGljIHN0cnVjdCBmaXh1cHMgeworICAgIGNoYXIgKm5hbWU7CisgICAgdW5zaWduZWQgY2hhciBhZGRyMCwgYWRkcjEsIGFkZHIyOworICAgIHUxNiBuZXd0YWJsZVszMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF4IGxlbmd0aCBiZWxvdy4gKi8KK30gZWVwcm9tX2ZpeHVwc1tdID0geworICAgIHsiQXNhbnRlIiwgMCwgMCwgMHg5NCwgezB4MWUwMCwgMHgwMDAwLCAweDA4MDAsIDB4MDEwMCwgMHgwMThjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMCwgMHgwMDAwLCAweGUwNzgsIDB4MDAwMSwgMHgwMDUwLCAweDAwMTggfX0sCisgICAgeyJTTUM5MzMyRFNUIiwgMCwgMCwgMHhDMCwgeyAweDFlMDAsIDB4MDAwMCwgMHgwODAwLCAweDA0MWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAsIDB4MDA5RSwgLyogMTBiYXNlVCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0LCAweDAwOUUsIC8qIDEwYmFzZVQtRkQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkwMywgMHgwMDZELCAvKiAxMDBiYXNlVHggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkwNSwgMHgwMDZELCAvKiAxMDBiYXNlVHgtRkQgKi8gfX0sCisgICAgeyJDb2dlbnQgRU0xMDAiLCAwLCAwLCAweDkyLCB7IDB4MWUwMCwgMHgwMDAwLCAweDA4MDAsIDB4MDYzZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA3LCAweDgwMjEsIC8qIDEwMGJhc2VGeCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDgsIDB4ODAyMSwgLyogMTAwYmFzZUZ4LUZEICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCwgMHgwMDlFLCAvKiAxMGJhc2VUICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwNCwgMHgwMDlFLCAvKiAxMGJhc2VULUZEICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMywgMHgwMDZELCAvKiAxMDBiYXNlVHggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA1LCAweDAwNkQsIC8qIDEwMGJhc2VUeC1GRCAqLyB9fSwKKyAgICB7Ik1heHRlY2ggTlgtMTEwIiwgMCwgMCwgMHhFOCwgeyAweDFlMDAsIDB4MDAwMCwgMHgwODAwLCAweDA1MTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAxLCAweDAwOUUsIC8qIDEwYmFzZTIsIENTUjEyIDB4MTAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMCwgMHgwMDlFLCAvKiAxMGJhc2VUICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0LCAweDAwOUUsIC8qIDEwYmFzZVQtRkQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzMDMsIDB4MDA2RCwgLyogMTAwYmFzZVR4LCBDU1IxMiAweDAzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMzA1LCAweDAwNkQsIC8qIDEwMGJhc2VUeC1GRCBDU1IxMiAweDAzICovfX0sCisgICAgeyJBY2N0b24gRU4xMjA3IiwgMCwgMCwgMHhFOCwgeyAweDFlMDAsIDB4MDAwMCwgMHgwODAwLCAweDA1MUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFCMDEsIDB4MDAwMCwgLyogMTBiYXNlMiwgICBDU1IxMiAweDFCICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCMDAsIDB4MDA5RSwgLyogMTBiYXNlVCwgICBDU1IxMiAweDBCICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCMDQsIDB4MDA5RSwgLyogMTBiYXNlVC1GRCxDU1IxMiAweDBCICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFCMDMsIDB4MDA2RCwgLyogMTAwYmFzZVR4LCBDU1IxMiAweDFCICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFCMDUsIDB4MDA2RCwgLyogMTAwYmFzZVR4LUZEIENTUjEyIDB4MUIgKi8KKyAgICB9fSwKKyAgICB7MCwgMCwgMCwgMCwge319fTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBibG9ja19uYW1lW10gPSB7IjIxMTQwIG5vbi1NSUkiLCAiMjExNDAgTUlJIFBIWSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjExNDIgU2VyaWFsIFBIWSIsICIyMTE0MiBNSUkgUEhZIiwgIjIxMTQzIFNZTSBQSFkiLCAiMjExNDMgcmVzZXQgbWV0aG9kIn07CisKKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuaWMgKm5pYywgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5pYyAqbmljLCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSk7CitzdGF0aWMgaW50IHJlYWRfZWVwcm9tKHVuc2lnbmVkIGxvbmcgaW9hZGRyLCBpbnQgbG9jYXRpb24sIGludCBhZGRyX2xlbik7CitzdGF0aWMgdm9pZCBwYXJzZV9lZXByb20oc3RydWN0IG5pYyAqbmljKTsKK3N0cnVjdCBuaWMgKnR1bGlwX3Byb2JlKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgc2hvcnQgKmlvX2FkZHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSk7CitzdGF0aWMgdm9pZCB0dWxpcF9pbml0X3Jpbmcoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyB2b2lkIHR1bGlwX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYyk7CitzdGF0aWMgdm9pZCB0dWxpcF90cmFuc21pdChzdHJ1Y3QgbmljICpuaWMsIGNvbnN0IGNoYXIgKmQsIHVuc2lnbmVkIGludCB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHMsIGNvbnN0IGNoYXIgKnApOworc3RhdGljIGludCB0dWxpcF9wb2xsKHN0cnVjdCBuaWMgKm5pYyk7CitzdGF0aWMgdm9pZCB0dWxpcF9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYyk7CitzdGF0aWMgdm9pZCBud2F5X3N0YXJ0KHN0cnVjdCBuaWMgKm5pYyk7CitzdGF0aWMgdm9pZCBwbmljX2RvX253YXkoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyB2b2lkIHNlbGVjdF9tZWRpYShzdHJ1Y3QgbmljICpuaWMsIGludCBzdGFydHVwKTsKK3N0YXRpYyB2b2lkIGluaXRfbWVkaWEoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyB2b2lkIHN0YXJ0X2xpbmsoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyBpbnQgdHVsaXBfY2hlY2tfZHVwbGV4KHN0cnVjdCBuaWMgKm5pYyk7CisKK3N0YXRpYyB2b2lkIHR1bGlwX3dhaXQodW5zaWduZWQgaW50IG50aWNrcyk7CisKKyNpZmRlZiBUVUxJUF9ERUJVR19XSEVSRQorc3RhdGljIHZvaWQgd2hlcmVhbWkoY29uc3QgY2hhciAqc3RyKTsKKyNlbmRpZgorCisjaWZkZWYgVFVMSVBfREVCVUcKK3N0YXRpYyB2b2lkIHR1bGlwX21vcmUodm9pZCk7CisjZW5kaWYKKworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFV0aWxpdHkgUm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgVFVMSVBfREVCVUdfV0hFUkUKK3N0YXRpYyB2b2lkIHdoZXJlYW1pIChjb25zdCBjaGFyICpzdHIpCit7CisgICAgcHJpbnRmKCIlczogJXNcbiIsIHRwLT5uaWNfbmFtZSwgc3RyKTsKKyAgICAvKiBzbGVlcCgyKTsgKi8KK30KKyNlbmRpZgorCisjaWZkZWYgIFRVTElQX0RFQlVHCitzdGF0aWMgdm9pZCB0dWxpcF9tb3JlKHZvaWQpCit7CisgICAgcHJpbnRmKCJcblxuLS0gbW9yZSAtLSIpOworICAgIHdoaWxlICghaXNrZXkoKSkKKyAgICAgICAgLyogd2FpdCAqLzsKKyAgICBnZXRjaGFyKCk7CisgICAgcHJpbnRmKCJcblxuIik7Cit9CisjZW5kaWYgLyogVFVMSVBfREVCVUcgKi8KKworc3RhdGljIHZvaWQgdHVsaXBfd2FpdCh1bnNpZ25lZCBpbnQgbnRpY2tzKQoreworICAgIHVuc2lnbmVkIGludCB0byA9IGN1cnJ0aWNrcygpICsgbnRpY2tzOworICAgIHdoaWxlIChjdXJydGlja3MoKSA8IHRvKQorICAgICAgICAvKiB3YWl0ICovIDsKK30KKworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1lZGlhIERlc2NyaXB0b3IgQ29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNSUkgdHJhbnNjZWl2ZXIgY29udHJvbCBzZWN0aW9uLgorICAgUmVhZCBhbmQgd3JpdGUgdGhlIE1JSSByZWdpc3RlcnMgdXNpbmcgc29mdHdhcmUtZ2VuZXJhdGVkIHNlcmlhbAorICAgTURJTyBwcm90b2NvbC4gIFNlZSB0aGUgTUlJIHNwZWNpZmljYXRpb25zIG9yIERQODM4NDBBIGRhdGEgc2hlZXQKKyAgIGZvciBkZXRhaWxzLiAqLworCisvKiBUaGUgbWF4aW11bSBkYXRhIGNsb2NrIHJhdGUgaXMgMi41IE1oei4gIFRoZSBtaW5pbXVtIHRpbWluZyBpcyB1c3VhbGx5CisgICBtZXQgYnkgYmFjay10by1iYWNrIFBDSSBJL08gY3ljbGVzLCBidXQgd2UgaW5zZXJ0IGEgZGVsYXkgdG8gYXZvaWQKKyAgICJvdmVyY2xvY2tpbmciIGlzc3VlcyBvciBmdXR1cmUgNjZNaHogUENJLiAqLworI2RlZmluZSBtZGlvX2RlbGF5KCkgaW5sKG1kaW9fYWRkcikKKworLyogUmVhZCBhbmQgd3JpdGUgdGhlIE1JSSByZWdpc3RlcnMgdXNpbmcgc29mdHdhcmUtZ2VuZXJhdGVkIHNlcmlhbAorICAgTURJTyBwcm90b2NvbC4gIEl0IGlzIGp1c3QgZGlmZmVyZW50IGVub3VnaCBmcm9tIHRoZSBFRVBST00gcHJvdG9jb2wKKyAgIHRvIG5vdCBzaGFyZSBjb2RlLiAgVGhlIG1heGl1bSBkYXRhIGNsb2NrIHJhdGUgaXMgMi41IE1oei4gKi8KKyNkZWZpbmUgTURJT19TSElGVF9DTEsgIDB4MTAwMDAKKyNkZWZpbmUgTURJT19EQVRBX1dSSVRFMCAweDAwMDAwCisjZGVmaW5lIE1ESU9fREFUQV9XUklURTEgMHgyMDAwMAorI2RlZmluZSBNRElPX0VOQiAgICAgICAgICAgICAgICAweDAwMDAwICAgICAgICAgLyogSWdub3JlIHRoZSAweDAyMDAwIGRhdGFib29rIHNldHRpbmcuICovCisjZGVmaW5lIE1ESU9fRU5CX0lOICAgICAgICAgICAgIDB4NDAwMDAKKyNkZWZpbmUgTURJT19EQVRBX1JFQUQgIDB4ODAwMDAKKworLyogTUlJIHRyYW5zY2VpdmVyIGNvbnRyb2wgc2VjdGlvbi4KKyAgIFJlYWQgYW5kIHdyaXRlIHRoZSBNSUkgcmVnaXN0ZXJzIHVzaW5nIHNvZnR3YXJlLWdlbmVyYXRlZCBzZXJpYWwKKyAgIE1ESU8gcHJvdG9jb2wuICBTZWUgdGhlIE1JSSBzcGVjaWZpY2F0aW9ucyBvciBEUDgzODQwQSBkYXRhIHNoZWV0CisgICBmb3IgZGV0YWlscy4gKi8KKworaW50IG1kaW9fcmVhZChzdHJ1Y3QgbmljICpuaWMsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbikKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgcmVhZF9jbWQgPSAoMHhmNiA8PCAxMCkgfCAocGh5X2lkIDw8IDUpIHwgbG9jYXRpb247CisgICAgaW50IHJldHZhbCA9IDA7CisgICAgbG9uZyBtZGlvX2FkZHIgPSBpb2FkZHIgKyBDU1I5OworCisjaWZkZWYgVFVMSVBfREVCVUdfV0hFUkUKKyAgICB3aGVyZWFtaSgibWRpb19yZWFkXG4iKTsKKyNlbmRpZgorCisgICAgaWYgKHRwLT5jaGlwX2lkID09IExDODJDMTY4KSB7CisJaW50IGkgPSAxMDAwOworCW91dGwoMHg2MDAyMDAwMCArIChwaHlfaWQ8PDIzKSArIChsb2NhdGlvbjw8MTgpLCBpb2FkZHIgKyAweEEwKTsKKwlpbmwoaW9hZGRyICsgMHhBMCk7CisJaW5sKGlvYWRkciArIDB4QTApOworCXdoaWxlICgtLWkgPiAwKQorCSAgICBpZiAoICEgKChyZXR2YWwgPSBpbmwoaW9hZGRyICsgMHhBMCkpICYgMHg4MDAwMDAwMCkpCisJCXJldHVybiByZXR2YWwgJiAweGZmZmY7CisJcmV0dXJuIDB4ZmZmZjsKKyAgICB9CisKKyAgICBpZiAodHAtPmNoaXBfaWQgPT0gQ09NRVQpIHsKKwlpZiAocGh5X2lkID09IDEpIHsKKwkgICAgaWYgKGxvY2F0aW9uIDwgNykKKwkJcmV0dXJuIGlubChpb2FkZHIgKyAweEI0ICsgKGxvY2F0aW9uPDwyKSk7CisJICAgIGVsc2UgaWYgKGxvY2F0aW9uID09IDE3KQorCQlyZXR1cm4gaW5sKGlvYWRkciArIDB4RDApOworCSAgICBlbHNlIGlmIChsb2NhdGlvbiA+PSAyOSAmJiBsb2NhdGlvbiA8PSAzMSkKKwkJcmV0dXJuIGlubChpb2FkZHIgKyAweEQ0ICsgKChsb2NhdGlvbi0yOSk8PDIpKTsKKwl9CisJcmV0dXJuIDB4ZmZmZjsKKyAgICB9CisKKyAgICAvKiBFc3RhYmxpc2ggc3luYyBieSBzZW5kaW5nIGF0IGxlYXN0IDMyIGxvZ2ljIG9uZXMuICovCisgICAgZm9yIChpID0gMzI7IGkgPj0gMDsgaS0tKSB7CisJb3V0bChNRElPX0VOQiB8IE1ESU9fREFUQV9XUklURTEsIG1kaW9fYWRkcik7CisJbWRpb19kZWxheSgpOworCW91dGwoTURJT19FTkIgfCBNRElPX0RBVEFfV1JJVEUxIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJbWRpb19kZWxheSgpOworICAgIH0KKyAgICAvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kIGJpdHMgb3V0LiAqLworICAgIGZvciAoaSA9IDE1OyBpID49IDA7IGktLSkgeworCWludCBkYXRhdmFsID0gKHJlYWRfY21kICYgKDEgPDwgaSkpID8gTURJT19EQVRBX1dSSVRFMSA6IDA7CisKKwlvdXRsKE1ESU9fRU5CIHwgZGF0YXZhbCwgbWRpb19hZGRyKTsKKwltZGlvX2RlbGF5KCk7CisJb3V0bChNRElPX0VOQiB8IGRhdGF2YWwgfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwltZGlvX2RlbGF5KCk7CisgICAgfQorICAgIC8qIFJlYWQgdGhlIHR3byB0cmFuc2l0aW9uLCAxNiBkYXRhLCBhbmQgd2lyZS1pZGxlIGJpdHMuICovCisgICAgZm9yIChpID0gMTk7IGkgPiAwOyBpLS0pIHsKKwlvdXRsKE1ESU9fRU5CX0lOLCBtZGlvX2FkZHIpOworCW1kaW9fZGVsYXkoKTsKKwlyZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChpbmwobWRpb19hZGRyKSAmIE1ESU9fREFUQV9SRUFEKSA/IDEgOiAwKTsKKwlvdXRsKE1ESU9fRU5CX0lOIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJbWRpb19kZWxheSgpOworICAgIH0KKyAgICByZXR1cm4gKHJldHZhbD4+MSkgJiAweGZmZmY7Cit9CisKK3ZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmljICpuaWMsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKQoreworICAgIGludCBpOworICAgIGludCBjbWQgPSAoMHg1MDAyIDw8IDE2KSB8IChwaHlfaWQgPDwgMjMpIHwgKGxvY2F0aW9uPDwxOCkgfCB2YWx1ZTsKKyAgICBsb25nIG1kaW9fYWRkciA9IGlvYWRkciArIENTUjk7CisKKyNpZmRlZiBUVUxJUF9ERUJVR19XSEVSRQorICAgIHdoZXJlYW1pKCJtZGlvX3dyaXRlXG4iKTsKKyNlbmRpZgorCisgICAgaWYgKHRwLT5jaGlwX2lkID09IExDODJDMTY4KSB7CisJaW50IGkgPSAxMDAwOworCW91dGwoY21kLCBpb2FkZHIgKyAweEEwKTsKKwlkbworCSAgICBpZiAoICEgKGlubChpb2FkZHIgKyAweEEwKSAmIDB4ODAwMDAwMDApKQorCQlicmVhazsKKwl3aGlsZSAoLS1pID4gMCk7CisJcmV0dXJuOworICAgIH0KKworICAgIGlmICh0cC0+Y2hpcF9pZCA9PSBDT01FVCkgeworCWlmIChwaHlfaWQgIT0gMSkKKwkgICAgcmV0dXJuOworCWlmIChsb2NhdGlvbiA8IDcpCisJICAgIG91dGwodmFsdWUsIGlvYWRkciArIDB4QjQgKyAobG9jYXRpb248PDIpKTsKKwllbHNlIGlmIChsb2NhdGlvbiA9PSAxNykKKwkgICAgb3V0bCh2YWx1ZSwgaW9hZGRyICsgMHhEMCk7CisJZWxzZSBpZiAobG9jYXRpb24gPj0gMjkgJiYgbG9jYXRpb24gPD0gMzEpCisJICAgIG91dGwodmFsdWUsIGlvYWRkciArIDB4RDQgKyAoKGxvY2F0aW9uLTI5KTw8MikpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBFc3RhYmxpc2ggc3luYyBieSBzZW5kaW5nIDMyIGxvZ2ljIG9uZXMuICovCisgICAgZm9yIChpID0gMzI7IGkgPj0gMDsgaS0tKSB7CisJb3V0bChNRElPX0VOQiB8IE1ESU9fREFUQV9XUklURTEsIG1kaW9fYWRkcik7CisJbWRpb19kZWxheSgpOworCW91dGwoTURJT19FTkIgfCBNRElPX0RBVEFfV1JJVEUxIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJbWRpb19kZWxheSgpOworICAgIH0KKyAgICAvKiBTaGlmdCB0aGUgY29tbWFuZCBiaXRzIG91dC4gKi8KKyAgICBmb3IgKGkgPSAzMTsgaSA+PSAwOyBpLS0pIHsKKwlpbnQgZGF0YXZhbCA9IChjbWQgJiAoMSA8PCBpKSkgPyBNRElPX0RBVEFfV1JJVEUxIDogMDsKKwlvdXRsKE1ESU9fRU5CIHwgZGF0YXZhbCwgbWRpb19hZGRyKTsKKwltZGlvX2RlbGF5KCk7CisJb3V0bChNRElPX0VOQiB8IGRhdGF2YWwgfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwltZGlvX2RlbGF5KCk7CisgICAgfQorICAgIC8qIENsZWFyIG91dCBleHRyYSBiaXRzLiAqLworICAgIGZvciAoaSA9IDI7IGkgPiAwOyBpLS0pIHsKKwlvdXRsKE1ESU9fRU5CX0lOLCBtZGlvX2FkZHIpOworCW1kaW9fZGVsYXkoKTsKKwlvdXRsKE1ESU9fRU5CX0lOIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJbWRpb19kZWxheSgpOworICAgIH0KK30KKworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEVFUFJPTSBSZWFkaW5nIENvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRUVQUk9NIHJvdXRpbmVzIGFkYXB0ZWQgZnJvbSB0aGUgTGludXggVHVsaXAgQ29kZSAqLworLyogUmVhZGluZyBhIHNlcmlhbCBFRVBST00gaXMgYSAiYml0IiBncnVuZ3ksIGJ1dCB3ZSB3b3JrIG91ciB3YXkKKyAgIHRocm91Z2g6LT4uCisqLworc3RhdGljIGludCByZWFkX2VlcHJvbSh1bnNpZ25lZCBsb25nIGlvYWRkciwgaW50IGxvY2F0aW9uLCBpbnQgYWRkcl9sZW4pCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgc2hvcnQgcmV0dmFsID0gMDsKKyAgICBsb25nIGVlX2FkZHIgPSBpb2FkZHIgKyBDU1I5OworICAgIGludCByZWFkX2NtZCA9IGxvY2F0aW9uIHwgRUVfUkVBRF9DTUQ7CisKKyNpZmRlZiBUVUxJUF9ERUJVR19XSEVSRQorICAgIHdoZXJlYW1pKCJyZWFkX2VlcHJvbVxuIik7CisjZW5kaWYKKworICAgIG91dGwoRUVfRU5CICYgfkVFX0NTLCBlZV9hZGRyKTsKKyAgICBvdXRsKEVFX0VOQiwgZWVfYWRkcik7CisKKyAgICAvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kIGJpdHMgb3V0LiAqLworICAgIGZvciAoaSA9IDQgKyBhZGRyX2xlbjsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgc2hvcnQgZGF0YXZhbCA9IChyZWFkX2NtZCAmICgxIDw8IGkpKSA/IEVFX0RBVEFfV1JJVEUgOiAwOworICAgICAgICBvdXRsKEVFX0VOQiB8IGRhdGF2YWwsIGVlX2FkZHIpOworICAgICAgICBlZXByb21fZGVsYXkoKTsKKyAgICAgICAgb3V0bChFRV9FTkIgfCBkYXRhdmFsIHwgRUVfU0hJRlRfQ0xLLCBlZV9hZGRyKTsKKyAgICAgICAgZWVwcm9tX2RlbGF5KCk7CisgICAgfQorICAgIG91dGwoRUVfRU5CLCBlZV9hZGRyKTsKKworICAgIGZvciAoaSA9IDE2OyBpID4gMDsgaS0tKSB7CisgICAgICAgIG91dGwoRUVfRU5CIHwgRUVfU0hJRlRfQ0xLLCBlZV9hZGRyKTsKKyAgICAgICAgZWVwcm9tX2RlbGF5KCk7CisgICAgICAgIHJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKGlubChlZV9hZGRyKSAmIEVFX0RBVEFfUkVBRCkgPyAxIDogMCk7CisgICAgICAgIG91dGwoRUVfRU5CLCBlZV9hZGRyKTsKKyAgICAgICAgZWVwcm9tX2RlbGF5KCk7CisgICAgfQorCisgICAgLyogVGVybWluYXRlIHRoZSBFRVBST00gYWNjZXNzLiAqLworICAgIG91dGwoRUVfRU5CICYgfkVFX0NTLCBlZV9hZGRyKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRUVQUk9NIFBhcnNpbmcgQ29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBwYXJzZV9lZXByb20oc3RydWN0IG5pYyAqbmljKQoreworICAgIHVuc2lnbmVkIGNoYXIgKnAsICplZV9kYXRhID0gdHAtPmVlcHJvbTsKKyAgICBpbnQgbmV3X2FkdmVydGlzZSA9IDA7CisgICAgaW50IGk7CisKKyNpZmRlZiBUVUxJUF9ERUJVR19XSEVSRQorICAgIHdoZXJlYW1pKCJwYXJzZV9lZXByb21cbiIpOworI2VuZGlmCisKKyAgICB0cC0+bXRhYmxlID0gMDsKKyAgICAvKiBEZXRlY3QgYW4gb2xkLXN0eWxlIChTQSBvbmx5KSBFRVBST00gbGF5b3V0OgorICAgICAgIG1lbWNtcChlZV9kYXRhLCBlZV9kYXRhKzE2LCA4KS4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSArKykKKyAgICAgICAgaWYgKGVlX2RhdGFbaV0gIT0gZWVfZGF0YVsxNitpXSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChpID49IDgpIHsKKyAgICAgICAgLyogRG8gYSBmaXgtdXAgYmFzZWQgb24gdGhlIHZlbmRvciBoYWxmIG9mIHRoZSBzdGF0aW9uIGFkZHJlc3MuICovCisgICAgICAgIGZvciAoaSA9IDA7IGVlcHJvbV9maXh1cHNbaV0ubmFtZTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobmljLT5ub2RlX2FkZHJbMF0gPT0gZWVwcm9tX2ZpeHVwc1tpXS5hZGRyMAorICAgICAgICAgICAgICAgICYmICBuaWMtPm5vZGVfYWRkclsxXSA9PSBlZXByb21fZml4dXBzW2ldLmFkZHIxCisgICAgICAgICAgICAgICAgJiYgIG5pYy0+bm9kZV9hZGRyWzJdID09IGVlcHJvbV9maXh1cHNbaV0uYWRkcjIpIHsKKyAgICAgICAgICAgICAgICBpZiAobmljLT5ub2RlX2FkZHJbMl0gPT0gMHhFOCAgJiYgIGVlX2RhdGFbMHgxYV0gPT0gMHg1NSkKKyAgICAgICAgICAgICAgICAgICAgaSsrOyAgICAgICAgICAgICAgICAvKiBBbiBBY2N0b24gRU4xMjA3LCBub3QgYW4gb3V0bGF3IE1heHRlY2guICovCisgICAgICAgICAgICAgICAgbWVtY3B5KGVlX2RhdGEgKyAyNiwgZWVwcm9tX2ZpeHVwc1tpXS5uZXd0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVlcHJvbV9maXh1cHNbaV0ubmV3dGFibGUpKTsKKyNpZmRlZiBUVUxJUF9ERUJVRworICAgICAgICAgICAgICAgIHByaW50ZigiJXM6IE9sZCBmb3JtYXQgRUVQUk9NIG9uICclcycgYm9hcmQuXG4lczogVXNpbmcgc3Vic3RpdHV0ZSBtZWRpYSBjb250cm9sIGluZm8uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICB0cC0+bmljX25hbWUsIGVlcHJvbV9maXh1cHNbaV0ubmFtZSwgdHAtPm5pY19uYW1lKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChlZXByb21fZml4dXBzW2ldLm5hbWUgPT0gTlVMTCkgeyAvKiBObyBmaXh1cCBmb3VuZC4gKi8KKyNpZmRlZiBUVUxJUF9ERUJVRworICAgICAgICAgICAgcHJpbnRmKCIlczogT2xkIHN0eWxlIEVFUFJPTSB3aXRoIG5vIG1lZGlhIHNlbGVjdGlvbiBpbmZvcm1hdGlvbi5cbiIsCisgICAgICAgICAgICAgICAgICAgdHAtPm5pY19uYW1lKTsKKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVlX2RhdGFbMTldID4gMSkgeworI2lmZGVmIFRVTElQX0RFQlVHCisgICAgICAgIHByaW50ZigiJXM6ICBNdWx0aXBvcnQgY2FyZHMgKCVkIHBvcnRzKSBtYXkgbm90IHdvcmsgY29ycmVjdGx5LlxuIiwgCisgICAgICAgICAgICAgICB0cC0+bmljX25hbWUsIGVlX2RhdGFbMTldKTsKKyNlbmRpZgorICAgIH0KKworICAgIHAgPSAodm9pZCAqKWVlX2RhdGEgKyBlZV9kYXRhWzI3XTsKKworICAgIGlmIChlZV9kYXRhWzI3XSA9PSAwKSB7ICAgICAgICAgICAgIC8qIE5vIHZhbGlkIG1lZGlhIHRhYmxlLiAqLworI2lmZGVmIFRVTElQX0RFQlVHCisgICAgICAgIGlmICh0dWxpcF9kZWJ1ZyA+IDEpIHsKKyAgICAgICAgICAgIHByaW50ZigiJXM6ICBObyBWYWxpZCBNZWRpYSBUYWJsZS4gZWVfZGF0YVsyN10gPSAlaGhYXG4iLCAKKyAgICAgICAgICAgICAgICAgICB0cC0+bmljX25hbWUsIGVlX2RhdGFbMjddKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfSBlbHNlIGlmICh0cC0+Y2hpcF9pZCA9PSBEQzIxMDQxKSB7CisgICAgICAgIGludCBtZWRpYSA9IGdldF91MTYocCk7CisgICAgICAgIGludCBjb3VudCA9IHBbMl07CisgICAgICAgIHAgKz0gMzsKKworICAgICAgICBwcmludGYoIiVzOiAyMTA0MSBNZWRpYSB0YWJsZSwgZGVmYXVsdCBtZWRpYSAlaFggKCVzKS5cbiIsCisgICAgICAgICAgICAgICB0cC0+bmljX25hbWUsIG1lZGlhLAorICAgICAgICAgICAgICAgbWVkaWEgJiAweDA4MDAgPyAiQXV0b3NlbnNlIiA6IG1lZGlhbmFtZVttZWRpYSAmIDE1XSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIG1lZGlhX2Jsb2NrID0gKnArKzsKKyAgICAgICAgICAgIGludCBtZWRpYV9jb2RlID0gbWVkaWFfYmxvY2sgJiBNRURJQV9NQVNLOworICAgICAgICAgICAgaWYgKG1lZGlhX2Jsb2NrICYgMHg0MCkKKyAgICAgICAgICAgICAgICBwICs9IDY7CisgICAgICAgICAgICBzd2l0Y2gobWVkaWFfY29kZSkgeworICAgICAgICAgICAgY2FzZSAwOiBuZXdfYWR2ZXJ0aXNlIHw9IDB4MDAyMDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6IG5ld19hZHZlcnRpc2UgfD0gMHgwMDQwOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZigiJXM6ICAyMTA0MSBtZWRpYSAjJWQsICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICB0cC0+bmljX25hbWUsIG1lZGlhX2NvZGUsIG1lZGlhbmFtZVttZWRpYV9jb2RlXSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGNzcjEyZGlyID0gMDsKKyAgICAgICAgaW50IGNvdW50OworICAgICAgICBzdHJ1Y3QgbWVkaWF0YWJsZSAqbXRhYmxlOworICAgICAgICB1MTYgbWVkaWEgPSBnZXRfdTE2KHApOworCisgICAgICAgIHAgKz0gMjsKKyAgICAgICAgaWYgKHRwLT5mbGFncyAmIENTUjEyX0lOX1NST00pCisgICAgICAgICAgICBjc3IxMmRpciA9ICpwKys7CisgICAgICAgIGNvdW50ID0gKnArKzsKKworICAgICAgICB0cC0+bXRhYmxlID0gbXRhYmxlID0gKHN0cnVjdCBtZWRpYXRhYmxlICopJnRwLT5tZWRpYV90YWJsZV9zdG9yYWdlWzBdOworCisgICAgICAgIG10YWJsZS0+ZGVmYXVsdG1lZGlhID0gbWVkaWE7CisgICAgICAgIG10YWJsZS0+bGVhZmNvdW50ID0gY291bnQ7CisgICAgICAgIG10YWJsZS0+Y3NyMTJkaXIgPSBjc3IxMmRpcjsKKyAgICAgICAgbXRhYmxlLT5oYXNfbm9ubWlpID0gbXRhYmxlLT5oYXNfbWlpID0gbXRhYmxlLT5oYXNfcmVzZXQgPSAwOworICAgICAgICBtdGFibGUtPmNzcjE1ZGlyID0gbXRhYmxlLT5jc3IxNXZhbCA9IDA7CisKKyAgICAgICAgcHJpbnRmKCIlczogIEVFUFJPTSBkZWZhdWx0IG1lZGlhIHR5cGUgJXMuXG4iLCB0cC0+bmljX25hbWUsCisgICAgICAgICAgICAgICBtZWRpYSAmIDB4MDgwMCA/ICJBdXRvc2Vuc2UiIDogbWVkaWFuYW1lW21lZGlhICYgTUVESUFfTUFTS10pOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBzdHJ1Y3QgbWVkaWFsZWFmICpsZWFmID0gJm10YWJsZS0+bWxlYWZbaV07CisKKyAgICAgICAgICAgIGlmICgocFswXSAmIDB4ODApID09IDApIHsgLyogMjExNDAgQ29tcGFjdCBibG9jay4gKi8KKyAgICAgICAgICAgICAgICBsZWFmLT50eXBlID0gMDsKKyAgICAgICAgICAgICAgICBsZWFmLT5tZWRpYSA9IHBbMF0gJiAweDNmOworICAgICAgICAgICAgICAgIGxlYWYtPmxlYWZkYXRhID0gcDsKKyAgICAgICAgICAgICAgICBpZiAoKHBbMl0gJiAweDYxKSA9PSAweDAxKSAgICAgIC8qIEJvZ3VzLCBidXQgWm55eCBib2FyZHMgZG8gaXQuICovCisgICAgICAgICAgICAgICAgICAgIG10YWJsZS0+aGFzX21paSA9IDE7CisgICAgICAgICAgICAgICAgcCArPSA0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2gobGVhZi0+dHlwZSA9IHBbMV0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgIG10YWJsZS0+aGFzX3Jlc2V0ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgbGVhZi0+bWVkaWEgPSBwWzJdICYgMHgwZjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOiBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgIG10YWJsZS0+aGFzX21paSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGxlYWYtPm1lZGlhID0gMTE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwWzJdICYgMHgzZikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGJhc2UxNSA9IChwWzJdICYgMHg0MCkgPyBnZXRfdTE2KHAgKyA3KSA6IDB4MDAwODsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxNiAqcDEgPSAodTE2ICopKHAgKyAocFsyXSAmIDB4NDAgPyA5IDogMykpOworICAgICAgICAgICAgICAgICAgICAgICAgbXRhYmxlLT5jc3IxNWRpciA9IChnZXRfdW5hbGlnbmVkKHAxICsgMCk8PDE2KSArIGJhc2UxNTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG10YWJsZS0+Y3NyMTV2YWwgPSAoZ2V0X3VuYWxpZ25lZChwMSArIDEpPDwxNikgKyBiYXNlMTU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogRmFsbCB0aHJvdWdoLiAqLworICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICBtdGFibGUtPmhhc19ub25taWkgPSAxOworICAgICAgICAgICAgICAgICAgICBsZWFmLT5tZWRpYSA9IHBbMl0gJiBNRURJQV9NQVNLOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGxlYWYtPm1lZGlhKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMDogbmV3X2FkdmVydGlzZSB8PSAweDAwMjA7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IG5ld19hZHZlcnRpc2UgfD0gMHgwMDQwOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiBuZXdfYWR2ZXJ0aXNlIHw9IDB4MDA4MDsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTogbmV3X2FkdmVydGlzZSB8PSAweDAxMDA7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDY6IG5ld19hZHZlcnRpc2UgfD0gMHgwMjAwOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBsZWFmLT5tZWRpYSA9IDE5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsZWFmLT5sZWFmZGF0YSA9IHAgKyAyOworICAgICAgICAgICAgICAgIHAgKz0gKHBbMF0gJiAweDNmKSArIDE7CisgICAgICAgICAgICB9CisjaWZkZWYgVFVMSVBfREVCVUcKKyAgICAgICAgICAgIGlmICh0dWxpcF9kZWJ1ZyA+IDEgICYmICBsZWFmLT5tZWRpYSA9PSAxMSkgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJwID0gbGVhZi0+bGVhZmRhdGE7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlczogIE1JSSBpbnRlcmZhY2UgUEhZICVkLCBzZXR1cC9yZXNldCBzZXF1ZW5jZXMgJWQvJWQgbG9uZywgY2FwYWJpbGl0aWVzICVoaFggJWhoWC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSwgYnBbMF0sIGJwWzFdLCBicFsyICsgYnBbMV0qMl0sCisgICAgICAgICAgICAgICAgICAgICAgIGJwWzUgKyBicFsyICsgYnBbMV0qMl0qMl0sIGJwWzQgKyBicFsyICsgYnBbMV0qMl0qMl0pOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBwcmludGYoIiVzOiAgSW5kZXggIyVkIC0gTWVkaWEgJXMgKCMlZCkgZGVzY3JpYmVkICIKKyAgICAgICAgICAgICAgICAgICAiYnkgYSAlcyAoJWQpIGJsb2NrLlxuIiwKKyAgICAgICAgICAgICAgICAgICB0cC0+bmljX25hbWUsIGksIG1lZGlhbmFtZVtsZWFmLT5tZWRpYV0sIGxlYWYtPm1lZGlhLAorICAgICAgICAgICAgICAgICAgIGxlYWYtPnR5cGUgPCA2ID8gYmxvY2tfbmFtZVtsZWFmLT50eXBlXSA6ICJVTktOT1dOIiwKKyAgICAgICAgICAgICAgICAgICBsZWFmLT50eXBlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmV3X2FkdmVydGlzZSkKKyAgICAgICAgICAgIHRwLT5zeW1fYWR2ZXJ0aXNlID0gbmV3X2FkdmVydGlzZTsKKyAgICB9Cit9CisKKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiB0dWxpcF9pbml0X3JpbmcgLSBzZXR1cCB0aGUgdHggYW5kIHJ4IGRlc2NyaXB0b3JzICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgdHVsaXBfaW5pdF9yaW5nKHN0cnVjdCBuaWMgKm5pYykKK3sKKyAgICBpbnQgaTsKKworI2lmZGVmIFRVTElQX0RFQlVHX1dIRVJFCisgICAgd2hlcmVhbWkoInR1bGlwX2luaXRfcmluZ1xuIik7CisjZW5kaWYKKworICAgIHRwLT5jdXJfcnggPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJcnhfcmluZ1tpXS5zdGF0dXMgID0gY3B1X3RvX2xlMzIoMHg4MDAwMDAwMCk7CisJcnhfcmluZ1tpXS5sZW5ndGggID0gY3B1X3RvX2xlMzIoQlVGTEVOKTsKKwlyeF9yaW5nW2ldLmJ1ZmZlcjEgPSB2aXJ0X3RvX2xlMzJkZXNjKCZyeGJbaSAqIEJVRkxFTl0pOworCXJ4X3JpbmdbaV0uYnVmZmVyMiA9IHZpcnRfdG9fbGUzMmRlc2MoJnJ4X3JpbmdbaSsxXSk7CisgICAgfQorICAgIC8qIE1hcmsgdGhlIGxhc3QgZW50cnkgYXMgd3JhcHBpbmcgdGhlIHJpbmcuICovCisgICAgcnhfcmluZ1tpLTFdLmxlbmd0aCAgICA9IGNwdV90b19sZTMyKERFU0NfUklOR19XUkFQIHwgQlVGTEVOKTsKKyAgICByeF9yaW5nW2ktMV0uYnVmZmVyMiAgID0gdmlydF90b19sZTMyZGVzYygmcnhfcmluZ1swXSk7CisKKyAgICAvKiBXZSBvbmx5IHVzZSAxIHRyYW5zbWl0IGJ1ZmZlciwgYnV0IHdlIHVzZSAyIGRlc2NyaXB0b3JzIHNvCisgICAgICAgdHJhbnNtaXQgZW5naW5lcyBoYXZlIHNvbWV3aGVyZSB0byBwb2ludCB0byBpZiB0aGV5IGZlZWwgdGhlIG5lZWQgKi8KKworICAgIHR4X3JpbmdbMF0uc3RhdHVzICA9IDB4MDAwMDAwMDA7CisgICAgdHhfcmluZ1swXS5idWZmZXIxID0gdmlydF90b19sZTMyZGVzYygmdHhiWzBdKTsKKyAgICB0eF9yaW5nWzBdLmJ1ZmZlcjIgPSB2aXJ0X3RvX2xlMzJkZXNjKCZ0eF9yaW5nWzFdKTsKKworICAgIC8qIHRoaXMgZGVzY3JpcHRvciBzaG91bGQgbmV2ZXIgZ2V0IHVzZWQsIHNpbmNlIGl0IHdpbGwgbmV2ZXIgYmUgb3duZWQKKyAgICAgICBieSB0aGUgbWFjaGluZSAoc3RhdHVzIHdpbGwgYWx3YXlzID09IDApICovCisgICAgdHhfcmluZ1sxXS5zdGF0dXMgID0gMHgwMDAwMDAwMDsKKyAgICB0eF9yaW5nWzFdLmJ1ZmZlcjEgPSB2aXJ0X3RvX2xlMzJkZXNjKCZ0eGJbMF0pOworICAgIHR4X3JpbmdbMV0uYnVmZmVyMiA9IHZpcnRfdG9fbGUzMmRlc2MoJnR4X3JpbmdbMF0pOworCisgICAgLyogTWFyayB0aGUgbGFzdCBlbnRyeSBhcyB3cmFwcGluZyB0aGUgcmluZywgdGhvdWdoIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworICAgIHR4X3JpbmdbMV0ubGVuZ3RoICA9IGNwdV90b19sZTMyKERFU0NfUklOR19XUkFQIHwgQlVGTEVOKTsKK30KKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBldGhfcmVzZXQgLSBSZXNldCBhZGFwdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHR1bGlwX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBsb25nIHRvOworICAgIHUzMiBhZGRyX2xvdywgYWRkcl9oaWdoOworCisjaWZkZWYgVFVMSVBfREVCVUdfV0hFUkUKKyAgICB3aGVyZWFtaSgidHVsaXBfcmVzZXRcbiIpOworI2VuZGlmCisKKyAgICAvKiBTdG9wIFR4IGFuZCBSWCAqLworICAgIG91dGwoaW5sKGlvYWRkciArIENTUjYpICYgfjB4MDAwMDIwMDIsIGlvYWRkciArIENTUjYpOworCisgICAgLyogT24gc29tZSBjaGlwIHJldnMgd2UgbXVzdCBzZXQgdGhlIE1JSS9TWU0gcG9ydCBiZWZvcmUgdGhlIHJlc2V0IT8gKi8KKyAgICBpZiAodHAtPm1paV9jbnQgIHx8ICAodHAtPm10YWJsZSAgJiYgIHRwLT5tdGFibGUtPmhhc19taWkpKSB7CisJb3V0bCgweDgxNEMwMDAwLCBpb2FkZHIgKyBDU1I2KTsKKyAgICB9CisgIAorICAgIC8qIFJlc2V0IHRoZSBjaGlwLCBob2xkaW5nIGJpdCAwIHNldCBhdCBsZWFzdCA1MCBQQ0kgY3ljbGVzLiAqLworICAgIG91dGwoMHgwMDAwMDAwMSwgaW9hZGRyICsgQ1NSMCk7CisgICAgdHVsaXBfd2FpdCgxKTsKKworICAgIC8qIHR1cm4gb2ZmIHJlc2V0IGFuZCBzZXQgY2FjaGUgYWxpZ249MTZsd29yZCwgYnVyc3Q9dW5saW1pdCAqLworICAgIG91dGwodHAtPmNzcjAsIGlvYWRkciArIENTUjApOworCisgICAgLyogIFdhaXQgdGhlIHNwZWNpZmllZCA1MCBQQ0kgY3ljbGVzIGFmdGVyIGEgcmVzZXQgKi8KKyAgICB0dWxpcF93YWl0KDEpOworCisgICAgLyogc2V0IHVwIHRyYW5zbWl0IGFuZCByZWNlaXZlIGRlc2NyaXB0b3JzICovCisgICAgdHVsaXBfaW5pdF9yaW5nKG5pYyk7CisKKyAgICBpZiAodHAtPmNoaXBfaWQgPT0gUE5JQzIpIHsKKyAgICAgICAgdTMyIGFkZHJfaGlnaCA9IChuaWMtPm5vZGVfYWRkclsxXTw8OCkgKyAobmljLT5ub2RlX2FkZHJbMF08PDApOworICAgICAgICAvKiBUaGlzIGFkZHJlc3Mgc2V0dGluZyBkb2VzIG5vdCBhcHBlYXIgdG8gaW1wYWN0IGNoaXAgb3BlcmF0aW9uPz8gKi8KKyAgICAgICAgb3V0bCgobmljLT5ub2RlX2FkZHJbNV08PDgpICsgbmljLT5ub2RlX2FkZHJbNF0gKworICAgICAgICAgICAgIChuaWMtPm5vZGVfYWRkclszXTw8MjQpICsgKG5pYy0+bm9kZV9hZGRyWzJdPDwxNiksCisgICAgICAgICAgICAgaW9hZGRyICsgMHhCMCk7CisgICAgICAgIG91dGwoYWRkcl9oaWdoICsgKGFkZHJfaGlnaDw8MTYpLCBpb2FkZHIgKyAweEI4KTsKKyAgICB9CisKKyAgICAvKiBNQ19IQVNIX09OTFkgYm9hcmRzIGRvbid0IHN1cHBvcnQgc2V0dXAgcGFja2V0cyAqLworICAgIGlmICh0cC0+ZmxhZ3MgJiBNQ19IQVNIX09OTFkpIHsKKyAgICAgICAgdTMyIGFkZHJfbG93ID0gY3B1X3RvX2xlMzIoZ2V0X3VuYWxpZ25lZCgodTMyICopbmljLT5ub2RlX2FkZHIpKTsKKyAgICAgICAgdTMyIGFkZHJfaGlnaCA9IGNwdV90b19sZTMyKGdldF91bmFsaWduZWQoKHUxNiAqKShuaWMtPm5vZGVfYWRkcis0KSkpOworCisJLyogY2xlYXIgbXVsdGljYXN0IGhhc2ggZmlsdGVycyBhbmQgc2V0dXAgTUFDIGFkZHJlc3MgZmlsdGVycyAqLworCWlmICh0cC0+ZmxhZ3MgJiBJU19BU0lYKSB7CisgICAgICAgICAgICBvdXRsKDAsIGlvYWRkciArIENTUjEzKTsKKyAgICAgICAgICAgIG91dGwoYWRkcl9sb3csICBpb2FkZHIgKyBDU1IxNCk7CisgICAgICAgICAgICBvdXRsKDEsIGlvYWRkciArIENTUjEzKTsKKyAgICAgICAgICAgIG91dGwoYWRkcl9oaWdoLCBpb2FkZHIgKyBDU1IxNCk7CisJICAgIG91dGwoMiwgaW9hZGRyICsgQ1NSMTMpOworCSAgICBvdXRsKDAsIGlvYWRkciArIENTUjE0KTsKKwkgICAgb3V0bCgzLCBpb2FkZHIgKyBDU1IxMyk7CisJICAgIG91dGwoMCwgaW9hZGRyICsgQ1NSMTQpOworCX0gZWxzZSBpZiAodHAtPmNoaXBfaWQgPT0gQ09NRVQpIHsKKyAgICAgICAgICAgIG91dGwoYWRkcl9sb3csICBpb2FkZHIgKyAweEE0KTsKKyAgICAgICAgICAgIG91dGwoYWRkcl9oaWdoLCBpb2FkZHIgKyAweEE4KTsKKyAgICAgICAgICAgIG91dGwoMCwgaW9hZGRyICsgMHhBQyk7CisgICAgICAgICAgICBvdXRsKDAsIGlvYWRkciArIDB4QjApOworCX0KKyAgICB9IGVsc2UgeworCS8qIGZvciBvdGhlciBib2FyZHMgd2Ugc2VuZCBhIHNldHVwIHBhY2tldCB0byBpbml0aWFsaXplCisJICAgdGhlIGZpbHRlcnMgKi8KKwl1MzIgdHhfZmxhZ3MgPSAweDA4MDAwMDAwIHwgMTkyOworCisJLyogY29uc3RydWN0IHBlcmZlY3QgZmlsdGVyIGZyYW1lIHdpdGggbWFjIGFkZHJlc3MgYXMgZmlyc3QgbWF0Y2gKKwkgICBhbmQgYnJvYWRjYXN0IGFkZHJlc3MgZm9yIGFsbCBvdGhlcnMgKi8KKwlmb3IgKGk9MDsgaTwxOTI7IGkrKykgCisJICAgIHR4YltpXSA9IDB4RkY7CisJdHhiWzBdID0gbmljLT5ub2RlX2FkZHJbMF07CisJdHhiWzFdID0gbmljLT5ub2RlX2FkZHJbMV07CisJdHhiWzRdID0gbmljLT5ub2RlX2FkZHJbMl07CisJdHhiWzVdID0gbmljLT5ub2RlX2FkZHJbM107CisJdHhiWzhdID0gbmljLT5ub2RlX2FkZHJbNF07CisJdHhiWzldID0gbmljLT5ub2RlX2FkZHJbNV07CisKKwl0eF9yaW5nWzBdLmxlbmd0aCAgPSBjcHVfdG9fbGUzMih0eF9mbGFncyk7CisJdHhfcmluZ1swXS5idWZmZXIxID0gdmlydF90b19sZTMyZGVzYygmdHhiWzBdKTsKKwl0eF9yaW5nWzBdLnN0YXR1cyAgPSBjcHVfdG9fbGUzMigweDgwMDAwMDAwKTsKKyAgICB9CisKKyAgICAvKiBQb2ludCB0byByeCBhbmQgdHggZGVzY3JpcHRvcnMgKi8KKyAgICBvdXRsKCh1bnNpZ25lZCBsb25nKSZyeF9yaW5nWzBdLCBpb2FkZHIgKyBDU1IzKTsKKyAgICBvdXRsKCh1bnNpZ25lZCBsb25nKSZ0eF9yaW5nWzBdLCBpb2FkZHIgKyBDU1I0KTsKKworICAgIGluaXRfbWVkaWEobmljKTsKKworICAgIC8qIHNldCB0aGUgY2hpcCdzIG9wZXJhdGluZyBtb2RlIChidXQgZG9uJ3QgdHVybiBvbiB4bWl0IGFuZCByZWN2IHlldCkgKi8KKyAgICBvdXRsKCh0cC0+Y3NyNiAmIH4weDAwMDAyMDAyKSwgaW9hZGRyICsgQ1NSNik7CisKKyAgICAvKiBzZW5kIHNldHVwIHBhY2tldCBmb3IgY2FyZHMgdGhhdCBzdXBwb3J0IGl0ICovCisgICAgaWYgKCEodHAtPmZsYWdzICYgTUNfSEFTSF9PTkxZKSkgeworCS8qIGVuYWJsZSB0cmFuc21pdCAgd2FpdCBmb3IgY29tcGxldGlvbiAqLworCW91dGwodHAtPmNzcjYgfCAweDAwMDAyMDAwLCBpb2FkZHIgKyBDU1I2KTsKKwkvKiBpbW1lZGlhdGUgdHJhbnNtaXQgZGVtYW5kICovCisJb3V0bCgwLCBpb2FkZHIgKyBDU1IxKTsKKworCXRvID0gY3VycnRpY2tzKCkgKyBUWF9USU1FX09VVDsKKwl3aGlsZSAoKHR4X3JpbmdbMF0uc3RhdHVzICYgMHg4MDAwMDAwMCkgJiYgKGN1cnJ0aWNrcygpIDwgdG8pKQorCSAgICAvKiB3YWl0ICovIDsKKworCWlmIChjdXJydGlja3MoKSA+PSB0bykgeworCSAgICBwcmludGYgKCIlczogVFggU2V0dXAgVGltZW91dC5cbiIsIHRwLT5uaWNfbmFtZSk7CisJfQorICAgIH0KKworICAgIGlmICh0cC0+Y2hpcF9pZCA9PSBMQzgyQzE2OCkKKwl0dWxpcF9jaGVja19kdXBsZXgobmljKTsKKworICAgIC8qIGVuYWJsZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSAqLworICAgIG91dGwodHAtPmNzcjYgfCAweDAwMDAyMDAyLCBpb2FkZHIgKyBDU1I2KTsKK30KKworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGV0aF90cmFuc21pdCAtIFRyYW5zbWl0IGEgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgdHVsaXBfdHJhbnNtaXQoc3RydWN0IG5pYyAqbmljLCBjb25zdCBjaGFyICpkLCB1bnNpZ25lZCBpbnQgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzLCBjb25zdCBjaGFyICpwKQoreworICAgIHUxNiBuc3R5cGU7CisgICAgdTMyIHRvOworICAgIHUzMiBjc3I2ID0gaW5sKGlvYWRkciArIENTUjYpOworCisjaWZkZWYgVFVMSVBfREVCVUdfV0hFUkUgICAgCisgICAgd2hlcmVhbWkoInR1bGlwX3RyYW5zbWl0XG4iKTsKKyNlbmRpZgorCisgICAgLyogRGlzYWJsZSBUeCAqLworICAgIG91dGwoY3NyNiAmIH4weDAwMDAyMDAwLCBpb2FkZHIgKyBDU1I2KTsKKworICAgIG1lbWNweSh0eGIsIGQsIEVUSF9BTEVOKTsKKyAgICBtZW1jcHkodHhiICsgRVRIX0FMRU4sIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7CisgICAgbnN0eXBlID0gaHRvbnMoKHUxNikgdCk7CisgICAgbWVtY3B5KHR4YiArIDIgKiBFVEhfQUxFTiwgKHU4ICopJm5zdHlwZSwgMik7CisgICAgbWVtY3B5KHR4YiArIEVUSF9ITEVOLCBwLCBzKTsKKworICAgIHMgKz0gRVRIX0hMRU47CisgICAgcyAmPSAweDBGRkY7CisKKyAgICAvKiBwYWQgdG8gbWluaW11bSBwYWNrZXQgc2l6ZSAqLworICAgIHdoaWxlIChzIDwgRVRIX1pMRU4pICAKKyAgICAgICAgdHhiW3MrK10gPSAnXDAnOworCisjaWZkZWYgVFVMSVBfREVCVUcKKyAgICBpZiAodHVsaXBfZGVidWcgPiAxKQorCXByaW50ZigiJXM6IHNlbmRpbmcgJWQgYnl0ZXMgZXRodHlwZSAlaFhcbiIsIHRwLT5uaWNfbmFtZSwgcywgdCk7CisjZW5kaWYKKyAgICAgICAgCisgICAgLyogc2V0dXAgdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IgKi8KKyAgICAvKiAweDYwMDAwMDAwID0gbm8gaW50ZXJydXB0IG9uIGNvbXBsZXRpb24gKi8KKyAgICB0eF9yaW5nWzBdLmxlbmd0aCA9IGNwdV90b19sZTMyKDB4NjAwMDAwMDAgfCBzKTsKKyAgICB0eF9yaW5nWzBdLnN0YXR1cyA9IGNwdV90b19sZTMyKDB4ODAwMDAwMDApOworCisgICAgLyogUG9pbnQgdG8gdHJhbnNtaXQgZGVzY3JpcHRvciAqLworICAgIG91dGwoKHUzMikmdHhfcmluZ1swXSwgaW9hZGRyICsgQ1NSNCk7CisKKyAgICAvKiBFbmFibGUgVHggKi8KKyAgICBvdXRsKGNzcjYgfCAweDAwMDAyMDAwLCBpb2FkZHIgKyBDU1I2KTsKKyAgICAvKiBpbW1lZGlhdGUgdHJhbnNtaXQgZGVtYW5kICovCisgICAgb3V0bCgwLCBpb2FkZHIgKyBDU1IxKTsKKworICAgIHRvID0gY3VycnRpY2tzKCkgKyBUWF9USU1FX09VVDsKKyAgICB3aGlsZSAoKHR4X3JpbmdbMF0uc3RhdHVzICYgMHg4MDAwMDAwMCkgJiYgKGN1cnJ0aWNrcygpIDwgdG8pKQorICAgICAgICAvKiB3YWl0ICovIDsKKworICAgIGlmIChjdXJydGlja3MoKSA+PSB0bykgeworICAgICAgICBwcmludGYgKCJUWCBUaW1lb3V0IVxuIik7CisgICAgfQorCisgICAgLyogRGlzYWJsZSBUeCAqLworICAgIG91dGwoY3NyNiAmIH4weDAwMDAyMDAwLCBpb2FkZHIgKyBDU1I2KTsKK30KKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBldGhfcG9sbCAtIFdhaXQgZm9yIGEgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgdHVsaXBfcG9sbChzdHJ1Y3QgbmljICpuaWMpCit7CisKKyNpZmRlZiBUVUxJUF9ERUJVR19XSEVSRQorICAgIHdoZXJlYW1pKCJ0dWxpcF9wb2xsXG4iKTsKKyNlbmRpZgorCisgICAgLyogbm8gcGFja2V0IHdhaXRpbmcuIHBhY2tldCBzdGlsbCBvd25lZCBieSBOSUMgKi8KKyAgICBpZiAocnhfcmluZ1t0cC0+Y3VyX3J4XS5zdGF0dXMgJiAweDgwMDAwMDAwKQorICAgICAgICByZXR1cm4gMDsKKworI2lmZGVmIFRVTElQX0RFQlVHX1dIRVJFCisgICAgd2hlcmVhbWkoInR1bGlwX3BvbGwgZ290IG9uZVxuIik7CisjZW5kaWYKKworICAgIG5pYy0+cGFja2V0bGVuID0gKHJ4X3JpbmdbdHAtPmN1cl9yeF0uc3RhdHVzICYgMHgzRkZGMDAwMCkgPj4gMTY7CisKKyAgICAvKiBpZiB3ZSBnZXQgYSBjb3JydXB0ZWQgcGFja2V0LiB0aHJvdyBpdCBhd2F5IGFuZCBtb3ZlIG9uICovCisgICAgaWYgKHJ4X3JpbmdbdHAtPmN1cl9yeF0uc3RhdHVzICYgMHgwMDAwODAwMCkgeworCS8qIHJldHVybiB0aGUgZGVzY3JpcHRvciBhbmQgYnVmZmVyIHRvIHJlY2VpdmUgcmluZyAqLworICAgICAgICByeF9yaW5nW3RwLT5jdXJfcnhdLnN0YXR1cyA9IDB4ODAwMDAwMDA7CisJdHAtPmN1cl9yeCA9ICgrK3RwLT5jdXJfcngpICUgUlhfUklOR19TSVpFOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBjb3B5IHBhY2tldCB0byB3b3JraW5nIGJ1ZmZlciAqLworICAgIG1lbWNweShuaWMtPnBhY2tldCwgcnhiICsgdHAtPmN1cl9yeCAqIEJVRkxFTiwgbmljLT5wYWNrZXRsZW4pOworCisgICAgLyogcmV0dXJuIHRoZSBkZXNjcmlwdG9yIGFuZCBidWZmZXIgdG8gcmVjZWl2ZSByaW5nICovCisgICAgcnhfcmluZ1t0cC0+Y3VyX3J4XS5zdGF0dXMgPSAweDgwMDAwMDAwOworICAgIHRwLT5jdXJfcnggPSAoKyt0cC0+Y3VyX3J4KSAlIFJYX1JJTkdfU0laRTsKKworICAgIHJldHVybiAxOworfQorDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGV0aF9kaXNhYmxlIC0gRGlzYWJsZSB0aGUgaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgdHVsaXBfZGlzYWJsZShzdHJ1Y3QgbmljICpuaWMpCit7CisKKyNpZmRlZiBUVUxJUF9ERUJVR19XSEVSRQorICAgIHdoZXJlYW1pKCJ0dWxpcF9kaXNhYmxlXG4iKTsKKyNlbmRpZgorCisgICAgLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisgICAgb3V0bCgweDAwMDAwMDAwLCBpb2FkZHIgKyBDU1I3KTsKKworICAgIC8qIFN0b3AgdGhlIGNoaXAncyBUeCBhbmQgUnggcHJvY2Vzc2VzLiAqLworICAgIG91dGwoaW5sKGlvYWRkciArIENTUjYpICYgfjB4MDAwMDIwMDIsIGlvYWRkciArIENTUjYpOworCisgICAgLyogQ2xlYXIgdGhlIG1pc3NlZC1wYWNrZXQgY291bnRlci4gKi8KKyAgICAodm9sYXRpbGUgdW5zaWduZWQgbG9uZylpbmwoaW9hZGRyICsgQ1NSOCk7Cit9CisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZXRoX3Byb2JlIC0gTG9vayBmb3IgYW4gYWRhcHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgbmljICp0dWxpcF9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICppb19hZGRycywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwY2lfZGV2aWNlICpwY2kpCit7CisgICAgdTMyIGksIGwxLCBsMjsKKyAgICB1OCAgY2hpcF9yZXY7CisgICAgdTggZWVfZGF0YVtFRVBST01fU0laRV07CisgICAgdW5zaWduZWQgc2hvcnQgc3VtOworICAgIGludCBjaGlwX2lkeDsKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBsYXN0X3BoeXNfYWRkcltFVEhfQUxFTl0gPSB7MHgwMCwgJ0wnLCAnaScsICduJywgJ3UnLCAneCd9OworCisgICAgaWYgKGlvX2FkZHJzID09IDAgfHwgKmlvX2FkZHJzID09IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgaW9hZGRyICAgICAgICAgPSAqaW9fYWRkcnM7CisKKyAgICAvKiBwb2ludCB0byBwcml2YXRlIHN0b3JhZ2UgKi8KKyAgICB0cCA9ICZ0cHg7CisKKyAgICB0cC0+dmVuZG9yX2lkICA9IHBjaS0+dmVuZG9yOworICAgIHRwLT5kZXZfaWQgICAgID0gcGNpLT5kZXZfaWQ7CisgICAgdHAtPm5pY19uYW1lICAgPSBwY2ktPm5hbWU7CisKKyAgICB0cC0+aWZfcG9ydCA9IDA7CisgICAgdHAtPmRlZmF1bHRfcG9ydCA9IDA7CisKKyAgICBhZGp1c3RfcGNpX2RldmljZShwY2kpOworCisgICAgLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisgICAgb3V0bCgweDAwMDAwMDAwLCBpb2FkZHIgKyBDU1I3KTsKKworICAgIC8qIFN0b3AgdGhlIGNoaXAncyBUeCBhbmQgUnggcHJvY2Vzc2VzLiAqLworICAgIG91dGwoaW5sKGlvYWRkciArIENTUjYpICYgfjB4MDAwMDIwMDIsIGlvYWRkciArIENTUjYpOworCisgICAgLyogQ2xlYXIgdGhlIG1pc3NlZC1wYWNrZXQgY291bnRlci4gKi8KKyAgICAodm9sYXRpbGUgdW5zaWduZWQgbG9uZylpbmwoaW9hZGRyICsgQ1NSOCk7CisKKyAgICBwcmludGYoIlxuIik7ICAgICAgICAgICAgICAgIC8qIHNvIHdlIHN0YXJ0IG9uIGEgZnJlc2ggbGluZSAqLworI2lmZGVmIFRVTElQX0RFQlVHX1dIRVJFCisgICAgd2hlcmVhbWkoInR1bGlwX3Byb2JlXG4iKTsKKyNlbmRpZgorCisjaWZkZWYgVFVMSVBfREVCVUcKKyAgICBpZiAodHVsaXBfZGVidWcgPiAxKQorCXByaW50ZiAoIiVzOiBMb29raW5nIGZvciBUdWxpcCBDaGlwOiBWZW5kb3I9JWhYICBEZXZpY2U9JWhYXG4iLCB0cC0+bmljX25hbWUsCisJCXRwLT52ZW5kb3JfaWQsIHRwLT5kZXZfaWQpOworI2VuZGlmCisKKyAgICAvKiBGaWd1cmUgb3V0IHdoaWNoIGNoaXAgd2UncmUgZGVhbGluZyB3aXRoICovCisgICAgaSA9IDA7CisgICAgY2hpcF9pZHggPSAtMTsKKyAgCisgICAgd2hpbGUgKHBjaV9pZF90YmxbaV0ubmFtZSkgeworICAgICAgICBpZiAoICgoKHUzMikgdHAtPmRldl9pZCA8PCAxNikgfCB0cC0+dmVuZG9yX2lkKSA9PSAKKyAgICAgICAgICAgICAocGNpX2lkX3RibFtpXS5pZC5wY2kgJiBwY2lfaWRfdGJsW2ldLmlkLnBjaV9tYXNrKSApIHsKKyAgICAgICAgICAgIGNoaXBfaWR4ID0gcGNpX2lkX3RibFtpXS5kcnZfZmxhZ3M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpKys7CisgICAgfQorCisgICAgaWYgKGNoaXBfaWR4ID09IC0xKSB7CisgICAgICAgIHByaW50ZiAoIiVzOiBVbmtub3duIFR1bGlwIENoaXA6IFZlbmRvcj0laFggIERldmljZT0laFhcbiIsIHRwLT5uaWNfbmFtZSwKKyAgICAgICAgICAgICAgICB0cC0+dmVuZG9yX2lkLCB0cC0+ZGV2X2lkKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdHAtPnBjaV9pZF9pZHggPSBpOworICAgIHRwLT5mbGFncyA9IHR1bGlwX3RibFtjaGlwX2lkeF0uZmxhZ3M7CisKKyNpZmRlZiBUVUxJUF9ERUJVRworICAgIGlmICh0dWxpcF9kZWJ1ZyA+IDEpIHsKKwlwcmludGYgKCIlczogdHAtPnBjaV9pZF9pZHggPT0gJWQsICBuYW1lID09ICVzXG4iLCB0cC0+bmljX25hbWUsIAorCQl0cC0+cGNpX2lkX2lkeCwgcGNpX2lkX3RibFt0cC0+cGNpX2lkX2lkeF0ubmFtZSk7CisJcHJpbnRmICgiJXM6IGNoaXBfaWR4ID09ICVkLCBuYW1lID09ICVzXG4iLCB0cC0+bmljX25hbWUsIGNoaXBfaWR4LCAKKwkJdHVsaXBfdGJsW2NoaXBfaWR4XS5jaGlwX25hbWUpOworICAgIH0KKyNlbmRpZgorICAKKyAgICAvKiBCcmluZyB0aGUgMjEwNDEvMjExNDMgb3V0IG9mIHNsZWVwIG1vZGUuCisgICAgICAgQ2F1dGlvbjogU25vb3plIG1vZGUgZG9lcyBub3Qgd29yayB3aXRoIHNvbWUgYm9hcmRzISAqLworICAgIGlmICh0cC0+ZmxhZ3MgJiBIQVNfUFdSRFdOKQorICAgICAgICBwY2liaW9zX3dyaXRlX2NvbmZpZ19kd29yZChwY2ktPmJ1cywgcGNpLT5kZXZmbiwgMHg0MCwgMHgwMDAwMDAwMCk7CisKKyAgICBpZiAoaW5sKGlvYWRkciArIENTUjUpID09IDB4RkZGRkZGRkYpIHsKKyAgICAgICAgcHJpbnRmKCIlczogVGhlIFR1bGlwIGNoaXAgYXQgJVggaXMgbm90IGZ1bmN0aW9uaW5nLlxuIiwKKyAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSwgaW9hZGRyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgCisgICAgcGNpYmlvc19yZWFkX2NvbmZpZ19ieXRlKHBjaS0+YnVzLCBwY2ktPmRldmZuLCBQQ0lfUkVWSVNJT04sICZjaGlwX3Jldik7CisKKyAgICBwcmludGYoIiVzOiBbY2hpcDogJXNdIHJldiAlZCBhdCAlaFhcbiIsIHRwLT5uaWNfbmFtZSwKKyAgICAgICAgICAgdHVsaXBfdGJsW2NoaXBfaWR4XS5jaGlwX25hbWUsIGNoaXBfcmV2LCBpb2FkZHIpOworICAgIHByaW50ZigiJXM6IFZlbmRvcj0laFggIERldmljZT0laFgiLCB0cC0+bmljX25hbWUsIHRwLT52ZW5kb3JfaWQsIHRwLT5kZXZfaWQpOworCisgICAgaWYgKGNoaXBfaWR4ID09IERDMjEwNDEgICYmICBpbmwoaW9hZGRyICsgQ1NSOSkgJiAweDgwMDApIHsKKyAgICAgICAgcHJpbnRmKCIgMjEwNDAgY29tcGF0aWJsZSBtb2RlLiIpOworICAgICAgICBjaGlwX2lkeCA9IERDMjEwNDA7CisgICAgfQorCisgICAgcHJpbnRmKCJcbiIpOworCisgICAgLyogVGhlIFNST00vRUVQUk9NIGludGVyZmFjZSB2YXJpZXMgZHJhbWF0aWNhbGx5LiAqLworICAgIHN1bSA9IDA7CisgICAgaWYgKGNoaXBfaWR4ID09IERDMjEwNDApIHsKKyAgICAgICAgb3V0bCgwLCBpb2FkZHIgKyBDU1I5KTsgICAgICAgICAvKiBSZXNldCB0aGUgcG9pbnRlciB3aXRoIGEgZHVtbXkgd3JpdGUuICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKSB7CisgICAgICAgICAgICBpbnQgdmFsdWUsIGJvZ3VzY250ID0gMTAwMDAwOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGlubChpb2FkZHIgKyBDU1I5KTsKKyAgICAgICAgICAgIHdoaWxlICh2YWx1ZSA8IDAgICYmIC0tYm9ndXNjbnQgPiAwKTsKKyAgICAgICAgICAgIG5pYy0+bm9kZV9hZGRyW2ldID0gdmFsdWU7CisgICAgICAgICAgICBzdW0gKz0gdmFsdWUgJiAweGZmOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChjaGlwX2lkeCA9PSBMQzgyQzE2OCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICBpbnQgdmFsdWUsIGJvZ3VzY250ID0gMTAwMDAwOworICAgICAgICAgICAgb3V0bCgweDYwMCB8IGksIGlvYWRkciArIDB4OTgpOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGlubChpb2FkZHIgKyBDU1I5KTsKKyAgICAgICAgICAgIHdoaWxlICh2YWx1ZSA8IDAgICYmIC0tYm9ndXNjbnQgPiAwKTsKKyAgICAgICAgICAgIHB1dF91bmFsaWduZWQobGUxNl90b19jcHUodmFsdWUpLCAoKHUxNiopbmljLT5ub2RlX2FkZHIpICsgaSk7CisgICAgICAgICAgICBzdW0gKz0gdmFsdWUgJiAweGZmZmY7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNoaXBfaWR4ID09IENPTUVUKSB7CisgICAgICAgIC8qIE5vIG5lZWQgdG8gcmVhZCB0aGUgRUVQUk9NLiAqLworICAgICAgICBwdXRfdW5hbGlnbmVkKGlubChpb2FkZHIgKyAweEE0KSwgKHUzMiAqKW5pYy0+bm9kZV9hZGRyKTsKKyAgICAgICAgcHV0X3VuYWxpZ25lZChpbmwoaW9hZGRyICsgMHhBOCksICh1MTYgKikobmljLT5ub2RlX2FkZHIgKyA0KSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSArKykKKyAgICAgICAgICAgIHN1bSArPSBuaWMtPm5vZGVfYWRkcltpXTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBBIHNlcmlhbCBFRVBST00gaW50ZXJmYWNlLCB3ZSByZWFkIG5vdyBhbmQgc29ydCBpdCBvdXQgbGF0ZXIuICovCisgICAgICAgIGludCBzYV9vZmZzZXQgPSAwOworICAgICAgICBpbnQgZWVfYWRkcl9zaXplID0gcmVhZF9lZXByb20oaW9hZGRyLCAweGZmLCA4KSAmIDB4NDAwMDAgPyA4IDogNjsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGVlX2RhdGEpLzI7IGkrKykKKyAgICAgICAgICAgICgodTE2ICopZWVfZGF0YSlbaV0gPQorICAgICAgICAgICAgICAgIGxlMTZfdG9fY3B1KHJlYWRfZWVwcm9tKGlvYWRkciwgaSwgZWVfYWRkcl9zaXplKSk7CisKKyAgICAgICAgLyogREVDIG5vdyBoYXMgYSBzcGVjaWZpY2F0aW9uIChzZWUgTm90ZXMpIGJ1dCBlYXJseSBib2FyZCBtYWtlcnMKKyAgICAgICAgICAganVzdCBwdXQgdGhlIGFkZHJlc3MgaW4gdGhlIGZpcnN0IEVFUFJPTSBsb2NhdGlvbnMuICovCisgICAgICAgIC8qIFRoaXMgZG9lcyAgbWVtY21wKGVlZGF0YSwgZWVkYXRhKzE2LCA4KSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSArKykKKyAgICAgICAgICAgIGlmIChlZV9kYXRhW2ldICE9IGVlX2RhdGFbMTYraV0pCisgICAgICAgICAgICAgICAgc2Ffb2Zmc2V0ID0gMjA7CisgICAgICAgIGlmIChlZV9kYXRhWzBdID09IDB4ZmYgICYmICBlZV9kYXRhWzFdID09IDB4ZmYgJiYgIGVlX2RhdGFbMl0gPT0gMCkgeworICAgICAgICAgICAgc2Ffb2Zmc2V0ID0gMjsgICAgICAgICAgICAgIC8qIEdycnIsIGRhbW4gTWF0cm94IGJvYXJkcy4gKi8KKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkgKyspIHsKKyAgICAgICAgICAgIG5pYy0+bm9kZV9hZGRyW2ldID0gZWVfZGF0YVtpICsgc2Ffb2Zmc2V0XTsKKyAgICAgICAgICAgIHN1bSArPSBlZV9kYXRhW2kgKyBzYV9vZmZzZXRdOworICAgICAgICB9CisgICAgfQorICAgIC8qIExpdGUtT24gYm9hcmRzIGhhdmUgdGhlIGFkZHJlc3MgYnl0ZS1zd2FwcGVkLiAqLworICAgIGlmICgobmljLT5ub2RlX2FkZHJbMF0gPT0gMHhBMCAgfHwgIG5pYy0+bm9kZV9hZGRyWzBdID09IDB4QzApCisgICAgICAgICYmICBuaWMtPm5vZGVfYWRkclsxXSA9PSAweDAwKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrPTIpIHsKKyAgICAgICAgICAgIGNoYXIgdG1wID0gbmljLT5ub2RlX2FkZHJbaV07CisgICAgICAgICAgICBuaWMtPm5vZGVfYWRkcltpXSA9IG5pYy0+bm9kZV9hZGRyW2krMV07CisgICAgICAgICAgICBuaWMtPm5vZGVfYWRkcltpKzFdID0gdG1wOworICAgICAgICB9CisKKyAgICBpZiAoc3VtID09IDAgIHx8IHN1bSA9PSBFVEhfQUxFTioweGZmKSB7CisgICAgICAgIHByaW50ZigiJXM6IEVFUFJPTSBub3QgcHJlc2VudCFcbiIsIHRwLT5uaWNfbmFtZSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTi0xOyBpKyspCisgICAgICAgICAgICBuaWMtPm5vZGVfYWRkcltpXSA9IGxhc3RfcGh5c19hZGRyW2ldOworICAgICAgICBuaWMtPm5vZGVfYWRkcltpXSA9IGxhc3RfcGh5c19hZGRyW2ldICsgMTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKKyAgICAgICAgbGFzdF9waHlzX2FkZHJbaV0gPSBuaWMtPm5vZGVfYWRkcltpXTsKKworICAgIHByaW50ZigiJXM6ICUhIGF0IGlvYWRkciAlaFhcbiIsIHRwLT5uaWNfbmFtZSwgbmljLT5ub2RlX2FkZHIsIGlvYWRkcik7CisKKyAgICB0cC0+Y2hpcF9pZCA9IGNoaXBfaWR4OworICAgIHRwLT5yZXZpc2lvbiA9IGNoaXBfcmV2OworICAgIHRwLT5jc3IwID0gY3NyMDsKKworICAgIC8qIEJ1Z0ZpeGVzOiBUaGUgMjExNDMtVEQgaGFuZ3Mgd2l0aCBQQ0kgV3JpdGUtYW5kLUludmFsaWRhdGUgY3ljbGVzLgorICAgICAgIEFuZCB0aGUgQVNJWCBtdXN0IGhhdmUgYSBidXJzdCBsaW1pdCBvciBob3JyaWJsZSB0aGluZ3MgaGFwcGVuLiAqLworICAgIGlmIChjaGlwX2lkeCA9PSBEQzIxMTQzICAmJiAgY2hpcF9yZXYgPT0gNjUpCisgICAgICAgIHRwLT5jc3IwICY9IH4weDAxMDAwMDAwOworICAgIGVsc2UgaWYgKHRwLT5mbGFncyAmIElTX0FTSVgpCisgICAgICAgIHRwLT5jc3IwIHw9IDB4MjAwMDsKKworICAgIGlmIChtZWRpYV9jYXBbdHAtPmRlZmF1bHRfcG9ydF0gJiBNZWRpYUlzTUlJKSB7CisgICAgICAgIHUxNiBtZWRpYTJhZHZlcnRbXSA9IHsgMHgyMCwgMHg0MCwgMHgwM2UwLCAweDYwLCAweDgwLCAweDEwMCwgMHgyMDAgfTsKKyAgICAgICAgdHAtPm1paV9hZHZlcnRpc2UgPSBtZWRpYTJhZHZlcnRbdHAtPmRlZmF1bHRfcG9ydCAtIDldOworICAgICAgICB0cC0+bWlpX2FkdmVydGlzZSB8PSAodHAtPmZsYWdzICYgSEFTXzgwMjNYKTsgLyogTWF0Y2hpbmcgYml0cyEgKi8KKyAgICB9CisKKyAgICAvKiBUaGlzIGlzIGxvZ2ljYWxseSBwYXJ0IG9mIHRoZSBwcm9iZSByb3V0aW5lLCBidXQgdG9vIGNvbXBsZXgKKyAgICAgICB0byB3cml0ZSBpbmxpbmUuICovCisgICAgaWYgKHRwLT5mbGFncyAmIEhBU19NRURJQV9UQUJMRSkgeworICAgICAgICBtZW1jcHkodHAtPmVlcHJvbSwgZWVfZGF0YSwgc2l6ZW9mKHRwLT5lZXByb20pKTsKKyAgICAgICAgcGFyc2VfZWVwcm9tKG5pYyk7CisgICAgfQorCisgICAgc3RhcnRfbGluayhuaWMpOworCisgICAgLyogcmVzZXQgdGhlIGRldmljZSBhbmQgbWFrZSByZWFkeSBmb3IgdHggYW5kIHJ4IG9mIHBhY2tldHMgKi8KKyAgICB0dWxpcF9yZXNldChuaWMpOworCisgICAgbmljLT5yZXNldCAgICA9IHR1bGlwX3Jlc2V0OworICAgIG5pYy0+cG9sbCAgICAgPSB0dWxpcF9wb2xsOworICAgIG5pYy0+dHJhbnNtaXQgPSB0dWxpcF90cmFuc21pdDsKKyAgICBuaWMtPmRpc2FibGUgID0gdHVsaXBfZGlzYWJsZTsKKworICAgIC8qIGdpdmUgdGhlIGJvYXJkIGEgY2hhbmNlIHRvIHJlc2V0IGJlZm9yZSByZXR1cm5pbmcgKi8KKyAgICB0dWxpcF93YWl0KDQqVElDS1NfUEVSX1NFQyk7CisKKyAgICByZXR1cm4gbmljOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9saW5rKHN0cnVjdCBuaWMgKm5pYykKK3sKKyAgICBpbnQgaTsKKworI2lmZGVmIFRVTElQX0RFQlVHX1dIRVJFCisgICAgd2hlcmVhbWkoInN0YXJ0X2xpbmtcbiIpOworI2VuZGlmCisKKyAgICBpZiAoKHRwLT5mbGFncyAmIEFMV0FZU19DSEVDS19NSUkpIHx8CisgICAgICAgICh0cC0+bXRhYmxlICAmJiAgdHAtPm10YWJsZS0+aGFzX21paSkgfHwKKyAgICAgICAgKCAhIHRwLT5tdGFibGUgICYmICAodHAtPmZsYWdzICYgSEFTX01JSSkpKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBwaHksIHBoeV9pZHg7CisgICAgICAgIGlmICh0cC0+bXRhYmxlICAmJiAgdHAtPm10YWJsZS0+aGFzX21paSkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRwLT5tdGFibGUtPmxlYWZjb3VudDsgaSsrKQorICAgICAgICAgICAgICAgIGlmICh0cC0+bXRhYmxlLT5tbGVhZltpXS5tZWRpYSA9PSAxMSkgeworICAgICAgICAgICAgICAgICAgICB0cC0+Y3VyX2luZGV4ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgdHAtPnNhdmVkX2lmX3BvcnQgPSB0cC0+aWZfcG9ydDsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0X21lZGlhKG5pYywgMik7CisgICAgICAgICAgICAgICAgICAgIHRwLT5pZl9wb3J0ID0gdHAtPnNhdmVkX2lmX3BvcnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEZpbmQgdGhlIGNvbm5lY3RlZCBNSUkgeGN2cnMuICovCisgICAgICAgIGZvciAocGh5ID0gMCwgcGh5X2lkeCA9IDA7IHBoeSA8IDMyICYmIHBoeV9pZHggPCBzaXplb2YodHAtPnBoeXMpOworICAgICAgICAgICAgIHBoeSsrKSB7CisgICAgICAgICAgICBpbnQgbWlpX3N0YXR1cyA9IG1kaW9fcmVhZChuaWMsIHBoeSwgMSk7CisgICAgICAgICAgICBpZiAoKG1paV9zdGF0dXMgJiAweDgzMDEpID09IDB4ODAwMSB8fAorICAgICAgICAgICAgICAgICgobWlpX3N0YXR1cyAmIDB4ODAwMCkgPT0gMCAgJiYgKG1paV9zdGF0dXMgJiAweDc4MDApICE9IDApKSB7CisgICAgICAgICAgICAgICAgaW50IG1paV9yZWcwID0gbWRpb19yZWFkKG5pYywgcGh5LCAwKTsKKyAgICAgICAgICAgICAgICBpbnQgbWlpX2FkdmVydCA9IG1kaW9fcmVhZChuaWMsIHBoeSwgNCk7CisgICAgICAgICAgICAgICAgaW50IHRvX2FkdmVydDsKKworICAgICAgICAgICAgICAgIGlmICh0cC0+bWlpX2FkdmVydGlzZSkKKyAgICAgICAgICAgICAgICAgICAgdG9fYWR2ZXJ0ID0gdHAtPm1paV9hZHZlcnRpc2U7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodHAtPmFkdmVydGlzaW5nW3BoeV9pZHhdKQorICAgICAgICAgICAgICAgICAgICB0b19hZHZlcnQgPSB0cC0+YWR2ZXJ0aXNpbmdbcGh5X2lkeF07CisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgLyogTGVhdmUgdW5jaGFuZ2VkLiAqLworICAgICAgICAgICAgICAgICAgICB0cC0+bWlpX2FkdmVydGlzZSA9IHRvX2FkdmVydCA9IG1paV9hZHZlcnQ7CisKKyAgICAgICAgICAgICAgICB0cC0+cGh5c1twaHlfaWR4KytdID0gcGh5OworICAgICAgICAgICAgICAgIHByaW50ZigiJXM6ICBNSUkgdHJhbnNjZWl2ZXIgJWQgY29uZmlnICVoWCBzdGF0dXMgJWhYIGFkdmVydGlzaW5nICVoWC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSwgcGh5LCBtaWlfcmVnMCwgbWlpX3N0YXR1cywgbWlpX2FkdmVydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpeHVwIGZvciBETGluayB3aXRoIG1pc3dpcmVkIFBIWS4gKi8KKyAgICAgICAgICAgICAgICBpZiAobWlpX2FkdmVydCAhPSB0b19hZHZlcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlczogIEFkdmVydGlzaW5nICVoWCBvbiBQSFkgJWQgcHJldmlvdXNseSBhZHZlcnRpc2luZyAlaFguXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm5pY19uYW1lLCB0b19hZHZlcnQsIHBoeSwgbWlpX2FkdmVydCk7CisgICAgICAgICAgICAgICAgICAgIG1kaW9fd3JpdGUobmljLCBwaHksIDQsIHRvX2FkdmVydCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgYXV0b25lZ290aWF0aW9uOiBzb21lIGJvYXJkcyBkZWZhdWx0IHRvIG9mZi4gKi8KKyAgICAgICAgICAgICAgICBtZGlvX3dyaXRlKG5pYywgcGh5LCAwLCBtaWlfcmVnMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAodHAtPmZ1bGxfZHVwbGV4ID8gMHgxMTAwIDogMHgxMDAwKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVkaWFfY2FwW3RwLT5kZWZhdWx0X3BvcnRdJk1lZGlhSXMxMDAgPyAweDIwMDA6MCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRwLT5taWlfY250ID0gcGh5X2lkeDsKKyAgICAgICAgaWYgKHRwLT5tdGFibGUgICYmICB0cC0+bXRhYmxlLT5oYXNfbWlpICAmJiAgcGh5X2lkeCA9PSAwKSB7CisgICAgICAgICAgICBwcmludGYoIiVzOiAqKipXQVJOSU5HKioqOiBObyBNSUkgdHJhbnNjZWl2ZXIgZm91bmQhXG4iLAorICAgICAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSk7CisgICAgICAgICAgICB0cC0+cGh5c1swXSA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZXNldCB0aGUgeGN2ciBpbnRlcmZhY2UgYW5kIHR1cm4gb24gaGVhcnRiZWF0LiAqLworICAgIHN3aXRjaCAodHAtPmNoaXBfaWQpIHsKKyAgICBjYXNlIERDMjEwNDA6CisgICAgICAgIG91dGwoMHgwMDAwMDAwMCwgaW9hZGRyICsgQ1NSMTMpOworICAgICAgICBvdXRsKDB4MDAwMDAwMDQsIGlvYWRkciArIENTUjEzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEQzIxMDQxOgorICAgICAgICAvKiBUaGlzIGlzIG53YXlfc3RhcnQoKS4gKi8KKyAgICAgICAgaWYgKHRwLT5zeW1fYWR2ZXJ0aXNlID09IDApCisgICAgICAgICAgICB0cC0+c3ltX2FkdmVydGlzZSA9IDB4MDA2MTsKKyAgICAgICAgb3V0bCgweDAwMDAwMDAwLCBpb2FkZHIgKyBDU1IxMyk7CisgICAgICAgIG91dGwoMHhGRkZGRkZGRiwgaW9hZGRyICsgQ1NSMTQpOworICAgICAgICBvdXRsKDB4MDAwMDAwMDgsIGlvYWRkciArIENTUjE1KTsgLyogTGlzdGVuIG9uIEFVSSBhbHNvLiAqLworICAgICAgICBvdXRsKGlubChpb2FkZHIgKyBDU1I2KSB8IDB4MDIwMCwgaW9hZGRyICsgQ1NSNik7CisgICAgICAgIG91dGwoMHgwMDAwRUYwMSwgaW9hZGRyICsgQ1NSMTMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERDMjExNDA6IGRlZmF1bHQ6CisgICAgICAgIGlmICh0cC0+bXRhYmxlKQorICAgICAgICAgICAgb3V0bCh0cC0+bXRhYmxlLT5jc3IxMmRpciB8IDB4MTAwLCBpb2FkZHIgKyBDU1IxMik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgREMyMTE0MjoKKyAgICBjYXNlIFBOSUMyOgorICAgICAgICBpZiAodHAtPm1paV9jbnQgIHx8ICBtZWRpYV9jYXBbdHAtPmlmX3BvcnRdICYgTWVkaWFJc01JSSkgeworICAgICAgICAgICAgb3V0bCgweDgyMDIwMDAwLCBpb2FkZHIgKyBDU1I2KTsKKyAgICAgICAgICAgIG91dGwoMHgwMDAwLCBpb2FkZHIgKyBDU1IxMyk7CisgICAgICAgICAgICBvdXRsKDB4MDAwMCwgaW9hZGRyICsgQ1NSMTQpOworICAgICAgICAgICAgb3V0bCgweDgyMEUwMDAwLCBpb2FkZHIgKyBDU1I2KTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBud2F5X3N0YXJ0KG5pYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTEM4MkMxNjg6CisgICAgICAgIGlmICggISB0cC0+bWlpX2NudCkgeworICAgICAgICAgICAgdHAtPm53YXkgPSAxOworICAgICAgICAgICAgdHAtPm53YXlzZXQgPSAwOworICAgICAgICAgICAgb3V0bCgweDAwNDIwMDAwLCBpb2FkZHIgKyBDU1I2KTsKKyAgICAgICAgICAgIG91dGwoMHgzMCwgaW9hZGRyICsgQ1NSMTIpOworICAgICAgICAgICAgb3V0bCgweDAwMDFGMDc4LCBpb2FkZHIgKyAweEI4KTsKKyAgICAgICAgICAgIG91dGwoMHgwMjAxRjA3OCwgaW9hZGRyICsgMHhCOCk7IC8qIFR1cm4gb24gYXV0b25lZ290aWF0aW9uLiAqLworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVg5ODcxMzogY2FzZSBDT01QRVg5ODgxOgorICAgICAgICBvdXRsKDB4MDAwMDAwMDAsIGlvYWRkciArIENTUjYpOworICAgICAgICBvdXRsKDB4MDAwNzExQzAsIGlvYWRkciArIENTUjE0KTsgLyogVHVybiBvbiBOV2F5LiAqLworICAgICAgICBvdXRsKDB4MDAwMDAwMDEsIGlvYWRkciArIENTUjEzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNWDk4NzE1OiBjYXNlIE1YOTg3MjU6CisgICAgICAgIG91dGwoMHgwMWE4MDAwMCwgaW9hZGRyICsgQ1NSNik7CisgICAgICAgIG91dGwoMHhGRkZGRkZGRiwgaW9hZGRyICsgQ1NSMTQpOworICAgICAgICBvdXRsKDB4MDAwMDEwMDAsIGlvYWRkciArIENTUjEyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDT01FVDoKKyAgICAgICAgLyogTm8gaW5pdGlhbGl6YXRpb24gbmVjZXNzYXJ5LiAqLworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG53YXlfc3RhcnQoc3RydWN0IG5pYyAqbmljKQoreworICAgIGludCBjc3IxNCA9ICgodHAtPnN5bV9hZHZlcnRpc2UgJiAweDA3ODApIDw8IDkpICB8CisgICAgICAgICgodHAtPnN5bV9hZHZlcnRpc2UmMHgwMDIwKTw8MSkgfCAweGZmYmY7CisKKyNpZmRlZiBUVUxJUF9ERUJVR19XSEVSRQorICAgIHdoZXJlYW1pKCJud2F5X3N0YXJ0XG4iKTsKKyNlbmRpZgorCisgICAgdHAtPmlmX3BvcnQgPSAwOworICAgIHRwLT5ud2F5ID0gdHAtPm1lZGlhc2Vuc2UgPSAxOworICAgIHRwLT5ud2F5c2V0ID0gdHAtPmxwYXIgPSAwOworICAgIGlmICh0cC0+Y2hpcF9pZCA9PSBQTklDMikgeworICAgICAgICB0cC0+Y3NyNiA9IDB4MDEwMDAwMDAgfCAodHAtPnN5bV9hZHZlcnRpc2UgJiAweDAwNDAgPyAweDAyMDAgOiAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNpZmRlZiBUVUxJUF9ERUJVRworICAgIGlmICh0dWxpcF9kZWJ1ZyA+IDEpCisgICAgICAgIHByaW50ZigiJXM6IFJlc3RhcnRpbmcgaW50ZXJuYWwgTldheSBhdXRvbmVnb3RpYXRpb24sICVYLlxuIiwKKyAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSwgY3NyMTQpOworI2VuZGlmCisgICAgb3V0bCgweDAwMDEsIGlvYWRkciArIENTUjEzKTsKKyAgICBvdXRsKGNzcjE0LCBpb2FkZHIgKyBDU1IxNCk7CisgICAgdHAtPmNzcjYgPSAweDgyNDIwMDAwIHwgKHRwLT5zeW1fYWR2ZXJ0aXNlICYgMHgwMDQwID8gMHgwMjAwIDogMCk7CisgICAgb3V0bCh0cC0+Y3NyNiwgaW9hZGRyICsgQ1NSNik7CisgICAgaWYgKHRwLT5tdGFibGUgICYmICB0cC0+bXRhYmxlLT5jc3IxNWRpcikgeworICAgICAgICBvdXRsKHRwLT5tdGFibGUtPmNzcjE1ZGlyLCBpb2FkZHIgKyBDU1IxNSk7CisgICAgICAgIG91dGwodHAtPm10YWJsZS0+Y3NyMTV2YWwsIGlvYWRkciArIENTUjE1KTsKKyAgICB9IGVsc2UgaWYgKHRwLT5jaGlwX2lkICE9IFBOSUMyKQorICAgICAgICBvdXR3KDB4MDAwOCwgaW9hZGRyICsgQ1NSMTUpOworICAgIGlmICh0cC0+Y2hpcF9pZCA9PSBEQzIxMDQxKSAgICAgICAgICAgICAgICAgLyogVHJpZ2dlciBOV0FZLiAqLworICAgICAgICBvdXRsKDB4RUYwMSwgaW9hZGRyICsgQ1NSMTIpOworICAgIGVsc2UKKyAgICAgICAgb3V0bCgweDEzMDEsIGlvYWRkciArIENTUjEyKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9tZWRpYShzdHJ1Y3QgbmljICpuaWMpCit7CisgICAgaW50IGk7CisKKyNpZmRlZiBUVUxJUF9ERUJVR19XSEVSRQorICAgIHdoZXJlYW1pKCJpbml0X21lZGlhXG4iKTsKKyNlbmRpZgorCisgICAgdHAtPnNhdmVkX2lmX3BvcnQgPSB0cC0+aWZfcG9ydDsKKyAgICBpZiAodHAtPmlmX3BvcnQgPT0gMCkKKyAgICAgICAgdHAtPmlmX3BvcnQgPSB0cC0+ZGVmYXVsdF9wb3J0OworCisgICAgLyogQWxsb3cgc2VsZWN0aW5nIGEgZGVmYXVsdCBtZWRpYS4gKi8KKyAgICBpID0gMDsKKyAgICBpZiAodHAtPm10YWJsZSA9PSBOVUxMKQorICAgICAgICBnb3RvIG1lZGlhX3BpY2tlZDsKKyAgICBpZiAodHAtPmlmX3BvcnQpIHsKKyAgICAgICAgaW50IGxvb2tpbmdfZm9yID0gbWVkaWFfY2FwW3RwLT5pZl9wb3J0XSAmIE1lZGlhSXNNSUkgPyAxMSA6CisgICAgICAgICAgICAodHAtPmlmX3BvcnQgPT0gMTIgPyAwIDogdHAtPmlmX3BvcnQpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHAtPm10YWJsZS0+bGVhZmNvdW50OyBpKyspCisgICAgICAgICAgICBpZiAodHAtPm10YWJsZS0+bWxlYWZbaV0ubWVkaWEgPT0gbG9va2luZ19mb3IpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzOiBVc2luZyB1c2VyLXNwZWNpZmllZCBtZWRpYSAlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSwgbWVkaWFuYW1lW3RwLT5pZl9wb3J0XSk7CisgICAgICAgICAgICAgICAgZ290byBtZWRpYV9waWNrZWQ7CisgICAgICAgICAgICB9CisgICAgfQorICAgIGlmICgodHAtPm10YWJsZS0+ZGVmYXVsdG1lZGlhICYgMHgwODAwKSA9PSAwKSB7CisgICAgICAgIGludCBsb29raW5nX2ZvciA9IHRwLT5tdGFibGUtPmRlZmF1bHRtZWRpYSAmIDE1OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHAtPm10YWJsZS0+bGVhZmNvdW50OyBpKyspCisgICAgICAgICAgICBpZiAodHAtPm10YWJsZS0+bWxlYWZbaV0ubWVkaWEgPT0gbG9va2luZ19mb3IpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzOiBVc2luZyBFRVBST00tc2V0IG1lZGlhICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHAtPm5pY19uYW1lLCBtZWRpYW5hbWVbbG9va2luZ19mb3JdKTsKKyAgICAgICAgICAgICAgICBnb3RvIG1lZGlhX3BpY2tlZDsKKyAgICAgICAgICAgIH0KKyAgICB9CisgICAgLyogU3RhcnQgc2Vuc2luZyBmaXJzdCBub24tZnVsbC1kdXBsZXggbWVkaWEuICovCisgICAgZm9yIChpID0gdHAtPm10YWJsZS0+bGVhZmNvdW50IC0gMTsKKyAgICAgICAgIChtZWRpYV9jYXBbdHAtPm10YWJsZS0+bWxlYWZbaV0ubWVkaWFdICYgTWVkaWFBbHdheXNGRCkgJiYgaSA+IDA7IGktLSkKKyAgICAgICAgOworIG1lZGlhX3BpY2tlZDoKKworICAgIHRwLT5jc3I2ID0gMDsKKyAgICB0cC0+Y3VyX2luZGV4ID0gaTsKKyAgICB0cC0+bndheXNldCA9IDA7CisKKyAgICBpZiAodHAtPmlmX3BvcnQpIHsKKyAgICAgICAgaWYgKHRwLT5jaGlwX2lkID09IERDMjExNDMgICYmICBtZWRpYV9jYXBbdHAtPmlmX3BvcnRdICYgTWVkaWFJc01JSSkgeworICAgICAgICAgICAgLyogV2UgbXVzdCByZXNldCB0aGUgbWVkaWEgQ1NScyB3aGVuIHdlIGZvcmNlLXNlbGVjdCBNSUkgbW9kZS4gKi8KKyAgICAgICAgICAgIG91dGwoMHgwMDAwLCBpb2FkZHIgKyBDU1IxMyk7CisgICAgICAgICAgICBvdXRsKDB4MDAwMCwgaW9hZGRyICsgQ1NSMTQpOworICAgICAgICAgICAgb3V0bCgweDAwMDgsIGlvYWRkciArIENTUjE1KTsKKyAgICAgICAgfQorICAgICAgICBzZWxlY3RfbWVkaWEobmljLCAxKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzd2l0Y2godHAtPmNoaXBfaWQpIHsKKyAgICBjYXNlIERDMjEwNDE6CisgICAgICAgIC8qIHRwLT5ud2F5ID0gMTsqLworICAgICAgICBud2F5X3N0YXJ0KG5pYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgREMyMTE0MjoKKyAgICAgICAgaWYgKHRwLT5taWlfY250KSB7CisgICAgICAgICAgICBzZWxlY3RfbWVkaWEobmljLCAxKTsKKyNpZmRlZiBUVUxJUF9ERUJVRworICAgICAgICAgICAgaWYgKHR1bGlwX2RlYnVnID4gMSkKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzOiBVc2luZyBNSUkgdHJhbnNjZWl2ZXIgJWQsIHN0YXR1cyAlaFguXG4iLAorICAgICAgICAgICAgICAgICAgICAgICB0cC0+bmljX25hbWUsIHRwLT5waHlzWzBdLCBtZGlvX3JlYWQobmljLCB0cC0+cGh5c1swXSwgMSkpOworI2VuZGlmCisgICAgICAgICAgICBvdXRsKDB4ODIwMjAwMDAsIGlvYWRkciArIENTUjYpOworICAgICAgICAgICAgdHAtPmNzcjYgPSAweDgyMEUwMDAwOworICAgICAgICAgICAgdHAtPmlmX3BvcnQgPSAxMTsKKyAgICAgICAgICAgIG91dGwoMHgwMDAwLCBpb2FkZHIgKyBDU1IxMyk7CisgICAgICAgICAgICBvdXRsKDB4MDAwMCwgaW9hZGRyICsgQ1NSMTQpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG53YXlfc3RhcnQobmljKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQTklDMjoKKyAgICAgICAgbndheV9zdGFydChuaWMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIExDODJDMTY4OgorICAgICAgICBpZiAodHAtPm1paV9jbnQpIHsKKyAgICAgICAgICAgIHRwLT5pZl9wb3J0ID0gMTE7CisgICAgICAgICAgICB0cC0+Y3NyNiA9IDB4ODE0QzAwMDAgfCAodHAtPmZ1bGxfZHVwbGV4ID8gMHgwMjAwIDogMCk7CisgICAgICAgICAgICBvdXRsKDB4MDAwMSwgaW9hZGRyICsgQ1NSMTUpOworICAgICAgICB9IGVsc2UgaWYgKGlubChpb2FkZHIgKyBDU1I1KSAmIFRQTG5rUGFzcykKKyAgICAgICAgICAgIHBuaWNfZG9fbndheShuaWMpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIFN0YXJ0IHdpdGggMTBtYnBzIHRvIGRvIGF1dG9uZWdvdGlhdGlvbi4gKi8KKyAgICAgICAgICAgIG91dGwoMHgzMiwgaW9hZGRyICsgQ1NSMTIpOworICAgICAgICAgICAgdHAtPmNzcjYgPSAweDAwNDIwMDAwOworICAgICAgICAgICAgb3V0bCgweDAwMDFCMDc4LCBpb2FkZHIgKyAweEI4KTsKKyAgICAgICAgICAgIG91dGwoMHgwMjAxQjA3OCwgaW9hZGRyICsgMHhCOCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNWDk4NzEzOiBjYXNlIENPTVBFWDk4ODE6CisgICAgICAgIHRwLT5pZl9wb3J0ID0gMDsKKyAgICAgICAgdHAtPmNzcjYgPSAweDAxODgwMDAwIHwgKHRwLT5mdWxsX2R1cGxleCA/IDB4MDIwMCA6IDApOworICAgICAgICBvdXRsKDB4MGYzNzAwMDAgfCBpbncoaW9hZGRyICsgMHg4MCksIGlvYWRkciArIDB4ODApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1YOTg3MTU6IGNhc2UgTVg5ODcyNToKKyAgICAgICAgLyogUHJvdmlkZWQgYnkgQk9MTywgTWFjcm9uaXggLSAxMi8xMC8xOTk4LiAqLworICAgICAgICB0cC0+aWZfcG9ydCA9IDA7CisgICAgICAgIHRwLT5jc3I2ID0gMHgwMWE4MDIwMDsKKyAgICAgICAgb3V0bCgweDBmMzcwMDAwIHwgaW53KGlvYWRkciArIDB4ODApLCBpb2FkZHIgKyAweDgwKTsKKyAgICAgICAgb3V0bCgweDExMDAwIHwgaW53KGlvYWRkciArIDB4YTApLCBpb2FkZHIgKyAweGEwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDT01FVDoKKyAgICAgICAgdHAtPmlmX3BvcnQgPSAwOworCXRwLT5jc3I2ID0gMHgwMDA0MDAwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBWDg4MTQwOiBjYXNlIEFYODgxNDE6CisgICAgICAgIHRwLT5jc3I2ID0gdHAtPm1paV9jbnQgPyAweDAwMDQwMTAwIDogMHgwMDAwMDEwMDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc2VsZWN0X21lZGlhKG5pYywgMSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwbmljX2RvX253YXkoc3RydWN0IG5pYyAqbmljKQoreworICAgIHUzMiBwaHlfcmVnID0gaW5sKGlvYWRkciArIDB4QjgpOworICAgIHUzMiBuZXdfY3NyNiA9IHRwLT5jc3I2ICYgfjB4NDBDNDAyMDA7CisKKyNpZmRlZiBUVUxJUF9ERUJVR19XSEVSRQorICAgIHdoZXJlYW1pKCJwbmljX2RvX253YXlcbiIpOworI2VuZGlmCisKKyAgICBpZiAocGh5X3JlZyAmIDB4NzgwMDAwMDApIHsgLyogSWdub3JlIGJhc2VUNCAqLworICAgICAgICBpZiAocGh5X3JlZyAmIDB4MjAwMDAwMDApICAgICAgICAgICAgICAgdHAtPmlmX3BvcnQgPSA1OworICAgICAgICBlbHNlIGlmIChwaHlfcmVnICYgMHg0MDAwMDAwMCkgIHRwLT5pZl9wb3J0ID0gMzsKKyAgICAgICAgZWxzZSBpZiAocGh5X3JlZyAmIDB4MTAwMDAwMDApICB0cC0+aWZfcG9ydCA9IDQ7CisgICAgICAgIGVsc2UgaWYgKHBoeV9yZWcgJiAweDA4MDAwMDAwKSAgdHAtPmlmX3BvcnQgPSAwOworICAgICAgICB0cC0+bndheXNldCA9IDE7CisgICAgICAgIG5ld19jc3I2ID0gKHRwLT5pZl9wb3J0ICYgMSkgPyAweDAxODYwMDAwIDogMHgwMDQyMDAwMDsKKyAgICAgICAgb3V0bCgweDMyIHwgKHRwLT5pZl9wb3J0ICYgMSksIGlvYWRkciArIENTUjEyKTsKKyAgICAgICAgaWYgKHRwLT5pZl9wb3J0ICYgMSkKKyAgICAgICAgICAgIG91dGwoMHgxRjg2OCwgaW9hZGRyICsgMHhCOCk7CisgICAgICAgIGlmIChwaHlfcmVnICYgMHgzMDAwMDAwMCkgeworICAgICAgICAgICAgdHAtPmZ1bGxfZHVwbGV4ID0gMTsKKyAgICAgICAgICAgIG5ld19jc3I2IHw9IDB4MDAwMDAyMDA7CisgICAgICAgIH0KKyNpZmRlZiBUVUxJUF9ERUJVRworICAgICAgICBpZiAodHVsaXBfZGVidWcgPiAxKQorICAgICAgICAgICAgcHJpbnRmKCIlczogUE5JQyBhdXRvbmVnb3RpYXRlZCBzdGF0dXMgJVgsICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICB0cC0+bmljX25hbWUsIHBoeV9yZWcsIG1lZGlhbmFtZVt0cC0+aWZfcG9ydF0pOworI2VuZGlmCisgICAgICAgIGlmICh0cC0+Y3NyNiAhPSBuZXdfY3NyNikgeworICAgICAgICAgICAgdHAtPmNzcjYgPSBuZXdfY3NyNjsKKyAgICAgICAgICAgIG91dGwodHAtPmNzcjYgfCAweDAwMDIsIGlvYWRkciArIENTUjYpOyAgICAgLyogUmVzdGFydCBUeCAqLworICAgICAgICAgICAgb3V0bCh0cC0+Y3NyNiB8IDB4MjAwMiwgaW9hZGRyICsgQ1NSNik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIFNldCB1cCB0aGUgdHJhbnNjZWl2ZXIgY29udHJvbCByZWdpc3RlcnMgZm9yIHRoZSBzZWxlY3RlZCBtZWRpYSB0eXBlLiAqLworc3RhdGljIHZvaWQgc2VsZWN0X21lZGlhKHN0cnVjdCBuaWMgKm5pYywgaW50IHN0YXJ0dXApCit7CisgICAgc3RydWN0IG1lZGlhdGFibGUgKm10YWJsZSA9IHRwLT5tdGFibGU7CisgICAgdTMyIG5ld19jc3I2OworICAgIGludCBpOworCisjaWZkZWYgVFVMSVBfREVCVUdfV0hFUkUKKyAgICB3aGVyZWFtaSgic2VsZWN0X21lZGlhXG4iKTsKKyNlbmRpZgorCisgICAgaWYgKG10YWJsZSkgeworICAgICAgICBzdHJ1Y3QgbWVkaWFsZWFmICptbGVhZiA9ICZtdGFibGUtPm1sZWFmW3RwLT5jdXJfaW5kZXhdOworICAgICAgICB1bnNpZ25lZCBjaGFyICpwID0gbWxlYWYtPmxlYWZkYXRhOworICAgICAgICBzd2l0Y2ggKG1sZWFmLT50eXBlKSB7CisgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMTE0MCBub24tTUlJIHhjdnIuICovCisjaWZkZWYgVFVMSVBfREVCVUcKKyAgICAgICAgICAgIGlmICh0dWxpcF9kZWJ1ZyA+IDEpCisgICAgICAgICAgICAgICAgcHJpbnRmKCIlczogVXNpbmcgYSAyMTE0MCBub24tTUlJIHRyYW5zY2VpdmVyIgorICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggY29udHJvbCBzZXR0aW5nICVoaFguXG4iLAorICAgICAgICAgICAgICAgICAgICAgICB0cC0+bmljX25hbWUsIHBbMV0pOworI2VuZGlmCisgICAgICAgICAgICB0cC0+aWZfcG9ydCA9IHBbMF07CisgICAgICAgICAgICBpZiAoc3RhcnR1cCkKKyAgICAgICAgICAgICAgICBvdXRsKG10YWJsZS0+Y3NyMTJkaXIgfCAweDEwMCwgaW9hZGRyICsgQ1NSMTIpOworICAgICAgICAgICAgb3V0bChwWzFdLCBpb2FkZHIgKyBDU1IxMik7CisgICAgICAgICAgICBuZXdfY3NyNiA9IDB4MDIwMDAwMDAgfCAoKHBbMl0gJiAweDcxKSA8PCAxOCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOiBjYXNlIDQ6IHsKKyAgICAgICAgICAgIHUxNiBzZXR1cFs1XTsKKyAgICAgICAgICAgIHUzMiBjc3IxM3ZhbCwgY3NyMTR2YWwsIGNzcjE1ZGlyLCBjc3IxNXZhbDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisgICAgICAgICAgICAgICAgc2V0dXBbaV0gPSBnZXRfdTE2KCZwW2kqMiArIDFdKTsKKworICAgICAgICAgICAgdHAtPmlmX3BvcnQgPSBwWzBdICYgMTU7CisgICAgICAgICAgICBpZiAobWVkaWFfY2FwW3RwLT5pZl9wb3J0XSAmIE1lZGlhQWx3YXlzRkQpCisgICAgICAgICAgICAgICAgdHAtPmZ1bGxfZHVwbGV4ID0gMTsKKworICAgICAgICAgICAgaWYgKHN0YXJ0dXAgJiYgbXRhYmxlLT5oYXNfcmVzZXQpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgbWVkaWFsZWFmICpybGVhZiA9ICZtdGFibGUtPm1sZWFmW210YWJsZS0+aGFzX3Jlc2V0XTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpyc3QgPSBybGVhZi0+bGVhZmRhdGE7CisjaWZkZWYgVFVMSVBfREVCVUcKKyAgICAgICAgICAgICAgICBpZiAodHVsaXBfZGVidWcgPiAxKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzOiBSZXNldHRpbmcgdGhlIHRyYW5zY2VpdmVyLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcnN0WzBdOyBpKyspCisgICAgICAgICAgICAgICAgICAgIG91dGwoZ2V0X3UxNihyc3QgKyAxICsgKGk8PDEpKSA8PCAxNiwgaW9hZGRyICsgQ1NSMTUpOworICAgICAgICAgICAgfQorI2lmZGVmIFRVTElQX0RFQlVHCisgICAgICAgICAgICBpZiAodHVsaXBfZGVidWcgPiAxKQorICAgICAgICAgICAgICAgIHByaW50ZigiJXM6IDIxMTQzIG5vbi1NSUkgJXMgdHJhbnNjZWl2ZXIgY29udHJvbCAiCisgICAgICAgICAgICAgICAgICAgICAgICIlaFgvJWhYLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHAtPm5pY19uYW1lLCBtZWRpYW5hbWVbdHAtPmlmX3BvcnRdLCBzZXR1cFswXSwgc2V0dXBbMV0pOworI2VuZGlmCisgICAgICAgICAgICBpZiAocFswXSAmIDB4NDApIHsgIC8qIFNJQSAoQ1NSMTMtMTUpIHNldHVwIHZhbHVlcyBhcmUgcHJvdmlkZWQuICovCisgICAgICAgICAgICAgICAgY3NyMTN2YWwgPSBzZXR1cFswXTsKKyAgICAgICAgICAgICAgICBjc3IxNHZhbCA9IHNldHVwWzFdOworICAgICAgICAgICAgICAgIGNzcjE1ZGlyID0gKHNldHVwWzNdPDwxNikgfCBzZXR1cFsyXTsKKyAgICAgICAgICAgICAgICBjc3IxNXZhbCA9IChzZXR1cFs0XTw8MTYpIHwgc2V0dXBbMl07CisgICAgICAgICAgICAgICAgb3V0bCgwLCBpb2FkZHIgKyBDU1IxMyk7CisgICAgICAgICAgICAgICAgb3V0bChjc3IxNHZhbCwgaW9hZGRyICsgQ1NSMTQpOworICAgICAgICAgICAgICAgIG91dGwoY3NyMTVkaXIsIGlvYWRkciArIENTUjE1KTsgLyogRGlyZWN0aW9uICovCisgICAgICAgICAgICAgICAgb3V0bChjc3IxNXZhbCwgaW9hZGRyICsgQ1NSMTUpOyAvKiBEYXRhICovCisgICAgICAgICAgICAgICAgb3V0bChjc3IxM3ZhbCwgaW9hZGRyICsgQ1NSMTMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjc3IxM3ZhbCA9IDE7CisgICAgICAgICAgICAgICAgY3NyMTR2YWwgPSAweDAwMDNGRjdGOworICAgICAgICAgICAgICAgIGNzcjE1ZGlyID0gKHNldHVwWzBdPDwxNikgfCAweDAwMDg7CisgICAgICAgICAgICAgICAgY3NyMTV2YWwgPSAoc2V0dXBbMV08PDE2KSB8IDB4MDAwODsKKyAgICAgICAgICAgICAgICBpZiAodHAtPmlmX3BvcnQgPD0gNCkKKyAgICAgICAgICAgICAgICAgICAgY3NyMTR2YWwgPSB0MjExNDJfY3NyMTRbdHAtPmlmX3BvcnRdOworICAgICAgICAgICAgICAgIGlmIChzdGFydHVwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dGwoMCwgaW9hZGRyICsgQ1NSMTMpOworICAgICAgICAgICAgICAgICAgICBvdXRsKGNzcjE0dmFsLCBpb2FkZHIgKyBDU1IxNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dGwoY3NyMTVkaXIsIGlvYWRkciArIENTUjE1KTsgLyogRGlyZWN0aW9uICovCisgICAgICAgICAgICAgICAgb3V0bChjc3IxNXZhbCwgaW9hZGRyICsgQ1NSMTUpOyAvKiBEYXRhICovCisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0dXApIG91dGwoY3NyMTN2YWwsIGlvYWRkciArIENTUjEzKTsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBUVUxJUF9ERUJVRworICAgICAgICAgICAgaWYgKHR1bGlwX2RlYnVnID4gMSkKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzOiAgU2V0dGluZyBDU1IxNSB0byAlWC8lWC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHRwLT5uaWNfbmFtZSwgY3NyMTVkaXIsIGNzcjE1dmFsKTsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKG1sZWFmLT50eXBlID09IDQpCisgICAgICAgICAgICAgICAgbmV3X2NzcjYgPSAweDgyMDIwMDAwIHwgKChzZXR1cFsyXSAmIDB4NzEpIDw8IDE4KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBuZXdfY3NyNiA9IDB4ODI0MjAwMDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDE6IGNhc2UgMzogeworICAgICAgICAgICAgaW50IHBoeV9udW0gPSBwWzBdOworICAgICAgICAgICAgaW50IGluaXRfbGVuZ3RoID0gcFsxXTsKKyAgICAgICAgICAgIHUxNiAqbWlzY19pbmZvOworCisgICAgICAgICAgICB0cC0+aWZfcG9ydCA9IDExOworICAgICAgICAgICAgbmV3X2NzcjYgPSAweDAyMEUwMDAwOworICAgICAgICAgICAgaWYgKG1sZWFmLT50eXBlID09IDMpIHsgICAgIC8qIDIxMTQyICovCisgICAgICAgICAgICAgICAgdTE2ICppbml0X3NlcXVlbmNlID0gKHUxNiopKHArMik7CisgICAgICAgICAgICAgICAgdTE2ICpyZXNldF9zZXF1ZW5jZSA9ICYoKHUxNiopKHArMykpW2luaXRfbGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBpbnQgcmVzZXRfbGVuZ3RoID0gcFsyICsgaW5pdF9sZW5ndGgqMl07CisgICAgICAgICAgICAgICAgbWlzY19pbmZvID0gcmVzZXRfc2VxdWVuY2UgKyByZXNldF9sZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0dXApCisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByZXNldF9sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dGwoZ2V0X3UxNigmcmVzZXRfc2VxdWVuY2VbaV0pIDw8IDE2LCBpb2FkZHIgKyBDU1IxNSk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGluaXRfbGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIG91dGwoZ2V0X3UxNigmaW5pdF9zZXF1ZW5jZVtpXSkgPDwgMTYsIGlvYWRkciArIENTUjE1KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdTggKmluaXRfc2VxdWVuY2UgPSBwICsgMjsKKyAgICAgICAgICAgICAgICB1OCAqcmVzZXRfc2VxdWVuY2UgPSBwICsgMyArIGluaXRfbGVuZ3RoOworICAgICAgICAgICAgICAgIGludCByZXNldF9sZW5ndGggPSBwWzIgKyBpbml0X2xlbmd0aF07CisgICAgICAgICAgICAgICAgbWlzY19pbmZvID0gKHUxNiopKHJlc2V0X3NlcXVlbmNlICsgcmVzZXRfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnR1cCkgeworICAgICAgICAgICAgICAgICAgICBvdXRsKG10YWJsZS0+Y3NyMTJkaXIgfCAweDEwMCwgaW9hZGRyICsgQ1NSMTIpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVzZXRfbGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRsKHJlc2V0X3NlcXVlbmNlW2ldLCBpb2FkZHIgKyBDU1IxMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbml0X2xlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBvdXRsKGluaXRfc2VxdWVuY2VbaV0sIGlvYWRkciArIENTUjEyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRwLT5hZHZlcnRpc2luZ1twaHlfbnVtXSA9IGdldF91MTYoJm1pc2NfaW5mb1sxXSkgfCAxOworICAgICAgICAgICAgaWYgKHN0YXJ0dXAgPCAyKSB7CisgICAgICAgICAgICAgICAgaWYgKHRwLT5taWlfYWR2ZXJ0aXNlID09IDApCisgICAgICAgICAgICAgICAgICAgIHRwLT5taWlfYWR2ZXJ0aXNlID0gdHAtPmFkdmVydGlzaW5nW3BoeV9udW1dOworI2lmZGVmIFRVTElQX0RFQlVHCisgICAgICAgICAgICAgICAgaWYgKHR1bGlwX2RlYnVnID4gMSkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlczogIEFkdmVydGlzaW5nICVoWCBvbiBNSUkgJWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm5pY19uYW1lLCB0cC0+bWlpX2FkdmVydGlzZSwgdHAtPnBoeXNbcGh5X251bV0pOworI2VuZGlmCisgICAgICAgICAgICAgICAgbWRpb193cml0ZShuaWMsIHRwLT5waHlzW3BoeV9udW1dLCA0LCB0cC0+bWlpX2FkdmVydGlzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcHJpbnRmKCIlczogIEludmFsaWQgbWVkaWEgdGFibGUgc2VsZWN0aW9uICVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICB0cC0+bmljX25hbWUsIG1sZWFmLT50eXBlKTsKKyAgICAgICAgICAgIG5ld19jc3I2ID0gMHgwMjBFMDAwMDsKKyAgICAgICAgfQorI2lmZGVmIFRVTElQX0RFQlVHCisgICAgICAgIGlmICh0dWxpcF9kZWJ1ZyA+IDEpCisgICAgICAgICAgICBwcmludGYoIiVzOiBVc2luZyBtZWRpYSB0eXBlICVzLCBDU1IxMiBpcyAlaGhYLlxuIiwKKyAgICAgICAgICAgICAgICAgICB0cC0+bmljX25hbWUsIG1lZGlhbmFtZVt0cC0+aWZfcG9ydF0sCisgICAgICAgICAgICAgICAgICAgaW5sKGlvYWRkciArIENTUjEyKSAmIDB4ZmYpOworI2VuZGlmCisgICAgfSBlbHNlIGlmICh0cC0+Y2hpcF9pZCA9PSBEQzIxMDQxKSB7CisgICAgICAgIGludCBwb3J0ID0gdHAtPmlmX3BvcnQgPD0gNCA/IHRwLT5pZl9wb3J0IDogMDsKKyNpZmRlZiBUVUxJUF9ERUJVRworICAgICAgICBpZiAodHVsaXBfZGVidWcgPiAxKQorICAgICAgICAgICAgcHJpbnRmKCIlczogMjEwNDEgdXNpbmcgbWVkaWEgJXMsIENTUjEyIGlzICVoWC5cbiIsCisgICAgICAgICAgICAgICAgICAgdHAtPm5pY19uYW1lLCBtZWRpYW5hbWVbcG9ydCA9PSAzID8gMTI6IHBvcnRdLAorICAgICAgICAgICAgICAgICAgIGlubChpb2FkZHIgKyBDU1IxMikpOworI2VuZGlmCisgICAgICAgIG91dGwoMHgwMDAwMDAwMCwgaW9hZGRyICsgQ1NSMTMpOyAvKiBSZXNldCB0aGUgc2VyaWFsIGludGVyZmFjZSAqLworICAgICAgICBvdXRsKHQyMTA0MV9jc3IxNFtwb3J0XSwgaW9hZGRyICsgQ1NSMTQpOworICAgICAgICBvdXRsKHQyMTA0MV9jc3IxNVtwb3J0XSwgaW9hZGRyICsgQ1NSMTUpOworICAgICAgICBvdXRsKHQyMTA0MV9jc3IxM1twb3J0XSwgaW9hZGRyICsgQ1NSMTMpOworICAgICAgICBuZXdfY3NyNiA9IDB4ODAwMjAwMDA7CisgICAgfSBlbHNlIGlmICh0cC0+Y2hpcF9pZCA9PSBMQzgyQzE2OCkgeworICAgICAgICBpZiAoc3RhcnR1cCAmJiAhIHRwLT5tZWRpYWxvY2spCisgICAgICAgICAgICB0cC0+aWZfcG9ydCA9IHRwLT5taWlfY250ID8gMTEgOiAwOworI2lmZGVmIFRVTElQX0RFQlVHCisgICAgICAgIGlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJICAgIHByaW50ZigiJXM6IFBOSUMgUEhZIHN0YXR1cyBpcyAlaFgsIG1lZGlhICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICB0cC0+bmljX25hbWUsIGlubChpb2FkZHIgKyAweEI4KSwgbWVkaWFuYW1lW3RwLT5pZl9wb3J0XSk7CisjZW5kaWYKKyAgICAgICAgaWYgKHRwLT5taWlfY250KSB7CisgICAgICAgICAgICBuZXdfY3NyNiA9IDB4ODEwQzAwMDA7CisgICAgICAgICAgICBvdXRsKDB4MDAwMSwgaW9hZGRyICsgQ1NSMTUpOworICAgICAgICAgICAgb3V0bCgweDAyMDFCMDdBLCBpb2FkZHIgKyAweEI4KTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGFydHVwKSB7CisgICAgICAgICAgICAvKiBTdGFydCB3aXRoIDEwbWJwcyB0byBkbyBhdXRvbmVnb3RpYXRpb24uICovCisgICAgICAgICAgICBvdXRsKDB4MzIsIGlvYWRkciArIENTUjEyKTsKKyAgICAgICAgICAgIG5ld19jc3I2ID0gMHgwMDQyMDAwMDsKKyAgICAgICAgICAgIG91dGwoMHgwMDAxQjA3OCwgaW9hZGRyICsgMHhCOCk7CisgICAgICAgICAgICBvdXRsKDB4MDIwMUIwNzgsIGlvYWRkciArIDB4QjgpOworICAgICAgICB9IGVsc2UgaWYgKHRwLT5pZl9wb3J0ID09IDMgIHx8ICB0cC0+aWZfcG9ydCA9PSA1KSB7CisgICAgICAgICAgICBvdXRsKDB4MzMsIGlvYWRkciArIENTUjEyKTsKKyAgICAgICAgICAgIG5ld19jc3I2ID0gMHgwMTg2MDAwMDsKKyAgICAgICAgICAgIC8qIFRyaWdnZXIgYXV0b25lZ290aWF0aW9uLiAqLworICAgICAgICAgICAgb3V0bChzdGFydHVwID8gMHgwMjAxRjg2OCA6IDB4MDAwMUY4NjgsIGlvYWRkciArIDB4QjgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0bCgweDMyLCBpb2FkZHIgKyBDU1IxMik7CisgICAgICAgICAgICBuZXdfY3NyNiA9IDB4MDA0MjAwMDA7CisgICAgICAgICAgICBvdXRsKDB4MUYwNzgsIGlvYWRkciArIDB4QjgpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICh0cC0+Y2hpcF9pZCA9PSBEQzIxMDQwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIxMDQwICovCisgICAgICAgIC8qIFR1cm4gb24gdGhlIHhjdnIgaW50ZXJmYWNlLiAqLworICAgICAgICBpbnQgY3NyMTIgPSBpbmwoaW9hZGRyICsgQ1NSMTIpOworI2lmZGVmIFRVTElQX0RFQlVHCisgICAgICAgIGlmICh0dWxpcF9kZWJ1ZyA+IDEpCisgICAgICAgICAgICBwcmludGYoIiVzOiAyMTA0MCBtZWRpYSB0eXBlIGlzICVzLCBDU1IxMiBpcyAlaGhYLlxuIiwKKyAgICAgICAgICAgICAgICAgICB0cC0+bmljX25hbWUsIG1lZGlhbmFtZVt0cC0+aWZfcG9ydF0sIGNzcjEyKTsKKyNlbmRpZgorICAgICAgICBpZiAobWVkaWFfY2FwW3RwLT5pZl9wb3J0XSAmIE1lZGlhQWx3YXlzRkQpCisgICAgICAgICAgICB0cC0+ZnVsbF9kdXBsZXggPSAxOworICAgICAgICBuZXdfY3NyNiA9IDB4MjAwMDA7CisgICAgICAgIC8qIFNldCB0aGUgZnVsbCBkdXBsdXggbWF0Y2ggZnJhbWUuICovCisgICAgICAgIG91dGwoRlVMTF9EVVBMRVhfTUFHSUMsIGlvYWRkciArIENTUjExKTsKKyAgICAgICAgb3V0bCgweDAwMDAwMDAwLCBpb2FkZHIgKyBDU1IxMyk7IC8qIFJlc2V0IHRoZSBzZXJpYWwgaW50ZXJmYWNlICovCisgICAgICAgIGlmICh0MjEwNDBfY3NyMTNbdHAtPmlmX3BvcnRdICYgOCkgeworICAgICAgICAgICAgb3V0bCgweDA3MDUsIGlvYWRkciArIENTUjE0KTsKKyAgICAgICAgICAgIG91dGwoMHgwMDA2LCBpb2FkZHIgKyBDU1IxNSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXRsKDB4ZmZmZiwgaW9hZGRyICsgQ1NSMTQpOworICAgICAgICAgICAgb3V0bCgweDAwMDAsIGlvYWRkciArIENTUjE1KTsKKyAgICAgICAgfQorICAgICAgICBvdXRsKDB4OGYwMSB8IHQyMTA0MF9jc3IxM1t0cC0+aWZfcG9ydF0sIGlvYWRkciArIENTUjEzKTsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVua25vd24gY2hpcCB0eXBlIHdpdGggbm8gbWVkaWEgdGFibGUuICovCisgICAgICAgIGlmICh0cC0+ZGVmYXVsdF9wb3J0ID09IDApCisgICAgICAgICAgICB0cC0+aWZfcG9ydCA9IHRwLT5taWlfY250ID8gMTEgOiAzOworICAgICAgICBpZiAobWVkaWFfY2FwW3RwLT5pZl9wb3J0XSAmIE1lZGlhSXNNSUkpIHsKKyAgICAgICAgICAgIG5ld19jc3I2ID0gMHgwMjBFMDAwMDsKKyAgICAgICAgfSBlbHNlIGlmIChtZWRpYV9jYXBbdHAtPmlmX3BvcnRdICYgTWVkaWFJc0Z4KSB7CisgICAgICAgICAgICBuZXdfY3NyNiA9IDB4MDI4NjAwMDAwOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG5ld19jc3I2ID0gMHgwMzg2MDAwMDA7CisjaWZkZWYgVFVMSVBfREVCVUcKKyAgICAgICAgaWYgKHR1bGlwX2RlYnVnID4gMSkKKyAgICAgICAgICAgIHByaW50ZigiJXM6IE5vIG1lZGlhIGRlc2NyaXB0aW9uIHRhYmxlLCBhc3N1bWluZyAiCisgICAgICAgICAgICAgICAgICAgIiVzIHRyYW5zY2VpdmVyLCBDU1IxMiAlaGhYLlxuIiwKKyAgICAgICAgICAgICAgICAgICB0cC0+bmljX25hbWUsIG1lZGlhbmFtZVt0cC0+aWZfcG9ydF0sCisgICAgICAgICAgICAgICAgICAgaW5sKGlvYWRkciArIENTUjEyKSk7CisjZW5kaWYKKyAgICB9CisKKyAgICB0cC0+Y3NyNiA9IG5ld19jc3I2IHwgKHRwLT5jc3I2ICYgMHhmZGZmKSB8ICh0cC0+ZnVsbF9kdXBsZXggPyAweDAyMDAgOiAwKTsKKyAgICByZXR1cm47Cit9CisKKy8qCisgIENoZWNrIHRoZSBNSUkgbmVnb3RpYXRlZCBkdXBsZXggYW5kIGNoYW5nZSB0aGUgQ1NSNiBzZXR0aW5nIGlmCisgIHJlcXVpcmVkLgorICBSZXR1cm4gMCBpZiBldmVyeXRoaW5nIGlzIE9LLgorICBSZXR1cm4gPCAwIGlmIHRoZSB0cmFuc2NlaXZlciBpcyBtaXNzaW5nIG9yIGhhcyBubyBsaW5rIGJlYXQuCisqLworc3RhdGljIGludCB0dWxpcF9jaGVja19kdXBsZXgoc3RydWN0IG5pYyAqbmljKQoreworICAgICAgICB1bnNpZ25lZCBpbnQgYm1zciwgbHBhLCBuZWdvdGlhdGVkLCBuZXdfY3NyNjsKKworICAgICAgICBibXNyID0gbWRpb19yZWFkKG5pYywgdHAtPnBoeXNbMF0sIDEpOworICAgICAgICBscGEgPSBtZGlvX3JlYWQobmljLCB0cC0+cGh5c1swXSwgNSk7CisKKyNpZmRlZiBUVUxJUF9ERUJVRworICAgICAgICBpZiAodHVsaXBfZGVidWcgPiAxKQorICAgICAgICAgICAgICAgIHByaW50ZigiJXM6IE1JSSBzdGF0dXMgJSN4LCBMaW5rIHBhcnRuZXIgcmVwb3J0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlI3guXG4iLCB0cC0+bmljX25hbWUsIGJtc3IsIGxwYSk7CisjZW5kaWYKKworICAgICAgICBpZiAoYm1zciA9PSAweGZmZmYpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0yOworICAgICAgICBpZiAoKGJtc3IgJiA0KSA9PSAwKSB7IAorICAgICAgICAgICAgICAgIGludCBuZXdfYm1zciA9IG1kaW9fcmVhZChuaWMsIHRwLT5waHlzWzBdLCAxKTsgCisgICAgICAgICAgICAgICAgaWYgKChuZXdfYm1zciAmIDQpID09IDApIHsgCisjaWZkZWYgVFVMSVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0dWxpcF9kZWJ1ZyAgPiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzOiBObyBsaW5rIGJlYXQgb24gdGhlIE1JSSBpbnRlcmZhY2UsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgc3RhdHVzICUjeC5cbiIsIHRwLT5uaWNfbmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2Jtc3IpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRwLT5mdWxsX2R1cGxleCA9IGxwYSAmIDB4MTQwOworCisgICAgICAgIG5ld19jc3I2ID0gdHAtPmNzcjY7CisgICAgICAgIG5lZ290aWF0ZWQgPSBscGEgJiB0cC0+YWR2ZXJ0aXNpbmdbMF07CisKKyAgICAgICAgaWYobmVnb3RpYXRlZCAmIDB4MzgwKSBuZXdfY3NyNiAmPSB+MHg0MDAwMDA7IAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgIG5ld19jc3I2IHw9IDB4NDAwMDAwOworICAgICAgICBpZiAodHAtPmZ1bGxfZHVwbGV4KSAgIG5ld19jc3I2IHw9IDB4MjAwOyAKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICBuZXdfY3NyNiAmPSB+MHgyMDA7CisKKyAgICAgICAgaWYgKG5ld19jc3I2ICE9IHRwLT5jc3I2KSB7CisgICAgICAgICAgICAgICAgdHAtPmNzcjYgPSBuZXdfY3NyNjsKKworI2lmZGVmIFRVTElQX0RFQlVHCisgICAgICAgICAgICAgICAgaWYgKHR1bGlwX2RlYnVnID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXM6IFNldHRpbmcgJXMtZHVwbGV4IGJhc2VkIG9uIE1JSSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiMlZCBsaW5rIHBhcnRuZXIgY2FwYWJpbGl0eSBvZiAlI3guXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bmljX25hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+ZnVsbF9kdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5waHlzWzBdLCBscGEpOworI2VuZGlmCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25ldGJvb3QvdHVsaXAudHh0IGIvbmV0Ym9vdC90dWxpcC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhiN2IzYgotLS0gL2Rldi9udWxsCisrKyBiL25ldGJvb3QvdHVsaXAudHh0CkBAIC0wLDAgKzEsNTMgQEAKK1RoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKK3RoZSBHTlUgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCitUaGlzIGlzIGEgdHVsaXAgYW5kIGNsb25lIGRyaXZlciBmb3IgRXRoZXJib290LiAgU2VlIHRoZSByZXZpc2lvbgoraGlzdG9yeSBpbiB0aGUgdHVsaXAuYyBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiBjaGFuZ2VzLiAgVGhpcyB2ZXJzaW9uCitvZiB0aGUgZHJpdmVyIGluY29ycG9yYXRlcyBjaGFuZ2VzIGZyb20gQm9iIEVkd2FyZHMgYW5kIFBhdWwgTWFja2VycmFzCit3aG8gY2FudHJpYnV0ZWQgY2hhbmdlcyB0byBzdXBwb3J0IHRoZSBUUkVORG5ldCBURTEwMC1QQ0lBIE5JQyB3aGljaAordXNlcyBhIGdlbnVpbmUgSW50ZWwgMjExNDMtUEQgY2hpcHNldC4gIFRoZXJlIGFyZSBhbHNvIHZhcmlvdXMgY29kZQorY2xlYW51cHMgdG8gbWFrZSB0aW1lLWJhc2VkIGFjdGl2aXRpZXMgbW9yZSByZWxpYWJsZS4KKworT2YgY291cnNlIHlvdSBoYXZlIHRvIGhhdmUgYWxsIHRoZSB1c3VhbCBFdGhlcmJvb3QgZW52aXJvbm1lbnQKKyhib290cC9kaGNwL05GUykgc2V0IHVwLCBhbmQgeW91IG5lZWQgYSBMaW51eCBrZXJuZWwgd2l0aCB2MC45MWcKKyg3LjE2Ljk5KSBvciBsYXRlciBvZiB0aGUgdHVsaXAuYyBkcml2ZXIgY29tcGlsZWQgaW4gdG8gc3VwcG9ydCBzb21lCitNWDk4NzE1IGJhc2VkIGNhcmRzLiAgVGhhdCBmaWxlIGlzIGF2YWlsYWJsZSBhdDoKKworICBodHRwOi8vY2VzZGlzLmdzZmMubmFzYS5nb3YvbGludXgvZHJpdmVycy90ZXN0L3R1bGlwLmMKKworTk9URVMKKworSSd2ZSB0ZXN0ZWQgdGhpcyBkcml2ZXIgd2l0aCBhIFNPSE93YXJlIEZhc3QgMTAvMTAwIE1vZGVsIFNEQTExMEEsCithIExpbmtzeXMgTE5FMTAwVFggdjIuMCwgYW5kIGEgTmV0Z2VhciBGQTMxMFRYIGNhcmQsIGFuZCBpdCB3b3JrZWQgYXQKK2JvdGggMTAgYW5kIDEwMCBtYml0cy4gT3RoZXIgY2FyZHMgYmFzZWQgb24gdGhlIHR1bGlwIGZhbWlseSBtYXkgd29yayBhcword2VsbC4KKworVGhlc2UgY2FyZHMgYXJlIGFib3V0IDIwJFVTLCBhcmUgc3VwcG9ydGVkIGJ5IExpbnV4IGFuZCBub3cgRXRoZXJib290LAorYW5kIGJlaW5nIFBDSSwgdGhleSBhdXRvLWNvbmZpZ3VyZSBJUlEgYW5kIElPQUREUiBhbmQgYXV0by1uZWdvdGlhdGUKKzEwLzEwMCBoYWxmL2Z1bGwgZHVwbGV4LiBJdCBzZWVtcyBsaWtlIGEgcHJldHR5IGdvb2QgdmFsdWUgY29tcGFyZWQgdG8KK3NvbWUgb2YgdGhlIHByaWNpZXIgY2FyZHMsIGFuZCBjYW4gbG93ZXIgdGhlIGNvc3Qgb2YgYnVpbGRpbmcvYWRhcHRpbmcKK3RoaW4gY2xpZW50IHdvcmtzdGF0aW9ucyBzdWJzdGFudGlhbGx5IHdoaWxlIGdpdmluZyBhIGNvbnNpZGVyYWJsZQorcGVyZm9ybWFuY2UgaW5jcmVhc2UuCisKK09uIHNvbWUgUENJIHR1bGlwIGNsb25lIGNoaXBzZXRzIChNWDk4N3g1LCBMQzgyQzExNSwgTEM4MkMxNjgpIHRoaXMgZHJpdmVyIAorbGV0cyB0aGUgY2FyZCBjaG9vc2UgdGhlIGZhc3Rlc3Qgc3BlZWQgaXQgY2FuIG5lZ290aWF0ZSB3aXRoIHRoZSBwZWVyCitkZXZpY2UuICBPbiBvdGhlciBjYXJkcywgaXQgY2hvb3NlcyAxMG1iaXQgaGFsZi1kdXBsZXguCisKK0kgYnVybmVkIGFuIEFNMjdDMjU2ICgzMktCeXRlKSBFUFJPTSB3aXRoIG14OTg3eDUubHpyb20gYW5kIGl0IHdvcmtlZC4KK0FjY29yZGluZyB0byB0aGUgZGF0YSBzaGVldCB0aGUgTVg5ODcxNUEgc3VwcG9ydHMgdXAgdG8gNjRLICgyN0M1MTIpCitFUFJPTXMsIAorCitJJ3ZlIGxpYmVyYWxseSBjb21tZW50ZWQgdGhlIGNvZGUgYW5kIGhlYWRlciBmaWxlcyBpbiB0aGUgaG9wZSB0aGF0IGl0Cit3aWxsIGhlbHAgdGhlIG5leHQgcGVyc29uIHdobyBoYWNrcyB0aGUgY29kZSBvciBuZWVkcyB0byBzdXBwb3J0IHNvbWUKK3R1bGlwIGNsb25lIGNhcmQsIG9yIHdpc2hlcyB0byBhZGQgZnVuY3Rpb25hbGl0eS4KKworQW55d2F5LCBwbGVhc2UgdGVzdCB0aGlzIGlmIHlvdSBjYW4gb24geW91ciB0dWxpcCBiYXNlZCBjYXJkLCBhbmQgbGV0CittZSAobWRjQHRoaW5ndWluLm9yZykgYW5kIHRoZSBuZXRib290IGxpc3QgKG5ldGJvb3RAYmFnaGlyYS5oYW4uZGUpCitrbm93IGhvdyB0aGluZ3MgZ28uICBJIGFsc28gd291bGQgYXBwcmVjaWF0ZSBjb2RlIHJldmlldyBieSBwZW9wbGUgd2hvCitwcm9ncmFtLiAgSSdtIGEgc3Ryb25nIGJlbGlldmVyIGluICJhbm90aGVyIHNldCBvZiBleWVzIi4KKworUmVnYXJkcywKKworTWFydHkgQ29ubm9yCittZGNAdGhpbmd1aW4ub3JnCitodHRwOi8vd3d3LnRoaW5ndWluLm9yZy8KZGlmZiAtLWdpdCBhL25ldGJvb3QvdmlhLXJoaW5lLmMgYi9uZXRib290L3ZpYS1yaGluZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MGVkYjgKLS0tIC9kZXYvbnVsbAorKysgYi9uZXRib290L3ZpYS1yaGluZS5jCkBAIC0wLDAgKzEsMTE4MCBAQAorLyogcmhpbmUuYzpGYXN0IEV0aGVybmV0IGRyaXZlciBmb3IgTGludXguICovCisvKgorCUFkYXB0ZWQgMDktamFuLTIwMDAgYnkgUGFvbG8gTWFyaW5pIChwYW9sb21AcHJpc21hLWVuZy5pdCkKKworICAgICAgICBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgRG9uYWxkIEJlY2tlci4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKwlEcml2ZXJzIGRlcml2ZWQgZnJvbSB0aGlzIGNvZGUgYWxzbyBmYWxsIHVuZGVyIHRoZSBHUEwgYW5kIG11c3QgcmV0YWluCisJdGhpcyBhdXRob3JzaGlwIGFuZCBjb3B5cmlnaHQgbm90aWNlLgorCisJVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBhcmUgdGhlIGF1dGhvcnMgcmVzcG9uc2libGUgZm9yCisJdGhlIHByb3BlciBmdW5jdGlvbmluZyBvZiB0aGlzIHNvZnR3YXJlLCBub3IgZG8gdGhlIGF1dGhvcnMgYXNzdW1lIGFueQorCXJlc3BvbnNpYmlsaXR5IGZvciBkYW1hZ2VzIGluY3VycmVkIHdpdGggaXRzIHVzZS4KKworCVRoaXMgZHJpdmVyIGlzIGRlc2lnbmVkIGZvciB0aGUgVklBIFZUODZDMTAwQSBSaGluZS1JSSBQQ0kgRmFzdCBFdGhlcm5ldAorCWNvbnRyb2xsZXIuCisKKyovCisKK3N0YXRpYyBjb25zdCBjaGFyICp2ZXJzaW9uID0gInJoaW5lLmMgdjEuMC4wIDIwMDAtMDEtMDdcbiI7CisKKy8qIEEgZmV3IHVzZXItY29uZmlndXJhYmxlIHZhbHVlcy4gKi8KKworLyogU2l6ZSBvZiB0aGUgaW4tbWVtb3J5IHJlY2VpdmUgcmluZy4gKi8KKyNkZWZpbmUgUlhfQlVGX0xFTl9JRFgJMwkvKiAwPT04SywgMT09MTZLLCAyPT0zMkssIDM9PTY0SyAqLworI2RlZmluZSBSWF9CVUZfTEVOICg4MTkyIDw8IFJYX0JVRl9MRU5fSURYKQorCisvKiBTaXplIG9mIHRoZSBUeCBib3VuY2UgYnVmZmVycyAtLSBtdXN0IGJlIGF0IGxlYXN0IChkZXYtPm10dSsxNCs0KS4gKi8KKyNkZWZpbmUgVFhfQlVGX1NJWkUJMTUzNgorI2RlZmluZSBSWF9CVUZfU0laRQkxNTM2CisKKy8qIFBDSSBUdW5pbmcgUGFyYW1ldGVycworICAgVGhyZXNob2xkIGlzIGJ5dGVzIHRyYW5zZmVycmVkIHRvIGNoaXAgYmVmb3JlIHRyYW5zbWlzc2lvbiBzdGFydHMuICovCisjZGVmaW5lIFRYX0ZJRk9fVEhSRVNIIDI1NgkvKiBJbiBieXRlcywgcm91bmRlZCBkb3duIHRvIDMyIGJ5dGUgdW5pdHMuICovCisKKy8qIFRoZSBmb2xsb3dpbmcgc2V0dGluZ3MgYXJlIGxvZ18yKGJ5dGVzKS00OiAgMCA9PSAxNiBieXRlcyAuLiA2PT0xMDI0LiAqLworI2RlZmluZSBSWF9GSUZPX1RIUkVTSAk0CS8qIFJ4IGJ1ZmZlciBsZXZlbCBiZWZvcmUgZmlyc3QgUENJIHhmZXIuICAqLworI2RlZmluZSBSWF9ETUFfQlVSU1QJNAkvKiBNYXhpbXVtIFBDSSBidXJzdCwgJzQnIGlzIDI1NiBieXRlcyAqLworI2RlZmluZSBUWF9ETUFfQlVSU1QJNAorCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgdXN1YWxseSBhcmUgbm90IGNoYW5nZWQuICovCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcuICovCisjZGVmaW5lIFRYX1RJTUVPVVQgICgoMjAwMCpIWikvMTAwMCkKKworI2luY2x1ZGUgImV0aGVyYm9vdC5oIgorI2luY2x1ZGUgIm5pYy5oIgorI2luY2x1ZGUgInBjaS5oIgorI2luY2x1ZGUgImNhcmRzLmgiCisKKy8qIGRlZmluZSBhbGwgaW9hZGRyICovCisKKyNkZWZpbmUgYnlQQVIwCQkJCWlvYWRkcgorI2RlZmluZSBieVJDUgkJCQlpb2FkZHIgKyA2CisjZGVmaW5lIGJ5VENSCQkJCWlvYWRkciArIDcKKyNkZWZpbmUgYnlDUjAJCQkJaW9hZGRyICsgOAorI2RlZmluZSBieUNSMQkJCQlpb2FkZHIgKyA5CisjZGVmaW5lIGJ5SVNSMAkJCQlpb2FkZHIgKyAweDBjCisjZGVmaW5lIGJ5SVNSMQkJCQlpb2FkZHIgKyAweDBkCisjZGVmaW5lIGJ5SU1SMAkJCQlpb2FkZHIgKyAweDBlCisjZGVmaW5lIGJ5SU1SMQkJCQlpb2FkZHIgKyAweDBmCisjZGVmaW5lIGJ5TUFSMAkJCQlpb2FkZHIgKyAweDEwCisjZGVmaW5lIGJ5TUFSMQkJCQlpb2FkZHIgKyAweDExCisjZGVmaW5lIGJ5TUFSMgkJCQlpb2FkZHIgKyAweDEyCisjZGVmaW5lIGJ5TUFSMwkJCQlpb2FkZHIgKyAweDEzCisjZGVmaW5lIGJ5TUFSNAkJCQlpb2FkZHIgKyAweDE0CisjZGVmaW5lIGJ5TUFSNQkJCQlpb2FkZHIgKyAweDE1CisjZGVmaW5lIGJ5TUFSNgkJCQlpb2FkZHIgKyAweDE2CisjZGVmaW5lIGJ5TUFSNwkJCQlpb2FkZHIgKyAweDE3CisjZGVmaW5lIGR3Q3VycmVudFJ4RGVzY0FkZHIJCWlvYWRkciArIDB4MTgKKyNkZWZpbmUgZHdDdXJyZW50VHhEZXNjQWRkcgkJaW9hZGRyICsgMHgxYworI2RlZmluZSBkd0N1cnJlbnRSRFNFMAkJCWlvYWRkciArIDB4MjAKKyNkZWZpbmUgZHdDdXJyZW50UkRTRTEJCQlpb2FkZHIgKyAweDI0CisjZGVmaW5lIGR3Q3VycmVudFJEU0UyCQkJaW9hZGRyICsgMHgyOAorI2RlZmluZSBkd0N1cnJlbnRSRFNFMwkJCWlvYWRkciArIDB4MmMKKyNkZWZpbmUgZHdOZXh0UkRTRTAJCQlpb2FkZHIgKyAweDMwCisjZGVmaW5lIGR3TmV4dFJEU0UxCQkJaW9hZGRyICsgMHgzNAorI2RlZmluZSBkd05leHRSRFNFMgkJCWlvYWRkciArIDB4MzgKKyNkZWZpbmUgZHdOZXh0UkRTRTMJCQlpb2FkZHIgKyAweDNjCisjZGVmaW5lIGR3Q3VycmVudFREU0UwCQkJaW9hZGRyICsgMHg0MAorI2RlZmluZSBkd0N1cnJlbnRURFNFMQkJCWlvYWRkciArIDB4NDQKKyNkZWZpbmUgZHdDdXJyZW50VERTRTIJCQlpb2FkZHIgKyAweDQ4CisjZGVmaW5lIGR3Q3VycmVudFREU0UzCQkJaW9hZGRyICsgMHg0YworI2RlZmluZSBkd05leHRURFNFMAkJCWlvYWRkciArIDB4NTAKKyNkZWZpbmUgZHdOZXh0VERTRTEJCQlpb2FkZHIgKyAweDU0CisjZGVmaW5lIGR3TmV4dFREU0UyCQkJaW9hZGRyICsgMHg1OAorI2RlZmluZSBkd05leHRURFNFMwkJCWlvYWRkciArIDB4NWMKKyNkZWZpbmUgZHdDdXJyUnhETUFQdHIJCQlpb2FkZHIgKyAweDYwCisjZGVmaW5lIGR3Q3VyclR4RE1BUHRyCQkJaW9hZGRyICsgMHg2NAorI2RlZmluZSBieU1QSFkJCQkJaW9hZGRyICsgMHg2YworI2RlZmluZSBieU1JSVNSCQkJCWlvYWRkciArIDB4NmQKKyNkZWZpbmUgYnlCQ1IwCQkJCWlvYWRkciArIDB4NmUKKyNkZWZpbmUgYnlCQ1IxCQkJCWlvYWRkciArIDB4NmYKKyNkZWZpbmUgYnlNSUlDUgkJCQlpb2FkZHIgKyAweDcwCisjZGVmaW5lIGJ5TUlJQUQJCQkJaW9hZGRyICsgMHg3MQorI2RlZmluZSB3TUlJREFUQQkJCWlvYWRkciArIDB4NzIKKyNkZWZpbmUgYnlFRUNTUgkJCQlpb2FkZHIgKyAweDc0CisjZGVmaW5lIGJ5VEVTVAkJCQlpb2FkZHIgKyAweDc1CisjZGVmaW5lIGJ5R1BJTwkJCQlpb2FkZHIgKyAweDc2CisjZGVmaW5lIGJ5Q0ZHQQkJCQlpb2FkZHIgKyAweDc4CisjZGVmaW5lIGJ5Q0ZHQgkJCQlpb2FkZHIgKyAweDc5CisjZGVmaW5lIGJ5Q0ZHQwkJCQlpb2FkZHIgKyAweDdhCisjZGVmaW5lIGJ5Q0ZHRAkJCQlpb2FkZHIgKyAweDdiCisjZGVmaW5lIHdUYWxseUNudE1QQQkJCWlvYWRkciArIDB4N2MKKyNkZWZpbmUgd1RhbGx5Q250Q1JDCQkJaW9hZGRyICsgMHg3ZAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4aW9hZGRyIERlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogQml0cyBpbiB0aGUgUkNSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBSQ1JfUlJGVDIJCTB4ODAKKyNkZWZpbmUgUkNSX1JSRlQxCQkweDQwCisjZGVmaW5lIFJDUl9SUkZUMAkJMHgyMAorI2RlZmluZSBSQ1JfUFJPTQkJMHgxMAorI2RlZmluZSBSQ1JfQUIJCQkweDA4CisjZGVmaW5lIFJDUl9BTQkJCTB4MDQKKyNkZWZpbmUgUkNSX0FSCQkJMHgwMgorI2RlZmluZSBSQ1JfU0VQCQkJMHgwMQorCisvKgorICogQml0cyBpbiB0aGUgVENSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBUQ1JfUlRTRgkJMHg4MAorI2RlZmluZSBUQ1JfUlRGVDEJCTB4NDAKKyNkZWZpbmUgVENSX1JURlQwCQkweDIwCisjZGVmaW5lIFRDUl9PRlNFVAkJMHgwOAorI2RlZmluZSBUQ1JfTEIxCQkJMHgwNAkvKiBsb29wYmFja1sxXSAqLworI2RlZmluZSBUQ1JfTEIwCQkJMHgwMgkvKiBsb29wYmFja1swXSAqLworCisvKgorICogQml0cyBpbiB0aGUgQ1IwIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBDUjBfUkRNRAkJMHg0MAkvKiByeCBkZXNjcmlwdG9yIHBvbGxpbmcgZGVtYW5kICovCisjZGVmaW5lIENSMF9URE1ECQkweDIwCS8qIHR4IGRlc2NyaXB0b3IgcG9sbGluZyBkZW1hbmQgKi8KKyNkZWZpbmUgQ1IwX1RYT04JCTB4MTAKKyNkZWZpbmUgQ1IwX1JYT04JCTB4MDgKKyNkZWZpbmUgQ1IwX1NUT1AJCTB4MDQJLyogc3RvcCBOSUMsIGRlZmF1bHQgPSAxICovCisjZGVmaW5lIENSMF9TVFJUCQkweDAyCS8qIHN0YXJ0IE5JQyAqLworI2RlZmluZSBDUjBfSU5JVAkJMHgwMQkvKiBzdGFydCBpbml0IHByb2Nlc3MgKi8KKworCisvKgorICogQml0cyBpbiB0aGUgQ1IxIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBDUjFfU0ZSU1QJCTB4ODAJLyogc29mdHdhcmUgcmVzZXQgKi8KKyNkZWZpbmUgQ1IxX1JETUQxCQkweDQwCS8qIFJETUQxICovCisjZGVmaW5lIENSMV9URE1EMQkJMHgyMAkvKiBURE1EMSAqLworI2RlZmluZSBDUjFfS0VZUEFHCQkweDEwCS8qIHR1cm4gb24gcGFyL2tleSAqLworI2RlZmluZSBDUjFfRFBPTEwJCTB4MDgJLyogZGlzYWJsZSByeC90eCBhdXRvIHBvbGxpbmcgKi8KKyNkZWZpbmUgQ1IxX0ZEWAkJCTB4MDQJLyogZnVsbCBkdXBsZXggbW9kZSAqLworI2RlZmluZSBDUjFfRVRFTgkJMHgwMgkvKiBlYXJseSB0eCBtb2RlICovCisjZGVmaW5lIENSMV9FUkVOCQkweDAxCS8qIGVhcmx5IHJ4IG1vZGUgKi8KKworLyoKKyAqIEJpdHMgaW4gdGhlIENSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBDUl9SRE1ECQkJMHgwMDQwCS8qIHJ4IGRlc2NyaXB0b3IgcG9sbGluZyBkZW1hbmQgKi8KKyNkZWZpbmUgQ1JfVERNRAkJCTB4MDAyMAkvKiB0eCBkZXNjcmlwdG9yIHBvbGxpbmcgZGVtYW5kICovCisjZGVmaW5lIENSX1RYT04JCQkweDAwMTAKKyNkZWZpbmUgQ1JfUlhPTgkJCTB4MDAwOAorI2RlZmluZSBDUl9TVE9QCQkJMHgwMDA0CS8qIHN0b3AgTklDLCBkZWZhdWx0ID0gMSAqLworI2RlZmluZSBDUl9TVFJUCQkJMHgwMDAyCS8qIHN0YXJ0IE5JQyAqLworI2RlZmluZSBDUl9JTklUCQkJMHgwMDAxCS8qIHN0YXJ0IGluaXQgcHJvY2VzcyAqLworI2RlZmluZSBDUl9TRlJTVAkJMHg4MDAwCS8qIHNvZnR3YXJlIHJlc2V0ICovCisjZGVmaW5lIENSX1JETUQxCQkweDQwMDAJLyogUkRNRDEgKi8KKyNkZWZpbmUgQ1JfVERNRDEJCTB4MjAwMAkvKiBURE1EMSAqLworI2RlZmluZSBDUl9LRVlQQUcJCTB4MTAwMAkvKiB0dXJuIG9uIHBhci9rZXkgKi8KKyNkZWZpbmUgQ1JfRFBPTEwJCTB4MDgwMAkvKiBkaXNhYmxlIHJ4L3R4IGF1dG8gcG9sbGluZyAqLworI2RlZmluZSBDUl9GRFgJCQkweDA0MDAJLyogZnVsbCBkdXBsZXggbW9kZSAqLworI2RlZmluZSBDUl9FVEVOCQkJMHgwMjAwCS8qIGVhcmx5IHR4IG1vZGUgKi8KKyNkZWZpbmUgQ1JfRVJFTgkJCTB4MDEwMAkvKiBlYXJseSByeCBtb2RlICovCisKKy8qCisgKiBCaXRzIGluIHRoZSBJTVIwIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBJTVIwX0NOVE0JCTB4ODAKKyNkZWZpbmUgSU1SMF9CRU0JCTB4NDAKKyNkZWZpbmUgSU1SMF9SVU0JCTB4MjAKKyNkZWZpbmUgSU1SMF9UVU0JCTB4MTAKKyNkZWZpbmUgSU1SMF9UWEVNCQkweDA4CisjZGVmaW5lIElNUjBfUlhFTQkJMHgwNAorI2RlZmluZSBJTVIwX1BUWE0JCTB4MDIKKyNkZWZpbmUgSU1SMF9QUlhNCQkweDAxCisKKy8qIGRlZmluZSBpbXJzaGFkb3cgKi8KKworI2RlZmluZSBJTVJTaGFkb3cJCTB4NUFGRgorCisvKgorICogQml0cyBpbiB0aGUgSU1SMSByZWdpc3RlcgorICovCisKKyNkZWZpbmUgSU1SMV9JTklUTQkJMHg4MAorI2RlZmluZSBJTVIxX1NSQ00JCTB4NDAKKyNkZWZpbmUgSU1SMV9OQkZNCQkweDEwCisjZGVmaW5lIElNUjFfUFJBSU0JCTB4MDgKKyNkZWZpbmUgSU1SMV9SRVMwTQkJMHgwNAorI2RlZmluZSBJTVIxX0VUTQkJMHgwMgorI2RlZmluZSBJTVIxX0VSTQkJMHgwMQorCisvKgorICogQml0cyBpbiB0aGUgSVNSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBJU1JfSU5JVEkJCTB4ODAwMAorI2RlZmluZSBJU1JfU1JDSQkJMHg0MDAwCisjZGVmaW5lIElTUl9BQlRJCQkweDIwMDAKKyNkZWZpbmUgSVNSX05PUkJGCQkweDEwMDAKKyNkZWZpbmUgSVNSX1BLVFJBCQkweDA4MDAKKyNkZWZpbmUgSVNSX1JFUzAJCTB4MDQwMAorI2RlZmluZSBJU1JfRVRJCQkJMHgwMjAwCisjZGVmaW5lIElTUl9FUkkJCQkweDAxMDAKKyNkZWZpbmUgSVNSX0NOVAkJCTB4MDA4MAorI2RlZmluZSBJU1JfQkUJCQkweDAwNDAKKyNkZWZpbmUgSVNSX1JVCQkJMHgwMDIwCisjZGVmaW5lIElTUl9UVQkJCTB4MDAxMAorI2RlZmluZSBJU1JfVFhFCQkJMHgwMDA4CisjZGVmaW5lIElTUl9SWEUJCQkweDAwMDQKKyNkZWZpbmUgSVNSX1BUWAkJCTB4MDAwMgorI2RlZmluZSBJU1JfUFJYCQkJMHgwMDAxCisKKy8qCisgKiBCaXRzIGluIHRoZSBJU1IwIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBJU1IwX0NOVAkJMHg4MAorI2RlZmluZSBJU1IwX0JFCQkJMHg0MAorI2RlZmluZSBJU1IwX1JVCQkJMHgyMAorI2RlZmluZSBJU1IwX1RVCQkJMHgxMAorI2RlZmluZSBJU1IwX1RYRQkJMHgwOAorI2RlZmluZSBJU1IwX1JYRQkJMHgwNAorI2RlZmluZSBJU1IwX1BUWAkJMHgwMgorI2RlZmluZSBJU1IwX1BSWAkJMHgwMQorCisvKgorICogQml0cyBpbiB0aGUgSVNSMSByZWdpc3RlcgorICovCisKKyNkZWZpbmUgSVNSMV9JTklUSQkJMHg4MAorI2RlZmluZSBJU1IxX1NSQ0kJCTB4NDAKKyNkZWZpbmUgSVNSMV9OT1JCRgkJMHgxMAorI2RlZmluZSBJU1IxX1BLVFJBCQkweDA4CisjZGVmaW5lIElTUjFfRVRJCQkweDAyCisjZGVmaW5lIElTUjFfRVJJCQkweDAxCisKKy8qIElTUiBBQk5PUk1BTCBDT05ESVRJT04gKi8KKworI2RlZmluZSBJU1JfQUJOT1JNQUwgSVNSX0JFK0lTUl9SVStJU1JfVFUrSVNSX0NOVCtJU1JfTk9SQkYrSVNSX1BLVFJBCisKKy8qCisgKiBCaXRzIGluIHRoZSBNSUlTUiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgTUlJU1JfTUlJRVJSCQkweDA4CisjZGVmaW5lIE1JSVNSX01SRVJSCQkweDA0CisjZGVmaW5lIE1JSVNSX0xOS0ZMCQkweDAyCisjZGVmaW5lIE1JSVNSX1NQRUVECQkweDAxCisKKy8qCisgKiBCaXRzIGluIHRoZSBNSUlDUiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgTUlJQ1JfTUFVVE8JCTB4ODAKKyNkZWZpbmUgTUlJQ1JfUkNNRAkJMHg0MAorI2RlZmluZSBNSUlDUl9XQ01ECQkweDIwCisjZGVmaW5lIE1JSUNSX01EUE0JCTB4MTAKKyNkZWZpbmUgTUlJQ1JfTU9VVAkJMHgwOAorI2RlZmluZSBNSUlDUl9NRE8JCTB4MDQKKyNkZWZpbmUgTUlJQ1JfTURJCQkweDAyCisjZGVmaW5lIE1JSUNSX01EQwkJMHgwMQorCisvKgorICogQml0cyBpbiB0aGUgRUVDU1IgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIEVFQ1NSX0VFUFIJCTB4ODAJLyogZWVwcm9tIHByb2dyYW1lZCBzdGF0dXMsIDczaCBtZWFucyBwcm9ncmFtZWQgKi8KKyNkZWZpbmUgRUVDU1JfRU1CUAkJMHg0MAkvKiBlZXByb20gZW1iZWRlZCBwcm9ncmFtbWluZyAqLworI2RlZmluZSBFRUNTUl9BVVRPTEQJCTB4MjAJLyogZWVwcm9tIGNvbnRlbnQgcmVsb2FkICovCisjZGVmaW5lIEVFQ1NSX0RQTQkJMHgxMAkvKiBlZXByb20gZGlyZWN0IHByb2dyYW1taW5nICovCisjZGVmaW5lIEVFQ1NSX0NTCQkweDA4CS8qIGVlcHJvbSBDUyBwaW4gKi8KKyNkZWZpbmUgRUVDU1JfU0sJCTB4MDQJLyogZWVwcm9tIFNLIHBpbiAqLworI2RlZmluZSBFRUNTUl9ESQkJMHgwMgkvKiBlZXByb20gREkgcGluICovCisjZGVmaW5lIEVFQ1NSX0RPCQkweDAxCS8qIGVlcHJvbSBETyBwaW4gKi8KKworLyoKKyAqIEJpdHMgaW4gdGhlIEJDUjAgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIEJDUjBfQ1JGVDIJCTB4MjAKKyNkZWZpbmUgQkNSMF9DUkZUMQkJMHgxMAorI2RlZmluZSBCQ1IwX0NSRlQwCQkweDA4CisjZGVmaW5lIEJDUjBfRE1BTDIJCTB4MDQKKyNkZWZpbmUgQkNSMF9ETUFMMQkJMHgwMgorI2RlZmluZSBCQ1IwX0RNQUwwCQkweDAxCisKKy8qCisgKiBCaXRzIGluIHRoZSBCQ1IxIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBCQ1IxX0NUU0YJCTB4MjAKKyNkZWZpbmUgQkNSMV9DVEZUMQkJMHgxMAorI2RlZmluZSBCQ1IxX0NURlQwCQkweDA4CisjZGVmaW5lIEJDUjFfUE9UMgkJMHgwNAorI2RlZmluZSBCQ1IxX1BPVDEJCTB4MDIKKyNkZWZpbmUgQkNSMV9QT1QwCQkweDAxCisKKy8qCisgKiBCaXRzIGluIHRoZSBDRkdBIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBDRkdBX0VFTE9BRAkJMHg4MAkvKiBlbmFibGUgZWVwcm9tIGVtYmVkZWQgYW5kIGRpcmVjdCBwcm9ncmFtbWluZyAqLworI2RlZmluZSBDRkdBX0pVTVBFUgkJMHg0MAorI2RlZmluZSBDRkdBX01UR1BJTwkJMHgwOAorI2RlZmluZSBDRkdBX1QxMEVOCQkweDAyCisjZGVmaW5lIENGR0FfQVVUTwkJMHgwMQorCisvKgorICogQml0cyBpbiB0aGUgQ0ZHQiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ0ZHQl9QRAkJCTB4ODAKKyNkZWZpbmUgQ0ZHQl9QT0xFTgkJMHgwMgorI2RlZmluZSBDRkdCX0xOS0VOCQkweDAxCisKKy8qCisgKiBCaXRzIGluIHRoZSBDRkdDIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBDRkdDX00xMFRJTwkJMHg4MAorI2RlZmluZSBDRkdDX00xMFBPTAkJMHg0MAorI2RlZmluZSBDRkdDX1BIWTEJCTB4MjAKKyNkZWZpbmUgQ0ZHQ19QSFkwCQkweDEwCisjZGVmaW5lIENGR0NfQlRTRUwJCTB4MDgKKyNkZWZpbmUgQ0ZHQ19CUFMyCQkweDA0CS8qIGJvb3Ryb20gc2VsZWN0WzJdICovCisjZGVmaW5lIENGR0NfQlBTMQkJMHgwMgkvKiBib290cm9tIHNlbGVjdFsxXSAqLworI2RlZmluZSBDRkdDX0JQUzAJCTB4MDEJLyogYm9vdHJvbSBzZWxlY3RbMF0gKi8KKworLyoKKyAqIEJpdHMgaW4gdGhlIENGR0QgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIENGR0RfR1BJT0VOCQkweDgwCisjZGVmaW5lIENGR0RfRElBRwkJMHg0MAorI2RlZmluZSBDRkdEX01BR0lDCQkweDEwCisjZGVmaW5lIENGR0RfQ0ZEWAkJMHgwNAorI2RlZmluZSBDRkdEX0NFUkVOCQkweDAyCisjZGVmaW5lIENGR0RfQ0VURU4JCTB4MDEKKworLyogQml0cyBpbiBSU1IgKi8KKyNkZWZpbmUgUlNSX1JFUlIJCTB4MDAwMDAwMDEKKyNkZWZpbmUgUlNSX0NSQwkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgUlNSX0ZBRQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgUlNSX0ZPVgkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgUlNSX0xPTkcJCTB4MDAwMDAwMTAKKyNkZWZpbmUgUlNSX1JVTlQJCTB4MDAwMDAwMjAKKyNkZWZpbmUgUlNSX1NFUlIJCTB4MDAwMDAwNDAKKyNkZWZpbmUgUlNSX0JVRkYJCTB4MDAwMDAwODAKKyNkZWZpbmUgUlNSX0VEUAkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgUlNSX1NUUAkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgUlNSX0NITgkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgUlNSX1BIWQkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgUlNSX0JBUgkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgUlNSX01BUgkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgUlNSX1JYT0sJCTB4MDAwMDgwMDAKKyNkZWZpbmUgUlNSX0FCTk9STUFMCQlSU1JfUkVSUitSU1JfTE9ORytSU1JfUlVOVAorCisvKiBCaXRzIGluIFRTUiAqLworI2RlZmluZSBUU1JfTkNSMAkJMHgwMDAwMDAwMQorI2RlZmluZSBUU1JfTkNSMQkJMHgwMDAwMDAwMgorI2RlZmluZSBUU1JfTkNSMgkJMHgwMDAwMDAwNAorI2RlZmluZSBUU1JfTkNSMwkJMHgwMDAwMDAwOAorI2RlZmluZSBUU1JfQ09MUwkJMHgwMDAwMDAxMAorI2RlZmluZSBUU1JfQ0RICQkJMHgwMDAwMDA4MAorI2RlZmluZSBUU1JfQUJUCQkJMHgwMDAwMDEwMAorI2RlZmluZSBUU1JfT1dDCQkJMHgwMDAwMDIwMAorI2RlZmluZSBUU1JfQ1JTCQkJMHgwMDAwMDQwMAorI2RlZmluZSBUU1JfVURGCQkJMHgwMDAwMDgwMAorI2RlZmluZSBUU1JfVEJVRkYJCTB4MDAwMDEwMDAKKyNkZWZpbmUgVFNSX1NFUlIJCTB4MDAwMDIwMDAKKyNkZWZpbmUgVFNSX0pBQgkJCTB4MDAwMDQwMDAKKyNkZWZpbmUgVFNSX1RFUlIJCTB4MDAwMDgwMDAKKyNkZWZpbmUgVFNSX0FCTk9STUFMCQlUU1JfVEVSUitUU1JfT1dDK1RTUl9BQlQrVFNSX0pBQitUU1JfQ1JTCisjZGVmaW5lIFRTUl9PV05fQklUCQkweDgwMDAwMDAwCisKKyNkZWZpbmUgQ0JfREVMQVlfTE9PUF9XQUlUCTEwCS8qIDEwbXMgKi8KKy8qIGVuYWJsZWQgbWFzayB2YWx1ZSBvZiBpcnEgKi8KKworI2RlZmluZSBXX0lNUl9NQVNLX1ZBTFVFCTB4MUJGRgkvKiBpbml0aWFsIHZhbHVlIG9mIElNUiAqLworCisvKiBFdGhlcm5ldCBhZGRyZXNzIGZpbHRlciB0eXBlICovCisjZGVmaW5lIFBLVF9UWVBFX0RJUkVDVEVECTB4MDAwMQkvKiBvYnNvbGV0ZSwgZGlyZWN0ZWQgYWRkcmVzcyBpcyBhbHdheXMgYWNjZXB0ZWQgKi8KKyNkZWZpbmUgUEtUX1RZUEVfTVVMVElDQVNUCTB4MDAwMgorI2RlZmluZSBQS1RfVFlQRV9BTExfTVVMVElDQVNUCTB4MDAwNAorI2RlZmluZSBQS1RfVFlQRV9CUk9BRENBU1QJMHgwMDA4CisjZGVmaW5lIFBLVF9UWVBFX1BST01JU0NVT1VTCTB4MDAyMAorI2RlZmluZSBQS1RfVFlQRV9MT05HCQkweDIwMDAKKyNkZWZpbmUgUEtUX1RZUEVfUlVOVAkJMHg0MDAwCisjZGVmaW5lIFBLVF9UWVBFX0VSUk9SCQkweDgwMDAJLyogYWNjZXB0IGVycm9yIHBhY2tldHMsIGUuZy4gQ1JDIGVycm9yICovCisKKy8qIExvb3BiYWNrIG1vZGUgKi8KKworI2RlZmluZSBOSUNfTEJfTk9ORQkJMHgwMAorI2RlZmluZSBOSUNfTEJfSU5URVJOQUwJCTB4MDEKKyNkZWZpbmUgTklDX0xCX1BIWQkJMHgwMgkvKiBNSUkgb3IgSW50ZXJuYWwtMTBCYXNlVCBsb29wYmFjayAqLworCisjZGVmaW5lIFRYX1JJTkdfU0laRQkJMgorI2RlZmluZSBSWF9SSU5HX1NJWkUJCTIKKyNkZWZpbmUgUEtUX0JVRl9TWgkJMTUzNgkvKiBTaXplIG9mIGVhY2ggdGVtcG9yYXJ5IFJ4IGJ1ZmZlci4gKi8KKworLyogVHJhbnNtaXQgYW5kIHJlY2VpdmUgZGVzY3JpcHRvcnMgZGVmaW5pdGlvbiAqLworCitzdHJ1Y3QgcmhpbmVfdHhfZGVzYworeworICAgIHVuaW9uIFZUQ190eF9zdGF0dXNfdGFnCisgICAgeworCXN0cnVjdAorCXsKKwkgICAgdW5zaWduZWQgbG9uZyBuY3JvOjE7CisJICAgIHVuc2lnbmVkIGxvbmcgbmNyMToxOworCSAgICB1bnNpZ25lZCBsb25nIG5jcjI6MTsKKwkgICAgdW5zaWduZWQgbG9uZyBuY3IzOjE7CisJICAgIHVuc2lnbmVkIGxvbmcgY29sczoxOworCSAgICB1bnNpZ25lZCBsb25nIHJlc2VydmVfMToyOworCSAgICB1bnNpZ25lZCBsb25nIGNkaDoxOworCSAgICB1bnNpZ25lZCBsb25nIGFidDoxOworCSAgICB1bnNpZ25lZCBsb25nIG93YzoxOworCSAgICB1bnNpZ25lZCBsb25nIGNyczoxOworCSAgICB1bnNpZ25lZCBsb25nIHVkZjoxOworCSAgICB1bnNpZ25lZCBsb25nIHRidWZmOjE7CisJICAgIHVuc2lnbmVkIGxvbmcgc2VycjoxOworCSAgICB1bnNpZ25lZCBsb25nIGphYjoxOworCSAgICB1bnNpZ25lZCBsb25nIHRlcnI6MTsKKwkgICAgdW5zaWduZWQgbG9uZyByZXNlcnZlXzI6MTU7CisJICAgIHVuc2lnbmVkIGxvbmcgb3duX2JpdDoxOworCX0KKwliaXRzOworCXVuc2lnbmVkIGxvbmcgbHc7CisgICAgfQorICAgIHR4X3N0YXR1czsKKworICAgIHVuaW9uIFZUQ190eF9jdHJsX3RhZworICAgIHsKKwlzdHJ1Y3QKKwl7CisJICAgIHVuc2lnbmVkIGxvbmcgdHhfYnVmX3NpemU6MTE7CisJICAgIHVuc2lnbmVkIGxvbmcgZXh0ZW5kX3R4X2J1Zl9zaXplOjQ7CisJICAgIHVuc2lnbmVkIGxvbmcgY2huOjE7CisJICAgIHVuc2lnbmVkIGxvbmcgY3JjOjE7CisJICAgIHVuc2lnbmVkIGxvbmcgcmVzZXJ2ZV8xOjQ7CisJICAgIHVuc2lnbmVkIGxvbmcgc3RwOjE7CisJICAgIHVuc2lnbmVkIGxvbmcgZWRwOjE7CisJICAgIHVuc2lnbmVkIGxvbmcgaWM6MTsKKwkgICAgdW5zaWduZWQgbG9uZyByZXNlcnZlXzI6ODsKKwl9CisJYml0czsKKwl1bnNpZ25lZCBsb25nIGx3OworICAgIH0KKyAgICB0eF9jdHJsOworCisgICAgdW5zaWduZWQgbG9uZyBidWZfYWRkcl8xOjMyOworICAgIHVuc2lnbmVkIGxvbmcgYnVmX2FkZHJfMjozMjsKKworfTsKKworc3RydWN0IHJoaW5lX3J4X2Rlc2MKK3sKKyAgICB1bmlvbiBWVENfcnhfc3RhdHVzX3RhZworICAgIHsKKwlzdHJ1Y3QKKwl7CisJICAgIHVuc2lnbmVkIGxvbmcgcmVycjoxOworCSAgICB1bnNpZ25lZCBsb25nIGNyY19lcnJvcjoxOworCSAgICB1bnNpZ25lZCBsb25nIGZhZToxOworCSAgICB1bnNpZ25lZCBsb25nIGZvdjoxOworCSAgICB1bnNpZ25lZCBsb25nIHRvb2xvbmc6MTsKKwkgICAgdW5zaWduZWQgbG9uZyBydW50OjE7CisJICAgIHVuc2lnbmVkIGxvbmcgc2VycjoxOworCSAgICB1bnNpZ25lZCBsb25nIGJ1ZmY6MTsKKwkgICAgdW5zaWduZWQgbG9uZyBlZHA6MTsKKwkgICAgdW5zaWduZWQgbG9uZyBzdHA6MTsKKwkgICAgdW5zaWduZWQgbG9uZyBjaG46MTsKKwkgICAgdW5zaWduZWQgbG9uZyBwaHk6MTsKKwkgICAgdW5zaWduZWQgbG9uZyBiYXI6MTsKKwkgICAgdW5zaWduZWQgbG9uZyBtYXI6MTsKKwkgICAgdW5zaWduZWQgbG9uZyByZXNlcnZlXzE6MTsKKwkgICAgdW5zaWduZWQgbG9uZyByeG9rOjE7CisJICAgIHVuc2lnbmVkIGxvbmcgZnJhbWVfbGVuZ3RoOjExOworCSAgICB1bnNpZ25lZCBsb25nIHJldmVydmVfMjo0OworCSAgICB1bnNpZ25lZCBsb25nIG93bl9iaXQ6MTsKKwl9CisJYml0czsKKwl1bnNpZ25lZCBsb25nIGx3OworICAgIH0KKyAgICByeF9zdGF0dXM7CisKKyAgICB1bmlvbiBWVENfcnhfY3RybF90YWcKKyAgICB7CisJc3RydWN0CisJeworCSAgICB1bnNpZ25lZCBsb25nIHJ4X2J1Zl9zaXplOjExOworCSAgICB1bnNpZ25lZCBsb25nIGV4dGVuZF9yeF9idWZfc2l6ZTo0OworCSAgICB1bnNpZ25lZCBsb25nIHJlc2VydmVkXzE6MTc7CisJfQorCWJpdHM7CisJdW5zaWduZWQgbG9uZyBsdzsKKyAgICB9CisgICAgcnhfY3RybDsKKworICAgIHVuc2lnbmVkIGxvbmcgYnVmX2FkZHJfMTozMjsKKyAgICB1bnNpZ25lZCBsb25nIGJ1Zl9hZGRyXzI6MzI7CisKK307CisKKworLyogVGhlIEkvTyBleHRlbnQuICovCisjZGVmaW5lIHJoaW5lX1RPVEFMX1NJWkUgMHg4MAorCisjaWZkZWYJSEFWRV9ERVZMSVNUCitzdHJ1Y3QgbmV0ZGV2X2VudHJ5IHJoaW5lX2RydiA9CisgICAgeyAicmhpbmUiLCByaGluZV9wcm9iZSwgcmhpbmVfVE9UQUxfU0laRSwgTlVMTCB9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgcmhpbmVfZGVidWcgPSAxOworCisvKgorCQkJCVRoZW9yeSBvZiBPcGVyYXRpb24KKworSS4gQm9hcmQgQ29tcGF0aWJpbGl0eQorCitUaGlzIGRyaXZlciBpcyBkZXNpZ25lZCBmb3IgdGhlIFZJQSA4NmMxMDBBIFJoaW5lLUlJIFBDSSBGYXN0IEV0aGVybmV0Citjb250cm9sbGVyLgorCitJSS4gQm9hcmQtc3BlY2lmaWMgc2V0dGluZ3MKKworQm9hcmRzIHdpdGggdGhpcyBjaGlwIGFyZSBmdW5jdGlvbmFsIG9ubHkgaW4gYSBidXMtbWFzdGVyIFBDSSBzbG90LgorCitNYW55IG9wZXJhdGlvbmFsIHNldHRpbmdzIGFyZSBsb2FkZWQgZnJvbSB0aGUgRUVQUk9NIHRvIHRoZSBDb25maWcgd29yZCBhdAorb2Zmc2V0IDB4NzguICBUaGlzIGRyaXZlciBhc3N1bWVzIHRoYXQgdGhleSBhcmUgY29ycmVjdC4KK0lmIHRoaXMgZHJpdmVyIGlzIGNvbXBpbGVkIHRvIHVzZSBQQ0kgbWVtb3J5IHNwYWNlIG9wZXJhdGlvbnMgdGhlIEVFUFJPTQorbXVzdCBiZSBjb25maWd1cmVkIHRvIGVuYWJsZSBtZW1vcnkgb3BzLgorCitJSUkuIERyaXZlciBvcGVyYXRpb24KKworSUlJYS4gUmluZyBidWZmZXJzCisKK1RoaXMgZHJpdmVyIHVzZXMgdHdvIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGZpeGVkLXNpemUgZGVzY3JpcHRvciBsaXN0cworZm9ybWVkIGludG8gcmluZ3MgYnkgYSBicmFuY2ggZnJvbSB0aGUgZmluYWwgZGVzY3JpcHRvciB0byB0aGUgYmVnaW5uaW5nIG9mCit0aGUgbGlzdC4gIFRoZSByaW5nIHNpemVzIGFyZSBzZXQgYXQgY29tcGlsZSB0aW1lIGJ5IFJYL1RYX1JJTkdfU0laRS4KKworSUlJYi9jLiBUcmFuc21pdC9SZWNlaXZlIFN0cnVjdHVyZQorCitUaGlzIGRyaXZlciBhdHRlbXB0cyB0byB1c2UgYSB6ZXJvLWNvcHkgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgc2NoZW1lLgorCitBbGFzLCBhbGwgZGF0YSBidWZmZXJzIGFyZSByZXF1aXJlZCB0byBzdGFydCBvbiBhIDMyIGJpdCBib3VuZGFyeSwgc28KK3RoZSBkcml2ZXIgbXVzdCBvZnRlbiBjb3B5IHRyYW5zbWl0IHBhY2tldHMgaW50byBib3VuY2UgYnVmZmVycy4KKworVGhlIGRyaXZlciBhbGxvY2F0ZXMgZnVsbCBmcmFtZSBzaXplIHNrYnVmZnMgZm9yIHRoZSBSeCByaW5nIGJ1ZmZlcnMgYXQKK29wZW4oKSB0aW1lIGFuZCBwYXNzZXMgdGhlIHNrYi0+ZGF0YSBmaWVsZCB0byB0aGUgY2hpcCBhcyByZWNlaXZlIGRhdGEKK2J1ZmZlcnMuICBXaGVuIGFuIGluY29taW5nIGZyYW1lIGlzIGxlc3MgdGhhbiBSWF9DT1BZQlJFQUsgYnl0ZXMgbG9uZywKK2EgZnJlc2ggc2tidWZmIGlzIGFsbG9jYXRlZCBhbmQgdGhlIGZyYW1lIGlzIGNvcGllZCB0byB0aGUgbmV3IHNrYnVmZi4KK1doZW4gdGhlIGluY29taW5nIGZyYW1lIGlzIGxhcmdlciwgdGhlIHNrYnVmZiBpcyBwYXNzZWQgZGlyZWN0bHkgdXAgdGhlCitwcm90b2NvbCBzdGFjay4gIEJ1ZmZlcnMgY29uc3VtZWQgdGhpcyB3YXkgYXJlIHJlcGxhY2VkIGJ5IG5ld2x5IGFsbG9jYXRlZAorc2tidWZmcyBpbiB0aGUgbGFzdCBwaGFzZSBvZiBuZXRkZXZfcngoKS4KKworVGhlIFJYX0NPUFlCUkVBSyB2YWx1ZSBpcyBjaG9zZW4gdG8gdHJhZGUtb2ZmIHRoZSBtZW1vcnkgd2FzdGVkIGJ5Cit1c2luZyBhIGZ1bGwtc2l6ZWQgc2tidWZmIGZvciBzbWFsbCBmcmFtZXMgdnMuIHRoZSBjb3B5aW5nIGNvc3RzIG9mIGxhcmdlcgorZnJhbWVzLiAgTmV3IGJvYXJkcyBhcmUgdHlwaWNhbGx5IHVzZWQgaW4gZ2VuZXJvdXNseSBjb25maWd1cmVkIG1hY2hpbmVzCithbmQgdGhlIHVuZGVyZmlsbGVkIGJ1ZmZlcnMgaGF2ZSBuZWdsaWdpYmxlIGltcGFjdCBjb21wYXJlZCB0byB0aGUgYmVuZWZpdCBvZgorYSBzaW5nbGUgYWxsb2NhdGlvbiBzaXplLCBzbyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB6ZXJvIHJlc3VsdHMgaW4gbmV2ZXIKK2NvcHlpbmcgcGFja2V0cy4gIFdoZW4gY29weWluZyBpcyBkb25lLCB0aGUgY29zdCBpcyB1c3VhbGx5IG1pdGlnYXRlZCBieSB1c2luZworYSBjb21iaW5lZCBjb3B5L2NoZWNrc3VtIHJvdXRpbmUuICBDb3B5aW5nIGFsc28gcHJlbG9hZHMgdGhlIGNhY2hlLCB3aGljaCBpcworbW9zdCB1c2VmdWwgd2l0aCBzbWFsbCBmcmFtZXMuCisKK1NpbmNlIHRoZSBWSUEgY2hpcHMgYXJlIG9ubHkgYWJsZSB0byB0cmFuc2ZlciBkYXRhIHRvIGJ1ZmZlcnMgb24gMzIgYml0Citib3VuZGFyaWVzLCB0aGUgdGhlIElQIGhlYWRlciBhdCBvZmZzZXQgMTQgaW4gYW4gZXRoZXJuZXQgZnJhbWUgaXNuJ3QKK2xvbmd3b3JkIGFsaWduZWQgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4gIENvcHlpbmcgdGhlc2UgdW5hbGlnbmVkIGJ1ZmZlcnMKK2hhcyB0aGUgYmVuZWZpY2lhbCBlZmZlY3Qgb2YgMTYtYnl0ZSBhbGlnbmluZyB0aGUgSVAgaGVhZGVyLgorCitJSUlkLiBTeW5jaHJvbml6YXRpb24KKworVGhlIGRyaXZlciBydW5zIGFzIHR3byBpbmRlcGVuZGVudCwgc2luZ2xlLXRocmVhZGVkIGZsb3dzIG9mIGNvbnRyb2wuICBPbmUKK2lzIHRoZSBzZW5kLXBhY2tldCByb3V0aW5lLCB3aGljaCBlbmZvcmNlcyBzaW5nbGUtdGhyZWFkZWQgdXNlIGJ5IHRoZQorZGV2LT50YnVzeSBmbGFnLiAgVGhlIG90aGVyIHRocmVhZCBpcyB0aGUgaW50ZXJydXB0IGhhbmRsZXIsIHdoaWNoIGlzIHNpbmdsZQordGhyZWFkZWQgYnkgdGhlIGhhcmR3YXJlIGFuZCBpbnRlcnJ1cHQgaGFuZGxpbmcgc29mdHdhcmUuCisKK1RoZSBzZW5kIHBhY2tldCB0aHJlYWQgaGFzIHBhcnRpYWwgY29udHJvbCBvdmVyIHRoZSBUeCByaW5nIGFuZCAnZGV2LT50YnVzeScKK2ZsYWcuICBJdCBzZXRzIHRoZSB0YnVzeSBmbGFnIHdoZW5ldmVyIGl0J3MgcXVldWluZyBhIFR4IHBhY2tldC4gSWYgdGhlIG5leHQKK3F1ZXVlIHNsb3QgaXMgZW1wdHksIGl0IGNsZWFycyB0aGUgdGJ1c3kgZmxhZyB3aGVuIGZpbmlzaGVkIG90aGVyd2lzZSBpdCBzZXRzCit0aGUgJ2xwLT50eF9mdWxsJyBmbGFnLgorCitUaGUgaW50ZXJydXB0IGhhbmRsZXIgaGFzIGV4Y2x1c2l2ZSBjb250cm9sIG92ZXIgdGhlIFJ4IHJpbmcgYW5kIHJlY29yZHMgc3RhdHMKK2Zyb20gdGhlIFR4IHJpbmcuICBBZnRlciByZWFwaW5nIHRoZSBzdGF0cywgaXQgbWFya3MgdGhlIFR4IHF1ZXVlIGVudHJ5IGFzCitlbXB0eSBieSBpbmNyZW1lbnRpbmcgdGhlIGRpcnR5X3R4IG1hcmsuIElmZiB0aGUgJ2xwLT50eF9mdWxsJyBmbGFnIGlzIHNldCwgaXQKK2NsZWFycyBib3RoIHRoZSB0eF9mdWxsIGFuZCB0YnVzeSBmbGFncy4KKworSVYuIE5vdGVzCisKK0lWYi4gUmVmZXJlbmNlcworCitQcmVsaW1pbmFyeSBWVDg2QzEwMEEgbWFudWFsIGZyb20gaHR0cDovL3d3dy52aWEuY29tLnR3LworaHR0cDovL2Nlc2Rpcy5nc2ZjLm5hc2EuZ292L2xpbnV4L21pc2MvMTAwbWJwcy5odG1sCitodHRwOi8vY2VzZGlzLmdzZmMubmFzYS5nb3YvbGludXgvbWlzYy9OV2F5Lmh0bWwKKworSVZjLiBFcnJhdGEKKworVGhlIFZUODZDMTAwQSBtYW51YWwgaXMgbm90IHJlbGlhYmxlIGluZm9ybWF0aW9uLgorVGhlIGNoaXAgZG9lcyBub3QgaGFuZGxlIHVuYWxpZ25lZCB0cmFuc21pdCBvciByZWNlaXZlIGJ1ZmZlcnMsIHJlc3VsdGluZworaW4gc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24gZm9yIGJvdW5jZSBidWZmZXIgY29waWVzIG9uIHRyYW5zbWl0CithbmQgdW5hbGlnbmVkIElQIGhlYWRlcnMgb24gcmVjZWl2ZS4KK1RoZSBjaGlwIGRvZXMgbm90IHBhZCB0byBtaW5pbXVtIHRyYW5zbWl0IGxlbmd0aC4KKworKi8KKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0ZFVAkJMHgxMTA2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRkVUXzMwNDMJCTB4MzA0MworCisvKiBUaGUgcmVzdCBvZiB0aGVzZSB2YWx1ZXMgc2hvdWxkIG5ldmVyIGNoYW5nZS4gKi8KKyNkZWZpbmUgTlVNX1RYX0RFU0MJMgkvKiBOdW1iZXIgb2YgVHggZGVzY3JpcHRvciByZWdpc3RlcnMuICovCisKK3N0YXRpYyBzdHJ1Y3QgcmhpbmVfcHJpdmF0ZQoreworICAgIGNoYXIgZGV2bmFtZVs4XTsJCS8qIFVzZWQgb25seSBmb3Iga2VybmVsIGRlYnVnZ2luZy4gKi8KKyAgICBjb25zdCBjaGFyICpwcm9kdWN0X25hbWU7CisgICAgc3RydWN0IHJoaW5lX3J4X2Rlc2MgKnJ4X3Jpbmc7CisgICAgc3RydWN0IHJoaW5lX3R4X2Rlc2MgKnR4X3Jpbmc7CisgICAgY2hhciAqcnhfYnVmZnNbUlhfUklOR19TSVpFXTsKKyAgICBjaGFyICp0eF9idWZmc1tUWF9SSU5HX1NJWkVdOworCisgICAgLyogdGVtcG9yYXJ5IFJ4IGJ1ZmZlcnMuICovCisKKyAgICBpbnQgY2hpcF9pZDsKKyAgICBpbnQgY2hpcF9yZXZpc2lvbjsKKyAgICB1bnNpZ25lZCBzaG9ydCBpb2FkZHI7CisgICAgdW5zaWduZWQgaW50IGN1cl9yeCwgY3VyX3R4OwkvKiBUaGUgbmV4dCBmcmVlIGFuZCB1c2VkIGVudHJpZXMgKi8KKyAgICB1bnNpZ25lZCBpbnQgZGlydHlfcngsIGRpcnR5X3R4OworICAgIC8qIFRoZSBzYXZlZCBhZGRyZXNzIG9mIGEgc2VudC1pbi1wbGFjZSBwYWNrZXQvYnVmZmVyLCBmb3Igc2tmcmVlKCkuICovCisgICAgc3RydWN0IHNrX2J1ZmYgKnR4X3NrYnVmZltUWF9SSU5HX1NJWkVdOworICAgIHVuc2lnbmVkIGNoYXIgbWNfZmlsdGVyWzhdOwkvKiBDdXJyZW50IG11bHRpY2FzdCBmaWx0ZXIuICovCisgICAgY2hhciBwaHlzWzRdOwkJLyogTUlJIGRldmljZSBhZGRyZXNzZXMuICovCisgICAgdW5zaWduZWQgaW50IHR4X2Z1bGw6MTsJLyogVGhlIFR4IHF1ZXVlIGlzIGZ1bGwuICovCisgICAgdW5zaWduZWQgaW50IGZ1bGxfZHVwbGV4OjE7CS8qIEZ1bGwtZHVwbGV4IG9wZXJhdGlvbiByZXF1ZXN0ZWQuICovCisgICAgdW5zaWduZWQgaW50IGRlZmF1bHRfcG9ydDo0OwkvKiBMYXN0IGRldi0+aWZfcG9ydCB2YWx1ZS4gKi8KKyAgICB1bnNpZ25lZCBpbnQgbWVkaWEyOjQ7CS8qIFNlY29uZGFyeSBtb25pdG9yZWQgbWVkaWEgcG9ydC4gKi8KKyAgICB1bnNpZ25lZCBpbnQgbWVkaWFsb2NrOjE7CS8qIERvbid0IHNlbnNlIG1lZGlhIHR5cGUuICovCisgICAgdW5zaWduZWQgaW50IG1lZGlhc2Vuc2U6MTsJLyogTWVkaWEgc2Vuc2luZyBpbiBwcm9ncmVzcy4gKi8KK30KK3JoaW5lOworCitzdGF0aWMgc3RydWN0IG5pYyAqcmhpbmVfcHJvYmUxIChzdHJ1Y3QgbmljICpkZXYsIGludCBpb2FkZHIsCisJCQkJIGludCBjaGlwX2lkLCBpbnQgb3B0aW9ucyk7CitzdGF0aWMgaW50IFF1ZXJ5QXV0byAoaW50KTsKK3N0YXRpYyBpbnQgUmVhZE1JSSAoaW50IGJ5TUlJSW5kZXgsIGludCk7CitzdGF0aWMgdm9pZCBXcml0ZU1JSSAoY2hhciwgY2hhciwgY2hhciwgaW50KTsKK3N0YXRpYyB2b2lkIE1JSURlbGF5ICh2b2lkKTsKK3N0YXRpYyB2b2lkIHJoaW5lX2luaXRfcmluZyAoc3RydWN0IG5pYyAqZGV2KTsKK3N0YXRpYyB2b2lkIHJoaW5lX2Rpc2FibGUgKHN0cnVjdCBuaWMgKm5pYyk7CitzdGF0aWMgdm9pZCByaGluZV9yZXNldCAoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyBpbnQgcmhpbmVfcG9sbCAoc3RydWN0IG5pYyAqbmljKTsKK3N0YXRpYyB2b2lkIHJoaW5lX3RyYW5zbWl0IChzdHJ1Y3QgbmljICpuaWMsIGNvbnN0IGNoYXIgKmQsIHVuc2lnbmVkIGludCB0LAorCQkJICAgIHVuc2lnbmVkIGludCBzLCBjb25zdCBjaGFyICpwKTsKKworLyogTGludXggc3VwcG9ydCBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgdmlydF90b19idXMoeCkgKCh1bnNpZ25lZCBsb25nKXgpCisjZGVmaW5lIGJ1c190b192aXJ0KHgpICgodm9pZCAqKXgpCisKKy8qIEluaXRpYWxpemUgdGhlIFJ4IGFuZCBUeCByaW5ncywgYWxvbmcgd2l0aCB2YXJpb3VzICdkZXYnIGJpdHMuICovCitzdGF0aWMgdm9pZAorcmhpbmVfaW5pdF9yaW5nIChzdHJ1Y3QgbmljICpuaWMpCit7CisgICAgc3RydWN0IHJoaW5lX3ByaXZhdGUgKnRwID0gKHN0cnVjdCByaGluZV9wcml2YXRlICopIG5pYy0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgdHAtPnR4X2Z1bGwgPSAwOworICAgIHRwLT5jdXJfcnggPSB0cC0+Y3VyX3R4ID0gMDsKKyAgICB0cC0+ZGlydHlfcnggPSB0cC0+ZGlydHlfdHggPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKQorICAgIHsKKworCXRwLT5yeF9yaW5nW2ldLnJ4X3N0YXR1cy5iaXRzLm93bl9iaXQgPSAxOworCXRwLT5yeF9yaW5nW2ldLnJ4X2N0cmwuYml0cy5yeF9idWZfc2l6ZSA9IDE1MzY7CisKKwl0cC0+cnhfcmluZ1tpXS5idWZfYWRkcl8xID0gdmlydF90b19idXMgKHRwLT5yeF9idWZmc1tpXSk7CisJdHAtPnJ4X3JpbmdbaV0uYnVmX2FkZHJfMiA9IHZpcnRfdG9fYnVzICgmdHAtPnJ4X3JpbmdbaSArIDFdKTsKKwkvKiBwcmludGYoIlslZF1idWYxPSVoWCxidWYyPSVoWCIsaSx0cC0+cnhfcmluZ1tpXS5idWZfYWRkcl8xLHRwLT5yeF9yaW5nW2ldLmJ1Zl9hZGRyXzIpOyAqLworICAgIH0KKyAgICAvKiBNYXJrIHRoZSBsYXN0IGVudHJ5IGFzIHdyYXBwaW5nIHRoZSByaW5nLiAqLworICAgIC8qIHRwLT5yeF9yaW5nW2ktMV0ucnhfY3RybC5iaXRzLnJ4X2J1Zl9zaXplID0xNTE4OyAqLworICAgIHRwLT5yeF9yaW5nW2kgLSAxXS5idWZfYWRkcl8yID0gdmlydF90b19idXMgKCZ0cC0+cnhfcmluZ1swXSk7CisgICAgLypwcmludGYoIlslZF1idWYxPSVoWCxidWYyPSVoWCIsaS0xLHRwLT5yeF9yaW5nW2ktMV0uYnVmX2FkZHJfMSx0cC0+cnhfcmluZ1tpLTFdLmJ1Zl9hZGRyXzIpOyAqLworCisgICAgLyogVGhlIFR4IGJ1ZmZlciBkZXNjcmlwdG9yIGlzIGZpbGxlZCBpbiBhcyBuZWVkZWQsIGJ1dCB3ZQorICAgICAgIGRvIG5lZWQgdG8gY2xlYXIgdGhlIG93bmVyc2hpcCBiaXQuICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspCisgICAgeworCisJdHAtPnR4X3JpbmdbaV0udHhfc3RhdHVzLmx3ID0gMDsKKwl0cC0+dHhfcmluZ1tpXS50eF9jdHJsLmx3ID0gMHgwMGUwODAwMDsKKwl0cC0+dHhfcmluZ1tpXS5idWZfYWRkcl8xID0gdmlydF90b19idXMgKHRwLT50eF9idWZmc1tpXSk7CisJdHAtPnR4X3JpbmdbaV0uYnVmX2FkZHJfMiA9IHZpcnRfdG9fYnVzICgmdHAtPnR4X3JpbmdbaSArIDFdKTsKKwkvKiBwcmludGYoIlslZF1idWYxPSVoWCxidWYyPSVoWCIsaSx0cC0+dHhfcmluZ1tpXS5idWZfYWRkcl8xLHRwLT50eF9yaW5nW2ldLmJ1Zl9hZGRyXzIpOyAqLworICAgIH0KKworICAgIHRwLT50eF9yaW5nW2kgLSAxXS5idWZfYWRkcl8yID0gdmlydF90b19idXMgKCZ0cC0+dHhfcmluZ1swXSk7CisgICAgLyogcHJpbnRmKCJbJWRdYnVmMT0laFgsYnVmMj0laFgiLGksdHAtPnR4X3JpbmdbaS0xXS5idWZfYWRkcl8xLHRwLT50eF9yaW5nW2ktMV0uYnVmX2FkZHJfMik7ICovCit9CisKK2ludAorUXVlcnlBdXRvIChpbnQgaW9hZGRyKQoreworICAgIGludCBieU1JSUluZGV4OworICAgIGludCBNSUlSZXR1cm47CisKKwlpbnQgYWR2ZXJ0aXNpbmcsbWlpX3JlZzU7CisJaW50IG5lZ29jaWF0ZWQ7CisKKyAgICBieU1JSUluZGV4ID0gMHgwNDsKKyAgICBNSUlSZXR1cm4gPSBSZWFkTUlJIChieU1JSUluZGV4LCBpb2FkZHIpOworCWFkdmVydGlzaW5nPU1JSVJldHVybjsKKworICAgIGJ5TUlJSW5kZXggPSAweDA1OworICAgIE1JSVJldHVybiA9IFJlYWRNSUkgKGJ5TUlJSW5kZXgsIGlvYWRkcik7CisJbWlpX3JlZzU9TUlJUmV0dXJuOworCisJbmVnb2NpYXRlZD1taWlfcmVnNSAmIGFkdmVydGlzaW5nOworCisJaWYgKCAobmVnb2NpYXRlZCAmIDB4MTAwKSB8fCAobmVnb2NpYXRlZCAmIDB4MUMwKSA9PSAweDQwICkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKKworfQorCitpbnQKK1JlYWRNSUkgKGludCBieU1JSUluZGV4LCBpbnQgaW9hZGRyKQoreworICAgIGludCBSZXR1cm5NSUk7CisgICAgY2hhciBieU1JSUFkcmJhazsKKyAgICBjaGFyIGJ5TUlJQ1JiYWs7CisgICAgY2hhciBieU1JSXRlbXA7CisKKyAgICBieU1JSUFkcmJhayA9IGluYiAoYnlNSUlBRCk7CisgICAgYnlNSUlDUmJhayA9IGluYiAoYnlNSUlDUik7CisgICAgb3V0YiAoYnlNSUlDUmJhayAmIDB4N2YsIGJ5TUlJQ1IpOworICAgIE1JSURlbGF5ICgpOworCisgICAgb3V0YiAoYnlNSUlJbmRleCwgYnlNSUlBRCk7CisgICAgTUlJRGVsYXkgKCk7CisKKyAgICBvdXRiIChpbmIgKGJ5TUlJQ1IpIHwgMHg0MCwgYnlNSUlDUik7CisKKyAgICBieU1JSXRlbXAgPSBpbmIgKGJ5TUlJQ1IpOworICAgIGJ5TUlJdGVtcCA9IGJ5TUlJdGVtcCAmIDB4NDA7CisKKyAgICB3aGlsZSAoYnlNSUl0ZW1wICE9IDApCisgICAgeworCWJ5TUlJdGVtcCA9IGluYiAoYnlNSUlDUik7CisJYnlNSUl0ZW1wID0gYnlNSUl0ZW1wICYgMHg0MDsKKyAgICB9CisgICAgTUlJRGVsYXkgKCk7CisKKyAgICBSZXR1cm5NSUkgPSBpbncgKHdNSUlEQVRBKTsKKworICAgIG91dGIgKGJ5TUlJQWRyYmFrLCBieU1JSUFEKTsKKyAgICBvdXRiIChieU1JSUNSYmFrLCBieU1JSUNSKTsKKyAgICBNSUlEZWxheSAoKTsKKworICAgIHJldHVybiAoUmV0dXJuTUlJKTsKKworfQorCit2b2lkCitXcml0ZU1JSSAoY2hhciBieU1JSVNldEJ5dGUsIGNoYXIgYnlNSUlTZXRCaXQsIGNoYXIgYnlNSUlPUCwgaW50IGlvYWRkcikKK3sKKyAgICBpbnQgUmVhZE1JSXRtcDsKKyAgICBpbnQgTUlJTWFzazsKKyAgICBjaGFyIGJ5TUlJQWRyYmFrOworICAgIGNoYXIgYnlNSUlDUmJhazsKKyAgICBjaGFyIGJ5TUlJdGVtcDsKKworCisgICAgYnlNSUlBZHJiYWsgPSBpbmIgKGJ5TUlJQUQpOworCisgICAgYnlNSUlDUmJhayA9IGluYiAoYnlNSUlDUik7CisgICAgb3V0YiAoYnlNSUlDUmJhayAmIDB4N2YsIGJ5TUlJQ1IpOworICAgIE1JSURlbGF5ICgpOworICAgIG91dGIgKGJ5TUlJU2V0Qnl0ZSwgYnlNSUlBRCk7CisgICAgTUlJRGVsYXkgKCk7CisKKyAgICBvdXRiIChpbmIgKGJ5TUlJQ1IpIHwgMHg0MCwgYnlNSUlDUik7CisKKyAgICBieU1JSXRlbXAgPSBpbmIgKGJ5TUlJQ1IpOworICAgIGJ5TUlJdGVtcCA9IGJ5TUlJdGVtcCAmIDB4NDA7CisKKyAgICB3aGlsZSAoYnlNSUl0ZW1wICE9IDApCisgICAgeworCWJ5TUlJdGVtcCA9IGluYiAoYnlNSUlDUik7CisJYnlNSUl0ZW1wID0gYnlNSUl0ZW1wICYgMHg0MDsKKyAgICB9CisgICAgTUlJRGVsYXkgKCk7CisKKyAgICBSZWFkTUlJdG1wID0gaW53ICh3TUlJREFUQSk7CisgICAgTUlJTWFzayA9IDB4MDAwMTsKKyAgICBNSUlNYXNrID0gTUlJTWFzayA8PCBieU1JSVNldEJpdDsKKworCisgICAgaWYgKGJ5TUlJT1AgPT0gMCkKKyAgICB7CisJTUlJTWFzayA9IH5NSUlNYXNrOworCVJlYWRNSUl0bXAgPSBSZWFkTUlJdG1wICYgTUlJTWFzazsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlSZWFkTUlJdG1wID0gUmVhZE1JSXRtcCB8IE1JSU1hc2s7CisKKyAgICB9CisgICAgb3V0dyAoUmVhZE1JSXRtcCwgd01JSURBVEEpOworICAgIE1JSURlbGF5ICgpOworCisgICAgb3V0YiAoaW5iIChieU1JSUNSKSB8IDB4MjAsIGJ5TUlJQ1IpOworICAgIGJ5TUlJdGVtcCA9IGluYiAoYnlNSUlDUik7CisgICAgYnlNSUl0ZW1wID0gYnlNSUl0ZW1wICYgMHgyMDsKKworICAgIHdoaWxlIChieU1JSXRlbXAgIT0gMCkKKyAgICB7CisJYnlNSUl0ZW1wID0gaW5iIChieU1JSUNSKTsKKwlieU1JSXRlbXAgPSBieU1JSXRlbXAgJiAweDIwOworICAgIH0KKyAgICBNSUlEZWxheSAoKTsKKworICAgIG91dGIgKGJ5TUlJQWRyYmFrICYgMHg3ZiwgYnlNSUlBRCk7CisgICAgb3V0YiAoYnlNSUlDUmJhaywgYnlNSUlDUik7CisgICAgTUlJRGVsYXkgKCk7CisKK30KKwordm9pZAorTUlJRGVsYXkgKHZvaWQpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDB4N2ZmZjsgaSsrKQorICAgIHsKKwlpbmIgKDB4NjEpOworCWluYiAoMHg2MSk7CisJaW5iICgweDYxKTsKKwlpbmIgKDB4NjEpOworICAgIH0KK30KKworc3RydWN0IG5pYyAqCityaGluZV9wcm9iZSAoc3RydWN0IG5pYyAqbmljLCB1bnNpZ25lZCBzaG9ydCAqcHJvYmVhZGRycywKKwkgICAgICAgc3RydWN0IHBjaV9kZXZpY2UgKnBjaSkKK3sKKyAgICBpZiAoIXBjaS0+aW9hZGRyKQorCXJldHVybiBOVUxMOworICAgIG5pYyA9IHJoaW5lX3Byb2JlMSAobmljLCBwY2ktPmlvYWRkciwgMCwgLTEpOworCisgICAgaWYgKG5pYykKKwlhZGp1c3RfcGNpX2RldmljZShwY2kpOworICAgIG5pYy0+cG9sbCA9IHJoaW5lX3BvbGw7CisgICAgbmljLT50cmFuc21pdCA9IHJoaW5lX3RyYW5zbWl0OworICAgIG5pYy0+cmVzZXQgPSByaGluZV9yZXNldDsKKyAgICBuaWMtPmRpc2FibGUgPSByaGluZV9kaXNhYmxlOworICAgIHJoaW5lX3Jlc2V0IChuaWMpOworCisgICAgcmV0dXJuIG5pYzsKK30KKworc3RhdGljIHN0cnVjdCBuaWMgKgorcmhpbmVfcHJvYmUxIChzdHJ1Y3QgbmljICpuaWMsIGludCBpb2FkZHIsIGludCBjaGlwX2lkLCBpbnQgb3B0aW9ucykKK3sKKyAgICBzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqdHA7CisgICAgc3RhdGljIGludCBkaWRfdmVyc2lvbiA9IDA7CS8qIEFscmVhZHkgcHJpbnRlZCB2ZXJzaW9uIGluZm8uICovCisgICAgaW50IGk7CisgICAgdW5zaWduZWQgaW50IHRpbWVvdXQ7CisgICAgaW50IEZEWEZsYWc7CisgICAgaW50IGJ5TUlJdmFsdWUsIExpbmVTcGVlZCwgTUlJQ1JiYWs7CisKKyAgICBpZiAocmhpbmVfZGVidWcgPiAwICYmIGRpZF92ZXJzaW9uKysgPT0gMCkKKwlwcmludGYgKHZlcnNpb24pOworICAgIC8qIFBlcmhhcHMgdGhpcyBzaG91bGQgYmUgcmVhZCBmcm9tIHRoZSBFRVBST00/ICovCisgICAgZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCisJbmljLT5ub2RlX2FkZHJbaV0gPSBpbmIgKGJ5UEFSMCArIGkpOworICAgIHByaW50ZiAoIklPIGFkZHJlc3MgJWhYIEV0aGVybmV0IEFkZHJlc3M6ICUhXG4iLCBpb2FkZHIsIG5pYy0+bm9kZV9hZGRyKTsKKworICAgIC8qIHJlc3RhcnQgTUlJIGF1dG8tbmVnb3RpYXRpb24gKi8KKyAgICBXcml0ZU1JSSAoMCwgOSwgMSwgaW9hZGRyKTsKKyAgICBwcmludGYgKCJBbmFseXppbmcgTWVkaWEgdHlwZSx0aGlzIHdpbGwgdGFrZSBzZXZlcmFsIHNlY29uZHMuLi4uLi4uLiIpOworICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisgICAgeworCS8qIG5lZWQgdG8gd2FpdCAxIG1pbGxpc2Vjb25kIC0gd2Ugd2lsbCByb3VuZCBpdCB1cCB0byA1MC0xMDBtcyAqLworCXRpbWVvdXQgPSBjdXJydGlja3MoKSArIDI7CisJZm9yICh0aW1lb3V0ID0gY3VycnRpY2tzKCkgKyAyOyBjdXJydGlja3MoKSA8IHRpbWVvdXQ7KQorCSAgICAvKiBub3RoaW5nICovOworCWlmIChSZWFkTUlJICgxLCBpb2FkZHIpICYgMHgwMDIwKQorCSAgICBicmVhazsKKyAgICB9CisgICAgcHJpbnRmICgiT0tcbiIpOworCisjaWYJMAorCS8qIEpKTSA6IGZvciBEZWJ1ZyAqLworCXByaW50ZigiTUlJIDogQWRkcmVzcyAlaGhYICIsaW5iKGlvYWRkcisweDZjKSk7CisJeworCSB1bnNpZ25lZCBjaGFyIHN0MSxzdDIsYWR2MSxhZHYyLGwxLGwyOworCQorCSBzdDE9UmVhZE1JSSgxLGlvYWRkcik+Pjg7CisJIHN0Mj1SZWFkTUlJKDEsaW9hZGRyKSYweEZGOworCSBhZHYxPVJlYWRNSUkoNCxpb2FkZHIpPj44OworCSBhZHYyPVJlYWRNSUkoNCxpb2FkZHIpJjB4RkY7CisJIGwxPVJlYWRNSUkoNSxpb2FkZHIpPj44OworCSBsMj1SZWFkTUlJKDUsaW9hZGRyKSYweEZGOworCSBwcmludGYoIiBzdGF0dXMgMHglaGhYJWhoWCwgYWR2ZXJ0aXNpbmcgMHglaGhYJWhoWCwgbGluayAweCVoaFglaGhYXG4iLCBzdDEsc3QyLGFkdjEsYWR2MixsMSxsMik7CisJfQorI2VuZGlmCisKKyAgICAvKiBxdWVyeSBNSUkgdG8ga25vdyBMaW5lU3BlZWQsZHVwbGV4IG1vZGUgKi8KKyAgICBieU1JSXZhbHVlID0gaW5iIChpb2FkZHIgKyAweDZkKTsKKyAgICBMaW5lU3BlZWQgPSBieU1JSXZhbHVlICYgTUlJU1JfU1BFRUQ7CisgICAgaWYgKExpbmVTcGVlZCAhPSAwKQkJCQkJCS8vSkpNCisgICAgeworCXByaW50ZiAoIkxpbmVzcGVlZD0xME1icyIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCXByaW50ZiAoIkxpbmVzcGVlZD0xMDBNYnMiKTsKKyAgICB9CisJCisgICAgRkRYRmxhZyA9IFF1ZXJ5QXV0byAoaW9hZGRyKTsKKyAgICBpZiAoRkRYRmxhZyA9PSAxKQorICAgIHsKKwlwcmludGYgKCIgRnVsbGR1cGxleFxuIik7CisJb3V0dyAoQ1JfRkRYLCBieUNSMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcHJpbnRmICgiIEhhbGZkdXBsZXhcbiIpOworICAgIH0KKworCisgICAgLyogc2V0IE1JSSAxMCBGVUxMIE9OICovCisgICAgV3JpdGVNSUkgKDE3LCAxLCAxLCBpb2FkZHIpOworCisgICAgLyogdHVybiBvbiBNSUkgbGluayBjaGFuZ2UgKi8KKyAgICBNSUlDUmJhayA9IGluYiAoYnlNSUlDUik7CisgICAgb3V0YiAoTUlJQ1JiYWsgJiAweDdGLCBieU1JSUNSKTsKKyAgICBNSUlEZWxheSAoKTsKKyAgICBvdXRiICgweDQxLCBieU1JSUFEKTsKKyAgICBNSUlEZWxheSAoKTsKKworICAgIC8qIHdoaWxlKChpbmIoYnlNSUlBRCkmMHgyMCk9PTApIDsgKi8KKyAgICBvdXRiIChNSUlDUmJhayB8IDB4ODAsIGJ5TUlJQ1IpOworCisgICAgbmljLT5wcml2X2RhdGEgPSAmcmhpbmU7CisgICAgdHAgPSAmcmhpbmU7CisgICAgdHAtPmNoaXBfaWQgPSBjaGlwX2lkOworICAgIHRwLT5pb2FkZHIgPSBpb2FkZHI7CisgICAgdHAtPnBoeXNbMF0gPSAtMTsKKworICAgIC8qIFRoZSBsb3dlciBmb3VyIGJpdHMgYXJlIHRoZSBtZWRpYSB0eXBlLiAqLworICAgIGlmIChvcHRpb25zID4gMCkKKyAgICB7CisJdHAtPmZ1bGxfZHVwbGV4ID0gKG9wdGlvbnMgJiAxNikgPyAxIDogMDsKKwl0cC0+ZGVmYXVsdF9wb3J0ID0gb3B0aW9ucyAmIDE1OworCWlmICh0cC0+ZGVmYXVsdF9wb3J0KQorCSAgICB0cC0+bWVkaWFsb2NrID0gMTsKKyAgICB9CisgICAgcmV0dXJuIG5pYzsKK30KKworc3RhdGljIHZvaWQKK3JoaW5lX2Rpc2FibGUgKHN0cnVjdCBuaWMgKm5pYykKK3sKKyAgICBzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqdHAgPSAoc3RydWN0IHJoaW5lX3ByaXZhdGUgKikgbmljLT5wcml2X2RhdGE7CisgICAgaW50IGlvYWRkciA9IHRwLT5pb2FkZHI7CisKKyAgICBwcmludGYgKCJyaGluZSBkaXNhYmxlXG4iKTsKKyAgICAvKiBTd2l0Y2ggdG8gbG9vcGJhY2sgbW9kZSB0byBhdm9pZCBoYXJkd2FyZSByYWNlcy4gKi8KKyAgICB3cml0ZWIoMHg2MCB8IDB4MDEsIGJ5VENSKTsKKyAgICAvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IHByb2Nlc3Nlcy4gKi8KKyAgICB3cml0ZXcoQ1JfU1RPUCwgYnlDUjApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0VUSF9SRVNFVCAtIFJlc2V0IGFkYXB0ZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCityaGluZV9yZXNldCAoc3RydWN0IG5pYyAqbmljKQoreworICAgIHN0cnVjdCByaGluZV9wcml2YXRlICp0cCA9IChzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqKSBuaWMtPnByaXZfZGF0YTsKKyAgICBpbnQgaW9hZGRyID0gdHAtPmlvYWRkcjsKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgRkRYRmxhZywgQ1JiYWs7CisgICAgaW50IHJ4X3JpbmdfdG1wLCByeF9yaW5nX3RtcDE7CisgICAgaW50IHR4X3JpbmdfdG1wLCB0eF9yaW5nX3RtcDE7CisgICAgaW50IHJ4X2J1ZnNfdG1wLCByeF9idWZzX3RtcDE7CisgICAgaW50IHR4X2J1ZnNfdG1wLCB0eF9idWZzX3RtcDE7CisKKyNpZmRlZglVU0VfTE9XTUVNX0JVRkZFUgorI2RlZmluZSBidWYxICgweDEwMDAwIC0gKFJYX1JJTkdfU0laRSAqIFBLVF9CVUZfU1ogKyAzMikpCisjZGVmaW5lIGJ1ZjIgKGJ1ZjEgLSAoUlhfUklOR19TSVpFICogUEtUX0JVRl9TWiArIDMyKSkKKyNkZWZpbmUgZGVzYzEgKGJ1ZjIgLSAoVFhfUklOR19TSVpFICogc2l6ZW9mIChzdHJ1Y3QgcmhpbmVfdHhfZGVzYykgKyAzMikpCisjZGVmaW5lIGRlc2MyIChkZXNjMSAtIChUWF9SSU5HX1NJWkUgKiBzaXplb2YgKHN0cnVjdCByaGluZV90eF9kZXNjKSArIDMyKSkKKyNlbHNlCisgICAgc3RhdGljIGNoYXIgYnVmMVtSWF9SSU5HX1NJWkUgKiBQS1RfQlVGX1NaICsgMzJdOworICAgIHN0YXRpYyBjaGFyIGJ1ZjJbUlhfUklOR19TSVpFICogUEtUX0JVRl9TWiArIDMyXTsKKyAgICBzdGF0aWMgY2hhciBkZXNjMVtUWF9SSU5HX1NJWkUgKiBzaXplb2YgKHN0cnVjdCByaGluZV90eF9kZXNjKSArIDMyXTsKKyAgICBzdGF0aWMgY2hhciBkZXNjMltUWF9SSU5HX1NJWkUgKiBzaXplb2YgKHN0cnVjdCByaGluZV90eF9kZXNjKSArIDMyXTsKKyNlbmRpZgorCisgICAgLyogcHJpbnRmICgicmhpbmVfcmVzZXRcbiIpOyAqLworICAgIC8qIFNvZnQgcmVzZXQgdGhlIGNoaXAuICovCisgICAgLypvdXRiKENtZFJlc2V0LCBpb2FkZHIgKyBDaGlwQ21kKTsgKi8KKworICAgIHR4X2J1ZnNfdG1wID0gKGludCkgYnVmMTsKKyAgICB0eF9yaW5nX3RtcCA9IChpbnQpIGRlc2MxOworICAgIHJ4X2J1ZnNfdG1wID0gKGludCkgYnVmMjsKKyAgICByeF9yaW5nX3RtcCA9IChpbnQpIGRlc2MyOworCisgICAgLyogdHVuZSBSRCBURCAzMiBieXRlIGFsaWdubWVudCAqLworICAgIHJ4X3JpbmdfdG1wMSA9IChpbnQpIHZpcnRfdG9fYnVzICgoY2hhciAqKSByeF9yaW5nX3RtcCk7CisgICAgaiA9IChyeF9yaW5nX3RtcDEgKyAzMikgJiAofjB4MWYpOworICAgIC8qIHByaW50ZiAoInR4cmluZ1slZF0iLCBqKTsgKi8KKyAgICB0cC0+cnhfcmluZyA9IChzdHJ1Y3QgcmhpbmVfcnhfZGVzYyAqKSBidXNfdG9fdmlydCAoaik7CisKKyAgICB0eF9yaW5nX3RtcDEgPSAoaW50KSB2aXJ0X3RvX2J1cyAoKGNoYXIgKikgdHhfcmluZ190bXApOworICAgIGogPSAodHhfcmluZ190bXAxICsgMzIpICYgKH4weDFmKTsKKyAgICB0cC0+dHhfcmluZyA9IChzdHJ1Y3QgcmhpbmVfdHhfZGVzYyAqKSBidXNfdG9fdmlydCAoaik7CisgICAgLyogcHJpbnRmICgicnhyaW5nWyVYXSIsIGopOyAqLworCisKKyAgICB0eF9idWZzX3RtcDEgPSAoaW50KSB2aXJ0X3RvX2J1cyAoKGNoYXIgKikgdHhfYnVmc190bXApOworICAgIGogPSAoaW50KSAodHhfYnVmc190bXAxICsgMzIpICYgKH4weDFmKTsKKyAgICB0eF9idWZzX3RtcCA9IChpbnQpIGJ1c190b192aXJ0IChqKTsKKyAgICAvKiBwcmludGYgKCJ0eGJbJVhdIiwgaik7ICovCisKKyAgICByeF9idWZzX3RtcDEgPSAoaW50KSB2aXJ0X3RvX2J1cyAoKGNoYXIgKikgcnhfYnVmc190bXApOworICAgIGogPSAoaW50KSAocnhfYnVmc190bXAxICsgMzIpICYgKH4weDFmKTsKKyAgICByeF9idWZzX3RtcCA9IChpbnQpIGJ1c190b192aXJ0IChqKTsKKyAgICAvKiBwcmludGYgKCJyeGJbJVhdWyVYXSIsIHJ4X2J1ZnNfdG1wMSwgaik7ICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspCisgICAgeworCXRwLT5yeF9idWZmc1tpXSA9IChjaGFyICopIHJ4X2J1ZnNfdG1wOworCS8qIHByaW50ZigiclslWF0iLHRwLT5yeF9idWZmc1tpXSk7ICovCisJcnhfYnVmc190bXAgKz0gMTUzNjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspCisgICAgeworCXRwLT50eF9idWZmc1tpXSA9IChjaGFyICopIHR4X2J1ZnNfdG1wOworCS8qIHByaW50ZigidFslWF0iLHRwLT50eF9idWZmc1tpXSk7ICAqLworCXR4X2J1ZnNfdG1wICs9IDE1MzY7CisgICAgfQorCisgICAgLyogc29mdHdhcmUgcmVzZXQgKi8KKyAgICBvdXRiIChDUjFfU0ZSU1QsIGJ5Q1IxKTsKKyAgICBNSUlEZWxheSAoKTsKKworICAgIC8qIHByaW50ZiAoImluaXQgcmluZyIpOyAqLworICAgIHJoaW5lX2luaXRfcmluZyAobmljKTsKKyAgICAvKndyaXRlIFREIFJEIERlc2NyaXB0b3IgdG8gTUFDICovCisgICAgb3V0bCAodmlydF90b19idXMgKHRwLT5yeF9yaW5nKSwgZHdDdXJyZW50UnhEZXNjQWRkcik7CisgICAgb3V0bCAodmlydF90b19idXMgKHRwLT50eF9yaW5nKSwgZHdDdXJyZW50VHhEZXNjQWRkcik7CisKKyAgICAvKiBjbG9zZSBJTVIgKi8KKyAgICBvdXR3ICgweDAwMDAsIGJ5SU1SMCk7CisKKyAgICAvKiBzZXQgVENSIFJDUiB0aHJlc2hvbGQgKi8KKyAgICBvdXRiICgweDA2LCBieUJDUjApOworICAgIG91dGIgKDB4MDAsIGJ5QkNSMSk7CisgICAgb3V0YiAoMHgyYywgYnlSQ1IpOworICAgIG91dGIgKDB4NjAsIGJ5VENSKTsKKyAgICAvKiBTZXQgRnVsbGR1cGV4ICovCisgICAgRkRYRmxhZyA9IFF1ZXJ5QXV0byAoaW9hZGRyKTsKKyAgICBpZiAoRkRYRmxhZyA9PSAxKQorICAgIHsKKwlvdXRiIChDRkdEX0NGRFgsIGJ5Q0ZHRCk7CisJb3V0dyAoQ1JfRkRYLCBieUNSMCk7CisgICAgfQorCisgICAgLyogS0lDSyBOSUMgdG8gV09SSyAqLworICAgIENSYmFrID0gaW53IChieUNSMCk7CisgICAgQ1JiYWsgPSBDUmJhayAmIDB4RkZGQjsJLyogbm90IENSX1NUT1AgKi8KKyAgICBvdXR3ICgoQ1JiYWsgfCBDUl9TVFJUIHwgQ1JfVFhPTiB8IENSX1JYT04gfCBDUl9EUE9MTCksIGJ5Q1IwKTsKKworICAgIC8qc2V0IElNUiB0byB3b3JrICovCisgICAgb3V0dyAoSU1SU2hhZG93LCBieUlNUjApOworfQorCitzdGF0aWMgaW50CityaGluZV9wb2xsIChzdHJ1Y3QgbmljICpuaWMpCit7CisgICAgc3RydWN0IHJoaW5lX3ByaXZhdGUgKnRwID0gKHN0cnVjdCByaGluZV9wcml2YXRlICopIG5pYy0+cHJpdl9kYXRhOworICAgIGludCByeHN0YXR1cywgZ29vZCA9IDA7OworCisgICAgaWYgKHRwLT5yeF9yaW5nW3RwLT5jdXJfcnhdLnJ4X3N0YXR1cy5iaXRzLm93bl9iaXQgPT0gMCkKKyAgICB7CisJcnhzdGF0dXMgPSB0cC0+cnhfcmluZ1t0cC0+Y3VyX3J4XS5yeF9zdGF0dXMubHc7CisJaWYgKChyeHN0YXR1cyAmIDB4MDMwMCkgIT0gMHgwMzAwKQorCXsKKwkgICAgcHJpbnRmKCJyaGluZV9wb2xsOiBiYWQgc3RhdHVzXG4iKTsKKwl9CisJZWxzZSBpZiAocnhzdGF0dXMgJiAoUlNSX0FCTk9STUFMKSkKKwl7CisJICAgIHByaW50ZiAoInJ4ZXJyWyVYXVxuIiwgcnhzdGF0dXMpOworCX0KKwllbHNlCisJICAgIGdvb2QgPSAxOworCisJaWYgKGdvb2QpCisJeworCSAgICBuaWMtPnBhY2tldGxlbiA9IHRwLT5yeF9yaW5nW3RwLT5jdXJfcnhdLnJ4X3N0YXR1cy5iaXRzLmZyYW1lX2xlbmd0aDsKKwkgICAgbWVtY3B5IChuaWMtPnBhY2tldCwgdHAtPnJ4X2J1ZmZzW3RwLT5jdXJfcnhdLCBuaWMtPnBhY2tldGxlbik7CisJICAgIC8qIHByaW50ZiAoIlBhY2tldCBSWGVkXG4iKTsgKi8KKwl9CisJdHAtPnJ4X3JpbmdbdHAtPmN1cl9yeF0ucnhfc3RhdHVzLmJpdHMub3duX2JpdCA9IDE7CisJdHAtPmN1cl9yeCsrOworCXRwLT5jdXJfcnggPSB0cC0+Y3VyX3J4ICUgUlhfUklOR19TSVpFOworICAgIH0KKyAgICByZXR1cm4gZ29vZDsKK30KKworc3RhdGljIHZvaWQKK3JoaW5lX3RyYW5zbWl0IChzdHJ1Y3QgbmljICpuaWMsCisJCWNvbnN0IGNoYXIgKmQsIHVuc2lnbmVkIGludCB0LCB1bnNpZ25lZCBpbnQgcywgY29uc3QgY2hhciAqcCkKK3sKKyAgICBzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqdHAgPSAoc3RydWN0IHJoaW5lX3ByaXZhdGUgKikgbmljLT5wcml2X2RhdGE7CisgICAgaW50IGlvYWRkciA9IHRwLT5pb2FkZHI7CisgICAgaW50IGVudHJ5OworICAgIHVuc2lnbmVkIGNoYXIgQ1IxYmFrOworCisgICAgLypwcmludGYgKCJyaGluZV90cmFuc21pdFxuIik7ICovCisgICAgLyogc2V0dXAgZXRoZXJuZXQgaGVhZGVyICovCisKKworICAgIC8qIENhbGN1bGF0ZSB0aGUgbmV4dCBUeCBkZXNjcmlwdG9yIGVudHJ5LiAqLworICAgIGVudHJ5ID0gdHAtPmN1cl90eCAlIFRYX1JJTkdfU0laRTsKKworICAgIG1lbWNweSAodHAtPnR4X2J1ZmZzW2VudHJ5XSwgZCwgRVRIX0FMRU4pOwkvKiBkc3QgKi8KKyAgICBtZW1jcHkgKHRwLT50eF9idWZmc1tlbnRyeV0gKyBFVEhfQUxFTiwgbmljLT5ub2RlX2FkZHIsIEVUSF9BTEVOKTsJLyogc3JjICovCisgICAgKigoY2hhciAqKSB0cC0+dHhfYnVmZnNbZW50cnldICsgMTIpID0gdCA+PiA4OwkvKiB0eXBlICovCisgICAgKigoY2hhciAqKSB0cC0+dHhfYnVmZnNbZW50cnldICsgMTMpID0gdDsKKyAgICBtZW1jcHkgKHRwLT50eF9idWZmc1tlbnRyeV0gKyBFVEhfSExFTiwgcCwgcyk7CisgICAgcyArPSBFVEhfSExFTjsKKyAgICB3aGlsZSAocyA8IEVUSF9aTEVOKQorCSooKGNoYXIgKikgdHAtPnR4X2J1ZmZzW2VudHJ5XSArIEVUSF9ITEVOICsgKHMrKykpID0gMDsKKworICAgIHRwLT50eF9yaW5nW2VudHJ5XS50eF9jdHJsLmJpdHMudHhfYnVmX3NpemUgPSBFVEhfSExFTiArIHM7CisKKyAgICB0cC0+dHhfcmluZ1tlbnRyeV0udHhfc3RhdHVzLmJpdHMub3duX2JpdCA9IDE7CisKKworICAgIENSMWJhayA9IGluYiAoYnlDUjEpOworCisgICAgQ1IxYmFrID0gQ1IxYmFrIHwgQ1IxX1RETUQxOworICAgIC8qcHJpbnRmKCJ0ZHN3PVslWF0iLHRwLT50eF9yaW5nW2VudHJ5XS50eF9zdGF0dXMubHcpOyAqLworICAgIC8qcHJpbnRmKCJ0ZGN3PVslWF0iLHRwLT50eF9yaW5nW2VudHJ5XS50eF9jdHJsLmx3KTsgKi8KKyAgICAvKnByaW50ZigidGRidWYxPVslWF0iLHRwLT50eF9yaW5nW2VudHJ5XS5idWZfYWRkcl8xKTsgKi8KKyAgICAvKnByaW50ZigidGRidWYyPVslWF0iLHRwLT50eF9yaW5nW2VudHJ5XS5idWZfYWRkcl8yKTsgKi8KKyAgICAvKnByaW50ZigidGQxPVslWF0iLGlubChkd0N1cnJlbnRURFNFMCkpOyAqLworICAgIC8qcHJpbnRmKCJ0ZDI9WyVYXSIsaW5sKGR3Q3VycmVudFREU0UxKSk7ICovCisgICAgLypwcmludGYoInRkMz1bJVhdIixpbmwoZHdDdXJyZW50VERTRTIpKTsgKi8KKyAgICAvKnByaW50ZigidGQ0PVslWF0iLGlubChkd0N1cnJlbnRURFNFMykpOyAqLworCisgICAgb3V0YiAoQ1IxYmFrLCBieUNSMSk7CisgICAgdHAtPmN1cl90eCsrOworCisgICAgLypvdXR3KElNUlNoYWRvdyxieUlNUjApOyAqLworICAgIC8qZGV2X2tmcmVlX3NrYih0cC0+dHhfc2tidWZmW2VudHJ5XSwgRlJFRV9XUklURSk7ICovCisgICAgLyp0cC0+dHhfc2tidWZmW2VudHJ5XSA9IDA7ICovCit9CisKKy8qIEVPRiB2aWEtcmhpbmUuYyAqLwpkaWZmIC0tZ2l0IGEvbmV0Ym9vdC93ODljODQwLmMgYi9uZXRib290L3c4OWM4NDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzI2OGM2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0Ym9vdC93ODljODQwLmMKQEAgLTAsMCArMSw5MzQgQEAKKy8qCisgKiBFdGhlcmJvb3QgLSAgQk9PVFAvVEZUUCBCb290c3RyYXAgUHJvZ3JhbQorICoKKyAqIHc4OWM4NDAuYyAtLSBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgd2luYm9uZC04NDAgZHJpdmVyIGZvciBldGhlcmJvb3QuCisgKgorICovCisKKy8qCisgKiBBZGFwdGVkIGJ5IElnb3IgVi4gS292YWxlbmtvCisgKiAgLS0gPGdhcnJpc29uQG1haWwucnU+CisgKiAgIE9SCisgKiAgLS0gPGlrb0BjcmVjLm1pcHQucnU+CisgKiBJbml0aWFsIGFkYXB0YWlvbiBzdGFnZSwgaW5jbHVkaW5nIHRlc3RpbmcsIGNvbXBsZXRlZCAyMyBBdWd1c3QgMjAwMC4KKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyoKKyAqICAgICAgICAgICAgICBkYXRlICAgICAgIHZlcnNpb24gIGJ5ICAgd2hhdAorICogIFdyaXR0ZW46ICAgIEF1ZyAyMCAyMDAwICBWMC4xMCAgaWtvICBJbml0aWFsIHJldmlzaW9uLgorICogY2hhbmdlczogICAgIEF1ZyAyMiAyMDAwICBWMC45MCAgaWtvICBXb3JrcyEKKyAqICAgICAgICAgICAgICBBdWcgMjMgMjAwMCAgVjAuOTEgIGlrbyAgQ2xlYW51cCwgcG9zdGVkIHRvIGV0aGVyYm9vdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWludGFpbmVyLgorICogICAgICAgICAgICAgIEF1ZyAyNiAyMDAwICBWMC45MiAgaWtvICBGaXhlZCBSeCByaW5nIGhhbmRsaW5nLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXJzdCBMaW51eCBLZXJuZWwgKFRNKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsbHkgbG9hZGVkIHVzaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZHJpdmVyLgorICogICAgICAgICAgICAgIEphbiAwNyAyMDAxICBWMC45MyAgaWtvICBUcmFuc21pdHRlciB0aW1lb3V0cyBhcmUgaGFuZGxlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyB0aW1lcjIgcm91dGluZXMuIFByb3Bvc2VkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IEtlbiBZYXAgdG8gZWxpbWluYXRlIENQVSBzcGVlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5LgorICoKKyAqIFRoaXMgaXMgdGhlIGV0aGVyYm9vdCBkcml2ZXIgZm9yIGNhcmRzIGJhc2VkIG9uIFdpbmJvbmQgVzg5Yzg0MEYgY2hpcC4KKyAqCisgKiBJdCB3YXMgd3JpdHRlbiBmcm9tIHNrZWxldG9uIHNvdXJjZSwgd2l0aCBEb25hbGQgQmVja2VyJ3Mgd2luYm9uZC04NDAuYworICoga2VybmVsIGRyaXZlciBhcyBhIGd1aWRlbGluZS4gTW9zdGx5IHRoZSB3ODljODQwIHJlbGF0ZWQgZGVmaW5pdGlvbnMKKyAqIGFuZCB0aGUgbG93ZXIgbGV2ZWwgcm91dGluZXMgaGF2ZSBiZWVuIGN1dC1hbmQtcGFzdGVkIGludG8gdGhpcyBzb3VyY2UuCisgKgorICogRnJhbmtseSBzcGVha2luZywgYWJvdXQgOTAlIG9mIHRoZSBjb2RlIHdhcyBvYnRhaW5lZCB1c2luZyBjdXQnbidwYXN0ZQorICogc2VxdWVuY2UgOikgd2hpbGUgdGhlIHJlbWFpbmRlciBhcHBlYXJlZCB3aGlsZSBicmFpbnN0b3JtaW5nCisgKiBMaW51eCBLZXJuZWwgMi40LjAtdGVzdFggc291cmNlIGNvZGUuIFRoYW5rcywgRG9uYWxkIGFuZCBMaW51cyEKKyAqCisgKiBUaGVyZSB3YXMgYSBkZW1hbmQgZm9yIHVzaW5nIHRoaXMgY2FyZCBpbiBhIHJhdGhlciBsYXJnZQorICogcmVtb3RlIGJvb3QgZW52aXJvbm1lbnQgYXQgTVNLUCBPVlRJIExhYiBvZgorICogTW9zY293IEluc3RpdHV0ZSBmb3IgUGh5c2ljcyBhbmQgVGVjaG5vbG9neSAoTUlQVCkgLS0gaHR0cDovL3d3dy5taXB0LnJ1LworICogc28geW91IG1heSBjb3VudCB0aGF0IGZvciBtb3RpdmF0aW9uLgorICoKKyAqLworCisvKgorICogSWYgeW91IHdhbnQgdG8gc2VlIGRlYnVnZ2luZyBvdXRwdXQgdGhlbiBkZWZpbmUgVzg5Qzg0MF9ERUJVRworICovCisKKy8qCisjZGVmaW5lIFc4OUM4NDBfREVCVUcKKyovCisKKy8qCisgKiBLZWVwIHVzaW5nIElPX09QUyBmb3IgRXRoZXJib290IGRyaXZlciEKKyAqLworI2RlZmluZSBVU0VfSU9fT1BTCisKKyNpbmNsdWRlICJldGhlcmJvb3QuaCIKKyNpbmNsdWRlICJuaWMuaCIKKyNpbmNsdWRlICJwY2kuaCIKKyNpbmNsdWRlICJjYXJkcy5oIgorI2luY2x1ZGUgInRpbWVyLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICp3ODljODQwX3ZlcnNpb24gPSAiZGl2ZXIgVmVyc2lvbiAwLjkyIC0gQXVndXN0IDI3LCAyMDAwIjsKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICB1ODsKK3R5cGVkZWYgICBzaWduZWQgY2hhciAgczg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHUxNjsKK3R5cGVkZWYgICBzaWduZWQgc2hvcnQgczE2OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICB1MzI7Cit0eXBlZGVmICAgc2lnbmVkIGludCAgIHMzMjsKKworLyogTGludXggc3VwcG9ydCBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgdmlydF90b19idXMoeCkgKCh1bnNpZ25lZCBsb25nKXgpCisjZGVmaW5lIGJ1c190b192aXJ0KHgpICgodm9pZCAqKXgpCisKKyNkZWZpbmUgdmlydF90b19sZTMyZGVzYyhhZGRyKSAgdmlydF90b19idXMoYWRkcikKKyNkZWZpbmUgbGUzMmRlc2NfdG9fdmlydChhZGRyKSAgYnVzX3RvX3ZpcnQoYWRkcikKKworLyoKKyNkZWZpbmUgY3B1X3RvX2xlMzIodmFsKSAodmFsKQorI2RlZmluZSBsZTMyX3RvX2NwdSh2YWwpICh2YWwpCisqLworCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgYXJlIHNldCBhdCBjb21waWxlIHRpbWUuICovCisKKy8qIEtlZXAgdGhlIHJpbmcgc2l6ZXMgYSBwb3dlciBvZiB0d28gZm9yIGNvbXBpbGUgZWZmaWNpZW5jeS4KKyAgIFRoZSBjb21waWxlciB3aWxsIGNvbnZlcnQgPHVuc2lnbmVkPiclJzwyXk4+IGludG8gYSBiaXQgbWFzay4KKyAgIE1ha2luZyB0aGUgVHggcmluZyB0b28gbGFyZ2UgZGVjcmVhc2VzIHRoZSBlZmZlY3RpdmVuZXNzIG9mIGNoYW5uZWwKKyAgIGJvbmRpbmcgYW5kIHBhY2tldCBwcmlvcml0eS4KKyAgIFRoZXJlIGFyZSBubyBpbGwgZWZmZWN0cyBmcm9tIHRvby1sYXJnZSByZWNlaXZlIHJpbmdzLiAqLworI2RlZmluZSBUWF9SSU5HX1NJWkUgICAgMgorCisjZGVmaW5lIFJYX1JJTkdfU0laRSAgICAyCisKKy8qIFRoZSBwcmVzdW1lZCBGSUZPIHNpemUgZm9yIHdvcmtpbmcgYXJvdW5kIHRoZSBUeC1GSUZPLW92ZXJmbG93IGJ1Zy4KKyAgIFRvIGF2b2lkIG92ZXJmbG93aW5nIHdlIGRvbid0IHF1ZXVlIGFnYWluIHVudGlsIHdlIGhhdmUgcm9vbSBmb3IgYQorICAgZnVsbC1zaXplIHBhY2tldC4KKyAqLworI2RlZmluZSBUWF9GSUZPX1NJWkUgKDIwNDgpCisjZGVmaW5lIFRYX0JVR19GSUZPX0xJTUlUIChUWF9GSUZPX1NJWkUtMTUxNC0xNikKKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IHVzdWFsbHkgYXJlIG5vdCBjaGFuZ2VkLiAqLworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUICAoMTAqVElDS1NfUEVSX01TKQorCisjZGVmaW5lIFBLVF9CVUZfU1ogIDE1MzYgIC8qIFNpemUgb2YgZWFjaCB0ZW1wb3JhcnkgUnggYnVmZmVyLiovCisKKy8qCisgKiBVc2VkIHRvIGJlIHRoaXMgbXVjaCBDUFUgbG9vcHMgb24gQ2VsZXJvbkA0MDAgKD8pLAorICogbm93IHVzaW5nIHJlYWwgdGltZXIgYW5kIFRYX1RJTUVPVVQhCisgKiAjZGVmaW5lIFRYX0xPT1BfQ09VTlQgMTAwMDAwMDAKKyAqLworCisjaWYgIWRlZmluZWQoX19PUFRJTUlaRV9fKQorI3dhcm5pbmcgIFlvdSBtdXN0IGNvbXBpbGUgdGhpcyBmaWxlIHdpdGggdGhlIGNvcnJlY3Qgb3B0aW9ucyEKKyN3YXJuaW5nICBTZWUgdGhlIGxhc3QgbGluZXMgb2YgdGhlIHNvdXJjZSBmaWxlLgorI2Vycm9yIFlvdSBtdXN0IGNvbXBpbGUgdGhpcyBkcml2ZXIgd2l0aCAiLU8iLgorI2VuZGlmCisKK2VudW0gY2hpcF9jYXBhYmlsaXR5X2ZsYWdzIHtDYW5IYXZlTUlJPTEsIEhhc0Jyb2tlblR4PTJ9OworCisjaWZkZWYgVVNFX0lPX09QUworI2RlZmluZSBXODQwX0ZMQUdTIChQQ0lfVVNFU19JTyB8IFBDSV9BRERSMCB8IFBDSV9VU0VTX01BU1RFUikKKyNlbHNlCisjZGVmaW5lIFc4NDBfRkxBR1MgKFBDSV9VU0VTX01FTSB8IFBDSV9BRERSMSB8IFBDSV9VU0VTX01BU1RFUikKKyNlbmRpZgorCitzdGF0aWMgdTMyIGRyaXZlcl9mbGFncyA9IENhbkhhdmVNSUkgfCBIYXNCcm9rZW5UeDsKKworLyogVGhpcyBkcml2ZXIgd2FzIHdyaXR0ZW4gdG8gdXNlIFBDSSBtZW1vcnkgc3BhY2UsIGhvd2V2ZXIgc29tZSB4ODYgc3lzdGVtcworICAgd29yayBvbmx5IHdpdGggSS9PIHNwYWNlIGFjY2Vzc2VzLiAgUGFzcyAtRFVTRV9JT19PUFMgdG8gdXNlIFBDSSBJL08gc3BhY2UKKyAgIGFjY2Vzc2VzIGluc3RlYWQgb2YgbWVtb3J5IHNwYWNlLiAqLworCisjaWZkZWYgVVNFX0lPX09QUworI3VuZGVmIHJlYWRiCisjdW5kZWYgcmVhZHcKKyN1bmRlZiByZWFkbAorI3VuZGVmIHdyaXRlYgorI3VuZGVmIHdyaXRldworI3VuZGVmIHdyaXRlbAorI2RlZmluZSByZWFkYiBpbmIKKyNkZWZpbmUgcmVhZHcgaW53CisjZGVmaW5lIHJlYWRsIGlubAorI2RlZmluZSB3cml0ZWIgb3V0YgorI2RlZmluZSB3cml0ZXcgb3V0dworI2RlZmluZSB3cml0ZWwgb3V0bAorI2VuZGlmCisKKy8qIE9mZnNldHMgdG8gdGhlIENvbW1hbmQgYW5kIFN0YXR1cyBSZWdpc3RlcnMsICJDU1JzIi4KKyAgIFdoaWxlIHNpbWlsYXIgdG8gdGhlIFR1bGlwLCB0aGVzZSByZWdpc3RlcnMgYXJlIGxvbmd3b3JkIGFsaWduZWQuCisgICBOb3RlOiBJdCdzIG5vdCB1c2VmdWwgdG8gZGVmaW5lIHN5bWJvbGljIG5hbWVzIGZvciBldmVyeSByZWdpc3RlciBiaXQgaW4KKyAgIHRoZSBkZXZpY2UuICBUaGUgbmFtZSBjYW4gb25seSBwYXJ0aWFsbHkgZG9jdW1lbnQgdGhlIHNlbWFudGljcyBhbmQgbWFrZQorICAgdGhlIGRyaXZlciBsb25nZXIgYW5kIG1vcmUgZGlmZmljdWx0IHRvIHJlYWQuCisqLworZW51bSB3ODQwX29mZnNldHMgeworICAgIFBDSUJ1c0NmZz0weDAwLCBUeFN0YXJ0RGVtYW5kPTB4MDQsIFJ4U3RhcnREZW1hbmQ9MHgwOCwKKyAgICBSeFJpbmdQdHI9MHgwQywgVHhSaW5nUHRyPTB4MTAsCisgICAgSW50clN0YXR1cz0weDE0LCBOZXR3b3JrQ29uZmlnPTB4MTgsIEludHJFbmFibGU9MHgxQywKKyAgICBSeE1pc3NlZD0weDIwLCBFRUN0cmw9MHgyNCwgTUlJQ3RybD0weDI0LCBCb290Um9tPTB4MjgsIEdQVGltZXI9MHgyQywKKyAgICBDdXJSeERlc2NBZGRyPTB4MzAsIEN1clJ4QnVmQWRkcj0weDM0LCAgICAgICAgICAgIC8qIERlYnVnIHVzZSAqLworICAgIE11bHRpY2FzdEZpbHRlcjA9MHgzOCwgTXVsdGljYXN0RmlsdGVyMT0weDNDLCBTdGF0aW9uQWRkcj0weDQwLAorICAgIEN1clR4RGVzY0FkZHI9MHg0QywgQ3VyVHhCdWZBZGRyPTB4NTAsCit9OworCisvKiBCaXRzIGluIHRoZSBpbnRlcnJ1cHQgc3RhdHVzL2VuYWJsZSByZWdpc3RlcnMuICovCisvKiBUaGUgYml0cyBpbiB0aGUgSW50ciBTdGF0dXMvRW5hYmxlIHJlZ2lzdGVycywgbW9zdGx5IGludGVycnVwdCBzb3VyY2VzLiAqLworZW51bSBpbnRyX3N0YXR1c19iaXRzIHsKKyAgICBOb3JtYWxJbnRyPTB4MTAwMDAsIEFibm9ybWFsSW50cj0weDgwMDAsCisgICAgSW50clBDSUVycj0weDIwMDAsIFRpbWVySW50PTB4ODAwLAorICAgIEludHJSeERpZWQ9MHgxMDAsIFJ4Tm9CdWY9MHg4MCwgSW50clJ4RG9uZT0weDQwLAorICAgIFR4RklGT1VuZGVyZmxvdz0weDIwLCBSeEVyckludHI9MHgxMCwKKyAgICBUeElkbGU9MHgwNCwgSW50clR4U3RvcHBlZD0weDAyLCBJbnRyVHhEb25lPTB4MDEsCit9OworCisvKiBCaXRzIGluIHRoZSBOZXR3b3JrQ29uZmlnIHJlZ2lzdGVyLiAqLworZW51bSByeF9tb2RlX2JpdHMgeworICAgIEFjY2VwdEVycj0weDgwLCBBY2NlcHRSdW50PTB4NDAsCisgICAgQWNjZXB0QnJvYWRjYXN0PTB4MjAsIEFjY2VwdE11bHRpY2FzdD0weDEwLAorICAgIEFjY2VwdEFsbFBoeXM9MHgwOCwgQWNjZXB0TXlQaHlzPTB4MDIsCit9OworCitlbnVtIG1paV9yZWdfYml0cyB7CisgICAgTURJT19TaGlmdENsaz0weDEwMDAwLCBNRElPX0RhdGFJbj0weDgwMDAwLCBNRElPX0RhdGFPdXQ9MHgyMDAwMCwKKyAgICBNRElPX0VuYk91dHB1dD0weDQwMDAwLCBNRElPX0VuYkluID0gMHgwMDAwMCwKK307CisKKy8qIFRoZSBUdWxpcCBSeCBhbmQgVHggYnVmZmVyIGRlc2NyaXB0b3JzLiAqLworc3RydWN0IHc4NDBfcnhfZGVzYyB7CisgICAgczMyIHN0YXR1czsKKyAgICBzMzIgbGVuZ3RoOworICAgIHUzMiBidWZmZXIxOworICAgIHUzMiBuZXh0X2Rlc2M7Cit9OworCitzdHJ1Y3Qgdzg0MF90eF9kZXNjIHsKKyAgICBzMzIgc3RhdHVzOworICAgIHMzMiBsZW5ndGg7CisgICAgdTMyIGJ1ZmZlcjEsIGJ1ZmZlcjI7ICAgICAgICAgICAgICAgIC8qIFdlIHVzZSBvbmx5IGJ1ZmZlciAxLiAgKi8KK307CisKKy8qIEJpdHMgaW4gbmV0d29ya19kZXNjLnN0YXR1cyAqLworZW51bSBkZXNjX3N0YXR1c19iaXRzIHsKKyAgICBEZXNjT3duPTB4ODAwMDAwMDAsIERlc2NFbmRSaW5nPTB4MDIwMDAwMDAsIERlc2NVc2VMaW5rPTB4MDEwMDAwMDAsCisgICAgRGVzY1dob2xlUGt0PTB4NjAwMDAwMDAsIERlc2NTdGFydFBrdD0weDIwMDAwMDAwLCBEZXNjRW5kUGt0PTB4NDAwMDAwMDAsCisgICAgRGVzY0ludHI9MHg4MDAwMDAwMCwKK307CisjZGVmaW5lIFBSSVZfQUxJR04gICAgMTUgICAgIC8qIFJlcXVpcmVkIGFsaWdubWVudCBtYXNrICovCisjZGVmaW5lIFBSSVZfQUxJR05fQllURVMgMzIKKworc3RhdGljIHN0cnVjdCB3aW5ib25kX3ByaXZhdGUKK3sKKyAgICAvKiBEZXNjcmlwdG9yIHJpbmdzIGZpcnN0IGZvciBhbGlnbm1lbnQuICovCisgICAgc3RydWN0IHc4NDBfcnhfZGVzYyByeF9yaW5nW1JYX1JJTkdfU0laRV07CisgICAgc3RydWN0IHc4NDBfdHhfZGVzYyB0eF9yaW5nW1RYX1JJTkdfU0laRV07CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5leHRfbW9kdWxlOyAgICAgICAgLyogTGluayBmb3IgZGV2aWNlcyBvZiB0aGlzIHR5cGUuICovCisgICAgdm9pZCAqcHJpdl9hZGRyOyAgICAgICAgICAgICAgICAgICAgLyogVW5hbGlnbmVkIGFkZHJlc3MgZm9yIGtmcmVlICovCisgICAgY29uc3QgY2hhciAqcHJvZHVjdF9uYW1lOworICAgIC8qIEZyZXF1ZW50bHkgdXNlZCB2YWx1ZXM6IGtlZXAgc29tZSBhZGphY2VudCBmb3IgY2FjaGUgZWZmZWN0LiAqLworICAgIGludCBjaGlwX2lkLCBkcnZfZmxhZ3M7CisgICAgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CisgICAgaW50IGNzcjY7CisgICAgc3RydWN0IHc4NDBfcnhfZGVzYyAqcnhfaGVhZF9kZXNjOworICAgIHVuc2lnbmVkIGludCBjdXJfcngsIGRpcnR5X3J4OyAgICAgICAgLyogUHJvZHVjZXIvY29uc3VtZXIgcmluZyBpbmRpY2VzICovCisgICAgdW5zaWduZWQgaW50IHJ4X2J1Zl9zejsgICAgICAgICAgICAgICAgLyogQmFzZWQgb24gTVRVK3NsYWNrLiAqLworICAgIHVuc2lnbmVkIGludCBjdXJfdHgsIGRpcnR5X3R4OworICAgIGludCB0eF9xX2J5dGVzOworICAgIHVuc2lnbmVkIGludCB0eF9mdWxsOjE7ICAgICAgICAgICAgICAgIC8qIFRoZSBUeCBxdWV1ZSBpcyBmdWxsLiAqLworICAgIC8qIFRoZXNlIHZhbHVlcyBhcmUga2VlcCB0cmFjayBvZiB0aGUgdHJhbnNjZWl2ZXIvbWVkaWEgaW4gdXNlLiAqLworICAgIHVuc2lnbmVkIGludCBmdWxsX2R1cGxleDoxOyAgICAgICAgICAgIC8qIEZ1bGwtZHVwbGV4IG9wZXJhdGlvbiByZXF1ZXN0ZWQuICovCisgICAgdW5zaWduZWQgaW50IGR1cGxleF9sb2NrOjE7CisgICAgdW5zaWduZWQgaW50IG1lZGlhbG9jazoxOyAgICAgICAgICAgIC8qIERvIG5vdCBzZW5zZSBtZWRpYS4gKi8KKyAgICB1bnNpZ25lZCBpbnQgZGVmYXVsdF9wb3J0OjQ7ICAgICAgICAvKiBMYXN0IGRldi0+aWZfcG9ydCB2YWx1ZS4gKi8KKyAgICAvKiBNSUkgdHJhbnNjZWl2ZXIgc2VjdGlvbi4gKi8KKyAgICBpbnQgbWlpX2NudDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBNSUkgZGV2aWNlIGFkZHJlc3Nlcy4gKi8KKyAgICB1MTYgYWR2ZXJ0aXNpbmc7ICAgICAgICAgICAgICAgICAgICAvKiBOV2F5IG1lZGlhIGFkdmVydGlzZW1lbnQgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHBoeXNbMl07ICAgICAgICAgICAgICAgIC8qIE1JSSBkZXZpY2UgYWRkcmVzc2VzLiAqLworfSB3ODQwcHJpdmF0ZSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoUFJJVl9BTElHTl9CWVRFUykpKTsKKworLyogTklDIHNwZWNpZmljIHN0YXRpYyB2YXJpYWJsZXMgZ28gaGVyZSAqLworCitzdGF0aWMgaW50IGlvYWRkcjsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBlZXByb20gWzB4NDBdOworCisjaWZkZWYgICAgVVNFX0xPV01FTV9CVUZGRVIKKyNkZWZpbmUgcnhfcGFja2V0ICgoY2hhciAqKTB4MTAwMDAgLSBQS1RfQlVGX1NaICogUlhfUklOR19TSVpFKQorI2RlZmluZSB0eF9wYWNrZXQgKChjaGFyICopMHgxMDAwMCAtIFBLVF9CVUZfU1ogKiBSWF9SSU5HX1NJWkUgLSBQS1RfQlVGX1NaICogVFhfUklOR19TSVpFKQorI2Vsc2UKK3N0YXRpYyBjaGFyICAgICAgICByeF9wYWNrZXRbUEtUX0JVRl9TWiAqIFJYX1JJTkdfU0laRV07CitzdGF0aWMgY2hhciAgICAgICAgdHhfcGFja2V0W1BLVF9CVUZfU1ogKiBUWF9SSU5HX1NJWkVdOworI2VuZGlmCisKK3N0YXRpYyBpbnQgIGVlcHJvbV9yZWFkKGxvbmcgaW9hZGRyLCBpbnQgbG9jYXRpb24pOworc3RhdGljIGludCAgbWRpb19yZWFkKGludCBiYXNlX2FkZHJlc3MsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbik7CitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKGludCBiYXNlX2FkZHJlc3MsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKTsKKworc3RhdGljIHZvaWQgY2hlY2tfZHVwbGV4KHZvaWQpOworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUodm9pZCk7CitzdGF0aWMgdm9pZCBpbml0X3Jpbmcodm9pZCk7CisKKy8qCitzdGF0aWMgdm9pZCB3YWl0X2xvbmdfdGltZSh2b2lkKQoreworICAgIHByaW50ZigiUGF1c2VkIC0gcGxlYXNlIHJlYWQgb3V0cHV0IGFib3ZlIHRoaXMgbGluZVxuIik7CisgICAgc2xlZXAoMyk7Cit9CisqLworCisjaWYgZGVmaW5lZCBXODlDODQwX0RFQlVHCitzdGF0aWMgdm9pZCBkZWNvZGVfaW50ZXJydXB0KHUzMiBpbnRyX3N0YXR1cykKK3sKKyAgICBwcmludGYoIkludGVycnVwdCBzdGF0dXM6ICIpOworCisjZGVmaW5lIFRSQUNFX0lOVFIoX2ludHJfKSBcCisgICAgaWYgKGludHJfc3RhdHVzICYgKF9pbnRyXykpIHsgcHJpbnRmICgiICIgI19pbnRyXyk7IH0KKworICAgIFRSQUNFX0lOVFIoTm9ybWFsSW50cik7CisgICAgVFJBQ0VfSU5UUihBYm5vcm1hbEludHIpOworICAgIFRSQUNFX0lOVFIoSW50clBDSUVycik7CisgICAgVFJBQ0VfSU5UUihUaW1lckludCk7CisgICAgVFJBQ0VfSU5UUihJbnRyUnhEaWVkKTsKKyAgICBUUkFDRV9JTlRSKFJ4Tm9CdWYpOworICAgIFRSQUNFX0lOVFIoSW50clJ4RG9uZSk7CisgICAgVFJBQ0VfSU5UUihUeEZJRk9VbmRlcmZsb3cpOworICAgIFRSQUNFX0lOVFIoUnhFcnJJbnRyKTsKKyAgICBUUkFDRV9JTlRSKFR4SWRsZSk7CisgICAgVFJBQ0VfSU5UUihJbnRyVHhTdG9wcGVkKTsKKyAgICBUUkFDRV9JTlRSKEludHJUeERvbmUpOworCisgICAgcHJpbnRmKCJcbiIpOworICAgIC8qc2xlZXAoMSk7Ki8KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3c4OWM4NDBfcmVzZXQgLSBSZXNldCBhZGFwdGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCB3ODljODQwX3Jlc2V0KHN0cnVjdCBuaWMgKm5pYykKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIFJlc2V0IHRoZSBjaGlwIHRvIGVyYXNlIHByZXZpb3VzIG1pc2NvbmZpZ3VyYXRpb24uCisgICAgICAgTm8gaG9sZCB0aW1lIHJlcXVpcmVkISAqLworICAgIHdyaXRlbCgweDAwMDAwMDAxLCBpb2FkZHIgKyBQQ0lCdXNDZmcpOworCisgICAgaW5pdF9yaW5nKCk7CisKKyAgICB3cml0ZWwodmlydF90b19idXModzg0MHByaXZhdGUucnhfcmluZyksIGlvYWRkciArIFJ4UmluZ1B0cik7CisgICAgd3JpdGVsKHZpcnRfdG9fYnVzKHc4NDBwcml2YXRlLnR4X3JpbmcpLCBpb2FkZHIgKyBUeFJpbmdQdHIpOworCisgICAgZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCisgICAgICAgIHdyaXRlYihuaWMtPm5vZGVfYWRkcltpXSwgaW9hZGRyICsgU3RhdGlvbkFkZHIgKyBpKTsKKworICAgIC8qIEluaXRpYWxpemUgb3RoZXIgcmVnaXN0ZXJzLiAqLworICAgIC8qIENvbmZpZ3VyZSB0aGUgUENJIGJ1cyBidXJzdHMgYW5kIEZJRk8gdGhyZXNob2xkcy4KKyAgICAgICA0ODY6IFNldCA4IGxvbmd3b3JkIGNhY2hlIGFsaWdubWVudCwgOCBsb25nd29yZCBidXJzdC4KKyAgICAgICA1ODY6IFNldCAxNiBsb25nd29yZCBjYWNoZSBhbGlnbm1lbnQsIG5vIGJ1cnN0IGxpbWl0LgorICAgICAgIENhY2hlIGFsaWdubWVudCBiaXRzIDE1OjE0ICAgICAgICAgQnVyc3QgbGVuZ3RoIDEzOjgKKyAgICAgICAgMDAwMCAgICA8bm90IGFsbG93ZWQ+ICAgICAgICAgMDAwMCBhbGlnbiB0byBjYWNoZSAgICAwODAwIDggbG9uZ3dvcmRzCisgICAgICAgIDQwMDAgICAgOCAgbG9uZ3dvcmRzICAgICAgICAwMTAwIDEgbG9uZ3dvcmQgICAgICAgIDEwMDAgMTYgbG9uZ3dvcmRzCisgICAgICAgIDgwMDAgICAgMTYgbG9uZ3dvcmRzICAgICAgICAwMjAwIDIgbG9uZ3dvcmRzICAgIDIwMDAgMzIgbG9uZ3dvcmRzCisgICAgICAgIEMwMDAgICAgMzIgIGxvbmd3b3JkcyAgICAgICAgMDQwMCA0IGxvbmd3b3JkcworICAgICAgIFdhaXQgdGhlIHNwZWNpZmllZCA1MCBQQ0kgY3ljbGVzIGFmdGVyIGEgcmVzZXQgYnkgaW5pdGlhbGl6aW5nCisgICAgICAgVHggYW5kIFJ4IHF1ZXVlcyBhbmQgdGhlIGFkZHJlc3MgZmlsdGVyIGxpc3QuICovCisKKyAgICB3cml0ZWwoMHhFMDEwLCBpb2FkZHIgKyBQQ0lCdXNDZmcpOworCisgICAgd3JpdGVsKDAsIGlvYWRkciArIFJ4U3RhcnREZW1hbmQpOworICAgIHc4NDBwcml2YXRlLmNzcjYgPSAweDIwMDIyMDAyOworICAgIGNoZWNrX2R1cGxleCgpOworICAgIHNldF9yeF9tb2RlKCk7CisKKyAgICAvKiBDbGVhciBhbmQgRW5hYmxlIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisgICAgd3JpdGVsKDB4MUEwRjUsIGlvYWRkciArIEludHJTdGF0dXMpOworICAgIHdyaXRlbCgweDFBMEY1LCBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKKworI2lmIGRlZmluZWQoVzg5Qzg0MF9ERUJVRykKKyAgICBwcmludGYoIndpbmJvbmQtODQwIDogRG9uZSByZXNldC5cbiIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9pbnRyKHUzMiBpbnRyX3N0YXQpCit7CisgICAgaWYgKChpbnRyX3N0YXQgJiAoTm9ybWFsSW50cnxBYm5vcm1hbEludHIpKSA9PSAwKSB7CisgICAgICAgIC8qIHdlIGFyZSBwb2xsaW5nLCBkbyBub3QgcmV0dXJuIG5vdyAqLworICAgICAgICAvKnJldHVybiAwOyovCisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogQWNrbm93bGVkZ2UgYWxsIG9mIHRoZSBjdXJyZW50IGludGVycnVwdCBzb3VyY2VzIEFTQVAuICovCisgICAgICAgIHdyaXRlbChpbnRyX3N0YXQgJiAweDAwMWZmZmYsIGlvYWRkciArIEludHJTdGF0dXMpOworICAgIH0KKworICAgIGlmIChpbnRyX3N0YXQgJiBBYm5vcm1hbEludHIpIHsKKyAgICAgICAgLyogVGhlcmUgd2FzIGFuIGFibm9ybWFsIGludGVycnVwdCAqLworICAgICAgICBwcmludGYoIlxuLT0tIEFibm9ybWFsIGludGVycnVwdC5cbiIpOworCisjaWYgZGVmaW5lZCAoVzg5Qzg0MF9ERUJVRykKKyAgICAgICAgZGVjb2RlX2ludGVycnVwdChpbnRyX3N0YXQpOworI2VuZGlmCisKKyAgICAgICAgaWYgKGludHJfc3RhdCAmIFJ4Tm9CdWYpIHsKKyAgICAgICAgICAgIC8qIFRoZXJlIHdhcyBhbiBpbnRlcnJ1cHQgKi8KKyAgICAgICAgICAgIHByaW50ZigiLT0tIDw9PiBObyByZWNlaXZlIGJ1ZmZlcnMgYXZhaWxhYmxlLlxuIik7CisgICAgICAgICAgICB3cml0ZWwoMCwgaW9hZGRyICsgUnhTdGFydERlbWFuZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgordzg5Yzg0MF9wb2xsIC0gV2FpdCBmb3IgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3ODljODQwX3BvbGwoc3RydWN0IG5pYyAqbmljKQoreworICAgIC8qIHJldHVybiB0cnVlIGlmIHRoZXJlJ3MgYW4gZXRoZXJuZXQgcGFja2V0IHJlYWR5IHRvIHJlYWQgKi8KKyAgICAvKiBuaWMtPnBhY2tldCBzaG91bGQgY29udGFpbiBkYXRhIG9uIHJldHVybiAqLworICAgIC8qIG5pYy0+cGFja2V0bGVuIHNob3VsZCBjb250YWluIGxlbmd0aCBvZiBkYXRhICovCisgICAgaW50IHBhY2tldF9yZWNlaXZlZCA9IDA7CisKKyAgICB1MzIgaW50cl9zdGF0dXMgPSByZWFkbChpb2FkZHIgKyBJbnRyU3RhdHVzKTsKKyAgICAvKiBoYW5kbGVfaW50cihpbnRyX3N0YXR1cyk7ICovIC8qIC0tIGhhbmRsZWQgbGF0ZXIgKi8KKworICAgIGRvIHsKKyAgICAgICAgLyogQ29kZSBmcm9tIG5ldGRldl9yeChkZXYpICovCisKKyAgICAgICAgaW50IGVudHJ5ID0gdzg0MHByaXZhdGUuY3VyX3J4ICUgUlhfUklOR19TSVpFOworCisgICAgICAgIHN0cnVjdCB3ODQwX3J4X2Rlc2MgKmRlc2MgPSB3ODQwcHJpdmF0ZS5yeF9oZWFkX2Rlc2M7CisgICAgICAgIHMzMiBzdGF0dXMgPSBkZXNjLT5zdGF0dXM7CisKKyAgICAgICAgaWYgKHN0YXR1cyAmIERlc2NPd24pIHsKKyAgICAgICAgICAgIC8qIERlc2NPd24gYml0IGlzIHN0aWxsIHNldCwgd2Ugc2hvdWxkIHdhaXQgZm9yIFJYIHRvIGNvbXBsZXRlICovCisgICAgICAgICAgICBwYWNrZXRfcmVjZWl2ZWQgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHN0YXR1cyAmIDB4MzgwMDgzMDApICE9IDB4MDMwMCkgeworICAgICAgICAgICAgaWYgKChzdGF0dXMgJiAweDM4MDAwMzAwKSAhPSAweDAzMDApIHsKKyAgICAgICAgICAgICAgICAvKiBJbmdvcmUgZWFybGllciBidWZmZXJzLiAqLworICAgICAgICAgICAgICAgIGlmICgoc3RhdHVzICYgMHhmZmZmKSAhPSAweDdmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJ3aW5ib25kLTg0MCA6IE92ZXJzaXplZCBFdGhlcm5ldCBmcmFtZSBzcGFubmVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSBidWZmZXJzLCBlbnRyeSAlZCBzdGF0dXMgJVggIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHc4NDBwcml2YXRlLmN1cl9yeCwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAmIDB4ODAwMCkgeworICAgICAgICAgICAgICAgIC8qIFRoZXJlIHdhcyBhIGZhdGFsIGVycm9yLiAqLworI2lmIGRlZmluZWQoVzg5Qzg0MF9ERUJVRykKKyAgICAgICAgICAgICAgICBwcmludGYoIndpbmJvbmQtODQwIDogUmVjZWl2ZSBlcnJvciwgUnggc3RhdHVzICVYIDoiLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgJiAweDA4OTApIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgUlhMRU5fRVJST1IiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAmIDB4MDA0QykgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgRlJBTUVfRVJST1IiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAmIDB4MDAwMikgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgQ1JDX0VSUk9SIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgLyogU2ltcHkgZG8gYSByZXNldCBub3cuLi4gKi8KKyAgICAgICAgICAgICAgICB3ODljODQwX3Jlc2V0KG5pYyk7CisKKyAgICAgICAgICAgICAgICBwYWNrZXRfcmVjZWl2ZWQgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogT21pdCB0aGUgZm91ciBvY3RldCBDUkMgZnJvbSB0aGUgbGVuZ3RoLiAqLworICAgICAgICAgICAgaW50IHBrdF9sZW4gPSAoKHN0YXR1cyA+PiAxNikgJiAweDdmZikgLSA0OworCisjaWYgZGVmaW5lZChXODlDODQwX0RFQlVHKQorICAgICAgICAgICAgcHJpbnRmKCIgbmV0ZGV2X3J4KCkgbm9ybWFsIFJ4IHBrdCByaW5nICVkIGxlbmd0aCAlZCBzdGF0dXMgJVhcbiIsIGVudHJ5LCBwa3RfbGVuLCBzdGF0dXMpOworI2VuZGlmCisKKyAgICAgICAgICAgIG5pYy0+cGFja2V0bGVuID0gcGt0X2xlbjsKKworICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIHBhY2tldCBpcyBsb25nIGVub3VnaCB0byBhY2NlcHQgd2l0aG91dCBjb3B5aW5nCisgICAgICAgICAgICAgICB0byBhIG1pbmltYWxseS1zaXplZCBza2J1ZmYuICovCisKKyAgICAgICAgICAgIG1lbWNweShuaWMtPnBhY2tldCwgbGUzMmRlc2NfdG9fdmlydCh3ODQwcHJpdmF0ZS5yeF9yaW5nW2VudHJ5XS5idWZmZXIxKSwgcGt0X2xlbik7CisgICAgICAgICAgICBwYWNrZXRfcmVjZWl2ZWQgPSAxOworCisgICAgICAgICAgICAvKiBSZWxlYXNlIGJ1ZmZlciB0byBOSUMgKi8KKyAgICAgICAgICAgIHc4NDBwcml2YXRlLnJ4X3JpbmdbZW50cnldLnN0YXR1cyA9IERlc2NPd247CisKKyNpZiBkZWZpbmVkKFc4OUM4NDBfREVCVUcpCisgICAgICAgICAgICAvKiBZb3Ugd2lsbCB3YW50IHRoaXMgaW5mbyBmb3IgdGhlIGluaXRpYWwgZGVidWcuICovCisgICAgICAgICAgICBwcmludGYoIiAgUnggZGF0YSAlaGhYOiVoaFg6JWhoWDolaGhYOiVoaFg6IgorICAgICAgICAgICAgICAgICAgICIlaGhYICVoaFg6JWhoWDolaGhYOiVoaFg6JWhoWDolaGhYICVoaFglaGhYICIKKyAgICAgICAgICAgICAgICAgICAiJWhoWC4laGhYLiVoaFguJWhoWC5cbiIsCisgICAgICAgICAgICAgICAgICAgbmljLT5wYWNrZXRbMF0sICBuaWMtPnBhY2tldFsxXSwgIG5pYy0+cGFja2V0WzJdLCBuaWMtPnBhY2tldFszXSwKKyAgICAgICAgICAgICAgICAgICBuaWMtPnBhY2tldFs0XSwgIG5pYy0+cGFja2V0WzVdLCAgbmljLT5wYWNrZXRbNl0sIG5pYy0+cGFja2V0WzddLAorICAgICAgICAgICAgICAgICAgIG5pYy0+cGFja2V0WzhdLCAgbmljLT5wYWNrZXRbOV0sICBuaWMtPnBhY2tldFsxMF0sCisgICAgICAgICAgICAgICAgICAgbmljLT5wYWNrZXRbMTFdLCBuaWMtPnBhY2tldFsxMl0sIG5pYy0+cGFja2V0WzEzXSwKKyAgICAgICAgICAgICAgICAgICBuaWMtPnBhY2tldFsxNF0sIG5pYy0+cGFja2V0WzE1XSwgbmljLT5wYWNrZXRbMTZdLAorICAgICAgICAgICAgICAgICAgIG5pYy0+cGFja2V0WzE3XSk7CisjZW5kaWYKKworICAgICAgICB9CisKKyAgICAgICAgZW50cnkgPSAoKyt3ODQwcHJpdmF0ZS5jdXJfcngpICUgUlhfUklOR19TSVpFOworICAgICAgICB3ODQwcHJpdmF0ZS5yeF9oZWFkX2Rlc2MgPSAmdzg0MHByaXZhdGUucnhfcmluZ1tlbnRyeV07CisgICAgfSB3aGlsZSAoMCk7CisKKyAgICBpZiAoaW50cl9zdGF0dXMgJiAoQWJub3JtYWxJbnRyIHwgVHhGSUZPVW5kZXJmbG93IHwgSW50clBDSUVyciB8VGltZXJJbnQgfCBJbnRyVHhTdG9wcGVkKSkgeworICAgICAgICBoYW5kbGVfaW50cihpbnRyX3N0YXR1cyk7CisgICAgfQorCisgICAgcmV0dXJuIHBhY2tldF9yZWNlaXZlZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCit3ODljODQwX3RyYW5zbWl0IC0gVHJhbnNtaXQgYSBmcmFtZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCB3ODljODQwX3RyYW5zbWl0KAorICAgIHN0cnVjdCBuaWMgKm5pYywKKyAgICBjb25zdCBjaGFyICpkLCAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgdW5zaWduZWQgaW50IHQsICAgICAgICAgICAgLyogVHlwZSAqLworICAgIHVuc2lnbmVkIGludCBzLCAgICAgICAgICAgIC8qIHNpemUgKi8KKyAgICBjb25zdCBjaGFyICpwKSAgICAgICAgICAgIC8qIFBhY2tldCAqLworeworICAgIC8qIHNlbmQgdGhlIHBhY2tldCB0byBkZXN0aW5hdGlvbiAqLworICAgIHVuc2lnbmVkIGVudHJ5OworICAgIGludCB0cmFuc21pdF9zdGF0dXM7CisKKyAgICAvKiBDYXV0aW9uOiB0aGUgd3JpdGUgb3JkZXIgaXMgaW1wb3J0YW50IGhlcmUsIHNldCB0aGUgZmllbGQKKyAgICAgICB3aXRoIHRoZSAib3duZXJzaGlwIiBiaXRzIGxhc3QuICovCisKKyAgICAvKiBGaWxsIGluIG91ciB0cmFuc21pdCBidWZmZXIgKi8KKyAgICBlbnRyeSA9IHc4NDBwcml2YXRlLmN1cl90eCAlIFRYX1JJTkdfU0laRTsKKworICAgIG1lbWNweSAodHhfcGFja2V0LCBkLCBFVEhfQUxFTik7ICAgIC8qIGRzdCAqLworICAgIG1lbWNweSAodHhfcGFja2V0ICsgRVRIX0FMRU4sIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTik7Lyogc3JjICovCisKKyAgICAqKChjaGFyICopIHR4X3BhY2tldCArIDEyKSA9IHQgPj4gODsgICAgLyogdHlwZSAqLworICAgICooKGNoYXIgKikgdHhfcGFja2V0ICsgMTMpID0gdDsKKworICAgIG1lbWNweSAodHhfcGFja2V0ICsgRVRIX0hMRU4sIHAsIHMpOworICAgIHMgKz0gRVRIX0hMRU47CisKKyAgICB3aGlsZSAocyA8IEVUSF9aTEVOKQorICAgICooKGNoYXIgKikgdHhfcGFja2V0ICsgRVRIX0hMRU4gKyAocysrKSkgPSAwOworCisgICAgdzg0MHByaXZhdGUudHhfcmluZ1tlbnRyeV0uYnVmZmVyMSA9IHZpcnRfdG9fbGUzMmRlc2ModHhfcGFja2V0KTsKKworICAgIHc4NDBwcml2YXRlLnR4X3JpbmdbZW50cnldLmxlbmd0aCA9IChEZXNjV2hvbGVQa3QgfCBzKTsKKyAgICBpZiAoZW50cnkgPj0gVFhfUklOR19TSVpFLTEpICAgICAgICAgLyogV3JhcCByaW5nICovCisgICAgICAgIHc4NDBwcml2YXRlLnR4X3JpbmdbZW50cnldLmxlbmd0aCB8PSAoRGVzY0ludHIgfCBEZXNjRW5kUmluZyk7CisgICAgdzg0MHByaXZhdGUudHhfcmluZ1tlbnRyeV0uc3RhdHVzID0gKERlc2NPd24pOworICAgIHc4NDBwcml2YXRlLmN1cl90eCsrOworCisgICAgdzg0MHByaXZhdGUudHhfcV9ieXRlcyArPSBzOworICAgIHdyaXRlbCgwLCBpb2FkZHIgKyBUeFN0YXJ0RGVtYW5kKTsKKworICAgIC8qIFdvcmsgYXJvdW5kIGhvcnJpYmxlIGJ1ZyBpbiB0aGUgY2hpcCBieSBtYXJraW5nIHRoZSBxdWV1ZSBhcyBmdWxsCisgICAgICAgd2hlbiB3ZSBkbyBub3QgaGF2ZSBGSUZPIHJvb20gZm9yIGEgbWF4aW11bSBzaXplZCBwYWNrZXQuICovCisKKyAgICBpZiAoKHc4NDBwcml2YXRlLmRydl9mbGFncyAmIEhhc0Jyb2tlblR4KSAmJiB3ODQwcHJpdmF0ZS50eF9xX2J5dGVzID4gVFhfQlVHX0ZJRk9fTElNSVQpIHsKKyAgICAgICAgLyogQWN0dWFsbHkgdGhpcyBpcyBsZWZ0IHRvIGhlbHAgZmluZGluZyBlcnJvciB0YWlscyBsYXRlciBpbiBkZWJ1Z2dpbmcuLi4KKyAgICAgICAgICogU2VlIExpbnV4IGtlcm5lbCBkcml2ZXIgaW4gd2luYm9uZC04NDAuYyBmb3IgZGV0YWlscy4KKyAgICAgICAgICovCisgICAgICAgIHc4NDBwcml2YXRlLnR4X2Z1bGwgPSAxOworICAgIH0KKworI2lmIGRlZmluZWQoVzg5Qzg0MF9ERUJVRykKKyAgICBwcmludGYoIndpbmJvbmQtODQwIDogVHJhbnNtaXQgZnJhbWUgIyAlZCBzaXplICVkIHF1ZXVlZCBpbiBzbG90ICVkLlxuIiwgdzg0MHByaXZhdGUuY3VyX3R4LCBzLCBlbnRyeSk7CisjZW5kaWYKKworICAgIC8qIE5vdyB3YWl0IGZvciBUWCB0byBjb21wbGV0ZS4gKi8KKyAgICB0cmFuc21pdF9zdGF0dXMgPSB3ODQwcHJpdmF0ZS50eF9yaW5nW2VudHJ5XS5zdGF0dXM7CisKKyAgICBsb2FkX3RpbWVyMihUWF9USU1FT1VUKTsKKworICAgIHsKKyAgICAgICAgdTMyIGludHJfc3RhdCA9IDA7CisKKyAgICAgICAgd2hpbGUgKDEpIHsKKworICAgICAgICAgICAgaW50cl9zdGF0ID0gcmVhZGwoaW9hZGRyICsgSW50clN0YXR1cyk7CisjaWYgZGVmaW5lZChXODlDODQwX0RFQlVHKQorICAgICAgICAgICAgZGVjb2RlX2ludGVycnVwdChpbnRyX3N0YXQpOworI2VuZGlmCisKKyAgICAgICAgICAgIGlmIChpbnRyX3N0YXQgJiAoTm9ybWFsSW50ciB8IEludHJUeERvbmUpKSB7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoICh0cmFuc21pdF9zdGF0dXMgJiBEZXNjT3duKSAmJiB0aW1lcjJfcnVubmluZygpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNtaXRfc3RhdHVzID0gdzg0MHByaXZhdGUudHhfcmluZ1tlbnRyeV0uc3RhdHVzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdyaXRlbChpbnRyX3N0YXQgJiAweDAwMDFmZmZmLCBpb2FkZHIgKyBJbnRyU3RhdHVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgodHJhbnNtaXRfc3RhdHVzICYgRGVzY093bikgPT0gMCkgeworCisjaWYgZGVmaW5lZChXODlDODQwX0RFQlVHKQorICAgICAgICBwcmludGYoIndpbmJvbmQtODQwIDogdHJhbnNtaXNzaW9uIGNvbXBsZXRlIGFmdGVyICVkIHdhaXQgbG9vcCBpdGVyYXRpb25zLCBzdGF0dXMgJVhcbiIsCisgICAgICAgICAgICAgICBUWF9MT09QX0NPVU5UIC0gdHJhbnNtaXRfbG9vcF9jb3VudGVyLCB3ODQwcHJpdmF0ZS50eF9yaW5nW2VudHJ5XS5zdGF0dXMpOworI2VuZGlmCisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFRyYW5zbWl0IHRpbWVkIG91dC4uLiAqLworCisgICAgcHJpbnRmKCJ3aW5ib25kLTg0MCA6IHRyYW5zbWlzc2lvbiBUSU1FT1VUIDogc3RhdHVzICVYXG4iLCB3ODQwcHJpdmF0ZS50eF9yaW5nW2VudHJ5XS5zdGF0dXMpOworCisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3c4OWM4NDBfZGlzYWJsZSAtIFR1cm4gb2ZmIGV0aGVybmV0IGludGVyZmFjZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgdzg5Yzg0MF9kaXNhYmxlKHN0cnVjdCBuaWMgKm5pYykKK3sKKyAgICAvKiBEb24ndCBrbm93IHdoYXQgdG8gZG8gdG8gZGlzYWJsZSB0aGUgYm9hcmQuIElzIHRoaXMgbmVlZGVkIGF0IGFsbD8gKi8KKyAgICAvKiBZZXMsIGEgbGl2ZSBOSUMgY2FuIGNvcnJ1cHQgdGhlIGxvYWRlZCBtZW1vcnkgbGF0ZXIgW0tlbl0gKi8KKyAgICAvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IHByb2Nlc3Nlcy4gKi8KKyAgICB3cml0ZWwodzg0MHByaXZhdGUuY3NyNiAmPSB+MHgyMEZBLCBpb2FkZHIgKyBOZXR3b3JrQ29uZmlnKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCit3ODljODQwX3Byb2JlIC0gTG9vayBmb3IgYW4gYWRhcHRlciwgdGhpcyByb3V0aW5lJ3MgdmlzaWJsZSB0byB0aGUgb3V0c2lkZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IG5pYyAqdzg5Yzg0MF9wcm9iZShzdHJ1Y3QgbmljICpuaWMsIHVuc2lnbmVkIHNob3J0ICpwcm9iZV9hZGRycywgc3RydWN0IHBjaV9kZXZpY2UgKnApCit7CisgICAgdTE2IHN1bSA9IDA7CisgICAgaW50IGksIGosIHRvOworICAgIHVuc2lnbmVkIHNob3J0IHZhbHVlOworICAgIGludCBvcHRpb25zOworICAgIGludCBwcm9taXNjOworCisgICAgaWYgKHByb2JlX2FkZHJzID09IDAgfHwgcHJvYmVfYWRkcnNbMF0gPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpb2FkZHIgPSBwcm9iZV9hZGRyc1swXTsgLyogTWFzayB0aGUgYml0IHRoYXQgc2F5cyAidGhpcyBpcyBhbiBpbyBhZGRyIiAqLworCisjaWYgZGVmaW5lZChXODlDODQwX0RFQlVHKQorICAgIHByaW50Zigid2luYm9uZC04NDA6IFBDSSBidXMgJWhoWCBkZXZpY2UgZnVuY3Rpb24gJWhoWDogSS9PIGFkZHJlc3M6ICVoWFxuIiwgcC0+YnVzLCBwLT5kZXZmbiwgaW9hZGRyKTsKKyNlbmRpZgorCisgICAgaW9hZGRyID0gaW9hZGRyICYgfjM7IC8qIE1hc2sgdGhlIGJpdCB0aGF0IHNheXMgInRoaXMgaXMgYW4gaW8gYWRkciIgKi8KKworICAgIC8qIGlmIHByb2JlX2FkZHJzIGlzIDAsIHRoZW4gcm91dGluZSBjYW4gdXNlIGEgaGFyZHdpcmVkIGRlZmF1bHQgKi8KKworICAgIC8qIEZyb20gTWF0dCBIb3J0bWFuIDxtYmhvcnRtYW5AYWNwdGhpbmNsaWVudC5jb20+ICovCisgICAgaWYgKHAtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1dJTkJPTkQyCisgICAgICAgICYmIHAtPmRldl9pZCA9PSBQQ0lfREVWSUNFX0lEX1dJTkJPTkQyXzg5Qzg0MCkgeworCisgICAgICAgIC8qIGRldGVjdGVkICJXaW5ib25kIFc4OWM4NDAgRmFzdCBFdGhlcm5ldCBQQ0kgTklDIiAqLworCisgICAgfSBlbHNlIGlmICggcC0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQ09NUEVYCisgICAgICAgICAgICAgICAgJiYgcC0+ZGV2X2lkID09IFBDSV9ERVZJQ0VfSURfQ09NUEVYX1JMMTAwQVRYKSB7CisKKyAgICAgICAgLyogZGV0ZWN0ZWQgIkNvbXBleCBSTDEwMEFUWCBGYXN0IEV0aGVybmV0IFBDSSBOSUMiICovCisKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBHZWUsIGd1ZXNzIHdoYXQ/IFRoZXkgbWlzc2VkIGFnYWluLiAqLworICAgICAgICBwcmludGYoImRldmljZSBJRCA6ICVYIC0gaXMgbm90IGEgQ29tcGV4IFJMMTAwQVRYIE5JQy5cbiIsIHAtPmRldl9pZCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHByaW50ZigiICVzXG4iLCB3ODljODQwX3ZlcnNpb24pOworCisgICAgYWRqdXN0X3BjaV9kZXZpY2UocCk7CisKKyAgICAvKiBPay4gR290IG9uZS4gUmVhZCB0aGUgZWVwcm9tLiAqLworICAgIGZvciAoaiA9IDAsIGkgPSAwOyBpIDwgMHg0MDsgaSsrKSB7CisgICAgICAgIHZhbHVlID0gZWVwcm9tX3JlYWQoaW9hZGRyLCBpKTsKKyAgICAgICAgZWVwcm9tW2ldID0gdmFsdWU7CisgICAgICAgIHN1bSArPSB2YWx1ZTsKKyAgICB9CisKKyAgICBmb3IgKGk9MDtpPEVUSF9BTEVOO2krKykgeworICAgICAgICBuaWMtPm5vZGVfYWRkcltpXSA9ICAoZWVwcm9tW2kvMl0gPj4gKDgqKGkmMSkpKSAmIDB4ZmY7CisgICAgfQorICAgIHByaW50ZiAoIkV0aGVybmV0IGFkZHI6ICUhXG4iLCBuaWMtPm5vZGVfYWRkcik7CisKKyNpZiBkZWZpbmVkKFc4OUM4NDBfREVCVUcpCisgICAgcHJpbnRmKCJ3aW5ib25kLTg0MDogRUVQUk9NIGNoZWNrc3VtICVoWCwgZ290IGVlcHJvbSIsIHN1bSk7CisjZW5kaWYKKworICAgIC8qIFJlc2V0IHRoZSBjaGlwIHRvIGVyYXNlIHByZXZpb3VzIG1pc2NvbmZpZ3VyYXRpb24uCisgICAgICAgTm8gaG9sZCB0aW1lIHJlcXVpcmVkISAqLworICAgIHdyaXRlbCgweDAwMDAwMDAxLCBpb2FkZHIgKyBQQ0lCdXNDZmcpOworCisgICAgaWYgKGRyaXZlcl9mbGFncyAmIENhbkhhdmVNSUkpIHsKKyAgICAgICAgaW50IHBoeSwgcGh5X2lkeCA9IDA7CisgICAgICAgIGZvciAocGh5ID0gMTsgcGh5IDwgMzIgJiYgcGh5X2lkeCA8IDQ7IHBoeSsrKSB7CisgICAgICAgICAgICBpbnQgbWlpX3N0YXR1cyA9IG1kaW9fcmVhZChpb2FkZHIsIHBoeSwgMSk7CisgICAgICAgICAgICBpZiAobWlpX3N0YXR1cyAhPSAweGZmZmYgICYmICBtaWlfc3RhdHVzICE9IDB4MDAwMCkgeworICAgICAgICAgICAgICAgIHc4NDBwcml2YXRlLnBoeXNbcGh5X2lkeCsrXSA9IHBoeTsKKyAgICAgICAgICAgICAgICB3ODQwcHJpdmF0ZS5hZHZlcnRpc2luZyA9IG1kaW9fcmVhZChpb2FkZHIsIHBoeSwgNCk7CisKKyNpZiBkZWZpbmVkKFc4OUM4NDBfREVCVUcpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJ3aW5ib25kLTg0MCA6IE1JSSBQSFkgZm91bmQgYXQgYWRkcmVzcyAlZCwgc3RhdHVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgIiVYIGFkdmVydGlzaW5nICVoWC5cbiIsIHBoeSwgbWlpX3N0YXR1cywgdzg0MHByaXZhdGUuYWR2ZXJ0aXNpbmcpOworI2VuZGlmCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHc4NDBwcml2YXRlLm1paV9jbnQgPSBwaHlfaWR4OworCisgICAgICAgIGlmIChwaHlfaWR4ID09IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIndpbmJvbmQtODQwIDogTUlJIFBIWSBub3QgZm91bmQgLS0gdGhpcyBkZXZpY2UgbWF5IG5vdCBvcGVyYXRlIGNvcnJlY3RseS5cbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcG9pbnQgdG8gTklDIHNwZWNpZmljIHJvdXRpbmVzICovCisgICAgbmljLT5yZXNldCA9IHc4OWM4NDBfcmVzZXQ7CisgICAgbmljLT5wb2xsID0gdzg5Yzg0MF9wb2xsOworICAgIG5pYy0+dHJhbnNtaXQgPSB3ODljODQwX3RyYW5zbWl0OworICAgIG5pYy0+ZGlzYWJsZSA9IHc4OWM4NDBfZGlzYWJsZTsKKworICAgIHc4OWM4NDBfcmVzZXQobmljKTsKKworICAgIHJldHVybiBuaWM7Cit9CisKKy8qIFJlYWQgdGhlIEVFUFJPTSBhbmQgTUlJIE1hbmFnZW1lbnQgRGF0YSBJL08gKE1ESU8pIGludGVyZmFjZXMuICBUaGVzZSBhcmUKKyAgIG9mdGVuIHNlcmlhbCBiaXQgc3RyZWFtcyBnZW5lcmF0ZWQgYnkgdGhlIGhvc3QgcHJvY2Vzc29yLgorICAgVGhlIGV4YW1wbGUgYmVsb3cgaXMgZm9yIHRoZSBjb21tb24gOTNjNDYgRUVQUk9NLCA2NCAxNiBiaXQgd29yZHMuICovCisKKy8qIERlbGF5IGJldHdlZW4gRUVQUk9NIGNsb2NrIHRyYW5zaXRpb25zLgorICAgTm8gZXh0cmEgZGVsYXkgaXMgbmVlZGVkIHdpdGggMzNNaHogUENJLCBidXQgZnV0dXJlIDY2TWh6IGFjY2VzcyBtYXkgbmVlZAorICAgYSBkZWxheS4gIE5vdGUgdGhhdCBwcmUtMi4wLjM0IGtlcm5lbHMgaGFkIGEgY2FjaGUtYWxpZ25tZW50IGJ1ZyB0aGF0CisgICBtYWRlIHVkZWxheSgpIHVucmVsaWFibGUuCisgICBUaGUgb2xkIG1ldGhvZCBvZiB1c2luZyBhbiBJU0EgYWNjZXNzIGFzIGEgZGVsYXksIF9fU0xPV19ET1dOX0lPX18sIGlzCisgICBkZXByaWNhdGVkLgorKi8KKyNkZWZpbmUgZWVwcm9tX2RlbGF5KGVlX2FkZHIpICAgIHJlYWRsKGVlX2FkZHIpCisKK2VudW0gRUVQUk9NX0N0cmxfQml0cyB7CisgICAgRUVfU2hpZnRDbGs9MHgwMiwgRUVfV3JpdGUwPTB4ODAxLCBFRV9Xcml0ZTE9MHg4MDUsCisgICAgRUVfQ2hpcFNlbGVjdD0weDgwMSwgRUVfRGF0YUluPTB4MDgsCit9OworCisvKiBUaGUgRUVQUk9NIGNvbW1hbmRzIGluY2x1ZGUgdGhlIGFsd2F5LXNldCBsZWFkaW5nIGJpdC4gKi8KK2VudW0gRUVQUk9NX0NtZHMgeworICAgIEVFX1dyaXRlQ21kPSg1IDw8IDYpLCBFRV9SZWFkQ21kPSg2IDw8IDYpLCBFRV9FcmFzZUNtZD0oNyA8PCA2KSwKK307CisKK3N0YXRpYyBpbnQgZWVwcm9tX3JlYWQobG9uZyBhZGRyLCBpbnQgbG9jYXRpb24pCit7CisgICAgaW50IGk7CisgICAgaW50IHJldHZhbCA9IDA7CisgICAgaW50IGVlX2FkZHIgPSBhZGRyICsgRUVDdHJsOworICAgIGludCByZWFkX2NtZCA9IGxvY2F0aW9uIHwgRUVfUmVhZENtZDsKKyAgICB3cml0ZWwoRUVfQ2hpcFNlbGVjdCwgZWVfYWRkcik7CisKKyAgICAvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kIGJpdHMgb3V0LiAqLworICAgIGZvciAoaSA9IDEwOyBpID49IDA7IGktLSkgeworICAgICAgICBzaG9ydCBkYXRhdmFsID0gKHJlYWRfY21kICYgKDEgPDwgaSkpID8gRUVfV3JpdGUxIDogRUVfV3JpdGUwOworICAgICAgICB3cml0ZWwoZGF0YXZhbCwgZWVfYWRkcik7CisgICAgICAgIGVlcHJvbV9kZWxheShlZV9hZGRyKTsKKyAgICAgICAgd3JpdGVsKGRhdGF2YWwgfCBFRV9TaGlmdENsaywgZWVfYWRkcik7CisgICAgICAgIGVlcHJvbV9kZWxheShlZV9hZGRyKTsKKyAgICB9CisgICAgd3JpdGVsKEVFX0NoaXBTZWxlY3QsIGVlX2FkZHIpOworCisgICAgZm9yIChpID0gMTY7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgd3JpdGVsKEVFX0NoaXBTZWxlY3QgfCBFRV9TaGlmdENsaywgZWVfYWRkcik7CisgICAgICAgIGVlcHJvbV9kZWxheShlZV9hZGRyKTsKKyAgICAgICAgcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgocmVhZGwoZWVfYWRkcikgJiBFRV9EYXRhSW4pID8gMSA6IDApOworICAgICAgICB3cml0ZWwoRUVfQ2hpcFNlbGVjdCwgZWVfYWRkcik7CisgICAgICAgIGVlcHJvbV9kZWxheShlZV9hZGRyKTsKKyAgICB9CisKKyAgICAvKiBUZXJtaW5hdGUgdGhlIEVFUFJPTSBhY2Nlc3MuICovCisgICAgd3JpdGVsKDAsIGVlX2FkZHIpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qICBNSUkgdHJhbnNjZWl2ZXIgY29udHJvbCBzZWN0aW9uLgorICAgIFJlYWQgYW5kIHdyaXRlIHRoZSBNSUkgcmVnaXN0ZXJzIHVzaW5nIHNvZnR3YXJlLWdlbmVyYXRlZCBzZXJpYWwKKyAgICBNRElPIHByb3RvY29sLiAgU2VlIHRoZSBNSUkgc3BlY2lmaWNhdGlvbnMgb3IgRFA4Mzg0MEEgZGF0YSBzaGVldAorICAgIGZvciBkZXRhaWxzLgorCisgICAgVGhlIG1heGltdW0gZGF0YSBjbG9jayByYXRlIGlzIDIuNSBNaHouICBUaGUgbWluaW11bSB0aW1pbmcgaXMgdXN1YWxseQorICAgIG1ldCBieSBiYWNrLXRvLWJhY2sgMzNNaHogUENJIGN5Y2xlcy4gKi8KKyNkZWZpbmUgbWRpb19kZWxheShtZGlvX2FkZHIpIHJlYWRsKG1kaW9fYWRkcikKKworLyogU2V0IGlmZiBhIE1JSSB0cmFuc2NlaXZlciBvbiBhbnkgaW50ZXJmYWNlIHJlcXVpcmVzIG1kaW8gcHJlYW1ibGUuCisgICBUaGlzIG9ubHkgc2V0IHdpdGggb2xkZXIgdHJhbmNlaXZlcnMsIHNvIHRoZSBleHRyYQorICAgY29kZSBzaXplIG9mIGEgcGVyLWludGVyZmFjZSBmbGFnIGlzIG5vdCB3b3J0aHdoaWxlLiAqLworc3RhdGljIGNoYXIgbWlpX3ByZWFtYmxlX3JlcXVpcmVkID0gMTsKKworI2RlZmluZSBNRElPX1dSSVRFMCAoTURJT19FbmJPdXRwdXQpCisjZGVmaW5lIE1ESU9fV1JJVEUxIChNRElPX0RhdGFPdXQgfCBNRElPX0VuYk91dHB1dCkKKworLyogR2VuZXJhdGUgdGhlIHByZWFtYmxlIHJlcXVpcmVkIGZvciBpbml0aWFsIHN5bmNocm9uaXphdGlvbiBhbmQKKyAgIGEgZmV3IG9sZGVyIHRyYW5zY2VpdmVycy4gKi8KK3N0YXRpYyB2b2lkIG1kaW9fc3luYyhsb25nIG1kaW9fYWRkcikKK3sKKyAgICBpbnQgYml0cyA9IDMyOworCisgICAgLyogRXN0YWJsaXNoIHN5bmMgYnkgc2VuZGluZyBhdCBsZWFzdCAzMiBsb2dpYyBvbmVzLiAqLworICAgIHdoaWxlICgtLWJpdHMgPj0gMCkgeworICAgICAgICB3cml0ZWwoTURJT19XUklURTEsIG1kaW9fYWRkcik7CisgICAgICAgIG1kaW9fZGVsYXkobWRpb19hZGRyKTsKKyAgICAgICAgd3JpdGVsKE1ESU9fV1JJVEUxIHwgTURJT19TaGlmdENsaywgbWRpb19hZGRyKTsKKyAgICAgICAgbWRpb19kZWxheShtZGlvX2FkZHIpOworICAgIH0KK30KKworc3RhdGljIGludCBtZGlvX3JlYWQoaW50IGJhc2VfYWRkcmVzcywgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQoreworICAgIGxvbmcgbWRpb19hZGRyID0gYmFzZV9hZGRyZXNzICsgTUlJQ3RybDsKKyAgICBpbnQgbWlpX2NtZCA9ICgweGY2IDw8IDEwKSB8IChwaHlfaWQgPDwgNSkgfCBsb2NhdGlvbjsKKyAgICBpbnQgaSwgcmV0dmFsID0gMDsKKworICAgIGlmIChtaWlfcHJlYW1ibGVfcmVxdWlyZWQpCisgICAgICAgIG1kaW9fc3luYyhtZGlvX2FkZHIpOworCisgICAgLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KKyAgICBmb3IgKGkgPSAxNTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgaW50IGRhdGF2YWwgPSAobWlpX2NtZCAmICgxIDw8IGkpKSA/IE1ESU9fV1JJVEUxIDogTURJT19XUklURTA7CisKKyAgICAgICAgd3JpdGVsKGRhdGF2YWwsIG1kaW9fYWRkcik7CisgICAgICAgIG1kaW9fZGVsYXkobWRpb19hZGRyKTsKKyAgICAgICAgd3JpdGVsKGRhdGF2YWwgfCBNRElPX1NoaWZ0Q2xrLCBtZGlvX2FkZHIpOworICAgICAgICBtZGlvX2RlbGF5KG1kaW9fYWRkcik7CisgICAgfQorICAgIC8qIFJlYWQgdGhlIHR3byB0cmFuc2l0aW9uLCAxNiBkYXRhLCBhbmQgd2lyZS1pZGxlIGJpdHMuICovCisgICAgZm9yIChpID0gMjA7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgd3JpdGVsKE1ESU9fRW5iSW4sIG1kaW9fYWRkcik7CisgICAgICAgIG1kaW9fZGVsYXkobWRpb19hZGRyKTsKKyAgICAgICAgcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgocmVhZGwobWRpb19hZGRyKSAmIE1ESU9fRGF0YUluKSA/IDEgOiAwKTsKKyAgICAgICAgd3JpdGVsKE1ESU9fRW5iSW4gfCBNRElPX1NoaWZ0Q2xrLCBtZGlvX2FkZHIpOworICAgICAgICBtZGlvX2RlbGF5KG1kaW9fYWRkcik7CisgICAgfQorICAgIHJldHVybiAocmV0dmFsPj4xKSAmIDB4ZmZmZjsKK30KKworc3RhdGljIHZvaWQgbWRpb193cml0ZShpbnQgYmFzZV9hZGRyZXNzLCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKK3sKKyAgICBsb25nIG1kaW9fYWRkciA9IGJhc2VfYWRkcmVzcyArIE1JSUN0cmw7CisgICAgaW50IG1paV9jbWQgPSAoMHg1MDAyIDw8IDE2KSB8IChwaHlfaWQgPDwgMjMpIHwgKGxvY2F0aW9uPDwxOCkgfCB2YWx1ZTsKKyAgICBpbnQgaTsKKworICAgIGlmIChsb2NhdGlvbiA9PSA0ICAmJiAgcGh5X2lkID09IHc4NDBwcml2YXRlLnBoeXNbMF0pCisgICAgICAgIHc4NDBwcml2YXRlLmFkdmVydGlzaW5nID0gdmFsdWU7CisKKyAgICBpZiAobWlpX3ByZWFtYmxlX3JlcXVpcmVkKQorICAgICAgICBtZGlvX3N5bmMobWRpb19hZGRyKTsKKworICAgIC8qIFNoaWZ0IHRoZSBjb21tYW5kIGJpdHMgb3V0LiAqLworICAgIGZvciAoaSA9IDMxOyBpID49IDA7IGktLSkgeworICAgICAgICBpbnQgZGF0YXZhbCA9IChtaWlfY21kICYgKDEgPDwgaSkpID8gTURJT19XUklURTEgOiBNRElPX1dSSVRFMDsKKworICAgICAgICB3cml0ZWwoZGF0YXZhbCwgbWRpb19hZGRyKTsKKyAgICAgICAgbWRpb19kZWxheShtZGlvX2FkZHIpOworICAgICAgICB3cml0ZWwoZGF0YXZhbCB8IE1ESU9fU2hpZnRDbGssIG1kaW9fYWRkcik7CisgICAgICAgIG1kaW9fZGVsYXkobWRpb19hZGRyKTsKKyAgICB9CisgICAgLyogQ2xlYXIgb3V0IGV4dHJhIGJpdHMuICovCisgICAgZm9yIChpID0gMjsgaSA+IDA7IGktLSkgeworICAgICAgICB3cml0ZWwoTURJT19FbmJJbiwgbWRpb19hZGRyKTsKKyAgICAgICAgbWRpb19kZWxheShtZGlvX2FkZHIpOworICAgICAgICB3cml0ZWwoTURJT19FbmJJbiB8IE1ESU9fU2hpZnRDbGssIG1kaW9fYWRkcik7CisgICAgICAgIG1kaW9fZGVsYXkobWRpb19hZGRyKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBjaGVja19kdXBsZXgodm9pZCkKK3sKKyAgICBpbnQgbWlpX3JlZzUgPSBtZGlvX3JlYWQoaW9hZGRyLCB3ODQwcHJpdmF0ZS5waHlzWzBdLCA1KTsKKyAgICBpbnQgbmVnb3RpYXRlZCA9ICBtaWlfcmVnNSAmIHc4NDBwcml2YXRlLmFkdmVydGlzaW5nOworICAgIGludCBkdXBsZXg7CisKKyAgICBpZiAodzg0MHByaXZhdGUuZHVwbGV4X2xvY2sgIHx8ICBtaWlfcmVnNSA9PSAweGZmZmYpCisgICAgICAgIHJldHVybjsKKworICAgIGR1cGxleCA9IChuZWdvdGlhdGVkICYgMHgwMTAwKSB8fCAobmVnb3RpYXRlZCAmIDB4MDFDMCkgPT0gMHgwMDQwOworICAgIGlmICh3ODQwcHJpdmF0ZS5mdWxsX2R1cGxleCAhPSBkdXBsZXgpIHsKKyAgICAgICAgdzg0MHByaXZhdGUuZnVsbF9kdXBsZXggPSBkdXBsZXg7ICAgICAgIAorCisjaWYgZGVmaW5lZChXODlDODQwX0RFQlVHKQorICAgICAgICBwcmludGYoIndpbmJvbmQtODQwIDogU2V0dGluZyAlcy1kdXBsZXggYmFzZWQgb24gTUlJICMgJWQgbmVnb3RpYXRlZCBjYXBhYmlsaXR5ICVYXG4iLAorICAgICAgICAgICAgICAgZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiLCB3ODQwcHJpdmF0ZS5waHlzWzBdLCBuZWdvdGlhdGVkKTsKKyNlbmRpZgorCisgICAgICAgIHc4NDBwcml2YXRlLmNzcjYgJj0gfjB4MjAwOworICAgICAgICB3ODQwcHJpdmF0ZS5jc3I2IHw9IGR1cGxleCA/IDB4MjAwIDogMDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHZvaWQpCit7CisgICAgdTMyIG1jX2ZpbHRlclsyXTsgICAgICAgICAgICAvKiBNdWx0aWNhc3QgaGFzaCBmaWx0ZXIgKi8KKyAgICB1MzIgcnhfbW9kZTsKKworICAgIC8qIEFjY2VwdCBhbGwgbXVsdGljYXN0cyBmcm9tIG5vdyBvbi4gKi8KKyAgICBtZW1zZXQobWNfZmlsdGVyLCAweGZmLCBzaXplb2YobWNfZmlsdGVyKSk7CisKKy8qCisgKiBBY3R1YWxseSwgc2hvdWxkIHdvcmsgT0sgd2l0aCBtdWx0aWNhc3QgZW5hYmxlZC4gLS0gaWtvCisgKi8KKy8qCisgKiAgcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE15UGh5cyB8IEFjY2VwdE11bHRpY2FzdDsKKyAqLworICAgIHJ4X21vZGUgPSBBY2NlcHRCcm9hZGNhc3QgfCBBY2NlcHRNeVBoeXM7CisKKyAgICB3cml0ZWwobWNfZmlsdGVyWzBdLCBpb2FkZHIgKyBNdWx0aWNhc3RGaWx0ZXIwKTsKKyAgICB3cml0ZWwobWNfZmlsdGVyWzFdLCBpb2FkZHIgKyBNdWx0aWNhc3RGaWx0ZXIxKTsKKyAgICB3ODQwcHJpdmF0ZS5jc3I2ICY9IH4weDAwRjg7CisgICAgdzg0MHByaXZhdGUuY3NyNiB8PSByeF9tb2RlOworICAgIHdyaXRlbCh3ODQwcHJpdmF0ZS5jc3I2LCBpb2FkZHIgKyBOZXR3b3JrQ29uZmlnKTsKKworI2lmIGRlZmluZWQoVzg5Qzg0MF9ERUJVRykKKyAgICBwcmludGYoIndpbmJvbmQtODQwIDogRG9uZSBzZXR0aW5nIFJYIG1vZGUuXG4iKTsKKyNlbmRpZgorfQorCisvKiBJbml0aWFsaXplIHRoZSBSeCBhbmQgVHggcmluZ3MsIGFsb25nIHdpdGggdmFyaW91cyAnZGV2JyBiaXRzLiAqLworc3RhdGljIHZvaWQgaW5pdF9yaW5nKHZvaWQpCit7CisgICAgaW50IGk7CisgICAgY2hhciAqIHA7CisKKyAgICB3ODQwcHJpdmF0ZS50eF9mdWxsID0gMDsKKyAgICB3ODQwcHJpdmF0ZS50eF9xX2J5dGVzID0gdzg0MHByaXZhdGUuY3VyX3J4ID0gdzg0MHByaXZhdGUuY3VyX3R4ID0gMDsKKyAgICB3ODQwcHJpdmF0ZS5kaXJ0eV9yeCA9IHc4NDBwcml2YXRlLmRpcnR5X3R4ID0gMDsKKworICAgIHc4NDBwcml2YXRlLnJ4X2J1Zl9zeiA9IFBLVF9CVUZfU1o7CisgICAgdzg0MHByaXZhdGUucnhfaGVhZF9kZXNjID0gJnc4NDBwcml2YXRlLnJ4X3JpbmdbMF07CisKKyAgICAvKiBJbml0aWFsIGFsbCBSeCBkZXNjcmlwdG9ycy4gRmlsbCBpbiB0aGUgUnggYnVmZmVycy4gKi8KKworICAgIHAgPSAmcnhfcGFja2V0WzBdOworCisgICAgZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisgICAgICAgIHc4NDBwcml2YXRlLnJ4X3JpbmdbaV0ubGVuZ3RoID0gdzg0MHByaXZhdGUucnhfYnVmX3N6OworICAgICAgICB3ODQwcHJpdmF0ZS5yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CisgICAgICAgIHc4NDBwcml2YXRlLnJ4X3JpbmdbaV0ubmV4dF9kZXNjID0gdmlydF90b19sZTMyZGVzYygmdzg0MHByaXZhdGUucnhfcmluZ1tpKzFdKTsKKworICAgICAgICB3ODQwcHJpdmF0ZS5yeF9yaW5nW2ldLmJ1ZmZlcjEgPSB2aXJ0X3RvX2xlMzJkZXNjKHAgKyAoUEtUX0JVRl9TWiAqIGkpKTsKKyAgICAgICAgdzg0MHByaXZhdGUucnhfcmluZ1tpXS5zdGF0dXMgPSBEZXNjT3duIHwgRGVzY0ludHI7CisgICAgfQorCisgICAgLyogTWFyayB0aGUgbGFzdCBlbnRyeSBhcyB3cmFwcGluZyB0aGUgcmluZy4gKi8KKyAgICB3ODQwcHJpdmF0ZS5yeF9yaW5nW2ktMV0ubGVuZ3RoIHw9IERlc2NFbmRSaW5nOworICAgIHc4NDBwcml2YXRlLnJ4X3JpbmdbaS0xXS5uZXh0X2Rlc2MgPSB2aXJ0X3RvX2xlMzJkZXNjKCZ3ODQwcHJpdmF0ZS5yeF9yaW5nWzBdKTsKKworICAgIHc4NDBwcml2YXRlLmRpcnR5X3J4ID0gKHVuc2lnbmVkIGludCkoaSAtIFJYX1JJTkdfU0laRSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKyAgICAgICAgdzg0MHByaXZhdGUudHhfcmluZ1tpXS5zdGF0dXMgPSAwOworICAgIH0KKyAgICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9zdGFnZTEvTWFrZWZpbGUuYW0gYi9zdGFnZTEvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFmYzI4NQotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE1IEBACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvJChQQUNLQUdFKS8kKGhvc3RfY3B1KS0kKGhvc3RfdmVuZG9yKQorbm9kaXN0X3BrZ2xpYl9EQVRBID0gc3RhZ2UxCisKK0NMRUFORklMRVMgPSAkKG5vZGlzdF9wa2dsaWJfREFUQSkKKworIyBXZSBjYW4ndCB1c2UgYnVpbHRpbnMgb3Igc3RhbmRhcmQgaW5jbHVkZXMuCitBTV9DQ0FTRkxBR1MgPSAkKFNUQUdFMV9DRkxBR1MpIC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMKK0xERkxBR1MgPSAtbm9zdGRsaWIgLVdsLC1OLC1UdGV4dCw3QzAwCisKK25vaW5zdF9QUk9HUkFNUyA9IHN0YWdlMS5leGVjCitzdGFnZTFfZXhlY19TT1VSQ0VTID0gc3RhZ2UxLlMgc3RhZ2UxLmgKKworU1VGRklYRVMgPSAuZXhlYworLmV4ZWM6CisJJChPQkpDT1BZKSAtTyBiaW5hcnkgJDwgJEAKZGlmZiAtLWdpdCBhL3N0YWdlMS9NYWtlZmlsZS5pbiBiL3N0YWdlMS9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTM0YmRmCi0tLSAvZGV2L251bGwKKysrIGIvc3RhZ2UxL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNDMzIEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjkuNCBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKKworU09VUkNFUyA9ICQoc3RhZ2UxX2V4ZWNfU09VUkNFUykKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACit0b3BfYnVpbGRkaXIgPSAuLgorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAorSU5TVEFMTCA9IEBJTlNUQUxMQAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorbm9pbnN0X1BST0dSQU1TID0gc3RhZ2UxLmV4ZWMkKEVYRUVYVCkKK3N1YmRpciA9IHN0YWdlMQorRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2luY2x1ZGUubTQgXAorCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK21raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitQUk9HUkFNUyA9ICQobm9pbnN0X1BST0dSQU1TKQorYW1fc3RhZ2UxX2V4ZWNfT0JKRUNUUyA9IHN0YWdlMS4kKE9CSkVYVCkKK3N0YWdlMV9leGVjX09CSkVDVFMgPSAkKGFtX3N0YWdlMV9leGVjX09CSkVDVFMpCitzdGFnZTFfZXhlY19MREFERCA9ICQoTERBREQpCitERUZBVUxUX0lOQ0xVREVTID0gLUkuIC1JJChzcmNkaXIpIC1JJCh0b3BfYnVpbGRkaXIpCitDQ0FTQ09NUElMRSA9ICQoQ0NBUykgJChBTV9DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKQorQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCisJJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorQ0NMRCA9ICQoQ0MpCitMSU5LID0gJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoQU1fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorU09VUkNFUyA9ICQoc3RhZ2UxX2V4ZWNfU09VUkNFUykKK0RJU1RfU09VUkNFUyA9ICQoc3RhZ2UxX2V4ZWNfU09VUkNFUykKK2FtX192cGF0aF9hZGpfc2V0dXAgPSBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAnc3wufC58ZydgOworYW1fX3ZwYXRoX2FkaiA9IGNhc2UgJCRwIGluIFwKKyAgICAkKHNyY2RpcikvKikgZj1gZWNobyAiJCRwIiB8IHNlZCAic3xeJCRzcmNkaXJzdHJpcC98fCJgOzsgXAorICAgICopIGY9JCRwOzsgXAorICBlc2FjOworYW1fX3N0cmlwX2RpciA9IGBlY2hvICQkcCB8IHNlZCAtZSAnc3xeLiovfHwnYDsKK2FtX19pbnN0YWxsZGlycyA9ICIkKERFU1RESVIpJChwa2dsaWJkaXIpIgorbm9kaXN0X3BrZ2xpYkRBVEFfSU5TVEFMTCA9ICQoSU5TVEFMTF9EQVRBKQorREFUQSA9ICQobm9kaXN0X3BrZ2xpYl9EQVRBKQorRVRBR1MgPSBldGFncworQ1RBR1MgPSBjdGFncworRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK3BrZ2xpYmRpciA9ICQobGliZGlyKS8kKFBBQ0tBR0UpLyQoaG9zdF9jcHUpLSQoaG9zdF92ZW5kb3IpCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBTURFUF9GQUxTRSA9IEBBTURFUF9GQUxTRUAKK0FNREVQX1RSVUUgPSBAQU1ERVBfVFJVRUAKK0FNVEFSID0gQEFNVEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitCVUlMRF9FWEFNUExFX0tFUk5FTF9GQUxTRSA9IEBCVUlMRF9FWEFNUExFX0tFUk5FTF9GQUxTRUAKK0JVSUxEX0VYQU1QTEVfS0VSTkVMX1RSVUUgPSBAQlVJTERfRVhBTVBMRV9LRVJORUxfVFJVRUAKK0NDID0gQENDQAorQ0NBUyA9IEBDQ0FTQAorQ0NBU0ZMQUdTID0gQENDQVNGTEFHU0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitESVNLTEVTU19TVVBQT1JUX0ZBTFNFID0gQERJU0tMRVNTX1NVUFBPUlRfRkFMU0VACitESVNLTEVTU19TVVBQT1JUX1RSVUUgPSBARElTS0xFU1NfU1VQUE9SVF9UUlVFQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRlNZU19DRkxBR1MgPSBARlNZU19DRkxBR1NACitHUlVCX0NGTEFHUyA9IEBHUlVCX0NGTEFHU0AKK0dSVUJfTElCUyA9IEBHUlVCX0xJQlNACitIRVJDVUxFU19TVVBQT1JUX0ZBTFNFID0gQEhFUkNVTEVTX1NVUFBPUlRfRkFMU0VACitIRVJDVUxFU19TVVBQT1JUX1RSVUUgPSBASEVSQ1VMRVNfU1VQUE9SVF9UUlVFQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMREZMQUdTID0gLW5vc3RkbGliIC1XbCwtTiwtVHRleHQsN0MwMAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BSU5UID0gQE1BSU5UQAorTUFJTlRBSU5FUl9NT0RFX0ZBTFNFID0gQE1BSU5UQUlORVJfTU9ERV9GQUxTRUAKK01BSU5UQUlORVJfTU9ERV9UUlVFID0gQE1BSU5UQUlORVJfTU9ERV9UUlVFQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitORVRCT09UX0RSSVZFUlMgPSBATkVUQk9PVF9EUklWRVJTQAorTkVUQk9PVF9TVVBQT1JUX0ZBTFNFID0gQE5FVEJPT1RfU1VQUE9SVF9GQUxTRUAKK05FVEJPT1RfU1VQUE9SVF9UUlVFID0gQE5FVEJPT1RfU1VQUE9SVF9UUlVFQAorTkVUX0NGTEFHUyA9IEBORVRfQ0ZMQUdTQAorTkVUX0VYVFJBRkxBR1MgPSBATkVUX0VYVFJBRkxBR1NACitPQkpDT1BZID0gQE9CSkNPUFlACitPQkpFWFQgPSBAT0JKRVhUQAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEVSTCA9IEBQRVJMQAorUkFOTElCID0gQFJBTkxJQkAKK1NFUklBTF9TUEVFRF9TSU1VTEFUSU9OX0ZBTFNFID0gQFNFUklBTF9TUEVFRF9TSU1VTEFUSU9OX0ZBTFNFQAorU0VSSUFMX1NQRUVEX1NJTVVMQVRJT05fVFJVRSA9IEBTRVJJQUxfU1BFRURfU0lNVUxBVElPTl9UUlVFQAorU0VSSUFMX1NVUFBPUlRfRkFMU0UgPSBAU0VSSUFMX1NVUFBPUlRfRkFMU0VACitTRVJJQUxfU1VQUE9SVF9UUlVFID0gQFNFUklBTF9TVVBQT1JUX1RSVUVACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU1RBR0UxX0NGTEFHUyA9IEBTVEFHRTFfQ0ZMQUdTQAorU1RBR0UyX0NGTEFHUyA9IEBTVEFHRTJfQ0ZMQUdTQAorU1RSSVAgPSBAU1RSSVBACitWRVJTSU9OID0gQFZFUlNJT05ACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X09CSkNPUFkgPSBAYWNfY3RfT0JKQ09QWUAKK2FjX2N0X1JBTkxJQiA9IEBhY19jdF9SQU5MSUJACithY19jdF9TVFJJUCA9IEBhY19jdF9TVFJJUEAKK2FtX19mYXN0ZGVwQ0NfRkFMU0UgPSBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAKK2FtX19mYXN0ZGVwQ0NfVFJVRSA9IEBhbV9fZmFzdGRlcENDX1RSVUVACithbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKK2FtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAorYW1fX3RhciA9IEBhbV9fdGFyQAorYW1fX3VudGFyID0gQGFtX191bnRhckAKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK25vZGlzdF9wa2dsaWJfREFUQSA9IHN0YWdlMQorQ0xFQU5GSUxFUyA9ICQobm9kaXN0X3BrZ2xpYl9EQVRBKQorCisjIFdlIGNhbid0IHVzZSBidWlsdGlucyBvciBzdGFuZGFyZCBpbmNsdWRlcy4KK0FNX0NDQVNGTEFHUyA9ICQoU1RBR0UxX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYworc3RhZ2UxX2V4ZWNfU09VUkNFUyA9IHN0YWdlMS5TIHN0YWdlMS5oCitTVUZGSVhFUyA9IC5leGVjCithbGw6IGFsbC1hbQorCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5leGVjIC5TIC5vIC5vYmoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCBcCisJCSYmIGV4aXQgMDsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgIHN0YWdlMS9NYWtlZmlsZSc7IFwKKwljZCAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZ251ICBzdGFnZTEvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworY2xlYW4tbm9pbnN0UFJPR1JBTVM6CisJLXRlc3QgLXogIiQobm9pbnN0X1BST0dSQU1TKSIgfHwgcm0gLWYgJChub2luc3RfUFJPR1JBTVMpCitzdGFnZTEuZXhlYyQoRVhFRVhUKTogJChzdGFnZTFfZXhlY19PQkpFQ1RTKSAkKHN0YWdlMV9leGVjX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHN0YWdlMS5leGVjJChFWEVFWFQpCisJJChMSU5LKSAkKHN0YWdlMV9leGVjX0xERkxBR1MpICQoc3RhZ2UxX2V4ZWNfT0JKRUNUUykgJChzdGFnZTFfZXhlY19MREFERCkgJChMSUJTKQorCittb3N0bHljbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLiQoT0JKRVhUKQorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworCisuUy5vOgorCSQoQ0NBU0NPTVBJTEUpIC1jICQ8CisKKy5TLm9iajoKKwkkKENDQVNDT01QSUxFKSAtYyBgJChDWUdQQVRIX1cpICckPCdgCit1bmluc3RhbGwtaW5mby1hbToKK2luc3RhbGwtbm9kaXN0X3BrZ2xpYkRBVEE6ICQobm9kaXN0X3BrZ2xpYl9EQVRBKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQocGtnbGliZGlyKSIgfHwgJChta2Rpcl9wKSAiJChERVNURElSKSQocGtnbGliZGlyKSIKKwlAbGlzdD0nJChub2Rpc3RfcGtnbGliX0RBVEEpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgZj0kKGFtX19zdHJpcF9kaXIpIFwKKwkgIGVjaG8gIiAkKG5vZGlzdF9wa2dsaWJEQVRBX0lOU1RBTEwpICckJGQkJHAnICckKERFU1RESVIpJChwa2dsaWJkaXIpLyQkZiciOyBcCisJICAkKG5vZGlzdF9wa2dsaWJEQVRBX0lOU1RBTEwpICIkJGQkJHAiICIkKERFU1RESVIpJChwa2dsaWJkaXIpLyQkZiI7IFwKKwlkb25lCisKK3VuaW5zdGFsbC1ub2Rpc3RfcGtnbGliREFUQToKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKG5vZGlzdF9wa2dsaWJfREFUQSknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGY9JChhbV9fc3RyaXBfZGlyKSBcCisJICBlY2hvICIgcm0gLWYgJyQoREVTVERJUikkKHBrZ2xpYmRpcikvJCRmJyI7IFwKKwkgIHJtIC1mICIkKERFU1RESVIpJChwa2dsaWJkaXIpLyQkZiI7IFwKKwlkb25lCisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUKK3RhZ3M6IFRBR1MKKworVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwl0YWdzPTsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAkJHRhZ3MgJCR1bmlxdWU7IFwKKwlmaQorY3RhZ3M6IENUQUdTCitDVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwl0YWdzPTsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR0YWdzJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdGFncyAkJHVuaXF1ZQorCitHVEFHUzoKKwloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAorCSAgJiYgY2QgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICQkaGVyZQorCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncworCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAnc3wufC58ZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCisJICBjYXNlICQkZmlsZSBpbiBcCisJICAgICQoc3JjZGlyKS8qKSBmaWxlPWBlY2hvICIkJGZpbGUiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCisJICAgICQodG9wX3NyY2RpcikvKikgZmlsZT1gZWNobyAiJCRmaWxlIiB8IHNlZCAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3wiYDs7IFwKKwkgIGVzYWM7IFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGRpcj1gZWNobyAiJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgIGlmIHRlc3QgIiQkZGlyIiAhPSAiJCRmaWxlIiAmJiB0ZXN0ICIkJGRpciIgIT0gIi4iOyB0aGVuIFwKKwkgICAgZGlyPSIvJCRkaXIiOyBcCisJICAgICQobWtkaXJfcCkgIiQoZGlzdGRpcikkJGRpciI7IFwKKwkgIGVsc2UgXAorCSAgICBkaXI9Jyc7IFwKKwkgIGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtcFIgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1wUiAkJGQvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUgJChQUk9HUkFNUykgJChEQVRBKQoraW5zdGFsbGRpcnM6CisJZm9yIGRpciBpbiAiJChERVNURElSKSQocGtnbGliZGlyKSI7IGRvIFwKKwkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKG1rZGlyX3ApICIkJGRpciI7IFwKKwlkb25lCitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbm9pbnN0UFJPR1JBTVMgbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLW5vZGlzdF9wa2dsaWJEQVRBCisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtbWFuOgorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWluZm8tYW0gdW5pbnN0YWxsLW5vZGlzdF9wa2dsaWJEQVRBCisKKy5QSE9OWTogQ1RBR1MgR1RBR1MgYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIFwKKwljbGVhbi1ub2luc3RQUk9HUkFNUyBjdGFncyBkaXN0Y2xlYW4gZGlzdGNsZWFuLWNvbXBpbGUgXAorCWRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIFwKKwlodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIFwKKwlpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWluZm8gXAorCWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLW5vZGlzdF9wa2dsaWJEQVRBIFwKKwlpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgXAorCW1haW50YWluZXItY2xlYW4gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIFwKKwltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgcGRmIHBkZi1hbSBwcyBwcy1hbSBcCisJdGFncyB1bmluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbC1pbmZvLWFtIFwKKwl1bmluc3RhbGwtbm9kaXN0X3BrZ2xpYkRBVEEKKworLmV4ZWM6CisJJChPQkpDT1BZKSAtTyBiaW5hcnkgJDwgJEAKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL3N0YWdlMS9zdGFnZTEuUyBiL3N0YWdlMS9zdGFnZTEuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODU5NjNkCi0tLSAvZGV2L251bGwKKysrIGIvc3RhZ2UxL3N0YWdlMS5TCkBAIC0wLDAgKzEsNDk5IEBACisvKiAtKi1Bc20tKi0gKi8KKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDA0ICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RhZ2UxLmg+CisJCisvKgorICogIGRlZmluZXMgZm9yIHRoZSBjb2RlIGdvIGhlcmUKKyAqLworCisJLyogQWJzb2x1dGUgYWRkcmVzc2VzCisJICAgVGhpcyBtYWtlcyB0aGUgYXNzZW1ibGVyIGdlbmVyYXRlIHRoZSBhZGRyZXNzIHdpdGhvdXQgc3VwcG9ydAorCSAgIGZyb20gdGhlIGxpbmtlci4gKEVMRiBjYW4ndCByZWxvY2F0ZSAxNi1iaXQgYWRkcmVzc2VzISkgKi8KKyNkZWZpbmUgQUJTKHgpICh4LV9zdGFydCsweDdjMDApCisKKwkvKiBQcmludCBtZXNzYWdlIHN0cmluZyAqLworI2RlZmluZSBNU0coeCkJbW92dyAkQUJTKHgpLCAlc2k7IGNhbGwgbWVzc2FnZQorCisJLyogWFhYOgliaW51dGlscy0yLjkuMS4wLnggZG9lc24ndCBwcm9kdWNlIGEgc2hvcnQgb3Bjb2RlIGZvciB0aGlzLiAqLworI2RlZmluZQlNT1ZfTUVNX1RPX0FMKHgpCS5ieXRlIDB4YTA7ICAud29yZCB4CisJCisJLmZpbGUJInN0YWdlMS5TIgorCisJLnRleHQKKworCS8qIFRlbGwgR0FTIHRvIGdlbmVyYXRlIDE2LWJpdCBpbnN0cnVjdGlvbnMgc28gdGhhdCB0aGlzIGNvZGUgd29ya3MKKwkgICBpbiByZWFsIG1vZGUuICovCisJLmNvZGUxNgorCisuZ2xvYmwgX3N0YXJ0OyBfc3RhcnQ6CisJLyoKKwkgKiBfc3RhcnQgaXMgbG9hZGVkIGF0IDB4N2MwMCBhbmQgaXMganVtcGVkIHRvIHdpdGggQ1M6SVAgMDoweDdjMDAKKwkgKi8KKworCS8qCisJICogQmVnaW5uaW5nIG9mIHRoZSBzZWN0b3IgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBGQVQvSFBGUyBCSU9TCisJICogcGFyYW1ldGVyIGJsb2NrLgorCSAqLworCisJam1wCWFmdGVyX0JQQgorCW5vcAkvKiBkbyBJIGNhcmUgYWJvdXQgdGhpcyA/Pz8gKi8KKworCS8qCisJICogVGhpcyBzcGFjZSBpcyBmb3IgdGhlIEJJT1MgcGFyYW1ldGVyIGJsb2NrISEhISAgRG9uJ3QgY2hhbmdlCisJICogdGhlIGZpcnN0IGp1bXAsIG5vciBzdGFydCB0aGUgY29kZSBhbnl3aGVyZSBidXQgcmlnaHQgYWZ0ZXIKKwkgKiB0aGlzIGFyZWEuCisJICovCisKKwkuID0gX3N0YXJ0ICsgNAorCisJLyogc2NyYXRjaCBzcGFjZSAqLworbW9kZToKKwkuYnl0ZQkwCitkaXNrX2FkZHJlc3NfcGFja2V0OgkKK3NlY3RvcnM6CisJLmxvbmcJMAoraGVhZHM6CisJLmxvbmcJMAorY3lsaW5kZXJzOgorCS53b3JkCTAKK3NlY3Rvcl9zdGFydDoKKwkuYnl0ZQkwCitoZWFkX3N0YXJ0OgorCS5ieXRlCTAKK2N5bGluZGVyX3N0YXJ0OgorCS53b3JkCTAKKwkvKiBtb3JlIHNwYWNlLi4uICovCisKKwkuID0gX3N0YXJ0ICsgU1RBR0UxX0JQQkVORAorCisJLyoKKwkgKiBFbmQgb2YgQklPUyBwYXJhbWV0ZXIgYmxvY2suCisJICovCisKK3N0YWdlMV92ZXJzaW9uOgkKKwkuYnl0ZQlDT01QQVRfVkVSU0lPTl9NQUpPUiwgQ09NUEFUX1ZFUlNJT05fTUlOT1IKK2Jvb3RfZHJpdmU6CQorCS5ieXRlCUdSVUJfSU5WQUxJRF9EUklWRQkvKiB0aGUgZGlzayB0byBsb2FkIHN0YWdlMiBmcm9tICovCitmb3JjZV9sYmE6CisJLmJ5dGUJMAorc3RhZ2UyX2FkZHJlc3M6CisJLndvcmQJMHg4MDAwCitzdGFnZTJfc2VjdG9yOgorCS5sb25nCTEKK3N0YWdlMl9zZWdtZW50OgorCS53b3JkCTB4ODAwCisKK2FmdGVyX0JQQjoKKworLyogZ2VuZXJhbCBzZXR1cCAqLworCWNsaQkJLyogd2UncmUgbm90IHNhZmUgaGVyZSEgKi8KKworCS8qCisJICogVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGJ1Z2d5IEJJT1NlcyB3aGljaCBkb24ndCBwYXNzIGJvb3QKKwkgKiBkcml2ZSBjb3JyZWN0bHkuIElmIEdSVUIgaXMgaW5zdGFsbGVkIGludG8gYSBIREQsIGNoZWNrIGlmCisJICogREwgaXMgbWFza2VkIGNvcnJlY3RseS4gSWYgbm90LCBhc3N1bWUgdGhhdCB0aGUgQklPUyBwYXNzZWQKKwkgKiBhIGJvZ3VzIHZhbHVlIGFuZCBzZXQgREwgdG8gMHg4MCwgc2luY2UgdGhpcyBpcyB0aGUgb25seQorCSAqIHBvc3NpYmxlIGJvb3QgZHJpdmUuIElmIEdSVUIgaXMgaW5zdGFsbGVkIGludG8gYSBmbG9wcHksCisJICogdGhpcyBkb2VzIG5vdGhpbmcgKG9ubHkganVtcCkuCisJICovCitib290X2RyaXZlX2NoZWNrOgkKKwlqbXAJMWYKKwl0ZXN0YgkkMHg4MCwgJWRsCisJam56CTFmCisJbW92YgkkMHg4MCwgJWRsCisxOgkKKworCS8qCisJICogbGptcCB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbiBiZWNhdXNlIHNvbWUgYm9ndXMgQklPU2VzCisJICoganVtcCB0byAwN0MwOjAwMDAgaW5zdGVhZCBvZiAwMDAwOjdDMDAuCisJICovCisJbGptcAkkMCwgJEFCUyhyZWFsX3N0YXJ0KQorCityZWFsX3N0YXJ0OgkKKworCS8qIHNldCB1cCAlZHMgYW5kICVzcyBhcyBvZmZzZXQgZnJvbSAwICovCisJeG9ydwklYXgsICVheAorCW1vdncJJWF4LCAlZHMKKwltb3Z3CSVheCwgJXNzCisKKwkvKiBzZXQgdXAgdGhlIFJFQUwgc3RhY2sgKi8KKwltb3Z3CSRTVEFHRTFfU1RBQ0tTRUcsICVzcAorCisJc3RpCQkvKiB3ZSdyZSBzYWZlIGFnYWluICovCisKKwkvKgorCSAqICBDaGVjayBpZiB3ZSBoYXZlIGEgZm9yY2VkIGRpc2sgcmVmZXJlbmNlIGhlcmUKKwkgKi8KKwlNT1ZfTUVNX1RPX0FMKEFCUyhib290X2RyaXZlKSkJLyogbW92YglBQlMoYm9vdF9kcml2ZSksICVhbCAqLworCWNtcGIJJEdSVUJfSU5WQUxJRF9EUklWRSwgJWFsCisJamUJMWYKKwltb3ZiCSVhbCwgJWRsCisxOgorCS8qIHNhdmUgZHJpdmUgcmVmZXJlbmNlIGZpcnN0IHRoaW5nISAqLworCXB1c2h3CSVkeAorCisJLyogcHJpbnQgYSBub3RpZmljYXRpb24gbWVzc2FnZSBvbiB0aGUgc2NyZWVuICovCisJTVNHKG5vdGlmaWNhdGlvbl9zdHJpbmcpCisKKwkvKiBkbyBub3QgcHJvYmUgTEJBIGlmIHRoZSBkcml2ZSBpcyBhIGZsb3BweSAqLworCXRlc3RiCSRTVEFHRTFfQklPU19IRF9GTEFHLCAlZGwKKwlqegljaHNfbW9kZQorCQkJCisJLyogY2hlY2sgaWYgTEJBIGlzIHN1cHBvcnRlZCAqLworCW1vdmIJJDB4NDEsICVhaAorCW1vdncJJDB4NTVhYSwgJWJ4CisJaW50CSQweDEzCisKKwkvKiAKKwkgKiAgJWRsIG1heSBoYXZlIGJlZW4gY2xvYmJlcmVkIGJ5IElOVCAxMywgQUg9NDFILgorCSAqICBUaGlzIGhhcHBlbnMsIGZvciBleGFtcGxlLCB3aXRoIEFTVCBCSU9TIDEuMDQuCisJICovCisJcG9wdwklZHgKKwlwdXNodwklZHgKKworCS8qIHVzZSBDSFMgaWYgZmFpbHMgKi8KKwlqYwljaHNfbW9kZQorCWNtcHcJJDB4YWE1NSwgJWJ4CisJam5lCWNoc19tb2RlCisKKwkvKiBjaGVjayBpZiBBSD0weDQyIGlzIHN1cHBvcnRlZCBpZiBGT1JDRV9MQkEgaXMgemVybyAqLworCU1PVl9NRU1fVE9fQUwoQUJTKGZvcmNlX2xiYSkpCS8qIG1vdmIJQUJTKGZvcmNlX2xiYSksICVhbCAqLworCXRlc3RiCSVhbCwgJWFsCisJam56CWxiYV9tb2RlCisJYW5kdwkkMSwgJWN4CisJanoJY2hzX21vZGUKKwkKK2xiYV9tb2RlOgorCS8qIHNhdmUgdGhlIHRvdGFsIG51bWJlciBvZiBzZWN0b3JzICovCisJbW92bAkweDEwKCVzaSksICVlY3gKKworCS8qIHNldCAlc2kgdG8gdGhlIGRpc2sgYWRkcmVzcyBwYWNrZXQgKi8KKwltb3Z3CSRBQlMoZGlza19hZGRyZXNzX3BhY2tldCksICVzaQorCisJLyogc2V0IHRoZSBtb2RlIHRvIG5vbi16ZXJvICovCisJbW92YgkkMSwgLTEoJXNpKQorCQorCW1vdmwJQUJTKHN0YWdlMl9zZWN0b3IpLCAlZWJ4CisKKwkvKiB0aGUgc2l6ZSBhbmQgdGhlIHJlc2VydmVkIGJ5dGUgKi8KKwltb3Z3CSQweDAwMTAsICglc2kpCisKKwkvKiB0aGUgYmxvY2tzICovCisJbW92dwkkMSwgMiglc2kpCisJCisJLyogdGhlIGFic29sdXRlIGFkZHJlc3MgKGxvdyAzMiBiaXRzKSAqLworCW1vdmwJJWVieCwgOCglc2kpCisKKwkvKiB0aGUgc2VnbWVudCBvZiBidWZmZXIgYWRkcmVzcyAqLworCW1vdncJJFNUQUdFMV9CVUZGRVJTRUcsIDYoJXNpKQorCisJeG9ybAklZWF4LCAlZWF4CisJbW92dwklYXgsIDQoJXNpKQorCW1vdmwJJWVheCwgMTIoJXNpKQorCQorLyoKKyAqIEJJT1MgY2FsbCAiSU5UIDB4MTMgRnVuY3Rpb24gMHg0MiIgdG8gcmVhZCBzZWN0b3JzIGZyb20gZGlzayBpbnRvIG1lbW9yeQorICoJQ2FsbCB3aXRoCSVhaCA9IDB4NDIKKyAqCQkJJWRsID0gZHJpdmUgbnVtYmVyCisgKgkJCSVkczolc2kgPSBzZWdtZW50Om9mZnNldCBvZiBkaXNrIGFkZHJlc3MgcGFja2V0CisgKglSZXR1cm46CisgKgkJCSVhbCA9IDB4MCBvbiBzdWNjZXNzOyBlcnIgY29kZSBvbiBmYWlsdXJlCisgKi8KKworCW1vdmIJJDB4NDIsICVhaAorCWludAkkMHgxMworCisJLyogTEJBIHJlYWQgaXMgbm90IHN1cHBvcnRlZCwgc28gZmFsbGJhY2sgdG8gQ0hTLiAgKi8KKwlqYwljaHNfbW9kZQorCisJbW92dwkkU1RBR0UxX0JVRkZFUlNFRywgJWJ4CisJam1wCWNvcHlfYnVmZmVyCisJCQorY2hzX21vZGU6CQorCS8qCisJICogIERldGVybWluZSB0aGUgaGFyZCBkaXNrIGdlb21ldHJ5IGZyb20gdGhlIEJJT1MhCisJICogIFdlIGRvIHRoaXMgZmlyc3QsIHNvIHRoYXQgTFMtMTIwIElERSBmbG9wcGllcyB3b3JrIGNvcnJlY3RseS4KKwkgKi8KKwltb3ZiCSQ4LCAlYWgKKwlpbnQJJDB4MTMKKwlqbmMJZmluYWxfaW5pdAorCisJLyoKKwkgKiAgVGhlIGNhbGwgZmFpbGVkLCBzbyBtYXliZSB1c2UgdGhlIGZsb3BweSBwcm9iZSBpbnN0ZWFkLgorCSAqLworCXRlc3RiCSRTVEFHRTFfQklPU19IRF9GTEFHLCAlZGwKKwlqeglmbG9wcHlfcHJvYmUKKworCS8qIE5vcGUsIHdlIGRlZmluaXRlbHkgaGF2ZSBhIGhhcmQgZGlzaywgYW5kIHdlJ3JlIHNjcmV3ZWQuICovCisJam1wCWhkX3Byb2JlX2Vycm9yCisKK2ZpbmFsX2luaXQ6CisJCisJbW92dwkkQUJTKHNlY3RvcnMpLCAlc2kKKworCS8qIHNldCB0aGUgbW9kZSB0byB6ZXJvICovCisJbW92YgkkMCwgLTEoJXNpKQorCQorCS8qIHNhdmUgbnVtYmVyIG9mIGhlYWRzICovCisJeG9ybAklZWF4LCAlZWF4CisJbW92YgklZGgsICVhbAorCWluY3cJJWF4CisJbW92bAklZWF4LCA0KCVzaSkKKworCXhvcncJJWR4LCAlZHgKKwltb3ZiCSVjbCwgJWRsCisJc2hsdwkkMiwgJWR4CisJbW92YgklY2gsICVhbAorCW1vdmIJJWRoLCAlYWgKKworCS8qIHNhdmUgbnVtYmVyIG9mIGN5bGluZGVycyAqLworCWluY3cJJWF4CisJbW92dwklYXgsIDgoJXNpKQorCisJeG9ydwklYXgsICVheAorCW1vdmIJJWRsLCAlYWwKKwlzaHJiCSQyLCAlYWwKKworCS8qIHNhdmUgbnVtYmVyIG9mIHNlY3RvcnMgKi8KKwltb3ZsCSVlYXgsICglc2kpCisKK3NldHVwX3NlY3RvcnM6CisJLyogbG9hZCBsb2dpY2FsIHNlY3RvciBzdGFydCAoYm90dG9tIGhhbGYpICovCisJbW92bAlBQlMoc3RhZ2UyX3NlY3RvciksICVlYXgKKworCS8qIHplcm8gJWVkeCAqLworCXhvcmwJJWVkeCwgJWVkeAorCisJLyogZGl2aWRlIGJ5IG51bWJlciBvZiBzZWN0b3JzICovCisJZGl2bAkoJXNpKQorCisJLyogc2F2ZSBzZWN0b3Igc3RhcnQgKi8KKwltb3ZiCSVkbCwgMTAoJXNpKQorCisJeG9ybAklZWR4LCAlZWR4CS8qIHplcm8gJWVkeCAqLworCWRpdmwJNCglc2kpCQkvKiBkaXZpZGUgYnkgbnVtYmVyIG9mIGhlYWRzICovCisKKwkvKiBzYXZlIGhlYWQgc3RhcnQgKi8KKwltb3ZiCSVkbCwgMTEoJXNpKQorCisJLyogc2F2ZSBjeWxpbmRlciBzdGFydCAqLworCW1vdncJJWF4LCAxMiglc2kpCisKKwkvKiBkbyB3ZSBuZWVkIHRvbyBtYW55IGN5bGluZGVycz8gKi8KKwljbXB3CTgoJXNpKSwgJWF4CisJamdlCWdlb21ldHJ5X2Vycm9yCisKKy8qCisgKiAgVGhpcyBpcyB0aGUgbG9vcCBmb3IgdGFraW5nIGNhcmUgb2YgQklPUyBnZW9tZXRyeSB0cmFuc2xhdGlvbiAodWdoISkKKyAqLworCisJLyogZ2V0IGhpZ2ggYml0cyBvZiBjeWxpbmRlciAqLworCW1vdmIJMTMoJXNpKSwgJWRsCisKKwlzaGxiCSQ2LCAlZGwJCS8qIHNoaWZ0IGxlZnQgYnkgNiBiaXRzICovCisJbW92YgkxMCglc2kpLCAlY2wJLyogZ2V0IHNlY3RvciAqLworCisJaW5jYgklY2wJCS8qIG5vcm1hbGl6ZSBzZWN0b3IgKHNlY3RvcnMgZ28KKwkJCQkJZnJvbSAxLU4sIG5vdCAwLShOLTEpICkgKi8KKwlvcmIJJWRsLCAlY2wJLyogY29tcG9zaXRlIHRvZ2V0aGVyICovCisJbW92YgkxMiglc2kpLCAlY2gJLyogc2VjdG9yK2hjeWwgaW4gY2wsIGN5bGluZGVyIGluIGNoICovCisKKwkvKiByZXN0b3JlICVkeCAqLworCXBvcHcJJWR4CisJCisJLyogaGVhZCBudW1iZXIgKi8KKwltb3ZiCTExKCVzaSksICVkaAorCisvKgorICogQklPUyBjYWxsICJJTlQgMHgxMyBGdW5jdGlvbiAweDIiIHRvIHJlYWQgc2VjdG9ycyBmcm9tIGRpc2sgaW50byBtZW1vcnkKKyAqCUNhbGwgd2l0aAklYWggPSAweDIKKyAqCQkJJWFsID0gbnVtYmVyIG9mIHNlY3RvcnMKKyAqCQkJJWNoID0gY3lsaW5kZXIKKyAqCQkJJWNsID0gc2VjdG9yIChiaXRzIDYtNyBhcmUgaGlnaCBiaXRzIG9mICJjeWxpbmRlciIpCisgKgkJCSVkaCA9IGhlYWQKKyAqCQkJJWRsID0gZHJpdmUgKDB4ODAgZm9yIGhhcmQgZGlzaywgMHgwIGZvciBmbG9wcHkgZGlzaykKKyAqCQkJJWVzOiVieCA9IHNlZ21lbnQ6b2Zmc2V0IG9mIGJ1ZmZlcgorICoJUmV0dXJuOgorICoJCQklYWwgPSAweDAgb24gc3VjY2VzczsgZXJyIGNvZGUgb24gZmFpbHVyZQorICovCisKKwltb3Z3CSRTVEFHRTFfQlVGRkVSU0VHLCAlYngKKwltb3Z3CSVieCwgJWVzCS8qIGxvYWQgJWVzIHNlZ21lbnQgd2l0aCBkaXNrIGJ1ZmZlciAqLworCisJeG9ydwklYngsICVieAkvKiAlYnggPSAwLCBwdXQgaXQgYXQgMCBpbiB0aGUgc2VnbWVudCAqLworCW1vdncJJDB4MDIwMSwgJWF4CS8qIGZ1bmN0aW9uIDIgKi8KKwlpbnQJJDB4MTMKKworCWpjCXJlYWRfZXJyb3IKKworCW1vdncJJWVzLCAlYngKKwkKK2NvcHlfYnVmZmVyOgorCW1vdncJQUJTKHN0YWdlMl9zZWdtZW50KSwgJWVzCisKKwkvKgorCSAqIFdlIG5lZWQgdG8gc2F2ZSAlY3ggYW5kICVzaSBiZWNhdXNlIHRoZSBzdGFydHVwIGNvZGUgaW4KKwkgKiBzdGFnZTIgdXNlcyB0aGVtIHdpdGhvdXQgaW5pdGlhbGl6aW5nIHRoZW0uCisJICovCisJcHVzaGEKKwlwdXNodwklZHMKKwkKKwltb3Z3CSQweDEwMCwgJWN4CisJbW92dwklYngsICVkcworCXhvcncJJXNpLCAlc2kKKwl4b3J3CSVkaSwgJWRpCisJCisJY2xkCisJCisJcmVwCisJbW92c3cKKworCXBvcHcJJWRzCisJcG9wYQorCisJLyogYm9vdCBzdGFnZTIgKi8KKwlqbXAJKihzdGFnZTJfYWRkcmVzcykKKworLyogRU5EIE9GIE1BSU4gTE9PUCAqLworCisvKgorICogQklPUyBHZW9tZXRyeSB0cmFuc2xhdGlvbiBlcnJvciAocGFzdCB0aGUgZW5kIG9mIHRoZSBkaXNrIGdlb21ldHJ5ISkuCisgKi8KK2dlb21ldHJ5X2Vycm9yOgorCU1TRyhnZW9tZXRyeV9lcnJvcl9zdHJpbmcpCisJam1wCWdlbmVyYWxfZXJyb3IKKworLyoKKyAqIERpc2sgcHJvYmUgZmFpbHVyZS4KKyAqLworaGRfcHJvYmVfZXJyb3I6CisJTVNHKGhkX3Byb2JlX2Vycm9yX3N0cmluZykKKwlqbXAJZ2VuZXJhbF9lcnJvcgorCisvKgorICogUmVhZCBlcnJvciBvbiB0aGUgZGlzay4KKyAqLworcmVhZF9lcnJvcjoKKwlNU0cocmVhZF9lcnJvcl9zdHJpbmcpCisKK2dlbmVyYWxfZXJyb3I6CisJTVNHKGdlbmVyYWxfZXJyb3Jfc3RyaW5nKQorCisvKiBnbyBoZXJlIHdoZW4geW91IG5lZWQgdG8gc3RvcCB0aGUgbWFjaGluZSBoYXJkIGFmdGVyIGFuIGVycm9yIGNvbmRpdGlvbiAqLworc3RvcDoJam1wCXN0b3AKKworbm90aWZpY2F0aW9uX3N0cmluZzoJLnN0cmluZyAiR1JVQiAiCitnZW9tZXRyeV9lcnJvcl9zdHJpbmc6CS5zdHJpbmcgIkdlb20iCitoZF9wcm9iZV9lcnJvcl9zdHJpbmc6CS5zdHJpbmcgIkhhcmQgRGlzayIKK3JlYWRfZXJyb3Jfc3RyaW5nOgkuc3RyaW5nICJSZWFkIgorZ2VuZXJhbF9lcnJvcl9zdHJpbmc6CS5zdHJpbmcgIiBFcnJvciIKKworLyoKKyAqIG1lc3NhZ2U6IHdyaXRlIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSAlc2kKKyAqCisgKiAgIFdBUk5JTkc6IHRyYXNoZXMgJXNpLCAlYXgsIGFuZCAlYngKKyAqLworCisJLyoKKwkgKiBVc2UgQklPUyAiaW50IDEwSCBGdW5jdGlvbiAwRWgiIHRvIHdyaXRlIGNoYXJhY3RlciBpbiB0ZWxldHlwZSBtb2RlCisJICoJJWFoID0gMHhlCSVhbCA9IGNoYXJhY3RlcgorCSAqCSViaCA9IHBhZ2UJJWJsID0gZm9yZWdyb3VuZCBjb2xvciAoZ3JhcGhpY3MgbW9kZXMpCisJICovCisxOgorCW1vdncJJDB4MDAwMSwgJWJ4CisJbW92YgkkMHhlLCAlYWgKKwlpbnQJJDB4MTAJCS8qIGRpc3BsYXkgYSBieXRlICovCittZXNzYWdlOgorCWxvZHNiCisJY21wYgkkMCwgJWFsCisJam5lCTFiCS8qIGlmIG5vdCBlbmQgb2Ygc3RyaW5nLCBqbXAgdG8gZGlzcGxheSAqLworCXJldAorCisJLyoKKwkgKiAgV2luZG93cyBOVCBicmVha3MgY29tcGF0aWJpbGl0eSBieSBlbWJlZGRpbmcgYSBtYWdpYworCSAqICBudW1iZXIgaGVyZS4KKwkgKi8KKworCS4gPSBfc3RhcnQgKyBTVEFHRTFfV0lORE9XU19OVF9NQUdJQworbnRfbWFnaWM6CQorCS5sb25nIDAKKwkud29yZCAwCisKKwkvKgorCSAqICBUaGlzIGlzIHdoZXJlIGFuIE1CUiB3b3VsZCBnbyBpZiBvbiBhIGhhcmQgZGlzay4gIFRoZSBjb2RlCisJICogIGhlcmUgaXNuJ3QgZXZlbiByZWZlcmVuY2VkIHVubGVzcyB3ZSdyZSBvbiBhIGZsb3BweS4gIEtpbmRhCisJICogIHNuZWFreSwgaHVoPworCSAqLworCitwYXJ0X3N0YXJ0OgkKKwkuID0gX3N0YXJ0ICsgU1RBR0UxX1BBUlRTVEFSVAorCitwcm9iZV92YWx1ZXM6CisJLmJ5dGUJMzYsIDE4LCAxNSwgOSwgMAorCitmbG9wcHlfcHJvYmU6CisvKgorICogIFBlcmZvcm0gZmxvcHB5IHByb2JlLgorICovCisKKwltb3Z3CSRBQlMocHJvYmVfdmFsdWVzLTEpLCAlc2kKKworcHJvYmVfbG9vcDoKKwkvKiByZXNldCBmbG9wcHkgY29udHJvbGxlciBJTlQgMTNoIEFIPTAgKi8KKwl4b3J3CSVheCwgJWF4CisJaW50CSQweDEzCisKKwlpbmN3CSVzaQorCW1vdmIJKCVzaSksICVjbAorCisJLyogaWYgbnVtYmVyIG9mIHNlY3RvcnMgaXMgMCwgZGlzcGxheSBlcnJvciBhbmQgZGllICovCisJY21wYgkkMCwgJWNsCisJam5lCTFmCisKKy8qCisgKiBGbG9wcHkgZGlzayBwcm9iZSBmYWlsdXJlLgorICovCisJTVNHKGZkX3Byb2JlX2Vycm9yX3N0cmluZykKKwlqbXAJZ2VuZXJhbF9lcnJvcgorCitmZF9wcm9iZV9lcnJvcl9zdHJpbmc6CS5zdHJpbmcgIkZsb3BweSIKKworMToKKwkvKiBwZXJmb3JtIHJlYWQgKi8KKwltb3Z3CSRTVEFHRTFfQlVGRkVSU0VHLCAlYngKKwltb3Z3CSQweDIwMSwgJWF4CisJbW92YgkkMCwgJWNoCisJbW92YgkkMCwgJWRoCisJaW50CSQweDEzCisKKwkvKiBpZiBlcnJvciwganVtcCB0byAicHJvYmVfbG9vcCIgKi8KKwlqYwlwcm9iZV9sb29wCisKKwkvKiAlY2wgaXMgYWxyZWFkeSB0aGUgY29ycmVjdCB2YWx1ZSEgKi8KKwltb3ZiCSQxLCAlZGgKKwltb3ZiCSQ3OSwgJWNoCisKKwlqbXAJZmluYWxfaW5pdAorCisJLiA9IF9zdGFydCArIFNUQUdFMV9QQVJURU5ECisKKy8qIHRoZSBsYXN0IDIgYnl0ZXMgaW4gdGhlIHNlY3RvciAwIGNvbnRhaW4gdGhlIHNpZ25hdHVyZSAqLworCS53b3JkCVNUQUdFMV9TSUdOQVRVUkUKZGlmZiAtLWdpdCBhL3N0YWdlMS9zdGFnZTEuaCBiL3N0YWdlMS9zdGFnZTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjMyYWRlCi0tLSAvZGV2L251bGwKKysrIGIvc3RhZ2UxL3N0YWdlMS5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMTk5OSwyMDAwLDIwMDIsMjAwNCAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBTVEFHRTFfSEVBREVSCisjZGVmaW5lIFNUQUdFMV9IRUFERVIJMQorCisKKy8qIERlZmluZSB0aGUgdmVyc2lvbiBudW1iZXJzIGhlcmUsIHNvIHRoYXQgU3RhZ2UgMSBjYW4ga25vdyB0aGVtLiAgKi8KKyNkZWZpbmUgQ09NUEFUX1ZFUlNJT05fTUFKT1IJMworI2RlZmluZSBDT01QQVRfVkVSU0lPTl9NSU5PUgkyCisjZGVmaW5lIENPTVBBVF9WRVJTSU9OCQkoKENPTVBBVF9WRVJTSU9OX01JTk9SIDw8IDgpIFwKKwkJCQkJfCBDT01QQVRfVkVSU0lPTl9NQUpPUikKKworLyogVGhlIHNpZ25hdHVyZSBmb3IgYm9vdGxvYWRlci4gICovCisjZGVmaW5lIFNUQUdFMV9TSUdOQVRVUkUJMHhhYTU1CisKKy8qIFRoZSBvZmZzZXQgb2YgdGhlIGVuZCBvZiBCUEIgKEJJT1MgUGFyYW1ldGVyIEJsb2NrKS4gICovCisjZGVmaW5lIFNUQUdFMV9CUEJFTkQJCTB4M2UKKworLyogVGhlIG9mZnNldCBvZiB0aGUgbWFqb3IgdmVyc2lvbi4gICovCisjZGVmaW5lIFNUQUdFMV9WRVJfTUFKX09GRlMJMHgzZQorCisvKiBUaGUgb2Zmc2V0IG9mIEJPT1RfRFJJVkUuICAqLworI2RlZmluZSBTVEFHRTFfQk9PVF9EUklWRQkweDQwCisKKy8qIFRoZSBvZmZzZXQgb2YgRk9SQ0VfTEJBLiAgKi8KKyNkZWZpbmUgU1RBR0UxX0ZPUkNFX0xCQQkweDQxCisKKy8qIFRoZSBvZmZzZXQgb2YgU1RBR0UyX0FERFJFU1MuICAqLworI2RlZmluZSBTVEFHRTFfU1RBR0UyX0FERFJFU1MJMHg0MgorCisvKiBUaGUgb2Zmc2V0IG9mIFNUQUdFMl9TRUNUT1IuICAqLworI2RlZmluZSBTVEFHRTFfU1RBR0UyX1NFQ1RPUgkweDQ0CisKKy8qIFRoZSBvZmZzZXQgb2YgU1RBR0UyX1NFR01FTlQuICAqLworI2RlZmluZSBTVEFHRTFfU1RBR0UyX1NFR01FTlQJMHg0OAorCisvKiBUaGUgb2Zmc2V0IG9mIEJPT1RfRFJJVkVfQ0hFQ0suICAqLworI2RlZmluZSBTVEFHRTFfQk9PVF9EUklWRV9DSEVDSwkweDRiCisKKy8qIFRoZSBvZmZzZXQgb2YgYSBtYWdpYyBudW1iZXIgdXNlZCBieSBXaW5kb3dzIE5ULiAgKi8KKyNkZWZpbmUgU1RBR0UxX1dJTkRPV1NfTlRfTUFHSUMJMHgxYjgKKworLyogVGhlIG9mZnNldCBvZiB0aGUgc3RhcnQgb2YgdGhlIHBhcnRpdGlvbiB0YWJsZS4gICovCisjZGVmaW5lIFNUQUdFMV9QQVJUU1RBUlQJMHgxYmUKKworLyogVGhlIG9mZnNldCBvZiB0aGUgZW5kIG9mIHRoZSBwYXJ0aXRpb24gdGFibGUuICAqLworI2RlZmluZSBTVEFHRTFfUEFSVEVORAkJMHgxZmUKKworLyogVGhlIHN0YWNrIHNlZ21lbnQuICAqLworI2RlZmluZSBTVEFHRTFfU1RBQ0tTRUcJCTB4MjAwMAorCisvKiBUaGUgc2VnbWVudCBvZiBkaXNrIGJ1ZmZlci4gVGhlIGRpc2sgYnVmZmVyIE1VU1QgYmUgMzJLIGxvbmcgYW5kCisgICBjYW5ub3Qgc3RyYWRkbGUgYSA2NEsgYm91bmRhcnkuICAqLworI2RlZmluZSBTVEFHRTFfQlVGRkVSU0VHCTB4NzAwMAorCisvKiBUaGUgYWRkcmVzcyBvZiBkcml2ZSBwYXJhbWV0ZXJzLiAgKi8KKyNkZWZpbmUgU1RBR0UxX0RSUF9BRERSCQkweDdmMDAKKworLyogVGhlIHNpemUgb2YgZHJpdmUgcGFyYW1ldGVycy4gICovCisjZGVmaW5lIFNUQUdFMV9EUlBfU0laRQkJMHg0MgorCisvKiBUaGUgZmxhZyBmb3IgQklPUyBkcml2ZSBudW1iZXIgdG8gZGVzaWduYXRlIGEgaGFyZCBkaXNrIHZzLiBhCisgICBmbG9wcHkuICAqLworI2RlZmluZSBTVEFHRTFfQklPU19IRF9GTEFHCTB4ODAKKworLyogVGhlIGRyaXZlIG51bWJlciBvZiBhbiBpbnZhbGlkIGRyaXZlLiAgKi8KKyNkZWZpbmUgR1JVQl9JTlZBTElEX0RSSVZFCTB4RkYKKworI2VuZGlmIC8qICEgU1RBR0UxX0hFQURFUiAqLwpkaWZmIC0tZ2l0IGEvc3RhZ2UyL01ha2VmaWxlLmFtIGIvc3RhZ2UyL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZTZkNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFnZTIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyNzIgQEAKKyMgRm9yIHRlc3QgdGFyZ2V0LgorVEVTVFMgPSBzaXplX3Rlc3QKK25vaW5zdF9TQ1JJUFRTID0gJChURVNUUykKKworIyBGb3IgZGlzdCB0YXJnZXQuCitub2luc3RfSEVBREVSUyA9IGFwaWMuaCBkZWZzLmggZGlyLmggZGlza19pbm9kZS5oIGRpc2tfaW5vZGVfZmZzLmggXAorICAgICAgICBmYXQuaCBmaWxlc3lzLmggZnJlZWJzZC5oIGZzLmggaGVyY3VsZXMuaCBpMzg2LWVsZi5oIFwKKwlpbWdhY3RfYW91dC5oIGlzbzk2NjAuaCBqZnMuaCBtYl9oZWFkZXIuaCBtYl9pbmZvLmggbWQ1LmggXAorCW5iaS5oIHBjX3NsaWNlLmggc2VyaWFsLmggc2hhcmVkLmggc21wLWltcHMuaCB0ZXJtLmggXAorCXRlcm1pbmZvLmggdHBhcm0uaCBuYmkuaCB1ZnMyLmggdnN0YWZzLmggeGZzLmgKK0VYVFJBX0RJU1QgPSBzZXRqbXAuUyBhcG0uUyAkKG5vaW5zdF9TQ1JJUFRTKQorCisjIEZvciA8c3RhZ2UxLmg+LgorSU5DTFVERVMgPSAtSSQodG9wX3NyY2Rpcikvc3RhZ2UxCisKKyMgVGhlIGxpYnJhcnkgZm9yIC9zYmluL2dydWIuCitub2luc3RfTElCUkFSSUVTID0gbGliZ3J1Yi5hCitsaWJncnViX2FfU09VUkNFUyA9IGJvb3QuYyBidWlsdGlucy5jIGNoYXJfaW8uYyBjbWRsaW5lLmMgY29tbW9uLmMgXAorCWRpc2tfaW8uYyBmc3lzX2V4dDJmcy5jIGZzeXNfZmF0LmMgZnN5c19mZnMuYyBmc3lzX2lzbzk2NjAuYyBcCisJZnN5c19qZnMuYyBmc3lzX21pbml4LmMgZnN5c19yZWlzZXJmcy5jIGZzeXNfdWZzMi5jIFwKKwlmc3lzX3ZzdGFmcy5jIGZzeXNfeGZzLmMgZ3VuemlwLmMgbWQ1LmMgc2VyaWFsLmMgc3RhZ2UyLmMgXAorCXRlcm1pbmZvLmMgdHBhcm0uYworbGliZ3J1Yl9hX0NGTEFHUyA9ICQoR1JVQl9DRkxBR1MpIC1JJCh0b3Bfc3JjZGlyKS9saWIgXAorCS1ER1JVQl9VVElMPTEgLURGU1lTX0VYVDJGUz0xIC1ERlNZU19GQVQ9MSAtREZTWVNfRkZTPTEgXAorCS1ERlNZU19JU085NjYwPTEgLURGU1lTX0pGUz0xIC1ERlNZU19NSU5JWD0xIC1ERlNZU19SRUlTRVJGUz0xIFwKKwktREZTWVNfVUZTMj0xIC1ERlNZU19WU1RBRlM9MSAtREZTWVNfWEZTPTEgXAorCS1EVVNFX01ENV9QQVNTV09SRFM9MSAtRFNVUFBPUlRfU0VSSUFMPTEgLURTVVBQT1JUX0hFUkNVTEVTPTEKKworIyBTdGFnZSAyIGFuZCBTdGFnZSAxLjUncy4KK3BrZ2xpYmRpciA9ICQobGliZGlyKS8kKFBBQ0tBR0UpLyQoaG9zdF9jcHUpLSQoaG9zdF92ZW5kb3IpCisKK0VYVFJBX1BST0dSQU1TID0gbmJsb2FkZXIuZXhlYyBweGVsb2FkZXIuZXhlYyBkaXNrbGVzcy5leGVjCisKK2lmIERJU0tMRVNTX1NVUFBPUlQKK3BrZ2xpYl9EQVRBID0gc3RhZ2UyIHN0YWdlMl9lbHRvcml0byBlMmZzX3N0YWdlMV81IGZhdF9zdGFnZTFfNSBcCisJZmZzX3N0YWdlMV81IGlzbzk2NjBfc3RhZ2UxXzUgamZzX3N0YWdlMV81IG1pbml4X3N0YWdlMV81IFwKKwlyZWlzZXJmc19zdGFnZTFfNSB1ZnMyX3N0YWdlMV81IHZzdGFmc19zdGFnZTFfNSB4ZnNfc3RhZ2UxXzUgXAorCW5iZ3J1YiBweGVncnViCitub2luc3RfREFUQSA9IHByZV9zdGFnZTIgc3RhcnQgc3RhcnRfZWx0b3JpdG8gbmJsb2FkZXIgcHhlbG9hZGVyIGRpc2tsZXNzCitub2luc3RfUFJPR1JBTVMgPSBwcmVfc3RhZ2UyLmV4ZWMgc3RhcnQuZXhlYyBzdGFydF9lbHRvcml0by5leGVjIFwKKwllMmZzX3N0YWdlMV81LmV4ZWMgZmF0X3N0YWdlMV81LmV4ZWMgZmZzX3N0YWdlMV81LmV4ZWMgXAorCWlzbzk2NjBfc3RhZ2UxXzUuZXhlYyBqZnNfc3RhZ2UxXzUuZXhlYyBtaW5peF9zdGFnZTFfNS5leGVjIFwKKwlyZWlzZXJmc19zdGFnZTFfNS5leGVjIHVmczJfc3RhZ2UxXzUuZXhlYyB2c3RhZnNfc3RhZ2UxXzUuZXhlYyBcCisJeGZzX3N0YWdlMV81LmV4ZWMgbmJsb2FkZXIuZXhlYyBweGVsb2FkZXIuZXhlYyBkaXNrbGVzcy5leGVjCitlbHNlCitwa2dsaWJfREFUQSA9IHN0YWdlMiBzdGFnZTJfZWx0b3JpdG8gZTJmc19zdGFnZTFfNSBmYXRfc3RhZ2UxXzUgXAorCWZmc19zdGFnZTFfNSBpc285NjYwX3N0YWdlMV81IGpmc19zdGFnZTFfNSBtaW5peF9zdGFnZTFfNSBcCisJcmVpc2VyZnNfc3RhZ2UxXzUgdWZzMl9zdGFnZTFfNSB2c3RhZnNfc3RhZ2UxXzUgeGZzX3N0YWdlMV81Citub2luc3RfREFUQSA9IHByZV9zdGFnZTIgc3RhcnQgc3RhcnRfZWx0b3JpdG8KK25vaW5zdF9QUk9HUkFNUyA9IHByZV9zdGFnZTIuZXhlYyBzdGFydC5leGVjIHN0YXJ0X2VsdG9yaXRvLmV4ZWMgXAorCWUyZnNfc3RhZ2UxXzUuZXhlYyBmYXRfc3RhZ2UxXzUuZXhlYyBmZnNfc3RhZ2UxXzUuZXhlYyBcCisJaXNvOTY2MF9zdGFnZTFfNS5leGVjIGpmc19zdGFnZTFfNS5leGVjIG1pbml4X3N0YWdlMV81LmV4ZWMgXAorCXJlaXNlcmZzX3N0YWdlMV81LmV4ZWMgdWZzMl9zdGFnZTFfNS5leGVjIHZzdGFmc19zdGFnZTFfNS5leGVjIFwKKwl4ZnNfc3RhZ2UxXzUuZXhlYworZW5kaWYKK01PU1RMWUNMRUFORklMRVMgPSAkKG5vaW5zdF9QUk9HUkFNUykKKworUFJFX1NUQUdFMl9MSU5LID0gLW5vc3RkbGliIC1XbCwtTiAtV2wsLVR0ZXh0IC1XbCw4MjAwCitTVEFSVF9MSU5LID0gLW5vc3RkbGliIC1XbCwtTiAtV2wsLVR0ZXh0IC1XbCw4MDAwCitOQkxPQURFUl9MSU5LID0gLW5vc3RkbGliIC1XbCwtTiAtV2wsLVR0ZXh0IC1XbCwwCitQWEVMT0FERVJfTElOSyA9IC1ub3N0ZGxpYiAtV2wsLU4gLVdsLC1UdGV4dCAtV2wsN0MwMAorU1RBUlRfRUxUT1JJVE9fTElOSyA9IC1ub3N0ZGxpYiAtV2wsLU4gLVdsLC1UdGV4dCAtV2wsN0MwMAorCitpZiBORVRCT09UX1NVUFBPUlQKK05FVEJPT1RfRkxBR1MgPSAtSSQodG9wX3NyY2RpcikvbmV0Ym9vdCAtRFNVUFBPUlRfTkVUQk9PVD0xCitlbHNlCitORVRCT09UX0ZMQUdTID0KK2VuZGlmCisKK2lmIFNFUklBTF9TVVBQT1JUCitTRVJJQUxfRkxBR1MgPSAtRFNVUFBPUlRfU0VSSUFMPTEKK2Vsc2UKK1NFUklBTF9GTEFHUyA9CitlbmRpZgorCitpZiBIRVJDVUxFU19TVVBQT1JUCitIRVJDVUxFU19GTEFHUyA9IC1EU1VQUE9SVF9IRVJDVUxFUz0xCitlbHNlCitIRVJDVUxFU19GTEFHUyA9CitlbmRpZgorCitTVEFHRTJfQ09NUElMRSA9ICQoU1RBR0UyX0NGTEFHUykgLWZuby1idWlsdGluIC1ub3N0ZGluYyBcCisJJChORVRCT09UX0ZMQUdTKSAkKFNFUklBTF9GTEFHUykgJChIRVJDVUxFU19GTEFHUykKKworU1RBR0UxXzVfTElOSyA9IC1ub3N0ZGxpYiAtV2wsLU4gLVdsLC1UdGV4dCAtV2wsMjAwMAorU1RBR0UxXzVfQ09NUElMRSA9ICQoU1RBR0UyX0NPTVBJTEUpIC1ETk9fREVDT01QUkVTU0lPTj0xIC1EU1RBR0UxXzU9MQorCisjIEZvciBzdGFnZTIgdGFyZ2V0LgorcHJlX3N0YWdlMl9leGVjX1NPVVJDRVMgPSBhc20uUyBiaW9zLmMgYm9vdC5jIGJ1aWx0aW5zLmMgY2hhcl9pby5jIFwKKwljbWRsaW5lLmMgY29tbW9uLmMgY29uc29sZS5jIGRpc2tfaW8uYyBmc3lzX2V4dDJmcy5jIFwKKwlmc3lzX2ZhdC5jIGZzeXNfZmZzLmMgZnN5c19pc285NjYwLmMgZnN5c19qZnMuYyBmc3lzX21pbml4LmMgXAorCWZzeXNfcmVpc2VyZnMuYyBmc3lzX3VmczIuYyBmc3lzX3ZzdGFmcy5jIGZzeXNfeGZzLmMgZ3VuemlwLmMgXAorCWhlcmN1bGVzLmMgbWQ1LmMgc2VyaWFsLmMgc21wLWltcHMuYyBzdGFnZTIuYyB0ZXJtaW5mby5jIHRwYXJtLmMKK3ByZV9zdGFnZTJfZXhlY19DRkxBR1MgPSAkKFNUQUdFMl9DT01QSUxFKSAkKEZTWVNfQ0ZMQUdTKQorcHJlX3N0YWdlMl9leGVjX0NDQVNGTEFHUyA9ICQoU1RBR0UyX0NPTVBJTEUpICQoRlNZU19DRkxBR1MpCitwcmVfc3RhZ2UyX2V4ZWNfTERGTEFHUyA9ICQoUFJFX1NUQUdFMl9MSU5LKQorCitpZiBORVRCT09UX1NVUFBPUlQKK3ByZV9zdGFnZTJfZXhlY19MREFERCA9IC4uL25ldGJvb3QvbGliZHJpdmVycy5hCitlbmRpZgorCitpZiBESVNLTEVTU19TVVBQT1JUCitCVUlMVF9TT1VSQ0VTID0gc3RhZ2UyX3NpemUuaCBkaXNrbGVzc19zaXplLmgKK2Vsc2UKK0JVSUxUX1NPVVJDRVMgPSBzdGFnZTJfc2l6ZS5oCitlbmRpZgorCitDTEVBTkZJTEVTID0gJChwa2dsaWJfREFUQSkgJChub2luc3RfREFUQSkgJChCVUlMVF9TT1VSQ0VTKQorCitzdGFnZTJfc2l6ZS5oOiBwcmVfc3RhZ2UyCisJLXJtIC1mIHN0YWdlMl9zaXplLmgKKwlzZXQgZHVtbXkgYGxzIC1sIHByZV9zdGFnZTJgOyBcCisJZWNobyAiI2RlZmluZSBTVEFHRTJfU0laRSAkJDYiID4gc3RhZ2UyX3NpemUuaAorCitzdGFydF9leGVjX1NPVVJDRVMgPSBzdGFydC5TCitzdGFydF9leGVjX0NDQVNGTEFHUyA9ICQoU1RBR0UyX0NPTVBJTEUpCitzdGFydF9leGVjX0xERkxBR1MgPSAkKFNUQVJUX0xJTkspCisKKyMgWFhYOiBhdXRvbWFrZSBkb2Vzbid0IHByb3ZpZGUgYSB3YXkgdG8gc3BlY2lmeSBkZXBlbmRlbmNpZXMgZm9yIG9iamVjdAorIyBmaWxlcyBleHBsaWNpdGx5LCBzbyB3ZSBtdXN0IHdyaXRlIHRoaXMgYnkgYSBnZW5lcmFsIE1ha2VmaWxlIHNjaGVtZS4KKyMgSWYgYXV0b21ha2UgY2hhbmdlIHRoZSBuYW1pbmcgc2NoZW1lIGZvciBwZXItZXhlY3V0YWJsZSBvYmplY3RzLCB0aGlzCisjIHdpbGwgYmUgYnJva2VuLgorc3RhcnRfZXhlYy1zdGFydC4kKE9CSkVYVCk6IHN0YWdlMl9zaXplLmgKKworc3RhZ2UyOiBwcmVfc3RhZ2UyIHN0YXJ0CisJLXJtIC1mIHN0YWdlMgorCWNhdCBzdGFydCBwcmVfc3RhZ2UyID4gc3RhZ2UyCisKK3N0YXJ0X2VsdG9yaXRvX2V4ZWNfU09VUkNFUyA9IHN0YXJ0X2VsdG9yaXRvLlMKK3N0YXJ0X2VsdG9yaXRvX2V4ZWNfQ0NBU0ZMQUdTID0gJChTVEFHRTJfQ09NUElMRSkKK3N0YXJ0X2VsdG9yaXRvX2V4ZWNfTERGTEFHUyA9ICQoU1RBUlRfRUxUT1JJVE9fTElOSykKKworc3RhcnRfZWx0b3JpdG9fZXhlYy1zdGFydC4kKE9CSkVYVCk6IHN0YWdlMl9zaXplLmgKKworc3RhZ2UyX2VsdG9yaXRvOiBwcmVfc3RhZ2UyIHN0YXJ0X2VsdG9yaXRvCisJLXJtIC1mIHN0YWdlMl9lbHRvcml0bworCWNhdCBzdGFydF9lbHRvcml0byBwcmVfc3RhZ2UyID4gc3RhZ2UyX2VsdG9yaXRvCisKKyMgRm9yIGUyZnNfc3RhZ2UxXzUgdGFyZ2V0LgorZTJmc19zdGFnZTFfNV9leGVjX1NPVVJDRVMgPSBzdGFydC5TIGFzbS5TIGNvbW1vbi5jIGNoYXJfaW8uYyBkaXNrX2lvLmMgXAorCXN0YWdlMV81LmMgZnN5c19leHQyZnMuYyBiaW9zLmMKK2UyZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MgPSAkKFNUQUdFMV81X0NPTVBJTEUpIC1ERlNZU19FWFQyRlM9MSBcCisJLUROT19CTE9DS19GSUxFUz0xCitlMmZzX3N0YWdlMV81X2V4ZWNfQ0NBU0ZMQUdTID0gJChTVEFHRTFfNV9DT01QSUxFKSAtREZTWVNfRVhUMkZTPTEgXAorCS1ETk9fQkxPQ0tfRklMRVM9MQorZTJmc19zdGFnZTFfNV9leGVjX0xERkxBR1MgPSAkKFNUQUdFMV81X0xJTkspCisKKyMgRm9yIGZhdF9zdGFnZTFfNSB0YXJnZXQuCitmYXRfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTID0gc3RhcnQuUyBhc20uUyBjb21tb24uYyBjaGFyX2lvLmMgZGlza19pby5jIFwKKwlzdGFnZTFfNS5jIGZzeXNfZmF0LmMgYmlvcy5jCitmYXRfc3RhZ2UxXzVfZXhlY19DRkxBR1MgPSAkKFNUQUdFMV81X0NPTVBJTEUpIC1ERlNZU19GQVQ9MSBcCisJLUROT19CTE9DS19GSUxFUz0xCitmYXRfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MgPSAkKFNUQUdFMV81X0NPTVBJTEUpIC1ERlNZU19GQVQ9MSBcCisJLUROT19CTE9DS19GSUxFUz0xCitmYXRfc3RhZ2UxXzVfZXhlY19MREZMQUdTID0gJChTVEFHRTFfNV9MSU5LKQorCisjIEZvciBmZnNfc3RhZ2UxXzUgdGFyZ2V0LgorZmZzX3N0YWdlMV81X2V4ZWNfU09VUkNFUyA9IHN0YXJ0LlMgYXNtLlMgY29tbW9uLmMgY2hhcl9pby5jIGRpc2tfaW8uYyBcCisJc3RhZ2UxXzUuYyBmc3lzX2Zmcy5jIGJpb3MuYworZmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTID0gJChTVEFHRTFfNV9DT01QSUxFKSAtREZTWVNfRkZTPTEgXAorCS1ETk9fQkxPQ0tfRklMRVM9MQorZmZzX3N0YWdlMV81X2V4ZWNfQ0NBU0ZMQUdTID0gJChTVEFHRTFfNV9DT01QSUxFKSAtREZTWVNfRkZTPTEgXAorCS1ETk9fQkxPQ0tfRklMRVM9MQorZmZzX3N0YWdlMV81X2V4ZWNfTERGTEFHUyA9ICQoU1RBR0UxXzVfTElOSykKKworIyBGb3IgdWZzMl9zdGFnZTFfNSB0YXJnZXQuCit1ZnMyX3N0YWdlMV81X2V4ZWNfU09VUkNFUyA9IHN0YXJ0LlMgYXNtLlMgY29tbW9uLmMgY2hhcl9pby5jIGRpc2tfaW8uYyBcCisJc3RhZ2UxXzUuYyBmc3lzX3VmczIuYyBiaW9zLmMKK3VmczJfc3RhZ2UxXzVfZXhlY19DRkxBR1MgPSAkKFNUQUdFMV81X0NPTVBJTEUpIC1ERlNZU19VRlMyPTEgXAorCS1ETk9fQkxPQ0tfRklMRVM9MQordWZzMl9zdGFnZTFfNV9leGVjX0NDQVNGTEFHUyA9ICQoU1RBR0UxXzVfQ09NUElMRSkgLURGU1lTX1VGUzI9MSBcCisJLUROT19CTE9DS19GSUxFUz0xCit1ZnMyX3N0YWdlMV81X2V4ZWNfTERGTEFHUyA9ICQoU1RBR0UxXzVfTElOSykKKworIyBGb3IgbWluaXhfc3RhZ2UxXzUgdGFyZ2V0LgorbWluaXhfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTID0gc3RhcnQuUyBhc20uUyBjb21tb24uYyBjaGFyX2lvLmMgZGlza19pby5jIFwKKwlzdGFnZTFfNS5jIGZzeXNfbWluaXguYyBiaW9zLmMKK21pbml4X3N0YWdlMV81X2V4ZWNfQ0ZMQUdTID0gJChTVEFHRTFfNV9DT01QSUxFKSAtREZTWVNfTUlOSVg9MSBcCisJLUROT19CTE9DS19GSUxFUz0xCittaW5peF9zdGFnZTFfNV9leGVjX0NDQVNGTEFHUyA9ICQoU1RBR0UxXzVfQ09NUElMRSkgLURGU1lTX01JTklYPTEgXAorCS1ETk9fQkxPQ0tfRklMRVM9MQorbWluaXhfc3RhZ2UxXzVfZXhlY19MREZMQUdTID0gJChTVEFHRTFfNV9MSU5LKQorCisjIEZvciByZWlzZXJmc19zdGFnZTFfNSB0YXJnZXQuCityZWlzZXJmc19zdGFnZTFfNV9leGVjX1NPVVJDRVMgPSBzdGFydC5TIGFzbS5TIGNvbW1vbi5jIGNoYXJfaW8uYyBcCisJZGlza19pby5jIHN0YWdlMV81LmMgZnN5c19yZWlzZXJmcy5jIGJpb3MuYworcmVpc2VyZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MgPSAkKFNUQUdFMV81X0NPTVBJTEUpIC1ERlNZU19SRUlTRVJGUz0xIFwKKwktRE5PX0JMT0NLX0ZJTEVTPTEKK3JlaXNlcmZzX3N0YWdlMV81X2V4ZWNfQ0NBU0ZMQUdTID0gJChTVEFHRTFfNV9DT01QSUxFKSAtREZTWVNfUkVJU0VSRlM9MSBcCisJLUROT19CTE9DS19GSUxFUz0xCityZWlzZXJmc19zdGFnZTFfNV9leGVjX0xERkxBR1MgPSAkKFNUQUdFMV81X0xJTkspCisKKyMgRm9yIHZzdGFmc19zdGFnZTFfNSB0YXJnZXQuCit2c3RhZnNfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTID0gc3RhcnQuUyBhc20uUyBjb21tb24uYyBjaGFyX2lvLmMgXAorCWRpc2tfaW8uYyBzdGFnZTFfNS5jIGZzeXNfdnN0YWZzLmMgYmlvcy5jCit2c3RhZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MgPSAkKFNUQUdFMV81X0NPTVBJTEUpIC1ERlNZU19WU1RBRlM9MSBcCisJLUROT19CTE9DS19GSUxFUz0xCit2c3RhZnNfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MgPSAkKFNUQUdFMV81X0NPTVBJTEUpIC1ERlNZU19WU1RBRlM9MSBcCisJLUROT19CTE9DS19GSUxFUz0xCit2c3RhZnNfc3RhZ2UxXzVfZXhlY19MREZMQUdTID0gJChTVEFHRTFfNV9MSU5LKQorCisjIEZvciBqZnNfc3RhZ2UxXzUgdGFyZ2V0LgoramZzX3N0YWdlMV81X2V4ZWNfU09VUkNFUyA9IHN0YXJ0LlMgYXNtLlMgY29tbW9uLmMgY2hhcl9pby5jIFwKKwlkaXNrX2lvLmMgc3RhZ2UxXzUuYyBmc3lzX2pmcy5jIGJpb3MuYworamZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTID0gJChTVEFHRTFfNV9DT01QSUxFKSAtREZTWVNfSkZTPTEgXAorCS1ETk9fQkxPQ0tfRklMRVM9MQoramZzX3N0YWdlMV81X2V4ZWNfQ0NBU0ZMQUdTID0gJChTVEFHRTFfNV9DT01QSUxFKSAtREZTWVNfSkZTPTEgXAorCS1ETk9fQkxPQ0tfRklMRVM9MQoramZzX3N0YWdlMV81X2V4ZWNfTERGTEFHUyA9ICQoU1RBR0UxXzVfTElOSykKKworIyBGb3IgeGZzX3N0YWdlMV81IHRhcmdldC4KK3hmc19zdGFnZTFfNV9leGVjX1NPVVJDRVMgPSBzdGFydC5TIGFzbS5TIGNvbW1vbi5jIGNoYXJfaW8uYyBcCisJZGlza19pby5jIHN0YWdlMV81LmMgZnN5c194ZnMuYyBiaW9zLmMKK3hmc19zdGFnZTFfNV9leGVjX0NGTEFHUyA9ICQoU1RBR0UxXzVfQ09NUElMRSkgLURGU1lTX1hGUz0xIFwKKwktRE5PX0JMT0NLX0ZJTEVTPTEKK3hmc19zdGFnZTFfNV9leGVjX0NDQVNGTEFHUyA9ICQoU1RBR0UxXzVfQ09NUElMRSkgLURGU1lTX1hGUz0xIFwKKwktRE5PX0JMT0NLX0ZJTEVTPTEKK3hmc19zdGFnZTFfNV9leGVjX0xERkxBR1MgPSAkKFNUQUdFMV81X0xJTkspCisKKyMgRm9yIGlzbzk2NjBfc3RhZ2UxXzUgdGFyZ2V0LgoraXNvOTY2MF9zdGFnZTFfNV9leGVjX1NPVVJDRVMgPSBzdGFydF9lbHRvcml0by5TIGFzbS5TIGNvbW1vbi5jIGNoYXJfaW8uYyBcCisJZGlza19pby5jIHN0YWdlMV81LmMgZnN5c19pc285NjYwLmMgYmlvcy5jCitpc285NjYwX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTID0gJChTVEFHRTFfNV9DT01QSUxFKSAtREZTWVNfSVNPOTY2MD0xIFwKKwktRE5PX0JMT0NLX0ZJTEVTPTEKK2lzbzk2NjBfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MgPSAkKFNUQUdFMV81X0NPTVBJTEUpIC1ERlNZU19JU085NjYwPTEgXAorCS1ETk9fQkxPQ0tfRklMRVM9MQoraXNvOTY2MF9zdGFnZTFfNV9leGVjX0xERkxBR1MgPSAkKFNUQUdFMV81X0xJTkspCisKKyMgRm9yIGRpc2tsZXNzIHRhcmdldC4KK2Rpc2tsZXNzX2V4ZWNfU09VUkNFUyA9ICQocHJlX3N0YWdlMl9leGVjX1NPVVJDRVMpCitkaXNrbGVzc19leGVjX0NGTEFHUyA9ICQoU1RBR0UyX0NPTVBJTEUpICQoRlNZU19DRkxBR1MpIFwKKwktRFNVUFBPUlRfRElTS0xFU1M9MQorZGlza2xlc3NfZXhlY19DQ0FTRkxBR1MgPSAkKFNUQUdFMl9DT01QSUxFKSAkKEZTWVNfQ0ZMQUdTKSBcCisJLURTVVBQT1JUX0RJU0tMRVNTPTEKK2Rpc2tsZXNzX2V4ZWNfTERGTEFHUyA9ICQoUFJFX1NUQUdFMl9MSU5LKQorZGlza2xlc3NfZXhlY19MREFERCA9IC4uL25ldGJvb3QvbGliZHJpdmVycy5hCisKK2Rpc2tsZXNzX3NpemUuaDogZGlza2xlc3MKKwktcm0gLWYgJEAKKwlzZXQgZHVtbXkgYGxzIC1sICReYDsgXAorCWVjaG8gIiNkZWZpbmUgRElTS0xFU1NfU0laRSAkJDYiID4gJEAKKworIyBGb3IgbmJsb2FkZXIgdGFyZ2V0LgorbmJsb2FkZXJfZXhlY19TT1VSQ0VTID0gbmJsb2FkZXIuUworbmJsb2FkZXJfZXhlY19DQ0FTRkxBR1MgPSAkKFNUQUdFMl9DT01QSUxFKQorbmJsb2FkZXJfZXhlY19MREZMQUdTID0gJChOQkxPQURFUl9MSU5LKQorCisjIFhYWDogU2VlIHRoZSBjb21tZW50IGZvciBzdGFydF9leGVjLXN0YXJ0Lm8uCituYmxvYWRlcl9leGVjLW5ibG9hZGVyLiQoT0JKRVhUKTogZGlza2xlc3Nfc2l6ZS5oCisKKyMgRm9yIG5iZ3J1YiB0YXJnZXQuCituYmdydWI6IG5ibG9hZGVyIGRpc2tsZXNzCisJLXJtIC1mICRACisJY2F0ICReID4gJEAKKworIyBGb3IgcHhlbG9hZGVyIHRhcmdldC4KK3B4ZWxvYWRlcl9leGVjX1NPVVJDRVMgPSBweGVsb2FkZXIuUworcHhlbG9hZGVyX2V4ZWNfQ0NBU0ZMQUdTID0gJChTVEFHRTJfQ09NUElMRSkKK3B4ZWxvYWRlcl9leGVjX0xERkxBR1MgPSAkKFBYRUxPQURFUl9MSU5LKQorCisjIFhYWDogU2VlIHRoZSBjb21tZW50IGZvciBzdGFydF9leGVjLXN0YXJ0Lm8uCitweGVsb2FkZXJfZXhlYy1weGVsb2FkZXIuJChPQkpFWFQpOiBkaXNrbGVzc19zaXplLmgKKworIyBGb3IgcHhlZ3J1YiB0YXJnZXQuCitweGVncnViOiBweGVsb2FkZXIgZGlza2xlc3MKKwktcm0gLWYgJEAKKwljYXQgJF4gPiAkQAorCisjIEdlbmVyYWwgcnVsZSBmb3IgbWFraW5nIGEgcmF3IGJpbmFyeS4KK1NVRkZJWEVTID0gLmV4ZWMKKy5leGVjOgorCSQoT0JKQ09QWSkgLU8gYmluYXJ5ICQ8ICRACmRpZmYgLS1naXQgYS9zdGFnZTIvTWFrZWZpbGUuaW4gYi9zdGFnZTIvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAwNjJiZAotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMi9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDMyNTAgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuOS40IGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworCisKKworCitTT1VSQ0VTID0gJChsaWJncnViX2FfU09VUkNFUykgJChkaXNrbGVzc19leGVjX1NPVVJDRVMpICQoZTJmc19zdGFnZTFfNV9leGVjX1NPVVJDRVMpICQoZmF0X3N0YWdlMV81X2V4ZWNfU09VUkNFUykgJChmZnNfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTKSAkKGlzbzk2NjBfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTKSAkKGpmc19zdGFnZTFfNV9leGVjX1NPVVJDRVMpICQobWluaXhfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTKSAkKG5ibG9hZGVyX2V4ZWNfU09VUkNFUykgJChwcmVfc3RhZ2UyX2V4ZWNfU09VUkNFUykgJChweGVsb2FkZXJfZXhlY19TT1VSQ0VTKSAkKHJlaXNlcmZzX3N0YWdlMV81X2V4ZWNfU09VUkNFUykgJChzdGFydF9leGVjX1NPVVJDRVMpICQoc3RhcnRfZWx0b3JpdG9fZXhlY19TT1VSQ0VTKSAkKHVmczJfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTKSAkKHZzdGFmc19zdGFnZTFfNV9leGVjX1NPVVJDRVMpICQoeGZzX3N0YWdlMV81X2V4ZWNfU09VUkNFUykKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACit0b3BfYnVpbGRkaXIgPSAuLgorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAorSU5TVEFMTCA9IEBJTlNUQUxMQAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorRVhUUkFfUFJPR1JBTVMgPSBuYmxvYWRlci5leGVjJChFWEVFWFQpIHB4ZWxvYWRlci5leGVjJChFWEVFWFQpIFwKKwlkaXNrbGVzcy5leGVjJChFWEVFWFQpCitARElTS0xFU1NfU1VQUE9SVF9GQUxTRUBub2luc3RfUFJPR1JBTVMgPSBwcmVfc3RhZ2UyLmV4ZWMkKEVYRUVYVCkgXAorQERJU0tMRVNTX1NVUFBPUlRfRkFMU0VACXN0YXJ0LmV4ZWMkKEVYRUVYVCkgXAorQERJU0tMRVNTX1NVUFBPUlRfRkFMU0VACXN0YXJ0X2VsdG9yaXRvLmV4ZWMkKEVYRUVYVCkgXAorQERJU0tMRVNTX1NVUFBPUlRfRkFMU0VACWUyZnNfc3RhZ2UxXzUuZXhlYyQoRVhFRVhUKSBcCitARElTS0xFU1NfU1VQUE9SVF9GQUxTRUAJZmF0X3N0YWdlMV81LmV4ZWMkKEVYRUVYVCkgXAorQERJU0tMRVNTX1NVUFBPUlRfRkFMU0VACWZmc19zdGFnZTFfNS5leGVjJChFWEVFWFQpIFwKK0BESVNLTEVTU19TVVBQT1JUX0ZBTFNFQAlpc285NjYwX3N0YWdlMV81LmV4ZWMkKEVYRUVYVCkgXAorQERJU0tMRVNTX1NVUFBPUlRfRkFMU0VACWpmc19zdGFnZTFfNS5leGVjJChFWEVFWFQpIFwKK0BESVNLTEVTU19TVVBQT1JUX0ZBTFNFQAltaW5peF9zdGFnZTFfNS5leGVjJChFWEVFWFQpIFwKK0BESVNLTEVTU19TVVBQT1JUX0ZBTFNFQAlyZWlzZXJmc19zdGFnZTFfNS5leGVjJChFWEVFWFQpIFwKK0BESVNLTEVTU19TVVBQT1JUX0ZBTFNFQAl1ZnMyX3N0YWdlMV81LmV4ZWMkKEVYRUVYVCkgXAorQERJU0tMRVNTX1NVUFBPUlRfRkFMU0VACXZzdGFmc19zdGFnZTFfNS5leGVjJChFWEVFWFQpIFwKK0BESVNLTEVTU19TVVBQT1JUX0ZBTFNFQAl4ZnNfc3RhZ2UxXzUuZXhlYyQoRVhFRVhUKQorQERJU0tMRVNTX1NVUFBPUlRfVFJVRUBub2luc3RfUFJPR1JBTVMgPSBwcmVfc3RhZ2UyLmV4ZWMkKEVYRUVYVCkgXAorQERJU0tMRVNTX1NVUFBPUlRfVFJVRUAJc3RhcnQuZXhlYyQoRVhFRVhUKSBcCitARElTS0xFU1NfU1VQUE9SVF9UUlVFQAlzdGFydF9lbHRvcml0by5leGVjJChFWEVFWFQpIFwKK0BESVNLTEVTU19TVVBQT1JUX1RSVUVACWUyZnNfc3RhZ2UxXzUuZXhlYyQoRVhFRVhUKSBcCitARElTS0xFU1NfU1VQUE9SVF9UUlVFQAlmYXRfc3RhZ2UxXzUuZXhlYyQoRVhFRVhUKSBcCitARElTS0xFU1NfU1VQUE9SVF9UUlVFQAlmZnNfc3RhZ2UxXzUuZXhlYyQoRVhFRVhUKSBcCitARElTS0xFU1NfU1VQUE9SVF9UUlVFQAlpc285NjYwX3N0YWdlMV81LmV4ZWMkKEVYRUVYVCkgXAorQERJU0tMRVNTX1NVUFBPUlRfVFJVRUAJamZzX3N0YWdlMV81LmV4ZWMkKEVYRUVYVCkgXAorQERJU0tMRVNTX1NVUFBPUlRfVFJVRUAJbWluaXhfc3RhZ2UxXzUuZXhlYyQoRVhFRVhUKSBcCitARElTS0xFU1NfU1VQUE9SVF9UUlVFQAlyZWlzZXJmc19zdGFnZTFfNS5leGVjJChFWEVFWFQpIFwKK0BESVNLTEVTU19TVVBQT1JUX1RSVUVACXVmczJfc3RhZ2UxXzUuZXhlYyQoRVhFRVhUKSBcCitARElTS0xFU1NfU1VQUE9SVF9UUlVFQAl2c3RhZnNfc3RhZ2UxXzUuZXhlYyQoRVhFRVhUKSBcCitARElTS0xFU1NfU1VQUE9SVF9UUlVFQAl4ZnNfc3RhZ2UxXzUuZXhlYyQoRVhFRVhUKSBcCitARElTS0xFU1NfU1VQUE9SVF9UUlVFQAluYmxvYWRlci5leGVjJChFWEVFWFQpIFwKK0BESVNLTEVTU19TVVBQT1JUX1RSVUVACXB4ZWxvYWRlci5leGVjJChFWEVFWFQpIFwKK0BESVNLTEVTU19TVVBQT1JUX1RSVUVACWRpc2tsZXNzLmV4ZWMkKEVYRUVYVCkKK3N1YmRpciA9IHN0YWdlMgorRElTVF9DT01NT04gPSAkKG5vaW5zdF9IRUFERVJTKSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gXAorCSQoc3JjZGlyKS9NYWtlZmlsZS5pbgorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorTElCUkFSSUVTID0gJChub2luc3RfTElCUkFSSUVTKQorQVIgPSBhcgorQVJGTEFHUyA9IGNydQorbGliZ3J1Yl9hX0FSID0gJChBUikgJChBUkZMQUdTKQorbGliZ3J1Yl9hX0xJQkFERCA9CithbV9saWJncnViX2FfT0JKRUNUUyA9IGxpYmdydWJfYS1ib290LiQoT0JKRVhUKSBcCisJbGliZ3J1Yl9hLWJ1aWx0aW5zLiQoT0JKRVhUKSBsaWJncnViX2EtY2hhcl9pby4kKE9CSkVYVCkgXAorCWxpYmdydWJfYS1jbWRsaW5lLiQoT0JKRVhUKSBsaWJncnViX2EtY29tbW9uLiQoT0JKRVhUKSBcCisJbGliZ3J1Yl9hLWRpc2tfaW8uJChPQkpFWFQpIGxpYmdydWJfYS1mc3lzX2V4dDJmcy4kKE9CSkVYVCkgXAorCWxpYmdydWJfYS1mc3lzX2ZhdC4kKE9CSkVYVCkgbGliZ3J1Yl9hLWZzeXNfZmZzLiQoT0JKRVhUKSBcCisJbGliZ3J1Yl9hLWZzeXNfaXNvOTY2MC4kKE9CSkVYVCkgbGliZ3J1Yl9hLWZzeXNfamZzLiQoT0JKRVhUKSBcCisJbGliZ3J1Yl9hLWZzeXNfbWluaXguJChPQkpFWFQpIFwKKwlsaWJncnViX2EtZnN5c19yZWlzZXJmcy4kKE9CSkVYVCkgXAorCWxpYmdydWJfYS1mc3lzX3VmczIuJChPQkpFWFQpIGxpYmdydWJfYS1mc3lzX3ZzdGFmcy4kKE9CSkVYVCkgXAorCWxpYmdydWJfYS1mc3lzX3hmcy4kKE9CSkVYVCkgbGliZ3J1Yl9hLWd1bnppcC4kKE9CSkVYVCkgXAorCWxpYmdydWJfYS1tZDUuJChPQkpFWFQpIGxpYmdydWJfYS1zZXJpYWwuJChPQkpFWFQpIFwKKwlsaWJncnViX2Etc3RhZ2UyLiQoT0JKRVhUKSBsaWJncnViX2EtdGVybWluZm8uJChPQkpFWFQpIFwKKwlsaWJncnViX2EtdHBhcm0uJChPQkpFWFQpCitsaWJncnViX2FfT0JKRUNUUyA9ICQoYW1fbGliZ3J1Yl9hX09CSkVDVFMpCitQUk9HUkFNUyA9ICQobm9pbnN0X1BST0dSQU1TKQorYW1fX29iamVjdHNfMSA9IGRpc2tsZXNzX2V4ZWMtYXNtLiQoT0JKRVhUKSBcCisJZGlza2xlc3NfZXhlYy1iaW9zLiQoT0JKRVhUKSBkaXNrbGVzc19leGVjLWJvb3QuJChPQkpFWFQpIFwKKwlkaXNrbGVzc19leGVjLWJ1aWx0aW5zLiQoT0JKRVhUKSBcCisJZGlza2xlc3NfZXhlYy1jaGFyX2lvLiQoT0JKRVhUKSBcCisJZGlza2xlc3NfZXhlYy1jbWRsaW5lLiQoT0JKRVhUKSBkaXNrbGVzc19leGVjLWNvbW1vbi4kKE9CSkVYVCkgXAorCWRpc2tsZXNzX2V4ZWMtY29uc29sZS4kKE9CSkVYVCkgXAorCWRpc2tsZXNzX2V4ZWMtZGlza19pby4kKE9CSkVYVCkgXAorCWRpc2tsZXNzX2V4ZWMtZnN5c19leHQyZnMuJChPQkpFWFQpIFwKKwlkaXNrbGVzc19leGVjLWZzeXNfZmF0LiQoT0JKRVhUKSBcCisJZGlza2xlc3NfZXhlYy1mc3lzX2Zmcy4kKE9CSkVYVCkgXAorCWRpc2tsZXNzX2V4ZWMtZnN5c19pc285NjYwLiQoT0JKRVhUKSBcCisJZGlza2xlc3NfZXhlYy1mc3lzX2pmcy4kKE9CSkVYVCkgXAorCWRpc2tsZXNzX2V4ZWMtZnN5c19taW5peC4kKE9CSkVYVCkgXAorCWRpc2tsZXNzX2V4ZWMtZnN5c19yZWlzZXJmcy4kKE9CSkVYVCkgXAorCWRpc2tsZXNzX2V4ZWMtZnN5c191ZnMyLiQoT0JKRVhUKSBcCisJZGlza2xlc3NfZXhlYy1mc3lzX3ZzdGFmcy4kKE9CSkVYVCkgXAorCWRpc2tsZXNzX2V4ZWMtZnN5c194ZnMuJChPQkpFWFQpIFwKKwlkaXNrbGVzc19leGVjLWd1bnppcC4kKE9CSkVYVCkgXAorCWRpc2tsZXNzX2V4ZWMtaGVyY3VsZXMuJChPQkpFWFQpIGRpc2tsZXNzX2V4ZWMtbWQ1LiQoT0JKRVhUKSBcCisJZGlza2xlc3NfZXhlYy1zZXJpYWwuJChPQkpFWFQpIFwKKwlkaXNrbGVzc19leGVjLXNtcC1pbXBzLiQoT0JKRVhUKSBcCisJZGlza2xlc3NfZXhlYy1zdGFnZTIuJChPQkpFWFQpIFwKKwlkaXNrbGVzc19leGVjLXRlcm1pbmZvLiQoT0JKRVhUKSBkaXNrbGVzc19leGVjLXRwYXJtLiQoT0JKRVhUKQorYW1fZGlza2xlc3NfZXhlY19PQkpFQ1RTID0gJChhbV9fb2JqZWN0c18xKQorZGlza2xlc3NfZXhlY19PQkpFQ1RTID0gJChhbV9kaXNrbGVzc19leGVjX09CSkVDVFMpCitkaXNrbGVzc19leGVjX0RFUEVOREVOQ0lFUyA9IC4uL25ldGJvb3QvbGliZHJpdmVycy5hCithbV9lMmZzX3N0YWdlMV81X2V4ZWNfT0JKRUNUUyA9IGUyZnNfc3RhZ2UxXzVfZXhlYy1zdGFydC4kKE9CSkVYVCkgXAorCWUyZnNfc3RhZ2UxXzVfZXhlYy1hc20uJChPQkpFWFQpIFwKKwllMmZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLiQoT0JKRVhUKSBcCisJZTJmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8uJChPQkpFWFQpIFwKKwllMmZzX3N0YWdlMV81X2V4ZWMtZGlza19pby4kKE9CSkVYVCkgXAorCWUyZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS4kKE9CSkVYVCkgXAorCWUyZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX2V4dDJmcy4kKE9CSkVYVCkgXAorCWUyZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLiQoT0JKRVhUKQorZTJmc19zdGFnZTFfNV9leGVjX09CSkVDVFMgPSAkKGFtX2UyZnNfc3RhZ2UxXzVfZXhlY19PQkpFQ1RTKQorZTJmc19zdGFnZTFfNV9leGVjX0xEQUREID0gJChMREFERCkKK2FtX2ZhdF9zdGFnZTFfNV9leGVjX09CSkVDVFMgPSBmYXRfc3RhZ2UxXzVfZXhlYy1zdGFydC4kKE9CSkVYVCkgXAorCWZhdF9zdGFnZTFfNV9leGVjLWFzbS4kKE9CSkVYVCkgXAorCWZhdF9zdGFnZTFfNV9leGVjLWNvbW1vbi4kKE9CSkVYVCkgXAorCWZhdF9zdGFnZTFfNV9leGVjLWNoYXJfaW8uJChPQkpFWFQpIFwKKwlmYXRfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLiQoT0JKRVhUKSBcCisJZmF0X3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuJChPQkpFWFQpIFwKKwlmYXRfc3RhZ2UxXzVfZXhlYy1mc3lzX2ZhdC4kKE9CSkVYVCkgXAorCWZhdF9zdGFnZTFfNV9leGVjLWJpb3MuJChPQkpFWFQpCitmYXRfc3RhZ2UxXzVfZXhlY19PQkpFQ1RTID0gJChhbV9mYXRfc3RhZ2UxXzVfZXhlY19PQkpFQ1RTKQorZmF0X3N0YWdlMV81X2V4ZWNfTERBREQgPSAkKExEQUREKQorYW1fZmZzX3N0YWdlMV81X2V4ZWNfT0JKRUNUUyA9IGZmc19zdGFnZTFfNV9leGVjLXN0YXJ0LiQoT0JKRVhUKSBcCisJZmZzX3N0YWdlMV81X2V4ZWMtYXNtLiQoT0JKRVhUKSBcCisJZmZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLiQoT0JKRVhUKSBcCisJZmZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby4kKE9CSkVYVCkgXAorCWZmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8uJChPQkpFWFQpIFwKKwlmZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS4kKE9CSkVYVCkgXAorCWZmc19zdGFnZTFfNV9leGVjLWZzeXNfZmZzLiQoT0JKRVhUKSBcCisJZmZzX3N0YWdlMV81X2V4ZWMtYmlvcy4kKE9CSkVYVCkKK2Zmc19zdGFnZTFfNV9leGVjX09CSkVDVFMgPSAkKGFtX2Zmc19zdGFnZTFfNV9leGVjX09CSkVDVFMpCitmZnNfc3RhZ2UxXzVfZXhlY19MREFERCA9ICQoTERBREQpCithbV9pc285NjYwX3N0YWdlMV81X2V4ZWNfT0JKRUNUUyA9ICBcCisJaXNvOTY2MF9zdGFnZTFfNV9leGVjLXN0YXJ0X2VsdG9yaXRvLiQoT0JKRVhUKSBcCisJaXNvOTY2MF9zdGFnZTFfNV9leGVjLWFzbS4kKE9CSkVYVCkgXAorCWlzbzk2NjBfc3RhZ2UxXzVfZXhlYy1jb21tb24uJChPQkpFWFQpIFwKKwlpc285NjYwX3N0YWdlMV81X2V4ZWMtY2hhcl9pby4kKE9CSkVYVCkgXAorCWlzbzk2NjBfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLiQoT0JKRVhUKSBcCisJaXNvOTY2MF9zdGFnZTFfNV9leGVjLXN0YWdlMV81LiQoT0JKRVhUKSBcCisJaXNvOTY2MF9zdGFnZTFfNV9leGVjLWZzeXNfaXNvOTY2MC4kKE9CSkVYVCkgXAorCWlzbzk2NjBfc3RhZ2UxXzVfZXhlYy1iaW9zLiQoT0JKRVhUKQoraXNvOTY2MF9zdGFnZTFfNV9leGVjX09CSkVDVFMgPSAkKGFtX2lzbzk2NjBfc3RhZ2UxXzVfZXhlY19PQkpFQ1RTKQoraXNvOTY2MF9zdGFnZTFfNV9leGVjX0xEQUREID0gJChMREFERCkKK2FtX2pmc19zdGFnZTFfNV9leGVjX09CSkVDVFMgPSBqZnNfc3RhZ2UxXzVfZXhlYy1zdGFydC4kKE9CSkVYVCkgXAorCWpmc19zdGFnZTFfNV9leGVjLWFzbS4kKE9CSkVYVCkgXAorCWpmc19zdGFnZTFfNV9leGVjLWNvbW1vbi4kKE9CSkVYVCkgXAorCWpmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8uJChPQkpFWFQpIFwKKwlqZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLiQoT0JKRVhUKSBcCisJamZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuJChPQkpFWFQpIFwKKwlqZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX2pmcy4kKE9CSkVYVCkgXAorCWpmc19zdGFnZTFfNV9leGVjLWJpb3MuJChPQkpFWFQpCitqZnNfc3RhZ2UxXzVfZXhlY19PQkpFQ1RTID0gJChhbV9qZnNfc3RhZ2UxXzVfZXhlY19PQkpFQ1RTKQoramZzX3N0YWdlMV81X2V4ZWNfTERBREQgPSAkKExEQUREKQorYW1fbWluaXhfc3RhZ2UxXzVfZXhlY19PQkpFQ1RTID0gbWluaXhfc3RhZ2UxXzVfZXhlYy1zdGFydC4kKE9CSkVYVCkgXAorCW1pbml4X3N0YWdlMV81X2V4ZWMtYXNtLiQoT0JKRVhUKSBcCisJbWluaXhfc3RhZ2UxXzVfZXhlYy1jb21tb24uJChPQkpFWFQpIFwKKwltaW5peF9zdGFnZTFfNV9leGVjLWNoYXJfaW8uJChPQkpFWFQpIFwKKwltaW5peF9zdGFnZTFfNV9leGVjLWRpc2tfaW8uJChPQkpFWFQpIFwKKwltaW5peF9zdGFnZTFfNV9leGVjLXN0YWdlMV81LiQoT0JKRVhUKSBcCisJbWluaXhfc3RhZ2UxXzVfZXhlYy1mc3lzX21pbml4LiQoT0JKRVhUKSBcCisJbWluaXhfc3RhZ2UxXzVfZXhlYy1iaW9zLiQoT0JKRVhUKQorbWluaXhfc3RhZ2UxXzVfZXhlY19PQkpFQ1RTID0gJChhbV9taW5peF9zdGFnZTFfNV9leGVjX09CSkVDVFMpCittaW5peF9zdGFnZTFfNV9leGVjX0xEQUREID0gJChMREFERCkKK2FtX25ibG9hZGVyX2V4ZWNfT0JKRUNUUyA9IG5ibG9hZGVyX2V4ZWMtbmJsb2FkZXIuJChPQkpFWFQpCituYmxvYWRlcl9leGVjX09CSkVDVFMgPSAkKGFtX25ibG9hZGVyX2V4ZWNfT0JKRUNUUykKK25ibG9hZGVyX2V4ZWNfTERBREQgPSAkKExEQUREKQorYW1fcHJlX3N0YWdlMl9leGVjX09CSkVDVFMgPSBwcmVfc3RhZ2UyX2V4ZWMtYXNtLiQoT0JKRVhUKSBcCisJcHJlX3N0YWdlMl9leGVjLWJpb3MuJChPQkpFWFQpIHByZV9zdGFnZTJfZXhlYy1ib290LiQoT0JKRVhUKSBcCisJcHJlX3N0YWdlMl9leGVjLWJ1aWx0aW5zLiQoT0JKRVhUKSBcCisJcHJlX3N0YWdlMl9leGVjLWNoYXJfaW8uJChPQkpFWFQpIFwKKwlwcmVfc3RhZ2UyX2V4ZWMtY21kbGluZS4kKE9CSkVYVCkgXAorCXByZV9zdGFnZTJfZXhlYy1jb21tb24uJChPQkpFWFQpIFwKKwlwcmVfc3RhZ2UyX2V4ZWMtY29uc29sZS4kKE9CSkVYVCkgXAorCXByZV9zdGFnZTJfZXhlYy1kaXNrX2lvLiQoT0JKRVhUKSBcCisJcHJlX3N0YWdlMl9leGVjLWZzeXNfZXh0MmZzLiQoT0JKRVhUKSBcCisJcHJlX3N0YWdlMl9leGVjLWZzeXNfZmF0LiQoT0JKRVhUKSBcCisJcHJlX3N0YWdlMl9leGVjLWZzeXNfZmZzLiQoT0JKRVhUKSBcCisJcHJlX3N0YWdlMl9leGVjLWZzeXNfaXNvOTY2MC4kKE9CSkVYVCkgXAorCXByZV9zdGFnZTJfZXhlYy1mc3lzX2pmcy4kKE9CSkVYVCkgXAorCXByZV9zdGFnZTJfZXhlYy1mc3lzX21pbml4LiQoT0JKRVhUKSBcCisJcHJlX3N0YWdlMl9leGVjLWZzeXNfcmVpc2VyZnMuJChPQkpFWFQpIFwKKwlwcmVfc3RhZ2UyX2V4ZWMtZnN5c191ZnMyLiQoT0JKRVhUKSBcCisJcHJlX3N0YWdlMl9leGVjLWZzeXNfdnN0YWZzLiQoT0JKRVhUKSBcCisJcHJlX3N0YWdlMl9leGVjLWZzeXNfeGZzLiQoT0JKRVhUKSBcCisJcHJlX3N0YWdlMl9leGVjLWd1bnppcC4kKE9CSkVYVCkgXAorCXByZV9zdGFnZTJfZXhlYy1oZXJjdWxlcy4kKE9CSkVYVCkgXAorCXByZV9zdGFnZTJfZXhlYy1tZDUuJChPQkpFWFQpIHByZV9zdGFnZTJfZXhlYy1zZXJpYWwuJChPQkpFWFQpIFwKKwlwcmVfc3RhZ2UyX2V4ZWMtc21wLWltcHMuJChPQkpFWFQpIFwKKwlwcmVfc3RhZ2UyX2V4ZWMtc3RhZ2UyLiQoT0JKRVhUKSBcCisJcHJlX3N0YWdlMl9leGVjLXRlcm1pbmZvLiQoT0JKRVhUKSBcCisJcHJlX3N0YWdlMl9leGVjLXRwYXJtLiQoT0JKRVhUKQorcHJlX3N0YWdlMl9leGVjX09CSkVDVFMgPSAkKGFtX3ByZV9zdGFnZTJfZXhlY19PQkpFQ1RTKQorQE5FVEJPT1RfU1VQUE9SVF9UUlVFQHByZV9zdGFnZTJfZXhlY19ERVBFTkRFTkNJRVMgPSAgXAorQE5FVEJPT1RfU1VQUE9SVF9UUlVFQAkuLi9uZXRib290L2xpYmRyaXZlcnMuYQorYW1fcHhlbG9hZGVyX2V4ZWNfT0JKRUNUUyA9IHB4ZWxvYWRlcl9leGVjLXB4ZWxvYWRlci4kKE9CSkVYVCkKK3B4ZWxvYWRlcl9leGVjX09CSkVDVFMgPSAkKGFtX3B4ZWxvYWRlcl9leGVjX09CSkVDVFMpCitweGVsb2FkZXJfZXhlY19MREFERCA9ICQoTERBREQpCithbV9yZWlzZXJmc19zdGFnZTFfNV9leGVjX09CSkVDVFMgPSAgXAorCXJlaXNlcmZzX3N0YWdlMV81X2V4ZWMtc3RhcnQuJChPQkpFWFQpIFwKKwlyZWlzZXJmc19zdGFnZTFfNV9leGVjLWFzbS4kKE9CSkVYVCkgXAorCXJlaXNlcmZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLiQoT0JKRVhUKSBcCisJcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLiQoT0JKRVhUKSBcCisJcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLiQoT0JKRVhUKSBcCisJcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS4kKE9CSkVYVCkgXAorCXJlaXNlcmZzX3N0YWdlMV81X2V4ZWMtZnN5c19yZWlzZXJmcy4kKE9CSkVYVCkgXAorCXJlaXNlcmZzX3N0YWdlMV81X2V4ZWMtYmlvcy4kKE9CSkVYVCkKK3JlaXNlcmZzX3N0YWdlMV81X2V4ZWNfT0JKRUNUUyA9ICQoYW1fcmVpc2VyZnNfc3RhZ2UxXzVfZXhlY19PQkpFQ1RTKQorcmVpc2VyZnNfc3RhZ2UxXzVfZXhlY19MREFERCA9ICQoTERBREQpCithbV9zdGFydF9leGVjX09CSkVDVFMgPSBzdGFydF9leGVjLXN0YXJ0LiQoT0JKRVhUKQorc3RhcnRfZXhlY19PQkpFQ1RTID0gJChhbV9zdGFydF9leGVjX09CSkVDVFMpCitzdGFydF9leGVjX0xEQUREID0gJChMREFERCkKK2FtX3N0YXJ0X2VsdG9yaXRvX2V4ZWNfT0JKRUNUUyA9ICBcCisJc3RhcnRfZWx0b3JpdG9fZXhlYy1zdGFydF9lbHRvcml0by4kKE9CSkVYVCkKK3N0YXJ0X2VsdG9yaXRvX2V4ZWNfT0JKRUNUUyA9ICQoYW1fc3RhcnRfZWx0b3JpdG9fZXhlY19PQkpFQ1RTKQorc3RhcnRfZWx0b3JpdG9fZXhlY19MREFERCA9ICQoTERBREQpCithbV91ZnMyX3N0YWdlMV81X2V4ZWNfT0JKRUNUUyA9IHVmczJfc3RhZ2UxXzVfZXhlYy1zdGFydC4kKE9CSkVYVCkgXAorCXVmczJfc3RhZ2UxXzVfZXhlYy1hc20uJChPQkpFWFQpIFwKKwl1ZnMyX3N0YWdlMV81X2V4ZWMtY29tbW9uLiQoT0JKRVhUKSBcCisJdWZzMl9zdGFnZTFfNV9leGVjLWNoYXJfaW8uJChPQkpFWFQpIFwKKwl1ZnMyX3N0YWdlMV81X2V4ZWMtZGlza19pby4kKE9CSkVYVCkgXAorCXVmczJfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS4kKE9CSkVYVCkgXAorCXVmczJfc3RhZ2UxXzVfZXhlYy1mc3lzX3VmczIuJChPQkpFWFQpIFwKKwl1ZnMyX3N0YWdlMV81X2V4ZWMtYmlvcy4kKE9CSkVYVCkKK3VmczJfc3RhZ2UxXzVfZXhlY19PQkpFQ1RTID0gJChhbV91ZnMyX3N0YWdlMV81X2V4ZWNfT0JKRUNUUykKK3VmczJfc3RhZ2UxXzVfZXhlY19MREFERCA9ICQoTERBREQpCithbV92c3RhZnNfc3RhZ2UxXzVfZXhlY19PQkpFQ1RTID0gIFwKKwl2c3RhZnNfc3RhZ2UxXzVfZXhlYy1zdGFydC4kKE9CSkVYVCkgXAorCXZzdGFmc19zdGFnZTFfNV9leGVjLWFzbS4kKE9CSkVYVCkgXAorCXZzdGFmc19zdGFnZTFfNV9leGVjLWNvbW1vbi4kKE9CSkVYVCkgXAorCXZzdGFmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8uJChPQkpFWFQpIFwKKwl2c3RhZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLiQoT0JKRVhUKSBcCisJdnN0YWZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuJChPQkpFWFQpIFwKKwl2c3RhZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX3ZzdGFmcy4kKE9CSkVYVCkgXAorCXZzdGFmc19zdGFnZTFfNV9leGVjLWJpb3MuJChPQkpFWFQpCit2c3RhZnNfc3RhZ2UxXzVfZXhlY19PQkpFQ1RTID0gJChhbV92c3RhZnNfc3RhZ2UxXzVfZXhlY19PQkpFQ1RTKQordnN0YWZzX3N0YWdlMV81X2V4ZWNfTERBREQgPSAkKExEQUREKQorYW1feGZzX3N0YWdlMV81X2V4ZWNfT0JKRUNUUyA9IHhmc19zdGFnZTFfNV9leGVjLXN0YXJ0LiQoT0JKRVhUKSBcCisJeGZzX3N0YWdlMV81X2V4ZWMtYXNtLiQoT0JKRVhUKSBcCisJeGZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLiQoT0JKRVhUKSBcCisJeGZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby4kKE9CSkVYVCkgXAorCXhmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8uJChPQkpFWFQpIFwKKwl4ZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS4kKE9CSkVYVCkgXAorCXhmc19zdGFnZTFfNV9leGVjLWZzeXNfeGZzLiQoT0JKRVhUKSBcCisJeGZzX3N0YWdlMV81X2V4ZWMtYmlvcy4kKE9CSkVYVCkKK3hmc19zdGFnZTFfNV9leGVjX09CSkVDVFMgPSAkKGFtX3hmc19zdGFnZTFfNV9leGVjX09CSkVDVFMpCit4ZnNfc3RhZ2UxXzVfZXhlY19MREFERCA9ICQoTERBREQpCitTQ1JJUFRTID0gJChub2luc3RfU0NSSVBUUykKK0RFRkFVTFRfSU5DTFVERVMgPSAtSS4gLUkkKHNyY2RpcikgLUkkKHRvcF9idWlsZGRpcikKK2RlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKK2FtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCitDQ0FTQ09NUElMRSA9ICQoQ0NBUykgJChBTV9DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKQorQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCisJJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorQ0NMRCA9ICQoQ0MpCitMSU5LID0gJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoQU1fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorU09VUkNFUyA9ICQobGliZ3J1Yl9hX1NPVVJDRVMpICQoZGlza2xlc3NfZXhlY19TT1VSQ0VTKSBcCisJJChlMmZzX3N0YWdlMV81X2V4ZWNfU09VUkNFUykgJChmYXRfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTKSBcCisJJChmZnNfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTKSAkKGlzbzk2NjBfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTKSBcCisJJChqZnNfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTKSAkKG1pbml4X3N0YWdlMV81X2V4ZWNfU09VUkNFUykgXAorCSQobmJsb2FkZXJfZXhlY19TT1VSQ0VTKSAkKHByZV9zdGFnZTJfZXhlY19TT1VSQ0VTKSBcCisJJChweGVsb2FkZXJfZXhlY19TT1VSQ0VTKSAkKHJlaXNlcmZzX3N0YWdlMV81X2V4ZWNfU09VUkNFUykgXAorCSQoc3RhcnRfZXhlY19TT1VSQ0VTKSAkKHN0YXJ0X2VsdG9yaXRvX2V4ZWNfU09VUkNFUykgXAorCSQodWZzMl9zdGFnZTFfNV9leGVjX1NPVVJDRVMpICQodnN0YWZzX3N0YWdlMV81X2V4ZWNfU09VUkNFUykgXAorCSQoeGZzX3N0YWdlMV81X2V4ZWNfU09VUkNFUykKK0RJU1RfU09VUkNFUyA9ICQobGliZ3J1Yl9hX1NPVVJDRVMpICQoZGlza2xlc3NfZXhlY19TT1VSQ0VTKSBcCisJJChlMmZzX3N0YWdlMV81X2V4ZWNfU09VUkNFUykgJChmYXRfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTKSBcCisJJChmZnNfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTKSAkKGlzbzk2NjBfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTKSBcCisJJChqZnNfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTKSAkKG1pbml4X3N0YWdlMV81X2V4ZWNfU09VUkNFUykgXAorCSQobmJsb2FkZXJfZXhlY19TT1VSQ0VTKSAkKHByZV9zdGFnZTJfZXhlY19TT1VSQ0VTKSBcCisJJChweGVsb2FkZXJfZXhlY19TT1VSQ0VTKSAkKHJlaXNlcmZzX3N0YWdlMV81X2V4ZWNfU09VUkNFUykgXAorCSQoc3RhcnRfZXhlY19TT1VSQ0VTKSAkKHN0YXJ0X2VsdG9yaXRvX2V4ZWNfU09VUkNFUykgXAorCSQodWZzMl9zdGFnZTFfNV9leGVjX1NPVVJDRVMpICQodnN0YWZzX3N0YWdlMV81X2V4ZWNfU09VUkNFUykgXAorCSQoeGZzX3N0YWdlMV81X2V4ZWNfU09VUkNFUykKK2FtX192cGF0aF9hZGpfc2V0dXAgPSBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAnc3wufC58ZydgOworYW1fX3ZwYXRoX2FkaiA9IGNhc2UgJCRwIGluIFwKKyAgICAkKHNyY2RpcikvKikgZj1gZWNobyAiJCRwIiB8IHNlZCAic3xeJCRzcmNkaXJzdHJpcC98fCJgOzsgXAorICAgICopIGY9JCRwOzsgXAorICBlc2FjOworYW1fX3N0cmlwX2RpciA9IGBlY2hvICQkcCB8IHNlZCAtZSAnc3xeLiovfHwnYDsKK2FtX19pbnN0YWxsZGlycyA9ICIkKERFU1RESVIpJChwa2dsaWJkaXIpIgorcGtnbGliREFUQV9JTlNUQUxMID0gJChJTlNUQUxMX0RBVEEpCitEQVRBID0gJChub2luc3RfREFUQSkgJChwa2dsaWJfREFUQSkKK0hFQURFUlMgPSAkKG5vaW5zdF9IRUFERVJTKQorRVRBR1MgPSBldGFncworQ1RBR1MgPSBjdGFncworRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKKworIyBTdGFnZSAyIGFuZCBTdGFnZSAxLjUncy4KK3BrZ2xpYmRpciA9ICQobGliZGlyKS8kKFBBQ0tBR0UpLyQoaG9zdF9jcHUpLSQoaG9zdF92ZW5kb3IpCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBTURFUF9GQUxTRSA9IEBBTURFUF9GQUxTRUAKK0FNREVQX1RSVUUgPSBAQU1ERVBfVFJVRUAKK0FNVEFSID0gQEFNVEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitCVUlMRF9FWEFNUExFX0tFUk5FTF9GQUxTRSA9IEBCVUlMRF9FWEFNUExFX0tFUk5FTF9GQUxTRUAKK0JVSUxEX0VYQU1QTEVfS0VSTkVMX1RSVUUgPSBAQlVJTERfRVhBTVBMRV9LRVJORUxfVFJVRUAKK0NDID0gQENDQAorQ0NBUyA9IEBDQ0FTQAorQ0NBU0ZMQUdTID0gQENDQVNGTEFHU0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitESVNLTEVTU19TVVBQT1JUX0ZBTFNFID0gQERJU0tMRVNTX1NVUFBPUlRfRkFMU0VACitESVNLTEVTU19TVVBQT1JUX1RSVUUgPSBARElTS0xFU1NfU1VQUE9SVF9UUlVFQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRlNZU19DRkxBR1MgPSBARlNZU19DRkxBR1NACitHUlVCX0NGTEFHUyA9IEBHUlVCX0NGTEFHU0AKK0dSVUJfTElCUyA9IEBHUlVCX0xJQlNACitIRVJDVUxFU19TVVBQT1JUX0ZBTFNFID0gQEhFUkNVTEVTX1NVUFBPUlRfRkFMU0VACitIRVJDVUxFU19TVVBQT1JUX1RSVUUgPSBASEVSQ1VMRVNfU1VQUE9SVF9UUlVFQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMREZMQUdTID0gQExERkxBR1NACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUlOVEFJTkVSX01PREVfRkFMU0UgPSBATUFJTlRBSU5FUl9NT0RFX0ZBTFNFQAorTUFJTlRBSU5FUl9NT0RFX1RSVUUgPSBATUFJTlRBSU5FUl9NT0RFX1RSVUVACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK05FVEJPT1RfRFJJVkVSUyA9IEBORVRCT09UX0RSSVZFUlNACitORVRCT09UX1NVUFBPUlRfRkFMU0UgPSBATkVUQk9PVF9TVVBQT1JUX0ZBTFNFQAorTkVUQk9PVF9TVVBQT1JUX1RSVUUgPSBATkVUQk9PVF9TVVBQT1JUX1RSVUVACitORVRfQ0ZMQUdTID0gQE5FVF9DRkxBR1NACitORVRfRVhUUkFGTEFHUyA9IEBORVRfRVhUUkFGTEFHU0AKK09CSkNPUFkgPSBAT0JKQ09QWUAKK09CSkVYVCA9IEBPQkpFWFRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAorUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACitQRVJMID0gQFBFUkxACitSQU5MSUIgPSBAUkFOTElCQAorU0VSSUFMX1NQRUVEX1NJTVVMQVRJT05fRkFMU0UgPSBAU0VSSUFMX1NQRUVEX1NJTVVMQVRJT05fRkFMU0VACitTRVJJQUxfU1BFRURfU0lNVUxBVElPTl9UUlVFID0gQFNFUklBTF9TUEVFRF9TSU1VTEFUSU9OX1RSVUVACitTRVJJQUxfU1VQUE9SVF9GQUxTRSA9IEBTRVJJQUxfU1VQUE9SVF9GQUxTRUAKK1NFUklBTF9TVVBQT1JUX1RSVUUgPSBAU0VSSUFMX1NVUFBPUlRfVFJVRUAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTVEFHRTFfQ0ZMQUdTID0gQFNUQUdFMV9DRkxBR1NACitTVEFHRTJfQ0ZMQUdTID0gQFNUQUdFMl9DRkxBR1NACitTVFJJUCA9IEBTVFJJUEAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfT0JKQ09QWSA9IEBhY19jdF9PQkpDT1BZQAorYWNfY3RfUkFOTElCID0gQGFjX2N0X1JBTkxJQkAKK2FjX2N0X1NUUklQID0gQGFjX2N0X1NUUklQQAorYW1fX2Zhc3RkZXBDQ19GQUxTRSA9IEBhbV9fZmFzdGRlcENDX0ZBTFNFQAorYW1fX2Zhc3RkZXBDQ19UUlVFID0gQGFtX19mYXN0ZGVwQ0NfVFJVRUAKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorZGF0YWRpciA9IEBkYXRhZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwcmVmaXggPSBAcHJlZml4QAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAorCisjIEZvciB0ZXN0IHRhcmdldC4KK1RFU1RTID0gc2l6ZV90ZXN0Citub2luc3RfU0NSSVBUUyA9ICQoVEVTVFMpCisKKyMgRm9yIGRpc3QgdGFyZ2V0Lgorbm9pbnN0X0hFQURFUlMgPSBhcGljLmggZGVmcy5oIGRpci5oIGRpc2tfaW5vZGUuaCBkaXNrX2lub2RlX2Zmcy5oIFwKKyAgICAgICAgZmF0LmggZmlsZXN5cy5oIGZyZWVic2QuaCBmcy5oIGhlcmN1bGVzLmggaTM4Ni1lbGYuaCBcCisJaW1nYWN0X2FvdXQuaCBpc285NjYwLmggamZzLmggbWJfaGVhZGVyLmggbWJfaW5mby5oIG1kNS5oIFwKKwluYmkuaCBwY19zbGljZS5oIHNlcmlhbC5oIHNoYXJlZC5oIHNtcC1pbXBzLmggdGVybS5oIFwKKwl0ZXJtaW5mby5oIHRwYXJtLmggbmJpLmggdWZzMi5oIHZzdGFmcy5oIHhmcy5oCisKK0VYVFJBX0RJU1QgPSBzZXRqbXAuUyBhcG0uUyAkKG5vaW5zdF9TQ1JJUFRTKQorCisjIEZvciA8c3RhZ2UxLmg+LgorSU5DTFVERVMgPSAtSSQodG9wX3NyY2Rpcikvc3RhZ2UxCisKKyMgVGhlIGxpYnJhcnkgZm9yIC9zYmluL2dydWIuCitub2luc3RfTElCUkFSSUVTID0gbGliZ3J1Yi5hCitsaWJncnViX2FfU09VUkNFUyA9IGJvb3QuYyBidWlsdGlucy5jIGNoYXJfaW8uYyBjbWRsaW5lLmMgY29tbW9uLmMgXAorCWRpc2tfaW8uYyBmc3lzX2V4dDJmcy5jIGZzeXNfZmF0LmMgZnN5c19mZnMuYyBmc3lzX2lzbzk2NjAuYyBcCisJZnN5c19qZnMuYyBmc3lzX21pbml4LmMgZnN5c19yZWlzZXJmcy5jIGZzeXNfdWZzMi5jIFwKKwlmc3lzX3ZzdGFmcy5jIGZzeXNfeGZzLmMgZ3VuemlwLmMgbWQ1LmMgc2VyaWFsLmMgc3RhZ2UyLmMgXAorCXRlcm1pbmZvLmMgdHBhcm0uYworCitsaWJncnViX2FfQ0ZMQUdTID0gJChHUlVCX0NGTEFHUykgLUkkKHRvcF9zcmNkaXIpL2xpYiBcCisJLURHUlVCX1VUSUw9MSAtREZTWVNfRVhUMkZTPTEgLURGU1lTX0ZBVD0xIC1ERlNZU19GRlM9MSBcCisJLURGU1lTX0lTTzk2NjA9MSAtREZTWVNfSkZTPTEgLURGU1lTX01JTklYPTEgLURGU1lTX1JFSVNFUkZTPTEgXAorCS1ERlNZU19VRlMyPTEgLURGU1lTX1ZTVEFGUz0xIC1ERlNZU19YRlM9MSBcCisJLURVU0VfTUQ1X1BBU1NXT1JEUz0xIC1EU1VQUE9SVF9TRVJJQUw9MSAtRFNVUFBPUlRfSEVSQ1VMRVM9MQorCitARElTS0xFU1NfU1VQUE9SVF9GQUxTRUBwa2dsaWJfREFUQSA9IHN0YWdlMiBzdGFnZTJfZWx0b3JpdG8gZTJmc19zdGFnZTFfNSBmYXRfc3RhZ2UxXzUgXAorQERJU0tMRVNTX1NVUFBPUlRfRkFMU0VACWZmc19zdGFnZTFfNSBpc285NjYwX3N0YWdlMV81IGpmc19zdGFnZTFfNSBtaW5peF9zdGFnZTFfNSBcCitARElTS0xFU1NfU1VQUE9SVF9GQUxTRUAJcmVpc2VyZnNfc3RhZ2UxXzUgdWZzMl9zdGFnZTFfNSB2c3RhZnNfc3RhZ2UxXzUgeGZzX3N0YWdlMV81CisKK0BESVNLTEVTU19TVVBQT1JUX1RSVUVAcGtnbGliX0RBVEEgPSBzdGFnZTIgc3RhZ2UyX2VsdG9yaXRvIGUyZnNfc3RhZ2UxXzUgZmF0X3N0YWdlMV81IFwKK0BESVNLTEVTU19TVVBQT1JUX1RSVUVACWZmc19zdGFnZTFfNSBpc285NjYwX3N0YWdlMV81IGpmc19zdGFnZTFfNSBtaW5peF9zdGFnZTFfNSBcCitARElTS0xFU1NfU1VQUE9SVF9UUlVFQAlyZWlzZXJmc19zdGFnZTFfNSB1ZnMyX3N0YWdlMV81IHZzdGFmc19zdGFnZTFfNSB4ZnNfc3RhZ2UxXzUgXAorQERJU0tMRVNTX1NVUFBPUlRfVFJVRUAJbmJncnViIHB4ZWdydWIKKworQERJU0tMRVNTX1NVUFBPUlRfRkFMU0VAbm9pbnN0X0RBVEEgPSBwcmVfc3RhZ2UyIHN0YXJ0IHN0YXJ0X2VsdG9yaXRvCitARElTS0xFU1NfU1VQUE9SVF9UUlVFQG5vaW5zdF9EQVRBID0gcHJlX3N0YWdlMiBzdGFydCBzdGFydF9lbHRvcml0byBuYmxvYWRlciBweGVsb2FkZXIgZGlza2xlc3MKK01PU1RMWUNMRUFORklMRVMgPSAkKG5vaW5zdF9QUk9HUkFNUykKK1BSRV9TVEFHRTJfTElOSyA9IC1ub3N0ZGxpYiAtV2wsLU4gLVdsLC1UdGV4dCAtV2wsODIwMAorU1RBUlRfTElOSyA9IC1ub3N0ZGxpYiAtV2wsLU4gLVdsLC1UdGV4dCAtV2wsODAwMAorTkJMT0FERVJfTElOSyA9IC1ub3N0ZGxpYiAtV2wsLU4gLVdsLC1UdGV4dCAtV2wsMAorUFhFTE9BREVSX0xJTksgPSAtbm9zdGRsaWIgLVdsLC1OIC1XbCwtVHRleHQgLVdsLDdDMDAKK1NUQVJUX0VMVE9SSVRPX0xJTksgPSAtbm9zdGRsaWIgLVdsLC1OIC1XbCwtVHRleHQgLVdsLDdDMDAKK0BORVRCT09UX1NVUFBPUlRfRkFMU0VATkVUQk9PVF9GTEFHUyA9IAorQE5FVEJPT1RfU1VQUE9SVF9UUlVFQE5FVEJPT1RfRkxBR1MgPSAtSSQodG9wX3NyY2RpcikvbmV0Ym9vdCAtRFNVUFBPUlRfTkVUQk9PVD0xCitAU0VSSUFMX1NVUFBPUlRfRkFMU0VAU0VSSUFMX0ZMQUdTID0gCitAU0VSSUFMX1NVUFBPUlRfVFJVRUBTRVJJQUxfRkxBR1MgPSAtRFNVUFBPUlRfU0VSSUFMPTEKK0BIRVJDVUxFU19TVVBQT1JUX0ZBTFNFQEhFUkNVTEVTX0ZMQUdTID0gCitASEVSQ1VMRVNfU1VQUE9SVF9UUlVFQEhFUkNVTEVTX0ZMQUdTID0gLURTVVBQT1JUX0hFUkNVTEVTPTEKK1NUQUdFMl9DT01QSUxFID0gJChTVEFHRTJfQ0ZMQUdTKSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jIFwKKwkkKE5FVEJPT1RfRkxBR1MpICQoU0VSSUFMX0ZMQUdTKSAkKEhFUkNVTEVTX0ZMQUdTKQorCitTVEFHRTFfNV9MSU5LID0gLW5vc3RkbGliIC1XbCwtTiAtV2wsLVR0ZXh0IC1XbCwyMDAwCitTVEFHRTFfNV9DT01QSUxFID0gJChTVEFHRTJfQ09NUElMRSkgLUROT19ERUNPTVBSRVNTSU9OPTEgLURTVEFHRTFfNT0xCisKKyMgRm9yIHN0YWdlMiB0YXJnZXQuCitwcmVfc3RhZ2UyX2V4ZWNfU09VUkNFUyA9IGFzbS5TIGJpb3MuYyBib290LmMgYnVpbHRpbnMuYyBjaGFyX2lvLmMgXAorCWNtZGxpbmUuYyBjb21tb24uYyBjb25zb2xlLmMgZGlza19pby5jIGZzeXNfZXh0MmZzLmMgXAorCWZzeXNfZmF0LmMgZnN5c19mZnMuYyBmc3lzX2lzbzk2NjAuYyBmc3lzX2pmcy5jIGZzeXNfbWluaXguYyBcCisJZnN5c19yZWlzZXJmcy5jIGZzeXNfdWZzMi5jIGZzeXNfdnN0YWZzLmMgZnN5c194ZnMuYyBndW56aXAuYyBcCisJaGVyY3VsZXMuYyBtZDUuYyBzZXJpYWwuYyBzbXAtaW1wcy5jIHN0YWdlMi5jIHRlcm1pbmZvLmMgdHBhcm0uYworCitwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTID0gJChTVEFHRTJfQ09NUElMRSkgJChGU1lTX0NGTEFHUykKK3ByZV9zdGFnZTJfZXhlY19DQ0FTRkxBR1MgPSAkKFNUQUdFMl9DT01QSUxFKSAkKEZTWVNfQ0ZMQUdTKQorcHJlX3N0YWdlMl9leGVjX0xERkxBR1MgPSAkKFBSRV9TVEFHRTJfTElOSykKK0BORVRCT09UX1NVUFBPUlRfVFJVRUBwcmVfc3RhZ2UyX2V4ZWNfTERBREQgPSAuLi9uZXRib290L2xpYmRyaXZlcnMuYQorQERJU0tMRVNTX1NVUFBPUlRfRkFMU0VAQlVJTFRfU09VUkNFUyA9IHN0YWdlMl9zaXplLmgKK0BESVNLTEVTU19TVVBQT1JUX1RSVUVAQlVJTFRfU09VUkNFUyA9IHN0YWdlMl9zaXplLmggZGlza2xlc3Nfc2l6ZS5oCitDTEVBTkZJTEVTID0gJChwa2dsaWJfREFUQSkgJChub2luc3RfREFUQSkgJChCVUlMVF9TT1VSQ0VTKQorc3RhcnRfZXhlY19TT1VSQ0VTID0gc3RhcnQuUworc3RhcnRfZXhlY19DQ0FTRkxBR1MgPSAkKFNUQUdFMl9DT01QSUxFKQorc3RhcnRfZXhlY19MREZMQUdTID0gJChTVEFSVF9MSU5LKQorc3RhcnRfZWx0b3JpdG9fZXhlY19TT1VSQ0VTID0gc3RhcnRfZWx0b3JpdG8uUworc3RhcnRfZWx0b3JpdG9fZXhlY19DQ0FTRkxBR1MgPSAkKFNUQUdFMl9DT01QSUxFKQorc3RhcnRfZWx0b3JpdG9fZXhlY19MREZMQUdTID0gJChTVEFSVF9FTFRPUklUT19MSU5LKQorCisjIEZvciBlMmZzX3N0YWdlMV81IHRhcmdldC4KK2UyZnNfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTID0gc3RhcnQuUyBhc20uUyBjb21tb24uYyBjaGFyX2lvLmMgZGlza19pby5jIFwKKwlzdGFnZTFfNS5jIGZzeXNfZXh0MmZzLmMgYmlvcy5jCisKK2UyZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MgPSAkKFNUQUdFMV81X0NPTVBJTEUpIC1ERlNZU19FWFQyRlM9MSBcCisJLUROT19CTE9DS19GSUxFUz0xCisKK2UyZnNfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MgPSAkKFNUQUdFMV81X0NPTVBJTEUpIC1ERlNZU19FWFQyRlM9MSBcCisJLUROT19CTE9DS19GSUxFUz0xCisKK2UyZnNfc3RhZ2UxXzVfZXhlY19MREZMQUdTID0gJChTVEFHRTFfNV9MSU5LKQorCisjIEZvciBmYXRfc3RhZ2UxXzUgdGFyZ2V0LgorZmF0X3N0YWdlMV81X2V4ZWNfU09VUkNFUyA9IHN0YXJ0LlMgYXNtLlMgY29tbW9uLmMgY2hhcl9pby5jIGRpc2tfaW8uYyBcCisJc3RhZ2UxXzUuYyBmc3lzX2ZhdC5jIGJpb3MuYworCitmYXRfc3RhZ2UxXzVfZXhlY19DRkxBR1MgPSAkKFNUQUdFMV81X0NPTVBJTEUpIC1ERlNZU19GQVQ9MSBcCisJLUROT19CTE9DS19GSUxFUz0xCisKK2ZhdF9zdGFnZTFfNV9leGVjX0NDQVNGTEFHUyA9ICQoU1RBR0UxXzVfQ09NUElMRSkgLURGU1lTX0ZBVD0xIFwKKwktRE5PX0JMT0NLX0ZJTEVTPTEKKworZmF0X3N0YWdlMV81X2V4ZWNfTERGTEFHUyA9ICQoU1RBR0UxXzVfTElOSykKKworIyBGb3IgZmZzX3N0YWdlMV81IHRhcmdldC4KK2Zmc19zdGFnZTFfNV9leGVjX1NPVVJDRVMgPSBzdGFydC5TIGFzbS5TIGNvbW1vbi5jIGNoYXJfaW8uYyBkaXNrX2lvLmMgXAorCXN0YWdlMV81LmMgZnN5c19mZnMuYyBiaW9zLmMKKworZmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTID0gJChTVEFHRTFfNV9DT01QSUxFKSAtREZTWVNfRkZTPTEgXAorCS1ETk9fQkxPQ0tfRklMRVM9MQorCitmZnNfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MgPSAkKFNUQUdFMV81X0NPTVBJTEUpIC1ERlNZU19GRlM9MSBcCisJLUROT19CTE9DS19GSUxFUz0xCisKK2Zmc19zdGFnZTFfNV9leGVjX0xERkxBR1MgPSAkKFNUQUdFMV81X0xJTkspCisKKyMgRm9yIHVmczJfc3RhZ2UxXzUgdGFyZ2V0LgordWZzMl9zdGFnZTFfNV9leGVjX1NPVVJDRVMgPSBzdGFydC5TIGFzbS5TIGNvbW1vbi5jIGNoYXJfaW8uYyBkaXNrX2lvLmMgXAorCXN0YWdlMV81LmMgZnN5c191ZnMyLmMgYmlvcy5jCisKK3VmczJfc3RhZ2UxXzVfZXhlY19DRkxBR1MgPSAkKFNUQUdFMV81X0NPTVBJTEUpIC1ERlNZU19VRlMyPTEgXAorCS1ETk9fQkxPQ0tfRklMRVM9MQorCit1ZnMyX3N0YWdlMV81X2V4ZWNfQ0NBU0ZMQUdTID0gJChTVEFHRTFfNV9DT01QSUxFKSAtREZTWVNfVUZTMj0xIFwKKwktRE5PX0JMT0NLX0ZJTEVTPTEKKwordWZzMl9zdGFnZTFfNV9leGVjX0xERkxBR1MgPSAkKFNUQUdFMV81X0xJTkspCisKKyMgRm9yIG1pbml4X3N0YWdlMV81IHRhcmdldC4KK21pbml4X3N0YWdlMV81X2V4ZWNfU09VUkNFUyA9IHN0YXJ0LlMgYXNtLlMgY29tbW9uLmMgY2hhcl9pby5jIGRpc2tfaW8uYyBcCisJc3RhZ2UxXzUuYyBmc3lzX21pbml4LmMgYmlvcy5jCisKK21pbml4X3N0YWdlMV81X2V4ZWNfQ0ZMQUdTID0gJChTVEFHRTFfNV9DT01QSUxFKSAtREZTWVNfTUlOSVg9MSBcCisJLUROT19CTE9DS19GSUxFUz0xCisKK21pbml4X3N0YWdlMV81X2V4ZWNfQ0NBU0ZMQUdTID0gJChTVEFHRTFfNV9DT01QSUxFKSAtREZTWVNfTUlOSVg9MSBcCisJLUROT19CTE9DS19GSUxFUz0xCisKK21pbml4X3N0YWdlMV81X2V4ZWNfTERGTEFHUyA9ICQoU1RBR0UxXzVfTElOSykKKworIyBGb3IgcmVpc2VyZnNfc3RhZ2UxXzUgdGFyZ2V0LgorcmVpc2VyZnNfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTID0gc3RhcnQuUyBhc20uUyBjb21tb24uYyBjaGFyX2lvLmMgXAorCWRpc2tfaW8uYyBzdGFnZTFfNS5jIGZzeXNfcmVpc2VyZnMuYyBiaW9zLmMKKworcmVpc2VyZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MgPSAkKFNUQUdFMV81X0NPTVBJTEUpIC1ERlNZU19SRUlTRVJGUz0xIFwKKwktRE5PX0JMT0NLX0ZJTEVTPTEKKworcmVpc2VyZnNfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MgPSAkKFNUQUdFMV81X0NPTVBJTEUpIC1ERlNZU19SRUlTRVJGUz0xIFwKKwktRE5PX0JMT0NLX0ZJTEVTPTEKKworcmVpc2VyZnNfc3RhZ2UxXzVfZXhlY19MREZMQUdTID0gJChTVEFHRTFfNV9MSU5LKQorCisjIEZvciB2c3RhZnNfc3RhZ2UxXzUgdGFyZ2V0LgordnN0YWZzX3N0YWdlMV81X2V4ZWNfU09VUkNFUyA9IHN0YXJ0LlMgYXNtLlMgY29tbW9uLmMgY2hhcl9pby5jIFwKKwlkaXNrX2lvLmMgc3RhZ2UxXzUuYyBmc3lzX3ZzdGFmcy5jIGJpb3MuYworCit2c3RhZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MgPSAkKFNUQUdFMV81X0NPTVBJTEUpIC1ERlNZU19WU1RBRlM9MSBcCisJLUROT19CTE9DS19GSUxFUz0xCisKK3ZzdGFmc19zdGFnZTFfNV9leGVjX0NDQVNGTEFHUyA9ICQoU1RBR0UxXzVfQ09NUElMRSkgLURGU1lTX1ZTVEFGUz0xIFwKKwktRE5PX0JMT0NLX0ZJTEVTPTEKKwordnN0YWZzX3N0YWdlMV81X2V4ZWNfTERGTEFHUyA9ICQoU1RBR0UxXzVfTElOSykKKworIyBGb3IgamZzX3N0YWdlMV81IHRhcmdldC4KK2pmc19zdGFnZTFfNV9leGVjX1NPVVJDRVMgPSBzdGFydC5TIGFzbS5TIGNvbW1vbi5jIGNoYXJfaW8uYyBcCisJZGlza19pby5jIHN0YWdlMV81LmMgZnN5c19qZnMuYyBiaW9zLmMKKworamZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTID0gJChTVEFHRTFfNV9DT01QSUxFKSAtREZTWVNfSkZTPTEgXAorCS1ETk9fQkxPQ0tfRklMRVM9MQorCitqZnNfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MgPSAkKFNUQUdFMV81X0NPTVBJTEUpIC1ERlNZU19KRlM9MSBcCisJLUROT19CTE9DS19GSUxFUz0xCisKK2pmc19zdGFnZTFfNV9leGVjX0xERkxBR1MgPSAkKFNUQUdFMV81X0xJTkspCisKKyMgRm9yIHhmc19zdGFnZTFfNSB0YXJnZXQuCit4ZnNfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTID0gc3RhcnQuUyBhc20uUyBjb21tb24uYyBjaGFyX2lvLmMgXAorCWRpc2tfaW8uYyBzdGFnZTFfNS5jIGZzeXNfeGZzLmMgYmlvcy5jCisKK3hmc19zdGFnZTFfNV9leGVjX0NGTEFHUyA9ICQoU1RBR0UxXzVfQ09NUElMRSkgLURGU1lTX1hGUz0xIFwKKwktRE5PX0JMT0NLX0ZJTEVTPTEKKworeGZzX3N0YWdlMV81X2V4ZWNfQ0NBU0ZMQUdTID0gJChTVEFHRTFfNV9DT01QSUxFKSAtREZTWVNfWEZTPTEgXAorCS1ETk9fQkxPQ0tfRklMRVM9MQorCit4ZnNfc3RhZ2UxXzVfZXhlY19MREZMQUdTID0gJChTVEFHRTFfNV9MSU5LKQorCisjIEZvciBpc285NjYwX3N0YWdlMV81IHRhcmdldC4KK2lzbzk2NjBfc3RhZ2UxXzVfZXhlY19TT1VSQ0VTID0gc3RhcnRfZWx0b3JpdG8uUyBhc20uUyBjb21tb24uYyBjaGFyX2lvLmMgXAorCWRpc2tfaW8uYyBzdGFnZTFfNS5jIGZzeXNfaXNvOTY2MC5jIGJpb3MuYworCitpc285NjYwX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTID0gJChTVEFHRTFfNV9DT01QSUxFKSAtREZTWVNfSVNPOTY2MD0xIFwKKwktRE5PX0JMT0NLX0ZJTEVTPTEKKworaXNvOTY2MF9zdGFnZTFfNV9leGVjX0NDQVNGTEFHUyA9ICQoU1RBR0UxXzVfQ09NUElMRSkgLURGU1lTX0lTTzk2NjA9MSBcCisJLUROT19CTE9DS19GSUxFUz0xCisKK2lzbzk2NjBfc3RhZ2UxXzVfZXhlY19MREZMQUdTID0gJChTVEFHRTFfNV9MSU5LKQorCisjIEZvciBkaXNrbGVzcyB0YXJnZXQuCitkaXNrbGVzc19leGVjX1NPVVJDRVMgPSAkKHByZV9zdGFnZTJfZXhlY19TT1VSQ0VTKQorZGlza2xlc3NfZXhlY19DRkxBR1MgPSAkKFNUQUdFMl9DT01QSUxFKSAkKEZTWVNfQ0ZMQUdTKSBcCisJLURTVVBQT1JUX0RJU0tMRVNTPTEKKworZGlza2xlc3NfZXhlY19DQ0FTRkxBR1MgPSAkKFNUQUdFMl9DT01QSUxFKSAkKEZTWVNfQ0ZMQUdTKSBcCisJLURTVVBQT1JUX0RJU0tMRVNTPTEKKworZGlza2xlc3NfZXhlY19MREZMQUdTID0gJChQUkVfU1RBR0UyX0xJTkspCitkaXNrbGVzc19leGVjX0xEQUREID0gLi4vbmV0Ym9vdC9saWJkcml2ZXJzLmEKKworIyBGb3IgbmJsb2FkZXIgdGFyZ2V0LgorbmJsb2FkZXJfZXhlY19TT1VSQ0VTID0gbmJsb2FkZXIuUworbmJsb2FkZXJfZXhlY19DQ0FTRkxBR1MgPSAkKFNUQUdFMl9DT01QSUxFKQorbmJsb2FkZXJfZXhlY19MREZMQUdTID0gJChOQkxPQURFUl9MSU5LKQorCisjIEZvciBweGVsb2FkZXIgdGFyZ2V0LgorcHhlbG9hZGVyX2V4ZWNfU09VUkNFUyA9IHB4ZWxvYWRlci5TCitweGVsb2FkZXJfZXhlY19DQ0FTRkxBR1MgPSAkKFNUQUdFMl9DT01QSUxFKQorcHhlbG9hZGVyX2V4ZWNfTERGTEFHUyA9ICQoUFhFTE9BREVSX0xJTkspCisKKyMgR2VuZXJhbCBydWxlIGZvciBtYWtpbmcgYSByYXcgYmluYXJ5LgorU1VGRklYRVMgPSAuZXhlYworYWxsOiAkKEJVSUxUX1NPVVJDRVMpCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLWFtCisKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLmV4ZWMgLlMgLmMgLm8gLm9iagorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoIFwKKwkJJiYgZXhpdCAwOyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSAgc3RhZ2UyL01ha2VmaWxlJzsgXAorCWNkICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgIHN0YWdlMi9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCitjbGVhbi1ub2luc3RMSUJSQVJJRVM6CisJLXRlc3QgLXogIiQobm9pbnN0X0xJQlJBUklFUykiIHx8IHJtIC1mICQobm9pbnN0X0xJQlJBUklFUykKK2xpYmdydWIuYTogJChsaWJncnViX2FfT0JKRUNUUykgJChsaWJncnViX2FfREVQRU5ERU5DSUVTKSAKKwktcm0gLWYgbGliZ3J1Yi5hCisJJChsaWJncnViX2FfQVIpIGxpYmdydWIuYSAkKGxpYmdydWJfYV9PQkpFQ1RTKSAkKGxpYmdydWJfYV9MSUJBREQpCisJJChSQU5MSUIpIGxpYmdydWIuYQorCitjbGVhbi1ub2luc3RQUk9HUkFNUzoKKwktdGVzdCAteiAiJChub2luc3RfUFJPR1JBTVMpIiB8fCBybSAtZiAkKG5vaW5zdF9QUk9HUkFNUykKK2Rpc2tsZXNzLmV4ZWMkKEVYRUVYVCk6ICQoZGlza2xlc3NfZXhlY19PQkpFQ1RTKSAkKGRpc2tsZXNzX2V4ZWNfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgZGlza2xlc3MuZXhlYyQoRVhFRVhUKQorCSQoTElOSykgJChkaXNrbGVzc19leGVjX0xERkxBR1MpICQoZGlza2xlc3NfZXhlY19PQkpFQ1RTKSAkKGRpc2tsZXNzX2V4ZWNfTERBREQpICQoTElCUykKK2UyZnNfc3RhZ2UxXzUuZXhlYyQoRVhFRVhUKTogJChlMmZzX3N0YWdlMV81X2V4ZWNfT0JKRUNUUykgJChlMmZzX3N0YWdlMV81X2V4ZWNfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgZTJmc19zdGFnZTFfNS5leGVjJChFWEVFWFQpCisJJChMSU5LKSAkKGUyZnNfc3RhZ2UxXzVfZXhlY19MREZMQUdTKSAkKGUyZnNfc3RhZ2UxXzVfZXhlY19PQkpFQ1RTKSAkKGUyZnNfc3RhZ2UxXzVfZXhlY19MREFERCkgJChMSUJTKQorZmF0X3N0YWdlMV81LmV4ZWMkKEVYRUVYVCk6ICQoZmF0X3N0YWdlMV81X2V4ZWNfT0JKRUNUUykgJChmYXRfc3RhZ2UxXzVfZXhlY19ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBmYXRfc3RhZ2UxXzUuZXhlYyQoRVhFRVhUKQorCSQoTElOSykgJChmYXRfc3RhZ2UxXzVfZXhlY19MREZMQUdTKSAkKGZhdF9zdGFnZTFfNV9leGVjX09CSkVDVFMpICQoZmF0X3N0YWdlMV81X2V4ZWNfTERBREQpICQoTElCUykKK2Zmc19zdGFnZTFfNS5leGVjJChFWEVFWFQpOiAkKGZmc19zdGFnZTFfNV9leGVjX09CSkVDVFMpICQoZmZzX3N0YWdlMV81X2V4ZWNfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgZmZzX3N0YWdlMV81LmV4ZWMkKEVYRUVYVCkKKwkkKExJTkspICQoZmZzX3N0YWdlMV81X2V4ZWNfTERGTEFHUykgJChmZnNfc3RhZ2UxXzVfZXhlY19PQkpFQ1RTKSAkKGZmc19zdGFnZTFfNV9leGVjX0xEQUREKSAkKExJQlMpCitpc285NjYwX3N0YWdlMV81LmV4ZWMkKEVYRUVYVCk6ICQoaXNvOTY2MF9zdGFnZTFfNV9leGVjX09CSkVDVFMpICQoaXNvOTY2MF9zdGFnZTFfNV9leGVjX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIGlzbzk2NjBfc3RhZ2UxXzUuZXhlYyQoRVhFRVhUKQorCSQoTElOSykgJChpc285NjYwX3N0YWdlMV81X2V4ZWNfTERGTEFHUykgJChpc285NjYwX3N0YWdlMV81X2V4ZWNfT0JKRUNUUykgJChpc285NjYwX3N0YWdlMV81X2V4ZWNfTERBREQpICQoTElCUykKK2pmc19zdGFnZTFfNS5leGVjJChFWEVFWFQpOiAkKGpmc19zdGFnZTFfNV9leGVjX09CSkVDVFMpICQoamZzX3N0YWdlMV81X2V4ZWNfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgamZzX3N0YWdlMV81LmV4ZWMkKEVYRUVYVCkKKwkkKExJTkspICQoamZzX3N0YWdlMV81X2V4ZWNfTERGTEFHUykgJChqZnNfc3RhZ2UxXzVfZXhlY19PQkpFQ1RTKSAkKGpmc19zdGFnZTFfNV9leGVjX0xEQUREKSAkKExJQlMpCittaW5peF9zdGFnZTFfNS5leGVjJChFWEVFWFQpOiAkKG1pbml4X3N0YWdlMV81X2V4ZWNfT0JKRUNUUykgJChtaW5peF9zdGFnZTFfNV9leGVjX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIG1pbml4X3N0YWdlMV81LmV4ZWMkKEVYRUVYVCkKKwkkKExJTkspICQobWluaXhfc3RhZ2UxXzVfZXhlY19MREZMQUdTKSAkKG1pbml4X3N0YWdlMV81X2V4ZWNfT0JKRUNUUykgJChtaW5peF9zdGFnZTFfNV9leGVjX0xEQUREKSAkKExJQlMpCituYmxvYWRlci5leGVjJChFWEVFWFQpOiAkKG5ibG9hZGVyX2V4ZWNfT0JKRUNUUykgJChuYmxvYWRlcl9leGVjX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIG5ibG9hZGVyLmV4ZWMkKEVYRUVYVCkKKwkkKExJTkspICQobmJsb2FkZXJfZXhlY19MREZMQUdTKSAkKG5ibG9hZGVyX2V4ZWNfT0JKRUNUUykgJChuYmxvYWRlcl9leGVjX0xEQUREKSAkKExJQlMpCitwcmVfc3RhZ2UyLmV4ZWMkKEVYRUVYVCk6ICQocHJlX3N0YWdlMl9leGVjX09CSkVDVFMpICQocHJlX3N0YWdlMl9leGVjX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHByZV9zdGFnZTIuZXhlYyQoRVhFRVhUKQorCSQoTElOSykgJChwcmVfc3RhZ2UyX2V4ZWNfTERGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfT0JKRUNUUykgJChwcmVfc3RhZ2UyX2V4ZWNfTERBREQpICQoTElCUykKK3B4ZWxvYWRlci5leGVjJChFWEVFWFQpOiAkKHB4ZWxvYWRlcl9leGVjX09CSkVDVFMpICQocHhlbG9hZGVyX2V4ZWNfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgcHhlbG9hZGVyLmV4ZWMkKEVYRUVYVCkKKwkkKExJTkspICQocHhlbG9hZGVyX2V4ZWNfTERGTEFHUykgJChweGVsb2FkZXJfZXhlY19PQkpFQ1RTKSAkKHB4ZWxvYWRlcl9leGVjX0xEQUREKSAkKExJQlMpCityZWlzZXJmc19zdGFnZTFfNS5leGVjJChFWEVFWFQpOiAkKHJlaXNlcmZzX3N0YWdlMV81X2V4ZWNfT0JKRUNUUykgJChyZWlzZXJmc19zdGFnZTFfNV9leGVjX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHJlaXNlcmZzX3N0YWdlMV81LmV4ZWMkKEVYRUVYVCkKKwkkKExJTkspICQocmVpc2VyZnNfc3RhZ2UxXzVfZXhlY19MREZMQUdTKSAkKHJlaXNlcmZzX3N0YWdlMV81X2V4ZWNfT0JKRUNUUykgJChyZWlzZXJmc19zdGFnZTFfNV9leGVjX0xEQUREKSAkKExJQlMpCitzdGFydC5leGVjJChFWEVFWFQpOiAkKHN0YXJ0X2V4ZWNfT0JKRUNUUykgJChzdGFydF9leGVjX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHN0YXJ0LmV4ZWMkKEVYRUVYVCkKKwkkKExJTkspICQoc3RhcnRfZXhlY19MREZMQUdTKSAkKHN0YXJ0X2V4ZWNfT0JKRUNUUykgJChzdGFydF9leGVjX0xEQUREKSAkKExJQlMpCitzdGFydF9lbHRvcml0by5leGVjJChFWEVFWFQpOiAkKHN0YXJ0X2VsdG9yaXRvX2V4ZWNfT0JKRUNUUykgJChzdGFydF9lbHRvcml0b19leGVjX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHN0YXJ0X2VsdG9yaXRvLmV4ZWMkKEVYRUVYVCkKKwkkKExJTkspICQoc3RhcnRfZWx0b3JpdG9fZXhlY19MREZMQUdTKSAkKHN0YXJ0X2VsdG9yaXRvX2V4ZWNfT0JKRUNUUykgJChzdGFydF9lbHRvcml0b19leGVjX0xEQUREKSAkKExJQlMpCit1ZnMyX3N0YWdlMV81LmV4ZWMkKEVYRUVYVCk6ICQodWZzMl9zdGFnZTFfNV9leGVjX09CSkVDVFMpICQodWZzMl9zdGFnZTFfNV9leGVjX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHVmczJfc3RhZ2UxXzUuZXhlYyQoRVhFRVhUKQorCSQoTElOSykgJCh1ZnMyX3N0YWdlMV81X2V4ZWNfTERGTEFHUykgJCh1ZnMyX3N0YWdlMV81X2V4ZWNfT0JKRUNUUykgJCh1ZnMyX3N0YWdlMV81X2V4ZWNfTERBREQpICQoTElCUykKK3ZzdGFmc19zdGFnZTFfNS5leGVjJChFWEVFWFQpOiAkKHZzdGFmc19zdGFnZTFfNV9leGVjX09CSkVDVFMpICQodnN0YWZzX3N0YWdlMV81X2V4ZWNfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgdnN0YWZzX3N0YWdlMV81LmV4ZWMkKEVYRUVYVCkKKwkkKExJTkspICQodnN0YWZzX3N0YWdlMV81X2V4ZWNfTERGTEFHUykgJCh2c3RhZnNfc3RhZ2UxXzVfZXhlY19PQkpFQ1RTKSAkKHZzdGFmc19zdGFnZTFfNV9leGVjX0xEQUREKSAkKExJQlMpCit4ZnNfc3RhZ2UxXzUuZXhlYyQoRVhFRVhUKTogJCh4ZnNfc3RhZ2UxXzVfZXhlY19PQkpFQ1RTKSAkKHhmc19zdGFnZTFfNV9leGVjX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHhmc19zdGFnZTFfNS5leGVjJChFWEVFWFQpCisJJChMSU5LKSAkKHhmc19zdGFnZTFfNV9leGVjX0xERkxBR1MpICQoeGZzX3N0YWdlMV81X2V4ZWNfT0JKRUNUUykgJCh4ZnNfc3RhZ2UxXzVfZXhlY19MREFERCkgJChMSUJTKQorCittb3N0bHljbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLiQoT0JKRVhUKQorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZGlza2xlc3NfZXhlYy1iaW9zLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kaXNrbGVzc19leGVjLWJvb3QuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtYnVpbHRpbnMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtY2hhcl9pby5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZGlza2xlc3NfZXhlYy1jbWRsaW5lLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kaXNrbGVzc19leGVjLWNvbW1vbi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZGlza2xlc3NfZXhlYy1jb25zb2xlLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kaXNrbGVzc19leGVjLWRpc2tfaW8uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c19leHQyZnMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c19mYXQuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c19mZnMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c19pc285NjYwLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfamZzLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfbWluaXguUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c19yZWlzZXJmcy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX3VmczIuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c192c3RhZnMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c194ZnMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZ3VuemlwLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kaXNrbGVzc19leGVjLWhlcmN1bGVzLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kaXNrbGVzc19leGVjLW1kNS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZGlza2xlc3NfZXhlYy1zZXJpYWwuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtc21wLWltcHMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtc3RhZ2UyLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kaXNrbGVzc19leGVjLXRlcm1pbmZvLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9kaXNrbGVzc19leGVjLXRwYXJtLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9lMmZzX3N0YWdlMV81X2V4ZWMtYmlvcy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZTJmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2UyZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2UyZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9lMmZzX3N0YWdlMV81X2V4ZWMtZnN5c19leHQyZnMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2UyZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZmF0X3N0YWdlMV81X2V4ZWMtYmlvcy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZmF0X3N0YWdlMV81X2V4ZWMtY2hhcl9pby5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZmF0X3N0YWdlMV81X2V4ZWMtY29tbW9uLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9mYXRfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9mYXRfc3RhZ2UxXzVfZXhlYy1mc3lzX2ZhdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZmF0X3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2Zmc19zdGFnZTFfNV9leGVjLWJpb3MuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2Zmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2Zmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZmZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZmZzX3N0YWdlMV81X2V4ZWMtZnN5c19mZnMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2Zmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9pc285NjYwX3N0YWdlMV81X2V4ZWMtYmlvcy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvaXNvOTY2MF9zdGFnZTFfNV9leGVjLWNoYXJfaW8uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1jb21tb24uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9pc285NjYwX3N0YWdlMV81X2V4ZWMtZnN5c19pc285NjYwLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9pc285NjYwX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2pmc19zdGFnZTFfNV9leGVjLWJpb3MuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2pmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2pmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvamZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvamZzX3N0YWdlMV81X2V4ZWMtZnN5c19qZnMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2pmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJncnViX2EtYm9vdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZ3J1Yl9hLWJ1aWx0aW5zLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJncnViX2EtY2hhcl9pby5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZ3J1Yl9hLWNtZGxpbmUuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdydWJfYS1jb21tb24uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdydWJfYS1kaXNrX2lvLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJncnViX2EtZnN5c19leHQyZnMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdydWJfYS1mc3lzX2ZhdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfZmZzLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJncnViX2EtZnN5c19pc285NjYwLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJncnViX2EtZnN5c19qZnMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdydWJfYS1mc3lzX21pbml4LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJncnViX2EtZnN5c19yZWlzZXJmcy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfdWZzMi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfdnN0YWZzLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9saWJncnViX2EtZnN5c194ZnMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdydWJfYS1ndW56aXAuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdydWJfYS1tZDUuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdydWJfYS1zZXJpYWwuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdydWJfYS1zdGFnZTIuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2xpYmdydWJfYS10ZXJtaW5mby5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbGliZ3J1Yl9hLXRwYXJtLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9taW5peF9zdGFnZTFfNV9leGVjLWJpb3MuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21pbml4X3N0YWdlMV81X2V4ZWMtY2hhcl9pby5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbWluaXhfc3RhZ2UxXzVfZXhlYy1jb21tb24uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21pbml4X3N0YWdlMV81X2V4ZWMtZGlza19pby5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbWluaXhfc3RhZ2UxXzVfZXhlYy1mc3lzX21pbml4LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9taW5peF9zdGFnZTFfNV9leGVjLXN0YWdlMV81LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtYmlvcy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWJvb3QuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1idWlsdGlucy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWNoYXJfaW8uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1jbWRsaW5lLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtY29tbW9uLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtY29uc29sZS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWRpc2tfaW8uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX2V4dDJmcy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWZzeXNfZmF0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c19mZnMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX2lzbzk2NjAuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX2pmcy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWZzeXNfbWluaXguUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX3JlaXNlcmZzLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c191ZnMyLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c192c3RhZnMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX3hmcy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWd1bnppcC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWhlcmN1bGVzLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtbWQ1LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtc2VyaWFsLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtc21wLWltcHMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1zdGFnZTIuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy10ZXJtaW5mby5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcHJlX3N0YWdlMl9leGVjLXRwYXJtLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9yZWlzZXJmc19zdGFnZTFfNV9leGVjLWJpb3MuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX3JlaXNlcmZzLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9yZWlzZXJmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS91ZnMyX3N0YWdlMV81X2V4ZWMtYmlvcy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvdWZzMl9zdGFnZTFfNV9leGVjLWNoYXJfaW8uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3VmczJfc3RhZ2UxXzVfZXhlYy1jb21tb24uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3VmczJfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS91ZnMyX3N0YWdlMV81X2V4ZWMtZnN5c191ZnMyLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS91ZnMyX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3ZzdGFmc19zdGFnZTFfNV9leGVjLWJpb3MuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3ZzdGFmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3ZzdGFmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvdnN0YWZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvdnN0YWZzX3N0YWdlMV81X2V4ZWMtZnN5c192c3RhZnMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3ZzdGFmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS94ZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS94ZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS94ZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3hmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3hmc19zdGFnZTFfNV9leGVjLWZzeXNfeGZzLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS94ZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5Qb0BhbV9fcXVvdGVACisKKy5TLm86CisJJChDQ0FTQ09NUElMRSkgLWMgJDwKKworLlMub2JqOgorCSQoQ0NBU0NPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKKworZGlza2xlc3NfZXhlYy1hc20ubzogYXNtLlMKKwkkKENDQVMpICQoZGlza2xlc3NfZXhlY19DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLWFzbS5vIGB0ZXN0IC1mICdhc20uUycgfHwgZWNobyAnJChzcmNkaXIpLydgYXNtLlMKKworZGlza2xlc3NfZXhlYy1hc20ub2JqOiBhc20uUworCSQoQ0NBUykgJChkaXNrbGVzc19leGVjX0NDQVNGTEFHUykgJChDQ0FTRkxBR1MpIC1jIC1vIGRpc2tsZXNzX2V4ZWMtYXNtLm9iaiBgaWYgdGVzdCAtZiAnYXNtLlMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYXNtLlMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2FzbS5TJzsgZmlgCisKK2UyZnNfc3RhZ2UxXzVfZXhlYy1zdGFydC5vOiBzdGFydC5TCisJJChDQ0FTKSAkKGUyZnNfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKSAtYyAtbyBlMmZzX3N0YWdlMV81X2V4ZWMtc3RhcnQubyBgdGVzdCAtZiAnc3RhcnQuUycgfHwgZWNobyAnJChzcmNkaXIpLydgc3RhcnQuUworCitlMmZzX3N0YWdlMV81X2V4ZWMtc3RhcnQub2JqOiBzdGFydC5TCisJJChDQ0FTKSAkKGUyZnNfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKSAtYyAtbyBlMmZzX3N0YWdlMV81X2V4ZWMtc3RhcnQub2JqIGBpZiB0ZXN0IC1mICdzdGFydC5TJzsgdGhlbiAkKENZR1BBVEhfVykgJ3N0YXJ0LlMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N0YXJ0LlMnOyBmaWAKKworZTJmc19zdGFnZTFfNV9leGVjLWFzbS5vOiBhc20uUworCSQoQ0NBUykgJChlMmZzX3N0YWdlMV81X2V4ZWNfQ0NBU0ZMQUdTKSAkKENDQVNGTEFHUykgLWMgLW8gZTJmc19zdGFnZTFfNV9leGVjLWFzbS5vIGB0ZXN0IC1mICdhc20uUycgfHwgZWNobyAnJChzcmNkaXIpLydgYXNtLlMKKworZTJmc19zdGFnZTFfNV9leGVjLWFzbS5vYmo6IGFzbS5TCisJJChDQ0FTKSAkKGUyZnNfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKSAtYyAtbyBlMmZzX3N0YWdlMV81X2V4ZWMtYXNtLm9iaiBgaWYgdGVzdCAtZiAnYXNtLlMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYXNtLlMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2FzbS5TJzsgZmlgCisKK2ZhdF9zdGFnZTFfNV9leGVjLXN0YXJ0Lm86IHN0YXJ0LlMKKwkkKENDQVMpICQoZmF0X3N0YWdlMV81X2V4ZWNfQ0NBU0ZMQUdTKSAkKENDQVNGTEFHUykgLWMgLW8gZmF0X3N0YWdlMV81X2V4ZWMtc3RhcnQubyBgdGVzdCAtZiAnc3RhcnQuUycgfHwgZWNobyAnJChzcmNkaXIpLydgc3RhcnQuUworCitmYXRfc3RhZ2UxXzVfZXhlYy1zdGFydC5vYmo6IHN0YXJ0LlMKKwkkKENDQVMpICQoZmF0X3N0YWdlMV81X2V4ZWNfQ0NBU0ZMQUdTKSAkKENDQVNGTEFHUykgLWMgLW8gZmF0X3N0YWdlMV81X2V4ZWMtc3RhcnQub2JqIGBpZiB0ZXN0IC1mICdzdGFydC5TJzsgdGhlbiAkKENZR1BBVEhfVykgJ3N0YXJ0LlMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N0YXJ0LlMnOyBmaWAKKworZmF0X3N0YWdlMV81X2V4ZWMtYXNtLm86IGFzbS5TCisJJChDQ0FTKSAkKGZhdF9zdGFnZTFfNV9leGVjX0NDQVNGTEFHUykgJChDQ0FTRkxBR1MpIC1jIC1vIGZhdF9zdGFnZTFfNV9leGVjLWFzbS5vIGB0ZXN0IC1mICdhc20uUycgfHwgZWNobyAnJChzcmNkaXIpLydgYXNtLlMKKworZmF0X3N0YWdlMV81X2V4ZWMtYXNtLm9iajogYXNtLlMKKwkkKENDQVMpICQoZmF0X3N0YWdlMV81X2V4ZWNfQ0NBU0ZMQUdTKSAkKENDQVNGTEFHUykgLWMgLW8gZmF0X3N0YWdlMV81X2V4ZWMtYXNtLm9iaiBgaWYgdGVzdCAtZiAnYXNtLlMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYXNtLlMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2FzbS5TJzsgZmlgCisKK2Zmc19zdGFnZTFfNV9leGVjLXN0YXJ0Lm86IHN0YXJ0LlMKKwkkKENDQVMpICQoZmZzX3N0YWdlMV81X2V4ZWNfQ0NBU0ZMQUdTKSAkKENDQVNGTEFHUykgLWMgLW8gZmZzX3N0YWdlMV81X2V4ZWMtc3RhcnQubyBgdGVzdCAtZiAnc3RhcnQuUycgfHwgZWNobyAnJChzcmNkaXIpLydgc3RhcnQuUworCitmZnNfc3RhZ2UxXzVfZXhlYy1zdGFydC5vYmo6IHN0YXJ0LlMKKwkkKENDQVMpICQoZmZzX3N0YWdlMV81X2V4ZWNfQ0NBU0ZMQUdTKSAkKENDQVNGTEFHUykgLWMgLW8gZmZzX3N0YWdlMV81X2V4ZWMtc3RhcnQub2JqIGBpZiB0ZXN0IC1mICdzdGFydC5TJzsgdGhlbiAkKENZR1BBVEhfVykgJ3N0YXJ0LlMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N0YXJ0LlMnOyBmaWAKKworZmZzX3N0YWdlMV81X2V4ZWMtYXNtLm86IGFzbS5TCisJJChDQ0FTKSAkKGZmc19zdGFnZTFfNV9leGVjX0NDQVNGTEFHUykgJChDQ0FTRkxBR1MpIC1jIC1vIGZmc19zdGFnZTFfNV9leGVjLWFzbS5vIGB0ZXN0IC1mICdhc20uUycgfHwgZWNobyAnJChzcmNkaXIpLydgYXNtLlMKKworZmZzX3N0YWdlMV81X2V4ZWMtYXNtLm9iajogYXNtLlMKKwkkKENDQVMpICQoZmZzX3N0YWdlMV81X2V4ZWNfQ0NBU0ZMQUdTKSAkKENDQVNGTEFHUykgLWMgLW8gZmZzX3N0YWdlMV81X2V4ZWMtYXNtLm9iaiBgaWYgdGVzdCAtZiAnYXNtLlMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYXNtLlMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2FzbS5TJzsgZmlgCisKK2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1zdGFydF9lbHRvcml0by5vOiBzdGFydF9lbHRvcml0by5TCisJJChDQ0FTKSAkKGlzbzk2NjBfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKSAtYyAtbyBpc285NjYwX3N0YWdlMV81X2V4ZWMtc3RhcnRfZWx0b3JpdG8ubyBgdGVzdCAtZiAnc3RhcnRfZWx0b3JpdG8uUycgfHwgZWNobyAnJChzcmNkaXIpLydgc3RhcnRfZWx0b3JpdG8uUworCitpc285NjYwX3N0YWdlMV81X2V4ZWMtc3RhcnRfZWx0b3JpdG8ub2JqOiBzdGFydF9lbHRvcml0by5TCisJJChDQ0FTKSAkKGlzbzk2NjBfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKSAtYyAtbyBpc285NjYwX3N0YWdlMV81X2V4ZWMtc3RhcnRfZWx0b3JpdG8ub2JqIGBpZiB0ZXN0IC1mICdzdGFydF9lbHRvcml0by5TJzsgdGhlbiAkKENZR1BBVEhfVykgJ3N0YXJ0X2VsdG9yaXRvLlMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N0YXJ0X2VsdG9yaXRvLlMnOyBmaWAKKworaXNvOTY2MF9zdGFnZTFfNV9leGVjLWFzbS5vOiBhc20uUworCSQoQ0NBUykgJChpc285NjYwX3N0YWdlMV81X2V4ZWNfQ0NBU0ZMQUdTKSAkKENDQVNGTEFHUykgLWMgLW8gaXNvOTY2MF9zdGFnZTFfNV9leGVjLWFzbS5vIGB0ZXN0IC1mICdhc20uUycgfHwgZWNobyAnJChzcmNkaXIpLydgYXNtLlMKKworaXNvOTY2MF9zdGFnZTFfNV9leGVjLWFzbS5vYmo6IGFzbS5TCisJJChDQ0FTKSAkKGlzbzk2NjBfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKSAtYyAtbyBpc285NjYwX3N0YWdlMV81X2V4ZWMtYXNtLm9iaiBgaWYgdGVzdCAtZiAnYXNtLlMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYXNtLlMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2FzbS5TJzsgZmlgCisKK2pmc19zdGFnZTFfNV9leGVjLXN0YXJ0Lm86IHN0YXJ0LlMKKwkkKENDQVMpICQoamZzX3N0YWdlMV81X2V4ZWNfQ0NBU0ZMQUdTKSAkKENDQVNGTEFHUykgLWMgLW8gamZzX3N0YWdlMV81X2V4ZWMtc3RhcnQubyBgdGVzdCAtZiAnc3RhcnQuUycgfHwgZWNobyAnJChzcmNkaXIpLydgc3RhcnQuUworCitqZnNfc3RhZ2UxXzVfZXhlYy1zdGFydC5vYmo6IHN0YXJ0LlMKKwkkKENDQVMpICQoamZzX3N0YWdlMV81X2V4ZWNfQ0NBU0ZMQUdTKSAkKENDQVNGTEFHUykgLWMgLW8gamZzX3N0YWdlMV81X2V4ZWMtc3RhcnQub2JqIGBpZiB0ZXN0IC1mICdzdGFydC5TJzsgdGhlbiAkKENZR1BBVEhfVykgJ3N0YXJ0LlMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N0YXJ0LlMnOyBmaWAKKworamZzX3N0YWdlMV81X2V4ZWMtYXNtLm86IGFzbS5TCisJJChDQ0FTKSAkKGpmc19zdGFnZTFfNV9leGVjX0NDQVNGTEFHUykgJChDQ0FTRkxBR1MpIC1jIC1vIGpmc19zdGFnZTFfNV9leGVjLWFzbS5vIGB0ZXN0IC1mICdhc20uUycgfHwgZWNobyAnJChzcmNkaXIpLydgYXNtLlMKKworamZzX3N0YWdlMV81X2V4ZWMtYXNtLm9iajogYXNtLlMKKwkkKENDQVMpICQoamZzX3N0YWdlMV81X2V4ZWNfQ0NBU0ZMQUdTKSAkKENDQVNGTEFHUykgLWMgLW8gamZzX3N0YWdlMV81X2V4ZWMtYXNtLm9iaiBgaWYgdGVzdCAtZiAnYXNtLlMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYXNtLlMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2FzbS5TJzsgZmlgCisKK21pbml4X3N0YWdlMV81X2V4ZWMtc3RhcnQubzogc3RhcnQuUworCSQoQ0NBUykgJChtaW5peF9zdGFnZTFfNV9leGVjX0NDQVNGTEFHUykgJChDQ0FTRkxBR1MpIC1jIC1vIG1pbml4X3N0YWdlMV81X2V4ZWMtc3RhcnQubyBgdGVzdCAtZiAnc3RhcnQuUycgfHwgZWNobyAnJChzcmNkaXIpLydgc3RhcnQuUworCittaW5peF9zdGFnZTFfNV9leGVjLXN0YXJ0Lm9iajogc3RhcnQuUworCSQoQ0NBUykgJChtaW5peF9zdGFnZTFfNV9leGVjX0NDQVNGTEFHUykgJChDQ0FTRkxBR1MpIC1jIC1vIG1pbml4X3N0YWdlMV81X2V4ZWMtc3RhcnQub2JqIGBpZiB0ZXN0IC1mICdzdGFydC5TJzsgdGhlbiAkKENZR1BBVEhfVykgJ3N0YXJ0LlMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N0YXJ0LlMnOyBmaWAKKworbWluaXhfc3RhZ2UxXzVfZXhlYy1hc20ubzogYXNtLlMKKwkkKENDQVMpICQobWluaXhfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKSAtYyAtbyBtaW5peF9zdGFnZTFfNV9leGVjLWFzbS5vIGB0ZXN0IC1mICdhc20uUycgfHwgZWNobyAnJChzcmNkaXIpLydgYXNtLlMKKworbWluaXhfc3RhZ2UxXzVfZXhlYy1hc20ub2JqOiBhc20uUworCSQoQ0NBUykgJChtaW5peF9zdGFnZTFfNV9leGVjX0NDQVNGTEFHUykgJChDQ0FTRkxBR1MpIC1jIC1vIG1pbml4X3N0YWdlMV81X2V4ZWMtYXNtLm9iaiBgaWYgdGVzdCAtZiAnYXNtLlMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYXNtLlMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2FzbS5TJzsgZmlgCisKK25ibG9hZGVyX2V4ZWMtbmJsb2FkZXIubzogbmJsb2FkZXIuUworCSQoQ0NBUykgJChuYmxvYWRlcl9leGVjX0NDQVNGTEFHUykgJChDQ0FTRkxBR1MpIC1jIC1vIG5ibG9hZGVyX2V4ZWMtbmJsb2FkZXIubyBgdGVzdCAtZiAnbmJsb2FkZXIuUycgfHwgZWNobyAnJChzcmNkaXIpLydgbmJsb2FkZXIuUworCituYmxvYWRlcl9leGVjLW5ibG9hZGVyLm9iajogbmJsb2FkZXIuUworCSQoQ0NBUykgJChuYmxvYWRlcl9leGVjX0NDQVNGTEFHUykgJChDQ0FTRkxBR1MpIC1jIC1vIG5ibG9hZGVyX2V4ZWMtbmJsb2FkZXIub2JqIGBpZiB0ZXN0IC1mICduYmxvYWRlci5TJzsgdGhlbiAkKENZR1BBVEhfVykgJ25ibG9hZGVyLlMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL25ibG9hZGVyLlMnOyBmaWAKKworcHJlX3N0YWdlMl9leGVjLWFzbS5vOiBhc20uUworCSQoQ0NBUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0NBU0ZMQUdTKSAkKENDQVNGTEFHUykgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWFzbS5vIGB0ZXN0IC1mICdhc20uUycgfHwgZWNobyAnJChzcmNkaXIpLydgYXNtLlMKKworcHJlX3N0YWdlMl9leGVjLWFzbS5vYmo6IGFzbS5TCisJJChDQ0FTKSAkKHByZV9zdGFnZTJfZXhlY19DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKSAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtYXNtLm9iaiBgaWYgdGVzdCAtZiAnYXNtLlMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYXNtLlMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2FzbS5TJzsgZmlgCisKK3B4ZWxvYWRlcl9leGVjLXB4ZWxvYWRlci5vOiBweGVsb2FkZXIuUworCSQoQ0NBUykgJChweGVsb2FkZXJfZXhlY19DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKSAtYyAtbyBweGVsb2FkZXJfZXhlYy1weGVsb2FkZXIubyBgdGVzdCAtZiAncHhlbG9hZGVyLlMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHB4ZWxvYWRlci5TCisKK3B4ZWxvYWRlcl9leGVjLXB4ZWxvYWRlci5vYmo6IHB4ZWxvYWRlci5TCisJJChDQ0FTKSAkKHB4ZWxvYWRlcl9leGVjX0NDQVNGTEFHUykgJChDQ0FTRkxBR1MpIC1jIC1vIHB4ZWxvYWRlcl9leGVjLXB4ZWxvYWRlci5vYmogYGlmIHRlc3QgLWYgJ3B4ZWxvYWRlci5TJzsgdGhlbiAkKENZR1BBVEhfVykgJ3B4ZWxvYWRlci5TJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9weGVsb2FkZXIuUyc7IGZpYAorCityZWlzZXJmc19zdGFnZTFfNV9leGVjLXN0YXJ0Lm86IHN0YXJ0LlMKKwkkKENDQVMpICQocmVpc2VyZnNfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKSAtYyAtbyByZWlzZXJmc19zdGFnZTFfNV9leGVjLXN0YXJ0Lm8gYHRlc3QgLWYgJ3N0YXJ0LlMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHN0YXJ0LlMKKworcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1zdGFydC5vYmo6IHN0YXJ0LlMKKwkkKENDQVMpICQocmVpc2VyZnNfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKSAtYyAtbyByZWlzZXJmc19zdGFnZTFfNV9leGVjLXN0YXJ0Lm9iaiBgaWYgdGVzdCAtZiAnc3RhcnQuUyc7IHRoZW4gJChDWUdQQVRIX1cpICdzdGFydC5TJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zdGFydC5TJzsgZmlgCisKK3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtYXNtLm86IGFzbS5TCisJJChDQ0FTKSAkKHJlaXNlcmZzX3N0YWdlMV81X2V4ZWNfQ0NBU0ZMQUdTKSAkKENDQVNGTEFHUykgLWMgLW8gcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1hc20ubyBgdGVzdCAtZiAnYXNtLlMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGFzbS5TCisKK3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtYXNtLm9iajogYXNtLlMKKwkkKENDQVMpICQocmVpc2VyZnNfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKSAtYyAtbyByZWlzZXJmc19zdGFnZTFfNV9leGVjLWFzbS5vYmogYGlmIHRlc3QgLWYgJ2FzbS5TJzsgdGhlbiAkKENZR1BBVEhfVykgJ2FzbS5TJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9hc20uUyc7IGZpYAorCitzdGFydF9leGVjLXN0YXJ0Lm86IHN0YXJ0LlMKKwkkKENDQVMpICQoc3RhcnRfZXhlY19DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKSAtYyAtbyBzdGFydF9leGVjLXN0YXJ0Lm8gYHRlc3QgLWYgJ3N0YXJ0LlMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHN0YXJ0LlMKKworc3RhcnRfZXhlYy1zdGFydC5vYmo6IHN0YXJ0LlMKKwkkKENDQVMpICQoc3RhcnRfZXhlY19DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKSAtYyAtbyBzdGFydF9leGVjLXN0YXJ0Lm9iaiBgaWYgdGVzdCAtZiAnc3RhcnQuUyc7IHRoZW4gJChDWUdQQVRIX1cpICdzdGFydC5TJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zdGFydC5TJzsgZmlgCisKK3N0YXJ0X2VsdG9yaXRvX2V4ZWMtc3RhcnRfZWx0b3JpdG8ubzogc3RhcnRfZWx0b3JpdG8uUworCSQoQ0NBUykgJChzdGFydF9lbHRvcml0b19leGVjX0NDQVNGTEFHUykgJChDQ0FTRkxBR1MpIC1jIC1vIHN0YXJ0X2VsdG9yaXRvX2V4ZWMtc3RhcnRfZWx0b3JpdG8ubyBgdGVzdCAtZiAnc3RhcnRfZWx0b3JpdG8uUycgfHwgZWNobyAnJChzcmNkaXIpLydgc3RhcnRfZWx0b3JpdG8uUworCitzdGFydF9lbHRvcml0b19leGVjLXN0YXJ0X2VsdG9yaXRvLm9iajogc3RhcnRfZWx0b3JpdG8uUworCSQoQ0NBUykgJChzdGFydF9lbHRvcml0b19leGVjX0NDQVNGTEFHUykgJChDQ0FTRkxBR1MpIC1jIC1vIHN0YXJ0X2VsdG9yaXRvX2V4ZWMtc3RhcnRfZWx0b3JpdG8ub2JqIGBpZiB0ZXN0IC1mICdzdGFydF9lbHRvcml0by5TJzsgdGhlbiAkKENZR1BBVEhfVykgJ3N0YXJ0X2VsdG9yaXRvLlMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N0YXJ0X2VsdG9yaXRvLlMnOyBmaWAKKwordWZzMl9zdGFnZTFfNV9leGVjLXN0YXJ0Lm86IHN0YXJ0LlMKKwkkKENDQVMpICQodWZzMl9zdGFnZTFfNV9leGVjX0NDQVNGTEFHUykgJChDQ0FTRkxBR1MpIC1jIC1vIHVmczJfc3RhZ2UxXzVfZXhlYy1zdGFydC5vIGB0ZXN0IC1mICdzdGFydC5TJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzdGFydC5TCisKK3VmczJfc3RhZ2UxXzVfZXhlYy1zdGFydC5vYmo6IHN0YXJ0LlMKKwkkKENDQVMpICQodWZzMl9zdGFnZTFfNV9leGVjX0NDQVNGTEFHUykgJChDQ0FTRkxBR1MpIC1jIC1vIHVmczJfc3RhZ2UxXzVfZXhlYy1zdGFydC5vYmogYGlmIHRlc3QgLWYgJ3N0YXJ0LlMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3RhcnQuUyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3RhcnQuUyc7IGZpYAorCit1ZnMyX3N0YWdlMV81X2V4ZWMtYXNtLm86IGFzbS5TCisJJChDQ0FTKSAkKHVmczJfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKSAtYyAtbyB1ZnMyX3N0YWdlMV81X2V4ZWMtYXNtLm8gYHRlc3QgLWYgJ2FzbS5TJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bhc20uUworCit1ZnMyX3N0YWdlMV81X2V4ZWMtYXNtLm9iajogYXNtLlMKKwkkKENDQVMpICQodWZzMl9zdGFnZTFfNV9leGVjX0NDQVNGTEFHUykgJChDQ0FTRkxBR1MpIC1jIC1vIHVmczJfc3RhZ2UxXzVfZXhlYy1hc20ub2JqIGBpZiB0ZXN0IC1mICdhc20uUyc7IHRoZW4gJChDWUdQQVRIX1cpICdhc20uUyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvYXNtLlMnOyBmaWAKKwordnN0YWZzX3N0YWdlMV81X2V4ZWMtc3RhcnQubzogc3RhcnQuUworCSQoQ0NBUykgJCh2c3RhZnNfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKSAtYyAtbyB2c3RhZnNfc3RhZ2UxXzVfZXhlYy1zdGFydC5vIGB0ZXN0IC1mICdzdGFydC5TJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzdGFydC5TCisKK3ZzdGFmc19zdGFnZTFfNV9leGVjLXN0YXJ0Lm9iajogc3RhcnQuUworCSQoQ0NBUykgJCh2c3RhZnNfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKSAtYyAtbyB2c3RhZnNfc3RhZ2UxXzVfZXhlYy1zdGFydC5vYmogYGlmIHRlc3QgLWYgJ3N0YXJ0LlMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3RhcnQuUyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3RhcnQuUyc7IGZpYAorCit2c3RhZnNfc3RhZ2UxXzVfZXhlYy1hc20ubzogYXNtLlMKKwkkKENDQVMpICQodnN0YWZzX3N0YWdlMV81X2V4ZWNfQ0NBU0ZMQUdTKSAkKENDQVNGTEFHUykgLWMgLW8gdnN0YWZzX3N0YWdlMV81X2V4ZWMtYXNtLm8gYHRlc3QgLWYgJ2FzbS5TJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bhc20uUworCit2c3RhZnNfc3RhZ2UxXzVfZXhlYy1hc20ub2JqOiBhc20uUworCSQoQ0NBUykgJCh2c3RhZnNfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKSAtYyAtbyB2c3RhZnNfc3RhZ2UxXzVfZXhlYy1hc20ub2JqIGBpZiB0ZXN0IC1mICdhc20uUyc7IHRoZW4gJChDWUdQQVRIX1cpICdhc20uUyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvYXNtLlMnOyBmaWAKKworeGZzX3N0YWdlMV81X2V4ZWMtc3RhcnQubzogc3RhcnQuUworCSQoQ0NBUykgJCh4ZnNfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKSAtYyAtbyB4ZnNfc3RhZ2UxXzVfZXhlYy1zdGFydC5vIGB0ZXN0IC1mICdzdGFydC5TJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzdGFydC5TCisKK3hmc19zdGFnZTFfNV9leGVjLXN0YXJ0Lm9iajogc3RhcnQuUworCSQoQ0NBUykgJCh4ZnNfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKSAtYyAtbyB4ZnNfc3RhZ2UxXzVfZXhlYy1zdGFydC5vYmogYGlmIHRlc3QgLWYgJ3N0YXJ0LlMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3RhcnQuUyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3RhcnQuUyc7IGZpYAorCit4ZnNfc3RhZ2UxXzVfZXhlYy1hc20ubzogYXNtLlMKKwkkKENDQVMpICQoeGZzX3N0YWdlMV81X2V4ZWNfQ0NBU0ZMQUdTKSAkKENDQVNGTEFHUykgLWMgLW8geGZzX3N0YWdlMV81X2V4ZWMtYXNtLm8gYHRlc3QgLWYgJ2FzbS5TJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bhc20uUworCit4ZnNfc3RhZ2UxXzVfZXhlYy1hc20ub2JqOiBhc20uUworCSQoQ0NBUykgJCh4ZnNfc3RhZ2UxXzVfZXhlY19DQ0FTRkxBR1MpICQoQ0NBU0ZMQUdTKSAtYyAtbyB4ZnNfc3RhZ2UxXzVfZXhlYy1hc20ub2JqIGBpZiB0ZXN0IC1mICdhc20uUyc7IHRoZW4gJChDWUdQQVRIX1cpICdhc20uUyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvYXNtLlMnOyBmaWAKKworLmMubzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICIkKERFUERJUikvJCouVHBvIiAtYyAtbyAkQCAkPDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpLyQqLlRwbyIgIiQoREVQRElSKS8kKi5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS8kKi5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyAkPAorCisuYy5vYmo6CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAiJChERVBESVIpLyQqLlRwbyIgLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpLyQqLlRwbyIgIiQoREVQRElSKS8kKi5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS8kKi5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyBgJChDWUdQQVRIX1cpICckPCdgCisKK2xpYmdydWJfYS1ib290Lm86IGJvb3QuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJncnViX2EtYm9vdC5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZ3J1Yl9hLWJvb3QuVHBvIiAtYyAtbyBsaWJncnViX2EtYm9vdC5vIGB0ZXN0IC1mICdib290LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGJvb3QuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmdydWJfYS1ib290LlRwbyIgIiQoREVQRElSKS9saWJncnViX2EtYm9vdC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJncnViX2EtYm9vdC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdib290LmMnIG9iamVjdD0nbGliZ3J1Yl9hLWJvb3QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmdydWJfYS1ib290Lm8gYHRlc3QgLWYgJ2Jvb3QuYycgfHwgZWNobyAnJChzcmNkaXIpLydgYm9vdC5jCisKK2xpYmdydWJfYS1ib290Lm9iajogYm9vdC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmdydWJfYS1ib290Lm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmdydWJfYS1ib290LlRwbyIgLWMgLW8gbGliZ3J1Yl9hLWJvb3Qub2JqIGBpZiB0ZXN0IC1mICdib290LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYm9vdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9ib290LmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJncnViX2EtYm9vdC5UcG8iICIkKERFUERJUikvbGliZ3J1Yl9hLWJvb3QuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZ3J1Yl9hLWJvb3QuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nYm9vdC5jJyBvYmplY3Q9J2xpYmdydWJfYS1ib290Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmdydWJfYS1ib290Lm9iaiBgaWYgdGVzdCAtZiAnYm9vdC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Jvb3QuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvYm9vdC5jJzsgZmlgCisKK2xpYmdydWJfYS1idWlsdGlucy5vOiBidWlsdGlucy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmdydWJfYS1idWlsdGlucy5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZ3J1Yl9hLWJ1aWx0aW5zLlRwbyIgLWMgLW8gbGliZ3J1Yl9hLWJ1aWx0aW5zLm8gYHRlc3QgLWYgJ2J1aWx0aW5zLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGJ1aWx0aW5zLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJncnViX2EtYnVpbHRpbnMuVHBvIiAiJChERVBESVIpL2xpYmdydWJfYS1idWlsdGlucy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJncnViX2EtYnVpbHRpbnMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nYnVpbHRpbnMuYycgb2JqZWN0PSdsaWJncnViX2EtYnVpbHRpbnMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmdydWJfYS1idWlsdGlucy5vIGB0ZXN0IC1mICdidWlsdGlucy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BidWlsdGlucy5jCisKK2xpYmdydWJfYS1idWlsdGlucy5vYmo6IGJ1aWx0aW5zLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdydWJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZ3J1Yl9hLWJ1aWx0aW5zLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmdydWJfYS1idWlsdGlucy5UcG8iIC1jIC1vIGxpYmdydWJfYS1idWlsdGlucy5vYmogYGlmIHRlc3QgLWYgJ2J1aWx0aW5zLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYnVpbHRpbnMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvYnVpbHRpbnMuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmdydWJfYS1idWlsdGlucy5UcG8iICIkKERFUERJUikvbGliZ3J1Yl9hLWJ1aWx0aW5zLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmdydWJfYS1idWlsdGlucy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdidWlsdGlucy5jJyBvYmplY3Q9J2xpYmdydWJfYS1idWlsdGlucy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdydWJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJncnViX2EtYnVpbHRpbnMub2JqIGBpZiB0ZXN0IC1mICdidWlsdGlucy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2J1aWx0aW5zLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2J1aWx0aW5zLmMnOyBmaWAKKworbGliZ3J1Yl9hLWNoYXJfaW8ubzogY2hhcl9pby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmdydWJfYS1jaGFyX2lvLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJncnViX2EtY2hhcl9pby5UcG8iIC1jIC1vIGxpYmdydWJfYS1jaGFyX2lvLm8gYHRlc3QgLWYgJ2NoYXJfaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY2hhcl9pby5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZ3J1Yl9hLWNoYXJfaW8uVHBvIiAiJChERVBESVIpL2xpYmdydWJfYS1jaGFyX2lvLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmdydWJfYS1jaGFyX2lvLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NoYXJfaW8uYycgb2JqZWN0PSdsaWJncnViX2EtY2hhcl9pby5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZ3J1Yl9hLWNoYXJfaW8ubyBgdGVzdCAtZiAnY2hhcl9pby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BjaGFyX2lvLmMKKworbGliZ3J1Yl9hLWNoYXJfaW8ub2JqOiBjaGFyX2lvLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdydWJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZ3J1Yl9hLWNoYXJfaW8ub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZ3J1Yl9hLWNoYXJfaW8uVHBvIiAtYyAtbyBsaWJncnViX2EtY2hhcl9pby5vYmogYGlmIHRlc3QgLWYgJ2NoYXJfaW8uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjaGFyX2lvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NoYXJfaW8uYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmdydWJfYS1jaGFyX2lvLlRwbyIgIiQoREVQRElSKS9saWJncnViX2EtY2hhcl9pby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJncnViX2EtY2hhcl9pby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjaGFyX2lvLmMnIG9iamVjdD0nbGliZ3J1Yl9hLWNoYXJfaW8ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZ3J1Yl9hLWNoYXJfaW8ub2JqIGBpZiB0ZXN0IC1mICdjaGFyX2lvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY2hhcl9pby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jaGFyX2lvLmMnOyBmaWAKKworbGliZ3J1Yl9hLWNtZGxpbmUubzogY21kbGluZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmdydWJfYS1jbWRsaW5lLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJncnViX2EtY21kbGluZS5UcG8iIC1jIC1vIGxpYmdydWJfYS1jbWRsaW5lLm8gYHRlc3QgLWYgJ2NtZGxpbmUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY21kbGluZS5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZ3J1Yl9hLWNtZGxpbmUuVHBvIiAiJChERVBESVIpL2xpYmdydWJfYS1jbWRsaW5lLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmdydWJfYS1jbWRsaW5lLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NtZGxpbmUuYycgb2JqZWN0PSdsaWJncnViX2EtY21kbGluZS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZ3J1Yl9hLWNtZGxpbmUubyBgdGVzdCAtZiAnY21kbGluZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BjbWRsaW5lLmMKKworbGliZ3J1Yl9hLWNtZGxpbmUub2JqOiBjbWRsaW5lLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdydWJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZ3J1Yl9hLWNtZGxpbmUub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZ3J1Yl9hLWNtZGxpbmUuVHBvIiAtYyAtbyBsaWJncnViX2EtY21kbGluZS5vYmogYGlmIHRlc3QgLWYgJ2NtZGxpbmUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjbWRsaW5lLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NtZGxpbmUuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmdydWJfYS1jbWRsaW5lLlRwbyIgIiQoREVQRElSKS9saWJncnViX2EtY21kbGluZS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJncnViX2EtY21kbGluZS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjbWRsaW5lLmMnIG9iamVjdD0nbGliZ3J1Yl9hLWNtZGxpbmUub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZ3J1Yl9hLWNtZGxpbmUub2JqIGBpZiB0ZXN0IC1mICdjbWRsaW5lLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY21kbGluZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jbWRsaW5lLmMnOyBmaWAKKworbGliZ3J1Yl9hLWNvbW1vbi5vOiBjb21tb24uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJncnViX2EtY29tbW9uLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJncnViX2EtY29tbW9uLlRwbyIgLWMgLW8gbGliZ3J1Yl9hLWNvbW1vbi5vIGB0ZXN0IC1mICdjb21tb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29tbW9uLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJncnViX2EtY29tbW9uLlRwbyIgIiQoREVQRElSKS9saWJncnViX2EtY29tbW9uLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmdydWJfYS1jb21tb24uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29tbW9uLmMnIG9iamVjdD0nbGliZ3J1Yl9hLWNvbW1vbi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZ3J1Yl9hLWNvbW1vbi5vIGB0ZXN0IC1mICdjb21tb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29tbW9uLmMKKworbGliZ3J1Yl9hLWNvbW1vbi5vYmo6IGNvbW1vbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmdydWJfYS1jb21tb24ub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZ3J1Yl9hLWNvbW1vbi5UcG8iIC1jIC1vIGxpYmdydWJfYS1jb21tb24ub2JqIGBpZiB0ZXN0IC1mICdjb21tb24uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb21tb24uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29tbW9uLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJncnViX2EtY29tbW9uLlRwbyIgIiQoREVQRElSKS9saWJncnViX2EtY29tbW9uLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmdydWJfYS1jb21tb24uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29tbW9uLmMnIG9iamVjdD0nbGliZ3J1Yl9hLWNvbW1vbi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdydWJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJncnViX2EtY29tbW9uLm9iaiBgaWYgdGVzdCAtZiAnY29tbW9uLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29tbW9uLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbW1vbi5jJzsgZmlgCisKK2xpYmdydWJfYS1kaXNrX2lvLm86IGRpc2tfaW8uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJncnViX2EtZGlza19pby5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZ3J1Yl9hLWRpc2tfaW8uVHBvIiAtYyAtbyBsaWJncnViX2EtZGlza19pby5vIGB0ZXN0IC1mICdkaXNrX2lvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRpc2tfaW8uYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmdydWJfYS1kaXNrX2lvLlRwbyIgIiQoREVQRElSKS9saWJncnViX2EtZGlza19pby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJncnViX2EtZGlza19pby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkaXNrX2lvLmMnIG9iamVjdD0nbGliZ3J1Yl9hLWRpc2tfaW8ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmdydWJfYS1kaXNrX2lvLm8gYHRlc3QgLWYgJ2Rpc2tfaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGlza19pby5jCisKK2xpYmdydWJfYS1kaXNrX2lvLm9iajogZGlza19pby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmdydWJfYS1kaXNrX2lvLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmdydWJfYS1kaXNrX2lvLlRwbyIgLWMgLW8gbGliZ3J1Yl9hLWRpc2tfaW8ub2JqIGBpZiB0ZXN0IC1mICdkaXNrX2lvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGlza19pby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kaXNrX2lvLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJncnViX2EtZGlza19pby5UcG8iICIkKERFUERJUikvbGliZ3J1Yl9hLWRpc2tfaW8uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZ3J1Yl9hLWRpc2tfaW8uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGlza19pby5jJyBvYmplY3Q9J2xpYmdydWJfYS1kaXNrX2lvLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmdydWJfYS1kaXNrX2lvLm9iaiBgaWYgdGVzdCAtZiAnZGlza19pby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Rpc2tfaW8uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZGlza19pby5jJzsgZmlgCisKK2xpYmdydWJfYS1mc3lzX2V4dDJmcy5vOiBmc3lzX2V4dDJmcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmdydWJfYS1mc3lzX2V4dDJmcy5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfZXh0MmZzLlRwbyIgLWMgLW8gbGliZ3J1Yl9hLWZzeXNfZXh0MmZzLm8gYHRlc3QgLWYgJ2ZzeXNfZXh0MmZzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfZXh0MmZzLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJncnViX2EtZnN5c19leHQyZnMuVHBvIiAiJChERVBESVIpL2xpYmdydWJfYS1mc3lzX2V4dDJmcy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJncnViX2EtZnN5c19leHQyZnMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c19leHQyZnMuYycgb2JqZWN0PSdsaWJncnViX2EtZnN5c19leHQyZnMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmdydWJfYS1mc3lzX2V4dDJmcy5vIGB0ZXN0IC1mICdmc3lzX2V4dDJmcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bmc3lzX2V4dDJmcy5jCisKK2xpYmdydWJfYS1mc3lzX2V4dDJmcy5vYmo6IGZzeXNfZXh0MmZzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdydWJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZ3J1Yl9hLWZzeXNfZXh0MmZzLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmdydWJfYS1mc3lzX2V4dDJmcy5UcG8iIC1jIC1vIGxpYmdydWJfYS1mc3lzX2V4dDJmcy5vYmogYGlmIHRlc3QgLWYgJ2ZzeXNfZXh0MmZzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c19leHQyZnMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c19leHQyZnMuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmdydWJfYS1mc3lzX2V4dDJmcy5UcG8iICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfZXh0MmZzLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmdydWJfYS1mc3lzX2V4dDJmcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmc3lzX2V4dDJmcy5jJyBvYmplY3Q9J2xpYmdydWJfYS1mc3lzX2V4dDJmcy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdydWJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJncnViX2EtZnN5c19leHQyZnMub2JqIGBpZiB0ZXN0IC1mICdmc3lzX2V4dDJmcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfZXh0MmZzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfZXh0MmZzLmMnOyBmaWAKKworbGliZ3J1Yl9hLWZzeXNfZmF0Lm86IGZzeXNfZmF0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdydWJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZ3J1Yl9hLWZzeXNfZmF0Lm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJncnViX2EtZnN5c19mYXQuVHBvIiAtYyAtbyBsaWJncnViX2EtZnN5c19mYXQubyBgdGVzdCAtZiAnZnN5c19mYXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c19mYXQuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmdydWJfYS1mc3lzX2ZhdC5UcG8iICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfZmF0LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmdydWJfYS1mc3lzX2ZhdC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmc3lzX2ZhdC5jJyBvYmplY3Q9J2xpYmdydWJfYS1mc3lzX2ZhdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZ3J1Yl9hLWZzeXNfZmF0Lm8gYHRlc3QgLWYgJ2ZzeXNfZmF0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfZmF0LmMKKworbGliZ3J1Yl9hLWZzeXNfZmF0Lm9iajogZnN5c19mYXQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJncnViX2EtZnN5c19mYXQub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfZmF0LlRwbyIgLWMgLW8gbGliZ3J1Yl9hLWZzeXNfZmF0Lm9iaiBgaWYgdGVzdCAtZiAnZnN5c19mYXQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX2ZhdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX2ZhdC5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfZmF0LlRwbyIgIiQoREVQRElSKS9saWJncnViX2EtZnN5c19mYXQuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfZmF0LlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfZmF0LmMnIG9iamVjdD0nbGliZ3J1Yl9hLWZzeXNfZmF0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmdydWJfYS1mc3lzX2ZhdC5vYmogYGlmIHRlc3QgLWYgJ2ZzeXNfZmF0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c19mYXQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c19mYXQuYyc7IGZpYAorCitsaWJncnViX2EtZnN5c19mZnMubzogZnN5c19mZnMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJncnViX2EtZnN5c19mZnMubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmdydWJfYS1mc3lzX2Zmcy5UcG8iIC1jIC1vIGxpYmdydWJfYS1mc3lzX2Zmcy5vIGB0ZXN0IC1mICdmc3lzX2Zmcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bmc3lzX2Zmcy5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfZmZzLlRwbyIgIiQoREVQRElSKS9saWJncnViX2EtZnN5c19mZnMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfZmZzLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfZmZzLmMnIG9iamVjdD0nbGliZ3J1Yl9hLWZzeXNfZmZzLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdydWJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJncnViX2EtZnN5c19mZnMubyBgdGVzdCAtZiAnZnN5c19mZnMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c19mZnMuYworCitsaWJncnViX2EtZnN5c19mZnMub2JqOiBmc3lzX2Zmcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmdydWJfYS1mc3lzX2Zmcy5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJncnViX2EtZnN5c19mZnMuVHBvIiAtYyAtbyBsaWJncnViX2EtZnN5c19mZnMub2JqIGBpZiB0ZXN0IC1mICdmc3lzX2Zmcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfZmZzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfZmZzLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJncnViX2EtZnN5c19mZnMuVHBvIiAiJChERVBESVIpL2xpYmdydWJfYS1mc3lzX2Zmcy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJncnViX2EtZnN5c19mZnMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c19mZnMuYycgb2JqZWN0PSdsaWJncnViX2EtZnN5c19mZnMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZ3J1Yl9hLWZzeXNfZmZzLm9iaiBgaWYgdGVzdCAtZiAnZnN5c19mZnMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX2Zmcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX2Zmcy5jJzsgZmlgCisKK2xpYmdydWJfYS1mc3lzX2lzbzk2NjAubzogZnN5c19pc285NjYwLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdydWJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZ3J1Yl9hLWZzeXNfaXNvOTY2MC5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfaXNvOTY2MC5UcG8iIC1jIC1vIGxpYmdydWJfYS1mc3lzX2lzbzk2NjAubyBgdGVzdCAtZiAnZnN5c19pc285NjYwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfaXNvOTY2MC5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfaXNvOTY2MC5UcG8iICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfaXNvOTY2MC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJncnViX2EtZnN5c19pc285NjYwLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfaXNvOTY2MC5jJyBvYmplY3Q9J2xpYmdydWJfYS1mc3lzX2lzbzk2NjAubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmdydWJfYS1mc3lzX2lzbzk2NjAubyBgdGVzdCAtZiAnZnN5c19pc285NjYwLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfaXNvOTY2MC5jCisKK2xpYmdydWJfYS1mc3lzX2lzbzk2NjAub2JqOiBmc3lzX2lzbzk2NjAuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJncnViX2EtZnN5c19pc285NjYwLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmdydWJfYS1mc3lzX2lzbzk2NjAuVHBvIiAtYyAtbyBsaWJncnViX2EtZnN5c19pc285NjYwLm9iaiBgaWYgdGVzdCAtZiAnZnN5c19pc285NjYwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c19pc285NjYwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfaXNvOTY2MC5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfaXNvOTY2MC5UcG8iICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfaXNvOTY2MC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJncnViX2EtZnN5c19pc285NjYwLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfaXNvOTY2MC5jJyBvYmplY3Q9J2xpYmdydWJfYS1mc3lzX2lzbzk2NjAub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZ3J1Yl9hLWZzeXNfaXNvOTY2MC5vYmogYGlmIHRlc3QgLWYgJ2ZzeXNfaXNvOTY2MC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfaXNvOTY2MC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX2lzbzk2NjAuYyc7IGZpYAorCitsaWJncnViX2EtZnN5c19qZnMubzogZnN5c19qZnMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJncnViX2EtZnN5c19qZnMubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmdydWJfYS1mc3lzX2pmcy5UcG8iIC1jIC1vIGxpYmdydWJfYS1mc3lzX2pmcy5vIGB0ZXN0IC1mICdmc3lzX2pmcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bmc3lzX2pmcy5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfamZzLlRwbyIgIiQoREVQRElSKS9saWJncnViX2EtZnN5c19qZnMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfamZzLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfamZzLmMnIG9iamVjdD0nbGliZ3J1Yl9hLWZzeXNfamZzLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdydWJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJncnViX2EtZnN5c19qZnMubyBgdGVzdCAtZiAnZnN5c19qZnMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c19qZnMuYworCitsaWJncnViX2EtZnN5c19qZnMub2JqOiBmc3lzX2pmcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmdydWJfYS1mc3lzX2pmcy5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJncnViX2EtZnN5c19qZnMuVHBvIiAtYyAtbyBsaWJncnViX2EtZnN5c19qZnMub2JqIGBpZiB0ZXN0IC1mICdmc3lzX2pmcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfamZzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfamZzLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJncnViX2EtZnN5c19qZnMuVHBvIiAiJChERVBESVIpL2xpYmdydWJfYS1mc3lzX2pmcy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJncnViX2EtZnN5c19qZnMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c19qZnMuYycgb2JqZWN0PSdsaWJncnViX2EtZnN5c19qZnMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZ3J1Yl9hLWZzeXNfamZzLm9iaiBgaWYgdGVzdCAtZiAnZnN5c19qZnMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX2pmcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX2pmcy5jJzsgZmlgCisKK2xpYmdydWJfYS1mc3lzX21pbml4Lm86IGZzeXNfbWluaXguYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJncnViX2EtZnN5c19taW5peC5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfbWluaXguVHBvIiAtYyAtbyBsaWJncnViX2EtZnN5c19taW5peC5vIGB0ZXN0IC1mICdmc3lzX21pbml4LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfbWluaXguYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmdydWJfYS1mc3lzX21pbml4LlRwbyIgIiQoREVQRElSKS9saWJncnViX2EtZnN5c19taW5peC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJncnViX2EtZnN5c19taW5peC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmc3lzX21pbml4LmMnIG9iamVjdD0nbGliZ3J1Yl9hLWZzeXNfbWluaXgubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmdydWJfYS1mc3lzX21pbml4Lm8gYHRlc3QgLWYgJ2ZzeXNfbWluaXguYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c19taW5peC5jCisKK2xpYmdydWJfYS1mc3lzX21pbml4Lm9iajogZnN5c19taW5peC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmdydWJfYS1mc3lzX21pbml4Lm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmdydWJfYS1mc3lzX21pbml4LlRwbyIgLWMgLW8gbGliZ3J1Yl9hLWZzeXNfbWluaXgub2JqIGBpZiB0ZXN0IC1mICdmc3lzX21pbml4LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c19taW5peC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX21pbml4LmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJncnViX2EtZnN5c19taW5peC5UcG8iICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfbWluaXguUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfbWluaXguVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c19taW5peC5jJyBvYmplY3Q9J2xpYmdydWJfYS1mc3lzX21pbml4Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmdydWJfYS1mc3lzX21pbml4Lm9iaiBgaWYgdGVzdCAtZiAnZnN5c19taW5peC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfbWluaXguYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c19taW5peC5jJzsgZmlgCisKK2xpYmdydWJfYS1mc3lzX3JlaXNlcmZzLm86IGZzeXNfcmVpc2VyZnMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJncnViX2EtZnN5c19yZWlzZXJmcy5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfcmVpc2VyZnMuVHBvIiAtYyAtbyBsaWJncnViX2EtZnN5c19yZWlzZXJmcy5vIGB0ZXN0IC1mICdmc3lzX3JlaXNlcmZzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfcmVpc2VyZnMuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmdydWJfYS1mc3lzX3JlaXNlcmZzLlRwbyIgIiQoREVQRElSKS9saWJncnViX2EtZnN5c19yZWlzZXJmcy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJncnViX2EtZnN5c19yZWlzZXJmcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmc3lzX3JlaXNlcmZzLmMnIG9iamVjdD0nbGliZ3J1Yl9hLWZzeXNfcmVpc2VyZnMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmdydWJfYS1mc3lzX3JlaXNlcmZzLm8gYHRlc3QgLWYgJ2ZzeXNfcmVpc2VyZnMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c19yZWlzZXJmcy5jCisKK2xpYmdydWJfYS1mc3lzX3JlaXNlcmZzLm9iajogZnN5c19yZWlzZXJmcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmdydWJfYS1mc3lzX3JlaXNlcmZzLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmdydWJfYS1mc3lzX3JlaXNlcmZzLlRwbyIgLWMgLW8gbGliZ3J1Yl9hLWZzeXNfcmVpc2VyZnMub2JqIGBpZiB0ZXN0IC1mICdmc3lzX3JlaXNlcmZzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c19yZWlzZXJmcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX3JlaXNlcmZzLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJncnViX2EtZnN5c19yZWlzZXJmcy5UcG8iICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfcmVpc2VyZnMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfcmVpc2VyZnMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c19yZWlzZXJmcy5jJyBvYmplY3Q9J2xpYmdydWJfYS1mc3lzX3JlaXNlcmZzLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmdydWJfYS1mc3lzX3JlaXNlcmZzLm9iaiBgaWYgdGVzdCAtZiAnZnN5c19yZWlzZXJmcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfcmVpc2VyZnMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c19yZWlzZXJmcy5jJzsgZmlgCisKK2xpYmdydWJfYS1mc3lzX3VmczIubzogZnN5c191ZnMyLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdydWJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZ3J1Yl9hLWZzeXNfdWZzMi5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfdWZzMi5UcG8iIC1jIC1vIGxpYmdydWJfYS1mc3lzX3VmczIubyBgdGVzdCAtZiAnZnN5c191ZnMyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfdWZzMi5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfdWZzMi5UcG8iICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfdWZzMi5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJncnViX2EtZnN5c191ZnMyLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfdWZzMi5jJyBvYmplY3Q9J2xpYmdydWJfYS1mc3lzX3VmczIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmdydWJfYS1mc3lzX3VmczIubyBgdGVzdCAtZiAnZnN5c191ZnMyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfdWZzMi5jCisKK2xpYmdydWJfYS1mc3lzX3VmczIub2JqOiBmc3lzX3VmczIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJncnViX2EtZnN5c191ZnMyLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmdydWJfYS1mc3lzX3VmczIuVHBvIiAtYyAtbyBsaWJncnViX2EtZnN5c191ZnMyLm9iaiBgaWYgdGVzdCAtZiAnZnN5c191ZnMyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c191ZnMyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfdWZzMi5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfdWZzMi5UcG8iICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfdWZzMi5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJncnViX2EtZnN5c191ZnMyLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfdWZzMi5jJyBvYmplY3Q9J2xpYmdydWJfYS1mc3lzX3VmczIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZ3J1Yl9hLWZzeXNfdWZzMi5vYmogYGlmIHRlc3QgLWYgJ2ZzeXNfdWZzMi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfdWZzMi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX3VmczIuYyc7IGZpYAorCitsaWJncnViX2EtZnN5c192c3RhZnMubzogZnN5c192c3RhZnMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJncnViX2EtZnN5c192c3RhZnMubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmdydWJfYS1mc3lzX3ZzdGFmcy5UcG8iIC1jIC1vIGxpYmdydWJfYS1mc3lzX3ZzdGFmcy5vIGB0ZXN0IC1mICdmc3lzX3ZzdGFmcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bmc3lzX3ZzdGFmcy5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfdnN0YWZzLlRwbyIgIiQoREVQRElSKS9saWJncnViX2EtZnN5c192c3RhZnMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfdnN0YWZzLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfdnN0YWZzLmMnIG9iamVjdD0nbGliZ3J1Yl9hLWZzeXNfdnN0YWZzLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdydWJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJncnViX2EtZnN5c192c3RhZnMubyBgdGVzdCAtZiAnZnN5c192c3RhZnMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c192c3RhZnMuYworCitsaWJncnViX2EtZnN5c192c3RhZnMub2JqOiBmc3lzX3ZzdGFmcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmdydWJfYS1mc3lzX3ZzdGFmcy5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJncnViX2EtZnN5c192c3RhZnMuVHBvIiAtYyAtbyBsaWJncnViX2EtZnN5c192c3RhZnMub2JqIGBpZiB0ZXN0IC1mICdmc3lzX3ZzdGFmcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfdnN0YWZzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfdnN0YWZzLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJncnViX2EtZnN5c192c3RhZnMuVHBvIiAiJChERVBESVIpL2xpYmdydWJfYS1mc3lzX3ZzdGFmcy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJncnViX2EtZnN5c192c3RhZnMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c192c3RhZnMuYycgb2JqZWN0PSdsaWJncnViX2EtZnN5c192c3RhZnMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZ3J1Yl9hLWZzeXNfdnN0YWZzLm9iaiBgaWYgdGVzdCAtZiAnZnN5c192c3RhZnMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX3ZzdGFmcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX3ZzdGFmcy5jJzsgZmlgCisKK2xpYmdydWJfYS1mc3lzX3hmcy5vOiBmc3lzX3hmcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmdydWJfYS1mc3lzX3hmcy5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfeGZzLlRwbyIgLWMgLW8gbGliZ3J1Yl9hLWZzeXNfeGZzLm8gYHRlc3QgLWYgJ2ZzeXNfeGZzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfeGZzLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJncnViX2EtZnN5c194ZnMuVHBvIiAiJChERVBESVIpL2xpYmdydWJfYS1mc3lzX3hmcy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJncnViX2EtZnN5c194ZnMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c194ZnMuYycgb2JqZWN0PSdsaWJncnViX2EtZnN5c194ZnMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmdydWJfYS1mc3lzX3hmcy5vIGB0ZXN0IC1mICdmc3lzX3hmcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bmc3lzX3hmcy5jCisKK2xpYmdydWJfYS1mc3lzX3hmcy5vYmo6IGZzeXNfeGZzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdydWJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZ3J1Yl9hLWZzeXNfeGZzLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmdydWJfYS1mc3lzX3hmcy5UcG8iIC1jIC1vIGxpYmdydWJfYS1mc3lzX3hmcy5vYmogYGlmIHRlc3QgLWYgJ2ZzeXNfeGZzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c194ZnMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c194ZnMuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmdydWJfYS1mc3lzX3hmcy5UcG8iICIkKERFUERJUikvbGliZ3J1Yl9hLWZzeXNfeGZzLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmdydWJfYS1mc3lzX3hmcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmc3lzX3hmcy5jJyBvYmplY3Q9J2xpYmdydWJfYS1mc3lzX3hmcy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdydWJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJncnViX2EtZnN5c194ZnMub2JqIGBpZiB0ZXN0IC1mICdmc3lzX3hmcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfeGZzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfeGZzLmMnOyBmaWAKKworbGliZ3J1Yl9hLWd1bnppcC5vOiBndW56aXAuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJncnViX2EtZ3VuemlwLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJncnViX2EtZ3VuemlwLlRwbyIgLWMgLW8gbGliZ3J1Yl9hLWd1bnppcC5vIGB0ZXN0IC1mICdndW56aXAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ3VuemlwLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJncnViX2EtZ3VuemlwLlRwbyIgIiQoREVQRElSKS9saWJncnViX2EtZ3VuemlwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmdydWJfYS1ndW56aXAuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZ3VuemlwLmMnIG9iamVjdD0nbGliZ3J1Yl9hLWd1bnppcC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZ3J1Yl9hLWd1bnppcC5vIGB0ZXN0IC1mICdndW56aXAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ3VuemlwLmMKKworbGliZ3J1Yl9hLWd1bnppcC5vYmo6IGd1bnppcC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmdydWJfYS1ndW56aXAub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZ3J1Yl9hLWd1bnppcC5UcG8iIC1jIC1vIGxpYmdydWJfYS1ndW56aXAub2JqIGBpZiB0ZXN0IC1mICdndW56aXAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdndW56aXAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ3VuemlwLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJncnViX2EtZ3VuemlwLlRwbyIgIiQoREVQRElSKS9saWJncnViX2EtZ3VuemlwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmdydWJfYS1ndW56aXAuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZ3VuemlwLmMnIG9iamVjdD0nbGliZ3J1Yl9hLWd1bnppcC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdydWJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJncnViX2EtZ3VuemlwLm9iaiBgaWYgdGVzdCAtZiAnZ3VuemlwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ3VuemlwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2d1bnppcC5jJzsgZmlgCisKK2xpYmdydWJfYS1tZDUubzogbWQ1LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdydWJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZ3J1Yl9hLW1kNS5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZ3J1Yl9hLW1kNS5UcG8iIC1jIC1vIGxpYmdydWJfYS1tZDUubyBgdGVzdCAtZiAnbWQ1LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG1kNS5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZ3J1Yl9hLW1kNS5UcG8iICIkKERFUERJUikvbGliZ3J1Yl9hLW1kNS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJncnViX2EtbWQ1LlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J21kNS5jJyBvYmplY3Q9J2xpYmdydWJfYS1tZDUubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmdydWJfYS1tZDUubyBgdGVzdCAtZiAnbWQ1LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG1kNS5jCisKK2xpYmdydWJfYS1tZDUub2JqOiBtZDUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJncnViX2EtbWQ1Lm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmdydWJfYS1tZDUuVHBvIiAtYyAtbyBsaWJncnViX2EtbWQ1Lm9iaiBgaWYgdGVzdCAtZiAnbWQ1LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbWQ1LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL21kNS5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZ3J1Yl9hLW1kNS5UcG8iICIkKERFUERJUikvbGliZ3J1Yl9hLW1kNS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJncnViX2EtbWQ1LlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J21kNS5jJyBvYmplY3Q9J2xpYmdydWJfYS1tZDUub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZ3J1Yl9hLW1kNS5vYmogYGlmIHRlc3QgLWYgJ21kNS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ21kNS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9tZDUuYyc7IGZpYAorCitsaWJncnViX2Etc2VyaWFsLm86IHNlcmlhbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmdydWJfYS1zZXJpYWwubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmdydWJfYS1zZXJpYWwuVHBvIiAtYyAtbyBsaWJncnViX2Etc2VyaWFsLm8gYHRlc3QgLWYgJ3NlcmlhbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzZXJpYWwuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmdydWJfYS1zZXJpYWwuVHBvIiAiJChERVBESVIpL2xpYmdydWJfYS1zZXJpYWwuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZ3J1Yl9hLXNlcmlhbC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzZXJpYWwuYycgb2JqZWN0PSdsaWJncnViX2Etc2VyaWFsLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdydWJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJncnViX2Etc2VyaWFsLm8gYHRlc3QgLWYgJ3NlcmlhbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzZXJpYWwuYworCitsaWJncnViX2Etc2VyaWFsLm9iajogc2VyaWFsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdydWJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZ3J1Yl9hLXNlcmlhbC5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJncnViX2Etc2VyaWFsLlRwbyIgLWMgLW8gbGliZ3J1Yl9hLXNlcmlhbC5vYmogYGlmIHRlc3QgLWYgJ3NlcmlhbC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NlcmlhbC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zZXJpYWwuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmdydWJfYS1zZXJpYWwuVHBvIiAiJChERVBESVIpL2xpYmdydWJfYS1zZXJpYWwuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZ3J1Yl9hLXNlcmlhbC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzZXJpYWwuYycgb2JqZWN0PSdsaWJncnViX2Etc2VyaWFsLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmdydWJfYS1zZXJpYWwub2JqIGBpZiB0ZXN0IC1mICdzZXJpYWwuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzZXJpYWwuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc2VyaWFsLmMnOyBmaWAKKworbGliZ3J1Yl9hLXN0YWdlMi5vOiBzdGFnZTIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJncnViX2Etc3RhZ2UyLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJncnViX2Etc3RhZ2UyLlRwbyIgLWMgLW8gbGliZ3J1Yl9hLXN0YWdlMi5vIGB0ZXN0IC1mICdzdGFnZTIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3RhZ2UyLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJncnViX2Etc3RhZ2UyLlRwbyIgIiQoREVQRElSKS9saWJncnViX2Etc3RhZ2UyLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmdydWJfYS1zdGFnZTIuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3RhZ2UyLmMnIG9iamVjdD0nbGliZ3J1Yl9hLXN0YWdlMi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZ3J1Yl9hLXN0YWdlMi5vIGB0ZXN0IC1mICdzdGFnZTIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3RhZ2UyLmMKKworbGliZ3J1Yl9hLXN0YWdlMi5vYmo6IHN0YWdlMi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmdydWJfYS1zdGFnZTIub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZ3J1Yl9hLXN0YWdlMi5UcG8iIC1jIC1vIGxpYmdydWJfYS1zdGFnZTIub2JqIGBpZiB0ZXN0IC1mICdzdGFnZTIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzdGFnZTIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3RhZ2UyLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJncnViX2Etc3RhZ2UyLlRwbyIgIiQoREVQRElSKS9saWJncnViX2Etc3RhZ2UyLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmdydWJfYS1zdGFnZTIuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3RhZ2UyLmMnIG9iamVjdD0nbGliZ3J1Yl9hLXN0YWdlMi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdydWJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJncnViX2Etc3RhZ2UyLm9iaiBgaWYgdGVzdCAtZiAnc3RhZ2UyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3RhZ2UyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N0YWdlMi5jJzsgZmlgCisKK2xpYmdydWJfYS10ZXJtaW5mby5vOiB0ZXJtaW5mby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGxpYmdydWJfYS10ZXJtaW5mby5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZ3J1Yl9hLXRlcm1pbmZvLlRwbyIgLWMgLW8gbGliZ3J1Yl9hLXRlcm1pbmZvLm8gYHRlc3QgLWYgJ3Rlcm1pbmZvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHRlcm1pbmZvLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9saWJncnViX2EtdGVybWluZm8uVHBvIiAiJChERVBESVIpL2xpYmdydWJfYS10ZXJtaW5mby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9saWJncnViX2EtdGVybWluZm8uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndGVybWluZm8uYycgb2JqZWN0PSdsaWJncnViX2EtdGVybWluZm8ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmdydWJfYS10ZXJtaW5mby5vIGB0ZXN0IC1mICd0ZXJtaW5mby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0ZXJtaW5mby5jCisKK2xpYmdydWJfYS10ZXJtaW5mby5vYmo6IHRlcm1pbmZvLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdydWJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZ3J1Yl9hLXRlcm1pbmZvLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2xpYmdydWJfYS10ZXJtaW5mby5UcG8iIC1jIC1vIGxpYmdydWJfYS10ZXJtaW5mby5vYmogYGlmIHRlc3QgLWYgJ3Rlcm1pbmZvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndGVybWluZm8uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdGVybWluZm8uYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmdydWJfYS10ZXJtaW5mby5UcG8iICIkKERFUERJUikvbGliZ3J1Yl9hLXRlcm1pbmZvLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmdydWJfYS10ZXJtaW5mby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0ZXJtaW5mby5jJyBvYmplY3Q9J2xpYmdydWJfYS10ZXJtaW5mby5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdydWJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBsaWJncnViX2EtdGVybWluZm8ub2JqIGBpZiB0ZXN0IC1mICd0ZXJtaW5mby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3Rlcm1pbmZvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3Rlcm1pbmZvLmMnOyBmaWAKKworbGliZ3J1Yl9hLXRwYXJtLm86IHRwYXJtLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGxpYmdydWJfYV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbGliZ3J1Yl9hLXRwYXJtLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9saWJncnViX2EtdHBhcm0uVHBvIiAtYyAtbyBsaWJncnViX2EtdHBhcm0ubyBgdGVzdCAtZiAndHBhcm0uYycgfHwgZWNobyAnJChzcmNkaXIpLydgdHBhcm0uYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2xpYmdydWJfYS10cGFybS5UcG8iICIkKERFUERJUikvbGliZ3J1Yl9hLXRwYXJtLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2xpYmdydWJfYS10cGFybS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0cGFybS5jJyBvYmplY3Q9J2xpYmdydWJfYS10cGFybS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChsaWJncnViX2FfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbGliZ3J1Yl9hLXRwYXJtLm8gYHRlc3QgLWYgJ3RwYXJtLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHRwYXJtLmMKKworbGliZ3J1Yl9hLXRwYXJtLm9iajogdHBhcm0uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1NVCBsaWJncnViX2EtdHBhcm0ub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbGliZ3J1Yl9hLXRwYXJtLlRwbyIgLWMgLW8gbGliZ3J1Yl9hLXRwYXJtLm9iaiBgaWYgdGVzdCAtZiAndHBhcm0uYyc7IHRoZW4gJChDWUdQQVRIX1cpICd0cGFybS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90cGFybS5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbGliZ3J1Yl9hLXRwYXJtLlRwbyIgIiQoREVQRElSKS9saWJncnViX2EtdHBhcm0uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbGliZ3J1Yl9hLXRwYXJtLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3RwYXJtLmMnIG9iamVjdD0nbGliZ3J1Yl9hLXRwYXJtLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobGliZ3J1Yl9hX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGxpYmdydWJfYS10cGFybS5vYmogYGlmIHRlc3QgLWYgJ3RwYXJtLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndHBhcm0uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdHBhcm0uYyc7IGZpYAorCitkaXNrbGVzc19leGVjLWJpb3MubzogYmlvcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkaXNrbGVzc19leGVjLWJpb3MubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtYmlvcy5UcG8iIC1jIC1vIGRpc2tsZXNzX2V4ZWMtYmlvcy5vIGB0ZXN0IC1mICdiaW9zLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGJpb3MuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtYmlvcy5UcG8iICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1iaW9zLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtYmlvcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdiaW9zLmMnIG9iamVjdD0nZGlza2xlc3NfZXhlYy1iaW9zLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGlza2xlc3NfZXhlYy1iaW9zLm8gYHRlc3QgLWYgJ2Jpb3MuYycgfHwgZWNobyAnJChzcmNkaXIpLydgYmlvcy5jCisKK2Rpc2tsZXNzX2V4ZWMtYmlvcy5vYmo6IGJpb3MuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGlza2xlc3NfZXhlYy1iaW9zLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtYmlvcy5UcG8iIC1jIC1vIGRpc2tsZXNzX2V4ZWMtYmlvcy5vYmogYGlmIHRlc3QgLWYgJ2Jpb3MuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdiaW9zLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Jpb3MuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtYmlvcy5UcG8iICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1iaW9zLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtYmlvcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdiaW9zLmMnIG9iamVjdD0nZGlza2xlc3NfZXhlYy1iaW9zLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLWJpb3Mub2JqIGBpZiB0ZXN0IC1mICdiaW9zLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYmlvcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9iaW9zLmMnOyBmaWAKKworZGlza2xlc3NfZXhlYy1ib290Lm86IGJvb3QuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGlza2xlc3NfZXhlYy1ib290Lm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWJvb3QuVHBvIiAtYyAtbyBkaXNrbGVzc19leGVjLWJvb3QubyBgdGVzdCAtZiAnYm9vdC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bib290LmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWJvb3QuVHBvIiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtYm9vdC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWJvb3QuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nYm9vdC5jJyBvYmplY3Q9J2Rpc2tsZXNzX2V4ZWMtYm9vdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRpc2tsZXNzX2V4ZWMtYm9vdC5vIGB0ZXN0IC1mICdib290LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGJvb3QuYworCitkaXNrbGVzc19leGVjLWJvb3Qub2JqOiBib290LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRpc2tsZXNzX2V4ZWMtYm9vdC5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWJvb3QuVHBvIiAtYyAtbyBkaXNrbGVzc19leGVjLWJvb3Qub2JqIGBpZiB0ZXN0IC1mICdib290LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYm9vdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9ib290LmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWJvb3QuVHBvIiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtYm9vdC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWJvb3QuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nYm9vdC5jJyBvYmplY3Q9J2Rpc2tsZXNzX2V4ZWMtYm9vdC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGlza2xlc3NfZXhlYy1ib290Lm9iaiBgaWYgdGVzdCAtZiAnYm9vdC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Jvb3QuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvYm9vdC5jJzsgZmlgCisKK2Rpc2tsZXNzX2V4ZWMtYnVpbHRpbnMubzogYnVpbHRpbnMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGlza2xlc3NfZXhlYy1idWlsdGlucy5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1idWlsdGlucy5UcG8iIC1jIC1vIGRpc2tsZXNzX2V4ZWMtYnVpbHRpbnMubyBgdGVzdCAtZiAnYnVpbHRpbnMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgYnVpbHRpbnMuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtYnVpbHRpbnMuVHBvIiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtYnVpbHRpbnMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1idWlsdGlucy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdidWlsdGlucy5jJyBvYmplY3Q9J2Rpc2tsZXNzX2V4ZWMtYnVpbHRpbnMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLWJ1aWx0aW5zLm8gYHRlc3QgLWYgJ2J1aWx0aW5zLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGJ1aWx0aW5zLmMKKworZGlza2xlc3NfZXhlYy1idWlsdGlucy5vYmo6IGJ1aWx0aW5zLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRpc2tsZXNzX2V4ZWMtYnVpbHRpbnMub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1idWlsdGlucy5UcG8iIC1jIC1vIGRpc2tsZXNzX2V4ZWMtYnVpbHRpbnMub2JqIGBpZiB0ZXN0IC1mICdidWlsdGlucy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2J1aWx0aW5zLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2J1aWx0aW5zLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWJ1aWx0aW5zLlRwbyIgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWJ1aWx0aW5zLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtYnVpbHRpbnMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nYnVpbHRpbnMuYycgb2JqZWN0PSdkaXNrbGVzc19leGVjLWJ1aWx0aW5zLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLWJ1aWx0aW5zLm9iaiBgaWYgdGVzdCAtZiAnYnVpbHRpbnMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdidWlsdGlucy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9idWlsdGlucy5jJzsgZmlgCisKK2Rpc2tsZXNzX2V4ZWMtY2hhcl9pby5vOiBjaGFyX2lvLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRpc2tsZXNzX2V4ZWMtY2hhcl9pby5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1jaGFyX2lvLlRwbyIgLWMgLW8gZGlza2xlc3NfZXhlYy1jaGFyX2lvLm8gYHRlc3QgLWYgJ2NoYXJfaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY2hhcl9pby5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1jaGFyX2lvLlRwbyIgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWNoYXJfaW8uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1jaGFyX2lvLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NoYXJfaW8uYycgb2JqZWN0PSdkaXNrbGVzc19leGVjLWNoYXJfaW8ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLWNoYXJfaW8ubyBgdGVzdCAtZiAnY2hhcl9pby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BjaGFyX2lvLmMKKworZGlza2xlc3NfZXhlYy1jaGFyX2lvLm9iajogY2hhcl9pby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkaXNrbGVzc19leGVjLWNoYXJfaW8ub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1jaGFyX2lvLlRwbyIgLWMgLW8gZGlza2xlc3NfZXhlYy1jaGFyX2lvLm9iaiBgaWYgdGVzdCAtZiAnY2hhcl9pby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NoYXJfaW8uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY2hhcl9pby5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1jaGFyX2lvLlRwbyIgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWNoYXJfaW8uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1jaGFyX2lvLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NoYXJfaW8uYycgb2JqZWN0PSdkaXNrbGVzc19leGVjLWNoYXJfaW8ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRpc2tsZXNzX2V4ZWMtY2hhcl9pby5vYmogYGlmIHRlc3QgLWYgJ2NoYXJfaW8uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjaGFyX2lvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NoYXJfaW8uYyc7IGZpYAorCitkaXNrbGVzc19leGVjLWNtZGxpbmUubzogY21kbGluZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkaXNrbGVzc19leGVjLWNtZGxpbmUubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtY21kbGluZS5UcG8iIC1jIC1vIGRpc2tsZXNzX2V4ZWMtY21kbGluZS5vIGB0ZXN0IC1mICdjbWRsaW5lLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNtZGxpbmUuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtY21kbGluZS5UcG8iICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1jbWRsaW5lLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtY21kbGluZS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjbWRsaW5lLmMnIG9iamVjdD0nZGlza2xlc3NfZXhlYy1jbWRsaW5lLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGlza2xlc3NfZXhlYy1jbWRsaW5lLm8gYHRlc3QgLWYgJ2NtZGxpbmUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY21kbGluZS5jCisKK2Rpc2tsZXNzX2V4ZWMtY21kbGluZS5vYmo6IGNtZGxpbmUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGlza2xlc3NfZXhlYy1jbWRsaW5lLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtY21kbGluZS5UcG8iIC1jIC1vIGRpc2tsZXNzX2V4ZWMtY21kbGluZS5vYmogYGlmIHRlc3QgLWYgJ2NtZGxpbmUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjbWRsaW5lLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NtZGxpbmUuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtY21kbGluZS5UcG8iICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1jbWRsaW5lLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtY21kbGluZS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjbWRsaW5lLmMnIG9iamVjdD0nZGlza2xlc3NfZXhlYy1jbWRsaW5lLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLWNtZGxpbmUub2JqIGBpZiB0ZXN0IC1mICdjbWRsaW5lLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY21kbGluZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jbWRsaW5lLmMnOyBmaWAKKworZGlza2xlc3NfZXhlYy1jb21tb24ubzogY29tbW9uLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRpc2tsZXNzX2V4ZWMtY29tbW9uLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWNvbW1vbi5UcG8iIC1jIC1vIGRpc2tsZXNzX2V4ZWMtY29tbW9uLm8gYHRlc3QgLWYgJ2NvbW1vbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb21tb24uYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtY29tbW9uLlRwbyIgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWNvbW1vbi5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWNvbW1vbi5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb21tb24uYycgb2JqZWN0PSdkaXNrbGVzc19leGVjLWNvbW1vbi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRpc2tsZXNzX2V4ZWMtY29tbW9uLm8gYHRlc3QgLWYgJ2NvbW1vbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb21tb24uYworCitkaXNrbGVzc19leGVjLWNvbW1vbi5vYmo6IGNvbW1vbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkaXNrbGVzc19leGVjLWNvbW1vbi5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWNvbW1vbi5UcG8iIC1jIC1vIGRpc2tsZXNzX2V4ZWMtY29tbW9uLm9iaiBgaWYgdGVzdCAtZiAnY29tbW9uLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29tbW9uLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbW1vbi5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1jb21tb24uVHBvIiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtY29tbW9uLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtY29tbW9uLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbW1vbi5jJyBvYmplY3Q9J2Rpc2tsZXNzX2V4ZWMtY29tbW9uLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLWNvbW1vbi5vYmogYGlmIHRlc3QgLWYgJ2NvbW1vbi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbW1vbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb21tb24uYyc7IGZpYAorCitkaXNrbGVzc19leGVjLWNvbnNvbGUubzogY29uc29sZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkaXNrbGVzc19leGVjLWNvbnNvbGUubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtY29uc29sZS5UcG8iIC1jIC1vIGRpc2tsZXNzX2V4ZWMtY29uc29sZS5vIGB0ZXN0IC1mICdjb25zb2xlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbnNvbGUuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtY29uc29sZS5UcG8iICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1jb25zb2xlLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtY29uc29sZS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25zb2xlLmMnIG9iamVjdD0nZGlza2xlc3NfZXhlYy1jb25zb2xlLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGlza2xlc3NfZXhlYy1jb25zb2xlLm8gYHRlc3QgLWYgJ2NvbnNvbGUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29uc29sZS5jCisKK2Rpc2tsZXNzX2V4ZWMtY29uc29sZS5vYmo6IGNvbnNvbGUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGlza2xlc3NfZXhlYy1jb25zb2xlLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtY29uc29sZS5UcG8iIC1jIC1vIGRpc2tsZXNzX2V4ZWMtY29uc29sZS5vYmogYGlmIHRlc3QgLWYgJ2NvbnNvbGUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb25zb2xlLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbnNvbGUuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtY29uc29sZS5UcG8iICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1jb25zb2xlLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtY29uc29sZS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25zb2xlLmMnIG9iamVjdD0nZGlza2xlc3NfZXhlYy1jb25zb2xlLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLWNvbnNvbGUub2JqIGBpZiB0ZXN0IC1mICdjb25zb2xlLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29uc29sZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25zb2xlLmMnOyBmaWAKKworZGlza2xlc3NfZXhlYy1kaXNrX2lvLm86IGRpc2tfaW8uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGlza2xlc3NfZXhlYy1kaXNrX2lvLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWRpc2tfaW8uVHBvIiAtYyAtbyBkaXNrbGVzc19leGVjLWRpc2tfaW8ubyBgdGVzdCAtZiAnZGlza19pby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkaXNrX2lvLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWRpc2tfaW8uVHBvIiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZGlza19pby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWRpc2tfaW8uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGlza19pby5jJyBvYmplY3Q9J2Rpc2tsZXNzX2V4ZWMtZGlza19pby5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRpc2tsZXNzX2V4ZWMtZGlza19pby5vIGB0ZXN0IC1mICdkaXNrX2lvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRpc2tfaW8uYworCitkaXNrbGVzc19leGVjLWRpc2tfaW8ub2JqOiBkaXNrX2lvLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRpc2tsZXNzX2V4ZWMtZGlza19pby5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWRpc2tfaW8uVHBvIiAtYyAtbyBkaXNrbGVzc19leGVjLWRpc2tfaW8ub2JqIGBpZiB0ZXN0IC1mICdkaXNrX2lvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGlza19pby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kaXNrX2lvLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWRpc2tfaW8uVHBvIiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZGlza19pby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWRpc2tfaW8uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGlza19pby5jJyBvYmplY3Q9J2Rpc2tsZXNzX2V4ZWMtZGlza19pby5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGlza2xlc3NfZXhlYy1kaXNrX2lvLm9iaiBgaWYgdGVzdCAtZiAnZGlza19pby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Rpc2tfaW8uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZGlza19pby5jJzsgZmlgCisKK2Rpc2tsZXNzX2V4ZWMtZnN5c19leHQyZnMubzogZnN5c19leHQyZnMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGlza2xlc3NfZXhlYy1mc3lzX2V4dDJmcy5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX2V4dDJmcy5UcG8iIC1jIC1vIGRpc2tsZXNzX2V4ZWMtZnN5c19leHQyZnMubyBgdGVzdCAtZiAnZnN5c19leHQyZnMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c19leHQyZnMuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c19leHQyZnMuVHBvIiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c19leHQyZnMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX2V4dDJmcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmc3lzX2V4dDJmcy5jJyBvYmplY3Q9J2Rpc2tsZXNzX2V4ZWMtZnN5c19leHQyZnMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLWZzeXNfZXh0MmZzLm8gYHRlc3QgLWYgJ2ZzeXNfZXh0MmZzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfZXh0MmZzLmMKKworZGlza2xlc3NfZXhlYy1mc3lzX2V4dDJmcy5vYmo6IGZzeXNfZXh0MmZzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRpc2tsZXNzX2V4ZWMtZnN5c19leHQyZnMub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX2V4dDJmcy5UcG8iIC1jIC1vIGRpc2tsZXNzX2V4ZWMtZnN5c19leHQyZnMub2JqIGBpZiB0ZXN0IC1mICdmc3lzX2V4dDJmcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfZXh0MmZzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfZXh0MmZzLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfZXh0MmZzLlRwbyIgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfZXh0MmZzLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c19leHQyZnMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c19leHQyZnMuYycgb2JqZWN0PSdkaXNrbGVzc19leGVjLWZzeXNfZXh0MmZzLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLWZzeXNfZXh0MmZzLm9iaiBgaWYgdGVzdCAtZiAnZnN5c19leHQyZnMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX2V4dDJmcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX2V4dDJmcy5jJzsgZmlgCisKK2Rpc2tsZXNzX2V4ZWMtZnN5c19mYXQubzogZnN5c19mYXQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGlza2xlc3NfZXhlYy1mc3lzX2ZhdC5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX2ZhdC5UcG8iIC1jIC1vIGRpc2tsZXNzX2V4ZWMtZnN5c19mYXQubyBgdGVzdCAtZiAnZnN5c19mYXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c19mYXQuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c19mYXQuVHBvIiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c19mYXQuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX2ZhdC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmc3lzX2ZhdC5jJyBvYmplY3Q9J2Rpc2tsZXNzX2V4ZWMtZnN5c19mYXQubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLWZzeXNfZmF0Lm8gYHRlc3QgLWYgJ2ZzeXNfZmF0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfZmF0LmMKKworZGlza2xlc3NfZXhlYy1mc3lzX2ZhdC5vYmo6IGZzeXNfZmF0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRpc2tsZXNzX2V4ZWMtZnN5c19mYXQub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX2ZhdC5UcG8iIC1jIC1vIGRpc2tsZXNzX2V4ZWMtZnN5c19mYXQub2JqIGBpZiB0ZXN0IC1mICdmc3lzX2ZhdC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfZmF0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfZmF0LmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfZmF0LlRwbyIgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfZmF0LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c19mYXQuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c19mYXQuYycgb2JqZWN0PSdkaXNrbGVzc19leGVjLWZzeXNfZmF0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLWZzeXNfZmF0Lm9iaiBgaWYgdGVzdCAtZiAnZnN5c19mYXQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX2ZhdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX2ZhdC5jJzsgZmlgCisKK2Rpc2tsZXNzX2V4ZWMtZnN5c19mZnMubzogZnN5c19mZnMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGlza2xlc3NfZXhlYy1mc3lzX2Zmcy5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX2Zmcy5UcG8iIC1jIC1vIGRpc2tsZXNzX2V4ZWMtZnN5c19mZnMubyBgdGVzdCAtZiAnZnN5c19mZnMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c19mZnMuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c19mZnMuVHBvIiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c19mZnMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX2Zmcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmc3lzX2Zmcy5jJyBvYmplY3Q9J2Rpc2tsZXNzX2V4ZWMtZnN5c19mZnMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLWZzeXNfZmZzLm8gYHRlc3QgLWYgJ2ZzeXNfZmZzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfZmZzLmMKKworZGlza2xlc3NfZXhlYy1mc3lzX2Zmcy5vYmo6IGZzeXNfZmZzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRpc2tsZXNzX2V4ZWMtZnN5c19mZnMub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX2Zmcy5UcG8iIC1jIC1vIGRpc2tsZXNzX2V4ZWMtZnN5c19mZnMub2JqIGBpZiB0ZXN0IC1mICdmc3lzX2Zmcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfZmZzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfZmZzLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfZmZzLlRwbyIgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfZmZzLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c19mZnMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c19mZnMuYycgb2JqZWN0PSdkaXNrbGVzc19leGVjLWZzeXNfZmZzLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLWZzeXNfZmZzLm9iaiBgaWYgdGVzdCAtZiAnZnN5c19mZnMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX2Zmcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX2Zmcy5jJzsgZmlgCisKK2Rpc2tsZXNzX2V4ZWMtZnN5c19pc285NjYwLm86IGZzeXNfaXNvOTY2MC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkaXNrbGVzc19leGVjLWZzeXNfaXNvOTY2MC5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX2lzbzk2NjAuVHBvIiAtYyAtbyBkaXNrbGVzc19leGVjLWZzeXNfaXNvOTY2MC5vIGB0ZXN0IC1mICdmc3lzX2lzbzk2NjAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c19pc285NjYwLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfaXNvOTY2MC5UcG8iICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX2lzbzk2NjAuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX2lzbzk2NjAuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c19pc285NjYwLmMnIG9iamVjdD0nZGlza2xlc3NfZXhlYy1mc3lzX2lzbzk2NjAubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLWZzeXNfaXNvOTY2MC5vIGB0ZXN0IC1mICdmc3lzX2lzbzk2NjAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c19pc285NjYwLmMKKworZGlza2xlc3NfZXhlYy1mc3lzX2lzbzk2NjAub2JqOiBmc3lzX2lzbzk2NjAuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGlza2xlc3NfZXhlYy1mc3lzX2lzbzk2NjAub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX2lzbzk2NjAuVHBvIiAtYyAtbyBkaXNrbGVzc19leGVjLWZzeXNfaXNvOTY2MC5vYmogYGlmIHRlc3QgLWYgJ2ZzeXNfaXNvOTY2MC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfaXNvOTY2MC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX2lzbzk2NjAuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c19pc285NjYwLlRwbyIgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfaXNvOTY2MC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfaXNvOTY2MC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmc3lzX2lzbzk2NjAuYycgb2JqZWN0PSdkaXNrbGVzc19leGVjLWZzeXNfaXNvOTY2MC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGlza2xlc3NfZXhlYy1mc3lzX2lzbzk2NjAub2JqIGBpZiB0ZXN0IC1mICdmc3lzX2lzbzk2NjAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX2lzbzk2NjAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c19pc285NjYwLmMnOyBmaWAKKworZGlza2xlc3NfZXhlYy1mc3lzX2pmcy5vOiBmc3lzX2pmcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkaXNrbGVzc19leGVjLWZzeXNfamZzLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfamZzLlRwbyIgLWMgLW8gZGlza2xlc3NfZXhlYy1mc3lzX2pmcy5vIGB0ZXN0IC1mICdmc3lzX2pmcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bmc3lzX2pmcy5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX2pmcy5UcG8iICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX2pmcy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfamZzLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfamZzLmMnIG9iamVjdD0nZGlza2xlc3NfZXhlYy1mc3lzX2pmcy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRpc2tsZXNzX2V4ZWMtZnN5c19qZnMubyBgdGVzdCAtZiAnZnN5c19qZnMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c19qZnMuYworCitkaXNrbGVzc19leGVjLWZzeXNfamZzLm9iajogZnN5c19qZnMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGlza2xlc3NfZXhlYy1mc3lzX2pmcy5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfamZzLlRwbyIgLWMgLW8gZGlza2xlc3NfZXhlYy1mc3lzX2pmcy5vYmogYGlmIHRlc3QgLWYgJ2ZzeXNfamZzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c19qZnMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c19qZnMuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c19qZnMuVHBvIiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c19qZnMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX2pmcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmc3lzX2pmcy5jJyBvYmplY3Q9J2Rpc2tsZXNzX2V4ZWMtZnN5c19qZnMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRpc2tsZXNzX2V4ZWMtZnN5c19qZnMub2JqIGBpZiB0ZXN0IC1mICdmc3lzX2pmcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfamZzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfamZzLmMnOyBmaWAKKworZGlza2xlc3NfZXhlYy1mc3lzX21pbml4Lm86IGZzeXNfbWluaXguYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGlza2xlc3NfZXhlYy1mc3lzX21pbml4Lm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfbWluaXguVHBvIiAtYyAtbyBkaXNrbGVzc19leGVjLWZzeXNfbWluaXgubyBgdGVzdCAtZiAnZnN5c19taW5peC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bmc3lzX21pbml4LmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfbWluaXguVHBvIiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c19taW5peC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfbWluaXguVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c19taW5peC5jJyBvYmplY3Q9J2Rpc2tsZXNzX2V4ZWMtZnN5c19taW5peC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRpc2tsZXNzX2V4ZWMtZnN5c19taW5peC5vIGB0ZXN0IC1mICdmc3lzX21pbml4LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfbWluaXguYworCitkaXNrbGVzc19leGVjLWZzeXNfbWluaXgub2JqOiBmc3lzX21pbml4LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRpc2tsZXNzX2V4ZWMtZnN5c19taW5peC5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfbWluaXguVHBvIiAtYyAtbyBkaXNrbGVzc19leGVjLWZzeXNfbWluaXgub2JqIGBpZiB0ZXN0IC1mICdmc3lzX21pbml4LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c19taW5peC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX21pbml4LmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfbWluaXguVHBvIiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c19taW5peC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfbWluaXguVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c19taW5peC5jJyBvYmplY3Q9J2Rpc2tsZXNzX2V4ZWMtZnN5c19taW5peC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGlza2xlc3NfZXhlYy1mc3lzX21pbml4Lm9iaiBgaWYgdGVzdCAtZiAnZnN5c19taW5peC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfbWluaXguYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c19taW5peC5jJzsgZmlgCisKK2Rpc2tsZXNzX2V4ZWMtZnN5c19yZWlzZXJmcy5vOiBmc3lzX3JlaXNlcmZzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRpc2tsZXNzX2V4ZWMtZnN5c19yZWlzZXJmcy5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX3JlaXNlcmZzLlRwbyIgLWMgLW8gZGlza2xlc3NfZXhlYy1mc3lzX3JlaXNlcmZzLm8gYHRlc3QgLWYgJ2ZzeXNfcmVpc2VyZnMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c19yZWlzZXJmcy5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX3JlaXNlcmZzLlRwbyIgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfcmVpc2VyZnMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX3JlaXNlcmZzLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfcmVpc2VyZnMuYycgb2JqZWN0PSdkaXNrbGVzc19leGVjLWZzeXNfcmVpc2VyZnMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLWZzeXNfcmVpc2VyZnMubyBgdGVzdCAtZiAnZnN5c19yZWlzZXJmcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bmc3lzX3JlaXNlcmZzLmMKKworZGlza2xlc3NfZXhlYy1mc3lzX3JlaXNlcmZzLm9iajogZnN5c19yZWlzZXJmcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkaXNrbGVzc19leGVjLWZzeXNfcmVpc2VyZnMub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX3JlaXNlcmZzLlRwbyIgLWMgLW8gZGlza2xlc3NfZXhlYy1mc3lzX3JlaXNlcmZzLm9iaiBgaWYgdGVzdCAtZiAnZnN5c19yZWlzZXJmcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfcmVpc2VyZnMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c19yZWlzZXJmcy5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX3JlaXNlcmZzLlRwbyIgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfcmVpc2VyZnMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX3JlaXNlcmZzLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfcmVpc2VyZnMuYycgb2JqZWN0PSdkaXNrbGVzc19leGVjLWZzeXNfcmVpc2VyZnMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRpc2tsZXNzX2V4ZWMtZnN5c19yZWlzZXJmcy5vYmogYGlmIHRlc3QgLWYgJ2ZzeXNfcmVpc2VyZnMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX3JlaXNlcmZzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfcmVpc2VyZnMuYyc7IGZpYAorCitkaXNrbGVzc19leGVjLWZzeXNfdWZzMi5vOiBmc3lzX3VmczIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGlza2xlc3NfZXhlYy1mc3lzX3VmczIubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c191ZnMyLlRwbyIgLWMgLW8gZGlza2xlc3NfZXhlYy1mc3lzX3VmczIubyBgdGVzdCAtZiAnZnN5c191ZnMyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfdWZzMi5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX3VmczIuVHBvIiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c191ZnMyLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c191ZnMyLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfdWZzMi5jJyBvYmplY3Q9J2Rpc2tsZXNzX2V4ZWMtZnN5c191ZnMyLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGlza2xlc3NfZXhlYy1mc3lzX3VmczIubyBgdGVzdCAtZiAnZnN5c191ZnMyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfdWZzMi5jCisKK2Rpc2tsZXNzX2V4ZWMtZnN5c191ZnMyLm9iajogZnN5c191ZnMyLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRpc2tsZXNzX2V4ZWMtZnN5c191ZnMyLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c191ZnMyLlRwbyIgLWMgLW8gZGlza2xlc3NfZXhlYy1mc3lzX3VmczIub2JqIGBpZiB0ZXN0IC1mICdmc3lzX3VmczIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX3VmczIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c191ZnMyLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfdWZzMi5UcG8iICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX3VmczIuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX3VmczIuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c191ZnMyLmMnIG9iamVjdD0nZGlza2xlc3NfZXhlYy1mc3lzX3VmczIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRpc2tsZXNzX2V4ZWMtZnN5c191ZnMyLm9iaiBgaWYgdGVzdCAtZiAnZnN5c191ZnMyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c191ZnMyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfdWZzMi5jJzsgZmlgCisKK2Rpc2tsZXNzX2V4ZWMtZnN5c192c3RhZnMubzogZnN5c192c3RhZnMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGlza2xlc3NfZXhlYy1mc3lzX3ZzdGFmcy5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX3ZzdGFmcy5UcG8iIC1jIC1vIGRpc2tsZXNzX2V4ZWMtZnN5c192c3RhZnMubyBgdGVzdCAtZiAnZnN5c192c3RhZnMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c192c3RhZnMuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c192c3RhZnMuVHBvIiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c192c3RhZnMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX3ZzdGFmcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmc3lzX3ZzdGFmcy5jJyBvYmplY3Q9J2Rpc2tsZXNzX2V4ZWMtZnN5c192c3RhZnMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLWZzeXNfdnN0YWZzLm8gYHRlc3QgLWYgJ2ZzeXNfdnN0YWZzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfdnN0YWZzLmMKKworZGlza2xlc3NfZXhlYy1mc3lzX3ZzdGFmcy5vYmo6IGZzeXNfdnN0YWZzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRpc2tsZXNzX2V4ZWMtZnN5c192c3RhZnMub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX3ZzdGFmcy5UcG8iIC1jIC1vIGRpc2tsZXNzX2V4ZWMtZnN5c192c3RhZnMub2JqIGBpZiB0ZXN0IC1mICdmc3lzX3ZzdGFmcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfdnN0YWZzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfdnN0YWZzLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfdnN0YWZzLlRwbyIgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfdnN0YWZzLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c192c3RhZnMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c192c3RhZnMuYycgb2JqZWN0PSdkaXNrbGVzc19leGVjLWZzeXNfdnN0YWZzLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLWZzeXNfdnN0YWZzLm9iaiBgaWYgdGVzdCAtZiAnZnN5c192c3RhZnMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX3ZzdGFmcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX3ZzdGFmcy5jJzsgZmlgCisKK2Rpc2tsZXNzX2V4ZWMtZnN5c194ZnMubzogZnN5c194ZnMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGlza2xlc3NfZXhlYy1mc3lzX3hmcy5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX3hmcy5UcG8iIC1jIC1vIGRpc2tsZXNzX2V4ZWMtZnN5c194ZnMubyBgdGVzdCAtZiAnZnN5c194ZnMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c194ZnMuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c194ZnMuVHBvIiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c194ZnMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX3hmcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmc3lzX3hmcy5jJyBvYmplY3Q9J2Rpc2tsZXNzX2V4ZWMtZnN5c194ZnMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLWZzeXNfeGZzLm8gYHRlc3QgLWYgJ2ZzeXNfeGZzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfeGZzLmMKKworZGlza2xlc3NfZXhlYy1mc3lzX3hmcy5vYmo6IGZzeXNfeGZzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRpc2tsZXNzX2V4ZWMtZnN5c194ZnMub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1mc3lzX3hmcy5UcG8iIC1jIC1vIGRpc2tsZXNzX2V4ZWMtZnN5c194ZnMub2JqIGBpZiB0ZXN0IC1mICdmc3lzX3hmcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfeGZzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfeGZzLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfeGZzLlRwbyIgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWZzeXNfeGZzLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZnN5c194ZnMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c194ZnMuYycgb2JqZWN0PSdkaXNrbGVzc19leGVjLWZzeXNfeGZzLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLWZzeXNfeGZzLm9iaiBgaWYgdGVzdCAtZiAnZnN5c194ZnMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX3hmcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX3hmcy5jJzsgZmlgCisKK2Rpc2tsZXNzX2V4ZWMtZ3VuemlwLm86IGd1bnppcC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkaXNrbGVzc19leGVjLWd1bnppcC5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1ndW56aXAuVHBvIiAtYyAtbyBkaXNrbGVzc19leGVjLWd1bnppcC5vIGB0ZXN0IC1mICdndW56aXAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ3VuemlwLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWd1bnppcC5UcG8iICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1ndW56aXAuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1ndW56aXAuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZ3VuemlwLmMnIG9iamVjdD0nZGlza2xlc3NfZXhlYy1ndW56aXAubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLWd1bnppcC5vIGB0ZXN0IC1mICdndW56aXAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ3VuemlwLmMKKworZGlza2xlc3NfZXhlYy1ndW56aXAub2JqOiBndW56aXAuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGlza2xlc3NfZXhlYy1ndW56aXAub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1ndW56aXAuVHBvIiAtYyAtbyBkaXNrbGVzc19leGVjLWd1bnppcC5vYmogYGlmIHRlc3QgLWYgJ2d1bnppcC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2d1bnppcC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9ndW56aXAuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtZ3VuemlwLlRwbyIgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWd1bnppcC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWd1bnppcC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdndW56aXAuYycgb2JqZWN0PSdkaXNrbGVzc19leGVjLWd1bnppcC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGlza2xlc3NfZXhlYy1ndW56aXAub2JqIGBpZiB0ZXN0IC1mICdndW56aXAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdndW56aXAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ3VuemlwLmMnOyBmaWAKKworZGlza2xlc3NfZXhlYy1oZXJjdWxlcy5vOiBoZXJjdWxlcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkaXNrbGVzc19leGVjLWhlcmN1bGVzLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWhlcmN1bGVzLlRwbyIgLWMgLW8gZGlza2xlc3NfZXhlYy1oZXJjdWxlcy5vIGB0ZXN0IC1mICdoZXJjdWxlcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BoZXJjdWxlcy5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1oZXJjdWxlcy5UcG8iICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1oZXJjdWxlcy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWhlcmN1bGVzLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2hlcmN1bGVzLmMnIG9iamVjdD0nZGlza2xlc3NfZXhlYy1oZXJjdWxlcy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRpc2tsZXNzX2V4ZWMtaGVyY3VsZXMubyBgdGVzdCAtZiAnaGVyY3VsZXMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgaGVyY3VsZXMuYworCitkaXNrbGVzc19leGVjLWhlcmN1bGVzLm9iajogaGVyY3VsZXMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGlza2xlc3NfZXhlYy1oZXJjdWxlcy5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLWhlcmN1bGVzLlRwbyIgLWMgLW8gZGlza2xlc3NfZXhlYy1oZXJjdWxlcy5vYmogYGlmIHRlc3QgLWYgJ2hlcmN1bGVzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnaGVyY3VsZXMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvaGVyY3VsZXMuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtaGVyY3VsZXMuVHBvIiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtaGVyY3VsZXMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1oZXJjdWxlcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdoZXJjdWxlcy5jJyBvYmplY3Q9J2Rpc2tsZXNzX2V4ZWMtaGVyY3VsZXMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRpc2tsZXNzX2V4ZWMtaGVyY3VsZXMub2JqIGBpZiB0ZXN0IC1mICdoZXJjdWxlcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2hlcmN1bGVzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2hlcmN1bGVzLmMnOyBmaWAKKworZGlza2xlc3NfZXhlYy1tZDUubzogbWQ1LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRpc2tsZXNzX2V4ZWMtbWQ1Lm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLW1kNS5UcG8iIC1jIC1vIGRpc2tsZXNzX2V4ZWMtbWQ1Lm8gYHRlc3QgLWYgJ21kNS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BtZDUuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtbWQ1LlRwbyIgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLW1kNS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLW1kNS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdtZDUuYycgb2JqZWN0PSdkaXNrbGVzc19leGVjLW1kNS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRpc2tsZXNzX2V4ZWMtbWQ1Lm8gYHRlc3QgLWYgJ21kNS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BtZDUuYworCitkaXNrbGVzc19leGVjLW1kNS5vYmo6IG1kNS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkaXNrbGVzc19leGVjLW1kNS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLW1kNS5UcG8iIC1jIC1vIGRpc2tsZXNzX2V4ZWMtbWQ1Lm9iaiBgaWYgdGVzdCAtZiAnbWQ1LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbWQ1LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL21kNS5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1tZDUuVHBvIiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtbWQ1LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtbWQ1LlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J21kNS5jJyBvYmplY3Q9J2Rpc2tsZXNzX2V4ZWMtbWQ1Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLW1kNS5vYmogYGlmIHRlc3QgLWYgJ21kNS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ21kNS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9tZDUuYyc7IGZpYAorCitkaXNrbGVzc19leGVjLXNlcmlhbC5vOiBzZXJpYWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGlza2xlc3NfZXhlYy1zZXJpYWwubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtc2VyaWFsLlRwbyIgLWMgLW8gZGlza2xlc3NfZXhlYy1zZXJpYWwubyBgdGVzdCAtZiAnc2VyaWFsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNlcmlhbC5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1zZXJpYWwuVHBvIiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtc2VyaWFsLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtc2VyaWFsLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3NlcmlhbC5jJyBvYmplY3Q9J2Rpc2tsZXNzX2V4ZWMtc2VyaWFsLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGlza2xlc3NfZXhlYy1zZXJpYWwubyBgdGVzdCAtZiAnc2VyaWFsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNlcmlhbC5jCisKK2Rpc2tsZXNzX2V4ZWMtc2VyaWFsLm9iajogc2VyaWFsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRpc2tsZXNzX2V4ZWMtc2VyaWFsLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtc2VyaWFsLlRwbyIgLWMgLW8gZGlza2xlc3NfZXhlYy1zZXJpYWwub2JqIGBpZiB0ZXN0IC1mICdzZXJpYWwuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzZXJpYWwuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc2VyaWFsLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLXNlcmlhbC5UcG8iICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1zZXJpYWwuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1zZXJpYWwuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc2VyaWFsLmMnIG9iamVjdD0nZGlza2xlc3NfZXhlYy1zZXJpYWwub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRpc2tsZXNzX2V4ZWMtc2VyaWFsLm9iaiBgaWYgdGVzdCAtZiAnc2VyaWFsLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc2VyaWFsLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NlcmlhbC5jJzsgZmlgCisKK2Rpc2tsZXNzX2V4ZWMtc21wLWltcHMubzogc21wLWltcHMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGlza2xlc3NfZXhlYy1zbXAtaW1wcy5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1zbXAtaW1wcy5UcG8iIC1jIC1vIGRpc2tsZXNzX2V4ZWMtc21wLWltcHMubyBgdGVzdCAtZiAnc21wLWltcHMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc21wLWltcHMuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtc21wLWltcHMuVHBvIiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtc21wLWltcHMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1zbXAtaW1wcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzbXAtaW1wcy5jJyBvYmplY3Q9J2Rpc2tsZXNzX2V4ZWMtc21wLWltcHMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLXNtcC1pbXBzLm8gYHRlc3QgLWYgJ3NtcC1pbXBzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNtcC1pbXBzLmMKKworZGlza2xlc3NfZXhlYy1zbXAtaW1wcy5vYmo6IHNtcC1pbXBzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGRpc2tsZXNzX2V4ZWMtc21wLWltcHMub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1zbXAtaW1wcy5UcG8iIC1jIC1vIGRpc2tsZXNzX2V4ZWMtc21wLWltcHMub2JqIGBpZiB0ZXN0IC1mICdzbXAtaW1wcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NtcC1pbXBzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NtcC1pbXBzLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLXNtcC1pbXBzLlRwbyIgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLXNtcC1pbXBzLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtc21wLWltcHMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc21wLWltcHMuYycgb2JqZWN0PSdkaXNrbGVzc19leGVjLXNtcC1pbXBzLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLXNtcC1pbXBzLm9iaiBgaWYgdGVzdCAtZiAnc21wLWltcHMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzbXAtaW1wcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zbXAtaW1wcy5jJzsgZmlgCisKK2Rpc2tsZXNzX2V4ZWMtc3RhZ2UyLm86IHN0YWdlMi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkaXNrbGVzc19leGVjLXN0YWdlMi5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1zdGFnZTIuVHBvIiAtYyAtbyBkaXNrbGVzc19leGVjLXN0YWdlMi5vIGB0ZXN0IC1mICdzdGFnZTIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3RhZ2UyLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLXN0YWdlMi5UcG8iICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1zdGFnZTIuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1zdGFnZTIuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3RhZ2UyLmMnIG9iamVjdD0nZGlza2xlc3NfZXhlYy1zdGFnZTIubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBkaXNrbGVzc19leGVjLXN0YWdlMi5vIGB0ZXN0IC1mICdzdGFnZTIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3RhZ2UyLmMKKworZGlza2xlc3NfZXhlYy1zdGFnZTIub2JqOiBzdGFnZTIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGlza2xlc3NfZXhlYy1zdGFnZTIub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvZGlza2xlc3NfZXhlYy1zdGFnZTIuVHBvIiAtYyAtbyBkaXNrbGVzc19leGVjLXN0YWdlMi5vYmogYGlmIHRlc3QgLWYgJ3N0YWdlMi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3N0YWdlMi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zdGFnZTIuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtc3RhZ2UyLlRwbyIgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLXN0YWdlMi5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLXN0YWdlMi5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzdGFnZTIuYycgb2JqZWN0PSdkaXNrbGVzc19leGVjLXN0YWdlMi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGRpc2tsZXNzX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZGlza2xlc3NfZXhlYy1zdGFnZTIub2JqIGBpZiB0ZXN0IC1mICdzdGFnZTIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzdGFnZTIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3RhZ2UyLmMnOyBmaWAKKworZGlza2xlc3NfZXhlYy10ZXJtaW5mby5vOiB0ZXJtaW5mby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkaXNrbGVzc19leGVjLXRlcm1pbmZvLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLXRlcm1pbmZvLlRwbyIgLWMgLW8gZGlza2xlc3NfZXhlYy10ZXJtaW5mby5vIGB0ZXN0IC1mICd0ZXJtaW5mby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0ZXJtaW5mby5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy10ZXJtaW5mby5UcG8iICIkKERFUERJUikvZGlza2xlc3NfZXhlYy10ZXJtaW5mby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLXRlcm1pbmZvLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3Rlcm1pbmZvLmMnIG9iamVjdD0nZGlza2xlc3NfZXhlYy10ZXJtaW5mby5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRpc2tsZXNzX2V4ZWMtdGVybWluZm8ubyBgdGVzdCAtZiAndGVybWluZm8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgdGVybWluZm8uYworCitkaXNrbGVzc19leGVjLXRlcm1pbmZvLm9iajogdGVybWluZm8uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGlza2xlc3NfZXhlYy10ZXJtaW5mby5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLXRlcm1pbmZvLlRwbyIgLWMgLW8gZGlza2xlc3NfZXhlYy10ZXJtaW5mby5vYmogYGlmIHRlc3QgLWYgJ3Rlcm1pbmZvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndGVybWluZm8uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdGVybWluZm8uYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtdGVybWluZm8uVHBvIiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtdGVybWluZm8uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy10ZXJtaW5mby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0ZXJtaW5mby5jJyBvYmplY3Q9J2Rpc2tsZXNzX2V4ZWMtdGVybWluZm8ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRpc2tsZXNzX2V4ZWMtdGVybWluZm8ub2JqIGBpZiB0ZXN0IC1mICd0ZXJtaW5mby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3Rlcm1pbmZvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3Rlcm1pbmZvLmMnOyBmaWAKKworZGlza2xlc3NfZXhlYy10cGFybS5vOiB0cGFybS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBkaXNrbGVzc19leGVjLXRwYXJtLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLXRwYXJtLlRwbyIgLWMgLW8gZGlza2xlc3NfZXhlYy10cGFybS5vIGB0ZXN0IC1mICd0cGFybS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0cGFybS5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy10cGFybS5UcG8iICIkKERFUERJUikvZGlza2xlc3NfZXhlYy10cGFybS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLXRwYXJtLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3RwYXJtLmMnIG9iamVjdD0nZGlza2xlc3NfZXhlYy10cGFybS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRpc2tsZXNzX2V4ZWMtdHBhcm0ubyBgdGVzdCAtZiAndHBhcm0uYycgfHwgZWNobyAnJChzcmNkaXIpLydgdHBhcm0uYworCitkaXNrbGVzc19leGVjLXRwYXJtLm9iajogdHBhcm0uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZGlza2xlc3NfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZGlza2xlc3NfZXhlYy10cGFybS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9kaXNrbGVzc19leGVjLXRwYXJtLlRwbyIgLWMgLW8gZGlza2xlc3NfZXhlYy10cGFybS5vYmogYGlmIHRlc3QgLWYgJ3RwYXJtLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndHBhcm0uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdHBhcm0uYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtdHBhcm0uVHBvIiAiJChERVBESVIpL2Rpc2tsZXNzX2V4ZWMtdHBhcm0uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZGlza2xlc3NfZXhlYy10cGFybS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0cGFybS5jJyBvYmplY3Q9J2Rpc2tsZXNzX2V4ZWMtdHBhcm0ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChkaXNrbGVzc19leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGRpc2tsZXNzX2V4ZWMtdHBhcm0ub2JqIGBpZiB0ZXN0IC1mICd0cGFybS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3RwYXJtLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3RwYXJtLmMnOyBmaWAKKworZTJmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5vOiBjb21tb24uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZTJmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBlMmZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9lMmZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLlRwbyIgLWMgLW8gZTJmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5vIGB0ZXN0IC1mICdjb21tb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29tbW9uLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9lMmZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLlRwbyIgIiQoREVQRElSKS9lMmZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2UyZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29tbW9uLmMnIG9iamVjdD0nZTJmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChlMmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZTJmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5vIGB0ZXN0IC1mICdjb21tb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29tbW9uLmMKKworZTJmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5vYmo6IGNvbW1vbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChlMmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGUyZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24ub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvZTJmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5UcG8iIC1jIC1vIGUyZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24ub2JqIGBpZiB0ZXN0IC1mICdjb21tb24uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb21tb24uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29tbW9uLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9lMmZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLlRwbyIgIiQoREVQRElSKS9lMmZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2UyZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29tbW9uLmMnIG9iamVjdD0nZTJmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGUyZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBlMmZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLm9iaiBgaWYgdGVzdCAtZiAnY29tbW9uLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29tbW9uLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbW1vbi5jJzsgZmlgCisKK2UyZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm86IGNoYXJfaW8uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZTJmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBlMmZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvZTJmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8uVHBvIiAtYyAtbyBlMmZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vIGB0ZXN0IC1mICdjaGFyX2lvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNoYXJfaW8uYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2UyZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlRwbyIgIiQoREVQRElSKS9lMmZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9lMmZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjaGFyX2lvLmMnIG9iamVjdD0nZTJmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZTJmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGUyZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm8gYHRlc3QgLWYgJ2NoYXJfaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY2hhcl9pby5jCisKK2UyZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm9iajogY2hhcl9pby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChlMmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGUyZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2UyZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlRwbyIgLWMgLW8gZTJmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8ub2JqIGBpZiB0ZXN0IC1mICdjaGFyX2lvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY2hhcl9pby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jaGFyX2lvLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9lMmZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5UcG8iICIkKERFUERJUikvZTJmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZTJmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY2hhcl9pby5jJyBvYmplY3Q9J2UyZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZTJmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGUyZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm9iaiBgaWYgdGVzdCAtZiAnY2hhcl9pby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NoYXJfaW8uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY2hhcl9pby5jJzsgZmlgCisKK2UyZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm86IGRpc2tfaW8uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZTJmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBlMmZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvZTJmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8uVHBvIiAtYyAtbyBlMmZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5vIGB0ZXN0IC1mICdkaXNrX2lvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRpc2tfaW8uYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2UyZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlRwbyIgIiQoREVQRElSKS9lMmZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9lMmZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkaXNrX2lvLmMnIG9iamVjdD0nZTJmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZTJmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGUyZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm8gYHRlc3QgLWYgJ2Rpc2tfaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGlza19pby5jCisKK2UyZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm9iajogZGlza19pby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChlMmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGUyZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2UyZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlRwbyIgLWMgLW8gZTJmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8ub2JqIGBpZiB0ZXN0IC1mICdkaXNrX2lvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGlza19pby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kaXNrX2lvLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9lMmZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5UcG8iICIkKERFUERJUikvZTJmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZTJmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGlza19pby5jJyBvYmplY3Q9J2UyZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZTJmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGUyZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm9iaiBgaWYgdGVzdCAtZiAnZGlza19pby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Rpc2tfaW8uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZGlza19pby5jJzsgZmlgCisKK2UyZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vOiBzdGFnZTFfNS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChlMmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGUyZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvZTJmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81LlRwbyIgLWMgLW8gZTJmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm8gYHRlc3QgLWYgJ3N0YWdlMV81LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHN0YWdlMV81LmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9lMmZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuVHBvIiAiJChERVBESVIpL2UyZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9lMmZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3RhZ2UxXzUuYycgb2JqZWN0PSdlMmZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZTJmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGUyZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vIGB0ZXN0IC1mICdzdGFnZTFfNS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzdGFnZTFfNS5jCisKK2UyZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vYmo6IHN0YWdlMV81LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGUyZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZTJmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2UyZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5UcG8iIC1jIC1vIGUyZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vYmogYGlmIHRlc3QgLWYgJ3N0YWdlMV81LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3RhZ2UxXzUuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3RhZ2UxXzUuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2UyZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5UcG8iICIkKERFUERJUikvZTJmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2UyZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzdGFnZTFfNS5jJyBvYmplY3Q9J2UyZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGUyZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBlMmZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUub2JqIGBpZiB0ZXN0IC1mICdzdGFnZTFfNS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3N0YWdlMV81LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N0YWdlMV81LmMnOyBmaWAKKworZTJmc19zdGFnZTFfNV9leGVjLWZzeXNfZXh0MmZzLm86IGZzeXNfZXh0MmZzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGUyZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZTJmc19zdGFnZTFfNV9leGVjLWZzeXNfZXh0MmZzLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9lMmZzX3N0YWdlMV81X2V4ZWMtZnN5c19leHQyZnMuVHBvIiAtYyAtbyBlMmZzX3N0YWdlMV81X2V4ZWMtZnN5c19leHQyZnMubyBgdGVzdCAtZiAnZnN5c19leHQyZnMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c19leHQyZnMuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2UyZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX2V4dDJmcy5UcG8iICIkKERFUERJUikvZTJmc19zdGFnZTFfNV9leGVjLWZzeXNfZXh0MmZzLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2UyZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX2V4dDJmcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmc3lzX2V4dDJmcy5jJyBvYmplY3Q9J2UyZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX2V4dDJmcy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChlMmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZTJmc19zdGFnZTFfNV9leGVjLWZzeXNfZXh0MmZzLm8gYHRlc3QgLWYgJ2ZzeXNfZXh0MmZzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfZXh0MmZzLmMKKworZTJmc19zdGFnZTFfNV9leGVjLWZzeXNfZXh0MmZzLm9iajogZnN5c19leHQyZnMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZTJmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBlMmZzX3N0YWdlMV81X2V4ZWMtZnN5c19leHQyZnMub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvZTJmc19zdGFnZTFfNV9leGVjLWZzeXNfZXh0MmZzLlRwbyIgLWMgLW8gZTJmc19zdGFnZTFfNV9leGVjLWZzeXNfZXh0MmZzLm9iaiBgaWYgdGVzdCAtZiAnZnN5c19leHQyZnMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX2V4dDJmcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX2V4dDJmcy5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvZTJmc19zdGFnZTFfNV9leGVjLWZzeXNfZXh0MmZzLlRwbyIgIiQoREVQRElSKS9lMmZzX3N0YWdlMV81X2V4ZWMtZnN5c19leHQyZnMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZTJmc19zdGFnZTFfNV9leGVjLWZzeXNfZXh0MmZzLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfZXh0MmZzLmMnIG9iamVjdD0nZTJmc19zdGFnZTFfNV9leGVjLWZzeXNfZXh0MmZzLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZTJmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGUyZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX2V4dDJmcy5vYmogYGlmIHRlc3QgLWYgJ2ZzeXNfZXh0MmZzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c19leHQyZnMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c19leHQyZnMuYyc7IGZpYAorCitlMmZzX3N0YWdlMV81X2V4ZWMtYmlvcy5vOiBiaW9zLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGUyZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZTJmc19zdGFnZTFfNV9leGVjLWJpb3MubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2UyZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLlRwbyIgLWMgLW8gZTJmc19zdGFnZTFfNV9leGVjLWJpb3MubyBgdGVzdCAtZiAnYmlvcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BiaW9zLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9lMmZzX3N0YWdlMV81X2V4ZWMtYmlvcy5UcG8iICIkKERFUERJUikvZTJmc19zdGFnZTFfNV9leGVjLWJpb3MuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZTJmc19zdGFnZTFfNV9leGVjLWJpb3MuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nYmlvcy5jJyBvYmplY3Q9J2UyZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGUyZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBlMmZzX3N0YWdlMV81X2V4ZWMtYmlvcy5vIGB0ZXN0IC1mICdiaW9zLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGJpb3MuYworCitlMmZzX3N0YWdlMV81X2V4ZWMtYmlvcy5vYmo6IGJpb3MuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZTJmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBlMmZzX3N0YWdlMV81X2V4ZWMtYmlvcy5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9lMmZzX3N0YWdlMV81X2V4ZWMtYmlvcy5UcG8iIC1jIC1vIGUyZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLm9iaiBgaWYgdGVzdCAtZiAnYmlvcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Jpb3MuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvYmlvcy5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvZTJmc19zdGFnZTFfNV9leGVjLWJpb3MuVHBvIiAiJChERVBESVIpL2UyZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2UyZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Jpb3MuYycgb2JqZWN0PSdlMmZzX3N0YWdlMV81X2V4ZWMtYmlvcy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGUyZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBlMmZzX3N0YWdlMV81X2V4ZWMtYmlvcy5vYmogYGlmIHRlc3QgLWYgJ2Jpb3MuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdiaW9zLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Jpb3MuYyc7IGZpYAorCitmYXRfc3RhZ2UxXzVfZXhlYy1jb21tb24ubzogY29tbW9uLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGZhdF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBmYXRfc3RhZ2UxXzVfZXhlYy1jb21tb24ubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2ZhdF9zdGFnZTFfNV9leGVjLWNvbW1vbi5UcG8iIC1jIC1vIGZhdF9zdGFnZTFfNV9leGVjLWNvbW1vbi5vIGB0ZXN0IC1mICdjb21tb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29tbW9uLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9mYXRfc3RhZ2UxXzVfZXhlYy1jb21tb24uVHBvIiAiJChERVBESVIpL2ZhdF9zdGFnZTFfNV9leGVjLWNvbW1vbi5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9mYXRfc3RhZ2UxXzVfZXhlYy1jb21tb24uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29tbW9uLmMnIG9iamVjdD0nZmF0X3N0YWdlMV81X2V4ZWMtY29tbW9uLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGZhdF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGZhdF9zdGFnZTFfNV9leGVjLWNvbW1vbi5vIGB0ZXN0IC1mICdjb21tb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29tbW9uLmMKKworZmF0X3N0YWdlMV81X2V4ZWMtY29tbW9uLm9iajogY29tbW9uLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGZhdF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBmYXRfc3RhZ2UxXzVfZXhlYy1jb21tb24ub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvZmF0X3N0YWdlMV81X2V4ZWMtY29tbW9uLlRwbyIgLWMgLW8gZmF0X3N0YWdlMV81X2V4ZWMtY29tbW9uLm9iaiBgaWYgdGVzdCAtZiAnY29tbW9uLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29tbW9uLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbW1vbi5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvZmF0X3N0YWdlMV81X2V4ZWMtY29tbW9uLlRwbyIgIiQoREVQRElSKS9mYXRfc3RhZ2UxXzVfZXhlYy1jb21tb24uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZmF0X3N0YWdlMV81X2V4ZWMtY29tbW9uLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbW1vbi5jJyBvYmplY3Q9J2ZhdF9zdGFnZTFfNV9leGVjLWNvbW1vbi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGZhdF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGZhdF9zdGFnZTFfNV9leGVjLWNvbW1vbi5vYmogYGlmIHRlc3QgLWYgJ2NvbW1vbi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbW1vbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb21tb24uYyc7IGZpYAorCitmYXRfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm86IGNoYXJfaW8uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZmF0X3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGZhdF9zdGFnZTFfNV9leGVjLWNoYXJfaW8ubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2ZhdF9zdGFnZTFfNV9leGVjLWNoYXJfaW8uVHBvIiAtYyAtbyBmYXRfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm8gYHRlc3QgLWYgJ2NoYXJfaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY2hhcl9pby5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvZmF0X3N0YWdlMV81X2V4ZWMtY2hhcl9pby5UcG8iICIkKERFUERJUikvZmF0X3N0YWdlMV81X2V4ZWMtY2hhcl9pby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9mYXRfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NoYXJfaW8uYycgb2JqZWN0PSdmYXRfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGZhdF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGZhdF9zdGFnZTFfNV9leGVjLWNoYXJfaW8ubyBgdGVzdCAtZiAnY2hhcl9pby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BjaGFyX2lvLmMKKworZmF0X3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vYmo6IGNoYXJfaW8uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZmF0X3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGZhdF9zdGFnZTFfNV9leGVjLWNoYXJfaW8ub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvZmF0X3N0YWdlMV81X2V4ZWMtY2hhcl9pby5UcG8iIC1jIC1vIGZhdF9zdGFnZTFfNV9leGVjLWNoYXJfaW8ub2JqIGBpZiB0ZXN0IC1mICdjaGFyX2lvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY2hhcl9pby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jaGFyX2lvLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9mYXRfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlRwbyIgIiQoREVQRElSKS9mYXRfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2ZhdF9zdGFnZTFfNV9leGVjLWNoYXJfaW8uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY2hhcl9pby5jJyBvYmplY3Q9J2ZhdF9zdGFnZTFfNV9leGVjLWNoYXJfaW8ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChmYXRfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBmYXRfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm9iaiBgaWYgdGVzdCAtZiAnY2hhcl9pby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NoYXJfaW8uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY2hhcl9pby5jJzsgZmlgCisKK2ZhdF9zdGFnZTFfNV9leGVjLWRpc2tfaW8ubzogZGlza19pby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChmYXRfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZmF0X3N0YWdlMV81X2V4ZWMtZGlza19pby5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvZmF0X3N0YWdlMV81X2V4ZWMtZGlza19pby5UcG8iIC1jIC1vIGZhdF9zdGFnZTFfNV9leGVjLWRpc2tfaW8ubyBgdGVzdCAtZiAnZGlza19pby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkaXNrX2lvLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9mYXRfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlRwbyIgIiQoREVQRElSKS9mYXRfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2ZhdF9zdGFnZTFfNV9leGVjLWRpc2tfaW8uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGlza19pby5jJyBvYmplY3Q9J2ZhdF9zdGFnZTFfNV9leGVjLWRpc2tfaW8ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZmF0X3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZmF0X3N0YWdlMV81X2V4ZWMtZGlza19pby5vIGB0ZXN0IC1mICdkaXNrX2lvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRpc2tfaW8uYworCitmYXRfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm9iajogZGlza19pby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChmYXRfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZmF0X3N0YWdlMV81X2V4ZWMtZGlza19pby5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9mYXRfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlRwbyIgLWMgLW8gZmF0X3N0YWdlMV81X2V4ZWMtZGlza19pby5vYmogYGlmIHRlc3QgLWYgJ2Rpc2tfaW8uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkaXNrX2lvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Rpc2tfaW8uYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2ZhdF9zdGFnZTFfNV9leGVjLWRpc2tfaW8uVHBvIiAiJChERVBESVIpL2ZhdF9zdGFnZTFfNV9leGVjLWRpc2tfaW8uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZmF0X3N0YWdlMV81X2V4ZWMtZGlza19pby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkaXNrX2lvLmMnIG9iamVjdD0nZmF0X3N0YWdlMV81X2V4ZWMtZGlza19pby5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGZhdF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGZhdF9zdGFnZTFfNV9leGVjLWRpc2tfaW8ub2JqIGBpZiB0ZXN0IC1mICdkaXNrX2lvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGlza19pby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kaXNrX2lvLmMnOyBmaWAKKworZmF0X3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUubzogc3RhZ2UxXzUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZmF0X3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGZhdF9zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9mYXRfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5UcG8iIC1jIC1vIGZhdF9zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm8gYHRlc3QgLWYgJ3N0YWdlMV81LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHN0YWdlMV81LmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9mYXRfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5UcG8iICIkKERFUERJUikvZmF0X3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZmF0X3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3RhZ2UxXzUuYycgb2JqZWN0PSdmYXRfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChmYXRfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBmYXRfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vIGB0ZXN0IC1mICdzdGFnZTFfNS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzdGFnZTFfNS5jCisKK2ZhdF9zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm9iajogc3RhZ2UxXzUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZmF0X3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGZhdF9zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2ZhdF9zdGFnZTFfNV9leGVjLXN0YWdlMV81LlRwbyIgLWMgLW8gZmF0X3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUub2JqIGBpZiB0ZXN0IC1mICdzdGFnZTFfNS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3N0YWdlMV81LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N0YWdlMV81LmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9mYXRfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5UcG8iICIkKERFUERJUikvZmF0X3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZmF0X3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3RhZ2UxXzUuYycgb2JqZWN0PSdmYXRfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGZhdF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGZhdF9zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm9iaiBgaWYgdGVzdCAtZiAnc3RhZ2UxXzUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzdGFnZTFfNS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zdGFnZTFfNS5jJzsgZmlgCisKK2ZhdF9zdGFnZTFfNV9leGVjLWZzeXNfZmF0Lm86IGZzeXNfZmF0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGZhdF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBmYXRfc3RhZ2UxXzVfZXhlYy1mc3lzX2ZhdC5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvZmF0X3N0YWdlMV81X2V4ZWMtZnN5c19mYXQuVHBvIiAtYyAtbyBmYXRfc3RhZ2UxXzVfZXhlYy1mc3lzX2ZhdC5vIGB0ZXN0IC1mICdmc3lzX2ZhdC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bmc3lzX2ZhdC5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvZmF0X3N0YWdlMV81X2V4ZWMtZnN5c19mYXQuVHBvIiAiJChERVBESVIpL2ZhdF9zdGFnZTFfNV9leGVjLWZzeXNfZmF0LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2ZhdF9zdGFnZTFfNV9leGVjLWZzeXNfZmF0LlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfZmF0LmMnIG9iamVjdD0nZmF0X3N0YWdlMV81X2V4ZWMtZnN5c19mYXQubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZmF0X3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZmF0X3N0YWdlMV81X2V4ZWMtZnN5c19mYXQubyBgdGVzdCAtZiAnZnN5c19mYXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c19mYXQuYworCitmYXRfc3RhZ2UxXzVfZXhlYy1mc3lzX2ZhdC5vYmo6IGZzeXNfZmF0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGZhdF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBmYXRfc3RhZ2UxXzVfZXhlYy1mc3lzX2ZhdC5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9mYXRfc3RhZ2UxXzVfZXhlYy1mc3lzX2ZhdC5UcG8iIC1jIC1vIGZhdF9zdGFnZTFfNV9leGVjLWZzeXNfZmF0Lm9iaiBgaWYgdGVzdCAtZiAnZnN5c19mYXQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX2ZhdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX2ZhdC5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvZmF0X3N0YWdlMV81X2V4ZWMtZnN5c19mYXQuVHBvIiAiJChERVBESVIpL2ZhdF9zdGFnZTFfNV9leGVjLWZzeXNfZmF0LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2ZhdF9zdGFnZTFfNV9leGVjLWZzeXNfZmF0LlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfZmF0LmMnIG9iamVjdD0nZmF0X3N0YWdlMV81X2V4ZWMtZnN5c19mYXQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChmYXRfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBmYXRfc3RhZ2UxXzVfZXhlYy1mc3lzX2ZhdC5vYmogYGlmIHRlc3QgLWYgJ2ZzeXNfZmF0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c19mYXQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c19mYXQuYyc7IGZpYAorCitmYXRfc3RhZ2UxXzVfZXhlYy1iaW9zLm86IGJpb3MuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZmF0X3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGZhdF9zdGFnZTFfNV9leGVjLWJpb3MubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2ZhdF9zdGFnZTFfNV9leGVjLWJpb3MuVHBvIiAtYyAtbyBmYXRfc3RhZ2UxXzVfZXhlYy1iaW9zLm8gYHRlc3QgLWYgJ2Jpb3MuYycgfHwgZWNobyAnJChzcmNkaXIpLydgYmlvcy5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvZmF0X3N0YWdlMV81X2V4ZWMtYmlvcy5UcG8iICIkKERFUERJUikvZmF0X3N0YWdlMV81X2V4ZWMtYmlvcy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9mYXRfc3RhZ2UxXzVfZXhlYy1iaW9zLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Jpb3MuYycgb2JqZWN0PSdmYXRfc3RhZ2UxXzVfZXhlYy1iaW9zLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGZhdF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGZhdF9zdGFnZTFfNV9leGVjLWJpb3MubyBgdGVzdCAtZiAnYmlvcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BiaW9zLmMKKworZmF0X3N0YWdlMV81X2V4ZWMtYmlvcy5vYmo6IGJpb3MuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZmF0X3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGZhdF9zdGFnZTFfNV9leGVjLWJpb3Mub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvZmF0X3N0YWdlMV81X2V4ZWMtYmlvcy5UcG8iIC1jIC1vIGZhdF9zdGFnZTFfNV9leGVjLWJpb3Mub2JqIGBpZiB0ZXN0IC1mICdiaW9zLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYmlvcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9iaW9zLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9mYXRfc3RhZ2UxXzVfZXhlYy1iaW9zLlRwbyIgIiQoREVQRElSKS9mYXRfc3RhZ2UxXzVfZXhlYy1iaW9zLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2ZhdF9zdGFnZTFfNV9leGVjLWJpb3MuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nYmlvcy5jJyBvYmplY3Q9J2ZhdF9zdGFnZTFfNV9leGVjLWJpb3Mub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChmYXRfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBmYXRfc3RhZ2UxXzVfZXhlYy1iaW9zLm9iaiBgaWYgdGVzdCAtZiAnYmlvcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Jpb3MuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvYmlvcy5jJzsgZmlgCisKK2Zmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5vOiBjb21tb24uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGZmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvZmZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLlRwbyIgLWMgLW8gZmZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLm8gYHRlc3QgLWYgJ2NvbW1vbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb21tb24uYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Zmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5UcG8iICIkKERFUERJUikvZmZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2Zmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb21tb24uYycgb2JqZWN0PSdmZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZmZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLm8gYHRlc3QgLWYgJ2NvbW1vbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb21tb24uYworCitmZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24ub2JqOiBjb21tb24uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGZmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9mZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24uVHBvIiAtYyAtbyBmZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24ub2JqIGBpZiB0ZXN0IC1mICdjb21tb24uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb21tb24uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29tbW9uLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9mZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24uVHBvIiAiJChERVBESVIpL2Zmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9mZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29tbW9uLmMnIG9iamVjdD0nZmZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZmZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLm9iaiBgaWYgdGVzdCAtZiAnY29tbW9uLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29tbW9uLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbW1vbi5jJzsgZmlgCisKK2Zmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8ubzogY2hhcl9pby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChmZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZmZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvZmZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5UcG8iIC1jIC1vIGZmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8ubyBgdGVzdCAtZiAnY2hhcl9pby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BjaGFyX2lvLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9mZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlRwbyIgIiQoREVQRElSKS9mZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2Zmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY2hhcl9pby5jJyBvYmplY3Q9J2Zmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZmZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vIGB0ZXN0IC1mICdjaGFyX2lvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNoYXJfaW8uYworCitmZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm9iajogY2hhcl9pby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChmZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZmZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9mZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlRwbyIgLWMgLW8gZmZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vYmogYGlmIHRlc3QgLWYgJ2NoYXJfaW8uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjaGFyX2lvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NoYXJfaW8uYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Zmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8uVHBvIiAiJChERVBESVIpL2Zmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZmZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjaGFyX2lvLmMnIG9iamVjdD0nZmZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGZmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGZmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8ub2JqIGBpZiB0ZXN0IC1mICdjaGFyX2lvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY2hhcl9pby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jaGFyX2lvLmMnOyBmaWAKKworZmZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5vOiBkaXNrX2lvLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGZmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBmZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9mZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlRwbyIgLWMgLW8gZmZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5vIGB0ZXN0IC1mICdkaXNrX2lvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRpc2tfaW8uYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Zmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8uVHBvIiAiJChERVBESVIpL2Zmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZmZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkaXNrX2lvLmMnIG9iamVjdD0nZmZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChmZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBmZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm8gYHRlc3QgLWYgJ2Rpc2tfaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGlza19pby5jCisKK2Zmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8ub2JqOiBkaXNrX2lvLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGZmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBmZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2Zmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8uVHBvIiAtYyAtbyBmZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm9iaiBgaWYgdGVzdCAtZiAnZGlza19pby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Rpc2tfaW8uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZGlza19pby5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvZmZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5UcG8iICIkKERFUERJUikvZmZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9mZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Rpc2tfaW8uYycgb2JqZWN0PSdmZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZmZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5vYmogYGlmIHRlc3QgLWYgJ2Rpc2tfaW8uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkaXNrX2lvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Rpc2tfaW8uYyc7IGZpYAorCitmZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vOiBzdGFnZTFfNS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChmZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZmZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2Zmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81LlRwbyIgLWMgLW8gZmZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUubyBgdGVzdCAtZiAnc3RhZ2UxXzUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3RhZ2UxXzUuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Zmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81LlRwbyIgIiQoREVQRElSKS9mZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9mZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzdGFnZTFfNS5jJyBvYmplY3Q9J2Zmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGZmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGZmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm8gYHRlc3QgLWYgJ3N0YWdlMV81LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHN0YWdlMV81LmMKKworZmZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUub2JqOiBzdGFnZTFfNS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChmZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZmZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvZmZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuVHBvIiAtYyAtbyBmZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vYmogYGlmIHRlc3QgLWYgJ3N0YWdlMV81LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3RhZ2UxXzUuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3RhZ2UxXzUuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Zmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81LlRwbyIgIiQoREVQRElSKS9mZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9mZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzdGFnZTFfNS5jJyBvYmplY3Q9J2Zmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZmZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUub2JqIGBpZiB0ZXN0IC1mICdzdGFnZTFfNS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3N0YWdlMV81LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N0YWdlMV81LmMnOyBmaWAKKworZmZzX3N0YWdlMV81X2V4ZWMtZnN5c19mZnMubzogZnN5c19mZnMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGZmc19zdGFnZTFfNV9leGVjLWZzeXNfZmZzLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9mZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX2Zmcy5UcG8iIC1jIC1vIGZmc19zdGFnZTFfNV9leGVjLWZzeXNfZmZzLm8gYHRlc3QgLWYgJ2ZzeXNfZmZzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfZmZzLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9mZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX2Zmcy5UcG8iICIkKERFUERJUikvZmZzX3N0YWdlMV81X2V4ZWMtZnN5c19mZnMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZmZzX3N0YWdlMV81X2V4ZWMtZnN5c19mZnMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c19mZnMuYycgb2JqZWN0PSdmZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX2Zmcy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChmZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBmZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX2Zmcy5vIGB0ZXN0IC1mICdmc3lzX2Zmcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bmc3lzX2Zmcy5jCisKK2Zmc19zdGFnZTFfNV9leGVjLWZzeXNfZmZzLm9iajogZnN5c19mZnMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGZmc19zdGFnZTFfNV9leGVjLWZzeXNfZmZzLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2Zmc19zdGFnZTFfNV9leGVjLWZzeXNfZmZzLlRwbyIgLWMgLW8gZmZzX3N0YWdlMV81X2V4ZWMtZnN5c19mZnMub2JqIGBpZiB0ZXN0IC1mICdmc3lzX2Zmcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfZmZzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfZmZzLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9mZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX2Zmcy5UcG8iICIkKERFUERJUikvZmZzX3N0YWdlMV81X2V4ZWMtZnN5c19mZnMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZmZzX3N0YWdlMV81X2V4ZWMtZnN5c19mZnMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c19mZnMuYycgb2JqZWN0PSdmZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX2Zmcy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGZmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGZmc19zdGFnZTFfNV9leGVjLWZzeXNfZmZzLm9iaiBgaWYgdGVzdCAtZiAnZnN5c19mZnMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX2Zmcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX2Zmcy5jJzsgZmlgCisKK2Zmc19zdGFnZTFfNV9leGVjLWJpb3MubzogYmlvcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChmZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZmZzX3N0YWdlMV81X2V4ZWMtYmlvcy5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvZmZzX3N0YWdlMV81X2V4ZWMtYmlvcy5UcG8iIC1jIC1vIGZmc19zdGFnZTFfNV9leGVjLWJpb3MubyBgdGVzdCAtZiAnYmlvcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BiaW9zLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9mZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLlRwbyIgIiQoREVQRElSKS9mZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2Zmc19zdGFnZTFfNV9leGVjLWJpb3MuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nYmlvcy5jJyBvYmplY3Q9J2Zmc19zdGFnZTFfNV9leGVjLWJpb3MubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZmZzX3N0YWdlMV81X2V4ZWMtYmlvcy5vIGB0ZXN0IC1mICdiaW9zLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGJpb3MuYworCitmZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLm9iajogYmlvcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChmZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZmZzX3N0YWdlMV81X2V4ZWMtYmlvcy5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9mZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLlRwbyIgLWMgLW8gZmZzX3N0YWdlMV81X2V4ZWMtYmlvcy5vYmogYGlmIHRlc3QgLWYgJ2Jpb3MuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdiaW9zLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Jpb3MuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2Zmc19zdGFnZTFfNV9leGVjLWJpb3MuVHBvIiAiJChERVBESVIpL2Zmc19zdGFnZTFfNV9leGVjLWJpb3MuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvZmZzX3N0YWdlMV81X2V4ZWMtYmlvcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdiaW9zLmMnIG9iamVjdD0nZmZzX3N0YWdlMV81X2V4ZWMtYmlvcy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGZmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGZmc19zdGFnZTFfNV9leGVjLWJpb3Mub2JqIGBpZiB0ZXN0IC1mICdiaW9zLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYmlvcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9iaW9zLmMnOyBmaWAKKworaXNvOTY2MF9zdGFnZTFfNV9leGVjLWNvbW1vbi5vOiBjb21tb24uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoaXNvOTY2MF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBpc285NjYwX3N0YWdlMV81X2V4ZWMtY29tbW9uLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9pc285NjYwX3N0YWdlMV81X2V4ZWMtY29tbW9uLlRwbyIgLWMgLW8gaXNvOTY2MF9zdGFnZTFfNV9leGVjLWNvbW1vbi5vIGB0ZXN0IC1mICdjb21tb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29tbW9uLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9pc285NjYwX3N0YWdlMV81X2V4ZWMtY29tbW9uLlRwbyIgIiQoREVQRElSKS9pc285NjYwX3N0YWdlMV81X2V4ZWMtY29tbW9uLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1jb21tb24uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29tbW9uLmMnIG9iamVjdD0naXNvOTY2MF9zdGFnZTFfNV9leGVjLWNvbW1vbi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChpc285NjYwX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gaXNvOTY2MF9zdGFnZTFfNV9leGVjLWNvbW1vbi5vIGB0ZXN0IC1mICdjb21tb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29tbW9uLmMKKworaXNvOTY2MF9zdGFnZTFfNV9leGVjLWNvbW1vbi5vYmo6IGNvbW1vbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChpc285NjYwX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGlzbzk2NjBfc3RhZ2UxXzVfZXhlYy1jb21tb24ub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvaXNvOTY2MF9zdGFnZTFfNV9leGVjLWNvbW1vbi5UcG8iIC1jIC1vIGlzbzk2NjBfc3RhZ2UxXzVfZXhlYy1jb21tb24ub2JqIGBpZiB0ZXN0IC1mICdjb21tb24uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb21tb24uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29tbW9uLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9pc285NjYwX3N0YWdlMV81X2V4ZWMtY29tbW9uLlRwbyIgIiQoREVQRElSKS9pc285NjYwX3N0YWdlMV81X2V4ZWMtY29tbW9uLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1jb21tb24uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29tbW9uLmMnIG9iamVjdD0naXNvOTY2MF9zdGFnZTFfNV9leGVjLWNvbW1vbi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGlzbzk2NjBfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBpc285NjYwX3N0YWdlMV81X2V4ZWMtY29tbW9uLm9iaiBgaWYgdGVzdCAtZiAnY29tbW9uLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29tbW9uLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbW1vbi5jJzsgZmlgCisKK2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm86IGNoYXJfaW8uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoaXNvOTY2MF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBpc285NjYwX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvaXNvOTY2MF9zdGFnZTFfNV9leGVjLWNoYXJfaW8uVHBvIiAtYyAtbyBpc285NjYwX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vIGB0ZXN0IC1mICdjaGFyX2lvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNoYXJfaW8uYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlRwbyIgIiQoREVQRElSKS9pc285NjYwX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9pc285NjYwX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjaGFyX2lvLmMnIG9iamVjdD0naXNvOTY2MF9zdGFnZTFfNV9leGVjLWNoYXJfaW8ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoaXNvOTY2MF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGlzbzk2NjBfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm8gYHRlc3QgLWYgJ2NoYXJfaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY2hhcl9pby5jCisKK2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm9iajogY2hhcl9pby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChpc285NjYwX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGlzbzk2NjBfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlRwbyIgLWMgLW8gaXNvOTY2MF9zdGFnZTFfNV9leGVjLWNoYXJfaW8ub2JqIGBpZiB0ZXN0IC1mICdjaGFyX2lvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY2hhcl9pby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jaGFyX2lvLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9pc285NjYwX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5UcG8iICIkKERFUERJUikvaXNvOTY2MF9zdGFnZTFfNV9leGVjLWNoYXJfaW8uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvaXNvOTY2MF9zdGFnZTFfNV9leGVjLWNoYXJfaW8uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY2hhcl9pby5jJyBvYmplY3Q9J2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoaXNvOTY2MF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGlzbzk2NjBfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm9iaiBgaWYgdGVzdCAtZiAnY2hhcl9pby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NoYXJfaW8uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY2hhcl9pby5jJzsgZmlgCisKK2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm86IGRpc2tfaW8uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoaXNvOTY2MF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBpc285NjYwX3N0YWdlMV81X2V4ZWMtZGlza19pby5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvaXNvOTY2MF9zdGFnZTFfNV9leGVjLWRpc2tfaW8uVHBvIiAtYyAtbyBpc285NjYwX3N0YWdlMV81X2V4ZWMtZGlza19pby5vIGB0ZXN0IC1mICdkaXNrX2lvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRpc2tfaW8uYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlRwbyIgIiQoREVQRElSKS9pc285NjYwX3N0YWdlMV81X2V4ZWMtZGlza19pby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9pc285NjYwX3N0YWdlMV81X2V4ZWMtZGlza19pby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkaXNrX2lvLmMnIG9iamVjdD0naXNvOTY2MF9zdGFnZTFfNV9leGVjLWRpc2tfaW8ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoaXNvOTY2MF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGlzbzk2NjBfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm8gYHRlc3QgLWYgJ2Rpc2tfaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGlza19pby5jCisKK2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm9iajogZGlza19pby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChpc285NjYwX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGlzbzk2NjBfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlRwbyIgLWMgLW8gaXNvOTY2MF9zdGFnZTFfNV9leGVjLWRpc2tfaW8ub2JqIGBpZiB0ZXN0IC1mICdkaXNrX2lvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGlza19pby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kaXNrX2lvLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9pc285NjYwX3N0YWdlMV81X2V4ZWMtZGlza19pby5UcG8iICIkKERFUERJUikvaXNvOTY2MF9zdGFnZTFfNV9leGVjLWRpc2tfaW8uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvaXNvOTY2MF9zdGFnZTFfNV9leGVjLWRpc2tfaW8uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGlza19pby5jJyBvYmplY3Q9J2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoaXNvOTY2MF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGlzbzk2NjBfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm9iaiBgaWYgdGVzdCAtZiAnZGlza19pby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Rpc2tfaW8uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZGlza19pby5jJzsgZmlgCisKK2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vOiBzdGFnZTFfNS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChpc285NjYwX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGlzbzk2NjBfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvaXNvOTY2MF9zdGFnZTFfNV9leGVjLXN0YWdlMV81LlRwbyIgLWMgLW8gaXNvOTY2MF9zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm8gYHRlc3QgLWYgJ3N0YWdlMV81LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHN0YWdlMV81LmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9pc285NjYwX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuVHBvIiAiJChERVBESVIpL2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9pc285NjYwX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3RhZ2UxXzUuYycgb2JqZWN0PSdpc285NjYwX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoaXNvOTY2MF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGlzbzk2NjBfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vIGB0ZXN0IC1mICdzdGFnZTFfNS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzdGFnZTFfNS5jCisKK2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vYmo6IHN0YWdlMV81LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGlzbzk2NjBfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgaXNvOTY2MF9zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5UcG8iIC1jIC1vIGlzbzk2NjBfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vYmogYGlmIHRlc3QgLWYgJ3N0YWdlMV81LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3RhZ2UxXzUuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3RhZ2UxXzUuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5UcG8iICIkKERFUERJUikvaXNvOTY2MF9zdGFnZTFfNV9leGVjLXN0YWdlMV81LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzdGFnZTFfNS5jJyBvYmplY3Q9J2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGlzbzk2NjBfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBpc285NjYwX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUub2JqIGBpZiB0ZXN0IC1mICdzdGFnZTFfNS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3N0YWdlMV81LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N0YWdlMV81LmMnOyBmaWAKKworaXNvOTY2MF9zdGFnZTFfNV9leGVjLWZzeXNfaXNvOTY2MC5vOiBmc3lzX2lzbzk2NjAuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoaXNvOTY2MF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBpc285NjYwX3N0YWdlMV81X2V4ZWMtZnN5c19pc285NjYwLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9pc285NjYwX3N0YWdlMV81X2V4ZWMtZnN5c19pc285NjYwLlRwbyIgLWMgLW8gaXNvOTY2MF9zdGFnZTFfNV9leGVjLWZzeXNfaXNvOTY2MC5vIGB0ZXN0IC1mICdmc3lzX2lzbzk2NjAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c19pc285NjYwLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9pc285NjYwX3N0YWdlMV81X2V4ZWMtZnN5c19pc285NjYwLlRwbyIgIiQoREVQRElSKS9pc285NjYwX3N0YWdlMV81X2V4ZWMtZnN5c19pc285NjYwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1mc3lzX2lzbzk2NjAuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c19pc285NjYwLmMnIG9iamVjdD0naXNvOTY2MF9zdGFnZTFfNV9leGVjLWZzeXNfaXNvOTY2MC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChpc285NjYwX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gaXNvOTY2MF9zdGFnZTFfNV9leGVjLWZzeXNfaXNvOTY2MC5vIGB0ZXN0IC1mICdmc3lzX2lzbzk2NjAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c19pc285NjYwLmMKKworaXNvOTY2MF9zdGFnZTFfNV9leGVjLWZzeXNfaXNvOTY2MC5vYmo6IGZzeXNfaXNvOTY2MC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChpc285NjYwX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGlzbzk2NjBfc3RhZ2UxXzVfZXhlYy1mc3lzX2lzbzk2NjAub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvaXNvOTY2MF9zdGFnZTFfNV9leGVjLWZzeXNfaXNvOTY2MC5UcG8iIC1jIC1vIGlzbzk2NjBfc3RhZ2UxXzVfZXhlYy1mc3lzX2lzbzk2NjAub2JqIGBpZiB0ZXN0IC1mICdmc3lzX2lzbzk2NjAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX2lzbzk2NjAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c19pc285NjYwLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9pc285NjYwX3N0YWdlMV81X2V4ZWMtZnN5c19pc285NjYwLlRwbyIgIiQoREVQRElSKS9pc285NjYwX3N0YWdlMV81X2V4ZWMtZnN5c19pc285NjYwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1mc3lzX2lzbzk2NjAuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c19pc285NjYwLmMnIG9iamVjdD0naXNvOTY2MF9zdGFnZTFfNV9leGVjLWZzeXNfaXNvOTY2MC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGlzbzk2NjBfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBpc285NjYwX3N0YWdlMV81X2V4ZWMtZnN5c19pc285NjYwLm9iaiBgaWYgdGVzdCAtZiAnZnN5c19pc285NjYwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c19pc285NjYwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfaXNvOTY2MC5jJzsgZmlgCisKK2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1iaW9zLm86IGJpb3MuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoaXNvOTY2MF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBpc285NjYwX3N0YWdlMV81X2V4ZWMtYmlvcy5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvaXNvOTY2MF9zdGFnZTFfNV9leGVjLWJpb3MuVHBvIiAtYyAtbyBpc285NjYwX3N0YWdlMV81X2V4ZWMtYmlvcy5vIGB0ZXN0IC1mICdiaW9zLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGJpb3MuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1iaW9zLlRwbyIgIiQoREVQRElSKS9pc285NjYwX3N0YWdlMV81X2V4ZWMtYmlvcy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9pc285NjYwX3N0YWdlMV81X2V4ZWMtYmlvcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdiaW9zLmMnIG9iamVjdD0naXNvOTY2MF9zdGFnZTFfNV9leGVjLWJpb3MubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoaXNvOTY2MF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGlzbzk2NjBfc3RhZ2UxXzVfZXhlYy1iaW9zLm8gYHRlc3QgLWYgJ2Jpb3MuYycgfHwgZWNobyAnJChzcmNkaXIpLydgYmlvcy5jCisKK2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1iaW9zLm9iajogYmlvcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChpc285NjYwX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGlzbzk2NjBfc3RhZ2UxXzVfZXhlYy1iaW9zLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1iaW9zLlRwbyIgLWMgLW8gaXNvOTY2MF9zdGFnZTFfNV9leGVjLWJpb3Mub2JqIGBpZiB0ZXN0IC1mICdiaW9zLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYmlvcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9iaW9zLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9pc285NjYwX3N0YWdlMV81X2V4ZWMtYmlvcy5UcG8iICIkKERFUERJUikvaXNvOTY2MF9zdGFnZTFfNV9leGVjLWJpb3MuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvaXNvOTY2MF9zdGFnZTFfNV9leGVjLWJpb3MuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nYmlvcy5jJyBvYmplY3Q9J2lzbzk2NjBfc3RhZ2UxXzVfZXhlYy1iaW9zLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoaXNvOTY2MF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGlzbzk2NjBfc3RhZ2UxXzVfZXhlYy1iaW9zLm9iaiBgaWYgdGVzdCAtZiAnYmlvcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Jpb3MuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvYmlvcy5jJzsgZmlgCisKK2pmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5vOiBjb21tb24uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoamZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGpmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvamZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLlRwbyIgLWMgLW8gamZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLm8gYHRlc3QgLWYgJ2NvbW1vbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb21tb24uYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2pmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5UcG8iICIkKERFUERJUikvamZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2pmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb21tb24uYycgb2JqZWN0PSdqZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoamZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gamZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLm8gYHRlc3QgLWYgJ2NvbW1vbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb21tb24uYworCitqZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24ub2JqOiBjb21tb24uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoamZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGpmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9qZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24uVHBvIiAtYyAtbyBqZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24ub2JqIGBpZiB0ZXN0IC1mICdjb21tb24uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb21tb24uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29tbW9uLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9qZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24uVHBvIiAiJChERVBESVIpL2pmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9qZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29tbW9uLmMnIG9iamVjdD0namZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoamZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gamZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLm9iaiBgaWYgdGVzdCAtZiAnY29tbW9uLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29tbW9uLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbW1vbi5jJzsgZmlgCisKK2pmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8ubzogY2hhcl9pby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChqZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgamZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvamZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5UcG8iIC1jIC1vIGpmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8ubyBgdGVzdCAtZiAnY2hhcl9pby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BjaGFyX2lvLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9qZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlRwbyIgIiQoREVQRElSKS9qZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2pmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY2hhcl9pby5jJyBvYmplY3Q9J2pmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoamZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gamZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vIGB0ZXN0IC1mICdjaGFyX2lvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNoYXJfaW8uYworCitqZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm9iajogY2hhcl9pby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChqZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgamZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9qZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlRwbyIgLWMgLW8gamZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vYmogYGlmIHRlc3QgLWYgJ2NoYXJfaW8uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjaGFyX2lvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NoYXJfaW8uYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2pmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8uVHBvIiAiJChERVBESVIpL2pmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvamZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjaGFyX2lvLmMnIG9iamVjdD0namZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGpmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGpmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8ub2JqIGBpZiB0ZXN0IC1mICdjaGFyX2lvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY2hhcl9pby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jaGFyX2lvLmMnOyBmaWAKKworamZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5vOiBkaXNrX2lvLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGpmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBqZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9qZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlRwbyIgLWMgLW8gamZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5vIGB0ZXN0IC1mICdkaXNrX2lvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRpc2tfaW8uYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2pmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8uVHBvIiAiJChERVBESVIpL2pmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvamZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkaXNrX2lvLmMnIG9iamVjdD0namZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChqZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBqZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm8gYHRlc3QgLWYgJ2Rpc2tfaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGlza19pby5jCisKK2pmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8ub2JqOiBkaXNrX2lvLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGpmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBqZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2pmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8uVHBvIiAtYyAtbyBqZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm9iaiBgaWYgdGVzdCAtZiAnZGlza19pby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Rpc2tfaW8uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZGlza19pby5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvamZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5UcG8iICIkKERFUERJUikvamZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9qZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Rpc2tfaW8uYycgb2JqZWN0PSdqZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoamZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gamZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5vYmogYGlmIHRlc3QgLWYgJ2Rpc2tfaW8uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkaXNrX2lvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Rpc2tfaW8uYyc7IGZpYAorCitqZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vOiBzdGFnZTFfNS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChqZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgamZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL2pmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81LlRwbyIgLWMgLW8gamZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUubyBgdGVzdCAtZiAnc3RhZ2UxXzUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3RhZ2UxXzUuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2pmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81LlRwbyIgIiQoREVQRElSKS9qZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9qZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzdGFnZTFfNS5jJyBvYmplY3Q9J2pmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGpmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGpmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm8gYHRlc3QgLWYgJ3N0YWdlMV81LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHN0YWdlMV81LmMKKworamZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUub2JqOiBzdGFnZTFfNS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChqZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgamZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvamZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuVHBvIiAtYyAtbyBqZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vYmogYGlmIHRlc3QgLWYgJ3N0YWdlMV81LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3RhZ2UxXzUuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3RhZ2UxXzUuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2pmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81LlRwbyIgIiQoREVQRElSKS9qZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9qZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzdGFnZTFfNS5jJyBvYmplY3Q9J2pmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoamZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gamZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUub2JqIGBpZiB0ZXN0IC1mICdzdGFnZTFfNS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3N0YWdlMV81LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N0YWdlMV81LmMnOyBmaWAKKworamZzX3N0YWdlMV81X2V4ZWMtZnN5c19qZnMubzogZnN5c19qZnMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoamZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGpmc19zdGFnZTFfNV9leGVjLWZzeXNfamZzLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9qZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX2pmcy5UcG8iIC1jIC1vIGpmc19zdGFnZTFfNV9leGVjLWZzeXNfamZzLm8gYHRlc3QgLWYgJ2ZzeXNfamZzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfamZzLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9qZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX2pmcy5UcG8iICIkKERFUERJUikvamZzX3N0YWdlMV81X2V4ZWMtZnN5c19qZnMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvamZzX3N0YWdlMV81X2V4ZWMtZnN5c19qZnMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c19qZnMuYycgb2JqZWN0PSdqZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX2pmcy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChqZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBqZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX2pmcy5vIGB0ZXN0IC1mICdmc3lzX2pmcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bmc3lzX2pmcy5jCisKK2pmc19zdGFnZTFfNV9leGVjLWZzeXNfamZzLm9iajogZnN5c19qZnMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoamZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGpmc19zdGFnZTFfNV9leGVjLWZzeXNfamZzLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL2pmc19zdGFnZTFfNV9leGVjLWZzeXNfamZzLlRwbyIgLWMgLW8gamZzX3N0YWdlMV81X2V4ZWMtZnN5c19qZnMub2JqIGBpZiB0ZXN0IC1mICdmc3lzX2pmcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfamZzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfamZzLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9qZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX2pmcy5UcG8iICIkKERFUERJUikvamZzX3N0YWdlMV81X2V4ZWMtZnN5c19qZnMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvamZzX3N0YWdlMV81X2V4ZWMtZnN5c19qZnMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c19qZnMuYycgb2JqZWN0PSdqZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX2pmcy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGpmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGpmc19zdGFnZTFfNV9leGVjLWZzeXNfamZzLm9iaiBgaWYgdGVzdCAtZiAnZnN5c19qZnMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX2pmcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX2pmcy5jJzsgZmlgCisKK2pmc19zdGFnZTFfNV9leGVjLWJpb3MubzogYmlvcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChqZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgamZzX3N0YWdlMV81X2V4ZWMtYmlvcy5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvamZzX3N0YWdlMV81X2V4ZWMtYmlvcy5UcG8iIC1jIC1vIGpmc19zdGFnZTFfNV9leGVjLWJpb3MubyBgdGVzdCAtZiAnYmlvcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BiaW9zLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9qZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLlRwbyIgIiQoREVQRElSKS9qZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL2pmc19zdGFnZTFfNV9leGVjLWJpb3MuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nYmlvcy5jJyBvYmplY3Q9J2pmc19zdGFnZTFfNV9leGVjLWJpb3MubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoamZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gamZzX3N0YWdlMV81X2V4ZWMtYmlvcy5vIGB0ZXN0IC1mICdiaW9zLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGJpb3MuYworCitqZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLm9iajogYmlvcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChqZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgamZzX3N0YWdlMV81X2V4ZWMtYmlvcy5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9qZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLlRwbyIgLWMgLW8gamZzX3N0YWdlMV81X2V4ZWMtYmlvcy5vYmogYGlmIHRlc3QgLWYgJ2Jpb3MuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdiaW9zLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Jpb3MuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL2pmc19zdGFnZTFfNV9leGVjLWJpb3MuVHBvIiAiJChERVBESVIpL2pmc19zdGFnZTFfNV9leGVjLWJpb3MuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvamZzX3N0YWdlMV81X2V4ZWMtYmlvcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdiaW9zLmMnIG9iamVjdD0namZzX3N0YWdlMV81X2V4ZWMtYmlvcy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGpmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGpmc19zdGFnZTFfNV9leGVjLWJpb3Mub2JqIGBpZiB0ZXN0IC1mICdiaW9zLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYmlvcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9iaW9zLmMnOyBmaWAKKworbWluaXhfc3RhZ2UxXzVfZXhlYy1jb21tb24ubzogY29tbW9uLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1pbml4X3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIG1pbml4X3N0YWdlMV81X2V4ZWMtY29tbW9uLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9taW5peF9zdGFnZTFfNV9leGVjLWNvbW1vbi5UcG8iIC1jIC1vIG1pbml4X3N0YWdlMV81X2V4ZWMtY29tbW9uLm8gYHRlc3QgLWYgJ2NvbW1vbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb21tb24uYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL21pbml4X3N0YWdlMV81X2V4ZWMtY29tbW9uLlRwbyIgIiQoREVQRElSKS9taW5peF9zdGFnZTFfNV9leGVjLWNvbW1vbi5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9taW5peF9zdGFnZTFfNV9leGVjLWNvbW1vbi5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb21tb24uYycgb2JqZWN0PSdtaW5peF9zdGFnZTFfNV9leGVjLWNvbW1vbi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChtaW5peF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIG1pbml4X3N0YWdlMV81X2V4ZWMtY29tbW9uLm8gYHRlc3QgLWYgJ2NvbW1vbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb21tb24uYworCittaW5peF9zdGFnZTFfNV9leGVjLWNvbW1vbi5vYmo6IGNvbW1vbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChtaW5peF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBtaW5peF9zdGFnZTFfNV9leGVjLWNvbW1vbi5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9taW5peF9zdGFnZTFfNV9leGVjLWNvbW1vbi5UcG8iIC1jIC1vIG1pbml4X3N0YWdlMV81X2V4ZWMtY29tbW9uLm9iaiBgaWYgdGVzdCAtZiAnY29tbW9uLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29tbW9uLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbW1vbi5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbWluaXhfc3RhZ2UxXzVfZXhlYy1jb21tb24uVHBvIiAiJChERVBESVIpL21pbml4X3N0YWdlMV81X2V4ZWMtY29tbW9uLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL21pbml4X3N0YWdlMV81X2V4ZWMtY29tbW9uLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbW1vbi5jJyBvYmplY3Q9J21pbml4X3N0YWdlMV81X2V4ZWMtY29tbW9uLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWluaXhfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBtaW5peF9zdGFnZTFfNV9leGVjLWNvbW1vbi5vYmogYGlmIHRlc3QgLWYgJ2NvbW1vbi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbW1vbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb21tb24uYyc7IGZpYAorCittaW5peF9zdGFnZTFfNV9leGVjLWNoYXJfaW8ubzogY2hhcl9pby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChtaW5peF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBtaW5peF9zdGFnZTFfNV9leGVjLWNoYXJfaW8ubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL21pbml4X3N0YWdlMV81X2V4ZWMtY2hhcl9pby5UcG8iIC1jIC1vIG1pbml4X3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vIGB0ZXN0IC1mICdjaGFyX2lvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNoYXJfaW8uYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL21pbml4X3N0YWdlMV81X2V4ZWMtY2hhcl9pby5UcG8iICIkKERFUERJUikvbWluaXhfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL21pbml4X3N0YWdlMV81X2V4ZWMtY2hhcl9pby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjaGFyX2lvLmMnIG9iamVjdD0nbWluaXhfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1pbml4X3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbWluaXhfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm8gYHRlc3QgLWYgJ2NoYXJfaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY2hhcl9pby5jCisKK21pbml4X3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vYmo6IGNoYXJfaW8uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWluaXhfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbWluaXhfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL21pbml4X3N0YWdlMV81X2V4ZWMtY2hhcl9pby5UcG8iIC1jIC1vIG1pbml4X3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vYmogYGlmIHRlc3QgLWYgJ2NoYXJfaW8uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjaGFyX2lvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NoYXJfaW8uYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL21pbml4X3N0YWdlMV81X2V4ZWMtY2hhcl9pby5UcG8iICIkKERFUERJUikvbWluaXhfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL21pbml4X3N0YWdlMV81X2V4ZWMtY2hhcl9pby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjaGFyX2lvLmMnIG9iamVjdD0nbWluaXhfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWluaXhfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBtaW5peF9zdGFnZTFfNV9leGVjLWNoYXJfaW8ub2JqIGBpZiB0ZXN0IC1mICdjaGFyX2lvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY2hhcl9pby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jaGFyX2lvLmMnOyBmaWAKKworbWluaXhfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm86IGRpc2tfaW8uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWluaXhfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbWluaXhfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9taW5peF9zdGFnZTFfNV9leGVjLWRpc2tfaW8uVHBvIiAtYyAtbyBtaW5peF9zdGFnZTFfNV9leGVjLWRpc2tfaW8ubyBgdGVzdCAtZiAnZGlza19pby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkaXNrX2lvLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9taW5peF9zdGFnZTFfNV9leGVjLWRpc2tfaW8uVHBvIiAiJChERVBESVIpL21pbml4X3N0YWdlMV81X2V4ZWMtZGlza19pby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9taW5peF9zdGFnZTFfNV9leGVjLWRpc2tfaW8uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGlza19pby5jJyBvYmplY3Q9J21pbml4X3N0YWdlMV81X2V4ZWMtZGlza19pby5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChtaW5peF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIG1pbml4X3N0YWdlMV81X2V4ZWMtZGlza19pby5vIGB0ZXN0IC1mICdkaXNrX2lvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRpc2tfaW8uYworCittaW5peF9zdGFnZTFfNV9leGVjLWRpc2tfaW8ub2JqOiBkaXNrX2lvLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1pbml4X3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIG1pbml4X3N0YWdlMV81X2V4ZWMtZGlza19pby5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9taW5peF9zdGFnZTFfNV9leGVjLWRpc2tfaW8uVHBvIiAtYyAtbyBtaW5peF9zdGFnZTFfNV9leGVjLWRpc2tfaW8ub2JqIGBpZiB0ZXN0IC1mICdkaXNrX2lvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGlza19pby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kaXNrX2lvLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9taW5peF9zdGFnZTFfNV9leGVjLWRpc2tfaW8uVHBvIiAiJChERVBESVIpL21pbml4X3N0YWdlMV81X2V4ZWMtZGlza19pby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9taW5peF9zdGFnZTFfNV9leGVjLWRpc2tfaW8uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGlza19pby5jJyBvYmplY3Q9J21pbml4X3N0YWdlMV81X2V4ZWMtZGlza19pby5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1pbml4X3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbWluaXhfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm9iaiBgaWYgdGVzdCAtZiAnZGlza19pby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Rpc2tfaW8uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZGlza19pby5jJzsgZmlgCisKK21pbml4X3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUubzogc3RhZ2UxXzUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWluaXhfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbWluaXhfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbWluaXhfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5UcG8iIC1jIC1vIG1pbml4X3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUubyBgdGVzdCAtZiAnc3RhZ2UxXzUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3RhZ2UxXzUuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL21pbml4X3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuVHBvIiAiJChERVBESVIpL21pbml4X3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbWluaXhfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzdGFnZTFfNS5jJyBvYmplY3Q9J21pbml4X3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWluaXhfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBtaW5peF9zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm8gYHRlc3QgLWYgJ3N0YWdlMV81LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHN0YWdlMV81LmMKKworbWluaXhfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vYmo6IHN0YWdlMV81LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1pbml4X3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIG1pbml4X3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbWluaXhfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5UcG8iIC1jIC1vIG1pbml4X3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUub2JqIGBpZiB0ZXN0IC1mICdzdGFnZTFfNS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3N0YWdlMV81LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N0YWdlMV81LmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9taW5peF9zdGFnZTFfNV9leGVjLXN0YWdlMV81LlRwbyIgIiQoREVQRElSKS9taW5peF9zdGFnZTFfNV9leGVjLXN0YWdlMV81LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL21pbml4X3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3RhZ2UxXzUuYycgb2JqZWN0PSdtaW5peF9zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWluaXhfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBtaW5peF9zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm9iaiBgaWYgdGVzdCAtZiAnc3RhZ2UxXzUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzdGFnZTFfNS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zdGFnZTFfNS5jJzsgZmlgCisKK21pbml4X3N0YWdlMV81X2V4ZWMtZnN5c19taW5peC5vOiBmc3lzX21pbml4LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1pbml4X3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIG1pbml4X3N0YWdlMV81X2V4ZWMtZnN5c19taW5peC5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvbWluaXhfc3RhZ2UxXzVfZXhlYy1mc3lzX21pbml4LlRwbyIgLWMgLW8gbWluaXhfc3RhZ2UxXzVfZXhlYy1mc3lzX21pbml4Lm8gYHRlc3QgLWYgJ2ZzeXNfbWluaXguYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c19taW5peC5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbWluaXhfc3RhZ2UxXzVfZXhlYy1mc3lzX21pbml4LlRwbyIgIiQoREVQRElSKS9taW5peF9zdGFnZTFfNV9leGVjLWZzeXNfbWluaXguUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbWluaXhfc3RhZ2UxXzVfZXhlYy1mc3lzX21pbml4LlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfbWluaXguYycgb2JqZWN0PSdtaW5peF9zdGFnZTFfNV9leGVjLWZzeXNfbWluaXgubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWluaXhfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBtaW5peF9zdGFnZTFfNV9leGVjLWZzeXNfbWluaXgubyBgdGVzdCAtZiAnZnN5c19taW5peC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bmc3lzX21pbml4LmMKKworbWluaXhfc3RhZ2UxXzVfZXhlYy1mc3lzX21pbml4Lm9iajogZnN5c19taW5peC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChtaW5peF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBtaW5peF9zdGFnZTFfNV9leGVjLWZzeXNfbWluaXgub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvbWluaXhfc3RhZ2UxXzVfZXhlYy1mc3lzX21pbml4LlRwbyIgLWMgLW8gbWluaXhfc3RhZ2UxXzVfZXhlYy1mc3lzX21pbml4Lm9iaiBgaWYgdGVzdCAtZiAnZnN5c19taW5peC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfbWluaXguYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c19taW5peC5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvbWluaXhfc3RhZ2UxXzVfZXhlYy1mc3lzX21pbml4LlRwbyIgIiQoREVQRElSKS9taW5peF9zdGFnZTFfNV9leGVjLWZzeXNfbWluaXguUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvbWluaXhfc3RhZ2UxXzVfZXhlYy1mc3lzX21pbml4LlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfbWluaXguYycgb2JqZWN0PSdtaW5peF9zdGFnZTFfNV9leGVjLWZzeXNfbWluaXgub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChtaW5peF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIG1pbml4X3N0YWdlMV81X2V4ZWMtZnN5c19taW5peC5vYmogYGlmIHRlc3QgLWYgJ2ZzeXNfbWluaXguYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX21pbml4LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfbWluaXguYyc7IGZpYAorCittaW5peF9zdGFnZTFfNV9leGVjLWJpb3MubzogYmlvcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChtaW5peF9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBtaW5peF9zdGFnZTFfNV9leGVjLWJpb3MubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL21pbml4X3N0YWdlMV81X2V4ZWMtYmlvcy5UcG8iIC1jIC1vIG1pbml4X3N0YWdlMV81X2V4ZWMtYmlvcy5vIGB0ZXN0IC1mICdiaW9zLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGJpb3MuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL21pbml4X3N0YWdlMV81X2V4ZWMtYmlvcy5UcG8iICIkKERFUERJUikvbWluaXhfc3RhZ2UxXzVfZXhlYy1iaW9zLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL21pbml4X3N0YWdlMV81X2V4ZWMtYmlvcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdiaW9zLmMnIG9iamVjdD0nbWluaXhfc3RhZ2UxXzVfZXhlYy1iaW9zLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKG1pbml4X3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbWluaXhfc3RhZ2UxXzVfZXhlYy1iaW9zLm8gYHRlc3QgLWYgJ2Jpb3MuYycgfHwgZWNobyAnJChzcmNkaXIpLydgYmlvcy5jCisKK21pbml4X3N0YWdlMV81X2V4ZWMtYmlvcy5vYmo6IGJpb3MuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWluaXhfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbWluaXhfc3RhZ2UxXzVfZXhlYy1iaW9zLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL21pbml4X3N0YWdlMV81X2V4ZWMtYmlvcy5UcG8iIC1jIC1vIG1pbml4X3N0YWdlMV81X2V4ZWMtYmlvcy5vYmogYGlmIHRlc3QgLWYgJ2Jpb3MuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdiaW9zLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Jpb3MuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL21pbml4X3N0YWdlMV81X2V4ZWMtYmlvcy5UcG8iICIkKERFUERJUikvbWluaXhfc3RhZ2UxXzVfZXhlYy1iaW9zLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL21pbml4X3N0YWdlMV81X2V4ZWMtYmlvcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdiaW9zLmMnIG9iamVjdD0nbWluaXhfc3RhZ2UxXzVfZXhlYy1iaW9zLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQobWluaXhfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBtaW5peF9zdGFnZTFfNV9leGVjLWJpb3Mub2JqIGBpZiB0ZXN0IC1mICdiaW9zLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYmlvcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9iaW9zLmMnOyBmaWAKKworcHJlX3N0YWdlMl9leGVjLWJpb3MubzogYmlvcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHByZV9zdGFnZTJfZXhlYy1iaW9zLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtYmlvcy5UcG8iIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1iaW9zLm8gYHRlc3QgLWYgJ2Jpb3MuYycgfHwgZWNobyAnJChzcmNkaXIpLydgYmlvcy5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWJpb3MuVHBvIiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1iaW9zLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1iaW9zLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Jpb3MuYycgb2JqZWN0PSdwcmVfc3RhZ2UyX2V4ZWMtYmlvcy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWJpb3MubyBgdGVzdCAtZiAnYmlvcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BiaW9zLmMKKworcHJlX3N0YWdlMl9leGVjLWJpb3Mub2JqOiBiaW9zLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcHJlX3N0YWdlMl9leGVjLWJpb3Mub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWJpb3MuVHBvIiAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtYmlvcy5vYmogYGlmIHRlc3QgLWYgJ2Jpb3MuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdiaW9zLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Jpb3MuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1iaW9zLlRwbyIgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtYmlvcy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtYmlvcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdiaW9zLmMnIG9iamVjdD0ncHJlX3N0YWdlMl9leGVjLWJpb3Mub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWJpb3Mub2JqIGBpZiB0ZXN0IC1mICdiaW9zLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYmlvcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9iaW9zLmMnOyBmaWAKKworcHJlX3N0YWdlMl9leGVjLWJvb3QubzogYm9vdC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHByZV9zdGFnZTJfZXhlYy1ib290Lm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtYm9vdC5UcG8iIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1ib290Lm8gYHRlc3QgLWYgJ2Jvb3QuYycgfHwgZWNobyAnJChzcmNkaXIpLydgYm9vdC5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWJvb3QuVHBvIiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1ib290LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1ib290LlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Jvb3QuYycgb2JqZWN0PSdwcmVfc3RhZ2UyX2V4ZWMtYm9vdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWJvb3QubyBgdGVzdCAtZiAnYm9vdC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bib290LmMKKworcHJlX3N0YWdlMl9leGVjLWJvb3Qub2JqOiBib290LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcHJlX3N0YWdlMl9leGVjLWJvb3Qub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWJvb3QuVHBvIiAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtYm9vdC5vYmogYGlmIHRlc3QgLWYgJ2Jvb3QuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdib290LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Jvb3QuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1ib290LlRwbyIgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtYm9vdC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtYm9vdC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdib290LmMnIG9iamVjdD0ncHJlX3N0YWdlMl9leGVjLWJvb3Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWJvb3Qub2JqIGBpZiB0ZXN0IC1mICdib290LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYm9vdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9ib290LmMnOyBmaWAKKworcHJlX3N0YWdlMl9leGVjLWJ1aWx0aW5zLm86IGJ1aWx0aW5zLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcHJlX3N0YWdlMl9leGVjLWJ1aWx0aW5zLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtYnVpbHRpbnMuVHBvIiAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtYnVpbHRpbnMubyBgdGVzdCAtZiAnYnVpbHRpbnMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgYnVpbHRpbnMuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1idWlsdGlucy5UcG8iICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWJ1aWx0aW5zLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1idWlsdGlucy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdidWlsdGlucy5jJyBvYmplY3Q9J3ByZV9zdGFnZTJfZXhlYy1idWlsdGlucy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWJ1aWx0aW5zLm8gYHRlc3QgLWYgJ2J1aWx0aW5zLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGJ1aWx0aW5zLmMKKworcHJlX3N0YWdlMl9leGVjLWJ1aWx0aW5zLm9iajogYnVpbHRpbnMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBwcmVfc3RhZ2UyX2V4ZWMtYnVpbHRpbnMub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWJ1aWx0aW5zLlRwbyIgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWJ1aWx0aW5zLm9iaiBgaWYgdGVzdCAtZiAnYnVpbHRpbnMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdidWlsdGlucy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9idWlsdGlucy5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWJ1aWx0aW5zLlRwbyIgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtYnVpbHRpbnMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWJ1aWx0aW5zLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2J1aWx0aW5zLmMnIG9iamVjdD0ncHJlX3N0YWdlMl9leGVjLWJ1aWx0aW5zLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1idWlsdGlucy5vYmogYGlmIHRlc3QgLWYgJ2J1aWx0aW5zLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYnVpbHRpbnMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvYnVpbHRpbnMuYyc7IGZpYAorCitwcmVfc3RhZ2UyX2V4ZWMtY2hhcl9pby5vOiBjaGFyX2lvLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcHJlX3N0YWdlMl9leGVjLWNoYXJfaW8ubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1jaGFyX2lvLlRwbyIgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWNoYXJfaW8ubyBgdGVzdCAtZiAnY2hhcl9pby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BjaGFyX2lvLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtY2hhcl9pby5UcG8iICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWNoYXJfaW8uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWNoYXJfaW8uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY2hhcl9pby5jJyBvYmplY3Q9J3ByZV9zdGFnZTJfZXhlYy1jaGFyX2lvLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtY2hhcl9pby5vIGB0ZXN0IC1mICdjaGFyX2lvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNoYXJfaW8uYworCitwcmVfc3RhZ2UyX2V4ZWMtY2hhcl9pby5vYmo6IGNoYXJfaW8uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBwcmVfc3RhZ2UyX2V4ZWMtY2hhcl9pby5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtY2hhcl9pby5UcG8iIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1jaGFyX2lvLm9iaiBgaWYgdGVzdCAtZiAnY2hhcl9pby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NoYXJfaW8uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY2hhcl9pby5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWNoYXJfaW8uVHBvIiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1jaGFyX2lvLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1jaGFyX2lvLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NoYXJfaW8uYycgb2JqZWN0PSdwcmVfc3RhZ2UyX2V4ZWMtY2hhcl9pby5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtY2hhcl9pby5vYmogYGlmIHRlc3QgLWYgJ2NoYXJfaW8uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjaGFyX2lvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NoYXJfaW8uYyc7IGZpYAorCitwcmVfc3RhZ2UyX2V4ZWMtY21kbGluZS5vOiBjbWRsaW5lLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcHJlX3N0YWdlMl9leGVjLWNtZGxpbmUubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1jbWRsaW5lLlRwbyIgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWNtZGxpbmUubyBgdGVzdCAtZiAnY21kbGluZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BjbWRsaW5lLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtY21kbGluZS5UcG8iICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWNtZGxpbmUuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWNtZGxpbmUuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY21kbGluZS5jJyBvYmplY3Q9J3ByZV9zdGFnZTJfZXhlYy1jbWRsaW5lLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtY21kbGluZS5vIGB0ZXN0IC1mICdjbWRsaW5lLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNtZGxpbmUuYworCitwcmVfc3RhZ2UyX2V4ZWMtY21kbGluZS5vYmo6IGNtZGxpbmUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBwcmVfc3RhZ2UyX2V4ZWMtY21kbGluZS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtY21kbGluZS5UcG8iIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1jbWRsaW5lLm9iaiBgaWYgdGVzdCAtZiAnY21kbGluZS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NtZGxpbmUuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY21kbGluZS5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWNtZGxpbmUuVHBvIiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1jbWRsaW5lLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1jbWRsaW5lLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NtZGxpbmUuYycgb2JqZWN0PSdwcmVfc3RhZ2UyX2V4ZWMtY21kbGluZS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtY21kbGluZS5vYmogYGlmIHRlc3QgLWYgJ2NtZGxpbmUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjbWRsaW5lLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NtZGxpbmUuYyc7IGZpYAorCitwcmVfc3RhZ2UyX2V4ZWMtY29tbW9uLm86IGNvbW1vbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHByZV9zdGFnZTJfZXhlYy1jb21tb24ubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1jb21tb24uVHBvIiAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtY29tbW9uLm8gYHRlc3QgLWYgJ2NvbW1vbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb21tb24uYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1jb21tb24uVHBvIiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1jb21tb24uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWNvbW1vbi5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb21tb24uYycgb2JqZWN0PSdwcmVfc3RhZ2UyX2V4ZWMtY29tbW9uLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtY29tbW9uLm8gYHRlc3QgLWYgJ2NvbW1vbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb21tb24uYworCitwcmVfc3RhZ2UyX2V4ZWMtY29tbW9uLm9iajogY29tbW9uLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcHJlX3N0YWdlMl9leGVjLWNvbW1vbi5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtY29tbW9uLlRwbyIgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWNvbW1vbi5vYmogYGlmIHRlc3QgLWYgJ2NvbW1vbi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbW1vbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb21tb24uYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1jb21tb24uVHBvIiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1jb21tb24uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWNvbW1vbi5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb21tb24uYycgb2JqZWN0PSdwcmVfc3RhZ2UyX2V4ZWMtY29tbW9uLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1jb21tb24ub2JqIGBpZiB0ZXN0IC1mICdjb21tb24uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb21tb24uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29tbW9uLmMnOyBmaWAKKworcHJlX3N0YWdlMl9leGVjLWNvbnNvbGUubzogY29uc29sZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHByZV9zdGFnZTJfZXhlYy1jb25zb2xlLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtY29uc29sZS5UcG8iIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1jb25zb2xlLm8gYHRlc3QgLWYgJ2NvbnNvbGUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29uc29sZS5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWNvbnNvbGUuVHBvIiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1jb25zb2xlLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1jb25zb2xlLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbnNvbGUuYycgb2JqZWN0PSdwcmVfc3RhZ2UyX2V4ZWMtY29uc29sZS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWNvbnNvbGUubyBgdGVzdCAtZiAnY29uc29sZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb25zb2xlLmMKKworcHJlX3N0YWdlMl9leGVjLWNvbnNvbGUub2JqOiBjb25zb2xlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcHJlX3N0YWdlMl9leGVjLWNvbnNvbGUub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWNvbnNvbGUuVHBvIiAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtY29uc29sZS5vYmogYGlmIHRlc3QgLWYgJ2NvbnNvbGUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb25zb2xlLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbnNvbGUuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1jb25zb2xlLlRwbyIgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtY29uc29sZS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtY29uc29sZS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb25zb2xlLmMnIG9iamVjdD0ncHJlX3N0YWdlMl9leGVjLWNvbnNvbGUub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWNvbnNvbGUub2JqIGBpZiB0ZXN0IC1mICdjb25zb2xlLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29uc29sZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb25zb2xlLmMnOyBmaWAKKworcHJlX3N0YWdlMl9leGVjLWRpc2tfaW8ubzogZGlza19pby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHByZV9zdGFnZTJfZXhlYy1kaXNrX2lvLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZGlza19pby5UcG8iIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1kaXNrX2lvLm8gYHRlc3QgLWYgJ2Rpc2tfaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGlza19pby5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWRpc2tfaW8uVHBvIiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1kaXNrX2lvLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1kaXNrX2lvLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Rpc2tfaW8uYycgb2JqZWN0PSdwcmVfc3RhZ2UyX2V4ZWMtZGlza19pby5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWRpc2tfaW8ubyBgdGVzdCAtZiAnZGlza19pby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkaXNrX2lvLmMKKworcHJlX3N0YWdlMl9leGVjLWRpc2tfaW8ub2JqOiBkaXNrX2lvLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcHJlX3N0YWdlMl9leGVjLWRpc2tfaW8ub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWRpc2tfaW8uVHBvIiAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtZGlza19pby5vYmogYGlmIHRlc3QgLWYgJ2Rpc2tfaW8uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkaXNrX2lvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Rpc2tfaW8uYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1kaXNrX2lvLlRwbyIgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZGlza19pby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZGlza19pby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkaXNrX2lvLmMnIG9iamVjdD0ncHJlX3N0YWdlMl9leGVjLWRpc2tfaW8ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWRpc2tfaW8ub2JqIGBpZiB0ZXN0IC1mICdkaXNrX2lvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGlza19pby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kaXNrX2lvLmMnOyBmaWAKKworcHJlX3N0YWdlMl9leGVjLWZzeXNfZXh0MmZzLm86IGZzeXNfZXh0MmZzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcHJlX3N0YWdlMl9leGVjLWZzeXNfZXh0MmZzLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c19leHQyZnMuVHBvIiAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtZnN5c19leHQyZnMubyBgdGVzdCAtZiAnZnN5c19leHQyZnMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c19leHQyZnMuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX2V4dDJmcy5UcG8iICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWZzeXNfZXh0MmZzLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX2V4dDJmcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmc3lzX2V4dDJmcy5jJyBvYmplY3Q9J3ByZV9zdGFnZTJfZXhlYy1mc3lzX2V4dDJmcy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWZzeXNfZXh0MmZzLm8gYHRlc3QgLWYgJ2ZzeXNfZXh0MmZzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfZXh0MmZzLmMKKworcHJlX3N0YWdlMl9leGVjLWZzeXNfZXh0MmZzLm9iajogZnN5c19leHQyZnMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBwcmVfc3RhZ2UyX2V4ZWMtZnN5c19leHQyZnMub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWZzeXNfZXh0MmZzLlRwbyIgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWZzeXNfZXh0MmZzLm9iaiBgaWYgdGVzdCAtZiAnZnN5c19leHQyZnMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX2V4dDJmcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX2V4dDJmcy5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWZzeXNfZXh0MmZzLlRwbyIgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c19leHQyZnMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWZzeXNfZXh0MmZzLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfZXh0MmZzLmMnIG9iamVjdD0ncHJlX3N0YWdlMl9leGVjLWZzeXNfZXh0MmZzLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1mc3lzX2V4dDJmcy5vYmogYGlmIHRlc3QgLWYgJ2ZzeXNfZXh0MmZzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c19leHQyZnMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c19leHQyZnMuYyc7IGZpYAorCitwcmVfc3RhZ2UyX2V4ZWMtZnN5c19mYXQubzogZnN5c19mYXQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBwcmVfc3RhZ2UyX2V4ZWMtZnN5c19mYXQubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX2ZhdC5UcG8iIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1mc3lzX2ZhdC5vIGB0ZXN0IC1mICdmc3lzX2ZhdC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bmc3lzX2ZhdC5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWZzeXNfZmF0LlRwbyIgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c19mYXQuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWZzeXNfZmF0LlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfZmF0LmMnIG9iamVjdD0ncHJlX3N0YWdlMl9leGVjLWZzeXNfZmF0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtZnN5c19mYXQubyBgdGVzdCAtZiAnZnN5c19mYXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c19mYXQuYworCitwcmVfc3RhZ2UyX2V4ZWMtZnN5c19mYXQub2JqOiBmc3lzX2ZhdC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHByZV9zdGFnZTJfZXhlYy1mc3lzX2ZhdC5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c19mYXQuVHBvIiAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtZnN5c19mYXQub2JqIGBpZiB0ZXN0IC1mICdmc3lzX2ZhdC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfZmF0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfZmF0LmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c19mYXQuVHBvIiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX2ZhdC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c19mYXQuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c19mYXQuYycgb2JqZWN0PSdwcmVfc3RhZ2UyX2V4ZWMtZnN5c19mYXQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWZzeXNfZmF0Lm9iaiBgaWYgdGVzdCAtZiAnZnN5c19mYXQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX2ZhdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX2ZhdC5jJzsgZmlgCisKK3ByZV9zdGFnZTJfZXhlYy1mc3lzX2Zmcy5vOiBmc3lzX2Zmcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHByZV9zdGFnZTJfZXhlYy1mc3lzX2Zmcy5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWZzeXNfZmZzLlRwbyIgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWZzeXNfZmZzLm8gYHRlc3QgLWYgJ2ZzeXNfZmZzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfZmZzLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c19mZnMuVHBvIiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX2Zmcy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c19mZnMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c19mZnMuYycgb2JqZWN0PSdwcmVfc3RhZ2UyX2V4ZWMtZnN5c19mZnMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1mc3lzX2Zmcy5vIGB0ZXN0IC1mICdmc3lzX2Zmcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bmc3lzX2Zmcy5jCisKK3ByZV9zdGFnZTJfZXhlYy1mc3lzX2Zmcy5vYmo6IGZzeXNfZmZzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcHJlX3N0YWdlMl9leGVjLWZzeXNfZmZzLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX2Zmcy5UcG8iIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1mc3lzX2Zmcy5vYmogYGlmIHRlc3QgLWYgJ2ZzeXNfZmZzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c19mZnMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c19mZnMuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX2Zmcy5UcG8iICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWZzeXNfZmZzLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX2Zmcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmc3lzX2Zmcy5jJyBvYmplY3Q9J3ByZV9zdGFnZTJfZXhlYy1mc3lzX2Zmcy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtZnN5c19mZnMub2JqIGBpZiB0ZXN0IC1mICdmc3lzX2Zmcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfZmZzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfZmZzLmMnOyBmaWAKKworcHJlX3N0YWdlMl9leGVjLWZzeXNfaXNvOTY2MC5vOiBmc3lzX2lzbzk2NjAuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBwcmVfc3RhZ2UyX2V4ZWMtZnN5c19pc285NjYwLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c19pc285NjYwLlRwbyIgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWZzeXNfaXNvOTY2MC5vIGB0ZXN0IC1mICdmc3lzX2lzbzk2NjAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c19pc285NjYwLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c19pc285NjYwLlRwbyIgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c19pc285NjYwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX2lzbzk2NjAuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c19pc285NjYwLmMnIG9iamVjdD0ncHJlX3N0YWdlMl9leGVjLWZzeXNfaXNvOTY2MC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWZzeXNfaXNvOTY2MC5vIGB0ZXN0IC1mICdmc3lzX2lzbzk2NjAuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c19pc285NjYwLmMKKworcHJlX3N0YWdlMl9leGVjLWZzeXNfaXNvOTY2MC5vYmo6IGZzeXNfaXNvOTY2MC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHByZV9zdGFnZTJfZXhlYy1mc3lzX2lzbzk2NjAub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWZzeXNfaXNvOTY2MC5UcG8iIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1mc3lzX2lzbzk2NjAub2JqIGBpZiB0ZXN0IC1mICdmc3lzX2lzbzk2NjAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX2lzbzk2NjAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c19pc285NjYwLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c19pc285NjYwLlRwbyIgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c19pc285NjYwLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX2lzbzk2NjAuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c19pc285NjYwLmMnIG9iamVjdD0ncHJlX3N0YWdlMl9leGVjLWZzeXNfaXNvOTY2MC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtZnN5c19pc285NjYwLm9iaiBgaWYgdGVzdCAtZiAnZnN5c19pc285NjYwLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c19pc285NjYwLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfaXNvOTY2MC5jJzsgZmlgCisKK3ByZV9zdGFnZTJfZXhlYy1mc3lzX2pmcy5vOiBmc3lzX2pmcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHByZV9zdGFnZTJfZXhlYy1mc3lzX2pmcy5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWZzeXNfamZzLlRwbyIgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWZzeXNfamZzLm8gYHRlc3QgLWYgJ2ZzeXNfamZzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfamZzLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c19qZnMuVHBvIiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX2pmcy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c19qZnMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c19qZnMuYycgb2JqZWN0PSdwcmVfc3RhZ2UyX2V4ZWMtZnN5c19qZnMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1mc3lzX2pmcy5vIGB0ZXN0IC1mICdmc3lzX2pmcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bmc3lzX2pmcy5jCisKK3ByZV9zdGFnZTJfZXhlYy1mc3lzX2pmcy5vYmo6IGZzeXNfamZzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcHJlX3N0YWdlMl9leGVjLWZzeXNfamZzLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX2pmcy5UcG8iIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1mc3lzX2pmcy5vYmogYGlmIHRlc3QgLWYgJ2ZzeXNfamZzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c19qZnMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c19qZnMuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX2pmcy5UcG8iICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWZzeXNfamZzLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX2pmcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmc3lzX2pmcy5jJyBvYmplY3Q9J3ByZV9zdGFnZTJfZXhlYy1mc3lzX2pmcy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtZnN5c19qZnMub2JqIGBpZiB0ZXN0IC1mICdmc3lzX2pmcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfamZzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfamZzLmMnOyBmaWAKKworcHJlX3N0YWdlMl9leGVjLWZzeXNfbWluaXgubzogZnN5c19taW5peC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHByZV9zdGFnZTJfZXhlYy1mc3lzX21pbml4Lm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c19taW5peC5UcG8iIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1mc3lzX21pbml4Lm8gYHRlc3QgLWYgJ2ZzeXNfbWluaXguYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c19taW5peC5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWZzeXNfbWluaXguVHBvIiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX21pbml4LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX21pbml4LlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfbWluaXguYycgb2JqZWN0PSdwcmVfc3RhZ2UyX2V4ZWMtZnN5c19taW5peC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWZzeXNfbWluaXgubyBgdGVzdCAtZiAnZnN5c19taW5peC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bmc3lzX21pbml4LmMKKworcHJlX3N0YWdlMl9leGVjLWZzeXNfbWluaXgub2JqOiBmc3lzX21pbml4LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcHJlX3N0YWdlMl9leGVjLWZzeXNfbWluaXgub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWZzeXNfbWluaXguVHBvIiAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtZnN5c19taW5peC5vYmogYGlmIHRlc3QgLWYgJ2ZzeXNfbWluaXguYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX21pbml4LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfbWluaXguYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX21pbml4LlRwbyIgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c19taW5peC5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c19taW5peC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmc3lzX21pbml4LmMnIG9iamVjdD0ncHJlX3N0YWdlMl9leGVjLWZzeXNfbWluaXgub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWZzeXNfbWluaXgub2JqIGBpZiB0ZXN0IC1mICdmc3lzX21pbml4LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c19taW5peC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX21pbml4LmMnOyBmaWAKKworcHJlX3N0YWdlMl9leGVjLWZzeXNfcmVpc2VyZnMubzogZnN5c19yZWlzZXJmcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHByZV9zdGFnZTJfZXhlYy1mc3lzX3JlaXNlcmZzLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c19yZWlzZXJmcy5UcG8iIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1mc3lzX3JlaXNlcmZzLm8gYHRlc3QgLWYgJ2ZzeXNfcmVpc2VyZnMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c19yZWlzZXJmcy5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWZzeXNfcmVpc2VyZnMuVHBvIiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX3JlaXNlcmZzLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX3JlaXNlcmZzLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfcmVpc2VyZnMuYycgb2JqZWN0PSdwcmVfc3RhZ2UyX2V4ZWMtZnN5c19yZWlzZXJmcy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWZzeXNfcmVpc2VyZnMubyBgdGVzdCAtZiAnZnN5c19yZWlzZXJmcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bmc3lzX3JlaXNlcmZzLmMKKworcHJlX3N0YWdlMl9leGVjLWZzeXNfcmVpc2VyZnMub2JqOiBmc3lzX3JlaXNlcmZzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcHJlX3N0YWdlMl9leGVjLWZzeXNfcmVpc2VyZnMub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWZzeXNfcmVpc2VyZnMuVHBvIiAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtZnN5c19yZWlzZXJmcy5vYmogYGlmIHRlc3QgLWYgJ2ZzeXNfcmVpc2VyZnMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX3JlaXNlcmZzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfcmVpc2VyZnMuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX3JlaXNlcmZzLlRwbyIgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c19yZWlzZXJmcy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c19yZWlzZXJmcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmc3lzX3JlaXNlcmZzLmMnIG9iamVjdD0ncHJlX3N0YWdlMl9leGVjLWZzeXNfcmVpc2VyZnMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWZzeXNfcmVpc2VyZnMub2JqIGBpZiB0ZXN0IC1mICdmc3lzX3JlaXNlcmZzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c19yZWlzZXJmcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX3JlaXNlcmZzLmMnOyBmaWAKKworcHJlX3N0YWdlMl9leGVjLWZzeXNfdWZzMi5vOiBmc3lzX3VmczIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBwcmVfc3RhZ2UyX2V4ZWMtZnN5c191ZnMyLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c191ZnMyLlRwbyIgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWZzeXNfdWZzMi5vIGB0ZXN0IC1mICdmc3lzX3VmczIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c191ZnMyLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c191ZnMyLlRwbyIgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c191ZnMyLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX3VmczIuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c191ZnMyLmMnIG9iamVjdD0ncHJlX3N0YWdlMl9leGVjLWZzeXNfdWZzMi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWZzeXNfdWZzMi5vIGB0ZXN0IC1mICdmc3lzX3VmczIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c191ZnMyLmMKKworcHJlX3N0YWdlMl9leGVjLWZzeXNfdWZzMi5vYmo6IGZzeXNfdWZzMi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHByZV9zdGFnZTJfZXhlYy1mc3lzX3VmczIub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWZzeXNfdWZzMi5UcG8iIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1mc3lzX3VmczIub2JqIGBpZiB0ZXN0IC1mICdmc3lzX3VmczIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX3VmczIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c191ZnMyLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c191ZnMyLlRwbyIgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c191ZnMyLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX3VmczIuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c191ZnMyLmMnIG9iamVjdD0ncHJlX3N0YWdlMl9leGVjLWZzeXNfdWZzMi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtZnN5c191ZnMyLm9iaiBgaWYgdGVzdCAtZiAnZnN5c191ZnMyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c191ZnMyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfdWZzMi5jJzsgZmlgCisKK3ByZV9zdGFnZTJfZXhlYy1mc3lzX3ZzdGFmcy5vOiBmc3lzX3ZzdGFmcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHByZV9zdGFnZTJfZXhlYy1mc3lzX3ZzdGFmcy5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWZzeXNfdnN0YWZzLlRwbyIgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWZzeXNfdnN0YWZzLm8gYHRlc3QgLWYgJ2ZzeXNfdnN0YWZzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfdnN0YWZzLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c192c3RhZnMuVHBvIiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX3ZzdGFmcy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c192c3RhZnMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c192c3RhZnMuYycgb2JqZWN0PSdwcmVfc3RhZ2UyX2V4ZWMtZnN5c192c3RhZnMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1mc3lzX3ZzdGFmcy5vIGB0ZXN0IC1mICdmc3lzX3ZzdGFmcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bmc3lzX3ZzdGFmcy5jCisKK3ByZV9zdGFnZTJfZXhlYy1mc3lzX3ZzdGFmcy5vYmo6IGZzeXNfdnN0YWZzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcHJlX3N0YWdlMl9leGVjLWZzeXNfdnN0YWZzLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX3ZzdGFmcy5UcG8iIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1mc3lzX3ZzdGFmcy5vYmogYGlmIHRlc3QgLWYgJ2ZzeXNfdnN0YWZzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c192c3RhZnMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c192c3RhZnMuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX3ZzdGFmcy5UcG8iICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWZzeXNfdnN0YWZzLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX3ZzdGFmcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmc3lzX3ZzdGFmcy5jJyBvYmplY3Q9J3ByZV9zdGFnZTJfZXhlYy1mc3lzX3ZzdGFmcy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtZnN5c192c3RhZnMub2JqIGBpZiB0ZXN0IC1mICdmc3lzX3ZzdGFmcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfdnN0YWZzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfdnN0YWZzLmMnOyBmaWAKKworcHJlX3N0YWdlMl9leGVjLWZzeXNfeGZzLm86IGZzeXNfeGZzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcHJlX3N0YWdlMl9leGVjLWZzeXNfeGZzLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c194ZnMuVHBvIiAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtZnN5c194ZnMubyBgdGVzdCAtZiAnZnN5c194ZnMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c194ZnMuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX3hmcy5UcG8iICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWZzeXNfeGZzLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1mc3lzX3hmcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmc3lzX3hmcy5jJyBvYmplY3Q9J3ByZV9zdGFnZTJfZXhlYy1mc3lzX3hmcy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWZzeXNfeGZzLm8gYHRlc3QgLWYgJ2ZzeXNfeGZzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfeGZzLmMKKworcHJlX3N0YWdlMl9leGVjLWZzeXNfeGZzLm9iajogZnN5c194ZnMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBwcmVfc3RhZ2UyX2V4ZWMtZnN5c194ZnMub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWZzeXNfeGZzLlRwbyIgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWZzeXNfeGZzLm9iaiBgaWYgdGVzdCAtZiAnZnN5c194ZnMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX3hmcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX3hmcy5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWZzeXNfeGZzLlRwbyIgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZnN5c194ZnMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWZzeXNfeGZzLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfeGZzLmMnIG9iamVjdD0ncHJlX3N0YWdlMl9leGVjLWZzeXNfeGZzLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1mc3lzX3hmcy5vYmogYGlmIHRlc3QgLWYgJ2ZzeXNfeGZzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c194ZnMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c194ZnMuYyc7IGZpYAorCitwcmVfc3RhZ2UyX2V4ZWMtZ3VuemlwLm86IGd1bnppcC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHByZV9zdGFnZTJfZXhlYy1ndW56aXAubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1ndW56aXAuVHBvIiAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtZ3VuemlwLm8gYHRlc3QgLWYgJ2d1bnppcC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BndW56aXAuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1ndW56aXAuVHBvIiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1ndW56aXAuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWd1bnppcC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdndW56aXAuYycgb2JqZWN0PSdwcmVfc3RhZ2UyX2V4ZWMtZ3VuemlwLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtZ3VuemlwLm8gYHRlc3QgLWYgJ2d1bnppcC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BndW56aXAuYworCitwcmVfc3RhZ2UyX2V4ZWMtZ3VuemlwLm9iajogZ3VuemlwLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcHJlX3N0YWdlMl9leGVjLWd1bnppcC5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtZ3VuemlwLlRwbyIgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWd1bnppcC5vYmogYGlmIHRlc3QgLWYgJ2d1bnppcC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2d1bnppcC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9ndW56aXAuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1ndW56aXAuVHBvIiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1ndW56aXAuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWd1bnppcC5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdndW56aXAuYycgb2JqZWN0PSdwcmVfc3RhZ2UyX2V4ZWMtZ3VuemlwLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1ndW56aXAub2JqIGBpZiB0ZXN0IC1mICdndW56aXAuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdndW56aXAuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ3VuemlwLmMnOyBmaWAKKworcHJlX3N0YWdlMl9leGVjLWhlcmN1bGVzLm86IGhlcmN1bGVzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcHJlX3N0YWdlMl9leGVjLWhlcmN1bGVzLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtaGVyY3VsZXMuVHBvIiAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtaGVyY3VsZXMubyBgdGVzdCAtZiAnaGVyY3VsZXMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgaGVyY3VsZXMuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1oZXJjdWxlcy5UcG8iICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWhlcmN1bGVzLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1oZXJjdWxlcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdoZXJjdWxlcy5jJyBvYmplY3Q9J3ByZV9zdGFnZTJfZXhlYy1oZXJjdWxlcy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWhlcmN1bGVzLm8gYHRlc3QgLWYgJ2hlcmN1bGVzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGhlcmN1bGVzLmMKKworcHJlX3N0YWdlMl9leGVjLWhlcmN1bGVzLm9iajogaGVyY3VsZXMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBwcmVfc3RhZ2UyX2V4ZWMtaGVyY3VsZXMub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWhlcmN1bGVzLlRwbyIgLWMgLW8gcHJlX3N0YWdlMl9leGVjLWhlcmN1bGVzLm9iaiBgaWYgdGVzdCAtZiAnaGVyY3VsZXMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdoZXJjdWxlcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9oZXJjdWxlcy5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWhlcmN1bGVzLlRwbyIgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtaGVyY3VsZXMuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLWhlcmN1bGVzLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2hlcmN1bGVzLmMnIG9iamVjdD0ncHJlX3N0YWdlMl9leGVjLWhlcmN1bGVzLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1oZXJjdWxlcy5vYmogYGlmIHRlc3QgLWYgJ2hlcmN1bGVzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnaGVyY3VsZXMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvaGVyY3VsZXMuYyc7IGZpYAorCitwcmVfc3RhZ2UyX2V4ZWMtbWQ1Lm86IG1kNS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHByZV9zdGFnZTJfZXhlYy1tZDUubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1tZDUuVHBvIiAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtbWQ1Lm8gYHRlc3QgLWYgJ21kNS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BtZDUuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1tZDUuVHBvIiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1tZDUuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLW1kNS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdtZDUuYycgb2JqZWN0PSdwcmVfc3RhZ2UyX2V4ZWMtbWQ1Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtbWQ1Lm8gYHRlc3QgLWYgJ21kNS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BtZDUuYworCitwcmVfc3RhZ2UyX2V4ZWMtbWQ1Lm9iajogbWQ1LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcHJlX3N0YWdlMl9leGVjLW1kNS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtbWQ1LlRwbyIgLWMgLW8gcHJlX3N0YWdlMl9leGVjLW1kNS5vYmogYGlmIHRlc3QgLWYgJ21kNS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ21kNS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9tZDUuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1tZDUuVHBvIiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1tZDUuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLW1kNS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdtZDUuYycgb2JqZWN0PSdwcmVfc3RhZ2UyX2V4ZWMtbWQ1Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1tZDUub2JqIGBpZiB0ZXN0IC1mICdtZDUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdtZDUuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvbWQ1LmMnOyBmaWAKKworcHJlX3N0YWdlMl9leGVjLXNlcmlhbC5vOiBzZXJpYWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBwcmVfc3RhZ2UyX2V4ZWMtc2VyaWFsLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtc2VyaWFsLlRwbyIgLWMgLW8gcHJlX3N0YWdlMl9leGVjLXNlcmlhbC5vIGB0ZXN0IC1mICdzZXJpYWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc2VyaWFsLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtc2VyaWFsLlRwbyIgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtc2VyaWFsLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1zZXJpYWwuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc2VyaWFsLmMnIG9iamVjdD0ncHJlX3N0YWdlMl9leGVjLXNlcmlhbC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcHJlX3N0YWdlMl9leGVjLXNlcmlhbC5vIGB0ZXN0IC1mICdzZXJpYWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc2VyaWFsLmMKKworcHJlX3N0YWdlMl9leGVjLXNlcmlhbC5vYmo6IHNlcmlhbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHByZV9zdGFnZTJfZXhlYy1zZXJpYWwub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLXNlcmlhbC5UcG8iIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1zZXJpYWwub2JqIGBpZiB0ZXN0IC1mICdzZXJpYWwuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzZXJpYWwuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc2VyaWFsLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtc2VyaWFsLlRwbyIgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtc2VyaWFsLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1zZXJpYWwuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc2VyaWFsLmMnIG9iamVjdD0ncHJlX3N0YWdlMl9leGVjLXNlcmlhbC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtc2VyaWFsLm9iaiBgaWYgdGVzdCAtZiAnc2VyaWFsLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc2VyaWFsLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NlcmlhbC5jJzsgZmlgCisKK3ByZV9zdGFnZTJfZXhlYy1zbXAtaW1wcy5vOiBzbXAtaW1wcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHByZV9zdGFnZTJfZXhlYy1zbXAtaW1wcy5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLXNtcC1pbXBzLlRwbyIgLWMgLW8gcHJlX3N0YWdlMl9leGVjLXNtcC1pbXBzLm8gYHRlc3QgLWYgJ3NtcC1pbXBzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHNtcC1pbXBzLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtc21wLWltcHMuVHBvIiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1zbXAtaW1wcy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtc21wLWltcHMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc21wLWltcHMuYycgb2JqZWN0PSdwcmVfc3RhZ2UyX2V4ZWMtc21wLWltcHMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1zbXAtaW1wcy5vIGB0ZXN0IC1mICdzbXAtaW1wcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzbXAtaW1wcy5jCisKK3ByZV9zdGFnZTJfZXhlYy1zbXAtaW1wcy5vYmo6IHNtcC1pbXBzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcHJlX3N0YWdlMl9leGVjLXNtcC1pbXBzLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1zbXAtaW1wcy5UcG8iIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1zbXAtaW1wcy5vYmogYGlmIHRlc3QgLWYgJ3NtcC1pbXBzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc21wLWltcHMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc21wLWltcHMuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1zbXAtaW1wcy5UcG8iICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLXNtcC1pbXBzLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1zbXAtaW1wcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzbXAtaW1wcy5jJyBvYmplY3Q9J3ByZV9zdGFnZTJfZXhlYy1zbXAtaW1wcy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtc21wLWltcHMub2JqIGBpZiB0ZXN0IC1mICdzbXAtaW1wcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3NtcC1pbXBzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3NtcC1pbXBzLmMnOyBmaWAKKworcHJlX3N0YWdlMl9leGVjLXN0YWdlMi5vOiBzdGFnZTIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBwcmVfc3RhZ2UyX2V4ZWMtc3RhZ2UyLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtc3RhZ2UyLlRwbyIgLWMgLW8gcHJlX3N0YWdlMl9leGVjLXN0YWdlMi5vIGB0ZXN0IC1mICdzdGFnZTIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3RhZ2UyLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtc3RhZ2UyLlRwbyIgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtc3RhZ2UyLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1zdGFnZTIuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3RhZ2UyLmMnIG9iamVjdD0ncHJlX3N0YWdlMl9leGVjLXN0YWdlMi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcHJlX3N0YWdlMl9leGVjLXN0YWdlMi5vIGB0ZXN0IC1mICdzdGFnZTIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3RhZ2UyLmMKKworcHJlX3N0YWdlMl9leGVjLXN0YWdlMi5vYmo6IHN0YWdlMi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHByZV9zdGFnZTJfZXhlYy1zdGFnZTIub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLXN0YWdlMi5UcG8iIC1jIC1vIHByZV9zdGFnZTJfZXhlYy1zdGFnZTIub2JqIGBpZiB0ZXN0IC1mICdzdGFnZTIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzdGFnZTIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3RhZ2UyLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtc3RhZ2UyLlRwbyIgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtc3RhZ2UyLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy1zdGFnZTIuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3RhZ2UyLmMnIG9iamVjdD0ncHJlX3N0YWdlMl9leGVjLXN0YWdlMi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtc3RhZ2UyLm9iaiBgaWYgdGVzdCAtZiAnc3RhZ2UyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3RhZ2UyLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N0YWdlMi5jJzsgZmlgCisKK3ByZV9zdGFnZTJfZXhlYy10ZXJtaW5mby5vOiB0ZXJtaW5mby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHByZV9zdGFnZTJfZXhlYy10ZXJtaW5mby5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLXRlcm1pbmZvLlRwbyIgLWMgLW8gcHJlX3N0YWdlMl9leGVjLXRlcm1pbmZvLm8gYHRlc3QgLWYgJ3Rlcm1pbmZvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHRlcm1pbmZvLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtdGVybWluZm8uVHBvIiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy10ZXJtaW5mby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtdGVybWluZm8uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndGVybWluZm8uYycgb2JqZWN0PSdwcmVfc3RhZ2UyX2V4ZWMtdGVybWluZm8ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHByZV9zdGFnZTJfZXhlYy10ZXJtaW5mby5vIGB0ZXN0IC1mICd0ZXJtaW5mby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B0ZXJtaW5mby5jCisKK3ByZV9zdGFnZTJfZXhlYy10ZXJtaW5mby5vYmo6IHRlcm1pbmZvLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcHJlX3N0YWdlMl9leGVjLXRlcm1pbmZvLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy10ZXJtaW5mby5UcG8iIC1jIC1vIHByZV9zdGFnZTJfZXhlYy10ZXJtaW5mby5vYmogYGlmIHRlc3QgLWYgJ3Rlcm1pbmZvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndGVybWluZm8uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdGVybWluZm8uYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy10ZXJtaW5mby5UcG8iICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLXRlcm1pbmZvLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy10ZXJtaW5mby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0ZXJtaW5mby5jJyBvYmplY3Q9J3ByZV9zdGFnZTJfZXhlYy10ZXJtaW5mby5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtdGVybWluZm8ub2JqIGBpZiB0ZXN0IC1mICd0ZXJtaW5mby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3Rlcm1pbmZvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3Rlcm1pbmZvLmMnOyBmaWAKKworcHJlX3N0YWdlMl9leGVjLXRwYXJtLm86IHRwYXJtLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHByZV9zdGFnZTJfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcHJlX3N0YWdlMl9leGVjLXRwYXJtLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtdHBhcm0uVHBvIiAtYyAtbyBwcmVfc3RhZ2UyX2V4ZWMtdHBhcm0ubyBgdGVzdCAtZiAndHBhcm0uYycgfHwgZWNobyAnJChzcmNkaXIpLydgdHBhcm0uYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy10cGFybS5UcG8iICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLXRwYXJtLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ByZV9zdGFnZTJfZXhlYy10cGFybS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0cGFybS5jJyBvYmplY3Q9J3ByZV9zdGFnZTJfZXhlYy10cGFybS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChwcmVfc3RhZ2UyX2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcHJlX3N0YWdlMl9leGVjLXRwYXJtLm8gYHRlc3QgLWYgJ3RwYXJtLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHRwYXJtLmMKKworcHJlX3N0YWdlMl9leGVjLXRwYXJtLm9iajogdHBhcm0uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCBwcmVfc3RhZ2UyX2V4ZWMtdHBhcm0ub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLXRwYXJtLlRwbyIgLWMgLW8gcHJlX3N0YWdlMl9leGVjLXRwYXJtLm9iaiBgaWYgdGVzdCAtZiAndHBhcm0uYyc7IHRoZW4gJChDWUdQQVRIX1cpICd0cGFybS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90cGFybS5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLXRwYXJtLlRwbyIgIiQoREVQRElSKS9wcmVfc3RhZ2UyX2V4ZWMtdHBhcm0uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvcHJlX3N0YWdlMl9leGVjLXRwYXJtLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3RwYXJtLmMnIG9iamVjdD0ncHJlX3N0YWdlMl9leGVjLXRwYXJtLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocHJlX3N0YWdlMl9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHByZV9zdGFnZTJfZXhlYy10cGFybS5vYmogYGlmIHRlc3QgLWYgJ3RwYXJtLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndHBhcm0uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdHBhcm0uYyc7IGZpYAorCityZWlzZXJmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5vOiBjb21tb24uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocmVpc2VyZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24ubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLlRwbyIgLWMgLW8gcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24ubyBgdGVzdCAtZiAnY29tbW9uLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbW1vbi5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24uVHBvIiAiJChERVBESVIpL3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbW1vbi5jJyBvYmplY3Q9J3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJlaXNlcmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24ubyBgdGVzdCAtZiAnY29tbW9uLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbW1vbi5jCisKK3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLm9iajogY29tbW9uLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJlaXNlcmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHJlaXNlcmZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLlRwbyIgLWMgLW8gcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24ub2JqIGBpZiB0ZXN0IC1mICdjb21tb24uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb21tb24uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29tbW9uLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9yZWlzZXJmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5UcG8iICIkKERFUERJUikvcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29tbW9uLmMnIG9iamVjdD0ncmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChyZWlzZXJmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHJlaXNlcmZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLm9iaiBgaWYgdGVzdCAtZiAnY29tbW9uLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29tbW9uLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbW1vbi5jJzsgZmlgCisKK3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vOiBjaGFyX2lvLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJlaXNlcmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHJlaXNlcmZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlRwbyIgLWMgLW8gcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm8gYHRlc3QgLWYgJ2NoYXJfaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY2hhcl9pby5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlRwbyIgIiQoREVQRElSKS9yZWlzZXJmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NoYXJfaW8uYycgb2JqZWN0PSdyZWlzZXJmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocmVpc2VyZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyByZWlzZXJmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8ubyBgdGVzdCAtZiAnY2hhcl9pby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BjaGFyX2lvLmMKKworcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm9iajogY2hhcl9pby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChyZWlzZXJmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCByZWlzZXJmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8ub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlRwbyIgLWMgLW8gcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm9iaiBgaWYgdGVzdCAtZiAnY2hhcl9pby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NoYXJfaW8uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY2hhcl9pby5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlRwbyIgIiQoREVQRElSKS9yZWlzZXJmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NoYXJfaW8uYycgb2JqZWN0PSdyZWlzZXJmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChyZWlzZXJmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHJlaXNlcmZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vYmogYGlmIHRlc3QgLWYgJ2NoYXJfaW8uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjaGFyX2lvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NoYXJfaW8uYyc7IGZpYAorCityZWlzZXJmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8ubzogZGlza19pby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChyZWlzZXJmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCByZWlzZXJmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8ubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5UcG8iIC1jIC1vIHJlaXNlcmZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5vIGB0ZXN0IC1mICdkaXNrX2lvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRpc2tfaW8uYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5UcG8iICIkKERFUERJUikvcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkaXNrX2lvLmMnIG9iamVjdD0ncmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJlaXNlcmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm8gYHRlc3QgLWYgJ2Rpc2tfaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGlza19pby5jCisKK3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5vYmo6IGRpc2tfaW8uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocmVpc2VyZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5UcG8iIC1jIC1vIHJlaXNlcmZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5vYmogYGlmIHRlc3QgLWYgJ2Rpc2tfaW8uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkaXNrX2lvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Rpc2tfaW8uYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5UcG8iICIkKERFUERJUikvcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkaXNrX2lvLmMnIG9iamVjdD0ncmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocmVpc2VyZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyByZWlzZXJmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8ub2JqIGBpZiB0ZXN0IC1mICdkaXNrX2lvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGlza19pby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kaXNrX2lvLmMnOyBmaWAKKworcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vOiBzdGFnZTFfNS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChyZWlzZXJmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCByZWlzZXJmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9yZWlzZXJmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81LlRwbyIgLWMgLW8gcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vIGB0ZXN0IC1mICdzdGFnZTFfNS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzdGFnZTFfNS5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5UcG8iICIkKERFUERJUikvcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9yZWlzZXJmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81LlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3N0YWdlMV81LmMnIG9iamVjdD0ncmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChyZWlzZXJmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHJlaXNlcmZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUubyBgdGVzdCAtZiAnc3RhZ2UxXzUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3RhZ2UxXzUuYworCityZWlzZXJmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm9iajogc3RhZ2UxXzUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocmVpc2VyZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9yZWlzZXJmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81LlRwbyIgLWMgLW8gcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vYmogYGlmIHRlc3QgLWYgJ3N0YWdlMV81LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3RhZ2UxXzUuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3RhZ2UxXzUuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuVHBvIiAiJChERVBESVIpL3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzdGFnZTFfNS5jJyBvYmplY3Q9J3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChyZWlzZXJmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHJlaXNlcmZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUub2JqIGBpZiB0ZXN0IC1mICdzdGFnZTFfNS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3N0YWdlMV81LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N0YWdlMV81LmMnOyBmaWAKKworcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX3JlaXNlcmZzLm86IGZzeXNfcmVpc2VyZnMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocmVpc2VyZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX3JlaXNlcmZzLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS9yZWlzZXJmc19zdGFnZTFfNV9leGVjLWZzeXNfcmVpc2VyZnMuVHBvIiAtYyAtbyByZWlzZXJmc19zdGFnZTFfNV9leGVjLWZzeXNfcmVpc2VyZnMubyBgdGVzdCAtZiAnZnN5c19yZWlzZXJmcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bmc3lzX3JlaXNlcmZzLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9yZWlzZXJmc19zdGFnZTFfNV9leGVjLWZzeXNfcmVpc2VyZnMuVHBvIiAiJChERVBESVIpL3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtZnN5c19yZWlzZXJmcy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9yZWlzZXJmc19zdGFnZTFfNV9leGVjLWZzeXNfcmVpc2VyZnMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c19yZWlzZXJmcy5jJyBvYmplY3Q9J3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtZnN5c19yZWlzZXJmcy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChyZWlzZXJmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHJlaXNlcmZzX3N0YWdlMV81X2V4ZWMtZnN5c19yZWlzZXJmcy5vIGB0ZXN0IC1mICdmc3lzX3JlaXNlcmZzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfcmVpc2VyZnMuYworCityZWlzZXJmc19zdGFnZTFfNV9leGVjLWZzeXNfcmVpc2VyZnMub2JqOiBmc3lzX3JlaXNlcmZzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJlaXNlcmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHJlaXNlcmZzX3N0YWdlMV81X2V4ZWMtZnN5c19yZWlzZXJmcy5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS9yZWlzZXJmc19zdGFnZTFfNV9leGVjLWZzeXNfcmVpc2VyZnMuVHBvIiAtYyAtbyByZWlzZXJmc19zdGFnZTFfNV9leGVjLWZzeXNfcmVpc2VyZnMub2JqIGBpZiB0ZXN0IC1mICdmc3lzX3JlaXNlcmZzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c19yZWlzZXJmcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX3JlaXNlcmZzLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS9yZWlzZXJmc19zdGFnZTFfNV9leGVjLWZzeXNfcmVpc2VyZnMuVHBvIiAiJChERVBESVIpL3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtZnN5c19yZWlzZXJmcy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS9yZWlzZXJmc19zdGFnZTFfNV9leGVjLWZzeXNfcmVpc2VyZnMuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnN5c19yZWlzZXJmcy5jJyBvYmplY3Q9J3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtZnN5c19yZWlzZXJmcy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJlaXNlcmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX3JlaXNlcmZzLm9iaiBgaWYgdGVzdCAtZiAnZnN5c19yZWlzZXJmcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfcmVpc2VyZnMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c19yZWlzZXJmcy5jJzsgZmlgCisKK3JlaXNlcmZzX3N0YWdlMV81X2V4ZWMtYmlvcy5vOiBiaW9zLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJlaXNlcmZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHJlaXNlcmZzX3N0YWdlMV81X2V4ZWMtYmlvcy5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLlRwbyIgLWMgLW8gcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLm8gYHRlc3QgLWYgJ2Jpb3MuYycgfHwgZWNobyAnJChzcmNkaXIpLydgYmlvcy5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLlRwbyIgIiQoREVQRElSKS9yZWlzZXJmc19zdGFnZTFfNV9leGVjLWJpb3MuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Jpb3MuYycgb2JqZWN0PSdyZWlzZXJmc19zdGFnZTFfNV9leGVjLWJpb3MubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocmVpc2VyZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyByZWlzZXJmc19zdGFnZTFfNV9leGVjLWJpb3MubyBgdGVzdCAtZiAnYmlvcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BiaW9zLmMKKworcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLm9iajogYmlvcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChyZWlzZXJmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCByZWlzZXJmc19zdGFnZTFfNV9leGVjLWJpb3Mub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLlRwbyIgLWMgLW8gcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLm9iaiBgaWYgdGVzdCAtZiAnYmlvcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Jpb3MuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvYmlvcy5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLlRwbyIgIiQoREVQRElSKS9yZWlzZXJmc19zdGFnZTFfNV9leGVjLWJpb3MuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvcmVpc2VyZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Jpb3MuYycgb2JqZWN0PSdyZWlzZXJmc19zdGFnZTFfNV9leGVjLWJpb3Mub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChyZWlzZXJmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHJlaXNlcmZzX3N0YWdlMV81X2V4ZWMtYmlvcy5vYmogYGlmIHRlc3QgLWYgJ2Jpb3MuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdiaW9zLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Jpb3MuYyc7IGZpYAorCit1ZnMyX3N0YWdlMV81X2V4ZWMtY29tbW9uLm86IGNvbW1vbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh1ZnMyX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHVmczJfc3RhZ2UxXzVfZXhlYy1jb21tb24ubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL3VmczJfc3RhZ2UxXzVfZXhlYy1jb21tb24uVHBvIiAtYyAtbyB1ZnMyX3N0YWdlMV81X2V4ZWMtY29tbW9uLm8gYHRlc3QgLWYgJ2NvbW1vbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb21tb24uYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3VmczJfc3RhZ2UxXzVfZXhlYy1jb21tb24uVHBvIiAiJChERVBESVIpL3VmczJfc3RhZ2UxXzVfZXhlYy1jb21tb24uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvdWZzMl9zdGFnZTFfNV9leGVjLWNvbW1vbi5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb21tb24uYycgb2JqZWN0PSd1ZnMyX3N0YWdlMV81X2V4ZWMtY29tbW9uLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHVmczJfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB1ZnMyX3N0YWdlMV81X2V4ZWMtY29tbW9uLm8gYHRlc3QgLWYgJ2NvbW1vbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb21tb24uYworCit1ZnMyX3N0YWdlMV81X2V4ZWMtY29tbW9uLm9iajogY29tbW9uLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHVmczJfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgdWZzMl9zdGFnZTFfNV9leGVjLWNvbW1vbi5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS91ZnMyX3N0YWdlMV81X2V4ZWMtY29tbW9uLlRwbyIgLWMgLW8gdWZzMl9zdGFnZTFfNV9leGVjLWNvbW1vbi5vYmogYGlmIHRlc3QgLWYgJ2NvbW1vbi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbW1vbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb21tb24uYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3VmczJfc3RhZ2UxXzVfZXhlYy1jb21tb24uVHBvIiAiJChERVBESVIpL3VmczJfc3RhZ2UxXzVfZXhlYy1jb21tb24uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvdWZzMl9zdGFnZTFfNV9leGVjLWNvbW1vbi5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb21tb24uYycgb2JqZWN0PSd1ZnMyX3N0YWdlMV81X2V4ZWMtY29tbW9uLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodWZzMl9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHVmczJfc3RhZ2UxXzVfZXhlYy1jb21tb24ub2JqIGBpZiB0ZXN0IC1mICdjb21tb24uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb21tb24uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29tbW9uLmMnOyBmaWAKKwordWZzMl9zdGFnZTFfNV9leGVjLWNoYXJfaW8ubzogY2hhcl9pby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh1ZnMyX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHVmczJfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS91ZnMyX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5UcG8iIC1jIC1vIHVmczJfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm8gYHRlc3QgLWYgJ2NoYXJfaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY2hhcl9pby5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvdWZzMl9zdGFnZTFfNV9leGVjLWNoYXJfaW8uVHBvIiAiJChERVBESVIpL3VmczJfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3VmczJfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NoYXJfaW8uYycgb2JqZWN0PSd1ZnMyX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh1ZnMyX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gdWZzMl9zdGFnZTFfNV9leGVjLWNoYXJfaW8ubyBgdGVzdCAtZiAnY2hhcl9pby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BjaGFyX2lvLmMKKwordWZzMl9zdGFnZTFfNV9leGVjLWNoYXJfaW8ub2JqOiBjaGFyX2lvLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHVmczJfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgdWZzMl9zdGFnZTFfNV9leGVjLWNoYXJfaW8ub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvdWZzMl9zdGFnZTFfNV9leGVjLWNoYXJfaW8uVHBvIiAtYyAtbyB1ZnMyX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vYmogYGlmIHRlc3QgLWYgJ2NoYXJfaW8uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjaGFyX2lvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NoYXJfaW8uYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3VmczJfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlRwbyIgIiQoREVQRElSKS91ZnMyX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS91ZnMyX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjaGFyX2lvLmMnIG9iamVjdD0ndWZzMl9zdGFnZTFfNV9leGVjLWNoYXJfaW8ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh1ZnMyX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gdWZzMl9zdGFnZTFfNV9leGVjLWNoYXJfaW8ub2JqIGBpZiB0ZXN0IC1mICdjaGFyX2lvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY2hhcl9pby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jaGFyX2lvLmMnOyBmaWAKKwordWZzMl9zdGFnZTFfNV9leGVjLWRpc2tfaW8ubzogZGlza19pby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh1ZnMyX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHVmczJfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS91ZnMyX3N0YWdlMV81X2V4ZWMtZGlza19pby5UcG8iIC1jIC1vIHVmczJfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm8gYHRlc3QgLWYgJ2Rpc2tfaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGlza19pby5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvdWZzMl9zdGFnZTFfNV9leGVjLWRpc2tfaW8uVHBvIiAiJChERVBESVIpL3VmczJfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3VmczJfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Rpc2tfaW8uYycgb2JqZWN0PSd1ZnMyX3N0YWdlMV81X2V4ZWMtZGlza19pby5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh1ZnMyX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gdWZzMl9zdGFnZTFfNV9leGVjLWRpc2tfaW8ubyBgdGVzdCAtZiAnZGlza19pby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkaXNrX2lvLmMKKwordWZzMl9zdGFnZTFfNV9leGVjLWRpc2tfaW8ub2JqOiBkaXNrX2lvLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHVmczJfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgdWZzMl9zdGFnZTFfNV9leGVjLWRpc2tfaW8ub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvdWZzMl9zdGFnZTFfNV9leGVjLWRpc2tfaW8uVHBvIiAtYyAtbyB1ZnMyX3N0YWdlMV81X2V4ZWMtZGlza19pby5vYmogYGlmIHRlc3QgLWYgJ2Rpc2tfaW8uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkaXNrX2lvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Rpc2tfaW8uYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3VmczJfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlRwbyIgIiQoREVQRElSKS91ZnMyX3N0YWdlMV81X2V4ZWMtZGlza19pby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS91ZnMyX3N0YWdlMV81X2V4ZWMtZGlza19pby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkaXNrX2lvLmMnIG9iamVjdD0ndWZzMl9zdGFnZTFfNV9leGVjLWRpc2tfaW8ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh1ZnMyX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gdWZzMl9zdGFnZTFfNV9leGVjLWRpc2tfaW8ub2JqIGBpZiB0ZXN0IC1mICdkaXNrX2lvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGlza19pby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kaXNrX2lvLmMnOyBmaWAKKwordWZzMl9zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm86IHN0YWdlMV81LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHVmczJfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgdWZzMl9zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS91ZnMyX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuVHBvIiAtYyAtbyB1ZnMyX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUubyBgdGVzdCAtZiAnc3RhZ2UxXzUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3RhZ2UxXzUuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3VmczJfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5UcG8iICIkKERFUERJUikvdWZzMl9zdGFnZTFfNV9leGVjLXN0YWdlMV81LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3VmczJfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzdGFnZTFfNS5jJyBvYmplY3Q9J3VmczJfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh1ZnMyX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gdWZzMl9zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm8gYHRlc3QgLWYgJ3N0YWdlMV81LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHN0YWdlMV81LmMKKwordWZzMl9zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm9iajogc3RhZ2UxXzUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodWZzMl9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCB1ZnMyX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvdWZzMl9zdGFnZTFfNV9leGVjLXN0YWdlMV81LlRwbyIgLWMgLW8gdWZzMl9zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm9iaiBgaWYgdGVzdCAtZiAnc3RhZ2UxXzUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzdGFnZTFfNS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zdGFnZTFfNS5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvdWZzMl9zdGFnZTFfNV9leGVjLXN0YWdlMV81LlRwbyIgIiQoREVQRElSKS91ZnMyX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvdWZzMl9zdGFnZTFfNV9leGVjLXN0YWdlMV81LlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3N0YWdlMV81LmMnIG9iamVjdD0ndWZzMl9zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodWZzMl9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHVmczJfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vYmogYGlmIHRlc3QgLWYgJ3N0YWdlMV81LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3RhZ2UxXzUuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3RhZ2UxXzUuYyc7IGZpYAorCit1ZnMyX3N0YWdlMV81X2V4ZWMtZnN5c191ZnMyLm86IGZzeXNfdWZzMi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh1ZnMyX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHVmczJfc3RhZ2UxXzVfZXhlYy1mc3lzX3VmczIubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL3VmczJfc3RhZ2UxXzVfZXhlYy1mc3lzX3VmczIuVHBvIiAtYyAtbyB1ZnMyX3N0YWdlMV81X2V4ZWMtZnN5c191ZnMyLm8gYHRlc3QgLWYgJ2ZzeXNfdWZzMi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bmc3lzX3VmczIuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3VmczJfc3RhZ2UxXzVfZXhlYy1mc3lzX3VmczIuVHBvIiAiJChERVBESVIpL3VmczJfc3RhZ2UxXzVfZXhlYy1mc3lzX3VmczIuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvdWZzMl9zdGFnZTFfNV9leGVjLWZzeXNfdWZzMi5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmc3lzX3VmczIuYycgb2JqZWN0PSd1ZnMyX3N0YWdlMV81X2V4ZWMtZnN5c191ZnMyLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHVmczJfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB1ZnMyX3N0YWdlMV81X2V4ZWMtZnN5c191ZnMyLm8gYHRlc3QgLWYgJ2ZzeXNfdWZzMi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bmc3lzX3VmczIuYworCit1ZnMyX3N0YWdlMV81X2V4ZWMtZnN5c191ZnMyLm9iajogZnN5c191ZnMyLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHVmczJfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgdWZzMl9zdGFnZTFfNV9leGVjLWZzeXNfdWZzMi5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS91ZnMyX3N0YWdlMV81X2V4ZWMtZnN5c191ZnMyLlRwbyIgLWMgLW8gdWZzMl9zdGFnZTFfNV9leGVjLWZzeXNfdWZzMi5vYmogYGlmIHRlc3QgLWYgJ2ZzeXNfdWZzMi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfdWZzMi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX3VmczIuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3VmczJfc3RhZ2UxXzVfZXhlYy1mc3lzX3VmczIuVHBvIiAiJChERVBESVIpL3VmczJfc3RhZ2UxXzVfZXhlYy1mc3lzX3VmczIuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvdWZzMl9zdGFnZTFfNV9leGVjLWZzeXNfdWZzMi5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmc3lzX3VmczIuYycgb2JqZWN0PSd1ZnMyX3N0YWdlMV81X2V4ZWMtZnN5c191ZnMyLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodWZzMl9zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHVmczJfc3RhZ2UxXzVfZXhlYy1mc3lzX3VmczIub2JqIGBpZiB0ZXN0IC1mICdmc3lzX3VmczIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX3VmczIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c191ZnMyLmMnOyBmaWAKKwordWZzMl9zdGFnZTFfNV9leGVjLWJpb3MubzogYmlvcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh1ZnMyX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHVmczJfc3RhZ2UxXzVfZXhlYy1iaW9zLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS91ZnMyX3N0YWdlMV81X2V4ZWMtYmlvcy5UcG8iIC1jIC1vIHVmczJfc3RhZ2UxXzVfZXhlYy1iaW9zLm8gYHRlc3QgLWYgJ2Jpb3MuYycgfHwgZWNobyAnJChzcmNkaXIpLydgYmlvcy5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvdWZzMl9zdGFnZTFfNV9leGVjLWJpb3MuVHBvIiAiJChERVBESVIpL3VmczJfc3RhZ2UxXzVfZXhlYy1iaW9zLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3VmczJfc3RhZ2UxXzVfZXhlYy1iaW9zLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Jpb3MuYycgb2JqZWN0PSd1ZnMyX3N0YWdlMV81X2V4ZWMtYmlvcy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh1ZnMyX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gdWZzMl9zdGFnZTFfNV9leGVjLWJpb3MubyBgdGVzdCAtZiAnYmlvcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BiaW9zLmMKKwordWZzMl9zdGFnZTFfNV9leGVjLWJpb3Mub2JqOiBiaW9zLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHVmczJfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgdWZzMl9zdGFnZTFfNV9leGVjLWJpb3Mub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvdWZzMl9zdGFnZTFfNV9leGVjLWJpb3MuVHBvIiAtYyAtbyB1ZnMyX3N0YWdlMV81X2V4ZWMtYmlvcy5vYmogYGlmIHRlc3QgLWYgJ2Jpb3MuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdiaW9zLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Jpb3MuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3VmczJfc3RhZ2UxXzVfZXhlYy1iaW9zLlRwbyIgIiQoREVQRElSKS91ZnMyX3N0YWdlMV81X2V4ZWMtYmlvcy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS91ZnMyX3N0YWdlMV81X2V4ZWMtYmlvcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdiaW9zLmMnIG9iamVjdD0ndWZzMl9zdGFnZTFfNV9leGVjLWJpb3Mub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh1ZnMyX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gdWZzMl9zdGFnZTFfNV9leGVjLWJpb3Mub2JqIGBpZiB0ZXN0IC1mICdiaW9zLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYmlvcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9iaW9zLmMnOyBmaWAKKwordnN0YWZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLm86IGNvbW1vbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh2c3RhZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgdnN0YWZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS92c3RhZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24uVHBvIiAtYyAtbyB2c3RhZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24ubyBgdGVzdCAtZiAnY29tbW9uLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbW1vbi5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvdnN0YWZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLlRwbyIgIiQoREVQRElSKS92c3RhZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvdnN0YWZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbW1vbi5jJyBvYmplY3Q9J3ZzdGFmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh2c3RhZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB2c3RhZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24ubyBgdGVzdCAtZiAnY29tbW9uLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbW1vbi5jCisKK3ZzdGFmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5vYmo6IGNvbW1vbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh2c3RhZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgdnN0YWZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL3ZzdGFmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5UcG8iIC1jIC1vIHZzdGFmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5vYmogYGlmIHRlc3QgLWYgJ2NvbW1vbi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbW1vbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb21tb24uYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ZzdGFmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5UcG8iICIkKERFUERJUikvdnN0YWZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ZzdGFmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb21tb24uYycgb2JqZWN0PSd2c3RhZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh2c3RhZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB2c3RhZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24ub2JqIGBpZiB0ZXN0IC1mICdjb21tb24uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb21tb24uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29tbW9uLmMnOyBmaWAKKwordnN0YWZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vOiBjaGFyX2lvLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHZzdGFmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCB2c3RhZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS92c3RhZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlRwbyIgLWMgLW8gdnN0YWZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vIGB0ZXN0IC1mICdjaGFyX2lvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNoYXJfaW8uYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ZzdGFmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8uVHBvIiAiJChERVBESVIpL3ZzdGFmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvdnN0YWZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjaGFyX2lvLmMnIG9iamVjdD0ndnN0YWZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh2c3RhZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB2c3RhZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm8gYHRlc3QgLWYgJ2NoYXJfaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY2hhcl9pby5jCisKK3ZzdGFmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8ub2JqOiBjaGFyX2lvLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHZzdGFmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCB2c3RhZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL3ZzdGFmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8uVHBvIiAtYyAtbyB2c3RhZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm9iaiBgaWYgdGVzdCAtZiAnY2hhcl9pby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NoYXJfaW8uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY2hhcl9pby5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvdnN0YWZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5UcG8iICIkKERFUERJUikvdnN0YWZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS92c3RhZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NoYXJfaW8uYycgb2JqZWN0PSd2c3RhZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodnN0YWZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gdnN0YWZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vYmogYGlmIHRlc3QgLWYgJ2NoYXJfaW8uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjaGFyX2lvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NoYXJfaW8uYyc7IGZpYAorCit2c3RhZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm86IGRpc2tfaW8uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodnN0YWZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHZzdGFmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8ubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL3ZzdGFmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8uVHBvIiAtYyAtbyB2c3RhZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm8gYHRlc3QgLWYgJ2Rpc2tfaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgZGlza19pby5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvdnN0YWZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5UcG8iICIkKERFUERJUikvdnN0YWZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS92c3RhZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Rpc2tfaW8uYycgb2JqZWN0PSd2c3RhZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHZzdGFmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHZzdGFmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8ubyBgdGVzdCAtZiAnZGlza19pby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkaXNrX2lvLmMKKwordnN0YWZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5vYmo6IGRpc2tfaW8uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodnN0YWZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHZzdGFmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8ub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvdnN0YWZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5UcG8iIC1jIC1vIHZzdGFmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8ub2JqIGBpZiB0ZXN0IC1mICdkaXNrX2lvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGlza19pby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kaXNrX2lvLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS92c3RhZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlRwbyIgIiQoREVQRElSKS92c3RhZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ZzdGFmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGlza19pby5jJyBvYmplY3Q9J3ZzdGFmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh2c3RhZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB2c3RhZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm9iaiBgaWYgdGVzdCAtZiAnZGlza19pby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Rpc2tfaW8uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZGlza19pby5jJzsgZmlgCisKK3ZzdGFmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm86IHN0YWdlMV81LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHZzdGFmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCB2c3RhZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vIC1NRCAtTVAgLU1GICIkKERFUERJUikvdnN0YWZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuVHBvIiAtYyAtbyB2c3RhZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vIGB0ZXN0IC1mICdzdGFnZTFfNS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzdGFnZTFfNS5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvdnN0YWZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuVHBvIiAiJChERVBESVIpL3ZzdGFmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ZzdGFmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81LlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3N0YWdlMV81LmMnIG9iamVjdD0ndnN0YWZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodnN0YWZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gdnN0YWZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUubyBgdGVzdCAtZiAnc3RhZ2UxXzUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3RhZ2UxXzUuYworCit2c3RhZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vYmo6IHN0YWdlMV81LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHZzdGFmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCB2c3RhZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS92c3RhZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5UcG8iIC1jIC1vIHZzdGFmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm9iaiBgaWYgdGVzdCAtZiAnc3RhZ2UxXzUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzdGFnZTFfNS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zdGFnZTFfNS5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvdnN0YWZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuVHBvIiAiJChERVBESVIpL3ZzdGFmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81LlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3ZzdGFmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81LlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3N0YWdlMV81LmMnIG9iamVjdD0ndnN0YWZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh2c3RhZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB2c3RhZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vYmogYGlmIHRlc3QgLWYgJ3N0YWdlMV81LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3RhZ2UxXzUuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3RhZ2UxXzUuYyc7IGZpYAorCit2c3RhZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX3ZzdGFmcy5vOiBmc3lzX3ZzdGFmcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh2c3RhZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgdnN0YWZzX3N0YWdlMV81X2V4ZWMtZnN5c192c3RhZnMubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL3ZzdGFmc19zdGFnZTFfNV9leGVjLWZzeXNfdnN0YWZzLlRwbyIgLWMgLW8gdnN0YWZzX3N0YWdlMV81X2V4ZWMtZnN5c192c3RhZnMubyBgdGVzdCAtZiAnZnN5c192c3RhZnMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c192c3RhZnMuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ZzdGFmc19zdGFnZTFfNV9leGVjLWZzeXNfdnN0YWZzLlRwbyIgIiQoREVQRElSKS92c3RhZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX3ZzdGFmcy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS92c3RhZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX3ZzdGFmcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmc3lzX3ZzdGFmcy5jJyBvYmplY3Q9J3ZzdGFmc19zdGFnZTFfNV9leGVjLWZzeXNfdnN0YWZzLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHZzdGFmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHZzdGFmc19zdGFnZTFfNV9leGVjLWZzeXNfdnN0YWZzLm8gYHRlc3QgLWYgJ2ZzeXNfdnN0YWZzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGZzeXNfdnN0YWZzLmMKKwordnN0YWZzX3N0YWdlMV81X2V4ZWMtZnN5c192c3RhZnMub2JqOiBmc3lzX3ZzdGFmcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh2c3RhZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgdnN0YWZzX3N0YWdlMV81X2V4ZWMtZnN5c192c3RhZnMub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikvdnN0YWZzX3N0YWdlMV81X2V4ZWMtZnN5c192c3RhZnMuVHBvIiAtYyAtbyB2c3RhZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX3ZzdGFmcy5vYmogYGlmIHRlc3QgLWYgJ2ZzeXNfdnN0YWZzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c192c3RhZnMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c192c3RhZnMuYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ZzdGFmc19zdGFnZTFfNV9leGVjLWZzeXNfdnN0YWZzLlRwbyIgIiQoREVQRElSKS92c3RhZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX3ZzdGFmcy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS92c3RhZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX3ZzdGFmcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdmc3lzX3ZzdGFmcy5jJyBvYmplY3Q9J3ZzdGFmc19zdGFnZTFfNV9leGVjLWZzeXNfdnN0YWZzLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodnN0YWZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gdnN0YWZzX3N0YWdlMV81X2V4ZWMtZnN5c192c3RhZnMub2JqIGBpZiB0ZXN0IC1mICdmc3lzX3ZzdGFmcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2ZzeXNfdnN0YWZzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2ZzeXNfdnN0YWZzLmMnOyBmaWAKKwordnN0YWZzX3N0YWdlMV81X2V4ZWMtYmlvcy5vOiBiaW9zLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHZzdGFmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCB2c3RhZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS92c3RhZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLlRwbyIgLWMgLW8gdnN0YWZzX3N0YWdlMV81X2V4ZWMtYmlvcy5vIGB0ZXN0IC1mICdiaW9zLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGJpb3MuYzsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3ZzdGFmc19zdGFnZTFfNV9leGVjLWJpb3MuVHBvIiAiJChERVBESVIpL3ZzdGFmc19zdGFnZTFfNV9leGVjLWJpb3MuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikvdnN0YWZzX3N0YWdlMV81X2V4ZWMtYmlvcy5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdiaW9zLmMnIG9iamVjdD0ndnN0YWZzX3N0YWdlMV81X2V4ZWMtYmlvcy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh2c3RhZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB2c3RhZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLm8gYHRlc3QgLWYgJ2Jpb3MuYycgfHwgZWNobyAnJChzcmNkaXIpLydgYmlvcy5jCisKK3ZzdGFmc19zdGFnZTFfNV9leGVjLWJpb3Mub2JqOiBiaW9zLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHZzdGFmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCB2c3RhZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL3ZzdGFmc19zdGFnZTFfNV9leGVjLWJpb3MuVHBvIiAtYyAtbyB2c3RhZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLm9iaiBgaWYgdGVzdCAtZiAnYmlvcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Jpb3MuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvYmlvcy5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvdnN0YWZzX3N0YWdlMV81X2V4ZWMtYmlvcy5UcG8iICIkKERFUERJUikvdnN0YWZzX3N0YWdlMV81X2V4ZWMtYmlvcy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS92c3RhZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Jpb3MuYycgb2JqZWN0PSd2c3RhZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodnN0YWZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gdnN0YWZzX3N0YWdlMV81X2V4ZWMtYmlvcy5vYmogYGlmIHRlc3QgLWYgJ2Jpb3MuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdiaW9zLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Jpb3MuYyc7IGZpYAorCit4ZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24ubzogY29tbW9uLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHhmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4ZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24ubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL3hmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5UcG8iIC1jIC1vIHhmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5vIGB0ZXN0IC1mICdjb21tb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29tbW9uLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS94ZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24uVHBvIiAiJChERVBESVIpL3hmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS94ZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29tbW9uLmMnIG9iamVjdD0neGZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHhmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHhmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5vIGB0ZXN0IC1mICdjb21tb24uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29tbW9uLmMKKworeGZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLm9iajogY29tbW9uLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHhmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4ZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24ub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikveGZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLlRwbyIgLWMgLW8geGZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLm9iaiBgaWYgdGVzdCAtZiAnY29tbW9uLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29tbW9uLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbW1vbi5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikveGZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLlRwbyIgIiQoREVQRElSKS94ZnNfc3RhZ2UxXzVfZXhlYy1jb21tb24uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikveGZzX3N0YWdlMV81X2V4ZWMtY29tbW9uLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbW1vbi5jJyBvYmplY3Q9J3hmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHhmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHhmc19zdGFnZTFfNV9leGVjLWNvbW1vbi5vYmogYGlmIHRlc3QgLWYgJ2NvbW1vbi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbW1vbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb21tb24uYyc7IGZpYAorCit4ZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm86IGNoYXJfaW8uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeGZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHhmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8ubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL3hmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8uVHBvIiAtYyAtbyB4ZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm8gYHRlc3QgLWYgJ2NoYXJfaW8uYycgfHwgZWNobyAnJChzcmNkaXIpLydgY2hhcl9pby5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikveGZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5UcG8iICIkKERFUERJUikveGZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS94ZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NoYXJfaW8uYycgb2JqZWN0PSd4ZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHhmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHhmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8ubyBgdGVzdCAtZiAnY2hhcl9pby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BjaGFyX2lvLmMKKworeGZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5vYmo6IGNoYXJfaW8uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeGZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHhmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8ub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikveGZzX3N0YWdlMV81X2V4ZWMtY2hhcl9pby5UcG8iIC1jIC1vIHhmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8ub2JqIGBpZiB0ZXN0IC1mICdjaGFyX2lvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY2hhcl9pby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jaGFyX2lvLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS94ZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlRwbyIgIiQoREVQRElSKS94ZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3hmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY2hhcl9pby5jJyBvYmplY3Q9J3hmc19zdGFnZTFfNV9leGVjLWNoYXJfaW8ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4ZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4ZnNfc3RhZ2UxXzVfZXhlYy1jaGFyX2lvLm9iaiBgaWYgdGVzdCAtZiAnY2hhcl9pby5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NoYXJfaW8uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY2hhcl9pby5jJzsgZmlgCisKK3hmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8ubzogZGlza19pby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4ZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeGZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5vIC1NRCAtTVAgLU1GICIkKERFUERJUikveGZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5UcG8iIC1jIC1vIHhmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8ubyBgdGVzdCAtZiAnZGlza19pby5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BkaXNrX2lvLmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS94ZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlRwbyIgIiQoREVQRElSKS94ZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3hmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8uVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZGlza19pby5jJyBvYmplY3Q9J3hmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeGZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geGZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5vIGB0ZXN0IC1mICdkaXNrX2lvLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGRpc2tfaW8uYworCit4ZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLm9iajogZGlza19pby5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAlpZiAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4ZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgeGZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS94ZnNfc3RhZ2UxXzVfZXhlYy1kaXNrX2lvLlRwbyIgLWMgLW8geGZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5vYmogYGlmIHRlc3QgLWYgJ2Rpc2tfaW8uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdkaXNrX2lvLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2Rpc2tfaW8uYyc7IGZpYDsgXAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJdGhlbiBtdiAtZiAiJChERVBESVIpL3hmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8uVHBvIiAiJChERVBESVIpL3hmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8uUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikveGZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5UcG8iOyBleGl0IDE7IGZpCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdkaXNrX2lvLmMnIG9iamVjdD0neGZzX3N0YWdlMV81X2V4ZWMtZGlza19pby5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHhmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHhmc19zdGFnZTFfNV9leGVjLWRpc2tfaW8ub2JqIGBpZiB0ZXN0IC1mICdkaXNrX2lvLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZGlza19pby5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9kaXNrX2lvLmMnOyBmaWAKKworeGZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUubzogc3RhZ2UxXzUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeGZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHhmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm8gLU1EIC1NUCAtTUYgIiQoREVQRElSKS94ZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5UcG8iIC1jIC1vIHhmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm8gYHRlc3QgLWYgJ3N0YWdlMV81LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHN0YWdlMV81LmM7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS94ZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5UcG8iICIkKERFUERJUikveGZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikveGZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3RhZ2UxXzUuYycgb2JqZWN0PSd4ZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4ZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4ZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vIGB0ZXN0IC1mICdzdGFnZTFfNS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzdGFnZTFfNS5jCisKK3hmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm9iajogc3RhZ2UxXzUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeGZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHhmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm9iaiAtTUQgLU1QIC1NRiAiJChERVBESVIpL3hmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81LlRwbyIgLWMgLW8geGZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUub2JqIGBpZiB0ZXN0IC1mICdzdGFnZTFfNS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3N0YWdlMV81LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N0YWdlMV81LmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS94ZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5UcG8iICIkKERFUERJUikveGZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuUG8iOyBlbHNlIHJtIC1mICIkKERFUERJUikveGZzX3N0YWdlMV81X2V4ZWMtc3RhZ2UxXzUuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3RhZ2UxXzUuYycgb2JqZWN0PSd4ZnNfc3RhZ2UxXzVfZXhlYy1zdGFnZTFfNS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHhmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHhmc19zdGFnZTFfNV9leGVjLXN0YWdlMV81Lm9iaiBgaWYgdGVzdCAtZiAnc3RhZ2UxXzUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzdGFnZTFfNS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zdGFnZTFfNS5jJzsgZmlgCisKK3hmc19zdGFnZTFfNV9leGVjLWZzeXNfeGZzLm86IGZzeXNfeGZzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHhmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4ZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX3hmcy5vIC1NRCAtTVAgLU1GICIkKERFUERJUikveGZzX3N0YWdlMV81X2V4ZWMtZnN5c194ZnMuVHBvIiAtYyAtbyB4ZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX3hmcy5vIGB0ZXN0IC1mICdmc3lzX3hmcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bmc3lzX3hmcy5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikveGZzX3N0YWdlMV81X2V4ZWMtZnN5c194ZnMuVHBvIiAiJChERVBESVIpL3hmc19zdGFnZTFfNV9leGVjLWZzeXNfeGZzLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3hmc19zdGFnZTFfNV9leGVjLWZzeXNfeGZzLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfeGZzLmMnIG9iamVjdD0neGZzX3N0YWdlMV81X2V4ZWMtZnN5c194ZnMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeGZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8geGZzX3N0YWdlMV81X2V4ZWMtZnN5c194ZnMubyBgdGVzdCAtZiAnZnN5c194ZnMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnN5c194ZnMuYworCit4ZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX3hmcy5vYmo6IGZzeXNfeGZzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHhmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1NVCB4ZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX3hmcy5vYmogLU1EIC1NUCAtTUYgIiQoREVQRElSKS94ZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX3hmcy5UcG8iIC1jIC1vIHhmc19zdGFnZTFfNV9leGVjLWZzeXNfeGZzLm9iaiBgaWYgdGVzdCAtZiAnZnN5c194ZnMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc3lzX3hmcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc3lzX3hmcy5jJzsgZmlgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikveGZzX3N0YWdlMV81X2V4ZWMtZnN5c194ZnMuVHBvIiAiJChERVBESVIpL3hmc19zdGFnZTFfNV9leGVjLWZzeXNfeGZzLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3hmc19zdGFnZTFfNV9leGVjLWZzeXNfeGZzLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzeXNfeGZzLmMnIG9iamVjdD0neGZzX3N0YWdlMV81X2V4ZWMtZnN5c194ZnMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4ZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4ZnNfc3RhZ2UxXzVfZXhlYy1mc3lzX3hmcy5vYmogYGlmIHRlc3QgLWYgJ2ZzeXNfeGZzLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZnN5c194ZnMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZnN5c194ZnMuYyc7IGZpYAorCit4ZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLm86IGJpb3MuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeGZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHhmc19zdGFnZTFfNV9leGVjLWJpb3MubyAtTUQgLU1QIC1NRiAiJChERVBESVIpL3hmc19zdGFnZTFfNV9leGVjLWJpb3MuVHBvIiAtYyAtbyB4ZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLm8gYHRlc3QgLWYgJ2Jpb3MuYycgfHwgZWNobyAnJChzcmNkaXIpLydgYmlvcy5jOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikveGZzX3N0YWdlMV81X2V4ZWMtYmlvcy5UcG8iICIkKERFUERJUikveGZzX3N0YWdlMV81X2V4ZWMtYmlvcy5QbyI7IGVsc2Ugcm0gLWYgIiQoREVQRElSKS94ZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2Jpb3MuYycgb2JqZWN0PSd4ZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHhmc19zdGFnZTFfNV9leGVjX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHhmc19zdGFnZTFfNV9leGVjLWJpb3MubyBgdGVzdCAtZiAnYmlvcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BiaW9zLmMKKworeGZzX3N0YWdlMV81X2V4ZWMtYmlvcy5vYmo6IGJpb3MuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoeGZzX3N0YWdlMV81X2V4ZWNfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHhmc19zdGFnZTFfNV9leGVjLWJpb3Mub2JqIC1NRCAtTVAgLU1GICIkKERFUERJUikveGZzX3N0YWdlMV81X2V4ZWMtYmlvcy5UcG8iIC1jIC1vIHhmc19zdGFnZTFfNV9leGVjLWJpb3Mub2JqIGBpZiB0ZXN0IC1mICdiaW9zLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnYmlvcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9iaW9zLmMnOyBmaWA7IFwKK0BhbV9fZmFzdGRlcENDX1RSVUVACXRoZW4gbXYgLWYgIiQoREVQRElSKS94ZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLlRwbyIgIiQoREVQRElSKS94ZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpL3hmc19zdGFnZTFfNV9leGVjLWJpb3MuVHBvIjsgZXhpdCAxOyBmaQorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nYmlvcy5jJyBvYmplY3Q9J3hmc19zdGFnZTFfNV9leGVjLWJpb3Mub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJCh4ZnNfc3RhZ2UxXzVfZXhlY19DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyB4ZnNfc3RhZ2UxXzVfZXhlYy1iaW9zLm9iaiBgaWYgdGVzdCAtZiAnYmlvcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2Jpb3MuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvYmlvcy5jJzsgZmlgCit1bmluc3RhbGwtaW5mby1hbToKK2luc3RhbGwtcGtnbGliREFUQTogJChwa2dsaWJfREFUQSkKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKHBrZ2xpYmRpcikiIHx8ICQobWtkaXJfcCkgIiQoREVTVERJUikkKHBrZ2xpYmRpcikiCisJQGxpc3Q9JyQocGtnbGliX0RBVEEpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgZj0kKGFtX19zdHJpcF9kaXIpIFwKKwkgIGVjaG8gIiAkKHBrZ2xpYkRBVEFfSU5TVEFMTCkgJyQkZCQkcCcgJyQoREVTVERJUikkKHBrZ2xpYmRpcikvJCRmJyI7IFwKKwkgICQocGtnbGliREFUQV9JTlNUQUxMKSAiJCRkJCRwIiAiJChERVNURElSKSQocGtnbGliZGlyKS8kJGYiOyBcCisJZG9uZQorCit1bmluc3RhbGwtcGtnbGliREFUQToKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKHBrZ2xpYl9EQVRBKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgZj0kKGFtX19zdHJpcF9kaXIpIFwKKwkgIGVjaG8gIiBybSAtZiAnJChERVNURElSKSQocGtnbGliZGlyKS8kJGYnIjsgXAorCSAgcm0gLWYgIiQoREVTVERJUikkKHBrZ2xpYmRpcikvJCRmIjsgXAorCWRvbmUKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZQordGFnczogVEFHUworCitUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXRhZ3M9OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJHRhZ3MkJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCisJICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCisJICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICQkdGFncyAkJHVuaXF1ZTsgXAorCWZpCitjdGFnczogQ1RBR1MKK0NUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXRhZ3M9OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAorCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHRhZ3MkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR0YWdzICQkdW5pcXVlCisKK0dUQUdTOgorCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiBjZCAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgJCRoZXJlCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCisKK2NoZWNrLVRFU1RTOiAkKFRFU1RTKQorCUBmYWlsZWQ9MDsgYWxsPTA7IHhmYWlsPTA7IHhwYXNzPTA7IHNraXA9MDsgXAorCXNyY2Rpcj0kKHNyY2Rpcik7IGV4cG9ydCBzcmNkaXI7IFwKKwlsaXN0PSckKFRFU1RTKSc7IFwKKwlpZiB0ZXN0IC1uICIkJGxpc3QiOyB0aGVuIFwKKwkgIGZvciB0c3QgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgLi8kJHRzdDsgdGhlbiBkaXI9Li87IFwKKwkgICAgZWxpZiB0ZXN0IC1mICQkdHN0OyB0aGVuIGRpcj07IFwKKwkgICAgZWxzZSBkaXI9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgICBpZiAkKFRFU1RTX0VOVklST05NRU5UKSAkJHtkaXJ9JCR0c3Q7IHRoZW4gXAorCSAgICAgIGFsbD1gZXhwciAkJGFsbCArIDFgOyBcCisJICAgICAgY2FzZSAiICQoWEZBSUxfVEVTVFMpICIgaW4gXAorCSAgICAgICoiICQkdHN0ICIqKSBcCisJCXhwYXNzPWBleHByICQkeHBhc3MgKyAxYDsgXAorCQlmYWlsZWQ9YGV4cHIgJCRmYWlsZWQgKyAxYDsgXAorCQllY2hvICJYUEFTUzogJCR0c3QiOyBcCisJICAgICAgOzsgXAorCSAgICAgICopIFwKKwkJZWNobyAiUEFTUzogJCR0c3QiOyBcCisJICAgICAgOzsgXAorCSAgICAgIGVzYWM7IFwKKwkgICAgZWxpZiB0ZXN0ICQkPyAtbmUgNzc7IHRoZW4gXAorCSAgICAgIGFsbD1gZXhwciAkJGFsbCArIDFgOyBcCisJICAgICAgY2FzZSAiICQoWEZBSUxfVEVTVFMpICIgaW4gXAorCSAgICAgICoiICQkdHN0ICIqKSBcCisJCXhmYWlsPWBleHByICQkeGZhaWwgKyAxYDsgXAorCQllY2hvICJYRkFJTDogJCR0c3QiOyBcCisJICAgICAgOzsgXAorCSAgICAgICopIFwKKwkJZmFpbGVkPWBleHByICQkZmFpbGVkICsgMWA7IFwKKwkJZWNobyAiRkFJTDogJCR0c3QiOyBcCisJICAgICAgOzsgXAorCSAgICAgIGVzYWM7IFwKKwkgICAgZWxzZSBcCisJICAgICAgc2tpcD1gZXhwciAkJHNraXAgKyAxYDsgXAorCSAgICAgIGVjaG8gIlNLSVA6ICQkdHN0IjsgXAorCSAgICBmaTsgXAorCSAgZG9uZTsgXAorCSAgaWYgdGVzdCAiJCRmYWlsZWQiIC1lcSAwOyB0aGVuIFwKKwkgICAgaWYgdGVzdCAiJCR4ZmFpbCIgLWVxIDA7IHRoZW4gXAorCSAgICAgIGJhbm5lcj0iQWxsICQkYWxsIHRlc3RzIHBhc3NlZCI7IFwKKwkgICAgZWxzZSBcCisJICAgICAgYmFubmVyPSJBbGwgJCRhbGwgdGVzdHMgYmVoYXZlZCBhcyBleHBlY3RlZCAoJCR4ZmFpbCBleHBlY3RlZCBmYWlsdXJlcykiOyBcCisJICAgIGZpOyBcCisJICBlbHNlIFwKKwkgICAgaWYgdGVzdCAiJCR4cGFzcyIgLWVxIDA7IHRoZW4gXAorCSAgICAgIGJhbm5lcj0iJCRmYWlsZWQgb2YgJCRhbGwgdGVzdHMgZmFpbGVkIjsgXAorCSAgICBlbHNlIFwKKwkgICAgICBiYW5uZXI9IiQkZmFpbGVkIG9mICQkYWxsIHRlc3RzIGRpZCBub3QgYmVoYXZlIGFzIGV4cGVjdGVkICgkJHhwYXNzIHVuZXhwZWN0ZWQgcGFzc2VzKSI7IFwKKwkgICAgZmk7IFwKKwkgIGZpOyBcCisJICBkYXNoZXM9IiQkYmFubmVyIjsgXAorCSAgc2tpcHBlZD0iIjsgXAorCSAgaWYgdGVzdCAiJCRza2lwIiAtbmUgMDsgdGhlbiBcCisJICAgIHNraXBwZWQ9IigkJHNraXAgdGVzdHMgd2VyZSBub3QgcnVuKSI7IFwKKwkgICAgdGVzdCBgZWNobyAiJCRza2lwcGVkIiB8IHdjIC1jYCAtbGUgYGVjaG8gIiQkYmFubmVyIiB8IHdjIC1jYCB8fCBcCisJICAgICAgZGFzaGVzPSIkJHNraXBwZWQiOyBcCisJICBmaTsgXAorCSAgcmVwb3J0PSIiOyBcCisJICBpZiB0ZXN0ICIkJGZhaWxlZCIgLW5lIDAgJiYgdGVzdCAtbiAiJChQQUNLQUdFX0JVR1JFUE9SVCkiOyB0aGVuIFwKKwkgICAgcmVwb3J0PSJQbGVhc2UgcmVwb3J0IHRvICQoUEFDS0FHRV9CVUdSRVBPUlQpIjsgXAorCSAgICB0ZXN0IGBlY2hvICIkJHJlcG9ydCIgfCB3YyAtY2AgLWxlIGBlY2hvICIkJGJhbm5lciIgfCB3YyAtY2AgfHwgXAorCSAgICAgIGRhc2hlcz0iJCRyZXBvcnQiOyBcCisJICBmaTsgXAorCSAgZGFzaGVzPWBlY2hvICIkJGRhc2hlcyIgfCBzZWQgcy8uLz0vZ2A7IFwKKwkgIGVjaG8gIiQkZGFzaGVzIjsgXAorCSAgZWNobyAiJCRiYW5uZXIiOyBcCisJICB0ZXN0IC16ICIkJHNraXBwZWQiIHx8IGVjaG8gIiQkc2tpcHBlZCI7IFwKKwkgIHRlc3QgLXogIiQkcmVwb3J0IiB8fCBlY2hvICIkJHJlcG9ydCI7IFwKKwkgIGVjaG8gIiQkZGFzaGVzIjsgXAorCSAgdGVzdCAiJCRmYWlsZWQiIC1lcSAwOyBcCisJZWxzZSA6OyBmaQorCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAnc3wufC58ZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCisJICBjYXNlICQkZmlsZSBpbiBcCisJICAgICQoc3JjZGlyKS8qKSBmaWxlPWBlY2hvICIkJGZpbGUiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCisJICAgICQodG9wX3NyY2RpcikvKikgZmlsZT1gZWNobyAiJCRmaWxlIiB8IHNlZCAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3wiYDs7IFwKKwkgIGVzYWM7IFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGRpcj1gZWNobyAiJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgIGlmIHRlc3QgIiQkZGlyIiAhPSAiJCRmaWxlIiAmJiB0ZXN0ICIkJGRpciIgIT0gIi4iOyB0aGVuIFwKKwkgICAgZGlyPSIvJCRkaXIiOyBcCisJICAgICQobWtkaXJfcCkgIiQoZGlzdGRpcikkJGRpciI7IFwKKwkgIGVsc2UgXAorCSAgICBkaXI9Jyc7IFwKKwkgIGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtcFIgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1wUiAkJGQvJCRmaWxlICQoZGlzdGRpcikkJGRpciB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2stVEVTVFMKK2NoZWNrOiAkKEJVSUxUX1NPVVJDRVMpCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUgJChMSUJSQVJJRVMpICQoUFJPR1JBTVMpICQoU0NSSVBUUykgJChEQVRBKSBcCisJCSQoSEVBREVSUykKK2luc3RhbGxkaXJzOgorCWZvciBkaXIgaW4gIiQoREVTVERJUikkKHBrZ2xpYmRpcikiOyBkbyBcCisJICB0ZXN0IC16ICIkJGRpciIgfHwgJChta2Rpcl9wKSAiJCRkaXIiOyBcCisJZG9uZQoraW5zdGFsbDogJChCVUlMVF9TT1VSQ0VTKQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKE1PU1RMWUNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1PU1RMWUNMRUFORklMRVMpCisKK2NsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorCS10ZXN0IC16ICIkKEJVSUxUX1NPVVJDRVMpIiB8fCBybSAtZiAkKEJVSUxUX1NPVVJDRVMpCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbm9pbnN0TElCUkFSSUVTIGNsZWFuLW5vaW5zdFBST0dSQU1TIFwKKwltb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLXBrZ2xpYkRBVEEKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1tYW46CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLWluZm8tYW0gdW5pbnN0YWxsLXBrZ2xpYkRBVEEKKworLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLVRFU1RTIGNoZWNrLWFtIGNsZWFuIFwKKwljbGVhbi1nZW5lcmljIGNsZWFuLW5vaW5zdExJQlJBUklFUyBjbGVhbi1ub2luc3RQUk9HUkFNUyBjdGFncyBcCisJZGlzdGNsZWFuIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi10YWdzIFwKKwlkaXN0ZGlyIGR2aSBkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIFwKKwlpbnN0YWxsLWFtIGluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1leGVjIFwKKwlpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBcCisJaW5zdGFsbC1wa2dsaWJEQVRBIGluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBcCisJaW5zdGFsbGRpcnMgbWFpbnRhaW5lci1jbGVhbiBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBwZGYgcGRmLWFtIFwKKwlwcyBwcy1hbSB0YWdzIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsLWluZm8tYW0gXAorCXVuaW5zdGFsbC1wa2dsaWJEQVRBCisKKworc3RhZ2UyX3NpemUuaDogcHJlX3N0YWdlMgorCS1ybSAtZiBzdGFnZTJfc2l6ZS5oCisJc2V0IGR1bW15IGBscyAtbCBwcmVfc3RhZ2UyYDsgXAorCWVjaG8gIiNkZWZpbmUgU1RBR0UyX1NJWkUgJCQ2IiA+IHN0YWdlMl9zaXplLmgKKworIyBYWFg6IGF1dG9tYWtlIGRvZXNuJ3QgcHJvdmlkZSBhIHdheSB0byBzcGVjaWZ5IGRlcGVuZGVuY2llcyBmb3Igb2JqZWN0CisjIGZpbGVzIGV4cGxpY2l0bHksIHNvIHdlIG11c3Qgd3JpdGUgdGhpcyBieSBhIGdlbmVyYWwgTWFrZWZpbGUgc2NoZW1lLgorIyBJZiBhdXRvbWFrZSBjaGFuZ2UgdGhlIG5hbWluZyBzY2hlbWUgZm9yIHBlci1leGVjdXRhYmxlIG9iamVjdHMsIHRoaXMKKyMgd2lsbCBiZSBicm9rZW4uCitzdGFydF9leGVjLXN0YXJ0LiQoT0JKRVhUKTogc3RhZ2UyX3NpemUuaAorCitzdGFnZTI6IHByZV9zdGFnZTIgc3RhcnQKKwktcm0gLWYgc3RhZ2UyCisJY2F0IHN0YXJ0IHByZV9zdGFnZTIgPiBzdGFnZTIKKworc3RhcnRfZWx0b3JpdG9fZXhlYy1zdGFydC4kKE9CSkVYVCk6IHN0YWdlMl9zaXplLmgKKworc3RhZ2UyX2VsdG9yaXRvOiBwcmVfc3RhZ2UyIHN0YXJ0X2VsdG9yaXRvCisJLXJtIC1mIHN0YWdlMl9lbHRvcml0bworCWNhdCBzdGFydF9lbHRvcml0byBwcmVfc3RhZ2UyID4gc3RhZ2UyX2VsdG9yaXRvCisKK2Rpc2tsZXNzX3NpemUuaDogZGlza2xlc3MKKwktcm0gLWYgJEAKKwlzZXQgZHVtbXkgYGxzIC1sICReYDsgXAorCWVjaG8gIiNkZWZpbmUgRElTS0xFU1NfU0laRSAkJDYiID4gJEAKKworIyBYWFg6IFNlZSB0aGUgY29tbWVudCBmb3Igc3RhcnRfZXhlYy1zdGFydC5vLgorbmJsb2FkZXJfZXhlYy1uYmxvYWRlci4kKE9CSkVYVCk6IGRpc2tsZXNzX3NpemUuaAorCisjIEZvciBuYmdydWIgdGFyZ2V0LgorbmJncnViOiBuYmxvYWRlciBkaXNrbGVzcworCS1ybSAtZiAkQAorCWNhdCAkXiA+ICRACisKKyMgWFhYOiBTZWUgdGhlIGNvbW1lbnQgZm9yIHN0YXJ0X2V4ZWMtc3RhcnQuby4KK3B4ZWxvYWRlcl9leGVjLXB4ZWxvYWRlci4kKE9CSkVYVCk6IGRpc2tsZXNzX3NpemUuaAorCisjIEZvciBweGVncnViIHRhcmdldC4KK3B4ZWdydWI6IHB4ZWxvYWRlciBkaXNrbGVzcworCS1ybSAtZiAkQAorCWNhdCAkXiA+ICRACisuZXhlYzoKKwkkKE9CSkNPUFkpIC1PIGJpbmFyeSAkPCAkQAorIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvc3RhZ2UyL2FwaWMuaCBiL3N0YWdlMi9hcGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI0MTMyOQotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMi9hcGljLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqICA8SW5zZXJ0IGNvcHlyaWdodCBoZXJlIDogaXQgbXVzdCBiZSBCU0QtbGlrZSBzbyBldmVyeW9uZSBjYW4gdXNlIGl0PgorICoKKyAqICBBdXRob3I6ICBFcmljaCBCb2xleW4gIDxlcmljaEB1cnVrLm9yZz4gICBodHRwOi8vd3d3LnVydWsub3JnL35lcmljaC8KKyAqCisgKiAgSGVhZGVyIGZpbGUgZm9yIEludGVsIEFyY2hpdGVjdHVyZSBsb2NhbCBhbmQgSS9PIEFQSUMgZGVmaW5pdGlvbnMuCisgKgorICogIFRoaXMgZmlsZSB3YXMgY3JlYXRlZCBmcm9tIGluZm9ybWF0aW9uIGluIHRoZSBJbnRlbCBQZW50aXVtIFBybworICogIEZhbWlseSBEZXZlbG9wZXIncyBNYW51YWwsIFZvbHVtZSAzOiBPcGVyYXRpbmcgU3lzdGVtIFdyaXRlcidzCisgKiAgTWFudWFsLCBvcmRlciBudW1iZXIgMjQyNjkyLTAwMSwgd2hpY2ggY2FuIGJlIG9yZGVyZWQgZnJvbSB0aGUKKyAqICBJbnRlbCBsaXRlcmF0dXJlIGNlbnRlci4KKyAqLworCisjaWZuZGVmIF9BUElDX0gKKyNkZWZpbmUgX0FQSUNfSAorCisvKgorICogIEFQSUMgRGVmaW5lcy4KKyAqLworCisjZGVmaW5lIEFQSUNfQlJPQURDQVNUX0lECQkgICAgICAgCTB4RkYKKworLyoKKyAqICBBUElDIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKi8KKworLyoKKyAqICBTaGFyZWQgZGVmaW5lcyBmb3IgSS9PIGFuZCBsb2NhbCBBUElDIGRlZmluaXRpb25zCisgKi8KKy8qIEFQSUMgdmVyc2lvbiByZWdpc3RlciAqLworI2RlZmluZQlBUElDX1ZFUlNJT04oeCkJCQkJKCh4KSAmIDB4RkYpCisvKiBpZiB0aGUgQVBJQyB2ZXJzaW9uIGlzIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiBBUElDX1ZFUl9ORVcsIGl0CisgICBpcyBhICJuZXciIEFQSUMgKi8KKyNkZWZpbmUgQVBJQ19WRVJfTkVXCQkJCTB4MTAKKy8qIHRoaXMgbmV4dCBvbmUgaXMgdXNlZCBpbiBhbGwgY2FzZXMgYnV0IGFuIG9sZCBsb2NhbCBBUElDLCB3aGljaCBoYXMKKyAgIDIgZW50cmllcyBpbiBpdCdzIExWVCAqLworI2RlZmluZQlBUElDX01BWFJFRElSKHgpCQkJKCgoeCkgPj4gMTYpICYgMHhGRikKKy8qIEFQSUMgaWQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJQVBJQ19PTERfSUQoeCkJCQkJKCh4KSA+PiAyNCkKKyNkZWZpbmUJQVBJQ19ORVdfSUQoeCkJCQkJKCgoeCkgPj4gMjQpICYgMHhGKQorCisjZGVmaW5lIElPQVBJQ19SRUdTRUwJCQkJMAorI2RlZmluZSBJT0FQSUNfUlcJCQkJMHgxMAorI2RlZmluZQkJSU9BUElDX0lECQkJMAorI2RlZmluZQkJSU9BUElDX1ZFUgkJCTEKKyNkZWZpbmUJCUlPQVBJQ19SRURJUgkJCTB4MTAKKyNkZWZpbmUgTEFQSUNfSUQJCQkJMHgyMAorI2RlZmluZSBMQVBJQ19WRVIJCQkJMHgzMAorI2RlZmluZSBMQVBJQ19UUFIJCQkJMHg4MAorI2RlZmluZSBMQVBJQ19BUFIJCQkJMHg5MAorI2RlZmluZSBMQVBJQ19QUFIJCQkJMHhBMAorI2RlZmluZSBMQVBJQ19FT0kJCQkJMHhCMAorI2RlZmluZSBMQVBJQ19MRFIJCQkJMHhEMAorI2RlZmluZSBMQVBJQ19ERlIJCQkJMHhFMAorI2RlZmluZSBMQVBJQ19TUElWCQkJCTB4RjAKKyNkZWZpbmUJCUxBUElDX1NQSVZfRU5BQkxFX0FQSUMJCTB4MTAwCisjZGVmaW5lIExBUElDX0lTUgkJCQkweDEwMAorI2RlZmluZSBMQVBJQ19UTVIJCQkJMHgxODAKKyNkZWZpbmUgTEFQSUNfSVJSCQkJCTB4MjAwCisjZGVmaW5lIExBUElDX0VTUgkJCQkweDI4MAorI2RlZmluZSBMQVBJQ19JQ1IJCQkJMHgzMDAKKyNkZWZpbmUJCUxBUElDX0RFU1RfTUFTSwkJCTB4RkZGRkZGCisjZGVmaW5lIExBUElDX0xWVFQJCQkJMHgzMjAKKyNkZWZpbmUgTEFQSUNfTFZUUEMJCSAgICAgICAJCTB4MzQwCisjZGVmaW5lIExBUElDX0xWVDAJCQkJMHgzNTAKKyNkZWZpbmUgTEFQSUNfTFZUMQkJCQkweDM2MAorI2RlZmluZSBMQVBJQ19MVlRFCQkJCTB4MzcwCisjZGVmaW5lIExBUElDX1RJQ1IJCQkJMHgzODAKKyNkZWZpbmUgTEFQSUNfVENDUgkJCQkweDM5MAorI2RlZmluZSBMQVBJQ19URENSCQkJCTB4M0UwCisKKyNlbmRpZiAvKiBfQVBJQ19IICovCmRpZmYgLS1naXQgYS9zdGFnZTIvYXBtLlMgYi9zdGFnZTIvYXBtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmNWUyNwotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMi9hcG0uUwpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyogVGhpcyBpcyBzdG9sZW4gZnJvbSBhcmNoL2kzODYvYm9vdC9zZXR1cC5TIGluIExpbnV4IDIuMi4xNyAqLworLyoKKyEgICAgICAgc2V0dXAuUyAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiBMaW51cyBUb3J2YWxkcworKi8KKworRU5UUlkoZ2V0X2FwbV9pbmZvKQorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVkaQorCXB1c2hsCSVlc2kKKworCWNhbGwJRVhUX0MocHJvdF90b19yZWFsKQorCS5jb2RlMTYKKwkKKwkvKiBBUE0gQklPUyBpbnN0YWxsYXRpb24gY2hlY2sgKi8KKwltb3Z3CSQweDUzMDAsICVheAorCXhvcncJJWJ4LCAlYngKKwlpbnQJJDB4MTUKKwkvKiBlcnJvciAtPiBubyBBUE0gQklPUyAqLworCWpjCWRvbmVfYXBtX2Jpb3MKKworCS8qIGNoZWNrIGZvciAiUE0iIHNpZ25hdHVyZSAqLworCWNtcHcJJDB4NTA0ZCwgJWJ4CisJLyogbm8gc2lnbmF0dXJlIC0+IG5vIEFQTSBCSU9TICovCisJam5lCWRvbmVfYXBtX2Jpb3MKKworCS8qIElzIDMyIGJpdCBzdXBwb3J0ZWQ/ICovCisJYW5kdwkkMHgwMDAyLCAlY3gKKwkvKiBubyAuLi4gKi8KKwlqZQlkb25lX2FwbV9iaW9zCisKKwkvKiBEaXNjb25uZWN0IGZpcnN0IGp1c3QgaW4gY2FzZSAqLworCW1vdncJJDB4NTMwNCwgJWF4CisJeG9ydwklYngsICVieAorCS8qIGlnbm9yZSByZXR1cm4gY29kZSAqLworCWludAkkMHgxNQorCisJLyogMzIgYml0IGNvbm5lY3QgKi8KKwltb3Z3CSQweDUzMDMsICVheAorCXhvcmwJJWVieCwgJWVieAorCS8qIHBhcmFub2lhICovCisJeG9ydwklY3gsICVjeAorCXhvcncJJWR4LCAlZHgKKwl4b3JsCSVlc2ksICVlc2kKKwl4b3J3CSVkaSwgJWRpCisJaW50CSQweDE1CisJLyogZXJyb3IgKi8KKwlqYwlub18zMl9hcG1fYmlvcworCisJLyogQklPUyBjb2RlIHNlZ21lbnQgKi8KKwltb3Z3CSVheCwgQUJTKEVYVF9DKGFwbV9iaW9zX2luZm8pKSArIDIKKwkvKiBCSU9TIGVudHJ5IHBvaW50IG9mZnNldCAqLworCW1vdmwJJWVieCwgQUJTKEVYVF9DKGFwbV9iaW9zX2luZm8pKSArIDQKKwkvKiBCSU9TIDE2IGJpdCBjb2RlIHNlZ21lbnQgKi8KKwltb3Z3CSVjeCwgQUJTKEVYVF9DKGFwbV9iaW9zX2luZm8pKSArIDgKKwkvKiBCSU9TIGRhdGEgc2VnbWVudCAqLworCW1vdncJJWR4LCBBQlMoRVhUX0MoYXBtX2Jpb3NfaW5mbykpICsgMTAKKwkvKiBCSU9TIGNvZGUgc2VnbWVudCBsZW5ndGggKi8KKwltb3ZsCSVlc2ksIEFCUyhFWFRfQyhhcG1fYmlvc19pbmZvKSkgKyAxNAorCS8qIEJJT1MgZGF0YSBzZWdtZW50IGxlbmd0aCAqLworCW1vdncJJWRpLCBBQlMoRVhUX0MoYXBtX2Jpb3NfaW5mbykpICsgMTgKKworCS8qCisJICogUmVkbyB0aGUgaW5zdGFsbGF0aW9uIGNoZWNrIGFzIHRoZSAzMiBiaXQgY29ubmVjdAorCSAqIG1vZGlmaWVzIHRoZSBmbGFncyByZXR1cm5lZCBvbiBzb21lIEJJT1NzCisJICovCisKKwkvKiBBUE0gQklPUyBpbnN0YWxsYXRpb24gY2hlY2sgKi8KKwltb3Z3CSQweDUzMDAsICVheAorCXhvcncJJWJ4LCAlYngKKwkvKiBwYXJhbm9pYSAqLworCXhvcncJJWN4LCAlY3gKKwlpbnQgICAgICQweDE1CisJLyogZXJyb3IgLT4gc2hvdWxkIG5vdCBoYXBwZW4sIHRpZHkgdXAgKi8KKwlqYwlkb25lX2FwbV9iaW9zCisKKwkvKiBjaGVjayBmb3IgIlBNIiBzaWduYXR1cmUgKi8KKwljbXB3CSQweDUwNGQsICVieAorCS8qIG5vIHNpZ25hdHVyZSAtPiBzaG91bGQgbm90IGhhcHBlbiwgdGlkeSB1cCAqLworCWpuZQlkb25lX2FwbV9iaW9zCisKKwkvKiByZWNvcmQgdGhlIEFQTSBCSU9TIHZlcnNpb24gKi8KKwltb3Z3CSVheCwgQUJTKEVYVF9DKGFwbV9iaW9zX2luZm8pKQorCS8qIGFuZCBmbGFncyAqLworCW1vdncJJWN4LCBBQlMoRVhUX0MoYXBtX2Jpb3NfaW5mbykpICsgMTIKKwlqbXAJZG9uZV9hcG1fYmlvcworCitub18zMl9hcG1fYmlvczoKKwkvKiByZW1vdmUgMzIgYml0IHN1cHBvcnQgYml0ICovCisJYW5kdyAgICAgJDB4ZmZmZCwgQUJTKEVYVF9DKGFwbV9iaW9zX2luZm8pKSArIDEyCisKK2RvbmVfYXBtX2Jpb3M6CisJLyogU29tZSBwYXJhbm9pYSBoZXJlOiBBbHdheXMgRGlzY29ubmVjdCBmcm9tIEFQTSAqLworCW1vdncJJDB4NTMwNCwgJWF4CisJeG9ydwklYngsICVieAorCS8qIGlnbm9yZSByZXR1cm4gY29kZSAqLworCWludCAgICAgJDB4MTUKKworCURBVEEzMgljYWxsCUVYVF9DKHJlYWxfdG9fcHJvdCkKKwkuY29kZTMyCisKKwlwb3BsCSVlc2kKKwlwb3BsCSVlZGkKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwlyZXQKZGlmZiAtLWdpdCBhL3N0YWdlMi9hc20uUyBiL3N0YWdlMi9hc20uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGI2ZTdkCi0tLSAvZGV2L251bGwKKysrIGIvc3RhZ2UyL2FzbS5TCkBAIC0wLDAgKzEsMjM2NyBAQAorLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSwyMDAyLDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisKKy8qCisgKiBOb3RlOiBUaGVzZSBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGlzIGZpbGUgbWF5IGJlIGNhbGxlZCBmcm9tIEMuCisgKiAgICAgICBCZSBjYXJlZnVsIG9mIHRoYXQgeW91IG11c3Qgbm90IG1vZGlmeSBzb21lIHJlZ2lzdGVycy4gUXVvdGUKKyAqICAgICAgIGZyb20gZ2NjLTIuOTUuMi9nY2MvY29uZmlnL2kzODYvaTM4Ni5oOgorCQorICAgMSBmb3IgcmVnaXN0ZXJzIG5vdCBhdmFpbGFibGUgYWNyb3NzIGZ1bmN0aW9uIGNhbGxzLgorICAgVGhlc2UgbXVzdCBpbmNsdWRlIHRoZSBGSVhFRF9SRUdJU1RFUlMgYW5kIGFsc28gYW55CisgICByZWdpc3RlcnMgdGhhdCBjYW4gYmUgdXNlZCB3aXRob3V0IGJlaW5nIHNhdmVkLgorICAgVGhlIGxhdHRlciBtdXN0IGluY2x1ZGUgdGhlIHJlZ2lzdGVycyB3aGVyZSB2YWx1ZXMgYXJlIHJldHVybmVkCisgICBhbmQgdGhlIHJlZ2lzdGVyIHdoZXJlIHN0cnVjdHVyZS12YWx1ZSBhZGRyZXNzZXMgYXJlIHBhc3NlZC4KKyAgIEFzaWRlIGZyb20gdGhhdCwgeW91IGNhbiBpbmNsdWRlIGFzIG1hbnkgb3RoZXIgcmVnaXN0ZXJzIGFzIHlvdSBsaWtlLgorCisgIGF4LGR4LGN4LGJ4LHNpLGRpLGJwLHNwLHN0LHN0MSxzdDIsc3QzLHN0NCxzdDUsc3Q2LHN0NyxhcmcKK3sgIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSB9CisgKi8KKworI2RlZmluZSBBU01fRklMRQorCisjaW5jbHVkZSAic2hhcmVkLmgiCisKKyNpZmRlZiBTVEFHRTFfNQorIyBkZWZpbmUJQUJTKHgpCSgoeCkgLSBFWFRfQyhtYWluKSArIDB4MjIwMCkKKyNlbHNlCisjIGRlZmluZQlBQlMoeCkJKCh4KSAtIEVYVF9DKG1haW4pICsgMHg4MjAwKQorI2VuZGlmCisJCisJLmZpbGUJImFzbS5TIgorCisJLnRleHQKKworCS8qIFRlbGwgR0FTIHRvIGdlbmVyYXRlIDE2LWJpdCBpbnN0cnVjdGlvbnMgc28gdGhhdCB0aGlzIGNvZGUgd29ya3MKKwkgICBpbiByZWFsIG1vZGUuICovCisJLmNvZGUxNgorCisjaWZuZGVmIFNUQUdFMV81CisJLyogCisJICogSW4gc3RhZ2UyLCBkbyBub3QgbGluayBzdGFydC5TIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHNvdXJjZQorCSAqIGZpbGVzIGRpcmVjdGx5LCBzbyBkZWZpbmUgdGhlIHN0YXJ0IHN5bWJvbHMgaGVyZSBqdXN0IHRvCisJICogZm9yY2UgbGQgcXVpZXQuIFRoZXNlIGFyZSBub3QgcmVmZXJyZWQgYW55d2F5LgorCSAqLworCS5nbG9ibAlzdGFydCwgX3N0YXJ0CitzdGFydDoKK19zdGFydDoKKyNlbmRpZiAvKiAhIFNUQUdFMV81ICovCisJCitFTlRSWShtYWluKQorCS8qCisJICogIEd1YXJhbnRlZSB0aGF0ICJtYWluIiBpcyBsb2FkZWQgYXQgMHgwOjB4ODIwMCBpbiBzdGFnZTIgYW5kCisJICogIGF0IDB4MDoweDIyMDAgaW4gc3RhZ2UxLjUuCisJICovCisJbGptcCAkMCwgJEFCUyhjb2Rlc3RhcnQpCisKKwkvKgorCSAqICBDb21wYXRpYmlsaXR5IHZlcnNpb24gbnVtYmVyCisJICoKKwkgKiAgVGhlc2UgTVVTVCBiZSBhdCBieXRlIG9mZnNldCA2IGFuZCA3IG9mIHRoZSBleGVjdXRhYmxlCisJICogIERPIE5PVCBNT1ZFICEhIQorCSAqLworCS4gPSBFWFRfQyhtYWluKSArIDB4NgorCS5ieXRlCUNPTVBBVF9WRVJTSU9OX01BSk9SLCBDT01QQVRfVkVSU0lPTl9NSU5PUgorCisJLyoKKwkgKiAgVGhpcyBpcyBhIHNwZWNpYWwgZGF0YSBhcmVhIDggYnl0ZXMgZnJvbSB0aGUgYmVnaW5uaW5nLgorCSAqLworCisJLiA9IEVYVF9DKG1haW4pICsgMHg4CisKK1ZBUklBQkxFKGluc3RhbGxfcGFydGl0aW9uKQorCS5sb25nCTB4RkZGRkZGCisvKiBUaGlzIHZhcmlhYmxlIGlzIGhlcmUgb25seSBiZWNhdXNlIG9mIGEgaGlzdG9yaWNhbCByZWFzb24uICAqLworVkFSSUFCTEUoc2F2ZWRfZW50cnlubykKKwkubG9uZwkwCitWQVJJQUJMRShzdGFnZTJfaWQpCisJLmJ5dGUJU1RBR0UyX0lECitWQVJJQUJMRShmb3JjZV9sYmEpCisJLmJ5dGUJMAorVkFSSUFCTEUodmVyc2lvbl9zdHJpbmcpCisJLnN0cmluZyBWRVJTSU9OCitWQVJJQUJMRShjb25maWdfZmlsZSkKKyNpZm5kZWYgU1RBR0UxXzUKKwkuc3RyaW5nICIvYm9vdC9ncnViL21lbnUubHN0IgorI2Vsc2UgICAvKiBTVEFHRTFfNSAqLworCS5sb25nCTB4ZmZmZmZmZmYKKwkuc3RyaW5nICIvYm9vdC9ncnViL3N0YWdlMiIKKyNlbmRpZiAgLyogU1RBR0UxXzUgKi8KKworCS8qCisJICogIExlYXZlIHNvbWUgYnJlYXRoaW5nIHJvb20gZm9yIHRoZSBjb25maWcgZmlsZSBuYW1lLgorCSAqLworCisJLiA9IEVYVF9DKG1haW4pICsgMHg3MAorCisvKiB0aGUgcmVhbCBtb2RlIGNvZGUgY29udGludWVzLi4uICovCitjb2Rlc3RhcnQ6CisJY2xpCQkvKiB3ZSdyZSBub3Qgc2FmZSBoZXJlISAqLworCisJLyogc2V0IHVwICVkcywgJXNzLCBhbmQgJWVzICovCisJeG9ydwklYXgsICVheAorCW1vdncJJWF4LCAlZHMKKwltb3Z3CSVheCwgJXNzCisJbW92dwklYXgsICVlcworCisjaWZuZGVmIFNVUFBPUlRfRElTS0xFU1MKKwkvKgorCSAqIFNhdmUgdGhlIHNlY3RvciBudW1iZXIgb2YgdGhlIHNlY29uZCBzZWN0b3IgKGkuZS4gdGhpcyBzZWN0b3IpCisJICogaW4gSU5TVEFMTF9TRUNPTkRfU0VDVE9SLiBTZWUgYWxzbyAic3RhZ2UyL3N0YXJ0LlMiLgorCSAqLworCUFERFIzMgltb3ZsCSVlYnAsIEVYVF9DKGluc3RhbGxfc2Vjb25kX3NlY3RvcikKKyNlbmRpZgorCQorCS8qIHNldCB1cCB0aGUgcmVhbCBtb2RlL0JJT1Mgc3RhY2sgKi8KKwltb3ZsCSRTVEFDS09GRiwgJWVicAorCW1vdmwJJWVicCwgJWVzcAorCisJc3RpCQkvKiB3ZSdyZSBzYWZlIGFnYWluICovCisKKyNpZm5kZWYgU1VQUE9SVF9ESVNLTEVTUworCS8qIHNhdmUgYm9vdCBkcml2ZSByZWZlcmVuY2UgKi8KKwlBRERSMzIJbW92YgklZGwsIEVYVF9DKGJvb3RfZHJpdmUpCisKKwkvKiByZXNldCBkaXNrIHN5c3RlbSAoJWFoID0gMCkgKi8KKwlpbnQJJDB4MTMKKyNlbmRpZgorCisJLyogdHJhbnNpdGlvbiB0byBwcm90ZWN0ZWQgbW9kZSAqLworCURBVEEzMgljYWxsIEVYVF9DKHJlYWxfdG9fcHJvdCkKKworCS8qIFRoZSAiLmNvZGUzMiIgZGlyZWN0aXZlIHRha2VzIEdBUyBvdXQgb2YgMTYtYml0IG1vZGUuICovCisJLmNvZGUzMgorCisJLyogY2xlYW4gb3V0IHRoZSBic3MgKi8KKworCS8qIHNldCAlZWRpIHRvIHRoZSBic3Mgc3RhcnRpbmcgYWRkcmVzcyAqLworI2lmIGRlZmluZWQoSEFWRV9VU0NPUkVfVVNDT1JFX0JTU19TVEFSVF9TWU1CT0wpCisJbW92bAkkX19ic3Nfc3RhcnQsICVlZGkKKyNlbGlmIGRlZmluZWQoSEFWRV9VU0NPUkVfRURBVEFfU1lNQk9MKQorCW1vdmwJJF9lZGF0YSwgJWVkaQorI2VsaWYgZGVmaW5lZChIQVZFX0VEQVRBX1NZTUJPTCkKKwltb3ZsCSRlZGF0YSwgJWVkaQorI2VuZGlmCisKKwkvKiBzZXQgJWVjeCB0byB0aGUgYnNzIGVuZCAqLwkKKyNpZiBkZWZpbmVkKEhBVkVfRU5EX1NZTUJPTCkKKwltb3ZsCSRlbmQsICVlY3gKKyNlbGlmIGRlZmluZWQoSEFWRV9VU0NPUkVfRU5EX1NZTUJPTCkKKwltb3ZsCSRfZW5kLCAlZWN4CisjZW5kaWYKKworCS8qIGNvbXB1dGUgdGhlIGJzcyBsZW5ndGggKi8KKwlzdWJsCSVlZGksICVlY3gKKwkKKwkvKiB6ZXJvICVhbCAqLworCXhvcmIJJWFsLCAlYWwKKworCS8qIHNldCB0aGUgZGlyZWN0aW9uICovCisJY2xkCisJCisJLyogY2xlYW4gb3V0ICovCisJcmVwCisJc3Rvc2IKKwkKKwkvKgorCSAqICBDYWxsIHRoZSBzdGFydCBvZiBtYWluIGJvZHkgb2YgQyBjb2RlLCB3aGljaCBkb2VzIHNvbWUKKwkgKiAgb2YgaXQncyBvd24gaW5pdGlhbGl6YXRpb24gYmVmb3JlIHRyYW5zZmVycmluZyB0byAiY21haW4iLgorCSAqLworCWNhbGwgRVhUX0MoaW5pdF9iaW9zX2luZm8pCisKKworLyoKKyAqICBUaGlzIGNhbGwgaXMgc3BlY2lhbC4uLiAgaXQgbmV2ZXIgcmV0dXJucy4uLiAgaW4gZmFjdCBpdCBzaG91bGQgc2ltcGx5CisgKiAgaGFuZyBhdCB0aGlzIHBvaW50IQorICovCisKK0VOVFJZKHN0b3ApCisJY2FsbAlFWFRfQyhwcm90X3RvX3JlYWwpCisKKwkvKgorCSAqIFRoaXMgbmV4dCBwYXJ0IGlzIHNvcnQgb2YgZXZpbC4gIEl0IHRha2VzIGFkdmFudGFnZSBvZiB0aGUKKwkgKiBieXRlIG9yZGVyaW5nIG9uIHRoZSB4ODYgdG8gd29yayBpbiBlaXRoZXIgMTYtYml0IG9yIDMyLWJpdAorCSAqIG1vZGUsIHNvIHRoaW5rIGFib3V0IGl0IGJlZm9yZSBjaGFuZ2luZyBpdC4KKwkgKi8KKworRU5UUlkoaGFyZF9zdG9wKQorCWhsdAorCWptcCBFWFRfQyhoYXJkX3N0b3ApCisKKyNpZm5kZWYgU1RBR0UxXzUKKy8qCisgKiBzdG9wX2Zsb3BweSgpCisgKgorICogU3RvcHMgdGhlIGZsb3BweSBkcml2ZSBmcm9tIHNwaW5uaW5nLCBzbyB0aGF0IG90aGVyIHNvZnR3YXJlIGlzCisgKiBqdW1wZWQgdG8gd2l0aCBhIGtub3duIHN0YXRlLgorICovCitFTlRSWShzdG9wX2Zsb3BweSkKKwlwdXNoYQorCWNhbGwJRVhUX0MocHJvdF90b19yZWFsKQorCS5jb2RlMTYKKwl4b3JiCSVkbCwgJWRsCisJaW50CSQweDEzCisJREFUQTMyICBjYWxsIEVYVF9DKHJlYWxfdG9fcHJvdCkKKwkuY29kZTMyCisJcG9wYQorCXJldAorCisvKgorICogZ3J1Yl9yZWJvb3QoKQorICoKKyAqIFJlYm9vdCB0aGUgc3lzdGVtLiBBdCB0aGUgbW9tZW50LCByZWx5IG9uIEJJT1MuCisgKi8KK0VOVFJZKGdydWJfcmVib290KQorCWNhbGwJRVhUX0MocHJvdF90b19yZWFsKQorCS5jb2RlMTYKKwkvKiBjb2xkIGJvb3QgKi8KKwltb3Z3CSQweDA0NzIsICVkaQorCW1vdncJJWF4LCAoJWRpKQorCWxqbXAJJDB4RkZGRiwgJDB4MDAwMAorCS5jb2RlMzIKKwkKKy8qCisgKiBncnViX2hhbHQoaW50IG5vX2FwbSkKKyAqCisgKiBIYWx0IHRoZSBzeXN0ZW0sIHVzaW5nIEFQTSBpZiBwb3NzaWJsZS4gSWYgTk9fQVBNIGlzIHRydWUsIGRvbid0IHVzZQorICogQVBNIGV2ZW4gaWYgaXQgaXMgYXZhaWxhYmxlLgorICovCitFTlRSWShncnViX2hhbHQpCisJLyogZ2V0IHRoZSBhcmd1bWVudCAqLworCW1vdmwJNCglZXNwKSwgJWVheAorCQorCS8qIHNlZSBpZiB6ZXJvICovCisJdGVzdGwJJWVheCwgJWVheAorCWpueglFWFRfQyhzdG9wKQorCisJY2FsbAlFWFRfQyhwcm90X3RvX3JlYWwpCisJLmNvZGUxNgorCQorCS8qIGRldGVjdCBBUE0gKi8KKwltb3Z3CSQweDUzMDAsICVheAorCXhvcncJJWJ4LCAlYngKKwlpbnQJJDB4MTUKKwlqYwlFWFRfQyhoYXJkX3N0b3ApCisJLyogZG9uJ3QgY2hlY2sgJWJ4IGZvciBidWdneSBCSU9TZXMuLi4gKi8KKworCS8qIGRpc2Nvbm5lY3QgQVBNIGZpcnN0ICovCisJbW92dwkkMHg1MzA0LCAlYXgKKwl4b3J3CSVieCwgJWJ4CisJaW50CSQweDE1CisKKwkvKiBjb25uZWN0IEFQTSAqLworCW1vdncJJDB4NTMwMSwgJWF4CisJeG9ydwklYngsICVieAorCWludAkkMHgxNQorCWpjCUVYVF9DKGhhcmRfc3RvcCkKKworCS8qIHNldCBBUE0gcHJvdG9jb2wgbGV2ZWwgLSAxLjEgb3IgYnVzdC4gKHRoaXMgY292ZXJzIEFQTSAxLjIgYWxzbykgKi8KKwltb3Z3CSQweDUzMEUsICVheAorCXhvcncJJWJ4LCAlYngKKwltb3Z3CSQweDAxMDEsICVjeAorCWludAkkMHgxNQorCWpjCUVYVF9DKGhhcmRfc3RvcCkKKwkKKwkvKiBzZXQgdGhlIHBvd2VyIHN0YXRlIHRvIG9mZiAqLworCW1vdncJJDB4NTMwNywgJWF4CisJbW92dwkkMSwgJWJ4CisJbW92dwkkMywgJWN4CisJaW50CSQweDE1CisKKwkvKiBzaG91bGRuJ3QgcmVhY2ggaGVyZSAqLworCWptcAlFWFRfQyhoYXJkX3N0b3ApCisJLmNvZGUzMgorCQorLyoKKyAqIHRyYWNrX2ludDEzKGludCBkcml2ZSkKKyAqCisgKiBUcmFjayB0aGUgaW50MTMgaGFuZGxlciB0byBwcm9iZSBJL08gYWRkcmVzcyBzcGFjZS4KKyAqLworRU5UUlkodHJhY2tfaW50MTMpCisJcHVzaGwJJWVicAorCW1vdmwJJWVzcCwgJWVicAorCisJcHVzaGwJJWVieAorCXB1c2hsCSVlZGkKKworCS8qIGNvcHkgdGhlIG9yaWdpbmFsIGludDEzIGhhbmRsZXIgc2VnbWVudDpvZmZzZXQgKi8KKwltb3ZsCSQweDRjLCAlZWRpCisJbW92bAkoJWVkaSksICVlYXgKKwltb3ZsCSVlYXgsIHRyYWNrX2ludDEzX2FkZHIKKwkJCisJLyogcmVwbGFjZSB0aGUgaW50MSBoYW5kbGVyICovCisJbW92bAkkMHg0LCAlZWRpCisJcHVzaGwJKCVlZGkpCisJbW92bAkkQUJTKGludDFfaGFuZGxlciksICVlYXgKKwltb3ZsCSVlYXgsICglZWRpKQorCisJLyogcmVhZCB0aGUgTUJSIHRvIGNhbGwgaW50MTMgc3VjY2Vzc2Z1bGx5ICovCisJbW92Ygk4KCVlYnApLCAlZGwKKwkKKwljYWxsCUVYVF9DKHByb3RfdG9fcmVhbCkKKwkuY29kZTE2CisKKwltb3Z3CSRTQ1JBVENIU0VHLCAlYXgKKwltb3Z3CSVheCwgJWVzCisJeG9ydwklYngsICVieAorCW1vdncJJDEsICVjeAorCXhvcmIJJWRoLCAlZGgKKworCS8qIHNhdmUgRkxBR1Mgb24gdGhlIHN0YWNrIHRvIGVtdWxhdGUgaW50MTMgKi8KKwlwdXNoZncKKwkKKwkvKiBzZXQgdGhlIFRGIGZsYWcgKi8KKwkvKiBGSVhNRTogdGhpcyBjYW4gYmUgc2ltcGxpZmllZCBub3QgdG8gdXNlIEFYICovCisJcHVzaGZ3CisJcG9wdwklYXgKKwlvcncJJDB4MTAwLCAlYXgKKwlwdXNodwklYXgKKwlwb3BmdworCisJbW92dwkkMHgwMjAxLCAlYXgKKworCS5ieXRlCTB4OWEJCS8qIGxjYWxsICovCit0cmFja19pbnQxM19hZGRyOgorCS53b3JkCTAJCS8qIG9mZnNldCAqLworCS53b3JkCTAJCS8qIHNlZ21lbnQgKi8KKworCS8qIFRGIGlzIGNsZWFyZWQgaGVyZSBhdXRvbWF0aWNhbGx5ICovCisJCisJREFUQTMyCWNhbGwJRVhUX0MocmVhbF90b19wcm90KQorCS5jb2RlMzIKKworCS8qIHJlc3RvcmUgdGhlIGludDEgaGFuZGxlciAqLworCW1vdmwJJDB4NCwgJWVkaQorCXBvcGwJKCVlZGkpCisKKwlwb3BsCSVlZGkKKwlwb3BsCSVlYngKKwlwb3BsCSVlYnAKKwkKKwlyZXQKKworCisvKgorICogQ2hlY2sgaWYgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaXMgSS9PLCBhbmQgaWYgdGhpcyBpcyB0cnVlLCBhZGQgdGhlCisgKiBwb3J0IGludG8gdGhlIGlvIG1hcC4KKyAqCisgKiBOb3RlOiBQcm9iYWJseSB0aGlzIHdpbGwgbWFrZSB0aGUgZXhlY3V0aW9uIG9mIGludDEzIHZlcnkgc2xvdy4KKyAqCisgKiBOb3RlMjogSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgYWxsIHdlIGNhbiBrbm93IGlzIEkvTy1tYXBwZWQgSS9PLiBJdAorICogaXMgaW1wb3NzaWJsZSB0byBkZXRlY3QgbWVtb3J5LW1hcHBlZCBJL08uCisgKi8KK2ludDFfaGFuZGxlcjoKKwkuY29kZTE2CisJCisJcHVzaHcJJWJwCisJbW92dwklc3AsICVicAorCXB1c2h3CSVkcworCXB1c2h3CSVheAorCXB1c2h3CSVzaQorCXB1c2h3CSVkeAorCQorCS8qIElQICovCisJbW92dwkyKCVicCksICVzaQorCS8qIENTICovCisJbW92dwk0KCVicCksICVheAorCW1vdncJJWF4LCAlZHMKKworCS8qIGV4YW1pbmUgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gKi8KKzE6CWxvZHNiCSglc2kpLCAlYWwKKwkvKiBza2lwIHRoaXMgY29kZSBpZiBpdCBpcyBhIHByZWZpeCAqLworCWNtcGIJJDB4MkUsICVhbAorCWplCTFiCisJY21wYgkkMHgzNiwgJWFsCisJamUJMWIKKwljbXBiCSQweDNFLCAlYWwKKwlqZQkxYgorCWNtcGIJJDB4MjYsICVhbAorCWplCTFiCisJY21wYgkkMHg2NCwgJWFsCisJamwJMmYKKwljbXBiCSQweDY3LCAlYWwKKwlqbGUJMWIKKzI6CWNtcGIJJDB4RjAsICVhbAorCWpsCTNmCisJY21wYgkkMHhGMywgJWFsCisJamxlCTFiCisJCiszOgkvKiBjaGVjayBpZiB0aGlzIGNvZGUgaXMgb3V0KiBvciBpbiogKi8KKworCS8qIGlucz8gb3Igb3V0cz8gKi8KKwljbXBiCSQweDZDLCAlYWwKKwlqbAk0ZgorCWNtcGIJJDB4NkYsICVhbAorCWpsZQk1ZgorCis0OgkvKiBpbj8gb3Igb3V0PyAocmVnaXN0ZXIgb3BlcmFuZCB2ZXJzaW9uKSAqLworCWNtcGIJJDB4RUMsICVhbAorCWpsCTZmCisJY21wYgkkMHhFRiwgJWFsCisJamxlCTVmCisJCis2OgkvKiBpbj8gb3Igb3V0PyAoaW1tZWRpYXRlIG9wZXJhbmQgdmVyc2lvbikgKi8KKwljbXBiCSQweEU0LCAlYWwKKwlqbAk4ZgorCWNtcGIJJDB4RTcsICVhbAorCWpnCThmCisKKzc6CS8qIGltbWVkaWF0ZSBoYXMgYSBwb3J0ICovCisJbG9kc2IJKCVzaSksICVhbAorCW1vdnpidwklYWwsICVkeAorCQorNToJLyogJWR4IGhhcyBhIHBvcnQgKi8KKworCS8qIHNldCAlZHMgdG8gemVybyAqLworCXhvcncJJWF4LCAlYXgKKwltb3Z3CSVheCwgJWRzCisJCQorCS8qIHNldCAlc2kgdG8gdGhlIGlvIG1hcCAqLworCW1vdncJJEFCUyhFWFRfQyhpb19tYXApKSwgJXNpCisKKwkJCis5OgkvKiBjaGVjayBpZiB0aGUgaW8gbWFwIGFscmVhZHkgaGFzIHRoZSBwb3J0ICovCisJbG9kc3cJKCVzaSksICVheAorCS8qIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGVuZCAqLworCXRlc3R3CSVheCwgJWF4CisJanoJMWYKKwkvKiBjaGVjayBpZiB0aGlzIG1hdGNoZXMgdGhlIHBvcnQgKi8KKwljbXB3CSVheCwgJWR4CisJam5lCTliCisJLyogaWYgc28sIGxlYXZlIGZyb20gdGhpcyBoYW5kbGVyICovCisJam1wCThmCisJCisxOgkvKiBjaGVjayBmb3IgdGhlIGJ1ZmZlciBvdmVycnVuICovCisJY21wdwkkKEFCUyhFWFRfQyhpb19tYXApKSArIChJT19NQVBfU0laRSArIDEpICogMiksICVzaQorCWplCThmCisJLyogYWRkIHRoZSBwb3J0IGludG8gdGhlIGlvIG1hcCAqLworCW1vdncJJWR4LCAtMiglc2kpCisKKzg6CS8qIHJlc3RvcmUgcmVnaXN0ZXJzICovCQorCXBvcHcJJWR4CisJcG9wdwklc2kKKwlwb3B3CSVheAorCXBvcHcJJWRzCisJcG9wdwklYnAKKworCWlyZXQKKwkKKwkuY29kZTMyCisKK0VOVFJZKGlvX21hcCkKKwkuc3BhY2UJKElPX01BUF9TSVpFICsgMSkgKiAyCisJCisJCisvKgorICogc2V0X2ludDE1X2hhbmRsZXIodm9pZCkKKyAqCisgKiBTZXQgdXAgaW50MTVfaGFuZGxlci4KKyAqLworRU5UUlkoc2V0X2ludDE1X2hhbmRsZXIpCisJcHVzaGwJJWVkaQorCQorCS8qIHNhdmUgdGhlIG9yaWdpbmFsIGludDE1IGhhbmRsZXIgKi8KKwltb3ZsCSQweDU0LCAlZWRpCisJbW92dwkoJWVkaSksICVheAorCW1vdncJJWF4LCBBQlMoaW50MTVfb2Zmc2V0KQorCW1vdncJMiglZWRpKSwgJWF4CisJbW92dwklYXgsIEFCUyhpbnQxNV9zZWdtZW50KQorCisJLyogc2F2ZSB0aGUgbmV3IGludDE1IGhhbmRsZXIgKi8KKwltb3Z3CSRBQlMoaW50MTVfaGFuZGxlciksICVheAorCW1vdncJJWF4LCAoJWVkaSkKKwl4b3J3CSVheCwgJWF4CisJbW92dwklYXgsIDIoJWVkaSkKKworCXBvcGwJJWVkaQorCXJldAorCisKKy8qCisgKiB1bnNldF9pbnQxNV9oYW5kbGVyKHZvaWQpCisgKgorICogUmVzdG9yZSB0aGUgb3JpZ2luYWwgaW50MTUgaGFuZGxlcgorICovCitFTlRSWSh1bnNldF9pbnQxNV9oYW5kbGVyKQorCXB1c2hsCSVlZGkKKwkKKwkvKiBjaGVjayBpZiBpbnQxNV9oYW5kbGVyIGlzIHNldCAqLworCW1vdmwJJDB4NTQsICVlZGkKKwltb3Z3CSRBQlMoaW50MTVfaGFuZGxlciksICVheAorCWNtcHcJJWF4LCAoJWVkaSkKKwlqbmUJMWYKKwl4b3J3CSVheCwgJWF4CisJY21wdwklYXgsIDIoJWVkaSkKKwlqbmUJMWYKKworCS8qIHJlc3RvcmUgdGhlIG9yaWdpbmFsICovCisJbW92dwlBQlMoaW50MTVfb2Zmc2V0KSwgJWF4CisJbW92dwklYXgsICglZWRpKQorCW1vdncJQUJTKGludDE1X3NlZ21lbnQpLCAlYXgKKwltb3Z3CSVheCwgMiglZWRpKQorCisxOgorCXBvcGwJJWVkaQorCXJldAorCisKKy8qCisgKiBUcmFuc2xhdGUgYSBrZXkgY29kZSB0byBhbm90aGVyLgorICoKKyAqIE5vdGU6IFRoaXMgaW1wbGVtZW50YXRpb24gY2Fubm90IGhhbmRsZSBtb3JlIHRoYW4gb25lIGxlbmd0aAorICogc2NhbmNvZGVzIChzdWNoIGFzIFJpZ2h0IEN0cmwpLgorICovCisJLmNvZGUxNgoraW50MTVfaGFuZGxlcjoKKwkvKiBpZiBub24tY2FycmllciwgaWdub3JlIGl0ICovCisJam5jCTFmCisJLyogY2hlY2sgaWYgQUg9NEYgKi8KKwljbXBiCSQweDRGLCAlYWgKKwlqbmUJMWYKKworCS8qIEUwIGFuZCBFMSBhcmUgc3BlY2lhbCAqLworCWNtcGIJJDB4RTEsICVhbAorCWplCTRmCisJY21wYgkkMHhFMCwgJWFsCisJLyogdGhpcyBmbGFnIGlzIGFjdHVhbGx5IHRoZSBtYWNoaW5lIGNvZGUgKGplIG9yIGptcCkgKi8KK2ludDE1X3NraXBfZmxhZzoJCisJamUJNGYKKwkKKwlwdXNodwklYnAKKwltb3Z3CSVzcCwgJWJwCisJCisJcHVzaHcJJWJ4CisJcHVzaHcJJWR4CisJcHVzaHcJJWRzCisJcHVzaHcJJXNpCisKKwkvKiBzYXZlIGJpdHMgMC02IG9mICVhbCBpbiAlZGwgKi8KKwltb3Z3CSVheCwgJWR4CisJYW5kYgkkMHg3ZiwgJWRsCisJLyogc2F2ZSB0aGUgaGlnaGVzdCBiaXQgaW4gJWJsICovCisJbW92YgklYWwsICVibAorCXhvcmIJJWRsLCAlYmwKKwkvKiBzZXQgJWRzIHRvIDAgKi8KKwl4b3J3CSVheCwgJWF4CisJbW92dwklYXgsICVkcworCS8qIHNldCAlc2kgdG8gdGhlIGtleSBtYXAgKi8KKwltb3Z3CSRBQlMoRVhUX0MoYmlvc19rZXlfbWFwKSksICVzaQorCisJLyogZmluZCB0aGUga2V5IGNvZGUgZnJvbSB0aGUga2V5IG1hcCAqLworMjoKKwlsb2RzdworCS8qIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGVuZCAqLworCXRlc3R3CSVheCwgJWF4CisJanoJM2YKKwkvKiBjaGVjayBpZiB0aGlzIG1hdGNoZXMgdGhlIGtleSBjb2RlICovCisJY21wYgklYWwsICVkbAorCWpuZQkyYgorCS8qIGlmIHNvLCBwZXJmb3JtIHRoZSBtYXBwaW5nICovCisJbW92YgklYWgsICVkbAorMzoKKwkvKiByZXN0b3JlICVheCAqLworCW1vdncJJWR4LCAlYXgKKwlvcmIJJWJsLCAlYWwKKwkvKiBtYWtlIHN1cmUgdGhhdCBDRiBpcyBzZXQgKi8KKwlvcncJJDEsIDYoJWJwKQorCS8qIHJlc3RvcmUgb3RoZXIgcmVnaXN0ZXJzICovCisJcG9wdwklc2kKKwlwb3B3CSVkcworCXBvcHcJJWR4CisJcG9wdwklYngKKwlwb3B3CSVicAorCWlyZXQKKwkKKzQ6CisJLyogdHJpY2t5OiBqbXAgKDB4NzQpIDwtPiBqZSAoMHhlYikgKi8KKwl4b3JiCSQoMHg3NCBeIDB4ZWIpLCBBQlMoaW50MTVfc2tpcF9mbGFnKQorMToKKwkvKiBqdXN0IGNhc2NhZGUgdG8gdGhlIG9yaWdpbmFsICovCisJLyogbGptcCAqLworCS5ieXRlCTB4ZWEKK2ludDE1X29mZnNldDoJLndvcmQJMAoraW50MTVfc2VnbWVudDoJLndvcmQJMAorCisJLmNvZGUzMgorCisJLmFsaWduCTQJCitFTlRSWShiaW9zX2tleV9tYXApCisJLnNwYWNlCShLRVlfTUFQX1NJWkUgKyAxKSAqIDIKKwkKKwkKKy8qCisgKiBzZXRfaW50MTNfaGFuZGxlcihtYXApCisgKgorICogQ29weSBNQVAgdG8gdGhlIGRyaXZlIG1hcCBhbmQgc2V0IHVwIGludDEzX2hhbmRsZXIuCisgKi8KK0VOVFJZKHNldF9pbnQxM19oYW5kbGVyKQorCXB1c2hsCSVlYnAKKwltb3ZsCSVlc3AsICVlYnAKKworCXB1c2hsCSVlZGkKKwlwdXNobAklZXNpCisKKwkvKiBjb3B5IE1BUCB0byB0aGUgZHJpdmUgbWFwICovCisJbW92bAkkKERSSVZFX01BUF9TSVpFICogMiksICVlY3gKKwltb3ZsCSRBQlMoZHJpdmVfbWFwKSwgJWVkaQorCW1vdmwJOCglZWJwKSwgJWVzaQorCWNsZAorCXJlcAorCW1vdnNiCisKKwkvKiBzYXZlIHRoZSBvcmlnaW5hbCBpbnQxMyBoYW5kbGVyICovCisJbW92bAkkMHg0YywgJWVkaQorCW1vdncJKCVlZGkpLCAlYXgKKwltb3Z3CSVheCwgQUJTKGludDEzX29mZnNldCkKKwltb3Z3CTIoJWVkaSksICVheAorCW1vdncJJWF4LCBBQlMoaW50MTNfc2VnbWVudCkKKwkKKwkvKiBkZWNyZWFzZSB0aGUgbG93ZXIgbWVtb3J5IHNpemUgYW5kIHNldCBpdCB0byB0aGUgQklPUyBtZW1vcnkgKi8KKwltb3ZsCSQweDQxMywgJWVkaQorCWRlY3cJKCVlZGkpCisJeG9ybAklZWF4LCAlZWF4CisJbW92dwkoJWVkaSksICVheAorCQorCS8qIGNvbXB1dGUgdGhlIHNlZ21lbnQgKi8KKwlzaGxsCSQ2LCAlZWF4CisKKwkvKiBzYXZlIHRoZSBuZXcgaW50MTMgaGFuZGxlciAqLworCW1vdmwJJDB4NGMsICVlZGkKKwltb3Z3CSVheCwgMiglZWRpKQorCXhvcncJJWN4LCAlY3gKKwltb3Z3CSVjeCwgKCVlZGkpCisKKwkvKiBjb3B5IGludDEzX2hhbmRsZXIgdG8gdGhlIHJlc2VydmVkIGFyZWEgKi8KKwlzaGxsCSQ0LCAlZWF4CisJbW92bAklZWF4LCAlZWRpCisJbW92bAkkQUJTKGludDEzX2hhbmRsZXIpLCAlZXNpCisJbW92bAkkKGludDEzX2hhbmRsZXJfZW5kIC0gaW50MTNfaGFuZGxlciksICVlY3gKKwlyZXAKKwltb3ZzYgorCisJcG9wbAklZXNpCisJcG9wbAklZWRpCisJcG9wbAklZWJwCisJcmV0CisKKwkKKy8qIAorICogTWFwIGEgZHJpdmUgdG8gYW5vdGhlciBkcml2ZS4KKyAqLworCQorCS5jb2RlMTYKKwkKK2ludDEzX2hhbmRsZXI6CisJcHVzaHcJJWF4CisJcHVzaHcJJWJwCisJbW92dwklc3AsICVicAorCQorCXB1c2h3CSVzaQorCisJLyogc2V0ICVzaSB0byB0aGUgZHJpdmUgbWFwICovCisJbW92dwkkKGRyaXZlX21hcCAtIGludDEzX2hhbmRsZXIpLCAlc2kKKwkvKiBmaW5kIHRoZSBkcml2ZSBudW1iZXIgZnJvbSB0aGUgZHJpdmUgbWFwICovCisJY2xkCisxOgkKKwlsb2RzdwklY3M6KCVzaSksICVheAorCS8qIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGVuZCAqLworCXRlc3R3CSVheCwgJWF4CisJanoJMmYKKwkvKiBjaGVjayBpZiB0aGlzIG1hdGNoZXMgdGhlIGRyaXZlIG51bWJlciAqLworCWNtcGIJJWFsLCAlZGwKKwlqbmUJMWIKKwkvKiBpZiBzbywgcGVyZm9ybSB0aGUgbWFwcGluZyAqLworCW1vdmIJJWFoLCAlZGwKKzI6CisJLyogcmVzdG9yZSAlc2kgKi8KKwlwb3B3CSVzaQorCS8qIHNhdmUgJWF4IGluIHRoZSBzdGFjayAqLworCXB1c2h3CSVheAorCS8qIHNpbXVsYXRlIHRoZSBpbnRlcnJ1cHQgY2FsbCAqLworCXB1c2h3CTgoJWJwKQorCS8qIHNldCAlYXggYW5kICVicCB0byB0aGUgb3JpZ2luYWwgdmFsdWVzICovCisJbW92dwkyKCVicCksICVheAorCW1vdncJKCVicCksICVicAorCS8qIGxjYWxsICovCisJLmJ5dGUJMHg5YQoraW50MTNfb2Zmc2V0Ogkud29yZAkwCitpbnQxM19zZWdtZW50Ogkud29yZAkwCisJLyogc2F2ZSBmbGFncyAqLworCXB1c2hmCisJLyogcmVzdG9yZSAlYnAgKi8KKwltb3Z3CSVzcCwgJWJwCisJLyogc2F2ZSAlYXggKi8KKwlwdXNodwklYXgKKwkvKiBzZXQgdGhlIGZsYWdzIGluIHRoZSBzdGFjayB0byB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgaW50MTMgKi8KKwltb3Z3CSglYnApLCAlYXgKKwltb3Z3CSVheCwgMHhjKCVicCkKKwkvKiBjaGVjayBpZiBzaG91bGQgbWFwIHRoZSBkcml2ZSBudW1iZXIgKi8KKwltb3Z3CTYoJWJwKSwgJWF4CisJY21wdwkkMHg4LCAlYXgKKwlqbmUJM2YKKwljbXB3CSQweDE1LCAlYXgKKwlqbmUJM2YKKwkvKiBjaGVjayBpZiB0aGUgbWFwcGluZyB3YXMgcGVyZm9ybWVkICovCisJbW92dwkyKCVicCksICVheAorCXRlc3R3CSVheCwgJWF4CisJanoJM2YKKwkvKiBwZXJmb3JtIHRoZSBtYXBwaW5nICovCisJbW92YgklYWwsICVkbAorMzoKKwlwb3B3CSVheAorCW1vdncJNCglYnApLCAlYnAKKwlhZGR3CSQ4LCAlc3AKKwlpcmV0CisKKwkuYWxpZ24JNAorZHJpdmVfbWFwOgkuc3BhY2UJKERSSVZFX01BUF9TSVpFICsgMSkgKiAyCitpbnQxM19oYW5kbGVyX2VuZDoKKwkKKwkuY29kZTMyCisJCisJCisvKgorICogY2hhaW5fc3RhZ2UxKHNlZ21lbnQsIG9mZnNldCwgcGFydF90YWJsZV9hZGRyKQorICoKKyAqICBUaGlzIHN0YXJ0cyBhbm90aGVyIHN0YWdlMSBsb2FkZXIsIGF0IHNlZ21lbnQ6b2Zmc2V0LgorICovCisKK0VOVFJZKGNoYWluX3N0YWdlMSkKKwkvKiBubyBuZWVkIHRvIHNhdmUgYW55dGhpbmcsIGp1c3QgdXNlICVlc3AgKi8KKworCS8qIHN0b3JlICVFU0ksIHByZXN1bWluZyAlRVMgaXMgMCAqLworCW1vdmwJMHhjKCVlc3ApLCAlZXNpCisKKwkvKiBzdG9yZSBuZXcgb2Zmc2V0ICovCisJbW92bAkweDgoJWVzcCksICVlYXgKKwltb3ZsCSVlYXgsIG9mZnNldAorCisJLyogc3RvcmUgbmV3IHNlZ21lbnQgKi8KKwltb3Z3CTB4NCglZXNwKSwgJWF4CisJbW92dwklYXgsIHNlZ21lbnQKKworCS8qIHNldCB1cCB0byBwYXNzIGJvb3QgZHJpdmUgKi8KKwltb3ZiCUVYVF9DKGJvb3RfZHJpdmUpLCAlZGwKKworCWNhbGwJRVhUX0MocHJvdF90b19yZWFsKQorCS5jb2RlMTYKKworI2lmZGVmIEFCU09MVVRFX1dJVEhPVVRfQVNURVJJU0sKKwlEQVRBMzIJQUREUjMyCWxqbXAJKG9mZnNldCkKKyNlbHNlCisJREFUQTMyCUFERFIzMglsam1wCSoob2Zmc2V0KQorI2VuZGlmCisJLmNvZGUzMgorI2VuZGlmIC8qIFNUQUdFMV81ICovCisKKworI2lmZGVmIFNUQUdFMV81CisvKgorICogY2hhaW5fc3RhZ2UyKHNlZ21lbnQsIG9mZnNldCwgc2Vjb25kX3NlY3RvcikKKyAqCisgKiAgVGhpcyBzdGFydHMgYW5vdGhlciBzdGFnZTIgbG9hZGVyLCBhdCBzZWdtZW50Om9mZnNldC4gIEl0IHByZXN1bWVzCisgKiAgdGhhdCB0aGUgb3RoZXIgb25lIHN0YXJ0cyB3aXRoIHRoaXMgc2FtZSAiYXNtLlMiIGZpbGUsIGFuZCBwYXNzZXMKKyAqICBwYXJhbWV0ZXJzIGJ5IHdyaXRpbmcgdGhlIGVtYmVkZGVkIGluc3RhbGwgdmFyaWFibGVzLgorICovCisKK0VOVFJZKGNoYWluX3N0YWdlMikKKwkvKiBubyBuZWVkIHRvIHNhdmUgYW55dGhpbmcsIGp1c3QgdXNlICVlc3AgKi8KKworCS8qIHN0b3JlIG5ldyBvZmZzZXQgKi8KKwltb3ZsCTB4OCglZXNwKSwgJWVheAorCW1vdmwJJWVheCwgb2Zmc2V0CisJbW92bAklZWF4LCAlZWJ4CisKKwkvKiBzdG9yZSBuZXcgc2VnbWVudCAqLworCW1vdncJMHg0KCVlc3ApLCAlYXgKKwltb3Z3CSVheCwgc2VnbWVudAorCXNobGwJJDQsICVlYXgKKworCS8qIGdlbmVyYXRlIGxpbmVhciBhZGRyZXNzICovCisJYWRkbAklZWF4LCAlZWJ4CisKKwkvKiBzZXQgdXAgdG8gcGFzcyB0aGUgcGFydGl0aW9uIHdoZXJlIHN0YWdlMiBpcyBsb2NhdGVkIGluICovCisJbW92bAlFWFRfQyhjdXJyZW50X3BhcnRpdGlvbiksICVlYXgKKwltb3ZsCSVlYXgsIChFWFRfQyhpbnN0YWxsX3BhcnRpdGlvbiktRVhUX0MobWFpbikpKCVlYngpCisKKwkvKiBzZXQgdXAgdG8gcGFzcyB0aGUgZHJpdmUgd2hlcmUgc3RhZ2UyIGlzIGxvY2F0ZWQgaW4gKi8KKwltb3ZiCUVYVF9DKGN1cnJlbnRfZHJpdmUpLCAlZGwKKworCS8qIHNldCB1cCB0byBwYXNzIHRoZSBzZWNvbmQgc2VjdG9yIG9mIHN0YWdlMiAqLworCW1vdmwJMHhjKCVlc3ApLCAlZWN4CisKKwljYWxsCUVYVF9DKHByb3RfdG9fcmVhbCkKKwkuY29kZTE2CisKKwltb3ZsCSVlY3gsICVlYnAKKworI2lmZGVmIEFCU09MVVRFX1dJVEhPVVRfQVNURVJJU0sKKwlEQVRBMzIJQUREUjMyCWxqbXAJKG9mZnNldCkKKyNlbHNlCisJREFUQTMyCUFERFIzMglsam1wCSoob2Zmc2V0KQorI2VuZGlmCisKKwkuY29kZTMyCisjZW5kaWYgLyogU1RBR0UxXzUgKi8KKwkKKy8qCisgKiAgVGhlc2UgbmV4dCB0d28gcm91dGluZXMsICJyZWFsX3RvX3Byb3QiIGFuZCAicHJvdF90b19yZWFsIiBhcmUgc3RydWN0dXJlZAorICogIGluIGEgdmVyeSBzcGVjaWZpYyB3YXkuICBCZSB2ZXJ5IGNhcmVmdWwgd2hlbiBjaGFuZ2luZyB0aGVtLgorICoKKyAqICBOT1RFOiAgVXNlIG9mIGVpdGhlciBvbmUgbWVzc2VzIHVwICVlYXggYW5kICVlYnAuCisgKi8KKworRU5UUlkocmVhbF90b19wcm90KQorCS5jb2RlMTYKKwljbGkKKworCS8qIGxvYWQgdGhlIEdEVCByZWdpc3RlciAqLworCURBVEEzMglBRERSMzIJbGdkdAlnZHRkZXNjCisKKwkvKiB0dXJuIG9uIHByb3RlY3RlZCBtb2RlICovCisJbW92bAklY3IwLCAlZWF4CisJb3JsCSRDUjBfUEVfT04sICVlYXgKKwltb3ZsCSVlYXgsICVjcjAKKworCS8qIGp1bXAgdG8gcmVsb2NhdGlvbiwgZmx1c2ggcHJlZmV0Y2ggcXVldWUsIGFuZCByZWxvYWQgJWNzICovCisJREFUQTMyCWxqbXAJJFBST1RfTU9ERV9DU0VHLCAkcHJvdGNzZWcKKworCS8qCisJICogIFRoZSAiLmNvZGUzMiIgZGlyZWN0aXZlIG9ubHkgd29ya3MgaW4gR0FTLCB0aGUgR05VIGFzc2VtYmxlciEKKwkgKiAgVGhpcyBnZXRzIG91dCBvZiAiMTYtYml0IiBtb2RlLgorCSAqLworCS5jb2RlMzIKKworcHJvdGNzZWc6CisJLyogcmVsb2FkIG90aGVyIHNlZ21lbnQgcmVnaXN0ZXJzICovCisJbW92dwkkUFJPVF9NT0RFX0RTRUcsICVheAorCW1vdncJJWF4LCAlZHMKKwltb3Z3CSVheCwgJWVzCisJbW92dwklYXgsICVmcworCW1vdncJJWF4LCAlZ3MKKwltb3Z3CSVheCwgJXNzCisKKwkvKiBwdXQgdGhlIHJldHVybiBhZGRyZXNzIGluIGEga25vd24gc2FmZSBsb2NhdGlvbiAqLworCW1vdmwJKCVlc3ApLCAlZWF4CisJbW92bAklZWF4LCBTVEFDS09GRgorCisJLyogZ2V0IHByb3RlY3RlZCBtb2RlIHN0YWNrICovCisJbW92bAlwcm90c3RhY2ssICVlYXgKKwltb3ZsCSVlYXgsICVlc3AKKwltb3ZsCSVlYXgsICVlYnAKKworCS8qIGdldCByZXR1cm4gYWRkcmVzcyBvbnRvIHRoZSByaWdodCBzdGFjayAqLworCW1vdmwJU1RBQ0tPRkYsICVlYXgKKwltb3ZsCSVlYXgsICglZXNwKQorCisJLyogemVybyAlZWF4ICovCisJeG9ybAklZWF4LCAlZWF4CisKKwkvKiByZXR1cm4gb24gdGhlIG9sZCAob3IgaW5pdGlhbGl6ZWQpIHN0YWNrISAqLworCXJldAorCisKK0VOVFJZKHByb3RfdG9fcmVhbCkKKwkvKiBqdXN0IGluIGNhc2UsIHNldCBHRFQgKi8KKwlsZ2R0CWdkdGRlc2MKKworCS8qIHNhdmUgdGhlIHByb3RlY3RlZCBtb2RlIHN0YWNrICovCisJbW92bAklZXNwLCAlZWF4CisJbW92bAklZWF4LCBwcm90c3RhY2sKKworCS8qIGdldCB0aGUgcmV0dXJuIGFkZHJlc3MgKi8KKwltb3ZsCSglZXNwKSwgJWVheAorCW1vdmwJJWVheCwgU1RBQ0tPRkYKKworCS8qIHNldCB1cCBuZXcgc3RhY2sgKi8KKwltb3ZsCSRTVEFDS09GRiwgJWVheAorCW1vdmwJJWVheCwgJWVzcAorCW1vdmwJJWVheCwgJWVicAorCisJLyogc2V0IHVwIHNlZ21lbnQgbGltaXRzICovCisJbW92dwkkUFNFVURPX1JNX0RTRUcsICVheAorCW1vdncJJWF4LCAlZHMKKwltb3Z3CSVheCwgJWVzCisJbW92dwklYXgsICVmcworCW1vdncJJWF4LCAlZ3MKKwltb3Z3CSVheCwgJXNzCisKKwkvKiB0aGlzIG1pZ2h0IGJlIGFuIGV4dHJhIHN0ZXAgKi8KKwlsam1wCSRQU0VVRE9fUk1fQ1NFRywgJHRtcGNzZWcJLyoganVtcCB0byBhIDE2IGJpdCBzZWdtZW50ICovCisKK3RtcGNzZWc6CisJLmNvZGUxNgorCisJLyogY2xlYXIgdGhlIFBFIGJpdCBvZiBDUjAgKi8KKwltb3ZsCSVjcjAsICVlYXgKKwlhbmRsIAkkQ1IwX1BFX09GRiwgJWVheAorCW1vdmwJJWVheCwgJWNyMAorCisJLyogZmx1c2ggcHJlZmV0Y2ggcXVldWUsIHJlbG9hZCAlY3MgKi8KKwlEQVRBMzIJbGptcAkkMCwgJHJlYWxjc2VnCisKK3JlYWxjc2VnOgorCS8qIHdlIGFyZSBpbiByZWFsIG1vZGUgbm93CisJICogc2V0IHVwIHRoZSByZWFsIG1vZGUgc2VnbWVudCByZWdpc3RlcnMgOiBEUywgU1MsIEVTCisJICovCisJLyogemVybyAlZWF4ICovCisJeG9ybAklZWF4LCAlZWF4CisKKwltb3Z3CSVheCwgJWRzCisJbW92dwklYXgsICVlcworCW1vdncJJWF4LCAlZnMKKwltb3Z3CSVheCwgJWdzCisJbW92dwklYXgsICVzcworCisJLyogcmVzdG9yZSBpbnRlcnJ1cHRzICovCisJc3RpCisKKwkvKiByZXR1cm4gb24gbmV3IHN0YWNrISAqLworCURBVEEzMglyZXQKKworCS5jb2RlMzIKKworCisvKgorICogICBpbnQgYmlvc2Rpc2tfaW50MTNfZXh0ZW5zaW9ucyAoaW50IGF4LCBpbnQgZHJpdmUsIHZvaWQgKmRhcCkKKyAqCisgKiAgIENhbGwgSUJNL01TIElOVDEzIEV4dGVuc2lvbnMgKGludCAxMyAlYXg9QVgpIGZvciBEUklWRS4gREFQCisgKiAgIGlzIHBhc3NlZCBmb3IgZGlzayBhZGRyZXNzIHBhY2tldC4gSWYgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm4KKyAqICAgbm9uLXplcm8sIG90aGVyd2lzZSB6ZXJvLgorICovCisKK0VOVFJZKGJpb3NkaXNrX2ludDEzX2V4dGVuc2lvbnMpCisJcHVzaGwJJWVicAorCW1vdmwJJWVzcCwgJWVicAorCisJcHVzaGwJJWVzaQorCXB1c2hsCSVlYngKKworCS8qIGNvbXB1dGUgdGhlIGFkZHJlc3Mgb2YgZGlza19hZGRyZXNzX3BhY2tldCAqLworCW1vdmwJMHgxMCglZWJwKSwgJWVheAorCW1vdncJJWF4LCAlc2kKKwl4b3J3CSVheCwgJWF4CisJc2hybAkkNCwgJWVheAorCW1vdncJJWF4LCAlY3gJLyogc2F2ZSB0aGUgc2VnbWVudCB0byBjeCAqLworCisJLyogZHJpdmUgKi8KKwltb3ZiCTB4YyglZWJwKSwgJWRsCisJLyogYXggKi8KKwltb3Z3CTB4OCglZWJwKSwgJWJ4CisJLyogZW50ZXIgcmVhbCBtb2RlICovCisJY2FsbAlFWFRfQyhwcm90X3RvX3JlYWwpCisJCisJLmNvZGUxNgorCW1vdncJJWJ4LCAlYXgKKwltb3Z3CSVjeCwgJWRzCisJaW50CSQweDEzCQkvKiBkbyB0aGUgb3BlcmF0aW9uICovCisJbW92YgklYWgsICVkbAkvKiBzYXZlIHJldHVybiB2YWx1ZSAqLworCS8qIGNsZWFyIHRoZSBkYXRhIHNlZ21lbnQgKi8KKwl4b3J3CSVheCwgJWF4CisJbW92dwklYXgsICVkcworCS8qIGJhY2sgdG8gcHJvdGVjdGVkIG1vZGUgKi8KKwlEQVRBMzIJY2FsbAlFWFRfQyhyZWFsX3RvX3Byb3QpCisJLmNvZGUzMgorCisJbW92YgklZGwsICVhbAkvKiByZXR1cm4gdmFsdWUgaW4gJWVheCAqLworCisJcG9wbAklZWJ4CisJcG9wbAklZXNpCisJcG9wbAklZWJwCisKKwlyZXQKKwkKKy8qCisgKiAgIGludCBiaW9zZGlza19zdGFuZGFyZCAoaW50IGFoLCBpbnQgZHJpdmUsIGludCBjb2ZmLCBpbnQgaG9mZiwgaW50IHNvZmYsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5zZWMsIGludCBzZWdtZW50KQorICoKKyAqICAgQ2FsbCBzdGFuZGFyZCBhbmQgb2xkIElOVDEzIChpbnQgMTMgJWFoPUFIKSBmb3IgRFJJVkUuIFJlYWQvd3JpdGUKKyAqICAgTlNFQyBzZWN0b3JzIGZyb20gQ09GRi9IT0ZGL1NPRkYgaW50byBTRUdNRU5ULiBJZiBhbiBlcnJvciBvY2N1cnMsCisgKiAgIHJldHVybiBub24temVybywgb3RoZXJ3aXNlIHplcm8uCisgKi8KKworRU5UUlkoYmlvc2Rpc2tfc3RhbmRhcmQpCisJcHVzaGwJJWVicAorCW1vdmwJJWVzcCwgJWVicAorCisJcHVzaGwJJWVieAorCXB1c2hsCSVlZGkKKwlwdXNobAklZXNpCisKKwkvKiBzZXQgdXAgQ0hTIGluZm9ybWF0aW9uICovCisJbW92bAkweDEwKCVlYnApLCAlZWF4CisJbW92YgklYWwsICVjaAorCW1vdmIJMHgxOCglZWJwKSwgJWFsCisJc2hsYgkkMiwgJWFsCisJc2hydwkkMiwgJWF4CisJbW92YgklYWwsICVjbAorCW1vdmIJMHgxNCglZWJwKSwgJWRoCisJLyogZHJpdmUgKi8KKwltb3ZiCTB4YyglZWJwKSwgJWRsCisJLyogc2VnbWVudCAqLworCW1vdncJMHgyMCglZWJwKSwgJWJ4CisJLyogc2F2ZSBuc2VjIGFuZCBhaCB0byAlZGkgKi8KKwltb3ZiCTB4OCglZWJwKSwgJWFoCisJbW92YgkweDFjKCVlYnApLCAlYWwKKwltb3Z3CSVheCwgJWRpCisJLyogZW50ZXIgcmVhbCBtb2RlICovCisJY2FsbAlFWFRfQyhwcm90X3RvX3JlYWwpCisKKwkuY29kZTE2CisJbW92dwklYngsICVlcworCXhvcncJJWJ4LCAlYngKKwltb3Z3CSQzLCAlc2kJCS8qIGF0dGVtcHQgYXQgbGVhc3QgdGhyZWUgdGltZXMgKi8KKworMToJCisJbW92dwklZGksICVheAorCWludAkkMHgxMwkJLyogZG8gdGhlIG9wZXJhdGlvbiAqLworCWpuYwkyZgkJLyogY2hlY2sgaWYgc3VjY2Vzc2Z1bCAqLworCisJbW92YgklYWgsICVibAkvKiBzYXZlIHJldHVybiB2YWx1ZSAqLworCS8qIGlmIGZhaWwsIHJlc2V0IHRoZSBkaXNrIHN5c3RlbSAqLworCXhvcncJJWF4LCAlYXgKKwlpbnQJJDB4MTMKKwkKKwlkZWN3CSVzaQorCWNtcHcJJDAsICVzaQorCWplCTJmCisJeG9yYgklYmwsICVibAorCWptcAkxYgkJLyogcmV0cnkgKi8KKzI6CQorCS8qIGJhY2sgdG8gcHJvdGVjdGVkIG1vZGUgKi8KKwlEQVRBMzIJY2FsbAlFWFRfQyhyZWFsX3RvX3Byb3QpCisJLmNvZGUzMgorCisJbW92YgklYmwsICVhbAkvKiByZXR1cm4gdmFsdWUgaW4gJWVheCAqLworCQorCXBvcGwJJWVzaQorCXBvcGwJJWVkaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCisJcmV0CisKKworLyoKKyAqICAgaW50IGNoZWNrX2ludDEzX2V4dGVuc2lvbnMgKGludCBkcml2ZSkKKyAqCisgKiAgIENoZWNrIGlmIExCQSBpcyBzdXBwb3J0ZWQgZm9yIERSSVZFLiBJZiBpdCBpcyBzdXBwb3J0ZWQsIHRoZW4gcmV0dXJuCisgKiAgIHRoZSBtYWpvciB2ZXJzaW9uIG9mIGV4dGVuc2lvbnMsIG90aGVyd2lzZSB6ZXJvLgorICovCisKK0VOVFJZKGNoZWNrX2ludDEzX2V4dGVuc2lvbnMpCisJcHVzaGwJJWVicAorCW1vdmwJJWVzcCwgJWVicAorCisJcHVzaGwJJWVieAorCisJLyogZHJpdmUgKi8KKwltb3ZiCTB4OCglZWJwKSwgJWRsCisJLyogZW50ZXIgcmVhbCBtb2RlICovCisJY2FsbAlFWFRfQyhwcm90X3RvX3JlYWwpCisKKwkuY29kZTE2CisJbW92YgkkMHg0MSwgJWFoCisJbW92dwkkMHg1NWFhLCAlYngKKwlpbnQJJDB4MTMJCS8qIGRvIHRoZSBvcGVyYXRpb24gKi8KKwkKKwkvKiBjaGVjayB0aGUgcmVzdWx0ICovCisJamMJMWYKKwljbXB3CSQweGFhNTUsICVieAorCWpuZQkxZgorCisJbW92YgklYWgsICVibAkvKiBzYXZlIHRoZSBtYWpvciB2ZXJzaW9uIGludG8gJWJsICovCisKKwkvKiBjaGVjayBpZiBBSD0weDQyIGlzIHN1cHBvcnRlZCBpZiBGT1JDRV9MQkEgaXMgemVybyAqLworCW1vdmIJRVhUX0MoZm9yY2VfbGJhKSwgJWFsCisJdGVzdGIJJWFsLCAlYWwKKwlqbnoJMmYKKwlhbmR3CSQxLCAlY3gKKwlqbnoJMmYKKwkKKzE6CisJeG9yYgklYmwsICVibAorMjoKKwkvKiBiYWNrIHRvIHByb3RlY3RlZCBtb2RlICovCisJREFUQTMyCWNhbGwJRVhUX0MocmVhbF90b19wcm90KQorCS5jb2RlMzIKKworCW1vdmIJJWJsLCAlYWwJLyogcmV0dXJuIHZhbHVlIGluICVlYXggKi8KKworCXBvcGwJJWVieAorCXBvcGwJJWVicAorCisJcmV0CisKKworLyoKKyAqICAgaW50IGdldF9kaXNraW5mb19zdGFuZGFyZCAoaW50IGRyaXZlLCB1bnNpZ25lZCBsb25nICpjeWxpbmRlcnMsIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICpoZWFkcywgdW5zaWduZWQgbG9uZyAqc2VjdG9ycykKKyAqCisgKiAgIFJldHVybiB0aGUgZ2VvbWV0cnkgb2YgRFJJVkUgaW4gQ1lMSU5ERVJTLCBIRUFEUyBhbmQgU0VDVE9SUy4gSWYgYW4KKyAqICAgZXJyb3Igb2NjdXJzLCB0aGVuIHJldHVybiBub24temVybywgb3RoZXJ3aXNlIHplcm8uCisgKi8KKworRU5UUlkoZ2V0X2Rpc2tpbmZvX3N0YW5kYXJkKQorCXB1c2hsCSVlYnAKKwltb3ZsCSVlc3AsICVlYnAKKworCXB1c2hsCSVlYngKKwlwdXNobAklZWRpCisKKwkvKiBkcml2ZSAqLworCW1vdmIJMHg4KCVlYnApLCAlZGwKKwkvKiBlbnRlciByZWFsIG1vZGUgKi8KKwljYWxsCUVYVF9DKHByb3RfdG9fcmVhbCkKKworCS5jb2RlMTYKKwltb3ZiCSQweDgsICVhaAorCWludAkkMHgxMwkJLyogZG8gdGhlIG9wZXJhdGlvbiAqLworCS8qIGNoZWNrIGlmIHN1Y2Nlc3NmdWwgKi8KKwl0ZXN0YgklYWgsICVhaAorCWpuegkxZgorCS8qIGJvZ3VzIEJJT1NlcyBtYXkgbm90IHJldHVybiBhbiBlcnJvciBudW1iZXIgKi8KKwl0ZXN0YgkkMHgzZiwgJWNsCS8qIDAgc2VjdG9ycyBtZWFucyBubyBkaXNrICovCisJam56CTFmCQkvKiBpZiBub24temVybywgdGhlbiBzdWNjZWVkICovCisJLyogWFhYIDB4NjAgaXMgb25lIG9mIHRoZSB1bnVzZWQgZXJyb3IgbnVtYmVycyAqLworCW1vdmIJJDB4NjAsICVhaAorMToKKwltb3ZiCSVhaCwgJWJsCS8qIHNhdmUgcmV0dXJuIHZhbHVlIGluICVibCAqLworCS8qIGJhY2sgdG8gcHJvdGVjdGVkIG1vZGUgKi8KKwlEQVRBMzIJY2FsbAlFWFRfQyhyZWFsX3RvX3Byb3QpCisJLmNvZGUzMgorCisJLyogcmVzdG9yZSAlZWJwICovCisJbGVhbAkweDgoJWVzcCksICVlYnAKKwkKKwkvKiBoZWFkcyAqLworCW1vdmIJJWRoLCAlYWwKKwlpbmNsCSVlYXgJCS8qIHRoZSBudW1iZXIgb2YgaGVhZHMgaXMgY291bnRlZCBmcm9tIHplcm8gKi8KKwltb3ZsCTB4MTAoJWVicCksICVlZGkKKwltb3ZsCSVlYXgsICglZWRpKQorCisJLyogc2VjdG9ycyAqLworCXhvcmwJJWVheCwgJWVheAorCW1vdmIJJWNsLCAlYWwKKwlhbmRiCSQweDNmLCAlYWwKKwltb3ZsCTB4MTQoJWVicCksICVlZGkKKwltb3ZsCSVlYXgsICglZWRpKQorCisJLyogY3lsaW5kZXJzICovCisJc2hyYgkkNiwgJWNsCisJbW92YgklY2wsICVhaAorCW1vdmIJJWNoLCAlYWwKKwlpbmNsCSVlYXgJCS8qIHRoZSBudW1iZXIgb2YgY3lsaW5kZXJzIGlzIAorCQkJCSAgIGNvdW50ZWQgZnJvbSB6ZXJvICovCisJbW92bAkweGMoJWVicCksICVlZGkKKwltb3ZsCSVlYXgsICglZWRpKQorCisJeG9ybAklZWF4LCAlZWF4CisJbW92YgklYmwsICVhbAkvKiByZXR1cm4gdmFsdWUgaW4gJWVheCAqLworCisJcG9wbAklZWRpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisKKwlyZXQKKworCisjaWYgMAkJCisvKgorICogICBpbnQgZ2V0X2Rpc2tpbmZvX2Zsb3BweSAoaW50IGRyaXZlLCB1bnNpZ25lZCBsb25nICpjeWxpbmRlcnMsIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqaGVhZHMsIHVuc2lnbmVkIGxvbmcgKnNlY3RvcnMpCisgKgorICogICBSZXR1cm4gdGhlIGdlb21ldHJ5IG9mIERSSVZFIGluIENZTElOREVSUywgSEVBRFMgYW5kIFNFQ1RPUlMuIElmIGFuCisgKiAgIGVycm9yIG9jY3VycywgdGhlbiByZXR1cm4gbm9uLXplcm8sIG90aGVyd2lzZSB6ZXJvLgorICovCisKK0VOVFJZKGdldF9kaXNraW5mb19mbG9wcHkpCisJcHVzaGwJJWVicAorCW1vdmwJJWVzcCwgJWVicAorCisJcHVzaGwJJWVieAorCXB1c2hsCSVlc2kKKworCS8qIGRyaXZlICovCisJbW92YgkweDgoJWVicCksICVkbAorCS8qIGVudGVyIHJlYWwgbW9kZSAqLworCWNhbGwJRVhUX0MocHJvdF90b19yZWFsKQorCisJLmNvZGUxNgorCS8qIGluaXQgcHJvYmUgdmFsdWUgKi8KKwltb3ZsCSRwcm9iZV92YWx1ZXMtMSwgJWVzaQorMToKKwl4b3J3CSVheCwgJWF4CisJaW50CSQweDEzCQkvKiByZXNldCBmbG9wcHkgY29udHJvbGxlciAqLworCisJaW5jdwklc2kKKwltb3ZiCSglc2kpLCAlY2wKKwljbXBiCSQwLCAlY2wJCS8qIHByb2JlIGZhaWxlZCBpZiB6ZXJvICovCisJamUJMmYKKworCS8qIHBlcmZvcm0gcmVhZCAqLworCW1vdncJJFNDUkFUQ0hTRUcsICVheAorCW1vdncJJWF4LCAlZXMKKwl4b3J3CSVieCwgJWJ4CisJbW92dwkkMHgwMjAxLCAlYXgKKwltb3ZiCSQwLCAlY2gKKwltb3ZiCSQwLCAlZGgKKwlpbnQJJDB4MTMKKworCS8qIEZJWE1FOiBSZWFkIGZyb20gZmxvcHB5IG1heSBmYWlsIGV2ZW4gaWYgdGhlIGdlb21ldHJ5IGlzIGNvcnJlY3QuCisJICAgU28gc2hvdWxkIHJldHJ5IGF0IGxlYXN0IHRocmVlIHRpbWVzLiAgKi8KKwlqYwkxYgkJLyogbmV4dCB2YWx1ZSAqLworCQorCS8qIHN1Y2NlZWQgKi8KKwlqbXAJMmYKKwkKK3Byb2JlX3ZhbHVlczoKKwkuYnl0ZQkzNiwgMTgsIDE1LCA5LCAwCisJCisyOgorCS8qIGJhY2sgdG8gcHJvdGVjdGVkIG1vZGUgKi8KKwlEQVRBMzIJY2FsbAlFWFRfQyhyZWFsX3RvX3Byb3QpCisJLmNvZGUzMgorCisJLyogcmVzdG9yZSAlZWJwICovCisJbGVhbAkweDgoJWVzcCksICVlYnAKKwkKKwkvKiBjeWxpbmRlcnMgKi8KKwltb3ZsCTB4YyglZWJwKSwgJWVheAorCW1vdmwJJDgwLCAlZWJ4CisJbW92bAklZWJ4LCAoJWVheCkKKwkvKiBoZWFkcyAqLworCW1vdmwJMHgxMCglZWJwKSwgJWVheAorCW1vdmwJJDIsICVlYngKKwltb3ZsCSVlYngsICglZWF4KQorCS8qIHNlY3RvcnMgKi8KKwltb3ZsCTB4MTQoJWVicCksICVlYXgKKwltb3Z6YmwJJWNsLCAlZWJ4CisJbW92bAklZWJ4LCAoJWVheCkKKworCS8qIHJldHVybiB2YWx1ZSBpbiAlZWF4ICovCisJeG9ybAklZWF4LCAlZWF4CisJY21wYgkkMCwgJWNsCisJam5lCTNmCisJaW5jbAklZWF4CQkvKiAlZWF4ID0gMSAobm9uLXplcm8pICovCiszOgorCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCisJcmV0CisjZW5kaWYKKwkKKworLyogU291cmNlIGZpbGVzIGFyZSBzcGxpdHRlZCwgYXMgdGhleSBoYXZlIGRpZmZlcmVudCBjb3B5cmlnaHRzLiAgKi8KKyNpZm5kZWYgU1RBR0UxXzUKKyMgaW5jbHVkZSAic2V0am1wLlMiCisjIGluY2x1ZGUgImFwbS5TIgorI2VuZGlmIC8qICEgU1RBR0UxXzUgKi8KKwkJCisJCisKKyNpZm5kZWYgU1RBR0UxXzUKKy8qIGdldF9jb2RlX2VuZCgpIDogIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSBjb2RlCisgKiBUaGlzIGlzIGhlcmUgc28gdGhhdCBpdCBjYW4gYmUgcmVwbGFjZWQgYnkgYXNtc3R1Yi5jLgorICovCitFTlRSWShnZXRfY29kZV9lbmQpCisJLyogd2lsbCBiZSB0aGUgZW5kIG9mIHRoZSBic3MgKi8KKyMgaWYgZGVmaW5lZChIQVZFX0VORF9TWU1CT0wpCisJbW92bAkkZW5kLCAlZWF4CisjIGVsaWYgZGVmaW5lZChIQVZFX1VTQ09SRV9FTkRfU1lNQk9MKQorCW1vdmwJJF9lbmQsICVlYXgKKyMgZW5kaWYKKwlzaHJsCSQyLCAlZWF4CQkvKiBSb3VuZCB1cCB0byB0aGUgbmV4dCB3b3JkLiAqLworCWluY2wJJWVheAorCXNobGwJJDIsICVlYXgKKwlyZXQKKyNlbmRpZiAvKiAhIFNUQUdFMV81ICovCisKKy8qCisgKgorICogZ2V0X21lbXNpemUoaSkgOiAgcmV0dXJuIHRoZSBtZW1vcnkgc2l6ZSBpbiBLQi4gaSA9PSAwIGZvciBjb252ZW50aW9uYWwKKyAqCQltZW1vcnksIGkgPT0gMSBmb3IgZXh0ZW5kZWQgbWVtb3J5CisgKglCSU9TIGNhbGwgIklOVCAxMkgiIHRvIGdldCBjb252ZW50aW9uYWwgbWVtb3J5IHNpemUKKyAqCUJJT1MgY2FsbCAiSU5UIDE1SCwgQUg9ODhIIiB0byBnZXQgZXh0ZW5kZWQgbWVtb3J5IHNpemUKKyAqCQlCb3RoIGhhdmUgdGhlIHJldHVybiB2YWx1ZSBpbiBBWC4KKyAqCisgKi8KKworRU5UUlkoZ2V0X21lbXNpemUpCisJcHVzaAklZWJwCisJcHVzaAklZWJ4CisKKwltb3YJMHhjKCVlc3ApLCAlZWJ4CisKKwljYWxsCUVYVF9DKHByb3RfdG9fcmVhbCkJLyogZW50ZXIgcmVhbCBtb2RlICovCisJLmNvZGUxNgorCisJY21wYgkkMHgxLCAlYmwKKwlEQVRBMzIJamUJeGV4dAorCisJaW50CSQweDEyCisJREFUQTMyCWptcAl4ZG9uZQorCit4ZXh0OgorCW1vdmIJJDB4ODgsICVhaAorCWludAkkMHgxNQorCit4ZG9uZToKKwltb3Z3CSVheCwgJWJ4CisKKwlEQVRBMzIJY2FsbAlFWFRfQyhyZWFsX3RvX3Byb3QpCisJLmNvZGUzMgorCisJbW92dwklYngsICVheAorCXBvcAklZWJ4CisJcG9wCSVlYnAKKwlyZXQKKworCisjaWZuZGVmIFNUQUdFMV81CisKKy8qCisgKgorICogZ2V0X2Vpc2FtZW1zaXplKCkgOiAgcmV0dXJuIHBhY2tlZCBFSVNBIG1lbW9yeSBtYXAsIGxvd2VyIDE2IGJpdHMgaXMKKyAqCQltZW1vcnkgYmV0d2VlbiAxTSBhbmQgMTZNIGluIDFLIHBhcnRzLCB1cHBlciAxNiBiaXRzIGlzCisgKgkJbWVtb3J5IGFib3ZlIDE2TSBpbiA2NEsgcGFydHMuICBJZiBlcnJvciwgcmV0dXJuIC0xLgorICoJQklPUyBjYWxsICJJTlQgMTVILCBBSD1FODAxSCIgdG8gZ2V0IEVJU0EgbWVtb3J5IG1hcCwKKyAqCQlBWCA9IG1lbW9yeSBiZXR3ZWVuIDFNIGFuZCAxNk0gaW4gMUsgcGFydHMuCisgKgkJQlggPSBtZW1vcnkgYWJvdmUgMTZNIGluIDY0SyBwYXJ0cy4KKyAqCisgKi8KKworRU5UUlkoZ2V0X2Vpc2FtZW1zaXplKQorCXB1c2gJJWVicAorCXB1c2gJJWVieAorCisJY2FsbAlFWFRfQyhwcm90X3RvX3JlYWwpCS8qIGVudGVyIHJlYWwgbW9kZSAqLworCS5jb2RlMTYKKworCW1vdncJJDB4ZTgwMSwgJWF4CisJaW50CSQweDE1CisKKwlzaGxsCSQxNiwgJWVieAorCW1vdncJJWF4LCAlYngKKworCURBVEEzMgljYWxsCUVYVF9DKHJlYWxfdG9fcHJvdCkKKwkuY29kZTMyCisKKwltb3ZsCSQweEZGRkZGRkZGLCAlZWF4CisJY21wYgkkMHg4NiwgJWJoCisJamUJeG5vdGVpc2EKKworCW1vdmwJJWVieCwgJWVheAorCit4bm90ZWlzYToKKwlwb3AJJWVieAorCXBvcAklZWJwCisJcmV0CisKKy8qCisgKgorICogZ2V0X21tYXBfZW50cnkoYWRkciwgY29udCkgOiAgYWRkcmVzcyBhbmQgb2xkIGNvbnRpbnVhdGlvbiB2YWx1ZSAoemVybyB0bworICoJCXN0YXJ0KSwgZm9yIHRoZSBRdWVyeSBTeXN0ZW0gQWRkcmVzcyBNYXAgQklPUyBjYWxsLgorICoKKyAqICBTZXRzIHRoZSBmaXJzdCA0LWJ5dGUgaW50IHZhbHVlIG9mICJhZGRyIiB0byB0aGUgc2l6ZSByZXR1cm5lZCBieQorICogIHRoZSBjYWxsLiAgSWYgdGhlIGNhbGwgZmFpbHMsIHNldHMgaXQgdG8gemVyby4KKyAqCisgKglSZXR1cm5zOiAgbmV3IChub24temVybykgY29udGludWF0aW9uIHZhbHVlLCAwIGlmIGRvbmUuCisgKgorICogTk9URTogQ3VycmVudGx5IGhhcmQtY29kZWQgZm9yIGEgbWF4aW11bSBidWZmZXIgbGVuZ3RoIG9mIDEwMjQuCisgKi8KKworRU5UUlkoZ2V0X21tYXBfZW50cnkpCisJcHVzaAklZWJwCisJcHVzaAklZWJ4CisJcHVzaAklZWRpCisJcHVzaAklZXNpCisKKwkvKiBwbGFjZSBhZGRyZXNzICgrNCkgaW4gRVM6REkgKi8KKwltb3ZsCTB4MTQoJWVzcCksICVlYXgKKwlhZGRsCSQ0LCAlZWF4CisJbW92bAklZWF4LCAlZWRpCisJYW5kbAkkMHhmLCAlZWRpCisJc2hybAkkNCwgJWVheAorCW1vdmwJJWVheCwgJWVzaQorCisJLyogc2V0IGNvbnRpbnVhdGlvbiB2YWx1ZSAqLworCW1vdmwJMHgxOCglZXNwKSwgJWVieAorCisJLyogc2V0IGRlZmF1bHQgbWF4aW11bSBidWZmZXIgc2l6ZSAqLworCW1vdmwJJDB4MTQsICVlY3gKKworCS8qIHNldCBFRFggdG8gJ1NNQVAnICovCisJbW92bAkkMHg1MzRkNDE1MCwgJWVkeAorCisJY2FsbAlFWFRfQyhwcm90X3RvX3JlYWwpCS8qIGVudGVyIHJlYWwgbW9kZSAqLworCS5jb2RlMTYKKworCW1vdncJJXNpLCAlZXMKKwltb3ZsCSQweGU4MjAsICVlYXgKKwlpbnQJJDB4MTUKKworCURBVEEzMglqYwl4bm9zbWFwCisKKwljbXBsCSQweDUzNGQ0MTUwLCAlZWF4CisJREFUQTMyCWpuZQl4bm9zbWFwCisKKwljbXBsCSQweDE0LCAlZWN4CisJREFUQTMyCWpsCXhub3NtYXAKKworCWNtcGwJJDB4NDAwLCAlZWN4CisJREFUQTMyCWpnCXhub3NtYXAKKworCURBVEEzMglqbXAJeHNtYXAKKworeG5vc21hcDoKKwltb3ZsCSQwLCAlZWN4CisKK3hzbWFwOgorCURBVEEzMgljYWxsCUVYVF9DKHJlYWxfdG9fcHJvdCkKKwkuY29kZTMyCisKKwkvKiB3cml0ZSBsZW5ndGggb2YgYnVmZmVyICh6ZXJvIGlmIGVycm9yKSBpbnRvICJhZGRyIiAqLworCW1vdmwJMHgxNCglZXNwKSwgJWVheAorCW1vdmwJJWVjeCwgKCVlYXgpCisKKwkvKiBzZXQgcmV0dXJuIHZhbHVlIHRvIGNvbnRpbnVhdGlvbiAqLworCW1vdmwJJWVieCwgJWVheAorCisJcG9wCSVlc2kKKwlwb3AJJWVkaQorCXBvcAklZWJ4CisJcG9wCSVlYnAKKwlyZXQKKworLyoKKyAqIGdldF9yb21fY29uZmlnX3RhYmxlKCkKKyAqCisgKiBHZXQgdGhlIGxpbmVhciBhZGRyZXNzIG9mIGEgUk9NIGNvbmZpZ3VyYXRpb24gdGFibGUuIFJldHVybiB6ZXJvLAorICogaWYgZmFpbHMuCisgKi8KKwkKK0VOVFJZKGdldF9yb21fY29uZmlnX3RhYmxlKQorCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisKKwkvKiB6ZXJvICVlYnggZm9yIHNpbXBsaWNpdHkgKi8KKwl4b3JsCSVlYngsICVlYngKKwkKKwljYWxsCUVYVF9DKHByb3RfdG9fcmVhbCkKKwkuY29kZTE2CisKKwltb3Z3CSQweGMwLCAlYXgKKwlpbnQJJDB4MTUKKworCWpjCW5vX3JvbV90YWJsZQorCXRlc3RiCSVhaCwgJWFoCisJam56CW5vX3JvbV90YWJsZQorCQorCW1vdncJJWVzLCAlZHgKKwlqbXAJZm91bmRfcm9tX3RhYmxlCisJCitub19yb21fdGFibGU6CisJeG9ydwklZHgsICVkeAorCXhvcncJJWJ4LCAlYngKKwkKK2ZvdW5kX3JvbV90YWJsZToKKwlEQVRBMzIJY2FsbAlFWFRfQyhyZWFsX3RvX3Byb3QpCisJLmNvZGUzMgorCisJLyogY29tcHV0ZSB0aGUgbGluZWFyIGFkZHJlc3MgKi8KKwltb3Z3CSVkeCwgJWF4CisJc2hsbAkkNCwgJWVheAorCWFkZGwJJWVieCwgJWVheAorCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0CisKKworLyoKKyAqIGludCBnZXRfdmJlX2NvbnRyb2xsZXJfaW5mbyAoc3RydWN0IHZiZV9jb250cm9sbGVyICpjb250cm9sbGVyX3B0cikKKyAqCisgKiBHZXQgVkJFIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24uCisgKi8KKworRU5UUlkoZ2V0X3ZiZV9jb250cm9sbGVyX2luZm8pCisJcHVzaGwJJWVicAorCW1vdmwJJWVzcCwgJWVicAorCQorCXB1c2hsCSVlZGkKKwlwdXNobAklZWJ4CisKKwkvKiBDb252ZXJ0IHRoZSBsaW5lYXIgYWRkcmVzcyB0byBzZWdtZW50Om9mZnNldCAqLworCW1vdmwJOCglZWJwKSwgJWVheAorCW1vdmwJJWVheCwgJWVkaQorCWFuZGwJJDB4MDAwMDAwMGYsICVlZGkKKwlzaHJsCSQ0LCAlZWF4CisJbW92bAklZWF4LCAlZWJ4CisKKwljYWxsCUVYVF9DKHByb3RfdG9fcmVhbCkKKwkuY29kZTE2CisKKwltb3Z3CSVieCwgJWVzCisJbW92dwkkMHg0RjAwLCAlYXgKKwlpbnQJJDB4MTAKKworCW1vdncJJWF4LCAlYngKKwlEQVRBMzIJY2FsbAlFWFRfQyhyZWFsX3RvX3Byb3QpCisJLmNvZGUzMgorCisJbW92endsCSVieCwgJWVheAorCisJcG9wbAklZWJ4CisJcG9wbAklZWRpCisJcG9wbAklZWJwCisJcmV0CisKKwkKKy8qCisgKiBpbnQgZ2V0X3ZiZV9tb2RlX2luZm8gKGludCBtb2RlX251bWJlciwgc3RydWN0IHZiZV9tb2RlICptb2RlX3B0cikKKyAqCisgKiBHZXQgVkJFIG1vZGUgaW5mb3JtYXRpb24uCisgKi8KKworRU5UUlkoZ2V0X3ZiZV9tb2RlX2luZm8pCisJcHVzaGwJJWVicAorCW1vdmwJJWVzcCwgJWVicAorCQorCXB1c2hsCSVlZGkKKwlwdXNobAklZWJ4CisKKwkvKiBDb252ZXJ0IHRoZSBsaW5lYXIgYWRkcmVzcyB0byBzZWdtZW50Om9mZnNldCAqLworCW1vdmwJMHhjKCVlYnApLCAlZWF4CisJbW92bAklZWF4LCAlZWRpCisJYW5kbAkkMHgwMDAwMDAwZiwgJWVkaQorCXNocmwJJDQsICVlYXgKKwltb3ZsCSVlYXgsICVlYngKKworCS8qIFNhdmUgdGhlIG1vZGUgbnVtYmVyIGluICVjeCAqLworCW1vdmwJMHg4KCVlYnApLCAlZWN4CisJCisJY2FsbAlFWFRfQyhwcm90X3RvX3JlYWwpCisJLmNvZGUxNgorCisJbW92dwklYngsICVlcworCW1vdncJJDB4NEYwMSwgJWF4CisJaW50CSQweDEwCisKKwltb3Z3CSVheCwgJWJ4CisJREFUQTMyCWNhbGwJRVhUX0MocmVhbF90b19wcm90KQorCS5jb2RlMzIKKworCW1vdnp3bAklYngsICVlYXgKKworCXBvcGwJJWVieAorCXBvcGwJJWVkaQorCXBvcGwJJWVicAorCXJldAorCisJCisvKgorICogaW50IHNldF92YmVfbW9kZSAoaW50IG1vZGVfbnVtYmVyKQorICoKKyAqIFNldCBWQkUgbW9kZS4gRG9uJ3Qgc3VwcG9ydCB1c2VyLXNwZWNpZmllZCBDUlRDIGluZm9ybWF0aW9uLgorICovCisKK0VOVFJZKHNldF92YmVfbW9kZSkKKwlwdXNobAklZWJwCisJbW92bAklZXNwLCAlZWJwCisJCisJcHVzaGwJJWVieAorCisJLyogU2F2ZSB0aGUgbW9kZSBudW1iZXIgaW4gJWJ4ICovCisJbW92bAkweDgoJWVicCksICVlYngKKwkvKiBDbGVhciBiaXQgRDExICovCisJYW5kbAkkMHhGN0ZGLCAlZWJ4CisJCisJY2FsbAlFWFRfQyhwcm90X3RvX3JlYWwpCisJLmNvZGUxNgorCisJbW92dwkkMHg0RjAyLCAlYXgKKwlpbnQJJDB4MTAKKworCW1vdncJJWF4LCAlYngKKwlEQVRBMzIJY2FsbAlFWFRfQyhyZWFsX3RvX3Byb3QpCisJLmNvZGUzMgorCisJbW92endsCSVieCwgJWVheAorCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisJcmV0CisKKwkJCisvKgorICogZ2F0ZUEyMChpbnQgbGluZWFyKQorICoKKyAqIEdhdGUgYWRkcmVzcy1saW5lIDIwIGZvciBoaWdoIG1lbW9yeS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgcHJvYmFibHkgb3ZlcmNvbnNlcnZhdGl2ZSBpbiB3aGF0IGl0IGRvZXMsIGJ1dCBzbyB3aGF0PworICoKKyAqIEl0IGFsc28gZWF0cyBhbnkga2V5c3Ryb2tlcyBpbiB0aGUga2V5Ym9hcmQgYnVmZmVyLiAgOi0oCisgKi8KKworRU5UUlkoZ2F0ZUEyMCkKKwkvKiBmaXJzdCwgdHJ5IGEgQklPUyBjYWxsICovCisJcHVzaGwJJWVicAorCW1vdmwJOCglZXNwKSwgJWVkeAorCQorCWNhbGwJRVhUX0MocHJvdF90b19yZWFsKQorCQorCS5jb2RlMTYKKwltb3Z3CSQweDI0MDAsICVheAorCXRlc3R3CSVkeCwgJWR4CisJanoJMWYKKwlpbmN3CSVheAorMToJc3RjCisJaW50CSQweDE1CisJam5jCTJmCisKKwkvKiBzZXQgbm9uLXplcm8gaWYgZmFpbGVkICovCisJbW92YgkkMSwgJWFoCisKKwkvKiBzYXZlIHRoZSBzdGF0dXMgKi8KKzI6CW1vdmIJJWFoLCAlZGwKKworCURBVEEzMgljYWxsCUVYVF9DKHJlYWxfdG9fcHJvdCkKKwkuY29kZTMyCisKKwlwb3BsCSVlYnAKKwl0ZXN0YgklZGwsICVkbAorCWpuegkzZgorCXJldAorCiszOgkvKiB1c2Uga2V5Ym9hcmQgY29udHJvbGxlciAqLworCXB1c2hsCSVlYXgKKworCWNhbGwgICAgZ2xvb3AxCisKKwltb3ZiCSRLQ19DTURfV09VVCwgJWFsCisJb3V0YgkkS19DTUQKKworZ2xvb3BpbnQxOgorCWluYgkkS19TVEFUVVMKKwlhbmRiCSRLX0lCVUZfRlVMLCAlYWwKKwlqbnoJZ2xvb3BpbnQxCisKKwltb3ZiCSRLQl9PVVRQVVRfTUFTSywgJWFsCisJY21wYgkkMCwgMHg4KCVlc3ApCisJanoJZ2RvaXQKKworCW9yYgkkS0JfQTIwX0VOQUJMRSwgJWFsCitnZG9pdDoKKwlvdXRiCSRLX1JEV1IKKworCWNhbGwJZ2xvb3AxCisKKwkvKiBvdXRwdXQgYSBkdW1teSBjb21tYW5kIChVU0Iga2V5Ym9hcmQgaGFjaykgKi8KKwltb3ZiCSQweGZmLCAlYWwKKwlvdXRiCSRLX0NNRAorCWNhbGwJZ2xvb3AxCisJCisJcG9wbAklZWF4CisJcmV0CisKK2dsb29wMToKKwlpbmIJJEtfU1RBVFVTCisJYW5kYgkkS19JQlVGX0ZVTCwgJWFsCisJam56CWdsb29wMQorCitnbG9vcDI6CisJaW5iCSRLX1NUQVRVUworCWFuZGIJJEtfT0JVRl9GVUwsICVhbAorCWp6CWdsb29wMnJldAorCWluYgkkS19SRFdSCisJam1wCWdsb29wMgorCitnbG9vcDJyZXQ6CisJcmV0CisKKworRU5UUlkocGF0Y2hfY29kZSkJLyogbGFiZWxzIHN0YXJ0IHdpdGggInBjXyIgKi8KKwkuY29kZTE2CisKKwltb3YJJWNzLCAlYXgKKwltb3YJJWF4LCAlZHMKKwltb3YJJWF4LCAlZXMKKwltb3YJJWF4LCAlZnMKKwltb3YJJWF4LCAlZ3MKKwlBRERSMzIJbW92bAkkMCwgMAorcGNfc3RvcDoKKwlobHQKKwlEQVRBMzIJam1wCXBjX3N0b3AKK0VOVFJZKHBhdGNoX2NvZGVfZW5kKQorCisJLmNvZGUzMgorCisKKy8qCisgKiBsaW51eF9ib290KCkKKyAqCisgKiBEb2VzIHNvbWUgZnVua3kgdGhpbmdzIChpbmNsdWRpbmcgb24gdGhlIHN0YWNrISksIHRoZW4ganVtcHMgdG8gdGhlCisgKiBlbnRyeSBwb2ludCBvZiB0aGUgTGludXggc2V0dXAgY29kZS4KKyAqLworCitWQVJJQUJMRShsaW51eF90ZXh0X2xlbikKKwkubG9uZwkwCisJCitWQVJJQUJMRShsaW51eF9kYXRhX3RtcF9hZGRyKQorCS5sb25nCTAKKwkKK1ZBUklBQkxFKGxpbnV4X2RhdGFfcmVhbF9hZGRyKQorCS5sb25nCTAKKwkKK0VOVFJZKGxpbnV4X2Jvb3QpCisJLyogZG9uJ3Qgd29ycnkgYWJvdXQgc2F2aW5nIGFueXRoaW5nLCB3ZSdyZSBjb21taXR0ZWQgYXQgdGhpcyBwb2ludCAqLworCWNsZAkvKiBmb3J3YXJkIGNvcHlpbmcgKi8KKworCS8qIGNvcHkga2VybmVsICovCisJbW92bAlFWFRfQyhsaW51eF90ZXh0X2xlbiksICVlY3gKKwlhZGRsCSQzLCAlZWN4CisJc2hybAkkMiwgJWVjeAorCW1vdmwJJExJTlVYX0JaSU1BR0VfQUREUiwgJWVzaQorCW1vdmwJJExJTlVYX1pJTUFHRV9BRERSLCAlZWRpCisKKwlyZXAKKwltb3ZzbAorCitFTlRSWShiaWdfbGludXhfYm9vdCkKKwltb3ZsCUVYVF9DKGxpbnV4X2RhdGFfcmVhbF9hZGRyKSwgJWVieAorCQorCS8qIGNvcHkgdGhlIHJlYWwgbW9kZSBwYXJ0ICovCisJbW92bAlFWFRfQyhsaW51eF9kYXRhX3RtcF9hZGRyKSwgJWVzaQorCW1vdmwJJWVieCwgJWVkaQorCW1vdmwJJExJTlVYX1NFVFVQX01PVkVfU0laRSwgJWVjeAorCWNsZAorCXJlcAorCW1vdnNiCisKKwkvKiBjaGFuZ2UgJWVieCB0byB0aGUgc2VnbWVudCBhZGRyZXNzICovCisJc2hybAkkNCwgJWVieAorCW1vdmwJJWVieCwgJWVheAorCWFkZGwJJDB4MjAsICVlYXgKKwltb3ZsCSVlYXgsIGxpbnV4X3NldHVwX3NlZworCQkJCisJLyogWFhYIG5ldyBzdGFjayBwb2ludGVyIGluIHNhZmUgYXJlYSBmb3IgY2FsbGluZyBmdW5jdGlvbnMgKi8KKwltb3ZsCSQweDQwMDAsICVlc3AKKwljYWxsCUVYVF9DKHN0b3BfZmxvcHB5KQorCisJLyogZmluYWwgc2V0dXAgZm9yIGxpbnV4IGJvb3QgKi8KKworCWNhbGwJRVhUX0MocHJvdF90b19yZWFsKQorCS5jb2RlMTYKKworCS8qIGZpbmFsIHNldHVwIGZvciBsaW51eCBib290ICovCisJY2xpCisJbW92dwklYngsICVzcworCW1vdncJJExJTlVYX1NFVFVQX1NUQUNLLCAlc3AKKwkKKwltb3Z3CSVieCwgJWRzCisJbW92dwklYngsICVlcworCW1vdncJJWJ4LCAlZnMKKwltb3Z3CSVieCwgJWdzCisKKwkvKiBqdW1wIHRvIHN0YXJ0ICovCisJLyogbGptcCAqLworCS5ieXRlCTB4ZWEKKwkud29yZAkwCitsaW51eF9zZXR1cF9zZWc6CQorCS53b3JkCTAKKwkuY29kZTMyCisKKworLyoKKyAqIG11bHRpX2Jvb3QoaW50IHN0YXJ0LCBpbnQgbWJfaW5mbykKKyAqCisgKiAgVGhpcyBzdGFydHMgYSBrZXJuZWwgaW4gdGhlIG1hbm5lciBleHBlY3RlZCBvZiB0aGUgbXVsdGlib290IHN0YW5kYXJkLgorICovCisKK0VOVFJZKG11bHRpX2Jvb3QpCisJLyogbm8gbmVlZCB0byBzYXZlIGFueXRoaW5nICovCisJY2FsbAlFWFRfQyhzdG9wX2Zsb3BweSkKKworCW1vdmwJJDB4MkJBREIwMDIsICVlYXgKKwltb3ZsCTB4OCglZXNwKSwgJWVieAorCisJLyogYm9vdCBrZXJuZWwgaGVyZSAoYWJzb2x1dGUgYWRkcmVzcyBjYWxsKSAqLworCWNhbGwJKjB4NCglZXNwKQorCisJLyogZXJyb3IgKi8KKwljYWxsCUVYVF9DKHN0b3ApCisKKyNlbmRpZiAvKiAhIFNUQUdFMV81ICovCisJCisvKgorICogdm9pZCBjb25zb2xlX3B1dGNoYXIgKGludCBjKQorICoKKyAqIFB1dCB0aGUgY2hhcmFjdGVyIEMgb24gdGhlIGNvbnNvbGUuIEJlY2F1c2UgR1JVQiB3YW50cyB0byB3cml0ZSBhCisgKiBjaGFyYWN0ZXIgd2l0aCBhbiBhdHRyaWJ1dGUsIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgYSBiaXQgdHJpY2t5LgorICogSWYgQyBpcyBhIGNvbnRyb2wgY2hhcmFjdGVyIChDUiwgTEYsIEJFTCwgQlMpLCB1c2UgSU5UIDEwLCBBSCA9IDBFaAorICogKFRFTEVUWVBFIE9VVFBVVCkuIE90aGVyd2lzZSwgc2F2ZSB0aGUgb3JpZ2luYWwgcG9zaXRpb24sIHB1dCBhIHNwYWNlLAorICogc2F2ZSB0aGUgY3VycmVudCBwb3NpdGlvbiwgcmVzdG9yZSB0aGUgb3JpZ2luYWwgcG9zaXRpb24sIHdyaXRlIHRoZQorICogY2hhcmFjdGVyIGFuZCB0aGUgYXR0cmlidXRlLCBhbmQgcmVzdG9yZSB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAqCisgKiBUaGUgcmVhc29uIHdoeSB0aGlzIGlzIHNvIGNvbXBsaWNhdGVkIGlzIHRoYXQgdGhlcmUgaXMgbm8gZWFzeSB3YXkgdG8KKyAqIGdldCB0aGUgaGVpZ2h0IG9mIHRoZSBzY3JlZW4sIGFuZCB0aGUgVEVMRVRZUEUgT1VQVVQgQklPUyBjYWxsIGRvZXNuJ3QKKyAqIHN1cHBvcnQgc2V0dGluZyBhIGJhY2tncm91bmQgYXR0cmlidXRlLgorICovCitFTlRSWShjb25zb2xlX3B1dGNoYXIpCisJbW92bAkweDQoJWVzcCksICVlZHgKKwlwdXNoYQorI2lmZGVmIFNUQUdFMV81CisJbW92YgkkMHgwNywgJWJsCisjZWxzZQorCW1vdmwJRVhUX0MoY29uc29sZV9jdXJyZW50X2NvbG9yKSwgJWVieAorI2VuZGlmCisJCisJY2FsbAlFWFRfQyhwcm90X3RvX3JlYWwpCisJLmNvZGUxNgorCW1vdmIJJWRsLCAlYWwKKwl4b3JiCSViaCwgJWJoCisKKyNpZm5kZWYgU1RBR0UxXzUKKwkvKiB1c2UgdGVsZXR5cGUgb3V0cHV0IGlmIGNvbnRyb2wgY2hhcmFjdGVyICovCisJY21wYgkkMHg3LCAlYWwKKwlqZQkxZgorCWNtcGIJJDB4OCwgJWFsCisJamUJMWYKKwljbXBiCSQweGEsICVhbAorCWplCTFmCisJY21wYgkkMHhkLCAlYWwKKwlqZQkxZgorCisJLyogc2F2ZSB0aGUgY2hhcmFjdGVyIGFuZCB0aGUgYXR0cmlidXRlIG9uIHRoZSBzdGFjayAqLworCXB1c2h3CSVheAorCXB1c2h3CSVieAorCQorCS8qIGdldCB0aGUgY3VycmVudCBwb3NpdGlvbiAqLworCW1vdmIJJDB4MywgJWFoCisJaW50CSQweDEwCisKKwkvKiBjaGVjayB0aGUgY29sdW1uIHdpdGggdGhlIHdpZHRoICovCisJY21wYgkkNzksICVkbAorCWpsCTJmCisJCisJLyogcHJpbnQgQ1IgYW5kIExGLCBpZiBuZXh0IHdyaXRlIHdpbGwgZXhjZWVkIHRoZSB3aWR0aCAqLwkKKwltb3Z3CSQweDBlMGQsICVheAorCWludAkkMHgxMAorCW1vdmIJJDB4MGEsICVhbAorCWludAkkMHgxMAorCQorCS8qIGdldCB0aGUgY3VycmVudCBwb3NpdGlvbiAqLworCW1vdmIJJDB4MywgJWFoCisJaW50CSQweDEwCisKKzI6CQorCS8qIHJlc3RvcmUgdGhlIGNoYXJhY3RlciBhbmQgdGhlIGF0dHJpYnV0ZSAqLworCXBvcHcJJWJ4CisJcG9wdwklYXgKKwkKKwkvKiB3cml0ZSB0aGUgY2hhcmFjdGVyIHdpdGggdGhlIGF0dHJpYnV0ZSAqLworCW1vdmIJJDB4OSwgJWFoCisJbW92dwkkMSwgJWN4CisJaW50CSQweDEwCisKKwkvKiBtb3ZlIHRoZSBjdXJzb3IgZm9yd2FyZCAqLworCWluY2IJJWRsCisJbW92YgkkMHgyLCAlYWgKKwlpbnQJJDB4MTAKKworCWptcAkzZgorI2VuZGlmIC8qICEgU1RBR0UxXzUgKi8KKwkKKzE6CW1vdmIJJDB4ZSwgJWFoCisJaW50CSQweDEwCisJCiszOglEQVRBMzIJY2FsbAlFWFRfQyhyZWFsX3RvX3Byb3QpCisJLmNvZGUzMgorCQorCXBvcGEKKwlyZXQKKworCisjaWZuZGVmIFNUQUdFMV81CisKKy8qIHRoaXMgdGFibGUgaXMgdXNlZCBpbiB0cmFuc2xhdGVfa2V5Y29kZSBiZWxvdyAqLwordHJhbnNsYXRpb25fdGFibGU6CisJLndvcmQJS0VZX0xFRlQsIDIKKwkud29yZAlLRVlfUklHSFQsIDYKKwkud29yZAlLRVlfVVAsIDE2CisJLndvcmQJS0VZX0RPV04sIDE0CisJLndvcmQJS0VZX0hPTUUsIDEKKwkud29yZAlLRVlfRU5ELCA1CisJLndvcmQJS0VZX0RDLCA0CisJLndvcmQJS0VZX0JBQ0tTUEFDRSwgOAorCS53b3JkCUtFWV9QUEFHRSwgNworCS53b3JkCUtFWV9OUEFHRSwgMworCS53b3JkCTAKKwkKKy8qCisgKiB0cmFuc2xhdGVfa2V5Y29kZSB0cmFuc2xhdGVzIHRoZSBrZXkgY29kZSAlZHggdG8gYW4gYXNjaWkgY29kZS4KKyAqLworCS5jb2RlMTYKKwordHJhbnNsYXRlX2tleWNvZGU6CisJcHVzaHcJJWJ4CisJcHVzaHcJJXNpCisJCisJbW92dwkkQUJTKHRyYW5zbGF0aW9uX3RhYmxlKSwgJXNpCisJCisxOglsb2RzdworCS8qIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGVuZCAqLworCXRlc3R3CSVheCwgJWF4CisJanoJMmYKKwkvKiBsb2FkIHRoZSBhc2NpaSBjb2RlIGludG8gJWF4ICovCisJbW92dwklYXgsICVieAorCWxvZHN3CisJLyogY2hlY2sgaWYgdGhpcyBtYXRjaGVzIHRoZSBrZXkgY29kZSAqLworCWNtcHcJJWJ4LCAlZHgKKwlqbmUJMWIKKwkvKiB0cmFuc2xhdGUgJWR4LCBpZiBzdWNjZXNzZnVsICovCisJbW92dwklYXgsICVkeAorCisyOglwb3B3CSVzaQorCXBvcHcJJWJ4CisJcmV0CisKKwkuY29kZTMyCisJCisKKy8qCisgKiByZW1hcF9hc2NpaV9jaGFyIHJlbWFwcyB0aGUgYXNjaWkgY29kZSAlZGwgdG8gYW5vdGhlciBpZiB0aGUgY29kZSBpcworICogY29udGFpbmVkIGluIEFTQ0lJX0tFWV9NQVAuCisgKi8KKwkuY29kZTE2CisJCityZW1hcF9hc2NpaV9jaGFyOgorCXB1c2h3CSVzaQorCQorCW1vdncJJEFCUyhFWFRfQyhhc2NpaV9rZXlfbWFwKSksICVzaQorMToKKwlsb2RzdworCS8qIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGVuZCAqLworCXRlc3R3CSVheCwgJWF4CisJanoJMmYKKwkvKiBjaGVjayBpZiB0aGlzIG1hdGNoZXMgdGhlIGFzY2lpIGNvZGUgKi8KKwljbXBiCSVhbCwgJWRsCisJam5lCTFiCisJLyogaWYgc28sIHBlcmZvcm0gdGhlIG1hcHBpbmcgKi8KKwltb3ZiCSVhaCwgJWRsCisyOgorCS8qIHJlc3RvcmUgJXNpICovCisJcG9wdwklc2kKKworCXJldAorCisJLmNvZGUzMgorCisJLmFsaWduCTQKK0VOVFJZKGFzY2lpX2tleV9tYXApCisJLnNwYWNlCShLRVlfTUFQX1NJWkUgKyAxKSAqIDIKKwkKKworLyoKKyAqIGludCBjb25zb2xlX2dldGtleSAodm9pZCkKKyAqIEJJT1MgY2FsbCAiSU5UIDE2SCBGdW5jdGlvbiAwMEgiIHRvIHJlYWQgY2hhcmFjdGVyIGZyb20ga2V5Ym9hcmQKKyAqCUNhbGwgd2l0aAklYWggPSAweDAKKyAqCVJldHVybjoJCSVhaCA9IGtleWJvYXJkIHNjYW4gY29kZQorICoJCQklYWwgPSBBU0NJSSBjaGFyYWN0ZXIKKyAqLworCitFTlRSWShjb25zb2xlX2dldGtleSkKKwlwdXNoCSVlYnAKKworCWNhbGwJRVhUX0MocHJvdF90b19yZWFsKQorCS5jb2RlMTYKKworCWludAkkMHgxNgorCisJbW92dwklYXgsICVkeAkJLyogcmVhbF90b19wcm90IHVzZXMgJWVheCAqLworCWNhbGwJdHJhbnNsYXRlX2tleWNvZGUKKwljYWxsCXJlbWFwX2FzY2lpX2NoYXIKKwkKKwlEQVRBMzIJY2FsbAlFWFRfQyhyZWFsX3RvX3Byb3QpCisJLmNvZGUzMgorCisJbW92dwklZHgsICVheAorCisJcG9wCSVlYnAKKwlyZXQKKworCisvKgorICogaW50IGNvbnNvbGVfY2hlY2trZXkgKHZvaWQpCisgKglpZiB0aGVyZSBpcyBhIGNoYXJhY3RlciBwZW5kaW5nLCByZXR1cm4gaXQ7IG90aGVyd2lzZSByZXR1cm4gLTEKKyAqIEJJT1MgY2FsbCAiSU5UIDE2SCBGdW5jdGlvbiAwMUgiIHRvIGNoZWNrIHdoZXRoZXIgYSBjaGFyYWN0ZXIgaXMgcGVuZGluZworICoJQ2FsbCB3aXRoCSVhaCA9IDB4MQorICoJUmV0dXJuOgorICoJCUlmIGtleSB3YWl0aW5nIHRvIGJlIGlucHV0OgorICoJCQklYWggPSBrZXlib2FyZCBzY2FuIGNvZGUKKyAqCQkJJWFsID0gQVNDSUkgY2hhcmFjdGVyCisgKgkJCVplcm8gZmxhZyA9IGNsZWFyCisgKgkJZWxzZQorICoJCQlaZXJvIGZsYWcgPSBzZXQKKyAqLworRU5UUlkoY29uc29sZV9jaGVja2tleSkKKwlwdXNoCSVlYnAKKwl4b3JsCSVlZHgsICVlZHgKKwkKKwljYWxsCUVYVF9DKHByb3RfdG9fcmVhbCkJLyogZW50ZXIgcmVhbCBtb2RlICovCisJLmNvZGUxNgorCisJbW92YgkkMHgxLCAlYWgKKwlpbnQJJDB4MTYKKworCURBVEEzMglqeglub3RwZW5kaW5nCisJCisJbW92dwklYXgsICVkeAorCWNhbGwJdHJhbnNsYXRlX2tleWNvZGUKKwljYWxsCXJlbWFwX2FzY2lpX2NoYXIKKwlEQVRBMzIJam1wCXBlbmRpbmcKKworbm90cGVuZGluZzoKKwltb3ZsCSQweEZGRkZGRkZGLCAlZWR4CisKK3BlbmRpbmc6CisJREFUQTMyCWNhbGwJRVhUX0MocmVhbF90b19wcm90KQorCS5jb2RlMzIKKworCW1vdgklZWR4LCAlZWF4CisKKwlwb3AJJWVicAorCXJldAorCisJCisvKgorICogaW50IGNvbnNvbGVfZ2V0eHkgKHZvaWQpCisgKiBCSU9TIGNhbGwgIklOVCAxMEggRnVuY3Rpb24gMDNoIiB0byBnZXQgY3Vyc29yIHBvc2l0aW9uCisgKglDYWxsIHdpdGgJJWFoID0gMHgwMworICoJCQklYmggPSBwYWdlCisgKiAgICAgIFJldHVybnMgICAgICAgICAlY2ggPSBzdGFydGluZyBzY2FuIGxpbmUKKyAqICAgICAgICAgICAgICAgICAgICAgICVjbCA9IGVuZGluZyBzY2FuIGxpbmUKKyAqICAgICAgICAgICAgICAgICAgICAgICVkaCA9IHJvdyAoMCBpcyB0b3ApCisgKiAgICAgICAgICAgICAgICAgICAgICAlZGwgPSBjb2x1bW4gKDAgaXMgbGVmdCkKKyAqLworCisKK0VOVFJZKGNvbnNvbGVfZ2V0eHkpCisJcHVzaAklZWJwCisJcHVzaAklZWJ4ICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIEVCWCAqLworCisJY2FsbAlFWFRfQyhwcm90X3RvX3JlYWwpCisJLmNvZGUxNgorCisgICAgICAgIHhvcmIJJWJoLCAlYmggICAgICAgICAgICAgICAgLyogc2V0IHBhZ2UgdG8gMCAqLworCW1vdmIJJDB4MywgJWFoCisJaW50CSQweDEwCQkJLyogZ2V0IGN1cnNvciBwb3NpdGlvbiAqLworCisJREFUQTMyCWNhbGwJRVhUX0MocmVhbF90b19wcm90KQorCS5jb2RlMzIKKworCW1vdmIJJWRsLCAlYWgKKwltb3ZiCSVkaCwgJWFsCisKKwlwb3AJJWVieAorCXBvcAklZWJwCisJcmV0CisKKworLyoKKyAqIHZvaWQgY29uc29sZV9nb3RveHkoaW50IHgsIGludCB5KQorICogQklPUyBjYWxsICJJTlQgMTBIIEZ1bmN0aW9uIDAyaCIgdG8gc2V0IGN1cnNvciBwb3NpdGlvbgorICoJQ2FsbCB3aXRoCSVhaCA9IDB4MDIKKyAqCQkJJWJoID0gcGFnZQorICogICAgICAgICAgICAgICAgICAgICAgJWRoID0gcm93ICgwIGlzIHRvcCkKKyAqICAgICAgICAgICAgICAgICAgICAgICVkbCA9IGNvbHVtbiAoMCBpcyBsZWZ0KQorICovCisKKworRU5UUlkoY29uc29sZV9nb3RveHkpCisJcHVzaAklZWJwCisJcHVzaAklZWJ4ICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIEVCWCAqLworCisJbW92YgkweGMoJWVzcCksICVkbCAgICAgICAgICAgLyogJWRsID0geCAqLworCW1vdmIJMHgxMCglZXNwKSwgJWRoICAgICAgICAgIC8qICVkaCA9IHkgKi8KKworCWNhbGwJRVhUX0MocHJvdF90b19yZWFsKQorCS5jb2RlMTYKKworICAgICAgICB4b3JiCSViaCwgJWJoICAgICAgICAgICAgICAgIC8qIHNldCBwYWdlIHRvIDAgKi8KKwltb3ZiCSQweDIsICVhaAorCWludAkkMHgxMAkJCS8qIHNldCBjdXJzb3IgcG9zaXRpb24gKi8KKworCURBVEEzMgljYWxsCUVYVF9DKHJlYWxfdG9fcHJvdCkKKwkuY29kZTMyCisKKwlwb3AJJWVieAorCXBvcAklZWJwCisJcmV0CisKKwkKKy8qCisgKiB2b2lkIGNvbnNvbGVfY2xzICh2b2lkKQorICogQklPUyBjYWxsICJJTlQgMTBIIEZ1bmN0aW9uIDA5aCIgdG8gd3JpdGUgY2hhcmFjdGVyIGFuZCBhdHRyaWJ1dGUKKyAqCUNhbGwgd2l0aAklYWggPSAweDA5CisgKiAgICAgICAgICAgICAgICAgICAgICAlYWwgPSAoY2hhcmFjdGVyKQorICogICAgICAgICAgICAgICAgICAgICAgJWJoID0gKHBhZ2UgbnVtYmVyKQorICogICAgICAgICAgICAgICAgICAgICAgJWJsID0gKGF0dHJpYnV0ZSkKKyAqICAgICAgICAgICAgICAgICAgICAgICVjeCA9IChudW1iZXIgb2YgdGltZXMpCisgKi8KKworCitFTlRSWShjb25zb2xlX2NscykKKwlwdXNoCSVlYnAKKwlwdXNoCSVlYnggICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgRUJYICovCisKKwljYWxsCUVYVF9DKHByb3RfdG9fcmVhbCkKKwkuY29kZTE2CisKKwkvKiBtb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGJlZ2lubmluZyAqLworCW1vdmIJJDB4MDIsICVhaAorCXhvcmIJJWJoLCAlYmgKKwl4b3J3CSVkeCwgJWR4CisJaW50CSQweDEwCisKKwkvKiB3cml0ZSBzcGFjZXMgdG8gdGhlIGVudGlyZSBzY3JlZW4gKi8KKwltb3Z3CSQweDA5MjAsICVheAorCW1vdncJJDB4MDcsICVieAorCW1vdncJJCg4MCAqIDI1KSwgJWN4CisgICAgICAgIGludAkkMHgxMAorCisJLyogbW92ZSBiYWNrIHRoZSBjdXJzb3IgKi8KKwltb3ZiCSQweDAyLCAlYWgKKwlpbnQJJDB4MTAKKworCURBVEEzMgljYWxsCUVYVF9DKHJlYWxfdG9fcHJvdCkKKwkuY29kZTMyCisKKwlwb3AJJWVieAorCXBvcAklZWJwCisJcmV0CisKKwkKKy8qCisgKiBpbnQgY29uc29sZV9zZXRjdXJzb3IgKGludCBvbikKKyAqIEJJT1MgY2FsbCAiSU5UIDEwSCBGdW5jdGlvbiAwMWgiIHRvIHNldCBjdXJzb3IgdHlwZQorICogICAgICBDYWxsIHdpdGggICAgICAgJWFoID0gMHgwMQorICogICAgICAgICAgICAgICAgICAgICAgJWNoID0gY3Vyc29yIHN0YXJ0aW5nIHNjYW5saW5lCisgKiAgICAgICAgICAgICAgICAgICAgICAlY2wgPSBjdXJzb3IgZW5kaW5nIHNjYW5saW5lCisgKi8KKworY29uc29sZV9jdXJzb3Jfc3RhdGU6CisJLmJ5dGUJMQorY29uc29sZV9jdXJzb3Jfc2hhcGU6CisJLndvcmQJMAorCQorRU5UUlkoY29uc29sZV9zZXRjdXJzb3IpCisJcHVzaAklZWJwCisJcHVzaAklZWJ4CisKKwkvKiBjaGVjayBpZiB0aGUgc3RhbmRhcmQgY3Vyc29yIHNoYXBlIGhhcyBhbHJlYWR5IGJlZW4gc2F2ZWQgKi8KKwltb3Z3CWNvbnNvbGVfY3Vyc29yX3NoYXBlLCAlYXgKKwl0ZXN0dwklYXgsICVheAorCWpuZQkxZgorCisJY2FsbAlFWFRfQyhwcm90X3RvX3JlYWwpCisJLmNvZGUxNgorCisJbW92YgkkMHgwMywgJWFoCisJeG9yYgklYmgsICViaAorCWludAkkMHgxMAorCisJREFUQTMyCWNhbGwJRVhUX0MocmVhbF90b19wcm90KQorCS5jb2RlMzIKKworCW1vdncJJWN4LCBjb25zb2xlX2N1cnNvcl9zaGFwZQorMToKKwkvKiBzZXQgJWN4IHRvIHRoZSBkZXNpZ25hdGVkIGN1cnNvciBzaGFwZSAqLworCW1vdncJJDB4MjAwMCwgJWN4CisJbW92bAkweGMoJWVzcCksICVlYngKKwl0ZXN0bAklZWJ4LCAlZWJ4CisJanoJMmYKKwltb3Z3CWNvbnNvbGVfY3Vyc29yX3NoYXBlLCAlY3gKKzI6CQorCWNhbGwJRVhUX0MocHJvdF90b19yZWFsKQorCS5jb2RlMTYKKworCW1vdmIgICAgJDB4MSwgJWFoCisJaW50ICAgICAkMHgxMCAKKworCURBVEEzMgljYWxsCUVYVF9DKHJlYWxfdG9fcHJvdCkKKwkuY29kZTMyCisKKwltb3Z6YmwJY29uc29sZV9jdXJzb3Jfc3RhdGUsICVlYXgKKwltb3ZiCSVibCwgY29uc29sZV9jdXJzb3Jfc3RhdGUKKwkKKwlwb3AJJWVieAorCXBvcAklZWJwCisJcmV0CisJCQorLyoKKyAqIGdldHJ0c2VjcygpCisgKglpZiBhIHNlY29uZHMgdmFsdWUgY2FuIGJlIHJlYWQsIHJlYWQgaXQgYW5kIHJldHVybiBpdCAoQkNEKSwKKyAqICAgICAgb3RoZXJ3aXNlIHJldHVybiAweEZGCisgKiBCSU9TIGNhbGwgIklOVCAxQUggRnVuY3Rpb24gMDJIIiB0byBjaGVjayB3aGV0aGVyIGEgY2hhcmFjdGVyIGlzIHBlbmRpbmcKKyAqCUNhbGwgd2l0aAklYWggPSAweDIKKyAqCVJldHVybjoKKyAqCQlJZiBSVCBDbG9jayBjYW4gZ2l2ZSBjb3JyZWN0IHZhbHVlcworICoJCQklY2ggPSBob3VyIChCQ0QpCisgKgkJCSVjbCA9IG1pbnV0ZXMgKEJDRCkKKyAqICAgICAgICAgICAgICAgICAgICAgICVkaCA9IHNlY29uZHMgKEJDRCkKKyAqICAgICAgICAgICAgICAgICAgICAgICVkbCA9IGRheWxpZ2h0IHNhdmluZ3MgdGltZSAoMDBoIHN0ZCwgMDFoIGRheWxpZ2h0KQorICoJCQlDYXJyeSBmbGFnID0gY2xlYXIKKyAqCQllbHNlCisgKgkJCUNhcnJ5IGZsYWcgPSBzZXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGluZGljYXRlcyB0aGF0IHRoZSBjbG9jayBpcyB1cGRhdGluZywgb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGl0IGlzbid0IHJ1bm5pbmcpCisgKi8KK0VOVFJZKGdldHJ0c2VjcykKKwlwdXNoCSVlYnAKKworCWNhbGwJRVhUX0MocHJvdF90b19yZWFsKQkvKiBlbnRlciByZWFsIG1vZGUgKi8KKwkuY29kZTE2CisKKwltb3ZiCSQweDIsICVhaAorCWludAkkMHgxYQorCisJREFUQTMyCWpuYwlnb3R0aW1lCisJbW92YgkkMHhmZiwgJWRoCisKK2dvdHRpbWU6CisJREFUQTMyCWNhbGwJRVhUX0MocmVhbF90b19wcm90KQorCS5jb2RlMzIKKworCW1vdmIJJWRoLCAlYWwKKworCXBvcAklZWJwCisJcmV0CisKKwkKKy8qCisgKiBjdXJydGlja3MoKQorICoJcmV0dXJuIHRoZSByZWFsIHRpbWUgaW4gdGlja3MsIG9mIHdoaWNoIHRoZXJlIGFyZSBhYm91dAorICoJMTgtMjAgcGVyIHNlY29uZAorICovCitFTlRSWShjdXJydGlja3MpCisJcHVzaGwJJWVicAorCisJY2FsbAlFWFRfQyhwcm90X3RvX3JlYWwpCS8qIGVudGVyIHJlYWwgbW9kZSAqLworCS5jb2RlMTYKKworCS8qICVheCBpcyBhbHJlYWR5IHplcm8gKi8KKyAgICAgICAgaW50CSQweDFhCisKKwlEQVRBMzIJY2FsbAlFWFRfQyhyZWFsX3RvX3Byb3QpCisJLmNvZGUzMgorCisJbW92bAklZWN4LCAlZWF4CisJc2hsbAkkMTYsICVlYXgKKwltb3Z3CSVkeCwgJWF4CisKKwlwb3BsCSVlYnAKKwlyZXQKKworI2VuZGlmIC8qIFNUQUdFMV81ICovCisKKy8qCisgKiAgVGhpcyBpcyB0aGUgYXJlYSBmb3IgYWxsIG9mIHRoZSBzcGVjaWFsIHZhcmlhYmxlcy4KKyAqLworCisJLnAyYWxpZ24JMgkvKiBmb3JjZSA0LWJ5dGUgYWxpZ25tZW50ICovCisKK3Byb3RzdGFjazoKKwkubG9uZwlQUk9UU1RBQ0tJTklUCisKK1ZBUklBQkxFKGJvb3RfZHJpdmUpCisjaWZkZWYgU1VQUE9SVF9ESVNLTEVTUworCS5sb25nCU5FVFdPUktfRFJJVkUKKyNlbHNlCisJLmxvbmcJMAorI2VuZGlmCisKK1ZBUklBQkxFKGluc3RhbGxfc2Vjb25kX3NlY3RvcikKKwkubG9uZwkwCisJCisJLyogYW4gYWRkcmVzcyBjYW4gb25seSBiZSBsb25nLWp1bXBlZCB0byBpZiBpdCBpcyBpbiBtZW1vcnksIHRoaXMKKwkgICBpcyB1c2VkIGJ5IG11bHRpcGxlIHJvdXRpbmVzICovCitvZmZzZXQ6CisJLmxvbmcJMHg4MDAwCitzZWdtZW50OgorCS53b3JkCTAKKworVkFSSUFCTEUoYXBtX2Jpb3NfaW5mbykKKwkud29yZAkwCS8qIHZlcnNpb24gKi8KKwkud29yZAkwCS8qIGNzZWcgKi8KKwkubG9uZwkwCS8qIG9mZnNldCAqLworCS53b3JkCTAJLyogY3NlZ18xNiAqLworCS53b3JkCTAJLyogZHNlZ18xNiAqLworCS53b3JkCTAJLyogY3NlZ19sZW4gKi8KKwkud29yZAkwCS8qIGNzZWdfMTZfbGVuICovCisJLndvcmQJMAkvKiBkc2VnXzE2X2xlbiAqLworCQorLyoKKyAqIFRoaXMgaXMgdGhlIEdsb2JhbCBEZXNjcmlwdG9yIFRhYmxlCisgKgorICogIEFuIGVudHJ5LCBhICJTZWdtZW50IERlc2NyaXB0b3IiLCBsb29rcyBsaWtlIHRoaXM6CisgKgorICogMzEgICAgICAgICAgMjQgICAgICAgICAxOSAgIDE2ICAgICAgICAgICAgICAgICA3ICAgICAgICAgICAwCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgICAgICAgICAgICAgfCB8QnwgfEF8ICAgICAgIHwgfCAgIHwxfDB8RXxXfEF8ICAgICAgICAgICAgfAorICogfCBCQVNFIDMxLi4yNCB8R3wvfDB8VnwgTElNSVQgfFB8RFBMfCAgVFlQRSAgIHwgQkFTRSAyMzoxNiB8CisgKiB8ICAgICAgICAgICAgIHwgfER8IHxMfCAxOS4uMTZ8IHwgICB8MXwxfEN8UnxBfCAgICAgICAgICAgIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICBCQVNFIDE1Li4wICAgICAgICAgICB8ICAgICAgIExJTUlUIDE1Li4wICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogIE5vdGUgdGhlIG9yZGVyaW5nIG9mIHRoZSBkYXRhIGl0ZW1zIGlzIHJldmVyc2VkIGZyb20gdGhlIGFib3ZlCisgKiAgZGVzY3JpcHRpb24uCisgKi8KKworCS5wMmFsaWduCTIJLyogZm9yY2UgNC1ieXRlIGFsaWdubWVudCAqLworZ2R0OgorCS53b3JkCTAsIDAKKwkuYnl0ZQkwLCAwLCAwLCAwCisKKwkvKiBjb2RlIHNlZ21lbnQgKi8KKwkud29yZAkweEZGRkYsIDAKKwkuYnl0ZQkwLCAweDlBLCAweENGLCAwCisKKwkvKiBkYXRhIHNlZ21lbnQgKi8KKwkud29yZAkweEZGRkYsIDAKKwkuYnl0ZQkwLCAweDkyLCAweENGLCAwCisKKwkvKiAxNiBiaXQgcmVhbCBtb2RlIENTICovCisJLndvcmQJMHhGRkZGLCAwCisJLmJ5dGUJMCwgMHg5RSwgMCwgMAorCisJLyogMTYgYml0IHJlYWwgbW9kZSBEUyAqLworCS53b3JkCTB4RkZGRiwgMAorCS5ieXRlCTAsIDB4OTIsIDAsIDAKKworCisvKiB0aGlzIGlzIHRoZSBHRFQgZGVzY3JpcHRvciAqLworZ2R0ZGVzYzoKKwkud29yZAkweDI3CQkJLyogbGltaXQgKi8KKwkubG9uZwlnZHQJCQkvKiBhZGRyICovCmRpZmYgLS1naXQgYS9zdGFnZTIvYmlvcy5jIGIvc3RhZ2UyL2Jpb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDg1ZTQwCi0tLSAvZGV2L251bGwKKysrIGIvc3RhZ2UyL2Jpb3MuYwpAQCAtMCwwICsxLDMxNyBAQAorLyogYmlvcy5jIC0gaW1wbGVtZW50IEMgcGFydCBvZiBsb3ctbGV2ZWwgQklPUyBkaXNrIGlucHV0IGFuZCBvdXRwdXQgKi8KKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMTk5OSwyMDAwLDIwMDMsMjAwNCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSAic2hhcmVkLmgiCisKKwwKKy8qIFRoZXNlIGFyZSBkZWZpbmVkIGluIGFzbS5TLCBhbmQgbmV2ZXIgYmUgdXNlZCBlbHNld2hlcmUsIHNvIGRlY2xhcmUgdGhlCisgICBwcm90b3R5cGVzIGhlcmUuICAqLworZXh0ZXJuIGludCBiaW9zZGlza19pbnQxM19leHRlbnNpb25zIChpbnQgYXgsIGludCBkcml2ZSwgdm9pZCAqZGFwKTsKK2V4dGVybiBpbnQgYmlvc2Rpc2tfc3RhbmRhcmQgKGludCBhaCwgaW50IGRyaXZlLAorCQkJICAgICAgaW50IGNvZmYsIGludCBob2ZmLCBpbnQgc29mZiwKKwkJCSAgICAgIGludCBuc2VjLCBpbnQgc2VnbWVudCk7CitleHRlcm4gaW50IGNoZWNrX2ludDEzX2V4dGVuc2lvbnMgKGludCBkcml2ZSk7CitleHRlcm4gaW50IGdldF9kaXNraW5mb19zdGFuZGFyZCAoaW50IGRyaXZlLAorCQkJCSAgdW5zaWduZWQgbG9uZyAqY3lsaW5kZXJzLAorCQkJCSAgdW5zaWduZWQgbG9uZyAqaGVhZHMsCisJCQkJICB1bnNpZ25lZCBsb25nICpzZWN0b3JzKTsKKyNpZiAwCitleHRlcm4gaW50IGdldF9kaXNraW5mb19mbG9wcHkgKGludCBkcml2ZSwKKwkJCQl1bnNpZ25lZCBsb25nICpjeWxpbmRlcnMsCisJCQkJdW5zaWduZWQgbG9uZyAqaGVhZHMsCisJCQkJdW5zaWduZWQgbG9uZyAqc2VjdG9ycyk7CisjZW5kaWYKKworDAorLyogUmVhZC93cml0ZSBOU0VDIHNlY3RvcnMgc3RhcnRpbmcgZnJvbSBTRUNUT1IgaW4gRFJJVkUgZGlzayB3aXRoIEdFT01FVFJZCisgICBmcm9tL2ludG8gU0VHTUVOVCBzZWdtZW50LiBJZiBSRUFEIGlzIEJJT1NESVNLX1JFQUQsIHRoZW4gcmVhZCBpdCwKKyAgIGVsc2UgaWYgUkVBRCBpcyBCSU9TRElTS19XUklURSwgdGhlbiB3cml0ZSBpdC4gSWYgYW4gZ2VvbWV0cnkgZXJyb3IKKyAgIG9jY3VycywgcmV0dXJuIEJJT1NESVNLX0VSUk9SX0dFT01FVFJZLCBhbmQgaWYgb3RoZXIgZXJyb3Igb2NjdXJzLCB0aGVuCisgICByZXR1cm4gdGhlIGVycm9yIG51bWJlci4gT3RoZXJ3aXNlLCByZXR1cm4gMC4gICovCitpbnQKK2Jpb3NkaXNrIChpbnQgcmVhZCwgaW50IGRyaXZlLCBzdHJ1Y3QgZ2VvbWV0cnkgKmdlb21ldHJ5LAorCSAgaW50IHNlY3RvciwgaW50IG5zZWMsIGludCBzZWdtZW50KQoreworICBpbnQgZXJyOworICAKKyAgaWYgKGdlb21ldHJ5LT5mbGFncyAmIEJJT1NESVNLX0ZMQUdfTEJBX0VYVEVOU0lPTikKKyAgICB7CisgICAgICBzdHJ1Y3QgZGlza19hZGRyZXNzX3BhY2tldAorICAgICAgeworCXVuc2lnbmVkIGNoYXIgbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQ7CisJdW5zaWduZWQgc2hvcnQgYmxvY2tzOworCXVuc2lnbmVkIGxvbmcgYnVmZmVyOworCXVuc2lnbmVkIGxvbmcgbG9uZyBibG9jazsKKyAgICAgIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGRhcDsKKworICAgICAgLyogWFhYOiBEb24ndCBjaGVjayB0aGUgZ2VvbWV0cnkgYnkgZGVmYXVsdCwgYmVjYXVzZSBzb21lIGJ1Z2d5CisJIEJJT1NlcyBkb24ndCByZXR1cm4gdGhlIG51bWJlciBvZiB0b3RhbCBzZWN0b3JzIGNvcnJlY3RseSwKKwkgZXZlbiBpZiB0aGV5IGhhdmUgd29ya2luZyBMQkEgc3VwcG9ydC4gSGVsbC4gICovCisjaWZkZWYgTk9fQlVHR1lfQklPU19JTl9USEVfV09STEQKKyAgICAgIGlmIChzZWN0b3IgPj0gZ2VvbWV0cnktPnRvdGFsX3NlY3RvcnMpCisJcmV0dXJuIEJJT1NESVNLX0VSUk9SX0dFT01FVFJZOworI2VuZGlmIC8qIE5PX0JVR0dZX0JJT1NfSU5fVEhFX1dPUkxEICovCisKKyAgICAgIC8qIEZJWE1FOiBzaXplb2YgKERBUCkgbXVzdCBiZSAweDEwLiBTaG91bGQgYXNzZXJ0IHRoYXQgdGhlIGNvbXBpbGVyCisJIGNhbid0IGFkZCBhbnkgcGFkZGluZy4gICovCisgICAgICBkYXAubGVuZ3RoID0gc2l6ZW9mIChkYXApOworICAgICAgZGFwLmJsb2NrID0gc2VjdG9yOworICAgICAgZGFwLmJsb2NrcyA9IG5zZWM7CisgICAgICBkYXAucmVzZXJ2ZWQgPSAwOworICAgICAgLyogVGhpcyBpcyB1bmRvY3VtZW50ZWQgcGFydC4gVGhlIGFkZHJlc3MgaXMgZm9ybWF0ZWQgaW4KKwkgU0VHTUVOVDpBRERSRVNTLiAgKi8KKyAgICAgIGRhcC5idWZmZXIgPSBzZWdtZW50IDw8IDE2OworICAgICAgCisgICAgICBlcnIgPSBiaW9zZGlza19pbnQxM19leHRlbnNpb25zICgocmVhZCArIDB4NDIpIDw8IDgsIGRyaXZlLCAmZGFwKTsKKworLyogI3VuZGVmIE5PX0lOVDEzX0ZBTExCQUNLICovCisjaWZuZGVmIE5PX0lOVDEzX0ZBTExCQUNLCisgICAgICBpZiAoZXJyKQorCXsKKwkgIGlmIChnZW9tZXRyeS0+ZmxhZ3MgJiBCSU9TRElTS19GTEFHX0NEUk9NKQorCSAgICByZXR1cm4gZXJyOworCSAgCisJICBnZW9tZXRyeS0+ZmxhZ3MgJj0gfkJJT1NESVNLX0ZMQUdfTEJBX0VYVEVOU0lPTjsKKwkgIGdlb21ldHJ5LT50b3RhbF9zZWN0b3JzID0gKGdlb21ldHJ5LT5jeWxpbmRlcnMKKwkJCQkgICAgICogZ2VvbWV0cnktPmhlYWRzCisJCQkJICAgICAqIGdlb21ldHJ5LT5zZWN0b3JzKTsKKwkgIHJldHVybiBiaW9zZGlzayAocmVhZCwgZHJpdmUsIGdlb21ldHJ5LCBzZWN0b3IsIG5zZWMsIHNlZ21lbnQpOworCX0KKyNlbmRpZiAvKiAhIE5PX0lOVDEzX0ZBTExCQUNLICovCisgICAgICAKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgY3lsaW5kZXJfb2Zmc2V0LCBoZWFkX29mZnNldCwgc2VjdG9yX29mZnNldDsKKyAgICAgIGludCBoZWFkOworCisgICAgICAvKiBTRUNUT1JfT0ZGU0VUIGlzIGNvdW50ZWQgZnJvbSBvbmUsIHdoaWxlIEhFQURfT0ZGU0VUIGFuZAorCSBDWUxJTkRFUl9PRkZTRVQgYXJlIGNvdW50ZWQgZnJvbSB6ZXJvLiAgKi8KKyAgICAgIHNlY3Rvcl9vZmZzZXQgPSBzZWN0b3IgJSBnZW9tZXRyeS0+c2VjdG9ycyArIDE7CisgICAgICBoZWFkID0gc2VjdG9yIC8gZ2VvbWV0cnktPnNlY3RvcnM7CisgICAgICBoZWFkX29mZnNldCA9IGhlYWQgJSBnZW9tZXRyeS0+aGVhZHM7CisgICAgICBjeWxpbmRlcl9vZmZzZXQgPSBoZWFkIC8gZ2VvbWV0cnktPmhlYWRzOworICAgICAgCisgICAgICBpZiAoY3lsaW5kZXJfb2Zmc2V0ID49IGdlb21ldHJ5LT5jeWxpbmRlcnMpCisJcmV0dXJuIEJJT1NESVNLX0VSUk9SX0dFT01FVFJZOworCisgICAgICBlcnIgPSBiaW9zZGlza19zdGFuZGFyZCAocmVhZCArIDB4MDIsIGRyaXZlLAorCQkJICAgICAgIGN5bGluZGVyX29mZnNldCwgaGVhZF9vZmZzZXQsIHNlY3Rvcl9vZmZzZXQsCisJCQkgICAgICAgbnNlYywgc2VnbWVudCk7CisgICAgfQorCisgIHJldHVybiBlcnI7Cit9CisKKy8qIENoZWNrIGJvb3RhYmxlIENELVJPTSBlbXVsYXRpb24gc3RhdHVzLiAgKi8KK3N0YXRpYyBpbnQKK2dldF9jZGluZm8gKGludCBkcml2ZSwgc3RydWN0IGdlb21ldHJ5ICpnZW9tZXRyeSkKK3sKKyAgaW50IGVycjsKKyAgc3RydWN0IGlzb19zcGVjX3BhY2tldAorICB7CisgICAgdW5zaWduZWQgY2hhciBzaXplOworICAgIHVuc2lnbmVkIGNoYXIgbWVkaWFfdHlwZTsKKyAgICB1bnNpZ25lZCBjaGFyIGRyaXZlX25vOworICAgIHVuc2lnbmVkIGNoYXIgY29udHJvbGxlcl9ubzsKKyAgICB1bnNpZ25lZCBsb25nIGltYWdlX2xiYTsKKyAgICB1bnNpZ25lZCBzaG9ydCBkZXZpY2Vfc3BlYzsKKyAgICB1bnNpZ25lZCBzaG9ydCBjYWNoZV9zZWc7CisgICAgdW5zaWduZWQgc2hvcnQgbG9hZF9zZWc7CisgICAgdW5zaWduZWQgc2hvcnQgbGVuZ3RoX3NlYzUxMjsKKyAgICB1bnNpZ25lZCBjaGFyIGN5bGluZGVyczsKKyAgICB1bnNpZ25lZCBjaGFyIHNlY3RvcnM7CisgICAgdW5zaWduZWQgY2hhciBoZWFkczsKKyAgICAKKyAgICB1bnNpZ25lZCBjaGFyIGR1bW15WzE2XTsKKyAgfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgY2RycDsKKyAgCisgIGdydWJfbWVtc2V0ICgmY2RycCwgMCwgc2l6ZW9mIChjZHJwKSk7CisgIGNkcnAuc2l6ZSA9IHNpemVvZiAoY2RycCkgLSBzaXplb2YgKGNkcnAuZHVtbXkpOworICBlcnIgPSBiaW9zZGlza19pbnQxM19leHRlbnNpb25zICgweDRCMDEsIGRyaXZlLCAmY2RycCk7CisgIGlmICghIGVyciAmJiBjZHJwLmRyaXZlX25vID09IGRyaXZlKQorICAgIHsKKyAgICAgIGlmICgoY2RycC5tZWRpYV90eXBlICYgMHgwRikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIE5vIGVtdWxhdGlvbiBib290YWJsZSBDRC1ST00gKi8KKyAgICAgICAgICBnZW9tZXRyeS0+ZmxhZ3MgPSBCSU9TRElTS19GTEFHX0xCQV9FWFRFTlNJT04gfCBCSU9TRElTS19GTEFHX0NEUk9NOworICAgICAgICAgIGdlb21ldHJ5LT5jeWxpbmRlcnMgPSAwOworICAgICAgICAgIGdlb21ldHJ5LT5oZWFkcyA9IDE7CisgICAgICAgICAgZ2VvbWV0cnktPnNlY3RvcnMgPSAxNTsKKyAgICAgICAgICBnZW9tZXRyeS0+c2VjdG9yX3NpemUgPSAyMDQ4OworICAgICAgICAgIGdlb21ldHJ5LT50b3RhbF9zZWN0b3JzID0gTUFYSU5UOworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKwkgIC8qIEZsb3BweSBvciBoYXJkLWRpc2sgZW11bGF0aW9uICovCisgICAgICAgICAgZ2VvbWV0cnktPmN5bGluZGVycworCSAgICA9ICgodW5zaWduZWQgaW50KSBjZHJwLmN5bGluZGVycworCSAgICAgICArICgoKHVuc2lnbmVkIGludCkgKGNkcnAuc2VjdG9ycyAmIDB4QzApKSA8PCAyKSk7CisgICAgICAgICAgZ2VvbWV0cnktPmhlYWRzID0gY2RycC5oZWFkczsKKyAgICAgICAgICBnZW9tZXRyeS0+c2VjdG9ycyA9IGNkcnAuc2VjdG9ycyAmIDB4M0Y7CisgICAgICAgICAgZ2VvbWV0cnktPnNlY3Rvcl9zaXplID0gU0VDVE9SX1NJWkU7CisgICAgICAgICAgZ2VvbWV0cnktPnRvdGFsX3NlY3RvcnMgPSAoZ2VvbWV0cnktPmN5bGluZGVycworCQkJCSAgICAgKiBnZW9tZXRyeS0+aGVhZHMKKwkJCQkgICAgICogZ2VvbWV0cnktPnNlY3RvcnMpOworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiB0aGUgZ2VvbWV0cnkgb2YgRFJJVkUgaW4gR0VPTUVUUlkuIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJuCisgICBub24temVybywgb3RoZXJ3aXNlIHplcm8uICAqLworaW50CitnZXRfZGlza2luZm8gKGludCBkcml2ZSwgc3RydWN0IGdlb21ldHJ5ICpnZW9tZXRyeSkKK3sKKyAgaW50IGVycjsKKworICAvKiBDbGVhciB0aGUgZmxhZ3MuICAqLworICBnZW9tZXRyeS0+ZmxhZ3MgPSAwOworICAKKyAgaWYgKGRyaXZlICYgMHg4MCkKKyAgICB7CisgICAgICAvKiBoYXJkIGRpc2sgb3IgQ0QtUk9NICovCisgICAgICBpbnQgdmVyc2lvbjsKKyAgICAgIHVuc2lnbmVkIGxvbmcgdG90YWxfc2VjdG9ycyA9IDA7CisgICAgICAKKyAgICAgIHZlcnNpb24gPSBjaGVja19pbnQxM19leHRlbnNpb25zIChkcml2ZSk7CisKKyAgICAgIGlmIChkcml2ZSA+PSAweDg4IHx8IHZlcnNpb24pCisJeworCSAgLyogUG9zc2libGUgQ0QtUk9NIC0gY2hlY2sgdGhlIHN0YXR1cy4gICovCisJICBpZiAoZ2V0X2NkaW5mbyAoZHJpdmUsIGdlb21ldHJ5KSkKKwkgICAgcmV0dXJuIDA7CisJfQorICAgICAgCisgICAgICBpZiAodmVyc2lvbikKKwl7CisJICBzdHJ1Y3QgZHJpdmVfcGFyYW1ldGVycworCSAgeworCSAgICB1bnNpZ25lZCBzaG9ydCBzaXplOworCSAgICB1bnNpZ25lZCBzaG9ydCBmbGFnczsKKwkgICAgdW5zaWduZWQgbG9uZyBjeWxpbmRlcnM7CisJICAgIHVuc2lnbmVkIGxvbmcgaGVhZHM7CisJICAgIHVuc2lnbmVkIGxvbmcgc2VjdG9yczsKKwkgICAgdW5zaWduZWQgbG9uZyBsb25nIHRvdGFsX3NlY3RvcnM7CisJICAgIHVuc2lnbmVkIHNob3J0IGJ5dGVzX3Blcl9zZWN0b3I7CisJICAgIC8qIHZlciAyLjAgb3IgaGlnaGVyICovCisJICAgIHVuc2lnbmVkIGxvbmcgRUREX2NvbmZpZ3VyYXRpb25fcGFyYW1ldGVyczsKKwkgICAgLyogdmVyIDMuMCBvciBoaWdoZXIgKi8KKwkgICAgdW5zaWduZWQgc2hvcnQgc2lnbmF0dXJlX2RwaTsKKwkgICAgdW5zaWduZWQgY2hhciBsZW5ndGhfZHBpOworCSAgICB1bnNpZ25lZCBjaGFyIHJlc2VydmVkWzNdOworCSAgICB1bnNpZ25lZCBjaGFyIG5hbWVfb2ZfaG9zdF9idXNbNF07CisJICAgIHVuc2lnbmVkIGNoYXIgbmFtZV9vZl9pbnRlcmZhY2VfdHlwZVs4XTsKKwkgICAgdW5zaWduZWQgY2hhciBpbnRlcmZhY2VfcGF0aFs4XTsKKwkgICAgdW5zaWduZWQgY2hhciBkZXZpY2VfcGF0aFs4XTsKKwkgICAgdW5zaWduZWQgY2hhciByZXNlcnZlZDI7CisJICAgIHVuc2lnbmVkIGNoYXIgY2hlY2tzdW07CisKKwkgICAgLyogWFhYOiBUaGlzIGlzIG5lY2Vzc2FyeSwgYmVjYXVzZSB0aGUgQklPUyBvZiBUaGlua3BhZCBYMjAKKwkgICAgICAgd3JpdGVzIGEgZ2FyYmFnZSB0byB0aGUgdGFpbCBvZiBkcml2ZSBwYXJhbWV0ZXJzLAorCSAgICAgICByZWdhcmRsZXNzIG9mIGEgc2l6ZSBzcGVjaWZpZWQgaW4gYSBjYWxsZXIuICAqLworCSAgICB1bnNpZ25lZCBjaGFyIGR1bW15WzE2XTsKKwkgIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGRycDsKKworCSAgLyogSXQgaXMgc2FmZSB0byBjbGVhciBvdXQgRFJQLiAgKi8KKwkgIGdydWJfbWVtc2V0ICgmZHJwLCAwLCBzaXplb2YgKGRycCkpOworCSAgCisJICAvKiBQaG9lbml4QklPUyA0LjAgUmV2aXNpb24gNi4wIGZvciBaRiBNaWNybyBtaWdodCB1bmRlcnN0YW5kIAorCSAgICAgdGhlIGdyZWF0ZXIgYnVmZmVyIHNpemUgZm9yIHRoZSAiZ2V0IGRyaXZlIHBhcmFtZXRlcnMiIGludCAKKwkgICAgIDB4MTMgY2FsbCBpbiBpdHMgb3duIHdheS4gIFN1cHBvc2VkbHkgdGhlIEJJT1MgYXNzdW1lcyBldmVuIAorCSAgICAgYmlnZ2VyIHNwYWNlIGlzIGF2YWlsYWJsZSBhbmQgdGh1cyBjb3JydXB0cyB0aGUgc3RhY2suICAKKwkgICAgIFRoaXMgaXMgd2h5IHdlIHNwZWNpZnkgdGhlIGV4YWN0bHkgbmVjZXNzYXJ5IHNpemUgb2YgMHg0MiAKKwkgICAgIGJ5dGVzLiAqLworCSAgZHJwLnNpemUgPSBzaXplb2YgKGRycCkgLSBzaXplb2YgKGRycC5kdW1teSk7CisJICAKKwkgIGVyciA9IGJpb3NkaXNrX2ludDEzX2V4dGVuc2lvbnMgKDB4NDgwMCwgZHJpdmUsICZkcnApOworCSAgaWYgKCEgZXJyKQorCSAgICB7CisJICAgICAgLyogU2V0IHRoZSBMQkEgZmxhZy4gICovCisJICAgICAgZ2VvbWV0cnktPmZsYWdzID0gQklPU0RJU0tfRkxBR19MQkFfRVhURU5TSU9OOworCisJICAgICAgLyogSSdtIG5vdCBzdXJlIGlmIEdSVUIgc2hvdWxkIGNoZWNrIHRoZSBiaXQgMSBvZiBEUlAuRkxBR1MsCisJCSBzbyBJIG9taXQgdGhlIGNoZWNrIGZvciBub3cuIC0gb2t1amkgICovCisJICAgICAgLyogaWYgKGRycC5mbGFncyAmICgxIDw8IDEpKSAqLworCSAgICAgICAKKwkgICAgICAvKiBGSVhNRTogd2hlbiB0aGUgMlRCIGxpbWl0IGJlY29tZXMgY3JpdGljYWwsIHdlIG11c3QKKwkJIGNoYW5nZSB0aGUgdHlwZSBvZiBUT1RBTF9TRUNUT1JTIHRvIHVuc2lnbmVkIGxvbmcKKwkJIGxvbmcuICAqLworCSAgICAgIGlmIChkcnAudG90YWxfc2VjdG9ycykKKwkJdG90YWxfc2VjdG9ycyA9IGRycC50b3RhbF9zZWN0b3JzICYgfjBMOworCSAgICAgIGVsc2UKKwkJLyogU29tZSBidWdneSBCSU9TZXMgZG9lc24ndCByZXR1cm4gdGhlIHRvdGFsIHNlY3RvcnMKKwkJICAgY29ycmVjdGx5IGJ1dCByZXR1cm5zIHplcm8uIFNvIGlmIGl0IGlzIHplcm8sIGNvbXB1dGUKKwkJICAgaXQgYnkgQy9IL1MgcmV0dXJuZWQgYnkgdGhlIExCQSBCSU9TIGNhbGwuICAqLworCQl0b3RhbF9zZWN0b3JzID0gZHJwLmN5bGluZGVycyAqIGRycC5oZWFkcyAqIGRycC5zZWN0b3JzOworCSAgICB9CisJfQorCisgICAgICAvKiBEb24ndCBwYXNzIEdFT01FVFJZIGRpcmVjdGx5LCBidXQgcGFzcyBlYWNoIGVsZW1lbnQgaW5zdGVhZCwKKwkgc28gdGhhdCB3ZSBjYW4gY2hhbmdlIHRoZSBzdHJ1Y3R1cmUgZWFzaWx5LiAgKi8KKyAgICAgIGVyciA9IGdldF9kaXNraW5mb19zdGFuZGFyZCAoZHJpdmUsCisJCQkJICAgJmdlb21ldHJ5LT5jeWxpbmRlcnMsCisJCQkJICAgJmdlb21ldHJ5LT5oZWFkcywKKwkJCQkgICAmZ2VvbWV0cnktPnNlY3RvcnMpOworICAgICAgaWYgKGVycikKKwlyZXR1cm4gZXJyOworCisgICAgICBpZiAoISB0b3RhbF9zZWN0b3JzKQorCXsKKwkgIHRvdGFsX3NlY3RvcnMgPSAoZ2VvbWV0cnktPmN5bGluZGVycworCQkJICAgKiBnZW9tZXRyeS0+aGVhZHMKKwkJCSAgICogZ2VvbWV0cnktPnNlY3RvcnMpOworCX0KKyAgICAgIGdlb21ldHJ5LT50b3RhbF9zZWN0b3JzID0gdG90YWxfc2VjdG9yczsKKyAgICAgIGdlb21ldHJ5LT5zZWN0b3Jfc2l6ZSA9IFNFQ1RPUl9TSVpFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIGZsb3BweSBkaXNrICovCisKKyAgICAgIC8qIEZpcnN0LCB0cnkgSU5UIDEzIEFIPThoIGNhbGwuICAqLworICAgICAgZXJyID0gZ2V0X2Rpc2tpbmZvX3N0YW5kYXJkIChkcml2ZSwKKwkJCQkgICAmZ2VvbWV0cnktPmN5bGluZGVycywKKwkJCQkgICAmZ2VvbWV0cnktPmhlYWRzLAorCQkJCSAgICZnZW9tZXRyeS0+c2VjdG9ycyk7CisKKyNpZiAwCisgICAgICAvKiBJZiBmYWlscywgdGhlbiB0cnkgZmxvcHB5LXNwZWNpZmljIHByb2JlIHJvdXRpbmUuICAqLworICAgICAgaWYgKGVycikKKwllcnIgPSBnZXRfZGlza2luZm9fZmxvcHB5IChkcml2ZSwKKwkJCQkgICAmZ2VvbWV0cnktPmN5bGluZGVycywKKwkJCQkgICAmZ2VvbWV0cnktPmhlYWRzLAorCQkJCSAgICZnZW9tZXRyeS0+c2VjdG9ycyk7CisjZW5kaWYKKyAgICAgIAorICAgICAgaWYgKGVycikKKwlyZXR1cm4gZXJyOworCisgICAgICBnZW9tZXRyeS0+dG90YWxfc2VjdG9ycyA9IChnZW9tZXRyeS0+Y3lsaW5kZXJzCisJCQkJICogZ2VvbWV0cnktPmhlYWRzCisJCQkJICogZ2VvbWV0cnktPnNlY3RvcnMpOworICAgICAgZ2VvbWV0cnktPnNlY3Rvcl9zaXplID0gU0VDVE9SX1NJWkU7CisgICAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3RhZ2UyL2Jvb3QuYyBiL3N0YWdlMi9ib290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE4NWQyMwotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMi9ib290LmMKQEAgLTAsMCArMSwxMDIwIEBACisvKiBib290LmMgLSBsb2FkIGFuZCBib290c3RyYXAgYSBrZXJuZWwgKi8KKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDAzLDIwMDQgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworCisjaW5jbHVkZSAic2hhcmVkLmgiCisKKyNpbmNsdWRlICJmcmVlYnNkLmgiCisjaW5jbHVkZSAiaW1nYWN0X2FvdXQuaCIKKyNpbmNsdWRlICJpMzg2LWVsZi5oIgorCitzdGF0aWMgaW50IGN1cl9hZGRyOworZW50cnlfZnVuYyBlbnRyeV9hZGRyOworc3RhdGljIHN0cnVjdCBtb2RfbGlzdCBtbGxbOTldOworc3RhdGljIGludCBsaW51eF9tZW1fc2l6ZTsKKworLyoKKyAqICBUaGUgbmV4dCB0d28gZnVuY3Rpb25zLCAnbG9hZF9pbWFnZScgYW5kICdsb2FkX21vZHVsZScsIGFyZSB0aGUgYnVpbGRpbmcKKyAqICBibG9ja3Mgb2YgdGhlIG11bHRpYm9vdCBsb2FkZXIgY29tcG9uZW50LiAgVGhleSBoYW5kbGUgZXNzZW50aWFsbHkgYWxsCisgKiAgb2YgdGhlIGdvcnkgZGV0YWlscyBvZiBsb2FkaW5nIGluIGEgYm9vdGFibGUgaW1hZ2UgYW5kIHRoZSBtb2R1bGVzLgorICovCisKK2tlcm5lbF90Citsb2FkX2ltYWdlIChjaGFyICprZXJuZWwsIGNoYXIgKmFyZywga2VybmVsX3Qgc3VnZ2VzdGVkX3R5cGUsCisJICAgIHVuc2lnbmVkIGxvbmcgbG9hZF9mbGFncykKK3sKKyAgaW50IGxlbiwgaSwgZXhlY190eXBlID0gMCwgYWxpZ25fNGsgPSAxOworICBlbnRyeV9mdW5jIHJlYWxfZW50cnlfYWRkciA9IDA7CisgIGtlcm5lbF90IHR5cGUgPSBLRVJORUxfVFlQRV9OT05FOworICB1bnNpZ25lZCBsb25nIGZsYWdzID0gMCwgdGV4dF9sZW4gPSAwLCBkYXRhX2xlbiA9IDAsIGJzc19sZW4gPSAwOworICBjaGFyICpzdHIgPSAwLCAqc3RyMiA9IDA7CisgIHN0cnVjdCBsaW51eF9rZXJuZWxfaGVhZGVyICpsaDsKKyAgdW5pb24KKyAgICB7CisgICAgICBzdHJ1Y3QgbXVsdGlib290X2hlYWRlciAqbWI7CisgICAgICBzdHJ1Y3QgZXhlYyAqYW91dDsKKyAgICAgIEVsZjMyX0VoZHIgKmVsZjsKKyAgICB9CisgIHB1OworICAvKiBwcmVzdW1pbmcgdGhhdCBNVUxUSUJPT1RfU0VBUkNIIGlzIGxhcmdlIGVub3VnaCB0byBlbmNvbXBhc3MgYW4KKyAgICAgZXhlY3V0YWJsZSBoZWFkZXIgKi8KKyAgdW5zaWduZWQgY2hhciBidWZmZXJbTVVMVElCT09UX1NFQVJDSF07CisKKyAgLyogc2V0cyB0aGUgaGVhZGVyIHBvaW50ZXIgdG8gcG9pbnQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgICAgYnVmZmVyIGJ5IGRlZmF1bHQgKi8KKyAgcHUuYW91dCA9IChzdHJ1Y3QgZXhlYyAqKSBidWZmZXI7CisKKyAgaWYgKCFncnViX29wZW4gKGtlcm5lbCkpCisgICAgcmV0dXJuIEtFUk5FTF9UWVBFX05PTkU7CisKKyAgaWYgKCEobGVuID0gZ3J1Yl9yZWFkIChidWZmZXIsIE1VTFRJQk9PVF9TRUFSQ0gpKSB8fCBsZW4gPCAzMikKKyAgICB7CisgICAgICBncnViX2Nsb3NlICgpOworICAgICAgCisgICAgICBpZiAoIWVycm51bSkKKwllcnJudW0gPSBFUlJfRVhFQ19GT1JNQVQ7CisKKyAgICAgIHJldHVybiBLRVJORUxfVFlQRV9OT05FOworICAgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgeworICAgICAgaWYgKE1VTFRJQk9PVF9GT1VORCAoKGludCkgKGJ1ZmZlciArIGkpLCBsZW4gLSBpKSkKKwl7CisJICBmbGFncyA9ICgoc3RydWN0IG11bHRpYm9vdF9oZWFkZXIgKikgKGJ1ZmZlciArIGkpKS0+ZmxhZ3M7CisJICBpZiAoZmxhZ3MgJiBNVUxUSUJPT1RfVU5TVVBQT1JURUQpCisJICAgIHsKKwkgICAgICBncnViX2Nsb3NlICgpOworCSAgICAgIGVycm51bSA9IEVSUl9CT09UX0ZFQVRVUkVTOworCSAgICAgIHJldHVybiBLRVJORUxfVFlQRV9OT05FOworCSAgICB9CisJICB0eXBlID0gS0VSTkVMX1RZUEVfTVVMVElCT09UOworCSAgc3RyMiA9ICJNdWx0aWJvb3QiOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICAvKiBVc2UgQlVGRkVSIGFzIGEgbGludXgga2VybmVsIGhlYWRlciwgaWYgdGhlIGltYWdlIGlzIExpbnV4IHpJbWFnZQorICAgICBvciBiekltYWdlLiAgKi8KKyAgbGggPSAoc3RydWN0IGxpbnV4X2tlcm5lbF9oZWFkZXIgKikgYnVmZmVyOworICAKKyAgLyogRUxGIGxvYWRpbmcgc3VwcG9ydGVkIGlmIG11bHRpYm9vdCwgRnJlZUJTRCBhbmQgTmV0QlNELiAgKi8KKyAgaWYgKCh0eXBlID09IEtFUk5FTF9UWVBFX01VTFRJQk9PVAorICAgICAgIHx8IHB1LmVsZi0+ZV9pZGVudFtFSV9PU0FCSV0gPT0gRUxGT1NBQklfRlJFRUJTRAorICAgICAgIHx8IGdydWJfc3RyY21wIChwdS5lbGYtPmVfaWRlbnQgKyBFSV9CUkFORCwgIkZyZWVCU0QiKSA9PSAwCisgICAgICAgfHwgc3VnZ2VzdGVkX3R5cGUgPT0gS0VSTkVMX1RZUEVfTkVUQlNEKQorICAgICAgJiYgbGVuID4gc2l6ZW9mIChFbGYzMl9FaGRyKQorICAgICAgJiYgQk9PVEFCTEVfSTM4Nl9FTEYgKCgqKChFbGYzMl9FaGRyICopIGJ1ZmZlcikpKSkKKyAgICB7CisgICAgICBpZiAodHlwZSA9PSBLRVJORUxfVFlQRV9NVUxUSUJPT1QpCisJZW50cnlfYWRkciA9IChlbnRyeV9mdW5jKSBwdS5lbGYtPmVfZW50cnk7CisgICAgICBlbHNlCisJZW50cnlfYWRkciA9IChlbnRyeV9mdW5jKSAocHUuZWxmLT5lX2VudHJ5ICYgMHhGRkZGRkYpOworCisgICAgICBpZiAoZW50cnlfYWRkciA8IChlbnRyeV9mdW5jKSAweDEwMDAwMCkKKwllcnJudW0gPSBFUlJfQkVMT1dfMU1COworCisgICAgICAvKiBkb24ndCB3YW50IHRvIGRlYWwgd2l0aCBFTEYgcHJvZ3JhbSBoZWFkZXIgYXQgc29tZSByYW5kb20KKyAgICAgICAgIHBsYWNlIGluIHRoZSBmaWxlIC0tIHRoaXMgZ2VuZXJhbGx5IHdvbid0IGhhcHBlbiAqLworICAgICAgaWYgKHB1LmVsZi0+ZV9waG9mZiA9PSAwIHx8IHB1LmVsZi0+ZV9waG51bSA9PSAwCisJICB8fCAoKHB1LmVsZi0+ZV9waG9mZiArIChwdS5lbGYtPmVfcGhlbnRzaXplICogcHUuZWxmLT5lX3BobnVtKSkKKwkgICAgICA+PSBsZW4pKQorCWVycm51bSA9IEVSUl9FWEVDX0ZPUk1BVDsKKyAgICAgIHN0ciA9ICJlbGYiOworCisgICAgICBpZiAodHlwZSA9PSBLRVJORUxfVFlQRV9OT05FKQorCXsKKwkgIC8qIEF0IHRoZSBtb21lbnQsIHRoZXJlIGlzIG5vIHdheSB0byBpZGVudGlmeSBhIE5ldEJTRCBFTEYKKwkgICAgIGtlcm5lbCwgc28gcmVseSBvbiB0aGUgc3VnZ2VzdGVkIHR5cGUgYnkgdGhlIHVzZXIuICAqLworCSAgaWYgKHN1Z2dlc3RlZF90eXBlID09IEtFUk5FTF9UWVBFX05FVEJTRCkKKwkgICAgeworCSAgICAgIHN0cjIgPSAiTmV0QlNEIjsKKwkgICAgICB0eXBlID0gc3VnZ2VzdGVkX3R5cGU7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHN0cjIgPSAiRnJlZUJTRCI7CisJICAgICAgdHlwZSA9IEtFUk5FTF9UWVBFX0ZSRUVCU0Q7CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlIGlmIChmbGFncyAmIE1VTFRJQk9PVF9BT1VUX0tMVURHRSkKKyAgICB7CisgICAgICBwdS5tYiA9IChzdHJ1Y3QgbXVsdGlib290X2hlYWRlciAqKSAoYnVmZmVyICsgaSk7CisgICAgICBlbnRyeV9hZGRyID0gKGVudHJ5X2Z1bmMpIHB1Lm1iLT5lbnRyeV9hZGRyOworICAgICAgY3VyX2FkZHIgPSBwdS5tYi0+bG9hZF9hZGRyOworICAgICAgLyogZmlyc3Qgb2Zmc2V0IGludG8gZmlsZSAqLworICAgICAgZ3J1Yl9zZWVrIChpIC0gKHB1Lm1iLT5oZWFkZXJfYWRkciAtIGN1cl9hZGRyKSk7CisKKyAgICAgIC8qIElmIHRoZSBsb2FkIGVuZCBhZGRyZXNzIGlzIHplcm8sIGxvYWQgdGhlIHdob2xlIGNvbnRlbnRzLiAgKi8KKyAgICAgIGlmICghIHB1Lm1iLT5sb2FkX2VuZF9hZGRyKQorCXB1Lm1iLT5sb2FkX2VuZF9hZGRyID0gY3VyX2FkZHIgKyBmaWxlbWF4OworICAgICAgCisgICAgICB0ZXh0X2xlbiA9IHB1Lm1iLT5sb2FkX2VuZF9hZGRyIC0gY3VyX2FkZHI7CisgICAgICBkYXRhX2xlbiA9IDA7CisKKyAgICAgIC8qIElmIHRoZSBic3MgZW5kIGFkZHJlc3MgaXMgemVybywgYXNzdW1lIHRoYXQgdGhlcmUgaXMgbm8gYnNzIGFyZWEuICAqLworICAgICAgaWYgKCEgcHUubWItPmJzc19lbmRfYWRkcikKKwlwdS5tYi0+YnNzX2VuZF9hZGRyID0gcHUubWItPmxvYWRfZW5kX2FkZHI7CisgICAgICAKKyAgICAgIGJzc19sZW4gPSBwdS5tYi0+YnNzX2VuZF9hZGRyIC0gcHUubWItPmxvYWRfZW5kX2FkZHI7CisKKyAgICAgIGlmIChwdS5tYi0+aGVhZGVyX2FkZHIgPCBwdS5tYi0+bG9hZF9hZGRyCisJICB8fCBwdS5tYi0+bG9hZF9lbmRfYWRkciA8PSBwdS5tYi0+bG9hZF9hZGRyCisJICB8fCBwdS5tYi0+YnNzX2VuZF9hZGRyIDwgcHUubWItPmxvYWRfZW5kX2FkZHIKKwkgIHx8IChwdS5tYi0+aGVhZGVyX2FkZHIgLSBwdS5tYi0+bG9hZF9hZGRyKSA+IGkpCisJZXJybnVtID0gRVJSX0VYRUNfRk9STUFUOworCisgICAgICBpZiAoY3VyX2FkZHIgPCAweDEwMDAwMCkKKwllcnJudW0gPSBFUlJfQkVMT1dfMU1COworCisgICAgICBwdS5hb3V0ID0gKHN0cnVjdCBleGVjICopIGJ1ZmZlcjsKKyAgICAgIGV4ZWNfdHlwZSA9IDI7CisgICAgICBzdHIgPSAia2x1ZGdlIjsKKyAgICB9CisgIGVsc2UgaWYgKGxlbiA+IHNpemVvZiAoc3RydWN0IGV4ZWMpICYmICFOX0JBRE1BRyAoKCoocHUuYW91dCkpKSkKKyAgICB7CisgICAgICBlbnRyeV9hZGRyID0gKGVudHJ5X2Z1bmMpIHB1LmFvdXQtPmFfZW50cnk7CisKKyAgICAgIGlmICh0eXBlID09IEtFUk5FTF9UWVBFX05PTkUpCisJeworCSAgLyoKKwkgICAqICBJZiBpdCBkb2Vzbid0IGhhdmUgYSBNdWx0aWJvb3QgaGVhZGVyLCB0aGVuIHByZXN1bWUKKwkgICAqICBpdCBpcyBlaXRoZXIgYSBGcmVlQlNEIG9yIE5ldEJTRCBleGVjdXRhYmxlLiAgSWYgc28sCisJICAgKiAgdGhlbiB1c2UgYSBtYWdpYyBudW1iZXIgb2Ygbm9ybWFsIG9yZGVyaW5nLCBaTUFHSUMgdG8KKwkgICAqICBkZXRlcm1pbmUgaWYgaXQgaXMgRnJlZUJTRC4KKwkgICAqCisJICAgKiAgVGhpcyBpcyBhbGwgYmVjYXVzZSBmcmVlYnNkIGFuZCBuZXRic2Qgc2VlbSB0byByZXF1aXJlCisJICAgKiAgbWFza2luZyBvdXQgc29tZSBhZGRyZXNzIGJpdHMuLi4gIGRpZmZlcmVudGx5IGZvciBlYWNoCisJICAgKiAgb25lLi4uICBwbHVzIG9mIGNvdXJzZSB3ZSBuZWVkIHRvIGtub3cgd2hpY2ggYm9vdGluZworCSAgICogIG1ldGhvZCB0byB1c2UuCisJICAgKi8KKwkgIGVudHJ5X2FkZHIgPSAoZW50cnlfZnVuYykgKChpbnQpIGVudHJ5X2FkZHIgJiAweEZGRkZGRik7CisJICAKKwkgIGlmIChidWZmZXJbMF0gPT0gMHhiICYmIGJ1ZmZlclsxXSA9PSAxKQorCSAgICB7CisJICAgICAgdHlwZSA9IEtFUk5FTF9UWVBFX0ZSRUVCU0Q7CisJICAgICAgY3VyX2FkZHIgPSAoaW50KSBlbnRyeV9hZGRyOworCSAgICAgIHN0cjIgPSAiRnJlZUJTRCI7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHR5cGUgPSBLRVJORUxfVFlQRV9ORVRCU0Q7CisJICAgICAgY3VyX2FkZHIgPSAoaW50KSBlbnRyeV9hZGRyICYgMHhGMDAwMDA7CisJICAgICAgaWYgKE5fR0VUTUFHSUMgKCgqKHB1LmFvdXQpKSkgIT0gTk1BR0lDKQorCQlhbGlnbl80ayA9IDA7CisJICAgICAgc3RyMiA9ICJOZXRCU0QiOworCSAgICB9CisJfQorCisgICAgICAvKiBmaXJzdCBvZmZzZXQgaW50byBmaWxlICovCisgICAgICBncnViX3NlZWsgKE5fVFhUT0ZGICgqKHB1LmFvdXQpKSk7CisgICAgICB0ZXh0X2xlbiA9IHB1LmFvdXQtPmFfdGV4dDsKKyAgICAgIGRhdGFfbGVuID0gcHUuYW91dC0+YV9kYXRhOworICAgICAgYnNzX2xlbiA9IHB1LmFvdXQtPmFfYnNzOworCisgICAgICBpZiAoY3VyX2FkZHIgPCAweDEwMDAwMCkKKwllcnJudW0gPSBFUlJfQkVMT1dfMU1COworCisgICAgICBleGVjX3R5cGUgPSAxOworICAgICAgc3RyID0gImEub3V0IjsKKyAgICB9CisgIGVsc2UgaWYgKGxoLT5ib290X2ZsYWcgPT0gQk9PVFNFQ19TSUdOQVRVUkUKKwkgICAmJiBsaC0+c2V0dXBfc2VjdHMgPD0gTElOVVhfTUFYX1NFVFVQX1NFQ1RTKQorICAgIHsKKyAgICAgIGludCBiaWdfbGludXggPSAwOworICAgICAgaW50IHNldHVwX3NlY3RzID0gbGgtPnNldHVwX3NlY3RzOworCisgICAgICBpZiAobGgtPmhlYWRlciA9PSBMSU5VWF9NQUdJQ19TSUdOQVRVUkUgJiYgbGgtPnZlcnNpb24gPj0gMHgwMjAwKQorCXsKKwkgIGJpZ19saW51eCA9IChsaC0+bG9hZGZsYWdzICYgTElOVVhfRkxBR19CSUdfS0VSTkVMKTsKKwkgIGxoLT50eXBlX29mX2xvYWRlciA9IExJTlVYX0JPT1RfTE9BREVSX1RZUEU7CisKKwkgIC8qIFB1dCB0aGUgcmVhbCBtb2RlIHBhcnQgYXQgYXMgYSBoaWdoIGxvY2F0aW9uIGFzIHBvc3NpYmxlLiAgKi8KKwkgIGxpbnV4X2RhdGFfcmVhbF9hZGRyCisJICAgID0gKGNoYXIgKikgKChtYmkubWVtX2xvd2VyIDw8IDEwKSAtIExJTlVYX1NFVFVQX01PVkVfU0laRSk7CisJICAvKiBCdXQgaXQgbXVzdCBub3QgZXhjZWVkIHRoZSB0cmFkaXRpb25hbCBhcmVhLiAgKi8KKwkgIGlmIChsaW51eF9kYXRhX3JlYWxfYWRkciA+IChjaGFyICopIExJTlVYX09MRF9SRUFMX01PREVfQUREUikKKwkgICAgbGludXhfZGF0YV9yZWFsX2FkZHIgPSAoY2hhciAqKSBMSU5VWF9PTERfUkVBTF9NT0RFX0FERFI7CisKKwkgIGlmIChsaC0+dmVyc2lvbiA+PSAweDAyMDEpCisJICAgIHsKKwkgICAgICBsaC0+aGVhcF9lbmRfcHRyID0gTElOVVhfSEVBUF9FTkRfT0ZGU0VUOworCSAgICAgIGxoLT5sb2FkZmxhZ3MgfD0gTElOVVhfRkxBR19DQU5fVVNFX0hFQVA7CisJICAgIH0KKworCSAgaWYgKGxoLT52ZXJzaW9uID49IDB4MDIwMikKKwkgICAgbGgtPmNtZF9saW5lX3B0ciA9IGxpbnV4X2RhdGFfcmVhbF9hZGRyICsgTElOVVhfQ0xfT0ZGU0VUOworCSAgZWxzZQorCSAgICB7CisJICAgICAgbGgtPmNsX21hZ2ljID0gTElOVVhfQ0xfTUFHSUM7CisJICAgICAgbGgtPmNsX29mZnNldCA9IExJTlVYX0NMX09GRlNFVDsKKwkgICAgICBsaC0+c2V0dXBfbW92ZV9zaXplID0gTElOVVhfU0VUVVBfTU9WRV9TSVpFOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFlvdXIga2VybmVsIGlzIHF1aXRlIG9sZC4uLiAgKi8KKwkgIGxoLT5jbF9tYWdpYyA9IExJTlVYX0NMX01BR0lDOworCSAgbGgtPmNsX29mZnNldCA9IExJTlVYX0NMX09GRlNFVDsKKwkgIAorCSAgc2V0dXBfc2VjdHMgPSBMSU5VWF9ERUZBVUxUX1NFVFVQX1NFQ1RTOworCisJICBsaW51eF9kYXRhX3JlYWxfYWRkciA9IChjaGFyICopIExJTlVYX09MRF9SRUFMX01PREVfQUREUjsKKwl9CisgICAgICAKKyAgICAgIC8qIElmIFNFVFVQX1NFQ1RTIGlzIG5vdCBzZXQsIHNldCBpdCB0byB0aGUgZGVmYXVsdCAoNCkuICAqLworICAgICAgaWYgKCEgc2V0dXBfc2VjdHMpCisJc2V0dXBfc2VjdHMgPSBMSU5VWF9ERUZBVUxUX1NFVFVQX1NFQ1RTOworCisgICAgICBkYXRhX2xlbiA9IHNldHVwX3NlY3RzIDw8IDk7CisgICAgICB0ZXh0X2xlbiA9IGZpbGVtYXggLSBkYXRhX2xlbiAtIFNFQ1RPUl9TSVpFOworCisgICAgICBsaW51eF9kYXRhX3RtcF9hZGRyID0gKGNoYXIgKikgTElOVVhfQlpJTUFHRV9BRERSICsgdGV4dF9sZW47CisgICAgICAKKyAgICAgIGlmICghIGJpZ19saW51eAorCSAgJiYgdGV4dF9sZW4gPiBsaW51eF9kYXRhX3JlYWxfYWRkciAtIChjaGFyICopIExJTlVYX1pJTUFHRV9BRERSKQorCXsKKwkgIGdydWJfcHJpbnRmICgiIGxpbnV4ICd6SW1hZ2UnIGtlcm5lbCB0b28gYmlnLCB0cnkgJ21ha2UgYnpJbWFnZSdcbiIpOworCSAgZXJybnVtID0gRVJSX1dPTlRfRklUOworCX0KKyAgICAgIGVsc2UgaWYgKGxpbnV4X2RhdGFfcmVhbF9hZGRyICsgTElOVVhfU0VUVVBfTU9WRV9TSVpFCisJICAgICAgID4gUkFXX0FERFIgKChjaGFyICopIChtYmkubWVtX2xvd2VyIDw8IDEwKSkpCisJZXJybnVtID0gRVJSX1dPTlRfRklUOworICAgICAgZWxzZQorCXsKKwkgIGdydWJfcHJpbnRmICgiICAgW0xpbnV4LSVzLCBzZXR1cD0weCV4LCBzaXplPTB4JXhdXG4iLAorCQkgICAgICAgKGJpZ19saW51eCA/ICJiekltYWdlIiA6ICJ6SW1hZ2UiKSwgZGF0YV9sZW4sIHRleHRfbGVuKTsKKworCSAgLyogVmlkZW8gbW9kZSBzZWxlY3Rpb24gc3VwcG9ydC4gV2hhdCBhIG1lc3MhICAqLworCSAgLyogTk9URTogRXZlbiB0aGUgd29yZCAibWVzcyIgaXMgbm90IHN0aWxsIGVub3VnaCB0bworCSAgICAgcmVwcmVzZW50IGhvdyB3cm9uZyBhbmQgYmFkIHRoZSBMaW51eCB2aWRlbyBzdXBwb3J0IGlzLAorCSAgICAgYnV0IEkgZG9uJ3Qgd2FudCB0byBoZWFyIGNvbXBsYWludHMgZnJvbSBMaW51eCBmYW5hdGljcworCSAgICAgYW55IG1vcmUuIC1va3VqaSAgKi8KKwkgIHsKKwkgICAgY2hhciAqdmdhOworCQorCSAgICAvKiBGaW5kIHRoZSBzdWJzdHJpbmcgInZnYT0iLiAgKi8KKwkgICAgdmdhID0gZ3J1Yl9zdHJzdHIgKGFyZywgInZnYT0iKTsKKwkgICAgaWYgKHZnYSkKKwkgICAgICB7CisJCWNoYXIgKnZhbHVlID0gdmdhICsgNDsKKwkJaW50IHZpZF9tb2RlOworCSAgICAKKwkJLyogSGFuZGxlIHNwZWNpYWwgc3RyaW5ncy4gICovCisJCWlmIChzdWJzdHJpbmcgKCJub3JtYWwiLCB2YWx1ZSkgPCAxKQorCQkgIHZpZF9tb2RlID0gTElOVVhfVklEX01PREVfTk9STUFMOworCQllbHNlIGlmIChzdWJzdHJpbmcgKCJleHQiLCB2YWx1ZSkgPCAxKQorCQkgIHZpZF9tb2RlID0gTElOVVhfVklEX01PREVfRVhURU5ERUQ7CisJCWVsc2UgaWYgKHN1YnN0cmluZyAoImFzayIsIHZhbHVlKSA8IDEpCisJCSAgdmlkX21vZGUgPSBMSU5VWF9WSURfTU9ERV9BU0s7CisJCWVsc2UgaWYgKHNhZmVfcGFyc2VfbWF4aW50ICgmdmFsdWUsICZ2aWRfbW9kZSkpCisJCSAgOworCQllbHNlCisJCSAgeworCQkgICAgLyogRVJSTlVNIGlzIGFscmVhZHkgc2V0IGluc2lkZSB0aGUgZnVuY3Rpb24KKwkJICAgICAgIHNhZmVfcGFyc2VfbWF4aW50LiAgKi8KKwkJICAgIGdydWJfY2xvc2UgKCk7CisJCSAgICByZXR1cm4gS0VSTkVMX1RZUEVfTk9ORTsKKwkJICB9CisJICAgIAorCQlsaC0+dmlkX21vZGUgPSB2aWRfbW9kZTsKKwkgICAgICB9CisJICB9CisKKwkgIC8qIENoZWNrIHRoZSBtZW09IG9wdGlvbiB0byBsaW1pdCBtZW1vcnkgdXNlZCBmb3IgaW5pdHJkLiAgKi8KKwkgIHsKKwkgICAgY2hhciAqbWVtOworCQorCSAgICBtZW0gPSBncnViX3N0cnN0ciAoYXJnLCAibWVtPSIpOworCSAgICBpZiAobWVtKQorCSAgICAgIHsKKwkJY2hhciAqdmFsdWUgPSBtZW0gKyA0OworCSAgICAKKwkJc2FmZV9wYXJzZV9tYXhpbnQgKCZ2YWx1ZSwgJmxpbnV4X21lbV9zaXplKTsKKwkJc3dpdGNoIChlcnJudW0pCisJCSAgeworCQkgIGNhc2UgRVJSX05VTUJFUl9PVkVSRkxPVzoKKwkJICAgIC8qIElmIGFuIG92ZXJmbG93IG9jY3VycywgdXNlIHRoZSBtYXhpbXVtIGFkZHJlc3MgZm9yCisJCSAgICAgICBpbml0cmQgaW5zdGVhZC4gVGhpcyBpcyBnb29kLCBiZWNhdXNlIE1BWElOVCBpcworCQkgICAgICAgZ3JlYXRlciB0aGFuIExJTlVYX0lOSVRSRF9NQVhfQUREUkVTUy4gICovCisJCSAgICBsaW51eF9tZW1fc2l6ZSA9IExJTlVYX0lOSVRSRF9NQVhfQUREUkVTUzsKKwkJICAgIGVycm51bSA9IEVSUl9OT05FOworCQkgICAgYnJlYWs7CisJCQorCQkgIGNhc2UgRVJSX05PTkU6CisJCSAgICB7CisJCSAgICAgIGludCBzaGlmdCA9IDA7CisJCSAgCisJCSAgICAgIHN3aXRjaCAoZ3J1Yl90b2xvd2VyICgqdmFsdWUpKQorCQkJeworCQkJY2FzZSAnZyc6CisJCQkgIHNoaWZ0ICs9IDEwOworCQkJY2FzZSAnbSc6CisJCQkgIHNoaWZ0ICs9IDEwOworCQkJY2FzZSAnayc6CisJCQkgIHNoaWZ0ICs9IDEwOworCQkJZGVmYXVsdDoKKwkJCSAgYnJlYWs7CisJCQl9CisJCSAgCisJCSAgICAgIC8qIENoZWNrIGFuIG92ZXJmbG93LiAgKi8KKwkJICAgICAgaWYgKGxpbnV4X21lbV9zaXplID4gKE1BWElOVCA+PiBzaGlmdCkpCisJCQlsaW51eF9tZW1fc2l6ZSA9IExJTlVYX0lOSVRSRF9NQVhfQUREUkVTUzsKKwkJICAgICAgZWxzZQorCQkJbGludXhfbWVtX3NpemUgPDw9IHNoaWZ0OworCQkgICAgfQorCQkgICAgYnJlYWs7CisJCQorCQkgIGRlZmF1bHQ6CisJCSAgICBsaW51eF9tZW1fc2l6ZSA9IDA7CisJCSAgICBlcnJudW0gPSBFUlJfTk9ORTsKKwkJICAgIGJyZWFrOworCQkgIH0KKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICBsaW51eF9tZW1fc2l6ZSA9IDA7CisJICB9CisgICAgICAKKwkgIC8qIEl0IGlzIHBvc3NpYmxlIHRoYXQgREFUQV9MRU4gKyBTRUNUT1JfU0laRSBpcyBncmVhdGVyIHRoYW4KKwkgICAgIE1VTFRJQk9PVF9TRUFSQ0gsIHNvIHRoZSBkYXRhIG1heSBoYXZlIGJlZW4gcmVhZCBwYXJ0aWFsbHkuICAqLworCSAgaWYgKGRhdGFfbGVuICsgU0VDVE9SX1NJWkUgPD0gTVVMVElCT09UX1NFQVJDSCkKKwkgICAgZ3J1Yl9tZW1tb3ZlIChsaW51eF9kYXRhX3RtcF9hZGRyLCBidWZmZXIsCisJCQkgIGRhdGFfbGVuICsgU0VDVE9SX1NJWkUpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgZ3J1Yl9tZW1tb3ZlIChsaW51eF9kYXRhX3RtcF9hZGRyLCBidWZmZXIsIE1VTFRJQk9PVF9TRUFSQ0gpOworCSAgICAgIGdydWJfcmVhZCAobGludXhfZGF0YV90bXBfYWRkciArIE1VTFRJQk9PVF9TRUFSQ0gsCisJCQkgZGF0YV9sZW4gKyBTRUNUT1JfU0laRSAtIE1VTFRJQk9PVF9TRUFSQ0gpOworCSAgICB9CisJICAKKwkgIGlmIChsaC0+aGVhZGVyICE9IExJTlVYX01BR0lDX1NJR05BVFVSRSB8fAorCSAgICAgIGxoLT52ZXJzaW9uIDwgMHgwMjAwKQorCSAgICAvKiBDbGVhciB0aGUgaGVhcCBzcGFjZS4gICovCisJICAgIGdydWJfbWVtc2V0IChsaW51eF9kYXRhX3RtcF9hZGRyICsgKChzZXR1cF9zZWN0cyArIDEpIDw8IDkpLAorCQkJIDAsCisJCQkgKDY0IC0gc2V0dXBfc2VjdHMgLSAxKSA8PCA5KTsKKyAgICAgIAorCSAgLyogQ29weSBjb21tYW5kLWxpbmUgcGx1cyBtZW1vcnkgaGFjayB0byBzdGFnaW5nIGFyZWEuCisJICAgICBOT1RFOiBMaW51eCBoYXMgYSBidWcgdGhhdCBpdCBkb2Vzbid0IGhhbmRsZSBtdWx0aXBsZSBzcGFjZXMKKwkgICAgIGJldHdlZW4gdHdvIG9wdGlvbnMgYW5kIGEgc3BhY2UgYWZ0ZXIgYSAibWVtPSIgb3B0aW9uIGlzbid0CisJICAgICByZW1vdmVkIGNvcnJlY3RseSBzbyB0aGUgYXJndW1lbnRzIHRvIGluaXQgY291bGQgYmUgbGlrZQorCSAgICAgeyJpbml0IiwgIiIsICIiLCBOVUxMfS4gVGhpcyBhZmZlY3RzIHNvbWUgbm90LXZlcnktY2xldmVyCisJICAgICBzaGVsbHMuIFRodXMsIHRoZSBjb2RlIGJlbG93IGRvZXMgYSB0cmljayB0byBhdm9pZCB0aGUgYnVnLgorCSAgICAgVGhhdCBpcywgY29weSAibWVtPVhYWCIgdG8gdGhlIGVuZCBvZiB0aGUgY29tbWFuZC1saW5lLCBhbmQKKwkgICAgIGF2b2lkIHRvIGNvcHkgc3BhY2VzIHVubmVjZXNzYXJpbHkuIEhlbGwuICAqLworCSAgeworCSAgICBjaGFyICpzcmMgPSBza2lwX3RvICgwLCBhcmcpOworCSAgICBjaGFyICpkZXN0ID0gbGludXhfZGF0YV90bXBfYWRkciArIExJTlVYX0NMX09GRlNFVDsKKwkKKwkgICAgd2hpbGUgKGRlc3QgPCBsaW51eF9kYXRhX3RtcF9hZGRyICsgTElOVVhfQ0xfRU5EX09GRlNFVCAmJiAqc3JjKQorCSAgICAgICooZGVzdCsrKSA9ICooc3JjKyspOworCQorCSAgICAvKiBPbGQgTGludXgga2VybmVscyBoYXZlIHByb2JsZW1zIGRldGVybWluaW5nIHRoZSBhbW91bnQgb2YKKwkgICAgICAgdGhlIGF2YWlsYWJsZSBtZW1vcnkuICBUbyB3b3JrIGFyb3VuZCB0aGlzIHByb2JsZW0sIHdlIGFkZAorCSAgICAgICB0aGUgIm1lbSIgb3B0aW9uIHRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLiAgVGhpcyBoYXMgaXRzCisJICAgICAgIG93biBkcmF3YmFja3MgYmVjYXVzZSBuZXdlciBrZXJuZWxzIGNhbiBkZXRlcm1pbmUgdGhlCisJICAgICAgIG1lbW9yeSBtYXAgbW9yZSBhY2N1cmF0ZWx5LiAgQm9vdCBwcm90b2NvbCAyLjAzLCB3aGljaAorCSAgICAgICBhcHBlYXJlZCBpbiBMaW51eCAyLjQuMTgsIHByb3ZpZGVzIGEgcG9pbnRlciB0byB0aGUga2VybmVsCisJICAgICAgIHZlcnNpb24gc3RyaW5nLCBzbyB3ZSBjb3VsZCBjaGVjayBpdC4gIEJ1dCBzaW5jZSBrZXJuZWwKKwkgICAgICAgMi40LjE4IGFuZCBuZXdlciBhcmUga25vd24gdG8gZGV0ZWN0IG1lbW9yeSByZWxpYWJseSwgYm9vdAorCSAgICAgICBwcm90b2NvbCAyLjAzIGFscmVhZHkgaW1wbGllcyB0aGF0IHRoZSBrZXJuZWwgaXMgbmV3CisJICAgICAgIGVub3VnaC4gIFRoZSAibWVtIiBvcHRpb24gaXMgYWRkZWQgaWYgbmVpdGhlciBvZiB0aGUKKwkgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgbWV0OgorCSAgICAgICAxKSBUaGUgIm1lbSIgb3B0aW9uIGlzIGFscmVhZHkgcHJlc2VudC4KKwkgICAgICAgMikgVGhlICJrZXJuZWwiIGNvbW1hbmQgaXMgdXNlZCB3aXRoICItLW5vLW1lbS1vcHRpb24iLgorCSAgICAgICAzKSBHTlUgR1JVQiBpcyBjb25maWd1cmVkIG5vdCB0byBwYXNzIHRoZSAibWVtIiBvcHRpb24uCisJICAgICAgIDQpIFRoZSBrZXJuZWwgc3VwcG9ydHMgYm9vdCBwcm90b2NvbCAyLjAzIG9yIG5ld2VyLiAgKi8KKwkgICAgaWYgKCEgZ3J1Yl9zdHJzdHIgKGFyZywgIm1lbT0iKQorCQkmJiAhIChsb2FkX2ZsYWdzICYgS0VSTkVMX0xPQURfTk9fTUVNX09QVElPTikKKwkJJiYgbGgtPnZlcnNpb24gPCAweDAyMDMJCS8qIGtlcm5lbCB2ZXJzaW9uIDwgMi40LjE4ICovCisJCSYmIGRlc3QgKyAxNSA8IGxpbnV4X2RhdGFfdG1wX2FkZHIgKyBMSU5VWF9DTF9FTkRfT0ZGU0VUKQorCSAgICAgIHsKKwkJKmRlc3QrKyA9ICcgJzsKKwkJKmRlc3QrKyA9ICdtJzsKKwkJKmRlc3QrKyA9ICdlJzsKKwkJKmRlc3QrKyA9ICdtJzsKKwkJKmRlc3QrKyA9ICc9JzsKKwkgICAgCisJCWRlc3QgPSBjb252ZXJ0X3RvX2FzY2lpIChkZXN0LCAndScsIChleHRlbmRlZF9tZW1vcnkgKyAweDQwMCkpOworCQkqZGVzdCsrID0gJ0snOworCSAgICAgIH0KKwkKKwkgICAgKmRlc3QgPSAwOworCSAgfQorICAgICAgCisJICAvKiBvZmZzZXQgaW50byBmaWxlICovCisJICBncnViX3NlZWsgKGRhdGFfbGVuICsgU0VDVE9SX1NJWkUpOworICAgICAgCisJICBjdXJfYWRkciA9IChpbnQpIGxpbnV4X2RhdGFfdG1wX2FkZHIgKyBMSU5VWF9TRVRVUF9NT1ZFX1NJWkU7CisJICBncnViX3JlYWQgKChjaGFyICopIExJTlVYX0JaSU1BR0VfQUREUiwgdGV4dF9sZW4pOworICAgICAgCisJICBpZiAoZXJybnVtID09IEVSUl9OT05FKQorCSAgICB7CisJICAgICAgZ3J1Yl9jbG9zZSAoKTsKKwkgIAorCSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCisJICAgICAgaWYgKHN1Z2dlc3RlZF90eXBlICE9IEtFUk5FTF9UWVBFX05PTkUKKwkJICAmJiAoKGJpZ19saW51eCAmJiBzdWdnZXN0ZWRfdHlwZSAhPSBLRVJORUxfVFlQRV9CSUdfTElOVVgpCisJCSAgICAgIHx8ICghIGJpZ19saW51eCAmJiBzdWdnZXN0ZWRfdHlwZSAhPSBLRVJORUxfVFlQRV9MSU5VWCkpKQorCQl7CisJCSAgZXJybnVtID0gRVJSX0VYRUNfRk9STUFUOworCQkgIHJldHVybiBLRVJORUxfVFlQRV9OT05FOworCQl9CisJICAKKwkgICAgICAvKiBVZ2x5IGhhY2suICAqLworCSAgICAgIGxpbnV4X3RleHRfbGVuID0gdGV4dF9sZW47CisJICAKKwkgICAgICByZXR1cm4gYmlnX2xpbnV4ID8gS0VSTkVMX1RZUEVfQklHX0xJTlVYIDogS0VSTkVMX1RZUEVfTElOVVg7CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlCQkJCS8qIG5vIHJlY29nbml6YWJsZSBmb3JtYXQgKi8KKyAgICBlcnJudW0gPSBFUlJfRVhFQ19GT1JNQVQ7CisKKyAgLyogcmV0dXJuIGlmIGVycm9yICovCisgIGlmIChlcnJudW0pCisgICAgeworICAgICAgZ3J1Yl9jbG9zZSAoKTsKKyAgICAgIHJldHVybiBLRVJORUxfVFlQRV9OT05FOworICAgIH0KKworICAvKiBmaWxsIHRoZSBtdWx0aWJvb3QgaW5mbyBzdHJ1Y3R1cmUgKi8KKyAgbWJpLmNtZGxpbmUgPSAoaW50KSBhcmc7CisgIG1iaS5tb2RzX2NvdW50ID0gMDsKKyAgbWJpLm1vZHNfYWRkciA9IDA7CisgIG1iaS5ib290X2RldmljZSA9IChjdXJyZW50X2RyaXZlIDw8IDI0KSB8IGN1cnJlbnRfcGFydGl0aW9uOworICBtYmkuZmxhZ3MgJj0gfihNQl9JTkZPX01PRFMgfCBNQl9JTkZPX0FPVVRfU1lNUyB8IE1CX0lORk9fRUxGX1NIRFIpOworICBtYmkuc3ltcy5hLnRhYnNpemUgPSAwOworICBtYmkuc3ltcy5hLnN0cnNpemUgPSAwOworICBtYmkuc3ltcy5hLmFkZHIgPSAwOworICBtYmkuc3ltcy5hLnBhZCA9IDA7CisKKyAgcHJpbnRmICgiICAgWyVzLSVzIiwgc3RyMiwgc3RyKTsKKworICBzdHIgPSAiIjsKKworICBpZiAoZXhlY190eXBlKQkJLyogY2FuIGJlIGxvYWRlZCBsaWtlIGEub3V0ICovCisgICAgeworICAgICAgaWYgKGZsYWdzICYgTVVMVElCT09UX0FPVVRfS0xVREdFKQorCXN0ciA9ICItYW5kLWRhdGEiOworCisgICAgICBwcmludGYgKCIsIGxvYWRhZGRyPTB4JXgsIHRleHQlcz0weCV4IiwgY3VyX2FkZHIsIHN0ciwgdGV4dF9sZW4pOworCisgICAgICAvKiByZWFkIHRleHQsIHRoZW4gcmVhZCBkYXRhICovCisgICAgICBpZiAoZ3J1Yl9yZWFkICgoY2hhciAqKSBSQVdfQUREUiAoY3VyX2FkZHIpLCB0ZXh0X2xlbikgPT0gdGV4dF9sZW4pCisJeworCSAgY3VyX2FkZHIgKz0gdGV4dF9sZW47CisKKwkgIGlmICghKGZsYWdzICYgTVVMVElCT09UX0FPVVRfS0xVREdFKSkKKwkgICAgeworCSAgICAgIC8qIHdlIGhhdmUgdG8gYWxpZ24gdG8gYSA0SyBib3VuZGFyeSAqLworCSAgICAgIGlmIChhbGlnbl80aykKKwkJY3VyX2FkZHIgPSAoY3VyX2FkZHIgKyAweEZGRikgJiAweEZGRkZGMDAwOworCSAgICAgIGVsc2UKKwkJcHJpbnRmICgiLCBDIik7CisKKwkgICAgICBwcmludGYgKCIsIGRhdGE9MHgleCIsIGRhdGFfbGVuKTsKKworCSAgICAgIGlmICgoZ3J1Yl9yZWFkICgoY2hhciAqKSBSQVdfQUREUiAoY3VyX2FkZHIpLCBkYXRhX2xlbikKKwkJICAgIT0gZGF0YV9sZW4pCisJCSAgJiYgIWVycm51bSkKKwkJZXJybnVtID0gRVJSX0VYRUNfRk9STUFUOworCSAgICAgIGN1cl9hZGRyICs9IGRhdGFfbGVuOworCSAgICB9CisKKwkgIGlmICghZXJybnVtKQorCSAgICB7CisJICAgICAgbWVtc2V0ICgoY2hhciAqKSBSQVdfQUREUiAoY3VyX2FkZHIpLCAwLCBic3NfbGVuKTsKKwkgICAgICBjdXJfYWRkciArPSBic3NfbGVuOworCisJICAgICAgcHJpbnRmICgiLCBic3M9MHgleCIsIGJzc19sZW4pOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoIWVycm51bSkKKwllcnJudW0gPSBFUlJfRVhFQ19GT1JNQVQ7CisKKyAgICAgIGlmICghZXJybnVtICYmIHB1LmFvdXQtPmFfc3ltcworCSAgJiYgcHUuYW91dC0+YV9zeW1zIDwgKGZpbGVtYXggLSBmaWxlcG9zKSkKKwl7CisJICBpbnQgc3ltdGFiX2Vyciwgb3JpZ19hZGRyID0gY3VyX2FkZHI7CisKKwkgIC8qIHdlIHNob3VsZCBhbGlnbiB0byBhIDRLIGJvdW5kYXJ5IGhlcmUgZm9yIGdvb2QgbWVhc3VyZSAqLworCSAgaWYgKGFsaWduXzRrKQorCSAgICBjdXJfYWRkciA9IChjdXJfYWRkciArIDB4RkZGKSAmIDB4RkZGRkYwMDA7CisKKwkgIG1iaS5zeW1zLmEuYWRkciA9IGN1cl9hZGRyOworCisJICAqKChpbnQgKikgUkFXX0FERFIgKGN1cl9hZGRyKSkgPSBwdS5hb3V0LT5hX3N5bXM7CisJICBjdXJfYWRkciArPSBzaXplb2YgKGludCk7CisJICAKKwkgIHByaW50ZiAoIiwgc3ltdGFiPTB4JXgiLCBwdS5hb3V0LT5hX3N5bXMpOworCisJICBpZiAoZ3J1Yl9yZWFkICgoY2hhciAqKSBSQVdfQUREUiAoY3VyX2FkZHIpLCBwdS5hb3V0LT5hX3N5bXMpCisJICAgICAgPT0gcHUuYW91dC0+YV9zeW1zKQorCSAgICB7CisJICAgICAgY3VyX2FkZHIgKz0gcHUuYW91dC0+YV9zeW1zOworCSAgICAgIG1iaS5zeW1zLmEudGFic2l6ZSA9IHB1LmFvdXQtPmFfc3ltczsKKworCSAgICAgIGlmIChncnViX3JlYWQgKChjaGFyICopICZpLCBzaXplb2YgKGludCkpID09IHNpemVvZiAoaW50KSkKKwkJeworCQkgICooKGludCAqKSBSQVdfQUREUiAoY3VyX2FkZHIpKSA9IGk7CisJCSAgY3VyX2FkZHIgKz0gc2l6ZW9mIChpbnQpOworCisJCSAgbWJpLnN5bXMuYS5zdHJzaXplID0gaTsKKworCQkgIGkgLT0gc2l6ZW9mIChpbnQpOworCisJCSAgcHJpbnRmICgiLCBzdHJ0YWI9MHgleCIsIGkpOworCisJCSAgc3ltdGFiX2VyciA9IChncnViX3JlYWQgKChjaGFyICopIFJBV19BRERSIChjdXJfYWRkciksIGkpCisJCQkJIT0gaSk7CisJCSAgY3VyX2FkZHIgKz0gaTsKKwkJfQorCSAgICAgIGVsc2UKKwkJc3ltdGFiX2VyciA9IDE7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgc3ltdGFiX2VyciA9IDE7CisKKwkgIGlmIChzeW10YWJfZXJyKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiKGJhZCkiKTsKKwkgICAgICBjdXJfYWRkciA9IG9yaWdfYWRkcjsKKwkgICAgICBtYmkuc3ltcy5hLnRhYnNpemUgPSAwOworCSAgICAgIG1iaS5zeW1zLmEuc3Ryc2l6ZSA9IDA7CisJICAgICAgbWJpLnN5bXMuYS5hZGRyID0gMDsKKwkgICAgfQorCSAgZWxzZQorCSAgICBtYmkuZmxhZ3MgfD0gTUJfSU5GT19BT1VUX1NZTVM7CisJfQorICAgIH0KKyAgZWxzZQorICAgIC8qIEVMRiBleGVjdXRhYmxlICovCisgICAgeworICAgICAgdW5zaWduZWQgbG9hZGVkID0gMCwgbWVtYWRkciwgbWVtc2l6LCBmaWxlc2l6OworICAgICAgRWxmMzJfUGhkciAqcGhkcjsKKworICAgICAgLyogcmVzZXQgdGhpcyB0byB6ZXJvIGZvciBub3cgKi8KKyAgICAgIGN1cl9hZGRyID0gMDsKKworICAgICAgLyogc2NhbiBmb3IgcHJvZ3JhbSBzZWdtZW50cyAqLworICAgICAgZm9yIChpID0gMDsgaSA8IHB1LmVsZi0+ZV9waG51bTsgaSsrKQorCXsKKwkgIHBoZHIgPSAoRWxmMzJfUGhkciAqKQorCSAgICAocHUuZWxmLT5lX3Bob2ZmICsgKChpbnQpIGJ1ZmZlcikKKwkgICAgICsgKHB1LmVsZi0+ZV9waGVudHNpemUgKiBpKSk7CisJICBpZiAocGhkci0+cF90eXBlID09IFBUX0xPQUQpCisJICAgIHsKKwkgICAgICAvKiBvZmZzZXQgaW50byBmaWxlICovCisJICAgICAgZ3J1Yl9zZWVrIChwaGRyLT5wX29mZnNldCk7CisJICAgICAgZmlsZXNpeiA9IHBoZHItPnBfZmlsZXN6OworCSAgICAgIAorCSAgICAgIGlmICh0eXBlID09IEtFUk5FTF9UWVBFX0ZSRUVCU0QgfHwgdHlwZSA9PSBLRVJORUxfVFlQRV9ORVRCU0QpCisJCW1lbWFkZHIgPSBSQVdfQUREUiAocGhkci0+cF9wYWRkciAmIDB4RkZGRkZGKTsKKwkgICAgICBlbHNlCisJCW1lbWFkZHIgPSBSQVdfQUREUiAocGhkci0+cF9wYWRkcik7CisJICAgICAgCisJICAgICAgbWVtc2l6ID0gcGhkci0+cF9tZW1zejsKKwkgICAgICBpZiAobWVtYWRkciA8IFJBV19BRERSICgweDEwMDAwMCkpCisJCWVycm51bSA9IEVSUl9CRUxPV18xTUI7CisKKwkgICAgICAvKiBJZiB0aGUgbWVtb3J5IHJhbmdlIGNvbnRhaW5zIHRoZSBlbnRyeSBhZGRyZXNzLCBnZXQgdGhlCisJCSBwaHlzaWNhbCBhZGRyZXNzIGhlcmUuICAqLworCSAgICAgIGlmICh0eXBlID09IEtFUk5FTF9UWVBFX01VTFRJQk9PVAorCQkgICYmICh1bnNpZ25lZCkgZW50cnlfYWRkciA+PSBwaGRyLT5wX3ZhZGRyCisJCSAgJiYgKHVuc2lnbmVkKSBlbnRyeV9hZGRyIDwgcGhkci0+cF92YWRkciArIG1lbXNpeikKKwkJcmVhbF9lbnRyeV9hZGRyID0gKGVudHJ5X2Z1bmMpICgodW5zaWduZWQpIGVudHJ5X2FkZHIKKwkJCQkJCSsgbWVtYWRkciAtIHBoZHItPnBfdmFkZHIpOworCQkKKwkgICAgICAvKiBtYWtlIHN1cmUgd2Ugb25seSBsb2FkIHdoYXQgd2UncmUgc3VwcG9zZWQgdG8hICovCisJICAgICAgaWYgKGZpbGVzaXogPiBtZW1zaXopCisJCWZpbGVzaXogPSBtZW1zaXo7CisJICAgICAgLyogbWFyayBtZW1vcnkgYXMgdXNlZCAqLworCSAgICAgIGlmIChjdXJfYWRkciA8IG1lbWFkZHIgKyBtZW1zaXopCisJCWN1cl9hZGRyID0gbWVtYWRkciArIG1lbXNpejsKKwkgICAgICBwcmludGYgKCIsIDwweCV4OjB4JXg6MHgleD4iLCBtZW1hZGRyLCBmaWxlc2l6LAorCQkgICAgICBtZW1zaXogLSBmaWxlc2l6KTsKKwkgICAgICAvKiBpbmNyZW1lbnQgbnVtYmVyIG9mIHNlZ21lbnRzICovCisJICAgICAgbG9hZGVkKys7CisKKwkgICAgICAvKiBsb2FkIHRoZSBzZWdtZW50ICovCisJICAgICAgaWYgKG1lbWNoZWNrIChtZW1hZGRyLCBtZW1zaXopCisJCSAgJiYgZ3J1Yl9yZWFkICgoY2hhciAqKSBtZW1hZGRyLCBmaWxlc2l6KSA9PSBmaWxlc2l6KQorCQl7CisJCSAgaWYgKG1lbXNpeiA+IGZpbGVzaXopCisJCSAgICBtZW1zZXQgKChjaGFyICopIChtZW1hZGRyICsgZmlsZXNpeiksIDAsIG1lbXNpeiAtIGZpbGVzaXopOworCQl9CisJICAgICAgZWxzZQorCQlicmVhazsKKwkgICAgfQorCX0KKworICAgICAgaWYgKCEgZXJybnVtKQorCXsKKwkgIGlmICghIGxvYWRlZCkKKwkgICAgZXJybnVtID0gRVJSX0VYRUNfRk9STUFUOworCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogTG9hZCBFTEYgc3ltYm9scy4gICovCisJICAgICAgRWxmMzJfU2hkciAqc2hkciA9IE5VTEw7CisJICAgICAgaW50IHRhYl9zaXplLCBzZWNfc2l6ZTsKKwkgICAgICBpbnQgc3ltdGFiX2VyciA9IDA7CisKKwkgICAgICBtYmkuc3ltcy5lLm51bSA9IHB1LmVsZi0+ZV9zaG51bTsKKwkgICAgICBtYmkuc3ltcy5lLnNpemUgPSBwdS5lbGYtPmVfc2hlbnRzaXplOworCSAgICAgIG1iaS5zeW1zLmUuc2huZHggPSBwdS5lbGYtPmVfc2hzdHJuZHg7CisJICAgICAgCisJICAgICAgLyogV2Ugc2hvdWxkIGFsaWduIHRvIGEgNEsgYm91bmRhcnkgaGVyZSBmb3IgZ29vZCBtZWFzdXJlLiAgKi8KKwkgICAgICBpZiAoYWxpZ25fNGspCisJCWN1cl9hZGRyID0gKGN1cl9hZGRyICsgMHhGRkYpICYgMHhGRkZGRjAwMDsKKwkgICAgICAKKwkgICAgICB0YWJfc2l6ZSA9IHB1LmVsZi0+ZV9zaGVudHNpemUgKiBwdS5lbGYtPmVfc2hudW07CisJICAgICAgCisJICAgICAgZ3J1Yl9zZWVrIChwdS5lbGYtPmVfc2hvZmYpOworCSAgICAgIGlmIChncnViX3JlYWQgKChjaGFyICopIFJBV19BRERSIChjdXJfYWRkciksIHRhYl9zaXplKQorCQkgID09IHRhYl9zaXplKQorCQl7CisJCSAgbWJpLnN5bXMuZS5hZGRyID0gY3VyX2FkZHI7CisJCSAgc2hkciA9IChFbGYzMl9TaGRyICopIG1iaS5zeW1zLmUuYWRkcjsKKwkJICBjdXJfYWRkciArPSB0YWJfc2l6ZTsKKwkJICAKKwkJICBwcmludGYgKCIsIHNodGFiPTB4JXgiLCBjdXJfYWRkcik7CisgIAkJICAKKwkJICBmb3IgKGkgPSAwOyBpIDwgbWJpLnN5bXMuZS5udW07IGkrKykKKwkJICAgIHsKKwkJICAgICAgLyogVGhpcyBzZWN0aW9uIGlzIGEgbG9hZGVkIHNlY3Rpb24sCisJCQkgc28gd2UgZG9uJ3QgY2FyZS4gICovCisJCSAgICAgIGlmIChzaGRyW2ldLnNoX2FkZHIgIT0gMCkKKwkJCWNvbnRpbnVlOworCQkgICAgICAKKwkJICAgICAgLyogVGhpcyBzZWN0aW9uIGlzIGVtcHR5LCBzbyB3ZSBkb24ndCBjYXJlLiAgKi8KKwkJICAgICAgaWYgKHNoZHJbaV0uc2hfc2l6ZSA9PSAwKQorCQkJY29udGludWU7CisJCSAgICAgIAorCQkgICAgICAvKiBBbGlnbiB0aGUgc2VjdGlvbiB0byBhIHNoX2FkZHJhbGlnbiBiaXRzIGJvdW5kYXJ5LiAgKi8KKwkJICAgICAgY3VyX2FkZHIgPSAoKGN1cl9hZGRyICsgc2hkcltpXS5zaF9hZGRyYWxpZ24pICYgCisJCQkJICAtIChpbnQpIHNoZHJbaV0uc2hfYWRkcmFsaWduKTsKKwkJICAgICAgCisJCSAgICAgIGdydWJfc2VlayAoc2hkcltpXS5zaF9vZmZzZXQpOworCQkgICAgICAKKwkJICAgICAgc2VjX3NpemUgPSBzaGRyW2ldLnNoX3NpemU7CisKKwkJICAgICAgaWYgKCEgKG1lbWNoZWNrIChjdXJfYWRkciwgc2VjX3NpemUpCisJCQkgICAgICYmIChncnViX3JlYWQgKChjaGFyICopIFJBV19BRERSIChjdXJfYWRkciksCisJCQkJCSAgICBzZWNfc2l6ZSkKKwkJCQkgPT0gc2VjX3NpemUpKSkKKwkJCXsKKwkJCSAgc3ltdGFiX2VyciA9IDE7CisJCQkgIGJyZWFrOworCQkJfQorCQkgICAgICAKKwkJICAgICAgc2hkcltpXS5zaF9hZGRyID0gY3VyX2FkZHI7CisJCSAgICAgIGN1cl9hZGRyICs9IHNlY19zaXplOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZSAKKwkJc3ltdGFiX2VyciA9IDE7CisJICAgICAgCisJICAgICAgaWYgKG1iaS5zeW1zLmUuYWRkciA8IFJBV19BRERSKDB4MTAwMDApKQorCQlzeW10YWJfZXJyID0gMTsKKwkgICAgICAKKwkgICAgICBpZiAoc3ltdGFiX2VycikgCisJCXsKKwkJICBwcmludGYgKCIoYmFkKSIpOworCQkgIG1iaS5zeW1zLmUubnVtID0gMDsKKwkJICBtYmkuc3ltcy5lLnNpemUgPSAwOworCQkgIG1iaS5zeW1zLmUuYWRkciA9IDA7CisJCSAgbWJpLnN5bXMuZS5zaG5keCA9IDA7CisJCSAgY3VyX2FkZHIgPSAwOworCQl9CisJICAgICAgZWxzZQorCQltYmkuZmxhZ3MgfD0gTUJfSU5GT19FTEZfU0hEUjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKCEgZXJybnVtKQorICAgIHsKKyAgICAgIGdydWJfcHJpbnRmICgiLCBlbnRyeT0weCV4XVxuIiwgKHVuc2lnbmVkKSBlbnRyeV9hZGRyKTsKKyAgICAgIAorICAgICAgLyogSWYgdGhlIGVudHJ5IGFkZHJlc3MgaXMgcGh5c2ljYWxseSBkaWZmZXJlbnQgZnJvbSB0aGF0IG9mIHRoZSBFTEYKKwkgaGVhZGVyLCBjb3JyZWN0IGl0IGhlcmUuICAqLworICAgICAgaWYgKHJlYWxfZW50cnlfYWRkcikKKwllbnRyeV9hZGRyID0gcmVhbF9lbnRyeV9hZGRyOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHB1dGNoYXIgKCdcbicpOworICAgICAgdHlwZSA9IEtFUk5FTF9UWVBFX05PTkU7CisgICAgfQorCisgIGdydWJfY2xvc2UgKCk7CisKKyAgLyogU2FuaXR5IGNoZWNrLiAgKi8KKyAgaWYgKHN1Z2dlc3RlZF90eXBlICE9IEtFUk5FTF9UWVBFX05PTkUgJiYgc3VnZ2VzdGVkX3R5cGUgIT0gdHlwZSkKKyAgICB7CisgICAgICBlcnJudW0gPSBFUlJfRVhFQ19GT1JNQVQ7CisgICAgICByZXR1cm4gS0VSTkVMX1RZUEVfTk9ORTsKKyAgICB9CisgIAorICByZXR1cm4gdHlwZTsKK30KKworaW50Citsb2FkX21vZHVsZSAoY2hhciAqbW9kdWxlLCBjaGFyICphcmcpCit7CisgIGludCBsZW47CisKKyAgLyogaWYgd2UgYXJlIHN1cHBvc2VkIHRvIGxvYWQgb24gNEsgYm91bmRhcmllcyAqLworICBjdXJfYWRkciA9IChjdXJfYWRkciArIDB4RkZGKSAmIDB4RkZGRkYwMDA7CisKKyAgaWYgKCFncnViX29wZW4gKG1vZHVsZSkpCisgICAgcmV0dXJuIDA7CisKKyAgbGVuID0gZ3J1Yl9yZWFkICgoY2hhciAqKSBjdXJfYWRkciwgLTEpOworICBpZiAoISBsZW4pCisgICAgeworICAgICAgZ3J1Yl9jbG9zZSAoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBwcmludGYgKCIgICBbTXVsdGlib290LW1vZHVsZSBAIDB4JXgsIDB4JXggYnl0ZXNdXG4iLCBjdXJfYWRkciwgbGVuKTsKKworICAvKiB0aGVzZSB0d28gc2ltcGx5IG5lZWQgdG8gYmUgc2V0IGlmIGFueSBtb2R1bGVzIGFyZSBsb2FkZWQgYXQgYWxsICovCisgIG1iaS5mbGFncyB8PSBNQl9JTkZPX01PRFM7CisgIG1iaS5tb2RzX2FkZHIgPSAoaW50KSBtbGw7CisKKyAgbWxsW21iaS5tb2RzX2NvdW50XS5jbWRsaW5lID0gKGludCkgYXJnOworICBtbGxbbWJpLm1vZHNfY291bnRdLm1vZF9zdGFydCA9IGN1cl9hZGRyOworICBjdXJfYWRkciArPSBsZW47CisgIG1sbFttYmkubW9kc19jb3VudF0ubW9kX2VuZCA9IGN1cl9hZGRyOworICBtbGxbbWJpLm1vZHNfY291bnRdLnBhZCA9IDA7CisKKyAgLyogaW5jcmVtZW50IG51bWJlciBvZiBtb2R1bGVzIGluY2x1ZGVkICovCisgIG1iaS5tb2RzX2NvdW50Kys7CisKKyAgZ3J1Yl9jbG9zZSAoKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludAorbG9hZF9pbml0cmQgKGNoYXIgKmluaXRyZCkKK3sKKyAgaW50IGxlbjsKKyAgdW5zaWduZWQgbG9uZyBtb3ZldG87CisgIHVuc2lnbmVkIGxvbmcgbWF4X2FkZHI7CisgIHN0cnVjdCBsaW51eF9rZXJuZWxfaGVhZGVyICpsaAorICAgID0gKHN0cnVjdCBsaW51eF9rZXJuZWxfaGVhZGVyICopIChjdXJfYWRkciAtIExJTlVYX1NFVFVQX01PVkVfU0laRSk7CisgIAorI2lmbmRlZiBOT19ERUNPTVBSRVNTSU9OCisgIG5vX2RlY29tcHJlc3Npb24gPSAxOworI2VuZGlmCisgIAorICBpZiAoISBncnViX29wZW4gKGluaXRyZCkpCisgICAgZ290byBmYWlsOworCisgIGxlbiA9IGdydWJfcmVhZCAoKGNoYXIgKikgY3VyX2FkZHIsIC0xKTsKKyAgaWYgKCEgbGVuKQorICAgIHsKKyAgICAgIGdydWJfY2xvc2UgKCk7CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgIGlmIChsaW51eF9tZW1fc2l6ZSkKKyAgICBtb3ZldG8gPSBsaW51eF9tZW1fc2l6ZTsKKyAgZWxzZQorICAgIG1vdmV0byA9IChtYmkubWVtX3VwcGVyICsgMHg0MDApIDw8IDEwOworICAKKyAgbW92ZXRvID0gKG1vdmV0byAtIGxlbikgJiAweGZmZmZmMDAwOworICBtYXhfYWRkciA9IChsaC0+aGVhZGVyID09IExJTlVYX01BR0lDX1NJR05BVFVSRSAmJiBsaC0+dmVyc2lvbiA+PSAweDAyMDMKKwkgICAgICA/IGxoLT5pbml0cmRfYWRkcl9tYXggOiBMSU5VWF9JTklUUkRfTUFYX0FERFJFU1MpOworICBpZiAobW92ZXRvICsgbGVuID49IG1heF9hZGRyKQorICAgIG1vdmV0byA9IChtYXhfYWRkciAtIGxlbikgJiAweGZmZmZmMDAwOworICAKKyAgLyogWFhYOiBMaW51eCAyLjMueHggaGFzIGEgYnVnIGluIHRoZSBtZW1vcnkgcmFuZ2UgY2hlY2ssIHNvIGF2b2lkCisgICAgIHRoZSBsYXN0IHBhZ2UuCisgICAgIFhYWDogTGludXggMi4yLnh4IGhhcyBhIGJ1ZyBpbiB0aGUgbWVtb3J5IHJhbmdlIGNoZWNrLCB3aGljaCBpcworICAgICB3b3JzZSB0aGFuIHRoYXQgb2YgTGludXggMi4zLnh4LCBzbyBhdm9pZCB0aGUgbGFzdCA2NGtiLiAqc2lnaCogICovCisgIG1vdmV0byAtPSAweDEwMDAwOworICBtZW1tb3ZlICgodm9pZCAqKSBSQVdfQUREUiAobW92ZXRvKSwgKHZvaWQgKikgY3VyX2FkZHIsIGxlbik7CisKKyAgcHJpbnRmICgiICAgW0xpbnV4LWluaXRyZCBAIDB4JXgsIDB4JXggYnl0ZXNdXG4iLCBtb3ZldG8sIGxlbik7CisKKyAgLyogRklYTUU6IFNob3VsZCBjaGVjayBpZiB0aGUga2VybmVsIHN1cHBvcnRzIElOSVRSRC4gICovCisgIGxoLT5yYW1kaXNrX2ltYWdlID0gUkFXX0FERFIgKG1vdmV0byk7CisgIGxoLT5yYW1kaXNrX3NpemUgPSBsZW47CisKKyAgZ3J1Yl9jbG9zZSAoKTsKKworIGZhaWw6CisgIAorI2lmbmRlZiBOT19ERUNPTVBSRVNTSU9OCisgIG5vX2RlY29tcHJlc3Npb24gPSAwOworI2VuZGlmCisKKyAgcmV0dXJuICEgZXJybnVtOworfQorCisKKyNpZmRlZiBHUlVCX1VUSUwKKy8qIER1bW15IGZ1bmN0aW9uIHRvIGZha2UgdGhlICpCU0QgYm9vdC4gICovCitzdGF0aWMgdm9pZAorYnNkX2Jvb3RfZW50cnkgKGludCBmbGFncywgaW50IGJvb3RkZXYsIGludCBzeW1fc3RhcnQsIGludCBzeW1fZW5kLAorCQlpbnQgbWVtX3VwcGVyLCBpbnQgbWVtX2xvd2VyKQoreworICBzdG9wICgpOworfQorI2VuZGlmCisKKworLyoKKyAqICBBbGwgIipfYm9vdCIgY29tbWFuZHMgZGVwZW5kIG9uIHRoZSBpbWFnZXMgYmVpbmcgbG9hZGVkIGludG8gbWVtb3J5CisgKiAgY29ycmVjdGx5LCB0aGUgdmFyaWFibGVzIGluIHRoaXMgZmlsZSBiZWluZyBzZXQgdXAgY29ycmVjdGx5LCBhbmQKKyAqICB0aGUgcm9vdCBwYXJ0aXRpb24gYmVpbmcgc2V0IGluIHRoZSAnc2F2ZWRfZHJpdmUnIGFuZCAnc2F2ZWRfcGFydGl0aW9uJworICogIHZhcmlhYmxlcy4KKyAqLworCisKK3ZvaWQKK2JzZF9ib290IChrZXJuZWxfdCB0eXBlLCBpbnQgYm9vdGRldiwgY2hhciAqYXJnKQoreworICBjaGFyICpzdHI7CisgIGludCBjbHZhbCA9IDAsIGk7CisgIHN0cnVjdCBib290aW5mbyBiaTsKKworI2lmZGVmIEdSVUJfVVRJTAorICBlbnRyeV9hZGRyID0gKGVudHJ5X2Z1bmMpIGJzZF9ib290X2VudHJ5OworI2Vsc2UKKyAgc3RvcF9mbG9wcHkgKCk7CisjZW5kaWYKKworICB3aGlsZSAoKigrK2FyZykgJiYgKmFyZyAhPSAnICcpOworICBzdHIgPSBhcmc7CisgIHdoaWxlICgqc3RyKQorICAgIHsKKyAgICAgIGlmICgqc3RyID09ICctJykKKwl7CisJICB3aGlsZSAoKnN0ciAmJiAqc3RyICE9ICcgJykKKwkgICAgeworCSAgICAgIGlmICgqc3RyID09ICdDJykKKwkJY2x2YWwgfD0gUkJfQ0RST007CisJICAgICAgaWYgKCpzdHIgPT0gJ2EnKQorCQljbHZhbCB8PSBSQl9BU0tOQU1FOworCSAgICAgIGlmICgqc3RyID09ICdiJykKKwkJY2x2YWwgfD0gUkJfSEFMVDsKKwkgICAgICBpZiAoKnN0ciA9PSAnYycpCisJCWNsdmFsIHw9IFJCX0NPTkZJRzsKKwkgICAgICBpZiAoKnN0ciA9PSAnZCcpCisJCWNsdmFsIHw9IFJCX0tEQjsKKwkgICAgICBpZiAoKnN0ciA9PSAnRCcpCisJCWNsdmFsIHw9IFJCX01VTFRJUExFOworCSAgICAgIGlmICgqc3RyID09ICdnJykKKwkJY2x2YWwgfD0gUkJfR0RCOworCSAgICAgIGlmICgqc3RyID09ICdoJykKKwkJY2x2YWwgfD0gUkJfU0VSSUFMOworCSAgICAgIGlmICgqc3RyID09ICdtJykKKwkJY2x2YWwgfD0gUkJfTVVURTsKKwkgICAgICBpZiAoKnN0ciA9PSAncicpCisJCWNsdmFsIHw9IFJCX0RGTFRST09UOworCSAgICAgIGlmICgqc3RyID09ICdzJykKKwkJY2x2YWwgfD0gUkJfU0lOR0xFOworCSAgICAgIGlmICgqc3RyID09ICd2JykKKwkJY2x2YWwgfD0gUkJfVkVSQk9TRTsKKwkgICAgICBzdHIrKzsKKwkgICAgfQorCSAgY29udGludWU7CisJfQorICAgICAgc3RyKys7CisgICAgfQorCisgIGlmICh0eXBlID09IEtFUk5FTF9UWVBFX0ZSRUVCU0QpCisgICAgeworICAgICAgY2x2YWwgfD0gUkJfQk9PVElORk87CisKKyAgICAgIGJpLmJpX3ZlcnNpb24gPSBCT09USU5GT19WRVJTSU9OOworCisgICAgICAqYXJnID0gMDsKKyAgICAgIHdoaWxlICgoLS1hcmcpID4gKGNoYXIgKikgTUJfQ01ETElORV9CVUYgJiYgKmFyZyAhPSAnLycpOworICAgICAgaWYgKCphcmcgPT0gJy8nKQorCWJpLmJpX2tlcm5lbG5hbWUgPSBhcmcgKyAxOworICAgICAgZWxzZQorCWJpLmJpX2tlcm5lbG5hbWUgPSAwOworCisgICAgICBiaS5iaV9uZnNfZGlza2xlc3MgPSAwOworICAgICAgYmkuYmlfbl9iaW9zX3VzZWQgPSAwOwkvKiB0aGlzIGZpZWxkIGlzIGFwcGFyZW50bHkgdW51c2VkICovCisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOX0JJT1NfR0VPTTsgaSsrKQorCXsKKwkgIHN0cnVjdCBnZW9tZXRyeSBnZW9tOworCisJICAvKiBYWFggU2hvdWxkIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUuICAqLworCSAgZ2V0X2Rpc2tpbmZvIChpICsgMHg4MCwgJmdlb20pOworCSAgLyogRklYTUU6IElmIEhFQURTIG9yIFNFQ1RPUlMgaXMgZ3JlYXRlciB0aGFuIDI1NSwgdGhlbiB0aGlzIHdpbGwKKwkgICAgIGJyZWFrIHRoZSBnZW9tZXRyeSBpbmZvcm1hdGlvbi4gVGhhdCBpcyBhIGRyYXdiYWNrIG9mIEJTRAorCSAgICAgYnV0IG5vdCBvZiBHUlVCLiAgKi8KKwkgIGJpLmJpX2Jpb3NfZ2VvbVtpXSA9ICgoKGdlb20uY3lsaW5kZXJzIC0gMSkgPDwgMTYpCisJCQkJKyAoKChnZW9tLmhlYWRzIC0gMSkgJiAweGZmKSA8PCA4KQorCQkJCSsgKGdlb20uc2VjdG9ycyAmIDB4ZmYpKTsKKwl9CisKKyAgICAgIGJpLmJpX3NpemUgPSBzaXplb2YgKHN0cnVjdCBib290aW5mbyk7CisgICAgICBiaS5iaV9tZW1zaXplc192YWxpZCA9IDE7CisgICAgICBiaS5iaV9iaW9zX2RldiA9IHNhdmVkX2RyaXZlOworICAgICAgYmkuYmlfYmFzZW1lbSA9IG1iaS5tZW1fbG93ZXI7CisgICAgICBiaS5iaV9leHRtZW0gPSBleHRlbmRlZF9tZW1vcnk7CisKKyAgICAgIGlmIChtYmkuZmxhZ3MgJiBNQl9JTkZPX0FPVVRfU1lNUykKKwl7CisJICBiaS5iaV9zeW10YWIgPSBtYmkuc3ltcy5hLmFkZHI7CisJICBiaS5iaV9lc3ltdGFiID0gbWJpLnN5bXMuYS5hZGRyICsgNAorCSAgICArIG1iaS5zeW1zLmEudGFic2l6ZSArIG1iaS5zeW1zLmEuc3Ryc2l6ZTsKKwl9CisjaWYgMAorICAgICAgZWxzZSBpZiAobWJpLmZsYWdzICYgTUJfSU5GT19FTEZfU0hEUikKKwl7CisJICAvKiBGSVhNRTogU2hvdWxkIGNoZWNrIGlmIGEgc3ltYm9sIHRhYmxlIGV4aXN0cyBhbmQsIGlmIGV4aXN0cywKKwkgICAgIHBhc3MgdGhlIHRhYmxlIHRvIEJJLiAgKi8KKwl9CisjZW5kaWYKKyAgICAgIGVsc2UKKwl7CisJICBiaS5iaV9zeW10YWIgPSAwOworCSAgYmkuYmlfZXN5bXRhYiA9IDA7CisJfQorCisgICAgICAvKiBjYWxsIGVudHJ5IHBvaW50ICovCisgICAgICAoKmVudHJ5X2FkZHIpIChjbHZhbCwgYm9vdGRldiwgMCwgMCwgMCwgKChpbnQpICgmYmkpKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyoKKyAgICAgICAqICBXZSBub3cgcGFzcyB0aGUgdmFyaW91cyBib290c3RyYXAgcGFyYW1ldGVycyB0byB0aGUgbG9hZGVkCisgICAgICAgKiAgaW1hZ2UgdmlhIHRoZSBhcmd1bWVudCBsaXN0LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIHRoZSBvZmZpY2lhbCBsaXN0OgorICAgICAgICoKKyAgICAgICAqICBhcmcwID0gOCAobWFnaWMpCisgICAgICAgKiAgYXJnMSA9IGJvb3QgZmxhZ3MKKyAgICAgICAqICBhcmcyID0gYm9vdCBkZXZpY2UKKyAgICAgICAqICBhcmczID0gc3RhcnQgb2Ygc3ltYm9sIHRhYmxlICgwIGlmIG5vdCBsb2FkZWQpCisgICAgICAgKiAgYXJnNCA9IGVuZCBvZiBzeW1ib2wgdGFibGUgKDAgaWYgbm90IGxvYWRlZCkKKyAgICAgICAqICBhcmc1ID0gdHJhbnNmZXIgYWRkcmVzcyBmcm9tIGltYWdlCisgICAgICAgKiAgYXJnNiA9IHRyYW5zZmVyIGFkZHJlc3MgZm9yIG5leHQgaW1hZ2UgcG9pbnRlcgorICAgICAgICogIGFyZzcgPSBjb252ZW50aW9uYWwgbWVtb3J5IHNpemUgKDY0MCkKKyAgICAgICAqICBhcmc4ID0gZXh0ZW5kZWQgbWVtb3J5IHNpemUgKDgxOTYpCisgICAgICAgKgorICAgICAgICogIC4uLmluIGFjdHVhbGl0eSwgd2UganVzdCBwYXNzIHRoZSBwYXJhbWV0ZXJzIHVzZWQgYnkgdGhlIGtlcm5lbC4KKyAgICAgICAqLworCisgICAgICAvKiBjYWxsIGVudHJ5IHBvaW50ICovCisgICAgICB1bnNpZ25lZCBsb25nIGVuZF9tYXJrOworCisgICAgICBpZiAobWJpLmZsYWdzICYgTUJfSU5GT19BT1VUX1NZTVMpCisJZW5kX21hcmsgPSAobWJpLnN5bXMuYS5hZGRyICsgNAorCQkgICAgKyBtYmkuc3ltcy5hLnRhYnNpemUgKyBtYmkuc3ltcy5hLnN0cnNpemUpOworICAgICAgZWxzZQorCS8qIEZJWE1FOiBpdCBzaG91bGQgYmUgbWJpLnN5bXMuZS5zaXplLiAgKi8KKwllbmRfbWFyayA9IDA7CisgICAgICAKKyAgICAgICgqZW50cnlfYWRkcikgKGNsdmFsLCBib290ZGV2LCAwLCBlbmRfbWFyaywKKwkJICAgICBleHRlbmRlZF9tZW1vcnksIG1iaS5tZW1fbG93ZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3N0YWdlMi9idWlsdGlucy5jIGIvc3RhZ2UyL2J1aWx0aW5zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmOTEyZAotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMi9idWlsdGlucy5jCkBAIC0wLDAgKzEsNDkzOSBAQAorLyogYnVpbHRpbnMuYyAtIHRoZSBHUlVCIGJ1aWx0aW4gY29tbWFuZHMgKi8KKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDAzLDIwMDQgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyogSW5jbHVkZSBzdGRpby5oIGJlZm9yZSBzaGFyZWQuaCwgYmVjYXVzZSB3ZSBjYW4ndCBkZWZpbmUKKyAgIFdJVEhPVVRfTElCQ19TVFVCUyBoZXJlLiAgKi8KKyNpZmRlZiBHUlVCX1VUSUwKKyMgaW5jbHVkZSA8c3RkaW8uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c2hhcmVkLmg+CisjaW5jbHVkZSA8ZmlsZXN5cy5oPgorI2luY2x1ZGUgPHRlcm0uaD4KKworI2lmZGVmIFNVUFBPUlRfTkVUQk9PVAorIyBkZWZpbmUgR1JVQgkxCisjIGluY2x1ZGUgPGV0aGVyYm9vdC5oPgorI2VuZGlmCisKKyNpZmRlZiBTVVBQT1JUX1NFUklBTAorIyBpbmNsdWRlIDxzZXJpYWwuaD4KKyMgaW5jbHVkZSA8dGVybWluZm8uaD4KKyNlbmRpZgorCisjaWZkZWYgR1JVQl9VVElMCisjIGluY2x1ZGUgPGRldmljZS5oPgorI2Vsc2UgLyogISBHUlVCX1VUSUwgKi8KKyMgaW5jbHVkZSA8YXBpYy5oPgorIyBpbmNsdWRlIDxzbXAtaW1wcy5oPgorI2VuZGlmIC8qICEgR1JVQl9VVElMICovCisKKyNpZmRlZiBVU0VfTUQ1X1BBU1NXT1JEUworIyBpbmNsdWRlIDxtZDUuaD4KKyNlbmRpZgorCisvKiBUaGUgdHlwZSBvZiBrZXJuZWwgbG9hZGVkLiAgKi8KK2tlcm5lbF90IGtlcm5lbF90eXBlOworLyogVGhlIGJvb3QgZGV2aWNlLiAgKi8KK3N0YXRpYyBpbnQgYm9vdGRldjsKKy8qIFRydWUgd2hlbiB0aGUgZGVidWcgbW9kZSBpcyB0dXJuZWQgb24sIGFuZCBmYWxzZQorICAgd2hlbiBpdCBpcyB0dXJuZWQgb2ZmLiAgKi8KK2ludCBkZWJ1ZyA9IDA7CisvKiBUaGUgZGVmYXVsdCBlbnRyeS4gICovCitpbnQgZGVmYXVsdF9lbnRyeSA9IDA7CisvKiBUaGUgZmFsbGJhY2sgZW50cnkuICAqLworaW50IGZhbGxiYWNrX2VudHJ5bm87CitpbnQgZmFsbGJhY2tfZW50cmllc1tNQVhfRkFMTEJBQ0tfRU5UUklFU107CisvKiBUaGUgbnVtYmVyIG9mIGN1cnJlbnQgZW50cnkuICAqLworaW50IGN1cnJlbnRfZW50cnlubzsKKy8qIFRoZSBhZGRyZXNzIGZvciBNdWx0aWJvb3QgY29tbWFuZC1saW5lIGJ1ZmZlci4gICovCitzdGF0aWMgY2hhciAqbWJfY21kbGluZTsKKy8qIFdoZXRoZXIgb3Igbm90IHRoZSB1c2VyIGxvYWRlZCBhIGN1c3RvbSBjb21tYW5kIGxpbmUgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNtZGxpbmVfbG9hZGVkID0gMDsKKy8qIFRoZSBwYXNzd29yZC4gICovCitjaGFyICpwYXNzd29yZDsKKy8qIFRoZSBwYXNzd29yZCB0eXBlLiAgKi8KK3Bhc3N3b3JkX3QgcGFzc3dvcmRfdHlwZTsKKy8qIFRoZSBmbGFnIGZvciBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgaXMgYXV0aG9yaXRhdGl2ZS4gICovCitpbnQgYXV0aCA9IDA7CisvKiBUaGUgdGltZW91dC4gICovCitpbnQgZ3J1Yl90aW1lb3V0ID0gLTE7CisvKiBXaGV0aGVyIHRvIHNob3cgdGhlIG1lbnUgb3Igbm90LiAgKi8KK2ludCBzaG93X21lbnUgPSAxOworLyogVGhlIEJJT1MgZHJpdmUgbWFwLiAgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiaW9zX2RyaXZlX21hcFtEUklWRV9NQVBfU0laRSArIDFdOworCisvKiBQcm90b3R5cGVzIGZvciBhbGxvd2luZyBzdHJhaWdodGZvd2FyZCBjYWxsaW5nIG9mIGJ1aWx0aW5zIGZ1bmN0aW9ucworICAgaW5zaWRlIG90aGVyIGZ1bmN0aW9ucy4gICovCitzdGF0aWMgaW50IGNvbmZpZ2ZpbGVfZnVuYyAoY2hhciAqYXJnLCBpbnQgZmxhZ3MpOworCisvKiBJbml0aWFsaXplIHRoZSBkYXRhIGZvciBidWlsdGlucy4gICovCit2b2lkCitpbml0X2J1aWx0aW5zICh2b2lkKQoreworICBrZXJuZWxfdHlwZSA9IEtFUk5FTF9UWVBFX05PTkU7CisgIC8qIEJTRCBhbmQgY2hhaW5sb2FkaW5nIGV2aWwgaGFja3MhICAqLworICBib290ZGV2ID0gc2V0X2Jvb3RkZXYgKDApOworICBtYl9jbWRsaW5lID0gKGNoYXIgKikgTUJfQ01ETElORV9CVUY7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIGRhdGEgZm9yIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuICAqLwordm9pZAoraW5pdF9jb25maWcgKHZvaWQpCit7CisgIGRlZmF1bHRfZW50cnkgPSAwOworICBwYXNzd29yZCA9IDA7CisgIGZhbGxiYWNrX2VudHJ5bm8gPSAtMTsKKyAgZmFsbGJhY2tfZW50cmllc1swXSA9IC0xOworICBncnViX3RpbWVvdXQgPSAtMTsKK30KKworLyogQ2hlY2sgYSBwYXNzd29yZCBmb3IgY29ycmVjdG5lc3MuICBSZXR1cm5zIDAgaWYgcGFzc3dvcmQgd2FzCisgICBjb3JyZWN0LCBhbmQgYSB2YWx1ZSAhPSAwIGZvciBlcnJvciwgc2ltaWxhcmx5IHRvIHN0cmNtcC4gKi8KK2ludAorY2hlY2tfcGFzc3dvcmQgKGNoYXIgKmVudGVyZWQsIGNoYXIqIGV4cGVjdGVkLCBwYXNzd29yZF90IHR5cGUpCit7CisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSBQQVNTV09SRF9QTEFJTjoKKyAgICAgIHJldHVybiBzdHJjbXAgKGVudGVyZWQsIGV4cGVjdGVkKTsKKworI2lmZGVmIFVTRV9NRDVfUEFTU1dPUkRTCisgICAgY2FzZSBQQVNTV09SRF9NRDU6CisgICAgICByZXR1cm4gY2hlY2tfbWQ1X3Bhc3N3b3JkIChlbnRlcmVkLCBleHBlY3RlZCk7CisjZW5kaWYKKyAgICBkZWZhdWx0OiAKKyAgICAgIC8qIHVuc3VwcG9ydGVkIHBhc3N3b3JkIHR5cGU6IGJlIHNlY3VyZSAqLworICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCisvKiBQcmludCB3aGljaCBzZWN0b3IgaXMgcmVhZCB3aGVuIGxvYWRpbmcgYSBmaWxlLiAgKi8KK3N0YXRpYyB2b2lkCitkaXNrX3JlYWRfcHJpbnRfZnVuYyAoaW50IHNlY3RvciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKK3sKKyAgZ3J1Yl9wcmludGYgKCJbJWQsJWQsJWRdIiwgc2VjdG9yLCBvZmZzZXQsIGxlbmd0aCk7Cit9CisKKwwKKy8qIGJsb2NrbGlzdCAqLworc3RhdGljIGludAorYmxvY2tsaXN0X2Z1bmMgKGNoYXIgKmFyZywgaW50IGZsYWdzKQoreworICBjaGFyICpkdW1teSA9IChjaGFyICopIFJBV19BRERSICgweDEwMDAwMCk7CisgIGludCBzdGFydF9zZWN0b3I7CisgIGludCBudW1fc2VjdG9ycyA9IDA7CisgIGludCBudW1fZW50cmllcyA9IDA7CisgIGludCBsYXN0X2xlbmd0aCA9IDA7CisKKyAgYXV0byB2b2lkIGRpc2tfcmVhZF9ibG9ja2xpc3RfZnVuYyAoaW50IHNlY3RvciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7CisgIAorICAvKiBDb2xsZWN0IGNvbnRpZ3VvdXMgYmxvY2tzIGludG8gb25lIGVudHJ5IGFzIG1hbnkgYXMgcG9zc2libGUsCisgICAgIGFuZCBwcmludCB0aGUgYmxvY2tsaXN0IG5vdGF0aW9uIG9uIHRoZSBzY3JlZW4uICAqLworICBhdXRvIHZvaWQgZGlza19yZWFkX2Jsb2NrbGlzdF9mdW5jIChpbnQgc2VjdG9yLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQorICAgIHsKKyAgICAgIGlmIChudW1fc2VjdG9ycyA+IDApCisJeworCSAgaWYgKHN0YXJ0X3NlY3RvciArIG51bV9zZWN0b3JzID09IHNlY3RvcgorCSAgICAgICYmIG9mZnNldCA9PSAwICYmIGxhc3RfbGVuZ3RoID09IFNFQ1RPUl9TSVpFKQorCSAgICB7CisJICAgICAgbnVtX3NlY3RvcnMrKzsKKwkgICAgICBsYXN0X2xlbmd0aCA9IGxlbmd0aDsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChsYXN0X2xlbmd0aCA9PSBTRUNUT1JfU0laRSkKKwkJZ3J1Yl9wcmludGYgKCIlcyVkKyVkIiwgbnVtX2VudHJpZXMgPyAiLCIgOiAiIiwKKwkJCSAgICAgc3RhcnRfc2VjdG9yIC0gcGFydF9zdGFydCwgbnVtX3NlY3RvcnMpOworCSAgICAgIGVsc2UgaWYgKG51bV9zZWN0b3JzID4gMSkKKwkJZ3J1Yl9wcmludGYgKCIlcyVkKyVkLCVkWzAtJWRdIiwgbnVtX2VudHJpZXMgPyAiLCIgOiAiIiwKKwkJCSAgICAgc3RhcnRfc2VjdG9yIC0gcGFydF9zdGFydCwgbnVtX3NlY3RvcnMtMSwKKwkJCSAgICAgc3RhcnRfc2VjdG9yICsgbnVtX3NlY3RvcnMtMSAtIHBhcnRfc3RhcnQsIAorCQkJICAgICBsYXN0X2xlbmd0aCk7CisJICAgICAgZWxzZQorCQlncnViX3ByaW50ZiAoIiVzJWRbMC0lZF0iLCBudW1fZW50cmllcyA/ICIsIiA6ICIiLAorCQkJICAgICBzdGFydF9zZWN0b3IgLSBwYXJ0X3N0YXJ0LCBsYXN0X2xlbmd0aCk7CisJICAgICAgbnVtX2VudHJpZXMrKzsKKwkgICAgICBudW1fc2VjdG9ycyA9IDA7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChvZmZzZXQgPiAwKQorCXsKKwkgIGdydWJfcHJpbnRmKCIlcyVkWyVkLSVkXSIsIG51bV9lbnRyaWVzID8gIiwiIDogIiIsCisJCSAgICAgIHNlY3Rvci1wYXJ0X3N0YXJ0LCBvZmZzZXQsIG9mZnNldCtsZW5ndGgpOworCSAgbnVtX2VudHJpZXMrKzsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3RhcnRfc2VjdG9yID0gc2VjdG9yOworCSAgbnVtX3NlY3RvcnMgPSAxOworCSAgbGFzdF9sZW5ndGggPSBsZW5ndGg7CisJfQorICAgIH0KKworICAvKiBPcGVuIHRoZSBmaWxlLiAgKi8KKyAgaWYgKCEgZ3J1Yl9vcGVuIChhcmcpKQorICAgIHJldHVybiAxOworCisgIC8qIFByaW50IHRoZSBkZXZpY2UgbmFtZS4gICovCisgIGdydWJfcHJpbnRmICgiKCVjZCVkIiwKKwkgICAgICAgKGN1cnJlbnRfZHJpdmUgJiAweDgwKSA/ICdoJyA6ICdmJywKKwkgICAgICAgY3VycmVudF9kcml2ZSAmIH4weDgwKTsKKyAgCisgIGlmICgoY3VycmVudF9wYXJ0aXRpb24gJiAweEZGMDAwMCkgIT0gMHhGRjAwMDApCisgICAgZ3J1Yl9wcmludGYgKCIsJWQiLCAoY3VycmVudF9wYXJ0aXRpb24gPj4gMTYpICYgMHhGRik7CisgIAorICBpZiAoKGN1cnJlbnRfcGFydGl0aW9uICYgMHgwMEZGMDApICE9IDB4MDBGRjAwKQorICAgIGdydWJfcHJpbnRmICgiLCVjIiwgJ2EnICsgKChjdXJyZW50X3BhcnRpdGlvbiA+PiA4KSAmIDB4RkYpKTsKKyAgCisgIGdydWJfcHJpbnRmICgiKSIpOworCisgIC8qIFJlYWQgaW4gdGhlIHdob2xlIGZpbGUgdG8gRFVNTVkuICAqLworICBkaXNrX3JlYWRfaG9vayA9IGRpc2tfcmVhZF9ibG9ja2xpc3RfZnVuYzsKKyAgaWYgKCEgZ3J1Yl9yZWFkIChkdW1teSwgLTEpKQorICAgIGdvdG8gZmFpbDsKKworICAvKiBUaGUgbGFzdCBlbnRyeSBtYXkgbm90IGJlIHByaW50ZWQgeWV0LiAgRG9uJ3QgY2hlY2sgaWYgaXQgaXMgYQorICAgKiBmdWxsIHNlY3Rvciwgc2luY2UgaXQgZG9lc24ndCBtYXR0ZXIgaWYgd2UgcmVhZCB0b28gbXVjaC4gKi8KKyAgaWYgKG51bV9zZWN0b3JzID4gMCkKKyAgICBncnViX3ByaW50ZiAoIiVzJWQrJWQiLCBudW1fZW50cmllcyA/ICIsIiA6ICIiLAorCQkgc3RhcnRfc2VjdG9yIC0gcGFydF9zdGFydCwgbnVtX3NlY3RvcnMpOworCisgIGdydWJfcHJpbnRmICgiXG4iKTsKKyAgCisgZmFpbDoKKyAgZGlza19yZWFkX2hvb2sgPSAwOworICBncnViX2Nsb3NlICgpOworICByZXR1cm4gZXJybnVtOworfQorCitzdGF0aWMgc3RydWN0IGJ1aWx0aW4gYnVpbHRpbl9ibG9ja2xpc3QgPQoreworICAiYmxvY2tsaXN0IiwKKyAgYmxvY2tsaXN0X2Z1bmMsCisgIEJVSUxUSU5fQ01ETElORSB8IEJVSUxUSU5fSEVMUF9MSVNULAorICAiYmxvY2tsaXN0IEZJTEUiLAorICAiUHJpbnQgdGhlIGJsb2NrbGlzdCBub3RhdGlvbiBvZiB0aGUgZmlsZSBGSUxFLiIKK307CisKKy8qIGJvb3QgKi8KK3N0YXRpYyBpbnQKK2Jvb3RfZnVuYyAoY2hhciAqYXJnLCBpbnQgZmxhZ3MpCit7CisgIC8qIENsZWFyIHRoZSBpbnQxNSBoYW5kbGVyIGlmIHdlIGNhbiBib290IHRoZSBrZXJuZWwgc3VjY2Vzc2Z1bGx5LgorICAgICBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgYm9vdCBjb2RlIG5ldmVyIGZhaWxzIG9ubHkgaWYgS0VSTkVMX1RZUEUgaXMKKyAgICAgbm90IEtFUk5FTF9UWVBFX05PTkUuIElzIHRoaXMgYXNzdW1wdGlvbiBpcyBiYWQ/ICAqLworICBpZiAoa2VybmVsX3R5cGUgIT0gS0VSTkVMX1RZUEVfTk9ORSkKKyAgICB1bnNldF9pbnQxNV9oYW5kbGVyICgpOworCisjaWZkZWYgU1VQUE9SVF9ORVRCT09UCisgIC8qIFNodXQgZG93biB0aGUgbmV0d29ya2luZy4gICovCisgIGNsZWFudXBfbmV0ICgpOworI2VuZGlmCisgIAorICBzd2l0Y2ggKGtlcm5lbF90eXBlKQorICAgIHsKKyAgICBjYXNlIEtFUk5FTF9UWVBFX0ZSRUVCU0Q6CisgICAgY2FzZSBLRVJORUxfVFlQRV9ORVRCU0Q6CisgICAgICAvKiAqQlNEICovCisgICAgICBic2RfYm9vdCAoa2VybmVsX3R5cGUsIGJvb3RkZXYsIChjaGFyICopIG1iaS5jbWRsaW5lKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBLRVJORUxfVFlQRV9MSU5VWDoKKyAgICAgIC8qIExpbnV4ICovCisgICAgICBsaW51eF9ib290ICgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEtFUk5FTF9UWVBFX0JJR19MSU5VWDoKKyAgICAgIC8qIEJpZyBMaW51eCAqLworICAgICAgYmlnX2xpbnV4X2Jvb3QgKCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgS0VSTkVMX1RZUEVfQ0hBSU5MT0FERVI6CisgICAgICAvKiBDaGFpbmxvYWRlciAqLworICAgICAgCisgICAgICAvKiBDaGVjayBpZiB3ZSBzaG91bGQgc2V0IHRoZSBpbnQxMyBoYW5kbGVyLiAgKi8KKyAgICAgIGlmIChiaW9zX2RyaXZlX21hcFswXSAhPSAwKQorCXsKKwkgIGludCBpOworCSAgCisJICAvKiBTZWFyY2ggZm9yIFNBVkVEX0RSSVZFLiAgKi8KKwkgIGZvciAoaSA9IDA7IGkgPCBEUklWRV9NQVBfU0laRTsgaSsrKQorCSAgICB7CisJICAgICAgaWYgKCEgYmlvc19kcml2ZV9tYXBbaV0pCisJCWJyZWFrOworCSAgICAgIGVsc2UgaWYgKChiaW9zX2RyaXZlX21hcFtpXSAmIDB4RkYpID09IHNhdmVkX2RyaXZlKQorCQl7CisJCSAgLyogRXhjaGFnZSBTQVZFRF9EUklWRSB3aXRoIHRoZSBtYXBwZWQgZHJpdmUuICAqLworCQkgIHNhdmVkX2RyaXZlID0gKGJpb3NfZHJpdmVfbWFwW2ldID4+IDgpICYgMHhGRjsKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisJICAKKwkgIC8qIFNldCB0aGUgaGFuZGxlci4gVGhpcyBpcyBzb21ld2hhdCBkYW5nZXJvdXMuICAqLworCSAgc2V0X2ludDEzX2hhbmRsZXIgKGJpb3NfZHJpdmVfbWFwKTsKKwl9CisgICAgICAKKyAgICAgIGdhdGVBMjAgKDApOworICAgICAgYm9vdF9kcml2ZSA9IHNhdmVkX2RyaXZlOworICAgICAgY2hhaW5fc3RhZ2UxICgwLCBCT09UU0VDX0xPQ0FUSU9OLCBib290X3BhcnRfYWRkcik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgS0VSTkVMX1RZUEVfTVVMVElCT09UOgorICAgICAgLyogTXVsdGlib290ICovCisgICAgICBtdWx0aV9ib290ICgoaW50KSBlbnRyeV9hZGRyLCAoaW50KSAmbWJpKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGVycm51bSA9IEVSUl9CT09UX0NPTU1BTkQ7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX2Jvb3QgPQoreworICAiYm9vdCIsCisgIGJvb3RfZnVuYywKKyAgQlVJTFRJTl9DTURMSU5FIHwgQlVJTFRJTl9IRUxQX0xJU1QsCisgICJib290IiwKKyAgIkJvb3QgdGhlIE9TL2NoYWluLWxvYWRlciB3aGljaCBoYXMgYmVlbiBsb2FkZWQuIgorfTsKKworDAorI2lmZGVmIFNVUFBPUlRfTkVUQk9PVAorLyogYm9vdHAgKi8KK3N0YXRpYyBpbnQKK2Jvb3RwX2Z1bmMgKGNoYXIgKmFyZywgaW50IGZsYWdzKQoreworICBpbnQgd2l0aF9jb25maWdmaWxlID0gMDsKKworICBpZiAoZ3J1Yl9tZW1jbXAgKGFyZywgIi0td2l0aC1jb25maWdmaWxlIiwgc2l6ZW9mICgiLS13aXRoLWNvbmZpZ2ZpbGUiKSAtIDEpCisgICAgICA9PSAwKQorICAgIHsKKyAgICAgIHdpdGhfY29uZmlnZmlsZSA9IDE7CisgICAgICBhcmcgPSBza2lwX3RvICgwLCBhcmcpOworICAgIH0KKyAgCisgIGlmICghIGJvb3RwICgpKQorICAgIHsKKyAgICAgIGlmIChlcnJudW0gPT0gRVJSX05PTkUpCisJZXJybnVtID0gRVJSX0RFVl9WQUxVRVM7CisKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBOb3RpZnkgdGhlIGNvbmZpZ3VyYXRpb24uICAqLworICBwcmludF9uZXR3b3JrX2NvbmZpZ3VyYXRpb24gKCk7CisKKyAgLyogWFhYOiB0aGlzIGNhbiBjYXVzZSBhbiBlbmRsZXNzIGxvb3AsIGJ1dCB0aGVyZSBpcyBubyBlYXN5IHdheSB0bworICAgICBkZXRlY3Qgc3VjaCBhIGxvb3AgdW5mb3J0dW5hdGVseS4gICovCisgIGlmICh3aXRoX2NvbmZpZ2ZpbGUpCisgICAgY29uZmlnZmlsZV9mdW5jIChjb25maWdfZmlsZSwgZmxhZ3MpOworICAKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX2Jvb3RwID0KK3sKKyAgImJvb3RwIiwKKyAgYm9vdHBfZnVuYywKKyAgQlVJTFRJTl9DTURMSU5FIHwgQlVJTFRJTl9NRU5VIHwgQlVJTFRJTl9IRUxQX0xJU1QsCisgICJib290cCBbLS13aXRoLWNvbmZpZ2ZpbGVdIiwKKyAgIkluaXRpYWxpemUgYSBuZXR3b3JrIGRldmljZSB2aWEgQk9PVFAuIElmIHRoZSBvcHRpb24gYC0td2l0aC1jb25maWdmaWxlJyIKKyAgIiBpcyBnaXZlbiwgdHJ5IHRvIGxvYWQgYSBjb25maWd1cmF0aW9uIGZpbGUgc3BlY2lmaWVkIGJ5IHRoZSAxNTAgdmVuZG9yIgorICAiIHRhZy4iCit9OworI2VuZGlmIC8qIFNVUFBPUlRfTkVUQk9PVCAqLworCisMCisvKiBjYXQgKi8KK3N0YXRpYyBpbnQKK2NhdF9mdW5jIChjaGFyICphcmcsIGludCBmbGFncykKK3sKKyAgY2hhciBjOworCisgIGlmICghIGdydWJfb3BlbiAoYXJnKSkKKyAgICByZXR1cm4gMTsKKworICB3aGlsZSAoZ3J1Yl9yZWFkICgmYywgMSkpCisgICAgeworICAgICAgLyogQmVjYXVzZSBydW5uaW5nICJjYXQiIHdpdGggYSBiaW5hcnkgZmlsZSBjYW4gY29uZnVzZSB0aGUgdGVybWluYWwsCisJIHByaW50IG9ubHkgc29tZSBjaGFyYWN0ZXJzIGFzIHRoZXkgYXJlLiAgKi8KKyAgICAgIGlmIChncnViX2lzc3BhY2UgKGMpIHx8IChjID49ICcgJyAmJiBjIDw9ICd+JykpCisJZ3J1Yl9wdXRjaGFyIChjKTsKKyAgICAgIGVsc2UKKwlncnViX3B1dGNoYXIgKCc/Jyk7CisgICAgfQorICAKKyAgZ3J1Yl9jbG9zZSAoKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX2NhdCA9Cit7CisgICJjYXQiLAorICBjYXRfZnVuYywKKyAgQlVJTFRJTl9DTURMSU5FIHwgQlVJTFRJTl9IRUxQX0xJU1QsCisgICJjYXQgRklMRSIsCisgICJQcmludCB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgRklMRS4iCit9OworCisMCisvKiBjaGFpbmxvYWRlciAqLworc3RhdGljIGludAorY2hhaW5sb2FkZXJfZnVuYyAoY2hhciAqYXJnLCBpbnQgZmxhZ3MpCit7CisgIGludCBmb3JjZSA9IDA7CisgIGNoYXIgKmZpbGUgPSBhcmc7CisKKyAgLyogSWYgdGhlIG9wdGlvbiBgLS1mb3JjZScgaXMgc3BlY2lmaWVkPyAgKi8KKyAgaWYgKHN1YnN0cmluZyAoIi0tZm9yY2UiLCBhcmcpIDw9IDApCisgICAgeworICAgICAgZm9yY2UgPSAxOworICAgICAgZmlsZSA9IHNraXBfdG8gKDAsIGFyZyk7CisgICAgfQorCisgIC8qIE9wZW4gdGhlIGZpbGUuICAqLworICBpZiAoISBncnViX29wZW4gKGZpbGUpKQorICAgIHsKKyAgICAgIGtlcm5lbF90eXBlID0gS0VSTkVMX1RZUEVfTk9ORTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBSZWFkIHRoZSBmaXJzdCBibG9jay4gICovCisgIGlmIChncnViX3JlYWQgKChjaGFyICopIEJPT1RTRUNfTE9DQVRJT04sIFNFQ1RPUl9TSVpFKSAhPSBTRUNUT1JfU0laRSkKKyAgICB7CisgICAgICBncnViX2Nsb3NlICgpOworICAgICAga2VybmVsX3R5cGUgPSBLRVJORUxfVFlQRV9OT05FOworCisgICAgICAvKiBUaGlzIGJlbG93IGhhcHBlbnMsIGlmIGEgZmlsZSB3aG9zZSBzaXplIGlzIGxlc3MgdGhhbiA1MTIgYnl0ZXMKKwkgaXMgbG9hZGVkLiAgKi8KKyAgICAgIGlmIChlcnJudW0gPT0gRVJSX05PTkUpCisJZXJybnVtID0gRVJSX0VYRUNfRk9STUFUOworICAgICAgCisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgLyogSWYgbm90IGxvYWRpbmcgaXQgZm9yY2libHksIGNoZWNrIGZvciB0aGUgc2lnbmF0dXJlLiAgKi8KKyAgaWYgKCEgZm9yY2UKKyAgICAgICYmICgqKCh1bnNpZ25lZCBzaG9ydCAqKSAoQk9PVFNFQ19MT0NBVElPTiArIEJPT1RTRUNfU0lHX09GRlNFVCkpCisJICAhPSBCT09UU0VDX1NJR05BVFVSRSkpCisgICAgeworICAgICAgZ3J1Yl9jbG9zZSAoKTsKKyAgICAgIGVycm51bSA9IEVSUl9FWEVDX0ZPUk1BVDsKKyAgICAgIGtlcm5lbF90eXBlID0gS0VSTkVMX1RZUEVfTk9ORTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBncnViX2Nsb3NlICgpOworICBrZXJuZWxfdHlwZSA9IEtFUk5FTF9UWVBFX0NIQUlOTE9BREVSOworCisgIC8qIFhYWDogV2luZG93cyBldmlsIGhhY2suIEZvciBub3csIG9ubHkgdGhlIGZpcnN0IGZpdmUgbGV0dGVycyBhcmUKKyAgICAgY2hlY2tlZC4gICovCisgIGlmIChJU19QQ19TTElDRV9UWVBFX0ZBVCAoY3VycmVudF9zbGljZSkKKyAgICAgICYmICEgZ3J1Yl9tZW1jbXAgKChjaGFyICopIEJPT1RTRUNfTE9DQVRJT04gKyBCT09UU0VDX0JQQl9TWVNURU1fSUQsCisJCQkiTVNXSU4iLCA1KSkKKyAgICAqKCh1bnNpZ25lZCBsb25nICopIChCT09UU0VDX0xPQ0FUSU9OICsgQk9PVFNFQ19CUEJfSElEREVOX1NFQ1RPUlMpKQorICAgICAgPSBwYXJ0X3N0YXJ0OworCisgIGVycm51bSA9IEVSUl9OT05FOworICAKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX2NoYWlubG9hZGVyID0KK3sKKyAgImNoYWlubG9hZGVyIiwKKyAgY2hhaW5sb2FkZXJfZnVuYywKKyAgQlVJTFRJTl9DTURMSU5FIHwgQlVJTFRJTl9IRUxQX0xJU1QsCisgICJjaGFpbmxvYWRlciBbLS1mb3JjZV0gRklMRSIsCisgICJMb2FkIHRoZSBjaGFpbi1sb2FkZXIgRklMRS4gSWYgLS1mb3JjZSBpcyBzcGVjaWZpZWQsIHRoZW4gbG9hZCBpdCIKKyAgIiBmb3JjaWJseSwgd2hldGhlciB0aGUgYm9vdCBsb2FkZXIgc2lnbmF0dXJlIGlzIHByZXNlbnQgb3Igbm90LiIKK307CisKKwwKKy8qIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgdXNlZCB0byBkZWJ1ZyBuZXcgZmlsZXN5c3RlbSBjb2RlLiBQdXQgYSBmaWxlCisgICBpbiB0aGUgbmV3IGZpbGVzeXN0ZW0gYW5kIHRoZSBzYW1lIGZpbGUgaW4gYSB3ZWxsLXRlc3RlZCBmaWxlc3lzdGVtLgorICAgVGhlbiwgcnVuICJjbXAiIHdpdGggdGhlIGZpbGVzLiBJZiBubyBvdXRwdXQgaXMgb2J0YWluZWQsIHByb2JhYmx5CisgICB0aGUgY29kZSBpcyBnb29kLCBvdGhlcndpc2UgaW52ZXN0aWdhdGUgd2hhdCdzIHdyb25nLi4uICAqLworLyogY21wIEZJTEUxIEZJTEUyICovCitzdGF0aWMgaW50CitjbXBfZnVuYyAoY2hhciAqYXJnLCBpbnQgZmxhZ3MpCit7CisgIC8qIFRoZSBmaWxlbmFtZXMuICAqLworICBjaGFyICpmaWxlMSwgKmZpbGUyOworICAvKiBUaGUgYWRkcmVzc2VzLiAgKi8KKyAgY2hhciAqYWRkcjEsICphZGRyMjsKKyAgaW50IGk7CisgIC8qIFRoZSBzaXplIG9mIHRoZSBmaWxlLiAgKi8KKyAgaW50IHNpemU7CisKKyAgLyogR2V0IHRoZSBmaWxlbmFtZXMgZnJvbSBBUkcuICAqLworICBmaWxlMSA9IGFyZzsKKyAgZmlsZTIgPSBza2lwX3RvICgwLCBhcmcpOworICBpZiAoISAqZmlsZTEgfHwgISAqZmlsZTIpCisgICAgeworICAgICAgZXJybnVtID0gRVJSX0JBRF9BUkdVTUVOVDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBUZXJtaW5hdGUgdGhlIGZpbGVuYW1lcyBmb3IgY29udmVuaWVuY2UuICAqLworICBudWxfdGVybWluYXRlIChmaWxlMSk7CisgIG51bF90ZXJtaW5hdGUgKGZpbGUyKTsKKworICAvKiBSZWFkIHRoZSB3aG9sZSBkYXRhIGZyb20gRklMRTEuICAqLworICBhZGRyMSA9IChjaGFyICopIFJBV19BRERSICgweDEwMDAwMCk7CisgIGlmICghIGdydWJfb3BlbiAoZmlsZTEpKQorICAgIHJldHVybiAxOworICAKKyAgLyogR2V0IHRoZSBzaXplLiAgKi8KKyAgc2l6ZSA9IGZpbGVtYXg7CisgIGlmIChncnViX3JlYWQgKGFkZHIxLCAtMSkgIT0gc2l6ZSkKKyAgICB7CisgICAgICBncnViX2Nsb3NlICgpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAKKyAgZ3J1Yl9jbG9zZSAoKTsKKworICAvKiBSZWFkIHRoZSB3aG9sZSBkYXRhIGZyb20gRklMRTIuICAqLworICBhZGRyMiA9IGFkZHIxICsgc2l6ZTsKKyAgaWYgKCEgZ3J1Yl9vcGVuIChmaWxlMikpCisgICAgcmV0dXJuIDE7CisKKyAgLyogQ2hlY2sgaWYgdGhlIHNpemUgb2YgRklMRTIgaXMgZXF1YWwgdG8gdGhlIG9uZSBvZiBGSUxFMi4gICovCisgIGlmIChzaXplICE9IGZpbGVtYXgpCisgICAgeworICAgICAgZ3J1Yl9wcmludGYgKCJEaWZmZXIgaW4gc2l6ZTogMHgleCBbJXNdLCAweCV4IFslc11cbiIsCisJCSAgIHNpemUsIGZpbGUxLCBmaWxlbWF4LCBmaWxlMik7CisgICAgICBncnViX2Nsb3NlICgpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAKKyAgaWYgKCEgZ3J1Yl9yZWFkIChhZGRyMiwgLTEpKQorICAgIHsKKyAgICAgIGdydWJfY2xvc2UgKCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIAorICBncnViX2Nsb3NlICgpOworCisgIC8qIE5vdyBjb21wYXJlIEFERFIxIHdpdGggQUREUjIuICAqLworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgIHsKKyAgICAgIGlmIChhZGRyMVtpXSAhPSBhZGRyMltpXSkKKwlncnViX3ByaW50ZiAoIkRpZmZlciBhdCB0aGUgb2Zmc2V0ICVkOiAweCV4IFslc10sIDB4JXggWyVzXVxuIiwKKwkJICAgICBpLCAodW5zaWduZWQpIGFkZHIxW2ldLCBmaWxlMSwKKwkJICAgICAodW5zaWduZWQpIGFkZHIyW2ldLCBmaWxlMik7CisgICAgfQorICAKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX2NtcCA9Cit7CisgICJjbXAiLAorICBjbXBfZnVuYywKKyAgQlVJTFRJTl9DTURMSU5FLAorICAiY21wIEZJTEUxIEZJTEUyIiwKKyAgIkNvbXBhcmUgdGhlIGZpbGUgRklMRTEgd2l0aCB0aGUgRklMRTIgYW5kIGluZm9ybSB0aGUgZGlmZmVyZW50IHZhbHVlcyIKKyAgIiBpZiBhbnkuIgorfTsKKworDAorLyogY29sb3IgKi8KKy8qIFNldCBuZXcgY29sb3JzIHVzZWQgZm9yIHRoZSBtZW51IGludGVyZmFjZS4gU3VwcG9ydCB0d28gbWV0aG9kcyB0bworICAgc3BlY2lmeSBhIGNvbG9yIG5hbWU6IGEgZGlyZWN0IGludGVnZXIgcmVwcmVzZW50YXRpb24gYW5kIGEgc3ltYm9saWMKKyAgIGNvbG9yIG5hbWUuIEFuIGV4YW1wbGUgb2YgdGhlIGxhdHRlciBpcyAiYmxpbmstbGlnaHQtZ3JheS9ibHVlIi4gICovCitzdGF0aWMgaW50Citjb2xvcl9mdW5jIChjaGFyICphcmcsIGludCBmbGFncykKK3sKKyAgY2hhciAqbm9ybWFsOworICBjaGFyICpoaWdobGlnaHQ7CisgIGludCBuZXdfbm9ybWFsX2NvbG9yOworICBpbnQgbmV3X2hpZ2hsaWdodF9jb2xvcjsKKyAgc3RhdGljIGNoYXIgKmNvbG9yX2xpc3RbMTZdID0KKyAgeworICAgICJibGFjayIsCisgICAgImJsdWUiLAorICAgICJncmVlbiIsCisgICAgImN5YW4iLAorICAgICJyZWQiLAorICAgICJtYWdlbnRhIiwKKyAgICAiYnJvd24iLAorICAgICJsaWdodC1ncmF5IiwKKyAgICAiZGFyay1ncmF5IiwKKyAgICAibGlnaHQtYmx1ZSIsCisgICAgImxpZ2h0LWdyZWVuIiwKKyAgICAibGlnaHQtY3lhbiIsCisgICAgImxpZ2h0LXJlZCIsCisgICAgImxpZ2h0LW1hZ2VudGEiLAorICAgICJ5ZWxsb3ciLAorICAgICJ3aGl0ZSIKKyAgfTsKKworICBhdXRvIGludCBjb2xvcl9udW1iZXIgKGNoYXIgKnN0cik7CisgIAorICAvKiBDb252ZXJ0IHRoZSBjb2xvciBuYW1lIFNUUiBpbnRvIHRoZSBtYWdpY2FsIG51bWJlci4gICovCisgIGF1dG8gaW50IGNvbG9yX251bWJlciAoY2hhciAqc3RyKQorICAgIHsKKyAgICAgIGNoYXIgKnB0cjsKKyAgICAgIGludCBpOworICAgICAgaW50IGNvbG9yID0gMDsKKyAgICAgIAorICAgICAgLyogRmluZCB0aGUgc2VwYXJhdG9yLiAgKi8KKyAgICAgIGZvciAocHRyID0gc3RyOyAqcHRyICYmICpwdHIgIT0gJy8nOyBwdHIrKykKKwk7CisKKyAgICAgIC8qIElmIG5vdCBmb3VuZCwgcmV0dXJuIC0xLiAgKi8KKyAgICAgIGlmICghICpwdHIpCisJcmV0dXJuIC0xOworCisgICAgICAvKiBUZXJtaW5hdGUgdGhlIHN0cmluZyBTVFIuICAqLworICAgICAgKnB0cisrID0gMDsKKworICAgICAgLyogSWYgU1RSIGNvbnRhaW5zIHRoZSBwcmVmaXggImJsaW5rLSIsIHRoZW4gc2V0IHRoZSBgYmxpbmsnIGJpdAorCSBpbiBDT0xPUi4gICovCisgICAgICBpZiAoc3Vic3RyaW5nICgiYmxpbmstIiwgc3RyKSA8PSAwKQorCXsKKwkgIGNvbG9yID0gMHg4MDsKKwkgIHN0ciArPSA2OworCX0KKyAgICAgIAorICAgICAgLyogU2VhcmNoIGZvciB0aGUgY29sb3IgbmFtZS4gICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwlpZiAoZ3J1Yl9zdHJjbXAgKGNvbG9yX2xpc3RbaV0sIHN0cikgPT0gMCkKKwkgIHsKKwkgICAgY29sb3IgfD0gaTsKKwkgICAgYnJlYWs7CisJICB9CisKKyAgICAgIGlmIChpID09IDE2KQorCXJldHVybiAtMTsKKworICAgICAgc3RyID0gcHRyOworICAgICAgbnVsX3Rlcm1pbmF0ZSAoc3RyKTsKKworICAgICAgLyogU2VhcmNoIGZvciB0aGUgY29sb3IgbmFtZS4gICovICAgICAgCisgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCWlmIChncnViX3N0cmNtcCAoY29sb3JfbGlzdFtpXSwgc3RyKSA9PSAwKQorCSAgeworCSAgICBjb2xvciB8PSBpIDw8IDQ7CisJICAgIGJyZWFrOworCSAgfQorCisgICAgICBpZiAoaSA9PSA4KQorCXJldHVybiAtMTsKKworICAgICAgcmV0dXJuIGNvbG9yOworICAgIH0KKyAgICAgIAorICBub3JtYWwgPSBhcmc7CisgIGhpZ2hsaWdodCA9IHNraXBfdG8gKDAsIGFyZyk7CisKKyAgbmV3X25vcm1hbF9jb2xvciA9IGNvbG9yX251bWJlciAobm9ybWFsKTsKKyAgaWYgKG5ld19ub3JtYWxfY29sb3IgPCAwICYmICEgc2FmZV9wYXJzZV9tYXhpbnQgKCZub3JtYWwsICZuZXdfbm9ybWFsX2NvbG9yKSkKKyAgICByZXR1cm4gMTsKKyAgCisgIC8qIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgb3B0aW9uYWwsIHNvIHNldCBoaWdobGlnaHRfY29sb3IKKyAgICAgdG8gaW52ZXJ0ZWQgTk9STUFMX0NPTE9SLiAgKi8KKyAgaWYgKCEgKmhpZ2hsaWdodCkKKyAgICBuZXdfaGlnaGxpZ2h0X2NvbG9yID0gKChuZXdfbm9ybWFsX2NvbG9yID4+IDQpCisJCQkgICB8ICgobmV3X25vcm1hbF9jb2xvciAmIDB4ZikgPDwgNCkpOworICBlbHNlCisgICAgeworICAgICAgbmV3X2hpZ2hsaWdodF9jb2xvciA9IGNvbG9yX251bWJlciAoaGlnaGxpZ2h0KTsKKyAgICAgIGlmIChuZXdfaGlnaGxpZ2h0X2NvbG9yIDwgMAorCSAgJiYgISBzYWZlX3BhcnNlX21heGludCAoJmhpZ2hsaWdodCwgJm5ld19oaWdobGlnaHRfY29sb3IpKQorCXJldHVybiAxOworICAgIH0KKworICBpZiAoY3VycmVudF90ZXJtLT5zZXRjb2xvcikKKyAgICBjdXJyZW50X3Rlcm0tPnNldGNvbG9yIChuZXdfbm9ybWFsX2NvbG9yLCBuZXdfaGlnaGxpZ2h0X2NvbG9yKTsKKyAgCisgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJ1aWx0aW4gYnVpbHRpbl9jb2xvciA9Cit7CisgICJjb2xvciIsCisgIGNvbG9yX2Z1bmMsCisgIEJVSUxUSU5fQ01ETElORSB8IEJVSUxUSU5fTUVOVSB8IEJVSUxUSU5fSEVMUF9MSVNULAorICAiY29sb3IgTk9STUFMIFtISUdITElHSFRdIiwKKyAgIkNoYW5nZSB0aGUgbWVudSBjb2xvcnMuIFRoZSBjb2xvciBOT1JNQUwgaXMgdXNlZCBmb3IgbW9zdCIKKyAgIiBsaW5lcyBpbiB0aGUgbWVudSwgYW5kIHRoZSBjb2xvciBISUdITElHSFQgaXMgdXNlZCB0byBoaWdobGlnaHQgdGhlIgorICAiIGxpbmUgd2hlcmUgdGhlIGN1cnNvciBwb2ludHMuIElmIHlvdSBvbWl0IEhJR0hMSUdIVCwgdGhlbiB0aGUiCisgICIgaW52ZXJ0ZWQgY29sb3Igb2YgTk9STUFMIGlzIHVzZWQgZm9yIHRoZSBoaWdobGlnaHRlZCBsaW5lLiIKKyAgIiBUaGUgZm9ybWF0IG9mIGEgY29sb3IgaXMgXCJGRy9CR1wiLiBGRyBhbmQgQkcgYXJlIHN5bWJvbGljIGNvbG9yIG5hbWVzLiIKKyAgIiBBIHN5bWJvbGljIGNvbG9yIG5hbWUgbXVzdCBiZSBvbmUgb2YgdGhlc2U6IGJsYWNrLCBibHVlLCBncmVlbiwiCisgICIgY3lhbiwgcmVkLCBtYWdlbnRhLCBicm93biwgbGlnaHQtZ3JheSwgZGFyay1ncmF5LCBsaWdodC1ibHVlLCIKKyAgIiBsaWdodC1ncmVlbiwgbGlnaHQtY3lhbiwgbGlnaHQtcmVkLCBsaWdodC1tYWdlbnRhLCB5ZWxsb3cgYW5kIHdoaXRlLiIKKyAgIiBCdXQgb25seSB0aGUgZmlyc3QgZWlnaHQgbmFtZXMgY2FuIGJlIHVzZWQgZm9yIEJHLiBZb3UgY2FuIHByZWZpeCIKKyAgIiBcImJsaW5rLVwiIHRvIEZHIGlmIHlvdSB3YW50IGEgYmxpbmtpbmcgZm9yZWdyb3VuZCBjb2xvci4iCit9OworCisMCisvKiBjb25maWdmaWxlICovCitzdGF0aWMgaW50Citjb25maWdmaWxlX2Z1bmMgKGNoYXIgKmFyZywgaW50IGZsYWdzKQoreworICBjaGFyICpuZXdfY29uZmlnID0gY29uZmlnX2ZpbGU7CisKKyAgLyogQ2hlY2sgaWYgdGhlIGZpbGUgQVJHIGlzIHByZXNlbnQuICAqLworICBpZiAoISBncnViX29wZW4gKGFyZykpCisgICAgcmV0dXJuIDE7CisKKyAgZ3J1Yl9jbG9zZSAoKTsKKyAgCisgIC8qIENvcHkgQVJHIHRvIENPTkZJR19GSUxFLiAgKi8KKyAgd2hpbGUgKCgqbmV3X2NvbmZpZysrID0gKmFyZysrKSAhPSAwKQorICAgIDsKKworI2lmZGVmIEdSVUJfVVRJTAorICAvKiBGb3JjZSB0byBsb2FkIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuICAqLworICB1c2VfY29uZmlnX2ZpbGUgPSAxOworI2VuZGlmCisKKyAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIHVzZXIgd2lsbCBub3QgYmUgYXV0aG9yaXRhdGl2ZS4gICovCisgIGF1dGggPSAwOworICAKKyAgLyogUmVzdGFydCBjbWFpbi4gICovCisgIGdydWJfbG9uZ2ptcCAocmVzdGFydF9lbnYsIDApOworCisgIC8qIE5ldmVyIHJlYWNoIGhlcmUuICAqLworICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBidWlsdGluIGJ1aWx0aW5fY29uZmlnZmlsZSA9Cit7CisgICJjb25maWdmaWxlIiwKKyAgY29uZmlnZmlsZV9mdW5jLAorICBCVUlMVElOX0NNRExJTkUgfCBCVUlMVElOX0hFTFBfTElTVCwKKyAgImNvbmZpZ2ZpbGUgRklMRSIsCisgICJMb2FkIEZJTEUgYXMgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4iCit9OworCisMCisvKiBkZWJ1ZyAqLworc3RhdGljIGludAorZGVidWdfZnVuYyAoY2hhciAqYXJnLCBpbnQgZmxhZ3MpCit7CisgIGlmIChkZWJ1ZykKKyAgICB7CisgICAgICBkZWJ1ZyA9IDA7CisgICAgICBncnViX3ByaW50ZiAoIiBEZWJ1ZyBtb2RlIGlzIHR1cm5lZCBvZmZcbiIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRlYnVnID0gMTsKKyAgICAgIGdydWJfcHJpbnRmICgiIERlYnVnIG1vZGUgaXMgdHVybmVkIG9uXG4iKTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX2RlYnVnID0KK3sKKyAgImRlYnVnIiwKKyAgZGVidWdfZnVuYywKKyAgQlVJTFRJTl9DTURMSU5FLAorICAiZGVidWciLAorICAiVHVybiBvbi9vZmYgdGhlIGRlYnVnIG1vZGUuIgorfTsKKworDAorLyogZGVmYXVsdCAqLworc3RhdGljIGludAorZGVmYXVsdF9mdW5jIChjaGFyICphcmcsIGludCBmbGFncykKK3sKKyNpZm5kZWYgU1VQUE9SVF9ESVNLTEVTUworICBpZiAoZ3J1Yl9zdHJjbXAgKGFyZywgInNhdmVkIikgPT0gMCkKKyAgICB7CisgICAgICBkZWZhdWx0X2VudHJ5ID0gc2F2ZWRfZW50cnlubzsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyNlbmRpZiAvKiBTVVBQT1JUX0RJU0tMRVNTICovCisgIAorICBpZiAoISBzYWZlX3BhcnNlX21heGludCAoJmFyZywgJmRlZmF1bHRfZW50cnkpKQorICAgIHJldHVybiAxOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJ1aWx0aW4gYnVpbHRpbl9kZWZhdWx0ID0KK3sKKyAgImRlZmF1bHQiLAorICBkZWZhdWx0X2Z1bmMsCisgIEJVSUxUSU5fTUVOVSwKKyNpZiAwCisgICJkZWZhdWx0IFtOVU0gfCBgc2F2ZWQnXSIsCisgICJTZXQgdGhlIGRlZmF1bHQgZW50cnkgdG8gZW50cnkgbnVtYmVyIE5VTSAoaWYgbm90IHNwZWNpZmllZCwgaXQgaXMiCisgICIgMCwgdGhlIGZpcnN0IGVudHJ5KSBvciB0aGUgZW50cnkgbnVtYmVyIHNhdmVkIGJ5IHNhdmVkZWZhdWx0LiIKKyNlbmRpZgorfTsKKworDAorI2lmZGVmIEdSVUJfVVRJTAorLyogZGV2aWNlICovCitzdGF0aWMgaW50CitkZXZpY2VfZnVuYyAoY2hhciAqYXJnLCBpbnQgZmxhZ3MpCit7CisgIGNoYXIgKmRyaXZlID0gYXJnOworICBjaGFyICpkZXZpY2U7CisKKyAgLyogR2V0IHRoZSBkcml2ZSBudW1iZXIgZnJvbSBEUklWRS4gICovCisgIGlmICghIHNldF9kZXZpY2UgKGRyaXZlKSkKKyAgICByZXR1cm4gMTsKKworICAvKiBHZXQgdGhlIGRldmljZSBhcmd1bWVudC4gICovCisgIGRldmljZSA9IHNraXBfdG8gKDAsIGRyaXZlKTsKKyAgCisgIC8qIFRlcm1pbmF0ZSBERVZJQ0UuICAqLworICBudWxfdGVybWluYXRlIChkZXZpY2UpOworCisgIGlmICghICpkZXZpY2UgfHwgISBjaGVja19kZXZpY2UgKGRldmljZSkpCisgICAgeworICAgICAgZXJybnVtID0gRVJSX0ZJTEVfTk9UX0ZPVU5EOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIGFzc2lnbl9kZXZpY2VfbmFtZSAoY3VycmVudF9kcml2ZSwgZGV2aWNlKTsKKyAgCisgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJ1aWx0aW4gYnVpbHRpbl9kZXZpY2UgPQoreworICAiZGV2aWNlIiwKKyAgZGV2aWNlX2Z1bmMsCisgIEJVSUxUSU5fTUVOVSB8IEJVSUxUSU5fQ01ETElORSB8IEJVSUxUSU5fSEVMUF9MSVNULAorICAiZGV2aWNlIERSSVZFIERFVklDRSIsCisgICJTcGVjaWZ5IERFVklDRSBhcyB0aGUgYWN0dWFsIGRyaXZlIGZvciBhIEJJT1MgZHJpdmUgRFJJVkUuIFRoaXMgY29tbWFuZCIKKyAgIiBjYW4gYmUgdXNlZCBvbmx5IGluIHRoZSBncnViIHNoZWxsLiIKK307CisjZW5kaWYgLyogR1JVQl9VVElMICovCisKKwwKKyNpZmRlZiBTVVBQT1JUX05FVEJPT1QKKy8qIGRoY3AgKi8KK3N0YXRpYyBpbnQKK2RoY3BfZnVuYyAoY2hhciAqYXJnLCBpbnQgZmxhZ3MpCit7CisgIC8qIEZvciBub3csIHRoaXMgaXMgYW4gYWxpYXMgZm9yIGJvb3RwLiAgKi8KKyAgcmV0dXJuIGJvb3RwX2Z1bmMgKGFyZywgZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IGJ1aWx0aW4gYnVpbHRpbl9kaGNwID0KK3sKKyAgImRoY3AiLAorICBkaGNwX2Z1bmMsCisgIEJVSUxUSU5fQ01ETElORSB8IEJVSUxUSU5fTUVOVSB8IEJVSUxUSU5fSEVMUF9MSVNULAorICAiZGhjcCIsCisgICJJbml0aWFsaXplIGEgbmV0d29yayBkZXZpY2UgdmlhIERIQ1AuIgorfTsKKyNlbmRpZiAvKiBTVVBQT1JUX05FVEJPT1QgKi8KKworDAorLyogZGlzcGxheWFwbSAqLworc3RhdGljIGludAorZGlzcGxheWFwbV9mdW5jIChjaGFyICphcmcsIGludCBmbGFncykKK3sKKyAgaWYgKG1iaS5mbGFncyAmIE1CX0lORk9fQVBNX1RBQkxFKQorICAgIHsKKyAgICAgIGdydWJfcHJpbnRmICgiQVBNIEJJT1MgaW5mb3JtYXRpb246XG4iCisJCSAgICIgVmVyc2lvbjogICAgICAgICAgMHgleFxuIgorCQkgICAiIDMyLWJpdCBDUzogICAgICAgIDB4JXhcbiIKKwkJICAgIiBPZmZzZXQ6ICAgICAgICAgICAweCV4XG4iCisJCSAgICIgMTYtYml0IENTOiAgICAgICAgMHgleFxuIgorCQkgICAiIDE2LWJpdCBEUzogICAgICAgIDB4JXhcbiIKKwkJICAgIiAzMi1iaXQgQ1MgbGVuZ3RoOiAweCV4XG4iCisJCSAgICIgMTYtYml0IENTIGxlbmd0aDogMHgleFxuIgorCQkgICAiIDE2LWJpdCBEUyBsZW5ndGg6IDB4JXhcbiIsCisJCSAgICh1bnNpZ25lZCkgYXBtX2Jpb3NfaW5mby52ZXJzaW9uLAorCQkgICAodW5zaWduZWQpIGFwbV9iaW9zX2luZm8uY3NlZywKKwkJICAgYXBtX2Jpb3NfaW5mby5vZmZzZXQsCisJCSAgICh1bnNpZ25lZCkgYXBtX2Jpb3NfaW5mby5jc2VnXzE2LAorCQkgICAodW5zaWduZWQpIGFwbV9iaW9zX2luZm8uZHNlZ18xNiwKKwkJICAgKHVuc2lnbmVkKSBhcG1fYmlvc19pbmZvLmNzZWdfbGVuLAorCQkgICAodW5zaWduZWQpIGFwbV9iaW9zX2luZm8uY3NlZ18xNl9sZW4sCisJCSAgICh1bnNpZ25lZCkgYXBtX2Jpb3NfaW5mby5kc2VnXzE2X2xlbik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZ3J1Yl9wcmludGYgKCJObyBBUE0gQklPUyBmb3VuZCBvciBwcm9iZSBmYWlsZWRcbiIpOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBidWlsdGluIGJ1aWx0aW5fZGlzcGxheWFwbSA9Cit7CisgICJkaXNwbGF5YXBtIiwKKyAgZGlzcGxheWFwbV9mdW5jLAorICBCVUlMVElOX0NNRExJTkUgfCBCVUlMVElOX0hFTFBfTElTVCwKKyAgImRpc3BsYXlhcG0iLAorICAiRGlzcGxheSBBUE0gQklPUyBpbmZvcm1hdGlvbi4iCit9OworCisMCisvKiBkaXNwbGF5bWVtICovCitzdGF0aWMgaW50CitkaXNwbGF5bWVtX2Z1bmMgKGNoYXIgKmFyZywgaW50IGZsYWdzKQoreworICBpZiAoZ2V0X2Vpc2FtZW1zaXplICgpICE9IC0xKQorICAgIGdydWJfcHJpbnRmICgiIEVJU0EgTWVtb3J5IEJJT1MgSW50ZXJmYWNlIGlzIHByZXNlbnRcbiIpOworICBpZiAoZ2V0X21tYXBfZW50cnkgKCh2b2lkICopIFNDUkFUQ0hBRERSLCAwKSAhPSAwCisgICAgICB8fCAqKChpbnQgKikgU0NSQVRDSEFERFIpICE9IDApCisgICAgZ3J1Yl9wcmludGYgKCIgQWRkcmVzcyBNYXAgQklPUyBJbnRlcmZhY2UgaXMgcHJlc2VudFxuIik7CisKKyAgZ3J1Yl9wcmludGYgKCIgTG93ZXIgbWVtb3J5OiAldUssICIKKwkgICAgICAgIlVwcGVyIG1lbW9yeSAodG8gZmlyc3QgY2hpcHNldCBob2xlKTogJXVLXG4iLAorCSAgICAgICBtYmkubWVtX2xvd2VyLCBtYmkubWVtX3VwcGVyKTsKKworICBpZiAobWJpLmZsYWdzICYgTUJfSU5GT19NRU1fTUFQKQorICAgIHsKKyAgICAgIHN0cnVjdCBBZGRyUmFuZ2VEZXNjICptYXAgPSAoc3RydWN0IEFkZHJSYW5nZURlc2MgKikgbWJpLm1tYXBfYWRkcjsKKyAgICAgIGludCBlbmRfYWRkciA9IG1iaS5tbWFwX2FkZHIgKyBtYmkubW1hcF9sZW5ndGg7CisKKyAgICAgIGdydWJfcHJpbnRmICgiIFtBZGRyZXNzIFJhbmdlIERlc2NyaXB0b3IgZW50cmllcyAiCisJCSAgICJpbW1lZGlhdGVseSBmb2xsb3cgKHZhbHVlcyBhcmUgNjQtYml0KV1cbiIpOworICAgICAgd2hpbGUgKGVuZF9hZGRyID4gKGludCkgbWFwKQorCXsKKwkgIGNoYXIgKnN0cjsKKworCSAgaWYgKG1hcC0+VHlwZSA9PSBNQl9BUkRfTUVNT1JZKQorCSAgICBzdHIgPSAiVXNhYmxlIFJBTSI7CisJICBlbHNlCisJICAgIHN0ciA9ICJSZXNlcnZlZCI7CisJICBncnViX3ByaW50ZiAoIiAgICVzOiAgQmFzZSBBZGRyZXNzOiAgMHgleCBYIDRHQiArIDB4JXgsXG4iCisJCSAgICAgICAiICAgICAgTGVuZ3RoOiAgIDB4JXggWCA0R0IgKyAweCV4IGJ5dGVzXG4iLAorCQkgICAgICAgc3RyLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIChtYXAtPkJhc2VBZGRyID4+IDMyKSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSAobWFwLT5CYXNlQWRkciAmIDB4RkZGRkZGRkYpLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIChtYXAtPkxlbmd0aCA+PiAzMiksCisJCSAgICAgICAodW5zaWduZWQgbG9uZykgKG1hcC0+TGVuZ3RoICYgMHhGRkZGRkZGRikpOworCisJICBtYXAgPSAoKHN0cnVjdCBBZGRyUmFuZ2VEZXNjICopICgoKGludCkgbWFwKSArIDQgKyBtYXAtPnNpemUpKTsKKwl9CisgICAgfQorCisgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJ1aWx0aW4gYnVpbHRpbl9kaXNwbGF5bWVtID0KK3sKKyAgImRpc3BsYXltZW0iLAorICBkaXNwbGF5bWVtX2Z1bmMsCisgIEJVSUxUSU5fQ01ETElORSB8IEJVSUxUSU5fSEVMUF9MSVNULAorICAiZGlzcGxheW1lbSIsCisgICJEaXNwbGF5IHdoYXQgR1JVQiB0aGlua3MgdGhlIHN5c3RlbSBhZGRyZXNzIHNwYWNlIG1hcCBvZiB0aGUiCisgICIgbWFjaGluZSBpcywgaW5jbHVkaW5nIGFsbCByZWdpb25zIG9mIHBoeXNpY2FsIFJBTSBpbnN0YWxsZWQuIgorfTsKKworDAorLyogZHVtcCBGUk9NIFRPICovCisjaWZkZWYgR1JVQl9VVElMCitzdGF0aWMgaW50CitkdW1wX2Z1bmMgKGNoYXIgKmFyZywgaW50IGZsYWdzKQoreworICBjaGFyICpmcm9tLCAqdG87CisgIEZJTEUgKmZwOworICBjaGFyIGM7CisgIAorICBmcm9tID0gYXJnOworICB0byA9IHNraXBfdG8gKDAsIGFyZyk7CisgIGlmICghICpmcm9tIHx8ICEgKnRvKQorICAgIHsKKyAgICAgIGVycm51bSA9IEVSUl9CQURfQVJHVU1FTlQ7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgbnVsX3Rlcm1pbmF0ZSAoZnJvbSk7CisgIG51bF90ZXJtaW5hdGUgKHRvKTsKKyAgCisgIGlmICghIGdydWJfb3BlbiAoZnJvbSkpCisgICAgcmV0dXJuIDE7CisKKyAgZnAgPSBmb3BlbiAodG8sICJ3Iik7CisgIGlmICghIGZwKQorICAgIHsKKyAgICAgIGVycm51bSA9IEVSUl9XUklURTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICB3aGlsZSAoZ3J1Yl9yZWFkICgmYywgMSkpCisgICAgaWYgKGZwdXRjIChjLCBmcCkgPT0gRU9GKQorICAgICAgeworCWVycm51bSA9IEVSUl9XUklURTsKKwlmY2xvc2UgKGZwKTsKKwlyZXR1cm4gMTsKKyAgICAgIH0KKworICBpZiAoZmNsb3NlIChmcCkgPT0gRU9GKQorICAgIHsKKyAgICAgIGVycm51bSA9IEVSUl9XUklURTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBncnViX2Nsb3NlICgpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBidWlsdGluIGJ1aWx0aW5fZHVtcCA9CisgIHsKKyAgICAiZHVtcCIsCisgICAgZHVtcF9mdW5jLAorICAgIEJVSUxUSU5fQ01ETElORSwKKyAgICAiZHVtcCBGUk9NIFRPIiwKKyAgICAiRHVtcCB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgRlJPTSB0byB0aGUgZmlsZSBUTy4gRlJPTSBtdXN0IGJlIgorICAgICIgYSBHUlVCIGZpbGUgYW5kIFRPIG11c3QgYmUgYW4gT1MgZmlsZS4iCisgIH07CisjZW5kaWYgLyogR1JVQl9VVElMICovCisKKwwKK3N0YXRpYyBjaGFyIGVtYmVkX2luZm9bMzJdOworLyogZW1iZWQgKi8KKy8qIEVtYmVkIGEgU3RhZ2UgMS41IGluIHRoZSBmaXJzdCBjeWxpbmRlciBhZnRlciBNQlIgb3IgaW4gdGhlCisgICBib290bG9hZGVyIGJsb2NrIGluIGEgRkZTLiAgKi8KK3N0YXRpYyBpbnQKK2VtYmVkX2Z1bmMgKGNoYXIgKmFyZywgaW50IGZsYWdzKQoreworICBjaGFyICpzdGFnZTFfNTsKKyAgY2hhciAqZGV2aWNlOworICBjaGFyICpzdGFnZTFfNV9idWZmZXIgPSAoY2hhciAqKSBSQVdfQUREUiAoMHgxMDAwMDApOworICBpbnQgbGVuLCBzaXplOworICBpbnQgc2VjdG9yOworICAKKyAgc3RhZ2UxXzUgPSBhcmc7CisgIGRldmljZSA9IHNraXBfdG8gKDAsIHN0YWdlMV81KTsKKworICAvKiBPcGVuIGEgU3RhZ2UgMS41LiAgKi8KKyAgaWYgKCEgZ3J1Yl9vcGVuIChzdGFnZTFfNSkpCisgICAgcmV0dXJuIDE7CisKKyAgLyogUmVhZCB0aGUgd2hvbGUgb2YgdGhlIFN0YWdlIDEuNS4gICovCisgIGxlbiA9IGdydWJfcmVhZCAoc3RhZ2UxXzVfYnVmZmVyLCAtMSk7CisgIGdydWJfY2xvc2UgKCk7CisgIAorICBpZiAoZXJybnVtKQorICAgIHJldHVybiAxOworICAKKyAgc2l6ZSA9IChsZW4gKyBTRUNUT1JfU0laRSAtIDEpIC8gU0VDVE9SX1NJWkU7CisgIAorICAvKiBHZXQgdGhlIGRldmljZSB3aGVyZSB0aGUgU3RhZ2UgMS41IHdpbGwgYmUgZW1iZWRkZWQuICAqLworICBzZXRfZGV2aWNlIChkZXZpY2UpOworICBpZiAoZXJybnVtKQorICAgIHJldHVybiAxOworCisgIGlmIChjdXJyZW50X3BhcnRpdGlvbiA9PSAweEZGRkZGRikKKyAgICB7CisgICAgICAvKiBFbWJlZCBpdCBhZnRlciB0aGUgTUJSLiAgKi8KKyAgICAgIAorICAgICAgY2hhciBtYnJbU0VDVE9SX1NJWkVdOworICAgICAgY2hhciBlemJpb3NfY2hlY2tbMipTRUNUT1JfU0laRV07CisgICAgICBpbnQgaTsKKyAgICAgIAorICAgICAgLyogT3BlbiB0aGUgcGFydGl0aW9uLiAgKi8KKyAgICAgIGlmICghIG9wZW5fcGFydGl0aW9uICgpKQorCXJldHVybiAxOworCisgICAgICAvKiBObyBmbG9wcHkgaGFzIE1CUi4gICovCisgICAgICBpZiAoISAoY3VycmVudF9kcml2ZSAmIDB4ODApKQorCXsKKwkgIGVycm51bSA9IEVSUl9ERVZfVkFMVUVTOworCSAgcmV0dXJuIDE7CisJfQorICAgICAgCisgICAgICAvKiBSZWFkIHRoZSBNQlIgb2YgQ1VSUkVOVF9EUklWRS4gICovCisgICAgICBpZiAoISByYXdyZWFkIChjdXJyZW50X2RyaXZlLCBQQ19NQlJfU0VDVE9SLCAwLCBTRUNUT1JfU0laRSwgbWJyKSkKKwlyZXR1cm4gMTsKKyAgICAgIAorICAgICAgLyogU2FuaXR5IGNoZWNrLiAgKi8KKyAgICAgIGlmICghIFBDX01CUl9DSEVDS19TSUcgKG1icikpCisJeworCSAgZXJybnVtID0gRVJSX0JBRF9QQVJUX1RBQkxFOworCSAgcmV0dXJuIDE7CisJfQorCisgICAgICAvKiBDaGVjayBpZiB0aGUgZGlzayBjYW4gc3RvcmUgdGhlIFN0YWdlIDEuNS4gICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCWlmIChQQ19TTElDRV9UWVBFIChtYnIsIGkpICYmIFBDX1NMSUNFX1NUQVJUIChtYnIsIGkpIC0gMSA8IHNpemUpCisJICB7CisJICAgIGVycm51bSA9IEVSUl9OT19ESVNLX1NQQUNFOworCSAgICByZXR1cm4gMTsKKwkgIH0KKyAgICAgIAorICAgICAgLyogQ2hlY2sgZm9yIEVaLUJJT1Mgc2lnbmF0dXJlLiBJdCBzaG91bGQgYmUgaW4gdGhlIHRoaXJkCisgICAgICAgKiBzZWN0b3IsIGJ1dCBkdWUgdG8gcmVtYXBwaW5nIGl0IGNhbiBhcHBlYXIgaW4gdGhlIHNlY29uZCwgc28KKyAgICAgICAqIGxvYWQgYW5kIGNoZWNrIGJvdGguICAKKyAgICAgICAqLworICAgICAgaWYgKCEgcmF3cmVhZCAoY3VycmVudF9kcml2ZSwgMSwgMCwgMiAqIFNFQ1RPUl9TSVpFLCBlemJpb3NfY2hlY2spKQorCXJldHVybiAxOworCisgICAgICBpZiAoISBtZW1jbXAgKGV6Ymlvc19jaGVjayArIDMsICJBRVJNSCIsIDUpCisJICB8fCAhIG1lbWNtcCAoZXpiaW9zX2NoZWNrICsgNTEyICsgMywgIkFFUk1IIiwgNSkpCisJeworCSAgLyogVGhlIHNwYWNlIGFmdGVyIHRoZSBNQlIgaXMgdXNlZCBieSBFWi1CSU9TIHdoaWNoIHdlIG11c3QgCisJICAgKiBub3Qgb3ZlcndyaXRlLgorCSAgICovCisJICBlcnJudW0gPSBFUlJfTk9fRElTS19TUEFDRTsKKwkgIHJldHVybiAxOworCX0KKworICAgICAgc2VjdG9yID0gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBFbWJlZCBpdCBpbiB0aGUgYm9vdGxvYWRlciBibG9jayBpbiB0aGUgZmlsZXN5c3RlbS4gICovCisgICAgICBpbnQgc3RhcnRfc2VjdG9yOworICAgICAgCisgICAgICAvKiBPcGVuIHRoZSBwYXJ0aXRpb24uICAqLworICAgICAgaWYgKCEgb3Blbl9kZXZpY2UgKCkpCisJcmV0dXJuIDE7CisKKyAgICAgIC8qIENoZWNrIGlmIHRoZSBjdXJyZW50IHNsaWNlIHN1cHBvcnRzIGVtYmVkZGluZy4gICovCisgICAgICBpZiAoZnN5c190YWJsZVtmc3lzX3R5cGVdLmVtYmVkX2Z1bmMgPT0gMAorCSAgfHwgISBmc3lzX3RhYmxlW2ZzeXNfdHlwZV0uZW1iZWRfZnVuYyAoJnN0YXJ0X3NlY3Rvciwgc2l6ZSkpCisJeworCSAgZXJybnVtID0gRVJSX0RFVl9WQUxVRVM7CisJICByZXR1cm4gMTsKKwl9CisKKyAgICAgIHNlY3RvciA9IHBhcnRfc3RhcnQgKyBzdGFydF9zZWN0b3I7CisgICAgfQorCisgIC8qIENsZWFyIHRoZSBjYWNoZS4gICovCisgIGJ1Zl90cmFjayA9IC0xOworCisgIC8qIE5vdyBwZXJmb3JtIHRoZSBlbWJlZGRpbmcuICAqLworICBpZiAoISBkZXZ3cml0ZSAoc2VjdG9yIC0gcGFydF9zdGFydCwgc2l6ZSwgc3RhZ2UxXzVfYnVmZmVyKSkKKyAgICByZXR1cm4gMTsKKyAgCisgIGdydWJfcHJpbnRmICgiICVkIHNlY3RvcnMgYXJlIGVtYmVkZGVkLlxuIiwgc2l6ZSk7CisgIGdydWJfc3ByaW50ZiAoZW1iZWRfaW5mbywgIiVkKyVkIiwgc2VjdG9yIC0gcGFydF9zdGFydCwgc2l6ZSk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJ1aWx0aW4gYnVpbHRpbl9lbWJlZCA9Cit7CisgICJlbWJlZCIsCisgIGVtYmVkX2Z1bmMsCisgIEJVSUxUSU5fQ01ETElORSwKKyAgImVtYmVkIFNUQUdFMV81IERFVklDRSIsCisgICJFbWJlZCB0aGUgU3RhZ2UgMS41IFNUQUdFMV81IGluIHRoZSBzZWN0b3JzIGFmdGVyIE1CUiBpZiBERVZJQ0UiCisgICIgaXMgYSBkcml2ZSwgb3IgaW4gdGhlIFwiYm9vdGxvYWRlclwiIGFyZWEgaWYgREVWSUNFIGlzIGEgRkZTIHBhcnRpdGlvbi4iCisgICIgUHJpbnQgdGhlIG51bWJlciBvZiBzZWN0b3JzIHdoaWNoIFNUQUdFMV81IG9jY3VwaWVzIGlmIHN1Y2Nlc3NmdWwuIgorfTsKKworDAorLyogZmFsbGJhY2sgKi8KK3N0YXRpYyBpbnQKK2ZhbGxiYWNrX2Z1bmMgKGNoYXIgKmFyZywgaW50IGZsYWdzKQoreworICBpbnQgaSA9IDA7CisKKyAgd2hpbGUgKCphcmcpCisgICAgeworICAgICAgaW50IGVudHJ5OworICAgICAgaW50IGo7CisgICAgICAKKyAgICAgIGlmICghIHNhZmVfcGFyc2VfbWF4aW50ICgmYXJnLCAmZW50cnkpKQorCXJldHVybiAxOworCisgICAgICAvKiBSZW1vdmUgZHVwbGljYXRpb25zIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcGluZy4gICovCisgICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorCWlmIChlbnRyeSA9PSBmYWxsYmFja19lbnRyaWVzW2pdKQorCSAgYnJlYWs7CisgICAgICBpZiAoaiAhPSBpKQorCWNvbnRpbnVlOworICAgICAgCisgICAgICBmYWxsYmFja19lbnRyaWVzW2krK10gPSBlbnRyeTsKKyAgICAgIGlmIChpID09IE1BWF9GQUxMQkFDS19FTlRSSUVTKQorCWJyZWFrOworICAgICAgCisgICAgICBhcmcgPSBza2lwX3RvICgwLCBhcmcpOworICAgIH0KKworICBpZiAoaSA8IE1BWF9GQUxMQkFDS19FTlRSSUVTKQorICAgIGZhbGxiYWNrX2VudHJpZXNbaV0gPSAtMTsKKworICBmYWxsYmFja19lbnRyeW5vID0gKGkgPT0gMCkgPyAtMSA6IDA7CisgIAorICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBidWlsdGluIGJ1aWx0aW5fZmFsbGJhY2sgPQoreworICAiZmFsbGJhY2siLAorICBmYWxsYmFja19mdW5jLAorICBCVUlMVElOX01FTlUsCisjaWYgMAorICAiZmFsbGJhY2sgTlVNLi4uIiwKKyAgIkdvIGludG8gdW5hdHRlbmRlZCBib290IG1vZGU6IGlmIHRoZSBkZWZhdWx0IGJvb3QgZW50cnkgaGFzIGFueSIKKyAgIiBlcnJvcnMsIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgdGhlIHVzZXIgdG8gZG8gYW55dGhpbmcsIGl0IgorICAiIGltbWVkaWF0ZWx5IHN0YXJ0cyBvdmVyIHVzaW5nIHRoZSBOVU0gZW50cnkgKHNhbWUgbnVtYmVyaW5nIGFzIHRoZSIKKyAgIiBgZGVmYXVsdCcgY29tbWFuZCkuIFRoaXMgb2J2aW91c2x5IHdvbid0IGhlbHAgaWYgdGhlIG1hY2hpbmUiCisgICIgd2FzIHJlYm9vdGVkIGJ5IGEga2VybmVsIHRoYXQgR1JVQiBsb2FkZWQuIgorI2VuZGlmCit9OworCisMCisvKiBmaW5kICovCisvKiBTZWFyY2ggZm9yIHRoZSBmaWxlbmFtZSBBUkcgaW4gYWxsIG9mIHBhcnRpdGlvbnMuICAqLworc3RhdGljIGludAorZmluZF9mdW5jIChjaGFyICphcmcsIGludCBmbGFncykKK3sKKyAgY2hhciAqZmlsZW5hbWUgPSBhcmc7CisgIHVuc2lnbmVkIGxvbmcgZHJpdmU7CisgIHVuc2lnbmVkIGxvbmcgdG1wX2RyaXZlID0gc2F2ZWRfZHJpdmU7CisgIHVuc2lnbmVkIGxvbmcgdG1wX3BhcnRpdGlvbiA9IHNhdmVkX3BhcnRpdGlvbjsKKyAgaW50IGdvdF9maWxlID0gMDsKKyAgCisgIC8qIEZsb3BwaWVzLiAgKi8KKyAgZm9yIChkcml2ZSA9IDA7IGRyaXZlIDwgODsgZHJpdmUrKykKKyAgICB7CisgICAgICBjdXJyZW50X2RyaXZlID0gZHJpdmU7CisgICAgICBjdXJyZW50X3BhcnRpdGlvbiA9IDB4RkZGRkZGOworICAgICAgCisgICAgICBpZiAob3Blbl9kZXZpY2UgKCkpCisJeworCSAgc2F2ZWRfZHJpdmUgPSBjdXJyZW50X2RyaXZlOworCSAgc2F2ZWRfcGFydGl0aW9uID0gY3VycmVudF9wYXJ0aXRpb247CisJICBpZiAoZ3J1Yl9vcGVuIChmaWxlbmFtZSkpCisJICAgIHsKKwkgICAgICBncnViX2Nsb3NlICgpOworCSAgICAgIGdydWJfcHJpbnRmICgiIChmZCVkKVxuIiwgZHJpdmUpOworCSAgICAgIGdvdF9maWxlID0gMTsKKwkgICAgfQorCX0KKworICAgICAgZXJybnVtID0gRVJSX05PTkU7CisgICAgfQorCisgIC8qIEhhcmQgZGlza3MuICAqLworICBmb3IgKGRyaXZlID0gMHg4MDsgZHJpdmUgPCAweDg4OyBkcml2ZSsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgcGFydCA9IDB4RkZGRkZGOworICAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwgbGVuLCBvZmZzZXQsIGV4dF9vZmZzZXQ7CisgICAgICBpbnQgdHlwZSwgZW50cnk7CisgICAgICBjaGFyIGJ1ZltTRUNUT1JfU0laRV07CisKKyAgICAgIGN1cnJlbnRfZHJpdmUgPSBkcml2ZTsKKyAgICAgIHdoaWxlIChuZXh0X3BhcnRpdGlvbiAoZHJpdmUsIDB4RkZGRkZGLCAmcGFydCwgJnR5cGUsCisJCQkgICAgICZzdGFydCwgJmxlbiwgJm9mZnNldCwgJmVudHJ5LAorCQkJICAgICAmZXh0X29mZnNldCwgYnVmKSkKKwl7CisJICBpZiAodHlwZSAhPSBQQ19TTElDRV9UWVBFX05PTkUKKwkgICAgICAmJiAhIElTX1BDX1NMSUNFX1RZUEVfQlNEICh0eXBlKQorCSAgICAgICYmICEgSVNfUENfU0xJQ0VfVFlQRV9FWFRFTkRFRCAodHlwZSkpCisJICAgIHsKKwkgICAgICBjdXJyZW50X3BhcnRpdGlvbiA9IHBhcnQ7CisJICAgICAgaWYgKG9wZW5fZGV2aWNlICgpKQorCQl7CisJCSAgc2F2ZWRfZHJpdmUgPSBjdXJyZW50X2RyaXZlOworCQkgIHNhdmVkX3BhcnRpdGlvbiA9IGN1cnJlbnRfcGFydGl0aW9uOworCQkgIGlmIChncnViX29wZW4gKGZpbGVuYW1lKSkKKwkJICAgIHsKKwkJICAgICAgaW50IGJzZF9wYXJ0ID0gKHBhcnQgPj4gOCkgJiAweEZGOworCQkgICAgICBpbnQgcGNfc2xpY2UgPSBwYXJ0ID4+IDE2OworCQkgICAgICAKKwkJICAgICAgZ3J1Yl9jbG9zZSAoKTsKKwkJICAgICAgCisJCSAgICAgIGlmIChic2RfcGFydCA9PSAweEZGKQorCQkJZ3J1Yl9wcmludGYgKCIgKGhkJWQsJWQpXG4iLAorCQkJCSAgICAgZHJpdmUgLSAweDgwLCBwY19zbGljZSk7CisJCSAgICAgIGVsc2UKKwkJCWdydWJfcHJpbnRmICgiIChoZCVkLCVkLCVjKVxuIiwKKwkJCQkgICAgIGRyaXZlIC0gMHg4MCwgcGNfc2xpY2UsIGJzZF9wYXJ0ICsgJ2EnKTsKKworCQkgICAgICBnb3RfZmlsZSA9IDE7CisJCSAgICB9CisJCX0KKwkgICAgfQorCisJICAvKiBXZSB3YW50IHRvIGlnbm9yZSBhbnkgZXJyb3IgaGVyZS4gICovCisJICBlcnJudW0gPSBFUlJfTk9ORTsKKwl9CisKKyAgICAgIC8qIG5leHRfcGFydGl0aW9uIGFsd2F5cyBzZXRzIEVSUk5VTSBpbiB0aGUgbGFzdCBjYWxsLCBzbyBjbGVhcgorCSBpdC4gICovCisgICAgICBlcnJudW0gPSBFUlJfTk9ORTsKKyAgICB9CisKKyAgc2F2ZWRfZHJpdmUgPSB0bXBfZHJpdmU7CisgIHNhdmVkX3BhcnRpdGlvbiA9IHRtcF9wYXJ0aXRpb247CisKKyAgaWYgKGdvdF9maWxlKQorICAgIHsKKyAgICAgIGVycm51bSA9IEVSUl9OT05FOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGVycm51bSA9IEVSUl9GSUxFX05PVF9GT1VORDsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX2ZpbmQgPQoreworICAiZmluZCIsCisgIGZpbmRfZnVuYywKKyAgQlVJTFRJTl9DTURMSU5FIHwgQlVJTFRJTl9IRUxQX0xJU1QsCisgICJmaW5kIEZJTEVOQU1FIiwKKyAgIlNlYXJjaCBmb3IgdGhlIGZpbGVuYW1lIEZJTEVOQU1FIGluIGFsbCBvZiBwYXJ0aXRpb25zIGFuZCBwcmludCB0aGUgbGlzdCBvZiIKKyAgIiB0aGUgZGV2aWNlcyB3aGljaCBjb250YWluIHRoZSBmaWxlLiIKK307CisKKwwKKy8qIGZzdGVzdCAqLworc3RhdGljIGludAorZnN0ZXN0X2Z1bmMgKGNoYXIgKmFyZywgaW50IGZsYWdzKQoreworICBpZiAoZGlza19yZWFkX2hvb2spCisgICAgeworICAgICAgZGlza19yZWFkX2hvb2sgPSBOVUxMOworICAgICAgcHJpbnRmICgiIEZpbGVzeXN0ZW0gdHJhY2luZyBpcyBub3cgb2ZmXG4iKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkaXNrX3JlYWRfaG9vayA9IGRpc2tfcmVhZF9wcmludF9mdW5jOworICAgICAgcHJpbnRmICgiIEZpbGVzeXN0ZW0gdHJhY2luZyBpcyBub3cgb25cbiIpOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBidWlsdGluIGJ1aWx0aW5fZnN0ZXN0ID0KK3sKKyAgImZzdGVzdCIsCisgIGZzdGVzdF9mdW5jLAorICBCVUlMVElOX0NNRExJTkUsCisgICJmc3Rlc3QiLAorICAiVG9nZ2xlIGZpbGVzeXN0ZW0gdGVzdCBtb2RlLiIKK307CisKKwwKKy8qIGdlb21ldHJ5ICovCitzdGF0aWMgaW50CitnZW9tZXRyeV9mdW5jIChjaGFyICphcmcsIGludCBmbGFncykKK3sKKyAgc3RydWN0IGdlb21ldHJ5IGdlb207CisgIGNoYXIgKm1zZzsKKyAgY2hhciAqZGV2aWNlID0gYXJnOworI2lmZGVmIEdSVUJfVVRJTAorICBjaGFyICpwdHI7CisjZW5kaWYKKworICAvKiBHZXQgdGhlIGRldmljZSBudW1iZXIuICAqLworICBzZXRfZGV2aWNlIChkZXZpY2UpOworICBpZiAoZXJybnVtKQorICAgIHJldHVybiAxOworCisgIC8qIENoZWNrIGZvciB0aGUgZ2VvbWV0cnkuICAqLworICBpZiAoZ2V0X2Rpc2tpbmZvIChjdXJyZW50X2RyaXZlLCAmZ2VvbSkpCisgICAgeworICAgICAgZXJybnVtID0gRVJSX05PX0RJU0s7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgLyogQXR0ZW1wdCB0byByZWFkIHRoZSBmaXJzdCBzZWN0b3IsIGJlY2F1c2Ugc29tZSBCSU9TZXMgdHVybnMgb3V0IG5vdAorICAgICB0byBzdXBwb3J0IExCQSBldmVuIHRob3VnaCB0aGV5IHNldCB0aGUgYml0IDAgaW4gdGhlIHN1cHBvcnQKKyAgICAgYml0bWFwLCBvbmx5IGFmdGVyIHJlYWRpbmcgc29tZXRoaW5nIGFjdHVhbGx5LiAgKi8KKyAgaWYgKGJpb3NkaXNrIChCSU9TRElTS19SRUFELCBjdXJyZW50X2RyaXZlLCAmZ2VvbSwgMCwgMSwgU0NSQVRDSFNFRykpCisgICAgeworICAgICAgZXJybnVtID0gRVJSX1JFQUQ7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyNpZmRlZiBHUlVCX1VUSUwKKyAgcHRyID0gc2tpcF90byAoMCwgZGV2aWNlKTsKKyAgaWYgKCpwdHIpCisgICAgeworICAgICAgY2hhciAqY3lsaW5kZXIsICpoZWFkLCAqc2VjdG9yLCAqdG90YWxfc2VjdG9yOworICAgICAgaW50IG51bV9jeWxpbmRlciwgbnVtX2hlYWQsIG51bV9zZWN0b3IsIG51bV90b3RhbF9zZWN0b3I7CisKKyAgICAgIGN5bGluZGVyID0gcHRyOworICAgICAgaGVhZCA9IHNraXBfdG8gKDAsIGN5bGluZGVyKTsKKyAgICAgIHNlY3RvciA9IHNraXBfdG8gKDAsIGhlYWQpOworICAgICAgdG90YWxfc2VjdG9yID0gc2tpcF90byAoMCwgc2VjdG9yKTsKKyAgICAgIGlmICghIHNhZmVfcGFyc2VfbWF4aW50ICgmY3lsaW5kZXIsICZudW1fY3lsaW5kZXIpCisJICB8fCAhIHNhZmVfcGFyc2VfbWF4aW50ICgmaGVhZCwgJm51bV9oZWFkKQorCSAgfHwgISBzYWZlX3BhcnNlX21heGludCAoJnNlY3RvciwgJm51bV9zZWN0b3IpKQorCXJldHVybiAxOworCisgICAgICBkaXNrc1tjdXJyZW50X2RyaXZlXS5jeWxpbmRlcnMgPSBudW1fY3lsaW5kZXI7CisgICAgICBkaXNrc1tjdXJyZW50X2RyaXZlXS5oZWFkcyA9IG51bV9oZWFkOworICAgICAgZGlza3NbY3VycmVudF9kcml2ZV0uc2VjdG9ycyA9IG51bV9zZWN0b3I7CisKKyAgICAgIGlmIChzYWZlX3BhcnNlX21heGludCAoJnRvdGFsX3NlY3RvciwgJm51bV90b3RhbF9zZWN0b3IpKQorCWRpc2tzW2N1cnJlbnRfZHJpdmVdLnRvdGFsX3NlY3RvcnMgPSBudW1fdG90YWxfc2VjdG9yOworICAgICAgZWxzZQorCWRpc2tzW2N1cnJlbnRfZHJpdmVdLnRvdGFsX3NlY3RvcnMKKwkgID0gbnVtX2N5bGluZGVyICogbnVtX2hlYWQgKiBudW1fc2VjdG9yOworICAgICAgZXJybnVtID0gMDsKKworICAgICAgZ2VvbSA9IGRpc2tzW2N1cnJlbnRfZHJpdmVdOworICAgICAgYnVmX2RyaXZlID0gLTE7CisgICAgfQorI2VuZGlmIC8qIEdSVUJfVVRJTCAqLworCisjaWZkZWYgR1JVQl9VVElMCisgIG1zZyA9IGRldmljZV9tYXBbY3VycmVudF9kcml2ZV07CisjZWxzZQorICBpZiAoZ2VvbS5mbGFncyAmIEJJT1NESVNLX0ZMQUdfTEJBX0VYVEVOU0lPTikKKyAgICBtc2cgPSAiTEJBIjsKKyAgZWxzZQorICAgIG1zZyA9ICJDSFMiOworI2VuZGlmCisKKyAgZ3J1Yl9wcmludGYgKCJkcml2ZSAweCV4OiBDL0gvUyA9ICVkLyVkLyVkLCAiCisJICAgICAgICJUaGUgbnVtYmVyIG9mIHNlY3RvcnMgPSAlZCwgJXNcbiIsCisJICAgICAgIGN1cnJlbnRfZHJpdmUsCisJICAgICAgIGdlb20uY3lsaW5kZXJzLCBnZW9tLmhlYWRzLCBnZW9tLnNlY3RvcnMsCisJICAgICAgIGdlb20udG90YWxfc2VjdG9ycywgbXNnKTsKKyAgcmVhbF9vcGVuX3BhcnRpdGlvbiAoMSk7CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX2dlb21ldHJ5ID0KK3sKKyAgImdlb21ldHJ5IiwKKyAgZ2VvbWV0cnlfZnVuYywKKyAgQlVJTFRJTl9DTURMSU5FIHwgQlVJTFRJTl9IRUxQX0xJU1QsCisgICJnZW9tZXRyeSBEUklWRSBbQ1lMSU5ERVIgSEVBRCBTRUNUT1IgW1RPVEFMX1NFQ1RPUl1dIiwKKyAgIlByaW50IHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBkcml2ZSBEUklWRS4gSW4gdGhlIGdydWIgc2hlbGwsIHlvdSBjYW4iCisgICIgc2V0IHRoZSBnZW9tZXRyeSBvZiB0aGUgZHJpdmUgYXJiaXRyYXJpbHkuIFRoZSBudW1iZXIgb2YgdGhlIGN5bGluZGVycywiCisgICIgdGhlIG9uZSBvZiB0aGUgaGVhZHMsIHRoZSBvbmUgb2YgdGhlIHNlY3RvcnMgYW5kIHRoZSBvbmUgb2YgdGhlIHRvdGFsIgorICAiIHNlY3RvcnMgYXJlIHNldCB0byBDWUxJTkRFUiwgSEVBRCwgU0VDVE9SIGFuZCBUT1RBTF9TRUNUT1IsIgorICAiIHJlc3BlY3RpdmVseS4gSWYgeW91IG9taXQgVE9UQUxfU0VDVE9SLCB0aGVuIGl0IHdpbGwgYmUgY2FsY3VsYXRlZCBiYXNlZCIKKyAgIiBvbiB0aGUgQy9IL1MgdmFsdWVzIGF1dG9tYXRpY2FsbHkuIgorfTsKKworDAorLyogaGFsdCAqLworc3RhdGljIGludAoraGFsdF9mdW5jIChjaGFyICphcmcsIGludCBmbGFncykKK3sKKyAgaW50IG5vX2FwbTsKKworICBub19hcG0gPSAoZ3J1Yl9tZW1jbXAgKGFyZywgIi0tbm8tYXBtIiwgOCkgPT0gMCk7CisgIGdydWJfaGFsdCAobm9fYXBtKTsKKyAgCisgIC8qIE5ldmVyIHJlYWNoIGhlcmUuICAqLworICByZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBidWlsdGluIGJ1aWx0aW5faGFsdCA9Cit7CisgICJoYWx0IiwKKyAgaGFsdF9mdW5jLAorICBCVUlMVElOX0NNRExJTkUgfCBCVUlMVElOX0hFTFBfTElTVCwKKyAgImhhbHQgWy0tbm8tYXBtXSIsCisgICJIYWx0IHlvdXIgc3lzdGVtLiBJZiBBUE0gaXMgYXZhaWFibGUgb24gaXQsIHR1cm4gb2ZmIHRoZSBwb3dlciB1c2luZyIKKyAgIiB0aGUgQVBNIEJJT1MsIHVubGVzcyB5b3Ugc3BlY2lmeSB0aGUgb3B0aW9uIGAtLW5vLWFwbScuIgorfTsKKworDAorLyogaGVscCAqLworI2RlZmluZSBNQVhfU0hPUlRfRE9DX0xFTgkzOQorI2RlZmluZSBNQVhfTE9OR19ET0NfTEVOCTY2CisKK3N0YXRpYyBpbnQKK2hlbHBfZnVuYyAoY2hhciAqYXJnLCBpbnQgZmxhZ3MpCit7CisgIGludCBhbGwgPSAwOworICAKKyAgaWYgKGdydWJfbWVtY21wIChhcmcsICItLWFsbCIsIHNpemVvZiAoIi0tYWxsIikgLSAxKSA9PSAwKQorICAgIHsKKyAgICAgIGFsbCA9IDE7CisgICAgICBhcmcgPSBza2lwX3RvICgwLCBhcmcpOworICAgIH0KKyAgCisgIGlmICghICphcmcpCisgICAgeworICAgICAgLyogSW52b2tlZCB3aXRoIG5vIGFyZ3VtZW50LiBQcmludCB0aGUgbGlzdCBvZiB0aGUgc2hvcnQgZG9jcy4gICovCisgICAgICBzdHJ1Y3QgYnVpbHRpbiAqKmJ1aWx0aW47CisgICAgICBpbnQgbGVmdCA9IDE7CisKKyAgICAgIGZvciAoYnVpbHRpbiA9IGJ1aWx0aW5fdGFibGU7ICpidWlsdGluICE9IDA7IGJ1aWx0aW4rKykKKwl7CisJICBpbnQgbGVuOworCSAgaW50IGk7CisKKwkgIC8qIElmIHRoaXMgY2Fubm90IGJlIHVzZWQgaW4gdGhlIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UsCisJICAgICBza2lwIHRoaXMuICAqLworCSAgaWYgKCEgKCgqYnVpbHRpbiktPmZsYWdzICYgQlVJTFRJTl9DTURMSU5FKSkKKwkgICAgY29udGludWU7CisJICAKKwkgIC8qIElmIHRoaXMgZG9lc24ndCBuZWVkIHRvIGJlIGxpc3RlZCBhdXRvbWF0aWNhbGx5IGFuZCAiLS1hbGwiCisJICAgICBpcyBub3Qgc3BlY2lmaWVkLCBza2lwIHRoaXMuICAqLworCSAgaWYgKCEgYWxsICYmICEgKCgqYnVpbHRpbiktPmZsYWdzICYgQlVJTFRJTl9IRUxQX0xJU1QpKQorCSAgICBjb250aW51ZTsKKworCSAgbGVuID0gZ3J1Yl9zdHJsZW4gKCgqYnVpbHRpbiktPnNob3J0X2RvYyk7CisJICAvKiBJZiB0aGUgbGVuZ3RoIG9mIFNIT1JUX0RPQyBpcyB0b28gbG9uZywgdHJ1bmNhdGUgaXQuICAqLworCSAgaWYgKGxlbiA+IE1BWF9TSE9SVF9ET0NfTEVOIC0gMSkKKwkgICAgbGVuID0gTUFYX1NIT1JUX0RPQ19MRU4gLSAxOworCisJICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJICAgIGdydWJfcHV0Y2hhciAoKCpidWlsdGluKS0+c2hvcnRfZG9jW2ldKTsKKworCSAgZm9yICg7IGkgPCBNQVhfU0hPUlRfRE9DX0xFTjsgaSsrKQorCSAgICBncnViX3B1dGNoYXIgKCcgJyk7CisKKwkgIGlmICghIGxlZnQpCisJICAgIGdydWJfcHV0Y2hhciAoJ1xuJyk7CisKKwkgIGxlZnQgPSAhIGxlZnQ7CisJfQorCisgICAgICAvKiBJZiB0aGUgbGFzdCBlbnRyeSB3YXMgYXQgdGhlIGxlZnQgY29sdW1uLCBubyBuZXdsaW5lIHdhcyBwcmludGVkCisJIGF0IHRoZSBlbmQuICAqLworICAgICAgaWYgKCEgbGVmdCkKKwlncnViX3B1dGNoYXIgKCdcbicpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEludm9rZWQgd2l0aCBvbmUgb3IgbW9yZSBwYXR0ZXJucy4gICovCisgICAgICBkbworCXsKKwkgIHN0cnVjdCBidWlsdGluICoqYnVpbHRpbjsKKwkgIGNoYXIgKm5leHRfYXJnOworCisJICAvKiBHZXQgdGhlIG5leHQgYXJndW1lbnQuICAqLworCSAgbmV4dF9hcmcgPSBza2lwX3RvICgwLCBhcmcpOworCisJICAvKiBUZXJtaW5hdGUgQVJHLiAgKi8KKwkgIG51bF90ZXJtaW5hdGUgKGFyZyk7CisKKwkgIGZvciAoYnVpbHRpbiA9IGJ1aWx0aW5fdGFibGU7ICpidWlsdGluOyBidWlsdGluKyspCisJICAgIHsKKwkgICAgICAvKiBTa2lwIHRoaXMgaWYgdGhpcyBpcyBvbmx5IGZvciB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiAgKi8KKwkgICAgICBpZiAoISAoKCpidWlsdGluKS0+ZmxhZ3MgJiBCVUlMVElOX0NNRExJTkUpKQorCQljb250aW51ZTsKKworCSAgICAgIGlmIChzdWJzdHJpbmcgKGFyZywgKCpidWlsdGluKS0+bmFtZSkgPCAxKQorCQl7CisJCSAgY2hhciAqZG9jID0gKCpidWlsdGluKS0+bG9uZ19kb2M7CisKKwkJICAvKiBBdCBmaXJzdCwgcHJpbnQgdGhlIG5hbWUgYW5kIHRoZSBzaG9ydCBkb2MuICAqLworCQkgIGdydWJfcHJpbnRmICgiJXM6ICVzXG4iLAorCQkJICAgICAgICgqYnVpbHRpbiktPm5hbWUsICgqYnVpbHRpbiktPnNob3J0X2RvYyk7CisKKwkJICAvKiBQcmludCB0aGUgbG9uZyBkb2MuICAqLworCQkgIHdoaWxlICgqZG9jKQorCQkgICAgeworCQkgICAgICBpbnQgbGVuID0gZ3J1Yl9zdHJsZW4gKGRvYyk7CisJCSAgICAgIGludCBpOworCisJCSAgICAgIC8qIElmIExFTiBpcyB0b28gbG9uZywgZm9sZCBET0MuICAqLworCQkgICAgICBpZiAobGVuID4gTUFYX0xPTkdfRE9DX0xFTikKKwkJCXsKKwkJCSAgLyogRm9sZCB0aGlzIGxpbmUgYXQgdGhlIHBvc2l0aW9uIG9mIGEgc3BhY2UuICAqLworCQkJICBmb3IgKGxlbiA9IE1BWF9MT05HX0RPQ19MRU47IGxlbiA+IDA7IGxlbi0tKQorCQkJICAgIGlmIChkb2NbbGVuIC0gMV0gPT0gJyAnKQorCQkJICAgICAgYnJlYWs7CisJCQl9CisKKwkJICAgICAgZ3J1Yl9wcmludGYgKCIgICAgIik7CisJCSAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCWdydWJfcHV0Y2hhciAoKmRvYysrKTsKKwkJICAgICAgZ3J1Yl9wdXRjaGFyICgnXG4nKTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisKKwkgIGFyZyA9IG5leHRfYXJnOworCX0KKyAgICAgIHdoaWxlICgqYXJnKTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX2hlbHAgPQoreworICAiaGVscCIsCisgIGhlbHBfZnVuYywKKyAgQlVJTFRJTl9DTURMSU5FIHwgQlVJTFRJTl9IRUxQX0xJU1QsCisgICJoZWxwIFstLWFsbF0gW1BBVFRFUk4gLi4uXSIsCisgICJEaXNwbGF5IGhlbHBmdWwgaW5mb3JtYXRpb24gYWJvdXQgYnVpbHRpbiBjb21tYW5kcy4gTm90IGFsbCBjb21tYW5kcyIKKyAgIiBhcmVuJ3Qgc2hvd24gd2l0aG91dCB0aGUgb3B0aW9uIGAtLWFsbCcuIgorfTsKKworDAorLyogaGlkZGVubWVudSAqLworc3RhdGljIGludAoraGlkZGVubWVudV9mdW5jIChjaGFyICphcmcsIGludCBmbGFncykKK3sKKyAgc2hvd19tZW51ID0gMDsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX2hpZGRlbm1lbnUgPQoreworICAiaGlkZGVubWVudSIsCisgIGhpZGRlbm1lbnVfZnVuYywKKyAgQlVJTFRJTl9NRU5VLAorI2lmIDAKKyAgImhpZGRlbm1lbnUiLAorICAiSGlkZSB0aGUgbWVudS4iCisjZW5kaWYKK307CisKKwwKKy8qIGhpZGUgKi8KK3N0YXRpYyBpbnQKK2hpZGVfZnVuYyAoY2hhciAqYXJnLCBpbnQgZmxhZ3MpCit7CisgIGlmICghIHNldF9kZXZpY2UgKGFyZykpCisgICAgcmV0dXJuIDE7CisKKyAgaWYgKCEgc2V0X3BhcnRpdGlvbl9oaWRkZW5fZmxhZyAoMSkpCisgICAgcmV0dXJuIDE7CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX2hpZGUgPQoreworICAiaGlkZSIsCisgIGhpZGVfZnVuYywKKyAgQlVJTFRJTl9DTURMSU5FIHwgQlVJTFRJTl9NRU5VIHwgQlVJTFRJTl9IRUxQX0xJU1QsCisgICJoaWRlIFBBUlRJVElPTiIsCisgICJIaWRlIFBBUlRJVElPTiBieSBzZXR0aW5nIHRoZSBcImhpZGRlblwiIGJpdCBpbiIKKyAgIiBpdHMgcGFydGl0aW9uIHR5cGUgY29kZS4iCit9OworCisMCisjaWZkZWYgU1VQUE9SVF9ORVRCT09UCisvKiBpZmNvbmZpZyAqLworc3RhdGljIGludAoraWZjb25maWdfZnVuYyAoY2hhciAqYXJnLCBpbnQgZmxhZ3MpCit7CisgIGNoYXIgKnN2ciA9IDAsICppcCA9IDAsICpndyA9IDAsICpzbSA9IDA7CisgIAorICBpZiAoISBldGhfcHJvYmUgKCkpCisgICAgeworICAgICAgZ3J1Yl9wcmludGYgKCJObyBldGhlcm5ldCBjYXJkIGZvdW5kLlxuIik7CisgICAgICBlcnJudW0gPSBFUlJfREVWX1ZBTFVFUzsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgCisgIHdoaWxlICgqYXJnKSAKKyAgICB7CisgICAgICBpZiAoISBncnViX21lbWNtcCAoIi0tc2VydmVyPSIsIGFyZywgc2l6ZW9mICgiLS1zZXJ2ZXI9IikgLSAxKSkKKwlzdnIgPSBhcmcgKyBzaXplb2YoIi0tc2VydmVyPSIpIC0gMTsKKyAgICAgIGVsc2UgaWYgKCEgZ3J1Yl9tZW1jbXAgKCItLWFkZHJlc3M9IiwgYXJnLCBzaXplb2YgKCItLWFkZHJlc3M9IikgLSAxKSkKKwlpcCA9IGFyZyArIHNpemVvZiAoIi0tYWRkcmVzcz0iKSAtIDE7CisgICAgICBlbHNlIGlmICghIGdydWJfbWVtY21wICgiLS1nYXRld2F5PSIsIGFyZywgc2l6ZW9mICgiLS1nYXRld2F5PSIpIC0gMSkpCisJZ3cgPSBhcmcgKyBzaXplb2YgKCItLWdhdGV3YXk9IikgLSAxOworICAgICAgZWxzZSBpZiAoISBncnViX21lbWNtcCAoIi0tbWFzaz0iLCBhcmcsIHNpemVvZigiLS1tYXNrPSIpIC0gMSkpCisJc20gPSBhcmcgKyBzaXplb2YgKCItLW1hc2s9IikgLSAxOworICAgICAgZWxzZQorCXsKKwkgIGVycm51bSA9IEVSUl9CQURfQVJHVU1FTlQ7CisJICByZXR1cm4gMTsKKwl9CisgICAgICAKKyAgICAgIGFyZyA9IHNraXBfdG8gKDAsIGFyZyk7CisgICAgfQorICAKKyAgaWYgKCEgaWZjb25maWcgKGlwLCBzbSwgZ3csIHN2cikpCisgICAgeworICAgICAgZXJybnVtID0gRVJSX0JBRF9BUkdVTUVOVDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgCisgIHByaW50X25ldHdvcmtfY29uZmlndXJhdGlvbiAoKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX2lmY29uZmlnID0KK3sKKyAgImlmY29uZmlnIiwKKyAgaWZjb25maWdfZnVuYywKKyAgQlVJTFRJTl9DTURMSU5FIHwgQlVJTFRJTl9NRU5VIHwgQlVJTFRJTl9IRUxQX0xJU1QsCisgICJpZmNvbmZpZyBbLS1hZGRyZXNzPUlQXSBbLS1nYXRld2F5PUlQXSBbLS1tYXNrPU1BU0tdIFstLXNlcnZlcj1JUF0iLAorICAiQ29uZmlndXJlIHRoZSBJUCBhZGRyZXNzLCB0aGUgbmV0bWFzaywgdGhlIGdhdGV3YXkgYW5kIHRoZSBzZXJ2ZXIiCisgICIgYWRkcmVzcyBvciBwcmludCBjdXJyZW50IG5ldHdvcmsgY29uZmlndXJhdGlvbi4iCit9OworI2VuZGlmIC8qIFNVUFBPUlRfTkVUQk9PVCAqLworCisMCisvKiBpbXBzcHJvYmUgKi8KK3N0YXRpYyBpbnQKK2ltcHNwcm9iZV9mdW5jIChjaGFyICphcmcsIGludCBmbGFncykKK3sKKyNpZmRlZiBHUlVCX1VUSUwKKyAgLyogSW4gdGhlIGdydWIgc2hlbGwsIHdlIGNhbm5vdCBwcm9iZSBJTVBTLiAgKi8KKyAgZXJybnVtID0gRVJSX1VOUkVDT0dOSVpFRDsKKyAgcmV0dXJuIDE7CisjZWxzZSAvKiAhIEdSVUJfVVRJTCAqLworICBpZiAoIWltcHNfcHJvYmUgKCkpCisgICAgcHJpbnRmICgiIE5vIE1QUyBpbmZvcm1hdGlvbiBmb3VuZCBvciBwcm9iZSBmYWlsZWRcbiIpOworCisgIHJldHVybiAwOworI2VuZGlmIC8qICEgR1JVQl9VVElMICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX2ltcHNwcm9iZSA9Cit7CisgICJpbXBzcHJvYmUiLAorICBpbXBzcHJvYmVfZnVuYywKKyAgQlVJTFRJTl9DTURMSU5FLAorICAiaW1wc3Byb2JlIiwKKyAgIlByb2JlIHRoZSBJbnRlbCBNdWx0aXByb2Nlc3NvciBTcGVjaWZpY2F0aW9uIDEuMSBvciAxLjQiCisgICIgY29uZmlndXJhdGlvbiB0YWJsZSBhbmQgYm9vdCB0aGUgdmFyaW91cyBDUFVzIHdoaWNoIGFyZSBmb3VuZCBpbnRvIgorICAiIGEgdGlnaHQgbG9vcC4iCit9OworCisMCisvKiBpbml0cmQgKi8KK3N0YXRpYyBpbnQKK2luaXRyZF9mdW5jIChjaGFyICphcmcsIGludCBmbGFncykKK3sKKyAgc3dpdGNoIChrZXJuZWxfdHlwZSkKKyAgICB7CisgICAgY2FzZSBLRVJORUxfVFlQRV9MSU5VWDoKKyAgICBjYXNlIEtFUk5FTF9UWVBFX0JJR19MSU5VWDoKKyAgICAgIGlmICghIGxvYWRfaW5pdHJkIChhcmcpKQorCXJldHVybiAxOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgZXJybnVtID0gRVJSX05FRURfTFhfS0VSTkVMOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJ1aWx0aW4gYnVpbHRpbl9pbml0cmQgPQoreworICAiaW5pdHJkIiwKKyAgaW5pdHJkX2Z1bmMsCisgIEJVSUxUSU5fQ01ETElORSB8IEJVSUxUSU5fSEVMUF9MSVNULAorICAiaW5pdHJkIEZJTEUgW0FSRyAuLi5dIiwKKyAgIkxvYWQgYW4gaW5pdGlhbCByYW1kaXNrIEZJTEUgZm9yIGEgTGludXggZm9ybWF0IGJvb3QgaW1hZ2UgYW5kIHNldCB0aGUiCisgICIgYXBwcm9wcmlhdGUgcGFyYW1ldGVycyBpbiB0aGUgTGludXggc2V0dXAgYXJlYSBpbiBtZW1vcnkuIgorfTsKKworDAorLyogaW5zdGFsbCAqLworc3RhdGljIGludAoraW5zdGFsbF9mdW5jIChjaGFyICphcmcsIGludCBmbGFncykKK3sKKyAgY2hhciAqc3RhZ2UxX2ZpbGUsICpkZXN0X2RldiwgKmZpbGUsICphZGRyOworICBjaGFyICpzdGFnZTFfYnVmZmVyID0gKGNoYXIgKikgUkFXX0FERFIgKDB4MTAwMDAwKTsKKyAgY2hhciAqc3RhZ2UyX2J1ZmZlciA9IHN0YWdlMV9idWZmZXIgKyBTRUNUT1JfU0laRTsKKyAgY2hhciAqb2xkX3NlY3QgPSBzdGFnZTJfYnVmZmVyICsgU0VDVE9SX1NJWkU7CisgIGNoYXIgKnN0YWdlMl9maXJzdF9idWZmZXIgPSBvbGRfc2VjdCArIFNFQ1RPUl9TSVpFOworICBjaGFyICpzdGFnZTJfc2Vjb25kX2J1ZmZlciA9IHN0YWdlMl9maXJzdF9idWZmZXIgKyBTRUNUT1JfU0laRTsKKyAgLyogWFhYOiBQcm9iYWJseSBTRUNUT1JfU0laRSBpcyByZWFzb25hYmxlLiAgKi8KKyAgY2hhciAqY29uZmlnX2ZpbGVuYW1lID0gc3RhZ2UyX3NlY29uZF9idWZmZXIgKyBTRUNUT1JfU0laRTsKKyAgY2hhciAqZHVtbXkgPSBjb25maWdfZmlsZW5hbWUgKyBTRUNUT1JfU0laRTsKKyAgaW50IG5ld19kcml2ZSA9IEdSVUJfSU5WQUxJRF9EUklWRTsKKyAgaW50IGRlc3RfZHJpdmUsIGRlc3RfcGFydGl0aW9uLCBkZXN0X3NlY3RvcjsKKyAgaW50IHNyY19kcml2ZSwgc3JjX3BhcnRpdGlvbiwgc3JjX3BhcnRfc3RhcnQ7CisgIGludCBpOworICBzdHJ1Y3QgZ2VvbWV0cnkgZGVzdF9nZW9tLCBzcmNfZ2VvbTsKKyAgaW50IHNhdmVkX3NlY3RvcjsKKyAgaW50IHN0YWdlMl9maXJzdF9zZWN0b3IsIHN0YWdlMl9zZWNvbmRfc2VjdG9yOworICBjaGFyICpwdHI7CisgIGludCBpbnN0YWxsYWRkciwgaW5zdGFsbGxpc3Q7CisgIC8qIFBvaW50IHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgbmFtZSBvZiBhIGNvbmZpZ3VyYXRpb24gZmlsZSBpbiBTdGFnZSAyLiAgKi8KKyAgY2hhciAqY29uZmlnX2ZpbGVfbG9jYXRpb247CisgIC8qIElmIEZJTEUgaXMgYSBTdGFnZSAxLjU/ICAqLworICBpbnQgaXNfc3RhZ2UxXzUgPSAwOworICAvKiBNdXN0IGNhbGwgZ3J1Yl9jbG9zZT8gICovCisgIGludCBpc19vcGVuID0gMDsKKyAgLyogSWYgTEJBIGlzIGZvcmNlZD8gICovCisgIGludCBpc19mb3JjZV9sYmEgPSAwOworICAvKiBXYXMgdGhlIGxhc3Qgc2VjdG9yIGZ1bGw/ICovCisgIGludCBsYXN0X2xlbmd0aCA9IFNFQ1RPUl9TSVpFOworICAKKyNpZmRlZiBHUlVCX1VUSUwKKyAgLyogSWYgdGhlIFN0YWdlIDIgaXMgaW4gYSBwYXJ0aXRpb24gbW91bnRlZCBieSBhbiBPUywgdGhpcyB3aWxsIHN0b3JlCisgICAgIHRoZSBmaWxlbmFtZSB1bmRlciB0aGUgT1MuICAqLworICBjaGFyICpzdGFnZTJfb3NfZmlsZSA9IDA7CisjZW5kaWYgLyogR1JVQl9VVElMICovCisgIAorICBhdXRvIHZvaWQgZGlza19yZWFkX3NhdmVzZWN0X2Z1bmMgKGludCBzZWN0b3IsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOworICBhdXRvIHZvaWQgZGlza19yZWFkX2Jsb2NrbGlzdF9mdW5jIChpbnQgc2VjdG9yLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKKyAgCisgIC8qIFNhdmUgdGhlIGZpcnN0IHNlY3RvciBvZiBTdGFnZTIgaW4gU1RBR0UyX1NFQ1QuICAqLworICBhdXRvIHZvaWQgZGlza19yZWFkX3NhdmVzZWN0X2Z1bmMgKGludCBzZWN0b3IsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgeworICAgICAgaWYgKGRlYnVnKQorCXByaW50ZiAoIlslZF0iLCBzZWN0b3IpOworCisgICAgICAvKiBSZWlzZXJGUyBoYXMgZmlsZXMgd2hpY2ggc29tZXRpbWVzIGNvbnRhaW4gZGF0YSBub3QgYWxpZ25lZAorICAgICAgICAgb24gc2VjdG9yIGJvdW5kYXJpZXMuICBSZXR1cm5pbmcgYW4gZXJyb3IgaXMgYmV0dGVyIHRoYW4KKyAgICAgICAgIHNpbGVudGx5IGZhaWxpbmcuICovCisgICAgICBpZiAob2Zmc2V0ICE9IDAgfHwgbGVuZ3RoICE9IFNFQ1RPUl9TSVpFKQorCWVycm51bSA9IEVSUl9VTkFMSUdORUQ7CisKKyAgICAgIHNhdmVkX3NlY3RvciA9IHNlY3RvcjsKKyAgICB9CisKKyAgLyogV3JpdGUgU0VDVE9SIHRvIElOU1RBTExMSVNULCBhbmQgdXBkYXRlIElOU1RBTExBRERSIGFuZAorICAgICBJTlNUQUxMU0VDVC4gICovCisgIGF1dG8gdm9pZCBkaXNrX3JlYWRfYmxvY2tsaXN0X2Z1bmMgKGludCBzZWN0b3IsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgeworICAgICAgaWYgKGRlYnVnKQorCXByaW50ZigiWyVkXSIsIHNlY3Rvcik7CisKKyAgICAgIGlmIChvZmZzZXQgIT0gMCB8fCBsYXN0X2xlbmd0aCAhPSBTRUNUT1JfU0laRSkKKwl7CisJICAvKiBXZSBmb3VuZCBhIG5vbi1zZWN0b3ItYWxpZ25lZCBkYXRhIGJsb2NrLiAqLworCSAgZXJybnVtID0gRVJSX1VOQUxJR05FRDsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIGxhc3RfbGVuZ3RoID0gbGVuZ3RoOworCisgICAgICBpZiAoKigodW5zaWduZWQgbG9uZyAqKSAoaW5zdGFsbGxpc3QgLSA0KSkKKwkgICsgKigodW5zaWduZWQgc2hvcnQgKikgaW5zdGFsbGxpc3QpICE9IHNlY3RvcgorCSAgfHwgaW5zdGFsbGxpc3QgPT0gKGludCkgc3RhZ2UyX2ZpcnN0X2J1ZmZlciArIFNFQ1RPUl9TSVpFICsgNCkKKwl7CisJICBpbnN0YWxsbGlzdCAtPSA4OworCisJICBpZiAoKigodW5zaWduZWQgbG9uZyAqKSAoaW5zdGFsbGxpc3QgLSA4KSkpCisJICAgIGVycm51bSA9IEVSUl9XT05UX0ZJVDsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgICooKHVuc2lnbmVkIHNob3J0ICopIChpbnN0YWxsbGlzdCArIDIpKSA9IChpbnN0YWxsYWRkciA+PiA0KTsKKwkgICAgICAqKCh1bnNpZ25lZCBsb25nICopIChpbnN0YWxsbGlzdCAtIDQpKSA9IHNlY3RvcjsKKwkgICAgfQorCX0KKworICAgICAgKigodW5zaWduZWQgc2hvcnQgKikgaW5zdGFsbGxpc3QpICs9IDE7CisgICAgICBpbnN0YWxsYWRkciArPSA1MTI7CisgICAgfQorCisgIC8qIEZpcnN0LCBjaGVjayB0aGUgR05VLXN0eWxlIGxvbmcgb3B0aW9uLiAgKi8KKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaWYgKGdydWJfbWVtY21wICgiLS1mb3JjZS1sYmEiLCBhcmcsIHNpemVvZiAoIi0tZm9yY2UtbGJhIikgLSAxKSA9PSAwKQorCXsKKwkgIGlzX2ZvcmNlX2xiYSA9IDE7CisJICBhcmcgPSBza2lwX3RvICgwLCBhcmcpOworCX0KKyNpZmRlZiBHUlVCX1VUSUwKKyAgICAgIGVsc2UgaWYgKGdydWJfbWVtY21wICgiLS1zdGFnZTI9IiwgYXJnLCBzaXplb2YgKCItLXN0YWdlMj0iKSAtIDEpID09IDApCisJeworCSAgc3RhZ2UyX29zX2ZpbGUgPSBhcmcgKyBzaXplb2YgKCItLXN0YWdlMj0iKSAtIDE7CisJICBhcmcgPSBza2lwX3RvICgwLCBhcmcpOworCSAgbnVsX3Rlcm1pbmF0ZSAoc3RhZ2UyX29zX2ZpbGUpOworCX0KKyNlbmRpZiAvKiBHUlVCX1VUSUwgKi8KKyAgICAgIGVsc2UKKwlicmVhazsKKyAgICB9CisgIAorICBzdGFnZTFfZmlsZSA9IGFyZzsKKyAgZGVzdF9kZXYgPSBza2lwX3RvICgwLCBzdGFnZTFfZmlsZSk7CisgIGlmICgqZGVzdF9kZXYgPT0gJ2QnKQorICAgIHsKKyAgICAgIG5ld19kcml2ZSA9IDA7CisgICAgICBkZXN0X2RldiA9IHNraXBfdG8gKDAsIGRlc3RfZGV2KTsKKyAgICB9CisgIGZpbGUgPSBza2lwX3RvICgwLCBkZXN0X2Rldik7CisgIGFkZHIgPSBza2lwX3RvICgwLCBmaWxlKTsKKworICAvKiBHZXQgdGhlIGluc3RhbGxhdGlvbiBhZGRyZXNzLiAgKi8KKyAgaWYgKCEgc2FmZV9wYXJzZV9tYXhpbnQgKCZhZGRyLCAmaW5zdGFsbGFkZHIpKQorICAgIHsKKyAgICAgIC8qIEFERFIgaXMgbm90IHNwZWNpZmllZC4gICovCisgICAgICBpbnN0YWxsYWRkciA9IDA7CisgICAgICBwdHIgPSBhZGRyOworICAgICAgZXJybnVtID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICBwdHIgPSBza2lwX3RvICgwLCBhZGRyKTsKKworI2lmbmRlZiBOT19ERUNPTVBSRVNTSU9OCisgIC8qIERvIG5vdCBkZWNvbXByZXNzIFN0YWdlIDEgb3IgU3RhZ2UgMi4gICovCisgIG5vX2RlY29tcHJlc3Npb24gPSAxOworI2VuZGlmCisKKyAgLyogUmVhZCBTdGFnZSAxLiAgKi8KKyAgaXNfb3BlbiA9IGdydWJfb3BlbiAoc3RhZ2UxX2ZpbGUpOworICBpZiAoISBpc19vcGVuCisgICAgICB8fCAhIGdydWJfcmVhZCAoc3RhZ2UxX2J1ZmZlciwgU0VDVE9SX1NJWkUpID09IFNFQ1RPUl9TSVpFKQorICAgIGdvdG8gZmFpbDsKKworICAvKiBSZWFkIHRoZSBvbGQgc2VjdG9yIGZyb20gREVTVF9ERVYuICAqLworICBpZiAoISBzZXRfZGV2aWNlIChkZXN0X2RldikKKyAgICAgIHx8ICEgb3Blbl9wYXJ0aXRpb24gKCkKKyAgICAgIHx8ICEgZGV2cmVhZCAoMCwgMCwgU0VDVE9SX1NJWkUsIG9sZF9zZWN0KSkKKyAgICBnb3RvIGZhaWw7CisKKyAgLyogU3RvcmUgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgZGVzdGluYXRpb24gZGV2aWNlLiAgKi8KKyAgZGVzdF9kcml2ZSA9IGN1cnJlbnRfZHJpdmU7CisgIGRlc3RfcGFydGl0aW9uID0gY3VycmVudF9wYXJ0aXRpb247CisgIGRlc3RfZ2VvbSA9IGJ1Zl9nZW9tOworICBkZXN0X3NlY3RvciA9IHBhcnRfc3RhcnQ7CisKKyAgLyogQ29weSB0aGUgcG9zc2libGUgRE9TIEJQQiwgNTkgYnl0ZXMgYXQgYnl0ZSBvZmZzZXQgMy4gICovCisgIGdydWJfbWVtbW92ZSAoc3RhZ2UxX2J1ZmZlciArIEJPT1RTRUNfQlBCX09GRlNFVCwKKwkJb2xkX3NlY3QgKyBCT09UU0VDX0JQQl9PRkZTRVQsCisJCUJPT1RTRUNfQlBCX0xFTkdUSCk7CisKKyAgLyogSWYgZm9yIGEgaGFyZCBkaXNrLCBjb3B5IHRoZSBwb3NzaWJsZSBNQlIvZXh0ZW5kZWQgcGFydCB0YWJsZS4gICovCisgIGlmIChkZXN0X2RyaXZlICYgMHg4MCkKKyAgICBncnViX21lbW1vdmUgKHN0YWdlMV9idWZmZXIgKyBTVEFHRTFfV0lORE9XU19OVF9NQUdJQywKKwkJICBvbGRfc2VjdCArIFNUQUdFMV9XSU5ET1dTX05UX01BR0lDLAorCQkgIFNUQUdFMV9QQVJURU5EIC0gU1RBR0UxX1dJTkRPV1NfTlRfTUFHSUMpOworCisgIC8qIENoZWNrIGZvciB0aGUgdmVyc2lvbiBhbmQgdGhlIHNpZ25hdHVyZSBvZiBTdGFnZSAxLiAgKi8KKyAgaWYgKCooKHNob3J0ICopKHN0YWdlMV9idWZmZXIgKyBTVEFHRTFfVkVSX01BSl9PRkZTKSkgIT0gQ09NUEFUX1ZFUlNJT04KKyAgICAgIHx8ICgqKCh1bnNpZ25lZCBzaG9ydCAqKSAoc3RhZ2UxX2J1ZmZlciArIEJPT1RTRUNfU0lHX09GRlNFVCkpCisJICAhPSBCT09UU0VDX1NJR05BVFVSRSkpCisgICAgeworICAgICAgZXJybnVtID0gRVJSX0JBRF9WRVJTSU9OOworICAgICAgZ290byBmYWlsOworICAgIH0KKworICAvKiBUaGlzIGJlbG93IGlzIG5vdCB0cnVlIGFueSBsb25nZXIuIEJ1dCBzaG91bGQgd2UgbGVhdmUgdGhpcyBhbG9uZT8gICovCisgIAorICAvKiBJZiBERVNUX0RSSVZFIGlzIGEgZmxvcHB5LCBTdGFnZSAyIG11c3QgaGF2ZSB0aGUgaXRlcmF0aW9uIHByb2JlCisgICAgIHJvdXRpbmUuICAqLworICBpZiAoISAoZGVzdF9kcml2ZSAmIDB4ODApCisgICAgICAmJiAoKigodW5zaWduZWQgY2hhciAqKSAoc3RhZ2UxX2J1ZmZlciArIEJPT1RTRUNfUEFSVF9PRkZTRVQpKSA9PSAweDgwCisJICB8fCBzdGFnZTFfYnVmZmVyW0JPT1RTRUNfUEFSVF9PRkZTRVRdID09IDApKQorICAgIHsKKyAgICAgIGVycm51bSA9IEVSUl9CQURfVkVSU0lPTjsKKyAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgZ3J1Yl9jbG9zZSAoKTsKKyAgCisgIC8qIE9wZW4gU3RhZ2UgMi4gICovCisgIGlzX29wZW4gPSBncnViX29wZW4gKGZpbGUpOworICBpZiAoISBpc19vcGVuKQorICAgIGdvdG8gZmFpbDsKKworICBzcmNfZHJpdmUgPSBjdXJyZW50X2RyaXZlOworICBzcmNfcGFydGl0aW9uID0gY3VycmVudF9wYXJ0aXRpb247CisgIHNyY19wYXJ0X3N0YXJ0ID0gcGFydF9zdGFydDsKKyAgc3JjX2dlb20gPSBidWZfZ2VvbTsKKyAgCisgIGlmICghIG5ld19kcml2ZSkKKyAgICBuZXdfZHJpdmUgPSBzcmNfZHJpdmU7CisgIGVsc2UgaWYgKHNyY19kcml2ZSAhPSBkZXN0X2RyaXZlKQorICAgIGdydWJfcHJpbnRmICgiV2FybmluZzogdGhlIG9wdGlvbiBgZCcgd2FzIG5vdCB1c2VkLCBidXQgdGhlIFN0YWdlIDEgd2lsbCIKKwkJICIgYmUgaW5zdGFsbGVkIG9uIGFcbmRpZmZlcmVudCBkcml2ZSB0aGFuIHRoZSBkcml2ZSB3aGVyZSIKKwkJICIgdGhlIFN0YWdlIDIgcmVzaWRlcy5cbiIpOworCisgIC8qIFNldCB0aGUgYm9vdCBkcml2ZS4gICovCisgICooKHVuc2lnbmVkIGNoYXIgKikgKHN0YWdlMV9idWZmZXIgKyBTVEFHRTFfQk9PVF9EUklWRSkpID0gbmV3X2RyaXZlOworCisgIC8qIFNldCB0aGUgImZvcmNlIExCQSIgZmxhZy4gICovCisgICooKHVuc2lnbmVkIGNoYXIgKikgKHN0YWdlMV9idWZmZXIgKyBTVEFHRTFfRk9SQ0VfTEJBKSkgPSBpc19mb3JjZV9sYmE7CisKKyAgLyogSWYgREVTVF9EUklWRSBpcyBhIGhhcmQgZGlzaywgZW5hYmxlIHRoZSB3b3JrYXJvdW5kLCB3aGljaCBpcworICAgICBmb3IgYnVnZ3kgQklPU2VzIHdoaWNoIGRvbid0IHBhc3MgYm9vdCBkcml2ZSBjb3JyZWN0bHkuIEluc3RlYWQsCisgICAgIHRoZXkgcGFzcyAweDAwIG9yIDB4MDEgZXZlbiB3aGVuIGJvb3RlZCBmcm9tIDB4ODAuICAqLworICBpZiAoZGVzdF9kcml2ZSAmIEJJT1NfRkxBR19GSVhFRF9ESVNLKQorICAgIC8qIFJlcGxhY2UgdGhlIGptcCAoMiBieXRlcykgd2l0aCBkb3VibGUgbm9wJ3MuICAqLworICAgICooKHVuc2lnbmVkIHNob3J0ICopIChzdGFnZTFfYnVmZmVyICsgU1RBR0UxX0JPT1RfRFJJVkVfQ0hFQ0spKQorICAgICAgPSAweDkwOTA7CisgIAorICAvKiBSZWFkIHRoZSBmaXJzdCBzZWN0b3Igb2YgU3RhZ2UgMi4gICovCisgIGRpc2tfcmVhZF9ob29rID0gZGlza19yZWFkX3NhdmVzZWN0X2Z1bmM7CisgIGlmIChncnViX3JlYWQgKHN0YWdlMl9maXJzdF9idWZmZXIsIFNFQ1RPUl9TSVpFKSAhPSBTRUNUT1JfU0laRSkKKyAgICBnb3RvIGZhaWw7CisKKyAgc3RhZ2UyX2ZpcnN0X3NlY3RvciA9IHNhdmVkX3NlY3RvcjsKKyAgCisgIC8qIFJlYWQgdGhlIHNlY29uZCBzZWN0b3Igb2YgU3RhZ2UgMi4gICovCisgIGlmIChncnViX3JlYWQgKHN0YWdlMl9zZWNvbmRfYnVmZmVyLCBTRUNUT1JfU0laRSkgIT0gU0VDVE9SX1NJWkUpCisgICAgZ290byBmYWlsOworCisgIHN0YWdlMl9zZWNvbmRfc2VjdG9yID0gc2F2ZWRfc2VjdG9yOworICAKKyAgLyogQ2hlY2sgZm9yIHRoZSB2ZXJzaW9uIG9mIFN0YWdlIDIuICAqLworICBpZiAoKigoc2hvcnQgKikgKHN0YWdlMl9zZWNvbmRfYnVmZmVyICsgU1RBR0UyX1ZFUl9NQUpfT0ZGUykpCisgICAgICAhPSBDT01QQVRfVkVSU0lPTikKKyAgICB7CisgICAgICBlcnJudW0gPSBFUlJfQkFEX1ZFUlNJT047CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgIC8qIENoZWNrIGZvciB0aGUgU3RhZ2UgMiBpZC4gICovCisgIGlmIChzdGFnZTJfc2Vjb25kX2J1ZmZlcltTVEFHRTJfU1RBR0UyX0lEXSAhPSBTVEFHRTJfSURfU1RBR0UyKQorICAgIGlzX3N0YWdlMV81ID0gMTsKKworICAvKiBJZiBJTlNUQUxMQUREUiBpcyBub3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHkgaW4gdGhlIGNvbW1hbmQtbGluZSwKKyAgICAgZGV0ZXJtaW5lIGl0IGJ5IHRoZSBTdGFnZSAyIGlkLiAgKi8KKyAgaWYgKCEgaW5zdGFsbGFkZHIpCisgICAgeworICAgICAgaWYgKCEgaXNfc3RhZ2UxXzUpCisJLyogU3RhZ2UgMi4gICovCisJaW5zdGFsbGFkZHIgPSAweDgwMDA7CisgICAgICBlbHNlCisJLyogU3RhZ2UgMS41LiAgKi8KKwlpbnN0YWxsYWRkciA9IDB4MjAwMDsKKyAgICB9CisKKyAgKigodW5zaWduZWQgbG9uZyAqKSAoc3RhZ2UxX2J1ZmZlciArIFNUQUdFMV9TVEFHRTJfU0VDVE9SKSkKKyAgICA9IHN0YWdlMl9maXJzdF9zZWN0b3I7CisgICooKHVuc2lnbmVkIHNob3J0ICopIChzdGFnZTFfYnVmZmVyICsgU1RBR0UxX1NUQUdFMl9BRERSRVNTKSkKKyAgICA9IGluc3RhbGxhZGRyOworICAqKCh1bnNpZ25lZCBzaG9ydCAqKSAoc3RhZ2UxX2J1ZmZlciArIFNUQUdFMV9TVEFHRTJfU0VHTUVOVCkpCisgICAgPSBpbnN0YWxsYWRkciA+PiA0OworCisgIGkgPSAoaW50KSBzdGFnZTJfZmlyc3RfYnVmZmVyICsgU0VDVE9SX1NJWkUgLSA0OworICB3aGlsZSAoKigodW5zaWduZWQgbG9uZyAqKSBpKSkKKyAgICB7CisgICAgICBpZiAoaSA8IChpbnQpIHN0YWdlMl9maXJzdF9idWZmZXIKKwkgIHx8ICgqKChpbnQgKikgKGkgLSA0KSkgJiAweDgwMDAwMDAwKQorCSAgfHwgKigodW5zaWduZWQgc2hvcnQgKikgaSkgPj0gMHhBMDAKKwkgIHx8ICooKHNob3J0ICopIChpICsgMikpID09IDApCisJeworCSAgZXJybnVtID0gRVJSX0JBRF9WRVJTSU9OOworCSAgZ290byBmYWlsOworCX0KKworICAgICAgKigoaW50ICopIGkpID0gMDsKKyAgICAgICooKGludCAqKSAoaSAtIDQpKSA9IDA7CisgICAgICBpIC09IDg7CisgICAgfQorCisgIGluc3RhbGxsaXN0ID0gKGludCkgc3RhZ2UyX2ZpcnN0X2J1ZmZlciArIFNFQ1RPUl9TSVpFICsgNDsKKyAgaW5zdGFsbGFkZHIgKz0gU0VDVE9SX1NJWkU7CisgIAorICAvKiBSZWFkIHRoZSB3aG9sZSBvZiBTdGFnZTIgZXhjZXB0IGZvciB0aGUgZmlyc3Qgc2VjdG9yLiAgKi8KKyAgZ3J1Yl9zZWVrIChTRUNUT1JfU0laRSk7CisKKyAgZGlza19yZWFkX2hvb2sgPSBkaXNrX3JlYWRfYmxvY2tsaXN0X2Z1bmM7CisgIGlmICghIGdydWJfcmVhZCAoZHVtbXksIC0xKSkKKyAgICBnb3RvIGZhaWw7CisgIAorICBkaXNrX3JlYWRfaG9vayA9IDA7CisgIAorICAvKiBGaW5kIGEgc3RyaW5nIGZvciB0aGUgY29uZmlndXJhdGlvbiBmaWxlbmFtZS4gICovCisgIGNvbmZpZ19maWxlX2xvY2F0aW9uID0gc3RhZ2UyX3NlY29uZF9idWZmZXIgKyBTVEFHRTJfVkVSX1NUUl9PRkZTOworICB3aGlsZSAoKihjb25maWdfZmlsZV9sb2NhdGlvbisrKSkKKyAgICA7CisKKyAgLyogU2V0IHRoZSAiZm9yY2UgTEJBIiBmbGFnIGZvciBTdGFnZTIuICAqLworICAqKCh1bnNpZ25lZCBjaGFyICopIChzdGFnZTJfc2Vjb25kX2J1ZmZlciArIFNUQUdFMl9GT1JDRV9MQkEpKQorICAgID0gaXNfZm9yY2VfbGJhOworICAKKyAgaWYgKCpwdHIgPT0gJ3AnKQorICAgIHsKKyAgICAgICooKGxvbmcgKikgKHN0YWdlMl9zZWNvbmRfYnVmZmVyICsgU1RBR0UyX0lOU1RBTExQQVJUKSkKKwk9IHNyY19wYXJ0aXRpb247CisgICAgICBpZiAoaXNfc3RhZ2UxXzUpCisJeworCSAgLyogUmVzZXQgdGhlIGRldmljZSBpbmZvcm1hdGlvbiBpbiBGSUxFIGlmIGl0IGlzIGEgU3RhZ2UgMS41LiAgKi8KKwkgIHVuc2lnbmVkIGxvbmcgZGV2aWNlID0gMHhGRkZGRkZGRjsKKworCSAgZ3J1Yl9tZW1tb3ZlIChjb25maWdfZmlsZV9sb2NhdGlvbiwgKGNoYXIgKikgJmRldmljZSwKKwkJCXNpemVvZiAoZGV2aWNlKSk7CisJfQorCisgICAgICBwdHIgPSBza2lwX3RvICgwLCBwdHIpOworICAgIH0KKworICBpZiAoKnB0cikKKyAgICB7CisgICAgICBncnViX3N0cmNweSAoY29uZmlnX2ZpbGVuYW1lLCBwdHIpOworICAgICAgbnVsX3Rlcm1pbmF0ZSAoY29uZmlnX2ZpbGVuYW1lKTsKKwkKKyAgICAgIGlmICghIGlzX3N0YWdlMV81KQorCS8qIElmIGl0IGlzIGEgU3RhZ2UgMiwganVzdCBjb3B5IFBUUiB0byBDT05GSUdfRklMRV9MT0NBVElPTi4gICovCisJZ3J1Yl9zdHJjcHkgKGNvbmZpZ19maWxlX2xvY2F0aW9uLCBwdHIpOworICAgICAgZWxzZQorCXsKKwkgIGNoYXIgKnJlYWxfY29uZmlnOworCSAgdW5zaWduZWQgbG9uZyBkZXZpY2U7CisKKwkgIC8qIFRyYW5zbGF0ZSB0aGUgZXh0ZXJuYWwgZGV2aWNlIHN5bnRheCB0byB0aGUgaW50ZXJuYWwgZGV2aWNlCisJICAgICBzeW50YXguICAqLworCSAgaWYgKCEgKHJlYWxfY29uZmlnID0gc2V0X2RldmljZSAocHRyKSkpCisJICAgIHsKKwkgICAgICAvKiBUaGUgU3RhZ2UgMiBQVFIgZG9lcyBub3QgY29udGFpbiB0aGUgZGV2aWNlIG5hbWUsIHNvCisJCSB1c2UgdGhlIHJvb3QgZGV2aWNlIGluc3RlYWQuICAqLworCSAgICAgIGVycm51bSA9IEVSUl9OT05FOworCSAgICAgIGN1cnJlbnRfZHJpdmUgPSBzYXZlZF9kcml2ZTsKKwkgICAgICBjdXJyZW50X3BhcnRpdGlvbiA9IHNhdmVkX3BhcnRpdGlvbjsKKwkgICAgICByZWFsX2NvbmZpZyA9IHB0cjsKKwkgICAgfQorCSAgCisJICBpZiAoY3VycmVudF9kcml2ZSA9PSBzcmNfZHJpdmUpCisJICAgIHsKKwkgICAgICAvKiBJZiB0aGUgZHJpdmUgd2hlcmUgdGhlIFN0YWdlIDIgcmVzaWRlcyBpcyB0aGUgc2FtZSBhcworCQkgdGhlIG9uZSB3aGVyZSB0aGUgU3RhZ2UgMS41IHJlc2lkZXMsIGRvIG5vdCBlbWJlZCB0aGUKKwkJIGRyaXZlIG51bWJlci4gICovCisJICAgICAgY3VycmVudF9kcml2ZSA9IEdSVUJfSU5WQUxJRF9EUklWRTsKKwkgICAgfQorCisJICBkZXZpY2UgPSAoY3VycmVudF9kcml2ZSA8PCAyNCkgfCBjdXJyZW50X3BhcnRpdGlvbjsKKwkgIGdydWJfbWVtbW92ZSAoY29uZmlnX2ZpbGVfbG9jYXRpb24sIChjaGFyICopICZkZXZpY2UsCisJCQlzaXplb2YgKGRldmljZSkpOworCSAgZ3J1Yl9zdHJjcHkgKGNvbmZpZ19maWxlX2xvY2F0aW9uICsgc2l6ZW9mIChkZXZpY2UpLAorCQkgICAgICAgcmVhbF9jb25maWcpOworCX0KKworICAgICAgLyogSWYgYSBTdGFnZSAxLjUgaXMgdXNlZCwgdGhlbiB3ZSBuZWVkIHRvIG1vZGlmeSB0aGUgU3RhZ2UyLiAgKi8KKyAgICAgIGlmIChpc19zdGFnZTFfNSkKKwl7CisJICBjaGFyICpyZWFsX2NvbmZpZ19maWxlbmFtZSA9IHNraXBfdG8gKDAsIHB0cik7CisJICAKKwkgIGlzX29wZW4gPSBncnViX29wZW4gKGNvbmZpZ19maWxlbmFtZSk7CisJICBpZiAoISBpc19vcGVuKQorCSAgICBnb3RvIGZhaWw7CisKKwkgIC8qIFNraXAgdGhlIGZpcnN0IHNlY3Rvci4gICovCisJICBncnViX3NlZWsgKFNFQ1RPUl9TSVpFKTsKKwkgIAorCSAgZGlza19yZWFkX2hvb2sgPSBkaXNrX3JlYWRfc2F2ZXNlY3RfZnVuYzsKKwkgIGlmIChncnViX3JlYWQgKHN0YWdlMl9idWZmZXIsIFNFQ1RPUl9TSVpFKSAhPSBTRUNUT1JfU0laRSkKKwkgICAgZ290byBmYWlsOworCSAgCisJICBkaXNrX3JlYWRfaG9vayA9IDA7CisJICBncnViX2Nsb3NlICgpOworCSAgaXNfb3BlbiA9IDA7CisJICAKKwkgIC8qIFNhbml0eSBjaGVjay4gICovCisJICBpZiAoKihzdGFnZTJfYnVmZmVyICsgU1RBR0UyX1NUQUdFMl9JRCkgIT0gU1RBR0UyX0lEX1NUQUdFMikKKwkgICAgeworCSAgICAgIGVycm51bSA9IEVSUl9CQURfVkVSU0lPTjsKKwkgICAgICBnb3RvIGZhaWw7CisJICAgIH0KKworCSAgLyogU2V0IHRoZSAiZm9yY2UgTEJBIiBmbGFnIGZvciBTdGFnZTIuICAqLworCSAgKihzdGFnZTJfYnVmZmVyICsgU1RBR0UyX0ZPUkNFX0xCQSkgPSBpc19mb3JjZV9sYmE7CisKKwkgIC8qIElmIFJFQUxfQ09ORklHX0ZJTEVOQU1FIGlzIHNwZWNpZmllZCwgY29weSBpdCB0byB0aGUgU3RhZ2UyLiAgKi8KKwkgIGlmICgqcmVhbF9jb25maWdfZmlsZW5hbWUpCisJICAgIHsKKwkgICAgICAvKiBTcGVjaWZpZWQgKi8KKwkgICAgICBjaGFyICpsb2NhdGlvbjsKKwkgICAgICAKKwkgICAgICAvKiBGaW5kIGEgc3RyaW5nIGZvciB0aGUgY29uZmlndXJhdGlvbiBmaWxlbmFtZS4gICovCisJICAgICAgbG9jYXRpb24gPSBzdGFnZTJfYnVmZmVyICsgU1RBR0UyX1ZFUl9TVFJfT0ZGUzsKKwkgICAgICB3aGlsZSAoKihsb2NhdGlvbisrKSkKKwkJOworCSAgICAgIAorCSAgICAgIC8qIENvcHkgdGhlIG5hbWUuICAqLworCSAgICAgIGdydWJfc3RyY3B5IChsb2NhdGlvbiwgcmVhbF9jb25maWdfZmlsZW5hbWUpOworCSAgICB9CisJICAKKwkgIC8qIFdyaXRlIGl0IHRvIHRoZSBkaXNrLiAgKi8KKwkgIGJ1Zl90cmFjayA9IC0xOworCisjaWZkZWYgR1JVQl9VVElMCisJICAvKiBJbiB0aGUgZ3J1YiBzaGVsbCwgYWNjZXNzIHRoZSBTdGFnZSAyIHZpYSB0aGUgT1MgZmlsZXN5c3RlbQorCSAgICAgc2VydmljZSwgaWYgcG9zc2libGUuICAqLworCSAgaWYgKHN0YWdlMl9vc19maWxlKQorCSAgICB7CisJICAgICAgRklMRSAqZnA7CisKKwkgICAgICBmcCA9IGZvcGVuIChzdGFnZTJfb3NfZmlsZSwgInIrIik7CisJICAgICAgaWYgKCEgZnApCisJCXsKKwkJICBlcnJudW0gPSBFUlJfRklMRV9OT1RfRk9VTkQ7CisJCSAgZ290byBmYWlsOworCQl9CisKKwkgICAgICBpZiAoZnNlZWsgKGZwLCBTRUNUT1JfU0laRSwgU0VFS19TRVQpICE9IDApCisJCXsKKwkJICBmY2xvc2UgKGZwKTsKKwkJICBlcnJudW0gPSBFUlJfQkFEX1ZFUlNJT047CisJCSAgZ290byBmYWlsOworCQl9CisKKwkgICAgICBpZiAoZndyaXRlIChzdGFnZTJfYnVmZmVyLCAxLCBTRUNUT1JfU0laRSwgZnApCisJCSAgIT0gU0VDVE9SX1NJWkUpCisJCXsKKwkJICBmY2xvc2UgKGZwKTsKKwkJICBlcnJudW0gPSBFUlJfV1JJVEU7CisJCSAgZ290byBmYWlsOworCQl9CisKKwkgICAgICBmY2xvc2UgKGZwKTsKKwkgICAgfQorCSAgZWxzZQorI2VuZGlmIC8qIEdSVUJfVVRJTCAqLworCSAgICB7CisJICAgICAgaWYgKCEgZGV2d3JpdGUgKHNhdmVkX3NlY3RvciAtIHBhcnRfc3RhcnQsIDEsIHN0YWdlMl9idWZmZXIpKQorCQlnb3RvIGZhaWw7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIENsZWFyIHRoZSBjYWNoZS4gICovCisgIGJ1Zl90cmFjayA9IC0xOworCisgIC8qIFdyaXRlIHRoZSBtb2RpZmllZCBzZWN0b3JzIG9mIFN0YWdlMiB0byB0aGUgZGlzay4gICovCisjaWZkZWYgR1JVQl9VVElMCisgIGlmICghIGlzX3N0YWdlMV81ICYmIHN0YWdlMl9vc19maWxlKQorICAgIHsKKyAgICAgIEZJTEUgKmZwOworCisgICAgICBmcCA9IGZvcGVuIChzdGFnZTJfb3NfZmlsZSwgInIrIik7CisgICAgICBpZiAoISBmcCkKKwl7CisJICBlcnJudW0gPSBFUlJfRklMRV9OT1RfRk9VTkQ7CisJICBnb3RvIGZhaWw7CisJfQorCisgICAgICBpZiAoZndyaXRlIChzdGFnZTJfZmlyc3RfYnVmZmVyLCAxLCBTRUNUT1JfU0laRSwgZnApICE9IFNFQ1RPUl9TSVpFKQorCXsKKwkgIGZjbG9zZSAoZnApOworCSAgZXJybnVtID0gRVJSX1dSSVRFOworCSAgZ290byBmYWlsOworCX0KKworICAgICAgaWYgKGZ3cml0ZSAoc3RhZ2UyX3NlY29uZF9idWZmZXIsIDEsIFNFQ1RPUl9TSVpFLCBmcCkgIT0gU0VDVE9SX1NJWkUpCisJeworCSAgZmNsb3NlIChmcCk7CisJICBlcnJudW0gPSBFUlJfV1JJVEU7CisJICBnb3RvIGZhaWw7CisJfQorCisgICAgICBmY2xvc2UgKGZwKTsKKyAgICB9CisgIGVsc2UKKyNlbmRpZiAvKiBHUlVCX1VUSUwgKi8KKyAgICB7CisgICAgICAvKiBUaGUgZmlyc3QuICAqLworICAgICAgY3VycmVudF9kcml2ZSA9IHNyY19kcml2ZTsKKyAgICAgIGN1cnJlbnRfcGFydGl0aW9uID0gc3JjX3BhcnRpdGlvbjsKKworICAgICAgaWYgKCEgb3Blbl9wYXJ0aXRpb24gKCkpCisJZ290byBmYWlsOworCisgICAgICBpZiAoISBkZXZ3cml0ZSAoc3RhZ2UyX2ZpcnN0X3NlY3RvciAtIHNyY19wYXJ0X3N0YXJ0LCAxLAorCQkgICAgICBzdGFnZTJfZmlyc3RfYnVmZmVyKSkKKwlnb3RvIGZhaWw7CisKKyAgICAgIGlmICghIGRldndyaXRlIChzdGFnZTJfc2Vjb25kX3NlY3RvciAtIHNyY19wYXJ0X3N0YXJ0LCAxLAorCQkgICAgICBzdGFnZTJfc2Vjb25kX2J1ZmZlcikpCisJZ290byBmYWlsOworICAgIH0KKyAgCisgIC8qIFdyaXRlIHRoZSBtb2RpZmllZCBzZWN0b3Igb2YgU3RhZ2UgMSB0byB0aGUgZGlzay4gICovCisgIGN1cnJlbnRfZHJpdmUgPSBkZXN0X2RyaXZlOworICBjdXJyZW50X3BhcnRpdGlvbiA9IGRlc3RfcGFydGl0aW9uOworICBpZiAoISBvcGVuX3BhcnRpdGlvbiAoKSkKKyAgICBnb3RvIGZhaWw7CisKKyAgZGV2d3JpdGUgKDAsIDEsIHN0YWdlMV9idWZmZXIpOworCisgZmFpbDoKKyAgaWYgKGlzX29wZW4pCisgICAgZ3J1Yl9jbG9zZSAoKTsKKyAgCisgIGRpc2tfcmVhZF9ob29rID0gMDsKKyAgCisjaWZuZGVmIE5PX0RFQ09NUFJFU1NJT04KKyAgbm9fZGVjb21wcmVzc2lvbiA9IDA7CisjZW5kaWYKKworICByZXR1cm4gZXJybnVtOworfQorCitzdGF0aWMgc3RydWN0IGJ1aWx0aW4gYnVpbHRpbl9pbnN0YWxsID0KK3sKKyAgImluc3RhbGwiLAorICBpbnN0YWxsX2Z1bmMsCisgIEJVSUxUSU5fQ01ETElORSwKKyAgImluc3RhbGwgWy0tc3RhZ2UyPVNUQUdFMl9GSUxFXSBbLS1mb3JjZS1sYmFdIFNUQUdFMSBbZF0gREVWSUNFIFNUQUdFMiBbQUREUl0gW3BdIFtDT05GSUdfRklMRV0gW1JFQUxfQ09ORklHX0ZJTEVdIiwKKyAgIkluc3RhbGwgU1RBR0UxIG9uIERFVklDRSwgYW5kIGluc3RhbGwgYSBibG9ja2xpc3QgZm9yIGxvYWRpbmcgU1RBR0UyIgorICAiIGFzIGEgU3RhZ2UgMi4gSWYgdGhlIG9wdGlvbiBgZCcgaXMgcHJlc2VudCwgdGhlIFN0YWdlIDEgd2lsbCBhbHdheXMiCisgICIgbG9vayBmb3IgdGhlIGRpc2sgd2hlcmUgU1RBR0UyIHdhcyBpbnN0YWxsZWQsIHJhdGhlciB0aGFuIHVzaW5nIgorICAiIHRoZSBib290aW5nIGRyaXZlLiBUaGUgU3RhZ2UgMiB3aWxsIGJlIGxvYWRlZCBhdCBhZGRyZXNzIEFERFIsIHdoaWNoIgorICAiIHdpbGwgYmUgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5IGlmIHlvdSBkb24ndCBzcGVjaWZ5IGl0LiBJZiIKKyAgIiB0aGUgb3B0aW9uIGBwJyBvciBDT05GSUdfRklMRSBpcyBwcmVzZW50LCB0aGVuIHRoZSBmaXJzdCBibG9jayIKKyAgIiBvZiBTdGFnZSAyIGlzIHBhdGNoZWQgd2l0aCBuZXcgdmFsdWVzIG9mIHRoZSBwYXJ0aXRpb24gYW5kIG5hbWUiCisgICIgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB1c2VkIGJ5IHRoZSB0cnVlIFN0YWdlIDIgKGZvciBhIFN0YWdlIDEuNSwiCisgICIgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgdHJ1ZSBTdGFnZSAyKSBhdCBib290IHRpbWUuIElmIFNUQUdFMiBpcyBhIFN0YWdlIgorICAiIDEuNSBhbmQgUkVBTF9DT05GSUdfRklMRSBpcyBwcmVzZW50LCB0aGVuIHRoZSBTdGFnZSAyIENPTkZJR19GSUxFIGlzIgorICAiIHBhdGNoZWQgd2l0aCB0aGUgY29uZmlndXJhdGlvbiBmaWxlbmFtZSBSRUFMX0NPTkZJR19GSUxFLiIKKyAgIiBJZiB0aGUgb3B0aW9uIGAtLWZvcmNlLWxiYScgaXMgc3BlY2lmaWVkLCBkaXNhYmxlIHNvbWUgc2FuaXR5IGNoZWNrcyIKKyAgIiBmb3IgTEJBIG1vZGUuIElmIHRoZSBvcHRpb24gYC0tc3RhZ2UyJyBpcyBzcGVjaWZpZWQsIHJld3JpdGUgdGhlIFN0YWdlIgorICAiIDIgdmlhIHlvdXIgT1MncyBmaWxlc3lzdGVtIGluc3RlYWQgb2YgdGhlIHJhdyBkZXZpY2UuIgorfTsKKworDAorLyogaW9wcm9iZSAqLworc3RhdGljIGludAoraW9wcm9iZV9mdW5jIChjaGFyICphcmcsIGludCBmbGFncykKK3sKKyNpZmRlZiBHUlVCX1VUSUwKKyAgCisgIGVycm51bSA9IEVSUl9VTlJFQ09HTklaRUQ7CisgIHJldHVybiAxOworICAKKyNlbHNlIC8qICEgR1JVQl9VVElMICovCisgIAorICB1bnNpZ25lZCBzaG9ydCAqcG9ydDsKKyAgCisgIC8qIEdldCB0aGUgZHJpdmUgbnVtYmVyLiAgKi8KKyAgc2V0X2RldmljZSAoYXJnKTsKKyAgaWYgKGVycm51bSkKKyAgICByZXR1cm4gMTsKKworICAvKiBDbGVhbiBvdXQgSU9fTUFQLiAgKi8KKyAgZ3J1Yl9tZW1zZXQgKChjaGFyICopIGlvX21hcCwgMCwgSU9fTUFQX1NJWkUgKiBzaXplb2YgKHVuc2lnbmVkIHNob3J0KSk7CisKKyAgLyogVHJhY2sgdGhlIGludDEzIGhhbmRsZXIuICAqLworICB0cmFja19pbnQxMyAoY3VycmVudF9kcml2ZSk7CisgIAorICAvKiBQcmludCBvdXQgdGhlIHJlc3VsdC4gICovCisgIGZvciAocG9ydCA9IGlvX21hcDsgKnBvcnQgIT0gMDsgcG9ydCsrKQorICAgIGdydWJfcHJpbnRmICgiIDB4JXgiLCAodW5zaWduZWQgaW50KSAqcG9ydCk7CisKKyAgcmV0dXJuIDA7CisgIAorI2VuZGlmIC8qICEgR1JVQl9VVElMICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX2lvcHJvYmUgPQoreworICAiaW9wcm9iZSIsCisgIGlvcHJvYmVfZnVuYywKKyAgQlVJTFRJTl9DTURMSU5FLAorICAiaW9wcm9iZSBEUklWRSIsCisgICJQcm9iZSBJL08gcG9ydHMgdXNlZCBmb3IgdGhlIGRyaXZlIERSSVZFLiIKK307CisKKwwKKy8qIGtlcm5lbCAqLworc3RhdGljIGludAora2VybmVsX2Z1bmMgKGNoYXIgKmFyZywgaW50IGZsYWdzKQoreworICBpbnQgbGVuOworICBrZXJuZWxfdCBzdWdnZXN0ZWRfdHlwZSA9IEtFUk5FTF9UWVBFX05PTkU7CisgIHVuc2lnbmVkIGxvbmcgbG9hZF9mbGFncyA9IDA7CisKKyNpZm5kZWYgQVVUT19MSU5VWF9NRU1fT1BUCisgIGxvYWRfZmxhZ3MgfD0gS0VSTkVMX0xPQURfTk9fTUVNX09QVElPTjsKKyNlbmRpZgorCisgIC8qIERlYWwgd2l0aCBHTlUtc3R5bGUgbG9uZyBvcHRpb25zLiAgKi8KKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgLyogSWYgdGhlIG9wdGlvbiBgLS10eXBlPVRZUEUnIGlzIHNwZWNpZmllZCwgY29udmVydCB0aGUgc3RyaW5nIHRvCisJIGEga2VybmVsIHR5cGUuICAqLworICAgICAgaWYgKGdydWJfbWVtY21wIChhcmcsICItLXR5cGU9IiwgNykgPT0gMCkKKwl7CisJICBhcmcgKz0gNzsKKwkgIAorCSAgaWYgKGdydWJfbWVtY21wIChhcmcsICJuZXRic2QiLCA2KSA9PSAwKQorCSAgICBzdWdnZXN0ZWRfdHlwZSA9IEtFUk5FTF9UWVBFX05FVEJTRDsKKwkgIGVsc2UgaWYgKGdydWJfbWVtY21wIChhcmcsICJmcmVlYnNkIiwgNykgPT0gMCkKKwkgICAgc3VnZ2VzdGVkX3R5cGUgPSBLRVJORUxfVFlQRV9GUkVFQlNEOworCSAgZWxzZSBpZiAoZ3J1Yl9tZW1jbXAgKGFyZywgIm9wZW5ic2QiLCA3KSA9PSAwKQorCSAgICAvKiBYWFg6IEZvciBub3csIE9wZW5CU0QgaXMgaWRlbnRpY2FsIHRvIE5ldEJTRCwgZnJvbSBHUlVCJ3MKKwkgICAgICAgcG9pbnQgb2Ygdmlldy4gICovCisJICAgIHN1Z2dlc3RlZF90eXBlID0gS0VSTkVMX1RZUEVfTkVUQlNEOworCSAgZWxzZSBpZiAoZ3J1Yl9tZW1jbXAgKGFyZywgImxpbnV4IiwgNSkgPT0gMCkKKwkgICAgc3VnZ2VzdGVkX3R5cGUgPSBLRVJORUxfVFlQRV9MSU5VWDsKKwkgIGVsc2UgaWYgKGdydWJfbWVtY21wIChhcmcsICJiaWdsaW51eCIsIDgpID09IDApCisJICAgIHN1Z2dlc3RlZF90eXBlID0gS0VSTkVMX1RZUEVfQklHX0xJTlVYOworCSAgZWxzZSBpZiAoZ3J1Yl9tZW1jbXAgKGFyZywgIm11bHRpYm9vdCIsIDkpID09IDApCisJICAgIHN1Z2dlc3RlZF90eXBlID0gS0VSTkVMX1RZUEVfTVVMVElCT09UOworCSAgZWxzZQorCSAgICB7CisJICAgICAgZXJybnVtID0gRVJSX0JBRF9BUkdVTUVOVDsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgfQorCX0KKyAgICAgIC8qIElmIHRoZSBgLS1uby1tZW0tb3B0aW9uJyBpcyBzcGVjaWZpZWQsIGRvbid0IHBhc3MgYSBMaW51eCdzIG1lbQorCSBvcHRpb24gYXV0b21hdGljYWxseS4gSWYgdGhlIGtlcm5lbCBpcyBhbm90aGVyIHR5cGUsIHRoaXMgZmxhZworCSBoYXMgbm8gZWZmZWN0LiAgKi8KKyAgICBlbHNlIGlmIChncnViX21lbWNtcCAoYXJnLCAiLS1uby1tZW0tb3B0aW9uIiwgMTUpID09IDApCisgICAgICAgIGxvYWRfZmxhZ3MgfD0gS0VSTkVMX0xPQURfTk9fTUVNX09QVElPTjsKKyAgICBlbHNlIGlmIChncnViX21lbWNtcChhcmcsICItLXVzZS1jbWQtbGluZSIsIDE0KSA9PSAwKSB7CisgICAgICAgIGlmICghY21kbGluZV9sb2FkZWQpIHsKKyAgICAgICAgICAgIGVycm51bSA9IEVSUl9CQURfQVJHVU1FTlQ7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICAgIGVsc2UKKwlicmVhazsKKworICAgICAgLyogVHJ5IHRoZSBuZXh0LiAgKi8KKyAgICAgIGFyZyA9IHNraXBfdG8gKDAsIGFyZyk7CisgICAgfQorCisgIGlmICghY21kbGluZV9sb2FkZWQpIHsKKyAgICBsZW4gPSBncnViX3N0cmxlbiAoYXJnKTsKKworICAgIC8qIFJlc2V0IE1CX0NNRExJTkUuICAqLworICAgIG1iX2NtZGxpbmUgPSAoY2hhciAqKSBNQl9DTURMSU5FX0JVRjsKKyAgICBpZiAobGVuICsgMSA+IE1CX0NNRExJTkVfQlVGTEVOKQorICAgICAgeworICAgICAgICBlcnJudW0gPSBFUlJfV09OVF9GSVQ7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIGdydWJfbWVtbW92ZSAobWJfY21kbGluZSwgYXJnLCBsZW4gKyAxKTsKKyAgfSBlbHNlIHsKKyAgICBsZW4gPSBncnViX3N0cmxlbihtYl9jbWRsaW5lKTsKKyAgfQorCisKKyAgLyogQ29weSB0aGUgY29tbWFuZC1saW5lIHRvIE1CX0NNRExJTkUuICAqLworICBrZXJuZWxfdHlwZSA9IGxvYWRfaW1hZ2UgKGFyZywgbWJfY21kbGluZSwgc3VnZ2VzdGVkX3R5cGUsIGxvYWRfZmxhZ3MpOworICBpZiAoa2VybmVsX3R5cGUgPT0gS0VSTkVMX1RZUEVfTk9ORSkKKyAgICByZXR1cm4gMTsKKworICBtYl9jbWRsaW5lICs9IGxlbiArIDE7CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX2tlcm5lbCA9Cit7CisgICJrZXJuZWwiLAorICBrZXJuZWxfZnVuYywKKyAgQlVJTFRJTl9DTURMSU5FIHwgQlVJTFRJTl9IRUxQX0xJU1QsCisgICJrZXJuZWwgWy0tbm8tbWVtLW9wdGlvbl0gWy0tdHlwZT1UWVBFXSBbLS11c2UtY21kLWxpbmVdIEZJTEUgW0FSRyAuLi5dIiwKKyAgIkF0dGVtcHQgdG8gbG9hZCB0aGUgcHJpbWFyeSBib290IGltYWdlIGZyb20gRklMRS4gVGhlIHJlc3Qgb2YgdGhlIgorICAiIGxpbmUgaXMgcGFzc2VkIHZlcmJhdGltIGFzIHRoZSBcImtlcm5lbCBjb21tYW5kIGxpbmVcIi4gIEFueSBtb2R1bGVzIgorICAiIG11c3QgYmUgcmVsb2FkZWQgYWZ0ZXIgdXNpbmcgdGhpcyBjb21tYW5kLiBUaGUgb3B0aW9uIC0tdHlwZSBpcyB1c2VkIgorICAiIHRvIHN1Z2dlc3Qgd2hhdCB0eXBlIG9mIGtlcm5lbCB0byBiZSBsb2FkZWQuIFRZUEUgbXVzdCBiZSBlaXRoZXIgb2YiCisgICIgXCJuZXRic2RcIiwgXCJmcmVlYnNkXCIsIFwib3BlbmJzZFwiLCBcImxpbnV4XCIsIFwiYmlnbGludXhcIiBhbmQiCisgICIgXCJtdWx0aWJvb3RcIi4gVGhlIG9wdGlvbiAtLW5vLW1lbS1vcHRpb24gdGVsbHMgR1JVQiBub3QgdG8gcGFzcyBhIgorICAiIExpbnV4J3MgbWVtIG9wdGlvbiBhdXRvbWF0aWNhbGx5LiBJZiB0aGUgb3B0aW9uIC0tdXNlLWNtZC1saW5lIGlzIgorICAiIHByb3ZpZGVkLCB0aGVuIEdSVUIgaWdub3JlcyB0aGUgcmVzdCBvZiB0aGUgbGluZSwgYW5kIGluc3RlYWQgcGFzc2VzIgorICAiIHRoZSBjb21tYW5kIGxpbmUgbG9hZGVkIHdpdGggXCJjbWRsaW5lXCIgY29tbWFuZCB0byB0aGUga2VybmVsLiIKK307CisKKwwKKy8qIGNtZGxpbmUgKi8KK3N0YXRpYyBpbnQKK2NtZGxpbmVfZnVuYyAoY2hhciAqYXJnLCBpbnQgZmxhZ3MpCit7CisgIGludCBsZW47CisKKyAgaWYgKCFncnViX29wZW4oYXJnKSkKKyAgICByZXR1cm4gMTsKKworICBpZiAoZmlsZW1heCA+IE1CX0NNRExJTkVfQlVGTEVOKSB7CisgICAgICBncnViX2Nsb3NlKCk7CisgICAgICBlcnJudW0gPSBFUlJfV09OVF9GSVQ7CisgICAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmICghKGxlbiA9IGdydWJfcmVhZCAobWJfY21kbGluZSwgTUJfQ01ETElORV9CVUZMRU4gLSAxKSkpIHsKKyAgICAgIGdydWJfY2xvc2UoKTsKKyAgICAgIHJldHVybiAxOworICB9CisKKyAgZ3J1Yl9jbG9zZSgpOworCisgIG1iX2NtZGxpbmVbbGVuXSA9IDA7CisgIGdydWJfcHJpbnRmKCJMb2FkZWQga2VybmVsIGNtZGxpbmUgYXJnczogJXNcbiIsIG1iX2NtZGxpbmUpOworICBjbWRsaW5lX2xvYWRlZCA9IDE7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJ1aWx0aW4gYnVpbHRpbl9jbWRsaW5lID0KK3sKKyAgImNtZGxpbmUiLAorICBjbWRsaW5lX2Z1bmMsCisgIEJVSUxUSU5fQ01ETElORSB8IEJVSUxUSU5fSEVMUF9MSVNULAorICAiY21kbGluZSBGSUxFIiwKKyAgIkF0dGVtcHQgdG8gbG9hZCBhIGZpbGUgdGhhdCBjb250YWlucyB0aGUgZGVmYXVsdCBrZXJuZWwgY29tbWFuZCBsaW5lLiIKK307CisKKwwKKy8qIGxvY2sgKi8KK3N0YXRpYyBpbnQKK2xvY2tfZnVuYyAoY2hhciAqYXJnLCBpbnQgZmxhZ3MpCit7CisgIGlmICghIGF1dGggJiYgcGFzc3dvcmQpCisgICAgeworICAgICAgZXJybnVtID0gRVJSX1BSSVZJTEVHRUQ7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX2xvY2sgPQoreworICAibG9jayIsCisgIGxvY2tfZnVuYywKKyAgQlVJTFRJTl9DTURMSU5FLAorICAibG9jayIsCisgICJCcmVhayBhIGNvbW1hbmQgZXhlY3V0aW9uIHVubGVzcyB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkLiIKK307CisgIAorDAorLyogbWFrZWFjdGl2ZSAqLworc3RhdGljIGludAorbWFrZWFjdGl2ZV9mdW5jIChjaGFyICphcmcsIGludCBmbGFncykKK3sKKyAgaWYgKCEgbWFrZV9zYXZlZF9hY3RpdmUgKCkpCisgICAgcmV0dXJuIDE7CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX21ha2VhY3RpdmUgPQoreworICAibWFrZWFjdGl2ZSIsCisgIG1ha2VhY3RpdmVfZnVuYywKKyAgQlVJTFRJTl9DTURMSU5FIHwgQlVJTFRJTl9IRUxQX0xJU1QsCisgICJtYWtlYWN0aXZlIiwKKyAgIlNldCB0aGUgYWN0aXZlIHBhcnRpdGlvbiBvbiB0aGUgcm9vdCBkaXNrIHRvIEdSVUIncyByb290IGRldmljZS4iCisgICIgVGhpcyBjb21tYW5kIGlzIGxpbWl0ZWQgdG8gX3ByaW1hcnlfIFBDIHBhcnRpdGlvbnMgb24gYSBoYXJkIGRpc2suIgorfTsKKworDAorLyogbWFwICovCisvKiBNYXAgRlJPTV9EUklWRSB0byBUT19EUklWRS4gICovCitzdGF0aWMgaW50CittYXBfZnVuYyAoY2hhciAqYXJnLCBpbnQgZmxhZ3MpCit7CisgIGNoYXIgKnRvX2RyaXZlOworICBjaGFyICpmcm9tX2RyaXZlOworICB1bnNpZ25lZCBsb25nIHRvLCBmcm9tOworICBpbnQgaTsKKyAgCisgIHRvX2RyaXZlID0gYXJnOworICBmcm9tX2RyaXZlID0gc2tpcF90byAoMCwgYXJnKTsKKworICAvKiBHZXQgdGhlIGRyaXZlIG51bWJlciBmb3IgVE9fRFJJVkUuICAqLworICBzZXRfZGV2aWNlICh0b19kcml2ZSk7CisgIGlmIChlcnJudW0pCisgICAgcmV0dXJuIDE7CisgIHRvID0gY3VycmVudF9kcml2ZTsKKworICAvKiBHZXQgdGhlIGRyaXZlIG51bWJlciBmb3IgRlJPTV9EUklWRS4gICovCisgIHNldF9kZXZpY2UgKGZyb21fZHJpdmUpOworICBpZiAoZXJybnVtKQorICAgIHJldHVybiAxOworICBmcm9tID0gY3VycmVudF9kcml2ZTsKKworICAvKiBTZWFyY2ggZm9yIGFuIGVtcHR5IHNsb3QgaW4gQklPU19EUklWRV9NQVAuICAqLworICBmb3IgKGkgPSAwOyBpIDwgRFJJVkVfTUFQX1NJWkU7IGkrKykKKyAgICB7CisgICAgICAvKiBQZXJoYXBzIHRoZSB1c2VyIHdhbnRzIHRvIG92ZXJyaWRlIHRoZSBtYXAuICAqLworICAgICAgaWYgKChiaW9zX2RyaXZlX21hcFtpXSAmIDB4ZmYpID09IGZyb20pCisJYnJlYWs7CisgICAgICAKKyAgICAgIGlmICghIGJpb3NfZHJpdmVfbWFwW2ldKQorCWJyZWFrOworICAgIH0KKworICBpZiAoaSA9PSBEUklWRV9NQVBfU0laRSkKKyAgICB7CisgICAgICBlcnJudW0gPSBFUlJfV09OVF9GSVQ7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgaWYgKHRvID09IGZyb20pCisgICAgLyogSWYgVE8gaXMgZXF1YWwgdG8gRlJPTSwgZGVsZXRlIHRoZSBlbnRyeS4gICovCisgICAgZ3J1Yl9tZW1tb3ZlICgoY2hhciAqKSAmYmlvc19kcml2ZV9tYXBbaV0sIChjaGFyICopICZiaW9zX2RyaXZlX21hcFtpICsgMV0sCisJCSAgc2l6ZW9mICh1bnNpZ25lZCBzaG9ydCkgKiAoRFJJVkVfTUFQX1NJWkUgLSBpKSk7CisgIGVsc2UKKyAgICBiaW9zX2RyaXZlX21hcFtpXSA9IGZyb20gfCAodG8gPDwgOCk7CisgIAorICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBidWlsdGluIGJ1aWx0aW5fbWFwID0KK3sKKyAgIm1hcCIsCisgIG1hcF9mdW5jLAorICBCVUlMVElOX0NNRExJTkUgfCBCVUlMVElOX0hFTFBfTElTVCwKKyAgIm1hcCBUT19EUklWRSBGUk9NX0RSSVZFIiwKKyAgIk1hcCB0aGUgZHJpdmUgRlJPTV9EUklWRSB0byB0aGUgZHJpdmUgVE9fRFJJVkUuIFRoaXMgaXMgbmVjZXNzYXJ5IgorICAiIHdoZW4geW91IGNoYWluLWxvYWQgc29tZSBvcGVyYXRpbmcgc3lzdGVtcywgc3VjaCBhcyBET1MsIGlmIHN1Y2ggYW4iCisgICIgT1MgcmVzaWRlcyBhdCBhIG5vbi1maXJzdCBkcml2ZS4iCit9OworCisMCisjaWZkZWYgVVNFX01ENV9QQVNTV09SRFMKKy8qIG1kNWNyeXB0ICovCitzdGF0aWMgaW50CittZDVjcnlwdF9mdW5jIChjaGFyICphcmcsIGludCBmbGFncykKK3sKKyAgY2hhciBjcnlwdGVkWzM2XTsKKyAgY2hhciBrZXlbMzJdOworICB1bnNpZ25lZCBpbnQgc2VlZDsKKyAgaW50IGk7CisgIGNvbnN0IGNoYXIgKmNvbnN0IHNlZWRjaGFycyA9CisgICAgIi4vMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUIgorICAgICJVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7CisgIAorICAvKiBGaXJzdCBjcmVhdGUgYSBzYWx0LiAgKi8KKworICAvKiBUaGUgbWFnaWNhbCBwcmVmaXguICAqLworICBncnViX21lbXNldCAoY3J5cHRlZCwgMCwgc2l6ZW9mIChjcnlwdGVkKSk7CisgIGdydWJfbWVtbW92ZSAoY3J5cHRlZCwgIiQxJCIsIDMpOworCisgIC8qIENyZWF0ZSB0aGUgbGVuZ3RoIG9mIGEgc2FsdC4gICovCisgIHNlZWQgPSBjdXJydGlja3MgKCk7CisKKyAgLyogR2VuZXJhdGUgYSBzYWx0LiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IDggJiYgc2VlZDsgaSsrKQorICAgIHsKKyAgICAgIC8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBtb3JlIHJhbmRvbS4gICovCisgICAgICBjcnlwdGVkWzMgKyBpXSA9IHNlZWRjaGFyc1tzZWVkICYgMHgzZl07CisgICAgICBzZWVkID4+PSA2OworICAgIH0KKworICAvKiBBIHNhbHQgbXVzdCBiZSB0ZXJtaW5hdGVkIHdpdGggYCQnLCBpZiBpdCBpcyBsZXNzIHRoYW4gOCBjaGFycy4gICovCisgIGNyeXB0ZWRbMyArIGldID0gJyQnOworCisjaWZkZWYgREVCVUdfTUQ1Q1JZUFQKKyAgZ3J1Yl9wcmludGYgKCJzYWx0ID0gJXNcbiIsIGNyeXB0ZWQpOworI2VuZGlmCisgIAorICAvKiBHZXQgYSBwYXNzd29yZC4gICovCisgIGdydWJfbWVtc2V0IChrZXksIDAsIHNpemVvZiAoa2V5KSk7CisgIGdldF9jbWRsaW5lICgiUGFzc3dvcmQ6ICIsIGtleSwgc2l6ZW9mIChrZXkpIC0gMSwgJyonLCAwKTsKKworICAvKiBDcnlwdCB0aGUga2V5LiAgKi8KKyAgbWFrZV9tZDVfcGFzc3dvcmQgKGtleSwgY3J5cHRlZCk7CisKKyAgZ3J1Yl9wcmludGYgKCJFbmNyeXB0ZWQ6ICVzXG4iLCBjcnlwdGVkKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX21kNWNyeXB0ID0KK3sKKyAgIm1kNWNyeXB0IiwKKyAgbWQ1Y3J5cHRfZnVuYywKKyAgQlVJTFRJTl9DTURMSU5FIHwgQlVJTFRJTl9IRUxQX0xJU1QsCisgICJtZDVjcnlwdCIsCisgICJHZW5lcmF0ZSBhIHBhc3N3b3JkIGluIE1ENSBmb3JtYXQuIgorfTsKKyNlbmRpZiAvKiBVU0VfTUQ1X1BBU1NXT1JEUyAqLworCisMCisvKiBtb2R1bGUgKi8KK3N0YXRpYyBpbnQKK21vZHVsZV9mdW5jIChjaGFyICphcmcsIGludCBmbGFncykKK3sKKyAgaW50IGxlbiA9IGdydWJfc3RybGVuIChhcmcpOworCisgIHN3aXRjaCAoa2VybmVsX3R5cGUpCisgICAgeworICAgIGNhc2UgS0VSTkVMX1RZUEVfTVVMVElCT09UOgorICAgICAgaWYgKG1iX2NtZGxpbmUgKyBsZW4gKyAxID4gKGNoYXIgKikgTUJfQ01ETElORV9CVUYgKyBNQl9DTURMSU5FX0JVRkxFTikKKwl7CisJICBlcnJudW0gPSBFUlJfV09OVF9GSVQ7CisJICByZXR1cm4gMTsKKwl9CisgICAgICBncnViX21lbW1vdmUgKG1iX2NtZGxpbmUsIGFyZywgbGVuICsgMSk7CisgICAgICBpZiAoISBsb2FkX21vZHVsZSAoYXJnLCBtYl9jbWRsaW5lKSkKKwlyZXR1cm4gMTsKKyAgICAgIG1iX2NtZGxpbmUgKz0gbGVuICsgMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBLRVJORUxfVFlQRV9MSU5VWDoKKyAgICBjYXNlIEtFUk5FTF9UWVBFX0JJR19MSU5VWDoKKyAgICAgIGlmICghIGxvYWRfaW5pdHJkIChhcmcpKQorCXJldHVybiAxOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgZXJybnVtID0gRVJSX05FRURfTUJfS0VSTkVMOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJ1aWx0aW4gYnVpbHRpbl9tb2R1bGUgPQoreworICAibW9kdWxlIiwKKyAgbW9kdWxlX2Z1bmMsCisgIEJVSUxUSU5fQ01ETElORSB8IEJVSUxUSU5fSEVMUF9MSVNULAorICAibW9kdWxlIEZJTEUgW0FSRyAuLi5dIiwKKyAgIkxvYWQgYSBib290IG1vZHVsZSBGSUxFIGZvciBhIE11bHRpYm9vdCBmb3JtYXQgYm9vdCBpbWFnZSAobm8iCisgICIgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGZpbGUgY29udGVudHMgaXMgbWFkZSwgc28gdXNlcnMgb2YgdGhpcyIKKyAgIiBjb21tYW5kIG11c3Qga25vdyB3aGF0IHRoZSBrZXJuZWwgaW4gcXVlc3Rpb24gZXhwZWN0cykuIFRoZSIKKyAgIiByZXN0IG9mIHRoZSBsaW5lIGlzIHBhc3NlZCBhcyB0aGUgXCJtb2R1bGUgY29tbWFuZCBsaW5lXCIsIGxpa2UiCisgICIgdGhlIGBrZXJuZWwnIGNvbW1hbmQuIgorfTsKKworDAorLyogbW9kdWxlbm91bnppcCAqLworc3RhdGljIGludAorbW9kdWxlbm91bnppcF9mdW5jIChjaGFyICphcmcsIGludCBmbGFncykKK3sKKyAgaW50IHJldDsKKworI2lmbmRlZiBOT19ERUNPTVBSRVNTSU9OCisgIG5vX2RlY29tcHJlc3Npb24gPSAxOworI2VuZGlmCisKKyAgcmV0ID0gbW9kdWxlX2Z1bmMgKGFyZywgZmxhZ3MpOworCisjaWZuZGVmIE5PX0RFQ09NUFJFU1NJT04KKyAgbm9fZGVjb21wcmVzc2lvbiA9IDA7CisjZW5kaWYKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGJ1aWx0aW4gYnVpbHRpbl9tb2R1bGVub3VuemlwID0KK3sKKyAgIm1vZHVsZW5vdW56aXAiLAorICBtb2R1bGVub3VuemlwX2Z1bmMsCisgIEJVSUxUSU5fQ01ETElORSB8IEJVSUxUSU5fSEVMUF9MSVNULAorICAibW9kdWxlbm91bnppcCBGSUxFIFtBUkcgLi4uXSIsCisgICJUaGUgc2FtZSBhcyBgbW9kdWxlJywgZXhjZXB0IHRoYXQgYXV0b21hdGljIGRlY29tcHJlc3Npb24gaXMiCisgICIgZGlzYWJsZWQuIgorfTsKKworDAorLyogcGFnZXIgW29ufG9mZl0gKi8KK3N0YXRpYyBpbnQKK3BhZ2VyX2Z1bmMgKGNoYXIgKmFyZywgaW50IGZsYWdzKQoreworICAvKiBJZiBBUkcgaXMgZW1wdHksIHRvZ2dsZSB0aGUgZmxhZy4gICovCisgIGlmICghICphcmcpCisgICAgdXNlX3BhZ2VyID0gISB1c2VfcGFnZXI7CisgIGVsc2UgaWYgKGdydWJfbWVtY21wIChhcmcsICJvbiIsIDIpID09IDApCisgICAgdXNlX3BhZ2VyID0gMTsKKyAgZWxzZSBpZiAoZ3J1Yl9tZW1jbXAgKGFyZywgIm9mZiIsIDMpID09IDApCisgICAgdXNlX3BhZ2VyID0gMDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGVycm51bSA9IEVSUl9CQURfQVJHVU1FTlQ7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgZ3J1Yl9wcmludGYgKCIgSW50ZXJuYWwgcGFnZXIgaXMgbm93ICVzXG4iLCB1c2VfcGFnZXIgPyAib24iIDogIm9mZiIpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBidWlsdGluIGJ1aWx0aW5fcGFnZXIgPQoreworICAicGFnZXIiLAorICBwYWdlcl9mdW5jLAorICBCVUlMVElOX0NNRExJTkUgfCBCVUlMVElOX01FTlUgfCBCVUlMVElOX0hFTFBfTElTVCwKKyAgInBhZ2VyIFtGTEFHXSIsCisgICJUb2dnbGUgcGFnZXIgbW9kZSB3aXRoIG5vIGFyZ3VtZW50LiBJZiBGTEFHIGlzIGdpdmVuIGFuZCBpdHMgdmFsdWUiCisgICIgaXMgYG9uJywgdHVybiBvbiB0aGUgbW9kZS4gSWYgRkxBRyBpcyBgb2ZmJywgdHVybiBvZmYgdGhlIG1vZGUuIgorfTsKKworDAorLyogcGFydG5ldyBQQVJUIFRZUEUgU1RBUlQgTEVOICovCitzdGF0aWMgaW50CitwYXJ0bmV3X2Z1bmMgKGNoYXIgKmFyZywgaW50IGZsYWdzKQoreworICBpbnQgbmV3X3R5cGUsIG5ld19zdGFydCwgbmV3X2xlbjsKKyAgaW50IHN0YXJ0X2NsLCBzdGFydF9jaCwgc3RhcnRfZGg7CisgIGludCBlbmRfY2wsIGVuZF9jaCwgZW5kX2RoOworICBpbnQgZW50cnk7CisgIGNoYXIgbWJyWzUxMl07CisKKyAgLyogQ29udmVydCBhIExCQSBhZGRyZXNzIHRvIGEgQ0hTIGFkZHJlc3MgaW4gdGhlIElOVCAxMyBmb3JtYXQuICAqLworICBhdXRvIHZvaWQgbGJhX3RvX2NocyAoaW50IGxiYSwgaW50ICpjbCwgaW50ICpjaCwgaW50ICpkaCk7CisgIHZvaWQgbGJhX3RvX2NocyAoaW50IGxiYSwgaW50ICpjbCwgaW50ICpjaCwgaW50ICpkaCkKKyAgICB7CisgICAgICBpbnQgY3lsaW5kZXIsIGhlYWQsIHNlY3RvcjsKKworICAgICAgc2VjdG9yID0gbGJhICUgYnVmX2dlb20uc2VjdG9ycyArIDE7CisgICAgICBoZWFkID0gKGxiYSAvIGJ1Zl9nZW9tLnNlY3RvcnMpICUgYnVmX2dlb20uaGVhZHM7CisgICAgICBjeWxpbmRlciA9IGxiYSAvIChidWZfZ2VvbS5zZWN0b3JzICogYnVmX2dlb20uaGVhZHMpOworCisgICAgICBpZiAoY3lsaW5kZXIgPj0gYnVmX2dlb20uY3lsaW5kZXJzKQorCWN5bGluZGVyID0gYnVmX2dlb20uY3lsaW5kZXJzIC0gMTsKKyAgICAgIAorICAgICAgKmNsID0gc2VjdG9yIHwgKChjeWxpbmRlciAmIDB4MzAwKSA+PiAyKTsKKyAgICAgICpjaCA9IGN5bGluZGVyICYgMHhGRjsKKyAgICAgICpkaCA9IGhlYWQ7CisgICAgfQorICAgICAgCisgIC8qIEdldCB0aGUgZHJpdmUgYW5kIHRoZSBwYXJ0aXRpb24uICAqLworICBpZiAoISBzZXRfZGV2aWNlIChhcmcpKQorICAgIHJldHVybiAxOworCisgIC8qIFRoZSBkcml2ZSBtdXN0IGJlIGEgaGFyZCBkaXNrLiAgKi8KKyAgaWYgKCEgKGN1cnJlbnRfZHJpdmUgJiAweDgwKSkKKyAgICB7CisgICAgICBlcnJudW0gPSBFUlJfQkFEX0FSR1VNRU5UOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIC8qIFRoZSBwYXJ0aXRpb24gbXVzdCBhIHByaW1hcnkgcGFydGl0aW9uLiAgKi8KKyAgaWYgKChjdXJyZW50X3BhcnRpdGlvbiA+PiAxNikgPiAzCisgICAgICB8fCAoY3VycmVudF9wYXJ0aXRpb24gJiAweEZGRkYpICE9IDB4RkZGRikKKyAgICB7CisgICAgICBlcnJudW0gPSBFUlJfQkFEX0FSR1VNRU5UOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIGVudHJ5ID0gY3VycmVudF9wYXJ0aXRpb24gPj4gMTY7CisgIAorICAvKiBHZXQgdGhlIG5ldyBwYXJ0aXRpb24gdHlwZS4gICovCisgIGFyZyA9IHNraXBfdG8gKDAsIGFyZyk7CisgIGlmICghIHNhZmVfcGFyc2VfbWF4aW50ICgmYXJnLCAmbmV3X3R5cGUpKQorICAgIHJldHVybiAxOworCisgIC8qIFRoZSBwYXJ0aXRpb24gdHlwZSBpcyB1bnNpZ25lZCBjaGFyLiAgKi8KKyAgaWYgKG5ld190eXBlID4gMHhGRikKKyAgICB7CisgICAgICBlcnJudW0gPSBFUlJfQkFEX0FSR1VNRU5UOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIC8qIEdldCB0aGUgbmV3IHBhcnRpdGlvbiBzdGFydC4gICovCisgIGFyZyA9IHNraXBfdG8gKDAsIGFyZyk7CisgIGlmICghIHNhZmVfcGFyc2VfbWF4aW50ICgmYXJnLCAmbmV3X3N0YXJ0KSkKKyAgICByZXR1cm4gMTsKKyAgCisgIC8qIEdldCB0aGUgbmV3IHBhcnRpdGlvbiBsZW5ndGguICAqLworICBhcmcgPSBza2lwX3RvICgwLCBhcmcpOworICBpZiAoISBzYWZlX3BhcnNlX21heGludCAoJmFyZywgJm5ld19sZW4pKQorICAgIHJldHVybiAxOworCisgIC8qIFJlYWQgdGhlIE1CUi4gICovCisgIGlmICghIHJhd3JlYWQgKGN1cnJlbnRfZHJpdmUsIDAsIDAsIFNFQ1RPUl9TSVpFLCBtYnIpKQorICAgIHJldHVybiAxOworCisgIC8qIENoZWNrIGlmIHRoZSBuZXcgcGFydGl0aW9uIHdpbGwgZml0IGluIHRoZSBkaXNrLiAgKi8KKyAgaWYgKG5ld19zdGFydCArIG5ld19sZW4gPiBidWZfZ2VvbS50b3RhbF9zZWN0b3JzKQorICAgIHsKKyAgICAgIGVycm51bSA9IEVSUl9HRU9NOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIC8qIFN0b3JlIHRoZSBwYXJ0aXRpb24gaW5mb3JtYXRpb24gaW4gdGhlIE1CUi4gICovCisgIGxiYV90b19jaHMgKG5ld19zdGFydCwgJnN0YXJ0X2NsLCAmc3RhcnRfY2gsICZzdGFydF9kaCk7CisgIGxiYV90b19jaHMgKG5ld19zdGFydCArIG5ld19sZW4gLSAxLCAmZW5kX2NsLCAmZW5kX2NoLCAmZW5kX2RoKTsKKworICBQQ19TTElDRV9GTEFHIChtYnIsIGVudHJ5KSA9IDA7CisgIFBDX1NMSUNFX0hFQUQgKG1iciwgZW50cnkpID0gc3RhcnRfZGg7CisgIFBDX1NMSUNFX1NFQyAobWJyLCBlbnRyeSkgPSBzdGFydF9jbDsKKyAgUENfU0xJQ0VfQ1lMIChtYnIsIGVudHJ5KSA9IHN0YXJ0X2NoOworICBQQ19TTElDRV9UWVBFIChtYnIsIGVudHJ5KSA9IG5ld190eXBlOworICBQQ19TTElDRV9FSEVBRCAobWJyLCBlbnRyeSkgPSBlbmRfZGg7CisgIFBDX1NMSUNFX0VTRUMgKG1iciwgZW50cnkpID0gZW5kX2NsOworICBQQ19TTElDRV9FQ1lMIChtYnIsIGVudHJ5KSA9IGVuZF9jaDsKKyAgUENfU0xJQ0VfU1RBUlQgKG1iciwgZW50cnkpID0gbmV3X3N0YXJ0OworICBQQ19TTElDRV9MRU5HVEggKG1iciwgZW50cnkpID0gbmV3X2xlbjsKKworICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgTUJSIGhhcyBhIHZhbGlkIHNpZ25hdHVyZS4gICovCisgIFBDX01CUl9TSUcgKG1icikgPSBQQ19NQlJfU0lHTkFUVVJFOworICAKKyAgLyogV3JpdGUgYmFjayB0aGUgTUJSIHRvIHRoZSBkaXNrLiAgKi8KKyAgYnVmX3RyYWNrID0gLTE7CisgIGlmICghIHJhd3dyaXRlIChjdXJyZW50X2RyaXZlLCAwLCBtYnIpKQorICAgIHJldHVybiAxOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJ1aWx0aW4gYnVpbHRpbl9wYXJ0bmV3ID0KK3sKKyAgInBhcnRuZXciLAorICBwYXJ0bmV3X2Z1bmMsCisgIEJVSUxUSU5fQ01ETElORSB8IEJVSUxUSU5fTUVOVSB8IEJVSUxUSU5fSEVMUF9MSVNULAorICAicGFydG5ldyBQQVJUIFRZUEUgU1RBUlQgTEVOIiwKKyAgIkNyZWF0ZSBhIHByaW1hcnkgcGFydGl0aW9uIGF0IHRoZSBzdGFydGluZyBhZGRyZXNzIFNUQVJUIHdpdGggdGhlIgorICAiIGxlbmd0aCBMRU4sIHdpdGggdGhlIHR5cGUgVFlQRS4gU1RBUlQgYW5kIExFTiBhcmUgaW4gc2VjdG9yIHVuaXRzLiIKK307CisKKwwKKy8qIHBhcnR0eXBlIFBBUlQgVFlQRSAqLworc3RhdGljIGludAorcGFydHR5cGVfZnVuYyAoY2hhciAqYXJnLCBpbnQgZmxhZ3MpCit7CisgIGludCBuZXdfdHlwZTsKKyAgdW5zaWduZWQgbG9uZyBwYXJ0ID0gMHhGRkZGRkY7CisgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIGxlbiwgb2Zmc2V0LCBleHRfb2Zmc2V0OworICBpbnQgZW50cnksIHR5cGU7CisgIGNoYXIgbWJyWzUxMl07CisKKyAgLyogR2V0IHRoZSBkcml2ZSBhbmQgdGhlIHBhcnRpdGlvbi4gICovCisgIGlmICghIHNldF9kZXZpY2UgKGFyZykpCisgICAgcmV0dXJuIDE7CisKKyAgLyogVGhlIGRyaXZlIG11c3QgYmUgYSBoYXJkIGRpc2suICAqLworICBpZiAoISAoY3VycmVudF9kcml2ZSAmIDB4ODApKQorICAgIHsKKyAgICAgIGVycm51bSA9IEVSUl9CQURfQVJHVU1FTlQ7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIAorICAvKiBUaGUgcGFydGl0aW9uIG11c3QgYmUgYSBQQyBzbGljZS4gICovCisgIGlmICgoY3VycmVudF9wYXJ0aXRpb24gPj4gMTYpID09IDB4RkYKKyAgICAgIHx8IChjdXJyZW50X3BhcnRpdGlvbiAmIDB4RkZGRikgIT0gMHhGRkZGKQorICAgIHsKKyAgICAgIGVycm51bSA9IEVSUl9CQURfQVJHVU1FTlQ7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgLyogR2V0IHRoZSBuZXcgcGFydGl0aW9uIHR5cGUuICAqLworICBhcmcgPSBza2lwX3RvICgwLCBhcmcpOworICBpZiAoISBzYWZlX3BhcnNlX21heGludCAoJmFyZywgJm5ld190eXBlKSkKKyAgICByZXR1cm4gMTsKKworICAvKiBUaGUgcGFydGl0aW9uIHR5cGUgaXMgdW5zaWduZWQgY2hhci4gICovCisgIGlmIChuZXdfdHlwZSA+IDB4RkYpCisgICAgeworICAgICAgZXJybnVtID0gRVJSX0JBRF9BUkdVTUVOVDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBMb29rIGZvciB0aGUgcGFydGl0aW9uLiAgKi8KKyAgd2hpbGUgKG5leHRfcGFydGl0aW9uIChjdXJyZW50X2RyaXZlLCAweEZGRkZGRiwgJnBhcnQsICZ0eXBlLAorCQkJICZzdGFydCwgJmxlbiwgJm9mZnNldCwgJmVudHJ5LAorCQkJICZleHRfb2Zmc2V0LCBtYnIpKQorICAgIHsKKyAgICAgIGlmIChwYXJ0ID09IGN1cnJlbnRfcGFydGl0aW9uKQorCXsKKwkgIC8qIEZvdW5kLiAgKi8KKworCSAgLyogU2V0IHRoZSB0eXBlIHRvIE5FV19UWVBFLiAgKi8KKwkgIFBDX1NMSUNFX1RZUEUgKG1iciwgZW50cnkpID0gbmV3X3R5cGU7CisJICAKKwkgIC8qIFdyaXRlIGJhY2sgdGhlIE1CUiB0byB0aGUgZGlzay4gICovCisJICBidWZfdHJhY2sgPSAtMTsKKwkgIGlmICghIHJhd3dyaXRlIChjdXJyZW50X2RyaXZlLCBvZmZzZXQsIG1icikpCisJICAgIHJldHVybiAxOworCisJICAvKiBTdWNjZWVkLiAgKi8KKwkgIHJldHVybiAwOworCX0KKyAgICB9CisKKyAgLyogVGhlIHBhcnRpdGlvbiB3YXMgbm90IGZvdW5kLiAgRVJSTlVNIHdhcyBzZXQgYnkgbmV4dF9wYXJ0aXRpb24uICAqLworICByZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBidWlsdGluIGJ1aWx0aW5fcGFydHR5cGUgPQoreworICAicGFydHR5cGUiLAorICBwYXJ0dHlwZV9mdW5jLAorICBCVUlMVElOX0NNRExJTkUgfCBCVUlMVElOX01FTlUgfCBCVUlMVElOX0hFTFBfTElTVCwKKyAgInBhcnR0eXBlIFBBUlQgVFlQRSIsCisgICJDaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIHBhcnRpdGlvbiBQQVJUIHRvIFRZUEUuIgorfTsKKworDAorLyogcGFzc3dvcmQgKi8KK3N0YXRpYyBpbnQKK3Bhc3N3b3JkX2Z1bmMgKGNoYXIgKmFyZywgaW50IGZsYWdzKQoreworICBpbnQgbGVuOworICBwYXNzd29yZF90IHR5cGUgPSBQQVNTV09SRF9QTEFJTjsKKworI2lmZGVmIFVTRV9NRDVfUEFTU1dPUkRTCisgIGlmIChncnViX21lbWNtcCAoYXJnLCAiLS1tZDUiLCA1KSA9PSAwKQorICAgIHsKKyAgICAgIHR5cGUgPSBQQVNTV09SRF9NRDU7CisgICAgICBhcmcgPSBza2lwX3RvICgwLCBhcmcpOworICAgIH0KKyNlbmRpZgorICBpZiAoZ3J1Yl9tZW1jbXAgKGFyZywgIi0tIiwgMikgPT0gMCkKKyAgICB7CisgICAgICB0eXBlID0gUEFTU1dPUkRfVU5TVVBQT1JURUQ7CisgICAgICBhcmcgPSBza2lwX3RvICgwLCBhcmcpOworICAgIH0KKworICBpZiAoKGZsYWdzICYgKEJVSUxUSU5fQ01ETElORSB8IEJVSUxUSU5fU0NSSVBUKSkgIT0gMCkKKyAgICB7CisgICAgICAvKiBEbyBwYXNzd29yZCBjaGVjayEgKi8KKyAgICAgIGNoYXIgZW50ZXJlZFszMl07CisgICAgICAKKyAgICAgIC8qIFdpcGUgb3V0IGFueSBwcmV2aW91c2x5IGVudGVyZWQgcGFzc3dvcmQgKi8KKyAgICAgIGVudGVyZWRbMF0gPSAwOworICAgICAgZ2V0X2NtZGxpbmUgKCJQYXNzd29yZDogIiwgZW50ZXJlZCwgMzEsICcqJywgMCk7CisKKyAgICAgIG51bF90ZXJtaW5hdGUgKGFyZyk7CisgICAgICBpZiAoY2hlY2tfcGFzc3dvcmQgKGVudGVyZWQsIGFyZywgdHlwZSkgIT0gMCkKKwl7CisJICBlcnJudW0gPSBFUlJfUFJJVklMRUdFRDsKKwkgIHJldHVybiAxOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBsZW4gPSBncnViX3N0cmxlbiAoYXJnKTsKKyAgICAgIAorICAgICAgLyogUEFTU1dPUkQgTlVMIE5VTCAuLi4gKi8KKyAgICAgIGlmIChsZW4gKyAyID4gUEFTU1dPUkRfQlVGTEVOKQorCXsKKwkgIGVycm51bSA9IEVSUl9XT05UX0ZJVDsKKwkgIHJldHVybiAxOworCX0KKyAgICAgIAorICAgICAgLyogQ29weSB0aGUgcGFzc3dvcmQgYW5kIGNsZWFyIHRoZSByZXN0IG9mIHRoZSBidWZmZXIuICAqLworICAgICAgcGFzc3dvcmQgPSAoY2hhciAqKSBQQVNTV09SRF9CVUY7CisgICAgICBncnViX21lbW1vdmUgKHBhc3N3b3JkLCBhcmcsIGxlbik7CisgICAgICBncnViX21lbXNldCAocGFzc3dvcmQgKyBsZW4sIDAsIFBBU1NXT1JEX0JVRkxFTiAtIGxlbik7CisgICAgICBwYXNzd29yZF90eXBlID0gdHlwZTsKKyAgICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJ1aWx0aW4gYnVpbHRpbl9wYXNzd29yZCA9Cit7CisgICJwYXNzd29yZCIsCisgIHBhc3N3b3JkX2Z1bmMsCisgIEJVSUxUSU5fTUVOVSB8IEJVSUxUSU5fQ01ETElORSB8IEJVSUxUSU5fTk9fRUNITywKKyAgInBhc3N3b3JkIFstLW1kNV0gUEFTU1dEIFtGSUxFXSIsCisgICJJZiB1c2VkIGluIHRoZSBmaXJzdCBzZWN0aW9uIG9mIGEgbWVudSBmaWxlLCBkaXNhYmxlIGFsbCIKKyAgIiBpbnRlcmFjdGl2ZSBlZGl0aW5nIGNvbnRyb2wgKG1lbnUgZW50cnkgZWRpdG9yIGFuZCIKKyAgIiBjb21tYW5kIGxpbmUpLiBJZiB0aGUgcGFzc3dvcmQgUEFTU1dEIGlzIGVudGVyZWQsIGl0IGxvYWRzIHRoZSIKKyAgIiBGSUxFIGFzIGEgbmV3IGNvbmZpZyBmaWxlIGFuZCByZXN0YXJ0cyB0aGUgR1JVQiBTdGFnZSAyLiBJZiB5b3UiCisgICIgb21pdCB0aGUgYXJndW1lbnQgRklMRSwgdGhlbiBHUlVCIGp1c3QgdW5sb2NrcyBwcml2aWxlZ2VkIgorICAiIGluc3RydWN0aW9ucy4gIFlvdSBjYW4gYWxzbyB1c2UgaXQgaW4gdGhlIHNjcmlwdCBzZWN0aW9uLCBpbiIKKyAgIiB3aGljaCBjYXNlIGl0IHdpbGwgYXNrIGZvciB0aGUgcGFzc3dvcmQsIGJlZm9yZSBjb250aW51ZWluZy4iCisgICIgVGhlIG9wdGlvbiAtLW1kNSB0ZWxscyBHUlVCIHRoYXQgUEFTU1dEIGlzIGVuY3J5cHRlZCB3aXRoIgorICAiIG1kNWNyeXB0LiIKK307CisKKwwKKy8qIHBhdXNlICovCitzdGF0aWMgaW50CitwYXVzZV9mdW5jIChjaGFyICphcmcsIGludCBmbGFncykKK3sKKyAgcHJpbnRmKCIlc1xuIiwgYXJnKTsKKworICAvKiBJZiBFU0MgaXMgcmV0dXJuZWQsIHRoZW4gYWJvcnQgdGhpcyBlbnRyeS4gICovCisgIGlmIChBU0NJSV9DSEFSIChnZXRrZXkgKCkpID09IDI3KQorICAgIHJldHVybiAxOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJ1aWx0aW4gYnVpbHRpbl9wYXVzZSA9Cit7CisgICJwYXVzZSIsCisgIHBhdXNlX2Z1bmMsCisgIEJVSUxUSU5fQ01ETElORSB8IEJVSUxUSU5fTk9fRUNITywKKyAgInBhdXNlIFtNRVNTQUdFIC4uLl0iLAorICAiUHJpbnQgTUVTU0FHRSwgdGhlbiB3YWl0IHVudGlsIGEga2V5IGlzIHByZXNzZWQuIgorfTsKKworDAorI2lmZGVmIEdSVUJfVVRJTAorLyogcXVpdCAqLworc3RhdGljIGludAorcXVpdF9mdW5jIChjaGFyICphcmcsIGludCBmbGFncykKK3sKKyAgc3RvcCAoKTsKKyAgCisgIC8qIE5ldmVyIHJlYWNoIGhlcmUuICAqLworICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBidWlsdGluIGJ1aWx0aW5fcXVpdCA9Cit7CisgICJxdWl0IiwKKyAgcXVpdF9mdW5jLAorICBCVUlMVElOX0NNRExJTkUgfCBCVUlMVElOX0hFTFBfTElTVCwKKyAgInF1aXQiLAorICAiRXhpdCBmcm9tIHRoZSBHUlVCIHNoZWxsLiIKK307CisjZW5kaWYgLyogR1JVQl9VVElMICovCisKKwwKKyNpZmRlZiBTVVBQT1JUX05FVEJPT1QKKy8qIHJhcnAgKi8KK3N0YXRpYyBpbnQKK3JhcnBfZnVuYyAoY2hhciAqYXJnLCBpbnQgZmxhZ3MpCit7CisgIGlmICghIHJhcnAgKCkpCisgICAgeworICAgICAgaWYgKGVycm51bSA9PSBFUlJfTk9ORSkKKwllcnJudW0gPSBFUlJfREVWX1ZBTFVFUzsKKworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIC8qIE5vdGlmeSB0aGUgY29uZmlndXJhdGlvbi4gICovCisgIHByaW50X25ldHdvcmtfY29uZmlndXJhdGlvbiAoKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX3JhcnAgPQoreworICAicmFycCIsCisgIHJhcnBfZnVuYywKKyAgQlVJTFRJTl9DTURMSU5FIHwgQlVJTFRJTl9NRU5VIHwgQlVJTFRJTl9IRUxQX0xJU1QsCisgICJyYXJwIiwKKyAgIkluaXRpYWxpemUgYSBuZXR3b3JrIGRldmljZSB2aWEgUkFSUC4iCit9OworI2VuZGlmIC8qIFNVUFBPUlRfTkVUQk9PVCAqLworCisMCitzdGF0aWMgaW50CityZWFkX2Z1bmMgKGNoYXIgKmFyZywgaW50IGZsYWdzKQoreworICBpbnQgYWRkcjsKKworICBpZiAoISBzYWZlX3BhcnNlX21heGludCAoJmFyZywgJmFkZHIpKQorICAgIHJldHVybiAxOworCisgIGdydWJfcHJpbnRmICgiQWRkcmVzcyAweCV4OiBWYWx1ZSAweCV4XG4iLAorCSAgICAgICBhZGRyLCAqKCh1bnNpZ25lZCAqKSBSQVdfQUREUiAoYWRkcikpKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX3JlYWQgPQoreworICAicmVhZCIsCisgIHJlYWRfZnVuYywKKyAgQlVJTFRJTl9DTURMSU5FLAorICAicmVhZCBBRERSIiwKKyAgIlJlYWQgYSAzMi1iaXQgdmFsdWUgZnJvbSBtZW1vcnkgYXQgYWRkcmVzcyBBRERSIGFuZCIKKyAgIiBkaXNwbGF5IGl0IGluIGhleCBmb3JtYXQuIgorfTsKKworDAorLyogcmVib290ICovCitzdGF0aWMgaW50CityZWJvb3RfZnVuYyAoY2hhciAqYXJnLCBpbnQgZmxhZ3MpCit7CisgIGdydWJfcmVib290ICgpOworCisgIC8qIE5ldmVyIHJlYWNoIGhlcmUuICAqLworICByZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBidWlsdGluIGJ1aWx0aW5fcmVib290ID0KK3sKKyAgInJlYm9vdCIsCisgIHJlYm9vdF9mdW5jLAorICBCVUlMVElOX0NNRExJTkUgfCBCVUlMVElOX0hFTFBfTElTVCwKKyAgInJlYm9vdCIsCisgICJSZWJvb3QgeW91ciBzeXN0ZW0uIgorfTsKKworDAorLyogUHJpbnQgdGhlIHJvb3QgZGV2aWNlIGluZm9ybWF0aW9uLiAgKi8KK3N0YXRpYyB2b2lkCitwcmludF9yb290X2RldmljZSAodm9pZCkKK3sKKyAgaWYgKHNhdmVkX2RyaXZlID09IE5FVFdPUktfRFJJVkUpCisgICAgeworICAgICAgLyogTmV0d29yayBkcml2ZS4gICovCisgICAgICBncnViX3ByaW50ZiAoIiAobmQpOiIpOworICAgIH0KKyAgZWxzZSBpZiAoc2F2ZWRfZHJpdmUgJiAweDgwKQorICAgIHsKKyAgICAgIC8qIEhhcmQgZGlzayBkcml2ZS4gICovCisgICAgICBncnViX3ByaW50ZiAoIiAoaGQlZCIsIHNhdmVkX2RyaXZlIC0gMHg4MCk7CisgICAgICAKKyAgICAgIGlmICgoc2F2ZWRfcGFydGl0aW9uICYgMHhGRjAwMDApICE9IDB4RkYwMDAwKQorCWdydWJfcHJpbnRmICgiLCVkIiwgc2F2ZWRfcGFydGl0aW9uID4+IDE2KTsKKworICAgICAgaWYgKChzYXZlZF9wYXJ0aXRpb24gJiAweDAwRkYwMCkgIT0gMHgwMEZGMDApCisJZ3J1Yl9wcmludGYgKCIsJWMiLCAoKHNhdmVkX3BhcnRpdGlvbiA+PiA4KSAmIDB4RkYpICsgJ2EnKTsKKworICAgICAgZ3J1Yl9wcmludGYgKCIpOiIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEZsb3BweSBkaXNrIGRyaXZlLiAgKi8KKyAgICAgIGdydWJfcHJpbnRmICgiIChmZCVkKToiLCBzYXZlZF9kcml2ZSk7CisgICAgfQorCisgIC8qIFByaW50IHRoZSBmaWxlc3lzdGVtIGluZm9ybWF0aW9uLiAgKi8KKyAgY3VycmVudF9wYXJ0aXRpb24gPSBzYXZlZF9wYXJ0aXRpb247CisgIGN1cnJlbnRfZHJpdmUgPSBzYXZlZF9kcml2ZTsKKyAgcHJpbnRfZnN5c190eXBlICgpOworfQorCitzdGF0aWMgaW50CityZWFsX3Jvb3RfZnVuYyAoY2hhciAqYXJnLCBpbnQgYXR0ZW1wdF9tb3VudCkKK3sKKyAgaW50IGhkYmlhcyA9IDA7CisgIGNoYXIgKmJpYXNwdHI7CisgIGNoYXIgKm5leHQ7CisKKyAgLyogSWYgQVJHIGlzIGVtcHR5LCBqdXN0IHByaW50IHRoZSBjdXJyZW50IHJvb3QgZGV2aWNlLiAgKi8KKyAgaWYgKCEgKmFyZykKKyAgICB7CisgICAgICBwcmludF9yb290X2RldmljZSAoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgCisgIC8qIENhbGwgc2V0X2RldmljZSB0byBnZXQgdGhlIGRyaXZlIGFuZCB0aGUgcGFydGl0aW9uIGluIEFSRy4gICovCisgIG5leHQgPSBzZXRfZGV2aWNlIChhcmcpOworICBpZiAoISBuZXh0KQorICAgIHJldHVybiAxOworCisgIC8qIElnbm9yZSBFUlJfRlNZU19NT1VOVC4gICovCisgIGlmIChhdHRlbXB0X21vdW50KQorICAgIHsKKyAgICAgIGlmICghIG9wZW5fZGV2aWNlICgpICYmIGVycm51bSAhPSBFUlJfRlNZU19NT1VOVCkKKwlyZXR1cm4gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBUaGlzIGlzIG5lY2Vzc2FyeSwgYmVjYXVzZSB0aGUgbG9jYXRpb24gb2YgYSBwYXJ0aXRpb24gdGFibGUKKwkgbXVzdCBiZSBzZXQgYXBwcm9wcmlhdGVseS4gICovCisgICAgICBpZiAob3Blbl9wYXJ0aXRpb24gKCkpCisJeworCSAgc2V0X2Jvb3RkZXYgKDApOworCSAgaWYgKGVycm51bSkKKwkgICAgcmV0dXJuIDE7CisJfQorICAgIH0KKyAgCisgIC8qIENsZWFyIEVSUk5VTS4gICovCisgIGVycm51bSA9IDA7CisgIHNhdmVkX3BhcnRpdGlvbiA9IGN1cnJlbnRfcGFydGl0aW9uOworICBzYXZlZF9kcml2ZSA9IGN1cnJlbnRfZHJpdmU7CisKKyAgaWYgKGF0dGVtcHRfbW91bnQpCisgICAgeworICAgICAgLyogQlNEIGFuZCBjaGFpbmxvYWRpbmcgZXZpbCBoYWNrcyAhISAgKi8KKyAgICAgIGJpYXNwdHIgPSBza2lwX3RvICgwLCBuZXh0KTsKKyAgICAgIHNhZmVfcGFyc2VfbWF4aW50ICgmYmlhc3B0ciwgJmhkYmlhcyk7CisgICAgICBlcnJudW0gPSAwOworICAgICAgYm9vdGRldiA9IHNldF9ib290ZGV2IChoZGJpYXMpOworICAgICAgaWYgKGVycm51bSkKKwlyZXR1cm4gMTsKKyAgICAgIAorICAgICAgLyogUHJpbnQgdGhlIHR5cGUgb2YgdGhlIGZpbGVzeXN0ZW0uICAqLworICAgICAgcHJpbnRfZnN5c190eXBlICgpOworICAgIH0KKyAgCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50Cityb290X2Z1bmMgKGNoYXIgKmFyZywgaW50IGZsYWdzKQoreworICByZXR1cm4gcmVhbF9yb290X2Z1bmMgKGFyZywgMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX3Jvb3QgPQoreworICAicm9vdCIsCisgIHJvb3RfZnVuYywKKyAgQlVJTFRJTl9DTURMSU5FIHwgQlVJTFRJTl9IRUxQX0xJU1QsCisgICJyb290IFtERVZJQ0UgW0hEQklBU11dIiwKKyAgIlNldCB0aGUgY3VycmVudCBcInJvb3QgZGV2aWNlXCIgdG8gdGhlIGRldmljZSBERVZJQ0UsIHRoZW4iCisgICIgYXR0ZW1wdCB0byBtb3VudCBpdCB0byBnZXQgdGhlIHBhcnRpdGlvbiBzaXplIChmb3IgcGFzc2luZyB0aGUiCisgICIgcGFydGl0aW9uIGRlc2NyaXB0b3IgaW4gYEVTOkVTSScsIHVzZWQgYnkgc29tZSBjaGFpbi1sb2FkZWQiCisgICIgYm9vdGxvYWRlcnMpLCB0aGUgQlNEIGRyaXZlLXR5cGUgKGZvciBib290aW5nIEJTRCBrZXJuZWxzIHVzaW5nIgorICAiIHRoZWlyIG5hdGl2ZSBib290IGZvcm1hdCksIGFuZCBjb3JyZWN0bHkgZGV0ZXJtaW5lICIKKyAgIiB0aGUgUEMgcGFydGl0aW9uIHdoZXJlIGEgQlNEIHN1Yi1wYXJ0aXRpb24gaXMgbG9jYXRlZC4gVGhlIgorICAiIG9wdGlvbmFsIEhEQklBUyBwYXJhbWV0ZXIgaXMgYSBudW1iZXIgdG8gdGVsbCBhIEJTRCBrZXJuZWwiCisgICIgaG93IG1hbnkgQklPUyBkcml2ZSBudW1iZXJzIGFyZSBvbiBjb250cm9sbGVycyBiZWZvcmUgdGhlIGN1cnJlbnQiCisgICIgb25lLiBGb3IgZXhhbXBsZSwgaWYgdGhlcmUgaXMgYW4gSURFIGRpc2sgYW5kIGEgU0NTSSBkaXNrLCBhbmQgeW91ciIKKyAgIiBGcmVlQlNEIHJvb3QgcGFydGl0aW9uIGlzIG9uIHRoZSBTQ1NJIGRpc2ssIHRoZW4gdXNlIGEgYDEnIGZvciBIREJJQVMuIgorfTsKKworDAorLyogcm9vdG5vdmVyaWZ5ICovCitzdGF0aWMgaW50Cityb290bm92ZXJpZnlfZnVuYyAoY2hhciAqYXJnLCBpbnQgZmxhZ3MpCit7CisgIHJldHVybiByZWFsX3Jvb3RfZnVuYyAoYXJnLCAwKTsKK30KKworc3RhdGljIHN0cnVjdCBidWlsdGluIGJ1aWx0aW5fcm9vdG5vdmVyaWZ5ID0KK3sKKyAgInJvb3Rub3ZlcmlmeSIsCisgIHJvb3Rub3ZlcmlmeV9mdW5jLAorICBCVUlMVElOX0NNRExJTkUgfCBCVUlMVElOX0hFTFBfTElTVCwKKyAgInJvb3Rub3ZlcmlmeSBbREVWSUNFIFtIREJJQVNdXSIsCisgICJTaW1pbGFyIHRvIGByb290JywgYnV0IGRvbid0IGF0dGVtcHQgdG8gbW91bnQgdGhlIHBhcnRpdGlvbi4gVGhpcyIKKyAgIiBpcyB1c2VmdWwgZm9yIHdoZW4gYW4gT1MgaXMgb3V0c2lkZSBvZiB0aGUgYXJlYSBvZiB0aGUgZGlzayB0aGF0IgorICAiIEdSVUIgY2FuIHJlYWQsIGJ1dCBzZXR0aW5nIHRoZSBjb3JyZWN0IHJvb3QgZGV2aWNlIGlzIHN0aWxsIgorICAiIGRlc2lyZWQuIE5vdGUgdGhhdCB0aGUgaXRlbXMgbWVudGlvbmVkIGluIGByb290JyB3aGljaCIKKyAgIiBkZXJpdmVkIGZyb20gYXR0ZW1wdGluZyB0aGUgbW91bnQgd2lsbCBOT1Qgd29yayBjb3JyZWN0bHkuIgorfTsKKworDAorLyogc2F2ZWRlZmF1bHQgKi8KK3N0YXRpYyBpbnQKK3NhdmVkZWZhdWx0X2Z1bmMgKGNoYXIgKmFyZywgaW50IGZsYWdzKQoreworI2lmICFkZWZpbmVkKFNVUFBPUlRfRElTS0xFU1MpICYmICFkZWZpbmVkKEdSVUJfVVRJTCkKKyAgdW5zaWduZWQgbG9uZyB0bXBfZHJpdmUgPSBzYXZlZF9kcml2ZTsKKyAgdW5zaWduZWQgbG9uZyB0bXBfcGFydGl0aW9uID0gc2F2ZWRfcGFydGl0aW9uOworICBjaGFyICpkZWZhdWx0X2ZpbGUgPSAoY2hhciAqKSBERUZBVUxUX0ZJTEVfQlVGOworICBjaGFyIGJ1ZlsxMF07CisgIGNoYXIgc2VjdFtTRUNUT1JfU0laRV07CisgIGludCBlbnRyeW5vOworICBpbnQgc2VjdG9yX2NvdW50ID0gMDsKKyAgaW50IHNhdmVkX3NlY3RvcnNbMl07CisgIGludCBzYXZlZF9vZmZzZXRzWzJdOworICBpbnQgc2F2ZWRfbGVuZ3Roc1syXTsKKworICAvKiBTYXZlIHNlY3RvciBpbmZvcm1hdGlvbiBhYm91dCBhdCBtb3N0IHR3byBzZWN0b3JzLiAgKi8KKyAgYXV0byB2b2lkIGRpc2tfcmVhZF9zYXZlc2VjdF9mdW5jIChpbnQgc2VjdG9yLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKKyAgdm9pZCBkaXNrX3JlYWRfc2F2ZXNlY3RfZnVuYyAoaW50IHNlY3RvciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICB7CisgICAgICBpZiAoc2VjdG9yX2NvdW50IDwgMikKKwl7CisJICBzYXZlZF9zZWN0b3JzW3NlY3Rvcl9jb3VudF0gPSBzZWN0b3I7CisJICBzYXZlZF9vZmZzZXRzW3NlY3Rvcl9jb3VudF0gPSBvZmZzZXQ7CisJICBzYXZlZF9sZW5ndGhzW3NlY3Rvcl9jb3VudF0gPSBsZW5ndGg7CisJfQorICAgICAgc2VjdG9yX2NvdW50Kys7CisgICAgfQorICAKKyAgLyogVGhpcyBjb21tYW5kIGlzIG9ubHkgdXNlZnVsIHdoZW4geW91IGJvb3QgYW4gZW50cnkgZnJvbSB0aGUgbWVudQorICAgICBpbnRlcmZhY2UuICAqLworICBpZiAoISAoZmxhZ3MgJiBCVUlMVElOX1NDUklQVCkpCisgICAgeworICAgICAgZXJybnVtID0gRVJSX1VOUkVDT0dOSVpFRDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBEZXRlcm1pbmUgYSBzYXZlZCBlbnRyeSBudW1iZXIuICAqLworICBpZiAoKmFyZykKKyAgICB7CisgICAgICBpZiAoZ3J1Yl9tZW1jbXAgKGFyZywgImZhbGxiYWNrIiwgc2l6ZW9mICgiZmFsbGJhY2siKSAtIDEpID09IDApCisJeworCSAgaW50IGk7CisJICBpbnQgaW5kZXggPSAwOworCSAgCisJICBmb3IgKGkgPSAwOyBpIDwgTUFYX0ZBTExCQUNLX0VOVFJJRVM7IGkrKykKKwkgICAgeworCSAgICAgIGlmIChmYWxsYmFja19lbnRyaWVzW2ldIDwgMCkKKwkJYnJlYWs7CisJICAgICAgaWYgKGZhbGxiYWNrX2VudHJpZXNbaV0gPT0gY3VycmVudF9lbnRyeW5vKQorCQl7CisJCSAgaW5kZXggPSBpICsgMTsKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisJICAKKwkgIGlmIChpbmRleCA+PSBNQVhfRkFMTEJBQ0tfRU5UUklFUyB8fCBmYWxsYmFja19lbnRyaWVzW2luZGV4XSA8IDApCisJICAgIHsKKwkgICAgICAvKiBUaGlzIGlzIHRoZSBsYXN0LiAgKi8KKwkgICAgICBlcnJudW0gPSBFUlJfQkFEX0FSR1VNRU5UOworCSAgICAgIHJldHVybiAxOworCSAgICB9CisKKwkgIGVudHJ5bm8gPSBmYWxsYmFja19lbnRyaWVzW2luZGV4XTsKKwl9CisgICAgICBlbHNlIGlmICghIHNhZmVfcGFyc2VfbWF4aW50ICgmYXJnLCAmZW50cnlubykpCisJcmV0dXJuIDE7CisgICAgfQorICBlbHNlCisgICAgZW50cnlubyA9IGN1cnJlbnRfZW50cnlubzsKKworICAvKiBPcGVuIHRoZSBkZWZhdWx0IGZpbGUuICAqLworICBzYXZlZF9kcml2ZSA9IGJvb3RfZHJpdmU7CisgIHNhdmVkX3BhcnRpdGlvbiA9IGluc3RhbGxfcGFydGl0aW9uOworICBpZiAoZ3J1Yl9vcGVuIChkZWZhdWx0X2ZpbGUpKQorICAgIHsKKyAgICAgIGludCBsZW47CisgICAgICAKKyAgICAgIGRpc2tfcmVhZF9ob29rID0gZGlza19yZWFkX3NhdmVzZWN0X2Z1bmM7CisgICAgICBsZW4gPSBncnViX3JlYWQgKGJ1Ziwgc2l6ZW9mIChidWYpKTsKKyAgICAgIGRpc2tfcmVhZF9ob29rID0gMDsKKyAgICAgIGdydWJfY2xvc2UgKCk7CisgICAgICAKKyAgICAgIGlmIChsZW4gIT0gc2l6ZW9mIChidWYpKQorCXsKKwkgIC8qIFRoaXMgaXMgdG9vIHNtYWxsLiBEbyBub3QgbW9kaWZ5IHRoZSBmaWxlIG1hbnVhbGx5LCBwbGVhc2UhICAqLworCSAgZXJybnVtID0gRVJSX1JFQUQ7CisJICBnb3RvIGZhaWw7CisJfQorCisgICAgICBpZiAoc2VjdG9yX2NvdW50ID4gMikKKwl7CisJICAvKiBJcyB0aGlzIHBvc3NpYmxlPyEgVG9vIGZyYWdtZW50ZWQhICAqLworCSAgZXJybnVtID0gRVJSX0ZTWVNfQ09SUlVQVDsKKwkgIGdvdG8gZmFpbDsKKwl9CisgICAgICAKKyAgICAgIC8qIFNldCB1cCBhIHN0cmluZyB0byBiZSB3cml0dGVuLiAgKi8KKyAgICAgIGdydWJfbWVtc2V0IChidWYsICdcbicsIHNpemVvZiAoYnVmKSk7CisgICAgICBncnViX3NwcmludGYgKGJ1ZiwgIiVkIiwgZW50cnlubyk7CisgICAgICAKKyAgICAgIGlmIChzYXZlZF9sZW5ndGhzWzBdIDwgc2l6ZW9mIChidWYpKQorCXsKKwkgIC8qIFRoZSBmaWxlIGlzIGFuY2hvcmVkIHRvIGFub3RoZXIgZmlsZSBhbmQgdGhlIGZpcnN0IGZldyBieXRlcworCSAgICAgYXJlIHNwYW5uZWQgaW4gdHdvIHNlY3RvcnMuIFVnZ2guLi4gICovCisJICBpZiAoISByYXdyZWFkIChjdXJyZW50X2RyaXZlLCBzYXZlZF9zZWN0b3JzWzBdLCAwLCBTRUNUT1JfU0laRSwKKwkJCSBzZWN0KSkKKwkgICAgZ290byBmYWlsOworCSAgZ3J1Yl9tZW1tb3ZlIChzZWN0ICsgc2F2ZWRfb2Zmc2V0c1swXSwgYnVmLCBzYXZlZF9sZW5ndGhzWzBdKTsKKwkgIGlmICghIHJhd3dyaXRlIChjdXJyZW50X2RyaXZlLCBzYXZlZF9zZWN0b3JzWzBdLCBzZWN0KSkKKwkgICAgZ290byBmYWlsOworCisJICBpZiAoISByYXdyZWFkIChjdXJyZW50X2RyaXZlLCBzYXZlZF9zZWN0b3JzWzFdLCAwLCBTRUNUT1JfU0laRSwKKwkJCSBzZWN0KSkKKwkgICAgZ290byBmYWlsOworCSAgZ3J1Yl9tZW1tb3ZlIChzZWN0ICsgc2F2ZWRfb2Zmc2V0c1sxXSwKKwkJCWJ1ZiArIHNhdmVkX2xlbmd0aHNbMF0sCisJCQlzaXplb2YgKGJ1ZikgLSBzYXZlZF9sZW5ndGhzWzBdKTsKKwkgIGlmICghIHJhd3dyaXRlIChjdXJyZW50X2RyaXZlLCBzYXZlZF9zZWN0b3JzWzFdLCBzZWN0KSkKKwkgICAgZ290byBmYWlsOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBUaGlzIGlzIGEgc2ltcGxlIGNhc2UuIEl0IGZpdHMgaW50byBhIHNpbmdsZSBzZWN0b3IuICAqLworCSAgaWYgKCEgcmF3cmVhZCAoY3VycmVudF9kcml2ZSwgc2F2ZWRfc2VjdG9yc1swXSwgMCwgU0VDVE9SX1NJWkUsCisJCQkgc2VjdCkpCisJICAgIGdvdG8gZmFpbDsKKwkgIGdydWJfbWVtbW92ZSAoc2VjdCArIHNhdmVkX29mZnNldHNbMF0sIGJ1Ziwgc2l6ZW9mIChidWYpKTsKKwkgIGlmICghIHJhd3dyaXRlIChjdXJyZW50X2RyaXZlLCBzYXZlZF9zZWN0b3JzWzBdLCBzZWN0KSkKKwkgICAgZ290byBmYWlsOworCX0KKworICAgICAgLyogQ2xlYXIgdGhlIGNhY2hlLiAgKi8KKyAgICAgIGJ1Zl90cmFjayA9IC0xOworICAgIH0KKworIGZhaWw6CisgIHNhdmVkX2RyaXZlID0gdG1wX2RyaXZlOworICBzYXZlZF9wYXJ0aXRpb24gPSB0bXBfcGFydGl0aW9uOworICByZXR1cm4gZXJybnVtOworI2Vsc2UgLyogISBTVVBQT1JUX0RJU0tMRVNTICYmICEgR1JVQl9VVElMICovCisgIGVycm51bSA9IEVSUl9VTlJFQ09HTklaRUQ7CisgIHJldHVybiAxOworI2VuZGlmIC8qICEgU1VQUE9SVF9ESVNLTEVTUyAmJiAhIEdSVUJfVVRJTCAqLworfQorCitzdGF0aWMgc3RydWN0IGJ1aWx0aW4gYnVpbHRpbl9zYXZlZGVmYXVsdCA9Cit7CisgICJzYXZlZGVmYXVsdCIsCisgIHNhdmVkZWZhdWx0X2Z1bmMsCisgIEJVSUxUSU5fQ01ETElORSwKKyAgInNhdmVkZWZhdWx0IFtOVU0gfCBgZmFsbGJhY2snXSIsCisgICJTYXZlIHRoZSBjdXJyZW50IGVudHJ5IGFzIHRoZSBkZWZhdWx0IGJvb3QgZW50cnkgaWYgbm8gYXJndW1lbnQgaXMiCisgICIgc3BlY2lmaWVkLiBJZiBhIG51bWJlciBpcyBzcGVjaWZpZWQsIHRoaXMgbnVtYmVyIGlzIHNhdmVkLiBJZiIKKyAgIiBgZmFsbGJhY2snIGlzIHVzZWQsIG5leHQgZmFsbGJhY2sgZW50cnkgaXMgc2F2ZWQuIgorfTsKKworDAorI2lmZGVmIFNVUFBPUlRfU0VSSUFMCisvKiBzZXJpYWwgKi8KK3N0YXRpYyBpbnQKK3NlcmlhbF9mdW5jIChjaGFyICphcmcsIGludCBmbGFncykKK3sKKyAgdW5zaWduZWQgc2hvcnQgcG9ydCA9IHNlcmlhbF9od19nZXRfcG9ydCAoMCk7CisgIHVuc2lnbmVkIGludCBzcGVlZCA9IDk2MDA7CisgIGludCB3b3JkX2xlbiA9IFVBUlRfOEJJVFNfV09SRDsKKyAgaW50IHBhcml0eSA9IFVBUlRfTk9fUEFSSVRZOworICBpbnQgc3RvcF9iaXRfbGVuID0gVUFSVF8xX1NUT1BfQklUOworCisgIC8qIFByb2Nlc3MgR05VLXN0eWxlIGxvbmcgb3B0aW9ucy4KKyAgICAgRklYTUU6IFdlIHNob3VsZCBpbXBsZW1lbnQgYSBnZXRvcHQtbGlrZSBmdW5jdGlvbiwgdG8gYXZvaWQKKyAgICAgZHVwbGljYXRpb25zLiAgKi8KKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaWYgKGdydWJfbWVtY21wIChhcmcsICItLXVuaXQ9Iiwgc2l6ZW9mICgiLS11bml0PSIpIC0gMSkgPT0gMCkKKwl7CisJICBjaGFyICpwID0gYXJnICsgc2l6ZW9mICgiLS11bml0PSIpIC0gMTsKKwkgIGludCB1bml0OworCSAgCisJICBpZiAoISBzYWZlX3BhcnNlX21heGludCAoJnAsICZ1bml0KSkKKwkgICAgcmV0dXJuIDE7CisJICAKKwkgIGlmICh1bml0IDwgMCB8fCB1bml0ID4gMykKKwkgICAgeworCSAgICAgIGVycm51bSA9IEVSUl9ERVZfVkFMVUVTOworCSAgICAgIHJldHVybiAxOworCSAgICB9CisKKwkgIHBvcnQgPSBzZXJpYWxfaHdfZ2V0X3BvcnQgKHVuaXQpOworCX0KKyAgICAgIGVsc2UgaWYgKGdydWJfbWVtY21wIChhcmcsICItLXNwZWVkPSIsIHNpemVvZiAoIi0tc3BlZWQ9IikgLSAxKSA9PSAwKQorCXsKKwkgIGNoYXIgKnAgPSBhcmcgKyBzaXplb2YgKCItLXNwZWVkPSIpIC0gMTsKKwkgIGludCBudW07CisJICAKKwkgIGlmICghIHNhZmVfcGFyc2VfbWF4aW50ICgmcCwgJm51bSkpCisJICAgIHJldHVybiAxOworCisJICBzcGVlZCA9ICh1bnNpZ25lZCBpbnQpIG51bTsKKwl9CisgICAgICBlbHNlIGlmIChncnViX21lbWNtcCAoYXJnLCAiLS1wb3J0PSIsIHNpemVvZiAoIi0tcG9ydD0iKSAtIDEpID09IDApCisJeworCSAgY2hhciAqcCA9IGFyZyArIHNpemVvZiAoIi0tcG9ydD0iKSAtIDE7CisJICBpbnQgbnVtOworCSAgCisJICBpZiAoISBzYWZlX3BhcnNlX21heGludCAoJnAsICZudW0pKQorCSAgICByZXR1cm4gMTsKKworCSAgcG9ydCA9ICh1bnNpZ25lZCBzaG9ydCkgbnVtOworCX0KKyAgICAgIGVsc2UgaWYgKGdydWJfbWVtY21wIChhcmcsICItLXdvcmQ9Iiwgc2l6ZW9mICgiLS13b3JkPSIpIC0gMSkgPT0gMCkKKwl7CisJICBjaGFyICpwID0gYXJnICsgc2l6ZW9mICgiLS13b3JkPSIpIC0gMTsKKwkgIGludCBsZW47CisJICAKKwkgIGlmICghIHNhZmVfcGFyc2VfbWF4aW50ICgmcCwgJmxlbikpCisJICAgIHJldHVybiAxOworCisJICBzd2l0Y2ggKGxlbikKKwkgICAgeworCSAgICBjYXNlIDU6IHdvcmRfbGVuID0gVUFSVF81QklUU19XT1JEOyBicmVhazsKKwkgICAgY2FzZSA2OiB3b3JkX2xlbiA9IFVBUlRfNkJJVFNfV09SRDsgYnJlYWs7CisJICAgIGNhc2UgNzogd29yZF9sZW4gPSBVQVJUXzdCSVRTX1dPUkQ7IGJyZWFrOworCSAgICBjYXNlIDg6IHdvcmRfbGVuID0gVUFSVF84QklUU19XT1JEOyBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBlcnJudW0gPSBFUlJfQkFEX0FSR1VNRU5UOworCSAgICAgIHJldHVybiAxOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoZ3J1Yl9tZW1jbXAgKGFyZywgIi0tc3RvcD0iLCBzaXplb2YgKCItLXN0b3A9IikgLSAxKSA9PSAwKQorCXsKKwkgIGNoYXIgKnAgPSBhcmcgKyBzaXplb2YgKCItLXN0b3A9IikgLSAxOworCSAgaW50IGxlbjsKKwkgIAorCSAgaWYgKCEgc2FmZV9wYXJzZV9tYXhpbnQgKCZwLCAmbGVuKSkKKwkgICAgcmV0dXJuIDE7CisKKwkgIHN3aXRjaCAobGVuKQorCSAgICB7CisJICAgIGNhc2UgMTogc3RvcF9iaXRfbGVuID0gVUFSVF8xX1NUT1BfQklUOyBicmVhazsKKwkgICAgY2FzZSAyOiBzdG9wX2JpdF9sZW4gPSBVQVJUXzJfU1RPUF9CSVRTOyBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBlcnJudW0gPSBFUlJfQkFEX0FSR1VNRU5UOworCSAgICAgIHJldHVybiAxOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoZ3J1Yl9tZW1jbXAgKGFyZywgIi0tcGFyaXR5PSIsIHNpemVvZiAoIi0tcGFyaXR5PSIpIC0gMSkgPT0gMCkKKwl7CisJICBjaGFyICpwID0gYXJnICsgc2l6ZW9mICgiLS1wYXJpdHk9IikgLSAxOworCisJICBpZiAoZ3J1Yl9tZW1jbXAgKHAsICJubyIsIHNpemVvZiAoIm5vIikgLSAxKSA9PSAwKQorCSAgICBwYXJpdHkgPSBVQVJUX05PX1BBUklUWTsKKwkgIGVsc2UgaWYgKGdydWJfbWVtY21wIChwLCAib2RkIiwgc2l6ZW9mICgib2RkIikgLSAxKSA9PSAwKQorCSAgICBwYXJpdHkgPSBVQVJUX09ERF9QQVJJVFk7CisJICBlbHNlIGlmIChncnViX21lbWNtcCAocCwgImV2ZW4iLCBzaXplb2YgKCJldmVuIikgLSAxKSA9PSAwKQorCSAgICBwYXJpdHkgPSBVQVJUX0VWRU5fUEFSSVRZOworCSAgZWxzZQorCSAgICB7CisJICAgICAgZXJybnVtID0gRVJSX0JBRF9BUkdVTUVOVDsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgfQorCX0KKyMgaWZkZWYgR1JVQl9VVElMCisgICAgICAvKiBJbiB0aGUgZ3J1YiBzaGVsbCwgZG9uJ3QgdXNlIGFueSBwb3J0IG51bWJlciBidXQgb3BlbiBhIHR0eQorCSBkZXZpY2UgaW5zdGVhZC4gICovCisgICAgICBlbHNlIGlmIChncnViX21lbWNtcCAoYXJnLCAiLS1kZXZpY2U9Iiwgc2l6ZW9mICgiLS1kZXZpY2U9IikgLSAxKSA9PSAwKQorCXsKKwkgIGNoYXIgKnAgPSBhcmcgKyBzaXplb2YgKCItLWRldmljZT0iKSAtIDE7CisJICBjaGFyIGRldlsyNTZdOwkvKiBYWFggKi8KKwkgIGNoYXIgKnEgPSBkZXY7CisJICAKKwkgIHdoaWxlICgqcCAmJiAhIGdydWJfaXNzcGFjZSAoKnApKQorCSAgICAqcSsrID0gKnArKzsKKwkgIAorCSAgKnEgPSAwOworCSAgc2VyaWFsX3NldF9kZXZpY2UgKGRldik7CisJfQorIyBlbmRpZiAvKiBHUlVCX1VUSUwgKi8KKyAgICAgIGVsc2UKKwlicmVhazsKKworICAgICAgYXJnID0gc2tpcF90byAoMCwgYXJnKTsKKyAgICB9CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgc2VyaWFsIHVuaXQuICAqLworICBpZiAoISBzZXJpYWxfaHdfaW5pdCAocG9ydCwgc3BlZWQsIHdvcmRfbGVuLCBwYXJpdHksIHN0b3BfYml0X2xlbikpCisgICAgeworICAgICAgZXJybnVtID0gRVJSX0JBRF9BUkdVTUVOVDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgCisgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJ1aWx0aW4gYnVpbHRpbl9zZXJpYWwgPQoreworICAic2VyaWFsIiwKKyAgc2VyaWFsX2Z1bmMsCisgIEJVSUxUSU5fTUVOVSB8IEJVSUxUSU5fQ01ETElORSB8IEJVSUxUSU5fSEVMUF9MSVNULAorICAic2VyaWFsIFstLXVuaXQ9VU5JVF0gWy0tcG9ydD1QT1JUXSBbLS1zcGVlZD1TUEVFRF0gWy0td29yZD1XT1JEXSBbLS1wYXJpdHk9UEFSSVRZXSBbLS1zdG9wPVNUT1BdIFstLWRldmljZT1ERVZdIiwKKyAgIkluaXRpYWxpemUgYSBzZXJpYWwgZGV2aWNlLiBVTklUIGlzIGEgZGlnaXQgdGhhdCBzcGVjaWZpZXMgd2hpY2ggc2VyaWFsIgorICAiIGRldmljZSBpcyB1c2VkIChlLmcuIDAgPT0gQ09NMSkuIElmIHlvdSBuZWVkIHRvIHNwZWNpZnkgdGhlIHBvcnQgbnVtYmVyLCIKKyAgIiBzZXQgaXQgYnkgLS1wb3J0LiBTUEVFRCBpcyB0aGUgRFRFLURURSBzcGVlZC4gV09SRCBpcyB0aGUgd29yZCBsZW5ndGgsIgorICAiIFBBUklUWSBpcyB0aGUgdHlwZSBvZiBwYXJpdHksIHdoaWNoIGlzIG9uZSBvZiBgbm8nLCBgb2RkJyBhbmQgYGV2ZW4nLiIKKyAgIiBTVE9QIGlzIHRoZSBsZW5ndGggb2Ygc3RvcCBiaXQocykuIFRoZSBvcHRpb24gLS1kZXZpY2UgY2FuIGJlIHVzZWQgb25seSIKKyAgIiBpbiB0aGUgZ3J1YiBzaGVsbCwgd2hpY2ggc3BlY2lmaWVzIHRoZSBmaWxlIG5hbWUgb2YgYSB0dHkgZGV2aWNlLiBUaGUiCisgICIgZGVmYXVsdCB2YWx1ZXMgYXJlIENPTTEsIDk2MDAsIDhOMS4iCit9OworI2VuZGlmIC8qIFNVUFBPUlRfU0VSSUFMICovCisKKwwKKy8qIHNldGtleSAqLworc3RydWN0IGtleXN5bQoreworICBjaGFyICp1bnNoaWZ0ZWRfbmFtZTsJCQkvKiB0aGUgbmFtZSBpbiB1bnNoaWZ0ZWQgc3RhdGUgKi8KKyAgY2hhciAqc2hpZnRlZF9uYW1lOwkJCS8qIHRoZSBuYW1lIGluIHNoaWZ0ZWQgc3RhdGUgKi8KKyAgdW5zaWduZWQgY2hhciB1bnNoaWZ0ZWRfYXNjaWk7CS8qIHRoZSBhc2NpaSBjb2RlIGluIHVuc2hpZnRlZCBzdGF0ZSAqLworICB1bnNpZ25lZCBjaGFyIHNoaWZ0ZWRfYXNjaWk7CQkvKiB0aGUgYXNjaWkgY29kZSBpbiBzaGlmdGVkIHN0YXRlICovCisgIHVuc2lnbmVkIGNoYXIga2V5Y29kZTsJCS8qIGtleWJvYXJkIHNjYW5jb2RlICovCit9OworCisvKiBUaGUgdGFibGUgZm9yIGtleSBzeW1ib2xzLiBJZiB0aGUgInNoaWZ0ZWQiIG1lbWJlciBvZiBhbiBlbnRyeSBpcworICAgTlVMTCwgdGhlIGVudHJ5IGRvZXMgbm90IGhhdmUgc2hpZnRlZCBzdGF0ZS4gICovCitzdGF0aWMgc3RydWN0IGtleXN5bSBrZXlzeW1fdGFibGVbXSA9Cit7CisgIHsiZXNjYXBlIiwJCTAsCQkweDFiLAkwLAkweDAxfSwKKyAgeyIxIiwJCQkiZXhjbGFtIiwJJzEnLAknIScsCTB4MDJ9LAorICB7IjIiLAkJCSJhdCIsCQknMicsCSdAJywJMHgwM30sCisgIHsiMyIsCQkJIm51bWJlcnNpZ24iLAknMycsCScjJywJMHgwNH0sCisgIHsiNCIsCQkJImRvbGxhciIsCSc0JywJJyQnLAkweDA1fSwKKyAgeyI1IiwJCQkicGVyY2VudCIsCSc1JywJJyUnLAkweDA2fSwKKyAgeyI2IiwJCQkiY2FyZXQiLAknNicsCSdeJywJMHgwN30sCisgIHsiNyIsCQkJImFtcGVyc2FuZCIsCSc3JywJJyYnLAkweDA4fSwKKyAgeyI4IiwJCQkiYXN0ZXJpc2siLAknOCcsCScqJywJMHgwOX0sCisgIHsiOSIsCQkJInBhcmVubGVmdCIsCSc5JywJJygnLAkweDBhfSwKKyAgeyIwIiwJCQkicGFyZW5yaWdodCIsCScwJywJJyknLAkweDBifSwKKyAgeyJtaW51cyIsCQkidW5kZXJzY29yZSIsCSctJywJJ18nLAkweDBjfSwKKyAgeyJlcXVhbCIsCQkicGx1cyIsCQknPScsCScrJywJMHgwZH0sCisgIHsiYmFja3NwYWNlIiwJCTAsCQknXGInLAkwLAkweDBlfSwKKyAgeyJ0YWIiLAkJMCwJCSdcdCcsCTAsCTB4MGZ9LAorICB7InEiLAkJCSJRIiwJCSdxJywJJ1EnLAkweDEwfSwKKyAgeyJ3IiwJCQkiVyIsCQkndycsCSdXJywJMHgxMX0sCisgIHsiZSIsCQkJIkUiLAkJJ2UnLAknRScsCTB4MTJ9LAorICB7InIiLAkJCSJSIiwJCSdyJywJJ1InLAkweDEzfSwKKyAgeyJ0IiwJCQkiVCIsCQkndCcsCSdUJywJMHgxNH0sCisgIHsieSIsCQkJIlkiLAkJJ3knLAknWScsCTB4MTV9LAorICB7InUiLAkJCSJVIiwJCSd1JywJJ1UnLAkweDE2fSwKKyAgeyJpIiwJCQkiSSIsCQknaScsCSdJJywJMHgxN30sCisgIHsibyIsCQkJIk8iLAkJJ28nLAknTycsCTB4MTh9LAorICB7InAiLAkJCSJQIiwJCSdwJywJJ1AnLAkweDE5fSwKKyAgeyJicmFja2V0bGVmdCIsCSJicmFjZWxlZnQiLAknWycsCSd7JywJMHgxYX0sCisgIHsiYnJhY2tldHJpZ2h0IiwJImJyYWNlcmlnaHQiLAknXScsCSd9JywJMHgxYn0sCisgIHsiZW50ZXIiLAkJMCwJCSdcbicsCTAsCTB4MWN9LAorICB7ImNvbnRyb2wiLAkJMCwJCTAsCTAsCTB4MWR9LAorICB7ImEiLAkJCSJBIiwJCSdhJywJJ0EnLAkweDFlfSwKKyAgeyJzIiwJCQkiUyIsCQkncycsCSdTJywJMHgxZn0sCisgIHsiZCIsCQkJIkQiLAkJJ2QnLAknRCcsCTB4MjB9LAorICB7ImYiLAkJCSJGIiwJCSdmJywJJ0YnLAkweDIxfSwKKyAgeyJnIiwJCQkiRyIsCQknZycsCSdHJywJMHgyMn0sCisgIHsiaCIsCQkJIkgiLAkJJ2gnLAknSCcsCTB4MjN9LAorICB7ImoiLAkJCSJKIiwJCSdqJywJJ0onLAkweDI0fSwKKyAgeyJrIiwJCQkiSyIsCQknaycsCSdLJywJMHgyNX0sCisgIHsibCIsCQkJIkwiLAkJJ2wnLAknTCcsCTB4MjZ9LAorICB7InNlbWljb2xvbiIsCQkiY29sb24iLAknOycsCSc6JywJMHgyN30sCisgIHsicXVvdGUiLAkJImRvdWJsZXF1b3RlIiwJJ1wnJywJJyInLAkweDI4fSwKKyAgeyJiYWNrcXVvdGUiLAkJInRpbGRlIiwJJ2AnLAknficsCTB4Mjl9LAorICB7InNoaWZ0IiwJCTAsCQkwLAkwLAkweDJhfSwKKyAgeyJiYWNrc2xhc2giLAkJImJhciIsCQknXFwnLAknfCcsCTB4MmJ9LAorICB7InoiLAkJCSJaIiwJCSd6JywJJ1onLAkweDJjfSwKKyAgeyJ4IiwJCQkiWCIsCQkneCcsCSdYJywJMHgyZH0sCisgIHsiYyIsCQkJIkMiLAkJJ2MnLAknQycsCTB4MmV9LAorICB7InYiLAkJCSJWIiwJCSd2JywJJ1YnLAkweDJmfSwKKyAgeyJiIiwJCQkiQiIsCQknYicsCSdCJywJMHgzMH0sCisgIHsibiIsCQkJIk4iLAkJJ24nLAknTicsCTB4MzF9LAorICB7Im0iLAkJCSJNIiwJCSdtJywJJ00nLAkweDMyfSwKKyAgeyJjb21tYSIsCQkibGVzcyIsCQknLCcsCSc8JywJMHgzM30sCisgIHsicGVyaW9kIiwJCSJncmVhdGVyIiwJJy4nLAknPicsCTB4MzR9LAorICB7InNsYXNoIiwJCSJxdWVzdGlvbiIsCScvJywJJz8nLAkweDM1fSwKKyAgeyJhbHQiLAkJMCwJCTAsCTAsCTB4Mzh9LAorICB7InNwYWNlIiwJCTAsCQknICcsCTAsCTB4Mzl9LAorICB7ImNhcHNsb2NrIiwJCTAsCQkwLAkwLAkweDNhfSwKKyAgeyJGMSIsCQkwLAkJMCwJMCwJMHgzYn0sCisgIHsiRjIiLAkJMCwJCTAsCTAsCTB4M2N9LAorICB7IkYzIiwJCTAsCQkwLAkwLAkweDNkfSwKKyAgeyJGNCIsCQkwLAkJMCwJMCwJMHgzZX0sCisgIHsiRjUiLAkJMCwJCTAsCTAsCTB4M2Z9LAorICB7IkY2IiwJCTAsCQkwLAkwLAkweDQwfSwKKyAgeyJGNyIsCQkwLAkJMCwJMCwJMHg0MX0sCisgIHsiRjgiLAkJMCwJCTAsCTAsCTB4NDJ9LAorICB7IkY5IiwJCTAsCQkwLAkwLAkweDQzfSwKKyAgeyJGMTAiLAkJMCwJCTAsCTAsCTB4NDR9LAorICAvKiBDYXV0aW9uOiBkbyBub3QgYWRkIE51bUxvY2sgaGVyZSEgd2UgY2Fubm90IGRlYWwgd2l0aCBpdCBwcm9wZXJseS4gICovCisgIHsiZGVsZXRlIiwJCTAsCQkweDdmLAkwLAkweDUzfQorfTsKKworc3RhdGljIGludAorc2V0a2V5X2Z1bmMgKGNoYXIgKmFyZywgaW50IGZsYWdzKQoreworICBjaGFyICp0b19rZXksICpmcm9tX2tleTsKKyAgaW50IHRvX2NvZGUsIGZyb21fY29kZTsKKyAgaW50IG1hcF9pbl9pbnRlcnJ1cHQgPSAwOworICAKKyAgYXV0byBpbnQgZmluZF9rZXlfY29kZSAoY2hhciAqa2V5KTsKKyAgYXV0byBpbnQgZmluZF9hc2NpaV9jb2RlIChjaGFyICprZXkpOworICAKKyAgYXV0byBpbnQgZmluZF9rZXlfY29kZSAoY2hhciAqa2V5KQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChrZXlzeW1fdGFibGUpIC8gc2l6ZW9mIChrZXlzeW1fdGFibGVbMF0pOyBpKyspCisJeworCSAgaWYgKGtleXN5bV90YWJsZVtpXS51bnNoaWZ0ZWRfbmFtZSAmJgorCSAgICAgIGdydWJfc3RyY21wIChrZXksIGtleXN5bV90YWJsZVtpXS51bnNoaWZ0ZWRfbmFtZSkgPT0gMCkKKwkgICAgcmV0dXJuIGtleXN5bV90YWJsZVtpXS5rZXljb2RlOworCSAgZWxzZSBpZiAoa2V5c3ltX3RhYmxlW2ldLnNoaWZ0ZWRfbmFtZSAmJgorCQkgICBncnViX3N0cmNtcCAoa2V5LCBrZXlzeW1fdGFibGVbaV0uc2hpZnRlZF9uYW1lKSA9PSAwKQorCSAgICByZXR1cm4ga2V5c3ltX3RhYmxlW2ldLmtleWNvZGU7CisJfQorICAgICAgCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIAorICBhdXRvIGludCBmaW5kX2FzY2lpX2NvZGUgKGNoYXIgKmtleSkKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIAorICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoa2V5c3ltX3RhYmxlKSAvIHNpemVvZiAoa2V5c3ltX3RhYmxlWzBdKTsgaSsrKQorCXsKKwkgIGlmIChrZXlzeW1fdGFibGVbaV0udW5zaGlmdGVkX25hbWUgJiYKKwkgICAgICBncnViX3N0cmNtcCAoa2V5LCBrZXlzeW1fdGFibGVbaV0udW5zaGlmdGVkX25hbWUpID09IDApCisJICAgIHJldHVybiBrZXlzeW1fdGFibGVbaV0udW5zaGlmdGVkX2FzY2lpOworCSAgZWxzZSBpZiAoa2V5c3ltX3RhYmxlW2ldLnNoaWZ0ZWRfbmFtZSAmJgorCQkgICBncnViX3N0cmNtcCAoa2V5LCBrZXlzeW1fdGFibGVbaV0uc2hpZnRlZF9uYW1lKSA9PSAwKQorCSAgICByZXR1cm4ga2V5c3ltX3RhYmxlW2ldLnNoaWZ0ZWRfYXNjaWk7CisJfQorICAgICAgCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIAorICB0b19rZXkgPSBhcmc7CisgIGZyb21fa2V5ID0gc2tpcF90byAoMCwgdG9fa2V5KTsKKworICBpZiAoISAqdG9fa2V5KQorICAgIHsKKyAgICAgIC8qIElmIHRoZSB1c2VyIHNwZWNpZmllcyBubyBhcmd1bWVudCwgcmVzZXQgdGhlIGtleSBtYXBwaW5ncy4gICovCisgICAgICBncnViX21lbXNldCAoYmlvc19rZXlfbWFwLCAwLCBLRVlfTUFQX1NJWkUgKiBzaXplb2YgKHVuc2lnbmVkIHNob3J0KSk7CisgICAgICBncnViX21lbXNldCAoYXNjaWlfa2V5X21hcCwgMCwgS0VZX01BUF9TSVpFICogc2l6ZW9mICh1bnNpZ25lZCBzaG9ydCkpOworCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGVsc2UgaWYgKCEgKmZyb21fa2V5KQorICAgIHsKKyAgICAgIC8qIFRoZSB1c2VyIG11c3Qgc3BlY2lmeSB0d28gYXJndW1lbnRzIG9yIHplcm8gYXJndW1lbnQuICAqLworICAgICAgZXJybnVtID0gRVJSX0JBRF9BUkdVTUVOVDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgCisgIG51bF90ZXJtaW5hdGUgKHRvX2tleSk7CisgIG51bF90ZXJtaW5hdGUgKGZyb21fa2V5KTsKKyAgCisgIHRvX2NvZGUgPSBmaW5kX2FzY2lpX2NvZGUgKHRvX2tleSk7CisgIGZyb21fY29kZSA9IGZpbmRfYXNjaWlfY29kZSAoZnJvbV9rZXkpOworICBpZiAoISB0b19jb2RlIHx8ICEgZnJvbV9jb2RlKQorICAgIHsKKyAgICAgIG1hcF9pbl9pbnRlcnJ1cHQgPSAxOworICAgICAgdG9fY29kZSA9IGZpbmRfa2V5X2NvZGUgKHRvX2tleSk7CisgICAgICBmcm9tX2NvZGUgPSBmaW5kX2tleV9jb2RlIChmcm9tX2tleSk7CisgICAgICBpZiAoISB0b19jb2RlIHx8ICEgZnJvbV9jb2RlKQorCXsKKwkgIGVycm51bSA9IEVSUl9CQURfQVJHVU1FTlQ7CisJICByZXR1cm4gMTsKKwl9CisgICAgfQorICAKKyAgaWYgKG1hcF9pbl9pbnRlcnJ1cHQpCisgICAgeworICAgICAgaW50IGk7CisgICAgICAKKyAgICAgIC8qIEZpbmQgYW4gZW1wdHkgc2xvdC4gICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgS0VZX01BUF9TSVpFOyBpKyspCisJeworCSAgaWYgKChiaW9zX2tleV9tYXBbaV0gJiAweGZmKSA9PSBmcm9tX2NvZGUpCisJICAgIC8qIFBlcmhhcHMgdGhlIHVzZXIgd2FudHMgdG8gb3ZlcndyaXRlIHRoZSBtYXAuICAqLworCSAgICBicmVhazsKKwkgIAorCSAgaWYgKCEgYmlvc19rZXlfbWFwW2ldKQorCSAgICBicmVhazsKKwl9CisgICAgICAKKyAgICAgIGlmIChpID09IEtFWV9NQVBfU0laRSkKKwl7CisJICBlcnJudW0gPSBFUlJfV09OVF9GSVQ7CisJICByZXR1cm4gMTsKKwl9CisgICAgICAKKyAgICAgIGlmICh0b19jb2RlID09IGZyb21fY29kZSkKKwkvKiBJZiBUTyBpcyBlcXVhbCB0byBGUk9NLCBkZWxldGUgdGhlIGVudHJ5LiAgKi8KKwlncnViX21lbW1vdmUgKChjaGFyICopICZiaW9zX2tleV9tYXBbaV0sCisJCSAgICAgIChjaGFyICopICZiaW9zX2tleV9tYXBbaSArIDFdLAorCQkgICAgICBzaXplb2YgKHVuc2lnbmVkIHNob3J0KSAqIChLRVlfTUFQX1NJWkUgLSBpKSk7CisgICAgICBlbHNlCisJYmlvc19rZXlfbWFwW2ldID0gKHRvX2NvZGUgPDwgOCkgfCBmcm9tX2NvZGU7CisgICAgICAKKyAgICAgIC8qIFVnbHkgYnV0IHNob3VsZCB3b3JrLiAgKi8KKyAgICAgIHVuc2V0X2ludDE1X2hhbmRsZXIgKCk7CisgICAgICBzZXRfaW50MTVfaGFuZGxlciAoKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIAorICAgICAgLyogRmluZCBhbiBlbXB0eSBzbG90LiAgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBLRVlfTUFQX1NJWkU7IGkrKykKKwl7CisJICBpZiAoKGFzY2lpX2tleV9tYXBbaV0gJiAweGZmKSA9PSBmcm9tX2NvZGUpCisJICAgIC8qIFBlcmhhcHMgdGhlIHVzZXIgd2FudHMgdG8gb3ZlcndyaXRlIHRoZSBtYXAuICAqLworCSAgICBicmVhazsKKwkgIAorCSAgaWYgKCEgYXNjaWlfa2V5X21hcFtpXSkKKwkgICAgYnJlYWs7CisJfQorICAgICAgCisgICAgICBpZiAoaSA9PSBLRVlfTUFQX1NJWkUpCisJeworCSAgZXJybnVtID0gRVJSX1dPTlRfRklUOworCSAgcmV0dXJuIDE7CisJfQorICAgICAgCisgICAgICBpZiAodG9fY29kZSA9PSBmcm9tX2NvZGUpCisJLyogSWYgVE8gaXMgZXF1YWwgdG8gRlJPTSwgZGVsZXRlIHRoZSBlbnRyeS4gICovCisJZ3J1Yl9tZW1tb3ZlICgoY2hhciAqKSAmYXNjaWlfa2V5X21hcFtpXSwKKwkJICAgICAgKGNoYXIgKikgJmFzY2lpX2tleV9tYXBbaSArIDFdLAorCQkgICAgICBzaXplb2YgKHVuc2lnbmVkIHNob3J0KSAqIChLRVlfTUFQX1NJWkUgLSBpKSk7CisgICAgICBlbHNlCisJYXNjaWlfa2V5X21hcFtpXSA9ICh0b19jb2RlIDw8IDgpIHwgZnJvbV9jb2RlOworICAgIH0KKyAgICAgIAorICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBidWlsdGluIGJ1aWx0aW5fc2V0a2V5ID0KK3sKKyAgInNldGtleSIsCisgIHNldGtleV9mdW5jLAorICBCVUlMVElOX0NNRExJTkUgfCBCVUlMVElOX01FTlUgfCBCVUlMVElOX0hFTFBfTElTVCwKKyAgInNldGtleSBbVE9fS0VZIEZST01fS0VZXSIsCisgICJDaGFuZ2UgdGhlIGtleWJvYXJkIG1hcC4gVGhlIGtleSBGUk9NX0tFWSBpcyBtYXBwZWQgdG8gdGhlIGtleSBUT19LRVkuIgorICAiIEEga2V5IG11c3QgYmUgYW4gYWxwaGFiZXQsIGEgZGlnaXQsIG9yIG9uZSBvZiB0aGVzZTogZXNjYXBlLCBleGNsYW0sIgorICAiIGF0LCBudW1iZXJzaWduLCBkb2xsYXIsIHBlcmNlbnQsIGNhcmV0LCBhbXBlcnNhbmQsIGFzdGVyaXNrLCBwYXJlbmxlZnQsIgorICAiIHBhcmVucmlnaHQsIG1pbnVzLCB1bmRlcnNjb3JlLCBlcXVhbCwgcGx1cywgYmFja3NwYWNlLCB0YWIsIGJyYWNrZXRsZWZ0LCIKKyAgIiBicmFjZWxlZnQsIGJyYWNrZXRyaWdodCwgYnJhY2VyaWdodCwgZW50ZXIsIGNvbnRyb2wsIHNlbWljb2xvbiwgY29sb24sIgorICAiIHF1b3RlLCBkb3VibGVxdW90ZSwgYmFja3F1b3RlLCB0aWxkZSwgc2hpZnQsIGJhY2tzbGFzaCwgYmFyLCBjb21tYSwiCisgICIgbGVzcywgcGVyaW9kLCBncmVhdGVyLCBzbGFzaCwgcXVlc3Rpb24sIGFsdCwgc3BhY2UsIGNhcHNsb2NrLCBGWCAoWCIKKyAgIiBpcyBhIGRpZ2l0KSwgYW5kIGRlbGV0ZS4gSWYgbm8gYXJndW1lbnQgaXMgc3BlY2lmaWVkLCByZXNldCBrZXkiCisgICIgbWFwcGluZ3MuIgorfTsKKworDAorLyogc2V0dXAgKi8KK3N0YXRpYyBpbnQKK3NldHVwX2Z1bmMgKGNoYXIgKmFyZywgaW50IGZsYWdzKQoreworICAvKiBQb2ludCB0byB0aGUgc3RyaW5nIG9mIHRoZSBpbnN0YWxsZWQgZHJpdmUvcGFydGl0aW9uLiAgKi8KKyAgY2hhciAqaW5zdGFsbF9wdHI7CisgIC8qIFBvaW50IHRvIHRoZSBzdHJpbmcgb2YgdGhlIGRyaXZlL3Bhcml0aW9uIHdoZXJlIHRoZSBHUlVCIGltYWdlcworICAgICByZXNpZGUuICAqLworICBjaGFyICppbWFnZV9wdHI7CisgIHVuc2lnbmVkIGxvbmcgaW5zdGFsbGVkX2RyaXZlLCBpbnN0YWxsZWRfcGFydGl0aW9uOworICB1bnNpZ25lZCBsb25nIGltYWdlX2RyaXZlLCBpbWFnZV9wYXJ0aXRpb247CisgIHVuc2lnbmVkIGxvbmcgdG1wX2RyaXZlLCB0bXBfcGFydGl0aW9uOworICBjaGFyIHN0YWdlMVs2NF07CisgIGNoYXIgc3RhZ2UyWzY0XTsKKyAgY2hhciBjb25maWdfZmlsZW5hbWVbNjRdOworICBjaGFyIHJlYWxfY29uZmlnX2ZpbGVuYW1lWzY0XTsKKyAgY2hhciBjbWRfYXJnWzI1Nl07CisgIGNoYXIgZGV2aWNlWzE2XTsKKyAgY2hhciAqYnVmZmVyID0gKGNoYXIgKikgUkFXX0FERFIgKDB4MTAwMDAwKTsKKyAgaW50IGlzX2ZvcmNlX2xiYSA9IDA7CisgIGNoYXIgKnN0YWdlMl9hcmcgPSAwOworICBjaGFyICpwcmVmaXggPSAwOworCisgIGF1dG8gaW50IGNoZWNrX2ZpbGUgKGNoYXIgKmZpbGUpOworICBhdXRvIHZvaWQgc3ByaW50X2RldmljZSAoaW50IGRyaXZlLCBpbnQgcGFydGl0aW9uKTsKKyAgYXV0byBpbnQgZW1iZWRfc3RhZ2UxXzUgKGNoYXIgKiBzdGFnZTFfNSwgaW50IGRyaXZlLCBpbnQgcGFydGl0aW9uKTsKKyAgCisgIC8qIENoZWNrIGlmIHRoZSBmaWxlIEZJTEUgZXhpc3RzIGxpa2UgQXV0b2NvbmYuICAqLworICBpbnQgY2hlY2tfZmlsZSAoY2hhciAqZmlsZSkKKyAgICB7CisgICAgICBpbnQgcmV0OworICAgICAgCisgICAgICBncnViX3ByaW50ZiAoIiBDaGVja2luZyBpZiBcIiVzXCIgZXhpc3RzLi4uICIsIGZpbGUpOworICAgICAgcmV0ID0gZ3J1Yl9vcGVuIChmaWxlKTsKKyAgICAgIGlmIChyZXQpCisJeworCSAgZ3J1Yl9jbG9zZSAoKTsKKwkgIGdydWJfcHJpbnRmICgieWVzXG4iKTsKKwl9CisgICAgICBlbHNlCisJZ3J1Yl9wcmludGYgKCJub1xuIik7CisKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAKKyAgLyogQ29uc3RydWN0IGEgZGV2aWNlIG5hbWUgaW4gREVWSUNFLiAgKi8KKyAgdm9pZCBzcHJpbnRfZGV2aWNlIChpbnQgZHJpdmUsIGludCBwYXJ0aXRpb24pCisgICAgeworICAgICAgZ3J1Yl9zcHJpbnRmIChkZXZpY2UsICIoJWNkJWQiLAorCQkgICAgKGRyaXZlICYgMHg4MCkgPyAnaCcgOiAnZicsCisJCSAgICBkcml2ZSAmIH4weDgwKTsKKyAgICAgIGlmICgocGFydGl0aW9uICYgMHhGRjAwMDApICE9IDB4RkYwMDAwKQorCXsKKwkgIGNoYXIgdG1wWzE2XTsKKwkgIGdydWJfc3ByaW50ZiAodG1wLCAiLCVkIiwgKHBhcnRpdGlvbiA+PiAxNikgJiAweEZGKTsKKwkgIGdydWJfc3RybmNhdCAoZGV2aWNlLCB0bXAsIDI1Nik7CisJfQorICAgICAgaWYgKChwYXJ0aXRpb24gJiAweDAwRkYwMCkgIT0gMHgwMEZGMDApCisJeworCSAgY2hhciB0bXBbMTZdOworCSAgZ3J1Yl9zcHJpbnRmICh0bXAsICIsJWMiLCAnYScgKyAoKHBhcnRpdGlvbiA+PiA4KSAmIDB4RkYpKTsKKwkgIGdydWJfc3RybmNhdCAoZGV2aWNlLCB0bXAsIDI1Nik7CisJfQorICAgICAgZ3J1Yl9zdHJuY2F0IChkZXZpY2UsICIpIiwgMjU2KTsKKyAgICB9CisgIAorICBpbnQgZW1iZWRfc3RhZ2UxXzUgKGNoYXIgKnN0YWdlMV81LCBpbnQgZHJpdmUsIGludCBwYXJ0aXRpb24pCisgICAgeworICAgICAgLyogV2UgaW5zdGFsbCBHUlVCIGludG8gdGhlIE1CUiwgc28gdHJ5IHRvIGVtYmVkIHRoZQorCSBTdGFnZSAxLjUgaW4gdGhlIHNlY3RvcnMgcmlnaHQgYWZ0ZXIgdGhlIE1CUi4gICovCisgICAgICBzcHJpbnRfZGV2aWNlIChkcml2ZSwgcGFydGl0aW9uKTsKKyAgICAgIGdydWJfc3ByaW50ZiAoY21kX2FyZywgIiVzICVzIiwgc3RhZ2UxXzUsIGRldmljZSk7CisJICAgICAgCisgICAgICAvKiBOb3RpZnkgd2hhdCB3aWxsIGJlIHJ1bi4gICovCisgICAgICBncnViX3ByaW50ZiAoIiBSdW5uaW5nIFwiZW1iZWQgJXNcIi4uLiAiLCBjbWRfYXJnKTsKKyAgICAgIAorICAgICAgZW1iZWRfZnVuYyAoY21kX2FyZywgZmxhZ3MpOworICAgICAgaWYgKCEgZXJybnVtKQorCXsKKwkgIC8qIENvbnN0cnVjdCB0aGUgYmxvY2tsaXN0IHJlcHJlc2VudGF0aW9uLiAgKi8KKwkgIGdydWJfc3ByaW50ZiAoYnVmZmVyLCAiJXMlcyIsIGRldmljZSwgZW1iZWRfaW5mbyk7CisJICBncnViX3ByaW50ZiAoInN1Y2NlZWRlZFxuIik7CisJICByZXR1cm4gMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgZ3J1Yl9wcmludGYgKCJmYWlsZWQgKHRoaXMgaXMgbm90IGZhdGFsKVxuIik7CisJICByZXR1cm4gMDsKKwl9CisgICAgfQorCSAgCisgIHN0cnVjdCBzdGFnZTFfNV9tYXAgeworICAgIGNoYXIgKmZzeXM7CisgICAgY2hhciAqbmFtZTsKKyAgfTsKKyAgc3RydWN0IHN0YWdlMV81X21hcCBzdGFnZTFfNV9tYXBbXSA9CisgIHsKKyAgICB7ImV4dDJmcyIsICAgIi9lMmZzX3N0YWdlMV81In0sCisgICAgeyJmYXQiLCAgICAgICIvZmF0X3N0YWdlMV81In0sCisgICAgeyJ1ZnMyIiwgICAgICIvdWZzMl9zdGFnZTFfNSJ9LAorICAgIHsiZmZzIiwgICAgICAiL2Zmc19zdGFnZTFfNSJ9LAorICAgIHsiaXNvOTY2MCIsICAiL2lzbzk2NjBfc3RhZ2UxXzUifSwKKyAgICB7ImpmcyIsICAgICAgIi9qZnNfc3RhZ2UxXzUifSwKKyAgICB7Im1pbml4IiwgICAgIi9taW5peF9zdGFnZTFfNSJ9LAorICAgIHsicmVpc2VyZnMiLCAiL3JlaXNlcmZzX3N0YWdlMV81In0sCisgICAgeyJ2c3RhZnMiLCAgICIvdnN0YWZzX3N0YWdlMV81In0sCisgICAgeyJ4ZnMiLCAgICAgICIveGZzX3N0YWdlMV81In0KKyAgfTsKKworICB0bXBfZHJpdmUgPSBzYXZlZF9kcml2ZTsKKyAgdG1wX3BhcnRpdGlvbiA9IHNhdmVkX3BhcnRpdGlvbjsKKworICAvKiBDaGVjayBpZiB0aGUgdXNlciBzcGVjaWZpZXMgLS1mb3JjZS1sYmEuICAqLworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpZiAoZ3J1Yl9tZW1jbXAgKCItLWZvcmNlLWxiYSIsIGFyZywgc2l6ZW9mICgiLS1mb3JjZS1sYmEiKSAtIDEpID09IDApCisJeworCSAgaXNfZm9yY2VfbGJhID0gMTsKKwkgIGFyZyA9IHNraXBfdG8gKDAsIGFyZyk7CisJfQorICAgICAgZWxzZSBpZiAoZ3J1Yl9tZW1jbXAgKCItLXByZWZpeD0iLCBhcmcsIHNpemVvZiAoIi0tcHJlZml4PSIpIC0gMSkgPT0gMCkKKwl7CisJICBwcmVmaXggPSBhcmcgKyBzaXplb2YgKCItLXByZWZpeD0iKSAtIDE7CisJICBhcmcgPSBza2lwX3RvICgwLCBhcmcpOworCSAgbnVsX3Rlcm1pbmF0ZSAocHJlZml4KTsKKwl9CisjaWZkZWYgR1JVQl9VVElMCisgICAgICBlbHNlIGlmIChncnViX21lbWNtcCAoIi0tc3RhZ2UyPSIsIGFyZywgc2l6ZW9mICgiLS1zdGFnZTI9IikgLSAxKSA9PSAwKQorCXsKKwkgIHN0YWdlMl9hcmcgPSBhcmc7CisJICBhcmcgPSBza2lwX3RvICgwLCBhcmcpOworCSAgbnVsX3Rlcm1pbmF0ZSAoc3RhZ2UyX2FyZyk7CisJfQorI2VuZGlmIC8qIEdSVUJfVVRJTCAqLworICAgICAgZWxzZQorCWJyZWFrOworICAgIH0KKyAgCisgIGluc3RhbGxfcHRyID0gYXJnOworICBpbWFnZV9wdHIgPSBza2lwX3RvICgwLCBpbnN0YWxsX3B0cik7CisKKyAgLyogTWFrZSBzdXJlIHRoYXQgSU5TVEFMTF9QVFIgaXMgdmFsaWQuICAqLworICBzZXRfZGV2aWNlIChpbnN0YWxsX3B0cik7CisgIGlmIChlcnJudW0pCisgICAgcmV0dXJuIDE7CisKKyAgaW5zdGFsbGVkX2RyaXZlID0gY3VycmVudF9kcml2ZTsKKyAgaW5zdGFsbGVkX3BhcnRpdGlvbiA9IGN1cnJlbnRfcGFydGl0aW9uOworICAKKyAgLyogTW91bnQgdGhlIGRyaXZlIHBvaW50ZWQgYnkgSU1BR0VfUFRSLiAgKi8KKyAgaWYgKCppbWFnZV9wdHIpCisgICAgeworICAgICAgLyogSWYgdGhlIGRyaXZlL3BhcnRpdGlvbiB3aGVyZSB0aGUgaW1hZ2VzIHJlc2lkZSBpcyBzcGVjaWZpZWQsCisJIGdldCB0aGUgZHJpdmUgYW5kIHRoZSBwYXJ0aXRpb24uICAqLworICAgICAgc2V0X2RldmljZSAoaW1hZ2VfcHRyKTsKKyAgICAgIGlmIChlcnJudW0pCisJcmV0dXJuIDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogSWYgb21pdHRlZCwgdXNlIFNBVkVEX1BBUlRJVElPTiBhbmQgU0FWRURfRFJJVkUuICAqLworICAgICAgY3VycmVudF9kcml2ZSA9IHNhdmVkX2RyaXZlOworICAgICAgY3VycmVudF9wYXJ0aXRpb24gPSBzYXZlZF9wYXJ0aXRpb247CisgICAgfQorCisgIGltYWdlX2RyaXZlID0gc2F2ZWRfZHJpdmUgPSBjdXJyZW50X2RyaXZlOworICBpbWFnZV9wYXJ0aXRpb24gPSBzYXZlZF9wYXJ0aXRpb24gPSBjdXJyZW50X3BhcnRpdGlvbjsKKworICAvKiBPcGVuIGl0LiAgKi8KKyAgaWYgKCEgb3Blbl9kZXZpY2UgKCkpCisgICAgZ290byBmYWlsOworCisgIC8qIENoZWNrIGlmIHN0YWdlMSBleGlzdHMuIElmIHRoZSB1c2VyIGRvZXNuJ3Qgc3BlY2lmeSB0aGUgb3B0aW9uCisgICAgIGAtLXByZWZpeCcsIGF0dGVtcHQgL2Jvb3QvZ3J1YiBhbmQgL2dydWIuICAqLworICAvKiBOT1RFOiBJdCBpcyBkYW5nZXJvdXMgdG8gcnVuIHRoaXMgY29tbWFuZCB3aXRob3V0IGAtLXByZWZpeCcgaW4gdGhlCisgICAgIGdydWIgc2hlbGwsIHNpbmNlIHRoYXQgYWZmZWN0cyBgLS1zdGFnZTInLiAgKi8KKyAgaWYgKCEgcHJlZml4KQorICAgIHsKKyAgICAgIHByZWZpeCA9ICIvYm9vdC9ncnViIjsKKyAgICAgIGdydWJfc3ByaW50ZiAoc3RhZ2UxLCAiJXMlcyIsIHByZWZpeCwgIi9zdGFnZTEiKTsKKyAgICAgIGlmICghIGNoZWNrX2ZpbGUgKHN0YWdlMSkpCisJeworCSAgZXJybnVtID0gRVJSX05PTkU7CisJICBwcmVmaXggPSAiL2dydWIiOworCSAgZ3J1Yl9zcHJpbnRmIChzdGFnZTEsICIlcyVzIiwgcHJlZml4LCAiL3N0YWdlMSIpOworCSAgaWYgKCEgY2hlY2tfZmlsZSAoc3RhZ2UxKSkKKwkgICAgZ290byBmYWlsOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBncnViX3NwcmludGYgKHN0YWdlMSwgIiVzJXMiLCBwcmVmaXgsICIvc3RhZ2UxIik7CisgICAgICBpZiAoISBjaGVja19maWxlIChzdGFnZTEpKQorCWdvdG8gZmFpbDsKKyAgICB9CisKKyAgLyogVGhlIHByZWZpeCB3YXMgZGV0ZXJtaW5lZC4gICovCisgIGdydWJfc3ByaW50ZiAoc3RhZ2UyLCAiJXMlcyIsIHByZWZpeCwgIi9zdGFnZTIiKTsKKyAgZ3J1Yl9zcHJpbnRmIChjb25maWdfZmlsZW5hbWUsICIlcyVzIiwgcHJlZml4LCAiL21lbnUubHN0Iik7CisgICpyZWFsX2NvbmZpZ19maWxlbmFtZSA9IDA7CisKKyAgLyogQ2hlY2sgaWYgc3RhZ2UyIGV4aXN0cy4gICovCisgIGlmICghIGNoZWNrX2ZpbGUgKHN0YWdlMikpCisgICAgZ290byBmYWlsOworCisgIHsKKyAgICBjaGFyICpmc3lzID0gZnN5c190YWJsZVtmc3lzX3R5cGVdLm5hbWU7CisgICAgaW50IGk7CisgICAgaW50IHNpemUgPSBzaXplb2YgKHN0YWdlMV81X21hcCkgLyBzaXplb2YgKHN0YWdlMV81X21hcFswXSk7CisgICAgCisgICAgLyogSXRlcmF0ZSBmaW5kaW5nIHRoZSBzYW1lIGZpbGVzeXN0ZW0gbmFtZSBhcyBGU1lTLiAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgaWYgKGdydWJfc3RyY21wIChmc3lzLCBzdGFnZTFfNV9tYXBbaV0uZnN5cykgPT0gMCkKKwl7CisJICAvKiBPSywgY2hlY2sgaWYgdGhlIFN0YWdlIDEuNSBleGlzdHMuICAqLworCSAgY2hhciBzdGFnZTFfNVs2NF07CisJICAKKwkgIGdydWJfc3ByaW50ZiAoc3RhZ2UxXzUsICIlcyVzIiwgcHJlZml4LCBzdGFnZTFfNV9tYXBbaV0ubmFtZSk7CisJICBpZiAoY2hlY2tfZmlsZSAoc3RhZ2UxXzUpKQorCSAgICB7CisJICAgICAgaWYgKGVtYmVkX3N0YWdlMV81IChzdGFnZTFfNSwgCisJCQkJICAgIGluc3RhbGxlZF9kcml2ZSwgaW5zdGFsbGVkX3BhcnRpdGlvbikKKwkJICB8fCBlbWJlZF9zdGFnZTFfNSAoc3RhZ2UxXzUsIAorCQkJCSAgICAgaW1hZ2VfZHJpdmUsIGltYWdlX3BhcnRpdGlvbikpCisJCXsKKwkJICBncnViX3N0cmNweSAocmVhbF9jb25maWdfZmlsZW5hbWUsIGNvbmZpZ19maWxlbmFtZSk7CisJCSAgc3ByaW50X2RldmljZSAoaW1hZ2VfZHJpdmUsIGltYWdlX3BhcnRpdGlvbik7CisJCSAgZ3J1Yl9zcHJpbnRmIChjb25maWdfZmlsZW5hbWUsICIlcyVzIiwgZGV2aWNlLCBzdGFnZTIpOworCQkgIGdydWJfc3RyY3B5IChzdGFnZTIsIGJ1ZmZlcik7CisJCX0KKwkgICAgfQorCSAgZXJybnVtID0gMDsKKwkgIGJyZWFrOworCX0KKyAgfQorCisgIC8qIENvbnN0cnVjdCBhIHN0cmluZyB0aGF0IGlzIHVzZWQgYnkgdGhlIGNvbW1hbmQgImluc3RhbGwiIGFzIGl0cworICAgICBhcmd1bWVudHMuICAqLworICBzcHJpbnRfZGV2aWNlIChpbnN0YWxsZWRfZHJpdmUsIGluc3RhbGxlZF9wYXJ0aXRpb24pOworICAKKyNpZiAxCisgIC8qIERvbid0IGVtYmVkIGEgZHJpdmUgbnVtYmVyIHVubmVjZXNzYXJpbHkuICAqLworICBncnViX3NwcmludGYgKGNtZF9hcmcsICIlcyVzJXMlcyAlcyVzICVzIHAgJXMgJXMiLAorCQlpc19mb3JjZV9sYmE/ICItLWZvcmNlLWxiYSAiIDogIiIsCisJCXN0YWdlMl9hcmc/IHN0YWdlMl9hcmcgOiAiIiwKKwkJc3RhZ2UyX2FyZz8gIiAiIDogIiIsCisJCXN0YWdlMSwKKwkJKGluc3RhbGxlZF9kcml2ZSAhPSBpbWFnZV9kcml2ZSkgPyAiZCAiIDogIiIsCisJCWRldmljZSwKKwkJc3RhZ2UyLAorCQljb25maWdfZmlsZW5hbWUsCisJCXJlYWxfY29uZmlnX2ZpbGVuYW1lKTsKKyNlbHNlIC8qIE5PVCBVU0VEICovCisgIC8qIFRoaXMgY29kZSB3YXMgdXNlZCwgYmVjYXVzZSB3ZSBiZWxpdmVkIHNvbWUgQklPU2VzIGhhZCBhIHByb2JsZW0KKyAgICAgdGhhdCB0aGV5IGRpZG4ndCBwYXNzIGEgYm9vdGluZyBkcml2ZSBjb3JyZWN0bHkuIEl0IHR1cm5lZCBvdXQsCisgICAgIGhvd2V2ZXIsIHN0YWdlMSBjb3VsZCB0cmFzaCBhIGJvb3RpbmcgZHJpdmUgd2hlbiBjaGVja2luZyBMQkEgc3VwcG9ydCwKKyAgICAgYmVjYXVzZSBzb21lIEJJT1NlcyBtb2RpZmllZCB0aGUgcmVnaXN0ZXIgJWR4IGluIElOVCAxM0gsIEFIPTQ4SC4KKyAgICAgU28gaXQgYmVjYW1lZCB1bmNsZWFyIHdoZXRoZXIgR1JVQiBzaG91bGQgdXNlIGEgcHJlLWRlZmluZWQgYm9vdGluZworICAgICBkcml2ZSBvciBub3QuIElmIHRoZSBwcm9ibGVtIHN0aWxsIGV4aXN0cywgaXQgd291bGQgYmUgbmVjZXNzYXJ5IHRvCisgICAgIHN3aXRjaCBiYWNrIHRvIHRoaXMgY29kZS4gICovCisgIGdydWJfc3ByaW50ZiAoY21kX2FyZywgIiVzJXMlcyVzIGQgJXMgJXMgcCAlcyAlcyIsCisJCWlzX2ZvcmNlX2xiYT8gIi0tZm9yY2UtbGJhICIgOiAiIiwKKwkJc3RhZ2UyX2FyZz8gc3RhZ2UyX2FyZyA6ICIiLAorCQlzdGFnZTJfYXJnPyAiICIgOiAiIiwKKwkJc3RhZ2UxLAorCQlkZXZpY2UsCisJCXN0YWdlMiwKKwkJY29uZmlnX2ZpbGVuYW1lLAorCQlyZWFsX2NvbmZpZ19maWxlbmFtZSk7CisjZW5kaWYgLyogTk9UIFVTRUQgKi8KKyAgCisgIC8qIE5vdGlmeSB3aGF0IHdpbGwgYmUgcnVuLiAgKi8KKyAgZ3J1Yl9wcmludGYgKCIgUnVubmluZyBcImluc3RhbGwgJXNcIi4uLiAiLCBjbWRfYXJnKTsKKworICAvKiBNYWtlIHN1cmUgdGhhdCBTQVZFRF9EUklWRSBhbmQgU0FWRURfUEFSVElUSU9OIGFyZSBpZGVudGljYWwKKyAgICAgd2l0aCBJTUFHRV9EUklWRSBhbmQgSU1BR0VfUEFSVElUSU9OLCByZXNwZWN0aXZlbHkuICAqLworICBzYXZlZF9kcml2ZSA9IGltYWdlX2RyaXZlOworICBzYXZlZF9wYXJ0aXRpb24gPSBpbWFnZV9wYXJ0aXRpb247CisgIAorICAvKiBSdW4gdGhlIGNvbW1hbmQuICAqLworICBpZiAoISBpbnN0YWxsX2Z1bmMgKGNtZF9hcmcsIGZsYWdzKSkKKyAgICBncnViX3ByaW50ZiAoInN1Y2NlZWRlZFxuRG9uZS5cbiIpOworICBlbHNlCisgICAgZ3J1Yl9wcmludGYgKCJmYWlsZWRcbiIpOworCisgZmFpbDoKKyAgc2F2ZWRfZHJpdmUgPSB0bXBfZHJpdmU7CisgIHNhdmVkX3BhcnRpdGlvbiA9IHRtcF9wYXJ0aXRpb247CisgIHJldHVybiBlcnJudW07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX3NldHVwID0KK3sKKyAgInNldHVwIiwKKyAgc2V0dXBfZnVuYywKKyAgQlVJTFRJTl9DTURMSU5FIHwgQlVJTFRJTl9IRUxQX0xJU1QsCisgICJzZXR1cCBbLS1wcmVmaXg9RElSXSBbLS1zdGFnZTI9U1RBR0UyX0ZJTEVdIFstLWZvcmNlLWxiYV0gSU5TVEFMTF9ERVZJQ0UgW0lNQUdFX0RFVklDRV0iLAorICAiU2V0IHVwIHRoZSBpbnN0YWxsYXRpb24gb2YgR1JVQiBhdXRvbWF0aWNhbGx5LiBUaGlzIGNvbW1hbmQgdXNlcyIKKyAgIiB0aGUgbW9yZSBmbGV4aWJsZSBjb21tYW5kIFwiaW5zdGFsbFwiIGluIHRoZSBiYWNrZW5kIGFuZCBpbnN0YWxscyIKKyAgIiBHUlVCIGludG8gdGhlIGRldmljZSBJTlNUQUxMX0RFVklDRS4gSWYgSU1BR0VfREVWSUNFIGlzIHNwZWNpZmllZCwiCisgICIgdGhlbiBmaW5kIHRoZSBHUlVCIGltYWdlcyBpbiB0aGUgZGV2aWNlIElNQUdFX0RFVklDRSwgb3RoZXJ3aXNlIgorICAiIHVzZSB0aGUgY3VycmVudCBcInJvb3QgZGV2aWNlXCIsIHdoaWNoIGNhbiBiZSBzZXQgYnkgdGhlIGNvbW1hbmQiCisgICIgXCJyb290XCIuIElmIHlvdSBrbm93IHRoYXQgeW91ciBCSU9TIHNob3VsZCBzdXBwb3J0IExCQSBidXQgR1JVQiIKKyAgIiBkb2Vzbid0IHdvcmsgaW4gTEJBIG1vZGUsIHNwZWNpZnkgdGhlIG9wdGlvbiBgLS1mb3JjZS1sYmEnLiIKKyAgIiBJZiB5b3UgaW5zdGFsbCBHUlVCIHVuZGVyIHRoZSBncnViIHNoZWxsIGFuZCB5b3UgY2Fubm90IHVubW91bnQgdGhlIgorICAiIHBhcnRpdGlvbiB3aGVyZSBHUlVCIGltYWdlcyByZXNpZGUsIHNwZWNpZnkgdGhlIG9wdGlvbiBgLS1zdGFnZTInIgorICAiIHRvIHRlbGwgR1JVQiB0aGUgZmlsZSBuYW1lIHVuZGVyIHlvdXIgT1MuIgorfTsKKworDAorI2lmIGRlZmluZWQoU1VQUE9SVF9TRVJJQUwpIHx8IGRlZmluZWQoU1VQUE9SVF9IRVJDVUxFUykKKy8qIHRlcm1pbmFsICovCitzdGF0aWMgaW50Cit0ZXJtaW5hbF9mdW5jIChjaGFyICphcmcsIGludCBmbGFncykKK3sKKyAgLyogVGhlIGluZGV4IG9mIHRoZSBkZWZhdWx0IHRlcm1pbmFsIGluIFRFUk1fVEFCTEUuICAqLworICBpbnQgZGVmYXVsdF90ZXJtID0gLTE7CisgIHN0cnVjdCB0ZXJtX2VudHJ5ICpwcmV2X3Rlcm0gPSBjdXJyZW50X3Rlcm07CisgIGludCB0byA9IC0xOworICBpbnQgbGluZXMgPSAwOworICBpbnQgbm9fbWVzc2FnZSA9IDA7CisgIHVuc2lnbmVkIGxvbmcgdGVybV9mbGFncyA9IDA7CisgIC8qIFhYWDogQXNzdW1lIGxlc3MgdGhhbiAzMiB0ZXJtaW5hbHMuICAqLworICB1bnNpZ25lZCBsb25nIHRlcm1fYml0bWFwID0gMDsKKworICAvKiBHZXQgR05VLXN0eWxlIGxvbmcgb3B0aW9ucy4gICovCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGlmIChncnViX21lbWNtcCAoYXJnLCAiLS1kdW1iIiwgc2l6ZW9mICgiLS1kdW1iIikgLSAxKSA9PSAwKQorCXRlcm1fZmxhZ3MgfD0gVEVSTV9EVU1COworICAgICAgZWxzZSBpZiAoZ3J1Yl9tZW1jbXAgKGFyZywgIi0tbm8tZWNobyIsIHNpemVvZiAoIi0tbm8tZWNobyIpIC0gMSkgPT0gMCkKKwkvKiBgYC0tbm8tZWNobycnIGltcGxpZXMgYGAtLW5vLWVkaXQnJy4gICovCisJdGVybV9mbGFncyB8PSAoVEVSTV9OT19FQ0hPIHwgVEVSTV9OT19FRElUKTsKKyAgICAgIGVsc2UgaWYgKGdydWJfbWVtY21wIChhcmcsICItLW5vLWVkaXQiLCBzaXplb2YgKCItLW5vLWVkaXQiKSAtIDEpID09IDApCisJdGVybV9mbGFncyB8PSBURVJNX05PX0VESVQ7CisgICAgICBlbHNlIGlmIChncnViX21lbWNtcCAoYXJnLCAiLS10aW1lb3V0PSIsIHNpemVvZiAoIi0tdGltZW91dD0iKSAtIDEpID09IDApCisJeworCSAgY2hhciAqdmFsID0gYXJnICsgc2l6ZW9mICgiLS10aW1lb3V0PSIpIC0gMTsKKwkgIAorCSAgaWYgKCEgc2FmZV9wYXJzZV9tYXhpbnQgKCZ2YWwsICZ0bykpCisJICAgIHJldHVybiAxOworCX0KKyAgICAgIGVsc2UgaWYgKGdydWJfbWVtY21wIChhcmcsICItLWxpbmVzPSIsIHNpemVvZiAoIi0tbGluZXM9IikgLSAxKSA9PSAwKQorCXsKKwkgIGNoYXIgKnZhbCA9IGFyZyArIHNpemVvZiAoIi0tbGluZXM9IikgLSAxOworCisJICBpZiAoISBzYWZlX3BhcnNlX21heGludCAoJnZhbCwgJmxpbmVzKSkKKwkgICAgcmV0dXJuIDE7CisKKwkgIC8qIFByb2JhYmx5IGxlc3MgdGhhbiBmb3VyIGlzIG1lYW5pbmdsZXNzLi4uLiAgKi8KKwkgIGlmIChsaW5lcyA8IDQpCisJICAgIHsKKwkgICAgICBlcnJudW0gPSBFUlJfQkFEX0FSR1VNRU5UOworCSAgICAgIHJldHVybiAxOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoZ3J1Yl9tZW1jbXAgKGFyZywgIi0tc2lsZW50Iiwgc2l6ZW9mICgiLS1zaWxlbnQiKSAtIDEpID09IDApCisJbm9fbWVzc2FnZSA9IDE7CisgICAgICBlbHNlCisJYnJlYWs7CisKKyAgICAgIGFyZyA9IHNraXBfdG8gKDAsIGFyZyk7CisgICAgfQorICAKKyAgLyogSWYgbm8gYXJndW1lbnQgaXMgc3BlY2lmaWVkLCBzaG93IGN1cnJlbnQgc2V0dGluZy4gICovCisgIGlmICghICphcmcpCisgICAgeworICAgICAgZ3J1Yl9wcmludGYgKCIlcyVzJXMlc1xuIiwKKwkJICAgY3VycmVudF90ZXJtLT5uYW1lLAorCQkgICBjdXJyZW50X3Rlcm0tPmZsYWdzICYgVEVSTV9EVU1CID8gIiAoZHVtYikiIDogIiIsCisJCSAgIGN1cnJlbnRfdGVybS0+ZmxhZ3MgJiBURVJNX05PX0VESVQgPyAiIChubyBlZGl0KSIgOiAiIiwKKwkJICAgY3VycmVudF90ZXJtLT5mbGFncyAmIFRFUk1fTk9fRUNITyA/ICIgKG5vIGVjaG8pIiA6ICIiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICB3aGlsZSAoKmFyZykKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIGNoYXIgKm5leHQgPSBza2lwX3RvICgwLCBhcmcpOworICAgICAgCisgICAgICBudWxfdGVybWluYXRlIChhcmcpOworCisgICAgICBmb3IgKGkgPSAwOyB0ZXJtX3RhYmxlW2ldLm5hbWU7IGkrKykKKwl7CisJICBpZiAoZ3J1Yl9zdHJjbXAgKGFyZywgdGVybV90YWJsZVtpXS5uYW1lKSA9PSAwKQorCSAgICB7CisJICAgICAgaWYgKHRlcm1fdGFibGVbaV0uZmxhZ3MgJiBURVJNX05FRURfSU5JVCkKKwkJeworCQkgIGVycm51bSA9IEVSUl9ERVZfTkVFRF9JTklUOworCQkgIHJldHVybiAxOworCQl9CisJICAgICAgCisJICAgICAgaWYgKGRlZmF1bHRfdGVybSA8IDApCisJCWRlZmF1bHRfdGVybSA9IGk7CisKKwkgICAgICB0ZXJtX2JpdG1hcCB8PSAoMSA8PCBpKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKworICAgICAgaWYgKCEgdGVybV90YWJsZVtpXS5uYW1lKQorCXsKKwkgIGVycm51bSA9IEVSUl9CQURfQVJHVU1FTlQ7CisJICByZXR1cm4gMTsKKwl9CisKKyAgICAgIGFyZyA9IG5leHQ7CisgICAgfQorCisgIC8qIElmIG11bHRpcGxlIHRlcm1pbmFscyBhcmUgc3BlY2lmaWVkLCB3YWl0IHVudGlsIHRoZSB1c2VyIHB1c2hlcyBhbnkKKyAgICAga2V5IG9uIG9uZSBvZiB0aGUgdGVybWluYWxzLiAgKi8KKyAgaWYgKHRlcm1fYml0bWFwICYgfigxIDw8IGRlZmF1bHRfdGVybSkpCisgICAgeworICAgICAgaW50IHRpbWUxLCB0aW1lMiA9IC0xOworCisgICAgICAvKiBYWFg6IERpc2FibGUgdGhlIHBhZ2VyLiAgKi8KKyAgICAgIGNvdW50X2xpbmVzID0gLTE7CisgICAgICAKKyAgICAgIC8qIEdldCBjdXJyZW50IHRpbWUuICAqLworICAgICAgd2hpbGUgKCh0aW1lMSA9IGdldHJ0c2VjcyAoKSkgPT0gMHhGRikKKwk7CisKKyAgICAgIC8qIFdhaXQgZm9yIGEga2V5IGlucHV0LiAgKi8KKyAgICAgIHdoaWxlICh0bykKKwl7CisJICBpbnQgaTsKKworCSAgZm9yIChpID0gMDsgdGVybV90YWJsZVtpXS5uYW1lOyBpKyspCisJICAgIHsKKwkgICAgICBpZiAodGVybV9iaXRtYXAgJiAoMSA8PCBpKSkKKwkJeworCQkgIGlmICh0ZXJtX3RhYmxlW2ldLmNoZWNra2V5ICgpID49IDApCisJCSAgICB7CisJCSAgICAgICh2b2lkKSB0ZXJtX3RhYmxlW2ldLmdldGtleSAoKTsKKwkJICAgICAgZGVmYXVsdF90ZXJtID0gaTsKKwkJICAgICAgCisJCSAgICAgIGdvdG8gZW5kOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgIAorCSAgLyogUHJvbXB0IHRoZSB1c2VyLCBvbmNlIHBlciBzZWMuICAqLworCSAgaWYgKCh0aW1lMSA9IGdldHJ0c2VjcyAoKSkgIT0gdGltZTIgJiYgdGltZTEgIT0gMHhGRikKKwkgICAgeworCSAgICAgIGlmICghIG5vX21lc3NhZ2UpCisJCXsKKwkJICAvKiBOZWVkIHRvIHNldCBDVVJSRU5UX1RFUk0gdG8gZWFjaCBvZiBzZWxlY3RlZAorCQkgICAgIHRlcm1pbmFscy4gICovCisJCSAgZm9yIChpID0gMDsgdGVybV90YWJsZVtpXS5uYW1lOyBpKyspCisJCSAgICBpZiAodGVybV9iaXRtYXAgJiAoMSA8PCBpKSkKKwkJICAgICAgeworCQkJY3VycmVudF90ZXJtID0gdGVybV90YWJsZSArIGk7CisJCQlncnViX3ByaW50ZiAoIlxyUHJlc3MgYW55IGtleSB0byBjb250aW51ZS5cbiIpOworCQkgICAgICB9CisJCSAgCisJCSAgLyogUmVzdG9yZSBDVVJSRU5UX1RFUk0uICAqLworCQkgIGN1cnJlbnRfdGVybSA9IHByZXZfdGVybTsKKwkJfQorCSAgICAgIAorCSAgICAgIHRpbWUyID0gdGltZTE7CisJICAgICAgaWYgKHRvID4gMCkKKwkJdG8tLTsKKwkgICAgfQorCX0KKyAgICB9CisKKyBlbmQ6CisgIGN1cnJlbnRfdGVybSA9IHRlcm1fdGFibGUgKyBkZWZhdWx0X3Rlcm07CisgIGN1cnJlbnRfdGVybS0+ZmxhZ3MgPSB0ZXJtX2ZsYWdzOworICAKKyAgaWYgKGxpbmVzKQorICAgIG1heF9saW5lcyA9IGxpbmVzOworICBlbHNlCisgICAgLyogMjQgd291bGQgYmUgYSBnb29kIGRlZmF1bHQgdmFsdWUuICAqLworICAgIG1heF9saW5lcyA9IDI0OworICAKKyAgLyogSWYgdGhlIGludGVyZmFjZSBpcyBjdXJyZW50bHkgdGhlIGNvbW1hbmQtbGluZSwKKyAgICAgcmVzdGFydCBpdCB0byByZXBhaW50IHRoZSBzY3JlZW4uICAqLworICBpZiAoY3VycmVudF90ZXJtICE9IHByZXZfdGVybSAmJiAoZmxhZ3MgJiBCVUlMVElOX0NNRExJTkUpKQorICAgIGdydWJfbG9uZ2ptcCAocmVzdGFydF9jbWRsaW5lX2VudiwgMCk7CisgIAorICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBidWlsdGluIGJ1aWx0aW5fdGVybWluYWwgPQoreworICAidGVybWluYWwiLAorICB0ZXJtaW5hbF9mdW5jLAorICBCVUlMVElOX01FTlUgfCBCVUlMVElOX0NNRExJTkUgfCBCVUlMVElOX0hFTFBfTElTVCwKKyAgInRlcm1pbmFsIFstLWR1bWJdIFstLW5vLWVjaG9dIFstLW5vLWVkaXRdIFstLXRpbWVvdXQ9U0VDU10gWy0tbGluZXM9TElORVNdIFstLXNpbGVudF0gW2NvbnNvbGVdIFtzZXJpYWxdIFtoZXJjdWxlc10iLAorICAiU2VsZWN0IGEgdGVybWluYWwuIFdoZW4gbXVsdGlwbGUgdGVybWluYWxzIGFyZSBzcGVjaWZpZWQsIHdhaXQgdW50aWwiCisgICIgeW91IHB1c2ggYW55IGtleSB0byBjb250aW51ZS4gSWYgYm90aCBjb25zb2xlIGFuZCBzZXJpYWwgYXJlIHNwZWNpZmllZCwiCisgICIgdGhlIHRlcm1pbmFsIHRvIHdoaWNoIHlvdSBpbnB1dCBhIGtleSBmaXJzdCB3aWxsIGJlIHNlbGVjdGVkLiBJZiBubyIKKyAgIiBhcmd1bWVudCBpcyBzcGVjaWZpZWQsIHByaW50IGN1cnJlbnQgc2V0dGluZy4gVGhlIG9wdGlvbiAtLWR1bWIiCisgICIgc3BlY2lmaWVzIHRoYXQgeW91ciB0ZXJtaW5hbCBpcyBkdW1iLCBvdGhlcndpc2UsIHZ0MTAwLWNvbXBhdGliaWxpdHkiCisgICIgaXMgYXNzdW1lZC4gSWYgeW91IHNwZWNpZnkgLS1uby1lY2hvLCBpbnB1dCBjaGFyYWN0ZXJzIHdvbid0IGJlIGVjaG9lZC4iCisgICIgSWYgeW91IHNwZWNpZnkgLS1uby1lZGl0LCB0aGUgQkFTSC1saWtlIGVkaXRpbmcgZmVhdHVyZSB3aWxsIGJlIGRpc2FibGVkLiIKKyAgIiBJZiAtLXRpbWVvdXQgaXMgcHJlc2VudCwgdGhpcyBjb21tYW5kIHdpbGwgd2FpdCBhdCBtb3N0IGZvciBTRUNTIgorICAiIHNlY29uZHMuIFRoZSBvcHRpb24gLS1saW5lcyBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzLiIKKyAgIiBUaGUgb3B0aW9uIC0tc2lsZW50IGlzIHVzZWQgdG8gc3VwcHJlc3MgbWVzc2FnZXMuIgorfTsKKyNlbmRpZiAvKiBTVVBQT1JUX1NFUklBTCB8fCBTVVBQT1JUX0hFUkNVTEVTICovCisKKwwKKyNpZmRlZiBTVVBQT1JUX1NFUklBTAorc3RhdGljIGludAordGVybWluZm9fZnVuYyAoY2hhciAqYXJnLCBpbnQgZmxhZ3MpCit7CisgIHN0cnVjdCB0ZXJtaW5mbyB0ZXJtOworCisgIGlmICgqYXJnKQorICAgIHsKKyAgICAgIHN0cnVjdAorICAgICAgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJY2hhciAqdmFyOworICAgICAgfQorICAgICAgb3B0aW9uc1tdID0KKwl7CisJICB7Ii0tbmFtZT0iLCB0ZXJtLm5hbWV9LAorCSAgeyItLWN1cnNvci1hZGRyZXNzPSIsIHRlcm0uY3Vyc29yX2FkZHJlc3N9LAorCSAgeyItLWNsZWFyLXNjcmVlbj0iLCB0ZXJtLmNsZWFyX3NjcmVlbn0sCisJICB7Ii0tZW50ZXItc3RhbmRvdXQtbW9kZT0iLCB0ZXJtLmVudGVyX3N0YW5kb3V0X21vZGV9LAorCSAgeyItLWV4aXQtc3RhbmRvdXQtbW9kZT0iLCB0ZXJtLmV4aXRfc3RhbmRvdXRfbW9kZX0KKwl9OworCisgICAgICBncnViX21lbXNldCAoJnRlcm0sIDAsIHNpemVvZiAodGVybSkpOworICAgICAgCisgICAgICB3aGlsZSAoKmFyZykKKwl7CisJICBpbnQgaTsKKwkgIGNoYXIgKm5leHQgPSBza2lwX3RvICgwLCBhcmcpOworCSAgICAgIAorCSAgbnVsX3Rlcm1pbmF0ZSAoYXJnKTsKKwkgIAorCSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0aW9ucykgLyBzaXplb2YgKG9wdGlvbnNbMF0pOyBpKyspCisJICAgIHsKKwkgICAgICBjb25zdCBjaGFyICpuYW1lID0gb3B0aW9uc1tpXS5uYW1lOworCSAgICAgIGludCBsZW4gPSBncnViX3N0cmxlbiAobmFtZSk7CisJICAgICAgCisJICAgICAgaWYgKCEgZ3J1Yl9tZW1jbXAgKGFyZywgbmFtZSwgbGVuKSkKKwkJeworCQkgIGdydWJfc3RyY3B5IChvcHRpb25zW2ldLnZhciwgdGlfdW5lc2NhcGVfc3RyaW5nIChhcmcgKyBsZW4pKTsKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisKKwkgIGlmIChpID09IHNpemVvZiAob3B0aW9ucykgLyBzaXplb2YgKG9wdGlvbnNbMF0pKQorCSAgICB7CisJICAgICAgZXJybnVtID0gRVJSX0JBRF9BUkdVTUVOVDsKKwkgICAgICByZXR1cm4gZXJybnVtOworCSAgICB9CisKKwkgIGFyZyA9IG5leHQ7CisJfQorCisgICAgICBpZiAodGVybS5uYW1lWzBdID09IDAgfHwgdGVybS5jdXJzb3JfYWRkcmVzc1swXSA9PSAwKQorCXsKKwkgIGVycm51bSA9IEVSUl9CQURfQVJHVU1FTlQ7CisJICByZXR1cm4gZXJybnVtOworCX0KKworICAgICAgdGlfc2V0X3Rlcm0gKCZ0ZXJtKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBObyBvcHRpb24gc3BlY2lmaWVzIHByaW50aW5nIG91dCBjdXJyZW50IHNldHRpbmdzLiAgKi8KKyAgICAgIHRpX2dldF90ZXJtICgmdGVybSk7CisKKyAgICAgIGdydWJfcHJpbnRmICgibmFtZT0lc1xuIiwKKwkJICAgdGlfZXNjYXBlX3N0cmluZyAodGVybS5uYW1lKSk7CisgICAgICBncnViX3ByaW50ZiAoImN1cnNvcl9hZGRyZXNzPSVzXG4iLAorCQkgICB0aV9lc2NhcGVfc3RyaW5nICh0ZXJtLmN1cnNvcl9hZGRyZXNzKSk7CisgICAgICBncnViX3ByaW50ZiAoImNsZWFyX3NjcmVlbj0lc1xuIiwKKwkJICAgdGlfZXNjYXBlX3N0cmluZyAodGVybS5jbGVhcl9zY3JlZW4pKTsKKyAgICAgIGdydWJfcHJpbnRmICgiZW50ZXJfc3RhbmRvdXRfbW9kZT0lc1xuIiwKKwkJICAgdGlfZXNjYXBlX3N0cmluZyAodGVybS5lbnRlcl9zdGFuZG91dF9tb2RlKSk7CisgICAgICBncnViX3ByaW50ZiAoImV4aXRfc3RhbmRvdXRfbW9kZT0lc1xuIiwKKwkJICAgdGlfZXNjYXBlX3N0cmluZyAodGVybS5leGl0X3N0YW5kb3V0X21vZGUpKTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX3Rlcm1pbmZvID0KK3sKKyAgInRlcm1pbmZvIiwKKyAgdGVybWluZm9fZnVuYywKKyAgQlVJTFRJTl9NRU5VIHwgQlVJTFRJTl9DTURMSU5FIHwgQlVJTFRJTl9IRUxQX0xJU1QsCisgICJ0ZXJtaW5mbyBbLS1uYW1lPU5BTUUgLS1jdXJzb3ItYWRkcmVzcz1TRVEgWy0tY2xlYXItc2NyZWVuPVNFUV0iCisgICIgWy0tZW50ZXItc3RhbmRvdXQtbW9kZT1TRVFdIFstLWV4aXQtc3RhbmRvdXQtbW9kZT1TRVFdXSIsCisgIAorICAiRGVmaW5lIHRoZSBjYXBhYmlsaXRpZXMgb2YgeW91ciB0ZXJtaW5hbC4gVXNlIHRoaXMgY29tbWFuZCB0byIKKyAgIiBkZWZpbmUgZXNjYXBlIHNlcXVlbmNlcywgaWYgaXQgaXMgbm90IHZ0MTAwLWNvbXBhdGlibGUuIgorICAiIFlvdSBtYXkgdXNlIFxcZSBmb3IgRVNDIGFuZCBeWCBmb3IgYSBjb250cm9sIGNoYXJhY3Rlci4iCisgICIgSWYgbm8gb3B0aW9uIGlzIHNwZWNpZmllZCwgdGhlIGN1cnJlbnQgc2V0dGluZ3MgYXJlIHByaW50ZWQuIgorfTsKKyNlbmRpZiAvKiBTVVBQT1JUX1NFUklBTCAqLworCSAgCisMCisvKiB0ZXN0bG9hZCAqLworc3RhdGljIGludAordGVzdGxvYWRfZnVuYyAoY2hhciAqYXJnLCBpbnQgZmxhZ3MpCit7CisgIGludCBpOworCisgIGtlcm5lbF90eXBlID0gS0VSTkVMX1RZUEVfTk9ORTsKKworICBpZiAoISBncnViX29wZW4gKGFyZykpCisgICAgcmV0dXJuIDE7CisKKyAgZGlza19yZWFkX2hvb2sgPSBkaXNrX3JlYWRfcHJpbnRfZnVuYzsKKworICAvKiBQZXJmb3JtIGZpbGVzeXN0ZW0gdGVzdCBvbiB0aGUgc3BlY2lmaWVkIGZpbGUuICAqLworICAvKiBSZWFkIHdob2xlIGZpbGUgZmlyc3QuICovCisgIGdydWJfcHJpbnRmICgiV2hvbGUgZmlsZTogIik7CisKKyAgZ3J1Yl9yZWFkICgoY2hhciAqKSBSQVdfQUREUiAoMHgxMDAwMDApLCAtMSk7CisKKyAgLyogTm93IGNvbXBhcmUgdHdvIHNlY3Rpb25zIG9mIHRoZSBmaWxlIHJlYWQgZGlmZmVyZW50bHkuICAqLworCisgIGZvciAoaSA9IDA7IGkgPCAweDEwYWMwOyBpKyspCisgICAgeworICAgICAgKigodW5zaWduZWQgY2hhciAqKSBSQVdfQUREUiAoMHgyMDAwMDAgKyBpKSkgPSAwOworICAgICAgKigodW5zaWduZWQgY2hhciAqKSBSQVdfQUREUiAoMHgzMDAwMDAgKyBpKSkgPSAxOworICAgIH0KKworICAvKiBGaXJzdCBwYXJ0aWFsIHJlYWQuICAqLworICBncnViX3ByaW50ZiAoIlxuUGFydGlhbCByZWFkIDE6ICIpOworCisgIGdydWJfc2VlayAoMCk7CisgIGdydWJfcmVhZCAoKGNoYXIgKikgUkFXX0FERFIgKDB4MjAwMDAwKSwgMHg3KTsKKyAgZ3J1Yl9yZWFkICgoY2hhciAqKSBSQVdfQUREUiAoMHgyMDAwMDcpLCAweDEwMCk7CisgIGdydWJfcmVhZCAoKGNoYXIgKikgUkFXX0FERFIgKDB4MjAwMTA3KSwgMHgxMCk7CisgIGdydWJfcmVhZCAoKGNoYXIgKikgUkFXX0FERFIgKDB4MjAwMTE3KSwgMHg5OTkpOworICBncnViX3JlYWQgKChjaGFyICopIFJBV19BRERSICgweDIwMGFiMCksIDB4MTApOworICBncnViX3JlYWQgKChjaGFyICopIFJBV19BRERSICgweDIwMGFjMCksIDB4MTAwMDApOworCisgIC8qIFNlY29uZCBwYXJ0aWFsIHJlYWQuICAqLworICBncnViX3ByaW50ZiAoIlxuUGFydGlhbCByZWFkIDI6ICIpOworCisgIGdydWJfc2VlayAoMCk7CisgIGdydWJfcmVhZCAoKGNoYXIgKikgUkFXX0FERFIgKDB4MzAwMDAwKSwgMHgxMDAwMCk7CisgIGdydWJfcmVhZCAoKGNoYXIgKikgUkFXX0FERFIgKDB4MzEwMDAwKSwgMHgxMCk7CisgIGdydWJfcmVhZCAoKGNoYXIgKikgUkFXX0FERFIgKDB4MzEwMDEwKSwgMHg3KTsKKyAgZ3J1Yl9yZWFkICgoY2hhciAqKSBSQVdfQUREUiAoMHgzMTAwMTcpLCAweDEwKTsKKyAgZ3J1Yl9yZWFkICgoY2hhciAqKSBSQVdfQUREUiAoMHgzMTAwMjcpLCAweDk5OSk7CisgIGdydWJfcmVhZCAoKGNoYXIgKikgUkFXX0FERFIgKDB4MzEwOWMwKSwgMHgxMDApOworCisgIGdydWJfcHJpbnRmICgiXG5IZWFkZXIxID0gMHgleCwgbmV4dCA9IDB4JXgsIG5leHQgPSAweCV4LCBuZXh0ID0gMHgleFxuIiwKKwkgICAgICAgKigoaW50ICopIFJBV19BRERSICgweDIwMDAwMCkpLAorCSAgICAgICAqKChpbnQgKikgUkFXX0FERFIgKDB4MjAwMDA0KSksCisJICAgICAgICooKGludCAqKSBSQVdfQUREUiAoMHgyMDAwMDgpKSwKKwkgICAgICAgKigoaW50ICopIFJBV19BRERSICgweDIwMDAwYykpKTsKKworICBncnViX3ByaW50ZiAoIkhlYWRlcjIgPSAweCV4LCBuZXh0ID0gMHgleCwgbmV4dCA9IDB4JXgsIG5leHQgPSAweCV4XG4iLAorCSAgICAgICAqKChpbnQgKikgUkFXX0FERFIgKDB4MzAwMDAwKSksCisJICAgICAgICooKGludCAqKSBSQVdfQUREUiAoMHgzMDAwMDQpKSwKKwkgICAgICAgKigoaW50ICopIFJBV19BRERSICgweDMwMDAwOCkpLAorCSAgICAgICAqKChpbnQgKikgUkFXX0FERFIgKDB4MzAwMDBjKSkpOworCisgIGZvciAoaSA9IDA7IGkgPCAweDEwYWMwOyBpKyspCisgICAgaWYgKCooKHVuc2lnbmVkIGNoYXIgKikgUkFXX0FERFIgKDB4MjAwMDAwICsgaSkpCisJIT0gKigodW5zaWduZWQgY2hhciAqKSBSQVdfQUREUiAoMHgzMDAwMDAgKyBpKSkpCisgICAgICBicmVhazsKKworICBncnViX3ByaW50ZiAoIk1heCBpcyAweDEwYWMwOiBpPTB4JXgsIGZpbGVwb3M9MHgleFxuIiwgaSwgZmlsZXBvcyk7CisgIGRpc2tfcmVhZF9ob29rID0gMDsKKyAgZ3J1Yl9jbG9zZSAoKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX3Rlc3Rsb2FkID0KK3sKKyAgInRlc3Rsb2FkIiwKKyAgdGVzdGxvYWRfZnVuYywKKyAgQlVJTFRJTl9DTURMSU5FLAorICAidGVzdGxvYWQgRklMRSIsCisgICJSZWFkIHRoZSBlbnRpcmUgY29udGVudHMgb2YgRklMRSBpbiBzZXZlcmFsIGRpZmZlcmVudCB3YXlzIGFuZCIKKyAgIiBjb21wYXJlcyB0aGVtLCB0byB0ZXN0IHRoZSBmaWxlc3lzdGVtIGNvZGUuIFRoZSBvdXRwdXQgaXMgc29tZXdoYXQiCisgICIgY3J5cHRpYywgYnV0IGlmIG5vIGVycm9ycyBhcmUgcmVwb3J0ZWQgYW5kIHRoZSBmaW5hbCBgaT1YLCIKKyAgIiBmaWxlcG9zPVknIHJlYWRpbmcgaGFzIFggYW5kIFkgZXF1YWwsIHRoZW4gaXQgaXMgZGVmaW5pdGVseSIKKyAgIiBjb25zaXN0ZW50LCBhbmQgdmVyeSBsaWtlbHkgd29ya3MgY29ycmVjdGx5IHN1YmplY3QgdG8gYSIKKyAgIiBjb25zaXN0ZW50IG9mZnNldCBlcnJvci4gSWYgdGhpcyB0ZXN0IHN1Y2NlZWRzLCB0aGVuIGEgZ29vZCBuZXh0IgorICAiIHN0ZXAgaXMgdG8gdHJ5IGxvYWRpbmcgYSBrZXJuZWwuIgorfTsKKworDAorLyogdGVzdHZiZSBNT0RFICovCitzdGF0aWMgaW50Cit0ZXN0dmJlX2Z1bmMgKGNoYXIgKmFyZywgaW50IGZsYWdzKQoreworICBpbnQgbW9kZV9udW1iZXI7CisgIHN0cnVjdCB2YmVfY29udHJvbGxlciBjb250cm9sbGVyOworICBzdHJ1Y3QgdmJlX21vZGUgbW9kZTsKKyAgCisgIGlmICghICphcmcpCisgICAgeworICAgICAgZXJybnVtID0gRVJSX0JBRF9BUkdVTUVOVDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBpZiAoISBzYWZlX3BhcnNlX21heGludCAoJmFyZywgJm1vZGVfbnVtYmVyKSkKKyAgICByZXR1cm4gMTsKKworICAvKiBQcmVzZXQgYFZCRTInLiAgKi8KKyAgZ3J1Yl9tZW1tb3ZlIChjb250cm9sbGVyLnNpZ25hdHVyZSwgIlZCRTIiLCA0KTsKKworICAvKiBEZXRlY3QgVkJFIEJJT1MuICAqLworICBpZiAoZ2V0X3ZiZV9jb250cm9sbGVyX2luZm8gKCZjb250cm9sbGVyKSAhPSAweDAwNEYpCisgICAgeworICAgICAgZ3J1Yl9wcmludGYgKCIgVkJFIEJJT1MgaXMgbm90IHByZXNlbnQuXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgCisgIGlmIChjb250cm9sbGVyLnZlcnNpb24gPCAweDAyMDApCisgICAgeworICAgICAgZ3J1Yl9wcmludGYgKCIgVkJFIHZlcnNpb24gJWQuJWQgaXMgbm90IHN1cHBvcnRlZC5cbiIsCisJCSAgIChpbnQpIChjb250cm9sbGVyLnZlcnNpb24gPj4gOCksCisJCSAgIChpbnQpIChjb250cm9sbGVyLnZlcnNpb24gJiAweEZGKSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKGdldF92YmVfbW9kZV9pbmZvIChtb2RlX251bWJlciwgJm1vZGUpICE9IDB4MDA0RgorICAgICAgfHwgKG1vZGUubW9kZV9hdHRyaWJ1dGVzICYgMHgwMDkxKSAhPSAweDAwOTEpCisgICAgeworICAgICAgZ3J1Yl9wcmludGYgKCIgTW9kZSAweCV4IGlzIG5vdCBzdXBwb3J0ZWQuXG4iLCBtb2RlX251bWJlcik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgLyogTm93IHRyaXAgdG8gdGhlIGdyYXBoaWNzIG1vZGUuICAqLworICBpZiAoc2V0X3ZiZV9tb2RlIChtb2RlX251bWJlciB8ICgxIDw8IDE0KSkgIT0gMHgwMDRGKQorICAgIHsKKyAgICAgIGdydWJfcHJpbnRmICgiIFN3aXRjaGluZyB0byBNb2RlIDB4JXggZmFpbGVkLlxuIiwgbW9kZV9udW1iZXIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qIERyYXcgc29tZXRoaW5nIG9uIHRoZSBzY3JlZW4uLi4gICovCisgIHsKKyAgICB1bnNpZ25lZCBjaGFyICpiYXNlX2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIG1vZGUucGh5c19iYXNlOworICAgIGludCBzY2FubGluZSA9IGNvbnRyb2xsZXIudmVyc2lvbiA+PSAweDAzMDAKKyAgICAgID8gbW9kZS5saW5lYXJfYnl0ZXNfcGVyX3NjYW5saW5lIDogbW9kZS5ieXRlc19wZXJfc2NhbmxpbmU7CisgICAgLyogRklYTUU6IHRoaXMgYXNzdW1lcyB0aGF0IGFueSBkZXB0aCBpcyBhIG1vZHVsbyBvZiA4LiAgKi8KKyAgICBpbnQgYnBwID0gbW9kZS5iaXRzX3Blcl9waXhlbCAvIDg7CisgICAgaW50IHdpZHRoID0gbW9kZS54X3Jlc29sdXRpb247CisgICAgaW50IGhlaWdodCA9IG1vZGUueV9yZXNvbHV0aW9uOworICAgIGludCB4LCB5OworICAgIHVuc2lnbmVkIGNvbG9yID0gMDsKKworICAgIC8qIEl0ZXJhdGUgZHJhd2luZyBvbiB0aGUgc2NyZWVuLCB1bnRpbCB0aGUgdXNlciBoaXRzIGFueSBrZXkuICAqLworICAgIHdoaWxlIChjaGVja2tleSAoKSA9PSAtMSkKKyAgICAgIHsKKwlmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisJICB7CisJICAgIHVuc2lnbmVkIGNoYXIgKmxpbmVfYnVmID0gYmFzZV9idWYgKyBzY2FubGluZSAqIHk7CisJICAgIAorCSAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKwkgICAgICB7CisJCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IGxpbmVfYnVmICsgYnBwICogeDsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IGJwcDsgaSsrLCBidWYrKykKKwkJICAqYnVmID0gKGNvbG9yID4+IChpICogOCkpICYgMHhmZjsKKwkgICAgICB9CisKKwkgICAgY29sb3IrKzsKKwkgIH0KKyAgICAgIH0KKworICAgIC8qIERpc2NhcmQgdGhlIGlucHV0LiAgKi8KKyAgICBnZXRrZXkgKCk7CisgIH0KKyAgCisgIC8qIEJhY2sgdG8gdGhlIGRlZmF1bHQgdGV4dCBtb2RlLiAgKi8KKyAgaWYgKHNldF92YmVfbW9kZSAoMHgwMykgIT0gMHgwMDRGKQorICAgIHsKKyAgICAgIC8qIFdoeT8hICAqLworICAgICAgZ3J1Yl9yZWJvb3QgKCk7CisgICAgfQorCisgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJ1aWx0aW4gYnVpbHRpbl90ZXN0dmJlID0KK3sKKyAgInRlc3R2YmUiLAorICB0ZXN0dmJlX2Z1bmMsCisgIEJVSUxUSU5fQ01ETElORSB8IEJVSUxUSU5fSEVMUF9MSVNULAorICAidGVzdHZiZSBNT0RFIiwKKyAgIlRlc3QgdGhlIFZCRSBtb2RlIE1PREUuIEhpdCBhbnkga2V5IHRvIHJldHVybi4iCit9OworCisMCisjaWZkZWYgU1VQUE9SVF9ORVRCT09UCisvKiB0ZnRwc2VydmVyICovCitzdGF0aWMgaW50Cit0ZnRwc2VydmVyX2Z1bmMgKGNoYXIgKmFyZywgaW50IGZsYWdzKQoreworICBpZiAoISAqYXJnIHx8ICEgaWZjb25maWcgKDAsIDAsIDAsIGFyZykpCisgICAgeworICAgICAgZXJybnVtID0gRVJSX0JBRF9BUkdVTUVOVDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBwcmludF9uZXR3b3JrX2NvbmZpZ3VyYXRpb24gKCk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJ1aWx0aW4gYnVpbHRpbl90ZnRwc2VydmVyID0KK3sKKyAgInRmdHBzZXJ2ZXIiLAorICB0ZnRwc2VydmVyX2Z1bmMsCisgIEJVSUxUSU5fQ01ETElORSB8IEJVSUxUSU5fTUVOVSB8IEJVSUxUSU5fSEVMUF9MSVNULAorICAidGZ0cHNlcnZlciBJUEFERFIiLAorICAiT3ZlcnJpZGUgdGhlIFRGVFAgc2VydmVyIGFkZHJlc3MuIgorfTsKKyNlbmRpZiAvKiBTVVBQT1JUX05FVEJPT1QgKi8KKworDAorLyogdGltZW91dCAqLworc3RhdGljIGludAordGltZW91dF9mdW5jIChjaGFyICphcmcsIGludCBmbGFncykKK3sKKyAgaWYgKCEgc2FmZV9wYXJzZV9tYXhpbnQgKCZhcmcsICZncnViX3RpbWVvdXQpKQorICAgIHJldHVybiAxOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJ1aWx0aW4gYnVpbHRpbl90aW1lb3V0ID0KK3sKKyAgInRpbWVvdXQiLAorICB0aW1lb3V0X2Z1bmMsCisgIEJVSUxUSU5fTUVOVSwKKyNpZiAwCisgICJ0aW1lb3V0IFNFQyIsCisgICJTZXQgYSB0aW1lb3V0LCBpbiBTRUMgc2Vjb25kcywgYmVmb3JlIGF1dG9tYXRpY2FsbHkgYm9vdGluZyB0aGUiCisgICIgZGVmYXVsdCBlbnRyeSAobm9ybWFsbHkgdGhlIGZpcnN0IGVudHJ5IGRlZmluZWQpLiIKKyNlbmRpZgorfTsKKworDAorLyogdGl0bGUgKi8KK3N0YXRpYyBpbnQKK3RpdGxlX2Z1bmMgKGNoYXIgKmFyZywgaW50IGZsYWdzKQoreworICAvKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBhY3R1YWxseSB1c2VkIGF0IGxlYXN0IGN1cnJlbnRseS4gICovCisgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJ1aWx0aW4gYnVpbHRpbl90aXRsZSA9Cit7CisgICJ0aXRsZSIsCisgIHRpdGxlX2Z1bmMsCisgIEJVSUxUSU5fVElUTEUsCisjaWYgMAorICAidGl0bGUgW05BTUUgLi4uXSIsCisgICJTdGFydCBhIG5ldyBib290IGVudHJ5LCBhbmQgc2V0IGl0cyBuYW1lIHRvIHRoZSBjb250ZW50cyBvZiB0aGUiCisgICIgcmVzdCBvZiB0aGUgbGluZSwgc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3Qgbm9uLXNwYWNlIGNoYXJhY3Rlci4iCisjZW5kaWYKK307CisKKwwKKy8qIHVuaGlkZSAqLworc3RhdGljIGludAordW5oaWRlX2Z1bmMgKGNoYXIgKmFyZywgaW50IGZsYWdzKQoreworICBpZiAoISBzZXRfZGV2aWNlIChhcmcpKQorICAgIHJldHVybiAxOworCisgIGlmICghIHNldF9wYXJ0aXRpb25faGlkZGVuX2ZsYWcgKDApKQorICAgIHJldHVybiAxOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJ1aWx0aW4gYnVpbHRpbl91bmhpZGUgPQoreworICAidW5oaWRlIiwKKyAgdW5oaWRlX2Z1bmMsCisgIEJVSUxUSU5fQ01ETElORSB8IEJVSUxUSU5fTUVOVSB8IEJVSUxUSU5fSEVMUF9MSVNULAorICAidW5oaWRlIFBBUlRJVElPTiIsCisgICJVbmhpZGUgUEFSVElUSU9OIGJ5IGNsZWFyaW5nIHRoZSBcImhpZGRlblwiIGJpdCBpbiBpdHMiCisgICIgcGFydGl0aW9uIHR5cGUgY29kZS4iCit9OworCisMCisvKiB1cHBlcm1lbSAqLworc3RhdGljIGludAordXBwZXJtZW1fZnVuYyAoY2hhciAqYXJnLCBpbnQgZmxhZ3MpCit7CisgIGlmICghIHNhZmVfcGFyc2VfbWF4aW50ICgmYXJnLCAoaW50ICopICZtYmkubWVtX3VwcGVyKSkKKyAgICByZXR1cm4gMTsKKworICBtYmkuZmxhZ3MgJj0gfk1CX0lORk9fTUVNX01BUDsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVpbHRpbiBidWlsdGluX3VwcGVybWVtID0KK3sKKyAgInVwcGVybWVtIiwKKyAgdXBwZXJtZW1fZnVuYywKKyAgQlVJTFRJTl9DTURMSU5FIHwgQlVJTFRJTl9IRUxQX0xJU1QsCisgICJ1cHBlcm1lbSBLQllURVMiLAorICAiRm9yY2UgR1JVQiB0byBhc3N1bWUgdGhhdCBvbmx5IEtCWVRFUyBraWxvYnl0ZXMgb2YgdXBwZXIgbWVtb3J5IGFyZSIKKyAgIiBpbnN0YWxsZWQuICBBbnkgc3lzdGVtIGFkZHJlc3MgcmFuZ2UgbWFwcyBhcmUgZGlzY2FyZGVkLiIKK307CisKKwwKKy8qIHZiZXByb2JlICovCitzdGF0aWMgaW50Cit2YmVwcm9iZV9mdW5jIChjaGFyICphcmcsIGludCBmbGFncykKK3sKKyAgc3RydWN0IHZiZV9jb250cm9sbGVyIGNvbnRyb2xsZXI7CisgIHVuc2lnbmVkIHNob3J0ICptb2RlX2xpc3Q7CisgIGludCBtb2RlX251bWJlciA9IC0xOworICAKKyAgYXV0byB1bnNpZ25lZCBsb25nIHZiZV9mYXJfcHRyX3RvX2xpbmVhciAodW5zaWduZWQgbG9uZyk7CisgIAorICB1bnNpZ25lZCBsb25nIHZiZV9mYXJfcHRyX3RvX2xpbmVhciAodW5zaWduZWQgbG9uZyBwdHIpCisgICAgeworICAgICAgdW5zaWduZWQgc2hvcnQgc2VnID0gKHB0ciA+PiAxNik7CisgICAgICB1bnNpZ25lZCBzaG9ydCBvZmYgPSAocHRyICYgMHhGRkZGKTsKKworICAgICAgcmV0dXJuIChzZWcgPDwgNCkgKyBvZmY7CisgICAgfQorICAKKyAgaWYgKCphcmcpCisgICAgeworICAgICAgaWYgKCEgc2FmZV9wYXJzZV9tYXhpbnQgKCZhcmcsICZtb2RlX251bWJlcikpCisJcmV0dXJuIDE7CisgICAgfQorICAKKyAgLyogU2V0IHRoZSBzaWduYXR1cmUgdG8gYFZCRTInLCB0byBvYnRhaW4gVkJFIDMuMCBpbmZvcm1hdGlvbi4gICovCisgIGdydWJfbWVtbW92ZSAoY29udHJvbGxlci5zaWduYXR1cmUsICJWQkUyIiwgNCk7CisgIAorICBpZiAoZ2V0X3ZiZV9jb250cm9sbGVyX2luZm8gKCZjb250cm9sbGVyKSAhPSAweDAwNEYpCisgICAgeworICAgICAgZ3J1Yl9wcmludGYgKCIgVkJFIEJJT1MgaXMgbm90IHByZXNlbnQuXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBDaGVjayB0aGUgdmVyc2lvbi4gICovCisgIGlmIChjb250cm9sbGVyLnZlcnNpb24gPCAweDAyMDApCisgICAgeworICAgICAgZ3J1Yl9wcmludGYgKCIgVkJFIHZlcnNpb24gJWQuJWQgaXMgbm90IHN1cHBvcnRlZC5cbiIsCisJCSAgIChpbnQpIChjb250cm9sbGVyLnZlcnNpb24gPj4gOCksCisJCSAgIChpbnQpIChjb250cm9sbGVyLnZlcnNpb24gJiAweEZGKSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgLyogUHJpbnQgc29tZSBpbmZvcm1hdGlvbi4gICovCisgIGdydWJfcHJpbnRmICgiIFZCRSB2ZXJzaW9uICVkLiVkXG4iLAorCSAgICAgICAoaW50KSAoY29udHJvbGxlci52ZXJzaW9uID4+IDgpLAorCSAgICAgICAoaW50KSAoY29udHJvbGxlci52ZXJzaW9uICYgMHhGRikpOworCisgIC8qIEl0ZXJhdGUgcHJvYmluZyBtb2Rlcy4gICovCisgIGZvciAobW9kZV9saXN0CisJID0gKHVuc2lnbmVkIHNob3J0ICopIHZiZV9mYXJfcHRyX3RvX2xpbmVhciAoY29udHJvbGxlci52aWRlb19tb2RlKTsKKyAgICAgICAqbW9kZV9saXN0ICE9IDB4RkZGRjsKKyAgICAgICBtb2RlX2xpc3QrKykKKyAgICB7CisgICAgICBzdHJ1Y3QgdmJlX21vZGUgbW9kZTsKKyAgICAgIAorICAgICAgaWYgKGdldF92YmVfbW9kZV9pbmZvICgqbW9kZV9saXN0LCAmbW9kZSkgIT0gMHgwMDRGKQorCWNvbnRpbnVlOworCisgICAgICAvKiBTa2lwIHRoaXMsIGlmIHRoaXMgaXMgbm90IHN1cHBvcnRlZCBvciBsaW5lYXIgZnJhbWUgYnVmZmVyCisJIG1vZGUgaXMgbm90IHN1cHBvcnQuICAqLworICAgICAgaWYgKChtb2RlLm1vZGVfYXR0cmlidXRlcyAmIDB4MDA4MSkgIT0gMHgwMDgxKQorCWNvbnRpbnVlOworCisgICAgICBpZiAobW9kZV9udW1iZXIgPT0gLTEgfHwgbW9kZV9udW1iZXIgPT0gKm1vZGVfbGlzdCkKKwl7CisJICBjaGFyICptb2RlbDsKKwkgIHN3aXRjaCAobW9kZS5tZW1vcnlfbW9kZWwpCisJICAgIHsKKwkgICAgY2FzZSAweDAwOiBtb2RlbCA9ICJUZXh0IjsgYnJlYWs7CisJICAgIGNhc2UgMHgwMTogbW9kZWwgPSAiQ0dBIGdyYXBoaWNzIjsgYnJlYWs7CisJICAgIGNhc2UgMHgwMjogbW9kZWwgPSAiSGVyY3VsZXMgZ3JhcGhpY3MiOyBicmVhazsKKwkgICAgY2FzZSAweDAzOiBtb2RlbCA9ICJQbGFuYXIiOyBicmVhazsKKwkgICAgY2FzZSAweDA0OiBtb2RlbCA9ICJQYWNrZWQgcGl4ZWwiOyBicmVhazsKKwkgICAgY2FzZSAweDA1OiBtb2RlbCA9ICJOb24tY2hhaW4gNCwgMjU2IGNvbG9yIjsgYnJlYWs7CisJICAgIGNhc2UgMHgwNjogbW9kZWwgPSAiRGlyZWN0IENvbG9yIjsgYnJlYWs7CisJICAgIGNhc2UgMHgwNzogbW9kZWwgPSAiWVVWIjsgYnJlYWs7CisJICAgIGRlZmF1bHQ6IG1vZGVsID0gIlVua25vd24iOyBicmVhazsKKwkgICAgfQorCSAgCisJICBncnViX3ByaW50ZiAoIiAgMHgleDogJXMsICV1eCV1eCV1XG4iLAorCQkgICAgICAgKHVuc2lnbmVkKSAqbW9kZV9saXN0LAorCQkgICAgICAgbW9kZWwsCisJCSAgICAgICAodW5zaWduZWQpIG1vZGUueF9yZXNvbHV0aW9uLAorCQkgICAgICAgKHVuc2lnbmVkKSBtb2RlLnlfcmVzb2x1dGlvbiwKKwkJICAgICAgICh1bnNpZ25lZCkgbW9kZS5iaXRzX3Blcl9waXhlbCk7CisJICAKKwkgIGlmIChtb2RlX251bWJlciAhPSAtMSkKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICBpZiAobW9kZV9udW1iZXIgIT0gLTEgJiYgbW9kZV9udW1iZXIgIT0gKm1vZGVfbGlzdCkKKyAgICBncnViX3ByaW50ZiAoIiAgTW9kZSAweCV4IGlzIG5vdCBmb3VuZCBvciBzdXBwb3J0ZWQuXG4iLCBtb2RlX251bWJlcik7CisgIAorICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBidWlsdGluIGJ1aWx0aW5fdmJlcHJvYmUgPQoreworICAidmJlcHJvYmUiLAorICB2YmVwcm9iZV9mdW5jLAorICBCVUlMVElOX0NNRExJTkUgfCBCVUlMVElOX0hFTFBfTElTVCwKKyAgInZiZXByb2JlIFtNT0RFXSIsCisgICJQcm9iZSBWQkUgaW5mb3JtYXRpb24uIElmIHRoZSBtb2RlIG51bWJlciBNT0RFIGlzIHNwZWNpZmllZCwgc2hvdyBvbmx5IgorICAiIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBvbmx5IHRoZSBtb2RlLiIKK307CisgIAorDAorLyogVGhlIHRhYmxlIG9mIGJ1aWx0aW4gY29tbWFuZHMuIFNvcnRlZCBpbiBkaWN0aW9uYXJ5IG9yZGVyLiAgKi8KK3N0cnVjdCBidWlsdGluICpidWlsdGluX3RhYmxlW10gPQoreworICAmYnVpbHRpbl9ibG9ja2xpc3QsCisgICZidWlsdGluX2Jvb3QsCisjaWZkZWYgU1VQUE9SVF9ORVRCT09UCisgICZidWlsdGluX2Jvb3RwLAorI2VuZGlmIC8qIFNVUFBPUlRfTkVUQk9PVCAqLworICAmYnVpbHRpbl9jYXQsCisgICZidWlsdGluX2NoYWlubG9hZGVyLAorICAmYnVpbHRpbl9jbWRsaW5lLAorICAmYnVpbHRpbl9jbXAsCisgICZidWlsdGluX2NvbG9yLAorICAmYnVpbHRpbl9jb25maWdmaWxlLAorICAmYnVpbHRpbl9kZWJ1ZywKKyAgJmJ1aWx0aW5fZGVmYXVsdCwKKyNpZmRlZiBHUlVCX1VUSUwKKyAgJmJ1aWx0aW5fZGV2aWNlLAorI2VuZGlmIC8qIEdSVUJfVVRJTCAqLworI2lmZGVmIFNVUFBPUlRfTkVUQk9PVAorICAmYnVpbHRpbl9kaGNwLAorI2VuZGlmIC8qIFNVUFBPUlRfTkVUQk9PVCAqLworICAmYnVpbHRpbl9kaXNwbGF5YXBtLAorICAmYnVpbHRpbl9kaXNwbGF5bWVtLAorI2lmZGVmIEdSVUJfVVRJTAorICAmYnVpbHRpbl9kdW1wLAorI2VuZGlmIC8qIEdSVUJfVVRJTCAqLworICAmYnVpbHRpbl9lbWJlZCwKKyAgJmJ1aWx0aW5fZmFsbGJhY2ssCisgICZidWlsdGluX2ZpbmQsCisgICZidWlsdGluX2ZzdGVzdCwKKyAgJmJ1aWx0aW5fZ2VvbWV0cnksCisgICZidWlsdGluX2hhbHQsCisgICZidWlsdGluX2hlbHAsCisgICZidWlsdGluX2hpZGRlbm1lbnUsCisgICZidWlsdGluX2hpZGUsCisjaWZkZWYgU1VQUE9SVF9ORVRCT09UCisgICZidWlsdGluX2lmY29uZmlnLAorI2VuZGlmIC8qIFNVUFBPUlRfTkVUQk9PVCAqLworICAmYnVpbHRpbl9pbXBzcHJvYmUsCisgICZidWlsdGluX2luaXRyZCwKKyAgJmJ1aWx0aW5faW5zdGFsbCwKKyAgJmJ1aWx0aW5faW9wcm9iZSwKKyAgJmJ1aWx0aW5fa2VybmVsLAorICAmYnVpbHRpbl9sb2NrLAorICAmYnVpbHRpbl9tYWtlYWN0aXZlLAorICAmYnVpbHRpbl9tYXAsCisjaWZkZWYgVVNFX01ENV9QQVNTV09SRFMKKyAgJmJ1aWx0aW5fbWQ1Y3J5cHQsCisjZW5kaWYgLyogVVNFX01ENV9QQVNTV09SRFMgKi8KKyAgJmJ1aWx0aW5fbW9kdWxlLAorICAmYnVpbHRpbl9tb2R1bGVub3VuemlwLAorICAmYnVpbHRpbl9wYWdlciwKKyAgJmJ1aWx0aW5fcGFydG5ldywKKyAgJmJ1aWx0aW5fcGFydHR5cGUsCisgICZidWlsdGluX3Bhc3N3b3JkLAorICAmYnVpbHRpbl9wYXVzZSwKKyNpZmRlZiBHUlVCX1VUSUwKKyAgJmJ1aWx0aW5fcXVpdCwKKyNlbmRpZiAvKiBHUlVCX1VUSUwgKi8KKyNpZmRlZiBTVVBQT1JUX05FVEJPT1QKKyAgJmJ1aWx0aW5fcmFycCwKKyNlbmRpZiAvKiBTVVBQT1JUX05FVEJPT1QgKi8KKyAgJmJ1aWx0aW5fcmVhZCwKKyAgJmJ1aWx0aW5fcmVib290LAorICAmYnVpbHRpbl9yb290LAorICAmYnVpbHRpbl9yb290bm92ZXJpZnksCisgICZidWlsdGluX3NhdmVkZWZhdWx0LAorI2lmZGVmIFNVUFBPUlRfU0VSSUFMCisgICZidWlsdGluX3NlcmlhbCwKKyNlbmRpZiAvKiBTVVBQT1JUX1NFUklBTCAqLworICAmYnVpbHRpbl9zZXRrZXksCisgICZidWlsdGluX3NldHVwLAorI2lmIGRlZmluZWQoU1VQUE9SVF9TRVJJQUwpIHx8IGRlZmluZWQoU1VQUE9SVF9IRVJDVUxFUykKKyAgJmJ1aWx0aW5fdGVybWluYWwsCisjZW5kaWYgLyogU1VQUE9SVF9TRVJJQUwgfHwgU1VQUE9SVF9IRVJDVUxFUyAqLworI2lmZGVmIFNVUFBPUlRfU0VSSUFMCisgICZidWlsdGluX3Rlcm1pbmZvLAorI2VuZGlmIC8qIFNVUFBPUlRfU0VSSUFMICovCisgICZidWlsdGluX3Rlc3Rsb2FkLAorICAmYnVpbHRpbl90ZXN0dmJlLAorI2lmZGVmIFNVUFBPUlRfTkVUQk9PVAorICAmYnVpbHRpbl90ZnRwc2VydmVyLAorI2VuZGlmIC8qIFNVUFBPUlRfTkVUQk9PVCAqLworICAmYnVpbHRpbl90aW1lb3V0LAorICAmYnVpbHRpbl90aXRsZSwKKyAgJmJ1aWx0aW5fdW5oaWRlLAorICAmYnVpbHRpbl91cHBlcm1lbSwKKyAgJmJ1aWx0aW5fdmJlcHJvYmUsCisgIDAKK307CmRpZmYgLS1naXQgYS9zdGFnZTIvY2hhcl9pby5jIGIvc3RhZ2UyL2NoYXJfaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODZjMjQwCi0tLSAvZGV2L251bGwKKysrIGIvc3RhZ2UyL2NoYXJfaW8uYwpAQCAtMCwwICsxLDEyODMgQEAKKy8qIGNoYXJfaW8uYyAtIGJhc2ljIGNvbnNvbGUgaW5wdXQgYW5kIG91dHB1dCAqLworLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSwyMDAyLDIwMDQgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHNoYXJlZC5oPgorI2luY2x1ZGUgPHRlcm0uaD4KKworI2lmZGVmIFNVUFBPUlRfSEVSQ1VMRVMKKyMgaW5jbHVkZSA8aGVyY3VsZXMuaD4KKyNlbmRpZgorCisjaWZkZWYgU1VQUE9SVF9TRVJJQUwKKyMgaW5jbHVkZSA8c2VyaWFsLmg+CisjZW5kaWYKKworI2lmbmRlZiBTVEFHRTFfNQorc3RydWN0IHRlcm1fZW50cnkgdGVybV90YWJsZVtdID0KKyAgeworICAgIHsKKyAgICAgICJjb25zb2xlIiwKKyAgICAgIDAsCisgICAgICBjb25zb2xlX3B1dGNoYXIsCisgICAgICBjb25zb2xlX2NoZWNra2V5LAorICAgICAgY29uc29sZV9nZXRrZXksCisgICAgICBjb25zb2xlX2dldHh5LAorICAgICAgY29uc29sZV9nb3RveHksCisgICAgICBjb25zb2xlX2NscywKKyAgICAgIGNvbnNvbGVfc2V0Y29sb3JzdGF0ZSwKKyAgICAgIGNvbnNvbGVfc2V0Y29sb3IsCisgICAgICBjb25zb2xlX3NldGN1cnNvcgorICAgIH0sCisjaWZkZWYgU1VQUE9SVF9TRVJJQUwKKyAgICB7CisgICAgICAic2VyaWFsIiwKKyAgICAgIC8qIEEgc2VyaWFsIGRldmljZSBtdXN0IGJlIGluaXRpYWxpemVkLiAgKi8KKyAgICAgIFRFUk1fTkVFRF9JTklULAorICAgICAgc2VyaWFsX3B1dGNoYXIsCisgICAgICBzZXJpYWxfY2hlY2trZXksCisgICAgICBzZXJpYWxfZ2V0a2V5LAorICAgICAgc2VyaWFsX2dldHh5LAorICAgICAgc2VyaWFsX2dvdG94eSwKKyAgICAgIHNlcmlhbF9jbHMsCisgICAgICBzZXJpYWxfc2V0Y29sb3JzdGF0ZSwKKyAgICAgIDAsCisgICAgICAwCisgICAgfSwKKyNlbmRpZiAvKiBTVVBQT1JUX1NFUklBTCAqLworI2lmZGVmIFNVUFBPUlRfSEVSQ1VMRVMKKyAgICB7CisgICAgICAiaGVyY3VsZXMiLAorICAgICAgMCwKKyAgICAgIGhlcmN1bGVzX3B1dGNoYXIsCisgICAgICBjb25zb2xlX2NoZWNra2V5LAorICAgICAgY29uc29sZV9nZXRrZXksCisgICAgICBoZXJjdWxlc19nZXR4eSwKKyAgICAgIGhlcmN1bGVzX2dvdG94eSwKKyAgICAgIGhlcmN1bGVzX2NscywKKyAgICAgIGhlcmN1bGVzX3NldGNvbG9yc3RhdGUsCisgICAgICBoZXJjdWxlc19zZXRjb2xvciwKKyAgICAgIGhlcmN1bGVzX3NldGN1cnNvcgorICAgIH0sICAgICAgCisjZW5kaWYgLyogU1VQUE9SVF9IRVJDVUxFUyAqLworICAgIC8qIFRoaXMgbXVzdCBiZSB0aGUgbGFzdCBlbnRyeS4gICovCisgICAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0KKyAgfTsKKworLyogVGhpcyBtdXN0IGJlIGNvbnNvbGUuICAqLworc3RydWN0IHRlcm1fZW50cnkgKmN1cnJlbnRfdGVybSA9IHRlcm1fdGFibGU7CisKK2ludCBtYXhfbGluZXMgPSAyNDsKK2ludCBjb3VudF9saW5lcyA9IC0xOworaW50IHVzZV9wYWdlciA9IDE7CisjZW5kaWYKKwordm9pZAorcHJpbnRfZXJyb3IgKHZvaWQpCit7CisgIGlmIChlcnJudW0gPiBFUlJfTk9ORSAmJiBlcnJudW0gPCBNQVhfRVJSX05VTSkKKyNpZm5kZWYgU1RBR0UxXzUKKyAgICAvKiBwcmludGYoIlw3XG4gJXNcbiIsIGVycl9saXN0W2Vycm51bV0pOyAqLworICAgIHByaW50ZiAoIlxuRXJyb3IgJXU6ICVzXG4iLCBlcnJudW0sIGVycl9saXN0W2Vycm51bV0pOworI2Vsc2UgLyogU1RBR0UxXzUgKi8KKyAgICBwcmludGYgKCJFcnJvciAldVxuIiwgZXJybnVtKTsKKyNlbmRpZiAvKiBTVEFHRTFfNSAqLworfQorCitjaGFyICoKK2NvbnZlcnRfdG9fYXNjaWkgKGNoYXIgKmJ1ZiwgaW50IGMsLi4uKQoreworICB1bnNpZ25lZCBsb25nIG51bSA9ICooKCZjKSArIDEpLCBtdWx0ID0gMTA7CisgIGNoYXIgKnB0ciA9IGJ1ZjsKKworI2lmbmRlZiBTVEFHRTFfNQorICBpZiAoYyA9PSAneCcgfHwgYyA9PSAnWCcpCisgICAgbXVsdCA9IDE2OworCisgIGlmICgobnVtICYgMHg4MDAwMDAwMHVMKSAmJiBjID09ICdkJykKKyAgICB7CisgICAgICBudW0gPSAofm51bSkgKyAxOworICAgICAgKihwdHIrKykgPSAnLSc7CisgICAgICBidWYrKzsKKyAgICB9CisjZW5kaWYKKworICBkbworICAgIHsKKyAgICAgIGludCBkaWcgPSBudW0gJSBtdWx0OworICAgICAgKihwdHIrKykgPSAoKGRpZyA+IDkpID8gZGlnICsgJ2EnIC0gMTAgOiAnMCcgKyBkaWcpOworICAgIH0KKyAgd2hpbGUgKG51bSAvPSBtdWx0KTsKKworICAvKiByZW9yZGVyIHRvIGNvcnJlY3QgZGlyZWN0aW9uISEgKi8KKyAgeworICAgIGNoYXIgKnB0cjEgPSBwdHIgLSAxOworICAgIGNoYXIgKnB0cjIgPSBidWY7CisgICAgd2hpbGUgKHB0cjEgPiBwdHIyKQorICAgICAgeworCWludCB0bXAgPSAqcHRyMTsKKwkqcHRyMSA9ICpwdHIyOworCSpwdHIyID0gdG1wOworCXB0cjEtLTsKKwlwdHIyKys7CisgICAgICB9CisgIH0KKworICByZXR1cm4gcHRyOworfQorCit2b2lkCitncnViX3B1dHN0ciAoY29uc3QgY2hhciAqc3RyKQoreworICB3aGlsZSAoKnN0cikKKyAgICBncnViX3B1dGNoYXIgKCpzdHIrKyk7Cit9CisKK3ZvaWQKK2dydWJfcHJpbnRmIChjb25zdCBjaGFyICpmb3JtYXQsLi4uKQoreworICBpbnQgKmRhdGFwdHIgPSAoaW50ICopICZmb3JtYXQ7CisgIGNoYXIgYywgc3RyWzE2XTsKKyAgCisgIGRhdGFwdHIrKzsKKworICB3aGlsZSAoKGMgPSAqKGZvcm1hdCsrKSkgIT0gMCkKKyAgICB7CisgICAgICBpZiAoYyAhPSAnJScpCisJZ3J1Yl9wdXRjaGFyIChjKTsKKyAgICAgIGVsc2UKKwlzd2l0Y2ggKGMgPSAqKGZvcm1hdCsrKSkKKwkgIHsKKyNpZm5kZWYgU1RBR0UxXzUKKwkgIGNhc2UgJ2QnOgorCSAgY2FzZSAneCc6CisJICBjYXNlICdYJzoKKyNlbmRpZgorCSAgY2FzZSAndSc6CisJICAgICpjb252ZXJ0X3RvX2FzY2lpIChzdHIsIGMsICooKHVuc2lnbmVkIGxvbmcgKikgZGF0YXB0cisrKSkgPSAwOworCSAgICBncnViX3B1dHN0ciAoc3RyKTsKKwkgICAgYnJlYWs7CisKKyNpZm5kZWYgU1RBR0UxXzUKKwkgIGNhc2UgJ2MnOgorCSAgICBncnViX3B1dGNoYXIgKCgqKGRhdGFwdHIrKykpICYgMHhmZik7CisJICAgIGJyZWFrOworCisJICBjYXNlICdzJzoKKwkgICAgZ3J1Yl9wdXRzdHIgKChjaGFyICopICooZGF0YXB0cisrKSk7CisJICAgIGJyZWFrOworI2VuZGlmCisJICB9CisgICAgfQorfQorCisjaWZuZGVmIFNUQUdFMV81CitpbnQKK2dydWJfc3ByaW50ZiAoY2hhciAqYnVmZmVyLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgLyogWFhYIGhvaG11dGgKKyAgICAgdWdseSBoYWNrIC0tIHNob3VsZCB1bmlmeSB3aXRoIHByaW50ZigpICovCisgIGludCAqZGF0YXB0ciA9IChpbnQgKikgJmZvcm1hdDsKKyAgY2hhciBjLCAqcHRyLCBzdHJbMTZdOworICBjaGFyICpicCA9IGJ1ZmZlcjsKKworICBkYXRhcHRyKys7CisKKyAgd2hpbGUgKChjID0gKmZvcm1hdCsrKSAhPSAwKQorICAgIHsKKyAgICAgIGlmIChjICE9ICclJykKKwkqYnArKyA9IGM7IC8qIHB1dGNoYXIoYyk7ICovCisgICAgICBlbHNlCisJc3dpdGNoIChjID0gKihmb3JtYXQrKykpCisJICB7CisJICBjYXNlICdkJzogY2FzZSAndSc6IGNhc2UgJ3gnOgorCSAgICAqY29udmVydF90b19hc2NpaSAoc3RyLCBjLCAqKCh1bnNpZ25lZCBsb25nICopIGRhdGFwdHIrKykpID0gMDsKKworCSAgICBwdHIgPSBzdHI7CisKKwkgICAgd2hpbGUgKCpwdHIpCisJICAgICAgKmJwKysgPSAqKHB0cisrKTsgLyogcHV0Y2hhcigqKHB0cisrKSk7ICovCisJICAgIGJyZWFrOworCisJICBjYXNlICdjJzogKmJwKysgPSAoKihkYXRhcHRyKyspKSYweGZmOworCSAgICAvKiBwdXRjaGFyKCgqKGRhdGFwdHIrKykpJjB4ZmYpOyAqLworCSAgICBicmVhazsKKworCSAgY2FzZSAncyc6CisJICAgIHB0ciA9IChjaGFyICopICgqKGRhdGFwdHIrKykpOworCisJICAgIHdoaWxlICgoYyA9ICpwdHIrKykgIT0gMCkKKwkgICAgICAqYnArKyA9IGM7IC8qIHB1dGNoYXIoYyk7ICovCisJICAgIGJyZWFrOworCSAgfQorICAgIH0KKworICAqYnAgPSAwOworICByZXR1cm4gYnAgLSBidWZmZXI7Cit9CisKKwordm9pZAoraW5pdF9wYWdlICh2b2lkKQoreworICBjbHMgKCk7CisKKyAgZ3J1Yl9wcmludGYgKCJcbiAgICBHTlUgR1JVQiAgdmVyc2lvbiAlcyAgKCVkSyBsb3dlciAvICVkSyB1cHBlciBtZW1vcnkpXG5cbiIsCisJICB2ZXJzaW9uX3N0cmluZywgbWJpLm1lbV9sb3dlciwgbWJpLm1lbV91cHBlcik7Cit9CisKKy8qIFRoZSBudW1iZXIgb2YgdGhlIGhpc3RvcnkgZW50cmllcy4gICovCitzdGF0aWMgaW50IG51bV9oaXN0b3J5ID0gMDsKKworLyogR2V0IHRoZSBOT3RoIGhpc3RvcnkuIElmIE5PIGlzIGxlc3MgdGhhbiB6ZXJvIG9yIGdyZWF0ZXIgdGhhbiBvcgorICAgZXF1YWwgdG8gTlVNX0hJU1RPUlksIHJldHVybiBOVUxMLiBPdGhlcndpc2UgcmV0dXJuIGEgdmFsaWQgc3RyaW5nLiAgKi8KK3N0YXRpYyBjaGFyICoKK2dldF9oaXN0b3J5IChpbnQgbm8pCit7CisgIGlmIChubyA8IDAgfHwgbm8gPj0gbnVtX2hpc3RvcnkpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIChjaGFyICopIEhJU1RPUllfQlVGICsgTUFYX0NNRExJTkUgKiBubzsKK30KKworLyogQWRkIENNRExJTkUgdG8gdGhlIGhpc3RvcnkgYnVmZmVyLiAgKi8KK3N0YXRpYyB2b2lkCithZGRfaGlzdG9yeSAoY29uc3QgY2hhciAqY21kbGluZSwgaW50IG5vKQoreworICBncnViX21lbW1vdmUgKChjaGFyICopIEhJU1RPUllfQlVGICsgTUFYX0NNRExJTkUgKiAobm8gKyAxKSwKKwkJKGNoYXIgKikgSElTVE9SWV9CVUYgKyBNQVhfQ01ETElORSAqIG5vLAorCQlNQVhfQ01ETElORSAqIChudW1faGlzdG9yeSAtIG5vKSk7CisgIGdydWJfc3RyY3B5ICgoY2hhciAqKSBISVNUT1JZX0JVRiArIE1BWF9DTURMSU5FICogbm8sIGNtZGxpbmUpOworICBpZiAobnVtX2hpc3RvcnkgPCBISVNUT1JZX1NJWkUpCisgICAgbnVtX2hpc3RvcnkrKzsKK30KKworc3RhdGljIGludAorcmVhbF9nZXRfY21kbGluZSAoY2hhciAqcHJvbXB0LCBjaGFyICpjbWRsaW5lLCBpbnQgbWF4bGVuLAorCQkgIGludCBlY2hvX2NoYXIsIGludCByZWFkbGluZSkKK3sKKyAgLyogVGhpcyBpcyBhIHJhdGhlciBjb21wbGljYXRlZCBmdW5jdGlvbi4gU28gZXhwbGFpbiB0aGUgY29uY2VwdC4KKyAgICAgCisgICAgIEEgY29tbWFuZC1saW5lIGNvbnNpc3RzIG9mIGBgc2VjdGlvbicncy4gQSBzZWN0aW9uIGlzIGEgcGFydCBvZiB0aGUKKyAgICAgbGluZSB3aGljaCBtYXkgYmUgZGlzcGxheWVkIG9uIHRoZSBzY3JlZW4sIGJ1dCBhIHNlY3Rpb24gaXMgbmV2ZXIKKyAgICAgZGlzcGxheWVkIHdpdGggYW5vdGhlciBzZWN0aW9uIHNpbXVsdGFuZW91c2x5LgorCisgICAgIEVhY2ggc2VjdGlvbiBpcyBiYXNpY2FsbHkgNzcgb3IgbGVzcyBjaGFyYWN0ZXJzLCBidXQgdGhlIGV4Y2VwdGlvbgorICAgICBpcyB0aGUgZmlyc3Qgc2VjdGlvbiwgd2hpY2ggaXMgNzggb3IgbGVzcyBjaGFyYWN0ZXJzLCBiZWNhdXNlIHRoZQorICAgICBzdGFydGluZyBwb2ludCBpcyBzcGVjaWFsLiBTZWUgYmVsb3cuCisKKyAgICAgVGhlIGZpcnN0IHNlY3Rpb24gY29udGFpbnMgYSBwcm9tcHQgYW5kIGEgY29tbWFuZC1saW5lIChvciB0aGUKKyAgICAgZmlyc3QgcGFydCBvZiBhIGNvbW1hbmQtbGluZSB3aGVuIGl0IGlzIHRvbyBsb25nIHRvIGJlIGZpdCBpbiB0aGUKKyAgICAgc2NyZWVuKS4gU28sIGluIHRoZSBmaXJzdCBzZWN0aW9uLCB0aGUgbnVtYmVyIG9mIGNvbW1hbmQtbGluZQorICAgICBjaGFyYWN0ZXJzIGRpc3BsYXllZCBpcyA3OCBtaW51cyB0aGUgbGVuZ3RoIG9mIHRoZSBwcm9tcHQgKG9yCisgICAgIGxlc3MpLiBJZiB0aGUgY29tbWFuZC1saW5lIGhhcyBtb3JlIGNoYXJhY3RlcnMsIGA+JyBpcyBwdXQgYXQgdGhlCisgICAgIHBvc2l0aW9uIDc4ICh6ZXJvLW9yaWdpbiksIHRvIGluZm9ybSB0aGUgdXNlciBvZiB0aGUgaGlkZGVuCisgICAgIGNoYXJhY3RlcnMuCisKKyAgICAgT3RoZXIgc2VjdGlvbnMgYWx3YXlzIGhhdmUgYDwnIGF0IHRoZSBmaXJzdCBwb3NpdGlvbiwgc2luY2UgdGhlcmUKKyAgICAgaXMgYWJzb2x1dGVseSBhIHNlY3Rpb24gYmVmb3JlIGVhY2ggc2VjdGlvbi4gSWYgdGhlcmUgaXMgYSBzZWN0aW9uCisgICAgIGFmdGVyIGFub3RoZXIgc2VjdGlvbiwgdGhpcyBzZWN0aW9uIGNvbnNpc3RzIG9mIDc3IGNoYXJhY3RlcnMgYW5kCisgICAgIGA+JyBhdCB0aGUgbGFzdCBwb3NpdGlvbi4gVGhlIGxhc3Qgc2VjdGlvbiBoYXMgNzcgb3IgbGVzcworICAgICBjaGFyYWN0ZXJzIGFuZCBkb2Vzbid0IGhhdmUgYD4nLgorCisgICAgIEVhY2ggc2VjdGlvbiBvdGhlciB0aGFuIHRoZSBsYXN0IHNoYXJlcyBzb21lIGNoYXJhY3RlcnMgd2l0aCB0aGUKKyAgICAgcHJldmlvdXMgc2VjdGlvbi4gVGhpcyByZWdpb24gaXMgY2FsbGVkIGBgbWFyZ2luJycuIElmIHRoZSBjdXJzb3IKKyAgICAgaXMgcHV0IGF0IHRoZSBtYWdpbiB3aGljaCBpcyBzaGFyZWQgYnkgdGhlIGZpcnN0IHNlY3Rpb24gYW5kIHRoZQorICAgICBzZWNvbmQsIHRoZSBmaXJzdCBzZWN0aW9uIGlzIGRpc3BsYXllZC4gT3RoZXJ3aXNlLCBhIGRpc3BsYXllZAorICAgICBzZWN0aW9uIGlzIHN3aXRjaGVkIHRvIGFub3RoZXIgc2VjdGlvbiwgb25seSBpZiB0aGUgY3Vyc29yIGlzIHB1dAorICAgICBvdXRzaWRlIHRoYXQgc2VjdGlvbi4gICovCisKKyAgLyogWFhYOiBUaGVzZSBzaG91bGQgYmUgZGVmaW5lZCBpbiBzaGFyZWQuaCwgYnV0IEkgbGVhdmUgdGhlc2UgaGVyZSwKKyAgICAgdW50aWwgdGhpcyBjb2RlIGlzIGZyZWV6ZWQuICAqLworI2RlZmluZSBDTURMSU5FX1dJRFRICTc4CisjZGVmaW5lIENNRExJTkVfTUFSR0lOCTEwCisgIAorICBpbnQgeHBvcywgbHBvcywgYywgc2VjdGlvbjsKKyAgLyogVGhlIGxlbmd0aCBvZiBQUk9NUFQuICAqLworICBpbnQgcGxlbjsKKyAgLyogVGhlIGxlbmd0aCBvZiB0aGUgY29tbWFuZC1saW5lLiAgKi8KKyAgaW50IGxsZW47CisgIC8qIFRoZSBpbmRleCBmb3IgdGhlIGhpc3RvcnkuICAqLworICBpbnQgaGlzdG9yeSA9IC0xOworICAvKiBUaGUgd29ya2luZyBidWZmZXIgZm9yIHRoZSBjb21tYW5kLWxpbmUuICAqLworICBjaGFyICpidWYgPSAoY2hhciAqKSBDTURMSU5FX0JVRjsKKyAgLyogVGhlIGtpbGwgYnVmZmVyLiAgKi8KKyAgY2hhciAqa2lsbF9idWYgPSAoY2hhciAqKSBLSUxMX0JVRjsKKyAgCisgIC8qIE5lc3RlZCBmdW5jdGlvbiBkZWZpbml0aW9ucyBmb3IgY29kZSBzaW1wbGljaXR5LiAgKi8KKworICAvKiBUaGUgZm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgbmVzdGVkIGZ1bmN0aW9ucyBhcmUgcHJlZml4ZWQKKyAgICAgd2l0aCBgYXV0bycuICAqLworICBhdXRvIHZvaWQgY2xfcmVmcmVzaCAoaW50IGZ1bGwsIGludCBsZW4pOworICBhdXRvIHZvaWQgY2xfYmFja3dhcmQgKGludCBjb3VudCk7CisgIGF1dG8gdm9pZCBjbF9mb3J3YXJkIChpbnQgY291bnQpOworICBhdXRvIHZvaWQgY2xfaW5zZXJ0IChjb25zdCBjaGFyICpzdHIpOworICBhdXRvIHZvaWQgY2xfZGVsZXRlIChpbnQgY291bnQpOworICBhdXRvIHZvaWQgY2xfaW5pdCAodm9pZCk7CisgIAorICAvKiBNb3ZlIHRoZSBjdXJzb3IgYmFja3dhcmQuICAqLworICB2b2lkIGNsX2JhY2t3YXJkIChpbnQgY291bnQpCisgICAgeworICAgICAgbHBvcyAtPSBjb3VudDsKKyAgICAgIAorICAgICAgLyogSWYgdGhlIGN1cnNvciBpcyBpbiB0aGUgZmlyc3Qgc2VjdGlvbiwgZGlzcGxheSB0aGUgZmlyc3Qgc2VjdGlvbgorCSBpbnN0ZWFkIG9mIHRoZSBzZWNvbmQuICAqLworICAgICAgaWYgKHNlY3Rpb24gPT0gMSAmJiBwbGVuICsgbHBvcyA8IENNRExJTkVfV0lEVEgpCisJY2xfcmVmcmVzaCAoMSwgMCk7CisgICAgICBlbHNlIGlmICh4cG9zIC0gY291bnQgPCAxKQorCWNsX3JlZnJlc2ggKDEsIDApOworICAgICAgZWxzZQorCXsKKwkgIHhwb3MgLT0gY291bnQ7CisKKwkgIGlmIChjdXJyZW50X3Rlcm0tPmZsYWdzICYgVEVSTV9EVU1CKQorCSAgICB7CisJICAgICAgaW50IGk7CisJICAgICAgCisJICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCWdydWJfcHV0Y2hhciAoJ1xiJyk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgZ290b3h5ICh4cG9zLCBnZXR4eSAoKSAmIDB4RkYpOworCX0KKyAgICB9CisKKyAgLyogTW92ZSB0aGUgY3Vyc29yIGZvcndhcmQuICAqLworICB2b2lkIGNsX2ZvcndhcmQgKGludCBjb3VudCkKKyAgICB7CisgICAgICBscG9zICs9IGNvdW50OworCisgICAgICAvKiBJZiB0aGUgY3Vyc29yIGdvZXMgb3V0c2lkZSwgc2Nyb2xsIHRoZSBzY3JlZW4gdG8gdGhlIHJpZ2h0LiAgKi8KKyAgICAgIGlmICh4cG9zICsgY291bnQgPj0gQ01ETElORV9XSURUSCkKKwljbF9yZWZyZXNoICgxLCAwKTsKKyAgICAgIGVsc2UKKwl7CisJICB4cG9zICs9IGNvdW50OworCisJICBpZiAoY3VycmVudF90ZXJtLT5mbGFncyAmIFRFUk1fRFVNQikKKwkgICAgeworCSAgICAgIGludCBpOworCSAgICAgIAorCSAgICAgIGZvciAoaSA9IGxwb3MgLSBjb3VudDsgaSA8IGxwb3M7IGkrKykKKwkJeworCQkgIGlmICghIGVjaG9fY2hhcikKKwkJICAgIGdydWJfcHV0Y2hhciAoYnVmW2ldKTsKKwkJICBlbHNlCisJCSAgICBncnViX3B1dGNoYXIgKGVjaG9fY2hhcik7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICBnb3RveHkgKHhwb3MsIGdldHh5ICgpICYgMHhGRik7CisJfQorICAgIH0KKworICAvKiBSZWZyZXNoIHRoZSBzY3JlZW4uIElmIEZVTEwgaXMgdHJ1ZSwgcmVkcmF3IHRoZSBmdWxsIGxpbmUsIG90aGVyd2lzZSwKKyAgICAgb25seSBMRU4gY2hhcmFjdGVycyBmcm9tIExQT1MuICAqLworICB2b2lkIGNsX3JlZnJlc2ggKGludCBmdWxsLCBpbnQgbGVuKQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgaW50IHN0YXJ0OworICAgICAgaW50IHBvcyA9IHhwb3M7CisgICAgICAKKyAgICAgIGlmIChmdWxsKQorCXsKKwkgIC8qIFJlY29tcHV0ZSB0aGUgc2VjdGlvbiBudW1iZXIuICAqLworCSAgaWYgKGxwb3MgKyBwbGVuIDwgQ01ETElORV9XSURUSCkKKwkgICAgc2VjdGlvbiA9IDA7CisJICBlbHNlCisJICAgIHNlY3Rpb24gPSAoKGxwb3MgKyBwbGVuIC0gQ01ETElORV9XSURUSCkKKwkJICAgICAgIC8gKENNRExJTkVfV0lEVEggLSAxIC0gQ01ETElORV9NQVJHSU4pICsgMSk7CisKKwkgIC8qIEZyb20gdGhlIHN0YXJ0IHRvIHRoZSBlbmQuICAqLworCSAgbGVuID0gQ01ETElORV9XSURUSDsKKwkgIHBvcyA9IDA7CisJICBncnViX3B1dGNoYXIgKCdccicpOworCisJICAvKiBJZiBTRUNUSU9OIGlzIHRoZSBmaXJzdCBzZWN0aW9uLCBwcmludCB0aGUgcHJvbXB0LCBvdGhlcndpc2UsCisJICAgICBwcmludCBgPCcuICAqLworCSAgaWYgKHNlY3Rpb24gPT0gMCkKKwkgICAgeworCSAgICAgIGdydWJfcHJpbnRmICgiJXMiLCBwcm9tcHQpOworCSAgICAgIGxlbiAtPSBwbGVuOworCSAgICAgIHBvcyArPSBwbGVuOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBncnViX3B1dGNoYXIgKCc8Jyk7CisJICAgICAgbGVuLS07CisJICAgICAgcG9zKys7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIENvbXB1dGUgdGhlIGluZGV4IHRvIHN0YXJ0IHdyaXRpbmcgQlVGIGFuZCB0aGUgcmVzdWx0aW5nIHBvc2l0aW9uCisJIG9uIHRoZSBzY3JlZW4uICAqLworICAgICAgaWYgKHNlY3Rpb24gPT0gMCkKKwl7CisJICBpbnQgb2Zmc2V0ID0gMDsKKwkgIAorCSAgaWYgKCEgZnVsbCkKKwkgICAgb2Zmc2V0ID0geHBvcyAtIHBsZW47CisJICAKKwkgIHN0YXJ0ID0gMDsKKwkgIHhwb3MgPSBscG9zICsgcGxlbjsKKwkgIHN0YXJ0ICs9IG9mZnNldDsKKwl9CisgICAgICBlbHNlCisJeworCSAgaW50IG9mZnNldCA9IDA7CisJICAKKwkgIGlmICghIGZ1bGwpCisJICAgIG9mZnNldCA9IHhwb3MgLSAxOworCSAgCisJICBzdGFydCA9ICgoc2VjdGlvbiAtIDEpICogKENNRExJTkVfV0lEVEggLSAxIC0gQ01ETElORV9NQVJHSU4pCisJCSAgICsgQ01ETElORV9XSURUSCAtIHBsZW4gLSBDTURMSU5FX01BUkdJTik7CisJICB4cG9zID0gbHBvcyArIDEgLSBzdGFydDsKKwkgIHN0YXJ0ICs9IG9mZnNldDsKKwl9CisKKyAgICAgIC8qIFByaW50IEJVRi4gSWYgRUNIT19DSEFSIGlzIG5vdCB6ZXJvLCBwdXQgaXQgaW5zdGVhZC4gICovCisgICAgICBmb3IgKGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgbGVuICYmIGkgPCBsbGVuOyBpKyspCisJeworCSAgaWYgKCEgZWNob19jaGFyKQorCSAgICBncnViX3B1dGNoYXIgKGJ1ZltpXSk7CisJICBlbHNlCisJICAgIGdydWJfcHV0Y2hhciAoZWNob19jaGFyKTsKKworCSAgcG9zKys7CisJfQorICAgICAgCisgICAgICAvKiBGaWxsIHVwIHRoZSByZXN0IG9mIHRoZSBsaW5lIHdpdGggc3BhY2VzLiAgKi8KKyAgICAgIGZvciAoOyBpIDwgc3RhcnQgKyBsZW47IGkrKykKKwl7CisJICBncnViX3B1dGNoYXIgKCcgJyk7CisJICBwb3MrKzsKKwl9CisgICAgICAKKyAgICAgIC8qIElmIHRoZSBjdXJzb3IgaXMgYXQgdGhlIGxhc3QgcG9zaXRpb24sIHB1dCBgPicgb3IgYSBzcGFjZSwKKwkgZGVwZW5kaW5nIG9uIGlmIHRoZXJlIGFyZSBtb3JlIGNoYXJhY3RlcnMgaW4gQlVGLiAgKi8KKyAgICAgIGlmIChwb3MgPT0gQ01ETElORV9XSURUSCkKKwl7CisJICBpZiAoc3RhcnQgKyBsZW4gPCBsbGVuKQorCSAgICBncnViX3B1dGNoYXIgKCc+Jyk7CisJICBlbHNlCisJICAgIGdydWJfcHV0Y2hhciAoJyAnKTsKKwkgIAorCSAgcG9zKys7CisJfQorICAgICAgCisgICAgICAvKiBCYWNrIHRvIFhQT1MuICAqLworICAgICAgaWYgKGN1cnJlbnRfdGVybS0+ZmxhZ3MgJiBURVJNX0RVTUIpCisJeworCSAgZm9yIChpID0gMDsgaSA8IHBvcyAtIHhwb3M7IGkrKykKKwkgICAgZ3J1Yl9wdXRjaGFyICgnXGInKTsKKwl9CisgICAgICBlbHNlCisJZ290b3h5ICh4cG9zLCBnZXR4eSAoKSAmIDB4RkYpOworICAgIH0KKworICAvKiBJbml0aWFsaXplIHRoZSBjb21tYW5kLWxpbmUuICAqLworICB2b2lkIGNsX2luaXQgKHZvaWQpCisgICAgeworICAgICAgLyogRGlzdGluZ3Vpc2ggdXMgZnJvbSBvdGhlciBsaW5lcyBhbmQgZXJyb3IgbWVzc2FnZXMhICAqLworICAgICAgZ3J1Yl9wdXRjaGFyICgnXG4nKTsKKworICAgICAgLyogUHJpbnQgZnVsbCBsaW5lIGFuZCBzZXQgcG9zaXRpb24gaGVyZS4gICovCisgICAgICBjbF9yZWZyZXNoICgxLCAwKTsKKyAgICB9CisKKyAgLyogSW5zZXJ0IFNUUiB0byBCVUYuICAqLworICB2b2lkIGNsX2luc2VydCAoY29uc3QgY2hhciAqc3RyKQorICAgIHsKKyAgICAgIGludCBsID0gZ3J1Yl9zdHJsZW4gKHN0cik7CisKKyAgICAgIGlmIChsbGVuICsgbCA8IG1heGxlbikKKwl7CisJICBpZiAobHBvcyA9PSBsbGVuKQorCSAgICBncnViX21lbW1vdmUgKGJ1ZiArIGxwb3MsIHN0ciwgbCArIDEpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgZ3J1Yl9tZW1tb3ZlIChidWYgKyBscG9zICsgbCwgYnVmICsgbHBvcywgbGxlbiAtIGxwb3MgKyAxKTsKKwkgICAgICBncnViX21lbW1vdmUgKGJ1ZiArIGxwb3MsIHN0ciwgbCk7CisJICAgIH0KKwkgIAorCSAgbGxlbiArPSBsOworCSAgbHBvcyArPSBsOworCSAgaWYgKHhwb3MgKyBsID49IENNRExJTkVfV0lEVEgpCisJICAgIGNsX3JlZnJlc2ggKDEsIDApOworCSAgZWxzZSBpZiAoeHBvcyArIGwgKyBsbGVuIC0gbHBvcyA+IENNRExJTkVfV0lEVEgpCisJICAgIGNsX3JlZnJlc2ggKDAsIENNRExJTkVfV0lEVEggLSB4cG9zKTsKKwkgIGVsc2UKKwkgICAgY2xfcmVmcmVzaCAoMCwgbCArIGxsZW4gLSBscG9zKTsKKwl9CisgICAgfQorCisgIC8qIERlbGV0ZSBDT1VOVCBjaGFyYWN0ZXJzIGluIEJVRi4gICovCisgIHZvaWQgY2xfZGVsZXRlIChpbnQgY291bnQpCisgICAgeworICAgICAgZ3J1Yl9tZW1tb3ZlIChidWYgKyBscG9zLCBidWYgKyBscG9zICsgY291bnQsIGxsZW4gLSBjb3VudCArIDEpOworICAgICAgbGxlbiAtPSBjb3VudDsKKyAgICAgIAorICAgICAgaWYgKHhwb3MgKyBsbGVuICsgY291bnQgLSBscG9zID4gQ01ETElORV9XSURUSCkKKwljbF9yZWZyZXNoICgwLCBDTURMSU5FX1dJRFRIIC0geHBvcyk7CisgICAgICBlbHNlCisJY2xfcmVmcmVzaCAoMCwgbGxlbiArIGNvdW50IC0gbHBvcyk7CisgICAgfQorCisgIHBsZW4gPSBncnViX3N0cmxlbiAocHJvbXB0KTsKKyAgbGxlbiA9IGdydWJfc3RybGVuIChjbWRsaW5lKTsKKworICBpZiAobWF4bGVuID4gTUFYX0NNRExJTkUpCisgICAgeworICAgICAgbWF4bGVuID0gTUFYX0NNRExJTkU7CisgICAgICBpZiAobGxlbiA+PSBNQVhfQ01ETElORSkKKwl7CisJICBsbGVuID0gTUFYX0NNRExJTkUgLSAxOworCSAgY21kbGluZVtNQVhfQ01ETElORV0gPSAwOworCX0KKyAgICB9CisgIGxwb3MgPSBsbGVuOworICBncnViX3N0cmNweSAoYnVmLCBjbWRsaW5lKTsKKworICBjbF9pbml0ICgpOworCisgIHdoaWxlICgoYyA9IEFTQ0lJX0NIQVIgKGdldGtleSAoKSkpICE9ICdcbicgJiYgYyAhPSAnXHInKQorICAgIHsKKyAgICAgIC8qIElmIFJFQURMSU5FIGlzIG5vbi16ZXJvLCBoYW5kbGUgcmVhZGxpbmUtbGlrZSBrZXkgYmluZGluZ3MuICAqLworICAgICAgaWYgKHJlYWRsaW5lKQorCXsKKwkgIHN3aXRjaCAoYykKKwkgICAgeworCSAgICBjYXNlIDk6CQkvKiBUQUIgbGlzdHMgY29tcGxldGlvbnMgKi8KKwkgICAgICB7CisJCWludCBpOworCQkvKiBQT1MgcG9pbnRzIHRvIHRoZSBmaXJzdCBzcGFjZSBhZnRlciBhIGNvbW1hbmQuICAqLworCQlpbnQgcG9zID0gMDsKKwkJaW50IHJldDsKKwkJY2hhciAqY29tcGxldGlvbl9idWZmZXIgPSAoY2hhciAqKSBDT01QTEVUSU9OX0JVRjsKKwkJaW50IGVxdWFsX3BvcyA9IC0xOworCQlpbnQgaXNfZmlsZW5hbWU7CisKKwkJLyogRmluZCB0aGUgZmlyc3Qgd29yZC4gICovCisJCXdoaWxlIChidWZbcG9zXSA9PSAnICcpCisJCSAgcG9zKys7CisJCXdoaWxlIChidWZbcG9zXSAmJiBidWZbcG9zXSAhPSAnPScgJiYgYnVmW3Bvc10gIT0gJyAnKQorCQkgIHBvcysrOworCisJCWlzX2ZpbGVuYW1lID0gKGxwb3MgPiBwb3MpOworCisJCS8qIEZpbmQgdGhlIHBvc2l0aW9uIG9mIHRoZSBlcXVhbCBjaGFyYWN0ZXIgYWZ0ZXIgYQorCQkgICBjb21tYW5kLCBhbmQgcmVwbGFjZSBpdCB3aXRoIGEgc3BhY2UuICAqLworCQlmb3IgKGkgPSBwb3M7IGJ1ZltpXSAmJiBidWZbaV0gIT0gJyAnOyBpKyspCisJCSAgaWYgKGJ1ZltpXSA9PSAnPScpCisJCSAgICB7CisJCSAgICAgIGVxdWFsX3BvcyA9IGk7CisJCSAgICAgIGJ1ZltpXSA9ICcgJzsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisKKwkJLyogRmluZCB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGlzCisJCSAgIHdvcmQuICAqLworCQlmb3IgKGkgPSBscG9zOyBpID4gMCAmJiBidWZbaSAtIDFdICE9ICcgJzsgaS0tKQorCQkgIDsKKworCQkvKiBJbnZhbGlkYXRlIHRoZSBjYWNoZSwgYmVjYXVzZSB0aGUgdXNlciBtYXkgZXhjaGFuZ2UKKwkJICAgcmVtb3ZhYmxlIGRpc2tzLiAgKi8KKwkJYnVmX2RyaXZlID0gLTE7CisKKwkJLyogQ29weSB0aGlzIHdvcmQgdG8gQ09NUExFVElPTl9CVUZGRVIgYW5kIGRvIHRoZQorCQkgICBjb21wbGV0aW9uLiAgKi8KKwkJZ3J1Yl9tZW1tb3ZlIChjb21wbGV0aW9uX2J1ZmZlciwgYnVmICsgaSwgbHBvcyAtIGkpOworCQljb21wbGV0aW9uX2J1ZmZlcltscG9zIC0gaV0gPSAwOworCQlyZXQgPSBwcmludF9jb21wbGV0aW9ucyAoaXNfZmlsZW5hbWUsIDEpOworCQllcnJudW0gPSBFUlJfTk9ORTsKKworCQlpZiAocmV0ID49IDApCisJCSAgeworCQkgICAgLyogRm91bmQsIHNvIGluc2VydCBDT01QTEVUSU9OX0JVRkZFUi4gICovCisJCSAgICBjbF9pbnNlcnQgKGNvbXBsZXRpb25fYnVmZmVyICsgbHBvcyAtIGkpOworCisJCSAgICBpZiAocmV0ID4gMCkKKwkJICAgICAgeworCQkJLyogVGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgY2FuZGlkYXRlcywgc28gcHJpbnQKKwkJCSAgIHRoZSBsaXN0LiAgKi8KKwkJCWdydWJfcHV0Y2hhciAoJ1xuJyk7CisJCQlwcmludF9jb21wbGV0aW9ucyAoaXNfZmlsZW5hbWUsIDApOworCQkJZXJybnVtID0gRVJSX05PTkU7CisJCSAgICAgIH0KKwkJICB9CisKKwkJLyogUmVzdG9yZSB0aGUgY29tbWFuZC1saW5lLiAgKi8KKwkJaWYgKGVxdWFsX3BvcyA+PSAwKQorCQkgIGJ1ZltlcXVhbF9wb3NdID0gJz0nOworCisJCWlmIChyZXQpCisJCSAgY2xfaW5pdCAoKTsKKwkgICAgICB9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgMToJCS8qIEMtYSBnbyB0byBiZWdpbm5pbmcgb2YgbGluZSAqLworCSAgICAgIGNsX2JhY2t3YXJkIChscG9zKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSA1OgkJLyogQy1lIGdvIHRvIGVuZCBvZiBsaW5lICovCisJICAgICAgY2xfZm9yd2FyZCAobGxlbiAtIGxwb3MpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIDY6CQkvKiBDLWYgZm9yd2FyZCBvbmUgY2hhcmFjdGVyICovCisJICAgICAgaWYgKGxwb3MgPCBsbGVuKQorCQljbF9mb3J3YXJkICgxKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAyOgkJLyogQy1iIGJhY2t3YXJkIG9uZSBjaGFyYWN0ZXIgKi8KKwkgICAgICBpZiAobHBvcyA+IDApCisJCWNsX2JhY2t3YXJkICgxKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAyMToJCS8qIEMtdSBraWxsIHRvIGJlZ2lubmluZyBvZiBsaW5lICovCisJICAgICAgaWYgKGxwb3MgPT0gMCkKKwkJYnJlYWs7CisJICAgICAgLyogQ29weSB0aGUgc3RyaW5nIGJlaW5nIGRlbGV0ZWQgdG8gS0lMTF9CVUYuICAqLworCSAgICAgIGdydWJfbWVtbW92ZSAoa2lsbF9idWYsIGJ1ZiwgbHBvcyk7CisJICAgICAga2lsbF9idWZbbHBvc10gPSAwOworCSAgICAgIHsKKwkJLyogWFhYOiBOb3QgdmVyeSBjbGV2ZXIuICAqLworCQkKKwkJaW50IGNvdW50ID0gbHBvczsKKwkJCisJCWNsX2JhY2t3YXJkIChscG9zKTsKKwkJY2xfZGVsZXRlIChjb3VudCk7CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIDExOgkJLyogQy1rIGtpbGwgdG8gZW5kIG9mIGxpbmUgKi8KKwkgICAgICBpZiAobHBvcyA9PSBsbGVuKQorCQlicmVhazsKKwkgICAgICAvKiBDb3B5IHRoZSBzdHJpbmcgYmVpbmcgZGVsZXRlZCB0byBLSUxMX0JVRi4gICovCisJICAgICAgZ3J1Yl9tZW1tb3ZlIChraWxsX2J1ZiwgYnVmICsgbHBvcywgbGxlbiAtIGxwb3MgKyAxKTsKKwkgICAgICBjbF9kZWxldGUgKGxsZW4gLSBscG9zKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAyNToJCS8qIEMteSB5YW5rIHRoZSBraWxsIGJ1ZmZlciAqLworCSAgICAgIGNsX2luc2VydCAoa2lsbF9idWYpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIDE2OgkJLyogQy1wIGZldGNoIHRoZSBwcmV2aW91cyBjb21tYW5kICovCisJICAgICAgeworCQljaGFyICpwOworCisJCWlmIChoaXN0b3J5IDwgMCkKKwkJICAvKiBTYXZlIHRoZSB3b3JraW5nIGJ1ZmZlci4gICovCisJCSAgZ3J1Yl9zdHJjcHkgKGNtZGxpbmUsIGJ1Zik7CisJCWVsc2UgaWYgKGdydWJfc3RyY21wIChnZXRfaGlzdG9yeSAoaGlzdG9yeSksIGJ1ZikgIT0gMCkKKwkJICAvKiBJZiBCVUYgaXMgbW9kaWZpZWQsIGFkZCBpdCBpbnRvIHRoZSBoaXN0b3J5IGxpc3QuICAqLworCQkgIGFkZF9oaXN0b3J5IChidWYsIGhpc3RvcnkpOworCisJCWhpc3RvcnkrKzsKKwkJcCA9IGdldF9oaXN0b3J5IChoaXN0b3J5KTsKKwkJaWYgKCEgcCkKKwkJICB7CisJCSAgICBoaXN0b3J5LS07CisJCSAgICBicmVhazsKKwkJICB9CisKKwkJZ3J1Yl9zdHJjcHkgKGJ1ZiwgcCk7CisJCWxsZW4gPSBncnViX3N0cmxlbiAoYnVmKTsKKwkJbHBvcyA9IGxsZW47CisJCWNsX3JlZnJlc2ggKDEsIDApOworCSAgICAgIH0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAxNDoJCS8qIEMtbiBmZXRjaCB0aGUgbmV4dCBjb21tYW5kICovCisJICAgICAgeworCQljaGFyICpwOworCisJCWlmIChoaXN0b3J5IDwgMCkKKwkJICB7CisJCSAgICBicmVhazsKKwkJICB9CisJCWVsc2UgaWYgKGdydWJfc3RyY21wIChnZXRfaGlzdG9yeSAoaGlzdG9yeSksIGJ1ZikgIT0gMCkKKwkJICAvKiBJZiBCVUYgaXMgbW9kaWZpZWQsIGFkZCBpdCBpbnRvIHRoZSBoaXN0b3J5IGxpc3QuICAqLworCQkgIGFkZF9oaXN0b3J5IChidWYsIGhpc3RvcnkpOworCisJCWhpc3RvcnktLTsKKwkJcCA9IGdldF9oaXN0b3J5IChoaXN0b3J5KTsKKwkJaWYgKCEgcCkKKwkJICBwID0gY21kbGluZTsKKworCQlncnViX3N0cmNweSAoYnVmLCBwKTsKKwkJbGxlbiA9IGdydWJfc3RybGVuIChidWYpOworCQlscG9zID0gbGxlbjsKKwkJY2xfcmVmcmVzaCAoMSwgMCk7CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorCisgICAgICAvKiBFU0MsIEMtZCBhbmQgQy1oIGFyZSBhbHdheXMgaGFuZGxlZC4gQWN0dWFsbHkgQy1kIGlzIG5vdAorCSBmdW5jdGlvbmFsIGlmIFJFQURMSU5FIGlzIHplcm8sIGFzIHRoZSBjdXJzb3IgY2Fubm90IGdvCisJIGJhY2t3YXJkLCBidXQgdGhhdCdzIG9rLiAgKi8KKyAgICAgIHN3aXRjaCAoYykKKwl7CisJY2FzZSAyNzoJLyogRVNDIGltbWVkaWF0ZWx5IHJldHVybiAxICovCisJICByZXR1cm4gMTsKKwljYXNlIDQ6CQkvKiBDLWQgZGVsZXRlIGNoYXJhY3RlciB1bmRlciBjdXJzb3IgKi8KKwkgIGlmIChscG9zID09IGxsZW4pCisJICAgIGJyZWFrOworCSAgY2xfZGVsZXRlICgxKTsKKwkgIGJyZWFrOworCWNhc2UgODoJCS8qIEMtaCBiYWNrc3BhY2UgKi8KKyMgaWZkZWYgR1JVQl9VVElMCisJY2FzZSAxMjc6CS8qIGFsc28gYmFja3NwYWNlICovCisjIGVuZGlmCisJICBpZiAobHBvcyA+IDApCisJICAgIHsKKwkgICAgICBjbF9iYWNrd2FyZCAoMSk7CisJICAgICAgY2xfZGVsZXRlICgxKTsKKwkgICAgfQorCSAgYnJlYWs7CisJZGVmYXVsdDoJCS8qIGluc2VydCBwcmludGFibGUgY2hhcmFjdGVyIGludG8gbGluZSAqLworCSAgaWYgKGMgPj0gJyAnICYmIGMgPD0gJ34nKQorCSAgICB7CisJICAgICAgY2hhciBzdHJbMl07CisKKwkgICAgICBzdHJbMF0gPSBjOworCSAgICAgIHN0clsxXSA9IDA7CisJICAgICAgY2xfaW5zZXJ0IChzdHIpOworCSAgICB9CisJfQorICAgIH0KKworICBncnViX3B1dGNoYXIgKCdcbicpOworCisgIC8qIElmIEVDSE9fQ0hBUiBpcyBOVUwsIHJlbW92ZSB0aGUgbGVhZGluZyBzcGFjZXMuICAqLworICBscG9zID0gMDsKKyAgaWYgKCEgZWNob19jaGFyKQorICAgIHdoaWxlIChidWZbbHBvc10gPT0gJyAnKQorICAgICAgbHBvcysrOworCisgIC8qIENvcHkgdGhlIHdvcmtpbmcgYnVmZmVyIHRvIENNRExJTkUuICAqLworICBncnViX21lbW1vdmUgKGNtZGxpbmUsIGJ1ZiArIGxwb3MsIGxsZW4gLSBscG9zICsgMSk7CisKKyAgLyogSWYgdGhlIHJlYWRsaW5lLWxpa2UgZmVhdHVyZSBpcyB0dXJuZWQgb24gYW5kIENNRExJTkUgaXMgbm90CisgICAgIGVtcHR5LCBhZGQgaXQgaW50byB0aGUgaGlzdG9yeSBsaXN0LiAgKi8KKyAgaWYgKHJlYWRsaW5lICYmIGxwb3MgPCBsbGVuKQorICAgIGFkZF9oaXN0b3J5IChjbWRsaW5lLCAwKTsKKworICByZXR1cm4gMDsKK30KKworLyogRG9uJ3QgdXNlIHRoaXMgd2l0aCBhIE1BWExFTiBncmVhdGVyIHRoYW4gMTYwMCBvciBzbyEgIFRoZSBwcm9ibGVtCisgICBpcyB0aGF0IEdFVF9DTURMSU5FIGRlcGVuZHMgb24gdGhlIGV2ZXJ5dGhpbmcgZml0dGluZyBvbiB0aGUgc2NyZWVuCisgICBhdCBvbmNlLiAgU28sIHRoZSB3aG9sZSBzY3JlZW4gaXMgYWJvdXQgMjAwMCBjaGFyYWN0ZXJzLCBtaW51cyB0aGUKKyAgIFBST01QVCwgYW5kIHNwYWNlIGZvciBlcnJvciBhbmQgc3RhdHVzIGxpbmVzLCBldGMuICBNQVhMRU4gbXVzdCBiZQorICAgYXQgbGVhc3QgMSwgYW5kIFBST01QVCBhbmQgQ01ETElORSBtdXN0IGJlIHZhbGlkIHN0cmluZ3MgKG5vdCBOVUxMCisgICBvciB6ZXJvLWxlbmd0aCkuCisKKyAgIElmIEVDSE9fQ0hBUiBpcyBub256ZXJvLCBlY2hvIGl0IGluc3RlYWQgb2YgdGhlIHR5cGVkIGNoYXJhY3Rlci4gKi8KK2ludAorZ2V0X2NtZGxpbmUgKGNoYXIgKnByb21wdCwgY2hhciAqY21kbGluZSwgaW50IG1heGxlbiwKKwkgICAgIGludCBlY2hvX2NoYXIsIGludCByZWFkbGluZSkKK3sKKyAgaW50IG9sZF9jdXJzb3I7CisgIGludCByZXQ7CisKKyAgb2xkX2N1cnNvciA9IHNldGN1cnNvciAoMSk7CisgIAorICAvKiBCZWNhdXNlIGl0IGlzIGhhcmQgdG8gZGVhbCB3aXRoIGRpZmZlcmVudCBjb25kaXRpb25zIHNpbXVsdGFuZW91c2x5LAorICAgICBsZXNzIGZ1bmN0aW9uYWwgY2FzZXMgYXJlIGhhbmRsZWQgaGVyZS4gQXNzdW1lIHRoYXQgVEVSTV9OT19FQ0hPCisgICAgIGltcGxpZXMgVEVSTV9OT19FRElULiAgKi8KKyAgaWYgKGN1cnJlbnRfdGVybS0+ZmxhZ3MgJiAoVEVSTV9OT19FQ0hPIHwgVEVSTV9OT19FRElUKSkKKyAgICB7CisgICAgICBjaGFyICpwID0gY21kbGluZTsKKyAgICAgIGludCBjOworICAgICAgCisgICAgICAvKiBNYWtlIHN1cmUgdGhhdCBNQVhMRU4gaXMgbm90IHRvbyBsYXJnZS4gICovCisgICAgICBpZiAobWF4bGVuID4gTUFYX0NNRExJTkUpCisJbWF4bGVuID0gTUFYX0NNRExJTkU7CisKKyAgICAgIC8qIFByaW50IG9ubHkgdGhlIHByb21wdC4gVGhlIGNvbnRlbnRzIG9mIENNRExJTkUgaXMgc2ltcGx5IGRpc2NhcmRlZCwKKwkgZXZlbiBpZiBpdCBpcyBub3QgZW1wdHkuICAqLworICAgICAgZ3J1Yl9wcmludGYgKCIlcyIsIHByb21wdCk7CisKKyAgICAgIC8qIEdhdGhlciBjaGFyYWN0ZXJzIHVudGlsIGEgbmV3bGluZSBpcyBnb3R0ZW4uICAqLworICAgICAgd2hpbGUgKChjID0gQVNDSUlfQ0hBUiAoZ2V0a2V5ICgpKSkgIT0gJ1xuJyAmJiBjICE9ICdccicpCisJeworCSAgLyogUmV0dXJuIGltbWVkaWF0ZWx5IGlmIEVTQyBpcyBwcmVzc2VkLiAgKi8KKwkgIGlmIChjID09IDI3KQorCSAgICB7CisJICAgICAgc2V0Y3Vyc29yIChvbGRfY3Vyc29yKTsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgfQorCisJICAvKiBQcmludGFibGUgY2hhcmFjdGVycyBhcmUgYWRkZWQgaW50byBDTURMSU5FLiAgKi8KKwkgIGlmIChjID49ICcgJyAmJiBjIDw9ICd+JykKKwkgICAgeworCSAgICAgIGlmICghIChjdXJyZW50X3Rlcm0tPmZsYWdzICYgVEVSTV9OT19FQ0hPKSkKKwkJZ3J1Yl9wdXRjaGFyIChjKTsKKworCSAgICAgIC8qIFByZWNlZGluZyBzcGFjZSBjaGFyYWN0ZXJzIG11c3QgYmUgaWdub3JlZC4gICovCisJICAgICAgaWYgKGMgIT0gJyAnIHx8IHAgIT0gY21kbGluZSkKKwkJKnArKyA9IGM7CisJICAgIH0KKwl9CisKKyAgICAgICpwID0gMDsKKworICAgICAgaWYgKCEgKGN1cnJlbnRfdGVybS0+ZmxhZ3MgJiBURVJNX05PX0VDSE8pKQorCWdydWJfcHV0Y2hhciAoJ1xuJyk7CisKKyAgICAgIHNldGN1cnNvciAob2xkX2N1cnNvcik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgLyogQ29tcGxpY2F0ZWQgZmVhdHVyZXMgYXJlIGxlZnQgdG8gcmVhbF9nZXRfY21kbGluZS4gICovCisgIHJldCA9IHJlYWxfZ2V0X2NtZGxpbmUgKHByb21wdCwgY21kbGluZSwgbWF4bGVuLCBlY2hvX2NoYXIsIHJlYWRsaW5lKTsKKyAgc2V0Y3Vyc29yIChvbGRfY3Vyc29yKTsKKyAgcmV0dXJuIHJldDsKK30KKworaW50CitzYWZlX3BhcnNlX21heGludCAoY2hhciAqKnN0cl9wdHIsIGludCAqbXlpbnRfcHRyKQoreworICBjaGFyICpwdHIgPSAqc3RyX3B0cjsKKyAgaW50IG15aW50ID0gMDsKKyAgaW50IG11bHQgPSAxMCwgZm91bmQgPSAwOworCisgIC8qCisgICAqICBJcyB0aGlzIGEgaGV4IG51bWJlcj8KKyAgICovCisgIGlmICgqcHRyID09ICcwJyAmJiB0b2xvd2VyICgqKHB0ciArIDEpKSA9PSAneCcpCisgICAgeworICAgICAgcHRyICs9IDI7CisgICAgICBtdWx0ID0gMTY7CisgICAgfQorCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIC8qIEEgYml0IHRyaWNreS4gVGhpcyBiZWxvdyBtYWtlcyB1c2Ugb2YgdGhlIGVxdWl2YWxlbmNlOgorCSAoQSA+PSBCICYmIEEgPD0gQykgPD0+ICgoQSAtIEIpIDw9IChDIC0gQikpCisJIHdoZW4gQyA+IEIgYW5kIEEgaXMgdW5zaWduZWQuICAqLworICAgICAgdW5zaWduZWQgaW50IGRpZ2l0OworCisgICAgICBkaWdpdCA9IHRvbG93ZXIgKCpwdHIpIC0gJzAnOworICAgICAgaWYgKGRpZ2l0ID4gOSkKKwl7CisJICBkaWdpdCAtPSAnYScgLSAnMCc7CisJICBpZiAobXVsdCA9PSAxMCB8fCBkaWdpdCA+IDUpCisJICAgIGJyZWFrOworCSAgZGlnaXQgKz0gMTA7CisJfQorCisgICAgICBmb3VuZCA9IDE7CisgICAgICBpZiAobXlpbnQgPiAoKE1BWElOVCAtIGRpZ2l0KSAvIG11bHQpKQorCXsKKwkgIGVycm51bSA9IEVSUl9OVU1CRVJfT1ZFUkZMT1c7CisJICByZXR1cm4gMDsKKwl9CisgICAgICBteWludCA9IChteWludCAqIG11bHQpICsgZGlnaXQ7CisgICAgICBwdHIrKzsKKyAgICB9CisKKyAgaWYgKCFmb3VuZCkKKyAgICB7CisgICAgICBlcnJudW0gPSBFUlJfTlVNQkVSX1BBUlNJTkc7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgKnN0cl9wdHIgPSBwdHI7CisgICpteWludF9wdHIgPSBteWludDsKKworICByZXR1cm4gMTsKK30KKyNlbmRpZiAvKiBTVEFHRTFfNSAqLworCisjaWYgIWRlZmluZWQoU1RBR0UxXzUpIHx8IGRlZmluZWQoRlNZU19GQVQpCitpbnQKK2dydWJfdG9sb3dlciAoaW50IGMpCit7CisgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykKKyAgICByZXR1cm4gKGMgKyAoJ2EnIC0gJ0EnKSk7CisKKyAgcmV0dXJuIGM7Cit9CisjZW5kaWYgLyogISBTVEFHRTFfNSB8fCBGU1lTX0ZBVCAqLworCitpbnQKK2dydWJfaXNzcGFjZSAoaW50IGMpCit7CisgIHN3aXRjaCAoYykKKyAgICB7CisgICAgY2FzZSAnICc6CisgICAgY2FzZSAnXHQnOgorICAgIGNhc2UgJ1xyJzoKKyAgICBjYXNlICdcbic6CisgICAgICByZXR1cm4gMTsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisjaWYgIWRlZmluZWQoU1RBR0UxXzUpIHx8IGRlZmluZWQoRlNZU19JU085NjYwKQoraW50CitncnViX21lbWNtcCAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBpbnQgbikKK3sKKyAgd2hpbGUgKG4pCisgICAgeworICAgICAgaWYgKCpzMSA8ICpzMikKKwlyZXR1cm4gLTE7CisgICAgICBlbHNlIGlmICgqczEgPiAqczIpCisJcmV0dXJuIDE7CisgICAgICBzMSsrOworICAgICAgczIrKzsKKyAgICAgIG4tLTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogISBTVEFHRTFfNSB8fCBGU1lTX0lTTzk2NjAgKi8KKworI2lmbmRlZiBTVEFHRTFfNQoraW50CitncnViX3N0cm5jYXQgKGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgaW50IG4pCit7CisgIGludCBpID0gLTE7CisKKyAgd2hpbGUgKCsraSA8IG4gJiYgczFbaV0gIT0gMCk7CisKKyAgd2hpbGUgKGkgPCBuICYmIChzMVtpKytdID0gKihzMisrKSkgIT0gMCk7CisKKyAgczFbbiAtIDFdID0gMDsKKworICBpZiAoaSA+PSBuKQorICAgIHJldHVybiAwOworCisgIHMxW2ldID0gMDsKKworICByZXR1cm4gMTsKK30KKyNlbmRpZiAvKiAhIFNUQUdFMV81ICovCisKKy8qIFhYWDogVGhpcyBiZWxvdyBpcyBhbiBldmlsIGhhY2suIENlcnRhaW5seSwgd2Ugc2hvdWxkIGNoYW5nZSB0aGUKKyAgIHN0cmF0ZWd5IHRvIGRldGVybWluZSB3aGF0IHNob3VsZCBiZSBkZWZpbmVkIGFuZCB3aGF0IHNob3VsZG4ndCBiZQorICAgZGVmaW5lZCBmb3IgZWFjaCBpbWFnZS4gRm9yIGV4YW1wbGUsIGl0IHdvdWxkIGJlIGJldHRlciB0byBjcmVhdGUKKyAgIGEgc3RhdGljIGxpYnJhcnkgc3VwcG9ydGluZyBtaW5pbWFsIHN0YW5kYXJkIEMgZnVuY3Rpb25zIGFuZCBsaW5rCisgICBlYWNoIGltYWdlIHdpdGggdGhlIGxpYnJhcnkuIENvbXBsaWNhdGVkIHRoaW5ncyBzaG91bGQgYmUgbGVmdCB0bworICAgY29tcHV0ZXIsIGRlZmluaXRlbHkuIC1va3VqaSAgKi8KKyNpZiAhZGVmaW5lZChTVEFHRTFfNSkgfHwgZGVmaW5lZChGU1lTX1ZTVEFGUykKK2ludAorZ3J1Yl9zdHJjbXAgKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikKK3sKKyAgd2hpbGUgKCpzMSB8fCAqczIpCisgICAgeworICAgICAgaWYgKCpzMSA8ICpzMikKKwlyZXR1cm4gLTE7CisgICAgICBlbHNlIGlmICgqczEgPiAqczIpCisJcmV0dXJuIDE7CisgICAgICBzMSArKzsKKyAgICAgIHMyICsrOworICAgIH0KKworICByZXR1cm4gMDsKK30KKyNlbmRpZiAvKiAhIFNUQUdFMV81IHx8IEZTWVNfVlNUQUZTICovCisKKyNpZm5kZWYgU1RBR0UxXzUKKy8qIFdhaXQgZm9yIGEga2V5cHJlc3MgYW5kIHJldHVybiBpdHMgY29kZS4gICovCitpbnQKK2dldGtleSAodm9pZCkKK3sKKyAgcmV0dXJuIGN1cnJlbnRfdGVybS0+Z2V0a2V5ICgpOworfQorCisvKiBDaGVjayBpZiBhIGtleSBjb2RlIGlzIGF2YWlsYWJsZS4gICovCitpbnQKK2NoZWNra2V5ICh2b2lkKQoreworICByZXR1cm4gY3VycmVudF90ZXJtLT5jaGVja2tleSAoKTsKK30KKyNlbmRpZiAvKiAhIFNUQUdFMV81ICovCisKKy8qIERpc3BsYXkgYW4gQVNDSUkgY2hhcmFjdGVyLiAgKi8KK3ZvaWQKK2dydWJfcHV0Y2hhciAoaW50IGMpCit7CisgIGlmIChjID09ICdcbicpCisgICAgZ3J1Yl9wdXRjaGFyICgnXHInKTsKKyNpZm5kZWYgU1RBR0UxXzUKKyAgZWxzZSBpZiAoYyA9PSAnXHQnICYmIGN1cnJlbnRfdGVybS0+Z2V0eHkpCisgICAgeworICAgICAgaW50IG47CisgICAgICAKKyAgICAgIG4gPSA4IC0gKChjdXJyZW50X3Rlcm0tPmdldHh5ICgpID4+IDgpICYgMyk7CisgICAgICB3aGlsZSAobi0tKQorCWdydWJfcHV0Y2hhciAoJyAnKTsKKyAgICAgIAorICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvKiAhIFNUQUdFMV81ICovCisgIAorI2lmZGVmIFNUQUdFMV81CisgIAorICAvKiBJbiBTdGFnZSAxLjUsIG9ubHkgdGhlIG5vcm1hbCBjb25zb2xlIGlzIHN1cHBvcnRlZC4gICovCisgIGNvbnNvbGVfcHV0Y2hhciAoYyk7CisgIAorI2Vsc2UgLyogISBTVEFHRTFfNSAqLworCisgIGlmIChjID09ICdcbicpCisgICAgeworICAgICAgLyogSW50ZXJuYWwgYG1vcmUnLWxpa2UgZmVhdHVyZS4gICovCisgICAgICBpZiAoY291bnRfbGluZXMgPj0gMCkKKwl7CisJICBjb3VudF9saW5lcysrOworCSAgaWYgKGNvdW50X2xpbmVzID49IG1heF9saW5lcyAtIDIpCisJICAgIHsKKwkgICAgICBpbnQgdG1wOworCSAgICAgIAorCSAgICAgIC8qIEl0J3MgaW1wb3J0YW50IHRvIGRpc2FibGUgdGhlIGZlYXR1cmUgdGVtcG9yYXJpbHksIGJlY2F1c2UKKwkJIHRoZSBmb2xsb3dpbmcgZ3J1Yl9wcmludGYgY2FsbCB3aWxsIHByaW50IG5ld2xpbmVzLiAgKi8KKwkgICAgICBjb3VudF9saW5lcyA9IC0xOworCisJICAgICAgaWYgKGN1cnJlbnRfdGVybS0+c2V0Y29sb3JzdGF0ZSkKKwkJY3VycmVudF90ZXJtLT5zZXRjb2xvcnN0YXRlIChDT0xPUl9TVEFURV9ISUdITElHSFQpOworCSAgICAgIAorCSAgICAgIGdydWJfcHJpbnRmICgiXG5bSGl0IHJldHVybiB0byBjb250aW51ZV0iKTsKKworCSAgICAgIGlmIChjdXJyZW50X3Rlcm0tPnNldGNvbG9yc3RhdGUpCisJCWN1cnJlbnRfdGVybS0+c2V0Y29sb3JzdGF0ZSAoQ09MT1JfU1RBVEVfTk9STUFMKTsKKwkgICAgICAKKwkgICAgICBkbworCQl7CisJCSAgdG1wID0gQVNDSUlfQ0hBUiAoZ2V0a2V5ICgpKTsKKwkJfQorCSAgICAgIHdoaWxlICh0bXAgIT0gJ1xuJyAmJiB0bXAgIT0gJ1xyJyk7CisJICAgICAgZ3J1Yl9wcmludGYgKCJcciAgICAgICAgICAgICAgICAgICAgICAgIFxyIik7CisJICAgICAgCisJICAgICAgLyogUmVzdGFydCB0byBjb3VudCBsaW5lcy4gICovCisJICAgICAgY291bnRfbGluZXMgPSAwOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgY3VycmVudF90ZXJtLT5wdXRjaGFyIChjKTsKKyAgCisjZW5kaWYgLyogISBTVEFHRTFfNSAqLworfQorCisjaWZuZGVmIFNUQUdFMV81Cit2b2lkCitnb3RveHkgKGludCB4LCBpbnQgeSkKK3sKKyAgY3VycmVudF90ZXJtLT5nb3RveHkgKHgsIHkpOworfQorCitpbnQKK2dldHh5ICh2b2lkKQoreworICByZXR1cm4gY3VycmVudF90ZXJtLT5nZXR4eSAoKTsKK30KKwordm9pZAorY2xzICh2b2lkKQoreworICAvKiBJZiB0aGUgdGVybWluYWwgaXMgZHVtYiwgdGhlcmUgaXMgbm8gd2F5IHRvIGNsZWFuIHRoZSB0ZXJtaW5hbC4gICovCisgIGlmIChjdXJyZW50X3Rlcm0tPmZsYWdzICYgVEVSTV9EVU1CKQorICAgIGdydWJfcHV0Y2hhciAoJ1xuJyk7CisgIGVsc2UKKyAgICBjdXJyZW50X3Rlcm0tPmNscyAoKTsKK30KKworaW50CitzZXRjdXJzb3IgKGludCBvbikKK3sKKyAgaWYgKGN1cnJlbnRfdGVybS0+c2V0Y3Vyc29yKQorICAgIHJldHVybiBjdXJyZW50X3Rlcm0tPnNldGN1cnNvciAob24pOworCisgIHJldHVybiAxOworfQorI2VuZGlmIC8qICEgU1RBR0UxXzUgKi8KKworaW50CitzdWJzdHJpbmcgKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikKK3sKKyAgd2hpbGUgKCpzMSA9PSAqczIpCisgICAgeworICAgICAgLyogVGhlIHN0cmluZ3MgbWF0Y2ggZXhhY3RseS4gKi8KKyAgICAgIGlmICghICooczErKykpCisJcmV0dXJuIDA7CisgICAgICBzMiArKzsKKyAgICB9CisKKyAgLyogUzEgaXMgYSBzdWJzdHJpbmcgb2YgUzIuICovCisgIGlmICgqczEgPT0gMCkKKyAgICByZXR1cm4gLTE7CisKKyAgLyogUzEgaXNuJ3QgYSBzdWJzdHJpbmcuICovCisgIHJldHVybiAxOworfQorCisjaWZuZGVmIFNUQUdFMV81CisvKiBUZXJtaW5hdGUgdGhlIHN0cmluZyBTVFIgd2l0aCBOVUwuICAqLworaW50CitudWxfdGVybWluYXRlIChjaGFyICpzdHIpCit7CisgIGludCBjaDsKKyAgCisgIHdoaWxlICgqc3RyICYmICEgZ3J1Yl9pc3NwYWNlICgqc3RyKSkKKyAgICBzdHIrKzsKKworICBjaCA9ICpzdHI7CisgICpzdHIgPSAwOworICByZXR1cm4gY2g7Cit9CisKK2NoYXIgKgorZ3J1Yl9zdHJzdHIgKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikKK3sKKyAgd2hpbGUgKCpzMSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpwdHIsICp0bXA7CisKKyAgICAgIHB0ciA9IHMxOworICAgICAgdG1wID0gczI7CisKKyAgICAgIHdoaWxlICgqdG1wICYmICpwdHIgPT0gKnRtcCkKKwlwdHIrKywgdG1wKys7CisgICAgICAKKyAgICAgIGlmICh0bXAgPiBzMiAmJiAhICp0bXApCisJcmV0dXJuIChjaGFyICopIHMxOworCisgICAgICBzMSsrOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworaW50CitncnViX3N0cmxlbiAoY29uc3QgY2hhciAqc3RyKQoreworICBpbnQgbGVuID0gMDsKKworICB3aGlsZSAoKnN0cisrKQorICAgIGxlbisrOworCisgIHJldHVybiBsZW47Cit9CisjZW5kaWYgLyogISBTVEFHRTFfNSAqLworCitpbnQKK21lbWNoZWNrIChpbnQgYWRkciwgaW50IGxlbikKK3sKKyNpZmRlZiBHUlVCX1VUSUwKKyAgYXV0byBpbnQgc3RhcnRfYWRkciAodm9pZCk7CisgIGF1dG8gaW50IGVuZF9hZGRyICh2b2lkKTsKKyAgCisgIGF1dG8gaW50IHN0YXJ0X2FkZHIgKHZvaWQpCisgICAgeworICAgICAgaW50IHJldDsKKyMgaWYgZGVmaW5lZChIQVZFX1NUQVJUX1NZTUJPTCkKKyAgICAgIGFzbSB2b2xhdGlsZSAoIm1vdmwJJHN0YXJ0LCAlMCIgOiAiPWEiIChyZXQpKTsKKyMgZWxpZiBkZWZpbmVkKEhBVkVfVVNDT1JFX1NUQVJUX1NZTUJPTCkKKyAgICAgIGFzbSB2b2xhdGlsZSAoIm1vdmwJJF9zdGFydCwgJTAiIDogIj1hIiAocmV0KSk7CisjIGVuZGlmCisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICBhdXRvIGludCBlbmRfYWRkciAodm9pZCkKKyAgICB7CisgICAgICBpbnQgcmV0OworIyBpZiBkZWZpbmVkKEhBVkVfRU5EX1NZTUJPTCkKKyAgICAgIGFzbSB2b2xhdGlsZSAoIm1vdmwJJGVuZCwgJTAiIDogIj1hIiAocmV0KSk7CisjIGVsaWYgZGVmaW5lZChIQVZFX1VTQ09SRV9FTkRfU1lNQk9MKQorICAgICAgYXNtIHZvbGF0aWxlICgibW92bAkkX2VuZCwgJTAiIDogIj1hIiAocmV0KSk7CisjIGVuZGlmCisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICBpZiAoc3RhcnRfYWRkciAoKSA8PSBhZGRyICYmIGVuZF9hZGRyICgpID4gYWRkciArIGxlbikKKyAgICByZXR1cm4gISBlcnJudW07CisjZW5kaWYgLyogR1JVQl9VVElMICovCisKKyAgaWYgKChhZGRyIDwgUkFXX0FERFIgKDB4MTAwMCkpCisgICAgICB8fCAoYWRkciA8IFJBV19BRERSICgweDEwMDAwMCkKKwkgICYmIFJBV19BRERSIChtYmkubWVtX2xvd2VyICogMTAyNCkgPCAoYWRkciArIGxlbikpCisgICAgICB8fCAoYWRkciA+PSBSQVdfQUREUiAoMHgxMDAwMDApCisJICAmJiBSQVdfQUREUiAobWJpLm1lbV91cHBlciAqIDEwMjQpIDwgKChhZGRyIC0gMHgxMDAwMDApICsgbGVuKSkpCisgICAgZXJybnVtID0gRVJSX1dPTlRfRklUOworCisgIHJldHVybiAhIGVycm51bTsKK30KKwordm9pZCAqCitncnViX21lbW1vdmUgKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBpbnQgbGVuKQoreworICAgaWYgKG1lbWNoZWNrICgoaW50KSB0bywgbGVuKSkKKyAgICAgeworICAgICAgIC8qIFRoaXMgYXNzZW1ibHkgY29kZSBpcyBzdG9sZW4gZnJvbQorCSAgbGludXgtMi4yLjIvaW5jbHVkZS9hc20taTM4Ni9zdHJpbmcuaC4gVGhpcyBpcyBub3QgdmVyeSBmYXN0CisJICBidXQgY29tcGFjdC4gICovCisgICAgICAgaW50IGQwLCBkMSwgZDI7CisKKyAgICAgICBpZiAodG8gPCBmcm9tKQorCSB7CisJICAgYXNtIHZvbGF0aWxlICgiY2xkXG5cdCIKKwkJCSAicmVwXG5cdCIKKwkJCSAibW92c2IiCisJCQkgOiAiPSZjIiAoZDApLCAiPSZTIiAoZDEpLCAiPSZEIiAoZDIpCisJCQkgOiAiMCIgKGxlbiksIjEiIChmcm9tKSwiMiIgKHRvKQorCQkJIDogIm1lbW9yeSIpOworCSB9CisgICAgICAgZWxzZQorCSB7CisJICAgYXNtIHZvbGF0aWxlICgic3RkXG5cdCIKKwkJCSAicmVwXG5cdCIKKwkJCSAibW92c2Jcblx0IgorCQkJICJjbGQiCisJCQkgOiAiPSZjIiAoZDApLCAiPSZTIiAoZDEpLCAiPSZEIiAoZDIpCisJCQkgOiAiMCIgKGxlbiksCisJCQkgIjEiIChsZW4gLSAxICsgKGNvbnN0IGNoYXIgKikgZnJvbSksCisJCQkgIjIiIChsZW4gLSAxICsgKGNoYXIgKikgdG8pCisJCQkgOiAibWVtb3J5Iik7CisJIH0KKyAgICAgfQorCisgICByZXR1cm4gZXJybnVtID8gTlVMTCA6IHRvOworfQorCit2b2lkICoKK2dydWJfbWVtc2V0ICh2b2lkICpzdGFydCwgaW50IGMsIGludCBsZW4pCit7CisgIGNoYXIgKnAgPSBzdGFydDsKKworICBpZiAobWVtY2hlY2sgKChpbnQpIHN0YXJ0LCBsZW4pKQorICAgIHsKKyAgICAgIHdoaWxlIChsZW4gLS0gPiAwKQorCSpwICsrID0gYzsKKyAgICB9CisKKyAgcmV0dXJuIGVycm51bSA/IE5VTEwgOiBzdGFydDsKK30KKworI2lmbmRlZiBTVEFHRTFfNQorY2hhciAqCitncnViX3N0cmNweSAoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKQoreworICBncnViX21lbW1vdmUgKGRlc3QsIHNyYywgZ3J1Yl9zdHJsZW4gKHNyYykgKyAxKTsKKyAgcmV0dXJuIGRlc3Q7Cit9CisjZW5kaWYgLyogISBTVEFHRTFfNSAqLworCisjaWZuZGVmIEdSVUJfVVRJTAorIyB1bmRlZiBtZW1jcHkKKy8qIEdDQyBlbWl0cyByZWZlcmVuY2VzIHRvIG1lbWNweSgpIGZvciBzdHJ1Y3QgY29waWVzIGV0Yy4gICovCit2b2lkICptZW1jcHkgKHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgaW50IG4pICBfX2F0dHJpYnV0ZV9fICgoYWxpYXMgKCJncnViX21lbW1vdmUiKSkpOworI2VuZGlmCmRpZmYgLS1naXQgYS9zdGFnZTIvY21kbGluZS5jIGIvc3RhZ2UyL2NtZGxpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmVlMzA5Ci0tLSAvZGV2L251bGwKKysrIGIvc3RhZ2UyL2NtZGxpbmUuYwpAQCAtMCwwICsxLDI1NyBAQAorLyogY21kbGluZS5jIC0gdGhlIGRldmljZS1pbmRlcGVuZGVudCBHUlVCIHRleHQgY29tbWFuZCBsaW5lICovCisvKgorICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwNCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c2hhcmVkLmg+CisKKyNpZmRlZiBTVVBQT1JUX0RJU0tMRVNTCisjIGRlZmluZSBHUlVCCTEKKyMgaW5jbHVkZSA8ZXRoZXJib290Lmg+CisjZW5kaWYKKworZ3J1Yl9qbXBfYnVmIHJlc3RhcnRfY21kbGluZV9lbnY7CisKKy8qIEZpbmQgdGhlIG5leHQgd29yZCBmcm9tIENNRExJTkUgYW5kIHJldHVybiB0aGUgcG9pbnRlci4gSWYKKyAgIEFGVEVSX0VRVUFMIGlzIG5vbi16ZXJvLCBhc3N1bWUgdGhhdCB0aGUgY2hhcmFjdGVyIGA9JyBpcyB0cmVhdGVkIGFzCisgICBhIHNwYWNlLiBDYXV0aW9uOiB0aGlzIGFzc3VtcHRpb24gaXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICAqLworY2hhciAqCitza2lwX3RvIChpbnQgYWZ0ZXJfZXF1YWwsIGNoYXIgKmNtZGxpbmUpCit7CisgIC8qIFNraXAgdW50aWwgd2UgaGl0IHdoaXRlc3BhY2UsIG9yIG1heWJlIGFuIGVxdWFsIHNpZ24uICovCisgIHdoaWxlICgqY21kbGluZSAmJiAqY21kbGluZSAhPSAnICcgJiYgKmNtZGxpbmUgIT0gJ1x0JyAmJgorCSAhIChhZnRlcl9lcXVhbCAmJiAqY21kbGluZSA9PSAnPScpKQorICAgIGNtZGxpbmUgKys7CisKKyAgLyogU2tpcCB3aGl0ZXNwYWNlLCBhbmQgbWF5YmUgZXF1YWwgc2lnbnMuICovCisgIHdoaWxlICgqY21kbGluZSA9PSAnICcgfHwgKmNtZGxpbmUgPT0gJ1x0JyB8fAorCSAoYWZ0ZXJfZXF1YWwgJiYgKmNtZGxpbmUgPT0gJz0nKSkKKyAgICBjbWRsaW5lICsrOworCisgIHJldHVybiBjbWRsaW5lOworfQorCisvKiBQcmludCBhIGhlbHBmdWwgbWVzc2FnZSBmb3IgdGhlIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UuICAqLwordm9pZAorcHJpbnRfY21kbGluZV9tZXNzYWdlIChpbnQgZm9yZXZlcikKK3sKKyAgcHJpbnRmICgiIFsgTWluaW1hbCBCQVNILWxpa2UgbGluZSBlZGl0aW5nIGlzIHN1cHBvcnRlZC4gIEZvciB0aGUgZmlyc3Qgd29yZCwgVEFCXG4iCisJICAiICAgbGlzdHMgcG9zc2libGUgY29tbWFuZCBjb21wbGV0aW9ucy4gIEFueXdoZXJlIGVsc2UgVEFCIGxpc3RzIHRoZSBwb3NzaWJsZVxuIgorCSAgIiAgIGNvbXBsZXRpb25zIG9mIGEgZGV2aWNlL2ZpbGVuYW1lLiVzIF1cbiIsCisJICAoZm9yZXZlciA/ICIiIDogIiAgRVNDIGF0IGFueSB0aW1lIGV4aXRzLiIpKTsKK30KKworLyogRmluZCB0aGUgYnVpbHRpbiB3aG9zZSBjb21tYW5kIG5hbWUgaXMgQ09NTUFORCBhbmQgcmV0dXJuIHRoZQorICAgcG9pbnRlci4gSWYgbm90IGZvdW5kLCByZXR1cm4gMC4gICovCitzdHJ1Y3QgYnVpbHRpbiAqCitmaW5kX2NvbW1hbmQgKGNoYXIgKmNvbW1hbmQpCit7CisgIGNoYXIgKnB0cjsKKyAgY2hhciBjOworICBzdHJ1Y3QgYnVpbHRpbiAqKmJ1aWx0aW47CisKKyAgLyogRmluZCB0aGUgZmlyc3Qgc3BhY2UgYW5kIHRlcm1pbmF0ZSB0aGUgY29tbWFuZCBuYW1lLiAgKi8KKyAgcHRyID0gY29tbWFuZDsKKyAgd2hpbGUgKCpwdHIgJiYgKnB0ciAhPSAnICcgJiYgKnB0ciAhPSAnXHQnICYmICpwdHIgIT0gJz0nKQorICAgIHB0ciArKzsKKworICBjID0gKnB0cjsKKyAgKnB0ciA9IDA7CisKKyAgLyogU2VlayBvdXQgdGhlIGJ1aWx0aW4gd2hvc2UgY29tbWFuZCBuYW1lIGlzIENPTU1BTkQuICAqLworICBmb3IgKGJ1aWx0aW4gPSBidWlsdGluX3RhYmxlOyAqYnVpbHRpbiAhPSAwOyBidWlsdGluKyspCisgICAgeworICAgICAgaW50IHJldCA9IGdydWJfc3RyY21wIChjb21tYW5kLCAoKmJ1aWx0aW4pLT5uYW1lKTsKKworICAgICAgaWYgKHJldCA9PSAwKQorCXsKKwkgIC8qIEZpbmQgdGhlIGJ1aWx0aW4gZm9yIENPTU1BTkQuICAqLworCSAgKnB0ciA9IGM7CisJICByZXR1cm4gKmJ1aWx0aW47CisJfQorICAgICAgZWxzZSBpZiAocmV0IDwgMCkKKwlicmVhazsKKyAgICB9CisKKyAgLyogQ2Fubm90IGZpbmQgQ09NTUFORC4gICovCisgIGVycm51bSA9IEVSUl9VTlJFQ09HTklaRUQ7CisgICpwdHIgPSBjOworICByZXR1cm4gMDsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgZGF0YSBmb3IgdGhlIGNvbW1hbmQtbGluZS4gICovCitzdGF0aWMgdm9pZAoraW5pdF9jbWRsaW5lICh2b2lkKQoreworICAvKiBJbml0aWFsaXphdGlvbi4gICovCisgIHNhdmVkX2RyaXZlID0gYm9vdF9kcml2ZTsKKyAgc2F2ZWRfcGFydGl0aW9uID0gaW5zdGFsbF9wYXJ0aXRpb247CisgIGN1cnJlbnRfZHJpdmUgPSBHUlVCX0lOVkFMSURfRFJJVkU7CisgIGVycm51bSA9IDA7CisgIGNvdW50X2xpbmVzID0gLTE7CisgIAorICAvKiBSZXN0b3JlIG1lbW9yeSBwcm9iZSBzdGF0ZS4gICovCisgIG1iaS5tZW1fdXBwZXIgPSBzYXZlZF9tZW1fdXBwZXI7CisgIGlmIChtYmkubW1hcF9sZW5ndGgpCisgICAgbWJpLmZsYWdzIHw9IE1CX0lORk9fTUVNX01BUDsKKworICAvKiBJbml0aWFsaXplIHRoZSBkYXRhIGZvciB0aGUgYnVpbHRpbiBjb21tYW5kcy4gICovCisgIGluaXRfYnVpbHRpbnMgKCk7Cit9CisKKy8qIEVudGVyIHRoZSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlLiBIRUFQIGlzIHVzZWQgZm9yIHRoZSBjb21tYW5kLWxpbmUKKyAgIGJ1ZmZlci4gUmV0dXJuIG9ubHkgaWYgRk9SRVZFUiBpcyBub256ZXJvIGFuZCBnZXRfY21kbGluZSByZXR1cm5zCisgICBub256ZXJvIChFU0MgaXMgcHVzaGVkKS4gICovCit2b2lkCitlbnRlcl9jbWRsaW5lIChjaGFyICpoZWFwLCBpbnQgZm9yZXZlcikKK3sKKyAgLyogSW5pdGlhbGl6ZSB0aGUgZGF0YSBhbmQgcHJpbnQgYSBtZXNzYWdlLiAgKi8KKyAgaW5pdF9jbWRsaW5lICgpOworICBncnViX3NldGptcCAocmVzdGFydF9jbWRsaW5lX2Vudik7CisgIGluaXRfcGFnZSAoKTsKKyNpZmRlZiBTVVBQT1JUX0RJU0tMRVNTCisgIHByaW50X25ldHdvcmtfY29uZmlndXJhdGlvbiAoKTsKKyAgZ3J1Yl9wdXRjaGFyICgnXG4nKTsKKyNlbmRpZgorICBwcmludF9jbWRsaW5lX21lc3NhZ2UgKGZvcmV2ZXIpOworICAKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgc3RydWN0IGJ1aWx0aW4gKmJ1aWx0aW47CisgICAgICBjaGFyICphcmc7CisKKyAgICAgICpoZWFwID0gMDsKKyAgICAgIHByaW50X2Vycm9yICgpOworICAgICAgZXJybnVtID0gRVJSX05PTkU7CisKKyAgICAgIC8qIEdldCB0aGUgY29tbWFuZC1saW5lIHdpdGggdGhlIG1pbmltYWwgQkFTSC1saWtlIGludGVyZmFjZS4gICovCisgICAgICBpZiAoZ2V0X2NtZGxpbmUgKFBBQ0tBR0UgIj4gIiwgaGVhcCwgMjA0OCwgMCwgMSkpCisJcmV0dXJuOworCisgICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gY29tbWFuZCwgZ3JhYiBhIG5ldyBvbmUuICovCisgICAgICBpZiAoISBoZWFwWzBdKQorCWNvbnRpbnVlOworCisgICAgICAvKiBGaW5kIGEgYnVpbHRpbi4gICovCisgICAgICBidWlsdGluID0gZmluZF9jb21tYW5kIChoZWFwKTsKKyAgICAgIGlmICghIGJ1aWx0aW4pCisJY29udGludWU7CisKKyAgICAgIC8qIElmIEJVSUxUSU4gY2Fubm90IGJlIHJ1biBpbiB0aGUgY29tbWFuZC1saW5lLCBza2lwIGl0LiAgKi8KKyAgICAgIGlmICghIChidWlsdGluLT5mbGFncyAmIEJVSUxUSU5fQ01ETElORSkpCisJeworCSAgZXJybnVtID0gRVJSX1VOUkVDT0dOSVpFRDsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogSW52YWxpZGF0ZSB0aGUgY2FjaGUsIGJlY2F1c2UgdGhlIHVzZXIgbWF5IGV4Y2hhbmdlIHJlbW92YWJsZQorCSBkaXNrcy4gICovCisgICAgICBidWZfZHJpdmUgPSAtMTsKKworICAgICAgLyogU3RhcnQgdG8gY291bnQgbGluZXMsIG9ubHkgaWYgdGhlIGludGVybmFsIHBhZ2VyIGlzIGluIHVzZS4gICovCisgICAgICBpZiAodXNlX3BhZ2VyKQorCWNvdW50X2xpbmVzID0gMDsKKyAgICAgIAorICAgICAgLyogUnVuIEJVSUxUSU4tPkZVTkMuICAqLworICAgICAgYXJnID0gc2tpcF90byAoMSwgaGVhcCk7CisgICAgICAoYnVpbHRpbi0+ZnVuYykgKGFyZywgQlVJTFRJTl9DTURMSU5FKTsKKworICAgICAgLyogRmluaXNoIHRoZSBsaW5lIGNvdW50LiAgKi8KKyAgICAgIGNvdW50X2xpbmVzID0gLTE7CisgICAgfQorfQorCisvKiBSdW4gYW4gZW50cnkgZnJvbSB0aGUgc2NyaXB0IFNDUklQVC4gSEVBUCBpcyB1c2VkIGZvciB0aGUKKyAgIGNvbW1hbmQtbGluZSBidWZmZXIuIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJuIG5vbi16ZXJvLCBvdGhlcndpc2UKKyAgIHJldHVybiB6ZXJvLiAgKi8KK2ludAorcnVuX3NjcmlwdCAoY2hhciAqc2NyaXB0LCBjaGFyICpoZWFwKQoreworICBjaGFyICpvbGRfZW50cnk7CisgIGNoYXIgKmN1cl9lbnRyeSA9IHNjcmlwdDsKKworICAvKiBJbml0aWFsaXplIHRoZSBkYXRhLiAgKi8KKyAgaW5pdF9jbWRsaW5lICgpOworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIHN0cnVjdCBidWlsdGluICpidWlsdGluOworICAgICAgY2hhciAqYXJnOworCisgICAgICBwcmludF9lcnJvciAoKTsKKworICAgICAgaWYgKGVycm51bSkKKwl7CisJICBlcnJudW0gPSBFUlJfTk9ORTsKKworCSAgLyogSWYgYSBmYWxsYmFjayBlbnRyeSBpcyBkZWZpbmVkLCBkb24ndCBwcm9tcHQgYSB1c2VyJ3MKKwkgICAgIGludGVydmVudGlvbi4gICovCisJICBpZiAoZmFsbGJhY2tfZW50cnlubyA8IDApCisJICAgIHsKKwkgICAgICBncnViX3ByaW50ZiAoIlxuUHJlc3MgYW55IGtleSB0byBjb250aW51ZS4uLiIpOworCSAgICAgICh2b2lkKSBnZXRrZXkgKCk7CisJICAgIH0KKwkgIAorCSAgcmV0dXJuIDE7CisJfQorCisgICAgICAvKiBDb3B5IHRoZSBmaXJzdCBzdHJpbmcgaW4gQ1VSX0VOVFJZIHRvIEhFQVAuICAqLworICAgICAgb2xkX2VudHJ5ID0gY3VyX2VudHJ5OworICAgICAgd2hpbGUgKCpjdXJfZW50cnkrKykKKwk7CisKKyAgICAgIGdydWJfbWVtbW92ZSAoaGVhcCwgb2xkX2VudHJ5LCAoaW50KSBjdXJfZW50cnkgLSAoaW50KSBvbGRfZW50cnkpOworICAgICAgaWYgKCEgKmhlYXApCisJeworCSAgLyogSWYgdGhlcmUgaXMgbm8gbW9yZSBjb21tYW5kIGluIFNDUklQVC4uLiAgKi8KKworCSAgLyogSWYgYW55IGtlcm5lbCBpcyBub3QgbG9hZGVkLCBqdXN0IGV4aXQgc3VjY2Vzc2Z1bGx5LiAgKi8KKwkgIGlmIChrZXJuZWxfdHlwZSA9PSBLRVJORUxfVFlQRV9OT05FKQorCSAgICByZXR1cm4gMDsKKworCSAgLyogT3RoZXJ3aXNlLCB0aGUgY29tbWFuZCBib290IGlzIHJ1biBpbXBsaWNpdGx5LiAgKi8KKwkgIGdydWJfbWVtbW92ZSAoaGVhcCwgImJvb3QiLCA1KTsKKwl9CisKKyAgICAgIC8qIEZpbmQgYSBidWlsdGluLiAgKi8KKyAgICAgIGJ1aWx0aW4gPSBmaW5kX2NvbW1hbmQgKGhlYXApOworICAgICAgaWYgKCEgYnVpbHRpbikKKwl7CisJICBncnViX3ByaW50ZiAoIiVzXG4iLCBvbGRfZW50cnkpOworCSAgY29udGludWU7CisJfQorCisgICAgICBpZiAoISAoYnVpbHRpbi0+ZmxhZ3MgJiBCVUlMVElOX05PX0VDSE8pKQorCWdydWJfcHJpbnRmICgiJXNcbiIsIG9sZF9lbnRyeSk7CisKKyAgICAgIC8qIElmIEJVSUxUSU4gY2Fubm90IGJlIHJ1biBpbiB0aGUgY29tbWFuZC1saW5lLCBza2lwIGl0LiAgKi8KKyAgICAgIGlmICghIChidWlsdGluLT5mbGFncyAmIEJVSUxUSU5fQ01ETElORSkpCisJeworCSAgZXJybnVtID0gRVJSX1VOUkVDT0dOSVpFRDsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogSW52YWxpZGF0ZSB0aGUgY2FjaGUsIGJlY2F1c2UgdGhlIHVzZXIgbWF5IGV4Y2hhbmdlIHJlbW92YWJsZQorCSBkaXNrcy4gICovCisgICAgICBidWZfZHJpdmUgPSAtMTsKKworICAgICAgLyogUnVuIEJVSUxUSU4tPkZVTkMuICAqLworICAgICAgYXJnID0gc2tpcF90byAoMSwgaGVhcCk7CisgICAgICAoYnVpbHRpbi0+ZnVuYykgKGFyZywgQlVJTFRJTl9TQ1JJUFQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3N0YWdlMi9jb21tb24uYyBiL3N0YWdlMi9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWY5ZTMxCi0tLSAvZGV2L251bGwKKysrIGIvc3RhZ2UyL2NvbW1vbi5jCkBAIC0wLDAgKzEsMzM3IEBACisvKiBjb21tb24uYyAtIG1pc2NlbGxhbmVvdXMgc2hhcmVkIHZhcmlhYmxlcyBhbmQgcm91dGluZXMgKi8KKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDA0ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxzaGFyZWQuaD4KKworI2lmZGVmIFNVUFBPUlRfRElTS0xFU1MKKyMgZGVmaW5lIEdSVUIJMQorIyBpbmNsdWRlIDxldGhlcmJvb3QuaD4KKyNlbmRpZgorCisvKgorICogIFNoYXJlZCBCSU9TL2Jvb3QgZGF0YS4KKyAqLworCitzdHJ1Y3QgbXVsdGlib290X2luZm8gbWJpOwordW5zaWduZWQgbG9uZyBzYXZlZF9kcml2ZTsKK3Vuc2lnbmVkIGxvbmcgc2F2ZWRfcGFydGl0aW9uOwordW5zaWduZWQgbG9uZyBjZHJvbV9kcml2ZTsKKyNpZm5kZWYgU1RBR0UxXzUKK3Vuc2lnbmVkIGxvbmcgc2F2ZWRfbWVtX3VwcGVyOworCisvKiBUaGlzIHNhdmVzIHRoZSBtYXhpbXVtIHNpemUgb2YgZXh0ZW5kZWQgbWVtb3J5IChpbiBLQikuICAqLwordW5zaWduZWQgbG9uZyBleHRlbmRlZF9tZW1vcnk7CisjZW5kaWYKKworLyoKKyAqICBFcnJvciBjb2RlIHN0dWZmLgorICovCisKK2dydWJfZXJyb3JfdCBlcnJudW0gPSBFUlJfTk9ORTsKKworI2lmbmRlZiBTVEFHRTFfNQorCitjaGFyICplcnJfbGlzdFtdID0KK3sKKyAgW0VSUl9OT05FXSA9IDAsCisgIFtFUlJfQkFEX0FSR1VNRU5UXSA9ICJJbnZhbGlkIGFyZ3VtZW50IiwKKyAgW0VSUl9CQURfRklMRU5BTUVdID0KKyAgIkZpbGVuYW1lIG11c3QgYmUgZWl0aGVyIGFuIGFic29sdXRlIHBhdGhuYW1lIG9yIGJsb2NrbGlzdCIsCisgIFtFUlJfQkFEX0ZJTEVUWVBFXSA9ICJCYWQgZmlsZSBvciBkaXJlY3RvcnkgdHlwZSIsCisgIFtFUlJfQkFEX0daSVBfREFUQV0gPSAiQmFkIG9yIGNvcnJ1cHQgZGF0YSB3aGlsZSBkZWNvbXByZXNzaW5nIGZpbGUiLAorICBbRVJSX0JBRF9HWklQX0hFQURFUl0gPSAiQmFkIG9yIGluY29tcGF0aWJsZSBoZWFkZXIgaW4gY29tcHJlc3NlZCBmaWxlIiwKKyAgW0VSUl9CQURfUEFSVF9UQUJMRV0gPSAiUGFydGl0aW9uIHRhYmxlIGludmFsaWQgb3IgY29ycnVwdCIsCisgIFtFUlJfQkFEX1ZFUlNJT05dID0gIk1pc21hdGNoZWQgb3IgY29ycnVwdCB2ZXJzaW9uIG9mIHN0YWdlMS9zdGFnZTIiLAorICBbRVJSX0JFTE9XXzFNQl0gPSAiTG9hZGluZyBiZWxvdyAxTUIgaXMgbm90IHN1cHBvcnRlZCIsCisgIFtFUlJfQk9PVF9DT01NQU5EXSA9ICJLZXJuZWwgbXVzdCBiZSBsb2FkZWQgYmVmb3JlIGJvb3RpbmciLAorICBbRVJSX0JPT1RfRkFJTFVSRV0gPSAiVW5rbm93biBib290IGZhaWx1cmUiLAorICBbRVJSX0JPT1RfRkVBVFVSRVNdID0gIlVuc3VwcG9ydGVkIE11bHRpYm9vdCBmZWF0dXJlcyByZXF1ZXN0ZWQiLAorICBbRVJSX0RFVl9GT1JNQVRdID0gIlVucmVjb2duaXplZCBkZXZpY2Ugc3RyaW5nIiwKKyAgW0VSUl9ERVZfTkVFRF9JTklUXSA9ICJEZXZpY2Ugbm90IGluaXRpYWxpemVkIHlldCIsCisgIFtFUlJfREVWX1ZBTFVFU10gPSAiSW52YWxpZCBkZXZpY2UgcmVxdWVzdGVkIiwKKyAgW0VSUl9FWEVDX0ZPUk1BVF0gPSAiSW52YWxpZCBvciB1bnN1cHBvcnRlZCBleGVjdXRhYmxlIGZvcm1hdCIsCisgIFtFUlJfRklMRUxFTkdUSF0gPQorICAiRmlsZXN5c3RlbSBjb21wYXRpYmlsaXR5IGVycm9yLCBjYW5ub3QgcmVhZCB3aG9sZSBmaWxlIiwKKyAgW0VSUl9GSUxFX05PVF9GT1VORF0gPSAiRmlsZSBub3QgZm91bmQiLAorICBbRVJSX0ZTWVNfQ09SUlVQVF0gPSAiSW5jb25zaXN0ZW50IGZpbGVzeXN0ZW0gc3RydWN0dXJlIiwKKyAgW0VSUl9GU1lTX01PVU5UXSA9ICJDYW5ub3QgbW91bnQgc2VsZWN0ZWQgcGFydGl0aW9uIiwKKyAgW0VSUl9HRU9NXSA9ICJTZWxlY3RlZCBjeWxpbmRlciBleGNlZWRzIG1heGltdW0gc3VwcG9ydGVkIGJ5IEJJT1MiLAorICBbRVJSX05FRURfTFhfS0VSTkVMXSA9ICJMaW51eCBrZXJuZWwgbXVzdCBiZSBsb2FkZWQgYmVmb3JlIGluaXRyZCIsCisgIFtFUlJfTkVFRF9NQl9LRVJORUxdID0gIk11bHRpYm9vdCBrZXJuZWwgbXVzdCBiZSBsb2FkZWQgYmVmb3JlIG1vZHVsZXMiLAorICBbRVJSX05PX0RJU0tdID0gIlNlbGVjdGVkIGRpc2sgZG9lcyBub3QgZXhpc3QiLAorICBbRVJSX05PX0RJU0tfU1BBQ0VdID0gIk5vIHNwYXJlIHNlY3RvcnMgb24gdGhlIGRpc2siLAorICBbRVJSX05PX1BBUlRdID0gIk5vIHN1Y2ggcGFydGl0aW9uIiwKKyAgW0VSUl9OVU1CRVJfT1ZFUkZMT1ddID0gIk92ZXJmbG93IHdoaWxlIHBhcnNpbmcgbnVtYmVyIiwKKyAgW0VSUl9OVU1CRVJfUEFSU0lOR10gPSAiRXJyb3Igd2hpbGUgcGFyc2luZyBudW1iZXIiLAorICBbRVJSX09VVFNJREVfUEFSVF0gPSAiQXR0ZW1wdCB0byBhY2Nlc3MgYmxvY2sgb3V0c2lkZSBwYXJ0aXRpb24iLAorICBbRVJSX1BSSVZJTEVHRURdID0gIk11c3QgYmUgYXV0aGVudGljYXRlZCIsCisgIFtFUlJfUkVBRF0gPSAiRGlzayByZWFkIGVycm9yIiwKKyAgW0VSUl9TWU1MSU5LX0xPT1BdID0gIlRvbyBtYW55IHN5bWJvbGljIGxpbmtzIiwKKyAgW0VSUl9VTkFMSUdORURdID0gIkZpbGUgaXMgbm90IHNlY3RvciBhbGlnbmVkIiwKKyAgW0VSUl9VTlJFQ09HTklaRURdID0gIlVucmVjb2duaXplZCBjb21tYW5kIiwKKyAgW0VSUl9XT05UX0ZJVF0gPSAiU2VsZWN0ZWQgaXRlbSBjYW5ub3QgZml0IGludG8gbWVtb3J5IiwKKyAgW0VSUl9XUklURV0gPSAiRGlzayB3cml0ZSBlcnJvciIsCit9OworCisKKy8qIHN0YXRpYyBmb3IgQklPUyBtZW1vcnkgbWFwIGZha2VyeSAqLworc3RhdGljIHN0cnVjdCBBZGRyUmFuZ2VEZXNjIGZha2VtYXBbM10gPQoreworICB7MjAsIDAsIDAsIE1CX0FSRF9NRU1PUll9LAorICB7MjAsIDB4MTAwMDAwLCAwLCBNQl9BUkRfTUVNT1JZfSwKKyAgezIwLCAweDEwMDAwMDAsIDAsIE1CX0FSRF9NRU1PUll9Cit9OworCisvKiBBIGJpZyBwcm9ibGVtIGlzIHRoYXQgdGhlIG1lbW9yeSBhcmVhcyBhcmVuJ3QgZ3VhcmFudGVlZCB0byBiZToKKyAgICgxKSBjb250aWd1b3VzLCAoMikgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlciwgb3IgKDMpIG5vbi1vdmVybGFwcGluZy4KKyAgIFRodXMgdGhpcyBrbHVkZ2UuICAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcKK21tYXBfYXZhaWxfYXQgKHVuc2lnbmVkIGxvbmcgYm90dG9tKQoreworICB1bnNpZ25lZCBsb25nIGxvbmcgdG9wOworICB1bnNpZ25lZCBsb25nIGFkZHI7CisgIGludCBjb250OworICAKKyAgdG9wID0gYm90dG9tOworICBkbworICAgIHsKKyAgICAgIGZvciAoY29udCA9IDAsIGFkZHIgPSBtYmkubW1hcF9hZGRyOworCSAgIGFkZHIgPCBtYmkubW1hcF9hZGRyICsgbWJpLm1tYXBfbGVuZ3RoOworCSAgIGFkZHIgKz0gKigodW5zaWduZWQgbG9uZyAqKSBhZGRyKSArIDQpCisJeworCSAgc3RydWN0IEFkZHJSYW5nZURlc2MgKmRlc2MgPSAoc3RydWN0IEFkZHJSYW5nZURlc2MgKikgYWRkcjsKKwkgIAorCSAgaWYgKGRlc2MtPlR5cGUgPT0gTUJfQVJEX01FTU9SWQorCSAgICAgICYmIGRlc2MtPkJhc2VBZGRyIDw9IHRvcAorCSAgICAgICYmIGRlc2MtPkJhc2VBZGRyICsgZGVzYy0+TGVuZ3RoID4gdG9wKQorCSAgICB7CisJICAgICAgdG9wID0gZGVzYy0+QmFzZUFkZHIgKyBkZXNjLT5MZW5ndGg7CisJICAgICAgY29udCsrOworCSAgICB9CisJfQorICAgIH0KKyAgd2hpbGUgKGNvbnQpOworCisgIC8qIEZvciBub3csIEdSVUIgYXNzdW1lcyAzMmJpdHMgYWRkcmVzc2VzLCBzby4uLiAgKi8KKyAgaWYgKHRvcCA+IDB4RkZGRkZGRkYpCisgICAgdG9wID0gMHhGRkZGRkZGRjsKKyAgCisgIHJldHVybiAodW5zaWduZWQgbG9uZykgdG9wIC0gYm90dG9tOworfQorI2VuZGlmIC8qICEgU1RBR0UxXzUgKi8KKworLyogVGhpcyBxdWVyaWVzIGZvciBCSU9TIGluZm9ybWF0aW9uLiAgKi8KK3ZvaWQKK2luaXRfYmlvc19pbmZvICh2b2lkKQoreworI2lmbmRlZiBTVEFHRTFfNQorICB1bnNpZ25lZCBsb25nIGNvbnQsIG1lbXRtcCwgYWRkcjsKKyAgaW50IGRyaXZlOworI2VuZGlmCisKKyAgLyoKKyAgICogIEdldCBpbmZvcm1hdGlvbiBmcm9tIEJJT1Mgb24gaW5zdGFsbGVkIFJBTS4KKyAgICovCisKKyAgbWJpLm1lbV9sb3dlciA9IGdldF9tZW1zaXplICgwKTsKKyAgbWJpLm1lbV91cHBlciA9IGdldF9tZW1zaXplICgxKTsKKworI2lmbmRlZiBTVEFHRTFfNQorICAvKgorICAgKiAgV2UgbmVlZCB0byBjYWxsIHRoaXMgc29tZXdoZXJlIGJlZm9yZSB0cnlpbmcgdG8gcHV0IGRhdGEKKyAgICogIGFib3ZlIDEgTUIsIHNpbmNlIHdpdGhvdXQgY2FsbGluZyBpdCwgYWRkcmVzcyBsaW5lIDIwIHdpbGwgYmUgd2lyZWQKKyAgICogIHRvIDAuICBOb3QgdG9vIGRlc2lyYWJsZS4KKyAgICovCisKKyAgZ2F0ZUEyMCAoMSk7CisKKyAgLyogU3RvcmUgdGhlIHNpemUgb2YgZXh0ZW5kZWQgbWVtb3J5IGluIEVYVEVOREVEX01FTU9SWSwgaW4gb3JkZXIgdG8KKyAgICAgdGVsbCBpdCB0byBub24tTXVsdGlib290IE9TZXMuICAqLworICBleHRlbmRlZF9tZW1vcnkgPSBtYmkubWVtX3VwcGVyOworICAKKyAgLyoKKyAgICogIFRoZSAibWJpLm1lbV91cHBlciIgdmFyaWFibGUgb25seSByZWNvZ25pemVzIHVwcGVyIG1lbW9yeSBpbiB0aGUKKyAgICogIGZpcnN0IG1lbW9yeSByZWdpb24uICBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWVtb3J5IHJlZ2lvbnMsCisgICAqICB0aGUgcmVzdCBhcmUgcmVwb3J0ZWQgdG8gYSBNdWx0aWJvb3QtY29tcGxpYW50IE9TLCBidXQgb3RoZXJ3aXNlCisgICAqICB1bnVzZWQgYnkgR1JVQi4KKyAgICovCisKKyAgYWRkciA9IGdldF9jb2RlX2VuZCAoKTsKKyAgbWJpLm1tYXBfYWRkciA9IGFkZHI7CisgIG1iaS5tbWFwX2xlbmd0aCA9IDA7CisgIGNvbnQgPSAwOworCisgIGRvCisgICAgeworICAgICAgY29udCA9IGdldF9tbWFwX2VudHJ5ICgodm9pZCAqKSBhZGRyLCBjb250KTsKKworICAgICAgLyogSWYgdGhlIHJldHVybmVkIGJ1ZmZlcidzIGxlbmd0aCBpcyB6ZXJvLCBxdWl0LiAqLworICAgICAgaWYgKCEgKigodW5zaWduZWQgbG9uZyAqKSBhZGRyKSkKKwlicmVhazsKKworICAgICAgbWJpLm1tYXBfbGVuZ3RoICs9ICooKHVuc2lnbmVkIGxvbmcgKikgYWRkcikgKyA0OworICAgICAgYWRkciArPSAqKCh1bnNpZ25lZCBsb25nICopIGFkZHIpICsgNDsKKyAgICB9CisgIHdoaWxlIChjb250KTsKKworICBpZiAobWJpLm1tYXBfbGVuZ3RoKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBtYXhfYWRkcjsKKyAgICAgIAorICAgICAgLyoKKyAgICAgICAqICBUaGlzIGlzIHRvIGdldCB0aGUgbG93ZXIgbWVtb3J5LCBhbmQgdXBwZXIgbWVtb3J5ICh1cCB0byB0aGUKKyAgICAgICAqICBmaXJzdCBtZW1vcnkgaG9sZSksIGludG8gdGhlICJtYmkubWVtX3tsb3dlcix1cHBlcn0iCisgICAgICAgKiAgZWxlbWVudHMuICBUaGlzIGlzIGZvciBPUydzIHRoYXQgZG9uJ3QgY2FyZSBhYm91dCB0aGUgbWVtb3J5CisgICAgICAgKiAgbWFwLCBidXQgbWlnaHQgY2FyZSBhYm91dCB0b3RhbCBSQU0gYXZhaWxhYmxlLgorICAgICAgICovCisgICAgICBtYmkubWVtX2xvd2VyID0gbW1hcF9hdmFpbF9hdCAoMCkgPj4gMTA7CisgICAgICBtYmkubWVtX3VwcGVyID0gbW1hcF9hdmFpbF9hdCAoMHgxMDAwMDApID4+IDEwOworCisgICAgICAvKiBGaW5kIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSBhZGRyZXNzLiBJZ25vcmUgYW55IG1lbW9yeSBob2xlcy4gICovCisgICAgICBmb3IgKG1heF9hZGRyID0gMCwgYWRkciA9IG1iaS5tbWFwX2FkZHI7CisJICAgYWRkciA8IG1iaS5tbWFwX2FkZHIgKyBtYmkubW1hcF9sZW5ndGg7CisJICAgYWRkciArPSAqKCh1bnNpZ25lZCBsb25nICopIGFkZHIpICsgNCkKKwl7CisJICBzdHJ1Y3QgQWRkclJhbmdlRGVzYyAqZGVzYyA9IChzdHJ1Y3QgQWRkclJhbmdlRGVzYyAqKSBhZGRyOworCSAgCisJICBpZiAoZGVzYy0+VHlwZSA9PSBNQl9BUkRfTUVNT1JZICYmIGRlc2MtPkxlbmd0aCA+IDAKKwkgICAgICAmJiBkZXNjLT5CYXNlQWRkciArIGRlc2MtPkxlbmd0aCA+IG1heF9hZGRyKQorCSAgICBtYXhfYWRkciA9IGRlc2MtPkJhc2VBZGRyICsgZGVzYy0+TGVuZ3RoOworCX0KKworICAgICAgZXh0ZW5kZWRfbWVtb3J5ID0gKG1heF9hZGRyIC0gMHgxMDAwMDApID4+IDEwOworICAgIH0KKyAgZWxzZSBpZiAoKG1lbXRtcCA9IGdldF9laXNhbWVtc2l6ZSAoKSkgIT0gLTEpCisgICAgeworICAgICAgY29udCA9IG1lbXRtcCAmIH4weEZGRkY7CisgICAgICBtZW10bXAgPSBtZW10bXAgJiAweEZGRkY7CisKKyAgICAgIGlmIChjb250ICE9IDApCisJZXh0ZW5kZWRfbWVtb3J5ID0gKGNvbnQgPj4gMTApICsgMHgzYzAwOworICAgICAgZWxzZQorCWV4dGVuZGVkX21lbW9yeSA9IG1lbXRtcDsKKyAgICAgIAorICAgICAgaWYgKCFjb250IHx8IChtZW10bXAgPT0gMHgzYzAwKSkKKwltZW10bXAgKz0gKGNvbnQgPj4gMTApOworICAgICAgZWxzZQorCXsKKwkgIC8qIFhYWCBzaG91bGQgSSBkbyB0aGlzIGF0IGFsbCA/Pz8gKi8KKworCSAgbWJpLm1tYXBfYWRkciA9ICh1bnNpZ25lZCBsb25nKSBmYWtlbWFwOworCSAgbWJpLm1tYXBfbGVuZ3RoID0gc2l6ZW9mIChmYWtlbWFwKTsKKwkgIGZha2VtYXBbMF0uTGVuZ3RoID0gKG1iaS5tZW1fbG93ZXIgPDwgMTApOworCSAgZmFrZW1hcFsxXS5MZW5ndGggPSAobWVtdG1wIDw8IDEwKTsKKwkgIGZha2VtYXBbMl0uTGVuZ3RoID0gY29udDsKKwl9CisKKyAgICAgIG1iaS5tZW1fdXBwZXIgPSBtZW10bXA7CisgICAgfQorCisgIHNhdmVkX21lbV91cHBlciA9IG1iaS5tZW1fdXBwZXI7CisKKyAgLyogR2V0IHRoZSBkcml2ZSBpbmZvLiAgKi8KKyAgLyogRklYTUU6IFRoaXMgc2hvdWxkIGJlIHBvc3Rwb25lZCB1bnRpbCBhIE11bHRpYm9vdCBrZXJuZWwgYWN0dWFsbHkKKyAgICAgcmVxdWlyZXMgaXQsIGJlY2F1c2UgdGhpcyBjb3VsZCBzbG93IGRvd24gdGhlIHN0YXJ0LXVwCisgICAgIHVucmVhc29uYWJseS4gICovCisgIG1iaS5kcml2ZXNfbGVuZ3RoID0gMDsKKyAgbWJpLmRyaXZlc19hZGRyID0gYWRkcjsKKworICAvKiBGb3Igbm93LCBHUlVCIGRvZXNuJ3QgcHJvYmUgZmxvcHBpZXMsIHNpbmNlIGl0IGlzIHRyaXZpYWwgdG8gbWFwCisgICAgIGZsb3BweSBkcml2ZXMgdG8gQklPUyBkcml2ZXMuICAqLworICBmb3IgKGRyaXZlID0gMHg4MDsgZHJpdmUgPCAweDg4OyBkcml2ZSsrKQorICAgIHsKKyAgICAgIHN0cnVjdCBnZW9tZXRyeSBnZW9tOworICAgICAgc3RydWN0IGRyaXZlX2luZm8gKmluZm8gPSAoc3RydWN0IGRyaXZlX2luZm8gKikgYWRkcjsKKyAgICAgIHVuc2lnbmVkIHNob3J0ICpwb3J0OworICAgICAgCisgICAgICAvKiBHZXQgdGhlIGdlb21ldHJ5LiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgZHJpdmUgaXMgcHJlc2VudC4gICovCisgICAgICBpZiAoZ2V0X2Rpc2tpbmZvIChkcml2ZSwgJmdlb20pKQorCWJyZWFrOworICAgICAgCisgICAgICAvKiBDbGVhbiBvdXQgdGhlIEkvTyBtYXAuICAqLworICAgICAgZ3J1Yl9tZW1zZXQgKChjaGFyICopIGlvX21hcCwgMCwKKwkJICAgSU9fTUFQX1NJWkUgKiBzaXplb2YgKHVuc2lnbmVkIHNob3J0KSk7CisKKyAgICAgIC8qIERpc2FibGUgdG8gcHJvYmUgSS9PIHBvcnRzIHRlbXBvcmFyaWx5LCBiZWNhdXNlIHRoaXMgZG9lc24ndAorCSB3b3JrIHdpdGggc29tZSBCSU9TZXMgKG1heWJlIHRoZXkgYXJlIHRvbyBidWdneSkuICAqLworI2lmIDAKKyAgICAgIC8qIFRyYWNrIHRoZSBpbnQxMyBoYW5kbGVyLiAgKi8KKyAgICAgIHRyYWNrX2ludDEzIChkcml2ZSk7CisjZW5kaWYKKworICAgICAgLyogU2V0IHRoZSBpbmZvcm1hdGlvbi4gICovCisgICAgICBpbmZvLT5kcml2ZV9udW1iZXIgPSBkcml2ZTsKKyAgICAgIGluZm8tPmRyaXZlX21vZGUgPSAoKGdlb20uZmxhZ3MgJiBCSU9TRElTS19GTEFHX0xCQV9FWFRFTlNJT04pCisJCQkgID8gTUJfRElfTEJBX01PREUgOiBNQl9ESV9DSFNfTU9ERSk7CisgICAgICBpbmZvLT5kcml2ZV9jeWxpbmRlcnMgPSBnZW9tLmN5bGluZGVyczsKKyAgICAgIGluZm8tPmRyaXZlX2hlYWRzID0gZ2VvbS5oZWFkczsKKyAgICAgIGluZm8tPmRyaXZlX3NlY3RvcnMgPSBnZW9tLnNlY3RvcnM7CisKKyAgICAgIGFkZHIgKz0gc2l6ZW9mIChzdHJ1Y3QgZHJpdmVfaW5mbyk7CisgICAgICBmb3IgKHBvcnQgPSBpb19tYXA7ICpwb3J0OyBwb3J0KyssIGFkZHIgKz0gc2l6ZW9mICh1bnNpZ25lZCBzaG9ydCkpCisJKigodW5zaWduZWQgc2hvcnQgKikgYWRkcikgPSAqcG9ydDsKKworICAgICAgaW5mby0+c2l6ZSA9IGFkZHIgLSAodW5zaWduZWQgbG9uZykgaW5mbzsKKyAgICAgIG1iaS5kcml2ZXNfbGVuZ3RoICs9IGluZm8tPnNpemU7CisgICAgfQorCisgIC8qIEdldCB0aGUgUk9NIGNvbmZpZ3VyYXRpb24gdGFibGUgYnkgSU5UIDE1LCBBSD1DMGguICAqLworICBtYmkuY29uZmlnX3RhYmxlID0gZ2V0X3JvbV9jb25maWdfdGFibGUgKCk7CisKKyAgLyogU2V0IHRoZSBib290IGxvYWRlciBuYW1lLiAgKi8KKyAgbWJpLmJvb3RfbG9hZGVyX25hbWUgPSAodW5zaWduZWQgbG9uZykgIkdOVSBHUlVCICIgVkVSU0lPTjsKKworICAvKiBHZXQgdGhlIEFQTSBCSU9TIHRhYmxlLiAgKi8KKyAgZ2V0X2FwbV9pbmZvICgpOworICBpZiAoYXBtX2Jpb3NfaW5mby52ZXJzaW9uKQorICAgIG1iaS5hcG1fdGFibGUgPSAodW5zaWduZWQgbG9uZykgJmFwbV9iaW9zX2luZm87CisgIAorICAvKgorICAgKiAgSW5pdGlhbGl6ZSBvdGhlciBNdWx0aWJvb3QgSW5mbyBmbGFncy4KKyAgICovCisKKyAgbWJpLmZsYWdzID0gKE1CX0lORk9fTUVNT1JZIHwgTUJfSU5GT19DTURMSU5FIHwgTUJfSU5GT19CT09UREVWCisJICAgICAgIHwgTUJfSU5GT19EUklWRV9JTkZPIHwgTUJfSU5GT19DT05GSUdfVEFCTEUKKwkgICAgICAgfCBNQl9JTkZPX0JPT1RfTE9BREVSX05BTUUpOworICAKKyAgaWYgKGFwbV9iaW9zX2luZm8udmVyc2lvbikKKyAgICBtYmkuZmxhZ3MgfD0gTUJfSU5GT19BUE1fVEFCTEU7CisKKyNlbmRpZiAvKiBTVEFHRTFfNSAqLworCisgIC8qIFNldCBib290IGRyaXZlIGFuZCBwYXJ0aXRpb24uICAqLworICBzYXZlZF9kcml2ZSA9IGJvb3RfZHJpdmU7CisgIHNhdmVkX3BhcnRpdGlvbiA9IGluc3RhbGxfcGFydGl0aW9uOworCisgIC8qIFNldCBjZHJvbSBkcml2ZS4gICovCisgIHsKKyAgICBzdHJ1Y3QgZ2VvbWV0cnkgZ2VvbTsKKyAgICAKKyAgICAvKiBHZXQgdGhlIGdlb21ldHJ5LiAgKi8KKyAgICBpZiAoZ2V0X2Rpc2tpbmZvIChib290X2RyaXZlLCAmZ2VvbSkKKwl8fCAhIChnZW9tLmZsYWdzICYgQklPU0RJU0tfRkxBR19DRFJPTSkpCisgICAgICBjZHJvbV9kcml2ZSA9IEdSVUJfSU5WQUxJRF9EUklWRTsKKyAgICBlbHNlCisgICAgICBjZHJvbV9kcml2ZSA9IGJvb3RfZHJpdmU7CisgIH0KKyAgCisgIC8qIFN0YXJ0IG1haW4gcm91dGluZSBoZXJlLiAgKi8KKyAgY21haW4gKCk7Cit9CmRpZmYgLS1naXQgYS9zdGFnZTIvY29uc29sZS5jIGIvc3RhZ2UyL2NvbnNvbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmUyMTJlCi0tLSAvZGV2L251bGwKKysrIGIvc3RhZ2UyL2NvbnNvbGUuYwpAQCAtMCwwICsxLDYyIEBACisvKiB0ZXJtX2NvbnNvbGUuYyAtIGNvbnNvbGUgaW5wdXQgYW5kIG91dHB1dCAqLworLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxzaGFyZWQuaD4KKyNpbmNsdWRlIDx0ZXJtLmg+CisKKy8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBpbiBhc20uUyBpbnN0ZWFkIG9mIHRoaXMgZmlsZToKKyAgIGNvbnNvbGVfcHV0Y2hhciwgY29uc29sZV9jaGVja2tleSwgY29uc29sZV9nZXRrZXksIGNvbnNvbGVfZ2V0eHksCisgICBjb25zb2xlX2dvdG94eSwgY29uc29sZV9jbHMsIGFuZCBjb25zb2xlX25vY3Vyc29yLiAgKi8KKworaW50IGNvbnNvbGVfY3VycmVudF9jb2xvciA9IEFfTk9STUFMOworc3RhdGljIGludCBjb25zb2xlX3N0YW5kYXJkX2NvbG9yID0gQV9OT1JNQUw7CitzdGF0aWMgaW50IGNvbnNvbGVfbm9ybWFsX2NvbG9yID0gQV9OT1JNQUw7CitzdGF0aWMgaW50IGNvbnNvbGVfaGlnaGxpZ2h0X2NvbG9yID0gQV9SRVZFUlNFOworc3RhdGljIGNvbG9yX3N0YXRlIGNvbnNvbGVfY29sb3Jfc3RhdGUgPSBDT0xPUl9TVEFURV9TVEFOREFSRDsKKwordm9pZAorY29uc29sZV9zZXRjb2xvcnN0YXRlIChjb2xvcl9zdGF0ZSBzdGF0ZSkKK3sKKyAgc3dpdGNoIChzdGF0ZSkgeworICAgIGNhc2UgQ09MT1JfU1RBVEVfU1RBTkRBUkQ6CisgICAgICBjb25zb2xlX2N1cnJlbnRfY29sb3IgPSBjb25zb2xlX3N0YW5kYXJkX2NvbG9yOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDT0xPUl9TVEFURV9OT1JNQUw6CisgICAgICBjb25zb2xlX2N1cnJlbnRfY29sb3IgPSBjb25zb2xlX25vcm1hbF9jb2xvcjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ09MT1JfU1RBVEVfSElHSExJR0hUOgorICAgICAgY29uc29sZV9jdXJyZW50X2NvbG9yID0gY29uc29sZV9oaWdobGlnaHRfY29sb3I7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgY29uc29sZV9jdXJyZW50X2NvbG9yID0gY29uc29sZV9zdGFuZGFyZF9jb2xvcjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgY29uc29sZV9jb2xvcl9zdGF0ZSA9IHN0YXRlOworfQorCit2b2lkCitjb25zb2xlX3NldGNvbG9yIChpbnQgbm9ybWFsX2NvbG9yLCBpbnQgaGlnaGxpZ2h0X2NvbG9yKQoreworICBjb25zb2xlX25vcm1hbF9jb2xvciA9IG5vcm1hbF9jb2xvcjsKKyAgY29uc29sZV9oaWdobGlnaHRfY29sb3IgPSBoaWdobGlnaHRfY29sb3I7CisKKyAgY29uc29sZV9zZXRjb2xvcnN0YXRlIChjb25zb2xlX2NvbG9yX3N0YXRlKTsKK30KZGlmZiAtLWdpdCBhL3N0YWdlMi9kZWZzLmggYi9zdGFnZTIvZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZjI2ODMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFnZTIvZGVmcy5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qIAorICogTWFjaCBPcGVyYXRpbmcgU3lzdGVtCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsMTk5MCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgYm90aCB0aGUgY29weXJpZ2h0CisgKiBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhlCisgKiBzb2Z0d2FyZSwgZGVyaXZhdGl2ZSB3b3JrcyBvciBtb2RpZmllZCB2ZXJzaW9ucywgYW5kIGFueSBwb3J0aW9ucworICogdGhlcmVvZiwgYW5kIHRoYXQgYm90aCBub3RpY2VzIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uCisgKiAKKyAqIENBUk5FR0lFIE1FTExPTiBBTExPV1MgRlJFRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSBJTiBJVFMgIkFTIElTIgorICogQ09ORElUSU9OLiAgQ0FSTkVHSUUgTUVMTE9OIERJU0NMQUlNUyBBTlkgTElBQklMSVRZIE9GIEFOWSBLSU5EIEZPUgorICogQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuCisgKiAKKyAqIENhcm5lZ2llIE1lbGxvbiByZXF1ZXN0cyB1c2VycyBvZiB0aGlzIHNvZnR3YXJlIHRvIHJldHVybiB0bworICogCisgKiAgU29mdHdhcmUgRGlzdHJpYnV0aW9uIENvb3JkaW5hdG9yICBvciAgU29mdHdhcmUuRGlzdHJpYnV0aW9uQENTLkNNVS5FRFUKKyAqICBTY2hvb2wgb2YgQ29tcHV0ZXIgU2NpZW5jZQorICogIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CisgKiAgUGl0dHNidXJnaCBQQSAxNTIxMy0zODkwCisgKiAKKyAqIGFueSBpbXByb3ZlbWVudHMgb3IgZXh0ZW5zaW9ucyB0aGF0IHRoZXkgbWFrZSBhbmQgZ3JhbnQgQ2FybmVnaWUgTWVsbG9uCisgKiB0aGUgcmlnaHRzIHRvIHJlZGlzdHJpYnV0ZSB0aGVzZSBjaGFuZ2VzLgorICovCisvKgorICogQ29tbW9uIGRlZmluaXRpb25zIGZvciBCZXJrZWxleSBGYXN0IEZpbGUgU3lzdGVtLgorICovCisKKy8qCisgKiBDb21wYXRpYmlsaXR5IGRlZmluaXRpb25zIGZvciBkaXNrIElPLgorICovCisKKy8qCisgKiBEaXNrIGRldmljZXMgZG8gYWxsIElPIGluIDUxMi1ieXRlIGJsb2Nrcy4KKyAqLworI2RlZmluZQlERVZfQlNJWkUJNTEyCisKKy8qCisgKiBDb252ZXJzaW9uIGJldHdlZW4gYnl0ZXMgYW5kIGRpc2sgYmxvY2tzLgorICovCisjZGVmaW5lCWJ0b2RiKGJ5dGVfb2Zmc2V0KQkoKGJ5dGVfb2Zmc2V0KSA+PiA5KQorI2RlZmluZQlkYnRvYihibG9ja19udW1iZXIpCSgoYmxvY2tfbnVtYmVyKSA8PCA5KQorCisvKgorICogQ29tcGF0aWJpbGl0eSBkZWZpbml0aW9ucyBmb3Igb2xkIHR5cGUgbmFtZXMuCisgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVfY2hhcjsJLyogdW5zaWduZWQgY2hhciAqLwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1X3Nob3J0OwkvKiB1bnNpZ25lZCBzaG9ydCAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdV9pbnQ7CS8qIHVuc2lnbmVkIGludCAqLworCit0eXBlZGVmIHN0cnVjdCBfcXVhZF8KKyAgeworICAgIHVuc2lnbmVkIGludCB2YWxbMl07CS8qIDIgaW50IHZhbHVlcyBtYWtlLi4uICovCisgIH0KK3F1YWQ7CQkJCS8qIGFuIDgtYnl0ZSBpdGVtICovCisKK3R5cGVkZWYgdW5zaWduZWQgaW50IG1hY2hfdGltZV90OwkvKiBhbiB1bnNpZ25lZCBpbnQgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IG1hY2hfZGFkZHJfdDsJLyogYW4gdW5zaWduZWQgaW50ICovCit0eXBlZGVmIHVuc2lnbmVkIGludCBtYWNoX29mZl90OwkvKiBhbm90aGVyIHVuc2lnbmVkIGludCAqLworCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IG1hY2hfdWlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IG1hY2hfZ2lkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBtYWNoX2lub190OworCisjZGVmaW5lCU5CQlkJOAorCisvKgorICogVGhlIGZpbGUgc3lzdGVtIGlzIG1hZGUgb3V0IG9mIGJsb2NrcyBvZiBhdCBtb3N0IE1BWEJTSVpFIHVuaXRzLAorICogd2l0aCBzbWFsbGVyIHVuaXRzIChmcmFnbWVudHMpIG9ubHkgaW4gdGhlIGxhc3QgZGlyZWN0IGJsb2NrLgorICogTUFYQlNJWkUgcHJpbWFyaWx5IGRldGVybWluZXMgdGhlIHNpemUgb2YgYnVmZmVycyBpbiB0aGUgYnVmZmVyCisgKiBwb29sLiAgSXQgbWF5IGJlIG1hZGUgbGFyZ2VyIHdpdGhvdXQgYW55IGVmZmVjdCBvbiBleGlzdGluZworICogZmlsZSBzeXN0ZW1zOyBob3dldmVyLCBtYWtpbmcgaXQgc21hbGxlciBtYXkgbWFrZSBzb21lIGZpbGUKKyAqIHN5c3RlbXMgdW5tb3VudGFibGUuCisgKgorICogTm90ZSB0aGF0IHRoZSBkaXNrIGRldmljZXMgYXJlIGFzc3VtZWQgdG8gaGF2ZSBERVZfQlNJWkUgInNlY3RvcnMiCisgKiBhbmQgdGhhdCBmcmFnbWVudHMgbXVzdCBiZSBzb21lIG11bHRpcGxlIG9mIHRoaXMgc2l6ZS4KKyAqLworI2RlZmluZQlNQVhCU0laRQk4MTkyCisjZGVmaW5lCU1BWEZSQUcJCTgKKworLyoKKyAqIE1BWFBBVEhMRU4gZGVmaW5lcyB0aGUgbG9uZ2VzdCBwZXJtaXNzaWJsZSBwYXRoIGxlbmd0aAorICogYWZ0ZXIgZXhwYW5kaW5nIHN5bWJvbGljIGxpbmtzLgorICoKKyAqIE1BWFNZTUxJTktTIGRlZmluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN5bWJvbGljIGxpbmtzCisgKiB0aGF0IG1heSBiZSBleHBhbmRlZCBpbiBhIHBhdGggbmFtZS4gIEl0IHNob3VsZCBiZSBzZXQKKyAqIGhpZ2ggZW5vdWdoIHRvIGFsbG93IGFsbCBsZWdpdGltYXRlIHVzZXMsIGJ1dCBoYWx0IGluZmluaXRlCisgKiBsb29wcyByZWFzb25hYmx5IHF1aWNrbHkuCisgKi8KKworI2RlZmluZQlNQVhQQVRITEVOCTEwMjQKKyNkZWZpbmUJTUFYU1lNTElOS1MJOApkaWZmIC0tZ2l0IGEvc3RhZ2UyL2Rpci5oIGIvc3RhZ2UyL2Rpci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4N2JmNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFnZTIvZGlyLmgKQEAgLTAsMCArMSwxNDcgQEAKKworLyogCisgKiBNYWNoIE9wZXJhdGluZyBTeXN0ZW0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwxOTkwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCBib3RoIHRoZSBjb3B5cmlnaHQKKyAqIG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLCBkZXJpdmF0aXZlIHdvcmtzIG9yIG1vZGlmaWVkIHZlcnNpb25zLCBhbmQgYW55IHBvcnRpb25zCisgKiB0aGVyZW9mLCBhbmQgdGhhdCBib3RoIG5vdGljZXMgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4KKyAqIAorICogQ0FSTkVHSUUgTUVMTE9OIEFMTE9XUyBGUkVFIFVTRSBPRiBUSElTIFNPRlRXQVJFIElOIElUUyAiQVMgSVMiCisgKiBDT05ESVRJT04uICBDQVJORUdJRSBNRUxMT04gRElTQ0xBSU1TIEFOWSBMSUFCSUxJVFkgT0YgQU5ZIEtJTkQgRk9SCisgKiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqIAorICogQ2FybmVnaWUgTWVsbG9uIHJlcXVlc3RzIHVzZXJzIG9mIHRoaXMgc29mdHdhcmUgdG8gcmV0dXJuIHRvCisgKiAKKyAqICBTb2Z0d2FyZSBEaXN0cmlidXRpb24gQ29vcmRpbmF0b3IgIG9yICBTb2Z0d2FyZS5EaXN0cmlidXRpb25AQ1MuQ01VLkVEVQorICogIFNjaG9vbCBvZiBDb21wdXRlciBTY2llbmNlCisgKiAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKKyAqICBQaXR0c2J1cmdoIFBBIDE1MjEzLTM4OTAKKyAqIAorICogYW55IGltcHJvdmVtZW50cyBvciBleHRlbnNpb25zIHRoYXQgdGhleSBtYWtlIGFuZCBncmFudCBDYXJuZWdpZSBNZWxsb24KKyAqIHRoZSByaWdodHMgdG8gcmVkaXN0cmlidXRlIHRoZXNlIGNoYW5nZXMuCisgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5ODkgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcmUKKyAqIGR1cGxpY2F0ZWQgaW4gYWxsIHN1Y2ggZm9ybXMgYW5kIHRoYXQgYW55IGRvY3VtZW50YXRpb24sCisgKiBhZHZlcnRpc2luZyBtYXRlcmlhbHMsIGFuZCBvdGhlciBtYXRlcmlhbHMgcmVsYXRlZCB0byBzdWNoCisgKiBkaXN0cmlidXRpb24gYW5kIHVzZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkCisgKiBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleS4gIFRoZSBuYW1lIG9mIHRoZQorICogVW5pdmVyc2l0eSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqCUAoIylkaXIuaAk3LjYgKEJlcmtlbGV5KSA1LzkvODkKKyAqLworCisjaWZuZGVmIF9CT09UX1VGU19ESVJfSF8KKyNkZWZpbmUJX0JPT1RfVUZTX0RJUl9IXworCisvKgorICogQSBkaXJlY3RvcnkgY29uc2lzdHMgb2Ygc29tZSBudW1iZXIgb2YgYmxvY2tzIG9mIERJUkJMS1NJWgorICogYnl0ZXMsIHdoZXJlIERJUkJMS1NJWiBpcyBjaG9zZW4gc3VjaCB0aGF0IGl0IGNhbiBiZSB0cmFuc2ZlcnJlZAorICogdG8gZGlzayBpbiBhIHNpbmdsZSBhdG9taWMgb3BlcmF0aW9uIChlLmcuIDUxMiBieXRlcyBvbiBtb3N0IG1hY2hpbmVzKS4KKyAqCisgKiBFYWNoIERJUkJMS1NJWiBieXRlIGJsb2NrIGNvbnRhaW5zIHNvbWUgbnVtYmVyIG9mIGRpcmVjdG9yeSBlbnRyeQorICogc3RydWN0dXJlcywgd2hpY2ggYXJlIG9mIHZhcmlhYmxlIGxlbmd0aC4gIEVhY2ggZGlyZWN0b3J5IGVudHJ5IGhhcworICogYSBzdHJ1Y3QgZGlyZWN0IGF0IHRoZSBmcm9udCBvZiBpdCwgY29udGFpbmluZyBpdHMgaW5vZGUgbnVtYmVyLAorICogdGhlIGxlbmd0aCBvZiB0aGUgZW50cnksIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBuYW1lIGNvbnRhaW5lZCBpbgorICogdGhlIGVudHJ5LiAgVGhlc2UgYXJlIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIHBhZGRlZCB0byBhIDQgYnl0ZSBib3VuZGFyeQorICogd2l0aCBudWxsIGJ5dGVzLiAgQWxsIG5hbWVzIGFyZSBndWFyYW50ZWVkIG51bGwgdGVybWluYXRlZC4KKyAqIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIG5hbWUgaW4gYSBkaXJlY3RvcnkgaXMgTUFYTkFNTEVOLgorICoKKyAqIFRoZSBtYWNybyBESVJTSVooZHApIGdpdmVzIHRoZSBhbW91bnQgb2Ygc3BhY2UgcmVxdWlyZWQgdG8gcmVwcmVzZW50CisgKiBhIGRpcmVjdG9yeSBlbnRyeS4gIEZyZWUgc3BhY2UgaW4gYSBkaXJlY3RvcnkgaXMgcmVwcmVzZW50ZWQgYnkKKyAqIGVudHJpZXMgd2hpY2ggaGF2ZSBkcC0+ZF9yZWNsZW4gPiBESVJTSVooZHApLiAgQWxsIERJUkJMS1NJWiBieXRlcworICogaW4gYSBkaXJlY3RvcnkgYmxvY2sgYXJlIGNsYWltZWQgYnkgdGhlIGRpcmVjdG9yeSBlbnRyaWVzLiAgVGhpcworICogdXN1YWxseSByZXN1bHRzIGluIHRoZSBsYXN0IGVudHJ5IGluIGEgZGlyZWN0b3J5IGhhdmluZyBhIGxhcmdlCisgKiBkcC0+ZF9yZWNsZW4uICBXaGVuIGVudHJpZXMgYXJlIGRlbGV0ZWQgZnJvbSBhIGRpcmVjdG9yeSwgdGhlCisgKiBzcGFjZSBpcyByZXR1cm5lZCB0byB0aGUgcHJldmlvdXMgZW50cnkgaW4gdGhlIHNhbWUgZGlyZWN0b3J5CisgKiBibG9jayBieSBpbmNyZWFzaW5nIGl0cyBkcC0+ZF9yZWNsZW4uICBJZiB0aGUgZmlyc3QgZW50cnkgb2YKKyAqIGEgZGlyZWN0b3J5IGJsb2NrIGlzIGZyZWUsIHRoZW4gaXRzIGRwLT5kX2lubyBpcyBzZXQgdG8gMC4KKyAqIEVudHJpZXMgb3RoZXIgdGhhbiB0aGUgZmlyc3QgaW4gYSBkaXJlY3RvcnkgZG8gbm90IG5vcm1hbGx5IGhhdmUKKyAqIGRwLT5kX2lubyBzZXQgdG8gMC4KKyAqLworI2RlZmluZSBESVJCTEtTSVoJREVWX0JTSVpFCisjZGVmaW5lCU1BWE5BTUxFTgkyNTUKKworc3RydWN0IGRpcmVjdAorICB7CisgICAgdV9pbnQgZF9pbm87CQkvKiBpbm9kZSBudW1iZXIgb2YgZW50cnkgKi8KKyAgICB1X3Nob3J0IGRfcmVjbGVuOwkJLyogbGVuZ3RoIG9mIHRoaXMgcmVjb3JkICovCisgICAgdV9zaG9ydCBkX25hbWxlbjsJCS8qIGxlbmd0aCBvZiBzdHJpbmcgaW4gZF9uYW1lICovCisgICAgY2hhciBkX25hbWVbTUFYTkFNTEVOICsgMV07CS8qIG5hbWUgd2l0aCBsZW5ndGggPD0gTUFYTkFNTEVOICovCisgIH07CisKKy8qCisgKiBUaGUgRElSU0laIG1hY3JvIGdpdmVzIHRoZSBtaW5pbXVtIHJlY29yZCBsZW5ndGggd2hpY2ggd2lsbCBob2xkCisgKiB0aGUgZGlyZWN0b3J5IGVudHJ5LiAgVGhpcyByZXF1aXJlcyB0aGUgYW1vdW50IG9mIHNwYWNlIGluIHN0cnVjdCBkaXJlY3QKKyAqIHdpdGhvdXQgdGhlIGRfbmFtZSBmaWVsZCwgcGx1cyBlbm91Z2ggc3BhY2UgZm9yIHRoZSBuYW1lIHdpdGggYSB0ZXJtaW5hdGluZworICogbnVsbCBieXRlIChkcC0+ZF9uYW1sZW4rMSksIHJvdW5kZWQgdXAgdG8gYSA0IGJ5dGUgYm91bmRhcnkuCisgKi8KKyN1bmRlZiBESVJTSVoKKyNkZWZpbmUgRElSU0laKGRwKSBcCisgICAgKChzaXplb2YgKHN0cnVjdCBkaXJlY3QpIC0gKE1BWE5BTUxFTisxKSkgKyAoKChkcCktPmRfbmFtbGVuKzEgKyAzKSAmfiAzKSkKKworI2lmZGVmIEtFUk5FTAorLyoKKyAqIFRlbXBsYXRlIGZvciBtYW5pcHVsYXRpbmcgZGlyZWN0b3JpZXMuCisgKiBTaG91bGQgdXNlIHN0cnVjdCBkaXJlY3QncywgYnV0IHRoZSBuYW1lIGZpZWxkCisgKiBpcyBNQVhOQU1MRU4gLSAxLCBhbmQgdGhpcyBqdXN0IHdvbid0IGRvLgorICovCitzdHJ1Y3QgZGlydGVtcGxhdGUKKyAgeworICAgIHVfaW50IGRvdF9pbm87CisgICAgc2hvcnQgZG90X3JlY2xlbjsKKyAgICBzaG9ydCBkb3RfbmFtbGVuOworICAgIGNoYXIgZG90X25hbWVbNF07CQkvKiBtdXN0IGJlIG11bHRpcGxlIG9mIDQgKi8KKyAgICB1X2ludCBkb3Rkb3RfaW5vOworICAgIHNob3J0IGRvdGRvdF9yZWNsZW47CisgICAgc2hvcnQgZG90ZG90X25hbWxlbjsKKyAgICBjaGFyIGRvdGRvdF9uYW1lWzRdOwkvKiBkaXR0byAqLworICB9OworI2VuZGlmCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIHNob3VsZCBiZSBvYnRhaW5lZCBmcm9tIDxkaXJlbnQuaD4KKyAqIGFuZCBpcyBwcm92aWRlZCBzb2xlbHkgKGFuZCB0ZW1wb3JhcmlseSkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgKi8KKyNpZm5kZWYgS0VSTkVMCisjZGVmaW5lIGRfZmlsZW5vIGRfaW5vCQkvKiBjb21wYXRpYmlsaXR5IHdpdGggUE9TSVggKi8KKyNpZm5kZWYgREVWX0JTSVpFCisjZGVmaW5lCURFVl9CU0laRQk1MTIKKyNlbmRpZgorLyoKKyAqIERlZmluaXRpb25zIGZvciBsaWJyYXJ5IHJvdXRpbmVzIG9wZXJhdGluZyBvbiBkaXJlY3Rvcmllcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX2RpcmRlc2MKKyAgeworICAgIGludCBkZF9mZDsKKyAgICBpbnQgZGRfbG9jOworICAgIGludCBkZF9zaXplOworICAgIGNoYXIgZGRfYnVmW0RJUkJMS1NJWl07CisgIH0KK0RJUjsKKworI2RlZmluZSBkaXJmZChkaXJwKQkoKGRpcnApLT5kZF9mZCkKKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgMAorI2VuZGlmCitleHRlcm4gRElSICpvcGVuZGlyICgpOworZXh0ZXJuIHN0cnVjdCBkaXJlY3QgKnJlYWRkaXIgKCk7CitleHRlcm4gaW50IHRlbGxkaXIgKCk7CitleHRlcm4gdm9pZCBzZWVrZGlyICgpOworI2RlZmluZSByZXdpbmRkaXIoZGlycCkJc2Vla2RpcigoZGlycCksIChsb25nKTApCitleHRlcm4gdm9pZCBjbG9zZWRpciAoKTsKKyNlbmRpZiAvKiBub3QgS0VSTkVMICovCisjZW5kaWYgLyogX0JPT1RfVUZTX0RJUl9IXyAqLwpkaWZmIC0tZ2l0IGEvc3RhZ2UyL2Rpc2tfaW5vZGUuaCBiL3N0YWdlMi9kaXNrX2lub2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEwM2NiOAotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMi9kaXNrX2lub2RlLmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBNYWNoIE9wZXJhdGluZyBTeXN0ZW0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwxOTkwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IGJvdGggdGhlIGNvcHlyaWdodAorICogbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIG9mIHRoZQorICogc29mdHdhcmUsIGRlcml2YXRpdmUgd29ya3Mgb3IgbW9kaWZpZWQgdmVyc2lvbnMsIGFuZCBhbnkgcG9ydGlvbnMKKyAqIHRoZXJlb2YsIGFuZCB0aGF0IGJvdGggbm90aWNlcyBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLgorICoKKyAqIENBUk5FR0lFIE1FTExPTiBBTExPV1MgRlJFRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSBJTiBJVFMgIkFTIElTIgorICogQ09ORElUSU9OLiAgQ0FSTkVHSUUgTUVMTE9OIERJU0NMQUlNUyBBTlkgTElBQklMSVRZIE9GIEFOWSBLSU5EIEZPUgorICogQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICogQ2FybmVnaWUgTWVsbG9uIHJlcXVlc3RzIHVzZXJzIG9mIHRoaXMgc29mdHdhcmUgdG8gcmV0dXJuIHRvCisgKgorICogIFNvZnR3YXJlIERpc3RyaWJ1dGlvbiBDb29yZGluYXRvciAgb3IgIFNvZnR3YXJlLkRpc3RyaWJ1dGlvbkBDUy5DTVUuRURVCisgKiAgU2Nob29sIG9mIENvbXB1dGVyIFNjaWVuY2UKKyAqICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQorICogIFBpdHRzYnVyZ2ggUEEgMTUyMTMtMzg5MAorICoKKyAqIGFueSBpbXByb3ZlbWVudHMgb3IgZXh0ZW5zaW9ucyB0aGF0IHRoZXkgbWFrZSBhbmQgZ3JhbnQgQ2FybmVnaWUgTWVsbG9uCisgKiB0aGUgcmlnaHRzIHRvIHJlZGlzdHJpYnV0ZSB0aGVzZSBjaGFuZ2VzLgorICovCisvKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg5IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCisgKiBkdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAorICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAorICogZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAorICogYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkuICBUaGUgbmFtZSBvZiB0aGUKKyAqIFVuaXZlcnNpdHkgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKglAKCMpaW5vZGUuaAk3LjUgKEJlcmtlbGV5KSA3LzMvODkKKyAqLworCisjaWZuZGVmCV9CT09UX1VGU19ESVNLX0lOT0RFX0hfCisjZGVmaW5lCV9CT09UX1VGU19ESVNLX0lOT0RFX0hfCisKKy8qCisgKiBUaGUgSSBub2RlIGlzIHRoZSBmb2N1cyBvZiBhbGwgZmlsZSBhY3Rpdml0eSBpbiB0aGUgQlNEIEZhc3QgRmlsZSBTeXN0ZW0uCisgKiBUaGVyZSBpcyBhIHVuaXF1ZSBpbm9kZSBhbGxvY2F0ZWQgZm9yIGVhY2ggYWN0aXZlIGZpbGUsCisgKiBlYWNoIGN1cnJlbnQgZGlyZWN0b3J5LCBlYWNoIG1vdW50ZWQtb24gZmlsZSwgdGV4dCBmaWxlLCBhbmQgdGhlIHJvb3QuCisgKiBBbiBpbm9kZSBpcyAnbmFtZWQnIGJ5IGl0cyBkZXYvaW51bWJlciBwYWlyLiAoaWdldC9pZ2V0LmMpCisgKiBEYXRhIGluIGljb21tb24gaXMgcmVhZCBpbiBmcm9tIHBlcm1hbmVudCBpbm9kZSBvbiB2b2x1bWUuCisgKi8KKworI2RlZmluZQlGRlNfTkRBRERSCTEyCS8qIGRpcmVjdCBhZGRyZXNzZXMgaW4gaW5vZGUgKi8KKyNkZWZpbmUJRkZTX05JQUREUgkzCS8qIGluZGlyZWN0IGFkZHJlc3NlcyBpbiBpbm9kZSAqLworCisjZGVmaW5lCUZGU19NQVhfRkFTVExJTktfU0laRQkoKEZGU19OREFERFIgKyBGRlNfTklBRERSKSBcCisJCQkJICogc2l6ZW9mIChtYWNoX2RhZGRyX3QpKQorCitzdHJ1Y3QgaWNvbW1vbgorICB7CisgICAgdV9zaG9ydCBpY19tb2RlOwkJLyogIDA6IG1vZGUgYW5kIHR5cGUgb2YgZmlsZSAqLworICAgIHNob3J0IGljX25saW5rOwkJLyogIDI6IG51bWJlciBvZiBsaW5rcyB0byBmaWxlICovCisgICAgbWFjaF91aWRfdCBpY191aWQ7CQkvKiAgNDogb3duZXIncyB1c2VyIGlkICovCisgICAgbWFjaF9naWRfdCBpY19naWQ7CQkvKiAgNjogb3duZXIncyBncm91cCBpZCAqLworICAgIHF1YWQgaWNfc2l6ZTsJCS8qICA4OiBudW1iZXIgb2YgYnl0ZXMgaW4gZmlsZSAqLworICAgIG1hY2hfdGltZV90IGljX2F0aW1lOwkvKiAxNjogdGltZSBsYXN0IGFjY2Vzc2VkICovCisgICAgaW50IGljX2F0c3BhcmU7CisgICAgbWFjaF90aW1lX3QgaWNfbXRpbWU7CS8qIDI0OiB0aW1lIGxhc3QgbW9kaWZpZWQgKi8KKyAgICBpbnQgaWNfbXRzcGFyZTsKKyAgICBtYWNoX3RpbWVfdCBpY19jdGltZTsJLyogMzI6IGxhc3QgdGltZSBpbm9kZSBjaGFuZ2VkICovCisgICAgaW50IGljX2N0c3BhcmU7CisgICAgdW5pb24KKyAgICAgIHsKKwlzdHJ1Y3QKKwkgIHsKKwkgICAgbWFjaF9kYWRkcl90IE1iX2RiW0ZGU19OREFERFJdOwkvKiA0MDogZGlzayBibG9jayBhZGRyZXNzZXMgKi8KKwkgICAgbWFjaF9kYWRkcl90IE1iX2liW0ZGU19OSUFERFJdOwkvKiA4ODogaW5kaXJlY3QgYmxvY2tzICovCisJICB9CisJaWNfTWI7CisJY2hhciBpY19Nc3ltbGlua1tGRlNfTUFYX0ZBU1RMSU5LX1NJWkVdOworCS8qIDQwOiBzeW1ib2xpYyBsaW5rIG5hbWUgKi8KKyAgICAgIH0KKyAgICBpY19NdW47CisjZGVmaW5lCWljX2RiCQlpY19NdW4uaWNfTWIuTWJfZGIKKyNkZWZpbmUJaWNfaWIJCWljX011bi5pY19NYi5NYl9pYgorI2RlZmluZQlpY19zeW1saW5rCWljX011bi5pY19Nc3ltbGluaworICAgIGludCBpY19mbGFnczsJCS8qIDEwMDogc3RhdHVzLCBjdXJyZW50bHkgdW51c2VkICovCisgICAgaW50IGljX2Jsb2NrczsJCS8qIDEwNDogYmxvY2tzIGFjdHVhbGx5IGhlbGQgKi8KKyAgICBpbnQgaWNfZ2VuOwkJCS8qIDEwODogZ2VuZXJhdGlvbiBudW1iZXIgKi8KKyAgICBpbnQgaWNfc3BhcmVbNF07CQkvKiAxMTI6IHJlc2VydmVkLCBjdXJyZW50bHkgdW51c2VkICovCisgIH07CisKKy8qCisgKglTYW1lIHN0cnVjdHVyZSwgYnV0IG9uIGRpc2suCisgKi8KK3N0cnVjdCBkaW5vZGUKKyAgeworICAgIHVuaW9uCisgICAgICB7CisJc3RydWN0IGljb21tb24gZGlfY29tOworCWNoYXIgZGlfY2hhclsxMjhdOworICAgICAgfQorICAgIGRpX3VuOworICB9OworI2RlZmluZQlkaV9pYwlkaV91bi5kaV9jb20KKworI2VuZGlmIC8qIF9CT09UX1VGU19ESVNLX0lOT0RFX0hfICovCmRpZmYgLS1naXQgYS9zdGFnZTIvZGlza19pbm9kZV9mZnMuaCBiL3N0YWdlMi9kaXNrX2lub2RlX2Zmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOGNhYTEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFnZTIvZGlza19pbm9kZV9mZnMuaApAQCAtMCwwICsxLDEwMSBAQAorLyogCisgKiBNYWNoIE9wZXJhdGluZyBTeXN0ZW0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwxOTkwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCBib3RoIHRoZSBjb3B5cmlnaHQKKyAqIG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLCBkZXJpdmF0aXZlIHdvcmtzIG9yIG1vZGlmaWVkIHZlcnNpb25zLCBhbmQgYW55IHBvcnRpb25zCisgKiB0aGVyZW9mLCBhbmQgdGhhdCBib3RoIG5vdGljZXMgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4KKyAqIAorICogQ0FSTkVHSUUgTUVMTE9OIEFMTE9XUyBGUkVFIFVTRSBPRiBUSElTIFNPRlRXQVJFIElOIElUUyAiQVMgSVMiCisgKiBDT05ESVRJT04uICBDQVJORUdJRSBNRUxMT04gRElTQ0xBSU1TIEFOWSBMSUFCSUxJVFkgT0YgQU5ZIEtJTkQgRk9SCisgKiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqIAorICogQ2FybmVnaWUgTWVsbG9uIHJlcXVlc3RzIHVzZXJzIG9mIHRoaXMgc29mdHdhcmUgdG8gcmV0dXJuIHRvCisgKiAKKyAqICBTb2Z0d2FyZSBEaXN0cmlidXRpb24gQ29vcmRpbmF0b3IgIG9yICBTb2Z0d2FyZS5EaXN0cmlidXRpb25AQ1MuQ01VLkVEVQorICogIFNjaG9vbCBvZiBDb21wdXRlciBTY2llbmNlCisgKiAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKKyAqICBQaXR0c2J1cmdoIFBBIDE1MjEzLTM4OTAKKyAqIAorICogYW55IGltcHJvdmVtZW50cyBvciBleHRlbnNpb25zIHRoYXQgdGhleSBtYWtlIGFuZCBncmFudCBDYXJuZWdpZSBNZWxsb24KKyAqIHRoZSByaWdodHMgdG8gcmVkaXN0cmlidXRlIHRoZXNlIGNoYW5nZXMuCisgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODkgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcmUKKyAqIGR1cGxpY2F0ZWQgaW4gYWxsIHN1Y2ggZm9ybXMgYW5kIHRoYXQgYW55IGRvY3VtZW50YXRpb24sCisgKiBhZHZlcnRpc2luZyBtYXRlcmlhbHMsIGFuZCBvdGhlciBtYXRlcmlhbHMgcmVsYXRlZCB0byBzdWNoCisgKiBkaXN0cmlidXRpb24gYW5kIHVzZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkCisgKiBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleS4gIFRoZSBuYW1lIG9mIHRoZQorICogVW5pdmVyc2l0eSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqCUAoIylpbm9kZS5oCTcuNSAoQmVya2VsZXkpIDcvMy84OQorICovCisKKyNpZm5kZWYJX0JPT1RfVUZTX0RJU0tfSU5PREVfRkZTX0hfCisjZGVmaW5lCV9CT09UX1VGU19ESVNLX0lOT0RFX0ZGU19IXworCisjZGVmaW5lCU5EQUREUglGRlNfTkRBRERSCisjZGVmaW5lCU5JQUREUglGRlNfTklBRERSCisKKyNkZWZpbmUJTUFYX0ZBU1RMSU5LX1NJWkUJRkZTX01BWF9GQVNUTElOS19TSVpFCisKKyNkZWZpbmUJSUNfRkFTVExJTksJMHgwMDAxCS8qIFN5bWJvbGljIGxpbmsgaW4gaW5vZGUgKi8KKworI2RlZmluZQlpX21vZGUJCWljX21vZGUKKyNkZWZpbmUJaV9ubGluawkJaWNfbmxpbmsKKyNkZWZpbmUJaV91aWQJCWljX3VpZAorI2RlZmluZQlpX2dpZAkJaWNfZ2lkCisjaWYJZGVmaW5lZChCWVRFX01TRikgJiYgQllURV9NU0YKKyNkZWZpbmUJaV9zaXplCQlpY19zaXplLnZhbFsxXQorI2Vsc2UgLyogQllURV9MU0YgKi8KKyNkZWZpbmUJaV9zaXplCQlpY19zaXplLnZhbFswXQorI2VuZGlmCisjZGVmaW5lCWlfZGIJCWljX2RiCisjZGVmaW5lCWlfaWIJCWljX2liCisjZGVmaW5lCWlfYXRpbWUJCWljX2F0aW1lCisjZGVmaW5lCWlfbXRpbWUJCWljX210aW1lCisjZGVmaW5lCWlfY3RpbWUJCWljX2N0aW1lCisjZGVmaW5lIGlfYmxvY2tzCWljX2Jsb2NrcworI2RlZmluZQlpX3JkZXYJCWljX2RiWzBdCisjZGVmaW5lCWlfc3ltbGluawlpY19zeW1saW5rCisjZGVmaW5lIGlfZmxhZ3MJCWljX2ZsYWdzCisjZGVmaW5lIGlfZ2VuCQlpY19nZW4KKworLyogbW9kZXMgKi8KKyNkZWZpbmUJSUZNVAkweGYwMDAJCS8qIHR5cGUgb2YgZmlsZSAqLworI2RlZmluZQlJRkNIUgkweDIwMDAJCS8qIGNoYXJhY3RlciBzcGVjaWFsICovCisjZGVmaW5lCUlGRElSCTB4NDAwMAkJLyogZGlyZWN0b3J5ICovCisjZGVmaW5lCUlGQkxLCTB4NjAwMAkJLyogYmxvY2sgc3BlY2lhbCAqLworI2RlZmluZQlJRlJFRwkweDgwMDAJCS8qIHJlZ3VsYXIgKi8KKyNkZWZpbmUJSUZMTksJMHhhMDAwCQkvKiBzeW1ib2xpYyBsaW5rICovCisjZGVmaW5lCUlGU09DSwkweGMwMDAJCS8qIHNvY2tldCAqLworCisKKyNkZWZpbmUJSVNVSUQJCTB4MDgwMAkvKiBzZXQgdXNlciBpZCBvbiBleGVjdXRpb24gKi8KKyNkZWZpbmUJSVNHSUQJCTB4MDQwMAkvKiBzZXQgZ3JvdXAgaWQgb24gZXhlY3V0aW9uICovCisjZGVmaW5lCUlTVlRYCQkweDAyMDAJLyogc2F2ZSBzd2FwcGVkIHRleHQgZXZlbiBhZnRlciB1c2UgKi8KKyNkZWZpbmUJSVJFQUQJCTB4MDEwMAkvKiByZWFkLCB3cml0ZSwgZXhlY3V0ZSBwZXJtaXNzaW9ucyAqLworI2RlZmluZQlJV1JJVEUJCTB4MDA4MAorI2RlZmluZQlJRVhFQwkJMHgwMDQwCisKKyNpZmRlZiBFRUsKKyNkZWZpbmUgZl9mcwkJdS5mZnMuZmZzX2ZzCisjZGVmaW5lIGlfaWMJCXUuZmZzLmZmc19pYworI2RlZmluZSBmX25pbmRpcgl1LmZmcy5mZnNfbmluZGlyCisjZGVmaW5lIGZfYmxrCQl1LmZmcy5mZnNfYmxrCisjZGVmaW5lIGZfYmxrc2l6ZQl1LmZmcy5mZnNfYmxrc2l6ZQorI2RlZmluZSBmX2Jsa25vCQl1LmZmcy5mZnNfYmxrbm8KKyNlbmRpZiAvKiBFRUsgKi8KKworI2VuZGlmCS8qIF9CT09UX1VGU19ESVNLX0lOT0RFX0ZGU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3RhZ2UyL2Rpc2tfaW8uYyBiL3N0YWdlMi9kaXNrX2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjliYzUyNgotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMi9kaXNrX2lvLmMKQEAgLTAsMCArMSwxNzkwIEBACisvKiBkaXNrX2lvLmMgLSBpbXBsZW1lbnQgYWJzdHJhY3QgQklPUyBkaXNrIGlucHV0IGFuZCBvdXRwdXQgKi8KKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDAzLDIwMDQgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworCisjaW5jbHVkZSA8c2hhcmVkLmg+CisjaW5jbHVkZSA8ZmlsZXN5cy5oPgorCisjaWZkZWYgU1VQUE9SVF9ORVRCT09UCisjIGRlZmluZSBHUlVCCTEKKyMgaW5jbHVkZSA8ZXRoZXJib290Lmg+CisjZW5kaWYKKworI2lmZGVmIEdSVUJfVVRJTAorIyBpbmNsdWRlIDxkZXZpY2UuaD4KKyNlbmRpZgorCisvKiBpbnN0cnVtZW50YXRpb24gdmFyaWFibGVzICovCit2b2lkICgqZGlza19yZWFkX2hvb2spIChpbnQsIGludCwgaW50KSA9IE5VTEw7Cit2b2lkICgqZGlza19yZWFkX2Z1bmMpIChpbnQsIGludCwgaW50KSA9IE5VTEw7CisKKyNpZm5kZWYgU1RBR0UxXzUKK2ludCBwcmludF9wb3NzaWJpbGl0aWVzOworCitzdGF0aWMgaW50IGRvX2NvbXBsZXRpb247CitzdGF0aWMgaW50IHVuaXF1ZTsKK3N0YXRpYyBjaGFyICp1bmlxdWVfc3RyaW5nOworCisjZW5kaWYKKworaW50IGZzbWF4Oworc3RydWN0IGZzeXNfZW50cnkgZnN5c190YWJsZVtOVU1fRlNZUyArIDFdID0KK3sKKyAgLyogVEZUUCBzaG91bGQgY29tZSBmaXJzdCBiZWNhdXNlIG90aGVycyBkb24ndCBoYW5kbGUgbmV0IGRldmljZS4gICovCisjIGlmZGVmIEZTWVNfVEZUUAorICB7InRmdHAiLCB0ZnRwX21vdW50LCB0ZnRwX3JlYWQsIHRmdHBfZGlyLCB0ZnRwX2Nsb3NlLCAwfSwKKyMgZW5kaWYKKyMgaWZkZWYgRlNZU19GQVQKKyAgeyJmYXQiLCBmYXRfbW91bnQsIGZhdF9yZWFkLCBmYXRfZGlyLCAwLCAwfSwKKyMgZW5kaWYKKyMgaWZkZWYgRlNZU19FWFQyRlMKKyAgeyJleHQyZnMiLCBleHQyZnNfbW91bnQsIGV4dDJmc19yZWFkLCBleHQyZnNfZGlyLCAwLCAwfSwKKyMgZW5kaWYKKyMgaWZkZWYgRlNZU19NSU5JWAorICB7Im1pbml4IiwgbWluaXhfbW91bnQsIG1pbml4X3JlYWQsIG1pbml4X2RpciwgMCwgMH0sCisjIGVuZGlmCisjIGlmZGVmIEZTWVNfUkVJU0VSRlMKKyAgeyJyZWlzZXJmcyIsIHJlaXNlcmZzX21vdW50LCByZWlzZXJmc19yZWFkLCByZWlzZXJmc19kaXIsIDAsIHJlaXNlcmZzX2VtYmVkfSwKKyMgZW5kaWYKKyMgaWZkZWYgRlNZU19WU1RBRlMKKyAgeyJ2c3RhZnMiLCB2c3RhZnNfbW91bnQsIHZzdGFmc19yZWFkLCB2c3RhZnNfZGlyLCAwLCAwfSwKKyMgZW5kaWYKKyMgaWZkZWYgRlNZU19KRlMKKyAgeyJqZnMiLCBqZnNfbW91bnQsIGpmc19yZWFkLCBqZnNfZGlyLCAwLCBqZnNfZW1iZWR9LAorIyBlbmRpZgorIyBpZmRlZiBGU1lTX1hGUworICB7InhmcyIsIHhmc19tb3VudCwgeGZzX3JlYWQsIHhmc19kaXIsIDAsIDB9LAorIyBlbmRpZgorIyBpZmRlZiBGU1lTX1VGUzIKKyAgeyJ1ZnMyIiwgdWZzMl9tb3VudCwgdWZzMl9yZWFkLCB1ZnMyX2RpciwgMCwgdWZzMl9lbWJlZH0sCisjIGVuZGlmCisjIGlmZGVmIEZTWVNfSVNPOTY2MAorICB7Imlzbzk2NjAiLCBpc285NjYwX21vdW50LCBpc285NjYwX3JlYWQsIGlzbzk2NjBfZGlyLCAwLCAwfSwKKyMgZW5kaWYKKyAgLyogWFggRkZTIHNob3VsZCBjb21lIGxhc3QgYXMgaXQncyBzdXBlcmJsb2NrIGlzIGNvbW1vbmx5IGNyb3NzaW5nIHRyYWNrcworICAgICBvbiBmbG9wcGllcyBmcm9tIHRyYWNrIDEgdG8gMiwgd2hpbGUgb3RoZXJzIG9ubHkgdXNlIDEuICAqLworIyBpZmRlZiBGU1lTX0ZGUworICB7ImZmcyIsIGZmc19tb3VudCwgZmZzX3JlYWQsIGZmc19kaXIsIDAsIGZmc19lbWJlZH0sCisjIGVuZGlmCisgIHswLCAwLCAwLCAwLCAwLCAwfQorfTsKKworCisvKiBUaGVzZSBoYXZlIHRoZSBzYW1lIGZvcm1hdCBhcyAiYm9vdF9kcml2ZSIgYW5kICJpbnN0YWxsX3BhcnRpdGlvbiIsIGJ1dAorICAgYXJlIG1lYW50IHRvIGJlIHdvcmtpbmcgdmFsdWVzLiAqLwordW5zaWduZWQgbG9uZyBjdXJyZW50X2RyaXZlID0gR1JVQl9JTlZBTElEX0RSSVZFOwordW5zaWduZWQgbG9uZyBjdXJyZW50X3BhcnRpdGlvbjsKKworI2lmbmRlZiBTVEFHRTFfNQorLyogVGhlIHJlZ2lzdGVyIEVTSSBzaG91bGQgY29udGFpbiB0aGUgYWRkcmVzcyBvZiB0aGUgcGFydGl0aW9uIHRvIGJlCisgICB1c2VkIGZvciBsb2FkaW5nIGEgY2hhaW4tbG9hZGVyIHdoZW4gY2hhaW4tbG9hZGluZyB0aGUgbG9hZGVyLiAgKi8KK3Vuc2lnbmVkIGxvbmcgYm9vdF9wYXJ0X2FkZHIgPSAwOworI2VuZGlmCisKKy8qCisgKiAgR2xvYmFsIHZhcmlhYmxlcyBkZXNjcmliaW5nIGRldGFpbHMgb2YgdGhlIGZpbGVzeXN0ZW0KKyAqLworCisvKiBGSVhNRTogQlNEIGV2aWwgaGFjayAqLworI2luY2x1ZGUgImZyZWVic2QuaCIKK2ludCBic2RfZXZpbF9oYWNrOworCisvKiBmaWxlc3lzdGVtIHR5cGUgKi8KK2ludCBmc3lzX3R5cGUgPSBOVU1fRlNZUzsKKyNpZm5kZWYgTk9fQkxPQ0tfRklMRVMKK3N0YXRpYyBpbnQgYmxvY2tfZmlsZSA9IDA7CisjZW5kaWYgLyogTk9fQkxPQ0tfRklMRVMgKi8KKworLyogdGhlc2UgYXJlIHRoZSB0cmFuc2xhdGVkIG51bWJlcnMgZm9yIHRoZSBvcGVuIHBhcnRpdGlvbiAqLwordW5zaWduZWQgbG9uZyBwYXJ0X3N0YXJ0OwordW5zaWduZWQgbG9uZyBwYXJ0X2xlbmd0aDsKKworaW50IGN1cnJlbnRfc2xpY2U7CisKKy8qIGRpc2sgYnVmZmVyIHBhcmFtZXRlcnMgKi8KK2ludCBidWZfZHJpdmUgPSAtMTsKK2ludCBidWZfdHJhY2s7CitzdHJ1Y3QgZ2VvbWV0cnkgYnVmX2dlb207CisKKy8qIGZpbGVzeXN0ZW0gY29tbW9uIHZhcmlhYmxlcyAqLworaW50IGZpbGVwb3M7CitpbnQgZmlsZW1heDsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitsb2cyICh1bnNpZ25lZCBsb25nIHdvcmQpCit7CisgIGFzbSB2b2xhdGlsZSAoImJzZmwgJTEsJTAiCisJCTogIj1yIiAod29yZCkKKwkJOiAiciIgKHdvcmQpKTsKKyAgcmV0dXJuIHdvcmQ7Cit9CisKK2ludAorcmF3cmVhZCAoaW50IGRyaXZlLCBpbnQgc2VjdG9yLCBpbnQgYnl0ZV9vZmZzZXQsIGludCBieXRlX2xlbiwgY2hhciAqYnVmKQoreworICBpbnQgc2xlbiwgc2VjdG9yc19wZXJfdnRyYWNrOworICBpbnQgc2VjdG9yX3NpemVfYml0cyA9IGxvZzIgKGJ1Zl9nZW9tLnNlY3Rvcl9zaXplKTsKKworICBpZiAoYnl0ZV9sZW4gPD0gMCkKKyAgICByZXR1cm4gMTsKKworICB3aGlsZSAoYnl0ZV9sZW4gPiAwICYmICFlcnJudW0pCisgICAgeworICAgICAgaW50IHNvZmYsIG51bV9zZWN0LCB0cmFjaywgc2l6ZSA9IGJ5dGVfbGVuOworICAgICAgY2hhciAqYnVmYWRkcjsKKworICAgICAgLyoKKyAgICAgICAqICBDaGVjayB0cmFjayBidWZmZXIuICBJZiBpdCBpc24ndCB2YWxpZCBvciBpdCBpcyBmcm9tIHRoZQorICAgICAgICogIHdyb25nIGRpc2ssIHRoZW4gcmVzZXQgdGhlIGRpc2sgZ2VvbWV0cnkuCisgICAgICAgKi8KKyAgICAgIGlmIChidWZfZHJpdmUgIT0gZHJpdmUpCisJeworCSAgaWYgKGdldF9kaXNraW5mbyAoZHJpdmUsICZidWZfZ2VvbSkpCisJICAgIHsKKwkgICAgICBlcnJudW0gPSBFUlJfTk9fRElTSzsKKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCSAgYnVmX2RyaXZlID0gZHJpdmU7CisJICBidWZfdHJhY2sgPSAtMTsKKwkgIHNlY3Rvcl9zaXplX2JpdHMgPSBsb2cyIChidWZfZ2VvbS5zZWN0b3Jfc2l6ZSk7CisJfQorCisgICAgICAvKiBNYWtlIHN1cmUgdGhhdCBTRUNUT1IgaXMgdmFsaWQuICAqLworICAgICAgaWYgKHNlY3RvciA8IDAgfHwgc2VjdG9yID49IGJ1Zl9nZW9tLnRvdGFsX3NlY3RvcnMpCisJeworCSAgZXJybnVtID0gRVJSX0dFT007CisJICByZXR1cm4gMDsKKwl9CisgICAgICAKKyAgICAgIHNsZW4gPSAoKGJ5dGVfb2Zmc2V0ICsgYnl0ZV9sZW4gKyBidWZfZ2VvbS5zZWN0b3Jfc2l6ZSAtIDEpCisJICAgICAgPj4gc2VjdG9yX3NpemVfYml0cyk7CisgICAgICAKKyAgICAgIC8qIEVsaW1pbmF0ZSBhIGJ1ZmZlciBvdmVyZmxvdy4gICovCisgICAgICBpZiAoKGJ1Zl9nZW9tLnNlY3RvcnMgPDwgc2VjdG9yX3NpemVfYml0cykgPiBCVUZGRVJMRU4pCisJc2VjdG9yc19wZXJfdnRyYWNrID0gKEJVRkZFUkxFTiA+PiBzZWN0b3Jfc2l6ZV9iaXRzKTsKKyAgICAgIGVsc2UKKwlzZWN0b3JzX3Blcl92dHJhY2sgPSBidWZfZ2VvbS5zZWN0b3JzOworICAgICAgCisgICAgICAvKiBHZXQgdGhlIGZpcnN0IHNlY3RvciBvZiB0cmFjay4gICovCisgICAgICBzb2ZmID0gc2VjdG9yICUgc2VjdG9yc19wZXJfdnRyYWNrOworICAgICAgdHJhY2sgPSBzZWN0b3IgLSBzb2ZmOworICAgICAgbnVtX3NlY3QgPSBzZWN0b3JzX3Blcl92dHJhY2sgLSBzb2ZmOworICAgICAgYnVmYWRkciA9ICgoY2hhciAqKSBCVUZGRVJBRERSCisJCSArIChzb2ZmIDw8IHNlY3Rvcl9zaXplX2JpdHMpICsgYnl0ZV9vZmZzZXQpOworCisgICAgICBpZiAodHJhY2sgIT0gYnVmX3RyYWNrKQorCXsKKwkgIGludCBiaW9zX2VyciwgcmVhZF9zdGFydCA9IHRyYWNrLCByZWFkX2xlbiA9IHNlY3RvcnNfcGVyX3Z0cmFjazsKKworCSAgLyoKKwkgICAqICBJZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUgcmVhZCBpbiB0aGlzIGVudGlyZSBsb29wLCB0aGVuCisJICAgKiAgb25seSBtYWtlIHRoZSBlYXJsaWVyIHJlYWRzIGZvciB0aGUgcG9ydGlvbiBuZWVkZWQuICBUaGlzCisJICAgKiAgc2F2ZXMgZmlsbGluZyB0aGUgYnVmZmVyIHdpdGggZGF0YSB0aGF0IHdvbid0IGJlIHVzZWQhCisJICAgKi8KKwkgIGlmIChzbGVuID4gbnVtX3NlY3QpCisJICAgIHsKKwkgICAgICByZWFkX3N0YXJ0ID0gc2VjdG9yOworCSAgICAgIHJlYWRfbGVuID0gbnVtX3NlY3Q7CisJICAgICAgYnVmYWRkciA9IChjaGFyICopIEJVRkZFUkFERFIgKyBieXRlX29mZnNldDsKKwkgICAgfQorCisJICBiaW9zX2VyciA9IGJpb3NkaXNrIChCSU9TRElTS19SRUFELCBkcml2ZSwgJmJ1Zl9nZW9tLAorCQkJICAgICAgIHJlYWRfc3RhcnQsIHJlYWRfbGVuLCBCVUZGRVJTRUcpOworCSAgaWYgKGJpb3NfZXJyKQorCSAgICB7CisJICAgICAgYnVmX3RyYWNrID0gLTE7CisKKwkgICAgICBpZiAoYmlvc19lcnIgPT0gQklPU0RJU0tfRVJST1JfR0VPTUVUUlkpCisJCWVycm51bSA9IEVSUl9HRU9NOworCSAgICAgIGVsc2UKKwkJeworCQkgIC8qCisJCSAgICogIElmIHRoZXJlIHdhcyBhbiBlcnJvciwgdHJ5IHRvIGxvYWQgb25seSB0aGUKKwkJICAgKiAgcmVxdWlyZWQgc2VjdG9yKHMpIHJhdGhlciB0aGFuIGZhaWxpbmcgY29tcGxldGVseS4KKwkJICAgKi8KKwkJICBpZiAoc2xlbiA+IG51bV9zZWN0CisJCSAgICAgIHx8IGJpb3NkaXNrIChCSU9TRElTS19SRUFELCBkcml2ZSwgJmJ1Zl9nZW9tLAorCQkJCSAgIHNlY3Rvciwgc2xlbiwgQlVGRkVSU0VHKSkKKwkJICAgIGVycm51bSA9IEVSUl9SRUFEOworCisJCSAgYnVmYWRkciA9IChjaGFyICopIEJVRkZFUkFERFIgKyBieXRlX29mZnNldDsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIGJ1Zl90cmFjayA9IHRyYWNrOworCisJICBpZiAoKGJ1Zl90cmFjayA9PSAwIHx8IHNlY3RvciA9PSAwKQorCSAgICAgICYmIChQQ19TTElDRV9UWVBFIChCVUZGRVJBRERSLCAwKSA9PSBQQ19TTElDRV9UWVBFX0VaRAorCQkgIHx8IFBDX1NMSUNFX1RZUEUgKEJVRkZFUkFERFIsIDEpID09IFBDX1NMSUNFX1RZUEVfRVpECisJCSAgfHwgUENfU0xJQ0VfVFlQRSAoQlVGRkVSQUREUiwgMikgPT0gUENfU0xJQ0VfVFlQRV9FWkQKKwkJICB8fCBQQ19TTElDRV9UWVBFIChCVUZGRVJBRERSLCAzKSA9PSBQQ19TTElDRV9UWVBFX0VaRCkpCisJICAgIHsKKwkgICAgICAvKiBUaGlzIGlzIGEgRVpEIGRpc2sgbWFwIHNlY3RvciAwIHRvIHNlY3RvciAxICovCisJICAgICAgaWYgKGJ1Zl90cmFjayA9PSAwIHx8IHNsZW4gPj0gMikKKwkJeworCQkgIC8qIFdlIGFscmVhZHkgcmVhZCB0aGUgc2VjdG9yIDEsIGNvcHkgaXQgdG8gc2VjdG9yIDAgKi8KKwkJICBtZW1tb3ZlICgoY2hhciAqKSBCVUZGRVJBRERSLCAKKwkJCSAgIChjaGFyICopIEJVRkZFUkFERFIgKyBidWZfZ2VvbS5zZWN0b3Jfc2l6ZSwKKwkJCSAgIGJ1Zl9nZW9tLnNlY3Rvcl9zaXplKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGlmIChiaW9zZGlzayAoQklPU0RJU0tfUkVBRCwgZHJpdmUsICZidWZfZ2VvbSwKKwkJCQkxLCAxLCBCVUZGRVJTRUcpKQorCQkgICAgZXJybnVtID0gRVJSX1JFQUQ7CisJCX0KKwkgICAgfQorCX0KKwkgIAorICAgICAgaWYgKHNpemUgPiAoKG51bV9zZWN0IDw8IHNlY3Rvcl9zaXplX2JpdHMpIC0gYnl0ZV9vZmZzZXQpKQorCXNpemUgPSAobnVtX3NlY3QgPDwgc2VjdG9yX3NpemVfYml0cykgLSBieXRlX29mZnNldDsKKworICAgICAgLyoKKyAgICAgICAqICBJbnN0cnVtZW50YXRpb24gdG8gdGVsbCB3aGljaCBzZWN0b3JzIHdlcmUgcmVhZCBhbmQgdXNlZC4KKyAgICAgICAqLworICAgICAgaWYgKGRpc2tfcmVhZF9mdW5jKQorCXsKKwkgIGludCBzZWN0b3JfbnVtID0gc2VjdG9yOworCSAgaW50IGxlbmd0aCA9IGJ1Zl9nZW9tLnNlY3Rvcl9zaXplIC0gYnl0ZV9vZmZzZXQ7CisJICBpZiAobGVuZ3RoID4gc2l6ZSkKKwkgICAgbGVuZ3RoID0gc2l6ZTsKKwkgICgqZGlza19yZWFkX2Z1bmMpIChzZWN0b3JfbnVtKyssIGJ5dGVfb2Zmc2V0LCBsZW5ndGgpOworCSAgbGVuZ3RoID0gc2l6ZSAtIGxlbmd0aDsKKwkgIGlmIChsZW5ndGggPiAwKQorCSAgICB7CisJICAgICAgd2hpbGUgKGxlbmd0aCA+IGJ1Zl9nZW9tLnNlY3Rvcl9zaXplKQorCQl7CisJCSAgKCpkaXNrX3JlYWRfZnVuYykgKHNlY3Rvcl9udW0rKywgMCwgYnVmX2dlb20uc2VjdG9yX3NpemUpOworCQkgIGxlbmd0aCAtPSBidWZfZ2VvbS5zZWN0b3Jfc2l6ZTsKKwkJfQorCSAgICAgICgqZGlza19yZWFkX2Z1bmMpIChzZWN0b3JfbnVtLCAwLCBsZW5ndGgpOworCSAgICB9CisJfQorCisgICAgICBncnViX21lbW1vdmUgKGJ1ZiwgYnVmYWRkciwgc2l6ZSk7CisKKyAgICAgIGJ1ZiArPSBzaXplOworICAgICAgYnl0ZV9sZW4gLT0gc2l6ZTsKKyAgICAgIHNlY3RvciArPSBudW1fc2VjdDsKKyAgICAgIGJ5dGVfb2Zmc2V0ID0gMDsKKyAgICB9CisKKyAgcmV0dXJuICghZXJybnVtKTsKK30KKworCitpbnQKK2RldnJlYWQgKGludCBzZWN0b3IsIGludCBieXRlX29mZnNldCwgaW50IGJ5dGVfbGVuLCBjaGFyICpidWYpCit7CisgIC8qCisgICAqICBDaGVjayBwYXJ0aXRpb24gYm91bmRhcmllcworICAgKi8KKyAgaWYgKHNlY3RvciA8IDAKKyAgICAgIHx8ICgoc2VjdG9yICsgKChieXRlX29mZnNldCArIGJ5dGVfbGVuIC0gMSkgPj4gU0VDVE9SX0JJVFMpKQorCSAgPj0gcGFydF9sZW5ndGgpKQorICAgIHsKKyAgICAgIGVycm51bSA9IEVSUl9PVVRTSURFX1BBUlQ7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgLyoKKyAgICogIEdldCB0aGUgcmVhZCB0byB0aGUgYmVnaW5uaW5nIG9mIGEgcGFydGl0aW9uLgorICAgKi8KKyAgc2VjdG9yICs9IGJ5dGVfb2Zmc2V0ID4+IFNFQ1RPUl9CSVRTOworICBieXRlX29mZnNldCAmPSBTRUNUT1JfU0laRSAtIDE7CisKKyNpZiAhZGVmaW5lZChTVEFHRTFfNSkKKyAgaWYgKGRpc2tfcmVhZF9ob29rICYmIGRlYnVnKQorICAgIHByaW50ZiAoIjwlZCwgJWQsICVkPiIsIHNlY3RvciwgYnl0ZV9vZmZzZXQsIGJ5dGVfbGVuKTsKKyNlbmRpZiAvKiAhU1RBR0UxXzUgKi8KKworICAvKgorICAgKiAgQ2FsbCBSQVdSRUFELCB3aGljaCBpcyB2ZXJ5IHNpbWlsYXIsIGJ1dDoKKyAgICoKKyAgICogICAgLS0gIEl0IHRha2VzIGFuIGV4dHJhIHBhcmFtZXRlciwgdGhlIGRyaXZlIG51bWJlci4KKyAgICogICAgLS0gIEl0IHJlcXVpcmVzIHRoYXQgInNlY3RvciIgaXMgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgKiAgICAgICAgICAgIG9mIHRoZSBkaXNrLgorICAgKiAgICAtLSAgSXQgZG9lc24ndCBoYW5kbGUgb2Zmc2V0cyBvZiBtb3JlIHRoYW4gNTExIGJ5dGVzIGludG8gdGhlCisgICAqICAgICAgICAgICAgc2VjdG9yLgorICAgKi8KKyAgcmV0dXJuIHJhd3JlYWQgKGN1cnJlbnRfZHJpdmUsIHBhcnRfc3RhcnQgKyBzZWN0b3IsIGJ5dGVfb2Zmc2V0LAorCQkgIGJ5dGVfbGVuLCBidWYpOworfQorCisjaWZuZGVmIFNUQUdFMV81CitpbnQKK3Jhd3dyaXRlIChpbnQgZHJpdmUsIGludCBzZWN0b3IsIGNoYXIgKmJ1ZikKK3sKKyAgaWYgKHNlY3RvciA9PSAwKQorICAgIHsKKyAgICAgIGlmIChiaW9zZGlzayAoQklPU0RJU0tfUkVBRCwgZHJpdmUsICZidWZfZ2VvbSwgMCwgMSwgU0NSQVRDSFNFRykpCisJeworCSAgZXJybnVtID0gRVJSX1dSSVRFOworCSAgcmV0dXJuIDA7CisJfQorCisgICAgICBpZiAoUENfU0xJQ0VfVFlQRSAoU0NSQVRDSEFERFIsIDApID09IFBDX1NMSUNFX1RZUEVfRVpECisJICB8fCBQQ19TTElDRV9UWVBFIChTQ1JBVENIQUREUiwgMSkgPT0gUENfU0xJQ0VfVFlQRV9FWkQKKwkgIHx8IFBDX1NMSUNFX1RZUEUgKFNDUkFUQ0hBRERSLCAyKSA9PSBQQ19TTElDRV9UWVBFX0VaRAorCSAgfHwgUENfU0xJQ0VfVFlQRSAoU0NSQVRDSEFERFIsIDMpID09IFBDX1NMSUNFX1RZUEVfRVpEKQorCXNlY3RvciA9IDE7CisgICAgfQorICAKKyAgbWVtbW92ZSAoKGNoYXIgKikgU0NSQVRDSEFERFIsIGJ1ZiwgU0VDVE9SX1NJWkUpOworICBpZiAoYmlvc2Rpc2sgKEJJT1NESVNLX1dSSVRFLCBkcml2ZSwgJmJ1Zl9nZW9tLAorCQlzZWN0b3IsIDEsIFNDUkFUQ0hTRUcpKQorICAgIHsKKyAgICAgIGVycm51bSA9IEVSUl9XUklURTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAoc2VjdG9yIC0gc2VjdG9yICUgYnVmX2dlb20uc2VjdG9ycyA9PSBidWZfdHJhY2spCisgICAgLyogQ2xlYXIgdGhlIGNhY2hlLiAgKi8KKyAgICBidWZfdHJhY2sgPSAtMTsKKworICByZXR1cm4gMTsKK30KKworaW50CitkZXZ3cml0ZSAoaW50IHNlY3RvciwgaW50IHNlY3Rvcl9jb3VudCwgY2hhciAqYnVmKQoreworI2lmIGRlZmluZWQoR1JVQl9VVElMKSAmJiBkZWZpbmVkKF9fbGludXhfXykKKyAgaWYgKGN1cnJlbnRfcGFydGl0aW9uICE9IDB4RkZGRkZGCisgICAgICAmJiBpc19kaXNrX2RldmljZSAoZGV2aWNlX21hcCwgY3VycmVudF9kcml2ZSkpCisgICAgeworICAgICAgLyogSWYgdGhlIGdydWIgc2hlbGwgaXMgcnVubmluZyB1bmRlciBMaW51eCBhbmQgdGhlIHVzZXIgd2FudHMgdG8KKwkgZW1iZWQgYSBTdGFnZSAxLjUgaW50byBhIHBhcnRpdGlvbiBpbnN0ZWFkIG9mIGEgTUJSLCB1c2Ugc3lzdGVtCisJIGNhbGxzIGRpcmVjdGx5IGluc3RlYWQgb2YgYmlvc2Rpc2ssIGJlY2F1c2Ugb2YgdGhlIGJ1ZyBpbgorCSBMaW51eC4gKnNpZ2gqICAqLworICAgICAgcmV0dXJuIHdyaXRlX3RvX3BhcnRpdGlvbiAoZGV2aWNlX21hcCwgY3VycmVudF9kcml2ZSwgY3VycmVudF9wYXJ0aXRpb24sCisJCQkJIHNlY3Rvciwgc2VjdG9yX2NvdW50LCBidWYpOworICAgIH0KKyAgZWxzZQorI2VuZGlmIC8qIEdSVUJfVVRJTCAmJiBfX2xpbnV4X18gKi8KKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIAorICAgICAgZm9yIChpID0gMDsgaSA8IHNlY3Rvcl9jb3VudDsgaSsrKQorCXsKKwkgIGlmICghIHJhd3dyaXRlIChjdXJyZW50X2RyaXZlLCBwYXJ0X3N0YXJ0ICsgc2VjdG9yICsgaSwgCisJCQkgIGJ1ZiArIChpIDw8IFNFQ1RPUl9CSVRTKSkpCisJICAgICAgcmV0dXJuIDA7CisKKwl9CisgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK3NhbmVfcGFydGl0aW9uICh2b2lkKQoreworICAvKiBuZXR3b3JrIGRyaXZlICovCisgIGlmIChjdXJyZW50X2RyaXZlID09IE5FVFdPUktfRFJJVkUpCisgICAgcmV0dXJuIDE7CisgIAorICBpZiAoIShjdXJyZW50X3BhcnRpdGlvbiAmIDB4RkYwMDAwMDB1TCkKKyAgICAgICYmICgoY3VycmVudF9kcml2ZSAmIDB4RkZGRkZGN0YpIDwgOAorCSAgfHwgY3VycmVudF9kcml2ZSA9PSBjZHJvbV9kcml2ZSkKKyAgICAgICYmIChjdXJyZW50X3BhcnRpdGlvbiAmIDB4RkYpID09IDB4RkYKKyAgICAgICYmICgoY3VycmVudF9wYXJ0aXRpb24gJiAweEZGMDApID09IDB4RkYwMAorCSAgfHwgKGN1cnJlbnRfcGFydGl0aW9uICYgMHhGRjAwKSA8IDB4ODAwKQorICAgICAgJiYgKChjdXJyZW50X3BhcnRpdGlvbiA+PiAxNikgPT0gMHhGRgorCSAgfHwgKGN1cnJlbnRfZHJpdmUgJiAweDgwKSkpCisgICAgcmV0dXJuIDE7CisKKyAgZXJybnVtID0gRVJSX0RFVl9WQUxVRVM7CisgIHJldHVybiAwOworfQorI2VuZGlmIC8qICEgU1RBR0UxXzUgKi8KKworc3RhdGljIHZvaWQKK2F0dGVtcHRfbW91bnQgKHZvaWQpCit7CisjaWZuZGVmIFNUQUdFMV81CisgIGZvciAoZnN5c190eXBlID0gMDsgZnN5c190eXBlIDwgTlVNX0ZTWVM7IGZzeXNfdHlwZSsrKQorICAgIGlmICgoZnN5c190YWJsZVtmc3lzX3R5cGVdLm1vdW50X2Z1bmMpICgpKQorICAgICAgYnJlYWs7CisKKyAgaWYgKGZzeXNfdHlwZSA9PSBOVU1fRlNZUyAmJiBlcnJudW0gPT0gRVJSX05PTkUpCisgICAgZXJybnVtID0gRVJSX0ZTWVNfTU9VTlQ7CisjZWxzZQorICBmc3lzX3R5cGUgPSAwOworICBpZiAoKCooZnN5c190YWJsZVtmc3lzX3R5cGVdLm1vdW50X2Z1bmMpKSAoKSAhPSAxKQorICAgIHsKKyAgICAgIGZzeXNfdHlwZSA9IE5VTV9GU1lTOworICAgICAgZXJybnVtID0gRVJSX0ZTWVNfTU9VTlQ7CisgICAgfQorI2VuZGlmCit9CisKKworI2lmbmRlZiBTVEFHRTFfNQorLyogVHVybiBvbiB0aGUgYWN0aXZlIGZsYWcgZm9yIHRoZSBwYXJ0aXRpb24gU0FWRURfUEFSVElUSU9OIGluIHRoZQorICAgZHJpdmUgU0FWRURfRFJJVkUuIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJuIHplcm8sIG90aGVyd2lzZSByZXR1cm4KKyAgIG5vbi16ZXJvLiAgKi8KK2ludAorbWFrZV9zYXZlZF9hY3RpdmUgKHZvaWQpCit7CisgIGNoYXIgbWJyWzUxMl07CisKKyAgaWYgKHNhdmVkX2RyaXZlICYgMHg4MCkKKyAgICB7CisgICAgICAvKiBIYXJkIGRpc2sgKi8KKyAgICAgIGludCBwYXJ0ID0gc2F2ZWRfcGFydGl0aW9uID4+IDE2OworCisgICAgICAvKiBJZiB0aGUgcGFydGl0aW9uIGlzIG5vdCBhIHByaW1hcnkgcGFydGl0aW9uLCB0aGUgYWN0aXZlIGZsYWcgaXMKKwkgbWVhbmluZ2xlc3MuIChYWFg6IFJlYWxseT8pICAqLworICAgICAgaWYgKHBhcnQgPiAzKQorCXsKKwkgIGVycm51bSA9IEVSUl9ERVZfVkFMVUVTOworCSAgcmV0dXJuIDA7CisJfQorCisgICAgICAvKiBSZWFkIHRoZSBNQlIgaW4gdGhlIHNjcmF0Y2ggc3BhY2UuICAqLworICAgICAgaWYgKCEgcmF3cmVhZCAoc2F2ZWRfZHJpdmUsIDAsIDAsIFNFQ1RPUl9TSVpFLCBtYnIpKQorCXJldHVybiAwOworCisgICAgICAvKiBJZiB0aGUgcGFydGl0aW9uIGlzIGFuIGV4dGVuZGVkIHBhcnRpdGlvbiwgc2V0dGluZyB0aGUgYWN0aXZlCisJIGZsYWcgdmlvbGF0ZXMgdGhlIHNwZWNpZmljYXRpb24gYnkgSUJNLiAgKi8KKyAgICAgIGlmIChJU19QQ19TTElDRV9UWVBFX0VYVEVOREVEIChQQ19TTElDRV9UWVBFIChtYnIsIHBhcnQpKSkKKwl7CisJICBlcnJudW0gPSBFUlJfREVWX1ZBTFVFUzsKKwkgIHJldHVybiAwOworCX0KKworICAgICAgLyogQ2hlY2sgaWYgdGhlIGFjdGl2ZSBmbGFnIGlzIGRpc2FibGVkLiAgKi8KKyAgICAgIGlmIChQQ19TTElDRV9GTEFHIChtYnIsIHBhcnQpICE9IFBDX1NMSUNFX0ZMQUdfQk9PVEFCTEUpCisJeworCSAgaW50IGk7CisKKwkgIC8qIENsZWFyIGFsbCB0aGUgYWN0aXZlIGZsYWdzIGluIHRoaXMgdGFibGUuICAqLworCSAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkgICAgUENfU0xJQ0VfRkxBRyAobWJyLCBpKSA9IDA7CisKKwkgIC8qIFNldCB0aGUgZmxhZy4gICovCisJICBQQ19TTElDRV9GTEFHIChtYnIsIHBhcnQpID0gUENfU0xJQ0VfRkxBR19CT09UQUJMRTsKKworCSAgLyogV3JpdGUgYmFjayB0aGUgTUJSLiAgKi8KKwkgIGlmICghIHJhd3dyaXRlIChzYXZlZF9kcml2ZSwgMCwgbWJyKSkKKwkgICAgcmV0dXJuIDA7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBkcml2ZSBpcyBub3QgYSBoYXJkIGRpc2sgZHJpdmUsIHlvdSBzaG91bGRuJ3QgY2FsbCB0aGlzCisJIGZ1bmN0aW9uLiAoWFhYOiBTaG91bGQgSSBqdXN0IGlnbm9yZSB0aGlzIGVycm9yPykgICovCisgICAgICBlcnJudW0gPSBFUlJfREVWX1ZBTFVFUzsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICByZXR1cm4gMTsKK30KKworLyogSGlkZS9VbmhpZGUgQ1VSUkVOVF9QQVJUSVRJT04uICAqLworaW50CitzZXRfcGFydGl0aW9uX2hpZGRlbl9mbGFnIChpbnQgaGlkZGVuKQoreworICB1bnNpZ25lZCBsb25nIHBhcnQgPSAweEZGRkZGRjsKKyAgdW5zaWduZWQgbG9uZyBzdGFydCwgbGVuLCBvZmZzZXQsIGV4dF9vZmZzZXQ7CisgIGludCBlbnRyeSwgdHlwZTsKKyAgY2hhciBtYnJbNTEyXTsKKyAgCisgIC8qIFRoZSBkcml2ZSBtdXN0IGJlIGEgaGFyZCBkaXNrLiAgKi8KKyAgaWYgKCEgKGN1cnJlbnRfZHJpdmUgJiAweDgwKSkKKyAgICB7CisgICAgICBlcnJudW0gPSBFUlJfQkFEX0FSR1VNRU5UOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAKKyAgLyogVGhlIHBhcnRpdGlvbiBtdXN0IGJlIGEgUEMgc2xpY2UuICAqLworICBpZiAoKGN1cnJlbnRfcGFydGl0aW9uID4+IDE2KSA9PSAweEZGCisgICAgICB8fCAoY3VycmVudF9wYXJ0aXRpb24gJiAweEZGRkYpICE9IDB4RkZGRikKKyAgICB7CisgICAgICBlcnJudW0gPSBFUlJfQkFEX0FSR1VNRU5UOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAKKyAgLyogTG9vayBmb3IgdGhlIHBhcnRpdGlvbi4gICovCisgIHdoaWxlIChuZXh0X3BhcnRpdGlvbiAoY3VycmVudF9kcml2ZSwgMHhGRkZGRkYsICZwYXJ0LCAmdHlwZSwgICAgICAgICAgIAorCQkJICZzdGFydCwgJmxlbiwgJm9mZnNldCwgJmVudHJ5LAorCQkJICZleHRfb2Zmc2V0LCBtYnIpKQorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgaWYgKHBhcnQgPT0gY3VycmVudF9wYXJ0aXRpb24pCisJeworCSAgLyogRm91bmQuICAqLworCSAgaWYgKGhpZGRlbikKKwkgICAgUENfU0xJQ0VfVFlQRSAobWJyLCBlbnRyeSkgfD0gUENfU0xJQ0VfVFlQRV9ISURERU5fRkxBRzsKKwkgIGVsc2UKKwkgICAgUENfU0xJQ0VfVFlQRSAobWJyLCBlbnRyeSkgJj0gflBDX1NMSUNFX1RZUEVfSElEREVOX0ZMQUc7ICAgICAgIAorCSAgCisJICAvKiBXcml0ZSBiYWNrIHRoZSBNQlIgdG8gdGhlIGRpc2suICAqLworCSAgYnVmX3RyYWNrID0gLTE7CisJICBpZiAoISByYXd3cml0ZSAoY3VycmVudF9kcml2ZSwgb2Zmc2V0LCBtYnIpKQorCSAgICByZXR1cm4gMTsKKwkgIAorCSAgLyogU3VjY2VlZC4gICovCisJICByZXR1cm4gMDsKKwl9CisgICAgfQorICAKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIHZvaWQKK2NoZWNrX2FuZF9wcmludF9tb3VudCAodm9pZCkKK3sKKyAgYXR0ZW1wdF9tb3VudCAoKTsKKyAgaWYgKGVycm51bSA9PSBFUlJfRlNZU19NT1VOVCkKKyAgICBlcnJudW0gPSBFUlJfTk9ORTsKKyAgaWYgKCFlcnJudW0pCisgICAgcHJpbnRfZnN5c190eXBlICgpOworICBwcmludF9lcnJvciAoKTsKK30KKyNlbmRpZiAvKiBTVEFHRTFfNSAqLworCisKKy8qIEdldCB0aGUgaW5mb3JtYXRpb24gb24gbmV4dCBwYXJ0aXRpb24gb24gdGhlIGRyaXZlIERSSVZFLgorICAgVGhlIGNhbGxlciBtdXN0IG5vdCBtb2RpZnkgdGhlIGNvbnRlbnRzIG9mIHRoZSBhcmd1bWVudHMgd2hlbgorICAgaXRlcmF0aW5nIHRoaXMgZnVuY3Rpb24uIFRoZSBwYXJ0aXRpb24gcmVwcmVzZW50YXRpb24gaW4gR1JVQiB3aWxsCisgICBiZSBzdG9yZWQgaW4gKlBBUlRJVElPTi4gTGlrZXdpc2UsIHRoZSBwYXJ0aXRpb24gdHlwZSBpbiAqVFlQRSwgdGhlCisgICBzdGFydCBzZWN0b3IgaW4gKlNUQVJULCB0aGUgbGVuZ3RoIGluICpMRU4sIHRoZSBvZmZzZXQgb2YgdGhlCisgICBwYXJ0aXRpb24gdGFibGUgaW4gKk9GRlNFVCwgdGhlIGVudHJ5IG51bWJlciBpbiB0aGUgdGFibGUgaW4gKkVOVFJZLAorICAgdGhlIG9mZnNldCBvZiB0aGUgZXh0ZW5kZWQgcGFydGl0aW9uIGluICpFWFRfT0ZGU0VULgorICAgQlVGIGlzIHVzZWQgdG8gc3RvcmUgYSBNQlIsIHRoZSBib290IHNlY3RvciBvZiBhIHBhcnRpdGlvbiwgb3IKKyAgIGEgQlNEIGxhYmVsIHNlY3RvciwgYW5kIGl0IG11c3QgYmUgYXQgbGVhc3QgNTEyIGJ5dGVzIGxlbmd0aC4KKyAgIFdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGZpcnN0LCAqUEFSVElUSU9OIG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8KKyAgIDB4RkZGRkZGLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHplcm8gaWYgZmFpbHMsIG90aGVyd2lzZSBub24temVyby4gICovCitpbnQKK25leHRfcGFydGl0aW9uICh1bnNpZ25lZCBsb25nIGRyaXZlLCB1bnNpZ25lZCBsb25nIGRlc3QsCisJCXVuc2lnbmVkIGxvbmcgKnBhcnRpdGlvbiwgaW50ICp0eXBlLAorCQl1bnNpZ25lZCBsb25nICpzdGFydCwgdW5zaWduZWQgbG9uZyAqbGVuLAorCQl1bnNpZ25lZCBsb25nICpvZmZzZXQsIGludCAqZW50cnksCisJCXVuc2lnbmVkIGxvbmcgKmV4dF9vZmZzZXQsIGNoYXIgKmJ1ZikKK3sKKyAgLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMuICAqLworICBhdXRvIGludCBuZXh0X2JzZF9wYXJ0aXRpb24gKHZvaWQpOworICBhdXRvIGludCBuZXh0X3BjX3NsaWNlICh2b2lkKTsKKworICAvKiBHZXQgbmV4dCBCU0QgcGFydGl0aW9uIGluIGN1cnJlbnQgUEMgc2xpY2UuICAqLworICBpbnQgbmV4dF9ic2RfcGFydGl0aW9uICh2b2lkKQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgaW50IGJzZF9wYXJ0X25vID0gKCpwYXJ0aXRpb24gJiAweEZGMDApID4+IDg7CisKKyAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUuLi4gICovCisgICAgICBpZiAoYnNkX3BhcnRfbm8gPT0gMHhGRikKKwl7CisJICAvKiBDaGVjayBpZiB0aGUgQlNEIGxhYmVsIGlzIHdpdGhpbiBjdXJyZW50IFBDIHNsaWNlLiAgKi8KKwkgIGlmICgqbGVuIDwgQlNEX0xBQkVMX1NFQ1RPUiArIDEpCisJICAgIHsKKwkgICAgICBlcnJudW0gPSBFUlJfQkFEX1BBUlRfVEFCTEU7CisJICAgICAgcmV0dXJuIDA7CisJICAgIH0KKworCSAgLyogUmVhZCB0aGUgQlNEIGxhYmVsLiAgKi8KKwkgIGlmICghIHJhd3JlYWQgKGRyaXZlLCAqc3RhcnQgKyBCU0RfTEFCRUxfU0VDVE9SLAorCQkJIDAsIFNFQ1RPUl9TSVpFLCBidWYpKQorCSAgICByZXR1cm4gMDsKKworCSAgLyogQ2hlY2sgaWYgaXQgaXMgdmFsaWQuICAqLworCSAgaWYgKCEgQlNEX0xBQkVMX0NIRUNLX01BRyAoYnVmKSkKKwkgICAgeworCSAgICAgIGVycm51bSA9IEVSUl9CQURfUEFSVF9UQUJMRTsKKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCSAgCisJICBic2RfcGFydF9ubyA9IC0xOworCX0KKworICAgICAgLyogU2VhcmNoIG5leHQgdmFsaWQgQlNEIHBhcnRpdGlvbi4gICovCisgICAgICBmb3IgKGkgPSBic2RfcGFydF9ubyArIDE7IGkgPCBCU0RfTEFCRUxfTlBBUlRTIChidWYpOyBpKyspCisJeworCSAgaWYgKEJTRF9QQVJUX1RZUEUgKGJ1ZiwgaSkpCisJICAgIHsKKwkgICAgICAvKiBOb3RlIHRoYXQgKlRZUEUgYW5kICpQQVJUSVRJT04gd2VyZSBzZXQKKwkJIGZvciBjdXJyZW50IFBDIHNsaWNlLiAgKi8KKwkgICAgICAqdHlwZSA9IChCU0RfUEFSVF9UWVBFIChidWYsIGkpIDw8IDgpIHwgKCp0eXBlICYgMHhGRik7CisJICAgICAgKnN0YXJ0ID0gQlNEX1BBUlRfU1RBUlQgKGJ1ZiwgaSk7CisJICAgICAgKmxlbiA9IEJTRF9QQVJUX0xFTkdUSCAoYnVmLCBpKTsKKwkgICAgICAqcGFydGl0aW9uID0gKCpwYXJ0aXRpb24gJiAweEZGMDBGRikgfCAoaSA8PCA4KTsKKworI2lmbmRlZiBTVEFHRTFfNQorCSAgICAgIC8qIFhYWCAqLworCSAgICAgIGlmICgoZHJpdmUgJiAweDgwKSAmJiBCU0RfTEFCRUxfRFRZUEUgKGJ1ZikgPT0gRFRZUEVfU0NTSSkKKwkJYnNkX2V2aWxfaGFjayA9IDQ7CisjZW5kaWYgLyogISBTVEFHRTFfNSAqLworCSAgICAgIAorCSAgICAgIHJldHVybiAxOworCSAgICB9CisJfQorCisgICAgICBlcnJudW0gPSBFUlJfTk9fUEFSVDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBHZXQgbmV4dCBQQyBzbGljZS4gQmUgY2FyZWZ1bCBvZiB0aGF0IHRoaXMgZnVuY3Rpb24gbWF5IHJldHVybgorICAgICBhbiBlbXB0eSBQQyBzbGljZSAoaS5lLiBhIHBhcnRpdGlvbiB3aG9zZSB0eXBlIGlzIHplcm8pIGFzIHdlbGwuICAqLworICBpbnQgbmV4dF9wY19zbGljZSAodm9pZCkKKyAgICB7CisgICAgICBpbnQgcGNfc2xpY2Vfbm8gPSAoKnBhcnRpdGlvbiAmIDB4RkYwMDAwKSA+PiAxNjsKKworICAgICAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZS4uLiAgKi8KKyAgICAgIGlmIChwY19zbGljZV9ubyA9PSAweEZGKQorCXsKKwkgICpvZmZzZXQgPSAwOworCSAgKmV4dF9vZmZzZXQgPSAwOworCSAgKmVudHJ5ID0gLTE7CisJICBwY19zbGljZV9ubyA9IC0xOworCX0KKworICAgICAgLyogUmVhZCB0aGUgTUJSIG9yIHRoZSBib290IHNlY3RvciBvZiB0aGUgZXh0ZW5kZWQgcGFydGl0aW9uLiAgKi8KKyAgICAgIGlmICghIHJhd3JlYWQgKGRyaXZlLCAqb2Zmc2V0LCAwLCBTRUNUT1JfU0laRSwgYnVmKSkKKwlyZXR1cm4gMDsKKworICAgICAgLyogQ2hlY2sgaWYgaXQgaXMgdmFsaWQuICAqLworICAgICAgaWYgKCEgUENfTUJSX0NIRUNLX1NJRyAoYnVmKSkKKwl7CisJICBlcnJudW0gPSBFUlJfQkFEX1BBUlRfVEFCTEU7CisJICByZXR1cm4gMDsKKwl9CisKKyAgICAgIC8qIEluY3JlYXNlIHRoZSBlbnRyeSBudW1iZXIuICAqLworICAgICAgKCplbnRyeSkrKzsKKworICAgICAgLyogSWYgdGhpcyBpcyBvdXQgb2YgY3VycmVudCBwYXJ0aXRpb24gdGFibGUuLi4gICovCisgICAgICBpZiAoKmVudHJ5ID09IFBDX1NMSUNFX01BWCkKKwl7CisJICBpbnQgaTsKKworCSAgLyogU2VhcmNoIHRoZSBmaXJzdCBleHRlbmRlZCBwYXJ0aXRpb24gaW4gY3VycmVudCB0YWJsZS4gICovCisJICBmb3IgKGkgPSAwOyBpIDwgUENfU0xJQ0VfTUFYOyBpKyspCisJICAgIHsKKwkgICAgICBpZiAoSVNfUENfU0xJQ0VfVFlQRV9FWFRFTkRFRCAoUENfU0xJQ0VfVFlQRSAoYnVmLCBpKSkpCisJCXsKKwkJICAvKiBGb3VuZC4gU2V0IHRoZSBuZXcgb2Zmc2V0IGFuZCB0aGUgZW50cnkgbnVtYmVyLAorCQkgICAgIGFuZCByZXN0YXJ0IHRoaXMgZnVuY3Rpb24uICAqLworCQkgICpvZmZzZXQgPSAqZXh0X29mZnNldCArIFBDX1NMSUNFX1NUQVJUIChidWYsIGkpOworCQkgIGlmICghICpleHRfb2Zmc2V0KQorCQkgICAgKmV4dF9vZmZzZXQgPSAqb2Zmc2V0OworCQkgICplbnRyeSA9IC0xOworCQkgIHJldHVybiBuZXh0X3BjX3NsaWNlICgpOworCQl9CisJICAgIH0KKworCSAgZXJybnVtID0gRVJSX05PX1BBUlQ7CisJICByZXR1cm4gMDsKKwl9CisgICAgICAKKyAgICAgICp0eXBlID0gUENfU0xJQ0VfVFlQRSAoYnVmLCAqZW50cnkpOworICAgICAgKnN0YXJ0ID0gKm9mZnNldCArIFBDX1NMSUNFX1NUQVJUIChidWYsICplbnRyeSk7CisgICAgICAqbGVuID0gUENfU0xJQ0VfTEVOR1RIIChidWYsICplbnRyeSk7CisKKyAgICAgIC8qIFRoZSBjYWxjdWxhdGlvbiBvZiBhIFBDIHNsaWNlIG51bWJlciBpcyBjb21wbGljYXRlZCwgYmVjYXVzZSBvZgorCSB0aGUgcmF0aGVyIG9kZCBkZWZpbml0aW9uIG9mIGV4dGVuZGVkIHBhcnRpdGlvbnMuIEV2ZW4gd29yc2UsCisJIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoaXMgaXMgY29uc2lzdGVudCB3aXRoIGV2ZXJ5CisJIG9wZXJhdGluZyBzeXN0ZW1zLiBVZ2doLiAgKi8KKyAgICAgIGlmIChwY19zbGljZV9ubyA8IFBDX1NMSUNFX01BWAorCSAgfHwgKCEgSVNfUENfU0xJQ0VfVFlQRV9FWFRFTkRFRCAoKnR5cGUpCisJICAgICAgJiYgKnR5cGUgIT0gUENfU0xJQ0VfVFlQRV9OT05FKSkKKwlwY19zbGljZV9ubysrOworICAgICAgCisgICAgICAqcGFydGl0aW9uID0gKHBjX3NsaWNlX25vIDw8IDE2KSB8IDB4RkZGRjsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBTdGFydCB0aGUgYm9keSBvZiB0aGlzIGZ1bmN0aW9uLiAgKi8KKyAgCisjaWZuZGVmIFNUQUdFMV81CisgIGlmIChjdXJyZW50X2RyaXZlID09IE5FVFdPUktfRFJJVkUpCisgICAgcmV0dXJuIDA7CisjZW5kaWYKKworICAvKiBJZiBwcmV2aW91cyBwYXJ0aXRpb24gaXMgYSBCU0QgcGFydGl0aW9uIG9yIGEgUEMgc2xpY2Ugd2hpY2gKKyAgICAgY29udGFpbnMgQlNEIHBhcnRpdGlvbnMuLi4gICovCisgIGlmICgoKnBhcnRpdGlvbiAhPSAweEZGRkZGRiAmJiBJU19QQ19TTElDRV9UWVBFX0JTRCAoKnR5cGUgJiAweGZmKSkKKyAgICAgIHx8ICEgKGRyaXZlICYgMHg4MCkpCisgICAgeworICAgICAgaWYgKCp0eXBlID09IFBDX1NMSUNFX1RZUEVfTk9ORSkKKwkqdHlwZSA9IFBDX1NMSUNFX1RZUEVfRlJFRUJTRDsKKyAgICAgIAorICAgICAgLyogR2V0IG5leHQgQlNEIHBhcnRpdGlvbiwgaWYgYW55LiAgKi8KKyAgICAgIGlmIChuZXh0X2JzZF9wYXJ0aXRpb24gKCkpCisJcmV0dXJuIDE7CisKKyAgICAgIC8qIElmIHRoZSBkZXN0aW5hdGlvbiBwYXJ0aXRpb24gaXMgYSBCU0QgcGFydGl0aW9uIGFuZCBjdXJyZW50CisJIEJTRCBwYXJ0aXRpb24gaGFzIGFueSBlcnJvciwgYWJvcnQgdGhlIG9wZXJhdGlvbi4gICovCisgICAgICBpZiAoKGRlc3QgJiAweEZGMDApICE9IDB4RkYwMAorCSAgJiYgKChkZXN0ICYgMHhGRjAwMDApID09IDB4RkYwMDAwCisJICAgICAgfHwgKGRlc3QgJiAweEZGMDAwMCkgPT0gKCpwYXJ0aXRpb24gJiAweEZGMDAwMCkpKQorCXJldHVybiAwOworCisgICAgICAvKiBJZ25vcmUgdGhlIGVycm9yLiAgKi8KKyAgICAgIGVycm51bSA9IEVSUl9OT05FOworICAgIH0KKwkgIAorICByZXR1cm4gbmV4dF9wY19zbGljZSAoKTsKK30KKworI2lmbmRlZiBTVEFHRTFfNQorc3RhdGljIHVuc2lnbmVkIGxvbmcgY3VyX3BhcnRfb2Zmc2V0Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgY3VyX3BhcnRfYWRkcjsKKyNlbmRpZgorCisvKiBPcGVuIGEgcGFydGl0aW9uLiAgKi8KK2ludAorcmVhbF9vcGVuX3BhcnRpdGlvbiAoaW50IGZsYWdzKQoreworICB1bnNpZ25lZCBsb25nIGRlc3RfcGFydGl0aW9uID0gY3VycmVudF9wYXJ0aXRpb247CisgIHVuc2lnbmVkIGxvbmcgcGFydF9vZmZzZXQ7CisgIHVuc2lnbmVkIGxvbmcgZXh0X29mZnNldDsKKyAgaW50IGVudHJ5OworICBjaGFyIGJ1ZltTRUNUT1JfU0laRV07CisgIGludCBic2RfcGFydCwgcGNfc2xpY2U7CisKKyAgLyogRm9yIHNpbXBsaWNpdHkuICAqLworICBhdXRvIGludCBuZXh0ICh2b2lkKTsKKyAgaW50IG5leHQgKHZvaWQpCisgICAgeworICAgICAgaW50IHJldCA9IG5leHRfcGFydGl0aW9uIChjdXJyZW50X2RyaXZlLCBkZXN0X3BhcnRpdGlvbiwKKwkJCQkmY3VycmVudF9wYXJ0aXRpb24sICZjdXJyZW50X3NsaWNlLAorCQkJCSZwYXJ0X3N0YXJ0LCAmcGFydF9sZW5ndGgsCisJCQkJJnBhcnRfb2Zmc2V0LCAmZW50cnksICZleHRfb2Zmc2V0LCBidWYpOworICAgICAgYnNkX3BhcnQgPSAoY3VycmVudF9wYXJ0aXRpb24gPj4gOCkgJiAweEZGOworICAgICAgcGNfc2xpY2UgPSBjdXJyZW50X3BhcnRpdGlvbiA+PiAxNjsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAKKyNpZm5kZWYgU1RBR0UxXzUKKyAgLyogbmV0d29yayBkcml2ZSAqLworICBpZiAoY3VycmVudF9kcml2ZSA9PSBORVRXT1JLX0RSSVZFKQorICAgIHJldHVybiAxOworICAKKyAgaWYgKCEgc2FuZV9wYXJ0aXRpb24gKCkpCisgICAgcmV0dXJuIDA7CisjZW5kaWYKKworICBic2RfZXZpbF9oYWNrID0gMDsKKyAgY3VycmVudF9zbGljZSA9IDA7CisgIHBhcnRfc3RhcnQgPSAwOworCisgIC8qIE1ha2Ugc3VyZSB0aGF0IGJ1Zl9nZW9tIGlzIHZhbGlkLiAqLworICBpZiAoYnVmX2RyaXZlICE9IGN1cnJlbnRfZHJpdmUpCisgICAgeworICAgICAgaWYgKGdldF9kaXNraW5mbyAoY3VycmVudF9kcml2ZSwgJmJ1Zl9nZW9tKSkKKwl7CisJICBlcnJudW0gPSBFUlJfTk9fRElTSzsKKwkgIHJldHVybiAwOworCX0KKyAgICAgIGJ1Zl9kcml2ZSA9IGN1cnJlbnRfZHJpdmU7CisgICAgICBidWZfdHJhY2sgPSAtMTsKKyAgICB9CisgIHBhcnRfbGVuZ3RoID0gYnVmX2dlb20udG90YWxfc2VjdG9yczsKKworICAvKiBJZiB0aGlzIGlzIHRoZSB3aG9sZSBkaXNrLCByZXR1cm4gaGVyZS4gICovCisgIGlmICghIGZsYWdzICYmIGN1cnJlbnRfcGFydGl0aW9uID09IDB4RkZGRkZGKQorICAgIHJldHVybiAxOworCisgIGlmIChmbGFncykKKyAgICBkZXN0X3BhcnRpdGlvbiA9IDB4RkZGRkZGOworCisgIC8qIEluaXRpYWxpemUgQ1VSUkVOVF9QQVJUSVRJT04gZm9yIG5leHRfcGFydGl0aW9uLiAgKi8KKyAgY3VycmVudF9wYXJ0aXRpb24gPSAweEZGRkZGRjsKKyAgCisgIHdoaWxlIChuZXh0ICgpKQorICAgIHsKKyNpZm5kZWYgU1RBR0UxXzUKKyAgICBsb29wX3N0YXJ0OgorICAgICAgCisgICAgICBjdXJfcGFydF9vZmZzZXQgPSBwYXJ0X29mZnNldDsKKyAgICAgIGN1cl9wYXJ0X2FkZHIgPSBCT09UX1BBUlRfVEFCTEUgKyAoZW50cnkgPDwgNCk7CisjZW5kaWYgLyogISBTVEFHRTFfNSAqLworCisgICAgICAvKiBJZiB0aGlzIGlzIGEgdmFsaWQgcGFydGl0aW9uLi4uICAqLworICAgICAgaWYgKGN1cnJlbnRfc2xpY2UpCisJeworI2lmbmRlZiBTVEFHRTFfNQorCSAgLyogRGlzcGxheSBwYXJ0aXRpb24gaW5mb3JtYXRpb24uICAqLworCSAgaWYgKGZsYWdzICYmICEgSVNfUENfU0xJQ0VfVFlQRV9FWFRFTkRFRCAoY3VycmVudF9zbGljZSkpCisJICAgIHsKKwkgICAgICBpZiAoISBkb19jb21wbGV0aW9uKQorCQl7CisJCSAgaWYgKGN1cnJlbnRfZHJpdmUgJiAweDgwKQorCQkgICAgZ3J1Yl9wcmludGYgKCIgICBQYXJ0aXRpb24gbnVtOiAlZCwgIiwKKwkJCQkgY3VycmVudF9wYXJ0aXRpb24gPj4gMTYpOworCisJCSAgaWYgKCEgSVNfUENfU0xJQ0VfVFlQRV9CU0QgKGN1cnJlbnRfc2xpY2UpKQorCQkgICAgY2hlY2tfYW5kX3ByaW50X21vdW50ICgpOworCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgaW50IGdvdF9wYXJ0ID0gMDsKKwkJICAgICAgaW50IHNhdmVkX3NsaWNlID0gY3VycmVudF9zbGljZTsKKwkJICAgICAgCisJCSAgICAgIHdoaWxlIChuZXh0ICgpKQorCQkJeworCQkJICBpZiAoYnNkX3BhcnQgPT0gMHhGRikKKwkJCSAgICBicmVhazsKKwkJCSAgCisJCQkgIGlmICghIGdvdF9wYXJ0KQorCQkJICAgIHsKKwkJCSAgICAgIGdydWJfcHJpbnRmICgiW0JTRCBzdWItcGFydGl0aW9ucyBpbW1lZGlhdGVseSBmb2xsb3ddXG4iKTsKKwkJCSAgICAgIGdvdF9wYXJ0ID0gMTsKKwkJCSAgICB9CisJCQkgIAorCQkJICBncnViX3ByaW50ZiAoIiAgICAgQlNEIFBhcnRpdGlvbiBudW06IFwnJWNcJywgIiwKKwkJCQkgICAgICAgYnNkX3BhcnQgKyAnYScpOworCQkJICBjaGVja19hbmRfcHJpbnRfbW91bnQgKCk7CisJCQl9CisKKwkJICAgICAgaWYgKCEgZ290X3BhcnQpCisJCQlncnViX3ByaW50ZiAoIiBObyBCU0Qgc3ViLXBhcnRpdGlvbiBmb3VuZCwgcGFydGl0aW9uIHR5cGUgMHgleFxuIiwKKwkJCQkgICAgIHNhdmVkX3NsaWNlKTsKKwkJICAgICAgCisJCSAgICAgIGlmIChlcnJudW0pCisJCQl7CisJCQkgIGVycm51bSA9IEVSUl9OT05FOworCQkJICBicmVhazsKKwkJCX0KKwkJICAgICAgCisJCSAgICAgIGdvdG8gbG9vcF9zdGFydDsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGlmIChic2RfcGFydCAhPSAweEZGKQorCQkgICAgeworCQkgICAgICBjaGFyIHN0clsxNl07CisJCSAgICAgIAorCQkgICAgICBpZiAoISAoY3VycmVudF9kcml2ZSAmIDB4ODApCisJCQkgIHx8IChkZXN0X3BhcnRpdGlvbiA+PiAxNikgPT0gcGNfc2xpY2UpCisJCQlncnViX3NwcmludGYgKHN0ciwgIiVjKSIsIGJzZF9wYXJ0ICsgJ2EnKTsKKwkJICAgICAgZWxzZQorCQkJZ3J1Yl9zcHJpbnRmIChzdHIsICIlZCwlYykiLAorCQkJCSAgICAgIHBjX3NsaWNlLCBic2RfcGFydCArICdhJyk7CisJCSAgICAgIHByaW50X2FfY29tcGxldGlvbiAoc3RyKTsKKwkJICAgIH0KKwkJICBlbHNlIGlmICghIElTX1BDX1NMSUNFX1RZUEVfQlNEIChjdXJyZW50X3NsaWNlKSkKKwkJICAgIHsKKwkJICAgICAgY2hhciBzdHJbOF07CisJCSAgICAgIAorCQkgICAgICBncnViX3NwcmludGYgKHN0ciwgIiVkKSIsIHBjX3NsaWNlKTsKKwkJICAgICAgcHJpbnRfYV9jb21wbGV0aW9uIChzdHIpOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgIAorCSAgZXJybnVtID0gRVJSX05PTkU7CisjZW5kaWYgLyogISBTVEFHRTFfNSAqLworCSAgCisJICAvKiBDaGVjayBpZiB0aGlzIGlzIHRoZSBkZXN0aW5hdGlvbiBwYXJ0aXRpb24uICAqLworCSAgaWYgKCEgZmxhZ3MKKwkgICAgICAmJiAoZGVzdF9wYXJ0aXRpb24gPT0gY3VycmVudF9wYXJ0aXRpb24KKwkJICB8fCAoKGRlc3RfcGFydGl0aW9uID4+IDE2KSA9PSAweEZGCisJCSAgICAgICYmICgoZGVzdF9wYXJ0aXRpb24gPj4gOCkgJiAweEZGKSA9PSBic2RfcGFydCkpKQorCSAgICByZXR1cm4gMTsKKwl9CisgICAgfQorCisjaWZuZGVmIFNUQUdFMV81CisgIGlmIChmbGFncykKKyAgICB7CisgICAgICBpZiAoISAoY3VycmVudF9kcml2ZSAmIDB4ODApKQorCXsKKwkgIGN1cnJlbnRfcGFydGl0aW9uID0gMHhGRkZGRkY7CisJICBjaGVja19hbmRfcHJpbnRfbW91bnQgKCk7CisJfQorICAgICAgCisgICAgICBlcnJudW0gPSBFUlJfTk9ORTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyNlbmRpZiAvKiAhIFNUQUdFMV81ICovCisgIAorICByZXR1cm4gMDsKK30KKworCitpbnQKK29wZW5fcGFydGl0aW9uICh2b2lkKQoreworICByZXR1cm4gcmVhbF9vcGVuX3BhcnRpdGlvbiAoMCk7Cit9CisKKworI2lmbmRlZiBTVEFHRTFfNQorLyogWFggdXNlZCBmb3IgZGV2aWNlIGNvbXBsZXRpb24gaW4gJ3NldF9kZXZpY2UnIGFuZCAncHJpbnRfY29tcGxldGlvbnMnICovCitzdGF0aWMgaW50IGluY29tcGxldGUsIGRpc2tfY2hvaWNlOworc3RhdGljIGVudW0KK3sKKyAgUEFSVF9VTlNQRUNJRklFRCA9IDAsCisgIFBBUlRfRElTSywKKyAgUEFSVF9DSE9TRU4sCit9CitwYXJ0X2Nob2ljZTsKKyNlbmRpZiAvKiAhIFNUQUdFMV81ICovCisKK2NoYXIgKgorc2V0X2RldmljZSAoY2hhciAqZGV2aWNlKQoreworI2lmZGVmIFNUQUdFMV81CisgICAgLyogSW4gU3RhZ2UgMS41LCB0aGUgZmlyc3QgNCBieXRlcyBvZiBGSUxFTkFNRSBoYXMgYSBkZXZpY2UgbnVtYmVyLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBkZXYgPSAqKCh1bnNpZ25lZCBsb25nICopIGRldmljZSk7CisgIGludCBkcml2ZSA9IChkZXYgPj4gMjQpICYgMHhGRjsKKyAgaW50IHBhcnRpdGlvbiA9IGRldiAmIDB4RkZGRkZGOworCisgIC8qIElmIERSSVZFIGlzIGRpc2FibGVkLCB1c2UgU0FWRURfRFJJVkUgaW5zdGVhZC4gICovCisgIGlmIChkcml2ZSA9PSBHUlVCX0lOVkFMSURfRFJJVkUpCisgICAgY3VycmVudF9kcml2ZSA9IHNhdmVkX2RyaXZlOworICBlbHNlCisgICAgY3VycmVudF9kcml2ZSA9IGRyaXZlOworCisgIC8qIFRoZSBgcGFydGl0aW9uJyBwYXJ0IG11c3QgYWx3YXlzIGhhdmUgYSB2YWxpZCBudW1iZXIuICAqLworICBjdXJyZW50X3BhcnRpdGlvbiA9IHBhcnRpdGlvbjsKKyAgCisgIHJldHVybiBkZXZpY2UgKyBzaXplb2YgKHVuc2lnbmVkIGxvbmcpOworICAKKyNlbHNlIC8qICEgU1RBR0UxXzUgKi8KKyAgCisgIGludCByZXN1bHQgPSAwOworCisgIGluY29tcGxldGUgPSAwOworICBkaXNrX2Nob2ljZSA9IDE7CisgIHBhcnRfY2hvaWNlID0gUEFSVF9VTlNQRUNJRklFRDsKKyAgY3VycmVudF9kcml2ZSA9IHNhdmVkX2RyaXZlOworICBjdXJyZW50X3BhcnRpdGlvbiA9IDB4RkZGRkZGOworCisgIGlmICgqZGV2aWNlID09ICcoJyAmJiAhKihkZXZpY2UgKyAxKSkKKyAgICAvKiB1c2VyIGhhcyBnaXZlbiAnKCcgb25seSwgbGV0IGRpc2tfY2hvaWNlIGhhbmRsZSB3aGF0IGRpc2tzIHdlIGhhdmUgKi8KKyAgICByZXR1cm4gZGV2aWNlICsgMTsKKworICBpZiAoKmRldmljZSA9PSAnKCcgJiYgKigrK2RldmljZSkpCisgICAgeworICAgICAgaWYgKCpkZXZpY2UgIT0gJywnICYmICpkZXZpY2UgIT0gJyknKQorCXsKKwkgIGNoYXIgY2ggPSAqZGV2aWNlOworI2lmZGVmIFNVUFBPUlRfTkVUQk9PVAorCSAgaWYgKCpkZXZpY2UgPT0gJ2YnIHx8ICpkZXZpY2UgPT0gJ2gnCisJICAgICAgfHwgKCpkZXZpY2UgPT0gJ24nICYmIG5ldHdvcmtfcmVhZHkpCisJICAgICAgfHwgKCpkZXZpY2UgPT0gJ2MnICYmIGNkcm9tX2RyaXZlICE9IEdSVUJfSU5WQUxJRF9EUklWRSkpCisjZWxzZQorCSAgaWYgKCpkZXZpY2UgPT0gJ2YnIHx8ICpkZXZpY2UgPT0gJ2gnCisJICAgICAgfHwgKCpkZXZpY2UgPT0gJ2MnICYmIGNkcm9tX2RyaXZlICE9IEdSVUJfSU5WQUxJRF9EUklWRSkpCisjZW5kaWYgLyogU1VQUE9SVF9ORVRCT09UICovCisJICAgIHsKKwkgICAgICAvKiB1c2VyIGhhcyBnaXZlbiAnKFtmaG5dJywgY2hlY2sgZm9yIHJlc3AuIGFkZCAnZCcgYW5kCisJCSBsZXQgZGlza19jaG9pY2UgaGFuZGxlIHdoYXQgZGlza3Mgd2UgaGF2ZSAqLworCSAgICAgIGlmICghKihkZXZpY2UgKyAxKSkKKwkJeworCQkgIGRldmljZSsrOworCQkgICpkZXZpY2UrKyA9ICdkJzsKKwkJICAqZGV2aWNlID0gJ1wwJzsKKwkJICByZXR1cm4gZGV2aWNlOworCQl9CisJICAgICAgZWxzZSBpZiAoKihkZXZpY2UgKyAxKSA9PSAnZCcgJiYgISooZGV2aWNlICsgMikpCisJCXJldHVybiBkZXZpY2UgKyAyOworCSAgICB9CisKKwkgIGlmICgoKmRldmljZSA9PSAnZicKKwkgICAgICAgfHwgKmRldmljZSA9PSAnaCcKKyNpZmRlZiBTVVBQT1JUX05FVEJPT1QKKwkgICAgICAgfHwgKCpkZXZpY2UgPT0gJ24nICYmIG5ldHdvcmtfcmVhZHkpCisjZW5kaWYKKwkgICAgICAgfHwgKCpkZXZpY2UgPT0gJ2MnICYmIGNkcm9tX2RyaXZlICE9IEdSVUJfSU5WQUxJRF9EUklWRSkpCisJICAgICAgJiYgKGRldmljZSArPSAyLCAoKihkZXZpY2UgLSAxKSAhPSAnZCcpKSkKKwkgICAgZXJybnVtID0gRVJSX05VTUJFUl9QQVJTSU5HOworCSAgCisjaWZkZWYgU1VQUE9SVF9ORVRCT09UCisJICBpZiAoY2ggPT0gJ24nICYmIG5ldHdvcmtfcmVhZHkpCisJICAgIGN1cnJlbnRfZHJpdmUgPSBORVRXT1JLX0RSSVZFOworCSAgZWxzZQorI2VuZGlmIC8qIFNVUFBPUlRfTkVUQk9PVCAqLworCSAgICB7CisJICAgICAgaWYgKGNoID09ICdjJyAmJiBjZHJvbV9kcml2ZSAhPSBHUlVCX0lOVkFMSURfRFJJVkUpCisJCWN1cnJlbnRfZHJpdmUgPSBjZHJvbV9kcml2ZTsKKwkgICAgICBlbHNlCisJCXsKKwkJICBzYWZlX3BhcnNlX21heGludCAoJmRldmljZSwgKGludCAqKSAmY3VycmVudF9kcml2ZSk7CisJCSAgCisJCSAgZGlza19jaG9pY2UgPSAwOworCQkgIGlmIChjaCA9PSAnaCcpCisJCSAgICBjdXJyZW50X2RyaXZlICs9IDB4ODA7CisJCX0KKwkgICAgfQorCX0KKworICAgICAgaWYgKGVycm51bSkKKwlyZXR1cm4gMDsKKworICAgICAgaWYgKCpkZXZpY2UgPT0gJyknKQorCXsKKwkgIHBhcnRfY2hvaWNlID0gUEFSVF9DSE9TRU47CisJICByZXN1bHQgPSAxOworCX0KKyAgICAgIGVsc2UgaWYgKCpkZXZpY2UgPT0gJywnKQorCXsKKwkgIC8qIEVpdGhlciBhbiBhYnNvbHV0ZSBQQyBvciBCU0QgcGFydGl0aW9uLiAqLworCSAgZGlza19jaG9pY2UgPSAwOworCSAgcGFydF9jaG9pY2UgKys7CisJICBkZXZpY2UrKzsKKworCSAgaWYgKCpkZXZpY2UgPj0gJzAnICYmICpkZXZpY2UgPD0gJzknKQorCSAgICB7CisJICAgICAgcGFydF9jaG9pY2UgKys7CisJICAgICAgY3VycmVudF9wYXJ0aXRpb24gPSAwOworCisJICAgICAgaWYgKCEoY3VycmVudF9kcml2ZSAmIDB4ODApCisJCSAgfHwgIXNhZmVfcGFyc2VfbWF4aW50ICgmZGV2aWNlLCAoaW50ICopICZjdXJyZW50X3BhcnRpdGlvbikKKwkJICB8fCBjdXJyZW50X3BhcnRpdGlvbiA+IDI1NCkKKwkJeworCQkgIGVycm51bSA9IEVSUl9ERVZfRk9STUFUOworCQkgIHJldHVybiAwOworCQl9CisKKwkgICAgICBjdXJyZW50X3BhcnRpdGlvbiA9IChjdXJyZW50X3BhcnRpdGlvbiA8PCAxNikgKyAweEZGRkY7CisKKwkgICAgICBpZiAoKmRldmljZSA9PSAnLCcpCisJCWRldmljZSsrOworCSAgICAgIAorCSAgICAgIGlmICgqZGV2aWNlID49ICdhJyAmJiAqZGV2aWNlIDw9ICdoJykKKwkJeworCQkgIGN1cnJlbnRfcGFydGl0aW9uID0gKCgoKihkZXZpY2UrKykgLSAnYScpIDw8IDgpCisJCQkJICAgICAgIHwgKGN1cnJlbnRfcGFydGl0aW9uICYgMHhGRjAwRkYpKTsKKwkJfQorCSAgICB9CisJICBlbHNlIGlmICgqZGV2aWNlID49ICdhJyAmJiAqZGV2aWNlIDw9ICdoJykKKwkgICAgeworCSAgICAgIHBhcnRfY2hvaWNlICsrOworCSAgICAgIGN1cnJlbnRfcGFydGl0aW9uID0gKCgqKGRldmljZSsrKSAtICdhJykgPDwgOCkgfCAweEZGMDBGRjsKKwkgICAgfQorCisJICBpZiAoKmRldmljZSA9PSAnKScpCisJICAgIHsKKwkgICAgICBpZiAocGFydF9jaG9pY2UgPT0gUEFSVF9ESVNLKQorCQl7CisJCSAgY3VycmVudF9wYXJ0aXRpb24gPSBzYXZlZF9wYXJ0aXRpb247CisJCSAgcGFydF9jaG9pY2UgKys7CisJCX0KKworCSAgICAgIHJlc3VsdCA9IDE7CisJICAgIH0KKwl9CisgICAgfQorCisgIGlmICghIHNhbmVfcGFydGl0aW9uICgpKQorICAgIHJldHVybiAwOworICAKKyAgaWYgKHJlc3VsdCkKKyAgICByZXR1cm4gZGV2aWNlICsgMTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghKmRldmljZSkKKwlpbmNvbXBsZXRlID0gMTsKKyAgICAgIGVycm51bSA9IEVSUl9ERVZfRk9STUFUOworICAgIH0KKworICByZXR1cm4gMDsKKyAgCisjZW5kaWYgLyogISBTVEFHRTFfNSAqLworfQorCisvKgorICogIFRoaXMgcGVyZm9ybXMgYSAibW91bnQiIG9uIHRoZSBjdXJyZW50IGRldmljZSwgYm90aCBkcml2ZSBhbmQgcGFydGl0aW9uCisgKiAgbnVtYmVyLgorICovCisKK2ludAorb3Blbl9kZXZpY2UgKHZvaWQpCit7CisgIGlmIChvcGVuX3BhcnRpdGlvbiAoKSkKKyAgICBhdHRlbXB0X21vdW50ICgpOworCisgIGlmIChlcnJudW0gIT0gRVJSX05PTkUpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIDE7Cit9CisKKworI2lmbmRlZiBTVEFHRTFfNQoraW50CitzZXRfYm9vdGRldiAoaW50IGhkYmlhcykKK3sKKyAgaW50IGksIGo7CisKKyAgLyogQ29weSB0aGUgYm9vdCBwYXJ0aXRpb24gaW5mb3JtYXRpb24gdG8gMHg3YmUtMHg3ZmQgZm9yIGNoYWluLWxvYWRpbmcuICAqLworICBpZiAoKHNhdmVkX2RyaXZlICYgMHg4MCkgJiYgY3VyX3BhcnRfYWRkcikKKyAgICB7CisgICAgICBpZiAocmF3cmVhZCAoc2F2ZWRfZHJpdmUsIGN1cl9wYXJ0X29mZnNldCwKKwkJICAgMCwgU0VDVE9SX1NJWkUsIChjaGFyICopIFNDUkFUQ0hBRERSKSkKKwl7CisJICBjaGFyICpkc3QsICpzcmM7CisgICAgICAKKwkgIC8qIE5lZWQgb25seSB0aGUgcGFydGl0aW9uIHRhYmxlLgorCSAgICAgWFhYOiBXZSBjYW5ub3QgdXNlIGdydWJfbWVtbW92ZSBiZWNhdXNlIEJPT1RfUEFSVF9UQUJMRQorCSAgICAgKDB4MDdiZSkgaXMgbGVzcyB0aGFuIDB4MTAwMC4gICovCisJICBkc3QgPSAoY2hhciAqKSBCT09UX1BBUlRfVEFCTEU7CisJICBzcmMgPSAoY2hhciAqKSBTQ1JBVENIQUREUiArIEJPT1RTRUNfUEFSVF9PRkZTRVQ7CisJICB3aGlsZSAoZHN0IDwgKGNoYXIgKikgQk9PVF9QQVJUX1RBQkxFICsgQk9PVFNFQ19QQVJUX0xFTkdUSCkKKwkgICAgKmRzdCsrID0gKnNyYysrOworCSAgCisJICAvKiBTZXQgdGhlIGFjdGl2ZSBmbGFnIG9mIHRoZSBib290ZWQgcGFydGl0aW9uLiAgKi8KKwkgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJICAgIFBDX1NMSUNFX0ZMQUcgKEJPT1RfUEFSVF9UQUJMRSwgaSkgPSAwOworCSAgCisJICAqKCh1bnNpZ25lZCBjaGFyICopIGN1cl9wYXJ0X2FkZHIpID0gUENfU0xJQ0VfRkxBR19CT09UQUJMRTsKKwkgIGJvb3RfcGFydF9hZGRyID0gY3VyX3BhcnRfYWRkcjsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuIDA7CisgICAgfQorICAKKyAgLyoKKyAgICogIFNldCBCU0QgYm9vdCBkZXZpY2UuCisgICAqLworICBpID0gKHNhdmVkX3BhcnRpdGlvbiA+PiAxNikgKyAyOworICBpZiAoc2F2ZWRfcGFydGl0aW9uID09IDB4RkZGRkZGKQorICAgIGkgPSAxOworICBlbHNlIGlmICgoc2F2ZWRfcGFydGl0aW9uID4+IDE2KSA9PSAweEZGKQorICAgIGkgPSAwOworCisgIC8qIEZJWE1FOiBleHRyZW1lbHkgZXZpbCBoYWNrISEhICovCisgIGogPSAyOworICBpZiAoc2F2ZWRfZHJpdmUgJiAweDgwKQorICAgIGogPSBic2RfZXZpbF9oYWNrOworCisgIHJldHVybiBNQUtFQk9PVERFViAoaiwgKGkgPj4gNCksIChpICYgMHhGKSwKKwkJICAgICAgKChzYXZlZF9kcml2ZSAtIGhkYmlhcykgJiAweDdGKSwKKwkJICAgICAgKChzYXZlZF9wYXJ0aXRpb24gPj4gOCkgJiAweEZGKSk7Cit9CisjZW5kaWYgLyogU1RBR0UxXzUgKi8KKworCitzdGF0aWMgY2hhciAqCitzZXR1cF9wYXJ0IChjaGFyICpmaWxlbmFtZSkKK3sKKyNpZmRlZiBTVEFHRTFfNQorCisgIGlmICghIChmaWxlbmFtZSA9IHNldF9kZXZpY2UgKGZpbGVuYW1lKSkpCisgICAgeworICAgICAgY3VycmVudF9kcml2ZSA9IEdSVUJfSU5WQUxJRF9EUklWRTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgCisjIGlmbmRlZiBOT19CTE9DS19GSUxFUworICBpZiAoKmZpbGVuYW1lICE9ICcvJykKKyAgICBvcGVuX3BhcnRpdGlvbiAoKTsKKyAgZWxzZQorIyBlbmRpZiAvKiAhIE5PX0JMT0NLX0ZJTEVTICovCisgICAgb3Blbl9kZXZpY2UgKCk7CisgIAorI2Vsc2UgLyogISBTVEFHRTFfNSAqLworICAKKyAgaWYgKCpmaWxlbmFtZSA9PSAnKCcpCisgICAgeworICAgICAgaWYgKChmaWxlbmFtZSA9IHNldF9kZXZpY2UgKGZpbGVuYW1lKSkgPT0gMCkKKwl7CisJICBjdXJyZW50X2RyaXZlID0gR1JVQl9JTlZBTElEX0RSSVZFOworCSAgcmV0dXJuIDA7CisJfQorIyBpZm5kZWYgTk9fQkxPQ0tfRklMRVMKKyAgICAgIGlmICgqZmlsZW5hbWUgIT0gJy8nKQorCW9wZW5fcGFydGl0aW9uICgpOworICAgICAgZWxzZQorIyBlbmRpZiAvKiAhIE5PX0JMT0NLX0ZJTEVTICovCisJb3Blbl9kZXZpY2UgKCk7CisgICAgfQorICBlbHNlIGlmIChzYXZlZF9kcml2ZSAhPSBjdXJyZW50X2RyaXZlCisJICAgfHwgc2F2ZWRfcGFydGl0aW9uICE9IGN1cnJlbnRfcGFydGl0aW9uCisJICAgfHwgKCpmaWxlbmFtZSA9PSAnLycgJiYgZnN5c190eXBlID09IE5VTV9GU1lTKQorCSAgIHx8IGJ1Zl9kcml2ZSA9PSAtMSkKKyAgICB7CisgICAgICBjdXJyZW50X2RyaXZlID0gc2F2ZWRfZHJpdmU7CisgICAgICBjdXJyZW50X3BhcnRpdGlvbiA9IHNhdmVkX3BhcnRpdGlvbjsKKyAgICAgIC8qIGFsbG93IGZvciB0aGUgZXJyb3IgY2FzZSBvZiAibm8gZmlsZXN5c3RlbSIgYWZ0ZXIgdGhlIHBhcnRpdGlvbgorICAgICAgICAgaXMgZm91bmQuICBUaGlzIG1ha2VzIGJsb2NrIGZpbGVzIHdvcmsgZmluZSBvbiBubyBmaWxlc3lzdGVtICovCisjIGlmbmRlZiBOT19CTE9DS19GSUxFUworICAgICAgaWYgKCpmaWxlbmFtZSAhPSAnLycpCisJb3Blbl9wYXJ0aXRpb24gKCk7CisgICAgICBlbHNlCisjIGVuZGlmIC8qICEgTk9fQkxPQ0tfRklMRVMgKi8KKwlvcGVuX2RldmljZSAoKTsKKyAgICB9CisgIAorI2VuZGlmIC8qICEgU1RBR0UxXzUgKi8KKyAgCisgIGlmIChlcnJudW0gJiYgKCpmaWxlbmFtZSA9PSAnLycgfHwgZXJybnVtICE9IEVSUl9GU1lTX01PVU5UKSkKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICAgIGVycm51bSA9IDA7CisKKyNpZm5kZWYgU1RBR0UxXzUKKyAgaWYgKCFzYW5lX3BhcnRpdGlvbiAoKSkKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorCisgIHJldHVybiBmaWxlbmFtZTsKK30KKworCisjaWZuZGVmIFNUQUdFMV81CisvKgorICogIFRoaXMgcHJpbnRzIHRoZSBmaWxlc3lzdGVtIHR5cGUgb3IgZ2l2ZXMgcmVsZXZhbnQgaW5mb3JtYXRpb24uCisgKi8KKwordm9pZAorcHJpbnRfZnN5c190eXBlICh2b2lkKQoreworICBpZiAoISBkb19jb21wbGV0aW9uKQorICAgIHsKKyAgICAgIHByaW50ZiAoIiBGaWxlc3lzdGVtIHR5cGUgIik7CisgICAgICAKKyAgICAgIGlmIChmc3lzX3R5cGUgIT0gTlVNX0ZTWVMpCisJcHJpbnRmICgiaXMgJXMsICIsIGZzeXNfdGFibGVbZnN5c190eXBlXS5uYW1lKTsKKyAgICAgIGVsc2UKKwlwcmludGYgKCJ1bmtub3duLCAiKTsKKyAgICAgIAorICAgICAgaWYgKGN1cnJlbnRfcGFydGl0aW9uID09IDB4RkZGRkZGKQorCXByaW50ZiAoInVzaW5nIHdob2xlIGRpc2tcbiIpOworICAgICAgZWxzZQorCXByaW50ZiAoInBhcnRpdGlvbiB0eXBlIDB4JXhcbiIsIGN1cnJlbnRfc2xpY2UgJiAweEZGKTsKKyAgICB9Cit9CisjZW5kaWYgLyogU1RBR0UxXzUgKi8KKworI2lmbmRlZiBTVEFHRTFfNQorLyogSWYgRE9fQ09NUExFVElPTiBpcyB0cnVlLCBqdXN0IHByaW50IE5BTUUuIE90aGVyd2lzZSBzYXZlIHRoZSB1bmlxdWUKKyAgIHBhcnQgaW50byBVTklRVUVfU1RSSU5HLiAgKi8KK3ZvaWQKK3ByaW50X2FfY29tcGxldGlvbiAoY2hhciAqbmFtZSkKK3sKKyAgLyogSWYgTkFNRSBpcyAiLiIgb3IgIi4uIiwgZG8gbm90IGNvdW50IGl0LiAgKi8KKyAgaWYgKGdydWJfc3RyY21wIChuYW1lLCAiLiIpID09IDAgfHwgZ3J1Yl9zdHJjbXAgKG5hbWUsICIuLiIpID09IDApCisgICAgcmV0dXJuOworICAKKyAgaWYgKGRvX2NvbXBsZXRpb24pCisgICAgeworICAgICAgY2hhciAqYnVmID0gdW5pcXVlX3N0cmluZzsKKyAgICAgIAorICAgICAgaWYgKCEgdW5pcXVlKQorCXdoaWxlICgoKmJ1ZisrID0gKm5hbWUrKykpCisJICA7CisgICAgICBlbHNlCisJeworCSAgd2hpbGUgKCpidWYgJiYgKCpidWYgPT0gKm5hbWUpKQorCSAgICB7CisJICAgICAgYnVmKys7CisJICAgICAgbmFtZSsrOworCSAgICB9CisJICAvKiBtaXNtYXRjaCwgc3RyaXAgaXQuICAqLworCSAgKmJ1ZiA9ICdcMCc7CisJfQorICAgIH0KKyAgZWxzZQorICAgIGdydWJfcHJpbnRmICgiICVzIiwgbmFtZSk7CisgIAorICB1bmlxdWUrKzsKK30KKworLyoKKyAqICBUaGlzIGxpc3RzIHRoZSBwb3NzaWJsZSBjb21wbGV0aW9ucyBvZiBhIGRldmljZSBzdHJpbmcsIGZpbGVuYW1lLCBvcgorICogIGFueSBzYW5lIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28uCisgKi8KKworaW50CitwcmludF9jb21wbGV0aW9ucyAoaW50IGlzX2ZpbGVuYW1lLCBpbnQgaXNfY29tcGxldGlvbikKK3sKKyAgY2hhciAqYnVmID0gKGNoYXIgKikgQ09NUExFVElPTl9CVUY7CisgIGNoYXIgKnB0ciA9IGJ1ZjsKKworICB1bmlxdWVfc3RyaW5nID0gKGNoYXIgKikgVU5JUVVFX0JVRjsKKyAgKnVuaXF1ZV9zdHJpbmcgPSAwOworICB1bmlxdWUgPSAwOworICBkb19jb21wbGV0aW9uID0gaXNfY29tcGxldGlvbjsKKworICBpZiAoISBpc19maWxlbmFtZSkKKyAgICB7CisgICAgICAvKiBQcmludCB0aGUgY29tcGxldGlvbnMgb2YgYnVpbHRpbiBjb21tYW5kcy4gICovCisgICAgICBzdHJ1Y3QgYnVpbHRpbiAqKmJ1aWx0aW47CisKKyAgICAgIGlmICghIGlzX2NvbXBsZXRpb24pCisJZ3J1Yl9wcmludGYgKCIgUG9zc2libGUgY29tbWFuZHMgYXJlOiIpOworICAgICAgCisgICAgICBmb3IgKGJ1aWx0aW4gPSBidWlsdGluX3RhYmxlOyAoKmJ1aWx0aW4pOyBidWlsdGluKyspCisJeworCSAgLyogSWYgKkJVSUxUSU4gY2Fubm90IGJlIHJ1biBpbiB0aGUgY29tbWFuZC1saW5lLCBza2lwIGl0LiAgKi8KKwkgIGlmICghICgoKmJ1aWx0aW4pLT5mbGFncyAmIEJVSUxUSU5fQ01ETElORSkpCisJICAgIGNvbnRpbnVlOworCisJICBpZiAoc3Vic3RyaW5nIChidWYsICgqYnVpbHRpbiktPm5hbWUpIDw9IDApCisJICAgIHByaW50X2FfY29tcGxldGlvbiAoKCpidWlsdGluKS0+bmFtZSk7CisJfQorCisgICAgICBpZiAoaXNfY29tcGxldGlvbiAmJiAqdW5pcXVlX3N0cmluZykKKwl7CisJICBpZiAodW5pcXVlID09IDEpCisJICAgIHsKKwkgICAgICBjaGFyICp1ID0gdW5pcXVlX3N0cmluZyArIGdydWJfc3RybGVuICh1bmlxdWVfc3RyaW5nKTsKKworCSAgICAgICp1KysgPSAnICc7CisJICAgICAgKnUgPSAwOworCSAgICB9CisJICAKKwkgIGdydWJfc3RyY3B5IChidWYsIHVuaXF1ZV9zdHJpbmcpOworCX0KKworICAgICAgaWYgKCEgaXNfY29tcGxldGlvbikKKwlncnViX3B1dGNoYXIgKCdcbicpOworICAgICAgCisgICAgICBwcmludF9lcnJvciAoKTsKKyAgICAgIGRvX2NvbXBsZXRpb24gPSAwOworICAgICAgaWYgKGVycm51bSkKKwlyZXR1cm4gLTE7CisgICAgICBlbHNlCisJcmV0dXJuIHVuaXF1ZSAtIDE7CisgICAgfQorCisgIGlmICgqYnVmID09ICcvJyB8fCAocHRyID0gc2V0X2RldmljZSAoYnVmKSkgfHwgaW5jb21wbGV0ZSkKKyAgICB7CisgICAgICBlcnJudW0gPSAwOworCisgICAgICBpZiAoKmJ1ZiA9PSAnKCcgJiYgKGluY29tcGxldGUgfHwgISAqcHRyKSkKKwl7CisJICBpZiAoISBwYXJ0X2Nob2ljZSkKKwkgICAgeworCSAgICAgIC8qIGRpc2sgY29tcGxldGlvbnMgKi8KKwkgICAgICBpbnQgZGlza19ubywgaSwgajsKKwkgICAgICBzdHJ1Y3QgZ2VvbWV0cnkgZ2VvbTsKKworCSAgICAgIGlmICghIGlzX2NvbXBsZXRpb24pCisJCWdydWJfcHJpbnRmICgiIFBvc3NpYmxlIGRpc2tzIGFyZTogIik7CisKKwkgICAgICBpZiAoIXB0cgorCQkgIHx8ICoocHRyLTEpICE9ICdkJworI2lmZGVmIFNVUFBPUlRfTkVUQk9PVAorCQkgIHx8ICoocHRyLTIpICE9ICduJworI2VuZGlmIC8qIFNVUFBPUlRfTkVUQk9PVCAqLworCQkgIHx8ICoocHRyLTIpICE9ICdjJykKKwkJeworCQkgIGZvciAoaSA9IChwdHIgJiYgKCoocHRyLTEpID09ICdkJyAmJiAqKHB0ci0yKSA9PSAnaCcpID8gMTowKTsKKwkJICAgICAgIGkgPCAocHRyICYmICgqKHB0ci0xKSA9PSAnZCcgJiYgKihwdHItMikgPT0gJ2YnKSA/IDE6Mik7CisJCSAgICAgICBpKyspCisJCSAgICB7CisJCSAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisJCQl7CisJCQkgIGRpc2tfbm8gPSAoaSAqIDB4ODApICsgajsKKwkJCSAgaWYgKChkaXNrX2Nob2ljZSB8fCBkaXNrX25vID09IGN1cnJlbnRfZHJpdmUpCisJCQkgICAgICAmJiAhIGdldF9kaXNraW5mbyAoZGlza19ubywgJmdlb20pKQorCQkJICAgIHsKKwkJCSAgICAgIGNoYXIgZGV2X25hbWVbOF07CisKKwkJCSAgICAgIGdydWJfc3ByaW50ZiAoZGV2X25hbWUsICIlY2QlZCIsIGkgPyAnaCc6J2YnLCBqKTsKKwkJCSAgICAgIHByaW50X2FfY29tcGxldGlvbiAoZGV2X25hbWUpOworCQkJICAgIH0KKwkJCX0KKwkJICAgIH0KKwkJfQorCisJICAgICAgaWYgKGNkcm9tX2RyaXZlICE9IEdSVUJfSU5WQUxJRF9EUklWRQorCQkgICYmIChkaXNrX2Nob2ljZSB8fCBjZHJvbV9kcml2ZSA9PSBjdXJyZW50X2RyaXZlKQorCQkgICYmICghcHRyCisJCSAgICAgIHx8ICoocHRyLTEpID09ICcoJworCQkgICAgICB8fCAoKihwdHItMSkgPT0gJ2QnICYmICoocHRyLTIpID09ICdjJykpKQorCQlwcmludF9hX2NvbXBsZXRpb24gKCJjZCIpOworCisjIGlmZGVmIFNVUFBPUlRfTkVUQk9PVAorCSAgICAgIGlmIChuZXR3b3JrX3JlYWR5CisJCSAgJiYgKGRpc2tfY2hvaWNlIHx8IE5FVFdPUktfRFJJVkUgPT0gY3VycmVudF9kcml2ZSkKKwkJICAmJiAoIXB0cgorCQkgICAgICB8fCAqKHB0ci0xKSA9PSAnKCcKKwkJICAgICAgfHwgKCoocHRyLTEpID09ICdkJyAmJiAqKHB0ci0yKSA9PSAnbicpKSkKKwkJcHJpbnRfYV9jb21wbGV0aW9uICgibmQiKTsKKyMgZW5kaWYgLyogU1VQUE9SVF9ORVRCT09UICovCisKKwkgICAgICBpZiAoaXNfY29tcGxldGlvbiAmJiAqdW5pcXVlX3N0cmluZykKKwkJeworCQkgIHB0ciA9IGJ1ZjsKKwkJICB3aGlsZSAoKnB0ciAhPSAnKCcpCisJCSAgICBwdHItLTsKKwkJICBwdHIrKzsKKwkJICBncnViX3N0cmNweSAocHRyLCB1bmlxdWVfc3RyaW5nKTsKKwkJICBpZiAodW5pcXVlID09IDEpCisJCSAgICB7CisJCSAgICAgIHB0ciArPSBncnViX3N0cmxlbiAocHRyKTsKKwkJICAgICAgaWYgKCp1bmlxdWVfc3RyaW5nID09ICdoJykKKwkJCXsKKwkJCSAgKnB0cisrID0gJywnOworCQkJICAqcHRyID0gMDsKKwkJCX0KKwkJICAgICAgZWxzZQorCQkJeworCQkJICAqcHRyKysgPSAnKSc7CisJCQkgICpwdHIgPSAwOworCQkJfQorCQkgICAgfQorCQl9CisKKwkgICAgICBpZiAoISBpc19jb21wbGV0aW9uKQorCQlncnViX3B1dGNoYXIgKCdcbicpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBwYXJ0aXRpb24gY29tcGxldGlvbnMgKi8KKwkgICAgICBpZiAocGFydF9jaG9pY2UgPT0gUEFSVF9DSE9TRU4KKwkJICAmJiBvcGVuX3BhcnRpdGlvbiAoKQorCQkgICYmICEgSVNfUENfU0xJQ0VfVFlQRV9CU0QgKGN1cnJlbnRfc2xpY2UpKQorCQl7CisJCSAgdW5pcXVlID0gMTsKKwkJICBwdHIgPSBidWYgKyBncnViX3N0cmxlbiAoYnVmKTsKKwkJICBpZiAoKihwdHIgLSAxKSAhPSAnKScpCisJCSAgICB7CisJCSAgICAgICpwdHIrKyA9ICcpJzsKKwkJICAgICAgKnB0ciA9IDA7CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBpZiAoISBpc19jb21wbGV0aW9uKQorCQkgICAgZ3J1Yl9wcmludGYgKCIgUG9zc2libGUgcGFydGl0aW9ucyBhcmU6XG4iKTsKKwkJICByZWFsX29wZW5fcGFydGl0aW9uICgxKTsKKwkJICAKKwkJICBpZiAoaXNfY29tcGxldGlvbiAmJiAqdW5pcXVlX3N0cmluZykKKwkJICAgIHsKKwkJICAgICAgcHRyID0gYnVmOworCQkgICAgICB3aGlsZSAoKnB0cisrICE9ICcsJykKKwkJCTsKKwkJICAgICAgZ3J1Yl9zdHJjcHkgKHB0ciwgdW5pcXVlX3N0cmluZyk7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKHB0ciAmJiAqcHRyID09ICcvJykKKwl7CisJICAvKiBmaWxlbmFtZSBjb21wbGV0aW9ucyAqLworCSAgaWYgKCEgaXNfY29tcGxldGlvbikKKwkgICAgZ3J1Yl9wcmludGYgKCIgUG9zc2libGUgZmlsZXMgYXJlOiIpOworCSAgCisJICBkaXIgKGJ1Zik7CisJICAKKwkgIGlmIChpc19jb21wbGV0aW9uICYmICp1bmlxdWVfc3RyaW5nKQorCSAgICB7CisJICAgICAgcHRyICs9IGdydWJfc3RybGVuIChwdHIpOworCSAgICAgIHdoaWxlICgqcHRyICE9ICcvJykKKwkJcHRyLS07CisJICAgICAgcHRyKys7CisJICAgICAgCisJICAgICAgZ3J1Yl9zdHJjcHkgKHB0ciwgdW5pcXVlX3N0cmluZyk7CisJICAgICAgCisJICAgICAgaWYgKHVuaXF1ZSA9PSAxKQorCQl7CisJCSAgcHRyICs9IGdydWJfc3RybGVuICh1bmlxdWVfc3RyaW5nKTsKKworCQkgIC8qIENoZWNrIGlmIHRoZSBmaWxlIFVOSVFVRV9TVFJJTkcgaXMgYSBkaXJlY3RvcnkuICAqLworCQkgICpwdHIgPSAnLyc7CisJCSAgKihwdHIgKyAxKSA9IDA7CisJCSAgCisJCSAgZGlyIChidWYpOworCQkgIAorCQkgIC8qIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHVuaXF1ZSB2YWx1ZS4gICovCisJCSAgdW5pcXVlID0gMTsKKwkJICAKKwkJICBpZiAoZXJybnVtKQorCQkgICAgeworCQkgICAgICAvKiBSZWd1bGFyIGZpbGUgKi8KKwkJICAgICAgZXJybnVtID0gMDsKKwkJICAgICAgKnB0ciA9ICcgJzsKKwkJICAgICAgKihwdHIgKyAxKSA9IDA7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgCisJICBpZiAoISBpc19jb21wbGV0aW9uKQorCSAgICBncnViX3B1dGNoYXIgKCdcbicpOworCX0KKyAgICAgIGVsc2UKKwllcnJudW0gPSBFUlJfQkFEX0ZJTEVOQU1FOworICAgIH0KKworICBwcmludF9lcnJvciAoKTsKKyAgZG9fY29tcGxldGlvbiA9IDA7CisgIGlmIChlcnJudW0pCisgICAgcmV0dXJuIC0xOworICBlbHNlCisgICAgcmV0dXJuIHVuaXF1ZSAtIDE7Cit9CisjZW5kaWYgLyogU1RBR0UxXzUgKi8KKworCisvKgorICogIFRoaXMgaXMgdGhlIGdlbmVyaWMgZmlsZSBvcGVuIGZ1bmN0aW9uLgorICovCisKK2ludAorZ3J1Yl9vcGVuIChjaGFyICpmaWxlbmFtZSkKK3sKKyNpZm5kZWYgTk9fREVDT01QUkVTU0lPTgorICBjb21wcmVzc2VkX2ZpbGUgPSAwOworI2VuZGlmIC8qIE5PX0RFQ09NUFJFU1NJT04gKi8KKworICAvKiBpZiBhbnkgImRpciIgZnVuY3Rpb24gdXNlcy9zZXRzIGZpbGVwb3MsIGl0IG11c3QKKyAgICAgc2V0IGl0IHRvIHplcm8gYmVmb3JlIHJldHVybmluZyBpZiBvcGVuaW5nIGEgZmlsZSEgKi8KKyAgZmlsZXBvcyA9IDA7CisKKyAgaWYgKCEoZmlsZW5hbWUgPSBzZXR1cF9wYXJ0IChmaWxlbmFtZSkpKQorICAgIHJldHVybiAwOworCisjaWZuZGVmIE5PX0JMT0NLX0ZJTEVTCisgIGJsb2NrX2ZpbGUgPSAwOworI2VuZGlmIC8qIE5PX0JMT0NLX0ZJTEVTICovCisKKyAgLyogVGhpcyBhY2NvdW50cyBmb3IgcGFydGlhbCBmaWxlc3lzdGVtIGltcGxlbWVudGF0aW9ucy4gKi8KKyAgZnNtYXggPSBNQVhJTlQ7CisKKyAgaWYgKCpmaWxlbmFtZSAhPSAnLycpCisgICAgeworI2lmbmRlZiBOT19CTE9DS19GSUxFUworICAgICAgY2hhciAqcHRyID0gZmlsZW5hbWU7CisgICAgICBpbnQgdG1wLCBsaXN0X2FkZHIgPSBCTEtfQkxLTElTVF9TVEFSVDsKKyAgICAgIGZpbGVtYXggPSAwOworCisgICAgICB3aGlsZSAobGlzdF9hZGRyIDwgQkxLX01BWF9BRERSKQorCXsKKwkgIHRtcCA9IDA7CisJICBzYWZlX3BhcnNlX21heGludCAoJnB0ciwgJnRtcCk7CisJICBlcnJudW0gPSAwOworCisJICBpZiAoKnB0ciAhPSAnKycpCisJICAgIHsKKwkgICAgICBpZiAoKCpwdHIgJiYgKnB0ciAhPSAnLycgJiYgIWlzc3BhY2UgKCpwdHIpKQorCQkgIHx8IHRtcCA9PSAwIHx8IHRtcCA+IGZpbGVtYXgpCisJCWVycm51bSA9IEVSUl9CQURfRklMRU5BTUU7CisJICAgICAgZWxzZQorCQlmaWxlbWF4ID0gdG1wOworCisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgLyogc2luY2Ugd2UgdXNlIHRoZSBzYW1lIGZpbGVzeXN0ZW0gYnVmZmVyLCBtYXJrIGl0IHRvCisJICAgICBiZSByZW1vdW50ZWQgKi8KKwkgIGZzeXNfdHlwZSA9IE5VTV9GU1lTOworCisJICBCTEtfQkxLU1RBUlQgKGxpc3RfYWRkcikgPSB0bXA7CisJICBwdHIrKzsKKworCSAgaWYgKCFzYWZlX3BhcnNlX21heGludCAoJnB0ciwgJnRtcCkKKwkgICAgICB8fCB0bXAgPT0gMAorCSAgICAgIHx8ICgqcHRyICYmICpwdHIgIT0gJywnICYmICpwdHIgIT0gJy8nICYmICFpc3NwYWNlICgqcHRyKSkpCisJICAgIHsKKwkgICAgICBlcnJudW0gPSBFUlJfQkFEX0ZJTEVOQU1FOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIEJMS19CTEtMRU5HVEggKGxpc3RfYWRkcikgPSB0bXA7CisKKwkgIGZpbGVtYXggKz0gKHRtcCAqIFNFQ1RPUl9TSVpFKTsKKwkgIGxpc3RfYWRkciArPSBCTEtfQkxLTElTVF9JTkNfVkFMOworCisJICBpZiAoKnB0ciAhPSAnLCcpCisJICAgIGJyZWFrOworCisJICBwdHIrKzsKKwl9CisKKyAgICAgIGlmIChsaXN0X2FkZHIgPCBCTEtfTUFYX0FERFIgJiYgcHRyICE9IGZpbGVuYW1lICYmICFlcnJudW0pCisJeworCSAgYmxvY2tfZmlsZSA9IDE7CisJICBCTEtfQ1VSX0ZJTEVQT1MgPSAwOworCSAgQkxLX0NVUl9CTEtMSVNUID0gQkxLX0JMS0xJU1RfU1RBUlQ7CisJICBCTEtfQ1VSX0JMS05VTSA9IDA7CisKKyNpZm5kZWYgTk9fREVDT01QUkVTU0lPTgorCSAgcmV0dXJuIGd1bnppcF90ZXN0X2hlYWRlciAoKTsKKyNlbHNlIC8qIE5PX0RFQ09NUFJFU1NJT04gKi8KKwkgIHJldHVybiAxOworI2VuZGlmIC8qIE5PX0RFQ09NUFJFU1NJT04gKi8KKwl9CisjZWxzZSAvKiBOT19CTE9DS19GSUxFUyAqLworICAgICAgZXJybnVtID0gRVJSX0JBRF9GSUxFTkFNRTsKKyNlbmRpZiAvKiBOT19CTE9DS19GSUxFUyAqLworICAgIH0KKworICBpZiAoIWVycm51bSAmJiBmc3lzX3R5cGUgPT0gTlVNX0ZTWVMpCisgICAgZXJybnVtID0gRVJSX0ZTWVNfTU9VTlQ7CisKKyMgaWZuZGVmIFNUQUdFMV81CisgIC8qIHNldCAiZGlyIiBmdW5jdGlvbiB0byBvcGVuIGEgZmlsZSAqLworICBwcmludF9wb3NzaWJpbGl0aWVzID0gMDsKKyMgZW5kaWYKKworICBpZiAoIWVycm51bSAmJiAoKihmc3lzX3RhYmxlW2ZzeXNfdHlwZV0uZGlyX2Z1bmMpKSAoZmlsZW5hbWUpKQorICAgIHsKKyNpZm5kZWYgTk9fREVDT01QUkVTU0lPTgorICAgICAgcmV0dXJuIGd1bnppcF90ZXN0X2hlYWRlciAoKTsKKyNlbHNlIC8qIE5PX0RFQ09NUFJFU1NJT04gKi8KKyAgICAgIHJldHVybiAxOworI2VuZGlmIC8qIE5PX0RFQ09NUFJFU1NJT04gKi8KKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKworaW50CitncnViX3JlYWQgKGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKyAgLyogTWFrZSBzdXJlICJmaWxlcG9zIiBpcyBhIHNhbmUgdmFsdWUgKi8KKyAgaWYgKChmaWxlcG9zIDwgMCkgfHwgKGZpbGVwb3MgPiBmaWxlbWF4KSkKKyAgICBmaWxlcG9zID0gZmlsZW1heDsKKworICAvKiBNYWtlIHN1cmUgImxlbiIgaXMgYSBzYW5lIHZhbHVlICovCisgIGlmICgobGVuIDwgMCkgfHwgKGxlbiA+IChmaWxlbWF4IC0gZmlsZXBvcykpKQorICAgIGxlbiA9IGZpbGVtYXggLSBmaWxlcG9zOworCisgIC8qIGlmIHRhcmdldCBmaWxlIHBvc2l0aW9uIGlzIHBhc3QgdGhlIGVuZCBvZgorICAgICB0aGUgc3VwcG9ydGVkL2NvbmZpZ3VyZWQgZmlsZXNpemUsIHRoZW4KKyAgICAgdGhlcmUgaXMgYW4gZXJyb3IgKi8KKyAgaWYgKGZpbGVwb3MgKyBsZW4gPiBmc21heCkKKyAgICB7CisgICAgICBlcnJudW0gPSBFUlJfRklMRUxFTkdUSDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworI2lmbmRlZiBOT19ERUNPTVBSRVNTSU9OCisgIGlmIChjb21wcmVzc2VkX2ZpbGUpCisgICAgcmV0dXJuIGd1bnppcF9yZWFkIChidWYsIGxlbik7CisjZW5kaWYgLyogTk9fREVDT01QUkVTU0lPTiAqLworCisjaWZuZGVmIE5PX0JMT0NLX0ZJTEVTCisgIGlmIChibG9ja19maWxlKQorICAgIHsKKyAgICAgIGludCBzaXplLCBvZmYsIHJldCA9IDA7CisKKyAgICAgIHdoaWxlIChsZW4gJiYgIWVycm51bSkKKwl7CisJICAvKiB3ZSBtYXkgbmVlZCB0byBsb29rIGZvciB0aGUgcmlnaHQgYmxvY2sgaW4gdGhlIGxpc3QocykgKi8KKwkgIGlmIChmaWxlcG9zIDwgQkxLX0NVUl9GSUxFUE9TKQorCSAgICB7CisJICAgICAgQkxLX0NVUl9GSUxFUE9TID0gMDsKKwkgICAgICBCTEtfQ1VSX0JMS0xJU1QgPSBCTEtfQkxLTElTVF9TVEFSVDsKKwkgICAgICBCTEtfQ1VSX0JMS05VTSA9IDA7CisJICAgIH0KKworCSAgLyogcnVuIEJMS19DVVJfRklMRVBPUyB1cCB0byBmaWxlcG9zICovCisJICB3aGlsZSAoZmlsZXBvcyA+IEJMS19DVVJfRklMRVBPUykKKwkgICAgeworCSAgICAgIGlmICgoZmlsZXBvcyAtIChCTEtfQ1VSX0ZJTEVQT1MgJiB+KFNFQ1RPUl9TSVpFIC0gMSkpKQorCQkgID49IFNFQ1RPUl9TSVpFKQorCQl7CisJCSAgQkxLX0NVUl9GSUxFUE9TICs9IFNFQ1RPUl9TSVpFOworCQkgIEJMS19DVVJfQkxLTlVNKys7CisKKwkJICBpZiAoQkxLX0NVUl9CTEtOVU0gPj0gQkxLX0JMS0xFTkdUSCAoQkxLX0NVUl9CTEtMSVNUKSkKKwkJICAgIHsKKwkJICAgICAgQkxLX0NVUl9CTEtMSVNUICs9IEJMS19CTEtMSVNUX0lOQ19WQUw7CisJCSAgICAgIEJMS19DVVJfQkxLTlVNID0gMDsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UKKwkJQkxLX0NVUl9GSUxFUE9TID0gZmlsZXBvczsKKwkgICAgfQorCisJICBvZmYgPSBmaWxlcG9zICYgKFNFQ1RPUl9TSVpFIC0gMSk7CisJICBzaXplID0gKChCTEtfQkxLTEVOR1RIIChCTEtfQ1VSX0JMS0xJU1QpIC0gQkxLX0NVUl9CTEtOVU0pCisJCSAgKiBTRUNUT1JfU0laRSkgLSBvZmY7CisJICBpZiAoc2l6ZSA+IGxlbikKKwkgICAgc2l6ZSA9IGxlbjsKKworCSAgZGlza19yZWFkX2Z1bmMgPSBkaXNrX3JlYWRfaG9vazsKKworCSAgLyogcmVhZCBjdXJyZW50IGJsb2NrIGFuZCBwdXQgaXQgaW4gdGhlIHJpZ2h0IHBsYWNlIGluIG1lbW9yeSAqLworCSAgZGV2cmVhZCAoQkxLX0JMS1NUQVJUIChCTEtfQ1VSX0JMS0xJU1QpICsgQkxLX0NVUl9CTEtOVU0sCisJCSAgIG9mZiwgc2l6ZSwgYnVmKTsKKworCSAgZGlza19yZWFkX2Z1bmMgPSBOVUxMOworCisJICBsZW4gLT0gc2l6ZTsKKwkgIGZpbGVwb3MgKz0gc2l6ZTsKKwkgIHJldCArPSBzaXplOworCSAgYnVmICs9IHNpemU7CisJfQorCisgICAgICBpZiAoZXJybnVtKQorCXJldCA9IDA7CisKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorI2VuZGlmIC8qIE5PX0JMT0NLX0ZJTEVTICovCisKKyAgaWYgKGZzeXNfdHlwZSA9PSBOVU1fRlNZUykKKyAgICB7CisgICAgICBlcnJudW0gPSBFUlJfRlNZU19NT1VOVDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICByZXR1cm4gKCooZnN5c190YWJsZVtmc3lzX3R5cGVdLnJlYWRfZnVuYykpIChidWYsIGxlbik7Cit9CisKKyNpZm5kZWYgU1RBR0UxXzUKKy8qIFJlcG9zaXRpb24gYSBmaWxlIG9mZnNldC4gICovCitpbnQKK2dydWJfc2VlayAoaW50IG9mZnNldCkKK3sKKyAgaWYgKG9mZnNldCA+IGZpbGVtYXggfHwgb2Zmc2V0IDwgMCkKKyAgICByZXR1cm4gLTE7CisKKyAgZmlsZXBvcyA9IG9mZnNldDsKKyAgcmV0dXJuIG9mZnNldDsKK30KKworaW50CitkaXIgKGNoYXIgKmRpcm5hbWUpCit7CisjaWZuZGVmIE5PX0RFQ09NUFJFU1NJT04KKyAgY29tcHJlc3NlZF9maWxlID0gMDsKKyNlbmRpZiAvKiBOT19ERUNPTVBSRVNTSU9OICovCisKKyAgaWYgKCEoZGlybmFtZSA9IHNldHVwX3BhcnQgKGRpcm5hbWUpKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoKmRpcm5hbWUgIT0gJy8nKQorICAgIGVycm51bSA9IEVSUl9CQURfRklMRU5BTUU7CisKKyAgaWYgKGZzeXNfdHlwZSA9PSBOVU1fRlNZUykKKyAgICBlcnJudW0gPSBFUlJfRlNZU19NT1VOVDsKKworICBpZiAoZXJybnVtKQorICAgIHJldHVybiAwOworCisgIC8qIHNldCAiZGlyIiBmdW5jdGlvbiB0byBsaXN0IGNvbXBsZXRpb25zICovCisgIHByaW50X3Bvc3NpYmlsaXRpZXMgPSAxOworCisgIHJldHVybiAoKihmc3lzX3RhYmxlW2ZzeXNfdHlwZV0uZGlyX2Z1bmMpKSAoZGlybmFtZSk7Cit9CisjZW5kaWYgLyogU1RBR0UxXzUgKi8KKwordm9pZCAKK2dydWJfY2xvc2UgKHZvaWQpCit7CisjaWZuZGVmIE5PX0JMT0NLX0ZJTEVTCisgIGlmIChibG9ja19maWxlKQorICAgIHJldHVybjsKKyNlbmRpZiAvKiBOT19CTE9DS19GSUxFUyAqLworICAKKyAgaWYgKGZzeXNfdGFibGVbZnN5c190eXBlXS5jbG9zZV9mdW5jICE9IDApCisgICAgKCooZnN5c190YWJsZVtmc3lzX3R5cGVdLmNsb3NlX2Z1bmMpKSAoKTsKK30KZGlmZiAtLWdpdCBhL3N0YWdlMi9mYXQuaCBiL3N0YWdlMi9mYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmVkNmJhCi0tLSAvZGV2L251bGwKKysrIGIvc3RhZ2UyL2ZhdC5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworCisvKgorICogIERlZmluZXMgZm9yIHRoZSBGQVQgQklPUyBQYXJhbWV0ZXIgQmxvY2sgKGVtYmVkZGVkIGluIHRoZSBmaXJzdCBibG9jaworICogIG9mIHRoZSBwYXJ0aXRpb24uCisgKi8KKwordHlwZWRlZiBfX3NpZ25lZF9fIGNoYXIgX19zODsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBfX3U4OwordHlwZWRlZiBfX3NpZ25lZF9fIHNob3J0IF9fczE2OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBfX3UxNjsKK3R5cGVkZWYgX19zaWduZWRfXyBpbnQgX19zMzI7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBfX3UzMjsKKworLyogTm90ZSB0aGF0IHNvbWUgc2hvcnRzIGFyZSBub3QgYWxpZ25lZCwgYW5kIG11c3QgdGhlcmVmb3JlCisgKiBiZSBkZWNsYXJlZCBhcyBhcnJheSBvZiB0d28gYnl0ZXMuCisgKi8KK3N0cnVjdCBmYXRfYnBiIHsKKwlfX3M4CWlnbm9yZWRbM107CS8qIEJvb3Qgc3RyYXAgc2hvcnQgb3IgbmVhciBqdW1wICovCisJX19zOAlzeXN0ZW1faWRbOF07CS8qIE5hbWUgLSBjYW4gYmUgdXNlZCB0byBzcGVjaWFsIGNhc2UKKwkJCQkgICBwYXJ0aXRpb24gbWFuYWdlciB2b2x1bWVzICovCisJX191OAlieXRlc19wZXJfc2VjdFsyXTsJLyogYnl0ZXMgcGVyIGxvZ2ljYWwgc2VjdG9yICovCisJX191OAlzZWN0c19wZXJfY2x1c3Q7Lyogc2VjdG9ycy9jbHVzdGVyICovCisJX191OAlyZXNlcnZlZF9zZWN0c1syXTsJLyogcmVzZXJ2ZWQgc2VjdG9ycyAqLworCV9fdTgJbnVtX2ZhdHM7CS8qIG51bWJlciBvZiBGQVRzICovCisJX191OAlkaXJfZW50cmllc1syXTsJLyogcm9vdCBkaXJlY3RvcnkgZW50cmllcyAqLworCV9fdTgJc2hvcnRfc2VjdG9yc1syXTsJLyogbnVtYmVyIG9mIHNlY3RvcnMgKi8KKwlfX3U4CW1lZGlhOwkJLyogbWVkaWEgY29kZSAodW51c2VkKSAqLworCV9fdTE2CWZhdF9sZW5ndGg7CS8qIHNlY3RvcnMvRkFUICovCisJX191MTYJc2Vjc190cmFjazsJLyogc2VjdG9ycyBwZXIgdHJhY2sgKi8KKwlfX3UxNgloZWFkczsJCS8qIG51bWJlciBvZiBoZWFkcyAqLworCV9fdTMyCWhpZGRlbjsJCS8qIGhpZGRlbiBzZWN0b3JzICh1bnVzZWQpICovCisJX191MzIJbG9uZ19zZWN0b3JzOwkvKiBudW1iZXIgb2Ygc2VjdG9ycyAoaWYgc2hvcnRfc2VjdG9ycyA9PSAwKSAqLworCisJLyogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG9ubHkgdXNlZCBieSBGQVQzMiAqLworCV9fdTMyCWZhdDMyX2xlbmd0aDsJLyogc2VjdG9ycy9GQVQgKi8KKwlfX3UxNglmbGFnczsJCS8qIGJpdCA4OiBmYXQgbWlycm9yaW5nLCBsb3cgNDogYWN0aXZlIGZhdCAqLworCV9fdTgJdmVyc2lvblsyXTsJLyogbWFqb3IsIG1pbm9yIGZpbGVzeXN0ZW0gdmVyc2lvbiAqLworCV9fdTMyCXJvb3RfY2x1c3RlcjsJLyogZmlyc3QgY2x1c3RlciBpbiByb290IGRpcmVjdG9yeSAqLworCV9fdTE2CWluZm9fc2VjdG9yOwkvKiBmaWxlc3lzdGVtIGluZm8gc2VjdG9yICovCisJX191MTYJYmFja3VwX2Jvb3Q7CS8qIGJhY2t1cCBib290IHNlY3RvciAqLworCV9fdTE2CXJlc2VydmVkMls2XTsJLyogVW51c2VkICovCit9OworCisjZGVmaW5lIEZBVF9DVlRfVTE2KGJ5dGFycikgKCogKF9fdTE2KikoYnl0YXJyKSkKKworLyoKKyAqICBEZWZpbmVzIGhvdyB0byBkaWZmZXJlbnRpYXRlIGEgMTItYml0IGFuZCAxNi1iaXQgRkFULgorICovCisKKyNkZWZpbmUgRkFUX01BWF8xMkJJVF9DTFVTVCAgICAgICA0MDg3CS8qIDQwODUgKyAyICovCisKKy8qCisgKiAgRGVmaW5lcyBmb3IgdGhlIGZpbGUgImF0dHJpYnV0ZSIgYnl0ZQorICovCisKKyNkZWZpbmUgRkFUX0FUVFJJQl9PS19NQVNLICAgICAgICAweDM3CisjZGVmaW5lIEZBVF9BVFRSSUJfTk9UX09LX01BU0sgICAgMHhDOAorI2RlZmluZSBGQVRfQVRUUklCX0RJUiAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgRkFUX0FUVFJJQl9MT05HTkFNRSAgICAgICAweDBGCisKKy8qCisgKiAgRGVmaW5lcyBmb3IgRkFUIGRpcmVjdG9yeSBlbnRyaWVzCisgKi8KKworI2RlZmluZSBGQVRfRElSRU5UUllfTEVOR1RIICAgICAgIDMyCisKKyNkZWZpbmUgRkFUX0RJUkVOVFJZX0FUVFJJQihlbnRyeSkgXAorICAoKigodW5zaWduZWQgY2hhciAqKSAoZW50cnkrMTEpKSkKKyNkZWZpbmUgRkFUX0RJUkVOVFJZX1ZBTElEKGVudHJ5KSBcCisgICggKCgqKCh1bnNpZ25lZCBjaGFyICopIGVudHJ5KSkgIT0gMCkgXAorICAgICYmICgoKigodW5zaWduZWQgY2hhciAqKSBlbnRyeSkpICE9IDB4RTUpIFwKKyAgICAmJiAhKEZBVF9ESVJFTlRSWV9BVFRSSUIoZW50cnkpICYgRkFUX0FUVFJJQl9OT1RfT0tfTUFTSykgKQorI2RlZmluZSBGQVRfRElSRU5UUllfRklSU1RfQ0xVU1RFUihlbnRyeSkgXAorICAoKCooKHVuc2lnbmVkIHNob3J0ICopIChlbnRyeSsyNikpKSsoKigodW5zaWduZWQgc2hvcnQgKikgKGVudHJ5KzIwKSkgPDwgMTYpKQorI2RlZmluZSBGQVRfRElSRU5UUllfRklMRUxFTkdUSChlbnRyeSkgXAorICAoKigodW5zaWduZWQgbG9uZyAqKSAoZW50cnkrMjgpKSkKKworI2RlZmluZSBGQVRfTE9OR0RJUl9JRChlbnRyeSkgXAorICAoKigodW5zaWduZWQgY2hhciAqKSAoZW50cnkpKSkKKyNkZWZpbmUgRkFUX0xPTkdESVJfQUxJQVNDSEVDS1NVTShlbnRyeSkgXAorICAoKigodW5zaWduZWQgY2hhciAqKSAoZW50cnkrMTMpKSkKZGlmZiAtLWdpdCBhL3N0YWdlMi9maWxlc3lzLmggYi9zdGFnZTIvZmlsZXN5cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYWQ4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFnZTIvZmlsZXN5cy5oCkBAIC0wLDAgKzEsMTY1IEBACisvKiBmaWxlc3lzLmggLSBhYnN0cmFjdCBmaWxlc3lzdGVtIGludGVyZmFjZSAqLworLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSwyMDA0ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlICJwY19zbGljZS5oIgorCisjaWZkZWYgRlNZU19GRlMKKyNkZWZpbmUgRlNZU19GRlNfTlVNIDEKK2ludCBmZnNfbW91bnQgKHZvaWQpOworaW50IGZmc19yZWFkIChjaGFyICpidWYsIGludCBsZW4pOworaW50IGZmc19kaXIgKGNoYXIgKmRpcm5hbWUpOworaW50IGZmc19lbWJlZCAoaW50ICpzdGFydF9zZWN0b3IsIGludCBuZWVkZWRfc2VjdG9ycyk7CisjZWxzZQorI2RlZmluZSBGU1lTX0ZGU19OVU0gMAorI2VuZGlmCisKKyNpZmRlZiBGU1lTX1VGUzIKKyNkZWZpbmUgRlNZU19VRlMyX05VTSAxCitpbnQgdWZzMl9tb3VudCAodm9pZCk7CitpbnQgdWZzMl9yZWFkIChjaGFyICpidWYsIGludCBsZW4pOworaW50IHVmczJfZGlyIChjaGFyICpkaXJuYW1lKTsKK2ludCB1ZnMyX2VtYmVkIChpbnQgKnN0YXJ0X3NlY3RvciwgaW50IG5lZWRlZF9zZWN0b3JzKTsKKyNlbHNlCisjZGVmaW5lIEZTWVNfVUZTMl9OVU0gMAorI2VuZGlmCisKKyNpZmRlZiBGU1lTX0ZBVAorI2RlZmluZSBGU1lTX0ZBVF9OVU0gMQoraW50IGZhdF9tb3VudCAodm9pZCk7CitpbnQgZmF0X3JlYWQgKGNoYXIgKmJ1ZiwgaW50IGxlbik7CitpbnQgZmF0X2RpciAoY2hhciAqZGlybmFtZSk7CisjZWxzZQorI2RlZmluZSBGU1lTX0ZBVF9OVU0gMAorI2VuZGlmCisKKyNpZmRlZiBGU1lTX0VYVDJGUworI2RlZmluZSBGU1lTX0VYVDJGU19OVU0gMQoraW50IGV4dDJmc19tb3VudCAodm9pZCk7CitpbnQgZXh0MmZzX3JlYWQgKGNoYXIgKmJ1ZiwgaW50IGxlbik7CitpbnQgZXh0MmZzX2RpciAoY2hhciAqZGlybmFtZSk7CisjZWxzZQorI2RlZmluZSBGU1lTX0VYVDJGU19OVU0gMAorI2VuZGlmCisKKyNpZmRlZiBGU1lTX01JTklYCisjZGVmaW5lIEZTWVNfTUlOSVhfTlVNIDEKK2ludCBtaW5peF9tb3VudCAodm9pZCk7CitpbnQgbWluaXhfcmVhZCAoY2hhciAqYnVmLCBpbnQgbGVuKTsKK2ludCBtaW5peF9kaXIgKGNoYXIgKmRpcm5hbWUpOworI2Vsc2UKKyNkZWZpbmUgRlNZU19NSU5JWF9OVU0gMAorI2VuZGlmCisKKyNpZmRlZiBGU1lTX1JFSVNFUkZTCisjZGVmaW5lIEZTWVNfUkVJU0VSRlNfTlVNIDEKK2ludCByZWlzZXJmc19tb3VudCAodm9pZCk7CitpbnQgcmVpc2VyZnNfcmVhZCAoY2hhciAqYnVmLCBpbnQgbGVuKTsKK2ludCByZWlzZXJmc19kaXIgKGNoYXIgKmRpcm5hbWUpOworaW50IHJlaXNlcmZzX2VtYmVkIChpbnQgKnN0YXJ0X3NlY3RvciwgaW50IG5lZWRlZF9zZWN0b3JzKTsKKyNlbHNlCisjZGVmaW5lIEZTWVNfUkVJU0VSRlNfTlVNIDAKKyNlbmRpZgorCisjaWZkZWYgRlNZU19WU1RBRlMKKyNkZWZpbmUgRlNZU19WU1RBRlNfTlVNIDEKK2ludCB2c3RhZnNfbW91bnQgKHZvaWQpOworaW50IHZzdGFmc19yZWFkIChjaGFyICpidWYsIGludCBsZW4pOworaW50IHZzdGFmc19kaXIgKGNoYXIgKmRpcm5hbWUpOworI2Vsc2UKKyNkZWZpbmUgRlNZU19WU1RBRlNfTlVNIDAKKyNlbmRpZgorCisjaWZkZWYgRlNZU19KRlMKKyNkZWZpbmUgRlNZU19KRlNfTlVNIDEKK2ludCBqZnNfbW91bnQgKHZvaWQpOworaW50IGpmc19yZWFkIChjaGFyICpidWYsIGludCBsZW4pOworaW50IGpmc19kaXIgKGNoYXIgKmRpcm5hbWUpOworaW50IGpmc19lbWJlZCAoaW50ICpzdGFydF9zZWN0b3IsIGludCBuZWVkZWRfc2VjdG9ycyk7CisjZWxzZQorI2RlZmluZSBGU1lTX0pGU19OVU0gMAorI2VuZGlmCisKKyNpZmRlZiBGU1lTX1hGUworI2RlZmluZSBGU1lTX1hGU19OVU0gMQoraW50IHhmc19tb3VudCAodm9pZCk7CitpbnQgeGZzX3JlYWQgKGNoYXIgKmJ1ZiwgaW50IGxlbik7CitpbnQgeGZzX2RpciAoY2hhciAqZGlybmFtZSk7CisjZWxzZQorI2RlZmluZSBGU1lTX1hGU19OVU0gMAorI2VuZGlmCisKKyNpZmRlZiBGU1lTX1RGVFAKKyNkZWZpbmUgRlNZU19URlRQX05VTSAxCitpbnQgdGZ0cF9tb3VudCAodm9pZCk7CitpbnQgdGZ0cF9yZWFkIChjaGFyICpidWYsIGludCBsZW4pOworaW50IHRmdHBfZGlyIChjaGFyICpkaXJuYW1lKTsKK3ZvaWQgdGZ0cF9jbG9zZSAodm9pZCk7CisjZWxzZQorI2RlZmluZSBGU1lTX1RGVFBfTlVNIDAKKyNlbmRpZgorCisjaWZkZWYgRlNZU19JU085NjYwCisjZGVmaW5lIEZTWVNfSVNPOTY2MF9OVU0gMQoraW50IGlzbzk2NjBfbW91bnQgKHZvaWQpOworaW50IGlzbzk2NjBfcmVhZCAoY2hhciAqYnVmLCBpbnQgbGVuKTsKK2ludCBpc285NjYwX2RpciAoY2hhciAqZGlybmFtZSk7CisjZWxzZQorI2RlZmluZSBGU1lTX0lTTzk2NjBfTlVNIDAKKyNlbmRpZgorCisjaWZuZGVmIE5VTV9GU1lTCisjZGVmaW5lIE5VTV9GU1lTCVwKKyAgKEZTWVNfRkZTX05VTSArIEZTWVNfRkFUX05VTSArIEZTWVNfRVhUMkZTX05VTSArIEZTWVNfTUlOSVhfTlVNCVwKKyAgICsgRlNZU19SRUlTRVJGU19OVU0gKyBGU1lTX1ZTVEFGU19OVU0gKyBGU1lTX0pGU19OVU0gKyBGU1lTX1hGU19OVU0JXAorICAgKyBGU1lTX1RGVFBfTlVNICsgRlNZU19JU085NjYwX05VTSArIEZTWVNfVUZTMl9OVU0pCisjZW5kaWYKKworLyogZGVmaW5lcyBmb3IgdGhlIGJsb2NrIGZpbGVzeXN0ZW0gaW5mbyBhcmVhICovCisjaWZuZGVmIE5PX0JMT0NLX0ZJTEVTCisjZGVmaW5lIEJMS19DVVJfRklMRVBPUyAgICAgICgqKChpbnQqKUZTWVNfQlVGKSkKKyNkZWZpbmUgQkxLX0NVUl9CTEtMSVNUICAgICAgKCooKGludCopKEZTWVNfQlVGKzQpKSkKKyNkZWZpbmUgQkxLX0NVUl9CTEtOVU0gICAgICAgKCooKGludCopKEZTWVNfQlVGKzgpKSkKKyNkZWZpbmUgQkxLX01BWF9BRERSICAgICAgICAgKEZTWVNfQlVGKzB4N0ZGOSkKKyNkZWZpbmUgQkxLX0JMS1NUQVJUKGwpICAgICAgKCooKGludCopbCkpCisjZGVmaW5lIEJMS19CTEtMRU5HVEgobCkgICAgICgqKChpbnQqKShsKzQpKSkKKyNkZWZpbmUgQkxLX0JMS0xJU1RfU1RBUlQgICAgKEZTWVNfQlVGKzEyKQorI2RlZmluZSBCTEtfQkxLTElTVF9JTkNfVkFMICA4CisjZW5kaWYgLyogTk9fQkxPQ0tfRklMRVMgKi8KKworLyogdGhpcyBuZXh0IHBhcnQgaXMgcHJldHR5IHVnbHksIGJ1dCBpdCBrZWVwcyBpdCBpbiBvbmUgcGxhY2UhICovCisKK3N0cnVjdCBmc3lzX2VudHJ5Cit7CisgIGNoYXIgKm5hbWU7CisgIGludCAoKm1vdW50X2Z1bmMpICh2b2lkKTsKKyAgaW50ICgqcmVhZF9mdW5jKSAoY2hhciAqYnVmLCBpbnQgbGVuKTsKKyAgaW50ICgqZGlyX2Z1bmMpIChjaGFyICpkaXJuYW1lKTsKKyAgdm9pZCAoKmNsb3NlX2Z1bmMpICh2b2lkKTsKKyAgaW50ICgqZW1iZWRfZnVuYykgKGludCAqc3RhcnRfc2VjdG9yLCBpbnQgbmVlZGVkX3NlY3RvcnMpOworfTsKKworI2lmZGVmIFNUQUdFMV81CisjIGRlZmluZSBwcmludF9wb3NzaWJpbGl0aWVzIDAKKyNlbHNlCitleHRlcm4gaW50IHByaW50X3Bvc3NpYmlsaXRpZXM7CisjZW5kaWYKKworZXh0ZXJuIGludCBmc21heDsKK2V4dGVybiBzdHJ1Y3QgZnN5c19lbnRyeSBmc3lzX3RhYmxlW05VTV9GU1lTICsgMV07CmRpZmYgLS1naXQgYS9zdGFnZTIvZnJlZWJzZC5oIGIvc3RhZ2UyL2ZyZWVic2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmJmNjAyCi0tLSAvZGV2L251bGwKKysrIGIvc3RhZ2UyL2ZyZWVic2QuaApAQCAtMCwwICsxLDk1IEBACisKKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMjAwMSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKiBjb21tYW5kLWxpbmUgcGFyYW1ldGVyIGRlZmluZXMgKi8KKyNkZWZpbmUgUkJfQVNLTkFNRSAgICAgIDB4MDEJLyogYXNrIGZvciBmaWxlIG5hbWUgdG8gcmVib290IGZyb20gKi8KKyNkZWZpbmUgUkJfU0lOR0xFICAgICAgIDB4MDIJLyogcmVib290IHRvIHNpbmdsZSB1c2VyIG9ubHkgKi8KKyNkZWZpbmUgUkJfTk9TWU5DICAgICAgIDB4MDQJLyogZG9udCBzeW5jIGJlZm9yZSByZWJvb3QgKi8KKyNkZWZpbmUgUkJfSEFMVCAgICAgICAgIDB4MDgJLyogZG9uJ3QgcmVib290LCBqdXN0IGhhbHQgKi8KKyNkZWZpbmUgUkJfSU5JVE5BTUUgICAgIDB4MTAJLyogbmFtZSBnaXZlbiBmb3IgL2V0Yy9pbml0ICh1bnVzZWQpICovCisjZGVmaW5lIFJCX0RGTFRST09UICAgICAweDIwCS8qIHVzZSBjb21waWxlZC1pbiByb290ZGV2ICovCisjZGVmaW5lIFJCX0tEQiAgICAgICAgICAweDQwCS8qIGdpdmUgY29udHJvbCB0byBrZXJuZWwgZGVidWdnZXIgKi8KKyNkZWZpbmUgUkJfUkRPTkxZICAgICAgIDB4ODAJLyogbW91bnQgcm9vdCBmcyByZWFkLW9ubHkgKi8KKyNkZWZpbmUgUkJfRFVNUCAgICAgICAgIDB4MTAwCS8qIGR1bXAga2VybmVsIG1lbW9yeSBiZWZvcmUgcmVib290ICovCisjZGVmaW5lIFJCX01JTklST09UICAgICAweDIwMAkvKiBtaW5pLXJvb3QgcHJlc2VudCBpbiBtZW1vcnkgYXQgYm9vdCB0aW1lICovCisjZGVmaW5lIFJCX0NPTkZJRyAgICAgICAweDQwMAkvKiBpbnZva2UgdXNlciBjb25maWd1cmF0aW9uIHJvdXRpbmcgKi8KKyNkZWZpbmUgUkJfVkVSQk9TRSAgICAgIDB4ODAwCS8qIHByaW50IGFsbCBwb3RlbnRpYWxseSB1c2VmdWwgaW5mbyAqLworI2RlZmluZSBSQl9TRVJJQUwgICAgICAgMHgxMDAwCS8qIHVzZXIgc2VyaWFsIHBvcnQgYXMgY29uc29sZSAqLworI2RlZmluZSBSQl9DRFJPTSAgICAgICAgMHgyMDAwCS8qIHVzZSBjZHJvbSBhcyByb290ICovCisjZGVmaW5lIFJCX0dEQgkJMHg4MDAwCS8qIHVzZSBHREIgcmVtb3RlIGRlYnVnZ2VyIGluc3RlYWQgb2YgRERCICovCisjZGVmaW5lIFJCX01VVEUJCTB4MTAwMDAJLyogQ29tZSB1cCB3aXRoIHRoZSBjb25zb2xlIG11dGVkICovCisjZGVmaW5lIFJCX01VTFRJUExFCTB4MjAwMDAwMDAJLyogVXNlIG11bHRpcGxlIGNvbnNvbGVzICovCisKKyNkZWZpbmUgUkJfQk9PVElORk8gICAgIDB4ODAwMDAwMDAJLyogaGF2ZSBgc3RydWN0IGJvb3RpbmZvIConIGFyZyAqLworCisvKgorICogQ29uc3RhbnRzIGZvciBjb252ZXJ0aW5nIGJvb3Qtc3R5bGUgZGV2aWNlIG51bWJlciB0byB0eXBlLAorICogYWRhcHRvciAodWJhLCBtYmEsIGV0YyksIHVuaXQgbnVtYmVyIGFuZCBwYXJ0aXRpb24gbnVtYmVyLgorICogVHlwZSAoPT0gbWFqb3IgZGV2aWNlIG51bWJlcikgaXMgaW4gdGhlIGxvdyBieXRlCisgKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gIEV4Y2VwdCBmb3IgdGhhdCBvZiB0aGUgIm1hZ2ljCisgKiBudW1iZXIiLCBlYWNoIG1hc2sgYXBwbGllcyB0byB0aGUgc2hpZnRlZCB2YWx1ZS4KKyAqIEZvcm1hdDoKKyAqICAgICAgICg0KSAoNCkgKDQpICg0KSAgKDgpICAgICAoOCkKKyAqICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgfE1BIHwgQUR8IENUfCBVTnwgUEFSVCAgfCBUWVBFIHwKKyAqICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2RlZmluZSBCX0FEQVBUT1JTSElGVCAgICAgICAgICAyNAorI2RlZmluZSBCX0NPTlRST0xMRVJTSElGVCAgICAgICAyMAorI2RlZmluZSBCX1VOSVRTSElGVCAgICAgICAgICAgICAxNgorI2RlZmluZSBCX1BBUlRJVElPTlNISUZUICAgICAgICA4CisjZGVmaW5lIEJfVFlQRVNISUZUICAgICAgICAgICAgIDAKKworI2RlZmluZSBCX0RFVk1BR0lDICAgICAgKCh1bnNpZ25lZCBsb25nKTB4YTAwMDAwMDApCisKKyNkZWZpbmUgTUFLRUJPT1RERVYodHlwZSwgYWRhcHRvciwgY29udHJvbGxlciwgdW5pdCwgcGFydGl0aW9uKSBcCisgICAgICAgICgoKHR5cGUpIDw8IEJfVFlQRVNISUZUKSB8ICgoYWRhcHRvcikgPDwgQl9BREFQVE9SU0hJRlQpIHwgXAorICAgICAgICAoKGNvbnRyb2xsZXIpIDw8IEJfQ09OVFJPTExFUlNISUZUKSB8ICgodW5pdCkgPDwgQl9VTklUU0hJRlQpIHwgXAorICAgICAgICAoKHBhcnRpdGlvbikgPDwgQl9QQVJUSVRJT05TSElGVCkgfCBCX0RFVk1BR0lDKQorCisKKy8qIE9ubHkgY2hhbmdlIHRoZSB2ZXJzaW9uIG51bWJlciBpZiB5b3UgYnJlYWsgY29tcGF0aWJpbGl0eS4gKi8KKyNkZWZpbmUgQk9PVElORk9fVkVSU0lPTiAgICAgICAgMQorCisjZGVmaW5lIE5fQklPU19HRU9NICAgICAgICAgICAgIDgKKworLyoKKyAqIEEgemVybyBib290aW5mbyBmaWVsZCBvZnRlbiBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIGluZm8gYXZhaWxhYmxlLgorICogRmxhZ3MgYXJlIHVzZWQgdG8gaW5kaWNhdGUgdGhlIHZhbGlkaXR5IG9mIGZpZWxkcyB3aGVyZSB6ZXJvIGlzIGEKKyAqIG5vcm1hbCB2YWx1ZS4KKyAqLworc3RydWN0IGJvb3RpbmZvCisgIHsKKyAgICB1bnNpZ25lZCBpbnQgYmlfdmVyc2lvbjsKKyAgICB1bnNpZ25lZCBjaGFyICpiaV9rZXJuZWxuYW1lOworICAgIHN0cnVjdCBuZnNfZGlza2xlc3MgKmJpX25mc19kaXNrbGVzczsKKyAgICAvKiBFbmQgb2YgZmllbGRzIHRoYXQgYXJlIGFsd2F5cyBwcmVzZW50LiAqLworI2RlZmluZSBiaV9lbmRjb21tb24gICAgICAgICAgICBiaV9uX2Jpb3NfdXNlZAorICAgIHVuc2lnbmVkIGludCBiaV9uX2Jpb3NfdXNlZDsKKyAgICB1bnNpZ25lZCBsb25nIGJpX2Jpb3NfZ2VvbVtOX0JJT1NfR0VPTV07CisgICAgdW5zaWduZWQgaW50IGJpX3NpemU7CisgICAgdW5zaWduZWQgY2hhciBiaV9tZW1zaXplc192YWxpZDsKKyAgICB1bnNpZ25lZCBjaGFyIGJpX2Jpb3NfZGV2OworICAgIHVuc2lnbmVkIGNoYXIgYmlfcGFkWzJdOworICAgIHVuc2lnbmVkIGxvbmcgYmlfYmFzZW1lbTsKKyAgICB1bnNpZ25lZCBsb25nIGJpX2V4dG1lbTsKKyAgICB1bnNpZ25lZCBsb25nIGJpX3N5bXRhYjsKKyAgICB1bnNpZ25lZCBsb25nIGJpX2VzeW10YWI7CisgIH07CmRpZmYgLS1naXQgYS9zdGFnZTIvZnMuaCBiL3N0YWdlMi9mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZDRmZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFnZTIvZnMuaApAQCAtMCwwICsxLDQ1NyBAQAorLyogCisgKiBNYWNoIE9wZXJhdGluZyBTeXN0ZW0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwxOTkwIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCBib3RoIHRoZSBjb3B5cmlnaHQKKyAqIG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLCBkZXJpdmF0aXZlIHdvcmtzIG9yIG1vZGlmaWVkIHZlcnNpb25zLCBhbmQgYW55IHBvcnRpb25zCisgKiB0aGVyZW9mLCBhbmQgdGhhdCBib3RoIG5vdGljZXMgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4KKyAqIAorICogQ0FSTkVHSUUgTUVMTE9OIEFMTE9XUyBGUkVFIFVTRSBPRiBUSElTIFNPRlRXQVJFIElOIElUUyAiQVMgSVMiCisgKiBDT05ESVRJT04uICBDQVJORUdJRSBNRUxMT04gRElTQ0xBSU1TIEFOWSBMSUFCSUxJVFkgT0YgQU5ZIEtJTkQgRk9SCisgKiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqIAorICogQ2FybmVnaWUgTWVsbG9uIHJlcXVlc3RzIHVzZXJzIG9mIHRoaXMgc29mdHdhcmUgdG8gcmV0dXJuIHRvCisgKiAKKyAqICBTb2Z0d2FyZSBEaXN0cmlidXRpb24gQ29vcmRpbmF0b3IgIG9yICBTb2Z0d2FyZS5EaXN0cmlidXRpb25AQ1MuQ01VLkVEVQorICogIFNjaG9vbCBvZiBDb21wdXRlciBTY2llbmNlCisgKiAgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKKyAqICBQaXR0c2J1cmdoIFBBIDE1MjEzLTM4OTAKKyAqIAorICogYW55IGltcHJvdmVtZW50cyBvciBleHRlbnNpb25zIHRoYXQgdGhleSBtYWtlIGFuZCBncmFudCBDYXJuZWdpZSBNZWxsb24KKyAqIHRoZSByaWdodHMgdG8gcmVkaXN0cmlidXRlIHRoZXNlIGNoYW5nZXMuCisgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFyZQorICogZHVwbGljYXRlZCBpbiBhbGwgc3VjaCBmb3JtcyBhbmQgdGhhdCBhbnkgZG9jdW1lbnRhdGlvbiwKKyAqIGFkdmVydGlzaW5nIG1hdGVyaWFscywgYW5kIG90aGVyIG1hdGVyaWFscyByZWxhdGVkIHRvIHN1Y2gKKyAqIGRpc3RyaWJ1dGlvbiBhbmQgdXNlIGFja25vd2xlZGdlIHRoYXQgdGhlIHNvZnR3YXJlIHdhcyBkZXZlbG9wZWQKKyAqIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5LiAgVGhlIG5hbWUgb2YgdGhlCisgKiBVbml2ZXJzaXR5IG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICoJQCgjKWZzLmgJNy43IChCZXJrZWxleSkgNS85Lzg5CisgKi8KKworLyoKKyAqIEVhY2ggZGlzayBkcml2ZSBjb250YWlucyBzb21lIG51bWJlciBvZiBmaWxlIHN5c3RlbXMuCisgKiBBIGZpbGUgc3lzdGVtIGNvbnNpc3RzIG9mIGEgbnVtYmVyIG9mIGN5bGluZGVyIGdyb3Vwcy4KKyAqIEVhY2ggY3lsaW5kZXIgZ3JvdXAgaGFzIGlub2RlcyBhbmQgZGF0YS4KKyAqCisgKiBBIGZpbGUgc3lzdGVtIGlzIGRlc2NyaWJlZCBieSBpdHMgc3VwZXItYmxvY2ssIHdoaWNoIGluIHR1cm4KKyAqIGRlc2NyaWJlcyB0aGUgY3lsaW5kZXIgZ3JvdXBzLiAgVGhlIHN1cGVyLWJsb2NrIGlzIGNyaXRpY2FsCisgKiBkYXRhIGFuZCBpcyByZXBsaWNhdGVkIGluIGVhY2ggY3lsaW5kZXIgZ3JvdXAgdG8gcHJvdGVjdCBhZ2FpbnN0CisgKiBjYXRhc3Ryb3BoaWMgbG9zcy4gIFRoaXMgaXMgZG9uZSBhdCBgbmV3ZnMnIHRpbWUgYW5kIHRoZSBjcml0aWNhbAorICogc3VwZXItYmxvY2sgZGF0YSBkb2VzIG5vdCBjaGFuZ2UsIHNvIHRoZSBjb3BpZXMgbmVlZCBub3QgYmUKKyAqIHJlZmVyZW5jZWQgZnVydGhlciB1bmxlc3MgZGlzYXN0ZXIgc3RyaWtlcy4KKyAqCisgKiBGb3IgZmlsZSBzeXN0ZW0gZnMsIHRoZSBvZmZzZXRzIG9mIHRoZSB2YXJpb3VzIGJsb2NrcyBvZiBpbnRlcmVzdAorICogYXJlIGdpdmVuIGluIHRoZSBzdXBlciBibG9jayBhczoKKyAqCVtmcy0+ZnNfc2Jsa25vXQkJU3VwZXItYmxvY2sKKyAqCVtmcy0+ZnNfY2Jsa25vXQkJQ3lsaW5kZXIgZ3JvdXAgYmxvY2sKKyAqCVtmcy0+ZnNfaWJsa25vXQkJSW5vZGUgYmxvY2tzCisgKglbZnMtPmZzX2RibGtub10JCURhdGEgYmxvY2tzCisgKiBUaGUgYmVnaW5uaW5nIG9mIGN5bGluZGVyIGdyb3VwIGNnIGluIGZzLCBpcyBnaXZlbiBieQorICogdGhlIGBgY2diYXNlKGZzLCBjZyknJyBtYWNyby4KKyAqCisgKiBUaGUgZmlyc3QgYm9vdCBhbmQgc3VwZXIgYmxvY2tzIGFyZSBnaXZlbiBpbiBhYnNvbHV0ZSBkaXNrIGFkZHJlc3Nlcy4KKyAqIFRoZSBieXRlLW9mZnNldCBmb3JtcyBhcmUgcHJlZmVycmVkLCBhcyB0aGV5IGRvbid0IGltcGx5IGEgc2VjdG9yIHNpemUuCisgKi8KKyNkZWZpbmUgQkJTSVpFCQk4MTkyCisjZGVmaW5lIFNCU0laRQkJODE5MgorI2RlZmluZQlCQk9GRgkJKChtYWNoX29mZl90KSgwKSkKKyNkZWZpbmUJU0JPRkYJCSgobWFjaF9vZmZfdCkoQkJPRkYgKyBCQlNJWkUpKQorI2RlZmluZQlCQkxPQ0sJCSgobWFjaF9kYWRkcl90KSgwKSkKKyNkZWZpbmUJU0JMT0NLCQkoKG1hY2hfZGFkZHJfdCkoQkJMT0NLICsgQkJTSVpFIC8gREVWX0JTSVpFKSkKKworLyoKKyAqIEFkZHJlc3NlcyBzdG9yZWQgaW4gaW5vZGVzIGFyZSBjYXBhYmxlIG9mIGFkZHJlc3NpbmcgZnJhZ21lbnRzCisgKiBvZiBgYmxvY2tzJy4gRmlsZSBzeXN0ZW0gYmxvY2tzIG9mIGF0IG1vc3Qgc2l6ZSBNQVhCU0laRSBjYW4gCisgKiBiZSBvcHRpb25hbGx5IGJyb2tlbiBpbnRvIDIsIDQsIG9yIDggcGllY2VzLCBlYWNoIG9mIHdoaWNoIGlzCisgKiBhZGRyZXNzaWJsZTsgdGhlc2UgcGllY2VzIG1heSBiZSBERVZfQlNJWkUsIG9yIHNvbWUgbXVsdGlwbGUgb2YKKyAqIGEgREVWX0JTSVpFIHVuaXQuCisgKgorICogTGFyZ2UgZmlsZXMgY29uc2lzdCBvZiBleGNsdXNpdmVseSBsYXJnZSBkYXRhIGJsb2Nrcy4gIFRvIGF2b2lkCisgKiB1bmR1ZSB3YXN0ZWQgZGlzayBzcGFjZSwgdGhlIGxhc3QgZGF0YSBibG9jayBvZiBhIHNtYWxsIGZpbGUgbWF5IGJlCisgKiBhbGxvY2F0ZWQgYXMgb25seSBhcyBtYW55IGZyYWdtZW50cyBvZiBhIGxhcmdlIGJsb2NrIGFzIGFyZQorICogbmVjZXNzYXJ5LiAgVGhlIGZpbGUgc3lzdGVtIGZvcm1hdCByZXRhaW5zIG9ubHkgYSBzaW5nbGUgcG9pbnRlcgorICogdG8gc3VjaCBhIGZyYWdtZW50LCB3aGljaCBpcyBhIHBpZWNlIG9mIGEgc2luZ2xlIGxhcmdlIGJsb2NrIHRoYXQKKyAqIGhhcyBiZWVuIGRpdmlkZWQuICBUaGUgc2l6ZSBvZiBzdWNoIGEgZnJhZ21lbnQgaXMgZGV0ZXJtaW5hYmxlIGZyb20KKyAqIGluZm9ybWF0aW9uIGluIHRoZSBpbm9kZSwgdXNpbmcgdGhlIGBgYmxrc2l6ZShmcywgaXAsIGxibiknJyBtYWNyby4KKyAqCisgKiBUaGUgZmlsZSBzeXN0ZW0gcmVjb3JkcyBzcGFjZSBhdmFpbGFiaWxpdHkgYXQgdGhlIGZyYWdtZW50IGxldmVsOworICogdG8gZGV0ZXJtaW5lIGJsb2NrIGF2YWlsYWJpbGl0eSwgYWxpZ25lZCBmcmFnbWVudHMgYXJlIGV4YW1pbmVkLgorICoKKyAqIFRoZSByb290IGlub2RlIGlzIHRoZSByb290IG9mIHRoZSBmaWxlIHN5c3RlbS4KKyAqIElub2RlIDAgY2FuJ3QgYmUgdXNlZCBmb3Igbm9ybWFsIHB1cnBvc2VzIGFuZAorICogaGlzdG9yaWNhbGx5IGJhZCBibG9ja3Mgd2VyZSBsaW5rZWQgdG8gaW5vZGUgMSwKKyAqIHRodXMgdGhlIHJvb3QgaW5vZGUgaXMgMi4gKGlub2RlIDEgaXMgbm8gbG9uZ2VyIHVzZWQgZm9yCisgKiB0aGlzIHB1cnBvc2UsIGhvd2V2ZXIgbnVtZXJvdXMgZHVtcCB0YXBlcyBtYWtlIHRoaXMKKyAqIGFzc3VtcHRpb24sIHNvIHdlIGFyZSBzdHVjayB3aXRoIGl0KQorICovCisjZGVmaW5lCVJPT1RJTk8JCSgobWFjaF9pbm9fdCkyKQkvKiBpIG51bWJlciBvZiBhbGwgcm9vdHMgKi8KKworLyoKKyAqIE1JTkJTSVpFIGlzIHRoZSBzbWFsbGVzdCBhbGxvd2FibGUgYmxvY2sgc2l6ZS4KKyAqIEluIG9yZGVyIHRvIGluc3VyZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGNyZWF0ZSBmaWxlcyBvZiBzaXplCisgKiAyXjMyIHdpdGggb25seSB0d28gbGV2ZWxzIG9mIGluZGlyZWN0aW9uLCBNSU5CU0laRSBpcyBzZXQgdG8gNDA5Ni4KKyAqIE1JTkJTSVpFIG11c3QgYmUgYmlnIGVub3VnaCB0byBob2xkIGEgY3lsaW5kZXIgZ3JvdXAgYmxvY2ssCisgKiB0aHVzIGNoYW5nZXMgdG8gKHN0cnVjdCBjZykgbXVzdCBrZWVwIGl0cyBzaXplIHdpdGhpbiBNSU5CU0laRS4KKyAqIE5vdGUgdGhhdCBzdXBlciBibG9ja3MgYXJlIGFsd2F5cyBvZiBzaXplIFNCU0laRSwKKyAqIGFuZCB0aGF0IGJvdGggU0JTSVpFIGFuZCBNQVhCU0laRSBtdXN0IGJlID49IE1JTkJTSVpFLgorICovCisjZGVmaW5lIE1JTkJTSVpFCTQwOTYKKworLyoKKyAqIFRoZSBwYXRoIG5hbWUgb24gd2hpY2ggdGhlIGZpbGUgc3lzdGVtIGlzIG1vdW50ZWQgaXMgbWFpbnRhaW5lZAorICogaW4gZnNfZnNtbnQuIE1BWE1OVExFTiBkZWZpbmVzIHRoZSBhbW91bnQgb2Ygc3BhY2UgYWxsb2NhdGVkIGluIAorICogdGhlIHN1cGVyIGJsb2NrIGZvciB0aGlzIG5hbWUuCisgKiBUaGUgbGltaXQgb24gdGhlIGFtb3VudCBvZiBzdW1tYXJ5IGluZm9ybWF0aW9uIHBlciBmaWxlIHN5c3RlbQorICogaXMgZGVmaW5lZCBieSBNQVhDU0JVRlMuIEl0IGlzIGN1cnJlbnRseSBwYXJhbWV0ZXJpemVkIGZvciBhCisgKiBtYXhpbXVtIG9mIHR3byBtaWxsaW9uIGN5bGluZGVycy4KKyAqLworI2RlZmluZSBNQVhNTlRMRU4gNTEyCisjZGVmaW5lIE1BWENTQlVGUyAzMgorCisvKgorICogUGVyIGN5bGluZGVyIGdyb3VwIGluZm9ybWF0aW9uOyBzdW1tYXJpemVkIGluIGJsb2NrcyBhbGxvY2F0ZWQKKyAqIGZyb20gZmlyc3QgY3lsaW5kZXIgZ3JvdXAgZGF0YSBibG9ja3MuICBUaGVzZSBibG9ja3MgaGF2ZSB0byBiZQorICogcmVhZCBpbiBmcm9tIGZzX2NzYWRkciAoc2l6ZSBmc19jc3NpemUpIGluIGFkZGl0aW9uIHRvIHRoZQorICogc3VwZXIgYmxvY2suCisgKgorICogTi5CLiBzaXplb2Yoc3RydWN0IGNzdW0pIG11c3QgYmUgYSBwb3dlciBvZiB0d28gaW4gb3JkZXIgZm9yCisgKiB0aGUgYGBmc19jcycnIG1hY3JvIHRvIHdvcmsgKHNlZSBiZWxvdykuCisgKi8KK3N0cnVjdCBjc3VtCisgIHsKKyAgICBpbnQgY3NfbmRpcjsJCS8qIG51bWJlciBvZiBkaXJlY3RvcmllcyAqLworICAgIGludCBjc19uYmZyZWU7CQkvKiBudW1iZXIgb2YgZnJlZSBibG9ja3MgKi8KKyAgICBpbnQgY3NfbmlmcmVlOwkJLyogbnVtYmVyIG9mIGZyZWUgaW5vZGVzICovCisgICAgaW50IGNzX25mZnJlZTsJCS8qIG51bWJlciBvZiBmcmVlIGZyYWdzICovCisgIH07CisKKy8qCisgKiBTdXBlciBibG9jayBmb3IgYSBmaWxlIHN5c3RlbS4KKyAqLworI2RlZmluZQlGU19NQUdJQwkweDAxMTk1NAorc3RydWN0IGZzCisgIHsKKyAgICBpbnQgeHh4MTsJCQkvKiBzdHJ1Y3QgICAgICAgZnMgKmZzX2xpbms7ICovCisgICAgaW50IHh4eDI7CQkJLyogc3RydWN0ICAgICAgIGZzICpmc19ybGluazsgKi8KKyAgICBtYWNoX2RhZGRyX3QgZnNfc2Jsa25vOwkvKiBhZGRyIG9mIHN1cGVyLWJsb2NrIGluIGZpbGVzeXMgKi8KKyAgICBtYWNoX2RhZGRyX3QgZnNfY2Jsa25vOwkvKiBvZmZzZXQgb2YgY3lsLWJsb2NrIGluIGZpbGVzeXMgKi8KKyAgICBtYWNoX2RhZGRyX3QgZnNfaWJsa25vOwkvKiBvZmZzZXQgb2YgaW5vZGUtYmxvY2tzIGluIGZpbGVzeXMgKi8KKyAgICBtYWNoX2RhZGRyX3QgZnNfZGJsa25vOwkvKiBvZmZzZXQgb2YgZmlyc3QgZGF0YSBhZnRlciBjZyAqLworICAgIGludCBmc19jZ29mZnNldDsJCS8qIGN5bGluZGVyIGdyb3VwIG9mZnNldCBpbiBjeWxpbmRlciAqLworICAgIGludCBmc19jZ21hc2s7CQkvKiB1c2VkIHRvIGNhbGMgbW9kIGZzX250cmFrICovCisgICAgbWFjaF90aW1lX3QgZnNfdGltZTsJLyogbGFzdCB0aW1lIHdyaXR0ZW4gKi8KKyAgICBpbnQgZnNfc2l6ZTsJCS8qIG51bWJlciBvZiBibG9ja3MgaW4gZnMgKi8KKyAgICBpbnQgZnNfZHNpemU7CQkvKiBudW1iZXIgb2YgZGF0YSBibG9ja3MgaW4gZnMgKi8KKyAgICBpbnQgZnNfbmNnOwkJCS8qIG51bWJlciBvZiBjeWxpbmRlciBncm91cHMgKi8KKyAgICBpbnQgZnNfYnNpemU7CQkvKiBzaXplIG9mIGJhc2ljIGJsb2NrcyBpbiBmcyAqLworICAgIGludCBmc19mc2l6ZTsJCS8qIHNpemUgb2YgZnJhZyBibG9ja3MgaW4gZnMgKi8KKyAgICBpbnQgZnNfZnJhZzsJCS8qIG51bWJlciBvZiBmcmFncyBpbiBhIGJsb2NrIGluIGZzICovCisvKiB0aGVzZSBhcmUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCisgICAgaW50IGZzX21pbmZyZWU7CQkvKiBtaW5pbXVtIHBlcmNlbnRhZ2Ugb2YgZnJlZSBibG9ja3MgKi8KKyAgICBpbnQgZnNfcm90ZGVsYXk7CQkvKiBudW0gb2YgbXMgZm9yIG9wdGltYWwgbmV4dCBibG9jayAqLworICAgIGludCBmc19ycHM7CQkJLyogZGlzayByZXZvbHV0aW9ucyBwZXIgc2Vjb25kICovCisvKiB0aGVzZSBmaWVsZHMgY2FuIGJlIGNvbXB1dGVkIGZyb20gdGhlIG90aGVycyAqLworICAgIGludCBmc19ibWFzazsJCS8qIGBgYmxrb2ZmJycgY2FsYyBvZiBibGsgb2Zmc2V0cyAqLworICAgIGludCBmc19mbWFzazsJCS8qIGBgZnJhZ29mZicnIGNhbGMgb2YgZnJhZyBvZmZzZXRzICovCisgICAgaW50IGZzX2JzaGlmdDsJCS8qIGBgbGJsa25vJycgY2FsYyBvZiBsb2dpY2FsIGJsa25vICovCisgICAgaW50IGZzX2ZzaGlmdDsJCS8qIGBgbnVtZnJhZ3MnJyBjYWxjIG51bWJlciBvZiBmcmFncyAqLworLyogdGhlc2UgYXJlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLworICAgIGludCBmc19tYXhjb250aWc7CQkvKiBtYXggbnVtYmVyIG9mIGNvbnRpZ3VvdXMgYmxrcyAqLworICAgIGludCBmc19tYXhicGc7CQkvKiBtYXggbnVtYmVyIG9mIGJsa3MgcGVyIGN5bCBncm91cCAqLworLyogdGhlc2UgZmllbGRzIGNhbiBiZSBjb21wdXRlZCBmcm9tIHRoZSBvdGhlcnMgKi8KKyAgICBpbnQgZnNfZnJhZ3NoaWZ0OwkJLyogYmxvY2sgdG8gZnJhZyBzaGlmdCAqLworICAgIGludCBmc19mc2J0b2RiOwkJLyogZnNidG9kYiBhbmQgZGJ0b2ZzYiBzaGlmdCBjb25zdGFudCAqLworICAgIGludCBmc19zYnNpemU7CQkvKiBhY3R1YWwgc2l6ZSBvZiBzdXBlciBibG9jayAqLworICAgIGludCBmc19jc21hc2s7CQkvKiBjc3VtIGJsb2NrIG9mZnNldCAqLworICAgIGludCBmc19jc3NoaWZ0OwkJLyogY3N1bSBibG9jayBudW1iZXIgKi8KKyAgICBpbnQgZnNfbmluZGlyOwkJLyogdmFsdWUgb2YgTklORElSICovCisgICAgaW50IGZzX2lub3BiOwkJLyogdmFsdWUgb2YgSU5PUEIgKi8KKyAgICBpbnQgZnNfbnNwZjsJCS8qIHZhbHVlIG9mIE5TUEYgKi8KKy8qIHlldCBhbm90aGVyIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICovCisgICAgaW50IGZzX29wdGltOwkJLyogb3B0aW1pemF0aW9uIHByZWZlcmVuY2UsIHNlZSBiZWxvdyAqLworLyogdGhlc2UgZmllbGRzIGFyZSBkZXJpdmVkIGZyb20gdGhlIGhhcmR3YXJlICovCisgICAgaW50IGZzX25wc2VjdDsJCS8qICMgc2VjdG9ycy90cmFjayBpbmNsdWRpbmcgc3BhcmVzICovCisgICAgaW50IGZzX2ludGVybGVhdmU7CQkvKiBoYXJkd2FyZSBzZWN0b3IgaW50ZXJsZWF2ZSAqLworICAgIGludCBmc190cmFja3NrZXc7CQkvKiBzZWN0b3IgMCBza2V3LCBwZXIgdHJhY2sgKi8KKyAgICBpbnQgZnNfaGVhZHN3aXRjaDsJCS8qIGhlYWQgc3dpdGNoIHRpbWUsIHVzZWMgKi8KKyAgICBpbnQgZnNfdHJrc2VlazsJCS8qIHRyYWNrLXRvLXRyYWNrIHNlZWssIHVzZWMgKi8KKy8qIHNpemVzIGRldGVybWluZWQgYnkgbnVtYmVyIG9mIGN5bGluZGVyIGdyb3VwcyBhbmQgdGhlaXIgc2l6ZXMgKi8KKyAgICBtYWNoX2RhZGRyX3QgZnNfY3NhZGRyOwkvKiBibGsgYWRkciBvZiBjeWwgZ3JwIHN1bW1hcnkgYXJlYSAqLworICAgIGludCBmc19jc3NpemU7CQkvKiBzaXplIG9mIGN5bCBncnAgc3VtbWFyeSBhcmVhICovCisgICAgaW50IGZzX2Nnc2l6ZTsJCS8qIGN5bGluZGVyIGdyb3VwIHNpemUgKi8KKy8qIHRoZXNlIGZpZWxkcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBoYXJkd2FyZSAqLworICAgIGludCBmc19udHJhazsJCS8qIHRyYWNrcyBwZXIgY3lsaW5kZXIgKi8KKyAgICBpbnQgZnNfbnNlY3Q7CQkvKiBzZWN0b3JzIHBlciB0cmFjayAqLworICAgIGludCBmc19zcGM7CQkJLyogc2VjdG9ycyBwZXIgY3lsaW5kZXIgKi8KKy8qIHRoaXMgY29tZXMgZnJvbSB0aGUgZGlzayBkcml2ZXIgcGFydGl0aW9uaW5nICovCisgICAgaW50IGZzX25jeWw7CQkvKiBjeWxpbmRlcnMgaW4gZmlsZSBzeXN0ZW0gKi8KKy8qIHRoZXNlIGZpZWxkcyBjYW4gYmUgY29tcHV0ZWQgZnJvbSB0aGUgb3RoZXJzICovCisgICAgaW50IGZzX2NwZzsJCQkvKiBjeWxpbmRlcnMgcGVyIGdyb3VwICovCisgICAgaW50IGZzX2lwZzsJCQkvKiBpbm9kZXMgcGVyIGdyb3VwICovCisgICAgaW50IGZzX2ZwZzsJCQkvKiBibG9ja3MgcGVyIGdyb3VwICogZnNfZnJhZyAqLworLyogdGhpcyBkYXRhIG11c3QgYmUgcmUtY29tcHV0ZWQgYWZ0ZXIgY3Jhc2hlcyAqLworICAgIHN0cnVjdCBjc3VtIGZzX2NzdG90YWw7CS8qIGN5bGluZGVyIHN1bW1hcnkgaW5mb3JtYXRpb24gKi8KKy8qIHRoZXNlIGZpZWxkcyBhcmUgY2xlYXJlZCBhdCBtb3VudCB0aW1lICovCisgICAgY2hhciBmc19mbW9kOwkJLyogc3VwZXIgYmxvY2sgbW9kaWZpZWQgZmxhZyAqLworICAgIGNoYXIgZnNfY2xlYW47CQkvKiBmaWxlIHN5c3RlbSBpcyBjbGVhbiBmbGFnICovCisgICAgY2hhciBmc19yb25seTsJCS8qIG1vdW50ZWQgcmVhZC1vbmx5IGZsYWcgKi8KKyAgICBjaGFyIGZzX2ZsYWdzOwkJLyogY3VycmVudGx5IHVudXNlZCBmbGFnICovCisgICAgY2hhciBmc19mc21udFtNQVhNTlRMRU5dOwkvKiBuYW1lIG1vdW50ZWQgb24gKi8KKy8qIHRoZXNlIGZpZWxkcyByZXRhaW4gdGhlIGN1cnJlbnQgYmxvY2sgYWxsb2NhdGlvbiBpbmZvICovCisgICAgaW50IGZzX2Nncm90b3I7CQkvKiBsYXN0IGNnIHNlYXJjaGVkICovCisjaWYgMQorICAgIGludCB3YXNfZnNfY3NwW01BWENTQlVGU107CisjZWxzZQorICAgIHN0cnVjdCBjc3VtICpmc19jc3BbTUFYQ1NCVUZTXTsJLyogbGlzdCBvZiBmc19jcyBpbmZvIGJ1ZmZlcnMgKi8KKyNlbmRpZgorICAgIGludCBmc19jcGM7CQkJLyogY3lsIHBlciBjeWNsZSBpbiBwb3N0YmwgKi8KKyAgICBzaG9ydCBmc19vcG9zdGJsWzE2XVs4XTsJLyogb2xkIHJvdGF0aW9uIGJsb2NrIGxpc3QgaGVhZCAqLworICAgIGxvbmcgZnNfc3BhcmVjb25bNTBdOwkvKiByZXNlcnZlZCBmb3IgZnV0dXJlIGNvbnN0YW50cyAqLworICAgIGxvbmcgZnNfY29udGlnc3Vtc2l6ZTsJLyogc2l6ZSBvZiBjbHVzdGVyIHN1bW1hcnkgYXJyYXkgKi8KKyAgICBsb25nIGZzX21heHN5bWxpbmtsZW47CS8qIG1heCBsZW5ndGggb2YgYW4gaW50ZXJuYWwgc3ltbGluayAqLworICAgIGxvbmcgZnNfaW5vZGVmbXQ7CQkvKiBmb3JtYXQgb2Ygb24tZGlzayBpbm9kZXMgKi8KKyAgICBxdWFkIGZzX21heGZpbGVzaXplOwkvKiBtYXhpbXVtIHJlcHJlc2VudGFibGUgZmlsZSBzaXplICovCisgICAgcXVhZCBmc19xYm1hc2s7CQkvKiB+ZnNfYm1hc2sgLSBmb3IgdXNlIHdpdGggcXVhZCBzaXplICovCisgICAgcXVhZCBmc19xZm1hc2s7CQkvKiB+ZnNfZm1hc2sgLSBmb3IgdXNlIHdpdGggcXVhZCBzaXplICovCisgICAgbG9uZyBmc19zdGF0ZTsJCS8qIHZhbGlkYXRlIGZzX2NsZWFuIGZpZWxkICovCisgICAgaW50IGZzX3Bvc3RibGZvcm1hdDsJLyogZm9ybWF0IG9mIHBvc2l0aW9uYWwgbGF5b3V0IHRhYmxlcyAqLworICAgIGludCBmc19ucnBvczsJCS8qIG51bWJlciBvZiByb3RhaW9uYWwgcG9zaXRpb25zICovCisgICAgaW50IGZzX3Bvc3RibG9mZjsJCS8qIChzaG9ydCkgcm90YXRpb24gYmxvY2sgbGlzdCBoZWFkICovCisgICAgaW50IGZzX3JvdGJsb2ZmOwkJLyogKHVfY2hhcikgYmxvY2tzIGZvciBlYWNoIHJvdGF0aW9uICovCisgICAgaW50IGZzX21hZ2ljOwkJLyogbWFnaWMgbnVtYmVyICovCisgICAgdV9jaGFyIGZzX3NwYWNlWzFdOwkJLyogbGlzdCBvZiBibG9ja3MgZm9yIGVhY2ggcm90YXRpb24gKi8KKy8qIGFjdHVhbGx5IGxvbmdlciAqLworICB9OworLyoKKyAqIFByZWZlcmVuY2UgZm9yIG9wdGltaXphdGlvbi4KKyAqLworI2RlZmluZSBGU19PUFRUSU1FCTAJLyogbWluaW1pemUgYWxsb2NhdGlvbiB0aW1lICovCisjZGVmaW5lIEZTX09QVFNQQUNFCTEJLyogbWluaW1pemUgZGlzayBmcmFnbWVudGF0aW9uICovCisKKy8qCisgKiBSb3RhdGlvbmFsIGxheW91dCB0YWJsZSBmb3JtYXQgdHlwZXMKKyAqLworI2RlZmluZSBGU180MlBPU1RCTEZNVAkJLTEJLyogNC4yQlNEIHJvdGF0aW9uYWwgdGFibGUgZm9ybWF0ICovCisjZGVmaW5lIEZTX0RZTkFNSUNQT1NUQkxGTVQJMQkvKiBkeW5hbWljIHJvdGF0aW9uYWwgdGFibGUgZm9ybWF0ICovCisvKgorICogTWFjcm9zIGZvciBhY2Nlc3MgdG8gc3VwZXJibG9jayBhcnJheSBzdHJ1Y3R1cmVzCisgKi8KKyNkZWZpbmUgZnNfcG9zdGJsKGZzLCBjeWxubykgXAorICAgICgoKGZzKS0+ZnNfcG9zdGJsZm9ybWF0ID09IEZTXzQyUE9TVEJMRk1UKSBcCisgICAgPyAoKGZzKS0+ZnNfb3Bvc3RibFtjeWxub10pIFwKKyAgICA6ICgoc2hvcnQgKikoKGNoYXIgKikoZnMpICsgKGZzKS0+ZnNfcG9zdGJsb2ZmKSArIChjeWxubykgKiAoZnMpLT5mc19ucnBvcykpCisjZGVmaW5lIGZzX3JvdGJsKGZzKSBcCisgICAgKCgoZnMpLT5mc19wb3N0Ymxmb3JtYXQgPT0gRlNfNDJQT1NUQkxGTVQpIFwKKyAgICA/ICgoZnMpLT5mc19zcGFjZSkgXAorICAgIDogKCh1X2NoYXIgKikoKGNoYXIgKikoZnMpICsgKGZzKS0+ZnNfcm90YmxvZmYpKSkKKworLyoKKyAqIENvbnZlcnQgY3lsaW5kZXIgZ3JvdXAgdG8gYmFzZSBhZGRyZXNzIG9mIGl0cyBnbG9iYWwgc3VtbWFyeSBpbmZvLgorICoKKyAqIE4uQi4gVGhpcyBtYWNybyBhc3N1bWVzIHRoYXQgc2l6ZW9mKHN0cnVjdCBjc3VtKSBpcyBhIHBvd2VyIG9mIHR3by4KKyAqLworI2RlZmluZSBmc19jcyhmcywgaW5keCkgXAorCWZzX2NzcFsoaW5keCkgPj4gKGZzKS0+ZnNfY3NzaGlmdF1bKGluZHgpICYgfihmcyktPmZzX2NzbWFza10KKworLyoKKyAqIEN5bGluZGVyIGdyb3VwIGJsb2NrIGZvciBhIGZpbGUgc3lzdGVtLgorICovCisjZGVmaW5lCUNHX01BR0lDCTB4MDkwMjU1CitzdHJ1Y3QgY2cKKyAgeworICAgIGludCB4eHgxOwkJCS8qIHN0cnVjdCAgICAgICBjZyAqY2dfbGluazsgKi8KKyAgICBpbnQgY2dfbWFnaWM7CQkvKiBtYWdpYyBudW1iZXIgKi8KKyAgICBtYWNoX3RpbWVfdCBjZ190aW1lOwkJLyogdGltZSBsYXN0IHdyaXR0ZW4gKi8KKyAgICBpbnQgY2dfY2d4OwkJCS8qIHdlIGFyZSB0aGUgY2d4J3RoIGN5bGluZGVyIGdyb3VwICovCisgICAgc2hvcnQgY2dfbmN5bDsJCS8qIG51bWJlciBvZiBjeWwncyB0aGlzIGNnICovCisgICAgc2hvcnQgY2dfbmlibGs7CQkvKiBudW1iZXIgb2YgaW5vZGUgYmxvY2tzIHRoaXMgY2cgKi8KKyAgICBpbnQgY2dfbmRibGs7CQkvKiBudW1iZXIgb2YgZGF0YSBibG9ja3MgdGhpcyBjZyAqLworICAgIHN0cnVjdCBjc3VtIGNnX2NzOwkJLyogY3lsaW5kZXIgc3VtbWFyeSBpbmZvcm1hdGlvbiAqLworICAgIGludCBjZ19yb3RvcjsJCS8qIHBvc2l0aW9uIG9mIGxhc3QgdXNlZCBibG9jayAqLworICAgIGludCBjZ19mcm90b3I7CQkvKiBwb3NpdGlvbiBvZiBsYXN0IHVzZWQgZnJhZyAqLworICAgIGludCBjZ19pcm90b3I7CQkvKiBwb3NpdGlvbiBvZiBsYXN0IHVzZWQgaW5vZGUgKi8KKyAgICBpbnQgY2dfZnJzdW1bTUFYRlJBR107CS8qIGNvdW50cyBvZiBhdmFpbGFibGUgZnJhZ3MgKi8KKyAgICBpbnQgY2dfYnRvdG9mZjsJCS8qIChsb25nKSBibG9jayB0b3RhbHMgcGVyIGN5bGluZGVyICovCisgICAgaW50IGNnX2JvZmY7CQkvKiAoc2hvcnQpIGZyZWUgYmxvY2sgcG9zaXRpb25zICovCisgICAgaW50IGNnX2l1c2Vkb2ZmOwkJLyogKGNoYXIpIHVzZWQgaW5vZGUgbWFwICovCisgICAgaW50IGNnX2ZyZWVvZmY7CQkvKiAodV9jaGFyKSBmcmVlIGJsb2NrIG1hcCAqLworICAgIGludCBjZ19uZXh0ZnJlZW9mZjsJCS8qICh1X2NoYXIpIG5leHQgYXZhaWxhYmxlIHNwYWNlICovCisgICAgaW50IGNnX3NwYXJlY29uWzE2XTsJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KKyAgICB1X2NoYXIgY2dfc3BhY2VbMV07CQkvKiBzcGFjZSBmb3IgY3lsaW5kZXIgZ3JvdXAgbWFwcyAqLworLyogYWN0dWFsbHkgbG9uZ2VyICovCisgIH07CisvKgorICogTWFjcm9zIGZvciBhY2Nlc3MgdG8gY3lsaW5kZXIgZ3JvdXAgYXJyYXkgc3RydWN0dXJlcworICovCisjZGVmaW5lIGNnX2Jsa3RvdChjZ3ApIFwKKyAgICAoKChjZ3ApLT5jZ19tYWdpYyAhPSBDR19NQUdJQykgXAorICAgID8gKCgoc3RydWN0IG9jZyAqKShjZ3ApKS0+Y2dfYnRvdCkgXAorICAgIDogKChpbnQgKikoKGNoYXIgKikoY2dwKSArIChjZ3ApLT5jZ19idG90b2ZmKSkpCisjZGVmaW5lIGNnX2Jsa3MoZnMsIGNncCwgY3lsbm8pIFwKKyAgICAoKChjZ3ApLT5jZ19tYWdpYyAhPSBDR19NQUdJQykgXAorICAgID8gKCgoc3RydWN0IG9jZyAqKShjZ3ApKS0+Y2dfYltjeWxub10pIFwKKyAgICA6ICgoc2hvcnQgKikoKGNoYXIgKikoY2dwKSArIChjZ3ApLT5jZ19ib2ZmKSArIChjeWxubykgKiAoZnMpLT5mc19ucnBvcykpCisjZGVmaW5lIGNnX2lub3N1c2VkKGNncCkgXAorICAgICgoKGNncCktPmNnX21hZ2ljICE9IENHX01BR0lDKSBcCisgICAgPyAoKChzdHJ1Y3Qgb2NnICopKGNncCkpLT5jZ19pdXNlZCkgXAorICAgIDogKChjaGFyICopKChjaGFyICopKGNncCkgKyAoY2dwKS0+Y2dfaXVzZWRvZmYpKSkKKyNkZWZpbmUgY2dfYmxrc2ZyZWUoY2dwKSBcCisgICAgKCgoY2dwKS0+Y2dfbWFnaWMgIT0gQ0dfTUFHSUMpIFwKKyAgICA/ICgoKHN0cnVjdCBvY2cgKikoY2dwKSktPmNnX2ZyZWUpIFwKKyAgICA6ICgodV9jaGFyICopKChjaGFyICopKGNncCkgKyAoY2dwKS0+Y2dfZnJlZW9mZikpKQorI2RlZmluZSBjZ19jaGttYWdpYyhjZ3ApIFwKKyAgICAoKGNncCktPmNnX21hZ2ljID09IENHX01BR0lDIHx8ICgoc3RydWN0IG9jZyAqKShjZ3ApKS0+Y2dfbWFnaWMgPT0gQ0dfTUFHSUMpCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyBkZWZpbmVkCisgKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBmaWxlIHN5c3RlbXMuCisgKi8KK3N0cnVjdCBvY2cKKyAgeworICAgIGludCB4eHgxOwkJCS8qIHN0cnVjdCAgICAgICBvY2cgKmNnX2xpbms7ICovCisgICAgaW50IHh4eDI7CQkJLyogc3RydWN0ICAgICAgIG9jZyAqY2dfcmxpbms7ICovCisgICAgbWFjaF90aW1lX3QgY2dfdGltZTsJLyogdGltZSBsYXN0IHdyaXR0ZW4gKi8KKyAgICBpbnQgY2dfY2d4OwkJCS8qIHdlIGFyZSB0aGUgY2d4J3RoIGN5bGluZGVyIGdyb3VwICovCisgICAgc2hvcnQgY2dfbmN5bDsJCS8qIG51bWJlciBvZiBjeWwncyB0aGlzIGNnICovCisgICAgc2hvcnQgY2dfbmlibGs7CQkvKiBudW1iZXIgb2YgaW5vZGUgYmxvY2tzIHRoaXMgY2cgKi8KKyAgICBpbnQgY2dfbmRibGs7CQkvKiBudW1iZXIgb2YgZGF0YSBibG9ja3MgdGhpcyBjZyAqLworICAgIHN0cnVjdCBjc3VtIGNnX2NzOwkJLyogY3lsaW5kZXIgc3VtbWFyeSBpbmZvcm1hdGlvbiAqLworICAgIGludCBjZ19yb3RvcjsJCS8qIHBvc2l0aW9uIG9mIGxhc3QgdXNlZCBibG9jayAqLworICAgIGludCBjZ19mcm90b3I7CQkvKiBwb3NpdGlvbiBvZiBsYXN0IHVzZWQgZnJhZyAqLworICAgIGludCBjZ19pcm90b3I7CQkvKiBwb3NpdGlvbiBvZiBsYXN0IHVzZWQgaW5vZGUgKi8KKyAgICBpbnQgY2dfZnJzdW1bOF07CQkvKiBjb3VudHMgb2YgYXZhaWxhYmxlIGZyYWdzICovCisgICAgaW50IGNnX2J0b3RbMzJdOwkJLyogYmxvY2sgdG90YWxzIHBlciBjeWxpbmRlciAqLworICAgIHNob3J0IGNnX2JbMzJdWzhdOwkJLyogcG9zaXRpb25zIG9mIGZyZWUgYmxvY2tzICovCisgICAgY2hhciBjZ19pdXNlZFsyNTZdOwkJLyogdXNlZCBpbm9kZSBtYXAgKi8KKyAgICBpbnQgY2dfbWFnaWM7CQkvKiBtYWdpYyBudW1iZXIgKi8KKyAgICB1X2NoYXIgY2dfZnJlZVsxXTsJCS8qIGZyZWUgYmxvY2sgbWFwICovCisvKiBhY3R1YWxseSBsb25nZXIgKi8KKyAgfTsKKworLyoKKyAqIFR1cm4gZmlsZSBzeXN0ZW0gYmxvY2sgbnVtYmVycyBpbnRvIGRpc2sgYmxvY2sgYWRkcmVzc2VzLgorICogVGhpcyBtYXBzIGZpbGUgc3lzdGVtIGJsb2NrcyB0byBkZXZpY2Ugc2l6ZSBibG9ja3MuCisgKi8KKyNkZWZpbmUgZnNidG9kYihmcywgYikJKChiKSA8PCAoZnMpLT5mc19mc2J0b2RiKQorI2RlZmluZQlkYnRvZnNiKGZzLCBiKQkoKGIpID4+IChmcyktPmZzX2ZzYnRvZGIpCisKKy8qCisgKiBDeWxpbmRlciBncm91cCBtYWNyb3MgdG8gbG9jYXRlIHRoaW5ncyBpbiBjeWxpbmRlciBncm91cHMuCisgKiBUaGV5IGNhbGMgZmlsZSBzeXN0ZW0gYWRkcmVzc2VzIG9mIGN5bGluZGVyIGdyb3VwIGRhdGEgc3RydWN0dXJlcy4KKyAqLworI2RlZmluZQljZ2Jhc2UoZnMsIGMpCSgobWFjaF9kYWRkcl90KSgoZnMpLT5mc19mcGcgKiAoYykpKQorI2RlZmluZSBjZ3N0YXJ0KGZzLCBjKSBcCisJKGNnYmFzZShmcywgYykgKyAoZnMpLT5mc19jZ29mZnNldCAqICgoYykgJiB+KChmcyktPmZzX2NnbWFzaykpKQorI2RlZmluZQljZ3NibG9jayhmcywgYykJKGNnc3RhcnQoZnMsIGMpICsgKGZzKS0+ZnNfc2Jsa25vKQkvKiBzdXBlciBibGsgKi8KKyNkZWZpbmUJY2d0b2QoZnMsIGMpCShjZ3N0YXJ0KGZzLCBjKSArIChmcyktPmZzX2NibGtubykJLyogY2cgYmxvY2sgKi8KKyNkZWZpbmUJY2dpbWluKGZzLCBjKQkoY2dzdGFydChmcywgYykgKyAoZnMpLT5mc19pYmxrbm8pCS8qIGlub2RlIGJsayAqLworI2RlZmluZQljZ2RtaW4oZnMsIGMpCShjZ3N0YXJ0KGZzLCBjKSArIChmcyktPmZzX2RibGtubykJLyogMXN0IGRhdGEgKi8KKworLyoKKyAqIE1hY3JvcyBmb3IgaGFuZGxpbmcgaW5vZGUgbnVtYmVyczoKKyAqICAgICBpbm9kZSBudW1iZXIgdG8gZmlsZSBzeXN0ZW0gYmxvY2sgb2Zmc2V0LgorICogICAgIGlub2RlIG51bWJlciB0byBjeWxpbmRlciBncm91cCBudW1iZXIuCisgKiAgICAgaW5vZGUgbnVtYmVyIHRvIGZpbGUgc3lzdGVtIGJsb2NrIGFkZHJlc3MuCisgKi8KKyNkZWZpbmUJaXRvbyhmcywgeCkJKCh4KSAlIElOT1BCKGZzKSkKKyNkZWZpbmUJaXRvZyhmcywgeCkJKCh4KSAvIChmcyktPmZzX2lwZykKKyNkZWZpbmUJaXRvZChmcywgeCkgXAorCSgobWFjaF9kYWRkcl90KShjZ2ltaW4oZnMsIGl0b2coZnMsIHgpKSArIFwKKwkoYmxrc3RvZnJhZ3MoKGZzKSwgKCgoeCkgJSAoZnMpLT5mc19pcGcpIC8gSU5PUEIoZnMpKSkpKSkKKworLyoKKyAqIEdpdmUgY3lsaW5kZXIgZ3JvdXAgbnVtYmVyIGZvciBhIGZpbGUgc3lzdGVtIGJsb2NrLgorICogR2l2ZSBjeWxpbmRlciBncm91cCBibG9jayBudW1iZXIgZm9yIGEgZmlsZSBzeXN0ZW0gYmxvY2suCisgKi8KKyNkZWZpbmUJZHRvZyhmcywgZCkJKChkKSAvIChmcyktPmZzX2ZwZykKKyNkZWZpbmUJZHRvZ2QoZnMsIGQpCSgoZCkgJSAoZnMpLT5mc19mcGcpCisKKy8qCisgKiBFeHRyYWN0IHRoZSBiaXRzIGZvciBhIGJsb2NrIGZyb20gYSBtYXAuCisgKiBDb21wdXRlIHRoZSBjeWxpbmRlciBhbmQgcm90YXRpb25hbCBwb3NpdGlvbiBvZiBhIGN5bCBibG9jayBhZGRyLgorICovCisjZGVmaW5lIGJsa21hcChmcywgbWFwLCBsb2MpIFwKKyAgICAoKChtYXApWyhsb2MpIC8gTkJCWV0gPj4gKChsb2MpICUgTkJCWSkpICYgKDB4ZmYgPj4gKE5CQlkgLSAoZnMpLT5mc19mcmFnKSkpCisjZGVmaW5lIGNidG9jeWxubyhmcywgYm5vKSBcCisgICAgKChibm8pICogTlNQRihmcykgLyAoZnMpLT5mc19zcGMpCisjZGVmaW5lIGNidG9ycG9zKGZzLCBibm8pIFwKKyAgICAoKChibm8pICogTlNQRihmcykgJSAoZnMpLT5mc19zcGMgLyAoZnMpLT5mc19uc2VjdCAqIChmcyktPmZzX3RyYWNrc2tldyArIFwKKyAgICAgKGJubykgKiBOU1BGKGZzKSAlIChmcyktPmZzX3NwYyAlIChmcyktPmZzX25zZWN0ICogKGZzKS0+ZnNfaW50ZXJsZWF2ZSkgJSBcCisgICAgIChmcyktPmZzX25zZWN0ICogKGZzKS0+ZnNfbnJwb3MgLyAoZnMpLT5mc19ucHNlY3QpCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIG1hY3JvcyBvcHRpbWl6ZSBjZXJ0YWluIGZyZXF1ZW50bHkgY2FsY3VsYXRlZAorICogcXVhbnRpdGllcyBieSB1c2luZyBzaGlmdHMgYW5kIG1hc2tzIGluIHBsYWNlIG9mIGRpdmlzaW9ucworICogbW9kdWxvcyBhbmQgbXVsdGlwbGljYXRpb25zLgorICovCisjZGVmaW5lIGJsa29mZihmcywgbG9jKQkJLyogY2FsY3VsYXRlcyAobG9jICUgZnMtPmZzX2JzaXplKSAqLyBcCisJKChsb2MpICYgfihmcyktPmZzX2JtYXNrKQorI2RlZmluZSBmcmFnb2ZmKGZzLCBsb2MpCS8qIGNhbGN1bGF0ZXMgKGxvYyAlIGZzLT5mc19mc2l6ZSkgKi8gXAorCSgobG9jKSAmIH4oZnMpLT5mc19mbWFzaykKKyNkZWZpbmUgbGJsa25vKGZzLCBsb2MpCQkvKiBjYWxjdWxhdGVzIChsb2MgLyBmcy0+ZnNfYnNpemUpICovIFwKKwkoKGxvYykgPj4gKGZzKS0+ZnNfYnNoaWZ0KQorI2RlZmluZSBudW1mcmFncyhmcywgbG9jKQkvKiBjYWxjdWxhdGVzIChsb2MgLyBmcy0+ZnNfZnNpemUpICovIFwKKwkoKGxvYykgPj4gKGZzKS0+ZnNfZnNoaWZ0KQorI2RlZmluZSBibGtyb3VuZHVwKGZzLCBzaXplKQkvKiBjYWxjdWxhdGVzIHJvdW5kdXAoc2l6ZSwgZnMtPmZzX2JzaXplKSAqLyBcCisJKCgoc2l6ZSkgKyAoZnMpLT5mc19ic2l6ZSAtIDEpICYgKGZzKS0+ZnNfYm1hc2spCisjZGVmaW5lIGZyYWdyb3VuZHVwKGZzLCBzaXplKQkvKiBjYWxjdWxhdGVzIHJvdW5kdXAoc2l6ZSwgZnMtPmZzX2ZzaXplKSAqLyBcCisJKCgoc2l6ZSkgKyAoZnMpLT5mc19mc2l6ZSAtIDEpICYgKGZzKS0+ZnNfZm1hc2spCisjZGVmaW5lIGZyYWdzdG9ibGtzKGZzLCBmcmFncykJLyogY2FsY3VsYXRlcyAoZnJhZ3MgLyBmcy0+ZnNfZnJhZykgKi8gXAorCSgoZnJhZ3MpID4+IChmcyktPmZzX2ZyYWdzaGlmdCkKKyNkZWZpbmUgYmxrc3RvZnJhZ3MoZnMsIGJsa3MpCS8qIGNhbGN1bGF0ZXMgKGJsa3MgKiBmcy0+ZnNfZnJhZykgKi8gXAorCSgoYmxrcykgPDwgKGZzKS0+ZnNfZnJhZ3NoaWZ0KQorI2RlZmluZSBmcmFnbnVtKGZzLCBmc2IpCS8qIGNhbGN1bGF0ZXMgKGZzYiAlIGZzLT5mc19mcmFnKSAqLyBcCisJKChmc2IpICYgKChmcyktPmZzX2ZyYWcgLSAxKSkKKyNkZWZpbmUgYmxrbnVtKGZzLCBmc2IpCQkvKiBjYWxjdWxhdGVzIHJvdW5kZG93bihmc2IsIGZzLT5mc19mcmFnKSAqLyBcCisJKChmc2IpICZ+ICgoZnMpLT5mc19mcmFnIC0gMSkpCisKKy8qCisgKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgZnJhZ3MgZ2l2ZW4gYQorICogcGVyY2VudGFnZSB0byBob2xkIGluIHJlc2VydmUKKyAqLworI2RlZmluZSBmcmVlc3BhY2UoZnMsIHBlcmNlbnRyZXNlcnZlZCkgXAorCShibGtzdG9mcmFncygoZnMpLCAoZnMpLT5mc19jc3RvdGFsLmNzX25iZnJlZSkgKyBcCisJKGZzKS0+ZnNfY3N0b3RhbC5jc19uZmZyZWUgLSAoKGZzKS0+ZnNfZHNpemUgKiAocGVyY2VudHJlc2VydmVkKSAvIDEwMCkpCisKKy8qCisgKiBEZXRlcm1pbmluZyB0aGUgc2l6ZSBvZiBhIGZpbGUgYmxvY2sgaW4gdGhlIGZpbGUgc3lzdGVtLgorICovCisjZGVmaW5lIGJsa3NpemUoZnMsIGlwLCBsYm4pIFwKKwkoKChsYm4pID49IE5EQUREUiB8fCAoaXApLT5pX3NpemUgPj0gKChsYm4pICsgMSkgPDwgKGZzKS0+ZnNfYnNoaWZ0KSBcCisJICAgID8gKGZzKS0+ZnNfYnNpemUgXAorCSAgICA6IChmcmFncm91bmR1cChmcywgYmxrb2ZmKGZzLCAoaXApLT5pX3NpemUpKSkpCisjZGVmaW5lIGRibGtzaXplKGZzLCBkaXAsIGxibikgXAorCSgoKGxibikgPj0gTkRBRERSIHx8IChkaXApLT5kaV9zaXplID49ICgobGJuKSArIDEpIDw8IChmcyktPmZzX2JzaGlmdCkgXAorCSAgICA/IChmcyktPmZzX2JzaXplIFwKKwkgICAgOiAoZnJhZ3JvdW5kdXAoZnMsIGJsa29mZihmcywgKGRpcCktPmRpX3NpemUpKSkpCisKKy8qCisgKiBOdW1iZXIgb2YgZGlzayBzZWN0b3JzIHBlciBibG9jazsgYXNzdW1lcyBERVZfQlNJWkUgYnl0ZSBzZWN0b3Igc2l6ZS4KKyAqLworI2RlZmluZQlOU1BCKGZzKQkoKGZzKS0+ZnNfbnNwZiA8PCAoZnMpLT5mc19mcmFnc2hpZnQpCisjZGVmaW5lCU5TUEYoZnMpCSgoZnMpLT5mc19uc3BmKQorCisvKgorICogSU5PUEIgaXMgdGhlIG51bWJlciBvZiBpbm9kZXMgaW4gYSBzZWNvbmRhcnkgc3RvcmFnZSBibG9jay4KKyAqLworI2RlZmluZQlJTk9QQihmcykJKChmcyktPmZzX2lub3BiKQorI2RlZmluZQlJTk9QRihmcykJKChmcyktPmZzX2lub3BiID4+IChmcyktPmZzX2ZyYWdzaGlmdCkKKworLyoKKyAqIE5JTkRJUiBpcyB0aGUgbnVtYmVyIG9mIGluZGlyZWN0cyBpbiBhIGZpbGUgc3lzdGVtIGJsb2NrLgorICovCisjZGVmaW5lCU5JTkRJUihmcykJKChmcyktPmZzX25pbmRpcikKZGlmZiAtLWdpdCBhL3N0YWdlMi9mc3lzX2V4dDJmcy5jIGIvc3RhZ2UyL2ZzeXNfZXh0MmZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYwMDQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMi9mc3lzX2V4dDJmcy5jCkBAIC0wLDAgKzEsNzg5IEBACisvKgorICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDEsIDIwMDMgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmZGVmIEZTWVNfRVhUMkZTCisKKyNpbmNsdWRlICJzaGFyZWQuaCIKKyNpbmNsdWRlICJmaWxlc3lzLmgiCisKK3N0YXRpYyBpbnQgbWFwYmxvY2sxLCBtYXBibG9jazI7CisKKy8qIHNpemVzIGFyZSBhbHdheXMgaW4gYnl0ZXMsIEJMT0NLIHZhbHVlcyBhcmUgYWx3YXlzIGluIERFVl9CU0laRSAoc2VjdG9ycykgKi8KKyNkZWZpbmUgREVWX0JTSVpFIDUxMgorCisvKiBpbmNsdWRlL2xpbnV4L2ZzLmggKi8KKyNkZWZpbmUgQkxPQ0tfU0laRSAxMDI0CQkvKiBpbml0aWFsIGJsb2NrIHNpemUgZm9yIHN1cGVyYmxvY2sgcmVhZCAqLworLyogbWFkZSB1cCwgZGVmYXVsdHMgdG8gMSBidXQgY2FuIGJlIHBhc3NlZCB2aWEgbW91bnRfb3B0cyAqLworI2RlZmluZSBXSElDSF9TVVBFUiAxCisvKiBraW5kIG9mIGZyb20gZnMvZXh0Mi9zdXBlci5jICovCisjZGVmaW5lIFNCTE9DSyAoV0hJQ0hfU1VQRVIgKiBCTE9DS19TSVpFIC8gREVWX0JTSVpFKQkvKiA9IDIgKi8KKworLyogaW5jbHVkZS9hc20taTM4Ni90eXBlcy5oICovCit0eXBlZGVmIF9fc2lnbmVkX18gY2hhciBfX3M4OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9fdTg7Cit0eXBlZGVmIF9fc2lnbmVkX18gc2hvcnQgX19zMTY7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IF9fdTE2OwordHlwZWRlZiBfX3NpZ25lZF9fIGludCBfX3MzMjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IF9fdTMyOworCisvKgorICogQ29uc3RhbnRzIHJlbGF0aXZlIHRvIHRoZSBkYXRhIGJsb2NrcywgZnJvbSBleHQyX2ZzLmgKKyAqLworI2RlZmluZSBFWFQyX05ESVJfQkxPQ0tTICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIEVYVDJfSU5EX0JMT0NLICAgICAgICAgICAgICAgICAgRVhUMl9ORElSX0JMT0NLUworI2RlZmluZSBFWFQyX0RJTkRfQkxPQ0sgICAgICAgICAgICAgICAgIChFWFQyX0lORF9CTE9DSyArIDEpCisjZGVmaW5lIEVYVDJfVElORF9CTE9DSyAgICAgICAgICAgICAgICAgKEVYVDJfRElORF9CTE9DSyArIDEpCisjZGVmaW5lIEVYVDJfTl9CTE9DS1MgICAgICAgICAgICAgICAgICAgKEVYVDJfVElORF9CTE9DSyArIDEpCisKKy8qIGluY2x1ZGUvbGludXgvZXh0Ml9mcy5oICovCitzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jaworICB7CisgICAgX191MzIgc19pbm9kZXNfY291bnQ7CS8qIElub2RlcyBjb3VudCAqLworICAgIF9fdTMyIHNfYmxvY2tzX2NvdW50OwkvKiBCbG9ja3MgY291bnQgKi8KKyAgICBfX3UzMiBzX3JfYmxvY2tzX2NvdW50OwkvKiBSZXNlcnZlZCBibG9ja3MgY291bnQgKi8KKyAgICBfX3UzMiBzX2ZyZWVfYmxvY2tzX2NvdW50OwkvKiBGcmVlIGJsb2NrcyBjb3VudCAqLworICAgIF9fdTMyIHNfZnJlZV9pbm9kZXNfY291bnQ7CS8qIEZyZWUgaW5vZGVzIGNvdW50ICovCisgICAgX191MzIgc19maXJzdF9kYXRhX2Jsb2NrOwkvKiBGaXJzdCBEYXRhIEJsb2NrICovCisgICAgX191MzIgc19sb2dfYmxvY2tfc2l6ZTsJLyogQmxvY2sgc2l6ZSAqLworICAgIF9fczMyIHNfbG9nX2ZyYWdfc2l6ZTsJLyogRnJhZ21lbnQgc2l6ZSAqLworICAgIF9fdTMyIHNfYmxvY2tzX3Blcl9ncm91cDsJLyogIyBCbG9ja3MgcGVyIGdyb3VwICovCisgICAgX191MzIgc19mcmFnc19wZXJfZ3JvdXA7CS8qICMgRnJhZ21lbnRzIHBlciBncm91cCAqLworICAgIF9fdTMyIHNfaW5vZGVzX3Blcl9ncm91cDsJLyogIyBJbm9kZXMgcGVyIGdyb3VwICovCisgICAgX191MzIgc19tdGltZTsJCS8qIE1vdW50IHRpbWUgKi8KKyAgICBfX3UzMiBzX3d0aW1lOwkJLyogV3JpdGUgdGltZSAqLworICAgIF9fdTE2IHNfbW50X2NvdW50OwkJLyogTW91bnQgY291bnQgKi8KKyAgICBfX3MxNiBzX21heF9tbnRfY291bnQ7CS8qIE1heGltYWwgbW91bnQgY291bnQgKi8KKyAgICBfX3UxNiBzX21hZ2ljOwkJLyogTWFnaWMgc2lnbmF0dXJlICovCisgICAgX191MTYgc19zdGF0ZTsJCS8qIEZpbGUgc3lzdGVtIHN0YXRlICovCisgICAgX191MTYgc19lcnJvcnM7CQkvKiBCZWhhdmlvdXIgd2hlbiBkZXRlY3RpbmcgZXJyb3JzICovCisgICAgX191MTYgc19wYWQ7CisgICAgX191MzIgc19sYXN0Y2hlY2s7CQkvKiB0aW1lIG9mIGxhc3QgY2hlY2sgKi8KKyAgICBfX3UzMiBzX2NoZWNraW50ZXJ2YWw7CS8qIG1heC4gdGltZSBiZXR3ZWVuIGNoZWNrcyAqLworICAgIF9fdTMyIHNfY3JlYXRvcl9vczsJCS8qIE9TICovCisgICAgX191MzIgc19yZXZfbGV2ZWw7CQkvKiBSZXZpc2lvbiBsZXZlbCAqLworICAgIF9fdTE2IHNfZGVmX3Jlc3VpZDsJCS8qIERlZmF1bHQgdWlkIGZvciByZXNlcnZlZCBibG9ja3MgKi8KKyAgICBfX3UxNiBzX2RlZl9yZXNnaWQ7CQkvKiBEZWZhdWx0IGdpZCBmb3IgcmVzZXJ2ZWQgYmxvY2tzICovCisgICAgX191MzIgc19yZXNlcnZlZFsyMzVdOwkvKiBQYWRkaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGJsb2NrICovCisgIH07CisKK3N0cnVjdCBleHQyX2dyb3VwX2Rlc2MKKyAgeworICAgIF9fdTMyIGJnX2Jsb2NrX2JpdG1hcDsJLyogQmxvY2tzIGJpdG1hcCBibG9jayAqLworICAgIF9fdTMyIGJnX2lub2RlX2JpdG1hcDsJLyogSW5vZGVzIGJpdG1hcCBibG9jayAqLworICAgIF9fdTMyIGJnX2lub2RlX3RhYmxlOwkvKiBJbm9kZXMgdGFibGUgYmxvY2sgKi8KKyAgICBfX3UxNiBiZ19mcmVlX2Jsb2Nrc19jb3VudDsJLyogRnJlZSBibG9ja3MgY291bnQgKi8KKyAgICBfX3UxNiBiZ19mcmVlX2lub2Rlc19jb3VudDsJLyogRnJlZSBpbm9kZXMgY291bnQgKi8KKyAgICBfX3UxNiBiZ191c2VkX2RpcnNfY291bnQ7CS8qIERpcmVjdG9yaWVzIGNvdW50ICovCisgICAgX191MTYgYmdfcGFkOworICAgIF9fdTMyIGJnX3Jlc2VydmVkWzNdOworICB9OworCitzdHJ1Y3QgZXh0Ml9pbm9kZQorICB7CisgICAgX191MTYgaV9tb2RlOwkJLyogRmlsZSBtb2RlICovCisgICAgX191MTYgaV91aWQ7CQkvKiBPd25lciBVaWQgKi8KKyAgICBfX3UzMiBpX3NpemU7CQkvKiA0OiBTaXplIGluIGJ5dGVzICovCisgICAgX191MzIgaV9hdGltZTsJCS8qIEFjY2VzcyB0aW1lICovCisgICAgX191MzIgaV9jdGltZTsJCS8qIDEyOiBDcmVhdGlvbiB0aW1lICovCisgICAgX191MzIgaV9tdGltZTsJCS8qIE1vZGlmaWNhdGlvbiB0aW1lICovCisgICAgX191MzIgaV9kdGltZTsJCS8qIDIwOiBEZWxldGlvbiBUaW1lICovCisgICAgX191MTYgaV9naWQ7CQkvKiBHcm91cCBJZCAqLworICAgIF9fdTE2IGlfbGlua3NfY291bnQ7CS8qIDI0OiBMaW5rcyBjb3VudCAqLworICAgIF9fdTMyIGlfYmxvY2tzOwkJLyogQmxvY2tzIGNvdW50ICovCisgICAgX191MzIgaV9mbGFnczsJCS8qIDMyOiBGaWxlIGZsYWdzICovCisgICAgdW5pb24KKyAgICAgIHsKKwlzdHJ1Y3QKKwkgIHsKKwkgICAgX191MzIgbF9pX3Jlc2VydmVkMTsKKwkgIH0KKwlsaW51eDE7CisJc3RydWN0CisJICB7CisJICAgIF9fdTMyIGhfaV90cmFuc2xhdG9yOworCSAgfQorCWh1cmQxOworCXN0cnVjdAorCSAgeworCSAgICBfX3UzMiBtX2lfcmVzZXJ2ZWQxOworCSAgfQorCW1hc2l4MTsKKyAgICAgIH0KKyAgICBvc2QxOwkJCS8qIE9TIGRlcGVuZGVudCAxICovCisgICAgX191MzIgaV9ibG9ja1tFWFQyX05fQkxPQ0tTXTsJLyogNDA6IFBvaW50ZXJzIHRvIGJsb2NrcyAqLworICAgIF9fdTMyIGlfdmVyc2lvbjsJCS8qIEZpbGUgdmVyc2lvbiAoZm9yIE5GUykgKi8KKyAgICBfX3UzMiBpX2ZpbGVfYWNsOwkJLyogRmlsZSBBQ0wgKi8KKyAgICBfX3UzMiBpX2Rpcl9hY2w7CQkvKiBEaXJlY3RvcnkgQUNMICovCisgICAgX191MzIgaV9mYWRkcjsJCS8qIEZyYWdtZW50IGFkZHJlc3MgKi8KKyAgICB1bmlvbgorICAgICAgeworCXN0cnVjdAorCSAgeworCSAgICBfX3U4IGxfaV9mcmFnOwkvKiBGcmFnbWVudCBudW1iZXIgKi8KKwkgICAgX191OCBsX2lfZnNpemU7CS8qIEZyYWdtZW50IHNpemUgKi8KKwkgICAgX191MTYgaV9wYWQxOworCSAgICBfX3UzMiBsX2lfcmVzZXJ2ZWQyWzJdOworCSAgfQorCWxpbnV4MjsKKwlzdHJ1Y3QKKwkgIHsKKwkgICAgX191OCBoX2lfZnJhZzsJLyogRnJhZ21lbnQgbnVtYmVyICovCisJICAgIF9fdTggaF9pX2ZzaXplOwkvKiBGcmFnbWVudCBzaXplICovCisJICAgIF9fdTE2IGhfaV9tb2RlX2hpZ2g7CisJICAgIF9fdTE2IGhfaV91aWRfaGlnaDsKKwkgICAgX191MTYgaF9pX2dpZF9oaWdoOworCSAgICBfX3UzMiBoX2lfYXV0aG9yOworCSAgfQorCWh1cmQyOworCXN0cnVjdAorCSAgeworCSAgICBfX3U4IG1faV9mcmFnOwkvKiBGcmFnbWVudCBudW1iZXIgKi8KKwkgICAgX191OCBtX2lfZnNpemU7CS8qIEZyYWdtZW50IHNpemUgKi8KKwkgICAgX191MTYgbV9wYWQxOworCSAgICBfX3UzMiBtX2lfcmVzZXJ2ZWQyWzJdOworCSAgfQorCW1hc2l4MjsKKyAgICAgIH0KKyAgICBvc2QyOwkJCS8qIE9TIGRlcGVuZGVudCAyICovCisgIH07CisKKy8qIGxpbnV4L2xpbWl0cy5oICovCisjZGVmaW5lIE5BTUVfTUFYICAgICAgICAgMjU1CS8qICMgY2hhcnMgaW4gYSBmaWxlIG5hbWUgKi8KKworLyogbGludXgvcG9zaXhfdHlwZS5oICovCit0eXBlZGVmIGxvbmcgbGludXhfb2ZmX3Q7CisKKy8qIGxpbnV4L2V4dDJmcy5oICovCisjZGVmaW5lIEVYVDJfTkFNRV9MRU4gMjU1CitzdHJ1Y3QgZXh0Ml9kaXJfZW50cnkKKyAgeworICAgIF9fdTMyIGlub2RlOwkJLyogSW5vZGUgbnVtYmVyICovCisgICAgX191MTYgcmVjX2xlbjsJCS8qIERpcmVjdG9yeSBlbnRyeSBsZW5ndGggKi8KKyAgICBfX3U4IG5hbWVfbGVuOwkJLyogTmFtZSBsZW5ndGggKi8KKyAgICBfX3U4IGZpbGVfdHlwZTsKKyAgICBjaGFyIG5hbWVbRVhUMl9OQU1FX0xFTl07CS8qIEZpbGUgbmFtZSAqLworICB9OworCisvKiBsaW51eC9leHQyZnMuaCAqLworLyoKKyAqIEVYVDJfRElSX1BBRCBkZWZpbmVzIHRoZSBkaXJlY3RvcnkgZW50cmllcyBib3VuZGFyaWVzCisgKgorICogTk9URTogSXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQKKyAqLworI2RlZmluZSBFWFQyX0RJUl9QQUQgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgRVhUMl9ESVJfUk9VTkQgICAgICAgICAgICAgICAgICAoRVhUMl9ESVJfUEFEIC0gMSkKKyNkZWZpbmUgRVhUMl9ESVJfUkVDX0xFTihuYW1lX2xlbikgICAgICAoKChuYW1lX2xlbikgKyA4ICsgRVhUMl9ESVJfUk9VTkQpICYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+RVhUMl9ESVJfUk9VTkQpCisKKworLyogZXh0Mi9zdXBlci5jICovCisjZGVmaW5lIGxvZzIobikgZmZ6KH4obikpCisKKyNkZWZpbmUgRVhUMl9TVVBFUl9NQUdJQyAgICAgIDB4RUY1MwkvKiBpbmNsdWRlL2xpbnV4L2V4dDJfZnMuaCAqLworI2RlZmluZSBFWFQyX1JPT1RfSU5PICAgICAgICAgICAgICAyCS8qIGluY2x1ZGUvbGludXgvZXh0Ml9mcy5oICovCisjZGVmaW5lIFBBVEhfTUFYICAgICAgICAgICAgICAgIDEwMjQJLyogaW5jbHVkZS9saW51eC9saW1pdHMuaCAqLworI2RlZmluZSBNQVhfTElOS19DT1VOVCAgICAgICAgICAgICA1CS8qIG51bWJlciBvZiBzeW1ib2xpYyBsaW5rcyB0byBmb2xsb3cgKi8KKworLyogbWFkZSB1cCwgdGhlc2UgYXJlIHBvaW50ZXJzIGludG8gRlNZU19CVUYgKi8KKy8qIHJlYWQgb25jZSwgYWx3YXlzIHN0YXlzIHRoZXJlOiAqLworI2RlZmluZSBTVVBFUkJMT0NLIFwKKyAgICAoKHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICopKEZTWVNfQlVGKSkKKyNkZWZpbmUgR1JPVVBfREVTQyBcCisgICAgKChzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICopIFwKKyAgICAgKChpbnQpU1VQRVJCTE9DSyArIHNpemVvZihzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jaykpKQorI2RlZmluZSBJTk9ERSBcCisgICAgKChzdHJ1Y3QgZXh0Ml9pbm9kZSAqKSgoaW50KUdST1VQX0RFU0MgKyBFWFQyX0JMT0NLX1NJWkUoU1VQRVJCTE9DSykpKQorI2RlZmluZSBEQVRBQkxPQ0sxIFwKKyAgICAoKGludCkoKGludClJTk9ERSArIHNpemVvZihzdHJ1Y3QgZXh0Ml9pbm9kZSkpKQorI2RlZmluZSBEQVRBQkxPQ0syIFwKKyAgICAoKGludCkoKGludClEQVRBQkxPQ0sxICsgRVhUMl9CTE9DS19TSVpFKFNVUEVSQkxPQ0spKSkKKworLyogbGludXgvZXh0Ml9mcy5oICovCisjZGVmaW5lIEVYVDJfQUREUl9QRVJfQkxPQ0socykgICAgICAgICAgKEVYVDJfQkxPQ0tfU0laRShzKSAvIHNpemVvZiAoX191MzIpKQorI2RlZmluZSBFWFQyX0FERFJfUEVSX0JMT0NLX0JJVFMocykJCShsb2cyKEVYVDJfQUREUl9QRVJfQkxPQ0socykpKQorCisvKiBsaW51eC9leHQyX2ZzLmggKi8KKyNkZWZpbmUgRVhUMl9CTE9DS19TSVpFX0JJVFMocykgICAgICAgICgocyktPnNfbG9nX2Jsb2NrX3NpemUgKyAxMCkKKy8qIGtpbmQgb2YgZnJvbSBleHQyL3N1cGVyLmMgKi8KKyNkZWZpbmUgRVhUMl9CTE9DS19TSVpFKHMpCSgxIDw8IEVYVDJfQkxPQ0tfU0laRV9CSVRTKHMpKQorLyogbGludXgvZXh0MmZzLmggKi8KKyNkZWZpbmUgRVhUMl9ERVNDX1BFUl9CTE9DSyhzKSBcCisgICAgIChFWFQyX0JMT0NLX1NJWkUocykgLyBzaXplb2YgKHN0cnVjdCBleHQyX2dyb3VwX2Rlc2MpKQorLyogbGludXgvc3RhdC5oICovCisjZGVmaW5lIFNfSUZNVCAgMDAxNzAwMDAKKyNkZWZpbmUgU19JRkxOSyAgMDEyMDAwMAorI2RlZmluZSBTX0lGUkVHICAwMTAwMDAwCisjZGVmaW5lIFNfSUZESVIgIDAwNDAwMDAKKyNkZWZpbmUgU19JU0xOSyhtKQkoKChtKSAmIFNfSUZNVCkgPT0gU19JRkxOSykKKyNkZWZpbmUgU19JU1JFRyhtKSAgICAgICgoKG0pICYgU19JRk1UKSA9PSBTX0lGUkVHKQorI2RlZmluZSBTX0lTRElSKG0pICAgICAgKCgobSkgJiBTX0lGTVQpID09IFNfSUZESVIpCisKKy8qIGluY2x1ZGUvYXNtLWkzODYvYml0b3BzLmggKi8KKy8qCisgKiBmZnogPSBGaW5kIEZpcnN0IFplcm8gaW4gd29yZC4gVW5kZWZpbmVkIGlmIG5vIHplcm8gZXhpc3RzLAorICogc28gY29kZSBzaG91bGQgY2hlY2sgYWdhaW5zdCB+MFVMIGZpcnN0Li4KKyAqLworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZworZmZ6ICh1bnNpZ25lZCBsb25nIHdvcmQpCit7CisgIF9fYXNtX18gKCJic2ZsICUxLCUwIgorOgkgICAiPXIiICh3b3JkKQorOgkgICAiciIgKH53b3JkKSk7CisgIHJldHVybiB3b3JkOworfQorCisvKiBjaGVjayBmaWxlc3lzdGVtIHR5cGVzIGFuZCByZWFkIHN1cGVyYmxvY2sgaW50byBtZW1vcnkgYnVmZmVyICovCitpbnQKK2V4dDJmc19tb3VudCAodm9pZCkKK3sKKyAgaW50IHJldHZhbCA9IDE7CisKKyAgaWYgKCgoKGN1cnJlbnRfZHJpdmUgJiAweDgwKSB8fCAoY3VycmVudF9zbGljZSAhPSAwKSkKKyAgICAgICAmJiAoY3VycmVudF9zbGljZSAhPSBQQ19TTElDRV9UWVBFX0VYVDJGUykKKyAgICAgICAmJiAoY3VycmVudF9zbGljZSAhPSBQQ19TTElDRV9UWVBFX0xJTlVYX1JBSUQpCisgICAgICAgJiYgKCEgSVNfUENfU0xJQ0VfVFlQRV9CU0RfV0lUSF9GUyAoY3VycmVudF9zbGljZSwgRlNfRVhUMkZTKSkKKyAgICAgICAmJiAoISBJU19QQ19TTElDRV9UWVBFX0JTRF9XSVRIX0ZTIChjdXJyZW50X3NsaWNlLCBGU19PVEhFUikpKQorICAgICAgfHwgcGFydF9sZW5ndGggPCAoU0JMT0NLICsgKHNpemVvZiAoc3RydWN0IGV4dDJfc3VwZXJfYmxvY2spIC8gREVWX0JTSVpFKSkKKyAgICAgIHx8ICFkZXZyZWFkIChTQkxPQ0ssIDAsIHNpemVvZiAoc3RydWN0IGV4dDJfc3VwZXJfYmxvY2spLAorCQkgICAoY2hhciAqKSBTVVBFUkJMT0NLKQorICAgICAgfHwgU1VQRVJCTE9DSy0+c19tYWdpYyAhPSBFWFQyX1NVUEVSX01BR0lDKQorICAgICAgcmV0dmFsID0gMDsKKworICByZXR1cm4gcmV0dmFsOworfQorCisvKiBUYWtlcyBhIGZpbGUgc3lzdGVtIGJsb2NrIG51bWJlciBhbmQgcmVhZHMgaXQgaW50byBCVUZGRVIuICovCitzdGF0aWMgaW50CitleHQyX3JkZnNiIChpbnQgZnNibG9jaywgaW50IGJ1ZmZlcikKK3sKKyNpZmRlZiBFMkRFQlVHCisgIHByaW50ZiAoImZzYmxvY2sgJWQgYnVmZmVyICVkXG4iLCBmc2Jsb2NrLCBidWZmZXIpOworI2VuZGlmIC8qIEUyREVCVUcgKi8KKyAgcmV0dXJuIGRldnJlYWQgKGZzYmxvY2sgKiAoRVhUMl9CTE9DS19TSVpFIChTVVBFUkJMT0NLKSAvIERFVl9CU0laRSksIDAsCisJCSAgRVhUMl9CTE9DS19TSVpFIChTVVBFUkJMT0NLKSwgKGNoYXIgKikgYnVmZmVyKTsKK30KKworLyogZnJvbQorICBleHQyL2lub2RlLmM6ZXh0Ml9ibWFwKCkKKyovCisvKiBNYXBzIExPR0lDQUxfQkxPQ0sgKHRoZSBmaWxlIG9mZnNldCBkaXZpZGVkIGJ5IHRoZSBibG9ja3NpemUpIGludG8KKyAgIGEgcGh5c2ljYWwgYmxvY2sgKHRoZSBsb2NhdGlvbiBpbiB0aGUgZmlsZSBzeXN0ZW0pIHZpYSBhbiBpbm9kZS4gKi8KK3N0YXRpYyBpbnQKK2V4dDJmc19ibG9ja19tYXAgKGludCBsb2dpY2FsX2Jsb2NrKQoreworCisjaWZkZWYgRTJERUJVRworICB1bnNpZ25lZCBjaGFyICppOworICBmb3IgKGkgPSAodW5zaWduZWQgY2hhciAqKSBJTk9ERTsKKyAgICAgICBpIDwgKCh1bnNpZ25lZCBjaGFyICopIElOT0RFICsgc2l6ZW9mIChzdHJ1Y3QgZXh0Ml9pbm9kZSkpOworICAgICAgIGkrKykKKyAgICB7CisgICAgICBwcmludGYgKCIlYyIsICIwMTIzNDU2Nzg5YWJjZGVmIlsqaSA+PiA0XSk7CisgICAgICBwcmludGYgKCIlYyIsICIwMTIzNDU2Nzg5YWJjZGVmIlsqaSAlIDE2XSk7CisgICAgICBpZiAoISgoaSArIDEgLSAodW5zaWduZWQgY2hhciAqKSBJTk9ERSkgJSAxNikpCisJeworCSAgcHJpbnRmICgiXG4iKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcHJpbnRmICgiICIpOworCX0KKyAgICB9CisgIHByaW50ZiAoImxvZ2ljYWwgYmxvY2sgJWRcbiIsIGxvZ2ljYWxfYmxvY2spOworI2VuZGlmIC8qIEUyREVCVUcgKi8KKworICAvKiBpZiBpdCBpcyBkaXJlY3RseSBwb2ludGVkIHRvIGJ5IHRoZSBpbm9kZSwgcmV0dXJuIHRoYXQgcGh5c2ljYWwgYWRkciAqLworICBpZiAobG9naWNhbF9ibG9jayA8IEVYVDJfTkRJUl9CTE9DS1MpCisgICAgeworI2lmZGVmIEUyREVCVUcKKyAgICAgIHByaW50ZiAoInJldHVybmluZyAlZFxuIiwgKHVuc2lnbmVkIGNoYXIgKikgKElOT0RFLT5pX2Jsb2NrW2xvZ2ljYWxfYmxvY2tdKSk7CisgICAgICBwcmludGYgKCJyZXR1cm5pbmcgJWRcbiIsIElOT0RFLT5pX2Jsb2NrW2xvZ2ljYWxfYmxvY2tdKTsKKyNlbmRpZiAvKiBFMkRFQlVHICovCisgICAgICByZXR1cm4gSU5PREUtPmlfYmxvY2tbbG9naWNhbF9ibG9ja107CisgICAgfQorICAvKiBlbHNlICovCisgIGxvZ2ljYWxfYmxvY2sgLT0gRVhUMl9ORElSX0JMT0NLUzsKKyAgLyogdHJ5IHRoZSBpbmRpcmVjdCBibG9jayAqLworICBpZiAobG9naWNhbF9ibG9jayA8IEVYVDJfQUREUl9QRVJfQkxPQ0sgKFNVUEVSQkxPQ0spKQorICAgIHsKKyAgICAgIGlmIChtYXBibG9jazEgIT0gMQorCSAgJiYgIWV4dDJfcmRmc2IgKElOT0RFLT5pX2Jsb2NrW0VYVDJfSU5EX0JMT0NLXSwgREFUQUJMT0NLMSkpCisJeworCSAgZXJybnVtID0gRVJSX0ZTWVNfQ09SUlVQVDsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgICBtYXBibG9jazEgPSAxOworICAgICAgcmV0dXJuICgoX191MzIgKikgREFUQUJMT0NLMSlbbG9naWNhbF9ibG9ja107CisgICAgfQorICAvKiBlbHNlICovCisgIGxvZ2ljYWxfYmxvY2sgLT0gRVhUMl9BRERSX1BFUl9CTE9DSyAoU1VQRVJCTE9DSyk7CisgIC8qIG5vdyB0cnkgdGhlIGRvdWJsZSBpbmRpcmVjdCBibG9jayAqLworICBpZiAobG9naWNhbF9ibG9jayA8ICgxIDw8IChFWFQyX0FERFJfUEVSX0JMT0NLX0JJVFMgKFNVUEVSQkxPQ0spICogMikpKQorICAgIHsKKyAgICAgIGludCBibnVtOworICAgICAgaWYgKG1hcGJsb2NrMSAhPSAyCisJICAmJiAhZXh0Ml9yZGZzYiAoSU5PREUtPmlfYmxvY2tbRVhUMl9ESU5EX0JMT0NLXSwgREFUQUJMT0NLMSkpCisJeworCSAgZXJybnVtID0gRVJSX0ZTWVNfQ09SUlVQVDsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgICBtYXBibG9jazEgPSAyOworICAgICAgaWYgKChibnVtID0gKCgoX191MzIgKikgREFUQUJMT0NLMSkKKwkJICAgW2xvZ2ljYWxfYmxvY2sgPj4gRVhUMl9BRERSX1BFUl9CTE9DS19CSVRTIChTVVBFUkJMT0NLKV0pKQorCSAgIT0gbWFwYmxvY2syCisJICAmJiAhZXh0Ml9yZGZzYiAoYm51bSwgREFUQUJMT0NLMikpCisJeworCSAgZXJybnVtID0gRVJSX0ZTWVNfQ09SUlVQVDsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgICBtYXBibG9jazIgPSBibnVtOworICAgICAgcmV0dXJuICgoX191MzIgKikgREFUQUJMT0NLMikKKwlbbG9naWNhbF9ibG9jayAmIChFWFQyX0FERFJfUEVSX0JMT0NLIChTVVBFUkJMT0NLKSAtIDEpXTsKKyAgICB9CisgIC8qIGVsc2UgKi8KKyAgbWFwYmxvY2syID0gLTE7CisgIGxvZ2ljYWxfYmxvY2sgLT0gKDEgPDwgKEVYVDJfQUREUl9QRVJfQkxPQ0tfQklUUyAoU1VQRVJCTE9DSykgKiAyKSk7CisgIGlmIChtYXBibG9jazEgIT0gMworICAgICAgJiYgIWV4dDJfcmRmc2IgKElOT0RFLT5pX2Jsb2NrW0VYVDJfVElORF9CTE9DS10sIERBVEFCTE9DSzEpKQorICAgIHsKKyAgICAgIGVycm51bSA9IEVSUl9GU1lTX0NPUlJVUFQ7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICBtYXBibG9jazEgPSAzOworICBpZiAoIWV4dDJfcmRmc2IgKCgoX191MzIgKikgREFUQUJMT0NLMSkKKwkJICAgW2xvZ2ljYWxfYmxvY2sgPj4gKEVYVDJfQUREUl9QRVJfQkxPQ0tfQklUUyAoU1VQRVJCTE9DSykKKwkJCQkgICAgICAqIDIpXSwKKwkJICAgREFUQUJMT0NLMikpCisgICAgeworICAgICAgZXJybnVtID0gRVJSX0ZTWVNfQ09SUlVQVDsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIGlmICghZXh0Ml9yZGZzYiAoKChfX3UzMiAqKSBEQVRBQkxPQ0syKQorCQkgICBbKGxvZ2ljYWxfYmxvY2sgPj4gRVhUMl9BRERSX1BFUl9CTE9DS19CSVRTIChTVVBFUkJMT0NLKSkKKwkJICAgICYgKEVYVDJfQUREUl9QRVJfQkxPQ0sgKFNVUEVSQkxPQ0spIC0gMSldLAorCQkgICBEQVRBQkxPQ0syKSkKKyAgICB7CisgICAgICBlcnJudW0gPSBFUlJfRlNZU19DT1JSVVBUOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgcmV0dXJuICgoX191MzIgKikgREFUQUJMT0NLMikKKyAgICBbbG9naWNhbF9ibG9jayAmIChFWFQyX0FERFJfUEVSX0JMT0NLIChTVVBFUkJMT0NLKSAtIDEpXTsKK30KKworLyogcHJlY29uZGl0aW9uczogYWxsIHByZWNvbmRzIG9mIGV4dDJmc19ibG9ja19tYXAgKi8KK2ludAorZXh0MmZzX3JlYWQgKGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKyAgaW50IGxvZ2ljYWxfYmxvY2s7CisgIGludCBvZmZzZXQ7CisgIGludCBtYXA7CisgIGludCByZXQgPSAwOworICBpbnQgc2l6ZSA9IDA7CisKKyNpZmRlZiBFMkRFQlVHCisgIHN0YXRpYyBjaGFyIGhleGRpZ2l0W10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisgIHVuc2lnbmVkIGNoYXIgKmk7CisgIGZvciAoaSA9ICh1bnNpZ25lZCBjaGFyICopIElOT0RFOworICAgICAgIGkgPCAoKHVuc2lnbmVkIGNoYXIgKikgSU5PREUgKyBzaXplb2YgKHN0cnVjdCBleHQyX2lub2RlKSk7CisgICAgICAgaSsrKQorICAgIHsKKyAgICAgIHByaW50ZiAoIiVjIiwgaGV4ZGlnaXRbKmkgPj4gNF0pOworICAgICAgcHJpbnRmICgiJWMiLCBoZXhkaWdpdFsqaSAlIDE2XSk7CisgICAgICBpZiAoISgoaSArIDEgLSAodW5zaWduZWQgY2hhciAqKSBJTk9ERSkgJSAxNikpCisJeworCSAgcHJpbnRmICgiXG4iKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcHJpbnRmICgiICIpOworCX0KKyAgICB9CisjZW5kaWYgLyogRTJERUJVRyAqLworICB3aGlsZSAobGVuID4gMCkKKyAgICB7CisgICAgICAvKiBmaW5kIHRoZSAobG9naWNhbCkgYmxvY2sgY29tcG9uZW50IG9mIG91ciBsb2NhdGlvbiAqLworICAgICAgbG9naWNhbF9ibG9jayA9IGZpbGVwb3MgPj4gRVhUMl9CTE9DS19TSVpFX0JJVFMgKFNVUEVSQkxPQ0spOworICAgICAgb2Zmc2V0ID0gZmlsZXBvcyAmIChFWFQyX0JMT0NLX1NJWkUgKFNVUEVSQkxPQ0spIC0gMSk7CisgICAgICBtYXAgPSBleHQyZnNfYmxvY2tfbWFwIChsb2dpY2FsX2Jsb2NrKTsKKyNpZmRlZiBFMkRFQlVHCisgICAgICBwcmludGYgKCJtYXA9JWRcbiIsIG1hcCk7CisjZW5kaWYgLyogRTJERUJVRyAqLworICAgICAgaWYgKG1hcCA8IDApCisJYnJlYWs7CisKKyAgICAgIHNpemUgPSBFWFQyX0JMT0NLX1NJWkUgKFNVUEVSQkxPQ0spOworICAgICAgc2l6ZSAtPSBvZmZzZXQ7CisgICAgICBpZiAoc2l6ZSA+IGxlbikKKwlzaXplID0gbGVuOworCisgICAgICBpZiAobWFwID09IDApIHsKKyAgICAgICAgbWVtc2V0ICgoY2hhciAqKSBidWYsIDAsIHNpemUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGlza19yZWFkX2Z1bmMgPSBkaXNrX3JlYWRfaG9vazsKKworICAgICAgICBkZXZyZWFkIChtYXAgKiAoRVhUMl9CTE9DS19TSVpFIChTVVBFUkJMT0NLKSAvIERFVl9CU0laRSksCisJICAgICAgICAgb2Zmc2V0LCBzaXplLCBidWYpOworCisgICAgICAgIGRpc2tfcmVhZF9mdW5jID0gTlVMTDsKKyAgICAgIH0KKworICAgICAgYnVmICs9IHNpemU7CisgICAgICBsZW4gLT0gc2l6ZTsKKyAgICAgIGZpbGVwb3MgKz0gc2l6ZTsKKyAgICAgIHJldCArPSBzaXplOworICAgIH0KKworICBpZiAoZXJybnVtKQorICAgIHJldCA9IDA7CisKKyAgcmV0dXJuIHJldDsKK30KKworCisvKiBCYXNlZCBvbjoKKyAgIGRlZl9ibGtfZm9wcyBwb2ludHMgdG8KKyAgIGJsa2Rldl9vcGVuLCB3aGljaCBjYWxscyAoSSB0aGluayk6CisgICBzeXNfb3BlbigpCisgICBkb19vcGVuKCkKKyAgIG9wZW5fbmFtZWkoKQorICAgZGlyX25hbWVpKCkgd2hpY2ggYWNjZXNzZXMgY3VycmVudC0+ZnMtPnJvb3QKKyAgICAgZnMtPnJvb3Qgd2FzIHNldCBkdXJpbmcgb3JpZ2luYWwgbW91bnQ6CisgICAgIChzb21ldGhpbmcpLi4uIHdoaWNoIGNhbGxzIChJIHRoaW5rKToKKyAgICAgZXh0Ml9yZWFkX3N1cGVyKCkKKyAgICAgaWdldCgpCisgICAgIF9faWdldCgpCisgICAgIHJlYWRfaW5vZGUoKQorICAgICBleHQyX3JlYWRfaW5vZGUoKQorICAgICAgIHVzZXMgZGVzY19wZXJfYmxvY2tfYml0cywgd2hpY2ggaXMgc2V0IGluIGV4dDJfcmVhZF9zdXBlcigpCisgICAgICAgYWxzbyB1c2VzIGdyb3VwIGRlc2NyaXB0b3JzIGxvYWRlZCBkdXJpbmcgZXh0Ml9yZWFkX3N1cGVyKCkKKyAgIGxvb2t1cCgpCisgICBleHQyX2xvb2t1cCgpCisgICBleHQyX2ZpbmRfZW50cnkoKQorICAgZXh0Ml9nZXRibGsoKQorCisqLworCitzdGF0aWMgaW5saW5lCitpbnQgZXh0Ml9pc19mYXN0X3N5bWxpbmsgKHZvaWQpCit7CisgIGludCBlYV9ibG9ja3M7CisgIGVhX2Jsb2NrcyA9IElOT0RFLT5pX2ZpbGVfYWNsID8gRVhUMl9CTE9DS19TSVpFIChTVVBFUkJMT0NLKSAvIERFVl9CU0laRSA6IDA7CisgIHJldHVybiBJTk9ERS0+aV9ibG9ja3MgPT0gZWFfYmxvY2tzOworfQorCisvKiBwcmVjb25kaXRpb25zOiBleHQyZnNfbW91bnQgYWxyZWFkeSBleGVjdXRlZCwgdGhlcmVmb3JlIHN1cGJsayBpbiBidWZmZXIKKyAqICAga25vd24gYXMgU1VQRVJCTE9DSworICogcmV0dXJuczogMCBpZiBlcnJvciwgbm9uemVybyBpZmYgd2Ugd2VyZSBhYmxlIHRvIGZpbmQgdGhlIGZpbGUgc3VjY2Vzc2Z1bGx5CisgKiBwb3N0Y29uZGl0aW9uczogb24gYSBub256ZXJvIHJldHVybiwgYnVmZmVyIGtub3duIGFzIElOT0RFIGNvbnRhaW5zIHRoZQorICogICBpbm9kZSBvZiB0aGUgZmlsZSB3ZSB3ZXJlIHRyeWluZyB0byBsb29rIHVwCisgKiBzaWRlIGVmZmVjdHM6IG1lc3NlcyB1cCBHUk9VUF9ERVNDIGJ1ZmZlciBhcmVhCisgKi8KK2ludAorZXh0MmZzX2RpciAoY2hhciAqZGlybmFtZSkKK3sKKyAgaW50IGN1cnJlbnRfaW5vID0gRVhUMl9ST09UX0lOTzsJLyogc3RhcnQgYXQgdGhlIHJvb3QgKi8KKyAgaW50IHVwZGlyX2lubyA9IGN1cnJlbnRfaW5vOwkvKiB0aGUgcGFyZW50IG9mIHRoZSBjdXJyZW50IGRpcmVjdG9yeSAqLworICBpbnQgZ3JvdXBfaWQ7CQkJLyogd2hpY2ggZ3JvdXAgdGhlIGlub2RlIGlzIGluICovCisgIGludCBncm91cF9kZXNjOwkJLyogZnMgcG9pbnRlciB0byB0aGF0IGdyb3VwICovCisgIGludCBkZXNjOwkJCS8qIGluZGV4IHdpdGhpbiB0aGF0IGdyb3VwICovCisgIGludCBpbm9fYmxrOwkJCS8qIGZzIHBvaW50ZXIgb2YgdGhlIGlub2RlJ3MgaW5mb3JtYXRpb24gKi8KKyAgaW50IHN0cl9jaGsgPSAwOwkJLyogdXNlZCB0byBob2xkIHRoZSByZXN1bHRzIG9mIGEgc3RyaW5nIGNvbXBhcmUgKi8KKyAgc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqZ2RwOworICBzdHJ1Y3QgZXh0Ml9pbm9kZSAqcmF3X2lub2RlOwkvKiBpbm9kZSBpbmZvIGNvcnJlc3BvbmRpbmcgdG8gY3VycmVudF9pbm8gKi8KKworICBjaGFyIGxpbmtidWZbUEFUSF9NQVhdOwkvKiBidWZmZXIgZm9yIGZvbGxvd2luZyBzeW1ib2xpYyBsaW5rcyAqLworICBpbnQgbGlua19jb3VudCA9IDA7CisKKyAgY2hhciAqcmVzdDsKKyAgY2hhciBjaDsJCQkvKiB0ZW1wIGNoYXIgaG9sZGVyICovCisKKyAgaW50IG9mZjsJCQkvKiBvZmZzZXQgd2l0aGluIGJsb2NrIG9mIGRpcmVjdG9yeSBlbnRyeSAob2ZmIG1vZCBibG9ja3NpemUpICovCisgIGludCBsb2M7CQkJLyogbG9jYXRpb24gd2l0aGluIGEgZGlyZWN0b3J5ICovCisgIGludCBibGs7CQkJLyogd2hpY2ggZGF0YSBibGsgd2l0aGluIGRpciBlbnRyeSAob2ZmIGRpdiBibG9ja3NpemUpICovCisgIGxvbmcgbWFwOwkJCS8qIGZzIHBvaW50ZXIgb2YgYSBwYXJ0aWN1bGFyIGJsb2NrIGZyb20gZGlyIGVudHJ5ICovCisgIHN0cnVjdCBleHQyX2Rpcl9lbnRyeSAqZHA7CS8qIHBvaW50ZXIgdG8gZGlyZWN0b3J5IGVudHJ5ICovCisjaWZkZWYgRTJERUJVRworICB1bnNpZ25lZCBjaGFyICppOworI2VuZGlmCS8qIEUyREVCVUcgKi8KKworICAvKiBsb29wIGludmFyaWFudHM6CisgICAgIGN1cnJlbnRfaW5vID0gaW5vZGUgdG8gbG9va3VwCisgICAgIGRpcm5hbWUgPSBwb2ludGVyIHRvIGZpbGVuYW1lIGNvbXBvbmVudCB3ZSBhcmUgY3VyIGxvb2tpbmcgdXAgd2l0aGluCisgICAgIHRoZSBkaXJlY3Rvcnkga25vd24gcG9pbnRlZCB0byBieSBjdXJyZW50X2lubyAoaWYgYW55KQorICAgKi8KKworICB3aGlsZSAoMSkKKyAgICB7CisjaWZkZWYgRTJERUJVRworICAgICAgcHJpbnRmICgiaW5vZGUgJWRcbiIsIGN1cnJlbnRfaW5vKTsKKyAgICAgIHByaW50ZiAoImRpcm5hbWU9JXNcbiIsIGRpcm5hbWUpOworI2VuZGlmIC8qIEUyREVCVUcgKi8KKworICAgICAgLyogbG9vayB1cCBhbiBpbm9kZSAqLworICAgICAgZ3JvdXBfaWQgPSAoY3VycmVudF9pbm8gLSAxKSAvIChTVVBFUkJMT0NLLT5zX2lub2Rlc19wZXJfZ3JvdXApOworICAgICAgZ3JvdXBfZGVzYyA9IGdyb3VwX2lkID4+IGxvZzIgKEVYVDJfREVTQ19QRVJfQkxPQ0sgKFNVUEVSQkxPQ0spKTsKKyAgICAgIGRlc2MgPSBncm91cF9pZCAmIChFWFQyX0RFU0NfUEVSX0JMT0NLIChTVVBFUkJMT0NLKSAtIDEpOworI2lmZGVmIEUyREVCVUcKKyAgICAgIHByaW50ZiAoImlwZz0lZCwgZHBiPSVkXG4iLCBTVVBFUkJMT0NLLT5zX2lub2Rlc19wZXJfZ3JvdXAsCisJICAgICAgRVhUMl9ERVNDX1BFUl9CTE9DSyAoU1VQRVJCTE9DSykpOworICAgICAgcHJpbnRmICgiZ3JvdXBfaWQ9JWQgZ3JvdXBfZGVzYz0lZCBkZXNjPSVkXG4iLCBncm91cF9pZCwgZ3JvdXBfZGVzYywgZGVzYyk7CisjZW5kaWYgLyogRTJERUJVRyAqLworICAgICAgaWYgKCFleHQyX3JkZnNiICgKKwkJCShXSElDSF9TVVBFUiArIGdyb3VwX2Rlc2MgKyBTVVBFUkJMT0NLLT5zX2ZpcnN0X2RhdGFfYmxvY2spLAorCQkJKGludCkgR1JPVVBfREVTQykpCisJeworCSAgcmV0dXJuIDA7CisJfQorICAgICAgZ2RwID0gR1JPVVBfREVTQzsKKyAgICAgIGlub19ibGsgPSBnZHBbZGVzY10uYmdfaW5vZGVfdGFibGUgKworCSgoKGN1cnJlbnRfaW5vIC0gMSkgJSAoU1VQRVJCTE9DSy0+c19pbm9kZXNfcGVyX2dyb3VwKSkKKwkgPj4gbG9nMiAoRVhUMl9CTE9DS19TSVpFIChTVVBFUkJMT0NLKSAvIHNpemVvZiAoc3RydWN0IGV4dDJfaW5vZGUpKSk7CisjaWZkZWYgRTJERUJVRworICAgICAgcHJpbnRmICgiaW5vZGUgdGFibGUgZnNibG9jaz0lZFxuIiwgaW5vX2Jsayk7CisjZW5kaWYgLyogRTJERUJVRyAqLworICAgICAgaWYgKCFleHQyX3JkZnNiIChpbm9fYmxrLCAoaW50KSBJTk9ERSkpCisJeworCSAgcmV0dXJuIDA7CisJfQorCisgICAgICAvKiByZXNldCBpbmRpcmVjdCBibG9ja3MhICovCisgICAgICBtYXBibG9jazIgPSBtYXBibG9jazEgPSAtMTsKKworICAgICAgcmF3X2lub2RlID0gSU5PREUgKworCSgoY3VycmVudF9pbm8gLSAxKQorCSAmIChFWFQyX0JMT0NLX1NJWkUgKFNVUEVSQkxPQ0spIC8gc2l6ZW9mIChzdHJ1Y3QgZXh0Ml9pbm9kZSkgLSAxKSk7CisjaWZkZWYgRTJERUJVRworICAgICAgcHJpbnRmICgiaXBiPSVkLCBzaXplb2YoaW5vZGUpPSVkXG4iLAorCSAgICAgIChFWFQyX0JMT0NLX1NJWkUgKFNVUEVSQkxPQ0spIC8gc2l6ZW9mIChzdHJ1Y3QgZXh0Ml9pbm9kZSkpLAorCSAgICAgIHNpemVvZiAoc3RydWN0IGV4dDJfaW5vZGUpKTsKKyAgICAgIHByaW50ZiAoImlub2RlPSV4LCByYXdfaW5vZGU9JXhcbiIsIElOT0RFLCByYXdfaW5vZGUpOworICAgICAgcHJpbnRmICgib2Zmc2V0IGludG8gaW5vZGUgdGFibGUgYmxvY2s9JWRcbiIsIChpbnQpIHJhd19pbm9kZSAtIChpbnQpIElOT0RFKTsKKyAgICAgIGZvciAoaSA9ICh1bnNpZ25lZCBjaGFyICopIElOT0RFOyBpIDw9ICh1bnNpZ25lZCBjaGFyICopIHJhd19pbm9kZTsKKwkgICBpKyspCisJeworCSAgcHJpbnRmICgiJWMiLCAiMDEyMzQ1Njc4OWFiY2RlZiJbKmkgPj4gNF0pOworCSAgcHJpbnRmICgiJWMiLCAiMDEyMzQ1Njc4OWFiY2RlZiJbKmkgJSAxNl0pOworCSAgaWYgKCEoKGkgKyAxIC0gKHVuc2lnbmVkIGNoYXIgKikgSU5PREUpICUgMTYpKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiXG4iKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcHJpbnRmICgiICIpOworCSAgICB9CisJfQorICAgICAgcHJpbnRmICgiZmlyc3Qgd29yZD0leFxuIiwgKigoaW50ICopIHJhd19pbm9kZSkpOworI2VuZGlmIC8qIEUyREVCVUcgKi8KKworICAgICAgLyogY29weSBpbm9kZSB0byBmaXhlZCBsb2NhdGlvbiAqLworICAgICAgbWVtbW92ZSAoKHZvaWQgKikgSU5PREUsICh2b2lkICopIHJhd19pbm9kZSwgc2l6ZW9mIChzdHJ1Y3QgZXh0Ml9pbm9kZSkpOworCisjaWZkZWYgRTJERUJVRworICAgICAgcHJpbnRmICgiZmlyc3Qgd29yZD0leFxuIiwgKigoaW50ICopIElOT0RFKSk7CisjZW5kaWYgLyogRTJERUJVRyAqLworCisgICAgICAvKiBJZiB3ZSd2ZSBnb3QgYSBzeW1ib2xpYyBsaW5rLCB0aGVuIGNoYXNlIGl0LiAqLworICAgICAgaWYgKFNfSVNMTksgKElOT0RFLT5pX21vZGUpKQorCXsKKwkgIGludCBsZW47CisJICBpZiAoKytsaW5rX2NvdW50ID4gTUFYX0xJTktfQ09VTlQpCisJICAgIHsKKwkgICAgICBlcnJudW0gPSBFUlJfU1lNTElOS19MT09QOworCSAgICAgIHJldHVybiAwOworCSAgICB9CisKKwkgIC8qIEZpbmQgb3V0IGhvdyBsb25nIG91ciByZW1haW5pbmcgbmFtZSBpcy4gKi8KKwkgIGxlbiA9IDA7CisJICB3aGlsZSAoZGlybmFtZVtsZW5dICYmICFpc3NwYWNlIChkaXJuYW1lW2xlbl0pKQorCSAgICBsZW4rKzsKKworCSAgLyogR2V0IHRoZSBzeW1saW5rIHNpemUuICovCisJICBmaWxlbWF4ID0gKElOT0RFLT5pX3NpemUpOworCSAgaWYgKGZpbGVtYXggKyBsZW4gPiBzaXplb2YgKGxpbmtidWYpIC0gMikKKwkgICAgeworCSAgICAgIGVycm51bSA9IEVSUl9GSUxFTEVOR1RIOworCSAgICAgIHJldHVybiAwOworCSAgICB9CisKKwkgIGlmIChsZW4pCisJICAgIHsKKwkgICAgICAvKiBDb3B5IHRoZSByZW1haW5pbmcgbmFtZSB0byB0aGUgZW5kIG9mIHRoZSBzeW1saW5rIGRhdGEuCisJICAgICAgICAgTm90ZSB0aGF0IERJUk5BTUUgYW5kIExJTktCVUYgbWF5IG92ZXJsYXAhICovCisJICAgICAgbWVtbW92ZSAobGlua2J1ZiArIGZpbGVtYXgsIGRpcm5hbWUsIGxlbik7CisJICAgIH0KKwkgIGxpbmtidWZbZmlsZW1heCArIGxlbl0gPSAnXDAnOworCisJICAvKiBSZWFkIHRoZSBzeW1saW5rIGRhdGEuICovCisJICBpZiAoISBleHQyX2lzX2Zhc3Rfc3ltbGluayAoKSkKKwkgICAgeworCSAgICAgIC8qIFJlYWQgdGhlIG5lY2Vzc2FyeSBibG9ja3MsIGFuZCByZXNldCB0aGUgZmlsZSBwb2ludGVyLiAqLworCSAgICAgIGxlbiA9IGdydWJfcmVhZCAobGlua2J1ZiwgZmlsZW1heCk7CisJICAgICAgZmlsZXBvcyA9IDA7CisJICAgICAgaWYgKCFsZW4pCisJCXJldHVybiAwOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBDb3B5IHRoZSBkYXRhIGRpcmVjdGx5IGZyb20gdGhlIGlub2RlLiAqLworCSAgICAgIGxlbiA9IGZpbGVtYXg7CisJICAgICAgbWVtbW92ZSAobGlua2J1ZiwgKGNoYXIgKikgSU5PREUtPmlfYmxvY2ssIGxlbik7CisJICAgIH0KKworI2lmZGVmIEUyREVCVUcKKwkgIHByaW50ZiAoInN5bWxpbms9JXNcbiIsIGxpbmtidWYpOworI2VuZGlmCisKKwkgIGRpcm5hbWUgPSBsaW5rYnVmOworCSAgaWYgKCpkaXJuYW1lID09ICcvJykKKwkgICAgeworCSAgICAgIC8qIEl0J3MgYW4gYWJzb2x1dGUgbGluaywgc28gbG9vayBpdCB1cCBpbiByb290LiAqLworCSAgICAgIGN1cnJlbnRfaW5vID0gRVhUMl9ST09UX0lOTzsKKwkgICAgICB1cGRpcl9pbm8gPSBjdXJyZW50X2lubzsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogUmVsYXRpdmUsIHNvIGxvb2sgaXQgdXAgaW4gb3VyIHBhcmVudCBkaXJlY3RvcnkuICovCisJICAgICAgY3VycmVudF9pbm8gPSB1cGRpcl9pbm87CisJICAgIH0KKworCSAgLyogVHJ5IGFnYWluIHVzaW5nIHRoZSBuZXcgbmFtZS4gKi8KKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogaWYgZW5kIG9mIGZpbGVuYW1lLCBJTk9ERSBwb2ludHMgdG8gdGhlIGZpbGUncyBpbm9kZSAqLworICAgICAgaWYgKCEqZGlybmFtZSB8fCBpc3NwYWNlICgqZGlybmFtZSkpCisJeworCSAgaWYgKCFTX0lTUkVHIChJTk9ERS0+aV9tb2RlKSkKKwkgICAgeworCSAgICAgIGVycm51bSA9IEVSUl9CQURfRklMRVRZUEU7CisJICAgICAgcmV0dXJuIDA7CisJICAgIH0KKworCSAgZmlsZW1heCA9IChJTk9ERS0+aV9zaXplKTsKKwkgIHJldHVybiAxOworCX0KKworICAgICAgLyogZWxzZSB3ZSBoYXZlIHRvIHRyYXZlcnNlIGEgZGlyZWN0b3J5ICovCisgICAgICB1cGRpcl9pbm8gPSBjdXJyZW50X2lubzsKKworICAgICAgLyogc2tpcCBvdmVyIHNsYXNoZXMgKi8KKyAgICAgIHdoaWxlICgqZGlybmFtZSA9PSAnLycpCisJZGlybmFtZSsrOworCisgICAgICAvKiBpZiB0aGlzIGlzbid0IGEgZGlyZWN0b3J5IG9mIHN1ZmZpY2llbnQgc2l6ZSB0byBob2xkIG91ciBmaWxlLCBhYm9ydCAqLworICAgICAgaWYgKCEoSU5PREUtPmlfc2l6ZSkgfHwgIVNfSVNESVIgKElOT0RFLT5pX21vZGUpKQorCXsKKwkgIGVycm51bSA9IEVSUl9CQURfRklMRVRZUEU7CisJICByZXR1cm4gMDsKKwl9CisKKyAgICAgIC8qIHNraXAgdG8gbmV4dCBzbGFzaCBvciBlbmQgb2YgZmlsZW5hbWUgKHNwYWNlKSAqLworICAgICAgZm9yIChyZXN0ID0gZGlybmFtZTsgKGNoID0gKnJlc3QpICYmICFpc3NwYWNlIChjaCkgJiYgY2ggIT0gJy8nOworCSAgIHJlc3QrKyk7CisKKyAgICAgIC8qIGxvb2sgdGhyb3VnaCB0aGlzIGRpcmVjdG9yeSBhbmQgZmluZCB0aGUgbmV4dCBmaWxlbmFtZSBjb21wb25lbnQgKi8KKyAgICAgIC8qIGludmFyaWFudDogcmVzdCBwb2ludHMgdG8gc2xhc2ggYWZ0ZXIgdGhlIG5leHQgZmlsZW5hbWUgY29tcG9uZW50ICovCisgICAgICAqcmVzdCA9IDA7CisgICAgICBsb2MgPSAwOworCisgICAgICBkbworCXsKKworI2lmZGVmIEUyREVCVUcKKwkgIHByaW50ZiAoImRpcm5hbWU9JXMsIHJlc3Q9JXMsIGxvYz0lZFxuIiwgZGlybmFtZSwgcmVzdCwgbG9jKTsKKyNlbmRpZiAvKiBFMkRFQlVHICovCisKKwkgIC8qIGlmIG91ciBsb2NhdGlvbi9ieXRlIG9mZnNldCBpbnRvIHRoZSBkaXJlY3RvcnkgZXhjZWVkcyB0aGUgc2l6ZSwKKwkgICAgIGdpdmUgdXAgKi8KKwkgIGlmIChsb2MgPj0gSU5PREUtPmlfc2l6ZSkKKwkgICAgeworCSAgICAgIGlmIChwcmludF9wb3NzaWJpbGl0aWVzIDwgMCkKKwkJeworIyBpZiAwCisJCSAgcHV0Y2hhciAoJ1xuJyk7CisjIGVuZGlmCisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBlcnJudW0gPSBFUlJfRklMRV9OT1RfRk9VTkQ7CisJCSAgKnJlc3QgPSBjaDsKKwkJfQorCSAgICAgIHJldHVybiAocHJpbnRfcG9zc2liaWxpdGllcyA8IDApOworCSAgICB9CisKKwkgIC8qIGVsc2UsIGZpbmQgdGhlIChsb2dpY2FsKSBibG9jayBjb21wb25lbnQgb2Ygb3VyIGxvY2F0aW9uICovCisJICBibGsgPSBsb2MgPj4gRVhUMl9CTE9DS19TSVpFX0JJVFMgKFNVUEVSQkxPQ0spOworCisJICAvKiB3ZSBrbm93IHdoaWNoIGxvZ2ljYWwgYmxvY2sgb2YgdGhlIGRpcmVjdG9yeSBlbnRyeSB3ZSBhcmUgbG9va2luZworCSAgICAgZm9yLCBub3cgd2UgaGF2ZSB0byB0cmFuc2xhdGUgdGhhdCB0byB0aGUgcGh5c2ljYWwgKGZzKSBibG9jayBvbgorCSAgICAgdGhlIGRpc2sgKi8KKwkgIG1hcCA9IGV4dDJmc19ibG9ja19tYXAgKGJsayk7CisjaWZkZWYgRTJERUJVRworCSAgcHJpbnRmICgiZnMgYmxvY2s9JWRcbiIsIG1hcCk7CisjZW5kaWYgLyogRTJERUJVRyAqLworCSAgbWFwYmxvY2syID0gLTE7CisJICBpZiAoKG1hcCA8IDApIHx8ICFleHQyX3JkZnNiIChtYXAsIERBVEFCTE9DSzIpKQorCSAgICB7CisJICAgICAgZXJybnVtID0gRVJSX0ZTWVNfQ09SUlVQVDsKKwkgICAgICAqcmVzdCA9IGNoOworCSAgICAgIHJldHVybiAwOworCSAgICB9CisJICBvZmYgPSBsb2MgJiAoRVhUMl9CTE9DS19TSVpFIChTVVBFUkJMT0NLKSAtIDEpOworCSAgZHAgPSAoc3RydWN0IGV4dDJfZGlyX2VudHJ5ICopIChEQVRBQkxPQ0syICsgb2ZmKTsKKwkgIC8qIGFkdmFuY2UgbG9jIHByZW1hdHVyZWx5IHRvIG5leHQgb24tZGlzayBkaXJlY3RvcnkgZW50cnkgICovCisJICBsb2MgKz0gZHAtPnJlY19sZW47CisKKwkgIC8qIE5PVEU6IGV4dDJmcyBmaWxlbmFtZXMgYXJlIE5PVCBudWxsLXRlcm1pbmF0ZWQgKi8KKworI2lmZGVmIEUyREVCVUcKKwkgIHByaW50ZiAoImRpcmVjdG9yeSBlbnRyeSBpbm89JWRcbiIsIGRwLT5pbm9kZSk7CisJICBpZiAoZHAtPmlub2RlKQorCSAgICBwcmludGYgKCJlbnRyeT0lc1xuIiwgZHAtPm5hbWUpOworI2VuZGlmIC8qIEUyREVCVUcgKi8KKworCSAgaWYgKGRwLT5pbm9kZSkKKwkgICAgeworCSAgICAgIGludCBzYXZlZF9jID0gZHAtPm5hbWVbZHAtPm5hbWVfbGVuXTsKKworCSAgICAgIGRwLT5uYW1lW2RwLT5uYW1lX2xlbl0gPSAwOworCSAgICAgIHN0cl9jaGsgPSBzdWJzdHJpbmcgKGRpcm5hbWUsIGRwLT5uYW1lKTsKKworIyBpZm5kZWYgU1RBR0UxXzUKKwkgICAgICBpZiAocHJpbnRfcG9zc2liaWxpdGllcyAmJiBjaCAhPSAnLycKKwkJICAmJiAoISpkaXJuYW1lIHx8IHN0cl9jaGsgPD0gMCkpCisJCXsKKwkJICBpZiAocHJpbnRfcG9zc2liaWxpdGllcyA+IDApCisJCSAgICBwcmludF9wb3NzaWJpbGl0aWVzID0gLXByaW50X3Bvc3NpYmlsaXRpZXM7CisJCSAgcHJpbnRfYV9jb21wbGV0aW9uIChkcC0+bmFtZSk7CisJCX0KKyMgZW5kaWYKKworCSAgICAgIGRwLT5uYW1lW2RwLT5uYW1lX2xlbl0gPSBzYXZlZF9jOworCSAgICB9CisKKwl9CisgICAgICB3aGlsZSAoIWRwLT5pbm9kZSB8fCAoc3RyX2NoayB8fCAocHJpbnRfcG9zc2liaWxpdGllcyAmJiBjaCAhPSAnLycpKSk7CisKKyAgICAgIGN1cnJlbnRfaW5vID0gZHAtPmlub2RlOworICAgICAgKihkaXJuYW1lID0gcmVzdCkgPSBjaDsKKyAgICB9CisgIC8qIG5ldmVyIGdldCBoZXJlICovCit9CisKKyNlbmRpZiAvKiBGU1lTX0VYVDJfRlMgKi8KZGlmZiAtLWdpdCBhL3N0YWdlMi9mc3lzX2ZhdC5jIGIvc3RhZ2UyL2ZzeXNfZmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQwZTY1OAotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMi9mc3lzX2ZhdC5jCkBAIC0wLDAgKzEsNDg4IEBACisvKgorICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSwyMDA1ICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZkZWYgRlNZU19GQVQKKworI2luY2x1ZGUgInNoYXJlZC5oIgorI2luY2x1ZGUgImZpbGVzeXMuaCIKKyNpbmNsdWRlICJmYXQuaCIKKworc3RydWN0IGZhdF9zdXBlcmJsb2NrIAoreworICBpbnQgZmF0X29mZnNldDsKKyAgaW50IGZhdF9sZW5ndGg7CisgIGludCBmYXRfc2l6ZTsKKyAgaW50IHJvb3Rfb2Zmc2V0OworICBpbnQgcm9vdF9tYXg7CisgIGludCBkYXRhX29mZnNldDsKKyAgCisgIGludCBudW1fc2VjdG9yczsKKyAgaW50IG51bV9jbHVzdDsKKyAgaW50IGNsdXN0X2VvZl9tYXJrZXI7CisgIGludCBzZWN0c19wZXJfY2x1c3Q7CisgIGludCBzZWN0c2l6ZV9iaXRzOworICBpbnQgY2x1c3RzaXplX2JpdHM7CisgIGludCByb290X2NsdXN0ZXI7CisgIAorICBpbnQgY2FjaGVkX2ZhdDsKKyAgaW50IGZpbGVfY2x1c3RlcjsKKyAgaW50IGN1cnJlbnRfY2x1c3Rlcl9udW07CisgIGludCBjdXJyZW50X2NsdXN0ZXI7Cit9OworCisvKiBwb2ludGVyKHMpIGludG8gZmlsZXN5c3RlbSBpbmZvIGJ1ZmZlciBmb3IgRE9TIHN0dWZmICovCisjZGVmaW5lIEZBVF9TVVBFUiAoIChzdHJ1Y3QgZmF0X3N1cGVyYmxvY2sgKikgXAorIAkJICAgICggRlNZU19CVUYgKyAzMjI1NikgKS8qIDUxMiBieXRlcyBsb25nICovCisjZGVmaW5lIEZBVF9CVUYgICAoIEZTWVNfQlVGICsgMzAyMDggKQkvKiA0IHNlY3RvciBGQVQgYnVmZmVyICovCisjZGVmaW5lIE5BTUVfQlVGICAoIEZTWVNfQlVGICsgMjkxODQgKQkvKiBGaWxlbmFtZSBidWZmZXIgKDgzMyBieXRlcykgKi8KKworI2RlZmluZSBGQVRfQ0FDSEVfU0laRSAyMDQ4CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcKK2xvZzIgKHVuc2lnbmVkIGxvbmcgd29yZCkKK3sKKyAgX19hc21fXyAoImJzZmwgJTEsJTAiCisJICAgOiAiPXIiICh3b3JkKQorCSAgIDogInIiICh3b3JkKSk7CisgIHJldHVybiB3b3JkOworfQorCitpbnQKK2ZhdF9tb3VudCAodm9pZCkKK3sKKyAgc3RydWN0IGZhdF9icGIgYnBiOworICBfX3UzMiBtYWdpYywgZmlyc3RfZmF0OworICAKKyAgLyogQ2hlY2sgcGFydGl0aW9uIHR5cGUgZm9yIGhhcmRkaXNrICovCisgIGlmICgoKGN1cnJlbnRfZHJpdmUgJiAweDgwKSB8fCAoY3VycmVudF9zbGljZSAhPSAwKSkKKyAgICAgICYmICEgSVNfUENfU0xJQ0VfVFlQRV9GQVQgKGN1cnJlbnRfc2xpY2UpCisgICAgICAmJiAoISBJU19QQ19TTElDRV9UWVBFX0JTRF9XSVRIX0ZTIChjdXJyZW50X3NsaWNlLCBGU19NU0RPUykpKQorICAgIHJldHVybiAwOworICAKKyAgLyogUmVhZCBicGIgKi8KKyAgaWYgKCEgZGV2cmVhZCAoMCwgMCwgc2l6ZW9mIChicGIpLCAoY2hhciAqKSAmYnBiKSkKKyAgICByZXR1cm4gMDsKKworICAvKiBDaGVjayBpZiB0aGUgbnVtYmVyIG9mIHNlY3RvcnMgcGVyIGNsdXN0ZXIgaXMgemVybyBoZXJlLCB0byBhdm9pZAorICAgICB6ZXJvIGRpdmlzaW9uLiAgKi8KKyAgaWYgKGJwYi5zZWN0c19wZXJfY2x1c3QgPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgCisgIEZBVF9TVVBFUi0+c2VjdHNpemVfYml0cyA9IGxvZzIgKEZBVF9DVlRfVTE2IChicGIuYnl0ZXNfcGVyX3NlY3QpKTsKKyAgRkFUX1NVUEVSLT5jbHVzdHNpemVfYml0cworICAgID0gRkFUX1NVUEVSLT5zZWN0c2l6ZV9iaXRzICsgbG9nMiAoYnBiLnNlY3RzX3Blcl9jbHVzdCk7CisgIAorICAvKiBGaWxsIGluIGluZm8gYWJvdXQgc3VwZXIgYmxvY2sgKi8KKyAgRkFUX1NVUEVSLT5udW1fc2VjdG9ycyA9IEZBVF9DVlRfVTE2IChicGIuc2hvcnRfc2VjdG9ycykgCisgICAgPyBGQVRfQ1ZUX1UxNiAoYnBiLnNob3J0X3NlY3RvcnMpIDogYnBiLmxvbmdfc2VjdG9yczsKKyAgCisgIC8qIEZBVCBvZmZzZXQgYW5kIGxlbmd0aCAqLworICBGQVRfU1VQRVItPmZhdF9vZmZzZXQgPSBGQVRfQ1ZUX1UxNiAoYnBiLnJlc2VydmVkX3NlY3RzKTsKKyAgRkFUX1NVUEVSLT5mYXRfbGVuZ3RoID0gCisgICAgYnBiLmZhdF9sZW5ndGggPyBicGIuZmF0X2xlbmd0aCA6IGJwYi5mYXQzMl9sZW5ndGg7CisgIAorICAvKiBSb290ZGlyIG9mZnNldCBhbmQgbGVuZ3RoIGZvciBGQVQxMi8xNiAqLworICBGQVRfU1VQRVItPnJvb3Rfb2Zmc2V0ID0gCisgICAgRkFUX1NVUEVSLT5mYXRfb2Zmc2V0ICsgYnBiLm51bV9mYXRzICogRkFUX1NVUEVSLT5mYXRfbGVuZ3RoOworICBGQVRfU1VQRVItPnJvb3RfbWF4ID0gRkFUX0RJUkVOVFJZX0xFTkdUSCAqIEZBVF9DVlRfVTE2KGJwYi5kaXJfZW50cmllcyk7CisgIAorICAvKiBEYXRhIG9mZnNldCBhbmQgbnVtYmVyIG9mIGNsdXN0ZXJzICovCisgIEZBVF9TVVBFUi0+ZGF0YV9vZmZzZXQgPSAKKyAgICBGQVRfU1VQRVItPnJvb3Rfb2Zmc2V0CisgICAgKyAoKEZBVF9TVVBFUi0+cm9vdF9tYXggLSAxKSA+PiBGQVRfU1VQRVItPnNlY3RzaXplX2JpdHMpICsgMTsKKyAgRkFUX1NVUEVSLT5udW1fY2x1c3QgPSAKKyAgICAyICsgKChGQVRfU1VQRVItPm51bV9zZWN0b3JzIC0gRkFUX1NVUEVSLT5kYXRhX29mZnNldCkgCisJIC8gYnBiLnNlY3RzX3Blcl9jbHVzdCk7CisgIEZBVF9TVVBFUi0+c2VjdHNfcGVyX2NsdXN0ID0gYnBiLnNlY3RzX3Blcl9jbHVzdDsKKyAgCisgIGlmICghYnBiLmZhdF9sZW5ndGgpCisgICAgeworICAgICAgLyogVGhpcyBpcyBhIEZBVDMyICovCisgICAgICBpZiAoRkFUX0NWVF9VMTYoYnBiLmRpcl9lbnRyaWVzKSkKKyAJcmV0dXJuIDA7CisgICAgICAKKyAgICAgIGlmIChicGIuZmxhZ3MgJiAweDAwODApCisJeworCSAgLyogRkFUIG1pcnJvcmluZyBpcyBkaXNhYmxlZCwgZ2V0IGFjdGl2ZSBGQVQgKi8KKwkgIGludCBhY3RpdmVfZmF0ID0gYnBiLmZsYWdzICYgMHgwMDBmOworCSAgaWYgKGFjdGl2ZV9mYXQgPj0gYnBiLm51bV9mYXRzKQorCSAgICByZXR1cm4gMDsKKwkgIEZBVF9TVVBFUi0+ZmF0X29mZnNldCArPSBhY3RpdmVfZmF0ICogRkFUX1NVUEVSLT5mYXRfbGVuZ3RoOworCX0KKyAgICAgIAorICAgICAgRkFUX1NVUEVSLT5mYXRfc2l6ZSA9IDg7CisgICAgICBGQVRfU1VQRVItPnJvb3RfY2x1c3RlciA9IGJwYi5yb290X2NsdXN0ZXI7CisKKyAgICAgIC8qIFllcyB0aGUgZm9sbG93aW5nIGlzIGNvcnJlY3QuICBGQVQzMiBzaG91bGQgYmUgY2FsbGVkIEZBVDI4IDopICovCisgICAgICBGQVRfU1VQRVItPmNsdXN0X2VvZl9tYXJrZXIgPSAweGZmZmZmZjg7CisgICAgfSAKKyAgZWxzZSAKKyAgICB7CisgICAgICBpZiAoIUZBVF9TVVBFUi0+cm9vdF9tYXgpCisgCXJldHVybiAwOworICAgICAgCisgICAgICBGQVRfU1VQRVItPnJvb3RfY2x1c3RlciA9IC0xOworICAgICAgaWYgKEZBVF9TVVBFUi0+bnVtX2NsdXN0ID4gRkFUX01BWF8xMkJJVF9DTFVTVCkgCisJeworCSAgRkFUX1NVUEVSLT5mYXRfc2l6ZSA9IDQ7CisJICBGQVRfU1VQRVItPmNsdXN0X2VvZl9tYXJrZXIgPSAweGZmZjg7CisJfSAKKyAgICAgIGVsc2UKKwl7CisJICBGQVRfU1VQRVItPmZhdF9zaXplID0gMzsKKwkgIEZBVF9TVVBFUi0+Y2x1c3RfZW9mX21hcmtlciA9IDB4ZmY4OworCX0KKyAgICB9CisKKyAgLyogTm93IGRvIHNvbWUgc2FuaXR5IGNoZWNrcyAqLworICAKKyAgaWYgKEZBVF9DVlRfVTE2KGJwYi5ieXRlc19wZXJfc2VjdCkgIT0gKDEgPDwgRkFUX1NVUEVSLT5zZWN0c2l6ZV9iaXRzKQorICAgICAgfHwgRkFUX0NWVF9VMTYoYnBiLmJ5dGVzX3Blcl9zZWN0KSAhPSBTRUNUT1JfU0laRQorICAgICAgfHwgYnBiLnNlY3RzX3Blcl9jbHVzdCAhPSAoMSA8PCAoRkFUX1NVUEVSLT5jbHVzdHNpemVfYml0cworIAkJCQkgICAgICAgLSBGQVRfU1VQRVItPnNlY3RzaXplX2JpdHMpKQorICAgICAgfHwgRkFUX1NVUEVSLT5udW1fY2x1c3QgPD0gMgorICAgICAgfHwgKEZBVF9TVVBFUi0+ZmF0X3NpemUgKiBGQVRfU1VQRVItPm51bV9jbHVzdCAvICgyICogU0VDVE9SX1NJWkUpCisgCSAgPiBGQVRfU1VQRVItPmZhdF9sZW5ndGgpKQorICAgIHJldHVybiAwOworICAKKyAgLyoga2JzOiBNZWRpYSBjaGVjayBvbiBmaXJzdCBGQVQgZW50cnkgW3BvcnRlZCBmcm9tIFBVUEFdICovCisKKyAgaWYgKCFkZXZyZWFkKEZBVF9TVVBFUi0+ZmF0X29mZnNldCwgMCwKKyAgICAgICAgICAgICAgIHNpemVvZihmaXJzdF9mYXQpLCAoY2hhciAqKSZmaXJzdF9mYXQpKQorICAgIHJldHVybiAwOworCisgIGlmIChGQVRfU1VQRVItPmZhdF9zaXplID09IDgpCisgICAgeworICAgICAgZmlyc3RfZmF0ICY9IDB4MGZmZmZmZmY7CisgICAgICBtYWdpYyA9IDB4MGZmZmZmMDA7CisgICAgfQorICBlbHNlIGlmIChGQVRfU1VQRVItPmZhdF9zaXplID09IDQpCisgICAgeworICAgICAgZmlyc3RfZmF0ICY9IDB4MDAwMGZmZmY7CisgICAgICBtYWdpYyA9IDB4ZmYwMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmaXJzdF9mYXQgJj0gMHgwMDAwMGZmZjsKKyAgICAgIG1hZ2ljID0gMHgwZjAwOworICAgIH0KKworICAvKiBJZ25vcmUgdGhlIDNyZCBiaXQsIGJlY2F1c2Ugc29tZSBCSU9TZXMgYXNzaWducyAweEYwIHRvIHRoZSBtZWRpYQorICAgICBkZXNjcmlwdG9yLCBldmVuIGlmIGl0IGlzIGEgc28tY2FsbGVkIHN1cGVyZmxvcHB5IChlLmcuIGFuIFVTQiBrZXkpLgorICAgICBUaGUgY2hlY2sgbWF5IGJlIHRvbyBzdHJpY3QgZm9yIHRoaXMga2luZCBvZiBzdHVwaWQgQklPU2VzLCBhcworICAgICB0aGV5IG92ZXJ3cml0ZSB0aGUgbWVkaWEgZGVzY3JpcHRvci4gICovCisgIGlmICgoZmlyc3RfZmF0IHwgMHg4KSAhPSAobWFnaWMgfCBicGIubWVkaWEgfCAweDgpKQorICAgIHJldHVybiAwOworCisgIEZBVF9TVVBFUi0+Y2FjaGVkX2ZhdCA9IC0gMiAqIEZBVF9DQUNIRV9TSVpFOworICByZXR1cm4gMTsKK30KKworaW50CitmYXRfcmVhZCAoY2hhciAqYnVmLCBpbnQgbGVuKQoreworICBpbnQgbG9naWNhbF9jbHVzdDsKKyAgaW50IG9mZnNldDsKKyAgaW50IHJldCA9IDA7CisgIGludCBzaXplOworICAKKyAgaWYgKEZBVF9TVVBFUi0+ZmlsZV9jbHVzdGVyIDwgMCkKKyAgICB7CisgICAgICAvKiByb290IGRpcmVjdG9yeSBmb3IgZmF0MTYgKi8KKyAgICAgIHNpemUgPSBGQVRfU1VQRVItPnJvb3RfbWF4IC0gZmlsZXBvczsKKyAgICAgIGlmIChzaXplID4gbGVuKQorIAlzaXplID0gbGVuOworICAgICAgaWYgKCFkZXZyZWFkKEZBVF9TVVBFUi0+cm9vdF9vZmZzZXQsIGZpbGVwb3MsIHNpemUsIGJ1ZikpCisgCXJldHVybiAwOworICAgICAgZmlsZXBvcyArPSBzaXplOworICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorICAKKyAgbG9naWNhbF9jbHVzdCA9IGZpbGVwb3MgPj4gRkFUX1NVUEVSLT5jbHVzdHNpemVfYml0czsKKyAgb2Zmc2V0ID0gKGZpbGVwb3MgJiAoKDEgPDwgRkFUX1NVUEVSLT5jbHVzdHNpemVfYml0cykgLSAxKSk7CisgIGlmIChsb2dpY2FsX2NsdXN0IDwgRkFUX1NVUEVSLT5jdXJyZW50X2NsdXN0ZXJfbnVtKQorICAgIHsKKyAgICAgIEZBVF9TVVBFUi0+Y3VycmVudF9jbHVzdGVyX251bSA9IDA7CisgICAgICBGQVRfU1VQRVItPmN1cnJlbnRfY2x1c3RlciA9IEZBVF9TVVBFUi0+ZmlsZV9jbHVzdGVyOworICAgIH0KKyAgCisgIHdoaWxlIChsZW4gPiAwKQorICAgIHsKKyAgICAgIGludCBzZWN0b3I7CisgICAgICB3aGlsZSAobG9naWNhbF9jbHVzdCA+IEZBVF9TVVBFUi0+Y3VycmVudF9jbHVzdGVyX251bSkKKwl7CisJICAvKiBjYWxjdWxhdGUgbmV4dCBjbHVzdGVyICovCisJICBpbnQgZmF0X2VudHJ5ID0gCisJICAgIEZBVF9TVVBFUi0+Y3VycmVudF9jbHVzdGVyICogRkFUX1NVUEVSLT5mYXRfc2l6ZTsKKwkgIGludCBuZXh0X2NsdXN0ZXI7CisJICBpbnQgY2FjaGVkX3BvcyA9IChmYXRfZW50cnkgLSBGQVRfU1VQRVItPmNhY2hlZF9mYXQpOworCSAgCisJICBpZiAoY2FjaGVkX3BvcyA8IDAgfHwgCisJICAgICAgKGNhY2hlZF9wb3MgKyBGQVRfU1VQRVItPmZhdF9zaXplKSA+IDIqRkFUX0NBQ0hFX1NJWkUpCisJICAgIHsKKwkgICAgICBGQVRfU1VQRVItPmNhY2hlZF9mYXQgPSAoZmF0X2VudHJ5ICYgfigyKlNFQ1RPUl9TSVpFIC0gMSkpOworCSAgICAgIGNhY2hlZF9wb3MgPSAoZmF0X2VudHJ5IC0gRkFUX1NVUEVSLT5jYWNoZWRfZmF0KTsKKwkgICAgICBzZWN0b3IgPSBGQVRfU1VQRVItPmZhdF9vZmZzZXQKKwkJKyBGQVRfU1VQRVItPmNhY2hlZF9mYXQgLyAoMipTRUNUT1JfU0laRSk7CisJICAgICAgaWYgKCFkZXZyZWFkIChzZWN0b3IsIDAsIEZBVF9DQUNIRV9TSVpFLCAoY2hhciopIEZBVF9CVUYpKQorCQlyZXR1cm4gMDsKKwkgICAgfQorCSAgbmV4dF9jbHVzdGVyID0gKiAodW5zaWduZWQgbG9uZyAqKSAoRkFUX0JVRiArIChjYWNoZWRfcG9zID4+IDEpKTsKKwkgIGlmIChGQVRfU1VQRVItPmZhdF9zaXplID09IDMpCisJICAgIHsKKwkgICAgICBpZiAoY2FjaGVkX3BvcyAmIDEpCisJCW5leHRfY2x1c3RlciA+Pj0gNDsKKwkgICAgICBuZXh0X2NsdXN0ZXIgJj0gMHhGRkY7CisJICAgIH0KKwkgIGVsc2UgaWYgKEZBVF9TVVBFUi0+ZmF0X3NpemUgPT0gNCkKKwkgICAgbmV4dF9jbHVzdGVyICY9IDB4RkZGRjsKKwkgIAorCSAgaWYgKG5leHRfY2x1c3RlciA+PSBGQVRfU1VQRVItPmNsdXN0X2VvZl9tYXJrZXIpCisJICAgIHJldHVybiByZXQ7CisJICBpZiAobmV4dF9jbHVzdGVyIDwgMiB8fCBuZXh0X2NsdXN0ZXIgPj0gRkFUX1NVUEVSLT5udW1fY2x1c3QpCisJICAgIHsKKwkgICAgICBlcnJudW0gPSBFUlJfRlNZU19DT1JSVVBUOworCSAgICAgIHJldHVybiAwOworCSAgICB9CisJICAKKwkgIEZBVF9TVVBFUi0+Y3VycmVudF9jbHVzdGVyID0gbmV4dF9jbHVzdGVyOworCSAgRkFUX1NVUEVSLT5jdXJyZW50X2NsdXN0ZXJfbnVtKys7CisJfQorICAgICAgCisgICAgICBzZWN0b3IgPSBGQVRfU1VQRVItPmRhdGFfb2Zmc2V0ICsKKwkoKEZBVF9TVVBFUi0+Y3VycmVudF9jbHVzdGVyIC0gMikgPDwgKEZBVF9TVVBFUi0+Y2x1c3RzaXplX2JpdHMKKyAJCQkJCSAgICAgIC0gRkFUX1NVUEVSLT5zZWN0c2l6ZV9iaXRzKSk7CisgICAgICBzaXplID0gKDEgPDwgRkFUX1NVUEVSLT5jbHVzdHNpemVfYml0cykgLSBvZmZzZXQ7CisgICAgICBpZiAoc2l6ZSA+IGxlbikKKwlzaXplID0gbGVuOworICAgICAgCisgICAgICBkaXNrX3JlYWRfZnVuYyA9IGRpc2tfcmVhZF9ob29rOworICAgICAgCisgICAgICBkZXZyZWFkKHNlY3Rvciwgb2Zmc2V0LCBzaXplLCBidWYpOworICAgICAgCisgICAgICBkaXNrX3JlYWRfZnVuYyA9IE5VTEw7CisgICAgICAKKyAgICAgIGxlbiAtPSBzaXplOworICAgICAgYnVmICs9IHNpemU7CisgICAgICByZXQgKz0gc2l6ZTsKKyAgICAgIGZpbGVwb3MgKz0gc2l6ZTsKKyAgICAgIGxvZ2ljYWxfY2x1c3QrKzsKKyAgICAgIG9mZnNldCA9IDA7CisgICAgfQorICByZXR1cm4gZXJybnVtID8gMCA6IHJldDsKK30KKworaW50CitmYXRfZGlyIChjaGFyICpkaXJuYW1lKQoreworICBjaGFyICpyZXN0LCBjaCwgZGlyX2J1ZltGQVRfRElSRU5UUllfTEVOR1RIXTsKKyAgY2hhciAqZmlsZW5hbWUgPSAoY2hhciAqKSBOQU1FX0JVRjsKKyAgaW50IGF0dHJpYiA9IEZBVF9BVFRSSUJfRElSOworI2lmbmRlZiBTVEFHRTFfNQorICBpbnQgZG9fcG9zc2liaWxpdGllcyA9IDA7CisjZW5kaWYKKyAgCisgIC8qIFhYWCBJMThOOgorICAgKiB0aGUgcG9zaXRpb25zIDIsNCw2IGV0YyBhcmUgaGlnaCBieXRlcyBvZiBhIDE2IGJpdCB1bmljb2RlIGNoYXIgCisgICAqLworICBzdGF0aWMgdW5zaWduZWQgY2hhciBsb25nZGlyX3Bvc1tdID0gCisgIHsgMSwgMywgNSwgNywgOSwgMTQsIDE2LCAxOCwgMjAsIDIyLCAyNCwgMjgsIDMwIH07CisgIGludCBzbG90ID0gLTI7CisgIGludCBhbGlhc19jaGVja3N1bSA9IC0xOworICAKKyAgRkFUX1NVUEVSLT5maWxlX2NsdXN0ZXIgPSBGQVRfU1VQRVItPnJvb3RfY2x1c3RlcjsKKyAgZmlsZXBvcyA9IDA7CisgIEZBVF9TVVBFUi0+Y3VycmVudF9jbHVzdGVyX251bSA9IE1BWElOVDsKKyAgCisgIC8qIG1haW4gbG9vcCB0byBmaW5kIGRlc2lyZWQgZGlyZWN0b3J5IGVudHJ5ICovCisgbG9vcDoKKyAgCisgIC8qIGlmIHdlIGhhdmUgYSByZWFsIGZpbGUgKGFuZCB3ZSdyZSBub3QganVzdCBwcmludGluZyBwb3NzaWJpbGl0aWVzKSwKKyAgICAgdGhlbiB0aGlzIGlzIHdoZXJlIHdlIHdhbnQgdG8gZXhpdCAqLworICAKKyAgaWYgKCEqZGlybmFtZSB8fCBpc3NwYWNlICgqZGlybmFtZSkpCisgICAgeworICAgICAgaWYgKGF0dHJpYiAmIEZBVF9BVFRSSUJfRElSKQorCXsKKwkgIGVycm51bSA9IEVSUl9CQURfRklMRVRZUEU7CisJICByZXR1cm4gMDsKKwl9CisgICAgICAKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgCisgIC8qIGNvbnRpbnVlIHdpdGggdGhlIGZpbGUvZGlyZWN0b3J5IG5hbWUgaW50ZXJwcmV0YXRpb24gKi8KKyAgCisgIHdoaWxlICgqZGlybmFtZSA9PSAnLycpCisgICAgZGlybmFtZSsrOworICAKKyAgaWYgKCEoYXR0cmliICYgRkFUX0FUVFJJQl9ESVIpKQorICAgIHsKKyAgICAgIGVycm51bSA9IEVSUl9CQURfRklMRVRZUEU7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIC8qIERpcmVjdG9yaWVzIGRvbid0IGhhdmUgYSBmaWxlIHNpemUgKi8KKyAgZmlsZW1heCA9IE1BWElOVDsKKyAgCisgIGZvciAocmVzdCA9IGRpcm5hbWU7IChjaCA9ICpyZXN0KSAmJiAhaXNzcGFjZSAoY2gpICYmIGNoICE9ICcvJzsgcmVzdCsrKTsKKyAgCisgICpyZXN0ID0gMDsKKyAgCisjIGlmbmRlZiBTVEFHRTFfNQorICBpZiAocHJpbnRfcG9zc2liaWxpdGllcyAmJiBjaCAhPSAnLycpCisgICAgZG9fcG9zc2liaWxpdGllcyA9IDE7CisjIGVuZGlmCisgIAorICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpZiAoZmF0X3JlYWQgKGRpcl9idWYsIEZBVF9ESVJFTlRSWV9MRU5HVEgpICE9IEZBVF9ESVJFTlRSWV9MRU5HVEgKKwkgIHx8IGRpcl9idWZbMF0gPT0gMCkKKwl7CisJICBpZiAoIWVycm51bSkKKwkgICAgeworIyBpZm5kZWYgU1RBR0UxXzUKKwkgICAgICBpZiAocHJpbnRfcG9zc2liaWxpdGllcyA8IDApCisJCXsKKyNpZiAwCisJCSAgcHV0Y2hhciAoJ1xuJyk7CisjZW5kaWYKKwkJICByZXR1cm4gMTsKKwkJfQorIyBlbmRpZiAvKiBTVEFHRTFfNSAqLworCSAgICAgIAorCSAgICAgIGVycm51bSA9IEVSUl9GSUxFX05PVF9GT1VORDsKKwkgICAgICAqcmVzdCA9IGNoOworCSAgICB9CisJICAKKwkgIHJldHVybiAwOworCX0KKyAgICAgIAorICAgICAgaWYgKEZBVF9ESVJFTlRSWV9BVFRSSUIgKGRpcl9idWYpID09IEZBVF9BVFRSSUJfTE9OR05BTUUpCisJeworCSAgLyogVGhpcyBpcyBhIGxvbmcgZmlsZW5hbWUuICBUaGUgZmlsZW5hbWUgaXMgYnVpbGQgZnJvbSBiYWNrCisJICAgKiB0byBmcm9udCBhbmQgbWF5IHNwYW4gbXVsdGlwbGUgZW50cmllcy4gIFRvIGJpbmQgdGhlc2UKKwkgICAqIGVudHJpZXMgdG9nZXRoZXIgdGhleSBhbGwgY29udGFpbiB0aGUgc2FtZSBjaGVja3N1bSBvdmVyCisJICAgKiB0aGUgc2hvcnQgYWxpYXMuCisJICAgKgorCSAgICogVGhlIGlkIGZpZWxkIHRlbGxzIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGVudHJ5ICh0aGUgbGFzdAorCSAgICogcGFydCkgb2YgdGhlIGxvbmcgZmlsZW5hbWUsIGFuZCBhbHNvIGF0IHdoaWNoIG9mZnNldCB0aGlzCisJICAgKiBiZWxvbmdzLgorCSAgICoKKwkgICAqIFdlIGp1c3Qgd3JpdGUgdGhlIHBhcnQgb2YgdGhlIGxvbmcgZmlsZW5hbWUgdGhpcyBlbnRyeQorCSAgICogZGVzY3JpYmVzIGFuZCBjb250aW51ZSB3aXRoIHRoZSBuZXh0IGRpciBlbnRyeS4KKwkgICAqLworCSAgaW50IGksIG9mZnNldDsKKwkgIHVuc2lnbmVkIGNoYXIgaWQgPSBGQVRfTE9OR0RJUl9JRChkaXJfYnVmKTsKKwkgIAorCSAgaWYgKChpZCAmIDB4NDApKSAKKwkgICAgeworCSAgICAgIGlkICY9IDB4M2Y7CisJICAgICAgc2xvdCA9IGlkOworCSAgICAgIGZpbGVuYW1lW3Nsb3QgKiAxM10gPSAwOworCSAgICAgIGFsaWFzX2NoZWNrc3VtID0gRkFUX0xPTkdESVJfQUxJQVNDSEVDS1NVTShkaXJfYnVmKTsKKwkgICAgfSAKKwkgIAorCSAgaWYgKGlkICE9IHNsb3QgfHwgc2xvdCA9PSAwCisJICAgICAgfHwgYWxpYXNfY2hlY2tzdW0gIT0gRkFUX0xPTkdESVJfQUxJQVNDSEVDS1NVTShkaXJfYnVmKSkKKwkgICAgeworCSAgICAgIGFsaWFzX2NoZWNrc3VtID0gLTE7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgIAorCSAgc2xvdC0tOworCSAgb2Zmc2V0ID0gc2xvdCAqIDEzOworCSAgCisJICBmb3IgKGk9MDsgaSA8IDEzOyBpKyspCisJICAgIGZpbGVuYW1lW29mZnNldCtpXSA9IGRpcl9idWZbbG9uZ2Rpcl9wb3NbaV1dOworCSAgY29udGludWU7CisJfQorICAgICAgCisgICAgICBpZiAoIUZBVF9ESVJFTlRSWV9WQUxJRCAoZGlyX2J1ZikpCisJY29udGludWU7CisgICAgICAKKyAgICAgIGlmIChhbGlhc19jaGVja3N1bSAhPSAtMSAmJiBzbG90ID09IDApCisJeworCSAgaW50IGk7CisJICB1bnNpZ25lZCBjaGFyIHN1bTsKKwkgIAorCSAgc2xvdCA9IC0yOworCSAgZm9yIChzdW0gPSAwLCBpID0gMDsgaTwgMTE7IGkrKykKKwkgICAgc3VtID0gKChzdW0gPj4gMSkgfCAoc3VtIDw8IDcpKSArIGRpcl9idWZbaV07CisJICAKKwkgIGlmIChzdW0gPT0gYWxpYXNfY2hlY2tzdW0pCisJICAgIHsKKyMgaWZuZGVmIFNUQUdFMV81CisJICAgICAgaWYgKGRvX3Bvc3NpYmlsaXRpZXMpCisJCWdvdG8gcHJpbnRfZmlsZW5hbWU7CisjIGVuZGlmIC8qIFNUQUdFMV81ICovCisJICAgICAgCisJICAgICAgaWYgKHN1YnN0cmluZyAoZGlybmFtZSwgZmlsZW5hbWUpID09IDApCisJCWJyZWFrOworCSAgICB9CisJfQorICAgICAgCisgICAgICAvKiBYWFggY29udmVydCB0byA4LjMgZmlsZW5hbWUgZm9ybWF0IGhlcmUgKi8KKyAgICAgIHsKKwlpbnQgaSwgaiwgYzsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgOCAmJiAoYyA9IGZpbGVuYW1lW2ldID0gdG9sb3dlciAoZGlyX2J1ZltpXSkpCisJICAgICAgICYmICFpc3NwYWNlIChjKTsgaSsrKTsKKwkKKwlmaWxlbmFtZVtpKytdID0gJy4nOworCQorCWZvciAoaiA9IDA7IGogPCAzICYmIChjID0gZmlsZW5hbWVbaSArIGpdID0gdG9sb3dlciAoZGlyX2J1Zls4ICsgal0pKQorCSAgICAgICAmJiAhaXNzcGFjZSAoYyk7IGorKyk7CisJCisJaWYgKGogPT0gMCkKKwkgIGktLTsKKwkKKwlmaWxlbmFtZVtpICsgal0gPSAwOworICAgICAgfQorICAgICAgCisjIGlmbmRlZiBTVEFHRTFfNQorICAgICAgaWYgKGRvX3Bvc3NpYmlsaXRpZXMpCisJeworCXByaW50X2ZpbGVuYW1lOgorCSAgaWYgKHN1YnN0cmluZyAoZGlybmFtZSwgZmlsZW5hbWUpIDw9IDApCisJICAgIHsKKwkgICAgICBpZiAocHJpbnRfcG9zc2liaWxpdGllcyA+IDApCisJCXByaW50X3Bvc3NpYmlsaXRpZXMgPSAtcHJpbnRfcG9zc2liaWxpdGllczsKKwkgICAgICBwcmludF9hX2NvbXBsZXRpb24gKGZpbGVuYW1lKTsKKwkgICAgfQorCSAgY29udGludWU7CisJfQorIyBlbmRpZiAvKiBTVEFHRTFfNSAqLworICAgICAgCisgICAgICBpZiAoc3Vic3RyaW5nIChkaXJuYW1lLCBmaWxlbmFtZSkgPT0gMCkKKwlicmVhazsKKyAgICB9CisgIAorICAqKGRpcm5hbWUgPSByZXN0KSA9IGNoOworICAKKyAgYXR0cmliID0gRkFUX0RJUkVOVFJZX0FUVFJJQiAoZGlyX2J1Zik7CisgIGZpbGVtYXggPSBGQVRfRElSRU5UUllfRklMRUxFTkdUSCAoZGlyX2J1Zik7CisgIGZpbGVwb3MgPSAwOworICBGQVRfU1VQRVItPmZpbGVfY2x1c3RlciA9IEZBVF9ESVJFTlRSWV9GSVJTVF9DTFVTVEVSIChkaXJfYnVmKTsKKyAgRkFUX1NVUEVSLT5jdXJyZW50X2NsdXN0ZXJfbnVtID0gTUFYSU5UOworICAKKyAgLyogZ28gYmFjayB0byBtYWluIGxvb3AgYXQgdG9wIG9mIGZ1bmN0aW9uICovCisgIGdvdG8gbG9vcDsKK30KKworI2VuZGlmIC8qIEZTWVNfRkFUICovCmRpZmYgLS1naXQgYS9zdGFnZTIvZnN5c19mZnMuYyBiL3N0YWdlMi9mc3lzX2Zmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZjI4MDEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFnZTIvZnN5c19mZnMuYwpAQCAtMCwwICsxLDMxMCBAQAorLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qCisgKiBFbGVtZW50cyBvZiB0aGlzIGZpbGUgd2VyZSBvcmlnaW5hbGx5IGZyb20gdGhlIEZyZWVCU0QgImJpb3Nib290IgorICogYm9vdGxvYWRlciBmaWxlICJkaXNrLmMiIGRhdGVkIDQvMTIvOTUuCisgKgorICogVGhlIGxpY2Vuc2UgYW5kIGhlYWRlciBjb21tZW50cyBmcm9tIHRoYXQgZmlsZSBhcmUgaW5jbHVkZWQgaGVyZS4KKyAqLworCisvKgorICogTWFjaCBPcGVyYXRpbmcgU3lzdGVtCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTEgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgYm90aCB0aGUgY29weXJpZ2h0CisgKiBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhlCisgKiBzb2Z0d2FyZSwgZGVyaXZhdGl2ZSB3b3JrcyBvciBtb2RpZmllZCB2ZXJzaW9ucywgYW5kIGFueSBwb3J0aW9ucworICogdGhlcmVvZiwgYW5kIHRoYXQgYm90aCBub3RpY2VzIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uCisgKgorICogQ0FSTkVHSUUgTUVMTE9OIEFMTE9XUyBGUkVFIFVTRSBPRiBUSElTIFNPRlRXQVJFIElOIElUUyAiQVMgSVMiCisgKiBDT05ESVRJT04uICBDQVJORUdJRSBNRUxMT04gRElTQ0xBSU1TIEFOWSBMSUFCSUxJVFkgT0YgQU5ZIEtJTkQgRk9SCisgKiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqCisgKiBDYXJuZWdpZSBNZWxsb24gcmVxdWVzdHMgdXNlcnMgb2YgdGhpcyBzb2Z0d2FyZSB0byByZXR1cm4gdG8KKyAqCisgKiAgU29mdHdhcmUgRGlzdHJpYnV0aW9uIENvb3JkaW5hdG9yICBvciAgU29mdHdhcmUuRGlzdHJpYnV0aW9uQENTLkNNVS5FRFUKKyAqICBTY2hvb2wgb2YgQ29tcHV0ZXIgU2NpZW5jZQorICogIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CisgKiAgUGl0dHNidXJnaCBQQSAxNTIxMy0zODkwCisgKgorICogYW55IGltcHJvdmVtZW50cyBvciBleHRlbnNpb25zIHRoYXQgdGhleSBtYWtlIGFuZCBncmFudCBDYXJuZWdpZSBNZWxsb24KKyAqIHRoZSByaWdodHMgdG8gcmVkaXN0cmlidXRlIHRoZXNlIGNoYW5nZXMuCisgKgorICoJZnJvbTogTWFjaCwgUmV2aXNpb24gMi4yICA5Mi8wNC8wNCAgMTE6MzU6NDkgIHJwZAorICoJJElkOiBmc3lzX2Zmcy5jLHYgMS4xMCAyMDAxLzExLzEyIDA2OjU3OjI5IG9rdWppIEV4cCAkCisgKi8KKworI2lmZGVmIEZTWVNfRkZTCisKKyNpbmNsdWRlICJzaGFyZWQuaCIKKworI2luY2x1ZGUgImZpbGVzeXMuaCIKKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJkaXNrX2lub2RlLmgiCisjaW5jbHVkZSAiZGlza19pbm9kZV9mZnMuaCIKKyNpbmNsdWRlICJkaXIuaCIKKyNpbmNsdWRlICJmcy5oIgorCisvKiB1c2VkIGZvciBmaWxlc3lzdGVtIG1hcCBibG9ja3MgKi8KK3N0YXRpYyBpbnQgbWFwYmxvY2s7CitzdGF0aWMgaW50IG1hcGJsb2NrX29mZnNldDsKK3N0YXRpYyBpbnQgbWFwYmxvY2tfYnNpemU7CisKKy8qIHBvaW50ZXIgdG8gc3VwZXJibG9jayAqLworI2RlZmluZSBTVVBFUkJMT0NLICgoc3RydWN0IGZzICopICggRlNZU19CVUYgKyA4MTkyICkpCisjZGVmaW5lIElOT0RFICgoc3RydWN0IGljb21tb24gKikgKCBGU1lTX0JVRiArIDE2Mzg0ICkpCisjZGVmaW5lIE1BUEJVRiAoIEZTWVNfQlVGICsgMjQ1NzYgKQorI2RlZmluZSBNQVBCVUZfTEVOIDgxOTIKKworCitpbnQKK2Zmc19tb3VudCAodm9pZCkKK3sKKyAgaW50IHJldHZhbCA9IDE7CisKKyAgaWYgKCgoKGN1cnJlbnRfZHJpdmUgJiAweDgwKSB8fCAoY3VycmVudF9zbGljZSAhPSAwKSkKKyAgICAgICAmJiAhIElTX1BDX1NMSUNFX1RZUEVfQlNEX1dJVEhfRlMgKGN1cnJlbnRfc2xpY2UsIEZTX0JTREZGUykpCisgICAgICB8fCBwYXJ0X2xlbmd0aCA8IChTQkxPQ0sgKyAoU0JTSVpFIC8gREVWX0JTSVpFKSkKKyAgICAgIHx8ICFkZXZyZWFkIChTQkxPQ0ssIDAsIFNCU0laRSwgKGNoYXIgKikgU1VQRVJCTE9DSykKKyAgICAgIHx8IFNVUEVSQkxPQ0stPmZzX21hZ2ljICE9IEZTX01BR0lDKQorICAgIHJldHZhbCA9IDA7CisKKyAgbWFwYmxvY2sgPSAtMTsKKyAgbWFwYmxvY2tfb2Zmc2V0ID0gLTE7CisgIAorICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitibG9ja19tYXAgKGludCBmaWxlX2Jsb2NrKQoreworICBpbnQgYm51bSwgb2Zmc2V0LCBic2l6ZTsKKyAgCisgIGlmIChmaWxlX2Jsb2NrIDwgTkRBRERSKQorICAgIHJldHVybiAoSU5PREUtPmlfZGJbZmlsZV9ibG9ja10pOworICAKKyAgLyogSWYgdGhlIGJsb2NrbWFwIGxvYWRlZCBkb2VzIG5vdCBpbmNsdWRlIEZJTEVfQkxPQ0ssCisgICAgIGxvYWQgYSBuZXcgYmxvY2ttYXAuICAqLworICBpZiAoKGJudW0gPSBmc2J0b2RiIChTVVBFUkJMT0NLLCBJTk9ERS0+aV9pYlswXSkpICE9IG1hcGJsb2NrCisgICAgICB8fCAobWFwYmxvY2tfb2Zmc2V0IDw9IGJudW0gJiYgYm51bSA8PSBtYXBibG9ja19vZmZzZXQgKyBtYXBibG9ja19ic2l6ZSkpCisgICAgeworICAgICAgaWYgKE1BUEJVRl9MRU4gPCBTVVBFUkJMT0NLLT5mc19ic2l6ZSkKKwl7CisJICBvZmZzZXQgPSAoKGZpbGVfYmxvY2sgLSBOREFERFIpICUgTklORElSIChTVVBFUkJMT0NLKSk7CisJICBic2l6ZSA9IE1BUEJVRl9MRU47CisJICAKKwkgIGlmIChvZmZzZXQgKyBNQVBCVUZfTEVOID4gU1VQRVJCTE9DSy0+ZnNfYnNpemUpCisJICAgIG9mZnNldCA9IChTVVBFUkJMT0NLLT5mc19ic2l6ZSAtIE1BUEJVRl9MRU4pIC8gc2l6ZW9mIChpbnQpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBic2l6ZSA9IFNVUEVSQkxPQ0stPmZzX2JzaXplOworCSAgb2Zmc2V0ID0gMDsKKwl9CisgICAgICAKKyAgICAgIGlmICghIGRldnJlYWQgKGJudW0sIG9mZnNldCAqIHNpemVvZiAoaW50KSwgYnNpemUsIChjaGFyICopIE1BUEJVRikpCisJeworCSAgbWFwYmxvY2sgPSAtMTsKKwkgIG1hcGJsb2NrX2JzaXplID0gLTE7CisJICBtYXBibG9ja19vZmZzZXQgPSAtMTsKKwkgIGVycm51bSA9IEVSUl9GU1lTX0NPUlJVUFQ7CisJICByZXR1cm4gLTE7CisJfQorICAgICAgCisgICAgICBtYXBibG9jayA9IGJudW07CisgICAgICBtYXBibG9ja19ic2l6ZSA9IGJzaXplOworICAgICAgbWFwYmxvY2tfb2Zmc2V0ID0gb2Zmc2V0OworICAgIH0KKyAgCisgIHJldHVybiAoKChpbnQgKikgTUFQQlVGKVsoKGZpbGVfYmxvY2sgLSBOREFERFIpICUgTklORElSIChTVVBFUkJMT0NLKSkKKwkJCSAgLSBtYXBibG9ja19vZmZzZXRdKTsKK30KKworCitpbnQKK2Zmc19yZWFkIChjaGFyICpidWYsIGludCBsZW4pCit7CisgIGludCBsb2dubywgb2ZmLCBzaXplLCBtYXAsIHJldCA9IDA7CisgIAorICB3aGlsZSAobGVuICYmICFlcnJudW0pCisgICAgeworICAgICAgb2ZmID0gYmxrb2ZmIChTVVBFUkJMT0NLLCBmaWxlcG9zKTsKKyAgICAgIGxvZ25vID0gbGJsa25vIChTVVBFUkJMT0NLLCBmaWxlcG9zKTsKKyAgICAgIHNpemUgPSBibGtzaXplIChTVVBFUkJMT0NLLCBJTk9ERSwgbG9nbm8pOworCisgICAgICBpZiAoKG1hcCA9IGJsb2NrX21hcCAobG9nbm8pKSA8IDApCisJYnJlYWs7CisKKyAgICAgIHNpemUgLT0gb2ZmOworCisgICAgICBpZiAoc2l6ZSA+IGxlbikKKwlzaXplID0gbGVuOworCisgICAgICBkaXNrX3JlYWRfZnVuYyA9IGRpc2tfcmVhZF9ob29rOworCisgICAgICBkZXZyZWFkIChmc2J0b2RiIChTVVBFUkJMT0NLLCBtYXApLCBvZmYsIHNpemUsIGJ1Zik7CisKKyAgICAgIGRpc2tfcmVhZF9mdW5jID0gTlVMTDsKKworICAgICAgYnVmICs9IHNpemU7CisgICAgICBsZW4gLT0gc2l6ZTsKKyAgICAgIGZpbGVwb3MgKz0gc2l6ZTsKKyAgICAgIHJldCArPSBzaXplOworICAgIH0KKworICBpZiAoZXJybnVtKQorICAgIHJldCA9IDA7CisKKyAgcmV0dXJuIHJldDsKK30KKworCitpbnQKK2Zmc19kaXIgKGNoYXIgKmRpcm5hbWUpCit7CisgIGNoYXIgKnJlc3QsIGNoOworICBpbnQgYmxvY2ssIG9mZiwgbG9jLCBtYXAsIGlubyA9IFJPT1RJTk87CisgIHN0cnVjdCBkaXJlY3QgKmRwOworCisvKiBtYWluIGxvb3AgdG8gZmluZCBkZXN0aW5hdGlvbiBpbm9kZSAqLworbG9vcDoKKworICAvKiBsb2FkIGN1cnJlbnQgaW5vZGUgKGRlZmF1bHRzIHRvIHRoZSByb290IGlub2RlKSAqLworCisJaWYgKCFkZXZyZWFkIChmc2J0b2RiIChTVVBFUkJMT0NLLCBpdG9kIChTVVBFUkJMT0NLLCBpbm8pKSwKKwkJCQkJCQkJaW5vICUgKFNVUEVSQkxPQ0stPmZzX2lub3BiKSAqIHNpemVvZiAoc3RydWN0IGRpbm9kZSksCisJCQkJCQkJCXNpemVvZiAoc3RydWN0IGRpbm9kZSksIChjaGFyICopIElOT0RFKSkKKwkJCXJldHVybiAwOwkJCS8qIFhYWCB3aGF0IHJldHVybiB2YWx1ZT8gKi8KKworICAvKiBpZiB3ZSBoYXZlIGEgcmVhbCBmaWxlIChhbmQgd2UncmUgbm90IGp1c3QgcHJpbnRpbmcgcG9zc2liaWxpdGllcyksCisgICAgIHRoZW4gdGhpcyBpcyB3aGVyZSB3ZSB3YW50IHRvIGV4aXQgKi8KKworICBpZiAoISpkaXJuYW1lIHx8IGlzc3BhY2UgKCpkaXJuYW1lKSkKKyAgICB7CisgICAgICBpZiAoKElOT0RFLT5pX21vZGUgJiBJRk1UKSAhPSBJRlJFRykKKwl7CisJICBlcnJudW0gPSBFUlJfQkFEX0ZJTEVUWVBFOworCSAgcmV0dXJuIDA7CisJfQorCisgICAgICBmaWxlbWF4ID0gSU5PREUtPmlfc2l6ZTsKKworICAgICAgLyogaW5jb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aGlzISAqLworICAgICAgZnNtYXggPSAoTkRBRERSICsgTklORElSIChTVVBFUkJMT0NLKSkgKiBTVVBFUkJMT0NLLT5mc19ic2l6ZTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBjb250aW51ZSB3aXRoIGZpbGUvZGlyZWN0b3J5IG5hbWUgaW50ZXJwcmV0YXRpb24gKi8KKworICB3aGlsZSAoKmRpcm5hbWUgPT0gJy8nKQorICAgIGRpcm5hbWUrKzsKKworICBpZiAoIShJTk9ERS0+aV9zaXplKSB8fCAoKElOT0RFLT5pX21vZGUgJiBJRk1UKSAhPSBJRkRJUikpCisgICAgeworICAgICAgZXJybnVtID0gRVJSX0JBRF9GSUxFVFlQRTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBmb3IgKHJlc3QgPSBkaXJuYW1lOyAoY2ggPSAqcmVzdCkgJiYgIWlzc3BhY2UgKGNoKSAmJiBjaCAhPSAnLyc7IHJlc3QrKyk7CisKKyAgKnJlc3QgPSAwOworICBsb2MgPSAwOworCisgIC8qIGxvb3AgZm9yIHJlYWRpbmcgYSB0aGUgZW50cmllcyBpbiBhIGRpcmVjdG9yeSAqLworCisgIGRvCisgICAgeworICAgICAgaWYgKGxvYyA+PSBJTk9ERS0+aV9zaXplKQorCXsKKyNpZiAwCisJICBwdXRjaGFyICgnXG4nKTsKKyNlbmRpZgorCisJICBpZiAocHJpbnRfcG9zc2liaWxpdGllcyA8IDApCisJICAgIHJldHVybiAxOworCisJICBlcnJudW0gPSBFUlJfRklMRV9OT1RfRk9VTkQ7CisJICAqcmVzdCA9IGNoOworCSAgcmV0dXJuIDA7CisJfQorCisgICAgICBpZiAoIShvZmYgPSBibGtvZmYgKFNVUEVSQkxPQ0ssIGxvYykpKQorCXsKKwkgIGJsb2NrID0gbGJsa25vIChTVVBFUkJMT0NLLCBsb2MpOworCisJICBpZiAoKG1hcCA9IGJsb2NrX21hcCAoYmxvY2spKSA8IDAKKwkgICAgICB8fCAhZGV2cmVhZCAoZnNidG9kYiAoU1VQRVJCTE9DSywgbWFwKSwgMCwKKwkJCSAgIGJsa3NpemUgKFNVUEVSQkxPQ0ssIElOT0RFLCBibG9jayksCisJCQkgICAoY2hhciAqKSBGU1lTX0JVRikpCisJICAgIHsKKwkgICAgICBlcnJudW0gPSBFUlJfRlNZU19DT1JSVVBUOworCSAgICAgICpyZXN0ID0gY2g7CisJICAgICAgcmV0dXJuIDA7CisJICAgIH0KKwl9CisKKyAgICAgIGRwID0gKHN0cnVjdCBkaXJlY3QgKikgKEZTWVNfQlVGICsgb2ZmKTsKKyAgICAgIGxvYyArPSBkcC0+ZF9yZWNsZW47CisKKyNpZm5kZWYgU1RBR0UxXzUKKyAgICAgIGlmIChkcC0+ZF9pbm8gJiYgcHJpbnRfcG9zc2liaWxpdGllcyAmJiBjaCAhPSAnLycKKwkgICYmICghKmRpcm5hbWUgfHwgc3Vic3RyaW5nIChkaXJuYW1lLCBkcC0+ZF9uYW1lKSA8PSAwKSkKKwl7CisJICBpZiAocHJpbnRfcG9zc2liaWxpdGllcyA+IDApCisJICAgIHByaW50X3Bvc3NpYmlsaXRpZXMgPSAtcHJpbnRfcG9zc2liaWxpdGllczsKKworCSAgcHJpbnRfYV9jb21wbGV0aW9uIChkcC0+ZF9uYW1lKTsKKwl9CisjZW5kaWYgLyogU1RBR0UxXzUgKi8KKyAgICB9CisgIHdoaWxlICghZHAtPmRfaW5vIHx8IChzdWJzdHJpbmcgKGRpcm5hbWUsIGRwLT5kX25hbWUpICE9IDAKKwkJCXx8IChwcmludF9wb3NzaWJpbGl0aWVzICYmIGNoICE9ICcvJykpKTsKKworICAvKiBvbmx5IGdldCBoZXJlIGlmIHdlIGhhdmUgYSBtYXRjaGluZyBkaXJlY3RvcnkgZW50cnkgKi8KKworICBpbm8gPSBkcC0+ZF9pbm87CisgICooZGlybmFtZSA9IHJlc3QpID0gY2g7CisKKyAgLyogZ28gYmFjayB0byBtYWluIGxvb3AgYXQgdG9wIG9mIGZ1bmN0aW9uICovCisgIGdvdG8gbG9vcDsKK30KKworaW50CitmZnNfZW1iZWQgKGludCAqc3RhcnRfc2VjdG9yLCBpbnQgbmVlZGVkX3NlY3RvcnMpCit7CisgIC8qIFhYWDogSSBkb24ndCBrbm93IGlmIHRoaXMgaXMgcmVhbGx5IGNvcnJlY3QuIFNvbWVvbmUgd2hvIGlzCisgICAgIGZhbWlsaWFyIHdpdGggQlNEIHNob3VsZCBjaGVjayBmb3IgdGhpcy4gICovCisgIGlmIChuZWVkZWRfc2VjdG9ycyA+IDE0KQorICAgIHJldHVybiAwOworICAKKyAgKnN0YXJ0X3NlY3RvciA9IDE7CisjaWYgMQorICAvKiBGSVhNRTogRGlzYWJsZSB0aGUgZW1iZWRkaW5nIGluIEZGUyB1bnRpbCBzb21lb25lIGNoZWNrcyBpZgorICAgICB0aGUgY29kZSBhYm92ZSBpcyBjb3JyZWN0LiAgKi8KKyAgcmV0dXJuIDA7CisjZWxzZQorICByZXR1cm4gMTsKKyNlbmRpZgorfQorCisjZW5kaWYgLyogRlNZU19GRlMgKi8KZGlmZiAtLWdpdCBhL3N0YWdlMi9mc3lzX2lzbzk2NjAuYyBiL3N0YWdlMi9mc3lzX2lzbzk2NjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGU0YWE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3RhZ2UyL2ZzeXNfaXNvOTY2MC5jCkBAIC0wLDAgKzEsNDQyIEBACisvKgorICogIElTTyA5NjYwIGZpbGVzeXN0ZW0gYmFja2VuZCBmb3IgR1JVQiAoR1JhbmQgVW5pZmllZCBCb290bG9hZGVyKQorICogIGluY2x1ZGluZyBSb2NrIFJpZGdlIEV4dGVuc2lvbnMgc3VwcG9ydAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgIEtvdXN1a2UgVGFrYWkgIDx0YWtAa21jLmt5b3RvLXUuYWMuanA+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworLyoKKyAqICBSZWZlcmVuY2VzOgorICoJbGludXgvZnMvaXNvZnMvcm9jay5bY2hdCisgKglta2lzb2ZzLTEuMTEuMS9kaWFnL2lzb2luZm8uYworICoJbWtpc29mcy0xLjExLjEvaXNvOTY2MC5oCisgKgkJKGFsbCBhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nZGFsZSkKKyAqCisgKiAgTW9kaWZpY2F0aW9ucyBieToKKyAqCUxlb25pZCBMaXNvdnNraXkgICA8bGx5QHBpc2VtLm5ldD4JMjAwMworICovCisKKyNpZmRlZiBGU1lTX0lTTzk2NjAKKworI2luY2x1ZGUgInNoYXJlZC5oIgorI2luY2x1ZGUgImZpbGVzeXMuaCIKKyNpbmNsdWRlICJpc285NjYwLmgiCisKKy8qIGlzbzk2NjAgc3VwZXItYmxvY2sgZGF0YSBpbiBtZW1vcnkgKi8KK3N0cnVjdCBpc29fc2JfaW5mbyB7CisgIHVuc2lnbmVkIGxvbmcgdm9sX3NlY3RvcjsKKworfTsKKworLyogaXNvIGZzIGlub2RlIGRhdGEgaW4gbWVtb3J5ICovCitzdHJ1Y3QgaXNvX2lub2RlX2luZm8geworICB1bnNpZ25lZCBsb25nIGZpbGVfc3RhcnQ7Cit9OworCisjZGVmaW5lIElTT19TVVBFUglcCisgICAgKChzdHJ1Y3QgaXNvX3NiX2luZm8gKikoRlNZU19CVUYpKQorI2RlZmluZSBJTk9ERQkJXAorICAgICgoc3RydWN0IGlzb19pbm9kZV9pbmZvICopKEZTWVNfQlVGK3NpemVvZihzdHJ1Y3QgaXNvX3NiX2luZm8pKSkKKyNkZWZpbmUgUFJJTURFU0MgICAgICAgICgoc3RydWN0IGlzb19wcmltYXJ5X2Rlc2NyaXB0b3IgKikoRlNZU19CVUYgKyAyMDQ4KSkKKyNkZWZpbmUgRElSUkVDICAgICAgICAgICgoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICopKEZTWVNfQlVGICsgNDA5NikpCisjZGVmaW5lIFJSQ09OVF9CVUYgICAgICAoKHVuc2lnbmVkIGNoYXIgKikoRlNZU19CVUYgKyA2MTQ0KSkKKyNkZWZpbmUgTkFNRV9CVUYgICAgICAgICgodW5zaWduZWQgY2hhciAqKShGU1lTX0JVRiArIDgxOTIpKQorCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworbG9nMiAodW5zaWduZWQgbG9uZyB3b3JkKQoreworICBhc20gdm9sYXRpbGUgKCJic2ZsICUxLCUwIgorCQk6ICAgICAgICAgICI9ciIgKHdvcmQpCisJCTogICAgICAgICAgInIiICh3b3JkKSk7CisgIHJldHVybiB3b3JkOworfQorCitzdGF0aWMgaW50Citpc285NjYwX2RldnJlYWQgKGludCBzZWN0b3IsIGludCBieXRlX29mZnNldCwgaW50IGJ5dGVfbGVuLCBjaGFyICpidWYpCit7CisgIHVuc2lnbmVkIHNob3J0IHNlY3Rvcl9zaXplX2xnMiA9IGxvZzIoYnVmX2dlb20uc2VjdG9yX3NpemUpOworCisgIC8qCisgICAqIFdlIGhhdmUgdG8gdXNlIG93biBkZXZyZWFkKCkgZnVuY3Rpb24gc2luY2UgQklPUyByZXR1cm4gd3JvbmcgZ2VvbWV0cnkKKyAgICovCisgIGlmIChzZWN0b3IgPCAwKQorICAgIHsKKyAgICAgIGVycm51bSA9IEVSUl9PVVRTSURFX1BBUlQ7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGlmIChieXRlX2xlbiA8PSAwKQorICAgIHJldHVybiAxOworCisgIHNlY3RvciArPSAoYnl0ZV9vZmZzZXQgPj4gc2VjdG9yX3NpemVfbGcyKTsKKyAgYnl0ZV9vZmZzZXQgJj0gKGJ1Zl9nZW9tLnNlY3Rvcl9zaXplIC0gMSk7CisgIGFzbSB2b2xhdGlsZSAoInNobCVMMCAlMSwlMCIKKwkJOiAiPXIiKHNlY3RvcikKKwkJOiAiSWMiKChpbnQ4X3QpKElTT19TRUNUT1JfQklUUyAtIHNlY3Rvcl9zaXplX2xnMikpLAorCQkiMCIoc2VjdG9yKSk7CisKKyNpZiAhZGVmaW5lZChTVEFHRTFfNSkKKyAgaWYgKGRpc2tfcmVhZF9ob29rICYmIGRlYnVnKQorICAgIHByaW50ZiAoIjwlZCwgJWQsICVkPiIsIHNlY3RvciwgYnl0ZV9vZmZzZXQsIGJ5dGVfbGVuKTsKKyNlbmRpZiAvKiAhU1RBR0UxXzUgKi8KKworICByZXR1cm4gcmF3cmVhZChjdXJyZW50X2RyaXZlLCBwYXJ0X3N0YXJ0ICsgc2VjdG9yLCBieXRlX29mZnNldCwgYnl0ZV9sZW4sIGJ1Zik7Cit9CisKK2ludAoraXNvOTY2MF9tb3VudCAodm9pZCkKK3sKKyAgdW5zaWduZWQgaW50IHNlY3RvcjsKKworICAvKgorICAgKiAgQmVjYXVzZSB0aGVyZSBpcyBubyBkZWZpbmVkIHNsaWNlIHR5cGUgSUQgZm9yIElTTy05NjYwIGZpbGVzeXN0ZW0sCisgICAqICB0aGlzIHRlc3Qgd2lsbCBwYXNzIG9ubHkgZWl0aGVyICgxKSBpZiBlbnRpcmUgZGlzayBpcyB1c2VkLCBvcgorICAgKiAgKDIpIGlmIGN1cnJlbnQgcGFydGl0aW9uIGlzIEJTRCBzdHlsZSBzdWItcGFydGl0aW9uIHdob3NlIElEIGlzCisgICAqICBJU08tOTY2MC4KKyAgICovCisgIGlmICgoY3VycmVudF9wYXJ0aXRpb24gIT0gMHhGRkZGRkYpCisgICAgICAmJiAhSVNfUENfU0xJQ0VfVFlQRV9CU0RfV0lUSF9GUyhjdXJyZW50X3NsaWNlLCBGU19JU085NjYwKSkKKyAgICByZXR1cm4gMDsKKworICAvKgorICAgKiAgQ3VycmVudGx5LCBvbmx5IEZJUlNUIHNlc3Npb24gb2YgTXVsdGlTZXNzaW9uIGRpc2tzIGFyZSBzdXBwb3J0ZWQgISEhCisgICAqLworICBmb3IgKHNlY3RvciA9IDE2IDsgc2VjdG9yIDwgMzIgOyBzZWN0b3IrKykKKyAgICB7CisgICAgICBpZiAoIWlzbzk2NjBfZGV2cmVhZChzZWN0b3IsIDAsIHNpemVvZigqUFJJTURFU0MpLCAoY2hhciAqKVBSSU1ERVNDKSkgCisJYnJlYWs7CisgICAgICAvKiBjaGVjayBJU09fVkRfUFJJTUFSWSBhbmQgSVNPX1NUQU5EQVJEX0lEICovCisgICAgICBpZiAoUFJJTURFU0MtPnR5cGUubCA9PSBJU09fVkRfUFJJTUFSWQorCSAgJiYgIW1lbWNtcChQUklNREVTQy0+aWQsIElTT19TVEFOREFSRF9JRCwgc2l6ZW9mKFBSSU1ERVNDLT5pZCkpKQorCXsKKwkgIElTT19TVVBFUi0+dm9sX3NlY3RvciA9IHNlY3RvcjsKKwkgIElOT0RFLT5maWxlX3N0YXJ0ID0gMDsKKwkgIGZzbWF4ID0gUFJJTURFU0MtPnZvbHVtZV9zcGFjZV9zaXplLmw7CisJICByZXR1cm4gMTsKKwl9CisgICAgfQorCisgIHJldHVybiAwOworfQorCitpbnQKK2lzbzk2NjBfZGlyIChjaGFyICpkaXJuYW1lKQoreworICBzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKmlkcjsKKyAgUlJfcHRyX3QgcnJfcHRyOworICBzdHJ1Y3Qgcm9ja19yaWRnZSAqY2VfcHRyOworICB1bnNpZ25lZCBpbnQgcGF0aGxlbjsKKyAgaW50IHNpemU7CisgIHVuc2lnbmVkIGludCBleHRlbnQ7CisgIHVuc2lnbmVkIGNoYXIgZmlsZV90eXBlOworICB1bnNpZ25lZCBpbnQgcnJfbGVuOworICB1bnNpZ25lZCBjaGFyIHJyX2ZsYWc7CisKKyAgaWRyID0gJlBSSU1ERVNDLT5yb290X2RpcmVjdG9yeV9yZWNvcmQ7CisgIElOT0RFLT5maWxlX3N0YXJ0ID0gMDsKKworICBkbworICAgIHsKKyAgICAgIHdoaWxlICgqZGlybmFtZSA9PSAnLycpCS8qIHNraXAgbGVhZGluZyBzbGFzaGVzICovCisJZGlybmFtZSsrOworICAgICAgLyogcGF0aGxlbiA9IHN0cmNzcG4oZGlybmFtZSwgIi9cblx0ICIpOyAqLworICAgICAgZm9yIChwYXRobGVuID0gMCA7CisJICAgZGlybmFtZVtwYXRobGVuXQorCSAgICAgJiYgIWlzc3BhY2UoZGlybmFtZVtwYXRobGVuXSkgJiYgZGlybmFtZVtwYXRobGVuXSAhPSAnLycgOworCSAgIHBhdGhsZW4rKykKKwk7CisKKyAgICAgIHNpemUgPSBpZHItPnNpemUubDsKKyAgICAgIGV4dGVudCA9IGlkci0+ZXh0ZW50Lmw7CisKKyAgICAgIHdoaWxlIChzaXplID4gMCkKKwl7CisJICBpZiAoIWlzbzk2NjBfZGV2cmVhZChleHRlbnQsIDAsIElTT19TRUNUT1JfU0laRSwgKGNoYXIgKilESVJSRUMpKQorCSAgICB7CisJICAgICAgZXJybnVtID0gRVJSX0ZTWVNfQ09SUlVQVDsKKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCSAgZXh0ZW50Kys7CisKKwkgIGlkciA9IChzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKilESVJSRUM7CisJICBmb3IgKDsgaWRyLT5sZW5ndGgubCA+IDA7CisJICAgICAgIGlkciA9IChzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKikoKGNoYXIgKilpZHIgKyBpZHItPmxlbmd0aC5sKSApCisJICAgIHsKKwkgICAgICBjb25zdCBjaGFyICpuYW1lID0gaWRyLT5uYW1lOworCSAgICAgIHVuc2lnbmVkIGludCBuYW1lX2xlbiA9IGlkci0+bmFtZV9sZW4ubDsKKworCSAgICAgIGZpbGVfdHlwZSA9IChpZHItPmZsYWdzLmwgJiAyKSA/IElTT19ESVJFQ1RPUlkgOiBJU09fUkVHVUxBUjsKKwkgICAgICBpZiAobmFtZV9sZW4gPT0gMSkKKwkJeworCQkgIGlmICgobmFtZVswXSA9PSAwKSB8fAkvKiBzZWxmICovCisJCSAgICAgIChuYW1lWzBdID09IDEpKSAJLyogcGFyZW50ICovCisJCSAgICBjb250aW51ZTsKKwkJfQorCSAgICAgIGlmIChuYW1lX2xlbiA+IDIgJiYgQ0hFQ0syKG5hbWUgKyBuYW1lX2xlbiAtIDIsICc7JywgJzEnKSkKKwkJeworCQkgIG5hbWVfbGVuIC09IDI7CS8qIHRydW5jYXRlIHRyYWlsaW5nIGZpbGUgdmVyc2lvbiAqLworCQkgIGlmIChuYW1lX2xlbiA+IDEgJiYgbmFtZVtuYW1lX2xlbiAtIDFdID09ICcuJykKKwkJICAgIG5hbWVfbGVuLS07CQkvKiB0cnVuY2F0ZSB0cmFpbGluZyBkb3QgKi8KKwkJfQorCisJICAgICAgLyoKKwkgICAgICAgKiAgUGFyc2UgUm9jay1SaWRnZSBleHRlbnNpb24KKwkgICAgICAgKi8KKwkgICAgICBycl9sZW4gPSAoaWRyLT5sZW5ndGgubCAtIGlkci0+bmFtZV9sZW4ubAorCQkJLSBzaXplb2Yoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkKQorCQkJKyBzaXplb2YoaWRyLT5uYW1lKSk7CisJICAgICAgcnJfcHRyLnB0ciA9ICgodW5zaWduZWQgY2hhciAqKWlkciArIGlkci0+bmFtZV9sZW4ubAorCQkJICAgICsgc2l6ZW9mKHN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCkKKwkJCSAgICAtIHNpemVvZihpZHItPm5hbWUpKTsKKwkgICAgICBpZiAocnJfcHRyLmkgJiAxKQorCQlycl9wdHIuaSsrLCBycl9sZW4tLTsKKwkgICAgICBjZV9wdHIgPSBOVUxMOworCSAgICAgIHJyX2ZsYWcgPSBSUl9GTEFHX05NIHwgUlJfRkxBR19QWCAvKnwgUlJfRkxBR19TTCovOworCisJICAgICAgd2hpbGUgKHJyX2xlbiA+PSA0KQorCQl7CisJCSAgaWYgKHJyX3B0ci5yci0+dmVyc2lvbiAhPSAxKQorCQkgICAgeworI2lmbmRlZiBTVEFHRTFfNQorCQkgICAgICBpZiAoZGVidWcpCisJCQlwcmludGYoCisJCQkgICAgICAgIk5vbi1zdXBwb3J0ZWQgdmVyc2lvbiAoJWQpIFJvY2tSaWRnZSBjaHVuayAiCisJCQkgICAgICAgImAlYyVjJ1xuIiwgcnJfcHRyLnJyLT52ZXJzaW9uLAorCQkJICAgICAgIHJyX3B0ci5yci0+c2lnbmF0dXJlICYgMHhGRiwKKwkJCSAgICAgICBycl9wdHIucnItPnNpZ25hdHVyZSA+PiA4KTsKKyNlbmRpZgorCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgc3dpdGNoIChycl9wdHIucnItPnNpZ25hdHVyZSkKKwkJCXsKKwkJCWNhc2UgUlJNQUdJQygnUicsICdSJyk6CisJCQkgIGlmICggcnJfcHRyLnJyLT5sZW4gPj0gKDQrc2l6ZW9mKHN0cnVjdCBSUikpKQorCQkJICAgIHJyX2ZsYWcgJj0gcnJfcHRyLnJyLT51LnJyLmZsYWdzLmw7CisJCQkgIGJyZWFrOworCQkJY2FzZSBSUk1BR0lDKCdOJywgJ00nKToKKwkJCSAgbmFtZSA9IHJyX3B0ci5yci0+dS5ubS5uYW1lOworCQkJICBuYW1lX2xlbiA9IHJyX3B0ci5yci0+bGVuIC0gKDQrc2l6ZW9mKHN0cnVjdCBOTSkpOworCQkJICBycl9mbGFnICY9IH5SUl9GTEFHX05NOworCQkJICBicmVhazsKKwkJCWNhc2UgUlJNQUdJQygnUCcsICdYJyk6CisJCQkgIGlmIChycl9wdHIucnItPmxlbiA+PSAoNCtzaXplb2Yoc3RydWN0IFBYKSkpCisJCQkgICAgeworCQkJICAgICAgZmlsZV90eXBlID0gKChycl9wdHIucnItPnUucHgubW9kZS5sICYgUE9TSVhfU19JRk1UKQorCQkJCQkgICA9PSBQT1NJWF9TX0lGUkVHCisJCQkJCSAgID8gSVNPX1JFR1VMQVIKKwkJCQkJICAgOiAoKHJyX3B0ci5yci0+dS5weC5tb2RlLmwgJiBQT1NJWF9TX0lGTVQpCisJCQkJCSAgICAgID09IFBPU0lYX1NfSUZESVIKKwkJCQkJICAgICAgPyBJU09fRElSRUNUT1JZIDogSVNPX09USEVSKSk7CisJCQkgICAgICBycl9mbGFnICY9IH5SUl9GTEFHX1BYOworCQkJICAgIH0KKwkJCSAgYnJlYWs7CisJCQljYXNlIFJSTUFHSUMoJ0MnLCAnRScpOgorCQkJICBpZiAocnJfcHRyLnJyLT5sZW4gPj0gKDQrc2l6ZW9mKHN0cnVjdCBDRSkpKQorCQkJICAgIGNlX3B0ciA9IHJyX3B0ci5ycjsKKwkJCSAgYnJlYWs7CisjaWYgMAkJLy8gUm9ja1JpZGdlIHN5bWxpbmtzIGFyZSBub3Qgc3VwcG9ydGVkIHlldAorCQkJY2FzZSBSUk1BR0lDKCdTJywgJ0wnKToKKwkJCSAgeworCQkJICAgIGludCBzbGVuOworCQkJICAgIHVuc2lnbmVkIGNoYXIgcm9vdGZsYWcsIHByZXZmbGFnOworCQkJICAgIGNoYXIgKnJwbnQgPSBOQU1FX0JVRisxMDI0OworCQkJICAgIHN0cnVjdCBTTF9jb21wb25lbnQgKnNscDsKKworCQkJICAgIHNsZW4gPSBycl9wdHIucnItPmxlbiAtICg0KzEpOworCQkJICAgIHNscCA9ICZycl9wdHIucnItPnUuc2wubGluazsKKwkJCSAgICB3aGlsZSAoc2xlbiA+IDEpCisJCQkgICAgICB7CisJCQkJcm9vdGZsYWcgPSAwOworCQkJCXN3aXRjaCAoc2xwLT5mbGFncy5sKQorCQkJCSAgeworCQkJCSAgY2FzZSAwOgorCQkJCSAgICBtZW1jcHkocnBudCwgc2xwLT50ZXh0LCBzbHAtPmxlbik7CisJCQkJICAgIHJwbnQgKz0gc2xwLT5sZW47CisJCQkJICAgIGJyZWFrOworCQkJCSAgY2FzZSA0OgorCQkJCSAgICAqcnBudCsrID0gJy4nOworCQkJCSAgICAvKiBmYWxsdGhydSAqLworCQkJCSAgY2FzZSAyOgorCQkJCSAgICAqcnBudCsrID0gJy4nOworCQkJCSAgICBicmVhazsKKwkJCQkgIGNhc2UgODoKKwkJCQkgICAgcm9vdGZsYWcgPSAxOworCQkJCSAgICAqcnBudCsrID0gJy8nOworCQkJCSAgICBicmVhazsKKwkJCQkgIGRlZmF1bHQ6CisJCQkJICAgIHByaW50ZigiU3ltbGluayBjb21wb25lbnQgZmxhZyBub3QgaW1wbGVtZW50ZWQgKCVkKVxuIiwKKwkJCQkJICAgc2xwLT5mbGFncy5sKTsKKwkJCQkgICAgc2xlbiA9IDA7CisJCQkJICAgIGJyZWFrOworCQkJCSAgfQorCQkJCXNsZW4gLT0gc2xwLT5sZW4gKyAyOworCQkJCXByZXZmbGFnID0gc2xwLT5mbGFncy5sOworCQkJCXNscCA9IChzdHJ1Y3QgU0xfY29tcG9uZW50ICopICgoY2hhciAqKSBzbHAgKyBzbHAtPmxlbiArIDIpOworCisJCQkJaWYgKHNsZW4gPCAyKQorCQkJCSAgeworCQkJCSAgICAvKgorCQkJCSAgICAgKiBJZiB0aGVyZSBpcyBhbm90aGVyIFNMIHJlY29yZCwgYW5kIHRoaXMgY29tcG9uZW50CisJCQkJICAgICAqIHJlY29yZCBpc24ndCBjb250aW51ZWQsIHRoZW4gYWRkIGEgc2xhc2guCisJCQkJICAgICAqLworCQkJCSAgICBpZiAoKCFyb290ZmxhZykgJiYgKHJyX3B0ci5yci0+dS5zbC5mbGFncy5sICYgMSkgJiYgIShwcmV2ZmxhZyAmIDEpKQorCQkJCSAgICAgICpycG50Kys9Jy8nOworCQkJCSAgICBicmVhazsKKwkJCQkgIH0KKworCQkJCS8qCisJCQkJICogSWYgdGhpcyBjb21wb25lbnQgcmVjb3JkIGlzbid0IGNvbnRpbnVlZCwgdGhlbiBhcHBlbmQgYSAnLycuCisJCQkJICovCisJCQkJaWYgKCFyb290ZmxhZyAmJiAhKHByZXZmbGFnICYgMSkpCisJCQkJICAqcnBudCsrID0gJy8nOworCQkJICAgICAgfQorCQkJICAgICpycG50KysgPSAnXDAnOworCQkJICAgIGdydWJfcHV0c3RyKE5BTUVfQlVGKzEwMjQpOy8vIGRlYnVnIHByaW50IQorCQkJICB9CisJCQkgIHJyX2ZsYWcgJj0gflJSX0ZMQUdfU0w7CisJCQkgIGJyZWFrOworI2VuZGlmCisJCQlkZWZhdWx0OgorCQkJICBicmVhazsKKwkJCX0KKwkJICAgIH0KKwkJICBpZiAoIXJyX2ZsYWcpCisJCSAgICAvKgorCQkgICAgICogVGhlcmUgaXMgbm8gbW9yZSBleHRlbnNpb24gd2UgZXhwZWN0cy4uLgorCQkgICAgICovCisJCSAgICBicmVhazsKKworCQkgIHJyX2xlbiAtPSBycl9wdHIucnItPmxlbjsKKwkJICBycl9wdHIucHRyICs9IHJyX3B0ci5yci0+bGVuOworCQkgIGlmIChycl9sZW4gPCA0ICYmIGNlX3B0ciAhPSBOVUxMKQorCQkgICAgeworCQkgICAgICAvKiBwcmVzZXJ2ZSBuYW1lIGJlZm9yZSBsb2FkaW5nIG5ldyBleHRlbnQuICovCisJCSAgICAgIGlmKCBSUkNPTlRfQlVGIDw9ICh1bnNpZ25lZCBjaGFyICopbmFtZQorCQkJICAmJiAodW5zaWduZWQgY2hhciAqKW5hbWUgPCBSUkNPTlRfQlVGICsgSVNPX1NFQ1RPUl9TSVpFICkKKwkJCXsKKwkJCSAgbWVtY3B5KE5BTUVfQlVGLCBuYW1lLCBuYW1lX2xlbik7CisJCQkgIG5hbWUgPSBOQU1FX0JVRjsKKwkJCX0KKwkJICAgICAgcnJfcHRyLnB0ciA9IFJSQ09OVF9CVUYgKyBjZV9wdHItPnUuY2Uub2Zmc2V0Lmw7CisJCSAgICAgIHJyX2xlbiA9IGNlX3B0ci0+dS5jZS5zaXplLmw7CisJCSAgICAgIGlmICghaXNvOTY2MF9kZXZyZWFkKGNlX3B0ci0+dS5jZS5leHRlbnQubCwgMCwgSVNPX1NFQ1RPUl9TSVpFLCBSUkNPTlRfQlVGKSkKKwkJCXsKKwkJCSAgZXJybnVtID0gMDsJLyogdGhpcyBpcyBub3QgZmF0YWwuICovCisJCQkgIGJyZWFrOworCQkJfQorCQkgICAgICBjZV9wdHIgPSBOVUxMOworCQkgICAgfQorCQl9IC8qIHJyX2xlbiA+PSA0ICovCisKKwkgICAgICBmaWxlbWF4ID0gTUFYSU5UOworCSAgICAgIGlmIChuYW1lX2xlbiA+PSBwYXRobGVuCisJCSAgJiYgIW1lbWNtcChuYW1lLCBkaXJuYW1lLCBwYXRobGVuKSkKKwkJeworCQkgIGlmIChkaXJuYW1lW3BhdGhsZW5dID09ICcvJyB8fCAhcHJpbnRfcG9zc2liaWxpdGllcykKKwkJICAgIHsKKwkJICAgICAgLyoKKwkJICAgICAgICogIERJUk5BTUUgaXMgZGlyZWN0b3J5IGNvbXBvbmVudCBvZiBwYXRobmFtZSwKKwkJICAgICAgICogIG9yIHdlIGFyZSB0byBvcGVuIGEgZmlsZS4KKwkJICAgICAgICovCisJCSAgICAgIGlmIChwYXRobGVuID09IG5hbWVfbGVuKQorCQkJeworCQkJICBpZiAoZGlybmFtZVtwYXRobGVuXSA9PSAnLycpCisJCQkgICAgeworCQkJICAgICAgaWYgKGZpbGVfdHlwZSAhPSBJU09fRElSRUNUT1JZKQorCQkJCXsKKwkJCQkgIGVycm51bSA9IEVSUl9CQURfRklMRVRZUEU7CisJCQkJICByZXR1cm4gMDsKKwkJCQl9CisJCQkgICAgICBnb3RvIG5leHRfZGlyX2xldmVsOworCQkJICAgIH0KKwkJCSAgaWYgKGZpbGVfdHlwZSAhPSBJU09fUkVHVUxBUikKKwkJCSAgICB7CisJCQkgICAgICBlcnJudW0gPSBFUlJfQkFEX0ZJTEVUWVBFOworCQkJICAgICAgcmV0dXJuIDA7CisJCQkgICAgfQorCQkJICBJTk9ERS0+ZmlsZV9zdGFydCA9IGlkci0+ZXh0ZW50Lmw7CisJCQkgIGZpbGVwb3MgPSAwOworCQkJICBmaWxlbWF4ID0gaWRyLT5zaXplLmw7CisJCQkgIHJldHVybiAxOworCQkJfQorCQkgICAgfQorCQkgIGVsc2UJLyogQ29tcGxldGlvbiAqLworCQkgICAgeworI2lmbmRlZiBTVEFHRTFfNQorCQkgICAgICBpZiAocHJpbnRfcG9zc2liaWxpdGllcyA+IDApCisJCQlwcmludF9wb3NzaWJpbGl0aWVzID0gLXByaW50X3Bvc3NpYmlsaXRpZXM7CisJCSAgICAgIG1lbWNweShOQU1FX0JVRiwgbmFtZSwgbmFtZV9sZW4pOworCQkgICAgICBOQU1FX0JVRltuYW1lX2xlbl0gPSAnXDAnOworCQkgICAgICBwcmludF9hX2NvbXBsZXRpb24gKE5BTUVfQlVGKTsKKyNlbmRpZgorCQkgICAgfQorCQl9CisJICAgIH0gLyogZm9yICovCisKKwkgIHNpemUgLT0gSVNPX1NFQ1RPUl9TSVpFOworCX0gLyogc2l6ZT4wICovCisKKyAgICAgIGlmIChkaXJuYW1lW3BhdGhsZW5dID09ICcvJyB8fCBwcmludF9wb3NzaWJpbGl0aWVzID49IDApCisJeworCSAgZXJybnVtID0gRVJSX0ZJTEVfTk9UX0ZPVU5EOworCSAgcmV0dXJuIDA7CisJfQorCisgICAgbmV4dF9kaXJfbGV2ZWw6CisgICAgICBkaXJuYW1lICs9IHBhdGhsZW47CisKKyAgICB9IHdoaWxlICgqZGlybmFtZSA9PSAnLycpOworCisgIHJldHVybiAxOworfQorCitpbnQKK2lzbzk2NjBfcmVhZCAoY2hhciAqYnVmLCBpbnQgbGVuKQoreworICBpbnQgc2VjdG9yLCBibGtvZmZzZXQsIHNpemUsIHJldDsKKworICBpZiAoSU5PREUtPmZpbGVfc3RhcnQgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICByZXQgPSAwOworICBibGtvZmZzZXQgPSBmaWxlcG9zICYgKElTT19TRUNUT1JfU0laRSAtIDEpOworICBzZWN0b3IgPSBmaWxlcG9zID4+IElTT19TRUNUT1JfQklUUzsKKyAgd2hpbGUgKGxlbiA+IDApCisgICAgeworICAgICAgc2l6ZSA9IElTT19TRUNUT1JfU0laRSAtIGJsa29mZnNldDsKKyAgICAgIGlmIChzaXplID4gbGVuKQorICAgICAgICBzaXplID0gbGVuOworCisgICAgICBkaXNrX3JlYWRfZnVuYyA9IGRpc2tfcmVhZF9ob29rOworCisgICAgICBpZiAoIWlzbzk2NjBfZGV2cmVhZChJTk9ERS0+ZmlsZV9zdGFydCArIHNlY3RvciwgYmxrb2Zmc2V0LCBzaXplLCBidWYpKQorCXJldHVybiAwOworCisgICAgICBkaXNrX3JlYWRfZnVuYyA9IE5VTEw7CisKKyAgICAgIGxlbiAtPSBzaXplOworICAgICAgYnVmICs9IHNpemU7CisgICAgICByZXQgKz0gc2l6ZTsKKyAgICAgIGZpbGVwb3MgKz0gc2l6ZTsKKyAgICAgIHNlY3RvcisrOworICAgICAgYmxrb2Zmc2V0ID0gMDsKKyAgICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworI2VuZGlmIC8qIEZTWVNfSVNPOTY2MCAqLwpkaWZmIC0tZ2l0IGEvc3RhZ2UyL2ZzeXNfamZzLmMgYi9zdGFnZTIvZnN5c19qZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDdmODM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3RhZ2UyL2ZzeXNfamZzLmMKQEAgLTAsMCArMSw0MDMgQEAKKy8qIGZzeXNfamZzLmMgLSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIElCTSBKRlMgZmlsZSBzeXN0ZW0gKi8KKy8qICAKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLDIwMDIgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmZGVmIEZTWVNfSkZTCisKKyNpbmNsdWRlICJzaGFyZWQuaCIKKyNpbmNsdWRlICJmaWxlc3lzLmgiCisjaW5jbHVkZSAiamZzLmgiCisKKyNkZWZpbmUgTUFYX0xJTktfQ09VTlQJOAorCisjZGVmaW5lIERUVFlQRV9JTkxJTkUJMAorI2RlZmluZSBEVFRZUEVfUEFHRQkxCisKK3N0cnVjdCBqZnNfaW5mbworeworCWludCBic2l6ZTsKKwlpbnQgbDJic2l6ZTsKKwlpbnQgYmRsb2c7CisJaW50IHhpbmRleDsKKwlpbnQgeGxhc3RpbmRleDsKKwlpbnQgc2luZGV4OworCWludCBzbGFzdGluZGV4OworCWludCBkZV9pbmRleDsKKwlpbnQgZHR0eXBlOworCXhhZF90ICp4YWQ7CisJbGR0ZW50cnlfdCAqZGU7Cit9OworCitzdGF0aWMgc3RydWN0IGpmc19pbmZvIGpmczsKKworI2RlZmluZSB4dHBhZ2UJCSgoeHRwYWdlX3QgKilGU1lTX0JVRikKKyNkZWZpbmUgZHRwYWdlCQkoKGR0cGFnZV90ICopKChjaGFyICopRlNZU19CVUYgKyA0MDk2KSkKKyNkZWZpbmUgZmlsZXNldAkJKChkaW5vZGVfdCAqKSgoY2hhciAqKUZTWVNfQlVGICsgODE5MikpCisjZGVmaW5lIGlub2RlCQkoKGRpbm9kZV90ICopKChjaGFyICopRlNZU19CVUYgKyA4MTkyICsgc2l6ZW9mKGRpbm9kZV90KSkpCisjZGVmaW5lIGR0cm9vdAkJKChkdHJvb3RfdCAqKSgmaW5vZGUtPmRpX2J0cm9vdCkpCisKK3N0YXRpYyBsZHRlbnRyeV90IGRlX2Fsd2F5c1syXSA9IHsKKwl7MSwgLTEsIDIsIHsnLicsICcuJ319LAorCXsxLCAtMSwgMSwgeycuJ319Cit9OworCitzdGF0aWMgaW50Citpc2lueHQgKHM2NCBrZXksIHM2NCBvZmZzZXQsIHM2NCBsZW4pCit7CisJcmV0dXJuIChrZXkgPj0gb2Zmc2V0KSA/IChrZXkgPCBvZmZzZXQgKyBsZW4gPyAxIDogMCkgOiAwOworfQorCitzdGF0aWMgeGFkX3QgKgorZmlyc3RfZXh0ZW50IChkaW5vZGVfdCAqZGkpCit7CisJeHRwYWdlX3QgKnh0cDsKKworCWpmcy54aW5kZXggPSAyOworCXh0cCA9ICh4dHBhZ2VfdCAqKSZkaS0+ZGlfYnRyb290OworCWpmcy54YWQgPSAmeHRwLT54YWRbMl07CisJaWYgKHh0cC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKSB7CisJICAgIAlqZnMueGxhc3RpbmRleCA9IHh0cC0+aGVhZGVyLm5leHRpbmRleDsKKwl9IGVsc2UgeworCQlkbyB7CisJCQlkZXZyZWFkIChhZGRyZXNzWEFEIChqZnMueGFkKSA8PCBqZnMuYmRsb2csIDAsCisJCQkJIHNpemVvZih4dHBhZ2VfdCksIChjaGFyICopeHRwYWdlKTsKKwkJCWpmcy54YWQgPSAmeHRwYWdlLT54YWRbMl07CisJCX0gd2hpbGUgKCEoeHRwYWdlLT5oZWFkZXIuZmxhZyAmIEJUX0xFQUYpKTsKKwkJamZzLnhsYXN0aW5kZXggPSB4dHBhZ2UtPmhlYWRlci5uZXh0aW5kZXg7CisJfQorCisJcmV0dXJuIGpmcy54YWQ7Cit9CisKK3N0YXRpYyB4YWRfdCAqCituZXh0X2V4dGVudCAodm9pZCkKK3sKKwlpZiAoKytqZnMueGluZGV4IDwgamZzLnhsYXN0aW5kZXgpIHsKKwl9IGVsc2UgaWYgKHh0cGFnZS0+aGVhZGVyLm5leHQpIHsKKwkJZGV2cmVhZCAoeHRwYWdlLT5oZWFkZXIubmV4dCA8PCBqZnMuYmRsb2csIDAsCisJCQkgc2l6ZW9mKHh0cGFnZV90KSwgKGNoYXIgKil4dHBhZ2UpOworCQlqZnMueGxhc3RpbmRleCA9IHh0cGFnZS0+aGVhZGVyLm5leHRpbmRleDsKKwkJamZzLnhpbmRleCA9IFhURU5UUllTVEFSVDsKKwkJamZzLnhhZCA9ICZ4dHBhZ2UtPnhhZFtYVEVOVFJZU1RBUlRdOworCX0gZWxzZSB7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gKytqZnMueGFkOworfQorCisKK3N0YXRpYyB2b2lkCitkaV9yZWFkICh1MzIgaW51bSwgZGlub2RlX3QgKmRpKQoreworCXM2NCBrZXk7CisJdTMyIHhkLCBpb2Zmc2V0OworCXM2NCBvZmZzZXQ7CisJeGFkX3QgKnhhZDsKKwlweGRfdCBweGQ7CisKKwlrZXkgPSAoKChpbnVtID4+IEwySU5PU1BFUklBRykgPDwgTDJJTk9TUEVSSUFHKSArIDQwOTYpID4+IGpmcy5sMmJzaXplOworCXhkID0gKGludW0gJiAoSU5PU1BFUklBRyAtIDEpKSA+PiBMMklOT1NQRVJFWFQ7CisJaW9mZnNldCA9ICgoaW51bSAmIChJTk9TUEVSSUFHIC0gMSkpICYgKElOT1NQRVJFWFQgLSAxKSkgPDwgTDJESVNJWkU7CisJeGFkID0gZmlyc3RfZXh0ZW50IChmaWxlc2V0KTsKKwlkbyB7CisJCW9mZnNldCA9IG9mZnNldFhBRCAoeGFkKTsKKwkJaWYgKGlzaW54dCAoa2V5LCBvZmZzZXQsIGxlbmd0aFhBRCAoeGFkKSkpIHsKKwkJCWRldnJlYWQgKChhZGRyZXNzWEFEICh4YWQpICsga2V5IC0gb2Zmc2V0KSA8PCBqZnMuYmRsb2csCisJCQkJIDMwNzIgKyB4ZCpzaXplb2YocHhkX3QpLCBzaXplb2YocHhkX3QpLCAoY2hhciAqKSZweGQpOworCQkJZGV2cmVhZCAoYWRkcmVzc1BYRCAoJnB4ZCkgPDwgamZzLmJkbG9nLAorCQkJCSBpb2Zmc2V0LCBESVNJWkUsIChjaGFyICopZGkpOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgoeGFkID0gbmV4dF9leHRlbnQgKCkpKTsKK30KKworc3RhdGljIGxkdGVudHJ5X3QgKgorbmV4dF9kZW50cnkgKHZvaWQpCit7CisJbGR0ZW50cnlfdCAqZGU7CisJczggKnN0Ymw7CisKKwlpZiAoamZzLmR0dHlwZSA9PSBEVFRZUEVfSU5MSU5FKSB7CisJCWlmIChqZnMuc2luZGV4IDwgamZzLnNsYXN0aW5kZXgpIHsKKwkJCXJldHVybiAobGR0ZW50cnlfdCAqKSZkdHJvb3QtPnNsb3RbKGludClkdHJvb3QtPmhlYWRlci5zdGJsW2pmcy5zaW5kZXgrK11dOworCQl9CisJfSBlbHNlIHsKKwkJZGUgPSAobGR0ZW50cnlfdCAqKWR0cGFnZS0+c2xvdDsKKwkJc3RibCA9IChzOCAqKSZkZVsoaW50KWR0cGFnZS0+aGVhZGVyLnN0YmxpbmRleF07CisJCWlmIChqZnMuc2luZGV4IDwgamZzLnNsYXN0aW5kZXgpIHsKKwkJCXJldHVybiAmZGVbKGludClzdGJsW2pmcy5zaW5kZXgrK11dOworCQl9IGVsc2UgaWYgKGR0cGFnZS0+aGVhZGVyLm5leHQpIHsKKwkJCWRldnJlYWQgKGR0cGFnZS0+aGVhZGVyLm5leHQgPDwgamZzLmJkbG9nLCAwLAorCQkJCSBzaXplb2YoZHRwYWdlX3QpLCAoY2hhciAqKWR0cGFnZSk7CisJCQlqZnMuc2xhc3RpbmRleCA9IGR0cGFnZS0+aGVhZGVyLm5leHRpbmRleDsKKwkJCWpmcy5zaW5kZXggPSAxOworCQkJcmV0dXJuICZkZVsoaW50KSgoczggKikmZGVbKGludClkdHBhZ2UtPmhlYWRlci5zdGJsaW5kZXhdKVswXV07CisJCX0KKwl9CisKKwlyZXR1cm4gKGpmcy5kZV9pbmRleCA8IDIpID8gJmRlX2Fsd2F5c1tqZnMuZGVfaW5kZXgrK10gOiBOVUxMOworfQorCitzdGF0aWMgbGR0ZW50cnlfdCAqCitmaXJzdF9kZW50cnkgKHZvaWQpCit7CisJZHRyb290X3QgKmR0cjsKKwlweGRfdCAqeGQ7CisJaWR0ZW50cnlfdCAqZGU7CisKKwlkdHIgPSAoZHRyb290X3QgKikmaW5vZGUtPmRpX2J0cm9vdDsKKwlqZnMuc2luZGV4ID0gMDsKKwlqZnMuZGVfaW5kZXggPSAwOworCisJZGVfYWx3YXlzWzBdLmludW1iZXIgPSBpbm9kZS0+ZGlfcGFyZW50OworCWRlX2Fsd2F5c1sxXS5pbnVtYmVyID0gaW5vZGUtPmRpX251bWJlcjsKKwlpZiAoZHRyLT5oZWFkZXIuZmxhZyAmIEJUX0xFQUYpIHsKKwkJamZzLmR0dHlwZSA9IERUVFlQRV9JTkxJTkU7CisJCWpmcy5zbGFzdGluZGV4ID0gZHRyLT5oZWFkZXIubmV4dGluZGV4OworCX0gZWxzZSB7CisJCWRlID0gKGlkdGVudHJ5X3QgKilkdHBhZ2UtPnNsb3Q7CisJCWpmcy5kdHR5cGUgPSBEVFRZUEVfUEFHRTsKKwkJeGQgPSAmKChpZHRlbnRyeV90ICopZHRyLT5zbG90KVsoaW50KWR0ci0+aGVhZGVyLnN0YmxbMF1dLnhkOworCQlmb3IgKDs7KSB7CisJCQlkZXZyZWFkIChhZGRyZXNzUFhEICh4ZCkgPDwgamZzLmJkbG9nLCAwLAorCQkJCSBzaXplb2YoZHRwYWdlX3QpLCAoY2hhciAqKWR0cGFnZSk7CisJCQlpZiAoZHRwYWdlLT5oZWFkZXIuZmxhZyAmIEJUX0xFQUYpCisJCQkJYnJlYWs7CisJCQl4ZCA9ICZkZVsoaW50KSgoczggKikmZGVbKGludClkdHBhZ2UtPmhlYWRlci5zdGJsaW5kZXhdKVswXV0ueGQ7CisJCX0KKwkJamZzLnNsYXN0aW5kZXggPSBkdHBhZ2UtPmhlYWRlci5uZXh0aW5kZXg7CisJfQorCisJcmV0dXJuIG5leHRfZGVudHJ5ICgpOworfQorCisKK3N0YXRpYyBkdHNsb3RfdCAqCituZXh0X2RzbG90IChpbnQgbmV4dCkKK3sKKwlyZXR1cm4gKGpmcy5kdHR5cGUgPT0gRFRUWVBFX0lOTElORSkKKwkJPyAoZHRzbG90X3QgKikmZHRyb290LT5zbG90W25leHRdCisJCTogJigoZHRzbG90X3QgKilkdHBhZ2UtPnNsb3QpW25leHRdOworfQorCitzdGF0aWMgdm9pZAordW5pMmFuc2kgKFVuaUNoYXIgKnVuaSwgY2hhciAqYW5zaSwgaW50IGxlbikKK3sKKwlmb3IgKDsgbGVuOyBsZW4tLSwgdW5pKyspCisJCSphbnNpKysgPSAoKnVuaSAmIDB4ZmY4MCkgPyAnPycgOiAqKGNoYXIgKil1bmk7Cit9CisKK2ludAoramZzX21vdW50ICh2b2lkKQoreworCXN0cnVjdCBqZnNfc3VwZXJibG9jayBzdXBlcjsKKworCWlmIChwYXJ0X2xlbmd0aCA8IE1JTkpGUyA+PiBTRUNUT1JfQklUUworCSAgICB8fCAhZGV2cmVhZCAoU1VQRVIxX09GRiA+PiBTRUNUT1JfQklUUywgMCwKKwkJCSBzaXplb2Yoc3RydWN0IGpmc19zdXBlcmJsb2NrKSwgKGNoYXIgKikmc3VwZXIpCisJICAgIHx8IChzdXBlci5zX21hZ2ljICE9IEpGU19NQUdJQykKKwkgICAgfHwgIWRldnJlYWQgKChBSVRCTF9PRkYgPj4gU0VDVE9SX0JJVFMpICsgRklMRVNZU1RFTV9JLAorCQkJIDAsIERJU0laRSwgKGNoYXIqKWZpbGVzZXQpKSB7CisJCXJldHVybiAwOworCX0KKworCWpmcy5ic2l6ZSA9IHN1cGVyLnNfYnNpemU7CisJamZzLmwyYnNpemUgPSBzdXBlci5zX2wyYnNpemU7CisJamZzLmJkbG9nID0gamZzLmwyYnNpemUgLSBTRUNUT1JfQklUUzsKKworCXJldHVybiAxOworfQorCitpbnQKK2pmc19yZWFkIChjaGFyICpidWYsIGludCBsZW4pCit7CisJeGFkX3QgKnhhZDsKKwlzNjQgZW5kb2ZwcmV2LCBlbmRvZmN1cjsKKwlzNjQgb2Zmc2V0LCB4YWRsZW47CisJaW50IHRvcmVhZCwgc3RhcnRwb3MsIGVuZHBvczsKKworCXN0YXJ0cG9zID0gZmlsZXBvczsKKwllbmRwb3MgPSBmaWxlcG9zICsgbGVuOworCWVuZG9mcHJldiA9ICgxVUxMIDw8IDYyKSAtIDE7CisJeGFkID0gZmlyc3RfZXh0ZW50IChpbm9kZSk7CisJZG8geworCQlvZmZzZXQgPSBvZmZzZXRYQUQgKHhhZCk7CisJCXhhZGxlbiA9IGxlbmd0aFhBRCAoeGFkKTsKKwkJaWYgKGlzaW54dCAoZmlsZXBvcyA+PiBqZnMubDJic2l6ZSwgb2Zmc2V0LCB4YWRsZW4pKSB7CisJCQllbmRvZmN1ciA9IChvZmZzZXQgKyB4YWRsZW4pIDw8IGpmcy5sMmJzaXplOyAKKwkJCXRvcmVhZCA9IChlbmRvZmN1ciA+PSBlbmRwb3MpCisJCQkJICA/IGxlbiA6IChlbmRvZmN1ciAtIGZpbGVwb3MpOworCisJCQlkaXNrX3JlYWRfZnVuYyA9IGRpc2tfcmVhZF9ob29rOworCQkJZGV2cmVhZCAoYWRkcmVzc1hBRCAoeGFkKSA8PCBqZnMuYmRsb2csCisJCQkJIGZpbGVwb3MgLSAob2Zmc2V0IDw8IGpmcy5sMmJzaXplKSwgdG9yZWFkLCBidWYpOworCQkJZGlza19yZWFkX2Z1bmMgPSBOVUxMOworCisJCQlidWYgKz0gdG9yZWFkOworCQkJbGVuIC09IHRvcmVhZDsKKwkJCWZpbGVwb3MgKz0gdG9yZWFkOworCQl9IGVsc2UgaWYgKG9mZnNldCA+IGVuZG9mcHJldikgeworCQkJdG9yZWFkID0gKChvZmZzZXQgPDwgamZzLmwyYnNpemUpID49IGVuZHBvcykKKwkJCQkgID8gbGVuIDogKChvZmZzZXQgLSBlbmRvZnByZXYpIDw8IGpmcy5sMmJzaXplKTsKKwkJCWxlbiAtPSB0b3JlYWQ7CisJCQlmaWxlcG9zICs9IHRvcmVhZDsKKwkJCWZvciAoOyB0b3JlYWQ7IHRvcmVhZC0tKSB7CisJCQkJKmJ1ZisrID0gMDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWVuZG9mcHJldiA9IG9mZnNldCArIHhhZGxlbjsgCisJCXhhZCA9IG5leHRfZXh0ZW50ICgpOworCX0gd2hpbGUgKGxlbiA+IDAgJiYgeGFkKTsKKworCXJldHVybiBmaWxlcG9zIC0gc3RhcnRwb3M7Cit9CisKK2ludAoramZzX2RpciAoY2hhciAqZGlybmFtZSkKK3sKKwljaGFyICpwdHIsICpyZXN0LCBjaDsKKwlsZHRlbnRyeV90ICpkZTsKKwlkdHNsb3RfdCAqZHM7CisJdTMyIGludW0sIHBhcmVudF9pbnVtOworCXM2NCBkaV9zaXplOworCXUzMiBkaV9tb2RlOworCWludCBuYW1sZW4sIGNtcCwgbiwgbGlua19jb3VudDsKKwljaGFyIG5hbWVidWZbSkZTX05BTUVfTUFYICsgMV0sIGxpbmtidWZbSkZTX1BBVEhfTUFYXTsKKworCXBhcmVudF9pbnVtID0gaW51bSA9IFJPT1RfSTsKKwlsaW5rX2NvdW50ID0gMDsKKwlmb3IgKDs7KSB7CisJCWRpX3JlYWQgKGludW0sIGlub2RlKTsKKwkJZGlfc2l6ZSA9IGlub2RlLT5kaV9zaXplOworCQlkaV9tb2RlID0gaW5vZGUtPmRpX21vZGU7CisKKwkJaWYgKChkaV9tb2RlICYgSUZNVCkgPT0gSUZMTkspIHsKKwkJCWlmICgrK2xpbmtfY291bnQgPiBNQVhfTElOS19DT1VOVCkgeworCQkJCWVycm51bSA9IEVSUl9TWU1MSU5LX0xPT1A7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAoZGlfc2l6ZSA8IChkaV9tb2RlICYgSU5MSU5FRUEgPyAyNTYgOiAxMjgpKSB7CisJCQkJZ3J1Yl9tZW1tb3ZlIChsaW5rYnVmLCBpbm9kZS0+ZGlfZmFzdHN5bWxpbmssIGRpX3NpemUpOworCQkJCW4gPSBkaV9zaXplOworCQkJfSBlbHNlIGlmIChkaV9zaXplIDwgSkZTX1BBVEhfTUFYIC0gMSkgeworCQkJCWZpbGVwb3MgPSAwOworCQkJCWZpbGVtYXggPSBkaV9zaXplOworCQkJCW4gPSBqZnNfcmVhZCAobGlua2J1ZiwgZmlsZW1heCk7CisJCQl9IGVsc2UgeworCQkJCWVycm51bSA9IEVSUl9GSUxFTEVOR1RIOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlpbnVtID0gKGxpbmtidWZbMF0gPT0gJy8nKSA/IFJPT1RfSSA6IHBhcmVudF9pbnVtOworCQkJd2hpbGUgKG4gPCAoSkZTX1BBVEhfTUFYIC0gMSkgJiYgKGxpbmtidWZbbisrXSA9ICpkaXJuYW1lKyspKTsKKwkJCWxpbmtidWZbbl0gPSAwOworCQkJZGlybmFtZSA9IGxpbmtidWY7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghKmRpcm5hbWUgfHwgaXNzcGFjZSAoKmRpcm5hbWUpKSB7CisJCQlpZiAoKGRpX21vZGUgJiBJRk1UKSAhPSBJRlJFRykgeworCQkJCWVycm51bSA9IEVSUl9CQURfRklMRVRZUEU7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlmaWxlcG9zID0gMDsKKwkJCWZpbGVtYXggPSBkaV9zaXplOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlpZiAoKGRpX21vZGUgJiBJRk1UKSAhPSBJRkRJUikgeworCQkJZXJybnVtID0gRVJSX0JBRF9GSUxFVFlQRTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJZm9yICg7ICpkaXJuYW1lID09ICcvJzsgZGlybmFtZSsrKTsKKworCQlmb3IgKHJlc3QgPSBkaXJuYW1lOyAoY2ggPSAqcmVzdCkgJiYgIWlzc3BhY2UgKGNoKSAmJiBjaCAhPSAnLyc7IHJlc3QrKyk7CisJCSpyZXN0ID0gMDsKKworCQlkZSA9IGZpcnN0X2RlbnRyeSAoKTsKKwkJZm9yICg7OykgeworCQkJbmFtbGVuID0gZGUtPm5hbWxlbjsKKwkJCWlmIChkZS0+bmV4dCA9PSAtMSkgeworCQkJCXVuaTJhbnNpIChkZS0+bmFtZSwgbmFtZWJ1ZiwgbmFtbGVuKTsKKwkJCQluYW1lYnVmW25hbWxlbl0gPSAwOworCQkJfSBlbHNlIHsKKwkJCQl1bmkyYW5zaSAoZGUtPm5hbWUsIG5hbWVidWYsIERUTEhEUkRBVEFMRU4pOworCQkJCXB0ciA9IG5hbWVidWY7CisJCQkJcHRyICs9IERUTEhEUkRBVEFMRU47CisJCQkJbmFtbGVuIC09IERUTEhEUkRBVEFMRU47CisJCQkJZHMgPSBuZXh0X2RzbG90IChkZS0+bmV4dCk7CisJCQkJd2hpbGUgKGRzLT5uZXh0ICE9IC0xKSB7CisJCQkJCXVuaTJhbnNpIChkcy0+bmFtZSwgcHRyLCBEVFNMT1REQVRBTEVOKTsKKwkJCQkJcHRyICs9IERUU0xPVERBVEFMRU47CisJCQkJCW5hbWxlbiAtPSBEVFNMT1REQVRBTEVOOworCQkJCQlkcyA9IG5leHRfZHNsb3QgKGRzLT5uZXh0KTsKKwkJCQl9CisJCQkJdW5pMmFuc2kgKGRzLT5uYW1lLCBwdHIsIG5hbWxlbik7CisJCQkJcHRyICs9IG5hbWxlbjsKKwkJCQkqcHRyID0gMDsKKwkJCX0KKworCQkJY21wID0gKCEqZGlybmFtZSkgPyAtMSA6IHN1YnN0cmluZyAoZGlybmFtZSwgbmFtZWJ1Zik7CisjaWZuZGVmIFNUQUdFMV81CisJCQlpZiAocHJpbnRfcG9zc2liaWxpdGllcyAmJiBjaCAhPSAnLycKKwkJCSAgICAmJiBjbXAgPD0gMCkgeworCQkJCWlmIChwcmludF9wb3NzaWJpbGl0aWVzID4gMCkKKwkJCQkJcHJpbnRfcG9zc2liaWxpdGllcyA9IC1wcmludF9wb3NzaWJpbGl0aWVzOworCQkJCXByaW50X2FfY29tcGxldGlvbiAobmFtZWJ1Zik7CisJCQl9IGVsc2UKKyNlbmRpZgorCQkJaWYgKGNtcCA9PSAwKSB7CisJCQkJcGFyZW50X2ludW0gPSBpbnVtOworCQkJCWludW0gPSBkZS0+aW51bWJlcjsKKwkJICAgICAgICAJKihkaXJuYW1lID0gcmVzdCkgPSBjaDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlID0gbmV4dF9kZW50cnkgKCk7CisJCQlpZiAoZGUgPT0gTlVMTCkgeworCQkJCWlmIChwcmludF9wb3NzaWJpbGl0aWVzIDwgMCkKKwkJCQkJcmV0dXJuIDE7CisKKwkJCQllcnJudW0gPSBFUlJfRklMRV9OT1RfRk9VTkQ7CisJCQkJKnJlc3QgPSBjaDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KK30KKworaW50CitqZnNfZW1iZWQgKGludCAqc3RhcnRfc2VjdG9yLCBpbnQgbmVlZGVkX3NlY3RvcnMpCit7CisJc3RydWN0IGpmc19zdXBlcmJsb2NrIHN1cGVyOworCisJaWYgKG5lZWRlZF9zZWN0b3JzID4gNjMKKwkgICAgfHwgIWRldnJlYWQgKFNVUEVSMV9PRkYgPj4gU0VDVE9SX0JJVFMsIDAsCisJCQkgc2l6ZW9mIChzdHJ1Y3QgamZzX3N1cGVyYmxvY2spLAorCQkJIChjaGFyICopJnN1cGVyKQorCSAgICB8fCAoc3VwZXIuc19tYWdpYyAhPSBKRlNfTUFHSUMpKSB7CisJCXJldHVybiAwOworCX0KKworCSpzdGFydF9zZWN0b3IgPSAxOworCXJldHVybiAxOworfQorCisjZW5kaWYgLyogRlNZU19KRlMgKi8KZGlmZiAtLWdpdCBhL3N0YWdlMi9mc3lzX21pbml4LmMgYi9zdGFnZTIvZnN5c19taW5peC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNzY3OTYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFnZTIvZnN5c19taW5peC5jCkBAIC0wLDAgKzEsNTM0IEBACisvKgorICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCwyMDAxLDIwMDIgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyogUmVzdHJpY3Rpb25zOgorICAgVGhpcyBpcyBNSU5JWCBWMSBvbmx5ICh5ZXQpCisgICBEaXNrIGNyZWF0aW9uIGlzIGxpa2U6CisgICBta2ZzLm1pbml4IC1jIERFVklDRSAKKyovCisKKyNpZmRlZiBGU1lTX01JTklYCisKKyNpbmNsdWRlICJzaGFyZWQuaCIKKyNpbmNsdWRlICJmaWxlc3lzLmgiCisKKy8qICNkZWZpbmUgREVCVUdfTUlOSVggKi8KKworLyogaW5kaXJlY3QgYmxvY2tzICovCitzdGF0aWMgaW50IG1hcGJsb2NrMSwgbWFwYmxvY2syLCBuYW1lbGVuOworCisvKiBzaXplcyBhcmUgYWx3YXlzIGluIGJ5dGVzLCBCTE9DSyB2YWx1ZXMgYXJlIGFsd2F5cyBpbiBERVZfQlNJWkUgKHNlY3RvcnMpICovCisjZGVmaW5lIERFVl9CU0laRSA1MTIKKworLyogaW5jbHVkZS9saW51eC9mcy5oICovCisjZGVmaW5lIEJMT0NLX1NJWkVfQklUUyAxMAorI2RlZmluZSBCTE9DS19TSVpFIAkoMTw8QkxPQ0tfU0laRV9CSVRTKQorCisvKiBtYWRlIHVwLCBkZWZhdWx0cyB0byAxIGJ1dCBjYW4gYmUgcGFzc2VkIHZpYSBtb3VudF9vcHRzICovCisjZGVmaW5lIFdISUNIX1NVUEVSIDEKKy8qIGtpbmQgb2YgZnJvbSBmcy9leHQyL3N1cGVyLmMgKGlzIE9LIGZvciBtaW5peCkgKi8KKyNkZWZpbmUgU0JMT0NLIChXSElDSF9TVVBFUiAqIEJMT0NLX1NJWkUgLyBERVZfQlNJWkUpCS8qID0gMiAqLworCisvKiBpbmNsdWRlL2FzbS1pMzg2L3R5cGUuaCAqLwordHlwZWRlZiBfX3NpZ25lZF9fIGNoYXIgX19zODsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBfX3U4OwordHlwZWRlZiBfX3NpZ25lZF9fIHNob3J0IF9fczE2OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBfX3UxNjsKK3R5cGVkZWYgX19zaWduZWRfXyBpbnQgX19zMzI7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBfX3UzMjsKKworLyogaW5jbHVkZS9saW51eC9taW5peF9mcy5oICovCisjZGVmaW5lIE1JTklYX1JPT1RfSU5PIDEKKworLyogTm90IHRoZSBzYW1lIGFzIHRoZSBib2d1cyBMSU5LX01BWCBpbiA8bGludXgvbGltaXRzLmg+LiBPaCB3ZWxsLiAqLworI2RlZmluZSBNSU5JWF9MSU5LX01BWCAgMjUwCisjZGVmaW5lIE1JTklYMl9MSU5LX01BWCA2NTUzMAorCisjZGVmaW5lIE1JTklYX0lfTUFQX1NMT1RTICAgICAgIDgKKyNkZWZpbmUgTUlOSVhfWl9NQVBfU0xPVFMgICAgICAgNjQKKyNkZWZpbmUgTUlOSVhfU1VQRVJfTUFHSUMgICAgICAgMHgxMzdGICAgICAgICAgIC8qIG9yaWdpbmFsIG1pbml4IGZzICovCisjZGVmaW5lIE1JTklYX1NVUEVSX01BR0lDMiAgICAgIDB4MTM4RiAgICAgICAgICAvKiBtaW5peCBmcywgMzAgY2hhciBuYW1lcyAqLworI2RlZmluZSBNSU5JWDJfU1VQRVJfTUFHSUMgICAgICAweDI0NjggICAgICAgICAgLyogbWluaXggVjIgZnMgKi8KKyNkZWZpbmUgTUlOSVgyX1NVUEVSX01BR0lDMiAgICAgMHgyNDc4ICAgICAgICAgIC8qIG1pbml4IFYyIGZzLCAzMCBjaGFyIG5hbWVzICovCisjZGVmaW5lIE1JTklYX1ZBTElEX0ZTICAgICAgICAgIDB4MDAwMSAgICAgICAgICAvKiBDbGVhbiBmcy4gKi8KKyNkZWZpbmUgTUlOSVhfRVJST1JfRlMgICAgICAgICAgMHgwMDAyICAgICAgICAgIC8qIGZzIGhhcyBlcnJvcnMuICovCisKKyNkZWZpbmUgTUlOSVhfSU5PREVTX1BFUl9CTE9DSyAoKEJMT0NLX1NJWkUpLyhzaXplb2YgKHN0cnVjdCBtaW5peF9pbm9kZSkpKQorI2RlZmluZSBNSU5JWDJfSU5PREVTX1BFUl9CTE9DSyAoKEJMT0NLX1NJWkUpLyhzaXplb2YgKHN0cnVjdCBtaW5peDJfaW5vZGUpKSkKKworI2RlZmluZSBNSU5JWF9WMSAgICAgICAgICAgICAgICAweDAwMDEgICAgICAgICAgLyogb3JpZ2luYWwgbWluaXggZnMgKi8KKyNkZWZpbmUgTUlOSVhfVjIgICAgICAgICAgICAgICAgMHgwMDAyICAgICAgICAgIC8qIG1pbml4IFYyIGZzICovCisKKy8qIG9yaWdpbmFsbHkgdGhpcyBpcyA6IAorI2RlZmluZSBJTk9ERV9WRVJTSU9OKGlub2RlKSAgICBpbm9kZS0+aV9zYi0+dS5taW5peF9zYi5zX3ZlcnNpb24KKyAgIGhlcmUgd2UgaGF2ZSAqLworI2RlZmluZSBJTk9ERV9WRVJTSU9OKGlub2RlKQkoU1VQRVJCTE9DSy0+c192ZXJzaW9uKQorCisvKgorICogVGhpcyBpcyB0aGUgb3JpZ2luYWwgbWluaXggaW5vZGUgbGF5b3V0IG9uIGRpc2suCisgKiBOb3RlIHRoZSA4LWJpdCBnaWQgYW5kIGF0aW1lIGFuZCBjdGltZS4KKyAqLworc3RydWN0IG1pbml4X2lub2RlIHsKKwlfX3UxNiBpX21vZGU7CisJX191MTYgaV91aWQ7CisJX191MzIgaV9zaXplOworCV9fdTMyIGlfdGltZTsKKwlfX3U4ICBpX2dpZDsKKwlfX3U4ICBpX25saW5rczsKKwlfX3UxNiBpX3pvbmVbOV07Cit9OworCisvKgorICogVGhlIG5ldyBtaW5peCBpbm9kZSBoYXMgYWxsIHRoZSB0aW1lIGVudHJpZXMsIGFzIHdlbGwgYXMKKyAqIGxvbmcgYmxvY2sgbnVtYmVycyBhbmQgYSB0aGlyZCBpbmRpcmVjdCBibG9jayAoNysxKzErMQorICogaW5zdGVhZCBvZiA3KzErMSkuIEFsc28sIHNvbWUgcHJldmlvdXNseSA4LWJpdCB2YWx1ZXMgYXJlCisgKiBub3cgMTYtYml0LiBUaGUgaW5vZGUgaXMgbm93IDY0IGJ5dGVzIGluc3RlYWQgb2YgMzIuCisgKi8KK3N0cnVjdCBtaW5peDJfaW5vZGUgeworCV9fdTE2IGlfbW9kZTsKKwlfX3UxNiBpX25saW5rczsKKwlfX3UxNiBpX3VpZDsKKwlfX3UxNiBpX2dpZDsKKwlfX3UzMiBpX3NpemU7CisJX191MzIgaV9hdGltZTsKKwlfX3UzMiBpX210aW1lOworCV9fdTMyIGlfY3RpbWU7CisJX191MzIgaV96b25lWzEwXTsKK307CisKKy8qCisgKiBtaW5peCBzdXBlci1ibG9jayBkYXRhIG9uIGRpc2sKKyAqLworc3RydWN0IG1pbml4X3N1cGVyX2Jsb2NrIHsKKyAgICAgICAgX191MTYgc19uaW5vZGVzOworICAgICAgICBfX3UxNiBzX256b25lczsKKyAgICAgICAgX191MTYgc19pbWFwX2Jsb2NrczsKKyAgICAgICAgX191MTYgc196bWFwX2Jsb2NrczsKKyAgICAgICAgX191MTYgc19maXJzdGRhdGF6b25lOworICAgICAgICBfX3UxNiBzX2xvZ196b25lX3NpemU7CisgICAgICAgIF9fdTMyIHNfbWF4X3NpemU7CisgICAgICAgIF9fdTE2IHNfbWFnaWM7CisgICAgICAgIF9fdTE2IHNfc3RhdGU7CisgICAgICAgIF9fdTMyIHNfem9uZXM7Cit9OworCitzdHJ1Y3QgbWluaXhfZGlyX2VudHJ5IHsKKyAgICAgICAgX191MTYgaW5vZGU7CisgICAgICAgIGNoYXIgbmFtZVswXTsKK307CisKKy8qIG1hZGUgdXAsIHRoZXNlIGFyZSBwb2ludGVycyBpbnRvIEZTWVNfQlVGICovCisvKiByZWFkIG9uY2UsIGFsd2F5cyBzdGF5cyB0aGVyZTogKi8KKyNkZWZpbmUgU1VQRVJCTE9DSyBcCisgICAgKChzdHJ1Y3QgbWluaXhfc3VwZXJfYmxvY2sgKikoRlNZU19CVUYpKQorI2RlZmluZSBJTk9ERSBcCisgICAgKChzdHJ1Y3QgbWluaXhfaW5vZGUgKikoKGludCkgU1VQRVJCTE9DSyArIEJMT0NLX1NJWkUpKQorI2RlZmluZSBEQVRBQkxPQ0sxIFwKKyAgICAoKGludCkoKGludClJTk9ERSArIHNpemVvZihzdHJ1Y3QgbWluaXhfaW5vZGUpKSkKKyNkZWZpbmUgREFUQUJMT0NLMiBcCisgICAgKChpbnQpKChpbnQpREFUQUJMT0NLMSArIEJMT0NLX1NJWkUpKQorCisvKiBsaW51eC9zdGF0LmggKi8KKyNkZWZpbmUgU19JRk1UICAwMDE3MDAwMAorI2RlZmluZSBTX0lGTE5LICAwMTIwMDAwCisjZGVmaW5lIFNfSUZSRUcgIDAxMDAwMDAKKyNkZWZpbmUgU19JRkRJUiAgMDA0MDAwMAorI2RlZmluZSBTX0lTTE5LKG0pCSgoKG0pICYgU19JRk1UKSA9PSBTX0lGTE5LKQorI2RlZmluZSBTX0lTUkVHKG0pICAgICAgKCgobSkgJiBTX0lGTVQpID09IFNfSUZSRUcpCisjZGVmaW5lIFNfSVNESVIobSkgICAgICAoKChtKSAmIFNfSUZNVCkgPT0gU19JRkRJUikKKworI2RlZmluZSBQQVRIX01BWCAgICAgICAgICAgICAgICAxMDI0CS8qIGluY2x1ZGUvbGludXgvbGltaXRzLmggKi8KKyNkZWZpbmUgTUFYX0xJTktfQ09VTlQgICAgICAgICAgICAgNQkvKiBudW1iZXIgb2Ygc3ltYm9saWMgbGlua3MgdG8gZm9sbG93ICovCisKKy8qIGNoZWNrIGZpbGVzeXN0ZW0gdHlwZXMgYW5kIHJlYWQgc3VwZXJibG9jayBpbnRvIG1lbW9yeSBidWZmZXIgKi8KK2ludAorbWluaXhfbW91bnQgKHZvaWQpCit7CisgIGlmICgoKGN1cnJlbnRfZHJpdmUgJiAweDgwKSB8fCBjdXJyZW50X3NsaWNlICE9IDApCisgICAgICAmJiAhIElTX1BDX1NMSUNFX1RZUEVfTUlOSVggKGN1cnJlbnRfc2xpY2UpCisgICAgICAmJiAhIElTX1BDX1NMSUNFX1RZUEVfQlNEX1dJVEhfRlMgKGN1cnJlbnRfc2xpY2UsIEZTX09USEVSKSkKKyAgICByZXR1cm4gMDsJCQkvKiBUaGUgcGFydGl0aW9uIGlzIG5vdCBvZiBNSU5JWCB0eXBlICovCisgIAorICBpZiAocGFydF9sZW5ndGggPCAoU0JMT0NLICsKKwkJICAgICAoc2l6ZW9mIChzdHJ1Y3QgbWluaXhfc3VwZXJfYmxvY2spIC8gREVWX0JTSVpFKSkpCisgICAgcmV0dXJuIDA7CQkJLyogVGhlIHBhcnRpdGlvbiBpcyB0b28gc2hvcnQgKi8KKyAgCisgIGlmICghZGV2cmVhZCAoU0JMT0NLLCAwLCBzaXplb2YgKHN0cnVjdCBtaW5peF9zdXBlcl9ibG9jayksCisJCShjaGFyICopIFNVUEVSQkxPQ0spKQorICAgIHJldHVybiAwOwkJCS8qIENhbm5vdCByZWFkIHN1cGVyYmxvY2sgKi8KKyAgCisgIHN3aXRjaCAoU1VQRVJCTE9DSy0+c19tYWdpYykKKyAgICB7CisgICAgY2FzZSBNSU5JWF9TVVBFUl9NQUdJQzoKKyAgICAgIG5hbWVsZW4gPSAxNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTUlOSVhfU1VQRVJfTUFHSUMyOgorICAgICAgbmFtZWxlbiA9IDMwOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOwkJCS8qIFVuc3VwcG9ydGVkIHR5cGUgKi8KKyAgICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIFRha2VzIGEgZmlsZSBzeXN0ZW0gYmxvY2sgbnVtYmVyIGFuZCByZWFkcyBpdCBpbnRvIEJVRkZFUi4gKi8KK3N0YXRpYyBpbnQKK21pbml4X3JkZnNiIChpbnQgZnNibG9jaywgaW50IGJ1ZmZlcikKK3sKKyAgcmV0dXJuIGRldnJlYWQgKGZzYmxvY2sgKiAoQkxPQ0tfU0laRSAvIERFVl9CU0laRSksIDAsCisJCSAgQkxPQ0tfU0laRSwgKGNoYXIgKikgYnVmZmVyKTsKK30KKworLyogTWFwcyBMT0dJQ0FMX0JMT0NLICh0aGUgZmlsZSBvZmZzZXQgZGl2aWRlZCBieSB0aGUgYmxvY2tzaXplKSBpbnRvCisgICBhIHBoeXNpY2FsIGJsb2NrICh0aGUgbG9jYXRpb24gaW4gdGhlIGZpbGUgc3lzdGVtKSB2aWEgYW4gaW5vZGUuICovCitzdGF0aWMgaW50CittaW5peF9ibG9ja19tYXAgKGludCBsb2dpY2FsX2Jsb2NrKQoreworICBpbnQgaTsKKworICBpZiAobG9naWNhbF9ibG9jayA8IDcpCisgICAgcmV0dXJuIElOT0RFLT5pX3pvbmVbbG9naWNhbF9ibG9ja107CisKKyAgbG9naWNhbF9ibG9jayAtPSA3OworICBpZiAobG9naWNhbF9ibG9jayA8IDUxMikKKyAgICB7CisgICAgICBpID0gSU5PREUtPmlfem9uZVs3XTsKKyAgICAgIAorICAgICAgaWYgKCFpIHx8ICgobWFwYmxvY2sxICE9IDEpCisJCSAmJiAhbWluaXhfcmRmc2IgKGksIERBVEFCTE9DSzEpKSkKKwl7CisJICBlcnJudW0gPSBFUlJfRlNZU19DT1JSVVBUOworCSAgcmV0dXJuIC0xOworCX0KKyAgICAgIG1hcGJsb2NrMSA9IDE7CisgICAgICByZXR1cm4gKChfX3UxNiAqKSBEQVRBQkxPQ0sxKSBbbG9naWNhbF9ibG9ja107CisgICAgfQorCisgIGxvZ2ljYWxfYmxvY2sgLT0gNTEyOworICBpID0gSU5PREUtPmlfem9uZVs4XTsKKyAgaWYgKCFpIHx8ICgobWFwYmxvY2sxICE9IDIpCisJICAgICAmJiAhbWluaXhfcmRmc2IgKGksIERBVEFCTE9DSzEpKSkKKyAgICB7CisgICAgICBlcnJudW0gPSBFUlJfRlNZU19DT1JSVVBUOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgbWFwYmxvY2sxID0gMjsKKyAgaSA9ICgoX191MTYgKikgREFUQUJMT0NLMSlbbG9naWNhbF9ibG9jayA+PiA5XTsKKyAgaWYgKCFpIHx8ICgobWFwYmxvY2syICE9IGkpCisJICAgICAmJiAhbWluaXhfcmRmc2IgKGksIERBVEFCTE9DSzIpKSkKKyAgICB7CisgICAgICBlcnJudW0gPSBFUlJfRlNZU19DT1JSVVBUOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgbWFwYmxvY2syID0gaTsKKyAgcmV0dXJuICgoX191MTYgKikgREFUQUJMT0NLMilbbG9naWNhbF9ibG9jayAmIDUxMV07Cit9CisKKy8qIHJlYWQgZnJvbSBJTk9ERSBpbnRvIEJVRiAqLworaW50CittaW5peF9yZWFkIChjaGFyICpidWYsIGludCBsZW4pCit7CisgIGludCBsb2dpY2FsX2Jsb2NrOworICBpbnQgb2Zmc2V0OworICBpbnQgbWFwOworICBpbnQgcmV0ID0gMDsKKyAgaW50IHNpemUgPSAwOworCisgIHdoaWxlIChsZW4gPiAwKQorICAgIHsKKyAgICAgIC8qIGZpbmQgdGhlIChsb2dpY2FsKSBibG9jayBjb21wb25lbnQgb2Ygb3VyIGxvY2F0aW9uICovCisgICAgICBsb2dpY2FsX2Jsb2NrID0gZmlsZXBvcyA+PiBCTE9DS19TSVpFX0JJVFM7CisgICAgICBvZmZzZXQgPSBmaWxlcG9zICYgKEJMT0NLX1NJWkUgLSAxKTsKKyAgICAgIG1hcCA9IG1pbml4X2Jsb2NrX21hcCAobG9naWNhbF9ibG9jayk7CisjaWZkZWYgREVCVUdfTUlOSVgKKyAgICAgIHByaW50ZiAoIm1hcD0lZFxuIiwgbWFwKTsKKyNlbmRpZgorICAgICAgaWYgKG1hcCA8IDApCisJYnJlYWs7CisKKyAgICAgIHNpemUgPSBCTE9DS19TSVpFOworICAgICAgc2l6ZSAtPSBvZmZzZXQ7CisgICAgICBpZiAoc2l6ZSA+IGxlbikKKwlzaXplID0gbGVuOworCisgICAgICBkaXNrX3JlYWRfZnVuYyA9IGRpc2tfcmVhZF9ob29rOworCisgICAgICBkZXZyZWFkIChtYXAgKiAoQkxPQ0tfU0laRSAvIERFVl9CU0laRSksCisJICAgICAgIG9mZnNldCwgc2l6ZSwgYnVmKTsKKworICAgICAgZGlza19yZWFkX2Z1bmMgPSBOVUxMOworCisgICAgICBidWYgKz0gc2l6ZTsKKyAgICAgIGxlbiAtPSBzaXplOworICAgICAgZmlsZXBvcyArPSBzaXplOworICAgICAgcmV0ICs9IHNpemU7CisgICAgfQorCisgIGlmIChlcnJudW0pCisgICAgcmV0ID0gMDsKKworICByZXR1cm4gcmV0OworfQorCisvKiBwcmVjb25kaXRpb25zOiBtaW5peF9tb3VudCBhbHJlYWR5IGV4ZWN1dGVkLCB0aGVyZWZvcmUgc3VwYmxrIGluIGJ1ZmZlcgorICAgICBrbm93biBhcyBTVVBFUkJMT0NLCisgICByZXR1cm5zOiAwIGlmIGVycm9yLCBub256ZXJvIGlmZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCB0aGUgZmlsZSBzdWNjZXNzZnVsbHkKKyAgIHBvc3Rjb25kaXRpb25zOiBvbiBhIG5vbnplcm8gcmV0dXJuLCBidWZmZXIga25vd24gYXMgSU5PREUgY29udGFpbnMgdGhlCisgICAgIGlub2RlIG9mIHRoZSBmaWxlIHdlIHdlcmUgdHJ5aW5nIHRvIGxvb2sgdXAKKyAgIHNpZGUgZWZmZWN0czogbm9uZSB5ZXQgICovCitpbnQKK21pbml4X2RpciAoY2hhciAqZGlybmFtZSkKK3sKKyAgaW50IGN1cnJlbnRfaW5vID0gTUlOSVhfUk9PVF9JTk87ICAvKiBzdGFydCBhdCB0aGUgcm9vdCAqLworICBpbnQgdXBkaXJfaW5vID0gY3VycmVudF9pbm87CSAgICAgLyogdGhlIHBhcmVudCBvZiB0aGUgY3VycmVudCBkaXJlY3RvcnkgKi8KKyAgaW50IGlub19ibGs7CQkJICAgICAvKiBmcyBwb2ludGVyIG9mIHRoZSBpbm9kZSdzIGluZm8gKi8KKworICBpbnQgc3RyX2NoayA9IDA7CQkgICAgIC8qIHVzZWQgb3QgaG9sZCB0aGUgcmVzdWx0cyBvZiBhIHN0cmluZworCQkJCSAgICAgICAgY29tcGFyZSAqLworCisgIHN0cnVjdCBtaW5peF9pbm9kZSAqIHJhd19pbm9kZTsgICAgLyogaW5vZGUgaW5mbyBmb3IgY3VycmVudF9pbm8gKi8KKworICBjaGFyIGxpbmtidWZbUEFUSF9NQVhdOwkgICAgIC8qIGJ1ZmZlciBmb3IgZm9sbG93aW5nIHN5bS1saW5rcyAqLworICBpbnQgbGlua19jb3VudCA9IDA7CisKKyAgY2hhciAqIHJlc3Q7CisgIGNoYXIgY2g7CisKKyAgaW50IG9mZjsJCQkgICAgIC8qIG9mZnNldCB3aXRoaW4gYmxvY2sgb2YgZGlyZWN0b3J5IAorCQkJCQllbnRyeSAqLworICBpbnQgbG9jOwkJCSAgICAgLyogbG9jYXRpb24gd2l0aGluIGEgZGlyZWN0b3J5ICovCisgIGludCBibGs7CQkJICAgICAvKiB3aGljaCBkYXRhIGJsayB3aXRoaW4gZGlyIGVudHJ5ICovCisgIGxvbmcgbWFwOwkJCSAgICAgLyogZnMgcG9pbnRlciBvZiBhIHBhcnRpY3VsYXIgYmxvY2sgZnJvbQorCQkJCQlkaXIgZW50cnkgKi8KKyAgc3RydWN0IG1pbml4X2Rpcl9lbnRyeSAqIGRwOwkgICAgIC8qIHBvaW50ZXIgdG8gZGlyZWN0b3J5IGVudHJ5ICovCisKKyAgLyogbG9vcCBpbnZhcmlhbnRzOgorICAgICBjdXJyZW50X2lubyA9IGlub2RlIHRvIGxvb2t1cAorICAgICBkaXJuYW1lID0gcG9pbnRlciB0byBmaWxlbmFtZSBjb21wb25lbnQgd2UgYXJlIGN1ciBsb29raW5nIHVwIHdpdGhpbgorICAgICB0aGUgZGlyZWN0b3J5IGtub3duIHBvaW50ZWQgdG8gYnkgY3VycmVudF9pbm8gKGlmIGFueSkgKi8KKworI2lmZGVmIERFQlVHX01JTklYCisgIHByaW50ZiAoIlxuIik7CisjZW5kaWYgIAorCisgIHdoaWxlICgxKQorICAgIHsKKyNpZmRlZiBERUJVR19NSU5JWAorICAgICAgcHJpbnRmICgiaW5vZGUgJWQsIGRpcm5hbWUgJXNcbiIsIGN1cnJlbnRfaW5vLCBkaXJuYW1lKTsKKyNlbmRpZgorCisgICAgICBpbm9fYmxrID0gKDIgKyBTVVBFUkJMT0NLLT5zX2ltYXBfYmxvY2tzICsgU1VQRVJCTE9DSy0+c196bWFwX2Jsb2NrcworCQkgKyAoY3VycmVudF9pbm8gLSAxKSAvIE1JTklYX0lOT0RFU19QRVJfQkxPQ0spOworICAgICAgaWYgKCEgbWluaXhfcmRmc2IgKGlub19ibGssIChpbnQpIElOT0RFKSkKKwlyZXR1cm4gMDsKKworICAgICAgLyogcmVzZXQgaW5kaXJlY3QgYmxvY2tzISAqLworICAgICAgbWFwYmxvY2syID0gbWFwYmxvY2sxID0gLTE7CisKKyAgICAgIHJhd19pbm9kZSA9IElOT0RFICsgKChjdXJyZW50X2lubyAtIDEpICUgTUlOSVhfSU5PREVTX1BFUl9CTE9DSyk7CisKKyAgICAgIC8qIGNvcHkgaW5vZGUgdG8gZml4ZWQgbG9jYXRpb24gKi8KKyAgICAgIG1lbW1vdmUgKCh2b2lkICopIElOT0RFLCAodm9pZCAqKSByYXdfaW5vZGUsIAorCSAgICAgICBzaXplb2YgKHN0cnVjdCBtaW5peF9pbm9kZSkpOworCisgICAgICAvKiBJZiB3ZSd2ZSBnb3QgYSBzeW1ib2xpYyBsaW5rLCB0aGVuIGNoYXNlIGl0LiAqLworICAgICAgaWYgKFNfSVNMTksgKElOT0RFLT5pX21vZGUpKQorCXsKKwkgIGludCBsZW47CisKKwkgIGlmICgrK2xpbmtfY291bnQgPiBNQVhfTElOS19DT1VOVCkKKwkgICAgeworCSAgICAgIGVycm51bSA9IEVSUl9TWU1MSU5LX0xPT1A7CisJICAgICAgcmV0dXJuIDA7CisJICAgIH0KKyNpZmRlZiBERUJVR19NSU5JWAorCSAgcHJpbnRmICgiU19JU0xOSyAoJXMpXG4iLCBkaXJuYW1lKTsKKyNlbmRpZgorCisJICAvKiBGaW5kIG91dCBob3cgbG9uZyBvdXIgcmVtYWluaW5nIG5hbWUgaXMuICovCisJICBsZW4gPSAwOworCSAgd2hpbGUgKGRpcm5hbWVbbGVuXSAmJiAhaXNzcGFjZSAoZGlybmFtZVtsZW5dKSkKKwkgICAgbGVuKys7CisKKwkgIC8qIEdldCB0aGUgc3ltbGluayBzaXplLiAqLworCSAgZmlsZW1heCA9IChJTk9ERS0+aV9zaXplKTsKKwkgIGlmIChmaWxlbWF4ICsgbGVuID4gc2l6ZW9mIChsaW5rYnVmKSAtIDIpCisJICAgIHsKKwkgICAgICBlcnJudW0gPSBFUlJfRklMRUxFTkdUSDsKKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCisJICBpZiAobGVuKQorCSAgICB7CisJICAgICAgLyogQ29weSB0aGUgcmVtYWluaW5nIG5hbWUgdG8gdGhlIGVuZCBvZiB0aGUgc3ltbGluayBkYXRhLgorCSAgICAgICAgIE5vdGUgdGhhdCBESVJOQU1FIGFuZCBMSU5LQlVGIG1heSBvdmVybGFwISAqLworCSAgICAgIG1lbW1vdmUgKGxpbmtidWYgKyBmaWxlbWF4LCBkaXJuYW1lLCBsZW4pOworCSAgICB9CisJICBsaW5rYnVmW2ZpbGVtYXggKyBsZW5dID0gJ1wwJzsKKworCSAgLyogUmVhZCB0aGUgbmVjZXNzYXJ5IGJsb2NrcywgYW5kIHJlc2V0IHRoZSBmaWxlIHBvaW50ZXIuICovCisJICBsZW4gPSBncnViX3JlYWQgKGxpbmtidWYsIGZpbGVtYXgpOworCSAgZmlsZXBvcyA9IDA7CisJICBpZiAoIWxlbikKKwkgICAgcmV0dXJuIDA7CisKKyNpZmRlZiBERUJVR19NSU5JWAorCSAgcHJpbnRmICgic3ltbGluaz0lc1xuIiwgbGlua2J1Zik7CisjZW5kaWYKKworCSAgZGlybmFtZSA9IGxpbmtidWY7CisJICBpZiAoKmRpcm5hbWUgPT0gJy8nKQorCSAgICB7CisJICAgICAgLyogSXQncyBhbiBhYnNvbHV0ZSBsaW5rLCBzbyBsb29rIGl0IHVwIGluIHJvb3QuICovCisJICAgICAgY3VycmVudF9pbm8gPSBNSU5JWF9ST09UX0lOTzsKKwkgICAgICB1cGRpcl9pbm8gPSBjdXJyZW50X2lubzsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogUmVsYXRpdmUsIHNvIGxvb2sgaXQgdXAgaW4gb3VyIHBhcmVudCBkaXJlY3RvcnkuICovCisJICAgICAgY3VycmVudF9pbm8gPSB1cGRpcl9pbm87CisJICAgIH0KKworCSAgLyogVHJ5IGFnYWluIHVzaW5nIHRoZSBuZXcgbmFtZS4gKi8KKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogSWYgZW5kIG9mIGZpbGVuYW1lLCBJTk9ERSBwb2ludHMgdG8gdGhlIGZpbGUncyBpbm9kZSAqLworICAgICAgaWYgKCEqZGlybmFtZSB8fCBpc3NwYWNlICgqZGlybmFtZSkpCisJeworCSAgaWYgKCFTX0lTUkVHIChJTk9ERS0+aV9tb2RlKSkKKwkgICAgeworCSAgICAgIGVycm51bSA9IEVSUl9CQURfRklMRVRZUEU7CisJICAgICAgcmV0dXJuIDA7CisJICAgIH0KKworCSAgZmlsZW1heCA9IChJTk9ERS0+aV9zaXplKTsKKwkgIHJldHVybiAxOworCX0KKworICAgICAgLyogZWxzZSB3ZSBoYXZlIHRvIHRyYXZlcnNlIGEgZGlyZWN0b3J5ICovCisgICAgICB1cGRpcl9pbm8gPSBjdXJyZW50X2lubzsKKworICAgICAgLyogc2tpcCBvdmVyIHNsYXNoZXMgKi8KKyAgICAgIHdoaWxlICgqZGlybmFtZSA9PSAnLycpCisJZGlybmFtZSsrOworCisgICAgICAvKiBpZiB0aGlzIGlzbid0IGEgZGlyZWN0b3J5IG9mIHN1ZmZpY2llbnQgc2l6ZSB0byBob2xkIG91ciBmaWxlLCAKKwkgYWJvcnQgKi8KKyAgICAgIGlmICghKElOT0RFLT5pX3NpemUpIHx8ICFTX0lTRElSIChJTk9ERS0+aV9tb2RlKSkKKwl7CisJICBlcnJudW0gPSBFUlJfQkFEX0ZJTEVUWVBFOworCSAgcmV0dXJuIDA7CisJfQorCisgICAgICAvKiBza2lwIHRvIG5leHQgc2xhc2ggb3IgZW5kIG9mIGZpbGVuYW1lIChzcGFjZSkgKi8KKyAgICAgIGZvciAocmVzdCA9IGRpcm5hbWU7IChjaCA9ICpyZXN0KSAmJiAhaXNzcGFjZSAoY2gpICYmIGNoICE9ICcvJzsKKwkgICByZXN0KyspOworCisgICAgICAvKiBsb29rIHRocm91Z2ggdGhpcyBkaXJlY3RvcnkgYW5kIGZpbmQgdGhlIG5leHQgZmlsZW5hbWUgY29tcG9uZW50ICovCisgICAgICAvKiBpbnZhcmlhbnQ6IHJlc3QgcG9pbnRzIHRvIHNsYXNoIGFmdGVyIHRoZSBuZXh0IGZpbGVuYW1lIGNvbXBvbmVudCAqLworICAgICAgKnJlc3QgPSAwOworICAgICAgbG9jID0gMDsKKworICAgICAgZG8KKwl7CisjaWZkZWYgREVCVUdfTUlOSVgKKwkgIHByaW50ZiAoImRpcm5hbWU9YCVzJywgcmVzdD1gJXMnLCBsb2M9JWRcbiIsIGRpcm5hbWUsIHJlc3QsIGxvYyk7CisjZW5kaWYKKworCSAgLyogaWYgb3VyIGxvY2F0aW9uL2J5dGUgb2Zmc2V0IGludG8gdGhlIGRpcmVjdG9yeSBleGNlZWRzIHRoZSBzaXplLAorCSAgICAgZ2l2ZSB1cCAqLworCSAgaWYgKGxvYyA+PSBJTk9ERS0+aV9zaXplKQorCSAgICB7CisJICAgICAgaWYgKHByaW50X3Bvc3NpYmlsaXRpZXMgPCAwKQorCQl7CisjaWYgMAorCQkgIHB1dGNoYXIgKCdcbicpOworI2VuZGlmCisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBlcnJudW0gPSBFUlJfRklMRV9OT1RfRk9VTkQ7CisJCSAgKnJlc3QgPSBjaDsKKwkJfQorCSAgICAgIHJldHVybiAocHJpbnRfcG9zc2liaWxpdGllcyA8IDApOworCSAgICB9CisKKwkgIC8qIGVsc2UsIGZpbmQgdGhlIChsb2dpY2FsKSBibG9jayBjb21wb25lbnQgb2Ygb3VyIGxvY2F0aW9uICovCisJICBibGsgPSBsb2MgPj4gQkxPQ0tfU0laRV9CSVRTOworCisJICAvKiB3ZSBrbm93IHdoaWNoIGxvZ2ljYWwgYmxvY2sgb2YgdGhlIGRpcmVjdG9yeSBlbnRyeSB3ZSBhcmUgbG9va2luZworCSAgICAgZm9yLCBub3cgd2UgaGF2ZSB0byB0cmFuc2xhdGUgdGhhdCB0byB0aGUgcGh5c2ljYWwgKGZzKSBibG9jayBvbgorCSAgICAgdGhlIGRpc2sgKi8KKwkgIG1hcCA9IG1pbml4X2Jsb2NrX21hcCAoYmxrKTsKKyNpZmRlZiBERUJVR19NSU5JWAorCSAgcHJpbnRmICgiZnMgYmxvY2s9JWRcbiIsIG1hcCk7CisjZW5kaWYKKwkgIG1hcGJsb2NrMiA9IC0xOworCSAgaWYgKChtYXAgPCAwKSB8fCAhbWluaXhfcmRmc2IgKG1hcCwgREFUQUJMT0NLMikpCisJICAgIHsKKwkgICAgICBlcnJudW0gPSBFUlJfRlNZU19DT1JSVVBUOworCSAgICAgICpyZXN0ID0gY2g7CisJICAgICAgcmV0dXJuIDA7CisJICAgIH0KKwkgIG9mZiA9IGxvYyAmIChCTE9DS19TSVpFIC0gMSk7CisJICBkcCA9IChzdHJ1Y3QgbWluaXhfZGlyX2VudHJ5ICopIChEQVRBQkxPQ0syICsgb2ZmKTsKKwkgIC8qIGFkdmFuY2UgbG9jIHByZW1hdHVyZWx5IHRvIG5leHQgb24tZGlzayBkaXJlY3RvcnkgZW50cnkgICovCisJICBsb2MgKz0gc2l6ZW9mIChkcC0+aW5vZGUpICsgbmFtZWxlbjsKKworCSAgLyogTk9URTogbWluaXggZmlsZW5hbWVzIGFyZSBOVUxMIHRlcm1pbmF0ZWQgaWYgPCBOQU1FTEVOCisJICAgICBlbHNlIGV4YWN0ICovCisKKyNpZmRlZiBERUJVR19NSU5JWAorCSAgcHJpbnRmICgiZGlyZWN0b3J5IGVudHJ5IGlubz0lZFxuIiwgZHAtPmlub2RlKTsKKwkgIGlmIChkcC0+aW5vZGUpCisJICAgIHByaW50ZiAoImVudHJ5PSVzXG4iLCBkcC0+bmFtZSk7CisjZW5kaWYKKworCSAgaWYgKGRwLT5pbm9kZSkKKwkgICAgeworCSAgICAgIGludCBzYXZlZF9jID0gZHAtPm5hbWVbbmFtZWxlbl07CisKKwkgICAgICBkcC0+bmFtZVtuYW1lbGVuXSA9IDA7CisJICAgICAgc3RyX2NoayA9IHN1YnN0cmluZyAoZGlybmFtZSwgZHAtPm5hbWUpOworCisjIGlmbmRlZiBTVEFHRTFfNQorCSAgICAgIGlmIChwcmludF9wb3NzaWJpbGl0aWVzICYmIGNoICE9ICcvJworCQkgICYmICghKmRpcm5hbWUgfHwgc3RyX2NoayA8PSAwKSkKKwkJeworCQkgIGlmIChwcmludF9wb3NzaWJpbGl0aWVzID4gMCkKKwkJICAgIHByaW50X3Bvc3NpYmlsaXRpZXMgPSAtcHJpbnRfcG9zc2liaWxpdGllczsKKwkJICBwcmludF9hX2NvbXBsZXRpb24gKGRwLT5uYW1lKTsKKwkJfQorIyBlbmRpZgorCisJICAgICAgZHAtPm5hbWVbbmFtZWxlbl0gPSBzYXZlZF9jOworCSAgICB9CisKKwl9CisgICAgICB3aGlsZSAoIWRwLT5pbm9kZSB8fCAoc3RyX2NoayB8fCAocHJpbnRfcG9zc2liaWxpdGllcyAmJiBjaCAhPSAnLycpKSk7CisKKyAgICAgIGN1cnJlbnRfaW5vID0gZHAtPmlub2RlOworICAgICAgKihkaXJuYW1lID0gcmVzdCkgPSBjaDsKKyAgICB9CisgIC8qIG5ldmVyIGdldCBoZXJlICovCit9CisKKyNlbmRpZiAvKiBGU1lTX01JTklYICovCmRpZmYgLS1naXQgYS9zdGFnZTIvZnN5c19yZWlzZXJmcy5jIGIvc3RhZ2UyL2ZzeXNfcmVpc2VyZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2VjNWY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3RhZ2UyL2ZzeXNfcmVpc2VyZnMuYwpAQCAtMCwwICsxLDEyMzggQEAKKy8qIGZzeXNfcmVpc2VyZnMuYyAtIGFuIGltcGxlbWVudGF0aW9uIGZvciB0aGUgUmVpc2VyRlMgZmlsZXN5c3RlbSAqLworLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZmRlZiBGU1lTX1JFSVNFUkZTCisjaW5jbHVkZSAic2hhcmVkLmgiCisjaW5jbHVkZSAiZmlsZXN5cy5oIgorCisjdW5kZWYgUkVJU0VSREVCVUcKKworLyogU29tZSBwYXJ0cyBvZiB0aGlzIGNvZGUgKG1haW5seSB0aGUgc3RydWN0dXJlcyBhbmQgZGVmaW5lcykgYXJlCisgKiBmcm9tIHRoZSBvcmlnaW5hbCByZWlzZXIgZnMgY29kZSwgYXMgZm91bmQgaW4gdGhlIGxpbnV4IGtlcm5lbC4KKyAqLworCisvKiBpbmNsdWRlL2FzbS1pMzg2L3R5cGVzLmggKi8KK3R5cGVkZWYgX19zaWduZWRfXyBjaGFyIF9fczg7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgX191ODsKK3R5cGVkZWYgX19zaWduZWRfXyBzaG9ydCBfX3MxNjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgX191MTY7Cit0eXBlZGVmIF9fc2lnbmVkX18gaW50IF9fczMyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgX191MzI7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBfX3U2NDsKKworLyogbGludXgvcG9zaXhfdHlwZS5oICovCit0eXBlZGVmIGxvbmcgbGludXhfb2ZmX3Q7CisKKy8qIGxpbnV4L2xpdHRsZV9lbmRpYW4uaCAqLworI2RlZmluZSBfX2NwdV90b19sZTY0KHgpICgoX191NjQpICh4KSkKKyNkZWZpbmUgX19sZTY0X3RvX2NwdSh4KSAoKF9fdTY0KSAoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlMzIoeCkgKChfX3UzMikgKHgpKQorI2RlZmluZSBfX2xlMzJfdG9fY3B1KHgpICgoX191MzIpICh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUxNih4KSAoKF9fdTE2KSAoeCkpCisjZGVmaW5lIF9fbGUxNl90b19jcHUoeCkgKChfX3UxNikgKHgpKQorCisvKiBpbmNsdWRlL2xpbnV4L3JlaXNlcl9mcy5oICovCisvKiBUaGlzIGlzIHRoZSBuZXcgc3VwZXIgYmxvY2sgb2YgYSBqb3VybmFsaW5nIHJlaXNlcmZzIHN5c3RlbSAqLworc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrCit7CisgIF9fdTMyIHNfYmxvY2tfY291bnQ7CQkJLyogYmxvY2tzIGNvdW50ICAgICAgICAgKi8KKyAgX191MzIgc19mcmVlX2Jsb2NrczsgICAgICAgICAgICAgICAgICAvKiBmcmVlIGJsb2NrcyBjb3VudCAgICAqLworICBfX3UzMiBzX3Jvb3RfYmxvY2s7ICAgICAgICAgICAJLyogcm9vdCBibG9jayBudW1iZXIgICAgKi8KKyAgX191MzIgc19qb3VybmFsX2Jsb2NrOyAgICAgICAgICAgCS8qIGpvdXJuYWwgYmxvY2sgbnVtYmVyICAgICovCisgIF9fdTMyIHNfam91cm5hbF9kZXY7ICAgICAgICAgICAJLyogam91cm5hbCBkZXZpY2UgbnVtYmVyICAqLworICBfX3UzMiBzX2pvdXJuYWxfc2l6ZTsgCQkvKiBzaXplIG9mIHRoZSBqb3VybmFsIG9uIEZTIGNyZWF0aW9uLiAgdXNlZCB0byBtYWtlIHN1cmUgdGhleSBkb24ndCBvdmVyZmxvdyBpdCAqLworICBfX3UzMiBzX2pvdXJuYWxfdHJhbnNfbWF4OyAgICAgICAgICAgIC8qIG1heCBudW1iZXIgb2YgYmxvY2tzIGluIGEgdHJhbnNhY3Rpb24uICAqLworICBfX3UzMiBzX2pvdXJuYWxfbWFnaWM7ICAgICAgICAgICAgICAgIC8qIHJhbmRvbSB2YWx1ZSBtYWRlIG9uIGZzIGNyZWF0aW9uICovCisgIF9fdTMyIHNfam91cm5hbF9tYXhfYmF0Y2g7ICAgICAgICAgICAgLyogbWF4IG51bWJlciBvZiBibG9ja3MgdG8gYmF0Y2ggaW50byBhIHRyYW5zICovCisgIF9fdTMyIHNfam91cm5hbF9tYXhfY29tbWl0X2FnZTsgICAgICAgLyogaW4gc2Vjb25kcywgaG93IG9sZCBjYW4gYW4gYXN5bmMgY29tbWl0IGJlICovCisgIF9fdTMyIHNfam91cm5hbF9tYXhfdHJhbnNfYWdlOyAgICAgICAgLyogaW4gc2Vjb25kcywgaG93IG9sZCBjYW4gYSB0cmFuc2FjdGlvbiBiZSAqLworICBfX3UxNiBzX2Jsb2Nrc2l6ZTsgICAgICAgICAgICAgICAgICAgCS8qIGJsb2NrIHNpemUgICAgICAgICAgICovCisgIF9fdTE2IHNfb2lkX21heHNpemU7CQkJLyogbWF4IHNpemUgb2Ygb2JqZWN0IGlkIGFycmF5ICAqLworICBfX3UxNiBzX29pZF9jdXJzaXplOwkJCS8qIGN1cnJlbnQgc2l6ZSBvZiBvYmplY3QgaWQgYXJyYXkgKi8KKyAgX191MTYgc19zdGF0ZTsgICAgICAgICAgICAgICAgICAgICAgIAkvKiB2YWxpZCBvciBlcnJvciAgICAgICAqLworICBjaGFyIHNfbWFnaWNbMTZdOyAgICAgICAgICAgICAgICAgICAgIC8qIHJlaXNlcmZzIG1hZ2ljIHN0cmluZyBpbmRpY2F0ZXMgdGhhdCBmaWxlIHN5c3RlbSBpcyByZWlzZXJmcyAqLworICBfX3UxNiBzX3RyZWVfaGVpZ2h0OyAgICAgICAgICAgICAgICAgIC8qIGhlaWdodCBvZiBkaXNrIHRyZWUgKi8KKyAgX191MTYgc19ibWFwX25yOyAgICAgICAgICAgICAgICAgICAgICAvKiBhbW91bnQgb2YgYml0bWFwIGJsb2NrcyBuZWVkZWQgdG8gYWRkcmVzcyBlYWNoIGJsb2NrIG9mIGZpbGUgc3lzdGVtICovCisgIF9fdTE2IHNfdmVyc2lvbjsKKyAgY2hhciBzX3VudXNlZFsxMjhdOwkJCS8qIHplcm8gZmlsbGVkIGJ5IG1rcmVpc2VyZnMgKi8KK307CisKKyNkZWZpbmUgUkVJU0VSRlNfTUFYX1NVUFBPUlRFRF9WRVJTSU9OIDIKKyNkZWZpbmUgUkVJU0VSRlNfU1VQRVJfTUFHSUNfU1RSSU5HICJSZUlzRXJGcyIKKyNkZWZpbmUgUkVJU0VSMkZTX1NVUEVSX01BR0lDX1NUUklORyAiUmVJc0VyMkZzIgorI2RlZmluZSBSRUlTRVIzRlNfU1VQRVJfTUFHSUNfU1RSSU5HICJSZUlzRXIzRnMiCisKKyNkZWZpbmUgTUFYX0hFSUdIVCA3CisKKy8qIG11c3QgYmUgY29ycmVjdCB0byBrZWVwIHRoZSBkZXNjIGFuZCBjb21taXQgc3RydWN0cyBhdCA0ayAqLworI2RlZmluZSBKT1VSTkFMX1RSQU5TX0hBTEYgMTAxOAorCisvKiBmaXJzdCBibG9jayB3cml0dGVuIGluIGEgY29tbWl0LiAgKi8KK3N0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgeworICBfX3UzMiBqX3RyYW5zX2lkOwkJCS8qIGlkIG9mIGNvbW1pdCAqLworICBfX3UzMiBqX2xlbjsJCQkJLyogbGVuZ3RoIG9mIGNvbW1pdC4gbGVuICsxIGlzIHRoZSBjb21taXQgYmxvY2sgKi8KKyAgX191MzIgal9tb3VudF9pZDsJCQkvKiBtb3VudCBpZCBvZiB0aGlzIHRyYW5zKi8KKyAgX191MzIgal9yZWFsYmxvY2tbSk9VUk5BTF9UUkFOU19IQUxGXTsgLyogcmVhbCBsb2NhdGlvbnMgZm9yIHRoZSBmaXJzdCBibG9ja3MgKi8KKyAgY2hhciBqX21hZ2ljWzEyXTsKK307CisKKy8qIGxhc3QgYmxvY2sgd3JpdHRlbiBpbiBhIGNvbW1pdCAqLworc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY29tbWl0IHsKKyAgX191MzIgal90cmFuc19pZDsJCQkvKiBtdXN0IG1hdGNoIGpfdHJhbnNfaWQgZnJvbSB0aGUgZGVzYyBibG9jayAqLworICBfX3UzMiBqX2xlbjsJCQkvKiBkaXR0byAqLworICBfX3UzMiBqX3JlYWxibG9ja1tKT1VSTkFMX1RSQU5TX0hBTEZdOyAvKiByZWFsIGxvY2F0aW9ucyBmb3IgdGhlIGxhc3QgYmxvY2tzICovCisgIGNoYXIgal9kaWdlc3RbMTZdOwkJCS8qIG1kNSBzdW0gb2YgYWxsIHRoZSBibG9ja3MgaW52b2x2ZWQsIGluY2x1ZGluZyBkZXNjIGFuZCBjb21taXQuIG5vdCB1c2VkLCBraWxsIGl0ICovCit9OworCisvKiB0aGlzIGhlYWRlciBibG9jayBnZXRzIHdyaXR0ZW4gd2hlbmV2ZXIgYSB0cmFuc2FjdGlvbiBpcyBjb25zaWRlcmVkCisgICBmdWxseSBmbHVzaGVkLCBhbmQgaXMgbW9yZSByZWNlbnQgdGhhbiB0aGUgbGFzdCBmdWxseSBmbHVzaGVkCisgICB0cmFuc2FjdGlvbi4gIAorICAgZnVsbHkgZmx1c2hlZCBtZWFucyBhbGwgdGhlIGxvZyBibG9ja3MgYW5kIGFsbCB0aGUgcmVhbCBibG9ja3MgYXJlCisgICBvbiBkaXNrLCBhbmQgdGhpcyB0cmFuc2FjdGlvbiBkb2VzIG5vdCBuZWVkIHRvIGJlIHJlcGxheWVkLiAgCisqLworc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyIHsKKyAgLyogaWQgb2YgbGFzdCBmdWxseSBmbHVzaGVkIHRyYW5zYWN0aW9uICovCisgIF9fdTMyIGpfbGFzdF9mbHVzaF90cmFuc19pZDsKKyAgLyogb2Zmc2V0IGluIHRoZSBsb2cgb2Ygd2hlcmUgdG8gc3RhcnQgcmVwbGF5IGFmdGVyIGEgY3Jhc2ggKi8KKyAgX191MzIgal9maXJzdF91bmZsdXNoZWRfb2Zmc2V0OworICAvKiBtb3VudCBpZCB0byBkZXRlY3QgdmVyeSBvbGQgdHJhbnNhY3Rpb25zICovCisgIF9fdTMyIGpfbW91bnRfaWQ7Cit9OworCisvKiBtYWdpYyBzdHJpbmcgdG8gZmluZCBkZXNjIGJsb2NrcyBpbiB0aGUgam91cm5hbCAqLworI2RlZmluZSBKT1VSTkFMX0RFU0NfTUFHSUMgIlJlSXNFckxCIiAKKworCisvKgorICogZGlyZWN0b3JpZXMgdXNlIHRoaXMga2V5IGFzIHdlbGwgYXMgb2xkIGZpbGVzCisgKi8KK3N0cnVjdCBvZmZzZXRfdjEKK3sKKyAgLyoKKyAgICogZm9yIHJlZ3VsYXIgZmlsZXMgdGhpcyBpcyB0aGUgb2Zmc2V0IHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZQorICAgKiBib2R5LCBjb250YWluZWQgaW4gdGhlIG9iamVjdC1pdGVtLCBhcyBtZWFzdXJlZCBmcm9tIHRoZSBzdGFydCBvZgorICAgKiB0aGUgZW50aXJlIGJvZHkgb2YgdGhlIG9iamVjdC4KKyAgICoKKyAgICogZm9yIGRpcmVjdG9yeSBlbnRyaWVzLCBrX29mZnNldCBjb25zaXN0cyBvZiBoYXNoIGRlcml2ZWQgZnJvbQorICAgKiBoYXNoaW5nIHRoZSBuYW1lIGFuZCB1c2luZyBmZXcgYml0cyAoMjMgb3IgbW9yZSkgb2YgdGhlIHJlc3VsdGluZworICAgKiBoYXNoLCBhbmQgZ2VuZXJhdGlvbiBudW1iZXIgdGhhdCBhbGxvd3MgZGlzdGluZ3Vpc2hpbmcgbmFtZXMgd2l0aAorICAgKiBoYXNoIGNvbGxpc2lvbnMuIElmIG51bWJlciBvZiBjb2xsaXNpb25zIG92ZXJmbG93cyBnZW5lcmF0aW9uCisgICAqIG51bWJlciwgd2UgcmV0dXJuIEVFWElTVC4gIEhpZ2ggb3JkZXIgYml0IGlzIDAgYWx3YXlzIAorICAgKi8KKyAgX191MzIga19vZmZzZXQ7CisgIF9fdTMyIGtfdW5pcXVlbmVzczsKK307CisKK3N0cnVjdCBvZmZzZXRfdjIKK3sKKyAgLyoKKyAgICogZm9yIHJlZ3VsYXIgZmlsZXMgdGhpcyBpcyB0aGUgb2Zmc2V0IHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZQorICAgKiBib2R5LCBjb250YWluZWQgaW4gdGhlIG9iamVjdC1pdGVtLCBhcyBtZWFzdXJlZCBmcm9tIHRoZSBzdGFydCBvZgorICAgKiB0aGUgZW50aXJlIGJvZHkgb2YgdGhlIG9iamVjdC4KKyAgICoKKyAgICogZm9yIGRpcmVjdG9yeSBlbnRyaWVzLCBrX29mZnNldCBjb25zaXN0cyBvZiBoYXNoIGRlcml2ZWQgZnJvbQorICAgKiBoYXNoaW5nIHRoZSBuYW1lIGFuZCB1c2luZyBmZXcgYml0cyAoMjMgb3IgbW9yZSkgb2YgdGhlIHJlc3VsdGluZworICAgKiBoYXNoLCBhbmQgZ2VuZXJhdGlvbiBudW1iZXIgdGhhdCBhbGxvd3MgZGlzdGluZ3Vpc2hpbmcgbmFtZXMgd2l0aAorICAgKiBoYXNoIGNvbGxpc2lvbnMuIElmIG51bWJlciBvZiBjb2xsaXNpb25zIG92ZXJmbG93cyBnZW5lcmF0aW9uCisgICAqIG51bWJlciwgd2UgcmV0dXJuIEVFWElTVC4gIEhpZ2ggb3JkZXIgYml0IGlzIDAgYWx3YXlzIAorICAgKi8KKyAgX191NjQga19vZmZzZXQ6NjA7CisgIF9fdTY0IGtfdHlwZTogNDsKK307CisKKworc3RydWN0IGtleQoreworICAvKiBwYWNraW5nIGxvY2FsaXR5OiBieSBkZWZhdWx0IHBhcmVudCBkaXJlY3Rvcnkgb2JqZWN0IGlkICovCisgIF9fdTMyIGtfZGlyX2lkOworICAvKiBvYmplY3QgaWRlbnRpZmllciAqLworICBfX3UzMiBrX29iamVjdGlkOworICAvKiB0aGUgb2Zmc2V0IGFuZCBub2RlIHR5cGUgKG9sZCBhbmQgbmV3IGZvcm0pICovCisgIHVuaW9uCisgIHsKKyAgICBzdHJ1Y3Qgb2Zmc2V0X3YxIHYxOworICAgIHN0cnVjdCBvZmZzZXRfdjIgdjI7CisgIH0KKyAgdTsKK307CisKKyNkZWZpbmUgS0VZX1NJWkUgKHNpemVvZiAoc3RydWN0IGtleSkpCisKKy8qIEhlYWRlciBvZiBhIGRpc2sgYmxvY2suICBNb3JlIHByZWNpc2VseSwgaGVhZGVyIG9mIGEgZm9ybWF0dGVkIGxlYWYKKyAgIG9yIGludGVybmFsIG5vZGUsIGFuZCBub3QgdGhlIGhlYWRlciBvZiBhbiB1bmZvcm1hdHRlZCBub2RlLiAqLworc3RydWN0IGJsb2NrX2hlYWQKK3sgICAgICAgCisgIF9fdTE2IGJsa19sZXZlbDsgICAgICAgIC8qIExldmVsIG9mIGEgYmxvY2sgaW4gdGhlIHRyZWUuICovCisgIF9fdTE2IGJsa19ucl9pdGVtOyAgICAgIC8qIE51bWJlciBvZiBrZXlzL2l0ZW1zIGluIGEgYmxvY2suICovCisgIF9fdTE2IGJsa19mcmVlX3NwYWNlOyAgIC8qIEJsb2NrIGZyZWUgc3BhY2UgaW4gYnl0ZXMuICovCisgIHN0cnVjdCBrZXkgIGJsa19yaWdodF9kZWxpbV9rZXk7IC8qIFJpZ2h0IGRlbGltaXRpbmcga2V5IGZvciB0aGlzIGJsb2NrIChzdXBwb3J0ZWQgZm9yIGxlYWYgbGV2ZWwgbm9kZXMKKwkJCQkgICAgICBvbmx5KSAqLworfTsKKyNkZWZpbmUgQkxLSF9TSVpFIChzaXplb2YgKHN0cnVjdCBibG9ja19oZWFkKSkKKyNkZWZpbmUgRElTS19MRUFGX05PREVfTEVWRUwgIDEgLyogTGVhZiBub2RlIGxldmVsLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RydWN0IGl0ZW1faGVhZAoreworICBzdHJ1Y3Qga2V5IGloX2tleTsgCS8qIEV2ZXJ5dGhpbmcgaW4gdGhlIHRyZWUgaXMgZm91bmQgYnkgc2VhcmNoaW5nIGZvciBpdCBiYXNlZCBvbiBpdHMga2V5LiovCisgIAorICB1bmlvbgorICB7CisgICAgX191MTYgaWhfZnJlZV9zcGFjZTsgLyogVGhlIGZyZWUgc3BhY2UgaW4gdGhlIGxhc3QgdW5mb3JtYXR0ZWQgbm9kZSBvZiBhbiBpbmRpcmVjdCBpdGVtIGlmIHRoaXMKKwkJCSAgICBpcyBhbiBpbmRpcmVjdCBpdGVtLiAgVGhpcyBlcXVhbHMgMHhGRkZGIGlmZiB0aGlzIGlzIGEgZGlyZWN0IGl0ZW0gb3IKKwkJCSAgICBzdGF0IGRhdGEgaXRlbS4gTm90ZSB0aGF0IHRoZSBrZXksIG5vdCB0aGlzIGZpZWxkLCBpcyB1c2VkIHRvIGRldGVybWluZQorCQkJICAgIHRoZSBpdGVtIHR5cGUsIGFuZCB0aHVzIHdoaWNoIGZpZWxkIHRoaXMgdW5pb24gY29udGFpbnMuICovCisgICAgX191MTYgaWhfZW50cnlfY291bnQ7IC8qIElmZiB0aGlzIGlzIGEgZGlyZWN0b3J5IGl0ZW0sIHRoaXMgZmllbGQgZXF1YWxzIHRoZSBudW1iZXIgb2YgZGlyZWN0b3J5CisJCQkgICAgIGVudHJpZXMgaW4gdGhlIGRpcmVjdG9yeSBpdGVtLiAqLworICB9CisgIHU7CisgIF9fdTE2IGloX2l0ZW1fbGVuOyAgICAgICAgICAgLyogdG90YWwgc2l6ZSBvZiB0aGUgaXRlbSBib2R5ICAgICAgICAgICAgICAgICAgKi8KKyAgX191MTYgaWhfaXRlbV9sb2NhdGlvbjsgICAgICAvKiBhbiBvZmZzZXQgdG8gdGhlIGl0ZW0gYm9keSB3aXRoaW4gdGhlIGJsb2NrICAqLworICBfX3UxNiBpaF92ZXJzaW9uOwkgICAgICAgLyogSVRFTV9WRVJTSU9OXzEgZm9yIGFsbCBvbGQgaXRlbXMsIAorCQkJCSAgSVRFTV9WRVJTSU9OXzIgZm9yIG5ldyBvbmVzLiAKKwkJCQkgIEhpZ2hlc3QgYml0IGlzIHNldCBieSBmc2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYXJ5LCBjbGVhbmVkIGFmdGVyIGFsbCBkb25lICovCit9OworLyogc2l6ZSBvZiBpdGVtIGhlYWRlciAgICAgKi8KKyNkZWZpbmUgSUhfU0laRSAoc2l6ZW9mIChzdHJ1Y3QgaXRlbV9oZWFkKSkKKworI2RlZmluZSBJVEVNX1ZFUlNJT05fMSAwCisjZGVmaW5lIElURU1fVkVSU0lPTl8yIDEKKyNkZWZpbmUgSUhfS0VZX09GRlNFVChpaCkgKChpaCktPmloX3ZlcnNpb24gPT0gSVRFTV9WRVJTSU9OXzEgXAorCQkJICAgPyAoaWgpLT5paF9rZXkudS52MS5rX29mZnNldCBcCisJCQkgICA6IChpaCktPmloX2tleS51LnYyLmtfb2Zmc2V0KQorCisjZGVmaW5lIElIX0tFWV9JU1RZUEUoaWgsIHR5cGUpICgoaWgpLT5paF92ZXJzaW9uID09IElURU1fVkVSU0lPTl8xIFwKKwkJCQkgPyAoaWgpLT5paF9rZXkudS52MS5rX3VuaXF1ZW5lc3MgPT0gVjFfIyN0eXBlIFwKKwkJCQkgOiAoaWgpLT5paF9rZXkudS52Mi5rX3R5cGUgPT0gVjJfIyN0eXBlKQorCitzdHJ1Y3QgZGlza19jaGlsZAoreworICB1bnNpZ25lZCBsb25nICAgICAgIGRjX2Jsb2NrX251bWJlcjsgICAgICAgICAgICAgIC8qIERpc2sgY2hpbGQncyBibG9jayBudW1iZXIuICovCisgIHVuc2lnbmVkIHNob3J0ICAgICAgZGNfc2l6ZTsJCSAgICAgICAgICAgIC8qIERpc2sgY2hpbGQncyB1c2VkIHNwYWNlLiAgICovCit9OworCisjZGVmaW5lIERDX1NJWkUgKHNpemVvZiAoc3RydWN0IGRpc2tfY2hpbGQpKQorCisvKiBTdGF0IERhdGEgb24gZGlzay4KKyAqCisgKiBOb3RlIHRoYXQgcmVpc2VyZnMgaGFzIHR3byBkaWZmZXJlbnQgZm9ybXMgb2Ygc3RhdCBkYXRhLiAgTHVja2lseQorICogdGhlIGZpZWxkcyBuZWVkZWQgYnkgZ3J1YiBhcmUgYXQgdGhlIHNhbWUgcG9zaXRpb24uCisgKi8KK3N0cnVjdCBzdGF0X2RhdGEKK3sKKyAgX191MTYgc2RfbW9kZTsJLyogZmlsZSB0eXBlLCBwZXJtaXNzaW9ucyAqLworICBfX3UxNiBzZF9ub3R1c2VkMVszXTsgLyogZmllbGRzIG5vdCBuZWVkZWQgYnkgcmVpc2VyZnMgKi8KKyAgX191MzIgc2Rfc2l6ZTsJLyogZmlsZSBzaXplICovCisgIF9fdTMyIHNkX3NpemVfaGk7CS8qIGZpbGUgc2l6ZSBoaWdoIDMyIGJpdHMgKHNpbmNlIHZlcnNpb24gMikgKi8KK307CisKK3N0cnVjdCByZWlzZXJmc19kZV9oZWFkCit7CisgIF9fdTMyIGRlaF9vZmZzZXQ7ICAvKiB0aGlyZCBjb21wb25lbnQgb2YgdGhlIGRpcmVjdG9yeSBlbnRyeSBrZXkgKi8KKyAgX191MzIgZGVoX2Rpcl9pZDsgIC8qIG9iamVjdGlkIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZQorCQkJb2JqZWN0LCB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgZGlyZWN0b3J5IGVudHJ5ICovCisgIF9fdTMyIGRlaF9vYmplY3RpZDsvKiBvYmplY3RpZCBvZiB0aGUgb2JqZWN0LCB0aGF0IGlzIHJlZmVyZW5jZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSBlbnRyeSAqLworICBfX3UxNiBkZWhfbG9jYXRpb247Lyogb2Zmc2V0IG9mIG5hbWUgaW4gdGhlIHdob2xlIGl0ZW0gKi8KKyAgX191MTYgZGVoX3N0YXRlOyAgIC8qIHdoZXRoZXIgMSkgZW50cnkgY29udGFpbnMgc3RhdCBkYXRhIChmb3IKKwkJCWZ1dHVyZSksIGFuZCAyKSB3aGV0aGVyIGVudHJ5IGlzIGhpZGRlbgorCQkJKHVubGlua2VkKSAqLworfTsKKworI2RlZmluZSBERUhfU0laRSAoc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCkpCisKKyNkZWZpbmUgREVIX1N0YXRkYXRhICgxIDw8IDApCQkJLyogbm90IHVzZWQgbm93ICovCisjZGVmaW5lIERFSF9WaXNpYmxlICAoMSA8PCAyKQorCisjZGVmaW5lIFNEX09GRlNFVCAgMAorI2RlZmluZSBTRF9VTklRVUVORVNTIDAKKyNkZWZpbmUgRE9UX09GRlNFVCAxCisjZGVmaW5lIERPVF9ET1RfT0ZGU0VUIDIKKyNkZWZpbmUgRElSRU5UUllfVU5JUVVFTkVTUyA1MDAKKworI2RlZmluZSBWMV9UWVBFX1NUQVRfREFUQSAweDAKKyNkZWZpbmUgVjFfVFlQRV9ESVJFQ1QgMHhmZmZmZmZmZgorI2RlZmluZSBWMV9UWVBFX0lORElSRUNUIDB4ZmZmZmZmZmUKKyNkZWZpbmUgVjFfVFlQRV9ESVJFQ1RPUllfTUFYIDB4ZmZmZmZmZmQKKyNkZWZpbmUgVjJfVFlQRV9TVEFUX0RBVEEgMAorI2RlZmluZSBWMl9UWVBFX0lORElSRUNUIDEKKyNkZWZpbmUgVjJfVFlQRV9ESVJFQ1QgMgorI2RlZmluZSBWMl9UWVBFX0RJUkVOVFJZIDMgCisKKyNkZWZpbmUgUkVJU0VSRlNfUk9PVF9PQkpFQ1RJRCAyCisjZGVmaW5lIFJFSVNFUkZTX1JPT1RfUEFSRU5UX09CSkVDVElEIDEKKyNkZWZpbmUgUkVJU0VSRlNfRElTS19PRkZTRVRfSU5fQllURVMgKDY0ICogMTAyNCkKKy8qIHRoZSBzcG90IGZvciB0aGUgc3VwZXIgaW4gdmVyc2lvbnMgMy41IC0gMy41LjExIChpbmNsdXNpdmUpICovCisjZGVmaW5lIFJFSVNFUkZTX09MRF9ESVNLX09GRlNFVF9JTl9CWVRFUyAoOCAqIDEwMjQpCisjZGVmaW5lIFJFSVNFUkZTX09MRF9CTE9DS1NJWkUgNDA5NgorCisjZGVmaW5lIFNfSVNSRUcobW9kZSkgKCgobW9kZSkgJiAwMTcwMDAwKSA9PSAwMTAwMDAwKQorI2RlZmluZSBTX0lTRElSKG1vZGUpICgoKG1vZGUpICYgMDE3MDAwMCkgPT0gMDA0MDAwMCkKKyNkZWZpbmUgU19JU0xOSyhtb2RlKSAoKChtb2RlKSAmIDAxNzAwMDApID09IDAxMjAwMDApCisKKyNkZWZpbmUgUEFUSF9NQVggICAgICAgMTAyNAkvKiBpbmNsdWRlL2xpbnV4L2xpbWl0cy5oICovCisjZGVmaW5lIE1BWF9MSU5LX0NPVU5UICAgIDUJLyogbnVtYmVyIG9mIHN5bWJvbGljIGxpbmtzIHRvIGZvbGxvdyAqLworCisvKiBUaGUgc2l6ZSBvZiB0aGUgbm9kZSBjYWNoZSAqLworI2RlZmluZSBGU1lTUkVJU0VSX0NBQ0hFX1NJWkUgMjQqMTAyNAorI2RlZmluZSBGU1lTUkVJU0VSX01JTl9CTE9DS1NJWkUgU0VDVE9SX1NJWkUKKyNkZWZpbmUgRlNZU1JFSVNFUl9NQVhfQkxPQ0tTSVpFIEZTWVNSRUlTRVJfQ0FDSEVfU0laRSAvIDMKKworLyogSW5mbyBhYm91dCBjdXJyZW50bHkgb3BlbmVkIGZpbGUgKi8KK3N0cnVjdCBmc3lzX3JlaXNlcl9maWxlaW5mbworeworICBfX3UzMiBrX2Rpcl9pZDsKKyAgX191MzIga19vYmplY3RpZDsKK307CisKKy8qIEluIG1lbW9yeSBpbmZvIGFib3V0IHRoZSBjdXJyZW50bHkgbW91bnRlZCBmaWxlc3lzdGVtICovCitzdHJ1Y3QgZnN5c19yZWlzZXJfaW5mbworeworICAvKiBUaGUgbGFzdCByZWFkIGl0ZW0gaGVhZCAqLworICBzdHJ1Y3QgaXRlbV9oZWFkICpjdXJyZW50X2loOworICAvKiBUaGUgbGFzdCByZWFkIGl0ZW0gKi8KKyAgY2hhciAqY3VycmVudF9pdGVtOworICAvKiBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50bHkgb3BlbmVkIGZpbGUgKi8KKyAgc3RydWN0IGZzeXNfcmVpc2VyX2ZpbGVpbmZvIGZpbGVpbmZvOworICAvKiBUaGUgc3RhcnQgb2YgdGhlIGpvdXJuYWwgKi8KKyAgX191MzIgam91cm5hbF9ibG9jazsKKyAgLyogVGhlIHNpemUgb2YgdGhlIGpvdXJuYWwgKi8KKyAgX191MzIgam91cm5hbF9ibG9ja19jb3VudDsKKyAgLyogVGhlIGZpcnN0IHZhbGlkIGRlc2NyaXB0b3IgYmxvY2sgaW4gam91cm5hbAorICAgICAocmVsYXRpdmUgdG8gam91cm5hbF9ibG9jaykgKi8KKyAgX191MzIgam91cm5hbF9maXJzdF9kZXNjOworCisgIC8qIFRoZSBSZWlzZXJGUyB2ZXJzaW9uLiAqLworICBfX3UxNiB2ZXJzaW9uOworICAvKiBUaGUgY3VycmVudCBkZXB0aCBvZiB0aGUgcmVpc2VyIHRyZWUuICovCisgIF9fdTE2IHRyZWVfZGVwdGg7CisgIC8qIFNFQ1RPUl9TSVpFIDw8IGJsb2Nrc2l6ZV9zaGlmdCA9PSBibG9ja3NpemUuICovCisgIF9fdTggIGJsb2Nrc2l6ZV9zaGlmdDsKKyAgLyogMSA8PCBmdWxsX2Jsb2Nrc2l6ZV9zaGlmdCA9PSBibG9ja3NpemUuICovCisgIF9fdTggIGZ1bGxibG9ja3NpemVfc2hpZnQ7CisgIC8qIFRoZSByZWlzZXJmcyBibG9jayBzaXplICAobXVzdCBiZSBhIHBvd2VyIG9mIDIpICovCisgIF9fdTE2IGJsb2Nrc2l6ZTsKKyAgLyogVGhlIG51bWJlciBvZiBjYWNoZWQgdHJlZSBub2RlcyAqLworICBfX3UxNiBjYWNoZWRfc2xvdHM7CisgIC8qIFRoZSBudW1iZXIgb2YgdmFsaWQgdHJhbnNhY3Rpb25zIGluIGpvdXJuYWwgKi8KKyAgX191MTYgam91cm5hbF90cmFuc2FjdGlvbnM7CisgIAorICB1bnNpZ25lZCBpbnQgYmxvY2tzW01BWF9IRUlHSFRdOworICB1bnNpZ25lZCBpbnQgbmV4dF9rZXlfbnJbTUFYX0hFSUdIVF07Cit9OworCisvKiBUaGUgY2FjaGVkIHMrdHJlZSBibG9ja3MgaW4gRlNZU19CVUYsICBzZWUgYmVsb3cKKyAqIGZvciBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24uCisgKi8KKyNkZWZpbmUgUk9PVCAgICAgKChjaGFyICopICgoaW50KSBGU1lTX0JVRikpCisjZGVmaW5lIENBQ0hFKGkpIChST09UICsgKChpKSA8PCBJTkZPLT5mdWxsYmxvY2tzaXplX3NoaWZ0KSkKKyNkZWZpbmUgTEVBRiAgICAgQ0FDSEUgKERJU0tfTEVBRl9OT0RFX0xFVkVMKQorCisjZGVmaW5lIEJMT0NLSEVBRChjYWNoZSkgKChzdHJ1Y3QgYmxvY2tfaGVhZCAqKSBjYWNoZSkKKyNkZWZpbmUgSVRFTUhFQUQgICAgICAgICAoKHN0cnVjdCBpdGVtX2hlYWQgICopICgoaW50KSBMRUFGICsgQkxLSF9TSVpFKSkKKyNkZWZpbmUgS0VZKGNhY2hlKSAgICAgICAoKHN0cnVjdCBrZXkgICAgICAgICopICgoaW50KSBjYWNoZSArIEJMS0hfU0laRSkpCisjZGVmaW5lIERDKGNhY2hlKSAgICAgICAgKChzdHJ1Y3QgZGlza19jaGlsZCAqKSBcCisJCQkgICgoaW50KSBjYWNoZSArIEJMS0hfU0laRSArIEtFWV9TSVpFICogbnJfaXRlbSkpCisvKiBUaGUgZnN5c19yZWlzZXJfaW5mbyBibG9jay4KKyAqLworI2RlZmluZSBJTkZPIFwKKyAgICAoKHN0cnVjdCBmc3lzX3JlaXNlcl9pbmZvICopICgoaW50KSBGU1lTX0JVRiArIEZTWVNSRUlTRVJfQ0FDSEVfU0laRSkpCisvKiAKKyAqIFRoZSBqb3VybmFsIGNhY2hlLiAgRm9yIGVhY2ggdHJhbnNhY3Rpb24gaXQgY29udGFpbnMgdGhlIG51bWJlciBvZgorICogYmxvY2tzIGZvbGxvd2VkIGJ5IHRoZSByZWFsIGJsb2NrIG51bWJlcnMgb2YgdGhpcyB0cmFuc2FjdGlvbi4gIAorICoKKyAqIElmIHRoZSBibG9jayBudW1iZXJzIG9mIHNvbWUgdHJhbnNhY3Rpb24gd29uJ3QgZml0IGluIHRoaXMgc3BhY2UsCisgKiB0aGlzIGxpc3QgaXMgc3RvcHBlZCB3aXRoIGEgMHhmZmZmZmZmZiBtYXJrZXIgYW5kIHRoZSByZW1haW5pbmcKKyAqIHVuY29tbWl0dGVkIHRyYW5zYWN0aW9ucyBhcmVuJ3QgY2FjaGVkLiAgCisgKi8KKyNkZWZpbmUgSk9VUk5BTF9TVEFSVCAgICAoKF9fdTMyICopIChJTkZPICsgMSkpCisjZGVmaW5lIEpPVVJOQUxfRU5EICAgICAgKChfX3UzMiAqKSAoRlNZU19CVUYgKyBGU1lTX0JVRkxFTikpCisKKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZworbG9nMiAodW5zaWduZWQgbG9uZyB3b3JkKQoreworICBfX2FzbV9fICgiYnNmbCAlMSwlMCIKKwkgICA6ICI9ciIgKHdvcmQpCisJICAgOiAiciIgKHdvcmQpKTsKKyAgcmV0dXJuIHdvcmQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludAoraXNfcG93ZXJfb2ZfdHdvICh1bnNpZ25lZCBsb25nIHdvcmQpCit7CisgIHJldHVybiAod29yZCAmIC13b3JkKSA9PSB3b3JkOworfQorCitzdGF0aWMgaW50IAoram91cm5hbF9yZWFkIChpbnQgYmxvY2ssIGludCBsZW4sIGNoYXIgKmJ1ZmZlcikgCit7CisgIHJldHVybiBkZXZyZWFkICgoSU5GTy0+am91cm5hbF9ibG9jayArIGJsb2NrKSA8PCBJTkZPLT5ibG9ja3NpemVfc2hpZnQsIAorCQkgIDAsIGxlbiwgYnVmZmVyKTsKK30KKworLyogUmVhZCBhIGJsb2NrIGZyb20gUmVpc2VyRlMgZmlsZSBzeXN0ZW0sIHRha2luZyB0aGUgam91cm5hbCBpbnRvCisgKiBhY2NvdW50LiAgSWYgdGhlIGJsb2NrIG5yIGlzIGluIHRoZSBqb3VybmFsLCB0aGUgYmxvY2sgZnJvbSB0aGUKKyAqIGpvdXJuYWwgdGFrZW4uICAKKyAqLworc3RhdGljIGludAorYmxvY2tfcmVhZCAoaW50IGJsb2NrTnIsIGludCBzdGFydCwgaW50IGxlbiwgY2hhciAqYnVmZmVyKQoreworICBpbnQgdHJhbnNhY3Rpb25zID0gSU5GTy0+am91cm5hbF90cmFuc2FjdGlvbnM7CisgIGludCBkZXNjX2Jsb2NrID0gSU5GTy0+am91cm5hbF9maXJzdF9kZXNjOworICBpbnQgam91cm5hbF9tYXNrID0gSU5GTy0+am91cm5hbF9ibG9ja19jb3VudCAtIDE7CisgIGludCB0cmFuc2xhdGVkTnIgPSBibG9ja05yOworICBfX3UzMiAqam91cm5hbF90YWJsZSA9IEpPVVJOQUxfU1RBUlQ7CisgIHdoaWxlICh0cmFuc2FjdGlvbnMtLSA+IDApIAorICAgIHsKKyAgICAgIGludCBpID0gMDsKKyAgICAgIGludCBqX2xlbjsKKyAgICAgIGlmICgqam91cm5hbF90YWJsZSAhPSAweGZmZmZmZmZmKQorCXsKKwkgIC8qIFNlYXJjaCBmb3IgdGhlIGJsb2NrTnIgaW4gY2FjaGVkIGpvdXJuYWwgKi8KKwkgIGpfbGVuID0gKmpvdXJuYWxfdGFibGUrKzsKKwkgIHdoaWxlIChpKysgPCBqX2xlbikKKwkgICAgeworCSAgICAgIGlmICgqam91cm5hbF90YWJsZSsrID09IGJsb2NrTnIpCisJCXsKKwkJICBqb3VybmFsX3RhYmxlICs9IGpfbGVuIC0gaTsKKwkJICBnb3RvIGZvdW5kOworCQl9CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgLyogVGhpcyBpcyB0aGUgZW5kIG9mIGNhY2hlZCBqb3VybmFsIG1hcmtlci4gIFRoZSByZW1haW5pbmcKKwkgICAqIHRyYW5zYWN0aW9ucyBhcmUgc3RpbGwgb24gZGlzay4KKwkgICAqLworCSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAgIGRlc2M7CisJICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgY29tbWl0OworCisJICBpZiAoISBqb3VybmFsX3JlYWQgKGRlc2NfYmxvY2ssIHNpemVvZiAoZGVzYyksIChjaGFyICopICZkZXNjKSkKKwkgICAgcmV0dXJuIDA7CisKKwkgIGpfbGVuID0gZGVzYy5qX2xlbjsKKwkgIHdoaWxlIChpIDwgal9sZW4gJiYgaSA8IEpPVVJOQUxfVFJBTlNfSEFMRikKKwkgICAgaWYgKGRlc2Mual9yZWFsYmxvY2tbaSsrXSA9PSBibG9ja05yKQorCSAgICAgIGdvdG8gZm91bmQ7CisJICAKKwkgIGlmIChqX2xlbiA+PSBKT1VSTkFMX1RSQU5TX0hBTEYpCisJICAgIHsKKwkgICAgICBpbnQgY29tbWl0X2Jsb2NrID0gKGRlc2NfYmxvY2sgKyAxICsgal9sZW4pICYgam91cm5hbF9tYXNrOworCSAgICAgIGlmICghIGpvdXJuYWxfcmVhZCAoY29tbWl0X2Jsb2NrLCAKKwkJCQkgIHNpemVvZiAoY29tbWl0KSwgKGNoYXIgKikgJmNvbW1pdCkpCisJCXJldHVybiAwOworCSAgICAgIHdoaWxlIChpIDwgal9sZW4pCisJCWlmIChjb21taXQual9yZWFsYmxvY2tbaSsrIC0gSk9VUk5BTF9UUkFOU19IQUxGXSA9PSBibG9ja05yKQorCQkgIGdvdG8gZm91bmQ7CisJICAgIH0KKwl9CisgICAgICBnb3RvIG5vdF9mb3VuZDsKKyAgICAgIAorICAgIGZvdW5kOgorICAgICAgdHJhbnNsYXRlZE5yID0gSU5GTy0+am91cm5hbF9ibG9jayArICgoZGVzY19ibG9jayArIGkpICYgam91cm5hbF9tYXNrKTsKKyNpZmRlZiBSRUlTRVJERUJVRworICAgICAgcHJpbnRmICgiYmxvY2tfcmVhZDogYmxvY2sgJWQgaXMgbWFwcGVkIHRvIGpvdXJuYWwgYmxvY2sgJWQuXG4iLCAKKwkgICAgICBibG9ja05yLCB0cmFuc2xhdGVkTnIgLSBJTkZPLT5qb3VybmFsX2Jsb2NrKTsKKyNlbmRpZgorICAgICAgLyogV2UgbXVzdCBjb250aW51ZSB0aGUgc2VhcmNoLCBhcyB0aGlzIGJsb2NrIG1heSBiZSBvdmVyd3JpdHRlbgorICAgICAgICogaW4gbGF0ZXIgdHJhbnNhY3Rpb25zLgorICAgICAgICovCisgICAgbm90X2ZvdW5kOgorICAgICAgZGVzY19ibG9jayA9IChkZXNjX2Jsb2NrICsgMiArIGpfbGVuKSAmIGpvdXJuYWxfbWFzazsKKyAgICB9CisgIHJldHVybiBkZXZyZWFkICh0cmFuc2xhdGVkTnIgPDwgSU5GTy0+YmxvY2tzaXplX3NoaWZ0LCBzdGFydCwgbGVuLCBidWZmZXIpOworfQorCisvKiBJbml0IHRoZSBqb3VybmFsIGRhdGEgc3RydWN0dXJlLiAgV2UgdHJ5IHRvIGNhY2hlIGFzIG11Y2ggYXMKKyAqIHBvc3NpYmxlIGluIHRoZSBKT1VSTkFMX1NUQVJULUpPVVJOQUxfRU5EIHNwYWNlLCBidXQgaWYgaXQgaXMgZnVsbAorICogd2UgY2FuIHN0aWxsIHJlYWQgdGhlIHJlc3QgZnJvbSB0aGUgZGlzayBvbiBkZW1hbmQuCisgKgorICogVGhlIGZpcnN0IG51bWJlciBvZiB2YWxpZCB0cmFuc2FjdGlvbnMgYW5kIHRoZSBkZXNjcmlwdG9yIGJsb2NrIG9mIHRoZQorICogZmlyc3QgdmFsaWQgdHJhbnNhY3Rpb24gYXJlIGhlbGQgaW4gSU5GTy4gIFRoZSB0cmFuc2FjdGlvbnMgYXJlIGFsbCAKKyAqIGFkamFjZW50LCBidXQgd2UgbXVzdCB0YWtlIGNhcmUgb2YgdGhlIGpvdXJuYWwgd3JhcCBhcm91bmQuIAorICovCitzdGF0aWMgaW50Citqb3VybmFsX2luaXQgKHZvaWQpCit7CisgIHVuc2lnbmVkIGludCBibG9ja19jb3VudCA9IElORk8tPmpvdXJuYWxfYmxvY2tfY291bnQ7CisgIHVuc2lnbmVkIGludCBkZXNjX2Jsb2NrOworICB1bnNpZ25lZCBpbnQgY29tbWl0X2Jsb2NrOworICB1bnNpZ25lZCBpbnQgbmV4dF90cmFuc19pZDsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyIGhlYWRlcjsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAgIGRlc2M7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2NvbW1pdCBjb21taXQ7CisgIF9fdTMyICpqb3VybmFsX3RhYmxlID0gSk9VUk5BTF9TVEFSVDsKKworICBqb3VybmFsX3JlYWQgKGJsb2NrX2NvdW50LCBzaXplb2YgKGhlYWRlciksIChjaGFyICopICZoZWFkZXIpOworICBkZXNjX2Jsb2NrID0gaGVhZGVyLmpfZmlyc3RfdW5mbHVzaGVkX29mZnNldDsKKyAgaWYgKGRlc2NfYmxvY2sgPj0gYmxvY2tfY291bnQpCisgICAgcmV0dXJuIDA7CisKKyAgSU5GTy0+am91cm5hbF9maXJzdF9kZXNjID0gZGVzY19ibG9jazsKKyAgbmV4dF90cmFuc19pZCA9IGhlYWRlci5qX2xhc3RfZmx1c2hfdHJhbnNfaWQgKyAxOworCisjaWZkZWYgUkVJU0VSREVCVUcKKyAgcHJpbnRmICgiam91cm5hbF9pbml0OiBsYXN0IGZsdXNoZWQgJWRcbiIsIAorCSAgaGVhZGVyLmpfbGFzdF9mbHVzaF90cmFuc19pZCk7CisjZW5kaWYKKworICB3aGlsZSAoMSkgCisgICAgeworICAgICAgam91cm5hbF9yZWFkIChkZXNjX2Jsb2NrLCBzaXplb2YgKGRlc2MpLCAoY2hhciAqKSAmZGVzYyk7CisgICAgICBpZiAoc3Vic3RyaW5nIChKT1VSTkFMX0RFU0NfTUFHSUMsIGRlc2Mual9tYWdpYykgPiAwCisJICB8fCBkZXNjLmpfdHJhbnNfaWQgIT0gbmV4dF90cmFuc19pZAorCSAgfHwgZGVzYy5qX21vdW50X2lkICE9IGhlYWRlci5qX21vdW50X2lkKQorCS8qIG5vIG1vcmUgdmFsaWQgdHJhbnNhY3Rpb25zICovCisJYnJlYWs7CisgICAgICAKKyAgICAgIGNvbW1pdF9ibG9jayA9IChkZXNjX2Jsb2NrICsgZGVzYy5qX2xlbiArIDEpICYgKGJsb2NrX2NvdW50IC0gMSk7CisgICAgICBqb3VybmFsX3JlYWQgKGNvbW1pdF9ibG9jaywgc2l6ZW9mIChjb21taXQpLCAoY2hhciAqKSAmY29tbWl0KTsKKyAgICAgIGlmIChkZXNjLmpfdHJhbnNfaWQgIT0gY29tbWl0LmpfdHJhbnNfaWQKKwkgIHx8IGRlc2Mual9sZW4gIT0gY29tbWl0LmpfbGVuKQorCS8qIG5vIG1vcmUgdmFsaWQgdHJhbnNhY3Rpb25zICovCisJYnJlYWs7CisgICAgICAKKyNpZmRlZiBSRUlTRVJERUJVRworICAgICAgcHJpbnRmICgiRm91bmQgdmFsaWQgdHJhbnNhY3Rpb24gJWQvJWQgYXQgJWQuXG4iLCAKKwkgICAgICBkZXNjLmpfdHJhbnNfaWQsIGRlc2Mual9tb3VudF9pZCwgZGVzY19ibG9jayk7CisjZW5kaWYKKworICAgICAgbmV4dF90cmFuc19pZCsrOworICAgICAgaWYgKGpvdXJuYWxfdGFibGUgPCBKT1VSTkFMX0VORCkKKwl7CisJICBpZiAoKGpvdXJuYWxfdGFibGUgKyAxICsgZGVzYy5qX2xlbikgPj0gSk9VUk5BTF9FTkQpCisJICAgIHsKKwkgICAgICAvKiBUaGUgdGFibGUgaXMgYWxtb3N0IGZ1bGw7IG1hcmsgdGhlIGVuZCBvZiB0aGUgY2FjaGVkCisJICAgICAgICogam91cm5hbC4qLworCSAgICAgICpqb3VybmFsX3RhYmxlID0gMHhmZmZmZmZmZjsKKwkgICAgICBqb3VybmFsX3RhYmxlID0gSk9VUk5BTF9FTkQ7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGludCBpOworCSAgICAgIC8qIENhY2hlIHRoZSBsZW5ndGggYW5kIHRoZSByZWFsYmxvY2sgbnVtYmVycyBpbiB0aGUgdGFibGUuCisJICAgICAgICogVGhlIGJsb2NrIG51bWJlciBvZiBkZXNjcmlwdG9yIGNhbiBlYXNpbHkgYmUgY29tcHV0ZWQuCisJICAgICAgICogYW5kIG5lZWQgbm90IHRvIGJlIHN0b3JlZCBoZXJlLgorCSAgICAgICAqLworCSAgICAgICpqb3VybmFsX3RhYmxlKysgPSBkZXNjLmpfbGVuOworCSAgICAgIGZvciAoaSA9IDA7IGkgPCBkZXNjLmpfbGVuICYmIGkgPCBKT1VSTkFMX1RSQU5TX0hBTEY7IGkrKykKKwkJeworCQkgICpqb3VybmFsX3RhYmxlKysgPSBkZXNjLmpfcmVhbGJsb2NrW2ldOworI2lmZGVmIFJFSVNFUkRFQlVHCisJCSAgcHJpbnRmICgiYmxvY2sgJWQgaXMgaW4gam91cm5hbCAlZC5cbiIsIAorCQkJICBkZXNjLmpfcmVhbGJsb2NrW2ldLCBkZXNjX2Jsb2NrKTsKKyNlbmRpZgorCQl9CisJICAgICAgZm9yICggICAgIDsgaSA8IGRlc2Mual9sZW47IGkrKykKKwkJeworCQkgICpqb3VybmFsX3RhYmxlKysgPSBjb21taXQual9yZWFsYmxvY2tbaS1KT1VSTkFMX1RSQU5TX0hBTEZdOworI2lmZGVmIFJFSVNFUkRFQlVHCisJCSAgcHJpbnRmICgiYmxvY2sgJWQgaXMgaW4gam91cm5hbCAlZC5cbiIsIAorCQkJICBjb21taXQual9yZWFsYmxvY2tbaS1KT1VSTkFMX1RSQU5TX0hBTEZdLCAKKwkJCSAgZGVzY19ibG9jayk7CisjZW5kaWYKKwkJfQorCSAgICB9CisJfQorICAgICAgZGVzY19ibG9jayA9IChjb21taXRfYmxvY2sgKyAxKSAmIChibG9ja19jb3VudCAtIDEpOworICAgIH0KKyNpZmRlZiBSRUlTRVJERUJVRworICBwcmludGYgKCJUcmFuc2FjdGlvbiAlZC8lZCBhdCAlZCBpc24ndCB2YWxpZC5cbiIsIAorCSAgZGVzYy5qX3RyYW5zX2lkLCBkZXNjLmpfbW91bnRfaWQsIGRlc2NfYmxvY2spOworI2VuZGlmCisKKyAgSU5GTy0+am91cm5hbF90cmFuc2FjdGlvbnMKKyAgICA9IG5leHRfdHJhbnNfaWQgLSBoZWFkZXIual9sYXN0X2ZsdXNoX3RyYW5zX2lkIC0gMTsKKyAgcmV0dXJuIGVycm51bSA9PSAwOworfQorCisvKiBjaGVjayBmaWxlc3lzdGVtIHR5cGVzIGFuZCByZWFkIHN1cGVyYmxvY2sgaW50byBtZW1vcnkgYnVmZmVyICovCitpbnQKK3JlaXNlcmZzX21vdW50ICh2b2lkKQoreworICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgc3VwZXI7CisgIGludCBzdXBlcmJsb2NrID0gUkVJU0VSRlNfRElTS19PRkZTRVRfSU5fQllURVMgPj4gU0VDVE9SX0JJVFM7CisKKyAgaWYgKHBhcnRfbGVuZ3RoIDwgc3VwZXJibG9jayArIChzaXplb2YgKHN1cGVyKSA+PiBTRUNUT1JfQklUUykKKyAgICAgIHx8ICEgZGV2cmVhZCAoc3VwZXJibG9jaywgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2spLCAKKwkJKGNoYXIgKikgJnN1cGVyKQorICAgICAgfHwgKHN1YnN0cmluZyAoUkVJU0VSM0ZTX1NVUEVSX01BR0lDX1NUUklORywgc3VwZXIuc19tYWdpYykgPiAwCisJICAmJiBzdWJzdHJpbmcgKFJFSVNFUjJGU19TVVBFUl9NQUdJQ19TVFJJTkcsIHN1cGVyLnNfbWFnaWMpID4gMAorCSAgJiYgc3Vic3RyaW5nIChSRUlTRVJGU19TVVBFUl9NQUdJQ19TVFJJTkcsIHN1cGVyLnNfbWFnaWMpID4gMCkKKyAgICAgIHx8ICgvKiBjaGVjayB0aGF0IHRoaXMgaXMgbm90IGEgY29weSBpbnNpZGUgdGhlIGpvdXJuYWwgbG9nICovCisJICBzdXBlci5zX2pvdXJuYWxfYmxvY2sgKiBzdXBlci5zX2Jsb2Nrc2l6ZQorCSAgPD0gUkVJU0VSRlNfRElTS19PRkZTRVRfSU5fQllURVMpKQorICAgIHsKKyAgICAgIC8qIFRyeSBvbGQgc3VwZXIgYmxvY2sgcG9zaXRpb24gKi8KKyAgICAgIHN1cGVyYmxvY2sgPSBSRUlTRVJGU19PTERfRElTS19PRkZTRVRfSU5fQllURVMgPj4gU0VDVE9SX0JJVFM7CisgICAgICBpZiAocGFydF9sZW5ndGggPCBzdXBlcmJsb2NrICsgKHNpemVvZiAoc3VwZXIpID4+IFNFQ1RPUl9CSVRTKQorCSAgfHwgISBkZXZyZWFkIChzdXBlcmJsb2NrLCAwLCBzaXplb2YgKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayksIAorCQkJKGNoYXIgKikgJnN1cGVyKSkKKwlyZXR1cm4gMDsKKworICAgICAgaWYgKHN1YnN0cmluZyAoUkVJU0VSM0ZTX1NVUEVSX01BR0lDX1NUUklORywgc3VwZXIuc19tYWdpYykgPiAwCisJICAmJiBzdWJzdHJpbmcgKFJFSVNFUjJGU19TVVBFUl9NQUdJQ19TVFJJTkcsIHN1cGVyLnNfbWFnaWMpID4gMAorCSAgJiYgc3Vic3RyaW5nIChSRUlTRVJGU19TVVBFUl9NQUdJQ19TVFJJTkcsIHN1cGVyLnNfbWFnaWMpID4gMCkKKwl7CisJICAvKiBwcmUgam91cm5hbGluZyBzdXBlciBibG9jayA/ICovCisJICBpZiAoc3Vic3RyaW5nIChSRUlTRVJGU19TVVBFUl9NQUdJQ19TVFJJTkcsIAorCQkJIChjaGFyKikgKChpbnQpICZzdXBlciArIDIwKSkgPiAwKQorCSAgICByZXR1cm4gMDsKKwkgIAorCSAgc3VwZXIuc19ibG9ja3NpemUgPSBSRUlTRVJGU19PTERfQkxPQ0tTSVpFOworCSAgc3VwZXIuc19qb3VybmFsX2Jsb2NrID0gMDsKKwkgIHN1cGVyLnNfdmVyc2lvbiA9IDA7CisJfQorICAgIH0KKworICAvKiBjaGVjayB0aGUgdmVyc2lvbiBudW1iZXIuICAqLworICBpZiAoc3VwZXIuc192ZXJzaW9uID4gUkVJU0VSRlNfTUFYX1NVUFBPUlRFRF9WRVJTSU9OKQorICAgIHJldHVybiAwOworICAKKyAgSU5GTy0+dmVyc2lvbiA9IHN1cGVyLnNfdmVyc2lvbjsKKyAgSU5GTy0+YmxvY2tzaXplID0gc3VwZXIuc19ibG9ja3NpemU7CisgIElORk8tPmZ1bGxibG9ja3NpemVfc2hpZnQgPSBsb2cyIChzdXBlci5zX2Jsb2Nrc2l6ZSk7CisgIElORk8tPmJsb2Nrc2l6ZV9zaGlmdCA9IElORk8tPmZ1bGxibG9ja3NpemVfc2hpZnQgLSBTRUNUT1JfQklUUzsKKyAgSU5GTy0+Y2FjaGVkX3Nsb3RzID0gCisgICAgKEZTWVNSRUlTRVJfQ0FDSEVfU0laRSA+PiBJTkZPLT5mdWxsYmxvY2tzaXplX3NoaWZ0KSAtIDE7CisKKyNpZmRlZiBSRUlTRVJERUJVRworICBwcmludGYgKCJyZWlzZXJmc19tb3VudDogdmVyc2lvbj0lZCwgYmxvY2tzaXplPSVkXG4iLCAKKwkgIElORk8tPnZlcnNpb24sIElORk8tPmJsb2Nrc2l6ZSk7CisjZW5kaWYgLyogUkVJU0VSREVCVUcgKi8KKworICAvKiBDbGVhciBub2RlIGNhY2hlLiAqLworICBtZW1zZXQgKElORk8tPmJsb2NrcywgMCwgc2l6ZW9mIChJTkZPLT5ibG9ja3MpKTsKKworICBpZiAoc3VwZXIuc19ibG9ja3NpemUgPCBGU1lTUkVJU0VSX01JTl9CTE9DS1NJWkUKKyAgICAgIHx8IHN1cGVyLnNfYmxvY2tzaXplID4gRlNZU1JFSVNFUl9NQVhfQkxPQ0tTSVpFCisgICAgICB8fCAoU0VDVE9SX1NJWkUgPDwgSU5GTy0+YmxvY2tzaXplX3NoaWZ0KSAhPSBzdXBlci5zX2Jsb2Nrc2l6ZSkKKyAgICByZXR1cm4gMDsKKworICAvKiBJbml0aWFsaXplIGpvdXJuYWwgY29kZS4gIElmIHNvbWV0aGluZyBmYWlscyB3ZSBlbmQgd2l0aCB6ZXJvCisgICAqIGpvdXJuYWxfdHJhbnNhY3Rpb25zLCBzbyB3ZSBkb24ndCBhY2Nlc3MgdGhlIGpvdXJuYWwgYXQgYWxsLiAgCisgICAqLworICBJTkZPLT5qb3VybmFsX3RyYW5zYWN0aW9ucyA9IDA7CisgIGlmIChzdXBlci5zX2pvdXJuYWxfYmxvY2sgIT0gMCAmJiBzdXBlci5zX2pvdXJuYWxfZGV2ID09IDApCisgICAgeworICAgICAgSU5GTy0+am91cm5hbF9ibG9jayA9IHN1cGVyLnNfam91cm5hbF9ibG9jazsKKyAgICAgIElORk8tPmpvdXJuYWxfYmxvY2tfY291bnQgPSBzdXBlci5zX2pvdXJuYWxfc2l6ZTsKKyAgICAgIGlmIChpc19wb3dlcl9vZl90d28gKElORk8tPmpvdXJuYWxfYmxvY2tfY291bnQpKQorCWpvdXJuYWxfaW5pdCAoKTsKKworICAgICAgLyogUmVhZCBpbiBzdXBlciBibG9jayBhZ2FpbiwgbWF5YmUgaXQgaXMgaW4gdGhlIGpvdXJuYWwgKi8KKyAgICAgIGJsb2NrX3JlYWQgKHN1cGVyYmxvY2sgPj4gSU5GTy0+YmxvY2tzaXplX3NoaWZ0LCAKKwkJICAwLCBzaXplb2YgKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayksIChjaGFyICopICZzdXBlcik7CisgICAgfQorCisgIGlmICghIGJsb2NrX3JlYWQgKHN1cGVyLnNfcm9vdF9ibG9jaywgMCwgSU5GTy0+YmxvY2tzaXplLCAoY2hhciopIFJPT1QpKQorICAgIHJldHVybiAwOworICAKKyAgSU5GTy0+dHJlZV9kZXB0aCA9IEJMT0NLSEVBRCAoUk9PVCktPmJsa19sZXZlbDsKKyAgCisjaWZkZWYgUkVJU0VSREVCVUcKKyAgcHJpbnRmICgicm9vdCByZWFkX2luOiBibG9jaz0lZCwgZGVwdGg9JWRcbiIsIAorCSAgc3VwZXIuc19yb290X2Jsb2NrLCBJTkZPLT50cmVlX2RlcHRoKTsKKyNlbmRpZiAvKiBSRUlTRVJERUJVRyAqLworCisgIGlmIChJTkZPLT50cmVlX2RlcHRoID49IE1BWF9IRUlHSFQpCisgICAgcmV0dXJuIDA7CisgIGlmIChJTkZPLT50cmVlX2RlcHRoID09IERJU0tfTEVBRl9OT0RFX0xFVkVMKQorICAgIHsKKyAgICAgIC8qIFRoZXJlIGlzIG9ubHkgb25lIG5vZGUgaW4gdGhlIHdob2xlIGZpbGVzeXN0ZW0sIAorICAgICAgICogd2hpY2ggaXMgc2ltdWx0YW5vdXNseSBsZWFmIGFuZCByb290ICovCisgICAgICBtZW1jcHkgKExFQUYsIFJPT1QsIElORk8tPmJsb2Nrc2l6ZSk7CisgICAgfQorICByZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqIFRSRUUgQUNDRVNTSU5HIE1FVEhPRFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEkgYXNzdW1lIHlvdSBhcmUgZmFtaWxpYXIgd2l0aCB0aGUgUmVpc2VyRlMgdHJlZSwgaWYgbm90IGdvIHRvCisgKiBodHRwOi8vd3d3Lm5hbWVzeXMuY29tL2NvbnRlbnRfdGFibGUuaHRtbAorICoKKyAqIE15IHRyZWUgbm9kZSBjYWNoZSBpcyBvcmdhbml6ZWQgYXMgZm9sbG93aW5nCisgKiAgIDAgICBST09UIG5vZGUKKyAqICAgMSAgIExFQUYgbm9kZSAgKGlmIHRoZSBST09UIGlzIGFsc28gYSBMRUFGIGl0IGlzIGNvcGllZCBoZXJlCisgKiAgIDItbiBvdGhlciBub2RlcyBvbiBjdXJyZW50IHBhdGggZnJvbSBib3R0b20gdG8gdG9wLiAgCisgKiAgICAgICBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIHNwYWNlIGluIHRoZSBjYWNoZSwgdGhlIHRvcCBtb3N0IGFyZQorICogICAgICAgb21pdHRlZC4KKyAqCisgKiBJIGhhdmUgb25seSB0d28gbWV0aG9kcyB0byBmaW5kIGEga2V5IGluIHRoZSB0cmVlOgorICogICBzZWFyY2hfc3RhdChkaXJfaWQsIG9iamVjdGlkKSBzZWFyY2hlcyBmb3IgdGhlIHN0YXQgZW50cnkgKGFsd2F5cworICogICAgICAgdGhlIGZpcnN0IGVudHJ5KSBvZiBhbiBvYmplY3QuCisgKiAgIG5leHRfa2V5KCkgZ2V0cyB0aGUgbmV4dCBrZXkgaW4gdHJlZSBvcmRlci4KKyAqCisgKiBUaGlzIG1lYW5zLCB0aGF0IEkgY2FuIG9ubHkgc2VxdWVudGlhbCByZWFkcyBvZiBmaWxlcyBhcmUKKyAqIGVmZmljaWVudCwgYnV0IHRoaXMgcmVhbGx5IGRvZXNuJ3QgaHVydCBmb3IgZ3J1Yi4gIAorICovCisKKy8qIFJlYWQgaW4gdGhlIG5vZGUgYXQgdGhlIGN1cnJlbnQgcGF0aCBhbmQgZGVwdGggaW50byB0aGUgbm9kZSBjYWNoZS4KKyAqIFlvdSBtdXN0IHNldCBJTkZPLT5ibG9ja3NbZGVwdGhdIGJlZm9yZS4KKyAqLworc3RhdGljIGNoYXIgKgorcmVhZF90cmVlX25vZGUgKHVuc2lnbmVkIGludCBibG9ja05yLCBpbnQgZGVwdGgpCit7CisgIGNoYXIqIGNhY2hlID0gQ0FDSEUoZGVwdGgpOworICBpbnQgbnVtX2NhY2hlZCA9IElORk8tPmNhY2hlZF9zbG90czsKKyAgaWYgKGRlcHRoIDwgbnVtX2NhY2hlZCkKKyAgICB7CisgICAgICAvKiBUaGlzIGlzIHRoZSBjYWNoZWQgcGFydCBvZiB0aGUgcGF0aC4gIENoZWNrIGlmIHNhbWUgYmxvY2sgaXMKKyAgICAgICAqIG5lZWRlZC4gIAorICAgICAgICovCisgICAgICBpZiAoYmxvY2tOciA9PSBJTkZPLT5ibG9ja3NbZGVwdGhdKQorCXJldHVybiBjYWNoZTsKKyAgICB9CisgIGVsc2UKKyAgICBjYWNoZSA9IENBQ0hFKG51bV9jYWNoZWQpOworCisjaWZkZWYgUkVJU0VSREVCVUcKKyAgcHJpbnRmICgiICBuZXh0IHJlYWRfaW46IGJsb2NrPSVkIChkZXB0aD0lZClcbiIsCisJICBibG9ja05yLCBkZXB0aCk7CisjZW5kaWYgLyogUkVJU0VSREVCVUcgKi8KKyAgaWYgKCEgYmxvY2tfcmVhZCAoYmxvY2tOciwgMCwgSU5GTy0+YmxvY2tzaXplLCBjYWNoZSkpCisgICAgcmV0dXJuIDA7CisgIC8qIE1ha2Ugc3VyZSBpdCBoYXMgdGhlIHJpZ2h0IG5vZGUgbGV2ZWwgKi8KKyAgaWYgKEJMT0NLSEVBRCAoY2FjaGUpLT5ibGtfbGV2ZWwgIT0gZGVwdGgpCisgICAgeworICAgICAgZXJybnVtID0gRVJSX0ZTWVNfQ09SUlVQVDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBJTkZPLT5ibG9ja3NbZGVwdGhdID0gYmxvY2tOcjsKKyAgcmV0dXJuIGNhY2hlOworfQorCisvKiBHZXQgdGhlIG5leHQga2V5LCBpLmUuIHRoZSBrZXkgZm9sbG93aW5nIHRoZSBsYXN0IHJldHJpZXZlZCBrZXkgaW4KKyAqIHRyZWUgb3JkZXIuICBJTkZPLT5jdXJyZW50X2loIGFuZCAKKyAqIElORk8tPmN1cnJlbnRfaW5mbyBhcmUgYWRhcHRlZCBhY2NvcmRpbmdseS4gICovCitzdGF0aWMgaW50CituZXh0X2tleSAodm9pZCkKK3sKKyAgaW50IGRlcHRoOworICBzdHJ1Y3QgaXRlbV9oZWFkICppaCA9IElORk8tPmN1cnJlbnRfaWggKyAxOworICBjaGFyICpjYWNoZTsKKyAgCisjaWZkZWYgUkVJU0VSREVCVUcKKyAgcHJpbnRmICgibmV4dF9rZXk6XG4gIG9sZCBpaDoga2V5ICVkOiVkOiVkOiVkIHZlcnNpb246JWRcbiIsIAorCSAgSU5GTy0+Y3VycmVudF9paC0+aWhfa2V5LmtfZGlyX2lkLCAKKwkgIElORk8tPmN1cnJlbnRfaWgtPmloX2tleS5rX29iamVjdGlkLCAKKwkgIElORk8tPmN1cnJlbnRfaWgtPmloX2tleS51LnYxLmtfb2Zmc2V0LAorCSAgSU5GTy0+Y3VycmVudF9paC0+aWhfa2V5LnUudjEua191bmlxdWVuZXNzLAorCSAgSU5GTy0+Y3VycmVudF9paC0+aWhfdmVyc2lvbik7CisjZW5kaWYgLyogUkVJU0VSREVCVUcgKi8KKyAgCisgIGlmIChpaCA9PSAmSVRFTUhFQURbQkxPQ0tIRUFEIChMRUFGKS0+YmxrX25yX2l0ZW1dKQorICAgIHsKKyAgICAgIGRlcHRoID0gRElTS19MRUFGX05PREVfTEVWRUw7CisgICAgICAvKiBUaGUgbGFzdCBpdGVtLCB3YXMgdGhlIGxhc3QgaW4gdGhlIGxlYWYgbm9kZS4gIAorICAgICAgICogUmVhZCBpbiB0aGUgbmV4dCBibG9jayAKKyAgICAgICAqLworICAgICAgZG8KKwl7CisJICBpZiAoZGVwdGggPT0gSU5GTy0+dHJlZV9kZXB0aCkKKwkgICAgeworCSAgICAgIC8qIFRoZXJlIGFyZSBubyBtb3JlIGtleXMgYXQgYWxsLgorCSAgICAgICAqIFJldHVybiBhIGR1bW15IGl0ZW0gd2l0aCBNQVhfS0VZICovCisJICAgICAgaWggPSAoc3RydWN0IGl0ZW1faGVhZCAqKSAmQkxPQ0tIRUFEIChMRUFGKS0+YmxrX3JpZ2h0X2RlbGltX2tleTsKKwkgICAgICBnb3RvIGZvdW5kOworCSAgICB9CisJICBkZXB0aCsrOworI2lmZGVmIFJFSVNFUkRFQlVHCisJICBwcmludGYgKCIgIGRlcHRoPSVkLCBpPSVkXG4iLCBkZXB0aCwgSU5GTy0+bmV4dF9rZXlfbnJbZGVwdGhdKTsKKyNlbmRpZiAvKiBSRUlTRVJERUJVRyAqLworCX0KKyAgICAgIHdoaWxlIChJTkZPLT5uZXh0X2tleV9ucltkZXB0aF0gPT0gMCk7CisgICAgICAKKyAgICAgIGlmIChkZXB0aCA9PSBJTkZPLT50cmVlX2RlcHRoKQorCWNhY2hlID0gUk9PVDsKKyAgICAgIGVsc2UgaWYgKGRlcHRoIDw9IElORk8tPmNhY2hlZF9zbG90cykKKwljYWNoZSA9IENBQ0hFIChkZXB0aCk7CisgICAgICBlbHNlIAorCXsKKwkgIGNhY2hlID0gcmVhZF90cmVlX25vZGUgKElORk8tPmJsb2Nrc1tkZXB0aF0sIGRlcHRoKTsKKwkgIGlmICghIGNhY2hlKQorCSAgICByZXR1cm4gMDsKKwl9CisgICAgICAKKyAgICAgIGRvCisJeworCSAgaW50IG5yX2l0ZW0gPSBCTE9DS0hFQUQgKGNhY2hlKS0+YmxrX25yX2l0ZW07CisJICBpbnQga2V5X25yID0gSU5GTy0+bmV4dF9rZXlfbnJbZGVwdGhdKys7CisjaWZkZWYgUkVJU0VSREVCVUcKKwkgIHByaW50ZiAoIiAgZGVwdGg9JWQsIGk9JWQvJWRcbiIsIGRlcHRoLCBrZXlfbnIsIG5yX2l0ZW0pOworI2VuZGlmIC8qIFJFSVNFUkRFQlVHICovCisJICBpZiAoa2V5X25yID09IG5yX2l0ZW0pCisJICAgIC8qIFRoaXMgaXMgdGhlIGxhc3QgaXRlbSBpbiB0aGlzIGJsb2NrLCBzZXQgdGhlIG5leHRfa2V5X25yIHRvIDAgKi8KKwkgICAgSU5GTy0+bmV4dF9rZXlfbnJbZGVwdGhdID0gMDsKKworCSAgY2FjaGUgPSByZWFkX3RyZWVfbm9kZSAoREMgKGNhY2hlKVtrZXlfbnJdLmRjX2Jsb2NrX251bWJlciwgLS1kZXB0aCk7CisJICBpZiAoISBjYWNoZSkKKwkgICAgcmV0dXJuIDA7CisJfQorICAgICAgd2hpbGUgKGRlcHRoID4gRElTS19MRUFGX05PREVfTEVWRUwpOworICAgICAgCisgICAgICBpaCA9IElURU1IRUFEOworICAgIH0KKyBmb3VuZDoKKyAgSU5GTy0+Y3VycmVudF9paCAgID0gaWg7CisgIElORk8tPmN1cnJlbnRfaXRlbSA9ICZMRUFGW2loLT5paF9pdGVtX2xvY2F0aW9uXTsKKyNpZmRlZiBSRUlTRVJERUJVRworICBwcmludGYgKCIgIG5ldyBpaDoga2V5ICVkOiVkOiVkOiVkIHZlcnNpb246JWRcbiIsIAorCSAgSU5GTy0+Y3VycmVudF9paC0+aWhfa2V5LmtfZGlyX2lkLCAKKwkgIElORk8tPmN1cnJlbnRfaWgtPmloX2tleS5rX29iamVjdGlkLCAKKwkgIElORk8tPmN1cnJlbnRfaWgtPmloX2tleS51LnYxLmtfb2Zmc2V0LAorCSAgSU5GTy0+Y3VycmVudF9paC0+aWhfa2V5LnUudjEua191bmlxdWVuZXNzLAorCSAgSU5GTy0+Y3VycmVudF9paC0+aWhfdmVyc2lvbik7CisjZW5kaWYgLyogUkVJU0VSREVCVUcgKi8KKyAgcmV0dXJuIDE7Cit9CisKKy8qIHByZWNvbmRpdGlvbnM6IHJlaXNlcmZzX21vdW50IGFscmVhZHkgZXhlY3V0ZWQsIHRoZXJlZm9yZSAKKyAqICAgSU5GTyBibG9jayBpcyB2YWxpZAorICogcmV0dXJuczogMCBpZiBlcnJvciAoZXJybnVtIGlzIHNldCksIAorICogICBub256ZXJvIGlmZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCB0aGUga2V5IHN1Y2Nlc3NmdWxseS4KKyAqIHBvc3Rjb25kaXRpb25zOiBvbiBhIG5vbnplcm8gcmV0dXJuLCB0aGUgY3VycmVudF9paCBhbmQgCisgKiAgIGN1cnJlbnRfaXRlbSBmaWVsZHMgZGVzY3JpYmUgdGhlIGtleSB0aGF0IGVxdWFscyB0aGUKKyAqICAgc2VhcmNoZWQga2V5LiAgSU5GTy0+bmV4dF9rZXkgY29udGFpbnMgdGhlIG5leHQga2V5IGFmdGVyCisgKiAgIHRoZSBzZWFyY2hlZCBrZXkuCisgKiBzaWRlIGVmZmVjdHM6IG1lc3NlcyBhcm91bmQgd2l0aCB0aGUgY2FjaGUuCisgKi8KK3N0YXRpYyBpbnQKK3NlYXJjaF9zdGF0IChfX3UzMiBkaXJfaWQsIF9fdTMyIG9iamVjdGlkKSAKK3sKKyAgY2hhciAqY2FjaGU7CisgIGludCBkZXB0aDsKKyAgaW50IG5yX2l0ZW07CisgIGludCBpOworICBzdHJ1Y3QgaXRlbV9oZWFkICppaDsKKyNpZmRlZiBSRUlTRVJERUJVRworICBwcmludGYgKCJzZWFyY2hfc3RhdDpcbiAga2V5ICVkOiVkOjA6MFxuIiwgZGlyX2lkLCBvYmplY3RpZCk7CisjZW5kaWYgLyogUkVJU0VSREVCVUcgKi8KKyAgCisgIGRlcHRoID0gSU5GTy0+dHJlZV9kZXB0aDsKKyAgY2FjaGUgPSBST09UOworICAKKyAgd2hpbGUgKGRlcHRoID4gRElTS19MRUFGX05PREVfTEVWRUwpCisgICAgeworICAgICAgc3RydWN0IGtleSAqa2V5OworICAgICAgbnJfaXRlbSA9IEJMT0NLSEVBRCAoY2FjaGUpLT5ibGtfbnJfaXRlbTsKKyAgICAgIAorICAgICAga2V5ID0gS0VZIChjYWNoZSk7CisgICAgICAKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBucl9pdGVtOyBpKyspIAorCXsKKwkgIGlmIChrZXktPmtfZGlyX2lkID4gZGlyX2lkCisJICAgICAgfHwgKGtleS0+a19kaXJfaWQgPT0gZGlyX2lkIAorCQkgICYmIChrZXktPmtfb2JqZWN0aWQgPiBvYmplY3RpZAorCQkgICAgICB8fCAoa2V5LT5rX29iamVjdGlkID09IG9iamVjdGlkCisJCQkgICYmIChrZXktPnUudjEua19vZmZzZXQKKwkJCSAgICAgIHwga2V5LT51LnYxLmtfdW5pcXVlbmVzcykgPiAwKSkpKQorCSAgICBicmVhazsKKwkgIGtleSsrOworCX0KKyAgICAgIAorI2lmZGVmIFJFSVNFUkRFQlVHCisgICAgICBwcmludGYgKCIgIGRlcHRoPSVkLCBpPSVkLyVkXG4iLCBkZXB0aCwgaSwgbnJfaXRlbSk7CisjZW5kaWYgLyogUkVJU0VSREVCVUcgKi8KKyAgICAgIElORk8tPm5leHRfa2V5X25yW2RlcHRoXSA9IChpID09IG5yX2l0ZW0pID8gMCA6IGkrMTsKKyAgICAgIGNhY2hlID0gcmVhZF90cmVlX25vZGUgKERDIChjYWNoZSlbaV0uZGNfYmxvY2tfbnVtYmVyLCAtLWRlcHRoKTsKKyAgICAgIGlmICghIGNhY2hlKQorCXJldHVybiAwOworICAgIH0KKyAgCisgIC8qIGNhY2hlID09IExFQUYgKi8KKyAgbnJfaXRlbSA9IEJMT0NLSEVBRCAoTEVBRiktPmJsa19ucl9pdGVtOworICBpaCA9IElURU1IRUFEOworICBmb3IgKGkgPSAwOyBpIDwgbnJfaXRlbTsgaSsrKSAKKyAgICB7CisgICAgICBpZiAoaWgtPmloX2tleS5rX2Rpcl9pZCA9PSBkaXJfaWQgCisJICAmJiBpaC0+aWhfa2V5Lmtfb2JqZWN0aWQgPT0gb2JqZWN0aWQKKwkgICYmIGloLT5paF9rZXkudS52MS5rX29mZnNldCA9PSAwCisJICAmJiBpaC0+aWhfa2V5LnUudjEua191bmlxdWVuZXNzID09IDApCisJeworI2lmZGVmIFJFSVNFUkRFQlVHCisJICBwcmludGYgKCIgIGRlcHRoPSVkLCBpPSVkLyVkXG4iLCBkZXB0aCwgaSwgbnJfaXRlbSk7CisjZW5kaWYgLyogUkVJU0VSREVCVUcgKi8KKwkgIElORk8tPmN1cnJlbnRfaWggICA9IGloOworCSAgSU5GTy0+Y3VycmVudF9pdGVtID0gJkxFQUZbaWgtPmloX2l0ZW1fbG9jYXRpb25dOworCSAgcmV0dXJuIDE7CisJfQorICAgICAgaWgrKzsKKyAgICB9CisgIGVycm51bSA9IEVSUl9GU1lTX0NPUlJVUFQ7CisgIHJldHVybiAwOworfQorCitpbnQKK3JlaXNlcmZzX3JlYWQgKGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKyAgdW5zaWduZWQgaW50IGJsb2Nrc2l6ZTsKKyAgdW5zaWduZWQgaW50IG9mZnNldDsKKyAgdW5zaWduZWQgaW50IHRvX3JlYWQ7CisgIGNoYXIgKnByZXZfYnVmID0gYnVmOworICAKKyNpZmRlZiBSRUlTRVJERUJVRworICBwcmludGYgKCJyZWlzZXJmc19yZWFkOiBmaWxlcG9zPSVkIGxlbj0lZCwgb2Zmc2V0PSV4OiV4XG4iLAorCSAgZmlsZXBvcywgbGVuLCAoX191NjQpIElIX0tFWV9PRkZTRVQgKElORk8tPmN1cnJlbnRfaWgpIC0gMSk7CisjZW5kaWYgLyogUkVJU0VSREVCVUcgKi8KKyAgCisgIGlmIChJTkZPLT5jdXJyZW50X2loLT5paF9rZXkua19vYmplY3RpZCAhPSBJTkZPLT5maWxlaW5mby5rX29iamVjdGlkCisgICAgICB8fCBJSF9LRVlfT0ZGU0VUIChJTkZPLT5jdXJyZW50X2loKSA+IGZpbGVwb3MgKyAxKQorICAgIHsKKyAgICAgIHNlYXJjaF9zdGF0IChJTkZPLT5maWxlaW5mby5rX2Rpcl9pZCwgSU5GTy0+ZmlsZWluZm8ua19vYmplY3RpZCk7CisgICAgICBnb3RvIGdldF9uZXh0X2tleTsKKyAgICB9CisgIAorICB3aGlsZSAoISBlcnJudW0pCisgICAgeworICAgICAgaWYgKElORk8tPmN1cnJlbnRfaWgtPmloX2tleS5rX29iamVjdGlkICE9IElORk8tPmZpbGVpbmZvLmtfb2JqZWN0aWQpCisJYnJlYWs7CisgICAgICAKKyAgICAgIG9mZnNldCA9IGZpbGVwb3MgLSBJSF9LRVlfT0ZGU0VUIChJTkZPLT5jdXJyZW50X2loKSArIDE7CisgICAgICBibG9ja3NpemUgPSBJTkZPLT5jdXJyZW50X2loLT5paF9pdGVtX2xlbjsKKyAgICAgIAorI2lmZGVmIFJFSVNFUkRFQlVHCisgICAgICBwcmludGYgKCIgIGxvb3A6IGZpbGVwb3M9JWQgbGVuPSVkLCBvZmZzZXQ9JWQgYmxvY2tzaXplPSVkXG4iLAorCSAgICAgIGZpbGVwb3MsIGxlbiwgb2Zmc2V0LCBibG9ja3NpemUpOworI2VuZGlmIC8qIFJFSVNFUkRFQlVHICovCisgICAgICAKKyAgICAgIGlmIChJSF9LRVlfSVNUWVBFKElORk8tPmN1cnJlbnRfaWgsIFRZUEVfRElSRUNUKQorCSAgJiYgb2Zmc2V0IDwgYmxvY2tzaXplKQorCXsKKyNpZmRlZiBSRUlTRVJERUJVRworCSAgcHJpbnRmICgiZGlyZWN0X3JlYWQ6IG9mZnNldD0lZCwgYmxvY2tzaXplPSVkXG4iLAorCQkgIG9mZnNldCwgYmxvY2tzaXplKTsKKyNlbmRpZiAvKiBSRUlTRVJERUJVRyAqLworCSAgdG9fcmVhZCA9IGJsb2Nrc2l6ZSAtIG9mZnNldDsKKwkgIGlmICh0b19yZWFkID4gbGVuKQorCSAgICB0b19yZWFkID0gbGVuOworCSAgCisJICBpZiAoZGlza19yZWFkX2hvb2sgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGRpc2tfcmVhZF9mdW5jID0gZGlza19yZWFkX2hvb2s7CisJICAgICAgCisJICAgICAgYmxvY2tfcmVhZCAoSU5GTy0+YmxvY2tzW0RJU0tfTEVBRl9OT0RFX0xFVkVMXSwKKwkJCSAgKElORk8tPmN1cnJlbnRfaXRlbSAtIExFQUYgKyBvZmZzZXQpLCB0b19yZWFkLCBidWYpOworCSAgICAgIAorCSAgICAgIGRpc2tfcmVhZF9mdW5jID0gTlVMTDsKKwkgICAgfQorCSAgZWxzZQorCSAgICBtZW1jcHkgKGJ1ZiwgSU5GTy0+Y3VycmVudF9pdGVtICsgb2Zmc2V0LCB0b19yZWFkKTsKKwkgIGdvdG8gdXBkYXRlX2J1Zl9sZW47CisJfQorICAgICAgZWxzZSBpZiAoSUhfS0VZX0lTVFlQRShJTkZPLT5jdXJyZW50X2loLCBUWVBFX0lORElSRUNUKSkKKwl7CisJICBibG9ja3NpemUgPSAoYmxvY2tzaXplID4+IDIpIDw8IElORk8tPmZ1bGxibG9ja3NpemVfc2hpZnQ7CisjaWZkZWYgUkVJU0VSREVCVUcKKwkgIHByaW50ZiAoImluZGlyZWN0X3JlYWQ6IG9mZnNldD0lZCwgYmxvY2tzaXplPSVkXG4iLAorCQkgIG9mZnNldCwgYmxvY2tzaXplKTsKKyNlbmRpZiAvKiBSRUlTRVJERUJVRyAqLworCSAgCisJICB3aGlsZSAob2Zmc2V0IDwgYmxvY2tzaXplKQorCSAgICB7CisJICAgICAgX191MzIgYmxvY2tuciA9ICgoX191MzIgKikgSU5GTy0+Y3VycmVudF9pdGVtKQorCQlbb2Zmc2V0ID4+IElORk8tPmZ1bGxibG9ja3NpemVfc2hpZnRdOworCSAgICAgIGludCBibGtfb2Zmc2V0ID0gb2Zmc2V0ICYgKElORk8tPmJsb2Nrc2l6ZS0xKTsKKwkgICAgICAKKwkgICAgICB0b19yZWFkID0gSU5GTy0+YmxvY2tzaXplIC0gYmxrX29mZnNldDsKKwkgICAgICBpZiAodG9fcmVhZCA+IGxlbikKKwkJdG9fcmVhZCA9IGxlbjsKKwkgICAgICAKKwkgICAgICBkaXNrX3JlYWRfZnVuYyA9IGRpc2tfcmVhZF9ob29rOworCSAgICAgIAorCSAgICAgIC8qIEpvdXJuYWwgaXMgb25seSBmb3IgbWV0YSBkYXRhLiAgRGF0YSBibG9ja3MgY2FuIGJlIHJlYWQKKwkgICAgICAgKiBkaXJlY3RseSB3aXRob3V0IHVzaW5nIGJsb2NrX3JlYWQKKwkgICAgICAgKi8KKwkgICAgICBkZXZyZWFkIChibG9ja25yIDw8IElORk8tPmJsb2Nrc2l6ZV9zaGlmdCwKKwkJICAgICAgIGJsa19vZmZzZXQsIHRvX3JlYWQsIGJ1Zik7CisJICAgICAgCisJICAgICAgZGlza19yZWFkX2Z1bmMgPSBOVUxMOworCSAgICB1cGRhdGVfYnVmX2xlbjoKKwkgICAgICBsZW4gLT0gdG9fcmVhZDsKKwkgICAgICBidWYgKz0gdG9fcmVhZDsKKwkgICAgICBvZmZzZXQgKz0gdG9fcmVhZDsKKwkgICAgICBmaWxlcG9zICs9IHRvX3JlYWQ7CisJICAgICAgaWYgKGxlbiA9PSAwKQorCQlnb3RvIGRvbmU7CisJICAgIH0KKwl9CisgICAgZ2V0X25leHRfa2V5OgorICAgICAgbmV4dF9rZXkgKCk7CisgICAgfQorIGRvbmU6CisgIHJldHVybiBlcnJudW0gPyAwIDogYnVmIC0gcHJldl9idWY7Cit9CisKKworLyogcHJlY29uZGl0aW9uczogcmVpc2VyZnNfbW91bnQgYWxyZWFkeSBleGVjdXRlZCwgdGhlcmVmb3JlIAorICogICBJTkZPIGJsb2NrIGlzIHZhbGlkCisgKiByZXR1cm5zOiAwIGlmIGVycm9yLCBub256ZXJvIGlmZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCB0aGUgZmlsZSBzdWNjZXNzZnVsbHkKKyAqIHBvc3Rjb25kaXRpb25zOiBvbiBhIG5vbnplcm8gcmV0dXJuLCBJTkZPLT5maWxlaW5mbyBjb250YWlucyB0aGUgaW5mbworICogICBvZiB0aGUgZmlsZSB3ZSB3ZXJlIHRyeWluZyB0byBsb29rIHVwLCBmaWxlcG9zIGlzIDAgYW5kIGZpbGVtYXggaXMgCisgKiAgIHRoZSBzaXplIG9mIHRoZSBmaWxlLgorICovCitpbnQKK3JlaXNlcmZzX2RpciAoY2hhciAqZGlybmFtZSkKK3sKKyAgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKmRlX2hlYWQ7CisgIGNoYXIgKnJlc3QsIGNoOworICBfX3UzMiBkaXJfaWQsIG9iamVjdGlkLCBwYXJlbnRfZGlyX2lkID0gMCwgcGFyZW50X29iamVjdGlkID0gMDsKKyNpZm5kZWYgU1RBR0UxXzUKKyAgaW50IGRvX3Bvc3NpYmlsaXRpZXMgPSAwOworI2VuZGlmIC8qICEgU1RBR0UxXzUgKi8KKyAgY2hhciBsaW5rYnVmW1BBVEhfTUFYXTsJLyogYnVmZmVyIGZvciBmb2xsb3dpbmcgc3ltYm9saWMgbGlua3MgKi8KKyAgaW50IGxpbmtfY291bnQgPSAwOworICBpbnQgbW9kZTsKKworICBkaXJfaWQgPSBSRUlTRVJGU19ST09UX1BBUkVOVF9PQkpFQ1RJRDsKKyAgb2JqZWN0aWQgPSBSRUlTRVJGU19ST09UX09CSkVDVElEOworICAKKyAgd2hpbGUgKDEpCisgICAgeworI2lmZGVmIFJFSVNFUkRFQlVHCisgICAgICBwcmludGYgKCJkaXJuYW1lPSVzXG4iLCBkaXJuYW1lKTsKKyNlbmRpZiAvKiBSRUlTRVJERUJVRyAqLworICAgICAgCisgICAgICAvKiBTZWFyY2ggZm9yIHRoZSBzdGF0IGluZm8gZmlyc3QuICovCisgICAgICBpZiAoISBzZWFyY2hfc3RhdCAoZGlyX2lkLCBvYmplY3RpZCkpCisJcmV0dXJuIDA7CisgICAgICAKKyNpZmRlZiBSRUlTRVJERUJVRworICAgICAgcHJpbnRmICgic2RfbW9kZT0leCBzZF9zaXplPSVkXG4iLCAKKwkgICAgICAoKHN0cnVjdCBzdGF0X2RhdGEgKikgSU5GTy0+Y3VycmVudF9pdGVtKS0+c2RfbW9kZSwKKwkgICAgICAoKHN0cnVjdCBzdGF0X2RhdGEgKikgSU5GTy0+Y3VycmVudF9pdGVtKS0+c2Rfc2l6ZSk7CisjZW5kaWYgLyogUkVJU0VSREVCVUcgKi8KKyAgICAgIAorICAgICAgbW9kZSA9ICgoc3RydWN0IHN0YXRfZGF0YSAqKSBJTkZPLT5jdXJyZW50X2l0ZW0pLT5zZF9tb2RlOworCisgICAgICAvKiBJZiB3ZSd2ZSBnb3QgYSBzeW1ib2xpYyBsaW5rLCB0aGVuIGNoYXNlIGl0LiAqLworICAgICAgaWYgKFNfSVNMTksgKG1vZGUpKQorCXsKKwkgIGludCBsZW47CisJICBpZiAoKytsaW5rX2NvdW50ID4gTUFYX0xJTktfQ09VTlQpCisJICAgIHsKKwkgICAgICBlcnJudW0gPSBFUlJfU1lNTElOS19MT09QOworCSAgICAgIHJldHVybiAwOworCSAgICB9CisKKwkgIC8qIEdldCB0aGUgc3ltbGluayBzaXplLiAqLworCSAgZmlsZW1heCA9ICgoc3RydWN0IHN0YXRfZGF0YSAqKSBJTkZPLT5jdXJyZW50X2l0ZW0pLT5zZF9zaXplOworCisJICAvKiBGaW5kIG91dCBob3cgbG9uZyBvdXIgcmVtYWluaW5nIG5hbWUgaXMuICovCisJICBsZW4gPSAwOworCSAgd2hpbGUgKGRpcm5hbWVbbGVuXSAmJiAhaXNzcGFjZSAoZGlybmFtZVtsZW5dKSkKKwkgICAgbGVuKys7CisKKwkgIGlmIChmaWxlbWF4ICsgbGVuID4gc2l6ZW9mIChsaW5rYnVmKSAtIDEpCisJICAgIHsKKwkgICAgICBlcnJudW0gPSBFUlJfRklMRUxFTkdUSDsKKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorIAkgIAorCSAgLyogQ29weSB0aGUgcmVtYWluaW5nIG5hbWUgdG8gdGhlIGVuZCBvZiB0aGUgc3ltbGluayBkYXRhLgorCSAgICAgTm90ZSB0aGF0IERJUk5BTUUgYW5kIExJTktCVUYgbWF5IG92ZXJsYXAhICovCisJICBncnViX21lbW1vdmUgKGxpbmtidWYgKyBmaWxlbWF4LCBkaXJuYW1lLCBsZW4rMSk7CisKKwkgIElORk8tPmZpbGVpbmZvLmtfZGlyX2lkID0gZGlyX2lkOworCSAgSU5GTy0+ZmlsZWluZm8ua19vYmplY3RpZCA9IG9iamVjdGlkOworICAJICBmaWxlcG9zID0gMDsKKwkgIGlmICghIG5leHRfa2V5ICgpCisJICAgICAgfHwgcmVpc2VyZnNfcmVhZCAobGlua2J1ZiwgZmlsZW1heCkgIT0gZmlsZW1heCkKKwkgICAgeworCSAgICAgIGlmICghIGVycm51bSkKKwkJZXJybnVtID0gRVJSX0ZTWVNfQ09SUlVQVDsKKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCisjaWZkZWYgUkVJU0VSREVCVUcKKwkgIHByaW50ZiAoInN5bWxpbms9JXNcbiIsIGxpbmtidWYpOworI2VuZGlmIC8qIFJFSVNFUkRFQlVHICovCisKKwkgIGRpcm5hbWUgPSBsaW5rYnVmOworCSAgaWYgKCpkaXJuYW1lID09ICcvJykKKwkgICAgeworCSAgICAgIC8qIEl0J3MgYW4gYWJzb2x1dGUgbGluaywgc28gbG9vayBpdCB1cCBpbiByb290LiAqLworCSAgICAgIGRpcl9pZCA9IFJFSVNFUkZTX1JPT1RfUEFSRU5UX09CSkVDVElEOworCSAgICAgIG9iamVjdGlkID0gUkVJU0VSRlNfUk9PVF9PQkpFQ1RJRDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogUmVsYXRpdmUsIHNvIGxvb2sgaXQgdXAgaW4gb3VyIHBhcmVudCBkaXJlY3RvcnkuICovCisJICAgICAgZGlyX2lkICAgPSBwYXJlbnRfZGlyX2lkOworCSAgICAgIG9iamVjdGlkID0gcGFyZW50X29iamVjdGlkOworCSAgICB9CisKKwkgIC8qIE5vdyBsb29rdXAgdGhlIG5ldyBuYW1lLiAqLworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBpZiB3ZSBoYXZlIGEgcmVhbCBmaWxlIChhbmQgd2UncmUgbm90IGp1c3QgcHJpbnRpbmcgcG9zc2liaWxpdGllcyksCisJIHRoZW4gdGhpcyBpcyB3aGVyZSB3ZSB3YW50IHRvIGV4aXQgKi8KKyAgICAgIAorICAgICAgaWYgKCEgKmRpcm5hbWUgfHwgaXNzcGFjZSAoKmRpcm5hbWUpKQorCXsKKwkgIGlmICghIFNfSVNSRUcgKG1vZGUpKQorCSAgICB7CisJICAgICAgZXJybnVtID0gRVJSX0JBRF9GSUxFVFlQRTsKKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCSAgCisJICBmaWxlcG9zID0gMDsKKwkgIGZpbGVtYXggPSAoKHN0cnVjdCBzdGF0X2RhdGEgKikgSU5GTy0+Y3VycmVudF9pdGVtKS0+c2Rfc2l6ZTsKKwkgIAorCSAgLyogSWYgdGhpcyBpcyBhIG5ldyBzdGF0IGRhdGEgYW5kIHNpemUgaXMgPiA0R0Igc2V0IGZpbGVtYXggdG8gCisJICAgKiBtYXhpbXVtCisJICAgKi8KKwkgIGlmIChJTkZPLT5jdXJyZW50X2loLT5paF92ZXJzaW9uID09IElURU1fVkVSU0lPTl8yCisJICAgICAgJiYgKChzdHJ1Y3Qgc3RhdF9kYXRhICopIElORk8tPmN1cnJlbnRfaXRlbSktPnNkX3NpemVfaGkgPiAwKQorCSAgICBmaWxlbWF4ID0gMHhmZmZmZmZmZjsKKwkgIAorCSAgSU5GTy0+ZmlsZWluZm8ua19kaXJfaWQgPSBkaXJfaWQ7CisJICBJTkZPLT5maWxlaW5mby5rX29iamVjdGlkID0gb2JqZWN0aWQ7CisJICByZXR1cm4gbmV4dF9rZXkgKCk7CisJfQorICAgICAgCisgICAgICAvKiBjb250aW51ZSB3aXRoIHRoZSBmaWxlL2RpcmVjdG9yeSBuYW1lIGludGVycHJldGF0aW9uICovCisgICAgICB3aGlsZSAoKmRpcm5hbWUgPT0gJy8nKQorCWRpcm5hbWUrKzsKKyAgICAgIGlmICghIFNfSVNESVIgKG1vZGUpKQorCXsKKwkgIGVycm51bSA9IEVSUl9CQURfRklMRVRZUEU7CisJICByZXR1cm4gMDsKKwl9CisgICAgICBmb3IgKHJlc3QgPSBkaXJuYW1lOyAoY2ggPSAqcmVzdCkgJiYgISBpc3NwYWNlIChjaCkgJiYgY2ggIT0gJy8nOyByZXN0KyspOworICAgICAgKnJlc3QgPSAwOworICAgICAgCisjIGlmbmRlZiBTVEFHRTFfNQorICAgICAgaWYgKHByaW50X3Bvc3NpYmlsaXRpZXMgJiYgY2ggIT0gJy8nKQorCWRvX3Bvc3NpYmlsaXRpZXMgPSAxOworIyBlbmRpZiAvKiAhIFNUQUdFMV81ICovCisgICAgICAKKyAgICAgIHdoaWxlICgxKQorCXsKKwkgIGNoYXIgKm5hbWVfZW5kOworCSAgaW50IG51bV9lbnRyaWVzOworCSAgCisJICBpZiAoISBuZXh0X2tleSAoKSkKKwkgICAgcmV0dXJuIDA7CisjaWZkZWYgUkVJU0VSREVCVUcKKwkgIHByaW50ZiAoImloOiBrZXkgJWQ6JWQ6JWQ6JWQgdmVyc2lvbjolZFxuIiwgCisJCSAgSU5GTy0+Y3VycmVudF9paC0+aWhfa2V5LmtfZGlyX2lkLCAKKwkJICBJTkZPLT5jdXJyZW50X2loLT5paF9rZXkua19vYmplY3RpZCwgCisJCSAgSU5GTy0+Y3VycmVudF9paC0+aWhfa2V5LnUudjEua19vZmZzZXQsCisJCSAgSU5GTy0+Y3VycmVudF9paC0+aWhfa2V5LnUudjEua191bmlxdWVuZXNzLAorCQkgIElORk8tPmN1cnJlbnRfaWgtPmloX3ZlcnNpb24pOworI2VuZGlmIC8qIFJFSVNFUkRFQlVHICovCisJICAKKwkgIGlmIChJTkZPLT5jdXJyZW50X2loLT5paF9rZXkua19vYmplY3RpZCAhPSBvYmplY3RpZCkKKwkgICAgYnJlYWs7CisJICAKKwkgIG5hbWVfZW5kID0gSU5GTy0+Y3VycmVudF9pdGVtICsgSU5GTy0+Y3VycmVudF9paC0+aWhfaXRlbV9sZW47CisJICBkZV9oZWFkID0gKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopIElORk8tPmN1cnJlbnRfaXRlbTsKKwkgIG51bV9lbnRyaWVzID0gSU5GTy0+Y3VycmVudF9paC0+dS5paF9lbnRyeV9jb3VudDsKKwkgIHdoaWxlIChudW1fZW50cmllcyA+IDApCisJICAgIHsKKwkgICAgICBjaGFyICpmaWxlbmFtZSA9IElORk8tPmN1cnJlbnRfaXRlbSArIGRlX2hlYWQtPmRlaF9sb2NhdGlvbjsKKwkgICAgICBjaGFyICB0bXAgPSAqbmFtZV9lbmQ7CisJICAgICAgaWYgKChkZV9oZWFkLT5kZWhfc3RhdGUgJiBERUhfVmlzaWJsZSkpCisJCXsKKwkJICBpbnQgY21wOworCQkgIC8qIERpcmVjdG9yeSBuYW1lcyBpbiBSZWlzZXJGUyBhcmUgbm90IG51bGwKKwkJICAgKiB0ZXJtaW5hdGVkLiAgV2Ugd3JpdGUgYSB0ZW1wb3JhcnkgMCBiZWhpbmQgaXQuCisJCSAgICogTk9URTogdGhhdCB0aGlzIG1heSBvdmVyd3JpdGUgdGhlIGZpcnN0IGJsb2NrIGluCisJCSAgICogdGhlIHRyZWUgY2FjaGUuICBUaGF0IGRvZXNuJ3QgaHVydCBhcyBsb25nIGFzIHdlCisJCSAgICogZG9uJ3QgY2FsbCBuZXh0X2tleSAoKSBpbiBiZXR3ZWVuLiAgCisJCSAgICovCisJCSAgKm5hbWVfZW5kID0gMDsKKwkJICBjbXAgPSBzdWJzdHJpbmcgKGRpcm5hbWUsIGZpbGVuYW1lKTsKKwkJICAqbmFtZV9lbmQgPSB0bXA7CisjIGlmbmRlZiBTVEFHRTFfNQorCQkgIGlmIChkb19wb3NzaWJpbGl0aWVzKQorCQkgICAgeworCQkgICAgICBpZiAoY21wIDw9IDApCisJCQl7CisJCQkgIGlmIChwcmludF9wb3NzaWJpbGl0aWVzID4gMCkKKwkJCSAgICBwcmludF9wb3NzaWJpbGl0aWVzID0gLXByaW50X3Bvc3NpYmlsaXRpZXM7CisJCQkgICpuYW1lX2VuZCA9IDA7CisJCQkgIHByaW50X2FfY29tcGxldGlvbiAoZmlsZW5hbWUpOworCQkJICAqbmFtZV9lbmQgPSB0bXA7CisJCQl9CisJCSAgICB9CisJCSAgZWxzZQorIyBlbmRpZiAvKiAhIFNUQUdFMV81ICovCisJCSAgICBpZiAoY21wID09IDApCisJCSAgICAgIGdvdG8gZm91bmQ7CisJCX0KKwkgICAgICAvKiBUaGUgYmVnaW5uaW5nIG9mIHRoaXMgbmFtZSBtYXJrcyB0aGUgZW5kIG9mIHRoZSBuZXh0IG5hbWUuCisJICAgICAgICovCisJICAgICAgbmFtZV9lbmQgPSBmaWxlbmFtZTsKKwkgICAgICBkZV9oZWFkKys7CisJICAgICAgbnVtX2VudHJpZXMtLTsKKwkgICAgfQorCX0KKyAgICAgIAorIyBpZm5kZWYgU1RBR0UxXzUKKyAgICAgIGlmIChwcmludF9wb3NzaWJpbGl0aWVzIDwgMCkKKwlyZXR1cm4gMTsKKyMgZW5kaWYgLyogISBTVEFHRTFfNSAqLworICAgICAgCisgICAgICBlcnJudW0gPSBFUlJfRklMRV9OT1RfRk9VTkQ7CisgICAgICAqcmVzdCA9IGNoOworICAgICAgcmV0dXJuIDA7CisgICAgICAKKyAgICBmb3VuZDoKKyAgICAgIAorICAgICAgKnJlc3QgPSBjaDsKKyAgICAgIGRpcm5hbWUgPSByZXN0OworCisgICAgICBwYXJlbnRfZGlyX2lkID0gZGlyX2lkOworICAgICAgcGFyZW50X29iamVjdGlkID0gb2JqZWN0aWQ7CisgICAgICBkaXJfaWQgPSBkZV9oZWFkLT5kZWhfZGlyX2lkOworICAgICAgb2JqZWN0aWQgPSBkZV9oZWFkLT5kZWhfb2JqZWN0aWQ7CisgICAgfQorfQorCitpbnQKK3JlaXNlcmZzX2VtYmVkIChpbnQgKnN0YXJ0X3NlY3RvciwgaW50IG5lZWRlZF9zZWN0b3JzKQoreworICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgc3VwZXI7CisgIGludCBudW1fc2VjdG9yczsKKyAgCisgIGlmICghIGRldnJlYWQgKFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTID4+IFNFQ1RPUl9CSVRTLCAwLCAKKwkJIHNpemVvZiAoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrKSwgKGNoYXIgKikgJnN1cGVyKSkKKyAgICByZXR1cm4gMDsKKyAgCisgICpzdGFydF9zZWN0b3IgPSAxOyAvKiByZXNlcnZlIGZpcnN0IHNlY3RvciBmb3Igc3RhZ2UxICovCisgIGlmICgoc3Vic3RyaW5nIChSRUlTRVJGU19TVVBFUl9NQUdJQ19TVFJJTkcsIHN1cGVyLnNfbWFnaWMpIDw9IDAKKyAgICAgICB8fCBzdWJzdHJpbmcgKFJFSVNFUjJGU19TVVBFUl9NQUdJQ19TVFJJTkcsIHN1cGVyLnNfbWFnaWMpIDw9IDAKKyAgICAgICB8fCBzdWJzdHJpbmcgKFJFSVNFUjNGU19TVVBFUl9NQUdJQ19TVFJJTkcsIHN1cGVyLnNfbWFnaWMpIDw9IDApCisgICAgICAmJiAoLyogY2hlY2sgdGhhdCB0aGlzIGlzIG5vdCBhIHN1cGVyIGJsb2NrIGNvcHkgaW5zaWRlCisJICAgKiB0aGUgam91cm5hbCBsb2cgKi8KKwkgIHN1cGVyLnNfam91cm5hbF9ibG9jayAqIHN1cGVyLnNfYmxvY2tzaXplIAorCSAgPiBSRUlTRVJGU19ESVNLX09GRlNFVF9JTl9CWVRFUykpCisgICAgbnVtX3NlY3RvcnMgPSAoUkVJU0VSRlNfRElTS19PRkZTRVRfSU5fQllURVMgPj4gU0VDVE9SX0JJVFMpIC0gMTsKKyAgZWxzZQorICAgIG51bV9zZWN0b3JzID0gKFJFSVNFUkZTX09MRF9ESVNLX09GRlNFVF9JTl9CWVRFUyA+PiBTRUNUT1JfQklUUykgLSAxOworICAKKyAgcmV0dXJuIChuZWVkZWRfc2VjdG9ycyA8PSBudW1fc2VjdG9ycyk7Cit9CisjZW5kaWYgLyogRlNZU19SRUlTRVJGUyAqLwpkaWZmIC0tZ2l0IGEvc3RhZ2UyL2ZzeXNfdWZzMi5jIGIvc3RhZ2UyL2ZzeXNfdWZzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OGFjYTQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFnZTIvZnN5c191ZnMyLmMKQEAgLTAsMCArMSwzMzEgQEAKKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKiAgQ29weXJpZ2h0IChjKSAyMDA0ICBWYWxlcnkgSHJvbW92CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKgorICogRWxlbWVudHMgb2YgdGhpcyBmaWxlIHdlcmUgb3JpZ2luYWxseSBmcm9tIHRoZSBGcmVlQlNEICJiaW9zYm9vdCIKKyAqIGJvb3Rsb2FkZXIgZmlsZSAiZGlzay5jIiBkYXRlZCA0LzEyLzk1LgorICoKKyAqIFRoZSBsaWNlbnNlIGFuZCBoZWFkZXIgY29tbWVudHMgZnJvbSB0aGF0IGZpbGUgYXJlIGluY2x1ZGVkIGhlcmUuCisgKi8KKworLyoKKyAqIE1hY2ggT3BlcmF0aW5nIFN5c3RlbQorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkxIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IGJvdGggdGhlIGNvcHlyaWdodAorICogbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIG9mIHRoZQorICogc29mdHdhcmUsIGRlcml2YXRpdmUgd29ya3Mgb3IgbW9kaWZpZWQgdmVyc2lvbnMsIGFuZCBhbnkgcG9ydGlvbnMKKyAqIHRoZXJlb2YsIGFuZCB0aGF0IGJvdGggbm90aWNlcyBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLgorICoKKyAqIENBUk5FR0lFIE1FTExPTiBBTExPV1MgRlJFRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSBJTiBJVFMgIkFTIElTIgorICogQ09ORElUSU9OLiAgQ0FSTkVHSUUgTUVMTE9OIERJU0NMQUlNUyBBTlkgTElBQklMSVRZIE9GIEFOWSBLSU5EIEZPUgorICogQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICogQ2FybmVnaWUgTWVsbG9uIHJlcXVlc3RzIHVzZXJzIG9mIHRoaXMgc29mdHdhcmUgdG8gcmV0dXJuIHRvCisgKgorICogIFNvZnR3YXJlIERpc3RyaWJ1dGlvbiBDb29yZGluYXRvciAgb3IgIFNvZnR3YXJlLkRpc3RyaWJ1dGlvbkBDUy5DTVUuRURVCisgKiAgU2Nob29sIG9mIENvbXB1dGVyIFNjaWVuY2UKKyAqICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQorICogIFBpdHRzYnVyZ2ggUEEgMTUyMTMtMzg5MAorICoKKyAqIGFueSBpbXByb3ZlbWVudHMgb3IgZXh0ZW5zaW9ucyB0aGF0IHRoZXkgbWFrZSBhbmQgZ3JhbnQgQ2FybmVnaWUgTWVsbG9uCisgKiB0aGUgcmlnaHRzIHRvIHJlZGlzdHJpYnV0ZSB0aGVzZSBjaGFuZ2VzLgorICoKKyAqCWZyb206IE1hY2gsIFJldmlzaW9uIDIuMiAgOTIvMDQvMDQgIDExOjM1OjQ5ICBycGQKKyAqCSRJZDogZnN5c191ZnMyLmMsdiAxLjIgMjAwNC8wNi8xOSAxMjoxNzo1MiBva3VqaSBFeHAgJAorICovCisKKyNpZmRlZiBGU1lTX1VGUzIKKworI2luY2x1ZGUgInNoYXJlZC5oIgorI2luY2x1ZGUgImZpbGVzeXMuaCIKKworI2luY2x1ZGUgInVmczIuaCIKKworLyogdXNlZCBmb3IgZmlsZXN5c3RlbSBtYXAgYmxvY2tzICovCitzdGF0aWMgaW50IG1hcGJsb2NrOworc3RhdGljIGludCBtYXBibG9ja19vZmZzZXQ7CitzdGF0aWMgaW50IG1hcGJsb2NrX2JzaXplOworCitzdGF0aWMgaW50IHNibG9ja190cnlbXSA9IFNCTE9DS1NFQVJDSDsKK3N0YXRpYyB1ZnMyX2RhZGRyX3Qgc2Jsb2NrbG9jOworc3RhdGljIGludCB0eXBlOworCisvKiBwb2ludGVyIHRvIHN1cGVyYmxvY2sgKi8KKyNkZWZpbmUgU1VQRVJCTE9DSyAoKHN0cnVjdCBmcyAqKSAoIEZTWVNfQlVGICsgODE5MiApKQorCisjZGVmaW5lIElOT0RFX1VGUzIgKChzdHJ1Y3QgdWZzMl9kaW5vZGUgKikgKCBGU1lTX0JVRiArIDE2Mzg0ICkpCisKKyNkZWZpbmUgTUFQQlVGICggRlNZU19CVUYgKyAyNDU3NiApCisjZGVmaW5lIE1BUEJVRl9MRU4gODE5MgorCitpbnQKK3VmczJfbW91bnQgKHZvaWQpCit7CisgIGludCByZXR2YWwgPSAwOworICBpbnQgaTsKKworICBzYmxvY2tsb2MgPSAtMTsKKyAgdHlwZSA9IDA7CisgIAorICBpZiAoISAoKChjdXJyZW50X2RyaXZlICYgMHg4MCkgfHwgKGN1cnJlbnRfc2xpY2UgIT0gMCkpCisJICYmICEgSVNfUENfU0xJQ0VfVFlQRV9CU0RfV0lUSF9GUyAoY3VycmVudF9zbGljZSwgRlNfQlNERkZTKSkpCisgICAgeworICAgICAgZm9yIChpID0gMDsgc2Jsb2NrX3RyeVtpXSAhPSAtMTsgKytpKQorCXsKKwkgIGlmICghIChwYXJ0X2xlbmd0aCA8IChzYmxvY2tfdHJ5W2ldICsgKFNCTE9DS1NJWkUgLyBERVZfQlNJWkUpKQorCQkgfHwgISBkZXZyZWFkICgwLCBzYmxvY2tfdHJ5W2ldLCBTQkxPQ0tTSVpFLCAoY2hhciAqKSBTVVBFUkJMT0NLKSkpCisJICAgIHsKKwkgICAgICBpZiAoU1VQRVJCTE9DSy0+ZnNfbWFnaWMgPT0gRlNfVUZTMl9NQUdJQyAvKiAmJgorCQkJCQkJCSAgIChTVVBFUkJMT0NLLT5mc19zYmxvY2tsb2MgPT0gc2Jsb2NrbG9jIHx8CisJCQkJCQkgICAgIChTVVBFUkJMT0NLLT5mc19vbGRfZmxhZ3MgJiBGU19GTEFHU19VUERBVEVEKSA9PSAwKSovKQorCQl7CisJCSAgdHlwZSA9IDI7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIAorCSAgICAgIHJldHZhbCA9IDE7CisJICAgICAgc2Jsb2NrbG9jID0gc2Jsb2NrX3RyeVtpXTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisgIAorICBtYXBibG9jayA9IC0xOworICBtYXBibG9ja19vZmZzZXQgPSAtMTsKKyAgCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBncnViX2ludDY0X3QKK2Jsb2NrX21hcCAoaW50IGZpbGVfYmxvY2spCit7CisgIGludCBibnVtLCBvZmZzZXQsIGJzaXplOworICAKKyAgaWYgKGZpbGVfYmxvY2sgPCBOREFERFIpCisgICAgcmV0dXJuIChJTk9ERV9VRlMyLT5kaV9kYltmaWxlX2Jsb2NrXSk7CisgIAorICAvKiBJZiB0aGUgYmxvY2ttYXAgbG9hZGVkIGRvZXMgbm90IGluY2x1ZGUgRklMRV9CTE9DSywKKyAgICAgbG9hZCBhIG5ldyBibG9ja21hcC4gICovCisKKyAgaWYgKChibnVtID0gZnNidG9kYiAoU1VQRVJCTE9DSywgSU5PREVfVUZTMi0+ZGlfaWJbMF0pKSAhPSBtYXBibG9jaworICAgICAgfHwgKG1hcGJsb2NrX29mZnNldCA8PSBibnVtICYmIGJudW0gPD0gbWFwYmxvY2tfb2Zmc2V0ICsgbWFwYmxvY2tfYnNpemUpKQorICAgIHsKKyAgICAgIGlmIChNQVBCVUZfTEVOIDwgU1VQRVJCTE9DSy0+ZnNfYnNpemUpCisJeworCSAgb2Zmc2V0ID0gKChmaWxlX2Jsb2NrIC0gTkRBRERSKSAlIE5JTkRJUiAoU1VQRVJCTE9DSykpOworCSAgYnNpemUgPSBNQVBCVUZfTEVOOworCSAgCisJICBpZiAob2Zmc2V0ICsgTUFQQlVGX0xFTiA+IFNVUEVSQkxPQ0stPmZzX2JzaXplKQorCSAgICBvZmZzZXQgPSAoU1VQRVJCTE9DSy0+ZnNfYnNpemUgLSBNQVBCVUZfTEVOKSAvIHNpemVvZiAoaW50KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgYnNpemUgPSBTVVBFUkJMT0NLLT5mc19ic2l6ZTsKKwkgIG9mZnNldCA9IDA7CisJfQorICAgICAgCisgICAgICBpZiAoISBkZXZyZWFkIChibnVtLCBvZmZzZXQgKiBzaXplb2YgKGludCksIGJzaXplLCAoY2hhciAqKSBNQVBCVUYpKQorCXsKKwkgIG1hcGJsb2NrID0gLTE7CisJICBtYXBibG9ja19ic2l6ZSA9IC0xOworCSAgbWFwYmxvY2tfb2Zmc2V0ID0gLTE7CisJICBlcnJudW0gPSBFUlJfRlNZU19DT1JSVVBUOworCSAgcmV0dXJuIC0xOworCX0KKyAgICAgIAorICAgICAgbWFwYmxvY2sgPSBibnVtOworICAgICAgbWFwYmxvY2tfYnNpemUgPSBic2l6ZTsKKyAgICAgIG1hcGJsb2NrX29mZnNldCA9IG9mZnNldDsKKyAgICB9CisgIAorICByZXR1cm4gKCgoZ3J1Yl9pbnQ2NF90ICopIE1BUEJVRilbKChmaWxlX2Jsb2NrIC0gTkRBRERSKSAlIE5JTkRJUiAoU1VQRVJCTE9DSykpCisJCQkJICAgIC0gbWFwYmxvY2tfb2Zmc2V0XSk7Cit9CisKK2ludAordWZzMl9yZWFkIChjaGFyICpidWYsIGludCBsZW4pCit7CisgIGludCBsb2dubywgb2ZmLCBzaXplLCByZXQgPSAwOworICBncnViX2ludDY0X3QgbWFwOworCisgIHdoaWxlIChsZW4gJiYgIWVycm51bSkKKyAgICB7CisgICAgICBvZmYgPSBibGtvZmYgKFNVUEVSQkxPQ0ssIGZpbGVwb3MpOworICAgICAgbG9nbm8gPSBsYmxrbm8gKFNVUEVSQkxPQ0ssIGZpbGVwb3MpOworICAgICAgc2l6ZSA9IGJsa3NpemUgKFNVUEVSQkxPQ0ssIElOT0RFX1VGUzIsIGxvZ25vKTsKKworICAgICAgaWYgKChtYXAgPSBibG9ja19tYXAgKGxvZ25vKSkgPCAwKQorCWJyZWFrOyAKKworICAgICAgc2l6ZSAtPSBvZmY7CisKKyAgICAgIGlmIChzaXplID4gbGVuKQorCXNpemUgPSBsZW47CisKKyAgICAgIGRpc2tfcmVhZF9mdW5jID0gZGlza19yZWFkX2hvb2s7CisKKyAgICAgIGRldnJlYWQgKGZzYnRvZGIgKFNVUEVSQkxPQ0ssIG1hcCksIG9mZiwgc2l6ZSwgYnVmKTsKKworICAgICAgZGlza19yZWFkX2Z1bmMgPSBOVUxMOworCisgICAgICBidWYgKz0gc2l6ZTsKKyAgICAgIGxlbiAtPSBzaXplOworICAgICAgZmlsZXBvcyArPSBzaXplOworICAgICAgcmV0ICs9IHNpemU7CisgICAgfQorCisgIGlmIChlcnJudW0pCisgICAgcmV0ID0gMDsKKworICByZXR1cm4gcmV0OworfQorCitpbnQKK3VmczJfZGlyIChjaGFyICpkaXJuYW1lKQoreworICBjaGFyICpyZXN0LCBjaDsKKyAgaW50IGJsb2NrLCBvZmYsIGxvYywgaW5vID0gUk9PVElOTzsKKyAgZ3J1Yl9pbnQ2NF90IG1hcDsKKyAgc3RydWN0IGRpcmVjdCAqZHA7CisKKy8qIG1haW4gbG9vcCB0byBmaW5kIGRlc3RpbmF0aW9uIGlub2RlICovCitsb29wOgorCisgIC8qIGxvYWQgY3VycmVudCBpbm9kZSAoZGVmYXVsdHMgdG8gdGhlIHJvb3QgaW5vZGUpICovCisKKyAgICBpZiAoIWRldnJlYWQgKGZzYnRvZGIgKFNVUEVSQkxPQ0ssIGlub190b19mc2JhIChTVVBFUkJMT0NLLCBpbm8pKSwKKwkgICAgaW5vICUgKFNVUEVSQkxPQ0stPmZzX2lub3BiKSAqIHNpemVvZiAoc3RydWN0IHVmczJfZGlub2RlKSwKKwkgICAgc2l6ZW9mIChzdHJ1Y3QgdWZzMl9kaW5vZGUpLCAoY2hhciAqKSBJTk9ERV9VRlMyKSkKKwkJICAgIHJldHVybiAwOwkJCS8qIFhYWCB3aGF0IHJldHVybiB2YWx1ZT8gKi8KKworICAvKiBpZiB3ZSBoYXZlIGEgcmVhbCBmaWxlIChhbmQgd2UncmUgbm90IGp1c3QgcHJpbnRpbmcgcG9zc2liaWxpdGllcyksCisgICAgIHRoZW4gdGhpcyBpcyB3aGVyZSB3ZSB3YW50IHRvIGV4aXQgKi8KKworICBpZiAoISpkaXJuYW1lIHx8IGlzc3BhY2UgKCpkaXJuYW1lKSkKKyAgICB7CisgICAgICBpZiAoKElOT0RFX1VGUzItPmRpX21vZGUgJiBJRk1UKSAhPSBJRlJFRykKKwl7CisJICBlcnJudW0gPSBFUlJfQkFEX0ZJTEVUWVBFOworCSAgcmV0dXJuIDA7CisJfQorCisgICAgICBmaWxlbWF4ID0gSU5PREVfVUZTMi0+ZGlfc2l6ZTsKKworICAgICAgLyogaW5jb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aGlzISAqLworICAgICAgZnNtYXggPSAoTkRBRERSICsgTklORElSIChTVVBFUkJMT0NLKSkgKiBTVVBFUkJMT0NLLT5mc19ic2l6ZTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBjb250aW51ZSB3aXRoIGZpbGUvZGlyZWN0b3J5IG5hbWUgaW50ZXJwcmV0YXRpb24gKi8KKworICB3aGlsZSAoKmRpcm5hbWUgPT0gJy8nKQorICAgIGRpcm5hbWUrKzsKKworICBpZiAoIShJTk9ERV9VRlMyLT5kaV9zaXplKSB8fCAoKElOT0RFX1VGUzItPmRpX21vZGUgJiBJRk1UKSAhPSBJRkRJUikpCisgICAgeworICAgICAgZXJybnVtID0gRVJSX0JBRF9GSUxFVFlQRTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBmb3IgKHJlc3QgPSBkaXJuYW1lOyAoY2ggPSAqcmVzdCkgJiYgIWlzc3BhY2UgKGNoKSAmJiBjaCAhPSAnLyc7IHJlc3QrKyk7CisKKyAgKnJlc3QgPSAwOworICBsb2MgPSAwOworCisgIC8qIGxvb3AgZm9yIHJlYWRpbmcgYSB0aGUgZW50cmllcyBpbiBhIGRpcmVjdG9yeSAqLworCisgIGRvCisgICAgeworICAgICAgaWYgKGxvYyA+PSBJTk9ERV9VRlMyLT5kaV9zaXplKQorCXsKKwkgIGlmIChwcmludF9wb3NzaWJpbGl0aWVzIDwgMCkKKwkgICAgcmV0dXJuIDE7CisKKwkgIGVycm51bSA9IEVSUl9GSUxFX05PVF9GT1VORDsKKwkgICpyZXN0ID0gY2g7CisJICByZXR1cm4gMDsKKwl9CisKKyAgICAgIGlmICghKG9mZiA9IGJsa29mZiAoU1VQRVJCTE9DSywgbG9jKSkpCisJeworCSAgYmxvY2sgPSBsYmxrbm8gKFNVUEVSQkxPQ0ssIGxvYyk7CisKKwkgIGlmICgobWFwID0gYmxvY2tfbWFwIChibG9jaykpIDwgMAorCSAgICAgIHx8ICFkZXZyZWFkIChmc2J0b2RiIChTVVBFUkJMT0NLLCBtYXApLCAwLAorCQkJICAgYmxrc2l6ZSAoU1VQRVJCTE9DSywgSU5PREVfVUZTMiwgYmxvY2spLAorCQkJICAgKGNoYXIgKikgRlNZU19CVUYpKQorCSAgICB7CisJICAgICAgZXJybnVtID0gRVJSX0ZTWVNfQ09SUlVQVDsKKwkgICAgICAqcmVzdCA9IGNoOworCSAgICAgIHJldHVybiAwOworCSAgICB9CisJfQorCisgICAgICBkcCA9IChzdHJ1Y3QgZGlyZWN0ICopIChGU1lTX0JVRiArIG9mZik7CisgICAgICBsb2MgKz0gZHAtPmRfcmVjbGVuOworCisjaWZuZGVmIFNUQUdFMV81CisgICAgICBpZiAoZHAtPmRfaW5vICYmIHByaW50X3Bvc3NpYmlsaXRpZXMgJiYgY2ggIT0gJy8nCisJICAmJiAoISpkaXJuYW1lIHx8IHN1YnN0cmluZyAoZGlybmFtZSwgZHAtPmRfbmFtZSkgPD0gMCkpCisJeworCSAgaWYgKHByaW50X3Bvc3NpYmlsaXRpZXMgPiAwKQorCSAgICBwcmludF9wb3NzaWJpbGl0aWVzID0gLXByaW50X3Bvc3NpYmlsaXRpZXM7CisKKwkgIHByaW50X2FfY29tcGxldGlvbiAoZHAtPmRfbmFtZSk7CisJfQorI2VuZGlmIC8qIFNUQUdFMV81ICovCisgICAgfQorICB3aGlsZSAoIWRwLT5kX2lubyB8fCAoc3Vic3RyaW5nIChkaXJuYW1lLCBkcC0+ZF9uYW1lKSAhPSAwCisJCQl8fCAocHJpbnRfcG9zc2liaWxpdGllcyAmJiBjaCAhPSAnLycpKSk7CisKKyAgLyogb25seSBnZXQgaGVyZSBpZiB3ZSBoYXZlIGEgbWF0Y2hpbmcgZGlyZWN0b3J5IGVudHJ5ICovCisKKyAgaW5vID0gZHAtPmRfaW5vOworICAqKGRpcm5hbWUgPSByZXN0KSA9IGNoOworCisgIC8qIGdvIGJhY2sgdG8gbWFpbiBsb29wIGF0IHRvcCBvZiBmdW5jdGlvbiAqLworICBnb3RvIGxvb3A7Cit9CisKK2ludAordWZzMl9lbWJlZCAoaW50ICpzdGFydF9zZWN0b3IsIGludCBuZWVkZWRfc2VjdG9ycykKK3sKKyAgLyogWFhYOiBJIGRvbid0IGtub3cgaWYgdGhpcyBpcyByZWFsbHkgY29ycmVjdC4gU29tZW9uZSB3aG8gaXMKKyAgICAgZmFtaWxpYXIgd2l0aCBCU0Qgc2hvdWxkIGNoZWNrIGZvciB0aGlzLiAgKi8KKyAgaWYgKG5lZWRlZF9zZWN0b3JzID4gMTQpCisgICAgcmV0dXJuIDA7CisgIAorICAqc3RhcnRfc2VjdG9yID0gMTsKKyNpZiAxCisgIC8qIEZJWE1FOiBEaXNhYmxlIHRoZSBlbWJlZGRpbmcgaW4gRkZTIHVudGlsIHNvbWVvbmUgY2hlY2tzIGlmCisgICAgIHRoZSBjb2RlIGFib3ZlIGlzIGNvcnJlY3QuICAqLworICByZXR1cm4gMDsKKyNlbHNlCisgIHJldHVybiAxOworI2VuZGlmCit9CisKKyNlbmRpZiAvKiBGU1lTX1VGUzIgKi8KZGlmZiAtLWdpdCBhL3N0YWdlMi9mc3lzX3ZzdGFmcy5jIGIvc3RhZ2UyL2ZzeXNfdnN0YWZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTExNjcxNwotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMi9mc3lzX3ZzdGFmcy5jCkBAIC0wLDAgKzEsMjUyIEBACisvKgorICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZmRlZiBGU1lTX1ZTVEFGUworCisjaW5jbHVkZSAic2hhcmVkLmgiCisjaW5jbHVkZSAiZmlsZXN5cy5oIgorI2luY2x1ZGUgInZzdGFmcy5oIgorCisKK3N0YXRpYyB2b2lkIGdldF9maWxlX2luZm8gKGludCBzZWN0b3IpOworc3RhdGljIHN0cnVjdCBkaXJfZW50cnkgKnZzdGFmc19yZWFkZGlyIChsb25nIHNlY3Rvcik7CitzdGF0aWMgc3RydWN0IGRpcl9lbnRyeSAqdnN0YWZzX25leHRkaXIgKHZvaWQpOworCisKKyNkZWZpbmUgRklSU1RfU0VDVE9SCSgoc3RydWN0IGZpcnN0X3NlY3RvciAqKSBGU1lTX0JVRikKKyNkZWZpbmUgRklMRV9JTkZPCSgoc3RydWN0IGZzX2ZpbGUgKikgKGludCkgRklSU1RfU0VDVE9SICsgODE5MikKKyNkZWZpbmUgRElSRUNUT1JZX0JVRgkoKHN0cnVjdCBkaXJfZW50cnkgKikgKGludCkgRklMRV9JTkZPICsgNTEyKQorCisjZGVmaW5lIFJPT1RfU0VDVE9SCTEKKworLyoKKyAqIEluIGZfc2VjdG9yIHdlIHN0b3JlIHRoZSBzZWN0b3IgbnVtYmVyIGluIHdoaWNoIHRoZSBpbmZvcm1hdGlvbiBhYm91dAorICogdGhlIGZvdW5kIGZpbGUgaXMuCisgKi8KK2V4dGVybiBpbnQgZmlsZXBvczsKK3N0YXRpYyBpbnQgZl9zZWN0b3I7CisKK2ludCAKK3ZzdGFmc19tb3VudCAodm9pZCkKK3sKKyAgaW50IHJldHZhbCA9IDE7CisgIAorICBpZiggKCgoY3VycmVudF9kcml2ZSAmIDB4ODApIHx8IChjdXJyZW50X3NsaWNlICE9IDApKQorICAgICAgICYmIGN1cnJlbnRfc2xpY2UgIT0gUENfU0xJQ0VfVFlQRV9WU1RBRlMpCisgICAgICB8fCAgISBkZXZyZWFkICgwLCAwLCBCTE9DS19TSVpFLCAoY2hhciAqKSBGU1lTX0JVRikKKyAgICAgIHx8ICBGSVJTVF9TRUNUT1ItPmZzX21hZ2ljICE9IDB4REVBREZBQ0UpCisgICAgcmV0dmFsID0gMDsKKyAgCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIAorZ2V0X2ZpbGVfaW5mbyAoaW50IHNlY3RvcikKK3sKKyAgZGV2cmVhZCAoc2VjdG9yLCAwLCBCTE9DS19TSVpFLCAoY2hhciAqKSBGSUxFX0lORk8pOworfQorCitzdGF0aWMgaW50IGN1cnJfZXh0LCBjdXJyZW50X2RpcmVudHJ5LCBjdXJyZW50X2Jsb2NrcG9zOworc3RhdGljIHN0cnVjdCBhbGxvYyAqYTsKKworc3RhdGljIHN0cnVjdCBkaXJfZW50cnkgKgordnN0YWZzX3JlYWRkaXIgKGxvbmcgc2VjdG9yKQoreworICAvKgorICAgKiBHZXQgc29tZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeQorICAgKi8KKyAgZ2V0X2ZpbGVfaW5mbyAoc2VjdG9yKTsKKyAgaWYgKEZJTEVfSU5GTy0+dHlwZSAhPSAyKQorICAgIHsKKyAgICAgIGVycm51bSA9IEVSUl9GSUxFX05PVF9GT1VORDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgCisgIGEgPSBGSUxFX0lORk8tPmJsb2NrczsKKyAgY3Vycl9leHQgPSAwOworICBkZXZyZWFkIChhW2N1cnJfZXh0XS5hX3N0YXJ0LCAwLCA1MTIsIChjaGFyICopIERJUkVDVE9SWV9CVUYpOworICBjdXJyZW50X2RpcmVudHJ5ID0gMTE7CisgIGN1cnJlbnRfYmxvY2twb3MgPSAwOworICAKKyAgcmV0dXJuICZESVJFQ1RPUllfQlVGWzEwXTsKK30KKworc3RhdGljIHN0cnVjdCBkaXJfZW50cnkgKgordnN0YWZzX25leHRkaXIgKHZvaWQpCit7CisgIGlmIChjdXJyZW50X2RpcmVudHJ5ID4gMTUpCisgICAgeworICAgICAgY3VycmVudF9kaXJlbnRyeSA9IDA7CisgICAgICBpZiAoKytjdXJyZW50X2Jsb2NrcG9zID4gKGFbY3Vycl9leHRdLmFfbGVuIC0gMSkpCisJeworCSAgY3VycmVudF9ibG9ja3BvcyA9IDA7CisJICBjdXJyX2V4dCsrOworCX0KKyAgICAgIAorICAgICAgaWYgKGN1cnJfZXh0IDwgRklMRV9JTkZPLT5leHRlbnRzKQorCXsKKwkgIGRldnJlYWQgKGFbY3Vycl9leHRdLmFfc3RhcnQgKyBjdXJyZW50X2Jsb2NrcG9zLCAwLAorCQkgICA1MTIsIChjaGFyICopIERJUkVDVE9SWV9CVUYpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBlcnJudW0gPUVSUl9GSUxFX05PVF9GT1VORDsgKi8KKwkgIHJldHVybiAwOworCX0KKyAgICB9CisgIAorICByZXR1cm4gJkRJUkVDVE9SWV9CVUZbY3VycmVudF9kaXJlbnRyeSsrXTsKK30KKworaW50IAordnN0YWZzX2RpciAoY2hhciAqZGlybmFtZSkKK3sKKyAgY2hhciAqZm4sIGNoOworICBzdHJ1Y3QgZGlyX2VudHJ5ICpkOworICAvKiBpbnQgbCwgaSwgczsgKi8KKyAgCisgIC8qCisgICAqIFJlYWQgaW4gdGhlIGVudHJpZXMgb2YgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorICAgKi8KKyAgZl9zZWN0b3IgPSBST09UX1NFQ1RPUjsKKyAgZG8KKyAgICB7CisgICAgICBpZiAoISAoZCA9IHZzdGFmc19yZWFkZGlyIChmX3NlY3RvcikpKQorCXsKKwkgIHJldHVybiAwOworCX0KKyAgICAgIAorICAgICAgLyoKKyAgICAgICAqIEZpbmQgdGhlIGZpbGUgaW4gdGhlIHBhdGgKKyAgICAgICAqLworICAgICAgd2hpbGUgKCpkaXJuYW1lID09ICcvJykgZGlybmFtZSsrOworICAgICAgZm4gPSBkaXJuYW1lOworICAgICAgd2hpbGUgKChjaCA9ICpmbikgJiYgY2ggIT0gJy8nICYmICEgaXNzcGFjZSAoY2gpKSBmbisrOworICAgICAgKmZuID0gMDsKKyAgICAgIAorICAgICAgZG8KKwl7CisJICBpZiAoZC0+bmFtZVswXSA9PSAwIHx8IGQtPm5hbWVbMF0gJiAweDgwKQorCSAgICBjb250aW51ZTsKKwkgIAorI2lmbmRlZiBTVEFHRTFfNQorCSAgaWYgKHByaW50X3Bvc3NpYmlsaXRpZXMgJiYgY2ggIT0gJy8nCisJICAgICAgJiYgKCEgKmRpcm5hbWUgfHwgc3RyY21wIChkaXJuYW1lLCBkLT5uYW1lKSA8PSAwKSkKKwkgICAgeworCSAgICAgIGlmIChwcmludF9wb3NzaWJpbGl0aWVzID4gMCkKKwkJcHJpbnRfcG9zc2liaWxpdGllcyA9IC1wcmludF9wb3NzaWJpbGl0aWVzOworCSAgICAgIAorCSAgICAgIHByaW50ZiAoIiAgJXMiLCBkLT5uYW1lKTsKKwkgICAgfQorI2VuZGlmCisJICBpZiAoISBncnViX3N0cmNtcCAoZGlybmFtZSwgZC0+bmFtZSkpCisJICAgIHsKKwkgICAgICBmX3NlY3RvciA9IGQtPnN0YXJ0OworCSAgICAgIGdldF9maWxlX2luZm8gKGZfc2VjdG9yKTsKKwkgICAgICBmaWxlbWF4ID0gRklMRV9JTkZPLT5sZW47IAorCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgICAgd2hpbGUgKChkID12c3RhZnNfbmV4dGRpciAoKSkpOworICAgICAgCisgICAgICAqKGRpcm5hbWUgPSBmbikgPSBjaDsKKyAgICAgIGlmICghIGQpCisJeworCSAgaWYgKHByaW50X3Bvc3NpYmlsaXRpZXMgPCAwKQorCSAgICB7CisJICAgICAgcHV0Y2hhciAoJ1xuJyk7CisJICAgICAgcmV0dXJuIDE7CisJICAgIH0KKwkgIAorCSAgZXJybnVtID0gRVJSX0ZJTEVfTk9UX0ZPVU5EOworCSAgcmV0dXJuIDA7CisJfQorICAgIH0KKyAgd2hpbGUgKCpkaXJuYW1lICYmICEgaXNzcGFjZSAoY2gpKTsKKyAgCisgIHJldHVybiAxOworfQorCitpbnQgCit2c3RhZnNfcmVhZCAoY2hhciAqYWRkciwgaW50IGxlbikKK3sKKyAgc3RydWN0IGFsbG9jICphOworICBpbnQgc2l6ZSwgcmV0ID0gMCwgb2Zmc2V0LCBjdXJyX2xlbiA9IDA7CisgIGludCBjdXJyX2V4dDsKKyAgY2hhciBleHRlbnQ7CisgIGludCBleHRfc2l6ZTsKKyAgY2hhciAqY3Vycl9wb3M7CisgIAorICBnZXRfZmlsZV9pbmZvIChmX3NlY3Rvcik7CisgIHNpemUgPSBGSUxFX0lORk8tPmxlbi1WU1RBRlNfU1RBUlRfREFUQTsKKyAgYSA9IEZJTEVfSU5GTy0+YmxvY2tzOworICAKKyAgaWYgKGZpbGVwb3MgPiAwKQorICAgIHsKKyAgICAgIGlmIChmaWxlcG9zIDwgYVswXS5hX2xlbiAqIDUxMiAtIFZTVEFGU19TVEFSVF9EQVRBKQorCXsKKwkgIG9mZnNldCA9IGZpbGVwb3MgKyBWU1RBRlNfU1RBUlRfREFUQTsKKwkgIGV4dGVudCA9IDA7CisJICBjdXJyX2xlbiA9IGFbMF0uYV9sZW4gKiA1MTIgLSBvZmZzZXQgLSBmaWxlcG9zOyAKKwl9CisgICAgICBlbHNlCisJeworCSAgZXh0X3NpemUgPSBhWzBdLmFfbGVuICogNTEyIC0gVlNUQUZTX1NUQVJUX0RBVEE7CisJICBvZmZzZXQgPSBmaWxlcG9zIC0gZXh0X3NpemU7CisJICBleHRlbnQgPSAxOworCSAgZG8KKwkgICAgeworCSAgICAgIGN1cnJfbGVuIC09IGV4dF9zaXplOworCSAgICAgIG9mZnNldCAtPSBleHRfc2l6ZTsKKwkgICAgICBleHRfc2l6ZSA9IGFbZXh0ZW50KzFdLmFfbGVuICogNTEyOworCSAgICB9CisJICB3aGlsZSAoZXh0ZW50IDwgRklMRV9JTkZPLT5leHRlbnRzICYmIG9mZnNldD5leHRfc2l6ZSk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG9mZnNldCA9IFZTVEFGU19TVEFSVF9EQVRBOworICAgICAgZXh0ZW50ID0gMDsKKyAgICAgIGN1cnJfbGVuID0gYVswXS5hX2xlbiAqIDUxMiAtIG9mZnNldDsKKyAgICB9CisgIAorICBjdXJyX3BvcyA9IGFkZHI7CisgIGlmIChjdXJyX2xlbiA+IGxlbikKKyAgICBjdXJyX2xlbiA9IGxlbjsKKyAgCisgIGZvciAoY3Vycl9leHQ9ZXh0ZW50OworICAgICAgIGN1cnJfZXh0IDwgRklMRV9JTkZPLT5leHRlbnRzOyAKKyAgICAgICBjdXJyX2xlbiA9IGFbY3Vycl9leHRdLmFfbGVuICogNTEyLCBjdXJyX3BvcyArPSBjdXJyX2xlbiwgY3Vycl9leHQrKykKKyAgICB7CisgICAgICByZXQgKz0gY3Vycl9sZW47CisgICAgICBzaXplIC09IGN1cnJfbGVuOworICAgICAgaWYgKHNpemUgPCAwKQorCXsKKwkgIHJldCArPSBzaXplOworCSAgY3Vycl9sZW4gKz0gc2l6ZTsKKwl9CisgICAgICAKKyAgICAgIGRldnJlYWQgKGFbY3Vycl9leHRdLmFfc3RhcnQsb2Zmc2V0LCBjdXJyX2xlbiwgY3Vycl9wb3MpOworICAgICAgb2Zmc2V0ID0gMDsKKyAgICB9CisgIAorICByZXR1cm4gcmV0OworfQorCisjZW5kaWYgLyogRlNZU19WU1RBRlMgKi8KZGlmZiAtLWdpdCBhL3N0YWdlMi9mc3lzX3hmcy5jIGIvc3RhZ2UyL2ZzeXNfeGZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZjNGMxMwotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMi9mc3lzX3hmcy5jCkBAIC0wLDAgKzEsNjI0IEBACisvKiBmc3lzX3hmcy5jIC0gYW4gaW1wbGVtZW50YXRpb24gZm9yIHRoZSBTR0kgWEZTIGZpbGUgc3lzdGVtICovCisvKiAgCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMjAwMSwyMDAyLDIwMDQgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmZGVmIEZTWVNfWEZTCisKKyNpbmNsdWRlICJzaGFyZWQuaCIKKyNpbmNsdWRlICJmaWxlc3lzLmgiCisjaW5jbHVkZSAieGZzLmgiCisKKyNkZWZpbmUgTUFYX0xJTktfQ09VTlQJOAorCit0eXBlZGVmIHN0cnVjdCB4YWQgeworCXhmc19maWxlb2ZmX3Qgb2Zmc2V0OworCXhmc19mc2Jsb2NrX3Qgc3RhcnQ7CisJeGZzX2ZpbGJsa3NfdCBsZW47Cit9IHhhZF90OworCitzdHJ1Y3QgeGZzX2luZm8geworCWludCBic2l6ZTsKKwlpbnQgZGlyYnNpemU7CisJaW50IGlzaXplOworCXVuc2lnbmVkIGludCBhZ2Jsb2NrczsKKwlpbnQgYmRsb2c7CisJaW50IGJsa2xvZzsKKwlpbnQgaW5vcGJsb2c7CisJaW50IGFnYmxrbG9nOworCWludCBhZ25vbG9nOworCXVuc2lnbmVkIGludCBuZXh0ZW50czsKKwl4ZnNfZGFkZHJfdCBuZXh0OworCXhmc19kYWRkcl90IGRhZGRyOworCXhmc19kYWJsa190IGZvcnc7CisJeGZzX2RhYmxrX3QgZGFibGs7CisJeGZzX2JtYnRfcmVjXzMyX3QgKnh0OworCXhmc19ibWJ0X3B0cl90IHB0cjA7CisJaW50IGJ0bm9kZV9wdHIwX29mZjsKKwlpbnQgaThwYXJhbTsKKwlpbnQgZGlycG9zOworCWludCBkaXJtYXg7CisJaW50IGJsa29mZjsKKwlpbnQgZnBvczsKKwl4ZnNfaW5vX3Qgcm9vdGlubzsKK307CisKK3N0YXRpYyBzdHJ1Y3QgeGZzX2luZm8geGZzOworCisjZGVmaW5lIGRpcmJ1ZgkJKChjaGFyICopRlNZU19CVUYpCisjZGVmaW5lIGZpbGVidWYJCSgoY2hhciAqKUZTWVNfQlVGICsgNDA5NikKKyNkZWZpbmUgaW5vZGUJCSgoeGZzX2Rpbm9kZV90ICopKChjaGFyICopRlNZU19CVUYgKyA4MTkyKSkKKyNkZWZpbmUgaWNvcmUJCShpbm9kZS0+ZGlfY29yZSkKKworI2RlZmluZQltYXNrMzJsbyhuKQkoKCh4ZnNfdWludDMyX3QpMSA8PCAobikpIC0gMSkKKworI2RlZmluZQlYRlNfSU5PX01BU0soaykJCSgoeGZzX3VpbnQzMl90KSgoMVVMTCA8PCAoaykpIC0gMSkpCisjZGVmaW5lCVhGU19JTk9fT0ZGU0VUX0JJVFMJeGZzLmlub3BibG9nCisjZGVmaW5lCVhGU19JTk9fQUdCTk9fQklUUwl4ZnMuYWdibGtsb2cKKyNkZWZpbmUJWEZTX0lOT19BR0lOT19CSVRTCSh4ZnMuYWdibGtsb2cgKyB4ZnMuaW5vcGJsb2cpCisjZGVmaW5lCVhGU19JTk9fQUdOT19CSVRTCXhmcy5hZ25vbG9nCisKK3N0YXRpYyBpbmxpbmUgeGZzX2FnYmxvY2tfdAorYWdpbm8yYWdibm8gKHhmc19hZ2lub190IGFnaW5vKQoreworCXJldHVybiBhZ2lubyA+PiBYRlNfSU5PX09GRlNFVF9CSVRTOworfQorCitzdGF0aWMgaW5saW5lIHhmc19hZ251bWJlcl90Citpbm8yYWdubyAoeGZzX2lub190IGlubykKK3sKKwlyZXR1cm4gaW5vID4+IFhGU19JTk9fQUdJTk9fQklUUzsKK30KKworc3RhdGljIGlubGluZSB4ZnNfYWdpbm9fdAoraW5vMmFnaW5vICh4ZnNfaW5vX3QgaW5vKQoreworCXJldHVybiBpbm8gJiBYRlNfSU5PX01BU0soWEZTX0lOT19BR0lOT19CSVRTKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lubzJvZmZzZXQgKHhmc19pbm9fdCBpbm8pCit7CisJcmV0dXJuIGlubyAmIFhGU19JTk9fTUFTSyhYRlNfSU5PX09GRlNFVF9CSVRTKTsKK30KKworc3RhdGljIGlubGluZSBfX2NvbnN0X18geGZzX3VpbnQxNl90CitsZTE2ICh4ZnNfdWludDE2X3QgeCkKK3sKKwlfX2FzbV9fKCJ4Y2hnYiAlYjAsJWgwIglcCisJCTogIj1xIiAoeCkgXAorCQk6ICAiMCIgKHgpKTsgXAorCQlyZXR1cm4geDsKK30KKworc3RhdGljIGlubGluZSBfX2NvbnN0X18geGZzX3VpbnQzMl90CitsZTMyICh4ZnNfdWludDMyX3QgeCkKK3sKKyNpZiAwCisgICAgICAgIC8qIDM4NiBkb2Vzbid0IGhhdmUgYnN3YXAuICAqLworCV9fYXNtX18oImJzd2FwICUwIiA6ICI9ciIgKHgpIDogIjAiICh4KSk7CisjZWxzZQorCS8qIFRoaXMgaXMgc2xvd2VyIGJ1dCB0aGlzIHdvcmtzIG9uIGFsbCB4ODYgYXJjaGl0ZWN0dXJlcy4gICovCisJX19hc21fXygieGNoZ2IgJWIwLCAlaDAiIFwKKwkJIlxuXHRyb2xsICQxNiwgJTAiIFwKKwkJIlxuXHR4Y2hnYiAlYjAsICVoMCIgXAorCQk6ICI9cSIgKHgpIDogIjAiICh4KSk7CisjZW5kaWYKKwlyZXR1cm4geDsKK30KKworc3RhdGljIGlubGluZSBfX2NvbnN0X18geGZzX3VpbnQ2NF90CitsZTY0ICh4ZnNfdWludDY0X3QgeCkKK3sKKwl4ZnNfdWludDMyX3QgaCA9IHggPj4gMzI7CisgICAgICAgIHhmc191aW50MzJfdCBsID0geCAmICgoMVVMTDw8MzIpLTEpOworICAgICAgICByZXR1cm4gKCgoeGZzX3VpbnQ2NF90KWxlMzIobCkpIDw8IDMyKSB8ICgoeGZzX3VpbnQ2NF90KShsZTMyKGgpKSk7Cit9CisKKworc3RhdGljIHhmc19mc2Jsb2NrX3QKK3h0X3N0YXJ0ICh4ZnNfYm1idF9yZWNfMzJfdCAqcikKK3sKKwlyZXR1cm4gKCgoeGZzX2ZzYmxvY2tfdCkobGUzMiAoci0+bDEpICYgbWFzazMybG8oOSkpKSA8PCA0MykgfCAKKwkgICAgICAgKCgoeGZzX2ZzYmxvY2tfdClsZTMyIChyLT5sMikpIDw8IDExKSB8CisJICAgICAgICgoKHhmc19mc2Jsb2NrX3QpbGUzMiAoci0+bDMpKSA+PiAyMSk7Cit9CisKK3N0YXRpYyB4ZnNfZmlsZW9mZl90Cit4dF9vZmZzZXQgKHhmc19ibWJ0X3JlY18zMl90ICpyKQoreworCXJldHVybiAoKCh4ZnNfZmlsZW9mZl90KWxlMzIgKHItPmwwKSAmCisJCW1hc2szMmxvKDMxKSkgPDwgMjMpIHwKKwkJKCgoeGZzX2ZpbGVvZmZfdClsZTMyIChyLT5sMSkpID4+IDkpOworfQorCitzdGF0aWMgeGZzX2ZpbGJsa3NfdAoreHRfbGVuICh4ZnNfYm1idF9yZWNfMzJfdCAqcikKK3sKKwlyZXR1cm4gbGUzMihyLT5sMykgJiBtYXNrMzJsbygyMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cit4ZnNfaGlnaGJpdDMyKHhmc191aW50MzJfdCB2KQoreworCWludCBpOworCisJaWYgKC0tdikgeworCQlmb3IgKGkgPSAwOyBpIDwgMzE7IGkrKywgdiA+Pj0gMSkgeworCQkJaWYgKHYgPT0gMCkKKwkJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraXNpbnh0ICh4ZnNfZmlsZW9mZl90IGtleSwgeGZzX2ZpbGVvZmZfdCBvZmZzZXQsIHhmc19maWxibGtzX3QgbGVuKQoreworCXJldHVybiAoa2V5ID49IG9mZnNldCkgPyAoa2V5IDwgb2Zmc2V0ICsgbGVuID8gMSA6IDApIDogMDsKK30KKworc3RhdGljIHhmc19kYWRkcl90CithZ2IyZGFkZHIgKHhmc19hZ251bWJlcl90IGFnbm8sIHhmc19hZ2Jsb2NrX3QgYWdibm8pCit7CisJcmV0dXJuICgoeGZzX2ZzYmxvY2tfdClhZ25vKnhmcy5hZ2Jsb2NrcyArIGFnYm5vKSA8PCB4ZnMuYmRsb2c7Cit9CisKK3N0YXRpYyB4ZnNfZGFkZHJfdAorZnNiMmRhZGRyICh4ZnNfZnNibG9ja190IGZzYm5vKQoreworCXJldHVybiBhZ2IyZGFkZHIgKCh4ZnNfYWdudW1iZXJfdCkoZnNibm8gPj4geGZzLmFnYmxrbG9nKSwKKwkJCSAoeGZzX2FnYmxvY2tfdCkoZnNibm8gJiBtYXNrMzJsbyh4ZnMuYWdibGtsb2cpKSk7Cit9CisKKyN1bmRlZiBvZmZzZXRvZgorI2RlZmluZSBvZmZzZXRvZih0LG0pCSgoaW50KSYoKCh0ICopMCktPm0pKQorCitzdGF0aWMgaW5saW5lIGludAorYnRyb290X21heHJlY3MgKHZvaWQpCit7CisJaW50IHRtcCA9IGljb3JlLmRpX2ZvcmtvZmYgPyAoaWNvcmUuZGlfZm9ya29mZiA8PCAzKSA6IHhmcy5pc2l6ZTsKKworCXJldHVybiAodG1wIC0gc2l6ZW9mKHhmc19ibWRyX2Jsb2NrX3QpIC0gb2Zmc2V0b2YoeGZzX2Rpbm9kZV90LCBkaV91KSkgLworCQkoc2l6ZW9mICh4ZnNfYm1idF9rZXlfdCkgKyBzaXplb2YgKHhmc19ibWJ0X3B0cl90KSk7Cit9CisKK3N0YXRpYyBpbnQKK2RpX3JlYWQgKHhmc19pbm9fdCBpbm8pCit7CisJeGZzX2FnaW5vX3QgYWdpbm87CisJeGZzX2FnbnVtYmVyX3QgYWdubzsKKwl4ZnNfYWdibG9ja190IGFnYm5vOworCXhmc19kYWRkcl90IGRhZGRyOworCWludCBvZmZzZXQ7CisKKwlhZ25vID0gaW5vMmFnbm8gKGlubyk7CisJYWdpbm8gPSBpbm8yYWdpbm8gKGlubyk7CisJYWdibm8gPSBhZ2lubzJhZ2JubyAoYWdpbm8pOworCW9mZnNldCA9IGlubzJvZmZzZXQgKGlubyk7CisJZGFkZHIgPSBhZ2IyZGFkZHIgKGFnbm8sIGFnYm5vKTsKKworCWRldnJlYWQgKGRhZGRyLCBvZmZzZXQqeGZzLmlzaXplLCB4ZnMuaXNpemUsIChjaGFyICopaW5vZGUpOworCisJeGZzLnB0cjAgPSAqKHhmc19ibWJ0X3B0cl90ICopCisJCSAgICAoaW5vZGUtPmRpX3UuZGlfYyArIHNpemVvZih4ZnNfYm1kcl9ibG9ja190KQorCQkgICAgKyBidHJvb3RfbWF4cmVjcyAoKSpzaXplb2YoeGZzX2JtYnRfa2V5X3QpKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAoraW5pdF9leHRlbnRzICh2b2lkKQoreworCXhmc19ibWJ0X3B0cl90IHB0cjA7CisJeGZzX2J0cmVlX2xibG9ja190IGg7CisKKwlzd2l0Y2ggKGljb3JlLmRpX2Zvcm1hdCkgeworCWNhc2UgWEZTX0RJTk9ERV9GTVRfRVhURU5UUzoKKwkJeGZzLnh0ID0gaW5vZGUtPmRpX3UuZGlfYm14OworCQl4ZnMubmV4dGVudHMgPSBsZTMyIChpY29yZS5kaV9uZXh0ZW50cyk7CisJCWJyZWFrOworCWNhc2UgWEZTX0RJTk9ERV9GTVRfQlRSRUU6CisJCXB0cjAgPSB4ZnMucHRyMDsKKwkJZm9yICg7OykgeworCQkJeGZzLmRhZGRyID0gZnNiMmRhZGRyIChsZTY0KHB0cjApKTsKKwkJCWRldnJlYWQgKHhmcy5kYWRkciwgMCwKKwkJCQkgc2l6ZW9mKHhmc19idHJlZV9sYmxvY2tfdCksIChjaGFyICopJmgpOworCQkJaWYgKCFoLmJiX2xldmVsKSB7CisJCQkJeGZzLm5leHRlbnRzID0gbGUxNihoLmJiX251bXJlY3MpOworCQkJCXhmcy5uZXh0ID0gZnNiMmRhZGRyIChsZTY0KGguYmJfcmlnaHRzaWIpKTsKKwkJCQl4ZnMuZnBvcyA9IHNpemVvZih4ZnNfYnRyZWVfYmxvY2tfdCk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJZGV2cmVhZCAoeGZzLmRhZGRyLCB4ZnMuYnRub2RlX3B0cjBfb2ZmLAorCQkJCSBzaXplb2YoeGZzX2JtYnRfcHRyX3QpLCAoY2hhciAqKSZwdHIwKTsKKwkJfQorCX0KK30KKworc3RhdGljIHhhZF90ICoKK25leHRfZXh0ZW50ICh2b2lkKQoreworCXN0YXRpYyB4YWRfdCB4YWQ7CisKKwlzd2l0Y2ggKGljb3JlLmRpX2Zvcm1hdCkgeworCWNhc2UgWEZTX0RJTk9ERV9GTVRfRVhURU5UUzoKKwkJaWYgKHhmcy5uZXh0ZW50cyA9PSAwKQorCQkJcmV0dXJuIE5VTEw7CisJCWJyZWFrOworCWNhc2UgWEZTX0RJTk9ERV9GTVRfQlRSRUU6CisJCWlmICh4ZnMubmV4dGVudHMgPT0gMCkgeworCQkJeGZzX2J0cmVlX2xibG9ja190IGg7CisJCQlpZiAoeGZzLm5leHQgPT0gMCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCXhmcy5kYWRkciA9IHhmcy5uZXh0OworCQkJZGV2cmVhZCAoeGZzLmRhZGRyLCAwLCBzaXplb2YoeGZzX2J0cmVlX2xibG9ja190KSwgKGNoYXIgKikmaCk7CisJCQl4ZnMubmV4dGVudHMgPSBsZTE2KGguYmJfbnVtcmVjcyk7CisJCQl4ZnMubmV4dCA9IGZzYjJkYWRkciAobGU2NChoLmJiX3JpZ2h0c2liKSk7CisJCQl4ZnMuZnBvcyA9IHNpemVvZih4ZnNfYnRyZWVfYmxvY2tfdCk7CisJCX0KKwkJLyogWWVhaCwgSSBrbm93IHRoYXQncyBzbG93LCBidXQgSSByZWFsbHkgZG9uJ3QgY2FyZSAqLworCQlkZXZyZWFkICh4ZnMuZGFkZHIsIHhmcy5mcG9zLCBzaXplb2YoeGZzX2JtYnRfcmVjX3QpLCBmaWxlYnVmKTsKKwkJeGZzLnh0ID0gKHhmc19ibWJ0X3JlY18zMl90ICopZmlsZWJ1ZjsKKwkJeGZzLmZwb3MgKz0gc2l6ZW9mKHhmc19ibWJ0X3JlY18zMl90KTsKKwl9CisJeGFkLm9mZnNldCA9IHh0X29mZnNldCAoeGZzLnh0KTsKKwl4YWQuc3RhcnQgPSB4dF9zdGFydCAoeGZzLnh0KTsKKwl4YWQubGVuID0geHRfbGVuICh4ZnMueHQpOworCSsreGZzLnh0OworCS0teGZzLm5leHRlbnRzOworCisJcmV0dXJuICZ4YWQ7Cit9CisKKy8qCisgKiBOYW1lIGxpZXMgLSB0aGUgZnVuY3Rpb24gcmVhZHMgb25seSBmaXJzdCAxMDAgYnl0ZXMKKyAqLworc3RhdGljIHZvaWQKK3hmc19kYWJyZWFkICh2b2lkKQoreworCXhhZF90ICp4YWQ7CisJeGZzX2ZpbGVvZmZfdCBvZmZzZXQ7OworCisJaW5pdF9leHRlbnRzICgpOworCXdoaWxlICgoeGFkID0gbmV4dF9leHRlbnQgKCkpKSB7CisJCW9mZnNldCA9IHhhZC0+b2Zmc2V0OworCQlpZiAoaXNpbnh0ICh4ZnMuZGFibGssIG9mZnNldCwgeGFkLT5sZW4pKSB7CisJCQlkZXZyZWFkIChmc2IyZGFkZHIgKHhhZC0+c3RhcnQgKyB4ZnMuZGFibGsgLSBvZmZzZXQpLAorCQkJCSAwLCAxMDAsIGRpcmJ1Zik7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIGlubGluZSB4ZnNfaW5vX3QKK3NmX2lubyAoY2hhciAqc2ZlLCBpbnQgbmFtZWxlbikKK3sKKwl2b2lkICpwID0gc2ZlICsgbmFtZWxlbiArIDM7CisKKwlyZXR1cm4gKHhmcy5pOHBhcmFtID09IDApCisJCT8gbGU2NCgqKHhmc19pbm9fdCAqKXApIDogbGUzMigqKHhmc191aW50MzJfdCAqKXApOworfQorCitzdGF0aWMgaW5saW5lIHhmc19pbm9fdAorc2ZfcGFyZW50X2lubyAodm9pZCkKK3sKKwlyZXR1cm4gKHhmcy5pOHBhcmFtID09IDApCisJCT8gbGU2NCgqKHhmc19pbm9fdCAqKSgmaW5vZGUtPmRpX3UuZGlfZGlyMnNmLmhkci5wYXJlbnQpKQorCQk6IGxlMzIoKih4ZnNfdWludDMyX3QgKikoJmlub2RlLT5kaV91LmRpX2RpcjJzZi5oZHIucGFyZW50KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cityb3VuZHVwOCAoaW50IG4pCit7CisJcmV0dXJuICgobis3KSZ+Nyk7Cit9CisKK3N0YXRpYyBjaGFyICoKK25leHRfZGVudHJ5ICh4ZnNfaW5vX3QgKmlubykKK3sKKwlpbnQgbmFtZWxlbiA9IDE7CisJaW50IHRvcmVhZDsKKwlzdGF0aWMgY2hhciB1c3VhbFsyXVszXSA9IHsiLiIsICIuLiJ9OworCXN0YXRpYyB4ZnNfZGlyMl9zZl9lbnRyeV90ICpzZmU7CisJY2hhciAqbmFtZSA9IHVzdWFsWzBdOworCisJaWYgKHhmcy5kaXJwb3MgPj0geGZzLmRpcm1heCkgeworCQlpZiAoeGZzLmZvcncgPT0gMCkKKwkJCXJldHVybiBOVUxMOworCQl4ZnMuZGFibGsgPSB4ZnMuZm9ydzsKKwkJeGZzX2RhYnJlYWQgKCk7CisjZGVmaW5lIGgJKCh4ZnNfZGlyMl9sZWFmX2hkcl90ICopZGlyYnVmKQorCQl4ZnMuZGlybWF4ID0gbGUxNiAoaC0+Y291bnQpIC0gbGUxNiAoaC0+c3RhbGUpOworCQl4ZnMuZm9ydyA9IGxlMzIgKGgtPmluZm8uZm9ydyk7CisjdW5kZWYgaAorCQl4ZnMuZGlycG9zID0gMDsKKwl9CisKKwlzd2l0Y2ggKGljb3JlLmRpX2Zvcm1hdCkgeworCWNhc2UgWEZTX0RJTk9ERV9GTVRfTE9DQUw6CisJCXN3aXRjaCAoeGZzLmRpcnBvcykgeworCQljYXNlIC0yOgorCQkJKmlubyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAtMToKKwkJCSppbm8gPSBzZl9wYXJlbnRfaW5vICgpOworCQkJKytuYW1lOworCQkJKytuYW1lbGVuOworCQkJc2ZlID0gKHhmc19kaXIyX3NmX2VudHJ5X3QgKikKKwkJCQkoaW5vZGUtPmRpX3UuZGlfYyAKKwkJCQkgKyBzaXplb2YoeGZzX2RpcjJfc2ZfaGRyX3QpCisJCQkJIC0geGZzLmk4cGFyYW0pOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQluYW1lbGVuID0gc2ZlLT5uYW1lbGVuOworCQkJKmlubyA9IHNmX2lubyAoKGNoYXIgKilzZmUsIG5hbWVsZW4pOworCQkJbmFtZSA9IHNmZS0+bmFtZTsKKwkJCXNmZSA9ICh4ZnNfZGlyMl9zZl9lbnRyeV90ICopCisJCQkJICAoKGNoYXIgKilzZmUgKyBuYW1lbGVuICsgMTEgLSB4ZnMuaThwYXJhbSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBYRlNfRElOT0RFX0ZNVF9CVFJFRToKKwljYXNlIFhGU19ESU5PREVfRk1UX0VYVEVOVFM6CisjZGVmaW5lIGRhdQkoKHhmc19kaXIyX2RhdGFfdW5pb25fdCAqKWRpcmJ1ZikKKwkJZm9yICg7OykgeworCQkJaWYgKHhmcy5ibGtvZmYgPj0geGZzLmRpcmJzaXplKSB7CisJCQkJeGZzLmJsa29mZiA9IHNpemVvZih4ZnNfZGlyMl9kYXRhX2hkcl90KTsKKwkJCQlmaWxlcG9zICY9IH4oeGZzLmRpcmJzaXplIC0gMSk7CisJCQkJZmlsZXBvcyB8PSB4ZnMuYmxrb2ZmOworCQkJfQorCQkJeGZzX3JlYWQgKGRpcmJ1ZiwgNCk7CisJCQl4ZnMuYmxrb2ZmICs9IDQ7CisJCQlpZiAoZGF1LT51bnVzZWQuZnJlZXRhZyA9PSBYRlNfRElSMl9EQVRBX0ZSRUVfVEFHKSB7CisJCQkJdG9yZWFkID0gcm91bmR1cDggKGxlMTYoZGF1LT51bnVzZWQubGVuZ3RoKSkgLSA0OworCQkJCXhmcy5ibGtvZmYgKz0gdG9yZWFkOworCQkJCWZpbGVwb3MgKz0gdG9yZWFkOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJeGZzX3JlYWQgKChjaGFyICopZGlyYnVmICsgNCwgNSk7CisJCSppbm8gPSBsZTY0IChkYXUtPmVudHJ5LmludW1iZXIpOworCQluYW1lbGVuID0gZGF1LT5lbnRyeS5uYW1lbGVuOworI3VuZGVmIGRhdQorCQl0b3JlYWQgPSByb3VuZHVwOCAobmFtZWxlbiArIDExKSAtIDk7CisJCXhmc19yZWFkIChkaXJidWYsIHRvcmVhZCk7CisJCW5hbWUgPSAoY2hhciAqKWRpcmJ1ZjsKKwkJeGZzLmJsa29mZiArPSB0b3JlYWQgKyA1OworCX0KKwkrK3hmcy5kaXJwb3M7CisJbmFtZVtuYW1lbGVuXSA9IDA7CisKKwlyZXR1cm4gbmFtZTsKK30KKworc3RhdGljIGNoYXIgKgorZmlyc3RfZGVudHJ5ICh4ZnNfaW5vX3QgKmlubykKK3sKKwl4ZnMuZm9ydyA9IDA7CisJc3dpdGNoIChpY29yZS5kaV9mb3JtYXQpIHsKKwljYXNlIFhGU19ESU5PREVfRk1UX0xPQ0FMOgorCQl4ZnMuZGlybWF4ID0gaW5vZGUtPmRpX3UuZGlfZGlyMnNmLmhkci5jb3VudDsKKwkJeGZzLmk4cGFyYW0gPSBpbm9kZS0+ZGlfdS5kaV9kaXIyc2YuaGRyLmk4Y291bnQgPyAwIDogNDsKKwkJeGZzLmRpcnBvcyA9IC0yOworCQlicmVhazsKKwljYXNlIFhGU19ESU5PREVfRk1UX0VYVEVOVFM6CisJY2FzZSBYRlNfRElOT0RFX0ZNVF9CVFJFRToKKwkJZmlsZXBvcyA9IDA7CisJCXhmc19yZWFkIChkaXJidWYsIHNpemVvZih4ZnNfZGlyMl9kYXRhX2hkcl90KSk7CisJCWlmICgoKHhmc19kaXIyX2RhdGFfaGRyX3QgKilkaXJidWYpLT5tYWdpYyA9PSBsZTMyKFhGU19ESVIyX0JMT0NLX01BR0lDKSkgeworI2RlZmluZSB0YWlsCQkoKHhmc19kaXIyX2Jsb2NrX3RhaWxfdCAqKWRpcmJ1ZikKKwkJCWZpbGVwb3MgPSB4ZnMuZGlyYnNpemUgLSBzaXplb2YoKnRhaWwpOworCQkJeGZzX3JlYWQgKGRpcmJ1Ziwgc2l6ZW9mKCp0YWlsKSk7CisJCQl4ZnMuZGlybWF4ID0gbGUzMiAodGFpbC0+Y291bnQpIC0gbGUzMiAodGFpbC0+c3RhbGUpOworI3VuZGVmIHRhaWwKKwkJfSBlbHNlIHsKKwkJCXhmcy5kYWJsayA9ICgxVUxMIDw8IDM1KSA+PiB4ZnMuYmxrbG9nOworI2RlZmluZSBoCQkoKHhmc19kaXIyX2xlYWZfaGRyX3QgKilkaXJidWYpCisjZGVmaW5lIG4JCSgoeGZzX2RhX2ludG5vZGVfdCAqKWRpcmJ1ZikKKwkJCWZvciAoOzspIHsKKwkJCQl4ZnNfZGFicmVhZCAoKTsKKwkJCQlpZiAoKG4tPmhkci5pbmZvLm1hZ2ljID09IGxlMTYoWEZTX0RJUjJfTEVBRk5fTUFHSUMpKQorCQkJCSAgICB8fCAobi0+aGRyLmluZm8ubWFnaWMgPT0gbGUxNihYRlNfRElSMl9MRUFGMV9NQUdJQykpKSB7CisJCQkJCXhmcy5kaXJtYXggPSBsZTE2IChoLT5jb3VudCkgLSBsZTE2IChoLT5zdGFsZSk7CisJCQkJCXhmcy5mb3J3ID0gbGUzMiAoaC0+aW5mby5mb3J3KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXhmcy5kYWJsayA9IGxlMzIgKG4tPmJ0cmVlWzBdLmJlZm9yZSk7CisJCQl9CisjdW5kZWYgbgorI3VuZGVmIGgKKwkJfQorCQl4ZnMuYmxrb2ZmID0gc2l6ZW9mKHhmc19kaXIyX2RhdGFfaGRyX3QpOworCQlmaWxlcG9zID0geGZzLmJsa29mZjsKKwkJeGZzLmRpcnBvcyA9IDA7CisJfQorCXJldHVybiBuZXh0X2RlbnRyeSAoaW5vKTsKK30KKworaW50Cit4ZnNfbW91bnQgKHZvaWQpCit7CisJeGZzX3NiX3Qgc3VwZXI7CisKKwlpZiAoIWRldnJlYWQgKDAsIDAsIHNpemVvZihzdXBlciksIChjaGFyICopJnN1cGVyKQorCSAgICB8fCAobGUzMihzdXBlci5zYl9tYWdpY251bSkgIT0gWEZTX1NCX01BR0lDKQorCSAgICB8fCAoKGxlMTYoc3VwZXIuc2JfdmVyc2lvbm51bSkgCisJCSYgWEZTX1NCX1ZFUlNJT05fTlVNQklUUykgIT0gWEZTX1NCX1ZFUlNJT05fNCkgKSB7CisJCXJldHVybiAwOworCX0KKworCXhmcy5ic2l6ZSA9IGxlMzIgKHN1cGVyLnNiX2Jsb2Nrc2l6ZSk7CisJeGZzLmJsa2xvZyA9IHN1cGVyLnNiX2Jsb2NrbG9nOworCXhmcy5iZGxvZyA9IHhmcy5ibGtsb2cgLSBTRUNUT1JfQklUUzsKKwl4ZnMucm9vdGlubyA9IGxlNjQgKHN1cGVyLnNiX3Jvb3Rpbm8pOworCXhmcy5pc2l6ZSA9IGxlMTYgKHN1cGVyLnNiX2lub2Rlc2l6ZSk7CisJeGZzLmFnYmxvY2tzID0gbGUzMiAoc3VwZXIuc2JfYWdibG9ja3MpOworCXhmcy5kaXJic2l6ZSA9IHhmcy5ic2l6ZSA8PCBzdXBlci5zYl9kaXJibGtsb2c7CisKKwl4ZnMuaW5vcGJsb2cgPSBzdXBlci5zYl9pbm9wYmxvZzsKKwl4ZnMuYWdibGtsb2cgPSBzdXBlci5zYl9hZ2Jsa2xvZzsKKwl4ZnMuYWdub2xvZyA9IHhmc19oaWdoYml0MzIgKGxlMzIoc3VwZXIuc2JfYWdjb3VudCkpOworCisJeGZzLmJ0bm9kZV9wdHIwX29mZiA9CisJCSgoeGZzLmJzaXplIC0gc2l6ZW9mKHhmc19idHJlZV9ibG9ja190KSkgLworCQkoc2l6ZW9mICh4ZnNfYm1idF9rZXlfdCkgKyBzaXplb2YgKHhmc19ibWJ0X3B0cl90KSkpCisJCSAqIHNpemVvZih4ZnNfYm1idF9rZXlfdCkgKyBzaXplb2YoeGZzX2J0cmVlX2Jsb2NrX3QpOworCisJcmV0dXJuIDE7Cit9CisKK2ludAoreGZzX3JlYWQgKGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwl4YWRfdCAqeGFkOworCXhmc19maWxlb2ZmX3QgZW5kb2ZwcmV2LCBlbmRvZmN1ciwgb2Zmc2V0OworCXhmc19maWxibGtzX3QgeGFkbGVuOworCWludCB0b3JlYWQsIHN0YXJ0cG9zLCBlbmRwb3M7CisKKwlpZiAoaWNvcmUuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0xPQ0FMKSB7CisJCWdydWJfbWVtbW92ZSAoYnVmLCBpbm9kZS0+ZGlfdS5kaV9jICsgZmlsZXBvcywgbGVuKTsKKwkJZmlsZXBvcyArPSBsZW47CisJCXJldHVybiBsZW47CisJfQorCisJc3RhcnRwb3MgPSBmaWxlcG9zOworCWVuZHBvcyA9IGZpbGVwb3MgKyBsZW47CisJZW5kb2ZwcmV2ID0gKHhmc19maWxlb2ZmX3QpLTE7CisJaW5pdF9leHRlbnRzICgpOworCXdoaWxlIChsZW4gPiAwICYmICh4YWQgPSBuZXh0X2V4dGVudCAoKSkpIHsKKwkJb2Zmc2V0ID0geGFkLT5vZmZzZXQ7CisJCXhhZGxlbiA9IHhhZC0+bGVuOworCQlpZiAoaXNpbnh0IChmaWxlcG9zID4+IHhmcy5ibGtsb2csIG9mZnNldCwgeGFkbGVuKSkgeworCQkJZW5kb2ZjdXIgPSAob2Zmc2V0ICsgeGFkbGVuKSA8PCB4ZnMuYmxrbG9nOyAKKwkJCXRvcmVhZCA9IChlbmRvZmN1ciA+PSBlbmRwb3MpCisJCQkJICA/IGxlbiA6IChlbmRvZmN1ciAtIGZpbGVwb3MpOworCisJCQlkaXNrX3JlYWRfZnVuYyA9IGRpc2tfcmVhZF9ob29rOworCQkJZGV2cmVhZCAoZnNiMmRhZGRyICh4YWQtPnN0YXJ0KSwKKwkJCQkgZmlsZXBvcyAtIChvZmZzZXQgPDwgeGZzLmJsa2xvZyksIHRvcmVhZCwgYnVmKTsKKwkJCWRpc2tfcmVhZF9mdW5jID0gTlVMTDsKKworCQkJYnVmICs9IHRvcmVhZDsKKwkJCWxlbiAtPSB0b3JlYWQ7CisJCQlmaWxlcG9zICs9IHRvcmVhZDsKKwkJfSBlbHNlIGlmIChvZmZzZXQgPiBlbmRvZnByZXYpIHsKKwkJCXRvcmVhZCA9ICgob2Zmc2V0IDw8IHhmcy5ibGtsb2cpID49IGVuZHBvcykKKwkJCQkgID8gbGVuIDogKChvZmZzZXQgLSBlbmRvZnByZXYpIDw8IHhmcy5ibGtsb2cpOworCQkJbGVuIC09IHRvcmVhZDsKKwkJCWZpbGVwb3MgKz0gdG9yZWFkOworCQkJZm9yICg7IHRvcmVhZDsgdG9yZWFkLS0pIHsKKwkJCQkqYnVmKysgPSAwOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJZW5kb2ZwcmV2ID0gb2Zmc2V0ICsgeGFkbGVuOyAKKwl9CisKKwlyZXR1cm4gZmlsZXBvcyAtIHN0YXJ0cG9zOworfQorCitpbnQKK3hmc19kaXIgKGNoYXIgKmRpcm5hbWUpCit7CisJeGZzX2lub190IGlubywgcGFyZW50X2lubywgbmV3X2lubzsKKwl4ZnNfZnNpemVfdCBkaV9zaXplOworCWludCBkaV9tb2RlOworCWludCBjbXAsIG4sIGxpbmtfY291bnQ7CisJY2hhciBsaW5rYnVmW3hmcy5ic2l6ZV07CisJY2hhciAqcmVzdCwgKm5hbWUsIGNoOworCisJcGFyZW50X2lubyA9IGlubyA9IHhmcy5yb290aW5vOworCWxpbmtfY291bnQgPSAwOworCWZvciAoOzspIHsKKwkJZGlfcmVhZCAoaW5vKTsKKwkJZGlfc2l6ZSA9IGxlNjQgKGljb3JlLmRpX3NpemUpOworCQlkaV9tb2RlID0gbGUxNiAoaWNvcmUuZGlfbW9kZSk7CisKKwkJaWYgKChkaV9tb2RlICYgSUZNVCkgPT0gSUZMTkspIHsKKwkJCWlmICgrK2xpbmtfY291bnQgPiBNQVhfTElOS19DT1VOVCkgeworCQkJCWVycm51bSA9IEVSUl9TWU1MSU5LX0xPT1A7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAoZGlfc2l6ZSA8IHhmcy5ic2l6ZSAtIDEpIHsKKwkJCQlmaWxlcG9zID0gMDsKKwkJCQlmaWxlbWF4ID0gZGlfc2l6ZTsKKwkJCQluID0geGZzX3JlYWQgKGxpbmtidWYsIGZpbGVtYXgpOworCQkJfSBlbHNlIHsKKwkJCQllcnJudW0gPSBFUlJfRklMRUxFTkdUSDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJaW5vID0gKGxpbmtidWZbMF0gPT0gJy8nKSA/IHhmcy5yb290aW5vIDogcGFyZW50X2lubzsKKwkJCXdoaWxlIChuIDwgKHhmcy5ic2l6ZSAtIDEpICYmIChsaW5rYnVmW24rK10gPSAqZGlybmFtZSsrKSk7CisJCQlsaW5rYnVmW25dID0gMDsKKwkJCWRpcm5hbWUgPSBsaW5rYnVmOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoISpkaXJuYW1lIHx8IGlzc3BhY2UgKCpkaXJuYW1lKSkgeworCQkJaWYgKChkaV9tb2RlICYgSUZNVCkgIT0gSUZSRUcpIHsKKwkJCQllcnJudW0gPSBFUlJfQkFEX0ZJTEVUWVBFOworCQkJCXJldHVybiAwOworCQkJfQorCQkJZmlsZXBvcyA9IDA7CisJCQlmaWxlbWF4ID0gZGlfc2l6ZTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJaWYgKChkaV9tb2RlICYgSUZNVCkgIT0gSUZESVIpIHsKKwkJCWVycm51bSA9IEVSUl9CQURfRklMRVRZUEU7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWZvciAoOyAqZGlybmFtZSA9PSAnLyc7IGRpcm5hbWUrKyk7CisKKwkJZm9yIChyZXN0ID0gZGlybmFtZTsgKGNoID0gKnJlc3QpICYmICFpc3NwYWNlIChjaCkgJiYgY2ggIT0gJy8nOyByZXN0KyspOworCQkqcmVzdCA9IDA7CisKKwkJbmFtZSA9IGZpcnN0X2RlbnRyeSAoJm5ld19pbm8pOworCQlmb3IgKDs7KSB7CisJCQljbXAgPSAoISpkaXJuYW1lKSA/IC0xIDogc3Vic3RyaW5nIChkaXJuYW1lLCBuYW1lKTsKKyNpZm5kZWYgU1RBR0UxXzUKKwkJCWlmIChwcmludF9wb3NzaWJpbGl0aWVzICYmIGNoICE9ICcvJyAmJiBjbXAgPD0gMCkgeworCQkJCWlmIChwcmludF9wb3NzaWJpbGl0aWVzID4gMCkKKwkJCQkJcHJpbnRfcG9zc2liaWxpdGllcyA9IC1wcmludF9wb3NzaWJpbGl0aWVzOworCQkJCXByaW50X2FfY29tcGxldGlvbiAobmFtZSk7CisJCQl9IGVsc2UKKyNlbmRpZgorCQkJaWYgKGNtcCA9PSAwKSB7CisJCQkJcGFyZW50X2lubyA9IGlubzsKKwkJCQlpZiAobmV3X2lubykKKwkJCQkJaW5vID0gbmV3X2lubzsKKwkJICAgICAgICAJKihkaXJuYW1lID0gcmVzdCkgPSBjaDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW5hbWUgPSBuZXh0X2RlbnRyeSAoJm5ld19pbm8pOworCQkJaWYgKG5hbWUgPT0gTlVMTCkgeworCQkJCWlmIChwcmludF9wb3NzaWJpbGl0aWVzIDwgMCkKKwkJCQkJcmV0dXJuIDE7CisKKwkJCQllcnJudW0gPSBFUlJfRklMRV9OT1RfRk9VTkQ7CisJCQkJKnJlc3QgPSBjaDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KK30KKworI2VuZGlmIC8qIEZTWVNfWEZTICovCmRpZmYgLS1naXQgYS9zdGFnZTIvZ3VuemlwLmMgYi9zdGFnZTIvZ3VuemlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgzNTA4OQotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMi9ndW56aXAuYwpAQCAtMCwwICsxLDEyMzUgQEAKKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMTk5OSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKgorICogTW9zdCBvZiB0aGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgdGhlIHNvdXJjZSBmaWxlICJpbmZsYXRlLmMiLCB3cml0dGVuCisgKiBieSBNYXJrIEFkbGVyLiAgSXQgaGFzIGJlZW4gdmVyeSBoZWF2aWx5IG1vZGlmaWVkLiAgSW4gcGFydGljdWxhciwgdGhlCisgKiBvcmlnaW5hbCB3b3VsZCBydW4gdGhyb3VnaCB0aGUgd2hvbGUgZmlsZSBhdCBvbmNlLCBhbmQgdGhpcyB2ZXJzaW9uIGNhbgorICogYmUgc3RvcHBlZCBhbmQgcmVzdGFydGVkIG9uIGFueSBib3VuZGFyeSBkdXJpbmcgdGhlIGRlY29tcHJlc3Npb24gcHJvY2Vzcy4KKyAqCisgKiBUaGUgbGljZW5zZSBhbmQgaGVhZGVyIGNvbW1lbnRzIHRoYXQgZmlsZSBhcmUgaW5jbHVkZWQgaGVyZS4KKyAqLworCisvKiBpbmZsYXRlLmMgLS0gTm90IGNvcHlyaWdodGVkIDE5OTIgYnkgTWFyayBBZGxlcgorICAgdmVyc2lvbiBjMTBwMSwgMTAgSmFudWFyeSAxOTkzICovCisKKy8qIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IGxpa2Ugd2l0aCB0aGlzIHNvdXJjZSBmaWxlLCB0aG91Z2ggSSB3b3VsZAorICAgcHJlZmVyIHRoYXQgaWYgeW91IG1vZGlmeSBpdCBhbmQgcmVkaXN0cmlidXRlIGl0IHRoYXQgeW91IGluY2x1ZGUKKyAgIGNvbW1lbnRzIHRvIHRoYXQgZWZmZWN0IHdpdGggeW91ciBuYW1lIGFuZCB0aGUgZGF0ZS4gIFRoYW5rIHlvdS4KKyAqLworCisvKgorICAgSW5mbGF0ZSBkZWZsYXRlZCAoUEtaSVAncyBtZXRob2QgOCBjb21wcmVzc2VkKSBkYXRhLiAgVGhlIGNvbXByZXNzaW9uCisgICBtZXRob2Qgc2VhcmNoZXMgZm9yIGFzIG11Y2ggb2YgdGhlIGN1cnJlbnQgc3RyaW5nIG9mIGJ5dGVzICh1cCB0byBhCisgICBsZW5ndGggb2YgMjU4KSBpbiB0aGUgcHJldmlvdXMgMzJLIGJ5dGVzLiAgSWYgaXQgZG9lc24ndCBmaW5kIGFueQorICAgbWF0Y2hlcyAob2YgYXQgbGVhc3QgbGVuZ3RoIDMpLCBpdCBjb2RlcyB0aGUgbmV4dCBieXRlLiAgT3RoZXJ3aXNlLCBpdAorICAgY29kZXMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCBzdHJpbmcgYW5kIGl0cyBkaXN0YW5jZSBiYWNrd2FyZHMgZnJvbQorICAgdGhlIGN1cnJlbnQgcG9zaXRpb24uICBUaGVyZSBpcyBhIHNpbmdsZSBIdWZmbWFuIGNvZGUgdGhhdCBjb2RlcyBib3RoCisgICBzaW5nbGUgYnl0ZXMgKGNhbGxlZCAibGl0ZXJhbHMiKSBhbmQgbWF0Y2ggbGVuZ3Rocy4gIEEgc2Vjb25kIEh1ZmZtYW4KKyAgIGNvZGUgY29kZXMgdGhlIGRpc3RhbmNlIGluZm9ybWF0aW9uLCB3aGljaCBmb2xsb3dzIGEgbGVuZ3RoIGNvZGUuICBFYWNoCisgICBsZW5ndGggb3IgZGlzdGFuY2UgY29kZSBhY3R1YWxseSByZXByZXNlbnRzIGEgYmFzZSB2YWx1ZSBhbmQgYSBudW1iZXIKKyAgIG9mICJleHRyYSIgKHNvbWV0aW1lcyB6ZXJvKSBiaXRzIHRvIGdldCB0byBhZGQgdG8gdGhlIGJhc2UgdmFsdWUuICBBdAorICAgdGhlIGVuZCBvZiBlYWNoIGRlZmxhdGVkIGJsb2NrIGlzIGEgc3BlY2lhbCBlbmQtb2YtYmxvY2sgKEVPQikgbGl0ZXJhbC8KKyAgIGxlbmd0aCBjb2RlLiAgVGhlIGRlY29kaW5nIHByb2Nlc3MgaXMgYmFzaWNhbGx5OiBnZXQgYSBsaXRlcmFsL2xlbmd0aAorICAgY29kZTsgaWYgRU9CIHRoZW4gZG9uZTsgaWYgYSBsaXRlcmFsLCBlbWl0IHRoZSBkZWNvZGVkIGJ5dGU7IGlmIGEKKyAgIGxlbmd0aCB0aGVuIGdldCB0aGUgZGlzdGFuY2UgYW5kIGVtaXQgdGhlIHJlZmVycmVkLXRvIGJ5dGVzIGZyb20gdGhlCisgICBzbGlkaW5nIHdpbmRvdyBvZiBwcmV2aW91c2x5IGVtaXR0ZWQgZGF0YS4KKworICAgVGhlcmUgYXJlIChjdXJyZW50bHkpIHRocmVlIGtpbmRzIG9mIGluZmxhdGUgYmxvY2tzOiBzdG9yZWQsIGZpeGVkLCBhbmQKKyAgIGR5bmFtaWMuICBUaGUgY29tcHJlc3NvciBkZWFscyB3aXRoIHNvbWUgY2h1bmsgb2YgZGF0YSBhdCBhIHRpbWUsIGFuZAorICAgZGVjaWRlcyB3aGljaCBtZXRob2QgdG8gdXNlIG9uIGEgY2h1bmstYnktY2h1bmsgYmFzaXMuICBBIGNodW5rIG1pZ2h0CisgICB0eXBpY2FsbHkgYmUgMzJLIG9yIDY0Sy4gIElmIHRoZSBjaHVuayBpcyB1bmNvbXByZXNzaWJsZSwgdGhlbiB0aGUKKyAgICJzdG9yZWQiIG1ldGhvZCBpcyB1c2VkLiAgSW4gdGhpcyBjYXNlLCB0aGUgYnl0ZXMgYXJlIHNpbXBseSBzdG9yZWQgYXMKKyAgIGlzLCBlaWdodCBiaXRzIHBlciBieXRlLCB3aXRoIG5vbmUgb2YgdGhlIGFib3ZlIGNvZGluZy4gIFRoZSBieXRlcyBhcmUKKyAgIHByZWNlZGVkIGJ5IGEgY291bnQsIHNpbmNlIHRoZXJlIGlzIG5vIGxvbmdlciBhbiBFT0IgY29kZS4KKworICAgSWYgdGhlIGRhdGEgaXMgY29tcHJlc3NpYmxlLCB0aGVuIGVpdGhlciB0aGUgZml4ZWQgb3IgZHluYW1pYyBtZXRob2RzCisgICBhcmUgdXNlZC4gIEluIHRoZSBkeW5hbWljIG1ldGhvZCwgdGhlIGNvbXByZXNzZWQgZGF0YSBpcyBwcmVjZWRlZCBieQorICAgYW4gZW5jb2Rpbmcgb2YgdGhlIGxpdGVyYWwvbGVuZ3RoIGFuZCBkaXN0YW5jZSBIdWZmbWFuIGNvZGVzIHRoYXQgYXJlCisgICB0byBiZSB1c2VkIHRvIGRlY29kZSB0aGlzIGJsb2NrLiAgVGhlIHJlcHJlc2VudGF0aW9uIGlzIGl0c2VsZiBIdWZmbWFuCisgICBjb2RlZCwgYW5kIHNvIGlzIHByZWNlZGVkIGJ5IGEgZGVzY3JpcHRpb24gb2YgdGhhdCBjb2RlLiAgVGhlc2UgY29kZQorICAgZGVzY3JpcHRpb25zIHRha2UgdXAgYSBsaXR0bGUgc3BhY2UsIGFuZCBzbyBmb3Igc21hbGwgYmxvY2tzLCB0aGVyZSBpcworICAgYSBwcmVkZWZpbmVkIHNldCBvZiBjb2RlcywgY2FsbGVkIHRoZSBmaXhlZCBjb2Rlcy4gIFRoZSBmaXhlZCBtZXRob2QgaXMKKyAgIHVzZWQgaWYgdGhlIGJsb2NrIGNvZGVzIHVwIHNtYWxsZXIgdGhhdCB3YXkgKHVzdWFsbHkgZm9yIHF1aXRlIHNtYWxsCisgICBjaHVua3MpLCBvdGhlcndpc2UgdGhlIGR5bmFtaWMgbWV0aG9kIGlzIHVzZWQuICBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZQorICAgY29kZXMgYXJlIGN1c3RvbWl6ZWQgdG8gdGhlIHByb2JhYmlsaXRpZXMgaW4gdGhlIGN1cnJlbnQgYmxvY2ssIGFuZCBzbworICAgY2FuIGNvZGUgaXQgbXVjaCBiZXR0ZXIgdGhhbiB0aGUgcHJlLWRldGVybWluZWQgZml4ZWQgY29kZXMuCisKKyAgIFRoZSBIdWZmbWFuIGNvZGVzIHRoZW1zZWx2ZXMgYXJlIGRlY29kZWQgdXNpbmcgYSBtdXRsaS1sZXZlbCB0YWJsZQorICAgbG9va3VwLCBpbiBvcmRlciB0byBtYXhpbWl6ZSB0aGUgc3BlZWQgb2YgZGVjb2RpbmcgcGx1cyB0aGUgc3BlZWQgb2YKKyAgIGJ1aWxkaW5nIHRoZSBkZWNvZGluZyB0YWJsZXMuICBTZWUgdGhlIGNvbW1lbnRzIGJlbG93IHRoYXQgcHJlY2VkZSB0aGUKKyAgIGxiaXRzIGFuZCBkYml0cyB0dW5pbmcgcGFyYW1ldGVycy4KKyAqLworCisKKy8qCisgICBOb3RlcyBiZXlvbmQgdGhlIDEuOTNhIGFwcG5vdGUudHh0OgorCisgICAxLiBEaXN0YW5jZSBwb2ludGVycyBuZXZlciBwb2ludCBiZWZvcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0CisgICAgICBzdHJlYW0uCisgICAyLiBEaXN0YW5jZSBwb2ludGVycyBjYW4gcG9pbnQgYmFjayBhY3Jvc3MgYmxvY2tzLCB1cCB0byAzMmsgYXdheS4KKyAgIDMuIFRoZXJlIGlzIGFuIGltcGxpZWQgbWF4aW11bSBvZiA3IGJpdHMgZm9yIHRoZSBiaXQgbGVuZ3RoIHRhYmxlIGFuZAorICAgICAgMTUgYml0cyBmb3IgdGhlIGFjdHVhbCBkYXRhLgorICAgNC4gSWYgb25seSBvbmUgY29kZSBleGlzdHMsIHRoZW4gaXQgaXMgZW5jb2RlZCB1c2luZyBvbmUgYml0LiAgKFplcm8KKyAgICAgIHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50LCBidXQgcGVyaGFwcyBhIGxpdHRsZSBjb25mdXNpbmcuKSAgSWYgdHdvCisgICAgICBjb2RlcyBleGlzdCwgdGhleSBhcmUgY29kZWQgdXNpbmcgb25lIGJpdCBlYWNoICgwIGFuZCAxKS4KKyAgIDUuIFRoZXJlIGlzIG5vIHdheSBvZiBzZW5kaW5nIHplcm8gZGlzdGFuY2UgY29kZXMtLWEgZHVtbXkgbXVzdCBiZQorICAgICAgc2VudCBpZiB0aGVyZSBhcmUgbm9uZS4gIChIaXN0b3J5OiBhIHByZSAyLjAgdmVyc2lvbiBvZiBQS1pJUCB3b3VsZAorICAgICAgc3RvcmUgYmxvY2tzIHdpdGggbm8gZGlzdGFuY2UgY29kZXMsIGJ1dCB0aGlzIHdhcyBkaXNjb3ZlcmVkIHRvIGJlCisgICAgICB0b28gaGFyc2ggYSBjcml0ZXJpb24uKSAgVmFsaWQgb25seSBmb3IgMS45M2EuICAyLjA0YyBkb2VzIGFsbG93CisgICAgICB6ZXJvIGRpc3RhbmNlIGNvZGVzLCB3aGljaCBpcyBzZW50IGFzIG9uZSBjb2RlIG9mIHplcm8gYml0cyBpbgorICAgICAgbGVuZ3RoLgorICAgNi4gVGhlcmUgYXJlIHVwIHRvIDI4NiBsaXRlcmFsL2xlbmd0aCBjb2Rlcy4gIENvZGUgMjU2IHJlcHJlc2VudHMgdGhlCisgICAgICBlbmQtb2YtYmxvY2suICBOb3RlIGhvd2V2ZXIgdGhhdCB0aGUgc3RhdGljIGxlbmd0aCB0cmVlIGRlZmluZXMKKyAgICAgIDI4OCBjb2RlcyBqdXN0IHRvIGZpbGwgb3V0IHRoZSBIdWZmbWFuIGNvZGVzLiAgQ29kZXMgMjg2IGFuZCAyODcKKyAgICAgIGNhbm5vdCBiZSB1c2VkIHRob3VnaCwgc2luY2UgdGhlcmUgaXMgbm8gbGVuZ3RoIGJhc2Ugb3IgZXh0cmEgYml0cworICAgICAgZGVmaW5lZCBmb3IgdGhlbS4gIFNpbWlsYXJseSwgdGhlcmUgYXJlIHVwIHRvIDMwIGRpc3RhbmNlIGNvZGVzLgorICAgICAgSG93ZXZlciwgc3RhdGljIHRyZWVzIGRlZmluZSAzMiBjb2RlcyAoYWxsIDUgYml0cykgdG8gZmlsbCBvdXQgdGhlCisgICAgICBIdWZmbWFuIGNvZGVzLCBidXQgdGhlIGxhc3QgdHdvIGhhZCBiZXR0ZXIgbm90IHNob3cgdXAgaW4gdGhlIGRhdGEuCisgICA3LiBVbnppcCBjYW4gY2hlY2sgZHluYW1pYyBIdWZmbWFuIGJsb2NrcyBmb3IgY29tcGxldGUgY29kZSBzZXRzLgorICAgICAgVGhlIGV4Y2VwdGlvbiBpcyB0aGF0IGEgc2luZ2xlIGNvZGUgd291bGQgbm90IGJlIGNvbXBsZXRlIChzZWUgIzQpLgorICAgOC4gVGhlIGZpdmUgYml0cyBmb2xsb3dpbmcgdGhlIGJsb2NrIHR5cGUgaXMgcmVhbGx5IHRoZSBudW1iZXIgb2YKKyAgICAgIGxpdGVyYWwgY29kZXMgc2VudCBtaW51cyAyNTcuCisgICA5LiBMZW5ndGggY29kZXMgOCwxNiwxNiBhcmUgaW50ZXJwcmV0ZWQgYXMgMTMgbGVuZ3RoIGNvZGVzIG9mIDggYml0cworICAgICAgKDErNis2KS4gIFRoZXJlZm9yZSwgdG8gb3V0cHV0IHRocmVlIHRpbWVzIHRoZSBsZW5ndGgsIHlvdSBvdXRwdXQKKyAgICAgIHRocmVlIGNvZGVzICgxKzErMSksIHdoZXJlYXMgdG8gb3V0cHV0IGZvdXIgdGltZXMgdGhlIHNhbWUgbGVuZ3RoLAorICAgICAgeW91IG9ubHkgbmVlZCB0d28gY29kZXMgKDErMykuICBIbW0uCisgIDEwLiBJbiB0aGUgdHJlZSByZWNvbnN0cnVjdGlvbiBhbGdvcml0aG0sIENvZGUgPSBDb2RlICsgSW5jcmVtZW50CisgICAgICBvbmx5IGlmIEJpdExlbmd0aChpKSBpcyBub3QgemVyby4gIChQcmV0dHkgb2J2aW91cy4pCisgIDExLiBDb3JyZWN0aW9uOiA0IEJpdHM6ICMgb2YgQml0IExlbmd0aCBjb2RlcyAtIDQgICAgICg0IC0gMTkpCisgIDEyLiBOb3RlOiBsZW5ndGggY29kZSAyODQgY2FuIHJlcHJlc2VudCAyMjctMjU4LCBidXQgbGVuZ3RoIGNvZGUgMjg1CisgICAgICByZWFsbHkgaXMgMjU4LiAgVGhlIGxhc3QgbGVuZ3RoIGRlc2VydmVzIGl0cyBvd24sIHNob3J0IGNvZGUKKyAgICAgIHNpbmNlIGl0IGdldHMgdXNlZCBhIGxvdCBpbiB2ZXJ5IHJlZHVuZGFudCBmaWxlcy4gIFRoZSBsZW5ndGgKKyAgICAgIDI1OCBpcyBzcGVjaWFsIHNpbmNlIDI1OCAtIDMgKHRoZSBtaW4gbWF0Y2ggbGVuZ3RoKSBpcyAyNTUuCisgIDEzLiBUaGUgbGl0ZXJhbC9sZW5ndGggYW5kIGRpc3RhbmNlIGNvZGUgYml0IGxlbmd0aHMgYXJlIHJlYWQgYXMgYQorICAgICAgc2luZ2xlIHN0cmVhbSBvZiBsZW5ndGhzLiAgSXQgaXMgcG9zc2libGUgKGFuZCBhZHZhbnRhZ2VvdXMpIGZvcgorICAgICAgYSByZXBlYXQgY29kZSAoMTYsIDE3LCBvciAxOCkgdG8gZ28gYWNyb3NzIHRoZSBib3VuZGFyeSBiZXR3ZWVuCisgICAgICB0aGUgdHdvIHNldHMgb2YgbGVuZ3Rocy4KKyAqLworCisjaWZuZGVmIE5PX0RFQ09NUFJFU1NJT04KKworI2luY2x1ZGUgInNoYXJlZC5oIgorCisjaW5jbHVkZSAiZmlsZXN5cy5oIgorCisvKiBzbyB3ZSBjYW4gZGlzYWJsZSBkZWNvbXByZXNzaW9uICAqLworaW50IG5vX2RlY29tcHJlc3Npb24gPSAwOworCisvKiB1c2VkIHRvIHRlbGwgaWYgInJlYWQiIHNob3VsZCBiZSByZWRpcmVjdGVkIHRvICJndW56aXBfcmVhZCIgKi8KK2ludCBjb21wcmVzc2VkX2ZpbGU7CisKKy8qIGludGVybmFsIHZhcmlhYmxlcyBvbmx5ICovCitzdGF0aWMgaW50IGd6aXBfZGF0YV9vZmZzZXQ7CitzdGF0aWMgaW50IGd6aXBfZmlsZXBvczsKK3N0YXRpYyBpbnQgZ3ppcF9maWxlbWF4Oworc3RhdGljIGludCBnemlwX2ZzbWF4Oworc3RhdGljIGludCBzYXZlZF9maWxlcG9zOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ3ppcF9jcmM7CisKKy8qIGludGVybmFsIGV4dHJhIHZhcmlhYmxlcyBmb3IgdXNlIG9mIGluZmxhdGUgY29kZSAqLworc3RhdGljIGludCBibG9ja190eXBlOworc3RhdGljIGludCBibG9ja19sZW47CitzdGF0aWMgaW50IGxhc3RfYmxvY2s7CitzdGF0aWMgaW50IGNvZGVfc3RhdGU7CisKKworLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV90YWJsZXMgKHZvaWQpOworCisvKgorICogIExpbmVhciBhbGxvY2F0b3IuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbGluYWxsb2NfdG9wYWRkcjsKKworc3RhdGljIHZvaWQgKgorbGluYWxsb2MgKGludCBzaXplKQoreworICBsaW5hbGxvY190b3BhZGRyID0gKGxpbmFsbG9jX3RvcGFkZHIgLSBzaXplKSAmIH4zOworICByZXR1cm4gKHZvaWQgKikgbGluYWxsb2NfdG9wYWRkcjsKK30KKworc3RhdGljIHZvaWQKK3Jlc2V0X2xpbmFsbG9jICh2b2lkKQoreworICBsaW5hbGxvY190b3BhZGRyID0gUkFXX0FERFIgKChtYmkubWVtX3VwcGVyIDw8IDEwKSArIDB4MTAwMDAwKTsKK30KKworCisvKiBpbnRlcm5hbCB2YXJpYWJsZSBzd2FwIGZ1bmN0aW9uICovCitzdGF0aWMgdm9pZAorZ3VuemlwX3N3YXBfdmFsdWVzICh2b2lkKQoreworICByZWdpc3RlciBpbnQgaXRtcDsKKworICAvKiBzd2FwIGZpbGVwb3MgKi8KKyAgaXRtcCA9IGZpbGVwb3M7CisgIGZpbGVwb3MgPSBnemlwX2ZpbGVwb3M7CisgIGd6aXBfZmlsZXBvcyA9IGl0bXA7CisKKyAgLyogc3dhcCBmaWxlbWF4ICovCisgIGl0bXAgPSBmaWxlbWF4OworICBmaWxlbWF4ID0gZ3ppcF9maWxlbWF4OworICBnemlwX2ZpbGVtYXggPSBpdG1wOworCisgIC8qIHN3YXAgZnNtYXggKi8KKyAgaXRtcCA9IGZzbWF4OworICBmc21heCA9IGd6aXBfZnNtYXg7CisgIGd6aXBfZnNtYXggPSBpdG1wOworfQorCisKKy8qIGludGVybmFsIGZ1bmN0aW9uIGZvciBlYXRpbmcgdmFyaWFibGUtbGVuZ3RoIGhlYWRlciBmaWVsZHMgKi8KK3N0YXRpYyBpbnQKK2JhZF9maWVsZCAoaW50IGxlbikKK3sKKyAgY2hhciBjaCA9IDE7CisgIGludCBub3RfcmV0dmFsID0gMTsKKworICBkbworICAgIHsKKyAgICAgIGlmIChsZW4gPj0gMCkKKwl7CisJICBpZiAoIShsZW4tLSkpCisJICAgIGJyZWFrOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoIWNoKQorCSAgICBicmVhazsKKwl9CisgICAgfQorICB3aGlsZSAoKG5vdF9yZXR2YWwgPSBncnViX3JlYWQgKCZjaCwgMSkpID09IDEpOworCisgIHJldHVybiAoIW5vdF9yZXR2YWwpOworfQorCisKKy8qIExpdHRsZS1FbmRpYW4gZGVmaW5lcyBmb3IgdGhlIDItYnl0ZSBtYWdpYyBudW1iZXIgZm9yIGd6aXAgZmlsZXMgKi8KKyNkZWZpbmUgR1pJUF9IRFJfTEUgICAgICAweDhCMUYKKyNkZWZpbmUgT0xEX0daSVBfSERSX0xFICAweDlFMUYKKworLyogQ29tcHJlc3Npb24gbWV0aG9kcyAoc2VlIGFsZ29yaXRobS5kb2MpICovCisjZGVmaW5lIFNUT1JFRCAgICAgIDAKKyNkZWZpbmUgQ09NUFJFU1NFRCAgMQorI2RlZmluZSBQQUNLRUQgICAgICAyCisjZGVmaW5lIExaSEVEICAgICAgIDMKKy8qIG1ldGhvZHMgNCB0byA3IHJlc2VydmVkICovCisjZGVmaW5lIERFRkxBVEVEICAgIDgKKyNkZWZpbmUgTUFYX01FVEhPRFMgOQorCisvKiBnemlwIGZsYWcgYnl0ZSAqLworI2RlZmluZSBBU0NJSV9GTEFHICAgMHgwMQkvKiBiaXQgMCBzZXQ6IGZpbGUgcHJvYmFibHkgYXNjaWkgdGV4dCAqLworI2RlZmluZSBDT05USU5VQVRJT04gMHgwMgkvKiBiaXQgMSBzZXQ6IGNvbnRpbnVhdGlvbiBvZiBtdWx0aS1wYXJ0IGd6aXAgZmlsZSAqLworI2RlZmluZSBFWFRSQV9GSUVMRCAgMHgwNAkvKiBiaXQgMiBzZXQ6IGV4dHJhIGZpZWxkIHByZXNlbnQgKi8KKyNkZWZpbmUgT1JJR19OQU1FICAgIDB4MDgJLyogYml0IDMgc2V0OiBvcmlnaW5hbCBmaWxlIG5hbWUgcHJlc2VudCAqLworI2RlZmluZSBDT01NRU5UICAgICAgMHgxMAkvKiBiaXQgNCBzZXQ6IGZpbGUgY29tbWVudCBwcmVzZW50ICovCisjZGVmaW5lIEVOQ1JZUFRFRCAgICAweDIwCS8qIGJpdCA1IHNldDogZmlsZSBpcyBlbmNyeXB0ZWQgKi8KKyNkZWZpbmUgUkVTRVJWRUQgICAgIDB4QzAJLyogYml0IDYsNzogICByZXNlcnZlZCAqLworCisjZGVmaW5lIFVOU1VQUF9GTEFHUyAoQ09OVElOVUFUSU9OfEVOQ1JZUFRFRHxSRVNFUlZFRCkKKworLyogaW5mbGF0ZSBibG9jayBjb2RlcyAqLworI2RlZmluZSBJTkZMQVRFX1NUT1JFRCAgICAwCisjZGVmaW5lIElORkxBVEVfRklYRUQgICAgIDEKKyNkZWZpbmUgSU5GTEFURV9EWU5BTUlDICAgMgorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWNoOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1c2g7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWxnOworCisvKgorICogIFdpbmRvdyBTaXplCisgKgorICogIFRoaXMgbXVzdCBiZSBhIHBvd2VyIG9mIHR3bywgYW5kIGF0IGxlYXN0IDMySyBmb3IgemlwJ3MgZGVmbGF0ZSBtZXRob2QKKyAqLworCisjZGVmaW5lIFdTSVpFIDB4ODAwMAorCisKK2ludAorZ3VuemlwX3Rlc3RfaGVhZGVyICh2b2lkKQoreworICB1bnNpZ25lZCBjaGFyIGJ1ZlsxMF07CisgIAorICAvKiAiY29tcHJlc3NlZF9maWxlIiBpcyBhbHJlYWR5IHJlc2V0IHRvIHplcm8gYnkgdGhpcyBwb2ludCAqLworCisgIC8qCisgICAqICBUaGlzIGNoZWNrcyBpZiB0aGUgZmlsZSBpcyBnemlwcGVkLiAgSWYgYSBwcm9ibGVtIG9jY3VycyBoZXJlCisgICAqICAob3RoZXIgdGhhbiBhIHJlYWwgZXJyb3Igd2l0aCB0aGUgZGlzaykgdGhlbiB3ZSBkb24ndCB0aGluayBpdAorICAgKiAgaXMgYSBjb21wcmVzc2VkIGZpbGUsIGFuZCBzaW1wbHkgbWFyayBpdCBhcyBzdWNoLgorICAgKi8KKyAgaWYgKG5vX2RlY29tcHJlc3Npb24KKyAgICAgIHx8IGdydWJfcmVhZCAoYnVmLCAxMCkgIT0gMTAKKyAgICAgIHx8ICgoKigodW5zaWduZWQgc2hvcnQgKikgYnVmKSAhPSBHWklQX0hEUl9MRSkKKwkgICYmICgqKCh1bnNpZ25lZCBzaG9ydCAqKSBidWYpICE9IE9MRF9HWklQX0hEUl9MRSkpKQorICAgIHsKKyAgICAgIGZpbGVwb3MgPSAwOworICAgICAgcmV0dXJuICEgZXJybnVtOworICAgIH0KKworICAvKgorICAgKiAgVGhpcyBkb2VzIGNvbnNpc3RlbmN5IGNoZWNraW5nIG9uIHRoZSBoZWFkZXIgZGF0YS4gIElmIGEKKyAgICogIHByb2JsZW0gb2NjdXJzIGZyb20gaGVyZSBvbiwgdGhlbiB3ZSBoYXZlIGNvcnJ1cHQgb3Igb3RoZXJ3aXNlCisgICAqICBiYWQgZGF0YSwgYW5kIHRoZSBlcnJvciBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gdGhlIHVzZXIuCisgICAqLworICBpZiAoYnVmWzJdICE9IERFRkxBVEVECisgICAgICB8fCAoYnVmWzNdICYgVU5TVVBQX0ZMQUdTKQorICAgICAgfHwgKChidWZbM10gJiBFWFRSQV9GSUVMRCkKKwkgICYmIChncnViX3JlYWQgKGJ1ZiwgMikgIT0gMgorCSAgICAgIHx8IGJhZF9maWVsZCAoKigodW5zaWduZWQgc2hvcnQgKikgYnVmKSkpKQorICAgICAgfHwgKChidWZbM10gJiBPUklHX05BTUUpICYmIGJhZF9maWVsZCAoLTEpKQorICAgICAgfHwgKChidWZbM10gJiBDT01NRU5UKSAmJiBiYWRfZmllbGQgKC0xKSkpCisgICAgeworICAgICAgaWYgKCEgZXJybnVtKQorCWVycm51bSA9IEVSUl9CQURfR1pJUF9IRUFERVI7CisgICAgICAKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBnemlwX2RhdGFfb2Zmc2V0ID0gZmlsZXBvczsKKyAgCisgIGZpbGVwb3MgPSBmaWxlbWF4IC0gODsKKyAgCisgIGlmIChncnViX3JlYWQgKGJ1ZiwgOCkgIT0gOCkKKyAgICB7CisgICAgICBpZiAoISBlcnJudW0pCisJZXJybnVtID0gRVJSX0JBRF9HWklQX0hFQURFUjsKKyAgICAgIAorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGd6aXBfY3JjID0gKigodW5zaWduZWQgbG9uZyAqKSBidWYpOworICBnemlwX2ZzbWF4ID0gZ3ppcF9maWxlbWF4ID0gKigodW5zaWduZWQgbG9uZyAqKSAoYnVmICsgNCkpOworCisgIGluaXRpYWxpemVfdGFibGVzICgpOworCisgIGNvbXByZXNzZWRfZmlsZSA9IDE7CisgIGd1bnppcF9zd2FwX3ZhbHVlcyAoKTsKKyAgLyoKKyAgICogIE5vdyAiZ3ppcF8qIiB2YWx1ZXMgcmVmZXIgdG8gdGhlIGNvbXByZXNzZWQgZGF0YS4KKyAgICovCisKKyAgZmlsZXBvcyA9IDA7CisKKyAgcmV0dXJuIDE7Cit9CisKKworLyogSHVmZm1hbiBjb2RlIGxvb2t1cCB0YWJsZSBlbnRyeS0tdGhpcyBlbnRyeSBpcyBmb3VyIGJ5dGVzIGZvciBtYWNoaW5lcworICAgdGhhdCBoYXZlIDE2LWJpdCBwb2ludGVycyAoZS5nLiBQQydzIGluIHRoZSBzbWFsbCBvciBtZWRpdW0gbW9kZWwpLgorICAgVmFsaWQgZXh0cmEgYml0cyBhcmUgMC4uMTMuICBlID09IDE1IGlzIEVPQiAoZW5kIG9mIGJsb2NrKSwgZSA9PSAxNgorICAgbWVhbnMgdGhhdCB2IGlzIGEgbGl0ZXJhbCwgMTYgPCBlIDwgMzIgbWVhbnMgdGhhdCB2IGlzIGEgcG9pbnRlciB0bworICAgdGhlIG5leHQgdGFibGUsIHdoaWNoIGNvZGVzIGUgLSAxNiBiaXRzLCBhbmQgbGFzdGx5IGUgPT0gOTkgaW5kaWNhdGVzCisgICBhbiB1bnVzZWQgY29kZS4gIElmIGEgY29kZSB3aXRoIGUgPT0gOTkgaXMgbG9va2VkIHVwLCB0aGlzIGltcGxpZXMgYW4KKyAgIGVycm9yIGluIHRoZSBkYXRhLiAqLworc3RydWN0IGh1ZnQKK3sKKyAgdWNoIGU7CQkJLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgb3Igb3BlcmF0aW9uICovCisgIHVjaCBiOwkJCS8qIG51bWJlciBvZiBiaXRzIGluIHRoaXMgY29kZSBvciBzdWJjb2RlICovCisgIHVuaW9uCisgICAgeworICAgICAgdXNoIG47CQkJLyogbGl0ZXJhbCwgbGVuZ3RoIGJhc2UsIG9yIGRpc3RhbmNlIGJhc2UgKi8KKyAgICAgIHN0cnVjdCBodWZ0ICp0OwkJLyogcG9pbnRlciB0byBuZXh0IGxldmVsIG9mIHRhYmxlICovCisgICAgfQorICB2OworfTsKKworCisvKiBUaGUgaW5mbGF0ZSBhbGdvcml0aG0gdXNlcyBhIHNsaWRpbmcgMzJLIGJ5dGUgd2luZG93IG9uIHRoZSB1bmNvbXByZXNzZWQKKyAgIHN0cmVhbSB0byBmaW5kIHJlcGVhdGVkIGJ5dGUgc3RyaW5ncy4gIFRoaXMgaXMgaW1wbGVtZW50ZWQgaGVyZSBhcyBhCisgICBjaXJjdWxhciBidWZmZXIuICBUaGUgaW5kZXggaXMgdXBkYXRlZCBzaW1wbHkgYnkgaW5jcmVtZW50aW5nIGFuZCB0aGVuCisgICBhbmQnaW5nIHdpdGggMHg3ZmZmICgzMkstMSkuICovCisvKiBJdCBpcyBsZWZ0IHRvIG90aGVyIG1vZHVsZXMgdG8gc3VwcGx5IHRoZSAzMksgYXJlYS4gIEl0IGlzIGFzc3VtZWQKKyAgIHRvIGJlIHVzYWJsZSBhcyBpZiBpdCB3ZXJlIGRlY2xhcmVkICJ1Y2ggc2xpZGVbMzI3NjhdOyIgb3IgYXMganVzdAorICAgInVjaCAqc2xpZGU7IiBhbmQgdGhlbiBtYWxsb2MnZWQgaW4gdGhlIGxhdHRlciBjYXNlLiAgVGhlIGRlZmluaXRpb24KKyAgIG11c3QgYmUgaW4gdW56aXAuaCwgaW5jbHVkZWQgYWJvdmUuICovCisKKworLyogc2xpZGluZyB3aW5kb3cgaW4gdW5jb21wcmVzc2VkIGRhdGEgKi8KK3N0YXRpYyB1Y2ggc2xpZGVbV1NJWkVdOworCisvKiBjdXJyZW50IHBvc2l0aW9uIGluIHNsaWRlICovCitzdGF0aWMgdW5zaWduZWQgd3A7CisKKworLyogVGFibGVzIGZvciBkZWZsYXRlIGZyb20gUEtaSVAncyBhcHBub3RlLnR4dC4gKi8KK3N0YXRpYyB1bnNpZ25lZCBiaXRvcmRlcltdID0KK3sJCQkJLyogT3JkZXIgb2YgdGhlIGJpdCBsZW5ndGggY29kZSBsZW5ndGhzICovCisgIDE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTV9Oworc3RhdGljIHVzaCBjcGxlbnNbXSA9Cit7CQkJCS8qIENvcHkgbGVuZ3RocyBmb3IgbGl0ZXJhbCBjb2RlcyAyNTcuLjI4NSAqLworICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLAorICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMH07CisJLyogbm90ZTogc2VlIG5vdGUgIzEzIGFib3ZlIGFib3V0IHRoZSAyNTggaW4gdGhpcyBsaXN0LiAqLworc3RhdGljIHVzaCBjcGxleHRbXSA9Cit7CQkJCS8qIEV4dHJhIGJpdHMgZm9yIGxpdGVyYWwgY29kZXMgMjU3Li4yODUgKi8KKyAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwKKyAgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNSwgNSwgNSwgNSwgMCwgOTksIDk5fTsJLyogOTk9PWludmFsaWQgKi8KK3N0YXRpYyB1c2ggY3BkaXN0W10gPQorewkJCQkvKiBDb3B5IG9mZnNldHMgZm9yIGRpc3RhbmNlIGNvZGVzIDAuLjI5ICovCisgIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MywKKyAgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LAorICA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3fTsKK3N0YXRpYyB1c2ggY3BkZXh0W10gPQorewkJCQkvKiBFeHRyYSBiaXRzIGZvciBkaXN0YW5jZSBjb2RlcyAqLworICAwLCAwLCAwLCAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LAorICA3LCA3LCA4LCA4LCA5LCA5LCAxMCwgMTAsIDExLCAxMSwKKyAgMTIsIDEyLCAxMywgMTN9OworCisKKy8qCisgICBIdWZmbWFuIGNvZGUgZGVjb2RpbmcgaXMgcGVyZm9ybWVkIHVzaW5nIGEgbXVsdGktbGV2ZWwgdGFibGUgbG9va3VwLgorICAgVGhlIGZhc3Rlc3Qgd2F5IHRvIGRlY29kZSBpcyB0byBzaW1wbHkgYnVpbGQgYSBsb29rdXAgdGFibGUgd2hvc2UKKyAgIHNpemUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbG9uZ2VzdCBjb2RlLiAgSG93ZXZlciwgdGhlIHRpbWUgaXQgdGFrZXMKKyAgIHRvIGJ1aWxkIHRoaXMgdGFibGUgY2FuIGFsc28gYmUgYSBmYWN0b3IgaWYgdGhlIGRhdGEgYmVpbmcgZGVjb2RlZAorICAgaXMgbm90IHZlcnkgbG9uZy4gIFRoZSBtb3N0IGNvbW1vbiBjb2RlcyBhcmUgbmVjZXNzYXJpbHkgdGhlCisgICBzaG9ydGVzdCBjb2Rlcywgc28gdGhvc2UgY29kZXMgZG9taW5hdGUgdGhlIGRlY29kaW5nIHRpbWUsIGFuZCBoZW5jZQorICAgdGhlIHNwZWVkLiAgVGhlIGlkZWEgaXMgeW91IGNhbiBoYXZlIGEgc2hvcnRlciB0YWJsZSB0aGF0IGRlY29kZXMgdGhlCisgICBzaG9ydGVyLCBtb3JlIHByb2JhYmxlIGNvZGVzLCBhbmQgdGhlbiBwb2ludCB0byBzdWJzaWRpYXJ5IHRhYmxlcyBmb3IKKyAgIHRoZSBsb25nZXIgY29kZXMuICBUaGUgdGltZSBpdCBjb3N0cyB0byBkZWNvZGUgdGhlIGxvbmdlciBjb2RlcyBpcworICAgdGhlbiB0cmFkZWQgYWdhaW5zdCB0aGUgdGltZSBpdCB0YWtlcyB0byBtYWtlIGxvbmdlciB0YWJsZXMuCisKKyAgIFRoaXMgcmVzdWx0cyBvZiB0aGlzIHRyYWRlIGFyZSBpbiB0aGUgdmFyaWFibGVzIGxiaXRzIGFuZCBkYml0cworICAgYmVsb3cuICBsYml0cyBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgdGhlIGZpcnN0IGxldmVsIHRhYmxlIGZvciBsaXRlcmFsLworICAgbGVuZ3RoIGNvZGVzIGNhbiBkZWNvZGUgaW4gb25lIHN0ZXAsIGFuZCBkYml0cyBpcyB0aGUgc2FtZSB0aGluZyBmb3IKKyAgIHRoZSBkaXN0YW5jZSBjb2Rlcy4gIFN1YnNlcXVlbnQgdGFibGVzIGFyZSBhbHNvIGxlc3MgdGhhbiBvciBlcXVhbCB0bworICAgdGhvc2Ugc2l6ZXMuICBUaGVzZSB2YWx1ZXMgbWF5IGJlIGFkanVzdGVkIGVpdGhlciB3aGVuIGFsbCBvZiB0aGUKKyAgIGNvZGVzIGFyZSBzaG9ydGVyIHRoYW4gdGhhdCwgaW4gd2hpY2ggY2FzZSB0aGUgbG9uZ2VzdCBjb2RlIGxlbmd0aCBpbgorICAgYml0cyBpcyB1c2VkLCBvciB3aGVuIHRoZSBzaG9ydGVzdCBjb2RlIGlzICpsb25nZXIqIHRoYW4gdGhlIHJlcXVlc3RlZAorICAgdGFibGUgc2l6ZSwgaW4gd2hpY2ggY2FzZSB0aGUgbGVuZ3RoIG9mIHRoZSBzaG9ydGVzdCBjb2RlIGluIGJpdHMgaXMKKyAgIHVzZWQuCisKKyAgIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHZhbHVlcyBmb3IgdGhlIHR3byB0YWJsZXMsIHNpbmNlIHRoZXkgY29kZSBhCisgICBkaWZmZXJlbnQgbnVtYmVyIG9mIHBvc3NpYmlsaXRpZXMgZWFjaC4gIFRoZSBsaXRlcmFsL2xlbmd0aCB0YWJsZQorICAgY29kZXMgMjg2IHBvc3NpYmxlIHZhbHVlcywgb3IgaW4gYSBmbGF0IGNvZGUsIGEgbGl0dGxlIG92ZXIgZWlnaHQKKyAgIGJpdHMuICBUaGUgZGlzdGFuY2UgdGFibGUgY29kZXMgMzAgcG9zc2libGUgdmFsdWVzLCBvciBhIGxpdHRsZSBsZXNzCisgICB0aGFuIGZpdmUgYml0cywgZmxhdC4gIFRoZSBvcHRpbXVtIHZhbHVlcyBmb3Igc3BlZWQgZW5kIHVwIGJlaW5nCisgICBhYm91dCBvbmUgYml0IG1vcmUgdGhhbiB0aG9zZSwgc28gbGJpdHMgaXMgOCsxIGFuZCBkYml0cyBpcyA1KzEuCisgICBUaGUgb3B0aW11bSB2YWx1ZXMgbWF5IGRpZmZlciB0aG91Z2ggZnJvbSBtYWNoaW5lIHRvIG1hY2hpbmUsIGFuZAorICAgcG9zc2libHkgZXZlbiBiZXR3ZWVuIGNvbXBpbGVycy4gIFlvdXIgbWlsZWFnZSBtYXkgdmFyeS4KKyAqLworCisKK3N0YXRpYyBpbnQgbGJpdHMgPSA5OwkJLyogYml0cyBpbiBiYXNlIGxpdGVyYWwvbGVuZ3RoIGxvb2t1cCB0YWJsZSAqLworc3RhdGljIGludCBkYml0cyA9IDY7CQkvKiBiaXRzIGluIGJhc2UgZGlzdGFuY2UgbG9va3VwIHRhYmxlICovCisKKworLyogSWYgQk1BWCBuZWVkcyB0byBiZSBsYXJnZXIgdGhhbiAxNiwgdGhlbiBoIGFuZCB4W10gc2hvdWxkIGJlIHVsZy4gKi8KKyNkZWZpbmUgQk1BWCAxNgkJCS8qIG1heGltdW0gYml0IGxlbmd0aCBvZiBhbnkgY29kZSAoMTYgZm9yIGV4cGxvZGUpICovCisjZGVmaW5lIE5fTUFYIDI4OAkJLyogbWF4aW11bSBudW1iZXIgb2YgY29kZXMgaW4gYW55IHNldCAqLworCisKK3N0YXRpYyB1bnNpZ25lZCBodWZ0czsJCS8qIHRyYWNrIG1lbW9yeSB1c2FnZSAqLworCisKKy8qIE1hY3JvcyBmb3IgaW5mbGF0ZSgpIGJpdCBwZWVraW5nIGFuZCBncmFiYmluZy4KKyAgIFRoZSB1c2FnZSBpczoKKworICAgICAgICBORUVEQklUUyhqKQorICAgICAgICB4ID0gYiAmIG1hc2tfYml0c1tqXTsKKyAgICAgICAgRFVNUEJJVFMoaikKKworICAgd2hlcmUgTkVFREJJVFMgbWFrZXMgc3VyZSB0aGF0IGIgaGFzIGF0IGxlYXN0IGogYml0cyBpbiBpdCwgYW5kCisgICBEVU1QQklUUyByZW1vdmVzIHRoZSBiaXRzIGZyb20gYi4gIFRoZSBtYWNyb3MgdXNlIHRoZSB2YXJpYWJsZSBrCisgICBmb3IgdGhlIG51bWJlciBvZiBiaXRzIGluIGIuICBOb3JtYWxseSwgYiBhbmQgayBhcmUgcmVnaXN0ZXIKKyAgIHZhcmlhYmxlcyBmb3Igc3BlZWQsIGFuZCBhcmUgaW5pdGlhbGl6ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhCisgICByb3V0aW5lIHRoYXQgdXNlcyB0aGVzZSBtYWNyb3MgZnJvbSBhIGdsb2JhbCBiaXQgYnVmZmVyIGFuZCBjb3VudC4KKworICAgSWYgd2UgYXNzdW1lIHRoYXQgRU9CIHdpbGwgYmUgdGhlIGxvbmdlc3QgY29kZSwgdGhlbiB3ZSB3aWxsIG5ldmVyCisgICBhc2sgZm9yIGJpdHMgd2l0aCBORUVEQklUUyB0aGF0IGFyZSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLgorICAgU28sIE5FRURCSVRTIHNob3VsZCBub3QgcmVhZCBhbnkgbW9yZSBieXRlcyB0aGFuIGFyZSBuZWVkZWQgdG8KKyAgIG1lZXQgdGhlIHJlcXVlc3QuICBUaGVuIG5vIGJ5dGVzIG5lZWQgdG8gYmUgInJldHVybmVkIiB0byB0aGUgYnVmZmVyCisgICBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IGJsb2NrLgorCisgICBIb3dldmVyLCB0aGlzIGFzc3VtcHRpb24gaXMgbm90IHRydWUgZm9yIGZpeGVkIGJsb2Nrcy0tdGhlIEVPQiBjb2RlCisgICBpcyA3IGJpdHMsIGJ1dCB0aGUgb3RoZXIgbGl0ZXJhbC9sZW5ndGggY29kZXMgY2FuIGJlIDggb3IgOSBiaXRzLgorICAgKFRoZSBFT0IgY29kZSBpcyBzaG9ydGVyIHRoYW4gb3RoZXIgY29kZXMgYmVjYXVzZSBmaXhlZCBibG9ja3MgYXJlCisgICBnZW5lcmFsbHkgc2hvcnQuICBTbywgd2hpbGUgYSBibG9jayBhbHdheXMgaGFzIGFuIEVPQiwgbWFueSBvdGhlcgorICAgbGl0ZXJhbC9sZW5ndGggY29kZXMgaGF2ZSBhIHNpZ25pZmljYW50bHkgbG93ZXIgcHJvYmFiaWxpdHkgb2YKKyAgIHNob3dpbmcgdXAgYXQgYWxsLikgIEhvd2V2ZXIsIGJ5IG1ha2luZyB0aGUgZmlyc3QgdGFibGUgaGF2ZSBhCisgICBsb29rdXAgb2Ygc2V2ZW4gYml0cywgdGhlIEVPQiBjb2RlIHdpbGwgYmUgZm91bmQgaW4gdGhhdCBmaXJzdAorICAgbG9va3VwLCBhbmQgc28gd2lsbCBub3QgcmVxdWlyZSB0aGF0IHRvbyBtYW55IGJpdHMgYmUgcHVsbGVkIGZyb20KKyAgIHRoZSBzdHJlYW0uCisgKi8KKworc3RhdGljIHVsZyBiYjsJCQkvKiBiaXQgYnVmZmVyICovCitzdGF0aWMgdW5zaWduZWQgYms7CQkvKiBiaXRzIGluIGJpdCBidWZmZXIgKi8KKworc3RhdGljIHVzaCBtYXNrX2JpdHNbXSA9Cit7CisgIDB4MDAwMCwKKyAgMHgwMDAxLCAweDAwMDMsIDB4MDAwNywgMHgwMDBmLCAweDAwMWYsIDB4MDAzZiwgMHgwMDdmLCAweDAwZmYsCisgIDB4MDFmZiwgMHgwM2ZmLCAweDA3ZmYsIDB4MGZmZiwgMHgxZmZmLCAweDNmZmYsIDB4N2ZmZiwgMHhmZmZmCit9OworCisjZGVmaW5lIE5FRURCSVRTKG4pIGRvIHt3aGlsZShrPChuKSl7Ynw9KCh1bGcpZ2V0X2J5dGUoKSk8PGs7ays9ODt9fSB3aGlsZSAoMCkKKyNkZWZpbmUgRFVNUEJJVFMobikgZG8ge2I+Pj0obik7ay09KG4pO30gd2hpbGUgKDApCisKKyNkZWZpbmUgSU5CVUZTSVogIDB4MjAwMAorCitzdGF0aWMgdWNoIGluYnVmW0lOQlVGU0laXTsKK3N0YXRpYyBpbnQgYnVmbG9jOworCitzdGF0aWMgaW50CitnZXRfYnl0ZSAodm9pZCkKK3sKKyAgaWYgKGZpbGVwb3MgPT0gZ3ppcF9kYXRhX29mZnNldCB8fCBidWZsb2MgPT0gSU5CVUZTSVopCisgICAgeworICAgICAgYnVmbG9jID0gMDsKKyAgICAgIGdydWJfcmVhZCAoaW5idWYsIElOQlVGU0laKTsKKyAgICB9CisKKyAgcmV0dXJuIGluYnVmW2J1ZmxvYysrXTsKK30KKworLyogZGVjb21wcmVzc2lvbiBnbG9iYWwgcG9pbnRlcnMgKi8KK3N0YXRpYyBzdHJ1Y3QgaHVmdCAqdGw7CQkvKiBsaXRlcmFsL2xlbmd0aCBjb2RlIHRhYmxlICovCitzdGF0aWMgc3RydWN0IGh1ZnQgKnRkOwkJLyogZGlzdGFuY2UgY29kZSB0YWJsZSAqLworc3RhdGljIGludCBibDsJCQkvKiBsb29rdXAgYml0cyBmb3IgdGwgKi8KK3N0YXRpYyBpbnQgYmQ7CQkJLyogbG9va3VwIGJpdHMgZm9yIHRkICovCisKKworLyogbW9yZSBmdW5jdGlvbiBwcm90b3R5cGVzICovCitzdGF0aWMgaW50IGh1ZnRfYnVpbGQgKHVuc2lnbmVkICosIHVuc2lnbmVkLCB1bnNpZ25lZCwgdXNoICosIHVzaCAqLAorCQkgICAgICAgc3RydWN0IGh1ZnQgKiosIGludCAqKTsKK3N0YXRpYyBpbnQgaW5mbGF0ZV9jb2Rlc19pbl93aW5kb3cgKHZvaWQpOworCisKKy8qIEdpdmVuIGEgbGlzdCBvZiBjb2RlIGxlbmd0aHMgYW5kIGEgbWF4aW11bSB0YWJsZSBzaXplLCBtYWtlIGEgc2V0IG9mCisgICB0YWJsZXMgdG8gZGVjb2RlIHRoYXQgc2V0IG9mIGNvZGVzLiAgUmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb25lIGlmCisgICB0aGUgZ2l2ZW4gY29kZSBzZXQgaXMgaW5jb21wbGV0ZSAodGhlIHRhYmxlcyBhcmUgc3RpbGwgYnVpbHQgaW4gdGhpcworICAgY2FzZSksIHR3byBpZiB0aGUgaW5wdXQgaXMgaW52YWxpZCAoYWxsIHplcm8gbGVuZ3RoIGNvZGVzIG9yIGFuCisgICBvdmVyc3Vic2NyaWJlZCBzZXQgb2YgbGVuZ3RocyksIGFuZCB0aHJlZSBpZiBub3QgZW5vdWdoIG1lbW9yeS4gKi8KKworc3RhdGljIGludAoraHVmdF9idWlsZCAodW5zaWduZWQgKmIsCS8qIGNvZGUgbGVuZ3RocyBpbiBiaXRzIChhbGwgYXNzdW1lZCA8PSBCTUFYKSAqLworCSAgICB1bnNpZ25lZCBuLAkJLyogbnVtYmVyIG9mIGNvZGVzIChhc3N1bWVkIDw9IE5fTUFYKSAqLworCSAgICB1bnNpZ25lZCBzLAkJLyogbnVtYmVyIG9mIHNpbXBsZS12YWx1ZWQgY29kZXMgKDAuLnMtMSkgKi8KKwkgICAgdXNoICogZCwJCS8qIGxpc3Qgb2YgYmFzZSB2YWx1ZXMgZm9yIG5vbi1zaW1wbGUgY29kZXMgKi8KKwkgICAgdXNoICogZSwJCS8qIGxpc3Qgb2YgZXh0cmEgYml0cyBmb3Igbm9uLXNpbXBsZSBjb2RlcyAqLworCSAgICBzdHJ1Y3QgaHVmdCAqKnQsCS8qIHJlc3VsdDogc3RhcnRpbmcgdGFibGUgKi8KKwkgICAgaW50ICptKQkJLyogbWF4aW11bSBsb29rdXAgYml0cywgcmV0dXJucyBhY3R1YWwgKi8KK3sKKyAgdW5zaWduZWQgYTsJCQkvKiBjb3VudGVyIGZvciBjb2RlcyBvZiBsZW5ndGggayAqLworICB1bnNpZ25lZCBjW0JNQVggKyAxXTsJCS8qIGJpdCBsZW5ndGggY291bnQgdGFibGUgKi8KKyAgdW5zaWduZWQgZjsJCQkvKiBpIHJlcGVhdHMgaW4gdGFibGUgZXZlcnkgZiBlbnRyaWVzICovCisgIGludCBnOwkJCS8qIG1heGltdW0gY29kZSBsZW5ndGggKi8KKyAgaW50IGg7CQkJLyogdGFibGUgbGV2ZWwgKi8KKyAgcmVnaXN0ZXIgdW5zaWduZWQgaTsJCS8qIGNvdW50ZXIsIGN1cnJlbnQgY29kZSAqLworICByZWdpc3RlciB1bnNpZ25lZCBqOwkJLyogY291bnRlciAqLworICByZWdpc3RlciBpbnQgazsJCS8qIG51bWJlciBvZiBiaXRzIGluIGN1cnJlbnQgY29kZSAqLworICBpbnQgbDsJCQkvKiBiaXRzIHBlciB0YWJsZSAocmV0dXJuZWQgaW4gbSkgKi8KKyAgcmVnaXN0ZXIgdW5zaWduZWQgKnA7CQkvKiBwb2ludGVyIGludG8gY1tdLCBiW10sIG9yIHZbXSAqLworICByZWdpc3RlciBzdHJ1Y3QgaHVmdCAqcTsJLyogcG9pbnRzIHRvIGN1cnJlbnQgdGFibGUgKi8KKyAgc3RydWN0IGh1ZnQgcjsJCS8qIHRhYmxlIGVudHJ5IGZvciBzdHJ1Y3R1cmUgYXNzaWdubWVudCAqLworICBzdHJ1Y3QgaHVmdCAqdVtCTUFYXTsJCS8qIHRhYmxlIHN0YWNrICovCisgIHVuc2lnbmVkIHZbTl9NQVhdOwkJLyogdmFsdWVzIGluIG9yZGVyIG9mIGJpdCBsZW5ndGggKi8KKyAgcmVnaXN0ZXIgaW50IHc7CQkvKiBiaXRzIGJlZm9yZSB0aGlzIHRhYmxlID09IChsICogaCkgKi8KKyAgdW5zaWduZWQgeFtCTUFYICsgMV07CQkvKiBiaXQgb2Zmc2V0cywgdGhlbiBjb2RlIHN0YWNrICovCisgIHVuc2lnbmVkICp4cDsJCQkvKiBwb2ludGVyIGludG8geCAqLworICBpbnQgeTsJCQkvKiBudW1iZXIgb2YgZHVtbXkgY29kZXMgYWRkZWQgKi8KKyAgdW5zaWduZWQgejsJCQkvKiBudW1iZXIgb2YgZW50cmllcyBpbiBjdXJyZW50IHRhYmxlICovCisKKyAgLyogR2VuZXJhdGUgY291bnRzIGZvciBlYWNoIGJpdCBsZW5ndGggKi8KKyAgbWVtc2V0ICgoY2hhciAqKSBjLCAwLCBzaXplb2YgKGMpKTsKKyAgcCA9IGI7CisgIGkgPSBuOworICBkbworICAgIHsKKyAgICAgIGNbKnBdKys7CQkJLyogYXNzdW1lIGFsbCBlbnRyaWVzIDw9IEJNQVggKi8KKyAgICAgIHArKzsJCQkvKiBDYW4ndCBjb21iaW5lIHdpdGggYWJvdmUgbGluZSAoU29sYXJpcyBidWcpICovCisgICAgfQorICB3aGlsZSAoLS1pKTsKKyAgaWYgKGNbMF0gPT0gbikJCS8qIG51bGwgaW5wdXQtLWFsbCB6ZXJvIGxlbmd0aCBjb2RlcyAqLworICAgIHsKKyAgICAgICp0ID0gKHN0cnVjdCBodWZ0ICopIE5VTEw7CisgICAgICAqbSA9IDA7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgLyogRmluZCBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCwgYm91bmQgKm0gYnkgdGhvc2UgKi8KKyAgbCA9ICptOworICBmb3IgKGogPSAxOyBqIDw9IEJNQVg7IGorKykKKyAgICBpZiAoY1tqXSkKKyAgICAgIGJyZWFrOworICBrID0gajsJCQkvKiBtaW5pbXVtIGNvZGUgbGVuZ3RoICovCisgIGlmICgodW5zaWduZWQpIGwgPCBqKQorICAgIGwgPSBqOworICBmb3IgKGkgPSBCTUFYOyBpOyBpLS0pCisgICAgaWYgKGNbaV0pCisgICAgICBicmVhazsKKyAgZyA9IGk7CQkJLyogbWF4aW11bSBjb2RlIGxlbmd0aCAqLworICBpZiAoKHVuc2lnbmVkKSBsID4gaSkKKyAgICBsID0gaTsKKyAgKm0gPSBsOworCisgIC8qIEFkanVzdCBsYXN0IGxlbmd0aCBjb3VudCB0byBmaWxsIG91dCBjb2RlcywgaWYgbmVlZGVkICovCisgIGZvciAoeSA9IDEgPDwgajsgaiA8IGk7IGorKywgeSA8PD0gMSkKKyAgICBpZiAoKHkgLT0gY1tqXSkgPCAwKQorICAgICAgcmV0dXJuIDI7CQkJLyogYmFkIGlucHV0OiBtb3JlIGNvZGVzIHRoYW4gYml0cyAqLworICBpZiAoKHkgLT0gY1tpXSkgPCAwKQorICAgIHJldHVybiAyOworICBjW2ldICs9IHk7CisKKyAgLyogR2VuZXJhdGUgc3RhcnRpbmcgb2Zmc2V0cyBpbnRvIHRoZSB2YWx1ZSB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi8KKyAgeFsxXSA9IGogPSAwOworICBwID0gYyArIDE7CisgIHhwID0geCArIDI7CisgIHdoaWxlICgtLWkpCisgICAgewkJCQkvKiBub3RlIHRoYXQgaSA9PSBnIGZyb20gYWJvdmUgKi8KKyAgICAgICp4cCsrID0gKGogKz0gKnArKyk7CisgICAgfQorCisgIC8qIE1ha2UgYSB0YWJsZSBvZiB2YWx1ZXMgaW4gb3JkZXIgb2YgYml0IGxlbmd0aHMgKi8KKyAgcCA9IGI7CisgIGkgPSAwOworICBkbworICAgIHsKKyAgICAgIGlmICgoaiA9ICpwKyspICE9IDApCisJdlt4W2pdKytdID0gaTsKKyAgICB9CisgIHdoaWxlICgrK2kgPCBuKTsKKworICAvKiBHZW5lcmF0ZSB0aGUgSHVmZm1hbiBjb2RlcyBhbmQgZm9yIGVhY2gsIG1ha2UgdGhlIHRhYmxlIGVudHJpZXMgKi8KKyAgeFswXSA9IGkgPSAwOwkJCS8qIGZpcnN0IEh1ZmZtYW4gY29kZSBpcyB6ZXJvICovCisgIHAgPSB2OwkJCS8qIGdyYWIgdmFsdWVzIGluIGJpdCBvcmRlciAqLworICBoID0gLTE7CQkJLyogbm8gdGFibGVzIHlldC0tbGV2ZWwgLTEgKi8KKyAgdyA9IC1sOwkJCS8qIGJpdHMgZGVjb2RlZCA9PSAobCAqIGgpICovCisgIHVbMF0gPSAoc3RydWN0IGh1ZnQgKikgTlVMTDsJLyoganVzdCB0byBrZWVwIGNvbXBpbGVycyBoYXBweSAqLworICBxID0gKHN0cnVjdCBodWZ0ICopIE5VTEw7CS8qIGRpdHRvICovCisgIHogPSAwOwkJCS8qIGRpdHRvICovCisKKyAgLyogZ28gdGhyb3VnaCB0aGUgYml0IGxlbmd0aHMgKGsgYWxyZWFkeSBpcyBiaXRzIGluIHNob3J0ZXN0IGNvZGUpICovCisgIGZvciAoOyBrIDw9IGc7IGsrKykKKyAgICB7CisgICAgICBhID0gY1trXTsKKyAgICAgIHdoaWxlIChhLS0pCisJeworCSAgLyogaGVyZSBpIGlzIHRoZSBIdWZmbWFuIGNvZGUgb2YgbGVuZ3RoIGsgYml0cyBmb3IgdmFsdWUgKnAgKi8KKwkgIC8qIG1ha2UgdGFibGVzIHVwIHRvIHJlcXVpcmVkIGxldmVsICovCisJICB3aGlsZSAoayA+IHcgKyBsKQorCSAgICB7CisJICAgICAgaCsrOworCSAgICAgIHcgKz0gbDsJCS8qIHByZXZpb3VzIHRhYmxlIGFsd2F5cyBsIGJpdHMgKi8KKworCSAgICAgIC8qIGNvbXB1dGUgbWluaW11bSBzaXplIHRhYmxlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBsIGJpdHMgKi8KKwkgICAgICB6ID0gKHogPSBnIC0gdykgPiAodW5zaWduZWQpIGwgPyBsIDogejsJLyogdXBwZXIgbGltaXQgb24gdGFibGUgc2l6ZSAqLworCSAgICAgIGlmICgoZiA9IDEgPDwgKGogPSBrIC0gdykpID4gYSArIDEpCS8qIHRyeSBhIGstdyBiaXQgdGFibGUgKi8KKwkJewkJLyogdG9vIGZldyBjb2RlcyBmb3Igay13IGJpdCB0YWJsZSAqLworCQkgIGYgLT0gYSArIDE7CS8qIGRlZHVjdCBjb2RlcyBmcm9tIHBhdHRlcm5zIGxlZnQgKi8KKwkJICB4cCA9IGMgKyBrOworCQkgIHdoaWxlICgrK2ogPCB6KQkvKiB0cnkgc21hbGxlciB0YWJsZXMgdXAgdG8geiBiaXRzICovCisJCSAgICB7CisJCSAgICAgIGlmICgoZiA8PD0gMSkgPD0gKisreHApCisJCQlicmVhazsJLyogZW5vdWdoIGNvZGVzIHRvIHVzZSB1cCBqIGJpdHMgKi8KKwkJICAgICAgZiAtPSAqeHA7CS8qIGVsc2UgZGVkdWN0IGNvZGVzIGZyb20gcGF0dGVybnMgKi8KKwkJICAgIH0KKwkJfQorCSAgICAgIHogPSAxIDw8IGo7CS8qIHRhYmxlIGVudHJpZXMgZm9yIGotYml0IHRhYmxlICovCisKKwkgICAgICAvKiBhbGxvY2F0ZSBhbmQgbGluayBpbiBuZXcgdGFibGUgKi8KKwkgICAgICBxID0gKHN0cnVjdCBodWZ0ICopIGxpbmFsbG9jICgoeiArIDEpICogc2l6ZW9mIChzdHJ1Y3QgaHVmdCkpOworCisJICAgICAgaHVmdHMgKz0geiArIDE7CS8qIHRyYWNrIG1lbW9yeSB1c2FnZSAqLworCSAgICAgICp0ID0gcSArIDE7CS8qIGxpbmsgdG8gbGlzdCBmb3IgaHVmdF9mcmVlKCkgKi8KKwkgICAgICAqKHQgPSAmKHEtPnYudCkpID0gKHN0cnVjdCBodWZ0ICopIE5VTEw7CisJICAgICAgdVtoXSA9ICsrcTsJLyogdGFibGUgc3RhcnRzIGFmdGVyIGxpbmsgKi8KKworCSAgICAgIC8qIGNvbm5lY3QgdG8gbGFzdCB0YWJsZSwgaWYgdGhlcmUgaXMgb25lICovCisJICAgICAgaWYgKGgpCisJCXsKKwkJICB4W2hdID0gaTsJLyogc2F2ZSBwYXR0ZXJuIGZvciBiYWNraW5nIHVwICovCisJCSAgci5iID0gKHVjaCkgbDsJLyogYml0cyB0byBkdW1wIGJlZm9yZSB0aGlzIHRhYmxlICovCisJCSAgci5lID0gKHVjaCkgKDE2ICsgaik7CQkvKiBiaXRzIGluIHRoaXMgdGFibGUgKi8KKwkJICByLnYudCA9IHE7CS8qIHBvaW50ZXIgdG8gdGhpcyB0YWJsZSAqLworCQkgIGogPSBpID4+ICh3IC0gbCk7CS8qIChnZXQgYXJvdW5kIFR1cmJvIEMgYnVnKSAqLworCQkgIHVbaCAtIDFdW2pdID0gcjsJLyogY29ubmVjdCB0byBsYXN0IHRhYmxlICovCisJCX0KKwkgICAgfQorCisJICAvKiBzZXQgdXAgdGFibGUgZW50cnkgaW4gciAqLworCSAgci5iID0gKHVjaCkgKGsgLSB3KTsKKwkgIGlmIChwID49IHYgKyBuKQorCSAgICByLmUgPSA5OTsJCS8qIG91dCBvZiB2YWx1ZXMtLWludmFsaWQgY29kZSAqLworCSAgZWxzZSBpZiAoKnAgPCBzKQorCSAgICB7CisJICAgICAgci5lID0gKHVjaCkgKCpwIDwgMjU2ID8gMTYgOiAxNSk7CQkvKiAyNTYgaXMgZW5kLW9mLWJsb2NrIGNvZGUgKi8KKwkgICAgICByLnYubiA9ICh1c2gpICgqcCk7CS8qIHNpbXBsZSBjb2RlIGlzIGp1c3QgdGhlIHZhbHVlICovCisJICAgICAgcCsrOwkJLyogb25lIGNvbXBpbGVyIGRvZXMgbm90IGxpa2UgKnArKyAqLworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICByLmUgPSAodWNoKSBlWypwIC0gc107CS8qIG5vbi1zaW1wbGUtLWxvb2sgdXAgaW4gbGlzdHMgKi8KKwkgICAgICByLnYubiA9IGRbKnArKyAtIHNdOworCSAgICB9CisKKwkgIC8qIGZpbGwgY29kZS1saWtlIGVudHJpZXMgd2l0aCByICovCisJICBmID0gMSA8PCAoayAtIHcpOworCSAgZm9yIChqID0gaSA+PiB3OyBqIDwgejsgaiArPSBmKQorCSAgICBxW2pdID0gcjsKKworCSAgLyogYmFja3dhcmRzIGluY3JlbWVudCB0aGUgay1iaXQgY29kZSBpICovCisJICBmb3IgKGogPSAxIDw8IChrIC0gMSk7IGkgJiBqOyBqID4+PSAxKQorCSAgICBpIF49IGo7CisJICBpIF49IGo7CisKKwkgIC8qIGJhY2t1cCBvdmVyIGZpbmlzaGVkIHRhYmxlcyAqLworCSAgd2hpbGUgKChpICYgKCgxIDw8IHcpIC0gMSkpICE9IHhbaF0pCisJICAgIHsKKwkgICAgICBoLS07CQkvKiBkb24ndCBuZWVkIHRvIHVwZGF0ZSBxICovCisJICAgICAgdyAtPSBsOworCSAgICB9CisJfQorICAgIH0KKworICAvKiBSZXR1cm4gdHJ1ZSAoMSkgaWYgd2Ugd2VyZSBnaXZlbiBhbiBpbmNvbXBsZXRlIHRhYmxlICovCisgIHJldHVybiB5ICE9IDAgJiYgZyAhPSAxOworfQorCisKKy8qCisgKiAgaW5mbGF0ZSAoZGVjb21wcmVzcykgdGhlIGNvZGVzIGluIGEgZGVmbGF0ZWQgKGNvbXByZXNzZWQpIGJsb2NrLgorICogIFJldHVybiBhbiBlcnJvciBjb2RlIG9yIHplcm8gaWYgaXQgYWxsIGdvZXMgb2suCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGluZmxhdGVfbiwgaW5mbGF0ZV9kOworCitzdGF0aWMgaW50CitpbmZsYXRlX2NvZGVzX2luX3dpbmRvdyAodm9pZCkKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgZTsJCS8qIHRhYmxlIGVudHJ5IGZsYWcvbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi8KKyAgdW5zaWduZWQgbiwgZDsJCS8qIGxlbmd0aCBhbmQgaW5kZXggZm9yIGNvcHkgKi8KKyAgdW5zaWduZWQgdzsJCQkvKiBjdXJyZW50IHdpbmRvdyBwb3NpdGlvbiAqLworICBzdHJ1Y3QgaHVmdCAqdDsJCS8qIHBvaW50ZXIgdG8gdGFibGUgZW50cnkgKi8KKyAgdW5zaWduZWQgbWwsIG1kOwkJLyogbWFza3MgZm9yIGJsIGFuZCBiZCBiaXRzICovCisgIHJlZ2lzdGVyIHVsZyBiOwkJLyogYml0IGJ1ZmZlciAqLworICByZWdpc3RlciB1bnNpZ25lZCBrOwkJLyogbnVtYmVyIG9mIGJpdHMgaW4gYml0IGJ1ZmZlciAqLworCisgIC8qIG1ha2UgbG9jYWwgY29waWVzIG9mIGdsb2JhbHMgKi8KKyAgZCA9IGluZmxhdGVfZDsKKyAgbiA9IGluZmxhdGVfbjsKKyAgYiA9IGJiOwkJCS8qIGluaXRpYWxpemUgYml0IGJ1ZmZlciAqLworICBrID0gYms7CisgIHcgPSB3cDsJCQkvKiBpbml0aWFsaXplIHdpbmRvdyBwb3NpdGlvbiAqLworCisgIC8qIGluZmxhdGUgdGhlIGNvZGVkIGRhdGEgKi8KKyAgbWwgPSBtYXNrX2JpdHNbYmxdOwkJLyogcHJlY29tcHV0ZSBtYXNrcyBmb3Igc3BlZWQgKi8KKyAgbWQgPSBtYXNrX2JpdHNbYmRdOworICBmb3IgKDs7KQkJCS8qIGRvIHVudGlsIGVuZCBvZiBibG9jayAqLworICAgIHsKKyAgICAgIGlmICghY29kZV9zdGF0ZSkKKwl7CisJICBORUVEQklUUyAoKHVuc2lnbmVkKSBibCk7CisJICBpZiAoKGUgPSAodCA9IHRsICsgKCh1bnNpZ25lZCkgYiAmIG1sKSktPmUpID4gMTYpCisJICAgIGRvCisJICAgICAgeworCQlpZiAoZSA9PSA5OSkKKwkJICB7CisJCSAgICBlcnJudW0gPSBFUlJfQkFEX0daSVBfREFUQTsKKwkJICAgIHJldHVybiAwOworCQkgIH0KKwkJRFVNUEJJVFMgKHQtPmIpOworCQllIC09IDE2OworCQlORUVEQklUUyAoZSk7CisJICAgICAgfQorCSAgICB3aGlsZSAoKGUgPSAodCA9IHQtPnYudCArICgodW5zaWduZWQpIGIgJiBtYXNrX2JpdHNbZV0pKS0+ZSkgPiAxNik7CisJICBEVU1QQklUUyAodC0+Yik7CisKKwkgIGlmIChlID09IDE2KQkJLyogdGhlbiBpdCdzIGEgbGl0ZXJhbCAqLworCSAgICB7CisJICAgICAgc2xpZGVbdysrXSA9ICh1Y2gpIHQtPnYubjsKKwkgICAgICBpZiAodyA9PSBXU0laRSkKKwkJYnJlYWs7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgLyogaXQncyBhbiBFT0Igb3IgYSBsZW5ndGggKi8KKwkgICAgeworCSAgICAgIC8qIGV4aXQgaWYgZW5kIG9mIGJsb2NrICovCisJICAgICAgaWYgKGUgPT0gMTUpCisJCXsKKwkJICBibG9ja19sZW4gPSAwOworCQkgIGJyZWFrOworCQl9CisKKwkgICAgICAvKiBnZXQgbGVuZ3RoIG9mIGJsb2NrIHRvIGNvcHkgKi8KKwkgICAgICBORUVEQklUUyAoZSk7CisJICAgICAgbiA9IHQtPnYubiArICgodW5zaWduZWQpIGIgJiBtYXNrX2JpdHNbZV0pOworCSAgICAgIERVTVBCSVRTIChlKTsKKworCSAgICAgIC8qIGRlY29kZSBkaXN0YW5jZSBvZiBibG9jayB0byBjb3B5ICovCisJICAgICAgTkVFREJJVFMgKCh1bnNpZ25lZCkgYmQpOworCSAgICAgIGlmICgoZSA9ICh0ID0gdGQgKyAoKHVuc2lnbmVkKSBiICYgbWQpKS0+ZSkgPiAxNikKKwkJZG8KKwkJICB7CisJCSAgICBpZiAoZSA9PSA5OSkKKwkJICAgICAgeworCQkJZXJybnVtID0gRVJSX0JBRF9HWklQX0RBVEE7CisJCQlyZXR1cm4gMDsKKwkJICAgICAgfQorCQkgICAgRFVNUEJJVFMgKHQtPmIpOworCQkgICAgZSAtPSAxNjsKKwkJICAgIE5FRURCSVRTIChlKTsKKwkJICB9CisJCXdoaWxlICgoZSA9ICh0ID0gdC0+di50ICsgKCh1bnNpZ25lZCkgYiAmIG1hc2tfYml0c1tlXSkpLT5lKQorCQkgICAgICAgPiAxNik7CisJICAgICAgRFVNUEJJVFMgKHQtPmIpOworCSAgICAgIE5FRURCSVRTIChlKTsKKwkgICAgICBkID0gdyAtIHQtPnYubiAtICgodW5zaWduZWQpIGIgJiBtYXNrX2JpdHNbZV0pOworCSAgICAgIERVTVBCSVRTIChlKTsKKwkgICAgICBjb2RlX3N0YXRlKys7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChjb2RlX3N0YXRlKQorCXsKKwkgIC8qIGRvIHRoZSBjb3B5ICovCisJICBkbworCSAgICB7CisJICAgICAgbiAtPSAoZSA9IChlID0gV1NJWkUgLSAoKGQgJj0gV1NJWkUgLSAxKSA+IHcgPyBkIDogdykpID4gbiA/IG4KKwkJICAgIDogZSk7CisJICAgICAgaWYgKHcgLSBkID49IGUpCisJCXsKKwkJICBtZW1tb3ZlIChzbGlkZSArIHcsIHNsaWRlICsgZCwgZSk7CisJCSAgdyArPSBlOworCQkgIGQgKz0gZTsKKwkJfQorCSAgICAgIGVsc2UKKwkJLyogcHVycG9zZWZ1bGx5IHVzZSB0aGUgb3ZlcmxhcCBmb3IgZXh0cmEgY29waWVzIGhlcmUhISAqLworCQl7CisJCSAgd2hpbGUgKGUtLSkKKwkJICAgIHNsaWRlW3crK10gPSBzbGlkZVtkKytdOworCQl9CisJICAgICAgaWYgKHcgPT0gV1NJWkUpCisJCWJyZWFrOworCSAgICB9CisJICB3aGlsZSAobik7CisKKwkgIGlmICghbikKKwkgICAgY29kZV9zdGF0ZS0tOworCisJICAvKiBkaWQgd2UgYnJlYWsgZnJvbSB0aGUgbG9vcCB0b28gc29vbj8gKi8KKwkgIGlmICh3ID09IFdTSVpFKQorCSAgICBicmVhazsKKwl9CisgICAgfQorCisgIC8qIHJlc3RvcmUgdGhlIGdsb2JhbHMgZnJvbSB0aGUgbG9jYWxzICovCisgIGluZmxhdGVfZCA9IGQ7CisgIGluZmxhdGVfbiA9IG47CisgIHdwID0gdzsJCQkvKiByZXN0b3JlIGdsb2JhbCB3aW5kb3cgcG9pbnRlciAqLworICBiYiA9IGI7CQkJLyogcmVzdG9yZSBnbG9iYWwgYml0IGJ1ZmZlciAqLworICBiayA9IGs7CisKKyAgcmV0dXJuICFibG9ja19sZW47Cit9CisKKworLyogZ2V0IGhlYWRlciBmb3IgYW4gaW5mbGF0ZWQgdHlwZSAwIChzdG9yZWQpIGJsb2NrLiAqLworCitzdGF0aWMgdm9pZAoraW5pdF9zdG9yZWRfYmxvY2sgKHZvaWQpCit7CisgIHJlZ2lzdGVyIHVsZyBiOwkJLyogYml0IGJ1ZmZlciAqLworICByZWdpc3RlciB1bnNpZ25lZCBrOwkJLyogbnVtYmVyIG9mIGJpdHMgaW4gYml0IGJ1ZmZlciAqLworCisgIC8qIG1ha2UgbG9jYWwgY29waWVzIG9mIGdsb2JhbHMgKi8KKyAgYiA9IGJiOwkJCS8qIGluaXRpYWxpemUgYml0IGJ1ZmZlciAqLworICBrID0gYms7CisKKyAgLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqLworICBEVU1QQklUUyAoayAmIDcpOworCisgIC8qIGdldCB0aGUgbGVuZ3RoIGFuZCBpdHMgY29tcGxlbWVudCAqLworICBORUVEQklUUyAoMTYpOworICBibG9ja19sZW4gPSAoKHVuc2lnbmVkKSBiICYgMHhmZmZmKTsKKyAgRFVNUEJJVFMgKDE2KTsKKyAgTkVFREJJVFMgKDE2KTsKKyAgaWYgKGJsb2NrX2xlbiAhPSAodW5zaWduZWQpICgofmIpICYgMHhmZmZmKSkKKyAgICBlcnJudW0gPSBFUlJfQkFEX0daSVBfREFUQTsKKyAgRFVNUEJJVFMgKDE2KTsKKworICAvKiByZXN0b3JlIGdsb2JhbCB2YXJpYWJsZXMgKi8KKyAgYmIgPSBiOworICBiayA9IGs7Cit9CisKKworLyogZ2V0IGhlYWRlciBmb3IgYW4gaW5mbGF0ZWQgdHlwZSAxIChmaXhlZCBIdWZmbWFuIGNvZGVzKSBibG9jay4gIFdlIHNob3VsZAorICAgZWl0aGVyIHJlcGxhY2UgdGhpcyB3aXRoIGEgY3VzdG9tIGRlY29kZXIsIG9yIGF0IGxlYXN0IHByZWNvbXB1dGUgdGhlCisgICBIdWZmbWFuIHRhYmxlcy4gKi8KKworc3RhdGljIHZvaWQKK2luaXRfZml4ZWRfYmxvY2sgKCkKK3sKKyAgaW50IGk7CQkJLyogdGVtcG9yYXJ5IHZhcmlhYmxlICovCisgIHVuc2lnbmVkIGxbMjg4XTsJCS8qIGxlbmd0aCBsaXN0IGZvciBodWZ0X2J1aWxkICovCisKKyAgLyogc2V0IHVwIGxpdGVyYWwgdGFibGUgKi8KKyAgZm9yIChpID0gMDsgaSA8IDE0NDsgaSsrKQorICAgIGxbaV0gPSA4OworICBmb3IgKDsgaSA8IDI1NjsgaSsrKQorICAgIGxbaV0gPSA5OworICBmb3IgKDsgaSA8IDI4MDsgaSsrKQorICAgIGxbaV0gPSA3OworICBmb3IgKDsgaSA8IDI4ODsgaSsrKQkJLyogbWFrZSBhIGNvbXBsZXRlLCBidXQgd3JvbmcgY29kZSBzZXQgKi8KKyAgICBsW2ldID0gODsKKyAgYmwgPSA3OworICBpZiAoKGkgPSBodWZ0X2J1aWxkIChsLCAyODgsIDI1NywgY3BsZW5zLCBjcGxleHQsICZ0bCwgJmJsKSkgIT0gMCkKKyAgICB7CisgICAgICBlcnJudW0gPSBFUlJfQkFEX0daSVBfREFUQTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogc2V0IHVwIGRpc3RhbmNlIHRhYmxlICovCisgIGZvciAoaSA9IDA7IGkgPCAzMDsgaSsrKQkvKiBtYWtlIGFuIGluY29tcGxldGUgY29kZSBzZXQgKi8KKyAgICBsW2ldID0gNTsKKyAgYmQgPSA1OworICBpZiAoKGkgPSBodWZ0X2J1aWxkIChsLCAzMCwgMCwgY3BkaXN0LCBjcGRleHQsICZ0ZCwgJmJkKSkgPiAxKQorICAgIHsKKyAgICAgIGVycm51bSA9IEVSUl9CQURfR1pJUF9EQVRBOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBpbmRpY2F0ZSB3ZSdyZSBub3cgd29ya2luZyBvbiBhIGJsb2NrICovCisgIGNvZGVfc3RhdGUgPSAwOworICBibG9ja19sZW4rKzsKK30KKworCisvKiBnZXQgaGVhZGVyIGZvciBhbiBpbmZsYXRlZCB0eXBlIDIgKGR5bmFtaWMgSHVmZm1hbiBjb2RlcykgYmxvY2suICovCisKK3N0YXRpYyB2b2lkCitpbml0X2R5bmFtaWNfYmxvY2sgKHZvaWQpCit7CisgIGludCBpOwkJCS8qIHRlbXBvcmFyeSB2YXJpYWJsZXMgKi8KKyAgdW5zaWduZWQgajsKKyAgdW5zaWduZWQgbDsJCQkvKiBsYXN0IGxlbmd0aCAqLworICB1bnNpZ25lZCBtOwkJCS8qIG1hc2sgZm9yIGJpdCBsZW5ndGhzIHRhYmxlICovCisgIHVuc2lnbmVkIG47CQkJLyogbnVtYmVyIG9mIGxlbmd0aHMgdG8gZ2V0ICovCisgIHVuc2lnbmVkIG5iOwkJCS8qIG51bWJlciBvZiBiaXQgbGVuZ3RoIGNvZGVzICovCisgIHVuc2lnbmVkIG5sOwkJCS8qIG51bWJlciBvZiBsaXRlcmFsL2xlbmd0aCBjb2RlcyAqLworICB1bnNpZ25lZCBuZDsJCQkvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi8KKyAgdW5zaWduZWQgbGxbMjg2ICsgMzBdOwkvKiBsaXRlcmFsL2xlbmd0aCBhbmQgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovCisgIHJlZ2lzdGVyIHVsZyBiOwkJLyogYml0IGJ1ZmZlciAqLworICByZWdpc3RlciB1bnNpZ25lZCBrOwkJLyogbnVtYmVyIG9mIGJpdHMgaW4gYml0IGJ1ZmZlciAqLworCisgIC8qIG1ha2UgbG9jYWwgYml0IGJ1ZmZlciAqLworICBiID0gYmI7CisgIGsgPSBiazsKKworICAvKiByZWFkIGluIHRhYmxlIGxlbmd0aHMgKi8KKyAgTkVFREJJVFMgKDUpOworICBubCA9IDI1NyArICgodW5zaWduZWQpIGIgJiAweDFmKTsJLyogbnVtYmVyIG9mIGxpdGVyYWwvbGVuZ3RoIGNvZGVzICovCisgIERVTVBCSVRTICg1KTsKKyAgTkVFREJJVFMgKDUpOworICBuZCA9IDEgKyAoKHVuc2lnbmVkKSBiICYgMHgxZik7CS8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqLworICBEVU1QQklUUyAoNSk7CisgIE5FRURCSVRTICg0KTsKKyAgbmIgPSA0ICsgKCh1bnNpZ25lZCkgYiAmIDB4Zik7CS8qIG51bWJlciBvZiBiaXQgbGVuZ3RoIGNvZGVzICovCisgIERVTVBCSVRTICg0KTsKKyAgaWYgKG5sID4gMjg2IHx8IG5kID4gMzApCisgICAgeworICAgICAgZXJybnVtID0gRVJSX0JBRF9HWklQX0RBVEE7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIHJlYWQgaW4gYml0LWxlbmd0aC1jb2RlIGxlbmd0aHMgKi8KKyAgZm9yIChqID0gMDsgaiA8IG5iOyBqKyspCisgICAgeworICAgICAgTkVFREJJVFMgKDMpOworICAgICAgbGxbYml0b3JkZXJbal1dID0gKHVuc2lnbmVkKSBiICYgNzsKKyAgICAgIERVTVBCSVRTICgzKTsKKyAgICB9CisgIGZvciAoOyBqIDwgMTk7IGorKykKKyAgICBsbFtiaXRvcmRlcltqXV0gPSAwOworCisgIC8qIGJ1aWxkIGRlY29kaW5nIHRhYmxlIGZvciB0cmVlcy0tc2luZ2xlIGxldmVsLCA3IGJpdCBsb29rdXAgKi8KKyAgYmwgPSA3OworICBpZiAoKGkgPSBodWZ0X2J1aWxkIChsbCwgMTksIDE5LCBOVUxMLCBOVUxMLCAmdGwsICZibCkpICE9IDApCisgICAgeworICAgICAgZXJybnVtID0gRVJSX0JBRF9HWklQX0RBVEE7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIHJlYWQgaW4gbGl0ZXJhbCBhbmQgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovCisgIG4gPSBubCArIG5kOworICBtID0gbWFza19iaXRzW2JsXTsKKyAgaSA9IGwgPSAwOworICB3aGlsZSAoKHVuc2lnbmVkKSBpIDwgbikKKyAgICB7CisgICAgICBORUVEQklUUyAoKHVuc2lnbmVkKSBibCk7CisgICAgICBqID0gKHRkID0gdGwgKyAoKHVuc2lnbmVkKSBiICYgbSkpLT5iOworICAgICAgRFVNUEJJVFMgKGopOworICAgICAgaiA9IHRkLT52Lm47CisgICAgICBpZiAoaiA8IDE2KQkJLyogbGVuZ3RoIG9mIGNvZGUgaW4gYml0cyAoMC4uMTUpICovCisJbGxbaSsrXSA9IGwgPSBqOwkvKiBzYXZlIGxhc3QgbGVuZ3RoIGluIGwgKi8KKyAgICAgIGVsc2UgaWYgKGogPT0gMTYpCQkvKiByZXBlYXQgbGFzdCBsZW5ndGggMyB0byA2IHRpbWVzICovCisJeworCSAgTkVFREJJVFMgKDIpOworCSAgaiA9IDMgKyAoKHVuc2lnbmVkKSBiICYgMyk7CisJICBEVU1QQklUUyAoMik7CisJICBpZiAoKHVuc2lnbmVkKSBpICsgaiA+IG4pCisJICAgIHsKKwkgICAgICBlcnJudW0gPSBFUlJfQkFEX0daSVBfREFUQTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwkgIHdoaWxlIChqLS0pCisJICAgIGxsW2krK10gPSBsOworCX0KKyAgICAgIGVsc2UgaWYgKGogPT0gMTcpCQkvKiAzIHRvIDEwIHplcm8gbGVuZ3RoIGNvZGVzICovCisJeworCSAgTkVFREJJVFMgKDMpOworCSAgaiA9IDMgKyAoKHVuc2lnbmVkKSBiICYgNyk7CisJICBEVU1QQklUUyAoMyk7CisJICBpZiAoKHVuc2lnbmVkKSBpICsgaiA+IG4pCisJICAgIHsKKwkgICAgICBlcnJudW0gPSBFUlJfQkFEX0daSVBfREFUQTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwkgIHdoaWxlIChqLS0pCisJICAgIGxsW2krK10gPSAwOworCSAgbCA9IDA7CisJfQorICAgICAgZWxzZQorCS8qIGogPT0gMTg6IDExIHRvIDEzOCB6ZXJvIGxlbmd0aCBjb2RlcyAqLworCXsKKwkgIE5FRURCSVRTICg3KTsKKwkgIGogPSAxMSArICgodW5zaWduZWQpIGIgJiAweDdmKTsKKwkgIERVTVBCSVRTICg3KTsKKwkgIGlmICgodW5zaWduZWQpIGkgKyBqID4gbikKKwkgICAgeworCSAgICAgIGVycm51bSA9IEVSUl9CQURfR1pJUF9EQVRBOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgd2hpbGUgKGotLSkKKwkgICAgbGxbaSsrXSA9IDA7CisJICBsID0gMDsKKwl9CisgICAgfQorCisgIC8qIGZyZWUgZGVjb2RpbmcgdGFibGUgZm9yIHRyZWVzICovCisgIHJlc2V0X2xpbmFsbG9jICgpOworCisgIC8qIHJlc3RvcmUgdGhlIGdsb2JhbCBiaXQgYnVmZmVyICovCisgIGJiID0gYjsKKyAgYmsgPSBrOworCisgIC8qIGJ1aWxkIHRoZSBkZWNvZGluZyB0YWJsZXMgZm9yIGxpdGVyYWwvbGVuZ3RoIGFuZCBkaXN0YW5jZSBjb2RlcyAqLworICBibCA9IGxiaXRzOworICBpZiAoKGkgPSBodWZ0X2J1aWxkIChsbCwgbmwsIDI1NywgY3BsZW5zLCBjcGxleHQsICZ0bCwgJmJsKSkgIT0gMCkKKyAgICB7CisjaWYgMAorICAgICAgaWYgKGkgPT0gMSkKKwlwcmludGYgKCJndW56aXA6IGluY29tcGxldGUgbGl0ZXJhbCB0cmVlXG4iKTsKKyNlbmRpZgorCisgICAgICBlcnJudW0gPSBFUlJfQkFEX0daSVBfREFUQTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGJkID0gZGJpdHM7CisgIGlmICgoaSA9IGh1ZnRfYnVpbGQgKGxsICsgbmwsIG5kLCAwLCBjcGRpc3QsIGNwZGV4dCwgJnRkLCAmYmQpKSAhPSAwKQorICAgIHsKKyNpZiAwCisgICAgICBpZiAoaSA9PSAxKQorCXByaW50ZiAoImd1bnppcDogaW5jb21wbGV0ZSBkaXN0YW5jZSB0cmVlXG4iKTsKKyNlbmRpZgorCisgICAgICBlcnJudW0gPSBFUlJfQkFEX0daSVBfREFUQTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogaW5kaWNhdGUgd2UncmUgbm93IHdvcmtpbmcgb24gYSBibG9jayAqLworICBjb2RlX3N0YXRlID0gMDsKKyAgYmxvY2tfbGVuKys7Cit9CisKKworc3RhdGljIHZvaWQKK2dldF9uZXdfYmxvY2sgKHZvaWQpCit7CisgIHJlZ2lzdGVyIHVsZyBiOwkJLyogYml0IGJ1ZmZlciAqLworICByZWdpc3RlciB1bnNpZ25lZCBrOwkJLyogbnVtYmVyIG9mIGJpdHMgaW4gYml0IGJ1ZmZlciAqLworCisgIGh1ZnRzID0gMDsKKworICAvKiBtYWtlIGxvY2FsIGJpdCBidWZmZXIgKi8KKyAgYiA9IGJiOworICBrID0gYms7CisKKyAgLyogcmVhZCBpbiBsYXN0IGJsb2NrIGJpdCAqLworICBORUVEQklUUyAoMSk7CisgIGxhc3RfYmxvY2sgPSAoaW50KSBiICYgMTsKKyAgRFVNUEJJVFMgKDEpOworCisgIC8qIHJlYWQgaW4gYmxvY2sgdHlwZSAqLworICBORUVEQklUUyAoMik7CisgIGJsb2NrX3R5cGUgPSAodW5zaWduZWQpIGIgJiAzOworICBEVU1QQklUUyAoMik7CisKKyAgLyogcmVzdG9yZSB0aGUgZ2xvYmFsIGJpdCBidWZmZXIgKi8KKyAgYmIgPSBiOworICBiayA9IGs7CisKKyAgaWYgKGJsb2NrX3R5cGUgPT0gSU5GTEFURV9TVE9SRUQpCisgICAgaW5pdF9zdG9yZWRfYmxvY2sgKCk7CisgIGlmIChibG9ja190eXBlID09IElORkxBVEVfRklYRUQpCisgICAgaW5pdF9maXhlZF9ibG9jayAoKTsKKyAgaWYgKGJsb2NrX3R5cGUgPT0gSU5GTEFURV9EWU5BTUlDKQorICAgIGluaXRfZHluYW1pY19ibG9jayAoKTsKK30KKworCitzdGF0aWMgdm9pZAoraW5mbGF0ZV93aW5kb3cgKHZvaWQpCit7CisgIC8qIGluaXRpYWxpemUgd2luZG93ICovCisgIHdwID0gMDsKKworICAvKgorICAgKiAgTWFpbiBkZWNvbXByZXNzaW9uIGxvb3AuCisgICAqLworCisgIHdoaWxlICh3cCA8IFdTSVpFICYmICFlcnJudW0pCisgICAgeworICAgICAgaWYgKCFibG9ja19sZW4pCisJeworCSAgaWYgKGxhc3RfYmxvY2spCisJICAgIGJyZWFrOworCisJICBnZXRfbmV3X2Jsb2NrICgpOworCX0KKworICAgICAgaWYgKGJsb2NrX3R5cGUgPiBJTkZMQVRFX0RZTkFNSUMpCisJZXJybnVtID0gRVJSX0JBRF9HWklQX0RBVEE7CisKKyAgICAgIGlmIChlcnJudW0pCisJcmV0dXJuOworCisgICAgICAvKgorICAgICAgICogIEV4cGFuZCBzdG9yZWQgYmxvY2sgaGVyZS4KKyAgICAgICAqLworICAgICAgaWYgKGJsb2NrX3R5cGUgPT0gSU5GTEFURV9TVE9SRUQpCisJeworCSAgaW50IHcgPSB3cDsKKworCSAgLyoKKwkgICAqICBUaGlzIGlzIGJhc2ljYWxseSBhIGdsb3JpZmllZCBwYXNzLXRocm91Z2gKKwkgICAqLworCisJICB3aGlsZSAoYmxvY2tfbGVuICYmIHcgPCBXU0laRSAmJiAhZXJybnVtKQorCSAgICB7CisJICAgICAgc2xpZGVbdysrXSA9IGdldF9ieXRlICgpOworCSAgICAgIGJsb2NrX2xlbi0tOworCSAgICB9CisKKwkgIHdwID0gdzsKKworCSAgY29udGludWU7CisJfQorCisgICAgICAvKgorICAgICAgICogIEV4cGFuZCBvdGhlciBraW5kIG9mIGJsb2NrLgorICAgICAgICovCisKKyAgICAgIGlmIChpbmZsYXRlX2NvZGVzX2luX3dpbmRvdyAoKSkKKwlyZXNldF9saW5hbGxvYyAoKTsKKyAgICB9CisKKyAgc2F2ZWRfZmlsZXBvcyArPSBXU0laRTsKKworICAvKiBYWFggZG8gQ1JDIGNhbGN1bGF0aW9uIGhlcmUhICovCit9CisKKworc3RhdGljIHZvaWQKK2luaXRpYWxpemVfdGFibGVzICh2b2lkKQoreworICBzYXZlZF9maWxlcG9zID0gMDsKKyAgZmlsZXBvcyA9IGd6aXBfZGF0YV9vZmZzZXQ7CisKKyAgLyogaW5pdGlhbGl6ZSB3aW5kb3csIGJpdCBidWZmZXIgKi8KKyAgYmsgPSAwOworICBiYiA9IDA7CisKKyAgLyogcmVzZXQgcGFydGlhbCBkZWNvbXByZXNzaW9uIGNvZGUgKi8KKyAgbGFzdF9ibG9jayA9IDA7CisgIGJsb2NrX2xlbiA9IDA7CisKKyAgLyogcmVzZXQgbWVtb3J5IGFsbG9jYXRpb24gc3R1ZmYgKi8KKyAgcmVzZXRfbGluYWxsb2MgKCk7Cit9CisKKworaW50CitndW56aXBfcmVhZCAoY2hhciAqYnVmLCBpbnQgbGVuKQoreworICBpbnQgcmV0ID0gMDsKKworICBjb21wcmVzc2VkX2ZpbGUgPSAwOworICBndW56aXBfc3dhcF92YWx1ZXMgKCk7CisgIC8qCisgICAqICBOb3cgImd6aXBfKiIgdmFsdWVzIHJlZmVyIHRvIHRoZSB1bmNvbXByZXNzZWQgZGF0YS4KKyAgICovCisKKyAgLyogZG8gd2UgcmVzZXQgZGVjb21wcmVzc2lvbiB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlPyAqLworICBpZiAoc2F2ZWRfZmlsZXBvcyA+IGd6aXBfZmlsZXBvcyArIFdTSVpFKQorICAgIGluaXRpYWxpemVfdGFibGVzICgpOworCisgIC8qCisgICAqICBUaGlzIGxvb3Agb3BlcmF0ZXMgdXBvbiB1bmNvbXByZXNzZWQgZGF0YSBvbmx5LiAgVGhlIG9ubHkKKyAgICogIHNwZWNpYWwgdGhpbmcgaXQgZG9lcyBpcyB0byBtYWtlIHN1cmUgdGhlIGRlY29tcHJlc3Npb24KKyAgICogIHdpbmRvdyBpcyB3aXRoaW4gdGhlIHJhbmdlIG9mIGRhdGEgaXQgbmVlZHMuCisgICAqLworCisgIHdoaWxlIChsZW4gPiAwICYmICFlcnJudW0pCisgICAgeworICAgICAgcmVnaXN0ZXIgaW50IHNpemU7CisgICAgICByZWdpc3RlciBjaGFyICpzcmNhZGRyOworCisgICAgICB3aGlsZSAoZ3ppcF9maWxlcG9zID49IHNhdmVkX2ZpbGVwb3MpCisJaW5mbGF0ZV93aW5kb3cgKCk7CisKKyAgICAgIHNyY2FkZHIgPSAoY2hhciAqKSAoKGd6aXBfZmlsZXBvcyAmIChXU0laRSAtIDEpKSArIHNsaWRlKTsKKyAgICAgIHNpemUgPSBzYXZlZF9maWxlcG9zIC0gZ3ppcF9maWxlcG9zOworICAgICAgaWYgKHNpemUgPiBsZW4pCisJc2l6ZSA9IGxlbjsKKworICAgICAgbWVtbW92ZSAoYnVmLCBzcmNhZGRyLCBzaXplKTsKKworICAgICAgYnVmICs9IHNpemU7CisgICAgICBsZW4gLT0gc2l6ZTsKKyAgICAgIGd6aXBfZmlsZXBvcyArPSBzaXplOworICAgICAgcmV0ICs9IHNpemU7CisgICAgfQorCisgIGNvbXByZXNzZWRfZmlsZSA9IDE7CisgIGd1bnppcF9zd2FwX3ZhbHVlcyAoKTsKKyAgLyoKKyAgICogIE5vdyAiZ3ppcF8qIiB2YWx1ZXMgcmVmZXIgdG8gdGhlIGNvbXByZXNzZWQgZGF0YS4KKyAgICovCisKKyAgaWYgKGVycm51bSkKKyAgICByZXQgPSAwOworCisgIHJldHVybiByZXQ7Cit9CisKKyNlbmRpZiAvKiAhIE5PX0RFQ09NUFJFU1NJT04gKi8KZGlmZiAtLWdpdCBhL3N0YWdlMi9oZXJjdWxlcy5jIGIvc3RhZ2UyL2hlcmN1bGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMwMjgwYgotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMi9oZXJjdWxlcy5jCkBAIC0wLDAgKzEsMTg2IEBACisvKiBoZXJjdWxlcy5jIC0gaGVyY3VsZXMgY29uc29sZSBpbnRlcmZhY2UgKi8KKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMjAwMSwyMDAyICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZmRlZiBTVVBQT1JUX0hFUkNVTEVTCisKKyNpbmNsdWRlIDxzaGFyZWQuaD4KKyNpbmNsdWRlIDxoZXJjdWxlcy5oPgorI2luY2x1ZGUgPHRlcm0uaD4KKworLyogVGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJzb3IuICAqLworc3RhdGljIGludCBoZXJjX3g7CitzdGF0aWMgaW50IGhlcmNfeTsKKworc3RhdGljIGludCBoZXJjX3N0YW5kYXJkX2NvbG9yID0gQV9OT1JNQUw7CitzdGF0aWMgaW50IGhlcmNfbm9ybWFsX2NvbG9yID0gQV9OT1JNQUw7CitzdGF0aWMgaW50IGhlcmNfaGlnaGxpZ2h0X2NvbG9yID0gQV9SRVZFUlNFOworc3RhdGljIGludCBoZXJjX2N1cnJlbnRfY29sb3IgPSBBX05PUk1BTDsKK3N0YXRpYyBjb2xvcl9zdGF0ZSBoZXJjX2NvbG9yX3N0YXRlID0gQ09MT1JfU1RBVEVfU1RBTkRBUkQ7CitzdGF0aWMgaW50IGhlcmNfY3Vyc29yX3N0YXRlID0gMTsKKworLyogV3JpdGUgYSBieXRlIHRvIGEgcG9ydC4gICovCitzdGF0aWMgaW5saW5lIHZvaWQKK291dGIgKHVuc2lnbmVkIHNob3J0IHBvcnQsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisgIGFzbSB2b2xhdGlsZSAoIm91dGIJJWIwLCAldzEiIDogOiAiYSIgKHZhbHVlKSwgIk5kIiAocG9ydCkpOworfQorCitzdGF0aWMgdm9pZAoraGVyY19zZXRfY3Vyc29yICh2b2lkKQoreworICB1bnNpZ25lZCBvZmZzZXQgPSBoZXJjX3kgKiBIRVJDVUxFU19XSURUSCArIGhlcmNfeDsKKyAgCisgIG91dGIgKEhFUkNVTEVTX0lOREVYX1JFRywgMHgwZik7CisgIG91dGIgKDB4ODAsIDApOworICBvdXRiIChIRVJDVUxFU19EQVRBX1JFRywgb2Zmc2V0ICYgMHhGRik7CisgIG91dGIgKDB4ODAsIDApOworICAKKyAgb3V0YiAoSEVSQ1VMRVNfSU5ERVhfUkVHLCAweDBlKTsKKyAgb3V0YiAoMHg4MCwgMCk7CisgIG91dGIgKEhFUkNVTEVTX0RBVEFfUkVHLCBvZmZzZXQgPj4gOCk7CisgIG91dGIgKDB4ODAsIDApOworfQorCit2b2lkCitoZXJjdWxlc19wdXRjaGFyIChpbnQgYykKK3sKKyAgc3dpdGNoIChjKQorICAgIHsKKyAgICBjYXNlICdcYic6CisgICAgICBpZiAoaGVyY194ID4gMCkKKwloZXJjX3gtLTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSAnXG4nOgorICAgICAgaGVyY195Kys7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgJ1xyJzoKKyAgICAgIGhlcmNfeCA9IDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ1xhJzoKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqdmlkZW8KKwkgID0gKHVuc2lnbmVkIHNob3J0ICopIEhFUkNVTEVTX1ZJREVPX0FERFI7CisJCisJdmlkZW9baGVyY195ICogSEVSQ1VMRVNfV0lEVEggKyBoZXJjX3hdCisJICA9IChoZXJjX2N1cnJlbnRfY29sb3IgPDwgOCkgfCBjOworCWhlcmNfeCsrOworCWlmIChoZXJjX3ggPj0gSEVSQ1VMRVNfV0lEVEgpCisJICB7CisJICAgIGhlcmNfeCA9IDA7CisJICAgIGhlcmNfeSsrOworCSAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorCisgIGlmIChoZXJjX3kgPj0gSEVSQ1VMRVNfSEVJR0hUKQorICAgIHsKKyAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnZpZGVvID0gKHVuc2lnbmVkIGxvbmcgKikgSEVSQ1VMRVNfVklERU9fQUREUjsKKyAgICAgIGludCBpOworICAgICAgCisgICAgICBoZXJjX3kgPSBIRVJDVUxFU19IRUlHSFQgLSAxOworICAgICAgZ3J1Yl9tZW1tb3ZlICgoY2hhciAqKSBIRVJDVUxFU19WSURFT19BRERSLAorCQkgICAgKGNoYXIgKikgSEVSQ1VMRVNfVklERU9fQUREUiArIEhFUkNVTEVTX1dJRFRIICogMiwKKwkJICAgIEhFUkNVTEVTX1dJRFRIICogKEhFUkNVTEVTX0hFSUdIVCAtIDEpICogMik7CisgICAgICBmb3IgKGkgPSBIRVJDVUxFU19XSURUSCAqIChIRVJDVUxFU19IRUlHSFQgLSAxKSAvIDI7CisJICAgaSA8IEhFUkNVTEVTX1dJRFRIICogSEVSQ1VMRVNfSEVJR0hUIC8gMjsKKwkgICBpKyspCisJdmlkZW9baV0gPSAweDA3MjAwNzIwOworICAgIH0KK30KKwordm9pZAoraGVyY3VsZXNfY2xzICh2b2lkKQoreworICBpbnQgaTsKKyAgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqdmlkZW8gPSAodW5zaWduZWQgbG9uZyAqKSBIRVJDVUxFU19WSURFT19BRERSOworICAKKyAgZm9yIChpID0gMDsgaSA8IEhFUkNVTEVTX1dJRFRIICogSEVSQ1VMRVNfSEVJR0hUIC8gMjsgaSsrKQorICAgIHZpZGVvW2ldID0gMHgwNzIwMDcyMDsKKworICBoZXJjX3ggPSBoZXJjX3kgPSAwOworICBoZXJjX3NldF9jdXJzb3IgKCk7Cit9CisKK2ludAoraGVyY3VsZXNfZ2V0eHkgKHZvaWQpCit7CisgIHJldHVybiAoaGVyY194IDw8IDgpIHwgaGVyY195OworfQorCit2b2lkCitoZXJjdWxlc19nb3RveHkgKGludCB4LCBpbnQgeSkKK3sKKyAgaGVyY194ID0geDsKKyAgaGVyY195ID0geTsKKyAgaGVyY19zZXRfY3Vyc29yICgpOworfQorCit2b2lkCitoZXJjdWxlc19zZXRjb2xvcnN0YXRlIChjb2xvcl9zdGF0ZSBzdGF0ZSkKK3sKKyAgc3dpdGNoIChzdGF0ZSkgeworICAgIGNhc2UgQ09MT1JfU1RBVEVfU1RBTkRBUkQ6CisgICAgICBoZXJjX2N1cnJlbnRfY29sb3IgPSBoZXJjX3N0YW5kYXJkX2NvbG9yOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDT0xPUl9TVEFURV9OT1JNQUw6CisgICAgICBoZXJjX2N1cnJlbnRfY29sb3IgPSBoZXJjX25vcm1hbF9jb2xvcjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ09MT1JfU1RBVEVfSElHSExJR0hUOgorICAgICAgaGVyY19jdXJyZW50X2NvbG9yID0gaGVyY19oaWdobGlnaHRfY29sb3I7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaGVyY19jdXJyZW50X2NvbG9yID0gaGVyY19zdGFuZGFyZF9jb2xvcjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaGVyY19jb2xvcl9zdGF0ZSA9IHN0YXRlOworfQorCit2b2lkCitoZXJjdWxlc19zZXRjb2xvciAoaW50IG5vcm1hbF9jb2xvciwgaW50IGhpZ2hsaWdodF9jb2xvcikKK3sKKyAgaGVyY19ub3JtYWxfY29sb3IgPSBub3JtYWxfY29sb3I7CisgIGhlcmNfaGlnaGxpZ2h0X2NvbG9yID0gaGlnaGxpZ2h0X2NvbG9yOworICAKKyAgaGVyY3VsZXNfc2V0Y29sb3JzdGF0ZSAoaGVyY19jb2xvcl9zdGF0ZSk7Cit9CisKK2ludAoraGVyY3VsZXNfc2V0Y3Vyc29yIChpbnQgb24pCit7CisgIGludCBvbGRfc3RhdGUgPSBoZXJjX2N1cnNvcl9zdGF0ZTsKKyAgCisgIG91dGIgKEhFUkNVTEVTX0lOREVYX1JFRywgMHgwYSk7CisgIG91dGIgKDB4ODAsIDApOworICBvdXRiIChIRVJDVUxFU19EQVRBX1JFRywgb24gPyAwIDogKDEgPDwgNSkpOworICBvdXRiICgweDgwLCAwKTsKKyAgaGVyY19jdXJzb3Jfc3RhdGUgPSBvbjsKKworICByZXR1cm4gb2xkX3N0YXRlOworfQorCisjZW5kaWYgLyogU1VQUE9SVF9IRVJDVUxFUyAqLwpkaWZmIC0tZ2l0IGEvc3RhZ2UyL2hlcmN1bGVzLmggYi9zdGFnZTIvaGVyY3VsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWY3OTRmCi0tLSAvZGV2L251bGwKKysrIGIvc3RhZ2UyL2hlcmN1bGVzLmgKQEAgLTAsMCArMSwzMSBAQAorLyogaGVyY3VsZXMuaCAtIGhlcmN1bGVzIGNvbnNvbGUgaW50ZXJmYWNlICovCisvKgorICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBHUlVCX0hFUkNVTEVTX0hFQURFUgorI2RlZmluZSBHUlVCX0hFUkNVTEVTX0hFQURFUgkxCisKKy8qIE1hY3Jvcy4gICovCisjZGVmaW5lIEhFUkNVTEVTX1ZJREVPX0FERFIJUkFXX0FERFIgKDB4QjAwMDApCisjZGVmaW5lIEhFUkNVTEVTX1dJRFRICQk4MAorI2RlZmluZSBIRVJDVUxFU19IRUlHSFQJCTI1CisjZGVmaW5lIEhFUkNVTEVTX0lOREVYX1JFRwkweDNiNAorI2RlZmluZSBIRVJDVUxFU19EQVRBX1JFRwkweDNiNQorCisjZW5kaWYgLyogISBHUlVCX0hFUkNVTEVTX0hFQURFUiAqLwpkaWZmIC0tZ2l0IGEvc3RhZ2UyL2kzODYtZWxmLmggYi9zdGFnZTIvaTM4Ni1lbGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTYyZTNkCi0tLSAvZGV2L251bGwKKysrIGIvc3RhZ2UyL2kzODYtZWxmLmgKQEAgLTAsMCArMSwyMzcgQEAKKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMjAwMSwyMDAyICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qIDMyLWJpdCBkYXRhIHR5cGVzICovCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBFbGYzMl9BZGRyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBFbGYzMl9IYWxmOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIEVsZjMyX09mZjsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgRWxmMzJfU3dvcmQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgRWxmMzJfV29yZDsKKy8qICJ1bnNpZ25lZCBjaGFyIiBhbHJlYWR5IGV4aXN0cyAqLworCisvKiBFTEYgaGVhZGVyICovCit0eXBlZGVmIHN0cnVjdAoreworICAKKyNkZWZpbmUgRUlfTklERU5UIDE2CisgIAorICAvKiBmaXJzdCBmb3VyIGNoYXJhY3RlcnMgYXJlIGRlZmluZWQgYmVsb3cgKi8KKyNkZWZpbmUgRUlfTUFHMAkJMAorI2RlZmluZSBFTEZNQUcwCQkweDdmCisjZGVmaW5lIEVJX01BRzEJCTEKKyNkZWZpbmUgRUxGTUFHMQkJJ0UnCisjZGVmaW5lIEVJX01BRzIJCTIKKyNkZWZpbmUgRUxGTUFHMgkJJ0wnCisjZGVmaW5lIEVJX01BRzMJCTMKKyNkZWZpbmUgRUxGTUFHMwkJJ0YnCisgIAorI2RlZmluZSBFSV9DTEFTUwk0CS8qIGRhdGEgc2l6ZXMgKi8KKyNkZWZpbmUgRUxGQ0xBU1MzMgkxCS8qIGkzODYgLS0gdXAgdG8gMzItYml0IGRhdGEgc2l6ZXMgcHJlc2VudCAqLworICAKKyNkZWZpbmUgRUlfREFUQQkJNQkvKiBkYXRhIHR5cGUgYW5kIG9yZGVyaW5nICovCisjZGVmaW5lIEVMRkRBVEEyTFNCCTEJLyogaTM4NiAtLSBMU0IgMidzIGNvbXBsZW1lbnQgKi8KKyAgCisjZGVmaW5lIEVJX1ZFUlNJT04JNgkvKiB2ZXJzaW9uIG51bWJlci4gICJlX3ZlcnNpb24iIG11c3QgYmUgdGhlIHNhbWUgKi8KKyNkZWZpbmUgRVZfQ1VSUkVOVCAgICAgIDEJLyogY3VycmVudCB2ZXJzaW9uIG51bWJlciAqLworCisjZGVmaW5lIEVJX09TQUJJCTcJLyogb3BlcmF0aW5nIHN5c3RlbS9BQkkgaW5kaWNhdGlvbiAqLworI2RlZmluZSBFTEZPU0FCSV9GUkVFQlNECTkKKyAgCisjZGVmaW5lIEVJX0FCSVZFUlNJT04JOAkvKiBBQkkgdmVyc2lvbiAqLworICAKKyNkZWZpbmUgRUlfUEFECQk5CS8qIGZyb20gaGVyZSBpbiBpcyBqdXN0IHBhZGRpbmcgKi8KKyAgCisjZGVmaW5lIEVJX0JSQU5ECTgJLyogc3RhcnQgb2YgT1MgYnJhbmRpbmcgKFRoaXMgaXMKKwkJCQkgICBvYnZpb3VzbHkgaWxsZWdhbCBhZ2FpbnN0IHRoZSBFTEYKKwkJCQkgICBzdGFuZGFyZC4pICovCisgIAorICB1bnNpZ25lZCBjaGFyIGVfaWRlbnRbRUlfTklERU5UXTsJLyogYmFzaWMgaWRlbnRpZmljYXRpb24gYmxvY2sgKi8KKyAgCisjZGVmaW5lIEVUX0VYRUMJCTIJLyogd2Ugb25seSBjYXJlIGFib3V0IGV4ZWN1dGFibGUgdHlwZXMgKi8KKyAgRWxmMzJfSGFsZiBlX3R5cGU7CQkvKiBmaWxlIHR5cGVzICovCisgIAorI2RlZmluZSBFTV8zODYJCTMJLyogaTM4NiAtLSBvYnZpb3VzbHkgdXNlIHRoaXMgb25lICovCisgIEVsZjMyX0hhbGYgZV9tYWNoaW5lOwkvKiBtYWNoaW5lIHR5cGVzICovCisgIEVsZjMyX1dvcmQgZV92ZXJzaW9uOwkvKiB1c2Ugc2FtZSBhcyAiRUlfVkVSU0lPTiIgYWJvdmUgKi8KKyAgRWxmMzJfQWRkciBlX2VudHJ5OwkJLyogZW50cnkgcG9pbnQgb2YgdGhlIHByb2dyYW0gKi8KKyAgRWxmMzJfT2ZmIGVfcGhvZmY7CQkvKiBwcm9ncmFtIGhlYWRlciB0YWJsZSBmaWxlIG9mZnNldCAqLworICBFbGYzMl9PZmYgZV9zaG9mZjsJCS8qIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCisgIEVsZjMyX1dvcmQgZV9mbGFnczsJCS8qIGZsYWdzICovCisgIEVsZjMyX0hhbGYgZV9laHNpemU7CQkvKiBlbGYgaGVhZGVyIHNpemUgaW4gYnl0ZXMgKi8KKyAgRWxmMzJfSGFsZiBlX3BoZW50c2l6ZTsJLyogcHJvZ3JhbSBoZWFkZXIgZW50cnkgc2l6ZSAqLworICBFbGYzMl9IYWxmIGVfcGhudW07CQkvKiBudW1iZXIgb2YgZW50cmllcyBpbiBwcm9ncmFtIGhlYWRlciAqLworICBFbGYzMl9IYWxmIGVfc2hlbnRzaXplOwkvKiBzZWN0aW9uIGhlYWRlciBlbnRyeSBzaXplICovCisgIEVsZjMyX0hhbGYgZV9zaG51bTsJCS8qIG51bWJlciBvZiBlbnRyaWVzIGluIHNlY3Rpb24gaGVhZGVyICovCisgIAorI2RlZmluZSBTSE5fVU5ERUYgICAgICAgMAorI2RlZmluZSBTSE5fTE9SRVNFUlZFICAgMHhmZjAwCisjZGVmaW5lIFNITl9MT1BST0MgICAgICAweGZmMDAKKyNkZWZpbmUgU0hOX0hJUFJPQyAgICAgIDB4ZmYxZgorI2RlZmluZSBTSE5fQUJTICAgICAgICAgMHhmZmYxCisjZGVmaW5lIFNITl9DT01NT04gICAgICAweGZmZjIKKyNkZWZpbmUgU0hOX0hJUkVTRVJWRSAgIDB4ZmZmZgorICBFbGYzMl9IYWxmIGVfc2hzdHJuZHg7CS8qIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGluZGV4ICovCit9CitFbGYzMl9FaGRyOworCisKKyNkZWZpbmUgQk9PVEFCTEVfSTM4Nl9FTEYoaCkgXAorICgoaC5lX2lkZW50W0VJX01BRzBdID09IEVMRk1BRzApICYgKGguZV9pZGVudFtFSV9NQUcxXSA9PSBFTEZNQUcxKSBcCisgICYgKGguZV9pZGVudFtFSV9NQUcyXSA9PSBFTEZNQUcyKSAmIChoLmVfaWRlbnRbRUlfTUFHM10gPT0gRUxGTUFHMykgXAorICAmIChoLmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTMzIpICYgKGguZV9pZGVudFtFSV9EQVRBXSA9PSBFTEZEQVRBMkxTQikgXAorICAmIChoLmVfaWRlbnRbRUlfVkVSU0lPTl0gPT0gRVZfQ1VSUkVOVCkgJiAoaC5lX3R5cGUgPT0gRVRfRVhFQykgXAorICAmIChoLmVfbWFjaGluZSA9PSBFTV8zODYpICYgKGguZV92ZXJzaW9uID09IEVWX0NVUlJFTlQpKQorCisvKiBzZWN0aW9uIHRhYmxlIC0gPyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmMzJfV29yZAlzaF9uYW1lOwkJLyogU2VjdGlvbiBuYW1lIChzdHJpbmcgdGJsIGluZGV4KSAqLworICBFbGYzMl9Xb3JkCXNoX3R5cGU7CQkvKiBTZWN0aW9uIHR5cGUgKi8KKyAgRWxmMzJfV29yZAlzaF9mbGFnczsJCS8qIFNlY3Rpb24gZmxhZ3MgKi8KKyAgRWxmMzJfQWRkcglzaF9hZGRyOwkJLyogU2VjdGlvbiB2aXJ0dWFsIGFkZHIgYXQgZXhlY3V0aW9uICovCisgIEVsZjMyX09mZglzaF9vZmZzZXQ7CQkvKiBTZWN0aW9uIGZpbGUgb2Zmc2V0ICovCisgIEVsZjMyX1dvcmQJc2hfc2l6ZTsJCS8qIFNlY3Rpb24gc2l6ZSBpbiBieXRlcyAqLworICBFbGYzMl9Xb3JkCXNoX2xpbms7CQkvKiBMaW5rIHRvIGFub3RoZXIgc2VjdGlvbiAqLworICBFbGYzMl9Xb3JkCXNoX2luZm87CQkvKiBBZGRpdGlvbmFsIHNlY3Rpb24gaW5mb3JtYXRpb24gKi8KKyAgRWxmMzJfV29yZAlzaF9hZGRyYWxpZ247CQkvKiBTZWN0aW9uIGFsaWdubWVudCAqLworICBFbGYzMl9Xb3JkCXNoX2VudHNpemU7CQkvKiBFbnRyeSBzaXplIGlmIHNlY3Rpb24gaG9sZHMgdGFibGUgKi8KK30KK0VsZjMyX1NoZHI7CisKKy8qIHN5bWJvbCB0YWJsZSAtIHBhZ2UgNC0yNSwgZmlndXJlIDQtMTUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX1dvcmQgc3RfbmFtZTsKKyAgRWxmMzJfQWRkciBzdF92YWx1ZTsKKyAgRWxmMzJfV29yZCBzdF9zaXplOworICB1bnNpZ25lZCBjaGFyIHN0X2luZm87CisgIHVuc2lnbmVkIGNoYXIgc3Rfb3RoZXI7CisgIEVsZjMyX0hhbGYgc3Rfc2huZHg7Cit9CitFbGYzMl9TeW07CisKKy8qIHN5bWJvbCB0eXBlIGFuZCBiaW5kaW5nIGF0dHJpYnV0ZXMgLSBwYWdlIDQtMjYgKi8KKworI2RlZmluZSBFTEYzMl9TVF9CSU5EKGkpICAgICgoaSkgPj4gNCkKKyNkZWZpbmUgRUxGMzJfU1RfVFlQRShpKSAgICAoKGkpICYgMHhmKQorI2RlZmluZSBFTEYzMl9TVF9JTkZPKGIsdCkgICgoKGIpPDw0KSsoKHQpJjB4ZikpCisKKy8qIHN5bWJvbCBiaW5kaW5nIC0gcGFnZSA0LTI2LCBmaWd1cmUgNC0xNiAqLworCisjZGVmaW5lIFNUQl9MT0NBTCAgICAwCisjZGVmaW5lIFNUQl9HTE9CQUwgICAxCisjZGVmaW5lIFNUQl9XRUFLICAgICAyCisjZGVmaW5lIFNUQl9MT1BST0MgIDEzCisjZGVmaW5lIFNUQl9ISVBST0MgIDE1CisKKy8qIHN5bWJvbCB0eXBlcyAtIHBhZ2UgNC0yOCwgZmlndXJlIDQtMTcgKi8KKworI2RlZmluZSBTVFRfTk9UWVBFICAgMAorI2RlZmluZSBTVFRfT0JKRUNUICAgMQorI2RlZmluZSBTVFRfRlVOQyAgICAgMgorI2RlZmluZSBTVFRfU0VDVElPTiAgMworI2RlZmluZSBTVFRfRklMRSAgICAgNAorI2RlZmluZSBTVFRfTE9QUk9DICAxMworI2RlZmluZSBTVFRfSElQUk9DICAxNQorCisKKy8qIE1hY3JvcyB0byBzcGxpdC9jb21iaW5lIHJlbG9jYXRpb24gdHlwZSBhbmQgc3ltYm9sIHBhZ2UgNC0zMiAqLworCisjZGVmaW5lIEVMRjMyX1JfU1lNKF9faSkJKChfX2kpPj44KQorI2RlZmluZSBFTEYzMl9SX1RZUEUoX19pKQkoKHVuc2lnbmVkIGNoYXIpIChfX2kpKQorI2RlZmluZSBFTEYzMl9SX0lORk8oX19zLCBfX3QpCSgoKF9fcyk8PDgpICsgKHVuc2lnbmVkIGNoYXIpIChfX3QpKQorCisKKy8qIHByb2dyYW0gaGVhZGVyIC0gcGFnZSA1LTIsIGZpZ3VyZSA1LTEgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmMzJfV29yZCBwX3R5cGU7CisgIEVsZjMyX09mZiBwX29mZnNldDsKKyAgRWxmMzJfQWRkciBwX3ZhZGRyOworICBFbGYzMl9BZGRyIHBfcGFkZHI7CisgIEVsZjMyX1dvcmQgcF9maWxlc3o7CisgIEVsZjMyX1dvcmQgcF9tZW1zejsKKyAgRWxmMzJfV29yZCBwX2ZsYWdzOworICBFbGYzMl9Xb3JkIHBfYWxpZ247Cit9CitFbGYzMl9QaGRyOworCisvKiBzZWdtZW50IHR5cGVzIC0gcGFnZSA1LTMsIGZpZ3VyZSA1LTIgKi8KKworI2RlZmluZSBQVF9OVUxMCQkwCisjZGVmaW5lIFBUX0xPQUQJCTEKKyNkZWZpbmUgUFRfRFlOQU1JQwkyCisjZGVmaW5lIFBUX0lOVEVSUAkzCisjZGVmaW5lIFBUX05PVEUJCTQKKyNkZWZpbmUgUFRfU0hMSUIJNQorI2RlZmluZSBQVF9QSERSCQk2CisKKyNkZWZpbmUgUFRfTE9QUk9DCTB4NzAwMDAwMDAKKyNkZWZpbmUgUFRfSElQUk9DCTB4N2ZmZmZmZmYKKworLyogc2VnbWVudCBwZXJtaXNzaW9ucyAtIHBhZ2UgNS02ICovCisKKyNkZWZpbmUgUEZfWAkJMHgxCisjZGVmaW5lIFBGX1cJCTB4MgorI2RlZmluZSBQRl9SCQkweDQKKyNkZWZpbmUgUEZfTUFTS1BST0MJMHhmMDAwMDAwMAorCisKKy8qIGR5bmFtaWMgc3RydWN0dXJlIC0gcGFnZSA1LTE1LCBmaWd1cmUgNS05ICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX1N3b3JkIGRfdGFnOworICB1bmlvbgorICB7CisgICAgRWxmMzJfV29yZCBkX3ZhbDsKKyAgICBFbGYzMl9BZGRyIGRfcHRyOworICB9CisgIGRfdW47Cit9CitFbGYzMl9EeW47CisKKy8qIER5bmFtaWMgYXJyYXkgdGFncyAtIHBhZ2UgNS0xNiwgZmlndXJlIDUtMTAuICAqLworCisjZGVmaW5lIERUX05VTEwJCTAKKyNkZWZpbmUgRFRfTkVFREVECTEKKyNkZWZpbmUgRFRfUExUUkVMU1oJMgorI2RlZmluZSBEVF9QTFRHT1QJMworI2RlZmluZSBEVF9IQVNICQk0CisjZGVmaW5lIERUX1NUUlRBQgk1CisjZGVmaW5lIERUX1NZTVRBQgk2CisjZGVmaW5lIERUX1JFTEEJCTcKKyNkZWZpbmUgRFRfUkVMQVNaCTgKKyNkZWZpbmUgRFRfUkVMQUVOVCAgICAgIDkKKyNkZWZpbmUgRFRfU1RSU1oJMTAKKyNkZWZpbmUgRFRfU1lNRU5UCTExCisjZGVmaW5lIERUX0lOSVQJCTEyCisjZGVmaW5lIERUX0ZJTkkJCTEzCisjZGVmaW5lIERUX1NPTkFNRQkxNAorI2RlZmluZSBEVF9SUEFUSAkxNQorI2RlZmluZSBEVF9TWU1CT0xJQwkxNgorI2RlZmluZSBEVF9SRUwJCTE3CisjZGVmaW5lIERUX1JFTFNaCTE4CisjZGVmaW5lIERUX1JFTEVOVAkxOQorI2RlZmluZSBEVF9QTFRSRUwJMjAKKyNkZWZpbmUgRFRfREVCVUcJMjEKKyNkZWZpbmUgRFRfVEVYVFJFTAkyMgorI2RlZmluZSBEVF9KTVBSRUwJMjMKZGlmZiAtLWdpdCBhL3N0YWdlMi9pbWdhY3RfYW91dC5oIGIvc3RhZ2UyL2ltZ2FjdF9hb3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBkNDZjMAotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMi9pbWdhY3RfYW91dC5oCkBAIC0wLDAgKzEsMTU4IEBACisKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCWZyb206IEAoIylleGVjLmgJOC4xIChCZXJrZWxleSkgNi8xMS85MworICoJJElkOiBpbWdhY3RfYW91dC5oLHYgMS4xIDE5OTkvMDYvMjQgMDA6MDM6MjIgb2t1amkgRXhwICQKKyAqLworLyoKKyAqICAxMS8yMy85NSAtIEtsdWRnZSB0byBnZXQgIm50b2hsIiBudWxsIG1hY3JvIGFkZGVkLiAgLS0gRVNCCisgKiAgICAgICAgICAgLSBhbmQgZm9yIF9fTERQR1NaCisgKi8KKworI2lmbmRlZglfSU1HQUNUX0FPVVRfSF8KKyNkZWZpbmUJX0lNR0FDVF9BT1VUX0hfCisKKy8qIFhYWCBFU0IgKi8KKyNkZWZpbmUgbnRvaGwoeCkgKCh4IDw8IDI0KSB8ICgoeCAmIDB4RkYwMCkgPDwgOCkgXAorCQkgIHwgKCh4ID4+IDgpICYgMHhGRjAwKSB8ICh4ID4+IDI0KSkKKyNkZWZpbmUgaHRvbmwoeCkgbnRvaGwoeCkKKyNkZWZpbmUgX19MRFBHU1ogMHgxMDAwCisKKyNkZWZpbmUgTl9HRVRNQUdJQyhleCkgXAorCSggKGV4KS5hX21pZG1hZyAmIDB4ZmZmZiApCisjZGVmaW5lIE5fR0VUTUlEKGV4KSBcCisJKCAoTl9HRVRNQUdJQ19ORVQoZXgpID09IFpNQUdJQykgPyBOX0dFVE1JRF9ORVQoZXgpIDogXAorCSgoZXgpLmFfbWlkbWFnID4+IDE2KSAmIDB4MDNmZiApCisjZGVmaW5lIE5fR0VURkxBRyhleCkgXAorCSggKE5fR0VUTUFHSUNfTkVUKGV4KSA9PSBaTUFHSUMpID8gTl9HRVRGTEFHX05FVChleCkgOiBcCisJKChleCkuYV9taWRtYWcgPj4gMjYpICYgMHgzZiApCisjZGVmaW5lIE5fU0VUTUFHSUMoZXgsbWFnLG1pZCxmbGFnKSBcCisJKCAoZXgpLmFfbWlkbWFnID0gKCgoZmxhZykgJiAweDNmKSA8PDI2KSB8ICgoKG1pZCkgJiAweDAzZmYpIDw8IDE2KSB8IFwKKwkoKG1hZykgJiAweGZmZmYpICkKKworI2RlZmluZSBOX0dFVE1BR0lDX05FVChleCkgXAorCShudG9obCgoZXgpLmFfbWlkbWFnKSAmIDB4ZmZmZikKKyNkZWZpbmUgTl9HRVRNSURfTkVUKGV4KSBcCisJKChudG9obCgoZXgpLmFfbWlkbWFnKSA+PiAxNikgJiAweDAzZmYpCisjZGVmaW5lIE5fR0VURkxBR19ORVQoZXgpIFwKKwkoKG50b2hsKChleCkuYV9taWRtYWcpID4+IDI2KSAmIDB4M2YpCisjZGVmaW5lIE5fU0VUTUFHSUNfTkVUKGV4LG1hZyxtaWQsZmxhZykgXAorCSggKGV4KS5hX21pZG1hZyA9IGh0b25sKCAoKChmbGFnKSYweDNmKTw8MjYpIHwgKCgobWlkKSYweDAzZmYpPDwxNikgfCBcCisJKCgobWFnKSYweGZmZmYpKSApICkKKworI2RlZmluZSBOX0FMSUdOKGV4LHgpIFwKKwkoTl9HRVRNQUdJQyhleCkgPT0gWk1BR0lDIHx8IE5fR0VUTUFHSUMoZXgpID09IFFNQUdJQyB8fCBcCisJIE5fR0VUTUFHSUNfTkVUKGV4KSA9PSBaTUFHSUMgfHwgTl9HRVRNQUdJQ19ORVQoZXgpID09IFFNQUdJQyA/IFwKKwkgKCh4KSArIF9fTERQR1NaIC0gMSkgJiB+KHVuc2lnbmVkIGxvbmcpKF9fTERQR1NaIC0gMSkgOiAoeCkpCisKKy8qIFZhbGlkIG1hZ2ljIG51bWJlciBjaGVjay4gKi8KKyNkZWZpbmUJTl9CQURNQUcoZXgpIFwKKwkoTl9HRVRNQUdJQyhleCkgIT0gT01BR0lDICYmIE5fR0VUTUFHSUMoZXgpICE9IE5NQUdJQyAmJiBcCisJIE5fR0VUTUFHSUMoZXgpICE9IFpNQUdJQyAmJiBOX0dFVE1BR0lDKGV4KSAhPSBRTUFHSUMgJiYgXAorCSBOX0dFVE1BR0lDX05FVChleCkgIT0gT01BR0lDICYmIE5fR0VUTUFHSUNfTkVUKGV4KSAhPSBOTUFHSUMgJiYgXAorCSBOX0dFVE1BR0lDX05FVChleCkgIT0gWk1BR0lDICYmIE5fR0VUTUFHSUNfTkVUKGV4KSAhPSBRTUFHSUMpCisKKworLyogQWRkcmVzcyBvZiB0aGUgYm90dG9tIG9mIHRoZSB0ZXh0IHNlZ21lbnQuICovCisjZGVmaW5lIE5fVFhUQUREUihleCkgXAorCSgoTl9HRVRNQUdJQyhleCkgPT0gT01BR0lDIHx8IE5fR0VUTUFHSUMoZXgpID09IE5NQUdJQyB8fCBcCisJTl9HRVRNQUdJQyhleCkgPT0gWk1BR0lDKSA/IDAgOiBfX0xEUEdTWikKKworLyogQWRkcmVzcyBvZiB0aGUgYm90dG9tIG9mIHRoZSBkYXRhIHNlZ21lbnQuICovCisjZGVmaW5lIE5fREFUQUREUihleCkgXAorCU5fQUxJR04oZXgsIE5fVFhUQUREUihleCkgKyAoZXgpLmFfdGV4dCkKKworLyogVGV4dCBzZWdtZW50IG9mZnNldC4gKi8KKyNkZWZpbmUJTl9UWFRPRkYoZXgpIFwKKwkoTl9HRVRNQUdJQyhleCkgPT0gWk1BR0lDID8gX19MRFBHU1ogOiAoTl9HRVRNQUdJQyhleCkgPT0gUU1BR0lDIHx8IFwKKwlOX0dFVE1BR0lDX05FVChleCkgPT0gWk1BR0lDKSA/IDAgOiBzaXplb2Yoc3RydWN0IGV4ZWMpKQorCisvKiBEYXRhIHNlZ21lbnQgb2Zmc2V0LiAqLworI2RlZmluZQlOX0RBVE9GRihleCkgXAorCU5fQUxJR04oZXgsIE5fVFhUT0ZGKGV4KSArIChleCkuYV90ZXh0KQorCisvKiBSZWxvY2F0aW9uIHRhYmxlIG9mZnNldC4gKi8KKyNkZWZpbmUgTl9SRUxPRkYoZXgpIFwKKwlOX0FMSUdOKGV4LCBOX0RBVE9GRihleCkgKyAoZXgpLmFfZGF0YSkKKworLyogU3ltYm9sIHRhYmxlIG9mZnNldC4gKi8KKyNkZWZpbmUgTl9TWU1PRkYoZXgpIFwKKwkoTl9SRUxPRkYoZXgpICsgKGV4KS5hX3Ryc2l6ZSArIChleCkuYV9kcnNpemUpCisKKy8qIFN0cmluZyB0YWJsZSBvZmZzZXQuICovCisjZGVmaW5lCU5fU1RST0ZGKGV4KSAJKE5fU1lNT0ZGKGV4KSArIChleCkuYV9zeW1zKQorCisvKgorICogSGVhZGVyIHByZXBlbmRlZCB0byBlYWNoIGEub3V0IGZpbGUuCisgKiBvbmx5IG1hbmlwdWxhdGUgdGhlIGFfbWlkbWFnIGZpZWxkIHZpYSB0aGUKKyAqIE5fU0VUTUFHSUMvTl9HRVR7TUFHSUMsTUlELEZMQUd9IG1hY3JvcyBpbiBhLm91dC5oCisgKi8KKworc3RydWN0IGV4ZWMKKyAgeworICAgIHVuc2lnbmVkIGxvbmcgYV9taWRtYWc7CS8qIGh0b25sKGZsYWdzPDwyNiB8IG1pZDw8MTYgfCBtYWdpYykgKi8KKyAgICB1bnNpZ25lZCBsb25nIGFfdGV4dDsJLyogdGV4dCBzZWdtZW50IHNpemUgKi8KKyAgICB1bnNpZ25lZCBsb25nIGFfZGF0YTsJLyogaW5pdGlhbGl6ZWQgZGF0YSBzaXplICovCisgICAgdW5zaWduZWQgbG9uZyBhX2JzczsJLyogdW5pbml0aWFsaXplZCBkYXRhIHNpemUgKi8KKyAgICB1bnNpZ25lZCBsb25nIGFfc3ltczsJLyogc3ltYm9sIHRhYmxlIHNpemUgKi8KKyAgICB1bnNpZ25lZCBsb25nIGFfZW50cnk7CS8qIGVudHJ5IHBvaW50ICovCisgICAgdW5zaWduZWQgbG9uZyBhX3Ryc2l6ZTsJLyogdGV4dCByZWxvY2F0aW9uIHNpemUgKi8KKyAgICB1bnNpZ25lZCBsb25nIGFfZHJzaXplOwkvKiBkYXRhIHJlbG9jYXRpb24gc2l6ZSAqLworICB9OworI2RlZmluZSBhX21hZ2ljIGFfbWlkbWFnCS8qIFhYWCBIYWNrIHRvIHdvcmsgd2l0aCBjdXJyZW50IGtlcm5fZXhlY3ZlLmMgKi8KKworLyogYV9tYWdpYyAqLworI2RlZmluZQlPTUFHSUMgICAgICAgICAgMHgxMDcJLyogMDQwNyBvbGQgaW1wdXJlIGZvcm1hdCAqLworI2RlZmluZQlOTUFHSUMgICAgICAgICAgMHgxMDgJLyogMDQxMCByZWFkLW9ubHkgdGV4dCAqLworI2RlZmluZQlaTUFHSUMgICAgICAgICAgMHgxMGIJLyogMDQxMyBkZW1hbmQgbG9hZCBmb3JtYXQgKi8KKyNkZWZpbmUgUU1BR0lDICAgICAgICAgIDB4Y2MJLyogMDMxNCAiY29tcGFjdCIgZGVtYW5kIGxvYWQgZm9ybWF0ICovCisKKy8qIGFfbWlkICovCisjZGVmaW5lCU1JRF9aRVJPCTAJLyogdW5rbm93biAtIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCAqLworI2RlZmluZQlNSURfU1VOMDEwCTEJLyogc3VuIDY4MDEwLzY4MDIwIGJpbmFyeSAqLworI2RlZmluZQlNSURfU1VOMDIwCTIJLyogc3VuIDY4MDIwLW9ubHkgYmluYXJ5ICovCisjZGVmaW5lIE1JRF9JMzg2CTEzNAkvKiBpMzg2IEJTRCBiaW5hcnkgKi8KKyNkZWZpbmUgTUlEX1NQQVJDCTEzOAkvKiBzcGFyYyAqLworI2RlZmluZQlNSURfSFAyMDAJMjAwCS8qIGhwMjAwICg2ODAxMCkgQlNEIGJpbmFyeSAqLworI2RlZmluZQlNSURfSFAzMDAJMzAwCS8qIGhwMzAwICg2ODAyMCs2ODg4MSkgQlNEIGJpbmFyeSAqLworI2RlZmluZQlNSURfSFBVWAkweDIwQwkvKiBocDIwMC8zMDAgSFAtVVggYmluYXJ5ICovCisjZGVmaW5lCU1JRF9IUFVYODAwICAgICAweDIwQgkvKiBocDgwMCBIUC1VWCBiaW5hcnkgKi8KKworLyoKKyAqIGFfZmxhZ3MKKyAqLworI2RlZmluZSBFWF9QSUMJCTB4MTAJLyogY29udGFpbnMgcG9zaXRpb24gaW5kZXBlbmRhbnQgY29kZSAqLworI2RlZmluZSBFWF9EWU5BTUlDCTB4MjAJLyogY29udGFpbnMgcnVuLXRpbWUgbGluay1lZGl0IGluZm8gKi8KKyNkZWZpbmUgRVhfRFBNQVNLCTB4MzAJLyogbWFzayBmb3IgdGhlIGFib3ZlICovCisKKyNlbmRpZiAvKiAhX0lNR0FDVF9BT1VUX0hfICovCmRpZmYgLS1naXQgYS9zdGFnZTIvaXNvOTY2MC5oIGIvc3RhZ2UyL2lzbzk2NjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTZhOGNjCi0tLSAvZGV2L251bGwKKysrIGIvc3RhZ2UyL2lzbzk2NjAuaApAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqICBJU08gOTY2MCBmaWxlc3lzdGVtIGJhY2tlbmQgZm9yIEdSVUIgKEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcikKKyAqICBpbmNsdWRpbmcgUm9jayBSaWRnZSBFeHRlbnNpb25zIHN1cHBvcnQKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5ICBLb3VzdWtlIFRha2FpICA8dGFrQGttYy5reW90by11LmFjLmpwPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKy8qCisgKiAgUmVmZXJlbmNlczoKKyAqCWxpbnV4L2ZzL2lzb2ZzL3JvY2suW2NoXQorICoJbWtpc29mcy0xLjExLjEvZGlhZy9pc29pbmZvLmMKKyAqCW1raXNvZnMtMS4xMS4xL2lzbzk2NjAuaAorICoJCShhbGwgYXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZ2RhbGUpCisgKi8KKworI2lmbmRlZiBfSVNPOTY2MF9IXworI2RlZmluZSBfSVNPOTY2MF9IXworCisjZGVmaW5lIElTT19TRUNUT1JfQklUUyAgICAgICAgICAgICAgKDExKQorI2RlZmluZSBJU09fU0VDVE9SX1NJWkUgICAgICAgICAgICAgICgxPDxJU09fU0VDVE9SX0JJVFMpCisKKyNkZWZpbmUJSVNPX1JFR1VMQVIJMQkvKiByZWd1bGFyIGZpbGUJKi8KKyNkZWZpbmUJSVNPX0RJUkVDVE9SWQkyCS8qIGRpcmVjdG9yeQkqLworI2RlZmluZQlJU09fT1RIRVIJMAkvKiBvdGhlciBmaWxlICh3aXRoIFJvY2sgUmlkZ2UpICovCisKKyNkZWZpbmUJUlJfRkxBR19QWAkweDAxCS8qIGhhdmUgUE9TSVggZmlsZSBhdHRyaWJ1dGVzICovCisjZGVmaW5lIFJSX0ZMQUdfUE4JMHgwMgkvKiBQT1NJWCBkZXZpY2VzICovCisjZGVmaW5lIFJSX0ZMQUdfU0wJMHgwNAkvKiBTeW1ib2xpYyBsaW5rICovCisjZGVmaW5lCVJSX0ZMQUdfTk0JMHgwOAkvKiBoYXZlIGFsdGVybmF0ZSBmaWxlIG5hbWUgICAqLworI2RlZmluZSBSUl9GTEFHX0NMCTB4MTAJLyogQ2hpbGQgbGluayAqLworI2RlZmluZSBSUl9GTEFHX1BMCTB4MjAJLyogUGFyZW50IGxpbmsgKi8KKyNkZWZpbmUgUlJfRkxBR19SRQkweDQwCS8qIFJlbG9jYXRpb24gZGlyZWN0b3J5ICovCisjZGVmaW5lIFJSX0ZMQUdfVEYJMHg4MAkvKiBUaW1lc3RhbXBzICovCisKKy8qIFBPU0lYIGZpbGUgYXR0cmlidXRlcyBmb3IgUm9jayBSaWRnZSBleHRlbnNpb25zICovCisjZGVmaW5lCVBPU0lYX1NfSUZNVAkweEYwMDAKKyNkZWZpbmUJUE9TSVhfU19JRlJFRwkweDgwMDAKKyNkZWZpbmUJUE9TSVhfU19JRkRJUgkweDQwMDAKKworLyogdm9sdW1lIGRlc2NyaXB0b3IgdHlwZXMgKi8KKyNkZWZpbmUgSVNPX1ZEX1BSSU1BUlkgMQorI2RlZmluZSBJU09fVkRfRU5EIDI1NQorCisjZGVmaW5lIElTT19TVEFOREFSRF9JRCAiQ0QwMDEiCisKKyNpZm5kZWYgQVNNX0ZJTEUKKworI2lmbmRlZglfX0JJVF9UWVBFU19ERUZJTkVEX18KK3R5cGVkZWYJCSBpbnQJIGludDhfdAlfX2F0dHJpYnV0ZV9fKChtb2RlKFFJKSkpOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICB1X2ludDhfdAlfX2F0dHJpYnV0ZV9fKChtb2RlKFFJKSkpOwordHlwZWRlZgkJIGludAlpbnQxNl90CV9fYXR0cmlidXRlX18oKG1vZGUoSEkpKSk7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgdV9pbnQxNl90CV9fYXR0cmlidXRlX18oKG1vZGUoSEkpKSk7Cit0eXBlZGVmCQkgaW50CWludDMyX3QJX19hdHRyaWJ1dGVfXygobW9kZShTSSkpKTsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICB1X2ludDMyX3QJX19hdHRyaWJ1dGVfXygobW9kZShTSSkpKTsKKyNlbmRpZgorCit0eXBlZGVmCXVuaW9uIHsKKyAgdV9pbnQ4X3QgbCxiOworfQlpc29fOGJpdF90OworCit0eXBlZGVmCXN0cnVjdCBfX2lzb18xNmJpdCB7CisgIHVfaW50MTZfdCBsLCBiOworfSBpc29fMTZiaXRfdCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3R5cGVkZWYJc3RydWN0IF9faXNvXzMyYml0IHsKKyAgdV9pbnQzMl90IGwsIGI7Cit9IGlzb18zMmJpdF90IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwordHlwZWRlZiB1X2ludDhfdAkJaXNvX2RhdGVfdFs3XTsKKworc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkIHsKKyAgaXNvXzhiaXRfdAlsZW5ndGg7CisgIGlzb184Yml0X3QJZXh0X2F0dHJfbGVuZ3RoOworICBpc29fMzJiaXRfdAlleHRlbnQ7CisgIGlzb18zMmJpdF90CXNpemU7CisgIGlzb19kYXRlX3QJZGF0ZTsKKyAgaXNvXzhiaXRfdAlmbGFnczsKKyAgaXNvXzhiaXRfdAlmaWxlX3VuaXRfc2l6ZTsKKyAgaXNvXzhiaXRfdAlpbnRlcmxlYXZlOworICBpc29fMTZiaXRfdAl2b2x1bWVfc2VxX251bWJlcjsKKyAgaXNvXzhiaXRfdAluYW1lX2xlbjsKKyAgdV9pbnQ4X3QJbmFtZVsxXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaXNvX3ByaW1hcnlfZGVzY3JpcHRvciB7CisgIGlzb184Yml0X3QJdHlwZTsKKyAgdV9pbnQ4X3QJaWRbNV07CisgIGlzb184Yml0X3QJdmVyc2lvbjsKKyAgdV9pbnQ4X3QJX3VudXNlZDFbMV07CisgIHVfaW50OF90CXN5c3RlbV9pZFszMl07CisgIHVfaW50OF90CXZvbHVtZV9pZFszMl07CisgIHVfaW50OF90CV91bnVzZWQyWzhdOworICBpc29fMzJiaXRfdAl2b2x1bWVfc3BhY2Vfc2l6ZTsKKyAgdV9pbnQ4X3QJX3VudXNlZDNbMzJdOworICBpc29fMTZiaXRfdAl2b2x1bWVfc2V0X3NpemU7CisgIGlzb18xNmJpdF90CXZvbHVtZV9zZXFfbnVtYmVyOworICBpc29fMTZiaXRfdAlsb2dpY2FsX2Jsb2NrX3NpemU7CisgIGlzb18zMmJpdF90CXBhdGhfdGFibGVfc2l6ZTsKKyAgdV9pbnQ4X3QJdHlwZV9sX3BhdGhfdGFibGVbNF07CisgIHVfaW50OF90CW9wdF90eXBlX2xfcGF0aF90YWJsZVs0XTsKKyAgdV9pbnQ4X3QJdHlwZV9tX3BhdGhfdGFibGVbNF07CisgIHVfaW50OF90CW9wdF90eXBlX21fcGF0aF90YWJsZVs0XTsKKyAgc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkIHJvb3RfZGlyZWN0b3J5X3JlY29yZDsKKyAgdV9pbnQ4X3QJdm9sdW1lX3NldF9pZFsxMjhdOworICB1X2ludDhfdAlwdWJsaXNoZXJfaWRbMTI4XTsKKyAgdV9pbnQ4X3QJcHJlcGFyZXJfaWRbMTI4XTsKKyAgdV9pbnQ4X3QJYXBwbGljYXRpb25faWRbMTI4XTsKKyAgdV9pbnQ4X3QJY29weXJpZ2h0X2ZpbGVfaWRbMzddOworICB1X2ludDhfdAlhYnN0cmFjdF9maWxlX2lkWzM3XTsKKyAgdV9pbnQ4X3QJYmlibGlvZ3JhcGhpY19maWxlX2lkWzM3XTsKKyAgdV9pbnQ4X3QJY3JlYXRpb25fZGF0ZVsxN107CisgIHVfaW50OF90CW1vZGlmaWNhdGlvbl9kYXRlWzE3XTsKKyAgdV9pbnQ4X3QJZXhwaXJhdGlvbl9kYXRlWzE3XTsKKyAgdV9pbnQ4X3QJZWZmZWN0aXZlX2RhdGVbMTddOworICBpc29fOGJpdF90CWZpbGVfc3RydWN0dXJlX3ZlcnNpb247CisgIHVfaW50OF90CV91bnVzZWQ0WzFdOworICB1X2ludDhfdAlhcHBsaWNhdGlvbl9kYXRhWzUxMl07CisgIHVfaW50OF90CV91bnVzZWQ1WzY1M107Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHJvY2tfcmlkZ2UgeworICB1X2ludDE2X3QJc2lnbmF0dXJlOworICB1X2ludDhfdAlsZW47CisgIHVfaW50OF90CXZlcnNpb247CisgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgU1AgeworICAgICAgdV9pbnQxNl90CW1hZ2ljOworICAgICAgdV9pbnQ4X3QJc2tpcDsKKyAgICB9IHNwOworICAgIHN0cnVjdCBDRSB7CisgICAgICBpc29fMzJiaXRfdAlleHRlbnQ7CisgICAgICBpc29fMzJiaXRfdAlvZmZzZXQ7CisgICAgICBpc29fMzJiaXRfdAlzaXplOworICAgIH0gY2U7CisgICAgc3RydWN0IEVSIHsKKyAgICAgIHVfaW50OF90CWxlbl9pZDsKKyAgICAgIHVfaW50OF90CWxlbl9kZXM7CisgICAgICB1X2ludDhfdAlsZW5fc3JjOworICAgICAgdV9pbnQ4X3QJZXh0X3ZlcjsKKyAgICAgIHVfaW50OF90CWRhdGFbMF07CisgICAgfSBlcjsKKyAgICBzdHJ1Y3QgUlIgeworICAgICAgaXNvXzhiaXRfdAlmbGFnczsKKyAgICB9IHJyOworICAgIHN0cnVjdCBQWCB7CisgICAgICBpc29fMzJiaXRfdAltb2RlOworICAgICAgaXNvXzMyYml0X3QJbmxpbms7CisgICAgICBpc29fMzJiaXRfdAl1aWQ7CisgICAgICBpc29fMzJiaXRfdAlnaWQ7CisgICAgfSBweDsKKyAgICBzdHJ1Y3QgUE4geworICAgICAgaXNvXzMyYml0X3QJZGV2X2hpZ2g7CisgICAgICBpc29fMzJiaXRfdAlkZXZfbG93OworICAgIH0gcG47CisgICAgc3RydWN0IFNMIHsKKyAgICAgIGlzb184Yml0X3QgZmxhZ3M7CisgICAgICBzdHJ1Y3QgU0xfY29tcG9uZW50IHsKKwlpc29fOGJpdF90CWZsYWdzOworCXVfaW50OF90CQlsZW47CisJdV9pbnQ4X3QJCXRleHRbMF07CisgICAgICB9IGxpbms7CisgICAgfSBzbDsKKyAgICBzdHJ1Y3QgTk0geworICAgICAgaXNvXzhiaXRfdAlmbGFnczsKKyAgICAgIHVfaW50OF90CW5hbWVbMF07CisgICAgfSBubTsKKyAgICBzdHJ1Y3QgQ0wgeworICAgICAgaXNvXzMyYml0X3QJbG9jYXRpb247CisgICAgfSBjbDsKKyAgICBzdHJ1Y3QgUEwgeworICAgICAgaXNvXzMyYml0X3QJbG9jYXRpb247CisgICAgfSBwbDsKKyAgICBzdHJ1Y3QgVEYgeworICAgICAgaXNvXzhiaXRfdAlmbGFnczsKKyAgICAgIGlzb19kYXRlX3QJdGltZXNbMF07CisgICAgfSB0ZjsKKyAgfSB1OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3R5cGVkZWYJdW5pb24gUlJfcHRyIHsKKyAgc3RydWN0IHJvY2tfcmlkZ2UgKnJyOworICBjaGFyCQkgICpwdHI7CisgIGludAkJICAgaTsKK30gUlJfcHRyX3Q7CisKKyNkZWZpbmUJUlJNQUdJQyhjMSwgYzIpCSgoYzEpfChjMikgPDwgOCkKKworI2RlZmluZQlDSEVDSzIocHRyLCBjMSwgYzIpIFwKKwkoKih1bnNpZ25lZCBzaG9ydCAqKShwdHIpID09ICgoKGMxKSB8IChjMikgPDwgOCkgJiAweEZGRkYpKQorCisjZW5kaWYgLyogIUFTTV9GSUxFICovCisKKyNlbmRpZiAvKiBfSVNPOTY2MF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3RhZ2UyL2pmcy5oIGIvc3RhZ2UyL2pmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1OTZhMWIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFnZTIvamZzLmgKQEAgLTAsMCArMSw2MDEgQEAKKy8qIGpmcy5oIC0gYW4gZXh0cmFjdGlvbnMgZnJvbSBsaW51eC9pbmNsdWRlL2xpbnV4L2pmcy9qZnMqIGludG8gb25lIGZpbGUgKi8KKy8qICAgCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMjAwMCAgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIAorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7ICB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9KRlNfSF8KKyNkZWZpbmUgX0pGU19IXworCisvKiB0aG9zZSBhcmUgZnJvbSBqZnNfZmlsc3lzLmggKi8KKworLyoKKyAqCSBmaWxlIHN5c3RlbSBvcHRpb24gKHN1cGVyYmxvY2sgZmxhZykKKyAqLworLyogcGxhdGZvcm0gb3B0aW9uIChjb25kaXRpb25hbCBjb21waWxhdGlvbikgKi8KKyNkZWZpbmUgSkZTX0FJWAkJMHg4MDAwMDAwMAkvKiBBSVggc3VwcG9ydCAqLworLyoJUE9TSVggbmFtZS9kaXJlY3RvcnkgIHN1cHBvcnQgKi8KKworI2RlZmluZSBKRlNfT1MyCQkweDQwMDAwMDAwCS8qIE9TLzIgc3VwcG9ydCAqLworLyoJY2FzZS1pbnNlbnNpdGl2ZSBuYW1lL2RpcmVjdG9yeSBzdXBwb3J0ICovCisKKyNkZWZpbmUgSkZTX0xJTlVYICAgICAgCTB4MTAwMDAwMDAJLyogTGludXggc3VwcG9ydCAqLworLyoJY2FzZS1zZW5zaXRpdmUgbmFtZS9kaXJlY3Rvcnkgc3VwcG9ydCAqLworCisvKiBkaXJlY3Rvcnkgb3B0aW9uICovCisjZGVmaW5lIEpGU19VTklDT0RFCTB4MDAwMDAwMDEJLyogdW5pY29kZSBuYW1lICovCisKKy8qIGJiYSAqLworI2RlZmluZQlKRlNfU1dBUF9CWVRFUwkJMHgwMDEwMDAwMAkvKiBydW5uaW5nIG9uIGJpZyBlbmRpYW4gY29tcHV0ZXIgKi8KKworCisvKgorICoJYnVmZmVyIGNhY2hlIGNvbmZpZ3VyYXRpb24KKyAqLworLyogcGFnZSBzaXplICovCisjaWZkZWYgUFNJWkUKKyN1bmRlZiBQU0laRQorI2VuZGlmCisjZGVmaW5lCVBTSVpFCQk0MDk2CS8qIHBhZ2Ugc2l6ZSAoaW4gYnl0ZSkgKi8KKworLyoKKyAqCWZzIGZ1bmRhbWVudGFsIHNpemUKKyAqCisgKiBQU0laRSA+PSBmaWxlIHN5c3RlbSBibG9jayBzaXplID49IFBCU0laRSA+PSBESVNJWkUKKyAqLworI2RlZmluZQlQQlNJWkUJCTUxMgkvKiBwaHlzaWNhbCBibG9jayBzaXplIChpbiBieXRlKSAqLworI2RlZmluZSBESVNJWkUJCTUxMgkvKiBvbi1kaXNrIGlub2RlIHNpemUgKGluIGJ5dGUpICovCisjZGVmaW5lIEwyRElTSVpFCTkKKyNkZWZpbmUJSU5PU1BFUklBRwk0MDk2CS8qIG51bWJlciBvZiBkaXNrIGlub2RlcyBwZXIgaWFnICovCisjZGVmaW5lCUwySU5PU1BFUklBRwkxMgorI2RlZmluZSBJTk9TUEVSRVhUCTMyCS8qIG51bWJlciBvZiBkaXNrIGlub2RlIHBlciBleHRlbnQgKi8KKyNkZWZpbmUgTDJJTk9TUEVSRVhUCTUKKworLyogTWluaW11bSBudW1iZXIgb2YgYnl0ZXMgc3VwcG9ydGVkIGZvciBhIEpGUyBwYXJ0aXRpb24gKi8KKyNkZWZpbmUgTUlOSkZTCQkJKDB4MTAwMDAwMCkKKworLyoKKyAqIGZpeGVkIGJ5dGUgb2Zmc2V0IGFkZHJlc3MKKyAqLworI2RlZmluZSBTVVBFUjFfT0ZGCTB4ODAwMAkvKiBwcmltYXJ5IHN1cGVyYmxvY2sgKi8KKworI2RlZmluZSBBSVRCTF9PRkYJKFNVUEVSMV9PRkYgKyBQU0laRSArIChQU0laRSA8PCAxKSkKKworLyoKKyAqCWZpeGVkIHJlc2VydmVkIGlub2RlIG51bWJlcgorICovCisvKiBhZ2dyZWdhdGUgaW5vZGUgKi8KKyNkZWZpbmUJQUdHUkVHQVRFX0kJMQkvKiBhZ2dyZWdhdGUgaW5vZGUgbWFwIGlub2RlICovCisjZGVmaW5lCUZJTEVTWVNURU1fSQkxNgkvKiAxc3Qvb25seSBmaWxlc2V0IGlub2RlIGluIGFpdDoKKwkJCQkgKiBmaWxlc2V0IGlub2RlIG1hcCBpbm9kZQorCQkJCSAqLworCisvKiBwZXIgZmlsZXNldCBpbm9kZSAqLworI2RlZmluZQlST09UX0kJCTIJLyogZmlsZXNldCByb290IGlub2RlICovCisKKy8qCisgKglkaXJlY3RvcnkgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIEpGU19OQU1FX01BWAkyNTUKKyNkZWZpbmUgSkZTX1BBVEhfTUFYCVBTSVpFCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1ODsKK3R5cGVkZWYgY2hhciBzODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdTE2OwordHlwZWRlZiBzaG9ydCBzMTY7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1MzI7Cit0eXBlZGVmIGludCBzMzI7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1NjQ7Cit0eXBlZGVmIGxvbmcgbG9uZyBzNjQ7CisKK3R5cGVkZWYgdTE2IFVuaUNoYXI7CisKKy8qIHRoZXNlIGZyb20gamZzX2J0cmVlLmggKi8KKworLyogYnRwYWdldF90IGZsYWcgKi8KKyNkZWZpbmUgQlRfVFlQRQkJMHgwNwkvKiBCKy10cmVlIGluZGV4ICovCisjZGVmaW5lCUJUX1JPT1QJCTB4MDEJLyogcm9vdCBwYWdlICovCisjZGVmaW5lCUJUX0xFQUYJCTB4MDIJLyogbGVhZiBwYWdlICovCisjZGVmaW5lCUJUX0lOVEVSTkFMCTB4MDQJLyogaW50ZXJuYWwgcGFnZSAqLworI2RlZmluZQlCVF9SSUdIVE1PU1QJMHgxMAkvKiByaWdodG1vc3QgcGFnZSAqLworI2RlZmluZQlCVF9MRUZUTU9TVAkweDIwCS8qIGxlZnRtb3N0IHBhZ2UgKi8KKworLyogdGhvc2UgYXJlIGZyb20gamZzX3R5cGVzLmggKi8KKworc3RydWN0IHRpbWVzdHJ1Y190IHsKKwl1MzIgdHZfc2VjOworCXUzMiB0dl9uc2VjOworfTsKKworLyoKKyAqCXBoeXNpY2FsIHhkIChweGQpCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsZW46MjQ7CisJdW5zaWduZWQgYWRkcjE6ODsKKwl1MzIgYWRkcjI7Cit9IHB4ZF90OworCisvKiB4ZF90IGZpZWxkIGV4dHJhY3Rpb24gKi8KKyNkZWZpbmUJbGVuZ3RoUFhEKHB4ZCkJKChweGQpLT5sZW4pCisjZGVmaW5lCWFkZHJlc3NQWEQocHhkKQkoKChzNjQpKChweGQpLT5hZGRyMSkpIDw8IDMyIHwgKChweGQpLT5hZGRyMikpCisKKy8qCisgKglkYXRhIGV4dGVudCBkZXNjcmlwdG9yIChkeGQpCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBmbGFnOjg7CS8qIDE6IGZsYWdzICovCisJdW5zaWduZWQgcnNydmQ6MjQ7CS8qIDM6ICovCisJdTMyIHNpemU7CQkvKiA0OiBzaXplIGluIGJ5dGUgKi8KKwl1bnNpZ25lZCBsZW46MjQ7CS8qIDM6IGxlbmd0aCBpbiB1bml0IG9mIGZzYmxrc2l6ZSAqLworCXVuc2lnbmVkIGFkZHIxOjg7CS8qIDE6IGFkZHJlc3MgaW4gdW5pdCBvZiBmc2Jsa3NpemUgKi8KKwl1MzIgYWRkcjI7CQkvKiA0OiBhZGRyZXNzIGluIHVuaXQgb2YgZnNibGtzaXplICovCit9IGR4ZF90OwkJCS8qIC0gMTYgLSAqLworCisvKgorICoJREFTRCBsaW1pdCBpbmZvcm1hdGlvbiAtIHN0b3JlZCBpbiBkaXJlY3RvcnkgaW5vZGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgZGFzZCB7CisJdTggdGhyZXNoOwkJLyogQWxlcnQgVGhyZXNob2xkIChpbiBwZXJjZW50KSAqLworCXU4IGRlbHRhOwkJLyogQWxlcnQgVGhyZXNob2xkIGRlbHRhIChpbiBwZXJjZW50KSAgICovCisJdTggcnNydmQxOworCXU4IGxpbWl0X2hpOwkJLyogREFTRCBsaW1pdCAoaW4gbG9naWNhbCBibG9ja3MpICAgICAgICovCisJdTMyIGxpbWl0X2xvOwkJLyogREFTRCBsaW1pdCAoaW4gbG9naWNhbCBibG9ja3MpICAgICAgICovCisJdTggcnNydmQyWzNdOworCXU4IHVzZWRfaGk7CQkvKiBEQVNEIHVzYWdlIChpbiBsb2dpY2FsIGJsb2NrcykgICAgICAgKi8KKwl1MzIgdXNlZF9sbzsJCS8qIERBU0QgdXNhZ2UgKGluIGxvZ2ljYWwgYmxvY2tzKSAgICAgICAqLworfSBkYXNkX3Q7CisKKworLyogZnJvbSBqZnNfc3VwZXJibG9jay5oICovCisKKyNkZWZpbmUgSkZTX01BR0lDIAkweDMxNTM0NjRBCS8qICJKRlMxIiAqLworCitzdHJ1Y3QgamZzX3N1cGVyYmxvY2sKK3sKKwl1MzIgc19tYWdpYzsJCS8qIDQ6IG1hZ2ljIG51bWJlciAqLworCXUzMiBzX3ZlcnNpb247CQkvKiA0OiB2ZXJzaW9uIG51bWJlciAqLworCisJczY0IHNfc2l6ZTsJCS8qIDg6IGFnZ3JlZ2F0ZSBzaXplIGluIGhhcmR3YXJlL0xWTSBibG9ja3M7CisJCQkJICogVkZTOiBudW1iZXIgb2YgYmxvY2tzCisJCQkJICovCisJczMyIHNfYnNpemU7CQkvKiA0OiBhZ2dyZWdhdGUgYmxvY2sgc2l6ZSBpbiBieXRlczsgCisJCQkJICogVkZTOiBmcmFnbWVudCBzaXplCisJCQkJICovCisJczE2IHNfbDJic2l6ZTsJCS8qIDI6IGxvZzIgb2Ygc19ic2l6ZSAqLworCXMxNiBzX2wyYmZhY3RvcjsJLyogMjogbG9nMihzX2JzaXplL2hhcmR3YXJlIGJsb2NrIHNpemUpICovCisJczMyIHNfcGJzaXplOwkJLyogNDogaGFyZHdhcmUvTFZNIGJsb2NrIHNpemUgaW4gYnl0ZXMgKi8KKwlzMTYgc19sMnBic2l6ZTsJCS8qIDI6IGxvZzIgb2Ygc19wYnNpemUgKi8KKwlzMTYgcGFkOwkJLyogMjogcGFkZGluZyBuZWNlc3NhcnkgZm9yIGFsaWdubWVudCAqLworCisJdTMyIHNfYWdzaXplOwkJLyogNDogYWxsb2NhdGlvbiBncm91cCBzaXplIGluIGFnZ3IuIGJsb2NrcyAqLworCisJdTMyIHNfZmxhZzsJCS8qIDQ6IGFnZ3JlZ2F0ZSBhdHRyaWJ1dGVzOgorCQkJCSAqICAgIHNlZSBqZnNfZmlsc3lzLmgKKwkJCQkgKi8KKwl1MzIgc19zdGF0ZTsJCS8qIDQ6IG1vdW50L3VubW91bnQvcmVjb3Zlcnkgc3RhdGU6IAorCQkJCSAqICAgIHNlZSBqZnNfZmlsc3lzLmgKKwkJCQkgKi8KKwlzMzIgc19jb21wcmVzczsJCS8qIDQ6ID4gMCBpZiBkYXRhIGNvbXByZXNzaW9uICovCisKKwlweGRfdCBzX2FpdDI7CQkvKiA4OiBmaXJzdCBleHRlbnQgb2Ygc2Vjb25kYXJ5CisJCQkJICogICAgYWdncmVnYXRlIGlub2RlIHRhYmxlCisJCQkJICovCisKKwlweGRfdCBzX2FpbTI7CQkvKiA4OiBmaXJzdCBleHRlbnQgb2Ygc2Vjb25kYXJ5CisJCQkJICogICAgYWdncmVnYXRlIGlub2RlIG1hcAorCQkJCSAqLworCXUzMiBzX2xvZ2RldjsJCS8qIDQ6IGRldmljZSBhZGRyZXNzIG9mIGxvZyAqLworCXMzMiBzX2xvZ3NlcmlhbDsJLyogNDogbG9nIHNlcmlhbCBudW1iZXIgYXQgYWdncmVnYXRlIG1vdW50ICovCisJcHhkX3Qgc19sb2dweGQ7CQkvKiA4OiBpbmxpbmUgbG9nIGV4dGVudCAqLworCisJcHhkX3Qgc19mc2NrcHhkOwkvKiA4OiBpbmxpbmUgZnNjayB3b3JrIHNwYWNlIGV4dGVudCAqLworCisJc3RydWN0IHRpbWVzdHJ1Y190IHNfdGltZTsJLyogODogdGltZSBsYXN0IHVwZGF0ZWQgKi8KKworCXMzMiBzX2ZzY2tsb2dsZW47CS8qIDQ6IE51bWJlciBvZiBmaWxlc3lzdGVtIGJsb2NrcyByZXNlcnZlZCBmb3IKKwkJCQkgKiAgICB0aGUgZnNjayBzZXJ2aWNlIGxvZy4gIAorCQkJCSAqICAgIE4uQi4gVGhlc2UgYmxvY2tzIGFyZSBkaXZpZGVkIGFtb25nIHRoZQorCQkJCSAqICAgICAgICAgdmVyc2lvbnMga2VwdC4gIFRoaXMgaXMgbm90IGEgcGVyCisJCQkJICogICAgICAgICB2ZXJzaW9uIHNpemUuCisJCQkJICogICAgTi5CLiBUaGVzZSBibG9ja3MgYXJlIGluY2x1ZGVkIGluIHRoZSAKKwkJCQkgKiAgICAgICAgIGxlbmd0aCBmaWVsZCBvZiBzX2ZzY2tweGQuCisJCQkJICovCisJczggc19mc2NrbG9nOwkJLyogMTogd2hpY2ggZnNjayBzZXJ2aWNlIGxvZyBpcyBtb3N0IHJlY2VudAorCQkJCSAqICAgIDAgPT4gbm8gc2VydmljZSBsb2cgZGF0YSB5ZXQKKwkJCQkgKiAgICAxID0+IHRoZSBmaXJzdCBvbmUKKwkJCQkgKiAgICAyID0+IHRoZSAybmQgb25lCisJCQkJICovCisJY2hhciBzX2ZwYWNrWzExXTsJLyogMTE6IGZpbGUgc3lzdGVtIHZvbHVtZSBuYW1lIAorCQkJCSAqICAgICBOLkIuIFRoaXMgbXVzdCBiZSAxMSBieXRlcyB0bworCQkJCSAqICAgICAgICAgIGNvbmZvcm0gd2l0aCB0aGUgT1MvMiBCb290U2VjdG9yCisJCQkJICogICAgICAgICAgcmVxdWlyZW1lbnRzCisJCQkJICovCisKKwkvKiBleHRlbmRmcygpIHBhcmFtZXRlciB1bmRlciBzX3N0YXRlICYgRk1fRVhURU5ERlMgKi8KKwlzNjQgc194c2l6ZTsJCS8qIDg6IGV4dGVuZGZzIHNfc2l6ZSAqLworCXB4ZF90IHNfeGZzY2tweGQ7CS8qIDg6IGV4dGVuZGZzIGZzY2tweGQgKi8KKwlweGRfdCBzX3hsb2dweGQ7CS8qIDg6IGV4dGVuZGZzIGxvZ3B4ZCAqLworCS8qIC0gMTI4IGJ5dGUgYm91bmRhcnkgLSAqLworCisJLyoKKwkgKiAgICAgIERGUyBWRlMgc3VwcG9ydCAocHJlbGltaW5hcnkpIAorCSAqLworCWNoYXIgc19hdHRhY2g7CQkvKiAxOiBWRlM6IGZsYWc6IHNldCB3aGVuIGFnZ3JlZ2F0ZSBpcyBhdHRhY2hlZAorCQkJCSAqLworCXU4IHJzcnZkNFs3XTsJCS8qIDc6IHJlc2VydmVkIC0gc2V0IHRvIDAgKi8KKworCXU2NCB0b3RhbFVzYWJsZTsJLyogODogVkZTOiB0b3RhbCBvZiAxSyBibG9ja3Mgd2hpY2ggYXJlCisJCQkJICogYXZhaWxhYmxlIHRvICJub3JtYWwiIChub24tcm9vdCkgdXNlcnMuCisJCQkJICovCisJdTY0IG1pbkZyZWU7CQkvKiA4OiBWRlM6ICMgb2YgMUsgYmxvY2tzIGhlbGQgaW4gcmVzZXJ2ZSBmb3IgCisJCQkJICogZXhjbHVzaXZlIHVzZSBvZiByb290LiAgVGhpcyB2YWx1ZSBjYW4gYmUgMCwKKwkJCQkgKiBhbmQgaWYgaXQgaXMgdGhlbiB0b3RhbFVzYWJsZSB3aWxsIGJlIGVxdWFsIAorCQkJCSAqIHRvICMgb2YgYmxvY2tzIGluIGFnZ3JlZ2F0ZS4gIEkgYmVsaWV2ZSB0aGlzCisJCQkJICogbWVhbnMgdGhhdCBtaW5GcmVlICsgdG90YWxVc2FibGUgPSAjIGJsb2Nrcy4KKwkJCQkgKiBJbiB0aGF0IGNhc2UsIHdlIGRvbid0IG5lZWQgdG8gc3RvcmUgYm90aCAKKwkJCQkgKiB0b3RhbFVzYWJsZSBhbmQgbWluRnJlZSBzaW5jZSB3ZSBjYW4gY29tcHV0ZQorCQkJCSAqIG9uZSBmcm9tIHRoZSBvdGhlci4gIEkgd291bGQgZ3Vlc3MgbWluRnJlZSAKKwkJCQkgKiB3b3VsZCBiZSB0aGUgb25lIHdlIHNob3VsZCBzdG9yZSwgYW5kIAorCQkJCSAqIHRvdGFsVXNhYmxlIHdvdWxkIGJlIHRoZSBvbmUgd2Ugc2hvdWxkIAorCQkJCSAqIGNvbXB1dGUuICAoSnVzdCBhIGd1ZXNzLi4uKQorCQkJCSAqLworCisJdTY0IHJlYWxGcmVlOwkJLyogODogVkZTOiAjIG9mIGZyZWUgMUsgYmxvY2tzIGNhbiBiZSB1c2VkIGJ5IAorCQkJCSAqICJub3JtYWwiIHVzZXJzLiAgSXQgbWF5IGJlIHRoaXMgaXMgc29tZXRoaW5nCisJCQkJICogd2Ugc2hvdWxkIGNvbXB1dGUgd2hlbiBhc2tlZCBmb3IgaW5zdGVhZCBvZiAKKwkJCQkgKiBzdG9yaW5nIGluIHRoZSBzdXBlcmJsb2NrLiAgSSBkb24ndCBrbm93IGhvdworCQkJCSAqIG9mdGVuIHRoaXMgaW5mb3JtYXRpb24gaXMgbmVlZGVkLgorCQkJCSAqLworCS8qCisJICogICAgICBncmFmZml0aSBhcmVhCisJICovCit9OworCisvKiBmcm9tIGpmc19kdHJlZS5oICovCisKKy8qCisgKiAgICAgIGVudHJ5IHNlZ21lbnQvc2xvdAorICoKKyAqIGFuIGVudHJ5IGNvbnNpc3RzIG9mIHR5cGUgZGVwZW5kZW50IGhlYWQvb25seSBzZWdtZW50L3Nsb3QgYW5kCisgKiBhZGRpdGlvbmFsIHNlZ21lbnRzL3Nsb3RzIGxpbmtlZCB2aSBuZXh0IGZpZWxkOworICogTi5CLiBsYXN0L29ubHkgc2VnbWVudCBvZiBlbnRyeSBpcyB0ZXJtaW5hdGVkIGJ5IG5leHQgPSAtMTsKKyAqLworLyoKKyAqCWRpcmVjdG9yeSBwYWdlIHNsb3QKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXM4IG5leHQ7CQkvKiAxOiAqLworCXM4IGNudDsJCQkvKiAxOiAqLworCVVuaUNoYXIgbmFtZVsxNV07CS8qIDMwOiAqLworfSBkdHNsb3RfdDsJCQkvKiAoMzIpICovCisKKyNkZWZpbmUgRFRTTE9UREFUQUxFTgkxNQorCisvKgorICoJIGludGVybmFsIG5vZGUgZW50cnkgaGVhZC9vbmx5IHNlZ21lbnQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXB4ZF90IHhkOwkJLyogODogY2hpbGQgZXh0ZW50IGRlc2NyaXB0b3IgKi8KKworCXM4IG5leHQ7CQkvKiAxOiAqLworCXU4IG5hbWxlbjsJCS8qIDE6ICovCisJVW5pQ2hhciBuYW1lWzExXTsJLyogMjI6IDItYnl0ZSBhbGlnbmVkICovCit9IGlkdGVudHJ5X3Q7CQkJLyogKDMyKSAqLworCisvKgorICoJbGVhZiBub2RlIGVudHJ5IGhlYWQvb25seSBzZWdtZW50CisgKgorICogCUZvciBsZWdhY3kgZmlsZXN5c3RlbXMsIG5hbWUgY29udGFpbnMgMTMgdW5pY2hhcnMgLS0gbm8gaW5kZXggZmllbGQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBpbnVtYmVyOwkJLyogNDogNC1ieXRlIGFsaWduZWQgKi8KKwlzOCBuZXh0OwkJLyogMTogKi8KKwl1OCBuYW1sZW47CQkvKiAxOiAqLworCVVuaUNoYXIgbmFtZVsxMV07CS8qIDIyOiAyLWJ5dGUgYWxpZ25lZCAqLworCXUzMiBpbmRleDsJCS8qIDQ6IGluZGV4IGludG8gZGlyX3RhYmxlICovCit9IGxkdGVudHJ5X3Q7CQkJLyogKDMyKSAqLworCisjZGVmaW5lIERUTEhEUkRBVEFMRU4JMTEKKworLyoKKyAqIGRpcl90YWJsZSB1c2VkIGZvciBkaXJlY3RvcnkgdHJhdmVyc2FsIGR1cmluZyByZWFkZGlyCisqLyAKKworLyoKKyAqIE1heGltdW0gZW50cnkgaW4gaW5saW5lIGRpcmVjdG9yeSB0YWJsZQorICovCisKK3R5cGVkZWYgc3RydWN0IGRpcl90YWJsZV9zbG90IHsKKwl1OCByc3J2ZDsJLyogMTogKi8KKwl1OCBmbGFnOwkvKiAxOiAwIGlmIGZyZWUgKi8KKwl1OCBzbG90OwkvKiAxOiBzbG90IHdpdGhpbiBsZWFmIHBhZ2Ugb2YgZW50cnkgKi8KKwl1OCBhZGRyMTsJLyogMTogdXBwZXIgOCBiaXRzIG9mIGxlYWYgcGFnZSBhZGRyZXNzICovCisJdTMyIGFkZHIyOwkvKiA0OiBsb3dlciAzMiBiaXRzIG9mIGxlYWYgcGFnZSBhZGRyZXNzIC1PUi0KKwkJCSAgICAgIGluZGV4IG9mIG5leHQgZW50cnkgd2hlbiB0aGlzIGVudHJ5IHdhcyBkZWxldGVkICovCit9IGRpcl90YWJsZV9zbG90X3Q7CS8qICg4KSAqLworCisvKgorICoJZGlyZWN0b3J5IHJvb3QgcGFnZSAoaW4tbGluZSBpbiBvbi1kaXNrIGlub2RlKToKKyAqCisgKiBjZi4gZHRwYWdlX3QgYmVsb3cuCisgKi8KK3R5cGVkZWYgdW5pb24geworCXN0cnVjdCB7CisJCWRhc2RfdCBEQVNEOwkvKiAxNjogREFTRCBsaW1pdC91c2FnZSBpbmZvICBGMjI2OTQxICovCisKKwkJdTggZmxhZzsJLyogMTogKi8KKwkJczggbmV4dGluZGV4OwkvKiAxOiBuZXh0IGZyZWUgZW50cnkgaW4gc3RibCAqLworCQlzOCBmcmVlY250OwkvKiAxOiBmcmVlIGNvdW50ICovCisJCXM4IGZyZWVsaXN0OwkvKiAxOiBmcmVlbGlzdCBoZWFkZXIgKi8KKworCQl1MzIgaWRvdGRvdDsJLyogNDogcGFyZW50IGlub2RlIG51bWJlciAqLworCisJCXM4IHN0YmxbOF07CS8qIDg6IHNvcnRlZCBlbnRyeSBpbmRleCB0YWJsZSAqLworCX0gaGVhZGVyOwkJLyogKDMyKSAqLworCisJZHRzbG90X3Qgc2xvdFs5XTsKK30gZHRyb290X3Q7CisKKy8qCisgKglkaXJlY3RvcnkgcmVndWxhciBwYWdlOgorICoKKyAqCWVudHJ5IHNsb3QgYXJyYXkgb2YgMzIgYnl0ZSBzbG90CisgKgorICogc29ydGVkIGVudHJ5IHNsb3QgaW5kZXggdGFibGUgKHN0YmwpOgorICogY29udGlndW91cyBzbG90cyBhdCBzbG90IHNwZWNpZmllZCBieSBzdGJsaW5kZXgsCisgKiAxLWJ5dGUgcGVyIGVudHJ5CisgKiAgIDUxMiBieXRlIGJsb2NrOiAgMTYgZW50cnkgdGJsICgxIHNsb3QpCisgKiAgMTAyNCBieXRlIGJsb2NrOiAgMzIgZW50cnkgdGJsICgxIHNsb3QpCisgKiAgMjA0OCBieXRlIGJsb2NrOiAgNjQgZW50cnkgdGJsICgyIHNsb3QpCisgKiAgNDA5NiBieXRlIGJsb2NrOiAxMjggZW50cnkgdGJsICg0IHNsb3QpCisgKgorICogZGF0YSBhcmVhOgorICogICA1MTIgYnl0ZSBibG9jazogIDE2IC0gMiA9ICAxNCBzbG90CisgKiAgMTAyNCBieXRlIGJsb2NrOiAgMzIgLSAyID0gIDMwIHNsb3QKKyAqICAyMDQ4IGJ5dGUgYmxvY2s6ICA2NCAtIDMgPSAgNjEgc2xvdAorICogIDQwOTYgYnl0ZSBibG9jazogMTI4IC0gNSA9IDEyMyBzbG90CisgKgorICogTi5CLiBpbmRleCBpcyAwLWJhc2VkOyBpbmRleCBmaWVsZHMgcmVmZXIgdG8gc2xvdCBpbmRleAorICogZXhjZXB0IG5leHRpbmRleCB3aGljaCByZWZlcnMgdG8gZW50cnkgaW5kZXggaW4gc3RibDsKKyAqIGVuZCBvZiBlbnRyeSBzdG90IGxpc3Qgb3IgZnJlZWxpc3QgaXMgbWFya2VkIHdpdGggLTEuCisgKi8KK3R5cGVkZWYgdW5pb24geworCXN0cnVjdCB7CisJCXM2NCBuZXh0OwkvKiA4OiBuZXh0IHNpYmxpbmcgKi8KKwkJczY0IHByZXY7CS8qIDg6IHByZXZpb3VzIHNpYmxpbmcgKi8KKworCQl1OCBmbGFnOwkvKiAxOiAqLworCQlzOCBuZXh0aW5kZXg7CS8qIDE6IG5leHQgZW50cnkgaW5kZXggaW4gc3RibCAqLworCQlzOCBmcmVlY250OwkvKiAxOiAqLworCQlzOCBmcmVlbGlzdDsJLyogMTogc2xvdCBpbmRleCBvZiBoZWFkIG9mIGZyZWVsaXN0ICovCisKKwkJdTggbWF4c2xvdDsJLyogMTogbnVtYmVyIG9mIHNsb3RzIGluIHBhZ2Ugc2xvdFtdICovCisJCXM4IHN0YmxpbmRleDsJLyogMTogc2xvdCBpbmRleCBvZiBzdGFydCBvZiBzdGJsICovCisJCXU4IHJzcnZkWzJdOwkvKiAyOiAqLworCisJCXB4ZF90IHNlbGY7CS8qIDg6IHNlbGYgcHhkICovCisJfSBoZWFkZXI7CQkvKiAoMzIpICovCisKKwlkdHNsb3RfdCBzbG90WzEyOF07Cit9IGR0cGFnZV90OworCisvKiBmcm9tIGpmc194dHJlZS5oICovCisKKy8qCisgKiAgICAgIGV4dGVudCBhbGxvY2F0aW9uIGRlc2NyaXB0b3IgKHhhZCkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGFkIHsKKwl1bnNpZ25lZCBmbGFnOjg7CS8qIDE6IGZsYWcgKi8KKwl1bnNpZ25lZCByc3ZyZDoxNjsJLyogMjogcmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZCBvZmYxOjg7CS8qIDE6IG9mZnNldCBpbiB1bml0IG9mIGZzYmxrc2l6ZSAqLworCXUzMiBvZmYyOwkJLyogNDogb2Zmc2V0IGluIHVuaXQgb2YgZnNibGtzaXplICovCisJdW5zaWduZWQgbGVuOjI0OwkvKiAzOiBsZW5ndGggaW4gdW5pdCBvZiBmc2Jsa3NpemUgKi8KKwl1bnNpZ25lZCBhZGRyMTo4OwkvKiAxOiBhZGRyZXNzIGluIHVuaXQgb2YgZnNibGtzaXplICovCisJdTMyIGFkZHIyOwkJLyogNDogYWRkcmVzcyBpbiB1bml0IG9mIGZzYmxrc2l6ZSAqLworfSB4YWRfdDsJCQkvKiAoMTYpICovCisKKy8qIHhhZF90IGZpZWxkIGV4dHJhY3Rpb24gKi8KKyNkZWZpbmUgb2Zmc2V0WEFEKHhhZCkJKCgoczY0KSgoeGFkKS0+b2ZmMSkpIDw8IDMyIHwgKCh4YWQpLT5vZmYyKSkKKyNkZWZpbmUgYWRkcmVzc1hBRCh4YWQpCSgoKHM2NCkoKHhhZCktPmFkZHIxKSkgPDwgMzIgfCAoKHhhZCktPmFkZHIyKSkKKyNkZWZpbmUgbGVuZ3RoWEFEKHhhZCkJKCh4YWQpLT5sZW4pCisKKy8qIHBvc3NpYmxlIHZhbHVlcyBmb3IgbWF4ZW50cnkgKi8KKyNkZWZpbmUgWFRQQUdFTUFYU0xPVCAgIDI1NgorI2RlZmluZSBYVEVOVFJZU1RBUlQgICAgMgorCisvKgorICogICAgICB4dHJlZSBwYWdlOgorICovCit0eXBlZGVmIHVuaW9uIHsKKwlzdHJ1Y3QgeHRoZWFkZXIgeworCQlzNjQgbmV4dDsJLyogODogKi8KKwkJczY0IHByZXY7CS8qIDg6ICovCisKKwkJdTggZmxhZzsJLyogMTogKi8KKwkJdTggcnNydmQxOwkvKiAxOiAqLworCQlzMTYgbmV4dGluZGV4OwkvKiAyOiBuZXh0IGluZGV4ID0gbnVtYmVyIG9mIGVudHJpZXMgKi8KKwkJczE2IG1heGVudHJ5OwkvKiAyOiBtYXggbnVtYmVyIG9mIGVudHJpZXMgKi8KKwkJczE2IHJzcnZkMjsJLyogMjogKi8KKworCQlweGRfdCBzZWxmOwkvKiA4OiBzZWxmICovCisJfSBoZWFkZXI7CQkvKiAoMzIpICovCisKKwl4YWRfdCB4YWRbWFRQQUdFTUFYU0xPVF07CS8qIDE2ICogbWF4ZW50cnk6IHhhZCBhcnJheSAqLworfSB4dHBhZ2VfdDsKKworLyogZnJvbSBqZnNfZGlub2RlLmggKi8KKworc3RydWN0IGRpbm9kZSB7CisJLyoKKwkgKiAgICAgIEkuIGJhc2UgYXJlYSAoMTI4IGJ5dGVzKQorCSAqICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICoKKwkgKiBkZWZpbmUgZ2VuZXJpYy9QT1NJWCBhdHRyaWJ1dGVzCisJICovCisJdTMyIGRpX2lub3N0YW1wOwkvKiA0OiBzdGFtcCB0byBzaG93IGlub2RlIGJlbG9uZ3MgdG8gZmlsZXNldCAqLworCXMzMiBkaV9maWxlc2V0OwkJLyogNDogZmlsZXNldCBudW1iZXIgKi8KKwl1MzIgZGlfbnVtYmVyOwkJLyogNDogaW5vZGUgbnVtYmVyLCBha2EgZmlsZSBzZXJpYWwgbnVtYmVyICovCisJdTMyIGRpX2dlbjsJCS8qIDQ6IGlub2RlIGdlbmVyYXRpb24gbnVtYmVyICovCisKKwlweGRfdCBkaV9peHB4ZDsJCS8qIDg6IGlub2RlIGV4dGVudCBkZXNjcmlwdG9yICovCisKKwlzNjQgZGlfc2l6ZTsJCS8qIDg6IHNpemUgKi8KKwlzNjQgZGlfbmJsb2NrczsJCS8qIDg6IG51bWJlciBvZiBibG9ja3MgYWxsb2NhdGVkICovCisKKwl1MzIgZGlfbmxpbms7CQkvKiA0OiBudW1iZXIgb2YgbGlua3MgdG8gdGhlIG9iamVjdCAqLworCisJdTMyIGRpX3VpZDsJCS8qIDQ6IHVzZXIgaWQgb2Ygb3duZXIgKi8KKwl1MzIgZGlfZ2lkOwkJLyogNDogZ3JvdXAgaWQgb2Ygb3duZXIgKi8KKworCXUzMiBkaV9tb2RlOwkJLyogNDogYXR0cmlidXRlLCBmb3JtYXQgYW5kIHBlcm1pc3Npb24gKi8KKworCXN0cnVjdCB0aW1lc3RydWNfdCBkaV9hdGltZTsJLyogODogdGltZSBsYXN0IGRhdGEgYWNjZXNzZWQgKi8KKwlzdHJ1Y3QgdGltZXN0cnVjX3QgZGlfY3RpbWU7CS8qIDg6IHRpbWUgbGFzdCBzdGF0dXMgY2hhbmdlZCAqLworCXN0cnVjdCB0aW1lc3RydWNfdCBkaV9tdGltZTsJLyogODogdGltZSBsYXN0IGRhdGEgbW9kaWZpZWQgKi8KKwlzdHJ1Y3QgdGltZXN0cnVjX3QgZGlfb3RpbWU7CS8qIDg6IHRpbWUgY3JlYXRlZCAqLworCisJZHhkX3QgZGlfYWNsOwkJLyogMTY6IGFjbCBkZXNjcmlwdG9yICovCisKKwlkeGRfdCBkaV9lYTsJCS8qIDE2OiBlYSBkZXNjcmlwdG9yICovCisKKwlzMzIgZGlfbmV4dF9pbmRleDsgIC8qIDQ6IE5leHQgYXZhaWxhYmxlIGRpcl90YWJsZSBpbmRleCAqLworCisJczMyIGRpX2FjbHR5cGU7CQkvKiA0OiBUeXBlIG9mIEFDTCAqLworCisJLyoKKwkgKiAJRXh0ZW5zaW9uIEFyZWFzLgorCSAqCisJICoJSGlzdG9yaWNhbGx5LCB0aGUgaW5vZGUgd2FzIHBhcnRpdGlvbmVkIGludG8gNCAxMjgtYnl0ZSBhcmVhcywKKwkgKgl0aGUgbGFzdCAzIGJlaW5nIGRlZmluZWQgYXMgdW5pb25zIHdoaWNoIGNvdWxkIGhhdmUgbXVsdGlwbGUKKwkgKgl1c2VzLiAgVGhlIGZpcnN0IDk2IGJ5dGVzIGhhZCBiZWVuIGNvbXBsZXRlbHkgdW51c2VkIHVudGlsCisJICoJYW4gaW5kZXggdGFibGUgd2FzIGFkZGVkIHRvIHRoZSBkaXJlY3RvcnkuICBJdCBpcyBub3cgbW9yZQorCSAqCXVzZWZ1bCB0byBkZXNjcmliZSB0aGUgbGFzdCAzLzQgb2YgdGhlIGlub2RlIGFzIGEgc2luZ2xlCisJICoJdW5pb24uICBXZSB3b3VsZCBwcm9iYWJseSBiZSBiZXR0ZXIgb2ZmIHJlZGVzaWduaW5nIHRoZQorCSAqCWVudGlyZSBzdHJ1Y3R1cmUgZnJvbSBzY3JhdGNoLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBicmVhaworCSAqCWNvbW1vbmFsaXR5IHdpdGggT1MvMidzIEpGUyBhdCB0aGlzIHRpbWUuCisJICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJLyoKKwkJCSAqIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0bworCQkJICogZmluZCBhIGRpcmVjdG9yeSBlbnRyeSBmcm9tIGEgMzItYml0IGluZGV4LgorCQkJICogSWYgdGhlIGluZGV4IGlzIHNtYWxsIGVub3VnaCwgdGhlIHRhYmxlIGlzIGlubGluZSwKKwkJCSAqIG90aGVyd2lzZSwgYW4geC10cmVlIHJvb3Qgb3ZlcmxheXMgdGhpcyB0YWJsZQorCQkJICovCisJCQlkaXJfdGFibGVfc2xvdF90IF90YWJsZVsxMl07CS8qIDk2OiBpbmxpbmUgKi8KKworCQkJZHRyb290X3QgX2R0cm9vdDsJCS8qIDI4ODogZHRyZWUgcm9vdCAqLworCQl9IF9kaXI7CQkJCQkvKiAoMzg0KSAqLworI2RlZmluZSBkaV9kaXJ0YWJsZQl1Ll9kaXIuX3RhYmxlCisjZGVmaW5lIGRpX2R0cm9vdAl1Ll9kaXIuX2R0cm9vdAorI2RlZmluZSBkaV9wYXJlbnQgICAgICAgZGlfZHRyb290LmhlYWRlci5pZG90ZG90CisjZGVmaW5lIGRpX0RBU0QJCWRpX2R0cm9vdC5oZWFkZXIuREFTRAorCisJCXN0cnVjdCB7CisJCQl1bmlvbiB7CisJCQkJdTggX2RhdGFbOTZdOwkJLyogOTY6IHVudXNlZCAqLworCQkJCXN0cnVjdCB7CisJCQkJCXZvaWQgKl9pbWFwOwkvKiA0OiB1bnVzZWQgKi8KKwkJCQkJdTMyIF9nZW5nZW47CS8qIDQ6IGdlbmVyYXRvciAqLworCQkJCX0gX2ltYXA7CisJCQl9IF91MTsJCQkJLyogOTY6ICovCisjZGVmaW5lIGRpX2dlbmdlbgl1Ll9maWxlLl91MS5faW1hcC5fZ2VuZ2VuCisKKwkJCXVuaW9uIHsKKwkJCQl4dHBhZ2VfdCBfeHRyb290OworCQkJCXN0cnVjdCB7CisJCQkJCXU4IHVudXNlZFsxNl07CS8qIDE2OiAqLworCQkJCQlkeGRfdCBfZHhkOwkvKiAxNjogKi8KKwkJCQkJdW5pb24geworCQkJCQkJdTMyIF9yZGV2OwkvKiA0OiAqLworCQkJCQkJdTggX2Zhc3RzeW1saW5rWzEyOF07CisJCQkJCX0gX3U7CisJCQkJCXU4IF9pbmxpbmVlYVsxMjhdOworCQkJCX0gX3NwZWNpYWw7CisJCQl9IF91MjsKKwkJfSBfZmlsZTsKKyNkZWZpbmUgZGlfeHRyb290CXUuX2ZpbGUuX3UyLl94dHJvb3QKKyNkZWZpbmUgZGlfZHhkCQl1Ll9maWxlLl91Mi5fc3BlY2lhbC5fZHhkCisjZGVmaW5lIGRpX2J0cm9vdAlkaV94dHJvb3QKKyNkZWZpbmUgZGlfaW5saW5lZGF0YQl1Ll9maWxlLl91Mi5fc3BlY2lhbC5fdQorI2RlZmluZSBkaV9yZGV2CQl1Ll9maWxlLl91Mi5fc3BlY2lhbC5fdS5fcmRldgorI2RlZmluZSBkaV9mYXN0c3ltbGluawl1Ll9maWxlLl91Mi5fc3BlY2lhbC5fdS5fZmFzdHN5bWxpbmsKKyNkZWZpbmUgZGlfaW5saW5lZWEgICAgIHUuX2ZpbGUuX3UyLl9zcGVjaWFsLl9pbmxpbmVlYQorCX0gdTsKK307CisKK3R5cGVkZWYgc3RydWN0IGRpbm9kZSBkaW5vZGVfdDsKKworLyogZGlfbW9kZSAqLworI2RlZmluZSBJRk1UCTB4RjAwMAkJLyogU19JRk1UIC0gbWFzayBvZiBmaWxlIHR5cGUgKi8KKyNkZWZpbmUgSUZESVIJMHg0MDAwCQkvKiBTX0lGRElSIC0gZGlyZWN0b3J5ICovCisjZGVmaW5lIElGUkVHCTB4ODAwMAkJLyogU19JRlJFRyAtIHJlZ3VsYXIgZmlsZSAqLworI2RlZmluZSBJRkxOSwkweEEwMDAJCS8qIFNfSUZMTksgLSBzeW1ib2xpYyBsaW5rICovCisKKy8qIGV4dGVuZGVkIG1vZGUgYml0cyAob24tZGlzayBpbm9kZSBkaV9tb2RlKSAqLworI2RlZmluZSBJTkxJTkVFQSAgICAgICAgMHgwMDA0MDAwMAkvKiBpbmxpbmUgRUEgYXJlYSBmcmVlICovCisKKy8qIGZyb20gamZzX2ltYXAuaCAqLworCisjZGVmaW5lCUVYVFNQRVJJQUcJMTI4CS8qIG51bWJlciBvZiBkaXNrIGlub2RlIGV4dGVudCBwZXIgaWFnICAqLworI2RlZmluZSBTTUFQU1oJCTQJLyogbnVtYmVyIG9mIHdvcmRzIHBlciBzdW1tYXJ5IG1hcCAgICAgICovCisjZGVmaW5lCU1BWEFHCQkxMjgJLyogbWF4aW11bSBudW1iZXIgb2YgYWxsb2NhdGlvbiBncm91cHMgICovCisKKy8qCisgKglpbm9kZSBhbGxvY2F0aW9uIG1hcDoKKyAqIAorICogaW5vZGUgYWxsb2NhdGlvbiBtYXAgY29uc2lzdHMgb2YgCisgKiAuIHRoZSBpbm9kZSBtYXAgY29udHJvbCBwYWdlIGFuZAorICogLiBpbm9kZSBhbGxvY2F0aW9uIGdyb3VwIHBhZ2VzIChwZXIgNDA5NiBpbm9kZXMpCisgKiB3aGljaCBhcmUgYWRkcmVzc2VkIGJ5IHN0YW5kYXJkIEpGUyB4dHJlZS4KKyAqLworLyoKKyAqCWlub2RlIGFsbG9jYXRpb24gZ3JvdXAgcGFnZSAocGVyIDQwOTYgaW5vZGVzIG9mIGFuIEFHKQorICovCit0eXBlZGVmIHN0cnVjdCB7CisJczY0IGFnc3RhcnQ7CQkvKiA4OiBzdGFydGluZyBibG9jayBvZiBhZyAgICAgICAgICAgICAgKi8KKwlzMzIgaWFnbnVtOwkJLyogNDogaW5vZGUgYWxsb2NhdGlvbiBncm91cCBudW1iZXIgICAgICovCisJczMyIGlub2ZyZWVmd2Q7CQkvKiA0OiBhZyBpbm9kZSBmcmVlIGxpc3QgZm9yd2FyZCAgICAgICAgKi8KKwlzMzIgaW5vZnJlZWJhY2s7CS8qIDQ6IGFnIGlub2RlIGZyZWUgbGlzdCBiYWNrICAgICAgICAgICAqLworCXMzMiBleHRmcmVlZndkOwkJLyogNDogYWcgaW5vZGUgZXh0ZW50IGZyZWUgbGlzdCBmb3J3YXJkICovCisJczMyIGV4dGZyZWViYWNrOwkvKiA0OiBhZyBpbm9kZSBleHRlbnQgZnJlZSBsaXN0IGJhY2sgICAgKi8KKwlzMzIgaWFnZnJlZTsJCS8qIDQ6IGlhZyBmcmVlIGxpc3QgICAgICAgICAgICAgICAgICAgICAqLworCisJLyogc3VtbWFyeSBtYXA6IDEgYml0IHBlciBpbm9kZSBleHRlbnQgKi8KKwlzMzIgaW5vc21hcFtTTUFQU1pdOwkvKiAxNjogc3VtIG1hcCBvZiBtYXB3b3JkcyB3LyBmcmVlIGlub2RlczsKKwkJCQkgKiAgICAgIG5vdGU6IHRoaXMgaW5kaWNhdGVzIGZyZWUgYW5kIGJhY2tlZAorCQkJCSAqICAgICAgaW5vZGVzLCBpZiB0aGUgZXh0ZW50IGlzIG5vdCBiYWNrZWQgdGhlCisJCQkJICogICAgICB2YWx1ZSB3aWxsIGJlIDEuICBpZiB0aGUgZXh0ZW50IGlzCisJCQkJICogICAgICBiYWNrZWQgYnV0IGFsbCBpbm9kZXMgYXJlIGJlaW5nIHVzZWQgdGhlCisJCQkJICogICAgICB2YWx1ZSB3aWxsIGJlIDEuICBpZiB0aGUgZXh0ZW50IGlzCisJCQkJICogICAgICBiYWNrZWQgYnV0IGF0IGxlYXN0IG9uZSBvZiB0aGUgaW5vZGVzIGlzCisJCQkJICogICAgICBmcmVlIHRoZSB2YWx1ZSB3aWxsIGJlIDAuCisJCQkJICovCisJczMyIGV4dHNtYXBbU01BUFNaXTsJLyogMTY6IHN1bSBtYXAgb2YgbWFwd29yZHMgdy8gZnJlZSBleHRlbnRzICovCisJczMyIG5mcmVlaW5vczsJCS8qIDQ6IG51bWJlciBvZiBmcmVlIGlub2RlcyAgICAgICAgICAgICAqLworCXMzMiBuZnJlZWV4dHM7CQkvKiA0OiBudW1iZXIgb2YgZnJlZSBleHRlbnRzICAgICAgICAgICAgKi8KKwkvKiAoNzIpICovCisJdTggcGFkWzE5NzZdOwkJLyogMTk3NjogcGFkIHRvIDIwNDggYnl0ZXMgKi8KKwkvKiBhbGxvY2F0aW9uIGJpdCBtYXA6IDEgYml0IHBlciBpbm9kZSAoMCAtIGZyZWUsIDEgLSBhbGxvY2F0ZWQpICovCisJdTMyIHdtYXBbRVhUU1BFUklBR107CS8qIDUxMjogd29ya2luZyBhbGxvY2F0aW9uIG1hcCAgKi8KKwl1MzIgcG1hcFtFWFRTUEVSSUFHXTsJLyogNTEyOiBwZXJzaXN0ZW50IGFsbG9jYXRpb24gbWFwICovCisJcHhkX3QgaW5vZXh0W0VYVFNQRVJJQUddOwkvKiAxMDI0OiBpbm9kZSBleHRlbnQgYWRkcmVzc2VzICovCit9IGlhZ190OwkJCS8qICg0MDk2KSAqLworCisjZW5kaWYgLyogX0pGU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3RhZ2UyL21iX2hlYWRlci5oIGIvc3RhZ2UyL21iX2hlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOTM0NTcKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFnZTIvbWJfaGVhZGVyLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKgorICogIE11bHRpQm9vdCBIZWFkZXIgZGVzY3JpcHRpb24KKyAqLworCitzdHJ1Y3QgbXVsdGlib290X2hlYWRlcgoreworICAvKiBNdXN0IGJlIE1VTFRJQk9PVF9NQUdJQyAtIHNlZSBiZWxvdy4gICovCisgIHVuc2lnbmVkIG1hZ2ljOworICAKKyAgLyogRmVhdHVyZSBmbGFncyAtIHNlZSBiZWxvdy4gICovCisgIHVuc2lnbmVkIGZsYWdzOworICAKKyAgLyoKKyAgICogQ2hlY2tzdW0KKyAgICoKKyAgICogVGhlIGFib3ZlIGZpZWxkcyBwbHVzIHRoaXMgb25lIG11c3QgZXF1YWwgMCBtb2QgMl4zMi4KKyAgICovCisgIHVuc2lnbmVkIGNoZWNrc3VtOworICAKKyAgLyogVGhlc2UgYXJlIG9ubHkgdmFsaWQgaWYgTVVMVElCT09UX0FPVVRfS0xVREdFIGlzIHNldC4gICovCisgIHVuc2lnbmVkIGhlYWRlcl9hZGRyOworICB1bnNpZ25lZCBsb2FkX2FkZHI7CisgIHVuc2lnbmVkIGxvYWRfZW5kX2FkZHI7CisgIHVuc2lnbmVkIGJzc19lbmRfYWRkcjsKKyAgdW5zaWduZWQgZW50cnlfYWRkcjsKKworICAvKiBUaGVzZSBhcmUgb25seSB2YWxpZCBpZiBNVUxUSUJPT1RfVklERU9fTU9ERSBpcyBzZXQuICAqLworICB1bnNpZ25lZCBtb2RlX3R5cGU7CisgIHVuc2lnbmVkIHdpZHRoOworICB1bnNpZ25lZCBoZWlnaHQ7CisgIHVuc2lnbmVkIGRlcHRoOworfTsKKworLyoKKyAqIFRoZSBlbnRpcmUgbXVsdGlib290X2hlYWRlciBtdXN0IGJlIGNvbnRhaW5lZAorICogd2l0aGluIHRoZSBmaXJzdCBNVUxUSUJPT1RfU0VBUkNIIGJ5dGVzIG9mIHRoZSBrZXJuZWwgaW1hZ2UuCisgKi8KKyNkZWZpbmUgTVVMVElCT09UX1NFQVJDSAkJODE5MgorI2RlZmluZSBNVUxUSUJPT1RfRk9VTkQoYWRkciwgbGVuKSBcCisgICghICgoYWRkcikgJiAweDMpIFwKKyAgICYmIChsZW4pID49IDEyIFwKKyAgICYmICooKGludCAqKSAoYWRkcikpID09IE1VTFRJQk9PVF9NQUdJQyBcCisgICAmJiAhICgqKCh1bnNpZ25lZCAqKSAoYWRkcikpICsgKigodW5zaWduZWQgKikgKGFkZHIgKyA0KSkgXAorCSArICooKHVuc2lnbmVkICopIChhZGRyICsgOCkpKSBcCisgICAmJiAoISAoTVVMVElCT09UX0FPVVRfS0xVREdFICYgKigoaW50ICopIChhZGRyICsgNCkpKSB8fCAobGVuKSA+PSAzMikgXAorICAgJiYgKCEgKE1VTFRJQk9PVF9WSURFT19NT0RFICYgKigoaW50ICopIChhZGRyICsgNCkpKSB8fCAobGVuKSA+PSA0OCkpCisKKy8qIE1hZ2ljIHZhbHVlIGlkZW50aWZ5aW5nIHRoZSBtdWx0aWJvb3RfaGVhZGVyLiAgKi8KKyNkZWZpbmUgTVVMVElCT09UX01BR0lDCQkJMHgxQkFEQjAwMgorCisvKgorICogRmVhdHVyZXMgZmxhZ3MgZm9yICdmbGFncycuCisgKiBJZiBhIGJvb3QgbG9hZGVyIHNlZXMgYSBmbGFnIGluIE1VTFRJQk9PVF9NVVNUS05PVyBzZXQKKyAqIGFuZCBpdCBkb2Vzbid0IHVuZGVyc3RhbmQgaXQsIGl0IG11c3QgZmFpbC4KKyAqLworI2RlZmluZSBNVUxUSUJPT1RfTVVTVEtOT1cJCTB4MDAwMEZGRkYKKworLyogY3VycmVudGx5IHVuc3VwcG9ydGVkIGZsYWdzLi4uICB0aGlzIGlzIGEga2luZCBvZiB2ZXJzaW9uIG51bWJlci4gICovCisjZGVmaW5lIE1VTFRJQk9PVF9VTlNVUFBPUlRFRAkJMHgwMDAwRkZGOAorCisvKiBBbGlnbiBhbGwgYm9vdCBtb2R1bGVzIG9uIGkzODYgcGFnZSAoNEtCKSBib3VuZGFyaWVzLiAgKi8KKyNkZWZpbmUgTVVMVElCT09UX1BBR0VfQUxJR04JCTB4MDAwMDAwMDEKKworLyogTXVzdCBwYXNzIG1lbW9yeSBpbmZvcm1hdGlvbiB0byBPUy4gICovCisjZGVmaW5lIE1VTFRJQk9PVF9NRU1PUllfSU5GTwkJMHgwMDAwMDAwMgorCisvKiBNdXN0IHBhc3MgdmlkZW8gaW5mb3JtYXRpb24gdG8gT1MuICAqLworI2RlZmluZSBNVUxUSUJPT1RfVklERU9fTU9ERQkJMHgwMDAwMDAwNAorCisvKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoZSB1c2Ugb2YgdGhlIGFkZHJlc3MgZmllbGRzIGluIHRoZSBoZWFkZXIuICAqLworI2RlZmluZSBNVUxUSUJPT1RfQU9VVF9LTFVER0UJCTB4MDAwMTAwMDAKZGlmZiAtLWdpdCBhL3N0YWdlMi9tYl9pbmZvLmggYi9zdGFnZTIvbWJfaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMWU2M2IKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFnZTIvbWJfaW5mby5oCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKgorICogIFRoZSBzdHJ1Y3R1cmUgdHlwZSAibW9kX2xpc3QiIGlzIHVzZWQgYnkgdGhlICJtdWx0aWJvb3RfaW5mbyIgc3RydWN0dXJlLgorICovCisKK3N0cnVjdCBtb2RfbGlzdAoreworICAvKiB0aGUgbWVtb3J5IHVzZWQgZ29lcyBmcm9tIGJ5dGVzICdtb2Rfc3RhcnQnIHRvICdtb2RfZW5kLTEnIGluY2x1c2l2ZSAqLworICB1bnNpZ25lZCBsb25nIG1vZF9zdGFydDsKKyAgdW5zaWduZWQgbG9uZyBtb2RfZW5kOworICAKKyAgLyogTW9kdWxlIGNvbW1hbmQgbGluZSAqLworICB1bnNpZ25lZCBsb25nIGNtZGxpbmU7CisgIAorICAvKiBwYWRkaW5nIHRvIHRha2UgaXQgdG8gMTYgYnl0ZXMgKG11c3QgYmUgemVybykgKi8KKyAgdW5zaWduZWQgbG9uZyBwYWQ7Cit9OworCisKKy8qCisgKiAgSU5ULTE1LCBBWD1FODIwIHN0eWxlICJBZGRyZXNzUmFuZ2VEZXNjcmlwdG9yIgorICogIC4uLndpdGggYSAic2l6ZSIgcGFyYW1ldGVyIG9uIHRoZSBmcm9udCB3aGljaCBpcyB0aGUgc3RydWN0dXJlIHNpemUgLSA0LAorICogIHBvaW50aW5nIHRvIHRoZSBuZXh0IG9uZSwgdXAgdW50aWwgdGhlIGZ1bGwgYnVmZmVyIGxlbmd0aCBvZiB0aGUgbWVtb3J5CisgKiAgbWFwIGhhcyBiZWVuIHJlYWNoZWQuCisgKi8KKworc3RydWN0IEFkZHJSYW5nZURlc2MKK3sKKyAgdW5zaWduZWQgbG9uZyBzaXplOworICB1bnNpZ25lZCBsb25nIGxvbmcgQmFzZUFkZHI7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyBMZW5ndGg7CisgIHVuc2lnbmVkIGxvbmcgVHlwZTsKKyAgCisgIC8qIHVuc3BlY2lmaWVkIG9wdGlvbmFsIHBhZGRpbmcuLi4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiB1c2FibGUgbWVtb3J5ICJUeXBlIiwgYWxsIG90aGVycyBhcmUgcmVzZXJ2ZWQuICAqLworI2RlZmluZSBNQl9BUkRfTUVNT1JZCQkxCisKKworLyogRHJpdmUgSW5mbyBzdHJ1Y3R1cmUuICAqLworc3RydWN0IGRyaXZlX2luZm8KK3sKKyAgLyogVGhlIHNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUuICAqLworICB1bnNpZ25lZCBsb25nIHNpemU7CisKKyAgLyogVGhlIEJJT1MgZHJpdmUgbnVtYmVyLiAgKi8KKyAgdW5zaWduZWQgY2hhciBkcml2ZV9udW1iZXI7CisKKyAgLyogVGhlIGFjY2VzcyBtb2RlIChzZWUgYmVsb3cpLiAgKi8KKyAgdW5zaWduZWQgY2hhciBkcml2ZV9tb2RlOworCisgIC8qIFRoZSBCSU9TIGdlb21ldHJ5LiAgKi8KKyAgdW5zaWduZWQgc2hvcnQgZHJpdmVfY3lsaW5kZXJzOworICB1bnNpZ25lZCBjaGFyIGRyaXZlX2hlYWRzOworICB1bnNpZ25lZCBjaGFyIGRyaXZlX3NlY3RvcnM7CisKKyAgLyogVGhlIGFycmF5IG9mIEkvTyBwb3J0cyB1c2VkIGZvciB0aGUgZHJpdmUuICAqLworICB1bnNpZ25lZCBzaG9ydCBkcml2ZV9wb3J0c1swXTsKK307CisKKy8qIERyaXZlIE1vZGUuICAqLworI2RlZmluZSBNQl9ESV9DSFNfTU9ERQkJMAorI2RlZmluZSBNQl9ESV9MQkFfTU9ERQkJMQorCisKKy8qIEFQTSBCSU9TIGluZm8uICAqLworc3RydWN0IGFwbV9pbmZvCit7CisgIHVuc2lnbmVkIHNob3J0IHZlcnNpb247CisgIHVuc2lnbmVkIHNob3J0IGNzZWc7CisgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OworICB1bnNpZ25lZCBzaG9ydCBjc2VnXzE2OworICB1bnNpZ25lZCBzaG9ydCBkc2VnXzE2OworICB1bnNpZ25lZCBzaG9ydCBjc2VnX2xlbjsKKyAgdW5zaWduZWQgc2hvcnQgY3NlZ18xNl9sZW47CisgIHVuc2lnbmVkIHNob3J0IGRzZWdfMTZfbGVuOworfTsKKworCisvKgorICogIE11bHRpQm9vdCBJbmZvIGRlc2NyaXB0aW9uCisgKgorICogIFRoaXMgaXMgdGhlIHN0cnVjdCBwYXNzZWQgdG8gdGhlIGJvb3QgaW1hZ2UuICBUaGlzIGlzIGRvbmUgYnkgcGxhY2luZworICogIGl0cyBhZGRyZXNzIGluIHRoZSBFQVggcmVnaXN0ZXIuCisgKi8KKworc3RydWN0IG11bHRpYm9vdF9pbmZvCit7CisgIC8qIE11bHRpQm9vdCBpbmZvIHZlcnNpb24gbnVtYmVyICovCisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIAorICAvKiBBdmFpbGFibGUgbWVtb3J5IGZyb20gQklPUyAqLworICB1bnNpZ25lZCBsb25nIG1lbV9sb3dlcjsKKyAgdW5zaWduZWQgbG9uZyBtZW1fdXBwZXI7CisgIAorICAvKiAicm9vdCIgcGFydGl0aW9uICovCisgIHVuc2lnbmVkIGxvbmcgYm9vdF9kZXZpY2U7CisgIAorICAvKiBLZXJuZWwgY29tbWFuZCBsaW5lICovCisgIHVuc2lnbmVkIGxvbmcgY21kbGluZTsKKyAgCisgIC8qIEJvb3QtTW9kdWxlIGxpc3QgKi8KKyAgdW5zaWduZWQgbG9uZyBtb2RzX2NvdW50OworICB1bnNpZ25lZCBsb25nIG1vZHNfYWRkcjsKKyAgCisgIHVuaW9uCisgIHsKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICAvKiAoYS5vdXQpIEtlcm5lbCBzeW1ib2wgdGFibGUgaW5mbyAqLworICAgICAgdW5zaWduZWQgbG9uZyB0YWJzaXplOworICAgICAgdW5zaWduZWQgbG9uZyBzdHJzaXplOworICAgICAgdW5zaWduZWQgbG9uZyBhZGRyOworICAgICAgdW5zaWduZWQgbG9uZyBwYWQ7CisgICAgfQorICAgIGE7CisgICAgCisgICAgc3RydWN0CisgICAgeworICAgICAgLyogKEVMRikgS2VybmVsIHNlY3Rpb24gaGVhZGVyIHRhYmxlICovCisgICAgICB1bnNpZ25lZCBsb25nIG51bTsKKyAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKKyAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcjsKKyAgICAgIHVuc2lnbmVkIGxvbmcgc2huZHg7CisgICAgfQorICAgIGU7CisgIH0KKyAgc3ltczsKKyAgCisgIC8qIE1lbW9yeSBNYXBwaW5nIGJ1ZmZlciAqLworICB1bnNpZ25lZCBsb25nIG1tYXBfbGVuZ3RoOworICB1bnNpZ25lZCBsb25nIG1tYXBfYWRkcjsKKyAgCisgIC8qIERyaXZlIEluZm8gYnVmZmVyICovCisgIHVuc2lnbmVkIGxvbmcgZHJpdmVzX2xlbmd0aDsKKyAgdW5zaWduZWQgbG9uZyBkcml2ZXNfYWRkcjsKKyAgCisgIC8qIFJPTSBjb25maWd1cmF0aW9uIHRhYmxlICovCisgIHVuc2lnbmVkIGxvbmcgY29uZmlnX3RhYmxlOworICAKKyAgLyogQm9vdCBMb2FkZXIgTmFtZSAqLworICB1bnNpZ25lZCBsb25nIGJvb3RfbG9hZGVyX25hbWU7CisKKyAgLyogQVBNIHRhYmxlICovCisgIHVuc2lnbmVkIGxvbmcgYXBtX3RhYmxlOworCisgIC8qIFZpZGVvICovCisgIHVuc2lnbmVkIGxvbmcgdmJlX2NvbnRyb2xfaW5mbzsKKyAgdW5zaWduZWQgbG9uZyB2YmVfbW9kZV9pbmZvOworICB1bnNpZ25lZCBzaG9ydCB2YmVfbW9kZTsKKyAgdW5zaWduZWQgc2hvcnQgdmJlX2ludGVyZmFjZV9zZWc7CisgIHVuc2lnbmVkIHNob3J0IHZiZV9pbnRlcmZhY2Vfb2ZmOworICB1bnNpZ25lZCBzaG9ydCB2YmVfaW50ZXJmYWNlX2xlbjsKK307CisKKy8qCisgKiAgRmxhZ3MgdG8gYmUgc2V0IGluIHRoZSAnZmxhZ3MnIHBhcmFtZXRlciBhYm92ZQorICovCisKKy8qIGlzIHRoZXJlIGJhc2ljIGxvd2VyL3VwcGVyIG1lbW9yeSBpbmZvcm1hdGlvbj8gKi8KKyNkZWZpbmUgTUJfSU5GT19NRU1PUlkJCQkweDAwMDAwMDAxCisvKiBpcyB0aGVyZSBhIGJvb3QgZGV2aWNlIHNldD8gKi8KKyNkZWZpbmUgTUJfSU5GT19CT09UREVWCQkJMHgwMDAwMDAwMgorLyogaXMgdGhlIGNvbW1hbmQtbGluZSBkZWZpbmVkPyAqLworI2RlZmluZSBNQl9JTkZPX0NNRExJTkUJCQkweDAwMDAwMDA0CisvKiBhcmUgdGhlcmUgbW9kdWxlcyB0byBkbyBzb21ldGhpbmcgd2l0aD8gKi8KKyNkZWZpbmUgTUJfSU5GT19NT0RTCQkJMHgwMDAwMDAwOAorCisvKiBUaGVzZSBuZXh0IHR3byBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlICovCisKKy8qIGlzIHRoZXJlIGEgc3ltYm9sIHRhYmxlIGxvYWRlZD8gKi8KKyNkZWZpbmUgTUJfSU5GT19BT1VUX1NZTVMJCTB4MDAwMDAwMTAKKy8qIGlzIHRoZXJlIGFuIEVMRiBzZWN0aW9uIGhlYWRlciB0YWJsZT8gKi8KKyNkZWZpbmUgTUJfSU5GT19FTEZfU0hEUgkJMHgwMDAwMDAyMAorCisvKiBpcyB0aGVyZSBhIGZ1bGwgbWVtb3J5IG1hcD8gKi8KKyNkZWZpbmUgTUJfSU5GT19NRU1fTUFQCQkJMHgwMDAwMDA0MAorCisvKiBJcyB0aGVyZSBkcml2ZSBpbmZvPyAgKi8KKyNkZWZpbmUgTUJfSU5GT19EUklWRV9JTkZPCQkweDAwMDAwMDgwCisKKy8qIElzIHRoZXJlIGEgY29uZmlnIHRhYmxlPyAgKi8KKyNkZWZpbmUgTUJfSU5GT19DT05GSUdfVEFCTEUJCTB4MDAwMDAxMDAKKworLyogSXMgdGhlcmUgYSBib290IGxvYWRlciBuYW1lPyAgKi8KKyNkZWZpbmUgTUJfSU5GT19CT09UX0xPQURFUl9OQU1FCTB4MDAwMDAyMDAKKworLyogSXMgdGhlcmUgYSBBUE0gdGFibGU/ICAqLworI2RlZmluZSBNQl9JTkZPX0FQTV9UQUJMRQkJMHgwMDAwMDQwMAorCisvKiBJcyB0aGVyZSB2aWRlbyBpbmZvcm1hdGlvbj8gICovCisjZGVmaW5lIE1CX0lORk9fVklERU9fSU5GTwkJMHgwMDAwMDgwMAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgdmFsdWUgbXVzdCBiZSBwcmVzZW50IGluIHRoZSBFQVggcmVnaXN0ZXIuCisgKi8KKworI2RlZmluZSBNVUxUSUJPT1RfVkFMSUQJCQkweDJCQURCMDAyCmRpZmYgLS1naXQgYS9zdGFnZTIvbWQ1LmMgYi9zdGFnZTIvbWQ1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyMDViYQotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMi9tZDUuYwpAQCAtMCwwICsxLDM4MyBAQAorLyogbWQ1LmMgLSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTUQ1IGFsZ29yaXRobSBhbmQgTUQ1IGNyeXB0ICovCisvKgorICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyogU2VlIFJGQyAxMzIxIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBNRDUgYWxnb3JpdGhtLgorICovCisKKyNpbmNsdWRlIDxtZDUuaD4KKyNpZm5kZWYgVEVTVAorIyBpbmNsdWRlIDxzaGFyZWQuaD4KKyNlbmRpZgorCisjaWZkZWYgVEVTVAorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgZGVmaW5lIFVTRV9NRDVfUEFTU1dPUkRTCisjIGRlZmluZSBVU0VfTUQ1CisjZW5kaWYKKworI2lmZGVmIFVTRV9NRDVfUEFTU1dPUkRTCisjIGRlZmluZSBVU0VfTUQ1CisjZW5kaWYKKworI2lmZGVmIFVTRV9NRDUKKworI2RlZmluZSBjcHVfdG9fbGUzMih4KSAoeCkKKyNkZWZpbmUgbGUzMl90b19jcHUoeCkgY3B1X3RvX2xlMzIoeCkKK3R5cGVkZWYgdW5zaWduZWQgaW50IFVJTlQ0OworCisvKiBGLCBHLCBIIGFuZCBJIGFyZSBiYXNpYyBNRDUgZnVuY3Rpb25zLgorICovCisjZGVmaW5lIEYoeCwgeSwgeikgKCgoeCkgJiAoeSkpIHwgKCh+eCkgJiAoeikpKQorI2RlZmluZSBHKHgsIHksIHopICgoKHgpICYgKHopKSB8ICgoeSkgJiAofnopKSkKKyNkZWZpbmUgSCh4LCB5LCB6KSAoKHgpIF4gKHkpIF4gKHopKQorI2RlZmluZSBJKHgsIHksIHopICgoeSkgXiAoKHgpIHwgKH56KSkpCisKKy8qIFJPVEFURV9MRUZUIHJvdGF0ZXMgeCBsZWZ0IG4gYml0cy4KKyAqLworI2RlZmluZSBST1RBVEVfTEVGVCh4LCBuKSAoKCh4KSA8PCAobikpIHwgKCh4ID4+ICgzMiAtIChuKSkpKSkKKworc3RhdGljIFVJTlQ0IGluaXRzdGF0ZVs0XSA9Cit7CisgIDB4Njc0NTIzMDEsIDB4ZWZjZGFiODksIDB4OThiYWRjZmUsIDB4MTAzMjU0NzYgCit9OworCitzdGF0aWMgY2hhciBzMVs0XSA9IHsgIDcsIDEyLCAxNywgMjIgfTsKK3N0YXRpYyBjaGFyIHMyWzRdID0geyAgNSwgIDksIDE0LCAyMCB9Oworc3RhdGljIGNoYXIgczNbNF0gPSB7ICA0LCAxMSwgMTYsIDIzIH07CitzdGF0aWMgY2hhciBzNFs0XSA9IHsgIDYsIDEwLCAxNSwgMjEgfTsKKworc3RhdGljIFVJTlQ0IFRbNjRdID0KK3sKKyAgMHhkNzZhYTQ3OCwgMHhlOGM3Yjc1NiwgMHgyNDIwNzBkYiwgMHhjMWJkY2VlZSwKKyAgMHhmNTdjMGZhZiwgMHg0Nzg3YzYyYSwgMHhhODMwNDYxMywgMHhmZDQ2OTUwMSwKKyAgMHg2OTgwOThkOCwgMHg4YjQ0ZjdhZiwgMHhmZmZmNWJiMSwgMHg4OTVjZDdiZSwKKyAgMHg2YjkwMTEyMiwgMHhmZDk4NzE5MywgMHhhNjc5NDM4ZSwgMHg0OWI0MDgyMSwKKyAgMHhmNjFlMjU2MiwgMHhjMDQwYjM0MCwgMHgyNjVlNWE1MSwgMHhlOWI2YzdhYSwKKyAgMHhkNjJmMTA1ZCwgMHgwMjQ0MTQ1MywgMHhkOGExZTY4MSwgMHhlN2QzZmJjOCwKKyAgMHgyMWUxY2RlNiwgMHhjMzM3MDdkNiwgMHhmNGQ1MGQ4NywgMHg0NTVhMTRlZCwKKyAgMHhhOWUzZTkwNSwgMHhmY2VmYTNmOCwgMHg2NzZmMDJkOSwgMHg4ZDJhNGM4YSwKKyAgMHhmZmZhMzk0MiwgMHg4NzcxZjY4MSwgMHg2ZDlkNjEyMiwgMHhmZGU1MzgwYywKKyAgMHhhNGJlZWE0NCwgMHg0YmRlY2ZhOSwgMHhmNmJiNGI2MCwgMHhiZWJmYmM3MCwKKyAgMHgyODliN2VjNiwgMHhlYWExMjdmYSwgMHhkNGVmMzA4NSwgMHgwNDg4MWQwNSwKKyAgMHhkOWQ0ZDAzOSwgMHhlNmRiOTllNSwgMHgxZmEyN2NmOCwgMHhjNGFjNTY2NSwKKyAgMHhmNDI5MjI0NCwgMHg0MzJhZmY5NywgMHhhYjk0MjNhNywgMHhmYzkzYTAzOSwKKyAgMHg2NTViNTljMywgMHg4ZjBjY2M5MiwgMHhmZmVmZjQ3ZCwgMHg4NTg0NWRkMSwKKyAgMHg2ZmE4N2U0ZiwgMHhmZTJjZTZlMCwgMHhhMzAxNDMxNCwgMHg0ZTA4MTFhMSwKKyAgMHhmNzUzN2U4MiwgMHhiZDNhZjIzNSwgMHgyYWQ3ZDJiYiwgMHhlYjg2ZDM5MQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmI2NHQgPQorIi4vMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworCitzdGF0aWMgVUlOVDQgc3RhdGVbNF07CitzdGF0aWMgdW5zaWduZWQgaW50IGxlbmd0aDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZmZlcls2NF07CisKK3N0YXRpYyB2b2lkCittZDVfdHJhbnNmb3JtIChjb25zdCB1bnNpZ25lZCBjaGFyIGJsb2NrWzY0XSkKK3sKKyAgaW50IGksIGo7CisgIFVJTlQ0IGEsYixjLGQsdG1wOworICBjb25zdCBVSU5UNCAqeCA9IChVSU5UNCAqKSBibG9jazsKKworICBhID0gc3RhdGVbMF07CisgIGIgPSBzdGF0ZVsxXTsKKyAgYyA9IHN0YXRlWzJdOworICBkID0gc3RhdGVbM107CisKKyAgLyogUm91bmQgMSAqLworICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICB0bXAgPSBhICsgRiAoYiwgYywgZCkgKyBsZTMyX3RvX2NwdSAoeFtpXSkgKyBUW2ldOworICAgICAgdG1wID0gUk9UQVRFX0xFRlQgKHRtcCwgczFbaSAmIDNdKTsKKyAgICAgIHRtcCArPSBiOworICAgICAgYSA9IGQ7IGQgPSBjOyBjID0gYjsgYiA9IHRtcDsKKyAgICB9CisgIC8qIFJvdW5kIDIgKi8KKyAgZm9yIChpID0gMCwgaiA9IDE7IGkgPCAxNjsgaSsrLCBqICs9IDUpCisgICAgeworICAgICAgdG1wID0gYSArIEcgKGIsIGMsIGQpICsgbGUzMl90b19jcHUgKHhbaiAmIDE1XSkgKyBUW2krMTZdOworICAgICAgdG1wID0gUk9UQVRFX0xFRlQgKHRtcCwgczJbaSAmIDNdKTsKKyAgICAgIHRtcCArPSBiOworICAgICAgYSA9IGQ7IGQgPSBjOyBjID0gYjsgYiA9IHRtcDsKKyAgICB9CisgIC8qIFJvdW5kIDMgKi8KKyAgZm9yIChpID0gMCwgaiA9IDU7IGkgPCAxNjsgaSsrLCBqICs9IDMpCisgICAgeworICAgICAgdG1wID0gYSArIEggKGIsIGMsIGQpICsgbGUzMl90b19jcHUgKHhbaiAmIDE1XSkgKyBUW2krMzJdOworICAgICAgdG1wID0gUk9UQVRFX0xFRlQgKHRtcCwgczNbaSAmIDNdKTsKKyAgICAgIHRtcCArPSBiOworICAgICAgYSA9IGQ7IGQgPSBjOyBjID0gYjsgYiA9IHRtcDsKKyAgICB9CisgIC8qIFJvdW5kIDQgKi8KKyAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCAxNjsgaSsrLCBqICs9IDcpCisgICAgeworICAgICAgdG1wID0gYSArIEkgKGIsIGMsIGQpICsgbGUzMl90b19jcHUgKHhbaiAmIDE1XSkgKyBUW2krNDhdOworICAgICAgdG1wID0gUk9UQVRFX0xFRlQgKHRtcCwgczRbaSAmIDNdKTsKKyAgICAgIHRtcCArPSBiOworICAgICAgYSA9IGQ7IGQgPSBjOyBjID0gYjsgYiA9IHRtcDsKKyAgICB9CisKKyAgc3RhdGVbMF0gKz0gYTsKKyAgc3RhdGVbMV0gKz0gYjsKKyAgc3RhdGVbMl0gKz0gYzsKKyAgc3RhdGVbM10gKz0gZDsKK30KKworc3RhdGljIHZvaWQKK21kNV9pbml0KHZvaWQpCit7CisgIG1lbWNweSAoKGNoYXIgKikgc3RhdGUsIChjaGFyICopIGluaXRzdGF0ZSwgc2l6ZW9mIChpbml0c3RhdGUpKTsKKyAgbGVuZ3RoID0gMDsKK30KKworc3RhdGljIHZvaWQKK21kNV91cGRhdGUgKGNvbnN0IGNoYXIgKmlucHV0LCBpbnQgaW5wdXRsZW4pCit7CisgIGludCBidWZsZW4gPSBsZW5ndGggJiA2MzsKKyAgbGVuZ3RoICs9IGlucHV0bGVuOworICBpZiAoYnVmbGVuICsgaW5wdXRsZW4gPCA2NCkgCisgICAgeworICAgICAgbWVtY3B5IChidWZmZXIgKyBidWZsZW4sIGlucHV0LCBpbnB1dGxlbik7CisgICAgICBidWZsZW4gKz0gaW5wdXRsZW47CisgICAgICByZXR1cm47CisgICAgfQorICAKKyAgbWVtY3B5IChidWZmZXIgKyBidWZsZW4sIGlucHV0LCA2NCAtIGJ1Zmxlbik7CisgIG1kNV90cmFuc2Zvcm0gKGJ1ZmZlcik7CisgIGlucHV0ICs9IDY0IC0gYnVmbGVuOworICBpbnB1dGxlbiAtPSA2NCAtIGJ1ZmxlbjsKKyAgd2hpbGUgKGlucHV0bGVuID49IDY0KQorICAgIHsKKyAgICAgIG1kNV90cmFuc2Zvcm0gKGlucHV0KTsKKyAgICAgIGlucHV0ICs9IDY0OworICAgICAgaW5wdXRsZW4gLT0gNjQ7CisgICAgfQorICBtZW1jcHkgKGJ1ZmZlciwgaW5wdXQsIGlucHV0bGVuKTsKKyAgYnVmbGVuID0gaW5wdXRsZW47Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICoKK21kNV9maW5hbCgpCit7CisgIGludCBpLCBidWZsZW4gPSBsZW5ndGggJiA2MzsKKworICBidWZmZXJbYnVmbGVuKytdID0gMHg4MDsKKyAgbWVtc2V0IChidWZmZXIrYnVmbGVuLCAwLCA2NCAtIGJ1Zmxlbik7CisgIGlmIChidWZsZW4gPiA1NikKKyAgICB7CisgICAgICBtZDVfdHJhbnNmb3JtIChidWZmZXIpOworICAgICAgbWVtc2V0IChidWZmZXIsIDAsIDY0KTsKKyAgICAgIGJ1ZmxlbiA9IDA7CisgICAgfQorICAKKyAgKihVSU5UNCAqKSAoYnVmZmVyICsgNTYpID0gY3B1X3RvX2xlMzIgKDggKiBsZW5ndGgpOworICAqKFVJTlQ0ICopIChidWZmZXIgKyA2MCkgPSAwOworICBtZDVfdHJhbnNmb3JtIChidWZmZXIpOworCisgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgc3RhdGVbaV0gPSBjcHVfdG9fbGUzMiAoc3RhdGVbaV0pOworICByZXR1cm4gKHVuc2lnbmVkIGNoYXIgKikgc3RhdGU7Cit9CisKKyNpZmRlZiBVU0VfTUQ1X1BBU1NXT1JEUworLyogSWYgQ0hFQ0sgaXMgdHJ1ZSwgY2hlY2sgYSBwYXNzd29yZCBmb3IgY29ycmVjdG5lc3MuIFJldHVybnMgMAorICAgaWYgcGFzc3dvcmQgd2FzIGNvcnJlY3QsIGFuZCBhIHZhbHVlICE9IDAgZm9yIGVycm9yLCBzaW1pbGFybHkKKyAgIHRvIHN0cmNtcC4KKyAgIElmIENIRUNLIGlzIGZhbHNlLCBjcnlwdCBLRVkgYW5kIHNhdmUgdGhlIHJlc3VsdCBpbiBDUllQVEVELgorICAgQ1JZUFRFRCBtdXN0IGhhdmUgYSBzYWx0LiAgKi8KK2ludAorbWQ1X3Bhc3N3b3JkIChjb25zdCBjaGFyICprZXksIGNoYXIgKmNyeXB0ZWQsIGludCBjaGVjaykKK3sKKyAgaW50IGtleWxlbiA9IHN0cmxlbiAoa2V5KTsKKyAgY2hhciAqc2FsdCA9IGNyeXB0ZWQgKyAzOyAvKiBza2lwICQxJCBoZWFkZXIgKi8KKyAgY2hhciAqcDsgCisgIGludCBzYWx0bGVuOworICBpbnQgaSwgbjsKKyAgdW5zaWduZWQgY2hhciBhbHRfcmVzdWx0WzE2XTsKKyAgdW5zaWduZWQgY2hhciAqZGlnZXN0OworCisgIGlmIChjaGVjaykKKyAgICB7CisgICAgICAvKiBJZiBvdXIgY3J5cHRlZCBwYXNzd29yZCBpc24ndCAzIGNoYXJzLCB0aGVuIGl0IGNhbid0IGJlIG1kNQorCSBjcnlwdGVkLiBTbywgdGhleSBkb24ndCBtYXRjaC4gICovCisgICAgICBpZiAoc3RybGVuKGNyeXB0ZWQpIDw9IDMpCisJcmV0dXJuIDE7CisgICAgICAKKyAgICAgIHNhbHRsZW4gPSBzdHJzdHIgKHNhbHQsICIkIikgLSBzYWx0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNoYXIgKmVuZCA9IHN0cnN0ciAoc2FsdCwgIiQiKTsKKyAgICAgIGlmIChlbmQgJiYgZW5kIC0gc2FsdCA8IDgpCisJc2FsdGxlbiA9IGVuZCAtIHNhbHQ7CisgICAgICBlbHNlCisJc2FsdGxlbiA9IDg7CisKKyAgICAgIHNhbHRbc2FsdGxlbl0gPSAnJCc7CisgICAgfQorICAKKyAgbWQ1X2luaXQgKCk7CisgIG1kNV91cGRhdGUgKGtleSwga2V5bGVuKTsKKyAgbWQ1X3VwZGF0ZSAoc2FsdCwgc2FsdGxlbik7CisgIG1kNV91cGRhdGUgKGtleSwga2V5bGVuKTsKKyAgZGlnZXN0ID0gbWQ1X2ZpbmFsICgpOworICBtZW1jcHkgKGFsdF9yZXN1bHQsIGRpZ2VzdCwgMTYpOworICAKKyAgbWVtY3B5ICgoY2hhciAqKSBzdGF0ZSwgKGNoYXIgKikgaW5pdHN0YXRlLCBzaXplb2YgKGluaXRzdGF0ZSkpOworICBsZW5ndGggPSAwOworICBtZDVfdXBkYXRlIChrZXksIGtleWxlbik7CisgIG1kNV91cGRhdGUgKGNyeXB0ZWQsIDMgKyBzYWx0bGVuKTsgLyogaW5jbHVkZSB0aGUgJDEkIGhlYWRlciAqLworICBmb3IgKGkgPSBrZXlsZW47IGkgPiAxNjsgaSAtPSAxNikKKyAgICBtZDVfdXBkYXRlIChhbHRfcmVzdWx0LCAxNik7CisgIG1kNV91cGRhdGUgKGFsdF9yZXN1bHQsIGkpOworCisgIGZvciAoaSA9IGtleWxlbjsgaSA+IDA7IGkgPj49IDEpCisgICAgbWQ1X3VwZGF0ZSAoa2V5ICsgKChpICYgMSkgPyBrZXlsZW4gOiAwKSwgMSk7CisgIGRpZ2VzdCA9IG1kNV9maW5hbCAoKTsKKworICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKQorICAgIHsKKyAgICAgIG1lbWNweSAoYWx0X3Jlc3VsdCwgZGlnZXN0LCAxNik7CisKKyAgICAgIG1lbWNweSAoKGNoYXIgKikgc3RhdGUsIChjaGFyICopIGluaXRzdGF0ZSwgc2l6ZW9mIChpbml0c3RhdGUpKTsKKyAgICAgIGxlbmd0aCA9IDA7CisgICAgICBpZiAoKGkgJiAxKSAhPSAwKQorCW1kNV91cGRhdGUgKGtleSwga2V5bGVuKTsKKyAgICAgIGVsc2UKKwltZDVfdXBkYXRlIChhbHRfcmVzdWx0LCAxNik7CisgICAgICAKKyAgICAgIGlmIChpICUgMyAhPSAwKQorCW1kNV91cGRhdGUgKHNhbHQsIHNhbHRsZW4pOworCisgICAgICBpZiAoaSAlIDcgIT0gMCkKKwltZDVfdXBkYXRlIChrZXksIGtleWxlbik7CisKKyAgICAgIGlmICgoaSAmIDEpICE9IDApCisJbWQ1X3VwZGF0ZSAoYWx0X3Jlc3VsdCwgMTYpOworICAgICAgZWxzZQorCW1kNV91cGRhdGUgKGtleSwga2V5bGVuKTsKKyAgICAgIGRpZ2VzdCA9IG1kNV9maW5hbCAoKTsKKyAgICB9CisKKyAgcCA9IHNhbHQgKyBzYWx0bGVuICsgMTsKKyAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgdyA9IAorCWRpZ2VzdFtpID09IDQgPyA1IDogMTIraV0gfCAoZGlnZXN0WzYraV0gPDwgOCkgfCAoZGlnZXN0W2ldIDw8IDE2KTsKKyAgICAgIGZvciAobiA9IDQ7IG4tLSA+IDA7KQorCXsKKwkgIGlmIChjaGVjaykKKwkgICAgeworCSAgICAgIGlmICgqcCsrICE9IGI2NHRbdyAmIDB4M2ZdKQorCQlyZXR1cm4gMTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgKnArKyA9IGI2NHRbdyAmIDB4M2ZdOworCSAgICB9CisJICAKKwkgIHcgPj49IDY7CisJfQorICAgIH0KKyAgeworICAgIHVuc2lnbmVkIGludCB3ID0gZGlnZXN0WzExXTsKKyAgICBmb3IgKG4gPSAyOyBuLS0gPiAwOykKKyAgICAgIHsKKwlpZiAoY2hlY2spCisJICB7CisJICAgIGlmICgqcCsrICE9IGI2NHRbdyAmIDB4M2ZdKQorCSAgICAgIHJldHVybiAxOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgKnArKyA9IGI2NHRbdyAmIDB4M2ZdOworCSAgfQorCQorCXcgPj49IDY7CisgICAgICB9CisgIH0KKworICBpZiAoISBjaGVjaykKKyAgICAqcCA9ICdcMCc7CisgIAorICByZXR1cm4gKnA7Cit9CisjZW5kaWYKKworI2lmZGVmIFRFU1QKK3N0YXRpYyBjaGFyICoKK21kNSAoY29uc3QgY2hhciAqaW5wdXQpIAoreworICBtZW1jcHkgKChjaGFyICopIHN0YXRlLCAoY2hhciAqKSBpbml0c3RhdGUsIHNpemVvZiAoaW5pdHN0YXRlKSk7CisgIGxlbmd0aCA9IDA7CisgIG1kNV91cGRhdGUgKGlucHV0LCBzdHJsZW4gKGlucHV0KSk7CisgIHJldHVybiBtZDVfZmluYWwgKCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0IChjaGFyICpidWZmZXIsIGNoYXIgKmV4cGVjdGVkKSAKK3sKKyAgY2hhciByZXN1bHRbMTYgKiAzICsxXTsKKyAgdW5zaWduZWQgY2hhciogZGlnZXN0ID0gbWQ1IChidWZmZXIpOworICBpbnQgaTsKKworICBmb3IgKGk9MDsgaSA8IDE2OyBpKyspCisgICAgc3ByaW50ZiAocmVzdWx0KzIqaSwgIiUwMngiLCBkaWdlc3RbaV0pOworCisgIGlmIChzdHJjbXAgKHJlc3VsdCwgZXhwZWN0ZWQpKQorICAgIHByaW50ZiAoIk1ENSglcykgZmFpbGVkOiAlc1xuIiwgYnVmZmVyLCByZXN1bHQpOworICBlbHNlCisgICAgcHJpbnRmICgiTUQ1KCVzKSBPS1xuIiwgYnVmZmVyKTsKK30KKworaW50CittYWluICh2b2lkKQoreworICB0ZXN0ICgiIiwgImQ0MWQ4Y2Q5OGYwMGIyMDRlOTgwMDk5OGVjZjg0MjdlIik7CisgIHRlc3QgKCJhIiwgIjBjYzE3NWI5YzBmMWI2YTgzMWMzOTllMjY5NzcyNjYxIik7CisgIHRlc3QgKCJhYmMiLCAiOTAwMTUwOTgzY2QyNGZiMGQ2OTYzZjdkMjhlMTdmNzIiKTsKKyAgdGVzdCAoIm1lc3NhZ2UgZGlnZXN0IiwgImY5NmI2OTdkN2NiNzkzOGQ1MjVhMmYzMWFhZjE2MWQwIik7CisgIHRlc3QgKCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIsICJjM2ZjZDNkNzYxOTJlNDAwN2RmYjQ5NmNjYTY3ZTEzYiIpOworICB0ZXN0ICgiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiLAorCSJkMTc0YWI5OGQyNzdkOWY1YTU2MTFjMmM5ZjQxOWQ5ZiIpOworICB0ZXN0ICgiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiLAorCSI1N2VkZjRhMjJiZTNjOTU1YWM0OWRhMmUyMTA3YjY3YSIpOworICB0ZXN0ICgiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejM0NTYiLAorCSI2ODMxZmE5MDExNWJiOWE1NGZiY2Q0ZjlmZWUwYjVjNCIpOworICB0ZXN0ICgiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejM0NSIsCisJImJjNDA1MDVjYzk0YTQzYjdmZjNlMmFjMDI3MzI1MjMzIik7CisgIHRlc3QgKCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MzQ1NjciLAorCSJmYTk0YjczYTZmMDcyYTAyMzliNTJhY2FjZmJjZjlmYSIpOworICB0ZXN0ICgiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejM0NTY3ODkwMTIzNCIsCisJImJkMjAxZWFlMTdmMjk1Njg5Mjc0MTRmYTMyNmYxMjY3Iik7CisgIHRlc3QgKCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MzQ1Njc4OTAxMjMiLAorCSI4MDA2M2RiMWU2YjcwYTJlOTFlYWM5MDNmMGU0NmI4NSIpOworCisgIGlmIChjaGVja19tZDVfcGFzc3dvcmQgKCJIZWxsbyB3b3JsZCEiLAorCQkJICAiJDEkc2FsdHN0cmkkWU15Z3V4WE1CcGQyVEVaLnZTLzNxMSIpKQorICAgIHByaW50ZiAoIlBhc3N3b3JkIGRpZmZlcnNcbiIpOworICBlbHNlCisgICAgcHJpbnRmICgiUGFzc3dvcmQgT0tcbiIpOworICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N0YWdlMi9tZDUuaCBiL3N0YWdlMi9tZDUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWRiZDA2Ci0tLSAvZGV2L251bGwKKysrIGIvc3RhZ2UyL21kNS5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qIG1kNS5oIC0gYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIE1ENSBhbGdvcml0aG0gYW5kIE1ENSBjcnlwdCAqLworLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qIElmIENIRUNLIGlzIHRydWUsIGNoZWNrIGEgcGFzc3dvcmQgZm9yIGNvcnJlY3RuZXNzLiBSZXR1cm5zIDAKKyAgIGlmIHBhc3N3b3JkIHdhcyBjb3JyZWN0LCBhbmQgYSB2YWx1ZSAhPSAwIGZvciBlcnJvciwgc2ltaWxhcmx5CisgICB0byBzdHJjbXAuCisgICBJZiBDSEVDSyBpcyBmYWxzZSwgY3J5cHQgS0VZIGFuZCBzYXZlIHRoZSByZXN1bHQgaW4gQ1JZUFRFRC4KKyAgIENSWVBURUQgbXVzdCBoYXZlIGEgc2FsdC4gICovCitleHRlcm4gaW50IG1kNV9wYXNzd29yZCAoY29uc3QgY2hhciAqa2V5LCBjaGFyICpjcnlwdGVkLCBpbnQgY2hlY2spOworCisvKiBGb3IgY29udmVuaWVuY2UuICAqLworI2RlZmluZSBjaGVja19tZDVfcGFzc3dvcmQoa2V5LGNyeXB0ZWQpCW1kNV9wYXNzd29yZCgoa2V5KSwgKGNyeXB0ZWQpLCAxKQorI2RlZmluZSBtYWtlX21kNV9wYXNzd29yZChrZXksY3J5cHRlZCkJbWQ1X3Bhc3N3b3JkKChrZXkpLCAoY3J5cHRlZCksIDApCmRpZmYgLS1naXQgYS9zdGFnZTIvbmJpLmggYi9zdGFnZTIvbmJpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y3MGUyMQotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMi9uYmkuaApAQCAtMCwwICsxLDMzIEBACisvKiBuYmkuaCAtIGRlZmluaXRpb25zIGZvciBOZXQgQm9vdCBJbWFnZSAqLworLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgR1JVQl9OQklfSEVBREVSCisjZGVmaW5lIEdSVUJfTkJJX0hFQURFUgorCisjZGVmaW5lIE5CSV9NQUdJQwkJMHgxQjAzMTMzNgorI2RlZmluZSBOQklfREVTVF9BRERSCQkweDEwMDAwCisjZGVmaW5lIE5CSV9ERVNUX1NFRwkJMHgxMDAwCisjZGVmaW5lIE5CSV9ERVNUX09GRgkJMHgwMDAwCisjZGVmaW5lIFJFTE9DQVRFRF9BRERSCQkweDgwMDAKKyNkZWZpbmUgUkVMT0NBVEVEX1NFRwkJMHgwODAwCisjZGVmaW5lIFJFTE9DQVRFRF9PRkYJCTB4MDAwMAorI2RlZmluZSBTVEFHRTJfU1RBUlRfQUREUgkweDgyMDAKKworI2VuZGlmIC8qICEgR1JVQl9OQklfSEVBREVSICovCmRpZmYgLS1naXQgYS9zdGFnZTIvbmJsb2FkZXIuUyBiL3N0YWdlMi9uYmxvYWRlci5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YWQ5MzYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFnZTIvbmJsb2FkZXIuUwpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bmJpLmg+CisjaW5jbHVkZSA8ZGlza2xlc3Nfc2l6ZS5oPgorCQkJCisJLmZpbGUJIm5ibG9hZGVyLlMiCisJLnRleHQKKwkuY29kZTE2CisJCisJLyogSnVzdCBhIGR1bW15IGVudHJ5ICovCisuZ2xvYmwgX3N0YXJ0OyBfc3RhcnQ6CisKKwkvKgorCSAqIG5ldGJvb3QgaW1hZ2UgaGVhZGVyCisJICovCisKKwkubG9uZwlOQklfTUFHSUMKKwkubG9uZwkweDAwMDAwMDA0CisJLyogbG9hZCBhZGRyZXNzIG9mIHRoZSBmaXJzdCBibG9jayAgKi8KKwkud29yZAlOQklfREVTVF9PRkYKKwkud29yZAlOQklfREVTVF9TRUcKKwkvKiBzdGFydCBhZGRyIG9mIHRoZSByZWxvY2F0aW9uIGNvZGUgKi8KKwkud29yZAlOQklfREVTVF9PRkYgKyAocmVsb2NhdGUgLSBfc3RhcnQpCisJLndvcmQJTkJJX0RFU1RfU0VHCisKKwkubG9uZwkweDA0MDAwMDA0CisJLmxvbmcJTkJJX0RFU1RfQUREUiArIDB4MDIwMAorCS5sb25nCURJU0tMRVNTX1NJWkUKKwkubG9uZwlESVNLTEVTU19TSVpFCisKK3JlbG9jYXRlOgorCS8qCisJICogVGhpcyBjb2RlIGlzIGZvciBub3cgbG9jYXRlZCBhdCAweDEwMDAwLgorCSAqIFJlbG9jYXRlIHRoZSBjb2RlIGluIHR3byBzdGVwczoKKwkgKiAxLiBDb3B5IHRoZSBmaXJzdCAzMmsgdG8gMHg4MDAwIGFuZCBqdW1wIHRvIHRoZSByZWxvY2F0ZWQgYXJlYS4KKwkgKiAyLiBDb3B5IHRoZSByZXN0IHRvIDB4MTAwMDAgKDB4ODAwMCArIDMyaykuCisJICovCisKKwkvKiBDb3B5IHRoZSBmaXJzdCAzMmsgICovCisJbW92dwkkTkJJX0RFU1RfU0VHLCAlYXgKKwltb3Z3CSVheCwgJWRzCisJbW92dwkkUkVMT0NBVEVEX1NFRywgJWF4CisJbW92dwklYXgsICVlcworCXhvcncJJXNpLCAlc2kKKwl4b3J3CSVkaSwgJWRpCisJLyogQWx3YXlzIGNvcHkgMzJrIGJ5dGVzICovCisJbW92dwkkMHg0MDAwLCAlY3gKKworCWNsZAorCXJlcAorCW1vdnN3CisKKwkvKiBKdW1wIHRvIHRoZSByZWxvY2F0ZWQgYWRkcmVzcyAqLworCWxqbXAJJDAsICQoUkVMT0NBVEVEX0FERFIgKyBjb3B5X3Jlc3QgLSBfc3RhcnQpCisKKwkvKiBDb3B5IHRoZSByZXN0ICovCitjb3B5X3Jlc3Q6CisJLyogU2V0ICVlZHggdG8gdGhlIG51bWJlciBvZiBieXRlcyAqLworCW1vdmwJJChESVNLTEVTU19TSVpFICsgMHgyMDAgLSAweDgwMDApLCAlZWR4CisJCitjb3B5X2xvb3A6CisJLyogQ2hlY2sgdGhlIHJlc3QgKi8KKwlvcmwJJWVkeCwgJWVkeAorCWp6CWJvb3Rfc3RhZ2UyCisKKwkvKiBDb3B5IGJ5IDMyaywgYXMgdGhhdCBpcyBlYXN5IHRvIGltcGxlbWVudCAqLworCW1vdmwJJDB4ODAwMCwgJWVjeAorCWNtcGwJJWVjeCwgJWVkeAorCWpnCWNvcHkKKwltb3ZsCSVlZHgsICVlY3gKKwkKK2NvcHk6CisJLyogVXBkYXRlIHRoZSBudW1iZXIgb2YgcmVzdCBieXRlcyAqLworCXN1YmwJJWVjeCwgJWVkeAorCisJLyogQWRkIDB4MDgwMCAoMzJrID4+IDQpIGludG8gJWVzIGFuZCAlZHMgKi8KKwltb3Z3CSVlcywgJWF4CisJYWRkdwkkMHgwODAwLCAlYXgKKwltb3Z3CSVheCwgJWVzCisJbW92dwklZHMsICVheAorCWFkZHcJJDB4ODAwLCAlYXgKKwltb3Z3CSVheCwgJWRzCisJCisJLyogWmVybyB0aGUgb2Zmc2V0cyAqLworCXhvcncJJXNpLCAlc2kKKwl4b3J3CSVkaSwgJWRpCisJCisJLyogVXNlIHdvcmQtc2l6ZSBjb3B5ICovCisJYWRkdwkkMSwgJWN4CisJc2hydwkkMSwgJWN4CisKKwkvKiBUaGUgZGlyZWN0aW9uIGlzIGFscmVhZHkgY29ycmVjdCAqLworCXJlcAorCW1vdnN3CisKKwlqbXAJY29weV9sb29wCisKKwkvKiBKdW1wIHRvIHRoZSBzdGFnZTIgKi8KK2Jvb3Rfc3RhZ2UyOgorCWxqbXAJJDAsICRTVEFHRTJfU1RBUlRfQUREUgorCQorCS8qIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBsZW5ndGggb2YgdGhpcyBpbWFnZSB3aWxsIGJlIDEgc2VjdG9yICovCisJLiA9IF9zdGFydCArIDB4MjAwIC0gMQorCS5ieXRlCTAKZGlmZiAtLWdpdCBhL3N0YWdlMi9wY19zbGljZS5oIGIvc3RhZ2UyL3BjX3NsaWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM4ZDk3ZgotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMi9wY19zbGljZS5oCkBAIC0wLDAgKzEsMjUxIEBACisvKgorICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCwyMDAxLDIwMDMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX1BDX1NMSUNFX0gKKyNkZWZpbmUgX1BDX1NMSUNFX0gKKworLyoKKyAqICBUaGVzZSBkZWZpbmUgdGhlIGJhc2ljIFBDIE1CUiBzZWN0b3IgY2hhcmFjdGVyaXN0aWNzCisgKi8KKworI2RlZmluZSBQQ19NQlJfU0VDVE9SICAwCisKKyNkZWZpbmUgUENfTUJSX1NJR19PRkZTRVQgIDUxMAorI2RlZmluZSBQQ19NQlJfU0lHTkFUVVJFICAgMHhhYTU1CisKKyNkZWZpbmUgUENfU0xJQ0VfT0ZGU0VUIDQ0NgorI2RlZmluZSBQQ19TTElDRV9NQVggICAgNAorCisKKy8qCisgKiAgRGVmaW5lcyB0byBndWFyYW50ZWUgc3RydWN0dXJhbCBhbGlnbm1lbnQuCisgKi8KKworI2RlZmluZSBQQ19NQlJfQ0hFQ0tfU0lHKG1icl9wdHIpIFwKKyAgKCAqKCAodW5zaWduZWQgc2hvcnQgKikgKCgoaW50KSBtYnJfcHRyKSArIFBDX01CUl9TSUdfT0ZGU0VUKSApIFwKKyAgID09IFBDX01CUl9TSUdOQVRVUkUgKQorCisjZGVmaW5lIFBDX01CUl9TSUcobWJyX3B0cikgXAorICAoICooICh1bnNpZ25lZCBzaG9ydCAqKSAoKChpbnQpIG1icl9wdHIpICsgUENfTUJSX1NJR19PRkZTRVQpICkgKQorCisjZGVmaW5lIFBDX1NMSUNFX0ZMQUcobWJyX3B0ciwgcGFydCkgXAorICAoICooICh1bnNpZ25lZCBjaGFyICopICgoKGludCkgbWJyX3B0cikgKyBQQ19TTElDRV9PRkZTRVQgXAorCQkJICArIChwYXJ0IDw8IDQpKSApICkKKworI2RlZmluZSBQQ19TTElDRV9IRUFEKG1icl9wdHIsIHBhcnQpIFwKKyAgKCAqKCAodW5zaWduZWQgY2hhciAqKSAoKChpbnQpIG1icl9wdHIpICsgUENfU0xJQ0VfT0ZGU0VUICsgMSBcCisJCQkgICsgKHBhcnQgPDwgNCkpICkgKQorCisjZGVmaW5lIFBDX1NMSUNFX1NFQyhtYnJfcHRyLCBwYXJ0KSBcCisgICggKiggKHVuc2lnbmVkIGNoYXIgKikgKCgoaW50KSBtYnJfcHRyKSArIFBDX1NMSUNFX09GRlNFVCArIDIgXAorCQkJICArIChwYXJ0IDw8IDQpKSApICkKKworI2RlZmluZSBQQ19TTElDRV9DWUwobWJyX3B0ciwgcGFydCkgXAorICAoICooICh1bnNpZ25lZCBjaGFyICopICgoKGludCkgbWJyX3B0cikgKyBQQ19TTElDRV9PRkZTRVQgKyAzIFwKKwkJCSAgKyAocGFydCA8PCA0KSkgKSApCisKKyNkZWZpbmUgUENfU0xJQ0VfVFlQRShtYnJfcHRyLCBwYXJ0KSBcCisgICggKiggKHVuc2lnbmVkIGNoYXIgKikgKCgoaW50KSBtYnJfcHRyKSArIFBDX1NMSUNFX09GRlNFVCArIDQgXAorCQkJICArIChwYXJ0IDw8IDQpKSApICkKKworI2RlZmluZSBQQ19TTElDRV9FSEVBRChtYnJfcHRyLCBwYXJ0KSBcCisgICggKiggKHVuc2lnbmVkIGNoYXIgKikgKCgoaW50KSBtYnJfcHRyKSArIFBDX1NMSUNFX09GRlNFVCArIDUgXAorCQkJICArIChwYXJ0IDw8IDQpKSApICkKKworI2RlZmluZSBQQ19TTElDRV9FU0VDKG1icl9wdHIsIHBhcnQpIFwKKyAgKCAqKCAodW5zaWduZWQgY2hhciAqKSAoKChpbnQpIG1icl9wdHIpICsgUENfU0xJQ0VfT0ZGU0VUICsgNiBcCisJCQkgICsgKHBhcnQgPDwgNCkpICkgKQorCisjZGVmaW5lIFBDX1NMSUNFX0VDWUwobWJyX3B0ciwgcGFydCkgXAorICAoICooICh1bnNpZ25lZCBjaGFyICopICgoKGludCkgbWJyX3B0cikgKyBQQ19TTElDRV9PRkZTRVQgKyA3IFwKKwkJCSAgKyAocGFydCA8PCA0KSkgKSApCisKKyNkZWZpbmUgUENfU0xJQ0VfU1RBUlQobWJyX3B0ciwgcGFydCkgXAorICAoICooICh1bnNpZ25lZCBsb25nICopICgoKGludCkgbWJyX3B0cikgKyBQQ19TTElDRV9PRkZTRVQgKyA4IFwKKwkJCSAgKyAocGFydCA8PCA0KSkgKSApCisKKyNkZWZpbmUgUENfU0xJQ0VfTEVOR1RIKG1icl9wdHIsIHBhcnQpIFwKKyAgKCAqKCAodW5zaWduZWQgbG9uZyAqKSAoKChpbnQpIG1icl9wdHIpICsgUENfU0xJQ0VfT0ZGU0VUICsgMTIgXAorCQkJICArIChwYXJ0IDw8IDQpKSApICkKKworCisvKgorICogIFBDIGZsYWcgdHlwZXMgYXJlIGRlZmluZWQgaGVyZS4KKyAqLworCisjZGVmaW5lIFBDX1NMSUNFX0ZMQUdfTk9ORSAgICAgIDAKKyNkZWZpbmUgUENfU0xJQ0VfRkxBR19CT09UQUJMRSAgMHg4MAorCisvKgorICogIEtub3duIFBDIHBhcnRpdGlvbiB0eXBlcyBhcmUgZGVmaW5lZCBoZXJlLgorICovCisKKy8qIFRoaXMgaXMgbm90IGEgZmxhZyBhY3R1YWxseSwgYnV0IHVzZWQgYXMgaWYgaXQgd2VyZSBhIGZsYWcuICAqLworI2RlZmluZSBQQ19TTElDRV9UWVBFX0hJRERFTl9GTEFHCTB4MTAKKworI2RlZmluZSBQQ19TTElDRV9UWVBFX05PTkUgICAgICAgICAJMAorI2RlZmluZSBQQ19TTElDRV9UWVBFX0ZBVDEyICAgICAgICAJMQorI2RlZmluZSBQQ19TTElDRV9UWVBFX0ZBVDE2X0xUMzJNICAJNAorI2RlZmluZSBQQ19TTElDRV9UWVBFX0VYVEVOREVEICAgICAJNQorI2RlZmluZSBQQ19TTElDRV9UWVBFX0ZBVDE2X0dUMzJNICAJNgorI2RlZmluZSBQQ19TTElDRV9UWVBFX0ZBVDMyCQkweGIKKyNkZWZpbmUgUENfU0xJQ0VfVFlQRV9GQVQzMl9MQkEJCTB4YworI2RlZmluZSBQQ19TTElDRV9UWVBFX0ZBVDE2X0xCQQkJMHhlCisjZGVmaW5lIFBDX1NMSUNFX1RZUEVfV0lOOTVfRVhURU5ERUQJMHhmCisjZGVmaW5lIFBDX1NMSUNFX1RZUEVfRVpEICAgICAgICAJMHg1NQorI2RlZmluZSBQQ19TTElDRV9UWVBFX01JTklYCQkweDgwCisjZGVmaW5lIFBDX1NMSUNFX1RZUEVfTElOVVhfTUlOSVgJMHg4MQorI2RlZmluZSBQQ19TTElDRV9UWVBFX0VYVDJGUyAgICAgICAJMHg4MworI2RlZmluZSBQQ19TTElDRV9UWVBFX0xJTlVYX0VYVEVOREVECTB4ODUKKyNkZWZpbmUgUENfU0xJQ0VfVFlQRV9WU1RBRlMJCTB4OWUKKyNkZWZpbmUgUENfU0xJQ0VfVFlQRV9ERUxMX1VUSUwJCTB4ZGUKKyNkZWZpbmUgUENfU0xJQ0VfVFlQRV9MSU5VWF9SQUlECTB4ZmQKKworCisvKiBGb3IgY29udmluaWVuY2UuICAqLworLyogQ2hlY2sgaWYgVFlQRSBpcyBhIEZBVCBwYXJ0aXRpb24gdHlwZS4gQ2xlYXIgdGhlIGhpZGRlbiBmbGFnIGJlZm9yZQorICAgdGhlIGNoZWNrLCB0byBhbGxvdyB0aGUgdXNlciB0byBtb3VudCBhIGhpZGRlbiBwYXJ0aXRpb24gaW4gR1JVQi4gICovCisjZGVmaW5lIElTX1BDX1NMSUNFX1RZUEVfRkFUKHR5cGUpCVwKKyAgKHsgaW50IF90eXBlID0gKHR5cGUpICYgflBDX1NMSUNFX1RZUEVfSElEREVOX0ZMQUc7IFwKKyAgICAgX3R5cGUgPT0gUENfU0xJQ0VfVFlQRV9GQVQxMiBcCisgICAgIHx8IF90eXBlID09IFBDX1NMSUNFX1RZUEVfRkFUMTZfTFQzMk0gXAorICAgICB8fCBfdHlwZSA9PSBQQ19TTElDRV9UWVBFX0ZBVDE2X0dUMzJNIFwKKyAgICAgfHwgX3R5cGUgPT0gUENfU0xJQ0VfVFlQRV9GQVQxNl9MQkEgXAorICAgICB8fCBfdHlwZSA9PSBQQ19TTElDRV9UWVBFX0ZBVDMyIFwKKyAgICAgfHwgX3R5cGUgPT0gUENfU0xJQ0VfVFlQRV9GQVQzMl9MQkEgXAorICAgICB8fCBfdHlwZSA9PSBQQ19TTElDRV9UWVBFX0RFTExfVVRJTDsgfSkKKworI2RlZmluZSBJU19QQ19TTElDRV9UWVBFX0VYVEVOREVEKHR5cGUpCVwKKyAgKCgodHlwZSkgPT0gUENfU0xJQ0VfVFlQRV9FWFRFTkRFRCkJXAorICAgfHwgKCh0eXBlKSA9PSBQQ19TTElDRV9UWVBFX1dJTjk1X0VYVEVOREVEKQlcCisgICB8fCAoKHR5cGUpID09IFBDX1NMSUNFX1RZUEVfTElOVVhfRVhURU5ERUQpKQorCisjZGVmaW5lIElTX1BDX1NMSUNFX1RZUEVfTUlOSVgodHlwZSkgXAorICAoKCh0eXBlKSA9PSBQQ19TTElDRV9UWVBFX01JTklYKQlcCisgICB8fCAoKHR5cGUpID09IFBDX1NMSUNFX1RZUEVfTElOVVhfTUlOSVgpKQorCisvKiB0aGVzZSBvbmVzIGFyZSBzcGVjaWFsLCBhcyB0aGV5IHVzZSB0aGVpciBvd24gcGFydGl0aW9uaW5nIHNjaGVtZQorICAgdG8gc3ViZGl2aWRlIHRoZSBQQyBwYXJ0aXRpb25zIGZyb20gdGhlcmUuICAqLworI2RlZmluZSBQQ19TTElDRV9UWVBFX0ZSRUVCU0QJCTB4YTUKKyNkZWZpbmUgUENfU0xJQ0VfVFlQRV9PUEVOQlNECQkweGE2CisjZGVmaW5lIFBDX1NMSUNFX1RZUEVfTkVUQlNECQkweGE5CisKKy8qIEZvciBjb252ZW5pZW5jZS4gICovCisjZGVmaW5lIElTX1BDX1NMSUNFX1RZUEVfQlNEX1dJVEhfRlModHlwZSxmcykJXAorICAoKHR5cGUpID09IChQQ19TTElDRV9UWVBFX0ZSRUVCU0QgfCAoKGZzKSA8PCA4KSkgXAorICAgfHwgKHR5cGUpID09IChQQ19TTElDRV9UWVBFX09QRU5CU0QgfCAoKGZzKSA8PCA4KSkgXAorICAgfHwgKHR5cGUpID09IChQQ19TTElDRV9UWVBFX05FVEJTRCB8IChmcykgPDwgOCkpCisKKyNkZWZpbmUgSVNfUENfU0xJQ0VfVFlQRV9CU0QodHlwZSkJSVNfUENfU0xJQ0VfVFlQRV9CU0RfV0lUSF9GUyh0eXBlLDApCisKKy8qCisgKiAgKkJTRC1zdHlsZSBkaXNrbGFiZWwgJiBwYXJ0aXRpb24gZGVmaW5pdGlvbnMuCisgKgorICogIFRoaXMgaXMgYSBzdWJkaXZpZGVkIHNsaWNlIG9mIHR5cGUgJ1BDX1NMSUNFX1RZUEVfQlNEJywgc28gYWxsIG9mCisgKiAgdGhlc2UsIGV4Y2VwdCB3aGVyZSBub3RlZCwgYXJlIHJlbGF0aXZlIHRvIHRoZSBzbGljZSBpbiBxdWVzdGlvbi4KKyAqLworCisjZGVmaW5lIEJTRF9MQUJFTF9TRUNUT1IgMQorI2RlZmluZSBCU0RfTEFCRUxfTUFHSUMgIDB4ODI1NjQ1NTcKKworI2RlZmluZSBCU0RfTEFCRUxfTUFHX09GRlNFVCAwCisjZGVmaW5lIEJTRF9MQUJFTF9NQUcyX09GRlNFVCAxMzIKKyNkZWZpbmUgQlNEX0xBQkVMX05QQVJUU19PRkZTRVQgMTM4CisjZGVmaW5lIEJTRF9MQUJFTF9OUEFSVFNfTUFYIDgKKworI2RlZmluZSBCU0RfUEFSVF9PRkZTRVQgMTQ4CisKKworLyoKKyAqICBEZWZpbmVzIHRvIGd1YXJhbnRlZSBzdHJ1Y3R1cmFsIGFsaWdubWVudC4KKyAqLworCisjZGVmaW5lIEJTRF9MQUJFTF9DSEVDS19NQUcobF9wdHIpIFwKKyAgKCAqKCAodW5zaWduZWQgbG9uZyAqKSAoKChpbnQpIGxfcHRyKSArIEJTRF9MQUJFTF9NQUdfT0ZGU0VUKSApIFwKKyAgID09ICggKHVuc2lnbmVkIGxvbmcpIEJTRF9MQUJFTF9NQUdJQyApICkKKworI2RlZmluZSBCU0RfTEFCRUxfTUFHKGxfcHRyKSBcCisgICggKiggKHVuc2lnbmVkIGxvbmcgKikgKCgoaW50KSBsX3B0cikgKyBCU0RfTEFCRUxfTUFHX09GRlNFVCkgKSApCisKKyNkZWZpbmUgQlNEX0xBQkVMX0RUWVBFKGxfcHRyKSBcCisgICggKiggKHVuc2lnbmVkIHNob3J0ICopICgoKGludCkgbF9wdHIpICsgQlNEX0xBQkVMX01BR19PRkZTRVQgKyA0KSApICkKKworI2RlZmluZSBCU0RfTEFCRUxfTlBBUlRTKGxfcHRyKSBcCisgICggKiggKHVuc2lnbmVkIHNob3J0ICopICgoKGludCkgbF9wdHIpICsgQlNEX0xBQkVMX05QQVJUU19PRkZTRVQpICkgKQorCisjZGVmaW5lIEJTRF9QQVJUX0xFTkdUSChsX3B0ciwgcGFydCkgXAorICAoICooICh1bnNpZ25lZCBsb25nICopICgoKGludCkgbF9wdHIpICsgQlNEX1BBUlRfT0ZGU0VUIFwKKwkJCSAgKyAocGFydCA8PCA0KSkgKSApCisKKyNkZWZpbmUgQlNEX1BBUlRfU1RBUlQobF9wdHIsIHBhcnQpIFwKKyAgKCAqKCAodW5zaWduZWQgbG9uZyAqKSAoKChpbnQpIGxfcHRyKSArIEJTRF9QQVJUX09GRlNFVCArIDQgXAorCQkJICArIChwYXJ0IDw8IDQpKSApICkKKworI2RlZmluZSBCU0RfUEFSVF9GUkFHX1NJWkUobF9wdHIsIHBhcnQpIFwKKyAgKCAqKCAodW5zaWduZWQgbG9uZyAqKSAoKChpbnQpIGxfcHRyKSArIEJTRF9QQVJUX09GRlNFVCArIDggXAorCQkJICArIChwYXJ0IDw8IDQpKSApICkKKworI2RlZmluZSBCU0RfUEFSVF9UWVBFKGxfcHRyLCBwYXJ0KSBcCisgICggKiggKHVuc2lnbmVkIGNoYXIgKikgKCgoaW50KSBsX3B0cikgKyBCU0RfUEFSVF9PRkZTRVQgKyAxMiBcCisJCQkgICsgKHBhcnQgPDwgNCkpICkgKQorCisjZGVmaW5lIEJTRF9QQVJUX0ZSQUdTX1BFUl9CTE9DSyhsX3B0ciwgcGFydCkgXAorICAoICooICh1bnNpZ25lZCBjaGFyICopICgoKGludCkgbF9wdHIpICsgQlNEX1BBUlRfT0ZGU0VUICsgMTMgXAorCQkJICArIChwYXJ0IDw8IDQpKSApICkKKworI2RlZmluZSBCU0RfUEFSVF9FWFRSQShsX3B0ciwgcGFydCkgXAorICAoICooICh1bnNpZ25lZCBzaG9ydCAqKSAoKChpbnQpIGxfcHRyKSArIEJTRF9QQVJUX09GRlNFVCArIDE0IFwKKwkJCSAgKyAocGFydCA8PCA0KSkgKSApCisKKworLyogcG9zc2libGUgdmFsdWVzIGZvciB0aGUgIkRJU0tUWVBFIi4uLiBhbGwgZXNzZW50aWFsbHkgaXJyZWxldmFudAorICAgZXhjZXB0IGZvciBEVFlQRV9TQ1NJICovCisjZGVmaW5lIERUWVBFX1NNRCAgICAgICAgICAgICAgIDEJLyogU01ELCBYU01EOyBWQVggaHAvdXAgKi8KKyNkZWZpbmUgRFRZUEVfTVNDUCAgICAgICAgICAgICAgMgkvKiBNU0NQICovCisjZGVmaW5lIERUWVBFX0RFQyAgICAgICAgICAgICAgIDMJLyogb3RoZXIgREVDIChyaywgcmwpICovCisjZGVmaW5lIERUWVBFX1NDU0kgICAgICAgICAgICAgIDQJLyogU0NTSSAqLworI2RlZmluZSBEVFlQRV9FU0RJICAgICAgICAgICAgICA1CS8qIEVTREkgaW50ZXJmYWNlICovCisjZGVmaW5lIERUWVBFX1NUNTA2ICAgICAgICAgICAgIDYJLyogU1Q1MDYgZXRjLiAqLworI2RlZmluZSBEVFlQRV9IUElCICAgICAgICAgICAgICA3CS8qIENTLzgwIG9uIEhQLUlCICovCisjZGVmaW5lIERUWVBFX0hQRkwgICAgICAgICAgICAgIDgJLyogSFAgRmliZXItbGluayAqLworI2RlZmluZSBEVFlQRV9GTE9QUFkgICAgICAgICAgICAxMAkvKiBmbG9wcHkgKi8KKworCisvKiBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSAqQlNELXN0eWxlIHBhcnRpdGlvbiB0eXBlICovCisjZGVmaW5lCUZTX1VOVVNFRAkwCS8qIHVudXNlZCAqLworI2RlZmluZQlGU19TV0FQCQkxCS8qIHN3YXAgKi8KKyNkZWZpbmUJRlNfVjYJCTIJLyogU2l4dGggRWRpdGlvbiAqLworI2RlZmluZQlGU19WNwkJMwkvKiBTZXZlbnRoIEVkaXRpb24gKi8KKyNkZWZpbmUJRlNfU1lTVgkJNAkvKiBTeXN0ZW0gViAqLworI2RlZmluZQlGU19WNzFLCQk1CS8qIFY3IHdpdGggMUsgYmxvY2tzICg0LjEsIDIuOSkgKi8KKyNkZWZpbmUJRlNfVjgJCTYJLyogRWlnaHRoIEVkaXRpb24sIDRLIGJsb2NrcyAqLworI2RlZmluZQlGU19CU0RGRlMJNwkvKiA0LjJCU0QgZmFzdCBmaWxlIHN5c3RlbSAqLworI2RlZmluZQlGU19NU0RPUwk4CS8qIE1TRE9TIGZpbGUgc3lzdGVtICovCisjZGVmaW5lCUZTX0JTRExGUwk5CS8qIDQuNEJTRCBsb2ctc3RydWN0dXJlZCBmaWxlIHN5c3RlbSAqLworI2RlZmluZQlGU19PVEhFUgkxMAkvKiBpbiB1c2UsIGJ1dCB1bmtub3duL3Vuc3VwcG9ydGVkICovCisjZGVmaW5lCUZTX0hQRlMJCTExCS8qIE9TLzIgaGlnaC1wZXJmb3JtYW5jZSBmaWxlIHN5c3RlbSAqLworI2RlZmluZQlGU19JU085NjYwCTEyCS8qIElTTyA5NjYwLCBub3JtYWxseSBDRC1ST00gKi8KKyNkZWZpbmUJRlNfQk9PVAkJMTMJLyogcGFydGl0aW9uIGNvbnRhaW5zIGJvb3RzdHJhcCAqLworI2RlZmluZQlGU19BRE9TCQkxNAkvKiBBbWlnYURPUyBmYXN0IGZpbGUgc3lzdGVtICovCisjZGVmaW5lCUZTX0hGUwkJMTUJLyogTWFjaW50b3NoIEhGUyAqLworI2RlZmluZQlGU19GSUxFQ09SRQkxNgkvKiBBY29ybiBGaWxlY29yZSBGaWxpbmcgU3lzdGVtICovCisjZGVmaW5lCUZTX0VYVDJGUwkxNwkvKiBMaW51eCBFeHRlbmRlZCAyIGZpbGUgc3lzdGVtICovCisKKworI2VuZGlmIC8qIF9QQ19TTElDRV9IICovCmRpZmYgLS1naXQgYS9zdGFnZTIvcHJlc2V0X21lbnUuYyBiL3N0YWdlMi9wcmVzZXRfbWVudS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMjQxNzQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFnZTIvcHJlc2V0X21lbnUuYwpAQCAtMCwwICsxLDIyIEBACitjb25zdCBjaGFyICpwcmVzZXRfbWVudSA9CisgICAgInNlcmlhbCAtLXVuaXQ9MCAtLXNwZWVkPTExNTIwMFxuIgorICAgICJ0ZXJtaW5hbCAtLXRpbWVvdXQ9MCAtLWR1bWIgY29uc29sZVxuIgorICAgICJyb290bm92ZXJpZnkgKGhkMCwwKVxuIgorICAgICJkZWZhdWx0IDJcbiIKKyAgICAiZmFsbGJhY2sgMSAwXG4iCisgICAgInRpbWVvdXQgM1xuIgorICAgICJcbiIKKyAgICAidGl0bGUgc3lzbG9hZGVyXG4iCisgICAgImNtZGxpbmUgKGhkMCwwKS9jbWRsaW5lXG4iCisgICAgImtlcm5lbCAtLXVzZS1jbWQtbGluZSAoaGQwLDApL2tlcm5lbFxuIgorICAgICJpbml0cmQgKGhkMCwwKS9yYW1kaXNrXG4iCisgICAgIlxuIgorICAgICJ0aXRsZSByZWNvdmVyeVxuIgorICAgICJjbWRsaW5lIChoZDAsMSkvY21kbGluZVxuIgorICAgICJrZXJuZWwgLS11c2UtY21kLWxpbmUgKGhkMCwxKS9rZXJuZWxcbiIKKyAgICAiaW5pdHJkIChoZDAsMSkvcmFtZGlza1xuIgorICAgICJcbiIKKyAgICAidGl0bGUgc3RkX2Jvb3RcbiIKKyAgICAiY21kbGluZSAoaGQwLDIpL2NtZGxpbmVcbiIKKyAgICAia2VybmVsIC0tdXNlLWNtZC1saW5lIChoZDAsMikva2VybmVsXG4iCisgICAgImluaXRyZCAoaGQwLDIpL3JhbWRpc2tcbiI7CmRpZmYgLS1naXQgYS9zdGFnZTIvcHhlbG9hZGVyLlMgYi9zdGFnZTIvcHhlbG9hZGVyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBlOTVmZQotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMi9weGVsb2FkZXIuUwpAQCAtMCwwICsxLDM2IEBACisvKgorICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKwkuZmlsZQkicHhlbG9hZGVyLlMiCisJLnRleHQKKworCS8qIFN0YXJ0IHdpdGggdGhlIHByZWhpc3RvcmljIGVudmlyb25tZW50Li4uICovCisJLmNvZGUxNgorCQorCS8qIExldCdzIGdvICovCisuZ2xvYmwgX3N0YXJ0OyBfc3RhcnQ6CisKKwkvKiBKdW1wIHRvIHRoZSByZWFsIHdvcmxkICovCisJbGptcAkkMCwgJDB4ODIwMAorCisJLyogVGhpcyByZWdpb24gaXMgYSBqdW5rLiBEbyB5b3Ugc2F5IHRoYXQgdGhpcyBpcyB3YXN0ZWZ1bD8KKwkgICBCdXQgSSBsaWtlIHRoYXQgdGhlIG1lbW9yeSBsYXlvdXQgb2YgdGhlIGJvZHkgaXMgY29uc2lzdGVudAorCSAgIGFtb25nIGRpZmZlcmVudCBzdGFnZTJzIHJhdGhlciB0aGFuIHNjYW1waW5nIGp1c3QgZm9yIDEuNUtCLiAqLworCS4gPSBfc3RhcnQgKyAweDgyMDAgLSAweDdDMDAgLSAxCisJLmJ5dGUJMApkaWZmIC0tZ2l0IGEvc3RhZ2UyL3NlcmlhbC5jIGIvc3RhZ2UyL3NlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YzM3NmYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFnZTIvc2VyaWFsLmMKQEAgLTAsMCArMSw0MzQgQEAKKy8qIHNlcmlhbC5jIC0gc2VyaWFsIGRldmljZSBpbnRlcmZhY2UgKi8KKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMjAwMCwyMDAxLDIwMDIgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmZGVmIFNVUFBPUlRfU0VSSUFMCisKKyNpbmNsdWRlIDxzaGFyZWQuaD4KKyNpbmNsdWRlIDxzZXJpYWwuaD4KKyNpbmNsdWRlIDx0ZXJtLmg+CisjaW5jbHVkZSA8dGVybWluZm8uaD4KKworLyogQW4gaW5wdXQgYnVmZmVyLiAgKi8KK3N0YXRpYyBjaGFyIGlucHV0X2J1Zls4XTsKK3N0YXRpYyBpbnQgbnBlbmRpbmcgPSAwOworCitzdGF0aWMgaW50IHNlcmlhbF94Oworc3RhdGljIGludCBzZXJpYWxfeTsKKworc3RhdGljIGludCBrZWVwX3RyYWNrID0gMTsKKworDAorLyogSGFyZHdhcmUtZGVwZW5kZW50IGRlZmluaXRpb25zLiAgKi8KKworI2lmbmRlZiBHUlVCX1VUSUwKKy8qIFRoZSBzdHJ1Y3R1cmUgZm9yIHNwZWVkIHZzLiBkaXZpc29yLiAgKi8KK3N0cnVjdCBkaXZpc29yCit7CisgIGludCBzcGVlZDsKKyAgdW5zaWduZWQgc2hvcnQgZGl2OworfTsKKworLyogU3RvcmUgdGhlIHBvcnQgbnVtYmVyIG9mIGEgc2VyaWFsIHVuaXQuICAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IHNlcmlhbF9od19wb3J0ID0gMDsKKworLyogVGhlIHRhYmxlIHdoaWNoIGxpc3RzIGNvbW1vbiBjb25maWd1cmF0aW9ucy4gICovCitzdGF0aWMgc3RydWN0IGRpdmlzb3IgZGl2aXNvcl90YWJbXSA9CisgIHsKKyAgICB7IDI0MDAsICAgMHgwMDMwIH0sCisgICAgeyA0ODAwLCAgIDB4MDAxOCB9LAorICAgIHsgOTYwMCwgICAweDAwMEMgfSwKKyAgICB7IDE5MjAwLCAgMHgwMDA2IH0sCisgICAgeyAzODQwMCwgIDB4MDAwMyB9LAorICAgIHsgNTc2MDAsICAweDAwMDIgfSwKKyAgICB7IDExNTIwMCwgMHgwMDAxIH0KKyAgfTsKKworLyogUmVhZCBhIGJ5dGUgZnJvbSBhIHBvcnQuICAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyCitpbmIgKHVuc2lnbmVkIHNob3J0IHBvcnQpCit7CisgIHVuc2lnbmVkIGNoYXIgdmFsdWU7CisKKyAgYXNtIHZvbGF0aWxlICgiaW5iCSV3MSwgJTAiIDogIj1hIiAodmFsdWUpIDogIk5kIiAocG9ydCkpOworICBhc20gdm9sYXRpbGUgKCJvdXRiCSUlYWwsICQweDgwIiA6IDogKTsKKyAgCisgIHJldHVybiB2YWx1ZTsKK30KKworLyogV3JpdGUgYSBieXRlIHRvIGEgcG9ydC4gICovCitzdGF0aWMgaW5saW5lIHZvaWQKK291dGIgKHVuc2lnbmVkIHNob3J0IHBvcnQsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisgIGFzbSB2b2xhdGlsZSAoIm91dGIJJWIwLCAldzEiIDogOiAiYSIgKHZhbHVlKSwgIk5kIiAocG9ydCkpOworICBhc20gdm9sYXRpbGUgKCJvdXRiCSUlYWwsICQweDgwIiA6IDogKTsKK30KKworLyogRmV0Y2ggYSBrZXkuICAqLworaW50CitzZXJpYWxfaHdfZmV0Y2ggKHZvaWQpCit7CisgIGlmIChpbmIgKHNlcmlhbF9od19wb3J0ICsgVUFSVF9MU1IpICYgVUFSVF9EQVRBX1JFQURZKQorICAgIHJldHVybiBpbmIgKHNlcmlhbF9od19wb3J0ICsgVUFSVF9SWCk7CisKKyAgcmV0dXJuIC0xOworfQorCisvKiBQdXQgYSBjaGFyYXJhY3Rlci4gICovCit2b2lkCitzZXJpYWxfaHdfcHV0IChpbnQgYykKK3sKKyAgaW50IHRpbWVvdXQgPSAxMDAwMDA7CisKKyAgLyogV2FpdCB1bnRpbCB0aGUgdHJhbnNtaXR0ZXIgaG9sZGluZyByZWdpc3RlciBpcyBlbXB0eS4gICovCisgIHdoaWxlICgoaW5iIChzZXJpYWxfaHdfcG9ydCArIFVBUlRfTFNSKSAmIFVBUlRfRU1QVFlfVFJBTlNNSVRURVIpID09IDApCisgICAgeworICAgICAgaWYgKC0tdGltZW91dCA9PSAwKQorCS8qIFRoZXJlIGlzIHNvbWV0aGluZyB3cm9uZy4gQnV0IHdoYXQgY2FuIEkgZG8/ICAqLworCXJldHVybjsKKyAgICB9CisKKyAgb3V0YiAoc2VyaWFsX2h3X3BvcnQgKyBVQVJUX1RYLCBjKTsKK30KKwordm9pZAorc2VyaWFsX2h3X2RlbGF5ICh2b2lkKQoreworICBvdXRiICgweDgwLCAwKTsKK30KKworLyogUmV0dXJuIHRoZSBwb3J0IG51bWJlciBmb3IgdGhlIFVOSVR0aCBzZXJpYWwgZGV2aWNlLiAgKi8KK3Vuc2lnbmVkIHNob3J0CitzZXJpYWxfaHdfZ2V0X3BvcnQgKGludCB1bml0KQoreworICAvKiBUaGUgQklPUyBkYXRhIGFyZWEuICAqLworICBjb25zdCB1bnNpZ25lZCBzaG9ydCAqYWRkciA9IChjb25zdCB1bnNpZ25lZCBzaG9ydCAqKSAweDA0MDA7CisgIAorICByZXR1cm4gYWRkclt1bml0XTsKK30KKworLyogSW5pdGlhbGl6ZSBhIHNlcmlhbCBkZXZpY2UuIFBPUlQgaXMgdGhlIHBvcnQgbnVtYmVyIGZvciBhIHNlcmlhbCBkZXZpY2UuCisgICBTUEVFRCBpcyBhIERURS1EVEUgc3BlZWQgd2hpY2ggbXVzdCBiZSBvbmUgb2YgdGhlc2U6IDI0MDAsIDQ4MDAsIDk2MDAsCisgICAxOTIwMCwgMzg0MDAsIDU3NjAwIGFuZCAxMTUyMDAuIFdPUkRfTEVOIGlzIHRoZSB3b3JkIGxlbmd0aCB0byBiZSB1c2VkCisgICBmb3IgdGhlIGRldmljZS4gTGlrZXdpc2UsIFBBUklUWSBpcyB0aGUgdHlwZSBvZiB0aGUgcGFyaXR5IGFuZAorICAgU1RPUF9CSVRfTEVOIGlzIHRoZSBsZW5ndGggb2YgdGhlIHN0b3AgYml0LiBUaGUgcG9zc2libGUgdmFsdWVzIGZvcgorICAgV09SRF9MRU4sIFBBUklUWSBhbmQgU1RPUF9CSVRfTEVOIGFyZSBkZWZpbmVkIGluIHRoZSBoZWFkZXIgZmlsZSBhcworICAgbWFjcm9zLiAgKi8KK2ludAorc2VyaWFsX2h3X2luaXQgKHVuc2lnbmVkIHNob3J0IHBvcnQsIHVuc2lnbmVkIGludCBzcGVlZCwKKwkJaW50IHdvcmRfbGVuLCBpbnQgcGFyaXR5LCBpbnQgc3RvcF9iaXRfbGVuKQoreworICBpbnQgaTsKKyAgdW5zaWduZWQgc2hvcnQgZGl2ID0gMDsKKyAgdW5zaWduZWQgY2hhciBzdGF0dXMgPSAwOworICAKKyAgLyogVHVybiBvZmYgdGhlIGludGVycnVwdC4gICovCisgIG91dGIgKHBvcnQgKyBVQVJUX0lFUiwgMCk7CisKKyAgLyogU2V0IERMQUIuICAqLworICBvdXRiIChwb3J0ICsgVUFSVF9MQ1IsIFVBUlRfRExBQik7CisgIAorICAvKiBTZXQgdGhlIGJhdWQgcmF0ZS4gICovCisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGRpdmlzb3JfdGFiKSAvIHNpemVvZiAoZGl2aXNvcl90YWJbMF0pOyBpKyspCisgICAgaWYgKGRpdmlzb3JfdGFiW2ldLnNwZWVkID09IHNwZWVkKQorICAgICAgeworCWRpdiA9IGRpdmlzb3JfdGFiW2ldLmRpdjsKKwlicmVhazsKKyAgICAgIH0KKyAgCisgIGlmIChkaXYgPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgCisgIG91dGIgKHBvcnQgKyBVQVJUX0RMTCwgZGl2ICYgMHhGRik7CisgIG91dGIgKHBvcnQgKyBVQVJUX0RMSCwgZGl2ID4+IDgpOworICAKKyAgLyogU2V0IHRoZSBsaW5lIHN0YXR1cy4gICovCisgIHN0YXR1cyB8PSBwYXJpdHkgfCB3b3JkX2xlbiB8IHN0b3BfYml0X2xlbjsKKyAgb3V0YiAocG9ydCArIFVBUlRfTENSLCBzdGF0dXMpOworCisgIC8qIEVuYWJsZSB0aGUgRklGTy4gICovCisgIG91dGIgKHBvcnQgKyBVQVJUX0ZDUiwgVUFSVF9FTkFCTEVfRklGTyk7CisKKyAgLyogVHVybiBvbiBEVFIsIFJUUywgYW5kIE9VVDIuICAqLworICBvdXRiIChwb3J0ICsgVUFSVF9NQ1IsIFVBUlRfRU5BQkxFX01PREVNKTsKKworICAvKiBTdG9yZSB0aGUgcG9ydCBudW1iZXIuICAqLworICBzZXJpYWxfaHdfcG9ydCA9IHBvcnQ7CisgIAorICAvKiBEcmFpbiB0aGUgaW5wdXQgYnVmZmVyLiAgKi8KKyAgd2hpbGUgKHNlcmlhbF9jaGVja2tleSAoKSAhPSAtMSkKKyAgICAodm9pZCkgc2VyaWFsX2dldGtleSAoKTsKKworICAvKiBHZXQgcmlkIG9mIFRFUk1fTkVFRF9JTklUIGZyb20gdGhlIHNlcmlhbCB0ZXJtaW5hbC4gICovCisgIGZvciAoaSA9IDA7IHRlcm1fdGFibGVbaV0ubmFtZTsgaSsrKQorICAgIGlmIChncnViX3N0cmNtcCAodGVybV90YWJsZVtpXS5uYW1lLCAic2VyaWFsIikgPT0gMCkKKyAgICAgIHsKKwl0ZXJtX3RhYmxlW2ldLmZsYWdzICY9IH5URVJNX05FRURfSU5JVDsKKwlicmVhazsKKyAgICAgIH0KKworICAvKiBGSVhNRTogc2hvdWxkIGNoZWNrIGlmIHRoZSBzZXJpYWwgdGVybWluYWwgd2FzIGZvdW5kLiAgKi8KKyAgCisgIHJldHVybiAxOworfQorI2VuZGlmIC8qICEgR1JVQl9VVElMICovCisKKwwKKy8qIEdlbmVyaWMgZGVmaW5pdGlvbnMuICAqLworCitzdGF0aWMgdm9pZAorc2VyaWFsX3RyYW5zbGF0ZV9rZXlfc2VxdWVuY2UgKHZvaWQpCit7CisgIGNvbnN0IHN0cnVjdAorICB7CisgICAgY2hhciBrZXk7CisgICAgY2hhciBhc2NpaTsKKyAgfQorICB0aHJlZV9jb2RlX3RhYmxlW10gPQorICAgIHsKKyAgICAgIHsnQScsIDE2fSwKKyAgICAgIHsnQicsIDE0fSwKKyAgICAgIHsnQycsIDZ9LAorICAgICAgeydEJywgMn0sCisgICAgICB7J0YnLCA1fSwKKyAgICAgIHsnSCcsIDF9LAorICAgICAgeyc0JywgNH0KKyAgICB9OworCisgIGNvbnN0IHN0cnVjdAorICB7CisgICAgc2hvcnQga2V5OworICAgIGNoYXIgYXNjaWk7CisgIH0KKyAgZm91cl9jb2RlX3RhYmxlW10gPQorICAgIHsKKyAgICAgIHsoJzEnIHwgKCd+JyA8PCA4KSksIDF9LAorICAgICAgeygnMycgfCAoJ34nIDw8IDgpKSwgNH0sCisgICAgICB7KCc1JyB8ICgnficgPDwgOCkpLCA3fSwKKyAgICAgIHsoJzYnIHwgKCd+JyA8PCA4KSksIDN9LAorICAgIH07CisgIAorICAvKiBUaGUgYnVmZmVyIG11c3Qgc3RhcnQgd2l0aCBgYEVTQyBbJycuICAqLworICBpZiAoKigodW5zaWduZWQgc2hvcnQgKikgaW5wdXRfYnVmKSAhPSAoJ1xlJyB8ICgnWycgPDwgOCkpKQorICAgIHJldHVybjsKKyAgCisgIGlmIChucGVuZGluZyA+PSAzKQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBmb3IgKGkgPSAwOworCSAgIGkgPCBzaXplb2YgKHRocmVlX2NvZGVfdGFibGUpIC8gc2l6ZW9mICh0aHJlZV9jb2RlX3RhYmxlWzBdKTsKKwkgICBpKyspCisJaWYgKHRocmVlX2NvZGVfdGFibGVbaV0ua2V5ID09IGlucHV0X2J1ZlsyXSkKKwkgIHsKKwkgICAgaW5wdXRfYnVmWzBdID0gdGhyZWVfY29kZV90YWJsZVtpXS5hc2NpaTsKKwkgICAgbnBlbmRpbmcgLT0gMjsKKwkgICAgZ3J1Yl9tZW1tb3ZlIChpbnB1dF9idWYgKyAxLCBpbnB1dF9idWYgKyAzLCBucGVuZGluZyAtIDEpOworCSAgICByZXR1cm47CisJICB9CisgICAgfQorCisgIGlmIChucGVuZGluZyA+PSA0KQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgc2hvcnQga2V5ID0gKigoc2hvcnQgKikgKGlucHV0X2J1ZiArIDIpKTsKKworICAgICAgZm9yIChpID0gMDsKKwkgICBpIDwgc2l6ZW9mIChmb3VyX2NvZGVfdGFibGUpIC8gc2l6ZW9mIChmb3VyX2NvZGVfdGFibGVbMF0pOworCSAgIGkrKykKKwlpZiAoZm91cl9jb2RlX3RhYmxlW2ldLmtleSA9PSBrZXkpCisJICB7CisJICAgIGlucHV0X2J1ZlswXSA9IGZvdXJfY29kZV90YWJsZVtpXS5hc2NpaTsKKwkgICAgbnBlbmRpbmcgLT0gMzsKKwkgICAgZ3J1Yl9tZW1tb3ZlIChpbnB1dF9idWYgKyAxLCBpbnB1dF9idWYgKyA0LCBucGVuZGluZyAtIDEpOworCSAgICByZXR1cm47CisJICB9CisgICAgfQorfQorICAgIAorc3RhdGljCitpbnQgZmlsbF9pbnB1dF9idWYgKGludCBub3dhaXQpCit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCAxMDAwMCAmJiBucGVuZGluZyA8IHNpemVvZiAoaW5wdXRfYnVmKTsgaSsrKQorICAgIHsKKyAgICAgIGludCBjOworCisgICAgICBjID0gc2VyaWFsX2h3X2ZldGNoICgpOworICAgICAgaWYgKGMgPj0gMCkKKwl7CisJICBpbnB1dF9idWZbbnBlbmRpbmcrK10gPSBjOworCisJICAvKiBSZXNldCB0aGUgY291bnRlciB0byB6ZXJvLCB0byB3YWl0IGZvciB0aGUgc2FtZSBpbnRlcnZhbC4gICovCisJICBpID0gMDsKKwl9CisgICAgICAKKyAgICAgIGlmIChub3dhaXQpCisJYnJlYWs7CisgICAgfQorCisgIC8qIFRyYW5zbGF0ZSBzb21lIGtleSBzZXF1ZW5jZXMuICAqLworICBzZXJpYWxfdHJhbnNsYXRlX2tleV9zZXF1ZW5jZSAoKTsKKwkgIAorICByZXR1cm4gbnBlbmRpbmc7Cit9CisKKy8qIFRoZSBzZXJpYWwgdmVyc2lvbiBvZiBnZXRrZXkuICAqLworaW50CitzZXJpYWxfZ2V0a2V5ICh2b2lkKQoreworICBpbnQgYzsKKyAgCisgIHdoaWxlICghIGZpbGxfaW5wdXRfYnVmICgwKSkKKyAgICA7CisKKyAgYyA9IGlucHV0X2J1ZlswXTsKKyAgbnBlbmRpbmctLTsKKyAgZ3J1Yl9tZW1tb3ZlIChpbnB1dF9idWYsIGlucHV0X2J1ZiArIDEsIG5wZW5kaW5nKTsKKyAgCisgIHJldHVybiBjOworfQorCisvKiBUaGUgc2VyaWFsIHZlcnNpb24gb2YgY2hlY2trZXkuICAqLworaW50CitzZXJpYWxfY2hlY2trZXkgKHZvaWQpCit7CisgIGlmIChmaWxsX2lucHV0X2J1ZiAoMSkpCisgICAgcmV0dXJuIGlucHV0X2J1ZlswXTsKKworICByZXR1cm4gLTE7Cit9CisKKy8qIFRoZSBzZXJpYWwgdmVyc2lvbiBvZiBncnViX3B1dGNoYXIuICAqLwordm9pZAorc2VyaWFsX3B1dGNoYXIgKGludCBjKQoreworICAvKiBLZWVwIHRyYWNrIG9mIHRoZSBjdXJzb3IuICAqLworICBpZiAoa2VlcF90cmFjaykKKyAgICB7CisgICAgICAvKiBUaGUgc2VyaWFsIHRlcm1pbmFsIGRvZXNuJ3QgaGF2ZSBWR0EgZm9udHMuICAqLworICAgICAgc3dpdGNoIChjKQorCXsKKwljYXNlIERJU1BfVUw6CisJICBjID0gQUNTX1VMQ09STkVSOworCSAgYnJlYWs7CisJY2FzZSBESVNQX1VSOgorCSAgYyA9IEFDU19VUkNPUk5FUjsKKwkgIGJyZWFrOworCWNhc2UgRElTUF9MTDoKKwkgIGMgPSBBQ1NfTExDT1JORVI7CisJICBicmVhazsKKwljYXNlIERJU1BfTFI6CisJICBjID0gQUNTX0xSQ09STkVSOworCSAgYnJlYWs7CisJY2FzZSBESVNQX0hPUklaOgorCSAgYyA9IEFDU19ITElORTsKKwkgIGJyZWFrOworCWNhc2UgRElTUF9WRVJUOgorCSAgYyA9IEFDU19WTElORTsKKwkgIGJyZWFrOworCWNhc2UgRElTUF9MRUZUOgorCSAgYyA9IEFDU19MQVJST1c7CisJICBicmVhazsKKwljYXNlIERJU1BfUklHSFQ6CisJICBjID0gQUNTX1JBUlJPVzsKKwkgIGJyZWFrOworCWNhc2UgRElTUF9VUDoKKwkgIGMgPSBBQ1NfVUFSUk9XOworCSAgYnJlYWs7CisJY2FzZSBESVNQX0RPV046CisJICBjID0gQUNTX0RBUlJPVzsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisgICAgICAKKyAgICAgIHN3aXRjaCAoYykKKwl7CisJY2FzZSAnXHInOgorCSAgc2VyaWFsX3ggPSAwOworCSAgYnJlYWs7CisJICAKKwljYXNlICdcbic6CisJICBzZXJpYWxfeSsrOworCSAgYnJlYWs7CisJICAKKwljYXNlICdcYic6CisJY2FzZSAxMjc6CisJICBpZiAoc2VyaWFsX3ggPiAwKQorCSAgICBzZXJpYWxfeC0tOworCSAgYnJlYWs7CisJICAKKwljYXNlICdcYSc6CisJICBicmVhazsKKwkgIAorCWRlZmF1bHQ6CisJICBpZiAoc2VyaWFsX3ggPj0gNzkpCisJICAgIHsKKwkgICAgICBzZXJpYWxfcHV0Y2hhciAoJ1xyJyk7CisJICAgICAgc2VyaWFsX3B1dGNoYXIgKCdcbicpOworCSAgICB9CisJICBzZXJpYWxfeCsrOworCSAgYnJlYWs7CisJfQorICAgIH0KKyAgCisgIHNlcmlhbF9od19wdXQgKGMpOworfQorCitpbnQKK3NlcmlhbF9nZXR4eSAodm9pZCkKK3sKKyAgcmV0dXJuIChzZXJpYWxfeCA8PCA4KSB8IHNlcmlhbF95OworfQorCit2b2lkCitzZXJpYWxfZ290b3h5IChpbnQgeCwgaW50IHkpCit7CisgIGtlZXBfdHJhY2sgPSAwOworICB0aV9jdXJzb3JfYWRkcmVzcyAoeCwgeSk7CisgIGtlZXBfdHJhY2sgPSAxOworICAKKyAgc2VyaWFsX3ggPSB4OworICBzZXJpYWxfeSA9IHk7Cit9CisKK3ZvaWQKK3NlcmlhbF9jbHMgKHZvaWQpCit7CisgIGtlZXBfdHJhY2sgPSAwOworICB0aV9jbGVhcl9zY3JlZW4gKCk7CisgIGtlZXBfdHJhY2sgPSAxOworICAKKyAgc2VyaWFsX3ggPSBzZXJpYWxfeSA9IDA7Cit9CisKK3ZvaWQKK3NlcmlhbF9zZXRjb2xvcnN0YXRlIChjb2xvcl9zdGF0ZSBzdGF0ZSkKK3sKKyAga2VlcF90cmFjayA9IDA7CisgIGlmIChzdGF0ZSA9PSBDT0xPUl9TVEFURV9ISUdITElHSFQpCisgICAgdGlfZW50ZXJfc3RhbmRvdXRfbW9kZSAoKTsKKyAgZWxzZQorICAgIHRpX2V4aXRfc3RhbmRvdXRfbW9kZSAoKTsKKyAga2VlcF90cmFjayA9IDE7Cit9CisKKyNlbmRpZiAvKiBTVVBQT1JUX1NFUklBTCAqLwpkaWZmIC0tZ2l0IGEvc3RhZ2UyL3NlcmlhbC5oIGIvc3RhZ2UyL3NlcmlhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YzIyMjcKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFnZTIvc2VyaWFsLmgKQEAgLTAsMCArMSw5MyBAQAorLyogc2VyaWFsLmggLSBzZXJpYWwgZGV2aWNlIGludGVyZmFjZSAqLworLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEsMjAwMiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIEdSVUJfU0VSSUFMX0hFQURFUgorI2RlZmluZSBHUlVCX1NFUklBTF9IRUFERVIJMQorCisvKiBNYWNyb3MuICAqLworCisvKiBUaGUgb2Zmc2V0cyBvZiBVQVJUIHJlZ2lzdGVycy4gICovCisjZGVmaW5lIFVBUlRfVFgJCTAKKyNkZWZpbmUgVUFSVF9SWAkJMAorI2RlZmluZSBVQVJUX0RMTAkwCisjZGVmaW5lIFVBUlRfSUVSCTEKKyNkZWZpbmUgVUFSVF9ETEgJMQorI2RlZmluZSBVQVJUX0lJUgkyCisjZGVmaW5lIFVBUlRfRkNSCTIKKyNkZWZpbmUgVUFSVF9MQ1IJMworI2RlZmluZSBVQVJUX01DUgk0CisjZGVmaW5lIFVBUlRfTFNSCTUKKyNkZWZpbmUgVUFSVF9NU1IJNgorI2RlZmluZSBVQVJUX1NSCQk3CisKKy8qIEZvciBMU1IgYml0cy4gICovCisjZGVmaW5lIFVBUlRfREFUQV9SRUFEWQkJMHgwMQorI2RlZmluZSBVQVJUX0VNUFRZX1RSQU5TTUlUVEVSCTB4MjAKKworLyogVGhlIHR5cGUgb2YgcGFyaXR5LiAgKi8KKyNkZWZpbmUgVUFSVF9OT19QQVJJVFkJCTB4MDAKKyNkZWZpbmUgVUFSVF9PRERfUEFSSVRZCQkweDA4CisjZGVmaW5lIFVBUlRfRVZFTl9QQVJJVFkJMHgxOAorCisvKiBUaGUgdHlwZSBvZiB3b3JkIGxlbmd0aC4gICovCisjZGVmaW5lIFVBUlRfNUJJVFNfV09SRAkweDAwCisjZGVmaW5lIFVBUlRfNkJJVFNfV09SRAkweDAxCisjZGVmaW5lIFVBUlRfN0JJVFNfV09SRAkweDAyCisjZGVmaW5lIFVBUlRfOEJJVFNfV09SRAkweDAzCisKKy8qIFRoZSB0eXBlIG9mIHRoZSBsZW5ndGggb2Ygc3RvcCBiaXQuICAqLworI2RlZmluZSBVQVJUXzFfU1RPUF9CSVQJCTB4MDAKKyNkZWZpbmUgVUFSVF8yX1NUT1BfQklUUwkweDA0CisKKy8qIHRoZSBzd2l0Y2ggb2YgRExBQi4gICovCisjZGVmaW5lIFVBUlRfRExBQgkweDgwCisKKy8qIEVuYWJsZSB0aGUgRklGTy4gICovCisjZGVmaW5lIFVBUlRfRU5BQkxFX0ZJRk8JMHhDNworCisvKiBUdXJuIG9uIERUUiwgUlRTLCBhbmQgT1VUMi4gICovCisjZGVmaW5lIFVBUlRfRU5BQkxFX01PREVNCTB4MEIKKworDAorLyogRnVuY3Rpb24gcHJvdG90eXBlcy4gICovCisKKy8qIEZldGNoIGEga2V5LiAgKi8KK2ludCBzZXJpYWxfaHdfZmV0Y2ggKHZvaWQpOworCisvKiBQdXQgYSBjaGFyYWN0ZXIuICAqLwordm9pZCBzZXJpYWxfaHdfcHV0IChpbnQgYyk7CisKKy8qIEluc2VydCBhIGRlbGF5LiAgKi8KK3ZvaWQgc2VyaWFsX2h3X2RlbGF5ICh2b2lkKTsKKworLyogUmV0dXJuIHRoZSBwb3J0IG51bWJlciBmb3IgdGhlIFVOSVR0aCBzZXJpYWwgZGV2aWNlLiAgKi8KK3Vuc2lnbmVkIHNob3J0IHNlcmlhbF9od19nZXRfcG9ydCAoaW50IHVuaXQpOworCisvKiBJbml0aWFsaXplIGEgc2VyaWFsIGRldmljZS4gICovCitpbnQgc2VyaWFsX2h3X2luaXQgKHVuc2lnbmVkIHNob3J0IHBvcnQsIHVuc2lnbmVkIGludCBzcGVlZCwKKwkJICAgIGludCB3b3JkX2xlbiwgaW50IHBhcml0eSwgaW50IHN0b3BfYml0X2xlbik7CisKKyNpZmRlZiBHUlVCX1VUSUwKKy8qIFNldCB0aGUgZmlsZSBuYW1lIG9mIGEgc2VyaWFsIGRldmljZSAob3IgYSBwdHkgZGV2aWNlKS4gVGhpcyBpcyBhCisgICBmdW5jdGlvbiBzcGVjaWZpYyB0byB0aGUgZ3J1YiBzaGVsbC4gICovCit2b2lkIHNlcmlhbF9zZXRfZGV2aWNlIChjb25zdCBjaGFyICpkZXZpY2UpOworI2VuZGlmIC8qIEdSVUJfVVRJTCAqLworCisjZW5kaWYgLyogISBHUlVCX1NFUklBTF9IRUFERVIgKi8KZGlmZiAtLWdpdCBhL3N0YWdlMi9zZXRqbXAuUyBiL3N0YWdlMi9zZXRqbXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTE2MWZlCi0tLSAvZGV2L251bGwKKysrIGIvc3RhZ2UyL3NldGptcC5TCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qIFRoaXMgaXMgc3RvbGVuIGZyb20gbGliYy94ODYvc2V0am1wLlMgaW4gdGhlIE9TS2l0ICovCisvKiAKKyAqIE1hY2ggT3BlcmF0aW5nIFN5c3RlbQorICogQ29weXJpZ2h0IChjKSAxOTkxLDE5OTAsMTk4OSBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgYm90aCB0aGUgY29weXJpZ2h0CisgKiBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhlCisgKiBzb2Z0d2FyZSwgZGVyaXZhdGl2ZSB3b3JrcyBvciBtb2RpZmllZCB2ZXJzaW9ucywgYW5kIGFueSBwb3J0aW9ucworICogdGhlcmVvZiwgYW5kIHRoYXQgYm90aCBub3RpY2VzIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uCisgKiAKKyAqIENBUk5FR0lFIE1FTExPTiBBTExPV1MgRlJFRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSBJTiBJVFMgIkFTIElTIgorICogQ09ORElUSU9OLiAgQ0FSTkVHSUUgTUVMTE9OIERJU0NMQUlNUyBBTlkgTElBQklMSVRZIE9GIEFOWSBLSU5EIEZPUgorICogQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuCisgKiAKKyAqIENhcm5lZ2llIE1lbGxvbiByZXF1ZXN0cyB1c2VycyBvZiB0aGlzIHNvZnR3YXJlIHRvIHJldHVybiB0bworICogCisgKiAgU29mdHdhcmUgRGlzdHJpYnV0aW9uIENvb3JkaW5hdG9yICBvciAgU29mdHdhcmUuRGlzdHJpYnV0aW9uQENTLkNNVS5FRFUKKyAqICBTY2hvb2wgb2YgQ29tcHV0ZXIgU2NpZW5jZQorICogIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CisgKiAgUGl0dHNidXJnaCBQQSAxNTIxMy0zODkwCisgKiAKKyAqIGFueSBpbXByb3ZlbWVudHMgb3IgZXh0ZW5zaW9ucyB0aGF0IHRoZXkgbWFrZSBhbmQgZ3JhbnQgQ2FybmVnaWUgTWVsbG9uCisgKiB0aGUgcmlnaHRzIHRvIHJlZGlzdHJpYnV0ZSB0aGVzZSBjaGFuZ2VzLgorICovCisvKgorICogQyBsaWJyYXJ5IC0tIF9zZXRqbXAsIF9sb25nam1wCisgKgorICogICAgICBfbG9uZ2ptcChhLHYpCisgKiB3aWxsIGdlbmVyYXRlIGEgInJldHVybih2KSIgZnJvbQorICogdGhlIGxhc3QgY2FsbCB0bworICogICAgICBfc2V0am1wKGEpCisgKiBieSByZXN0b3JpbmcgcmVnaXN0ZXJzIGZyb20gdGhlIHN0YWNrLAorICogVGhlIHByZXZpb3VzIHNpZ25hbCBzdGF0ZSBpcyBOT1QgcmVzdG9yZWQuCisgKgorICovCisJCitFTlRSWShncnViX3NldGptcCkKKwltb3ZsCTQoJWVzcCksICVlY3gJCS8qIGZldGNoIGJ1ZmZlciAqLworCW1vdmwJJWVieCwgMCglZWN4KQorCW1vdmwJJWVzaSwgNCglZWN4KQorCW1vdmwJJWVkaSwgOCglZWN4KQorCW1vdmwJJWVicCwgMTIoJWVjeCkJCS8qIHNhdmUgZnJhbWUgcG9pbnRlciBvZiBjYWxsZXIgKi8KKwlwb3BsCSVlZHgKKwltb3ZsCSVlc3AsIDE2KCVlY3gpCQkvKiBzYXZlIHN0YWNrIHBvaW50ZXIgb2YgY2FsbGVyICovCisJbW92bAklZWR4LCAyMCglZWN4KQkJLyogc2F2ZSBwYyBvZiBjYWxsZXIgKi8KKwl4b3JsCSVlYXgsICVlYXgKKyAgICAgICAgam1wICAgICAqJWVkeAorCitFTlRSWShncnViX2xvbmdqbXApCisJbW92bAk4KCVlc3ApLCAlZWF4CQkvKiByZXR1cm4odikgKi8KKwltb3ZsCTQoJWVzcCksICVlY3gJCS8qIGZldGNoIGJ1ZmZlciAqLworCW1vdmwJMCglZWN4KSwgJWVieAorCW1vdmwJNCglZWN4KSwgJWVzaQorCW1vdmwJOCglZWN4KSwgJWVkaQorCW1vdmwJMTIoJWVjeCksICVlYnAKKwltb3ZsCTE2KCVlY3gpLCAlZXNwCisJb3JsCSVlYXgsICVlYXgKKwlqbnoJMGYKKwlpbmNsCSVlYXgKKzA6CWptcAkqMjAoJWVjeCkJCS8qIGRvbmUsIHJldHVybi4uLi4gKi8KZGlmZiAtLWdpdCBhL3N0YWdlMi9zaGFyZWQuaCBiL3N0YWdlMi9zaGFyZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2VlZjExCi0tLSAvZGV2L251bGwKKysrIGIvc3RhZ2UyL3NoYXJlZC5oCkBAIC0wLDAgKzEsOTk2IEBACisvKiBzaGFyZWQuaCAtIGRlZmluaXRpb25zIHVzZWQgaW4gYWxsIEdSVUItc3BlY2lmaWMgY29kZSAqLworLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSwyMDAyLDIwMDMsMjAwNCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKgorICogIEdlbmVyaWMgZGVmaW5lcyB0byB1c2UgYW55d2hlcmUKKyAqLworCisjaWZuZGVmIEdSVUJfU0hBUkVEX0hFQURFUgorI2RlZmluZSBHUlVCX1NIQVJFRF9IRUFERVIJMQorCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKy8qIEFkZCBhbiB1bmRlcnNjb3JlIHRvIGEgQyBzeW1ib2wgaW4gYXNzZW1ibGVyIGNvZGUgaWYgbmVlZGVkLiAqLworI2lmZGVmIEhBVkVfQVNNX1VTQ09SRQorIyBkZWZpbmUgRVhUX0Moc3ltKSBfICMjIHN5bQorI2Vsc2UKKyMgZGVmaW5lIEVYVF9DKHN5bSkgc3ltCisjZW5kaWYKKworLyogTWF5YmUgcmVkaXJlY3QgbWVtb3J5IHJlcXVlc3RzIHRocm91Z2ggZ3J1Yl9zY3JhdGNoX21lbS4gKi8KKyNpZmRlZiBHUlVCX1VUSUwKK2V4dGVybiBjaGFyICpncnViX3NjcmF0Y2hfbWVtOworIyBkZWZpbmUgUkFXX0FERFIoeCkgKCh4KSArIChpbnQpIGdydWJfc2NyYXRjaF9tZW0pCisjIGRlZmluZSBSQVdfU0VHKHgpIChSQVdfQUREUiAoKHgpIDw8IDQpID4+IDQpCisjZWxzZQorIyBkZWZpbmUgUkFXX0FERFIoeCkgKHgpCisjIGRlZmluZSBSQVdfU0VHKHgpICh4KQorI2VuZGlmCisKKy8qCisgKiAgSW50ZWdlciBzaXplcworICovCisKKyNkZWZpbmUgTUFYSU5UICAgICAweDdGRkZGRkZGCisKKy8qIE1heGltdW0gY29tbWFuZCBsaW5lIHNpemUuIEJlZm9yZSB5b3UgYmxpbmRseSBpbmNyZWFzZSB0aGlzIHZhbHVlLAorICAgc2VlIHRoZSBjb21tZW50IGluIGNoYXJfaW8uYyAoZ2V0X2NtZGxpbmUpLiAgKi8KKyNkZWZpbmUgTUFYX0NNRExJTkUgMTYwMAorI2RlZmluZSBORVdfSEVBUFNJWkUgMTUwMAorCisvKiA1MTItYnl0ZSBzY3JhdGNoIGFyZWEgKi8KKyNkZWZpbmUgU0NSQVRDSEFERFIgIFJBV19BRERSICgweDc3ZTAwKQorI2RlZmluZSBTQ1JBVENIU0VHICAgUkFXX1NFRyAoMHg3N2UwKQorCisvKgorICogIFRoaXMgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSByYXcgZGV2aWNlIGJ1ZmZlci4gIEl0IGlzIDMxLjVLCisgKiAgaW4gc2l6ZS4KKyAqLworCisjZGVmaW5lIEJVRkZFUkxFTiAgIDB4N2UwMAorI2RlZmluZSBCVUZGRVJBRERSICBSQVdfQUREUiAoMHg3MDAwMCkKKyNkZWZpbmUgQlVGRkVSU0VHICAgUkFXX1NFRyAoMHg3MDAwKQorCisjZGVmaW5lIEJPT1RfUEFSVF9UQUJMRQlSQVdfQUREUiAoMHgwN2JlKQorCisvKgorICogIEJJT1MgZGlzayBkZWZpbmVzCisgKi8KKyNkZWZpbmUgQklPU0RJU0tfUkVBRAkJCTB4MAorI2RlZmluZSBCSU9TRElTS19XUklURQkJCTB4MQorI2RlZmluZSBCSU9TRElTS19FUlJPUl9HRU9NRVRSWQkJMHgxMDAKKyNkZWZpbmUgQklPU0RJU0tfRkxBR19MQkFfRVhURU5TSU9OCTB4MQorI2RlZmluZSBCSU9TRElTS19GTEFHX0NEUk9NCQkweDIKKworLyoKKyAqICBUaGlzIGlzIHRoZSBmaWxlc3lzdGVtIChub3QgcmF3IGRldmljZSkgYnVmZmVyLgorICogIEl0IGlzIDMySyBpbiBzaXplLCBkbyBub3Qgb3ZlcnJ1biEKKyAqLworCisjZGVmaW5lIEZTWVNfQlVGTEVOICAweDgwMDAKKyNkZWZpbmUgRlNZU19CVUYgUkFXX0FERFIgKDB4NjgwMDApCisKKy8qIENvbW1hbmQtbGluZSBidWZmZXIgZm9yIE11bHRpYm9vdCBrZXJuZWxzIGFuZCBtb2R1bGVzLiBUaGlzIGFyZWEKKyAgIGluY2x1ZGVzIHRoZSBhcmVhIGludG8gd2hpY2ggU3RhZ2UgMS41IGFuZCBTdGFnZSAxIGFyZSBsb2FkZWQsIGJ1dAorICAgdGhhdCdzIG5vIHByb2JsZW0uICAqLworI2RlZmluZSBNQl9DTURMSU5FX0JVRgkJUkFXX0FERFIgKDB4MjAwMCkKKyNkZWZpbmUgTUJfQ01ETElORV9CVUZMRU4JMHg2MDAwCisKKy8qIFRoZSBidWZmZXIgZm9yIHRoZSBwYXNzd29yZC4gICovCisjZGVmaW5lIFBBU1NXT1JEX0JVRgkJUkFXX0FERFIgKDB4NzgwMDApCisjZGVmaW5lIFBBU1NXT1JEX0JVRkxFTgkJMHgyMDAKKworLyogVEhlIGJ1ZmZlciBmb3IgdGhlIGZpbGVuYW1lIG9mICIvYm9vdC9ncnViL2RlZmF1bHQiLiAgKi8KKyNkZWZpbmUgREVGQVVMVF9GSUxFX0JVRgkoUEFTU1dPUkRfQlVGICsgUEFTU1dPUkRfQlVGTEVOKQorI2RlZmluZSBERUZBVUxUX0ZJTEVfQlVGTEVOCTB4NjAKKworLyogVGhlIGJ1ZmZlciBmb3IgdGhlIGNvbW1hbmQtbGluZS4gICovCisjZGVmaW5lIENNRExJTkVfQlVGCQkoREVGQVVMVF9GSUxFX0JVRiArIERFRkFVTFRfRklMRV9CVUZMRU4pCisjZGVmaW5lIENNRExJTkVfQlVGTEVOCQlNQVhfQ01ETElORQorCisvKiBUaGUga2lsbCBidWZmZXIgZm9yIHRoZSBjb21tYW5kLWxpbmUuICAqLworI2RlZmluZSBLSUxMX0JVRgkJKENNRExJTkVfQlVGICsgQ01ETElORV9CVUZMRU4pCisjZGVmaW5lIEtJTExfQlVGTEVOCQlNQVhfQ01ETElORQorCisvKiBUaGUgaGlzdG9yeSBidWZmZXIgZm9yIHRoZSBjb21tYW5kLWxpbmUuICAqLworI2RlZmluZSBISVNUT1JZX0JVRgkJKEtJTExfQlVGICsgS0lMTF9CVUZMRU4pCisjZGVmaW5lIEhJU1RPUllfU0laRQkJNQorI2RlZmluZSBISVNUT1JZX0JVRkxFTgkJKE1BWF9DTURMSU5FICogSElTVE9SWV9TSVpFKQorCisvKiBUaGUgYnVmZmVyIGZvciB0aGUgY29tcGxldGlvbi4gICovCisjZGVmaW5lIENPTVBMRVRJT05fQlVGCQkoSElTVE9SWV9CVUYgKyBISVNUT1JZX0JVRkxFTikKKyNkZWZpbmUgQ09NUExFVElPTl9CVUZMRU4JTUFYX0NNRExJTkUKKworLyogVGhlIGJ1ZmZlciBmb3IgdGhlIHVuaXF1ZSBzdHJpbmcuICAqLworI2RlZmluZSBVTklRVUVfQlVGCQkoQ09NUExFVElPTl9CVUYgKyBDT01QTEVUSU9OX0JVRkxFTikKKyNkZWZpbmUgVU5JUVVFX0JVRkxFTgkJTUFYX0NNRExJTkUKKworLyogVGhlIGJ1ZmZlciBmb3IgdGhlIG1lbnUgZW50cmllcy4gICovCisjZGVmaW5lIE1FTlVfQlVGCQkoVU5JUVVFX0JVRiArIFVOSVFVRV9CVUZMRU4pCisjZGVmaW5lIE1FTlVfQlVGTEVOCQkoMHg4MDAwICsgUEFTU1dPUkRfQlVGIC0gTUVOVV9CVUYpCisKKy8qIFRoZSBzaXplIG9mIHRoZSBkcml2ZSBtYXAuICAqLworI2RlZmluZSBEUklWRV9NQVBfU0laRQkJOAorCisvKiBUaGUgc2l6ZSBvZiB0aGUga2V5IG1hcC4gICovCisjZGVmaW5lIEtFWV9NQVBfU0laRQkJMTI4CisKKy8qIFRoZSBzaXplIG9mIHRoZSBpbyBtYXAuICAqLworI2RlZmluZSBJT19NQVBfU0laRQkJMTI4CisKKy8qCisgKiAgTGludXggc2V0dXAgcGFyYW1ldGVycworICovCisKKyNkZWZpbmUgTElOVVhfTUFHSUNfU0lHTkFUVVJFCQkweDUzNzI2NDQ4CS8qICJIZHJTIiAqLworI2RlZmluZSBMSU5VWF9ERUZBVUxUX1NFVFVQX1NFQ1RTCTQKKyNkZWZpbmUgTElOVVhfRkxBR19DQU5fVVNFX0hFQVAJCTB4ODAKKyNkZWZpbmUgTElOVVhfSU5JVFJEX01BWF9BRERSRVNTCTB4MzgwMDAwMDAKKyNkZWZpbmUgTElOVVhfTUFYX1NFVFVQX1NFQ1RTCQk2NAorI2RlZmluZSBMSU5VWF9CT09UX0xPQURFUl9UWVBFCQkweDcxCisjZGVmaW5lIExJTlVYX0hFQVBfRU5EX09GRlNFVAkJKDB4OTAwMCAtIDB4MjAwKQorCisjZGVmaW5lIExJTlVYX0JaSU1BR0VfQUREUgkJUkFXX0FERFIgKDB4MTAwMDAwKQorI2RlZmluZSBMSU5VWF9aSU1BR0VfQUREUgkJUkFXX0FERFIgKDB4MTAwMDApCisjZGVmaW5lIExJTlVYX09MRF9SRUFMX01PREVfQUREUglSQVdfQUREUiAoMHg5MDAwMCkKKyNkZWZpbmUgTElOVVhfU0VUVVBfU1RBQ0sJCTB4OTAwMAorCisjZGVmaW5lIExJTlVYX0ZMQUdfQklHX0tFUk5FTAkJMHgxCisKKy8qIExpbnV4J3MgdmlkZW8gbW9kZSBzZWxlY3Rpb24gc3VwcG9ydC4gQWN0dWFsbHkgSSBoYXRlIGl0ISAgKi8KKyNkZWZpbmUgTElOVVhfVklEX01PREVfTk9STUFMCQkweEZGRkYKKyNkZWZpbmUgTElOVVhfVklEX01PREVfRVhURU5ERUQJCTB4RkZGRQorI2RlZmluZSBMSU5VWF9WSURfTU9ERV9BU0sJCTB4RkZGRAorCisjZGVmaW5lIExJTlVYX0NMX09GRlNFVAkJCTB4OTAwMAorI2RlZmluZSBMSU5VWF9DTF9FTkRfT0ZGU0VUCQkweDkwRkYKKyNkZWZpbmUgTElOVVhfU0VUVVBfTU9WRV9TSVpFCQkweDkxMDAKKyNkZWZpbmUgTElOVVhfQ0xfTUFHSUMJCQkweEEzM0YKKworLyoKKyAqICBHZW5lcmFsIGRpc2sgc3R1ZmYKKyAqLworCisjZGVmaW5lIFNFQ1RPUl9TSVpFCQkweDIwMAorI2RlZmluZSBTRUNUT1JfQklUUwkJOQorI2RlZmluZSBCSU9TX0ZMQUdfRklYRURfRElTSwkweDgwCisKKyNkZWZpbmUgQk9PVFNFQ19MT0NBVElPTgkJUkFXX0FERFIgKDB4N0MwMCkKKyNkZWZpbmUgQk9PVFNFQ19TSUdOQVRVUkUJCTB4QUE1NQorI2RlZmluZSBCT09UU0VDX0JQQl9PRkZTRVQJCTB4MworI2RlZmluZSBCT09UU0VDX0JQQl9MRU5HVEgJCTB4M0IKKyNkZWZpbmUgQk9PVFNFQ19CUEJfU1lTVEVNX0lECQkweDMKKyNkZWZpbmUgQk9PVFNFQ19CUEJfSElEREVOX1NFQ1RPUlMJMHgxQworI2RlZmluZSBCT09UU0VDX1BBUlRfT0ZGU0VUCQkweDFCRQorI2RlZmluZSBCT09UU0VDX1BBUlRfTEVOR1RICQkweDQwCisjZGVmaW5lIEJPT1RTRUNfU0lHX09GRlNFVAkJMHgxRkUKKyNkZWZpbmUgQk9PVFNFQ19MSVNUU0laRQkJOAorCisvKiBOb3QgYmFkLCBwZXJoYXBzLiAgKi8KKyNkZWZpbmUgTkVUV09SS19EUklWRQkweDIwCisKKy8qCisgKiAgR1JVQiBzcGVjaWZpYyBpbmZvcm1hdGlvbgorICogICAgKGluIExTQiBvcmRlcikKKyAqLworCisjaW5jbHVkZSA8c3RhZ2UxLmg+CisKKyNkZWZpbmUgU1RBR0UyX1ZFUl9NQUpfT0ZGUwkweDYKKyNkZWZpbmUgU1RBR0UyX0lOU1RBTExQQVJUCTB4OAorI2RlZmluZSBTVEFHRTJfU0FWRURfRU5UUllOTwkweGMKKyNkZWZpbmUgU1RBR0UyX1NUQUdFMl9JRAkweDEwCisjZGVmaW5lIFNUQUdFMl9GT1JDRV9MQkEJMHgxMQorI2RlZmluZSBTVEFHRTJfVkVSX1NUUl9PRkZTCTB4MTIKKworLyogU3RhZ2UgMiBpZGVudGlmaWVycyAqLworI2RlZmluZSBTVEFHRTJfSURfU1RBR0UyCQkwCisjZGVmaW5lIFNUQUdFMl9JRF9GRlNfU1RBR0UxXzUJCTEKKyNkZWZpbmUgU1RBR0UyX0lEX0UyRlNfU1RBR0UxXzUJCTIKKyNkZWZpbmUgU1RBR0UyX0lEX0ZBVF9TVEFHRTFfNQkJMworI2RlZmluZSBTVEFHRTJfSURfTUlOSVhfU1RBR0UxXzUJNAorI2RlZmluZSBTVEFHRTJfSURfUkVJU0VSRlNfU1RBR0UxXzUJNQorI2RlZmluZSBTVEFHRTJfSURfVlNUQUZTX1NUQUdFMV81CTYKKyNkZWZpbmUgU1RBR0UyX0lEX0pGU19TVEFHRTFfNQkJNworI2RlZmluZSBTVEFHRTJfSURfWEZTX1NUQUdFMV81CQk4CisjZGVmaW5lIFNUQUdFMl9JRF9JU085NjYwX1NUQUdFMV81CTkKKyNkZWZpbmUgU1RBR0UyX0lEX1VGUzJfU1RBR0UxXzUJCTEwCisKKyNpZm5kZWYgU1RBR0UxXzUKKyMgZGVmaW5lIFNUQUdFMl9JRAlTVEFHRTJfSURfU1RBR0UyCisjZWxzZQorIyBpZiBkZWZpbmVkKEZTWVNfRkZTKQorIyAgZGVmaW5lIFNUQUdFMl9JRAlTVEFHRTJfSURfRkZTX1NUQUdFMV81CisjIGVsaWYgZGVmaW5lZChGU1lTX0VYVDJGUykKKyMgIGRlZmluZSBTVEFHRTJfSUQJU1RBR0UyX0lEX0UyRlNfU1RBR0UxXzUKKyMgZWxpZiBkZWZpbmVkKEZTWVNfRkFUKQorIyAgZGVmaW5lIFNUQUdFMl9JRAlTVEFHRTJfSURfRkFUX1NUQUdFMV81CisjIGVsaWYgZGVmaW5lZChGU1lTX01JTklYKQorIyAgZGVmaW5lIFNUQUdFMl9JRAlTVEFHRTJfSURfTUlOSVhfU1RBR0UxXzUKKyMgZWxpZiBkZWZpbmVkKEZTWVNfUkVJU0VSRlMpCisjICBkZWZpbmUgU1RBR0UyX0lECVNUQUdFMl9JRF9SRUlTRVJGU19TVEFHRTFfNQorIyBlbGlmIGRlZmluZWQoRlNZU19WU1RBRlMpCisjICBkZWZpbmUgU1RBR0UyX0lECVNUQUdFMl9JRF9WU1RBRlNfU1RBR0UxXzUKKyMgZWxpZiBkZWZpbmVkKEZTWVNfSkZTKQorIyAgZGVmaW5lIFNUQUdFMl9JRAlTVEFHRTJfSURfSkZTX1NUQUdFMV81CisjIGVsaWYgZGVmaW5lZChGU1lTX1hGUykKKyMgIGRlZmluZSBTVEFHRTJfSUQJU1RBR0UyX0lEX1hGU19TVEFHRTFfNQorIyBlbGlmIGRlZmluZWQoRlNZU19JU085NjYwKQorIyAgZGVmaW5lIFNUQUdFMl9JRAlTVEFHRTJfSURfSVNPOTY2MF9TVEFHRTFfNQorIyBlbGlmIGRlZmluZWQoRlNZU19VRlMyKQorIyAgZGVmaW5lIFNUQUdFMl9JRAlTVEFHRTJfSURfVUZTMl9TVEFHRTFfNQorIyBlbHNlCisjICBlcnJvciAidW5rbm93biBTdGFnZSAyIgorIyBlbmRpZgorI2VuZGlmCisKKy8qCisgKiAgZGVmaW5lcyBmb3IgdXNlIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gcmVhbCBhbmQgcHJvdGVjdGVkIG1vZGUKKyAqLworCisjZGVmaW5lIENSMF9QRV9PTgkweDEKKyNkZWZpbmUgQ1IwX1BFX09GRgkweGZmZmZmZmZlCisjZGVmaW5lIFBST1RfTU9ERV9DU0VHCTB4OAorI2RlZmluZSBQUk9UX01PREVfRFNFRyAgMHgxMAorI2RlZmluZSBQU0VVRE9fUk1fQ1NFRwkweDE4CisjZGVmaW5lIFBTRVVET19STV9EU0VHCTB4MjAKKyNkZWZpbmUgU1RBQ0tPRkYJKDB4MjAwMCAtIDB4MTApCisjZGVmaW5lIFBST1RTVEFDS0lOSVQgICAoRlNZU19CVUYgLSAweDEwKQorCisKKy8qCisgKiBBc3NlbWJseSBjb2RlIGRlZmluZXMKKyAqCisgKiAiRVhUX0MiIGlzIGFzc3VtZWQgdG8gYmUgZGVmaW5lZCBpbiB0aGUgTWFrZWZpbGUgYnkgdGhlIGNvbmZpZ3VyZQorICogICBjb21tYW5kLgorICovCisKKyNkZWZpbmUgRU5UUlkoeCkgLmdsb2JsIEVYVF9DKHgpIDsgRVhUX0MoeCk6CisjZGVmaW5lIFZBUklBQkxFKHgpIEVOVFJZKHgpCisKKworI2RlZmluZSBLX1JEV1IgIAkweDYwCS8qIGtleWJvYXJkIGRhdGEgJiBjbWRzIChyZWFkL3dyaXRlKSAqLworI2RlZmluZSBLX1NUQVRVUwkweDY0CS8qIGtleWJvYXJkIHN0YXR1cyAqLworI2RlZmluZSBLX0NNRAkJMHg2NAkvKiBrZXliZCBjdGxyIGNvbW1hbmQgKHdyaXRlLW9ubHkpICovCisKKyNkZWZpbmUgS19PQlVGX0ZVTCAJMHgwMQkvKiBvdXRwdXQgYnVmZmVyIGZ1bGwgKi8KKyNkZWZpbmUgS19JQlVGX0ZVTCAJMHgwMgkvKiBpbnB1dCBidWZmZXIgZnVsbCAqLworCisjZGVmaW5lIEtDX0NNRF9XSU4JMHhkMAkvKiByZWFkICBvdXRwdXQgcG9ydCAqLworI2RlZmluZSBLQ19DTURfV09VVAkweGQxCS8qIHdyaXRlIG91dHB1dCBwb3J0ICovCisjZGVmaW5lIEtCX09VVFBVVF9NQVNLICAweGRkCS8qIGVuYWJsZSBvdXRwdXQgYnVmZmVyIGZ1bGwgaW50ZXJydXB0CisJCQkJICAgZW5hYmxlIGRhdGEgbGluZQorCQkJCSAgIGVuYWJsZSBjbG9jayBsaW5lICovCisjZGVmaW5lIEtCX0EyMF9FTkFCTEUgICAweDAyCisKKy8qIENvZGVzIGZvciBnZXRjaGFyLiAqLworI2RlZmluZSBBU0NJSV9DSEFSKHgpICAgKCh4KSAmIDB4RkYpCisjaWYgIWRlZmluZWQoR1JVQl9VVElMKSB8fCAhZGVmaW5lZChIQVZFX0xJQkNVUlNFUykKKyMgZGVmaW5lIEtFWV9MRUZUICAgICAgICAweDRCMDAKKyMgZGVmaW5lIEtFWV9SSUdIVCAgICAgICAweDREMDAKKyMgZGVmaW5lIEtFWV9VUCAgICAgICAgICAweDQ4MDAKKyMgZGVmaW5lIEtFWV9ET1dOICAgICAgICAweDUwMDAKKyMgZGVmaW5lIEtFWV9JQyAgICAgICAgICAweDUyMDAJLyogaW5zZXJ0IGNoYXIgKi8KKyMgZGVmaW5lIEtFWV9EQyAgICAgICAgICAweDUzMDAJLyogZGVsZXRlIGNoYXIgKi8KKyMgZGVmaW5lIEtFWV9CQUNLU1BBQ0UgICAweDAwMDgKKyMgZGVmaW5lIEtFWV9IT01FICAgICAgICAweDQ3MDAKKyMgZGVmaW5lIEtFWV9FTkQgICAgICAgICAweDRGMDAKKyMgZGVmaW5lIEtFWV9OUEFHRSAgICAgICAweDUxMDAKKyMgZGVmaW5lIEtFWV9QUEFHRSAgICAgICAweDQ5MDAKKyMgZGVmaW5lIEFfTk9STUFMICAgICAgICAweDcKKyMgZGVmaW5lIEFfUkVWRVJTRSAgICAgICAweDcwCisjZWxpZiBkZWZpbmVkKEhBVkVfTkNVUlNFU19DVVJTRVNfSCkKKyMgaW5jbHVkZSA8bmN1cnNlcy9jdXJzZXMuaD4KKyNlbGlmIGRlZmluZWQoSEFWRV9OQ1VSU0VTX0gpCisjIGluY2x1ZGUgPG5jdXJzZXMuaD4KKyNlbGlmIGRlZmluZWQoSEFWRV9DVVJTRVNfSCkKKyMgaW5jbHVkZSA8Y3Vyc2VzLmg+CisjZW5kaWYKKworLyogSW4gb2xkIEJTRCBjdXJzZXMsIEFfTk9STUFMIGFuZCBBX1JFVkVSU0UgYXJlIG5vdCBkZWZpbmVkLCBzbyB3ZQorICAgZGVmaW5lIHRoZW0gaGVyZSBpZiB0aGV5IGFyZSB1bmRlZmluZWQuICAqLworI2lmbmRlZiBBX05PUk1BTAorIyBkZWZpbmUgQV9OT1JNQUwJMAorI2VuZGlmIC8qICEgQV9OT1JNQUwgKi8KKyNpZm5kZWYgQV9SRVZFUlNFCisjIGlmZGVmIEFfU1RBTkRPVVQKKyMgIGRlZmluZSBBX1JFVkVSU0UJQV9TVEFORE9VVAorIyBlbHNlIC8qICEgQV9TVEFORE9VVCAqLworIyAgZGVmaW5lIEFfUkVWRVJTRQkwCisjIGVuZGlmIC8qICEgQV9TVEFORE9VVCAqLworI2VuZGlmIC8qICEgQV9SRVZFUlNFICovCisKKy8qIERlZmluZSBBQ1NfKiBvdXJzZWx2ZXMsIHNpbmNlIHRoZSBkZWZpbml0aW9ucyBhcmUgbm90IGNvbnNpc3RlbnQgYW1vbmcKKyAgIHZhcmlvdXMgY3Vyc2VzIGltcGxlbWVudGF0aW9ucy4gICovCisjdW5kZWYgQUNTX1VMQ09STkVSCisjdW5kZWYgQUNTX1VSQ09STkVSCisjdW5kZWYgQUNTX0xMQ09STkVSCisjdW5kZWYgQUNTX0xSQ09STkVSCisjdW5kZWYgQUNTX0hMSU5FCisjdW5kZWYgQUNTX1ZMSU5FCisjdW5kZWYgQUNTX0xBUlJPVworI3VuZGVmIEFDU19SQVJST1cKKyN1bmRlZiBBQ1NfVUFSUk9XCisjdW5kZWYgQUNTX0RBUlJPVworCisjZGVmaW5lIEFDU19VTENPUk5FUgknKycKKyNkZWZpbmUgQUNTX1VSQ09STkVSCScrJworI2RlZmluZSBBQ1NfTExDT1JORVIJJysnCisjZGVmaW5lIEFDU19MUkNPUk5FUgknKycKKyNkZWZpbmUgQUNTX0hMSU5FCSctJworI2RlZmluZSBBQ1NfVkxJTkUJJ3wnCisjZGVmaW5lIEFDU19MQVJST1cJJzwnCisjZGVmaW5lIEFDU19SQVJST1cJJz4nCisjZGVmaW5lIEFDU19VQVJST1cJJ14nCisjZGVmaW5lIEFDU19EQVJST1cJJ3YnCisKKy8qIFNwZWNpYWwgZ3JhcGhpY3MgY2hhcmFjdGVycyBmb3IgSUJNIGRpc3BsYXlzLiAqLworI2RlZmluZSBESVNQX1VMCQkyMTgKKyNkZWZpbmUgRElTUF9VUgkJMTkxCisjZGVmaW5lIERJU1BfTEwJCTE5MgorI2RlZmluZSBESVNQX0xSCQkyMTcKKyNkZWZpbmUgRElTUF9IT1JJWgkxOTYKKyNkZWZpbmUgRElTUF9WRVJUCTE3OQorI2RlZmluZSBESVNQX0xFRlQJMHgxYgorI2RlZmluZSBESVNQX1JJR0hUCTB4MWEKKyNkZWZpbmUgRElTUF9VUAkJMHgxOAorI2RlZmluZSBESVNQX0RPV04JMHgxOQorCisvKiBSZW1hcCBzb21lIGxpYmMtQVBJLWNvbXBhdGlibGUgZnVuY3Rpb24gbmFtZXMgc28gdGhhdCB3ZSBwcmV2ZW50CisgICBjaXJjdWxhcmFyYXJpdHkuICovCisjaWZuZGVmIFdJVEhPVVRfTElCQ19TVFVCUworI2RlZmluZSBtZW1tb3ZlIGdydWJfbWVtbW92ZQorI2RlZmluZSBtZW1jcHkgZ3J1Yl9tZW1tb3ZlCS8qIHdlIGRvbid0IG5lZWQgYSBzZXBhcmF0ZSBtZW1jcHkgKi8KKyNkZWZpbmUgbWVtc2V0IGdydWJfbWVtc2V0CisjZGVmaW5lIGlzc3BhY2UgZ3J1Yl9pc3NwYWNlCisjZGVmaW5lIHByaW50ZiBncnViX3ByaW50ZgorI2RlZmluZSBzcHJpbnRmIGdydWJfc3ByaW50ZgorI3VuZGVmIHB1dGNoYXIKKyNkZWZpbmUgcHV0Y2hhciBncnViX3B1dGNoYXIKKyNkZWZpbmUgc3RybmNhdCBncnViX3N0cm5jYXQKKyNkZWZpbmUgc3Ryc3RyIGdydWJfc3Ryc3RyCisjZGVmaW5lIG1lbWNtcCBncnViX21lbWNtcAorI2RlZmluZSBzdHJjbXAgZ3J1Yl9zdHJjbXAKKyNkZWZpbmUgdG9sb3dlciBncnViX3RvbG93ZXIKKyNkZWZpbmUgc3RybGVuIGdydWJfc3RybGVuCisjZGVmaW5lIHN0cmNweSBncnViX3N0cmNweQorI2VuZGlmIC8qIFdJVEhPVVRfTElCQ19TVFVCUyAqLworCisKKyNpZm5kZWYgQVNNX0ZJTEUKKy8qCisgKiAgQmVsb3cgdGhpcyBzaG91bGQgYmUgT05MWSBkZWZpbmVzIGFuZCBvdGhlciBjb25zdHJ1Y3RzIGZvciBDIGNvZGUuCisgKi8KKworLyogbXVsdGlib290IHN0dWZmICovCisKKyNpbmNsdWRlICJtYl9oZWFkZXIuaCIKKyNpbmNsdWRlICJtYl9pbmZvLmgiCisKKy8qIEZvciB0aGUgTGludXgvaTM4NiBib290IHByb3RvY29sIHZlcnNpb24gMi4wMy4gICovCitzdHJ1Y3QgbGludXhfa2VybmVsX2hlYWRlcgoreworICBjaGFyIGNvZGUxWzB4MDAyMF07CisgIHVuc2lnbmVkIHNob3J0IGNsX21hZ2ljOwkJLyogTWFnaWMgbnVtYmVyIDB4QTMzRiAqLworICB1bnNpZ25lZCBzaG9ydCBjbF9vZmZzZXQ7CQkvKiBUaGUgb2Zmc2V0IG9mIGNvbW1hbmQgbGluZSAqLworICBjaGFyIGNvZGUyWzB4MDFGMSAtIDB4MDAyMCAtIDIgLSAyXTsKKyAgdW5zaWduZWQgY2hhciBzZXR1cF9zZWN0czsJCS8qIFRoZSBzaXplIG9mIHRoZSBzZXR1cCBpbiBzZWN0b3JzICovCisgIHVuc2lnbmVkIHNob3J0IHJvb3RfZmxhZ3M7CQkvKiBJZiB0aGUgcm9vdCBpcyBtb3VudGVkIHJlYWRvbmx5ICovCisgIHVuc2lnbmVkIHNob3J0IHN5c3NpemU7CQkvKiBvYnNvbGV0ZSAqLworICB1bnNpZ25lZCBzaG9ydCBzd2FwX2RldjsJCS8qIG9ic29sZXRlICovCisgIHVuc2lnbmVkIHNob3J0IHJhbV9zaXplOwkJLyogb2Jzb2xldGUgKi8KKyAgdW5zaWduZWQgc2hvcnQgdmlkX21vZGU7CQkvKiBWaWRlbyBtb2RlIGNvbnRyb2wgKi8KKyAgdW5zaWduZWQgc2hvcnQgcm9vdF9kZXY7CQkvKiBEZWZhdWx0IHJvb3QgZGV2aWNlIG51bWJlciAqLworICB1bnNpZ25lZCBzaG9ydCBib290X2ZsYWc7CQkvKiAweEFBNTUgbWFnaWMgbnVtYmVyICovCisgIHVuc2lnbmVkIHNob3J0IGp1bXA7CQkJLyogSnVtcCBpbnN0cnVjdGlvbiAqLworICB1bnNpZ25lZCBsb25nIGhlYWRlcjsJCQkvKiBNYWdpYyBzaWduYXR1cmUgIkhkclMiICovCisgIHVuc2lnbmVkIHNob3J0IHZlcnNpb247CQkvKiBCb290IHByb3RvY29sIHZlcnNpb24gc3VwcG9ydGVkICovCisgIHVuc2lnbmVkIGxvbmcgcmVhbG1vZGVfc3d0Y2g7CQkvKiBCb290IGxvYWRlciBob29rICovCisgIHVuc2lnbmVkIGxvbmcgc3RhcnRfc3lzOwkJLyogUG9pbnRzIHRvIGtlcm5lbCB2ZXJzaW9uIHN0cmluZyAqLworICB1bnNpZ25lZCBjaGFyIHR5cGVfb2ZfbG9hZGVyOwkJLyogQm9vdCBsb2FkZXIgaWRlbnRpZmllciAqLworICB1bnNpZ25lZCBjaGFyIGxvYWRmbGFnczsJCS8qIEJvb3QgcHJvdG9jb2wgb3B0aW9uIGZsYWdzICovCisgIHVuc2lnbmVkIHNob3J0IHNldHVwX21vdmVfc2l6ZTsJLyogTW92ZSB0byBoaWdoIG1lbW9yeSBzaXplICovCisgIHVuc2lnbmVkIGxvbmcgY29kZTMyX3N0YXJ0OwkJLyogQm9vdCBsb2FkZXIgaG9vayAqLworICB1bnNpZ25lZCBsb25nIHJhbWRpc2tfaW1hZ2U7CQkvKiBpbml0cmQgbG9hZCBhZGRyZXNzICovCisgIHVuc2lnbmVkIGxvbmcgcmFtZGlza19zaXplOwkJLyogaW5pdHJkIHNpemUgKi8KKyAgdW5zaWduZWQgbG9uZyBib290c2VjdF9rbHVkZ2U7CS8qIG9ic29sZXRlICovCisgIHVuc2lnbmVkIHNob3J0IGhlYXBfZW5kX3B0cjsJCS8qIEZyZWUgbWVtb3J5IGFmdGVyIHNldHVwIGVuZCAqLworICB1bnNpZ25lZCBzaG9ydCBwYWQxOwkJCS8qIFVudXNlZCAqLworICBjaGFyICpjbWRfbGluZV9wdHI7CQkJLyogUG9pbnRzIHRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lICovCisgIHVuc2lnbmVkIGxvbmcgaW5pdHJkX2FkZHJfbWF4OwkvKiBUaGUgaGlnaGVzdCBhZGRyZXNzIG9mIGluaXRyZCAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIE1lbW9yeSBtYXAgYWRkcmVzcyByYW5nZSBkZXNjcmlwdG9yIHVzZWQgYnkgR0VUX01NQVBfRU5UUlkuICovCitzdHJ1Y3QgbW1hcl9kZXNjCit7CisgIHVuc2lnbmVkIGxvbmcgZGVzY19sZW47CS8qIFNpemUgb2YgdGhpcyBkZXNjcmlwdG9yLiAqLworICB1bnNpZ25lZCBsb25nIGxvbmcgYWRkcjsJLyogQmFzZSBhZGRyZXNzLiAqLworICB1bnNpZ25lZCBsb25nIGxvbmcgbGVuZ3RoOwkvKiBMZW5ndGggaW4gYnl0ZXMuICovCisgIHVuc2lnbmVkIGxvbmcgdHlwZTsJCS8qIFR5cGUgb2YgYWRkcmVzcyByYW5nZS4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBWQkUgY29udHJvbGxlciBpbmZvcm1hdGlvbi4gICovCitzdHJ1Y3QgdmJlX2NvbnRyb2xsZXIKK3sKKyAgdW5zaWduZWQgY2hhciBzaWduYXR1cmVbNF07CisgIHVuc2lnbmVkIHNob3J0IHZlcnNpb247CisgIHVuc2lnbmVkIGxvbmcgb2VtX3N0cmluZzsKKyAgdW5zaWduZWQgbG9uZyBjYXBhYmlsaXRpZXM7CisgIHVuc2lnbmVkIGxvbmcgdmlkZW9fbW9kZTsKKyAgdW5zaWduZWQgc2hvcnQgdG90YWxfbWVtb3J5OworICB1bnNpZ25lZCBzaG9ydCBvZW1fc29mdHdhcmVfcmV2OworICB1bnNpZ25lZCBsb25nIG9lbV92ZW5kb3JfbmFtZTsKKyAgdW5zaWduZWQgbG9uZyBvZW1fcHJvZHVjdF9uYW1lOworICB1bnNpZ25lZCBsb25nIG9lbV9wcm9kdWN0X3JldjsKKyAgdW5zaWduZWQgY2hhciByZXNlcnZlZFsyMjJdOworICB1bnNpZ25lZCBjaGFyIG9lbV9kYXRhWzI1Nl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVkJFIG1vZGUgaW5mb3JtYXRpb24uICAqLworc3RydWN0IHZiZV9tb2RlCit7CisgIHVuc2lnbmVkIHNob3J0IG1vZGVfYXR0cmlidXRlczsKKyAgdW5zaWduZWQgY2hhciB3aW5fYV9hdHRyaWJ1dGVzOworICB1bnNpZ25lZCBjaGFyIHdpbl9iX2F0dHJpYnV0ZXM7CisgIHVuc2lnbmVkIHNob3J0IHdpbl9ncmFudWxhcml0eTsKKyAgdW5zaWduZWQgc2hvcnQgd2luX3NpemU7CisgIHVuc2lnbmVkIHNob3J0IHdpbl9hX3NlZ21lbnQ7CisgIHVuc2lnbmVkIHNob3J0IHdpbl9iX3NlZ21lbnQ7CisgIHVuc2lnbmVkIGxvbmcgd2luX2Z1bmM7CisgIHVuc2lnbmVkIHNob3J0IGJ5dGVzX3Blcl9zY2FubGluZTsKKworICAvKiA+PTEuMiAqLworICB1bnNpZ25lZCBzaG9ydCB4X3Jlc29sdXRpb247CisgIHVuc2lnbmVkIHNob3J0IHlfcmVzb2x1dGlvbjsKKyAgdW5zaWduZWQgY2hhciB4X2NoYXJfc2l6ZTsKKyAgdW5zaWduZWQgY2hhciB5X2NoYXJfc2l6ZTsKKyAgdW5zaWduZWQgY2hhciBudW1iZXJfb2ZfcGxhbmVzOworICB1bnNpZ25lZCBjaGFyIGJpdHNfcGVyX3BpeGVsOworICB1bnNpZ25lZCBjaGFyIG51bWJlcl9vZl9iYW5rczsKKyAgdW5zaWduZWQgY2hhciBtZW1vcnlfbW9kZWw7CisgIHVuc2lnbmVkIGNoYXIgYmFua19zaXplOworICB1bnNpZ25lZCBjaGFyIG51bWJlcl9vZl9pbWFnZV9wYWdlczsKKyAgdW5zaWduZWQgY2hhciByZXNlcnZlZDA7CisKKyAgLyogZGlyZWN0IGNvbG9yICovCisgIHVuc2lnbmVkIGNoYXIgcmVkX21hc2tfc2l6ZTsKKyAgdW5zaWduZWQgY2hhciByZWRfZmllbGRfcG9zaXRpb247CisgIHVuc2lnbmVkIGNoYXIgZ3JlZW5fbWFza19zaXplOworICB1bnNpZ25lZCBjaGFyIGdyZWVuX2ZpZWxkX3Bvc2l0aW9uOworICB1bnNpZ25lZCBjaGFyIGJsdWVfbWFza19zaXplOworICB1bnNpZ25lZCBjaGFyIGJsdWVfZmllbGRfcG9zaXRpb247CisgIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRfbWFza19zaXplOworICB1bnNpZ25lZCBjaGFyIHJlc2VydmVkX2ZpZWxkX3Bvc2l0aW9uOworICB1bnNpZ25lZCBjaGFyIGRpcmVjdF9jb2xvcl9tb2RlX2luZm87CisKKyAgLyogPj0yLjAgKi8KKyAgdW5zaWduZWQgbG9uZyBwaHlzX2Jhc2U7CisgIHVuc2lnbmVkIGxvbmcgcmVzZXJ2ZWQxOworICB1bnNpZ25lZCBzaG9ydCByZXZlcnNlZDI7CisKKyAgLyogPj0zLjAgKi8KKyAgdW5zaWduZWQgc2hvcnQgbGluZWFyX2J5dGVzX3Blcl9zY2FubGluZTsKKyAgdW5zaWduZWQgY2hhciBiYW5rZWRfbnVtYmVyX29mX2ltYWdlX3BhZ2VzOworICB1bnNpZ25lZCBjaGFyIGxpbmVhcl9udW1iZXJfb2ZfaW1hZ2VfcGFnZXM7CisgIHVuc2lnbmVkIGNoYXIgbGluZWFyX3JlZF9tYXNrX3NpemU7CisgIHVuc2lnbmVkIGNoYXIgbGluZWFyX3JlZF9maWVsZF9wb3NpdGlvbjsKKyAgdW5zaWduZWQgY2hhciBsaW5lYXJfZ3JlZW5fbWFza19zaXplOworICB1bnNpZ25lZCBjaGFyIGxpbmVhcl9ncmVlbl9maWVsZF9wb3NpdGlvbjsKKyAgdW5zaWduZWQgY2hhciBsaW5lYXJfYmx1ZV9tYXNrX3NpemU7CisgIHVuc2lnbmVkIGNoYXIgbGluZWFyX2JsdWVfZmllbGRfcG9zaXRpb247CisgIHVuc2lnbmVkIGNoYXIgbGluZWFyX3Jlc2VydmVkX21hc2tfc2l6ZTsKKyAgdW5zaWduZWQgY2hhciBsaW5lYXJfcmVzZXJ2ZWRfZmllbGRfcG9zaXRpb247CisgIHVuc2lnbmVkIGxvbmcgbWF4X3BpeGVsX2Nsb2NrOworCisgIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQzWzE4OV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCisjdW5kZWYgTlVMTAorI2RlZmluZSBOVUxMICAgICAgICAgKCh2b2lkICopIDApCisKKy8qIEVycm9yIGNvZGVzIChkZXNjcmlwdGlvbnMgYXJlIGluIGNvbW1vbi5jKSAqLwordHlwZWRlZiBlbnVtCit7CisgIEVSUl9OT05FID0gMCwKKyAgRVJSX0JBRF9GSUxFTkFNRSwKKyAgRVJSX0JBRF9GSUxFVFlQRSwKKyAgRVJSX0JBRF9HWklQX0RBVEEsCisgIEVSUl9CQURfR1pJUF9IRUFERVIsCisgIEVSUl9CQURfUEFSVF9UQUJMRSwKKyAgRVJSX0JBRF9WRVJTSU9OLAorICBFUlJfQkVMT1dfMU1CLAorICBFUlJfQk9PVF9DT01NQU5ELAorICBFUlJfQk9PVF9GQUlMVVJFLAorICBFUlJfQk9PVF9GRUFUVVJFUywKKyAgRVJSX0RFVl9GT1JNQVQsCisgIEVSUl9ERVZfVkFMVUVTLAorICBFUlJfRVhFQ19GT1JNQVQsCisgIEVSUl9GSUxFTEVOR1RILAorICBFUlJfRklMRV9OT1RfRk9VTkQsCisgIEVSUl9GU1lTX0NPUlJVUFQsCisgIEVSUl9GU1lTX01PVU5ULAorICBFUlJfR0VPTSwKKyAgRVJSX05FRURfTFhfS0VSTkVMLAorICBFUlJfTkVFRF9NQl9LRVJORUwsCisgIEVSUl9OT19ESVNLLAorICBFUlJfTk9fUEFSVCwKKyAgRVJSX05VTUJFUl9QQVJTSU5HLAorICBFUlJfT1VUU0lERV9QQVJULAorICBFUlJfUkVBRCwKKyAgRVJSX1NZTUxJTktfTE9PUCwKKyAgRVJSX1VOUkVDT0dOSVpFRCwKKyAgRVJSX1dPTlRfRklULAorICBFUlJfV1JJVEUsCisgIEVSUl9CQURfQVJHVU1FTlQsCisgIEVSUl9VTkFMSUdORUQsCisgIEVSUl9QUklWSUxFR0VELAorICBFUlJfREVWX05FRURfSU5JVCwKKyAgRVJSX05PX0RJU0tfU1BBQ0UsCisgIEVSUl9OVU1CRVJfT1ZFUkZMT1csCisKKyAgTUFYX0VSUl9OVU0KK30gZ3J1Yl9lcnJvcl90OworCitleHRlcm4gdW5zaWduZWQgbG9uZyBpbnN0YWxsX3BhcnRpdGlvbjsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGJvb3RfZHJpdmU7CitleHRlcm4gdW5zaWduZWQgbG9uZyBpbnN0YWxsX3NlY29uZF9zZWN0b3I7CitleHRlcm4gc3RydWN0IGFwbV9pbmZvIGFwbV9iaW9zX2luZm87CitleHRlcm4gdW5zaWduZWQgbG9uZyBib290X3BhcnRfYWRkcjsKK2V4dGVybiBpbnQgc2F2ZWRfZW50cnlubzsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIGZvcmNlX2xiYTsKK2V4dGVybiBjaGFyIHZlcnNpb25fc3RyaW5nW107CitleHRlcm4gY2hhciBjb25maWdfZmlsZVtdOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbGludXhfdGV4dF9sZW47CitleHRlcm4gY2hhciAqbGludXhfZGF0YV90bXBfYWRkcjsKK2V4dGVybiBjaGFyICpsaW51eF9kYXRhX3JlYWxfYWRkcjsKKworI2lmZGVmIEdSVUJfVVRJTAorLyogSWYgbm90IHVzaW5nIGNvbmZpZyBmaWxlLCB0aGlzIHZhcmlhYmxlIGlzIHNldCB0byB6ZXJvLAorICAgb3RoZXJ3aXNlIG5vbi16ZXJvLiAgKi8KK2V4dGVybiBpbnQgdXNlX2NvbmZpZ19maWxlOworLyogSWYgdXNpbmcgdGhlIHByZXNldCBtZW51LCB0aGlzIHZhcmlhYmxlIGlzIHNldCB0byBub24temVybywKKyAgIG90aGVyd2lzZSB6ZXJvLiAgKi8KK2V4dGVybiBpbnQgdXNlX3ByZXNldF9tZW51OworLyogSWYgbm90IHVzaW5nIGN1cnNlcywgdGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gemVybywgb3RoZXJ3aXNlIG5vbi16ZXJvLiAgKi8KK2V4dGVybiBpbnQgdXNlX2N1cnNlczsKKy8qIFRoZSBmbGFnIGZvciB2ZXJib3NlIG1lc3NhZ2VzLiAgKi8KK2V4dGVybiBpbnQgdmVyYm9zZTsKKy8qIFRoZSBmbGFnIGZvciByZWFkLW9ubHkuICAqLworZXh0ZXJuIGludCByZWFkX29ubHk7CisvKiBUaGUgbnVtYmVyIG9mIGZsb3BwaWVzIHRvIGJlIHByb2JlZC4gICovCitleHRlcm4gaW50IGZsb3BweV9kaXNrczsKKy8qIFRoZSBtYXAgYmV0d2VlbiBCSU9TIGRyaXZlcyBhbmQgVU5JWCBkZXZpY2UgZmlsZSBuYW1lcy4gICovCitleHRlcm4gY2hhciAqKmRldmljZV9tYXA7CisvKiBUaGUgZmlsZW5hbWUgd2hpY2ggc3RvcmVzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIGRldmljZSBtYXAuICAqLworZXh0ZXJuIGNoYXIgKmRldmljZV9tYXBfZmlsZTsKKy8qIFRoZSBhcnJheSBvZiBnZW9tZXRyaWVzLiAgKi8KK2V4dGVybiBzdHJ1Y3QgZ2VvbWV0cnkgKmRpc2tzOworLyogQXNzaWduIERSSVZFIHRvIGEgZGV2aWNlIG5hbWUgREVWSUNFLiAgKi8KK2V4dGVybiB2b2lkIGFzc2lnbl9kZXZpY2VfbmFtZSAoaW50IGRyaXZlLCBjb25zdCBjaGFyICpkZXZpY2UpOworI2VuZGlmCisKKyNpZm5kZWYgU1RBR0UxXzUKKy8qIEdVSSBpbnRlcmZhY2UgdmFyaWFibGVzLiAqLworIyBkZWZpbmUgTUFYX0ZBTExCQUNLX0VOVFJJRVMJOAorZXh0ZXJuIGludCBmYWxsYmFja19lbnRyaWVzW01BWF9GQUxMQkFDS19FTlRSSUVTXTsKK2V4dGVybiBpbnQgZmFsbGJhY2tfZW50cnlubzsKK2V4dGVybiBpbnQgZGVmYXVsdF9lbnRyeTsKK2V4dGVybiBpbnQgY3VycmVudF9lbnRyeW5vOworCisvKiBUaGUgY29uc3RhbnRzIGZvciBwYXNzd29yZCB0eXBlcy4gICovCit0eXBlZGVmIGVudW0KK3sKKyAgUEFTU1dPUkRfUExBSU4sCisgIFBBU1NXT1JEX01ENSwKKyAgUEFTU1dPUkRfVU5TVVBQT1JURUQKK30KK3Bhc3N3b3JkX3Q7CisKK2V4dGVybiBjaGFyICpwYXNzd29yZDsKK2V4dGVybiBwYXNzd29yZF90IHBhc3N3b3JkX3R5cGU7CitleHRlcm4gaW50IGF1dGg7CitleHRlcm4gY2hhciBjb21tYW5kc1tdOworCisvKiBGb3IgYG1vcmUnLWxpa2UgZmVhdHVyZS4gICovCitleHRlcm4gaW50IG1heF9saW5lczsKK2V4dGVybiBpbnQgY291bnRfbGluZXM7CitleHRlcm4gaW50IHVzZV9wYWdlcjsKKyNlbmRpZgorCisjaWZuZGVmIE5PX0RFQ09NUFJFU1NJT04KK2V4dGVybiBpbnQgbm9fZGVjb21wcmVzc2lvbjsKK2V4dGVybiBpbnQgY29tcHJlc3NlZF9maWxlOworI2VuZGlmCisKKy8qIGluc3RydW1lbnRhdGlvbiB2YXJpYWJsZXMgKi8KK2V4dGVybiB2b2lkICgqZGlza19yZWFkX2hvb2spIChpbnQsIGludCwgaW50KTsKK2V4dGVybiB2b2lkICgqZGlza19yZWFkX2Z1bmMpIChpbnQsIGludCwgaW50KTsKKworI2lmbmRlZiBTVEFHRTFfNQorLyogVGhlIGZsYWcgZm9yIGRlYnVnIG1vZGUuICAqLworZXh0ZXJuIGludCBkZWJ1ZzsKKyNlbmRpZiAvKiBTVEFHRTFfNSAqLworCitleHRlcm4gdW5zaWduZWQgbG9uZyBjdXJyZW50X2RyaXZlOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY3VycmVudF9wYXJ0aXRpb247CisKK2V4dGVybiBpbnQgZnN5c190eXBlOworCisvKiBUaGUgaW5mb3JtYXRpb24gZm9yIGEgZGlzayBnZW9tZXRyeS4gVGhlIENIUyBpbmZvcm1hdGlvbiBpcyBvbmx5IGZvcgorICAgRE9TL1BhcnRpdGlvbiB0YWJsZSBjb21wYXRpYmlsaXR5LCBhbmQgdGhlIHJlYWwgbnVtYmVyIG9mIHNlY3RvcnMgaXMKKyAgIHN0b3JlZCBpbiBUT1RBTF9TRUNUT1JTLiAgKi8KK3N0cnVjdCBnZW9tZXRyeQoreworICAvKiBUaGUgbnVtYmVyIG9mIGN5bGluZGVycyAqLworICB1bnNpZ25lZCBsb25nIGN5bGluZGVyczsKKyAgLyogVGhlIG51bWJlciBvZiBoZWFkcyAqLworICB1bnNpZ25lZCBsb25nIGhlYWRzOworICAvKiBUaGUgbnVtYmVyIG9mIHNlY3RvcnMgKi8KKyAgdW5zaWduZWQgbG9uZyBzZWN0b3JzOworICAvKiBUaGUgdG90YWwgbnVtYmVyIG9mIHNlY3RvcnMgKi8KKyAgdW5zaWduZWQgbG9uZyB0b3RhbF9zZWN0b3JzOworICAvKiBEZXZpY2Ugc2VjdG9yIHNpemUgKi8KKyAgdW5zaWduZWQgbG9uZyBzZWN0b3Jfc2l6ZTsKKyAgLyogRmxhZ3MgKi8KKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKK307CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIHBhcnRfc3RhcnQ7CitleHRlcm4gdW5zaWduZWQgbG9uZyBwYXJ0X2xlbmd0aDsKKworZXh0ZXJuIGludCBjdXJyZW50X3NsaWNlOworCitleHRlcm4gaW50IGJ1Zl9kcml2ZTsKK2V4dGVybiBpbnQgYnVmX3RyYWNrOworZXh0ZXJuIHN0cnVjdCBnZW9tZXRyeSBidWZfZ2VvbTsKKworLyogdGhlc2UgYXJlIHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24gYW5kIG1heGltdW0gZmlsZSBwb3NpdGlvbiAqLworZXh0ZXJuIGludCBmaWxlcG9zOworZXh0ZXJuIGludCBmaWxlbWF4OworCisvKgorICogIENvbW1vbiBCSU9TL2Jvb3QgZGF0YS4KKyAqLworCitleHRlcm4gc3RydWN0IG11bHRpYm9vdF9pbmZvIG1iaTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHNhdmVkX2RyaXZlOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2F2ZWRfcGFydGl0aW9uOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY2Ryb21fZHJpdmU7CisjaWZuZGVmIFNUQUdFMV81CitleHRlcm4gdW5zaWduZWQgbG9uZyBzYXZlZF9tZW1fdXBwZXI7CitleHRlcm4gdW5zaWduZWQgbG9uZyBleHRlbmRlZF9tZW1vcnk7CisjZW5kaWYKKworLyoKKyAqICBFcnJvciB2YXJpYWJsZXMuCisgKi8KKworZXh0ZXJuIGdydWJfZXJyb3JfdCBlcnJudW07CitleHRlcm4gY2hhciAqZXJyX2xpc3RbXTsKKworLyogU2ltcGxpZnkgZGVjbGFyYXRpb24gb2YgZW50cnlfYWRkci4gKi8KK3R5cGVkZWYgdm9pZCAoKmVudHJ5X2Z1bmMpIChpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KQorICAgICBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKTsKKworZXh0ZXJuIGVudHJ5X2Z1bmMgZW50cnlfYWRkcjsKKworLyogRW50ZXIgdGhlIHN0YWdlMS41L3N0YWdlMiBDIGNvZGUgYWZ0ZXIgdGhlIHN0YWNrIGlzIHNldCB1cC4gKi8KK3ZvaWQgY21haW4gKHZvaWQpOworCisvKiBIYWx0IHRoZSBwcm9jZXNzb3IgKGNhbGxlZCBhZnRlciBhbiB1bnJlY292ZXJhYmxlIGVycm9yKS4gKi8KK3ZvaWQgc3RvcCAodm9pZCkgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSk7CisKKy8qIFJlYm9vdCB0aGUgc3lzdGVtLiAgKi8KK3ZvaWQgZ3J1Yl9yZWJvb3QgKHZvaWQpIF9fYXR0cmlidXRlX18gKChub3JldHVybikpOworCisvKiBIYWx0IHRoZSBzeXN0ZW0sIHVzaW5nIEFQTSBpZiBwb3NzaWJsZS4gSWYgTk9fQVBNIGlzIHRydWUsIGRvbid0IHVzZQorICAgQVBNIGV2ZW4gaWYgaXQgaXMgYXZhaWxhYmxlLiAgKi8KK3ZvaWQgZ3J1Yl9oYWx0IChpbnQgbm9fYXBtKSBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKTsKKworLyogQ29weSBNQVAgdG8gdGhlIGRyaXZlIG1hcCBhbmQgc2V0IHVwIGludDEzX2hhbmRsZXIuICAqLwordm9pZCBzZXRfaW50MTNfaGFuZGxlciAodW5zaWduZWQgc2hvcnQgKm1hcCk7CisKKy8qIFNldCB1cCBpbnQxNV9oYW5kbGVyLiAgKi8KK3ZvaWQgc2V0X2ludDE1X2hhbmRsZXIgKHZvaWQpOworCisvKiBSZXN0b3JlIHRoZSBvcmlnaW5hbCBpbnQxNSBoYW5kbGVyLiAgKi8KK3ZvaWQgdW5zZXRfaW50MTVfaGFuZGxlciAodm9pZCk7CisKKy8qIFRyYWNrIHRoZSBpbnQxMyBoYW5kbGVyIHRvIHByb2JlIEkvTyBhZGRyZXNzIHNwYWNlLiAgKi8KK3ZvaWQgdHJhY2tfaW50MTMgKGludCBkcml2ZSk7CisKKy8qIFRoZSBrZXkgbWFwLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBiaW9zX2tleV9tYXBbXTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBhc2NpaV9rZXlfbWFwW107CitleHRlcm4gdW5zaWduZWQgc2hvcnQgaW9fbWFwW107CisKKy8qIGNhbGxzIGZvciBkaXJlY3QgYm9vdC1sb2FkZXIgY2hhaW5pbmcgKi8KK3ZvaWQgY2hhaW5fc3RhZ2UxICh1bnNpZ25lZCBsb25nIHNlZ21lbnQsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkgICB1bnNpZ25lZCBsb25nIHBhcnRfdGFibGVfYWRkcikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSk7Cit2b2lkIGNoYWluX3N0YWdlMiAodW5zaWduZWQgbG9uZyBzZWdtZW50LCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJICAgaW50IHNlY29uZF9zZWN0b3IpCisgICAgIF9fYXR0cmlidXRlX18gKChub3JldHVybikpOworCisvKiBkbyBzb21lIGZ1bmt5IHN0dWZmLCB0aGVuIGJvb3QgbGludXggKi8KK3ZvaWQgbGludXhfYm9vdCAodm9pZCkgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSk7CisKKy8qIGRvIHNvbWUgZnVua3kgc3R1ZmYsIHRoZW4gYm9vdCBiekltYWdlIGxpbnV4ICovCit2b2lkIGJpZ19saW51eF9ib290ICh2b2lkKSBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKTsKKworLyogYm9vdGluZyBhIG11bHRpYm9vdCBleGVjdXRhYmxlICovCit2b2lkIG11bHRpX2Jvb3QgKGludCBzdGFydCwgaW50IG1iX2luZm8pIF9fYXR0cmlidXRlX18gKChub3JldHVybikpOworCisvKiBJZiBMSU5FQVIgaXMgbm9uemVybywgdGhlbiBzZXQgdGhlIEludGVsIHByb2Nlc3NvciB0byBsaW5lYXIgbW9kZS4KKyAgIE90aGVyd2lzZSwgYml0IDIwIG9mIGFsbCBtZW1vcnkgYWNjZXNzZXMgaXMgYWx3YXlzIGZvcmNlZCB0byB6ZXJvLAorICAgY2F1c2luZyBhIHdyYXBhcm91bmQgZWZmZWN0IGZvciBidWd3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggdGhlCisgICA4MDg2IENQVS4gKi8KK3ZvaWQgZ2F0ZUEyMCAoaW50IGxpbmVhcik7CisKKy8qIG1lbW9yeSBwcm9iZSByb3V0aW5lcyAqLworaW50IGdldF9tZW1zaXplIChpbnQgdHlwZSk7CitpbnQgZ2V0X2Vpc2FtZW1zaXplICh2b2lkKTsKKworLyogRmV0Y2ggdGhlIG5leHQgZW50cnkgaW4gdGhlIG1lbW9yeSBtYXAgYW5kIHJldHVybiB0aGUgY29udGludWF0aW9uCisgICB2YWx1ZS4gIERFU0MgaXMgYSBwb2ludGVyIHRvIHRoZSBkZXNjcmlwdG9yIGJ1ZmZlciwgYW5kIENPTlQgaXMgdGhlCisgICBwcmV2aW91cyBjb250aW51YXRpb24gdmFsdWUgKDAgdG8gZ2V0IHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUKKyAgIG1hcCkuICovCitpbnQgZ2V0X21tYXBfZW50cnkgKHN0cnVjdCBtbWFyX2Rlc2MgKmRlc2MsIGludCBjb250KTsKKworLyogR2V0IHRoZSBsaW5lYXIgYWRkcmVzcyBvZiBhIFJPTSBjb25maWd1cmF0aW9uIHRhYmxlLiBSZXR1cm4gemVybywKKyAgIGlmIGZhaWxzLiAgKi8KK3Vuc2lnbmVkIGxvbmcgZ2V0X3JvbV9jb25maWdfdGFibGUgKHZvaWQpOworCisvKiBHZXQgQVBNIEJJT1MgaW5mb3JtYXRpb24uICAqLwordm9pZCBnZXRfYXBtX2luZm8gKHZvaWQpOworCisvKiBHZXQgVkJFIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24uICAqLworaW50IGdldF92YmVfY29udHJvbGxlcl9pbmZvIChzdHJ1Y3QgdmJlX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIpOworCisvKiBHZXQgVkJFIG1vZGUgaW5mb3JtYXRpb24uICAqLworaW50IGdldF92YmVfbW9kZV9pbmZvIChpbnQgbW9kZV9udW1iZXIsIHN0cnVjdCB2YmVfbW9kZSAqbW9kZSk7CisKKy8qIFNldCBWQkUgbW9kZS4gICovCitpbnQgc2V0X3ZiZV9tb2RlIChpbnQgbW9kZV9udW1iZXIpOworCisvKiBSZXR1cm4gdGhlIGRhdGEgYXJlYSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgb3VyIGNvZGUuICovCitpbnQgZ2V0X2NvZGVfZW5kICh2b2lkKTsKKworLyogbG93LWxldmVsIHRpbWluZyBpbmZvICovCitpbnQgZ2V0cnRzZWNzICh2b2lkKTsKK2ludCBjdXJydGlja3MgKHZvaWQpOworCisvKiBDbGVhciB0aGUgc2NyZWVuLiAqLwordm9pZCBjbHMgKHZvaWQpOworCisvKiBUdXJuIG9uL29mZiBjdXJzb3IuICovCitpbnQgc2V0Y3Vyc29yIChpbnQgb24pOworCisvKiBHZXQgdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uICh3aGVyZSAwLDAgaXMgdGhlIHRvcCBsZWZ0IGhhbmQKKyAgIGNvcm5lciBvZiB0aGUgc2NyZWVuKS4gIFJldHVybnMgcGFja2VkIHZhbHVlcywgKFJFVCA+PiA4KSBpcyB4LAorICAgKFJFVCAmIDB4ZmYpIGlzIHkuICovCitpbnQgZ2V0eHkgKHZvaWQpOworCisvKiBTZXQgdGhlIGN1cnNvciBwb3NpdGlvbi4gKi8KK3ZvaWQgZ290b3h5IChpbnQgeCwgaW50IHkpOworCisvKiBEaXNwbGF5cyBhbiBBU0NJSSBjaGFyYWN0ZXIuICBJQk0gZGlzcGxheXMgd2lsbCB0cmFuc2xhdGUgc29tZQorICAgY2hhcmFjdGVycyB0byBzcGVjaWFsIGdyYXBoaWNhbCBvbmVzIChzZWUgdGhlIERJU1BfKiBjb25zdGFudHMpLiAqLwordm9pZCBncnViX3B1dGNoYXIgKGludCBjKTsKKworLyogV2FpdCBmb3IgYSBrZXlwcmVzcywgYW5kIHJldHVybiBpdHMgcGFja2VkIEJJT1MvQVNDSUkga2V5IGNvZGUuCisgICBVc2UgQVNDSUlfQ0hBUihyZXQpIHRvIGV4dHJhY3QgdGhlIEFTQ0lJIGNvZGUuICovCitpbnQgZ2V0a2V5ICh2b2lkKTsKKworLyogTGlrZSBHRVRLRVksIGJ1dCBkb2Vzbid0IGJsb2NrLCBhbmQgcmV0dXJucyAtMSBpZiBubyBrZXlzdHJva2UgaXMKKyAgIGF2YWlsYWJsZS4gKi8KK2ludCBjaGVja2tleSAodm9pZCk7CisKKy8qIExvdy1sZXZlbCBkaXNrIEkvTyAqLworaW50IGdldF9kaXNraW5mbyAoaW50IGRyaXZlLCBzdHJ1Y3QgZ2VvbWV0cnkgKmdlb21ldHJ5KTsKK2ludCBiaW9zZGlzayAoaW50IHN1YmZ1bmMsIGludCBkcml2ZSwgc3RydWN0IGdlb21ldHJ5ICpnZW9tZXRyeSwKKwkgICAgICBpbnQgc2VjdG9yLCBpbnQgbnNlYywgaW50IHNlZ21lbnQpOwordm9pZCBzdG9wX2Zsb3BweSAodm9pZCk7CisKKy8qIENvbW1hbmQtbGluZSBpbnRlcmZhY2UgZnVuY3Rpb25zLiAqLworI2lmbmRlZiBTVEFHRTFfNQorCisvKiBUaGUgZmxhZ3MgZm9yIHRoZSBidWlsdGlucy4gICovCisjZGVmaW5lIEJVSUxUSU5fQ01ETElORQkJMHgxCS8qIFJ1biBpbiB0aGUgY29tbWFuZC1saW5lLiAgKi8KKyNkZWZpbmUgQlVJTFRJTl9NRU5VCQkweDIJLyogUnVuIGluIHRoZSBtZW51LiAgKi8KKyNkZWZpbmUgQlVJTFRJTl9USVRMRQkJMHg0CS8qIE9ubHkgZm9yIHRoZSBjb21tYW5kIHRpdGxlLiAgKi8KKyNkZWZpbmUgQlVJTFRJTl9TQ1JJUFQJCTB4OAkvKiBSdW4gaW4gdGhlIHNjcmlwdC4gICovCisjZGVmaW5lIEJVSUxUSU5fTk9fRUNITwkJMHgxMAkvKiBEb24ndCBwcmludCBjb21tYW5kIG9uIGJvb3RpbmcuICovCisjZGVmaW5lIEJVSUxUSU5fSEVMUF9MSVNUCTB4MjAJLyogU2hvdyBoZWxwIGluIGxpc3RpbmcuICAqLworCisvKiBUaGUgdGFibGUgZm9yIGEgYnVpbHRpbi4gICovCitzdHJ1Y3QgYnVpbHRpbgoreworICAvKiBUaGUgY29tbWFuZCBuYW1lLiAgKi8KKyAgY2hhciAqbmFtZTsKKyAgLyogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uLiAgKi8KKyAgaW50ICgqZnVuYykgKGNoYXIgKiwgaW50KTsKKyAgLyogVGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBmbGFncyBkZWZpbmVkIGFib3ZlLiAgKi8KKyAgaW50IGZsYWdzOworICAvKiBUaGUgc2hvcnQgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnRhdGlvbi4gICovCisgIGNoYXIgKnNob3J0X2RvYzsKKyAgLyogVGhlIGxvbmcgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnRhdGlvbi4gICovCisgIGNoYXIgKmxvbmdfZG9jOworfTsKKworLyogQWxsIHRoZSBidWlsdGlucyBhcmUgcmVnaXN0ZXJlZCBpbiB0aGlzLiAgKi8KK2V4dGVybiBzdHJ1Y3QgYnVpbHRpbiAqYnVpbHRpbl90YWJsZVtdOworCisvKiBUaGUgY29uc3RhbnRzIGZvciBrZXJuZWwgdHlwZXMuICAqLwordHlwZWRlZiBlbnVtCit7CisgIEtFUk5FTF9UWVBFX05PTkUsCQkvKiBOb25lIGlzIGxvYWRlZC4gICovCisgIEtFUk5FTF9UWVBFX01VTFRJQk9PVCwJLyogTXVsdGlib290LiAgKi8KKyAgS0VSTkVMX1RZUEVfTElOVVgsCQkvKiBMaW51eC4gICovCisgIEtFUk5FTF9UWVBFX0JJR19MSU5VWCwJLyogQmlnIExpbnV4LiAgKi8KKyAgS0VSTkVMX1RZUEVfRlJFRUJTRCwJCS8qIEZyZWVCU0QuICAqLworICBLRVJORUxfVFlQRV9ORVRCU0QsCQkvKiBOZXRCU0QuICAqLworICBLRVJORUxfVFlQRV9DSEFJTkxPQURFUgkvKiBDaGFpbmxvYWRlci4gICovCit9CitrZXJuZWxfdDsKKworZXh0ZXJuIGtlcm5lbF90IGtlcm5lbF90eXBlOworZXh0ZXJuIGludCBzaG93X21lbnU7CitleHRlcm4gaW50IGdydWJfdGltZW91dDsKKwordm9pZCBpbml0X2J1aWx0aW5zICh2b2lkKTsKK3ZvaWQgaW5pdF9jb25maWcgKHZvaWQpOworY2hhciAqc2tpcF90byAoaW50IGFmdGVyX2VxdWFsLCBjaGFyICpjbWRsaW5lKTsKK3N0cnVjdCBidWlsdGluICpmaW5kX2NvbW1hbmQgKGNoYXIgKmNvbW1hbmQpOwordm9pZCBwcmludF9jbWRsaW5lX21lc3NhZ2UgKGludCBmb3JldmVyKTsKK3ZvaWQgZW50ZXJfY21kbGluZSAoY2hhciAqaGVhcCwgaW50IGZvcmV2ZXIpOworaW50IHJ1bl9zY3JpcHQgKGNoYXIgKnNjcmlwdCwgY2hhciAqaGVhcCk7CisjZW5kaWYKKworLyogQyBsaWJyYXJ5IHJlcGxhY2VtZW50IGZ1bmN0aW9ucyB3aXRoIGlkZW50aWNhbCBzZW1hbnRpY3MuICovCit2b2lkIGdydWJfcHJpbnRmIChjb25zdCBjaGFyICpmb3JtYXQsLi4uKTsKK2ludCBncnViX3NwcmludGYgKGNoYXIgKmJ1ZmZlciwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworaW50IGdydWJfdG9sb3dlciAoaW50IGMpOworaW50IGdydWJfaXNzcGFjZSAoaW50IGMpOworaW50IGdydWJfc3RybmNhdCAoY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBpbnQgbik7Cit2b2lkICpncnViX21lbW1vdmUgKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBpbnQgbGVuKTsKK3ZvaWQgKmdydWJfbWVtc2V0ICh2b2lkICpzdGFydCwgaW50IGMsIGludCBsZW4pOworaW50IGdydWJfc3RybmNhdCAoY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBpbnQgbik7CitjaGFyICpncnViX3N0cnN0ciAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKTsKK2ludCBncnViX21lbWNtcCAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBpbnQgbik7CitpbnQgZ3J1Yl9zdHJjbXAgKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMik7CitpbnQgZ3J1Yl9zdHJsZW4gKGNvbnN0IGNoYXIgKnN0cik7CitjaGFyICpncnViX3N0cmNweSAoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKTsKKworI2lmbmRlZiBHUlVCX1VUSUwKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBncnViX2ptcF9idWZbNl07CisjZWxzZQorLyogSW4gdGhlIGdydWIgc2hlbGwsIHVzZSB0aGUgbGliYyBqbXBfYnVmIGluc3RlYWQuICAqLworIyBpbmNsdWRlIDxzZXRqbXAuaD4KKyMgZGVmaW5lIGdydWJfam1wX2J1ZiBqbXBfYnVmCisjZW5kaWYKKworI2lmZGVmIEdSVUJfVVRJTAorIyBkZWZpbmUgZ3J1Yl9zZXRqbXAJc2V0am1wCisjIGRlZmluZSBncnViX2xvbmdqbXAJbG9uZ2ptcAorI2Vsc2UgLyogISBHUlVCX1VUSUwgKi8KK2ludCBncnViX3NldGptcCAoZ3J1Yl9qbXBfYnVmIGVudik7Cit2b2lkIGdydWJfbG9uZ2ptcCAoZ3J1Yl9qbXBfYnVmIGVudiwgaW50IHZhbCk7CisjZW5kaWYgLyogISBHUlVCX1VUSUwgKi8KKworLyogVGhlIGVudmlyb25tZW50IGZvciByZXN0YXJ0aW5nIFN0YWdlIDIuICAqLworZXh0ZXJuIGdydWJfam1wX2J1ZiByZXN0YXJ0X2VudjsKKy8qIFRoZSBlbnZpcm9ubWVudCBmb3IgcmVzdGFydGluZyB0aGUgY29tbWFuZC1saW5lIGludGVyZmFjZS4gICovCitleHRlcm4gZ3J1Yl9qbXBfYnVmIHJlc3RhcnRfY21kbGluZV9lbnY7CisKKy8qIG1pc2MgKi8KK3ZvaWQgaW5pdF9wYWdlICh2b2lkKTsKK3ZvaWQgcHJpbnRfZXJyb3IgKHZvaWQpOworY2hhciAqY29udmVydF90b19hc2NpaSAoY2hhciAqYnVmLCBpbnQgYywgLi4uKTsKK2ludCBnZXRfY21kbGluZSAoY2hhciAqcHJvbXB0LCBjaGFyICpjbWRsaW5lLCBpbnQgbWF4bGVuLAorCQkgaW50IGVjaG9fY2hhciwgaW50IGhpc3RvcnkpOworaW50IHN1YnN0cmluZyAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKTsKK2ludCBudWxfdGVybWluYXRlIChjaGFyICpzdHIpOworaW50IGdldF9iYXNlZF9kaWdpdCAoaW50IGMsIGludCBiYXNlKTsKK2ludCBzYWZlX3BhcnNlX21heGludCAoY2hhciAqKnN0cl9wdHIsIGludCAqbXlpbnRfcHRyKTsKK2ludCBtZW1jaGVjayAoaW50IHN0YXJ0LCBpbnQgbGVuKTsKK3ZvaWQgZ3J1Yl9wdXRzdHIgKGNvbnN0IGNoYXIgKnN0cik7CisKKyNpZm5kZWYgTk9fREVDT01QUkVTU0lPTgorLyogQ29tcHJlc3Npb24gc3VwcG9ydC4gKi8KK2ludCBndW56aXBfdGVzdF9oZWFkZXIgKHZvaWQpOworaW50IGd1bnppcF9yZWFkIChjaGFyICpidWYsIGludCBsZW4pOworI2VuZGlmIC8qIE5PX0RFQ09NUFJFU1NJT04gKi8KKworaW50IHJhd3JlYWQgKGludCBkcml2ZSwgaW50IHNlY3RvciwgaW50IGJ5dGVfb2Zmc2V0LCBpbnQgYnl0ZV9sZW4sIGNoYXIgKmJ1Zik7CitpbnQgZGV2cmVhZCAoaW50IHNlY3RvciwgaW50IGJ5dGVfb2Zmc2V0LCBpbnQgYnl0ZV9sZW4sIGNoYXIgKmJ1Zik7CitpbnQgcmF3d3JpdGUgKGludCBkcml2ZSwgaW50IHNlY3RvciwgY2hhciAqYnVmKTsKK2ludCBkZXZ3cml0ZSAoaW50IHNlY3RvciwgaW50IHNlY3Rvcl9sZW4sIGNoYXIgKmJ1Zik7CisKKy8qIFBhcnNlIGEgZGV2aWNlIHN0cmluZyBhbmQgaW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIHBhcmFtZXRlcnMuICovCitjaGFyICpzZXRfZGV2aWNlIChjaGFyICpkZXZpY2UpOworaW50IG9wZW5fZGV2aWNlICh2b2lkKTsKK2ludCByZWFsX29wZW5fcGFydGl0aW9uIChpbnQgZmxhZ3MpOworaW50IG9wZW5fcGFydGl0aW9uICh2b2lkKTsKK2ludCBuZXh0X3BhcnRpdGlvbiAodW5zaWduZWQgbG9uZyBkcml2ZSwgdW5zaWduZWQgbG9uZyBkZXN0LAorCQkgICAgdW5zaWduZWQgbG9uZyAqcGFydGl0aW9uLCBpbnQgKnR5cGUsCisJCSAgICB1bnNpZ25lZCBsb25nICpzdGFydCwgdW5zaWduZWQgbG9uZyAqbGVuLAorCQkgICAgdW5zaWduZWQgbG9uZyAqb2Zmc2V0LCBpbnQgKmVudHJ5LAorCQkgICAgdW5zaWduZWQgbG9uZyAqZXh0X29mZnNldCwgY2hhciAqYnVmKTsKKworLyogU2V0cyBkZXZpY2UgdG8gdGhlIG9uZSByZXByZXNlbnRlZCBieSB0aGUgU0FWRURfKiBwYXJhbWV0ZXJzLiAqLworaW50IG1ha2Vfc2F2ZWRfYWN0aXZlICh2b2lkKTsKKworLyogU2V0IG9yIGNsZWFyIHRoZSBjdXJyZW50IHJvb3QgcGFydGl0aW9uJ3MgaGlkZGVuIGZsYWcuICAqLworaW50IHNldF9wYXJ0aXRpb25faGlkZGVuX2ZsYWcgKGludCBoaWRkZW4pOworCisvKiBPcGVuIGEgZmlsZSBvciBkaXJlY3Rvcnkgb24gdGhlIGFjdGl2ZSBkZXZpY2UsIHVzaW5nIEdSVUIncworICAgaW50ZXJuYWwgZmlsZXN5c3RlbSBzdXBwb3J0LiAqLworaW50IGdydWJfb3BlbiAoY2hhciAqZmlsZW5hbWUpOworCisvKiBSZWFkIExFTiBieXRlcyBpbnRvIEJVRiBmcm9tIHRoZSBmaWxlIHRoYXQgd2FzIG9wZW5lZCB3aXRoCisgICBHUlVCX09QRU4uICBJZiBMRU4gaXMgLTEsIHJlYWQgYWxsIHRoZSByZW1haW5pbmcgZGF0YSBpbiB0aGUgZmlsZS4gICovCitpbnQgZ3J1Yl9yZWFkIChjaGFyICpidWYsIGludCBsZW4pOworCisvKiBSZXBvc2l0aW9uIGEgZmlsZSBvZmZzZXQuICAqLworaW50IGdydWJfc2VlayAoaW50IG9mZnNldCk7CisKKy8qIENsb3NlIGEgZmlsZS4gICovCit2b2lkIGdydWJfY2xvc2UgKHZvaWQpOworCisvKiBMaXN0IHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgd2FzIG9wZW5lZCB3aXRoIEdSVUJfT1BFTiwKKyAgIHByaW50aW5nIGFsbCBjb21wbGV0aW9ucy4gKi8KK2ludCBkaXIgKGNoYXIgKmRpcm5hbWUpOworCitpbnQgc2V0X2Jvb3RkZXYgKGludCBoZGJpYXMpOworCisvKiBEaXNwbGF5IHN0YXRpc3RpY3Mgb24gdGhlIGN1cnJlbnQgYWN0aXZlIGRldmljZS4gKi8KK3ZvaWQgcHJpbnRfZnN5c190eXBlICh2b2lkKTsKKworLyogRGlzcGxheSBkZXZpY2UgYW5kIGZpbGVuYW1lIGNvbXBsZXRpb25zLiAqLwordm9pZCBwcmludF9hX2NvbXBsZXRpb24gKGNoYXIgKmZpbGVuYW1lKTsKK2ludCBwcmludF9jb21wbGV0aW9ucyAoaW50IGlzX2ZpbGVuYW1lLCBpbnQgaXNfY29tcGxldGlvbik7CisKKy8qIENvcGllcyB0aGUgY3VycmVudCBwYXJ0aXRpb24gZGF0YSB0byB0aGUgZGVzaXJlZCBhZGRyZXNzLiAqLwordm9pZCBjb3B5X2N1cnJlbnRfcGFydF9lbnRyeSAoY2hhciAqYnVmKTsKKworI2lmbmRlZiBTVEFHRTFfNQordm9pZCBic2RfYm9vdCAoa2VybmVsX3QgdHlwZSwgaW50IGJvb3RkZXYsIGNoYXIgKmFyZykKKyAgICAgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSk7CisKKy8qIERlZmluZSBmbGFncyBmb3IgbG9hZF9pbWFnZSBoZXJlLiAgKi8KKy8qIERvbid0IHBhc3MgYSBMaW51eCdzIG1lbSBvcHRpb24gYXV0b21hdGljYWxseS4gICovCisjZGVmaW5lIEtFUk5FTF9MT0FEX05PX01FTV9PUFRJT04JKDEgPDwgMCkKKwora2VybmVsX3QgbG9hZF9pbWFnZSAoY2hhciAqa2VybmVsLCBjaGFyICphcmcsIGtlcm5lbF90IHN1Z2dlc3RlZF90eXBlLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgbG9hZF9mbGFncyk7CisKK2ludCBsb2FkX21vZHVsZSAoY2hhciAqbW9kdWxlLCBjaGFyICphcmcpOworaW50IGxvYWRfaW5pdHJkIChjaGFyICppbml0cmQpOworCitpbnQgY2hlY2tfcGFzc3dvcmQoY2hhciAqZW50ZXJlZCwgY2hhciogZXhwZWN0ZWQsIHBhc3N3b3JkX3QgdHlwZSk7CisjZW5kaWYKKwordm9pZCBpbml0X2Jpb3NfaW5mbyAodm9pZCk7CisKKyNlbmRpZiAvKiBBU01fRklMRSAqLworCisjZW5kaWYgLyogISBHUlVCX1NIQVJFRF9IRUFERVIgKi8KZGlmZiAtLWdpdCBhL3N0YWdlMi9zaXplX3Rlc3QgYi9zdGFnZTIvc2l6ZV90ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYyYjhjOTQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFnZTIvc2l6ZV90ZXN0CkBAIC0wLDAgKzEsNTQgQEAKKyMhL2Jpbi9zaAorCisjIENoZWNrIHRoZSBzaXplcyBvZiBTdGFnZSAyIGFuZCBTdGFnZSAxLjUncy4KKyMgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDQgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisjIFdyaXR0ZW4gYnkgT0tVSkkgWW9zaGlub3JpIDxva3VqaUBrdWljci5reW90by11LmFjLmpwPgorCisKKyMgVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIHNpemUgb2YgdGhlIGZpcnN0IGFyZ3VtZW50IChmaWxlbmFtZSkgaXMKKyMgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQgYXJndW1lbnQgKGxpbWl0KS4gSWYgc28sIHRoZW4gZXhpdCB3aXRoIHRoZQorIyBzdGF0dXMgMSwgb3RoZXJ3aXNlIGRvIG5vdGhpbmcuCitjaGVjayAoKQoreworICAgIGZpbGU9JDEKKyAgICBsaW1pdD0kMgorICAgIHNldCBkdW1teSBgbHMgLWwgJGZpbGVgCisgICAgc2l6ZT0kNgorICAgIGlmIHRlc3QgJHNpemUgLWd0ICRsaW1pdDsgdGhlbgorCWVjaG8gIiRmaWxlIGlzIHRvbyBiaWcgKCRzaXplID4gJGxpbWl0KS4iCisJZXhpdCAxCisgICAgZmkKK30KKworIyBUaGUgYm9vdGxvYWRlciBhcmVhIG9mIGEgRkZTIHBhcnRpdGlvbiBpcyAxNCBzZWN0b3JzLgorY2hlY2sgZmZzX3N0YWdlMV81IDcxNjgKKworY2hlY2sgdWZzMl9zdGFnZTFfNSA3MTY4CisKKyMgU3RhZ2UgMS41IGNhbiBiZSBpbnN0YWxsZWQgaW4gdGhlIHNlY3RvcnMgaW1tZWRpYXRlbHkgYWZ0ZXIgTUJSIGluIHRoZQorIyBmaXJzdCBjeWxpbmRlciwgc28gdGhlIHNpemUgaXMgKDYzIC0gMSkgc2VjdG9ycy4KK2NoZWNrIGZhdF9zdGFnZTFfNSAzMTc0NAorCisjIExpa2V3aXNlLgorY2hlY2sgZTJmc19zdGFnZTFfNSAzMTc0NAorCisjIExpa2V3aXNlLgorY2hlY2sgbWluaXhfc3RhZ2UxXzUgMzE3NDQKKworIyBTdWNjZXNzLgorZXhpdCAwCmRpZmYgLS1naXQgYS9zdGFnZTIvc21wLWltcHMuYyBiL3N0YWdlMi9zbXAtaW1wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NGQ3ODYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFnZTIvc21wLWltcHMuYwpAQCAtMCwwICsxLDc1NiBAQAorLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyoKKyAqICA8SW5zZXJ0IGNvcHlyaWdodCBoZXJlIDogaXQgbXVzdCBiZSBCU0QtbGlrZSBzbyBhbnlvbmUgY2FuIHVzZSBpdD4KKyAqCisgKiAgQXV0aG9yOiAgRXJpY2ggQm9sZXluICA8ZXJpY2hAdXJ1ay5vcmc+ICAgaHR0cDovL3d3dy51cnVrLm9yZy9+ZXJpY2gvCisgKgorICogIFNvdXJjZSBmaWxlIGltcGxlbWVudGluZyBJbnRlbCBNdWx0aVByb2Nlc3NvciBTcGVjaWZpY2F0aW9uIChNUFMpCisgKiAgdmVyc2lvbiAxLjEgYW5kIDEuNCBTTVAgaGFyZHdhcmUgY29udHJvbCBmb3IgSW50ZWwgQXJjaGl0ZWN0dXJlIENQVXMsCisgKiAgd2l0aCBob29rcyBmb3IgcnVubmluZyBjb3JyZWN0bHkgb24gYSBzdGFuZGFyZCBQQyB3aXRob3V0IHRoZSBoYXJkd2FyZS4KKyAqCisgKiAgVGhpcyBmaWxlIHdhcyBjcmVhdGVkIGZyb20gaW5mb3JtYXRpb24gaW4gdGhlIEludGVsIE1QUyB2ZXJzaW9uIDEuNAorICogIGRvY3VtZW50LCBvcmRlciBudW1iZXIgMjQyMDE2LTAwNCwgd2hpY2ggY2FuIGJlIG9yZGVyZWQgZnJvbSB0aGUKKyAqICBJbnRlbCBsaXRlcmF0dXJlIGNlbnRlci4KKyAqCisgKiAgR2VuZXJhbCBsaW1pdGF0aW9ucyBvZiB0aGlzIGNvZGU6CisgKgorICogICAoMSkgOiBUaGlzIGNvZGUgaGFzIG5ldmVyIGJlZW4gdGVzdGVkIG9uIGFuIE1QUy1jb21wYXRpYmxlIHN5c3RlbSB3aXRoCisgKiAgICAgICAgICAgNDg2IENQVXMsIGJ1dCBpcyBleHBlY3RlZCB0byB3b3JrLgorICogICAoMikgOiBQcmVzdW1lcyAiaW50IiwgImxvbmciLCBhbmQgInVuc2lnbmVkIiBhcmUgMzIgYml0cyBpbiBzaXplLCBhbmQKKyAqCSAgICAgdGhhdCAzMi1iaXQgcG9pbnRlcnMgYW5kIG1lbW9yeSBhZGRyZXNzaW5nIGlzIHVzZWQgdW5pZm9ybWx5LgorICovCisKKyNkZWZpbmUgX1NNUF9JTVBTX0MKKworCisvKgorICogIFhYWFhYICBUaGUgZm9sbG93aW5nIGFic29sdXRlbHkgbXVzdCBiZSBkZWZpbmVkISEhCisgKgorICogIFRoZSAiS0VSTkVMX1BSSU5UIiBjb3VsZCBiZSBtYWRlIGEgbnVsbCBtYWNybyB3aXRoIG5vIGRhbmdlciwgb2YKKyAqICBjb3Vyc2UsIGJ1dCBwcmV0dHkgbXVjaCBub3RoaW5nIHdvdWxkIHdvcmsgd2l0aG91dCB0aGUgb3RoZXIKKyAqICBvbmVzIGRlZmluZWQuCisgKi8KKworI2lmIDAKKyNkZWZpbmUgS0VSTkVMX1BSSU5UKHgpCQkvKiBzb21lIGtpbmQgb2YgcHJpbnQgZnVuY3Rpb24gKi8KKyNkZWZpbmUgQ01PU19XUklURV9CWVRFKHgseSkJLyogd3JpdGUgdW5zaWduZWQgY2hhciAieSIgYXQgQ01PUyBsb2MgIngiICovCisjZGVmaW5lIENNT1NfUkVBRF9CWVRFKHgpCS8qIHJlYWQgdW5zaWduZWQgY2hhciBhdCBDTU9TIGxvYyAieCIgKi8KKyNkZWZpbmUgUEhZU19UT19WSVJUVUFMKHgpCS8qIGNvbnZlcnQgcGh5c2ljYWwgYWRkcmVzcyAieCIgdG8gdmlydHVhbCAqLworI2RlZmluZSBWSVJUVUFMX1RPX1BIWVMoeCkJLyogY29udmVydCB2aXJ0dWFsIGFkZHJlc3MgIngiIHRvIHBoeXNpY2FsICovCisjZW5kaWYKKworCisvKgorICogIFRoaXMgaXMgdGhlIEludGVsIE11bHRpUHJvY2Vzc29yIFNwZWMgZGVidWdnaW5nL2Rpc3BsYXkgY29kZS4KKyAqLworCisjZGVmaW5lIElNUFNfREVCVUcKKyNkZWZpbmUgS0VSTkVMX1BSSU5UKHgpICAgICAgICAgcHJpbnRmIHgKKyNkZWZpbmUgQ01PU19XUklURV9CWVRFKHgsIHkpCWNtb3Nfd3JpdGVfYnl0ZSh4LCB5KQorI2RlZmluZSBDTU9TX1JFQURfQllURSh4KQljbW9zX3JlYWRfYnl0ZSh4KQorI2RlZmluZSBQSFlTX1RPX1ZJUlRVQUwoeCkJKHgpCisjZGVmaW5lIFZJUlRVQUxfVE9fUEhZUyh4KQkoeCkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyCitpbmIgKHVuc2lnbmVkIHNob3J0IHBvcnQpCit7CisgIHVuc2lnbmVkIGNoYXIgZGF0YTsKKworICBfX2FzbSBfX3ZvbGF0aWxlICgiaW5iICUxLCUwIiA6Ij1hIiAoZGF0YSk6ImQiIChwb3J0KSk7CisgIHJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK291dGIgKHVuc2lnbmVkIHNob3J0IHBvcnQsIHVuc2lnbmVkIGNoYXIgdmFsKQoreworICBfX2FzbSBfX3ZvbGF0aWxlICgib3V0YiAlMCwlMSI6OiJhIiAodmFsKSwgImQiIChwb3J0KSk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkCitjbW9zX3dyaXRlX2J5dGUgKGludCBsb2MsIGludCB2YWwpCit7CisgIG91dGIgKDB4NzAsIGxvYyk7CisgIG91dGIgKDB4NzEsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQKK2Ntb3NfcmVhZF9ieXRlIChpbnQgbG9jKQoreworICBvdXRiICgweDcwLCBsb2MpOworICByZXR1cm4gaW5iICgweDcxKTsKK30KKworCisvKgorICogIEluY2x1ZGVzIGhlcmUKKyAqLworCisjaW5jbHVkZSAic2hhcmVkLmgiCisjaW5jbHVkZSAiYXBpYy5oIgorI2luY2x1ZGUgInNtcC1pbXBzLmgiCisKKworLyoKKyAqICBEZWZpbmVzIHRoYXQgYXJlIGhlcmUgc28gYXMgbm90IHRvIGJlIGluIHRoZSBnbG9iYWwgaGVhZGVyIGZpbGUuCisgKi8KKyNkZWZpbmUgRUJEQV9TRUdfQUREUgkJCTB4NDBFCisjZGVmaW5lIEJJT1NfUkVTRVRfVkVDVE9SCQkweDQ2NworI2RlZmluZSBMQVBJQ19BRERSX0RFRkFVTFQJCTB4RkVFMDAwMDB1TAorI2RlZmluZSBJT0FQSUNfQUREUl9ERUZBVUxUCQkweEZFQzAwMDAwdUwKKyNkZWZpbmUgQ01PU19SRVNFVF9DT0RFCQkJMHhGCisjZGVmaW5lCQlDTU9TX1JFU0VUX0pVTVAJCTB4YQorI2RlZmluZSBDTU9TX0JBU0VfTUVNT1JZCQkweDE1CisKKworLyoKKyAqICBTdGF0aWMgZGVmaW5lcyBoZXJlIGZvciBTTVAgdXNlLgorICovCisKKyNkZWZpbmUgREVGX0VOVFJJRVMJMjMKKworc3RhdGljIGludCBsYXBpY19kdW1teSA9IDA7CitzdGF0aWMgc3RydWN0CisgIHsKKyAgICBpbXBzX3Byb2Nlc3NvciBwcm9jWzJdOworICAgIGltcHNfYnVzIGJ1c1syXTsKKyAgICBpbXBzX2lvYXBpYyBpb2FwaWM7CisgICAgaW1wc19pbnRlcnJ1cHQgaW50aW5bMTZdOworICAgIGltcHNfaW50ZXJydXB0IGxpbnRpblsyXTsKKyAgfQorZGVmY29uZmlnID0KK3sKKyAgeworICAgIHsKKyAgICAgIElNUFNfQkNUX1BST0NFU1NPUiwgMCwgMCwgMCwgMCwgMAorICAgIH0KKyAgICAsCisgICAgeworICAgICAgSU1QU19CQ1RfUFJPQ0VTU09SLCAxLCAwLCAwLCAwLCAwCisgICAgfQorICB9CisgICwKKyAgeworICAgIHsKKyAgICAgIElNUFNfQkNUX0JVUywgMCwKKyAgICAgIHsKKwknRScsICdJJywgJ1MnLCAnQScsICcgJywgJyAnCisgICAgICB9CisgICAgfQorICAgICwKKyAgICB7CisgICAgICAyNTUsIDEsCisgICAgICB7CisJJ1AnLCAnQycsICdJJywgJyAnLCAnICcsICcgJworICAgICAgfQorICAgIH0KKyAgfQorICAsCisgIHsKKyAgICBJTVBTX0JDVF9JT0FQSUMsIDAsIDAsIElNUFNfRkxBR19FTkFCTEVELCBJT0FQSUNfQUREUl9ERUZBVUxUCisgIH0KKyAgLAorICB7CisgICAgeworICAgICAgSU1QU19CQ1RfSU9fSU5URVJSVVBULCBJTVBTX0lOVF9FWFRJTlQsIDAsIDAsIDAsIDB4RkYsIDAKKyAgICB9CisgICAgLAorICAgIHsKKyAgICAgIElNUFNfQkNUX0lPX0lOVEVSUlVQVCwgSU1QU19JTlRfSU5ULCAwLCAwLCAxLCAweEZGLCAxCisgICAgfQorICAgICwKKyAgICB7CisgICAgICBJTVBTX0JDVF9JT19JTlRFUlJVUFQsIElNUFNfSU5UX0lOVCwgMCwgMCwgMCwgMHhGRiwgMgorICAgIH0KKyAgICAsCisgICAgeworICAgICAgSU1QU19CQ1RfSU9fSU5URVJSVVBULCBJTVBTX0lOVF9JTlQsIDAsIDAsIDMsIDB4RkYsIDMKKyAgICB9CisgICAgLAorICAgIHsKKyAgICAgIElNUFNfQkNUX0lPX0lOVEVSUlVQVCwgSU1QU19JTlRfSU5ULCAwLCAwLCA0LCAweEZGLCA0CisgICAgfQorICAgICwKKyAgICB7CisgICAgICBJTVBTX0JDVF9JT19JTlRFUlJVUFQsIElNUFNfSU5UX0lOVCwgMCwgMCwgNSwgMHhGRiwgNQorICAgIH0KKyAgICAsCisgICAgeworICAgICAgSU1QU19CQ1RfSU9fSU5URVJSVVBULCBJTVBTX0lOVF9JTlQsIDAsIDAsIDYsIDB4RkYsIDYKKyAgICB9CisgICAgLAorICAgIHsKKyAgICAgIElNUFNfQkNUX0lPX0lOVEVSUlVQVCwgSU1QU19JTlRfSU5ULCAwLCAwLCA3LCAweEZGLCA3CisgICAgfQorICAgICwKKyAgICB7CisgICAgICBJTVBTX0JDVF9JT19JTlRFUlJVUFQsIElNUFNfSU5UX0lOVCwgMCwgMCwgOCwgMHhGRiwgOAorICAgIH0KKyAgICAsCisgICAgeworICAgICAgSU1QU19CQ1RfSU9fSU5URVJSVVBULCBJTVBTX0lOVF9JTlQsIDAsIDAsIDksIDB4RkYsIDkKKyAgICB9CisgICAgLAorICAgIHsKKyAgICAgIElNUFNfQkNUX0lPX0lOVEVSUlVQVCwgSU1QU19JTlRfSU5ULCAwLCAwLCAxMCwgMHhGRiwgMTAKKyAgICB9CisgICAgLAorICAgIHsKKyAgICAgIElNUFNfQkNUX0lPX0lOVEVSUlVQVCwgSU1QU19JTlRfSU5ULCAwLCAwLCAxMSwgMHhGRiwgMTEKKyAgICB9CisgICAgLAorICAgIHsKKyAgICAgIElNUFNfQkNUX0lPX0lOVEVSUlVQVCwgSU1QU19JTlRfSU5ULCAwLCAwLCAxMiwgMHhGRiwgMTIKKyAgICB9CisgICAgLAorICAgIHsKKyAgICAgIElNUFNfQkNUX0lPX0lOVEVSUlVQVCwgSU1QU19JTlRfSU5ULCAwLCAwLCAxMywgMHhGRiwgMTMKKyAgICB9CisgICAgLAorICAgIHsKKyAgICAgIElNUFNfQkNUX0lPX0lOVEVSUlVQVCwgSU1QU19JTlRfSU5ULCAwLCAwLCAxNCwgMHhGRiwgMTQKKyAgICB9CisgICAgLAorICAgIHsKKyAgICAgIElNUFNfQkNUX0lPX0lOVEVSUlVQVCwgSU1QU19JTlRfSU5ULCAwLCAwLCAxNSwgMHhGRiwgMTUKKyAgICB9CisgIH0KKyAgLAorICB7CisgICAgeworICAgICAgSU1QU19CQ1RfTE9DQUxfSU5URVJSVVBULCBJTVBTX0lOVF9FWFRJTlQsIDAsIDAsIDE1LCAweEZGLCAwCisgICAgfQorICAgICwKKyAgICB7CisgICAgICBJTVBTX0JDVF9MT0NBTF9JTlRFUlJVUFQsIElNUFNfSU5UX05NSSwgMCwgMCwgMTUsIDB4RkYsIDEKKyAgICB9CisgIH0KK307CisKKy8qCisgKiAgRXhwb3J0ZWQgZ2xvYmFscyBoZXJlLgorICovCisKKy8qCisgKiAgImltcHNfYW55X25ld19hcGljcyIgaXMgbm9uLXplcm8gaWYgYW55IG9mIHRoZSBBUElDUyAobG9jYWwgb3IgSS9PKQorICogIGFyZSAqbm90KiBhbiA4MjQ4OURYLiAgVGhpcyBpcyB1c2VmdWwgdG8gZGV0ZXJtaW5lIGlmIG1vcmUgdGhhbiAxNQorICogIENQVXMgY2FuIGJlIHN1cHBvcnRlZCAodHJ1ZSBpZiB6ZXJvKS4KKyAqLworc3RhdGljIGludCBpbXBzX2FueV9uZXdfYXBpY3MgPSAwOworI2lmIDAKK3ZvbGF0aWxlIGludCBpbXBzX3JlbGVhc2VfY3B1cyA9IDA7CisjZW5kaWYKKy8qCisgKiAgImltcHNfZW5hYmxlZCIgaXMgbm9uLXplcm8gaWYgdGhlIHByb2JlIHNlcXVlbmNlIGZvdW5kIElNUFMKKyAqICBpbmZvcm1hdGlvbiBhbmQgd2FzIHN1Y2Nlc3NmdWwuCisgKi8KK3N0YXRpYyBpbnQgaW1wc19lbmFibGVkID0gMDsKKy8qCisgKiAgVGhpcyByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgQ1BVcyBmb3VuZC4KKyAqLworc3RhdGljIGludCBpbXBzX251bV9jcHVzID0gMTsKKy8qCisgKiAgVGhpcyBjb250YWlucyB0aGUgbG9jYWwgQVBJQyBoYXJkd2FyZSBhZGRyZXNzLgorICovCitzdGF0aWMgdW5zaWduZWQgaW1wc19sYXBpY19hZGRyID0gKCh1bnNpZ25lZCkgKCZsYXBpY19kdW1teSkpIC0gTEFQSUNfSUQ7CisvKgorICogIFRoZXNlIG1hcCBmcm9tIHZpcnR1YWwgY3B1IG51bWJlcnMgdG8gQVBJQyBpZCdzIGFuZCBiYWNrLgorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBpbXBzX2NwdV9hcGljX21hcFtJTVBTX01BWF9DUFVTXTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGltcHNfYXBpY19jcHVfbWFwW0lNUFNfTUFYX0NQVVNdOworCisKKy8qCisgKiAgTVBTIGNoZWNrc3VtIGZ1bmN0aW9uCisgKgorICogIEZ1bmN0aW9uIGZpbmlzaGVkLgorICovCisKK3N0YXRpYyBpbnQKK2dldF9jaGVja3N1bSAodW5zaWduZWQgc3RhcnQsIGludCBsZW5ndGgpCit7CisgIHVuc2lnbmVkIHN1bSA9IDA7CisKKyAgd2hpbGUgKGxlbmd0aC0tID4gMCkKKyAgICB7CisgICAgICBzdW0gKz0gKigodW5zaWduZWQgY2hhciAqKSAoc3RhcnQrKykpOworICAgIH0KKworICByZXR1cm4gKHN1bSAmIDB4RkYpOworfQorCisKKy8qCisgKiAgUHJpbWFyeSBmdW5jdGlvbiBmb3IgYm9vdGluZyBpbmRpdmlkdWFsIENQVXMuCisgKgorICogIFRoaXMgbXVzdCBiZSBtb2RpZmllZCB0byBwZXJmb3JtIHdoYXRldmVyIE9TLXNwZWNpZmljIGluaXRpYWxpemF0aW9uCisgKiAgdGhhdCBpcyByZXF1aXJlZC4KKyAqLworCitzdGF0aWMgaW50Citib290X2NwdSAoaW1wc19wcm9jZXNzb3IgKiBwcm9jKQoreworICB1bnNpZ25lZCBib290YWRkciwgYWNjZXB0X3N0YXR1czsKKyAgdW5zaWduZWQgYmlvc19yZXNldF92ZWN0b3IgPSBQSFlTX1RPX1ZJUlRVQUwgKEJJT1NfUkVTRVRfVkVDVE9SKTsKKworICAvKiAlJSUlJSBFU0IgKi8KKyAgZXh0ZXJuIGNoYXIgcGF0Y2hfY29kZVtdOworICBib290YWRkciA9IDI1NiAqIDEwMjQ7CisgIG1lbW1vdmUgKChjaGFyICopIGJvb3RhZGRyLCBwYXRjaF9jb2RlLCAzMik7CisKKyAgLyoKKyAgICogIEdlbmVyaWMgQ1BVIHN0YXJ0dXAgc2VxdWVuY2Ugc3RhcnRzIGhlcmUuCisgICAqLworCisgIC8qIHNldCBCSU9TIHJlc2V0IHZlY3RvciAqLworICBDTU9TX1dSSVRFX0JZVEUgKENNT1NfUkVTRVRfQ09ERSwgQ01PU19SRVNFVF9KVU1QKTsKKyAgKigodm9sYXRpbGUgdW5zaWduZWQgKikgYmlvc19yZXNldF92ZWN0b3IpID0gYm9vdGFkZHIgPDwgMTI7CisKKyAgLyogY2xlYXIgdGhlIGVycm9yIHJlZ2lzdGVyICovCisgIGlmIChwcm9jLT5hcGljX3ZlciAmIDB4MTApCisgICAgeworICAgICAgSU1QU19MQVBJQ19XUklURSAoTEFQSUNfRVNSLCAwKTsKKyAgICAgIGFjY2VwdF9zdGF0dXMgPSBJTVBTX0xBUElDX1JFQUQgKExBUElDX0VTUik7CisgICAgfQorCisjaWYgMAorICAvKiBhc3NlcnQgSU5JVCBJUEkgKi8KKyAgY2ZnID0gSU1QU19MQVBJQ19SRUFEIChMQVBJQ19JQ1IgKyAxKTsKKyAgY2ZnICY9IExBUElDX0RFU1RfTUFTSzsKKyAgSU1QU19MQVBJQ19XUklURSAoTEFQSUNfSUNSICsgMSwgY2ZnKTsKKyAgY2ZnID0gSU1QU19MQVBJQ19SRUFEIChMQVBJQ19BQ1IpOworICBjZmcgJj07CisKKyAgLyogJSUlJSUgRVNCIGZpbmlzaCBhZGRpbmcgc3RhcnR1cCBzZXF1ZW5jZSAqLworI2VuZGlmCisKKyAgLyogY2xlYW4gdXAgQklPUyByZXNldCB2ZWN0b3IgKi8KKyAgQ01PU19XUklURV9CWVRFIChDTU9TX1JFU0VUX0NPREUsIDApOworICAqKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSBiaW9zX3Jlc2V0X3ZlY3RvcikgPSAwOworCisgIC8qCisgICAqICBHZW5lcmljIENQVSBzdGFydHVwIHNlcXVlbmNlIGVuZHMgaGVyZS4KKyAgICovCisKKyAgS0VSTkVMX1BSSU5UICgoIlxuIikpOworCisgIHJldHVybiAxOworCisgIC8qIFhYWFhYIGFkZCBPUy1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBoZXJlISAqLworfQorCisKKy8qCisgKiAgcmVhZCBiaW9zIHN0dWZmIGFuZCBmaWxsIHRhYmxlcworICovCisKK3N0YXRpYyB2b2lkCithZGRfcHJvY2Vzc29yIChpbXBzX3Byb2Nlc3NvciAqIHByb2MpCit7CisgIGludCBhcGljaWQgPSBwcm9jLT5hcGljX2lkOworCisgIEtFUk5FTF9QUklOVCAoKCIgIFByb2Nlc3NvciBbQVBJQyBpZCAlZCB2ZXIgJWRdOiAgIiwKKwkJIGFwaWNpZCwgcHJvYy0+YXBpY192ZXIpKTsKKyAgaWYgKCEocHJvYy0+ZmxhZ3MgJiBJTVBTX0ZMQUdfRU5BQkxFRCkpCisgICAgeworICAgICAgS0VSTkVMX1BSSU5UICgoIkRJU0FCTEVEXG4iKSk7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAocHJvYy0+YXBpY192ZXIgPiAweEYpCisgICAgeworICAgICAgaW1wc19hbnlfbmV3X2FwaWNzID0gMTsKKyAgICB9CisgIGlmIChwcm9jLT5mbGFncyAmIChJTVBTX0NQVUZMQUdfQk9PVCkpCisgICAgeworICAgICAgS0VSTkVMX1BSSU5UICgoIiMwICBCb290c3RyYXAgUHJvY2Vzc29yIChCU1ApXG4iKSk7CisgICAgICByZXR1cm47CisgICAgfQorICBpbXBzX2NwdV9hcGljX21hcFtpbXBzX251bV9jcHVzXSA9IGFwaWNpZDsKKyAgaW1wc19hcGljX2NwdV9tYXBbYXBpY2lkXSA9IGltcHNfbnVtX2NwdXM7CisgIGlmIChib290X2NwdSAocHJvYykpCisgICAgeworCisgICAgICAvKiAgWFhYWFggIGFkZCBPUy1zcGVjaWZpYyBzZXR1cCBmb3Igc2Vjb25kYXJ5IENQVXMgaGVyZSAqLworCisgICAgICBpbXBzX251bV9jcHVzKys7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCithZGRfYnVzIChpbXBzX2J1cyAqIGJ1cykKK3sKKyAgY2hhciBzdHJbOF07CisKKyAgbWVtbW92ZSAoc3RyLCBidXMtPmJ1c190eXBlLCA2KTsKKyAgc3RyWzZdID0gMDsKKyAgS0VSTkVMX1BSSU5UICgoIiAgQnVzIGlkICVkIGlzICVzXG4iLCBidXMtPmlkLCBzdHIpKTsKKworICAvKiAgWFhYWFggIGFkZCBPUy1zcGVjaWZpYyBjb2RlIGhlcmUgKi8KK30KKworCitzdGF0aWMgdm9pZAorYWRkX2lvYXBpYyAoaW1wc19pb2FwaWMgKiBpb2FwaWMpCit7CisgIEtFUk5FTF9QUklOVCAoKCIgIEkvTyBBUElDIGlkICVkIHZlciAlZCwgYWRkcmVzczogMHgleCAgIiwKKwkJIGlvYXBpYy0+aWQsIGlvYXBpYy0+dmVyLCBpb2FwaWMtPmFkZHIpKTsKKyAgaWYgKCEoaW9hcGljLT5mbGFncyAmIElNUFNfRkxBR19FTkFCTEVEKSkKKyAgICB7CisgICAgICBLRVJORUxfUFJJTlQgKCgiRElTQUJMRURcbiIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIEtFUk5FTF9QUklOVCAoKCJcbiIpKTsKKworICAvKiAgWFhYWFggIGFkZCBPUy1zcGVjaWZpYyBjb2RlIGhlcmUgKi8KK30KKworCitzdGF0aWMgdm9pZAoraW1wc19yZWFkX2NvbmZpZ190YWJsZSAodW5zaWduZWQgc3RhcnQsIGludCBjb3VudCkKK3sKKyAgd2hpbGUgKGNvdW50LS0gPiAwKQorICAgIHsKKyAgICAgIHN3aXRjaCAoKigodW5zaWduZWQgY2hhciAqKSBzdGFydCkpCisJeworCWNhc2UgSU1QU19CQ1RfUFJPQ0VTU09SOgorCSAgYWRkX3Byb2Nlc3NvciAoKGltcHNfcHJvY2Vzc29yICopIHN0YXJ0KTsKKwkgIHN0YXJ0ICs9IDEyOwkJLyogMjAgdG90YWwgKi8KKwkgIGJyZWFrOworCWNhc2UgSU1QU19CQ1RfQlVTOgorCSAgYWRkX2J1cyAoKGltcHNfYnVzICopIHN0YXJ0KTsKKwkgIGJyZWFrOworCWNhc2UgSU1QU19CQ1RfSU9BUElDOgorCSAgYWRkX2lvYXBpYyAoKGltcHNfaW9hcGljICopIHN0YXJ0KTsKKwkgIGJyZWFrOworI2lmIDAJCQkJLyogIFhYWFhYICB1bmNvbW1lbnQgdGhpcyBpZiAiYWRkX2lvX2ludGVycnVwdCIgaXMgaW1wbGVtZW50ZWQgKi8KKwljYXNlIElNUFNfQkNUX0lPX0lOVEVSUlVQVDoKKwkgIGFkZF9pb19pbnRlcnJ1cHQgKChpbXBzX2ludGVycnVwdCAqKSBzdGFydCk7CisJICBicmVhazsKKyNlbmRpZgorI2lmIDAJCQkJLyogIFhYWFhYICB1bmNvbW1lbnQgdGhpcyBpZiAiYWRkX2xvY2FsX2ludGVycnVwdCIgaXMgaW1wbGVtZW50ZWQgKi8KKwljYXNlIElNUFNfQkNUX0xPQ0FMX0lOVEVSUlVQVDoKKwkgIGFkZF9sb2NhbF9pbnRlcnVwdCAoKGltcHNfaW50ZXJydXB0ICopIHN0YXJ0KTsKKwkgIGJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkgIGJyZWFrOworCX0KKyAgICAgIHN0YXJ0ICs9IDg7CisgICAgfQorfQorCisKK3N0YXRpYyBpbnQKK2ltcHNfYmFkX2Jpb3MgKGltcHNfZnBzICogZnBzX3B0cikKK3sKKyAgaW50IHN1bTsKKyAgaW1wc19jdGggKmxvY2FsX2N0aF9wdHIKKyAgPSAoaW1wc19jdGggKikgUEhZU19UT19WSVJUVUFMIChmcHNfcHRyLT5jdGhfcHRyKTsKKworICBpZiAoZnBzX3B0ci0+ZmVhdHVyZV9pbmZvWzBdID4gSU1QU19GUFNfREVGQVVMVF9NQVgpCisgICAgeworICAgICAgS0VSTkVMX1BSSU5UICgoIiAgICBJbnZhbGlkIE1QIFN5c3RlbSBDb25maWd1cmF0aW9uIHR5cGUgJWRcbiIsCisJCSAgICAgZnBzX3B0ci0+ZmVhdHVyZV9pbmZvWzBdKSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgaWYgKGZwc19wdHItPmN0aF9wdHIpCisgICAgeworICAgICAgc3VtID0gZ2V0X2NoZWNrc3VtICgodW5zaWduZWQpIGxvY2FsX2N0aF9wdHIsCisJCQkgIGxvY2FsX2N0aF9wdHItPmJhc2VfbGVuZ3RoKTsKKyAgICAgIGlmIChsb2NhbF9jdGhfcHRyLT5zaWcgIT0gSU1QU19DVEhfU0lHTkFUVVJFIHx8IHN1bSkKKwl7CisJICBLRVJORUxfUFJJTlQKKwkJCSgoIiAgICBCYWQgTVAgQ29uZmlnIFRhYmxlIHNpZyAweCV4IGFuZC9vciBjaGVja3N1bSAweCV4XG4iLAorCQkJKHVuc2lnbmVkKSAoZnBzX3B0ci0+Y3RoX3B0ciksIHN1bSkpOworCSAgcmV0dXJuIDE7CisJfQorICAgICAgaWYgKGxvY2FsX2N0aF9wdHItPnNwZWNfcmV2ICE9IGZwc19wdHItPnNwZWNfcmV2KQorCXsKKwkgIEtFUk5FTF9QUklOVCAoKCIgICAgQmFkIE1QIENvbmZpZyBUYWJsZSBzdWItcmV2aXNpb24gIyAlZFxuIiwgbG9jYWxfY3RoX3B0ci0+c3BlY19yZXYpKTsKKwkgIHJldHVybiAxOworCX0KKyAgICAgIGlmIChsb2NhbF9jdGhfcHRyLT5leHRlbmRlZF9sZW5ndGgpCisJeworCSAgc3VtID0gKGdldF9jaGVja3N1bSAoKCh1bnNpZ25lZCkgbG9jYWxfY3RoX3B0cikKKwkJCSAgICAgICArIGxvY2FsX2N0aF9wdHItPmJhc2VfbGVuZ3RoLAorCQkJICAgICAgIGxvY2FsX2N0aF9wdHItPmV4dGVuZGVkX2xlbmd0aCkKKwkJICsgbG9jYWxfY3RoX3B0ci0+ZXh0ZW5kZWRfY2hlY2tzdW0pICYgMHhGRjsKKwkgIGlmIChzdW0pCisJICAgIHsKKwkgICAgICBLRVJORUxfUFJJTlQKKwkJCSAgICAoKCIgICAgQmFkIEV4dGVuZGVkIE1QIENvbmZpZyBUYWJsZSBjaGVja3N1bSAweCV4XG4iLCBzdW0pKTsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UgaWYgKCFmcHNfcHRyLT5mZWF0dXJlX2luZm9bMF0pCisgICAgeworICAgICAgS0VSTkVMX1BSSU5UICgoIiAgICBNaXNzaW5nIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb25cbiIpKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZAoraW1wc19yZWFkX2Jpb3MgKGltcHNfZnBzICogZnBzX3B0cikKK3sKKyAgaW50IGFwaWNpZDsKKyAgdW5zaWduZWQgY3RoX3N0YXJ0LCBjdGhfY291bnQ7CisgIGltcHNfY3RoICpsb2NhbF9jdGhfcHRyCisgID0gKGltcHNfY3RoICopIFBIWVNfVE9fVklSVFVBTCAoZnBzX3B0ci0+Y3RoX3B0cik7CisgIGNoYXIgKnN0cl9wdHI7CisKKyAgS0VSTkVMX1BSSU5UICgoIkludGVsIE11bHRpUHJvY2Vzc29yIFNwZWMgMS4lZCBCSU9TIHN1cHBvcnQgZGV0ZWN0ZWRcbiIsCisJCSBmcHNfcHRyLT5zcGVjX3JldikpOworCisgIC8qCisgICAqICBEbyBhbGwgY2hlY2tpbmcgb2YgZXJyb3JzIHdoaWNoIHdvdWxkIGRlZmluaXRlbHkKKyAgICogIGxlYWQgdG8gZmFpbHVyZSBvZiB0aGUgU01QIGJvb3QgaGVyZS4KKyAgICovCisKKyAgaWYgKGltcHNfYmFkX2Jpb3MgKGZwc19wdHIpKQorICAgIHsKKyAgICAgIEtFUk5FTF9QUklOVCAoKCIgICAgRGlzYWJsaW5nIE1QUyBzdXBwb3J0XG4iKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChmcHNfcHRyLT5mZWF0dXJlX2luZm9bMV0gJiBJTVBTX0ZQU19JTUNSUF9CSVQpCisgICAgeworICAgICAgc3RyX3B0ciA9ICJJTUNSIGFuZCBQSUMiOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN0cl9wdHIgPSAiVmlydHVhbCBXaXJlIjsKKyAgICB9CisgIGlmIChmcHNfcHRyLT5jdGhfcHRyKQorICAgIHsKKyAgICAgIGltcHNfbGFwaWNfYWRkciA9IGxvY2FsX2N0aF9wdHItPmxhcGljX2FkZHI7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW1wc19sYXBpY19hZGRyID0gTEFQSUNfQUREUl9ERUZBVUxUOworICAgIH0KKyAgS0VSTkVMX1BSSU5UCisJCSgoIiAgICBBUElDIGNvbmZpZzogXCIlcyBtb2RlXCIgICAgTG9jYWwgQVBJQyBhZGRyZXNzOiAweCV4XG4iLAorCQkgc3RyX3B0ciwgaW1wc19sYXBpY19hZGRyKSk7CisgIGltcHNfbGFwaWNfYWRkciA9IFBIWVNfVE9fVklSVFVBTCAoaW1wc19sYXBpY19hZGRyKTsKKworICAvKgorICAgKiAgU2V0dXAgcHJpbWFyeSBDUFUuCisgICAqLworICBhcGljaWQgPSBJTVBTX0xBUElDX1JFQUQgKExBUElDX1NQSVYpOworICBJTVBTX0xBUElDX1dSSVRFIChMQVBJQ19TUElWLCBhcGljaWQgfCBMQVBJQ19TUElWX0VOQUJMRV9BUElDKTsKKyAgaW1wc19hbnlfbmV3X2FwaWNzID0gSU1QU19MQVBJQ19SRUFEIChMQVBJQ19WRVIpICYgMHhGMDsKKyAgYXBpY2lkID0gSU1QU19BUElDX0lEIChJTVBTX0xBUElDX1JFQUQgKExBUElDX0lEKSk7CisgIGltcHNfY3B1X2FwaWNfbWFwWzBdID0gYXBpY2lkOworICBpbXBzX2FwaWNfY3B1X21hcFthcGljaWRdID0gMDsKKworICBpZiAoZnBzX3B0ci0+Y3RoX3B0cikKKyAgICB7CisgICAgICBjaGFyIHN0cjFbMTZdLCBzdHIyWzE2XTsKKyAgICAgIG1lbWNweSAoc3RyMSwgbG9jYWxfY3RoX3B0ci0+b2VtX2lkLCA4KTsKKyAgICAgIHN0cjFbOF0gPSAwOworICAgICAgbWVtY3B5IChzdHIyLCBsb2NhbF9jdGhfcHRyLT5wcm9kX2lkLCAxMik7CisgICAgICBzdHIyWzEyXSA9IDA7CisgICAgICBLRVJORUxfUFJJTlQgKCgiICBPRU0gaWQ6ICVzICBQcm9kdWN0IGlkOiAlc1xuIiwgc3RyMSwgc3RyMikpOworICAgICAgY3RoX3N0YXJ0ID0gKCh1bnNpZ25lZCkgbG9jYWxfY3RoX3B0cikgKyBzaXplb2YgKGltcHNfY3RoKTsKKyAgICAgIGN0aF9jb3VudCA9IGxvY2FsX2N0aF9wdHItPmVudHJ5X2NvdW50OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICooKHZvbGF0aWxlIHVuc2lnbmVkICopIElPQVBJQ19BRERSX0RFRkFVTFQpID0gSU9BUElDX0lEOworICAgICAgZGVmY29uZmlnLmlvYXBpYy5pZAorCT0gSU1QU19BUElDX0lEICgqKCh2b2xhdGlsZSB1bnNpZ25lZCAqKQorCQkJICAoSU9BUElDX0FERFJfREVGQVVMVCArIElPQVBJQ19SVykpKTsKKyAgICAgICooKHZvbGF0aWxlIHVuc2lnbmVkICopIElPQVBJQ19BRERSX0RFRkFVTFQpID0gSU9BUElDX1ZFUjsKKyAgICAgIGRlZmNvbmZpZy5pb2FwaWMudmVyCisJPSBBUElDX1ZFUlNJT04gKCooKHZvbGF0aWxlIHVuc2lnbmVkICopCisJCQkgIChJT0FQSUNfQUREUl9ERUZBVUxUICsgSU9BUElDX1JXKSkpOworICAgICAgZGVmY29uZmlnLnByb2NbYXBpY2lkXS5mbGFncworCT0gSU1QU19GTEFHX0VOQUJMRUQgfCBJTVBTX0NQVUZMQUdfQk9PVDsKKyAgICAgIGRlZmNvbmZpZy5wcm9jWyFhcGljaWRdLmZsYWdzID0gSU1QU19GTEFHX0VOQUJMRUQ7CisgICAgICBpbXBzX251bV9jcHVzID0gMjsKKyAgICAgIGlmIChmcHNfcHRyLT5mZWF0dXJlX2luZm9bMF0gPT0gMQorCSAgfHwgZnBzX3B0ci0+ZmVhdHVyZV9pbmZvWzBdID09IDUpCisJeworCSAgbWVtY3B5IChkZWZjb25maWcuYnVzWzBdLmJ1c190eXBlLCAiSVNBICAgIiwgNik7CisJfQorICAgICAgaWYgKGZwc19wdHItPmZlYXR1cmVfaW5mb1swXSA9PSA0CisJICB8fCBmcHNfcHRyLT5mZWF0dXJlX2luZm9bMF0gPT0gNykKKwl7CisJICBtZW1jcHkgKGRlZmNvbmZpZy5idXNbMF0uYnVzX3R5cGUsICJNQ0EgICAiLCA2KTsKKwl9CisgICAgICBpZiAoZnBzX3B0ci0+ZmVhdHVyZV9pbmZvWzBdID4gNCkKKwl7CisJICBkZWZjb25maWcucHJvY1swXS5hcGljX3ZlciA9IDB4MTA7CisJICBkZWZjb25maWcucHJvY1sxXS5hcGljX3ZlciA9IDB4MTA7CisJICBkZWZjb25maWcuYnVzWzFdLnR5cGUgPSBJTVBTX0JDVF9CVVM7CisJfQorICAgICAgaWYgKGZwc19wdHItPmZlYXR1cmVfaW5mb1swXSA9PSAyKQorCXsKKwkgIGRlZmNvbmZpZy5pbnRpblsyXS50eXBlID0gMjU1OworCSAgZGVmY29uZmlnLmludGluWzEzXS50eXBlID0gMjU1OworCX0KKyAgICAgIGlmIChmcHNfcHRyLT5mZWF0dXJlX2luZm9bMF0gPT0gNykKKwl7CisJICBkZWZjb25maWcuaW50aW5bMF0udHlwZSA9IDI1NTsKKwl9CisgICAgICBjdGhfc3RhcnQgPSAodW5zaWduZWQpICZkZWZjb25maWc7CisgICAgICBjdGhfY291bnQgPSBERUZfRU5UUklFUzsKKyAgICB9CisgIGltcHNfcmVhZF9jb25maWdfdGFibGUgKGN0aF9zdGFydCwgY3RoX2NvdW50KTsKKworICAvKiAlJSUlJSBFU0IgcmVhZCBleHRlbmRlZCBlbnRyaWVzIGhlcmUgKi8KKworICBpbXBzX2VuYWJsZWQgPSAxOworfQorCisKKy8qCisgKiAgR2l2ZW4gYSByZWdpb24gdG8gY2hlY2ssIHRoaXMgYWN0dWFsbHkgbG9va3MgZm9yIHRoZSAiTVAgRmxvYXRpbmcKKyAqICBQb2ludGVyIFN0cnVjdHVyZSIuICBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyBpZiB0aGUgY29ycmVjdAorICogIHNpZ25hdHVyZSBhbmQgY2hlY2tzdW0gZm9yIGEgZmxvYXRpbmcgcG9pbnRlciBzdHJ1Y3R1cmUgb2YgdGhlCisgKiAgYXBwcm9wcmlhdGUgc3BlYyByZXZpc2lvbiB3YXMgZm91bmQuICBJZiBzbywgdGhlbiBkbyBub3Qgc2VhcmNoCisgKiAgZnVydGhlci4KKyAqCisgKiAgTk9URTogIFRoZSBtZW1vcnkgc2NhbiB3aWxsIGFsd2F5cyBiZSBpbiB0aGUgYm90dG9tIDEgTUIuCisgKgorICogIFRoaXMgZnVuY3Rpb24gcHJlc3VtZXMgdGhhdCAic3RhcnQiIHdpbGwgYWx3YXlzIGJlIGFsaWduZWQgdG8gYSAxNi1iaXQKKyAqICBib3VuZGFyeS4KKyAqCisgKiAgRnVuY3Rpb24gZmluaXNoZWQuCisgKi8KKworc3RhdGljIGludAoraW1wc19zY2FuICh1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgbGVuZ3RoKQoreworICBJTVBTX0RFQlVHX1BSSU5UICgoIlNjYW5uaW5nIGZyb20gMHgleCBmb3IgJWQgYnl0ZXNcbiIsCisJCSAgICAgc3RhcnQsIGxlbmd0aCkpOworCisgIHdoaWxlIChsZW5ndGggPiAwKQorICAgIHsKKyAgICAgIGltcHNfZnBzICpmcHNfcHRyID0gKGltcHNfZnBzICopIFBIWVNfVE9fVklSVFVBTCAoc3RhcnQpOworCisgICAgICBpZiAoZnBzX3B0ci0+c2lnID09IElNUFNfRlBTX1NJR05BVFVSRQorCSAgJiYgZnBzX3B0ci0+bGVuZ3RoID09IDEKKwkgICYmIChmcHNfcHRyLT5zcGVjX3JldiA9PSAxIHx8IGZwc19wdHItPnNwZWNfcmV2ID09IDQpCisJICAmJiAhZ2V0X2NoZWNrc3VtIChzdGFydCwgMTYpKQorCXsKKwkgIElNUFNfREVCVUdfUFJJTlQgKCgiRm91bmQgTVAgRmxvYXRpbmcgU3RydWN0dXJlIFBvaW50ZXIgYXQgJXhcbiIsIHN0YXJ0KSk7CisJICBpbXBzX3JlYWRfYmlvcyAoZnBzX3B0cik7CisJICByZXR1cm4gMTsKKwl9CisKKyAgICAgIGxlbmd0aCAtPSAxNjsKKyAgICAgIHN0YXJ0ICs9IDE2OworICAgIH0KKworICByZXR1cm4gMDsKK30KKworCisvKgorICogIFRoaXMgaXMgdGhlIHByaW1hcnkgZnVuY3Rpb24gZm9yIHByb2JpbmcgZm9yIE1QUyBjb21wYXRpYmxlIGhhcmR3YXJlCisgKiAgYW5kIEJJT1MgaW5mb3JtYXRpb24uICBDYWxsIHRoaXMgZHVyaW5nIHRoZSBlYXJseSBzdGFnZXMgb2YgT1Mgc3RhcnR1cCwKKyAqICBiZWZvcmUgbWVtb3J5IGNhbiBiZSBtZXNzZWQgdXAuCisgKgorICogIFRoZSBwcm9iZSBsb29rcyBmb3IgdGhlICJNUCBGbG9hdGluZyBQb2ludGVyIFN0cnVjdHVyZSIgYXQgbG9jYXRpb25zCisgKiAgbGlzdGVkIGF0IHRoZSB0b3Agb2YgcGFnZSA0LTIgb2YgdGhlIHNwZWMuCisgKgorICogIEVudmlyb25tZW50IHJlcXVpcmVtZW50cyBmcm9tIHRoZSBPUyB0byBydW46CisgKgorICogICAoMSkgOiBBIG5vbi1saW5lYXIgdmlydHVhbCB0byBwaHlzaWNhbCBtZW1vcnkgbWFwcGluZyBpcyBwcm9iYWJseSBPSywKKyAqCSAgICAgYXMgKEkgdGhpbmspIHRoZSBzdHJ1Y3R1cmVzIGFsbCBmYWxsIHdpdGhpbiBwYWdlIGJvdW5kYXJpZXMsCisgKgkgICAgIGJ1dCBhIGxpbmVhciBtYXBwaW5nIGlzIHJlY29tbWVuZGVkLiAgQ3VycmVudGx5IGFzc3VtZXMgdGhhdAorICoJICAgICB0aGUgbWFwcGluZyB3aWxsIHJlbWFpbiBpZGVudGljYWwgb3ZlciB0aW1lICh3aGljaCBzaG91bGQgYmUKKyAqCSAgICAgT0sgc2luY2UgaXQgb25seSBhY2Nlc3NlcyBtZW1vcnkgd2hpY2ggc2hvdWxkbid0IGJlIG11bmdlZAorICoJICAgICBieSB0aGUgT1MgYW55d2F5KS4KKyAqICAgKDIpIDogVGhlIE9TIG9ubHkgY29uc3VtZXMgbWVtb3J5IHdoaWNoIHRoZSBCSU9TIHNheXMgaXMgT0sgdG8gdXNlLAorICoJICAgICBhbmQgbm90IGFueSBvZiB0aGUgQklPUyBzdGFuZGFyZCBhcmVhcyAodGhlIGFyZWFzIDB4NDAwIHRvCisgKgkgICAgIDB4NjAwLCB0aGUgRUJEQSwgMHhFMDAwMCB0byAweEZGRkZGLCBhbmQgdW5yZXBvcnRlZCBwaHlzaWNhbAorICoJICAgICBSQU0pLiAgU29tZXRpbWVzIGEgc21hbGwgYW1vdW50IG9mIHBoeXNpY2FsIFJBTSBpcyBub3QKKyAqCSAgICAgcmVwb3J0ZWQgYnkgdGhlIEJJT1MsIHRvIGJlIHVzZWQgdG8gc3RvcmUgTVBTIGFuZCBvdGhlcgorICoJICAgICBpbmZvcm1hdGlvbi4KKyAqICAgKDMpIDogSXQgbXVzdCBiZSBwb3NzaWJsZSB0byByZWFkIHRoZSBDTU9TLgorICogICAoNCkgOiBUaGVyZSBtdXN0IGJlIGJldHdlZW4gNTEySyBhbmQgNjQwSyBvZiBsb3dlciBtZW1vcnkgKHRoaXMgaXMgYQorICoJICAgICBzYW5pdHkgY2hlY2spLgorICoKKyAqICBGdW5jdGlvbiBmaW5pc2hlZC4KKyAqLworCitpbnQKK2ltcHNfcHJvYmUgKHZvaWQpCit7CisgIC8qCisgICAqICBEZXRlcm1pbmUgcG9zc2libGUgYWRkcmVzcyBvZiB0aGUgRUJEQQorICAgKi8KKyAgdW5zaWduZWQgZWJkYV9hZGRyID0gKigodW5zaWduZWQgc2hvcnQgKikKKwkJCSBQSFlTX1RPX1ZJUlRVQUwgKEVCREFfU0VHX0FERFIpKSA8PCA0OworCisgIC8qCisgICAqICBEZXRlcm1pbmUgYW1vdW50IG9mIGluc3RhbGxlZCBsb3dlciBtZW1vcnkgKG5vdCAqYXZhaWxhYmxlKgorICAgKiAgbG93ZXIgbWVtb3J5KS4KKyAgICoKKyAgICogIE5PVEU6ICBUaGlzIHNob3VsZCB3b3JrIHJlbGlhYmx5IGFzIGxvbmcgYXMgd2UgdmVyaWZ5IHRoZQorICAgKiAgICAgICAgIG1hY2hpbmUgaXMgYXQgbGVhc3QgYSBzeXN0ZW0gdGhhdCBjb3VsZCBwb3NzaWJseSBoYXZlCisgICAqICAgICAgICAgTVBTIGNvbXBhdGliaWxpdHkgdG8gYmVnaW4gd2l0aC4KKyAgICovCisgIHVuc2lnbmVkIG1lbV9sb3dlciA9ICgoQ01PU19SRUFEX0JZVEUgKENNT1NfQkFTRV9NRU1PUlkgKyAxKSA8PCA4KQorCQkJfCBDTU9TX1JFQURfQllURSAoQ01PU19CQVNFX01FTU9SWSkpIDw8IDEwOworCisjaWZkZWYgSU1QU19ERUJVRworICBpbXBzX2VuYWJsZWQgPSAwOworICBpbXBzX251bV9jcHVzID0gMTsKKyNlbmRpZgorCisgIC8qCisgICAqICBTYW5pdHkgY2hlY2sgOiBpZiB0aGlzIGlzbid0IHJlYXNvbmFibGUsIGl0IGlzIGFsbW9zdCBpbXBvc3NpYmx5CisgICAqICAgIHVubGlrZWx5IHRvIGJlIGFuIE1QUyBjb21wYXRpYmxlIG1hY2hpbmUsIHNvIHJldHVybiBmYWlsdXJlLgorICAgKi8KKyAgaWYgKG1lbV9sb3dlciA8IDUxMiAqIDEwMjQgfHwgbWVtX2xvd2VyID4gNjQwICogMTAyNCkKKyAgICB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKGViZGFfYWRkciA+IG1lbV9sb3dlciAtIDEwMjQKKyAgICAgIHx8IGViZGFfYWRkciArICooKHVuc2lnbmVkIGNoYXIgKikgUEhZU19UT19WSVJUVUFMIChlYmRhX2FkZHIpKQorICAgICAgKiAxMDI0ID4gbWVtX2xvd2VyKQorICAgIHsKKyAgICAgIGViZGFfYWRkciA9IDA7CisgICAgfQorCisgIGlmICgoKGViZGFfYWRkciAmJiBpbXBzX3NjYW4gKGViZGFfYWRkciwgMTAyNCkpCisgICAgICAgfHwgKCFlYmRhX2FkZHIgJiYgaW1wc19zY2FuIChtZW1fbG93ZXIgLSAxMDI0LCAxMDI0KSkKKyAgICAgICB8fCBpbXBzX3NjYW4gKDB4RjAwMDAsIDB4MTAwMDApKSAmJiBpbXBzX2VuYWJsZWQpCisgICAgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIC8qCisgICAqICBJZiBubyBCSU9TIGluZm8gb24gTVBTIGhhcmR3YXJlIGlzIGZvdW5kLCB0aGVuIHJldHVybiBmYWlsdXJlLgorICAgKi8KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3N0YWdlMi9zbXAtaW1wcy5oIGIvc3RhZ2UyL3NtcC1pbXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmZGNlMwotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMi9zbXAtaW1wcy5oCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogIDxJbnNlcnQgY29weXJpZ2h0IGhlcmUgOiBpdCBtdXN0IGJlIEJTRC1saWtlIHNvIGV2ZXJ5b25lIGNhbiB1c2UgaXQ+CisgKgorICogIEF1dGhvcjogIEVyaWNoIEJvbGV5biAgPGVyaWNoQHVydWsub3JnPiAgIGh0dHA6Ly93d3cudXJ1ay5vcmcvfmVyaWNoLworICoKKyAqICBIZWFkZXIgZmlsZSBpbXBsZW1lbnRpbmcgSW50ZWwgTXVsdGlQcm9jZXNzb3IgU3BlY2lmaWNhdGlvbiAoTVBTKQorICogIHZlcnNpb24gMS4xIGFuZCAxLjQgU01QIGhhcmR3YXJlIGNvbnRyb2wgZm9yIEludGVsIEFyY2hpdGVjdHVyZSBDUFVzLAorICogIHdpdGggaG9va3MgZm9yIHJ1bm5pbmcgY29ycmVjdGx5IG9uIGEgc3RhbmRhcmQgUEMgd2l0aG91dCB0aGUgaGFyZHdhcmUuCisgKgorICogIFRoaXMgZmlsZSB3YXMgY3JlYXRlZCBmcm9tIGluZm9ybWF0aW9uIGluIHRoZSBJbnRlbCBNUFMgdmVyc2lvbiAxLjQKKyAqICBkb2N1bWVudCwgb3JkZXIgbnVtYmVyIDI0MjAxNi0wMDQsIHdoaWNoIGNhbiBiZSBvcmRlcmVkIGZyb20gdGhlCisgKiAgSW50ZWwgbGl0ZXJhdHVyZSBjZW50ZXIuCisgKi8KKworI2lmbmRlZiBfU01QX0lNUFNfSAorI2RlZmluZSBfU01QX0lNUFNfSAorCisvKiBtYWtlIHN1cmUgImFwaWMuaCIgaXMgaW5jbHVkZWQgKi8KKyNpZm5kZWYgX0FQSUNfSAorI2Vycm9yCQlNdXN0IGluY2x1ZGUgImFwaWMuaCIgYmVmb3JlICJzbXAtaW1wcy5oIgorI2VuZGlmIC8qICFfQVBJQ19IICovCisKKy8qCisgKiAgRGVmaW5lcyB1c2VkLgorICovCisKKyNpZmRlZiBJTVBTX0RFQlVHCisjZGVmaW5lIElNUFNfREVCVUdfUFJJTlQoeCkgIEtFUk5FTF9QUklOVCh4KQorI2Vsc2UgLyogIUlNUFNfREVCVUcgKi8KKyNkZWZpbmUgSU1QU19ERUJVR19QUklOVCh4KQorI2VuZGlmIC8qICFJTVBTX0RFQlVHICovCisKKyNkZWZpbmUgSU1QU19NQVhfQ1BVUwkJCUFQSUNfQlJPQURDQVNUX0lECisKKy8qCisgKiAgRGVmaW5lcyByZXByZXNlbnRpbmcgbGltaXRhdGlvbnMgb24gdmFsdWVzIHVzYWJsZSBpbiBkaWZmZXJlbnQKKyAqICBzaXR1YXRpb25zLiAgVGhpcyBtb3N0bHkgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSBBUElDcyBhcmUgb2xkCisgKiAgKDgyNDg5RFgpIG9yIG5ldyAoU0lPIG9yIFBlbnRpdW0vUGVudGl1bSBQcm8gaW50ZWdyYXRlZCBBUElDcykuCisgKgorICogIE5PVEU6ICBJdCBhcHBlYXJzIHRoYXQgdGhlIEFQSUNzIG11c3QgZWl0aGVyIGJlIGFsbCBvbGQgb3IgYWxsIG5ldywKKyAqICAgIG9yIGJyb2FkY2FzdHMgd29uJ3Qgd29yayByaWdodC4KKyAqICBOT1RFICMyOiAgR2l2ZW4gdGhhdCwgdGhlIG1heGltdW0gSUQgd2hpY2ggY2FuIGJlIHNlbnQgdG8gcHJlZGljdGFibHkKKyAqICAgIGlzIDE0IGZvciBuZXcgQVBJQ3MgYW5kIDI1NCBmb3Igb2xkIEFQSUNzLiAgU28sIHRoaXMgYWxsIGltcGxpZXMgdGhhdAorICogICAgYSBtYXhpbXVtIG9mIDE1IHByb2Nlc3NvcnMgaXMgc3VwcG9ydGVkIHdpdGggdGhlIG5ldyBBUElDcywgYW5kIGEKKyAqICAgIG1heGltdW0gb2YgMjU1IHByb2Nlc3NvcnMgd2l0aCB0aGUgb2xkIEFQSUNzLgorICovCisKKyNkZWZpbmUgSU1QU19BUElDX0lEKHgpCQkJCQkJCVwKKyAgKCBpbXBzX2FueV9uZXdfYXBpY3MgPyBBUElDX05FV19JRCh4KSA6IEFQSUNfT0xEX0lEKHgpICkKKworLyoKKyAqICBUaGlzIGlzIHRoZSB2YWx1ZSB0aGF0IG11c3QgYmUgaW4gdGhlICJzaWciIG1lbWJlciBvZiB0aGUgTVAKKyAqICBGbG9hdGluZyBQb2ludGVyIFN0cnVjdHVyZS4KKyAqLworI2RlZmluZSBJTVBTX0ZQU19TSUdOQVRVUkUJKCdfJyB8ICgnTSc8PDgpIHwgKCdQJzw8MTYpIHwgKCdfJzw8MjQpKQorI2RlZmluZSBJTVBTX0ZQU19JTUNSUF9CSVQJMHg4MAorI2RlZmluZSBJTVBTX0ZQU19ERUZBVUxUX01BWAk3CisKKy8qCisgKiAgVGhpcyBpcyB0aGUgdmFsdWUgdGhhdCBtdXN0IGJlIGluIHRoZSAic2lnIiBtZW1iZXIgb2YgdGhlIE1QCisgKiAgQ29uZmlndXJhdGlvbiBUYWJsZSBIZWFkZXIuCisgKi8KKyNkZWZpbmUgSU1QU19DVEhfU0lHTkFUVVJFCSgnUCcgfCAoJ0MnPDw4KSB8ICgnTSc8PDE2KSB8ICgnUCc8PDI0KSkKKworLyoKKyAqICBUaGVzZSBhcmUgdGhlICJ0eXBlIiB2YWx1ZXMgZm9yIEJhc2UgTVAgQ29uZmlndXJhdGlvbiBUYWJsZSBlbnRyaWVzLgorICovCisjZGVmaW5lCQlJTVBTX0ZMQUdfRU5BQkxFRAkxCisjZGVmaW5lIElNUFNfQkNUX1BST0NFU1NPUgkJMAorI2RlZmluZQkJSU1QU19DUFVGTEFHX0JPT1QJMgorI2RlZmluZSBJTVBTX0JDVF9CVVMJCQkxCisjZGVmaW5lIElNUFNfQkNUX0lPQVBJQwkJCTIKKyNkZWZpbmUgSU1QU19CQ1RfSU9fSU5URVJSVVBUCQkzCisjZGVmaW5lIElNUFNfQkNUX0xPQ0FMX0lOVEVSUlVQVAk0CisjZGVmaW5lCQlJTVBTX0lOVF9JTlQJCTAKKyNkZWZpbmUJCUlNUFNfSU5UX05NSQkJMQorI2RlZmluZQkJSU1QU19JTlRfU01JCQkyCisjZGVmaW5lCQlJTVBTX0lOVF9FWFRJTlQJCTMKKworCisvKgorICogIFR5cGVkZWZzIGFuZCBkYXRhIGl0ZW0gZGVmaW5pdGlvbnMgZG9uZSBoZXJlLgorICovCisKK3R5cGVkZWYgc3RydWN0IGltcHNfZnBzIGltcHNfZnBzOwkvKiBNUCBmbG9hdGluZyBwb2ludGVyIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgaW1wc19jdGggaW1wc19jdGg7CS8qIE1QIGNvbmZpZ3VyYXRpb24gdGFibGUgaGVhZGVyICovCit0eXBlZGVmIHN0cnVjdCBpbXBzX3Byb2Nlc3NvciBpbXBzX3Byb2Nlc3NvcjsKK3R5cGVkZWYgc3RydWN0IGltcHNfYnVzIGltcHNfYnVzOwordHlwZWRlZiBzdHJ1Y3QgaW1wc19pb2FwaWMgaW1wc19pb2FwaWM7Cit0eXBlZGVmIHN0cnVjdCBpbXBzX2ludGVycnVwdCBpbXBzX2ludGVycnVwdDsKKworCisvKgorICogIERhdGEgc3RydWN0dXJlcyBkZWZpbmVkIGhlcmUKKyAqLworCisvKgorICogIE1QIEZsb2F0aW5nIFBvaW50ZXIgU3RydWN0dXJlIChmcHMpCisgKgorICogIExvb2sgYXQgcGFnZSA0LTMgb2YgdGhlIE1QIHNwZWMgZm9yIHRoZSBzdGFydGluZyBkZWZpbml0aW9ucyBvZgorICogIHRoaXMgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgaW1wc19mcHMKKyAgeworICAgIHVuc2lnbmVkIHNpZzsKKyAgICBpbXBzX2N0aCAqY3RoX3B0cjsKKyAgICB1bnNpZ25lZCBjaGFyIGxlbmd0aDsKKyAgICB1bnNpZ25lZCBjaGFyIHNwZWNfcmV2OworICAgIHVuc2lnbmVkIGNoYXIgY2hlY2tzdW07CisgICAgdW5zaWduZWQgY2hhciBmZWF0dXJlX2luZm9bNV07CisgIH07CisKKy8qCisgKiAgTVAgQ29uZmlndXJhdGlvbiBUYWJsZSBIZWFkZXIgIChjdGgpCisgKgorICogIExvb2sgYXQgcGFnZSA0LTUgb2YgdGhlIE1QIHNwZWMgZm9yIHRoZSBzdGFydGluZyBkZWZpbml0aW9ucyBvZgorICogIHRoaXMgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgaW1wc19jdGgKKyAgeworICAgIHVuc2lnbmVkIHNpZzsKKyAgICB1bnNpZ25lZCBzaG9ydCBiYXNlX2xlbmd0aDsKKyAgICB1bnNpZ25lZCBjaGFyIHNwZWNfcmV2OworICAgIHVuc2lnbmVkIGNoYXIgY2hlY2tzdW07CisgICAgY2hhciBvZW1faWRbOF07CisgICAgY2hhciBwcm9kX2lkWzEyXTsKKyAgICB1bnNpZ25lZCBvZW1fdGFibGVfcHRyOworICAgIHVuc2lnbmVkIHNob3J0IG9lbV90YWJsZV9zaXplOworICAgIHVuc2lnbmVkIHNob3J0IGVudHJ5X2NvdW50OworICAgIHVuc2lnbmVkIGxhcGljX2FkZHI7CisgICAgdW5zaWduZWQgc2hvcnQgZXh0ZW5kZWRfbGVuZ3RoOworICAgIHVuc2lnbmVkIGNoYXIgZXh0ZW5kZWRfY2hlY2tzdW07CisgICAgY2hhciByZXNlcnZlZFsxXTsKKyAgfTsKKworLyoKKyAqICBCYXNlIE1QIENvbmZpZ3VyYXRpb24gVGFibGUgVHlwZXMuICBUaGV5IGFyZSBzb3J0ZWQgYWNjb3JkaW5nIHRvCisgKiAgdHlwZSAoaS5lLiBhbGwgb2YgdHlwZSAwIGNvbWUgZmlyc3QsIGV0Yy4pLiAgTG9vayBvbiBwYWdlIDQtNiBmb3IKKyAqICB0aGUgc3RhcnQgb2YgdGhlIGRlc2NyaXB0aW9ucy4KKyAqLworCitzdHJ1Y3QgaW1wc19wcm9jZXNzb3IKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgdHlwZTsJCS8qIG11c3QgYmUgMCAqLworICAgIHVuc2lnbmVkIGNoYXIgYXBpY19pZDsKKyAgICB1bnNpZ25lZCBjaGFyIGFwaWNfdmVyOworICAgIHVuc2lnbmVkIGNoYXIgZmxhZ3M7CisgICAgdW5zaWduZWQgc2lnbmF0dXJlOworICAgIHVuc2lnbmVkIGZlYXR1cmVzOworICAgIGNoYXIgcmVzZXJ2ZWRbOF07CisgIH07CisKK3N0cnVjdCBpbXBzX2J1cworICB7CisgICAgdW5zaWduZWQgY2hhciB0eXBlOwkJLyogbXVzdCBiZSAxICovCisgICAgdW5zaWduZWQgY2hhciBpZDsKKyAgICBjaGFyIGJ1c190eXBlWzZdOworICB9OworCitzdHJ1Y3QgaW1wc19pb2FwaWMKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgdHlwZTsJCS8qIG11c3QgYmUgMiAqLworICAgIHVuc2lnbmVkIGNoYXIgaWQ7CisgICAgdW5zaWduZWQgY2hhciB2ZXI7CisgICAgdW5zaWduZWQgY2hhciBmbGFnczsKKyAgICB1bnNpZ25lZCBhZGRyOworICB9OworCitzdHJ1Y3QgaW1wc19pbnRlcnJ1cHQKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgdHlwZTsJCS8qIG11c3QgYmUgMyBvciA0ICovCisgICAgdW5zaWduZWQgY2hhciBpbnRfdHlwZTsKKyAgICB1bnNpZ25lZCBzaG9ydCBmbGFnczsKKyAgICB1bnNpZ25lZCBjaGFyIHNvdXJjZV9idXNfaWQ7CisgICAgdW5zaWduZWQgY2hhciBzb3VyY2VfYnVzX2lycTsKKyAgICB1bnNpZ25lZCBjaGFyIGRlc3RfYXBpY19pZDsKKyAgICB1bnNpZ25lZCBjaGFyIGRlc3RfYXBpY19pbnRpbjsKKyAgfTsKKworCisvKgorICogIEV4cG9ydGVkIGdsb2JhbHMgaGVyZS4KKyAqLworCisvKgorICogIFRoaXMgaXMgdGhlIHByaW1hcnkgZnVuY3Rpb24gZm9yIHByb2JpbmcgZm9yIEludGVsIE1QUyAxLjEvMS40CisgKiAgY29tcGF0aWJsZSBoYXJkd2FyZSBhbmQgQklPUyBpbmZvcm1hdGlvbi4gIFdoaWxlIHByb2JpbmcgdGhlIENQVXMKKyAqICBpbmZvcm1hdGlvbiByZXR1cm5lZCBmcm9tIHRoZSBCSU9TLCB0aGlzIGFsc28gc3RhcnRzIHVwIGVhY2ggQ1BVCisgKiAgYW5kIGdldHMgaXQgcmVhZHkgZm9yIHVzZS4KKyAqCisgKiAgQ2FsbCB0aGlzIGR1cmluZyB0aGUgZWFybHkgc3RhZ2VzIG9mIE9TIHN0YXJ0dXAsIGJlZm9yZSBtZW1vcnkgY2FuCisgKiAgYmUgbWVzc2VkIHVwLgorICoKKyAqICBSZXR1cm5zIDEgaWYgSU1QUyBpbmZvcm1hdGlvbiB3YXMgZm91bmQgYW5kIGlzIHZhbGlkLCBlbHNlIDAuCisgKi8KKworaW50IGltcHNfcHJvYmUgKHZvaWQpOworCisKKy8qCisgKiAgRGVmaW5lcyB0aGF0IHVzZSB2YXJpYWJsZXMKKyAqLworCisjZGVmaW5lIElNUFNfTEFQSUNfUkVBRCh4KSAgKCooKHZvbGF0aWxlIHVuc2lnbmVkICopIChpbXBzX2xhcGljX2FkZHIrKHgpKSkpCisjZGVmaW5lIElNUFNfTEFQSUNfV1JJVEUoeCwgeSkgICBcCisgICAoKigodm9sYXRpbGUgdW5zaWduZWQgKikgKGltcHNfbGFwaWNfYWRkcisoeCkpKSA9ICh5KSkKKworI2VuZGlmIC8qICFfU01QX0lNUFNfSCAqLwpkaWZmIC0tZ2l0IGEvc3RhZ2UyL3N0YWdlMV81LmMgYi9zdGFnZTIvc3RhZ2UxXzUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzQ1ZDRjCi0tLSAvZGV2L251bGwKKysrIGIvc3RhZ2UyL3N0YWdlMV81LmMKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLDIwMDIgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgInNoYXJlZC5oIgorCitzdGF0aWMgaW50IHNhdmVkX3NlY3RvciA9IC0xOworCitzdGF0aWMgdm9pZAorZGlza19yZWFkX3NhdmVzZWN0X2Z1bmMgKGludCBzZWN0b3IsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCit7CisgIHNhdmVkX3NlY3RvciA9IHNlY3RvcjsKK30KKwordm9pZAorY21haW4gKHZvaWQpCit7CisgIGdydWJfcHJpbnRmICgiXG5cbkdSVUIgbG9hZGluZywgcGxlYXNlIHdhaXQuLi5cbiIpOworCisgIC8qCisgICAqICBIZXJlIGxvYWQgdGhlIHRydWUgc2Vjb25kLXN0YWdlIGJvb3QtbG9hZGVyLgorICAgKi8KKworICBpZiAoZ3J1Yl9vcGVuIChjb25maWdfZmlsZSkpCisgICAgeworICAgICAgaW50IHJldDsKKworICAgICAgZGlza19yZWFkX2hvb2sgPSBkaXNrX3JlYWRfc2F2ZXNlY3RfZnVuYzsKKyAgICAgIGdydWJfcmVhZCAoKGNoYXIgKikgMHg4MDAwLCBTRUNUT1JfU0laRSAqIDIpOworICAgICAgZGlza19yZWFkX2hvb2sgPSBOVUxMOworCisgICAgICAvKiBTYW5pdHkgY2hlY2s6IGNhdGNoIGFuIGludGVybmFsIGVycm9yLiAgKi8KKyAgICAgIGlmIChzYXZlZF9zZWN0b3IgPT0gLTEpCisJeworCSAgZ3J1Yl9wcmludGYgKCJpbnRlcm5hbCBlcnJvcjogdGhlIHNlY29uZCBzZWN0b3Igb2YgU3RhZ2UgMiBpcyB1bmtub3duLiIpOworCSAgc3RvcCAoKTsKKwl9CisgICAgICAKKyAgICAgIHJldCA9IGdydWJfcmVhZCAoKGNoYXIgKikgMHg4MDAwICsgU0VDVE9SX1NJWkUgKiAyLCAtMSk7CisgICAgICAKKyAgICAgIGdydWJfY2xvc2UgKCk7CisKKyAgICAgIGlmIChyZXQpCisJY2hhaW5fc3RhZ2UyICgwLCAweDgyMDAsIHNhdmVkX3NlY3Rvcik7CisgICAgfQorCisgIC8qCisgICAqICBJZiBub3QsIHRoZW4gcHJpbnQgZXJyb3IgbWVzc2FnZSBhbmQgZGllLgorICAgKi8KKworICBwcmludF9lcnJvciAoKTsKKworICBzdG9wICgpOworfQpkaWZmIC0tZ2l0IGEvc3RhZ2UyL3N0YWdlMi5jIGIvc3RhZ2UyL3N0YWdlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYzQ1ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFnZTIvc3RhZ2UyLmMKQEAgLTAsMCArMSwxMDc1IEBACisvKgorICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSwyMDAyLDIwMDQsMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c2hhcmVkLmg+CisjaW5jbHVkZSA8dGVybS5oPgorCitncnViX2ptcF9idWYgcmVzdGFydF9lbnY7CisKKyNpZiBkZWZpbmVkKFBSRVNFVF9NRU5VX1NUUklORykgJiYgZGVmaW5lZChQUkVTRVRfTUVOVV9FWFRFUk5BTCkKKyNlcnJvciBEZWZpbmluZyBib3RoIFBSRVNFVF9NRU5VX1NUUklORyBhbmQgUFJFU0VUX01FTlVfRVhURVJOQUwgZG9lcyBub3QgXAorICAgICAgIG1ha2Ugc2Vuc2UuIFBsZWFzZSBvbmx5IGRlZmluZSBvbmUuCisjZW5kaWYKKworI2lmIGRlZmluZWQoUFJFU0VUX01FTlVfU1RSSU5HKSB8fCBkZWZpbmVkKFNVUFBPUlRfRElTS0xFU1MpIHx8IFwKKyAgICBkZWZpbmVkKFBSRVNFVF9NRU5VX0VYVEVSTkFMKQorCisjIGlmIGRlZmluZWQoUFJFU0VUX01FTlVfU1RSSU5HKQorc3RhdGljIGNvbnN0IGNoYXIgKnByZXNldF9tZW51ID0gUFJFU0VUX01FTlVfU1RSSU5HOworIyBlbGlmIGRlZmluZWQoUFJFU0VUX01FTlVfRVhURVJOQUwpCitleHRlcm4gY29uc3QgY2hhciAqcHJlc2V0X21lbnU7CisjIGVsaWYgZGVmaW5lZChTVVBQT1JUX0RJU0tMRVNTKQorLyogRXhlY3V0ZSB0aGUgY29tbWFuZCAiYm9vdHAiIGF1dG9tYXRpY2FsbHkuICAqLworc3RhdGljIGNvbnN0IGNoYXIgKnByZXNldF9tZW51ID0gImJvb3RwXG4iOworIyBlbmRpZiAvKiBTVVBQT1JUX0RJU0tMRVNTICovCisKK3N0YXRpYyBpbnQgcHJlc2V0X21lbnVfb2Zmc2V0OworCitzdGF0aWMgaW50CitvcGVuX3ByZXNldF9tZW51ICh2b2lkKQoreworI2lmZGVmIEdSVUJfVVRJTAorICAvKiBVbmxlc3MgdGhlIHVzZXIgZXhwbGljaXRseSByZXF1ZXN0cyB0byB1c2UgdGhlIHByZXNldCBtZW51LAorICAgICBhbHdheXMgb3BlbmluZyB0aGUgcHJlc2V0IG1lbnUgZmFpbHMgaW4gdGhlIGdydWIgc2hlbGwuICAqLworICBpZiAoISB1c2VfcHJlc2V0X21lbnUpCisgICAgcmV0dXJuIDA7CisjZW5kaWYgLyogR1JVQl9VVElMICovCisgIAorICBwcmVzZXRfbWVudV9vZmZzZXQgPSAwOworICByZXR1cm4gcHJlc2V0X21lbnUgIT0gMDsKK30KKworc3RhdGljIGludAorcmVhZF9mcm9tX3ByZXNldF9tZW51IChjaGFyICpidWYsIGludCBtYXhsZW4pCit7CisgIGludCBsZW4gPSBncnViX3N0cmxlbiAocHJlc2V0X21lbnUgKyBwcmVzZXRfbWVudV9vZmZzZXQpOworCisgIGlmIChsZW4gPiBtYXhsZW4pCisgICAgbGVuID0gbWF4bGVuOworCisgIGdydWJfbWVtbW92ZSAoYnVmLCBwcmVzZXRfbWVudSArIHByZXNldF9tZW51X29mZnNldCwgbGVuKTsKKyAgcHJlc2V0X21lbnVfb2Zmc2V0ICs9IGxlbjsKKworICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgdm9pZAorY2xvc2VfcHJlc2V0X21lbnUgKHZvaWQpCit7CisgIC8qIERpc2FibGUgdGhlIHByZXNldCBtZW51LiAgKi8KKyAgcHJlc2V0X21lbnUgPSAwOworfQorCisjZWxzZSAvKiAhIFBSRVNFVF9NRU5VX1NUUklORyAmJiAhIFNVUFBPUlRfRElTS0xFU1MgKi8KKworI2RlZmluZSBvcGVuX3ByZXNldF9tZW51KCkJMAorI2RlZmluZSByZWFkX2Zyb21fcHJlc2V0X21lbnUoYnVmLCBtYXhsZW4pCTAKKyNkZWZpbmUgY2xvc2VfcHJlc2V0X21lbnUoKQorCisjZW5kaWYgLyogISBQUkVTRVRfTUVOVV9TVFJJTkcgJiYgISBTVVBQT1JUX0RJU0tMRVNTICovCisKK3N0YXRpYyBjaGFyICoKK2dldF9lbnRyeSAoY2hhciAqbGlzdCwgaW50IG51bSwgaW50IG5lc3RlZCkKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorICAgIHsKKyAgICAgIGRvCisJeworCSAgd2hpbGUgKCoobGlzdCsrKSk7CisJfQorICAgICAgd2hpbGUgKG5lc3RlZCAmJiAqKGxpc3QrKykpOworICAgIH0KKworICByZXR1cm4gbGlzdDsKK30KKworLyogUHJpbnQgYW4gZW50cnkgaW4gYSBsaW5lIG9mIHRoZSBtZW51IGJveC4gICovCitzdGF0aWMgdm9pZAorcHJpbnRfZW50cnkgKGludCB5LCBpbnQgaGlnaGxpZ2h0LCBjaGFyICplbnRyeSkKK3sKKyAgaW50IHg7CisKKyAgaWYgKGN1cnJlbnRfdGVybS0+c2V0Y29sb3JzdGF0ZSkKKyAgICBjdXJyZW50X3Rlcm0tPnNldGNvbG9yc3RhdGUgKENPTE9SX1NUQVRFX05PUk1BTCk7CisgIAorICBpZiAoaGlnaGxpZ2h0ICYmIGN1cnJlbnRfdGVybS0+c2V0Y29sb3JzdGF0ZSkKKyAgICBjdXJyZW50X3Rlcm0tPnNldGNvbG9yc3RhdGUgKENPTE9SX1NUQVRFX0hJR0hMSUdIVCk7CisKKyAgZ290b3h5ICgyLCB5KTsKKyAgZ3J1Yl9wdXRjaGFyICgnICcpOworICBmb3IgKHggPSAzOyB4IDwgNzU7IHgrKykKKyAgICB7CisgICAgICBpZiAoKmVudHJ5ICYmIHggPD0gNzIpCisJeworCSAgaWYgKHggPT0gNzIpCisJICAgIGdydWJfcHV0Y2hhciAoRElTUF9SSUdIVCk7CisJICBlbHNlCisJICAgIGdydWJfcHV0Y2hhciAoKmVudHJ5KyspOworCX0KKyAgICAgIGVsc2UKKwlncnViX3B1dGNoYXIgKCcgJyk7CisgICAgfQorICBnb3RveHkgKDc0LCB5KTsKKworICBpZiAoY3VycmVudF90ZXJtLT5zZXRjb2xvcnN0YXRlKQorICAgIGN1cnJlbnRfdGVybS0+c2V0Y29sb3JzdGF0ZSAoQ09MT1JfU1RBVEVfU1RBTkRBUkQpOworfQorCisvKiBQcmludCBlbnRyaWVzIGluIHRoZSBtZW51IGJveC4gICovCitzdGF0aWMgdm9pZAorcHJpbnRfZW50cmllcyAoaW50IHksIGludCBzaXplLCBpbnQgZmlyc3QsIGludCBlbnRyeW5vLCBjaGFyICptZW51X2VudHJpZXMpCit7CisgIGludCBpOworICAKKyAgZ290b3h5ICg3NywgeSArIDEpOworCisgIGlmIChmaXJzdCkKKyAgICBncnViX3B1dGNoYXIgKERJU1BfVVApOworICBlbHNlCisgICAgZ3J1Yl9wdXRjaGFyICgnICcpOworCisgIG1lbnVfZW50cmllcyA9IGdldF9lbnRyeSAobWVudV9lbnRyaWVzLCBmaXJzdCwgMCk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICB7CisgICAgICBwcmludF9lbnRyeSAoeSArIGkgKyAxLCBlbnRyeW5vID09IGksIG1lbnVfZW50cmllcyk7CisKKyAgICAgIHdoaWxlICgqbWVudV9lbnRyaWVzKQorCW1lbnVfZW50cmllcysrOworCisgICAgICBpZiAoKihtZW51X2VudHJpZXMgLSAxKSkKKwltZW51X2VudHJpZXMrKzsKKyAgICB9CisKKyAgZ290b3h5ICg3NywgeSArIHNpemUpOworCisgIGlmICgqbWVudV9lbnRyaWVzKQorICAgIGdydWJfcHV0Y2hhciAoRElTUF9ET1dOKTsKKyAgZWxzZQorICAgIGdydWJfcHV0Y2hhciAoJyAnKTsKKworICBnb3RveHkgKDc0LCB5ICsgZW50cnlubyArIDEpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfZW50cmllc19yYXcgKGludCBzaXplLCBpbnQgZmlyc3QsIGNoYXIgKm1lbnVfZW50cmllcykKK3sKKyAgaW50IGk7CisKKyNkZWZpbmUgTElORV9MRU5HVEggNjcKKworICBmb3IgKGkgPSAwOyBpIDwgTElORV9MRU5HVEg7IGkrKykKKyAgICBncnViX3B1dGNoYXIgKCctJyk7CisgIGdydWJfcHV0Y2hhciAoJ1xuJyk7CisKKyAgZm9yIChpID0gZmlyc3Q7IGkgPCBzaXplOyBpKyspCisgICAgeworICAgICAgLyogZ3J1YidzIHByaW50ZiBjYW4ndCAlMDJkIHNvIC4uLiAqLworICAgICAgaWYgKGkgPCAxMCkKKwlncnViX3B1dGNoYXIgKCcgJyk7CisgICAgICBncnViX3ByaW50ZiAoIiVkOiAlc1xuIiwgaSwgZ2V0X2VudHJ5IChtZW51X2VudHJpZXMsIGksIDApKTsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IExJTkVfTEVOR1RIOyBpKyspCisgICAgZ3J1Yl9wdXRjaGFyICgnLScpOworICBncnViX3B1dGNoYXIgKCdcbicpOworCisjdW5kZWYgTElORV9MRU5HVEgKK30KKworCitzdGF0aWMgdm9pZAorcHJpbnRfYm9yZGVyIChpbnQgeSwgaW50IHNpemUpCit7CisgIGludCBpOworCisgIGlmIChjdXJyZW50X3Rlcm0tPnNldGNvbG9yc3RhdGUpCisgICAgY3VycmVudF90ZXJtLT5zZXRjb2xvcnN0YXRlIChDT0xPUl9TVEFURV9OT1JNQUwpOworICAKKyAgZ290b3h5ICgxLCB5KTsKKworICBncnViX3B1dGNoYXIgKERJU1BfVUwpOworICBmb3IgKGkgPSAwOyBpIDwgNzM7IGkrKykKKyAgICBncnViX3B1dGNoYXIgKERJU1BfSE9SSVopOworICBncnViX3B1dGNoYXIgKERJU1BfVVIpOworCisgIGkgPSAxOworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBnb3RveHkgKDEsIHkgKyBpKTsKKworICAgICAgaWYgKGkgPiBzaXplKQorCWJyZWFrOworICAgICAgCisgICAgICBncnViX3B1dGNoYXIgKERJU1BfVkVSVCk7CisgICAgICBnb3RveHkgKDc1LCB5ICsgaSk7CisgICAgICBncnViX3B1dGNoYXIgKERJU1BfVkVSVCk7CisKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgZ3J1Yl9wdXRjaGFyIChESVNQX0xMKTsKKyAgZm9yIChpID0gMDsgaSA8IDczOyBpKyspCisgICAgZ3J1Yl9wdXRjaGFyIChESVNQX0hPUklaKTsKKyAgZ3J1Yl9wdXRjaGFyIChESVNQX0xSKTsKKworICBpZiAoY3VycmVudF90ZXJtLT5zZXRjb2xvcnN0YXRlKQorICAgIGN1cnJlbnRfdGVybS0+c2V0Y29sb3JzdGF0ZSAoQ09MT1JfU1RBVEVfU1RBTkRBUkQpOworfQorCitzdGF0aWMgdm9pZAorcnVuX21lbnUgKGNoYXIgKm1lbnVfZW50cmllcywgY2hhciAqY29uZmlnX2VudHJpZXMsIGludCBudW1fZW50cmllcywKKwkgIGNoYXIgKmhlYXAsIGludCBlbnRyeW5vKQoreworICBpbnQgYywgdGltZTEsIHRpbWUyID0gLTEsIGZpcnN0X2VudHJ5ID0gMDsKKyAgY2hhciAqY3VyX2VudHJ5ID0gMDsKKworICAvKgorICAgKiAgTWFpbiBsb29wIGZvciBtZW51IFVJLgorICAgKi8KKworcmVzdGFydDoKKyAgLyogRHVtYiB0ZXJtaW5hbCBhbHdheXMgdXNlIGFsbCBlbnRyaWVzIGZvciBkaXNwbGF5IAorICAgICBpbnZhcmlhbnQgZm9yIFRFUk1fRFVNQjogZmlyc3RfZW50cnkgPT0gMCAgKi8KKyAgaWYgKCEgKGN1cnJlbnRfdGVybS0+ZmxhZ3MgJiBURVJNX0RVTUIpKQorICAgIHsKKyAgICAgIHdoaWxlIChlbnRyeW5vID4gMTEpCisJeworCSAgZmlyc3RfZW50cnkrKzsKKwkgIGVudHJ5bm8tLTsKKwl9CisgICAgfQorCisgIC8qIElmIHRoZSB0aW1lb3V0IHdhcyBleHBpcmVkIG9yIHdhc24ndCBzZXQsIGZvcmNlIHRvIHNob3cgdGhlIG1lbnUKKyAgICAgaW50ZXJmYWNlLiAqLworICBpZiAoZ3J1Yl90aW1lb3V0IDwgMCkKKyAgICBzaG93X21lbnUgPSAxOworICAKKyAgLyogSWYgU0hPV19NRU5VIGlzIGZhbHNlLCBkb24ndCBkaXNwbGF5IHRoZSBtZW51IHVudGlsIEVTQyBpcyBwcmVzc2VkLiAgKi8KKyAgaWYgKCEgc2hvd19tZW51KQorICAgIHsKKyAgICAgIC8qIEdldCBjdXJyZW50IHRpbWUuICAqLworICAgICAgd2hpbGUgKCh0aW1lMSA9IGdldHJ0c2VjcyAoKSkgPT0gMHhGRikKKwk7CisKKyAgICAgIHdoaWxlICgxKQorCXsKKwkgIC8qIENoZWNrIGlmIEVTQyBpcyBwcmVzc2VkLiAgKi8KKwkgIGlmIChjaGVja2tleSAoKSAhPSAtMSAmJiBBU0NJSV9DSEFSIChnZXRrZXkgKCkpID09ICdcZScpCisJICAgIHsKKwkgICAgICBncnViX3RpbWVvdXQgPSAtMTsKKwkgICAgICBzaG93X21lbnUgPSAxOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIC8qIElmIEdSVUJfVElNRU9VVCBpcyBleHBpcmVkLCBib290IHRoZSBkZWZhdWx0IGVudHJ5LiAgKi8KKwkgIGlmIChncnViX3RpbWVvdXQgPj0wCisJICAgICAgJiYgKHRpbWUxID0gZ2V0cnRzZWNzICgpKSAhPSB0aW1lMgorCSAgICAgICYmIHRpbWUxICE9IDB4RkYpCisJICAgIHsKKwkgICAgICBpZiAoZ3J1Yl90aW1lb3V0IDw9IDApCisJCXsKKwkJICBncnViX3RpbWVvdXQgPSAtMTsKKwkJICBnb3RvIGJvb3RfZW50cnk7CisJCX0KKwkgICAgICAKKwkgICAgICB0aW1lMiA9IHRpbWUxOworCSAgICAgIGdydWJfdGltZW91dC0tOworCSAgICAgIAorCSAgICAgIC8qIFByaW50IGEgbWVzc2FnZS4gICovCisJICAgICAgZ3J1Yl9wcmludGYgKCJcclByZXNzIGBFU0MnIHRvIGVudGVyIHRoZSBtZW51Li4uICVkICAgIiwKKwkJCSAgIGdydWJfdGltZW91dCk7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIE9ubHkgZGlzcGxheSB0aGUgbWVudSBpZiB0aGUgdXNlciB3YW50cyB0byBzZWUgaXQuICovCisgIGlmIChzaG93X21lbnUpCisgICAgeworICAgICAgaW5pdF9wYWdlICgpOworICAgICAgc2V0Y3Vyc29yICgwKTsKKworICAgICAgaWYgKGN1cnJlbnRfdGVybS0+ZmxhZ3MgJiBURVJNX0RVTUIpCisJcHJpbnRfZW50cmllc19yYXcgKG51bV9lbnRyaWVzLCBmaXJzdF9lbnRyeSwgbWVudV9lbnRyaWVzKTsKKyAgICAgIGVsc2UKKwlwcmludF9ib3JkZXIgKDMsIDEyKTsKKworICAgICAgZ3J1Yl9wcmludGYgKCJcblwKKyAgICAgIFVzZSB0aGUgJWMgYW5kICVjIGtleXMgdG8gc2VsZWN0IHdoaWNoIGVudHJ5IGlzIGhpZ2hsaWdodGVkLlxuIiwKKwkJICAgRElTUF9VUCwgRElTUF9ET1dOKTsKKyAgICAgIAorICAgICAgaWYgKCEgYXV0aCAmJiBwYXNzd29yZCkKKwl7CisJICBwcmludGYgKCJcCisgICAgICBQcmVzcyBlbnRlciB0byBib290IHRoZSBzZWxlY3RlZCBPUyBvciBcJ3BcJyB0byBlbnRlciBhXG5cCisgICAgICBwYXNzd29yZCB0byB1bmxvY2sgdGhlIG5leHQgc2V0IG9mIGZlYXR1cmVzLiIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoY29uZmlnX2VudHJpZXMpCisJICAgIHByaW50ZiAoIlwKKyAgICAgIFByZXNzIGVudGVyIHRvIGJvb3QgdGhlIHNlbGVjdGVkIE9TLCBcJ2VcJyB0byBlZGl0IHRoZVxuXAorICAgICAgY29tbWFuZHMgYmVmb3JlIGJvb3RpbmcsIG9yIFwnY1wnIGZvciBhIGNvbW1hbmQtbGluZS4iKTsKKwkgIGVsc2UKKwkgICAgcHJpbnRmICgiXAorICAgICAgUHJlc3MgXCdiXCcgdG8gYm9vdCwgXCdlXCcgdG8gZWRpdCB0aGUgc2VsZWN0ZWQgY29tbWFuZCBpbiB0aGVcblwKKyAgICAgIGJvb3Qgc2VxdWVuY2UsIFwnY1wnIGZvciBhIGNvbW1hbmQtbGluZSwgXCdvXCcgdG8gb3BlbiBhIG5ldyBsaW5lXG5cCisgICAgICBhZnRlciAoXCdPXCcgZm9yIGJlZm9yZSkgdGhlIHNlbGVjdGVkIGxpbmUsIFwnZFwnIHRvIHJlbW92ZSB0aGVcblwKKyAgICAgIHNlbGVjdGVkIGxpbmUsIG9yIGVzY2FwZSB0byBnbyBiYWNrIHRvIHRoZSBtYWluIG1lbnUuIik7CisJfQorCisgICAgICBpZiAoY3VycmVudF90ZXJtLT5mbGFncyAmIFRFUk1fRFVNQikKKwlncnViX3ByaW50ZiAoIlxuXG5UaGUgc2VsZWN0ZWQgZW50cnkgaXMgJWQgIiwgZW50cnlubyk7CisgICAgICBlbHNlCisJcHJpbnRfZW50cmllcyAoMywgMTIsIGZpcnN0X2VudHJ5LCBlbnRyeW5vLCBtZW51X2VudHJpZXMpOworICAgIH0KKworICAvKiBYWCB1c2luZyBSVCBjbG9jayBub3csIG5lZWQgdG8gaW5pdGlhbGl6ZSB2YWx1ZSAqLworICB3aGlsZSAoKHRpbWUxID0gZ2V0cnRzZWNzKCkpID09IDB4RkYpOworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIC8qIEluaXRpYWxpemUgdG8gTlVMTCBqdXN0IGluIGNhc2UuLi4gICovCisgICAgICBjdXJfZW50cnkgPSBOVUxMOworCisgICAgICBpZiAoZ3J1Yl90aW1lb3V0ID49IDAgJiYgKHRpbWUxID0gZ2V0cnRzZWNzKCkpICE9IHRpbWUyICYmIHRpbWUxICE9IDB4RkYpCisJeworCSAgaWYgKGdydWJfdGltZW91dCA8PSAwKQorCSAgICB7CisJICAgICAgZ3J1Yl90aW1lb3V0ID0gLTE7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgLyogZWxzZSBub3QgYm9vdGluZyB5ZXQhICovCisJICB0aW1lMiA9IHRpbWUxOworCisJICBpZiAoY3VycmVudF90ZXJtLT5mbGFncyAmIFRFUk1fRFVNQikKKwkgICAgICBncnViX3ByaW50ZiAoIlxyICAgIEVudHJ5ICVkIHdpbGwgYmUgYm9vdGVkIGF1dG9tYXRpY2FsbHkgaW4gJWQgc2Vjb25kcy4gICAiLCAKKwkJCSAgIGVudHJ5bm8sIGdydWJfdGltZW91dCk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBnb3RveHkgKDMsIDIyKTsKKwkgICAgICBncnViX3ByaW50ZiAoIlRoZSBoaWdobGlnaHRlZCBlbnRyeSB3aWxsIGJlIGJvb3RlZCBhdXRvbWF0aWNhbGx5IGluICVkIHNlY29uZHMuICAgICIsCisJCQkgICBncnViX3RpbWVvdXQpOworCSAgICAgIGdvdG94eSAoNzQsIDQgKyBlbnRyeW5vKTsKKwkgIH0KKwkgIAorCSAgZ3J1Yl90aW1lb3V0LS07CisJfQorCisgICAgICAvKiBDaGVjayBmb3IgYSBrZXlwcmVzcywgaG93ZXZlciBpZiBUSU1FT1VUIGhhcyBiZWVuIGV4cGlyZWQKKwkgKEdSVUJfVElNRU9VVCA9PSAtMSkgcmVsYXggaW4gR0VUS0VZIGV2ZW4gaWYgbm8ga2V5IGhhcyBiZWVuCisJIHByZXNzZWQuICAKKwkgVGhpcyBhdm9pZHMgcG9sbGluZyAocmVsZXZhbnQgaW4gdGhlIGdydWItc2hlbGwgYW5kIGxhdGVyIG9uCisJIGluIGdydWIgaWYgaW50ZXJydXB0IGRyaXZlbiBJL08gaXMgZG9uZSkuICAqLworICAgICAgaWYgKGNoZWNra2V5ICgpID49IDAgfHwgZ3J1Yl90aW1lb3V0IDwgMCkKKwl7CisJICAvKiBLZXkgd2FzIHByZXNzZWQsIHNob3cgd2hpY2ggZW50cnkgaXMgc2VsZWN0ZWQgYmVmb3JlIEdFVEtFWSwKKwkgICAgIHNpbmNlIHdlJ3JlIGNvbW1pbmcgaW4gaGVyZSBhbHNvIG9uIEdSVUJfVElNRU9VVCA9PSAtMSBhbmQKKwkgICAgIGhhbmcgaW4gR0VUS0VZICovCisJICBpZiAoY3VycmVudF90ZXJtLT5mbGFncyAmIFRFUk1fRFVNQikKKwkgICAgZ3J1Yl9wcmludGYgKCJcciAgICBIaWdobGlnaHRlZCBlbnRyeSBpcyAlZDogIiwgZW50cnlubyk7CisKKwkgIGMgPSBBU0NJSV9DSEFSIChnZXRrZXkgKCkpOworCisJICBpZiAoZ3J1Yl90aW1lb3V0ID49IDApCisJICAgIHsKKwkgICAgICBpZiAoY3VycmVudF90ZXJtLT5mbGFncyAmIFRFUk1fRFVNQikKKwkJZ3J1Yl9wdXRjaGFyICgnXHInKTsKKwkgICAgICBlbHNlCisJCWdvdG94eSAoMywgMjIpOworCSAgICAgIHByaW50ZiAoIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CisJICAgICAgZ3J1Yl90aW1lb3V0ID0gLTE7CisJICAgICAgZmFsbGJhY2tfZW50cnlubyA9IC0xOworCSAgICAgIGlmICghIChjdXJyZW50X3Rlcm0tPmZsYWdzICYgVEVSTV9EVU1CKSkKKwkJZ290b3h5ICg3NCwgNCArIGVudHJ5bm8pOworCSAgICB9CisKKwkgIC8qIFdlIHRvbGQgdGhlbSBhYm92ZSAoYXQgbGVhc3QgaW4gU1VQUE9SVF9TRVJJQUwpIHRvIHVzZQorCSAgICAgJ14nIG9yICd2JyBzbyBhY2NlcHQgdGhlc2Uga2V5cy4gICovCisJICBpZiAoYyA9PSAxNiB8fCBjID09ICdeJykKKwkgICAgeworCSAgICAgIGlmIChjdXJyZW50X3Rlcm0tPmZsYWdzICYgVEVSTV9EVU1CKQorCQl7CisJCSAgaWYgKGVudHJ5bm8gPiAwKQorCQkgICAgZW50cnluby0tOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgaWYgKGVudHJ5bm8gPiAwKQorCQkgICAgeworCQkgICAgICBwcmludF9lbnRyeSAoNCArIGVudHJ5bm8sIDAsCisJCQkJICAgZ2V0X2VudHJ5IChtZW51X2VudHJpZXMsCisJCQkJCSAgICAgIGZpcnN0X2VudHJ5ICsgZW50cnlubywKKwkJCQkJICAgICAgMCkpOworCQkgICAgICBlbnRyeW5vLS07CisJCSAgICAgIHByaW50X2VudHJ5ICg0ICsgZW50cnlubywgMSwKKwkJCQkgICBnZXRfZW50cnkgKG1lbnVfZW50cmllcywKKwkJCQkJICAgICAgZmlyc3RfZW50cnkgKyBlbnRyeW5vLAorCQkJCQkgICAgICAwKSk7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoZmlyc3RfZW50cnkgPiAwKQorCQkgICAgeworCQkgICAgICBmaXJzdF9lbnRyeS0tOworCQkgICAgICBwcmludF9lbnRyaWVzICgzLCAxMiwgZmlyc3RfZW50cnksIGVudHJ5bm8sCisJCQkJICAgICBtZW51X2VudHJpZXMpOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKChjID09IDE0IHx8IGMgPT0gJ3YnKQorCQkgICAmJiBmaXJzdF9lbnRyeSArIGVudHJ5bm8gKyAxIDwgbnVtX2VudHJpZXMpCisJICAgIHsKKwkgICAgICBpZiAoY3VycmVudF90ZXJtLT5mbGFncyAmIFRFUk1fRFVNQikKKwkJZW50cnlubysrOworCSAgICAgIGVsc2UKKwkJeworCQkgIGlmIChlbnRyeW5vIDwgMTEpCisJCSAgICB7CisJCSAgICAgIHByaW50X2VudHJ5ICg0ICsgZW50cnlubywgMCwKKwkJCQkgICBnZXRfZW50cnkgKG1lbnVfZW50cmllcywKKwkJCQkJICAgICAgZmlyc3RfZW50cnkgKyBlbnRyeW5vLAorCQkJCQkgICAgICAwKSk7CisJCSAgICAgIGVudHJ5bm8rKzsKKwkJICAgICAgcHJpbnRfZW50cnkgKDQgKyBlbnRyeW5vLCAxLAorCQkJCSAgIGdldF9lbnRyeSAobWVudV9lbnRyaWVzLAorCQkJCQkgICAgICBmaXJzdF9lbnRyeSArIGVudHJ5bm8sCisJCQkJCSAgICAgIDApKTsKKwkJICB9CisJCWVsc2UgaWYgKG51bV9lbnRyaWVzID4gMTIgKyBmaXJzdF9lbnRyeSkKKwkJICB7CisJCSAgICBmaXJzdF9lbnRyeSsrOworCQkgICAgcHJpbnRfZW50cmllcyAoMywgMTIsIGZpcnN0X2VudHJ5LCBlbnRyeW5vLCBtZW51X2VudHJpZXMpOworCQkgIH0KKwkJfQorCSAgICB9CisJICBlbHNlIGlmIChjID09IDcpCisJICAgIHsKKwkgICAgICAvKiBQYWdlIFVwICovCisJICAgICAgZmlyc3RfZW50cnkgLT0gMTI7CisJICAgICAgaWYgKGZpcnN0X2VudHJ5IDwgMCkKKwkJeworCQkgIGVudHJ5bm8gKz0gZmlyc3RfZW50cnk7CisJCSAgZmlyc3RfZW50cnkgPSAwOworCQkgIGlmIChlbnRyeW5vIDwgMCkKKwkJICAgIGVudHJ5bm8gPSAwOworCQl9CisJICAgICAgcHJpbnRfZW50cmllcyAoMywgMTIsIGZpcnN0X2VudHJ5LCBlbnRyeW5vLCBtZW51X2VudHJpZXMpOworCSAgICB9CisJICBlbHNlIGlmIChjID09IDMpCisJICAgIHsKKwkgICAgICAvKiBQYWdlIERvd24gKi8KKwkgICAgICBmaXJzdF9lbnRyeSArPSAxMjsKKwkgICAgICBpZiAoZmlyc3RfZW50cnkgKyBlbnRyeW5vICsgMSA+PSBudW1fZW50cmllcykKKwkJeworCQkgIGZpcnN0X2VudHJ5ID0gbnVtX2VudHJpZXMgLSAxMjsKKwkJICBpZiAoZmlyc3RfZW50cnkgPCAwKQorCQkgICAgZmlyc3RfZW50cnkgPSAwOworCQkgIGVudHJ5bm8gPSBudW1fZW50cmllcyAtIGZpcnN0X2VudHJ5IC0gMTsKKwkJfQorCSAgICAgIHByaW50X2VudHJpZXMgKDMsIDEyLCBmaXJzdF9lbnRyeSwgZW50cnlubywgbWVudV9lbnRyaWVzKTsKKwkgICAgfQorCisJICBpZiAoY29uZmlnX2VudHJpZXMpCisJICAgIHsKKwkgICAgICBpZiAoKGMgPT0gJ1xuJykgfHwgKGMgPT0gJ1xyJykgfHwgKGMgPT0gNikpCisJCWJyZWFrOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoKGMgPT0gJ2QnKSB8fCAoYyA9PSAnbycpIHx8IChjID09ICdPJykpCisJCXsKKwkJICBpZiAoISAoY3VycmVudF90ZXJtLT5mbGFncyAmIFRFUk1fRFVNQikpCisJCSAgICBwcmludF9lbnRyeSAoNCArIGVudHJ5bm8sIDAsCisJCQkJIGdldF9lbnRyeSAobWVudV9lbnRyaWVzLAorCQkJCQkgICAgZmlyc3RfZW50cnkgKyBlbnRyeW5vLAorCQkJCQkgICAgMCkpOworCisJCSAgLyogaW5zZXJ0IGFmdGVyIGlzIGFsbW9zdCBleGFjdGx5IGxpa2UgaW5zZXJ0IGJlZm9yZSAqLworCQkgIGlmIChjID09ICdvJykKKwkJICAgIHsKKwkJICAgICAgLyogQnV0IGBvJyBkaWZmZXJzIGZyb20gYE8nLCBzaW5jZSBpdCBtYXkgY2F1c2VzCisJCQkgdGhlIG1lbnUgc2NyZWVuIHRvIHNjcm9sbCB1cC4gICovCisJCSAgICAgIGlmIChlbnRyeW5vIDwgMTEgfHwgKGN1cnJlbnRfdGVybS0+ZmxhZ3MgJiBURVJNX0RVTUIpKQorCQkJZW50cnlubysrOworCQkgICAgICBlbHNlCisJCQlmaXJzdF9lbnRyeSsrOworCQkgICAgICAKKwkJICAgICAgYyA9ICdPJzsKKwkJICAgIH0KKworCQkgIGN1cl9lbnRyeSA9IGdldF9lbnRyeSAobWVudV9lbnRyaWVzLAorCQkJCQkgZmlyc3RfZW50cnkgKyBlbnRyeW5vLAorCQkJCQkgMCk7CisKKwkJICBpZiAoYyA9PSAnTycpCisJCSAgICB7CisJCSAgICAgIGdydWJfbWVtbW92ZSAoY3VyX2VudHJ5ICsgMiwgY3VyX2VudHJ5LAorCQkJCSAgICAoKGludCkgaGVhcCkgLSAoKGludCkgY3VyX2VudHJ5KSk7CisKKwkJICAgICAgY3VyX2VudHJ5WzBdID0gJyAnOworCQkgICAgICBjdXJfZW50cnlbMV0gPSAwOworCisJCSAgICAgIGhlYXAgKz0gMjsKKworCQkgICAgICBudW1fZW50cmllcysrOworCQkgICAgfQorCQkgIGVsc2UgaWYgKG51bV9lbnRyaWVzID4gMCkKKwkJICAgIHsKKwkJICAgICAgY2hhciAqcHRyID0gZ2V0X2VudHJ5KG1lbnVfZW50cmllcywKKwkJCQkJICAgIGZpcnN0X2VudHJ5ICsgZW50cnlubyArIDEsCisJCQkJCSAgICAwKTsKKworCQkgICAgICBncnViX21lbW1vdmUgKGN1cl9lbnRyeSwgcHRyLAorCQkJCSAgICAoKGludCkgaGVhcCkgLSAoKGludCkgcHRyKSk7CisJCSAgICAgIGhlYXAgLT0gKCgoaW50KSBwdHIpIC0gKChpbnQpIGN1cl9lbnRyeSkpOworCisJCSAgICAgIG51bV9lbnRyaWVzLS07CisKKwkJICAgICAgaWYgKGVudHJ5bm8gPj0gbnVtX2VudHJpZXMpCisJCQllbnRyeW5vLS07CisJCSAgICAgIGlmIChmaXJzdF9lbnRyeSAmJiBudW1fZW50cmllcyA8IDEyICsgZmlyc3RfZW50cnkpCisJCQlmaXJzdF9lbnRyeS0tOworCQkgICAgfQorCisJCSAgaWYgKGN1cnJlbnRfdGVybS0+ZmxhZ3MgJiBURVJNX0RVTUIpCisJCSAgICB7CisJCSAgICAgIGdydWJfcHJpbnRmICgiXG5cbiIpOworCQkgICAgICBwcmludF9lbnRyaWVzX3JhdyAobnVtX2VudHJpZXMsIGZpcnN0X2VudHJ5LAorCQkJCQkgbWVudV9lbnRyaWVzKTsKKwkJICAgICAgZ3J1Yl9wcmludGYgKCJcbiIpOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHByaW50X2VudHJpZXMgKDMsIDEyLCBmaXJzdF9lbnRyeSwgZW50cnlubywgbWVudV9lbnRyaWVzKTsKKwkJfQorCisJICAgICAgY3VyX2VudHJ5ID0gbWVudV9lbnRyaWVzOworCSAgICAgIGlmIChjID09IDI3KQorCQlyZXR1cm47CisJICAgICAgaWYgKGMgPT0gJ2InKQorCQlicmVhazsKKwkgICAgfQorCisJICBpZiAoISBhdXRoICYmIHBhc3N3b3JkKQorCSAgICB7CisJICAgICAgaWYgKGMgPT0gJ3AnKQorCQl7CisJCSAgLyogRG8gcGFzc3dvcmQgY2hlY2sgaGVyZSEgKi8KKwkJICBjaGFyIGVudGVyZWRbMzJdOworCQkgIGNoYXIgKnBwdHIgPSBwYXNzd29yZDsKKworCQkgIGlmIChjdXJyZW50X3Rlcm0tPmZsYWdzICYgVEVSTV9EVU1CKQorCQkgICAgZ3J1Yl9wcmludGYgKCJcciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOworCQkgIGVsc2UKKwkJICAgIGdvdG94eSAoMSwgMjEpOworCisJCSAgLyogV2lwZSBvdXQgdGhlIHByZXZpb3VzbHkgZW50ZXJlZCBwYXNzd29yZCAqLworCQkgIGdydWJfbWVtc2V0IChlbnRlcmVkLCAwLCBzaXplb2YgKGVudGVyZWQpKTsKKwkJICBnZXRfY21kbGluZSAoIiBQYXNzd29yZDogIiwgZW50ZXJlZCwgMzEsICcqJywgMCk7CisKKwkJICB3aGlsZSAoISBpc3NwYWNlICgqcHB0cikgJiYgKnBwdHIpCisJCSAgICBwcHRyKys7CisKKwkJICAvKiBNYWtlIHN1cmUgdGhhdCBQQVNTV09SRCBpcyBOVUwtdGVybWluYXRlZC4gICovCisJCSAgKnBwdHIrKyA9IDA7CisKKwkJICBpZiAoISBjaGVja19wYXNzd29yZCAoZW50ZXJlZCwgcGFzc3dvcmQsIHBhc3N3b3JkX3R5cGUpKQorCQkgICAgeworCQkgICAgICBjaGFyICpuZXdfZmlsZSA9IGNvbmZpZ19maWxlOworCQkgICAgICB3aGlsZSAoaXNzcGFjZSAoKnBwdHIpKQorCQkJcHB0cisrOworCisJCSAgICAgIC8qIElmICpQUFRSIGlzIE5VTCwgdGhlbiBhbGxvdyB0aGUgdXNlciB0byB1c2UKKwkJCSBwcml2aWxlZ2VkIGluc3RydWN0aW9ucywgb3RoZXJ3aXNlLCBsb2FkCisJCQkgYW5vdGhlciBjb25maWd1cmF0aW9uIGZpbGUuICAqLworCQkgICAgICBpZiAoKnBwdHIgIT0gMCkKKwkJCXsKKwkJCSAgd2hpbGUgKCgqKG5ld19maWxlKyspID0gKihwcHRyKyspKSAhPSAwKQorCQkJICAgIDsKKworCQkJICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgdXNlciB3aWxsIG5vdCBoYXZlCisJCQkgICAgIGF1dGhvcml0eSBpbiB0aGUgbmV4dCBjb25maWd1cmF0aW9uLiAgKi8KKwkJCSAgYXV0aCA9IDA7CisJCQkgIHJldHVybjsKKwkJCX0KKwkJICAgICAgZWxzZQorCQkJeworCQkJICAvKiBOb3cgdGhlIHVzZXIgaXMgc3VwZXJodW1hbi4gICovCisJCQkgIGF1dGggPSAxOworCQkJICBnb3RvIHJlc3RhcnQ7CisJCQl9CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBncnViX3ByaW50ZiAoIkZhaWxlZCFcbiAgICAgIFByZXNzIGFueSBrZXkgdG8gY29udGludWUuLi4iKTsKKwkJICAgICAgZ2V0a2V5ICgpOworCQkgICAgICBnb3RvIHJlc3RhcnQ7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKGMgPT0gJ2UnKQorCQl7CisJCSAgaW50IG5ld19udW1fZW50cmllcyA9IDAsIGkgPSAwOworCQkgIGNoYXIgKm5ld19oZWFwOworCisJCSAgaWYgKGNvbmZpZ19lbnRyaWVzKQorCQkgICAgeworCQkgICAgICBuZXdfaGVhcCA9IGhlYXA7CisJCSAgICAgIGN1cl9lbnRyeSA9IGdldF9lbnRyeSAoY29uZmlnX2VudHJpZXMsCisJCQkJCSAgICAgZmlyc3RfZW50cnkgKyBlbnRyeW5vLAorCQkJCQkgICAgIDEpOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgLyogc2FmZSBhcmVhISAqLworCQkgICAgICBuZXdfaGVhcCA9IGhlYXAgKyBORVdfSEVBUFNJWkUgKyAxOworCQkgICAgICBjdXJfZW50cnkgPSBnZXRfZW50cnkgKG1lbnVfZW50cmllcywKKwkJCQkJICAgICBmaXJzdF9lbnRyeSArIGVudHJ5bm8sCisJCQkJCSAgICAgMCk7CisJCSAgICB9CisKKwkJICBkbworCQkgICAgeworCQkgICAgICB3aGlsZSAoKCoobmV3X2hlYXArKykgPSBjdXJfZW50cnlbaSsrXSkgIT0gMCk7CisJCSAgICAgIG5ld19udW1fZW50cmllcysrOworCQkgICAgfQorCQkgIHdoaWxlIChjb25maWdfZW50cmllcyAmJiBjdXJfZW50cnlbaV0pOworCisJCSAgLyogdGhpcyBvbmx5IG5lZWRzIHRvIGJlIGRvbmUgaWYgY29uZmlnX2VudHJpZXMgaXMgbm9uLU5VTEwsCisJCSAgICAgYnV0IGl0IGRvZXNuJ3QgaHVydCB0byBkbyBpdCBhbHdheXMgKi8KKwkJICAqKG5ld19oZWFwKyspID0gMDsKKworCQkgIGlmIChjb25maWdfZW50cmllcykKKwkJICAgIHJ1bl9tZW51IChoZWFwLCBOVUxMLCBuZXdfbnVtX2VudHJpZXMsIG5ld19oZWFwLCAwKTsKKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGNscyAoKTsKKwkJICAgICAgcHJpbnRfY21kbGluZV9tZXNzYWdlICgwKTsKKworCQkgICAgICBuZXdfaGVhcCA9IGhlYXAgKyBORVdfSEVBUFNJWkUgKyAxOworCisJCSAgICAgIHNhdmVkX2RyaXZlID0gYm9vdF9kcml2ZTsKKwkJICAgICAgc2F2ZWRfcGFydGl0aW9uID0gaW5zdGFsbF9wYXJ0aXRpb247CisJCSAgICAgIGN1cnJlbnRfZHJpdmUgPSBHUlVCX0lOVkFMSURfRFJJVkU7CisKKwkJICAgICAgaWYgKCEgZ2V0X2NtZGxpbmUgKFBBQ0tBR0UgIiBlZGl0PiAiLCBuZXdfaGVhcCwKKwkJCQkJIE5FV19IRUFQU0laRSArIDEsIDAsIDEpKQorCQkJeworCQkJICBpbnQgaiA9IDA7CisKKwkJCSAgLyogZ2V0IGxlbmd0aCBvZiBuZXcgY29tbWFuZCAqLworCQkJICB3aGlsZSAobmV3X2hlYXBbaisrXSkKKwkJCSAgICA7CisKKwkJCSAgaWYgKGogPCAyKQorCQkJICAgIHsKKwkJCSAgICAgIGogPSAyOworCQkJICAgICAgbmV3X2hlYXBbMF0gPSAnICc7CisJCQkgICAgICBuZXdfaGVhcFsxXSA9IDA7CisJCQkgICAgfQorCisJCQkgIC8qIGFsaWduIHJlc3Qgb2YgY29tbWFuZHMgcHJvcGVybHkgKi8KKwkJCSAgZ3J1Yl9tZW1tb3ZlIChjdXJfZW50cnkgKyBqLCBjdXJfZW50cnkgKyBpLAorCQkJCQkoaW50KSBoZWFwIC0gKChpbnQpIGN1cl9lbnRyeSArIGkpKTsKKworCQkJICAvKiBjb3B5IGNvbW1hbmQgdG8gY29ycmVjdCBhcmVhICovCisJCQkgIGdydWJfbWVtbW92ZSAoY3VyX2VudHJ5LCBuZXdfaGVhcCwgaik7CisKKwkJCSAgaGVhcCArPSAoaiAtIGkpOworCQkJfQorCQkgICAgfQorCisJCSAgZ290byByZXN0YXJ0OworCQl9CisJICAgICAgaWYgKGMgPT0gJ2MnKQorCQl7CisJCSAgZW50ZXJfY21kbGluZSAoaGVhcCwgMCk7CisJCSAgZ290byByZXN0YXJ0OworCQl9CisjaWZkZWYgR1JVQl9VVElMCisJICAgICAgaWYgKGMgPT0gJ3EnKQorCQl7CisJCSAgLyogVGhlIHNhbWUgYXMgYGBxdWl0JycuICAqLworCQkgIHN0b3AgKCk7CisJCX0KKyNlbmRpZgorCSAgICB9CisJfQorICAgIH0KKyAgCisgIC8qIEF0dGVtcHQgdG8gYm9vdCBhbiBlbnRyeS4gICovCisgIAorIGJvb3RfZW50cnk6CisgIAorICBjbHMgKCk7CisgIHNldGN1cnNvciAoMSk7CisgIAorICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpZiAoY29uZmlnX2VudHJpZXMpCisJcHJpbnRmICgiICBCb290aW5nIFwnJXNcJ1xuXG4iLAorCQlnZXRfZW50cnkgKG1lbnVfZW50cmllcywgZmlyc3RfZW50cnkgKyBlbnRyeW5vLCAwKSk7CisgICAgICBlbHNlCisJcHJpbnRmICgiICBCb290aW5nIGNvbW1hbmQtbGlzdFxuXG4iKTsKKworICAgICAgaWYgKCEgY3VyX2VudHJ5KQorCWN1cl9lbnRyeSA9IGdldF9lbnRyeSAoY29uZmlnX2VudHJpZXMsIGZpcnN0X2VudHJ5ICsgZW50cnlubywgMSk7CisKKyAgICAgIC8qIFNldCBDVVJSRU5UX0VOVFJZTk8gZm9yIHRoZSBjb21tYW5kICJzYXZlZGVmYXVsdCIuICAqLworICAgICAgY3VycmVudF9lbnRyeW5vID0gZmlyc3RfZW50cnkgKyBlbnRyeW5vOworICAgICAgCisgICAgICBpZiAocnVuX3NjcmlwdCAoY3VyX2VudHJ5LCBoZWFwKSkKKwl7CisJICBpZiAoZmFsbGJhY2tfZW50cnlubyA+PSAwKQorCSAgICB7CisJICAgICAgY3VyX2VudHJ5ID0gTlVMTDsKKwkgICAgICBmaXJzdF9lbnRyeSA9IDA7CisJICAgICAgZW50cnlubyA9IGZhbGxiYWNrX2VudHJpZXNbZmFsbGJhY2tfZW50cnlub107CisJICAgICAgZmFsbGJhY2tfZW50cnlubysrOworCSAgICAgIGlmIChmYWxsYmFja19lbnRyeW5vID49IE1BWF9GQUxMQkFDS19FTlRSSUVTCisJCSAgfHwgZmFsbGJhY2tfZW50cmllc1tmYWxsYmFja19lbnRyeW5vXSA8IDApCisJCWZhbGxiYWNrX2VudHJ5bm8gPSAtMTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBicmVhazsKKwl9CisgICAgICBlbHNlCisJYnJlYWs7CisgICAgfQorCisgIHNob3dfbWVudSA9IDE7CisgIGdvdG8gcmVzdGFydDsKK30KKworCitzdGF0aWMgaW50CitnZXRfbGluZV9mcm9tX2NvbmZpZyAoY2hhciAqY21kbGluZSwgaW50IG1heGxlbiwgaW50IHJlYWRfZnJvbV9maWxlKQoreworICBpbnQgcG9zID0gMCwgbGl0ZXJhbCA9IDAsIGNvbW1lbnQgPSAwOworICBjaGFyIGM7ICAvKiBzaW5jZSB3ZSdyZSBsb2FkaW5nIGl0IGEgYnl0ZSBhdCBhIHRpbWUhICovCisgIAorICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpZiAocmVhZF9mcm9tX2ZpbGUpCisJeworCSAgaWYgKCEgZ3J1Yl9yZWFkICgmYywgMSkpCisJICAgIGJyZWFrOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoISByZWFkX2Zyb21fcHJlc2V0X21lbnUgKCZjLCAxKSkKKwkgICAgYnJlYWs7CisJfQorCisgICAgICAvKiBTa2lwIGFsbCBjYXJyaWFnZSByZXR1cm5zLiAgKi8KKyAgICAgIGlmIChjID09ICdccicpCisJY29udGludWU7CisKKyAgICAgIC8qIFJlcGxhY2UgdGFicyB3aXRoIHNwYWNlcy4gICovCisgICAgICBpZiAoYyA9PSAnXHQnKQorCWMgPSAnICc7CisKKyAgICAgIC8qIFRoZSBwcmV2aW91cyBpcyBhIGJhY2tzbGFzaCwgdGhlbi4uLiAgKi8KKyAgICAgIGlmIChsaXRlcmFsKQorCXsKKwkgIC8qIElmIGl0IGlzIGEgbmV3bGluZSwgcmVwbGFjZSBpdCB3aXRoIGEgc3BhY2UgYW5kIGNvbnRpbnVlLiAgKi8KKwkgIGlmIChjID09ICdcbicpCisJICAgIHsKKwkgICAgICBjID0gJyAnOworCSAgICAgIAorCSAgICAgIC8qIEdvIGJhY2sgdG8gb3ZlcndyaXRlIGEgYmFja3NsYXNoLiAgKi8KKwkgICAgICBpZiAocG9zID4gMCkKKwkJcG9zLS07CisJICAgIH0KKwkgICAgCisJICBsaXRlcmFsID0gMDsKKwl9CisJICAKKyAgICAgIC8qIHRyYW5zbGF0ZSBjaGFyYWN0ZXJzIGZpcnN0ISAqLworICAgICAgaWYgKGMgPT0gJ1xcJyAmJiAhIGxpdGVyYWwpCisJbGl0ZXJhbCA9IDE7CisKKyAgICAgIGlmIChjb21tZW50KQorCXsKKwkgIGlmIChjID09ICdcbicpCisJICAgIGNvbW1lbnQgPSAwOworCX0KKyAgICAgIGVsc2UgaWYgKCEgcG9zKQorCXsKKwkgIGlmIChjID09ICcjJykKKwkgICAgY29tbWVudCA9IDE7CisJICBlbHNlIGlmICgoYyAhPSAnICcpICYmIChjICE9ICdcbicpKQorCSAgICBjbWRsaW5lW3BvcysrXSA9IGM7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChjID09ICdcbicpCisJICAgIGJyZWFrOworCisJICBpZiAocG9zIDwgbWF4bGVuKQorCSAgICBjbWRsaW5lW3BvcysrXSA9IGM7CisJfQorICAgIH0KKworICBjbWRsaW5lW3Bvc10gPSAwOworCisgIHJldHVybiBwb3M7Cit9CisKKworLyogVGhpcyBpcyB0aGUgc3RhcnRpbmcgZnVuY3Rpb24gaW4gQy4gICovCit2b2lkCitjbWFpbiAodm9pZCkKK3sKKyAgaW50IGNvbmZpZ19sZW4sIG1lbnVfbGVuLCBudW1fZW50cmllczsKKyAgY2hhciAqY29uZmlnX2VudHJpZXMsICptZW51X2VudHJpZXM7CisgIGNoYXIgKmtpbGxfYnVmID0gKGNoYXIgKikgS0lMTF9CVUY7CisKKyAgYXV0byB2b2lkIHJlc2V0ICh2b2lkKTsKKyAgdm9pZCByZXNldCAodm9pZCkKKyAgICB7CisgICAgICBjb3VudF9saW5lcyA9IC0xOworICAgICAgY29uZmlnX2xlbiA9IDA7CisgICAgICBtZW51X2xlbiA9IDA7CisgICAgICBudW1fZW50cmllcyA9IDA7CisgICAgICBjb25maWdfZW50cmllcyA9IChjaGFyICopIG1iaS5kcml2ZXNfYWRkciArIG1iaS5kcml2ZXNfbGVuZ3RoOworICAgICAgbWVudV9lbnRyaWVzID0gKGNoYXIgKikgTUVOVV9CVUY7CisgICAgICBpbml0X2NvbmZpZyAoKTsKKyAgICB9CisgIAorICAvKiBJbml0aWFsaXplIHRoZSBlbnZpcm9ubWVudCBmb3IgcmVzdGFydGluZyBTdGFnZSAyLiAgKi8KKyAgZ3J1Yl9zZXRqbXAgKHJlc3RhcnRfZW52KTsKKyAgCisgIC8qIEluaXRpYWxpemUgdGhlIGtpbGwgYnVmZmVyLiAgKi8KKyAgKmtpbGxfYnVmID0gMDsKKworICAvKiBOZXZlciByZXR1cm4uICAqLworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIGludCBpc19vcGVuZWQsIGlzX3ByZXNldDsKKworICAgICAgcmVzZXQgKCk7CisgICAgICAKKyAgICAgIC8qIEhlcmUgbG9hZCB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiAgKi8KKyAgICAgIAorI2lmZGVmIEdSVUJfVVRJTAorICAgICAgaWYgKHVzZV9jb25maWdfZmlsZSkKKyNlbmRpZiAvKiBHUlVCX1VUSUwgKi8KKwl7CisJICBjaGFyICpkZWZhdWx0X2ZpbGUgPSAoY2hhciAqKSBERUZBVUxUX0ZJTEVfQlVGOworCSAgaW50IGk7CisJICAKKwkgIC8qIEdldCBhIHNhdmVkIGRlZmF1bHQgZW50cnkgaWYgcG9zc2libGUuICAqLworCSAgc2F2ZWRfZW50cnlubyA9IDA7CisJICAqZGVmYXVsdF9maWxlID0gMDsKKwkgIGdydWJfc3RybmNhdCAoZGVmYXVsdF9maWxlLCBjb25maWdfZmlsZSwgREVGQVVMVF9GSUxFX0JVRkxFTik7CisJICBmb3IgKGkgPSBncnViX3N0cmxlbihkZWZhdWx0X2ZpbGUpOyBpID49IDA7IGktLSkKKwkgICAgaWYgKGRlZmF1bHRfZmlsZVtpXSA9PSAnLycpCisJICAgICAgeworCQlpKys7CisJCWJyZWFrOworCSAgICAgIH0KKwkgIGRlZmF1bHRfZmlsZVtpXSA9IDA7CisJICBncnViX3N0cm5jYXQgKGRlZmF1bHRfZmlsZSArIGksICJkZWZhdWx0IiwgREVGQVVMVF9GSUxFX0JVRkxFTiAtIGkpOworCSAgaWYgKGdydWJfb3BlbiAoZGVmYXVsdF9maWxlKSkKKwkgICAgeworCSAgICAgIGNoYXIgYnVmWzEwXTsgLyogVGhpcyBpcyBnb29kIGVub3VnaC4gICovCisJICAgICAgY2hhciAqcCA9IGJ1ZjsKKwkgICAgICBpbnQgbGVuOworCSAgICAgIAorCSAgICAgIGxlbiA9IGdydWJfcmVhZCAoYnVmLCBzaXplb2YgKGJ1ZikpOworCSAgICAgIGlmIChsZW4gPiAwKQorCQl7CisJCSAgYnVmW3NpemVvZiAoYnVmKSAtIDFdID0gMDsKKwkJICBzYWZlX3BhcnNlX21heGludCAoJnAsICZzYXZlZF9lbnRyeW5vKTsKKwkJfQorCisJICAgICAgZ3J1Yl9jbG9zZSAoKTsKKwkgICAgfQorCSAgZXJybnVtID0gRVJSX05PTkU7CisJICAKKwkgIGRvCisJICAgIHsKKwkgICAgICAvKiBTVEFURSAwOiAgQmVmb3JlIGFueSB0aXRsZSBjb21tYW5kLgorCQkgU1RBVEUgMTogIEluIGEgdGl0bGUgY29tbWFuZC4KKwkJIFNUQVRFID4xOiBJbiBhIGVudHJ5IGFmdGVyIGEgdGl0bGUgY29tbWFuZC4gICovCisJICAgICAgaW50IHN0YXRlID0gMCwgcHJldl9jb25maWdfbGVuID0gMCwgcHJldl9tZW51X2xlbiA9IDA7CisJICAgICAgY2hhciAqY21kbGluZTsKKworCSAgICAgIC8qIFRyeSB0aGUgcHJlc2V0IG1lbnUgZmlyc3QuIFRoaXMgd2lsbCBzdWNjZWVkIGF0IG1vc3Qgb25jZSwKKwkJIGJlY2F1c2UgY2xvc2VfcHJlc2V0X21lbnUgZGlzYWJsZXMgdGhlIHByZXNldCBtZW51LiAgKi8KKwkgICAgICBpc19vcGVuZWQgPSBpc19wcmVzZXQgPSBvcGVuX3ByZXNldF9tZW51ICgpOworCSAgICAgIGlmICghIGlzX29wZW5lZCkKKwkJeworCQkgIGlzX29wZW5lZCA9IGdydWJfb3BlbiAoY29uZmlnX2ZpbGUpOworCQkgIGVycm51bSA9IEVSUl9OT05FOworCQl9CisKKwkgICAgICBpZiAoISBpc19vcGVuZWQpCisJCWJyZWFrOworCisJICAgICAgLyogVGhpcyBpcyBuZWNlc3NhcnksIGJlY2F1c2UgdGhlIG1lbnUgbXVzdCBiZSBvdmVycmlkZWQuICAqLworCSAgICAgIHJlc2V0ICgpOworCSAgICAgIAorCSAgICAgIGNtZGxpbmUgPSAoY2hhciAqKSBDTURMSU5FX0JVRjsKKwkgICAgICB3aGlsZSAoZ2V0X2xpbmVfZnJvbV9jb25maWcgKGNtZGxpbmUsIE5FV19IRUFQU0laRSwKKwkJCQkJICAgISBpc19wcmVzZXQpKQorCQl7CisJCSAgc3RydWN0IGJ1aWx0aW4gKmJ1aWx0aW47CisJCSAgCisJCSAgLyogR2V0IHRoZSBwb2ludGVyIHRvIHRoZSBidWlsdGluIHN0cnVjdHVyZS4gICovCisJCSAgYnVpbHRpbiA9IGZpbmRfY29tbWFuZCAoY21kbGluZSk7CisJCSAgZXJybnVtID0gMDsKKwkJICBpZiAoISBidWlsdGluKQorCQkgICAgLyogVW5rbm93biBjb21tYW5kLiBKdXN0IHNraXAgbm93LiAgKi8KKwkJICAgIGNvbnRpbnVlOworCQkgIAorCQkgIGlmIChidWlsdGluLT5mbGFncyAmIEJVSUxUSU5fVElUTEUpCisJCSAgICB7CisJCSAgICAgIGNoYXIgKnB0cjsKKwkJICAgICAgCisJCSAgICAgIC8qIHRoZSBjb21tYW5kICJ0aXRsZSIgaXMgc3BlY2lhbGx5IHRyZWF0ZWQuICAqLworCQkgICAgICBpZiAoc3RhdGUgPiAxKQorCQkJeworCQkJICAvKiBUaGUgbmV4dCB0aXRsZSBpcyBmb3VuZC4gICovCisJCQkgIG51bV9lbnRyaWVzKys7CisJCQkgIGNvbmZpZ19lbnRyaWVzW2NvbmZpZ19sZW4rK10gPSAwOworCQkJICBwcmV2X21lbnVfbGVuID0gbWVudV9sZW47CisJCQkgIHByZXZfY29uZmlnX2xlbiA9IGNvbmZpZ19sZW47CisJCQl9CisJCSAgICAgIGVsc2UKKwkJCXsKKwkJCSAgLyogVGhlIGZpcnN0IHRpdGxlIGlzIGZvdW5kLiAgKi8KKwkJCSAgbWVudV9sZW4gPSBwcmV2X21lbnVfbGVuOworCQkJICBjb25maWdfbGVuID0gcHJldl9jb25maWdfbGVuOworCQkJfQorCQkgICAgICAKKwkJICAgICAgLyogUmVzZXQgdGhlIHN0YXRlLiAgKi8KKwkJICAgICAgc3RhdGUgPSAxOworCQkgICAgICAKKwkJICAgICAgLyogQ29weSB0aXRsZSBpbnRvIG1lbnUgYXJlYS4gICovCisJCSAgICAgIHB0ciA9IHNraXBfdG8gKDEsIGNtZGxpbmUpOworCQkgICAgICB3aGlsZSAoKG1lbnVfZW50cmllc1ttZW51X2xlbisrXSA9ICoocHRyKyspKSAhPSAwKQorCQkJOworCQkgICAgfQorCQkgIGVsc2UgaWYgKCEgc3RhdGUpCisJCSAgICB7CisJCSAgICAgIC8qIFJ1biBhIGNvbW1hbmQgZm91bmQgaXMgcG9zc2libGUuICAqLworCQkgICAgICBpZiAoYnVpbHRpbi0+ZmxhZ3MgJiBCVUlMVElOX01FTlUpCisJCQl7CisJCQkgIGNoYXIgKmFyZyA9IHNraXBfdG8gKDEsIGNtZGxpbmUpOworCQkJICAoYnVpbHRpbi0+ZnVuYykgKGFyZywgQlVJTFRJTl9NRU5VKTsKKwkJCSAgZXJybnVtID0gMDsKKwkJCX0KKwkJICAgICAgZWxzZQorCQkJLyogSWdub3JlZC4gICovCisJCQljb250aW51ZTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGNoYXIgKnB0ciA9IGNtZGxpbmU7CisJCSAgICAgIAorCQkgICAgICBzdGF0ZSsrOworCQkgICAgICAvKiBDb3B5IGNvbmZpZyBmaWxlIGRhdGEgdG8gY29uZmlnIGFyZWEuICAqLworCQkgICAgICB3aGlsZSAoKGNvbmZpZ19lbnRyaWVzW2NvbmZpZ19sZW4rK10gPSAqcHRyKyspICE9IDApCisJCQk7CisJCSAgICB9CisJCX0KKwkgICAgICAKKwkgICAgICBpZiAoc3RhdGUgPiAxKQorCQl7CisJCSAgLyogRmluaXNoIHRoZSBsYXN0IGVudHJ5LiAgKi8KKwkJICBudW1fZW50cmllcysrOworCQkgIGNvbmZpZ19lbnRyaWVzW2NvbmZpZ19sZW4rK10gPSAwOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgbWVudV9sZW4gPSBwcmV2X21lbnVfbGVuOworCQkgIGNvbmZpZ19sZW4gPSBwcmV2X2NvbmZpZ19sZW47CisJCX0KKwkgICAgICAKKwkgICAgICBtZW51X2VudHJpZXNbbWVudV9sZW4rK10gPSAwOworCSAgICAgIGNvbmZpZ19lbnRyaWVzW2NvbmZpZ19sZW4rK10gPSAwOworCSAgICAgIGdydWJfbWVtbW92ZSAoY29uZmlnX2VudHJpZXMgKyBjb25maWdfbGVuLCBtZW51X2VudHJpZXMsCisJCQkgICAgbWVudV9sZW4pOworCSAgICAgIG1lbnVfZW50cmllcyA9IGNvbmZpZ19lbnRyaWVzICsgY29uZmlnX2xlbjsKKworCSAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IGFsbCBmYWxsYmFjayBlbnRyaWVzIGFyZSB2YWxpZC4gICovCisJICAgICAgaWYgKGZhbGxiYWNrX2VudHJ5bm8gPj0gMCkKKwkJeworCQkgIGZvciAoaSA9IDA7IGkgPCBNQVhfRkFMTEJBQ0tfRU5UUklFUzsgaSsrKQorCQkgICAgeworCQkgICAgICBpZiAoZmFsbGJhY2tfZW50cmllc1tpXSA8IDApCisJCQlicmVhazsKKwkJICAgICAgaWYgKGZhbGxiYWNrX2VudHJpZXNbaV0gPj0gbnVtX2VudHJpZXMpCisJCQl7CisJCQkgIGdydWJfbWVtbW92ZSAoZmFsbGJhY2tfZW50cmllcyArIGksCisJCQkJCWZhbGxiYWNrX2VudHJpZXMgKyBpICsgMSwKKwkJCQkJKChNQVhfRkFMTEJBQ0tfRU5UUklFUyAtIGkgLSAxKQorCQkJCQkgKiBzaXplb2YgKGludCkpKTsKKwkJCSAgaS0tOworCQkJfQorCQkgICAgfQorCisJCSAgaWYgKGZhbGxiYWNrX2VudHJpZXNbMF0gPCAwKQorCQkgICAgZmFsbGJhY2tfZW50cnlubyA9IC0xOworCQl9CisJICAgICAgLyogQ2hlY2sgaWYgdGhlIGRlZmF1bHQgZW50cnkgaXMgcHJlc2VudC4gT3RoZXJ3aXNlIHJlc2V0CisJCSBpdCB0byBmYWxsYmFjayBpZiBmYWxsYmFjayBpcyB2YWxpZCwgb3IgdG8gREVGQVVMVF9FTlRSWSAKKwkJIGlmIG5vdC4gICovCisJICAgICAgaWYgKGRlZmF1bHRfZW50cnkgPj0gbnVtX2VudHJpZXMpCisJCXsKKwkJICBpZiAoZmFsbGJhY2tfZW50cnlubyA+PSAwKQorCQkgICAgeworCQkgICAgICBkZWZhdWx0X2VudHJ5ID0gZmFsbGJhY2tfZW50cmllc1swXTsKKwkJICAgICAgZmFsbGJhY2tfZW50cnlubysrOworCQkgICAgICBpZiAoZmFsbGJhY2tfZW50cnlubyA+PSBNQVhfRkFMTEJBQ0tfRU5UUklFUworCQkJICB8fCBmYWxsYmFja19lbnRyaWVzW2ZhbGxiYWNrX2VudHJ5bm9dIDwgMCkKKwkJCWZhbGxiYWNrX2VudHJ5bm8gPSAtMTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICBkZWZhdWx0X2VudHJ5ID0gMDsKKwkJfQorCSAgICAgIAorCSAgICAgIGlmIChpc19wcmVzZXQpCisJCWNsb3NlX3ByZXNldF9tZW51ICgpOworCSAgICAgIGVsc2UKKwkJZ3J1Yl9jbG9zZSAoKTsKKwkgICAgfQorCSAgd2hpbGUgKGlzX3ByZXNldCk7CisJfQorCisgICAgICBpZiAoISBudW1fZW50cmllcykKKwl7CisJICAvKiBJZiBubyBhY2NlcHRhYmxlIGNvbmZpZyBmaWxlLCBnb3RvIGNvbW1hbmQtbGluZSwgc3RhcnRpbmcKKwkgICAgIGhlYXAgZnJvbSB3aGVyZSB0aGUgY29uZmlnIGVudHJpZXMgd291bGQgaGF2ZSBiZWVuIHN0b3JlZAorCSAgICAgaWYgdGhlcmUgd2VyZSBhbnkuICAqLworCSAgZW50ZXJfY21kbGluZSAoY29uZmlnX2VudHJpZXMsIDEpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBSdW4gbWVudSBpbnRlcmZhY2UuICAqLworCSAgcnVuX21lbnUgKG1lbnVfZW50cmllcywgY29uZmlnX2VudHJpZXMsIG51bV9lbnRyaWVzLAorCQkgICAgbWVudV9lbnRyaWVzICsgbWVudV9sZW4sIGRlZmF1bHRfZW50cnkpOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zdGFnZTIvc3RhcnQuUyBiL3N0YWdlMi9zdGFydC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhN2Q1MDQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFnZTIvc3RhcnQuUwpAQCAtMCwwICsxLDQwOSBAQAorLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2RlZmluZSBBU01fRklMRQorI2luY2x1ZGUgPHNoYXJlZC5oPgorCisjaWZuZGVmIFNUQUdFMV81CisjaW5jbHVkZSA8c3RhZ2UyX3NpemUuaD4KKyNlbmRpZgorCQorLyoKKyAqICBkZWZpbmVzIGZvciB0aGUgY29kZSBnbyBoZXJlCisgKi8KKworCS8qIEFic29sdXRlIGFkZHJlc3NlcworCSAgIFRoaXMgbWFrZXMgdGhlIGFzc2VtYmxlciBnZW5lcmF0ZSB0aGUgYWRkcmVzcyB3aXRob3V0IHN1cHBvcnQKKwkgICBmcm9tIHRoZSBsaW5rZXIuIChFTEYgY2FuJ3QgcmVsb2NhdGUgMTYtYml0IGFkZHJlc3NlcyEpICovCisjaWZkZWYgU1RBR0UxXzUKKyMgZGVmaW5lIEFCUyh4KSAoeC1fc3RhcnQrMHgyMDAwKQorI2Vsc2UKKyMgZGVmaW5lIEFCUyh4KSAoeC1fc3RhcnQrMHg4MDAwKQorI2VuZGlmIC8qIFNUQUdFMV81ICovCisJCisJLyogUHJpbnQgbWVzc2FnZSBzdHJpbmcgKi8KKyNkZWZpbmUgTVNHKHgpCW1vdncgJEFCUyh4KSwgJXNpOyBjYWxsIG1lc3NhZ2UKKworCS5maWxlCSJzdGFydC5TIgorCisJLnRleHQKKworCS8qIFRlbGwgR0FTIHRvIGdlbmVyYXRlIDE2LWJpdCBpbnN0cnVjdGlvbnMgc28gdGhhdCB0aGlzIGNvZGUgd29ya3MKKwkgICBpbiByZWFsIG1vZGUuICovCisJLmNvZGUxNgorCisJLmdsb2JsCXN0YXJ0LCBfc3RhcnQKK3N0YXJ0OgorX3N0YXJ0OgkKKwkvKgorCSAqIF9zdGFydCBpcyBsb2FkZWQgYXQgMHg4MDAwIGFuZCBpcyBqdW1wZWQgdG8gd2l0aAorCSAqIENTOklQIDA6MHg4MDAwIGluIHN0YWdlMi4KKwkgKi8KKworCS8qIAorCSAqIHdlIGNvbnRpbnVlIHRvIHVzZSB0aGUgc3RhY2sgZm9yIHN0YWdlMSBhbmQgYXNzdW1lIHRoYXQKKwkgKiBzb21lIHJlZ2lzdGVycyBhcmUgc2V0IHRvIGNvcnJlY3QgdmFsdWVzLiBTZWUgc3RhZ2UxLlMKKwkgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKwkgKi8KKwkKKwkvKiBzYXZlIGRyaXZlIHJlZmVyZW5jZSBmaXJzdCB0aGluZyEgKi8KKwlwdXNodwklZHgKKworCS8qIHByaW50IGEgbm90aWZpY2F0aW9uIG1lc3NhZ2Ugb24gdGhlIHNjcmVlbiAqLworCXB1c2h3CSVzaQorCU1TRyhub3RpZmljYXRpb25fc3RyaW5nKQorCXBvcHcJJXNpCisJCisJLyogdGhpcyBzZXRzIHVwIGZvciB0aGUgZmlyc3QgcnVuIHRocm91Z2ggImJvb3Rsb29wIiAqLworCW1vdncJJEFCUyhmaXJzdGxpc3QgLSBCT09UU0VDX0xJU1RTSVpFKSwgJWRpCisKKwkvKiBzYXZlIHRoZSBzZWN0b3IgbnVtYmVyIG9mIHRoZSBzZWNvbmQgc2VjdG9yIGluICVlYnAgKi8KKwltb3ZsCSglZGkpLCAlZWJwCisKKyAgICAgICAgLyogdGhpcyBpcyB0aGUgbG9vcCBmb3IgcmVhZGluZyB0aGUgc2Vjb25kYXJ5IGJvb3QtbG9hZGVyIGluICovCitib290bG9vcDoKKworCS8qIGNoZWNrIHRoZSBudW1iZXIgb2Ygc2VjdG9ycyB0byByZWFkICovCisJY21wdwkkMCwgNCglZGkpCisKKwkvKiBpZiB6ZXJvLCBnbyB0byB0aGUgc3RhcnQgZnVuY3Rpb24gKi8KKwlqZQlib290aXQKKworc2V0dXBfc2VjdG9yczoJCisJLyogY2hlY2sgaWYgd2UgdXNlIExCQSBvciBDSFMgKi8KKwljbXBiCSQwLCAtMSglc2kpCisKKwkvKiBqdW1wIHRvIGNoc19tb2RlIGlmIHplcm8gKi8KKwlqZQljaHNfbW9kZQorCitsYmFfbW9kZToJCisJLyogbG9hZCBsb2dpY2FsIHNlY3RvciBzdGFydCAqLworCW1vdmwJKCVkaSksICVlYngKKworCS8qIHRoZSBtYXhpbXVtIGlzIGxpbWl0ZWQgdG8gMHg3ZiBiZWNhdXNlIG9mIFBob2VuaXggRUREICovCisJeG9ybAklZWF4LCAlZWF4CisJbW92YgkkMHg3ZiwgJWFsCisKKwkvKiBob3cgbWFueSBkbyB3ZSByZWFsbHkgd2FudCB0byByZWFkPyAqLworCWNtcHcJJWF4LCA0KCVkaSkJLyogY29tcGFyZSBhZ2FpbnN0IHRvdGFsIG51bWJlciBvZiBzZWN0b3JzICovCisKKwkvKiB3aGljaCBpcyBncmVhdGVyPyAqLworCWpnCTFmCisKKwkvKiBpZiBsZXNzIHRoYW4sIHNldCB0byB0b3RhbCAqLworCW1vdncJNCglZGkpLCAlYXgKKworMToJCisJLyogc3VidHJhY3QgZnJvbSB0b3RhbCAqLworCXN1YncJJWF4LCA0KCVkaSkKKworCS8qIGFkZCBpbnRvIGxvZ2ljYWwgc2VjdG9yIHN0YXJ0ICovCisJYWRkbAklZWF4LCAoJWRpKQorCisJLyogc2V0IHVwIGRpc2sgYWRkcmVzcyBwYWNrZXQgKi8KKworCS8qIHRoZSBzaXplIGFuZCB0aGUgcmVzZXJ2ZWQgYnl0ZSAqLworCW1vdncJJDB4MDAxMCwgKCVzaSkKKworCS8qIHRoZSBudW1iZXIgb2Ygc2VjdG9ycyAqLworCW1vdncJJWF4LCAyKCVzaSkKKworCS8qIHRoZSBhYnNvbHV0ZSBhZGRyZXNzIChsb3cgMzIgYml0cykgKi8KKwltb3ZsCSVlYngsIDgoJXNpKQorCisJLyogdGhlIHNlZ21lbnQgb2YgYnVmZmVyIGFkZHJlc3MgKi8KKwltb3Z3CSRCVUZGRVJTRUcsIDYoJXNpKQorCisJLyogc2F2ZSAlYXggZnJvbSBkZXN0cnVjdGlvbiEgKi8KKwlwdXNodwklYXgKKworCS8qIHplcm8gJWVheCAqLworCXhvcmwJJWVheCwgJWVheAorCisJLyogdGhlIG9mZnNldCBvZiBidWZmZXIgYWRkcmVzcyAqLworCW1vdncJJWF4LCA0KCVzaSkKKworCS8qIHRoZSBhYnNvbHV0ZSBhZGRyZXNzIChoaWdoIDMyIGJpdHMpICovCisJbW92bAklZWF4LCAxMiglc2kpCisKKworLyoKKyAqIEJJT1MgY2FsbCAiSU5UIDB4MTMgRnVuY3Rpb24gMHg0MiIgdG8gcmVhZCBzZWN0b3JzIGZyb20gZGlzayBpbnRvIG1lbW9yeQorICoJQ2FsbCB3aXRoCSVhaCA9IDB4NDIKKyAqCQkJJWRsID0gZHJpdmUgbnVtYmVyCisgKgkJCSVkczolc2kgPSBzZWdtZW50Om9mZnNldCBvZiBkaXNrIGFkZHJlc3MgcGFja2V0CisgKglSZXR1cm46CisgKgkJCSVhbCA9IDB4MCBvbiBzdWNjZXNzOyBlcnIgY29kZSBvbiBmYWlsdXJlCisgKi8KKworCW1vdmIJJDB4NDIsICVhaAorCWludAkkMHgxMworCisJamMJcmVhZF9lcnJvcgorCisJbW92dwkkQlVGRkVSU0VHLCAlYngKKwlqbXAJY29weV9idWZmZXIKKwkJCQorY2hzX21vZGU6CQorCS8qIGxvYWQgbG9naWNhbCBzZWN0b3Igc3RhcnQgKGJvdHRvbSBoYWxmKSAqLworCW1vdmwJKCVkaSksICVlYXgKKworCS8qIHplcm8gJWVkeCAqLworCXhvcmwJJWVkeCwgJWVkeAorCisJLyogZGl2aWRlIGJ5IG51bWJlciBvZiBzZWN0b3JzICovCisJZGl2bAkoJXNpKQorCisJLyogc2F2ZSBzZWN0b3Igc3RhcnQgKi8KKwltb3ZiCSVkbCwgMTAoJXNpKQorCisJeG9ybAklZWR4LCAlZWR4CS8qIHplcm8gJWVkeCAqLworCWRpdmwJNCglc2kpCQkvKiBkaXZpZGUgYnkgbnVtYmVyIG9mIGhlYWRzICovCisKKwkvKiBzYXZlIGhlYWQgc3RhcnQgKi8KKwltb3ZiCSVkbCwgMTEoJXNpKQorCisJLyogc2F2ZSBjeWxpbmRlciBzdGFydCAqLworCW1vdncJJWF4LCAxMiglc2kpCisKKwkvKiBkbyB3ZSBuZWVkIHRvbyBtYW55IGN5bGluZGVycz8gKi8KKwljbXB3CTgoJXNpKSwgJWF4CisJamdlCWdlb21ldHJ5X2Vycm9yCisKKwkvKiBkZXRlcm1pbmUgdGhlIG1heGltdW0gc2VjdG9yIGxlbmd0aCBvZiB0aGlzIHJlYWQgKi8KKwltb3Z3CSglc2kpLCAlYXgJLyogZ2V0IG51bWJlciBvZiBzZWN0b3JzIHBlciB0cmFjay9oZWFkICovCisKKwkvKiBzdWJ0cmFjdCBzZWN0b3Igc3RhcnQgKi8KKwlzdWJiCTEwKCVzaSksICVhbAorCisJLyogaG93IG1hbnkgZG8gd2UgcmVhbGx5IHdhbnQgdG8gcmVhZD8gKi8KKwljbXB3CSVheCwgNCglZGkpCS8qIGNvbXBhcmUgYWdhaW5zdCB0b3RhbCBudW1iZXIgb2Ygc2VjdG9ycyAqLworCisKKwkvKiB3aGljaCBpcyBncmVhdGVyPyAqLworCWpnCTJmCisKKwkvKiBpZiBsZXNzIHRoYW4sIHNldCB0byB0b3RhbCAqLworCW1vdncJNCglZGkpLCAlYXgKKworMjoJCisJLyogc3VidHJhY3QgZnJvbSB0b3RhbCAqLworCXN1YncJJWF4LCA0KCVkaSkKKworCS8qIGFkZCBpbnRvIGxvZ2ljYWwgc2VjdG9yIHN0YXJ0ICovCisJYWRkbAklZWF4LCAoJWRpKQorCisvKgorICogIFRoaXMgaXMgdGhlIGxvb3AgZm9yIHRha2luZyBjYXJlIG9mIEJJT1MgZ2VvbWV0cnkgdHJhbnNsYXRpb24gKHVnaCEpCisgKi8KKworCS8qIGdldCBoaWdoIGJpdHMgb2YgY3lsaW5kZXIgKi8KKwltb3ZiCTEzKCVzaSksICVkbAorCisJc2hsYgkkNiwgJWRsCQkvKiBzaGlmdCBsZWZ0IGJ5IDYgYml0cyAqLworCW1vdmIJMTAoJXNpKSwgJWNsCS8qIGdldCBzZWN0b3IgKi8KKworCWluY2IJJWNsCQkvKiBub3JtYWxpemUgc2VjdG9yIChzZWN0b3JzIGdvCisJCQkJCWZyb20gMS1OLCBub3QgMC0oTi0xKSApICovCisJb3JiCSVkbCwgJWNsCS8qIGNvbXBvc2l0ZSB0b2dldGhlciAqLworCW1vdmIJMTIoJXNpKSwgJWNoCS8qIHNlY3RvcitoY3lsIGluIGNsLCBjeWxpbmRlciBpbiBjaCAqLworCisJLyogcmVzdG9yZSAlZHggKi8KKwlwb3B3CSVkeAorCXB1c2h3CSVkeAorCisJLyogaGVhZCBudW1iZXIgKi8KKwltb3ZiCTExKCVzaSksICVkaAorCisJcHVzaHcJJWF4CS8qIHNhdmUgJWF4IGZyb20gZGVzdHJ1Y3Rpb24hICovCisKKy8qCisgKiBCSU9TIGNhbGwgIklOVCAweDEzIEZ1bmN0aW9uIDB4MiIgdG8gcmVhZCBzZWN0b3JzIGZyb20gZGlzayBpbnRvIG1lbW9yeQorICoJQ2FsbCB3aXRoCSVhaCA9IDB4MgorICoJCQklYWwgPSBudW1iZXIgb2Ygc2VjdG9ycworICoJCQklY2ggPSBjeWxpbmRlcgorICoJCQklY2wgPSBzZWN0b3IgKGJpdHMgNi03IGFyZSBoaWdoIGJpdHMgb2YgImN5bGluZGVyIikKKyAqCQkJJWRoID0gaGVhZAorICoJCQklZGwgPSBkcml2ZSAoMHg4MCBmb3IgaGFyZCBkaXNrLCAweDAgZm9yIGZsb3BweSBkaXNrKQorICoJCQklZXM6JWJ4ID0gc2VnbWVudDpvZmZzZXQgb2YgYnVmZmVyCisgKglSZXR1cm46CisgKgkJCSVhbCA9IDB4MCBvbiBzdWNjZXNzOyBlcnIgY29kZSBvbiBmYWlsdXJlCisgKi8KKworCW1vdncJJEJVRkZFUlNFRywgJWJ4CisJbW92dwklYngsICVlcwkvKiBsb2FkICVlcyBzZWdtZW50IHdpdGggZGlzayBidWZmZXIgKi8KKworCXhvcncJJWJ4LCAlYngJLyogJWJ4ID0gMCwgcHV0IGl0IGF0IDAgaW4gdGhlIHNlZ21lbnQgKi8KKwltb3ZiCSQweDIsICVhaAkvKiBmdW5jdGlvbiAyICovCisJaW50CSQweDEzCisKKwlqYwlyZWFkX2Vycm9yCisKKwkvKiBzYXZlIHNvdXJjZSBzZWdtZW50ICovCisJbW92dwklZXMsICVieAorCQorY29weV9idWZmZXI6CQorCisJLyogbG9hZCBhZGRyZXNzZXMgZm9yIGNvcHkgZnJvbSBkaXNrIGJ1ZmZlciB0byBkZXN0aW5hdGlvbiAqLworCW1vdncJNiglZGkpLCAlZXMJLyogbG9hZCBkZXN0aW5hdGlvbiBzZWdtZW50ICovCisKKwkvKiByZXN0b3JlICVheCAqLworCXBvcHcJJWF4CisKKwkvKiBkZXRlcm1pbmUgdGhlIG5leHQgcG9zc2libGUgZGVzdGluYXRpb24gYWRkcmVzcyAocHJlc3VtaW5nCisJCTUxMiBieXRlIHNlY3RvcnMhKSAqLworCXNobHcJJDUsICVheAkJLyogc2hpZnQgJWF4IGZpdmUgYml0cyB0byB0aGUgbGVmdCAqLworCWFkZHcJJWF4LCA2KCVkaSkJLyogYWRkIHRoZSBjb3JyZWN0ZWQgdmFsdWUgdG8gdGhlIGRlc3RpbmF0aW9uCisJCQkJICAgYWRkcmVzcyBmb3IgbmV4dCB0aW1lICovCisKKwkvKiBzYXZlIGFkZHJlc3NpbmcgcmVncyAqLworCXB1c2hhCisJcHVzaHcJJWRzCisKKwkvKiBnZXQgdGhlIGNvcHkgbGVuZ3RoICovCisJc2hsdwkkNCwgJWF4CisJbW92dwklYXgsICVjeAorCisJeG9ydwklZGksICVkaQkvKiB6ZXJvIG9mZnNldCBvZiBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgKi8KKwl4b3J3CSVzaSwgJXNpCS8qIHplcm8gb2Zmc2V0IG9mIHNvdXJjZSBhZGRyZXNzZXMgKi8KKwltb3Z3CSVieCwgJWRzCS8qIHJlc3RvcmUgdGhlIHNvdXJjZSBzZWdtZW50ICovCisKKwljbGQJCS8qIHNldHMgdGhlIGNvcHkgZGlyZWN0aW9uIHRvIGZvcndhcmQgKi8KKworCS8qIHBlcmZvcm0gY29weSAqLworCXJlcAkJLyogc2V0cyBhIHJlcGVhdCAqLworCW1vdnNiCQkvKiB0aGlzIHJ1bnMgdGhlIGFjdHVhbCBjb3B5ICovCisKKwkvKiByZXN0b3JlIGFkZHJlc3NpbmcgcmVncyBhbmQgcHJpbnQgYSBkb3Qgd2l0aCBjb3JyZWN0IERTIAorCSAgIChNU0cgbW9kaWZpZXMgU0ksIHdoaWNoIGlzIHNhdmVkLCBhbmQgdW51c2VkIEFYIGFuZCBCWCkgKi8KKwlwb3B3CSVkcworCU1TRyhub3RpZmljYXRpb25fc3RlcCkKKwlwb3BhCisKKwkvKiBjaGVjayBpZiBmaW5pc2hlZCB3aXRoIHRoaXMgZGF0YXNldCAqLworCWNtcHcJJDAsIDQoJWRpKQorCWpuZQlzZXR1cF9zZWN0b3JzCisKKwkvKiB1cGRhdGUgcG9zaXRpb24gdG8gbG9hZCBmcm9tICovCisJc3VidwkkQk9PVFNFQ19MSVNUU0laRSwgJWRpCisKKwkvKiBqdW1wIHRvIGJvb3Rsb29wICovCisJam1wCWJvb3Rsb29wCisKKy8qIEVORCBPRiBNQUlOIExPT1AgKi8KKworYm9vdGl0OgorCS8qIHByaW50IGEgbmV3bGluZSAqLworCU1TRyhub3RpZmljYXRpb25fZG9uZSkKKwlwb3B3CSVkeAkvKiB0aGlzIG1ha2VzIHN1cmUgJWRsIGlzIG91ciAiYm9vdCIgZHJpdmUgKi8KKyNpZmRlZiBTVEFHRTFfNQorCWxqbXAJJDAsICQweDIyMDAKKyNlbHNlIC8qICEgU1RBR0UxXzUgKi8KKwlsam1wCSQwLCAkMHg4MjAwCisjZW5kaWYgLyogISBTVEFHRTFfNSAqLworCisKKy8qCisgKiBCSU9TIEdlb21ldHJ5IHRyYW5zbGF0aW9uIGVycm9yIChwYXN0IHRoZSBlbmQgb2YgdGhlIGRpc2sgZ2VvbWV0cnkhKS4KKyAqLworZ2VvbWV0cnlfZXJyb3I6CisJTVNHKGdlb21ldHJ5X2Vycm9yX3N0cmluZykKKwlqbXAJZ2VuZXJhbF9lcnJvcgorCisvKgorICogUmVhZCBlcnJvciBvbiB0aGUgZGlzay4KKyAqLworcmVhZF9lcnJvcjoKKwlNU0cocmVhZF9lcnJvcl9zdHJpbmcpCisKK2dlbmVyYWxfZXJyb3I6CisJTVNHKGdlbmVyYWxfZXJyb3Jfc3RyaW5nKQorCisvKiBnbyBoZXJlIHdoZW4geW91IG5lZWQgdG8gc3RvcCB0aGUgbWFjaGluZSBoYXJkIGFmdGVyIGFuIGVycm9yIGNvbmRpdGlvbiAqLworc3RvcDoJam1wCXN0b3AKKworI2lmZGVmIFNUQUdFMV81Citub3RpZmljYXRpb25fc3RyaW5nOgkuc3RyaW5nICJMb2FkaW5nIHN0YWdlMS41IgorI2Vsc2UKK25vdGlmaWNhdGlvbl9zdHJpbmc6CS5zdHJpbmcgIkxvYWRpbmcgc3RhZ2UyIgorI2VuZGlmCisKK25vdGlmaWNhdGlvbl9zdGVwOgkuc3RyaW5nICIuIgorbm90aWZpY2F0aW9uX2RvbmU6CS5zdHJpbmcgIlxyXG4iCisJCitnZW9tZXRyeV9lcnJvcl9zdHJpbmc6CS5zdHJpbmcgIkdlb20iCityZWFkX2Vycm9yX3N0cmluZzoJLnN0cmluZyAiUmVhZCIKK2dlbmVyYWxfZXJyb3Jfc3RyaW5nOgkuc3RyaW5nICIgRXJyb3IiCisKKy8qCisgKiBtZXNzYWdlOiB3cml0ZSB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgJXNpCisgKgorICogICBXQVJOSU5HOiB0cmFzaGVzICVzaSwgJWF4LCBhbmQgJWJ4CisgKi8KKworCS8qCisJICogVXNlIEJJT1MgImludCAxMEggRnVuY3Rpb24gMEVoIiB0byB3cml0ZSBjaGFyYWN0ZXIgaW4gdGVsZXR5cGUgbW9kZQorCSAqCSVhaCA9IDB4ZQklYWwgPSBjaGFyYWN0ZXIKKwkgKgklYmggPSBwYWdlCSVibCA9IGZvcmVncm91bmQgY29sb3IgKGdyYXBoaWNzIG1vZGVzKQorCSAqLworMToKKwltb3Z3CSQweDAwMDEsICVieAorCW1vdmIJJDB4ZSwgJWFoCisJaW50CSQweDEwCQkvKiBkaXNwbGF5IGEgYnl0ZSAqLworCisJaW5jdwklc2kKK21lc3NhZ2U6CisJbW92YgkoJXNpKSwgJWFsCisJY21wYgkkMCwgJWFsCisJam5lCTFiCS8qIGlmIG5vdCBlbmQgb2Ygc3RyaW5nLCBqbXAgdG8gZGlzcGxheSAqLworCXJldAorbGFzdGxpc3Q6CisKKy8qCisgKiAgVGhpcyBhcmVhIGlzIGFuIGVtcHR5IHNwYWNlIGJldHdlZW4gdGhlIG1haW4gYm9keSBvZiBjb2RlIGJlbG93IHdoaWNoCisgKiAgZ3Jvd3MgdXAgKGZpeGVkIGFmdGVyIGNvbXBpbGF0aW9uLCBidXQgYmV0d2VlbiByZWxlYXNlcyBpdCBtYXkgY2hhbmdlCisgKiAgaW4gc2l6ZSBlYXNpbHkpLCBhbmQgdGhlIGxpc3RzIG9mIHNlY3RvcnMgdG8gcmVhZCwgd2hpY2ggZ3Jvd3MgZG93bgorICogIGZyb20gYSBmaXhlZCB0b3AgbG9jYXRpb24uCisgKi8KKworCS53b3JkIDAKKwkud29yZCAwCisKKwkuID0gX3N0YXJ0ICsgMHgyMDAgLSBCT09UU0VDX0xJU1RTSVpFCisJCisgICAgICAgIC8qIGZpbGwgdGhlIGZpcnN0IGRhdGEgbGlzdGluZyB3aXRoIHRoZSBkZWZhdWx0ICovCitibG9ja2xpc3RfZGVmYXVsdF9zdGFydDoKKwkubG9uZyAyCQkvKiB0aGlzIGlzIHRoZSBzZWN0b3Igc3RhcnQgcGFyYW1ldGVyLCBpbiBsb2dpY2FsCisJCQkgICBzZWN0b3JzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBkaXNrLCBzZWN0b3IgMCAqLworYmxvY2tsaXN0X2RlZmF1bHRfbGVuOgorCQkJLyogdGhpcyBpcyB0aGUgbnVtYmVyIG9mIHNlY3RvcnMgdG8gcmVhZCAqLworI2lmZGVmIFNUQUdFMV81CisJLndvcmQgMAkJLyogdGhlIGNvbW1hbmQgImluc3RhbGwiIHdpbGwgZmlsbCB0aGlzIHVwICovCisjZWxzZQorCS53b3JkIChTVEFHRTJfU0laRSArIDUxMSkgPj4gOQorI2VuZGlmCitibG9ja2xpc3RfZGVmYXVsdF9zZWc6CisjaWZkZWYgU1RBR0UxXzUKKwkud29yZCAweDIyMAorI2Vsc2UKKwkud29yZCAweDgyMAkvKiB0aGlzIGlzIHRoZSBzZWdtZW50IG9mIHRoZSBzdGFydGluZyBhZGRyZXNzCisJCQkgICB0byBsb2FkIHRoZSBkYXRhIGludG8gKi8KKyNlbmRpZgorCQorZmlyc3RsaXN0OgkvKiB0aGlzIGxhYmVsIGhhcyB0byBiZSBhZnRlciB0aGUgbGlzdCBkYXRhISEhICovCmRpZmYgLS1naXQgYS9zdGFnZTIvc3RhcnRfZWx0b3JpdG8uUyBiL3N0YWdlMi9zdGFydF9lbHRvcml0by5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YTcxMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFnZTIvc3RhcnRfZWx0b3JpdG8uUwpAQCAtMCwwICsxLDMyNiBAQAorLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAxOTk0LTIwMDIgIEguIFBldGVyIEFudmluCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSwyMDA0CUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisJCisvKgorIE1vc3Qgb2YgdGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5ICJpc29saW51eC5hc20iIGZyb20gU1lTTElOVVggcGFja2FnZS4KKyBJdCBoYXMgYmVlbiB2ZXJ5IGhlYXZpbHkgbW9kaWZpZWQuCisqLworCisjZGVmaW5lIEFTTV9GSUxFCisjaW5jbHVkZSAic3RhZ2UxLmgiCisjaW5jbHVkZSAic2hhcmVkLmgiCisjaW5jbHVkZSAiaXNvOTY2MC5oIgorCisjaWZuZGVmIFNUQUdFMV81CisjaW5jbHVkZSAic3RhZ2UyX3NpemUuaCIKKyNlbmRpZgorCisKKwkvKiBBYnNvbHV0ZSBhZGRyZXNzZXMKKwkgICBUaGlzIG1ha2VzIHRoZSBhc3NlbWJsZXIgZ2VuZXJhdGUgdGhlIGFkZHJlc3Mgd2l0aG91dCBzdXBwb3J0CisJICAgZnJvbSB0aGUgbGlua2VyLiAoRUxGIGNhbid0IHJlbG9jYXRlIDE2LWJpdCBhZGRyZXNzZXMhKSAqLworI2RlZmluZSBBQlMoeCkJCQkoeC1fc3RhcnQrQk9PVFNFQ19MT0NBVElPTikKKworI2lmZGVmIFNUQUdFMV81CisjIGRlZmluZSBTVEFHRV9BRERSCQkweDIwMDAKKyNlbHNlCisjIGRlZmluZSBTVEFHRV9BRERSCQkweDgwMDAKKyNlbmRpZiAvKiBTVEFHRTFfNSAqLworCisJLyogUHJpbnQgbWVzc2FnZSBzdHJpbmcgKi8KKyNkZWZpbmUgTVNHKHgpCQkJbW92ICRBQlMoeCksICVzaTsgY2FsbCBtZXNzYWdlOworCisJLmZpbGUJInN0YXJ0X2VsdG9yaXRvLlMiCisKKwkudGV4dAorCisJLyogVGVsbCBHQVMgdG8gZ2VuZXJhdGUgMTYtYml0IGluc3RydWN0aW9ucyBzbyB0aGF0IHRoaXMgY29kZSB3b3JrcworCSAgIGluIHJlYWwgbW9kZS4gKi8KKwkuY29kZTE2CisKKwkuZ2xvYmwJc3RhcnQsIF9zdGFydAorCisvKgorICogUHJpbWFyeSBlbnRyeSBwb2ludC4JIEJlY2F1c2UgQklPU2VzIGFyZSBidWdneSwgd2Ugb25seSBsb2FkIHRoZSBmaXJzdAorICogQ0QtUk9NIHNlY3RvciAoMkspIG9mIHRoZSBmaWxlLCBzbyB0aGUgbnVtYmVyIG9uZSBwcmlvcml0eSBpcyBhY3R1YWxseQorICogbG9hZGluZyB0aGUgcmVzdC4KKyAqLworc3RhcnQ6Citfc3RhcnQ6CisJY2xpCisJbGptcAkkMCwgJEFCUyhyZWFsX3N0YXJ0KQorCisJLiA9IF9zdGFydCArIDgJCQkgICAgLyogUGFkIHRvIGZpbGUgb2Zmc2V0IDggKi8KKworCQkvKiBUaGlzIHRhYmxlIGdldHMgZmlsbGVkIGluIGJ5IG1raXNvZnMgdXNpbmcgdGhlCisJCSAgIC1ib290LWluZm8tdGFibGUgb3B0aW9uICovCitiaV9wdmQ6CQkubG9uZyAweERFQURCRUVGCSAgICAvKiBMQkEgb2YgcHJpbWFyeSB2b2x1bWUgZGVzY3JpcHQgKi8KK2JpX2ZpbGU6CS5sb25nIDB4REVBREJFRUYJICAgIC8qIExCQSBvZiBib290IGZpbGUgKi8KK2JpX2xlbmd0aDoJLmxvbmcgMHhERUFEQkVFRgkgICAgLyogTGVuZ3RoIG9mIGJvb3QgZmlsZSAqLworYmlfY3N1bToJLmxvbmcgMHhERUFEQkVFRgkgICAgLyogQ2hlY2tzdW0gb2YgYm9vdCBmaWxlICovCitiaV9yZXNlcnZlZDoJLnNwYWNlICgxMCo0KQkJICAgIC8qIFJlc2VydmVkICovCisKK3JlYWxfc3RhcnQ6CisJeG9yCSVheCwgJWF4CisJbW92CSVheCwgJXNzCisJbW92CSVheCwgJWRzCisJbW92CSVheCwgJWVzCisJbW92CSVheCwgJWZzCisJbW92CSVheCwgJWdzCisJbW92CSRTVEFHRTFfU1RBQ0tTRUcsICVzcAkgICAgLyogc2V0IHVwIHRoZSBSRUFMIHN0YWNrICovCisJc3RpCisJY2xkCisKKwkvKiBzYXZlIGRyaXZlIHJlZmVyZW5jZSBmaXJzdCB0aGluZyEgKi8KKwltb3YJJWRsLCBBQlMoQm9vdERyaXZlKQorCisJLyogcHJpbnQgYSBub3RpZmljYXRpb24gbWVzc2FnZSBvbiB0aGUgc2NyZWVuICovCisJTVNHKG5vdGlmaWNhdGlvbl9zdHJpbmcpCisKK2xvYWRfaW1hZ2U6CisJLyogU2V0IHVwIGJvb3QgZmlsZSBzZWN0b3IsIHNpemUsIGxvYWQgYWRkcmVzcyAqLworCW1vdglBQlMoYmlfbGVuZ3RoKSwgJWVheAorCWFkZAkkKElTT19TRUNUT1JfU0laRS0xKSwgJWVheAorCXNocgkkSVNPX1NFQ1RPUl9CSVRTLCAlZWF4CSAgICAvKiBkd29yZHMtPnNlY3RvcnMgKi8KKwltb3YJJWF4LCAlYnAJCSAgICAvKiBib290IGZpbGUgc2VjdG9ycyAqLworCW1vdgkkKFNUQUdFX0FERFIgPj4gNCksICVieAorCW1vdgklYngsICVlcworCXhvcgklYngsICVieAorCW1vdglBQlMoYmlfZmlsZSksICVlYXgKKwljYWxsCWdldGxpbnNlYworCW1vdgklZHMsICVheAorCW1vdgklYXgsICVlcworCisJTVNHKG5vdGlmaWNhdGlvbl9kb25lKQorYm9vdGl0OgorCS8qIHNhdmUgdGhlIHNlY3RvciBudW1iZXIgb2YgdGhlIHNlY29uZCBzZWN0b3IgaW4gJWVicCAqLworCW1vdgkkQUJTKGZpcnN0bGlzdCAtIEJPT1RTRUNfTElTVFNJWkUpLCAlc2kKKwltb3YJKCVzaSksICVlYnAKKwltb3YJQUJTKEJvb3REcml2ZSksICVkbAkgICAgLyogdGhpcyBtYWtlcyBzdXJlICVkbCBpcyBvdXIgImJvb3QiIGRyaXZlICovCisJbGptcAkkMCwgJChTVEFHRV9BRERSK1NFQ1RPUl9TSVpFKSAgLyoganVtcCB0byBtYWluKCkgaW4gYXNtLlMgKi8KKworLyogZ28gaGVyZSB3aGVuIHlvdSBuZWVkIHRvIHN0b3AgdGhlIG1hY2hpbmUgaGFyZCBhZnRlciBhbiBlcnJvciBjb25kaXRpb24gKi8KK3N0b3A6CWptcAlzdG9wCisKKworLyoKKyAqIEdldCBsaW5lYXIgc2VjdG9ycyAtIEVCSU9TIExCQSBhZGRyZXNzaW5nLCAyMDQ4LWJ5dGUgc2VjdG9ycy4KKyAqCisgKiBOb3RlIHRoYXQgd2UgY2FuJ3QgYWx3YXlzIGRvIHRoaXMgYXMgYSBzaW5nbGUgcmVxdWVzdCwgYmVjYXVzZSBhdCBsZWFzdAorICogUGhvZW5peCBCSU9TZXMgaGFzIGEgMTI3LXNlY3RvciBsaW1pdC4gIFRvIGJlIG9uIHRoZSBzYWZlIHNpZGUsIHN0aWNrCisgKiB0byAxNiBzZWN0b3JzICgzMkspIHBlciByZXF1ZXN0LgorICoKKyAqIElucHV0OgorICoJIEVBWAkgLSBMaW5lYXIgc2VjdG9yIG51bWJlcgorICoJIEVTOkJYCSAtIFRhcmdldCBidWZmZXIKKyAqCSBCUAkgLSBTZWN0b3IgY291bnQKKyAqLworZ2V0bGluc2VjOgorCW1vdgkkQUJTKGRhcGEpLCAlc2kJCSAgIC8qIExvYWQgdXAgdGhlIERBUEEgKi8KKwltb3YJJWJ4LCA0KCVzaSkKKwltb3YJJWVzLCAlYngKKwltb3YJJWJ4LCA2KCVzaSkKKwltb3YJJWVheCwgOCglc2kpCisxOgorCXB1c2gJJWJwCisJcHVzaAklc2kKKwljbXAJQUJTKE1heFRyYW5zZmVyKSwgJWJwCisJamJlCTJmCisJbW92CUFCUyhNYXhUcmFuc2ZlciksICVicAorMjoKKwltb3YJJWJwLCAyKCVzaSkKKwltb3YJQUJTKEJvb3REcml2ZSksICVkbAorCW1vdgkkMHg0MiwgJWFoCQkgICAgLyogRXh0ZW5kZWQgUmVhZCAqLworCWNhbGwJeGludDEzCisJcG9wCSVzaQorCXBvcAklYnAKKwltb3Z6d2wJMiglc2kpLCAlZWF4CQkgICAgLyogU2VjdG9ycyB3ZSByZWFkICovCisJYWRkCSVlYXgsIDgoJXNpKQkJICAgIC8qIEFkdmFuY2Ugc2VjdG9yIHBvaW50ZXIgKi8KKwlzdWIJJWF4LCAlYnAJCSAgICAvKiBTZWN0b3JzIGxlZnQgKi8KKwlzaGwJJChJU09fU0VDVE9SX0JJVFMtNCksICVheCAgIC8qIDIwNDgtYnl0ZSBzZWN0b3JzIC0+IHNlZ21lbnQgKi8KKwlhZGQJJWF4LCA2KCVzaSkJCSAgICAvKiBBZHZhbmNlIGJ1ZmZlciBwb2ludGVyICovCisKKwlwdXNoYWwKKwlNU0cobm90aWZpY2F0aW9uX3N0ZXApCisJcG9wYWwKKwljbXAJJDAsICVicAorCWphCTFiCisJbW92CTgoJXNpKSwgJWVheAkJICAgIC8qIFJldHVybiBuZXh0IHNlY3RvciAqLworCXJldAorCisvKgorICogSU5UIDEzaCB3aXRoIHJldHJ5CisgKi8KK3hpbnQxMzoKKwltb3ZiCSQ2LCBBQlMoUmV0cnlDb3VudCkKKwlwdXNoYWwKKy50cnk6CisJaW50CSQweDEzCisJamMJMWYKKwlhZGQJJCg4KjQpLCAlc3AJCSAgICAvKiBDbGVhbiB1cCBzdGFjayAqLworCXJldAorMToKKwltb3YJJWFoLCAlZGwJCSAgICAvKiBTYXZlIGVycm9yIGNvZGUgKi8KKwlkZWNiCUFCUyhSZXRyeUNvdW50KQorCWp6CS5yZWFsX2Vycm9yCisJbW92CUFCUyhSZXRyeUNvdW50KSwgJWFsCisJbW92CUFCUyhkYXBhKzIpLCAlYWgJICAgIC8qIFNlY3RvciB0cmFuc2ZlciBjb3VudCAqLworCWNtcAkkMiwgJWFsCQkJICAgIC8qIE9ubHkgMiBhdHRlbXB0cyBsZWZ0ICovCisJamEJMmYKKwltb3YJJDEsICVhaAkJCSAgICAvKiBEcm9wIHRyYW5zZmVyIHNpemUgdG8gMSAqLworCWptcAkuc2V0bWF4dHIKKzI6CisJY21wCSQzLCAlYWwKKwlqYQkzZgkJCSAgICAvKiBGaXJzdCB0aW1lLCBqdXN0IHRyeSBhZ2FpbiAqLworCXNocgkkMSwgJWFoCQkJICAgIC8qIE90aGVyd2lzZSwgdHJ5IHRvIHJlZHVjZSAqLworCWFkYwkkMCwgJWFoCQkJICAgIC8qIHRoZSBtYXggdHJhbnNmZXIgc2l6ZSwgYnV0IG5vdCAqLworLnNldG1heHRyOgorCW1vdgklYWgsIEFCUyhNYXhUcmFuc2ZlcikKKwltb3YJJWFoLCBBQlMoZGFwYSsyKQorMzoKKwlwb3BhbAorCWptcAkudHJ5CisKKy5yZWFsX2Vycm9yOgorCU1TRyhyZWFkX2Vycm9yX3N0cmluZykKKwltb3YJJWRsLCAlYWwKKwljYWxsCXByaW50aGV4MgorCXBvcGFsCisJam1wCXN0b3AKKworCisKKy8qCisgKiBtZXNzYWdlOiB3cml0ZSB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgJXNpCisgKgorICogICBXQVJOSU5HOiB0cmFzaGVzICVzaSwgJWF4LCBhbmQgJWJ4CisgKi8KKworCS8qCisJICogVXNlIEJJT1MgImludCAxMEggRnVuY3Rpb24gMEVoIiB0byB3cml0ZSBjaGFyYWN0ZXIgaW4gdGVsZXR5cGUgbW9kZQorCSAqCSVhaCA9IDB4ZQklYWwgPSBjaGFyYWN0ZXIKKwkgKgklYmggPSBwYWdlCSVibCA9IGZvcmVncm91bmQgY29sb3IgKGdyYXBoaWNzIG1vZGVzKQorCSAqLworMToKKwltb3YJJDB4MDAwMSwgJWJ4CisJbW92CSQweDBFLCAlYWgKKwlpbnQJJDB4MTAJCS8qIGRpc3BsYXkgYSBieXRlICovCisKK21lc3NhZ2U6CisJbG9kc2IKKwlvcgklYWwsICVhbAorCWpuZQkxYgkJLyogaWYgbm90IGVuZCBvZiBzdHJpbmcsIGptcCB0byBkaXNwbGF5ICovCisJcmV0CisKKy8qCisgKiBwcmludGhleFsyNDhdOiBXcml0ZSBhIGhleCBudW1iZXIgaW4gKEFMLCBBWCwgRUFYKSB0byB0aGUgY29uc29sZQorICovCitwcmludGhleDI6CisJcHVzaGFsCisJcm9sCSQyNCwgJWVheAorCW1vdgkkMiwgJWN4CisJam1wCTFmCitwcmludGhleDQ6CisJcHVzaGFsCisJcm9sCSQxNiwgJWVheAorCW1vdgkkNCwgJWN4CisJam1wCTFmCitwcmludGhleDg6CisJcHVzaGFsCisJbW92CSQ4LCAlY3gKKzE6CisJcm9sCSQ0LCAlZWF4CisJcHVzaAklZWF4CisJYW5kCSQweDBGLCAlYWwKKwljbXAJJDEwLCAlYWwKKwlqYWUJLmhpZ2gKKy5sb3c6CWFkZAkkKCcwJyksICVhbAorCWptcAkyZgorLmhpZ2g6CWFkZAkkKCdBJy0xMCksICVhbAorMjoKKwltb3YJJDB4MDAwMSwgJWJ4CisJbW92CSQweDBFLCAlYWgKKwlpbnQJJDB4MTAJCS8qIGRpc3BsYXkgYSBjaGFyICovCisJcG9wCSVlYXgKKwlsb29wCTFiCisJcG9wYWwKKwlyZXQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNUQUdFMV81Citub3RpZmljYXRpb25fc3RyaW5nOgkuc3RyaW5nICJMb2FkaW5nIHN0YWdlMS41ICIKKyNlbHNlCitub3RpZmljYXRpb25fc3RyaW5nOgkuc3RyaW5nICJMb2FkaW5nIHN0YWdlMiAiCisjZW5kaWYKKworbm90aWZpY2F0aW9uX3N0ZXA6CS5zdHJpbmcgIi4iCitub3RpZmljYXRpb25fZG9uZToJLnN0cmluZyAiXHJcbiIKKworcmVhZF9lcnJvcl9zdHJpbmc6CS5zdHJpbmcgIlJlYWQgZXJyb3IgMHgiCisKKy8qCisgKiBFQklPUyBkaXNrIGFkZHJlc3MgcGFja2V0CisgKi8KKwkJLmFsaWduIDgKK2RhcGE6CQkuYnl0ZSAxNgkJICAgLyogUGFja2V0IHNpemUgKi8KKwkJLmJ5dGUgMAkJCSAgIC8qIHJlc2VydmVkICovCisJCS53b3JkIDAJCQkgICAvKiArMiBCbG9jayBjb3VudCAqLworCQkud29yZCAwCQkJICAgLyogKzQgT2Zmc2V0IG9mIGJ1ZmZlciAqLworCQkud29yZCAwCQkJICAgLyogKzYgU2VnbWVudCBvZiBidWZmZXIgKi8KKwkJLmxvbmcgMAkJCSAgIC8qICs4IExCQSAoTFNXKSAqLworCQkubG9uZyAwCQkJICAgLyogK0MgTEJBIChNU1cpICovCisKK1ZBUklBQkxFKEJvb3REcml2ZSkKKwkuYnl0ZSAweEZGCitWQVJJQUJMRShNYXhUcmFuc2ZlcikKKwkud29yZCAxNgkJCSAgIC8qIE1heCBzZWN0b3JzIHBlciB0cmFuc2ZlciAoMzJLYikgKi8KK1ZBUklBQkxFKFJldHJ5Q291bnQpCisJLmJ5dGUgMAorCisKKy8qCisgKiAgVGhpcyBhcmVhIGlzIGFuIGVtcHR5IHNwYWNlIGJldHdlZW4gdGhlIG1haW4gYm9keSBvZiBjb2RlIGJlbG93IHdoaWNoCisgKiAgZ3Jvd3MgdXAgKGZpeGVkIGFmdGVyIGNvbXBpbGF0aW9uLCBidXQgYmV0d2VlbiByZWxlYXNlcyBpdCBtYXkgY2hhbmdlCisgKiAgaW4gc2l6ZSBlYXNpbHkpLCBhbmQgdGhlIGxpc3RzIG9mIHNlY3RvcnMgdG8gcmVhZCwgd2hpY2ggZ3Jvd3MgZG93bgorICogIGZyb20gYSBmaXhlZCB0b3AgbG9jYXRpb24uCisgKi8KKworCS53b3JkIDAKKwkud29yZCAwCisKKwkuID0gX3N0YXJ0ICsgU0VDVE9SX1NJWkUgLSBCT09UU0VDX0xJU1RTSVpFCisKKwkvKiBmaWxsIHRoZSBmaXJzdCBkYXRhIGxpc3Rpbmcgd2l0aCB0aGUgZGVmYXVsdCAqLworYmxvY2tsaXN0X2RlZmF1bHRfc3RhcnQ6LyogdGhpcyBpcyB0aGUgc2VjdG9yIHN0YXJ0IHBhcmFtZXRlciwgaW4gbG9naWNhbAorCQkJICAgc2VjdG9ycyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZGlzaywgc2VjdG9yIDAgKi8KKwkubG9uZyAwCisKK2Jsb2NrbGlzdF9kZWZhdWx0X2xlbjoJLyogdGhpcyBpcyB0aGUgbnVtYmVyIG9mIHNlY3RvcnMgdG8gcmVhZCAqLworI2lmZGVmIFNUQUdFMV81CisJLndvcmQgMAorI2Vsc2UKKwkud29yZCAoU1RBR0UyX1NJWkUgKyBJU09fU0VDVE9SX1NJWkUgLSAxKSA+PiBJU09fU0VDVE9SX0JJVFMKKyNlbmRpZgorYmxvY2tsaXN0X2RlZmF1bHRfc2VnOgkvKiB0aGlzIGlzIHRoZSBzZWdtZW50IG9mIHRoZSBzdGFydGluZyBhZGRyZXNzCisJCQkgICB0byBsb2FkIHRoZSBkYXRhIGludG8gKi8KKwkud29yZCAoU1RBR0VfQUREUiArIFNFQ1RPUl9TSVpFKSA+PiA0CisKK2ZpcnN0bGlzdDoJLyogdGhpcyBsYWJlbCBoYXMgdG8gYmUgYWZ0ZXIgdGhlIGxpc3QgZGF0YSEhISAqLwpkaWZmIC0tZ2l0IGEvc3RhZ2UyL3Rlcm0uaCBiL3N0YWdlMi90ZXJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI2MWM3YwotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMi90ZXJtLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qIHRlcm0uaCAtIGRlZmluaXRpb25zIGZvciB0ZXJtaW5hbCBoYW5kbGluZyAqLworLyoKKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgR1JVQl9URVJNX0hFQURFUgorI2RlZmluZSBHUlVCX1RFUk1fSEVBREVSCTEKKworLyogVGhlc2UgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSB2YXJpb3VzIGNvbG9yIHN0YXRlcyB3ZSB1c2UgKi8KK3R5cGVkZWYgZW51bQoreworICAvKiByZXByZXNlbnRzIHRoZSBjb2xvciB1c2VkIHRvIGRpc3BsYXkgYWxsIHRleHQgdGhhdCBkb2VzIG5vdCB1c2UgdGhlIHVzZXIKKyAgICogZGVmaW5lZCBjb2xvcnMgYmVsb3cKKyAgICovCisgIENPTE9SX1NUQVRFX1NUQU5EQVJELAorICAvKiByZXByZXNlbnRzIHRoZSB1c2VyIGRlZmluZWQgY29sb3JzIGZvciBub3JtYWwgdGV4dCAqLworICBDT0xPUl9TVEFURV9OT1JNQUwsCisgIC8qIHJlcHJlc2VudHMgdGhlIHVzZXIgZGVmaW5lZCBjb2xvcnMgZm9yIGhpZ2hsaWdodGVkIHRleHQgKi8KKyAgQ09MT1JfU1RBVEVfSElHSExJR0hUCit9IGNvbG9yX3N0YXRlOworCisjaWZuZGVmIFNUQUdFMV81CisKKy8qIEZsYWdzIGZvciByZXByZXNlbnRpbmcgdGhlIGNhcGFiaWxpdGllcyBvZiBhIHRlcm1pbmFsLiAgKi8KKy8qIFNvbWUgbm90ZXMgYWJvdXQgdGhlIGZsYWdzOgorICAgLSBUaGVzZSBmbGFncyBhcmUgdXNlZCBieSBoaWdoZXItbGV2ZWwgZnVuY3Rpb25zIGJ1dCBub3QgdGVybWluYWxzCisgICB0aGVtc2VsdmVzLgorICAgLSBJZiBhIHRlcm1pbmFsIGlzIGR1bWIsIHlvdSBtYXkgYXNzdW1lIHRoYXQgb25seSBwdXRjaGFyLCBnZXRrZXkgYW5kCisgICBjaGVja2tleSBhcmUgY2FsbGVkLgorICAgLSBTb21lIGZhbmN5IGZlYXR1cmVzIChub2N1cnNvciwgc2V0Y29sb3IsIGFuZCBoaWdobGlnaHQpIGNhbiBiZSBzZXQgdG8KKyAgIE5VTEwuICAqLworCisvKiBTZXQgd2hlbiBpbnB1dCBjaGFyYWN0ZXJzIHNob3VsZG4ndCBiZSBlY2hvZWQgYmFjay4gICovCisjZGVmaW5lIFRFUk1fTk9fRUNITwkJKDEgPDwgMCkKKy8qIFNldCB3aGVuIHRoZSBlZGl0aW5nIGZlYXR1cmUgc2hvdWxkIGJlIGRpc2FibGVkLiAgKi8KKyNkZWZpbmUgVEVSTV9OT19FRElUCQkoMSA8PCAxKQorLyogU2V0IHdoZW4gdGhlIHRlcm1pbmFsIGNhbm5vdCBkbyBmYW5jeSB0aGluZ3MuICAqLworI2RlZmluZSBURVJNX0RVTUIJCSgxIDw8IDIpCisvKiBTZXQgd2hlbiB0aGUgdGVybWluYWwgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQuICAqLworI2RlZmluZSBURVJNX05FRURfSU5JVAkJKDEgPDwgMTYpCisKK3N0cnVjdCB0ZXJtX2VudHJ5Cit7CisgIC8qIFRoZSBuYW1lIG9mIGEgdGVybWluYWwuICAqLworICBjb25zdCBjaGFyICpuYW1lOworICAvKiBUaGUgZmVhdHVyZSBmbGFncyBkZWZpbmVkIGFib3ZlLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgLyogUHV0IGEgY2hhcmFjdGVyLiAgKi8KKyAgdm9pZCAoKnB1dGNoYXIpIChpbnQgYyk7CisgIC8qIENoZWNrIGlmIGFueSBpbnB1dCBjaGFyYWN0ZXIgaXMgYXZhaWxhYmxlLiAgKi8KKyAgaW50ICgqY2hlY2trZXkpICh2b2lkKTsKKyAgLyogR2V0IGEgY2hhcmFjdGVyLiAgKi8KKyAgaW50ICgqZ2V0a2V5KSAodm9pZCk7CisgIC8qIEdldCB0aGUgY3Vyc29yIHBvc2l0aW9uLiBUaGUgcmV0dXJuIHZhbHVlIGlzICgoWCA8PCA4KSB8IFkpLiAgKi8KKyAgaW50ICgqZ2V0eHkpICh2b2lkKTsKKyAgLyogR28gdG8gdGhlIHBvc2l0aW9uIChYLCBZKS4gICovCisgIHZvaWQgKCpnb3RveHkpIChpbnQgeCwgaW50IHkpOworICAvKiBDbGVhciB0aGUgc2NyZWVuLiAgKi8KKyAgdm9pZCAoKmNscykgKHZvaWQpOworICAvKiBTZXQgdGhlIGN1cnJlbnQgY29sb3IgdG8gYmUgdXNlZCAqLworICB2b2lkICgqc2V0Y29sb3JzdGF0ZSkgKGNvbG9yX3N0YXRlIHN0YXRlKTsKKyAgLyogU2V0IHRoZSBub3JtYWwgY29sb3IgYW5kIHRoZSBoaWdobGlnaHQgY29sb3IuIFRoZSBmb3JtYXQgb2YgZWFjaAorICAgICBjb2xvciBpcyBWR0Ency4gICovCisgIHZvaWQgKCpzZXRjb2xvcikgKGludCBub3JtYWxfY29sb3IsIGludCBoaWdobGlnaHRfY29sb3IpOworICAvKiBUdXJuIG9uL29mZiB0aGUgY3Vyc29yLiAgKi8KKyAgaW50ICgqc2V0Y3Vyc29yKSAoaW50IG9uKTsKK307CisKKy8qIFRoaXMgbGlzdHMgdXAgYXZhaWxhYmxlIHRlcm1pbmFscy4gICovCitleHRlcm4gc3RydWN0IHRlcm1fZW50cnkgdGVybV90YWJsZVtdOworLyogVGhpcyBwb2ludHMgdG8gdGhlIGN1cnJlbnQgdGVybWluYWwuIFRoaXMgaXMgdXNlZnVsLCBiZWNhdXNlIG9ubHkKKyAgIGEgc2luZ2xlIHRlcm1pbmFsIGlzIGVuYWJsZWQgbm9ybWFsbHkuICAqLworZXh0ZXJuIHN0cnVjdCB0ZXJtX2VudHJ5ICpjdXJyZW50X3Rlcm07CisKKyNlbmRpZiAvKiAhIFNUQUdFMV81ICovCisKKy8qIFRoZSBjb25zb2xlIHN0dWZmLiAgKi8KK2V4dGVybiBpbnQgY29uc29sZV9jdXJyZW50X2NvbG9yOwordm9pZCBjb25zb2xlX3B1dGNoYXIgKGludCBjKTsKKworI2lmbmRlZiBTVEFHRTFfNQoraW50IGNvbnNvbGVfY2hlY2trZXkgKHZvaWQpOworaW50IGNvbnNvbGVfZ2V0a2V5ICh2b2lkKTsKK2ludCBjb25zb2xlX2dldHh5ICh2b2lkKTsKK3ZvaWQgY29uc29sZV9nb3RveHkgKGludCB4LCBpbnQgeSk7Cit2b2lkIGNvbnNvbGVfY2xzICh2b2lkKTsKK3ZvaWQgY29uc29sZV9zZXRjb2xvcnN0YXRlIChjb2xvcl9zdGF0ZSBzdGF0ZSk7Cit2b2lkIGNvbnNvbGVfc2V0Y29sb3IgKGludCBub3JtYWxfY29sb3IsIGludCBoaWdobGlnaHRfY29sb3IpOworaW50IGNvbnNvbGVfc2V0Y3Vyc29yIChpbnQgb24pOworI2VuZGlmCisKKyNpZmRlZiBTVVBQT1JUX1NFUklBTAordm9pZCBzZXJpYWxfcHV0Y2hhciAoaW50IGMpOworaW50IHNlcmlhbF9jaGVja2tleSAodm9pZCk7CitpbnQgc2VyaWFsX2dldGtleSAodm9pZCk7CitpbnQgc2VyaWFsX2dldHh5ICh2b2lkKTsKK3ZvaWQgc2VyaWFsX2dvdG94eSAoaW50IHgsIGludCB5KTsKK3ZvaWQgc2VyaWFsX2NscyAodm9pZCk7Cit2b2lkIHNlcmlhbF9zZXRjb2xvcnN0YXRlIChjb2xvcl9zdGF0ZSBzdGF0ZSk7CisjZW5kaWYKKworI2lmZGVmIFNVUFBPUlRfSEVSQ1VMRVMKK3ZvaWQgaGVyY3VsZXNfcHV0Y2hhciAoaW50IGMpOworaW50IGhlcmN1bGVzX2dldHh5ICh2b2lkKTsKK3ZvaWQgaGVyY3VsZXNfZ290b3h5IChpbnQgeCwgaW50IHkpOwordm9pZCBoZXJjdWxlc19jbHMgKHZvaWQpOwordm9pZCBoZXJjdWxlc19zZXRjb2xvcnN0YXRlIChjb2xvcl9zdGF0ZSBzdGF0ZSk7Cit2b2lkIGhlcmN1bGVzX3NldGNvbG9yIChpbnQgbm9ybWFsX2NvbG9yLCBpbnQgaGlnaGxpZ2h0X2NvbG9yKTsKK2ludCBoZXJjdWxlc19zZXRjdXJzb3IgKGludCBvbik7CisjZW5kaWYKKworI2VuZGlmIC8qICEgR1JVQl9URVJNX0hFQURFUiAqLwpkaWZmIC0tZ2l0IGEvc3RhZ2UyL3Rlcm1pbmZvLmMgYi9zdGFnZTIvdGVybWluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWMxNTc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3RhZ2UyL3Rlcm1pbmZvLmMKQEAgLTAsMCArMSwyNTggQEAKKy8qIHRlcm1pbmZvLmMgLSByZWFkIGEgdGVybWluZm8gZW50cnkgZnJvbSB0aGUgY29tbWFuZCBsaW5lICovCisvKgorICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwNCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHZhcmlvdXMgZnVuY3Rpb25zIGRlYWxpbmcgd2l0aCBkaWZmZXJlbnQgCisgKiB0ZXJtaW5hbCBjYXBhYmlsaXRpZXMuIEl0IGtub3dzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSB2dDUyIGFuZCB2dDEwMCAKKyAqIHRlcm1pbmFsIChhbmQgbXVjaCBtb3JlKSBhbmQgaXMgbWFpbmx5IHVzZWQgdGhlIHRlcm1pbmFsIGVtdWxhdGlvbgorICogaW4gdGhlIHNlcmlhbCBkcml2ZXIuCisgKi8KKworI2luY2x1ZGUgPHNoYXJlZC5oPgorI2luY2x1ZGUgInRlcm1pbmZvLmgiCisjaW5jbHVkZSAidHBhcm0uaCIKKyNpbmNsdWRlICJzZXJpYWwuaCIKKworLyogQ3VycmVudCB0ZXJtaW5hbCBjYXBhYmlsaXRpZXMuIERlZmF1bHQgaXMgInZ0MTAwIi4gICovCitzdHJ1Y3QgdGVybWluZm8gdGVybSA9CisgIHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICA9ICJ2dDEwMCIsCisgICAgLmN1cnNvcl9hZGRyZXNzICAgICAgPSAiXGVbJWklcDElZDslcDIlZEgiLAorICAgIC5jbGVhcl9zY3JlZW4gICAgICAgID0gIlxlW0hcZVtKIiwKKyAgICAuZW50ZXJfc3RhbmRvdXRfbW9kZSA9ICJcZVs3bSIsCisgICAgLmV4aXRfc3RhbmRvdXRfbW9kZSAgPSAiXGVbbSIKKyAgfTsKKworLyogQSBudW1iZXIgb2YgZXNjYXBlIHNlcXVlbmNlcyBhcmUgcHJvdmlkZWQgaW4gdGhlIHN0cmluZyB2YWx1ZWQKKyAgIGNhcGFiaWxpdGllcyBmb3IgZWFzeSBlbmNvZGluZyBvZiBjaGFyYWN0ZXJzIHRoZXJlLiAgQm90aCBcRSBhbmQgXGUKKyAgIG1hcCB0byBhbiBFU0NBUEUgY2hhcmFjdGVyLCBeeCBtYXBzIHRvIGEgY29udHJvbC14IGZvciBhbnkKKyAgIGFwcHJvcHJpYXRlIHgsIGFuZCB0aGUgc2VxdWVuY2VzIFxuIFxsIFxyIFx0IFxiIFxmIFxzIGdpdmUgYQorICAgbmV3bGluZSwgbGluZS1mZWVkLCByZXR1cm4sIHRhYiwgYmFja3NwYWNlLCBmb3JtLWZlZWQsIGFuZCBzcGFjZS4KKyAgIE90aGVyIGVzY2FwZXMgaW5jbHVkZSBcXiBmb3IgXiwgXFwgZm9yIFwsIFwsIGZvciBjb21tYSwgXDogZm9yIDosCisgICBhbmQgXDAgZm9yIG51bGwuICAoXDAgd2lsbCBwcm9kdWNlIFwyMDAsIHdoaWNoIGRvZXMgbm90IHRlcm1pbmF0ZSBhCisgICBzdHJpbmcgYnV0IGJlaGF2ZXMgYXMgYSBudWxsIGNoYXJhY3RlciBvbiBtb3N0IHRlcm1pbmFscywgcHJvdmlkrQorICAgaW5nIENTNyBpcyBzcGVjaWZpZWQuICBTZWUgc3R0eSgxKS4pICBGaW5hbGx5LCBjaGFyYWN0ZXJzIG1heSBiZQorICAgZ2l2ZW4gYXMgdGhyZWUgb2N0YWwgZGlnaXRzIGFmdGVyIGEgXC4gICovCisKK2NoYXIgKgordGlfdW5lc2NhcGVfbWVtb3J5IChjb25zdCBjaGFyICppbiwgY29uc3QgY2hhciAqZW5kKSAKK3sKKyAgc3RhdGljIGNoYXIgb3V0X2J1ZmZlclsyNTZdOworICBjaGFyIGM7CisgIGNoYXIgKm91dDsKKworICBvdXQgPSBvdXRfYnVmZmVyOworICBkbworICAgIHsKKyAgICAgIGMgPSAqKGluKyspOworICAgICAgc3dpdGNoIChjKSAKKwl7CisJY2FzZSAnXic6CisJICBpZiAoKmluID49ICdBJyAmJiAqaW4gPD0gJ1onKQorCSAgICB7CisJICAgICAgKm91dCA9ICgqaW4pIC0gJ0EnOworCSAgICAgIGluKys7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgICpvdXQgPSAnXic7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgJ1xcJzoKKwkgIGMgPSAqKGluKyspOworCSAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorCSAgICB7CisJICAgICAgLy8gb2N0YWwgbnVtYmVyCisJICAgICAgaW50IG4gPSAwOworCSAgICAgIGRvCisJCXsKKwkJICBuID0gKG4gPDwgNCkgfCAoYyAtICcwJyk7CisJCSAgYyA9ICooaW4rKyk7CisJCX0KKwkgICAgICB3aGlsZSAoYyA+PSAnMCcgJiYgYyA8PSAnOScpOworCSAgICAgIAorCSAgICAgICpvdXQrKyA9IChjaGFyKShuICYgMHhmZik7CisJICAgICAgCisJICAgICAgLy8gcmVkbyBsYXN0IGNoYXJhY3RlcgorCSAgICAgIGluLS07CisJICAgICAgCisJICAgICAgYnJlYWs7CisJICAgIH0gCisKKwkgIHN3aXRjaCAoYykgCisJICAgIHsKKwkgICAgY2FzZSAnZSc6CisJICAgIGNhc2UgJ0UnOgorCSAgICAgICpvdXQrKyA9ICdcZSc7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ24nOgorCSAgICAgICpvdXQrKyA9ICdcbic7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ3InOgorCSAgICAgICpvdXQrKyA9ICdccic7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ3QnOgorCSAgICAgICpvdXQrKyA9ICdcdCc7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ2InOgorCSAgICAgICpvdXQrKyA9ICdcYic7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ2YnOgorCSAgICAgICpvdXQrKyA9ICdcZic7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ3MnOgorCSAgICAgICpvdXQrKyA9ICcgJzsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnXFwnOgorCSAgICAgICpvdXQrKyA9ICdcXCc7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ14nOgorCSAgICAgICpvdXQrKyA9ICdeJzsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnLCc6CisJICAgICAgKm91dCsrID0gJywnOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICc6JzoKKwkgICAgICAqb3V0KysgPSAnOic7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJzAnOgorCSAgICAgICpvdXQrKyA9ICdcMjAwJzsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICpvdXQrKyA9IGM7CisJICBicmVhazsKKwl9CisgICAgfQorICB3aGlsZSAoaW4gPD0gZW5kKTsKKyAgCisgIHJldHVybiBvdXRfYnVmZmVyOworfQorCitjaGFyICoKK3RpX3VuZXNjYXBlX3N0cmluZyAoY29uc3QgY2hhciAqaW4pIAoreworICByZXR1cm4gdGlfdW5lc2NhcGVfbWVtb3J5IChpbiwgaW4gKyBncnViX3N0cmxlbiAoaW4pKTsKK30KKworLyogY29udmVydCBhIG1lbW9yeSByZWdpb24gY29udGFpbmluZyBiaW5hcnkgY2hhcmFjdGVyIGludG8gYW4gZXh0ZXJuYWwKKyAqIGFzY2lpIHJlcHJlc2VudGF0aW9uLiBUaGUgYmluYXJ5IGNoYXJhY3RlcnMgd2lsbCBiZSByZXBsYWNlZCBieSBhbgorICogImVjc2FwZSBub3RhdGlvbiIuIEUuZy4gIjAzMyIgd2lsbCBiZWNvbWUgIlxlIi4gKi8KK2NoYXIgKgordGlfZXNjYXBlX21lbW9yeSAoY29uc3QgY2hhciAqaW4sIGNvbnN0IGNoYXIgKmVuZCkgCit7CisgIHN0YXRpYyBjaGFyIG91dF9idWZmZXJbMjU2XTsKKyAgY2hhciBjOworICBjaGFyICpvdXQ7CisKKyAgb3V0ID0gb3V0X2J1ZmZlcjsKKyAgZG8KKyAgICB7CisgICAgICBjID0gKihpbisrKTsKKyAgICAgIHN3aXRjaCAoYykKKwl7CisJY2FzZSAnXGUnOgorCSAgKm91dCsrID0gJ1xcJzsgKm91dCsrID0gJ2UnOyBicmVhazsKKwljYXNlICcgJzoKKwkgICpvdXQrKyA9ICdcXCc7ICpvdXQrKyA9ICdzJzsgYnJlYWs7CisJY2FzZSAnXFwnOgorCSAgKm91dCsrID0gJ1xcJzsgKm91dCsrID0gJ1xcJzsgYnJlYWs7CisJY2FzZSAnMCcgLi4uICc5JzoKKwljYXNlICdhJyAuLi4gJ3onOgorCWNhc2UgJ0EnIC4uLiAnWic6CisJY2FzZSAnJSc6CisJY2FzZSAnKyc6CisJY2FzZSAnLSc6CisJY2FzZSAnKic6CisJY2FzZSAnLyc6CisJY2FzZSAnOyc6CisJY2FzZSAnOic6CisJY2FzZSAneyc6CisJY2FzZSAnfSc6CisJY2FzZSAnWyc6CisJY2FzZSAnXSc6CisJICAqb3V0KysgPSBjOyBicmVhazsKKwljYXNlIDAgLi4uIDI1OgorCSAgKm91dCsrID0gJ14nOyAqb3V0KysgPSAnQScgKyBjOyBicmVhazsKKwlkZWZhdWx0OgorCSAgKm91dCsrID0gJ1xcJzsgCisJICAqb3V0KysgPSAoKGMgPj4gOCkgJiA3KSArICcwJzsKKwkgICpvdXQrKyA9ICgoYyA+PiA0KSAmIDcpICsgJzAnOworCSAgKm91dCsrID0gKChjID4+IDApICYgNykgKyAnMCc7CisJICBicmVhazsKKwl9CisgICAgfQorICB3aGlsZSAoaW4gPCBlbmQpOworICAKKyAgKm91dCsrID0gMDsKKyAgCisgIHJldHVybiBvdXRfYnVmZmVyOworfQorCisvKiBjb252ZXJ0IGEgc3RyaW5nIGNvbnRhaW5pbmcgYmluYXJ5IGNoYXJhY3RlciBpbnRvIGFuIGV4dGVybmFsIGFzY2lpCisgKiByZXByZXNlbnRhdGlvbi4gKi8KK2NoYXIgKgordGlfZXNjYXBlX3N0cmluZyAoY29uc3QgY2hhciAqaW4pIAoreworICByZXR1cm4gdGlfZXNjYXBlX21lbW9yeSAoaW4sIGluICsgZ3J1Yl9zdHJsZW4gKGluKSk7Cit9CisKKy8qIG1vdmUgdGhlIGN1cnNvciB0byB0aGUgZ2l2ZW4gcG9zaXRpb24gc3RhcnRpbmcgd2l0aCAiMCIuICovCit2b2lkCit0aV9jdXJzb3JfYWRkcmVzcyAoaW50IHgsIGludCB5KQoreworICBncnViX3B1dHN0ciAoZ3J1Yl90cGFybSAodGVybS5jdXJzb3JfYWRkcmVzcywgeSwgeCkpOworfQorCisvKiBjbGVhciB0aGUgc2NyZWVuLiAqLwordm9pZCAKK3RpX2NsZWFyX3NjcmVlbiAodm9pZCkKK3sKKyAgZ3J1Yl9wdXRzdHIgKGdydWJfdHBhcm0gKHRlcm0uY2xlYXJfc2NyZWVuKSk7Cit9CisKKy8qIGVudGVyIHJldmVyc2UgdmlkZW8gKi8KK3ZvaWQgCit0aV9lbnRlcl9zdGFuZG91dF9tb2RlICh2b2lkKQoreworICBncnViX3B1dHN0ciAoZ3J1Yl90cGFybSAodGVybS5lbnRlcl9zdGFuZG91dF9tb2RlKSk7Cit9CisKKy8qIGV4aXQgcmV2ZXJzZSB2aWRlbyAqLwordm9pZCAKK3RpX2V4aXRfc3RhbmRvdXRfbW9kZSAodm9pZCkKK3sKKyAgZ3J1Yl9wdXRzdHIgKGdydWJfdHBhcm0gKHRlcm0uZXhpdF9zdGFuZG91dF9tb2RlKSk7Cit9CisKKy8qIHNldCB0aGUgY3VycmVudCB0ZXJtaW5hbCBlbXVsYXRpb24gdG8gdXNlICovCit2b2lkIAordGlfc2V0X3Rlcm0gKGNvbnN0IHN0cnVjdCB0ZXJtaW5mbyAqbmV3KQoreworICBncnViX21lbW1vdmUgKCZ0ZXJtLCBuZXcsIHNpemVvZiAoc3RydWN0IHRlcm1pbmZvKSk7Cit9CisKKy8qIGdldCB0aGUgY3VycmVudCB0ZXJtaW5hbCBlbXVsYXRpb24gKi8KK3ZvaWQKK3RpX2dldF90ZXJtKHN0cnVjdCB0ZXJtaW5mbyAqY29weSkKK3sKKyAgZ3J1Yl9tZW1tb3ZlIChjb3B5LCAmdGVybSwgc2l6ZW9mIChzdHJ1Y3QgdGVybWluZm8pKTsKK30KZGlmZiAtLWdpdCBhL3N0YWdlMi90ZXJtaW5mby5oIGIvc3RhZ2UyL3Rlcm1pbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU1OTc2MQotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMi90ZXJtaW5mby5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qIHRlcm1pbmZvLmggLSByZWFkIGEgdGVybWluZm8gZW50cnkgZnJvbSB0aGUgY29tbWFuZCBsaW5lICovCisvKgorICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwMywyMDA0ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgR1JVQl9URVJNQ0FQX0hFQURFUgorI2RlZmluZSBHUlVCX1RFUk1DQVBfSEVBREVSCTEKKworI2RlZmluZSBURVJNSU5GT19MRU4gNDAKKwordHlwZWRlZiBzdHJ1Y3QgdGVybWluZm8KK3sKKyAgY2hhciBuYW1lW1RFUk1JTkZPX0xFTl07CisgIGNoYXIgY3Vyc29yX2FkZHJlc3NbVEVSTUlORk9fTEVOXTsKKyAgY2hhciBjbGVhcl9zY3JlZW5bVEVSTUlORk9fTEVOXTsKKyAgY2hhciBlbnRlcl9zdGFuZG91dF9tb2RlW1RFUk1JTkZPX0xFTl07CisgIGNoYXIgZXhpdF9zdGFuZG91dF9tb2RlW1RFUk1JTkZPX0xFTl07Cit9Cit0ZXJtaW5mbzsKKworDAorLyogRnVuY3Rpb24gcHJvdG90eXBlcy4gICovCitjaGFyICp0aV9lc2NhcGVfbWVtb3J5IChjb25zdCBjaGFyICppbiwgY29uc3QgY2hhciAqZW5kKTsKK2NoYXIgKnRpX2VzY2FwZV9zdHJpbmcgKGNvbnN0IGNoYXIgKmluKTsKK2NoYXIgKnRpX3VuZXNjYXBlX21lbW9yeSAoY29uc3QgY2hhciAqaW4sIGNvbnN0IGNoYXIgKmVuZCk7CitjaGFyICp0aV91bmVzY2FwZV9zdHJpbmcgKGNvbnN0IGNoYXIgKmluKTsKKwordm9pZCB0aV9zZXRfdGVybSAoY29uc3Qgc3RydWN0IHRlcm1pbmZvICpuZXcpOwordm9pZCB0aV9nZXRfdGVybSAoc3RydWN0IHRlcm1pbmZvICpjb3B5KTsKKwordm9pZCB0aV9jdXJzb3JfYWRkcmVzcyAoaW50IHgsIGludCB5KTsKK3ZvaWQgdGlfY2xlYXJfc2NyZWVuICh2b2lkKTsKK3ZvaWQgdGlfZW50ZXJfc3RhbmRvdXRfbW9kZSAodm9pZCk7Cit2b2lkIHRpX2V4aXRfc3RhbmRvdXRfbW9kZSAodm9pZCk7CisKKyNlbmRpZiAvKiAhIEdSVUJfVEVSTUNBUF9IRUFERVIgKi8KZGlmZiAtLWdpdCBhL3N0YWdlMi90cGFybS5jIGIvc3RhZ2UyL3RwYXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY3OGQ1MwotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMi90cGFybS5jCkBAIC0wLDAgKzEsNzI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAxOTk4LDIwMDAsMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAgKgorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAgICAgICAgICAgICoKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgICAgICAqCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsICAgICAgKgorICogZGlzdHJpYnV0ZSwgZGlzdHJpYnV0ZSB3aXRoIG1vZGlmaWNhdGlvbnMsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsICAgICAgICoKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyAgICAqCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkICAqCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTICAqCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GICAgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBQk9WRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgICAqCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgICAgKgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SICAgICoKKyAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUocykgb2YgdGhlIGFib3ZlIGNvcHlyaWdodCAgICoKKyAqIGhvbGRlcnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlICAgICAqCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gICAgICAgKgorICogYXV0aG9yaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhpcyBjb2RlIGlzIGEgbW9kaWZpY2F0aW9uIG9mIGxpYl90cGFybS5jIGZvdW5kIGluIG5jdXJzZXMtNS4yLiBUaGUKKyAqIG1vZGlmaWNhdGlvbiBhcmUgZm9yIHVzZSBpbiBncnViIGJ5IHJlcGxhY2luZyBhbGwgbGliYyBmdW5jdGlvbiB0aHJvdWdoCisgKiBzcGVjaWFsIGdydWIgZnVuY3Rpb25zLiBUaGlzIGFsc28gbWVhbnQgdG8gZGVsZXRlIGFsbCBkeW5hbWljIG1lbW9yeQorICogYWxsb2NhdGlvbiBhbmQgcmVwbGFjZSBpdCBieSBhIG51bWJlciBvZiBmaXhlZCBidWZmZXJzLgorICoKKyAqIE1vZGlmaWNhdGlvbnMgYnkgVGlsbWFubiBCdWJlY2sgPHQuYnViZWNrQHJlaW5mb3JtLmRlPiAyMDAyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBBdXRob3I6IFpleWQgTS4gQmVuLUhhbGltIDx6bWJlbmhhbEBuZXRjb20uY29tPiAxOTkyLDE5OTUgICAgICAgICAgICAgICAqCisgKiAgICAgYW5kOiBFcmljIFMuIFJheW1vbmQgPGVzckBzbmFyay50aHlyc3VzLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKgl0cGFybS5jCisgKgorICovCisKKyNpbmNsdWRlICJzaGFyZWQuaCIKKworI2luY2x1ZGUgInRwYXJtLmgiCisKKy8qCisgKiBDb21tb24vdHJvdWJsZXNvbWUgY2hhcmFjdGVyIGRlZmluaXRpb25zCisgKi8KK3R5cGVkZWYgY2hhciBncnViX2Jvb2w7CisjZGVmaW5lIGlzZGlnaXQoYykgKChjKSA+PSAnMCcgJiYgKGMpIDw9ICc5JykKKyNpZm5kZWYgRkFMU0UKKyMgZGVmaW5lIEZBTFNFICgwKQorI2VuZGlmCisjaWZuZGVmIFRSVUUKKyMgZGVmaW5lIFRSVUUgKCFGQUxTRSkKKyNlbmRpZgorI2RlZmluZSBNQVhfRk9STUFUX0xFTiAyNTYKKyNkZWZpbmUgbWF4KGEsYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKKworLy9NT0RVTEVfSUQoIiRJZDogdHBhcm0uYyx2IDEuMSAyMDAyLzExLzI5IDIwOjM5OjI0IG9rdWppIEV4cCAkIikKKworLyoKKyAqCWNoYXIgKgorICoJdHBhcm0oc3RyaW5nLCAuLi4pCisgKgorICoJU3Vic3RpdHV0ZSB0aGUgZ2l2ZW4gcGFyYW1ldGVycyBpbnRvIHRoZSBnaXZlbiBzdHJpbmcgYnkgdGhlIGZvbGxvd2luZworICoJcnVsZXMgKHRha2VuIGZyb20gdGVybWluZm8oNSkpOgorICoKKyAqCSAgICAgQ3Vyc29yIGFkZHJlc3NpbmcgYW5kIG90aGVyIHN0cmluZ3MgIHJlcXVpcmluZyAgcGFyYW1lLQorICoJdGVycyBpbiB0aGUgdGVybWluYWwgYXJlIGRlc2NyaWJlZCBieSBhIHBhcmFtZXRlcml6ZWQgc3RyaW5nCisgKgljYXBhYmlsaXR5LCB3aXRoIGxpa2UgZXNjYXBlcyAleCBpbiAgaXQuICAgRm9yICBleGFtcGxlLCAgdG8KKyAqCWFkZHJlc3MgIHRoZSAgY3Vyc29yLCB0aGUgY3VwIGNhcGFiaWxpdHkgaXMgZ2l2ZW4sIHVzaW5nIHR3bworICoJcGFyYW1ldGVyczogdGhlIHJvdyBhbmQgY29sdW1uIHRvICBhZGRyZXNzICB0by4gICAoUm93cyAgYW5kCisgKgljb2x1bW5zICBhcmUgIG51bWJlcmVkICBmcm9tICB6ZXJvIGFuZCByZWZlciB0byB0aGUgcGh5c2ljYWwKKyAqCXNjcmVlbiB2aXNpYmxlIHRvIHRoZSB1c2VyLCBub3QgdG8gYW55ICB1bnNlZW4gIG1lbW9yeS4pICBJZgorICoJdGhlIHRlcm1pbmFsIGhhcyBtZW1vcnkgcmVsYXRpdmUgY3Vyc29yIGFkZHJlc3NpbmcsIHRoYXQgY2FuCisgKgliZSBpbmRpY2F0ZWQgYnkKKyAqCisgKgkgICAgIFRoZSBwYXJhbWV0ZXIgbWVjaGFuaXNtIHVzZXMgIGEgIHN0YWNrICBhbmQgIHNwZWNpYWwgICUKKyAqCWNvZGVzICB0byBtYW5pcHVsYXRlIGl0LiAgVHlwaWNhbGx5IGEgc2VxdWVuY2Ugd2lsbCBwdXNoIG9uZQorICoJb2YgdGhlIHBhcmFtZXRlcnMgb250byB0aGUgc3RhY2sgYW5kIHRoZW4gcHJpbnQgaXQgIGluICBzb21lCisgKglmb3JtYXQuICBPZnRlbiBtb3JlIGNvbXBsZXggb3BlcmF0aW9ucyBhcmUgbmVjZXNzYXJ5LgorICoKKyAqCSAgICAgVGhlICUgZW5jb2RpbmdzIGhhdmUgdGhlIGZvbGxvd2luZyBtZWFuaW5nczoKKyAqCisgKgkgICAgICUlICAgICAgICBvdXRwdXRzIGAlJworICoJICAgICAlYyAgICAgICAgcHJpbnQgcG9wKCkgbGlrZSAlYyBpbiBwcmludGYoKQorICoJICAgICAlcyAgICAgICAgcHJpbnQgcG9wKCkgbGlrZSAlcyBpbiBwcmludGYoKQorICogICAgICAgICAgICVbWzpdZmxhZ3NdW3dpZHRoWy5wcmVjaXNpb25dXVtkb3hYc10KKyAqICAgICAgICAgICAgICAgICAgICAgYXMgaW4gcHJpbnRmLCBmbGFncyBhcmUgWy0rI10gYW5kIHNwYWNlCisgKiAgICAgICAgICAgICAgICAgICAgIFRoZSAnOicgaXMgdXNlZCB0byBhdm9pZCBtYWtpbmcgJSsgb3IgJS0KKyAqICAgICAgICAgICAgICAgICAgICAgcGF0dGVybnMgKHNlZSBiZWxvdykuCisgKgorICoJICAgICAlcFsxLTldICAgcHVzaCBpdGggcGFybQorICoJICAgICAlUFthLXpdICAgc2V0IGR5bmFtaWMgdmFyaWFibGUgW2Etel0gdG8gcG9wKCkKKyAqCSAgICAgJWdbYS16XSAgIGdldCBkeW5hbWljIHZhcmlhYmxlIFthLXpdIGFuZCBwdXNoIGl0CisgKgkgICAgICVQW0EtWl0gICBzZXQgc3RhdGljIHZhcmlhYmxlIFtBLVpdIHRvIHBvcCgpCisgKgkgICAgICVnW0EtWl0gICBnZXQgc3RhdGljIHZhcmlhYmxlIFtBLVpdIGFuZCBwdXNoIGl0CisgKgkgICAgICVsICAgICAgICBwdXNoIHN0cmxlbihwb3ApCisgKgkgICAgICUnYycgICAgICBwdXNoIGNoYXIgY29uc3RhbnQgYworICoJICAgICAle25ufSAgICAgcHVzaCBpbnRlZ2VyIGNvbnN0YW50IG5uCisgKgorICoJICAgICAlKyAlLSAlKiAlLyAlbQorICoJICAgICAgICAgICAgICAgYXJpdGhtZXRpYyAoJW0gaXMgbW9kKTogcHVzaChwb3AoKSBvcCBwb3AoKSkKKyAqCSAgICAgJSYgJXwgJV4gIGJpdCBvcGVyYXRpb25zOiBwdXNoKHBvcCgpIG9wIHBvcCgpKQorICoJICAgICAlPSAlPiAlPCAgbG9naWNhbCBvcGVyYXRpb25zOiBwdXNoKHBvcCgpIG9wIHBvcCgpKQorICoJICAgICAlQSAlTyAgICAgbG9naWNhbCBhbmQgJiBvciBvcGVyYXRpb25zIGZvciBjb25kaXRpb25hbHMKKyAqCSAgICAgJSEgJX4gICAgIHVuYXJ5IG9wZXJhdGlvbnMgcHVzaChvcCBwb3AoKSkKKyAqCSAgICAgJWkgICAgICAgIGFkZCAxIHRvIGZpcnN0IHR3byBwYXJtcyAoZm9yIEFOU0kgdGVybWluYWxzKQorICoKKyAqCSAgICAgJT8gZXhwciAldCB0aGVucGFydCAlZSBlbHNlcGFydCAlOworICoJICAgICAgICAgICAgICAgaWYtdGhlbi1lbHNlLCAlZSBlbHNlcGFydCBpcyBvcHRpb25hbC4KKyAqCSAgICAgICAgICAgICAgIGVsc2UtaWYncyBhcmUgcG9zc2libGUgYWxhIEFsZ29sIDY4OgorICoJICAgICAgICAgICAgICAgJT8gYzEgJXQgYjEgJWUgYzIgJXQgYjIgJWUgYzMgJXQgYjMgJWUgYzQgJXQgYjQgJWUgYjUgJTsKKyAqCisgKglGb3IgdGhvc2Ugb2YgdGhlIGFib3ZlIG9wZXJhdG9ycyB3aGljaCBhcmUgYmluYXJ5IGFuZCBub3QgY29tbXV0YXRpdmUsCisgKgl0aGUgc3RhY2sgd29ya3MgaW4gdGhlIHVzdWFsIHdheSwgd2l0aAorICoJCQklZ3ggJWd5ICVtCisgKglyZXN1bHRpbmcgaW4geCBtb2QgeSwgbm90IHRoZSByZXZlcnNlLgorICovCisKKyNkZWZpbmUgU1RBQ0tTSVpFCTIwCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bmlvbiB7CisJdW5zaWduZWQgaW50IG51bTsKKwljaGFyICpzdHI7CisgICAgfSBkYXRhOworICAgIGdydWJfYm9vbCBudW1fdHlwZTsKK30gc3RhY2tfZnJhbWU7CisKK3N0YXRpYyBzdGFja19mcmFtZSBzdGFja1tTVEFDS1NJWkVdOworc3RhdGljIGludCBzdGFja19wdHI7CisKK3N0YXRpYyBjaGFyIG91dF9idWZmWzI1Nl07CitzdGF0aWMgaW50IG91dF9zaXplID0gMjU2Oworc3RhdGljIGludCBvdXRfdXNlZDsKKworc3RhdGljIGlubGluZSB2b2lkCitnZXRfc3BhY2UoaW50IG5lZWQpCit7CisgICAgbmVlZCArPSBvdXRfdXNlZDsKKyAgICBpZiAobmVlZCA+IG91dF9zaXplKSB7CisJLy8gRklYIE1FISBidWZmZXIgZnVsbCwgd2hhdCBub3c/CisJOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkCitzYXZlX3RleHQoY29uc3QgY2hhciAqZm10LCBjb25zdCBjaGFyICpzLCBpbnQgbGVuKQoreworICAgIGludCBzX2xlbiA9IGdydWJfc3RybGVuKHMpOworICAgIGlmIChsZW4gPiAoaW50KSBzX2xlbikKKwlzX2xlbiA9IGxlbjsKKworICAgIGdldF9zcGFjZShzX2xlbiArIDEpOworCisgICAgKHZvaWQpIGdydWJfc3ByaW50ZihvdXRfYnVmZiArIG91dF91c2VkLCBmbXQsIHMpOworICAgIG91dF91c2VkICs9IGdydWJfc3RybGVuKG91dF9idWZmICsgb3V0X3VzZWQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3NhdmVfbnVtYmVyKGNvbnN0IGNoYXIgKmZtdCwgaW50IG51bWJlciwgaW50IGxlbikKK3sKKyAgICBpZiAobGVuIDwgMzApCisJbGVuID0gMzA7CQkvKiBhY3R1YWxseSBsb2cxMChNQVhfSU5UKSsxICovCisKKyAgICBnZXRfc3BhY2UobGVuICsgMSk7CisKKyAgICAodm9pZCkgZ3J1Yl9zcHJpbnRmKG91dF9idWZmICsgb3V0X3VzZWQsIGZtdCwgbnVtYmVyKTsKKyAgICBvdXRfdXNlZCArPSBncnViX3N0cmxlbihvdXRfYnVmZiArIG91dF91c2VkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitzYXZlX2NoYXIoaW50IGMpCit7CisgICAgaWYgKGMgPT0gMCkKKwljID0gMDIwMDsKKyAgICBnZXRfc3BhY2UoMSk7CisgICAgb3V0X2J1ZmZbb3V0X3VzZWQrK10gPSBjOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK25wdXNoKGludCB4KQoreworICAgIGlmIChzdGFja19wdHIgPCBTVEFDS1NJWkUpIHsKKwlzdGFja1tzdGFja19wdHJdLm51bV90eXBlID0gVFJVRTsKKwlzdGFja1tzdGFja19wdHJdLmRhdGEubnVtID0geDsKKwlzdGFja19wdHIrKzsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitucG9wKHZvaWQpCit7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgaWYgKHN0YWNrX3B0ciA+IDApIHsKKwlzdGFja19wdHItLTsKKwlpZiAoc3RhY2tbc3RhY2tfcHRyXS5udW1fdHlwZSkKKwkgICAgcmVzdWx0ID0gc3RhY2tbc3RhY2tfcHRyXS5kYXRhLm51bTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitzcHVzaChjaGFyICp4KQoreworICAgIGlmIChzdGFja19wdHIgPCBTVEFDS1NJWkUpIHsKKwlzdGFja1tzdGFja19wdHJdLm51bV90eXBlID0gRkFMU0U7CisJc3RhY2tbc3RhY2tfcHRyXS5kYXRhLnN0ciA9IHg7CisJc3RhY2tfcHRyKys7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKgorc3BvcCh2b2lkKQoreworICAgIHN0YXRpYyBjaGFyIGR1bW15W10gPSAiIjsJLyogYXZvaWQgY29uc3QtY2FzdCAqLworICAgIGNoYXIgKnJlc3VsdCA9IGR1bW15OworICAgIGlmIChzdGFja19wdHIgPiAwKSB7CisJc3RhY2tfcHRyLS07CisJaWYgKCFzdGFja1tzdGFja19wdHJdLm51bV90eXBlICYmIHN0YWNrW3N0YWNrX3B0cl0uZGF0YS5zdHIgIT0gMCkKKwkgICAgcmVzdWx0ID0gc3RhY2tbc3RhY2tfcHRyXS5kYXRhLnN0cjsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICoKK3BhcnNlX2Zvcm1hdChjb25zdCBjaGFyICpzLCBjaGFyICpmb3JtYXQsIGludCAqbGVuKQoreworICAgIGdydWJfYm9vbCBkb25lID0gRkFMU0U7CisgICAgZ3J1Yl9ib29sIGFsbG93bWludXMgPSBGQUxTRTsKKyAgICBncnViX2Jvb2wgZG90ID0gRkFMU0U7CisgICAgZ3J1Yl9ib29sIGVyciA9IEZBTFNFOworICAgIGNoYXIgKmZtdCA9IGZvcm1hdDsKKyAgICBpbnQgcHJlYyA9IDA7CisgICAgaW50IHdpZHRoID0gMDsKKyAgICBpbnQgdmFsdWUgPSAwOworCisgICAgKmxlbiA9IDA7CisgICAgKmZvcm1hdCsrID0gJyUnOworICAgIHdoaWxlICgqcyAhPSAnXDAnICYmICFkb25lKSB7CisJc3dpdGNoICgqcykgeworCWNhc2UgJ2MnOgkJLyogRkFMTFRIUlUgKi8KKwljYXNlICdkJzoJCS8qIEZBTExUSFJVICovCisJY2FzZSAnbyc6CQkvKiBGQUxMVEhSVSAqLworCWNhc2UgJ3gnOgkJLyogRkFMTFRIUlUgKi8KKwljYXNlICdYJzoJCS8qIEZBTExUSFJVICovCisJY2FzZSAncyc6CisJICAgICpmb3JtYXQrKyA9ICpzOworCSAgICBkb25lID0gVFJVRTsKKwkgICAgYnJlYWs7CisJY2FzZSAnLic6CisJICAgICpmb3JtYXQrKyA9ICpzKys7CisJICAgIGlmIChkb3QpIHsKKwkJZXJyID0gVFJVRTsKKwkgICAgfSBlbHNlIHsKKwkJZG90ID0gVFJVRTsKKwkJcHJlYyA9IHZhbHVlOworCSAgICB9CisJICAgIHZhbHVlID0gMDsKKwkgICAgYnJlYWs7CisJY2FzZSAnIyc6CisJICAgICpmb3JtYXQrKyA9ICpzKys7CisJICAgIGJyZWFrOworCWNhc2UgJyAnOgorCSAgICAqZm9ybWF0KysgPSAqcysrOworCSAgICBicmVhazsKKwljYXNlICc6JzoKKwkgICAgcysrOworCSAgICBhbGxvd21pbnVzID0gVFJVRTsKKwkgICAgYnJlYWs7CisJY2FzZSAnLSc6CisJICAgIGlmIChhbGxvd21pbnVzKSB7CisJCSpmb3JtYXQrKyA9ICpzKys7CisJICAgIH0gZWxzZSB7CisJCWRvbmUgPSBUUlVFOworCSAgICB9CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIGlmIChpc2RpZ2l0KCpzKSkgeworCQl2YWx1ZSA9ICh2YWx1ZSAqIDEwKSArICgqcyAtICcwJyk7CisJCWlmICh2YWx1ZSA+IDEwMDAwKQorCQkgICAgZXJyID0gVFJVRTsKKwkJKmZvcm1hdCsrID0gKnMrKzsKKwkgICAgfSBlbHNlIHsKKwkJZG9uZSA9IFRSVUU7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiB3ZSBmb3VuZCBhbiBlcnJvciwgaWdub3JlIChhbmQgcmVtb3ZlKSB0aGUgZmxhZ3MuCisgICAgICovCisgICAgaWYgKGVycikgeworCXByZWMgPSB3aWR0aCA9IHZhbHVlID0gMDsKKwlmb3JtYXQgPSBmbXQ7CisJKmZvcm1hdCsrID0gJyUnOworCSpmb3JtYXQrKyA9ICpzOworICAgIH0KKworICAgIGlmIChkb3QpCisJd2lkdGggPSB2YWx1ZTsKKyAgICBlbHNlCisJcHJlYyA9IHZhbHVlOworCisgICAgKmZvcm1hdCA9ICdcMCc7CisgICAgLyogcmV0dXJuIG1heGltdW0gc3RyaW5nIGxlbmd0aCBpbiBwcmludCAqLworICAgICpsZW4gPSAocHJlYyA+IHdpZHRoKSA/IHByZWMgOiB3aWR0aDsKKyAgICByZXR1cm4gczsKK30KKworI2RlZmluZSBpc1VQUEVSKGMpICgoYykgPj0gJ0EnICYmIChjKSA8PSAnWicpCisjZGVmaW5lIGlzTE9XRVIoYykgKChjKSA+PSAnYScgJiYgKGMpIDw9ICd6JykKKworc3RhdGljIGlubGluZSBjaGFyICoKK3RwYXJhbV9pbnRlcm5hbChjb25zdCBjaGFyICpzdHJpbmcsIGludCAqZGF0YXB0cikKK3sKKyNkZWZpbmUgTlVNX1ZBUlMgMjYKKyAgICBjaGFyICpwX2lzX3NbOV07CisgICAgaW50IHBhcmFtWzldOworICAgIGludCBsYXN0cG9wOworICAgIGludCBwb3Bjb3VudDsKKyAgICBpbnQgbnVtYmVyOworICAgIGludCBsZW47CisgICAgaW50IGxldmVsOworICAgIGludCB4LCB5OworICAgIGludCBpOworICAgIGludCBsZW4yOworICAgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmNwOworICAgIHN0YXRpYyBpbnQgbGVuX2ZtdCA9IE1BWF9GT1JNQVRfTEVOOworICAgIHN0YXRpYyBjaGFyIGR1bW15W10gPSAiIjsKKyAgICBzdGF0aWMgY2hhciBmb3JtYXRbTUFYX0ZPUk1BVF9MRU5dOworICAgIHN0YXRpYyBpbnQgZHluYW1pY192YXJbTlVNX1ZBUlNdOworICAgIHN0YXRpYyBpbnQgc3RhdGljX3ZhcnNbTlVNX1ZBUlNdOworCisgICAgb3V0X3VzZWQgPSAwOworICAgIGlmIChzdHJpbmcgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKworICAgIGlmICgobGVuMiA9IGdydWJfc3RybGVuKHN0cmluZykpID4gbGVuX2ZtdCkgeworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qCisgICAgICogRmluZCB0aGUgaGlnaGVzdCBwYXJhbWV0ZXItbnVtYmVyIHJlZmVycmVkIHRvIGluIHRoZSBmb3JtYXQgc3RyaW5nLgorICAgICAqIFVzZSB0aGlzIHZhbHVlIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGNvcGllZCBmcm9tIHRoZQorICAgICAqIHZhcmlhYmxlLWxlbmd0aCBhcmd1bWVudCBsaXN0LgorICAgICAqLworCisgICAgbnVtYmVyID0gMDsKKyAgICBsYXN0cG9wID0gLTE7CisgICAgcG9wY291bnQgPSAwOworICAgIGdydWJfbWVtc2V0KHBfaXNfcywgMCwgc2l6ZW9mKHBfaXNfcykpOworCisgICAgLyoKKyAgICAgKiBBbmFseXplIHRoZSBzdHJpbmcgdG8gc2VlIGhvdyBtYW55IHBhcmFtZXRlcnMgd2UgbmVlZCBmcm9tIHRoZSB2YXJhcmdzCisgICAgICogbGlzdCwgYW5kIHdoYXQgdGhlaXIgdHlwZXMgYXJlLiAgV2Ugd2lsbCBvbmx5IGFjY2VwdCBzdHJpbmcgcGFyYW1ldGVycworICAgICAqIGlmIHRoZXkgYXBwZWFyIGFzIGEgJWwgb3IgJXMgZm9ybWF0IGZvbGxvd2luZyBhbiBleHBsaWNpdCBwYXJhbWV0ZXIKKyAgICAgKiByZWZlcmVuY2UgKGUuZy4sICVwMiVzKS4gIEFsbCBvdGhlciBwYXJhbWV0ZXJzIGFyZSBudW1iZXJzLgorICAgICAqCisgICAgICogJ251bWJlcicgY291bnRzIGNvYXJzZWx5IHRoZSBudW1iZXIgb2YgcG9wJ3Mgd2Ugc2VlIGluIHRoZSBzdHJpbmcsIGFuZAorICAgICAqICdwb3Bjb3VudCcgc2hvd3MgdGhlIGhpZ2hlc3QgcGFyYW1ldGVyIG51bWJlciBpbiB0aGUgc3RyaW5nLiAgV2Ugd291bGQKKyAgICAgKiBsaWtlIHRvIHNpbXBseSB1c2UgdGhlIGxhdHRlciBjb3VudCwgYnV0IGlmIHdlIGFyZSByZWFkaW5nIHRlcm1jYXAKKyAgICAgKiBzdHJpbmdzLCB0aGVyZSBtYXkgYmUgY2FzZXMgdGhhdCB3ZSBjYW5ub3Qgc2VlIHRoZSBleHBsaWNpdCBwYXJhbWV0ZXIKKyAgICAgKiBudW1iZXJzLgorICAgICAqLworICAgIGZvciAoY3AgPSBzdHJpbmc7IChjcCAtIHN0cmluZykgPCAoaW50KSBsZW4yOykgeworCWlmICgqY3AgPT0gJyUnKSB7CisJICAgIGNwKys7CisJICAgIGNwID0gcGFyc2VfZm9ybWF0KGNwLCBmb3JtYXQsICZsZW4pOworCSAgICBzd2l0Y2ggKCpjcCkgeworCSAgICBkZWZhdWx0OgorCQlicmVhazsKKworCSAgICBjYXNlICdkJzoJCS8qIEZBTExUSFJVICovCisJICAgIGNhc2UgJ28nOgkJLyogRkFMTFRIUlUgKi8KKwkgICAgY2FzZSAneCc6CQkvKiBGQUxMVEhSVSAqLworCSAgICBjYXNlICdYJzoJCS8qIEZBTExUSFJVICovCisJICAgIGNhc2UgJ2MnOgkJLyogRkFMTFRIUlUgKi8KKwkJbnVtYmVyKys7CisJCWxhc3Rwb3AgPSAtMTsKKwkJYnJlYWs7CisKKwkgICAgY2FzZSAnbCc6CisJICAgIGNhc2UgJ3MnOgorCQlpZiAobGFzdHBvcCA+IDApCisJCSAgICBwX2lzX3NbbGFzdHBvcCAtIDFdID0gZHVtbXk7CisJCSsrbnVtYmVyOworCQlicmVhazsKKworCSAgICBjYXNlICdwJzoKKwkJY3ArKzsKKwkJaSA9ICgqY3AgLSAnMCcpOworCQlpZiAoaSA+PSAwICYmIGkgPD0gOSkgeworCQkgICAgbGFzdHBvcCA9IGk7CisJCSAgICBpZiAobGFzdHBvcCA+IHBvcGNvdW50KQorCQkJcG9wY291bnQgPSBsYXN0cG9wOworCQl9CisJCWJyZWFrOworCisJICAgIGNhc2UgJ1AnOgorCSAgICBjYXNlICdnJzoKKwkJY3ArKzsKKwkJYnJlYWs7CisKKwkgICAgY2FzZSAnXCcnOgorCQljcCArPSAyOworCQlsYXN0cG9wID0gLTE7CisJCWJyZWFrOworCisJICAgIGNhc2UgJ3snOgorCQljcCsrOworCQl3aGlsZSAoKmNwID49ICcwJyAmJiAqY3AgPD0gJzknKSB7CisJCSAgICBjcCsrOworCQl9CisJCWJyZWFrOworCisJICAgIGNhc2UgJysnOgorCSAgICBjYXNlICctJzoKKwkgICAgY2FzZSAnKic6CisJICAgIGNhc2UgJy8nOgorCSAgICBjYXNlICdtJzoKKwkgICAgY2FzZSAnQSc6CisJICAgIGNhc2UgJ08nOgorCSAgICBjYXNlICcmJzoKKwkgICAgY2FzZSAnfCc6CisJICAgIGNhc2UgJ14nOgorCSAgICBjYXNlICc9JzoKKwkgICAgY2FzZSAnPCc6CisJICAgIGNhc2UgJz4nOgorCSAgICBjYXNlICchJzoKKwkgICAgY2FzZSAnfic6CisJCWxhc3Rwb3AgPSAtMTsKKwkJbnVtYmVyICs9IDI7CisJCWJyZWFrOworCisJICAgIGNhc2UgJ2knOgorCQlsYXN0cG9wID0gLTE7CisJCWlmIChwb3Bjb3VudCA8IDIpCisJCSAgICBwb3Bjb3VudCA9IDI7CisJCWJyZWFrOworCSAgICB9CisJfQorCWlmICgqY3AgIT0gJ1wwJykKKwkgICAgY3ArKzsKKyAgICB9CisKKyAgICBpZiAobnVtYmVyID4gOSkKKwludW1iZXIgPSA5OworICAgIGZvciAoaSA9IDA7IGkgPCBtYXgocG9wY291bnQsIG51bWJlcik7IGkrKykgeworCS8qCisJICogQSBmZXcgY2FwcyAoc3VjaCBhcyBwbGFiX25vcm0pIGhhdmUgc3RyaW5nLXZhbHVlZCBwYXJtcy4KKwkgKiBXZSdsbCBoYXZlIHRvIGFzc3VtZSB0aGF0IHRoZSBjYWxsZXIga25vd3MgdGhlIGRpZmZlcmVuY2UsIHNpbmNlCisJICogYSBjaGFyKiBhbmQgYW4gaW50IG1heSBub3QgYmUgdGhlIHNhbWUgc2l6ZSBvbiB0aGUgc3RhY2suCisJICovCisJaWYgKHBfaXNfc1tpXSAhPSAwKSB7CisJICBwX2lzX3NbaV0gPSAoY2hhciAqKSgqKGRhdGFwdHIrKykpOworCX0gZWxzZSB7CisJICBwYXJhbVtpXSA9IChpbnQpKCooZGF0YXB0cisrKSk7CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogVGhpcyBpcyBhIHRlcm1jYXAgY29tcGF0aWJpbGl0eSBoYWNrLiAgSWYgdGhlcmUgYXJlIG5vIGV4cGxpY2l0IHBvcAorICAgICAqIG9wZXJhdGlvbnMgaW4gdGhlIHN0cmluZywgbG9hZCB0aGUgc3RhY2sgaW4gc3VjaCBhIHdheSB0aGF0CisgICAgICogc3VjY2Vzc2l2ZSBwb3BzIHdpbGwgZ3JhYiBzdWNjZXNzaXZlIHBhcmFtZXRlcnMuICBUaGF0IHdpbGwgbWFrZQorICAgICAqIHRoZSBleHBhbnNpb24gb2YgKGZvciBleGFtcGxlKSBcRVslZDslZEggd29yayBjb3JyZWN0bHkgaW4gdGVybWNhcAorICAgICAqIHN0eWxlLCB3aGljaCBtZWFucyB0cGFyYW0oKSB3aWxsIGV4cGFuZCB0ZXJtY2FwIHN0cmluZ3MgT0suCisgICAgICovCisgICAgc3RhY2tfcHRyID0gMDsKKyAgICBpZiAocG9wY291bnQgPT0gMCkgeworCXBvcGNvdW50ID0gbnVtYmVyOworCWZvciAoaSA9IG51bWJlciAtIDE7IGkgPj0gMDsgaS0tKQorCSAgICBucHVzaChwYXJhbVtpXSk7CisgICAgfQorCisgICAgd2hpbGUgKCpzdHJpbmcpIHsKKyAgICAgICAgLyogc2tpcCBkZWxheSB0aW1pbmdzICovCisJaWYgKCpzdHJpbmcgPT0gJyQnICYmICooc3RyaW5nICsgMSkgPT0gJzwnKSB7CisJICAgIHdoaWxlKCAqc3RyaW5nICYmICpzdHJpbmcgIT0gJz4nKSAKKwkgICAgICAgIHN0cmluZysrOworCSAgICBpZiAoICpzdHJpbmcgPT0gJz4nICkgc3RyaW5nKys7CisJfSBlbHNlIGlmICggKnN0cmluZyA9PSAnJScpIHsKKwkgICAgc3RyaW5nKys7CisJICAgIHN0cmluZyA9IHBhcnNlX2Zvcm1hdChzdHJpbmcsIGZvcm1hdCwgJmxlbik7CisJICAgIHN3aXRjaCAoKnN0cmluZykgeworCSAgICBkZWZhdWx0OgorCQlicmVhazsKKwkgICAgY2FzZSAnJSc6CisJCXNhdmVfY2hhcignJScpOworCQlicmVhazsKKworCSAgICBjYXNlICdkJzoJCS8qIEZBTExUSFJVICovCisJICAgIGNhc2UgJ28nOgkJLyogRkFMTFRIUlUgKi8KKwkgICAgY2FzZSAneCc6CQkvKiBGQUxMVEhSVSAqLworCSAgICBjYXNlICdYJzoJCS8qIEZBTExUSFJVICovCisJICAgIGNhc2UgJ2MnOgkJLyogRkFMTFRIUlUgKi8KKwkJc2F2ZV9udW1iZXIoZm9ybWF0LCBucG9wKCksIGxlbik7CisJCWJyZWFrOworCisJICAgIGNhc2UgJ2wnOgorCQlzYXZlX251bWJlcigiJWQiLCBzdHJsZW4oc3BvcCgpKSwgMCk7CisJCWJyZWFrOworCisJICAgIGNhc2UgJ3MnOgorCQlzYXZlX3RleHQoZm9ybWF0LCBzcG9wKCksIGxlbik7CisJCWJyZWFrOworCisJICAgIGNhc2UgJ3AnOgorCQlzdHJpbmcrKzsKKwkJaSA9ICgqc3RyaW5nIC0gJzEnKTsKKwkJaWYgKGkgPj0gMCAmJiBpIDwgOSkgeworCQkgICAgaWYgKHBfaXNfc1tpXSkKKwkJCXNwdXNoKHBfaXNfc1tpXSk7CisJCSAgICBlbHNlCisJCQlucHVzaChwYXJhbVtpXSk7CisJCX0KKwkJYnJlYWs7CisKKwkgICAgY2FzZSAnUCc6CisJCXN0cmluZysrOworCQlpZiAoaXNVUFBFUigqc3RyaW5nKSkgeworCQkgICAgaSA9ICgqc3RyaW5nIC0gJ0EnKTsKKwkJICAgIHN0YXRpY192YXJzW2ldID0gbnBvcCgpOworCQl9IGVsc2UgaWYgKGlzTE9XRVIoKnN0cmluZykpIHsKKwkJICAgIGkgPSAoKnN0cmluZyAtICdhJyk7CisJCSAgICBkeW5hbWljX3ZhcltpXSA9IG5wb3AoKTsKKwkJfQorCQlicmVhazsKKworCSAgICBjYXNlICdnJzoKKwkJc3RyaW5nKys7CisJCWlmIChpc1VQUEVSKCpzdHJpbmcpKSB7CisJCSAgICBpID0gKCpzdHJpbmcgLSAnQScpOworCQkgICAgbnB1c2goc3RhdGljX3ZhcnNbaV0pOworCQl9IGVsc2UgaWYgKGlzTE9XRVIoKnN0cmluZykpIHsKKwkJICAgIGkgPSAoKnN0cmluZyAtICdhJyk7CisJCSAgICBucHVzaChkeW5hbWljX3ZhcltpXSk7CisJCX0KKwkJYnJlYWs7CisKKwkgICAgY2FzZSAnXCcnOgorCQlzdHJpbmcrKzsKKwkJbnB1c2goKnN0cmluZyk7CisJCXN0cmluZysrOworCQlicmVhazsKKworCSAgICBjYXNlICd7JzoKKwkJbnVtYmVyID0gMDsKKwkJc3RyaW5nKys7CisJCXdoaWxlICgqc3RyaW5nID49ICcwJyAmJiAqc3RyaW5nIDw9ICc5JykgeworCQkgICAgbnVtYmVyID0gbnVtYmVyICogMTAgKyAqc3RyaW5nIC0gJzAnOworCQkgICAgc3RyaW5nKys7CisJCX0KKwkJbnB1c2gobnVtYmVyKTsKKwkJYnJlYWs7CisKKwkgICAgY2FzZSAnKyc6CisJCW5wdXNoKG5wb3AoKSArIG5wb3AoKSk7CisJCWJyZWFrOworCisJICAgIGNhc2UgJy0nOgorCQl5ID0gbnBvcCgpOworCQl4ID0gbnBvcCgpOworCQlucHVzaCh4IC0geSk7CisJCWJyZWFrOworCisJICAgIGNhc2UgJyonOgorCQlucHVzaChucG9wKCkgKiBucG9wKCkpOworCQlicmVhazsKKworCSAgICBjYXNlICcvJzoKKwkJeSA9IG5wb3AoKTsKKwkJeCA9IG5wb3AoKTsKKwkJbnB1c2goeSA/ICh4IC8geSkgOiAwKTsKKwkJYnJlYWs7CisKKwkgICAgY2FzZSAnbSc6CisJCXkgPSBucG9wKCk7CisJCXggPSBucG9wKCk7CisJCW5wdXNoKHkgPyAoeCAlIHkpIDogMCk7CisJCWJyZWFrOworCisJICAgIGNhc2UgJ0EnOgorCQlucHVzaChucG9wKCkgJiYgbnBvcCgpKTsKKwkJYnJlYWs7CisKKwkgICAgY2FzZSAnTyc6CisJCW5wdXNoKG5wb3AoKSB8fCBucG9wKCkpOworCQlicmVhazsKKworCSAgICBjYXNlICcmJzoKKwkJbnB1c2gobnBvcCgpICYgbnBvcCgpKTsKKwkJYnJlYWs7CisKKwkgICAgY2FzZSAnfCc6CisJCW5wdXNoKG5wb3AoKSB8IG5wb3AoKSk7CisJCWJyZWFrOworCisJICAgIGNhc2UgJ14nOgorCQlucHVzaChucG9wKCkgXiBucG9wKCkpOworCQlicmVhazsKKworCSAgICBjYXNlICc9JzoKKwkJeSA9IG5wb3AoKTsKKwkJeCA9IG5wb3AoKTsKKwkJbnB1c2goeCA9PSB5KTsKKwkJYnJlYWs7CisKKwkgICAgY2FzZSAnPCc6CisJCXkgPSBucG9wKCk7CisJCXggPSBucG9wKCk7CisJCW5wdXNoKHggPCB5KTsKKwkJYnJlYWs7CisKKwkgICAgY2FzZSAnPic6CisJCXkgPSBucG9wKCk7CisJCXggPSBucG9wKCk7CisJCW5wdXNoKHggPiB5KTsKKwkJYnJlYWs7CisKKwkgICAgY2FzZSAnISc6CisJCW5wdXNoKCFucG9wKCkpOworCQlicmVhazsKKworCSAgICBjYXNlICd+JzoKKwkJbnB1c2gofm5wb3AoKSk7CisJCWJyZWFrOworCisJICAgIGNhc2UgJ2knOgorCQlpZiAocF9pc19zWzBdID09IDApCisJCSAgICBwYXJhbVswXSsrOworCQlpZiAocF9pc19zWzFdID09IDApCisJCSAgICBwYXJhbVsxXSsrOworCQlicmVhazsKKworCSAgICBjYXNlICc/JzoKKwkJYnJlYWs7CisKKwkgICAgY2FzZSAndCc6CisJCXggPSBucG9wKCk7CisJCWlmICgheCkgeworCQkgICAgLyogc2NhbiBmb3J3YXJkIGZvciAlZSBvciAlOyBhdCBsZXZlbCB6ZXJvICovCisJCSAgICBzdHJpbmcrKzsKKwkJICAgIGxldmVsID0gMDsKKwkJICAgIHdoaWxlICgqc3RyaW5nKSB7CisJCQlpZiAoKnN0cmluZyA9PSAnJScpIHsKKwkJCSAgICBzdHJpbmcrKzsKKwkJCSAgICBpZiAoKnN0cmluZyA9PSAnPycpCisJCQkJbGV2ZWwrKzsKKwkJCSAgICBlbHNlIGlmICgqc3RyaW5nID09ICc7JykgeworCQkJCWlmIChsZXZlbCA+IDApCisJCQkJICAgIGxldmVsLS07CisJCQkJZWxzZQorCQkJCSAgICBicmVhazsKKwkJCSAgICB9IGVsc2UgaWYgKCpzdHJpbmcgPT0gJ2UnICYmIGxldmVsID09IDApCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICgqc3RyaW5nKQorCQkJICAgIHN0cmluZysrOworCQkgICAgfQorCQl9CisJCWJyZWFrOworCisJICAgIGNhc2UgJ2UnOgorCQkvKiBzY2FuIGZvcndhcmQgZm9yIGEgJTsgYXQgbGV2ZWwgemVybyAqLworCQlzdHJpbmcrKzsKKwkJbGV2ZWwgPSAwOworCQl3aGlsZSAoKnN0cmluZykgeworCQkgICAgaWYgKCpzdHJpbmcgPT0gJyUnKSB7CisJCQlzdHJpbmcrKzsKKwkJCWlmICgqc3RyaW5nID09ICc/JykKKwkJCSAgICBsZXZlbCsrOworCQkJZWxzZSBpZiAoKnN0cmluZyA9PSAnOycpIHsKKwkJCSAgICBpZiAobGV2ZWwgPiAwKQorCQkJCWxldmVsLS07CisJCQkgICAgZWxzZQorCQkJCWJyZWFrOworCQkJfQorCQkgICAgfQorCisJCSAgICBpZiAoKnN0cmluZykKKwkJCXN0cmluZysrOworCQl9CisJCWJyZWFrOworCisJICAgIGNhc2UgJzsnOgorCQlicmVhazsKKworCSAgICB9CQkJLyogZW5kc3dpdGNoICgqc3RyaW5nKSAqLworCX0gZWxzZSB7ICAgICAgICAgICAgIAkvKiBlbmRlbHNlICgqc3RyaW5nID09ICclJykgKi8KKwkgICAgc2F2ZV9jaGFyKCpzdHJpbmcpOworCX0KKworCWlmICgqc3RyaW5nID09ICdcMCcpCisJICAgIGJyZWFrOworCisJc3RyaW5nKys7CisgICAgfQkJCQkvKiBlbmR3aGlsZSAoKnN0cmluZykgKi8KKworICAgIGdldF9zcGFjZSgxKTsKKyAgICBvdXRfYnVmZltvdXRfdXNlZF0gPSAnXDAnOworCisgICAgcmV0dXJuIChvdXRfYnVmZik7Cit9CisKK2NoYXIgKgorZ3J1Yl90cGFybShjb25zdCBjaGFyICpzdHJpbmcsLi4uKQoreworICAgIGNoYXIgKnJlc3VsdDsKKyAgICBpbnQgKmRhdGFwdHIgPSAoaW50ICopICZzdHJpbmc7CisKKyAgICBkYXRhcHRyKys7CisKKyAgICByZXN1bHQgPSB0cGFyYW1faW50ZXJuYWwoc3RyaW5nLCBkYXRhcHRyKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9zdGFnZTIvdHBhcm0uaCBiL3N0YWdlMi90cGFybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYzFiNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFnZTIvdHBhcm0uaApAQCAtMCwwICsxLDI4IEBACisvKiB0cGFybS5oIC0gcGFyYW1ldGVyIGZvcm1hdHRpbmcgb2YgdGVybWluZm8gKi8KKy8qCisgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgorICogIENvcHlyaWdodCAoQykgMjAwMiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIEdSVUJfVFBBUk1fSEVBREVSCisjZGVmaW5lIEdSVUJfVFBBUk1fSEVBREVSCTEKKworDAorLyogRnVuY3Rpb24gcHJvdG90eXBlcy4gICovCitjaGFyICpncnViX3RwYXJtIChjb25zdCBjaGFyICpzdHJpbmcsIC4uLik7CisKKyNlbmRpZiAvKiAhIEdSVUJfVEVSTUNBUF9IRUFERVIgKi8KZGlmZiAtLWdpdCBhL3N0YWdlMi91ZnMyLmggYi9zdGFnZTIvdWZzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMmVmMzAKLS0tIC9kZXYvbnVsbAorKysgYi9zdGFnZTIvdWZzMi5oCkBAIC0wLDAgKzEsNDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDAyIE5ldHdvcmtzIEFzc29jaWF0ZXMgVGVjaG5vbG9neSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIHdhcyBkZXZlbG9wZWQgZm9yIHRoZSBGcmVlQlNEIFByb2plY3QgYnkgTWFyc2hhbGwKKyAqIEtpcmsgTWNLdXNpY2sgYW5kIE5ldHdvcmsgQXNzb2NpYXRlcyBMYWJvcmF0b3JpZXMsIHRoZSBTZWN1cml0eQorICogUmVzZWFyY2ggRGl2aXNpb24gb2YgTmV0d29yayBBc3NvY2lhdGVzLCBJbmMuIHVuZGVyIERBUlBBL1NQQVdBUgorICogY29udHJhY3QgTjY2MDAxLTAxLUMtODAzNSAoIkNCT1NTIiksIGFzIHBhcnQgb2YgdGhlIERBUlBBIENIQVRTCisgKiByZXNlYXJjaCBwcm9ncmFtCisgKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg5LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIChjKSBVTklYIFN5c3RlbSBMYWJvcmF0b3JpZXMsIEluYy4KKyAqIEFsbCBvciBzb21lIHBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgZGVyaXZlZCBmcm9tIG1hdGVyaWFsIGxpY2Vuc2VkCisgKiB0byB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhIGJ5IEFtZXJpY2FuIFRlbGVwaG9uZSBhbmQgVGVsZWdyYXBoCisgKiBDby4gb3IgVW5peCBTeXN0ZW0gTGFib3JhdG9yaWVzLCBJbmMuIGFuZCBhcmUgcmVwcm9kdWNlZCBoZXJlaW4gd2l0aAorICogdGhlIHBlcm1pc3Npb24gb2YgVU5JWCBTeXN0ZW0gTGFib3JhdG9yaWVzLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGF1dGhvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylkaW5vZGUuaAk4LjMgKEJlcmtlbGV5KSAxLzIxLzk0CisgKiAkRnJlZUJTRDogc3JjL3N5cy91ZnMvdWZzL2Rpbm9kZS5oLHYgMS4xMSAyMDAyLzA3LzE2IDIyOjM2OjAwIG1ja3VzaWNrIEV4cCAkCisgKi8KKworI2lmbmRlZiBfR1JVQl9VRlMyX0hfCisjZGVmaW5lIF9HUlVCX1VGUzJfSF8KKwordHlwZWRlZiBzaWduZWQgY2hhciAgICAgICAgICAgIGdydWJfaW50OF90OwordHlwZWRlZiBzaWduZWQgc2hvcnQgICAgICAgICAgIGdydWJfaW50MTZfdDsKK3R5cGVkZWYgc2lnbmVkIGludCAgICAgICAgICAgICBncnViX2ludDMyX3Q7Cit0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgaW50ICAgZ3J1Yl9pbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgICAgIGdydWJfdWludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICAgICBncnViX3VpbnQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgIGdydWJfdWludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgZ3J1Yl91aW50NjRfdDsKKwordHlwZWRlZiBncnViX3VpbnQ4X3QgICAgICAgICAgICAgICAgZ3J1Yl91X2NoYXI7Cit0eXBlZGVmIGdydWJfdWludDMyX3QgICAgICAgICAgICAgICBncnViX3VfaW50OworCit0eXBlZGVmIGdydWJfdWludDhfdCAgICAgICAgICAgICAgICBncnViX3VfaW50OF90OwordHlwZWRlZiBncnViX3VpbnQxNl90ICAgICAgICAgICAgICAgZ3J1Yl91X2ludDE2X3Q7Cit0eXBlZGVmIGdydWJfdWludDMyX3QgICAgICAgICAgICAgICBncnViX3VfaW50MzJfdDsKK3R5cGVkZWYgZ3J1Yl91aW50NjRfdCAgICAgICAgICAgICAgIGdydWJfdV9pbnQ2NF90OworCisjZGVmaW5lIGlfc2l6ZSBkaV9zaXplCisKKworI2RlZmluZSBERVZfQlNJWkUgNTEyCisKKy8qCisgKiBUaGUgcm9vdCBpbm9kZSBpcyB0aGUgcm9vdCBvZiB0aGUgZmlsZXN5c3RlbS4gIElub2RlIDAgY2FuJ3QgYmUgdXNlZCBmb3IKKyAqIG5vcm1hbCBwdXJwb3NlcyBhbmQgaGlzdG9yaWNhbGx5IGJhZCBibG9ja3Mgd2VyZSBsaW5rZWQgdG8gaW5vZGUgMSwgdGh1cworICogdGhlIHJvb3QgaW5vZGUgaXMgMi4gIChJbm9kZSAxIGlzIG5vIGxvbmdlciB1c2VkIGZvciB0aGlzIHB1cnBvc2UsIGhvd2V2ZXIKKyAqIG51bWVyb3VzIGR1bXAgdGFwZXMgbWFrZSB0aGlzIGFzc3VtcHRpb24sIHNvIHdlIGFyZSBzdHVjayB3aXRoIGl0KS4KKyAqLworI2RlZmluZQlST09USU5PCSgoZ3J1Yl9pbm9fdCkyKQorCisvKgorICogVGhlIHNpemUgb2YgcGh5c2ljYWwgYW5kIGxvZ2ljYWwgYmxvY2sgbnVtYmVycyBhbmQgdGltZSBmaWVsZHMgaW4gVUZTLgorICovCit0eXBlZGVmIGdydWJfaW50MzJfdCB1ZnMxX2RhZGRyX3Q7Cit0eXBlZGVmCWdydWJfaW50NjRfdAl1ZnMyX2RhZGRyX3Q7Cit0eXBlZGVmIGdydWJfaW50NjRfdCB1ZnNfbGJuX3Q7Cit0eXBlZGVmIGdydWJfaW50NjRfdCB1ZnNfdGltZV90OworCisvKiBpbm9kZSBudW1iZXIgKi8KK3R5cGVkZWYgZ3J1Yl91aW50MzJfdCAgICAgIGdydWJfaW5vX3Q7CisKKy8qIEZpbGUgcGVybWlzc2lvbnMuICovCisjZGVmaW5lCUlFWEVDCQkwMDAwMTAwCQkvKiBFeGVjdXRhYmxlLiAqLworI2RlZmluZQlJV1JJVEUJCTAwMDAyMDAJCS8qIFdyaXRlYWJsZS4gKi8KKyNkZWZpbmUJSVJFQUQJCTAwMDA0MDAJCS8qIFJlYWRhYmxlLiAqLworI2RlZmluZQlJU1ZUWAkJMDAwMTAwMAkJLyogU3RpY2t5IGJpdC4gKi8KKyNkZWZpbmUJSVNHSUQJCTAwMDIwMDAJCS8qIFNldC1naWQuICovCisjZGVmaW5lCUlTVUlECQkwMDA0MDAwCQkvKiBTZXQtdWlkLiAqLworCisvKiBGaWxlIHR5cGVzLiAqLworI2RlZmluZQlJRk1UCQkwMTcwMDAwCQkvKiBNYXNrIG9mIGZpbGUgdHlwZS4gKi8KKyNkZWZpbmUJSUZJRk8JCTAwMTAwMDAJCS8qIE5hbWVkIHBpcGUgKGZpZm8pLiAqLworI2RlZmluZQlJRkNIUgkJMDAyMDAwMAkJLyogQ2hhcmFjdGVyIGRldmljZS4gKi8KKyNkZWZpbmUJSUZESVIJCTAwNDAwMDAJCS8qIERpcmVjdG9yeSBmaWxlLiAqLworI2RlZmluZQlJRkJMSwkJMDA2MDAwMAkJLyogQmxvY2sgZGV2aWNlLiAqLworI2RlZmluZQlJRlJFRwkJMDEwMDAwMAkJLyogUmVndWxhciBmaWxlLiAqLworI2RlZmluZQlJRkxOSwkJMDEyMDAwMAkJLyogU3ltYm9saWMgbGluay4gKi8KKyNkZWZpbmUJSUZTT0NLCQkwMTQwMDAwCQkvKiBVTklYIGRvbWFpbiBzb2NrZXQuICovCisjZGVmaW5lCUlGV0hUCQkwMTYwMDAwCQkvKiBXaGl0ZW91dC4gKi8KKworLyoKKyAqIEEgZGlub2RlIGNvbnRhaW5zIGFsbCB0aGUgbWV0YS1kYXRhIGFzc29jaWF0ZWQgd2l0aCBhIFVGUzIgZmlsZS4KKyAqIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIG9uLWRpc2sgZm9ybWF0IG9mIGEgZGlub2RlLiBTaW5jZQorICogdGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGFuIG9uLWRpc2sgc3RydWN0dXJlLCBhbGwgaXRzIGZpZWxkcworICogYXJlIGRlZmluZWQgYnkgdHlwZXMgd2l0aCBwcmVjaXNlIHdpZHRocy4KKyAqLworCisjZGVmaW5lCU5YQUREUgkyCQkJLyogRXh0ZXJuYWwgYWRkcmVzc2VzIGluIGlub2RlLiAqLworI2RlZmluZQlOREFERFIJMTIJCQkvKiBEaXJlY3QgYWRkcmVzc2VzIGluIGlub2RlLiAqLworI2RlZmluZQlOSUFERFIJMwkJCS8qIEluZGlyZWN0IGFkZHJlc3NlcyBpbiBpbm9kZS4gKi8KKworc3RydWN0IHVmczFfZGlub2RlIHsKKwlncnViX3VfaW50MTZfdCAgICAgICBkaV9tb2RlOyAgICAgICAgLyogICAwOiBJRk1ULCBwZXJtaXNzaW9uczsgc2VlIGJlbG93LiAqLworCWdydWJfaW50MTZfdCAgICAgICAgIGRpX25saW5rOyAgICAgICAvKiAgIDI6IEZpbGUgbGluayBjb3VudC4gKi8KKwl1bmlvbiB7CisJCWdydWJfdV9pbnQxNl90IG9sZGlkc1syXTsgICAgLyogICA0OiBGZnM6IG9sZCB1c2VyIGFuZCBncm91cCBpZHMuICovCisJfSBkaV91OworCWdydWJfdV9pbnQ2NF90ICAgICAgIGRpX3NpemU7ICAgICAgICAvKiAgIDg6IEZpbGUgYnl0ZSBjb3VudC4gKi8KKwlncnViX2ludDMyX3QgICAgICAgICBkaV9hdGltZTsgICAgICAgLyogIDE2OiBMYXN0IGFjY2VzcyB0aW1lLiAqLworCWdydWJfaW50MzJfdCAgICAgICAgIGRpX2F0aW1lbnNlYzsgICAvKiAgMjA6IExhc3QgYWNjZXNzIHRpbWUuICovCisJZ3J1Yl9pbnQzMl90ICAgICAgICAgZGlfbXRpbWU7ICAgICAgIC8qICAyNDogTGFzdCBtb2RpZmllZCB0aW1lLiAqLworCWdydWJfaW50MzJfdCAgICAgICAgIGRpX210aW1lbnNlYzsgICAvKiAgMjg6IExhc3QgbW9kaWZpZWQgdGltZS4gKi8KKwlncnViX2ludDMyX3QgICAgICAgICBkaV9jdGltZTsgICAgICAgLyogIDMyOiBMYXN0IGlub2RlIGNoYW5nZSB0aW1lLiAqLworCWdydWJfaW50MzJfdCAgICAgICAgIGRpX2N0aW1lbnNlYzsgICAvKiAgMzY6IExhc3QgaW5vZGUgY2hhbmdlIHRpbWUuICovCisJdWZzMV9kYWRkcl90ICAgIGRpX2RiW05EQUREUl07ICAvKiAgNDA6IERpcmVjdCBkaXNrIGJsb2Nrcy4gKi8KKwl1ZnMxX2RhZGRyX3QgICAgZGlfaWJbTklBRERSXTsgIC8qICA4ODogSW5kaXJlY3QgZGlzayBibG9ja3MuICovCisJZ3J1Yl91X2ludDMyX3QgICAgICAgZGlfZmxhZ3M7ICAgICAgIC8qIDEwMDogU3RhdHVzIGZsYWdzIChjaGZsYWdzKS4gKi8KKwlncnViX2ludDMyX3QgICAgICAgICBkaV9ibG9ja3M7ICAgICAgLyogMTA0OiBCbG9ja3MgYWN0dWFsbHkgaGVsZC4gKi8KKwlncnViX2ludDMyX3QgICAgICAgICBkaV9nZW47ICAgICAgICAgLyogMTA4OiBHZW5lcmF0aW9uIG51bWJlci4gKi8KKwlncnViX3VfaW50MzJfdCAgICAgICBkaV91aWQ7ICAgICAgICAgLyogMTEyOiBGaWxlIG93bmVyLiAqLworCWdydWJfdV9pbnQzMl90ICAgICAgIGRpX2dpZDsgICAgICAgICAvKiAxMTY6IEZpbGUgZ3JvdXAuICovCisJZ3J1Yl9pbnQzMl90ICAgICAgICAgZGlfc3BhcmVbMl07ICAgIC8qIDEyMDogUmVzZXJ2ZWQ7IGN1cnJlbnRseSB1bnVzZWQgKi8KK307CisKK3N0cnVjdCB1ZnMyX2Rpbm9kZSB7CisJZ3J1Yl91X2ludDE2X3QJZGlfbW9kZTsJLyogICAwOiBJRk1ULCBwZXJtaXNzaW9uczsgc2VlIGJlbG93LiAqLworCWdydWJfaW50MTZfdAkJZGlfbmxpbms7CS8qICAgMjogRmlsZSBsaW5rIGNvdW50LiAqLworCWdydWJfdV9pbnQzMl90CWRpX3VpZDsJCS8qICAgNDogRmlsZSBvd25lci4gKi8KKwlncnViX3VfaW50MzJfdAlkaV9naWQ7CQkvKiAgIDg6IEZpbGUgZ3JvdXAuICovCisJZ3J1Yl91X2ludDMyX3QJZGlfYmxrc2l6ZTsJLyogIDEyOiBJbm9kZSBibG9ja3NpemUuICovCisJZ3J1Yl91X2ludDY0X3QJZGlfc2l6ZTsJLyogIDE2OiBGaWxlIGJ5dGUgY291bnQuICovCisJZ3J1Yl91X2ludDY0X3QJZGlfYmxvY2tzOwkvKiAgMjQ6IEJ5dGVzIGFjdHVhbGx5IGhlbGQuICovCisJdWZzX3RpbWVfdAlkaV9hdGltZTsJLyogIDMyOiBMYXN0IGFjY2VzcyB0aW1lLiAqLworCXVmc190aW1lX3QJZGlfbXRpbWU7CS8qICA0MDogTGFzdCBtb2RpZmllZCB0aW1lLiAqLworCXVmc190aW1lX3QJZGlfY3RpbWU7CS8qICA0ODogTGFzdCBpbm9kZSBjaGFuZ2UgdGltZS4gKi8KKwl1ZnNfdGltZV90CWRpX2JpcnRodGltZTsJLyogIDU2OiBJbm9kZSBjcmVhdGlvbiB0aW1lLiAqLworCWdydWJfaW50MzJfdAkJZGlfbXRpbWVuc2VjOwkvKiAgNjQ6IExhc3QgbW9kaWZpZWQgdGltZS4gKi8KKwlncnViX2ludDMyX3QJCWRpX2F0aW1lbnNlYzsJLyogIDY4OiBMYXN0IGFjY2VzcyB0aW1lLiAqLworCWdydWJfaW50MzJfdAkJZGlfY3RpbWVuc2VjOwkvKiAgNzI6IExhc3QgaW5vZGUgY2hhbmdlIHRpbWUuICovCisJZ3J1Yl9pbnQzMl90CQlkaV9iaXJ0aG5zZWM7CS8qICA3NjogSW5vZGUgY3JlYXRpb24gdGltZS4gKi8KKwlncnViX2ludDMyX3QJCWRpX2dlbjsJCS8qICA4MDogR2VuZXJhdGlvbiBudW1iZXIuICovCisJZ3J1Yl91X2ludDMyX3QJZGlfa2VybmZsYWdzOwkvKiAgODQ6IEtlcm5lbCBmbGFncy4gKi8KKwlncnViX3VfaW50MzJfdAlkaV9mbGFnczsJLyogIDg4OiBTdGF0dXMgZmxhZ3MgKGNoZmxhZ3MpLiAqLworCWdydWJfaW50MzJfdAkJZGlfZXh0c2l6ZTsJLyogIDkyOiBFeHRlcm5hbCBhdHRyaWJ1dGVzIGJsb2NrLiAqLworCXVmczJfZGFkZHJfdAlkaV9leHRiW05YQUREUl07LyogIDk2OiBFeHRlcm5hbCBhdHRyaWJ1dGVzIGJsb2NrLiAqLworCXVmczJfZGFkZHJfdAlkaV9kYltOREFERFJdOwkvKiAxMTI6IERpcmVjdCBkaXNrIGJsb2Nrcy4gKi8KKwl1ZnMyX2RhZGRyX3QJZGlfaWJbTklBRERSXTsJLyogMjA4OiBJbmRpcmVjdCBkaXNrIGJsb2Nrcy4gKi8KKwlncnViX2ludDY0X3QJCWRpX3NwYXJlWzNdOwkvKiAyMzI6IFJlc2VydmVkOyBjdXJyZW50bHkgdW51c2VkICovCit9OworCisjZGVmaW5lCU1BWE5BTUxFTgkyNTUKKworc3RydWN0CWRpcmVjdCB7CisJZ3J1Yl91X2ludDMyX3QgZF9pbm87CQkvKiBpbm9kZSBudW1iZXIgb2YgZW50cnkgKi8KKwlncnViX3VfaW50MTZfdCBkX3JlY2xlbjsJCS8qIGxlbmd0aCBvZiB0aGlzIHJlY29yZCAqLworCWdydWJfdV9pbnQ4X3QgIGRfdHlwZTsgCQkvKiBmaWxlIHR5cGUsIHNlZSBiZWxvdyAqLworCWdydWJfdV9pbnQ4X3QgIGRfbmFtbGVuOwkJLyogbGVuZ3RoIG9mIHN0cmluZyBpbiBkX25hbWUgKi8KKwljaGFyCSAgZF9uYW1lW01BWE5BTUxFTiArIDFdOy8qIG5hbWUgd2l0aCBsZW5ndGggPD0gTUFYTkFNTEVOICovCit9OworCisvKgorICogRmlsZSB0eXBlcworICovCisjZGVmaW5lIERUX1VOS05PV04gICAgICAgMAorI2RlZmluZSBEVF9GSUZPICAgICAgICAgIDEKKyNkZWZpbmUgRFRfQ0hSICAgICAgICAgICAyCisjZGVmaW5lIERUX0RJUiAgICAgICAgICAgNAorI2RlZmluZSBEVF9CTEsgICAgICAgICAgIDYKKyNkZWZpbmUgRFRfUkVHICAgICAgICAgICA4CisjZGVmaW5lIERUX0xOSyAgICAgICAgICAxMAorI2RlZmluZSBEVF9TT0NLICAgICAgICAgMTIKKyNkZWZpbmUgRFRfV0hUICAgICAgICAgIDE0CisKKy8qCisgKiBTdXBlcmJsb2NrIG9mZnNldHMKKyAqLworI2RlZmluZSBTQkxPQ0tfRkxPUFBZICAgICAgICAwCisjZGVmaW5lIFNCTE9DS19VRlMxICAgICAgIDgxOTIKKyNkZWZpbmUgU0JMT0NLX1VGUzIgICAgICA2NTUzNgorI2RlZmluZSBTQkxPQ0tfUElHR1kgICAgMjYyMTQ0CisjZGVmaW5lIFNCTE9DS1NJWkUgICAgICAgIDgxOTIKKyNkZWZpbmUgU0JMT0NLU0VBUkNIIFwKKwl7IFNCTE9DS19VRlMyLCBTQkxPQ0tfVUZTMSwgU0JMT0NLX0ZMT1BQWSwgU0JMT0NLX1BJR0dZLCAtMSB9CisKKyNkZWZpbmUgTUFYTU5UTEVOCTUxMgorCisjZGVmaW5lCU5PQ1NQVFJTCSgoMTI4IC8gc2l6ZW9mKHZvaWQgKikpIC0gNCkKKworLyoKKyAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzbmFwc2hvdCBub2RlcyB0aGF0IGNhbiBiZSBhc3NvY2lhdGVkCisgKiB3aXRoIGVhY2ggZmlsZXN5c3RlbS4gVGhpcyBsaW1pdCBhZmZlY3RzIG9ubHkgdGhlIG51bWJlciBvZgorICogc25hcHNob3QgZmlsZXMgdGhhdCBjYW4gYmUgcmVjb3JkZWQgd2l0aGluIHRoZSBzdXBlcmJsb2NrIHNvCisgKiB0aGF0IHRoZXkgY2FuIGJlIGZvdW5kIHdoZW4gdGhlIGZpbGVzeXN0ZW0gaXMgbW91bnRlZC4gSG93ZXZlciwKKyAqIG1haW50YWluaW5nIHRvbyBtYW55IHdpbGwgc2xvdyB0aGUgZmlsZXN5c3RlbSBwZXJmb3JtYW5jZSwgc28KKyAqIGhhdmluZyB0aGlzIGxpbWl0IGlzIGEgZ29vZCBpZGVhLgorICovCisjZGVmaW5lIEZTTUFYU05BUCAyMAorCQorLyoKKyAqIFBlciBjeWxpbmRlciBncm91cCBpbmZvcm1hdGlvbjsgc3VtbWFyaXplZCBpbiBibG9ja3MgYWxsb2NhdGVkCisgKiBmcm9tIGZpcnN0IGN5bGluZGVyIGdyb3VwIGRhdGEgYmxvY2tzLiAgVGhlc2UgYmxvY2tzIGhhdmUgdG8gYmUKKyAqIHJlYWQgaW4gZnJvbSBmc19jc2FkZHIgKHNpemUgZnNfY3NzaXplKSBpbiBhZGRpdGlvbiB0byB0aGUKKyAqIHN1cGVyIGJsb2NrLgorICovCitzdHJ1Y3QgY3N1bSB7CisJZ3J1Yl9pbnQzMl90CWNzX25kaXI7CQkvKiBudW1iZXIgb2YgZGlyZWN0b3JpZXMgKi8KKwlncnViX2ludDMyX3QJY3NfbmJmcmVlOwkJLyogbnVtYmVyIG9mIGZyZWUgYmxvY2tzICovCisJZ3J1Yl9pbnQzMl90CWNzX25pZnJlZTsJCS8qIG51bWJlciBvZiBmcmVlIGlub2RlcyAqLworCWdydWJfaW50MzJfdAljc19uZmZyZWU7CQkvKiBudW1iZXIgb2YgZnJlZSBmcmFncyAqLworfTsKKworc3RydWN0IGNzdW1fdG90YWwgeworCWdydWJfaW50NjRfdAljc19uZGlyOwkJLyogbnVtYmVyIG9mIGRpcmVjdG9yaWVzICovCisJZ3J1Yl9pbnQ2NF90CWNzX25iZnJlZTsJCS8qIG51bWJlciBvZiBmcmVlIGJsb2NrcyAqLworCWdydWJfaW50NjRfdAljc19uaWZyZWU7CQkvKiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgKi8KKwlncnViX2ludDY0X3QJY3NfbmZmcmVlOwkJLyogbnVtYmVyIG9mIGZyZWUgZnJhZ3MgKi8KKwlncnViX2ludDY0X3QJY3NfbnVtY2x1c3RlcnM7CQkvKiBudW1iZXIgb2YgZnJlZSBjbHVzdGVycyAqLworCWdydWJfaW50NjRfdAljc19zcGFyZVszXTsJCS8qIGZ1dHVyZSBleHBhbnNpb24gKi8KK307CisKKy8qCisgKiBTdXBlciBibG9jayBmb3IgYW4gRkZTIGZpbGVzeXN0ZW0uCisgKi8KK3N0cnVjdCBmcyB7CisJZ3J1Yl9pbnQzMl90CSBmc19maXJzdGZpZWxkOwkJLyogaGlzdG9yaWMgZmlsZXN5c3RlbSBsaW5rZWQgbGlzdCwgKi8KKwlncnViX2ludDMyX3QJIGZzX3VudXNlZF8xOwkJLyogICAgIHVzZWQgZm9yIGluY29yZSBzdXBlciBibG9ja3MgKi8KKwlncnViX2ludDMyX3QJIGZzX3NibGtubzsJCS8qIG9mZnNldCBvZiBzdXBlci1ibG9jayBpbiBmaWxlc3lzICovCisJZ3J1Yl9pbnQzMl90CSBmc19jYmxrbm87CQkvKiBvZmZzZXQgb2YgY3lsLWJsb2NrIGluIGZpbGVzeXMgKi8KKwlncnViX2ludDMyX3QJIGZzX2libGtubzsJCS8qIG9mZnNldCBvZiBpbm9kZS1ibG9ja3MgaW4gZmlsZXN5cyAqLworCWdydWJfaW50MzJfdAkgZnNfZGJsa25vOwkJLyogb2Zmc2V0IG9mIGZpcnN0IGRhdGEgYWZ0ZXIgY2cgKi8KKwlncnViX2ludDMyX3QJIGZzX29sZF9jZ29mZnNldDsJLyogY3lsaW5kZXIgZ3JvdXAgb2Zmc2V0IGluIGN5bGluZGVyICovCisJZ3J1Yl9pbnQzMl90CSBmc19vbGRfY2dtYXNrOwkJLyogdXNlZCB0byBjYWxjIG1vZCBmc19udHJhayAqLworCWdydWJfaW50MzJfdCAgZnNfb2xkX3RpbWU7CQkvKiBsYXN0IHRpbWUgd3JpdHRlbiAqLworCWdydWJfaW50MzJfdAkgZnNfb2xkX3NpemU7CQkvKiBudW1iZXIgb2YgYmxvY2tzIGluIGZzICovCisJZ3J1Yl9pbnQzMl90CSBmc19vbGRfZHNpemU7CQkvKiBudW1iZXIgb2YgZGF0YSBibG9ja3MgaW4gZnMgKi8KKwlncnViX2ludDMyX3QJIGZzX25jZzsJCS8qIG51bWJlciBvZiBjeWxpbmRlciBncm91cHMgKi8KKwlncnViX2ludDMyX3QJIGZzX2JzaXplOwkJLyogc2l6ZSBvZiBiYXNpYyBibG9ja3MgaW4gZnMgKi8KKwlncnViX2ludDMyX3QJIGZzX2ZzaXplOwkJLyogc2l6ZSBvZiBmcmFnIGJsb2NrcyBpbiBmcyAqLworCWdydWJfaW50MzJfdAkgZnNfZnJhZzsJCS8qIG51bWJlciBvZiBmcmFncyBpbiBhIGJsb2NrIGluIGZzICovCisvKiB0aGVzZSBhcmUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCisJZ3J1Yl9pbnQzMl90CSBmc19taW5mcmVlOwkJLyogbWluaW11bSBwZXJjZW50YWdlIG9mIGZyZWUgYmxvY2tzICovCisJZ3J1Yl9pbnQzMl90CSBmc19vbGRfcm90ZGVsYXk7CS8qIG51bSBvZiBtcyBmb3Igb3B0aW1hbCBuZXh0IGJsb2NrICovCisJZ3J1Yl9pbnQzMl90CSBmc19vbGRfcnBzOwkJLyogZGlzayByZXZvbHV0aW9ucyBwZXIgc2Vjb25kICovCisvKiB0aGVzZSBmaWVsZHMgY2FuIGJlIGNvbXB1dGVkIGZyb20gdGhlIG90aGVycyAqLworCWdydWJfaW50MzJfdAkgZnNfYm1hc2s7CQkvKiBgYGJsa29mZicnIGNhbGMgb2YgYmxrIG9mZnNldHMgKi8KKwlncnViX2ludDMyX3QJIGZzX2ZtYXNrOwkJLyogYGBmcmFnb2ZmJycgY2FsYyBvZiBmcmFnIG9mZnNldHMgKi8KKwlncnViX2ludDMyX3QJIGZzX2JzaGlmdDsJCS8qIGBgbGJsa25vJycgY2FsYyBvZiBsb2dpY2FsIGJsa25vICovCisJZ3J1Yl9pbnQzMl90CSBmc19mc2hpZnQ7CQkvKiBgYG51bWZyYWdzJycgY2FsYyBudW1iZXIgb2YgZnJhZ3MgKi8KKy8qIHRoZXNlIGFyZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi8KKwlncnViX2ludDMyX3QJIGZzX21heGNvbnRpZzsJCS8qIG1heCBudW1iZXIgb2YgY29udGlndW91cyBibGtzICovCisJZ3J1Yl9pbnQzMl90CSBmc19tYXhicGc7CQkvKiBtYXggbnVtYmVyIG9mIGJsa3MgcGVyIGN5bCBncm91cCAqLworLyogdGhlc2UgZmllbGRzIGNhbiBiZSBjb21wdXRlZCBmcm9tIHRoZSBvdGhlcnMgKi8KKwlncnViX2ludDMyX3QJIGZzX2ZyYWdzaGlmdDsJCS8qIGJsb2NrIHRvIGZyYWcgc2hpZnQgKi8KKwlncnViX2ludDMyX3QJIGZzX2ZzYnRvZGI7CQkvKiBmc2J0b2RiIGFuZCBkYnRvZnNiIHNoaWZ0IGNvbnN0YW50ICovCisJZ3J1Yl9pbnQzMl90CSBmc19zYnNpemU7CQkvKiBhY3R1YWwgc2l6ZSBvZiBzdXBlciBibG9jayAqLworCWdydWJfaW50MzJfdAkgZnNfc3BhcmUxWzJdOwkJLyogb2xkIGZzX2NzbWFzayAqLworCQkJCQkvKiBvbGQgZnNfY3NzaGlmdCAqLworCWdydWJfaW50MzJfdAkgZnNfbmluZGlyOwkJLyogdmFsdWUgb2YgTklORElSICovCisJZ3J1Yl9pbnQzMl90CSBmc19pbm9wYjsJCS8qIHZhbHVlIG9mIElOT1BCICovCisJZ3J1Yl9pbnQzMl90CSBmc19vbGRfbnNwZjsJCS8qIHZhbHVlIG9mIE5TUEYgKi8KKy8qIHlldCBhbm90aGVyIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICovCisJZ3J1Yl9pbnQzMl90CSBmc19vcHRpbTsJCS8qIG9wdGltaXphdGlvbiBwcmVmZXJlbmNlLCBzZWUgYmVsb3cgKi8KKwlncnViX2ludDMyX3QJIGZzX29sZF9ucHNlY3Q7CQkvKiAjIHNlY3RvcnMvdHJhY2sgaW5jbHVkaW5nIHNwYXJlcyAqLworCWdydWJfaW50MzJfdAkgZnNfb2xkX2ludGVybGVhdmU7CS8qIGhhcmR3YXJlIHNlY3RvciBpbnRlcmxlYXZlICovCisJZ3J1Yl9pbnQzMl90CSBmc19vbGRfdHJhY2tza2V3OwkvKiBzZWN0b3IgMCBza2V3LCBwZXIgdHJhY2sgKi8KKwlncnViX2ludDMyX3QJIGZzX2lkWzJdOwkJLyogdW5pcXVlIGZpbGVzeXN0ZW0gaWQgKi8KKy8qIHNpemVzIGRldGVybWluZWQgYnkgbnVtYmVyIG9mIGN5bGluZGVyIGdyb3VwcyBhbmQgdGhlaXIgc2l6ZXMgKi8KKwlncnViX2ludDMyX3QJIGZzX29sZF9jc2FkZHI7CQkvKiBibGsgYWRkciBvZiBjeWwgZ3JwIHN1bW1hcnkgYXJlYSAqLworCWdydWJfaW50MzJfdAkgZnNfY3NzaXplOwkJLyogc2l6ZSBvZiBjeWwgZ3JwIHN1bW1hcnkgYXJlYSAqLworCWdydWJfaW50MzJfdAkgZnNfY2dzaXplOwkJLyogY3lsaW5kZXIgZ3JvdXAgc2l6ZSAqLworCWdydWJfaW50MzJfdAkgZnNfc3BhcmUyOwkJLyogb2xkIGZzX250cmFrICovCisJZ3J1Yl9pbnQzMl90CSBmc19vbGRfbnNlY3Q7CQkvKiBzZWN0b3JzIHBlciB0cmFjayAqLworCWdydWJfaW50MzJfdCAgZnNfb2xkX3NwYzsJCS8qIHNlY3RvcnMgcGVyIGN5bGluZGVyICovCisJZ3J1Yl9pbnQzMl90CSBmc19vbGRfbmN5bDsJCS8qIGN5bGluZGVycyBpbiBmaWxlc3lzdGVtICovCisJZ3J1Yl9pbnQzMl90CSBmc19vbGRfY3BnOwkJLyogY3lsaW5kZXJzIHBlciBncm91cCAqLworCWdydWJfaW50MzJfdAkgZnNfaXBnOwkJLyogaW5vZGVzIHBlciBncm91cCAqLworCWdydWJfaW50MzJfdAkgZnNfZnBnOwkJLyogYmxvY2tzIHBlciBncm91cCAqIGZzX2ZyYWcgKi8KKy8qIHRoaXMgZGF0YSBtdXN0IGJlIHJlLWNvbXB1dGVkIGFmdGVyIGNyYXNoZXMgKi8KKwlzdHJ1Y3QJY3N1bSBmc19vbGRfY3N0b3RhbDsJLyogY3lsaW5kZXIgc3VtbWFyeSBpbmZvcm1hdGlvbiAqLworLyogdGhlc2UgZmllbGRzIGFyZSBjbGVhcmVkIGF0IG1vdW50IHRpbWUgKi8KKwlncnViX2ludDhfdCAgIGZzX2Ztb2Q7CQkvKiBzdXBlciBibG9jayBtb2RpZmllZCBmbGFnICovCisJZ3J1Yl9pbnQ4X3QgICBmc19jbGVhbjsJCS8qIGZpbGVzeXN0ZW0gaXMgY2xlYW4gZmxhZyAqLworCWdydWJfaW50OF90IAkgZnNfcm9ubHk7CQkvKiBtb3VudGVkIHJlYWQtb25seSBmbGFnICovCisJZ3J1Yl9pbnQ4X3QgICBmc19vbGRfZmxhZ3M7CQkvKiBvbGQgRlNfIGZsYWdzICovCisJZ3J1Yl91X2NoYXIJIGZzX2ZzbW50W01BWE1OVExFTl07CS8qIG5hbWUgbW91bnRlZCBvbiAqLworLyogdGhlc2UgZmllbGRzIHJldGFpbiB0aGUgY3VycmVudCBibG9jayBhbGxvY2F0aW9uIGluZm8gKi8KKwlncnViX2ludDMyX3QJIGZzX2Nncm90b3I7CQkvKiBsYXN0IGNnIHNlYXJjaGVkICovCisJdm9pZCAJKmZzX29jc3BbTk9DU1BUUlNdOwkvKiBwYWRkaW5nOyB3YXMgbGlzdCBvZiBmc19jcyBidWZmZXJzICovCisJZ3J1Yl91X2ludDhfdCAqZnNfY29udGlnZGlyczsJLyogIyBvZiBjb250aWd1b3VzbHkgYWxsb2NhdGVkIGRpcnMgKi8KKwlzdHJ1Y3QJY3N1bSAqZnNfY3NwOwkJLyogY2cgc3VtbWFyeSBpbmZvIGJ1ZmZlciBmb3IgZnNfY3MgKi8KKwlncnViX2ludDMyX3QJKmZzX21heGNsdXN0ZXI7CQkvKiBtYXggY2x1c3RlciBpbiBlYWNoIGN5bCBncm91cCAqLworCWdydWJfdV9pbnQJKmZzX2FjdGl2ZTsJCS8qIHVzZWQgYnkgc25hcHNob3RzIHRvIHRyYWNrIGZzICovCisJZ3J1Yl9pbnQzMl90CSBmc19vbGRfY3BjOwkJLyogY3lsIHBlciBjeWNsZSBpbiBwb3N0YmwgKi8KKwlncnViX2ludDMyX3QJIGZzX21heGJzaXplOwkJLyogbWF4aW11bSBibG9ja2luZyBmYWN0b3IgcGVybWl0dGVkICovCisJZ3J1Yl9pbnQ2NF90CSBmc19zcGFyZWNvbjY0WzE3XTsJLyogb2xkIHJvdGF0aW9uIGJsb2NrIGxpc3QgaGVhZCAqLworCWdydWJfaW50NjRfdAkgZnNfc2Jsb2NrbG9jOwkJLyogYnl0ZSBvZmZzZXQgb2Ygc3RhbmRhcmQgc3VwZXJibG9jayAqLworCXN0cnVjdAljc3VtX3RvdGFsIGZzX2NzdG90YWw7CS8qIGN5bGluZGVyIHN1bW1hcnkgaW5mb3JtYXRpb24gKi8KKwl1ZnNfdGltZV90IGZzX3RpbWU7CQkvKiBsYXN0IHRpbWUgd3JpdHRlbiAqLworCWdydWJfaW50NjRfdAkgZnNfc2l6ZTsJCS8qIG51bWJlciBvZiBibG9ja3MgaW4gZnMgKi8KKwlncnViX2ludDY0X3QJIGZzX2RzaXplOwkJLyogbnVtYmVyIG9mIGRhdGEgYmxvY2tzIGluIGZzICovCisJdWZzMl9kYWRkcl90IGZzX2NzYWRkcjsJCS8qIGJsayBhZGRyIG9mIGN5bCBncnAgc3VtbWFyeSBhcmVhICovCisJZ3J1Yl9pbnQ2NF90CSBmc19wZW5kaW5nYmxvY2tzOwkvKiBibG9ja3MgaW4gcHJvY2VzcyBvZiBiZWluZyBmcmVlZCAqLworCWdydWJfaW50MzJfdAkgZnNfcGVuZGluZ2lub2RlczsJLyogaW5vZGVzIGluIHByb2Nlc3Mgb2YgYmVpbmcgZnJlZWQgKi8KKwlncnViX2ludDMyX3QJIGZzX3NuYXBpbnVtW0ZTTUFYU05BUF07LyogbGlzdCBvZiBzbmFwc2hvdCBpbm9kZSBudW1iZXJzICovCisJZ3J1Yl9pbnQzMl90CSBmc19hdmdmaWxlc2l6ZTsJLyogZXhwZWN0ZWQgYXZlcmFnZSBmaWxlIHNpemUgKi8KKwlncnViX2ludDMyX3QJIGZzX2F2Z2ZwZGlyOwkJLyogZXhwZWN0ZWQgIyBvZiBmaWxlcyBwZXIgZGlyZWN0b3J5ICovCisJZ3J1Yl9pbnQzMl90CSBmc19zYXZlX2Nnc2l6ZTsJLyogc2F2ZSByZWFsIGNnIHNpemUgdG8gdXNlIGZzX2JzaXplICovCisJZ3J1Yl9pbnQzMl90CSBmc19zcGFyZWNvbjMyWzI2XTsJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBjb25zdGFudHMgKi8KKwlncnViX2ludDMyX3QgIGZzX2ZsYWdzOwkJLyogc2VlIEZTXyBmbGFncyBiZWxvdyAqLworCWdydWJfaW50MzJfdAkgZnNfY29udGlnc3Vtc2l6ZTsJLyogc2l6ZSBvZiBjbHVzdGVyIHN1bW1hcnkgYXJyYXkgKi8gCisJZ3J1Yl9pbnQzMl90CSBmc19tYXhzeW1saW5rbGVuOwkvKiBtYXggbGVuZ3RoIG9mIGFuIGludGVybmFsIHN5bWxpbmsgKi8KKwlncnViX2ludDMyX3QJIGZzX29sZF9pbm9kZWZtdDsJLyogZm9ybWF0IG9mIG9uLWRpc2sgaW5vZGVzICovCisJZ3J1Yl91X2ludDY0X3QgZnNfbWF4ZmlsZXNpemU7CS8qIG1heGltdW0gcmVwcmVzZW50YWJsZSBmaWxlIHNpemUgKi8KKwlncnViX2ludDY0X3QJIGZzX3FibWFzazsJCS8qIH5mc19ibWFzayBmb3IgdXNlIHdpdGggNjQtYml0IHNpemUgKi8KKwlncnViX2ludDY0X3QJIGZzX3FmbWFzazsJCS8qIH5mc19mbWFzayBmb3IgdXNlIHdpdGggNjQtYml0IHNpemUgKi8KKwlncnViX2ludDMyX3QJIGZzX3N0YXRlOwkJLyogdmFsaWRhdGUgZnNfY2xlYW4gZmllbGQgKi8KKwlncnViX2ludDMyX3QJIGZzX29sZF9wb3N0Ymxmb3JtYXQ7CS8qIGZvcm1hdCBvZiBwb3NpdGlvbmFsIGxheW91dCB0YWJsZXMgKi8KKwlncnViX2ludDMyX3QJIGZzX29sZF9ucnBvczsJCS8qIG51bWJlciBvZiByb3RhdGlvbmFsIHBvc2l0aW9ucyAqLworCWdydWJfaW50MzJfdAkgZnNfc3BhcmU1WzJdOwkJLyogb2xkIGZzX3Bvc3RibG9mZiAqLworCQkJCQkvKiBvbGQgZnNfcm90YmxvZmYgKi8KKwlncnViX2ludDMyX3QJIGZzX21hZ2ljOwkJLyogbWFnaWMgbnVtYmVyICovCit9OworCisvKgorICogRmlsZXN5c3RlbSBpZGVudGlmaWNhdGlvbgorICovCisjZGVmaW5lIEZTX1VGUzFfTUFHSUMgICAweDAxMTk1NCAgICAgICAgLyogVUZTMSBmYXN0IGZpbGVzeXN0ZW0gbWFnaWMgbnVtYmVyICovCisjZGVmaW5lCUZTX1VGUzJfTUFHSUMJMHgxOTU0MDExOQkvKiBVRlMyIGZhc3QgZmlsZXN5c3RlbSBtYWdpYyBudW1iZXIgKi8KKworLyoKKyAqIFR1cm4gZmlsZXN5c3RlbSBibG9jayBudW1iZXJzIGludG8gZGlzayBibG9jayBhZGRyZXNzZXMuCisgKiBUaGlzIG1hcHMgZmlsZXN5c3RlbSBibG9ja3MgdG8gZGV2aWNlIHNpemUgYmxvY2tzLgorICovCisjZGVmaW5lIGZzYnRvZGIoZnMsIGIpCSgoYikgPDwgKGZzKS0+ZnNfZnNidG9kYikKKyNkZWZpbmUJZGJ0b2ZzYihmcywgYikJKChiKSA+PiAoZnMpLT5mc19mc2J0b2RiKQorCisvKgorICogQ3lsaW5kZXIgZ3JvdXAgbWFjcm9zIHRvIGxvY2F0ZSB0aGluZ3MgaW4gY3lsaW5kZXIgZ3JvdXBzLgorICogVGhleSBjYWxjIGZpbGVzeXN0ZW0gYWRkcmVzc2VzIG9mIGN5bGluZGVyIGdyb3VwIGRhdGEgc3RydWN0dXJlcy4KKyAqLworI2RlZmluZQljZ2Jhc2UoZnMsIGMpCSgodWZzMl9kYWRkcl90KSgoZnMpLT5mc19mcGcgKiAoYykpKQorI2RlZmluZQljZ2ltaW4oZnMsIGMpCShjZ3N0YXJ0KGZzLCBjKSArIChmcyktPmZzX2libGtubykJLyogaW5vZGUgYmxrICovCisjZGVmaW5lIGNnc3RhcnQoZnMsIGMpCQkJCQkJCVwKKyAgICAgICAoKGZzKS0+ZnNfbWFnaWMgPT0gRlNfVUZTMl9NQUdJQyA/IGNnYmFzZShmcywgYykgOgkJXAorICAgICAgIChjZ2Jhc2UoZnMsIGMpICsgKGZzKS0+ZnNfb2xkX2Nnb2Zmc2V0ICogKChjKSAmIH4oKGZzKS0+ZnNfb2xkX2NnbWFzaykpKSkKKworLyoKKyAqIE1hY3JvcyBmb3IgaGFuZGxpbmcgaW5vZGUgbnVtYmVyczoKKyAqICAgICBpbm9kZSBudW1iZXIgdG8gZmlsZXN5c3RlbSBibG9jayBvZmZzZXQuCisgKiAgICAgaW5vZGUgbnVtYmVyIHRvIGN5bGluZGVyIGdyb3VwIG51bWJlci4KKyAqICAgICBpbm9kZSBudW1iZXIgdG8gZmlsZXN5c3RlbSBibG9jayBhZGRyZXNzLgorICovCisjZGVmaW5lCWlub190b19jZyhmcywgeCkJKCh4KSAvIChmcyktPmZzX2lwZykKKyNkZWZpbmUJaW5vX3RvX2ZzYmEoZnMsIHgpCQkJCQkJXAorCSgodWZzMl9kYWRkcl90KShjZ2ltaW4oZnMsIGlub190b19jZyhmcywgeCkpICsJCQlcCisJICAgIChibGtzdG9mcmFncygoZnMpLCAoKCh4KSAlIChmcyktPmZzX2lwZykgLyBJTk9QQihmcykpKSkpKQorI2RlZmluZQlpbm9fdG9fZnNibyhmcywgeCkJKCh4KSAlIElOT1BCKGZzKSkKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgbWFjcm9zIG9wdGltaXplIGNlcnRhaW4gZnJlcXVlbnRseSBjYWxjdWxhdGVkCisgKiBxdWFudGl0aWVzIGJ5IHVzaW5nIHNoaWZ0cyBhbmQgbWFza3MgaW4gcGxhY2Ugb2YgZGl2aXNpb25zCisgKiBtb2R1bG9zIGFuZCBtdWx0aXBsaWNhdGlvbnMuCisgKi8KKyNkZWZpbmUgYmxrb2ZmKGZzLCBsb2MpCQkvKiBjYWxjdWxhdGVzIChsb2MgJSBmcy0+ZnNfYnNpemUpICovIFwKKwkoKGxvYykgJiAoZnMpLT5mc19xYm1hc2spCisKKy8qIFVzZSB0aGlzIG9ubHkgd2hlbiBgYmxrJyBpcyBrbm93biB0byBiZSBzbWFsbCwgZS5nLiwgPCBOREFERFIuICovCisjZGVmaW5lIHNtYWxsbGJsa3Rvc2l6ZShmcywgYmxrKSAgICAvKiBjYWxjdWxhdGVzIChibGsgKiBmcy0+ZnNfYnNpemUpICovIFwKKwkoKGJsaykgPDwgKGZzKS0+ZnNfYnNoaWZ0KQorCisKKyNkZWZpbmUgbGJsa25vKGZzLCBsb2MpCQkvKiBjYWxjdWxhdGVzIChsb2MgLyBmcy0+ZnNfYnNpemUpICovIFwKKwkoKGxvYykgPj4gKGZzKS0+ZnNfYnNoaWZ0KQorCisjZGVmaW5lIGZyYWdyb3VuZHVwKGZzLCBzaXplKQkvKiBjYWxjdWxhdGVzIHJvdW5kdXAoc2l6ZSwgZnMtPmZzX2ZzaXplKSAqLyBcCisJKCgoc2l6ZSkgKyAoZnMpLT5mc19xZm1hc2spICYgKGZzKS0+ZnNfZm1hc2spCisKKyNkZWZpbmUgZnJhZ3N0b2Jsa3MoZnMsIGZyYWdzKQkvKiBjYWxjdWxhdGVzIChmcmFncyAvIGZzLT5mc19mcmFnKSAqLyBcCisJKChmcmFncykgPj4gKGZzKS0+ZnNfZnJhZ3NoaWZ0KQorI2RlZmluZSBibGtzdG9mcmFncyhmcywgYmxrcykJLyogY2FsY3VsYXRlcyAoYmxrcyAqIGZzLT5mc19mcmFnKSAqLyBcCisJKChibGtzKSA8PCAoZnMpLT5mc19mcmFnc2hpZnQpCisjZGVmaW5lIGZyYWdudW0oZnMsIGZzYikJLyogY2FsY3VsYXRlcyAoZnNiICUgZnMtPmZzX2ZyYWcpICovIFwKKwkoKGZzYikgJiAoKGZzKS0+ZnNfZnJhZyAtIDEpKQorI2RlZmluZSBibGtudW0oZnMsIGZzYikJCS8qIGNhbGN1bGF0ZXMgcm91bmRkb3duKGZzYiwgZnMtPmZzX2ZyYWcpICovIFwKKwkoKGZzYikgJn4gKChmcyktPmZzX2ZyYWcgLSAxKSkKKworLyoKKyAqIERldGVybWluaW5nIHRoZSBzaXplIG9mIGEgZmlsZSBibG9jayBpbiB0aGUgZmlsZXN5c3RlbS4KKyAqLworI2RlZmluZSBibGtzaXplKGZzLCBpcCwgbGJuKSBcCisJKCgobGJuKSA+PSBOREFERFIgfHwgKGlwKS0+aV9zaXplID49IHNtYWxsbGJsa3Rvc2l6ZShmcywgKGxibikgKyAxKSkgXAorCSAgICA/IChmcyktPmZzX2JzaXplIFwKKwkgICAgOiAoZnJhZ3JvdW5kdXAoZnMsIGJsa29mZihmcywgKGlwKS0+aV9zaXplKSkpKQorI2RlZmluZSBzYmxrc2l6ZShmcywgc2l6ZSwgbGJuKSBcCisJKCgobGJuKSA+PSBOREFERFIgfHwgKHNpemUpID49ICgobGJuKSArIDEpIDw8IChmcyktPmZzX2JzaGlmdCkgXAorCSAgPyAoZnMpLT5mc19ic2l6ZSBcCisJICA6IChmcmFncm91bmR1cChmcywgYmxrb2ZmKGZzLCAoc2l6ZSkpKSkpCisKKworLyoKKyAqIE51bWJlciBvZiBpbm9kZXMgaW4gYSBzZWNvbmRhcnkgc3RvcmFnZSBibG9jay9mcmFnbWVudC4KKyAqLworI2RlZmluZQlJTk9QQihmcykJKChmcyktPmZzX2lub3BiKQorI2RlZmluZQlJTk9QRihmcykJKChmcyktPmZzX2lub3BiID4+IChmcyktPmZzX2ZyYWdzaGlmdCkKKworLyoKKyAqIE51bWJlciBvZiBpbmRpcmVjdHMgaW4gYSBmaWxlc3lzdGVtIGJsb2NrLgorICovCisjZGVmaW5lCU5JTkRJUihmcykJKChmcyktPmZzX25pbmRpcikKKworI2RlZmluZSBGU19VTkNMRUFOICAgIDB4MDEgICAgICAvKiBmaWxlc3lzdGVtIG5vdCBjbGVhbiBhdCBtb3VudCAqLworI2RlZmluZSBGU19ET1NPRlRERVAgIDB4MDIgICAgICAvKiBmaWxlc3lzdGVtIHVzaW5nIHNvZnQgZGVwZW5kZW5jaWVzICovCisjZGVmaW5lIEZTX05FRURTRlNDSyAgMHgwNCAgICAgIC8qIGZpbGVzeXN0ZW0gbmVlZHMgc3luYyBmc2NrIGJlZm9yZSBtb3VudCAqLworI2RlZmluZSBGU19JTkRFWERJUlMgIDB4MDggICAgICAvKiBrZXJuZWwgc3VwcG9ydHMgaW5kZXhlZCBkaXJlY3RvcmllcyAqLworI2RlZmluZSBGU19BQ0xTICAgICAgIDB4MTAgICAgICAvKiBmaWxlIHN5c3RlbSBoYXMgQUNMcyBlbmFibGVkICovCisjZGVmaW5lIEZTX01VTFRJTEFCRUwgMHgyMCAgICAgIC8qIGZpbGUgc3lzdGVtIGlzIE1BQyBtdWx0aS1sYWJlbCAqLworI2RlZmluZSBGU19GTEFHU19VUERBVEVEIDB4ODAgICAvKiBmbGFncyBoYXZlIGJlZW4gbW92ZWQgdG8gbmV3IGxvY2F0aW9uICovCisKKyNlbmRpZiAvKiBfR1JVQl9VRlMyX0hfICovCmRpZmYgLS1naXQgYS9zdGFnZTIvdnN0YWZzLmggYi9zdGFnZTIvdnN0YWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M3ODIwYwotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMi92c3RhZnMuaApAQCAtMCwwICsxLDg4IEBACisvKgorICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKworI2lmbmRlZiBWU1RBRlNfSAorI2RlZmluZSBWU1RBRlNfSAkxCisKKworI2RlZmluZSBMSU5FCQkJMTYKKyNkZWZpbmUgQkxPQ0tfU0laRQkJNTEyCisjZGVmaW5lIFZTVEFGU19TVEFSVF9EQVRBCTMyMAorCitzdHJ1Y3QgYm9vdHJlY29yZAoreworICB1bnNpZ25lZCBjaGFyIGZsYWc7CisgIHVuc2lnbmVkIGNoYXIgc19zZWN0b3I7CisgIHVuc2lnbmVkIGNoYXIgc19oZWFkOworICB1bnNpZ25lZCBjaGFyIHNfY3lsaW5kZXI7CisgIHVuc2lnbmVkIGNoYXIgcF90eXBlOworICB1bnNpZ25lZCBjaGFyIGVfc2VjdG9yOworICB1bnNpZ25lZCBjaGFyIGVfaGVhZDsKKyAgdW5zaWduZWQgY2hhciBlX2N5bGluZGVyOworICB1bnNpZ25lZCBsb25nIHN0YXJ0X2xiYTsKKyAgdW5zaWduZWQgbG9uZyBucl9zZWN0b3JfbGJhOworfTsKKworc3RydWN0IGFsbG9jCit7CisgIHVuc2lnbmVkIGxvbmcgYV9zdGFydDsKKyAgdW5zaWduZWQgbG9uZyBhX2xlbjsKK307CisKK3N0cnVjdCBmaXJzdF9zZWN0b3IKK3sKKyAgdW5zaWduZWQgbG9uZyBmc19tYWdpYzsKKyAgdW5zaWduZWQgbG9uZyBmc19zaXplOworICB1bnNpZ25lZCBsb25nIGZzX2V4dHNpemU7CisgIHVuc2lnbmVkIGxvbmcgZnNfZnJlZTsKKyAgc3RydWN0ICBhbGxvYyBmc19mcmVlc2Vjc1swXTsKK307CisKK3N0cnVjdCBwcm90Cit7CisgIHVuc2lnbmVkIGNoYXIgbGVuOworICB1bnNpZ25lZCBjaGFyIHBkZWZhdWx0OworICB1bnNpZ25lZCBjaGFyIGlkWzddOworICB1bnNpZ25lZCBjaGFyIGJpdHNbN107Cit9OworCitzdHJ1Y3QgZnNfZmlsZQoreworICB1bnNpZ25lZCBsb25nIHByZXY7CisgIHVuc2lnbmVkIGxvbmcgcmV2OworICB1bnNpZ25lZCBsb25nIGxlbjsKKyAgdW5zaWduZWQgc2hvcnQgdHlwZTsKKyAgdW5zaWduZWQgc2hvcnQgbmxpbms7CisgIHN0cnVjdCBwcm90IHBwcm90OworICB1bnNpZ25lZCBpbnQgb3duZXI7CisgIHVuc2lnbmVkIGludCBleHRlbnRzOworICBzdHJ1Y3QgYWxsb2MgYmxvY2tzWzMyXTsKKyAgbG9uZyBmc19jdGltZSwgZnNfbXRpbWU7IC8qIGl0IGlzIG5vdCBsb24gYnV0IHRpbWVfdCAqLworICBjaGFyIHBhZFsxNl07CisgIGNoYXIgZGF0YVswXTsKK307CisKK3N0cnVjdCBkaXJfZW50cnkKK3sKKyAgY2hhciBuYW1lWzI4XTsKKyAgdW5zaWduZWQgbG9uZyBzdGFydDsKK307CisKKyNlbmRpZiAvKiAhIFZTVEFGU19IICovCmRpZmYgLS1naXQgYS9zdGFnZTIveGZzLmggYi9zdGFnZTIveGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJmOGRjZAotLS0gL2Rldi9udWxsCisrKyBiL3N0YWdlMi94ZnMuaApAQCAtMCwwICsxLDU0NCBAQAorLyogeGZzLmggLSBhbiBleHRyYWN0aW9uIGZyb20geGZzcHJvZ3MtMS4zLjUvaW5jbHVkZS94ZnMqIGludG8gb25lIGZpbGUgKi8KKy8qIAorICogIEdSVUIgIC0tICBHUmFuZCBVbmlmaWVkIEJvb3Rsb2FkZXIKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLDIwMDQgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICogCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogCisgKiAgRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiAgZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiAgb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqICBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiAgb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKiAKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICogCisgKiAgQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqICBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICogCisgKiAgaHR0cDovL3d3dy5zZ2kuY29tIAorICogCisgKiAgRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6IAorICogCisgKiAgaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKK3R5cGVkZWYgc2lnbmVkIGNoYXIJeGZzX2ludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhcgl4ZnNfdWludDhfdDsKK3R5cGVkZWYgc2hvcnQJCXhmc19pbnQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAl4ZnNfdWludDE2X3Q7Cit0eXBlZGVmIGludAkJeGZzX2ludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAl4ZnNfdWludDMyX3Q7Cit0eXBlZGVmIGxvbmcgbG9uZwl4ZnNfaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHhmc191aW50NjRfdDsKKwordHlwZWRlZiB4ZnNfdWludDY0X3QJeGZzX2lub190OwordHlwZWRlZgl4ZnNfdWludDMyX3QJeGZzX2FnaW5vX3Q7Cit0eXBlZGVmIHhmc19pbnQ2NF90CXhmc19kYWRkcl90OwordHlwZWRlZiB4ZnNfaW50NjRfdAl4ZnNfb2ZmX3Q7Cit0eXBlZGVmIHhmc191aW50OF90CXV1aWRfdFsxNl07CisKKworLyogdGhvc2UgYXJlIGZyb20geGZzX3R5cGVzLmggKi8KKwordHlwZWRlZiB4ZnNfdWludDMyX3QJeGZzX2FnYmxvY2tfdDsJLyogYmxvY2tubyBpbiBhbGxvYy4gZ3JvdXAgKi8KK3R5cGVkZWYJeGZzX3VpbnQzMl90CXhmc19leHRsZW5fdDsJLyogZXh0ZW50IGxlbmd0aCBpbiBibG9ja3MgKi8KK3R5cGVkZWYJeGZzX3VpbnQzMl90CXhmc19hZ251bWJlcl90OwkvKiBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLwordHlwZWRlZiB4ZnNfaW50MzJfdAl4ZnNfZXh0bnVtX3Q7CS8qICMgb2YgZXh0ZW50cyBpbiBhIGZpbGUgKi8KK3R5cGVkZWYgeGZzX2ludDE2X3QJeGZzX2FleHRudW1fdDsJLyogIyBleHRlbnRzIGluIGFuIGF0dHJpYnV0ZSBmb3JrICovCit0eXBlZGVmCXhmc19pbnQ2NF90CXhmc19mc2l6ZV90OwkvKiBieXRlcyBpbiBhIGZpbGUgKi8KKwordHlwZWRlZgl4ZnNfdWludDMyX3QJeGZzX2RhYmxrX3Q7CS8qIGRpci9hdHRyIGJsb2NrIG51bWJlciAoaW4gZmlsZSkgKi8KK3R5cGVkZWYJeGZzX3VpbnQzMl90CXhmc19kYWhhc2hfdDsJLyogZGlyL2F0dHIgaGFzaCB2YWx1ZSAqLworCisvKgorICogRGlzayBiYXNlZCB0eXBlczoKKyAqLwordHlwZWRlZiB4ZnNfdWludDY0X3QJeGZzX2Rmc2Jub190OwkvKiBibG9ja25vIGluIGZpbGVzeXN0ZW0gKGFnbm98YWdibm8pICovCit0eXBlZGVmIHhmc191aW50NjRfdAl4ZnNfZHJmc2Jub190OwkvKiBibG9ja25vIGluIGZpbGVzeXN0ZW0gKHJhdykgKi8KK3R5cGVkZWYJeGZzX3VpbnQ2NF90CXhmc19kcnRibm9fdDsJLyogZXh0ZW50IChibG9jaykgaW4gcmVhbHRpbWUgYXJlYSAqLwordHlwZWRlZgl4ZnNfdWludDY0X3QJeGZzX2RmaWxvZmZfdDsJLyogYmxvY2sgbnVtYmVyIGluIGEgZmlsZSAqLworCit0eXBlZGVmCXhmc191aW50NjRfdAl4ZnNfZnNibG9ja190OwkvKiBibG9ja25vIGluIGZpbGVzeXN0ZW0gKGFnbm98YWdibm8pICovCit0eXBlZGVmCXhmc191aW50NjRfdAl4ZnNfZmlsZW9mZl90OwkvKiBibG9jayBudW1iZXIgaW4gYSBmaWxlICovCit0eXBlZGVmCXhmc191aW50NjRfdAl4ZnNfZmlsYmxrc190OwkvKiBudW1iZXIgb2YgYmxvY2tzIGluIGEgZmlsZSAqLworCisKKy8qIHRob3NlIGFyZSBmcm9tIHhmc19zYi5oICovCisKKyNkZWZpbmUJWEZTX1NCX01BR0lDCQkweDU4NDY1MzQyCS8qICdYRlNCJyovCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OXzQJNAkJLyogNi4yKyAtIGJpdG1hc2sgdmVyc2lvbiAqLworI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9OVU1CSVRTCTB4MDAwZgorCit0eXBlZGVmIHN0cnVjdCB4ZnNfc2IKK3sKKwl4ZnNfdWludDMyX3QJc2JfbWFnaWNudW07CS8qIG1hZ2ljIG51bWJlciA9PSBYRlNfU0JfTUFHSUMgKi8KKwl4ZnNfdWludDMyX3QJc2JfYmxvY2tzaXplOwkvKiBsb2dpY2FsIGJsb2NrIHNpemUsIGJ5dGVzICovCisJeGZzX2RyZnNibm9fdAlzYl9kYmxvY2tzOwkvKiBudW1iZXIgb2YgZGF0YSBibG9ja3MgKi8KKwl4ZnNfZHJmc2Jub190CXNiX3JibG9ja3M7CS8qIG51bWJlciBvZiByZWFsdGltZSBibG9ja3MgKi8KKwl4ZnNfZHJ0Ym5vX3QJc2JfcmV4dGVudHM7CS8qIG51bWJlciBvZiByZWFsdGltZSBleHRlbnRzICovCisJdXVpZF90CQlzYl91dWlkOwkvKiBmaWxlIHN5c3RlbSB1bmlxdWUgaWQgKi8KKwl4ZnNfZGZzYm5vX3QJc2JfbG9nc3RhcnQ7CS8qIHN0YXJ0aW5nIGJsb2NrIG9mIGxvZyBpZiBpbnRlcm5hbCAqLworCXhmc19pbm9fdAlzYl9yb290aW5vOwkvKiByb290IGlub2RlIG51bWJlciAqLworCXhmc19pbm9fdAlzYl9yYm1pbm87CS8qIGJpdG1hcCBpbm9kZSBmb3IgcmVhbHRpbWUgZXh0ZW50cyAqLworCXhmc19pbm9fdAlzYl9yc3VtaW5vOwkvKiBzdW1tYXJ5IGlub2RlIGZvciBydCBiaXRtYXAgKi8KKwl4ZnNfYWdibG9ja190CXNiX3JleHRzaXplOwkvKiByZWFsdGltZSBleHRlbnQgc2l6ZSwgYmxvY2tzICovCisJeGZzX2FnYmxvY2tfdAlzYl9hZ2Jsb2NrczsJLyogc2l6ZSBvZiBhbiBhbGxvY2F0aW9uIGdyb3VwICovCisJeGZzX2FnbnVtYmVyX3QJc2JfYWdjb3VudDsJLyogbnVtYmVyIG9mIGFsbG9jYXRpb24gZ3JvdXBzICovCisJeGZzX2V4dGxlbl90CXNiX3JibWJsb2NrczsJLyogbnVtYmVyIG9mIHJ0IGJpdG1hcCBibG9ja3MgKi8KKwl4ZnNfZXh0bGVuX3QJc2JfbG9nYmxvY2tzOwkvKiBudW1iZXIgb2YgbG9nIGJsb2NrcyAqLworCXhmc191aW50MTZfdAlzYl92ZXJzaW9ubnVtOwkvKiBoZWFkZXIgdmVyc2lvbiA9PSBYRlNfU0JfVkVSU0lPTiAqLworCXhmc191aW50MTZfdAlzYl9zZWN0c2l6ZTsJLyogdm9sdW1lIHNlY3RvciBzaXplLCBieXRlcyAqLworCXhmc191aW50MTZfdAlzYl9pbm9kZXNpemU7CS8qIGlub2RlIHNpemUsIGJ5dGVzICovCisJeGZzX3VpbnQxNl90CXNiX2lub3BibG9jazsJLyogaW5vZGVzIHBlciBibG9jayAqLworCWNoYXIJCXNiX2ZuYW1lWzEyXTsJLyogZmlsZSBzeXN0ZW0gbmFtZSAqLworCXhmc191aW50OF90CXNiX2Jsb2NrbG9nOwkvKiBsb2cyIG9mIHNiX2Jsb2Nrc2l6ZSAqLworCXhmc191aW50OF90CXNiX3NlY3Rsb2c7CS8qIGxvZzIgb2Ygc2Jfc2VjdHNpemUgKi8KKwl4ZnNfdWludDhfdAlzYl9pbm9kZWxvZzsJLyogbG9nMiBvZiBzYl9pbm9kZXNpemUgKi8KKwl4ZnNfdWludDhfdAlzYl9pbm9wYmxvZzsJLyogbG9nMiBvZiBzYl9pbm9wYmxvY2sgKi8KKwl4ZnNfdWludDhfdAlzYl9hZ2Jsa2xvZzsJLyogbG9nMiBvZiBzYl9hZ2Jsb2NrcyAocm91bmRlZCB1cCkgKi8KKwl4ZnNfdWludDhfdAlzYl9yZXh0c2xvZzsJLyogbG9nMiBvZiBzYl9yZXh0ZW50cyAqLworCXhmc191aW50OF90CXNiX2lucHJvZ3Jlc3M7CS8qIG1rZnMgaXMgaW4gcHJvZ3Jlc3MsIGRvbid0IG1vdW50ICovCisJeGZzX3VpbnQ4X3QJc2JfaW1heF9wY3Q7CS8qIG1heCAlIG9mIGZzIGZvciBpbm9kZSBzcGFjZSAqLworCQkJCQkvKiBzdGF0aXN0aWNzICovCisJLyoKKwkgKiBUaGVzZSBmaWVsZHMgbXVzdCByZW1haW4gY29udGlndW91cy4gIElmIHlvdSByZWFsbHkKKwkgKiB3YW50IHRvIGNoYW5nZSB0aGVpciBsYXlvdXQsIG1ha2Ugc3VyZSB5b3UgZml4IHRoZQorCSAqIGNvZGUgaW4geGZzX3RyYW5zX2FwcGx5X3NiX2RlbHRhcygpLgorCSAqLworCXhmc191aW50NjRfdAlzYl9pY291bnQ7CS8qIGFsbG9jYXRlZCBpbm9kZXMgKi8KKwl4ZnNfdWludDY0X3QJc2JfaWZyZWU7CS8qIGZyZWUgaW5vZGVzICovCisJeGZzX3VpbnQ2NF90CXNiX2ZkYmxvY2tzOwkvKiBmcmVlIGRhdGEgYmxvY2tzICovCisJeGZzX3VpbnQ2NF90CXNiX2ZyZXh0ZW50czsJLyogZnJlZSByZWFsdGltZSBleHRlbnRzICovCisJLyoKKwkgKiBFbmQgY29udGlndW91cyBmaWVsZHMuCisJICovCisJeGZzX2lub190CXNiX3VxdW90aW5vOwkvKiB1c2VyIHF1b3RhIGlub2RlICovCisJeGZzX2lub190CXNiX2dxdW90aW5vOwkvKiBncm91cCBxdW90YSBpbm9kZSAqLworCXhmc191aW50MTZfdAlzYl9xZmxhZ3M7CS8qIHF1b3RhIGZsYWdzICovCisJeGZzX3VpbnQ4X3QJc2JfZmxhZ3M7CS8qIG1pc2MuIGZsYWdzICovCisJeGZzX3VpbnQ4X3QJc2Jfc2hhcmVkX3ZuOwkvKiBzaGFyZWQgdmVyc2lvbiBudW1iZXIgKi8KKwl4ZnNfZXh0bGVuX3QJc2JfaW5vYWxpZ25tdDsJLyogaW5vZGUgY2h1bmsgYWxpZ25tZW50LCBmc2Jsb2NrcyAqLworCXhmc191aW50MzJfdAlzYl91bml0OwkvKiBzdHJpcGUgb3IgcmFpZCB1bml0ICovCisJeGZzX3VpbnQzMl90CXNiX3dpZHRoOwkvKiBzdHJpcGUgb3IgcmFpZCB3aWR0aCAqLwkKKwl4ZnNfdWludDhfdAlzYl9kaXJibGtsb2c7CS8qIGxvZzIgb2YgZGlyIGJsb2NrIHNpemUgKGZzYnMpICovCisgICAgICAgIHhmc191aW50OF90ICAgICAgIHNiX2R1bW15WzddOyAgICAvKiBwYWRkaW5nICovCit9IHhmc19zYl90OworCisKKy8qIHRob3NlIGFyZSBmcm9tIHhmc19idHJlZS5oICovCisKKy8qCisgKiBMb25nIGZvcm0gaGVhZGVyOiBibWFwIGJ0cmVlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2J0cmVlX2xibG9jaworeworCXhmc191aW50MzJfdAliYl9tYWdpYzsJLyogbWFnaWMgbnVtYmVyIGZvciBibG9jayB0eXBlICovCisJeGZzX3VpbnQxNl90CWJiX2xldmVsOwkvKiAwIGlzIGEgbGVhZiAqLworCXhmc191aW50MTZfdAliYl9udW1yZWNzOwkvKiBjdXJyZW50ICMgb2YgZGF0YSByZWNvcmRzICovCisJeGZzX2Rmc2Jub190CWJiX2xlZnRzaWI7CS8qIGxlZnQgc2libGluZyBibG9jayBvciBOVUxMREZTQk5PICovCisJeGZzX2Rmc2Jub190CWJiX3JpZ2h0c2liOwkvKiByaWdodCBzaWJsaW5nIGJsb2NrIG9yIE5VTExERlNCTk8gKi8KK30geGZzX2J0cmVlX2xibG9ja190OworCisvKgorICogQ29tYmluZWQgaGVhZGVyIGFuZCBzdHJ1Y3R1cmUsIHVzZWQgYnkgY29tbW9uIGNvZGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19idHJlZV9oZHIKK3sKKwl4ZnNfdWludDMyX3QJYmJfbWFnaWM7CS8qIG1hZ2ljIG51bWJlciBmb3IgYmxvY2sgdHlwZSAqLworCXhmc191aW50MTZfdAliYl9sZXZlbDsJLyogMCBpcyBhIGxlYWYgKi8KKwl4ZnNfdWludDE2X3QJYmJfbnVtcmVjczsJLyogY3VycmVudCAjIG9mIGRhdGEgcmVjb3JkcyAqLworfSB4ZnNfYnRyZWVfaGRyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19idHJlZV9ibG9jaworeworCXhmc19idHJlZV9oZHJfdAliYl9oOwkJLyogaGVhZGVyICovCisJdW5pb24JCXsKKwkJc3RydWN0CXsKKwkJCXhmc19hZ2Jsb2NrX3QJYmJfbGVmdHNpYjsKKwkJCXhmc19hZ2Jsb2NrX3QJYmJfcmlnaHRzaWI7CisJCX0JczsJCS8qIHNob3J0IGZvcm0gcG9pbnRlcnMgKi8KKwkJc3RydWN0CXsKKwkJCXhmc19kZnNibm9fdAliYl9sZWZ0c2liOworCQkJeGZzX2Rmc2Jub190CWJiX3JpZ2h0c2liOworCQl9CWw7CQkvKiBsb25nIGZvcm0gcG9pbnRlcnMgKi8KKwl9CQliYl91OwkJLyogcmVzdCAqLworfSB4ZnNfYnRyZWVfYmxvY2tfdDsKKworLyogdGhvc2UgYXJlIGZyb20geGZzX2JtYXBfYnRyZWUuaCAqLworCisvKgorICogQm1hcCByb290IGhlYWRlciwgb24tZGlzayBmb3JtIG9ubHkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19ibWRyX2Jsb2NrCit7CisJeGZzX3VpbnQxNl90CWJiX2xldmVsOwkvKiAwIGlzIGEgbGVhZiAqLworCXhmc191aW50MTZfdAliYl9udW1yZWNzOwkvKiBjdXJyZW50ICMgb2YgZGF0YSByZWNvcmRzICovCit9IHhmc19ibWRyX2Jsb2NrX3Q7CisKKy8qCisgKiBCbWFwIGJ0cmVlIHJlY29yZCBhbmQgZXh0ZW50IGRlc2NyaXB0b3IuCisgKiBGb3IgMzItYml0IGtlcm5lbHMsCisgKiAgbDA6MzEgaXMgYW4gZXh0ZW50IGZsYWcgKHZhbHVlIDEgaW5kaWNhdGVzIG5vbi1ub3JtYWwpLgorICogIGwwOjAtMzAgYW5kIGwxOjktMzEgYXJlIHN0YXJ0b2ZmLgorICogIGwxOjAtOCwgbDI6MC0zMSwgYW5kIGwzOjIxLTMxIGFyZSBzdGFydGJsb2NrLgorICogIGwzOjAtMjAgYXJlIGJsb2NrY291bnQuCisgKiBGb3IgNjQtYml0IGtlcm5lbHMsCisgKiAgbDA6NjMgaXMgYW4gZXh0ZW50IGZsYWcgKHZhbHVlIDEgaW5kaWNhdGVzIG5vbi1ub3JtYWwpLgorICogIGwwOjktNjIgYXJlIHN0YXJ0b2ZmLgorICogIGwwOjAtOCBhbmQgbDE6MjEtNjMgYXJlIHN0YXJ0YmxvY2suCisgKiAgbDE6MC0yMCBhcmUgYmxvY2tjb3VudC4KKyAqLworCisjZGVmaW5lCUJNQlRfVVNFXzY0CTEKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2JtYnRfcmVjXzMyCit7CisJeGZzX3VpbnQzMl90CQlsMCwgbDEsIGwyLCBsMzsKK30geGZzX2JtYnRfcmVjXzMyX3Q7Cit0eXBlZGVmIHN0cnVjdCB4ZnNfYm1idF9yZWNfNjQKK3sKKwl4ZnNfdWludDY0X3QJCWwwLCBsMTsKK30geGZzX2JtYnRfcmVjXzY0X3Q7CisKKyNpZiBCTUJUX1VTRV82NAordHlwZWRlZgl4ZnNfdWludDY0X3QJeGZzX2JtYnRfcmVjX2Jhc2VfdDsJLyogdXNlIHRoaXMgZm9yIGNhc3RzICovCit0eXBlZGVmIHhmc19ibWJ0X3JlY182NF90IHhmc19ibWJ0X3JlY190LCB4ZnNfYm1kcl9yZWNfdDsKKyNlbHNlCS8qICFCTUJUX1VTRV82NCAqLwordHlwZWRlZgl4ZnNfdWludDMyX3QJeGZzX2JtYnRfcmVjX2Jhc2VfdDsJLyogdXNlIHRoaXMgZm9yIGNhc3RzICovCit0eXBlZGVmIHhmc19ibWJ0X3JlY18zMl90IHhmc19ibWJ0X3JlY190LCB4ZnNfYm1kcl9yZWNfdDsKKyNlbmRpZgkvKiBCTUJUX1VTRV82NCAqLworCisvKgorICogS2V5IHN0cnVjdHVyZSBmb3Igbm9uLWxlYWYgbGV2ZWxzIG9mIHRoZSB0cmVlLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfYm1idF9rZXkKK3sKKwl4ZnNfZGZpbG9mZl90CWJyX3N0YXJ0b2ZmOwkvKiBzdGFydGluZyBmaWxlIG9mZnNldCAqLworfSB4ZnNfYm1idF9rZXlfdCwgeGZzX2JtZHJfa2V5X3Q7CisKK3R5cGVkZWYgeGZzX2Rmc2Jub190IHhmc19ibWJ0X3B0cl90LCB4ZnNfYm1kcl9wdHJfdDsJLyogYnRyZWUgcG9pbnRlciB0eXBlICovCisJCQkJCS8qIGJ0cmVlIGJsb2NrIGhlYWRlciB0eXBlICovCit0eXBlZGVmCXN0cnVjdCB4ZnNfYnRyZWVfbGJsb2NrIHhmc19ibWJ0X2Jsb2NrX3Q7CisKKworLyogdGhvc2UgYXJlIGZyb20geGZzX2RpcjIuaCAqLworLyoKKyAqIERpcmVjdG9yeSB2ZXJzaW9uIDIuCisgKiBUaGVyZSBhcmUgNCBwb3NzaWJsZSBmb3JtYXRzOgorICoJc2hvcnRmb3JtCisgKglzaW5nbGUgYmxvY2sgLSBkYXRhIHdpdGggZW1iZWRkZWQgbGVhZiBhdCB0aGUgZW5kCisgKgltdWx0aXBsZSBkYXRhIGJsb2Nrcywgc2luZ2xlIGxlYWYrZnJlZWluZGV4IGJsb2NrCisgKglkYXRhIGJsb2Nrcywgbm9kZSZsZWFmIGJsb2NrcyAoYnRyZWUpLCBmcmVlaW5kZXggYmxvY2tzCisgKgorICoJVGhlIHNob3J0Zm9ybSBmb3JtYXQgaXMgaW4geGZzX2RpcjJfc2YuaC4KKyAqCVRoZSBzaW5nbGUgYmxvY2sgZm9ybWF0IGlzIGluIHhmc19kaXIyX2Jsb2NrLmguCisgKglUaGUgZGF0YSBibG9jayBmb3JtYXQgaXMgaW4geGZzX2RpcjJfZGF0YS5oLgorICoJVGhlIGxlYWYgYW5kIGZyZWVpbmRleCBibG9jayBmb3JtYXRzIGFyZSBpbiB4ZnNfZGlyMl9sZWFmLmguCisgKglOb2RlIGJsb2NrcyBhcmUgdGhlIHNhbWUgYXMgdGhlIG90aGVyIHZlcnNpb24sIGluIHhmc19kYV9idHJlZS5oLgorICovCisKKy8qCisgKiBCeXRlIG9mZnNldCBpbiBkYXRhIGJsb2NrIGFuZCBzaG9ydGZvcm0gZW50cnkuCisgKi8KK3R5cGVkZWYJeGZzX3VpbnQxNl90CXhmc19kaXIyX2RhdGFfb2ZmX3Q7CisKKy8qCisgKiBCeXRlIG9mZnNldCBpbiBhIGRpcmVjdG9yeS4KKyAqLwordHlwZWRlZgl4ZnNfb2ZmX3QJCXhmc19kaXIyX29mZl90OworCisvKiB0aG9zZSBhcmUgZnJvbSB4ZnNfZGFfYnRyZWUuaCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERpcmVjdG9yeSBTdHJ1Y3R1cmUgd2hlbiBncmVhdGVyIHRoYW4gWEZTX0xCU0laRShtcCkgYnl0ZXMuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBpcyBjb21tb24gdG8gYm90aCBsZWFmIG5vZGVzIGFuZCBub24tbGVhZiBub2RlcyBpbiB0aGUgQnRyZWUuCisgKgorICogSXMgaXMgdXNlZCB0byBtYW5hZ2UgYSBkb3VibHkgbGlua2VkIGxpc3Qgb2YgYWxsIGJsb2NrcyBhdCB0aGUgc2FtZQorICogbGV2ZWwgaW4gdGhlIEJ0cmVlLCBhbmQgdG8gaWRlbnRpZnkgd2hpY2ggdHlwZSBvZiBibG9jayB0aGlzIGlzLgorICovCisjZGVmaW5lCVhGU19ESVIyX0xFQUYxX01BR0lDCTB4ZDJmMQkvKiBtYWdpYyBudW1iZXI6IHYyIGRpcmxmIHNpbmdsZSBibGtzICovCisjZGVmaW5lCVhGU19ESVIyX0xFQUZOX01BR0lDCTB4ZDJmZgkvKiBtYWdpYyBudW1iZXI6IHYyIGRpcmxmIG11bHRpIGJsa3MgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RhX2Jsa2luZm8geworCXhmc19kYWJsa190IGZvcnc7CQkJLyogcHJldmlvdXMgYmxvY2sgaW4gbGlzdCAqLworCXhmc19kYWJsa190IGJhY2s7CQkJLyogZm9sbG93aW5nIGJsb2NrIGluIGxpc3QgKi8KKwl4ZnNfdWludDE2X3QgbWFnaWM7CQkJLyogdmFsaWRpdHkgY2hlY2sgb24gYmxvY2sgKi8KKwl4ZnNfdWludDE2X3QgcGFkOwkJCQkvKiB1bnVzZWQgKi8KK30geGZzX2RhX2Jsa2luZm9fdDsKKworLyoKKyAqIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgcm9vdCBhbmQgaW50ZXJtZWRpYXRlIG5vZGVzIGluIHRoZSBCdHJlZS4KKyAqIFRoZSBsZWFmIG5vZGVzIGFyZSBkZWZpbmVkIGFib3ZlLgorICoKKyAqIEVudHJpZXMgYXJlIG5vdCBwYWNrZWQuCisgKgorICogU2luY2Ugd2UgaGF2ZSBkdXBsaWNhdGUga2V5cywgdXNlIGEgYmluYXJ5IHNlYXJjaCBidXQgYWx3YXlzIGZvbGxvdworICogYWxsIG1hdGNoIGluIHRoZSBibG9jaywgbm90IGp1c3QgdGhlIGZpcnN0IG1hdGNoIGZvdW5kLgorICovCisKK3R5cGVkZWYgc3RydWN0IHhmc19kYV9pbnRub2RlIHsKKwlzdHJ1Y3QgeGZzX2RhX25vZGVfaGRyIHsJLyogY29uc3RhbnQtc3RydWN0dXJlIGhlYWRlciBibG9jayAqLworCQl4ZnNfZGFfYmxraW5mb190IGluZm87CS8qIGJsb2NrIHR5cGUsIGxpbmtzLCBldGMuICovCisJCXhmc191aW50MTZfdCBjb3VudDsJLyogY291bnQgb2YgYWN0aXZlIGVudHJpZXMgKi8KKwkJeGZzX3VpbnQxNl90IGxldmVsOwkvKiBsZXZlbCBhYm92ZSBsZWF2ZXMgKGxlYWYgPT0gMCkgKi8KKwl9IGhkcjsKKwlzdHJ1Y3QgeGZzX2RhX25vZGVfZW50cnkgeworCQl4ZnNfZGFoYXNoX3QgaGFzaHZhbDsJLyogaGFzaCB2YWx1ZSBmb3IgdGhpcyBkZXNjZW5kYW50ICovCisJCXhmc19kYWJsa190IGJlZm9yZTsJLyogQnRyZWUgYmxvY2sgYmVmb3JlIHRoaXMga2V5ICovCisJfSBidHJlZVsxXTsJCQkvKiB2YXJpYWJsZSBzaXplZCBhcnJheSBvZiBrZXlzICovCit9IHhmc19kYV9pbnRub2RlX3Q7CisKKworLyogdGhvc2UgYXJlIGZyb20geGZzX2RpcjJfZGF0YS5oICovCisvKgorICogRGlyZWN0b3J5IGZvcm1hdCAyLCBkYXRhIGJsb2NrIHN0cnVjdHVyZXMuCisgKi8KKworLyoKKyAqIENvbnN0YW50cy4KKyAqLworI2RlZmluZQlYRlNfRElSMl9EQVRBX0ZSRUVfVEFHCTB4ZmZmZgorI2RlZmluZQlYRlNfRElSMl9EQVRBX0ZEX0NPVU5UCTMKKworLyoKKyAqIFN0cnVjdHVyZXMuCisgKi8KKworLyoKKyAqIERlc2NyaWJlIGEgZnJlZSBhcmVhIGluIHRoZSBkYXRhIGJsb2NrLgorICogVGhlIGZyZWVzcGFjZSB3aWxsIGJlIGZvcm1hdHRlZCBhcyBhIHhmc19kaXIyX2RhdGFfdW51c2VkX3QuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19kaXIyX2RhdGFfZnJlZSB7CisJeGZzX2RpcjJfZGF0YV9vZmZfdAlvZmZzZXQ7CQkvKiBzdGFydCBvZiBmcmVlc3BhY2UgKi8KKwl4ZnNfZGlyMl9kYXRhX29mZl90CWxlbmd0aDsJCS8qIGxlbmd0aCBvZiBmcmVlc3BhY2UgKi8KK30geGZzX2RpcjJfZGF0YV9mcmVlX3Q7CisKKy8qCisgKiBIZWFkZXIgZm9yIHRoZSBkYXRhIGJsb2Nrcy4KKyAqIEFsd2F5cyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgZGlyZWN0b3J5LXNpemVkIGJsb2NrLgorICogVGhlIGNvZGUga25vd3MgdGhhdCBYRlNfRElSMl9EQVRBX0ZEX0NPVU5UIGlzIDMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19kaXIyX2RhdGFfaGRyIHsKKwl4ZnNfdWludDMyX3QJCW1hZ2ljOwkJLyogWEZTX0RJUjJfREFUQV9NQUdJQyAqLworCQkJCQkJLyogb3IgWEZTX0RJUjJfQkxPQ0tfTUFHSUMgKi8KKwl4ZnNfZGlyMl9kYXRhX2ZyZWVfdAliZXN0ZnJlZVtYRlNfRElSMl9EQVRBX0ZEX0NPVU5UXTsKK30geGZzX2RpcjJfZGF0YV9oZHJfdDsKKworLyoKKyAqIEFjdGl2ZSBlbnRyeSBpbiBhIGRhdGEgYmxvY2suICBBbGlnbmVkIHRvIDggYnl0ZXMuCisgKiBUYWcgYXBwZWFycyBhcyB0aGUgbGFzdCAyIGJ5dGVzLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9kYXRhX2VudHJ5IHsKKwl4ZnNfaW5vX3QJCWludW1iZXI7CS8qIGlub2RlIG51bWJlciAqLworCXhmc191aW50OF90CQluYW1lbGVuOwkvKiBuYW1lIGxlbmd0aCAqLworCXhmc191aW50OF90CQluYW1lWzFdOwkvKiBuYW1lIGJ5dGVzLCBubyBudWxsICovCisJCQkJCQkvKiB2YXJpYWJsZSBvZmZzZXQgKi8KKwl4ZnNfZGlyMl9kYXRhX29mZl90CXRhZzsJCS8qIHN0YXJ0aW5nIG9mZnNldCBvZiB1cyAqLworfSB4ZnNfZGlyMl9kYXRhX2VudHJ5X3Q7CisKKy8qCisgKiBVbnVzZWQgZW50cnkgaW4gYSBkYXRhIGJsb2NrLiAgQWxpZ25lZCB0byA4IGJ5dGVzLgorICogVGFnIGFwcGVhcnMgYXMgdGhlIGxhc3QgMiBieXRlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcjJfZGF0YV91bnVzZWQgeworCXhmc191aW50MTZfdAkJZnJlZXRhZzsJLyogWEZTX0RJUjJfREFUQV9GUkVFX1RBRyAqLworCXhmc19kaXIyX2RhdGFfb2ZmX3QJbGVuZ3RoOwkJLyogdG90YWwgZnJlZSBsZW5ndGggKi8KKwkJCQkJCS8qIHZhcmlhYmxlIG9mZnNldCAqLworCXhmc19kaXIyX2RhdGFfb2ZmX3QJdGFnOwkJLyogc3RhcnRpbmcgb2Zmc2V0IG9mIHVzICovCit9IHhmc19kaXIyX2RhdGFfdW51c2VkX3Q7CisKK3R5cGVkZWYgdW5pb24geworCXhmc19kaXIyX2RhdGFfZW50cnlfdAllbnRyeTsKKwl4ZnNfZGlyMl9kYXRhX3VudXNlZF90CXVudXNlZDsKK30geGZzX2RpcjJfZGF0YV91bmlvbl90OworCisKKy8qIHRob3NlIGFyZSBmcm9tIHhmc19kaXIyX2xlYWYuaCAqLworLyoKKyAqIERpcmVjdG9yeSB2ZXJzaW9uIDIsIGxlYWYgYmxvY2sgc3RydWN0dXJlcy4KKyAqLworCisvKgorICogTGVhZiBibG9jayBoZWFkZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19kaXIyX2xlYWZfaGRyIHsKKwl4ZnNfZGFfYmxraW5mb190CWluZm87CQkvKiBoZWFkZXIgZm9yIGRhIHJvdXRpbmVzICovCisJeGZzX3VpbnQxNl90CQljb3VudDsJCS8qIGNvdW50IG9mIGVudHJpZXMgKi8KKwl4ZnNfdWludDE2X3QJCXN0YWxlOwkJLyogY291bnQgb2Ygc3RhbGUgZW50cmllcyAqLworfSB4ZnNfZGlyMl9sZWFmX2hkcl90OworCisKKy8qIHRob3NlIGFyZSBmcm9tIHhmc19kaXIyX2Jsb2NrLmggKi8KKy8qCisgKiB4ZnNfZGlyMl9ibG9jay5oCisgKiBEaXJlY3RvcnkgdmVyc2lvbiAyLCBzaW5nbGUgYmxvY2sgZm9ybWF0IHN0cnVjdHVyZXMKKyAqLworCisvKgorICogVGhlIHNpbmdsZSBibG9jayBmb3JtYXQgaXMgYXMgZm9sbG93czoKKyAqIHhmc19kaXIyX2RhdGFfaGRyX3Qgc3RydWN0dXJlCisgKiB4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgYW5kIHhmc19kaXIyX2RhdGFfdW51c2VkX3Qgc3RydWN0dXJlcworICogeGZzX2RpcjJfbGVhZl9lbnRyeV90IHN0cnVjdHVyZXMKKyAqIHhmc19kaXIyX2Jsb2NrX3RhaWxfdCBzdHJ1Y3R1cmUKKyAqLworCisjZGVmaW5lCVhGU19ESVIyX0JMT0NLX01BR0lDCTB4NTg0NDMyNDIJLyogWEQyQjogZm9yIG9uZSBibG9jayBkaXJzICovCisKK3R5cGVkZWYgc3RydWN0IHhmc19kaXIyX2Jsb2NrX3RhaWwgeworCXhmc191aW50MzJfdAljb3VudDsJCQkvKiBjb3VudCBvZiBsZWFmIGVudHJpZXMgKi8KKwl4ZnNfdWludDMyX3QJc3RhbGU7CQkJLyogY291bnQgb2Ygc3RhbGUgbGYgZW50cmllcyAqLworfSB4ZnNfZGlyMl9ibG9ja190YWlsX3Q7CisKKworLyogdGhvc2UgYXJlIGZyb20geGZzX2RpcjJfc2YuaCAqLworCisvKgorICogRGlyZWN0b3J5IGxheW91dCB3aGVuIHN0b3JlZCBpbnRlcm5hbCB0byBhbiBpbm9kZS4KKyAqCisgKiBTbWFsbCBkaXJlY3RvcmllcyBhcmUgcGFja2VkIGFzIHRpZ2h0bHkgYXMgcG9zc2libGUgc28gYXMgdG8KKyAqIGZpdCBpbnRvIHRoZSBsaXRlcmFsIGFyZWEgb2YgdGhlIGlub2RlLgorICovCisKKy8qCisgKiBJbm9kZSBudW1iZXIgc3RvcmVkIGFzIDggOC1iaXQgdmFsdWVzLgorICovCit0eXBlZGVmCXN0cnVjdCB7IHhmc191aW50OF90IGlbOF07IH0geGZzX2RpcjJfaW5vOF90OworCisvKgorICogSW5vZGUgbnVtYmVyIHN0b3JlZCBhcyA0IDgtYml0IHZhbHVlcy4KKyAqIFdvcmtzIGEgbG90IG9mIHRoZSB0aW1lLCB3aGVuIGFsbCB0aGUgaW5vZGUgbnVtYmVycyBpbiBhIGRpcmVjdG9yeQorICogZml0IGluIDMyIGJpdHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsgeGZzX3VpbnQ4X3QgaVs0XTsgfSB4ZnNfZGlyMl9pbm80X3Q7CisKK3R5cGVkZWYgdW5pb24geworCXhmc19kaXIyX2lubzhfdAlpODsKKwl4ZnNfZGlyMl9pbm80X3QJaTQ7Cit9IHhmc19kaXIyX2lub3VfdDsKKworLyoKKyAqIE5vcm1hbGl6ZWQgb2Zmc2V0IChpbiBhIGRhdGEgYmxvY2spIG9mIHRoZSBlbnRyeSwgcmVhbGx5IHhmc19kaXIyX2RhdGFfb2ZmX3QuCisgKiBPbmx5IG5lZWQgMTYgYml0cywgdGhpcyBpcyB0aGUgYnl0ZSBvZmZzZXQgaW50byB0aGUgc2luZ2xlIGJsb2NrIGZvcm0uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsgeGZzX3VpbnQ4X3QgaVsyXTsgfSB4ZnNfZGlyMl9zZl9vZmZfdDsKKworLyoKKyAqIFRoZSBwYXJlbnQgZGlyZWN0b3J5IGhhcyBhIGRlZGljYXRlZCBmaWVsZCwgYW5kIHRoZSBzZWxmLXBvaW50ZXIgbXVzdAorICogYmUgY2FsY3VsYXRlZCBvbiB0aGUgZmx5LgorICoKKyAqIEVudHJpZXMgYXJlIHBhY2tlZCB0b3dhcmQgdGhlIHRvcCBhcyB0aWdodGx5IGFzIHBvc3NpYmxlLiAgVGhlIGhlYWRlcgorICogYW5kIHRoZSBlbGVtZW50cyBtdXN0IGJlIGJjb3B5KCknZCBvdXQgaW50byBhIHdvcmsgYXJlYSB0byBnZXQgY29ycmVjdAorICogYWxpZ25tZW50IGZvciB0aGUgaW5vZGUgbnVtYmVyIGZpZWxkcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcjJfc2ZfaGRyIHsKKwl4ZnNfdWludDhfdAkJY291bnQ7CQkvKiBjb3VudCBvZiBlbnRyaWVzICovCisJeGZzX3VpbnQ4X3QJCWk4Y291bnQ7CS8qIGNvdW50IG9mIDgtYnl0ZSBpbm9kZSAjcyAqLworCXhmc19kaXIyX2lub3VfdAkJcGFyZW50OwkJLyogcGFyZW50IGRpciBpbm9kZSBudW1iZXIgKi8KK30geGZzX2RpcjJfc2ZfaGRyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19kaXIyX3NmX2VudHJ5IHsKKwl4ZnNfdWludDhfdAkJbmFtZWxlbjsJLyogYWN0dWFsIG5hbWUgbGVuZ3RoICovCisJeGZzX2RpcjJfc2Zfb2ZmX3QJb2Zmc2V0OwkJLyogc2F2ZWQgb2Zmc2V0ICovCisJeGZzX3VpbnQ4X3QJCW5hbWVbMV07CS8qIG5hbWUsIHZhcmlhYmxlIHNpemUgKi8KKwl4ZnNfZGlyMl9pbm91X3QJCWludW1iZXI7CS8qIGlub2RlIG51bWJlciwgdmFyLiBvZmZzZXQgKi8KK30geGZzX2RpcjJfc2ZfZW50cnlfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcjJfc2YgeworCXhmc19kaXIyX3NmX2hkcl90CWhkcjsJCS8qIHNob3J0Zm9ybSBoZWFkZXIgKi8KKwl4ZnNfZGlyMl9zZl9lbnRyeV90CWxpc3RbMV07CS8qIHNob3J0Zm9ybSBlbnRyaWVzICovCit9IHhmc19kaXIyX3NmX3Q7CisKKy8qIHRob3NlIGFyZSBmcm9tIHhmc19kaW5vZGUuaCAqLworCisjZGVmaW5lCVhGU19ESU5PREVfVkVSU0lPTl8xCTEKKyNkZWZpbmUJWEZTX0RJTk9ERV9WRVJTSU9OXzIJMgorI2RlZmluZQlYRlNfRElOT0RFX01BR0lDCTB4NDk0ZQkvKiAnSU4nICovCisKKy8qCisgKiBEaXNrIGlub2RlIHN0cnVjdHVyZS4KKyAqIFRoaXMgaXMganVzdCB0aGUgaGVhZGVyOyB0aGUgaW5vZGUgaXMgZXhwYW5kZWQgdG8gZmlsbCBhIHZhcmlhYmxlIHNpemUKKyAqIHdpdGggdGhlIGxhc3QgZmllbGQgZXhwYW5kaW5nLiAgSXQgaXMgc3BsaXQgaW50byB0aGUgY29yZSBhbmQgIm90aGVyIgorICogYmVjYXVzZSB3ZSBvbmx5IG5lZWQgdGhlIGNvcmUgcGFydCBpbiB0aGUgaW4tY29yZSBpbm9kZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX3RpbWVzdGFtcCB7CisJeGZzX2ludDMyX3QJdF9zZWM7CQkvKiB0aW1lc3RhbXAgc2Vjb25kcyAqLworCXhmc19pbnQzMl90CXRfbnNlYzsJCS8qIHRpbWVzdGFtcCBuYW5vc2Vjb25kcyAqLworfSB4ZnNfdGltZXN0YW1wX3Q7CisKKy8qCisgKiBOb3RlOiBDb29yZGluYXRlIGNoYW5nZXMgdG8gdGhpcyBzdHJ1Y3R1cmUgd2l0aCB0aGUgWEZTX0RJXyogI2RlZmluZXMKKyAqIGJlbG93IGFuZCB0aGUgb2Zmc2V0cyB0YWJsZSBpbiB4ZnNfaWFsbG9jX2xvZ19kaSgpLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlub2RlX2NvcmUKK3sKKwl4ZnNfdWludDE2X3QJZGlfbWFnaWM7CS8qIGlub2RlIG1hZ2ljICMgPSBYRlNfRElOT0RFX01BR0lDICovCisJeGZzX3VpbnQxNl90CWRpX21vZGU7CS8qIG1vZGUgYW5kIHR5cGUgb2YgZmlsZSAqLworCXhmc19pbnQ4X3QJZGlfdmVyc2lvbjsJLyogaW5vZGUgdmVyc2lvbiAqLworCXhmc19pbnQ4X3QJZGlfZm9ybWF0OwkvKiBmb3JtYXQgb2YgZGlfYyBkYXRhICovCisJeGZzX3VpbnQxNl90CWRpX29ubGluazsJLyogb2xkIG51bWJlciBvZiBsaW5rcyB0byBmaWxlICovCisJeGZzX3VpbnQzMl90CWRpX3VpZDsJCS8qIG93bmVyJ3MgdXNlciBpZCAqLworCXhmc191aW50MzJfdAlkaV9naWQ7CQkvKiBvd25lcidzIGdyb3VwIGlkICovCisJeGZzX3VpbnQzMl90CWRpX25saW5rOwkvKiBudW1iZXIgb2YgbGlua3MgdG8gZmlsZSAqLworCXhmc191aW50MTZfdAlkaV9wcm9qaWQ7CS8qIG93bmVyJ3MgcHJvamVjdCBpZCAqLworCXhmc191aW50OF90CWRpX3BhZFsxMF07CS8qIHVudXNlZCwgemVyb2VkIHNwYWNlICovCisJeGZzX3RpbWVzdGFtcF90CWRpX2F0aW1lOwkvKiB0aW1lIGxhc3QgYWNjZXNzZWQgKi8KKwl4ZnNfdGltZXN0YW1wX3QJZGlfbXRpbWU7CS8qIHRpbWUgbGFzdCBtb2RpZmllZCAqLworCXhmc190aW1lc3RhbXBfdAlkaV9jdGltZTsJLyogdGltZSBjcmVhdGVkL2lub2RlIG1vZGlmaWVkICovCisJeGZzX2ZzaXplX3QJZGlfc2l6ZTsJLyogbnVtYmVyIG9mIGJ5dGVzIGluIGZpbGUgKi8KKwl4ZnNfZHJmc2Jub190CWRpX25ibG9ja3M7CS8qICMgb2YgZGlyZWN0ICYgYnRyZWUgYmxvY2tzIHVzZWQgKi8KKwl4ZnNfZXh0bGVuX3QJZGlfZXh0c2l6ZTsJLyogYmFzaWMvbWluaW11bSBleHRlbnQgc2l6ZSBmb3IgZmlsZSAqLworCXhmc19leHRudW1fdAlkaV9uZXh0ZW50czsJLyogbnVtYmVyIG9mIGV4dGVudHMgaW4gZGF0YSBmb3JrICovCisJeGZzX2FleHRudW1fdAlkaV9hbmV4dGVudHM7CS8qIG51bWJlciBvZiBleHRlbnRzIGluIGF0dHJpYnV0ZSBmb3JrKi8KKwl4ZnNfdWludDhfdAlkaV9mb3Jrb2ZmOwkvKiBhdHRyIGZvcmsgb2ZmcywgPDwzIGZvciA2NGIgYWxpZ24gKi8KKwl4ZnNfaW50OF90CWRpX2Fmb3JtYXQ7CS8qIGZvcm1hdCBvZiBhdHRyIGZvcmsncyBkYXRhICovCisJeGZzX3VpbnQzMl90CWRpX2RtZXZtYXNrOwkvKiBETUlHIGV2ZW50IG1hc2sgKi8KKwl4ZnNfdWludDE2X3QJZGlfZG1zdGF0ZTsJLyogRE1JRyBzdGF0ZSBpbmZvICovCisJeGZzX3VpbnQxNl90CWRpX2ZsYWdzOwkvKiByYW5kb20gZmxhZ3MsIFhGU19ESUZMQUdfLi4uICovCisJeGZzX3VpbnQzMl90CWRpX2dlbjsJCS8qIGdlbmVyYXRpb24gbnVtYmVyICovCit9IHhmc19kaW5vZGVfY29yZV90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlub2RlCit7CisJeGZzX2Rpbm9kZV9jb3JlX3QJZGlfY29yZTsKKwl4ZnNfYWdpbm9fdAkJZGlfbmV4dF91bmxpbmtlZDsvKiBhZ2kgdW5saW5rZWQgbGlzdCBwdHIgKi8KKwl1bmlvbiB7CisJCXhmc19ibWRyX2Jsb2NrX3QgZGlfYm1idDsJLyogYnRyZWUgcm9vdCBibG9jayAqLworCQl4ZnNfYm1idF9yZWNfMzJfdCBkaV9ibXhbMV07CS8qIGV4dGVudCBsaXN0ICovCisJCXhmc19kaXIyX3NmX3QJZGlfZGlyMnNmOwkvKiBzaG9ydGZvcm0gZGlyZWN0b3J5IHYyICovCisJCWNoYXIJCWRpX2NbMV07CS8qIGxvY2FsIGNvbnRlbnRzICovCisJfSBkaV91OworfSB4ZnNfZGlub2RlX3Q7CisKKy8qCisgKiBWYWx1ZXMgZm9yIGRpX2Zvcm1hdAorICovCit0eXBlZGVmIGVudW0geGZzX2Rpbm9kZV9mbXQKK3sKKwlYRlNfRElOT0RFX0ZNVF9ERVYsCQkvKiBDSFIsIEJMSzogZGlfZGV2ICovCisJWEZTX0RJTk9ERV9GTVRfTE9DQUwsCQkvKiBESVIsIFJFRzogZGlfYyAqLworCQkJCQkvKiBMTks6IGRpX3N5bWxpbmsgKi8KKwlYRlNfRElOT0RFX0ZNVF9FWFRFTlRTLAkJLyogRElSLCBSRUcsIExOSzogZGlfYm14ICovCisJWEZTX0RJTk9ERV9GTVRfQlRSRUUsCQkvKiBESVIsIFJFRywgTE5LOiBkaV9ibWJ0ICovCisJWEZTX0RJTk9ERV9GTVRfVVVJRCAJCS8qIE1OVDogZGlfdXVpZCAqLworfSB4ZnNfZGlub2RlX2ZtdF90OworCisvKgorICogRmlsZSB0eXBlcyAobW9kZSBmaWVsZCkKKyAqLworI2RlZmluZQlJRk1UCQkwMTcwMDAwCQkvKiB0eXBlIG9mIGZpbGUgKi8KKyNkZWZpbmUJSUZESVIJCTAwNDAwMDAJCS8qIGRpcmVjdG9yeSAqLworI2RlZmluZQlJRlJFRwkJMDEwMDAwMAkJLyogcmVndWxhciAqLworI2RlZmluZQlJRkxOSwkJMDEyMDAwMAkJLyogc3ltYm9saWMgbGluayAqLwpkaWZmIC0tZ2l0IGEvc3RhbXAtaDEgYi9zdGFtcC1oMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTQ3ZmUxCi0tLSAvZGV2L251bGwKKysrIGIvc3RhbXAtaDEKQEAgLTAsMCArMSBAQAordGltZXN0YW1wIGZvciBjb25maWcuaApkaWZmIC0tZ2l0IGEvdXRpbC9NYWtlZmlsZS5hbSBiL3V0aWwvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUwNDcxMQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMiBAQAorYmluX1BST0dSQU1TID0gbWJjaGsKK3NiaW5fU0NSSVBUUyA9IGdydWItaW5zdGFsbCBncnViLW1kNS1jcnlwdCBncnViLXRlcm1pbmZvIFwKKwlncnViLXNldC1kZWZhdWx0Citub2luc3RfU0NSSVBUUyA9IGdydWItaW1hZ2UgbWtiaW1hZ2UKKworRVhUUkFfRElTVCA9IG1rYmltYWdlCisKKyMgWFhYOiBOZWVkIHRvIHNlYXJjaCBmb3IgYSBoZWFkZXIgZmlsZSBpbiBkb2NzLCBiZWNhdXNlIG9mIG11bHRpYm9vdC5oLgorQU1fQ0ZMQUdTID0gLUkkKHRvcF9zcmNkaXIpL2xpYiAtSSQodG9wX3NyY2RpcikvZG9jcworCittYmNoa19TT1VSQ0VTID0gbWJjaGsuYworbWJjaGtfTERBREQgPSAuLi9saWIvbGliY29tbW9uLmEKZGlmZiAtLWdpdCBhL3V0aWwvTWFrZWZpbGUuaW4gYi91dGlsL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MDBjZjcKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNDc4IEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjkuNCBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKKworU09VUkNFUyA9ICQobWJjaGtfU09VUkNFUykKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACit0b3BfYnVpbGRkaXIgPSAuLgorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAorSU5TVEFMTCA9IEBJTlNUQUxMQAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorYmluX1BST0dSQU1TID0gbWJjaGskKEVYRUVYVCkKK3N1YmRpciA9IHV0aWwKK0RJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbiBcCisJJChzcmNkaXIpL2dydWItaW1hZ2UuaW4gJChzcmNkaXIpL2dydWItaW5zdGFsbC5pbiBcCisJJChzcmNkaXIpL2dydWItbWQ1LWNyeXB0LmluICQoc3JjZGlyKS9ncnViLXNldC1kZWZhdWx0LmluIFwKKwkkKHNyY2RpcikvZ3J1Yi10ZXJtaW5mby5pbgorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNpbmNsdWRlLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPSBncnViLWltYWdlIGdydWItaW5zdGFsbCBncnViLW1kNS1jcnlwdCBcCisJZ3J1Yi10ZXJtaW5mbyBncnViLXNldC1kZWZhdWx0CithbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQoYmluZGlyKSIgIiQoREVTVERJUikkKHNiaW5kaXIpIgorYmluUFJPR1JBTVNfSU5TVEFMTCA9ICQoSU5TVEFMTF9QUk9HUkFNKQorUFJPR1JBTVMgPSAkKGJpbl9QUk9HUkFNUykKK2FtX21iY2hrX09CSkVDVFMgPSBtYmNoay4kKE9CSkVYVCkKK21iY2hrX09CSkVDVFMgPSAkKGFtX21iY2hrX09CSkVDVFMpCittYmNoa19ERVBFTkRFTkNJRVMgPSAuLi9saWIvbGliY29tbW9uLmEKK3NiaW5TQ1JJUFRfSU5TVEFMTCA9ICQoSU5TVEFMTF9TQ1JJUFQpCitTQ1JJUFRTID0gJChub2luc3RfU0NSSVBUUykgJChzYmluX1NDUklQVFMpCitERUZBVUxUX0lOQ0xVREVTID0gLUkuIC1JJChzcmNkaXIpIC1JJCh0b3BfYnVpbGRkaXIpCitkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCithbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcworQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCisJJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorQ0NMRCA9ICQoQ0MpCitMSU5LID0gJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoQU1fTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorU09VUkNFUyA9ICQobWJjaGtfU09VUkNFUykKK0RJU1RfU09VUkNFUyA9ICQobWJjaGtfU09VUkNFUykKK0VUQUdTID0gZXRhZ3MKK0NUQUdTID0gY3RhZ3MKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBTURFUF9GQUxTRSA9IEBBTURFUF9GQUxTRUAKK0FNREVQX1RSVUUgPSBAQU1ERVBfVFJVRUAKK0FNVEFSID0gQEFNVEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitCVUlMRF9FWEFNUExFX0tFUk5FTF9GQUxTRSA9IEBCVUlMRF9FWEFNUExFX0tFUk5FTF9GQUxTRUAKK0JVSUxEX0VYQU1QTEVfS0VSTkVMX1RSVUUgPSBAQlVJTERfRVhBTVBMRV9LRVJORUxfVFJVRUAKK0NDID0gQENDQAorQ0NBUyA9IEBDQ0FTQAorQ0NBU0ZMQUdTID0gQENDQVNGTEFHU0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitESVNLTEVTU19TVVBQT1JUX0ZBTFNFID0gQERJU0tMRVNTX1NVUFBPUlRfRkFMU0VACitESVNLTEVTU19TVVBQT1JUX1RSVUUgPSBARElTS0xFU1NfU1VQUE9SVF9UUlVFQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRlNZU19DRkxBR1MgPSBARlNZU19DRkxBR1NACitHUlVCX0NGTEFHUyA9IEBHUlVCX0NGTEFHU0AKK0dSVUJfTElCUyA9IEBHUlVCX0xJQlNACitIRVJDVUxFU19TVVBQT1JUX0ZBTFNFID0gQEhFUkNVTEVTX1NVUFBPUlRfRkFMU0VACitIRVJDVUxFU19TVVBQT1JUX1RSVUUgPSBASEVSQ1VMRVNfU1VQUE9SVF9UUlVFQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitMREZMQUdTID0gQExERkxBR1NACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUlOVEFJTkVSX01PREVfRkFMU0UgPSBATUFJTlRBSU5FUl9NT0RFX0ZBTFNFQAorTUFJTlRBSU5FUl9NT0RFX1RSVUUgPSBATUFJTlRBSU5FUl9NT0RFX1RSVUVACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK05FVEJPT1RfRFJJVkVSUyA9IEBORVRCT09UX0RSSVZFUlNACitORVRCT09UX1NVUFBPUlRfRkFMU0UgPSBATkVUQk9PVF9TVVBQT1JUX0ZBTFNFQAorTkVUQk9PVF9TVVBQT1JUX1RSVUUgPSBATkVUQk9PVF9TVVBQT1JUX1RSVUVACitORVRfQ0ZMQUdTID0gQE5FVF9DRkxBR1NACitORVRfRVhUUkFGTEFHUyA9IEBORVRfRVhUUkFGTEFHU0AKK09CSkNPUFkgPSBAT0JKQ09QWUAKK09CSkVYVCA9IEBPQkpFWFRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAorUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACitQRVJMID0gQFBFUkxACitSQU5MSUIgPSBAUkFOTElCQAorU0VSSUFMX1NQRUVEX1NJTVVMQVRJT05fRkFMU0UgPSBAU0VSSUFMX1NQRUVEX1NJTVVMQVRJT05fRkFMU0VACitTRVJJQUxfU1BFRURfU0lNVUxBVElPTl9UUlVFID0gQFNFUklBTF9TUEVFRF9TSU1VTEFUSU9OX1RSVUVACitTRVJJQUxfU1VQUE9SVF9GQUxTRSA9IEBTRVJJQUxfU1VQUE9SVF9GQUxTRUAKK1NFUklBTF9TVVBQT1JUX1RSVUUgPSBAU0VSSUFMX1NVUFBPUlRfVFJVRUAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTVEFHRTFfQ0ZMQUdTID0gQFNUQUdFMV9DRkxBR1NACitTVEFHRTJfQ0ZMQUdTID0gQFNUQUdFMl9DRkxBR1NACitTVFJJUCA9IEBTVFJJUEAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfT0JKQ09QWSA9IEBhY19jdF9PQkpDT1BZQAorYWNfY3RfUkFOTElCID0gQGFjX2N0X1JBTkxJQkAKK2FjX2N0X1NUUklQID0gQGFjX2N0X1NUUklQQAorYW1fX2Zhc3RkZXBDQ19GQUxTRSA9IEBhbV9fZmFzdGRlcENDX0ZBTFNFQAorYW1fX2Zhc3RkZXBDQ19UUlVFID0gQGFtX19mYXN0ZGVwQ0NfVFJVRUAKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorZGF0YWRpciA9IEBkYXRhZGlyQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwcmVmaXggPSBAcHJlZml4QAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAorc2Jpbl9TQ1JJUFRTID0gZ3J1Yi1pbnN0YWxsIGdydWItbWQ1LWNyeXB0IGdydWItdGVybWluZm8gXAorCWdydWItc2V0LWRlZmF1bHQKKworbm9pbnN0X1NDUklQVFMgPSBncnViLWltYWdlIG1rYmltYWdlCitFWFRSQV9ESVNUID0gbWtiaW1hZ2UKKworIyBYWFg6IE5lZWQgdG8gc2VhcmNoIGZvciBhIGhlYWRlciBmaWxlIGluIGRvY3MsIGJlY2F1c2Ugb2YgbXVsdGlib290LmguCitBTV9DRkxBR1MgPSAtSSQodG9wX3NyY2RpcikvbGliIC1JJCh0b3Bfc3JjZGlyKS9kb2NzCittYmNoa19TT1VSQ0VTID0gbWJjaGsuYworbWJjaGtfTERBREQgPSAuLi9saWIvbGliY29tbW9uLmEKK2FsbDogYWxsLWFtCisKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLmMgLm8gLm9iagorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoIFwKKwkJJiYgZXhpdCAwOyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSAgdXRpbC9NYWtlZmlsZSc7IFwKKwljZCAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZ251ICB1dGlsL01ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCitncnViLWltYWdlOiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyAkKHNyY2RpcikvZ3J1Yi1pbWFnZS5pbgorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRACitncnViLWluc3RhbGw6ICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzICQoc3JjZGlyKS9ncnViLWluc3RhbGwuaW4KKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQAorZ3J1Yi1tZDUtY3J5cHQ6ICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzICQoc3JjZGlyKS9ncnViLW1kNS1jcnlwdC5pbgorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRACitncnViLXRlcm1pbmZvOiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyAkKHNyY2RpcikvZ3J1Yi10ZXJtaW5mby5pbgorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRACitncnViLXNldC1kZWZhdWx0OiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cyAkKHNyY2RpcikvZ3J1Yi1zZXQtZGVmYXVsdC5pbgorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRACitpbnN0YWxsLWJpblBST0dSQU1TOiAkKGJpbl9QUk9HUkFNUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKGJpbmRpcikiIHx8ICQobWtkaXJfcCkgIiQoREVTVERJUikkKGJpbmRpcikiCisJQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgcDE9YGVjaG8gJCRwfHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKKwkgIGlmIHRlc3QgLWYgJCRwIFwKKwkgIDsgdGhlbiBcCisJICAgIGY9YGVjaG8gIiQkcDEiIHwgc2VkICdzLF4uKi8sLDskKHRyYW5zZm9ybSk7cy8kJC8kKEVYRUVYVCkvJ2A7IFwKKwkgICBlY2hvICIgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKGJpblBST0dSQU1TX0lOU1RBTEwpICckJHAnICckKERFU1RESVIpJChiaW5kaXIpLyQkZiciOyBcCisJICAgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKGJpblBST0dSQU1TX0lOU1RBTEwpICIkJHAiICIkKERFU1RESVIpJChiaW5kaXIpLyQkZiIgfHwgZXhpdCAxOyBcCisJICBlbHNlIDo7IGZpOyBcCisJZG9uZQorCit1bmluc3RhbGwtYmluUFJPR1JBTVM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChiaW5fUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBmPWBlY2hvICIkJHAiIHwgc2VkICdzLF4uKi8sLDtzLyQoRVhFRVhUKSQkLy87JCh0cmFuc2Zvcm0pO3MvJCQvJChFWEVFWFQpLydgOyBcCisJICBlY2hvICIgcm0gLWYgJyQoREVTVERJUikkKGJpbmRpcikvJCRmJyI7IFwKKwkgIHJtIC1mICIkKERFU1RESVIpJChiaW5kaXIpLyQkZiI7IFwKKwlkb25lCisKK2NsZWFuLWJpblBST0dSQU1TOgorCS10ZXN0IC16ICIkKGJpbl9QUk9HUkFNUykiIHx8IHJtIC1mICQoYmluX1BST0dSQU1TKQorbWJjaGskKEVYRUVYVCk6ICQobWJjaGtfT0JKRUNUUykgJChtYmNoa19ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBtYmNoayQoRVhFRVhUKQorCSQoTElOSykgJChtYmNoa19MREZMQUdTKSAkKG1iY2hrX09CSkVDVFMpICQobWJjaGtfTERBREQpICQoTElCUykKK2luc3RhbGwtc2JpblNDUklQVFM6ICQoc2Jpbl9TQ1JJUFRTKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQoc2JpbmRpcikiIHx8ICQobWtkaXJfcCkgIiQoREVTVERJUikkKHNiaW5kaXIpIgorCUBsaXN0PSckKHNiaW5fU0NSSVBUUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgIiQkcCI7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICBpZiB0ZXN0IC1mICQkZCQkcDsgdGhlbiBcCisJICAgIGY9YGVjaG8gIiQkcCIgfCBzZWQgJ3N8Xi4qL3x8OyQodHJhbnNmb3JtKSdgOyBcCisJICAgIGVjaG8gIiAkKHNiaW5TQ1JJUFRfSU5TVEFMTCkgJyQkZCQkcCcgJyQoREVTVERJUikkKHNiaW5kaXIpLyQkZiciOyBcCisJICAgICQoc2JpblNDUklQVF9JTlNUQUxMKSAiJCRkJCRwIiAiJChERVNURElSKSQoc2JpbmRpcikvJCRmIjsgXAorCSAgZWxzZSA6OyBmaTsgXAorCWRvbmUKKwordW5pbnN0YWxsLXNiaW5TQ1JJUFRTOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQoc2Jpbl9TQ1JJUFRTKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgZj1gZWNobyAiJCRwIiB8IHNlZCAnc3xeLiovfHw7JCh0cmFuc2Zvcm0pJ2A7IFwKKwkgIGVjaG8gIiBybSAtZiAnJChERVNURElSKSQoc2JpbmRpcikvJCRmJyI7IFwKKwkgIHJtIC1mICIkKERFU1RESVIpJChzYmluZGlyKS8kJGYiOyBcCisJZG9uZQorCittb3N0bHljbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLiQoT0JKRVhUKQorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbWJjaGsuUG9AYW1fX3F1b3RlQAorCisuYy5vOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJaWYgJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgIiQoREVQRElSKS8kKi5UcG8iIC1jIC1vICRAICQ8OyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvJCouVHBvIiAiJChERVBESVIpLyQqLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpLyQqLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jICQ8CisKKy5jLm9iajoKK0BhbV9fZmFzdGRlcENDX1RSVUVACWlmICQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICIkKERFUERJUikvJCouVHBvIiAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgOyBcCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAl0aGVuIG12IC1mICIkKERFUERJUikvJCouVHBvIiAiJChERVBESVIpLyQqLlBvIjsgZWxzZSBybSAtZiAiJChERVBESVIpLyQqLlRwbyI7IGV4aXQgMTsgZmkKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKK3VuaW5zdGFsbC1pbmZvLWFtOgorCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiBUQUdTCisKK1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgJCR0YWdzICQkdW5pcXVlOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJdGFncz07IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCisJICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCisJdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdGFncyQkdW5pcXVlIiBcCisJICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCisJICAgICAkJHRhZ3MgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmIGNkICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAkJGhlcmUKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IGZvciBmaWxlIGluICQkbGlzdDsgZG8gXAorCSAgY2FzZSAkJGZpbGUgaW4gXAorCSAgICAkKHNyY2RpcikvKikgZmlsZT1gZWNobyAiJCRmaWxlIiB8IHNlZCAic3xeJCRzcmNkaXJzdHJpcC98fCJgOzsgXAorCSAgICAkKHRvcF9zcmNkaXIpLyopIGZpbGU9YGVjaG8gIiQkZmlsZSIgfCBzZWQgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98ImA7OyBcCisJICBlc2FjOyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBkaXI9YGVjaG8gIiQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICBpZiB0ZXN0ICIkJGRpciIgIT0gIiQkZmlsZSIgJiYgdGVzdCAiJCRkaXIiICE9ICIuIjsgdGhlbiBcCisJICAgIGRpcj0iLyQkZGlyIjsgXAorCSAgICAkKG1rZGlyX3ApICIkKGRpc3RkaXIpJCRkaXIiOyBcCisJICBlbHNlIFwKKwkgICAgZGlyPScnOyBcCisJICBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLXBSICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSQkZGlyIHx8IGV4aXQgMTsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtcFIgJCRkLyQkZmlsZSAkKGRpc3RkaXIpJCRkaXIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpICQoU0NSSVBUUykKK2luc3RhbGxkaXJzOgorCWZvciBkaXIgaW4gIiQoREVTVERJUikkKGJpbmRpcikiICIkKERFU1RESVIpJChzYmluZGlyKSI7IGRvIFwKKwkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKG1rZGlyX3ApICIkJGRpciI7IFwKKwlkb25lCitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorY2xlYW46IGNsZWFuLWFtCisKK2NsZWFuLWFtOiBjbGVhbi1iaW5QUk9HUkFNUyBjbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisJLXJtIC1yZiAuLyQoREVQRElSKQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCisJZGlzdGNsZWFuLXRhZ3MKKworZHZpOiBkdmktYW0KKworZHZpLWFtOgorCitodG1sOiBodG1sLWFtCisKK2luZm86IGluZm8tYW0KKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOgorCitpbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtYmluUFJPR1JBTVMgaW5zdGFsbC1zYmluU0NSSVBUUworCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCisJLXJtIC1yZiAuLyQoREVQRElSKQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYworCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtYmluUFJPR1JBTVMgdW5pbnN0YWxsLWluZm8tYW0gXAorCXVuaW5zdGFsbC1zYmluU0NSSVBUUworCisuUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tYmluUFJPR1JBTVMgXAorCWNsZWFuLWdlbmVyaWMgY3RhZ3MgZGlzdGNsZWFuIGRpc3RjbGVhbi1jb21waWxlIFwKKwlkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tdGFncyBkaXN0ZGlyIGR2aSBkdmktYW0gaHRtbCBcCisJaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtYmluUFJPR1JBTVMgXAorCWluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBcCisJaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLXNiaW5TQ1JJUFRTIFwKKwlpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgXAorCW1haW50YWluZXItY2xlYW4gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIFwKKwltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgcGRmIHBkZi1hbSBwcyBwcy1hbSBcCisJdGFncyB1bmluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbC1iaW5QUk9HUkFNUyBcCisJdW5pbnN0YWxsLWluZm8tYW0gdW5pbnN0YWxsLXNiaW5TQ1JJUFRTCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL3V0aWwvZ3J1Yi1pbWFnZSBiL3V0aWwvZ3J1Yi1pbWFnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDEyOTgwCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9ncnViLWltYWdlCkBAIC0wLDAgKzEsMTM4IEBACisjISAvYmluL3NoCisjIGdydWItaW1hZ2UgLSBDcmVhdGUgYSBHUlVCIGJvb3QgZmlsZXN5c3RlbSBpbWFnZSBhbmQgdGFyYmFsbAorIyBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBmaWcub3JnPiwgMjAwMC0wNy0yNQorIworIyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworcHJlZml4PS91c3IvbG9jYWwKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorc2JpbmRpcj0ke2V4ZWNfcHJlZml4fS9zYmluCitsaWJkaXI9JHtleGVjX3ByZWZpeH0vbGliCitQQUNLQUdFPWdydWIKK2hvc3RfY3B1PXg4Nl82NAoraG9zdF9vcz1saW51eC1nbnUKK2hvc3RfdmVuZG9yPXVua25vd24KK2NvbnRleHQ9JHtob3N0X2NwdX0tJHtob3N0X3ZlbmRvcn0KK3BrZ2xpYmRpcj0ke2xpYmRpcn0vJHtQQUNLQUdFfS8ke2NvbnRleHR9CisKK21rZTJmcz1gd2hpY2ggbWtlMmZzYAorCitwcm9nbmFtZT1gZWNobyAiJDAiIHwgc2VkICdzJV4uKi8lJSdgCit0aGlzZGlyPWBlY2hvICIkMCIgfCBzZWQgJ3MlL1teL10qJCUlJ2AKK3Rlc3QgIlgkdGhpc2RpciIgPSAiWCQwIiAmJiB0aGlzZGlyPS4KKworIyBTZWUgaWYgd2Ugd2VyZSBpbnZva2VkIGZyb20gd2l0aGluIHRoZSBidWlsZCBkaXJlY3RvcnksIGFuZCBpZiBzbywKKyMgdXNlIHRoZSBidWlsdCBmaWxlcyByYXRoZXIgdGhhbiB0aGUgaW5zdGFsbGVkIG9uZXMuCitpZiB0ZXN0IC1mICR0aGlzZGlyLy4uL3N0YWdlMi9zdGFnZTI7IHRoZW4KKyAgZ3J1Yl9zaGVsbD0iJHRoaXNkaXIvLi4vZ3J1Yi9ncnViIgorICBzdGFnZTFkaXI9IiR0aGlzZGlyLy4uL3N0YWdlMSIKKyAgc3RhZ2UyZGlyPSIkdGhpc2Rpci8uLi9zdGFnZTIiCitlbHNlCisgIGdydWJfc2hlbGw9JHtzYmluZGlyfS9ncnViCisgIHN0YWdlMWRpcj0iJHBrZ2xpYmRpciIKKyAgc3RhZ2UyZGlyPSIkcGtnbGliZGlyIgorZmkKKworIyBFeGl0IG9uIGFueSBlcnJvci4KK3NldCAtZQorCisjIEdldCBHUlVCJ3MgdmVyc2lvbiBmcm9tIHRoZSBHcnViIHNoZWxsLCBzaW5jZSB3ZSB1c2UgdGhlCisjIGluc3RhbGxlZCBmaWxlcy4KK1ZFUlNJT049YCRncnViX3NoZWxsIC0tdmVyc2lvbiB8IHNlZCAtZSAncy9eLiogXChbMC05Ll0qXCkuKiQvXDEvJ2AKK3Rlc3QgIlgkVkVSU0lPTiIgIT0gWAorCitib290ZGlyPSR7UEFDS0FHRX0tJHtWRVJTSU9OfS0ke2NvbnRleHR9CitpbWFnZT0kYm9vdGRpci5leHQyZnMKKworIyBDcmVhdGUgdGhlIHRhcmJhbGwuCitpZiB0ZXN0ICEgLWYgJGJvb3RkaXIudGFyLmd6OyB0aGVuCisgIGVjaG8gIiMgQ3JlYXRpbmcgXGAkYm9vdGRpci50YXIuZ3onIgorICBta2RpciAtcCAkYm9vdGRpci9ib290L2dydWIKKyAgY3AgLXAgJHN0YWdlMWRpci9zdGFnZTEgJHN0YWdlMmRpci8qX3N0YWdlMV81ICRzdGFnZTJkaXIvc3RhZ2UyIFwKKyAgICAkYm9vdGRpci9ib290L2dydWIKKyAgdGVzdCAhIC1mIG1lbnUubHN0IHx8IGNwIC1wIG1lbnUubHN0ICRib290ZGlyL2Jvb3QvZ3J1YgorICB0cmFwICJybSAtZiAkYm9vdGRpci50YXIuZ3oiIDAKKyAgR1pJUD0tOSB0YXIgLXpjZiAkYm9vdGRpci50YXIuZ3ogJGJvb3RkaXIKKyAgdHJhcCAnJyAwCisgIHJtIC1yZiAkYm9vdGRpcgorZmkKKworIyBDcmVhdGUgYSBuZXcgZmlsZXN5c3RlbSBpbWFnZSBvZiB0aGUgc3BlY2lmaWVkIHNpemUuCitpZiB0ZXN0ICEgLWYgJGltYWdlOyB0aGVuCisgIHRhcnNpemU9YHpjYXQgJGJvb3RkaXIudGFyLmd6IHwgd2MgLWNgCisKKyAgIyBBZGQgYWJvdXQgMzAlICgyMCUgb3ZlcmhlYWQgcGx1cyAxMCUgYnJlYXRoaW5nIHJvb20pLCBhbmQgY29udmVydAorICAjIHRvIGtpbG9ieXRlcy4gIFRoaXMgZmFjdG9yIHdhcyBkZXRlcm1pbmVkIGVtcGlyaWNhbGx5LgorICBTSVpFPWBleHByICR0YXJzaXplIFwqIDEzMCAvIDEwMCAvIDEwMjRgaworICBlY2hvICIjIENyZWF0aW5nICRTSVpFIGRpc2sgaW1hZ2UgXGAkaW1hZ2UnIgorICB0cmFwICJybSAtZiAkaW1hZ2UiIDAKKyAgZGQgaWY9L2Rldi96ZXJvIG9mPSRpbWFnZSBicz0kU0laRSBjb3VudD0xID4vZGV2L251bGwKKyAgJG1rZTJmcyAtRiAkaW1hZ2UKKyAgdHJhcCAnJyAwCitmaQorCisKKyMgQXR0ZW1wdCB0byBtb3VudCB0aGUgaW1hZ2UuCitlY2hvICIjIE1vdW50aW5nIFxgJGltYWdlJyIKK3Rlc3QgLWQgJGJvb3RkaXIgfHwgbWtkaXIgJGJvb3RkaXIKK2Nhc2UgIiRob3N0X29zIiBpbgorZ251KikKKyAgc2V0dHJhbnMgLWEgJGJvb3RkaXIgL2h1cmQvZXh0MmZzICRpbWFnZQorICB1bW91bnQ9InNldHRyYW5zIC1hICRib290ZGlyIgorICA7OworCitsaW51eCopCisgICMgVGhpcyByZXF1aXJlcyBydW5uaW5nIGFzIHJvb3QsIGFuZCB1c2luZyB0aGUgbG9vcCBkZXZpY2UuCisgIGk9MAorICB3aGlsZSB0ZXN0IC1lIC9kZXYvbG9vcCRpOyBkbworICAgIGlmIC9zYmluL2xvc2V0dXAgL2Rldi9sb29wJGkgJGltYWdlOyB0aGVuCisgICAgICBicmVhaworICAgIGZpCisgICAgaT1gZXhwciAkaSArIDFgCisgIGRvbmUKKworICAjIFNpbGx5IGxvc2V0dXAgZG9lc24ndCByZXBvcnQgYW4gZXJyb3IhCisgIG1vdW50IC9kZXYvbG9vcCRpICRib290ZGlyCisgIHVtb3VudD0idW1vdW50ICRib290ZGlyICYmIC9zYmluL2xvc2V0dXAgLWQgL2Rldi9sb29wJGkgJiYgdHJhcCAnJyAwIgorICA7OworCisqKQorICBlY2hvICIkcHJvZ25hbWU6IE1vdW50aW5nIFxgJGltYWdlJyB1bmRlciBcYCRob3N0X29zJyBpcyBub3Qgc3VwcG9ydGVkIiAxPiYyCisgIGV4aXQgMQorICA7OworZXNhYwordHJhcCAiJHVtb3VudCIgMAorCisjIEV4dHJhY3Qgb3VyIHRhcmJhbGwgaW50byB0aGUgaW1hZ2UsIHRoZW4gdW5tb3VudCBpdC4KK2VjaG8gIiMgQ29weWluZyBmaWxlcyBpbnRvIFxgJGltYWdlJzoiCit0YXIgLXp4dmYgJGJvb3RkaXIudGFyLmd6CisKK2VjaG8gIiMgXGAkaW1hZ2UnIHVzYWdlOiIKK2RmICRib290ZGlyCitldmFsICR1bW91bnQKK3JtZGlyICRib290ZGlyIHx8IDoKKworIyBVc2UgdGhlIEdSVUIgc2hlbGwgdG8gcHJvcGVybHkgc2V0IHVwIEdSVUIgb24gdGhlIGltYWdlLgorZWNobyAiIyBJbnN0YWxsaW5nIEdSVUIgaW4gXGAkaW1hZ2UnIgorY2F0IDw8RU9GIHwgJGdydWJfc2hlbGwgLS1iYXRjaCAtLWRldmljZS1tYXA9L2Rldi9udWxsCitkZXZpY2UgKGZkMCkgJGltYWdlCityb290IChmZDApCitpbnN0YWxsIC9ib290L2dydWIvc3RhZ2UxIChmZDApIC9ib290L2dydWIvc3RhZ2UyCitxdWl0CitFT0YKKworZXhpdCAwCmRpZmYgLS1naXQgYS91dGlsL2dydWItaW1hZ2UuaW4gYi91dGlsL2dydWItaW1hZ2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE2MzI1MAotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvZ3J1Yi1pbWFnZS5pbgpAQCAtMCwwICsxLDEzOCBAQAorIyEgL2Jpbi9zaAorIyBncnViLWltYWdlIC0gQ3JlYXRlIGEgR1JVQiBib290IGZpbGVzeXN0ZW0gaW1hZ2UgYW5kIHRhcmJhbGwKKyMgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZmlnLm9yZz4sIDIwMDAtMDctMjUKKyMKKyMgICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorc2JpbmRpcj1Ac2JpbmRpckAKK2xpYmRpcj1AbGliZGlyQAorUEFDS0FHRT1AUEFDS0FHRUAKK2hvc3RfY3B1PUBob3N0X2NwdUAKK2hvc3Rfb3M9QGhvc3Rfb3NACitob3N0X3ZlbmRvcj1AaG9zdF92ZW5kb3JACitjb250ZXh0PSR7aG9zdF9jcHV9LSR7aG9zdF92ZW5kb3J9Citwa2dsaWJkaXI9JHtsaWJkaXJ9LyR7UEFDS0FHRX0vJHtjb250ZXh0fQorCitta2UyZnM9YHdoaWNoIG1rZTJmc2AKKworcHJvZ25hbWU9YGVjaG8gIiQwIiB8IHNlZCAncyVeLiovJSUnYAordGhpc2Rpcj1gZWNobyAiJDAiIHwgc2VkICdzJS9bXi9dKiQlJSdgCit0ZXN0ICJYJHRoaXNkaXIiID0gIlgkMCIgJiYgdGhpc2Rpcj0uCisKKyMgU2VlIGlmIHdlIHdlcmUgaW52b2tlZCBmcm9tIHdpdGhpbiB0aGUgYnVpbGQgZGlyZWN0b3J5LCBhbmQgaWYgc28sCisjIHVzZSB0aGUgYnVpbHQgZmlsZXMgcmF0aGVyIHRoYW4gdGhlIGluc3RhbGxlZCBvbmVzLgoraWYgdGVzdCAtZiAkdGhpc2Rpci8uLi9zdGFnZTIvc3RhZ2UyOyB0aGVuCisgIGdydWJfc2hlbGw9IiR0aGlzZGlyLy4uL2dydWIvZ3J1YiIKKyAgc3RhZ2UxZGlyPSIkdGhpc2Rpci8uLi9zdGFnZTEiCisgIHN0YWdlMmRpcj0iJHRoaXNkaXIvLi4vc3RhZ2UyIgorZWxzZQorICBncnViX3NoZWxsPSR7c2JpbmRpcn0vZ3J1YgorICBzdGFnZTFkaXI9IiRwa2dsaWJkaXIiCisgIHN0YWdlMmRpcj0iJHBrZ2xpYmRpciIKK2ZpCisKKyMgRXhpdCBvbiBhbnkgZXJyb3IuCitzZXQgLWUKKworIyBHZXQgR1JVQidzIHZlcnNpb24gZnJvbSB0aGUgR3J1YiBzaGVsbCwgc2luY2Ugd2UgdXNlIHRoZQorIyBpbnN0YWxsZWQgZmlsZXMuCitWRVJTSU9OPWAkZ3J1Yl9zaGVsbCAtLXZlcnNpb24gfCBzZWQgLWUgJ3MvXi4qIFwoWzAtOS5dKlwpLiokL1wxLydgCit0ZXN0ICJYJFZFUlNJT04iICE9IFgKKworYm9vdGRpcj0ke1BBQ0tBR0V9LSR7VkVSU0lPTn0tJHtjb250ZXh0fQoraW1hZ2U9JGJvb3RkaXIuZXh0MmZzCisKKyMgQ3JlYXRlIHRoZSB0YXJiYWxsLgoraWYgdGVzdCAhIC1mICRib290ZGlyLnRhci5nejsgdGhlbgorICBlY2hvICIjIENyZWF0aW5nIFxgJGJvb3RkaXIudGFyLmd6JyIKKyAgbWtkaXIgLXAgJGJvb3RkaXIvYm9vdC9ncnViCisgIGNwIC1wICRzdGFnZTFkaXIvc3RhZ2UxICRzdGFnZTJkaXIvKl9zdGFnZTFfNSAkc3RhZ2UyZGlyL3N0YWdlMiBcCisgICAgJGJvb3RkaXIvYm9vdC9ncnViCisgIHRlc3QgISAtZiBtZW51LmxzdCB8fCBjcCAtcCBtZW51LmxzdCAkYm9vdGRpci9ib290L2dydWIKKyAgdHJhcCAicm0gLWYgJGJvb3RkaXIudGFyLmd6IiAwCisgIEdaSVA9LTkgdGFyIC16Y2YgJGJvb3RkaXIudGFyLmd6ICRib290ZGlyCisgIHRyYXAgJycgMAorICBybSAtcmYgJGJvb3RkaXIKK2ZpCisKKyMgQ3JlYXRlIGEgbmV3IGZpbGVzeXN0ZW0gaW1hZ2Ugb2YgdGhlIHNwZWNpZmllZCBzaXplLgoraWYgdGVzdCAhIC1mICRpbWFnZTsgdGhlbgorICB0YXJzaXplPWB6Y2F0ICRib290ZGlyLnRhci5neiB8IHdjIC1jYAorCisgICMgQWRkIGFib3V0IDMwJSAoMjAlIG92ZXJoZWFkIHBsdXMgMTAlIGJyZWF0aGluZyByb29tKSwgYW5kIGNvbnZlcnQKKyAgIyB0byBraWxvYnl0ZXMuICBUaGlzIGZhY3RvciB3YXMgZGV0ZXJtaW5lZCBlbXBpcmljYWxseS4KKyAgU0laRT1gZXhwciAkdGFyc2l6ZSBcKiAxMzAgLyAxMDAgLyAxMDI0YGsKKyAgZWNobyAiIyBDcmVhdGluZyAkU0laRSBkaXNrIGltYWdlIFxgJGltYWdlJyIKKyAgdHJhcCAicm0gLWYgJGltYWdlIiAwCisgIGRkIGlmPS9kZXYvemVybyBvZj0kaW1hZ2UgYnM9JFNJWkUgY291bnQ9MSA+L2Rldi9udWxsCisgICRta2UyZnMgLUYgJGltYWdlCisgIHRyYXAgJycgMAorZmkKKworCisjIEF0dGVtcHQgdG8gbW91bnQgdGhlIGltYWdlLgorZWNobyAiIyBNb3VudGluZyBcYCRpbWFnZSciCit0ZXN0IC1kICRib290ZGlyIHx8IG1rZGlyICRib290ZGlyCitjYXNlICIkaG9zdF9vcyIgaW4KK2dudSopCisgIHNldHRyYW5zIC1hICRib290ZGlyIC9odXJkL2V4dDJmcyAkaW1hZ2UKKyAgdW1vdW50PSJzZXR0cmFucyAtYSAkYm9vdGRpciIKKyAgOzsKKworbGludXgqKQorICAjIFRoaXMgcmVxdWlyZXMgcnVubmluZyBhcyByb290LCBhbmQgdXNpbmcgdGhlIGxvb3AgZGV2aWNlLgorICBpPTAKKyAgd2hpbGUgdGVzdCAtZSAvZGV2L2xvb3AkaTsgZG8KKyAgICBpZiAvc2Jpbi9sb3NldHVwIC9kZXYvbG9vcCRpICRpbWFnZTsgdGhlbgorICAgICAgYnJlYWsKKyAgICBmaQorICAgIGk9YGV4cHIgJGkgKyAxYAorICBkb25lCisKKyAgIyBTaWxseSBsb3NldHVwIGRvZXNuJ3QgcmVwb3J0IGFuIGVycm9yIQorICBtb3VudCAvZGV2L2xvb3AkaSAkYm9vdGRpcgorICB1bW91bnQ9InVtb3VudCAkYm9vdGRpciAmJiAvc2Jpbi9sb3NldHVwIC1kIC9kZXYvbG9vcCRpICYmIHRyYXAgJycgMCIKKyAgOzsKKworKikKKyAgZWNobyAiJHByb2duYW1lOiBNb3VudGluZyBcYCRpbWFnZScgdW5kZXIgXGAkaG9zdF9vcycgaXMgbm90IHN1cHBvcnRlZCIgMT4mMgorICBleGl0IDEKKyAgOzsKK2VzYWMKK3RyYXAgIiR1bW91bnQiIDAKKworIyBFeHRyYWN0IG91ciB0YXJiYWxsIGludG8gdGhlIGltYWdlLCB0aGVuIHVubW91bnQgaXQuCitlY2hvICIjIENvcHlpbmcgZmlsZXMgaW50byBcYCRpbWFnZSc6IgordGFyIC16eHZmICRib290ZGlyLnRhci5negorCitlY2hvICIjIFxgJGltYWdlJyB1c2FnZToiCitkZiAkYm9vdGRpcgorZXZhbCAkdW1vdW50CitybWRpciAkYm9vdGRpciB8fCA6CisKKyMgVXNlIHRoZSBHUlVCIHNoZWxsIHRvIHByb3Blcmx5IHNldCB1cCBHUlVCIG9uIHRoZSBpbWFnZS4KK2VjaG8gIiMgSW5zdGFsbGluZyBHUlVCIGluIFxgJGltYWdlJyIKK2NhdCA8PEVPRiB8ICRncnViX3NoZWxsIC0tYmF0Y2ggLS1kZXZpY2UtbWFwPS9kZXYvbnVsbAorZGV2aWNlIChmZDApICRpbWFnZQorcm9vdCAoZmQwKQoraW5zdGFsbCAvYm9vdC9ncnViL3N0YWdlMSAoZmQwKSAvYm9vdC9ncnViL3N0YWdlMgorcXVpdAorRU9GCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvdXRpbC9ncnViLWluc3RhbGwgYi91dGlsL2dydWItaW5zdGFsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjcxMDcwCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9ncnViLWluc3RhbGwKQEAgLTAsMCArMSw0NzcgQEAKKyMhIC9iaW4vc2gKKworIyBJbnN0YWxsIEdSVUIgb24geW91ciBkcml2ZS4KKyMgICBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwMywyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMuCitwcmVmaXg9L3Vzci9sb2NhbAorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitzYmluZGlyPSR7ZXhlY19wcmVmaXh9L3NiaW4KK2xpYmRpcj0ke2V4ZWNfcHJlZml4fS9saWIKK1BBQ0tBR0U9Z3J1YgorVkVSU0lPTj0wLjk3Citob3N0X2NwdT14ODZfNjQKK2hvc3Rfb3M9bGludXgtZ251Citob3N0X3ZlbmRvcj11bmtub3duCitwa2dsaWJkaXI9JHtsaWJkaXJ9LyR7UEFDS0FHRX0vJHtob3N0X2NwdX0tJHtob3N0X3ZlbmRvcn0KKworZ3J1Yl9zaGVsbD0ke3NiaW5kaXJ9L2dydWIKK2dydWJfc2V0X2RlZmF1bHQ9JHtzYmluZGlyfS9ncnViLXNldC1kZWZhdWx0Citsb2dfZmlsZT0vdG1wL2dydWItaW5zdGFsbC5sb2cuJCQKK2ltZ19maWxlPS90bXAvZ3J1Yi1pbnN0YWxsLmltZy4kJAorcm9vdGRpcj0KK2dydWJfcHJlZml4PS9ib290L2dydWIKKworaW5zdGFsbF9kZXZpY2U9Citub19mbG9wcHk9Citmb3JjZV9sYmE9CityZWNoZWNrPW5vCitkZWJ1Zz1ubworCisjIGxvb2sgZm9yIHNlY3VyZSB0ZW1wZmlsZSBjcmVhdGlvbiB3cmFwcGVycyBvbiB0aGlzIHBsYXRmb3JtCitpZiB0ZXN0IC14IC9iaW4vdGVtcGZpbGU7IHRoZW4KKyAgICBta2xvZz0iL2Jpbi90ZW1wZmlsZSAtLXByZWZpeD1ncnViIgorICAgIG1raW1nPSIvYmluL3RlbXBmaWxlIC0tcHJlZml4PWdydWIiCitlbGlmIHRlc3QgLXggL2Jpbi9ta3RlbXA7IHRoZW4KKyAgICBta2xvZz0iL2Jpbi9ta3RlbXAgL3RtcC9ncnViLWluc3RhbGwubG9nLlhYWFhYWCIKKyAgICBta2ltZz0iL2Jpbi9ta3RlbXAgL3RtcC9ncnViLWluc3RhbGwuaW1nLlhYWFhYWCIKK2Vsc2UKKyAgICBta2xvZz0iIgorICAgIG1raW1nPSIiCitmaQorCisjIFVzYWdlOiB1c2FnZQorIyBQcmludCB0aGUgdXNhZ2UuCit1c2FnZSAoKSB7CisgICAgY2F0IDw8RU9GCitVc2FnZTogZ3J1Yi1pbnN0YWxsIFtPUFRJT05dIGluc3RhbGxfZGV2aWNlCitJbnN0YWxsIEdSVUIgb24geW91ciBkcml2ZS4KKworICAtaCwgLS1oZWxwICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UgYW5kIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKyAgLS1yb290LWRpcmVjdG9yeT1ESVIgICAgaW5zdGFsbCBHUlVCIGltYWdlcyB1bmRlciB0aGUgZGlyZWN0b3J5IERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIHRoZSByb290IGRpcmVjdG9yeQorICAtLWdydWItc2hlbGw9RklMRSAgICAgICB1c2UgRklMRSBhcyB0aGUgZ3J1YiBzaGVsbAorICAtLW5vLWZsb3BweSAgICAgICAgICAgICBkbyBub3QgcHJvYmUgYW55IGZsb3BweSBkcml2ZQorICAtLWZvcmNlLWxiYSAgICAgICAgICAgICBmb3JjZSBHUlVCIHRvIHVzZSBMQkEgbW9kZSBldmVuIGZvciBhIGJ1Z2d5CisgICAgICAgICAgICAgICAgICAgICAgICAgIEJJT1MKKyAgLS1yZWNoZWNrICAgICAgICAgICAgICAgcHJvYmUgYSBkZXZpY2UgbWFwIGV2ZW4gaWYgaXQgYWxyZWFkeSBleGlzdHMKKworSU5TVEFMTF9ERVZJQ0UgY2FuIGJlIGEgR1JVQiBkZXZpY2UgbmFtZSBvciBhIHN5c3RlbSBkZXZpY2UgZmlsZW5hbWUuCisKK2dydWItaW5zdGFsbCBjb3BpZXMgR1JVQiBpbWFnZXMgaW50byB0aGUgRElSL2Jvb3QgZGlyZWN0b3J5IHNwZWNmaWVkIGJ5CistLXJvb3QtZGlyZWN0b3J5LCBhbmQgdXNlcyB0aGUgZ3J1YiBzaGVsbCB0byBpbnN0YWxsIGdydWIgaW50byB0aGUgYm9vdAorc2VjdG9yLgorCitSZXBvcnQgYnVncyB0byA8YnVnLWdydWJAZ251Lm9yZz4uCitFT0YKK30KKworIyBVc2FnZTogY29udmVydCBvc19kZXZpY2UKKyMgQ29udmVydCBhbiBPUyBkZXZpY2UgdG8gdGhlIGNvcnJlc3BvbmRpbmcgR1JVQiBkcml2ZS4KKyMgVGhpcyBwYXJ0IGlzIE9TLXNwZWNpZmljLgorY29udmVydCAoKSB7CisgICAgIyBGaXJzdCwgY2hlY2sgaWYgdGhlIGRldmljZSBmaWxlIGV4aXN0cy4KKyAgICBpZiB0ZXN0IC1lICIkMSI7IHRoZW4KKwk6CisgICAgZWxzZQorCWVjaG8gIiQxOiBOb3QgZm91bmQgb3Igbm90IGEgYmxvY2sgZGV2aWNlLiIgMT4mMgorCWV4aXQgMQorICAgIGZpCisKKyAgICAjIEJyZWFrIHRoZSBkZXZpY2UgbmFtZSBpbnRvIHRoZSBkaXNrIHBhcnQgYW5kIHRoZSBwYXJ0aXRpb24gcGFydC4KKyAgICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgICBsaW51eCopCisJdG1wX2Rpc2s9YGVjaG8gIiQxIiB8IHNlZCAtZSAncyVcKFtzaF1kW2Etel1cKVswLTldKiQlXDElJyBcCisJCQkJICAtZSAncyVcKGRbMC05XSpcKXBbMC05XSokJVwxJScgXAorCQkJCSAgLWUgJ3MlXChmZFswLTldKlwpJCVcMSUnIFwKKwkJCQkgIC1lICdzJS9wYXJ0WzAtOV0qJCUvZGlzYyUnIFwKKwkJCQkgIC1lICdzJVwoY1swLTddZFswLTldKlwpLiokJVwxJSdgCisJdG1wX3BhcnQ9YGVjaG8gIiQxIiB8IHNlZCAtZSAncyUuKi9bc2hdZFthLXpdXChbMC05XSpcKSQlXDElJyBcCisJCQkJICAtZSAncyUuKmRbMC05XSpwJSUnIFwKKwkJCQkgIC1lICdzJS4qL2ZkWzAtOV0qJCUlJyBcCisJCQkJICAtZSAncyUuKi9mbG9wcHkvWzAtOV0qJCUlJyBcCisJCQkJICAtZSAncyUuKi9cKGRpc2NcfHBhcnRcKFswLTldKlwpXCkkJVwyJScgXAorCQkJCSAgLWUgJ3MlLipjWzAtN11kWzAtOV0qcCUlJ2AKKwk7OworICAgIGdudSopCisJdG1wX2Rpc2s9YGVjaG8gIiQxIiB8IHNlZCAncyVcKFtzaF1kWzAtOV0qXCkuKiVcMSUnYAorCXRtcF9wYXJ0PWBlY2hvICIkMSIgfCBzZWQgInMlJHRtcF9kaXNrJSUiYCA7OworICAgIGZyZWVic2QqIHwga2ZyZWVic2QqLWdudSkKKwl0bXBfZGlzaz1gZWNobyAiJDEiIHwgc2VkICdzJXJcezAsMVx9XChbc2F3XWRbMC05XSpcKS4qJCVyXDElJyBcCisJCQkgICAgfCBzZWQgJ3Mlclx7MCwxXH1cKGRhWzAtOV0qXCkuKiQlclwxJSdgCisJdG1wX3BhcnQ9YGVjaG8gIiQxIiBcCisJICAgIHwgc2VkICJzJS4qL3JcezAsMVx9W3Nhd11kWzAtOV1cKHNbMC05XSpbYS1oXVwpJVwxJSIgXAorICAgICAgIAkgICAgfCBzZWQgInMlLiovclx7MCwxXH1kYVswLTldXChzWzAtOV0qW2EtaF1cKSVcMSUiYAorCTs7CisgICAgbmV0YnNkKiB8IGtuZXRic2QqLWdudSkKKwl0bXBfZGlzaz1gZWNobyAiJDEiIHwgc2VkICdzJXJcezAsMVx9XChbc3ddZFswLTldKlwpLiokJXJcMWQlJyBcCisJICAgIHwgc2VkICdzJXJcezAsMVx9XChmZFswLTldKlwpLiokJXJcMWElJ2AKKwl0bXBfcGFydD1gZWNobyAiJDEiIFwKKwkgICAgfCBzZWQgInMlLiovclx7MCwxXH1bc3ddZFswLTldXChbYWJlLXBdXCklXDElImAKKwk7OworICAgICopCisJZWNobyAiZ3J1Yi1pbnN0YWxsIGRvZXMgbm90IHN1cHBvcnQgeW91ciBPUyB5ZXQuIiAxPiYyCisJZXhpdCAxIDs7CisgICAgZXNhYworCisgICAgIyBHZXQgdGhlIGRyaXZlIG5hbWUuCisgICAgdG1wX2RyaXZlPWBncmVwIC12ICdeIycgJGRldmljZV9tYXAgfCBncmVwICIkdG1wX2Rpc2sgKiQiIFwKKwl8IHNlZCAncyUuKlwoKFtoZl1kWzAtOV1bYS1nMC05LF0qKVwpLiolXDElJ2AKKworICAgICMgSWYgbm90IGZvdW5kLCBwcmludCBhbiBlcnJvciBtZXNzYWdlIGFuZCBleGl0LgorICAgIGlmIHRlc3QgIngkdG1wX2RyaXZlIiA9IHg7IHRoZW4KKwllY2hvICIkMSBkb2VzIG5vdCBoYXZlIGFueSBjb3JyZXNwb25kaW5nIEJJT1MgZHJpdmUuIiAxPiYyCisJZXhpdCAxCisgICAgZmkKKworICAgIGlmIHRlc3QgIngkdG1wX3BhcnQiICE9IHg7IHRoZW4KKwkjIElmIGEgcGFydGl0aW9uIGlzIHNwZWNpZmllZCwgd2UgbmVlZCB0byB0cmFuc2xhdGUgaXQgaW50byB0aGUKKwkjIEdSVUIncyBzeW50YXguCisJY2FzZSAiJGhvc3Rfb3MiIGluCisJbGludXgqKQorCSAgICBlY2hvICIkdG1wX2RyaXZlIiB8IHNlZCAicyUpJCUsYGV4cHIgJHRtcF9wYXJ0IC0gMWApJSIgOzsKKwlnbnUqKQorCSAgICBpZiBlY2hvICR0bXBfcGFydCB8IGdyZXAgIl5zIiA+L2Rldi9udWxsOyB0aGVuCisJCXRtcF9wY19zbGljZT1gZWNobyAkdG1wX3BhcnQgXAorCQkgICAgfCBzZWQgInMlc1woWzAtOV0qXClbYS1nXSokJVwxJSJgCisJCXRtcF9kcml2ZT1gZWNobyAiJHRtcF9kcml2ZSIgXAorCQkgICAgfCBzZWQgInMlKSUsXGBleHByICIkdG1wX3BjX3NsaWNlIiAtIDFcYCklImAKKwkgICAgZmkKKwkgICAgaWYgZWNobyAkdG1wX3BhcnQgfCBncmVwICJbYS1nXSQiID4vZGV2L251bGw7IHRoZW4KKwkJdG1wX2JzZF9wYXJ0aXRpb249YGVjaG8gIiR0bXBfcGFydCIgXAorCQkgICAgfCBzZWQgInMlW15hLWddKlwoW2EtZ11cKSQlXDElImAKKwkJdG1wX2RyaXZlPWBlY2hvICIkdG1wX2RyaXZlIiBcCisJCSAgICB8IHNlZCAicyUpJSwkdG1wX2JzZF9wYXJ0aXRpb24pJSJgCisJICAgIGZpCisJICAgIGVjaG8gIiR0bXBfZHJpdmUiIDs7CisJZnJlZWJzZCogfCBrZnJlZWJzZCotZ251KQorCSAgICBpZiBlY2hvICR0bXBfcGFydCB8IGdyZXAgIl5zIiA+L2Rldi9udWxsOyB0aGVuCisJCXRtcF9wY19zbGljZT1gZWNobyAkdG1wX3BhcnQgXAorCQkgICAgfCBzZWQgInMlc1woWzAtOV0qXClbYS1oXSokJVwxJSJgCisJCXRtcF9kcml2ZT1gZWNobyAiJHRtcF9kcml2ZSIgXAorCQkgICAgfCBzZWQgInMlKSUsXGBleHByICIkdG1wX3BjX3NsaWNlIiAtIDFcYCklImAKKwkgICAgZmkKKwkgICAgaWYgZWNobyAkdG1wX3BhcnQgfCBncmVwICJbYS1oXSQiID4vZGV2L251bGw7IHRoZW4KKwkJdG1wX2JzZF9wYXJ0aXRpb249YGVjaG8gIiR0bXBfcGFydCIgXAorCQkgICAgfCBzZWQgInMlc1x7MCwxXH1bMC05XSpcKFthLWhdXCkkJVwxJSJgCisJCXRtcF9kcml2ZT1gZWNobyAiJHRtcF9kcml2ZSIgXAorCQkgICAgfCBzZWQgInMlKSUsJHRtcF9ic2RfcGFydGl0aW9uKSUiYAorCSAgICBmaQorCSAgICBlY2hvICIkdG1wX2RyaXZlIiA7OworCW5ldGJzZCogfCBrbmV0YnNkKi1nbnUpCisJICAgIGlmIGVjaG8gJHRtcF9wYXJ0IHwgZ3JlcCAiXlthYmUtcF0kIiA+L2Rldi9udWxsOyB0aGVuCisJCXRtcF9ic2RfcGFydGl0aW9uPWBlY2hvICIkdG1wX3BhcnQiIFwKKwkJICAgIHwgc2VkICJzJVwoW2EtcF1cKSQlXDElImAKKwkJdG1wX2RyaXZlPWBlY2hvICIkdG1wX2RyaXZlIiBcCisJCSAgICB8IHNlZCAicyUpJSwkdG1wX2JzZF9wYXJ0aXRpb24pJSJgCisJICAgIGZpCisJICAgIGVjaG8gIiR0bXBfZHJpdmUiIDs7CisJZXNhYworICAgIGVsc2UKKwkjIElmIG5vIHBhcnRpdGlvbiBpcyBzcGVjaWZpZWQsIGp1c3QgcHJpbnQgdGhlIGRyaXZlIG5hbWUuCisJZWNobyAiJHRtcF9kcml2ZSIKKyAgICBmaQorfQorCisjIFVzYWdlOiByZXNvbHZlX3N5bWxpbmsgZmlsZQorIyBGaW5kIHRoZSByZWFsIGZpbGUvZGV2aWNlIHRoYXQgZmlsZSBwb2ludHMgYXQKK3Jlc29sdmVfc3ltbGluayAoKSB7CisJdG1wX2ZuYW1lPSQxCisJIyBSZXNvbHZlIHN5bWxpbmtzCisJd2hpbGUgdGVzdCAtTCAkdG1wX2ZuYW1lOyBkbworCQl0bXBfbmV3X2ZuYW1lPWBscyAtYWwgJHRtcF9mbmFtZSB8IHNlZCAtbiAncyUuKi0+IFwoLipcKSVcMSVwJ2AKKwkJaWYgdGVzdCAteiAiJHRtcF9uZXdfZm5hbWUiOyB0aGVuCisJCQllY2hvICJVbnJlY29nbml6ZWQgbHMgb3V0cHV0IiAyPiYxCisJCQlleGl0IDEKKwkJZmkKKworCQkjIENvbnZlcnQgcmVsYXRpdmUgc3ltbGlua3MKKwkJY2FzZSAkdG1wX25ld19mbmFtZSBpbgorCQkJLyopIHRtcF9mbmFtZT0iJHRtcF9uZXdfZm5hbWUiCisJCQk7OworCQkJKikgdG1wX2ZuYW1lPSJgZWNobyAkdG1wX2ZuYW1lIHwgc2VkICdzJS9bXi9dKiQlJSdgLyR0bXBfbmV3X2ZuYW1lIgorCQkJOzsKKwkJZXNhYworCWRvbmUKKwllY2hvICIkdG1wX2ZuYW1lIgorfQorCisjIFVzYWdlOiBmaW5kX2RldmljZSBmaWxlCisjIEZpbmQgYmxvY2sgZGV2aWNlIG9uIHdoaWNoIHRoZSBmaWxlIHJlc2lkZXMuCitmaW5kX2RldmljZSAoKSB7CisgICAgIyBGb3Igbm93LCB0aGlzIHVzZXMgdGhlIHByb2dyYW0gYGRmJyB0byBnZXQgdGhlIGRldmljZSBuYW1lLCBidXQgaXMKKyAgICAjIHRoaXMgcmVhbGx5IHBvcnRhYmxlPworICAgIHRtcF9mbmFtZT1gZGYgJDEvIHwgc2VkIC1uICdzJS4qXCgvZGV2L1teIAldKlwpLiolXDElcCdgCisKKyAgICBpZiB0ZXN0IC16ICIkdG1wX2ZuYW1lIjsgdGhlbgorCWVjaG8gIkNvdWxkIG5vdCBmaW5kIGRldmljZSBmb3IgJDEiIDI+JjEKKwlleGl0IDEKKyAgICBmaQorCisJdG1wX2ZuYW1lPWByZXNvbHZlX3N5bWxpbmsgJHRtcF9mbmFtZWAKKworICAgIGVjaG8gIiR0bXBfZm5hbWUiCit9CisKKyMgQ2hlY2sgdGhlIGFyZ3VtZW50cy4KK2ZvciBvcHRpb24gaW4gIiRAIjsgZG8KKyAgICBjYXNlICIkb3B0aW9uIiBpbgorICAgIC1oIHwgLS1oZWxwKQorCXVzYWdlCisJZXhpdCAwIDs7CisgICAgLXYgfCAtLXZlcnNpb24pCisJZWNobyAiZ3J1Yi1pbnN0YWxsIChHTlUgR1JVQiAke1ZFUlNJT059KSIKKwlleGl0IDAgOzsKKyAgICAtLXJvb3QtZGlyZWN0b3J5PSopCisJcm9vdGRpcj1gZWNobyAiJG9wdGlvbiIgfCBzZWQgJ3MvLS1yb290LWRpcmVjdG9yeT0vLydgIDs7CisgICAgLS1ncnViLXNoZWxsPSopCisJZ3J1Yl9zaGVsbD1gZWNobyAiJG9wdGlvbiIgfCBzZWQgJ3MvLS1ncnViLXNoZWxsPS8vJ2AgOzsKKyAgICAtLW5vLWZsb3BweSkKKwlub19mbG9wcHk9Ii0tbm8tZmxvcHB5IiA7OworICAgIC0tZm9yY2UtbGJhKQorCWZvcmNlX2xiYT0iLS1mb3JjZS1sYmEiIDs7CisgICAgLS1yZWNoZWNrKQorCXJlY2hlY2s9eWVzIDs7CisgICAgIyBUaGlzIGlzIGFuIHVuZG9jdW1lbnRlZCBmZWF0dXJlLi4uCisgICAgLS1kZWJ1ZykKKwlkZWJ1Zz15ZXMgOzsKKyAgICAtKikKKwllY2hvICJVbnJlY29nbml6ZWQgb3B0aW9uIFxgJG9wdGlvbiciIDE+JjIKKwl1c2FnZQorCWV4aXQgMQorCTs7CisgICAgKikKKwlpZiB0ZXN0ICJ4JGluc3RhbGxfZGV2aWNlIiAhPSB4OyB0aGVuCisJICAgIGVjaG8gIk1vcmUgdGhhbiBvbmUgaW5zdGFsbF9kZXZpY2VzPyIgMT4mMgorCSAgICB1c2FnZQorCSAgICBleGl0IDEKKwlmaQorCWluc3RhbGxfZGV2aWNlPSIke29wdGlvbn0iIDs7CisgICAgZXNhYworZG9uZQorCitpZiB0ZXN0ICJ4JGluc3RhbGxfZGV2aWNlIiA9IHg7IHRoZW4KKyAgICBlY2hvICJpbnN0YWxsX2RldmljZSBub3Qgc3BlY2lmaWVkLiIgMT4mMgorICAgIHVzYWdlCisgICAgZXhpdCAxCitmaQorCisjIElmIHRoZSBkZWJ1Z2dpbmcgZmVhdHVyZSBpcyBlbmFibGVkLCBwcmludCBjb21tYW5kcy4KK2lmIHRlc3QgJGRlYnVnID0geWVzOyB0aGVuCisgICAgc2V0IC14CitmaQorCisjIEluaXRpYWxpemUgdGhlc2UgZGlyZWN0b3JpZXMgaGVyZSwgc2luY2UgUk9PVERJUiB3YXMgaW5pdGlhbGl6ZWQuCitjYXNlICIkaG9zdF9vcyIgaW4KK25ldGJzZCogfCBvcGVuYnNkKikKKyAgICAjIEJlY2F1c2UgL2Jvb3QgaXMgdXNlZCBmb3IgdGhlIGJvb3QgYmxvY2sgaW4gTmV0QlNEIGFuZCBPcGVuQlNELCB1c2UgL2dydWIKKyAgICAjIGluc3RlYWQgb2YgL2Jvb3QvZ3J1Yi4KKyAgICBncnViX3ByZWZpeD0vZ3J1YgorICAgIGJvb3RkaXI9JHtyb290ZGlyfQorICAgIDs7CisqKQorICAgICMgVXNlIC9ib290L2dydWIgYnkgZGVmYXVsdC4KKyAgICBib290ZGlyPSR7cm9vdGRpcn0vYm9vdAorICAgIDs7Citlc2FjCisKK2dydWJkaXI9JHtib290ZGlyfS9ncnViCitkZXZpY2VfbWFwPSR7Z3J1YmRpcn0vZGV2aWNlLm1hcAorCisjIENoZWNrIGlmIEdSVUIgaXMgaW5zdGFsbGVkLgorIyBUaGlzIGlzIG5lY2Vzc2FyeSwgYmVjYXVzZSB0aGUgdXNlciBjYW4gc3BlY2lmeSAiZ3J1YiAtLXJlYWQtb25seSIuCitzZXQgJGdydWJfc2hlbGwgZHVtbXkKK2lmIHRlc3QgLWYgIiQxIjsgdGhlbgorICAgIDoKK2Vsc2UKKyAgICBlY2hvICIkMTogTm90IGZvdW5kLiIgMT4mMgorICAgIGV4aXQgMQorZmkKKworaWYgdGVzdCAtZiAiJHBrZ2xpYmRpci9zdGFnZTEiOyB0aGVuCisgICAgOgorZWxzZQorICAgIGVjaG8gIiR7cGtnbGliZGlyfS9zdGFnZTE6IE5vdCBmb3VuZC4iIDE+JjIKKyAgICBleGl0IDEKK2ZpCisKK2lmIHRlc3QgLWYgIiRwa2dsaWJkaXIvc3RhZ2UyIjsgdGhlbgorICAgIDoKK2Vsc2UKKyAgICBlY2hvICIke3BrZ2xpYmRpcn0vc3RhZ2UyOiBOb3QgZm91bmQuIiAxPiYyCisgICAgZXhpdCAxCitmaQorCisjIERvbid0IGNoZWNrIGZvciAqc3RhZ2UxXzUsIGJlY2F1c2UgaXQgaXMgbm90IGZhdGFsIGV2ZW4gaWYgYW55CisjIFN0YWdlIDEuNSBkb2VzIG5vdCBleGlzdC4KKworIyBDcmVhdGUgdGhlIEdSVUIgZGlyZWN0b3J5IGlmIGl0IGlzIG5vdCBwcmVzZW50LgordGVzdCAtZCAiJGJvb3RkaXIiIHx8IG1rZGlyICIkYm9vdGRpciIgfHwgZXhpdCAxCit0ZXN0IC1kICIkZ3J1YmRpciIgfHwgbWtkaXIgIiRncnViZGlyIiB8fCBleGl0IDEKKworIyBJZiAtLXJlY2hlY2sgaXMgc3BlY2lmaWVkLCByZW1vdmUgdGhlIGRldmljZSBtYXAsIGlmIHByZXNlbnQuCitpZiB0ZXN0ICRyZWNoZWNrID0geWVzOyB0aGVuCisgICAgcm0gLWYgJGRldmljZV9tYXAKK2ZpCisKKyMgQ3JlYXRlIHRoZSBkZXZpY2UgbWFwIGZpbGUgaWYgaXQgaXMgbm90IHByZXNlbnQuCitpZiB0ZXN0IC1mICIkZGV2aWNlX21hcCI7IHRoZW4KKyAgICA6CitlbHNlCisgICAgIyBDcmVhdGUgYSBzYWZlIHRlbXBvcmFyeSBmaWxlLgorICAgIHRlc3QgLW4gIiRta2xvZyIgJiYgbG9nX2ZpbGU9YCRta2xvZ2AKKworICAgICRncnViX3NoZWxsIC0tYmF0Y2ggJG5vX2Zsb3BweSAtLWRldmljZS1tYXA9JGRldmljZV9tYXAgPDxFT0YgPiRsb2dfZmlsZQorcXVpdAorRU9GCisgICAgaWYgZ3JlcCAiRXJyb3IgWzAtOV0qOiAiICRsb2dfZmlsZSA+L2Rldi9udWxsOyB0aGVuCisJY2F0ICRsb2dfZmlsZSAxPiYyCisJZXhpdCAxCisgICAgZmkKKworICAgIHJtIC1mICRsb2dfZmlsZQorZmkKKworIyBNYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBubyBkdXBsaWNhdGVkIGVudHJ5LgordG1wPWBzZWQgLW4gJy9eKFtmaF1kWzAtOV0qKS9zL1woXiguKilcKS4qL1wxL3AnICRkZXZpY2VfbWFwIFwKKyAgICB8IHNvcnQgfCB1bmlxIC1kIHwgc2VkIC1uIDFwYAoraWYgdGVzdCAtbiAiJHRtcCI7IHRoZW4KKyAgICBlY2hvICJUaGUgZHJpdmUgJHRtcCBpcyBkZWZpbmVkIG11bHRpcGxlIHRpbWVzIGluIHRoZSBkZXZpY2UgbWFwICRkZXZpY2VfbWFwIiAxPiYyCisgICAgZXhpdCAxCitmaQorCisjIENoZWNrIGZvciBJTlNUQUxMX0RFVklDRS4KK2Nhc2UgIiRpbnN0YWxsX2RldmljZSIgaW4KKy9kZXYvKikKKyAgICBpbnN0YWxsX2RldmljZT1gcmVzb2x2ZV9zeW1saW5rICIkaW5zdGFsbF9kZXZpY2UiYAorICAgIGluc3RhbGxfZHJpdmU9YGNvbnZlcnQgIiRpbnN0YWxsX2RldmljZSJgCisgICAgIyBJIGRvbid0IGtub3cgd2h5LCBidXQgc29tZSBzaGVsbHMgd291bGRuJ3QgZGllIGlmIGV4aXQgaXMKKyAgICAjIGNhbGxlZCBpbiBhIGZ1bmN0aW9uLgorICAgIGlmIHRlc3QgIngkaW5zdGFsbF9kcml2ZSIgPSB4OyB0aGVuCisJZXhpdCAxCisgICAgZmkgOzsKK1woW2hmXWRbMC05XSpcKSkKKyAgICBpbnN0YWxsX2RyaXZlPSIkaW5zdGFsbF9kZXZpY2UiIDs7CitbaGZdZFswLTldKikKKyAgICAjIFRoZSBHUlVCIGZvcm1hdCB3aXRoIG5vIHBhcmVudGhlc2lzLgorICAgIGluc3RhbGxfZHJpdmU9IigkaW5zdGFsbF9kZXZpY2UpIiA7OworKikKKyAgICBlY2hvICJGb3JtYXQgb2YgaW5zdGFsbF9kZXZpY2Ugbm90IHJlY29nbml6ZWQuIiAxPiYyCisgICAgdXNhZ2UKKyAgICBleGl0IDEgOzsKK2VzYWMKKworIyBHZXQgdGhlIHJvb3QgZHJpdmUuCityb290X2RldmljZT1gZmluZF9kZXZpY2UgJHtyb290ZGlyfWAKK2Jvb3RkaXJfZGV2aWNlPWBmaW5kX2RldmljZSAke2Jvb3RkaXJ9YAorCisjIENoZWNrIGlmIHRoZSBib290IGRpcmVjdG9yeSBpcyBpbiB0aGUgc2FtZSBkZXZpY2UgYXMgdGhlIHJvb3QgZGlyZWN0b3J5LgoraWYgdGVzdCAieCRyb290X2RldmljZSIgIT0gIngkYm9vdGRpcl9kZXZpY2UiOyB0aGVuCisgICAgIyBQZXJoYXBzIHRoZSB1c2VyIGhhcyBhIHNlcGFyYXRlIGJvb3QgcGFydGl0aW9uLgorICAgIHJvb3RfZGV2aWNlPSRib290ZGlyX2RldmljZQorICAgIGdydWJfcHJlZml4PSIvZ3J1YiIKK2ZpCisKKyMgQ29udmVydCB0aGUgcm9vdCBkZXZpY2UgdG8gYSBHUlVCIGRyaXZlLgorcm9vdF9kcml2ZT1gY29udmVydCAiJHJvb3RfZGV2aWNlImAKK2lmIHRlc3QgIngkcm9vdF9kcml2ZSIgPSB4OyB0aGVuCisgICAgZXhpdCAxCitmaQorCisjIENoZWNrIGlmIHRoZSByb290IGRpcmVjdG9yeSBleGlzdHMgaW4gdGhlIHNhbWUgZGV2aWNlIGFzIHRoZSBncnViCisjIGRpcmVjdG9yeS4KK2dydWJkaXJfZGV2aWNlPWBmaW5kX2RldmljZSAke2dydWJkaXJ9YAorCitpZiB0ZXN0ICJ4JGdydWJkaXJfZGV2aWNlIiAhPSAieCRyb290X2RldmljZSI7IHRoZW4KKyAgICAjIEZvciBub3csIGNhbm5vdCBkZWFsIHdpdGggdGhpcyBzaXR1YXRpb24uCisgICAgY2F0IDw8RU9GIDE+JjIKK1lvdSBtdXN0IHNldCB0aGUgcm9vdCBkaXJlY3RvcnkgYnkgdGhlIG9wdGlvbiAtLXJvb3QtZGlyZWN0b3J5LCBiZWNhdXNlCiskZ3J1YmRpciBkb2VzIG5vdCBleGlzdCBpbiB0aGUgcm9vdCBkZXZpY2UgJHJvb3RfZGV2aWNlLgorRU9GCisgICAgZXhpdCAxCitmaQorCisjIENvcHkgdGhlIEdSVUIgaW1hZ2VzIHRvIHRoZSBHUlVCIGRpcmVjdG9yeS4KK2ZvciBmaWxlIGluICR7Z3J1YmRpcn0vc3RhZ2UxICR7Z3J1YmRpcn0vc3RhZ2UyICR7Z3J1YmRpcn0vKnN0YWdlMV81OyBkbworICAgIHJtIC1mICRmaWxlIHx8IGV4aXQgMQorZG9uZQorZm9yIGZpbGUgaW4gXAorICAgICR7cGtnbGliZGlyfS9zdGFnZTEgJHtwa2dsaWJkaXJ9L3N0YWdlMiAke3BrZ2xpYmRpcn0vKnN0YWdlMV81OyBkbworICAgIGNwIC1mICRmaWxlICR7Z3J1YmRpcn0gfHwgZXhpdCAxCitkb25lCisKKyMgTWFrZSBhIGRlZmF1bHQgZmlsZS4KKyR7Z3J1Yl9zZXRfZGVmYXVsdH0gLS1yb290LWRpcmVjdG9yeT0ke3Jvb3RkaXJ9IGRlZmF1bHQKKworIyBNYWtlIHN1cmUgdGhhdCBHUlVCIHJlYWRzIHRoZSBzYW1lIGltYWdlcyBhcyB0aGUgaG9zdCBPUy4KK3Rlc3QgLW4gIiRta2ltZyIgJiYgaW1nX2ZpbGU9YCRta2ltZ2AKK3Rlc3QgLW4gIiRta2xvZyIgJiYgbG9nX2ZpbGU9YCRta2xvZ2AKKworZm9yIGZpbGUgaW4gJHtncnViZGlyfS9zdGFnZTEgJHtncnViZGlyfS9zdGFnZTIgJHtncnViZGlyfS8qc3RhZ2UxXzU7IGRvCisgICAgY291bnQ9NQorICAgIHRtcD1gZWNobyAkZmlsZSB8IHNlZCAic3xeJHtncnViZGlyfXwke2dydWJfcHJlZml4fXwiYAorICAgIHdoaWxlIHRlc3QgJGNvdW50IC1ndCAwOyBkbworCSRncnViX3NoZWxsIC0tYmF0Y2ggJG5vX2Zsb3BweSAtLWRldmljZS1tYXA9JGRldmljZV9tYXAgPDxFT0YgPiRsb2dfZmlsZQorZHVtcCAke3Jvb3RfZHJpdmV9JHt0bXB9ICR7aW1nX2ZpbGV9CitxdWl0CitFT0YKKwlpZiBncmVwICJFcnJvciBbMC05XSo6ICIgJGxvZ19maWxlID4vZGV2L251bGw7IHRoZW4KKwkgICAgOgorCWVsaWYgY21wICRmaWxlICRpbWdfZmlsZSA+L2Rldi9udWxsOyB0aGVuCisJICAgIGJyZWFrCisJZmkKKwlzbGVlcCAxCisJY291bnQ9YGV4cHIgJGNvdW50IC0gMWAgICAgCisgICAgZG9uZQorICAgIGlmIHRlc3QgJGNvdW50IC1lcSAwOyB0aGVuCisJZWNobyAiVGhlIGZpbGUgJGZpbGUgbm90IHJlYWQgY29ycmVjdGx5LiIgMT4mMgorCWV4aXQgMQorICAgIGZpCitkb25lCisKK3JtIC1mICRpbWdfZmlsZQorcm0gLWYgJGxvZ19maWxlCisKKyMgQ3JlYXRlIGEgc2FmZSB0ZW1wb3JhcnkgZmlsZS4KK3Rlc3QgLW4gIiRta2xvZyIgJiYgbG9nX2ZpbGU9YCRta2xvZ2AKKworIyBOb3cgcGVyZm9ybSB0aGUgaW5zdGFsbGF0aW9uLgorJGdydWJfc2hlbGwgLS1iYXRjaCAkbm9fZmxvcHB5IC0tZGV2aWNlLW1hcD0kZGV2aWNlX21hcCA8PEVPRiA+JGxvZ19maWxlCityb290ICRyb290X2RyaXZlCitzZXR1cCAkZm9yY2VfbGJhIC0tc3RhZ2UyPSRncnViZGlyL3N0YWdlMiAtLXByZWZpeD0kZ3J1Yl9wcmVmaXggJGluc3RhbGxfZHJpdmUKK3F1aXQKK0VPRgorCitpZiBncmVwICJFcnJvciBbMC05XSo6ICIgJGxvZ19maWxlID4vZGV2L251bGwgfHwgdGVzdCAkZGVidWcgPSB5ZXM7IHRoZW4KKyAgICBjYXQgJGxvZ19maWxlIDE+JjIKKyAgICBleGl0IDEKK2ZpCisKK3JtIC1mICRsb2dfZmlsZQorCisjIFByb21wdCB0aGUgdXNlciB0byBjaGVjayBpZiB0aGUgZGV2aWNlIG1hcCBpcyBjb3JyZWN0LgorZWNobyAiSW5zdGFsbGF0aW9uIGZpbmlzaGVkLiBObyBlcnJvciByZXBvcnRlZC4iCitlY2hvICJUaGlzIGlzIHRoZSBjb250ZW50cyBvZiB0aGUgZGV2aWNlIG1hcCAkZGV2aWNlX21hcC4iCitlY2hvICJDaGVjayBpZiB0aGlzIGlzIGNvcnJlY3Qgb3Igbm90LiBJZiBhbnkgb2YgdGhlIGxpbmVzIGlzIGluY29ycmVjdCwiCitlY2hvICJmaXggaXQgYW5kIHJlLXJ1biB0aGUgc2NyaXB0IFxgZ3J1Yi1pbnN0YWxsJy4iCitlY2hvCisKK2NhdCAkZGV2aWNlX21hcAorCisjIEJ5ZS4KK2V4aXQgMApkaWZmIC0tZ2l0IGEvdXRpbC9ncnViLWluc3RhbGwuaW4gYi91dGlsL2dydWItaW5zdGFsbC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTU5OGIwCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9ncnViLWluc3RhbGwuaW4KQEAgLTAsMCArMSw0NzcgQEAKKyMhIC9iaW4vc2gKKworIyBJbnN0YWxsIEdSVUIgb24geW91ciBkcml2ZS4KKyMgICBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwMywyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMuCitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK3NiaW5kaXI9QHNiaW5kaXJACitsaWJkaXI9QGxpYmRpckAKK1BBQ0tBR0U9QFBBQ0tBR0VACitWRVJTSU9OPUBWRVJTSU9OQAoraG9zdF9jcHU9QGhvc3RfY3B1QAoraG9zdF9vcz1AaG9zdF9vc0AKK2hvc3RfdmVuZG9yPUBob3N0X3ZlbmRvckAKK3BrZ2xpYmRpcj0ke2xpYmRpcn0vJHtQQUNLQUdFfS8ke2hvc3RfY3B1fS0ke2hvc3RfdmVuZG9yfQorCitncnViX3NoZWxsPSR7c2JpbmRpcn0vZ3J1YgorZ3J1Yl9zZXRfZGVmYXVsdD0ke3NiaW5kaXJ9L2dydWItc2V0LWRlZmF1bHQKK2xvZ19maWxlPS90bXAvZ3J1Yi1pbnN0YWxsLmxvZy4kJAoraW1nX2ZpbGU9L3RtcC9ncnViLWluc3RhbGwuaW1nLiQkCityb290ZGlyPQorZ3J1Yl9wcmVmaXg9L2Jvb3QvZ3J1YgorCitpbnN0YWxsX2RldmljZT0KK25vX2Zsb3BweT0KK2ZvcmNlX2xiYT0KK3JlY2hlY2s9bm8KK2RlYnVnPW5vCisKKyMgbG9vayBmb3Igc2VjdXJlIHRlbXBmaWxlIGNyZWF0aW9uIHdyYXBwZXJzIG9uIHRoaXMgcGxhdGZvcm0KK2lmIHRlc3QgLXggL2Jpbi90ZW1wZmlsZTsgdGhlbgorICAgIG1rbG9nPSIvYmluL3RlbXBmaWxlIC0tcHJlZml4PWdydWIiCisgICAgbWtpbWc9Ii9iaW4vdGVtcGZpbGUgLS1wcmVmaXg9Z3J1YiIKK2VsaWYgdGVzdCAteCAvYmluL21rdGVtcDsgdGhlbgorICAgIG1rbG9nPSIvYmluL21rdGVtcCAvdG1wL2dydWItaW5zdGFsbC5sb2cuWFhYWFhYIgorICAgIG1raW1nPSIvYmluL21rdGVtcCAvdG1wL2dydWItaW5zdGFsbC5pbWcuWFhYWFhYIgorZWxzZQorICAgIG1rbG9nPSIiCisgICAgbWtpbWc9IiIKK2ZpCisKKyMgVXNhZ2U6IHVzYWdlCisjIFByaW50IHRoZSB1c2FnZS4KK3VzYWdlICgpIHsKKyAgICBjYXQgPDxFT0YKK1VzYWdlOiBncnViLWluc3RhbGwgW09QVElPTl0gaW5zdGFsbF9kZXZpY2UKK0luc3RhbGwgR1JVQiBvbiB5b3VyIGRyaXZlLgorCisgIC1oLCAtLWhlbHAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZSBhbmQgZXhpdAorICAtdiwgLS12ZXJzaW9uICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorICAtLXJvb3QtZGlyZWN0b3J5PURJUiAgICBpbnN0YWxsIEdSVUIgaW1hZ2VzIHVuZGVyIHRoZSBkaXJlY3RvcnkgRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgdGhlIHJvb3QgZGlyZWN0b3J5CisgIC0tZ3J1Yi1zaGVsbD1GSUxFICAgICAgIHVzZSBGSUxFIGFzIHRoZSBncnViIHNoZWxsCisgIC0tbm8tZmxvcHB5ICAgICAgICAgICAgIGRvIG5vdCBwcm9iZSBhbnkgZmxvcHB5IGRyaXZlCisgIC0tZm9yY2UtbGJhICAgICAgICAgICAgIGZvcmNlIEdSVUIgdG8gdXNlIExCQSBtb2RlIGV2ZW4gZm9yIGEgYnVnZ3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQklPUworICAtLXJlY2hlY2sgICAgICAgICAgICAgICBwcm9iZSBhIGRldmljZSBtYXAgZXZlbiBpZiBpdCBhbHJlYWR5IGV4aXN0cworCitJTlNUQUxMX0RFVklDRSBjYW4gYmUgYSBHUlVCIGRldmljZSBuYW1lIG9yIGEgc3lzdGVtIGRldmljZSBmaWxlbmFtZS4KKworZ3J1Yi1pbnN0YWxsIGNvcGllcyBHUlVCIGltYWdlcyBpbnRvIHRoZSBESVIvYm9vdCBkaXJlY3Rvcnkgc3BlY2ZpZWQgYnkKKy0tcm9vdC1kaXJlY3RvcnksIGFuZCB1c2VzIHRoZSBncnViIHNoZWxsIHRvIGluc3RhbGwgZ3J1YiBpbnRvIHRoZSBib290CitzZWN0b3IuCisKK1JlcG9ydCBidWdzIHRvIDxidWctZ3J1YkBnbnUub3JnPi4KK0VPRgorfQorCisjIFVzYWdlOiBjb252ZXJ0IG9zX2RldmljZQorIyBDb252ZXJ0IGFuIE9TIGRldmljZSB0byB0aGUgY29ycmVzcG9uZGluZyBHUlVCIGRyaXZlLgorIyBUaGlzIHBhcnQgaXMgT1Mtc3BlY2lmaWMuCitjb252ZXJ0ICgpIHsKKyAgICAjIEZpcnN0LCBjaGVjayBpZiB0aGUgZGV2aWNlIGZpbGUgZXhpc3RzLgorICAgIGlmIHRlc3QgLWUgIiQxIjsgdGhlbgorCToKKyAgICBlbHNlCisJZWNobyAiJDE6IE5vdCBmb3VuZCBvciBub3QgYSBibG9jayBkZXZpY2UuIiAxPiYyCisJZXhpdCAxCisgICAgZmkKKworICAgICMgQnJlYWsgdGhlIGRldmljZSBuYW1lIGludG8gdGhlIGRpc2sgcGFydCBhbmQgdGhlIHBhcnRpdGlvbiBwYXJ0LgorICAgIGNhc2UgIiRob3N0X29zIiBpbgorICAgIGxpbnV4KikKKwl0bXBfZGlzaz1gZWNobyAiJDEiIHwgc2VkIC1lICdzJVwoW3NoXWRbYS16XVwpWzAtOV0qJCVcMSUnIFwKKwkJCQkgIC1lICdzJVwoZFswLTldKlwpcFswLTldKiQlXDElJyBcCisJCQkJICAtZSAncyVcKGZkWzAtOV0qXCkkJVwxJScgXAorCQkJCSAgLWUgJ3MlL3BhcnRbMC05XSokJS9kaXNjJScgXAorCQkJCSAgLWUgJ3MlXChjWzAtN11kWzAtOV0qXCkuKiQlXDElJ2AKKwl0bXBfcGFydD1gZWNobyAiJDEiIHwgc2VkIC1lICdzJS4qL1tzaF1kW2Etel1cKFswLTldKlwpJCVcMSUnIFwKKwkJCQkgIC1lICdzJS4qZFswLTldKnAlJScgXAorCQkJCSAgLWUgJ3MlLiovZmRbMC05XSokJSUnIFwKKwkJCQkgIC1lICdzJS4qL2Zsb3BweS9bMC05XSokJSUnIFwKKwkJCQkgIC1lICdzJS4qL1woZGlzY1x8cGFydFwoWzAtOV0qXClcKSQlXDIlJyBcCisJCQkJICAtZSAncyUuKmNbMC03XWRbMC05XSpwJSUnYAorCTs7CisgICAgZ251KikKKwl0bXBfZGlzaz1gZWNobyAiJDEiIHwgc2VkICdzJVwoW3NoXWRbMC05XSpcKS4qJVwxJSdgCisJdG1wX3BhcnQ9YGVjaG8gIiQxIiB8IHNlZCAicyUkdG1wX2Rpc2slJSJgIDs7CisgICAgZnJlZWJzZCogfCBrZnJlZWJzZCotZ251KQorCXRtcF9kaXNrPWBlY2hvICIkMSIgfCBzZWQgJ3Mlclx7MCwxXH1cKFtzYXddZFswLTldKlwpLiokJXJcMSUnIFwKKwkJCSAgICB8IHNlZCAncyVyXHswLDFcfVwoZGFbMC05XSpcKS4qJCVyXDElJ2AKKwl0bXBfcGFydD1gZWNobyAiJDEiIFwKKwkgICAgfCBzZWQgInMlLiovclx7MCwxXH1bc2F3XWRbMC05XVwoc1swLTldKlthLWhdXCklXDElIiBcCisgICAgICAgCSAgICB8IHNlZCAicyUuKi9yXHswLDFcfWRhWzAtOV1cKHNbMC05XSpbYS1oXVwpJVwxJSJgCisJOzsKKyAgICBuZXRic2QqIHwga25ldGJzZCotZ251KQorCXRtcF9kaXNrPWBlY2hvICIkMSIgfCBzZWQgJ3Mlclx7MCwxXH1cKFtzd11kWzAtOV0qXCkuKiQlclwxZCUnIFwKKwkgICAgfCBzZWQgJ3Mlclx7MCwxXH1cKGZkWzAtOV0qXCkuKiQlclwxYSUnYAorCXRtcF9wYXJ0PWBlY2hvICIkMSIgXAorCSAgICB8IHNlZCAicyUuKi9yXHswLDFcfVtzd11kWzAtOV1cKFthYmUtcF1cKSVcMSUiYAorCTs7CisgICAgKikKKwllY2hvICJncnViLWluc3RhbGwgZG9lcyBub3Qgc3VwcG9ydCB5b3VyIE9TIHlldC4iIDE+JjIKKwlleGl0IDEgOzsKKyAgICBlc2FjCisKKyAgICAjIEdldCB0aGUgZHJpdmUgbmFtZS4KKyAgICB0bXBfZHJpdmU9YGdyZXAgLXYgJ14jJyAkZGV2aWNlX21hcCB8IGdyZXAgIiR0bXBfZGlzayAqJCIgXAorCXwgc2VkICdzJS4qXCgoW2hmXWRbMC05XVthLWcwLTksXSopXCkuKiVcMSUnYAorCisgICAgIyBJZiBub3QgZm91bmQsIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQuCisgICAgaWYgdGVzdCAieCR0bXBfZHJpdmUiID0geDsgdGhlbgorCWVjaG8gIiQxIGRvZXMgbm90IGhhdmUgYW55IGNvcnJlc3BvbmRpbmcgQklPUyBkcml2ZS4iIDE+JjIKKwlleGl0IDEKKyAgICBmaQorCisgICAgaWYgdGVzdCAieCR0bXBfcGFydCIgIT0geDsgdGhlbgorCSMgSWYgYSBwYXJ0aXRpb24gaXMgc3BlY2lmaWVkLCB3ZSBuZWVkIHRvIHRyYW5zbGF0ZSBpdCBpbnRvIHRoZQorCSMgR1JVQidzIHN5bnRheC4KKwljYXNlICIkaG9zdF9vcyIgaW4KKwlsaW51eCopCisJICAgIGVjaG8gIiR0bXBfZHJpdmUiIHwgc2VkICJzJSkkJSxgZXhwciAkdG1wX3BhcnQgLSAxYCklIiA7OworCWdudSopCisJICAgIGlmIGVjaG8gJHRtcF9wYXJ0IHwgZ3JlcCAiXnMiID4vZGV2L251bGw7IHRoZW4KKwkJdG1wX3BjX3NsaWNlPWBlY2hvICR0bXBfcGFydCBcCisJCSAgICB8IHNlZCAicyVzXChbMC05XSpcKVthLWddKiQlXDElImAKKwkJdG1wX2RyaXZlPWBlY2hvICIkdG1wX2RyaXZlIiBcCisJCSAgICB8IHNlZCAicyUpJSxcYGV4cHIgIiR0bXBfcGNfc2xpY2UiIC0gMVxgKSUiYAorCSAgICBmaQorCSAgICBpZiBlY2hvICR0bXBfcGFydCB8IGdyZXAgIlthLWddJCIgPi9kZXYvbnVsbDsgdGhlbgorCQl0bXBfYnNkX3BhcnRpdGlvbj1gZWNobyAiJHRtcF9wYXJ0IiBcCisJCSAgICB8IHNlZCAicyVbXmEtZ10qXChbYS1nXVwpJCVcMSUiYAorCQl0bXBfZHJpdmU9YGVjaG8gIiR0bXBfZHJpdmUiIFwKKwkJICAgIHwgc2VkICJzJSklLCR0bXBfYnNkX3BhcnRpdGlvbiklImAKKwkgICAgZmkKKwkgICAgZWNobyAiJHRtcF9kcml2ZSIgOzsKKwlmcmVlYnNkKiB8IGtmcmVlYnNkKi1nbnUpCisJICAgIGlmIGVjaG8gJHRtcF9wYXJ0IHwgZ3JlcCAiXnMiID4vZGV2L251bGw7IHRoZW4KKwkJdG1wX3BjX3NsaWNlPWBlY2hvICR0bXBfcGFydCBcCisJCSAgICB8IHNlZCAicyVzXChbMC05XSpcKVthLWhdKiQlXDElImAKKwkJdG1wX2RyaXZlPWBlY2hvICIkdG1wX2RyaXZlIiBcCisJCSAgICB8IHNlZCAicyUpJSxcYGV4cHIgIiR0bXBfcGNfc2xpY2UiIC0gMVxgKSUiYAorCSAgICBmaQorCSAgICBpZiBlY2hvICR0bXBfcGFydCB8IGdyZXAgIlthLWhdJCIgPi9kZXYvbnVsbDsgdGhlbgorCQl0bXBfYnNkX3BhcnRpdGlvbj1gZWNobyAiJHRtcF9wYXJ0IiBcCisJCSAgICB8IHNlZCAicyVzXHswLDFcfVswLTldKlwoW2EtaF1cKSQlXDElImAKKwkJdG1wX2RyaXZlPWBlY2hvICIkdG1wX2RyaXZlIiBcCisJCSAgICB8IHNlZCAicyUpJSwkdG1wX2JzZF9wYXJ0aXRpb24pJSJgCisJICAgIGZpCisJICAgIGVjaG8gIiR0bXBfZHJpdmUiIDs7CisJbmV0YnNkKiB8IGtuZXRic2QqLWdudSkKKwkgICAgaWYgZWNobyAkdG1wX3BhcnQgfCBncmVwICJeW2FiZS1wXSQiID4vZGV2L251bGw7IHRoZW4KKwkJdG1wX2JzZF9wYXJ0aXRpb249YGVjaG8gIiR0bXBfcGFydCIgXAorCQkgICAgfCBzZWQgInMlXChbYS1wXVwpJCVcMSUiYAorCQl0bXBfZHJpdmU9YGVjaG8gIiR0bXBfZHJpdmUiIFwKKwkJICAgIHwgc2VkICJzJSklLCR0bXBfYnNkX3BhcnRpdGlvbiklImAKKwkgICAgZmkKKwkgICAgZWNobyAiJHRtcF9kcml2ZSIgOzsKKwllc2FjCisgICAgZWxzZQorCSMgSWYgbm8gcGFydGl0aW9uIGlzIHNwZWNpZmllZCwganVzdCBwcmludCB0aGUgZHJpdmUgbmFtZS4KKwllY2hvICIkdG1wX2RyaXZlIgorICAgIGZpCit9CisKKyMgVXNhZ2U6IHJlc29sdmVfc3ltbGluayBmaWxlCisjIEZpbmQgdGhlIHJlYWwgZmlsZS9kZXZpY2UgdGhhdCBmaWxlIHBvaW50cyBhdAorcmVzb2x2ZV9zeW1saW5rICgpIHsKKwl0bXBfZm5hbWU9JDEKKwkjIFJlc29sdmUgc3ltbGlua3MKKwl3aGlsZSB0ZXN0IC1MICR0bXBfZm5hbWU7IGRvCisJCXRtcF9uZXdfZm5hbWU9YGxzIC1hbCAkdG1wX2ZuYW1lIHwgc2VkIC1uICdzJS4qLT4gXCguKlwpJVwxJXAnYAorCQlpZiB0ZXN0IC16ICIkdG1wX25ld19mbmFtZSI7IHRoZW4KKwkJCWVjaG8gIlVucmVjb2duaXplZCBscyBvdXRwdXQiIDI+JjEKKwkJCWV4aXQgMQorCQlmaQorCisJCSMgQ29udmVydCByZWxhdGl2ZSBzeW1saW5rcworCQljYXNlICR0bXBfbmV3X2ZuYW1lIGluCisJCQkvKikgdG1wX2ZuYW1lPSIkdG1wX25ld19mbmFtZSIKKwkJCTs7CisJCQkqKSB0bXBfZm5hbWU9ImBlY2hvICR0bXBfZm5hbWUgfCBzZWQgJ3MlL1teL10qJCUlJ2AvJHRtcF9uZXdfZm5hbWUiCisJCQk7OworCQllc2FjCisJZG9uZQorCWVjaG8gIiR0bXBfZm5hbWUiCit9CisKKyMgVXNhZ2U6IGZpbmRfZGV2aWNlIGZpbGUKKyMgRmluZCBibG9jayBkZXZpY2Ugb24gd2hpY2ggdGhlIGZpbGUgcmVzaWRlcy4KK2ZpbmRfZGV2aWNlICgpIHsKKyAgICAjIEZvciBub3csIHRoaXMgdXNlcyB0aGUgcHJvZ3JhbSBgZGYnIHRvIGdldCB0aGUgZGV2aWNlIG5hbWUsIGJ1dCBpcworICAgICMgdGhpcyByZWFsbHkgcG9ydGFibGU/CisgICAgdG1wX2ZuYW1lPWBkZiAkMS8gfCBzZWQgLW4gJ3MlLipcKC9kZXYvW14gCV0qXCkuKiVcMSVwJ2AKKworICAgIGlmIHRlc3QgLXogIiR0bXBfZm5hbWUiOyB0aGVuCisJZWNobyAiQ291bGQgbm90IGZpbmQgZGV2aWNlIGZvciAkMSIgMj4mMQorCWV4aXQgMQorICAgIGZpCisKKwl0bXBfZm5hbWU9YHJlc29sdmVfc3ltbGluayAkdG1wX2ZuYW1lYAorCisgICAgZWNobyAiJHRtcF9mbmFtZSIKK30KKworIyBDaGVjayB0aGUgYXJndW1lbnRzLgorZm9yIG9wdGlvbiBpbiAiJEAiOyBkbworICAgIGNhc2UgIiRvcHRpb24iIGluCisgICAgLWggfCAtLWhlbHApCisJdXNhZ2UKKwlleGl0IDAgOzsKKyAgICAtdiB8IC0tdmVyc2lvbikKKwllY2hvICJncnViLWluc3RhbGwgKEdOVSBHUlVCICR7VkVSU0lPTn0pIgorCWV4aXQgMCA7OworICAgIC0tcm9vdC1kaXJlY3Rvcnk9KikKKwlyb290ZGlyPWBlY2hvICIkb3B0aW9uIiB8IHNlZCAncy8tLXJvb3QtZGlyZWN0b3J5PS8vJ2AgOzsKKyAgICAtLWdydWItc2hlbGw9KikKKwlncnViX3NoZWxsPWBlY2hvICIkb3B0aW9uIiB8IHNlZCAncy8tLWdydWItc2hlbGw9Ly8nYCA7OworICAgIC0tbm8tZmxvcHB5KQorCW5vX2Zsb3BweT0iLS1uby1mbG9wcHkiIDs7CisgICAgLS1mb3JjZS1sYmEpCisJZm9yY2VfbGJhPSItLWZvcmNlLWxiYSIgOzsKKyAgICAtLXJlY2hlY2spCisJcmVjaGVjaz15ZXMgOzsKKyAgICAjIFRoaXMgaXMgYW4gdW5kb2N1bWVudGVkIGZlYXR1cmUuLi4KKyAgICAtLWRlYnVnKQorCWRlYnVnPXllcyA7OworICAgIC0qKQorCWVjaG8gIlVucmVjb2duaXplZCBvcHRpb24gXGAkb3B0aW9uJyIgMT4mMgorCXVzYWdlCisJZXhpdCAxCisJOzsKKyAgICAqKQorCWlmIHRlc3QgIngkaW5zdGFsbF9kZXZpY2UiICE9IHg7IHRoZW4KKwkgICAgZWNobyAiTW9yZSB0aGFuIG9uZSBpbnN0YWxsX2RldmljZXM/IiAxPiYyCisJICAgIHVzYWdlCisJICAgIGV4aXQgMQorCWZpCisJaW5zdGFsbF9kZXZpY2U9IiR7b3B0aW9ufSIgOzsKKyAgICBlc2FjCitkb25lCisKK2lmIHRlc3QgIngkaW5zdGFsbF9kZXZpY2UiID0geDsgdGhlbgorICAgIGVjaG8gImluc3RhbGxfZGV2aWNlIG5vdCBzcGVjaWZpZWQuIiAxPiYyCisgICAgdXNhZ2UKKyAgICBleGl0IDEKK2ZpCisKKyMgSWYgdGhlIGRlYnVnZ2luZyBmZWF0dXJlIGlzIGVuYWJsZWQsIHByaW50IGNvbW1hbmRzLgoraWYgdGVzdCAkZGVidWcgPSB5ZXM7IHRoZW4KKyAgICBzZXQgLXgKK2ZpCisKKyMgSW5pdGlhbGl6ZSB0aGVzZSBkaXJlY3RvcmllcyBoZXJlLCBzaW5jZSBST09URElSIHdhcyBpbml0aWFsaXplZC4KK2Nhc2UgIiRob3N0X29zIiBpbgorbmV0YnNkKiB8IG9wZW5ic2QqKQorICAgICMgQmVjYXVzZSAvYm9vdCBpcyB1c2VkIGZvciB0aGUgYm9vdCBibG9jayBpbiBOZXRCU0QgYW5kIE9wZW5CU0QsIHVzZSAvZ3J1YgorICAgICMgaW5zdGVhZCBvZiAvYm9vdC9ncnViLgorICAgIGdydWJfcHJlZml4PS9ncnViCisgICAgYm9vdGRpcj0ke3Jvb3RkaXJ9CisgICAgOzsKKyopCisgICAgIyBVc2UgL2Jvb3QvZ3J1YiBieSBkZWZhdWx0LgorICAgIGJvb3RkaXI9JHtyb290ZGlyfS9ib290CisgICAgOzsKK2VzYWMKKworZ3J1YmRpcj0ke2Jvb3RkaXJ9L2dydWIKK2RldmljZV9tYXA9JHtncnViZGlyfS9kZXZpY2UubWFwCisKKyMgQ2hlY2sgaWYgR1JVQiBpcyBpbnN0YWxsZWQuCisjIFRoaXMgaXMgbmVjZXNzYXJ5LCBiZWNhdXNlIHRoZSB1c2VyIGNhbiBzcGVjaWZ5ICJncnViIC0tcmVhZC1vbmx5Ii4KK3NldCAkZ3J1Yl9zaGVsbCBkdW1teQoraWYgdGVzdCAtZiAiJDEiOyB0aGVuCisgICAgOgorZWxzZQorICAgIGVjaG8gIiQxOiBOb3QgZm91bmQuIiAxPiYyCisgICAgZXhpdCAxCitmaQorCitpZiB0ZXN0IC1mICIkcGtnbGliZGlyL3N0YWdlMSI7IHRoZW4KKyAgICA6CitlbHNlCisgICAgZWNobyAiJHtwa2dsaWJkaXJ9L3N0YWdlMTogTm90IGZvdW5kLiIgMT4mMgorICAgIGV4aXQgMQorZmkKKworaWYgdGVzdCAtZiAiJHBrZ2xpYmRpci9zdGFnZTIiOyB0aGVuCisgICAgOgorZWxzZQorICAgIGVjaG8gIiR7cGtnbGliZGlyfS9zdGFnZTI6IE5vdCBmb3VuZC4iIDE+JjIKKyAgICBleGl0IDEKK2ZpCisKKyMgRG9uJ3QgY2hlY2sgZm9yICpzdGFnZTFfNSwgYmVjYXVzZSBpdCBpcyBub3QgZmF0YWwgZXZlbiBpZiBhbnkKKyMgU3RhZ2UgMS41IGRvZXMgbm90IGV4aXN0LgorCisjIENyZWF0ZSB0aGUgR1JVQiBkaXJlY3RvcnkgaWYgaXQgaXMgbm90IHByZXNlbnQuCit0ZXN0IC1kICIkYm9vdGRpciIgfHwgbWtkaXIgIiRib290ZGlyIiB8fCBleGl0IDEKK3Rlc3QgLWQgIiRncnViZGlyIiB8fCBta2RpciAiJGdydWJkaXIiIHx8IGV4aXQgMQorCisjIElmIC0tcmVjaGVjayBpcyBzcGVjaWZpZWQsIHJlbW92ZSB0aGUgZGV2aWNlIG1hcCwgaWYgcHJlc2VudC4KK2lmIHRlc3QgJHJlY2hlY2sgPSB5ZXM7IHRoZW4KKyAgICBybSAtZiAkZGV2aWNlX21hcAorZmkKKworIyBDcmVhdGUgdGhlIGRldmljZSBtYXAgZmlsZSBpZiBpdCBpcyBub3QgcHJlc2VudC4KK2lmIHRlc3QgLWYgIiRkZXZpY2VfbWFwIjsgdGhlbgorICAgIDoKK2Vsc2UKKyAgICAjIENyZWF0ZSBhIHNhZmUgdGVtcG9yYXJ5IGZpbGUuCisgICAgdGVzdCAtbiAiJG1rbG9nIiAmJiBsb2dfZmlsZT1gJG1rbG9nYAorCisgICAgJGdydWJfc2hlbGwgLS1iYXRjaCAkbm9fZmxvcHB5IC0tZGV2aWNlLW1hcD0kZGV2aWNlX21hcCA8PEVPRiA+JGxvZ19maWxlCitxdWl0CitFT0YKKyAgICBpZiBncmVwICJFcnJvciBbMC05XSo6ICIgJGxvZ19maWxlID4vZGV2L251bGw7IHRoZW4KKwljYXQgJGxvZ19maWxlIDE+JjIKKwlleGl0IDEKKyAgICBmaQorCisgICAgcm0gLWYgJGxvZ19maWxlCitmaQorCisjIE1ha2Ugc3VyZSB0aGF0IHRoZXJlIGlzIG5vIGR1cGxpY2F0ZWQgZW50cnkuCit0bXA9YHNlZCAtbiAnL14oW2ZoXWRbMC05XSopL3MvXCheKC4qKVwpLiovXDEvcCcgJGRldmljZV9tYXAgXAorICAgIHwgc29ydCB8IHVuaXEgLWQgfCBzZWQgLW4gMXBgCitpZiB0ZXN0IC1uICIkdG1wIjsgdGhlbgorICAgIGVjaG8gIlRoZSBkcml2ZSAkdG1wIGlzIGRlZmluZWQgbXVsdGlwbGUgdGltZXMgaW4gdGhlIGRldmljZSBtYXAgJGRldmljZV9tYXAiIDE+JjIKKyAgICBleGl0IDEKK2ZpCisKKyMgQ2hlY2sgZm9yIElOU1RBTExfREVWSUNFLgorY2FzZSAiJGluc3RhbGxfZGV2aWNlIiBpbgorL2Rldi8qKQorICAgIGluc3RhbGxfZGV2aWNlPWByZXNvbHZlX3N5bWxpbmsgIiRpbnN0YWxsX2RldmljZSJgCisgICAgaW5zdGFsbF9kcml2ZT1gY29udmVydCAiJGluc3RhbGxfZGV2aWNlImAKKyAgICAjIEkgZG9uJ3Qga25vdyB3aHksIGJ1dCBzb21lIHNoZWxscyB3b3VsZG4ndCBkaWUgaWYgZXhpdCBpcworICAgICMgY2FsbGVkIGluIGEgZnVuY3Rpb24uCisgICAgaWYgdGVzdCAieCRpbnN0YWxsX2RyaXZlIiA9IHg7IHRoZW4KKwlleGl0IDEKKyAgICBmaSA7OworXChbaGZdZFswLTldKlwpKQorICAgIGluc3RhbGxfZHJpdmU9IiRpbnN0YWxsX2RldmljZSIgOzsKK1toZl1kWzAtOV0qKQorICAgICMgVGhlIEdSVUIgZm9ybWF0IHdpdGggbm8gcGFyZW50aGVzaXMuCisgICAgaW5zdGFsbF9kcml2ZT0iKCRpbnN0YWxsX2RldmljZSkiIDs7CisqKQorICAgIGVjaG8gIkZvcm1hdCBvZiBpbnN0YWxsX2RldmljZSBub3QgcmVjb2duaXplZC4iIDE+JjIKKyAgICB1c2FnZQorICAgIGV4aXQgMSA7OworZXNhYworCisjIEdldCB0aGUgcm9vdCBkcml2ZS4KK3Jvb3RfZGV2aWNlPWBmaW5kX2RldmljZSAke3Jvb3RkaXJ9YAorYm9vdGRpcl9kZXZpY2U9YGZpbmRfZGV2aWNlICR7Ym9vdGRpcn1gCisKKyMgQ2hlY2sgaWYgdGhlIGJvb3QgZGlyZWN0b3J5IGlzIGluIHRoZSBzYW1lIGRldmljZSBhcyB0aGUgcm9vdCBkaXJlY3RvcnkuCitpZiB0ZXN0ICJ4JHJvb3RfZGV2aWNlIiAhPSAieCRib290ZGlyX2RldmljZSI7IHRoZW4KKyAgICAjIFBlcmhhcHMgdGhlIHVzZXIgaGFzIGEgc2VwYXJhdGUgYm9vdCBwYXJ0aXRpb24uCisgICAgcm9vdF9kZXZpY2U9JGJvb3RkaXJfZGV2aWNlCisgICAgZ3J1Yl9wcmVmaXg9Ii9ncnViIgorZmkKKworIyBDb252ZXJ0IHRoZSByb290IGRldmljZSB0byBhIEdSVUIgZHJpdmUuCityb290X2RyaXZlPWBjb252ZXJ0ICIkcm9vdF9kZXZpY2UiYAoraWYgdGVzdCAieCRyb290X2RyaXZlIiA9IHg7IHRoZW4KKyAgICBleGl0IDEKK2ZpCisKKyMgQ2hlY2sgaWYgdGhlIHJvb3QgZGlyZWN0b3J5IGV4aXN0cyBpbiB0aGUgc2FtZSBkZXZpY2UgYXMgdGhlIGdydWIKKyMgZGlyZWN0b3J5LgorZ3J1YmRpcl9kZXZpY2U9YGZpbmRfZGV2aWNlICR7Z3J1YmRpcn1gCisKK2lmIHRlc3QgIngkZ3J1YmRpcl9kZXZpY2UiICE9ICJ4JHJvb3RfZGV2aWNlIjsgdGhlbgorICAgICMgRm9yIG5vdywgY2Fubm90IGRlYWwgd2l0aCB0aGlzIHNpdHVhdGlvbi4KKyAgICBjYXQgPDxFT0YgMT4mMgorWW91IG11c3Qgc2V0IHRoZSByb290IGRpcmVjdG9yeSBieSB0aGUgb3B0aW9uIC0tcm9vdC1kaXJlY3RvcnksIGJlY2F1c2UKKyRncnViZGlyIGRvZXMgbm90IGV4aXN0IGluIHRoZSByb290IGRldmljZSAkcm9vdF9kZXZpY2UuCitFT0YKKyAgICBleGl0IDEKK2ZpCisKKyMgQ29weSB0aGUgR1JVQiBpbWFnZXMgdG8gdGhlIEdSVUIgZGlyZWN0b3J5LgorZm9yIGZpbGUgaW4gJHtncnViZGlyfS9zdGFnZTEgJHtncnViZGlyfS9zdGFnZTIgJHtncnViZGlyfS8qc3RhZ2UxXzU7IGRvCisgICAgcm0gLWYgJGZpbGUgfHwgZXhpdCAxCitkb25lCitmb3IgZmlsZSBpbiBcCisgICAgJHtwa2dsaWJkaXJ9L3N0YWdlMSAke3BrZ2xpYmRpcn0vc3RhZ2UyICR7cGtnbGliZGlyfS8qc3RhZ2UxXzU7IGRvCisgICAgY3AgLWYgJGZpbGUgJHtncnViZGlyfSB8fCBleGl0IDEKK2RvbmUKKworIyBNYWtlIGEgZGVmYXVsdCBmaWxlLgorJHtncnViX3NldF9kZWZhdWx0fSAtLXJvb3QtZGlyZWN0b3J5PSR7cm9vdGRpcn0gZGVmYXVsdAorCisjIE1ha2Ugc3VyZSB0aGF0IEdSVUIgcmVhZHMgdGhlIHNhbWUgaW1hZ2VzIGFzIHRoZSBob3N0IE9TLgordGVzdCAtbiAiJG1raW1nIiAmJiBpbWdfZmlsZT1gJG1raW1nYAordGVzdCAtbiAiJG1rbG9nIiAmJiBsb2dfZmlsZT1gJG1rbG9nYAorCitmb3IgZmlsZSBpbiAke2dydWJkaXJ9L3N0YWdlMSAke2dydWJkaXJ9L3N0YWdlMiAke2dydWJkaXJ9LypzdGFnZTFfNTsgZG8KKyAgICBjb3VudD01CisgICAgdG1wPWBlY2hvICRmaWxlIHwgc2VkICJzfF4ke2dydWJkaXJ9fCR7Z3J1Yl9wcmVmaXh9fCJgCisgICAgd2hpbGUgdGVzdCAkY291bnQgLWd0IDA7IGRvCisJJGdydWJfc2hlbGwgLS1iYXRjaCAkbm9fZmxvcHB5IC0tZGV2aWNlLW1hcD0kZGV2aWNlX21hcCA8PEVPRiA+JGxvZ19maWxlCitkdW1wICR7cm9vdF9kcml2ZX0ke3RtcH0gJHtpbWdfZmlsZX0KK3F1aXQKK0VPRgorCWlmIGdyZXAgIkVycm9yIFswLTldKjogIiAkbG9nX2ZpbGUgPi9kZXYvbnVsbDsgdGhlbgorCSAgICA6CisJZWxpZiBjbXAgJGZpbGUgJGltZ19maWxlID4vZGV2L251bGw7IHRoZW4KKwkgICAgYnJlYWsKKwlmaQorCXNsZWVwIDEKKwljb3VudD1gZXhwciAkY291bnQgLSAxYCAgICAKKyAgICBkb25lCisgICAgaWYgdGVzdCAkY291bnQgLWVxIDA7IHRoZW4KKwllY2hvICJUaGUgZmlsZSAkZmlsZSBub3QgcmVhZCBjb3JyZWN0bHkuIiAxPiYyCisJZXhpdCAxCisgICAgZmkKK2RvbmUKKworcm0gLWYgJGltZ19maWxlCitybSAtZiAkbG9nX2ZpbGUKKworIyBDcmVhdGUgYSBzYWZlIHRlbXBvcmFyeSBmaWxlLgordGVzdCAtbiAiJG1rbG9nIiAmJiBsb2dfZmlsZT1gJG1rbG9nYAorCisjIE5vdyBwZXJmb3JtIHRoZSBpbnN0YWxsYXRpb24uCiskZ3J1Yl9zaGVsbCAtLWJhdGNoICRub19mbG9wcHkgLS1kZXZpY2UtbWFwPSRkZXZpY2VfbWFwIDw8RU9GID4kbG9nX2ZpbGUKK3Jvb3QgJHJvb3RfZHJpdmUKK3NldHVwICRmb3JjZV9sYmEgLS1zdGFnZTI9JGdydWJkaXIvc3RhZ2UyIC0tcHJlZml4PSRncnViX3ByZWZpeCAkaW5zdGFsbF9kcml2ZQorcXVpdAorRU9GCisKK2lmIGdyZXAgIkVycm9yIFswLTldKjogIiAkbG9nX2ZpbGUgPi9kZXYvbnVsbCB8fCB0ZXN0ICRkZWJ1ZyA9IHllczsgdGhlbgorICAgIGNhdCAkbG9nX2ZpbGUgMT4mMgorICAgIGV4aXQgMQorZmkKKworcm0gLWYgJGxvZ19maWxlCisKKyMgUHJvbXB0IHRoZSB1c2VyIHRvIGNoZWNrIGlmIHRoZSBkZXZpY2UgbWFwIGlzIGNvcnJlY3QuCitlY2hvICJJbnN0YWxsYXRpb24gZmluaXNoZWQuIE5vIGVycm9yIHJlcG9ydGVkLiIKK2VjaG8gIlRoaXMgaXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBkZXZpY2UgbWFwICRkZXZpY2VfbWFwLiIKK2VjaG8gIkNoZWNrIGlmIHRoaXMgaXMgY29ycmVjdCBvciBub3QuIElmIGFueSBvZiB0aGUgbGluZXMgaXMgaW5jb3JyZWN0LCIKK2VjaG8gImZpeCBpdCBhbmQgcmUtcnVuIHRoZSBzY3JpcHQgXGBncnViLWluc3RhbGwnLiIKK2VjaG8KKworY2F0ICRkZXZpY2VfbWFwCisKKyMgQnllLgorZXhpdCAwCmRpZmYgLS1naXQgYS91dGlsL2dydWItbWQ1LWNyeXB0IGIvdXRpbC9ncnViLW1kNS1jcnlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWVkN2M0Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9ncnViLW1kNS1jcnlwdApAQCAtMCwwICsxLDk5IEBACisjISAvYmluL3NoCisKKyMgRW5jcnlwdCBhIHBhc3N3b3JkIGluIE1ENSBmb3JtYXQKKyMgICBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworIyBSZXBsYWNlZCBieSB0aGUgY29uZmlndXJlIHNjcmlwdC4KK3ByZWZpeD0vdXNyL2xvY2FsCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK3NiaW5kaXI9JHtleGVjX3ByZWZpeH0vc2JpbgorCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMuCitncnViX3NoZWxsPSR7c2JpbmRpcn0vZ3J1YgorcHJvZ25hbWU9ImdydWItbWQ1LWNyeXB0IgorCisjIENoZWNrIHRoZSBhcmd1bWVudHMuCitmb3Igb3B0aW9uIGluICIkQCI7IGRvCisgICAgY2FzZSAiJG9wdGlvbiIgaW4KKyAgICAtaCB8IC0taGVscCkKKwljYXQgPDxFT0YKK1VzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0KK0VuY3J5cHQgYSBwYXNzd29yZCBpbiBNRDUgZm9ybWF0LgorCisgIC1oLCAtLWhlbHAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZSBhbmQgZXhpdAorICAtdiwgLS12ZXJzaW9uICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorICAtLWdydWItc2hlbGw9RklMRSAgICAgICB1c2UgRklMRSBhcyB0aGUgZ3J1YiBzaGVsbAorCitSZXBvcnQgYnVncyB0byA8YnVnLWdydWJAZ251Lm9yZz4uCitFT0YKKwlleGl0IDAKKwk7OworCisgICAgLXYgfCAtLXZlcnNpb24pCisJZWNobyAiJHByb2duYW1lIChHTlUgR1JVQiAke1ZFUlNJT059KSIKKwlleGl0IDAKKwk7OworCisgICAgLS1ncnViLXNoZWxsPSopCisJZ3J1Yl9zaGVsbD1gZWNobyAiJG9wdGlvbiIgfCBzZWQgJ3MvLS1ncnViLXNoZWxsPS8vJ2AKKwk7OworCisgICAgKikKKwllY2hvICIkcHJvZ25hbWU6IHVucmVjb2duaXplZCBvcHRpb24gXGAkb3B0aW9uJyIKKwllY2hvICJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dIgorCWVjaG8gIlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKwlleGl0IDEKKwk7OworICAgIGVzYWMKK2RvbmUKKworIyBTdXBwcmVzcyBlY2hvIGJhY2tzLiBJIGRvbid0IGtub3cgaWYgdGhpcyBpcyByZWFsbHkgcG9ydGFibGUuIC1va3VqaQorc3R0eSAtZWNobworCisjIFByb21wdCB0byBlbnRlciBhIHBhc3N3b3JkLgorZWNobyAtbiAiUGFzc3dvcmQ6ICIKK3JlYWQgLXIgcGFzc3dvcmQKK2VjaG8KKworIyBPbmUgbW9yZSB0aW1lLgorZWNobyAtbiAiUmV0eXBlIHBhc3N3b3JkOiAiCityZWFkIC1yIHBhc3N3b3JkMgorZWNobworCisjIFJlc3VtZSBlY2hvIGJhY2tzLgorc3R0eSBlY2hvCisKK2lmIHRlc3QgIngkcGFzc3dvcmQiID0geDsgdGhlbgorICAgIGVjaG8gIkVtcHR5IHBhc3N3b3JkIGlzIG5vdCBwZXJtaXR0ZWQuIgorICAgIGV4aXQgMQorZmkKKworaWYgdGVzdCAieCRwYXNzd29yZCIgIT0gIngkcGFzc3dvcmQyIjsgdGhlbgorICAgIGVjaG8gIlNvcnJ5LCBwYXNzd29yZHMgZG8gbm90IG1hdGNoLiIKKyAgICBleGl0IDEKK2ZpCisKKyMgUnVuIHRoZSBncnViIHNoZWxsLgorJGdydWJfc2hlbGwgLS1iYXRjaCAtLWRldmljZS1tYXA9L2Rldi9udWxsIDw8RU9GIFwKKyAgICB8IGdyZXAgIl5FbmNyeXB0ZWQ6ICIgfCBzZWQgJ3MvXkVuY3J5cHRlZDogLy8nCittZDVjcnlwdAorJHBhc3N3b3JkCitxdWl0CitFT0YKKworIyBCeWUuCitleGl0IDAKZGlmZiAtLWdpdCBhL3V0aWwvZ3J1Yi1tZDUtY3J5cHQuaW4gYi91dGlsL2dydWItbWQ1LWNyeXB0LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMzBjODcKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL2dydWItbWQ1LWNyeXB0LmluCkBAIC0wLDAgKzEsOTkgQEAKKyMhIC9iaW4vc2gKKworIyBFbmNyeXB0IGEgcGFzc3dvcmQgaW4gTUQ1IGZvcm1hdAorIyAgIENvcHlyaWdodCAoQykgMjAwMCwyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisjIFJlcGxhY2VkIGJ5IHRoZSBjb25maWd1cmUgc2NyaXB0LgorcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitzYmluZGlyPUBzYmluZGlyQAorCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMuCitncnViX3NoZWxsPSR7c2JpbmRpcn0vZ3J1YgorcHJvZ25hbWU9ImdydWItbWQ1LWNyeXB0IgorCisjIENoZWNrIHRoZSBhcmd1bWVudHMuCitmb3Igb3B0aW9uIGluICIkQCI7IGRvCisgICAgY2FzZSAiJG9wdGlvbiIgaW4KKyAgICAtaCB8IC0taGVscCkKKwljYXQgPDxFT0YKK1VzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0KK0VuY3J5cHQgYSBwYXNzd29yZCBpbiBNRDUgZm9ybWF0LgorCisgIC1oLCAtLWhlbHAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZSBhbmQgZXhpdAorICAtdiwgLS12ZXJzaW9uICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorICAtLWdydWItc2hlbGw9RklMRSAgICAgICB1c2UgRklMRSBhcyB0aGUgZ3J1YiBzaGVsbAorCitSZXBvcnQgYnVncyB0byA8YnVnLWdydWJAZ251Lm9yZz4uCitFT0YKKwlleGl0IDAKKwk7OworCisgICAgLXYgfCAtLXZlcnNpb24pCisJZWNobyAiJHByb2duYW1lIChHTlUgR1JVQiAke1ZFUlNJT059KSIKKwlleGl0IDAKKwk7OworCisgICAgLS1ncnViLXNoZWxsPSopCisJZ3J1Yl9zaGVsbD1gZWNobyAiJG9wdGlvbiIgfCBzZWQgJ3MvLS1ncnViLXNoZWxsPS8vJ2AKKwk7OworCisgICAgKikKKwllY2hvICIkcHJvZ25hbWU6IHVucmVjb2duaXplZCBvcHRpb24gXGAkb3B0aW9uJyIKKwllY2hvICJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dIgorCWVjaG8gIlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKwlleGl0IDEKKwk7OworICAgIGVzYWMKK2RvbmUKKworIyBTdXBwcmVzcyBlY2hvIGJhY2tzLiBJIGRvbid0IGtub3cgaWYgdGhpcyBpcyByZWFsbHkgcG9ydGFibGUuIC1va3VqaQorc3R0eSAtZWNobworCisjIFByb21wdCB0byBlbnRlciBhIHBhc3N3b3JkLgorZWNobyAtbiAiUGFzc3dvcmQ6ICIKK3JlYWQgLXIgcGFzc3dvcmQKK2VjaG8KKworIyBPbmUgbW9yZSB0aW1lLgorZWNobyAtbiAiUmV0eXBlIHBhc3N3b3JkOiAiCityZWFkIC1yIHBhc3N3b3JkMgorZWNobworCisjIFJlc3VtZSBlY2hvIGJhY2tzLgorc3R0eSBlY2hvCisKK2lmIHRlc3QgIngkcGFzc3dvcmQiID0geDsgdGhlbgorICAgIGVjaG8gIkVtcHR5IHBhc3N3b3JkIGlzIG5vdCBwZXJtaXR0ZWQuIgorICAgIGV4aXQgMQorZmkKKworaWYgdGVzdCAieCRwYXNzd29yZCIgIT0gIngkcGFzc3dvcmQyIjsgdGhlbgorICAgIGVjaG8gIlNvcnJ5LCBwYXNzd29yZHMgZG8gbm90IG1hdGNoLiIKKyAgICBleGl0IDEKK2ZpCisKKyMgUnVuIHRoZSBncnViIHNoZWxsLgorJGdydWJfc2hlbGwgLS1iYXRjaCAtLWRldmljZS1tYXA9L2Rldi9udWxsIDw8RU9GIFwKKyAgICB8IGdyZXAgIl5FbmNyeXB0ZWQ6ICIgfCBzZWQgJ3MvXkVuY3J5cHRlZDogLy8nCittZDVjcnlwdAorJHBhc3N3b3JkCitxdWl0CitFT0YKKworIyBCeWUuCitleGl0IDAKZGlmZiAtLWdpdCBhL3V0aWwvZ3J1Yi1zZXQtZGVmYXVsdCBiL3V0aWwvZ3J1Yi1zZXQtZGVmYXVsdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzNlOGI3Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC9ncnViLXNldC1kZWZhdWx0CkBAIC0wLDAgKzEsMTE0IEBACisjISAvYmluL3NoCisKKyMgU2V0IGEgZGVmYXVsdCBib290IGVudHJ5IGZvciBHUlVCCisjICAgQ29weXJpZ2h0IChDKSAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMuCitQQUNLQUdFPWdydWIKK1ZFUlNJT049MC45NworCityb290ZGlyPQorZW50cnk9CisKKyMgVXNhZ2U6IHVzYWdlCisjIFByaW50IHRoZSB1c2FnZS4KK3VzYWdlICgpIHsKKyAgICBjYXQgPDxFT0YKK1VzYWdlOiBncnViLXNldC1kZWZhdWx0IFtPUFRJT05dIGVudHJ5CitTZXQgdGhlIGRlZmF1bHQgYm9vdCBlbnRyeSBmb3IgR1JVQi4KKworICAtaCwgLS1oZWxwICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UgYW5kIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKyAgLS1yb290LWRpcmVjdG9yeT1ESVIgICAgVXNlIHRoZSBkaXJlY3RvcnkgRElSIGluc3RlYWQgb2YgdGhlIHJvb3QgZGlyZWN0b3J5CisKK0VOVFJZIGlzIGEgbnVtYmVyIG9yIHRoZSBzcGVjaWFsIGtleXdvcmQgXGBkZWZhdWx0XCcuCisKK1JlcG9ydCBidWdzIHRvIDxidWctZ3J1YkBnbnUub3JnPi4KK0VPRgorfQorCisjIENoZWNrIHRoZSBhcmd1bWVudHMuCitmb3Igb3B0aW9uIGluICIkQCI7IGRvCisgICAgY2FzZSAiJG9wdGlvbiIgaW4KKyAgICAtaCB8IC0taGVscCkKKwl1c2FnZQorCWV4aXQgMCA7OworICAgIC12IHwgLS12ZXJzaW9uKQorCWVjaG8gImdydWItc2V0LWRlZmF1bHQgKEdOVSBHUlVCICR7VkVSU0lPTn0pIgorCWV4aXQgMCA7OworICAgIC0tcm9vdC1kaXJlY3Rvcnk9KikKKwlyb290ZGlyPWBlY2hvICIkb3B0aW9uIiB8IHNlZCAncy8tLXJvb3QtZGlyZWN0b3J5PS8vJ2AgOzsKKyAgICAtKikKKwllY2hvICJVbnJlY29nbml6ZWQgb3B0aW9uIFxgJG9wdGlvbiciIDE+JjIKKwl1c2FnZQorCWV4aXQgMQorCTs7CisgICAgKikKKwlpZiB0ZXN0ICJ4JGVudHJ5IiAhPSB4OyB0aGVuCisJICAgIGVjaG8gIk1vcmUgdGhhbiBvbmUgZW50cmllcz8iIDE+JjIKKwkgICAgdXNhZ2UKKwkgICAgZXhpdCAxCisJZmkKKwkjIFdlIGRvbid0IGNhcmUgYWJvdXQgd2hhdCB0aGUgdXNlciBzcGVjaWZpZWQgYWN0dWFsbHkuCisJZW50cnk9IiR7b3B0aW9ufSIgOzsKKyAgICBlc2FjCitkb25lCisKK2lmIHRlc3QgIngkZW50cnkiID0geDsgdGhlbgorICAgIGVjaG8gImVudHJ5IG5vdCBzcGVjaWZpZWQuIiAxPiYyCisgICAgdXNhZ2UKKyAgICBleGl0IDEKK2ZpCisKKyMgRGV0ZXJtaW5lIHRoZSBHUlVCIGRpcmVjdG9yeS4gVGhpcyBpcyBkaWZmZXJlbnQgYW1vbmcgT1Nlcy4KK2dydWJkaXI9JHtyb290ZGlyfS9ib290L2dydWIKK2lmIHRlc3QgLWQgJHtncnViZGlyfTsgdGhlbgorICAgIDoKK2Vsc2UKKyAgICBncnViZGlyPSR7cm9vdGRpcn0vZ3J1YgorICAgIGlmIHRlc3QgLWQgJHtncnViZGlyfTsgdGhlbgorCToKKyAgICBlbHNlCisJZWNobyAiTm8gR1JVQiBkaXJlY3RvcnkgZm91bmQgdW5kZXIgJHtyb290ZGlyfS8iIDE+JjIKKwlleGl0IDEKKyAgICBmaQorZmkKKworZmlsZT0ke2dydWJkaXJ9L2RlZmF1bHQKK2lmIHRlc3QgLWYgJHtmaWxlfTsgdGhlbgorICAgIGNobW9kIDA2MDAgJHtmaWxlfQorICAgIHJtIC1mICR7ZmlsZX0KK2ZpCitjYXQgPDxFT0YgPiAkZmlsZQorJGVudHJ5CisjCisjCisjCisjCisjCisjCisjCisjCisjCisjCisjIFdBUk5JTkc6IElmIHlvdSB3YW50IHRvIGVkaXQgdGhpcyBmaWxlIGRpcmVjdGx5LCBkbyBub3QgcmVtb3ZlIGFueSBsaW5lCisjIGZyb20gdGhpcyBmaWxlLCBpbmNsdWRpbmcgdGhpcyB3YXJuaW5nLiBVc2luZyBcYGdydWItc2V0LWRlZmF1bHRcJyBpcworIyBzdHJvbmdseSByZWNvbW1lbmRlZC4KK0VPRgorCisjIEJ5ZS4KK2V4aXQgMApkaWZmIC0tZ2l0IGEvdXRpbC9ncnViLXNldC1kZWZhdWx0LmluIGIvdXRpbC9ncnViLXNldC1kZWZhdWx0LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNWI3ODMKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL2dydWItc2V0LWRlZmF1bHQuaW4KQEAgLTAsMCArMSwxMTQgQEAKKyMhIC9iaW4vc2gKKworIyBTZXQgYSBkZWZhdWx0IGJvb3QgZW50cnkgZm9yIEdSVUIKKyMgICBDb3B5cmlnaHQgKEMpIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcy4KK1BBQ0tBR0U9QFBBQ0tBR0VACitWRVJTSU9OPUBWRVJTSU9OQAorCityb290ZGlyPQorZW50cnk9CisKKyMgVXNhZ2U6IHVzYWdlCisjIFByaW50IHRoZSB1c2FnZS4KK3VzYWdlICgpIHsKKyAgICBjYXQgPDxFT0YKK1VzYWdlOiBncnViLXNldC1kZWZhdWx0IFtPUFRJT05dIGVudHJ5CitTZXQgdGhlIGRlZmF1bHQgYm9vdCBlbnRyeSBmb3IgR1JVQi4KKworICAtaCwgLS1oZWxwICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UgYW5kIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKyAgLS1yb290LWRpcmVjdG9yeT1ESVIgICAgVXNlIHRoZSBkaXJlY3RvcnkgRElSIGluc3RlYWQgb2YgdGhlIHJvb3QgZGlyZWN0b3J5CisKK0VOVFJZIGlzIGEgbnVtYmVyIG9yIHRoZSBzcGVjaWFsIGtleXdvcmQgXGBkZWZhdWx0XCcuCisKK1JlcG9ydCBidWdzIHRvIDxidWctZ3J1YkBnbnUub3JnPi4KK0VPRgorfQorCisjIENoZWNrIHRoZSBhcmd1bWVudHMuCitmb3Igb3B0aW9uIGluICIkQCI7IGRvCisgICAgY2FzZSAiJG9wdGlvbiIgaW4KKyAgICAtaCB8IC0taGVscCkKKwl1c2FnZQorCWV4aXQgMCA7OworICAgIC12IHwgLS12ZXJzaW9uKQorCWVjaG8gImdydWItc2V0LWRlZmF1bHQgKEdOVSBHUlVCICR7VkVSU0lPTn0pIgorCWV4aXQgMCA7OworICAgIC0tcm9vdC1kaXJlY3Rvcnk9KikKKwlyb290ZGlyPWBlY2hvICIkb3B0aW9uIiB8IHNlZCAncy8tLXJvb3QtZGlyZWN0b3J5PS8vJ2AgOzsKKyAgICAtKikKKwllY2hvICJVbnJlY29nbml6ZWQgb3B0aW9uIFxgJG9wdGlvbiciIDE+JjIKKwl1c2FnZQorCWV4aXQgMQorCTs7CisgICAgKikKKwlpZiB0ZXN0ICJ4JGVudHJ5IiAhPSB4OyB0aGVuCisJICAgIGVjaG8gIk1vcmUgdGhhbiBvbmUgZW50cmllcz8iIDE+JjIKKwkgICAgdXNhZ2UKKwkgICAgZXhpdCAxCisJZmkKKwkjIFdlIGRvbid0IGNhcmUgYWJvdXQgd2hhdCB0aGUgdXNlciBzcGVjaWZpZWQgYWN0dWFsbHkuCisJZW50cnk9IiR7b3B0aW9ufSIgOzsKKyAgICBlc2FjCitkb25lCisKK2lmIHRlc3QgIngkZW50cnkiID0geDsgdGhlbgorICAgIGVjaG8gImVudHJ5IG5vdCBzcGVjaWZpZWQuIiAxPiYyCisgICAgdXNhZ2UKKyAgICBleGl0IDEKK2ZpCisKKyMgRGV0ZXJtaW5lIHRoZSBHUlVCIGRpcmVjdG9yeS4gVGhpcyBpcyBkaWZmZXJlbnQgYW1vbmcgT1Nlcy4KK2dydWJkaXI9JHtyb290ZGlyfS9ib290L2dydWIKK2lmIHRlc3QgLWQgJHtncnViZGlyfTsgdGhlbgorICAgIDoKK2Vsc2UKKyAgICBncnViZGlyPSR7cm9vdGRpcn0vZ3J1YgorICAgIGlmIHRlc3QgLWQgJHtncnViZGlyfTsgdGhlbgorCToKKyAgICBlbHNlCisJZWNobyAiTm8gR1JVQiBkaXJlY3RvcnkgZm91bmQgdW5kZXIgJHtyb290ZGlyfS8iIDE+JjIKKwlleGl0IDEKKyAgICBmaQorZmkKKworZmlsZT0ke2dydWJkaXJ9L2RlZmF1bHQKK2lmIHRlc3QgLWYgJHtmaWxlfTsgdGhlbgorICAgIGNobW9kIDA2MDAgJHtmaWxlfQorICAgIHJtIC1mICR7ZmlsZX0KK2ZpCitjYXQgPDxFT0YgPiAkZmlsZQorJGVudHJ5CisjCisjCisjCisjCisjCisjCisjCisjCisjCisjCisjIFdBUk5JTkc6IElmIHlvdSB3YW50IHRvIGVkaXQgdGhpcyBmaWxlIGRpcmVjdGx5LCBkbyBub3QgcmVtb3ZlIGFueSBsaW5lCisjIGZyb20gdGhpcyBmaWxlLCBpbmNsdWRpbmcgdGhpcyB3YXJuaW5nLiBVc2luZyBcYGdydWItc2V0LWRlZmF1bHRcJyBpcworIyBzdHJvbmdseSByZWNvbW1lbmRlZC4KK0VPRgorCisjIEJ5ZS4KK2V4aXQgMApkaWZmIC0tZ2l0IGEvdXRpbC9ncnViLXRlcm1pbmZvIGIvdXRpbC9ncnViLXRlcm1pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMmQxYmMKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL2dydWItdGVybWluZm8KQEAgLTAsMCArMSw5NSBAQAorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZSBhIHRlcm1pbmZvIGNvbW1hbmQgZnJvbSBhIHRlcm1pbmZvIG5hbWUuCisjCisjIENvcHlyaWdodCAoQykgMjAwMiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKK1ZFUlNJT049MC45NworCit1c2FnZSAoKSB7CisgICAgY2F0IDw8RU9GCitVc2FnZTogZ3J1Yi10ZXJtaW5mbyBURVJNTkFNRQorR2VuZXJhdGUgYSB0ZXJtaW5mbyBjb21tYW5kIGZyb20gYSB0ZXJtaW5mbyBuYW1lLgorCisgIC1oLCAtLWhlbHAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZSBhbmQgZXhpdAorICAtdiwgLS12ZXJzaW9uICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorCitSZXBvcnQgYnVncyB0byA8YnVnLWdydWJAZ251Lm9yZz4uCitFT0YKK30KKworZXJyb3IgKCkgeworICAgIGVjaG8gImdydWItdGVybWluZm86IGVycm9yOiAkMSIgMT4mMgorfQorCit0ZXJtbmFtZT0KKworZm9yIG9wdGlvbiBpbiAiJEAiOyBkbworICAgIGNhc2UgIiRvcHRpb24iIGluCisgICAgLWggfCAtLWhlbHApCisgICAgICAgIHVzYWdlCisJZXhpdCAwIDs7CisgICAgLXYgfCAtLXZlcnNpb24pCisJZWNobyAiZ3J1Yi10ZXJtaW5mbyAoR05VIEdSVUIgJHtWRVJTSU9OfSkiCisJZXhpdCAwIDs7CisgICAgLSopCisJZXJyb3IgIlVucmVjb2duaXplZCBvcHRpb24gXGAkb3B0aW9uJyIKKwl1c2FnZQorCWV4aXQgMSA7OworICAgICopCisJaWYgdGVzdCAieCR0ZXJtbmFtZSIgIT0geDsgdGhlbgorCSAgICBlcnJvciAiTW9yZSB0aGFuIG9uZSB0ZXJtaW5mbyBuYW1lcz8iCisJICAgIHVzYWdlCisJICAgIGV4aXQgMQorCWZpCisJdGVybW5hbWU9IiRvcHRpb24iIDs7CisgICAgZXNhYworZG9uZQorCitpZiB0ZXN0ICJ4JHRlcm1uYW1lIiA9IHg7IHRoZW4KKyAgICBlcnJvciAidGVybW5hbWUgbm90IHNwZWNpZmllZCIKKyAgICB1c2FnZQorICAgIGV4aXQgMQorZmkKKworZ2V0X3NlcSAoKSB7CisgICAgaW5mb2NtcCAtTCAtMSAtZyAkdGVybW5hbWUgfCBzZWQgLW4gLWUgIi8kMS9zL15bXj1dKj1cXCguKlxcKSxcJC9cXDEvcCIKK30KKworY3Vyc29yX2FkZHJlc3M9ImBnZXRfc2VxIGN1cnNvcl9hZGRyZXNzYCIKK2lmIHRlc3QgIngkY3Vyc29yX2FkZHJlc3MiID0geDsgdGhlbgorICAgIGVycm9yICJjdXJzb3JfYWRkcmVzcyBub3QgZm91bmQiCisgICAgZXhpdCAxCitmaQorY3Vyc29yX2FkZHJlc3M9Ii0tY3Vyc29yLWFkZHJlc3M9JGN1cnNvcl9hZGRyZXNzIgorCitjbGVhcl9zY3JlZW49ImBnZXRfc2VxIGNsZWFyX3NjcmVlbmAiCitpZiB0ZXN0ICJ4JGNsZWFyX3NjcmVlbiIgIT0geDsgdGhlbgorICAgIGNsZWFyX3NjcmVlbj0iLS1jbGVhci1zY3JlZW49JGNsZWFyX3NjcmVlbiIKK2ZpCisKK2VudGVyX3N0YW5kb3V0X21vZGU9ImBnZXRfc2VxIGVudGVyX3N0YW5kb3V0X21vZGVgIgoraWYgdGVzdCAieCRlbnRlcl9zdGFuZG91dF9tb2RlIiAhPSB4OyB0aGVuCisgICAgZW50ZXJfc3RhbmRvdXRfbW9kZT0iLS1lbnRlci1zdGFuZG91dC1tb2RlPSRlbnRlcl9zdGFuZG91dF9tb2RlIgorZmkKKworZXhpdF9zdGFuZG91dF9tb2RlPSJgZ2V0X3NlcSBleGl0X3N0YW5kb3V0X21vZGVgIgoraWYgdGVzdCAieCRleGl0X3N0YW5kb3V0X21vZGUiICE9IHg7IHRoZW4KKyAgICBleGl0X3N0YW5kb3V0X21vZGU9Ii0tZXhpdC1zdGFuZG91dC1tb2RlPSRleGl0X3N0YW5kb3V0X21vZGUiCitmaQorCitlY2hvICJ0ZXJtaW5mbyAtLW5hbWU9JHRlcm1uYW1lIiAkY3Vyc29yX2FkZHJlc3MgJGNsZWFyX3NjcmVlbiBcCisgICAgJGVudGVyX3N0YW5kb3V0X21vZGUgJGV4aXRfc3RhbmRvdXRfbW9kZQpkaWZmIC0tZ2l0IGEvdXRpbC9ncnViLXRlcm1pbmZvLmluIGIvdXRpbC9ncnViLXRlcm1pbmZvLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MWI0MTgKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL2dydWItdGVybWluZm8uaW4KQEAgLTAsMCArMSw5NSBAQAorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZSBhIHRlcm1pbmZvIGNvbW1hbmQgZnJvbSBhIHRlcm1pbmZvIG5hbWUuCisjCisjIENvcHlyaWdodCAoQykgMjAwMiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKK1ZFUlNJT049QFZFUlNJT05ACisKK3VzYWdlICgpIHsKKyAgICBjYXQgPDxFT0YKK1VzYWdlOiBncnViLXRlcm1pbmZvIFRFUk1OQU1FCitHZW5lcmF0ZSBhIHRlcm1pbmZvIGNvbW1hbmQgZnJvbSBhIHRlcm1pbmZvIG5hbWUuCisKKyAgLWgsIC0taGVscCAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlIGFuZCBleGl0CisgIC12LCAtLXZlcnNpb24gICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisKK1JlcG9ydCBidWdzIHRvIDxidWctZ3J1YkBnbnUub3JnPi4KK0VPRgorfQorCitlcnJvciAoKSB7CisgICAgZWNobyAiZ3J1Yi10ZXJtaW5mbzogZXJyb3I6ICQxIiAxPiYyCit9CisKK3Rlcm1uYW1lPQorCitmb3Igb3B0aW9uIGluICIkQCI7IGRvCisgICAgY2FzZSAiJG9wdGlvbiIgaW4KKyAgICAtaCB8IC0taGVscCkKKyAgICAgICAgdXNhZ2UKKwlleGl0IDAgOzsKKyAgICAtdiB8IC0tdmVyc2lvbikKKwllY2hvICJncnViLXRlcm1pbmZvIChHTlUgR1JVQiAke1ZFUlNJT059KSIKKwlleGl0IDAgOzsKKyAgICAtKikKKwllcnJvciAiVW5yZWNvZ25pemVkIG9wdGlvbiBcYCRvcHRpb24nIgorCXVzYWdlCisJZXhpdCAxIDs7CisgICAgKikKKwlpZiB0ZXN0ICJ4JHRlcm1uYW1lIiAhPSB4OyB0aGVuCisJICAgIGVycm9yICJNb3JlIHRoYW4gb25lIHRlcm1pbmZvIG5hbWVzPyIKKwkgICAgdXNhZ2UKKwkgICAgZXhpdCAxCisJZmkKKwl0ZXJtbmFtZT0iJG9wdGlvbiIgOzsKKyAgICBlc2FjCitkb25lCisKK2lmIHRlc3QgIngkdGVybW5hbWUiID0geDsgdGhlbgorICAgIGVycm9yICJ0ZXJtbmFtZSBub3Qgc3BlY2lmaWVkIgorICAgIHVzYWdlCisgICAgZXhpdCAxCitmaQorCitnZXRfc2VxICgpIHsKKyAgICBpbmZvY21wIC1MIC0xIC1nICR0ZXJtbmFtZSB8IHNlZCAtbiAtZSAiLyQxL3MvXltePV0qPVxcKC4qXFwpLFwkL1xcMS9wIgorfQorCitjdXJzb3JfYWRkcmVzcz0iYGdldF9zZXEgY3Vyc29yX2FkZHJlc3NgIgoraWYgdGVzdCAieCRjdXJzb3JfYWRkcmVzcyIgPSB4OyB0aGVuCisgICAgZXJyb3IgImN1cnNvcl9hZGRyZXNzIG5vdCBmb3VuZCIKKyAgICBleGl0IDEKK2ZpCitjdXJzb3JfYWRkcmVzcz0iLS1jdXJzb3ItYWRkcmVzcz0kY3Vyc29yX2FkZHJlc3MiCisKK2NsZWFyX3NjcmVlbj0iYGdldF9zZXEgY2xlYXJfc2NyZWVuYCIKK2lmIHRlc3QgIngkY2xlYXJfc2NyZWVuIiAhPSB4OyB0aGVuCisgICAgY2xlYXJfc2NyZWVuPSItLWNsZWFyLXNjcmVlbj0kY2xlYXJfc2NyZWVuIgorZmkKKworZW50ZXJfc3RhbmRvdXRfbW9kZT0iYGdldF9zZXEgZW50ZXJfc3RhbmRvdXRfbW9kZWAiCitpZiB0ZXN0ICJ4JGVudGVyX3N0YW5kb3V0X21vZGUiICE9IHg7IHRoZW4KKyAgICBlbnRlcl9zdGFuZG91dF9tb2RlPSItLWVudGVyLXN0YW5kb3V0LW1vZGU9JGVudGVyX3N0YW5kb3V0X21vZGUiCitmaQorCitleGl0X3N0YW5kb3V0X21vZGU9ImBnZXRfc2VxIGV4aXRfc3RhbmRvdXRfbW9kZWAiCitpZiB0ZXN0ICJ4JGV4aXRfc3RhbmRvdXRfbW9kZSIgIT0geDsgdGhlbgorICAgIGV4aXRfc3RhbmRvdXRfbW9kZT0iLS1leGl0LXN0YW5kb3V0LW1vZGU9JGV4aXRfc3RhbmRvdXRfbW9kZSIKK2ZpCisKK2VjaG8gInRlcm1pbmZvIC0tbmFtZT0kdGVybW5hbWUiICRjdXJzb3JfYWRkcmVzcyAkY2xlYXJfc2NyZWVuIFwKKyAgICAkZW50ZXJfc3RhbmRvdXRfbW9kZSAkZXhpdF9zdGFuZG91dF9tb2RlCmRpZmYgLS1naXQgYS91dGlsL21iY2hrLmMgYi91dGlsL21iY2hrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ3MTg1OAotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwvbWJjaGsuYwpAQCAtMCwwICsxLDI0NCBAQAorLyogbWJjaGsgLSBhIHNpbXBsZSBjaGVja2VyIGZvciB0aGUgZm9ybWF0IG9mIGEgTXVsdGlib290IGtlcm5lbCAqLworLyoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMSwyMDAyICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8bXVsdGlib290Lmg+CisKK3N0YXRpYyBpbnQgcXVpZXQgPSAwOworc3RhdGljIGNoYXIgKm9wdHN0cmluZyA9ICJodnEiOworc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9Cit7CisgIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAorICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgMCwgJ3YnfSwKKyAgeyJxdWlldCIsIG5vX2FyZ3VtZW50LCAwLCAncSd9LAorICB7MH0KK307CisKK3N0YXRpYyB2b2lkCit1c2FnZSAoaW50IHN0YXR1cykKK3sKKyAgaWYgKHN0YXR1cykKKyAgICBmcHJpbnRmIChzdGRlcnIsICJUcnkgYGBtYmNoayAtLWhlbHAnJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiIpOworICBlbHNlCisgICAgcHJpbnRmICgiVXNhZ2U6IG1iY2hrIFtPUFRJT05dLi4uIFtGSUxFXS4uLlxuIgorCSAgICAiQ2hlY2sgaWYgdGhlIGZvcm1hdCBvZiBGSUxFIGNvbXBsaWVzIHdpdGggdGhlIE11bHRpYm9vdCBTcGVjaWZpY2F0aW9uLlxuIgorCSAgICAiXG4iCisJICAgICItcSwgLS1xdWlldCAgICAgICAgICAgICAgICBzdXBwcmVzcyBhbGwgbm9ybWFsIG91dHB1dFxuIgorCSAgICAiLWgsIC0taGVscCAgICAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXRcbiIKKwkgICAgIi12LCAtLXZlcnNpb24gICAgICAgICAgICAgIG91dHB1dCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0LlxuIgorCSAgICAiXG4iCisJICAgICJSZXBvcnQgYnVncyB0byA8YnVnLWdydWJAZ251Lm9yZz4uXG4iKTsKKworICBleGl0IChzdGF0dXMpOworfQorCitzdGF0aWMgaW50CitjaGVja19tdWx0aWJvb3QgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBGSUxFICpmcCkKK3sKKyAgbXVsdGlib290X2hlYWRlcl90ICptYmggPSAwOworICBpbnQgaTsKKyAgY2hhciBidWZbODE5Ml07CisKKyAgaWYgKGZyZWFkIChidWYsIDEsIDgxOTIsIGZwKSA8IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IFJlYWQgZXJyb3IuXG4iLCBmaWxlbmFtZSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IDgxOTIgLSBzaXplb2YgKG11bHRpYm9vdF9oZWFkZXJfdCk7IGkrKykKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIG1hZ2ljID0gKigodW5zaWduZWQgbG9uZyAqKSAoYnVmICsgaSkpOworCisgICAgICBpZiAobWFnaWMgPT0gTVVMVElCT09UX0hFQURFUl9NQUdJQykKKwl7CisJICBtYmggPSAobXVsdGlib290X2hlYWRlcl90ICopIChidWYgKyBpKTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYgKCEgbWJoKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBObyBNdWx0aWJvb3QgaGVhZGVyLlxuIiwgZmlsZW5hbWUpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmICghIHF1aWV0KQorICAgIHByaW50ZiAoIiVzOiBUaGUgTXVsdGlib290IGhlYWRlciBpcyBmb3VuZCBhdCB0aGUgb2Zmc2V0ICVkLlxuIiwKKwkgICAgZmlsZW5hbWUsIGkpOworCisgIC8qIENoZWNrIGZvciB0aGUgY2hlY2tzdW0uICAqLworICBpZiAobWJoLT5tYWdpYyArIG1iaC0+ZmxhZ3MgKyBtYmgtPmNoZWNrc3VtICE9IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLAorCSAgICAgICAiJXM6IEJhZCBjaGVja3N1bSAoMHglbHgpLlxuIiwKKwkgICAgICAgZmlsZW5hbWUsIG1iaC0+Y2hlY2tzdW0pOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qIFJlc2VydmVkIGZsYWdzIG11c3QgYmUgemVyby4gICovCisgIGlmIChtYmgtPmZsYWdzICYgfjB4MDAwMTAwMDMpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLAorCSAgICAgICAiJXM6IE5vbi16ZXJvIGlzIGZvdW5kIGluIHJlc2VydmVkIGZsYWdzICgweCVseCkuXG4iLAorCSAgICAgICBmaWxlbmFtZSwgbWJoLT5mbGFncyk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKCEgcXVpZXQpCisgICAgeworICAgICAgcHJpbnRmICgiJXM6IFBhZ2UgYWxpZ25tZW50IGlzIHR1cm5lZCAlcy5cbiIsCisJICAgICAgZmlsZW5hbWUsIChtYmgtPmZsYWdzICYgMHgxKT8gIm9uIiA6ICJvZmYiKTsKKyAgICAgIHByaW50ZiAoIiVzOiBNZW1vcnkgaW5mb3JtYXRpb24gaXMgdHVybmVkICVzLlxuIiwKKwkgICAgICBmaWxlbmFtZSwgKG1iaC0+ZmxhZ3MgJiAweDIpPyAib24iIDogIm9mZiIpOworICAgICAgcHJpbnRmICgiJXM6IEFkZHJlc3MgZmllbGRzIGlzIHR1cm5lZCAlcy5cbiIsCisJICAgICAgZmlsZW5hbWUsIChtYmgtPmZsYWdzICYgMHgxMDAwMCk/ICJvbiIgOiAib2ZmIik7CisgICAgfQorCisgIC8qIENoZWNrIGZvciB0aGUgYWRkcmVzcyBmaWVsZHMuICAqLworICBpZiAobWJoLT5mbGFncyAmIDB4MTAwMDApCisgICAgeworICAgICAgaWYgKG1iaC0+aGVhZGVyX2FkZHIgPCBtYmgtPmxvYWRfYWRkcikKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsCisJCSAgICIlczogaGVhZGVyX2FkZHIgaXMgbGVzcyB0aGFuICIKKwkJICAgImxvYWRfYWRkciAoMHglbHggPiAweCVseCkuXG4iLAorCQkgICBmaWxlbmFtZSwgbWJoLT5oZWFkZXJfYWRkciwgbWJoLT5sb2FkX2FkZHIpOworCSAgcmV0dXJuIDA7CisJfQorCisgICAgICBpZiAobWJoLT5sb2FkX2VuZF9hZGRyICYmIG1iaC0+bG9hZF9hZGRyID49IG1iaC0+bG9hZF9lbmRfYWRkcikKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsCisJCSAgICIlczogbG9hZF9hZGRyIGlzIG5vdCBsZXNzIHRoYW4gbG9hZF9lbmRfYWRkciIKKwkJICAgIiAoMHglbHggPj0gMHglbHgpLlxuIiwKKwkJICAgZmlsZW5hbWUsIG1iaC0+bG9hZF9hZGRyLCBtYmgtPmxvYWRfZW5kX2FkZHIpOworCSAgcmV0dXJuIDA7CisJfQorCisgICAgICBpZiAobWJoLT5ic3NfZW5kX2FkZHIgJiYgbWJoLT5sb2FkX2VuZF9hZGRyID4gbWJoLT5ic3NfZW5kX2FkZHIpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLAorCQkgICAiJXM6IGxvYWRfZW5kX2FkZHIgaXMgZ3JlYXRlciB0aGFuIGJzc19lbmRfYWRkciIKKwkJICAgIiAoMHglbHggPiAweCVseCkuXG4iLAorCQkgICBmaWxlbmFtZSwgbWJoLT5sb2FkX2VuZF9hZGRyLCBtYmgtPmJzc19lbmRfYWRkcik7CisJICByZXR1cm4gMDsKKwl9CisKKyAgICAgIGlmIChtYmgtPmxvYWRfYWRkciA+IG1iaC0+ZW50cnlfYWRkcikKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsCisJCSAgICIlczogbG9hZF9hZGRyIGlzIGdyZWF0ZXIgdGhhbiBlbnRyeV9hZGRyIgorCQkgICAiICgweCVseCA+IDB4JWx4KS5cbiIsCisJCSAgIGZpbGVuYW1lLCBtYmgtPmxvYWRfYWRkciwgbWJoLT5lbnRyeV9hZGRyKTsKKwkgIHJldHVybiAwOworCX0KKworICAgICAgLyogRklYTUU6IEl0IGlzIGJldHRlciB0byBjaGVjayBpZiB0aGUgZW50cnkgYWRkcmVzcyBpcyB3aXRoaW4gdGhlCisJIGZpbGUsIGVzcGVjaWFsbHkgd2hlbiB0aGUgbG9hZCBlbmQgYWRkcmVzcyBpcyB6ZXJvLiAgKi8KKyAgICAgIGlmIChtYmgtPmxvYWRfZW5kX2FkZHIgJiYgbWJoLT5sb2FkX2VuZF9hZGRyIDw9IG1iaC0+ZW50cnlfYWRkcikKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsCisJCSAgICIlczogbG9hZF9lbmRfYWRkciBpcyBub3QgZ3JlYXRlciB0aGFuIGVudHJ5X2FkZHIiCisJCSAgICIgKDB4JWx4IDw9IDB4JWx4KS5cbiIsCisJCSAgIGZpbGVuYW1lLCBtYmgtPmxvYWRfZW5kX2FkZHIsIG1iaC0+ZW50cnlfYWRkcik7CisJICByZXR1cm4gMDsKKwl9CisKKyAgICAgIC8qIFRoaXMgaXMgYSBHUlVCLXNwZWNpZmljIGxpbWl0YXRpb24uICAqLworICAgICAgaWYgKG1iaC0+bG9hZF9hZGRyIDwgMHgxMDAwMDApCisJeworCSAgZnByaW50ZiAoc3RkZXJyLAorCQkgICAiJXM6IENhbm5vdCBiZSBsb2FkZWQgYXQgbGVzcyB0aGFuIDFNQiBieSBHUlVCIgorCQkgICAiICgweCVseCkuXG4iLAorCQkgICBmaWxlbmFtZSwgbWJoLT5sb2FkX2FkZHIpOworCSAgcmV0dXJuIDA7CisJfQorICAgIH0KKworICBpZiAoISBxdWlldCkKKyAgICBwcmludGYgKCIlczogQWxsIGNoZWNrcyBwYXNzZWQuXG4iLCBmaWxlbmFtZSk7CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IGM7CisKKyAgZG8KKyAgICB7CisgICAgICBjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsIG9wdHN0cmluZywgbG9uZ29wdHMsIDApOworICAgICAgc3dpdGNoIChjKQorCXsKKwljYXNlIEVPRjoKKwkgIGJyZWFrOworCisJY2FzZSAnaCc6CisJICB1c2FnZSAoMCk7CisJICBicmVhazsKKworCWNhc2UgJ3YnOgorCSAgcHJpbnRmICgibWJjaGsgKEdOVSBHUlVCICIgVkVSU0lPTiAiKVxuIik7CisJICBleGl0ICgwKTsKKwkgIGJyZWFrOworCisJY2FzZSAncSc6CisJICBxdWlldCA9IDE7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICB1c2FnZSAoMSk7CisJICBicmVhazsKKwl9CisgICAgfQorICB3aGlsZSAoYyAhPSBFT0YpOworCisgIGlmIChvcHRpbmQgPCBhcmdjKQorICAgIHsKKyAgICAgIHdoaWxlIChvcHRpbmQgPCBhcmdjKQorCXsKKwkgIEZJTEUgKmZwOworCisJICBmcCA9IGZvcGVuIChhcmd2W29wdGluZF0sICJyIik7CisJICBpZiAoISBmcCkKKwkgICAgeworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBObyBzdWNoIGZpbGUuXG4iLCBhcmd2W29wdGluZF0pOworCSAgICAgIGV4aXQgKDEpOworCSAgICB9CisKKwkgIGlmICghIGNoZWNrX211bHRpYm9vdCAoYXJndltvcHRpbmRdLCBmcCkpCisJICAgIGV4aXQgKDEpOworCisJICBmY2xvc2UgKGZwKTsKKwkgIG9wdGluZCsrOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoISBjaGVja19tdWx0aWJvb3QgKCI8c3RkaW4+Iiwgc3RkaW4pKQorCWV4aXQgKDEpOworICAgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwvbWtiaW1hZ2UgYi91dGlsL21rYmltYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OWY2OTQKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsL21rYmltYWdlCkBAIC0wLDAgKzEsNDE3IEBACisjIS9iaW4vc2gKKyMgTWFLZSBhIEJvb3RhYmxlIElNQUdFIC0tLSAxLjQ0LCAyLjg4IGFuZCBFbCBUb3JpdG8gbm8tZW11bGF0aW9uIG1vZGUKKyMgQykgMjAwMSwyMDAyLDIwMDMgVGhpZXJyeSBMYXJvbmRlIDx0bGFyb25kZUBwb2x5bnVtLm9yZz4KKyMgQykgMjAwMSwyMDAyLDIwMDMgUm9iZXJ0IE1pbGxhbiA8cm9iZXJ0bWhAZ251Lm9yZz4KKworCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gZWl0aGVyIHNlbmQgZW1haWwgdG8gdGhpcworIyBwcm9ncmFtJ3MgbWFpbnRhaW5lciBvciB3cml0ZSB0bzogVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLjsgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzA7IEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisjICRJZDogbWtiaW1hZ2UsdiAxLjE5IDIwMDQvMDcvMjEgMTQ6NDM6MDQgcm9iZXJ0bWggRXhwICQKKworIyBHbG9iYWwgdmFyaWFibGVzCit0YXJmaWxlPQorZGlyPQorZnM9ICNmaWxlIHN5c3RlbSB0eXBlCitkZWNvbXByZXNzPQoraW1hZ2VfdHlwZT0KK3VuYW1lPWB1bmFtZSAtc2AKK1BBVEg9L3NiaW46JFBBVEgKKworIyBZb3UgY2FuIHNldCBHUlVCX1BBVEggIGlmIHlvdSBuZWVkIHRvIHVzZSBhIHNwZWNpYWxseSBsb2NhdGVkIEdSVUIuCisjIFRoaXMgTVVTVCBlbmQgYnkgYSAnLychCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1ET04nVCBDSEFOR0U6IElOVEVSTkFMUworCitibG9ja19zaXplPTUxMgorY3lsaW5kZXJzPQoraGVhZHM9CitzZWN0b3JzPQorY3lsX3NpemU9Cit0eXBlX29wdGlvbj0KK2dlb19vcHRpb249CitpbWFnZT0KK2JrXzEyMD0kKCgyICogMTUgKiA4MCkpCitia18xNDQ9JCgoMiAqIDE4ICogODApKQorYmtfMjg4PSQoKDIgKiAzNiAqIDgwKSkKK2JrXzE2MD0kKCgyICogMjAgKiA4MCkpCitia18xNjg9JCgoMiAqIDIxICogODApKQorYmtfMTc0PSQoKDIgKiAyMSAqIDgzKSkKK2xvX29wdGlvbnM9CitkZXZpY2VfbWFwPQorbWtmc19vcHRpb25zPQorZGVidWc9CitzdGFnZTJfb3NfbmFtZT0KKworIyBOYW1lIGJ5IHdoaWNoIHRoaXMgc2NyaXB0IHdhcyBpbnZva2VkLgorcHJvZ3JhbT1gZWNobyAiJDAiIHwgc2VkIC1lICdzL1teXC9dKlwvLy9nJ2AKK3ZlcnNpb25fbnVtYmVyPSckUmV2aXNpb246IDEuMTkgJCcKKwordXNhZ2U9IgorVXNhZ2U6ICRwcm9ncmFtIFstaFZGXSBbLXQgVFlQRV0gWy1kIERJUkVDVE9SWV0gWy1zIEZTX1RZUEVdIC1mIFRBUl9GSUxFCitNYWtlIGEgQm9vdGFibGUgSU1BR0UgdXNpbmcgR1JVQiBhcyBhIGJvb3Rsb2FkZXIKKworT3B0aW9uczoKKyBBY3Rpb25zOgorIC1kIERJUkVDVE9SWSBbZGVmYXVsdCBDV0RdCisJICAgIERpcmVjdG9yeSB3aGVyZSB0aGUgYm9vdC5pbWFnZSBhbmQgdGhlIHBhcnRpdGlvbiBzdWJkaXJlY3RvcmllcworCSAgICBhcmUvd2lsbCBiZSBjcmVhdGVkCisgLWYgVEFSX0ZJTEUKKwkgICAgTmFtZSBvZiB0aGUgdGFyIGZpbGUgY29udGFpbmluZyB0aGUgZmlsZXN5c3RlbSB0byBpbnN0YWxsLiBDYW4KKwkgICAgYmUgYSBwdXJlIHRhciBmaWxlIFsudGFyXSBvciBhIGNvbXByZXNzZWQgdGFyIGZpbGUKKwkgICAgWy50YXIuZ3p8LnRhci5iejJdCisgLXMgRlNfVFlQRQorCSAgICBUeXBlIG9mIHRoZSBmaWxlIHN5c3RlbSB0byBjcmVhdGUgb24gdGhlIHZpcnR1YWwgZGlzay4gQ2hvaWNlcyAKKwkgICAgYXJlOgorCQlleHQyIG9uIEdOVSBbZGVmYXVsdCBpcyBleHQyXQorCQlleHQyLCBtaW5peCBvciBtc2RvcyBvbiBHTlUvTGludXggW2RlZmF1bHQgaXMgZXh0Ml0KKworIC10IFRZUEUKKwkgICAgVHlwZSBvZiB0aGUgaW1hZ2UgdG8gY3JlYXRlLiBDaG9pY2VzIGFyZSAnMS4yMCcsICcxLjQ0JywgJzEuNjAnLAorCSAgICAnMS42OCcsICcxLjc0JywgJzIuODgnIG9yICdoZCcgW2RlZmF1bHQgaXMgaGRdCisgLUYKKwkgICAgRm9yY2UgdG8gc2V0IHRoZSBzZXRfZHB0IGZsYWcgKHVubmVjZXNzYXJ5IDk5JSBvZiB0aGUgdGltZSEgQmUKKwkgICAgY2FyZWZ1bCEgCisgSW5mb3JtYXRpb25zOgorIC1EICAgICAKKwkgICAgdHVybiBEZWJ1Z2dpbmcgb24gW3h0cmFjZV0KKyAtaHwtLWhlbHAJCisJICAgIGRpc3BsYXkgdGhpcyBIZWxwIGFuZCBleGl0CisgLVZ8LS12ZXJzaW9uCQorCSAgICBkaXNwbGF5IFZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKworQ29weXJpZ2h0IChjKSAyMDAxLDIwMDIsMjAwMyBUaGllcnJ5IExhcm9uZGUgPHRsYXJvbmRlQHBvbHludW0ub3JnPi4gCitDb3B5cmlnaHQgKGMpIDIwMDEsMjAwMiBSb2JlcnQgTWlsbGFuIDx6ZXJhdHVsMkB3YW5hZG9vLmVzPi4KK0dQTGVkLiIKKwordmVyc2lvbj0ibWtiaW1hZ2UgJHZlcnNpb25fbnVtYmVyCisKK1dyaXR0ZW4gYnkgVGhpZXJyeSBMYXJvbmRlIGFuZCBSb2JlcnQgTWlsbGFuLgorCitDb3B5cmlnaHQgKGMpIDIwMDEsMjAwMiwyMDAzIFRoaWVycnkgTGFyb25kZSA8dGxhcm9uZGVAcG9seW51bS5vcmc+LgorQ29weXJpZ2h0IChjKSAyMDAxLDIwMDIsMjAwMyBSb2JlcnQgTWlsbGFuIDx6ZXJhdHVsMkB3YW5hZG9vLmVzPi4KKworVGhpcyBpcyBmcmVlIHNvZnR3YXJlIHVuZGVyIHRoZSBHUEwgdmVyc2lvbiAyIG9yIGxhdGVyOyBzZWUgdGhlIHNvdXJjZSBmb3IgCitjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTyB3YXJyYW50eSwgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciAKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKKworIyBGdW5jdGlvbnMKKworZXJyb3IgKCkKK3sKKwljYXNlICQxIGluCisJYnVnKSBlY2hvICJUaGlzIGlzIGEgYnVnISI7CisJCWVjaG8gIiR1c2FnZSI7OworCW9wdGlvbikgZWNobyAiVW5rbm93IG9wdGlvbiI7IGVjaG8gIiR1c2FnZSI7OworCW1pc3NpbmdfYXJndW1lbnQpIGVjaG8gIllvdSBtdXN0IGdpdmUgYW4gYXJndW1lbnQgdG8gdGhlIG9wdGlvbiEiOworCQllY2hvICIkdXNhZ2UiOzsKKwltaXNzaW5nX29wdGlvbikgZWNobyAiWW91IG11c3QgaW5kaWNhdGUgYXQgbGVhc3Qgb25lIG9wdGlvbiEiOworCQllY2hvICIkdXNhZ2UiOzsKKwltdXN0X2JlX3Jvb3QpIGVjaG8gIllvdSBtdXN0IGJlIHJvb3QhIChvciBpbnN0YWxsIGUydG9vbHMvbXRvb2xzKSI7OworCXVua25vd25fZnMpCWlmIFsgJHVuYW1lID0gTGludXggXTsKKwkJCQl0aGVuIGVjaG8gIlRoZSBHTlUvTGludXggc3VwcG9ydGVkIGZzIGFyZTogZXh0MiwgbWluaXggb3IgbXNkb3MhIjsKKwkJCWVsaWYgWyAkdW5hbWUgPSBHTlUgXTsKKwkJCQl0aGVuIGVjaG8gIlRoZSBHTlUgc3VwcG9ydGVkIGZzIGlzIGV4dDIhIjsKKwkJCWZpOzsKKwl1bmtub3duX2Zvcm1hdCkgZWNobyAiVGhlIHRhciBmaWxlIG11c3QgYmUgLnRhcnwudGFyLmd6fC50YXIuYnoyISI7OworCXdvbnRfZml0KSBlY2hvICJUaGUgZmlsZXMgd29uJ3QgZml0IG9uIHRoZSBzZWxlY3RlZCB0eXBlIG9mIG1lZGlhISI7OworCXdyb25nX2RpcmVjdG9yeSkgZWNobyAiRGlyZWN0b3J5IGluZXhpc3RhbnQgb3Igbm90IGdpdmVuISI7CisJCWVjaG8gIiR1c2FnZSI7OworCXdyb25nX2ZpbGUpIGVjaG8gIkZpbGUgaW5leGlzdGFudCBvciBlbXB0eSEiOworCQllY2hvICIkdXNhZ2UiOzsKKwl3cm9uZ190eXBlKSBlY2hvICJUaGUgdHlwZSBzcGVjaWZpZWQgaXMgbm90IGEgdmFsaWQgb25lISI7CisJCWVjaG8gIiR1c2FnZSI7OworCWVzYWMJCisJZXhpdCAxCit9CisKKyMgY3JlYXRlIGEgZmlsZXN5c3RlbSBvZiB0eXBlICRmcyBpbiAkaW1hZ2Ugd2l0aCBvZmZzZXQgJG9mZnNldAorbWtiaW1hZ2VfbWtmcyAoKQoreworICBjYXNlICRvZmZzZXQgaW4KKyAgICAwKSAgbG9fb3B0aW9ucz0iIjs7CisgICAgKikgbG9fb3B0aW9ucz0iLW8gJG9mZnNldCI7OworICBlc2FjCisKKyAgaWYgWyAiJG9mZnNldCIgPSAiMCIgXSA7IHRoZW4KKyAgICBta2ZzLiRmcyAtRiAkaW1hZ2UKKyAgZWxpZiBbIGBpZCAtdWAgPSAiMCIgXSA7IHRoZW4KKyAgICBsb3NldHVwICRsb19vcHRpb25zIC9kZXYvbG9vcDEgJGltYWdlCisgICAgbWtmcy4kZnMgL2Rldi9sb29wMQorICAgIGxvc2V0dXAgLWQgL2Rldi9sb29wMQorICBlbHNlCisgICAgZXJyb3IgbXVzdF9iZV9yb290CisgIGZpCit9CisKKyMgY29weSAke2ltYWdlfTEvKiB0byAke2ltYWdlfTovLCBhc3N1bWluZyAke2ltYWdlfSBjb250YWlucyBhIGZpbGVzeXN0ZW0KKyMgb2YgdHlwZSAkZnMgaW4gb2Zmc2V0ICRvZmZzZXQKK21rYmltYWdlX2NwICgpCit7CisgIGNhc2UgJG9mZnNldCBpbgorICAgIDApICBsb19vcHRpb25zPSIiOzsKKyAgICAqKSAgbG9fb3B0aW9ucz0iLW8gJG9mZnNldCI7OworICBlc2FjCisgIGNhc2UgJGZzIGluCisgICAgZXh0MikKKyAgICAgIGNwPSJlMmNwIjsKKyAgICAgIG1rZGlyPSJlMm1rZGlyIjs7CisgICAgdmZhdCkKKyAgICAgIGNwPSJtY29weSI7CisgICAgICBta2Rpcj0ibW1kIjs7CisgICAgKikKKyAgICAgIGNwPSIiOworICAgICAgbWtkaXI9IiI7OworICBlc2FjCisKKyAgaWYgWyAiJG9mZnNldCIgPSAwIF0gJiYgd2hpY2ggJGNwID4gL2Rldi9udWxsIDsgdGhlbgorICAgIGZvciBkaXIgaW4gJChjZCAke2ltYWdlfTEgJiYgZmluZCAtdHlwZSBkKSA7IGRvCisJJG1rZGlyICR7aW1hZ2V9OiRkaXIKKyAgICBkb25lCisgICAgZm9yIGZpbGUgaW4gJChjZCAke2ltYWdlfTEgJiYgZmluZCAtdHlwZSBmKSA7IGRvCisJJGNwICR7aW1hZ2V9MS8kZmlsZSAke2ltYWdlfTokZmlsZQorICAgIGRvbmUKKyAgZWxpZiBbICJgaWQgLXVgIiA9ICIwIiBdIDsgdGhlbgorICAgIGxvc2V0dXAgJGxvX29wdGlvbnMgL2Rldi9sb29wMSAkaW1hZ2UKKyAgICBta2RpciAke2ltYWdlfS5tbnQKKyAgICBtb3VudCAtdCAkZnMgL2Rldi9sb29wMSAke2ltYWdlfS5tbnQKKyAgICBjcCAtYSAke2ltYWdlfTEvKiAke2ltYWdlfS5tbnQvICYmIHN5bmMKKyAgICB1bW91bnQgJHtpbWFnZX0ubW50CisgICAgcm1kaXIgJHtpbWFnZX0ubW50CisgICAgbG9zZXR1cCAtZCAvZGV2L2xvb3AxCisgIGVsc2UKKyAgICBlcnJvciBtdXN0X2JlX3Jvb3QKKyAgZmkKK30KKworIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgICAgICAgICAgICAgICAgICAgICAgICAgIE1BSU4gUFJPR1JBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHZXR0aW5nIHRoZSBvcHRpb25zCisKK1sgJCMgLWVxIDAgXSAmJiBlcnJvciBtaXNzaW5nX29wdGlvbjsKKword2hpbGUgWyAkIyAtZ3QgMCBdOyBkbworCWNhc2UgIiQxIiBpbgorCQktZCkgc2hpZnQ7CisJCQlkaXI9IiQxIjsKKwkJCVsgISAtZCAiJDEiIF0gJiYgZXJyb3Igd3JvbmdfZGlyZWN0b3J5OzsKKwkJLWYpIHNoaWZ0OworCQkJdGFyZmlsZT0iJDEiOworCQkJWyAteiAiJHRhcmZpbGUiIF0gJiYgZXJyb3IgbWlzc2luZ19hcmd1bWVudDs7CisJCS1zKSBzaGlmdDsKKwkJCWZzPSIkMSI7OworCQktdCkgc2hpZnQ7CisJCQlpbWFnZV90eXBlPSIkMSI7OworCQktRikgZ2VvX29wdGlvbj0iLUYiOzsKKwkJLUQpIGRlYnVnPSItdiI7CisJCSAgICBzZXQgLXg7OworCQktaHwtLWhlbHApIGVjaG8gIiR1c2FnZSI7IGV4aXQgMDs7CisJCS1WfC0tdmVyc2lvbikgZWNobyAiJHZlcnNpb24iOyBleGl0IDA7OworCSAJKikgZXJyb3Igb3B0aW9uIDs7CisJZXNhYworc2hpZnQJCitkb25lCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTYW5pdHkgY2hlY2tzCitbICEgIiR0YXJmaWxlIiBdICYmIGVycm9yIG1pc3NpbmdfYXJndW1lbnQ7CitbICEgLXMgIiR0YXJmaWxlIiBdICYmIGVycm9yIHdyb25nX2ZpbGU7CisKK2lmIFsgISAiJGltYWdlX3R5cGUiIF07IHRoZW4KKwlpbWFnZV90eXBlPWhkOworZWxpZiBbICIkaW1hZ2VfdHlwZSIgIT0gIjEuMjAiIF0gJiYgWyAiJGltYWdlX3R5cGUiICE9ICIxLjQ0IiBdIFwKKyAgJiYgWyAiJGltYWdlX3R5cGUiICE9ICIxLjYwIiBdICYmIFsgIiRpbWFnZV90eXBlIiAhPSAiMS42OCIgXSBcCisgICYmIFsgIiRpbWFnZV90eXBlIiAhPSAiMi44OCIgXSAmJiBbICIkaW1hZ2VfdHlwZSIgIT0gIjEuNzQiIF0gXAorICAmJiBbICIkaW1hZ2VfdHlwZSIgIT0gImhkIiBdICYmIFsgIiRpbWFnZV90eXBlIiAhPSAiMS42MCIgXSA7IHRoZW4KKyAgZXJyb3Igd3JvbmdfdHlwZSA7CitmaQorCitbICEgIiRmcyIgXSAmJiBmcz1leHQyCisKKyMgQ2FybG8gQ29udGF2YWxsaSByZXBvcnRlZCB0aGF0IEkgW1RMXSBoYXZlIGZvcmdvdHRlbiB0byBzcGVjaWZ5IHRoZQorIyBwYXJ0aXRpb24gSUQgZm9yIHNmZGlzayB0byBjb3JyZWN0bHkgZmlsbCB0aGUgcGFydGl0aW9uIHRhYmxlIChleHQyIGlzIHRoZQorIyBkZWZhdWx0IG9uIExpbnV4LCBzbyB0aGlzIHdvcmtlZCBpbiB0aGlzIGNhc2UuLi4pLiBUaGlzIGlzIGZpeGVkIGJlbG93LgorY2FzZSAiJGZzIiBpbgorCWV4dDIpIG1rZnNfb3B0aW9ucz0iLW0gMCI7CisJCSAgcGFydF9pZD0iODMiOzsgIyBUaGlzIGlzIHRoZSBkZWZhdWx0CisjCXVmcykJaWYgWyAkdW5hbWUgPSBMaW51eCBdOworIwkJdGhlbiBlcnJvciB1bmtub3duX2ZzOworIwkJZmk7OworCW1pbml4KQlpZiBbICR1bmFtZSA9IEdOVSBdOworCQl0aGVuIGVycm9yIHVua25vd25fZnM7CisJCWVsc2UgCisJCQlta2ZzX29wdGlvbnM9Ii12IjsgIyBNaW5peCB2ZXJzaW9uIDIKKwkJCXBhcnRfaWQ9IjgxIjsKKwkJZmk7OworCW1zZG9zKQlpZiBbICR1bmFtZSA9IEdOVSBdOworCQl0aGVuIGVycm9yIHVua25vd25fZnM7CisJCWVsc2UgCisJCQlta2ZzX29wdGlvbnM9Ii1mIDEgLUYgMTIiOyAjIHRoZSBzbWFsbGVzdC4uLgorCQkJcGFydF9pZD0iMSI7IAorCQlmaTs7CisJKikgZXJyb3IgdW5rbm93bl9mczs7Citlc2FjCisKKyMgV2hhdCB0eXBlIG9mIHRhciBmaWxlIGhhcyBiZWVuIGdpdmVuID8KKworc3VmZml4PWBlY2hvICIkdGFyZmlsZSIgfCBzZWQgLW4gJ3MvXi4qXC5cKFt0YXJnYnoyXVx7MiwzXH1cKSQvXDEvcCdgCitjYXNlICIkc3VmZml4IiBpbgorCXRhcikgZGVjb21wcmVzcz0iY2F0Ijs7CisJZ3opIGRlY29tcHJlc3M9Imd1bnppcCAtYyI7OworCWJ6MikgZGVjb21wcmVzcz0iYnVuemlwMiAtYyI7OworCSopIGVycm9yIHVua25vd25fZm9ybWF0OzsKK2VzYWMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluaXRpYWxpemF0aW9ucworCitbICEgIiRkaXIiIF0gJiYgZGlyPWBwd2RgCisKK2ltYWdlPSRkaXIvJGltYWdlX3R5cGUuaW1hZ2UKK2RldmljZV9tYXA9JGRpci9kZXZpY2UubWFwCisKKyMgRmlyc3QsIGZpbmQgdGhlIHNpemUgb2YgdGhlIHRhciBmaWxlIGluIGJsb2NrX3NpemUuCitmaWxlX3NpemU9YCRkZWNvbXByZXNzICR0YXJmaWxlIHwgd2MgLWMgfCB0ciAtZCAnICdgCitmaWxlX3NpemU9JCgoJGZpbGVfc2l6ZSAvICRibG9ja19zaXplICsgMSkpCisKKyMgSW5jcmVhc2UgaW4gb3JkZXIgdG8gYmUgc3VyZSB0aGF0IHdpdGggYSBmcyB0aGVyZSB3aWxsIGJlIGVub3VnaAorIyByb29tICh0cnlpbmcgMTEwJSkKK2ZpbGVfc2l6ZT0kKCgkZmlsZV9zaXplICsgJGZpbGVfc2l6ZSAvIDEwKSkKKworY2FzZSAiJGltYWdlX3R5cGUiIGluCisgIGhkKSBoZWFkcz0xNjsKKyAgICBzZWN0b3JzPTYzOworICAgIGN5bF9zaXplPSQoKDE2ICogNjMpKTsKKyAgICAjIENyZWF0ZSB0aGUgbWluaW11bSBudW1iZXIgb2YgY3lsaW5kZXJzLiBBdCB0aGUgbW9tZW50LCB3ZSBsZWF2ZQorICAgICMgc29tZSBzcGFjZSBieSByb3VuZGluZyBldmVyeXRoaW5nIHVwIGJ5IGFkZGluZyAxIGN5bGluZGVyLCBwbHVzCisgICAgIyBhbm90aGVyIG9uZSBmb3IgTUJSICsgcmVzZXJ2ZWQgdHJhY2suCisgICAgY3lsaW5kZXJzPSQoKCRmaWxlX3NpemUgLyAkY3lsX3NpemUgKyAyKSk7OyAKKyAgMS4yMCkgWyAkZmlsZV9zaXplIC1nZSAkYmtfMTIwIF0gJiYgZXJyb3Igd29udF9maXQ7IAorICAgIGhlYWRzPTI7CisgICAgc2VjdG9ycz0xNTsKKyAgICBjeWxfc2l6ZT0kKCgyICogMTUpKTsKKyAgICBjeWxpbmRlcnM9ODA7OworICAxLjQ0KSBbICRmaWxlX3NpemUgLWdlICRia18xNDQgXSAmJiBlcnJvciB3b250X2ZpdDsgCisgICAgaGVhZHM9MjsKKyAgICBzZWN0b3JzPTE4OworICAgIGN5bF9zaXplPSQoKDIgKiAxOCkpOworICAgIGN5bGluZGVycz04MDs7CisgIDEuNjApIFsgJGZpbGVfc2l6ZSAtZ2UgJGJrXzE2MCBdICYmIGVycm9yIHdvbnRfZml0OyAKKyAgICBoZWFkcz0yOworICAgIHNlY3RvcnM9MjA7CisgICAgY3lsX3NpemU9JCgoMiAqIDIwKSk7CisgICAgY3lsaW5kZXJzPTgwOworICAgIGdlb19vcHRpb249Ii1GIjs7CisgIDEuNjgpIFsgJGZpbGVfc2l6ZSAtZ2UgJGJrXzE2OCBdICYmIGVycm9yIHdvbnRfZml0OyAKKyAgICBoZWFkcz0yOworICAgIHNlY3RvcnM9MjE7CisgICAgY3lsX3NpemU9JCgoMiAqIDIxKSk7CisgICAgY3lsaW5kZXJzPTgwOzsKKyAgMS43NCkgWyAkZmlsZV9zaXplIC1nZSAkYmtfMTc0IF0gJiYgZXJyb3Igd29udF9maXQ7IAorICAgIGhlYWRzPTI7CisgICAgc2VjdG9ycz0yMTsKKyAgICBjeWxfc2l6ZT0kKCgyICogMjEpKTsKKyAgICBjeWxpbmRlcnM9ODM7OworICAyLjg4KSBbICRmaWxlX3NpemUgLWdlICRia18yODggXSAmJiBlcnJvciB3b250X2ZpdDsKKyAgICBoZWFkcz0yOworICAgIHNlY3RvcnM9MzY7CisgICAgY3lsX3NpemU9JCgoMiAqIDM2KSk7CisgICAgY3lsaW5kZXJzPTgwOzsKKyAgKikgZXJyb3IgYnVnOzsKK2VzYWMKKwordHlwZV9vcHRpb249Ii10ICRpbWFnZV90eXBlIgorCisjIFdlIHN0YXJ0IGJ5IGNyZWF0aW5nIGEgdmlydHVhbCBkaXNrIHdoaWNoIHNpemUgaXMgdGhlIG51bWJlciBvZgorIyBjeWxpbmRlcnMgb2YgJGN5bF9zaXplIG1hbmRhdG9yeSB0byBwdXQgdGhlIGZpbGVzIHN0b2NrZWQgaW4gdGhlICR0YXJmaWxlCisjIENyZWF0ZSB0aGUgZW1wdHkgdmlydHVhbCBkaXNrCitkZCBpZj0vZGV2L3plcm8gb2Y9JGltYWdlIGJzPSRibG9ja19zaXplIGNvdW50PSQoKCRjeWxfc2l6ZSAqICRjeWxpbmRlcnMpKQorCisjIFdlIHRoZW4gZm9ybWF0IHRoZSB2aXJ0dWFsIGRpc2sKKyMgTk9URTogdGhlIEVsIFRvcml0byBzcGVjaWZpY2F0aW9uIHdhbnRzIG9ubHkgb25lIHBhcnRpdGlvbi4gU28gd2UKKyMgY3JlYXRlIHRoZSBmaXJzdCwgYW5kIHRoZSByZW1haW5pbmcgMyBlbnRyaWVzIGFyZSBlbXB0eS4KKworaWYgWyAiJGltYWdlX3R5cGUiID0gImhkIiBdOyB0aGVuCisgIHNmZGlzayAtQyAkY3lsaW5kZXJzIC1IICRoZWFkcyAtUyAkc2VjdG9ycyAtRCAkaW1hZ2U8PEVPVAorLCwkcGFydF9pZCwqLDAsMSwxCisKKworRU9UCisgIG9mZnNldD0iJCgoJHNlY3RvcnMgKiAkYmxvY2tfc2l6ZSkpIiAKKyAgdHlwZV9vcHRpb249CitlbHNlCisgIG9mZnNldD0iMCIKK2ZpCisKKyMgSXQncyB0aW1lIG5vdyB0byBjcmVhdGUgdGhlIGZpbGVzeXN0ZW0gb24gdGhlIGZpcnN0IHBhcnRpdGlvbi4KK21rYmltYWdlX21rZnMKKworIyB0aGVuIHVudGFyIHRoZSBmaWxlcworWyAhIC1lICR7aW1hZ2V9MSBdIHx8IHsgZWNobyAiJHtpbWFnZX0xIGV4aXN0cywgcGxlYXNlIHJlbW92ZSBpdCBmaXJzdCI7IGV4aXQgMTt9Citta2RpciAtcCAke2ltYWdlfTEKKyRkZWNvbXByZXNzICR0YXJmaWxlIHwgdGFyIC1DICR7aW1hZ2V9MSAkZGVidWcgLXhmIC0KKworIyBjb3B5IHRoZSB1bnRhcnJlZCBmaWxlcyBpbnRvIHRoZSBmaWxlc3lzdGVtIGltYWdlCitta2JpbWFnZV9jcAorCisjV2UgdmVyaWZ5IHRoYXQgdGhlIHN0YWdlMiBleGlzdHMgYW5kIHdlIHNlYXJjaCB0aGUgbmFtZQorc3RhZ2UyX29zX25hbWU9YGZpbmQgJHtpbWFnZX0xIC1uYW1lIHN0YWdlMiAtdHlwZSBmYAorCitbIC1yICIkc3RhZ2UyX29zX25hbWUiIF0gfHwgeyBlY2hvICJJIGNhbid0IGZpbmQgc3RhZ2UyISI7IGV4aXQgMTt9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdSVUIgc3R1ZmYKK2lmIFsgIiRpbWFnZV90eXBlIiA9ICJoZCIgXTsgdGhlbgorCWRldmljZT0nKGhkMCknCisJcm9vdD0nKGhkMCwwKScKK2Vsc2UKKwlkZXZpY2U9JyhmZDApJworCXJvb3Q9JyhmZDApJworZmkKKworY2F0PDxFT1QgPiRkZXZpY2VfbWFwCiskZGV2aWNlCSR7aW1hZ2V9CitFT1QKKworJHtHUlVCX1BBVEh9Z3J1YiAtLWRldmljZS1tYXA9JGRldmljZV9tYXAgLS1iYXRjaDw8RU9UCitnZW9tZXRyeSAkZGV2aWNlICRjeWxpbmRlcnMgJGhlYWRzICRzZWN0b3JzCityb290ICRyb290CitzZXR1cCAkZGV2aWNlCitnZW9tZXRyeSAkZ2VvX29wdGlvbiAtdyAkdHlwZV9vcHRpb24gJGRldmljZSAkY3lsaW5kZXJzICRoZWFkcyAkc2VjdG9ycworRU9UCisKK2VjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS1XSEFUJ1MgTkVYVD8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorZWNobworCitjYXQgPDxFT0YKK0lmIHlvdSBoYXZlIGNyZWF0ZWQgYW4gaW1hZ2UgYWltZWQgdG8gYSBmbG9wcHksIHRoZW4gc29tZXRoaW5nIGxpa2U6CisKK2RkIGlmPTx0eXBlPi5pbWFnZSBvZj0vZGV2L2ZkMFt1PHNpemU+XSBicz01MTIKKword2lsbCBiZSBtb3JlIHRoYW4gZW5vdWdoLi4uIGlmIHlvdSBoYXZlIGZvcm1hdGVkIHRoZSBmbG9wcHkgY29ycmVjdGx5Cit1c2luZyBcYHN1cGVyZm9ybWF0JyB0byBiZSBmb3VuZCBpbiBcYGZkdXRpbHMnIHBhY2thZ2UuCisKK0ZvciBFbCBUb3JpdG8gZmxvcHB5IGVtdWxhdGlvbiA6CisKK21raXNvZnMgLWIgPGltYWdlPiAtYyBib290LmNhdGFsb2cgLW8gcmF3LmlzbyA8ZGlyPgorCitBbmQgZm9yIEVsIFRvcml0byBIYXJkIERpc2sgZW11bGF0aW9uOgorCitta2lzb2ZzIC1iIDxpbWFnZT4gLWhhcmQtZGlzay1ib290IC1jIGJvb3QuY2F0YWxvZyAtbyByYXcuaXNvIDxkaXI+IAorCitFbmpveSEKK0VPRgorCitybSAtcmYgJHtpbWFnZX0xCisKK2V4aXQgMAo=